UNPKG

ionic-image-loader-v5

Version:
425 lines 29.1 kB
/** * @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==