#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct tint_private_vars_struct {
  float3 position_1;
  float2 vUV;
  float2 uv;
  float3 normal;
  float4 gl_Position;
};

struct strided_arr {
  /* 0x0000 */ float el;
  /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};

struct LeftOver {
  /* 0x0000 */ float4x4 worldViewProjection;
  /* 0x0040 */ float time;
  /* 0x0044 */ tint_array<int8_t, 12> tint_pad_1;
  /* 0x0050 */ tint_array<float4x4, 2> test2;
  /* 0x00d0 */ tint_array<strided_arr, 4> test;
};

void main_1(thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver* const tint_symbol_5) {
  float4 q = 0.0f;
  float3 p = 0.0f;
  float3 const x_13 = (*(tint_private_vars)).position_1;
  q = float4(x_13[0], x_13[1], x_13[2], 1.0f);
  float4 const x_21 = q;
  p = float3(x_21[0], x_21[1], x_21[2]);
  float const x_27 = p[0];
  float const x_41 = (*(tint_symbol_5)).test[0].el;
  float const x_45 = (*(tint_private_vars)).position_1[1];
  float const x_49 = (*(tint_symbol_5)).time;
  p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
  float const x_55 = p[1];
  float const x_57 = (*(tint_symbol_5)).time;
  p[1] = (x_55 + sin((x_57 + 4.0f)));
  float4x4 const x_69 = (*(tint_symbol_5)).worldViewProjection;
  float3 const x_70 = p;
  (*(tint_private_vars)).gl_Position = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
  float2 const x_83 = (*(tint_private_vars)).uv;
  (*(tint_private_vars)).vUV = x_83;
  float const x_87 = (*(tint_private_vars)).gl_Position[1];
  (*(tint_private_vars)).gl_Position[1] = (x_87 * -1.0f);
  return;
}

struct main_out {
  float4 gl_Position;
  float2 vUV_1;
};

struct tint_symbol_2 {
  float3 position_1_param [[attribute(0)]];
  float3 normal_param [[attribute(1)]];
  float2 uv_param [[attribute(2)]];
};

struct tint_symbol_3 {
  float2 vUV_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

main_out tint_symbol_inner(float3 position_1_param, float2 uv_param, float3 normal_param, thread tint_private_vars_struct* const tint_private_vars, const constant LeftOver* const tint_symbol_6) {
  (*(tint_private_vars)).position_1 = position_1_param;
  (*(tint_private_vars)).uv = uv_param;
  (*(tint_private_vars)).normal = normal_param;
  main_1(tint_private_vars, tint_symbol_6);
  main_out const tint_symbol_4 = {.gl_Position=(*(tint_private_vars)).gl_Position, .vUV_1=(*(tint_private_vars)).vUV};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_7 [[buffer(0)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_1_param, tint_symbol_1.uv_param, tint_symbol_1.normal_param, &(tint_private_vars), tint_symbol_7);
  tint_symbol_3 wrapper_result = {};
  wrapper_result.gl_Position = inner_result.gl_Position;
  wrapper_result.vUV_1 = inner_result.vUV_1;
  return wrapper_result;
}

