ng-image-video-gallery
Version:
Angular Image slider with lightbox. An Angular responsive image slider with lightbox popup. Also support youtube url, image base64 string and mp4 video urls and base64 string.
310 lines • 45.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/slider-custom-image/slider-custom-image.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Inject, Output, EventEmitter } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { DomSanitizer } from '@angular/platform-browser';
import { NgImageSliderService } from './../ng-image-slider.service';
import { SliderService } from '../services/slider.service';
/** @type {?} */
const youtubeRegExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
/** @type {?} */
const validFileExtensions = ['jpeg', 'jpg', 'gif', 'png'];
/** @type {?} */
const validVideoExtensions = ['mp4'];
/** @type {?} */
const vimeoRegExp = /\/\/(?:www.)?vimeo.com\/([0-9a-z-_]+)/i;
/** @type {?} */
const wistiaRegExp = /https?:\/\/[^.]+\.(wistia\.com|wi\.st)\/(medias|embed)\/.*/;
export class SliderCustomImageComponent {
/**
* @param {?} imageSliderService
* @param {?} sanitizer
* @param {?} document
* @param {?} sliderService
*/
constructor(imageSliderService, sanitizer, document, sliderService) {
this.imageSliderService = imageSliderService;
this.sanitizer = sanitizer;
this.sliderService = sliderService;
this.YOUTUBE = 'youtube';
this.IMAGE = 'image';
this.VIDEO = 'video';
this.ANOTHER_VIDEO = 'another-video';
this.fileUrl = '';
this.videoUrl = '';
this.fileExtension = '';
this.type = this.IMAGE;
this.imageLoading = true;
this.wistiaUrl = '';
// @inputs
this.showVideo = false;
this.videoAutoPlay = false;
this.showVideoControls = 1;
this.speed = 1;
this.isVideo = false;
this.alt = '';
this.title = '';
this.direction = 'ltr';
this.ratio = false;
this.lazy = false;
this.getThumbnail = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.imageUrl
&& this.imageUrl
&& this.imageUrl
&& typeof (this.imageUrl) === 'string'
&& ((changes.imageUrl && changes.imageUrl.firstChange)
||
(this.videoAutoPlay))) {
this.setUrl();
}
}
/**
* @return {?}
*/
setUrl() {
/** @type {?} */
const url = this.imageUrl;
this.imageLoading = true;
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
this.fileExtension = url.split('.').pop().split(/\#|\?/)[0];
if (this.imageSliderService.base64FileExtension(url)
&& (validFileExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1
|| validVideoExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1)) {
this.fileExtension = this.imageSliderService.base64FileExtension(url);
}
// verify for youtube url
/** @type {?} */
const match = url.match(youtubeRegExp);
/** @type {?} */
const matchVimeoUrl = url.match(vimeoRegExp);
/** @type {?} */
const matchWistiaUrl = url.match(wistiaRegExp);
if (match && match[2].length === 11) {
if (this.showVideo) {
this.type = this.YOUTUBE;
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`${'https://www.youtube.com/embed/'}${match[2]}${this.videoAutoPlay ? '?autoplay=1&enablejsapi=1' : '?autoplay=0&enablejsapi=1'}${'&controls='}${this.showVideoControls}`);
}
else {
this.type = this.IMAGE;
//this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`https://img.youtube.com/vi/${match[2]}/0.jpg`);
// Remove black background and get full size high resoultion image
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`https://img.youtube.com/vi/${match[2]}/maxresdefault.jpg`);
/** @type {?} */
let thumnailObject = { index: this.imagePositionInSlider, image: this.fileUrl };
this.getThumbnail.emit(thumnailObject);
}
}
else if (matchVimeoUrl) {
this.sliderService.getoEmbedResponse('https://vimeo.com/api/oembed.json?url=', url).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
if (this.showVideo) {
this.type = this.ANOTHER_VIDEO;
/** @type {?} */
let vimeoVideoUrl = `${'https://player.vimeo.com/video/'}${res['video_id']}`;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(vimeoVideoUrl);
}
else {
this.type = this.IMAGE;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(res['thumbnail_url']);
/** @type {?} */
let thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl };
this.getThumbnail.emit(thumnailObject);
}
}));
}
else if (url.indexOf('https://player.vimeo.com/video') !== -1) {
if (this.showVideo) {
this.type = this.ANOTHER_VIDEO;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
else {
this.type = this.IMAGE;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl('data:image/png;base64,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');
/** @type {?} */
let thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl };
this.getThumbnail.emit(thumnailObject);
}
}
else if (url.indexOf('https://players.brightcove.net/') !== -1) {
if (this.showVideo) {
this.type = this.ANOTHER_VIDEO;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
else {
this.type = this.IMAGE;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://cdn.mos.cms.futurecdn.net/xnhBGrzwAHmbTmyfWx6RsM-970-75.png.webp');
/** @type {?} */
let thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl };
this.getThumbnail.emit(thumnailObject);
}
}
else if (url.indexOf(matchWistiaUrl) && url.indexOf('wistia') !== -1) {
this.sliderService.getoEmbedResponse("https://fast.wistia.com/oembed.json?url=", url).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
if (this.showVideo) {
this.type = this.ANOTHER_VIDEO;
this.wistiaUrl = url + `?resumable=false`;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.wistiaUrl);
}
else {
this.type = this.IMAGE;
this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(res['thumbnail_url']);
/** @type {?} */
let thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl };
this.getThumbnail.emit(thumnailObject);
}
}));
}
else if (this.fileExtension && validFileExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) {
this.type = this.IMAGE;
}
else if (this.fileExtension && validVideoExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) {
this.type = this.VIDEO;
if (this.videoAutoPlay && document.getElementById(`video_${this.imageIndex}`)) {
/** @type {?} */
const videoObj = document.getElementById(`video_${this.imageIndex}`);
setTimeout((/**
* @return {?}
*/
() => {
videoObj.play();
}), this.speed * 1000);
}
}
}
/**
* @param {?} event
* @return {?}
*/
videoClickHandler(event) {
if (event && event.srcElement && !this.showVideoControls) {
if (event.srcElement.paused) {
event.srcElement.play();
}
else {
event.srcElement.pause();
}
}
}
}
SliderCustomImageComponent.decorators = [
{ type: Component, args: [{
selector: 'custom-img',
template: "\r\n <div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\r\n <img class=\"image cursor-pointer\"\r\n (load)=\"imageLoading = false\"\r\n [ngClass]=\"type === IMAGE && (imgData?.imageTitle || imgData?.imageDescription) ? {imageTitleClass: 'imageTitleClass','ratio': ratio} : {videoClass: 'videoClass','ratio': ratio}\"\r\n *ngIf=\"(type === IMAGE && fileUrl) || (type === IMAGE && videoUrl)\"\r\n [src]=\"videoUrl ? videoUrl : fileUrl\"\r\n [alt]=\"alt\"\r\n [title]=\"title\"\r\n [ngStyle]=\"{'height': imgHeight}\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\r\n <iframe class=\"youtube\"\r\n *ngIf=\"(type === YOUTUBE && fileUrl) || (type === ANOTHER_VIDEO && videoUrl)\"\r\n [src]=\"(type === YOUTUBE) ? fileUrl : videoUrl\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\r\n frameborder=\"0\"\r\n allow=\"autoplay\"\r\n allowfullscreen></iframe>\r\n <video class=\"video\"\r\n [id]=\"'video_' + imageIndex\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n (click)=\"videoClickHandler($event)\"\r\n [autoplay]=\"videoAutoPlay\"\r\n *ngIf=\"type === VIDEO\"\r\n type=\"video/mp4\"\r\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\r\n controlsList=\"nodownload\">\r\n <source [src]=\"fileUrl\" type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\r\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon cursor-pointer\" [ngStyle]=\"{'height': imgHeight}\"></span>\r\n </div>"
}] }
];
/** @nocollapse */
SliderCustomImageComponent.ctorParameters = () => [
{ type: NgImageSliderService },
{ type: DomSanitizer },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: SliderService }
];
SliderCustomImageComponent.propDecorators = {
showVideo: [{ type: Input }],
videoAutoPlay: [{ type: Input }],
showVideoControls: [{ type: Input }],
currentImageIndex: [{ type: Input }],
imageIndex: [{ type: Input }],
speed: [{ type: Input }],
imageUrl: [{ type: Input }],
isVideo: [{ type: Input }],
alt: [{ type: Input }],
title: [{ type: Input }],
direction: [{ type: Input }],
ratio: [{ type: Input }],
lazy: [{ type: Input }],
imgData: [{ type: Input }],
imgHeight: [{ type: Input }],
getThumbnail: [{ type: Output }],
imagePositionInSlider: [{ type: Input }]
};
if (false) {
/** @type {?} */
SliderCustomImageComponent.prototype.YOUTUBE;
/** @type {?} */
SliderCustomImageComponent.prototype.IMAGE;
/** @type {?} */
SliderCustomImageComponent.prototype.VIDEO;
/** @type {?} */
SliderCustomImageComponent.prototype.ANOTHER_VIDEO;
/** @type {?} */
SliderCustomImageComponent.prototype.fileUrl;
/** @type {?} */
SliderCustomImageComponent.prototype.videoUrl;
/** @type {?} */
SliderCustomImageComponent.prototype.fileExtension;
/** @type {?} */
SliderCustomImageComponent.prototype.type;
/** @type {?} */
SliderCustomImageComponent.prototype.imageLoading;
/** @type {?} */
SliderCustomImageComponent.prototype.wistiaUrl;
/** @type {?} */
SliderCustomImageComponent.prototype.showVideo;
/** @type {?} */
SliderCustomImageComponent.prototype.videoAutoPlay;
/** @type {?} */
SliderCustomImageComponent.prototype.showVideoControls;
/** @type {?} */
SliderCustomImageComponent.prototype.currentImageIndex;
/** @type {?} */
SliderCustomImageComponent.prototype.imageIndex;
/** @type {?} */
SliderCustomImageComponent.prototype.speed;
/** @type {?} */
SliderCustomImageComponent.prototype.imageUrl;
/** @type {?} */
SliderCustomImageComponent.prototype.isVideo;
/** @type {?} */
SliderCustomImageComponent.prototype.alt;
/** @type {?} */
SliderCustomImageComponent.prototype.title;
/** @type {?} */
SliderCustomImageComponent.prototype.direction;
/** @type {?} */
SliderCustomImageComponent.prototype.ratio;
/** @type {?} */
SliderCustomImageComponent.prototype.lazy;
/** @type {?} */
SliderCustomImageComponent.prototype.imgData;
/** @type {?} */
SliderCustomImageComponent.prototype.imgHeight;
/** @type {?} */
SliderCustomImageComponent.prototype.getThumbnail;
/** @type {?} */
SliderCustomImageComponent.prototype.imagePositionInSlider;
/** @type {?} */
SliderCustomImageComponent.prototype.imageSliderService;
/**
* @type {?}
* @private
*/
SliderCustomImageComponent.prototype.sanitizer;
/**
* @type {?}
* @private
*/
SliderCustomImageComponent.prototype.sliderService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1pbWFnZS12aWRlby1nYWxsZXJ5LyIsInNvdXJjZXMiOlsibGliL3NsaWRlci1jdXN0b20taW1hZ2Uvc2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O01BRXJELGFBQWEsR0FBRyxzRUFBc0U7O01BQ3hGLG1CQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDOztNQUNuRCxvQkFBb0IsR0FBRyxDQUFDLEtBQUssQ0FBQzs7TUFDNUIsV0FBVyxHQUFHLHdDQUF3Qzs7TUFDdEQsWUFBWSxHQUFDLDREQUE0RDtBQUsvRSxNQUFNLE9BQU8sMEJBQTBCOzs7Ozs7O0lBK0JuQyxZQUNXLGtCQUF3QyxFQUN2QyxTQUF1QixFQUNiLFFBQVEsRUFBVSxhQUE0QjtRQUZ6RCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBQ3ZDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDSyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWpDcEUsWUFBTyxHQUFHLFNBQVMsQ0FBQztRQUNwQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLFVBQUssR0FBRyxPQUFPLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxlQUFlLENBQUM7UUFDaEMs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QUNILEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDNUI7U0FDSjtJQUNMLENBQUM7OztZQS9KSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLDY0REFBbUQ7YUFDdEQ7Ozs7WUFYUSxvQkFBb0I7WUFEcEIsWUFBWTs0Q0ErQ1osTUFBTSxTQUFDLFFBQVE7WUE3Q2YsYUFBYTs7O3dCQXdCakIsS0FBSzs0QkFDTCxLQUFLO2dDQUNMLEtBQUs7Z0NBQ0wsS0FBSzt5QkFDTCxLQUFLO29CQUNMLEtBQUs7dUJBQ0wsS0FBSztzQkFDTCxLQUFLO2tCQUNMLEtBQUs7b0JBQ0wsS0FBSzt3QkFDTCxLQUFLO29CQUNMLEtBQUs7bUJBQ0wsS0FBSztzQkFDTCxLQUFLO3dCQUNMLEtBQUs7MkJBQ0wsTUFBTTtvQ0FDTixLQUFLOzs7O0lBNUJOLDZDQUFvQjs7SUFDcEIsMkNBQWdCOztJQUNoQiwyQ0FBZ0I7O0lBQ2hCLG1EQUFnQzs7SUFDaEMsNkNBQThCOztJQUM5Qiw4Q0FBK0I7O0lBRS9CLG1EQUFtQjs7SUFDbkIsMENBQWtCOztJQUNsQixrREFBNEI7O0lBQzVCLCtDQUFvQjs7SUFFcEIsK0NBQW9DOztJQUNwQyxtREFBd0M7O0lBQ3hDLHVEQUF1Qzs7SUFDdkMsdURBQW1DOztJQUNuQyxnREFBNEI7O0lBQzVCLDJDQUEyQjs7SUFDM0IsOENBQWtCOztJQUNsQiw2Q0FBeUI7O0lBQ3pCLHlDQUEwQjs7SUFDMUIsMkNBQTRCOztJQUM1QiwrQ0FBbUM7O0lBQ25DLDJDQUFnQzs7SUFDaEMsMENBQStCOztJQUMvQiw2Q0FBaUI7O0lBQ2pCLCtDQUFtQjs7SUFDbkIsa0RBQTJDOztJQUMzQywyREFBK0I7O0lBRzNCLHdEQUErQzs7Ozs7SUFDL0MsK0NBQStCOzs7OztJQUNILG1EQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBJbmplY3QsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBOZ0ltYWdlU2xpZGVyU2VydmljZSB9IGZyb20gJy4vLi4vbmctaW1hZ2Utc2xpZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTbGlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2xpZGVyLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgeW91dHViZVJlZ0V4cCA9IC9eLiooeW91dHUuYmVcXC98dlxcL3x1XFwvXFx3XFwvfGVtYmVkXFwvfHdhdGNoXFw/dj18XFwmdj18XFw/dj0pKFteI1xcJlxcP10qKS4qLyxcclxuICAgIHZhbGlkRmlsZUV4dGVuc2lvbnMgPSBbJ2pwZWcnLCAnanBnJywgJ2dpZicsICdwbmcnXSxcclxuICAgIHZhbGlkVmlkZW9FeHRlbnNpb25zID0gWydtcDQnXTtcclxuY29uc3QgdmltZW9SZWdFeHAgPSAvXFwvXFwvKD86d3d3Lik/dmltZW8uY29tXFwvKFswLTlhLXotX10rKS9pO1xyXG5jb25zdCB3aXN0aWFSZWdFeHA9L2h0dHBzPzpcXC9cXC9bXi5dK1xcLih3aXN0aWFcXC5jb218d2lcXC5zdClcXC8obWVkaWFzfGVtYmVkKVxcLy4qL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3VzdG9tLWltZycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWRlckN1c3RvbUltYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICAgIFlPVVRVQkUgPSAneW91dHViZSc7XHJcbiAgICBJTUFHRSA9ICdpbWFnZSc7XHJcbiAgICBWSURFTyA9ICd2aWRlbyc7XHJcbiAgICBBTk9USEVSX1ZJREVPID0gJ2Fub3RoZXItdmlkZW8nO1xyXG4gICAgZmlsZVVybDogU2FmZVJlc291cmNlVXJsID0gJyc7XHJcbiAgICB2aWRlb1VybDogU2FmZVJlc291cmNlVXJsID0gJyc7XHJcblxyXG4gICAgZmlsZUV4dGVuc2lvbiA9ICcnO1xyXG4gICAgdHlwZSA9IHRoaXMuSU1BR0U7XHJcbiAgICBpbWFnZUxvYWRpbmc6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICB3aXN0aWFVcmw6c3RyaW5nPScnO1xyXG4gICAgLy8gQGlucHV0c1xyXG4gICAgQElucHV0KCkgc2hvd1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSB2aWRlb0F1dG9QbGF5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzaG93VmlkZW9Db250cm9sczogbnVtYmVyID0gMTtcclxuICAgIEBJbnB1dCgpIGN1cnJlbnRJbWFnZUluZGV4OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBpbWFnZUluZGV4OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBzcGVlZDogbnVtYmVyID0gMTtcclxuICAgIEBJbnB1dCgpIGltYWdlVXJsO1xyXG4gICAgQElucHV0KCkgaXNWaWRlbyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgYWx0OiBTdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIHRpdGxlOiBTdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIGRpcmVjdGlvbjogc3RyaW5nID0gJ2x0cic7XHJcbiAgICBASW5wdXQoKSByYXRpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaW1nRGF0YTtcclxuICAgIEBJbnB1dCgpIGltZ0hlaWdodDtcclxuICAgIEBPdXRwdXQoKSBnZXRUaHVtYm5haWw9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBJbnB1dCgpIGltYWdlUG9zaXRpb25JblNsaWRlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgaW1hZ2VTbGlkZXJTZXJ2aWNlOiBOZ0ltYWdlU2xpZGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50LCBwcml2YXRlIHNsaWRlclNlcnZpY2U6IFNsaWRlclNlcnZpY2UpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VVcmxcclxuICAgICAgICAgICAgJiYgdGhpcy5pbWFnZVVybFxyXG4gICAgICAgICAgICAmJiB0aGlzLmltYWdlVXJsXHJcbiAgICAgICAgICAgICYmIHR5cGVvZiAodGhpcy5pbWFnZVVybCkgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICYmIChcclxuICAgICAgICAgICAgICAgIChjaGFuZ2VzLmltYWdlVXJsICYmIGNoYW5nZXMuaW1hZ2VVcmwuZmlyc3RDaGFuZ2UpXHJcbiAgICAgICAgICAgICAgICB8fFxyXG4gICAgICAgICAgICAgICAgKHRoaXMudmlkZW9BdXRvUGxheSlcclxuICAgICAgICAgICAgICAgKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFVybCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRVcmwoKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5pbWFnZVVybDtcclxuICAgICAgICB0aGlzLmltYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5maWxlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XHJcbiAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gdXJsLnNwbGl0KCcuJykucG9wKCkuc3BsaXQoL1xcI3xcXD8vKVswXTtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZVNsaWRlclNlcnZpY2UuYmFzZTY0RmlsZUV4dGVuc2lvbih1cmwpXHJcbiAgICAgICAgJiYgKHZhbGlkRmlsZUV4dGVuc2lvbnMuaW5kZXhPZih0aGlzLmltYWdlU2xpZGVyU2VydmljZS5iYXNlNjRGaWxlRXh0ZW5zaW9uKHVybCkudG9Mb3dlckNhc2UoKSkgPiAtMSBcclxuICAgICAgICB8fCB2YWxpZFZpZGVvRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVFeHRlbnNpb24gPSB0aGlzLmltYWdlU2xpZGVyU2VydmljZS5iYXNlNjRGaWxlRXh0ZW5zaW9uKHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHZlcmlmeSBmb3IgeW91dHViZSB1cmxcclxuICAgICAgICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCh5b3V0dWJlUmVnRXhwKTtcclxuICAgICAgICBjb25zdCBtYXRjaFZpbWVvVXJsID0gdXJsLm1hdGNoKHZpbWVvUmVnRXhwKTtcclxuICAgICAgICBjb25zdCBtYXRjaFdpc3RpYVVybD11cmwubWF0Y2god2lzdGlhUmVnRXhwKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMl0ubGVuZ3RoID09PSAxMSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93VmlkZW8pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuWU9VVFVCRTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChgJHsnaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJ30ke21hdGNoWzJdfSR7dGhpcy52aWRlb0F1dG9QbGF5ID8gJz9hdXRvcGxheT0xJmVuYWJsZWpzYXBpPTEnIDogJz9hdXRvcGxheT0wJmVuYWJsZWpzYXBpPTEnfSR7JyZjb250cm9scz0nfSR7dGhpcy5zaG93VmlkZW9Db250cm9sc31gKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuSU1BR0U7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChgaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkvJHttYXRjaFsyXX0vMC5qcGdgKTtcclxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBibGFjayBiYWNrZ3JvdW5kIGFuZCBnZXQgZnVsbCBzaXplIGhpZ2ggcmVzb3VsdGlvbiBpbWFnZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGBodHRwczovL2ltZy55b3V0dWJlLmNvbS92aS8ke21hdGNoWzJdfS9tYXhyZXNkZWZhdWx0LmpwZ2ApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRodW1uYWlsT2JqZWN0ID0ge2luZGV4OiB0aGlzLmltYWdlUG9zaXRpb25JblNsaWRlciwgaW1hZ2U6IHRoaXMuZmlsZVVybH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGh1bWJuYWlsLmVtaXQodGh1bW5haWxPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFZpbWVvVXJsKSB7ICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVyU2VydmljZS5nZXRvRW1iZWRSZXNwb25zZSgnaHR0cHM6Ly92aW1lby5jb20vYXBpL29lbWJlZC5qc29uP3VybD0nLCB1cmwpLnN1YnNjcmliZShyZXM9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93VmlkZW8pIHtcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5BTk9USEVSX1ZJREVPO1xyXG4gICAgICAgICAgICBsZXQgdmltZW9WaWRlb1VybCA9IGAkeydodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJ30ke3Jlc1sndmlkZW9faWQnXX1gO1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHZpbWVvVmlkZW9VcmwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuSU1BR0U7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9VcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwocmVzWyd0aHVtYm5haWxfdXJsJ10pO1xyXG4gICAgICAgICAgICBsZXQgdGh1bW5haWxPYmplY3QgPSB7aW5kZXg6IHRoaXMuaW1hZ2VQb3NpdGlvbkluU2xpZGVyLCBpbWFnZTogdGhpcy52aWRlb1VybH1cclxuICAgICAgICAgICAgdGhpcy5nZXRUaHVtYm5haWwuZW1pdCh0aHVtbmFpbE9iamVjdCk7XHJcbiAgICAgICAgICAgIFxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodXJsLmluZGV4T2YoJ2h0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlbycpICE9PS0xKXtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLkFOT1RIRVJfVklERU87XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFUNEFBQUNmQ0FNQUFBQlgwVVg5QUFBQWtGQk1WRVgvLy84aklDRWdIUjRkR2hzQUFBQVlGQlVVRHhFYkdCbjgvUHdRQ3cwV0VoUHk4dklhRmhmNCtQZ2ZHeHp0N2Uwek1ERW5KQ1hoNGVIYjI5dWRuSnk4dTdzTUJRam82T2hVVWxOT1RFd3NLU3JMeXN1dXJhMDhPVHBHUTBUVDB0Sm5aV2FFZzRPaG9LQjVkM2l6c3JKd2IyK1ZsSlNOakl4N2VYckN3Y0ZSVDFCYldsck96YzFJUlVZOU96eGtZbU9PRmxaNUFBQU1Va2xFUVZSNG5PMWM2WnFxc0xLVllJQXdDYUtnZ0FNcURtMnI3LzkyQjJTcVl1aDk5djIyZXZzN3RYNUNPbFpXYWs3bzBZaEFJQkFJQkFLQlFDQVFDQVFDZ1VBZ0VBZ0VBb0ZBSUJBSUJBS0JRQ0FRQ0FRQ2dVQWdFUDdIb0dtZmx1RFhRdlBteHlUWmJUNHR4KzlFbElhK1VCVGZuWDFha2w4SVl5OTBKdVZnNCtPbmhmbDE4TlpDcXNER1pMOS9CMi9OcFFaSzhtbDVmaGNtVngyd0o4bEw2OU1TL1NyTWhJVG91eEY5ZndIckxpUDZlRXJaMzEvQWN4bWliM3o0dEVTL0NoRkQ5S2wzVXI2L2dSZEMrbVQ3KzlNQy9TNVlhK0Q3WkhmK2FYbCtHMmFpVmovZElmYitGdGJaVjJUR21Dbjg3ZlRUd3Z4R2ZDZkxNSFN1TSsvVGd2eGFhTlRySXhBSUJNSWdKbE52T3ZtMEVQKy9NVDNNWXE4bmxscFJjbDA3b2JOK3hBWWFIODkya2RFYXJHMnlTVjRqbnpISjhZZGdQL0V1dTFPUzRSUnYzcm5mM3RuaEpuZlRUaEo4dWRwY2xXM0daSk12R21hbTU5QTBUWFVab2NIVFBlUGNQYmNGTndJdmlpS3ZaejFXTU0zZS9HbWxrODB1U2EvTEhOc2tEZ1pHYWROZGVuTk5rK2N3VGZ0Mi9uNVhaaFU3U2w2R01iSEFLekZPTm0vYUEvcXFlaHV2aXZIY2h2ek43L2xUSnE2d2Uyck1rMFZvcWhuWDk2UjFKakk5UGh3engzMC8zSFV3NXVjNzEvVnNEM09ZdWg2ZSsvVGJtcWV1cnN1TnNFeld6YTQydkFMR2ZteVhQeXIyNk1WRG9OYVVYeHhxV0ltb3h2TmxZNzg3dWV3aytLZjZXWEJ5aEtLeVlqMUNqc0hrbTFRWFp0SDZraFZsNExRek9EcEN4ODFacGtoeFo5ejhTM0RjaEh5T2ZFYzdBNTZhU1Q3YzJxM1Nrc2ZNTFNkWWd2SGpXc0RFcitSblNtbGd4cEVqL3RtNFh2Z2s4WFVHMyt4NkpKdWNoT2lRZ3FZcHNGbU0xZTZ3RExiZlpmb2Y0K0tZNEFlVlJuTkdSNzh0VHQ1WDloeDR5cWFueFZqakRBYUw0dVEzV3JjWGJ6c2xzVkhoTFFBbHJIUGFxY1ZPSDNuNVlBNEhhenZUN0IyV2o5UmZ6Ti9CUmJaaHIycC91MkVkNFpWazlJM1lsdFRGMDlGTlVuaDZwSDdsayt3a1dXcERGRW9XMjUxWG9uM2FHYVJtOSs4ck9mWk5WSmlrU2ovSlQ4amhTdytoWTkzR3Z6ZXUzSzJXNmgxaHpIVHVZRE9Sbjg0dndHYk93c25JT3ZvOXExSy84cGwzY3ZlVmZNTlI2M3V0RDdQQ3dqb29CSXV1bUJEOCtqcnl0Tm00TGFOZk9iUEk3b3JQVm1HTGJma3JveSs0NHBOTEprMjFVeDk3MmJxejRidGVoNGJWWk83MmU3TVNlblU2RmR3NjdMVW1GeThMSDFZeTdnZ215aGlvN1pYT3U5eEZ0UjdrOUUzdjdTWFkzNzBVRlM0dU5udGZtUmNnMlVFWk5OeEN5dkplVGJCc1NTa0xZWnZvbWJ4K0VYdVRSeWMyWlB0YXBpNWVLSVQvZy8yVTRPbG9nMkxKa3lUbjFQV2I1YXZOWVNBZTZFQkxZZ1VwT1RPRndNcFkzZ3N4RnBnOVZibk5vcWwzUk83WmY4MVJscmZNbGFhOXpqSVdqSGJPZmhhZm5hNEpZYitsSEtOUTdVemp1a084dTJrM1B5c0E2SXV4MytEU2RyYTdvajBxNkxOU3pKNXlteGNoNVFTZGlYak5EYkJESHJGMFo0V2ovdE03NWVRKzYwdnYxaklpazYyUmN4bEh4OXdCY0RmOG82SVdHRFJLWHROM1Fja0EweCtiVEJUakNuZFNQUE9ySTFaN2tWWUYzUlJLWTE1ZlU3d2xYT2JwSmtpdzUvSlJwYlBEKzZzdjU4WWNhQnFUcDlwZTJHcjZmZWx6OWF3bnhBNjhZVzVsWTBHSTJET1RZajlqcEZGNU9oZGhIZWZicGxoTUFiSE1iWGMyL2cyTXE1TkxZVDNRSnZvb1VtMVFUT1huZkgrM2piN202WVoxZFdOck5PbXFIK1BPV3VyUGFMbTdsbkFNdDUxeTI3UUgyakZSNWZGejRLaVpteFZIMmczTmJTNEFTekVjckw2b0NSUVVFbnNvUWdoVWZpTDYrUGI1N05nODQzblJNY25GQ3pyME1YMFdHTjYxaHovbUo0SHh2Y2I1K3JwYy9RNWxBMzZkSUo4QXEzeWJQZDJod0djN01QSFp3RWs0ak9rdndCbWFyNDY2QmdkSVgxbmc3cHZoalZ1ZXRtTVFLektSTHEyUzdUNnp0Z1BTTXJNMFBRK0ZEYk51U1Jncm9LMytwVE94am9ybUtaejcxZlI5dzcxU29SR01vR09VVjg4VmFrNGpkOU14d0ZZdWxlNHB3N1h0RkpsYXZFSCt2VEpTWE9zd1Vhc1V2Rk9vNURxL1F6OW9YbkV6Ri9xalY5T25RVHRpRG1oSUJ2QXFYOWxWOHNETzFpWGVLR3BsNEx6c0pZejI3YXl3MGxqTGdmVDVSUjF4TVhzNHphY0hYTXRPVnQ4WlMyVDdKcTR0M2tvZjhpdVNBRTRrQmkvc2UxR1ZnaERJbkxwUWpYRUtianVWdjk2Mm5GK3RKNGkrcXVPeWhldHVwZysrbWxtWWxOTnhRWkVIbTB5MnhWQ2FsOU1Yb1o1VjQwVU1tUGJwWlV3QlNZSGFOSlpQT01QaHRWTmN0THFkb3VJVkdhOThmNjdmUTBtbFVrMHlBZEdZOGFkOEtET1cybjA5NUk1TWZLVHc3NEg4Y20xMldZd0ZuRlJlWEFNckJIZnFzWkxKNjFvdFZ6aDArRFd2RWVUMUdVdnhEeGJweVZPOEJWRDR3cWNhQ3hXTmJKMkFvTVRGSGpvZStXY0F3VlN5NjlZUjFBK21sdDRGT2ptL1ZsUUxseWVOQnVNQWtSVTFkUW1BZ25vNUU3bzFiVDZLc2Q2OTBYZFpGRDV5aWh5bjJ1NUt3ZlV3NStVMzEyT1lwZHVWODRPNXUzSXUxMzJFcmZyYXErQWJwL2FxM3ZBTGRuMUtZMlhvZnI3L05EQnN1MFdNMGVhZ1FXdTY1UzllcE9GY05UUDJHN0FtOVVWRkd3QmFmZVhrTG1COWNoVUtMSmlJakd1V0l1VDZnRkVmVzkyaldoTXNWRmlGejVubXlLRTlGYzA3TjAxbnBpK3JuWTF4cGRRS0R0RWJXZ1lRRm5RbDh0ZnpXYkFDbGxUNzVnQ1VLRXlxNDkwQjVTMW0weVA2d2tiZEtOOEVHcXE4ZkQ3RFhHZkpTSEFFaHlLeTJSd2hvNnlQMmEyeUxFR1p4S3NEN3dnSE12WTh2VVhkSUgxYkdjQUJPR1Y1cWZYOVBkSXhwRS95dXNrdkltaCsvUHg4bGlKTHQ0OUhwK2xaMi80ZDhIQkU5SVc0MFQrRjRZcnByK2tZSU15aDRPb2ljemtKNUNtc3JSUVdlUHE1ZXFwQlM0VG1FcUYwMEFlVkZYSjk1WUZZSzhrQng1U3k3K3hnQk1EMHRZSURPaUlzQy9YWEFtMllwQ2NSVkFRbTF6bTlBWTJ4T2RYVVVHbW1OSWtXcXV0WjJCZ1pKcno4aTJWL045QlcrSEtIRlN4R0dRNm16ME5SK1IyMk83SlF1aS9KNktSR2J3NS9wN0JQeCt2dXdqeEVGVVN6R3VTRitCYWNMNkpNWjVnK0ppdDh0WiszRE5CQy9Yam1vTmN3YThuOHhWdHV1c3h3MFlWMDhkRkloNUkxVnZRUXNzV2cvckI4YTZaRi9TcFlHK0JNUnlsVTVORnVMOWhTK0pVY2doWURrOTNWUmNLaTBIRlE0Y3o4UFYrTTlaMUxsbXlzUVAvNWhGclR4VzBKNzRvUHFubVR0bWdvRDRhWEF3NXk5MCtNbHUrVDVPMWwybmI4eGlWeFJLdU85Z0ZISG1wV3EyLzZXSGF5SGppRllNaDVQRnBaOENtNkpHcXJweUlhSmROUVhic0UvZ3ZuS013K1J0RnUxZWx0clZvWlNUQS9PMHIzVm9HNnFQVXp3R2MzeWpzOFg3N1E4OEJwUGJxUE0ya2ZIU2xDZEZZRCtOWlFzem9GTSsxYlA1ZE5KTG9iYUp1bjhzNm1OZDNFNXpzYk9Ec1ZsZnBGK0E2Si83WVAzUTg5aDc0ZEFYQ3BPUURlQkY1RW53RFhqN1RINExVZUJNYkQyeU5ORjh1MVl5dm00TW1UN09SYnBtM08rQ1NQTDk5Mng5VHJQZG5XdDhoM2JBWTlKRml4Qk5JVEdJTmc1TUFka3grbmswMVZWV1c1SlI3RHFpcTcyK1I4ZGZFaHN1eSs3NTlVYUgxSmwzN0YyOWRweVZlQ3dyd0YwZ2REeHhoMGhQOTcrdnFoaGt0OFVzZE1uYXN0aHQrUzhsV1lkYW5SbDYzcnJRUDBpUWRveVVQNlVOTm1ETnFXQS9USi9mZGZPc1BFSWpLR1lsMHRoOUozNWZKbDZKeVZTY3F0M1doc2Y0ZGZ5RGsrdytJTTBRZjdsbVB3dko4K3NZd0hyM2NBOG56bm9PWDE0STlENWZleTF6M1VFVitkTm0wbjhrcjV2WnhkM3NlcS94alJOd0ZySEVOYjZyazl5UHpVR3MyNmw3NWFQeWZ1Y1hXVDVRZisrTnMvMDhaaGxTbmJubGJGdVgxdGpTbEZEMjdUdE9VNFBGc0F0VDMwZmFOWm16Nm1oN202V0VsL0JsQU80c3BYL1gySmxnemVLMlZpOGY1L2JYU0VoN29zNmN2WE4vajJJZE9kVTdtYVExMG1vMVJWYSs3T3duN0xhTHJDZW16SzIyTEIxbm5JS0puS3d5MnNmcldUMnV2L0dKZE9IL2dLeXFydjJETDlQbEFyZ2cveEpabTdhV09vbDJVWitnUnlPbGJpOG1LUk9rb2hkMEIxTW1JVzg2cHcwR1loYjkxaExZYTRpMlA3dHNwaDFVMmpHYmUzbi9udkZNRWkvOEtEeWNKT0JrK25qcjRpMjh5V1RlR3Y4QmNxUnJ4d3gwTFIvUWYraTAyeTRyNVF1RmdqbFRncUl2OWN5VFlWUDN4Y1lGZkFPNGUrTGhjcEpzcy9hRko4ZmZYWTlYMHpOams2UG0vU0ppYnI0L0NIajJ4ZURPdm9tSHE0UFA3ME9jNG11YTFXcTl0MkZuV3RPN2pzVHZ0dDU3OEthWnY1N0xSUEgxaDV2Tk15bTJoOVBWMDZleFVjempmSDVZckMzWEMxM0o3bW04SEtmekpQNzY0WTUvQmxaNWxjUHZyeG9ySDVudjZ4UTJZWS82Z0JuazAwOUdOYTRIMW44RG90bHk0c0w1cm51R3phclMwQ2dVQWdFQWdFQW9GQUlCQUlCQUtCUUNBUUNBUUNnVUFnRUFnRUFvRkFJQkFJQkFLQlFDQVFDQVFDZ1VBZ0VBZ0VBb0ZBSUJBSUJBS0JRUGcvNEQ5MkhjUFBoTkwySkFBQUFBQkpSVTVFcmtKZ2dnPT0nKTtcclxuICAgICAgICAgICAgICAgIGxldCB0aHVtbmFpbE9iamVjdCA9IHtpbmRleDogdGhpcy5pbWFnZVBvc2l0aW9uSW5TbGlkZXIsIGltYWdlOiB0aGlzLnZpZGVvVXJsfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUaHVtYm5haWwuZW1pdCh0aHVtbmFpbE9iamVjdCk7ICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHVybC5pbmRleE9mKCdodHRwczovL3BsYXllcnMuYnJpZ2h0Y292ZS5uZXQvJykgIT09LTEpe1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93VmlkZW8pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuQU5PVEhFUl9WSURFTztcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9VcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuSU1BR0U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCdodHRwczovL2Nkbi5tb3MuY21zLmZ1dHVyZWNkbi5uZXQveG5oQkdyendBSG1iVG15Zld4NlJzTS05NzAtNzUucG5nLndlYnAnKTtcclxuICAgICAgICAgICAgICAgIGxldCB0aHVtbmFpbE9iamVjdCA9IHtpbmRleDogdGhpcy5pbWFnZVBvc2l0aW9uSW5TbGlkZXIsIGltYWdlOiB0aGlzLnZpZGVvVXJsfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUaHVtYm5haWwuZW1pdCh0aHVtbmFpbE9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih1cmwuaW5kZXhPZihtYXRjaFdpc3RpYVVybCkgJiYgdXJsLmluZGV4T2YoJ3dpc3RpYScpICE9PSAtMSl7XHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVyU2VydmljZS5nZXRvRW1iZWRSZXNwb25zZShcImh0dHBzOi8vZmFzdC53aXN0aWEuY29tL29lbWJlZC5qc29uP3VybD1cIix1cmwpLnN1YnNjcmliZShyZXMgPT5cclxuICAgICAgICAgICAgICAgeyBcclxuICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd1ZpZGVvKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLkFOT1RIRVJfVklERU87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aXN0aWFVcmw9dXJsK2A/cmVzdW1hYmxlPWZhbHNlYFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9VcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodGhpcy53aXN0aWFVcmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5JTUFHRTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHJlc1sndGh1bWJuYWlsX3VybCddKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGh1bW5haWxPYmplY3QgPSB7aW5kZXg6IHRoaXMuaW1hZ2VQb3NpdGlvbkluU2xpZGVyLCBpbWFnZTogdGhpcy52aWRlb1VybH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRodW1ibmFpbC5lbWl0KHRodW1uYWlsT2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5maWxlRXh0ZW5zaW9uICYmIHZhbGlkRmlsZUV4dGVuc2lvbnMuaW5kZXhPZih0aGlzLmZpbGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKSkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlRXh0ZW5zaW9uICYmIHZhbGlkVmlkZW9FeHRlbnNpb25zLmluZGV4T2YodGhpcy5maWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5WSURFTztcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlkZW9BdXRvUGxheSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdmlkZW9fJHt0aGlzLmltYWdlSW5kZXh9YCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvT2JqOmFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB2aWRlb18ke3RoaXMuaW1hZ2VJbmRleH1gKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvT2JqLnBsYXkoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMuc3BlZWQgKiAxMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2aWRlb0NsaWNrSGFuZGxlcihldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5zcmNFbGVtZW50ICYmICF0aGlzLnNob3dWaWRlb0NvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zcmNFbGVtZW50LnBhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3JjRWxlbWVudC5wbGF5KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zcmNFbGVtZW50LnBhdXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19