ngx-pluto
Version:
215 lines • 19.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, ViewChild, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import Cropper from 'cropperjs';
/**
* 图片剪裁组件
*/
var NpCropper = /** @class */ (function () {
function NpCropper() {
this.cropperOptions = {};
this.export = new EventEmitter();
this.ready = new EventEmitter();
this.isLoading = true;
}
/**
* @return {?}
*/
NpCropper.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* Image loaded
* @param ev
*/
/**
* Image loaded
* @param {?} ev
* @return {?}
*/
NpCropper.prototype.imageLoaded = /**
* Image loaded
* @param {?} ev
* @return {?}
*/
function (ev) {
var _this = this;
// Unset load error state
this.loadError = false;
// Setup image element
/** @type {?} */
var image = (/** @type {?} */ (ev.target));
this.imageElement = image;
// Add crossOrigin?
if (this.cropperOptions.checkCrossOrigin) {
image.crossOrigin = 'anonymous';
}
// Image on ready event
image.addEventListener('ready', (/**
* @return {?}
*/
function () {
// Emit ready
_this.ready.emit(true);
// Unset loading state
_this.isLoading = false;
// Validate cropbox existance
if (_this.cropbox) {
// Set cropbox data
_this.cropper.setCropBoxData(_this.cropbox);
}
}));
// Set crop options
// extend default with custom config
this.cropperOptions = Object.assign({
checkCrossOrigin: true
}, this.cropperOptions);
// Set cropperjs
if (this.cropper) {
this.cropper.destroy();
this.cropper = undefined;
}
this.cropper = new Cropper(image, this.cropperOptions);
};
/**
* Image load error
* @param event
*/
/**
* Image load error
* @param {?} event
* @return {?}
*/
NpCropper.prototype.imageLoadError = /**
* Image load error
* @param {?} event
* @return {?}
*/
function (event) {
// Set load error state
this.loadError = true;
// Unset loading state
this.isLoading = false;
};
/**
* Export canvas
* @param base64
*/
/**
* Export canvas
* @param {?=} base64
* @param {?=} options
* @return {?}
*/
NpCropper.prototype.exportCanvas = /**
* Export canvas
* @param {?=} base64
* @param {?=} options
* @return {?}
*/
function (base64, options) {
var _this = this;
// Get and set image, crop and canvas data
/** @type {?} */
var imageData = this.cropper.getImageData();
/** @type {?} */
var cropData = this.cropper.getCropBoxData();
/** @type {?} */
var canvas = this.cropper.getCroppedCanvas(options);
/** @type {?} */
var data = { imageData: imageData, cropData: cropData, blob: null };
// Create promise to resolve canvas data
/** @type {?} */
var promise = new Promise((/**
* @param {?} resolve
* @return {?}
*/
function (resolve) {
// Validate base64
if (base64) {
canvas.toBlob((/**
* @param {?} blob
* @return {?}
*/
function (blob) { return resolve({ blob: blob, dataUrl: canvas.toDataURL('image/png') }); }));
}
canvas.toBlob((/**
* @param {?} blob
* @return {?}
*/
function (blob) { return resolve({ blob: blob }); }));
}));
// Emit export data when promise is ready
promise.then((/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.export.emit(Object.assign(data, res));
}));
};
NpCropper.decorators = [
{ type: Component, args: [{
selector: "np-cropper",
template: "<!-- CROPPER WRAPPER -->\r\n<div class=\"cropper-wrapper\">\r\n\r\n <!-- LOADING -->\r\n <div class=\"loading-block\" *ngIf=\"isLoading\">\r\n <div class=\"spinner\"></div>\r\n </div>\r\n\r\n <!-- LOAD ERROR -->\r\n <div class=\"alert alert-warning\" *ngIf=\"loadError\">{{ loadImageErrorText }}</div>\r\n\r\n <!-- CROPPER -->\r\n <div class=\"cropper\">\r\n <img #image alt=\"image\" [src]=\"imageUrl\" (load)=\"imageLoaded($event)\" (error)=\"imageLoadError($event)\" />\r\n </div>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
styles: [":host{display:block}.cropper img{max-width:100%;max-height:100%;height:auto}.cropper-wrapper{position:relative;min-height:80px}.cropper-wrapper .loading-block{position:absolute;top:0;left:0;width:100%;height:100%}.cropper-wrapper .loading-block .spinner{width:31px;height:31px;margin:0 auto;border:2px solid rgba(97,100,193,.98);border-radius:50%;border-left-color:transparent;border-right-color:transparent;-webkit-animation:425ms linear infinite cssload-spin;position:absolute;top:calc(50% - 15px);left:calc(50% - 15px);animation:425ms linear infinite cssload-spin}@-webkit-keyframes cssload-spin{to{transform:rotate(360deg)}}@keyframes cssload-spin{to{transform:rotate(360deg)}}/*!\r\n * Cropper.js v1.5.7\r\n * https://fengyuanchen.github.io/cropperjs\r\n *\r\n * Copyright 2015-present Chen Fengyuan\r\n * Released under the MIT license\r\n *\r\n * Date: 2020-05-23T05:22:57.283Z\r\n */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:rgba(51,153,255,.75) solid 1px;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:calc(100% / 3);left:0;top:calc(100% / 3);width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:calc(100% / 3);top:0;width:calc(100% / 3)}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center::after,.cropper-center::before{background-color:#eee;content:' ';display:block;position:absolute}.cropper-center::before{height:1px;left:-3px;top:0;width:7px}.cropper-center::after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se::before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}"]
}] }
];
/** @nocollapse */
NpCropper.ctorParameters = function () { return []; };
NpCropper.propDecorators = {
image: [{ type: ViewChild, args: ['image',] }],
imageUrl: [{ type: Input }],
cropbox: [{ type: Input }],
loadImageErrorText: [{ type: Input }],
cropperOptions: [{ type: Input }],
export: [{ type: Output }],
ready: [{ type: Output }]
};
return NpCropper;
}());
export { NpCropper };
if (false) {
/** @type {?} */
NpCropper.prototype.image;
/** @type {?} */
NpCropper.prototype.imageUrl;
/** @type {?} */
NpCropper.prototype.cropbox;
/** @type {?} */
NpCropper.prototype.loadImageErrorText;
/** @type {?} */
NpCropper.prototype.cropperOptions;
/** @type {?} */
NpCropper.prototype.export;
/** @type {?} */
NpCropper.prototype.ready;
/** @type {?} */
NpCropper.prototype.isLoading;
/** @type {?} */
NpCropper.prototype.cropper;
/** @type {?} */
NpCropper.prototype.imageElement;
/** @type {?} */
NpCropper.prototype.loadError;
}
/**
* @record
*/
export function ImageCropperResult() { }
if (false) {
/** @type {?} */
ImageCropperResult.prototype.imageData;
/** @type {?} */
ImageCropperResult.prototype.cropData;
/** @type {?} */
ImageCropperResult.prototype.blob;
/** @type {?|undefined} */
ImageCropperResult.prototype.dataUrl;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9jcm9wcGVyL2Nyb3BwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUM7Ozs7QUFLaEM7SUF1QkU7UUFWUyxtQkFBYyxHQUFvQixFQUFFLENBQUM7UUFFcEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ2hELFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTlCLGNBQVMsR0FBWSxJQUFJLENBQUM7SUFLakIsQ0FBQzs7OztJQUVqQiw0QkFBUTs7O0lBQVI7SUFDQSxDQUFDO0lBRUQ7OztTQUdLOzs7Ozs7SUFDTCwrQkFBVzs7Ozs7SUFBWCxVQUFZLEVBQVM7UUFBckIsaUJBb0NDO1FBbkNDLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7O1lBRWpCLEtBQUssR0FBRyxtQkFBQSxFQUFFLENBQUMsTUFBTSxFQUFvQjtRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixtQkFBbUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFO1lBQ3hDLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1NBQ2pDO1FBRUQsdUJBQXVCO1FBQ3ZCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPOzs7UUFBRTtZQUM5QixhQUFhO1lBQ2IsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsc0JBQXNCO1lBQ3RCLEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZC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LDhCQUFpQzs7SUFDakMsNEJBQXdCOztJQUN4QixpQ0FBc0M7O0lBQ3RDLDhCQUFzQjs7Ozs7QUF1RnhCLHdDQUtDOzs7SUFKQyx1Q0FBNkI7O0lBQzdCLHNDQUE4Qjs7SUFDOUIsa0NBQVc7O0lBQ1gscUNBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgQ3JvcHBlciBmcm9tICdjcm9wcGVyanMnO1xyXG5cclxuLyoqXHJcbiAqIOWbvueJh+WJquijgee7hOS7tlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC1jcm9wcGVyYCxcclxuICB0ZW1wbGF0ZVVybDogJ2Nyb3BwZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2Nyb3BwZXIuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcENyb3BwZXIgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlJykgaW1hZ2U6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGltYWdlVXJsOiBhbnk7XHJcbiAgQElucHV0KCkgY3JvcGJveDogQ3JvcHBlci5Dcm9wQm94RGF0YTtcclxuICBASW5wdXQoKSBsb2FkSW1hZ2VFcnJvclRleHQ6IHN0cmluZztcclxuICBASW5wdXQoKSBjcm9wcGVyT3B0aW9uczogQ3JvcHBlci5PcHRpb25zID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBleHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlQ3JvcHBlclJlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBjcm9wcGVyOiBDcm9wcGVyO1xyXG4gIHB1YmxpYyBpbWFnZUVsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgcHVibGljIGxvYWRFcnJvcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogSW1hZ2UgbG9hZGVkXHJcbiAgICAgKiBAcGFyYW0gZXZcclxuICAgICAqL1xyXG4gIGltYWdlTG9hZGVkKGV2OiBFdmVudCkge1xyXG4gICAgLy8gVW5zZXQgbG9hZCBlcnJvciBzdGF0ZVxyXG4gICAgdGhpcy5sb2FkRXJyb3IgPSBmYWxzZTtcclxuICAgIC8vIFNldHVwIGltYWdlIGVsZW1lbnRcclxuICAgIGNvbnN0IGltYWdlID0gZXYudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmltYWdlRWxlbWVudCA9IGltYWdlO1xyXG4gICAgLy8gQWRkIGNyb3NzT3JpZ2luP1xyXG4gICAgaWYgKHRoaXMuY3JvcHBlck9wdGlvbnMuY2hlY2tDcm9zc09yaWdpbikge1xyXG4gICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEltYWdlIG9uIHJlYWR5IGV2ZW50XHJcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdyZWFkeScsICgpID0+IHtcclxuICAgICAgLy8gRW1pdCByZWFkeVxyXG4gICAgICB0aGlzLnJlYWR5LmVtaXQodHJ1ZSk7XHJcbiAgICAgIC8vIFVuc2V0IGxvYWRpbmcgc3RhdGVcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgLy8gVmFsaWRhdGUgY3JvcGJveCBleGlzdGFuY2VcclxuICAgICAgaWYgKHRoaXMuY3JvcGJveCkge1xyXG4gICAgICAgIC8vIFNldCBjcm9wYm94IGRhdGFcclxuICAgICAgICB0aGlzLmNyb3BwZXIuc2V0Q3JvcEJveERhdGEodGhpcy5jcm9wYm94KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2V0IGNyb3Agb3B0aW9uc1xyXG4gICAgLy8gZXh0ZW5kIGRlZmF1bHQgd2l0aCBjdXN0b20gY29uZmlnXHJcbiAgICB0aGlzLmNyb3BwZXJPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgIGNoZWNrQ3Jvc3NPcmlnaW46IHRydWVcclxuICAgIH0sIHRoaXMuY3JvcHBlck9wdGlvbnMpO1xyXG5cclxuICAgIC8vIFNldCBjcm9wcGVyanNcclxuICAgIGlmICh0aGlzLmNyb3BwZXIpIHtcclxuICAgICAgdGhpcy5jcm9wcGVyLmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jcm9wcGVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcm9wcGVyID0gbmV3IENyb3BwZXIoaW1hZ2UsIHRoaXMuY3JvcHBlck9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1hZ2UgbG9hZCBlcnJvclxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIGltYWdlTG9hZEVycm9yKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIFNldCBsb2FkIGVycm9yIHN0YXRlXHJcbiAgICB0aGlzLmxvYWRFcnJvciA9IHRydWU7XHJcbiAgICAvLyBVbnNldCBsb2FkaW5nIHN0YXRlXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwb3J0IGNhbnZhc1xyXG4gICAqIEBwYXJhbSBiYXNlNjRcclxuICAgKi9cclxuICBleHBvcnRDYW52YXMoYmFzZTY0PzogYm9vbGVhbiwgb3B0aW9ucz86IENyb3BwZXIuR2V0Q3JvcHBlZENhbnZhc09wdGlvbnMpIHtcclxuICAgIC8vIEdldCBhbmQgc2V0IGltYWdlLCBjcm9wIGFuZCBjYW52YXMgZGF0YVxyXG4gICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5jcm9wcGVyLmdldEltYWdlRGF0YSgpO1xyXG4gICAgY29uc3QgY3JvcERhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0Q3JvcEJveERhdGEoKTtcclxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKG9wdGlvbnMpO1xyXG4gICAgY29uc3QgZGF0YSA9IHsgaW1hZ2VEYXRhLCBjcm9wRGF0YSwgYmxvYjogbnVsbCB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBwcm9taXNlIHRvIHJlc29sdmUgY2FudmFzIGRhdGFcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgLy8gVmFsaWRhdGUgYmFzZTY0XHJcbiAgICAgIGlmIChiYXNlNjQpIHtcclxuICAgICAgICBjYW52YXMudG9CbG9iKGJsb2IgPT4gcmVzb2x2ZSh7IGJsb2IsIGRhdGFVcmw6IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpIH0pKTtcclxuICAgICAgfVxyXG4gICAgICBjYW52YXMudG9CbG9iKGJsb2IgPT4gcmVzb2x2ZSh7IGJsb2IgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW1pdCBleHBvcnQgZGF0YSB3aGVuIHByb21pc2UgaXMgcmVhZHlcclxuICAgIHByb21pc2UudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGlzLmV4cG9ydC5lbWl0KE9iamVjdC5hc3NpZ24oZGF0YSwgcmVzKSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VDcm9wcGVyUmVzdWx0IHtcclxuICBpbWFnZURhdGE6IENyb3BwZXIuSW1hZ2VEYXRhO1xyXG4gIGNyb3BEYXRhOiBDcm9wcGVyLkNyb3BCb3hEYXRhO1xyXG4gIGJsb2I6IEJsb2I7XHJcbiAgZGF0YVVybD86IHN0cmluZztcclxufVxyXG5cclxuIl19