angular-embed-video
Version:
> Get embed code for embedding youtube/vimeo/dailymotion/\* video in websites from URL or ID in Angular 6+. > Currently supports YouTube, Vimeo and Dailymotion. Feel free to make pull request to add others!
191 lines • 24.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "@angular/platform-browser";
export class AngularEmbedVideoService {
constructor(http, sanitizer) {
this.http = http;
this.sanitizer = sanitizer;
this.validYouTubeOptions = [
'default',
'mqdefault',
'hqdefault',
'sddefault',
'maxresdefault'
];
this.validVimeoOptions = [
'thumbnail_small',
'thumbnail_medium',
'thumbnail_large'
];
this.validDailyMotionOptions = [
'thumbnail_60_url',
'thumbnail_120_url',
'thumbnail_180_url',
'thumbnail_240_url',
'thumbnail_360_url',
'thumbnail_480_url',
'thumbnail_720_url',
'thumbnail_1080_url'
];
}
embed(url, options) {
let id;
url = new URL(url);
id = this.detectYoutube(url);
if (id) {
return this.embed_youtube(id, options);
}
id = this.detectVimeo(url);
if (id) {
return this.embed_vimeo(id, options);
}
id = this.detectDailymotion(url);
if (id) {
return this.embed_dailymotion(id, options);
}
}
embed_youtube(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://www.youtube.com/embed/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" allowfullscreen></iframe>');
}
embed_vimeo(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://player.vimeo.com/video/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>');
}
embed_dailymotion(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://www.dailymotion.com/embed/video/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" allowfullscreen></iframe>');
}
embed_image(url, options) {
let id;
url = new URL(url);
id = this.detectYoutube(url);
if (id) {
return this.embed_youtube_image(id, options);
}
id = this.detectVimeo(url);
if (id) {
return this.embed_vimeo_image(id, options);
}
id = this.detectDailymotion(url);
if (id) {
return this.embed_dailymotion_image(id, options);
}
}
embed_youtube_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validYouTubeOptions.includes(options.image) ? options.image : 'default';
let src = 'https://img.youtube.com/vi/' + id + '/' + options.image + '.jpg';
let result = {
link: src,
html: '<img src="' + src + '"/>'
};
return Promise.resolve(result).then(value => value);
}
embed_vimeo_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validVimeoOptions.indexOf(options.image) >= 0 ? options.image : 'thumbnail_large';
return this.http.get('https://vimeo.com/api/v2/video/' + id + '.json').pipe(map((res) => {
return {
'link': res[0][options.image],
'html': '<img src="' + res[0][options.image] + '"/>'
};
}))
.toPromise()
.catch(error => console.log(error));
}
embed_dailymotion_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validDailyMotionOptions.indexOf(options.image) >= 0 ? options.image : 'thumbnail_480_url';
return this.http.get('https://api.dailymotion.com/video/' + id + '?fields=' + options.image)
.pipe(map((res) => {
return {
'link': res[options.image],
'html': '<img src="' + res[options.image] + '"/>'
};
}))
.toPromise()
.catch(error => console.log(error));
}
parseOptions(options) {
let queryString = '', attributes = '';
if (options && options.hasOwnProperty('query')) {
queryString = '?' + this.serializeQuery(options.query);
}
if (options && options.hasOwnProperty('attr')) {
let temp = [];
Object.keys(options.attr).forEach(function (key) {
temp.push(key + '="' + (options.attr[key]) + '"');
});
attributes = ' ' + temp.join(' ');
}
return {
query: queryString,
attr: attributes
};
}
serializeQuery(query) {
let queryString = [];
for (let p in query) {
if (query.hasOwnProperty(p)) {
queryString.push(encodeURIComponent(p) + '=' + encodeURIComponent(query[p]));
}
}
return queryString.join('&');
}
sanitize_iframe(iframe) {
return this.sanitizer.bypassSecurityTrustHtml(iframe);
}
detectVimeo(url) {
return (url.hostname === 'vimeo.com') ? url.pathname.split('/')[1] : null;
}
detectYoutube(url) {
if (url.hostname.indexOf('youtube.com') > -1) {
let video_id = url.search.split('v=')[1];
const ampersandPosition = video_id.indexOf('&');
if (ampersandPosition != -1) {
video_id = video_id.substring(0, ampersandPosition);
}
return video_id;
}
if (url.hostname === 'youtu.be') {
return url.pathname.split('/')[1];
}
return '';
}
detectDailymotion(url) {
if (url.hostname.indexOf('dailymotion.com') > -1) {
return url.pathname.split('/')[2].split('_')[0];
}
if (url.hostname === 'dai.ly') {
return url.pathname.split('/')[1];
}
return '';
}
}
AngularEmbedVideoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularEmbedVideoService, deps: [{ token: i1.HttpClient }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Injectable });
AngularEmbedVideoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularEmbedVideoService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularEmbedVideoService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.DomSanitizer }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lbWJlZC12aWRlby5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1lbWJlZC12aWRlby9zcmMvbGliL2FuZ3VsYXItZW1iZWQtdmlkZW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7OztBQUtwQyxNQUFNLE9BQU8sd0JBQXdCO0lBeUJuQyxZQUNVLElBQWdCLEVBQ2hCLFNBQXVCO1FBRHZCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXpCekIsd0JBQW1CLEdBQUc7WUFDNUIsU0FBUztZQUNULFdBQVc7WUFDWCxXQUFXO1lBQ1gsV0FBVztZQUNYLGVBQWU7U0FDaEIsQ0FBQztRQUNNLHNCQUFpQixHQUFHO1lBQzFCLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsaUJBQWlCO1NBQ2xCLENBQUM7UUFDTSw0QkFBdUIsR0FBRztZQUNoQyxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsb0JBQW9CO1NBQ3JCLENBQUM7SUFNRixDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQVEsRUFBRSxPQUFhO1FBQ2xDLElBQUksRUFBRSxDQUFDO1FBQ1AsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksRUFBRSxFQUFFO1lBQ04sT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN4QztRQUVE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cUhBaE9VLHdCQUF3Qjt5SEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRW1iZWRWaWRlb1NlcnZpY2Uge1xuXG4gIHByaXZhdGUgdmFsaWRZb3VUdWJlT3B0aW9ucyA9IFtcbiAgICAnZGVmYXVsdCcsXG4gICAgJ21xZGVmYXVsdCcsXG4gICAgJ2hxZGVmYXVsdCcsXG4gICAgJ3NkZGVmYXVsdCcsXG4gICAgJ21heHJlc2RlZmF1bHQnXG4gIF07XG4gIHByaXZhdGUgdmFsaWRWaW1lb09wdGlvbnMgPSBbXG4gICAgJ3RodW1ibmFpbF9zbWFsbCcsXG4gICAgJ3RodW1ibmFpbF9tZWRpdW0nLFxuICAgICd0aHVtYm5haWxfbGFyZ2UnXG4gIF07XG4gIHByaXZhdGUgdmFsaWREYWlseU1vdGlvbk9wdGlvbnMgPSBbXG4gICAgJ3RodW1ibmFpbF82MF91cmwnLFxuICAgICd0aHVtYm5haWxfMTIwX3VybCcsXG4gICAgJ3RodW1ibmFpbF8xODBfdXJsJyxcbiAgICAndGh1bWJuYWlsXzI0MF91cmwnLFxuICAgICd0aHVtYm5haWxfMzYwX3VybCcsXG4gICAgJ3RodW1ibmFpbF80ODBfdXJsJyxcbiAgICAndGh1bWJuYWlsXzcyMF91cmwnLFxuICAgICd0aHVtYm5haWxfMTA4MF91cmwnXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZW1iZWQodXJsOiBhbnksIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGxldCBpZDtcbiAgICB1cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZCA9IHRoaXMuZGV0ZWN0WW91dHViZSh1cmwpO1xuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW1iZWRfeW91dHViZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdFZpbWVvKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF92aW1lbyhpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdERhaWx5bW90aW9uKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF9kYWlseW1vdGlvbihpZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtYmVkX3lvdXR1YmUoaWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IHN0cmluZyB7XG4gICAgb3B0aW9ucyA9IHRoaXMucGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVfaWZyYW1lKCc8aWZyYW1lIHNyYz1cImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLydcbiAgICAgICsgaWQgKyBvcHRpb25zLnF1ZXJ5ICsgJ1wiJyArIG9wdGlvbnMuYXR0clxuICAgICAgKyAnIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWJlZF92aW1lbyhpZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogc3RyaW5nIHtcbiAgICBvcHRpb25zID0gdGhpcy5wYXJzZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZV9pZnJhbWUoJzxpZnJhbWUgc3JjPVwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLydcbiAgICAgICsgaWQgKyBvcHRpb25zLnF1ZXJ5ICsgJ1wiJyArIG9wdGlvbnMuYXR0clxuICAgICAgKyAnIGZyYW1lYm9yZGVyPVwiMFwiIHdlYmtpdGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicpO1xuICB9XG5cbiAgcHVibGljIGVtYmVkX2RhaWx5bW90aW9uKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBzdHJpbmcge1xuICAgIG9wdGlvbnMgPSB0aGlzLnBhcnNlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLnNhbml0aXplX2lmcmFtZSgnPGlmcmFtZSBzcmM9XCJodHRwczovL3d3dy5kYWlseW1vdGlvbi5jb20vZW1iZWQvdmlkZW8vJ1xuICAgICAgKyBpZCArIG9wdGlvbnMucXVlcnkgKyAnXCInICsgb3B0aW9ucy5hdHRyXG4gICAgICArICcgZnJhbWVib3JkZXI9XCIwXCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicpO1xuICB9XG5cbiAgcHVibGljIGVtYmVkX2ltYWdlKHVybDogYW55LCBvcHRpb25zPzogYW55KTogYW55IHtcbiAgICBsZXQgaWQ7XG5cbiAgICB1cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZCA9IHRoaXMuZGV0ZWN0WW91dHViZSh1cmwpO1xuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW1iZWRfeW91dHViZV9pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdFZpbWVvKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF92aW1lb19pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdERhaWx5bW90aW9uKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF9kYWlseW1vdGlvbl9pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWJlZF95b3V0dWJlX2ltYWdlKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIG9wdGlvbnMuaW1hZ2UgPSB0aGlzLnZhbGlkWW91VHViZU9wdGlvbnMuaW5jbHVkZXMob3B0aW9ucy5pbWFnZSkgPyBvcHRpb25zLmltYWdlIDogJ2RlZmF1bHQnO1xuXG4gICAgbGV0IHNyYyA9ICdodHRwczovL2ltZy55b3V0dWJlLmNvbS92aS8nICsgaWQgKyAnLycgKyBvcHRpb25zLmltYWdlICsgJy5qcGcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGxpbms6IHNyYyxcbiAgICAgIGh0bWw6ICc8aW1nIHNyYz1cIicgKyBzcmMgKyAnXCIvPidcbiAgICB9O1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4odmFsdWUgPT4gdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWJlZF92aW1lb19pbWFnZShpZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIG9wdGlvbnMuaW1hZ2UgPSB0aGlzLnZhbGlkVmltZW9PcHRpb25zLmluZGV4T2Yob3B0aW9ucy5pbWFnZSkgPj0gMCA/IG9wdGlvbnMuaW1hZ2UgOiAndGh1bWJuYWlsX2xhcmdlJztcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KCdodHRwczovL3ZpbWVvLmNvbS9hcGkvdjIvdmlkZW8vJyArIGlkICsgJy5qc29uJykucGlwZShtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnbGluayc6IHJlc1swXVtvcHRpb25zLmltYWdlXSxcbiAgICAgICAgJ2h0bWwnOiAnPGltZyBzcmM9XCInICsgcmVzWzBdW29wdGlvbnMuaW1hZ2VdICsgJ1wiLz4nXG4gICAgICB9O1xuICAgIH0pKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1iZWRfZGFpbHltb3Rpb25faW1hZ2UoaWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBvcHRpb25zLmltYWdlID0gdGhpcy52YWxpZERhaWx5TW90aW9uT3B0aW9ucy5pbmRleE9mKG9wdGlvbnMuaW1hZ2UpID49IDAgPyBvcHRpb25zLmltYWdlIDogJ3RodW1ibmFpbF80ODBfdXJsJztcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KCdodHRwczovL2FwaS5kYWlseW1vdGlvbi5jb20vdmlkZW8vJyArIGlkICsgJz9maWVsZHM9JyArIG9wdGlvbnMuaW1hZ2UpXG4gICAgICAucGlwZShtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ2xpbmsnOiByZXNbb3B0aW9ucy5pbWFnZV0sXG4gICAgICAgICAgJ2h0bWwnOiAnPGltZyBzcmM9XCInICsgcmVzW29wdGlvbnMuaW1hZ2VdICsgJ1wiLz4nXG4gICAgICAgIH07XG4gICAgICB9KSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBhbnkge1xuICAgIGxldCBxdWVyeVN0cmluZyA9ICcnLFxuICAgICAgYXR0cmlidXRlcyA9ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgncXVlcnknKSkge1xuICAgICAgcXVlcnlTdHJpbmcgPSAnPycgKyB0aGlzLnNlcmlhbGl6ZVF1ZXJ5KG9wdGlvbnMucXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2F0dHInKSkge1xuICAgICAgbGV0IHRlbXAgPSA8YW55PltdO1xuXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmF0dHIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0ZW1wLnB1c2goa2V5ICsgJz1cIicgKyAob3B0aW9ucy5hdHRyW2tleV0pICsgJ1wiJyk7XG4gICAgICB9KTtcblxuICAgICAgYXR0cmlidXRlcyA9ICcgJyArIHRlbXAuam9pbignICcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnk6IHF1ZXJ5U3RyaW5nLFxuICAgICAgYXR0cjogYXR0cmlidXRlc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZVF1ZXJ5KHF1ZXJ5OiBhbnkpOiBhbnkge1xuICAgIGxldCBxdWVyeVN0cmluZzogYW55ID0gW107XG5cbiAgICBmb3IgKGxldCBwIGluIHF1ZXJ5KSB7XG4gICAgICBpZiAocXVlcnkuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgcXVlcnlTdHJpbmcucHVzaChlbmNvZGVVUklDb21wb25lbnQocCkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocXVlcnlbcF0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlTdHJpbmcuam9pbignJicpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYW5pdGl6ZV9pZnJhbWUoaWZyYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChpZnJhbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RWaW1lbyh1cmw6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh1cmwuaG9zdG5hbWUgPT09ICd2aW1lby5jb20nKSA/IHVybC5wYXRobmFtZS5zcGxpdCgnLycpWzFdIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0WW91dHViZSh1cmw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHVybC5ob3N0bmFtZS5pbmRleE9mKCd5b3V0dWJlLmNvbScpID4gLTEpIHtcblx0XHRcdGxldCB2aWRlb19pZCA9IHVybC5zZWFyY2guc3BsaXQoJ3Y9JylbMV07XG5cdFx0XHRjb25zdCBhbXBlcnNhbmRQb3NpdGlvbiA9IHZpZGVvX2lkLmluZGV4T2YoJyYnKTtcblx0XHRcdGlmKGFtcGVyc2FuZFBvc2l0aW9uICE9IC0xKSB7XG5cdFx0XHRcdHZpZGVvX2lkID0gdmlkZW9faWQuc3Vic3RyaW5nKDAsIGFtcGVyc2FuZFBvc2l0aW9uKTtcblx0XHRcdH1cblxuICAgICAgcmV0dXJuIHZpZGVvX2lkO1xuICAgIH1cblxuICAgIGlmICh1cmwuaG9zdG5hbWUgPT09ICd5b3V0dS5iZScpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aG5hbWUuc3BsaXQoJy8nKVsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdERhaWx5bW90aW9uKHVybDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodXJsLmhvc3RuYW1lLmluZGV4T2YoJ2RhaWx5bW90aW9uLmNvbScpID4gLTEpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aG5hbWUuc3BsaXQoJy8nKVsyXS5zcGxpdCgnXycpWzBdO1xuICAgIH1cblxuICAgIGlmICh1cmwuaG9zdG5hbWUgPT09ICdkYWkubHknKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iXX0=