UNPKG

carbon-components-angular

Version:
140 lines 15.9 kB
import { Injectable } from "@angular/core"; import { toString } from "@carbon/icon-helpers"; import * as i0 from "@angular/core"; /** * Abstract class that represent a cache of icons. * * The actual caching mechanism will be implementation specific, * but it's likely a good idea to key by the icons name and/or size. * Icon name and size will always be strings, and they will be the two consistent * identifiers of an icon. For the purposes of storage additonal descriptor properties may * be used, but the name and size are the only ones guarenteed to be passed for lookup purposes. */ export class IconCache { } /** * Custom error for when a name can't be found */ export class IconNameNotFoundError extends Error { constructor(name) { super(`Icon ${name} not found`); } } /** * Custom error for when a specific size can't be found */ export class IconSizeNotFoundError extends Error { constructor(size, name) { super(`Size ${size} for ${name} not found`); } } /** * Concrete implementation of `IconCache` as a simple in memory cache */ export class IconMemoryCache extends IconCache { constructor() { super(...arguments); this.iconMap = new Map(); } get(name, size) { if (!this.iconMap.has(name)) { throw new IconNameNotFoundError(name); } const sizeMap = this.iconMap.get(name); if (!sizeMap.has(size)) { throw new IconSizeNotFoundError(size, name); } return sizeMap.get(size); } set(name, size, descriptor) { if (!this.iconMap.has(name)) { this.iconMap.set(name, new Map()); } const sizeMap = this.iconMap.get(name); sizeMap.set(size, descriptor); } } /** * The icon service is a singleton service responsible for registering and retriving icons from `@carbon/icons`. * * It's important to register icons before use. It's reccommended to register your icons early, likely in your app.component. * * To allow for improved tree shaking _do not_ import all the icons from `@carbon/icons` and register them. * Instead register only the icons in use by your application. If your application makes use of lazy loaded * modules you may also lazy load the icons used in that module by registering them early on in that module. * * `ngOnInit` should be sufficiantly early to register icons. * * Example: * ``` * import { Accessibility16 } from "@carbon/icons"; * * // ... * * class MyComponent implements OnInit { * constructor(protected iconService: IconService) {} * * // ... * * ngOnInit() { * this.iconService.register(Accessibility16); * } * * // ... * } * ``` * * If needed it is possible to register an icon under a different name, via `registerAs`. */ export class IconService { constructor() { this.iconCache = new IconMemoryCache(); } /** * Registers an array of icons based on the metadata provided by `@carbon/icons` */ registerAll(descriptors) { descriptors.forEach(icon => this.register(icon)); } /** * Registers an icon based on the metadata provided by `@carbon/icons` */ register(descriptor) { const { name } = descriptor; this.registerAs(name, descriptor); } /** * Registers an icon based on a uniqe name and metadata provided by `@carbon/icons` */ registerAs(name, descriptor) { let { size, attrs: { width } } = descriptor; this.iconCache.set(name, (size ?? width).toString(), descriptor); } /** * Gets an icon, converts it to a string, and caches the result */ get(name, size) { try { const icon = this.iconCache.get(name, size.toString()); if (!icon.svg) { icon.svg = toString(icon); } return icon; } catch (e) { throw e; } } /** * Configure various service settings (caching strategy ...) */ configure(options) { this.iconCache = options.cache; } } IconService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); IconService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ljb24vaWNvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQTZFaEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQWdCLFNBQVM7Q0FTOUI7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxLQUFLO0lBQy9DLFlBQVksSUFBWTtRQUN2QixLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFDL0MsWUFBWSxJQUFZLEVBQUUsSUFBWTtRQUNyQyxLQUFLLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Q7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFBOUM7O1FBQ1MsWUFBTyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBb0IxRCxDQUFDO0lBbEJBLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsVUFBa0I7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDbEM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBRHhCO1FBRVMsY0FBUyxHQUFjLElBQUksZUFBZSxFQUFFLENBQUM7S0E4Q3JEO0lBNUNBOztPQUVHO0lBQ0ksV0FBVyxDQUFDLFdBQXFCO1FBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLFVBQWtCO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUE0QixDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDakQsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLFVBQTRCLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNJLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNwQyxJQUFJO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBbUIsQ0FBQztZQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNYLE1BQU0sQ0FBQyxDQUFDO1NBQ1I7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsT0FBNkI7UUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7O3dHQTlDVyxXQUFXOzRHQUFYLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdG9TdHJpbmcgfSBmcm9tIFwiQGNhcmJvbi9pY29uLWhlbHBlcnNcIjtcblxuLy8gaWNvbiBpbXBvcnRzXG5pbXBvcnQge1xuXHRBZGQxNixcblx0Q2FsZW5kYXIxNixcblx0Q2FyZXREb3duMTYsXG5cdENhcmV0TGVmdDE2LFxuXHRDYXJldFJpZ2h0MTYsXG5cdENhcmV0VXAxNixcblx0Q2hlY2ttYXJrMTYsXG5cdENoZWNrbWFya0ZpbGxlZDE2LFxuXHRDaGVja21hcmtPdXRsaW5lMTYsXG5cdENoZXZyb25Eb3duMTYsXG5cdENoZXZyb25SaWdodDE2LFxuXHRDbG9zZTE2LFxuXHRDb3B5MTYsXG5cdERvd25sb2FkMTYsXG5cdEVycm9yRmlsbGVkMTYsXG5cdEluZm9ybWF0aW9uRmlsbGVkMTYsXG5cdE1lbnUxNixcblx0T3ZlcmZsb3dNZW51VmVydGljYWwxNixcblx0U2F2ZTE2LFxuXHRTZXR0aW5nczE2LFxuXHRUcmFzaENhbjE2LFxuXHRXYXJuaW5nMTYsXG5cdFdhcm5pbmdGaWxsZWQxNlxufSBmcm9tIFwiQGNhcmJvbi9pY29uc1wiO1xuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBwYXJzZWQgaWNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEljb25EZXNjcmlwdG9yIHtcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50IHRvIHJlbmRlci4gRm9yIHRoZSByb290IHRoaXMgaXMgYHN2Z2Bcblx0ICovXG5cdGVsZW06IHN0cmluZztcblx0LyoqXG5cdCAqIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBUaGUgdHlwZSBoZXJlIGlzIG5vbi1leGhhdXN0aXZlLlxuXHQgKi9cblx0YXR0cnM6IHtcblx0XHR4bWxuczogc3RyaW5nLFxuXHRcdC8vIG5lZWRlZCBieSB0aGUgaWNvbiBkaXJlY3RpdmUgdG8gZGV0ZXJtaW5lIG90aGVyIGF0dHJpYnV0ZXNcblx0XHR2aWV3Qm94OiBzdHJpbmcsXG5cdFx0ZmlsbDogc3RyaW5nLFxuXHRcdC8vIG5lZWRlZCBieSB0aGUgaWNvbiBkaXJlY3RpdmUgdG8gZGV0ZXJtaW5lIG90aGVyIGF0dHJpYnV0ZXNcblx0XHR3aWR0aDogc3RyaW5nLFxuXHRcdC8vIG5lZWRlZCBieSB0aGUgaWNvbiBkaXJlY3RpdmUgdG8gZGV0ZXJtaW5lIG90aGVyIGF0dHJpYnV0ZXNcblx0XHRoZWlnaHQ6IHN0cmluZyxcblx0XHRbeDogc3RyaW5nXTogc3RyaW5nXG5cdH07XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCAoY2hpbGRyZW4pIG9mIHRoZSBlbGVtZW50IGFzIGFuIGFycmF5IG9mIGBJY29uRGVzY3JpcHRvcmBzXG5cdCAqICh1c3VhbGx5IHdpdGhvdXQgYSBmZXcgZmllbGRzLCBuYW1lbHkgYG5hbWVgIGFuZCBgc2l6ZWApXG5cdCAqL1xuXHRjb250ZW50OiBJY29uRGVzY3JpcHRvcltdO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGljb24uXG5cdCAqXG5cdCAqIE5lZWRlZCBieSB0aGUgaWNvbiBzZXJ2aWNlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHNpemUgb2YgdGhlIGljb24gaW4gcGl4ZWxzLlxuXHQgKlxuXHQgKiBOZWVkZWQgYnkgdGhlIGljb24gc2VydmljZS5cblx0ICovXG5cdHNpemU6IG51bWJlcjtcblx0LyoqXG5cdCAqIE9wdGlvbmFsLiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tcGlsZWQgc3ZnLlxuXHQgKiBJZiBtaXNzaW5nIHRoZSBpY29uIHNlcnZpY2Ugd2lsbCBhZGQgdGhpcy5cblx0ICovXG5cdHN2Zz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHJlcHJlc2VudCBhIGNhY2hlIG9mIGljb25zLlxuICpcbiAqIFRoZSBhY3R1YWwgY2FjaGluZyBtZWNoYW5pc20gd2lsbCBiZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyxcbiAqIGJ1dCBpdCdzIGxpa2VseSBhIGdvb2QgaWRlYSB0byBrZXkgYnkgdGhlIGljb25zIG5hbWUgYW5kL29yIHNpemUuXG4gKiBJY29uIG5hbWUgYW5kIHNpemUgd2lsbCBhbHdheXMgYmUgc3RyaW5ncywgYW5kIHRoZXkgd2lsbCBiZSB0aGUgdHdvIGNvbnNpc3RlbnRcbiAqIGlkZW50aWZpZXJzIG9mIGFuIGljb24uIEZvciB0aGUgcHVycG9zZXMgb2Ygc3RvcmFnZSBhZGRpdG9uYWwgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIG1heVxuICogYmUgdXNlZCwgYnV0IHRoZSBuYW1lIGFuZCBzaXplIGFyZSB0aGUgb25seSBvbmVzIGd1YXJlbnRlZWQgdG8gYmUgcGFzc2VkIGZvciBsb29rdXAgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJY29uQ2FjaGUge1xuXHQvKipcblx0ICogRmluZHMgYW5kIHJldHVybnMgYW4gaWNvbiBiYXNlZCBvbiBpdCdzIG5hbWUgYW5kIHNpemVcblx0ICovXG5cdGFic3RyYWN0IGdldChuYW1lOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IG9iamVjdDtcblx0LyoqXG5cdCAqIHN0b3JlcyBhbiBpY29uIGRlc2NyaXB0b3IgdG8gdGhlIGNhY2hlXG5cdCAqL1xuXHRhYnN0cmFjdCBzZXQobmFtZTogc3RyaW5nLCBzaXplOiBzdHJpbmcsIGRlc2NyaXB0b3I6IG9iamVjdCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGZvciB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZFxuICovXG5leHBvcnQgY2xhc3MgSWNvbk5hbWVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcblx0XHRzdXBlcihgSWNvbiAke25hbWV9IG5vdCBmb3VuZGApO1xuXHR9XG59XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGZvciB3aGVuIGEgc3BlY2lmaWMgc2l6ZSBjYW4ndCBiZSBmb3VuZFxuICovXG5leHBvcnQgY2xhc3MgSWNvblNpemVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihzaXplOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKGBTaXplICR7c2l6ZX0gZm9yICR7bmFtZX0gbm90IGZvdW5kYCk7XG5cdH1cbn1cblxuLyoqXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBgSWNvbkNhY2hlYCBhcyBhIHNpbXBsZSBpbiBtZW1vcnkgY2FjaGVcbiAqL1xuZXhwb3J0IGNsYXNzIEljb25NZW1vcnlDYWNoZSBleHRlbmRzIEljb25DYWNoZSB7XG5cdHByaXZhdGUgaWNvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBvYmplY3Q+PigpO1xuXG5cdGdldChuYW1lOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xuXHRcdGlmICghdGhpcy5pY29uTWFwLmhhcyhuYW1lKSkge1xuXHRcdFx0dGhyb3cgbmV3IEljb25OYW1lTm90Rm91bmRFcnJvcihuYW1lKTtcblx0XHR9XG5cdFx0Y29uc3Qgc2l6ZU1hcCA9IHRoaXMuaWNvbk1hcC5nZXQobmFtZSk7XG5cdFx0aWYgKCFzaXplTWFwLmhhcyhzaXplKSkge1xuXHRcdFx0dGhyb3cgbmV3IEljb25TaXplTm90Rm91bmRFcnJvcihzaXplLCBuYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNpemVNYXAuZ2V0KHNpemUpO1xuXHR9XG5cblx0c2V0KG5hbWU6IHN0cmluZywgc2l6ZTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0XHRpZiAoIXRoaXMuaWNvbk1hcC5oYXMobmFtZSkpIHtcblx0XHRcdHRoaXMuaWNvbk1hcC5zZXQobmFtZSwgbmV3IE1hcCgpKTtcblx0XHR9XG5cdFx0Y29uc3Qgc2l6ZU1hcCA9IHRoaXMuaWNvbk1hcC5nZXQobmFtZSk7XG5cdFx0c2l6ZU1hcC5zZXQoc2l6ZSwgZGVzY3JpcHRvcik7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgaWNvbiBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uIHNlcnZpY2UgcmVzcG9uc2libGUgZm9yIHJlZ2lzdGVyaW5nIGFuZCByZXRyaXZpbmcgaWNvbnMgZnJvbSBgQGNhcmJvbi9pY29uc2AuXG4gKlxuICogSXQncyBpbXBvcnRhbnQgdG8gcmVnaXN0ZXIgaWNvbnMgYmVmb3JlIHVzZS4gSXQncyByZWNjb21tZW5kZWQgdG8gcmVnaXN0ZXIgeW91ciBpY29ucyBlYXJseSwgbGlrZWx5IGluIHlvdXIgYXBwLmNvbXBvbmVudC5cbiAqXG4gKiBUbyBhbGxvdyBmb3IgaW1wcm92ZWQgdHJlZSBzaGFraW5nIF9kbyBub3RfIGltcG9ydCBhbGwgdGhlIGljb25zIGZyb20gYEBjYXJib24vaWNvbnNgIGFuZCByZWdpc3RlciB0aGVtLlxuICogSW5zdGVhZCByZWdpc3RlciBvbmx5IHRoZSBpY29ucyBpbiB1c2UgYnkgeW91ciBhcHBsaWNhdGlvbi4gSWYgeW91ciBhcHBsaWNhdGlvbiBtYWtlcyB1c2Ugb2YgbGF6eSBsb2FkZWRcbiAqIG1vZHVsZXMgeW91IG1heSBhbHNvIGxhenkgbG9hZCB0aGUgaWNvbnMgdXNlZCBpbiB0aGF0IG1vZHVsZSBieSByZWdpc3RlcmluZyB0aGVtIGVhcmx5IG9uIGluIHRoYXQgbW9kdWxlLlxuICpcbiAqIGBuZ09uSW5pdGAgc2hvdWxkIGJlIHN1ZmZpY2lhbnRseSBlYXJseSB0byByZWdpc3RlciBpY29ucy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiBpbXBvcnQgeyBBY2Nlc3NpYmlsaXR5MTYgfSBmcm9tIFwiQGNhcmJvbi9pY29uc1wiO1xuICpcbiAqIC8vIC4uLlxuICpcbiAqIGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAqIFx0Y29uc3RydWN0b3IocHJvdGVjdGVkIGljb25TZXJ2aWNlOiBJY29uU2VydmljZSkge31cbiAqXG4gKiBcdC8vIC4uLlxuICpcbiAqIFx0bmdPbkluaXQoKSB7XG4gKiBcdFx0dGhpcy5pY29uU2VydmljZS5yZWdpc3RlcihBY2Nlc3NpYmlsaXR5MTYpO1xuICogXHR9XG4gKlxuICogXHQvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIElmIG5lZWRlZCBpdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciBhbiBpY29uIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHZpYSBgcmVnaXN0ZXJBc2AuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJY29uU2VydmljZSB7XG5cdHByaXZhdGUgaWNvbkNhY2hlOiBJY29uQ2FjaGUgPSBuZXcgSWNvbk1lbW9yeUNhY2hlKCk7XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBhcnJheSBvZiBpY29ucyBiYXNlZCBvbiB0aGUgbWV0YWRhdGEgcHJvdmlkZWQgYnkgYEBjYXJib24vaWNvbnNgXG5cdCAqL1xuXHRwdWJsaWMgcmVnaXN0ZXJBbGwoZGVzY3JpcHRvcnM6IG9iamVjdFtdKSB7XG5cdFx0ZGVzY3JpcHRvcnMuZm9yRWFjaChpY29uID0+IHRoaXMucmVnaXN0ZXIoaWNvbikpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBpY29uIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBwcm92aWRlZCBieSBgQGNhcmJvbi9pY29uc2Bcblx0ICovXG5cdHB1YmxpYyByZWdpc3RlcihkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0XHRjb25zdCB7IG5hbWUgfSA9IGRlc2NyaXB0b3IgYXMgSWNvbkRlc2NyaXB0b3I7XG5cdFx0dGhpcy5yZWdpc3RlckFzKG5hbWUsIGRlc2NyaXB0b3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBpY29uIGJhc2VkIG9uIGEgdW5pcWUgbmFtZSBhbmQgbWV0YWRhdGEgcHJvdmlkZWQgYnkgYEBjYXJib24vaWNvbnNgXG5cdCAqL1xuXHRwdWJsaWMgcmVnaXN0ZXJBcyhuYW1lOiBzdHJpbmcsIGRlc2NyaXB0b3I6IG9iamVjdCkge1xuXHRcdGxldCB7IHNpemUsIGF0dHJzOiB7IHdpZHRoIH0gfSA9IGRlc2NyaXB0b3IgYXMgSWNvbkRlc2NyaXB0b3I7XG5cdFx0dGhpcy5pY29uQ2FjaGUuc2V0KG5hbWUsIChzaXplID8/IHdpZHRoKS50b1N0cmluZygpLCBkZXNjcmlwdG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFuIGljb24sIGNvbnZlcnRzIGl0IHRvIGEgc3RyaW5nLCBhbmQgY2FjaGVzIHRoZSByZXN1bHRcblx0ICovXG5cdHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBzaXplOiBzdHJpbmcpOiBJY29uRGVzY3JpcHRvciB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGljb24gPSB0aGlzLmljb25DYWNoZS5nZXQobmFtZSwgc2l6ZS50b1N0cmluZygpKSBhcyBJY29uRGVzY3JpcHRvcjtcblx0XHRcdGlmICghaWNvbi5zdmcpIHtcblx0XHRcdFx0aWNvbi5zdmcgPSB0b1N0cmluZyhpY29uKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpY29uO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB2YXJpb3VzIHNlcnZpY2Ugc2V0dGluZ3MgKGNhY2hpbmcgc3RyYXRlZ3kgLi4uKVxuXHQgKi9cblx0cHVibGljIGNvbmZpZ3VyZShvcHRpb25zOiB7IGNhY2hlOiBJY29uQ2FjaGUgfSkge1xuXHRcdHRoaXMuaWNvbkNhY2hlID0gb3B0aW9ucy5jYWNoZTtcblx0fVxufVxuIl19