@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
121 lines • 19.6 kB
JavaScript
/**
* 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, 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 * 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<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 * 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<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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QUFLO3NCQUFsQyxZQUFZO3VCQUFDLGNBQWM7Z0JBQ1MsT0FBTztzQkFBM0MsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBQ0YsUUFBUTtzQkFBeEMsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBQ0QsS0FBSztzQkFBbEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNFLEtBQUs7c0JBQWxDLFlBQVk7dUJBQUMsY0FBYztnQkFPbkIsS0FBSztzQkFBYixLQUFLO2dCQUVGLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixhQUFhO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IENoZWNrYm94RGlyZWN0aXZlIH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guZGlyZWN0aXZlJztcbmltcG9ydCB7IEljb25Ub2dnbGVDb21wb25lbnQgfSBmcm9tICcuLi9pY29uLXRvZ2dsZS9pY29uLXRvZ2dsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRNZXNzYWdlRGlyZWN0aXZlIH0gZnJvbSAnLi4vaW5wdXQtbWVzc2FnZS9pbnB1dC1tZXNzYWdlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMYWJlbERpcmVjdGl2ZSB9IGZyb20gJy4uL2xhYmVsL2xhYmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSYWRpb0RpcmVjdGl2ZSB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTZWxlY3REaXJlY3RpdmUgfSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uVG9nZ2xlQ29tcG9uZW50XSxcbiAgc2VsZWN0b3I6ICdbdi1pbnB1dC1jb250YWluZXJdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRDb250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChTZWxlY3REaXJlY3RpdmUpIHNlbGVjdDogU2VsZWN0RGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkcmVuKEJ1dHRvbkRpcmVjdGl2ZSkgYnV0dG9uczogUXVlcnlMaXN0PEJ1dHRvbkRpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGQoSW5wdXREaXJlY3RpdmUpIGlucHV0OiBJbnB1dERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChJbnB1dE1lc3NhZ2VEaXJlY3RpdmUpIG1lc3NhZ2U6IElucHV0TWVzc2FnZURpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChDaGVja2JveERpcmVjdGl2ZSkgY2hlY2tib3g6IENoZWNrYm94RGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKFJhZGlvRGlyZWN0aXZlKSByYWRpbzogUmFkaW9EaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoTGFiZWxEaXJlY3RpdmUpIGxhYmVsOiBMYWJlbERpcmVjdGl2ZTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtaW5wdXQtY29udGFpbmVyXG4gICAqIEBkZWZhdWx0IC52LXN1cmZhY2UgaWYgY29udGFpbnMgaW5wdXQgb3Igc2VsZWN0IGRpcmVjdGl2ZS5cbiAgICovXG4gIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHRoaXMuY2xhc3MgPSBbJ3YtaW5wdXQtY29udGFpbmVyJywgdGhpcy5pbnB1dCB8fCB0aGlzLnNlbGVjdCA/ICd2LXN1cmZhY2UnIDogJyddLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBkZWZhdWx0IHRvZ2dsZSBpY29uIHdoZW4gdHJ1ZSwgYWxsb3dpbmcgeW91IHRvIHByb3ZpZGUgeW91ciBvd24uIDxicj5cbiAgICogQWZ0ZXIgdGhlIGNsb3NpbmcgPGNvZGU+c2VsZWN0PC9jb2RlPiB0YWcsIHByb3ZpZGUgeW91ciBjdXN0b20gaWNvbiBpbnNpZGUgYSA8Y29kZT4mbHQ7ZGl2IGNsYXNzPSYjODIyMDt2LWlucHV0LWNvbnRyb2wmIzgyMjE7Jmd0OzwvY29kZT4uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdXNlQ3VzdG9tSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQ3VzdG9tSWNvbjtcbiAgfVxuICBzZXQgdXNlQ3VzdG9tSWNvbih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdXNlQ3VzdG9tSWNvbiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3VzZUN1c3RvbUljb246IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5idXR0b25zLmxlbmd0aCA+IDAgJiYgKHRoaXMuaW5wdXQgfHwgdGhpcy5zZWxlY3QpKSB7XG4gICAgICBjb25zdCBkaXJlY3RpdmUgPSB0aGlzLmlucHV0ID8gdGhpcy5pbnB1dCA6IHRoaXMuc2VsZWN0O1xuXG4gICAgICAvLyBkaXNhYmxlZCBjaGlsZCBidXR0b25zIGlmIGlucHV0IG9yIHNlbGVjdCBpcyBkaXNhYmxlZCBvciByZWFkb25seVxuICAgICAgLy8gbXVzdCBjYWxsIG91dCBpbnB1dCByZWFkb25seSBzcGVjaWZpY2FsbHkgc2luY2UgdGhpcyBpcyBub3QgYSBzaGFyZWQgcHJvcCB3aXRoIHNlbGVjdFxuICAgICAgaWYgKGRpcmVjdGl2ZS5kaXNhYmxlZCB8fCAodGhpcy5pbnB1dCAmJiB0aGlzLmlucHV0LnJlYWRvbmx5KSkge1xuICAgICAgICB0aGlzLnNldEJ1dHRvbkRpc2FibGVkU3RhdGUodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpc2FibGVkIG9yIGVuYWJsZSBidXR0b25zIGFzIGFwcHJvcHJpYXRlIGRlcGVuZGluZyBvbiBpbnB1dC9zZWxlY3QgcmVhZG9ubHkgYW5kIGRpc2FibGVkIHN0YXRlXG4gICAgICBkaXJlY3RpdmUuY29tbXVuaWNhdGVTdGF0ZS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5kaXNhYmxlZCB8fCBzdGF0ZS5yZWFkb25seSkge1xuICAgICAgICAgIHRoaXMuc2V0QnV0dG9uRGlzYWJsZWRTdGF0ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldEJ1dHRvbkRpc2FibGVkU3RhdGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFiZWwpIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrYm94Py5pZCkge1xuICAgICAgICB0aGlzLmxhYmVsLmZvciA9IHRoaXMuY2hlY2tib3guaWQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmFkaW8/LmlkKSB7XG4gICAgICAgIHRoaXMubGFiZWwuZm9yID0gdGhpcy5yYWRpby5pZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRCdXR0b25EaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH0pO1xuICB9XG59XG4iLCI8IS0tXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAtLT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3QgJiYgIXVzZUN1c3RvbUljb25cIj5cbiAgPGRpdiBjbGFzcz1cInYtaW5wdXQtY29udHJvbFwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cInYtaWNvbi12aXNhLXRvZ2dsZVwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdi1pY29uLXZpc2EtY2hldnJvbi1kb3duLXRpbnldXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt2LWljb24tdmlzYS1jaGV2cm9uLXVwLXRpbnldXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt2LWljb25dW2ljb249J2NoZXZyb24tZG93biddXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt2LWljb25dW2ljb249J2NoZXZyb24tdXAnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==