ng-materialgrammi
Version:
An Angular framework which follows
119 lines • 18.5 kB
JavaScript
import { HttpEventType, HttpHeaders } from '@angular/common/http';
import { Component, Input, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "../placeholder/placeholder.component";
import * as i3 from "@angular/common";
export class ImageComponent {
constructor(renderer, http) {
this.renderer = renderer;
this.http = http;
this.src = "";
this.responsive = true;
this.rounded = false;
this.circled = false;
this.shadowed = false;
this.applyFilters = true;
this.lazyLoad = true;
this.class = "";
this.filters = {
blur: false,
brightness: false,
contrast: false,
grayscale: false,
invert: false,
hue: false,
opacity: false,
saturate: false,
sepia: false
};
this.loaded = false;
}
ngOnInit() {
if (this.lazyLoad) {
this.loadImage();
}
}
ngAfterViewInit() {
this.filterize();
}
loadImage() {
this.http.get(this.src, {
responseType: "blob",
reportProgress: true,
observe: "events",
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}).subscribe(event => {
if (event.type === HttpEventType.DownloadProgress && event.total) {
const percentage = (event.loaded / event.total) * 100;
this.imageProgress.nativeElement.value = percentage;
}
if (event.type === HttpEventType.Response && event.body) {
this.loaded = true;
this.image.nativeElement.src = window.URL.createObjectURL(event.body);
this.filterize();
}
});
}
filterize() {
if (this.applyFilters && !this.loaded) {
let filters = this.createFilters();
this.renderer.setStyle(this.image.nativeElement, 'filter', filters);
}
}
imageClasses() {
let results = "img";
results += this.responsive ? " img-responsive" : "";
results += this.rounded ? " rounded" : "";
results += !this.rounded && this.circled ? " circled" : "";
results += this.shadowed ? " shadow-2" : "";
results += ` ${this.class}`;
return results;
}
createFilters() {
let filter = "";
filter += (this.filters.blur !== undefined && this.filters.blur !== false) ? ` blur(${this.filters.blur}px)` : "";
filter += (this.filters.brightness !== undefined && this.filters.brightness !== false) ? ` brightness(${this.filters.brightness}%)` : "";
filter += (this.filters.contrast !== undefined && this.filters.contrast !== false) ? ` contrast(${this.filters.contrast}%)` : "";
filter += (this.filters.grayscale !== undefined && this.filters.grayscale !== false) ? ` grayscale(${this.filters.grayscale}%)` : "";
filter += (this.filters.invert !== undefined && this.filters.invert !== false) ? ` invert(${this.filters.invert}%)` : "";
filter += (this.filters.hue !== undefined && this.filters.hue !== false) ? ` hue-rotate(${this.filters.hue}deg)` : "";
filter += (this.filters.opacity !== undefined && this.filters.opacity !== false) ? ` opacity(${this.filters.opacity}%)` : "";
filter += (this.filters.saturate !== undefined && this.filters.saturate !== false) ? ` saturate(${this.filters.saturate}%)` : "";
filter += (this.filters.sepia !== undefined && this.filters.sepia !== false) ? ` sepia(${this.filters.sepia}%)` : "";
return filter;
}
}
ImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ImageComponent, deps: [{ token: i0.Renderer2 }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
ImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ImageComponent, selector: "mg-image", inputs: { src: "src", responsive: "responsive", rounded: "rounded", circled: "circled", shadowed: "shadowed", applyFilters: "applyFilters", lazyLoad: "lazyLoad", class: "class", filters: "filters" }, viewQueries: [{ propertyName: "image", first: true, predicate: ["imageEl"], descendants: true }, { propertyName: "imageProgress", first: true, predicate: ["imageProgress"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"lazyLoad\">\n <mg-placeholder type=\"img\" [show]=\"!loaded\">\n <progress #imageProgress value = \"0\" max=\"100\" class=\"image-progress\"></progress>\n </mg-placeholder>\n \n <img #imageEl [ngClass]=\"!loaded ? 'hide' : '' + imageClasses()\"/>\n</ng-container>\n\n<ng-container *ngIf=\"!lazyLoad\">\n <img [src]=\"src\" #imageEl [ngClass]=\"imageClasses()\"/>\n</ng-container>\n\n\n", styles: [".img.rounded{border-radius:5px}.img.circled{border-radius:50%}.image-progress{display:block;width:100%;height:5px}\n"], components: [{ type: i2.PlaceholderComponent, selector: "mg-placeholder", inputs: ["show", "type", "class"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ImageComponent, decorators: [{
type: Component,
args: [{ selector: 'mg-image', template: "<ng-container *ngIf=\"lazyLoad\">\n <mg-placeholder type=\"img\" [show]=\"!loaded\">\n <progress #imageProgress value = \"0\" max=\"100\" class=\"image-progress\"></progress>\n </mg-placeholder>\n \n <img #imageEl [ngClass]=\"!loaded ? 'hide' : '' + imageClasses()\"/>\n</ng-container>\n\n<ng-container *ngIf=\"!lazyLoad\">\n <img [src]=\"src\" #imageEl [ngClass]=\"imageClasses()\"/>\n</ng-container>\n\n\n", styles: [".img.rounded{border-radius:5px}.img.circled{border-radius:50%}.image-progress{display:block;width:100%;height:5px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.HttpClient }]; }, propDecorators: { src: [{
type: Input
}], responsive: [{
type: Input
}], rounded: [{
type: Input
}], circled: [{
type: Input
}], shadowed: [{
type: Input
}], applyFilters: [{
type: Input
}], lazyLoad: [{
type: Input
}], class: [{
type: Input
}], filters: [{
type: Input
}], image: [{
type: ViewChild,
args: ['imageEl']
}], imageProgress: [{
type: ViewChild,
args: ['imageProgress']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWxncmFtbWkvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlL2ltYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsZ3JhbW1pL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS9pbWFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMxRyxNQUFNLE9BQU8sY0FBYztJQTBCekIsWUFBb0IsUUFBbUIsRUFBVSxJQUFnQjtRQUE3QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQXpCeEQsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUNULGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsWUFBTyxHQUFRO1lBQ3RCLElBQUksRUFBRSxLQUFLO1lBQ1gsVUFBVSxFQUFFLEtBQUs7WUFDakIsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsS0FBSztZQUNoQixNQUFNLEVBQUUsS0FBSztZQUNiLEdBQUcsRUFBRSxLQUFLO1lBQ1YsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLEtBQUssRUFBRSxLQUFLO1NB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LE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekgsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0SCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNySCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzsyR0F4RlUsY0FBYzsrRkFBZCxjQUFjLDJiQ1YzQiwrYUFhQTsyRkRIYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7eUhBS1gsR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQVl3QixLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLFNBQVM7Z0JBQ2dCLGFBQWE7c0JBQWhELFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWctaW1hZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzcmMgPSBcIlwiO1xuICBASW5wdXQoKSByZXNwb25zaXZlID0gdHJ1ZTtcbiAgQElucHV0KCkgcm91bmRlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjaXJjbGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNoYWRvd2VkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGx5RmlsdGVycyA9IHRydWU7XG4gIEBJbnB1dCgpIGxhenlMb2FkID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xhc3MgPSBcIlwiO1xuXG4gIEBJbnB1dCgpIGZpbHRlcnM6IGFueSA9IHtcbiAgICBibHVyOiBmYWxzZSxcbiAgICBicmlnaHRuZXNzOiBmYWxzZSxcbiAgICBjb250cmFzdDogZmFsc2UsXG4gICAgZ3JheXNjYWxlOiBmYWxzZSxcbiAgICBpbnZlcnQ6IGZhbHNlLFxuICAgIGh1ZTogZmFsc2UsXG4gICAgb3BhY2l0eTogZmFsc2UsXG4gICAgc2F0dXJhdGU6IGZhbHNlLFxuICAgIHNlcGlhOiBmYWxzZVxuICB9XG5cbiAgQFZpZXdDaGlsZCgnaW1hZ2VFbCcpIHByaXZhdGUgaW1hZ2UhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbWFnZVByb2dyZXNzJykgcHJpdmF0ZSBpbWFnZVByb2dyZXNzITogRWxlbWVudFJlZjtcblxuICBsb2FkZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMubGF6eUxvYWQpIHtcbiAgICAgIHRoaXMubG9hZEltYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZmlsdGVyaXplKCk7XG4gIH1cblxuICBsb2FkSW1hZ2UoKXtcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuc3JjLCB7XG4gICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICBvYnNlcnZlOiBcImV2ZW50c1wiLFxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfSlcbiAgICB9KS5zdWJzY3JpYmUoZXZlbnQ9PntcbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuRG93bmxvYWRQcm9ncmVzcyAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGV2ZW50LmxvYWRlZC9ldmVudC50b3RhbCkgKiAxMDA7XG4gICAgICAgIHRoaXMuaW1hZ2VQcm9ncmVzcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gcGVyY2VudGFnZTtcbiAgICAgIH1cbiAgICAgIGlmKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UgJiYgZXZlbnQuYm9keSl7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbWFnZS5uYXRpdmVFbGVtZW50LnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xuICAgICAgICB0aGlzLmZpbHRlcml6ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZmlsdGVyaXplKCl7XG4gICAgaWYodGhpcy5hcHBseUZpbHRlcnMgJiYgIXRoaXMubG9hZGVkKSB7XG4gICAgICBsZXQgZmlsdGVycyA9IHRoaXMuY3JlYXRlRmlsdGVycygpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmltYWdlLm5hdGl2ZUVsZW1lbnQsICdmaWx0ZXInLCBmaWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBpbWFnZUNsYXNzZXMoKSB7XG4gICAgbGV0IHJlc3VsdHMgPSBcImltZ1wiO1xuICAgIHJlc3VsdHMgKz0gdGhpcy5yZXNwb25zaXZlID8gXCIgaW1nLXJlc3BvbnNpdmVcIiA6IFwiXCI7XG4gICAgcmVzdWx0cyArPSB0aGlzLnJvdW5kZWQgPyBcIiByb3VuZGVkXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gIXRoaXMucm91bmRlZCAmJiB0aGlzLmNpcmNsZWQgPyBcIiBjaXJjbGVkXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gdGhpcy5zaGFkb3dlZCA/IFwiIHNoYWRvdy0yXCIgOiBcIlwiO1xuICAgIHJlc3VsdHMgKz0gYCAke3RoaXMuY2xhc3N9YDtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGNyZWF0ZUZpbHRlcnMoKSB7XG4gICAgbGV0IGZpbHRlciA9IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuYmx1ciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVycy5ibHVyICE9PSBmYWxzZSkgPyBgIGJsdXIoJHt0aGlzLmZpbHRlcnMuYmx1cn1weClgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5icmlnaHRuZXNzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJzLmJyaWdodG5lc3MgIT09IGZhbHNlKSA/IGAgYnJpZ2h0bmVzcygke3RoaXMuZmlsdGVycy5icmlnaHRuZXNzfSUpYCA6IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuY29udHJhc3QgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuY29udHJhc3QgIT09IGZhbHNlKSA/IGAgY29udHJhc3QoJHt0aGlzLmZpbHRlcnMuY29udHJhc3R9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5ncmF5c2NhbGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuZ3JheXNjYWxlICE9PSBmYWxzZSkgPyBgIGdyYXlzY2FsZSgke3RoaXMuZmlsdGVycy5ncmF5c2NhbGV9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5pbnZlcnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuaW52ZXJ0ICE9PSBmYWxzZSkgPyBgIGludmVydCgke3RoaXMuZmlsdGVycy5pbnZlcnR9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5odWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuaHVlICE9PSBmYWxzZSkgPyBgIGh1ZS1yb3RhdGUoJHt0aGlzLmZpbHRlcnMuaHVlfWRlZylgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5vcGFjaXR5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJzLm9wYWNpdHkgIT09IGZhbHNlKSA/IGAgb3BhY2l0eSgke3RoaXMuZmlsdGVycy5vcGFjaXR5fSUpYCA6IFwiXCI7XG4gICAgZmlsdGVyICs9ICh0aGlzLmZpbHRlcnMuc2F0dXJhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpbHRlcnMuc2F0dXJhdGUgIT09IGZhbHNlKSA/IGAgc2F0dXJhdGUoJHt0aGlzLmZpbHRlcnMuc2F0dXJhdGV9JSlgIDogXCJcIjtcbiAgICBmaWx0ZXIgKz0gKHRoaXMuZmlsdGVycy5zZXBpYSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVycy5zZXBpYSAhPT0gZmFsc2UpID8gYCBzZXBpYSgke3RoaXMuZmlsdGVycy5zZXBpYX0lKWAgOiBcIlwiO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuXG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibGF6eUxvYWRcIj5cbiAgICA8bWctcGxhY2Vob2xkZXIgdHlwZT1cImltZ1wiIFtzaG93XT1cIiFsb2FkZWRcIj5cbiAgICAgICAgPHByb2dyZXNzICNpbWFnZVByb2dyZXNzIHZhbHVlID0gXCIwXCIgbWF4PVwiMTAwXCIgY2xhc3M9XCJpbWFnZS1wcm9ncmVzc1wiPjwvcHJvZ3Jlc3M+XG4gICAgPC9tZy1wbGFjZWhvbGRlcj5cbiAgICBcbiAgICA8aW1nICNpbWFnZUVsIFtuZ0NsYXNzXT1cIiFsb2FkZWQgPyAnaGlkZScgOiAnJyArIGltYWdlQ2xhc3NlcygpXCIvPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhbGF6eUxvYWRcIj5cbiAgICA8aW1nIFtzcmNdPVwic3JjXCIgI2ltYWdlRWwgW25nQ2xhc3NdPVwiaW1hZ2VDbGFzc2VzKClcIi8+XG48L25nLWNvbnRhaW5lcj5cblxuXG4iXX0=