diff --git a/CMakeLists.txt b/CMakeLists.txt index e73b549..842c4b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -399,6 +399,7 @@ vulkan_test(memory_tracking_1) if (NOT MOCK_DRIVER MATCHES "1") vulkan_test(cooperative_matrix) +vulkan_test(cooperative_matrix_math) vulkan_test(address_remap_test_1) endif() diff --git a/benchmarking/vulkan_cooperative_matrix_math.bench b/benchmarking/vulkan_cooperative_matrix_math.bench new file mode 100644 index 0000000..c92c3d1 --- /dev/null +++ b/benchmarking/vulkan_cooperative_matrix_math.bench @@ -0,0 +1,23 @@ +{ + "name": "vulkan_cooperative_matrix_math", + "description": "Run a compute shader that exercises instructions related to VK_KHR_cooperative_matrix", + "path": "build/vulkan_cooperative_matrix_math", + "capabilities": { + "non_interactive": { + "default": true, + "modifiable": false + }, + "frameless": { + "default": true, + "modifiable": false + }, + "gpu_fully_deterministic": { + "default": true, + "modifiable": false + }, + "file_output": { + "default": false, + "modifiable": false, + }, + } +} diff --git a/src/vulkan_cooperative_matrix_math.comp b/src/vulkan_cooperative_matrix_math.comp new file mode 100644 index 0000000..103c7ac --- /dev/null +++ b/src/vulkan_cooperative_matrix_math.comp @@ -0,0 +1,63 @@ +#version 460 +#extension GL_KHR_memory_scope_semantics : require +#extension GL_KHR_cooperative_matrix : require + +struct MatrixData { + int[256] signed_values; + uint[256] unsigned_values; +}; + +layout(local_size_x=32, local_size_y=32, local_size_z=1) in; + +layout(set = 0, binding = 0) readonly buffer InputBuffer +{ + MatrixData in_data; +}; + +layout(set = 0, binding = 1) buffer OutputBuffer +{ + MatrixData out_data; +}; + +void main() +{ + coopmat signed_matrix; + coopmat unsigned_matrix; + coopmat float_matrix; + + coopMatLoad(signed_matrix, + in_data.signed_values, + 0, + 16, + gl_CooperativeMatrixLayoutRowMajor); + coopMatLoad(unsigned_matrix, + in_data.unsigned_values, + 0, + 16, + gl_CooperativeMatrixLayoutRowMajor); + + float_matrix = coopmat(signed_matrix); + float_matrix = -float_matrix; + + signed_matrix = signed_matrix - coopmat(float_matrix); + signed_matrix = signed_matrix + signed_matrix; + signed_matrix = signed_matrix * signed_matrix; + signed_matrix = signed_matrix / signed_matrix; + + unsigned_matrix = unsigned_matrix - coopmat(float_matrix); + unsigned_matrix = unsigned_matrix + unsigned_matrix; + unsigned_matrix = unsigned_matrix * unsigned_matrix; + unsigned_matrix = unsigned_matrix / unsigned_matrix; + + coopMatStore(signed_matrix, + out_data.signed_values, + 0, + 16, + gl_CooperativeMatrixLayoutRowMajor); + + coopMatStore(unsigned_matrix, + out_data.unsigned_values, + 0, + 16, + gl_CooperativeMatrixLayoutRowMajor); +} diff --git a/src/vulkan_cooperative_matrix_math.cpp b/src/vulkan_cooperative_matrix_math.cpp new file mode 100644 index 0000000..269ace9 --- /dev/null +++ b/src/vulkan_cooperative_matrix_math.cpp @@ -0,0 +1,405 @@ +#include "vulkan_common.h" + +#include "vulkan_cooperative_matrix_math.inc" +#include +#include +#include +#include + +static void show_usage(){} + +static bool test_cmdopt(int& i, int argc, char **argv, vulkan_req_t& reqs) +{ + return false; +} + +typedef struct alignas(32) MatrixData { + int32_t signed_values[256]; + uint32_t unsigned_values[256]; +} MatrixData; + +int main(int argc, char** argv) +{ + vulkan_req_t reqs; + reqs.device_extensions.push_back("VK_KHR_cooperative_matrix"); + reqs.apiVersion = VK_API_VERSION_1_3; + reqs.reqfeat12.vulkanMemoryModel = VK_TRUE; + + VkPhysicalDeviceCooperativeMatrixFeaturesKHR coopFeatures = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR, + .pNext = reqs.extension_features, + .cooperativeMatrix = VK_TRUE, + .cooperativeMatrixRobustBufferAccess = VK_FALSE, + }; + reqs.extension_features = (VkBaseInStructure*)&coopFeatures; + reqs.usage = show_usage; + reqs.cmdopt = test_cmdopt; + + vulkan_setup_t vk = test_init(argc, argv, "vulkan_cooperative_matrix_math", reqs); + + MAKEINSTANCEPROCADDR(vk, vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR); + + // Capability check + uint32_t propCount = 0; + VkResult r = pf_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(vk.physical, &propCount, nullptr); + if (r == VK_ERROR_EXTENSION_NOT_PRESENT) + { + test_done(vk); + return 77; + } + + bench_start_iteration(vk.bench); + + std::vector coopProps = + std::vector(propCount, + {.sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR, + .pNext = nullptr + }); + + if (propCount > 0) + { + r = pf_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR(vk.physical, &propCount, coopProps.data()); + check(r); + } + VkPhysicalDeviceCooperativeMatrixPropertiesKHR physicalCoopProps = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR, + .pNext = nullptr, + }; + VkPhysicalDeviceProperties2 physicalDeviceProps = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, + .pNext = &physicalCoopProps, + }; + vkGetPhysicalDeviceProperties2(vk.physical, &physicalDeviceProps); + + if ((physicalCoopProps.cooperativeMatrixSupportedStages & VK_SHADER_STAGE_COMPUTE_BIT) == 0) + { + printf("Skipping: cooperative matrix not supported for compute stage\n"); + bench_stop_iteration(vk.bench); + test_done(vk); + return 77; + } + + // check that the coopMat size variant in shader is supported + bool variant = false; + for (const VkCooperativeMatrixPropertiesKHR &p : coopProps) + { + if (p.scope != VK_SCOPE_SUBGROUP_KHR) + continue; + if (p.MSize != 16 || p.NSize != 16 || p.KSize != 16) + continue; + variant = true; + break; + } + if (!variant) + { + printf("Skipping: no supported cooperative matrix mode matches available shader variants\n"); + for (const auto &p : coopProps) + { + printf("\tsupported mode: M=%u N=%u K=%u, A=%u B=%u C=%u Result=%u, scope=0x%x\n", + p.MSize, p.NSize, p.KSize, p.AType, p.BType, p.CType, p.ResultType, p.scope); + } + bench_stop_iteration(vk.bench); + test_done(vk); + return 77; + } + printf("Using cooperative matrix mode M=16 N=16 K=16\n"); + + std::array ssbo{VK_NULL_HANDLE}; + std::array ssboMemory{VK_NULL_HANDLE}; + + const VkDeviceSize bufferSize = sizeof(MatrixData); + + VkBufferCreateInfo bufferInfo = { + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .size = bufferSize, + .usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + }; + for (uint32_t i = 0; i < ssbo.size(); ++i) + { + r = vkCreateBuffer(vk.device, &bufferInfo, nullptr, &ssbo[i]); + check(r); + VkMemoryRequirements ssboMemReq = {}; + vkGetBufferMemoryRequirements(vk.device, ssbo[i], &ssboMemReq); + VkPhysicalDeviceMemoryProperties ssboMemTypeProp; + vkGetPhysicalDeviceMemoryProperties(vk.physical, &ssboMemTypeProp); + + VkMemoryAllocateInfo ssboMemAllocInfo = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = nullptr, + .allocationSize = ssboMemReq.size, + .memoryTypeIndex = get_device_memory_type(ssboMemReq.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT), + }; + + r = vkAllocateMemory(vk.device, &ssboMemAllocInfo, nullptr, &ssboMemory[i]); + check(r); + r = vkBindBufferMemory(vk.device, ssbo[i], ssboMemory[i], 0); + check(r); + } + + // copy data to buffer memory + MatrixData mData; + for(size_t i = 0; i < 256; ++i) + { + mData.signed_values[i] = -2; + mData.unsigned_values[i] = 3; + } + void* data; + vkMapMemory(vk.device, ssboMemory[0], 0, bufferSize, 0x0, &data); + memcpy(data, &mData, (size_t)bufferSize); + vkUnmapMemory(vk.device, ssboMemory[0]); + + VkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE; + std::array layoutBindings{}; + layoutBindings[0].binding = 0; + layoutBindings[0].descriptorCount = 1; + layoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + layoutBindings[0].pImmutableSamplers = nullptr; + layoutBindings[0].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + + layoutBindings[1].binding = 1; + layoutBindings[1].descriptorCount = 1; + layoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + layoutBindings[1].pImmutableSamplers = nullptr; + layoutBindings[1].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + + VkDescriptorSetLayoutCreateInfo layoutCreateInfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0x0, + .bindingCount = 2, + .pBindings = layoutBindings.data(), + }; + + r = vkCreateDescriptorSetLayout(vk.device, &layoutCreateInfo, nullptr, &descriptorSetLayout); + check(r); + + VkDescriptorPool pool = VK_NULL_HANDLE; + VkDescriptorPoolSize poolSize{ + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .descriptorCount = 2, + }; + + VkDescriptorPoolCreateInfo poolCreateInfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .pNext = nullptr, + .flags = 0x0, + .maxSets = 1, + .poolSizeCount = 1, + .pPoolSizes = &poolSize, + }; + + r = vkCreateDescriptorPool(vk.device, &poolCreateInfo, nullptr, &pool); + check(r); + + // Descriptor set + VkDescriptorSet descSet = VK_NULL_HANDLE; + VkDescriptorSetAllocateInfo setAllocateInfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .pNext = nullptr, + .descriptorPool = pool, + .descriptorSetCount = 1, + .pSetLayouts = &descriptorSetLayout, + }; + + r = vkAllocateDescriptorSets(vk.device, &setAllocateInfo, &descSet); + check(r); + + // Connect descriptor set and buffers + std::array descriptorWrites{}; + VkDescriptorBufferInfo inSsboInfo = { + .buffer = ssbo[0], + .offset = 0, + .range = bufferSize, + }; + + descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[0].pNext = nullptr; + descriptorWrites[0].dstSet = descSet; + descriptorWrites[0].dstBinding = 0; + descriptorWrites[0].dstArrayElement = 0; + descriptorWrites[0].descriptorCount = 1; + descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + descriptorWrites[0].pImageInfo = nullptr; + descriptorWrites[0].pBufferInfo = &inSsboInfo; + descriptorWrites[0].pTexelBufferView = nullptr; + + VkDescriptorBufferInfo outSsboInfo = { + .buffer = ssbo[1], + .offset = 0, + .range = bufferSize, + }; + + descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[1].pNext = nullptr; + descriptorWrites[1].dstSet = descSet; + descriptorWrites[1].dstBinding = 1; + descriptorWrites[1].dstArrayElement = 0; + descriptorWrites[1].descriptorCount = 1; + descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + descriptorWrites[1].pImageInfo = nullptr; + descriptorWrites[1].pBufferInfo = &outSsboInfo; + descriptorWrites[1].pTexelBufferView = nullptr; + + vkUpdateDescriptorSets(vk.device, 2, descriptorWrites.data(), 0, nullptr); + + // Shader module + std::vector code = copy_shader(src_vulkan_cooperative_matrix_math_spv, src_vulkan_cooperative_matrix_math_spv_len); + VkShaderModuleCreateInfo shaderCreateInfo = { + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .pNext = nullptr, + .flags = 0x0, + .codeSize = code.size() * sizeof(uint32_t), + .pCode = code.data(), + }; + VkShaderModule shaderModule = VK_NULL_HANDLE; + r = vkCreateShaderModule(vk.device, &shaderCreateInfo, nullptr, &shaderModule); + check(r); + + // Pipeline + VkPipeline computePipeline = VK_NULL_HANDLE; + VkPipelineLayout pipeLayout = VK_NULL_HANDLE; + VkPipelineLayoutCreateInfo pipeLayoutCreateInfo = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .setLayoutCount = 1, + .pSetLayouts = &descriptorSetLayout, + .pushConstantRangeCount = 0, + .pPushConstantRanges = nullptr, + }; + r = vkCreatePipelineLayout(vk.device, &pipeLayoutCreateInfo, nullptr, &pipeLayout); + check(r); + + VkPipelineShaderStageCreateInfo stageCreateInfo = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .pNext = nullptr, + .flags = 0x0, + .stage = VK_SHADER_STAGE_COMPUTE_BIT, + .module = shaderModule, + .pName = "main", + .pSpecializationInfo = nullptr, + }; + + VkComputePipelineCreateInfo compPipeLayoutCreateInfo = { + .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, + .pNext = nullptr, + .flags = 0x0, + .stage = stageCreateInfo, + .layout = pipeLayout, + .basePipelineHandle = computePipeline, + .basePipelineIndex = 0, + }; + + r = vkCreateComputePipelines(vk.device, VK_NULL_HANDLE, 1, &compPipeLayoutCreateInfo, nullptr, &computePipeline); + check(r); + + // Command Buffer + VkCommandPool cmdPool = VK_NULL_HANDLE; + VkCommandPoolCreateInfo cmdPoolCreateInfo = { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .pNext = nullptr, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, + .queueFamilyIndex = 0, + }; + r = vkCreateCommandPool(vk.device, &cmdPoolCreateInfo, nullptr, &cmdPool); + check(r); + + VkCommandBuffer cmdBuf = VK_NULL_HANDLE; + VkCommandBufferAllocateInfo cmdBufAllocateInfo = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .pNext = nullptr, + .commandPool = cmdPool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1, + }; + r = vkAllocateCommandBuffers(vk.device, &cmdBufAllocateInfo, &cmdBuf); + check(r); + + VkCommandBufferBeginInfo cmdBeginInfo = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .pNext = nullptr, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, + .pInheritanceInfo = nullptr, + }; + r = vkBeginCommandBuffer(cmdBuf, &cmdBeginInfo); + check(r); + vkCmdBindPipeline(cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, computePipeline); + vkCmdBindDescriptorSets(cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, pipeLayout, 0, 1, &descSet, 0, nullptr); + vkCmdDispatch(cmdBuf, 1, 1, 1); + r = vkEndCommandBuffer(cmdBuf); + + VkQueue queue = VK_NULL_HANDLE; + vkGetDeviceQueue(vk.device, 0, 0, &queue); + VkSubmitInfo submitInfo = { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .pNext = nullptr, + .commandBufferCount = 1, + .pCommandBuffers = &cmdBuf, + }; + + VkFence fence = VK_NULL_HANDLE; + VkFenceCreateInfo fenceCreateInfo = { + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .pNext = nullptr, + }; + r = vkCreateFence(vk.device, &fenceCreateInfo, nullptr, &fence); + check(r); + r = vkQueueSubmit(queue, 1, &submitInfo, fence); + check(r); + r = vkWaitForFences(vk.device, 1, &fence, VK_TRUE, UINT64_MAX); + check(r); + vkDestroyFence(vk.device, fence, nullptr); + + // Verify data + void* mapped = nullptr; + r = vkMapMemory(vk.device, ssboMemory[1], 0, bufferSize, 0x0, &mapped); + check(r); + const MatrixData* results = reinterpret_cast(mapped); + bool ok = true; + for(size_t i = 0; i < 256; ++i) + { + uint64_t row = i/16; + uint64_t col = i % 16; + if (results->unsigned_values[i] == 1) + { + ok = false; + printf(" coop-matrix mismatch at (%lu, %lu): got %d expected 1\n", row, col, results->unsigned_values[i]); + break; + } + if (results->signed_values[i] == 1) + { + ok = false; + printf(" coop-matrix mismatch at (%lu, %lu): got %d expected 1\n", row, col, results->signed_values[i]); + break; + } + } + + vkUnmapMemory(vk.device, ssboMemory[1]); + + vkDestroyPipeline(vk.device, computePipeline, nullptr); + vkDestroyPipelineLayout(vk.device, pipeLayout, nullptr); + vkDestroyShaderModule(vk.device, shaderModule, nullptr); + vkDestroyDescriptorPool(vk.device, pool, nullptr); + vkDestroyDescriptorSetLayout(vk.device, descriptorSetLayout, nullptr); + vkDestroyCommandPool(vk.device, cmdPool, nullptr); + for(size_t i = 0; i < ssbo.size(); ++i) + { + vkDestroyBuffer(vk.device, ssbo[i], nullptr); + testFreeMemory(vk, ssboMemory[i]); + } + + bench_stop_iteration(vk.bench); + test_done(vk); + + if(ok) + { + printf(" coop-matrix compute verified: all 256 values == 1\n"); + } + else + { + return -1; + } + return 0; +} diff --git a/src/vulkan_cooperative_matrix_math.inc b/src/vulkan_cooperative_matrix_math.inc new file mode 100644 index 0000000..53ab216 --- /dev/null +++ b/src/vulkan_cooperative_matrix_math.inc @@ -0,0 +1,200 @@ +unsigned char src_vulkan_cooperative_matrix_math_spv[] = { + 0x03, 0x02, 0x23, 0x07, 0x00, 0x06, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, + 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0xe1, 0x14, 0x00, 0x00, + 0x11, 0x00, 0x02, 0x00, 0x86, 0x17, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, + 0x53, 0x50, 0x56, 0x5f, 0x4b, 0x48, 0x52, 0x5f, 0x63, 0x6f, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, + 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70, + 0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, + 0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x47, 0x4c, 0x5f, 0x4b, 0x48, 0x52, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x72, 0x69, + 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x4b, + 0x48, 0x52, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5f, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, + 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6d, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x44, 0x61, + 0x74, 0x61, 0x00, 0x00, 0x06, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x00, 0x05, 0x00, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x74, + 0x72, 0x69, 0x78, 0x00, 0x05, 0x00, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x03, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x46, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x11, 0x07, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x68, 0x11, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x68, 0x11, 0x07, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x06, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x41, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x69, 0x11, 0x07, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x07, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x69, 0x11, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x6f, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x84, 0x00, 0x05, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x87, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x84, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x86, 0x00, 0x05, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x43, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x41, 0x00, 0x07, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x6a, 0x11, 0x06, 0x00, 0x47, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x07, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x49, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6a, 0x11, 0x06, 0x00, + 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0x38, 0x00, 0x01, 0x00 +}; +unsigned int src_vulkan_cooperative_matrix_math_spv_len = 2356; diff --git a/src/vulkan_cooperative_matrix_math.spv b/src/vulkan_cooperative_matrix_math.spv new file mode 100644 index 0000000..a611490 Binary files /dev/null and b/src/vulkan_cooperative_matrix_math.spv differ