
  // IntelliJ API Decompiler stub source generated from a class file
  // Implementation of methods is not available

package pkg;

abstract class Annotations {
    Annotations() { /* compiled code */ }

    @pkg.Annotations.A1
    abstract void m1();

    @pkg.Annotations.A2
    abstract void m2a();

    @pkg.Annotations.A2("+")
    abstract void m2b();

    @pkg.Annotations.A3(a1 = @pkg.Annotations.A1, a2 = @pkg.Annotations.A2)
    abstract void m3();

    @pkg.Annotations.A4
    abstract void m4a();

    @pkg.Annotations.A4(ids = {42, 84})
    abstract void m4b();

    @pkg.Annotations.A5(b = true, value = java.lang.Integer.class)
    abstract void m5();

    static @interface IndeterminateAnno {
        float f1() default -1.0f / 0.0;

        float f2() default 0.0f / 0.0;

        float f3() default 1.0f / 0.0;

        double d1() default -1.0 / 0.0;

        double d2() default 0.0d / 0.0;

        double d3() default 1.0 / 0.0;
    }

    static @interface A5 {
        boolean b() default false;

        java.lang.Class<? extends java.lang.Number> value() default java.lang.Integer.class;
    }

    static @interface A4 {
        int[] ids() default {};
    }

    static @interface A3 {
        pkg.Annotations.A1 a1();

        pkg.Annotations.A2 a2();
    }

    static @interface A2 {
        java.lang.String value() default "-";
    }

    static @interface A1 {
    }
}