// Path: valifi/src/main/java/com/mlykotom/valifi/exceptions/ValiFiException.java
// public class ValiFiException extends RuntimeException {
// 	public ValiFiException() {
// 	}
// 
// 	public ValiFiException(String message) {
// 		super(message);
// 	}
// }
// 
// Path: valifi/src/main/java/com/mlykotom/valifi/exceptions/ValiFiValidatorException.java
// public class ValiFiValidatorException extends ValiFiException {
// 	public ValiFiValidatorException() {}
// 
// 	public ValiFiValidatorException(String message) {
// 		super(message);
// 	}
// }


import android.widget.EditText;
import com.google.android.material.textfield.TextInputLayout;
import com.mlykotom.valifi.exceptions.ValiFiException;
import com.mlykotom.valifi.exceptions.ValiFiValidatorException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;
import androidx.databinding.BindingAdapter;
import androidx.databinding.Observable;
	}

	/**
	 * Adds asynchronous validation which does not block main thread.
	 * Validation is started after delay {@link #setAsyncValidationDelay(long)} and cancels previous async validation
	 *
	 * @param errorMessage to be shown if field does not meet this validation
	 * @param validator implementation of validation
	 * @return this, so validators can be chained
	 */
	public ValiFieldBase<ValueType> addCustomAsyncValidator(String errorMessage, AsyncPropertyValidator<ValueType> validator) {
		if (mAsyncPropertyValidators == null) {
			mAsyncPropertyValidators = new LinkedHashMap<>();
		}

		mAsyncPropertyValidators.put(validator, errorMessage);
		if (mIsChanged) {
			notifyValueChanged(true);
		}
		return this;
	}

	/**
	 * Removes async validator (if any was set)
	 *
	 * @param validator to be removed
	 * @return true if successfully removed, false otherwise
	 */
	public boolean removeAsyncValidator(@NonNull AsyncPropertyValidator<ValueType> validator) {
		if (mAsyncPropertyValidators == null) {
// Path: valifi/src/main/java/com/mlykotom/valifi/exceptions/ValiFiException.java
// public class ValiFiException extends RuntimeException {
// 	public ValiFiException() {
// 	}
// 
// 	public ValiFiException(String message) {
// 		super(message);
// 	}
// }
// 
// Path: valifi/src/main/java/com/mlykotom/valifi/exceptions/ValiFiValidatorException.java
// public class ValiFiValidatorException extends ValiFiException {
// 	public ValiFiValidatorException() {}
// 
// 	public ValiFiValidatorException(String message) {
// 		super(message);
// 	}
// }


// Path: valifi/src/main/java/com/mlykotom/valifi/ValiFieldBase.java
import android.widget.EditText;
import com.google.android.material.textfield.TextInputLayout;
import com.mlykotom.valifi.exceptions.ValiFiException;
import com.mlykotom.valifi.exceptions.ValiFiValidatorException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;
import androidx.databinding.BindingAdapter;
import androidx.databinding.Observable;

	}

	/**
	 * Adds asynchronous validation which does not block main thread.
	 * Validation is started after delay {@link #setAsyncValidationDelay(long)} and cancels previous async validation
	 *
	 * @param errorMessage to be shown if field does not meet this validation
	 * @param validator implementation of validation
	 * @return this, so validators can be chained
	 */
	public ValiFieldBase<ValueType> addCustomAsyncValidator(String errorMessage, AsyncPropertyValidator<ValueType> validator) {
		if (mAsyncPropertyValidators == null) {
			mAsyncPropertyValidators = new LinkedHashMap<>();
		}

		mAsyncPropertyValidators.put(validator, errorMessage);
		if (mIsChanged) {
			notifyValueChanged(true);
		}
		return this;
	}

	/**
	 * Removes async validator (if any was set)
	 *
	 * @param validator to be removed
	 * @return true if successfully removed, false otherwise
	 */
	public boolean removeAsyncValidator(@NonNull AsyncPropertyValidator<ValueType> validator) {
		if (mAsyncPropertyValidators == null) {
			throw new ValiFiException("No async validators were set!");