@guajiritos/image-picker 16.0.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/guachos-image-picker.component.mjs +7 -9
- package/esm2022/utils/pipes/calculate-size/calculate-size.pipe.mjs +4 -4
- package/esm2022/utils/pipes/i18n/i18n.pipe.mjs +4 -4
- package/esm2022/utils/pipes/pipes.module.mjs +5 -5
- package/fesm2022/guajiritos-image-picker.mjs +16 -18
- package/fesm2022/guajiritos-image-picker.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -10,8 +10,8 @@ import { MatButtonModule } from '@angular/material/button';
|
|
|
10
10
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
11
|
import { MatInputModule } from '@angular/material/input';
|
|
12
12
|
import { MatSelectModule } from '@angular/material/select';
|
|
13
|
+
import { NgStyle } from '@angular/common';
|
|
13
14
|
import { PipesModule } from '../utils/pipes/pipes.module';
|
|
14
|
-
import { NgForOf, NgIf, NgStyle } from '@angular/common';
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
16
|
import * as i1 from "@angular/material/tooltip";
|
|
17
17
|
import * as i2 from "@angular/material/icon";
|
|
@@ -472,13 +472,12 @@ export class GuajiritosImagePicker {
|
|
|
472
472
|
this.unsubscribeAll$.next();
|
|
473
473
|
this.unsubscribeAll$.complete();
|
|
474
474
|
}
|
|
475
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
476
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GuajiritosImagePicker, isStandalone: true, selector: "guajiritos-image-picker", inputs: { appearance: "appearance", color: "color", imagesAllowed: "imagesAllowed", _imageSrc: "_imageSrc", _config: "_config" }, outputs: { $imageChanged: "$imageChanged", $imageOriginal: "$imageOriginal" }, viewQueries: [{ propertyName: "imagePicker", first: true, predicate: ["imagePicker"], descendants: true }], ngImport: i0, template: "<div *ngIf='!loadImage()' class='place-image'>\r\n <div class='image-holder'\r\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\r\n (click)='onUpload($event)'>\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='loadImage()' class='place-image'>\r\n <div class='image-holder-loaded'\r\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\r\n </p>\r\n\r\n <div class='editing-bar-btn'>\r\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\r\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\r\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>edit</mat-icon>\r\n </button>\r\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\r\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\r\n <mat-icon class='mat-18'>cloud_download</mat-icon>\r\n </a>\r\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\r\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>delete</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\r\n <div class='popup-clear'>\r\n <button mat-icon-button (click)='onCloseEditPanel()'>\r\n <mat-icon class='mat-18'>clear</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class='image-container'>\r\n <div class='image-holder-full'>\r\n <img id='image-full' [src]='imageSrc()' alt=''>\r\n <div id='image-cropper' class='image-cropper'>\r\n <div id='image-cropper-header'>\r\n <mat-icon>drag_indicator</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class='control-panel'>\r\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\r\n <div class='quality-container'>\r\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\r\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\r\n <input matSliderThumb [formControl]='quality'>\r\n </mat-slider>\r\n </div>\r\n\r\n <div class='item-panel'>\r\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\r\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\r\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class='max-dimension-container'>\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n\r\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\r\n <div class='formats-selection'>\r\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\r\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\r\n <mat-option *ngFor='let format of allFormats' [value]='format'>\r\n {{ format }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class='refresh-container'>\r\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\r\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\r\n </mat-checkbox>\r\n <div class='d-flex '>\r\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <p *ngIf='showCrop.value'>\r\n <button mat-icon-button [color]='color' (click)='onCrop()'>\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf='showCrop.value'>\r\n <div class='dimension-container'>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\r\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\r\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <div class='save-container'>\r\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\r\n {{ 'SAVE' | i18n: config()?.language}}\r\n </button>\r\n\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\r\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:#fff!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }, { kind: "pipe", type: i4.CalculateSizePipe, name: "calculateSize" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconAnchor, selector: "a[mat-icon-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i6.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i6.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.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: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i12.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i12.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
475
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: GuajiritosImagePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
476
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: GuajiritosImagePicker, isStandalone: true, selector: "guajiritos-image-picker", inputs: { appearance: "appearance", color: "color", imagesAllowed: "imagesAllowed", _imageSrc: "_imageSrc", _config: "_config" }, outputs: { $imageChanged: "$imageChanged", $imageOriginal: "$imageOriginal" }, viewQueries: [{ propertyName: "imagePicker", first: true, predicate: ["imagePicker"], descendants: true }], ngImport: i0, template: "@if (!loadImage()) {\n <div class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n </div>\n}\n\n@if (loadImage()) {\n <div class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\n </p>\n }\n <div class='editing-bar-btn'>\n @if (!config()?.hideAddBtn) {\n <button id='upload-img' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n }\n @if (!config()?.hideEditBtn && !noEdit()) {\n <button id='edit-img' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n }\n @if (!config()?.hideDownloadBtn) {\n <a id='download-img' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n }\n @if (!config()?.hideDeleteBtn) {\n <button id='delete-img' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n }\n </div>\n </div>\n}\n\n@if (showEditPanel()) {\n <div id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput\n [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput\n [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n @for (format of allFormats; track format) {\n <mat-option [value]='format'>\n {{ format }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n @if (showCrop.value) {\n <p>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n }\n </div>\n </div>\n @if (showCrop.value) {\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n }\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language }}\n </button>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb\n {{ format.value }}\n </p>\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:#fff!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }, { kind: "pipe", type: i4.CalculateSizePipe, name: "calculateSize" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i6.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i6.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.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: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i12.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i12.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
477
477
|
}
|
|
478
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
478
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: GuajiritosImagePicker, decorators: [{
|
|
479
479
|
type: Component,
|
|
480
480
|
args: [{ selector: 'guajiritos-image-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
481
|
-
NgIf,
|
|
482
481
|
NgStyle,
|
|
483
482
|
MatTooltipModule,
|
|
484
483
|
MatIconModule,
|
|
@@ -490,9 +489,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
490
489
|
MatInputModule,
|
|
491
490
|
MatSelectModule,
|
|
492
491
|
FormsModule,
|
|
493
|
-
ReactiveFormsModule
|
|
494
|
-
NgForOf,
|
|
495
|
-
], template: "<div *ngIf='!loadImage()' class='place-image'>\r\n <div class='image-holder'\r\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\r\n (click)='onUpload($event)'>\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='loadImage()' class='place-image'>\r\n <div class='image-holder-loaded'\r\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\r\n </p>\r\n\r\n <div class='editing-bar-btn'>\r\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\r\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\r\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>edit</mat-icon>\r\n </button>\r\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\r\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\r\n <mat-icon class='mat-18'>cloud_download</mat-icon>\r\n </a>\r\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\r\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>delete</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\r\n <div class='popup-clear'>\r\n <button mat-icon-button (click)='onCloseEditPanel()'>\r\n <mat-icon class='mat-18'>clear</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class='image-container'>\r\n <div class='image-holder-full'>\r\n <img id='image-full' [src]='imageSrc()' alt=''>\r\n <div id='image-cropper' class='image-cropper'>\r\n <div id='image-cropper-header'>\r\n <mat-icon>drag_indicator</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class='control-panel'>\r\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\r\n <div class='quality-container'>\r\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\r\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\r\n <input matSliderThumb [formControl]='quality'>\r\n </mat-slider>\r\n </div>\r\n\r\n <div class='item-panel'>\r\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\r\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\r\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class='max-dimension-container'>\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n\r\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\r\n <div class='formats-selection'>\r\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\r\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\r\n <mat-option *ngFor='let format of allFormats' [value]='format'>\r\n {{ format }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class='refresh-container'>\r\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\r\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\r\n </mat-checkbox>\r\n <div class='d-flex '>\r\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <p *ngIf='showCrop.value'>\r\n <button mat-icon-button [color]='color' (click)='onCrop()'>\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf='showCrop.value'>\r\n <div class='dimension-container'>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\r\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\r\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <div class='save-container'>\r\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\r\n {{ 'SAVE' | i18n: config()?.language}}\r\n </button>\r\n\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\r\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:#fff!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"] }]
|
|
492
|
+
ReactiveFormsModule
|
|
493
|
+
], template: "@if (!loadImage()) {\n <div class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n </div>\n}\n\n@if (loadImage()) {\n <div class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb {{ format.value }}\n </p>\n }\n <div class='editing-bar-btn'>\n @if (!config()?.hideAddBtn) {\n <button id='upload-img' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n }\n @if (!config()?.hideEditBtn && !noEdit()) {\n <button id='edit-img' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n }\n @if (!config()?.hideDownloadBtn) {\n <a id='download-img' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n }\n @if (!config()?.hideDeleteBtn) {\n <button id='delete-img' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n }\n </div>\n </div>\n}\n\n@if (showEditPanel()) {\n <div id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput\n [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput\n [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n @for (format of allFormats; track format) {\n <mat-option [value]='format'>\n {{ format }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n @if (showCrop.value) {\n <p>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n }\n </div>\n </div>\n @if (showCrop.value) {\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n }\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language }}\n </button>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb\n {{ format.value }}\n </p>\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:#fff!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"] }]
|
|
496
494
|
}], propDecorators: { appearance: [{
|
|
497
495
|
type: Input
|
|
498
496
|
}], color: [{
|
|
@@ -511,4 +509,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
511
509
|
}], _config: [{
|
|
512
510
|
type: Input
|
|
513
511
|
}] } });
|
|
514
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUz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QUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7d0dBamZVLHFCQUFxQjs0RkFBckIscUJBQXFCLGdaQ3BGbEMsczRPQW1KQSxxd01EL0VJLElBQUksNkZBQ0osT0FBTywwRUFDUCxnQkFBZ0IsOEhBQ2hCLGFBQWEsbUxBQ2IsV0FBVyxzSkFDWCxlQUFlLHlsQkFDZixlQUFlLGthQUNmLGlCQUFpQixnTEFDakIsa0JBQWtCLDBTQUNsQixjQUFjLDBXQUNkLGVBQWUseVRBQ2YsV0FBVyw0b0NBQ1gsbUJBQW1CLG1OQUNuQixPQUFPOzs0RkFHRSxxQkFBcUI7a0JBdkJqQyxTQUFTOytCQUNFLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsSUFBSTt3QkFDSixPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixPQUFPO3FCQUNSOzhCQXVDUSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUV1QyxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWpDLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFTSxTQUFTO3NCQUFyQixLQUFLO2dCQW1DTyxPQUFPO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlciB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJFbnRyeSc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuXHJcbmltcG9ydCB7IFBpcGVzTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvcGlwZXMvcGlwZXMubW9kdWxlJztcclxuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlUGlja2VyQ29uZiB7XHJcbiAgd2lkdGg/OiBzdHJpbmc7XHJcbiAgaGVpZ2h0Pzogc3RyaW5nO1xyXG4gIGJvcmRlclJhZGl1cz86IHN0cmluZztcclxuICBjb21wcmVzc0luaXRpYWw/OiBib29sZWFuO1xyXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xyXG4gIGhpZGVEZWxldGVCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVEb3dubG9hZEJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZUVkaXRCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVBZGRCdG4/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQ29udmVydGVySW5wdXQge1xyXG4gIHdpZHRoPzogbnVtYmVyO1xyXG4gIGhlaWdodD86IG51bWJlcjtcclxuICBxdWFsaXR5PzogbnVtYmVyO1xyXG4gIGRhdGFUeXBlPzogc3RyaW5nO1xyXG4gIG1haW50YWluUmF0aW8/OiBib29sZWFuO1xyXG4gIGNoYW5nZUhlaWdodD86IGJvb2xlYW47XHJcbiAgY2hhbmdlV2lkdGg/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJbWFnZUFsbG93ZWRUeXBlcyA9XHJcbiAgJ2ltYWdlLyonXHJcbiAgfCAnLndlYnAnXHJcbiAgfCAnLnBuZydcclxuICB8ICcud2VicCwgLmpwZywgLmpwZWcnXHJcbiAgfCAnLndlYnAsIC5wbmcnXHJcbiAgfCAnLmpwZywgLmpwZWcnXHJcbiAgfCAnLnBuZywgLmpwZywgLmpwZWcnXHJcbiAgfCAnLndlYnAsIC5wbmcsIC5qcGcsIC5qcGVnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3VhamlyaXRvcy1pbWFnZS1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE5nSWYsXHJcbiAgICBOZ1N0eWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBQaXBlc01vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdFNsaWRlck1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBOZ0Zvck9mLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHdWFqaXJpdG9zSW1hZ2VQaWNrZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVBbGwkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIG9ic2VydmVyOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgb3JpZ2luSW1hZ2VTcmM6IGFueTtcclxuICBwcml2YXRlIHVybEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBsYXN0T3JpZ2luU3JjOiBhbnk7XHJcblxyXG4gIHByaXZhdGUgYXJyYXlDb3BpZWRJbWFnZXM6IGFueVtdID0gW107XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSB1dWlkRmlsZVBpY2tlcjogc3RyaW5nID0gRGF0ZS5ub3coKS50b1N0cmluZygyMCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFsbEZvcm1hdHM6IHN0cmluZ1tdID0gWyd3ZWJwJywgJ2pwZWcnLCAncG5nJ107XHJcbiAgcHVibGljIGNvbmZpZzogV3JpdGFibGVTaWduYWw8SW1hZ2VQaWNrZXJDb25mPiA9IHNpZ25hbCh7XHJcbiAgICBoZWlnaHQ6ICcyNDBweCcsXHJcbiAgICB3aWR0aDogJzMyMHB4JyxcclxuICAgIGJvcmRlclJhZGl1czogJzE2cHgnLFxyXG4gICAgY29tcHJlc3NJbml0aWFsOiB0cnVlLFxyXG4gICAgbGFuZ3VhZ2U6ICdlcycsXHJcbiAgICBoaWRlRGVsZXRlQnRuOiBmYWxzZSxcclxuICAgIGhpZGVEb3dubG9hZEJ0bjogZmFsc2UsXHJcbiAgICBoaWRlRWRpdEJ0bjogZmFsc2UsXHJcbiAgICBoaWRlQWRkQnRuOiBmYWxzZSxcclxuICB9KTtcclxuICBwdWJsaWMgaW1hZ2VTcmM6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwobnVsbCk7XHJcbiAgcHVibGljIHNob3dDcm9wOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IGZhbHNlLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGxvYWRJbWFnZTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBub0VkaXQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuICBwdWJsaWMgc2hvd0VkaXRQYW5lbDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBtYWludGFpbkFzcGVjdFJhdGlvOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgcXVhbGl0eTogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiA3MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBmb3JtYXQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogJ3dlYnAnLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIG1heEhlaWdodDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgyMDAwKTtcclxuICBwdWJsaWMgbWF4V2lkdGg6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMjAwMCk7XHJcbiAgcHVibGljIGNyb3BIZWlnaHQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogMTUwLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGNyb3BXaWR0aDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgaW1hZ2VOYW1lOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCdkb3dubG9hZCcpO1xyXG4gIHB1YmxpYyBjdXJyZW50TGFuZ3VhZ2U6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJ2VzJyk7XHJcblxyXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnb3V0bGluZSc7XHJcbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZSA9ICdwcmltYXJ5JztcclxuICBASW5wdXQoKSBpbWFnZXNBbGxvd2VkOiBJbWFnZUFsbG93ZWRUeXBlcyA9ICdpbWFnZS8qJztcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW1hZ2VQaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgaW1hZ2VQaWNrZXI6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKSAkaW1hZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSAkaW1hZ2VPcmlnaW5hbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCkgc2V0IF9pbWFnZVNyYyhpbWFnZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgbGV0IHR5cGVzOiBzdHJpbmdbXSA9IGltYWdlLnNwbGl0KCcuJyk7XHJcbiAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKHR5cGVzW3R5cGVzLmxlbmd0aCAtIDFdKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5mb3JtYXQudmFsdWUgfHwgKHRoaXMuZm9ybWF0LnZhbHVlICE9PSAncG5nJyAmJiB0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ2pwZWcnICYmIHRoaXMuZm9ybWF0LnZhbHVlICE9PSAnd2VicCcpKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoaW1hZ2UpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh0aGlzLmltYWdlU3JjKTtcclxuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBpbWFnZTtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KHRoaXMub3JpZ2luSW1hZ2VTcmMpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0LnNldCgyMDAwKTtcclxuICAgICAgdGhpcy5tYXhXaWR0aC5zZXQoMjAwMCk7XHJcbiAgICAgIHRoaXMuY3JvcEhlaWdodC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2hvd0VkaXRQYW5lbC5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IF9jb25maWcodmFsdWU6IEltYWdlUGlja2VyQ29uZikge1xyXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZXQoe1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnKCksXHJcbiAgICAgICAgLi4udmFsdWUsXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlYWRlckxvYWRlZChyZWFkZXJFdnQ6IHsgdGFyZ2V0OiB7IHJlc3VsdDogYW55OyB9OyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBiaW5hcnlTdHJpbmc6IHN0cmluZyA9IHJlYWRlckV2dC50YXJnZXQucmVzdWx0O1xyXG4gICAgY29uc3QgYmFzZTY0dGV4dFN0cmluZzogc3RyaW5nID0gYnRvYShiaW5hcnlTdHJpbmcpO1xyXG4gICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nO1xyXG4gICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gdGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmc7XHJcbiAgICBpZiAodGhpcy5jb25maWcoKT8uY29tcHJlc3NJbml0aWFsKSB7XHJcbiAgICAgIHRoaXMucXVhbGl0eS5zZXRWYWx1ZSg3MCk7XHJcbiAgICAgIGNvbnN0IGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0ID0ge1xyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiAwLjcwLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZywgaW5wdXQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2goe1xyXG4gICAgICAgIGxhc3RJbWFnZTogdGhpcy5pbWFnZVNyYygpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHF1YWxpdHk6IHRoaXMucXVhbGl0eS52YWx1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVzaXplRGF0YVVSTChkYXRhczogc3RyaW5nLCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24ocmVzb2x2ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgIGltZy5zcmMgPSBkYXRhcyArICcnO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcclxuICAgICAgbGV0IHF1YWxpdHk6IG51bWJlciA9IGlucHV0Py5xdWFsaXR5ID8/IDEuMDtcclxuICAgICAgbGV0IG1haW50YWluUmF0aW86IGJvb2xlYW4gPSBpbnB1dC5tYWludGFpblJhdGlvICE9PSB1bmRlZmluZWQgPyBpbnB1dC5tYWludGFpblJhdGlvIDogdHJ1ZTtcclxuXHJcbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgY29uc3QgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBsZXQgcmF0aW86IG51bWJlciA9IGltZy53aWR0aCAvIGltZy5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBpbnB1dD8ud2lkdGggPz8gaW1nLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IGlucHV0Py5oZWlnaHQgPz8gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKG1haW50YWluUmF0aW8pIHtcclxuICAgICAgICAgIGlmIChpbnB1dC5jaGFuZ2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaGVpZ2h0ICogcmF0aW87XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHdpZHRoIC8gcmF0aW87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICBsZXQgdHlwZTogc3RyaW5nID0gaW5wdXQ/LmRhdGFUeXBlID8/ICd3ZWJwJztcclxuICAgICAgICBjb25zdCBkYXRhVVJJOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgcXVhbGl0eSk7XHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBkYXRhVXJpOiBkYXRhVVJJLFxyXG4gICAgICAgICAgd2lkdGg6IGNhbnZhcy53aWR0aCxcclxuICAgICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIH0pLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1heEhlaWdodCA9IGRhdGE/LmhlaWdodDtcclxuICAgICAgdGhpcy5tYXhXaWR0aCA9IGRhdGE/LndpZHRoO1xyXG4gICAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcz8ubGVuZ3RoIDw9IDIwKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHtcclxuICAgICAgICAgIGxhc3RJbWFnZTogZGF0YT8uZGF0YVVyaSxcclxuICAgICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCxcclxuICAgICAgICAgIHF1YWxpdHk6IHRoaXMucXVhbGl0eS52YWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRhdGEuZGF0YVVyaTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3YWl0KG1zPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIG1zID0gbXMgPz8gMTAwMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSwgbXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYWdFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBsZXQgcG9zMTogbnVtYmVyID0gMCwgcG9zMjogbnVtYmVyID0gMCwgcG9zMzogbnVtYmVyID0gMCwgcG9zNDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgZWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5pZCArICctaGVhZGVyJyk7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgZWwub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xyXG4gICAgICBlbC5vbnRvdWNoc3RhcnQgPSBkcmFnTW91c2VEb3duO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIGVsZW1lbnQub250b3VjaHN0YXJ0ID0gZHJhZ01vdXNlRG93bjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnTW91c2VEb3duKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHBvczMgPSBlPy5jbGllbnRYO1xyXG4gICAgICBwb3M0ID0gZT8uY2xpZW50WTtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaGVuZCA9IGNsb3NlRHJhZ0VsZW1lbnQ7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZWxlbWVudERyYWcoZTogYW55KTogdm9pZCB7XHJcbiAgICAgIGxldCBob2xkZXJJbWFnZTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBwb3MxID0gcG9zMyAtIGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczIgPSBwb3M0IC0gZT8uY2xpZW50WTtcclxuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xyXG5cclxuICAgICAgY29uc3QgbmV3VG9wOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFRvcCAtIHBvczI7XHJcbiAgICAgIGNvbnN0IG5ld0xlZnQ6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0TGVmdCAtIHBvczE7XHJcbiAgICAgIGNvbnN0IHJlY3RIb2xkZXIgPSBob2xkZXJJbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAobmV3VG9wID49IHJlY3RIb2xkZXIueSArIDgpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IE1hdGgubWluKG5ld1RvcCwgcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC5oZWlnaHQgLSA0KSArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld0xlZnQgPiByZWN0SG9sZGVyLnggKyA0ICYmIHJlY3RIb2xkZXIueCArIHJlY3RIb2xkZXIud2lkdGggPiByZWN0RWxlbWVudC54ICsgcmVjdEVsZW1lbnQud2lkdGggKyAyKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gTWF0aC5taW4obmV3TGVmdCwgcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCAtIHJlY3RFbGVtZW50LndpZHRoIC0gNCkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xvc2VEcmFnRWxlbWVudCgpOiB2b2lkIHtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVXBsb2FkKGV2ZW50OiB7IHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkOyB9KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbWFnZVBpY2tlcj8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUZpbGVTZWxlY3QoZXZ0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbGVzID0gZXZ0Py50YXJnZXQ/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXTtcclxuICAgICAgdGhpcy5pbWFnZU5hbWUuc2V0KGZpbGU/Lm5hbWU/LnNwbGl0KCcuJylbMF0pO1xyXG4gICAgICB0aGlzLnVybEltYWdlID0gYGRhdGE6JHtmaWxlPy50eXBlfTtiYXNlNjQsYDtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChmaWxlcyAmJiBmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyOiBhbnkgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLmhhbmRsZVJlYWRlckxvYWRlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlRWRpdFBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICBsZXQgaW1hZ2VDcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgICBsZXQgaW1hZ2VGdWxsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUZ1bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVF1YWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXHJcbiAgICAgICAgcXVhbGl0eTogcXVhbGl0eUl0ZW0sXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZUZvcm1hdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVNpemUoY2hhbmdlV2lkdGg/OiBhbnksIGNoYW5nZUhlaWdodD86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XHJcbiAgICB0aGlzLm1heEhlaWdodC5zZXQodGhpcy5tYXhIZWlnaHQoKSA/PyAyMDAwKTtcclxuICAgIHRoaXMubWF4V2lkdGguc2V0KHRoaXMubWF4V2lkdGgoKSA/PyAyMDAwKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLndhaXQoNTAwKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgICBjaGFuZ2VIZWlnaHQ6IGNoYW5nZUhlaWdodCxcclxuICAgICAgICBjaGFuZ2VXaWR0aDogY2hhbmdlV2lkdGgsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xyXG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VDcm9wKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3JvcHBlcjogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgIGNyb3BwZXIuc3R5bGUud2lkdGggPSB0aGlzLmNyb3BXaWR0aC52YWx1ZSArICdweCc7XHJcbiAgICBjcm9wcGVyLnN0eWxlLmhlaWdodCA9IHRoaXMuY3JvcEhlaWdodC52YWx1ZSArICdweCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Dcm9wU3RhdGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBmdWxsSW1hZ2U6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgIGNvbnN0IGFzcGVjdFJhdGlvOiBudW1iZXIgPSBmdWxsSW1hZ2Uub2Zmc2V0V2lkdGggLyBmdWxsSW1hZ2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIGlmICh0aGlzLnNob3dDcm9wLnZhbHVlKSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xyXG4gICAgICB0aGlzLmRyYWdFbGVtZW50KGNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10pOiB2b2lkID0+IHtcclxuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5OiBSZXNpemVPYnNlcnZlckVudHJ5KTogdm9pZCA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93RWRpdFBhbmVsKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3RIb2xkZXI6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50Q3JvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoOiBudW1iZXIgPSByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQueCAtIDQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodDogbnVtYmVyID0gcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC55IC0gNDtcclxuXHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgZWwgdGFtYcOxbyBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzZWxlY2Npb25hZGEgcG9yIGVsIHVzdWFyaW9cclxuICAgICAgICAgICAgY29uc3QgY3JvcFdpZHRoOiBudW1iZXIgPSBlbGVtZW50Q3JvcHBlci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgY3JvcEhlaWdodDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXIgZWwgYW5jaG8geSBlbCBhbHRvIGRlbCDDoXJlYSBkZSByZWNvcnRlIG1hbnRlbmllbmRvIGxhIHJlbGFjacOzbiBkZSBhc3BlY3RvIGRlIGxhIGltYWdlbiBvcmlnaW5hbFxyXG4gICAgICAgICAgICBsZXQgbmV3V2lkdGg6IG51bWJlciA9IGNyb3BXaWR0aDtcclxuICAgICAgICAgICAgbGV0IG5ld0hlaWdodDogbnVtYmVyID0gY3JvcEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUpIHtcclxuICAgICAgICAgICAgICBpZiAoY3JvcFdpZHRoIC8gY3JvcEhlaWdodCA+IGFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBjcm9wV2lkdGggLyBhc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBjcm9wSGVpZ2h0ICogYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBanVzdGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzaSBzdXBlcmEgbG9zIGzDrW1pdGVzXHJcbiAgICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5taW4obmV3V2lkdGgsIG1heFdpZHRoKTtcclxuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5taW4obmV3SGVpZ2h0LCBtYXhIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gRXN0YWJsZWNlciBlbCB0YW1hw7FvIHkgbGEgcG9zaWNpw7NuIGRlbCDDoXJlYSBkZSByZWNvcnRlXHJcbiAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUocmVjdEVsZW1lbnQud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUocmVjdEVsZW1lbnQuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS50YXJnZXQuaWQgPT0gJ2ltYWdlLWZ1bGwnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlY3RIb2xkZXIudG9wID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUudG9wID0gcmVjdEhvbGRlci50b3AgKyA0ICsgJ3B4JztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUubGVmdCA9IHJlY3RIb2xkZXIubGVmdCArIDQgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKSk7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcwLjAnO1xyXG4gICAgICBpZiAodGhpcy5vYnNlcnZlciBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnRDcm9wcGVyKTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50RnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNyb3AodHlwZT86IGFueSk6IHZvaWQge1xyXG4gICAgdHlwZSA9IHR5cGUgPz8gdGhpcy5mb3JtYXQudmFsdWU7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgY29uc3QgcmVjdENyb3BwZXI6IERPTVJlY3QgPSBjcm9wcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgZGF0YUhvbGRlclJlY3Q6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBsZXQgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVNyYygpO1xyXG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgbGV0IHJhdGlvOiBudW1iZXIgPSBpbWFnZS5oZWlnaHQgLyBkYXRhSG9sZGVyUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoOiBudW1iZXIgPSByZWN0Q3JvcHBlci53aWR0aCAqIHJhdGlvO1xyXG4gICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IHJlY3RDcm9wcGVyLmhlaWdodCAqIHJhdGlvO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XHJcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgIE1hdGguYWJzKHJlY3RDcm9wcGVyLnggKiByYXRpbykgLSBNYXRoLmFicyhkYXRhSG9sZGVyUmVjdC54ICogcmF0aW8pLFxyXG4gICAgICAgICAgTWF0aC5hYnMocmVjdENyb3BwZXIueSAqIHJhdGlvKSAtIE1hdGguYWJzKGRhdGFIb2xkZXJSZWN0LnkgKiByYXRpbyksXHJcbiAgICAgICAgICBuZXdXaWR0aCxcclxuICAgICAgICAgIG5ld0hlaWdodCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgbmV3V2lkdGgsXHJcbiAgICAgICAgICBuZXdIZWlnaHQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgdGhpcy5xdWFsaXR5LnZhbHVlKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIGltYWdlLm9uZXJyb3IgPSAoZTogc3RyaW5nIHwgRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YVVyaTogYW55KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoZGF0YVVyaSk7XHJcbiAgICAgICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5vbkNyb3BTdGF0ZUNoYW5nZSgpO1xyXG4gICAgICAgIHRoaXMubWF4V2lkdGguc2V0KGNhbnZhcz8ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMubWF4SGVpZ2h0LnNldChjYW52YXM/LmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gdGhpcy5vcmlnaW5JbWFnZVNyYyArICcnO1xyXG4gICAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBkYXRhVXJpO1xyXG4gICAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlc3RvcmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgbGV0IGxhc3RTdGF0ZSA9IHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucG9wKCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGxhc3RTdGF0ZS5sYXN0SW1hZ2UpO1xyXG4gICAgICB0aGlzLm1heFdpZHRoLnNldChsYXN0U3RhdGUud2lkdGgpO1xyXG4gICAgICB0aGlzLm1heEhlaWdodC5zZXQobGFzdFN0YXRlLmhlaWdodCk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMubGFzdE9yaWdpblNyYyk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbWFnZVNyYy5zZXQobnVsbCk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgIHRoaXMubG9hZEltYWdlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KDIwMDApO1xyXG4gICAgdGhpcy5tYXhXaWR0aC5zZXQoMjAwMCk7XHJcbiAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUoMTUwKTtcclxuICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKDE1MCk7XHJcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9JyFsb2FkSW1hZ2UoKScgY2xhc3M9J3BsYWNlLWltYWdlJz5cclxuICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXInXHJcbiAgICAgICBbbmdTdHlsZV09J3sgd2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XHJcbiAgICA8YnV0dG9uIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIiBjbGFzcz0naW1hZ2UtdXBsb2FkLWJ0bicgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIChjbGljayk9J29uVXBsb2FkKCRldmVudCknPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+YWRkX2FfcGhvdG88L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8aW5wdXQgI2ltYWdlUGlja2VyIHR5cGU9J2ZpbGUnIGNsYXNzPSdkLW5vbmUnIFtpZF09XCInZmlsZVBpY2tlci0nICsgdXVpZEZpbGVQaWNrZXJcIlxyXG4gICAgICAgICAgIChjaGFuZ2UpPSdoYW5kbGVGaWxlU2VsZWN0KCRldmVudCknIFthY2NlcHRdPSdpbWFnZXNBbGxvd2VkJz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPSdsb2FkSW1hZ2UoKScgY2xhc3M9J3BsYWNlLWltYWdlJz5cclxuICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItbG9hZGVkJ1xyXG4gICAgICAgW25nU3R5bGVdPSd7d2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XHJcbiAgICA8aW1nIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9J2ltYWdlLWxvYWRlZCcgW25nU3R5bGVdPSd7IGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1cyB9Jz5cclxuICAgIDxpbnB1dCAjaW1hZ2VQaWNrZXIgdHlwZT0nZmlsZScgY2xhc3M9J2Qtbm9uZScgW2lkXT1cIidmaWxlUGlja2VyLScgKyB1dWlkRmlsZVBpY2tlclwiXHJcbiAgICAgICAgICAgKGNoYW5nZSk9J2hhbmRsZUZpbGVTZWxlY3QoJGV2ZW50KScgW2FjY2VwdF09J2ltYWdlc0FsbG93ZWQnPlxyXG4gIDwvZGl2PlxyXG4gIDxwICpuZ0lmPSdpbWFnZVNyYygpPy5sZW5ndGgnIGNsYXNzPSdtYXQtY2FwdGlvbiBpbWFnZS1jYXB0aW9uJyBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcclxuICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cclxuICAgIHt7XCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKX19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYiAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XHJcbiAgPC9wPlxyXG5cclxuICA8ZGl2IGNsYXNzPSdlZGl0aW5nLWJhci1idG4nPlxyXG4gICAgPGJ1dHRvbiBpZD0ndXBsb2FkLWltZycgKm5nSWY9JyFjb25maWcoKT8uaGlkZUFkZEJ0bicgbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uVXBsb2FkKCRldmVudCknXHJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmFkZF9hX3Bob3RvPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD0nZWRpdC1pbWcnICpuZ0lmPSchY29uZmlnKCk/LmhpZGVFZGl0QnRuICYmICFub0VkaXQoKScgbWF0LWljb24tYnV0dG9uIChjbGljayk9J3Nob3dFZGl0UGFuZWwuc2V0KHRydWUpJ1xyXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInT1BFTl9FRElUT1JfUEFORUwnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5lZGl0PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGEgaWQ9J2Rvd25sb2FkLWltZycgKm5nSWY9JyFjb25maWcoKT8uaGlkZURvd25sb2FkQnRuJyBbbWF0VG9vbHRpcF09XCInRE9XTkxPQUQnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgIFtocmVmXT0naW1hZ2VTcmMoKScgbWF0LWljb24tYnV0dG9uIFtkb3dubG9hZF09J2ltYWdlTmFtZSc+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbG91ZF9kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICA8L2E+XHJcbiAgICA8YnV0dG9uIGlkPSdkZWxldGUtaW1nJyAqbmdJZj0nIWNvbmZpZygpPy5oaWRlRGVsZXRlQnRuJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25SZW1vdmUoKSdcclxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1JFTU9WRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPSdzaG93RWRpdFBhbmVsKCknIGlkPSdwb3B1cCcgY2xhc3M9J3BvcHVwJz5cclxuICA8ZGl2IGNsYXNzPSdwb3B1cC1jbGVhcic+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPSdvbkNsb3NlRWRpdFBhbmVsKCknPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9J2ltYWdlLWNvbnRhaW5lcic+XHJcbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItZnVsbCc+XHJcbiAgICAgIDxpbWcgaWQ9J2ltYWdlLWZ1bGwnIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9Jyc+XHJcbiAgICAgIDxkaXYgaWQ9J2ltYWdlLWNyb3BwZXInIGNsYXNzPSdpbWFnZS1jcm9wcGVyJz5cclxuICAgICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyLWhlYWRlcic+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9J2NvbnRyb2wtcGFuZWwnPlxyXG4gICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdRVUFMSVRZJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgPGRpdiBjbGFzcz0ncXVhbGl0eS1jb250YWluZXInPlxyXG4gICAgICAgIDxtYXQtc2xpZGVyIG5nRGVmYXVsdENvbnRyb2wgW2NvbG9yXT0nY29sb3InIGNsYXNzPSd3LTEwMCBtdy0xMDAnIChjaGFuZ2UpPSdvbkNoYW5nZVF1YWxpdHkoKSdcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT0nMTAwJyBbbWluXT0nMCcgW3N0ZXBdPScxJyBbZGlzY3JldGVdPSd0cnVlJyBbc2hvd1RpY2tNYXJrc109J3RydWUnPlxyXG4gICAgICAgICAgPGlucHV0IG1hdFNsaWRlclRodW1iIFtmb3JtQ29udHJvbF09J3F1YWxpdHknPlxyXG4gICAgICAgIDwvbWF0LXNsaWRlcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPSdpdGVtLXBhbmVsJz5cclxuICAgICAgICA8c3BhbiBjbGFzcz0nZnctNjAwJz57eyAnTUFYX0RJTUVOU0lPTlMnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9J2Zsb2F0LXJpZ2h0JyBbZm9ybUNvbnRyb2xdPSdtYWludGFpbkFzcGVjdFJhdGlvJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICA8c3Bhbj57eyAnQVNQRUNUX1JBVElPJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPSdtYXgtZGltZW5zaW9uLWNvbnRhaW5lcic+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ01BWF9XSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKHRydWUsIGZhbHNlKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT0nbWF4V2lkdGgnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57eyAnTUFYX0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKGZhbHNlLCB0cnVlKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidNQVhfSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09J21heEhlaWdodCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnRk9STUFUJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgPGRpdiBjbGFzcz0nZm9ybWF0cy1zZWxlY3Rpb24nPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy0xMDAgbXctMTAwJyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09J2Zvcm1hdCcgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlRm9ybWF0KCknPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9J2xldCBmb3JtYXQgb2YgYWxsRm9ybWF0cycgW3ZhbHVlXT0nZm9ybWF0Jz5cclxuICAgICAgICAgICAgICB7eyBmb3JtYXQgfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz0ncmVmcmVzaC1jb250YWluZXInPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9J29uQ3JvcFN0YXRlQ2hhbmdlKCknIFtmb3JtQ29udHJvbF09J3Nob3dDcm9wJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdDUk9QJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggJz5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9J2Zsb2F0LXJpZ2h0JyBtYXQtaWNvbi1idXR0b24gW2NvbG9yXT0nY29sb3InIChjbGljayk9J29uUmVzdG9yZSgpJz5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8cCAqbmdJZj0nc2hvd0Nyb3AudmFsdWUnPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY29sb3JdPSdjb2xvcicgKGNsaWNrKT0nb25Dcm9wKCknPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hvd0Nyb3AudmFsdWUnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9J2RpbWVuc2lvbi1jb250YWluZXInPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4IG13LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VDcm9wKCknIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCInV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BXaWR0aCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCBtdy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidIRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz0nc2F2ZS1jb250YWluZXInPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKScgW2NvbG9yXT0nY29sb3InIGNsYXNzPSdzYXZlLWJ1dHRvbic+XHJcbiAgICAgICAgICB7eyAnU0FWRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2V9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8cCAqbmdJZj0naW1hZ2VTcmMoKT8ubGVuZ3RoJyBjbGFzcz0nbWF0LWNhcHRpb24gaW1hZ2UtY2FwdGlvbidcclxuICAgICAgICAgICBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcclxuICAgICAgICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cclxuICAgICAgICAgIHt7XCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKX19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYiAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
512
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMz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QUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUV1QyxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWpDLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFTSxTQUFTO3NCQUFyQixLQUFLO2dCQW1DTyxPQUFPO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlciB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJFbnRyeSc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgeyBQaXBlc01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3BpcGVzL3BpcGVzLm1vZHVsZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlUGlja2VyQ29uZiB7XHJcbiAgd2lkdGg/OiBzdHJpbmc7XHJcbiAgaGVpZ2h0Pzogc3RyaW5nO1xyXG4gIGJvcmRlclJhZGl1cz86IHN0cmluZztcclxuICBjb21wcmVzc0luaXRpYWw/OiBib29sZWFuO1xyXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xyXG4gIGhpZGVEZWxldGVCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVEb3dubG9hZEJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZUVkaXRCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVBZGRCdG4/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQ29udmVydGVySW5wdXQge1xyXG4gIHdpZHRoPzogbnVtYmVyO1xyXG4gIGhlaWdodD86IG51bWJlcjtcclxuICBxdWFsaXR5PzogbnVtYmVyO1xyXG4gIGRhdGFUeXBlPzogc3RyaW5nO1xyXG4gIG1haW50YWluUmF0aW8/OiBib29sZWFuO1xyXG4gIGNoYW5nZUhlaWdodD86IGJvb2xlYW47XHJcbiAgY2hhbmdlV2lkdGg/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJbWFnZUFsbG93ZWRUeXBlcyA9XHJcbiAgJ2ltYWdlLyonXHJcbiAgfCAnLndlYnAnXHJcbiAgfCAnLnBuZydcclxuICB8ICcud2VicCwgLmpwZywgLmpwZWcnXHJcbiAgfCAnLndlYnAsIC5wbmcnXHJcbiAgfCAnLmpwZywgLmpwZWcnXHJcbiAgfCAnLnBuZywgLmpwZywgLmpwZWcnXHJcbiAgfCAnLndlYnAsIC5wbmcsIC5qcGcsIC5qcGVnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3VhamlyaXRvcy1pbWFnZS1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE5nU3R5bGUsXHJcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIFBpcGVzTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0U2xpZGVyTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxyXG5dLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3VhamlyaXRvc0ltYWdlUGlja2VyIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIG9yaWdpbkltYWdlU3JjOiBhbnk7XHJcbiAgcHJpdmF0ZSB1cmxJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbGFzdE9yaWdpblNyYzogYW55O1xyXG5cclxuICBwcml2YXRlIGFycmF5Q29waWVkSW1hZ2VzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgdXVpZEZpbGVQaWNrZXI6IHN0cmluZyA9IERhdGUubm93KCkudG9TdHJpbmcoMjApO1xyXG4gIHB1YmxpYyByZWFkb25seSBhbGxGb3JtYXRzOiBzdHJpbmdbXSA9IFsnd2VicCcsICdqcGVnJywgJ3BuZyddO1xyXG4gIHB1YmxpYyBjb25maWc6IFdyaXRhYmxlU2lnbmFsPEltYWdlUGlja2VyQ29uZj4gPSBzaWduYWwoe1xyXG4gICAgaGVpZ2h0OiAnMjQwcHgnLFxyXG4gICAgd2lkdGg6ICczMjBweCcsXHJcbiAgICBib3JkZXJSYWRpdXM6ICcxNnB4JyxcclxuICAgIGNvbXByZXNzSW5pdGlhbDogdHJ1ZSxcclxuICAgIGxhbmd1YWdlOiAnZXMnLFxyXG4gICAgaGlkZURlbGV0ZUJ0bjogZmFsc2UsXHJcbiAgICBoaWRlRG93bmxvYWRCdG46IGZhbHNlLFxyXG4gICAgaGlkZUVkaXRCdG46IGZhbHNlLFxyXG4gICAgaGlkZUFkZEJ0bjogZmFsc2UsXHJcbiAgfSk7XHJcbiAgcHVibGljIGltYWdlU3JjOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKG51bGwpO1xyXG4gIHB1YmxpYyBzaG93Q3JvcDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBmYWxzZSwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBsb2FkSW1hZ2U6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuICBwdWJsaWMgbm9FZGl0OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcHVibGljIHNob3dFZGl0UGFuZWw6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuICBwdWJsaWMgbWFpbnRhaW5Bc3BlY3RSYXRpbzogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiB0cnVlLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIHF1YWxpdHk6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogNzAsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgZm9ybWF0OiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6ICd3ZWJwJywgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBtYXhIZWlnaHQ6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMjAwMCk7XHJcbiAgcHVibGljIG1heFdpZHRoOiBXcml0YWJsZVNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDIwMDApO1xyXG4gIHB1YmxpYyBjcm9wSGVpZ2h0OiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDE1MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBjcm9wV2lkdGg6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogMTUwLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGltYWdlTmFtZTogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZG93bmxvYWQnKTtcclxuICBwdWJsaWMgY3VycmVudExhbmd1YWdlOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCdlcycpO1xyXG5cclxuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ291dGxpbmUnO1xyXG4gIEBJbnB1dCgpIGNvbG9yOiBUaGVtZVBhbGV0dGUgPSAncHJpbWFyeSc7XHJcbiAgQElucHV0KCkgaW1hZ2VzQWxsb3dlZDogSW1hZ2VBbGxvd2VkVHlwZXMgPSAnaW1hZ2UvKic7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlUGlja2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGltYWdlUGlja2VyOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xyXG5cclxuICBAT3V0cHV0KCkgJGltYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgJGltYWdlT3JpZ2luYWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBfaW1hZ2VTcmMoaW1hZ2U6IHN0cmluZykge1xyXG4gICAgaWYgKGltYWdlKSB7XHJcbiAgICAgIGxldCB0eXBlczogc3RyaW5nW10gPSBpbWFnZS5zcGxpdCgnLicpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSh0eXBlc1t0eXBlcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZm9ybWF0LnZhbHVlIHx8ICh0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3BuZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICdqcGVnJyAmJiB0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3dlYnAnKSkge1xyXG4gICAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGltYWdlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2godGhpcy5pbWFnZVNyYyk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBpbWFnZTtcclxuICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gaW1hZ2U7XHJcbiAgICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dCh0aGlzLm9yaWdpbkltYWdlU3JjKTtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgICB0aGlzLm5vRWRpdC5zZXQodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChudWxsKTtcclxuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IG51bGw7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcclxuICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gbnVsbDtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgICB0aGlzLm1heEhlaWdodC5zZXQoMjAwMCk7XHJcbiAgICAgIHRoaXMubWF4V2lkdGguc2V0KDIwMDApO1xyXG4gICAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUoMTUwKTtcclxuICAgICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUoMTUwKTtcclxuICAgICAgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnNldFZhbHVlKHRydWUpO1xyXG4gICAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBfY29uZmlnKHZhbHVlOiBJbWFnZVBpY2tlckNvbmYpIHtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHtcclxuICAgICAgdGhpcy5jb25maWcuc2V0KHtcclxuICAgICAgICAuLi50aGlzLmNvbmZpZygpLFxyXG4gICAgICAgIC4uLnZhbHVlLFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZWFkZXJMb2FkZWQocmVhZGVyRXZ0OiB7IHRhcmdldDogeyByZXN1bHQ6IGFueTsgfTsgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYmluYXJ5U3RyaW5nOiBzdHJpbmcgPSByZWFkZXJFdnQudGFyZ2V0LnJlc3VsdDtcclxuICAgIGNvbnN0IGJhc2U2NHRleHRTdHJpbmc6IHN0cmluZyA9IGJ0b2EoYmluYXJ5U3RyaW5nKTtcclxuICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcclxuICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnKCk/LmNvbXByZXNzSW5pdGlhbCkge1xyXG4gICAgICB0aGlzLnF1YWxpdHkuc2V0VmFsdWUoNzApO1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXHJcbiAgICAgICAgcXVhbGl0eTogMC43MCxcclxuICAgICAgICBtYWludGFpblJhdGlvOiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChhd2FpdCB0aGlzLnJlc2l6ZURhdGFVUkwodGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmcsIGlucHV0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldCh0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZyk7XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHtcclxuICAgICAgICBsYXN0SW1hZ2U6IHRoaXMuaW1hZ2VTcmMoKSxcclxuICAgICAgICB3aWR0aDogdGhpcy5tYXhXaWR0aCgpLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQoKSxcclxuICAgICAgICBxdWFsaXR5OiB0aGlzLnF1YWxpdHkudmFsdWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgIH1cclxuICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlc2l6ZURhdGFVUkwoZGF0YXM6IHN0cmluZywgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIGZ1bmN0aW9uKHJlc29sdmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgbGV0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICBpbWcuc3JjID0gZGF0YXMgKyAnJztcclxuICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XHJcbiAgICAgIGxldCBxdWFsaXR5OiBudW1iZXIgPSBpbnB1dD8ucXVhbGl0eSA/PyAxLjA7XHJcbiAgICAgIGxldCBtYWludGFpblJhdGlvOiBib29sZWFuID0gaW5wdXQubWFpbnRhaW5SYXRpbyAhPT0gdW5kZWZpbmVkID8gaW5wdXQubWFpbnRhaW5SYXRpbyA6IHRydWU7XHJcblxyXG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgIGNvbnN0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgbGV0IHJhdGlvOiBudW1iZXIgPSBpbWcud2lkdGggLyBpbWcuaGVpZ2h0O1xyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gaW5wdXQ/LndpZHRoID8/IGltZy53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBpbnB1dD8uaGVpZ2h0ID8/IGltZy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChtYWludGFpblJhdGlvKSB7XHJcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhbmdlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGhlaWdodCAqIHJhdGlvO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB3aWR0aCAvIHJhdGlvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHg/LmRyYXdJbWFnZShpbWcsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgbGV0IHR5cGU6IHN0cmluZyA9IGlucHV0Py5kYXRhVHlwZSA/PyAnd2VicCc7XHJcbiAgICAgICAgY29uc3QgZGF0YVVSSTogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTChgaW1hZ2UvJHt0eXBlfWAsIHF1YWxpdHkpO1xyXG4gICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgZGF0YVVyaTogZGF0YVVSSSxcclxuICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGNhbnZhcy5oZWlnaHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9KS50aGVuKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tYXhIZWlnaHQgPSBkYXRhPy5oZWlnaHQ7XHJcbiAgICAgIHRoaXMubWF4V2lkdGggPSBkYXRhPy53aWR0aDtcclxuICAgICAgaWYgKHRoaXMuYXJyYXlDb3BpZWRJbWFnZXM/Lmxlbmd0aCA8PSAyMCkge1xyXG4gICAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XHJcbiAgICAgICAgICBsYXN0SW1hZ2U6IGRhdGE/LmRhdGFVcmksXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5tYXhXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQsXHJcbiAgICAgICAgICBxdWFsaXR5OiB0aGlzLnF1YWxpdHkudmFsdWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhLmRhdGFVcmk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2FpdChtcz86IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBtcyA9IG1zID8/IDEwMDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpOiB2b2lkID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH0sIG1zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmFnRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgbGV0IHBvczE6IG51bWJlciA9IDAsIHBvczI6IG51bWJlciA9IDAsIHBvczM6IG51bWJlciA9IDAsIHBvczQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgbGV0IGVsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQgKyAnLWhlYWRlcicpO1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIGVsLm9ubW91c2Vkb3duID0gZHJhZ01vdXNlRG93bjtcclxuICAgICAgZWwub250b3VjaHN0YXJ0ID0gZHJhZ01vdXNlRG93bjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsZW1lbnQub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xyXG4gICAgICBlbGVtZW50Lm9udG91Y2hzdGFydCA9IGRyYWdNb3VzZURvd247XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhZ01vdXNlRG93bihlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBwb3MzID0gZT8uY2xpZW50WDtcclxuICAgICAgcG9zNCA9IGU/LmNsaWVudFk7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IGNsb3NlRHJhZ0VsZW1lbnQ7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2hlbmQgPSBjbG9zZURyYWdFbGVtZW50O1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IGVsZW1lbnREcmFnO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNobW92ZSA9IGVsZW1lbnREcmFnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGVsZW1lbnREcmFnKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICBsZXQgaG9sZGVySW1hZ2U6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XHJcbiAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcclxuICAgICAgZT8ucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcG9zMSA9IHBvczMgLSBlPy5jbGllbnRYO1xyXG4gICAgICBwb3MyID0gcG9zNCAtIGU/LmNsaWVudFk7XHJcbiAgICAgIHBvczMgPSBlPy5jbGllbnRYO1xyXG4gICAgICBwb3M0ID0gZT8uY2xpZW50WTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1RvcDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRUb3AgLSBwb3MyO1xyXG4gICAgICBjb25zdCBuZXdMZWZ0OiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldExlZnQgLSBwb3MxO1xyXG4gICAgICBjb25zdCByZWN0SG9sZGVyID0gaG9sZGVySW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHJlY3RFbGVtZW50OiBET01SZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgaWYgKG5ld1RvcCA+PSByZWN0SG9sZGVyLnkgKyA4KSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSBNYXRoLm1pbihuZXdUb3AsIHJlY3RIb2xkZXIueSArIHJlY3RIb2xkZXIuaGVpZ2h0IC0gcmVjdEVsZW1lbnQuaGVpZ2h0IC0gNCkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdMZWZ0ID4gcmVjdEhvbGRlci54ICsgNCAmJiByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoID4gcmVjdEVsZW1lbnQueCArIHJlY3RFbGVtZW50LndpZHRoICsgMikge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IE1hdGgubWluKG5ld0xlZnQsIHJlY3RIb2xkZXIueCArIHJlY3RIb2xkZXIud2lkdGggLSByZWN0RWxlbWVudC53aWR0aCAtIDQpICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsb3NlRHJhZ0VsZW1lbnQoKTogdm9pZCB7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGw7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaGVuZCA9IG51bGw7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblVwbG9hZChldmVudDogeyBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdm9pZDsgfSk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW1hZ2VQaWNrZXI/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVGaWxlU2VsZWN0KGV2dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGV2dD8udGFyZ2V0Py5maWxlcztcclxuICAgIGlmIChmaWxlcykge1xyXG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XHJcbiAgICAgIHRoaXMuaW1hZ2VOYW1lLnNldChmaWxlPy5uYW1lPy5zcGxpdCgnLicpWzBdKTtcclxuICAgICAgdGhpcy51cmxJbWFnZSA9IGBkYXRhOiR7ZmlsZT8udHlwZX07YmFzZTY0LGA7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoZmlsZXMgJiYgZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlcjogYW55ID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gdGhpcy5oYW5kbGVSZWFkZXJMb2FkZWQuYmluZCh0aGlzKTtcclxuICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbG9zZUVkaXRQYW5lbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9ic2VydmVyIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgbGV0IGltYWdlQ3JvcHBlcjogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgbGV0IGltYWdlRnVsbDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoaW1hZ2VDcm9wcGVyKTtcclxuICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoaW1hZ2VGdWxsKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Nyb3Auc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VRdWFsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVhbGl0eUl0ZW06IG51bWJlciA9IHRoaXMucXVhbGl0eS52YWx1ZSAvIDEwMDtcclxuICAgIHRoaXMubWF4SGVpZ2h0LnNldCh0aGlzLm1heEhlaWdodCgpID8/IDIwMDApO1xyXG4gICAgdGhpcy5tYXhXaWR0aC5zZXQodGhpcy5tYXhXaWR0aCgpID8/IDIwMDApO1xyXG5cclxuICAgIGF3YWl0IHRoaXMud2FpdCgyNTApO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xyXG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VGb3JtYXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcXVhbGl0eUl0ZW06IG51bWJlciA9IHRoaXMucXVhbGl0eS52YWx1ZSAvIDEwMDtcclxuICAgIHRoaXMubWF4SGVpZ2h0LnNldCh0aGlzLm1heEhlaWdodCgpID8/IDIwMDApO1xyXG4gICAgdGhpcy5tYXhXaWR0aC5zZXQodGhpcy5tYXhXaWR0aCgpID8/IDIwMDApO1xyXG5cclxuICAgIGF3YWl0IHRoaXMud2FpdCgyNTApO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0ID0ge1xyXG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQoKSxcclxuICAgICAgICB3aWR0aDogdGhpcy5tYXhXaWR0aCgpLFxyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiBxdWFsaXR5SXRlbSxcclxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xyXG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VTaXplKGNoYW5nZVdpZHRoPzogYW55LCBjaGFuZ2VIZWlnaHQ/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDUwMCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0ID0ge1xyXG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQoKSxcclxuICAgICAgICB3aWR0aDogdGhpcy5tYXhXaWR0aCgpLFxyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiBxdWFsaXR5SXRlbSxcclxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXHJcbiAgICAgICAgY2hhbmdlSGVpZ2h0OiBjaGFuZ2VIZWlnaHQsXHJcbiAgICAgICAgY2hhbmdlV2lkdGg6IGNoYW5nZVdpZHRoLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChhd2FpdCB0aGlzLnJlc2l6ZURhdGFVUkwodGhpcy5vcmlnaW5JbWFnZVNyYywgaW5wdXQpKTtcclxuICAgICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlQ3JvcCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNyb3BwZXI6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjcm9wcGVyLnN0eWxlLndpZHRoID0gdGhpcy5jcm9wV2lkdGgudmFsdWUgKyAncHgnO1xyXG4gICAgY3JvcHBlci5zdHlsZS5oZWlnaHQgPSB0aGlzLmNyb3BIZWlnaHQudmFsdWUgKyAncHgnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JvcFN0YXRlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3JvcHBlcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgY29uc3QgZnVsbEltYWdlOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XHJcbiAgICBjb25zdCBhc3BlY3RSYXRpbzogbnVtYmVyID0gZnVsbEltYWdlLm9mZnNldFdpZHRoIC8gZnVsbEltYWdlLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93Q3JvcC52YWx1ZSkge1xyXG4gICAgICBjcm9wcGVyLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcclxuICAgICAgdGhpcy5kcmFnRWxlbWVudChjcm9wcGVyKTtcclxuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdKTogdm9pZCA9PiB7XHJcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeTogUmVzaXplT2JzZXJ2ZXJFbnRyeSk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0VkaXRQYW5lbCgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRGdWxsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZWN0SG9sZGVyOiBET01SZWN0ID0gZWxlbWVudEZ1bGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3RFbGVtZW50OiBET01SZWN0ID0gZWxlbWVudENyb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aDogbnVtYmVyID0gcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCAtIHJlY3RFbGVtZW50LnggLSA0O1xyXG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQ6IG51bWJlciA9IHJlY3RIb2xkZXIueSArIHJlY3RIb2xkZXIuaGVpZ2h0IC0gcmVjdEVsZW1lbnQueSAtIDQ7XHJcblxyXG4gICAgICAgICAgICAvLyBPYnRlbmVyIGVsIHRhbWHDsW8gZGVsIMOhcmVhIGRlIHJlY29ydGUgc2VsZWNjaW9uYWRhIHBvciBlbCB1c3VhcmlvXHJcbiAgICAgICAgICAgIGNvbnN0IGNyb3BXaWR0aDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyb3BIZWlnaHQ6IG51bWJlciA9IGVsZW1lbnRDcm9wcGVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBtYW50ZW5pZW5kbyBsYSByZWxhY2nDs24gZGUgYXNwZWN0byBkZSBsYSBpbWFnZW4gb3JpZ2luYWxcclxuICAgICAgICAgICAgbGV0IG5ld1dpZHRoOiBudW1iZXIgPSBjcm9wV2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IGNyb3BIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNyb3BXaWR0aCAvIGNyb3BIZWlnaHQgPiBhc3BlY3RSYXRpbykge1xyXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY3JvcFdpZHRoIC8gYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gY3JvcEhlaWdodCAqIGFzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQWp1c3RhciBlbCBhbmNobyB5IGVsIGFsdG8gZGVsIMOhcmVhIGRlIHJlY29ydGUgc2kgc3VwZXJhIGxvcyBsw61taXRlc1xyXG4gICAgICAgICAgICBuZXdXaWR0aCA9IE1hdGgubWluKG5ld1dpZHRoLCBtYXhXaWR0aCk7XHJcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKG5ld0hlaWdodCwgbWF4SGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEVzdGFibGVjZXIgZWwgdGFtYcOxbyB5IGxhIHBvc2ljacOzbiBkZWwgw6FyZWEgZGUgcmVjb3J0ZVxyXG4gICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS53aWR0aCA9IGAke25ld1dpZHRofXB4YDtcclxuICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKHJlY3RFbGVtZW50LndpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKHJlY3RFbGVtZW50LmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkudGFyZ2V0LmlkID09ICdpbWFnZS1mdWxsJykge1xyXG4gICAgICAgICAgICAgIGlmIChyZWN0SG9sZGVyLnRvcCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLnRvcCA9IHJlY3RIb2xkZXIudG9wICsgNCArICdweCc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLmxlZnQgPSByZWN0SG9sZGVyLmxlZnQgKyA0ICsgJ3B4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJykpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjcm9wcGVyLnN0eWxlLm9wYWNpdHkgPSAnMC4wJztcclxuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRDcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50Q3JvcHBlcik7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoZWxlbWVudEZ1bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Dcm9wKHR5cGU/OiBhbnkpOiB2b2lkIHtcclxuICAgIHR5cGUgPSB0eXBlID8/IHRoaXMuZm9ybWF0LnZhbHVlO1xyXG4gICAgY29uc3QgY3JvcHBlcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgIGNvbnN0IHJlY3RDcm9wcGVyOiBET01SZWN0ID0gY3JvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGRhdGFIb2xkZXJSZWN0OiBET01SZWN0ID0gZWxlbWVudEZ1bGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgbGV0IGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VTcmMoKTtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGxldCByYXRpbzogbnVtYmVyID0gaW1hZ2UuaGVpZ2h0IC8gZGF0YUhvbGRlclJlY3QuaGVpZ2h0O1xyXG4gICAgICAgIGxldCBuZXdXaWR0aDogbnVtYmVyID0gcmVjdENyb3BwZXIud2lkdGggKiByYXRpbztcclxuICAgICAgICBsZXQgbmV3SGVpZ2h0OiBudW1iZXIgPSByZWN0Q3JvcHBlci5oZWlnaHQgKiByYXRpbztcclxuICAgICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xyXG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKFxyXG4gICAgICAgICAgaW1hZ2UsXHJcbiAgICAgICAgICBNYXRoLmFicyhyZWN0Q3JvcHBlci54ICogcmF0aW8pIC0gTWF0aC5hYnMoZGF0YUhvbGRlclJlY3QueCAqIHJhdGlvKSxcclxuICAgICAgICAgIE1hdGguYWJzKHJlY3RDcm9wcGVyLnkgKiByYXRpbykgLSBNYXRoLmFicyhkYXRhSG9sZGVyUmVjdC55ICogcmF0aW8pLFxyXG4gICAgICAgICAgbmV3V2lkdGgsXHJcbiAgICAgICAgICBuZXdIZWlnaHQsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIG5ld1dpZHRoLFxyXG4gICAgICAgICAgbmV3SGVpZ2h0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoY2FudmFzLnRvRGF0YVVSTChgaW1hZ2UvJHt0eXBlfWAsIHRoaXMucXVhbGl0eS52YWx1ZSkpO1xyXG4gICAgICB9O1xyXG4gICAgICBpbWFnZS5vbmVycm9yID0gKGU6IHN0cmluZyB8IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICB9O1xyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGFVcmk6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGRhdGFVcmkpO1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3Auc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMub25Dcm9wU3RhdGVDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLm1heFdpZHRoLnNldChjYW52YXM/LndpZHRoKTtcclxuICAgICAgICB0aGlzLm1heEhlaWdodC5zZXQoY2FudmFzPy5oZWlnaHQpO1xyXG4gICAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IHRoaXMub3JpZ2luSW1hZ2VTcmMgKyAnJztcclxuICAgICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gZGF0YVVyaTtcclxuICAgICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGUpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZXN0b3JlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBsYXN0U3RhdGUgPSB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnBvcCgpO1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChsYXN0U3RhdGUubGFzdEltYWdlKTtcclxuICAgICAgdGhpcy5tYXhXaWR0aC5zZXQobGFzdFN0YXRlLndpZHRoKTtcclxuICAgICAgdGhpcy5tYXhIZWlnaHQuc2V0KGxhc3RTdGF0ZS5oZWlnaHQpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy5sYXN0T3JpZ2luU3JjICsgJyc7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldCh0aGlzLmxhc3RPcmlnaW5TcmMpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy5sYXN0T3JpZ2luU3JjICsgJyc7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlbW92ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IG51bGw7XHJcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gbnVsbDtcclxuICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dChudWxsKTtcclxuICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcclxuICAgIHRoaXMubWF4SGVpZ2h0LnNldCgyMDAwKTtcclxuICAgIHRoaXMubWF4V2lkdGguc2V0KDIwMDApO1xyXG4gICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XHJcbiAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnNldFZhbHVlKHRydWUpO1xyXG4gICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLm5vRWRpdC5zZXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsJC5uZXh0KCk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKCFsb2FkSW1hZ2UoKSkge1xuICA8ZGl2IGNsYXNzPSdwbGFjZS1pbWFnZSc+XG4gICAgPGRpdiBjbGFzcz0naW1hZ2UtaG9sZGVyJ1xuICAgICAgICAgW25nU3R5bGVdPSd7IHdpZHRoOiBjb25maWcoKT8ud2lkdGgsaGVpZ2h0OiBjb25maWcoKT8uaGVpZ2h0LGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1c30nPlxuICAgICAgPGJ1dHRvbiBbbWF0VG9vbHRpcF09XCInVVBMT0FEX0FfSU1BR0UnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCIgY2xhc3M9J2ltYWdlLXVwbG9hZC1idG4nIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPSdvblVwbG9hZCgkZXZlbnQpJz5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmFkZF9hX3Bob3RvPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGlucHV0ICNpbWFnZVBpY2tlciB0eXBlPSdmaWxlJyBjbGFzcz0nZC1ub25lJyBbaWRdPVwiJ2ZpbGVQaWNrZXItJyArIHV1aWRGaWxlUGlja2VyXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT0naGFuZGxlRmlsZVNlbGVjdCgkZXZlbnQpJyBbYWNjZXB0XT0naW1hZ2VzQWxsb3dlZCc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuXG5AaWYgKGxvYWRJbWFnZSgpKSB7XG4gIDxkaXYgY2xhc3M9J3BsYWNlLWltYWdlJz5cbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItbG9hZGVkJ1xuICAgICAgICAgW25nU3R5bGVdPSd7d2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XG4gICAgICA8aW1nIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9J2ltYWdlLWxvYWRlZCcgW25nU3R5bGVdPSd7IGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1cyB9Jz5cbiAgICAgIDxpbnB1dCAjaW1hZ2VQaWNrZXIgdHlwZT0nZmlsZScgY2xhc3M9J2Qtbm9uZScgW2lkXT1cIidmaWxlUGlja2VyLScgKyB1dWlkRmlsZVBpY2tlclwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9J2hhbmRsZUZpbGVTZWxlY3QoJGV2ZW50KScgW2FjY2VwdF09J2ltYWdlc0FsbG93ZWQnPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoaW1hZ2VTcmMoKT8ubGVuZ3RoKSB7XG4gICAgICA8cCBjbGFzcz0nbWF0LWNhcHRpb24gaW1hZ2UtY2FwdGlvbicgW2NsYXNzLndhcm5dPScoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgPiAyMDAnXG4gICAgICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cbiAgICAgICAge3sgXCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKSB9fToge3sgKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpIH19S2IgJm5ic3A7IHt7IGZvcm1hdC52YWx1ZSB9fVxuICAgICAgPC9wPlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPSdlZGl0aW5nLWJhci1idG4nPlxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVBZGRCdG4pIHtcbiAgICAgICAgPGJ1dHRvbiBpZD0ndXBsb2FkLWltZycgbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uVXBsb2FkKCRldmVudCknXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1VQTE9BRF9BX0lNQUdFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5hZGRfYV9waG90bzwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVFZGl0QnRuICYmICFub0VkaXQoKSkge1xuICAgICAgICA8YnV0dG9uIGlkPSdlZGl0LWltZycgbWF0LWljb24tYnV0dG9uIChjbGljayk9J3Nob3dFZGl0UGFuZWwuc2V0KHRydWUpJ1xuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidPUEVOX0VESVRPUl9QQU5FTCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVEb3dubG9hZEJ0bikge1xuICAgICAgICA8YSBpZD0nZG93bmxvYWQtaW1nJyBbbWF0VG9vbHRpcF09XCInRE9XTkxPQUQnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgW2hyZWZdPSdpbWFnZVNyYygpJyBtYXQtaWNvbi1idXR0b24gW2Rvd25sb2FkXT0naW1hZ2VOYW1lJz5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+Y2xvdWRfZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICA8L2E+XG4gICAgICB9XG4gICAgICBAaWYgKCFjb25maWcoKT8uaGlkZURlbGV0ZUJ0bikge1xuICAgICAgICA8YnV0dG9uIGlkPSdkZWxldGUtaW1nJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25SZW1vdmUoKSdcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInUkVNT1ZFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG5cbkBpZiAoc2hvd0VkaXRQYW5lbCgpKSB7XG4gIDxkaXYgaWQ9J3BvcHVwJyBjbGFzcz0ncG9wdXAnPlxuICAgIDxkaXYgY2xhc3M9J3BvcHVwLWNsZWFyJz5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKSc+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbGVhcjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1jb250YWluZXInPlxuICAgICAgPGRpdiBjbGFzcz0naW1hZ2UtaG9sZGVyLWZ1bGwnPlxuICAgICAgICA8aW1nIGlkPSdpbWFnZS1mdWxsJyBbc3JjXT0naW1hZ2VTcmMoKScgYWx0PScnPlxuICAgICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyJyBjbGFzcz0naW1hZ2UtY3JvcHBlcic+XG4gICAgICAgICAgPGRpdiBpZD0naW1hZ2UtY3JvcHBlci1oZWFkZXInPlxuICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9J2NvbnRyb2wtcGFuZWwnPlxuICAgICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdRVUFMSVRZJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz0ncXVhbGl0eS1jb250YWluZXInPlxuICAgICAgICAgIDxtYXQtc2xpZGVyIG5nRGVmYXVsdENvbnRyb2wgW2NvbG9yXT0nY29sb3InIGNsYXNzPSd3LTEwMCBtdy0xMDAnIChjaGFuZ2UpPSdvbkNoYW5nZVF1YWxpdHkoKSdcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4XT0nMTAwJyBbbWluXT0nMCcgW3N0ZXBdPScxJyBbZGlzY3JldGVdPSd0cnVlJyBbc2hvd1RpY2tNYXJrc109J3RydWUnPlxuICAgICAgICAgICAgPGlucHV0IG1hdFNsaWRlclRodW1iIFtmb3JtQ29udHJvbF09J3F1YWxpdHknPlxuICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9J2l0ZW0tcGFuZWwnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPSdmdy02MDAnPnt7ICdNQVhfRElNRU5TSU9OUycgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz0nZmxvYXQtcmlnaHQnIFtmb3JtQ29udHJvbF09J21haW50YWluQXNwZWN0UmF0aW8nIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdBU1BFQ1RfUkFUSU8nIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nbWF4LWRpbWVuc2lvbi1jb250YWluZXInPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9J29uQ2hhbmdlU2l6ZSh0cnVlLCBmYWxzZSknIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT0nbWF4V2lkdGgnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdNQVhfSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZVNpemUoZmFsc2UsIHRydWUpJyBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInTUFYX0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPSdtYXhIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnRk9STUFUJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz0nZm9ybWF0cy1zZWxlY3Rpb24nPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy0xMDAgbXctMTAwJyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09J2Zvcm1hdCcgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlRm9ybWF0KCknPlxuICAgICAgICAgICAgICBAZm9yIChmb3JtYXQgb2YgYWxsRm9ybWF0czsgdHJhY2sgZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT0nZm9ybWF0Jz5cbiAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdCB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSdyZWZyZXNoLWNvbnRhaW5lcic+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT0nb25Dcm9wU3RhdGVDaGFuZ2UoKScgW2Zvcm1Db250cm9sXT0nc2hvd0Nyb3AnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxwIGNsYXNzPSdpdGVtLXBhbmVsIGZ3LTYwMCc+e3sgJ0NST1AnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9wPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCAnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0nZmxvYXQtcmlnaHQnIG1hdC1pY29uLWJ1dHRvbiBbY29sb3JdPSdjb2xvcicgKGNsaWNrKT0nb25SZXN0b3JlKCknPlxuICAgICAgICAgICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAoc2hvd0Nyb3AudmFsdWUpIHtcbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2NvbG9yXT0nY29sb3InIChjbGljayk9J29uQ3JvcCgpJz5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChzaG93Q3JvcC52YWx1ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9J2RpbWVuc2lvbi1jb250YWluZXInPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4IG13LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VDcm9wKCknIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCInV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BXaWR0aCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCBtdy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidIRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz0nc2F2ZS1jb250YWluZXInPlxuICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKScgW2NvbG9yXT0nY29sb3InIGNsYXNzPSdzYXZlLWJ1dHRvbic+XG4gICAgICAgICAgICB7eyAnU0FWRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGltYWdlU3JjKCk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9J21hdC1jYXB0aW9uIGltYWdlLWNhcHRpb24nXG4gICAgICAgICAgICAgICBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcbiAgICAgICAgICAgICAgIFtjbGFzcy5mdy02MDBdPScoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgPiAyMDAnPlxuICAgICAgICAgICAgICB7eyBcIlNJWkVcIiB8IGkxOG46IGN1cnJlbnRMYW5ndWFnZSgpIH19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYlxuICAgICAgICAgICAgICAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==
|
|
@@ -12,13 +12,13 @@ export class CalculateSizePipe {
|
|
|
12
12
|
return 0;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
16
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: CalculateSizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
16
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: CalculateSizePipe, name: "calculateSize" });
|
|
17
17
|
}
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: CalculateSizePipe, decorators: [{
|
|
19
19
|
type: Pipe,
|
|
20
20
|
args: [{
|
|
21
21
|
name: 'calculateSize'
|
|
22
22
|
}]
|
|
23
23
|
}] });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLXNpemUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1YWNob3MtaW1hZ2UtcGlja2VyL3NyYy91dGlscy9waXBlcy9jYWxjdWxhdGUtc2l6ZS9jYWxjdWxhdGUtc2l6ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUtwRCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLFNBQVMsQ0FBQyxXQUFtQjtRQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7dUdBWlUsaUJBQWlCO3FHQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBSDdCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGVBQWU7aUJBQ3RCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQFBpcGUoe1xyXG4gIG5hbWU6ICdjYWxjdWxhdGVTaXplJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsY3VsYXRlU2l6ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuXHJcbiAgdHJhbnNmb3JtKGltYWdlTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKCFpbWFnZUxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW1hZ2VMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIE1hdGguY2VpbCgoKDMgLyA0KSAqIGltYWdlTGVuZ3RoKSAvIDEwMjQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -44,13 +44,13 @@ export class I18nPipe {
|
|
|
44
44
|
transform(key, language) {
|
|
45
45
|
return language === 'en' ? this.en?.[key] : this.es?.[key];
|
|
46
46
|
}
|
|
47
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
48
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: I18nPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
48
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: I18nPipe, name: "i18n" });
|
|
49
49
|
}
|
|
50
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: I18nPipe, decorators: [{
|
|
51
51
|
type: Pipe,
|
|
52
52
|
args: [{
|
|
53
53
|
name: 'i18n'
|
|
54
54
|
}]
|
|
55
55
|
}] });
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL3V0aWxzL3BpcGVzL2kxOG4vaTE4bi5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUtwRCxNQUFNLE9BQU8sUUFBUTtJQUNYLEVBQUUsR0FBUTtRQUNoQixjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLFNBQVMsRUFBRSwrQ0FBK0M7UUFDMUQsU0FBUyxFQUFFLFdBQVc7UUFDdEIsaUJBQWlCLEVBQUUsdUJBQXVCO1FBQzFDLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsYUFBYSxFQUFFLGVBQWU7UUFDOUIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsSUFBSSxFQUFFLE1BQU07UUFDWixjQUFjLEVBQUUsZ0JBQWdCO1FBQ2hDLFlBQVksRUFBRSxjQUFjO1FBQzVCLFlBQVksRUFBRSxlQUFlO1FBQzdCLGFBQWEsRUFBRSxnQkFBZ0I7UUFDL0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsV0FBVztRQUNyQixTQUFTLEVBQUUsWUFBWTtRQUN2QixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsTUFBTTtLQUNiLENBQUM7SUFFTSxFQUFFLEdBQVE7UUFDaEIsY0FBYyxFQUFFLGlCQUFpQjtRQUNqQyxTQUFTLEVBQUUsZ0RBQWdEO1FBQzNELFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLGlCQUFpQixFQUFFLDBCQUEwQjtRQUM3QyxRQUFRLEVBQUUscUJBQXFCO1FBQy9CLGFBQWEsRUFBRSxrQkFBa0I7UUFDakMsTUFBTSxFQUFFLFVBQVU7UUFDbEIsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPLEVBQUUsU0FBUztRQUNsQixjQUFjLEVBQUUsYUFBYTtRQUM3QixZQUFZLEVBQUUsa0JBQWtCO1FBQ2hDLFlBQVksRUFBRSxZQUFZO1FBQzFCLGFBQWEsRUFBRSxXQUFXO1FBQzFCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLElBQUksRUFBRSxVQUFVO1FBQ2hCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQztJQUVGLFNBQVMsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDckMsT0FBTyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO3VHQTdDVSxRQUFRO3FHQUFSLFFBQVE7OzJGQUFSLFFBQVE7a0JBSHBCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLE1BQU07aUJBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2kxOG4nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJMThuUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIHByaXZhdGUgZW46IGFueSA9IHtcclxuICAgIFVQTE9BRF9BX0lNQUdFOiAnVXBsb2FkIGFuIGltYWdlJyxcclxuICAgIE1VU1RfRURJVDogJ1lvdSBtdXN0IGVkaXQgdGhlIGltYWdlIGluIG9yZGVyIHRvIHJlc2l6ZSBpdCcsXHJcbiAgICBUT09fTEFSR0U6ICd0b28gbGFyZ2UnLFxyXG4gICAgT1BFTl9FRElUT1JfUEFORUw6ICdPcGVuIHRoZSBlZGl0b3IgcGFuZWwnLFxyXG4gICAgRE9XTkxPQUQ6ICdEb3dubG9hZCB0aGUgaW1hZ2UnLFxyXG4gICAgQ09OVFJPTF9QQU5FTDogJ0NvbnRyb2wgUGFuZWwnLFxyXG4gICAgUVVBTElUWTogJ1F1YWxpdHknLFxyXG4gICAgU0FWRTogJ1NhdmUnLFxyXG4gICAgTUFYX0RJTUVOU0lPTlM6ICdNYXggZGltZW5zaW9ucycsXHJcbiAgICBBU1BFQ1RfUkFUSU86ICdBc3BlY3QgcmF0aW8nLFxyXG4gICAgTUFYX1dJRFRIX1BYOiAnbWF4LXdpZHRoKHB4KScsXHJcbiAgICBNQVhfSEVJR0hUX1BYOiAnbWF4LWhlaWdodChweCknLFxyXG4gICAgRk9STUFUOiAnRm9ybWF0JyxcclxuICAgIENST1A6ICdDcm9wJyxcclxuICAgIFdJRFRIX1BYOiAnd2lkdGgocHgpJyxcclxuICAgIEhFSUdIVF9QWDogJ2hlaWdodChweCknLFxyXG4gICAgUkVNT1ZFOiAnUmVtb3ZlJyxcclxuICAgIFNJWkU6ICdTaXplJ1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgZXM6IGFueSA9IHtcclxuICAgIFVQTE9BRF9BX0lNQUdFOiAnU3ViYSB1bmEgaW1hZ2VuJyxcclxuICAgIE1VU1RfRURJVDogJ0RlYmUgZWRpdGFyIGxhIGltYWdlbiBwYXJhIGRpc21pbnVpciBzdSB0YW1hw7FvJyxcclxuICAgIFRPT19MQVJHRTogJ211eSBncmFuZGUnLFxyXG4gICAgT1BFTl9FRElUT1JfUEFORUw6ICdBYnJhIGVsIHBhbmVsIGRlIGVkaWNpw7NuJyxcclxuICAgIERPV05MT0FEOiAnRGVzY2FyZ3VlIGxhIGltYWdlbicsXHJcbiAgICBDT05UUk9MX1BBTkVMOiAnUGFuZWwgZGUgY29udHJvbCcsXHJcbiAgICBSRU1PVkU6ICdFbGltaW5hcicsXHJcbiAgICBTQVZFOiAnR3VhcmRhcicsXHJcbiAgICBRVUFMSVRZOiAnQ2FsaWRhZCcsXHJcbiAgICBNQVhfRElNRU5TSU9OUzogJ0RpbWVuc2lvbmVzJyxcclxuICAgIEFTUEVDVF9SQVRJTzogJ1JlbGFjacOzbi1Bc3BlY3RvJyxcclxuICAgIE1BWF9XSURUSF9QWDogJ21heC4gYW5jaG8nLFxyXG4gICAgTUFYX0hFSUdIVF9QWDogJ21heC4gYWx0bycsXHJcbiAgICBGT1JNQVQ6ICdGb3JtYXRvJyxcclxuICAgIENST1A6ICdSZWNvcnRhcicsXHJcbiAgICBXSURUSF9QWDogJ2FuY2hvKHB4KScsXHJcbiAgICBIRUlHSFRfUFg6ICdhbHR1cmEocHgpJyxcclxuICAgIFNJWkU6ICdUYW1hw7FvJ1xyXG4gIH07XHJcblxyXG4gIHRyYW5zZm9ybShrZXk6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbGFuZ3VhZ2UgPT09ICdlbicgPyB0aGlzLmVuPy5ba2V5XSA6IHRoaXMuZXM/LltrZXldO1xyXG4gIH1cclxufVxyXG4iXX0=
|