@guajiritos/image-picker 0.0.12 → 0.0.13
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.
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, signal, ViewChild, } from '@angular/core';
|
|
2
2
|
import { ResizeObserver } from 'resize-observer';
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
|
-
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|
5
4
|
import { MatIconModule } from '@angular/material/icon';
|
|
6
5
|
import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
|
7
6
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
@@ -12,27 +11,24 @@ import { MatFormFieldModule } from '@angular/material/form-field';
|
|
|
12
11
|
import { MatInputModule } from '@angular/material/input';
|
|
13
12
|
import { MatSelectModule } from '@angular/material/select';
|
|
14
13
|
import { PipesModule } from '../utils/pipes/pipes.module';
|
|
14
|
+
import { NgForOf, NgIf, NgStyle } from '@angular/common';
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/
|
|
17
|
-
import * as i2 from "@angular/material/
|
|
18
|
-
import * as i3 from "
|
|
19
|
-
import * as i4 from "
|
|
20
|
-
import * as i5 from "@angular/material/
|
|
16
|
+
import * as i1 from "@angular/material/tooltip";
|
|
17
|
+
import * as i2 from "@angular/material/icon";
|
|
18
|
+
import * as i3 from "../utils/pipes/i18n/i18n.pipe";
|
|
19
|
+
import * as i4 from "../utils/pipes/calculate-size/calculate-size.pipe";
|
|
20
|
+
import * as i5 from "@angular/material/button";
|
|
21
21
|
import * as i6 from "@angular/material/slider";
|
|
22
|
-
import * as i7 from "@angular/material/
|
|
23
|
-
import * as i8 from "@angular/material/
|
|
24
|
-
import * as i9 from "@angular/
|
|
22
|
+
import * as i7 from "@angular/material/checkbox";
|
|
23
|
+
import * as i8 from "@angular/material/form-field";
|
|
24
|
+
import * as i9 from "@angular/material/input";
|
|
25
25
|
import * as i10 from "@angular/material/select";
|
|
26
26
|
import * as i11 from "@angular/material/core";
|
|
27
|
-
import * as i12 from "
|
|
28
|
-
import * as i13 from "../utils/pipes/calculate-size/calculate-size.pipe";
|
|
27
|
+
import * as i12 from "@angular/forms";
|
|
29
28
|
export class GuajiritosImagePicker {
|
|
30
|
-
constructor() {
|
|
31
|
-
}
|
|
32
29
|
unsubscribeAll$ = new Subject();
|
|
33
30
|
observer = null;
|
|
34
31
|
originImageSrc;
|
|
35
|
-
fileType;
|
|
36
32
|
urlImage;
|
|
37
33
|
lastOriginSrc;
|
|
38
34
|
arrayCopiedImages = [];
|
|
@@ -252,7 +248,6 @@ export class GuajiritosImagePicker {
|
|
|
252
248
|
if (files) {
|
|
253
249
|
const file = files[0];
|
|
254
250
|
this.imageName.set(file?.name?.split('.')[0]);
|
|
255
|
-
this.fileType = file?.type;
|
|
256
251
|
this.urlImage = `data:${file?.type};base64,`;
|
|
257
252
|
this.noEdit.set(false);
|
|
258
253
|
if (files && file) {
|
|
@@ -478,25 +473,27 @@ export class GuajiritosImagePicker {
|
|
|
478
473
|
this.unsubscribeAll$.complete();
|
|
479
474
|
}
|
|
480
475
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
481
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", 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:white!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: "ngmodule", type: BrowserAnimationsModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconAnchor, selector: "a[mat-icon-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { 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: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.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: FormsModule }, { kind: "directive", type: i9.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: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: ReactiveFormsModule }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i12.I18nPipe, name: "i18n" }, { kind: "pipe", type: i13.CalculateSizePipe, name: "calculateSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
476
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", 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:white!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 });
|
|
482
477
|
}
|
|
483
478
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, decorators: [{
|
|
484
479
|
type: Component,
|
|
485
480
|
args: [{ selector: 'guajiritos-image-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
486
|
-
|
|
481
|
+
NgIf,
|
|
482
|
+
NgStyle,
|
|
487
483
|
MatTooltipModule,
|
|
488
484
|
MatIconModule,
|
|
485
|
+
PipesModule,
|
|
489
486
|
MatButtonModule,
|
|
490
|
-
MatCheckboxModule,
|
|
491
487
|
MatSliderModule,
|
|
488
|
+
MatCheckboxModule,
|
|
492
489
|
MatFormFieldModule,
|
|
493
490
|
MatInputModule,
|
|
494
|
-
FormsModule,
|
|
495
491
|
MatSelectModule,
|
|
492
|
+
FormsModule,
|
|
496
493
|
ReactiveFormsModule,
|
|
497
|
-
|
|
494
|
+
NgForOf,
|
|
498
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:white!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"] }]
|
|
499
|
-
}],
|
|
496
|
+
}], propDecorators: { appearance: [{
|
|
500
497
|
type: Input
|
|
501
498
|
}], color: [{
|
|
502
499
|
type: Input
|
|
@@ -514,4 +511,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImpor
|
|
|
514
511
|
}], _config: [{
|
|
515
512
|
type: Input
|
|
516
513
|
}] } });
|
|
517
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FB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b25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlciB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJFbnRyeSc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5cclxuaW1wb3J0IHsgUGlwZXNNb2R1bGUgfSBmcm9tICcuLi91dGlscy9waXBlcy9waXBlcy5tb2R1bGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVBpY2tlckNvbmYge1xyXG4gIHdpZHRoPzogc3RyaW5nO1xyXG4gIGhlaWdodD86IHN0cmluZztcclxuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XHJcbiAgY29tcHJlc3NJbml0aWFsPzogYm9vbGVhbjtcclxuICBsYW5ndWFnZT86IHN0cmluZztcclxuICBoaWRlRGVsZXRlQnRuPzogYm9vbGVhbjtcclxuICBoaWRlRG93bmxvYWRCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVFZGl0QnRuPzogYm9vbGVhbjtcclxuICBoaWRlQWRkQnRuPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUNvbnZlcnRlcklucHV0IHtcclxuICB3aWR0aD86IG51bWJlcjtcclxuICBoZWlnaHQ/OiBudW1iZXI7XHJcbiAgcXVhbGl0eT86IG51bWJlcjtcclxuICBkYXRhVHlwZT86IHN0cmluZztcclxuICBtYWludGFpblJhdGlvPzogYm9vbGVhbjtcclxuICBjaGFuZ2VIZWlnaHQ/OiBib29sZWFuO1xyXG4gIGNoYW5nZVdpZHRoPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSW1hZ2VBbGxvd2VkVHlwZXMgPVxyXG4gICdpbWFnZS8qJ1xyXG4gIHwgJy53ZWJwJ1xyXG4gIHwgJy5wbmcnXHJcbiAgfCAnLndlYnAsIC5qcGcsIC5qcGVnJ1xyXG4gIHwgJy53ZWJwLCAucG5nJ1xyXG4gIHwgJy5qcGcsIC5qcGVnJ1xyXG4gIHwgJy5wbmcsIC5qcGcsIC5qcGVnJ1xyXG4gIHwgJy53ZWJwLCAucG5nLCAuanBnLCAuanBlZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2d1YWppcml0b3MtaW1hZ2UtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIFBpcGVzTW9kdWxlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWppcml0b3NJbWFnZVBpY2tlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIG9yaWdpbkltYWdlU3JjOiBhbnk7XHJcbiAgcHJpdmF0ZSBmaWxlVHlwZTogYW55O1xyXG4gIHByaXZhdGUgdXJsSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxhc3RPcmlnaW5TcmM6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBhcnJheUNvcGllZEltYWdlczogYW55W10gPSBbXTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHV1aWRGaWxlUGlja2VyOiBzdHJpbmcgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDIwKTtcclxuICBwdWJsaWMgcmVhZG9ubHkgYWxsRm9ybWF0czogc3RyaW5nW10gPSBbJ3dlYnAnLCAnanBlZycsICdwbmcnXTtcclxuICBwdWJsaWMgY29uZmlnOiBXcml0YWJsZVNpZ25hbDxJbWFnZVBpY2tlckNvbmY+ID0gc2lnbmFsKHtcclxuICAgIGhlaWdodDogJzI0MHB4JyxcclxuICAgIHdpZHRoOiAnMzIwcHgnLFxyXG4gICAgYm9yZGVyUmFkaXVzOiAnMTZweCcsXHJcbiAgICBjb21wcmVzc0luaXRpYWw6IHRydWUsXHJcbiAgICBsYW5ndWFnZTogJ2VzJyxcclxuICAgIGhpZGVEZWxldGVCdG46IGZhbHNlLFxyXG4gICAgaGlkZURvd25sb2FkQnRuOiBmYWxzZSxcclxuICAgIGhpZGVFZGl0QnRuOiBmYWxzZSxcclxuICAgIGhpZGVBZGRCdG46IGZhbHNlLFxyXG4gIH0pO1xyXG4gIHB1YmxpYyBpbWFnZVNyYzogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbChudWxsKTtcclxuICBwdWJsaWMgc2hvd0Nyb3A6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgbG9hZEltYWdlOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcHVibGljIG5vRWRpdDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBzaG93RWRpdFBhbmVsOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcHVibGljIG1haW50YWluQXNwZWN0UmF0aW86IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogdHJ1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBxdWFsaXR5OiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDcwLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGZvcm1hdDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAnd2VicCcsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgbWF4SGVpZ2h0OiBXcml0YWJsZVNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDIwMDApO1xyXG4gIHB1YmxpYyBtYXhXaWR0aDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgyMDAwKTtcclxuICBwdWJsaWMgY3JvcEhlaWdodDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgY3JvcFdpZHRoOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDE1MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBpbWFnZU5hbWU6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJ2Rvd25sb2FkJyk7XHJcbiAgcHVibGljIGN1cnJlbnRMYW5ndWFnZTogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZXMnKTtcclxuXHJcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSA9ICdvdXRsaW5lJztcclxuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ3ByaW1hcnknO1xyXG4gIEBJbnB1dCgpIGltYWdlc0FsbG93ZWQ6IEltYWdlQWxsb3dlZFR5cGVzID0gJ2ltYWdlLyonO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbWFnZVBpY2tlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBpbWFnZVBpY2tlcjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpICRpbWFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpICRpbWFnZU9yaWdpbmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBASW5wdXQoKSBzZXQgX2ltYWdlU3JjKGltYWdlOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbWFnZSkge1xyXG4gICAgICBsZXQgdHlwZXM6IHN0cmluZ1tdID0gaW1hZ2Uuc3BsaXQoJy4nKTtcclxuICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUodHlwZXNbdHlwZXMubGVuZ3RoIC0gMV0pO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmZvcm1hdC52YWx1ZSB8fCAodGhpcy5mb3JtYXQudmFsdWUgIT09ICdwbmcnICYmIHRoaXMuZm9ybWF0LnZhbHVlICE9PSAnanBlZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICd3ZWJwJykpIHtcclxuICAgICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChpbWFnZSk7XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHRoaXMuaW1hZ2VTcmMpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gaW1hZ2U7XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5vcmlnaW5JbWFnZVNyYyk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQobnVsbCk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBudWxsO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm5vRWRpdC5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IG51bGw7XHJcbiAgICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dChudWxsKTtcclxuICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcclxuICAgICAgdGhpcy5tYXhIZWlnaHQuc2V0KDIwMDApO1xyXG4gICAgICB0aGlzLm1heFdpZHRoLnNldCgyMDAwKTtcclxuICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XHJcbiAgICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKDE1MCk7XHJcbiAgICAgIHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby5zZXRWYWx1ZSh0cnVlKTtcclxuICAgICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgX2NvbmZpZyh2YWx1ZTogSW1hZ2VQaWNrZXJDb25mKSB7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNldCh7XHJcbiAgICAgICAgLi4udGhpcy5jb25maWcoKSxcclxuICAgICAgICAuLi52YWx1ZSxcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVhZGVyTG9hZGVkKHJlYWRlckV2dDogeyB0YXJnZXQ6IHsgcmVzdWx0OiBhbnk7IH07IH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGJpbmFyeVN0cmluZzogc3RyaW5nID0gcmVhZGVyRXZ0LnRhcmdldC5yZXN1bHQ7XHJcbiAgICBjb25zdCBiYXNlNjR0ZXh0U3RyaW5nOiBzdHJpbmcgPSBidG9hKGJpbmFyeVN0cmluZyk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmc7XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcclxuICAgIGlmICh0aGlzLmNvbmZpZygpPy5jb21wcmVzc0luaXRpYWwpIHtcclxuICAgICAgdGhpcy5xdWFsaXR5LnNldFZhbHVlKDcwKTtcclxuICAgICAgY29uc3QgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IDAuNzAsXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nLCBpbnB1dCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQodGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmcpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XHJcbiAgICAgICAgbGFzdEltYWdlOiB0aGlzLmltYWdlU3JjKCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNpemVEYXRhVVJMKGRhdGFzOiBzdHJpbmcsIGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLnNyYyA9IGRhdGFzICsgJyc7XHJcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgICBsZXQgcXVhbGl0eTogbnVtYmVyID0gaW5wdXQ/LnF1YWxpdHkgPz8gMS4wO1xyXG4gICAgICBsZXQgbWFpbnRhaW5SYXRpbzogYm9vbGVhbiA9IGlucHV0Lm1haW50YWluUmF0aW8gIT09IHVuZGVmaW5lZCA/IGlucHV0Lm1haW50YWluUmF0aW8gOiB0cnVlO1xyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjb25zdCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIGxldCByYXRpbzogbnVtYmVyID0gaW1nLndpZHRoIC8gaW1nLmhlaWdodDtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IGlucHV0Py53aWR0aCA/PyBpbWcud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gaW5wdXQ/LmhlaWdodCA/PyBpbWcuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAobWFpbnRhaW5SYXRpbykge1xyXG4gICAgICAgICAgaWYgKGlucHV0LmNoYW5nZUhlaWdodCkge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBoZWlnaHQgKiByYXRpbztcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gd2lkdGggLyByYXRpbztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBpbnB1dD8uZGF0YVR5cGUgPz8gJ3dlYnAnO1xyXG4gICAgICAgIGNvbnN0IGRhdGFVUkk6IHN0cmluZyA9IGNhbnZhcy50b0RhdGFVUkwoYGltYWdlLyR7dHlwZX1gLCBxdWFsaXR5KTtcclxuICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgIGRhdGFVcmk6IGRhdGFVUkksXHJcbiAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfSkudGhlbigoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gZGF0YT8uaGVpZ2h0O1xyXG4gICAgICB0aGlzLm1heFdpZHRoID0gZGF0YT8ud2lkdGg7XHJcbiAgICAgIGlmICh0aGlzLmFycmF5Q29waWVkSW1hZ2VzPy5sZW5ndGggPD0gMjApIHtcclxuICAgICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAgbGFzdEltYWdlOiBkYXRhPy5kYXRhVXJpLFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0LFxyXG4gICAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YS5kYXRhVXJpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhaXQobXM/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbXMgPSBtcyA/PyAxMDAwO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9LCBtcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhZ0VsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBwb3MxOiBudW1iZXIgPSAwLCBwb3MyOiBudW1iZXIgPSAwLCBwb3MzOiBudW1iZXIgPSAwLCBwb3M0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGxldCBlbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkICsgJy1oZWFkZXInKTtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICBlbC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIGVsLm9udG91Y2hzdGFydCA9IGRyYWdNb3VzZURvd247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbGVtZW50Lm9ubW91c2Vkb3duID0gZHJhZ01vdXNlRG93bjtcclxuICAgICAgZWxlbWVudC5vbnRvdWNoc3RhcnQgPSBkcmFnTW91c2VEb3duO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdNb3VzZURvd24oZTogYW55KTogdm9pZCB7XHJcbiAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcclxuICAgICAgZT8ucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBjbG9zZURyYWdFbGVtZW50O1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gY2xvc2VEcmFnRWxlbWVudDtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBlbGVtZW50RHJhZztcclxuICAgICAgZG9jdW1lbnQub250b3VjaG1vdmUgPSBlbGVtZW50RHJhZztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBlbGVtZW50RHJhZyhlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgbGV0IGhvbGRlckltYWdlOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHBvczEgPSBwb3MzIC0gZT8uY2xpZW50WDtcclxuICAgICAgcG9zMiA9IHBvczQgLSBlPy5jbGllbnRZO1xyXG4gICAgICBwb3MzID0gZT8uY2xpZW50WDtcclxuICAgICAgcG9zNCA9IGU/LmNsaWVudFk7XHJcblxyXG4gICAgICBjb25zdCBuZXdUb3A6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0VG9wIC0gcG9zMjtcclxuICAgICAgY29uc3QgbmV3TGVmdDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRMZWZ0IC0gcG9zMTtcclxuICAgICAgY29uc3QgcmVjdEhvbGRlciA9IGhvbGRlckltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCByZWN0RWxlbWVudDogRE9NUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChuZXdUb3AgPj0gcmVjdEhvbGRlci55ICsgOCkge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gTWF0aC5taW4obmV3VG9wLCByZWN0SG9sZGVyLnkgKyByZWN0SG9sZGVyLmhlaWdodCAtIHJlY3RFbGVtZW50LmhlaWdodCAtIDQpICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICBpZiAobmV3TGVmdCA+IHJlY3RIb2xkZXIueCArIDQgJiYgcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCA+IHJlY3RFbGVtZW50LnggKyByZWN0RWxlbWVudC53aWR0aCArIDIpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBNYXRoLm1pbihuZXdMZWZ0LCByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQud2lkdGggLSA0KSArICdweCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbG9zZURyYWdFbGVtZW50KCk6IHZvaWQge1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2hlbmQgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNobW92ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25VcGxvYWQoZXZlbnQ6IHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7IH0pOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmltYWdlUGlja2VyPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRmlsZVNlbGVjdChldnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZXMgPSBldnQ/LnRhcmdldD8uZmlsZXM7XHJcbiAgICBpZiAoZmlsZXMpIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICB0aGlzLmltYWdlTmFtZS5zZXQoZmlsZT8ubmFtZT8uc3BsaXQoJy4nKVswXSk7XHJcbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBmaWxlPy50eXBlO1xyXG4gICAgICB0aGlzLnVybEltYWdlID0gYGRhdGE6JHtmaWxlPy50eXBlfTtiYXNlNjQsYDtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChmaWxlcyAmJiBmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyOiBhbnkgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLmhhbmRsZVJlYWRlckxvYWRlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlRWRpdFBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICBsZXQgaW1hZ2VDcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgICBsZXQgaW1hZ2VGdWxsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUZ1bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVF1YWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXHJcbiAgICAgICAgcXVhbGl0eTogcXVhbGl0eUl0ZW0sXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZUZvcm1hdCgpOiBQcm9taXNlPHZvaWQ+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
|
|
514
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBeUR6RCxNQUFNLE9BQU8scUJBQXFCO0lBQ3hCLGVBQWUsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMvQyxRQUFRLEdBQVEsSUFBSSxDQUFDO0lBQ3JCLGNBQWMsQ0FBTTtJQUNwQixRQUFRLENBQXFCO0lBQzdCLGFBQWEsQ0FBTTtJQUVuQixpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFFdEIsY0FBYyxHQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsVUFBVSxHQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLEdBQW9DLE1BQU0sQ0FBQztRQUN0RCxNQUFNLEVBQUUsT0FBTztRQUNmLEtBQUssRUFBRSxPQUFPO1FBQ2QsWUFBWSxFQUFFLE1BQU07UUFDcEIsZUFBZSxFQUFFLElBQUk7UUFDckIsUUFBUSxFQUFFLElBQUk7UUFDZCxhQUFhLEVBQUUsS0FBSztRQUNwQixlQUFlLEVBQUUsS0FBSztRQUN0QixXQUFXLEVBQUUsS0FBSztRQUNsQixVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDLENBQUM7SUFDSSxRQUFRLEdBQTJCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxRQUFRLEdBQXVCLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLFNBQVMsR0FBNEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELE1BQU0sR0FBNEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELGFBQWEsR0FBNEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELG1CQUFtQixHQUF1QixJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRyxPQUFPLEdBQXVCLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sR0FBdUIsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDeEYsU0FBUyxHQUEyQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsUUFBUSxHQUEyQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsVUFBVSxHQUF1QixJQUFJLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RixTQUFTLEdBQXVCLElBQUksa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLFNBQVMsR0FBMkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELGVBQWUsR0FBMkIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJELFVBQVUsR0FBMkIsU0FBUyxDQUFDO0lBQy9DLEtBQUssR0FBaUIsU0FBUyxDQUFDO0lBQ2hDLGFBQWEsR0FBc0IsU0FBUyxDQUFDO0lBRVQsV0FBVyxDQUF5QjtJQUV2RSxhQUFhLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFDM0QsY0FBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXRFLElBQWEsU0FBUyxDQUFDLEtBQWE7UUFDbEMsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLEtBQUssR0FBYSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRTtnQkFDdkgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDOUI7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELElBQWEsT0FBTyxDQUFDLEtBQXNCO1FBQ3pDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNkLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsR0FBRyxLQUFLO2FBQ1QsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQXdDO1FBQ3ZFLE1BQU0sWUFBWSxHQUFXLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JELE1BQU0sZ0JBQWdCLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUF3QjtnQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDM0IsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsYUFBYSxFQUFFLElBQUk7YUFDcEIsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDdEY7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7YUFDNUIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhLEVBQUUsS0FBMEI7UUFDbkUsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssV0FBVSxPQUFPO1lBQzdDLElBQUksR0FBRyxHQUFxQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLE9BQU8sR0FBVyxLQUFLLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQztZQUM1QyxJQUFJLGFBQWEsR0FBWSxLQUFLLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRTVGLEdBQUcsQ0FBQyxNQUFNLEdBQUc7Z0JBQ1gsTUFBTSxNQUFNLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25FLE1BQU0sR0FBRyxHQUE2QixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLEtBQUssR0FBVyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLElBQUksS0FBSyxHQUFXLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDOUMsSUFBSSxNQUFNLEdBQVcsS0FBSyxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUVqRCxJQUFJLGFBQWEsRUFBRTtvQkFDakIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO3dCQUN0QixNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7d0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO3FCQUN4Qjt5QkFBTTt3QkFDTCxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDckIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUMvQjtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDckIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQ3hCO2dCQUVELEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZELElBQUksSUFBSSxHQUFXLEtBQUssRUFBRSxRQUFRLElBQUksTUFBTSxDQUFDO2dCQUM3QyxNQUFNLE9BQU8sR0FBVyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sQ0FBQztvQkFDTixPQUFPLEVBQUUsT0FBTztvQkFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztvQkFDMUIsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPO29CQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sSUFBSSxDQUFDLEVBQXVCO1FBQ2xDLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQVEsRUFBRTtZQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFvQjtRQUN0QyxJQUFJLElBQUksR0FBVyxDQUFDLEVBQUUsSUFBSSxHQUFXLENBQUMsRUFBRSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBVyxDQUFDLENBQUM7UUFFM0UsSUFBSSxFQUFFLEdBQWdCLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN0RSxJQUFJLEVBQUUsRUFBRTtZQUNOLEVBQUUsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUNwQyxPQUFPLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUVELFNBQVMsYUFBYSxDQUFDLENBQU07WUFDM0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3RCLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUNsQixRQUFRLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7WUFDdkMsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDbkMsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDckMsQ0FBQztRQUVELFNBQVMsV0FBVyxDQUFDLENBQU07WUFDekIsSUFBSSxXQUFXLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3RCxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDdEIsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUN6QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDekIsSUFBSSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7WUFFbEIsTUFBTSxNQUFNLEdBQVcsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQVcsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdkQsTUFBTSxXQUFXLEdBQVksT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0QsSUFBSSxNQUFNLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUN4RztZQUNELElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDeEc7UUFDSCxDQUFDO1FBRUQsU0FBUyxnQkFBZ0I7WUFDdkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDMUIsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDNUIsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDM0IsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTSxRQUFRLENBQUMsS0FBc0M7UUFDcEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxHQUFRO1FBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQ2pDLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV2QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU0sTUFBTSxHQUFRLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsWUFBWSxjQUFjLEVBQUU7WUFDM0MsSUFBSSxZQUFZLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRSxJQUFJLFNBQVMsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlO1FBQzFCLE1BQU0sV0FBVyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRTNDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJO1lBQ0YsTUFBTSxLQUFLLEdBQXdCO2dCQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQzNCLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7YUFDOUMsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRTNDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJO1lBQ0YsSUFBSSxLQUFLLEdBQXdCO2dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQzNCLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7YUFDOUMsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBaUIsRUFBRSxZQUFrQjtRQUM3RCxJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUUzQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckIsSUFBSTtZQUNGLElBQUksS0FBSyxHQUF3QjtnQkFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUMzQixPQUFPLEVBQUUsV0FBVztnQkFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO2dCQUM3QyxZQUFZLEVBQUUsWUFBWTtnQkFDMUIsV0FBVyxFQUFFLFdBQVc7YUFDekIsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsTUFBTSxPQUFPLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsTUFBTSxPQUFPLEdBQWdCLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEUsTUFBTSxTQUFTLEdBQWdCLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxXQUFXLEdBQVcsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBRTNFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLE9BQThCLEVBQVEsRUFBRTtnQkFDMUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQTBCLEVBQVEsRUFBRTtvQkFDbkQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ3hCLE1BQU0sY0FBYyxHQUFnQixRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUM3RSxNQUFNLFdBQVcsR0FBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFFdkUsTUFBTSxVQUFVLEdBQVksV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQ2hFLE1BQU0sV0FBVyxHQUFZLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO3dCQUVwRSxNQUFNLFFBQVEsR0FBVyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzdFLE1BQU0sU0FBUyxHQUFXLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFL0Usb0VBQW9FO3dCQUNwRSxNQUFNLFNBQVMsR0FBVyxjQUFjLENBQUMsV0FBVyxDQUFDO3dCQUNyRCxNQUFNLFVBQVUsR0FBVyxjQUFjLENBQUMsWUFBWSxDQUFDO3dCQUV2RCwyR0FBMkc7d0JBQzNHLElBQUksUUFBUSxHQUFXLFNBQVMsQ0FBQzt3QkFDakMsSUFBSSxTQUFTLEdBQVcsVUFBVSxDQUFDO3dCQUVuQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7NEJBQ2xDLElBQUksU0FBUyxHQUFHLFVBQVUsR0FBRyxXQUFXLEVBQUU7Z0NBQ3hDLFNBQVMsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDOzZCQUNyQztpQ0FBTTtnQ0FDTCxRQUFRLEdBQUcsVUFBVSxHQUFHLFdBQVcsQ0FBQzs2QkFDckM7eUJBQ0Y7d0JBRUQsdUVBQXVFO3dCQUN2RSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ3hDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFFM0MseURBQXlEO3dCQUN6RCxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLFFBQVEsSUFBSSxDQUFDO3dCQUM3QyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDO3dCQUUvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFFN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUU7NEJBQ25DLElBQUksVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0NBQ3RCLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs2QkFDdEQ7NEJBQ0QsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO3lCQUN4RDtxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsWUFBWSxjQUFjLEVBQUU7Z0JBQzNDLE1BQU0sY0FBYyxHQUFnQixRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNLFdBQVcsR0FBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQVU7UUFDdEIsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RSxNQUFNLFdBQVcsR0FBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RSxNQUFNLFdBQVcsR0FBWSxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3RCxNQUFNLGNBQWMsR0FBWSxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBc0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQVEsRUFBRTtZQUNwQyxJQUFJLEdBQUcsR0FBb0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxJQUFJLEtBQUssR0FBcUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsTUFBTSxHQUFHLEdBQVMsRUFBRTtnQkFDeEIsSUFBSSxLQUFLLEdBQVcsS0FBSyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO2dCQUN6RCxJQUFJLFFBQVEsR0FBVyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDakQsSUFBSSxTQUFTLEdBQVcsV0FBVyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUN4QixNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztnQkFDMUIsR0FBRyxFQUFFLFNBQVMsQ0FDWixLQUFLLEVBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDcEUsUUFBUSxFQUNSLFNBQVMsRUFDVCxDQUFDLEVBQ0QsQ0FBQyxFQUNELFFBQVEsRUFDUixTQUFTLENBQ1YsQ0FBQztnQkFFRixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUM7WUFDRixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBaUIsRUFBUSxFQUFFO2dCQUMxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixDQUFDLENBQUM7UUFDSixDQUFDLENBQUM7YUFDQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQVEsRUFBRTtZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFRLEVBQUU7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO1lBQ2pDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7dUdBamZVLHFCQUFxQjsyRkFBckIscUJBQXFCLGdaQ3BGbEMsczRPQW1KQSxzd01EL0VJLElBQUksNkZBQ0osT0FBTywwRUFDUCxnQkFBZ0IsOEhBQ2hCLGFBQWEsbUxBQ2IsV0FBVyxzSkFDWCxlQUFlLHlsQkFDZixlQUFlLGthQUNmLGlCQUFpQixnTEFDakIsa0JBQWtCLDBTQUNsQixjQUFjLDBXQUNkLGVBQWUseVRBQ2YsV0FBVyw0b0NBQ1gsbUJBQW1CLG1OQUNuQixPQUFPOzsyRkFHRSxxQkFBcUI7a0JBdkJqQyxTQUFTOytCQUNFLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsSUFBSTt3QkFDSixPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixPQUFPO3FCQUNSOzhCQXVDUSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUV1QyxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWpDLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFTSxTQUFTO3NCQUFyQixLQUFLO2dCQW1DTyxPQUFPO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlciB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJFbnRyeSc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuXHJcbmltcG9ydCB7IFBpcGVzTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvcGlwZXMvcGlwZXMubW9kdWxlJztcclxuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlUGlja2VyQ29uZiB7XHJcbiAgd2lkdGg/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
|
|
@@ -2,26 +2,25 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Pipe, NgModule, signal, EventEmitter, Component, ChangeDetectionStrategy, Input, ViewChild, Output } from '@angular/core';
|
|
3
3
|
import { ResizeObserver } from 'resize-observer';
|
|
4
4
|
import { Subject } from 'rxjs';
|
|
5
|
-
import
|
|
6
|
-
import * as i3 from '@angular/material/icon';
|
|
5
|
+
import * as i2 from '@angular/material/icon';
|
|
7
6
|
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
-
import * as
|
|
7
|
+
import * as i12 from '@angular/forms';
|
|
9
8
|
import { UntypedFormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
10
|
-
import * as
|
|
9
|
+
import * as i1 from '@angular/material/tooltip';
|
|
11
10
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
|
-
import * as
|
|
11
|
+
import * as i7 from '@angular/material/checkbox';
|
|
13
12
|
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
14
13
|
import * as i6 from '@angular/material/slider';
|
|
15
14
|
import { MatSliderModule } from '@angular/material/slider';
|
|
16
|
-
import * as
|
|
15
|
+
import * as i5 from '@angular/material/button';
|
|
17
16
|
import { MatButtonModule } from '@angular/material/button';
|
|
18
|
-
import * as
|
|
17
|
+
import * as i8 from '@angular/material/form-field';
|
|
19
18
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
20
|
-
import * as
|
|
19
|
+
import * as i9 from '@angular/material/input';
|
|
21
20
|
import { MatInputModule } from '@angular/material/input';
|
|
22
21
|
import * as i10 from '@angular/material/select';
|
|
23
22
|
import { MatSelectModule } from '@angular/material/select';
|
|
24
|
-
import
|
|
23
|
+
import { NgIf, NgStyle, NgForOf } from '@angular/common';
|
|
25
24
|
import * as i11 from '@angular/material/core';
|
|
26
25
|
|
|
27
26
|
class I18nPipe {
|
|
@@ -114,12 +113,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImpor
|
|
|
114
113
|
}] });
|
|
115
114
|
|
|
116
115
|
class GuajiritosImagePicker {
|
|
117
|
-
constructor() {
|
|
118
|
-
}
|
|
119
116
|
unsubscribeAll$ = new Subject();
|
|
120
117
|
observer = null;
|
|
121
118
|
originImageSrc;
|
|
122
|
-
fileType;
|
|
123
119
|
urlImage;
|
|
124
120
|
lastOriginSrc;
|
|
125
121
|
arrayCopiedImages = [];
|
|
@@ -339,7 +335,6 @@ class GuajiritosImagePicker {
|
|
|
339
335
|
if (files) {
|
|
340
336
|
const file = files[0];
|
|
341
337
|
this.imageName.set(file?.name?.split('.')[0]);
|
|
342
|
-
this.fileType = file?.type;
|
|
343
338
|
this.urlImage = `data:${file?.type};base64,`;
|
|
344
339
|
this.noEdit.set(false);
|
|
345
340
|
if (files && file) {
|
|
@@ -565,25 +560,27 @@ class GuajiritosImagePicker {
|
|
|
565
560
|
this.unsubscribeAll$.complete();
|
|
566
561
|
}
|
|
567
562
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
568
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", 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:white!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: "ngmodule", type: BrowserAnimationsModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.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: i4.MatIconAnchor, selector: "a[mat-icon-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { 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: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.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: FormsModule }, { kind: "directive", type: i9.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: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: ReactiveFormsModule }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "pipe", type: CalculateSizePipe, name: "calculateSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
563
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", 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:white!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: I18nPipe, name: "i18n" }, { kind: "pipe", type: 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 });
|
|
569
564
|
}
|
|
570
565
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, decorators: [{
|
|
571
566
|
type: Component,
|
|
572
567
|
args: [{ selector: 'guajiritos-image-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
573
|
-
|
|
568
|
+
NgIf,
|
|
569
|
+
NgStyle,
|
|
574
570
|
MatTooltipModule,
|
|
575
571
|
MatIconModule,
|
|
572
|
+
PipesModule,
|
|
576
573
|
MatButtonModule,
|
|
577
|
-
MatCheckboxModule,
|
|
578
574
|
MatSliderModule,
|
|
575
|
+
MatCheckboxModule,
|
|
579
576
|
MatFormFieldModule,
|
|
580
577
|
MatInputModule,
|
|
581
|
-
FormsModule,
|
|
582
578
|
MatSelectModule,
|
|
579
|
+
FormsModule,
|
|
583
580
|
ReactiveFormsModule,
|
|
584
|
-
|
|
581
|
+
NgForOf,
|
|
585
582
|
], 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:white!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"] }]
|
|
586
|
-
}],
|
|
583
|
+
}], propDecorators: { appearance: [{
|
|
587
584
|
type: Input
|
|
588
585
|
}], color: [{
|
|
589
586
|
type: Input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guajiritos-image-picker.mjs","sources":["../../../projects/guachos-image-picker/src/utils/pipes/i18n/i18n.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/calculate-size/calculate-size.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/pipes.module.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.html","../../../projects/guachos-image-picker/src/public-api.ts","../../../projects/guachos-image-picker/src/guajiritos-image-picker.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'i18n'\r\n})\r\nexport class I18nPipe implements PipeTransform {\r\n private en: any = {\r\n UPLOAD_A_IMAGE: 'Upload an image',\r\n MUST_EDIT: 'You must edit the image in order to resize it',\r\n TOO_LARGE: 'too large',\r\n OPEN_EDITOR_PANEL: 'Open the editor panel',\r\n DOWNLOAD: 'Download the image',\r\n CONTROL_PANEL: 'Control Panel',\r\n QUALITY: 'Quality',\r\n SAVE: 'Save',\r\n MAX_DIMENSIONS: 'Max dimensions',\r\n ASPECT_RATIO: 'Aspect ratio',\r\n MAX_WIDTH_PX: 'max-width(px)',\r\n MAX_HEIGHT_PX: 'max-height(px)',\r\n FORMAT: 'Format',\r\n CROP: 'Crop',\r\n WIDTH_PX: 'width(px)',\r\n HEIGHT_PX: 'height(px)',\r\n REMOVE: 'Remove',\r\n SIZE: 'Size'\r\n };\r\n\r\n private es: any = {\r\n UPLOAD_A_IMAGE: 'Suba una imagen',\r\n MUST_EDIT: 'Debe editar la imagen para disminuir su tamaño',\r\n TOO_LARGE: 'muy grande',\r\n OPEN_EDITOR_PANEL: 'Abra el panel de edición',\r\n DOWNLOAD: 'Descargue la imagen',\r\n CONTROL_PANEL: 'Panel de control',\r\n REMOVE: 'Eliminar',\r\n SAVE: 'Guardar',\r\n QUALITY: 'Calidad',\r\n MAX_DIMENSIONS: 'Dimensiones',\r\n ASPECT_RATIO: 'Relación-Aspecto',\r\n MAX_WIDTH_PX: 'max. ancho',\r\n MAX_HEIGHT_PX: 'max. alto',\r\n FORMAT: 'Formato',\r\n CROP: 'Recortar',\r\n WIDTH_PX: 'ancho(px)',\r\n HEIGHT_PX: 'altura(px)',\r\n SIZE: 'Tamaño'\r\n };\r\n\r\n transform(key: string, language: string): string {\r\n return language === 'en' ? this.en?.[key] : this.es?.[key];\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'calculateSize'\r\n})\r\nexport class CalculateSizePipe implements PipeTransform {\r\n\r\n transform(imageLength: number): number {\r\n if (!imageLength) {\r\n return 0;\r\n }\r\n\r\n if (imageLength) {\r\n return Math.ceil(((3 / 4) * imageLength) / 1024);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { I18nPipe } from './i18n/i18n.pipe';\r\nimport { CalculateSizePipe } from './calculate-size/calculate-size.pipe';\r\n\r\n\r\n@NgModule({\r\n declarations: [I18nPipe, CalculateSizePipe],\r\n exports: [I18nPipe, CalculateSizePipe],\r\n})\r\nexport class PipesModule { }\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n ViewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { ResizeObserver } from 'resize-observer';\r\nimport { Subject } from 'rxjs';\r\nimport { ResizeObserverEntry } from 'resize-observer/lib/ResizeObserverEntry';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport { PipesModule } from '../utils/pipes/pipes.module';\r\n\r\nexport interface ImagePickerConf {\r\n width?: string;\r\n height?: string;\r\n borderRadius?: string;\r\n compressInitial?: boolean;\r\n language?: string;\r\n hideDeleteBtn?: boolean;\r\n hideDownloadBtn?: boolean;\r\n hideEditBtn?: boolean;\r\n hideAddBtn?: boolean;\r\n}\r\n\r\nexport interface ImageConverterInput {\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n dataType?: string;\r\n maintainRatio?: boolean;\r\n changeHeight?: boolean;\r\n changeWidth?: boolean;\r\n}\r\n\r\nexport type ImageAllowedTypes =\r\n 'image/*'\r\n | '.webp'\r\n | '.png'\r\n | '.webp, .jpg, .jpeg'\r\n | '.webp, .png'\r\n | '.jpg, .jpeg'\r\n | '.png, .jpg, .jpeg'\r\n | '.webp, .png, .jpg, .jpeg';\r\n\r\n@Component({\r\n selector: 'guajiritos-image-picker',\r\n templateUrl: './guachos-image-picker.component.html',\r\n styleUrls: ['./guachos-image-picker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n BrowserAnimationsModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatSliderModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n FormsModule,\r\n MatSelectModule,\r\n ReactiveFormsModule,\r\n PipesModule\r\n ],\r\n})\r\nexport class GuajiritosImagePicker implements OnDestroy {\r\n constructor() {\r\n }\r\n\r\n private unsubscribeAll$: Subject<void> = new Subject();\r\n private observer: any = null;\r\n private originImageSrc: any;\r\n private fileType: any;\r\n private urlImage: string | undefined;\r\n private lastOriginSrc: any;\r\n\r\n private arrayCopiedImages: any[] = [];\r\n\r\n public readonly uuidFilePicker: string = Date.now().toString(20);\r\n public readonly allFormats: string[] = ['webp', 'jpeg', 'png'];\r\n public config: WritableSignal<ImagePickerConf> = signal({\r\n height: '240px',\r\n width: '320px',\r\n borderRadius: '16px',\r\n compressInitial: true,\r\n language: 'es',\r\n hideDeleteBtn: false,\r\n hideDownloadBtn: false,\r\n hideEditBtn: false,\r\n hideAddBtn: false,\r\n });\r\n public imageSrc: WritableSignal<string> = signal(null);\r\n public showCrop: UntypedFormControl = new UntypedFormControl({ value: false, disabled: false });\r\n public loadImage: WritableSignal<boolean> = signal(false);\r\n public noEdit: WritableSignal<boolean> = signal(false);\r\n public showEditPanel: WritableSignal<boolean> = signal(false);\r\n public maintainAspectRatio: UntypedFormControl = new UntypedFormControl({ value: true, disabled: false });\r\n public quality: UntypedFormControl = new UntypedFormControl({ value: 70, disabled: false });\r\n public format: UntypedFormControl = new UntypedFormControl({ value: 'webp', disabled: false });\r\n public maxHeight: WritableSignal<number> = signal(2000);\r\n public maxWidth: WritableSignal<number> = signal(2000);\r\n public cropHeight: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public cropWidth: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public imageName: WritableSignal<string> = signal('download');\r\n public currentLanguage: WritableSignal<string> = signal('es');\r\n\r\n @Input() appearance: MatFormFieldAppearance = 'outline';\r\n @Input() color: ThemePalette = 'primary';\r\n @Input() imagesAllowed: ImageAllowedTypes = 'image/*';\r\n\r\n @ViewChild('imagePicker', { static: false }) imagePicker: ElementRef | undefined;\r\n\r\n @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Input() set _imageSrc(image: string) {\r\n if (image) {\r\n let types: string[] = image.split('.');\r\n this.format.setValue(types[types.length - 1]);\r\n\r\n if (!this.format.value || (this.format.value !== 'png' && this.format.value !== 'jpeg' && this.format.value !== 'webp')) {\r\n this.format.setValue('jpeg');\r\n }\r\n\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc);\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(true);\r\n } else {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.noEdit.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n }\r\n }\r\n\r\n @Input() set _config(value: ImagePickerConf) {\r\n if (value && value.constructor == Object) {\r\n this.config.set({\r\n ...this.config(),\r\n ...value,\r\n })\r\n }\r\n }\r\n\r\n private async handleReaderLoaded(readerEvt: { target: { result: any; }; }): Promise<void> {\r\n const binaryString: string = readerEvt.target.result;\r\n const base64textString: string = btoa(binaryString);\r\n this.originImageSrc = this.urlImage + base64textString;\r\n this.lastOriginSrc = this.urlImage + base64textString;\r\n if (this.config()?.compressInitial) {\r\n this.quality.setValue(70);\r\n const input: ImageConverterInput = {\r\n dataType: this.format.value,\r\n quality: 0.70,\r\n maintainRatio: true,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.urlImage + base64textString, input));\r\n } else {\r\n this.imageSrc.set(this.urlImage + base64textString);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push({\r\n lastImage: this.imageSrc(),\r\n width: this.maxWidth(),\r\n height: this.maxHeight(),\r\n quality: this.quality.value,\r\n });\r\n this.$imageOriginal.next(this.imageSrc());\r\n }\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n }\r\n\r\n private async resizeDataURL(datas: string, input: ImageConverterInput): Promise<any> {\r\n return await new Promise(async function(resolve): Promise<void> {\r\n let img: HTMLImageElement = document.createElement('img');\r\n img.src = datas + '';\r\n img.crossOrigin = 'Anonymous';\r\n let quality: number = input?.quality ?? 1.0;\r\n let maintainRatio: boolean = input.maintainRatio !== undefined ? input.maintainRatio : true;\r\n\r\n img.onload = function(): void {\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\r\n let ratio: number = img.width / img.height;\r\n let width: number = input?.width ?? img.width;\r\n let height: number = input?.height ?? img.height;\r\n\r\n if (maintainRatio) {\r\n if (input.changeHeight) {\r\n canvas.width = height * ratio;\r\n canvas.height = height;\r\n } else {\r\n canvas.width = width;\r\n canvas.height = width / ratio;\r\n }\r\n } else {\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n\r\n ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n let type: string = input?.dataType ?? 'webp';\r\n const dataURI: string = canvas.toDataURL(`image/${type}`, quality);\r\n resolve({\r\n dataUri: dataURI,\r\n width: canvas.width,\r\n height: canvas.height,\r\n });\r\n };\r\n }).then((data: any) => {\r\n this.maxHeight = data?.height;\r\n this.maxWidth = data?.width;\r\n if (this.arrayCopiedImages?.length <= 20) {\r\n this.arrayCopiedImages.push({\r\n lastImage: data?.dataUri,\r\n width: this.maxWidth,\r\n height: this.maxHeight,\r\n quality: this.quality.value,\r\n });\r\n }\r\n\r\n return data.dataUri;\r\n });\r\n }\r\n\r\n private wait(ms?: number | undefined): Promise<any> {\r\n ms = ms ?? 1000;\r\n return new Promise((resolve): void => {\r\n setTimeout(() => {\r\n return resolve(true);\r\n }, ms);\r\n });\r\n }\r\n\r\n private dragElement(element: HTMLElement): void {\r\n let pos1: number = 0, pos2: number = 0, pos3: number = 0, pos4: number = 0;\r\n\r\n let el: HTMLElement = document.getElementById(element.id + '-header');\r\n if (el) {\r\n el.onmousedown = dragMouseDown;\r\n el.ontouchstart = dragMouseDown;\r\n } else {\r\n element.onmousedown = dragMouseDown;\r\n element.ontouchstart = dragMouseDown;\r\n }\r\n\r\n function dragMouseDown(e: any): void {\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n document.onmouseup = closeDragElement;\r\n document.ontouchend = closeDragElement;\r\n document.onmousemove = elementDrag;\r\n document.ontouchmove = elementDrag;\r\n }\r\n\r\n function elementDrag(e: any): void {\r\n let holderImage: any = document.getElementById('image-full');\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos1 = pos3 - e?.clientX;\r\n pos2 = pos4 - e?.clientY;\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n\r\n const newTop: number = element.offsetTop - pos2;\r\n const newLeft: number = element.offsetLeft - pos1;\r\n const rectHolder = holderImage.getBoundingClientRect();\r\n const rectElement: DOMRect = element.getBoundingClientRect();\r\n if (newTop >= rectHolder.y + 8) {\r\n element.style.top = Math.min(newTop, rectHolder.y + rectHolder.height - rectElement.height - 4) + 'px';\r\n }\r\n if (newLeft > rectHolder.x + 4 && rectHolder.x + rectHolder.width > rectElement.x + rectElement.width + 2) {\r\n element.style.left = Math.min(newLeft, rectHolder.x + rectHolder.width - rectElement.width - 4) + 'px';\r\n }\r\n }\r\n\r\n function closeDragElement(): void {\r\n document.onmouseup = null;\r\n document.onmousemove = null;\r\n document.ontouchend = null;\r\n document.ontouchmove = null;\r\n }\r\n }\r\n\r\n public onUpload(event: { preventDefault: () => void; }): void {\r\n event.preventDefault();\r\n this.imagePicker?.nativeElement.click();\r\n }\r\n\r\n public handleFileSelect(evt: any): void {\r\n const files = evt?.target?.files;\r\n if (files) {\r\n const file = files[0];\r\n this.imageName.set(file?.name?.split('.')[0]);\r\n this.fileType = file?.type;\r\n this.urlImage = `data:${file?.type};base64,`;\r\n this.noEdit.set(false);\r\n\r\n if (files && file) {\r\n const reader: any = new FileReader();\r\n reader.onload = this.handleReaderLoaded.bind(this);\r\n reader.readAsBinaryString(file);\r\n }\r\n }\r\n }\r\n\r\n public onCloseEditPanel(): void {\r\n if (this.observer instanceof ResizeObserver) {\r\n let imageCropper: any = document.getElementById('image-cropper');\r\n let imageFull: any = document.getElementById('image-full');\r\n this.observer.unobserve(imageCropper);\r\n this.observer.unobserve(imageFull);\r\n }\r\n this.showCrop.setValue(false);\r\n this.showEditPanel.set(false);\r\n }\r\n\r\n public async onChangeQuality(): Promise<void> {\r\n const qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n const input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeFormat(): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeSize(changeWidth?: any, changeHeight?: any): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(500);\r\n\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n changeHeight: changeHeight,\r\n changeWidth: changeWidth,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public onChangeCrop(): void {\r\n const cropper: any = document.getElementById('image-cropper');\r\n cropper.style.width = this.cropWidth.value + 'px';\r\n cropper.style.height = this.cropHeight.value + 'px';\r\n }\r\n\r\n public onCropStateChange(): void {\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const fullImage: HTMLElement = document.getElementById('image-full');\r\n const aspectRatio: number = fullImage.offsetWidth / fullImage.offsetHeight;\r\n\r\n if (this.showCrop.value) {\r\n cropper.style.opacity = '1.0';\r\n this.dragElement(cropper);\r\n this.observer = new ResizeObserver((entries: ResizeObserverEntry[]): void => {\r\n entries.forEach((entry: ResizeObserverEntry): void => {\r\n if (this.showEditPanel()) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n\r\n const rectHolder: DOMRect = elementFull.getBoundingClientRect();\r\n const rectElement: DOMRect = elementCropper.getBoundingClientRect();\r\n\r\n const maxWidth: number = rectHolder.x + rectHolder.width - rectElement.x - 4;\r\n const maxHeight: number = rectHolder.y + rectHolder.height - rectElement.y - 4;\r\n\r\n // Obtener el tamaño del área de recorte seleccionada por el usuario\r\n const cropWidth: number = elementCropper.offsetWidth;\r\n const cropHeight: number = elementCropper.offsetHeight;\r\n\r\n // Calcular el ancho y el alto del área de recorte manteniendo la relación de aspecto de la imagen original\r\n let newWidth: number = cropWidth;\r\n let newHeight: number = cropHeight;\r\n\r\n if (this.maintainAspectRatio.value) {\r\n if (cropWidth / cropHeight > aspectRatio) {\r\n newHeight = cropWidth / aspectRatio;\r\n } else {\r\n newWidth = cropHeight * aspectRatio;\r\n }\r\n }\r\n\r\n // Ajustar el ancho y el alto del área de recorte si supera los límites\r\n newWidth = Math.min(newWidth, maxWidth);\r\n newHeight = Math.min(newHeight, maxHeight);\r\n\r\n // Establecer el tamaño y la posición del área de recorte\r\n elementCropper.style.width = `${newWidth}px`;\r\n elementCropper.style.height = `${newHeight}px`;\r\n\r\n this.cropWidth.setValue(rectElement.width);\r\n this.cropHeight.setValue(rectElement.height);\r\n\r\n if (entry.target.id == 'image-full') {\r\n if (rectHolder.top > 0) {\r\n elementCropper.style.top = rectHolder.top + 4 + 'px';\r\n }\r\n elementCropper.style.left = rectHolder.left + 4 + 'px';\r\n }\r\n }\r\n });\r\n });\r\n this.observer.observe(document.getElementById('image-cropper'));\r\n this.observer.observe(document.getElementById('image-full'));\r\n } else {\r\n cropper.style.opacity = '0.0';\r\n if (this.observer instanceof ResizeObserver) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n this.observer.unobserve(elementCropper);\r\n this.observer.unobserve(elementFull);\r\n }\r\n }\r\n }\r\n\r\n public onCrop(type?: any): void {\r\n type = type ?? this.format.value;\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n const rectCropper: DOMRect = cropper.getBoundingClientRect();\r\n const dataHolderRect: DOMRect = elementFull.getBoundingClientRect();\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n new Promise((resolve, reject): void => {\r\n let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\r\n let image: HTMLImageElement = new Image();\r\n image.src = this.imageSrc();\r\n image.onload = (): void => {\r\n let ratio: number = image.height / dataHolderRect.height;\r\n let newWidth: number = rectCropper.width * ratio;\r\n let newHeight: number = rectCropper.height * ratio;\r\n canvas.width = newWidth;\r\n canvas.height = newHeight;\r\n ctx?.drawImage(\r\n image,\r\n Math.abs(rectCropper.x * ratio) - Math.abs(dataHolderRect.x * ratio),\r\n Math.abs(rectCropper.y * ratio) - Math.abs(dataHolderRect.y * ratio),\r\n newWidth,\r\n newHeight,\r\n 0,\r\n 0,\r\n newWidth,\r\n newHeight,\r\n );\r\n\r\n resolve(canvas.toDataURL(`image/${type}`, this.quality.value));\r\n };\r\n image.onerror = (e: string | Event): void => {\r\n reject(e);\r\n };\r\n })\r\n .then((dataUri: any): void => {\r\n this.imageSrc.set(dataUri);\r\n this.showCrop.setValue(false);\r\n this.onCropStateChange();\r\n this.maxWidth.set(canvas?.width);\r\n this.maxHeight.set(canvas?.height);\r\n this.lastOriginSrc = this.originImageSrc + '';\r\n this.originImageSrc = dataUri;\r\n this.$imageChanged.next(this.imageSrc());\r\n })\r\n .catch((e): void => {\r\n console.log(e);\r\n });\r\n }\r\n\r\n public onRestore(): void {\r\n if (this.arrayCopiedImages.length) {\r\n let lastState = this.arrayCopiedImages.pop();\r\n this.imageSrc.set(lastState.lastImage);\r\n this.maxWidth.set(lastState.width);\r\n this.maxHeight.set(lastState.height);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n } else {\r\n this.imageSrc.set(this.lastOriginSrc);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n }\r\n\r\n this.$imageChanged.next(this.imageSrc());\r\n }\r\n\r\n public onRemove(): void {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.$imageChanged.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n this.noEdit.set(false);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unsubscribeAll$.next();\r\n this.unsubscribeAll$.complete();\r\n }\r\n}\r\n","<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","/*\r\n * Public API Surface of guachos-image-picker\r\n */\r\n\r\nexport * from './lib/guachos-image-picker.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i12.I18nPipe","i13.CalculateSizePipe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guajiritos-image-picker.mjs","sources":["../../../projects/guachos-image-picker/src/utils/pipes/i18n/i18n.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/calculate-size/calculate-size.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/pipes.module.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.html","../../../projects/guachos-image-picker/src/public-api.ts","../../../projects/guachos-image-picker/src/guajiritos-image-picker.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'i18n'\r\n})\r\nexport class I18nPipe implements PipeTransform {\r\n private en: any = {\r\n UPLOAD_A_IMAGE: 'Upload an image',\r\n MUST_EDIT: 'You must edit the image in order to resize it',\r\n TOO_LARGE: 'too large',\r\n OPEN_EDITOR_PANEL: 'Open the editor panel',\r\n DOWNLOAD: 'Download the image',\r\n CONTROL_PANEL: 'Control Panel',\r\n QUALITY: 'Quality',\r\n SAVE: 'Save',\r\n MAX_DIMENSIONS: 'Max dimensions',\r\n ASPECT_RATIO: 'Aspect ratio',\r\n MAX_WIDTH_PX: 'max-width(px)',\r\n MAX_HEIGHT_PX: 'max-height(px)',\r\n FORMAT: 'Format',\r\n CROP: 'Crop',\r\n WIDTH_PX: 'width(px)',\r\n HEIGHT_PX: 'height(px)',\r\n REMOVE: 'Remove',\r\n SIZE: 'Size'\r\n };\r\n\r\n private es: any = {\r\n UPLOAD_A_IMAGE: 'Suba una imagen',\r\n MUST_EDIT: 'Debe editar la imagen para disminuir su tamaño',\r\n TOO_LARGE: 'muy grande',\r\n OPEN_EDITOR_PANEL: 'Abra el panel de edición',\r\n DOWNLOAD: 'Descargue la imagen',\r\n CONTROL_PANEL: 'Panel de control',\r\n REMOVE: 'Eliminar',\r\n SAVE: 'Guardar',\r\n QUALITY: 'Calidad',\r\n MAX_DIMENSIONS: 'Dimensiones',\r\n ASPECT_RATIO: 'Relación-Aspecto',\r\n MAX_WIDTH_PX: 'max. ancho',\r\n MAX_HEIGHT_PX: 'max. alto',\r\n FORMAT: 'Formato',\r\n CROP: 'Recortar',\r\n WIDTH_PX: 'ancho(px)',\r\n HEIGHT_PX: 'altura(px)',\r\n SIZE: 'Tamaño'\r\n };\r\n\r\n transform(key: string, language: string): string {\r\n return language === 'en' ? this.en?.[key] : this.es?.[key];\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'calculateSize'\r\n})\r\nexport class CalculateSizePipe implements PipeTransform {\r\n\r\n transform(imageLength: number): number {\r\n if (!imageLength) {\r\n return 0;\r\n }\r\n\r\n if (imageLength) {\r\n return Math.ceil(((3 / 4) * imageLength) / 1024);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { I18nPipe } from './i18n/i18n.pipe';\r\nimport { CalculateSizePipe } from './calculate-size/calculate-size.pipe';\r\n\r\n\r\n@NgModule({\r\n declarations: [I18nPipe, CalculateSizePipe],\r\n exports: [I18nPipe, CalculateSizePipe],\r\n})\r\nexport class PipesModule { }\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n ViewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { ResizeObserver } from 'resize-observer';\r\nimport { Subject } from 'rxjs';\r\nimport { ResizeObserverEntry } from 'resize-observer/lib/ResizeObserverEntry';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport { PipesModule } from '../utils/pipes/pipes.module';\r\nimport { NgForOf, NgIf, NgStyle } from '@angular/common';\r\n\r\nexport interface ImagePickerConf {\r\n width?: string;\r\n height?: string;\r\n borderRadius?: string;\r\n compressInitial?: boolean;\r\n language?: string;\r\n hideDeleteBtn?: boolean;\r\n hideDownloadBtn?: boolean;\r\n hideEditBtn?: boolean;\r\n hideAddBtn?: boolean;\r\n}\r\n\r\nexport interface ImageConverterInput {\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n dataType?: string;\r\n maintainRatio?: boolean;\r\n changeHeight?: boolean;\r\n changeWidth?: boolean;\r\n}\r\n\r\nexport type ImageAllowedTypes =\r\n 'image/*'\r\n | '.webp'\r\n | '.png'\r\n | '.webp, .jpg, .jpeg'\r\n | '.webp, .png'\r\n | '.jpg, .jpeg'\r\n | '.png, .jpg, .jpeg'\r\n | '.webp, .png, .jpg, .jpeg';\r\n\r\n@Component({\r\n selector: 'guajiritos-image-picker',\r\n templateUrl: './guachos-image-picker.component.html',\r\n styleUrls: ['./guachos-image-picker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n NgIf,\r\n NgStyle,\r\n MatTooltipModule,\r\n MatIconModule,\r\n PipesModule,\r\n MatButtonModule,\r\n MatSliderModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgForOf,\r\n ],\r\n})\r\nexport class GuajiritosImagePicker implements OnDestroy {\r\n private unsubscribeAll$: Subject<void> = new Subject();\r\n private observer: any = null;\r\n private originImageSrc: any;\r\n private urlImage: string | undefined;\r\n private lastOriginSrc: any;\r\n\r\n private arrayCopiedImages: any[] = [];\r\n\r\n public readonly uuidFilePicker: string = Date.now().toString(20);\r\n public readonly allFormats: string[] = ['webp', 'jpeg', 'png'];\r\n public config: WritableSignal<ImagePickerConf> = signal({\r\n height: '240px',\r\n width: '320px',\r\n borderRadius: '16px',\r\n compressInitial: true,\r\n language: 'es',\r\n hideDeleteBtn: false,\r\n hideDownloadBtn: false,\r\n hideEditBtn: false,\r\n hideAddBtn: false,\r\n });\r\n public imageSrc: WritableSignal<string> = signal(null);\r\n public showCrop: UntypedFormControl = new UntypedFormControl({ value: false, disabled: false });\r\n public loadImage: WritableSignal<boolean> = signal(false);\r\n public noEdit: WritableSignal<boolean> = signal(false);\r\n public showEditPanel: WritableSignal<boolean> = signal(false);\r\n public maintainAspectRatio: UntypedFormControl = new UntypedFormControl({ value: true, disabled: false });\r\n public quality: UntypedFormControl = new UntypedFormControl({ value: 70, disabled: false });\r\n public format: UntypedFormControl = new UntypedFormControl({ value: 'webp', disabled: false });\r\n public maxHeight: WritableSignal<number> = signal(2000);\r\n public maxWidth: WritableSignal<number> = signal(2000);\r\n public cropHeight: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public cropWidth: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public imageName: WritableSignal<string> = signal('download');\r\n public currentLanguage: WritableSignal<string> = signal('es');\r\n\r\n @Input() appearance: MatFormFieldAppearance = 'outline';\r\n @Input() color: ThemePalette = 'primary';\r\n @Input() imagesAllowed: ImageAllowedTypes = 'image/*';\r\n\r\n @ViewChild('imagePicker', { static: false }) imagePicker: ElementRef | undefined;\r\n\r\n @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Input() set _imageSrc(image: string) {\r\n if (image) {\r\n let types: string[] = image.split('.');\r\n this.format.setValue(types[types.length - 1]);\r\n\r\n if (!this.format.value || (this.format.value !== 'png' && this.format.value !== 'jpeg' && this.format.value !== 'webp')) {\r\n this.format.setValue('jpeg');\r\n }\r\n\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc);\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(true);\r\n } else {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.noEdit.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n }\r\n }\r\n\r\n @Input() set _config(value: ImagePickerConf) {\r\n if (value && value.constructor == Object) {\r\n this.config.set({\r\n ...this.config(),\r\n ...value,\r\n })\r\n }\r\n }\r\n\r\n private async handleReaderLoaded(readerEvt: { target: { result: any; }; }): Promise<void> {\r\n const binaryString: string = readerEvt.target.result;\r\n const base64textString: string = btoa(binaryString);\r\n this.originImageSrc = this.urlImage + base64textString;\r\n this.lastOriginSrc = this.urlImage + base64textString;\r\n if (this.config()?.compressInitial) {\r\n this.quality.setValue(70);\r\n const input: ImageConverterInput = {\r\n dataType: this.format.value,\r\n quality: 0.70,\r\n maintainRatio: true,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.urlImage + base64textString, input));\r\n } else {\r\n this.imageSrc.set(this.urlImage + base64textString);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push({\r\n lastImage: this.imageSrc(),\r\n width: this.maxWidth(),\r\n height: this.maxHeight(),\r\n quality: this.quality.value,\r\n });\r\n this.$imageOriginal.next(this.imageSrc());\r\n }\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n }\r\n\r\n private async resizeDataURL(datas: string, input: ImageConverterInput): Promise<any> {\r\n return await new Promise(async function(resolve): Promise<void> {\r\n let img: HTMLImageElement = document.createElement('img');\r\n img.src = datas + '';\r\n img.crossOrigin = 'Anonymous';\r\n let quality: number = input?.quality ?? 1.0;\r\n let maintainRatio: boolean = input.maintainRatio !== undefined ? input.maintainRatio : true;\r\n\r\n img.onload = function(): void {\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\r\n let ratio: number = img.width / img.height;\r\n let width: number = input?.width ?? img.width;\r\n let height: number = input?.height ?? img.height;\r\n\r\n if (maintainRatio) {\r\n if (input.changeHeight) {\r\n canvas.width = height * ratio;\r\n canvas.height = height;\r\n } else {\r\n canvas.width = width;\r\n canvas.height = width / ratio;\r\n }\r\n } else {\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n\r\n ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n let type: string = input?.dataType ?? 'webp';\r\n const dataURI: string = canvas.toDataURL(`image/${type}`, quality);\r\n resolve({\r\n dataUri: dataURI,\r\n width: canvas.width,\r\n height: canvas.height,\r\n });\r\n };\r\n }).then((data: any) => {\r\n this.maxHeight = data?.height;\r\n this.maxWidth = data?.width;\r\n if (this.arrayCopiedImages?.length <= 20) {\r\n this.arrayCopiedImages.push({\r\n lastImage: data?.dataUri,\r\n width: this.maxWidth,\r\n height: this.maxHeight,\r\n quality: this.quality.value,\r\n });\r\n }\r\n\r\n return data.dataUri;\r\n });\r\n }\r\n\r\n private wait(ms?: number | undefined): Promise<any> {\r\n ms = ms ?? 1000;\r\n return new Promise((resolve): void => {\r\n setTimeout(() => {\r\n return resolve(true);\r\n }, ms);\r\n });\r\n }\r\n\r\n private dragElement(element: HTMLElement): void {\r\n let pos1: number = 0, pos2: number = 0, pos3: number = 0, pos4: number = 0;\r\n\r\n let el: HTMLElement = document.getElementById(element.id + '-header');\r\n if (el) {\r\n el.onmousedown = dragMouseDown;\r\n el.ontouchstart = dragMouseDown;\r\n } else {\r\n element.onmousedown = dragMouseDown;\r\n element.ontouchstart = dragMouseDown;\r\n }\r\n\r\n function dragMouseDown(e: any): void {\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n document.onmouseup = closeDragElement;\r\n document.ontouchend = closeDragElement;\r\n document.onmousemove = elementDrag;\r\n document.ontouchmove = elementDrag;\r\n }\r\n\r\n function elementDrag(e: any): void {\r\n let holderImage: any = document.getElementById('image-full');\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos1 = pos3 - e?.clientX;\r\n pos2 = pos4 - e?.clientY;\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n\r\n const newTop: number = element.offsetTop - pos2;\r\n const newLeft: number = element.offsetLeft - pos1;\r\n const rectHolder = holderImage.getBoundingClientRect();\r\n const rectElement: DOMRect = element.getBoundingClientRect();\r\n if (newTop >= rectHolder.y + 8) {\r\n element.style.top = Math.min(newTop, rectHolder.y + rectHolder.height - rectElement.height - 4) + 'px';\r\n }\r\n if (newLeft > rectHolder.x + 4 && rectHolder.x + rectHolder.width > rectElement.x + rectElement.width + 2) {\r\n element.style.left = Math.min(newLeft, rectHolder.x + rectHolder.width - rectElement.width - 4) + 'px';\r\n }\r\n }\r\n\r\n function closeDragElement(): void {\r\n document.onmouseup = null;\r\n document.onmousemove = null;\r\n document.ontouchend = null;\r\n document.ontouchmove = null;\r\n }\r\n }\r\n\r\n public onUpload(event: { preventDefault: () => void; }): void {\r\n event.preventDefault();\r\n this.imagePicker?.nativeElement.click();\r\n }\r\n\r\n public handleFileSelect(evt: any): void {\r\n const files = evt?.target?.files;\r\n if (files) {\r\n const file = files[0];\r\n this.imageName.set(file?.name?.split('.')[0]);\r\n this.urlImage = `data:${file?.type};base64,`;\r\n this.noEdit.set(false);\r\n\r\n if (files && file) {\r\n const reader: any = new FileReader();\r\n reader.onload = this.handleReaderLoaded.bind(this);\r\n reader.readAsBinaryString(file);\r\n }\r\n }\r\n }\r\n\r\n public onCloseEditPanel(): void {\r\n if (this.observer instanceof ResizeObserver) {\r\n let imageCropper: any = document.getElementById('image-cropper');\r\n let imageFull: any = document.getElementById('image-full');\r\n this.observer.unobserve(imageCropper);\r\n this.observer.unobserve(imageFull);\r\n }\r\n this.showCrop.setValue(false);\r\n this.showEditPanel.set(false);\r\n }\r\n\r\n public async onChangeQuality(): Promise<void> {\r\n const qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n const input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeFormat(): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeSize(changeWidth?: any, changeHeight?: any): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(500);\r\n\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n changeHeight: changeHeight,\r\n changeWidth: changeWidth,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public onChangeCrop(): void {\r\n const cropper: any = document.getElementById('image-cropper');\r\n cropper.style.width = this.cropWidth.value + 'px';\r\n cropper.style.height = this.cropHeight.value + 'px';\r\n }\r\n\r\n public onCropStateChange(): void {\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const fullImage: HTMLElement = document.getElementById('image-full');\r\n const aspectRatio: number = fullImage.offsetWidth / fullImage.offsetHeight;\r\n\r\n if (this.showCrop.value) {\r\n cropper.style.opacity = '1.0';\r\n this.dragElement(cropper);\r\n this.observer = new ResizeObserver((entries: ResizeObserverEntry[]): void => {\r\n entries.forEach((entry: ResizeObserverEntry): void => {\r\n if (this.showEditPanel()) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n\r\n const rectHolder: DOMRect = elementFull.getBoundingClientRect();\r\n const rectElement: DOMRect = elementCropper.getBoundingClientRect();\r\n\r\n const maxWidth: number = rectHolder.x + rectHolder.width - rectElement.x - 4;\r\n const maxHeight: number = rectHolder.y + rectHolder.height - rectElement.y - 4;\r\n\r\n // Obtener el tamaño del área de recorte seleccionada por el usuario\r\n const cropWidth: number = elementCropper.offsetWidth;\r\n const cropHeight: number = elementCropper.offsetHeight;\r\n\r\n // Calcular el ancho y el alto del área de recorte manteniendo la relación de aspecto de la imagen original\r\n let newWidth: number = cropWidth;\r\n let newHeight: number = cropHeight;\r\n\r\n if (this.maintainAspectRatio.value) {\r\n if (cropWidth / cropHeight > aspectRatio) {\r\n newHeight = cropWidth / aspectRatio;\r\n } else {\r\n newWidth = cropHeight * aspectRatio;\r\n }\r\n }\r\n\r\n // Ajustar el ancho y el alto del área de recorte si supera los límites\r\n newWidth = Math.min(newWidth, maxWidth);\r\n newHeight = Math.min(newHeight, maxHeight);\r\n\r\n // Establecer el tamaño y la posición del área de recorte\r\n elementCropper.style.width = `${newWidth}px`;\r\n elementCropper.style.height = `${newHeight}px`;\r\n\r\n this.cropWidth.setValue(rectElement.width);\r\n this.cropHeight.setValue(rectElement.height);\r\n\r\n if (entry.target.id == 'image-full') {\r\n if (rectHolder.top > 0) {\r\n elementCropper.style.top = rectHolder.top + 4 + 'px';\r\n }\r\n elementCropper.style.left = rectHolder.left + 4 + 'px';\r\n }\r\n }\r\n });\r\n });\r\n this.observer.observe(document.getElementById('image-cropper'));\r\n this.observer.observe(document.getElementById('image-full'));\r\n } else {\r\n cropper.style.opacity = '0.0';\r\n if (this.observer instanceof ResizeObserver) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n this.observer.unobserve(elementCropper);\r\n this.observer.unobserve(elementFull);\r\n }\r\n }\r\n }\r\n\r\n public onCrop(type?: any): void {\r\n type = type ?? this.format.value;\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n const rectCropper: DOMRect = cropper.getBoundingClientRect();\r\n const dataHolderRect: DOMRect = elementFull.getBoundingClientRect();\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n new Promise((resolve, reject): void => {\r\n let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\r\n let image: HTMLImageElement = new Image();\r\n image.src = this.imageSrc();\r\n image.onload = (): void => {\r\n let ratio: number = image.height / dataHolderRect.height;\r\n let newWidth: number = rectCropper.width * ratio;\r\n let newHeight: number = rectCropper.height * ratio;\r\n canvas.width = newWidth;\r\n canvas.height = newHeight;\r\n ctx?.drawImage(\r\n image,\r\n Math.abs(rectCropper.x * ratio) - Math.abs(dataHolderRect.x * ratio),\r\n Math.abs(rectCropper.y * ratio) - Math.abs(dataHolderRect.y * ratio),\r\n newWidth,\r\n newHeight,\r\n 0,\r\n 0,\r\n newWidth,\r\n newHeight,\r\n );\r\n\r\n resolve(canvas.toDataURL(`image/${type}`, this.quality.value));\r\n };\r\n image.onerror = (e: string | Event): void => {\r\n reject(e);\r\n };\r\n })\r\n .then((dataUri: any): void => {\r\n this.imageSrc.set(dataUri);\r\n this.showCrop.setValue(false);\r\n this.onCropStateChange();\r\n this.maxWidth.set(canvas?.width);\r\n this.maxHeight.set(canvas?.height);\r\n this.lastOriginSrc = this.originImageSrc + '';\r\n this.originImageSrc = dataUri;\r\n this.$imageChanged.next(this.imageSrc());\r\n })\r\n .catch((e): void => {\r\n console.log(e);\r\n });\r\n }\r\n\r\n public onRestore(): void {\r\n if (this.arrayCopiedImages.length) {\r\n let lastState = this.arrayCopiedImages.pop();\r\n this.imageSrc.set(lastState.lastImage);\r\n this.maxWidth.set(lastState.width);\r\n this.maxHeight.set(lastState.height);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n } else {\r\n this.imageSrc.set(this.lastOriginSrc);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n }\r\n\r\n this.$imageChanged.next(this.imageSrc());\r\n }\r\n\r\n public onRemove(): void {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.$imageChanged.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n this.noEdit.set(false);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unsubscribeAll$.next();\r\n this.unsubscribeAll$.complete();\r\n }\r\n}\r\n","<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","/*\r\n * Public API Surface of guachos-image-picker\r\n */\r\n\r\nexport * from './lib/guachos-image-picker.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.I18nPipe","i4.CalculateSizePipe"],"mappings":"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"}
|
|
@@ -25,11 +25,9 @@ export interface ImageConverterInput {
|
|
|
25
25
|
}
|
|
26
26
|
export type ImageAllowedTypes = 'image/*' | '.webp' | '.png' | '.webp, .jpg, .jpeg' | '.webp, .png' | '.jpg, .jpeg' | '.png, .jpg, .jpeg' | '.webp, .png, .jpg, .jpeg';
|
|
27
27
|
export declare class GuajiritosImagePicker implements OnDestroy {
|
|
28
|
-
constructor();
|
|
29
28
|
private unsubscribeAll$;
|
|
30
29
|
private observer;
|
|
31
30
|
private originImageSrc;
|
|
32
|
-
private fileType;
|
|
33
31
|
private urlImage;
|
|
34
32
|
private lastOriginSrc;
|
|
35
33
|
private arrayCopiedImages;
|