ionic-image-loader-v5
Version:
ionic-image-loader to Ionic 5
425 lines • 29.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ionic-image-loader.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, Input, Output, Renderer2 } from '@angular/core';
import { ImageLoaderConfigService } from './services/image-loader-config.service';
import { ImageLoaderService } from './services/image-loader.service';
/** @type {?} */
var propMap = {
display: 'display',
height: 'height',
width: 'width',
backgroundSize: 'background-size',
backgroundRepeat: 'background-repeat',
};
/**
* @record
*/
export function ImageAttribute() { }
if (false) {
/** @type {?} */
ImageAttribute.prototype.element;
/** @type {?} */
ImageAttribute.prototype.value;
}
var IonicImageLoaderComponent = /** @class */ (function () {
function IonicImageLoaderComponent(_element, renderer, imageLoader, config) {
this._element = _element;
this.renderer = renderer;
this.imageLoader = imageLoader;
this.config = config;
/**
* Fallback URL to load when the image url fails to load or does not exist.
*/
this.fallbackUrl = this.config.fallbackUrl;
/**
* Whether to show a spinner while the image loads
*/
this.spinner = this.config.spinnerEnabled;
/**
* Whether to show the fallback image instead of a spinner while the image loads
*/
this.fallbackAsPlaceholder = this.config.fallbackAsPlaceholder;
/**
* Attributes to pass through to img tag if _useImg == true
*/
this.imgAttributes = [];
/**
* Enable/Disable caching
*/
this.cache = true;
/**
* Width of the image. This will be ignored if using useImg.
*/
this.width = this.config.width;
/**
* Height of the image. This will be ignored if using useImg.
*/
this.height = this.config.height;
/**
* Display type of the image. This will be ignored if using useImg.
*/
this.display = this.config.display;
/**
* Background size. This will be ignored if using useImg.
*/
this.backgroundSize = this.config.backgroundSize;
/**
* Background repeat. This will be ignored if using useImg.
*/
this.backgroundRepeat = this.config.backgroundRepeat;
/**
* Name of the spinner
*/
this.spinnerName = this.config.spinnerName;
/**
* Color of the spinner
*/
this.spinnerColor = this.config.spinnerColor;
/**
* Notify on image load..
*/
this.load = new EventEmitter();
/**
* Indicates if the image is still loading
*/
this.isLoading = true;
this._useImg = this.config.useImg;
}
Object.defineProperty(IonicImageLoaderComponent.prototype, "useImg", {
/**
* Use <img> tag
*/
set: /**
* Use <img> tag
* @param {?} val
* @return {?}
*/
function (val) {
this._useImg = val !== false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IonicImageLoaderComponent.prototype, "noCache", {
/**
* Convenience attribute to disable caching
*/
set: /**
* Convenience attribute to disable caching
* @param {?} val
* @return {?}
*/
function (val) {
this.cache = val !== false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IonicImageLoaderComponent.prototype, "src", {
get: /**
* @return {?}
*/
function () {
return this._src;
},
/**
* The URL of the image to load.
*/
set: /**
* The URL of the image to load.
* @param {?} imageUrl
* @return {?}
*/
function (imageUrl) {
this._src = this.processImageUrl(imageUrl);
this.updateImage(this._src);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
IonicImageLoaderComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.fallbackAsPlaceholder && this.fallbackUrl) {
this.setImage(this.fallbackUrl, false);
}
if (!this.src) {
// image url was not passed
// this can happen when [src] is set to a variable that turned out to be undefined
// one example could be a list of users with their profile pictures
// in this case, it would be useful to use the fallback image instead
// if fallbackUrl was used as placeholder we do not need to set it again
if (!this.fallbackAsPlaceholder && this.fallbackUrl) {
// we're not going to cache the fallback image since it should be locally saved
this.setImage(this.fallbackUrl);
}
else {
this.isLoading = false;
}
}
};
/**
* @private
* @param {?} imageUrl
* @return {?}
*/
IonicImageLoaderComponent.prototype.updateImage = /**
* @private
* @param {?} imageUrl
* @return {?}
*/
function (imageUrl) {
var _this = this;
this.imageLoader
.getImagePath(imageUrl)
.then((/**
* @param {?} url
* @return {?}
*/
function (url) { return _this.setImage(url); }))
.catch((/**
* @param {?} error
* @return {?}
*/
function (error) { return _this.setImage(_this.fallbackUrl || imageUrl); }));
};
/**
* Gets the image URL to be loaded and disables caching if necessary
*/
/**
* Gets the image URL to be loaded and disables caching if necessary
* @private
* @param {?} imageUrl
* @return {?}
*/
IonicImageLoaderComponent.prototype.processImageUrl = /**
* Gets the image URL to be loaded and disables caching if necessary
* @private
* @param {?} imageUrl
* @return {?}
*/
function (imageUrl) {
if (this.cache === false) {
// need to disable caching
if (imageUrl.indexOf('?') < 0) {
// add ? if doesn't exists
imageUrl += '?';
}
else {
imageUrl += '&';
}
// append timestamp at the end to make URL unique
imageUrl += 'cache_buster=' + Date.now();
}
return imageUrl;
};
/**
* Set the image to be displayed
* @param imageUrl image src
* @param stopLoading set to true to mark the image as loaded
*/
/**
* Set the image to be displayed
* @private
* @param {?} imageUrl image src
* @param {?=} stopLoading set to true to mark the image as loaded
* @return {?}
*/
IonicImageLoaderComponent.prototype.setImage = /**
* Set the image to be displayed
* @private
* @param {?} imageUrl image src
* @param {?=} stopLoading set to true to mark the image as loaded
* @return {?}
*/
function (imageUrl, stopLoading) {
var _this = this;
if (stopLoading === void 0) { stopLoading = true; }
this.isLoading = !stopLoading;
if (this._useImg) {
// Using <img> tag
if (!this.element) {
// create img element if we dont have one
this.element = this.renderer.createElement('img');
this.renderer.appendChild(this._element.nativeElement, this.element);
}
// set it's src
this.renderer.setAttribute(this.element, 'src', imageUrl);
// if imgAttributes are defined, add them to our img element
this.imgAttributes.forEach((/**
* @param {?} attribute
* @return {?}
*/
function (attribute) {
_this.renderer.setAttribute(_this.element, attribute.element, attribute.value);
}));
if (this.fallbackUrl && !this.imageLoader.nativeAvailable) {
this.renderer.listen(this.element, 'error', (/**
* @return {?}
*/
function () {
return _this.renderer.setAttribute(_this.element, 'src', _this.fallbackUrl);
}));
}
}
else {
// Not using <img> tag
this.element = this._element.nativeElement;
for (var prop in propMap) {
if (this[prop]) {
this.renderer.setStyle(this.element, propMap[prop], this[prop]);
}
}
this.renderer.setStyle(this.element, 'background-image', "url(\"" + (imageUrl || this.fallbackUrl) + "\")");
}
if (stopLoading) {
this.load.emit(this);
}
};
IonicImageLoaderComponent.decorators = [
{ type: Component, args: [{
selector: 'img-loader',
template: "\n <ion-spinner\n *ngIf=\"spinner && isLoading && !fallbackAsPlaceholder\"\n [name]=\"spinnerName\"\n [color]=\"spinnerColor\"\n ></ion-spinner>\n <ng-content></ng-content>\n ",
styles: ['ion-spinner { float: none; margin-left: auto; margin-right: auto; display: block; }']
}] }
];
/** @nocollapse */
IonicImageLoaderComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: ImageLoaderService },
{ type: ImageLoaderConfigService }
]; };
IonicImageLoaderComponent.propDecorators = {
fallbackUrl: [{ type: Input }],
spinner: [{ type: Input }],
fallbackAsPlaceholder: [{ type: Input }],
imgAttributes: [{ type: Input }],
cache: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
display: [{ type: Input }],
backgroundSize: [{ type: Input }],
backgroundRepeat: [{ type: Input }],
spinnerName: [{ type: Input }],
spinnerColor: [{ type: Input }],
load: [{ type: Output }],
useImg: [{ type: Input }],
noCache: [{ type: Input }],
src: [{ type: Input }]
};
return IonicImageLoaderComponent;
}());
export { IonicImageLoaderComponent };
if (false) {
/**
* Fallback URL to load when the image url fails to load or does not exist.
* @type {?}
*/
IonicImageLoaderComponent.prototype.fallbackUrl;
/**
* Whether to show a spinner while the image loads
* @type {?}
*/
IonicImageLoaderComponent.prototype.spinner;
/**
* Whether to show the fallback image instead of a spinner while the image loads
* @type {?}
*/
IonicImageLoaderComponent.prototype.fallbackAsPlaceholder;
/**
* Attributes to pass through to img tag if _useImg == true
* @type {?}
*/
IonicImageLoaderComponent.prototype.imgAttributes;
/**
* Enable/Disable caching
* @type {?}
*/
IonicImageLoaderComponent.prototype.cache;
/**
* Width of the image. This will be ignored if using useImg.
* @type {?}
*/
IonicImageLoaderComponent.prototype.width;
/**
* Height of the image. This will be ignored if using useImg.
* @type {?}
*/
IonicImageLoaderComponent.prototype.height;
/**
* Display type of the image. This will be ignored if using useImg.
* @type {?}
*/
IonicImageLoaderComponent.prototype.display;
/**
* Background size. This will be ignored if using useImg.
* @type {?}
*/
IonicImageLoaderComponent.prototype.backgroundSize;
/**
* Background repeat. This will be ignored if using useImg.
* @type {?}
*/
IonicImageLoaderComponent.prototype.backgroundRepeat;
/**
* Name of the spinner
* @type {?}
*/
IonicImageLoaderComponent.prototype.spinnerName;
/**
* Color of the spinner
* @type {?}
*/
IonicImageLoaderComponent.prototype.spinnerColor;
/**
* Notify on image load..
* @type {?}
*/
IonicImageLoaderComponent.prototype.load;
/**
* Indicates if the image is still loading
* @type {?}
*/
IonicImageLoaderComponent.prototype.isLoading;
/** @type {?} */
IonicImageLoaderComponent.prototype.element;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype._useImg;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype._src;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype._element;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype.imageLoader;
/**
* @type {?}
* @private
*/
IonicImageLoaderComponent.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uaWMtaW1hZ2UtbG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvbmljLWltYWdlLWxvYWRlci12NS8iLCJzb3VyY2VzIjpbImxpYi9pb25pYy1pbWFnZS1sb2FkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztJQUUvRCxPQUFPLEdBQVE7SUFDbkIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLE9BQU87SUFDZCxjQUFjLEVBQUUsaUJBQWlCO0lBQ2pDLGdCQUFnQixFQUFFLG1CQUFtQjtDQUN0Qzs7OztBQUVELG9DQUdDOzs7SUFGQyxpQ0FBZ0I7O0lBQ2hCLCtCQUFjOztBQUdoQjtJQTJFRSxtQ0FDWSxRQUFvQixFQUNwQixRQUFtQixFQUNuQixXQUErQixFQUMvQixNQUFnQztRQUhoQyxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQTBCOzs7O1FBN0RuQyxnQkFBVyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDOzs7O1FBSTlDLFlBQU8sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQzs7OztRQUs5QywwQkFBcUIsR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDOzs7O1FBSW5FLGtCQUFhLEdBQXFCLEVBQUUsQ0FBQzs7OztRQUlyQyxVQUFLLEdBQUcs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Szt3Q0FLTCxLQUFLO2dDQUlMLEtBQUs7d0JBSUwsS0FBSzt3QkFJTCxLQUFLO3lCQUlMLEtBQUs7MEJBSUwsS0FBSztpQ0FJTCxLQUFLO21DQUlMLEtBQUs7OEJBSUwsS0FBSzsrQkFJTCxLQUFLO3VCQUlMLE1BQU07eUJBcUJOLEtBQUs7MEJBUUwsS0FBSztzQkFjTCxLQUFLOztJQXFHUixnQ0FBQztDQUFBLEFBbk5ELElBbU5DO1NBck1ZLHlCQUF5Qjs7Ozs7O0lBSXBDLGdEQUF1RDs7Ozs7SUFJdkQsNENBQXVEOzs7OztJQUt2RCwwREFBNEU7Ozs7O0lBSTVFLGtEQUE4Qzs7Ozs7SUFJOUMsMENBQXNCOzs7OztJQUl0QiwwQ0FBMkM7Ozs7O0lBSTNDLDJDQUE2Qzs7Ozs7SUFJN0MsNENBQStDOzs7OztJQUkvQyxtREFBNkQ7Ozs7O0lBSTdELHFEQUFpRTs7Ozs7SUFJakUsZ0RBQXVEOzs7OztJQUl2RCxpREFBeUQ7Ozs7O0lBSXpELHlDQUM4Rjs7Ozs7SUFJOUYsOENBQWlCOztJQUNqQiw0Q0FBcUI7Ozs7O0lBVXJCLDRDQUE4Qzs7Ozs7SUFrQjlDLHlDQUFxQjs7Ozs7SUF6QmpCLDZDQUE0Qjs7Ozs7SUFDNUIsNkNBQTJCOzs7OztJQUMzQixnREFBdUM7Ozs7O0lBQ3ZDLDJDQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VMb2FkZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9pbWFnZS1sb2FkZXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW1hZ2VMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9pbWFnZS1sb2FkZXIuc2VydmljZSc7XG5cbmNvbnN0IHByb3BNYXA6IGFueSA9IHtcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgYmFja2dyb3VuZFNpemU6ICdiYWNrZ3JvdW5kLXNpemUnLFxuICBiYWNrZ3JvdW5kUmVwZWF0OiAnYmFja2dyb3VuZC1yZXBlYXQnLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUF0dHJpYnV0ZSB7XG4gIGVsZW1lbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1nLWxvYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1zcGlubmVyXG4gICAgICAgICpuZ0lmPVwic3Bpbm5lciAmJiBpc0xvYWRpbmcgJiYgIWZhbGxiYWNrQXNQbGFjZWhvbGRlclwiXG4gICAgICAgIFtuYW1lXT1cInNwaW5uZXJOYW1lXCJcbiAgICAgICAgW2NvbG9yXT1cInNwaW5uZXJDb2xvclwiXG4gICAgPjwvaW9uLXNwaW5uZXI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICAnaW9uLXNwaW5uZXIgeyBmbG9hdDogbm9uZTsgbWFyZ2luLWxlZnQ6IGF1dG87IG1hcmdpbi1yaWdodDogYXV0bzsgZGlzcGxheTogYmxvY2s7IH0nLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBJb25pY0ltYWdlTG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIFVSTCB0byBsb2FkIHdoZW4gdGhlIGltYWdlIHVybCBmYWlscyB0byBsb2FkIG9yIGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgQElucHV0KCkgZmFsbGJhY2tVcmw6IHN0cmluZyA9IHRoaXMuY29uZmlnLmZhbGxiYWNrVXJsO1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgc3Bpbm5lciB3aGlsZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICovXG4gIEBJbnB1dCgpIHNwaW5uZXI6IGJvb2xlYW4gPSB0aGlzLmNvbmZpZy5zcGlubmVyRW5hYmxlZDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgZmFsbGJhY2sgaW1hZ2UgaW5zdGVhZCBvZiBhIHNwaW5uZXIgd2hpbGUgdGhlIGltYWdlIGxvYWRzXG4gICAqL1xuXG4gIEBJbnB1dCgpIGZhbGxiYWNrQXNQbGFjZWhvbGRlcjogYm9vbGVhbiA9IHRoaXMuY29uZmlnLmZhbGxiYWNrQXNQbGFjZWhvbGRlcjtcbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgdG8gcGFzcyB0aHJvdWdoIHRvIGltZyB0YWcgaWYgX3VzZUltZyA9PSB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBpbWdBdHRyaWJ1dGVzOiBJbWFnZUF0dHJpYnV0ZVtdID0gW107XG4gIC8qKlxuICAgKiBFbmFibGUvRGlzYWJsZSBjYWNoaW5nXG4gICAqL1xuICBASW5wdXQoKSBjYWNoZSA9IHRydWU7XG4gIC8qKlxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cbiAgICovXG4gIEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy53aWR0aDtcbiAgLyoqXG4gICAqIEhlaWdodCBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cbiAgICovXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gdGhpcy5jb25maWcuaGVpZ2h0O1xuICAvKipcbiAgICogRGlzcGxheSB0eXBlIG9mIHRoZSBpbWFnZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheTogc3RyaW5nID0gdGhpcy5jb25maWcuZGlzcGxheTtcbiAgLyoqXG4gICAqIEJhY2tncm91bmQgc2l6ZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxuICAgKi9cbiAgQElucHV0KCkgYmFja2dyb3VuZFNpemU6IHN0cmluZyA9IHRoaXMuY29uZmlnLmJhY2tncm91bmRTaXplO1xuICAvKipcbiAgICogQmFja2dyb3VuZCByZXBlYXQuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cbiAgICovXG4gIEBJbnB1dCgpIGJhY2tncm91bmRSZXBlYXQ6IHN0cmluZyA9IHRoaXMuY29uZmlnLmJhY2tncm91bmRSZXBlYXQ7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzcGlubmVyXG4gICAqL1xuICBASW5wdXQoKSBzcGlubmVyTmFtZTogc3RyaW5nID0gdGhpcy5jb25maWcuc3Bpbm5lck5hbWU7XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgc3Bpbm5lclxuICAgKi9cbiAgQElucHV0KCkgc3Bpbm5lckNvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5zcGlubmVyQ29sb3I7XG4gIC8qKlxuICAgKiBOb3RpZnkgb24gaW1hZ2UgbG9hZC4uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgbG9hZDogRXZlbnRFbWl0dGVyPElvbmljSW1hZ2VMb2FkZXJDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJb25pY0ltYWdlTG9hZGVyQ29tcG9uZW50PigpO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBpbWFnZSBpcyBzdGlsbCBsb2FkaW5nXG4gICAqL1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICBwcml2YXRlIGltYWdlTG9hZGVyOiBJbWFnZUxvYWRlclNlcnZpY2UsXG4gICAgICBwcml2YXRlIGNvbmZpZzogSW1hZ2VMb2FkZXJDb25maWdTZXJ2aWNlLFxuICApIHtcbiAgfVxuXG4gIHByaXZhdGUgX3VzZUltZzogYm9vbGVhbiA9IHRoaXMuY29uZmlnLnVzZUltZztcblxuICAvKipcbiAgICogVXNlIDxpbWc+IHRhZ1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHVzZUltZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91c2VJbWcgPSB2YWwgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGF0dHJpYnV0ZSB0byBkaXNhYmxlIGNhY2hpbmdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBub0NhY2hlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuY2FjaGUgPSB2YWwgIT09IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3JjOiBzdHJpbmc7XG5cbiAgZ2V0IHNyYygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zcmM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gbG9hZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzcmMoaW1hZ2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX3NyYyA9IHRoaXMucHJvY2Vzc0ltYWdlVXJsKGltYWdlVXJsKTtcbiAgICB0aGlzLnVwZGF0ZUltYWdlKHRoaXMuX3NyYyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mYWxsYmFja0FzUGxhY2Vob2xkZXIgJiYgdGhpcy5mYWxsYmFja1VybCkge1xuICAgICAgdGhpcy5zZXRJbWFnZSh0aGlzLmZhbGxiYWNrVXJsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNyYykge1xuICAgICAgLy8gaW1hZ2UgdXJsIHdhcyBub3QgcGFzc2VkXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBbc3JjXSBpcyBzZXQgdG8gYSB2YXJpYWJsZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgdW5kZWZpbmVkXG4gICAgICAvLyBvbmUgZXhhbXBsZSBjb3VsZCBiZSBhIGxpc3Qgb2YgdXNlcnMgd2l0aCB0aGVpciBwcm9maWxlIHBpY3R1cmVzXG4gICAgICAvLyBpbiB0aGlzIGNhc2UsIGl0IHdvdWxkIGJlIHVzZWZ1bCB0byB1c2UgdGhlIGZhbGxiYWNrIGltYWdlIGluc3RlYWRcbiAgICAgIC8vIGlmIGZhbGxiYWNrVXJsIHdhcyB1c2VkIGFzIHBsYWNlaG9sZGVyIHdlIGRvIG5vdCBuZWVkIHRvIHNldCBpdCBhZ2FpblxuICAgICAgaWYgKCF0aGlzLmZhbGxiYWNrQXNQbGFjZWhvbGRlciAmJiB0aGlzLmZhbGxiYWNrVXJsKSB7XG4gICAgICAgIC8vIHdlJ3JlIG5vdCBnb2luZyB0byBjYWNoZSB0aGUgZmFsbGJhY2sgaW1hZ2Ugc2luY2UgaXQgc2hvdWxkIGJlIGxvY2FsbHkgc2F2ZWRcbiAgICAgICAgdGhpcy5zZXRJbWFnZSh0aGlzLmZhbGxiYWNrVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbWFnZShpbWFnZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbWFnZUxvYWRlclxuICAgICAgICAuZ2V0SW1hZ2VQYXRoKGltYWdlVXJsKVxuICAgICAgICAudGhlbigodXJsOiBzdHJpbmcpID0+IHRoaXMuc2V0SW1hZ2UodXJsKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogYW55KSA9PiB0aGlzLnNldEltYWdlKHRoaXMuZmFsbGJhY2tVcmwgfHwgaW1hZ2VVcmwpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbWFnZSBVUkwgdG8gYmUgbG9hZGVkIGFuZCBkaXNhYmxlcyBjYWNoaW5nIGlmIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzSW1hZ2VVcmwoaW1hZ2VVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2FjaGUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBuZWVkIHRvIGRpc2FibGUgY2FjaGluZ1xuXG4gICAgICBpZiAoaW1hZ2VVcmwuaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAvLyBhZGQgPyBpZiBkb2Vzbid0IGV4aXN0c1xuICAgICAgICBpbWFnZVVybCArPSAnPyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbWFnZVVybCArPSAnJic7XG4gICAgICB9XG4gICAgICAvLyBhcHBlbmQgdGltZXN0YW1wIGF0IHRoZSBlbmQgdG8gbWFrZSBVUkwgdW5pcXVlXG4gICAgICBpbWFnZVVybCArPSAnY2FjaGVfYnVzdGVyPScgKyBEYXRlLm5vdygpO1xuICAgIH1cblxuICAgIHJldHVybiBpbWFnZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGltYWdlIHRvIGJlIGRpc3BsYXllZFxuICAgKiBAcGFyYW0gaW1hZ2VVcmwgaW1hZ2Ugc3JjXG4gICAqIEBwYXJhbSBzdG9wTG9hZGluZyBzZXQgdG8gdHJ1ZSB0byBtYXJrIHRoZSBpbWFnZSBhcyBsb2FkZWRcbiAgICovXG4gIHByaXZhdGUgc2V0SW1hZ2UoaW1hZ2VVcmw6IHN0cmluZywgc3RvcExvYWRpbmc6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSAhc3RvcExvYWRpbmc7XG5cbiAgICBpZiAodGhpcy5fdXNlSW1nKSB7XG4gICAgICAvLyBVc2luZyA8aW1nPiB0YWdcbiAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIC8vIGNyZWF0ZSBpbWcgZWxlbWVudCBpZiB3ZSBkb250IGhhdmUgb25lXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgaXQncyBzcmNcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgJ3NyYycsIGltYWdlVXJsKTtcblxuICAgICAgLy8gaWYgaW1nQXR0cmlidXRlcyBhcmUgZGVmaW5lZCwgYWRkIHRoZW0gdG8gb3VyIGltZyBlbGVtZW50XG4gICAgICB0aGlzLmltZ0F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlLmVsZW1lbnQsIGF0dHJpYnV0ZS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmZhbGxiYWNrVXJsICYmICF0aGlzLmltYWdlTG9hZGVyLm5hdGl2ZUF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsICdlcnJvcicsICgpID0+XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsICdzcmMnLCB0aGlzLmZhbGxiYWNrVXJsKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm90IHVzaW5nIDxpbWc+IHRhZ1xuXG4gICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wTWFwKSB7XG4gICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIHByb3BNYXBbcHJvcF0sIHRoaXNbcHJvcF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAnYmFja2dyb3VuZC1pbWFnZScsXG4gICAgICAgICAgYHVybChcIiR7aW1hZ2VVcmwgfHwgdGhpcy5mYWxsYmFja1VybH1cIilgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0b3BMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWQuZW1pdCh0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==