cbuffer cbuffer_ub : register(b0, space0) {
  uint4 ub[272];
};

struct tint_symbol_1 {
  uint idx : SV_GroupIndex;
};

float2x2 tint_symbol_14(uint4 buffer[272], uint offset) {
  const uint scalar_offset = ((offset + 0u)) / 4;
  uint4 ubo_load = buffer[scalar_offset / 4];
  const uint scalar_offset_1 = ((offset + 8u)) / 4;
  uint4 ubo_load_1 = buffer[scalar_offset_1 / 4];
  return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)));
}

float2x3 tint_symbol_15(uint4 buffer[272], uint offset) {
  const uint scalar_offset_2 = ((offset + 0u)) / 4;
  const uint scalar_offset_3 = ((offset + 16u)) / 4;
  return float2x3(asfloat(buffer[scalar_offset_2 / 4].xyz), asfloat(buffer[scalar_offset_3 / 4].xyz));
}

float2x4 tint_symbol_16(uint4 buffer[272], uint offset) {
  const uint scalar_offset_4 = ((offset + 0u)) / 4;
  const uint scalar_offset_5 = ((offset + 16u)) / 4;
  return float2x4(asfloat(buffer[scalar_offset_4 / 4]), asfloat(buffer[scalar_offset_5 / 4]));
}

float3x2 tint_symbol_17(uint4 buffer[272], uint offset) {
  const uint scalar_offset_6 = ((offset + 0u)) / 4;
  uint4 ubo_load_2 = buffer[scalar_offset_6 / 4];
  const uint scalar_offset_7 = ((offset + 8u)) / 4;
  uint4 ubo_load_3 = buffer[scalar_offset_7 / 4];
  const uint scalar_offset_8 = ((offset + 16u)) / 4;
  uint4 ubo_load_4 = buffer[scalar_offset_8 / 4];
  return float3x2(asfloat(((scalar_offset_6 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_7 & 2) ? ubo_load_3.zw : ubo_load_3.xy)), asfloat(((scalar_offset_8 & 2) ? ubo_load_4.zw : ubo_load_4.xy)));
}

float3x3 tint_symbol_18(uint4 buffer[272], uint offset) {
  const uint scalar_offset_9 = ((offset + 0u)) / 4;
  const uint scalar_offset_10 = ((offset + 16u)) / 4;
  const uint scalar_offset_11 = ((offset + 32u)) / 4;
  return float3x3(asfloat(buffer[scalar_offset_9 / 4].xyz), asfloat(buffer[scalar_offset_10 / 4].xyz), asfloat(buffer[scalar_offset_11 / 4].xyz));
}

float3x4 tint_symbol_19(uint4 buffer[272], uint offset) {
  const uint scalar_offset_12 = ((offset + 0u)) / 4;
  const uint scalar_offset_13 = ((offset + 16u)) / 4;
  const uint scalar_offset_14 = ((offset + 32u)) / 4;
  return float3x4(asfloat(buffer[scalar_offset_12 / 4]), asfloat(buffer[scalar_offset_13 / 4]), asfloat(buffer[scalar_offset_14 / 4]));
}

float4x2 tint_symbol_20(uint4 buffer[272], uint offset) {
  const uint scalar_offset_15 = ((offset + 0u)) / 4;
  uint4 ubo_load_5 = buffer[scalar_offset_15 / 4];
  const uint scalar_offset_16 = ((offset + 8u)) / 4;
  uint4 ubo_load_6 = buffer[scalar_offset_16 / 4];
  const uint scalar_offset_17 = ((offset + 16u)) / 4;
  uint4 ubo_load_7 = buffer[scalar_offset_17 / 4];
  const uint scalar_offset_18 = ((offset + 24u)) / 4;
  uint4 ubo_load_8 = buffer[scalar_offset_18 / 4];
  return float4x2(asfloat(((scalar_offset_15 & 2) ? ubo_load_5.zw : ubo_load_5.xy)), asfloat(((scalar_offset_16 & 2) ? ubo_load_6.zw : ubo_load_6.xy)), asfloat(((scalar_offset_17 & 2) ? ubo_load_7.zw : ubo_load_7.xy)), asfloat(((scalar_offset_18 & 2) ? ubo_load_8.zw : ubo_load_8.xy)));
}

float4x3 tint_symbol_21(uint4 buffer[272], uint offset) {
  const uint scalar_offset_19 = ((offset + 0u)) / 4;
  const uint scalar_offset_20 = ((offset + 16u)) / 4;
  const uint scalar_offset_21 = ((offset + 32u)) / 4;
  const uint scalar_offset_22 = ((offset + 48u)) / 4;
  return float4x3(asfloat(buffer[scalar_offset_19 / 4].xyz), asfloat(buffer[scalar_offset_20 / 4].xyz), asfloat(buffer[scalar_offset_21 / 4].xyz), asfloat(buffer[scalar_offset_22 / 4].xyz));
}

float4x4 tint_symbol_22(uint4 buffer[272], uint offset) {
  const uint scalar_offset_23 = ((offset + 0u)) / 4;
  const uint scalar_offset_24 = ((offset + 16u)) / 4;
  const uint scalar_offset_25 = ((offset + 32u)) / 4;
  const uint scalar_offset_26 = ((offset + 48u)) / 4;
  return float4x4(asfloat(buffer[scalar_offset_23 / 4]), asfloat(buffer[scalar_offset_24 / 4]), asfloat(buffer[scalar_offset_25 / 4]), asfloat(buffer[scalar_offset_26 / 4]));
}

typedef float3 tint_symbol_23_ret[2];
tint_symbol_23_ret tint_symbol_23(uint4 buffer[272], uint offset) {
  float3 arr_1[2] = (float3[2])0;
  {
    for(uint i = 0u; (i < 2u); i = (i + 1u)) {
      const uint scalar_offset_27 = ((offset + (i * 16u))) / 4;
      arr_1[i] = asfloat(buffer[scalar_offset_27 / 4].xyz);
    }
  }
  return arr_1;
}

void main_inner(uint idx) {
  const uint scalar_offset_28 = ((544u * idx)) / 4;
  const float scalar_f32 = asfloat(ub[scalar_offset_28 / 4][scalar_offset_28 % 4]);
  const uint scalar_offset_29 = (((544u * idx) + 4u)) / 4;
  const int scalar_i32 = asint(ub[scalar_offset_29 / 4][scalar_offset_29 % 4]);
  const uint scalar_offset_30 = (((544u * idx) + 8u)) / 4;
  const uint scalar_u32 = ub[scalar_offset_30 / 4][scalar_offset_30 % 4];
  const uint scalar_offset_31 = (((544u * idx) + 16u)) / 4;
  uint4 ubo_load_9 = ub[scalar_offset_31 / 4];
  const float2 vec2_f32 = asfloat(((scalar_offset_31 & 2) ? ubo_load_9.zw : ubo_load_9.xy));
  const uint scalar_offset_32 = (((544u * idx) + 24u)) / 4;
  uint4 ubo_load_10 = ub[scalar_offset_32 / 4];
  const int2 vec2_i32 = asint(((scalar_offset_32 & 2) ? ubo_load_10.zw : ubo_load_10.xy));
  const uint scalar_offset_33 = (((544u * idx) + 32u)) / 4;
  uint4 ubo_load_11 = ub[scalar_offset_33 / 4];
  const uint2 vec2_u32 = ((scalar_offset_33 & 2) ? ubo_load_11.zw : ubo_load_11.xy);
  const uint scalar_offset_34 = (((544u * idx) + 48u)) / 4;
  const float3 vec3_f32 = asfloat(ub[scalar_offset_34 / 4].xyz);
  const uint scalar_offset_35 = (((544u * idx) + 64u)) / 4;
  const int3 vec3_i32 = asint(ub[scalar_offset_35 / 4].xyz);
  const uint scalar_offset_36 = (((544u * idx) + 80u)) / 4;
  const uint3 vec3_u32 = ub[scalar_offset_36 / 4].xyz;
  const uint scalar_offset_37 = (((544u * idx) + 96u)) / 4;
  const float4 vec4_f32 = asfloat(ub[scalar_offset_37 / 4]);
  const uint scalar_offset_38 = (((544u * idx) + 112u)) / 4;
  const int4 vec4_i32 = asint(ub[scalar_offset_38 / 4]);
  const uint scalar_offset_39 = (((544u * idx) + 128u)) / 4;
  const uint4 vec4_u32 = ub[scalar_offset_39 / 4];
  const float2x2 mat2x2_f32 = tint_symbol_14(ub, ((544u * idx) + 144u));
  const float2x3 mat2x3_f32 = tint_symbol_15(ub, ((544u * idx) + 160u));
  const float2x4 mat2x4_f32 = tint_symbol_16(ub, ((544u * idx) + 192u));
  const float3x2 mat3x2_f32 = tint_symbol_17(ub, ((544u * idx) + 224u));
  const float3x3 mat3x3_f32 = tint_symbol_18(ub, ((544u * idx) + 256u));
  const float3x4 mat3x4_f32 = tint_symbol_19(ub, ((544u * idx) + 304u));
  const float4x2 mat4x2_f32 = tint_symbol_20(ub, ((544u * idx) + 352u));
  const float4x3 mat4x3_f32 = tint_symbol_21(ub, ((544u * idx) + 384u));
  const float4x4 mat4x4_f32 = tint_symbol_22(ub, ((544u * idx) + 448u));
  const float3 arr2_vec3_f32[2] = tint_symbol_23(ub, ((544u * idx) + 512u));
}

[numthreads(1, 1, 1)]
void main(tint_symbol_1 tint_symbol) {
  main_inner(tint_symbol.idx);
  return;
}
