uniform half4 colorRed;
uniform half4 colorGreen;
const float kZero_0 = 0.0;
float return_loop_0(float five);
const float kTen_0 = 10.0;
float continue_loop_0(float five);
float break_loop_0(float five);
float float_loop_0();
bool loop_operator_le_0();
bool loop_operator_lt_0();
bool loop_operator_ge_0();
bool loop_operator_gt_0();
bool loop_operator_ne_0();
bool loop_operator_eq_0();
float return_loop_0(float five)
{
	for (float i = kZero_0;i < 10.0; ++i) 
	{
		if (i == five) 
		{
			return i;
		}
	}
	return 0.0;
}
float continue_loop_0(float five)
{
	float sum = 0.0;
	for (float i = 0.0;i < kTen_0; ++i) 
	{
		if (i < five) 
		{
			continue;
		}
		sum += i;
	}
	return sum;
}
float break_loop_0(float five)
{
	float sum = 0.0;
	const float kOne = 1.0;
	for (float i = 0.0;i < 10.0; i += kOne) 
	{
		if (i > five) 
		{
			break;
		}
		sum += i;
	}
	return sum;
}
float float_loop_0()
{
	float sum = 0.0;
	for (float i = 0.12300000339746475;i < 0.60000002384185791; i += 0.11100000143051147) 
	{
		sum += i;
	}
	return sum - 1.7250000238418579;
}
bool loop_operator_le_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i <= 3.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_lt_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i < 4.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_ge_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 3.0;i >= 1.0; --i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 3.0, 2.0, 1.0);
}
bool loop_operator_gt_0()
{
	;
	;
	float4 result = float4(9.0);
	for (float i = 3.0;i > 0.0; --i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 3.0, 2.0, 1.0);
}
bool loop_operator_ne_0()
{
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i != 4.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 1.0, 2.0, 3.0);
}
bool loop_operator_eq_0()
{
	;
	float4 result = float4(9.0);
	for (float i = 1.0;i == 1.0; ++i) 
	{
		result = float4(result.yzw, i);
	}
	return result == float4(9.0, 9.0, 9.0, 1.0);
}
half4 main(float2 pos)
{
	float five = clamp(_coords.x, float(colorGreen.y), float(colorGreen.w)) * 5.0;
	return half4(((((((((return_loop_0(five) == 5.0 && continue_loop_0(five) == 35.0) && break_loop_0(five) == 15.0) && abs(float_loop_0()) < 0.02500000037252903) && loop_operator_le_0()) && loop_operator_lt_0()) && loop_operator_ge_0()) && loop_operator_gt_0()) && loop_operator_eq_0()) && loop_operator_ne_0() ? colorGreen : colorRed);
}
