// Signature format: 3.0
package androidx.ui.autofill {

  public final class AndroidAutofillDebugUtilsKt {
  }

  public final class AndroidAutofillKt {
  }

  public final class AndroidAutofillTypeKt {
  }

  public interface Autofill {
    method public void cancelAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
    method public void requestAutofillForNode(androidx.ui.autofill.AutofillNode autofillNode);
  }

  public final class AutofillNode {
    ctor public AutofillNode(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, androidx.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> component1();
    method public androidx.ui.geometry.Rect? component2();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? component3();
    method public androidx.ui.autofill.AutofillNode copy(java.util.List<? extends androidx.ui.autofill.AutofillType> autofillTypes, androidx.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
    method public java.util.List<androidx.ui.autofill.AutofillType> getAutofillTypes();
    method public androidx.ui.geometry.Rect? getBoundingBox();
    method public int getId();
    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
    method public void setBoundingBox(androidx.ui.geometry.Rect? p);
    property public final int id;
  }

  public final class AutofillTree {
    ctor public AutofillTree();
    method public java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> getChildren();
    method public kotlin.Unit? performAutofill(int id, String value);
    method public operator void plusAssign(androidx.ui.autofill.AutofillNode autofillNode);
    property public final java.util.Map<java.lang.Integer,androidx.ui.autofill.AutofillNode> children;
  }

  public enum AutofillType {
    method public static androidx.ui.autofill.AutofillType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.autofill.AutofillType[] values();
    enum_constant public static final androidx.ui.autofill.AutofillType AddressAuxiliaryDetails;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressCountry;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressLocality;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressRegion;
    enum_constant public static final androidx.ui.autofill.AutofillType AddressStreet;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateDay;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateFull;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType BirthDateYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDate;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationDay;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationMonth;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardExpirationYear;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType CreditCardSecurityCode;
    enum_constant public static final androidx.ui.autofill.AutofillType EmailAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType Gender;
    enum_constant @Deprecated public static final androidx.ui.autofill.AutofillType Name;
    enum_constant public static final androidx.ui.autofill.AutofillType NewPassword;
    enum_constant public static final androidx.ui.autofill.AutofillType NewUsername;
    enum_constant public static final androidx.ui.autofill.AutofillType Password;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFirstName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonFullName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonLastName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleInitial;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonMiddleName;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNamePrefix;
    enum_constant public static final androidx.ui.autofill.AutofillType PersonNameSuffix;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneCountryCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumber;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberDevice;
    enum_constant public static final androidx.ui.autofill.AutofillType PhoneNumberNational;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalAddress;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCode;
    enum_constant public static final androidx.ui.autofill.AutofillType PostalCodeExtended;
    enum_constant public static final androidx.ui.autofill.AutofillType SmsOtpCode;
    enum_constant public static final androidx.ui.autofill.AutofillType Username;
  }

}

package androidx.ui.core {

  @androidx.compose.Immutable public final class AbsoluteAlignment implements androidx.ui.core.Alignment {
    method public androidx.ui.unit.IntOffset align(androidx.ui.unit.IntSize size, androidx.ui.core.LayoutDirection layoutDirection);
    method @androidx.compose.Immutable public androidx.ui.core.AbsoluteAlignment copy(float verticalBias, float horizontalBias);
    field public static final androidx.ui.core.AbsoluteAlignment.Companion Companion;
  }

  public static final class AbsoluteAlignment.Companion {
    method public androidx.ui.core.AbsoluteAlignment getBottomLeft();
    method public androidx.ui.core.AbsoluteAlignment getBottomRight();
    method public androidx.ui.core.AbsoluteAlignment getCenterLeft();
    method public androidx.ui.core.AbsoluteAlignment getCenterRight();
    method public androidx.ui.core.AbsoluteAlignment.Horizontal getLeft();
    method public androidx.ui.core.AbsoluteAlignment.Horizontal getRight();
    method public androidx.ui.core.AbsoluteAlignment getTopLeft();
    method public androidx.ui.core.AbsoluteAlignment getTopRight();
    property public final androidx.ui.core.AbsoluteAlignment BottomLeft;
    property public final androidx.ui.core.AbsoluteAlignment BottomRight;
    property public final androidx.ui.core.AbsoluteAlignment CenterLeft;
    property public final androidx.ui.core.AbsoluteAlignment CenterRight;
    property public final androidx.ui.core.AbsoluteAlignment.Horizontal Left;
    property public final androidx.ui.core.AbsoluteAlignment.Horizontal Right;
    property public final androidx.ui.core.AbsoluteAlignment TopLeft;
    property public final androidx.ui.core.AbsoluteAlignment TopRight;
  }

  @androidx.compose.Immutable public static final class AbsoluteAlignment.Horizontal implements androidx.ui.core.Alignment.Horizontal {
    method public int align(int size, androidx.ui.core.LayoutDirection layoutDirection);
    method @androidx.compose.Immutable public androidx.ui.core.AbsoluteAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.Immutable public interface Alignment {
    method public androidx.ui.unit.IntOffset align(androidx.ui.unit.IntSize size, androidx.ui.core.LayoutDirection layoutDirection = LayoutDirection.Ltr);
    field public static final androidx.ui.core.Alignment.Companion Companion;
  }

  public static final class Alignment.Companion {
    method public androidx.ui.core.Alignment.Vertical getBottom();
    method public androidx.ui.core.Alignment getBottomCenter();
    method public androidx.ui.core.Alignment getBottomEnd();
    method public androidx.ui.core.Alignment getBottomStart();
    method public androidx.ui.core.Alignment getCenter();
    method public androidx.ui.core.Alignment getCenterEnd();
    method public androidx.ui.core.Alignment.Horizontal getCenterHorizontally();
    method public androidx.ui.core.Alignment getCenterStart();
    method public androidx.ui.core.Alignment.Vertical getCenterVertically();
    method public androidx.ui.core.Alignment.Horizontal getEnd();
    method public androidx.ui.core.Alignment.Horizontal getStart();
    method public androidx.ui.core.Alignment.Vertical getTop();
    method public androidx.ui.core.Alignment getTopCenter();
    method public androidx.ui.core.Alignment getTopEnd();
    method public androidx.ui.core.Alignment getTopStart();
    property public final androidx.ui.core.Alignment.Vertical Bottom;
    property public final androidx.ui.core.Alignment BottomCenter;
    property public final androidx.ui.core.Alignment BottomEnd;
    property public final androidx.ui.core.Alignment BottomStart;
    property public final androidx.ui.core.Alignment Center;
    property public final androidx.ui.core.Alignment CenterEnd;
    property public final androidx.ui.core.Alignment.Horizontal CenterHorizontally;
    property public final androidx.ui.core.Alignment CenterStart;
    property public final androidx.ui.core.Alignment.Vertical CenterVertically;
    property public final androidx.ui.core.Alignment.Horizontal End;
    property public final androidx.ui.core.Alignment.Horizontal Start;
    property public final androidx.ui.core.Alignment.Vertical Top;
    property public final androidx.ui.core.Alignment TopCenter;
    property public final androidx.ui.core.Alignment TopEnd;
    property public final androidx.ui.core.Alignment TopStart;
  }

  @androidx.compose.Immutable public static interface Alignment.Horizontal {
    method public int align(int size, androidx.ui.core.LayoutDirection layoutDirection = LayoutDirection.Ltr);
  }

  @androidx.compose.Immutable public static interface Alignment.Vertical {
    method public int align(int size);
  }

  @androidx.compose.Immutable public abstract sealed class AlignmentLine {
    field public static final androidx.ui.core.AlignmentLine.Companion Companion;
    field public static final int Unspecified = -2147483648; // 0x80000000
  }

  public static final class AlignmentLine.Companion {
  }

  public final class AlignmentLineKt {
    method public static int merge(androidx.ui.core.AlignmentLine, int position1, int position2);
  }

  public final class AmbientsKt {
    method public static androidx.compose.ProvidableAmbient<androidx.animation.AnimationClockObservable> getAnimationClockAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.Autofill> getAutofillAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.autofill.AutofillTree> getAutofillTreeAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.clipboard.ClipboardManager> getClipboardManagerAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.unit.Density> getDensityAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.hapticfeedback.HapticFeedback> getHapticFeedBackAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.input.TextInputService> getTextInputServiceAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.texttoolbar.TextToolbar> getTextToolbarAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.platform.UriHandler> getUriHandlerAmbient();
  }

  public final class AndroidAmbientsKt {
    method public static androidx.compose.ProvidableAmbient<android.content.res.Configuration> getConfigurationAmbient();
    method public static androidx.compose.ProvidableAmbient<android.content.Context> getContextAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.lifecycle.LifecycleOwner> getLifecycleOwnerAmbient();
    method public static androidx.compose.ProvidableAmbient<android.view.View> getViewAmbient();
    method public static androidx.compose.ProvidableAmbient<androidx.lifecycle.ViewModelStoreOwner> getViewModelStoreOwnerAmbient();
  }

  public final class AndroidComposeViewKt {
    method public static androidx.ui.core.AndroidOwner AndroidOwner(android.content.Context context, androidx.lifecycle.LifecycleOwner? lifecycleOwner = null, androidx.lifecycle.ViewModelStoreOwner? viewModelStoreOwner = null);
    method public static androidx.ui.core.LayoutDirection getLocaleLayoutDirection(android.content.res.Configuration);
  }

  public interface AndroidOwner extends androidx.ui.core.Owner {
    method public void addAndroidView(android.view.View view, androidx.ui.core.LayoutNode layoutNode);
    method public kotlin.jvm.functions.Function0<kotlin.Unit> getConfigurationChangeObserver();
    method public android.view.View getView();
    method public androidx.ui.core.AndroidOwner.ViewTreeOwners? getViewTreeOwners();
    method public void removeAndroidView(android.view.View view);
    method public void setConfigurationChangeObserver(kotlin.jvm.functions.Function0<kotlin.Unit> p);
    method public void setOnViewTreeOwnersAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner.ViewTreeOwners,kotlin.Unit> callback);
    property public abstract kotlin.jvm.functions.Function0<kotlin.Unit> configurationChangeObserver;
    property public abstract android.view.View view;
    property public abstract androidx.ui.core.AndroidOwner.ViewTreeOwners? viewTreeOwners;
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class AndroidOwner.Companion {
    method public kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? getOnAndroidOwnerCreatedCallback();
    method @org.jetbrains.annotations.TestOnly public void setOnAndroidOwnerCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.ui.core.AndroidOwner,kotlin.Unit>? p);
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.AndroidOwner,kotlin.Unit>? onAndroidOwnerCreatedCallback;
  }

  public static final class AndroidOwner.ViewTreeOwners {
    ctor public AndroidOwner.ViewTreeOwners(androidx.lifecycle.LifecycleOwner lifecycleOwner, androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
    method public androidx.lifecycle.LifecycleOwner getLifecycleOwner();
    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner();
  }

  public final class ClipKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier clip(androidx.ui.core.Modifier, androidx.ui.graphics.Shape shape);
    method @androidx.compose.Stable public static androidx.ui.core.Modifier clipToBounds(androidx.ui.core.Modifier);
  }

  public final class CombinedModifier implements androidx.ui.core.Modifier {
    ctor public CombinedModifier(androidx.ui.core.Modifier outer, androidx.ui.core.Modifier inner);
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ComposedModifierKt {
    method public static androidx.ui.core.Modifier composed(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier,? extends androidx.ui.core.Modifier> factory);
    method public static androidx.ui.core.Modifier materialize(androidx.compose.Composer<?>, androidx.ui.core.Modifier modifier);
  }

  @androidx.compose.Immutable public final class ConsumedData {
    ctor public ConsumedData(androidx.ui.geometry.Offset positionChange, boolean downChange);
    ctor public ConsumedData();
    method public androidx.ui.geometry.Offset component1();
    method public boolean component2();
    method @androidx.compose.Immutable public androidx.ui.core.ConsumedData copy(androidx.ui.geometry.Offset positionChange, boolean downChange);
    method public boolean getDownChange();
    method public androidx.ui.geometry.Offset getPositionChange();
  }

  public abstract class ContentDrawScope extends androidx.ui.graphics.drawscope.DrawScope {
    ctor public ContentDrawScope();
    method public abstract void drawContent();
  }

  @androidx.compose.Stable public interface ContentScale {
    method public float scale(androidx.ui.geometry.Size srcSize, androidx.ui.geometry.Size dstSize);
    field public static final androidx.ui.core.ContentScale.Companion Companion;
  }

  public static final class ContentScale.Companion {
    method public androidx.ui.core.ContentScale getCrop();
    method public androidx.ui.core.ContentScale getFillHeight();
    method public androidx.ui.core.ContentScale getFillWidth();
    method public androidx.ui.core.ContentScale getFit();
    method public androidx.ui.core.ContentScale getInside();
    method public androidx.ui.core.FixedScale getNone();
    property public final androidx.ui.core.ContentScale Crop;
    property public final androidx.ui.core.ContentScale FillHeight;
    property public final androidx.ui.core.ContentScale FillWidth;
    property public final androidx.ui.core.ContentScale Fit;
    property public final androidx.ui.core.ContentScale Inside;
    property public final androidx.ui.core.FixedScale None;
  }

  public final class ContentScaleKt {
  }

  public interface CustomEvent {
  }

  public interface CustomEventDispatcher {
    method public void dispatchCustomEvent(androidx.ui.core.CustomEvent event);
    method public void releaseHitPaths(java.util.Set<androidx.ui.core.PointerId> pointerIds);
    method public void retainHitPaths(java.util.Set<androidx.ui.core.PointerId> pointerIds);
  }

  public final class DebugUtilsKt {
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String simpleIdentityToString(Object obj, String? name = null);
  }

  @kotlin.PublishedApi internal final class DefaultIntrinsicMeasurable implements androidx.ui.core.Measurable {
    ctor public DefaultIntrinsicMeasurable(androidx.ui.core.IntrinsicMeasurable measurable, androidx.ui.core.IntrinsicMinMax minMax, androidx.ui.core.IntrinsicWidthHeight widthHeight);
    method public androidx.ui.core.IntrinsicMeasurable getMeasurable();
    method public androidx.ui.core.IntrinsicMinMax getMinMax();
    method public Object? getParentData();
    method public androidx.ui.core.IntrinsicWidthHeight getWidthHeight();
    method public int maxIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    property public Object? parentData;
  }

  public enum Direction {
    method public static androidx.ui.core.Direction valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.Direction[] values();
    enum_constant public static final androidx.ui.core.Direction DOWN;
    enum_constant public static final androidx.ui.core.Direction LEFT;
    enum_constant public static final androidx.ui.core.Direction RIGHT;
    enum_constant public static final androidx.ui.core.Direction UP;
  }

  public interface DrawLayerModifier extends androidx.ui.core.Modifier.Element {
    method @FloatRange(from=0.0, to=1.0) public default float getAlpha();
    method public default boolean getClip();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationX();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationY();
    method @FloatRange(from=0.0, to=360.0) public default float getRotationZ();
    method public default float getScaleX();
    method public default float getScaleY();
    method @FloatRange(from=0.0) public default float getShadowElevation();
    method public default androidx.ui.graphics.Shape getShape();
    method public default long getTransformOrigin();
    method public default float getTranslationX();
    method public default float getTranslationY();
    property @FloatRange(from=0.0, to=1.0) public default float alpha;
    property public default boolean clip;
    property @FloatRange(from=0.0, to=360.0) public default float rotationX;
    property @FloatRange(from=0.0, to=360.0) public default float rotationY;
    property @FloatRange(from=0.0, to=360.0) public default float rotationZ;
    property public default float scaleX;
    property public default float scaleY;
    property @FloatRange(from=0.0) public default float shadowElevation;
    property public default androidx.ui.graphics.Shape shape;
    property public default long transformOrigin;
    property public default float translationX;
    property public default float translationY;
  }

  public final class DrawLayerModifierKt {
    method public static inline long TransformOrigin(float pivotFractionX, float pivotFractionY);
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawLayer-RgGWxk0(androidx.ui.core.Modifier, float scaleX = 1f, float scaleY = 1f, float alpha = 1f, float translationX = 0f, float translationY = 0f, float shadowElevation = 0f, float rotationX = 0f, float rotationY = 0f, float rotationZ = 0f, long transformOrigin = TransformOrigin.Center, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = false);
  }

  public interface DrawModifier extends androidx.ui.core.Modifier.Element {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawModifierKt {
    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
  }

  public final class DrawShadowKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
  }

  public enum DropDownAlignment {
    method public static androidx.ui.core.DropDownAlignment valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.DropDownAlignment[] values();
    enum_constant public static final androidx.ui.core.DropDownAlignment End;
    enum_constant public static final androidx.ui.core.DropDownAlignment Start;
  }

  @androidx.compose.Immutable public final class FixedScale implements androidx.ui.core.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method @androidx.compose.Immutable public androidx.ui.core.FixedScale copy(float value);
    method public float getValue();
    method public float scale(androidx.ui.geometry.Size srcSize, androidx.ui.geometry.Size dstSize);
  }

  public final class HorizontalAlignmentLine extends androidx.ui.core.AlignmentLine {
    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    property public abstract Object? parentData;
  }

  public final class IntrinsicMeasurableKt {
  }

  public abstract class IntrinsicMeasureScope implements androidx.ui.unit.Density {
    ctor public IntrinsicMeasureScope();
    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
    method public final int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasurable, int height);
    method public final int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasurable, int width);
    method public final int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasurable, int height);
    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
  }

  @kotlin.PublishedApi internal enum IntrinsicMinMax {
    method public static androidx.ui.core.IntrinsicMinMax valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.IntrinsicMinMax[] values();
    enum_constant public static final androidx.ui.core.IntrinsicMinMax Max;
    enum_constant public static final androidx.ui.core.IntrinsicMinMax Min;
  }

  @kotlin.PublishedApi internal enum IntrinsicWidthHeight {
    method public static androidx.ui.core.IntrinsicWidthHeight valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.IntrinsicWidthHeight[] values();
    enum_constant public static final androidx.ui.core.IntrinsicWidthHeight Height;
    enum_constant public static final androidx.ui.core.IntrinsicWidthHeight Width;
  }

  @kotlin.PublishedApi internal final class IntrinsicsMeasureScope extends androidx.ui.core.MeasureScope implements androidx.ui.unit.Density {
    ctor public IntrinsicsMeasureScope(androidx.ui.unit.Density density, androidx.ui.core.LayoutDirection layoutDirection);
    method public float getDensity();
    method public float getFontScale();
    method public androidx.ui.core.LayoutDirection getLayoutDirection();
    method @androidx.compose.Stable public float toDp(float);
    method @androidx.compose.Stable public float toDp(int);
    method @androidx.compose.Stable public float toDp-vVlMl6k(long);
    method @androidx.compose.Stable public int toIntPx-ipo6vVg(float);
    method @androidx.compose.Stable public int toIntPx-vVlMl6k(long);
    method @androidx.compose.Stable public float toPx-ipo6vVg(float);
    method @androidx.compose.Stable public float toPx-vVlMl6k(long);
    method @androidx.compose.Stable public androidx.ui.geometry.Rect toRect(androidx.ui.unit.Bounds);
    method @androidx.compose.Stable public long toSp(float);
    method @androidx.compose.Stable public long toSp(int);
    method @androidx.compose.Stable public long toSp-ipo6vVg(float);
  }

  public interface LayoutCoordinates {
    method public androidx.ui.unit.PxBounds childBoundingBox(androidx.ui.core.LayoutCoordinates child);
    method public androidx.ui.geometry.Offset childToLocal(androidx.ui.core.LayoutCoordinates child, androidx.ui.geometry.Offset childLocal);
    method public operator int get(androidx.ui.core.AlignmentLine line);
    method public androidx.ui.core.LayoutCoordinates? getParentCoordinates();
    method public java.util.Set<androidx.ui.core.AlignmentLine> getProvidedAlignmentLines();
    method public androidx.ui.unit.IntSize getSize();
    method public androidx.ui.geometry.Offset globalToLocal(androidx.ui.geometry.Offset global);
    method public boolean isAttached();
    method public androidx.ui.geometry.Offset localToGlobal(androidx.ui.geometry.Offset local);
    method public androidx.ui.geometry.Offset localToRoot(androidx.ui.geometry.Offset local);
    property public abstract boolean isAttached;
    property public abstract androidx.ui.core.LayoutCoordinates? parentCoordinates;
    property public abstract java.util.Set<androidx.ui.core.AlignmentLine> providedAlignmentLines;
    property public abstract androidx.ui.unit.IntSize size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.ui.unit.PxBounds getBoundsInParent(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.unit.PxBounds getBoundsInRoot(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.unit.PxBounds getGlobalBounds(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.ui.geometry.Offset getGlobalPosition(androidx.ui.core.LayoutCoordinates);
    method public static androidx.ui.geometry.Offset getPositionInParent(androidx.ui.core.LayoutCoordinates);
    method public static inline androidx.ui.geometry.Offset getPositionInRoot(androidx.ui.core.LayoutCoordinates);
  }

  public final class LayoutIdKt {
    method public static Object? getId(androidx.ui.core.Measurable);
    method @Deprecated public static Object? getTag(androidx.ui.core.Measurable);
    method @androidx.compose.Stable public static androidx.ui.core.Modifier layoutId(androidx.ui.core.Modifier, Object id);
    method @Deprecated @androidx.compose.Stable public static androidx.ui.core.Modifier tag(androidx.ui.core.Modifier, Object tag);
  }

  public interface LayoutIdParentData {
    method public Object getId();
    property public abstract Object id;
  }

  public final class LayoutKt {
    method @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.ui.core.LayoutDirection,java.lang.Integer> minIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.ui.core.LayoutDirection,java.lang.Integer> minIntrinsicHeightMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.ui.core.LayoutDirection,java.lang.Integer> maxIntrinsicWidthMeasureBlock, kotlin.jvm.functions.Function4<? super androidx.ui.core.IntrinsicMeasureScope,? super java.util.List<? extends androidx.ui.core.IntrinsicMeasurable>,? super java.lang.Integer,? super androidx.ui.core.LayoutDirection,java.lang.Integer> maxIntrinsicHeightMeasureBlock, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @androidx.compose.Composable public static void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> children, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method public static androidx.ui.core.LayoutNode.MeasureBlocks MeasuringIntrinsicsMeasureBlocks(kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @Deprecated @androidx.compose.Composable public static void MultiMeasureLayout(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children, kotlin.jvm.functions.Function4<? super androidx.ui.core.MeasureScope,? super java.util.List<? extends androidx.ui.core.Measurable>,? super androidx.ui.core.Constraints,? super androidx.ui.core.LayoutDirection,? extends androidx.ui.core.MeasureScope.MeasureResult> measureBlock);
    method @androidx.compose.Composable public static void WithConstraints(androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.WithConstraintsScope,kotlin.Unit> children);
  }

  public interface LayoutModifier extends androidx.ui.core.Modifier.Element {
    method public default int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope, androidx.ui.core.Measurable measurable, androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public default int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope, androidx.ui.core.IntrinsicMeasurable measurable, int height, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public final class LayoutNode implements androidx.ui.core.Measurable {
    ctor public LayoutNode();
    method public void attach(androidx.ui.core.Owner owner);
    method public void detach();
    method public void draw(androidx.ui.graphics.Canvas canvas);
    method public Integer? getAlignmentLine(androidx.ui.core.AlignmentLine line);
    method @Deprecated public boolean getCanMultiMeasure();
    method public java.util.List<androidx.ui.core.LayoutNode> getChildren();
    method public androidx.ui.core.LayoutCoordinates getCoordinates();
    method public int getDepth();
    method public int getHeight();
    method public androidx.ui.core.LayoutNode.LayoutState getLayoutState();
    method public androidx.ui.core.LayoutNode.MeasureBlocks getMeasureBlocks();
    method public androidx.ui.core.MeasureScope getMeasureScope();
    method public androidx.ui.core.Modifier getModifier();
    method public java.util.List<androidx.ui.core.ModifierInfo> getModifierInfo();
    method public kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? getOnAttach();
    method public kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? getOnDetach();
    method public androidx.ui.core.Owner? getOwner();
    method public androidx.ui.core.LayoutNode? getParent();
    method public Object? getParentData();
    method public androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? getRef();
    method public int getWidth();
    method public void hitTest(androidx.ui.geometry.Offset pointerPositionRelativeToScreen, java.util.List<androidx.ui.core.pointerinput.PointerInputFilter> hitPointerInputFilters);
    method public void ignoreModelReads(kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void insertAt(int index, androidx.ui.core.LayoutNode instance);
    method public boolean isPlaced();
    method public int maxIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(int width, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(int height, androidx.ui.core.LayoutDirection layoutDirection);
    method public void move(int from, int to, int count);
    method public void onInvalidate();
    method public void place(int x, int y);
    method public void removeAt(int index, int count);
    method public void requestRelayout();
    method public void requestRemeasure();
    method @Deprecated public void setCanMultiMeasure(boolean p);
    method public void setDepth(int p);
    method public void setMeasureBlocks(androidx.ui.core.LayoutNode.MeasureBlocks value);
    method public void setModifier(androidx.ui.core.Modifier value);
    method public void setOnAttach(kotlin.jvm.functions.Function1<? super androidx.ui.core.Owner,kotlin.Unit>? p);
    method public void setOnDetach(kotlin.jvm.functions.Function1<? super androidx.ui.core.Owner,kotlin.Unit>? p);
    method public void setRef(androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? value);
    property @Deprecated public final boolean canMultiMeasure;
    property public final java.util.List<androidx.ui.core.LayoutNode> children;
    property public final androidx.ui.core.LayoutCoordinates coordinates;
    property public final int depth;
    property public final int height;
    property public final boolean isPlaced;
    property public final androidx.ui.core.LayoutNode.LayoutState layoutState;
    property public final androidx.ui.core.LayoutNode.MeasureBlocks measureBlocks;
    property public final androidx.ui.core.MeasureScope measureScope;
    property public final androidx.ui.core.Modifier modifier;
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? onAttach;
    property public final kotlin.jvm.functions.Function1<androidx.ui.core.Owner,kotlin.Unit>? onDetach;
    property public final androidx.ui.core.Owner? owner;
    property public final androidx.ui.core.LayoutNode? parent;
    property public Object? parentData;
    property public final androidx.ui.core.Ref<androidx.ui.core.LayoutNode>? ref;
    property public final int width;
  }

  public enum LayoutNode.LayoutState {
    method public static androidx.ui.core.LayoutNode.LayoutState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.LayoutNode.LayoutState[] values();
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState LayingOut;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState Measuring;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState NeedsRelayout;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState NeedsRemeasure;
    enum_constant public static final androidx.ui.core.LayoutNode.LayoutState Ready;
  }

  public static interface LayoutNode.MeasureBlocks {
    method public int maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public int maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.LayoutDirection layoutDirection);
    method public androidx.ui.core.MeasureScope.MeasureResult measure(androidx.ui.core.MeasureScope measureScope, java.util.List<? extends androidx.ui.core.Measurable> measurables, androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public int minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public abstract static class LayoutNode.NoIntrinsicsMeasureBlocks implements androidx.ui.core.LayoutNode.MeasureBlocks {
    ctor public LayoutNode.NoIntrinsicsMeasureBlocks(String error);
    method public Void maxIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public Void maxIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.LayoutDirection layoutDirection);
    method public Void minIntrinsicHeight(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int w, androidx.ui.core.LayoutDirection layoutDirection);
    method public Void minIntrinsicWidth(androidx.ui.core.IntrinsicMeasureScope intrinsicMeasureScope, java.util.List<? extends androidx.ui.core.IntrinsicMeasurable> measurables, int h, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public final class LayoutNodeKt {
    method public static androidx.ui.core.LayoutNode? findClosestParentNode(androidx.ui.core.LayoutNode, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutNode,java.lang.Boolean> selector);
  }

  @Deprecated public interface LayoutTagParentData {
    method @Deprecated public Object getTag();
    property public abstract Object tag;
  }

  public interface Measurable extends androidx.ui.core.IntrinsicMeasurable {
    method public androidx.ui.core.Placeable measure(androidx.ui.core.Constraints constraints, androidx.ui.core.LayoutDirection layoutDirection);
  }

  public abstract class MeasureScope extends androidx.ui.core.IntrinsicMeasureScope {
    ctor public MeasureScope();
    method public final androidx.ui.core.MeasureScope.MeasureResult layout(int width, int height, java.util.Map<androidx.ui.core.AlignmentLine,java.lang.Integer> alignmentLines = emptyMap(), kotlin.jvm.functions.Function1<? super androidx.ui.core.Placeable.PlacementScope,kotlin.Unit> placementBlock);
    method public final androidx.ui.core.Placeable measure(androidx.ui.core.Measurable, androidx.ui.core.Constraints constraints);
  }

  public static interface MeasureScope.MeasureResult {
    method public java.util.Map<androidx.ui.core.AlignmentLine,java.lang.Integer> getAlignmentLines();
    method public int getHeight();
    method public int getWidth();
    method public void placeChildren(androidx.ui.core.LayoutDirection layoutDirection);
    property public abstract java.util.Map<androidx.ui.core.AlignmentLine,java.lang.Integer> alignmentLines;
    property public abstract int height;
    property public abstract int width;
  }

  public final class MeasureScopeKt {
  }

  public final inline class Measured {
    ctor public Measured();
    method public static androidx.ui.core.Placeable! constructor-impl(internal androidx.ui.core.Placeable placeable);
    method public static inline boolean equals-impl(androidx.ui.core.Placeable! p, Object? p1);
    method public static boolean equals-impl0(androidx.ui.core.Placeable p1, androidx.ui.core.Placeable p2);
    method public static operator int get-impl(androidx.ui.core.Placeable $this, androidx.ui.core.AlignmentLine alignmentLine);
    method public static int getHeight-impl(androidx.ui.core.Placeable! $this);
    method public static int getWidth-impl(androidx.ui.core.Placeable! $this);
    method public static inline int hashCode-impl(androidx.ui.core.Placeable! p);
    method public static inline String! toString-impl(androidx.ui.core.Placeable! p);
  }

  public final class ModelObserver {
    ctor public ModelObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> commitExecutor);
    method public void clear(Object target);
    method public void enableModelUpdatesObserving(boolean enabled);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @org.jetbrains.annotations.TestOnly public kotlin.jvm.functions.Function2<java.util.Set<?>,androidx.compose.frames.Frame,kotlin.Unit> getFrameCommitObserver();
    method public <T> void observeReads(T target, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onCommit, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void pauseObservingReads(kotlin.jvm.functions.Function0<kotlin.Unit> block);
    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @org.jetbrains.annotations.TestOnly public final kotlin.jvm.functions.Function2<java.util.Set<?>,androidx.compose.frames.Frame,kotlin.Unit> frameCommitObserver;
  }

  @androidx.compose.Stable public interface Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
    method public default operator androidx.ui.core.Modifier plus(androidx.ui.core.Modifier other);
    field public static final androidx.ui.core.Modifier.Companion Companion;
  }

  public static final class Modifier.Companion implements androidx.ui.core.Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
    method @Deprecated public androidx.ui.core.Modifier getNone();
    property @Deprecated public final androidx.ui.core.Modifier None;
  }

  public static interface Modifier.Element extends androidx.ui.core.Modifier {
    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.ui.core.Modifier.Element,java.lang.Boolean> predicate);
    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.ui.core.Modifier.Element,? extends R> operation);
    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.ui.core.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ModifierInfo {
    ctor public ModifierInfo(androidx.ui.core.Modifier modifier, androidx.ui.core.LayoutCoordinates coordinates, Object? extra);
    method public androidx.ui.core.LayoutCoordinates getCoordinates();
    method public Object? getExtra();
    method public androidx.ui.core.Modifier getModifier();
  }

  public interface OnChildPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onChildPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public interface OnPositionedModifier extends androidx.ui.core.Modifier.Element {
    method public void onPositioned(androidx.ui.core.LayoutCoordinates coordinates);
  }

  public final class OnPositionedModifierKt {
    method public static androidx.ui.core.Modifier onChildPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onChildPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onChildPositioned);
    method public static androidx.ui.core.Modifier onPositioned(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
    method @Deprecated public static androidx.ui.core.Modifier onPositioned(kotlin.jvm.functions.Function1<? super androidx.ui.core.LayoutCoordinates,kotlin.Unit> onPositioned);
  }

  public final class OpacityKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier drawOpacity(androidx.ui.core.Modifier, @FloatRange(from=0.0, to=1.0) float opacity);
  }

  public interface OwnedLayer {
    method public void destroy();
    method public void drawLayer(androidx.ui.graphics.Canvas canvas);
    method public long getLayerId();
    method public android.graphics.Matrix getMatrix();
    method public void invalidate();
    method public void move(androidx.ui.unit.IntOffset position);
    method public void resize(androidx.ui.unit.IntSize size);
    method public void updateDisplayList();
    method public void updateLayerProperties();
    property public abstract long layerId;
  }

  public interface Owner {
    method public androidx.ui.unit.IntOffset calculatePosition();
    method public androidx.ui.core.OwnedLayer createLayer(androidx.ui.core.DrawLayerModifier drawLayerModifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> drawBlock, kotlin.jvm.functions.Function0<kotlin.Unit> invalidateParentLayer);
    method public androidx.ui.autofill.Autofill? getAutofill();
    method public androidx.ui.autofill.AutofillTree getAutofillTree();
    method public androidx.ui.core.clipboard.ClipboardManager getClipboardManager();
    method public androidx.ui.unit.Density getDensity();
    method public androidx.ui.text.font.Font.ResourceLoader getFontLoader();
    method public androidx.ui.core.hapticfeedback.HapticFeedback getHapticFeedBack();
    method public long getMeasureIteration();
    method public androidx.ui.core.LayoutNode getRoot();
    method public androidx.ui.savedinstancestate.UiSavedStateRegistry? getSavedStateRegistry();
    method public androidx.ui.core.semantics.SemanticsOwner getSemanticsOwner();
    method public boolean getShowLayoutBounds();
    method public androidx.ui.input.TextInputService getTextInputService();
    method public androidx.ui.core.texttoolbar.TextToolbar getTextToolbar();
    method public void measureAndLayout();
    method public void observeLayoutModelReads(androidx.ui.core.LayoutNode node, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void observeMeasureModelReads(androidx.ui.core.LayoutNode node, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public void onAttach(androidx.ui.core.LayoutNode node);
    method public void onDetach(androidx.ui.core.LayoutNode node);
    method public void onInvalidate(androidx.ui.core.LayoutNode layoutNode);
    method public void onRequestMeasure(androidx.ui.core.LayoutNode layoutNode);
    method public void onRequestRelayout(androidx.ui.core.LayoutNode layoutNode);
    method public void onSemanticsChange();
    method public void pauseModelReadObserveration(kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public boolean requestFocus();
    method public boolean sendKeyEvent(androidx.ui.core.keyinput.KeyEvent keyEvent);
    method public void setOnSavedStateRegistryAvailable(kotlin.jvm.functions.Function1<? super androidx.ui.savedinstancestate.UiSavedStateRegistry,kotlin.Unit> callback);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @org.jetbrains.annotations.TestOnly public void setShowLayoutBounds(boolean p);
    property public abstract androidx.ui.autofill.Autofill? autofill;
    property public abstract androidx.ui.autofill.AutofillTree autofillTree;
    property public abstract androidx.ui.core.clipboard.ClipboardManager clipboardManager;
    property public abstract androidx.ui.unit.Density density;
    property public abstract androidx.ui.text.font.Font.ResourceLoader fontLoader;
    property public abstract androidx.ui.core.hapticfeedback.HapticFeedback hapticFeedBack;
    property public abstract long measureIteration;
    property public abstract androidx.ui.core.LayoutNode root;
    property public abstract androidx.ui.savedinstancestate.UiSavedStateRegistry? savedStateRegistry;
    property public abstract androidx.ui.core.semantics.SemanticsOwner semanticsOwner;
    property public abstract boolean showLayoutBounds;
    property public abstract androidx.ui.input.TextInputService textInputService;
    property public abstract androidx.ui.core.texttoolbar.TextToolbar textToolbar;
    field public static final androidx.ui.core.Owner.Companion Companion;
  }

  public static final class Owner.Companion {
    method public boolean getEnableExtraAssertions();
    method public void setEnableExtraAssertions(boolean p);
    property public final boolean enableExtraAssertions;
  }

  public final class PainterModifierKt {
    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
  }

  public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
    method public Object? modifyParentData(androidx.ui.unit.Density, Object? parentData);
  }

  public abstract class Placeable {
    ctor public Placeable();
    method public abstract operator int get(androidx.ui.core.AlignmentLine line);
    method protected final androidx.ui.unit.IntOffset getApparentToRealOffset();
    method public final int getHeight();
    method protected final androidx.ui.unit.IntSize getMeasuredSize();
    method protected final androidx.ui.core.Constraints getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void place(androidx.ui.unit.IntOffset position);
    method protected final void setMeasuredSize(androidx.ui.unit.IntSize value);
    method protected final void setMeasurementConstraints(androidx.ui.core.Constraints p);
    property protected final androidx.ui.unit.IntOffset apparentToRealOffset;
    property public final int height;
    property protected final androidx.ui.unit.IntSize measuredSize;
    property protected final androidx.ui.core.Constraints measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method public abstract androidx.ui.core.LayoutDirection getParentLayoutDirection();
    method public abstract int getParentWidth();
    method public final void place(androidx.ui.core.Placeable, androidx.ui.unit.IntOffset position);
    method public final void place(androidx.ui.core.Placeable, androidx.ui.geometry.Offset position);
    method public final void place(androidx.ui.core.Placeable, int x, int y);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.geometry.Offset position);
    method public final void placeAbsolute(androidx.ui.core.Placeable, int x, int y);
    method public final void placeAbsolute(androidx.ui.core.Placeable, androidx.ui.unit.IntOffset position);
    property public abstract androidx.ui.core.LayoutDirection parentLayoutDirection;
    property public abstract int parentWidth;
  }

  public enum PointerEventPass {
    method public static androidx.ui.core.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.PointerEventPass[] values();
    enum_constant public static final androidx.ui.core.PointerEventPass InitialDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PostUp;
    enum_constant public static final androidx.ui.core.PointerEventPass PreDown;
    enum_constant public static final androidx.ui.core.PointerEventPass PreUp;
  }

  public final inline class PointerId {
    ctor public PointerId();
    method public static long constructor-impl(long value);
    method public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getValue();
    method public static inline int hashCode-impl(long p);
    method public static inline String! toString-impl(long p);
  }

  @androidx.compose.Immutable public final class PointerInputChange {
    method public long component1();
    method public androidx.ui.core.PointerInputData component2();
    method public androidx.ui.core.PointerInputData component3();
    method public androidx.ui.core.ConsumedData component4();
    method @androidx.compose.Immutable public androidx.ui.core.PointerInputChange copy-jh1A5Og(long id, androidx.ui.core.PointerInputData current, androidx.ui.core.PointerInputData previous, androidx.ui.core.ConsumedData consumed);
    method public androidx.ui.core.ConsumedData getConsumed();
    method public androidx.ui.core.PointerInputData getCurrent();
    method public long getId();
    method public androidx.ui.core.PointerInputData getPrevious();
  }

  @androidx.compose.Immutable public final class PointerInputData {
    ctor public PointerInputData(androidx.ui.unit.Uptime? uptime, androidx.ui.geometry.Offset? position, boolean down);
    ctor public PointerInputData();
    method public androidx.ui.unit.Uptime? component1();
    method public androidx.ui.geometry.Offset? component2();
    method public boolean component3();
    method @androidx.compose.Immutable public androidx.ui.core.PointerInputData copy(androidx.ui.unit.Uptime? uptime, androidx.ui.geometry.Offset? position, boolean down);
    method public boolean getDown();
    method public androidx.ui.geometry.Offset? getPosition();
    method public androidx.ui.unit.Uptime? getUptime();
  }

  public final class PointerInputKt {
    method public static boolean anyChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean anyPositionChangeConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDown(androidx.ui.core.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUp(androidx.ui.core.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeAllChanges(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumeDownChange(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.core.PointerInputChange consumePositionChange(androidx.ui.core.PointerInputChange, float consumedDx, float consumedDy);
    method public static androidx.ui.geometry.Offset positionChange(androidx.ui.core.PointerInputChange);
    method public static androidx.ui.geometry.Offset positionChangeIgnoreConsumed(androidx.ui.core.PointerInputChange);
    method public static boolean positionChanged(androidx.ui.core.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.ui.core.PointerInputChange);
  }

  public final class PopupKt {
    method @androidx.compose.Composable public static void DropdownPopup(androidx.ui.core.DropDownAlignment dropDownAlignment = androidx.ui.core.DropDownAlignment.Start, androidx.ui.unit.IntOffset offset = IntOffset(0, 0), boolean isFocusable = false, kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Popup(androidx.ui.core.Alignment alignment = Alignment.TopStart, androidx.ui.unit.IntOffset offset = IntOffset(0, 0), boolean isFocusable = false, kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Popup(androidx.ui.core.PopupPositionProvider popupPositionProvider, boolean isFocusable = false, kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, String? testTag = null);
  }

  @androidx.compose.Immutable public interface PopupPositionProvider {
    method public androidx.ui.unit.IntOffset calculatePosition(androidx.ui.unit.IntOffset parentLayoutPosition, androidx.ui.unit.IntSize parentLayoutSize, androidx.ui.core.LayoutDirection layoutDirection, androidx.ui.unit.IntSize popupSize);
  }

  public final class Ref<T> {
    ctor public Ref();
    method public T? getValue();
    method public void setValue(T? p);
    property public final T? value;
  }

  public final class SavedStateDelegateKt {
  }

  public final class TestTagKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier testTag(androidx.ui.core.Modifier, String tag);
  }

  @androidx.compose.Immutable public final inline class TransformOrigin {
    ctor public TransformOrigin();
    method public static long constructor-impl(internal long packedValue);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getPivotFractionX-impl(long $this);
    method public static float getPivotFractionY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method @androidx.compose.Immutable public static inline String! toString-impl(long p);
    field public static final androidx.ui.core.TransformOrigin.Companion Companion;
  }

  public static final class TransformOrigin.Companion {
    method public long getCenter();
    property public final long Center;
  }

  public final class VerticalAlignmentLine extends androidx.ui.core.AlignmentLine {
    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

  @androidx.compose.Stable public interface WithConstraintsScope {
    method public androidx.ui.core.Constraints getConstraints();
    method public androidx.ui.core.LayoutDirection getLayoutDirection();
    method public float getMaxHeight();
    method public float getMaxWidth();
    method public float getMinHeight();
    method public float getMinWidth();
    property public abstract androidx.ui.core.Constraints constraints;
    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
    property public abstract float maxHeight;
    property public abstract float maxWidth;
    property public abstract float minHeight;
    property public abstract float minWidth;
  }

  public final class WrapperKt {
    method public static androidx.compose.Composition setContent(androidx.activity.ComponentActivity, androidx.compose.Recomposer recomposer = Recomposer.current(), kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.Composition setContent(android.view.ViewGroup, androidx.compose.Recomposer recomposer, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @Deprecated public static androidx.compose.Composition setContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method public static androidx.compose.Composition setViewContent(android.view.ViewGroup, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    method public static androidx.compose.Composition setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    method @MainThread public static androidx.compose.Composition subcomposeInto(androidx.ui.core.LayoutNode container, androidx.compose.Recomposer recomposer, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
    method @Deprecated @MainThread public static androidx.compose.Composition subcomposeInto(androidx.ui.core.LayoutNode container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
  }

  public interface ZIndexModifier extends androidx.ui.core.Modifier.Element {
    method public float getZIndex();
    property public abstract float zIndex;
  }

  public final class ZIndexModifierKt {
    method @androidx.compose.Stable public static androidx.ui.core.Modifier zIndex(androidx.ui.core.Modifier, float zIndex);
  }

}

package androidx.ui.core.clipboard {

  public final class AndroidClipboardManagerKt {
  }

  public interface ClipboardManager {
    method public androidx.ui.text.AnnotatedString? getText();
    method public void setText(androidx.ui.text.AnnotatedString annotatedString);
  }

}

package androidx.ui.core.focus {

  public enum FocusDetailedState {
    method public static androidx.ui.core.focus.FocusDetailedState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.focus.FocusDetailedState[] values();
    enum_constant public static final androidx.ui.core.focus.FocusDetailedState Active;
    enum_constant public static final androidx.ui.core.focus.FocusDetailedState ActiveParent;
    enum_constant public static final androidx.ui.core.focus.FocusDetailedState Captured;
    enum_constant public static final androidx.ui.core.focus.FocusDetailedState Disabled;
    enum_constant public static final androidx.ui.core.focus.FocusDetailedState Inactive;
  }

  public interface FocusModifier extends androidx.ui.core.Modifier.Element {
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public androidx.ui.core.focus.FocusDetailedState getFocusDetailedState();
    method public void requestFocus();
    property public abstract androidx.ui.core.focus.FocusDetailedState focusDetailedState;
  }

  public final class FocusModifierKt {
    method @androidx.compose.Composable public static androidx.ui.core.focus.FocusModifier FocusModifier();
    method public static androidx.ui.core.focus.FocusState getFocusState(androidx.ui.core.focus.FocusModifier);
  }

  public final class FocusNodeUtilsKt {
  }

  public enum FocusState {
    method public static androidx.ui.core.focus.FocusState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.focus.FocusState[] values();
    enum_constant public static final androidx.ui.core.focus.FocusState Focused;
    enum_constant public static final androidx.ui.core.focus.FocusState NotFocusable;
    enum_constant public static final androidx.ui.core.focus.FocusState NotFocused;
  }

  public final class FocusStateKt {
    method public static androidx.ui.core.focus.FocusState focusState(androidx.ui.core.focus.FocusDetailedState);
  }

}

package androidx.ui.core.gesture {

  public final class ConstantsKt {
    method public static androidx.ui.unit.Duration getDoubleTapMinTime();
    method public static float getDoubleTapSlop();
    method public static androidx.ui.unit.Duration getDoubleTapTimeout();
    method public static float getDoubleTapTouchSlop();
    method public static float getHoverTapSlop();
    method public static androidx.ui.unit.Duration getHoverTapTimeout();
    method public static androidx.ui.unit.Duration getJumpTapTimeout();
    method public static androidx.ui.unit.Duration getLongPressTimeout();
    method public static float getMaxFlingVelocity();
    method public static float getMinFlingVelocity();
    method public static float getPagingTouchSlop();
    method public static float getPanSlop();
    method public static androidx.ui.unit.Duration getPressTimeout();
    method public static float getScaleSlop();
    method public static float getTouchSlop();
    method public static float getWindowTouchSlop();
    method public static androidx.ui.unit.Duration getZoomControlsTimeout();
  }

  public final class DoubleTapGestureFilterKt {
    method public static androidx.ui.core.Modifier doubleTapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onDoubleTap);
  }

  public final class DragGestureFilterKt {
    method public static androidx.ui.core.Modifier dragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null, boolean startDragImmediately = false);
  }

  public interface DragObserver {
    method public default void onCancel();
    method public default androidx.ui.geometry.Offset onDrag(androidx.ui.geometry.Offset dragDistance);
    method public default void onStart(androidx.ui.geometry.Offset downPosition);
    method public default void onStop(androidx.ui.geometry.Offset velocity);
  }

  public final class DragSlopExceededGestureFilterKt {
    method public static androidx.ui.core.Modifier dragSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onDragSlopExceeded, kotlin.jvm.functions.Function1<? super androidx.ui.core.Direction,java.lang.Boolean>? canDrag = null);
  }

  public final class GestureUtilsKt {
    method public static boolean anyPointersInBounds(java.util.List<androidx.ui.core.PointerInputChange>, androidx.ui.unit.IntSize bounds);
  }

  public final class LongPressDragGestureFilterKt {
    method public static androidx.ui.core.Modifier longPressDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.LongPressDragObserver longPressDragObserver);
  }

  public interface LongPressDragObserver {
    method public default void onCancel();
    method public default androidx.ui.geometry.Offset onDrag(androidx.ui.geometry.Offset dragDistance);
    method public default void onDragStart();
    method public default void onLongPress(androidx.ui.geometry.Offset pxPosition);
    method public default void onStop(androidx.ui.geometry.Offset velocity);
  }

  public final class LongPressGestureFilterKt {
    method public static androidx.ui.core.Modifier longPressGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onLongPress);
  }

  public final class PressIndicatorGestureFilterKt {
    method public static androidx.ui.core.Modifier pressIndicatorGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit>? onStart = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onStop = null, kotlin.jvm.functions.Function0<kotlin.Unit>? onCancel = null, boolean enabled = true);
  }

  public final class RawDragGestureFilterKt {
    method public static androidx.ui.core.Modifier rawDragGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.DragObserver dragObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartDragging = null);
  }

  public final class RawPressStartGestureFilterKt {
    method public static androidx.ui.core.Modifier rawPressStartGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onPressStart, boolean enabled = false, androidx.ui.core.PointerEventPass executionPass = androidx.ui.core.PointerEventPass.PostUp);
  }

  public final class RawScaleGestureFilterKt {
    method public static androidx.ui.core.Modifier rawScaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.RawScaleObserver scaleObserver, kotlin.jvm.functions.Function0<java.lang.Boolean>? canStartScaling = null);
  }

  public interface RawScaleObserver {
    method public default void onCancel();
    method public default float onScale(float scaleFactor);
    method public default void onStart();
    method public default void onStop();
  }

  public final class ScaleGestureFilterKt {
    method public static androidx.ui.core.Modifier scaleGestureFilter(androidx.ui.core.Modifier, androidx.ui.core.gesture.ScaleObserver scaleObserver);
  }

  public interface ScaleObserver {
    method public default void onCancel();
    method public void onScale(float scaleFactor);
    method public default void onStart();
    method public default void onStop();
  }

  public final class ScaleSlopExceededGestureFilterKt {
    method public static androidx.ui.core.Modifier scaleSlopExceededGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> onScaleSlopExceeded);
  }

  public final class ScaleUtilKt {
  }

  public final class TapGestureFilterKt {
    method public static androidx.ui.core.Modifier tapGestureFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.geometry.Offset,kotlin.Unit> onTap);
  }

}

package androidx.ui.core.gesture.customevents {

  public final class DelayUpEvent implements androidx.ui.core.CustomEvent {
    ctor public DelayUpEvent(androidx.ui.core.gesture.customevents.DelayUpMessage message, java.util.Set<androidx.ui.core.PointerId> pointers);
    method public androidx.ui.core.gesture.customevents.DelayUpMessage component1();
    method public java.util.Set<androidx.ui.core.PointerId> component2();
    method public androidx.ui.core.gesture.customevents.DelayUpEvent copy(androidx.ui.core.gesture.customevents.DelayUpMessage message, java.util.Set<androidx.ui.core.PointerId> pointers);
    method public androidx.ui.core.gesture.customevents.DelayUpMessage getMessage();
    method public java.util.Set<androidx.ui.core.PointerId> getPointers();
    method public void setMessage(androidx.ui.core.gesture.customevents.DelayUpMessage p);
  }

  public enum DelayUpMessage {
    method public static androidx.ui.core.gesture.customevents.DelayUpMessage valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.gesture.customevents.DelayUpMessage[] values();
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayUp;
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayedUpConsumed;
    enum_constant public static final androidx.ui.core.gesture.customevents.DelayUpMessage DelayedUpNotConsumed;
  }

  public final class LongPressFiredEvent implements androidx.ui.core.CustomEvent {
    field public static final androidx.ui.core.gesture.customevents.LongPressFiredEvent INSTANCE;
  }

}

package androidx.ui.core.gesture.util {

  public final class PolyFitLeastSquaresKt {
  }

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(androidx.ui.unit.Uptime uptime, androidx.ui.geometry.Offset position);
    method public androidx.ui.unit.Velocity calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTrackerKt {
  }

}

package androidx.ui.core.hapticfeedback {

  public interface HapticFeedback {
    method public void performHapticFeedback(androidx.ui.core.hapticfeedback.HapticFeedbackType hapticFeedbackType);
  }

  public enum HapticFeedbackType {
    method public static androidx.ui.core.hapticfeedback.HapticFeedbackType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.hapticfeedback.HapticFeedbackType[] values();
    enum_constant public static final androidx.ui.core.hapticfeedback.HapticFeedbackType LongPress;
    enum_constant public static final androidx.ui.core.hapticfeedback.HapticFeedbackType TextHandleMove;
  }

}

package androidx.ui.core.input {

  public interface FocusManager {
    method public void blur(androidx.ui.core.input.FocusNode client);
    method public void registerObserver(androidx.ui.core.input.FocusNode node, kotlin.jvm.functions.Function2<? super androidx.ui.core.input.FocusNode,? super androidx.ui.core.input.FocusNode,kotlin.Unit> observer);
    method public void requestFocus(androidx.ui.core.input.FocusNode client);
  }

  public final class FocusManagerKt {
  }

  public final class FocusNode {
    ctor public FocusNode();
  }

}

package androidx.ui.core.keyinput {

  public final inline class Key {
    ctor public Key();
    method public static int constructor-impl(int keyCode);
    method public static inline boolean equals-impl(int p, Object? p1);
    method public static boolean equals-impl0(int p1, int p2);
    method public int getKeyCode();
    method public static inline int hashCode-impl(int p);
    method public static String toString-impl(int $this);
    field public static final androidx.ui.core.keyinput.Key.Companion Companion;
  }

  public static final class Key.Companion {
    method public int getA();
    method public int getAllApps();
    method public int getAltLeft();
    method public int getAltRight();
    method public int getApostrophe();
    method public int getAppSwitch();
    method public int getAssist();
    method public int getAt();
    method public int getAvReceiverInput();
    method public int getAvReceiverPower();
    method public int getB();
    method public int getBack();
    method public int getBackslash();
    method public int getBackspace();
    method public int getBookmark();
    method public int getBreak();
    method public int getBrightnessDown();
    method public int getBrightnessUp();
    method public int getBrowser();
    method public int getButton1();
    method public int getButton10();
    method public int getButton11();
    method public int getButton12();
    method public int getButton13();
    method public int getButton14();
    method public int getButton15();
    method public int getButton16();
    method public int getButton2();
    method public int getButton3();
    method public int getButton4();
    method public int getButton5();
    method public int getButton6();
    method public int getButton7();
    method public int getButton8();
    method public int getButton9();
    method public int getButtonA();
    method public int getButtonB();
    method public int getButtonC();
    method public int getButtonL1();
    method public int getButtonL2();
    method public int getButtonMode();
    method public int getButtonR1();
    method public int getButtonR2();
    method public int getButtonSelect();
    method public int getButtonStart();
    method public int getButtonThumbLeft();
    method public int getButtonThumbRight();
    method public int getButtonX();
    method public int getButtonY();
    method public int getButtonZ();
    method public int getC();
    method public int getCalculator();
    method public int getCalendar();
    method public int getCall();
    method public int getCamera();
    method public int getCapsLock();
    method public int getCaptions();
    method public int getChannelDown();
    method public int getChannelUp();
    method public int getClear();
    method public int getComma();
    method public int getContacts();
    method public int getCopy();
    method public int getCtrlLeft();
    method public int getCtrlRight();
    method public int getCut();
    method public int getD();
    method public int getDPadCenter();
    method public int getDPadDown();
    method public int getDPadDownLeft();
    method public int getDPadDownRight();
    method public int getDPadLeft();
    method public int getDPadRight();
    method public int getDPadUp();
    method public int getDPadUpLeft();
    method public int getDPadUpRight();
    method public int getDelete();
    method public int getDvr();
    method public int getE();
    method public int getEisu();
    method public int getEndCall();
    method public int getEnter();
    method public int getEnvelope();
    method public int getEquals();
    method public int getEscape();
    method public int getF();
    method public int getF1();
    method public int getF10();
    method public int getF11();
    method public int getF12();
    method public int getF2();
    method public int getF3();
    method public int getF4();
    method public int getF5();
    method public int getF6();
    method public int getF7();
    method public int getF8();
    method public int getF9();
    method public int getFocus();
    method public int getForward();
    method public int getFunction();
    method public int getG();
    method public int getGrave();
    method public int getGuide();
    method public int getH();
    method public int getHeadsetHook();
    method public int getHelp();
    method public int getHenkan();
    method public int getHome();
    method public int getI();
    method public int getInfo();
    method public int getInsert();
    method public int getJ();
    method public int getK();
    method public int getKana();
    method public int getKatakanaHiragana();
    method public int getL();
    method public int getLanguageSwitch();
    method public int getLastChannel();
    method public int getLeftBracket();
    method public int getM();
    method public int getMannerMode();
    method public int getMediaAudioTrack();
    method public int getMediaClose();
    method public int getMediaEject();
    method public int getMediaFastForward();
    method public int getMediaNext();
    method public int getMediaPause();
    method public int getMediaPlay();
    method public int getMediaPlayPause();
    method public int getMediaPrevious();
    method public int getMediaRecord();
    method public int getMediaRewind();
    method public int getMediaSkipBackward();
    method public int getMediaSkipForward();
    method public int getMediaStepBackward();
    method public int getMediaStepForward();
    method public int getMediaStop();
    method public int getMediaTopMenu();
    method public int getMenu();
    method public int getMetaLeft();
    method public int getMetaRight();
    method public int getMicrophoneMute();
    method public int getMinus();
    method public int getMoveEnd();
    method public int getMoveHome();
    method public int getMuhenkan();
    method public int getMultiply();
    method public int getMusic();
    method public int getN();
    method public int getNavigateIn();
    method public int getNavigateNext();
    method public int getNavigateOut();
    method public int getNavigatePrevious();
    method public int getNotification();
    method public int getNumLock();
    method public int getNumPad0();
    method public int getNumPad1();
    method public int getNumPad2();
    method public int getNumPad3();
    method public int getNumPad4();
    method public int getNumPad5();
    method public int getNumPad6();
    method public int getNumPad7();
    method public int getNumPad8();
    method public int getNumPad9();
    method public int getNumPadAdd();
    method public int getNumPadComma();
    method public int getNumPadDivide();
    method public int getNumPadDot();
    method public int getNumPadEnter();
    method public int getNumPadEquals();
    method public int getNumPadLeftParenthesis();
    method public int getNumPadMultiply();
    method public int getNumPadRightParenthesis();
    method public int getNumPadSubtract();
    method public int getNumber();
    method public int getNumber0();
    method public int getNumber1();
    method public int getNumber11();
    method public int getNumber12();
    method public int getNumber2();
    method public int getNumber3();
    method public int getNumber4();
    method public int getNumber5();
    method public int getNumber6();
    method public int getNumber7();
    method public int getNumber8();
    method public int getNumber9();
    method public int getO();
    method public int getP();
    method public int getPageDown();
    method public int getPageUp();
    method public int getPairing();
    method public int getPaste();
    method public int getPeriod();
    method public int getPictureSymbols();
    method public int getPlus();
    method public int getPound();
    method public int getPower();
    method public int getPrintScreen();
    method public int getProfileSwitch();
    method public int getProgramBlue();
    method public int getProgramGreen();
    method public int getProgramRed();
    method public int getProgramYellow();
    method public int getQ();
    method public int getR();
    method public int getRefresh();
    method public int getRightBracket();
    method public int getRo();
    method public int getS();
    method public int getScrollLock();
    method public int getSearch();
    method public int getSemicolon();
    method public int getSetTopBoxInput();
    method public int getSetTopBoxPower();
    method public int getSettings();
    method public int getShiftLeft();
    method public int getShiftRight();
    method public int getSlash();
    method public int getSleep();
    method public int getSoftLeft();
    method public int getSoftRight();
    method public int getSoftSleep();
    method public int getSpacebar();
    method public int getStem1();
    method public int getStem2();
    method public int getStem3();
    method public int getStemPrimary();
    method public int getSwitchCharset();
    method public int getSymbol();
    method public int getSystemNavigationDown();
    method public int getSystemNavigationLeft();
    method public int getSystemNavigationRight();
    method public int getSystemNavigationUp();
    method public int getT();
    method public int getTab();
    method public int getThumbsDown();
    method public int getThumbsUp();
    method public int getToggle2D3D();
    method public int getTv();
    method public int getTvAntennaCable();
    method public int getTvAudioDescription();
    method public int getTvAudioDescriptionMixingVolumeDown();
    method public int getTvAudioDescriptionMixingVolumeUp();
    method public int getTvContentsMenu();
    method public int getTvDataService();
    method public int getTvInput();
    method public int getTvInputComponent1();
    method public int getTvInputComponent2();
    method public int getTvInputComposite1();
    method public int getTvInputComposite2();
    method public int getTvInputHdmi1();
    method public int getTvInputHdmi2();
    method public int getTvInputHdmi3();
    method public int getTvInputHdmi4();
    method public int getTvInputVga1();
    method public int getTvMediaContextMenu();
    method public int getTvNetwork();
    method public int getTvNumberEntry();
    method public int getTvPower();
    method public int getTvRadioService();
    method public int getTvSatellite();
    method public int getTvSatelliteBs();
    method public int getTvSatelliteCs();
    method public int getTvSatelliteService();
    method public int getTvTeletext();
    method public int getTvTerrestrialAnalog();
    method public int getTvTerrestrialDigital();
    method public int getTvTimerProgramming();
    method public int getTvZoomMode();
    method public int getU();
    method public int getUnknown();
    method public int getV();
    method public int getVoiceAssist();
    method public int getVolumeDown();
    method public int getVolumeMute();
    method public int getVolumeUp();
    method public int getW();
    method public int getWakeUp();
    method public int getWindow();
    method public int getX();
    method public int getY();
    method public int getYen();
    method public int getZ();
    method public int getZenkakuHankaru();
    method public int getZoomIn();
    method public int getZoomOut();
    property public final int A;
    property public final int AllApps;
    property public final int AltLeft;
    property public final int AltRight;
    property public final int Apostrophe;
    property public final int AppSwitch;
    property public final int Assist;
    property public final int At;
    property public final int AvReceiverInput;
    property public final int AvReceiverPower;
    property public final int B;
    property public final int Back;
    property public final int Backslash;
    property public final int Backspace;
    property public final int Bookmark;
    property public final int Break;
    property public final int BrightnessDown;
    property public final int BrightnessUp;
    property public final int Browser;
    property public final int Button1;
    property public final int Button10;
    property public final int Button11;
    property public final int Button12;
    property public final int Button13;
    property public final int Button14;
    property public final int Button15;
    property public final int Button16;
    property public final int Button2;
    property public final int Button3;
    property public final int Button4;
    property public final int Button5;
    property public final int Button6;
    property public final int Button7;
    property public final int Button8;
    property public final int Button9;
    property public final int ButtonA;
    property public final int ButtonB;
    property public final int ButtonC;
    property public final int ButtonL1;
    property public final int ButtonL2;
    property public final int ButtonMode;
    property public final int ButtonR1;
    property public final int ButtonR2;
    property public final int ButtonSelect;
    property public final int ButtonStart;
    property public final int ButtonThumbLeft;
    property public final int ButtonThumbRight;
    property public final int ButtonX;
    property public final int ButtonY;
    property public final int ButtonZ;
    property public final int C;
    property public final int Calculator;
    property public final int Calendar;
    property public final int Call;
    property public final int Camera;
    property public final int CapsLock;
    property public final int Captions;
    property public final int ChannelDown;
    property public final int ChannelUp;
    property public final int Clear;
    property public final int Comma;
    property public final int Contacts;
    property public final int Copy;
    property public final int CtrlLeft;
    property public final int CtrlRight;
    property public final int Cut;
    property public final int D;
    property public final int DPadCenter;
    property public final int DPadDown;
    property public final int DPadDownLeft;
    property public final int DPadDownRight;
    property public final int DPadLeft;
    property public final int DPadRight;
    property public final int DPadUp;
    property public final int DPadUpLeft;
    property public final int DPadUpRight;
    property public final int Delete;
    property public final int Dvr;
    property public final int E;
    property public final int Eisu;
    property public final int EndCall;
    property public final int Enter;
    property public final int Envelope;
    property public final int Equals;
    property public final int Escape;
    property public final int F;
    property public final int F1;
    property public final int F10;
    property public final int F11;
    property public final int F12;
    property public final int F2;
    property public final int F3;
    property public final int F4;
    property public final int F5;
    property public final int F6;
    property public final int F7;
    property public final int F8;
    property public final int F9;
    property public final int Focus;
    property public final int Forward;
    property public final int Function;
    property public final int G;
    property public final int Grave;
    property public final int Guide;
    property public final int H;
    property public final int HeadsetHook;
    property public final int Help;
    property public final int Henkan;
    property public final int Home;
    property public final int I;
    property public final int Info;
    property public final int Insert;
    property public final int J;
    property public final int K;
    property public final int Kana;
    property public final int KatakanaHiragana;
    property public final int L;
    property public final int LanguageSwitch;
    property public final int LastChannel;
    property public final int LeftBracket;
    property public final int M;
    property public final int MannerMode;
    property public final int MediaAudioTrack;
    property public final int MediaClose;
    property public final int MediaEject;
    property public final int MediaFastForward;
    property public final int MediaNext;
    property public final int MediaPause;
    property public final int MediaPlay;
    property public final int MediaPlayPause;
    property public final int MediaPrevious;
    property public final int MediaRecord;
    property public final int MediaRewind;
    property public final int MediaSkipBackward;
    property public final int MediaSkipForward;
    property public final int MediaStepBackward;
    property public final int MediaStepForward;
    property public final int MediaStop;
    property public final int MediaTopMenu;
    property public final int Menu;
    property public final int MetaLeft;
    property public final int MetaRight;
    property public final int MicrophoneMute;
    property public final int Minus;
    property public final int MoveEnd;
    property public final int MoveHome;
    property public final int Muhenkan;
    property public final int Multiply;
    property public final int Music;
    property public final int N;
    property public final int NavigateIn;
    property public final int NavigateNext;
    property public final int NavigateOut;
    property public final int NavigatePrevious;
    property public final int Notification;
    property public final int NumLock;
    property public final int NumPad0;
    property public final int NumPad1;
    property public final int NumPad2;
    property public final int NumPad3;
    property public final int NumPad4;
    property public final int NumPad5;
    property public final int NumPad6;
    property public final int NumPad7;
    property public final int NumPad8;
    property public final int NumPad9;
    property public final int NumPadAdd;
    property public final int NumPadComma;
    property public final int NumPadDivide;
    property public final int NumPadDot;
    property public final int NumPadEnter;
    property public final int NumPadEquals;
    property public final int NumPadLeftParenthesis;
    property public final int NumPadMultiply;
    property public final int NumPadRightParenthesis;
    property public final int NumPadSubtract;
    property public final int Number;
    property public final int Number0;
    property public final int Number1;
    property public final int Number11;
    property public final int Number12;
    property public final int Number2;
    property public final int Number3;
    property public final int Number4;
    property public final int Number5;
    property public final int Number6;
    property public final int Number7;
    property public final int Number8;
    property public final int Number9;
    property public final int O;
    property public final int P;
    property public final int PageDown;
    property public final int PageUp;
    property public final int Pairing;
    property public final int Paste;
    property public final int Period;
    property public final int PictureSymbols;
    property public final int Plus;
    property public final int Pound;
    property public final int Power;
    property public final int PrintScreen;
    property public final int ProfileSwitch;
    property public final int ProgramBlue;
    property public final int ProgramGreen;
    property public final int ProgramRed;
    property public final int ProgramYellow;
    property public final int Q;
    property public final int R;
    property public final int Refresh;
    property public final int RightBracket;
    property public final int Ro;
    property public final int S;
    property public final int ScrollLock;
    property public final int Search;
    property public final int Semicolon;
    property public final int SetTopBoxInput;
    property public final int SetTopBoxPower;
    property public final int Settings;
    property public final int ShiftLeft;
    property public final int ShiftRight;
    property public final int Slash;
    property public final int Sleep;
    property public final int SoftLeft;
    property public final int SoftRight;
    property public final int SoftSleep;
    property public final int Spacebar;
    property public final int Stem1;
    property public final int Stem2;
    property public final int Stem3;
    property public final int StemPrimary;
    property public final int SwitchCharset;
    property public final int Symbol;
    property public final int SystemNavigationDown;
    property public final int SystemNavigationLeft;
    property public final int SystemNavigationRight;
    property public final int SystemNavigationUp;
    property public final int T;
    property public final int Tab;
    property public final int ThumbsDown;
    property public final int ThumbsUp;
    property public final int Toggle2D3D;
    property public final int Tv;
    property public final int TvAntennaCable;
    property public final int TvAudioDescription;
    property public final int TvAudioDescriptionMixingVolumeDown;
    property public final int TvAudioDescriptionMixingVolumeUp;
    property public final int TvContentsMenu;
    property public final int TvDataService;
    property public final int TvInput;
    property public final int TvInputComponent1;
    property public final int TvInputComponent2;
    property public final int TvInputComposite1;
    property public final int TvInputComposite2;
    property public final int TvInputHdmi1;
    property public final int TvInputHdmi2;
    property public final int TvInputHdmi3;
    property public final int TvInputHdmi4;
    property public final int TvInputVga1;
    property public final int TvMediaContextMenu;
    property public final int TvNetwork;
    property public final int TvNumberEntry;
    property public final int TvPower;
    property public final int TvRadioService;
    property public final int TvSatellite;
    property public final int TvSatelliteBs;
    property public final int TvSatelliteCs;
    property public final int TvSatelliteService;
    property public final int TvTeletext;
    property public final int TvTerrestrialAnalog;
    property public final int TvTerrestrialDigital;
    property public final int TvTimerProgramming;
    property public final int TvZoomMode;
    property public final int U;
    property public final int Unknown;
    property public final int V;
    property public final int VoiceAssist;
    property public final int VolumeDown;
    property public final int VolumeMute;
    property public final int VolumeUp;
    property public final int W;
    property public final int WakeUp;
    property public final int Window;
    property public final int X;
    property public final int Y;
    property public final int Yen;
    property public final int Z;
    property public final int ZenkakuHankaru;
    property public final int ZoomIn;
    property public final int ZoomOut;
  }

  public final class KeyEvent {
    method public int component1();
    method public androidx.ui.core.keyinput.KeyEventType component2();
    method public androidx.ui.core.keyinput.KeyEvent copy-x3VrOOY(int key, androidx.ui.core.keyinput.KeyEventType type);
    method public int getKey();
    method public androidx.ui.core.keyinput.KeyEventType getType();
  }

  public enum KeyEventType {
    method public static androidx.ui.core.keyinput.KeyEventType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.keyinput.KeyEventType[] values();
    enum_constant public static final androidx.ui.core.keyinput.KeyEventType KeyDown;
    enum_constant public static final androidx.ui.core.keyinput.KeyEventType KeyUp;
  }

  public final class KeyInputModifierKt {
    method public static androidx.ui.core.Modifier keyInputFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.keyinput.KeyEvent,java.lang.Boolean> onKeyEvent);
    method public static androidx.ui.core.Modifier previewKeyInputFilter(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.keyinput.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
  }

}

package androidx.ui.core.pointerinput {

  public final class HitPathTrackerKt {
  }

  public final class PointerInputEventData {
    method public long component1();
    method public androidx.ui.core.PointerInputData component2();
    method public androidx.ui.core.pointerinput.PointerInputEventData copy-tII9_pY(long id, androidx.ui.core.PointerInputData pointerInputData);
    method public long getId();
    method public androidx.ui.core.PointerInputData getPointerInputData();
  }

  public final class PointerInputEventProcessorKt {
  }

  public abstract class PointerInputFilter {
    ctor public PointerInputFilter();
    method public abstract void onCancel();
    method public void onCustomEvent(androidx.ui.core.CustomEvent customEvent, androidx.ui.core.PointerEventPass pass);
    method public void onInit(androidx.ui.core.CustomEventDispatcher customEventDispatcher);
    method public abstract java.util.List<androidx.ui.core.PointerInputChange> onPointerInput(java.util.List<androidx.ui.core.PointerInputChange> changes, androidx.ui.core.PointerEventPass pass, androidx.ui.unit.IntSize bounds);
  }

  public interface PointerInputModifier extends androidx.ui.core.Modifier.Element {
    method public androidx.ui.core.pointerinput.PointerInputFilter getPointerInputFilter();
    property public abstract androidx.ui.core.pointerinput.PointerInputFilter pointerInputFilter;
  }

}

package androidx.ui.core.selection {

  public interface Selectable {
    method public androidx.ui.geometry.Rect getBoundingBox(int offset);
    method public androidx.ui.geometry.Offset getHandlePosition(androidx.ui.core.selection.Selection selection, boolean isStartHandle);
    method public androidx.ui.core.LayoutCoordinates? getLayoutCoordinates();
    method public androidx.ui.core.selection.Selection? getSelection(androidx.ui.geometry.Offset startPosition, androidx.ui.geometry.Offset endPosition, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, boolean longPress, androidx.ui.core.selection.Selection? previousSelection = null, boolean isStartHandle = true);
    method public androidx.ui.text.AnnotatedString getText();
  }

  @androidx.compose.Immutable public final class Selection {
    ctor public Selection(androidx.ui.core.selection.Selection.AnchorInfo start, androidx.ui.core.selection.Selection.AnchorInfo end, boolean handlesCrossed);
    method public androidx.ui.core.selection.Selection.AnchorInfo component1();
    method public androidx.ui.core.selection.Selection.AnchorInfo component2();
    method public boolean component3();
    method @androidx.compose.Immutable public androidx.ui.core.selection.Selection copy(androidx.ui.core.selection.Selection.AnchorInfo start, androidx.ui.core.selection.Selection.AnchorInfo end, boolean handlesCrossed);
    method public androidx.ui.core.selection.Selection.AnchorInfo getEnd();
    method public boolean getHandlesCrossed();
    method public androidx.ui.core.selection.Selection.AnchorInfo getStart();
    method public androidx.ui.core.selection.Selection merge(androidx.ui.core.selection.Selection? other);
    method public androidx.ui.text.TextRange toTextRange();
  }

  @androidx.compose.Immutable public static final class Selection.AnchorInfo {
    ctor public Selection.AnchorInfo(androidx.ui.text.style.TextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.ui.text.style.TextDirection component1();
    method public int component2();
    method public androidx.ui.core.selection.Selectable component3();
    method @androidx.compose.Immutable public androidx.ui.core.selection.Selection.AnchorInfo copy(androidx.ui.text.style.TextDirection direction, int offset, androidx.ui.core.selection.Selectable selectable);
    method public androidx.ui.text.style.TextDirection getDirection();
    method public int getOffset();
    method public androidx.ui.core.selection.Selectable getSelectable();
  }

  public final class SelectionContainerKt {
    method @androidx.compose.Composable public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class SelectionHandlesKt {
  }

  public final class SelectionLayoutKt {
  }

  public final class SelectionManagerKt {
  }

  public interface SelectionRegistrar {
    method public void onPositionChange();
    method public androidx.ui.core.selection.Selectable subscribe(androidx.ui.core.selection.Selectable selectable);
    method public void unsubscribe(androidx.ui.core.selection.Selectable selectable);
  }

  public final class SelectionRegistrarKt {
    method public static androidx.compose.ProvidableAmbient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
  }

}

package androidx.ui.core.semantics {

  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.ui.semantics.SemanticsPropertyReceiver {
    ctor public SemanticsConfiguration();
    method public operator <T> boolean contains(androidx.ui.semantics.SemanticsPropertyKey<T> key);
    method public androidx.ui.core.semantics.SemanticsConfiguration copy();
    method public operator <T> T! get(androidx.ui.semantics.SemanticsPropertyKey<T> key);
    method public <T> T! getOrElse(androidx.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public <T> T? getOrElseNullable(androidx.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public boolean isEmpty();
    method public boolean isMergingSemanticsOfDescendants();
    method public java.util.Iterator<java.util.Map.Entry<androidx.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
    method public <T> void set(androidx.ui.semantics.SemanticsPropertyKey<T> key, T? value);
    method public void setMergingSemanticsOfDescendants(boolean p);
    property public final boolean isEmpty;
    property public final boolean isMergingSemanticsOfDescendants;
  }

  public final class SemanticsConfigurationKt {
    method public static <T> T? getOrNull(androidx.ui.core.semantics.SemanticsConfiguration, androidx.ui.semantics.SemanticsPropertyKey<T> key);
  }

  public final class SemanticsHintOverrides {
    ctor public SemanticsHintOverrides(String? onTapHint, String? onLongPressHint);
    method public String? component1();
    method public String? component2();
    method public androidx.ui.core.semantics.SemanticsHintOverrides copy(String? onTapHint, String? onLongPressHint);
    method public String? getOnLongPressHint();
    method public String? getOnTapHint();
    method public boolean isNotEmpty();
    property public final boolean isNotEmpty;
  }

  public interface SemanticsModifier extends androidx.ui.core.Modifier.Element {
    method public int getId();
    method public androidx.ui.core.semantics.SemanticsConfiguration getSemanticsConfiguration();
    property public abstract int id;
    property public abstract androidx.ui.core.semantics.SemanticsConfiguration semanticsConfiguration;
  }

  public final class SemanticsModifierKt {
    method public static androidx.ui.core.Modifier semantics(androidx.ui.core.Modifier, boolean mergeAllDescendants = false, kotlin.jvm.functions.Function1<? super androidx.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit>? properties = null);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.ui.core.AlignmentLine line);
    method public androidx.ui.unit.PxBounds getBoundsInRoot();
    method public java.util.List<androidx.ui.core.semantics.SemanticsNode> getChildren();
    method public androidx.ui.core.LayoutNode getComponentNode();
    method public androidx.ui.core.semantics.SemanticsConfiguration getConfig();
    method public androidx.ui.unit.PxBounds getGlobalBounds();
    method public androidx.ui.geometry.Offset getGlobalPosition();
    method public boolean getHasChildren();
    method public int getId();
    method public androidx.ui.core.semantics.SemanticsNode? getParent();
    method public androidx.ui.unit.IntSize getSize();
    method public androidx.ui.core.semantics.SemanticsConfiguration getUnmergedConfig();
    method public boolean isRoot();
    method public void setComponentNode(androidx.ui.core.LayoutNode p);
    property public final androidx.ui.unit.PxBounds boundsInRoot;
    property public final java.util.List<androidx.ui.core.semantics.SemanticsNode> children;
    property public final androidx.ui.core.semantics.SemanticsConfiguration config;
    property public final androidx.ui.unit.PxBounds globalBounds;
    property public final androidx.ui.geometry.Offset globalPosition;
    property public final boolean hasChildren;
    property public final boolean isRoot;
    property public final androidx.ui.core.semantics.SemanticsNode? parent;
    property public final androidx.ui.unit.IntSize size;
    field public static final androidx.ui.core.semantics.SemanticsNode.Companion Companion;
  }

  public static final class SemanticsNode.Companion {
    method public int generateNewId();
  }

  public final class SemanticsNodeKt {
    method public static androidx.ui.core.semantics.SemanticsNode? findClosestParentNode(androidx.ui.core.semantics.SemanticsNode, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsNode,java.lang.Boolean> selector);
  }

  public final class SemanticsOwner {
    ctor public SemanticsOwner(androidx.ui.core.LayoutNode rootNode);
    method public androidx.ui.core.LayoutNode getRootNode();
    method public androidx.ui.core.semantics.SemanticsNode getRootSemanticsNode();
    property public final androidx.ui.core.semantics.SemanticsNode rootSemanticsNode;
  }

  public final class SemanticsOwnerKt {
    method public static java.util.List<androidx.ui.core.semantics.SemanticsNode> getAllSemanticsNodes(androidx.ui.core.semantics.SemanticsOwner);
  }

}

package androidx.ui.core.texttoolbar {

  public interface TextToolbar {
    method public androidx.ui.core.texttoolbar.TextToolbarStatus getStatus();
    method public void hide();
    method public void showCopyMenu(androidx.ui.geometry.Rect rect, kotlin.jvm.functions.Function0<kotlin.Unit> onDeselectRequested, kotlin.jvm.functions.Function0<kotlin.Unit> onCopyRequested);
    property public abstract androidx.ui.core.texttoolbar.TextToolbarStatus status;
  }

  public enum TextToolbarStatus {
    method public static androidx.ui.core.texttoolbar.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.texttoolbar.TextToolbarStatus[] values();
    enum_constant public static final androidx.ui.core.texttoolbar.TextToolbarStatus Hidden;
    enum_constant public static final androidx.ui.core.texttoolbar.TextToolbarStatus Shown;
  }

}

package androidx.ui.core.texttoolbar.actionmodecallback {

  public final class TextActionModeCallbackKt {
  }

}

package androidx.ui.graphics.vector {

  public abstract sealed class VNode {
    method public abstract void draw(androidx.ui.graphics.drawscope.DrawScope);
    method public final void invalidate();
  }

  public final class VectorApplier extends androidx.compose.AbstractApplier<androidx.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.ui.graphics.vector.VNode root);
    method public void insert(int index, androidx.ui.graphics.vector.VNode instance);
    method public void move(int from, int to, int count);
    method public void remove(int index, int count);
  }

  public final class VectorAsset {
    method public String component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public float component5();
    method public androidx.ui.graphics.vector.VectorGroup component6();
    method public androidx.ui.graphics.vector.VectorAsset copy-rmhd70c(String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, androidx.ui.graphics.vector.VectorGroup root);
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.ui.graphics.vector.VectorGroup getRoot();
    method public float getViewportHeight();
    method public float getViewportWidth();
  }

  public final class VectorAssetBuilder {
    method public androidx.ui.graphics.vector.VectorAssetBuilder addPath(java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
    method public androidx.ui.graphics.vector.VectorAsset build();
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public float getViewportHeight();
    method public float getViewportWidth();
    method public androidx.ui.graphics.vector.VectorAssetBuilder popGroup();
    method public androidx.ui.graphics.vector.VectorAssetBuilder pushGroup(String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath);
  }

  public final class VectorAssetBuilderKt {
    method public static androidx.ui.graphics.vector.VectorAssetBuilder group(androidx.ui.graphics.vector.VectorAssetBuilder, String name = "", float rotate = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.VectorAssetBuilder,kotlin.Unit> block);
    method public static androidx.ui.graphics.vector.VectorAssetBuilder path(androidx.ui.graphics.vector.VectorAssetBuilder, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
  }

  public final class VectorComposeKt {
    method @androidx.compose.Composable public static void Group(String name = "", float rotation = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, float scaleX = 1.0f, float scaleY = 1.0f, float translationX = 0.0f, float translationY = 0.0f, java.util.List<? extends androidx.ui.graphics.vector.PathNode> clipPathData = EmptyPath, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method @androidx.compose.Composable public static void Path(java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, String name = "", androidx.ui.graphics.Brush? fill = null, float fillAlpha = 1.0f, androidx.ui.graphics.Brush? stroke = null, float strokeAlpha = 1.0f, float strokeLineWidth = 0.0f, androidx.ui.graphics.StrokeCap strokeLineCap = DefaultStrokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin = DefaultStrokeLineJoin, float strokeLineMiter = 4.0f);
  }

  public final class VectorGroup extends androidx.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
    ctor public VectorGroup(String name, float rotation, float pivotX, float pivotY, float scaleX, float scaleY, float translationX, float translationY, java.util.List<? extends androidx.ui.graphics.vector.PathNode> clipPathData);
    ctor public VectorGroup();
    method public operator androidx.ui.graphics.vector.VectorNode get(int index);
    method public java.util.List<androidx.ui.graphics.vector.PathNode> getClipPathData();
    method public String getName();
    method public float getPivotX();
    method public float getPivotY();
    method public float getRotation();
    method public float getScaleX();
    method public float getScaleY();
    method public int getSize();
    method public float getTranslationX();
    method public float getTranslationY();
    method public java.util.Iterator<androidx.ui.graphics.vector.VectorNode> iterator();
    property public final int size;
  }

  public final class VectorKt {
    method public static inline java.util.List<androidx.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
    method public static java.util.List<androidx.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
    method public static androidx.ui.graphics.StrokeCap getDefaultStrokeLineCap();
    method public static androidx.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
    method public static androidx.ui.graphics.BlendMode getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.ui.graphics.vector.PathNode> getEmptyPath();
    field public static final String DefaultGroupName = "";
    field public static final String DefaultPathName = "";
    field public static final float DefaultPivotX = 0.0f;
    field public static final float DefaultPivotY = 0.0f;
    field public static final float DefaultRotation = 0.0f;
    field public static final float DefaultScaleX = 1.0f;
    field public static final float DefaultScaleY = 1.0f;
    field public static final float DefaultStrokeLineMiter = 4.0f;
    field public static final float DefaultStrokeLineWidth = 0.0f;
    field public static final float DefaultTranslationX = 0.0f;
    field public static final float DefaultTranslationY = 0.0f;
  }

  public abstract sealed class VectorNode {
  }

  public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
    method public androidx.ui.geometry.Size getIntrinsicSize();
    method protected void onDraw(androidx.ui.graphics.drawscope.DrawScope);
    property public androidx.ui.geometry.Size intrinsicSize;
  }

  public final class VectorPainterKt {
    method @androidx.compose.Composable public static androidx.ui.graphics.vector.VectorPainter VectorPainter(androidx.ui.graphics.vector.VectorAsset asset);
    method @androidx.compose.Composable public static androidx.ui.graphics.vector.VectorPainter VectorPainter-CZQlTzY(float defaultWidth, float defaultHeight, float viewportWidth = Float.NaN, float viewportHeight = Float.NaN, String name = "VectorRootGroup", kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> children);
    field public static final String RootGroupName = "VectorRootGroup";
  }

  public final class VectorPath extends androidx.ui.graphics.vector.VectorNode {
    ctor public VectorPath(String name, java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public String component1();
    method public float component10();
    method public java.util.List<androidx.ui.graphics.vector.PathNode> component2();
    method public androidx.ui.graphics.Brush? component3();
    method public float component4();
    method public androidx.ui.graphics.Brush? component5();
    method public float component6();
    method public float component7();
    method public androidx.ui.graphics.StrokeCap component8();
    method public androidx.ui.graphics.StrokeJoin component9();
    method public androidx.ui.graphics.vector.VectorPath copy(String name, java.util.List<? extends androidx.ui.graphics.vector.PathNode> pathData, androidx.ui.graphics.Brush? fill, float fillAlpha, androidx.ui.graphics.Brush? stroke, float strokeAlpha, float strokeLineWidth, androidx.ui.graphics.StrokeCap strokeLineCap, androidx.ui.graphics.StrokeJoin strokeLineJoin, float strokeLineMiter);
    method public androidx.ui.graphics.Brush? getFill();
    method public float getFillAlpha();
    method public String getName();
    method public java.util.List<androidx.ui.graphics.vector.PathNode> getPathData();
    method public androidx.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public androidx.ui.graphics.StrokeCap getStrokeLineCap();
    method public androidx.ui.graphics.StrokeJoin getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
  }

}

package androidx.ui.graphics.vector.compat {

  public final class XmlVectorParserKt {
  }

}

package androidx.ui.input {

  public final class InputStateKt {
  }

  public final class RecordingInputConnectionKt {
  }

}

package androidx.ui.node {

  public final class PointerInteropFilterKt {
  }

  public final class PointerInteropUtilsKt {
  }

  public final class UiApplier implements androidx.compose.Applier<java.lang.Object> {
    ctor public UiApplier(Object root);
    method public void down(Object node);
    method public Object getCurrent();
    method public void insert(int index, Object instance);
    method public void move(int from, int to, int count);
    method public void remove(int index, int count);
    method public void reset();
    method public void up();
    property public Object current;
  }

  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ViewAdapter {
    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
    method public int getId();
    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
    property public abstract int id;
  }

  public final class ViewInteropKt {
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static <T extends androidx.ui.node.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
  }

}

package androidx.ui.platform {

  public final class AndroidUriHandler implements androidx.ui.platform.UriHandler {
    ctor public AndroidUriHandler(android.content.Context context);
    method public void openUri(String uri);
  }

  public interface UriHandler {
    method public void openUri(String uri);
  }

}

package androidx.ui.res {

  public final class ColorResourcesKt {
    method @androidx.compose.Composable public static long colorResource(@ColorRes int id);
  }

  @androidx.compose.Stable public final class DeferredResource<T> {
    method public androidx.ui.res.Resource<T> getResource();
    property public final androidx.ui.res.Resource<T> resource;
  }

  public final class FailedResource<T> extends androidx.ui.res.Resource<T> {
    ctor public FailedResource(T? resource, Throwable? throwable);
    method public Throwable? getThrowable();
  }

  public final class FontResourcesKt {
    method @androidx.compose.Composable public static androidx.ui.text.Typeface fontResource(androidx.ui.text.font.FontFamily fontFamily);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.text.Typeface> loadFontResource(androidx.ui.text.font.FontFamily fontFamily, androidx.ui.text.font.FontFamily? pendingFontFamily = null, androidx.ui.text.font.FontFamily? failedFontFamily = null);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.text.Typeface> loadFontResource(androidx.ui.text.font.FontFamily fontFamily, androidx.ui.text.Typeface? pendingTypeface = null, androidx.ui.text.Typeface? failedTypeface = null);
  }

  public final class ImageResourcesKt {
    method @androidx.compose.Composable public static androidx.ui.graphics.ImageAsset imageResource(@DrawableRes int id);
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.graphics.ImageAsset> loadImageResource(int id, androidx.ui.graphics.ImageAsset? pendingImage = null, androidx.ui.graphics.ImageAsset? failedImage = null);
  }

  public final class LoadedResource<T> extends androidx.ui.res.Resource<T> {
    ctor public LoadedResource(T! resource);
  }

  public final class PendingResource<T> extends androidx.ui.res.Resource<T> {
    ctor public PendingResource(T? resource);
  }

  public final class PrimitiveResourcesKt {
    method @androidx.compose.Composable public static boolean booleanResource(@BoolRes int id);
    method @androidx.compose.Composable public static float dimensionResource(@DimenRes int id);
    method @androidx.compose.Composable public static int[] integerArrayResource(@ArrayRes int id);
    method @androidx.compose.Composable public static int integerResource(@IntegerRes int id);
  }

  public abstract sealed class Resource<T> {
    method public final T? getResource();
  }

  public final class ResourcesKt {
  }

  public final class StringResourcesKt {
    method @androidx.compose.Composable public static String![] stringArrayResource(@ArrayRes int id);
    method @androidx.compose.Composable public static String stringResource(@StringRes int id);
    method @androidx.compose.Composable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
  }

  public final class VectorResourcesKt {
    method @androidx.compose.Composable public static androidx.ui.res.DeferredResource<androidx.ui.graphics.vector.VectorAsset> loadVectorResource(int id, androidx.ui.graphics.vector.VectorAsset? pendingResource = null, androidx.ui.graphics.vector.VectorAsset? failedResource = null);
    method @androidx.compose.Composable public static androidx.ui.graphics.vector.VectorAsset vectorResource(@DrawableRes int id);
  }

}

package androidx.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
    ctor public AccessibilityAction(CharSequence? label, T action);
    method public CharSequence? component1();
    method public T component2();
    method public androidx.ui.semantics.AccessibilityAction<T> copy(CharSequence? label, T action);
    method public T getAction();
    method public CharSequence? getLabel();
  }

  public final class AccessibilityRangeInfo {
    ctor public AccessibilityRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float component1();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> component2();
    method public androidx.ui.semantics.AccessibilityRangeInfo copy(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public CharSequence component1();
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> component2();
    method public androidx.ui.semantics.CustomAccessibilityAction copy(CharSequence label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public CharSequence getLabel();
  }

  public final class SemanticsActions {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
    method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollBackward();
    method @Deprecated public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getScrollForward();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollTo();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
    property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollBackward;
    property @Deprecated public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> ScrollForward;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollTo;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    field public static final androidx.ui.semantics.SemanticsActions INSTANCE;
  }

  public final class SemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityLabel();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> getAccessibilityRangeInfo();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getAccessibilityValue();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getEnabled();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getHidden();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsPopup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.AnnotatedString> getText();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityLabel;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.semantics.AccessibilityRangeInfo> AccessibilityRangeInfo;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> AccessibilityValue;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Enabled;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Hidden;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsPopup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.text.AnnotatedString> Text;
    field public static final androidx.ui.semantics.SemanticsProperties INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void ScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean> action);
    method public static String getAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityRangeInfo getAccessibilityValueRange(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getEnabled(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getHidden(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getOnClick(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getPopup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getScrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver);
    method @Deprecated public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> getScrollForward(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>> getScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>> getSetProgress(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.text.AnnotatedString getText(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void onClick(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method @Deprecated public static void scrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method @Deprecated public static void scrollForward(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public static void setAccessibilityLabel(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setAccessibilityValue(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setAccessibilityValueRange(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityRangeInfo p);
    method public static void setCustomActions(androidx.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.ui.semantics.CustomAccessibilityAction> p);
    method public static void setEnabled(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setHidden(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setOnClick(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method public static void setPopup(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setProgress(androidx.ui.semantics.SemanticsPropertyReceiver, String? label = null, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean> action);
    method @Deprecated public static void setScrollBackward(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method @Deprecated public static void setScrollForward(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>> p);
    method public static void setScrollTo(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>> p);
    method public static void setSetProgress(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>> p);
    method public static void setTestTag(androidx.ui.semantics.SemanticsPropertyReceiver, String p);
    method public static void setText(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.text.AnnotatedString p);
  }

  public class SemanticsPropertyKey<T> implements kotlin.properties.ReadWriteProperty<androidx.ui.semantics.SemanticsPropertyReceiver,T> {
    ctor public SemanticsPropertyKey(String name);
    method public final String getName();
    method public final T! getValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T! merge(T? existingValue, T? newValue);
    method public final void setValue(androidx.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
  }

  public interface SemanticsPropertyReceiver {
    method public operator <T> void set(androidx.ui.semantics.SemanticsPropertyKey<T> key, T? value);
  }

}

package androidx.ui.temputils {

  public final class CoroutineUtilsKt {
    method public static kotlinx.coroutines.Job delay(androidx.ui.unit.Duration duration, kotlin.coroutines.CoroutineContext context, kotlin.jvm.functions.Function0<kotlin.Unit> block);
  }

}

package androidx.ui.testutils {

  public final class PointerInputTestUtilKt {
    method public static androidx.ui.core.PointerInputChange consume(androidx.ui.core.PointerInputChange, float dx = 0f, float dy = 0f, boolean downChange = false);
    method public static androidx.ui.core.PointerInputChange down(long id, androidx.ui.unit.Duration duration = Duration.Zero, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChanges, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverAllPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static void invokeOverAllPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event);
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass pointerEventPass, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange![] pointerInputChanges, androidx.ui.core.PointerEventPass pointerEventPass, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static androidx.ui.core.PointerInputChange invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, androidx.ui.core.PointerInputChange pointerInputChange, androidx.ui.core.PointerEventPass![] pointerEventPasses, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static java.util.List<androidx.ui.core.PointerInputChange> invokeOverPasses(kotlin.jvm.functions.Function3<? super java.util.List<androidx.ui.core.PointerInputChange>,? super androidx.ui.core.PointerEventPass,? super androidx.ui.unit.IntSize,? extends java.util.List<androidx.ui.core.PointerInputChange>>, java.util.List<androidx.ui.core.PointerInputChange> pointerInputChanges, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses, androidx.ui.unit.IntSize size = IntSize(Int.MAX_VALUE, Int.MAX_VALUE));
    method public static void invokeOverPasses(kotlin.jvm.functions.Function2<? super androidx.ui.core.CustomEvent,? super androidx.ui.core.PointerEventPass,kotlin.Unit>, androidx.ui.core.CustomEvent event, java.util.List<? extends androidx.ui.core.PointerEventPass> pointerEventPasses);
    method public static androidx.ui.core.PointerInputChange moveBy(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration, float dx = 0f, float dy = 0f);
    method public static androidx.ui.core.PointerInputChange moveTo(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration, float x = 0f, float y = 0f);
    method public static androidx.ui.core.PointerInputChange up(androidx.ui.core.PointerInputChange, androidx.ui.unit.Duration duration);
  }

}

package androidx.ui.tooling {

  public final class InspectionModeKt {
    method public static androidx.compose.ProvidableAmbient<java.lang.Boolean> getInspectionMode();
  }

}

package androidx.ui.viewinterop {

  public final class ComposedViewKt {
    method @androidx.compose.Composable public static void AndroidView(@LayoutRes int resId, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> postInflationCallback = { _ ->  });
    method @androidx.compose.Composable public static void AndroidView(android.view.View view, androidx.ui.core.Modifier modifier = Modifier);
  }

  public final class EmitViewKt {
    method @androidx.compose.Composable public static <T extends android.view.View> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method @androidx.compose.Composable public static <T extends android.view.ViewGroup> void emitView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

}

package androidx.ui.viewmodel {

  public final class ViewModelKt {
    method @androidx.compose.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, String? key = null, androidx.lifecycle.ViewModelProvider.Factory? factory = null);
    method @androidx.compose.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! viewModel(String key = null, androidx.lifecycle.ViewModelProvider.Factory? factory = null);
  }

}

