UNPKG

@fortawesome/angular-fontawesome

Version:
168 lines 21.4 kB
import { Component, HostBinding, Input, Optional } from '@angular/core'; import { icon, parse, } from '@fortawesome/fontawesome-svg-core'; import { faWarnIfIconDefinitionMissing } from '../shared/errors/warn-if-icon-html-missing'; import { faWarnIfIconSpecMissing } from '../shared/errors/warn-if-icon-spec-missing'; import { faClassList } from '../shared/utils/classlist.util'; import { faNormalizeIconSpec } from '../shared/utils/normalize-icon-spec.util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "../config"; import * as i3 from "../icon-library"; import * as i4 from "../stack/stack-item-size.directive"; import * as i5 from "../stack/stack.component"; class FaIconComponent { /** * @deprecated Use animation="spin" instead. To be removed in 0.14.0. */ set spin(value) { this.animation = value ? 'spin' : undefined; } /** * @deprecated Use animation="spin-pulse" instead. To be removed in 0.14.0. */ set pulse(value) { this.animation = value ? 'spin-pulse' : undefined; } constructor(sanitizer, config, iconLibrary, stackItem, stack) { this.sanitizer = sanitizer; this.config = config; this.iconLibrary = iconLibrary; this.stackItem = stackItem; /** * Set `class` attribute on the SVG element rendered by the component. * * @deprecated This input breaks view encapsulation and is not recommended. * For simple cases (like colors), use `class` on the component itself, for * more complex usages, explicitly opt-in to break the view encapsulation. * This input is deprecated since 0.12.0 and will be removed in 0.13.0. */ this.classes = []; if (stack != null && stackItem == null) { console.error('FontAwesome: fa-icon and fa-duotone-icon elements must specify stackItemSize attribute when wrapped into ' + 'fa-stack. Example: <fa-icon stackItemSize="2x"></fa-icon>.'); } } ngOnChanges(changes) { if (this.icon == null && this.config.fallbackIcon == null) { faWarnIfIconSpecMissing(); return; } if (changes) { const iconToBeRendered = this.icon != null ? this.icon : this.config.fallbackIcon; const iconDefinition = this.findIconDefinition(iconToBeRendered); if (iconDefinition != null) { const params = this.buildParams(); this.renderIcon(iconDefinition, params); } } } /** * Programmatically trigger rendering of the icon. * * This method is useful, when creating {@link FaIconComponent} dynamically or * changing its inputs programmatically as in these cases icon won't be * re-rendered automatically. */ render() { this.ngOnChanges({}); } findIconDefinition(i) { const lookup = faNormalizeIconSpec(i, this.config.defaultPrefix); if ('icon' in lookup) { return lookup; } const definition = this.iconLibrary.getIconDefinition(lookup.prefix, lookup.iconName); if (definition != null) { return definition; } faWarnIfIconDefinitionMissing(lookup); return null; } buildParams() { const classOpts = { flip: this.flip, animation: this.animation, border: this.border, inverse: this.inverse, size: this.size || null, pull: this.pull || null, rotate: this.rotate || null, fixedWidth: typeof this.fixedWidth === 'boolean' ? this.fixedWidth : this.config.fixedWidth, stackItemSize: this.stackItem != null ? this.stackItem.stackItemSize : null, }; const parsedTransform = typeof this.transform === 'string' ? parse.transform(this.transform) : this.transform; return { title: this.title, transform: parsedTransform, classes: [...faClassList(classOpts), ...this.classes], mask: this.mask != null ? this.findIconDefinition(this.mask) : null, styles: this.styles != null ? this.styles : {}, symbol: this.symbol, attributes: { role: this.a11yRole, }, }; } renderIcon(definition, params) { const renderedIcon = icon(definition, params); this.renderedIconHTML = this.sanitizer.bypassSecurityTrustHtml(renderedIcon.html.join('\n')); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FaIconComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.FaConfig }, { token: i3.FaIconLibrary }, { token: i4.FaStackItemSizeDirective, optional: true }, { token: i5.FaStackComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: FaIconComponent, selector: "fa-icon", inputs: { icon: "icon", title: "title", animation: "animation", spin: "spin", pulse: "pulse", mask: "mask", styles: "styles", flip: "flip", size: "size", pull: "pull", border: "border", inverse: "inverse", symbol: "symbol", rotate: "rotate", fixedWidth: "fixedWidth", classes: "classes", transform: "transform", a11yRole: "a11yRole" }, host: { properties: { "attr.title": "title", "innerHTML": "this.renderedIconHTML" }, classAttribute: "ng-fa-icon" }, usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); } } export { FaIconComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FaIconComponent, decorators: [{ type: Component, args: [{ selector: 'fa-icon', template: ``, host: { class: 'ng-fa-icon', '[attr.title]': 'title', }, }] }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.FaConfig }, { type: i3.FaIconLibrary }, { type: i4.FaStackItemSizeDirective, decorators: [{ type: Optional }] }, { type: i5.FaStackComponent, decorators: [{ type: Optional }] }]; }, propDecorators: { icon: [{ type: Input }], title: [{ type: Input }], animation: [{ type: Input }], spin: [{ type: Input }], pulse: [{ type: Input }], mask: [{ type: Input }], styles: [{ type: Input }], flip: [{ type: Input }], size: [{ type: Input }], pull: [{ type: Input }], border: [{ type: Input }], inverse: [{ type: Input }], symbol: [{ type: Input }], rotate: [{ type: Input }], fixedWidth: [{ type: Input }], classes: [{ type: Input }], transform: [{ type: Input }], a11yRole: [{ type: Input }], renderedIconHTML: [{ type: HostBinding, args: ['innerHTML'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ljb24vaWNvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFhLFFBQVEsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUdMLElBQUksRUFJSixLQUFLLEdBTU4sTUFBTSxtQ0FBbUMsQ0FBQztBQUczQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVyRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7Ozs7QUFJL0UsTUFRYSxlQUFlO0lBbUIxQjs7T0FFRztJQUNILElBQWEsSUFBSSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsS0FBSyxDQUFDLEtBQWM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BELENBQUM7SUEwQ0QsWUFDVSxTQUF1QixFQUN2QixNQUFnQixFQUNoQixXQUEwQixFQUNkLFNBQW1DLEVBQzNDLEtBQXVCO1FBSjNCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQTBCO1FBeEJ6RDs7Ozs7OztXQU9HO1FBQ00s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QUs7Z0JBT08sS0FBSztzQkFBakIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBVUcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQVVHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRW9CLGdCQUFnQjtzQkFBekMsV0FBVzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIEZhU3ltYm9sLFxuICBGbGlwUHJvcCxcbiAgaWNvbixcbiAgSWNvbkRlZmluaXRpb24sXG4gIEljb25QYXJhbXMsXG4gIEljb25Qcm9wLFxuICBwYXJzZSxcbiAgUHVsbFByb3AsXG4gIFJvdGF0ZVByb3AsXG4gIFNpemVQcm9wLFxuICBTdHlsZXMsXG4gIFRyYW5zZm9ybSxcbn0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlJztcbmltcG9ydCB7IEZhQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IEZhSWNvbkxpYnJhcnkgfSBmcm9tICcuLi9pY29uLWxpYnJhcnknO1xuaW1wb3J0IHsgZmFXYXJuSWZJY29uRGVmaW5pdGlvbk1pc3NpbmcgfSBmcm9tICcuLi9zaGFyZWQvZXJyb3JzL3dhcm4taWYtaWNvbi1odG1sLW1pc3NpbmcnO1xuaW1wb3J0IHsgZmFXYXJuSWZJY29uU3BlY01pc3NpbmcgfSBmcm9tICcuLi9zaGFyZWQvZXJyb3JzL3dhcm4taWYtaWNvbi1zcGVjLW1pc3NpbmcnO1xuaW1wb3J0IHsgQW5pbWF0aW9uUHJvcCwgRmFQcm9wcyB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvcHJvcHMubW9kZWwnO1xuaW1wb3J0IHsgZmFDbGFzc0xpc3QgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMvY2xhc3NsaXN0LnV0aWwnO1xuaW1wb3J0IHsgZmFOb3JtYWxpemVJY29uU3BlYyB9IGZyb20gJy4uL3NoYXJlZC91dGlscy9ub3JtYWxpemUtaWNvbi1zcGVjLnV0aWwnO1xuaW1wb3J0IHsgRmFTdGFja0l0ZW1TaXplRGlyZWN0aXZlIH0gZnJvbSAnLi4vc3RhY2svc3RhY2staXRlbS1zaXplLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGYVN0YWNrQ29tcG9uZW50IH0gZnJvbSAnLi4vc3RhY2svc3RhY2suY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmEtaWNvbicsXG4gIHRlbXBsYXRlOiBgYCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnbmctZmEtaWNvbicsXG4gICAgJ1thdHRyLnRpdGxlXSc6ICd0aXRsZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEZhSWNvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGljb246IEljb25Qcm9wO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgdGl0bGUgZm9yIHRoZSBpY29uLlxuICAgKlxuICAgKiBUaGlzIHRleHQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSB0b29sdGlwIG9uIGhvdmVyIGFuZCBwcmVzZW50ZWQgdG8gdGhlXG4gICAqIHNjcmVlbiByZWFkZXJzLlxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEljb24gYW5pbWF0aW9uLlxuICAgKlxuICAgKiBNb3N0IG9mIHRoZSBhbmltYXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIEZvbnQgQXdlc29tZSA2LiBXaXRoXG4gICAqIEZvbnQgQXdlc29tZSA1LCBvbmx5ICdzcGluJyBhbmQgJ3NwaW4tcHVsc2UnIGFyZSBzdXBwb3J0ZWQuXG4gICAqL1xuICBASW5wdXQoKSBhbmltYXRpb24/OiBBbmltYXRpb25Qcm9wO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYW5pbWF0aW9uPVwic3BpblwiIGluc3RlYWQuIFRvIGJlIHJlbW92ZWQgaW4gMC4xNC4wLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNwaW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHZhbHVlID8gJ3NwaW4nIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhbmltYXRpb249XCJzcGluLXB1bHNlXCIgaW5zdGVhZC4gVG8gYmUgcmVtb3ZlZCBpbiAwLjE0LjAuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcHVsc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHZhbHVlID8gJ3NwaW4tcHVsc2UnIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgQElucHV0KCkgbWFzaz86IEljb25Qcm9wO1xuXG4gIC8qKlxuICAgKiBTZXQgYHN0eWxlYCBhdHRyaWJ1dGUgb24gdGhlIFNWRyBlbGVtZW50IHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgaW5wdXQgYnJlYWtzIHZpZXcgZW5jYXBzdWxhdGlvbiBhbmQgaXMgbm90IHJlY29tbWVuZGVkLlxuICAgKiBGb3Igc2ltcGxlIGNhc2VzIChsaWtlIGNvbG9ycyksIHVzZSBgc3R5bGVgIG9uIHRoZSBjb21wb25lbnQgaXRzZWxmLCBmb3JcbiAgICogbW9yZSBjb21wbGV4IHVzYWdlcywgZXhwbGljaXRseSBvcHQtaW4gdG8gYnJlYWsgdGhlIHZpZXcgZW5jYXBzdWxhdGlvbi5cbiAgICogVGhpcyBpbnB1dCBpcyBkZXByZWNhdGVkIHNpbmNlIDAuMTIuMCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDAuMTMuMC5cbiAgICovXG4gIEBJbnB1dCgpIHN0eWxlcz86IFN0eWxlcztcbiAgQElucHV0KCkgZmxpcD86IEZsaXBQcm9wO1xuICBASW5wdXQoKSBzaXplPzogU2l6ZVByb3A7XG4gIEBJbnB1dCgpIHB1bGw/OiBQdWxsUHJvcDtcbiAgQElucHV0KCkgYm9yZGVyPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaW52ZXJzZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN5bWJvbD86IEZhU3ltYm9sO1xuICBASW5wdXQoKSByb3RhdGU/OiBSb3RhdGVQcm9wO1xuICBASW5wdXQoKSBmaXhlZFdpZHRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IGBjbGFzc2AgYXR0cmlidXRlIG9uIHRoZSBTVkcgZWxlbWVudCByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlucHV0IGJyZWFrcyB2aWV3IGVuY2Fwc3VsYXRpb24gYW5kIGlzIG5vdCByZWNvbW1lbmRlZC5cbiAgICogRm9yIHNpbXBsZSBjYXNlcyAobGlrZSBjb2xvcnMpLCB1c2UgYGNsYXNzYCBvbiB0aGUgY29tcG9uZW50IGl0c2VsZiwgZm9yXG4gICAqIG1vcmUgY29tcGxleCB1c2FnZXMsIGV4cGxpY2l0bHkgb3B0LWluIHRvIGJyZWFrIHRoZSB2aWV3IGVuY2Fwc3VsYXRpb24uXG4gICAqIFRoaXMgaW5wdXQgaXMgZGVwcmVjYXRlZCBzaW5jZSAwLjEyLjAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAwLjEzLjAuXG4gICAqL1xuICBASW5wdXQoKSBjbGFzc2VzPzogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdHJhbnNmb3JtPzogc3RyaW5nIHwgVHJhbnNmb3JtO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSBgcm9sZWAgYXR0cmlidXRlIGZvciB0aGUgcmVuZGVyZWQgPHN2Zz4gZWxlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2ltZydcbiAgICovXG4gIEBJbnB1dCgpIGExMXlSb2xlOiBzdHJpbmc7XG5cbiAgQEhvc3RCaW5kaW5nKCdpbm5lckhUTUwnKSByZW5kZXJlZEljb25IVE1MOiBTYWZlSHRtbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY29uZmlnOiBGYUNvbmZpZyxcbiAgICBwcml2YXRlIGljb25MaWJyYXJ5OiBGYUljb25MaWJyYXJ5LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3RhY2tJdGVtOiBGYVN0YWNrSXRlbVNpemVEaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgc3RhY2s6IEZhU3RhY2tDb21wb25lbnQsXG4gICkge1xuICAgIGlmIChzdGFjayAhPSBudWxsICYmIHN0YWNrSXRlbSA9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnRm9udEF3ZXNvbWU6IGZhLWljb24gYW5kIGZhLWR1b3RvbmUtaWNvbiBlbGVtZW50cyBtdXN0IHNwZWNpZnkgc3RhY2tJdGVtU2l6ZSBhdHRyaWJ1dGUgd2hlbiB3cmFwcGVkIGludG8gJyArXG4gICAgICAgICAgJ2ZhLXN0YWNrLiBFeGFtcGxlOiA8ZmEtaWNvbiBzdGFja0l0ZW1TaXplPVwiMnhcIj48L2ZhLWljb24+LicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5pY29uID09IG51bGwgJiYgdGhpcy5jb25maWcuZmFsbGJhY2tJY29uID09IG51bGwpIHtcbiAgICAgIGZhV2FybklmSWNvblNwZWNNaXNzaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGNvbnN0IGljb25Ub0JlUmVuZGVyZWQgPSB0aGlzLmljb24gIT0gbnVsbCA/IHRoaXMuaWNvbiA6IHRoaXMuY29uZmlnLmZhbGxiYWNrSWNvbjtcbiAgICAgIGNvbnN0IGljb25EZWZpbml0aW9uID0gdGhpcy5maW5kSWNvbkRlZmluaXRpb24oaWNvblRvQmVSZW5kZXJlZCk7XG4gICAgICBpZiAoaWNvbkRlZmluaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKCk7XG4gICAgICAgIHRoaXMucmVuZGVySWNvbihpY29uRGVmaW5pdGlvbiwgcGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIHJlbmRlcmluZyBvZiB0aGUgaWNvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsLCB3aGVuIGNyZWF0aW5nIHtAbGluayBGYUljb25Db21wb25lbnR9IGR5bmFtaWNhbGx5IG9yXG4gICAqIGNoYW5naW5nIGl0cyBpbnB1dHMgcHJvZ3JhbW1hdGljYWxseSBhcyBpbiB0aGVzZSBjYXNlcyBpY29uIHdvbid0IGJlXG4gICAqIHJlLXJlbmRlcmVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5uZ09uQ2hhbmdlcyh7fSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmluZEljb25EZWZpbml0aW9uKGk6IEljb25Qcm9wIHwgSWNvbkRlZmluaXRpb24pOiBJY29uRGVmaW5pdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGxvb2t1cCA9IGZhTm9ybWFsaXplSWNvblNwZWMoaSwgdGhpcy5jb25maWcuZGVmYXVsdFByZWZpeCk7XG4gICAgaWYgKCdpY29uJyBpbiBsb29rdXApIHtcbiAgICAgIHJldHVybiBsb29rdXA7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuaWNvbkxpYnJhcnkuZ2V0SWNvbkRlZmluaXRpb24obG9va3VwLnByZWZpeCwgbG9va3VwLmljb25OYW1lKTtcbiAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICBmYVdhcm5JZkljb25EZWZpbml0aW9uTWlzc2luZyhsb29rdXApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUGFyYW1zKCkge1xuICAgIGNvbnN0IGNsYXNzT3B0czogRmFQcm9wcyA9IHtcbiAgICAgIGZsaXA6IHRoaXMuZmxpcCxcbiAgICAgIGFuaW1hdGlvbjogdGhpcy5hbmltYXRpb24sXG4gICAgICBib3JkZXI6IHRoaXMuYm9yZGVyLFxuICAgICAgaW52ZXJzZTogdGhpcy5pbnZlcnNlLFxuICAgICAgc2l6ZTogdGhpcy5zaXplIHx8IG51bGwsXG4gICAgICBwdWxsOiB0aGlzLnB1bGwgfHwgbnVsbCxcbiAgICAgIHJvdGF0ZTogdGhpcy5yb3RhdGUgfHwgbnVsbCxcbiAgICAgIGZpeGVkV2lkdGg6IHR5cGVvZiB0aGlzLmZpeGVkV2lkdGggPT09ICdib29sZWFuJyA/IHRoaXMuZml4ZWRXaWR0aCA6IHRoaXMuY29uZmlnLmZpeGVkV2lkdGgsXG4gICAgICBzdGFja0l0ZW1TaXplOiB0aGlzLnN0YWNrSXRlbSAhPSBudWxsID8gdGhpcy5zdGFja0l0ZW0uc3RhY2tJdGVtU2l6ZSA6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcnNlZFRyYW5zZm9ybSA9IHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ3N0cmluZycgPyBwYXJzZS50cmFuc2Zvcm0odGhpcy50cmFuc2Zvcm0pIDogdGhpcy50cmFuc2Zvcm07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICB0cmFuc2Zvcm06IHBhcnNlZFRyYW5zZm9ybSxcbiAgICAgIGNsYXNzZXM6IFsuLi5mYUNsYXNzTGlzdChjbGFzc09wdHMpLCAuLi50aGlzLmNsYXNzZXNdLFxuICAgICAgbWFzazogdGhpcy5tYXNrICE9IG51bGwgPyB0aGlzLmZpbmRJY29uRGVmaW5pdGlvbih0aGlzLm1hc2spIDogbnVsbCxcbiAgICAgIHN0eWxlczogdGhpcy5zdHlsZXMgIT0gbnVsbCA/IHRoaXMuc3R5bGVzIDoge30sXG4gICAgICBzeW1ib2w6IHRoaXMuc3ltYm9sLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICByb2xlOiB0aGlzLmExMXlSb2xlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJJY29uKGRlZmluaXRpb246IEljb25EZWZpbml0aW9uLCBwYXJhbXM6IEljb25QYXJhbXMpIHtcbiAgICBjb25zdCByZW5kZXJlZEljb24gPSBpY29uKGRlZmluaXRpb24sIHBhcmFtcyk7XG4gICAgdGhpcy5yZW5kZXJlZEljb25IVE1MID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwocmVuZGVyZWRJY29uLmh0bWwuam9pbignXFxuJykpO1xuICB9XG59XG4iXX0=