ngx-seo
Version:
This library was generated with [Nx](https://nx.dev).
258 lines • 37.4 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { Meta, Title } from '@angular/platform-browser';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
export var NgxSeoMetaTagAttr;
(function (NgxSeoMetaTagAttr) {
NgxSeoMetaTagAttr["name"] = "name";
NgxSeoMetaTagAttr["property"] = "property";
})(NgxSeoMetaTagAttr || (NgxSeoMetaTagAttr = {}));
export class SeoSocialShareService {
constructor() {
this.metaService = inject(Meta);
this.titleService = inject(Title);
this.document = inject(DOCUMENT);
}
setData(data) {
this.setSection(data.section);
this.setKeywords(data.keywords);
this.setTitle(data.title);
this.setType(data.type);
this.setDescription(data.description);
this.setImage(data.image, data.imageAuxData);
this.setUrl(data.url);
this.setPublished(data.published);
this.setModified(data.modified);
this.setAuthor(data.author);
}
setKeywords(keywords) {
if (keywords) {
this.metaService.updateTag({ name: 'keywords', content: keywords });
}
else {
this.metaService.removeTag(`name='keywords'`);
}
}
setSection(section) {
if (section) {
this.metaService.updateTag({ name: 'article:section', content: section });
}
else {
this.metaService.removeTag(`name='article:section'`);
}
}
setTitle(title = '') {
this.titleService.setTitle(title);
if (title && title.length) {
this.metaService.updateTag({ name: 'twitter:title', content: title });
this.metaService.updateTag({ name: 'twitter:image:alt', content: title });
this.metaService.updateTag({ property: 'og:image:alt', content: title });
this.metaService.updateTag({ property: 'og:title', content: title });
this.metaService.updateTag({ name: 'title', content: title });
this.metaService.updateTag({ itemprop: 'name', content: title }, `itemprop='name'`);
}
else {
this.metaService.removeTag(`name='twitter:title'`);
this.metaService.removeTag(`name='twitter:image:alt'`);
this.metaService.removeTag(`property='og:image:alt'`);
this.metaService.removeTag(`property='og:title'`);
this.metaService.removeTag(`name='title'`);
this.metaService.removeTag(`itemprop='name'`);
}
}
setType(type) {
if (type && type.length) {
this.metaService.updateTag({ property: 'og:type', content: type });
}
else {
this.metaService.removeTag(`property='og:type'`);
}
}
setDescription(description) {
if (description && description.length) {
this.metaService.updateTag({ name: 'twitter:description', content: description });
this.metaService.updateTag({ property: 'og:description', content: description });
this.metaService.updateTag({ name: 'description', content: description });
this.metaService.updateTag({ itemprop: 'description', content: description }, `itemprop='description'`);
}
else {
this.metaService.removeTag(`name='twitter:description'`);
this.metaService.removeTag(`property='og:description'`);
this.metaService.removeTag(`name='description'`);
this.metaService.removeTag(`itemprop='description'`);
}
}
setImage(image, auxData) {
if (image && image.length) {
this.metaService.updateTag({ name: 'twitter:image', content: image });
this.metaService.updateTag({ itemprop: 'image', content: image }, `itemprop='image'`);
this.metaService.updateTag({ property: 'og:image', content: image });
if (auxData && auxData.height) {
this.metaService.updateTag({ property: 'og:image:height', content: auxData.height.toString() });
}
else {
this.metaService.removeTag(`property='og:image:height'`);
}
if (auxData && auxData.width) {
this.metaService.updateTag({ property: 'og:image:width', content: auxData.width.toString() });
}
else {
this.metaService.removeTag(`property='og:image:width'`);
}
if (auxData && auxData.alt) {
this.metaService.updateTag({ property: 'og:image:alt', content: auxData.alt });
this.metaService.updateTag({ property: 'twitter:image:alt', content: auxData.alt });
}
else {
this.metaService.removeTag(`property='og:image:alt'`);
this.metaService.removeTag(`property='twitter:image:alt'`);
}
if (auxData && auxData.mimeType) {
this.metaService.updateTag({ property: 'og:image:type', content: auxData.mimeType });
}
else {
this.metaService.removeTag(`property='og:image:type'`);
}
if (auxData && auxData.secureUrl) {
this.metaService.updateTag({ property: 'og:image:secure_url', content: auxData.secureUrl });
}
else {
this.metaService.removeTag(`property='og:image:secure_url'`);
}
}
else {
this.metaService.removeTag(`name='twitter:image'`);
this.metaService.removeTag(`property='twitter:image:alt'`);
this.metaService.removeTag(`property='og:image'`);
this.metaService.removeTag(`property='og:image:height'`);
this.metaService.removeTag(`property='og:image:secure_url'`);
this.metaService.removeTag(`property='og:image:type'`);
this.metaService.removeTag(`property='og:image:alt'`);
this.metaService.removeTag(`property='og:image:width'`);
this.metaService.removeTag(`itemprop='image'`);
}
}
setUrl(url) {
if (url && url.length) {
this.metaService.updateTag({ property: 'og:url', content: url });
}
else {
this.metaService.removeTag(`property='og:url'`);
}
this.setCanonicalUrl(url);
}
setPublished(publishedDateString) {
if (publishedDateString) {
const publishedDate = new Date(publishedDateString);
this.metaService.updateTag({ name: 'article:published_time', content: publishedDate.toISOString() });
this.metaService.updateTag({ name: 'published_date', content: publishedDate.toISOString() });
}
else {
this.metaService.removeTag(`name='article:published_time'`);
this.metaService.removeTag(`name='publication_date'`);
}
}
setModified(modifiedDateString) {
if (modifiedDateString) {
const modifiedDate = new Date(modifiedDateString);
this.metaService.updateTag({ name: 'article:modified_time', content: modifiedDate.toISOString() });
this.metaService.updateTag({ name: 'og:updated_time', content: modifiedDate.toISOString() });
}
else {
this.metaService.removeTag(`name='article:modified_time'`);
this.metaService.removeTag(`name='og:updated_time'`);
}
}
setAuthor(author) {
if (author && author.length) {
this.metaService.updateTag({ name: 'article:author', content: author });
this.metaService.updateTag({ name: 'author', content: author });
}
else {
this.metaService.removeTag(`name='article:author'`);
this.metaService.removeTag(`name='author'`);
}
}
setTwitterSiteCreator(site) {
if (site) {
this.metaService.updateTag({ name: 'twitter:site', content: site });
this.metaService.updateTag({ name: 'twitter:creator', content: site });
}
else {
this.metaService.removeTag(`name='twitter:site'`);
this.metaService.removeTag(`name='twitter:creator'`);
}
}
setTwitterCard(card) {
if (card) {
this.metaService.updateTag({ name: 'twitter:card', content: card });
}
else {
this.metaService.removeTag(`name='twitter:card'`);
}
}
setFbAppId(appId) {
if (appId) {
this.metaService.updateTag({ property: 'fb:app_id', content: appId });
}
else {
this.metaService.removeTag(`property='fb:app_id'`);
}
}
setMetaTag(metaTag) {
if (metaTag.value) {
const metaTagObject = {
[metaTag.attr]: metaTag.attrValue,
content: metaTag.value,
};
this.metaService.updateTag(metaTagObject);
}
else {
const selector = `${metaTag.attr}='${metaTag.attrValue}'`;
this.metaService.removeTag(selector);
}
}
setMetaTags(metaTags) {
for (const metaTag of metaTags) {
this.setMetaTag(metaTag);
}
}
setLanguageAlternativeUrl(lang, url) {
// first remove potential previous url
const selector = `link[rel='alternate'][hreflang='${lang}']`;
const languageAlternativeElement = this.document.head.querySelector(selector);
if (languageAlternativeElement) {
this.document.head.removeChild(languageAlternativeElement);
}
if (url && url.length) {
const link = this.document.createElement('link');
link.setAttribute('rel', 'alternate');
link.setAttribute('hreflang', lang);
link.setAttribute('href', url);
this.document.head.appendChild(link);
}
}
setCanonicalUrl(url) {
// first remove potential previous url
const selector = `link[rel='canonical']`;
const canonicalElement = this.document.head.querySelector(selector);
if (canonicalElement) {
this.document.head.removeChild(canonicalElement);
}
if (url && url.length) {
const link = this.document.createElement('link');
link.setAttribute('rel', 'canonical');
link.setAttribute('href', url);
this.document.head.appendChild(link);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SeoSocialShareService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SeoSocialShareService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SeoSocialShareService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLXNvY2lhbC1zaGFyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtc2VvL3NyYy9saWIvc2VvLXNvY2lhbC1zaGFyZS9zZW8tc29jaWFsLXNoYXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBSTNDLE1BQU0sQ0FBTixJQUFZLGlCQUdYO0FBSEQsV0FBWSxpQkFBaUI7SUFDM0Isa0NBQWEsQ0FBQTtJQUNiLDBDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBRzVCO0FBV0QsTUFBTSxPQUFPLHFCQUFxQjtJQUhsQztRQUltQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBa1A5QztJQWhQUSxPQUFPLENBQUMsSUFBd0I7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsSUFB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QyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRU0sZUFBZSxDQUFDLEdBQVk7UUFDakMsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxHQUFvQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDOzhHQW5QVSxxQkFBcUI7a0hBQXJCLHFCQUFxQixjQUZwQixNQUFNOzsyRkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXRhLCBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBTZW9Tb2NpYWxTaGFyZURhdGEsIEltYWdlQXV4RGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9zZW8tc29jaWFsLXNoYXJlLWRhdGEnO1xuXG5leHBvcnQgZW51bSBOZ3hTZW9NZXRhVGFnQXR0ciB7XG4gIG5hbWUgPSAnbmFtZScsXG4gIHByb3BlcnR5ID0gJ3Byb3BlcnR5J1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5neFNlb01ldGFUYWcge1xuICBhdHRyOiBOZ3hTZW9NZXRhVGFnQXR0cjtcbiAgYXR0clZhbHVlOiBzdHJpbmc7XG4gIHZhbHVlPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2VvU29jaWFsU2hhcmVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhU2VydmljZSA9IGluamVjdChNZXRhKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2UgPSBpbmplY3QoVGl0bGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICBwdWJsaWMgc2V0RGF0YShkYXRhOiBTZW9Tb2NpYWxTaGFyZURhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnNldFNlY3Rpb24oZGF0YS5zZWN0aW9uKTtcbiAgICB0aGlzLnNldEtleXdvcmRzKGRhdGEua2V5d29yZHMpO1xuICAgIHRoaXMuc2V0VGl0bGUoZGF0YS50aXRsZSk7XG4gICAgdGhpcy5zZXRUeXBlKGRhdGEudHlwZSk7XG4gICAgdGhpcy5zZXREZXNjcmlwdGlvbihkYXRhLmRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLnNldEltYWdlKGRhdGEuaW1hZ2UsIGRhdGEuaW1hZ2VBdXhEYXRhKTtcbiAgICB0aGlzLnNldFVybChkYXRhLnVybCk7XG4gICAgdGhpcy5zZXRQdWJsaXNoZWQoZGF0YS5wdWJsaXNoZWQpO1xuICAgIHRoaXMuc2V0TW9kaWZpZWQoZGF0YS5tb2RpZmllZCk7XG4gICAgdGhpcy5zZXRBdXRob3IoZGF0YS5hdXRob3IpO1xuICB9XG5cbiAgcHVibGljIHNldEtleXdvcmRzKGtleXdvcmRzPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGtleXdvcmRzKSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6ICdrZXl3b3JkcycsIGNvbnRlbnQ6IGtleXdvcmRzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0na2V5d29yZHMnYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlY3Rpb24oc2VjdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6ICdhcnRpY2xlOnNlY3Rpb24nLCBjb250ZW50OiBzZWN0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0nYXJ0aWNsZTpzZWN0aW9uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRUaXRsZSh0aXRsZTogc3RyaW5nID0gJycpOiB2b2lkIHtcbiAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aXRsZSk7XG4gICAgaWYgKHRpdGxlICYmIHRpdGxlLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjp0aXRsZScsIGNvbnRlbnQ6IHRpdGxlIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjppbWFnZTphbHQnLCBjb250ZW50OiB0aXRsZSB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzppbWFnZTphbHQnLCBjb250ZW50OiB0aXRsZSB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzp0aXRsZScsIGNvbnRlbnQ6IHRpdGxlIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndGl0bGUnLCBjb250ZW50OiB0aXRsZSB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgaXRlbXByb3A6ICduYW1lJywgY29udGVudDogdGl0bGUgfSwgYGl0ZW1wcm9wPSduYW1lJ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0ndHdpdHRlcjp0aXRsZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSd0d2l0dGVyOmltYWdlOmFsdCdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBwcm9wZXJ0eT0nb2c6aW1hZ2U6YWx0J2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzp0aXRsZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSd0aXRsZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBpdGVtcHJvcD0nbmFtZSdgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0VHlwZSh0eXBlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgJiYgdHlwZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogdHlwZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzp0eXBlJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgbmFtZTogJ3R3aXR0ZXI6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRlc2NyaXB0aW9uIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAnZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgaXRlbXByb3A6ICdkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRlc2NyaXB0aW9uIH0sIGBpdGVtcHJvcD0nZGVzY3JpcHRpb24nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSd0d2l0dGVyOmRlc2NyaXB0aW9uJ2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzpkZXNjcmlwdGlvbidgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSdkZXNjcmlwdGlvbidgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBpdGVtcHJvcD0nZGVzY3JpcHRpb24nYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEltYWdlKGltYWdlPzogc3RyaW5nLCBhdXhEYXRhPzogSW1hZ2VBdXhEYXRhKTogdm9pZCB7XG4gICAgaWYgKGltYWdlICYmIGltYWdlLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjppbWFnZScsIGNvbnRlbnQ6IGltYWdlIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBpdGVtcHJvcDogJ2ltYWdlJywgY29udGVudDogaW1hZ2UgfSwgYGl0ZW1wcm9wPSdpbWFnZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IGltYWdlIH0pO1xuXG4gICAgICBpZiAoYXV4RGF0YSAmJiBhdXhEYXRhLmhlaWdodCkge1xuICAgICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiAnb2c6aW1hZ2U6aGVpZ2h0JywgY29udGVudDogYXV4RGF0YS5oZWlnaHQudG9TdHJpbmcoKSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBwcm9wZXJ0eT0nb2c6aW1hZ2U6aGVpZ2h0J2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXV4RGF0YSAmJiBhdXhEYXRhLndpZHRoKSB7XG4gICAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzppbWFnZTp3aWR0aCcsIGNvbnRlbnQ6IGF1eERhdGEud2lkdGgudG9TdHJpbmcoKSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBwcm9wZXJ0eT0nb2c6aW1hZ2U6d2lkdGgnYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdXhEYXRhICYmIGF1eERhdGEuYWx0KSB7XG4gICAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzppbWFnZTphbHQnLCBjb250ZW50OiBhdXhEYXRhLmFsdCB9KTtcbiAgICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogJ3R3aXR0ZXI6aW1hZ2U6YWx0JywgY29udGVudDogYXV4RGF0YS5hbHQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgcHJvcGVydHk9J29nOmltYWdlOmFsdCdgKTtcbiAgICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSd0d2l0dGVyOmltYWdlOmFsdCdgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF1eERhdGEgJiYgYXV4RGF0YS5taW1lVHlwZSkge1xuICAgICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiAnb2c6aW1hZ2U6dHlwZScsIGNvbnRlbnQ6IGF1eERhdGEubWltZVR5cGUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgcHJvcGVydHk9J29nOmltYWdlOnR5cGUnYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdXhEYXRhICYmIGF1eERhdGEuc2VjdXJlVXJsKSB7XG4gICAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzppbWFnZTpzZWN1cmVfdXJsJywgY29udGVudDogYXV4RGF0YS5zZWN1cmVVcmwgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgcHJvcGVydHk9J29nOmltYWdlOnNlY3VyZV91cmwnYCk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYG5hbWU9J3R3aXR0ZXI6aW1hZ2UnYCk7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgcHJvcGVydHk9J3R3aXR0ZXI6aW1hZ2U6YWx0J2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzppbWFnZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBwcm9wZXJ0eT0nb2c6aW1hZ2U6aGVpZ2h0J2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzppbWFnZTpzZWN1cmVfdXJsJ2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzppbWFnZTp0eXBlJ2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzppbWFnZTphbHQnYCk7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgcHJvcGVydHk9J29nOmltYWdlOndpZHRoJ2ApO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYGl0ZW1wcm9wPSdpbWFnZSdgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0VXJsKHVybD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh1cmwgJiYgdXJsLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogJ29nOnVybCcsIGNvbnRlbnQ6IHVybCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdvZzp1cmwnYCk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2Fub25pY2FsVXJsKHVybCk7XG4gIH1cblxuICBwdWJsaWMgc2V0UHVibGlzaGVkKHB1Ymxpc2hlZERhdGVTdHJpbmc/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocHVibGlzaGVkRGF0ZVN0cmluZykge1xuICAgICAgY29uc3QgcHVibGlzaGVkRGF0ZSA9IG5ldyBEYXRlKHB1Ymxpc2hlZERhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAnYXJ0aWNsZTpwdWJsaXNoZWRfdGltZScsIGNvbnRlbnQ6IHB1Ymxpc2hlZERhdGUudG9JU09TdHJpbmcoKSB9KTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgbmFtZTogJ3B1Ymxpc2hlZF9kYXRlJywgY29udGVudDogcHVibGlzaGVkRGF0ZS50b0lTT1N0cmluZygpIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0nYXJ0aWNsZTpwdWJsaXNoZWRfdGltZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSdwdWJsaWNhdGlvbl9kYXRlJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNb2RpZmllZChtb2RpZmllZERhdGVTdHJpbmc/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobW9kaWZpZWREYXRlU3RyaW5nKSB7XG4gICAgICBjb25zdCBtb2RpZmllZERhdGUgPSBuZXcgRGF0ZShtb2RpZmllZERhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAnYXJ0aWNsZTptb2RpZmllZF90aW1lJywgY29udGVudDogbW9kaWZpZWREYXRlLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6ICdvZzp1cGRhdGVkX3RpbWUnLCBjb250ZW50OiBtb2RpZmllZERhdGUudG9JU09TdHJpbmcoKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYG5hbWU9J2FydGljbGU6bW9kaWZpZWRfdGltZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSdvZzp1cGRhdGVkX3RpbWUnYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEF1dGhvcihhdXRob3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoYXV0aG9yICYmIGF1dGhvci5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgbmFtZTogJ2FydGljbGU6YXV0aG9yJywgY29udGVudDogYXV0aG9yIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAnYXV0aG9yJywgY29udGVudDogYXV0aG9yIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0nYXJ0aWNsZTphdXRob3InYCk7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0nYXV0aG9yJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRUd2l0dGVyU2l0ZUNyZWF0b3Ioc2l0ZT86IHN0cmluZyk6IHZvaWQge1xuICAgaWYoc2l0ZSl7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiBzaXRlIH0pO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjpjcmVhdG9yJywgY29udGVudDogc2l0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYG5hbWU9J3R3aXR0ZXI6c2l0ZSdgKTtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UucmVtb3ZlVGFnKGBuYW1lPSd0d2l0dGVyOmNyZWF0b3InYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFR3aXR0ZXJDYXJkKGNhcmQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY2FyZCl7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyh7IG5hbWU6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiBjYXJkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT0ndHdpdHRlcjpjYXJkJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRGYkFwcElkKGFwcElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGFwcElkKXtcbiAgICAgIHRoaXMubWV0YVNlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdmYjphcHBfaWQnLCBjb250ZW50OiBhcHBJZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoYHByb3BlcnR5PSdmYjphcHBfaWQnYCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE1ldGFUYWcobWV0YVRhZzogTmd4U2VvTWV0YVRhZyk6IHZvaWQge1xuICAgIGlmIChtZXRhVGFnLnZhbHVlKXtcbiAgICAgIGNvbnN0IG1ldGFUYWdPYmplY3QgPSB7XG4gICAgICAgIFttZXRhVGFnLmF0dHJdOiBtZXRhVGFnLmF0dHJWYWx1ZSxcbiAgICAgICAgY29udGVudDogbWV0YVRhZy52YWx1ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLm1ldGFTZXJ2aWNlLnVwZGF0ZVRhZyhtZXRhVGFnT2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgJHttZXRhVGFnLmF0dHJ9PScke21ldGFUYWcuYXR0clZhbHVlfSdgO1xuICAgICAgdGhpcy5tZXRhU2VydmljZS5yZW1vdmVUYWcoc2VsZWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNZXRhVGFncyhtZXRhVGFnczogTmd4U2VvTWV0YVRhZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBtZXRhVGFnIG9mIG1ldGFUYWdzKSB7XG4gICAgICB0aGlzLnNldE1ldGFUYWcobWV0YVRhZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldExhbmd1YWdlQWx0ZXJuYXRpdmVVcmwobGFuZzogc3RyaW5nLCB1cmw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBmaXJzdCByZW1vdmUgcG90ZW50aWFsIHByZXZpb3VzIHVybFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYGxpbmtbcmVsPSdhbHRlcm5hdGUnXVtocmVmbGFuZz0nJHtsYW5nfSddYDtcbiAgICBjb25zdCBsYW5ndWFnZUFsdGVybmF0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBpZiAobGFuZ3VhZ2VBbHRlcm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChsYW5ndWFnZUFsdGVybmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHVybCAmJiB1cmwubGVuZ3RoKSB7XG4gICAgICBjb25zdCBsaW5rOiBIVE1MTGlua0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnYWx0ZXJuYXRlJyk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZmxhbmcnLCBsYW5nKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0Q2Fub25pY2FsVXJsKHVybD86IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGZpcnN0IHJlbW92ZSBwb3RlbnRpYWwgcHJldmlvdXMgdXJsXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgbGlua1tyZWw9J2Nhbm9uaWNhbCddYDtcbiAgICBjb25zdCBjYW5vbmljYWxFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGlmIChjYW5vbmljYWxFbGVtZW50KSB7XG4gICAgICB0aGlzLmRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoY2Fub25pY2FsRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHVybCAmJiB1cmwubGVuZ3RoKSB7XG4gICAgICBjb25zdCBsaW5rOiBIVE1MTGlua0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnY2Fub25pY2FsJyk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==