// Signature format: 3.0
package androidx.serialization {

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Action {
    method public abstract boolean oneWay() default false;
    method public abstract int value();
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface EnumValue {
    method public abstract int value();
    field public static final androidx.serialization.EnumValue.Companion Companion;
    field public static final int DEFAULT = 0; // 0x0
  }

  public static final class EnumValue.Companion {
    field public static final int DEFAULT = 0; // 0x0
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Field {
    method public abstract androidx.serialization.ProtoEncoding mapKeyProtoEncoding() default androidx.serialization.ProtoEncoding.DEFAULT;
    method public abstract androidx.serialization.ProtoEncoding protoEncoding() default androidx.serialization.ProtoEncoding.DEFAULT;
    method public abstract int value();
  }

  public enum ProtoEncoding {
    method public static androidx.serialization.ProtoEncoding valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.serialization.ProtoEncoding[] values();
    enum_constant public static final androidx.serialization.ProtoEncoding DEFAULT;
    enum_constant public static final androidx.serialization.ProtoEncoding SIGNED_FIXED;
    enum_constant public static final androidx.serialization.ProtoEncoding SIGNED_VARINT;
    enum_constant public static final androidx.serialization.ProtoEncoding UNSIGNED_FIXED;
    enum_constant public static final androidx.serialization.ProtoEncoding UNSIGNED_VARINT;
    enum_constant public static final androidx.serialization.ProtoEncoding ZIG_ZAG_VARINT;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Reserved {
    method public abstract androidx.serialization.Reserved.IdRange[] idRanges() default {};
    method public abstract int[] ids() default {};
    method public abstract String[] names() default {};
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={}) public static @interface Reserved.IdRange {
    method public abstract int from();
    method public abstract int to();
  }

}

