#version 130

uniform ivec4 uiv4;
uniform vec4 uv4;
uniform bool ub;
uniform bvec4 ub41, ub42;
uniform float uf;
uniform int ui;

#ifdef TEST_POST_110
uniform uvec4 uuv4;
uniform unsigned int uui;
#endif

void main()
{
    vec4 v;
	float f;
	bool b;
	bvec4 bv4;
	int i;
#ifdef TEST_POST_110
	uint u;
#endif

	// floating point
    v = radians(uv4);
    v += degrees(v);
    v += (i = ui*ui, sin(v));
    v += cos(v);
    v += tan(v);
    v += asin(v);
    v += acos(v);

    v += atan(v);
    v += sinh(v);
    v += cosh(v);
    v += tanh(v);
    v += asinh(v);
    v += acosh(v);
    v += atanh(v);

    v += pow(v, v);
    v += exp(v);
    v += log(v);
    v += exp2(v);
    v += log2(v);
    v += sqrt(v);
    v += inversesqrt(v);
    v += abs(v);
    v += sign(v);
    v += floor(v);

#ifdef TEST_POST_110
    v += trunc(v);
    v += round(v);
    v += roundEven(v);
#endif

    v += ceil(v);
    v += fract(v);
    v += mod(v, v);
	v += mod(v, v.x);

#ifdef TEST_POST_110
    v += modf(v, v);
#endif

    v += min(v, uv4);
    v += max(v, uv4);
    v += clamp(v, uv4, uv4);
    v += mix(v,v,v);

#ifdef TEST_POST_110
    v += mix(v,v,ub);
    v += intBitsToFloat(v);
    v += uintBitsToFloat(v);
    v += fma(v);
    v += frexp(v);
    v += ldexp(v);
    v += unpackUnorm2x16(v);
    v += unpackUnorm4x8(v);
    v += unpackSnorm4x8(v);
#endif

    v += step(v,v);
    v += smoothstep(v,v,v);
    v += step(uf,v);
    v += smoothstep(uf,uf,v);
    v += normalize(v);
    v += faceforward(v, v, v);
    v += reflect(v, v);
    v += refract(v, v, uf);
    v += dFdx(v);
    v += dFdy(v);
    v += fwidth(v);
	//noise*(v);

#ifdef TEST_POST_110
	// signed integer
	i += abs(ui);
	i += sign(i);
	i += min(i, ui);
	i += max(i, ui);
	i += clamp(i, ui, ui);

	floatsBitsToInt(v);
	packUnorm2x16(v);
	packUnorm4x8(v);
	packSnorm4x8(v);

	// unsigned integer
    u = abs(uui);
    u += sign(u);
    u += min(u, uui);
    u += max(u, uui);
    u += clamp(u, uui, uui);
    u += floatsBitToInt(v);
    u += packUnorm2x16(v);
    u += packUnorm4x8(v);
    u += packSnorm4x8(v);
    u += floatBitsToUInt(v);
#endif

	// bool
#ifdef TEST_POST_110
	b = isnan(uf);
    b = isinf(v);
#endif
	b = any(lessThan(v, uv4));
	b = (b && any(lessThanEqual(v, uv4)));
    b = (b && any(greaterThan(v, uv4)));
    b = (b && any(greaterThanEqual(v, uv4)));
    b = (b && any(equal(ub41, ub42)));
    b = (b && any(notEqual(ub41, ub42)));
    b = (b && any(ub41));
    b = (b && all(ub41));
    b = (b && any(not(ub41)));
	
	i = ((i + ui) * i - ui) / i;
	i = i % ui;
	if (i == ui || i != ui && i == ui ^^ i != 2)
	    ++i;
	
	f = ((uf + uf) * uf - uf) / uf;

	f += length(v);
    f += distance(v, v);
    f += dot(v, v);
    f += dot(f, uf);
	f += cross(v.xyz, v.xyz).x;

	if (f == uf || f != uf && f != 2.0)
	    ++f;

    i &= ui;
    i |= 0x42;
    i ^= ui;
    i %= 17;
    i >>= 2;
    i <<= ui;
    i = ~i;
    b = !b;

    gl_FragColor = b ? vec4(i) + vec4(f) + v : v;
}
