ng-yunzai-mobile
Version:
1. 修改wechat.micro.ts
292 lines • 25.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: img-cropper/yz-img-cropper/yz-img-cropper.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
import { ToastService } from "ng-zorro-antd-mobile";
import imageCompression from "browser-image-compression";
export class YzImgCropperComponent {
/**
* @param {?} dialogRef
* @param {?} _toast
* @param {?} data
*/
constructor(dialogRef, _toast, data) {
this.dialogRef = dialogRef;
this._toast = _toast;
this.data = data;
this.cropperStyle = {
height: window.innerHeight - 142 + 'px',
width: '100%',
padding: 0,
display: 'flex',
'align-items': 'center',
'justify-content': 'center',
'align-content': 'center',
'flex-wrap': 'wrap'
};
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = null;
this.croppedImage = null;
this.showImg = false;
this.imgInfo = {
width: 0,
height: 0
};
this.canvasRotation = 0;
this.transform = {};
this.scale = 1;
// 图片压缩进度
this.percent = 0;
}
/**
* @return {?}
*/
ngOnInit() {
if (this.data.imgFile) {
this.fileChangeEvent(this.data.imgFile);
}
else {
this._toast.info('请选择上传图片!');
}
}
/**
* @param {?} event
* @return {?}
*/
fileChangeEvent(event) {
if (this.data.fileType == 'FileEvent' || !this.data.fileType) {
this.imageChangedEvent = event;
this.imageBase64 = null;
this.imageBlobFile = null;
}
else if (this.data.fileType == 'Base64') {
this.imageChangedEvent = null;
this.imageBase64 = event;
this.imageBlobFile = null;
}
else if (this.data.fileType == 'BlobFile') {
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = event;
}
}
// 每次裁剪图像时发出
/**
* @param {?} event
* @return {?}
*/
imageCropped(event) {
this.croppedImage = event.base64;
this.imgInfo = event;
}
// 选择错误的文件类型时发出(仅允许png、gif和jpg)
/**
* @return {?}
*/
loadImageFailed() {
this._toast.info(`图片选择失败!`);
}
// 还原图片大小
/**
* @return {?}
*/
resetImage() {
this.scale = 1;
this.canvasRotation = 0;
this.transform = {};
}
// 取消裁剪
/**
* @return {?}
*/
cancelCropper() {
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = null;
this.croppedImage = null;
this.showImg = false;
this.percent = 0;
this.imgInfo = {
width: 0,
height: 0
};
this.dialogRef.close();
this.resetImage();
}
// 裁剪完毕=>压缩图片
/**
* @return {?}
*/
confirmCropper() {
if (!this.croppedImage)
return;
this.dataURLtoFile(this.croppedImage, 'img_name');
}
/**
* @param {?} dataurl
* @param {?} filename
* @return {?}
*/
dataURLtoFile(dataurl, filename) {
/** @type {?} */
const arr = dataurl.split(',');
/** @type {?} */
const mime = arr[0].match(/:(.*?);/)[1];
/** @type {?} */
const bstr = atob(arr[1]);
/** @type {?} */
let n = bstr.length;
/** @type {?} */
const u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
/** @type {?} */
const file = new File([u8arr], filename, { type: mime });
this.compressImage(file);
}
// 图片压缩 https://www.npmjs.com/package/browser-image-compression
/**
* @param {?} imageFile
* @return {?}
*/
compressImage(imageFile) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const options = {
maxSizeMB: this.data.maxSizeMB,
maxWidthOrHeight: this.data.maxWidthOrHeight,
fileType: `image/${this.data.format}`,
useWebWorker: true,
onProgress: (/**
* @param {?} res
* @return {?}
*/
(res) => {
this.percent = res;
})
};
try {
/** @type {?} */
const compressedFile = yield imageCompression(imageFile, options);
this.blobToBase64(compressedFile, (/**
* @param {?} dataurl
* @return {?}
*/
(dataurl) => {
this.dialogRef.close(dataurl);
}));
this.cancelCropper();
}
catch (error) {
console.error('图片压缩失败!');
}
});
}
/**
* @param {?} blob
* @param {?} callback
* @return {?}
*/
blobToBase64(blob, callback) {
/** @type {?} */
const fileReader = new FileReader();
fileReader.onload = (/**
* @param {?} e
* @return {?}
*/
(e) => {
callback(e.target['result']);
});
fileReader.readAsDataURL(blob);
}
}
YzImgCropperComponent.decorators = [
{ type: Component, args: [{
selector: 'yz-img-cropper',
template: "<yz-loading-mask *ngIf=\"percent>0 && percent<100\"></yz-loading-mask>\r\n<div class=\"yz-img-cropper\">\r\n\r\n <image-cropper\r\n *ngIf=\"!showImg\"\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"imageBase64\"\r\n [imageFile]=\"imageBlobFile\"\r\n [containWithinAspectRatio]=\"data.containWithinAspectRatio\"\r\n [maintainAspectRatio]=\"true\"\r\n [format]=\"data.format\"\r\n [onlyScaleDown]=\"true\"\r\n [aspectRatio]=\"data.aspectRatio\"\r\n [imageQuality]=\"data.imageQuality\"\r\n [transform]=\"transform\"\r\n [canvasRotation]=\"canvasRotation\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n [ngStyle]=\"cropperStyle\"\r\n ></image-cropper>\r\n\r\n <!-- \u88C1\u526A\u540E\u7684\u56FE\u7247-->\r\n <div *ngIf=\"showImg\" class=\"yz-img-cropper-img\" [ngStyle]=\"cropperStyle\">\r\n <img [src]=\"croppedImage\"/>\r\n <b>\u50CF\u7D20\uFF1A{{imgInfo.width}}*{{imgInfo.height}}</b>\r\n </div>\r\n\r\n <div class=\"yz-img-cropper-btn\">\r\n <div Button [type]=\"'primary'\" *ngIf=\"!showImg\" (onClick)=\"showImg=true\">\u786E\u5B9A</div>\r\n <!--\u53D6\u6D88\u88C1\u526A-->\r\n <div Button *ngIf=\"!showImg\" (onClick)=\"cancelCropper()\">\u53D6\u6D88</div>\r\n\r\n <div Button [type]=\"'primary'\" *ngIf=\"showImg\" (onClick)=\"confirmCropper()\">\u5B8C\u6210</div>\r\n <!-- \u91CD\u65B0\u88C1\u526A-->\r\n <div Button *ngIf=\"showImg\" (onClick)=\"showImg=false\">\u53D6\u6D88</div>\r\n </div>\r\n\r\n</div>\r\n",
styles: ["::ng-deep .yz-img-cropper-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-img-cropper-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}::ng-deep .yz-img-cropper-btn{margin:16px}::ng-deep .yz-img-cropper-btn .am-button{margin-bottom:16px}.yz-img-cropper-img{width:100%;background:#fff}.yz-img-cropper-img img{display:block;max-width:100%;margin:0 auto 16px}.yz-img-cropper-img b{font-size:16px;text-align:center;display:block}"]
}] }
];
/** @nocollapse */
YzImgCropperComponent.ctorParameters = () => [
{ type: MatDialogRef },
{ type: ToastService },
{ type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
];
if (false) {
/** @type {?} */
YzImgCropperComponent.prototype.cropperStyle;
/** @type {?} */
YzImgCropperComponent.prototype.imageChangedEvent;
/** @type {?} */
YzImgCropperComponent.prototype.imageBase64;
/** @type {?} */
YzImgCropperComponent.prototype.imageBlobFile;
/** @type {?} */
YzImgCropperComponent.prototype.croppedImage;
/** @type {?} */
YzImgCropperComponent.prototype.showImg;
/** @type {?} */
YzImgCropperComponent.prototype.imgInfo;
/** @type {?} */
YzImgCropperComponent.prototype.canvasRotation;
/** @type {?} */
YzImgCropperComponent.prototype.transform;
/** @type {?} */
YzImgCropperComponent.prototype.scale;
/** @type {?} */
YzImgCropperComponent.prototype.percent;
/** @type {?} */
YzImgCropperComponent.prototype.dialogRef;
/**
* @type {?}
* @private
*/
YzImgCropperComponent.prototype._toast;
/** @type {?} */
YzImgCropperComponent.prototype.data;
}
// 组件参数
export class ComponentOption {
constructor() {
// 上传的图片文件
this.fileType = 'FileEvent'; // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile'
// 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile'
this.containWithinAspectRatio = false; // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false
// 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false
this.format = 'png'; // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png
// 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png
this.imageQuality = 92; // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。
// 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。
this.aspectRatio = 1 / 1; // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1
// 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1
this.maxSizeMB = 1; // 裁剪压缩后的图片大小的最大值,默认1MB
// 裁剪压缩后的图片大小的最大值,默认1MB
this.maxWidthOrHeight = 100; // 裁剪压缩后的图片的最大宽度或高度,默认100
}
}
if (false) {
/** @type {?} */
ComponentOption.prototype.imgFile;
/** @type {?} */
ComponentOption.prototype.fileType;
/** @type {?} */
ComponentOption.prototype.containWithinAspectRatio;
/** @type {?} */
ComponentOption.prototype.format;
/** @type {?} */
ComponentOption.prototype.imageQuality;
/** @type {?} */
ComponentOption.prototype.aspectRatio;
/** @type {?} */
ComponentOption.prototype.maxSizeMB;
/** @type {?} */
ComponentOption.prototype.maxWidthOrHeight;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotaW1nLWNyb3BwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBT3pELE1BQU0sT0FBTyxxQkFBcUI7Ozs7OztJQStCaEMsWUFBbUIsU0FBOEMsRUFDN0MsTUFBb0IsRUFDSSxJQUFxQjtRQUY5QyxjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUM3QyxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ0ksU0FBSSxHQUFKLElBQUksQ0FBaUI7UUEvQmpFLGlCQUFZLEdBQUc7WUFDYixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSTtZQUN2QyxLQUFLLEVBQUUsTUFBTTtZQUNiLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE1BQU07WUFDZixhQUFhLEVBQUUsUUFBUTtZQUN2QixpQkFBaUIsRUFBRSxRQUFRO1lBQzNCLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLFdBQVcsRUFBRSxNQUFNO1NBQ3BCLENBQUM7UUFFRixzQkFBaUIsR0FBUSxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDM0Isa0JBQWEsR0FBUyxJQUFJLENBQUM7UUFFM0IsaUJBQVksR0FBUSxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixZQUFPLEdBQUc7WUFDUixLQUFL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QUMsa0VBQWtFOztRQUMzRixpQkFBWSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHlEQUF5RDs7UUFDckYsZ0JBQVcsR0FBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDOztRQUNyRSxjQUFTLEdBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCOztRQUMvQyxxQkFBZ0IsR0FBWSxHQUFHLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsQ0FBQztDQUFBOzs7SUFSQyxrQ0FBYTs7SUFDYixtQ0FBZ0M7O0lBQ2hDLG1EQUEyQzs7SUFDM0MsaUNBQXdCOztJQUN4Qix1Q0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0Isb0NBQXVCOztJQUN2QiwyQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZVRyYW5zZm9ybX0gZnJvbSBcIm5neC1pbWFnZS1jcm9wcGVyXCI7XHJcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWZ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gXCJuZy16b3Jyby1hbnRkLW1vYmlsZVwiO1xyXG5pbXBvcnQgaW1hZ2VDb21wcmVzc2lvbiBmcm9tIFwiYnJvd3Nlci1pbWFnZS1jb21wcmVzc2lvblwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd5ei1pbWctY3JvcHBlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi95ei1pbWctY3JvcHBlci5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBZekltZ0Nyb3BwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjcm9wcGVyU3R5bGUgPSB7XHJcbiAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCAtIDE0MiArICdweCcsXHJcbiAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgcGFkZGluZzogMCxcclxuICAgIGRpc3BsYXk6ICdmbGV4JyxcclxuICAgICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLFxyXG4gICAgJ2p1c3RpZnktY29udGVudCc6ICdjZW50ZXInLFxyXG4gICAgJ2FsaWduLWNvbnRlbnQnOiAnY2VudGVyJyxcclxuICAgICdmbGV4LXdyYXAnOiAnd3JhcCdcclxuICB9O1xyXG5cclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gbnVsbDtcclxuICBpbWFnZUJhc2U2NDogc3RyaW5nID0gbnVsbDtcclxuICBpbWFnZUJsb2JGaWxlOiBCbG9iID0gbnVsbDtcclxuXHJcbiAgY3JvcHBlZEltYWdlOiBhbnkgPSBudWxsO1xyXG4gIHNob3dJbWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpbWdJbmZvID0ge1xyXG4gICAgd2lkdGg6IDAsXHJcbiAgICBoZWlnaHQ6IDBcclxuICB9O1xyXG5cclxuICBjYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIHNjYWxlID0gMTtcclxuXHJcbiAgLy8g5Zu+54mH5Y6L57yp6L+b5bqmXHJcbiAgcGVyY2VudCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxZekltZ0Nyb3BwZXJDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBDb21wb25lbnRPcHRpb24pIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5pbWdGaWxlKSB7XHJcbiAgICAgIHRoaXMuZmlsZUNoYW5nZUV2ZW50KHRoaXMuZGF0YS5pbWdGaWxlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3RvYXN0LmluZm8oJ+ivt+mAieaLqeS4iuS8oOWbvueJh++8gScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsZUNoYW5nZUV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhdGEuZmlsZVR5cGUgPT0gJ0ZpbGVFdmVudCcgfHwgIXRoaXMuZGF0YS5maWxlVHlwZSkge1xyXG4gICAgICB0aGlzLmltYWdlQ2hhbmdlZEV2ZW50ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuZmlsZVR5cGUgPT0gJ0Jhc2U2NCcpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBldmVudDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdCbG9iRmlsZScpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBldmVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOavj+asoeijgeWJquWbvuWDj+aXtuWPkeWHulxyXG4gIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpIHtcclxuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gZXZlbnQuYmFzZTY0O1xyXG4gICAgdGhpcy5pbWdJbmZvID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyDpgInmi6nplJnor6/nmoTmlofku7bnsbvlnovml7blj5Hlh7rvvIjku4XlhYHorrhwbmfjgIFnaWblkoxqcGfvvIlcclxuICBsb2FkSW1hZ2VGYWlsZWQoKSB7XHJcbiAgICB0aGlzLl90b2FzdC5pbmZvKGDlm77niYfpgInmi6nlpLHotKXvvIFgKTtcclxuICB9XHJcblxyXG5cclxuICAvLyDov5jljp/lm77niYflpKflsI9cclxuICByZXNldEltYWdlKCkge1xyXG4gICAgdGhpcy5zY2FsZSA9IDE7XHJcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uID0gMDtcclxuICAgIHRoaXMudHJhbnNmb3JtID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8g5Y+W5raI6KOB5YmqXHJcbiAgY2FuY2VsQ3JvcHBlcigpIHtcclxuICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5pbWFnZUJhc2U2NCA9IG51bGw7XHJcbiAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0ltZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZXJjZW50ID0gMDtcclxuICAgIHRoaXMuaW1nSW5mbyA9IHtcclxuICAgICAgd2lkdGg6IDAsXHJcbiAgICAgIGhlaWdodDogMFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICB0aGlzLnJlc2V0SW1hZ2UoKTtcclxuICB9XHJcblxyXG4gIC8vIOijgeWJquWujOavlT0+5Y6L57yp5Zu+54mHXHJcbiAgY29uZmlybUNyb3BwZXIoKSB7XHJcbiAgICBpZighdGhpcy5jcm9wcGVkSW1hZ2UpIHJldHVybjtcclxuICAgIHRoaXMuZGF0YVVSTHRvRmlsZSh0aGlzLmNyb3BwZWRJbWFnZSwgJ2ltZ19uYW1lJyk7XHJcbiAgfVxyXG5cclxuICBkYXRhVVJMdG9GaWxlKGRhdGF1cmwsIGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBhcnIgPSBkYXRhdXJsLnNwbGl0KCcsJyk7XHJcbiAgICBjb25zdCBtaW1lID0gYXJyWzBdLm1hdGNoKC86KC4qPyk7LylbMV07XHJcbiAgICBjb25zdCBic3RyID0gYXRvYihhcnJbMV0pO1xyXG4gICAgbGV0IG4gPSBic3RyLmxlbmd0aDtcclxuICAgIGNvbnN0IHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XHJcbiAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFt1OGFycl0sIGZpbGVuYW1lLCB7dHlwZTogbWltZX0pO1xyXG4gICAgdGhpcy5jb21wcmVzc0ltYWdlKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Zu+54mH5Y6L57ypIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cclxuICBhc3luYyBjb21wcmVzc0ltYWdlKGltYWdlRmlsZSkge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgbWF4U2l6ZU1COiB0aGlzLmRhdGEubWF4U2l6ZU1CLFxyXG4gICAgICBtYXhXaWR0aE9ySGVpZ2h0OiB0aGlzLmRhdGEubWF4V2lkdGhPckhlaWdodCxcclxuICAgICAgZmlsZVR5cGU6IGBpbWFnZS8ke3RoaXMuZGF0YS5mb3JtYXR9YCxcclxuICAgICAgdXNlV2ViV29ya2VyOiB0cnVlLFxyXG4gICAgICBvblByb2dyZXNzOiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZXJjZW50ID0gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY29tcHJlc3NlZEZpbGUgPSBhd2FpdCBpbWFnZUNvbXByZXNzaW9uKGltYWdlRmlsZSwgb3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuYmxvYlRvQmFzZTY0KGNvbXByZXNzZWRGaWxlLCAoZGF0YXVybCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKGRhdGF1cmwpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jYW5jZWxDcm9wcGVyKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCflm77niYfljovnvKnlpLHotKXvvIEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJsb2JUb0Jhc2U2NChibG9iLCBjYWxsYmFjaykge1xyXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKGUudGFyZ2V0WydyZXN1bHQnXSk7XHJcbiAgICB9O1xyXG4gICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gIH1cclxufVxyXG5cclxuLy8g57uE5Lu25Y+C5pWwXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRPcHRpb24ge1xyXG4gIGltZ0ZpbGU6IGFueTsgLy8g5LiK5Lyg55qE5Zu+54mH5paH5Lu2XHJcbiAgZmlsZVR5cGU/OiBzdHJpbmcgPSAnRmlsZUV2ZW50JzsgLy8g5LiK5Lyg55qE5Zu+54mH5paH5Lu257G75Z6LICdGaWxlRXZlbnQnIHwgJ0Jhc2U2NCcgfCAnQmxvYkZpbGUnXHJcbiAgY29udGFpbldpdGhpbkFzcGVjdFJhdGlvPzogYm9vbGVhbiA9IGZhbHNlOyAvLyDorr7nva7kuLp0cnVl5pe277yM5bCG5Zyo5Zu+5YOP5ZGo5Zu05re75Yqg5aGr5YWF5Lul5L2/5YW26YCC5ZCI57q15qiq5q+ULOm7mOiupGZhbHNlXHJcbiAgZm9ybWF0Pzogc3RyaW5nID0gJ3BuZyc7IC8vIOi+k+WHuuagvOW8j++8iHBuZ+OAgWpwZWfjgIF3ZWJw44CBYm1w44CBaWNv77yJ77yI5bm26Z2e5omA5pyJ5rWP6KeI5Zmo6YO95pSv5oyB5omA5pyJ57G75Z6L77yM5aeL57uI5pSv5oyBcG5n77yM5YW25LuW5Li65Y+v6YCJ77yJ77yM6buY6K6kcG5nXHJcbiAgaW1hZ2VRdWFsaXR5PzogbnVtYmVyID0gOTI7IC8vIOi/meS7hemAgueUqOS6juS9v+eUqGpwZWfmiJZ3ZWJw5L2c5Li66L6T5Ye65qC85byP5pe244CC6L6T5YWl5LuL5LqOMOWSjDEwMOS5i+mXtOeahOaVsOWtl+WwhuWGs+Wumui+k+WHuuWbvuWDj+eahOi0qOmHj++8jOm7mOiupDky44CCXHJcbiAgYXNwZWN0UmF0aW8/OiBudW1iZXIgPSAxIC8gMTsgLy8g5Zu+54mH5a695bqmL+mrmOW6puavlO+8iOS+i+Wmgu+8jOato+aWueW9ouS4ujEvMe+8jDQvM++8jDE2LznigKbvvInvvIzpu5jorqQxLzFcclxuICBtYXhTaXplTUI/OiBudW1iZXIgPSAxOyAvLyDoo4HliarljovnvKnlkI7nmoTlm77niYflpKflsI/nmoTmnIDlpKflgLzvvIzpu5jorqQxTUJcclxuICBtYXhXaWR0aE9ySGVpZ2h0PzogbnVtYmVyID0gMTAwOyAvLyDoo4HliarljovnvKnlkI7nmoTlm77niYfnmoTmnIDlpKflrr3luqbmiJbpq5jluqbvvIzpu5jorqQxMDBcclxufVxyXG4iXX0=