UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

243 lines 26.2 kB
/** * Copyright (c) 2025 Visa, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { CommonModule } from '@angular/common'; import { Component, HostBinding, Input } from '@angular/core'; import { IconLibrary, IconSize } from './icon.constants'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * <code>IconComponent</code> is intended <i>only</i> for use with icons used with an icon sprite. <br /> * <strong>Standalone icons from @visa/nova-icons-angular is recommended over using the <code>IconComponent</code>.</strong>. <br /> * Icon component for displaying icons from VPDS' [Icon Library](https://design.visa.com/icons). <br /> */ export class IconComponent { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-icon.v-icon-&lt;iconSize&gt;.v-icon-&lt;library&gt; */ get class() { return [ this._class, 'v-icon', 'v-icon-' + this.iconSize, 'v-icon-' + this.library, this.isBadgeEllipse ? 'v-badge-ellipse' : '', this.rtl ? 'v-icon-rtl' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Flips icon from right to left when true and <code>dir="rtl" is present on a parent element. * @default false */ get rtl() { return this._rtl; } set rtl(value) { this._rtl = coerceBooleanProperty(value); } /** * Sets icon resolution/size. * @default 'tiny' / IconSize.TINY * @options 'tiny' | IconSize.TINY | <br> 'low' | IconSize.LOW | <br> 'high' | IconSize.HIGH */ // default of tiny chosen because it is the default for majority of buttons get iconSize() { return this._iconSize; } set iconSize(value) { this._iconSize = value; this.setIcon(); } /** * Tells icon which library to reference. * @default 'visa' / IconLibrary.VISA * @options 'visa' | IconLibrary.VISA | <br> 'generic' | IconLibrary.GENERIC */ get library() { return this._library; } set library(value) { this._library = value; } /** * Name of icon to display. <br /> * Should refer to an icon in VPDS' [Icon Library](https://design.visa.com/icons). */ get icon() { return this._icon; } set icon(value) { this._icon = value; this.setIcon(); } /** * Sets icon to badge-ellipse variant when true. <br /> * Intended for use in badges with an indicator. * @default false */ get isBadgeEllipse() { return this._isBadgeEllipse; } set isBadgeEllipse(value) { this._isBadgeEllipse = coerceBooleanProperty(value); } get hostStyleFill() { if (this.isBadgeEllipse) { return 'var(--v-badge-ellipse-color)'; } } get hostStyleIconHeight() { if (this.isBadgeEllipse) { return `var(--size-scalable-${this.customHeight})`; } } get hostStyleIconWidth() { if (this.isBadgeEllipse) { return `var(--size-scalable-${this.customWidth})`; } } /** * Set CSS variable <code>--v-icon-height</code> which customizes icon height. * @default '--size-scalable-8' */ get customHeight() { return this._customHeight; } set customHeight(value) { this._customHeight = value; } /** * Set CSS variable <code>--v-icon-width</code> which customizes icon width. * @default '--size-scalable-8' */ get customWidth() { return this._customWidth; } set customWidth(value) { this._customWidth = value; } /** * Name of <strong>custom</strong> icon reference. <br /> * Should refer to an icon within an icon sprite in your application. <br /> * The href will reference the string provided directly. No library or iconSize will be added. */ get customIcon() { return this._customIcon; } set customIcon(value) { this._customIcon = value; this.setIcon(); } get hostViewBox() { return `0 0 ${this._computedSize} ${this._computedSize}`; } get hostHeight() { return `${this._computedSize}`; } get hostWidth() { return `${this._computedSize}`; } get hostFocusable() { return 'false'; } get hostAriaHidden() { return 'true'; } constructor() { this._computedSize = 24; this._class = ''; this._rtl = false; this._iconSize = IconSize.TINY; this._library = IconLibrary.VISA; this._isBadgeEllipse = false; this._customHeight = '8'; this._customWidth = '8'; } ngOnInit() { this.setIcon(); } setIcon() { this._computedSize = this.iconSize === IconSize.LOW ? 24 : this.iconSize === IconSize.HIGH ? 48 : 16; this._iconRef = this.customIcon ? this.customIcon : this.icon ? `${this.library}-${this.icon}-${this.iconSize}` : ''; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: IconComponent, isStandalone: true, selector: "[v-icon]", inputs: { class: "class", rtl: "rtl", iconSize: "iconSize", library: "library", icon: "icon", isBadgeEllipse: "isBadgeEllipse", customHeight: "customHeight", customWidth: "customWidth", customIcon: "customIcon" }, host: { properties: { "class": "this.hostClass", "style.--v-icon-primary": "this.hostStyleFill", "style.--v-icon-secondary": "this.hostStyleFill", "style.--v-icon-height": "this.hostStyleIconHeight", "style.--v-icon-width": "this.hostStyleIconWidth", "attr.viewBox": "this.hostViewBox", "attr.height": "this.hostHeight", "attr.width": "this.hostWidth", "attr.focusable": "this.hostFocusable", "attr.aria-hidden": "this.hostAriaHidden" } }, ngImport: i0, template: "<!--\n * Copyright (c) 2025 Visa, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, decorators: [{ type: Component, args: [{ standalone: true, imports: [CommonModule], selector: '[v-icon]', template: "<!--\n * Copyright (c) 2025 Visa, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n" }] }], ctorParameters: () => [], propDecorators: { class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], rtl: [{ type: Input }], iconSize: [{ type: Input }], library: [{ type: Input }], icon: [{ type: Input }], isBadgeEllipse: [{ type: Input }], hostStyleFill: [{ type: HostBinding, args: ['style.--v-icon-primary'] }, { type: HostBinding, args: ['style.--v-icon-secondary'] }], hostStyleIconHeight: [{ type: HostBinding, args: ['style.--v-icon-height'] }], hostStyleIconWidth: [{ type: HostBinding, args: ['style.--v-icon-width'] }], customHeight: [{ type: Input }], customWidth: [{ type: Input }], customIcon: [{ type: Input }], hostViewBox: [{ type: HostBinding, args: ['attr.viewBox'] }], hostHeight: [{ type: HostBinding, args: ['attr.height'] }], hostWidth: [{ type: HostBinding, args: ['attr.width'] }], hostFocusable: [{ type: HostBinding, args: ['attr.focusable'] }], hostAriaHidden: [{ type: HostBinding, args: ['attr.aria-hidden'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvaWNvbi9pY29uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pY29uL2ljb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztJQWVJO0FBQ0osT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRXpEOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sYUFBYTtJQUl4Qjs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxRQUFRO1lBQ1IsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDN0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFD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LFNBQVM7aUNBQ0ksSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2IsVUFBVTt3REFZaEIsS0FBSztzQkFEUixLQUFLO2dCQWdCRixTQUFTO3NCQURaLFdBQVc7dUJBQUMsT0FBTztnQkFVaEIsR0FBRztzQkFETixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBZ0JGLE9BQU87c0JBRFYsS0FBSztnQkFjRixJQUFJO3NCQURQLEtBQUs7Z0JBZ0JGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0YsYUFBYTtzQkFGaEIsV0FBVzt1QkFBQyx3QkFBd0I7O3NCQUNwQyxXQUFXO3VCQUFDLDBCQUEwQjtnQkFRbkMsbUJBQW1CO3NCQUR0QixXQUFXO3VCQUFDLHVCQUF1QjtnQkFRaEMsa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLHNCQUFzQjtnQkFZL0IsWUFBWTtzQkFEZixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFlRixVQUFVO3NCQURiLEtBQUs7Z0JBV0YsV0FBVztzQkFEZCxXQUFXO3VCQUFDLGNBQWM7Z0JBTXZCLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxhQUFhO2dCQU10QixTQUFTO3NCQURaLFdBQVc7dUJBQUMsWUFBWTtnQkFNckIsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBTXpCLGNBQWM7c0JBRGpCLFdBQVc7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJY29uTGlicmFyeSwgSWNvblNpemUgfSBmcm9tICcuL2ljb24uY29uc3RhbnRzJztcblxuLyoqXG4gKiA8Y29kZT5JY29uQ29tcG9uZW50PC9jb2RlPiBpcyBpbnRlbmRlZCA8aT5vbmx5PC9pPiBmb3IgdXNlIHdpdGggaWNvbnMgdXNlZCB3aXRoIGFuIGljb24gc3ByaXRlLiA8YnIgLz5cbiAqIDxzdHJvbmc+U3RhbmRhbG9uZSBpY29ucyBmcm9tIEB2aXNhL25vdmEtaWNvbnMtYW5ndWxhciBpcyByZWNvbW1lbmRlZCBvdmVyIHVzaW5nIHRoZSA8Y29kZT5JY29uQ29tcG9uZW50PC9jb2RlPi48L3N0cm9uZz4uIDxiciAvPlxuICogSWNvbiBjb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgaWNvbnMgZnJvbSBWUERTJyBbSWNvbiBMaWJyYXJ5XShodHRwczovL2Rlc2lnbi52aXNhLmNvbS9pY29ucykuIDxiciAvPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHNlbGVjdG9yOiAnW3YtaWNvbl0nLFxuICB0ZW1wbGF0ZVVybDogJy4vaWNvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWNvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIF9jb21wdXRlZFNpemU6IG51bWJlciA9IDI0O1xuICBfaWNvblJlZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1pY29uLnYtaWNvbi0mbHQ7aWNvblNpemUmZ3Q7LnYtaWNvbi0mbHQ7bGlicmFyeSZndDtcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9jbGFzcyxcbiAgICAgICd2LWljb24nLFxuICAgICAgJ3YtaWNvbi0nICsgdGhpcy5pY29uU2l6ZSxcbiAgICAgICd2LWljb24tJyArIHRoaXMubGlicmFyeSxcbiAgICAgIHRoaXMuaXNCYWRnZUVsbGlwc2UgPyAndi1iYWRnZS1lbGxpcHNlJyA6ICcnLFxuICAgICAgdGhpcy5ydGwgPyAndi1pY29uLXJ0bCcgOiAnJ1xuICAgIF0uam9pbignICcpO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsaXBzIGljb24gZnJvbSByaWdodCB0byBsZWZ0IHdoZW4gdHJ1ZSBhbmQgPGNvZGU+ZGlyPVwicnRsXCIgaXMgcHJlc2VudCBvbiBhIHBhcmVudCBlbGVtZW50LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJ0bCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcnRsO1xuICB9XG4gIHNldCBydGwodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3J0bCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3J0bDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGljb24gcmVzb2x1dGlvbi9zaXplLlxuICAgKiBAZGVmYXVsdCAndGlueScgLyBJY29uU2l6ZS5USU5ZXG4gICAqIEBvcHRpb25zICd0aW55JyB8IEljb25TaXplLlRJTlkgfCA8YnI+ICdsb3cnIHwgSWNvblNpemUuTE9XIHwgPGJyPiAnaGlnaCcgfCBJY29uU2l6ZS5ISUdIXG4gICAqL1xuICAvLyBkZWZhdWx0IG9mIHRpbnkgY2hvc2VuIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQgZm9yIG1ham9yaXR5IG9mIGJ1dHRvbnNcbiAgQElucHV0KClcbiAgZ2V0IGljb25TaXplKCk6IEljb25TaXplIHtcbiAgICByZXR1cm4gdGhpcy5faWNvblNpemU7XG4gIH1cbiAgc2V0IGljb25TaXplKHZhbHVlOiBJY29uU2l6ZSkge1xuICAgIHRoaXMuX2ljb25TaXplID0gdmFsdWU7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cbiAgX2ljb25TaXplOiBJY29uU2l6ZSA9IEljb25TaXplLlRJTlk7XG5cbiAgLyoqXG4gICAqIFRlbGxzIGljb24gd2hpY2ggbGlicmFyeSB0byByZWZlcmVuY2UuXG4gICAqIEBkZWZhdWx0ICd2aXNhJyAvIEljb25MaWJyYXJ5LlZJU0FcbiAgICogQG9wdGlvbnMgJ3Zpc2EnIHwgSWNvbkxpYnJhcnkuVklTQSB8IDxicj4gJ2dlbmVyaWMnIHwgSWNvbkxpYnJhcnkuR0VORVJJQ1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGxpYnJhcnkoKTogSWNvbkxpYnJhcnkge1xuICAgIHJldHVybiB0aGlzLl9saWJyYXJ5O1xuICB9XG4gIHNldCBsaWJyYXJ5KHZhbHVlOiBJY29uTGlicmFyeSkge1xuICAgIHRoaXMuX2xpYnJhcnkgPSB2YWx1ZTtcbiAgfVxuICBfbGlicmFyeTogSWNvbkxpYnJhcnkgPSBJY29uTGlicmFyeS5WSVNBO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIGljb24gdG8gZGlzcGxheS4gPGJyIC8+XG4gICAqIFNob3VsZCByZWZlciB0byBhbiBpY29uIGluIFZQRFMnIFtJY29uIExpYnJhcnldKGh0dHBzOi8vZGVzaWduLnZpc2EuY29tL2ljb25zKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb247XG4gIH1cbiAgc2V0IGljb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2ljb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldEljb24oKTtcbiAgfVxuICBfaWNvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIGljb24gdG8gYmFkZ2UtZWxsaXBzZSB2YXJpYW50IHdoZW4gdHJ1ZS4gPGJyIC8+XG4gICAqIEludGVuZGVkIGZvciB1c2UgaW4gYmFkZ2VzIHdpdGggYW4gaW5kaWNhdG9yLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGlzQmFkZ2VFbGxpcHNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0JhZGdlRWxsaXBzZTtcbiAgfVxuICBzZXQgaXNCYWRnZUVsbGlwc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2lzQmFkZ2VFbGxpcHNlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaXNCYWRnZUVsbGlwc2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLXByaW1hcnknKVxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLXNlY29uZGFyeScpXG4gIGdldCBob3N0U3R5bGVGaWxsKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQmFkZ2VFbGxpcHNlKSB7XG4gICAgICByZXR1cm4gJ3ZhcigtLXYtYmFkZ2UtZWxsaXBzZS1jb2xvciknO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS12LWljb24taGVpZ2h0JylcbiAgZ2V0IGhvc3RTdHlsZUljb25IZWlnaHQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNCYWRnZUVsbGlwc2UpIHtcbiAgICAgIHJldHVybiBgdmFyKC0tc2l6ZS1zY2FsYWJsZS0ke3RoaXMuY3VzdG9tSGVpZ2h0fSlgO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS12LWljb24td2lkdGgnKVxuICBnZXQgaG9zdFN0eWxlSWNvbldpZHRoKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQmFkZ2VFbGxpcHNlKSB7XG4gICAgICByZXR1cm4gYHZhcigtLXNpemUtc2NhbGFibGUtJHt0aGlzLmN1c3RvbVdpZHRofSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ1NTIHZhcmlhYmxlIDxjb2RlPi0tdi1pY29uLWhlaWdodDwvY29kZT4gd2hpY2ggY3VzdG9taXplcyBpY29uIGhlaWdodC5cbiAgICogQGRlZmF1bHQgJy0tc2l6ZS1zY2FsYWJsZS04J1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGN1c3RvbUhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21IZWlnaHQ7XG4gIH1cbiAgc2V0IGN1c3RvbUhlaWdodCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VzdG9tSGVpZ2h0ID0gdmFsdWU7XG4gIH1cbiAgX2N1c3RvbUhlaWdodDogc3RyaW5nID0gJzgnO1xuXG4gIC8qKlxuICAgKiBTZXQgQ1NTIHZhcmlhYmxlIDxjb2RlPi0tdi1pY29uLXdpZHRoPC9jb2RlPiB3aGljaCBjdXN0b21pemVzIGljb24gd2lkdGguXG4gICAqIEBkZWZhdWx0ICctLXNpemUtc2NhbGFibGUtOCdcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjdXN0b21XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21XaWR0aDtcbiAgfVxuICBzZXQgY3VzdG9tV2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2N1c3RvbVdpZHRoID0gdmFsdWU7XG4gIH1cbiAgX2N1c3RvbVdpZHRoOiBzdHJpbmcgPSAnOCc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgPHN0cm9uZz5jdXN0b208L3N0cm9uZz4gaWNvbiByZWZlcmVuY2UuIDxiciAvPlxuICAgKiBTaG91bGQgcmVmZXIgdG8gYW4gaWNvbiB3aXRoaW4gYW4gaWNvbiBzcHJpdGUgaW4geW91ciBhcHBsaWNhdGlvbi4gPGJyIC8+XG4gICAqIFRoZSBocmVmIHdpbGwgcmVmZXJlbmNlIHRoZSBzdHJpbmcgcHJvdmlkZWQgZGlyZWN0bHkuIE5vIGxpYnJhcnkgb3IgaWNvblNpemUgd2lsbCBiZSBhZGRlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjdXN0b21JY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbUljb247XG4gIH1cbiAgc2V0IGN1c3RvbUljb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2N1c3RvbUljb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldEljb24oKTtcbiAgfVxuICBfY3VzdG9tSWNvbjogc3RyaW5nO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci52aWV3Qm94JylcbiAgZ2V0IGhvc3RWaWV3Qm94KCkge1xuICAgIHJldHVybiBgMCAwICR7dGhpcy5fY29tcHV0ZWRTaXplfSAke3RoaXMuX2NvbXB1dGVkU2l6ZX1gO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhlaWdodCcpXG4gIGdldCBob3N0SGVpZ2h0KCkge1xuICAgIHJldHVybiBgJHt0aGlzLl9jb21wdXRlZFNpemV9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci53aWR0aCcpXG4gIGdldCBob3N0V2lkdGgoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuX2NvbXB1dGVkU2l6ZX1gO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZvY3VzYWJsZScpXG4gIGdldCBob3N0Rm9jdXNhYmxlKCkge1xuICAgIHJldHVybiAnZmFsc2UnO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJylcbiAgZ2V0IGhvc3RBcmlhSGlkZGVuKCkge1xuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cblxuICBzZXRJY29uKCkge1xuICAgIHRoaXMuX2NvbXB1dGVkU2l6ZSA9IHRoaXMuaWNvblNpemUgPT09IEljb25TaXplLkxPVyA/IDI0IDogdGhpcy5pY29uU2l6ZSA9PT0gSWNvblNpemUuSElHSCA/IDQ4IDogMTY7XG4gICAgdGhpcy5faWNvblJlZiA9IHRoaXMuY3VzdG9tSWNvblxuICAgICAgPyB0aGlzLmN1c3RvbUljb25cbiAgICAgIDogdGhpcy5pY29uXG4gICAgICAgID8gYCR7dGhpcy5saWJyYXJ5fS0ke3RoaXMuaWNvbn0tJHt0aGlzLmljb25TaXplfWBcbiAgICAgICAgOiAnJztcbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAyNSBWaXNhLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gLS0+XG48c3ZnOnVzZSAqbmdJZj1cIl9pY29uUmVmXCIgW2F0dHIuaHJlZl09XCInIycgKyBfaWNvblJlZlwiIFthdHRyLnhsaW5rOmhyZWZdPVwiJyMnICsgX2ljb25SZWZcIj48L3N2Zzp1c2U+XG48c3ZnOmNpcmNsZSAqbmdJZj1cImlzQmFkZ2VFbGxpcHNlXCIgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjhcIiBzdHlsZT1cImZpbGw6IHZhcigtLXYtYmFkZ2UtZWxsaXBzZS1jb2xvcilcIj48L3N2ZzpjaXJjbGU+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=