angular-upcrop
Version:
Library with upload and crop feature for Angular 6+
227 lines (223 loc) • 20.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewChild, Inject } from '@angular/core';
import { UpcropUploadComponent } from '../upcrop-upload/upcrop-upload.component';
import { UpcropCropComponent } from '../upcrop-crop/upcrop-crop.component';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
export class UpcropDialogComponent {
/**
* @param {?} dialogRef
* @param {?} data
*/
constructor(dialogRef, data) {
this.dialogRef = dialogRef;
this.data = data;
this.cropData = {};
this.uploadedImages = [];
this.uploader = null;
this.steps = {
total: 2,
options: [{
label: 'Subir imagens',
number: 1,
next: 2,
nextDisabled: () => { return this.step1NextDisabled(); },
nextAction: () => { this.goToStep2(); }
}, {
label: 'Cortar imagens',
number: 2,
previus: 1,
previusAction: () => { this.goToStep1(); }
}],
current: {}
};
}
/**
* @return {?}
*/
ngOnInit() {
//
// Set first step
this.steps.current = this.steps.options[0];
}
/**
* Go to step 1
* @return {?}
*/
goToStep1() {
//
// Reset crop
this.upcropCrop.unsetCropping();
//
// Change to step 1
this.steps.current = this.steps.options[0];
//
// Reset crop
this.upcropCrop.current = false;
this.upcropCrop.currentNumber = false;
}
/**
* Go to step 2
* @return {?}
*/
goToStep2() {
//
// Change to step 2
this.steps.current = this.steps.options[1];
//
// Set crop
this.upcropCrop.setCropping(this.upcropUpload.uploader);
}
/**
* Finish
* @return {?}
*/
finish() {
//
// On complete all files uplaod
this.upcropUpload.uploader.onCompleteAll = () => {
//
// Remove loading
this.upcropCrop.uploading = false;
//
// Close dialog with uploadedImages
this.dialogRef.close(this.uploadedImages);
};
//
// Emit on crop image
this.upcropCrop.emitOnCropImage();
//
// Set crop data in additionalParameter
this.upcropUpload.uploader.options.additionalParameter['cropData'] = this.cropData;
//
// Upload all
this.upcropCrop.uploading = true;
this.upcropUpload.uploader.uploadAll();
}
/**
* Step 1 next button disabled conditions
* @return {?}
*/
step1NextDisabled() {
return !this.upcropUpload.uploader.queue.length;
}
/**
* On crop image event
* @param {?} event
* @return {?}
*/
onCropImage(event) {
/** @type {?} */
const cropData = this.createUrlParams(event.data);
//
// Add crop to uploader file crop data
this.upcropUpload.uploader.queue[event.file].url = this.data.uploadConfig.url + cropData;
}
/**
* On upload image event
* @param {?} event
* @return {?}
*/
onUploadImage(event) {
this.uploadedImages.push(event);
}
/**
* Create url params
* @param {?} obj
* @return {?}
*/
createUrlParams(obj) {
//
// Validate obj
if (!obj)
return '';
/** @type {?} */
const url = '?';
/** @type {?} */
const params = Object.keys(obj).map(function (key) {
return key + '=' + encodeURIComponent(obj[key]);
}).join('&');
return url + params;
}
}
UpcropDialogComponent.decorators = [
{ type: Component, args: [{
selector: 'upcrop-dialog',
template: `<h2 mat-dialog-title class="has-text-danger">
Upload de imagens
<small>com corte</small>
</h2>
<mat-dialog-content>
<!-- STEPS -->
<div steps>
<div steps-content fxLayout="row" fxLayoutAlign="start center">
<button mat-icon-button fxHide.xs [disabled]="!steps.current.previus || (steps.current.previusDisabled && steps.current.previusDisabled())"
(click)="steps.current.previusAction()">
<mat-icon>keyboard_arrow_left</mat-icon>
</button>
<span fxFlex></span>
<h3>Passo
<b>{{steps.current.number}}</b> de
<b>{{steps.total}}</b> /
<span class="has-text-primary">{{steps.current.label}}</span>
</h3>
<span fxFlex></span>
<button mat-icon-button fxHide.xs [disabled]="!steps.current.next || (steps.current.nextDisabled && steps.current.nextDisabled())"
(click)="steps.current.nextAction()">
<mat-icon>keyboard_arrow_right</mat-icon>
</button>
</div>
</div>
<!-- STEP 1 / UPLOAD -->
<div class="step-1" [hidden]="steps.current.number != 1">
<upcrop-upload #upcropUpload [config]="data.uploadConfig" (onUploadImage)="onUploadImage($event)"></upcrop-upload>
</div>
<!-- STEP 2 / CROP -->
<div class="step-2" [hidden]="steps.current.number != 2">
<upcrop-crop #upcropCrop [config]="data.cropConfig" (onCropImage)="onCropImage($event)"></upcrop-crop>
</div>
</mat-dialog-content>
<mat-dialog-actions *ngIf="steps.current.number == 1">
<button mat-button mat-dialog-close>Fechar</button>
<button mat-button color="primary" [disabled]="!upcropUpload.uploader.queue.length" (click)="goToStep2()">Continuar</button>
</mat-dialog-actions>
<mat-dialog-actions *ngIf="steps.current.number == 2">
<button mat-button (click)="goToStep1()">Voltar</button>
<button mat-button color="primary" [fxHide]="upcropCrop.uploader?.queue?.length == (upcropCrop.currentNumber + 1)" (click)="upcropCrop.goToNextCrop()">Próxima imagem</button>
<button mat-button color="primary" [fxHide]="upcropCrop.uploader?.queue?.length > (upcropCrop.currentNumber + 1)" [disabled]="upcropCrop.uploading"
(click)="finish()">Concluir</button>
</mat-dialog-actions>
`,
styles: [`[mat-dialog-title] small{color:#b5b5b5!important;font:400 16px/28px Roboto,"Helvetica Neue",sans-serif!important;margin:0 0 16px!important}[steps]{margin:0 -24px 16px;padding-top:16px;padding-bottom:16px;background-color:rgba(0,0,0,.04)}[steps] .has-text-primary{color:#3f51b5!important}[mat-dialog-title] .has-text-danger{color:#f44336!important}`]
},] },
];
/** @nocollapse */
UpcropDialogComponent.ctorParameters = () => [
{ type: MatDialogRef },
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
];
UpcropDialogComponent.propDecorators = {
upcropUpload: [{ type: ViewChild, args: ['upcropUpload',] }],
upcropCrop: [{ type: ViewChild, args: ['upcropCrop',] }]
};
if (false) {
/** @type {?} */
UpcropDialogComponent.prototype.upcropUpload;
/** @type {?} */
UpcropDialogComponent.prototype.upcropCrop;
/** @type {?} */
UpcropDialogComponent.prototype.cropData;
/** @type {?} */
UpcropDialogComponent.prototype.uploadedImages;
/** @type {?} */
UpcropDialogComponent.prototype.uploader;
/** @type {?} */
UpcropDialogComponent.prototype.steps;
/** @type {?} */
UpcropDialogComponent.prototype.dialogRef;
/** @type {?} */
UpcropDialogComponent.prototype.data;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXVwY3JvcC8iLCJzb3VyY2VzIjpbImxpYi91cGNyb3AtZGlhbG9nL3VwY3JvcC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXNEbEUsTUFBTTs7Ozs7SUF5QkYsWUFDVyxXQUN5QixJQUFTO1FBRGxDLGNBQVMsR0FBVCxTQUFTO1FBQ2dCLFNBQUksR0FBSixJQUFJLENBQUs7d0JBdEIzQixFQUFFOzhCQUNJLEVBQUU7d0JBQ0gsSUFBSTtxQkFDUDtZQUNoQixLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxlQUFlO29CQUN0QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxJQUFJLEVBQUUsQ0FBQztvQkFDUCxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUU7b0JBQ3hELFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRTtpQkFDMUMsRUFBRTtvQkFDQyxLQUFLLEVBQUUsZ0JBQWdCO29CQUN2QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxPQUFPLEVBQUUsQ0FBQztvQkFDVixhQUFhLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7aUJBQzdDLENBQUM7WUFDRixPQUFP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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStDYjtnQkFDRyxNQUFNLEVBQUUsQ0FBQyw2VkFBNlYsQ0FBQzthQUMxVzs7OztZQXJEUSxZQUFZOzRDQWlGWixNQUFNLFNBQUMsZUFBZTs7OzJCQXpCMUIsU0FBUyxTQUFDLGNBQWM7eUJBQ3hCLFNBQVMsU0FBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVcGNyb3BVcGxvYWRDb21wb25lbnQgfSBmcm9tICcuLi91cGNyb3AtdXBsb2FkL3VwY3JvcC11cGxvYWQuY29tcG9uZW50JztcbmltcG9ydCB7IFVwY3JvcENyb3BDb21wb25lbnQgfSBmcm9tICcuLi91cGNyb3AtY3JvcC91cGNyb3AtY3JvcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBjcm9wLWRpYWxvZycsXG4gICAgdGVtcGxhdGU6IGA8aDIgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cImhhcy10ZXh0LWRhbmdlclwiPlxuICAgIFVwbG9hZCBkZSBpbWFnZW5zXG4gICAgPHNtYWxsPmNvbSBjb3J0ZTwvc21hbGw+XG48L2gyPlxuPG1hdC1kaWFsb2ctY29udGVudD5cblxuICAgIDwhLS0gU1RFUFMgLS0+XG4gICAgPGRpdiBzdGVwcz5cbiAgICAgICAgPGRpdiBzdGVwcy1jb250ZW50IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZnhIaWRlLnhzIFtkaXNhYmxlZF09XCIhc3RlcHMuY3VycmVudC5wcmV2aXVzIHx8IChzdGVwcy5jdXJyZW50LnByZXZpdXNEaXNhYmxlZCAmJiBzdGVwcy5jdXJyZW50LnByZXZpdXNEaXNhYmxlZCgpKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0ZXBzLmN1cnJlbnQucHJldml1c0FjdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBmeEZsZXg+PC9zcGFuPlxuICAgICAgICAgICAgPGgzPlBhc3NvXG4gICAgICAgICAgICAgICAgPGI+e3tzdGVwcy5jdXJyZW50Lm51bWJlcn19PC9iPiBkZVxuICAgICAgICAgICAgICAgIDxiPnt7c3RlcHMudG90YWx9fTwvYj4gL1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtcHJpbWFyeVwiPnt7c3RlcHMuY3VycmVudC5sYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxzcGFuIGZ4RmxleD48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBmeEhpZGUueHMgW2Rpc2FibGVkXT1cIiFzdGVwcy5jdXJyZW50Lm5leHQgfHwgKHN0ZXBzLmN1cnJlbnQubmV4dERpc2FibGVkICYmIHN0ZXBzLmN1cnJlbnQubmV4dERpc2FibGVkKCkpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcHMuY3VycmVudC5uZXh0QWN0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTVEVQIDEgLyBVUExPQUQgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtMVwiIFtoaWRkZW5dPVwic3RlcHMuY3VycmVudC5udW1iZXIgIT0gMVwiPlxuICAgICAgICA8dXBjcm9wLXVwbG9hZCAjdXBjcm9wVXBsb2FkIFtjb25maWddPVwiZGF0YS51cGxvYWRDb25maWdcIiAob25VcGxvYWRJbWFnZSk9XCJvblVwbG9hZEltYWdlKCRldmVudClcIj48L3VwY3JvcC11cGxvYWQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNURVAgMiAvIENST1AgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtMlwiIFtoaWRkZW5dPVwic3RlcHMuY3VycmVudC5udW1iZXIgIT0gMlwiPlxuICAgICAgICA8dXBjcm9wLWNyb3AgI3VwY3JvcENyb3AgW2NvbmZpZ109XCJkYXRhLmNyb3BDb25maWdcIiAob25Dcm9wSW1hZ2UpPVwib25Dcm9wSW1hZ2UoJGV2ZW50KVwiPjwvdXBjcm9wLWNyb3A+XG4gICAgPC9kaXY+XG48L21hdC1kaWFsb2ctY29udGVudD5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgKm5nSWY9XCJzdGVwcy5jdXJyZW50Lm51bWJlciA9PSAxXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+RmVjaGFyPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhdXBjcm9wVXBsb2FkLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aFwiIChjbGljayk9XCJnb1RvU3RlcDIoKVwiPkNvbnRpbnVhcjwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48bWF0LWRpYWxvZy1hY3Rpb25zICpuZ0lmPVwic3RlcHMuY3VycmVudC5udW1iZXIgPT0gMlwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZ29Ub1N0ZXAxKClcIj5Wb2x0YXI8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Z4SGlkZV09XCJ1cGNyb3BDcm9wLnVwbG9hZGVyPy5xdWV1ZT8ubGVuZ3RoID09ICh1cGNyb3BDcm9wLmN1cnJlbnROdW1iZXIgKyAxKVwiIChjbGljayk9XCJ1cGNyb3BDcm9wLmdvVG9OZXh0Q3JvcCgpXCI+UHLDs3hpbWEgaW1hZ2VtPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtmeEhpZGVdPVwidXBjcm9wQ3JvcC51cGxvYWRlcj8ucXVldWU/Lmxlbmd0aCA+ICh1cGNyb3BDcm9wLmN1cnJlbnROdW1iZXIgKyAxKVwiIFtkaXNhYmxlZF09XCJ1cGNyb3BDcm9wLnVwbG9hZGluZ1wiXG4gICAgICAgIChjbGljayk9XCJmaW5pc2goKVwiPkNvbmNsdWlyPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbmAsXG4gICAgc3R5bGVzOiBbYFttYXQtZGlhbG9nLXRpdGxlXSBzbWFsbHtjb2xvcjojYjViNWI1IWltcG9ydGFudDtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmIWltcG9ydGFudDttYXJnaW46MCAwIDE2cHghaW1wb3J0YW50fVtzdGVwc117bWFyZ2luOjAgLTI0cHggMTZweDtwYWRkaW5nLXRvcDoxNnB4O3BhZGRpbmctYm90dG9tOjE2cHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9W3N0ZXBzXSAuaGFzLXRleHQtcHJpbWFyeXtjb2xvcjojM2Y1MWI1IWltcG9ydGFudH1bbWF0LWRpYWxvZy10aXRsZV0gLmhhcy10ZXh0LWRhbmdlcntjb2xvcjojZjQ0MzM2IWltcG9ydGFudH1gXVxufSlcbmV4cG9ydCBjbGFzcyBVcGNyb3BEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQFZpZXdDaGlsZCgndXBjcm9wVXBsb2FkJykgcHVibGljIHVwY3JvcFVwbG9hZDogVXBjcm9wVXBsb2FkQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3VwY3JvcENyb3AnKSBwdWJsaWMgdXBjcm9wQ3JvcDogVXBjcm9wQ3JvcENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBjcm9wRGF0YSA9IHt9O1xuICAgIHB1YmxpYyB1cGxvYWRlZEltYWdlcyA9IFtdO1xuICAgIHB1YmxpYyB1cGxvYWRlcjogYW55ID0gbnVsbDtcbiAgICBwdWJsaWMgc3RlcHM6IGFueSA9IHtcbiAgICAgICAgdG90YWw6IDIsXG4gICAgICAgIG9wdGlvbnM6IFt7XG4gICAgICAgICAgICBsYWJlbDogJ1N1YmlyIGltYWdlbnMnLFxuICAgICAgICAgICAgbnVtYmVyOiAxLFxuICAgICAgICAgICAgbmV4dDogMixcbiAgICAgICAgICAgIG5leHREaXNhYmxlZDogKCkgPT4geyByZXR1cm4gdGhpcy5zdGVwMU5leHREaXNhYmxlZCgpOyB9LFxuICAgICAgICAgICAgbmV4dEFjdGlvbjogKCkgPT4geyB0aGlzLmdvVG9TdGVwMigpOyB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ29ydGFyIGltYWdlbnMnLFxuICAgICAgICAgICAgbnVtYmVyOiAyLFxuICAgICAgICAgICAgcHJldml1czogMSxcbiAgICAgICAgICAgIHByZXZpdXNBY3Rpb246ICgpID0+IHsgdGhpcy5nb1RvU3RlcDEoKTsgfVxuICAgICAgICB9XSxcbiAgICAgICAgY3VycmVudDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVcGNyb3BEaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueVxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgZmlyc3Qgc3RlcFxuICAgICAgICB0aGlzLnN0ZXBzLmN1cnJlbnQgPSB0aGlzLnN0ZXBzLm9wdGlvbnNbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR28gdG8gc3RlcCAxXG4gICAgICovXG4gICAgZ29Ub1N0ZXAxKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJlc2V0IGNyb3BcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLnVuc2V0Q3JvcHBpbmcoKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDaGFuZ2UgdG8gc3RlcCAxXG4gICAgICAgIHRoaXMuc3RlcHMuY3VycmVudCA9IHRoaXMuc3RlcHMub3B0aW9uc1swXTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBSZXNldCBjcm9wXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5jdXJyZW50TnVtYmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR28gdG8gc3RlcCAyXG4gICAgICovXG4gICAgZ29Ub1N0ZXAyKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIENoYW5nZSB0byBzdGVwIDJcbiAgICAgICAgdGhpcy5zdGVwcy5jdXJyZW50ID0gdGhpcy5zdGVwcy5vcHRpb25zWzFdO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCBjcm9wXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5zZXRDcm9wcGluZyh0aGlzLnVwY3JvcFVwbG9hZC51cGxvYWRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIGNvbXBsZXRlIGFsbCBmaWxlcyB1cGxhb2RcbiAgICAgICAgdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIub25Db21wbGV0ZUFsbCA9ICgpID0+IHtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFJlbW92ZSBsb2FkaW5nXG4gICAgICAgICAgICB0aGlzLnVwY3JvcENyb3AudXBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBDbG9zZSBkaWFsb2cgd2l0aCB1cGxvYWRlZEltYWdlc1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy51cGxvYWRlZEltYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICAvLyBFbWl0IG9uIGNyb3AgaW1hZ2VcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLmVtaXRPbkNyb3BJbWFnZSgpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCBjcm9wIGRhdGEgaW4gYWRkaXRpb25hbFBhcmFtZXRlclxuICAgICAgICB0aGlzLnVwY3JvcFVwbG9hZC51cGxvYWRlci5vcHRpb25zLmFkZGl0aW9uYWxQYXJhbWV0ZXJbJ2Nyb3BEYXRhJ10gPSB0aGlzLmNyb3BEYXRhO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFVwbG9hZCBhbGxcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMudXBjcm9wVXBsb2FkLnVwbG9hZGVyLnVwbG9hZEFsbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0ZXAgMSBuZXh0IGJ1dHRvbiBkaXNhYmxlZCBjb25kaXRpb25zXG4gICAgICovXG4gICAgc3RlcDFOZXh0RGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIucXVldWUubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGNyb3AgaW1hZ2UgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBvbkNyb3BJbWFnZShldmVudCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIENyZWF0ZSB1cmwgcGFyYW1zIHdpdGggY3JvcCBkYXRhXG4gICAgICAgIGNvbnN0IGNyb3BEYXRhID0gdGhpcy5jcmVhdGVVcmxQYXJhbXMoZXZlbnQuZGF0YSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWRkIGNyb3AgdG8gdXBsb2FkZXIgZmlsZSBjcm9wIGRhdGFcbiAgICAgICAgdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIucXVldWVbZXZlbnQuZmlsZV0udXJsID0gdGhpcy5kYXRhLnVwbG9hZENvbmZpZy51cmwgKyBjcm9wRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiB1cGxvYWQgaW1hZ2UgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBvblVwbG9hZEltYWdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXMucHVzaChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHVybCBwYXJhbXNcbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICovXG4gICAgY3JlYXRlVXJsUGFyYW1zKG9iaikge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbGlkYXRlIG9ialxuICAgICAgICBpZiAoIW9iaikgcmV0dXJuICcnO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZpcnN0IHBhcmFtXG4gICAgICAgIGNvbnN0IHVybCA9ICc/JztcblxuICAgICAgICAvL1xuICAgICAgICAvLyBHZW5lcmF0ZSB1cmwgcGFyYW1cbiAgICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpba2V5XSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKTtcblxuICAgICAgICByZXR1cm4gdXJsICsgcGFyYW1zO1xuICAgIH1cbn1cbiJdfQ==