@singleton-i18n/angular-client
Version:
Singleton client code for Angular 10.
147 lines • 18.3 kB
JavaScript
/*
* Copyright 2019-2021 VMware, Inc.
* SPDX-License-Identifier: EPL-2.0
*/
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { isDefined } from '../util';
import { VIPServiceConstants } from '../constants';
import { LanguageMap } from '../data/language.map';
import { I18nContext } from './i18n.context';
import * as i0 from "@angular/core";
import * as i1 from "./i18n.context";
export class LocaleService {
/**
* by default, the initial locale is en-US.
*/
constructor(i18nContext) {
this.i18nContext = i18nContext;
/**
* Fired when user changed current locale.
* Return the combination of language and region.
*/
this.userLocaleChanged = new Subject();
this.defaultLocale = VIPServiceConstants.ENGLISH;
this.setLocale(this.defaultLocale.languageCode, this.defaultLocale.regionCode);
}
/**
* initialize language and region combination at app bootstrap.
* @param language language code for translation and plural rule.
* @param region region code for the l2 formatting patterns.
*/
init(language, region) {
if (isDefined(language)) {
this.setLocale(language, region);
this.i18nContext.preferredLanguage = language;
}
if (isDefined(region)) {
this.i18nContext.preferredRegion = region;
}
}
/**
* set default locale and initialize current language and current region.
* this should be executed when the application start.
* @param defaultLocale will be used as fallback locale.
*/
setDefaultLocale(defaultLocale) {
this.defaultLocale = defaultLocale || this.defaultLocale;
this.setLocale(this.defaultLocale.languageCode, this.defaultLocale.regionCode);
}
setLocale(language, region) {
if (language !== this.currentLanguage ||
region !== this.currentRegion) {
this.currentLanguage = language;
this.currentRegion = region;
}
}
getCurrentLanguage() {
return this.currentLanguage;
}
setCurrentLanguage(currentLang) {
if (currentLang !== this.currentLanguage) {
this.currentLanguage = currentLang;
this.sendUserLocaleEvent();
}
}
getCurrentRegion() {
return this.currentRegion;
}
setCurrentRegion(currentRegion) {
if (currentRegion !== this.currentRegion) {
this.currentRegion = currentRegion;
this.sendUserLocaleEvent();
}
}
getCurrentLocale() {
return this.composeLocale(this.currentLanguage, this.currentRegion);
}
/**
* set current language and region combination at runtime.
* and notify VIP service to load corresponding i18n resource.
* @param language language code for translation and plural rule.
* @param region region code for the l2 formatting patterns.
*/
setCurrentLocale(language, region) {
this.setLocale(language, region);
this.sendUserLocaleEvent();
}
/**
* compose the sample locale structure based on the current usage scenarios.
* @param language language code for translation and plural rule.
* @param region region code for the l2 formatting patterns.
*/
composeLocale(language, region) {
return language && region ?
`${language}-${region}` : language;
}
sendUserLocaleEvent() {
this.userLocaleChanged.next(this.getCurrentLocale());
}
get isSourceLocale() {
return this.shouldSourceLocale(this.currentLanguage, this.currentRegion);
}
shouldSourceLocale(language, region) {
return this.shouldSourceLanguage(language)
&& isDefined(region)
&& region.toUpperCase() === this.defaultLocale.regionCode ? true
: this.shouldSourceLanguage(language) && !isDefined(region) ? true
: false;
}
resolveLanguageTag(language) {
if (!isDefined(language)) {
return language;
}
return language.split('_').join('-').toLocaleLowerCase();
}
get isSourceLanguage() {
return this.shouldSourceLanguage(this.currentLanguage);
}
shouldSourceLanguage(language) {
return language.toLowerCase() === this.defaultLocale.languageName ? true
: this.defaultLocale.languageCode.toLowerCase() === this.resolveLanguageTag(language) ? true
: `${this.defaultLocale.languageCode}-${this.defaultLocale.regionCode}`.toLowerCase()
=== this.resolveLanguageTag(language) ? true
: false;
}
/**
* Reserve interface for language tag normalization in bundle mode.
* @param language language code for translation and plural rule.
*/
normalizeLanguageCode(language) {
const lang = language.replace('_', '-').toLowerCase();
if (LanguageMap[lang]) {
return LanguageMap[lang][0];
}
return language;
}
}
LocaleService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocaleService_Factory() { return new LocaleService(i0.ɵɵinject(i1.I18nContext)); }, token: LocaleService, providedIn: "root" });
LocaleService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
},] }
];
LocaleService.ctorParameters = () => [
{ type: I18nContext }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcmxpZ2VuZy9Qcm9qZWN0cy9EZXZvcHMvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3ZpcC9jaS9wdWIyb3JnL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy9zaW5nbGV0b24vcHJvamVjdHMvYW5ndWxhci1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvc2VydmljZXMvbG9jYWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVc3QyxNQUFNLE9BQU8sYUFBYTtJQVd0Qjs7T0FFRztJQUNILFlBQ2MsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFidEM7OztXQUdHO1FBQ0ksc0JBQWlCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDM0Qsa0JBQWEsR0FBWSxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFVeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxRQUFnQixFQUFFLE1BQWU7UUFDekMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxR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QUFFO1lBQ25CLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzs7OztZQXRKSixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQVZRLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTktMjAyMSBWTXdhcmUsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgVklQU2VydmljZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMYW5ndWFnZU1hcCB9IGZyb20gJy4uL2RhdGEvbGFuZ3VhZ2UubWFwJztcbmltcG9ydCB7IEkxOG5Db250ZXh0IH0gZnJvbSAnLi9pMThuLmNvbnRleHQnO1xuZXhwb3J0IGludGVyZmFjZSBWTG9jYWxlIHtcbiAgICByZWFkb25seSBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICByZWFkb25seSBsYW5ndWFnZU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSByZWdpb25Db2RlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcmVnaW9uTmFtZTogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbGVTZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBjaGFuZ2VkIGN1cnJlbnQgbG9jYWxlLlxuICAgICAqIFJldHVybiB0aGUgY29tYmluYXRpb24gb2YgbGFuZ3VhZ2UgYW5kIHJlZ2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckxvY2FsZUNoYW5nZWQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgZGVmYXVsdExvY2FsZTogVkxvY2FsZSA9IFZJUFNlcnZpY2VDb25zdGFudHMuRU5HTElTSDtcbiAgICBwcml2YXRlIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY3VycmVudFJlZ2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogYnkgZGVmYXVsdCwgdGhlIGluaXRpYWwgbG9jYWxlIGlzIGVuLVVTLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgaTE4bkNvbnRleHQ6IEkxOG5Db250ZXh0LFxuICAgICkge1xuICAgICAgICB0aGlzLnNldExvY2FsZSh0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VDb2RlLFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0TG9jYWxlLnJlZ2lvbkNvZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGluaXRpYWxpemUgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiBjb21iaW5hdGlvbiBhdCBhcHAgYm9vdHN0cmFwLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICogQHBhcmFtIHJlZ2lvbiByZWdpb24gY29kZSBmb3IgdGhlIGwyIGZvcm1hdHRpbmcgcGF0dGVybnMuXG4gICAgICovXG4gICAgcHVibGljIGluaXQobGFuZ3VhZ2U6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpc0RlZmluZWQobGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsZShsYW5ndWFnZSwgcmVnaW9uKTtcbiAgICAgICAgICAgIHRoaXMuaTE4bkNvbnRleHQucHJlZmVycmVkTGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWZpbmVkKHJlZ2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bkNvbnRleHQucHJlZmVycmVkUmVnaW9uID0gcmVnaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0IGRlZmF1bHQgbG9jYWxlIGFuZCBpbml0aWFsaXplIGN1cnJlbnQgbGFuZ3VhZ2UgYW5kIGN1cnJlbnQgcmVnaW9uLlxuICAgICAqIHRoaXMgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0LlxuICAgICAqIEBwYXJhbSBkZWZhdWx0TG9jYWxlIHdpbGwgYmUgdXNlZCBhcyBmYWxsYmFjayBsb2NhbGUuXG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRMb2NhbGUoZGVmYXVsdExvY2FsZTogVkxvY2FsZSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlIHx8IHRoaXMuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbGUodGhpcy5kZWZhdWx0TG9jYWxlLmxhbmd1YWdlQ29kZSxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZS5yZWdpb25Db2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExvY2FsZShsYW5ndWFnZTogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGxhbmd1YWdlICE9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSB8fFxuICAgICAgICAgICAgcmVnaW9uICE9PSB0aGlzLmN1cnJlbnRSZWdpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSByZWdpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudExhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYW5ndWFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudExhbmd1YWdlKGN1cnJlbnRMYW5nOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSBjdXJyZW50TGFuZztcbiAgICAgICAgICAgIHRoaXMuc2VuZFVzZXJMb2NhbGVFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRSZWdpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlZ2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudFJlZ2lvbihjdXJyZW50UmVnaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZWdpb24gIT09IHRoaXMuY3VycmVudFJlZ2lvbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbjtcbiAgICAgICAgICAgIHRoaXMuc2VuZFVzZXJMb2NhbGVFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zZUxvY2FsZSh0aGlzLmN1cnJlbnRMYW5ndWFnZSwgdGhpcy5jdXJyZW50UmVnaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXQgY3VycmVudCBsYW5ndWFnZSBhbmQgcmVnaW9uIGNvbWJpbmF0aW9uIGF0IHJ1bnRpbWUuXG4gICAgICogYW5kIG5vdGlmeSBWSVAgc2VydmljZSB0byBsb2FkIGNvcnJlc3BvbmRpbmcgaTE4biByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbGFuZ3VhZ2UgY29kZSBmb3IgdHJhbnNsYXRpb24gYW5kIHBsdXJhbCBydWxlLlxuICAgICAqIEBwYXJhbSByZWdpb24gcmVnaW9uIGNvZGUgZm9yIHRoZSBsMiBmb3JtYXR0aW5nIHBhdHRlcm5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDdXJyZW50TG9jYWxlKGxhbmd1YWdlOiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZykge1xuICAgICAgICB0aGlzLnNldExvY2FsZShsYW5ndWFnZSwgcmVnaW9uKTtcbiAgICAgICAgdGhpcy5zZW5kVXNlckxvY2FsZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29tcG9zZSB0aGUgc2FtcGxlIGxvY2FsZSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdXNhZ2Ugc2NlbmFyaW9zLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICogQHBhcmFtIHJlZ2lvbiByZWdpb24gY29kZSBmb3IgdGhlIGwyIGZvcm1hdHRpbmcgcGF0dGVybnMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBvc2VMb2NhbGUobGFuZ3VhZ2U6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGxhbmd1YWdlICYmIHJlZ2lvbiA/XG4gICAgICAgICAgICBgJHtsYW5ndWFnZX0tJHtyZWdpb259YCA6IGxhbmd1YWdlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZFVzZXJMb2NhbGVFdmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyTG9jYWxlQ2hhbmdlZC5uZXh0KHRoaXMuZ2V0Q3VycmVudExvY2FsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU291cmNlTG9jYWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRTb3VyY2VMb2NhbGUodGhpcy5jdXJyZW50TGFuZ3VhZ2UsIHRoaXMuY3VycmVudFJlZ2lvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3VsZFNvdXJjZUxvY2FsZShsYW5ndWFnZTogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkU291cmNlTGFuZ3VhZ2UobGFuZ3VhZ2UpXG4gICAgICAgICAgICAmJiBpc0RlZmluZWQocmVnaW9uKVxuICAgICAgICAgICAgJiYgcmVnaW9uLnRvVXBwZXJDYXNlKCkgPT09IHRoaXMuZGVmYXVsdExvY2FsZS5yZWdpb25Db2RlID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLnNob3VsZFNvdXJjZUxhbmd1YWdlKGxhbmd1YWdlKSAmJiAhaXNEZWZpbmVkKHJlZ2lvbikgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVMYW5ndWFnZVRhZyhsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKGxhbmd1YWdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYW5ndWFnZS5zcGxpdCgnXycpLmpvaW4oJy0nKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTb3VyY2VMYW5ndWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkU291cmNlTGFuZ3VhZ2UodGhpcy5jdXJyZW50TGFuZ3VhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG91bGRTb3VyY2VMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VOYW1lID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRMb2NhbGUubGFuZ3VhZ2VDb2RlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMucmVzb2x2ZUxhbmd1YWdlVGFnKGxhbmd1YWdlKSA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuZGVmYXVsdExvY2FsZS5sYW5ndWFnZUNvZGV9LSR7dGhpcy5kZWZhdWx0TG9jYWxlLnJlZ2lvbkNvZGV9YC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgID09PSB0aGlzLnJlc29sdmVMYW5ndWFnZVRhZyhsYW5ndWFnZSkgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXJ2ZSBpbnRlcmZhY2UgZm9yIGxhbmd1YWdlIHRhZyBub3JtYWxpemF0aW9uIGluIGJ1bmRsZSBtb2RlLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZSBjb2RlIGZvciB0cmFuc2xhdGlvbiBhbmQgcGx1cmFsIHJ1bGUuXG4gICAgICovXG4gICAgcHVibGljIG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlLnJlcGxhY2UoJ18nLCAnLScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChMYW5ndWFnZU1hcFtsYW5nXSkge1xuICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlTWFwW2xhbmddWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYW5ndWFnZTtcbiAgICB9XG59XG4iXX0=