@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
121 lines • 19.5 kB
JavaScript
/**
* © 2025 Visa
*
* 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, ContentChild, ContentChildren, HostBinding, Input, QueryList } from '@angular/core';
import { ButtonDirective } from '../button/button.directive';
import { CheckboxDirective } from '../checkbox/checkbox.directive';
import { IconToggleComponent } from '../icon-toggle/icon-toggle.component';
import { InputMessageDirective } from '../input-message/input-message.directive';
import { InputDirective } from '../input/input.directive';
import { LabelDirective } from '../label/label.directive';
import { RadioDirective } from '../radio/radio.directive';
import { SelectDirective } from '../select/select.directive';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class InputContainerComponent {
get hostClasses() {
this.class = ['v-input-container', this.input || this.select ? 'v-surface' : ''].join(' ');
return this.class;
}
/**
* Removes the default toggle icon when true, allowing you to provide your own. <br>
* After the closing <code>select</code> tag, provide your custom icon inside a <code><div class=“v-input-control”></code>.
* @default false
*/
get useCustomIcon() {
return this._useCustomIcon;
}
set useCustomIcon(value) {
this._useCustomIcon = coerceBooleanProperty(value);
}
constructor() {
/**
* Provides custom class(es) for custom styling.
* @default .v-input-container
* @default .v-surface if contains input or select directive.
*/
this.class = '';
}
ngAfterContentInit() {
if (this.buttons.length > 0 && (this.input || this.select)) {
const directive = this.input ? this.input : this.select;
// disabled child buttons if input or select is disabled or readonly
// must call out input readonly specifically since this is not a shared prop with select
if (directive.disabled || (this.input && this.input.readonly)) {
this.setButtonDisabledState(true);
}
// disabled or enable buttons as appropriate depending on input/select readonly and disabled state
directive.communicateState.subscribe((state) => {
if (state.disabled || state.readonly) {
this.setButtonDisabledState(true);
}
else {
this.setButtonDisabledState(false);
}
});
}
if (this.label) {
if (this.checkbox?.id) {
this.label.for = this.checkbox.id;
}
else if (this.radio?.id) {
this.label.for = this.radio.id;
}
}
}
setButtonDisabledState(isDisabled) {
this.buttons.forEach((button) => {
button.disabled = isDisabled;
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InputContainerComponent, isStandalone: true, selector: "[v-input-container]", inputs: { class: "class", useCustomIcon: "useCustomIcon" }, host: { properties: { "class": "this.hostClasses" } }, queries: [{ propertyName: "select", first: true, predicate: SelectDirective, descendants: true }, { propertyName: "input", first: true, predicate: InputDirective, descendants: true }, { propertyName: "message", first: true, predicate: InputMessageDirective, descendants: true }, { propertyName: "checkbox", first: true, predicate: CheckboxDirective, descendants: true }, { propertyName: "radio", first: true, predicate: RadioDirective, descendants: true }, { propertyName: "label", first: true, predicate: LabelDirective, descendants: true }, { propertyName: "buttons", predicate: ButtonDirective }], ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\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<ng-content></ng-content>\n<ng-container *ngIf=\"select && !useCustomIcon\">\n <div class=\"v-input-control\">\n <ng-content select=\"v-icon-visa-toggle\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-down-tiny]\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-up-tiny]\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-down']\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-up']\"></ng-content>\n </div>\n</ng-container>\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: InputContainerComponent, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule, IconToggleComponent], selector: '[v-input-container]', template: "<!--\n * \u00A9 2025 Visa\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<ng-content></ng-content>\n<ng-container *ngIf=\"select && !useCustomIcon\">\n <div class=\"v-input-control\">\n <ng-content select=\"v-icon-visa-toggle\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-down-tiny]\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-up-tiny]\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-down']\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-up']\"></ng-content>\n </div>\n</ng-container>\n" }]
}], ctorParameters: () => [], propDecorators: { select: [{
type: ContentChild,
args: [SelectDirective]
}], buttons: [{
type: ContentChildren,
args: [ButtonDirective]
}], input: [{
type: ContentChild,
args: [InputDirective]
}], message: [{
type: ContentChild,
args: [InputMessageDirective]
}], checkbox: [{
type: ContentChild,
args: [CheckboxDirective]
}], radio: [{
type: ContentChild,
args: [RadioDirective]
}], label: [{
type: ContentChild,
args: [LabelDirective]
}], class: [{
type: Input
}], hostClasses: [{
type: HostBinding,
args: ['class']
}], useCustomIcon: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pbnB1dC1jb250YWluZXIvaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pbnB1dC1jb250YWluZXIvaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFdBQVcsRUFDWCxLQUFLLEVBQ0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQVE3RCxNQUFNLE9BQU8sdUJBQXVCO0lBZWxDLElBQ0ksV0FBVztRQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FB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QUFLO3NCQUFsQyxZQUFZO3VCQUFDLGNBQWM7Z0JBQ1MsT0FBTztzQkFBM0MsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBQ0YsUUFBUTtzQkFBeEMsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBQ0QsS0FBSztzQkFBbEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNFLEtBQUs7c0JBQWxDLFlBQVk7dUJBQUMsY0FBYztnQkFPbkIsS0FBSztzQkFBYixLQUFLO2dCQUVGLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixhQUFhO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDaGVja2JveERpcmVjdGl2ZSB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0TWVzc2FnZURpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0LW1lc3NhZ2UvaW5wdXQtbWVzc2FnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9sYWJlbC9sYWJlbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmFkaW9EaXJlY3RpdmUgfSBmcm9tICcuLi9yYWRpby9yYWRpby5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2VsZWN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvblRvZ2dsZUNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAnW3YtaW5wdXQtY29udGFpbmVyXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGQoU2VsZWN0RGlyZWN0aXZlKSBzZWxlY3Q6IFNlbGVjdERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25EaXJlY3RpdmUpIGJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25EaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkKElucHV0RGlyZWN0aXZlKSBpbnB1dDogSW5wdXREaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoSW5wdXRNZXNzYWdlRGlyZWN0aXZlKSBtZXNzYWdlOiBJbnB1dE1lc3NhZ2VEaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoQ2hlY2tib3hEaXJlY3RpdmUpIGNoZWNrYm94OiBDaGVja2JveERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChSYWRpb0RpcmVjdGl2ZSkgcmFkaW86IFJhZGlvRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKExhYmVsRGlyZWN0aXZlKSBsYWJlbDogTGFiZWxEaXJlY3RpdmU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWlucHV0LWNvbnRhaW5lclxuICAgKiBAZGVmYXVsdCAudi1zdXJmYWNlIGlmIGNvbnRhaW5zIGlucHV0IG9yIHNlbGVjdCBkaXJlY3RpdmUuXG4gICAqL1xuICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNsYXNzID0gWyd2LWlucHV0LWNvbnRhaW5lcicsIHRoaXMuaW5wdXQgfHwgdGhpcy5zZWxlY3QgPyAndi1zdXJmYWNlJyA6ICcnXS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZGVmYXVsdCB0b2dnbGUgaWNvbiB3aGVuIHRydWUsIGFsbG93aW5nIHlvdSB0byBwcm92aWRlIHlvdXIgb3duLiA8YnI+XG4gICAqIEFmdGVyIHRoZSBjbG9zaW5nIDxjb2RlPnNlbGVjdDwvY29kZT4gdGFnLCBwcm92aWRlIHlvdXIgY3VzdG9tIGljb24gaW5zaWRlIGEgPGNvZGU+Jmx0O2RpdiBjbGFzcz0mIzgyMjA7di1pbnB1dC1jb250cm9sJiM4MjIxOyZndDs8L2NvZGU+LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHVzZUN1c3RvbUljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUljb247XG4gIH1cbiAgc2V0IHVzZUN1c3RvbUljb24odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3VzZUN1c3RvbUljb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF91c2VDdXN0b21JY29uOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnV0dG9ucy5sZW5ndGggPiAwICYmICh0aGlzLmlucHV0IHx8IHRoaXMuc2VsZWN0KSkge1xuICAgICAgY29uc3QgZGlyZWN0aXZlID0gdGhpcy5pbnB1dCA/IHRoaXMuaW5wdXQgOiB0aGlzLnNlbGVjdDtcblxuICAgICAgLy8gZGlzYWJsZWQgY2hpbGQgYnV0dG9ucyBpZiBpbnB1dCBvciBzZWxlY3QgaXMgZGlzYWJsZWQgb3IgcmVhZG9ubHlcbiAgICAgIC8vIG11c3QgY2FsbCBvdXQgaW5wdXQgcmVhZG9ubHkgc3BlY2lmaWNhbGx5IHNpbmNlIHRoaXMgaXMgbm90IGEgc2hhcmVkIHByb3Agd2l0aCBzZWxlY3RcbiAgICAgIGlmIChkaXJlY3RpdmUuZGlzYWJsZWQgfHwgKHRoaXMuaW5wdXQgJiYgdGhpcy5pbnB1dC5yZWFkb25seSkpIHtcbiAgICAgICAgdGhpcy5zZXRCdXR0b25EaXNhYmxlZFN0YXRlKHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBkaXNhYmxlZCBvciBlbmFibGUgYnV0dG9ucyBhcyBhcHByb3ByaWF0ZSBkZXBlbmRpbmcgb24gaW5wdXQvc2VsZWN0IHJlYWRvbmx5IGFuZCBkaXNhYmxlZCBzdGF0ZVxuICAgICAgZGlyZWN0aXZlLmNvbW11bmljYXRlU3RhdGUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUuZGlzYWJsZWQgfHwgc3RhdGUucmVhZG9ubHkpIHtcbiAgICAgICAgICB0aGlzLnNldEJ1dHRvbkRpc2FibGVkU3RhdGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRCdXR0b25EaXNhYmxlZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICBpZiAodGhpcy5jaGVja2JveD8uaWQpIHtcbiAgICAgICAgdGhpcy5sYWJlbC5mb3IgPSB0aGlzLmNoZWNrYm94LmlkO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJhZGlvPy5pZCkge1xuICAgICAgICB0aGlzLmxhYmVsLmZvciA9IHRoaXMucmFkaW8uaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QnV0dG9uRGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdCAmJiAhdXNlQ3VzdG9tSWNvblwiPlxuICA8ZGl2IGNsYXNzPVwidi1pbnB1dC1jb250cm9sXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwidi1pY29uLXZpc2EtdG9nZ2xlXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt2LWljb24tdmlzYS1jaGV2cm9uLWRvd24tdGlueV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbi12aXNhLWNoZXZyb24tdXAtdGlueV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbl1baWNvbj0nY2hldnJvbi1kb3duJ11cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbl1baWNvbj0nY2hldnJvbi11cCddXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19