// 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 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 = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, 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 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 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 extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,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);
  }

}

