#version 440 core

layout(std140, row_major) uniform nameless {
    vec3 anonMember1;
    mat3x2 m23;
    int scalarAfterm23;
    vec4 anonDeadMember2;
    vec4 anonMember3;
    int scalarBeforeArray;
    float floatArray[5];
    int scalarAfterArray;
    mat2x2 m22[9];
};

layout(std140, column_major) uniform c_nameless {
    vec3 c_anonMember1;
    mat3x2 c_m23;
    int c_scalarAfterm23;
    vec4 c_anonDeadMember2;
    vec4 c_anonMember3;
};

layout(std140) uniform named {
    vec3 deadMember1;
    int scalar;
    vec4 member2;
    vec4 member3;
    vec2 memvec2;
    float memf1;
    bool  memf2;
    int   memf3;
    vec2 memvec2a;
    mat2x2 m22[7];
} ablock;

layout(std140) uniform namelessdead {
    int a;
};

layout(std140) uniform namedDead {
    int b;
} bblock;

struct N1 {
    float a;
};

struct N2 {
    float b;
    float c;
    float d;
};

struct N3 {
    N1 n1;
    N2 n2;
};

layout(std140) uniform nested {
    N3 foo;
} nest;

layout(std140) uniform nested2 {
    vec4 padding; // offset 0, size 16
    N3 a;       // offset 16, size 32
    N1 b[4];    // offset 48, size 64
    N1 c[2];    // offset 112, size 32
    N1 d[4];    // offset 144, size 64
} nest2;

struct TS {
    int a;
    int dead;
};

uniform TS s;

uniform float uf1;
uniform float uf2;
uniform float ufDead3;
uniform float ufDead4;

uniform writeonly uimage2D image_ui2D;
uniform sampler2D sampler_2D;
uniform sampler2DMSArray sampler_2DMSArray;

uniform mat2 dm22[10];

struct deep1 {
    vec2 va[3];
    bool b;
};

struct deep2 {
    int i;
    deep1 d1[4];
};

struct deep3 {
    vec4 iv4;
    deep2 d2;
    ivec3 v3;
};

in float attributeFloat;
layout(location = 2) in vec2 attributeFloat2;
in vec3 attributeFloat3;
in vec4 attributeFloat4;
in mat4 attributeMat4;
in float attributeFloatArray[3];

uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2];

const bool control = true;

void deadFunction()
{
    vec3 v3 = ablock.deadMember1;
    vec4 v = anonDeadMember2;
    float f = ufDead4;
}

void liveFunction2()
{
    vec3 v = anonMember1;
    float f = uf1;
}

void liveFunction1(writeonly uimage2D p_ui2D, sampler2D p_2D, sampler2DMSArray p_2DMSArray)

{
    liveFunction2();
    float f = uf2;
    vec4 v = ablock.member3;
}

uniform abl {
    float foo;
} arrBl[4];

uniform abl2 {
    float foo;
} arrBl2[4];

buffer buf1 {
    float scalar;
    float runtimeArray[];
} buf1i;

buffer buf2 {
    float scalar;
    N2 runtimeArray[];
} buf2i;

buffer buf3 {
    float scalar;
    float runtimeArray[];
} buf3i;

buffer buf4 {
    float scalar;
    N2 runtimeArray[];
} buf4i;

struct VertexInfo {
    float position[3];
    float normal[3];
};

struct TriangleInfo {
    VertexInfo v[3];
};

buffer VertexCollection {
    TriangleInfo t[5];
    uint padding[10];
};

out float outval;

void main()
{
    liveFunction1(image_ui2D, sampler_2D, sampler_2DMSArray);
    liveFunction2();

    if (! control)
        deadFunction();

    float f;
    int i;
    if (control) {
        liveFunction2();
        f = anonMember3.z;
        f = s.a;
        f = ablock.scalar;
        f = m23[1].y + scalarAfterm23;
        f = c_m23[1].y + c_scalarAfterm23;
        f += scalarBeforeArray;
        f += floatArray[2];
        f += floatArray[4];
        f += scalarAfterArray;
        f += ablock.memvec2.x;
        f += ablock.memf1;
        f += float(ablock.memf2);
        f += ablock.memf3;
        f += ablock.memvec2a.y;
        f += ablock.m22[i][1][0];
        f += dm22[3][0][1];
        f += m22[2][1].y;
        f += nest.foo.n1.a + nest.foo.n2.b + nest.foo.n2.c + nest.foo.n2.d;
        f += deepA[i].d2.d1[2].va[1].x;
        f += deepB[1].d2.d1[i].va[1].x;
        f += deepB[i].d2.d1[i].va[1].x;
        deep3 d = deepC[1];
        deep3 da[2] = deepD;
        deep1 db = deepA[i].d2.d1[i];
    } else
        f = ufDead3;

    f += arrBl[2].foo + arrBl[0].foo;
    f += arrBl2[i].foo;

    f += attributeFloat;
    f += attributeFloat2.x;
    f += attributeFloat3.x;
    f += attributeFloat4.x;
    f += attributeMat4[0][1];
    f += attributeFloatArray[2];
    f += buf1i.runtimeArray[3];
    f += buf2i.runtimeArray[3].c;
    f += buf3i.runtimeArray[gl_InstanceID];
    f += buf4i.runtimeArray[gl_InstanceID].c;

    N3 n = nest2.a;
    N1 b[4] = nest2.b;
    f += nest2.c[1].a;
    f += nest2.d[gl_InstanceID].a;

    f += t[0].v[0].position[0];
    f += t[gl_InstanceID].v[gl_InstanceID].position[gl_InstanceID];
    f += t[gl_InstanceID].v[gl_InstanceID].normal[gl_InstanceID];
    TriangleInfo tlocal[5] = t;

    outval = f;
}
