// Signature format: 3.0
package androidx.core.animation {

  public final class AnimatorKt {
    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
  }

}

package androidx.core.content {

  public final class ContentValuesKt {
    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class ContextKt {
    method public static inline <reified T> T! getSystemService(android.content.Context);
    method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
  }

  public final class SharedPreferencesKt {
    method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
  }

}

package androidx.core.content.res {

  public final class TypedArrayKt {
    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
  }

}

package androidx.core.database {

  public final class CursorKt {
    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
    method public static inline String? getStringOrNull(android.database.Cursor, int index);
  }

}

package androidx.core.database.sqlite {

  public final class SQLiteDatabaseKt {
    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
  }

}

package androidx.core.graphics {

  public final class BitmapKt {
    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
    method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
  }

  public final class CanvasKt {
    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
    method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
  }

  public final class ColorKt {
    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
    method public static inline operator int component1(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
    method public static inline operator int component2(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
    method public static inline operator int component3(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
    method public static inline operator int component4(@ColorInt int);
    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
    method public static inline int getAlpha(@ColorInt int);
    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
    method public static inline int getBlue(@ColorInt int);
    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
    method public static inline int getGreen(@ColorInt int);
    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
    method public static inline int getRed(@ColorInt int);
    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
    method @ColorInt public static inline int toColorInt(String);
    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
  }

  public final class ImageDecoderKt {
    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
  }

  public final class MatrixKt {
    method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
    method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
    method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
    method public static inline float[] values(android.graphics.Matrix);
  }

  public final class PaintKt {
    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
  }

  public final class PathKt {
    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
  }

  public final class PictureKt {
    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
  }

  public final class PointKt {
    method public static inline operator int component1(android.graphics.Point);
    method public static inline operator float component1(android.graphics.PointF);
    method public static inline operator int component2(android.graphics.Point);
    method public static inline operator float component2(android.graphics.PointF);
    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
  }

  public final class PorterDuffKt {
    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
  }

  public final class RectKt {
    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator int component1(android.graphics.Rect);
    method public static inline operator float component1(android.graphics.RectF);
    method public static inline operator int component2(android.graphics.Rect);
    method public static inline operator float component2(android.graphics.RectF);
    method public static inline operator int component3(android.graphics.Rect);
    method public static inline operator float component3(android.graphics.RectF);
    method public static inline operator int component4(android.graphics.Rect);
    method public static inline operator float component4(android.graphics.RectF);
    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
  }

  public final class RegionKt {
    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region not(android.graphics.Region);
    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
  }

  public final class ShaderKt {
    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
  }

}

package androidx.core.graphics.drawable {

  public final class BitmapDrawableKt {
    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
  }

  public final class ColorDrawableKt {
    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
  }

  public final class DrawableKt {
    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
    method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
  }

  public final class IconKt {
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
  }

}

package androidx.core.location {

  public final class LocationKt {
    method public static inline operator double component1(android.location.Location);
    method public static inline operator double component2(android.location.Location);
  }

}

package androidx.core.net {

  public final class UriKt {
    method public static java.io.File toFile(android.net.Uri);
    method public static inline android.net.Uri toUri(String);
    method public static inline android.net.Uri toUri(java.io.File);
  }

}

package androidx.core.os {

  public final class BundleKt {
    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class HandlerKt {
    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
  }

  public final class PersistableBundleKt {
    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
  }

  public final class TraceKt {
    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
  }

}

package androidx.core.text {

  public final class CharSequenceKt {
    method public static inline boolean isDigitsOnly(CharSequence);
    method public static inline int trimmedLength(CharSequence);
  }

  public final class HtmlKt {
    method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
    method public static inline String toHtml(android.text.Spanned, int option = 0);
  }

  public final class LocaleKt {
    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
  }

  public final class SpannableStringBuilderKt {
    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
  }

  public final class SpannableStringKt {
    method public static inline void clearSpans(android.text.Spannable);
    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
    method public static inline android.text.Spannable toSpannable(CharSequence);
  }

  public final class SpannedStringKt {
    method public static inline <reified T> T![]! getSpans(android.text.Spanned, int start = 0, int end = length);
    method public static inline android.text.Spanned toSpanned(CharSequence);
  }

  public final class StringKt {
    method public static inline String htmlEncode(String);
  }

}

package androidx.core.transition {

  public final class TransitionKt {
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
  }

}

package androidx.core.util {

  public final class AtomicFileKt {
    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
    method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
  }

  public final class HalfKt {
    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
  }

  public final class LongSparseArrayKt {
    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
  }

  public final class LruCacheKt {
    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> return 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { return null as V }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ ->  });
  }

  public final class PairKt {
    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
  }

  public final class RangeKt {
    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
  }

  public final class SizeKt {
    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
  }

  public final class SparseArrayKt {
    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public static inline <T> int getSize(android.util.SparseArray<T>);
    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
  }

  public final class SparseBooleanArrayKt {
    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
    method public static inline int getSize(android.util.SparseBooleanArray);
    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
  }

  public final class SparseIntArrayKt {
    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
    method public static inline int getSize(android.util.SparseIntArray);
    method public static inline boolean isEmpty(android.util.SparseIntArray);
    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
    method public static boolean remove(android.util.SparseIntArray, int key, int value);
    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
  }

  public final class SparseLongArrayKt {
    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
  }

}

package androidx.core.view {

  public final class MenuKt {
    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
    method public static inline int getSize(android.view.Menu);
    method public static inline boolean isEmpty(android.view.Menu);
    method public static inline boolean isNotEmpty(android.view.Menu);
    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
  }

  public final class ViewGroupKt {
    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
    method public static operator android.view.View get(android.view.ViewGroup, int index);
    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
    method public static inline int getSize(android.view.ViewGroup);
    method public static inline boolean isEmpty(android.view.ViewGroup);
    method public static inline boolean isNotEmpty(android.view.ViewGroup);
    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
  }

  public final class ViewKt {
    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
    method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
    method public static inline int getMarginBottom(android.view.View);
    method public static inline int getMarginEnd(android.view.View);
    method public static inline int getMarginLeft(android.view.View);
    method public static inline int getMarginRight(android.view.View);
    method public static inline int getMarginStart(android.view.View);
    method public static inline int getMarginTop(android.view.View);
    method public static inline boolean isGone(android.view.View);
    method public static inline boolean isInvisible(android.view.View);
    method public static inline boolean isVisible(android.view.View);
    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
    method public static inline void setGone(android.view.View, boolean value);
    method public static inline void setInvisible(android.view.View, boolean value);
    method public static inline void setPadding(android.view.View, @Px int size);
    method public static inline void setVisible(android.view.View, boolean value);
    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
    method public static inline <reified T> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
    method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
  }

}

package androidx.core.widget {

  public final class TextViewKt {
    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ ->  }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
  }

}

