#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 Inner {
  /* 0x0000 */ float scalar_f32;
  /* 0x0004 */ int scalar_i32;
  /* 0x0008 */ uint scalar_u32;
  /* 0x000c */ half scalar_f16;
  /* 0x000e */ tint_array<int8_t, 2> tint_pad;
  /* 0x0010 */ float2 vec2_f32;
  /* 0x0018 */ int2 vec2_i32;
  /* 0x0020 */ uint2 vec2_u32;
  /* 0x0028 */ half2 vec2_f16;
  /* 0x002c */ tint_array<int8_t, 4> tint_pad_1;
  /* 0x0030 */ packed_float3 vec3_f32;
  /* 0x003c */ tint_array<int8_t, 4> tint_pad_2;
  /* 0x0040 */ packed_int3 vec3_i32;
  /* 0x004c */ tint_array<int8_t, 4> tint_pad_3;
  /* 0x0050 */ packed_uint3 vec3_u32;
  /* 0x005c */ tint_array<int8_t, 4> tint_pad_4;
  /* 0x0060 */ packed_half3 vec3_f16;
  /* 0x0066 */ tint_array<int8_t, 10> tint_pad_5;
  /* 0x0070 */ float4 vec4_f32;
  /* 0x0080 */ int4 vec4_i32;
  /* 0x0090 */ uint4 vec4_u32;
  /* 0x00a0 */ half4 vec4_f16;
  /* 0x00a8 */ float2x2 mat2x2_f32;
  /* 0x00b8 */ tint_array<int8_t, 8> tint_pad_6;
  /* 0x00c0 */ float2x3 mat2x3_f32;
  /* 0x00e0 */ float2x4 mat2x4_f32;
  /* 0x0100 */ float3x2 mat3x2_f32;
  /* 0x0118 */ tint_array<int8_t, 8> tint_pad_7;
  /* 0x0120 */ float3x3 mat3x3_f32;
  /* 0x0150 */ float3x4 mat3x4_f32;
  /* 0x0180 */ float4x2 mat4x2_f32;
  /* 0x01a0 */ float4x3 mat4x3_f32;
  /* 0x01e0 */ float4x4 mat4x4_f32;
  /* 0x0220 */ half2x2 mat2x2_f16;
  /* 0x0228 */ half2x3 mat2x3_f16;
  /* 0x0238 */ half2x4 mat2x4_f16;
  /* 0x0248 */ half3x2 mat3x2_f16;
  /* 0x0254 */ tint_array<int8_t, 4> tint_pad_8;
  /* 0x0258 */ half3x3 mat3x3_f16;
  /* 0x0270 */ half3x4 mat3x4_f16;
  /* 0x0288 */ half4x2 mat4x2_f16;
  /* 0x0298 */ half4x3 mat4x3_f16;
  /* 0x02b8 */ half4x4 mat4x4_f16;
  /* 0x02d8 */ tint_array<int8_t, 8> tint_pad_9;
  /* 0x02e0 */ tint_array<float3, 2> arr2_vec3_f32;
  /* 0x0300 */ tint_array<half4x2, 2> arr2_mat4x2_f16;
};

struct S {
  /* 0x0000 */ tint_array<Inner, 8> arr;
};

void tint_symbol_inner(uint idx, const constant S* const tint_symbol_1) {
  float const scalar_f32 = (*(tint_symbol_1)).arr[idx].scalar_f32;
  int const scalar_i32 = (*(tint_symbol_1)).arr[idx].scalar_i32;
  uint const scalar_u32 = (*(tint_symbol_1)).arr[idx].scalar_u32;
  half const scalar_f16 = (*(tint_symbol_1)).arr[idx].scalar_f16;
  float2 const vec2_f32 = (*(tint_symbol_1)).arr[idx].vec2_f32;
  int2 const vec2_i32 = (*(tint_symbol_1)).arr[idx].vec2_i32;
  uint2 const vec2_u32 = (*(tint_symbol_1)).arr[idx].vec2_u32;
  half2 const vec2_f16 = (*(tint_symbol_1)).arr[idx].vec2_f16;
  float3 const vec3_f32 = float3((*(tint_symbol_1)).arr[idx].vec3_f32);
  int3 const vec3_i32 = int3((*(tint_symbol_1)).arr[idx].vec3_i32);
  uint3 const vec3_u32 = uint3((*(tint_symbol_1)).arr[idx].vec3_u32);
  half3 const vec3_f16 = half3((*(tint_symbol_1)).arr[idx].vec3_f16);
  float4 const vec4_f32 = (*(tint_symbol_1)).arr[idx].vec4_f32;
  int4 const vec4_i32 = (*(tint_symbol_1)).arr[idx].vec4_i32;
  uint4 const vec4_u32 = (*(tint_symbol_1)).arr[idx].vec4_u32;
  half4 const vec4_f16 = (*(tint_symbol_1)).arr[idx].vec4_f16;
  float2x2 const mat2x2_f32 = (*(tint_symbol_1)).arr[idx].mat2x2_f32;
  float2x3 const mat2x3_f32 = (*(tint_symbol_1)).arr[idx].mat2x3_f32;
  float2x4 const mat2x4_f32 = (*(tint_symbol_1)).arr[idx].mat2x4_f32;
  float3x2 const mat3x2_f32 = (*(tint_symbol_1)).arr[idx].mat3x2_f32;
  float3x3 const mat3x3_f32 = (*(tint_symbol_1)).arr[idx].mat3x3_f32;
  float3x4 const mat3x4_f32 = (*(tint_symbol_1)).arr[idx].mat3x4_f32;
  float4x2 const mat4x2_f32 = (*(tint_symbol_1)).arr[idx].mat4x2_f32;
  float4x3 const mat4x3_f32 = (*(tint_symbol_1)).arr[idx].mat4x3_f32;
  float4x4 const mat4x4_f32 = (*(tint_symbol_1)).arr[idx].mat4x4_f32;
  half2x2 const mat2x2_f16 = (*(tint_symbol_1)).arr[idx].mat2x2_f16;
  half2x3 const mat2x3_f16 = (*(tint_symbol_1)).arr[idx].mat2x3_f16;
  half2x4 const mat2x4_f16 = (*(tint_symbol_1)).arr[idx].mat2x4_f16;
  half3x2 const mat3x2_f16 = (*(tint_symbol_1)).arr[idx].mat3x2_f16;
  half3x3 const mat3x3_f16 = (*(tint_symbol_1)).arr[idx].mat3x3_f16;
  half3x4 const mat3x4_f16 = (*(tint_symbol_1)).arr[idx].mat3x4_f16;
  half4x2 const mat4x2_f16 = (*(tint_symbol_1)).arr[idx].mat4x2_f16;
  half4x3 const mat4x3_f16 = (*(tint_symbol_1)).arr[idx].mat4x3_f16;
  half4x4 const mat4x4_f16 = (*(tint_symbol_1)).arr[idx].mat4x4_f16;
  tint_array<float3, 2> const arr2_vec3_f32 = (*(tint_symbol_1)).arr[idx].arr2_vec3_f32;
  tint_array<half4x2, 2> const arr2_mat4x2_f16 = (*(tint_symbol_1)).arr[idx].arr2_mat4x2_f16;
}

kernel void tint_symbol(const constant S* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
  tint_symbol_inner(idx, tint_symbol_2);
  return;
}

