ion-intl-tel-input
Version:
An Ionic component for International Phone Number Input, that allows all countries, validation with google phone lib, limited countries, preferred countries, virtual scrolling and much more.
1,217 lines • 89 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, forwardRef, Output, EventEmitter, ViewChild, ElementRef, HostBinding, } from '@angular/core';
import { NG_VALUE_ACCESSOR, } from '@angular/forms';
import { IonInput, Platform } from '@ionic/angular';
import { PhoneNumberFormat, PhoneNumberUtil, } from 'google-libphonenumber';
import { IonIntlTelInputService } from '../ion-intl-tel-input.service';
// import { ionIntlTelInputValidator } from '../ion-intl-tel-input.directive';
import { raf } from '../util/util';
/**
* @ignore
*/
/**
* @author Azzam Asghar <azzam.asghar@interstellus.com>
*/
export class IonIntlTelInputComponent {
/**
* @param {?} el
* @param {?} platform
* @param {?} ionIntlTelInputService
*/
constructor(el, platform, ionIntlTelInputService) {
this.el = el;
this.platform = platform;
this.ionIntlTelInputService = ionIntlTelInputService;
this.cssClass = true;
/**
* Iso Code of default selected Country.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
*/
this.defaultCountryiso = '';
/**
* Determines whether to use `00` or `+` as dial code prefix.
* Available attributes are '+' | '00'.
* See more on.
*
* \@default +
* \@memberof IonIntlTelInputComponent
*/
this.dialCodePrefix = '+';
/**
* Determines whether to select automatic country based on user input.
* See more on.
*
* \@default false
* \@memberof IonIntlTelInputComponent
*/
this.enableAutoCountrySelect = false;
/**
* Determines whether an example number will be shown as a placeholder in input.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
*/
this.enablePlaceholder = true;
/**
* A fallaback placeholder to be used if no example number is found for a country.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
*/
this.fallbackPlaceholder = '';
/**
* If a custom placeholder is needed for input.
* If this property is set it will override `enablePlaceholder` and only this placeholder will be shown.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
*/
this.inputPlaceholder = '';
/**
* Maximum Length for input.
* See more on.
*
* \@default '15'
* \@memberof IonIntlTelInputComponent
*/
this.maxLength = '15';
/**
* Title of modal opened to select country dial code.
* See more on.
*
* \@default 'Select Country'
* \@memberof IonIntlTelInputComponent
*/
this.modalTitle = 'Select Country';
/**
* CSS class to attach to dial code selectionmodal.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
*/
this.modalCssClass = '';
/**
* Placeholder for input in dial code selection modal.
* See more on.
*
* \@default 'Enter country name'
* \@memberof IonIntlTelInputComponent
*/
this.modalSearchPlaceholder = 'Enter country name';
/**
* Text for close button in dial code selection modal.
* See more on.
*
* \@default 'Close'
* \@memberof IonIntlTelInputComponent
*/
this.modalCloseText = 'Close';
/**
* Slot for close button in dial code selection modal. [Ionic slots](https://ionicframework.com/docs/api/item) are supported
* See more on.
*
* \@default 'end'
* \@memberof IonIntlTelInputComponent
*/
this.modalCloseButtonSlot = 'end';
/**
* Determines whether dial code selection modal should be searchable or not.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
*/
this.modalCanSearch = true;
/**
* Determines whether dial code selection modal is closed on backdrop click.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
*/
this.modalShouldBackdropClose = true;
/**
* Determines whether input should be focused when dial code selection modal is opened.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
*/
this.modalShouldFocusSearchbar = true;
/**
* Message to show when no countries are found for search in dial code selection modal.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
*/
this.modalSearchFailText = 'No countries found';
/**
* List of iso codes of manually selected countries as string, which will appear in the dropdown.
* **Note**: `onlyCountries` should be a string array of country iso codes.
* See more on.
*
* \@default null
* \@memberof IonIntlTelInputComponent
*/
this.onlyCountries = [];
/**
* List of iso codesn as string of countries, which will appear at the top in dial code selection modal.
* **Note**: `preferredCountries` should be a string array of country iso codes.
* See more on.
*
* \@default null
* \@memberof IonIntlTelInputComponent
*/
this.preferredCountries = [];
/**
* Determines whether first country should be selected in dial code select or not.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
*/
this.selectFirstCountry = true;
/**
* Determines whether to visually separate dialcode into the drop down element.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
*/
this.separateDialCode = true;
/**
* Fires when the Phone number Input is changed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.numberChange = new EventEmitter();
/**
* Fires when the Phone number Input is blurred.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.numberBlur = new EventEmitter();
/**
* Fires when the Phone number Input is focused.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.numberFocus = new EventEmitter();
/**
* Fires when the user is typing in Phone number Input.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.numberInput = new EventEmitter();
/**
* Fires when the dial code selection is changed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.codeChange = new EventEmitter();
/**
* Fires when the dial code selection modal is opened.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.codeOpen = new EventEmitter();
/**
* Fires when the dial code selection modal is closed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.codeClose = new EventEmitter();
/**
* Fires when a dial code is selected in dial code selection modal.
* See more on.
*
* \@memberof IonIntlTelInputComponent
*/
this.codeSelect = new EventEmitter();
// tslint:disable-next-line: variable-name
this._value = null;
this.phoneNumber = '';
this.countries = [];
this.disabled = false;
this.phoneUtil = PhoneNumberUtil.getInstance();
this.onTouched = (/**
* @return {?}
*/
() => { });
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
this.startsWith = (/**
* @param {?} input
* @param {?} search
* @return {?}
*/
(input, search) => {
return input.substr(0, search.length) === search;
});
this.getClasses = (/**
* @param {?} element
* @return {?}
*/
(element) => {
/** @type {?} */
const classList = element.classList;
/** @type {?} */
const classes = [];
for (let i = 0; i < classList.length; i++) {
/** @type {?} */
const item = classList.item(i);
if (item !== null && this.startsWith(item, 'ng-')) {
classes.push(`ion-${item.substr(3)}`);
}
}
return classes;
});
this.setClasses = (/**
* @param {?} element
* @param {?} classes
* @return {?}
*/
(element, classes) => {
/** @type {?} */
const classList = element.classList;
[
'ion-valid',
'ion-invalid',
'ion-touched',
'ion-untouched',
'ion-dirty',
'ion-pristine',
].forEach((/**
* @param {?} c
* @return {?}
*/
(c) => classList.remove(c)));
classes.forEach((/**
* @param {?} c
* @return {?}
*/
(c) => classList.add(c)));
});
this.setIonicClasses = (/**
* @param {?} element
* @return {?}
*/
(element) => {
raf((/**
* @return {?}
*/
() => {
/** @type {?} */
const input = (/** @type {?} */ (element.nativeElement));
/** @type {?} */
const classes = this.getClasses(input);
this.setClasses(input, classes);
/** @type {?} */
const item = input.closest('ion-item');
if (item) {
this.setClasses(item, classes);
}
}));
});
this.setItemClass = (/**
* @param {?} element
* @param {?} className
* @param {?} addClass
* @return {?}
*/
(element, className, addClass) => {
/** @type {?} */
const input = (/** @type {?} */ (element.nativeElement));
/** @type {?} */
const item = input.closest('ion-item');
if (item) {
/** @type {?} */
const classList = item.classList;
if (addClass) {
classList.add(className);
}
else {
classList.remove(className);
}
}
});
}
/**
* @return {?}
*/
get hasValueCssClass() {
return this.hasValue();
}
/**
* @return {?}
*/
get isEnabled() {
return !this.disabled;
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @param {?} value
* @return {?}
*/
set value(value) {
this._value = value;
this.setIonicClasses(this.el);
}
/**
* @param {?} change
* @return {?}
*/
emitValueChange(change) {
this.propagateChange(change);
}
/**
* @return {?}
*/
ngOnInit() {
this.isIos = this.platform.is('ios');
this.isMD = !this.isIos;
this.setItemClass(this.el, 'item-interactive', true);
this.fetchAllCountries();
this.setPreferredCountries();
if (this.onlyCountries.length) {
this.countries = this.countries.filter((/**
* @param {?} country
* @return {?}
*/
(country) => this.onlyCountries.includes(country.isoCode)));
}
if (this.selectFirstCountry) {
if (this.defaultCountryiso) {
this.setCountry(this.getCountryByIsoCode(this.defaultCountryiso));
}
else {
if (this.preferredCountries.length &&
this.preferredCountries.includes(this.defaultCountryiso)) {
this.setCountry(this.getCountryByIsoCode(this.preferredCountries[0]));
}
else {
this.setCountry(this.countries[0]);
}
}
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.countries &&
changes.defaulyCountryisoCode &&
changes.defaulyCountryisoCode.currentValue !==
changes.defaulyCountryisoCode.previousValue) {
this.setCountry(changes.defaulyCountryisoCode.currentValue);
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
this.fillValues(obj);
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @param {?} value
* @return {?}
*/
fillValues(value) {
if (value &&
value !== null &&
typeof value === 'object' &&
!this.isNullOrWhiteSpace(value)) {
this.phoneNumber = value.nationalNumber;
this.setCountry(this.getCountryByIsoCode(value.isoCode));
this.value = value;
}
else if (this.value &&
this.value !== null &&
typeof this.value === 'object' &&
!this.isNullOrWhiteSpace(this.value)) {
this.phoneNumber = this.value.nationalNumber;
this.setCountry(this.getCountryByIsoCode(this.value.isoCode));
}
setTimeout((/**
* @return {?}
*/
() => {
this.onNumberChange();
}), 1);
}
/**
* @return {?}
*/
hasValue() {
return !this.isNullOrWhiteSpace(this.value);
}
/**
* @return {?}
*/
onCodeOpen() {
this.codeOpen.emit();
}
/**
* @param {?} event
* @return {?}
*/
onCodeChange(event) {
if (this.isNullOrWhiteSpace(this.phoneNumber)) {
this.emitValueChange(null);
}
else {
/** @type {?} */
let googleNumber;
try {
googleNumber = this.phoneUtil.parse(this.phoneNumber, this.country.isoCode.toUpperCase());
}
catch (e) { }
/** @type {?} */
const internationallNo = googleNumber
? this.phoneUtil.format(googleNumber, PhoneNumberFormat.INTERNATIONAL)
: '';
/** @type {?} */
const nationalNo = googleNumber
? this.phoneUtil.format(googleNumber, PhoneNumberFormat.NATIONAL)
: '';
if (this.separateDialCode && internationallNo) {
this.phoneNumber = this.removeDialCode(internationallNo);
}
this.emitValueChange({
internationalNumber: internationallNo,
nationalNumber: nationalNo,
isoCode: this.country.isoCode,
dialCode: this.dialCodePrefix + this.country.dialCode,
});
this.codeChange.emit();
}
setTimeout((/**
* @return {?}
*/
() => {
this.numberInputEl.setFocus();
}), 400);
}
/**
* @return {?}
*/
onCodeClose() {
this.onTouched();
this.setIonicClasses(this.el);
this.hasFocus = false;
this.setItemClass(this.el, 'item-has-focus', false);
this.codeClose.emit();
}
/**
* @param {?} event
* @return {?}
*/
onCodeSearchCountries(event) {
/** @type {?} */
const text = event.text.trim().toLowerCase();
event.component.startSearch();
event.component.items = this.filterCountries(text);
event.component.endSearch();
}
/**
* @return {?}
*/
onCodeSelect() {
this.codeSelect.emit();
}
/**
* @param {?} event
* @return {?}
*/
onIonNumberChange(event) {
this.setIonicClasses(this.el);
this.numberChange.emit(event);
}
/**
* @return {?}
*/
onIonNumberBlur() {
this.onTouched();
this.setIonicClasses(this.el);
this.hasFocus = false;
this.setItemClass(this.el, 'item-has-focus', false);
this.numberBlur.emit();
}
/**
* @return {?}
*/
onIonNumberFocus() {
this.hasFocus = true;
this.setItemClass(this.el, 'item-has-focus', true);
this.numberFocus.emit();
}
/**
* @param {?} event
* @return {?}
*/
onIonNumberInput(event) {
this.numberInput.emit(event);
}
/**
* @return {?}
*/
onNumberChange() {
if (!this.phoneNumber) {
this.value = null;
this.emitValueChange(null);
return;
}
if (this.country) {
this.emitValueChange({
internationalNumber: this.dialCodePrefix + this.country.dialCode + ' ' + this.phoneNumber,
nationalNumber: this.phoneNumber,
isoCode: this.country.isoCode,
dialCode: this.dialCodePrefix + this.country.dialCode,
});
}
/** @type {?} */
let googleNumber;
try {
googleNumber = this.phoneUtil.parse(this.phoneNumber, this.country.isoCode.toUpperCase());
}
catch (e) {
return;
}
/** @type {?} */
let isoCode = this.country ? this.country.isoCode : null;
// auto select country based on the extension (and areaCode if needed) (e.g select Canada if number starts with +1 416)
if (this.enableAutoCountrySelect) {
isoCode =
googleNumber && googleNumber.getCountryCode()
? this.getCountryIsoCode(googleNumber.getCountryCode(), googleNumber)
: this.country.isoCode;
if (isoCode && isoCode !== this.country.isoCode) {
/** @type {?} */
const newCountry = this.countries.find((/**
* @param {?} country
* @return {?}
*/
(country) => country.isoCode === isoCode));
if (newCountry) {
this.country = newCountry;
}
}
}
isoCode = isoCode ? isoCode : this.country ? this.country.isoCode : null;
if (!this.phoneNumber || !isoCode) {
this.emitValueChange(null);
}
else {
/** @type {?} */
const internationallNo = googleNumber
? this.phoneUtil.format(googleNumber, PhoneNumberFormat.INTERNATIONAL)
: '';
/** @type {?} */
const nationalNo = googleNumber
? this.phoneUtil.format(googleNumber, PhoneNumberFormat.NATIONAL)
: '';
if (this.separateDialCode && internationallNo) {
this.phoneNumber = this.removeDialCode(internationallNo);
}
this.emitValueChange({
internationalNumber: internationallNo,
nationalNumber: nationalNo,
isoCode: this.country.isoCode,
dialCode: this.dialCodePrefix + this.country.dialCode,
});
}
}
/**
* @param {?} event
* @return {?}
*/
onNumberKeyDown(event) {
/** @type {?} */
const allowedChars = /^[0-9\+\-\ ]/;
/** @type {?} */
const allowedCtrlChars = /[axcv]/;
/** @type {?} */
const allowedOtherKeys = [
'ArrowLeft',
'ArrowUp',
'ArrowRight',
'ArrowDown',
'Home',
'End',
'Insert',
'Delete',
'Backspace',
];
if (!allowedChars.test(event.key) &&
!(event.ctrlKey && allowedCtrlChars.test(event.key)) &&
!allowedOtherKeys.includes(event.key)) {
event.preventDefault();
}
}
/**
* @private
* @param {?} text
* @return {?}
*/
filterCountries(text) {
return this.countries.filter((/**
* @param {?} country
* @return {?}
*/
(country) => {
return (country.name.toLowerCase().indexOf(text) !== -1 ||
country.name.toLowerCase().indexOf(text) !== -1 ||
country.dialCode.toString().toLowerCase().indexOf(text) !== -1);
}));
}
/**
* @private
* @param {?} countryCode
* @param {?} googleNumber
* @return {?}
*/
getCountryIsoCode(countryCode, googleNumber) {
/** @type {?} */
const rawNumber = ((/** @type {?} */ (googleNumber))).values_[2].toString();
/** @type {?} */
const countries = this.countries.filter((/**
* @param {?} country
* @return {?}
*/
(country) => country.dialCode === countryCode.toString()));
/** @type {?} */
const mainCountry = countries.find((/**
* @param {?} country
* @return {?}
*/
(country) => country.areaCodes === undefined));
/** @type {?} */
const secondaryCountries = countries.filter((/**
* @param {?} country
* @return {?}
*/
(country) => country.areaCodes !== undefined));
/** @type {?} */
let matchedCountry = mainCountry ? mainCountry.isoCode : undefined;
secondaryCountries.forEach((/**
* @param {?} country
* @return {?}
*/
(country) => {
country.areaCodes.forEach((/**
* @param {?} areaCode
* @return {?}
*/
(areaCode) => {
if (rawNumber.startsWith(areaCode)) {
matchedCountry = country.isoCode;
}
}));
}));
return matchedCountry;
}
/**
* @private
* @return {?}
*/
fetchAllCountries() {
this.countries = this.ionIntlTelInputService.getListOfCountries();
}
/**
* @private
* @param {?} isoCode
* @return {?}
*/
getCountryByIsoCode(isoCode) {
for (const country of this.countries) {
if (country.isoCode === isoCode) {
return country;
}
}
return;
}
/**
* @private
* @param {?} value
* @return {?}
*/
isNullOrWhiteSpace(value) {
if (value === null || value === undefined) {
return true;
}
if (typeof value === 'string' && value === '') {
return true;
}
if (typeof value === 'object' && Object.keys(value).length === 0) {
return true;
}
return false;
}
/**
* @private
* @param {?} phoneNumber
* @return {?}
*/
removeDialCode(phoneNumber) {
if (this.separateDialCode && phoneNumber) {
phoneNumber = phoneNumber.substr(phoneNumber.indexOf(' ') + 1);
}
return phoneNumber;
}
/**
* @private
* @param {?} country
* @return {?}
*/
setCountry(country) {
this.country = country;
this.codeChange.emit(this.country);
}
/**
* @private
* @return {?}
*/
setPreferredCountries() {
for (const preferedCountryIsoCode of this.preferredCountries) {
/** @type {?} */
const country = this.getCountryByIsoCode(preferedCountryIsoCode);
country.priority = country ? 1 : country.priority;
}
this.countries.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a.priority > b.priority ? -1 : a.priority < b.priority ? 1 : 0));
}
}
IonIntlTelInputComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line: component-selector
selector: 'ion-intl-tel-input',
template: "<div class=\"ion-intl-tel-input-code\">\n <ionic-selectable\n #codeSelect\n [(ngModel)]=\"country\"\n [canSearch]=\"modalCanSearch\"\n closeButtonText=\"{{modalCloseText}}\"\n closeButtonSlot=\"{{modalCloseButtonSlot}}\"\n [disabled] = \"disabled\"\n [hasVirtualScroll]=\"true\"\n itemTextField=\"name\"\n [items]=\"countries\"\n itemValueField=\"dialCode\"\n modalCssClass=\"ionic-tel-input-modal {{modalCssClass}}\"\n placeholder=\"Country\"\n searchFailText=\"{{modalSearchFailText}}\"\n searchPlaceholder=\"{{modalSearchPlaceholder}}\"\n [shouldBackdropClose]=\"modalShouldBackdropClose\"\n [shouldFocusSearchbar]=\"modalShouldFocusSearchbar\"\n (onChange)=\"onCodeChange($event)\"\n (onClose)=\"onCodeClose()\"\n (onOpen)=\"onCodeOpen()\"\n (onSearch)=\"onCodeSearchCountries($event)\"\n (onSelect)=\"onCodeSelect()\"\n >\n <ng-template ionicSelectableTitleTemplate>\n {{modalTitle}}\n </ng-template>\n <ng-template ionicSelectableValueTemplate let-country=\"value\">\n <span class=\"flag-icon flag-icon-{{country.flagClass}}\"></span>\n <span *ngIf=\"separateDialCode\">{{dialCodePrefix}}{{country.dialCode}}</span>\n </ng-template>\n <ng-template ionicSelectableItemTemplate let-country=\"item\">\n <span class=\"ion-margin-end\">{{country.name}}</span>\n <span *ngIf=\"separateDialCode\">{{dialCodePrefix}}{{country.dialCode}}</span>\n </ng-template>\n <ng-template ionicSelectableItemEndTemplate let-country=\"item\">\n <span class=\"flag-icon flag-icon-{{country.flagClass}}\"></span>\n </ng-template>\n </ionic-selectable>\n</div>\n\n<div class=\"ion-intl-tel-input-number\">\n <ion-input\n #numberInput\n [(ngModel)]=\"phoneNumber\"\n autocomplete=\"off\"\n [disabled] = \"disabled\" \n [attr.maxLength]=\"maxLength\"\n type=\"tel\"\n (ionBlur)=\"onIonNumberBlur()\"\n (ionChange)=\"onIonNumberChange($event)\"\n (ionFocus)=\"onIonNumberFocus()\"\n (ionInput)=\"onIonNumberInput($event)\"\n (keydown)=\"onNumberKeyDown($event)\"\n (ngModelChange)=\"onNumberChange()\"\n placeholder=\"{{country | countryPlaceholder: inputPlaceholder:separateDialCode:fallbackPlaceholder}}\" >\n </ion-input>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => IonIntlTelInputComponent)),
multi: true,
},
],
styles: [":host{width:100%;display:-webkit-box;display:flex;-webkit-box-align:end;align-items:flex-end}:host .ion-intl-tel-input-code{position:relative}:host .ion-intl-tel-input-number{-webkit-box-flex:1;flex:1}:host .ionic-selectable-label-default,:host .ionic-selectable-label-fixed{max-width:100%}:host .ionic-selectable:not(:host.ionic-selectable-label-stacked):not(:host.ionic-selectable-label-floating) ::ng-deep .ionic-selectable-inner .ionic-selectable-value{padding-top:10px;padding-bottom:10px}:host .ionic-selectable:not(:host.ionic-selectable-label-stacked):not(:host.ionic-selectable-label-floating) ::ng-deep .ionic-selectable-icon-inner{top:17px}:host .flag-icon{margin-right:5px}"]
}] }
];
/** @nocollapse */
IonIntlTelInputComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: Platform },
{ type: IonIntlTelInputService }
];
IonIntlTelInputComponent.propDecorators = {
cssClass: [{ type: HostBinding, args: ['class.ion-intl-tel-input',] }],
isIos: [{ type: HostBinding, args: ['class.ion-intl-tel-input-ios',] }],
isMD: [{ type: HostBinding, args: ['class.ion-intl-tel-input-md',] }],
hasFocus: [{ type: HostBinding, args: ['class.has-focus',] }],
hasValueCssClass: [{ type: HostBinding, args: ['class.ion-intl-tel-input-has-value',] }],
isEnabled: [{ type: HostBinding, args: ['class.ion-intl-tel-input-is-enabled',] }, { type: Input, args: ['isEnabled',] }],
defaultCountryiso: [{ type: Input }],
dialCodePrefix: [{ type: Input }],
enableAutoCountrySelect: [{ type: Input }],
enablePlaceholder: [{ type: Input }],
fallbackPlaceholder: [{ type: Input }],
inputPlaceholder: [{ type: Input }],
maxLength: [{ type: Input }],
modalTitle: [{ type: Input }],
modalCssClass: [{ type: Input }],
modalSearchPlaceholder: [{ type: Input }],
modalCloseText: [{ type: Input }],
modalCloseButtonSlot: [{ type: Input }],
modalCanSearch: [{ type: Input }],
modalShouldBackdropClose: [{ type: Input }],
modalShouldFocusSearchbar: [{ type: Input }],
modalSearchFailText: [{ type: Input }],
onlyCountries: [{ type: Input }],
preferredCountries: [{ type: Input }],
selectFirstCountry: [{ type: Input }],
separateDialCode: [{ type: Input }],
numberChange: [{ type: Output }],
numberBlur: [{ type: Output }],
numberFocus: [{ type: Output }],
numberInput: [{ type: Output }],
codeChange: [{ type: Output }],
codeOpen: [{ type: Output }],
codeClose: [{ type: Output }],
codeSelect: [{ type: Output }],
numberInputEl: [{ type: ViewChild, args: ['numberInput', { static: false },] }]
};
if (false) {
/** @type {?} */
IonIntlTelInputComponent.prototype.cssClass;
/** @type {?} */
IonIntlTelInputComponent.prototype.isIos;
/** @type {?} */
IonIntlTelInputComponent.prototype.isMD;
/** @type {?} */
IonIntlTelInputComponent.prototype.hasFocus;
/**
* Iso Code of default selected Country.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.defaultCountryiso;
/**
* Determines whether to use `00` or `+` as dial code prefix.
* Available attributes are '+' | '00'.
* See more on.
*
* \@default +
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.dialCodePrefix;
/**
* Determines whether to select automatic country based on user input.
* See more on.
*
* \@default false
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.enableAutoCountrySelect;
/**
* Determines whether an example number will be shown as a placeholder in input.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.enablePlaceholder;
/**
* A fallaback placeholder to be used if no example number is found for a country.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.fallbackPlaceholder;
/**
* If a custom placeholder is needed for input.
* If this property is set it will override `enablePlaceholder` and only this placeholder will be shown.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.inputPlaceholder;
/**
* Maximum Length for input.
* See more on.
*
* \@default '15'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.maxLength;
/**
* Title of modal opened to select country dial code.
* See more on.
*
* \@default 'Select Country'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalTitle;
/**
* CSS class to attach to dial code selectionmodal.
* See more on.
*
* \@default ''
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalCssClass;
/**
* Placeholder for input in dial code selection modal.
* See more on.
*
* \@default 'Enter country name'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalSearchPlaceholder;
/**
* Text for close button in dial code selection modal.
* See more on.
*
* \@default 'Close'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalCloseText;
/**
* Slot for close button in dial code selection modal. [Ionic slots](https://ionicframework.com/docs/api/item) are supported
* See more on.
*
* \@default 'end'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalCloseButtonSlot;
/**
* Determines whether dial code selection modal should be searchable or not.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalCanSearch;
/**
* Determines whether dial code selection modal is closed on backdrop click.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalShouldBackdropClose;
/**
* Determines whether input should be focused when dial code selection modal is opened.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalShouldFocusSearchbar;
/**
* Message to show when no countries are found for search in dial code selection modal.
* See more on.
*
* \@default 'true'
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.modalSearchFailText;
/**
* List of iso codes of manually selected countries as string, which will appear in the dropdown.
* **Note**: `onlyCountries` should be a string array of country iso codes.
* See more on.
*
* \@default null
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.onlyCountries;
/**
* List of iso codesn as string of countries, which will appear at the top in dial code selection modal.
* **Note**: `preferredCountries` should be a string array of country iso codes.
* See more on.
*
* \@default null
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.preferredCountries;
/**
* Determines whether first country should be selected in dial code select or not.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.selectFirstCountry;
/**
* Determines whether to visually separate dialcode into the drop down element.
* See more on.
*
* \@default true
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.separateDialCode;
/**
* Fires when the Phone number Input is changed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.numberChange;
/**
* Fires when the Phone number Input is blurred.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.numberBlur;
/**
* Fires when the Phone number Input is focused.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.numberFocus;
/**
* Fires when the user is typing in Phone number Input.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.numberInput;
/**
* Fires when the dial code selection is changed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.codeChange;
/**
* Fires when the dial code selection modal is opened.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.codeOpen;
/**
* Fires when the dial code selection modal is closed.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.codeClose;
/**
* Fires when a dial code is selected in dial code selection modal.
* See more on.
*
* \@memberof IonIntlTelInputComponent
* @type {?}
*/
IonIntlTelInputComponent.prototype.codeSelect;
/** @type {?} */
IonIntlTelInputComponent.prototype.numberInputEl;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype._value;
/** @type {?} */
IonIntlTelInputComponent.prototype.country;
/** @type {?} */
IonIntlTelInputComponent.prototype.phoneNumber;
/** @type {?} */
IonIntlTelInputComponent.prototype.countries;
/** @type {?} */
IonIntlTelInputComponent.prototype.disabled;
/** @type {?} */
IonIntlTelInputComponent.prototype.phoneUtil;
/** @type {?} */
IonIntlTelInputComponent.prototype.onTouched;
/** @type {?} */
IonIntlTelInputComponent.prototype.propagateChange;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.startsWith;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.getClasses;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.setClasses;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.setIonicClasses;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.setItemClass;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.el;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.platform;
/**
* @type {?}
* @private
*/
IonIntlTelInputComponent.prototype.ionIntlTelInputService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uLWludGwtdGVsLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvbi1pbnRsLXRlbC1pbnB1dC8iLCJzb3VyY2VzIjpbImxpYi9pb24taW50bC10ZWwtaW5wdXQvaW9uLWludGwtdGVsLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBRXZFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFtQm5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3Qjs7Ozs7O0lBc1RuQyxZQUNVLEVBQWMsRUFDZCxRQUFrQixFQUNsQixzQkFBOEM7UUFGOUMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXRUeEQsYUFBUSxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUF5QmhCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQzs7Ozs7Ozs7O1FBV3ZCLG1CQUFjLEdBQWUsR0FBRyxDQUFDOzs7Ozs7OztRQVVqQyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7Ozs7Ozs7O1FBVWhDLHNCQUFpQixHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUFVekIsd0JBQW1CLEdBQUcsRUFBRSxDQUFDOzs7Ozs7Ozs7UUFXekIscUJBQWdCLEdBQUcsRUFBRSxDQUFDOzs7Ozs7OztRQVV0QixjQUFTLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztRQVVqQixlQUFVLEdBQUcsZ0JBQWdCLENBQUM7Ozs7Ozs7O1FBVTlCLGtCQUFhLEdBQUcsRUFBRSxDQUFDOzs7Ozs7OztRQVVuQiwyQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7UUFVOUMsbUJBQWMsR0FBRyxPQUFPLENBQUM7Ozs7Ozs7O1FBVXpCLHlCQUFvQixHQUE4QyxLQUFLLENBQUM7Ozs7Ozs7O1FBVXhFLG1CQUFjLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztRQVV0Qiw2QkFBd0IsR0FBRyxJQUFJLENBQUM7Ozs7Ozs7O1FBVWhDLDhCQUF5QixHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUFVakMsd0JBQW1CLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7OztRQVczQyxrQkFBYSxHQUFrQixFQUFFLENBQUM7Ozs7Ozs7OztRQVdsQyx1QkFBa0IsR0FBa0IsRUFBRSxDQUFDOzs7Ozs7OztRQVV2Qyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7Ozs7Ozs7O1FBVTFCLHFCQUFnQixHQUFHLElBQUksQ0FBQzs7Ozs7OztRQVNmLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQzs7Ozs7OztRQVN6QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7Ozs7OztRQVN0QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7Ozs7Ozs7UUFTdkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQzs7Ozs7OztRQVNoRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNyQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNuQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7UUFLdEMsV0FBTSxHQUF5QixJQUFJLENBQUM7UUFHNUMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUMzQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBUSxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFL0MsY0FBUzs7O1FBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFDO1FBQ2pDLG9CQUFlOzs7O1FBQUcsQ0FBQyxDQUE4QixFQUFFLEVBQUUsR0FBRSxDQUFDLEVBQUM7UUFtWGpELGVBQVU7Ozs7O1FBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFXLEVBQUU7WUFDOUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO1FBQ25ELENBQUMsRUFBQztRQUVNLGVBQVU7Ozs7UUFBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRTs7a0JBQ3RDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUzs7a0JBQzdCLE9BQU8sR0FBRyxFQUFFO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztzQkFDbkMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsRUFBQztRQUVNLGVBQVU7Ozs7O1FBQUcsQ0FBQyxPQUFvQixFQUFFLE9BQWlCLEVBQUUsRUFBRTs7a0JBQ3pELFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUztZQUNuQztnQkFDRSxXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsYUFBYTtnQkFDYixlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsY0FBYzthQUNmLENBQUMsT0FBTzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFFdEMsT0FBTyxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzNDLENBQUMsRUFBQztRQUVNLG9CQUFlOzs7O1FBQUcsQ0FBQyxPQUFtQixFQUFFLEVBQUU7WUFDaEQsR0FBRzs7O1lBQUMsR0FBRyxFQUFFOztzQkFDRCxLQUFLLEdBQUcsbUJBQUEsT0FBTyxDQUFDLGFBQWEsRUFBZTs7c0JBQzVDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7O3NCQUUxQixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNoQztZQUNILENBQUMsRUFBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDO1FBRU0saUJBQVk7Ozs7OztRQUFHLENBQ3JCLE9BQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLEVBQUU7O2tCQUNJLEtBQUssR0FBRyxtQkFBQSxPQUFPLENBQUMsYUFBYSxFQUFlOztrQkFDNUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksSUFBSSxFQUFFOztzQkFDRixTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQ2hDLElBQUksUUFBUSxFQUFFO29CQUNaLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzdCO2FBQ0Y7UUFDSCxDQUFDLEVBQUM7SUF2YUMsQ0FBQzs7OztJQWhUSixJQUNJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs7O0lBQ0QsSUFFSSxTQUFTO1FBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQzs7OztJQTBTRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFrQztRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDOzs7OztJQUVELGVBQWUsQ0FBQyxNQUFtQztRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztZQUFDLENBQUMsT0FBaUIsRUFBRSxFQUFFLENBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDN0MsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7YUFDbkU7aUJBQU07Z0JBQ0wsSUFDRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtvQkFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFDeEQ7b0JBQ0EsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BDO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQ0UsSUFBSSxDQUFDLFNBQVM7WUFDZCxPQUFPLENBQUMscUJBQXFCO1lBQzdCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZO2dCQUN4QyxPQUFPLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUM3QztZQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxHQUF5QjtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBMkI7UUFDcEMsSUFDRSxLQUFLO1lBQ0wsS0FBSyxLQUFLLElBQUk7WUFDZCxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUMvQjtZQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNwQjthQUFNLElBQ0wsSUFBSSxDQUFDLEtBQUs7WUFDVixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUk7WUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDOUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNwQztZQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsVUFBVTs7O1FBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7OztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLEtBR1o7UUFDQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjthQUFNOztnQkFDRCxZQUF5QjtZQUM3QixJQUFJO2dCQUNGLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDakMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQ25DLENBQUM7YUFDSDtZQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7O2tCQUVSLGdCQUFnQixHQUFHLFlBQVk7Z0JBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWl