UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

277 lines • 23.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, SecurityContext, Inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { HttpClient } from '@angular/common/http'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common/http"; import * as i3 from "@angular/common"; /** * **Ignite UI for Angular Icon Service** - * * The Ignite UI Icon Service makes it easy for developers to include custom SVG images and use them with IgxIconComponent. * In addition it could be used to associate a custom class to be applied on IgxIconComponent according to given fontSet. * * Example: * ```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` */ export class IgxIconService { /** * @param {?} _sanitizer * @param {?} _httpClient * @param {?} _document */ constructor(_sanitizer, _httpClient, _document) { this._sanitizer = _sanitizer; this._httpClient = _httpClient; this._document = _document; this._fontSet = 'material-icons'; this._fontSetAliases = new Map(); this._cachedSvgIcons = new Set(); } /** * Returns the default font set. * ```typescript * const defaultFontSet = this.iconService.defaultFontSet; * ``` * @return {?} */ get defaultFontSet() { return this._fontSet; } /** * Sets the default font set. * ```typescript * this.iconService.defaultFontSet = 'svg-flags'; * ``` * @param {?} className * @return {?} */ set defaultFontSet(className) { this._fontSet = className; } /** * Registers a custom class to be applied to IgxIconComponent for a given fontSet. * ```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * ``` * @template THIS * @this {THIS} * @param {?} alias * @param {?=} className * @return {THIS} */ registerFontSetAlias(alias, className = alias) { (/** @type {?} */ (this))._fontSetAliases.set(alias, className); return (/** @type {?} */ (this)); } /** * Returns the custom class, if any, associated to a given fontSet. * ```typescript * const fontSetClass = this.iconService.fontSetClassName('material'); * ``` * @param {?} alias * @return {?} */ fontSetClassName(alias) { return this._fontSetAliases.get(alias) || alias; } /** * Adds an SVG image to the cache. SVG source is an url. * ```typescript * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` * @param {?} iconName * @param {?} url * @param {?=} fontSet * @return {?} */ addSvgIcon(iconName, url, fontSet = '') { if (iconName && url) { /** @type {?} */ const safeUrl = this._sanitizer.bypassSecurityTrustResourceUrl(url); if (!safeUrl) { throw new Error(`The provided URL could not be processed as trusted resource URL by Angular's DomSanitizer: "${url}".`); } /** @type {?} */ const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl); if (!sanitizedUrl) { throw new Error(`The URL provided was not trusted as a resource URL: "${url}".`); } this.fetchSvg(iconName, url, fontSet); } else { throw new Error('You should provide at least `iconName` and `url` to register an svg icon.'); } } /** * Adds an SVG image to the cache. SVG source is its text. * ```typescript * this.iconService.addSvgIcon('simple', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> * <path d="M74 74h54v54H74" /></svg>', 'svg-flags'); * ``` * @param {?} iconName * @param {?} iconText * @param {?=} fontSet * @return {?} */ addSvgIconFromText(iconName, iconText, fontSet = '') { if (iconName && iconText) { this.cacheSvgIcon(iconName, iconText, fontSet); } else { throw new Error('You should provide at least `iconName` and `iconText` to register an svg icon.'); } } /** * Returns wheather a given SVG image is present in the cache. * ```typescript * const isSvgCached = this.iconService.isSvgIconCached('aruba', 'svg-flags'); * ``` * @param {?} iconName * @param {?=} fontSet * @return {?} */ isSvgIconCached(iconName, fontSet = '') { /** @type {?} */ const iconKey = this.getSvgIconKey(iconName, fontSet); return this._cachedSvgIcons.has(iconKey); } /** * Returns the key of a cached SVG image. * ```typescript * const svgIconKey = this.iconService.getSvgIconKey('aruba', 'svg-flags'); * ``` * @param {?} iconName * @param {?=} fontSet * @return {?} */ getSvgIconKey(iconName, fontSet = '') { return fontSet + '_' + iconName; } /** * @hidden * @private * @param {?} iconName * @param {?} url * @param {?=} fontSet * @return {?} */ fetchSvg(iconName, url, fontSet = '') { /** @type {?} */ const request = this._httpClient.get(url, { responseType: 'text' }); /** @type {?} */ const subscription = request.subscribe((value) => { this.cacheSvgIcon(iconName, value, fontSet); }, (error) => { throw new Error(`Could not fetch SVG from url: ${url}; error: ${error.message}`); }, () => { subscription.unsubscribe(); }); } /** * @hidden * @private * @param {?} iconName * @param {?} value * @param {?=} fontSet * @return {?} */ cacheSvgIcon(iconName, value, fontSet = '') { if (iconName && value) { this.ensureSvgContainerCreated(); /** @type {?} */ const div = this._document.createElement('DIV'); div.innerHTML = value; /** @type {?} */ const svg = (/** @type {?} */ (div.querySelector('svg'))); if (svg) { /** @type {?} */ const iconKey = this.getSvgIconKey(iconName, fontSet); svg.setAttribute('id', iconKey); svg.setAttribute('fit', ''); svg.setAttribute('preserveAspectRatio', 'xMidYMid meet'); svg.setAttribute('focusable', 'false'); // Disable IE11 default behavior to make SVGs focusable. if (this._cachedSvgIcons.has(iconKey)) { /** @type {?} */ const oldChild = this._svgContainer.querySelector(`svg[id='${iconKey}']`); this._svgContainer.removeChild(oldChild); } this._svgContainer.appendChild(svg); this._cachedSvgIcons.add(iconKey); } } } /** * @hidden * @private * @return {?} */ ensureSvgContainerCreated() { if (!this._svgContainer) { this._svgContainer = this._document.documentElement.querySelector('.igx-svg-container'); if (!this._svgContainer) { this._svgContainer = this._document.createElement('DIV'); this._svgContainer.classList.add('igx-svg-container'); this._document.documentElement.appendChild(this._svgContainer); } } } } IgxIconService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ IgxIconService.ctorParameters = () => [ { type: DomSanitizer }, { type: HttpClient }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; /** @nocollapse */ IgxIconService.ngInjectableDef = i0.defineInjectable({ factory: function IgxIconService_Factory() { return new IgxIconService(i0.inject(i1.DomSanitizer), i0.inject(i2.HttpClient), i0.inject(i3.DOCUMENT)); }, token: IgxIconService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ IgxIconService.prototype._fontSet; /** * @type {?} * @private */ IgxIconService.prototype._fontSetAliases; /** * @type {?} * @private */ IgxIconService.prototype._svgContainer; /** * @type {?} * @private */ IgxIconService.prototype._cachedSvgIcons; /** * @type {?} * @private */ IgxIconService.prototype._sanitizer; /** * @type {?} * @private */ IgxIconService.prototype._httpClient; /** * @type {?} * @private */ IgxIconService.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pY29uL2ljb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCM0MsTUFBTSxPQUFPLGNBQWM7Ozs7OztJQU12QixZQUFxQixVQUF3QixFQUFVLFdBQXVCLEVBQTRCLFNBQWM7UUFBbkcsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQTRCLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFMaEgsYUFBUSxHQUFHLGdCQUFnQixDQUFDO1FBQzVCLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFNUMsb0JBQWUsR0FBZ0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVtRSxDQUFDOzs7Ozs7OztJQVE3SCxJQUFJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQzs7Ozs7Ozs7O0lBUUQsSUFBSSxjQUFjLENBQUMsU0FBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQzs7Ozs7Ozs7Ozs7O0lBUU0sb0JBQW9CLENBQUMsS0FBYSxFQUFFLFlBQW9CLEtBQUs7UUFDaEUsbUJBQUEsSUFBSSxFQUFBLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNoQixDQUFDOzs7Ozs7Ozs7SUFRTSxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3BELENBQUM7Ozs7Ozs7Ozs7O0lBUU0sVUFBVSxDQUFDLFFBQWdCLEVBQUUsR0FBVyxFQUFFLFVBQWtCLEVBQUU7UUFDakUsSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFOztrQkFDWCxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUM7WUFDbkUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLCtGQUErRixHQUFHLElBQUksQ0FBQyxDQUFDO2FBQzNIOztrQkFFSyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7WUFDcEYsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3BGO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7U0FDaEc7SUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7SUFTTSxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsVUFBa0IsRUFBRTtRQUM5RSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7U0FDckc7SUFDTCxDQUFDOzs7Ozs7Ozs7O0lBUU0sZUFBZSxDQUFDLFFBQWdCLEVBQUUsVUFBa0IsRUFBRTs7Y0FDbkQsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Ozs7Ozs7Ozs7SUFRTSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxVQUFrQixFQUFFO1FBQ3ZELE9BQU8sT0FBTyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDcEMsQ0FBQzs7Ozs7Ozs7O0lBS08sUUFBUSxDQUFDLFFBQWdCLEVBQUUsR0FBVyxFQUFFLFVBQWtCLEVBQUU7O2NBQzFELE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7O2NBQzdELFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUMsRUFBRSxHQUFHLEVBQUU7WUFDSixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7Ozs7Ozs7O0lBS08sWUFBWSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLFVBQWtCLEVBQUU7UUFDdEUsSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFO1lBQ25CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDOztrQkFFM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUMvQyxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7a0JBQ2hCLEdBQUcsR0FBRyxtQkFBQSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFjO1lBRWxELElBQUksR0FBRyxFQUFFOztzQkFDQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO2dCQUVyRCxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsd0RBQXdEO2dCQUVoRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFOzswQkFDN0IsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsT0FBTyxJQUFJLENBQUM7b0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM1QztnQkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7U0FDSjtJQUNMLENBQUM7Ozs7OztJQUtPLHlCQUF5QjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNsRTtTQUNKO0lBQ0wsQ0FBQzs7O1lBeEtKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7OztZQW5CUSxZQUFZO1lBQ1osVUFBVTs0Q0F5QmtFLE1BQU0sU0FBQyxRQUFROzs7Ozs7OztJQUxoRyxrQ0FBb0M7Ozs7O0lBQ3BDLHlDQUFvRDs7Ozs7SUFDcEQsdUNBQW1DOzs7OztJQUNuQyx5Q0FBeUQ7Ozs7O0lBRTVDLG9DQUFnQzs7Ozs7SUFBRSxxQ0FBK0I7Ozs7O0lBQUUsbUNBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgU2VjdXJpdHlDb250ZXh0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBJY29uIFNlcnZpY2UqKiAtXG4gKlxuICogVGhlIElnbml0ZSBVSSBJY29uIFNlcnZpY2UgbWFrZXMgaXQgZWFzeSBmb3IgZGV2ZWxvcGVycyB0byBpbmNsdWRlIGN1c3RvbSBTVkcgaW1hZ2VzIGFuZCB1c2UgdGhlbSB3aXRoIElneEljb25Db21wb25lbnQuXG4gKiBJbiBhZGRpdGlvbiBpdCBjb3VsZCBiZSB1c2VkIHRvIGFzc29jaWF0ZSBhIGN1c3RvbSBjbGFzcyB0byBiZSBhcHBsaWVkIG9uIElneEljb25Db21wb25lbnQgYWNjb3JkaW5nIHRvIGdpdmVuIGZvbnRTZXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJGb250U2V0QWxpYXMoJ21hdGVyaWFsJywgJ21hdGVyaWFsLWljb25zJyk7XG4gKiB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ2FydWJhJywgJy9hc3NldHMvc3ZnL2NvdW50cnlfZmxhZ3MvYXJ1YmEuc3ZnJywgJ3N2Zy1mbGFncycpO1xuICogYGBgXG4gKi9cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJY29uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfZm9udFNldCA9ICdtYXRlcmlhbC1pY29ucyc7XG4gICAgcHJpdmF0ZSBfZm9udFNldEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgX3N2Z0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfY2FjaGVkU3ZnSWNvbnM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3RvciAocHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnkpIHsgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGRlZmF1bHQgZm9udCBzZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBkZWZhdWx0Rm9udFNldCA9IHRoaXMuaWNvblNlcnZpY2UuZGVmYXVsdEZvbnRTZXQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRGb250U2V0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBTZXRzIHRoZSBkZWZhdWx0IGZvbnQgc2V0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5kZWZhdWx0Rm9udFNldCA9ICdzdmctZmxhZ3MnO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHNldCBkZWZhdWx0Rm9udFNldChjbGFzc05hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250U2V0ID0gY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZWdpc3RlcnMgYSBjdXN0b20gY2xhc3MgdG8gYmUgYXBwbGllZCB0byBJZ3hJY29uQ29tcG9uZW50IGZvciBhIGdpdmVuIGZvbnRTZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyRm9udFNldEFsaWFzKCdtYXRlcmlhbCcsICdtYXRlcmlhbC1pY29ucycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlckZvbnRTZXRBbGlhcyhhbGlhczogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZyA9IGFsaWFzKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZvbnRTZXRBbGlhc2VzLnNldChhbGlhcywgY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGN1c3RvbSBjbGFzcywgaWYgYW55LCBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gZm9udFNldC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIGNvbnN0IGZvbnRTZXRDbGFzcyA9IHRoaXMuaWNvblNlcnZpY2UuZm9udFNldENsYXNzTmFtZSgnbWF0ZXJpYWwnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNldENsYXNzTmFtZShhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTZXRBbGlhc2VzLmdldChhbGlhcykgfHwgYWxpYXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFkZHMgYW4gU1ZHIGltYWdlIHRvIHRoZSBjYWNoZS4gU1ZHIHNvdXJjZSBpcyBhbiB1cmwuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ2FydWJhJywgJy9hc3NldHMvc3ZnL2NvdW50cnlfZmxhZ3MvYXJ1YmEuc3ZnJywgJ3N2Zy1mbGFncycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTdmdJY29uKGljb25OYW1lOiBzdHJpbmcsIHVybDogc3RyaW5nLCBmb250U2V0OiBzdHJpbmcgPSAnJykge1xuICAgICAgICBpZiAoaWNvbk5hbWUgJiYgdXJsKSB7XG4gICAgICAgICAgICBjb25zdCBzYWZlVXJsID0gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xuICAgICAgICAgICAgaWYgKCFzYWZlVXJsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgVVJMIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYXMgdHJ1c3RlZCByZXNvdXJjZSBVUkwgYnkgQW5ndWxhcidzIERvbVNhbml0aXplcjogXCIke3VybH1cIi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVkVXJsID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHNhZmVVcmwpO1xuICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZWRVcmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBVUkwgcHJvdmlkZWQgd2FzIG5vdCB0cnVzdGVkIGFzIGEgcmVzb3VyY2UgVVJMOiBcIiR7dXJsfVwiLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZldGNoU3ZnKGljb25OYW1lLCB1cmwsIGZvbnRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3Ugc2hvdWxkIHByb3ZpZGUgYXQgbGVhc3QgYGljb25OYW1lYCBhbmQgYHVybGAgdG8gcmVnaXN0ZXIgYW4gc3ZnIGljb24uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQWRkcyBhbiBTVkcgaW1hZ2UgdG8gdGhlIGNhY2hlLiBTVkcgc291cmNlIGlzIGl0cyB0ZXh0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uKCdzaW1wbGUnLCAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMDAgMjAwXCI+XG4gICAgICogICA8cGF0aCBkPVwiTTc0IDc0aDU0djU0SDc0XCIgLz48L3N2Zz4nLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFkZFN2Z0ljb25Gcm9tVGV4dChpY29uTmFtZTogc3RyaW5nLCBpY29uVGV4dDogc3RyaW5nLCBmb250U2V0OiBzdHJpbmcgPSAnJykge1xuICAgICAgICBpZiAoaWNvbk5hbWUgJiYgaWNvblRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTdmdJY29uKGljb25OYW1lLCBpY29uVGV4dCwgZm9udFNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgcHJvdmlkZSBhdCBsZWFzdCBgaWNvbk5hbWVgIGFuZCBgaWNvblRleHRgIHRvIHJlZ2lzdGVyIGFuIHN2ZyBpY29uLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgd2hlYXRoZXIgYSBnaXZlbiBTVkcgaW1hZ2UgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICBjb25zdCBpc1N2Z0NhY2hlZCA9IHRoaXMuaWNvblNlcnZpY2UuaXNTdmdJY29uQ2FjaGVkKCdhcnViYScsICdzdmctZmxhZ3MnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdmdJY29uQ2FjaGVkKGljb25OYW1lOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBrZXkgb2YgYSBjYWNoZWQgU1ZHIGltYWdlLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3Qgc3ZnSWNvbktleSA9IHRoaXMuaWNvblNlcnZpY2UuZ2V0U3ZnSWNvbktleSgnYXJ1YmEnLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFN2Z0ljb25LZXkoaWNvbk5hbWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZvbnRTZXQgKyAnXycgKyBpY29uTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmZXRjaFN2ZyhpY29uTmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2h0dHBDbGllbnQuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gcmVxdWVzdC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTdmdJY29uKGljb25OYW1lLCB2YWx1ZSwgZm9udFNldCk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmV0Y2ggU1ZHIGZyb20gdXJsOiAke3VybH07IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWNoZVN2Z0ljb24oaWNvbk5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZm9udFNldDogc3RyaW5nID0gJycpIHtcbiAgICAgICAgaWYgKGljb25OYW1lICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVN2Z0NvbnRhaW5lckNyZWF0ZWQoKTtcblxuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkaXYucXVlcnlTZWxlY3Rvcignc3ZnJykgYXMgU1ZHRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHN2Zykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGljb25LZXkgPSB0aGlzLmdldFN2Z0ljb25LZXkoaWNvbk5hbWUsIGZvbnRTZXQpO1xuXG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaWQnLCBpY29uS2V5KTtcbiAgICAgICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdmaXQnLCAnJyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7IC8vIERpc2FibGUgSUUxMSBkZWZhdWx0IGJlaGF2aW9yIHRvIG1ha2UgU1ZHcyBmb2N1c2FibGUuXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVkU3ZnSWNvbnMuaGFzKGljb25LZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkID0gdGhpcy5fc3ZnQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYHN2Z1tpZD0nJHtpY29uS2V5fSddYCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lci5yZW1vdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkU3ZnSWNvbnMuYWRkKGljb25LZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU3ZnQ29udGFpbmVyQ3JlYXRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdmdDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaWd4LXN2Zy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3ZnQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ZnQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2lneC1zdmctY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3N2Z0NvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=