submission 663912
bhagawan-yantrion · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 539 lines, June 9 Researcher Reciprocity License v1.0.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mxfp4-mm-663912?include=source"interfacepython
Compatibility
measured onAMD Instinct MI355X
declared hardwareAMD Instinct MI355X
architecturesgfx950
dtypesbf16, mxfp4
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:ee838da2505a45d8dc182b531bd443ec3cadcd8ce45bad52cada2e42926a7c62
license declaredunknown
license concludedunknown
authorsbhagawan-yantrion
imported2026-08-15
Techniques
Extracted from the mirrored source by pattern, never inferred. Each row cites its line.
Kernel source
submission.py539 lines
#!POPCORN leaderboard amd-mxfp4-mm
#!POPCORN gpu MI355X
"""
MXFP4-MM: Hybrid with direct ASM GEMM launch.
K<=1024: fused HIP quant+GEMM (1 launch)
K>1024: combined C++ call: HIP quant + ASM gemm (2 launches, 0 Python round-trips)
"""
import os, ctypes, base64, tempfile
import torch
import aiter
from aiter import dtypes
from aiter.ops.triton.quant import dynamic_mxfp4_quant
from aiter.utility.fp4_utils import e8m0_shuffle
from task import input_t, output_t
_SO_B64 = (
"f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAAAAAAAAAAABAAAAAAAAAAOBqAAAAAAAAAAAAAEAAOAAJAEAAHgAcAAYAAAAEAAAAQAAA"
"AAAAAABAAAAAAAAAAEAAAAAAAAAA+AEAAAAAAAD4AQAAAAAAAAgAAAAAAAAAAQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAkUQAAAAAAACRRAAAAAAAAABAAAAAAAAABAAAABQAAADBRAAAAAAAAMGEAAAAAAAAwYQAAAAAAAAAMAAAAAAAAAAwAAAAAAAAA"
"EAAAAAAAAAEAAAAGAAAAMF0AAAAAAAAwfQAAAAAAADB9AAAAAAAAKAIAAAAAAADQAgAAAAAAAAAQAAAAAAAAAQAAAAYAAABYXwAA"
"AAAAAFiPAAAAAAAAWI8AAAAAAAC4AAAAAAAAADEBAAAAAAAAABAAAAAAAAACAAAABgAAAFhdAAAAAAAAWH0AAAAAAABYfQAAAAAA"
"ANABAAAAAAAA0AEAAAAAAAAIAAAAAAAAAFLldGQEAAAAMF0AAAAAAAAwfQAAAAAAADB9AAAAAAAAKAIAAAAAAADQAgAAAAAAAAEA"
"AAAAAAAAUOV0ZAQAAACoTgAAAAAAAKhOAAAAAAAAqE4AAAAAAABcAAAAAAAAAFwAAAAAAAAABAAAAAAAAABR5XRkBgAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAgAAAA"
"AAAAAAAAAAAAAAAAAAAAABAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAACYAAAAiAAAAAAAAAAAAAAAAAAAAAAAAADUAAAAiAAAAAAAA"
"AAAAAAAAAAAAAAAAAHQAAAASAAAAAAAAAAAAAAAAAAAAAAAAAKYAAAASAAAAAAAAAAAAAAAAAAAAAAAAAA0BAAASAAAAAAAAAAAA"
"AAAAAAAAAAAAACgBAAASAAAAAAAAAAAAAAAAAAAAAAAAAGMBAAASAAAAAAAAAAAAAAAAAAAAAAAAAGoBAAASAAAAAAAAAAAAAAAA"
"AAAAAAAAAIABAAASAAAAAAAAAAAAAAAAAAAAAAAAAIkBAAASAAAAAAAAAAAAAAAAAAAAAAAAAJcBAAASAAAAAAAAAAAAAAAAAAAA"
"AAAAAKwBAAASAAAAAAAAAAAAAAAAAAAAAAAAAMMBAAASAAAAAAAAAAAAAAAAAAAAAAAAANkBAAASAAAAAAAAAAAAAAAAAAAAAAAA"
"AA4CAAASAAAAAAAAAAAAAAAAAAAAAAAAAE0AAAASAAwAwGEAAAAAAAD0AAAAAAAAAOAAAAARABIAUH0AAAAAAAAIAAAAAAAAADgB"
"AAASAAwAUGUAAAAAAACAAQAAAAAAAFMBAAASAAwA0GYAAAAAAAA2BAAAAAAAAI4AAAARABIASH0AAAAAAAAIAAAAAAAAALYAAAAS"
"AAwAwGIAAAAAAADjAAAAAAAAAPsAAAASAAwAsGMAAAAAAACfAQAAAAAAAPIBAAARABkAiJAAAAAAAAABAAAAAAAAAAAAAQACAAMA"
"AgAEAAQABAAEAAMABAADAAQABAAEAAQABAADAAEAAQABAAEAAQABAAEAAQABAAEAGwIAADAAAAAQAAAAAQABADQCAAAwAAAAEAAA"
"AAEAAQBKAgAAMAAAAAAAAAByJwYPAAAEACwCAAAAAAAAUCZ5CwAAAgBCAgAAAAAAAHUaaQkAAAMAVAIAAAAAAAAAAAAAAgAAABIA"
"AAACAAAAGgAAAAAAARdBICAAAAQEiAiAAAASAAAAFgAAABjq0mqQGTnWSg0wjiGYUnLunGtKGMKPm9odJXy1h9G0AF9fZ21vbl9z"
"dGFydF9fAF9fcmVnaXN0ZXJfZnJhbWVfaW5mbwBfX2N4YV9maW5hbGl6ZQBfX2RlcmVnaXN0ZXJfZnJhbWVfaW5mbwBfX2Rldmlj"
"ZV9zdHViX19mdXNlZF9teGZwNF9nZW1tX2tlcm5lbABfX2hpcFBvcENhbGxDb25maWd1cmF0aW9uAGZ1c2VkX214ZnA0X2dlbW1f"
"a2VybmVsAGhpcExhdW5jaEtlcm5lbABfX2RldmljZV9zdHViX19mdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbABmdXNlZF9xdWFu"
"dF9zaHVmZmxlX2tlcm5lbABsYXVuY2hfZnVzZWRfZ2VtbQBfX2hpcFB1c2hDYWxsQ29uZmlndXJhdGlvbgBoaXBHZXRMYXN0RXJy"
"b3IAbGF1bmNoX2Z1c2VkX3F1YW50X3NodWZmbGUAbGF1bmNoX2NvbWJpbmVkAG1lbXNldABoaXBNb2R1bGVMYXVuY2hLZXJuZWwA"
"c25wcmludGYAaGlwTW9kdWxlTG9hZABoaXBNb2R1bGVHZXRGdW5jdGlvbgBfX2hpcFJlZ2lzdGVyRmF0QmluYXJ5AF9faGlwUmVn"
"aXN0ZXJGdW5jdGlvbgBfX2hpcFVucmVnaXN0ZXJGYXRCaW5hcnkAX19oaXBfY3VpZF81MDIzZGY0M2ZhYzhkYTU3AF9fY3hhX2F0"
"ZXhpdABsaWJhbWRoaXA2NC5zby43AGhpcF80LjIAbGliZ2NjX3Muc28uMQBHQ0NfMy4wAGxpYmMuc28uNgBHTElCQ18yLjIuNQAv"
"b3B0L3JvY20tNy4xLjAvbGliAGxpYnN0ZGMrKy5zby42AGxpYm0uc28uNgAAAAAwfQAAAAAAAAgAAAAAAAAAMGEAAAAAAAA4fQAA"
"AAAAAAgAAAAAAAAAEGsAAAAAAABAfQAAAAAAAAgAAAAAAAAAcGEAAAAAAABYjwAAAAAAAAgAAAAAAAAAWI8AAAAAAABojwAAAAAA"
"AAgAAAAAAAAAABAAAAAAAAAofwAAAAAAAAYAAAABAAAAAAAAAAAAAAAwfwAAAAAAAAYAAAACAAAAAAAAAAAAAAA4fwAAAAAAAAYA"
"AAADAAAAAAAAAAAAAABAfwAAAAAAAAYAAAAEAAAAAAAAAAAAAABIfQAAAAAAAAEAAAASAAAAAAAAAAAAAABQfwAAAAAAAAYAAAAT"
"AAAAAAAAAAAAAABIfwAAAAAAAAYAAAAWAAAAAAAAAAAAAABQfQAAAAAAAAEAAAAXAAAAAAAAAAAAAACQjwAAAAAAAAcAAAACAAAA"
"AAAAAAAAAACYjwAAAAAAAAcAAAADAAAAAAAAAAAAAACgjwAAAAAAAAcAAAAEAAAAAAAAAAAAAACojwAAAAAAAAcAAAAFAAAAAAAA"
"AAAAAACwjwAAAAAAAAcAAAAGAAAAAAAAAAAAAAC4jwAAAAAAAAcAAAAHAAAAAAAAAAAAAADAjwAAAAAAAAcAAAAIAAAAAAAAAAAA"
"AADIjwAAAAAAAAcAAAAJAAAAAAAAAAAAAADQjwAAAAAAAAcAAAAKAAAAAAAAAAAAAADYjwAAAAAAAAcAAAALAAAAAAAAAAAAAADg"
"jwAAAAAAAAcAAAAMAAAAAAAAAAAAAADojwAAAAAAAAcAAAANAAAAAAAAAAAAAADwjwAAAAAAAAcAAAAOAAAAAAAAAAAAAAD4jwAA"
"AAAAAAcAAAAPAAAAAAAAAAAAAAAAkAAAAAAAAAcAAAAQAAAAAAAAAAAAAAAIkAAAAAAAAAcAAAARAAAAAAAAAAAAAABfWk41YWl0"
"ZXI0MWY0Z2VtbV9iZjE2X3BlcjF4MzJGcDRfQnByZVNodWZmbGVfMzJ4MTI4RQAlc2Y0Z2VtbV9iZjE2X3BlcjF4MzJGcDRfQnBy"
"ZVNodWZmbGVfMzJ4MTI4LmNvACVzZjRnZW1tX2JmMTZfcGVyMXgzMkZwNF9CcHJlU2h1ZmZsZV8xOTJ4MTI4LmNvAGZ1c2VkX3F1"
"YW50X3NodWZmbGVfa2VybmVsAC9ob21lL3J1bm5lci9haXRlci9oc2EvZ2Z4OTUwL2Y0Z2VtbS8AX1pONWFpdGVyNDJmNGdlbW1f"
"YmYxNl9wZXIxeDMyRnA0X0JwcmVTaHVmZmxlXzE5MngxMjhFAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9fQ0xBTkdfT0ZGTE9BRF9CVU5ETEVfXwIAAAAA"
"AAAAABAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAaG9zdC14ODZfNjQtdW5rbm93bi1saW51eC1nbnUtABAAAAAAAACoLgAAAAAAAB8A"
"AAAAAAAAaGlwdjQtYW1kZ2NuLWFtZC1hbWRoc2EtLWdmeDk1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAB/RUxGAgEBQAQAAAAAAAAAAwDgAAEAAAAAAAAAAAAAAEAAAAAAAAAAqCoAAAAAAABPBQAAQAA4AAkA"
"QAAQAA4ABgAAAAQAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAD4AQAAAAAAAPgBAAAAAAAACAAAAAAAAAABAAAABAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAIAOAAAAAAAAgA4AAAAAAAAAEAAAAAAAAAEAAAAFAAAAAA8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA"
"QBQAAAAAAABAFAAAAAAAAAAQAAAAAAAAAQAAAAYAAABAIwAAAAAAAEBDAAAAAAAAQEMAAAAAAABwAAAAAAAAAMAMAAAAAAAAABAA"
"AAAAAAABAAAABgAAALAjAAAAAAAAsFMAAAAAAACwUwAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAEAAAAAAAAAIAAAAGAAAAQCMAAAAA"
"AABAQwAAAAAAAEBDAAAAAAAAcAAAAAAAAABwAAAAAAAAAAgAAAAAAAAAUuV0ZAQAAABAIwAAAAAAAEBDAAAAAAAAQEMAAAAAAABw"
"AAAAAAAAAMAMAAAAAAAAAQAAAAAAAABR5XRkBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAQAAAAEAAAAOAIAAAAAAAA4AgAAAAAAADgCAAAAAAAAOAoAAAAAAAA4CgAAAAAAAAQAAAAAAAAABwAAACEKAAAgAAAAQU1E"
"R1BVAACDrmFtZGhzYS5rZXJuZWxzkt4AEqsuYWdwcl9jb3VudAClLmFyZ3Oaha4uYWN0dWFsX2FjY2Vzc6lyZWFkX29ubHmuLmFk"
"ZHJlc3Nfc3BhY2WmZ2xvYmFspy5vZmZzZXQApS5zaXplCKsudmFsdWVfa2luZK1nbG9iYWxfYnVmZmVyha4uYWN0dWFsX2FjY2Vz"
"c6lyZWFkX29ubHmuLmFkZHJlc3Nfc3BhY2WmZ2xvYmFspy5vZmZzZXQIpS5zaXplCKsudmFsdWVfa2luZK1nbG9iYWxfYnVmZmVy"
"ha4uYWN0dWFsX2FjY2Vzc6lyZWFkX29ubHmuLmFkZHJlc3Nfc3BhY2WmZ2xvYmFspy5vZmZzZXQQpS5zaXplCKsudmFsdWVfa2lu"
"ZK1nbG9iYWxfYnVmZmVyha4uYWN0dWFsX2FjY2Vzc6p3cml0ZV9vbmx5ri5hZGRyZXNzX3NwYWNlpmdsb2JhbKcub2Zmc2V0GKUu"
"c2l6ZQirLnZhbHVlX2tpbmStZ2xvYmFsX2J1ZmZlcoOnLm9mZnNldCClLnNpemUEqy52YWx1ZV9raW5kqGJ5X3ZhbHVlg6cub2Zm"
"c2V0JKUuc2l6ZQSrLnZhbHVlX2tpbmSoYnlfdmFsdWWDpy5vZmZzZXQopS5zaXplBKsudmFsdWVfa2luZKhieV92YWx1ZYOnLm9m"
"ZnNldCylLnNpemUEqy52YWx1ZV9raW5kqGJ5X3ZhbHVlg6cub2Zmc2V0MKUuc2l6ZQSrLnZhbHVlX2tpbmSoYnlfdmFsdWWDpy5v"
"ZmZzZXQ0pS5zaXplBKsudmFsdWVfa2luZKhieV92YWx1ZbkuZ3JvdXBfc2VnbWVudF9maXhlZF9zaXplzRAAti5rZXJuYXJnX3Nl"
"Z21lbnRfYWxpZ24ItS5rZXJuYXJnX3NlZ21lbnRfc2l6ZTipLmxhbmd1YWdlqE9wZW5DTCBDsS5sYW5ndWFnZV92ZXJzaW9ukgIA"
"uC5tYXhfZmxhdF93b3JrZ3JvdXBfc2l6Zc0BAKUubmFtZbdmdXNlZF9teGZwNF9nZW1tX2tlcm5lbLsucHJpdmF0ZV9zZWdtZW50"
"X2ZpeGVkX3NpemUAqy5zZ3ByX2NvdW50JLEuc2dwcl9zcGlsbF9jb3VudACnLnN5bWJvbLpmdXNlZF9teGZwNF9nZW1tX2tlcm5l"
"bC5rZLgudW5pZm9ybV93b3JrX2dyb3VwX3NpemUBsy51c2VzX2R5bmFtaWNfc3RhY2vCqy52Z3ByX2NvdW50P7Eudmdwcl9zcGls"
"bF9jb3VudACvLndhdmVmcm9udF9zaXplQN4AEqsuYWdwcl9jb3VudAClLmFyZ3PcABaFri5hY3R1YWxfYWNjZXNzqXJlYWRfb25s"
"ea4uYWRkcmVzc19zcGFjZaZnbG9iYWynLm9mZnNldAClLnNpemUIqy52YWx1ZV9raW5krWdsb2JhbF9idWZmZXKFri5hY3R1YWxf"
"YWNjZXNzqndyaXRlX29ubHmuLmFkZHJlc3Nfc3BhY2WmZ2xvYmFspy5vZmZzZXQIpS5zaXplCKsudmFsdWVfa2luZK1nbG9iYWxf"
"YnVmZmVyha4uYWN0dWFsX2FjY2Vzc6p3cml0ZV9vbmx5ri5hZGRyZXNzX3NwYWNlpmdsb2JhbKcub2Zmc2V0EKUuc2l6ZQirLnZh"
"bHVlX2tpbmStZ2xvYmFsX2J1ZmZlcoOnLm9mZnNldBilLnNpemUEqy52YWx1ZV9raW5kqGJ5X3ZhbHVlg6cub2Zmc2V0HKUuc2l6"
"ZQSrLnZhbHVlX2tpbmSoYnlfdmFsdWWDpy5vZmZzZXQgpS5zaXplBKsudmFsdWVfa2luZKhieV92YWx1ZYOnLm9mZnNldCSlLnNp"
"emUEqy52YWx1ZV9raW5kqGJ5X3ZhbHVlg6cub2Zmc2V0KKUuc2l6ZQSrLnZhbHVlX2tpbmSoYnlfdmFsdWWDpy5vZmZzZXQspS5z"
"aXplBKsudmFsdWVfa2luZKhieV92YWx1ZYOnLm9mZnNldDClLnNpemUEqy52YWx1ZV9raW5ktGhpZGRlbl9ibG9ja19jb3VudF94"
"g6cub2Zmc2V0NKUuc2l6ZQSrLnZhbHVlX2tpbmS0aGlkZGVuX2Jsb2NrX2NvdW50X3mDpy5vZmZzZXQ4pS5zaXplBKsudmFsdWVf"
"a2luZLRoaWRkZW5fYmxvY2tfY291bnRfeoOnLm9mZnNldDylLnNpemUCqy52YWx1ZV9raW5ks2hpZGRlbl9ncm91cF9zaXplX3iD"
"py5vZmZzZXQ+pS5zaXplAqsudmFsdWVfa2luZLNoaWRkZW5fZ3JvdXBfc2l6ZV95g6cub2Zmc2V0QKUuc2l6ZQKrLnZhbHVlX2tp"
"bmSzaGlkZGVuX2dyb3VwX3NpemVfeoOnLm9mZnNldEKlLnNpemUCqy52YWx1ZV9raW5ksmhpZGRlbl9yZW1haW5kZXJfeIOnLm9m"
"ZnNldESlLnNpemUCqy52YWx1ZV9raW5ksmhpZGRlbl9yZW1haW5kZXJfeYOnLm9mZnNldEalLnNpemUCqy52YWx1ZV9raW5ksmhp"
"ZGRlbl9yZW1haW5kZXJfeoOnLm9mZnNldFilLnNpemUIqy52YWx1ZV9raW5ktmhpZGRlbl9nbG9iYWxfb2Zmc2V0X3iDpy5vZmZz"
"ZXRgpS5zaXplCKsudmFsdWVfa2luZLZoaWRkZW5fZ2xvYmFsX29mZnNldF95g6cub2Zmc2V0aKUuc2l6ZQirLnZhbHVlX2tpbmS2"
"aGlkZGVuX2dsb2JhbF9vZmZzZXRfeoOnLm9mZnNldHClLnNpemUCqy52YWx1ZV9raW5ksGhpZGRlbl9ncmlkX2RpbXO5Lmdyb3Vw"
"X3NlZ21lbnRfZml4ZWRfc2l6ZQC2Lmtlcm5hcmdfc2VnbWVudF9hbGlnbgi1Lmtlcm5hcmdfc2VnbWVudF9zaXplzQEwqS5sYW5n"
"dWFnZahPcGVuQ0wgQ7EubGFuZ3VhZ2VfdmVyc2lvbpICALgubWF4X2ZsYXRfd29ya2dyb3VwX3NpemXNAQClLm5hbWW6ZnVzZWRf"
"cXVhbnRfc2h1ZmZsZV9rZXJuZWy7LnByaXZhdGVfc2VnbWVudF9maXhlZF9zaXplAKsuc2dwcl9jb3VudBOxLnNncHJfc3BpbGxf"
"Y291bnQApy5zeW1ib2y9ZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwua2S4LnVuaWZvcm1fd29ya19ncm91cF9zaXplAbMudXNl"
"c19keW5hbWljX3N0YWNrwqsudmdwcl9jb3VudDOxLnZncHJfc3BpbGxfY291bnQAry53YXZlZnJvbnRfc2l6ZUCtYW1kaHNhLnRh"
"cmdldLlhbWRnY24tYW1kLWFtZGhzYS0tZ2Z4OTUwrmFtZGhzYS52ZXJzaW9ukgECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AQAAABIDBwAAHwAAAAAAAEwKAAAAAAAAGQAAABEDBgAADgAAAAAAAEAAAAAAAAAANAAAABIDBwAAKgAAAAAAADQFAAAAAAAATwAA"
"ABEDBgBADgAAAAAAAEAAAAAAAAAAbQAAABEACgCwUwAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAAAGgAAAAgABQIAsCAAAQAAAO6c"
"a0ps/JkMkBk51mxBnmW1h9G0BgAAAAYAAAAEAAAABQAAAAMAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA"
"ZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwAZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwua2QAZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJu"
"ZWwAZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwua2QAX19oaXBfY3VpZF81MDIzZGY0M2ZhYzhkYTU3AAAAAAAAAAAAAAAAAAAA"
"AAAQAAAAAAAAOAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAcBrwCEAAAACAAAAAAAAAAAAAAAAAAAADAB"
"AAAAAAAAwBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAACGAK8AhAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgrAIAAAAIIABCCwBAQmjwAOJn/AjL8JvwOBA58EkASaBI8DBAOBA4YD"
"kAMMAn6AA4SBAUcCfgAAgL//AgIK/v9/TwEPAn4AAIC/AQUKfgQFBJIFBASWBQQFgQIFBJYEAwWSAgWFgQSBBoEFA4eBBQMJvwYE"
"BIUHBQWFBIEGgQUDCb8GBASFBAMDkgIDgoEBAADSAgwJBAqAAr8BD1AoAwCFvwEPDCiAAYK+AQCCv8EBgr6AAQbAGAAAAASEFo4p"
"AMjRAAkJAoAAl75+AuqJgAIKfoACCH6AAgZ+gAIEfggCh7+AAAbAMAAAAAAECsAAAAAAAAMGwBAAAACEAAgggwAEJP8EVCZ4AAAA"
"FggEaAgEiH0CAIXSAhcAAJ8EBiJ/wIy/FgAI0gIDQQCBVAQkKwAA0gQRCQQCAIXSKAUAAJ8EBiIYAAjSEgAJBIYIBCSGAAYg/wQE"
"JsAAAAAAAADSAAUNBP8CAibg////AAAB0gB7CQQKnwCPAALo0QEHAAQKAACBhlICJIACBH4AgRiQhVJYJAAAxNAJUAIACoULjwEA"
"ANIHEQUEGgAI0hYBCQIcAAjSFgERAh4ACNIWARkCIAAI0hYBIQIiAAjSFgEpAiQACNIWATECasGOiIACTn7/AJm+AACAAIP/GrD/"
"AJu+AAUMDP8AnL4AAP8AKQNafoAAnb4CAwZ+AgMIfgIDCn4sAIK/fgL+h4gmFiQLAO3RCyVuAJAoJCQLAAHSEjksBBIAANIVMS0E"
"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"
"nxASIn/AjL8IAAjSCAMZAACAbNwIAX8AfgD+h4EAAigAAMTQCAICAABqgoYCIIC+DQCIvwIAyNEDIQUC/38CsAcA/9EDBQoAAgLo"
"0QETGASfBAYif8CMvwIACNICAxkAAIBs3AIHfwB+AP6HggACKAAAxNAIAgIAAGqChgIggL4NAIi/AgDI0QQhBQL/fwKwBAD/0QQF"
"CgACAujRARMYBJ8EBiJ/wIy/AgAI0gIDGQAAgGzcAgR/AH4A/oeDAAAoAADE0AgAAgAAaoCGACCCvg0AiL8BAMjRBSEFAv9/ALAC"
"AP/RBQMCAAAA6NEAExgEnwACIn/AjL8AAAjSAAMZAACAbNwAAn8AAACBvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/"
"AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACA"
"vwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAB"
"BsAYAAAAwAACwDwAAAB/wIy/BZ8GkAabBo8FBgWBBYUMkAwwhb4FDAJ+A/8Dhv//AAACAwKSAgAAaAFHAn6ABYKBgAAEagAFBBr/"
"AgIK/v9/TwEPAn4MAAYqnwYGIgQAhdICAgIABACG0gEJAgABCQJoAQCG0gIDAgAEAIXSAQsAAAIJBGqBAgpoBQSWfQUECGwAAIC/"
"AQsCAAIJBACBAghoBQSWfQEAgL8BCQIAAQcCKgEHJGoEJIh9aiCCvhsBiL8AAQrAJAAAAAACCsAAAAAAgAAGwBAAAAABAIXSEhkA"
"AAADJmp/wIy/AACF0hILAACFJiAknwACIgAACNIAAyEAnyAiIhQACNIQAwEEAIBc3BQAfwQQgFzcFAB/DCCAXNwUAH8AMIBc3BQA"
"fwhzD4y/kAg2JP8IRiYAAP//kApIJP8KOCYAAP//GwXT0RsBjQSQDEok/ww6JgAA//8bBtPRG0lyBJAOTCT/DjwmAAD//xsG09Eb"
"S3YEcg+Mv5AYTiT/GD4mAAD//xsG09EbTXoEkBpQJP8aQCYAAP//GwbT0RtPfgSQHFIk/xxCJgAA//8bBtPRG1GCBJAeVCT/HkQm"
"AAD//xsG09EbU4YEcQ+Mv5AAViT/ACImAAD//xsG09EbVYoEkAJYJP8CKCYAAP//GwbT0RtXRgSQBFok/wQqJgAA//8bBtPRG1lS"
"BJAGXCT/BiwmAAD//xsG09EbW1YEcA+Mv5AQXiT/EC4mAAD//xsG09EbXVoEkBJgJP8SMCYAAP//GwbT0RtfXgSQFGIk/xQyJgAA"
"//8bBtPRG2FiBJAWZCT/FjQmAAD//xsG09EbY2YEJAbT0RtlagSASJp8gAI2fmoggL4aAIi//0g2aAAAIAD/NjYmAACA//8Ahb4A"
"AIAABTaIfIP/BbAAAIC/JAAA0YBAqQEbAIjSG0kCABtDNn7/Akh+AAAAQoBISAAbSTYEGz82fhsRNn7/Akh+gQAAABsA19EbC5AE"
"/zY2TH0AAAB+AP6HlwJIfvkICCgjBgYE+QoKKBwGBgT5NlAkJAYGAAQATdIEUQIABQBN0gVRAgD/AACw+QwMKB0GBgT5Dg4oHgYG"
"BIgKClQGAE3SBlECAAcATdIHUQIABAUz0gQLApiIDgpU+RgYKB8GBgT5GhooIAYGBPkcHCghBgYE+R4eKCIGBgQFBTPSBgsCmCQA"
"hdISDQAADABN0gxRAgANAE3SDVECAA4ATdIOUQIADwBN0g9RAgCQCgokiB4MVJ9ISiKEJkwk+QoIKAQGBAaIGgpUBgUz0g4NApgk"
"AAjSCgCRBJ9MTiIFBTPSDAsCmJAMDCQkAAjSJAGZBPkMCigFBgQG+QAAKBEGBgT5AgIoFAYGBACAdNwkBH8AAABN0gBRAgABAE3S"
"AVECAPkEBCgVBgYE+QYGKBYGBgSIAgJUAgBN0gJRAgADAE3SA1ECAAAFM9IAAwKYiAYCVPkQCCgXBgYE+RIKKBgGBgT5FAwoGQYG"
"BPkWDigaBgYEAQUz0gIDApgEAE3SBFECAAUATdIFUQIABgBN0gZRAgAHAE3SB1ECAJACAiSIDgRU+QIAKAAGBAaICgJUAgUz0gYF"
"ApgBBTPSBAMCmJAEBCT5BAIoAQYEBgiAdNwkAH8AhiYAJP8ABibAAAAAgiQAJLwAACaEJAog/yQCJuD///8AAAHSBQMBBP8gBCYA"
"////AADo0QEJAASBJgggAAD/0QAFDgQAAAHSBAUBBJ8AAiIAAAjSAgABBACAYNwAG38AAACBvwAAgL8AAIC/AACAvwAAgL8AAIC/"
"AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACA"
"vwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAA"
"gL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8A"
"AIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/"
"AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACA"
"vwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAA"
"gL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8A"
"AIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/"
"AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACA"
"vwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAA"
"gL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8A"
"AIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/"
"AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACA"
"vwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8GAAAAAAAAAHAMAAAAAAAACwAAAAAAAAAYAAAAAAAAAAUA"
"AAAAAAAAaA0AAAAAAAAKAAAAAAAAAIkAAAAAAAAA9f7/bwAAAAAADQAAAAAAAAQAAAAAAAAAMA0AAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAEFNRCBjbGFuZyB2ZXJzaW9uIDIwLjAuMGdpdCAoaHR0cHM6Ly9naXRodWIuY29tL1JhZGVvbk9wZW5Db21wdXRlL2xsdm0t"
"cHJvamVjdCByb2MtNy4xLjAgMjU0MjUgMWIwZWFkYTZiMGVlOTNlMmU2OTRjOGMxNDZkMjNmY2E5MGJjMTFjNSkATGlua2VyOiBB"
"TUQgTExEIDIwLjAuMCAoL2xvbmdlcl9wYXRobmFtZV9zb190aGF0X3JwbXNfY2FuX3N1cHBvcnRfcGFja2FnaW5nX3RoZV9kZWJ1"
"Z19pbmZvX2Zvcl9hbGxfb3NfcHJvZmlsZXMvc3JjL2xsdm0tcHJvamVjdC9sbHZtIDFiMGVhZGE2YjBlZTkzZTJlNjk0YzhjMTQ2"
"ZDIzZmNhOTBiYzExYzUpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAADx/wAAAAAAAAAAAAAAAAAAAAAqAAAA"
"AADx/z8AAAAAAAAAAAAAAAAAAABLAAAAAADx/wAAAAAAAAAAAAAAAAAAAABsAAAAAADx/x4AAAAAAAAAAAAAAAAAAACSAAAAAADx"
"/wEAAAAAAAAAAAAAAAAAAACzAAAAAADx/wAAAAAAAAAAAAAAAAAAAADdAAAAAADx/wAAAAAAAAAAAAAAAAAAAAAJAQAAAADx/wAA"
"AAAAAAAAAAAAAAAAAAAvAQAAAADx/wAAAAAAAAAAAAAAAAAAAABbAQAAAADx/zMAAAAAAAAAAAAAAAAAAAB/AQAAAADx/wAAAAAA"
"AAAAAAAAAAAAAACjAQAAAADx/w0AAAAAAAAAAAAAAAAAAADMAQAAAADx/wEAAAAAAAAAAAAAAAAAAADwAQAAAADx/wAAAAAAAAAA"
"AAAAAAAAAAAdAgAAAADx/wAAAAAAAAAAAAAAAAAAAABMAgAAAADx/wAAAAAAAAAAAAAAAAAAAAD9AgAAAAIIAEBDAAAAAAAAAAAA"
"AAAAAAB1AgAAEgMHAAAfAAAAAAAATAoAAAAAAACNAgAAEQMGAAAOAAAAAAAAQAAAAAAAAACoAgAAEgMHAAAqAAAAAAAANAUAAAAA"
"AADDAgAAEQMGAEAOAAAAAAAAQAAAAAAAAADhAgAAEQAKALBTAAAAAAAAAQAAAAAAAAAALm5vdGUALmR5bnN5bQAuZ251Lmhhc2gA"
"Lmhhc2gALmR5bnN0cgAucm9kYXRhAC50ZXh0AC5keW5hbWljAC5yZWxyb19wYWRkaW5nAC5ic3MALkFNREdQVS5ncHJfbWF4aW11"
"bXMALmNvbW1lbnQALnN5bXRhYgAuc2hzdHJ0YWIALnN0cnRhYgAAZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwucHJpdmF0ZV9zZWdf"
"c2l6ZQBmdXNlZF9teGZwNF9nZW1tX2tlcm5lbC5udW1fdmdwcgBmdXNlZF9teGZwNF9nZW1tX2tlcm5lbC5udW1fYWdwcgBmdXNl"
"ZF9teGZwNF9nZW1tX2tlcm5lbC5udW1iZXJlZF9zZ3ByAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsLnVzZXNfdmNjAGZ1c2VkX214"
"ZnA0X2dlbW1fa2VybmVsLnVzZXNfZmxhdF9zY3JhdGNoAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsLmhhc19keW5fc2l6ZWRfc3Rh"
"Y2sAZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwuaGFzX3JlY3Vyc2lvbgBmdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbC5wcml2YXRl"
"X3NlZ19zaXplAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsLm51bV92Z3ByAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsLm51"
"bV9hZ3ByAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsLm51bWJlcmVkX3NncHIAZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwu"
"dXNlc192Y2MAZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwudXNlc19mbGF0X3NjcmF0Y2gAZnVzZWRfcXVhbnRfc2h1ZmZsZV9r"
"ZXJuZWwuaGFzX2R5bl9zaXplZF9zdGFjawBmdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbC5oYXNfcmVjdXJzaW9uAGZ1c2VkX214"
"ZnA0X2dlbW1fa2VybmVsAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsLmtkAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsAGZ1c2Vk"
"X3F1YW50X3NodWZmbGVfa2VybmVsLmtkAF9faGlwX2N1aWRfNTAyM2RmNDNmYWM4ZGE1NwBfRFlOQU1JQwAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAACAAAAAAAAADgCAAAAAAAA"
"OAIAAAAAAAA4CgAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAcAAAALAAAAAgAAAAAAAABwDAAAAAAAAHAMAAAAAAAAkAAA"
"AAAAAAAFAAAAAQAAAAgAAAAAAAAAGAAAAAAAAAAPAAAA9v//bwIAAAAAAAAAAA0AAAAAAAAADQAAAAAAADAAAAAAAAAAAgAAAAAA"
"AAAIAAAAAAAAAAAAAAAAAAAAGQAAAAUAAAACAAAAAAAAADANAAAAAAAAMA0AAAAAAAA4AAAAAAAAAAIAAAAAAAAABAAAAAAAAAAE"
"AAAAAAAAAB8AAAADAAAAAgAAAAAAAABoDQAAAAAAAGgNAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAnAAAA"
"AQAAAAIAAAAAAAAAAA4AAAAAAAAADgAAAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAALwAAAAEAAAAGAAAAAAAA"
"AAAfAAAAAAAAAA8AAAAAAABAFAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAADUAAAAGAAAAAwAAAAAAAABAQwAAAAAAAEAj"
"AAAAAAAAcAAAAAAAAAAFAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAA+AAAACAAAAAMAAAAAAAAAsEMAAAAAAACwIwAAAAAAAFAMAAAA"
"AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAATQAAAAgAAAADAAAAAAAAALBTAAAAAAAAsCMAAAAAAAABAAAAAAAAAAAAAAAAAAAA"
"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"
"AAAAAKgEAAAAAAAA/v//bwAAAADcBAAAAAAAAP///28AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGUElIAQAAAAAAAAAAAAAAAAAAAAAAAABYfQAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAA2bAAAAAAAAEZsAAAAAAAAVmwAAAAAAABmbAAAAAAAAHZsAAAAAAAAhmwAAAAAAACWbAAAAAAAAKZsAAAA"
"AAAAtmwAAAAAAADGbAAAAAAAANZsAAAAAAAA5mwAAAAAAAD2bAAAAAAAAAZtAAAAAAAAFm0AAAAAAAAmbQAAAAAAAABBTUQgY2xh"
"bmcgdmVyc2lvbiAyMC4wLjBnaXQgKGh0dHBzOi8vZ2l0aHViLmNvbS9SYWRlb25PcGVuQ29tcHV0ZS9sbHZtLXByb2plY3Qgcm9j"
"LTcuMS4wIDI1NDI1IDFiMGVhZGE2YjBlZTkzZTJlNjk0YzhjMTQ2ZDIzZmNhOTBiYzExYzUpAExpbmtlcjogQU1EIExMRCAyMC4w"
"LjAgKC9sb25nZXJfcGF0aG5hbWVfc29fdGhhdF9ycG1zX2Nhbl9zdXBwb3J0X3BhY2thZ2luZ190aGVfZGVidWdfaW5mb19mb3Jf"
"YWxsX29zX3Byb2ZpbGVzL3NyYy9sbHZtLXByb2plY3QvbGx2bSAxYjBlYWRhNmIwZWU5M2UyZTY5NGM4YzE0NmQyM2ZjYTkwYmMx"
"MWM1KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQA8f8AAAAAAAAAAAAAAAAAAAAADAAAAAIADAAwYQAAAAAA"
"ADgAAAAAAAAAFgAAAAEAGQAQkAAAAAAAAAEAAAAAAAAALgAAAAEACwAITwAAAAAAAAAAAAAAAAAAQAAAAAEAGQAYkAAAAAAAAEAA"
"AAAAAAAAUwAAAAIADABwYQAAAAAAAEoAAAAAAAAAXQAAAAEAGQBYkAAAAAAAAAEAAAAAAAAAcwAAAAEAEAAwfQAAAAAAAAgAAAAA"
"AAAAegAAAAEAEQBAfQAAAAAAAAgAAAAAAAAAfgEAAAECFgBYjwAAAAAAAAgAAAAAAAAAgQAAAAQA8f8AAAAAAAAAAAAAAAAAAAAA"
"kQAAAAEAGQBgkAAAAAAAAAgAAAAAAAAAnAAAAAEAGQBokAAAAAAAAAgAAAAAAAAAqAAAAAEAGQBwkAAAAAAAAAgAAAAAAAAAtAAA"
"AAEAGQB4kAAAAAAAAAgAAAAAAAAAwQAAAAIADAAQawAAAAAAAJQAAAAAAAAA0wAAAAEAGQCAkAAAAAAAAAgAAAAAAAAA+AAAAAEA"
"FwBgjwAAAAAAABgAAAAAAAAADQEAAAIADACwawAAAAAAACIAAAAAAAAAHwEAAAQA8f8AAAAAAAAAAAAAAAAAAAAAeAMAAAECCwAI"
"TwAAAAAAAAQAAAAAAAAANwEAAAICDQD0awAAAAAAAAAAAAAAAAAAUwEAAAICDgAQbAAAAAAAAAAAAAAAAAAAPQEAAAACGAB4jwAA"
"AAAAAAAAAAAAAAAAjgMAAAACEwBYfQAAAAAAAAAAAAAAAAAALwMAAAICDADgawAAAAAAABIAAAAAAAAAKAEAACAAAAAAAAAAAAAA"
"AAAAAAAAAAAAWQEAACIAAAAAAAAAAAAAAAAAAAAAAAAAbwEAACIAAAAAAAAAAAAAAAAAAAAAAAAAiwEAACIAAAAAAAAAAAAAAAAA"
"AAAAAAAAowEAABIADADAYQAAAAAAAPQAAAAAAAAAygEAABIAAAAAAAAAAAAAAAAAAAAAAAAA5AEAABEAEgBIfQAAAAAAAAgAAAAA"
"AAAA/AEAABIAAAAAAAAAAAAAAAAAAAAAAAAADAIAABIADADAYgAAAAAAAOMAAAAAAAAANgIAABEAEgBQfQAAAAAAAAgAAAAAAAAA"
"UQIAABIADACwYwAAAAAAAJ8BAAAAAAAAYwIAABIAAAAAAAAAAAAAAAAAAAAAAAAAfgIAABIAAAAAAAAAAAAAAAAAAAAAAAAAjgIA"
"ABIADABQZQAAAAAAAIABAAAAAAAAqQIAABIADADQZgAAAAAAADYEAAAAAAAAuQIAABIAAAAAAAAAAAAAAAAAAAAAAAAAwAIAABIA"
"AAAAAAAAAAAAAAAAAAAAAAAA1gIAABIAAAAAAAAAAAAAAAAAAAAAAAAA3wIAABIAAAAAAAAAAAAAAAAAAAAAAAAA7QIAABIAAAAA"
"AAAAAAAAAAAAAAAAAAAAAgMAABIAAAAAAAAAAAAAAAAAAAAAAAAAGQMAABIAAAAAAAAAAAAAAAAAAAAAAAAANgMAABIAAAAAAAAA"
"AAAAAAAAAAAAAAAATwMAABEAGQCIkAAAAAAAAAEAAAAAAAAAawMAABIAAAAAAAAAAAAAAAAAAAAAAAAAAC5keW5zeW0ALmdudS52"
"ZXJzaW9uAC5nbnUudmVyc2lvbl9yAC5nbnUuaGFzaAAuZHluc3RyAC5yZWxhLmR5bgAucmVsYS5wbHQALnJvZGF0YQAuaGlwX2Zh"
"dGJpbgAuZWhfZnJhbWVfaGRyAC5laF9mcmFtZQAudGV4dAAuaW5pdAAuZmluaQAucGx0AC5pbml0X2FycmF5AC5maW5pX2FycmF5"
"AC5kYXRhLnJlbC5ybwAuZHluYW1pYwAuZ290AC5yZWxyb19wYWRkaW5nAC5kYXRhAC5oaXBGYXRCaW5TZWdtZW50AC5nb3QucGx0"
"AC5ic3MALmNvbW1lbnQALnN5bXRhYgAuc2hzdHJ0YWIALnN0cnRhYgAAY3J0YmVnaW4uYwBfX2RvX2luaXQAX19kb19pbml0Ll9f"
"aW5pdGlhbGl6ZWQAX19FSF9GUkFNRV9MSVNUX18AX19kb19pbml0Ll9fb2JqZWN0AF9fZG9fZmluaQBfX2RvX2ZpbmkuX19maW5h"
"bGl6ZWQAX19pbml0AF9fZmluaQBteGZwNF9mdXNlZC5oaXAAX1pMNnNfZm4zMgBfWkw3c19mbjE5MgBfWkw3c19tb2QzMgBfWkw4"
"c19tb2QxOTIAX19oaXBfbW9kdWxlX2N0b3IAX19oaXBfZ3B1YmluX2hhbmRsZV81MDIzZGY0M2ZhYzhkYTU3AF9faGlwX2ZhdGJp"
"bl93cmFwcGVyAF9faGlwX21vZHVsZV9kdG9yAGNydGVuZC5jAF9fZ21vbl9zdGFydF9fAF9pbml0AF9HTE9CQUxfT0ZGU0VUX1RB"
"QkxFXwBfZmluaQBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8AX19jeGFfZmluYWxpemUAX19kc29faGFuZGxlAF9fZGVyZWdpc3Rlcl9m"
"cmFtZV9pbmZvAF9fZGV2aWNlX3N0dWJfX2Z1c2VkX214ZnA0X2dlbW1fa2VybmVsAF9faGlwUG9wQ2FsbENvbmZpZ3VyYXRpb24A"
"ZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwAaGlwTGF1bmNoS2VybmVsAF9fZGV2aWNlX3N0dWJfX2Z1c2VkX3F1YW50X3NodWZmbGVf"
"a2VybmVsAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsAGxhdW5jaF9mdXNlZF9nZW1tAF9faGlwUHVzaENhbGxDb25maWd1cmF0"
"aW9uAGhpcEdldExhc3RFcnJvcgBsYXVuY2hfZnVzZWRfcXVhbnRfc2h1ZmZsZQBsYXVuY2hfY29tYmluZWQAbWVtc2V0AGhpcE1v"
"ZHVsZUxhdW5jaEtlcm5lbABzbnByaW50ZgBoaXBNb2R1bGVMb2FkAGhpcE1vZHVsZUdldEZ1bmN0aW9uAF9faGlwUmVnaXN0ZXJG"
"YXRCaW5hcnkAX19oaXBSZWdpc3RlckZ1bmN0aW9uAGF0ZXhpdABfX2hpcFVucmVnaXN0ZXJGYXRCaW5hcnkAX19oaXBfY3VpZF81"
"MDIzZGY0M2ZhYzhkYTU3AF9fY3hhX2F0ZXhpdABfX0VIX0ZSQU1FX0xJU1RfRU5EX18AX0RZTkFNSUMAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALAAAAAgAAAAAAAAA4AgAAAAAAADgC"
"AAAAAAAAcAIAAAAAAAAFAAAAAQAAAAgAAAAAAAAAGAAAAAAAAAAJAAAA////bwIAAAAAAAAAqAQAAAAAAACoBAAAAAAAADQAAAAA"
"AAAAAQAAAAAAAAACAAAAAAAAAAIAAAAAAAAAFgAAAP7//28CAAAAAAAAANwEAAAAAAAA3AQAAAAAAABgAAAAAAAAAAUAAAADAAAA"
"BAAAAAAAAAAAAAAAAAAAACUAAAD2//9vAgAAAAAAAABABQAAAAAAAEAFAAAAAAAASAAAAAAAAAABAAAAAAAAAAgAAAAAAAAAAAAA"
"AAAAAAAvAAAAAwAAAAIAAAAAAAAAiAUAAAAAAACIBQAAAAAAAI0CAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAANwAAAAQA"
"AAACAAAAAAAAABgIAAAAAAAAGAgAAAAAAAA4AQAAAAAAAAEAAAAAAAAACAAAAAAAAAAYAAAAAAAAAEEAAAAEAAAAQgAAAAAAAABQ"
"CQAAAAAAAFAJAAAAAAAAgAEAAAAAAAABAAAAGAAAAAgAAAAAAAAAGAAAAAAAAABLAAAAAQAAADIAAAAAAAAA0AoAAAAAAADQCgAA"
"AAAAACUBAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAUwAAAAEAAAACAAAAAAAAAAAQAAAAAAAAABAAAAAAAACoPgAAAAAA"
"AAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAF8AAAABAAAAAgAAAAAAAACoTgAAAAAAAKhOAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAQA"
"AAAAAAAAAAAAAAAAAABtAAAAAQAAAAIAAAAAAAAACE8AAAAAAAAITwAAAAAAABwCAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAA"
"AAAAdwAAAAEAAAAGAAAAAAAAADBhAAAAAAAAMFEAAAAAAADECgAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAH0AAAABAAAA"
"BgAAAAAAAAD0awAAAAAAAPRbAAAAAAAAGwAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAACDAAAAAQAAAAYAAAAAAAAAEGwA"
"AAAAAAAQXAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAiQAAAAEAAAAGAAAAAAAAACBsAAAAAAAAIFwAAAAA"
"AAAQAQAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAI4AAAAOAAAAAwAAAAAAAAAwfQAAAAAAADBdAAAAAAAAEAAAAAAAAAAA"
"AAAAAAAAAAgAAAAAAAAAAAAAAAAAAACaAAAADwAAAAMAAAAAAAAAQH0AAAAAAABAXQAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAA"
"AAAAAAAAAAAAAAAApgAAAAEAAAADAAAAAAAAAEh9AAAAAAAASF0AAAAAAAAQAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAA"
"ALMAAAAGAAAAAwAAAAAAAABYfQAAAAAAAFhdAAAAAAAA0AEAAAAAAAAFAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAC8AAAAAQAAAAMA"
"AAAAAAAAKH8AAAAAAAAoXwAAAAAAADAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAwQAAAAgAAAADAAAAAAAAAFh/AAAA"
"AAAAWF8AAAAAAACoAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAANAAAAABAAAAAwAAAAAAAABYjwAAAAAAAFhfAAAAAAAA"
"CAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAADWAAAAAQAAAAMAAAAAAAAAYI8AAAAAAABgXwAAAAAAABgAAAAAAAAAAAAA"
"AAAAAAAIAAAAAAAAAAAAAAAAAAAA6AAAAAEAAAADAAAAAAAAAHiPAAAAAAAAeF8AAAAAAACYAAAAAAAAAAAAAAAAAAAACAAAAAAA"
"AAAAAAAAAAAAAPEAAAAIAAAAAwAAAAAAAAAQkAAAAAAAABBgAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAD2"
"AAAAAQAAADAAAAAAAAAAAAAAAAAAAAAQYAAAAAAAADkBAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAA/wAAAAIAAAAAAAAA"
"AAAAAAAAAAAAAAAAUGEAAAAAAADgBAAAAAAAAB0AAAAbAAAACAAAAAAAAAAYAAAAAAAAAAcBAAADAAAAAAAAAAAAAAAAAAAAAAAA"
"ADBmAAAAAAAAGQEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAARAQAAAwAAAAAAAAAAAAAAAAAAAAAAAABJZwAAAAAAAJcD"
"AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA"
)
def _load():
try:
so = base64.b64decode(_SO_B64)
td = tempfile.mkdtemp()
p = os.path.join(td, "k.so")
with open(p, 'wb') as f: f.write(so)
lib = ctypes.cdll.LoadLibrary(p)
# Fused GEMM
lib.launch_fused_gemm.restype = ctypes.c_int
lib.launch_fused_gemm.argtypes = [ctypes.c_void_p]*4 + [ctypes.c_int]*6 + [ctypes.c_void_p]
# Combined quant + ASM gemm
lib.launch_combined.restype = ctypes.c_int
lib.launch_combined.argtypes = (
[ctypes.c_void_p]*3 + # A_bf16, Aq_out, As_out
[ctypes.c_int]*6 + # m, k, m_pad_q, ks_pad, stride_a, stride_aq
[ctypes.c_void_p]*3 + # B_shuffle, B_scale_sh, C_out
[ctypes.c_int]*5 + # N, stride_bsh, stride_bsc, m_pad_gemm, log2_ksplit
[ctypes.c_void_p] # null
)
return lib
except: return None
_lib = _load()
_out = {}
_qs = {}
def _fused_gemm(A, B_q, B_sc, m, n, k):
B_q_u8 = B_q.view(torch.uint8)
B_sc_u8 = B_sc.contiguous().view(torch.uint8)
ksp = ((k//32+7)//8)*8
key = (m,n)
if key not in _out: _out[key] = torch.empty((m,n), dtype=torch.bfloat16, device='cuda')
C = _out[key]
_lib.launch_fused_gemm(
ctypes.c_void_p(A.data_ptr()), ctypes.c_void_p(B_q_u8.data_ptr()),
ctypes.c_void_p(B_sc_u8.data_ptr()), ctypes.c_void_p(C.data_ptr()),
ctypes.c_int(m), ctypes.c_int(n), ctypes.c_int(k),
ctypes.c_int(A.stride(0)), ctypes.c_int(B_q_u8.stride(0)),
ctypes.c_int(ksp), ctypes.c_void_p(0))
return C
def _choose_log2_ksplit(m, n, k):
"""Choose log2_k_split to maximize occupancy (256 CUs target)."""
tile_M, tile_N = 32, 128
m_pad = ((m + 31) // 32) * 32
base_wgs = ((n + tile_N - 1) // tile_N) * ((m_pad + tile_M - 1) // tile_M)
# Want at least 256 workgroups for full CU occupancy
if base_wgs >= 256:
return 0 # enough parallelism
# Try increasing split-K
for log2s in range(1, 6):
if base_wgs * (1 << log2s) >= 256:
return log2s
return 5 # max split = 32
def _combined(A, B_shuffle, B_scale_sh, m, n, k):
B_sh_u8 = B_shuffle.view(torch.uint8)
B_sc_u8 = B_scale_sh.contiguous().view(torch.uint8)
ks = k//32
m_pad_q = ((m+255)//256)*256
ks_pad = ((ks+7)//8)*8
m_pad_gemm = ((m+31)//32)*32
log2_ks = 0 # explicit split-K is slower for all our shapes
key = (m_pad_q, k, ks_pad, m_pad_gemm, n)
if key not in _qs:
_qs[key] = {
'Aq': torch.zeros(m_pad_q, k//2, dtype=torch.uint8, device='cuda'),
'As': torch.zeros(m_pad_q * ks_pad, dtype=torch.uint8, device='cuda'),
'C': torch.empty(m_pad_gemm, n, dtype=torch.bfloat16, device='cuda'),
}
c = _qs[key]
err = _lib.launch_combined(
ctypes.c_void_p(A.data_ptr()),
ctypes.c_void_p(c['Aq'].data_ptr()),
ctypes.c_void_p(c['As'].data_ptr()),
ctypes.c_int(m), ctypes.c_int(k), ctypes.c_int(m_pad_q),
ctypes.c_int(ks_pad), ctypes.c_int(A.stride(0)), ctypes.c_int(c['Aq'].stride(0)),
ctypes.c_void_p(B_sh_u8.data_ptr()),
ctypes.c_void_p(B_sc_u8.data_ptr()),
ctypes.c_void_p(c['C'].data_ptr()),
ctypes.c_int(n), ctypes.c_int(B_sh_u8.stride(0)), ctypes.c_int(B_sc_u8.stride(0)),
ctypes.c_int(m_pad_gemm),
ctypes.c_int(log2_ks),
ctypes.c_void_p(0),
)
if err != 0:
return None
return c['C'][:m]
# Fallback
_a_cache = None
def _fallback(data):
global _a_cache
A, B, B_q, B_shuffle, B_scale_sh = data
if _a_cache is not None and _a_cache[0] is A: return _a_cache[1], _a_cache[2]
Aq, As = dynamic_mxfp4_quant(A)
Ash = e8m0_shuffle(As).view(dtypes.fp8_e8m0)
Aq = Aq.view(dtypes.fp4x2)
_a_cache = (A, Aq, Ash)
return Aq, Ash
_combined_ok = None
def custom_kernel(data: input_t) -> output_t:
global _combined_ok
A, B, B_q, B_shuffle, B_scale_sh = data
m, k = A.shape
n = B_q.shape[0]
if _lib is not None and k <= 1024:
return _fused_gemm(A, B_q, B_scale_sh, m, n, k)
if _lib is not None and _combined_ok is not False:
try:
result = _combined(A, B_shuffle, B_scale_sh, m, n, k)
if result is not None:
_combined_ok = True
return result
except Exception as e:
import sys
print(f"COMBINED_FAIL: {e}", file=sys.stderr)
_combined_ok = False
# Fallback: Python quant + aiter gemm
Aq, Ash = _fallback(data)
return aiter.gemm_a4w4(Aq, B_shuffle, Ash, B_scale_sh, dtype=dtypes.bf16, bpreshuffle=True)
scrolls · 539 lines total
Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 658361.
#!POPCORN leaderboard amd-mxfp4-mm#!POPCORN gpu MI355X"""- MXFP4-MM Hybrid: dispatch by K size.- K <= 1024: fused quant+GEMM HIP kernel (1 launch, ~9 us)- K > 1024: HIP quant+shuffle (1 launch) + ASM gemm_a4w4 (1 launch, ~14-26 us)+ MXFP4-MM: Hybrid with direct ASM GEMM launch.+ K<=1024: fused HIP quant+GEMM (1 launch)+ K>1024: combined C++ call: HIP quant + ASM gemm (2 launches, 0 Python round-trips)"""import os, ctypes, base64, tempfileimport torch⋯ 3 unchanged linesfrom aiter.utility.fp4_utils import e8m0_shufflefrom task import input_t, output_t- # ---- Embedded .so (both kernels) ----_SO_B64 = (- "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"- "NF9nZW1tX2tlcm5lbABfX2hpcFBvcENhbGxDb25maWd1cmF0aW9uAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsAGhpcExhdW5jaEtl"- "cm5lbABfX2RldmljZV9zdHViX19mdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbABmdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbABs"- "YXVuY2hfZnVzZWRfZ2VtbQBfX2hpcFB1c2hDYWxsQ29uZmlndXJhdGlvbgBoaXBHZXRMYXN0RXJyb3IAbGF1bmNoX2Z1c2VkX3F1"- "YW50X3NodWZmbGUAX19oaXBSZWdpc3RlckZhdEJpbmFyeQBfX2hpcFJlZ2lzdGVyRnVuY3Rpb24AX19oaXBVbnJlZ2lzdGVyRmF0"- "QmluYXJ5AF9faGlwX2N1aWRfNTAyM2RmNDNmYWM4ZGE1NwBfX2N4YV9hdGV4aXQAbGliYW1kaGlwNjQuc28uNwBoaXBfNC4yAGxp"- "YmdjY19zLnNvLjEAR0NDXzMuMABsaWJjLnNvLjYAR0xJQkNfMi4yLjUAL29wdC9yb2NtLTcuMS4wL2xpYgBsaWJzdGRjKysuc28u"- "NgBsaWJtLnNvLjYAAAAAACB4AAAAAAAACAAAAAAAAACwYAAAAAAAACh4AAAAAAAACAAAAAAAAABQZgAAAAAAADB4AAAAAAAACAAA"- "AAAAAADwYAAAAAAAAEiKAAAAAAAACAAAAAAAAABIigAAAAAAAFiKAAAAAAAACAAAAAAAAAAAEAAAAAAAABh6AAAAAAAABgAAAAEA"- "AAAAAAAAAAAAACB6AAAAAAAABgAAAAIAAAAAAAAAAAAAACh6AAAAAAAABgAAAAMAAAAAAAAAAAAAADB6AAAAAAAABgAAAAQAAAAA"- "AAAAAAAAADh4AAAAAAAAAQAAAA0AAAAAAAAAAAAAADh6AAAAAAAABgAAAA4AAAAAAAAAAAAAAEB4AAAAAAAAAQAAAA8AAAAAAAAA"- "AAAAAEB6AAAAAAAABgAAABAAAAAAAAAAAAAAAICKAAAAAAAABwAAAAIAAAAAAAAAAAAAAIiKAAAAAAAABwAAAAMAAAAAAAAAAAAA"- "AJCKAAAAAAAABwAAAAQAAAAAAAAAAAAAAJiKAAAAAAAABwAAAAUAAAAAAAAAAAAAAKCKAAAAAAAABwAAAAYAAAAAAAAAAAAAAKiK"- "AAAAAAAABwAAAAcAAAAAAAAAAAAAALCKAAAAAAAABwAAAAgAAAAAAAAAAAAAALiKAAAAAAAABwAAAAkAAAAAAAAAAAAAAMCKAAAA"- "AAAABwAAAAoAAAAAAAAAAAAAAMiKAAAAAAAABwAAAAsAAAAAAAAAAAAAANCKAAAAAAAABwAAAAwAAAAAAAAAAAAAAGZ1c2VkX3F1"- "YW50X3NodWZmbGVfa2VybmVsAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAACgBAAASAAAAAAAAAAAAAAAAAAAAAAAAAGMBAAASAAAAAAAAAAAAAAAAAAAAAAAAAGoBAAASAAAAAAAAAAAAAAAA"+ "AAAAAAAAAIABAAASAAAAAAAAAAAAAAAAAAAAAAAAAIkBAAASAAAAAAAAAAAAAAAAAAAAAAAAAJcBAAASAAAAAAAAAAAAAAAAAAAA"+ "AAAAAKwBAAASAAAAAAAAAAAAAAAAAAAAAAAAAMMBAAASAAAAAAAAAAAAAAAAAAAAAAAAANkBAAASAAAAAAAAAAAAAAAAAAAAAAAA"+ "AA4CAAASAAAAAAAAAAAAAAAAAAAAAAAAAE0AAAASAAwAwGEAAAAAAAD0AAAAAAAAAOAAAAARABIAUH0AAAAAAAAIAAAAAAAAADgB"+ "AAASAAwAUGUAAAAAAACAAQAAAAAAAFMBAAASAAwA0GYAAAAAAAA2BAAAAAAAAI4AAAARABIASH0AAAAAAAAIAAAAAAAAALYAAAAS"+ "AAwAwGIAAAAAAADjAAAAAAAAAPsAAAASAAwAsGMAAAAAAACfAQAAAAAAAPIBAAARABkAiJAAAAAAAAABAAAAAAAAAAAAAQACAAMA"+ "AgAEAAQABAAEAAMABAADAAQABAAEAAQABAADAAEAAQABAAEAAQABAAEAAQABAAEAGwIAADAAAAAQAAAAAQABADQCAAAwAAAAEAAA"+ "AAEAAQBKAgAAMAAAAAAAAAByJwYPAAAEACwCAAAAAAAAUCZ5CwAAAgBCAgAAAAAAAHUaaQkAAAMAVAIAAAAAAAAAAAAAAgAAABIA"+ "AAACAAAAGgAAAAAAARdBICAAAAQEiAiAAAASAAAAFgAAABjq0mqQGTnWSg0wjiGYUnLunGtKGMKPm9odJXy1h9G0AF9fZ21vbl9z"+ "dGFydF9fAF9fcmVnaXN0ZXJfZnJhbWVfaW5mbwBfX2N4YV9maW5hbGl6ZQBfX2RlcmVnaXN0ZXJfZnJhbWVfaW5mbwBfX2Rldmlj"+ "ZV9zdHViX19mdXNlZF9teGZwNF9nZW1tX2tlcm5lbABfX2hpcFBvcENhbGxDb25maWd1cmF0aW9uAGZ1c2VkX214ZnA0X2dlbW1f"+ "a2VybmVsAGhpcExhdW5jaEtlcm5lbABfX2RldmljZV9zdHViX19mdXNlZF9xdWFudF9zaHVmZmxlX2tlcm5lbABmdXNlZF9xdWFu"+ "dF9zaHVmZmxlX2tlcm5lbABsYXVuY2hfZnVzZWRfZ2VtbQBfX2hpcFB1c2hDYWxsQ29uZmlndXJhdGlvbgBoaXBHZXRMYXN0RXJy"+ "b3IAbGF1bmNoX2Z1c2VkX3F1YW50X3NodWZmbGUAbGF1bmNoX2NvbWJpbmVkAG1lbXNldABoaXBNb2R1bGVMYXVuY2hLZXJuZWwA"+ "c25wcmludGYAaGlwTW9kdWxlTG9hZABoaXBNb2R1bGVHZXRGdW5jdGlvbgBfX2hpcFJlZ2lzdGVyRmF0QmluYXJ5AF9faGlwUmVn"+ "aXN0ZXJGdW5jdGlvbgBfX2hpcFVucmVnaXN0ZXJGYXRCaW5hcnkAX19oaXBfY3VpZF81MDIzZGY0M2ZhYzhkYTU3AF9fY3hhX2F0"+ "ZXhpdABsaWJhbWRoaXA2NC5zby43AGhpcF80LjIAbGliZ2NjX3Muc28uMQBHQ0NfMy4wAGxpYmMuc28uNgBHTElCQ18yLjIuNQAv"+ "b3B0L3JvY20tNy4xLjAvbGliAGxpYnN0ZGMrKy5zby42AGxpYm0uc28uNgAAAAAwfQAAAAAAAAgAAAAAAAAAMGEAAAAAAAA4fQAA"+ "AAAAAAgAAAAAAAAAEGsAAAAAAABAfQAAAAAAAAgAAAAAAAAAcGEAAAAAAABYjwAAAAAAAAgAAAAAAAAAWI8AAAAAAABojwAAAAAA"+ "AAgAAAAAAAAAABAAAAAAAAAofwAAAAAAAAYAAAABAAAAAAAAAAAAAAAwfwAAAAAAAAYAAAACAAAAAAAAAAAAAAA4fwAAAAAAAAYA"+ "AAADAAAAAAAAAAAAAABAfwAAAAAAAAYAAAAEAAAAAAAAAAAAAABIfQAAAAAAAAEAAAASAAAAAAAAAAAAAABQfwAAAAAAAAYAAAAT"+ "AAAAAAAAAAAAAABIfwAAAAAAAAYAAAAWAAAAAAAAAAAAAABQfQAAAAAAAAEAAAAXAAAAAAAAAAAAAACQjwAAAAAAAAcAAAACAAAA"+ "AAAAAAAAAACYjwAAAAAAAAcAAAADAAAAAAAAAAAAAACgjwAAAAAAAAcAAAAEAAAAAAAAAAAAAACojwAAAAAAAAcAAAAFAAAAAAAA"+ "AAAAAACwjwAAAAAAAAcAAAAGAAAAAAAAAAAAAAC4jwAAAAAAAAcAAAAHAAAAAAAAAAAAAADAjwAAAAAAAAcAAAAIAAAAAAAAAAAA"+ "AADIjwAAAAAAAAcAAAAJAAAAAAAAAAAAAADQjwAAAAAAAAcAAAAKAAAAAAAAAAAAAADYjwAAAAAAAAcAAAALAAAAAAAAAAAAAADg"+ "jwAAAAAAAAcAAAAMAAAAAAAAAAAAAADojwAAAAAAAAcAAAANAAAAAAAAAAAAAADwjwAAAAAAAAcAAAAOAAAAAAAAAAAAAAD4jwAA"+ "AAAAAAcAAAAPAAAAAAAAAAAAAAAAkAAAAAAAAAcAAAAQAAAAAAAAAAAAAAAIkAAAAAAAAAcAAAARAAAAAAAAAAAAAABfWk41YWl0"+ "ZXI0MWY0Z2VtbV9iZjE2X3BlcjF4MzJGcDRfQnByZVNodWZmbGVfMzJ4MTI4RQAlc2Y0Z2VtbV9iZjE2X3BlcjF4MzJGcDRfQnBy"+ "ZVNodWZmbGVfMzJ4MTI4LmNvACVzZjRnZW1tX2JmMTZfcGVyMXgzMkZwNF9CcHJlU2h1ZmZsZV8xOTJ4MTI4LmNvAGZ1c2VkX3F1"+ "YW50X3NodWZmbGVfa2VybmVsAC9ob21lL3J1bm5lci9haXRlci9oc2EvZ2Z4OTUwL2Y0Z2VtbS8AX1pONWFpdGVyNDJmNGdlbW1f"+ "YmYxNl9wZXIxeDMyRnA0X0JwcmVTaHVmZmxlXzE5MngxMjhFAGZ1c2VkX214ZnA0X2dlbW1fa2VybmVsAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"⋯ 7 unchanged lines"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA""AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9fQ0xBTkdfT0ZGTE9BRF9CVU5ETEVfXwIAAAAA""AAAAABAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAaG9zdC14ODZfNjQtdW5rbm93bi1saW51eC1nbnUtABAAAAAAAACoLgAAAAAAAB8A""AAAAAAAAaGlwdjQtYW1kZ2NuLWFtZC1hbWRoc2EtLWdmeDk1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"⋯ 208 unchanged lines"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"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAABwIAAAAAAAABAAAAAAAAAMIBAAAAAAAAAQAAAAAAAAAbAgAAAAAAAAEA"- "AAAAAAAAKgIAAAAAAAABAAAAAAAAANsBAAAAAAAAAQAAAAAAAADxAQAAAAAAAAcAAAAAAAAAGAcAAAAAAAAIAAAAAAAAADgBAAAA"- "AAAACQAAAAAAAAAYAAAAAAAAAPn//28AAAAABQAAAAAAAAAXAAAAAAAAAFAIAAAAAAAAAgAAAAAAAAAIAQAAAAAAAAMAAAAAAAAA"- "aIoAAAAAAAAUAAAAAAAAAAcAAAAAAAAABgAAAAAAAAA4AgAAAAAAAAsAAAAAAAAAGAAAAAAAAAAFAAAAAAAAAOAEAAAAAAAACgAA"- "AAAAAAA0AgAAAAAAAPX+/28AAAAAoAQAAAAAAAAZAAAAAAAAACB4AAAAAAAAGwAAAAAAAAAQAAAAAAAAABoAAAAAAAAAMHgAAAAA"- "AAAcAAAAAAAAAAgAAAAAAAAADAAAAAAAAAA0ZwAAAAAAAA0AAAAAAAAAUGcAAAAAAADw//9vAAAAABgEAAAAAAAA/v//bwAAAABA"- "BAAAAAAAAP///28AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAABGUElIAQAAAAAAAAAAAAAAAAAAAAAAAABIeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2ZwAAAAAA"- "AIZnAAAAAAAAlmcAAAAAAACmZwAAAAAAALZnAAAAAAAAxmcAAAAAAADWZwAAAAAAAOZnAAAAAAAA9mcAAAAAAAAGaAAAAAAAABZo"- "AAAAAAAAAEFNRCBjbGFuZyB2ZXJzaW9uIDIwLjAuMGdpdCAoaHR0cHM6Ly9naXRodWIuY29tL1JhZGVvbk9wZW5Db21wdXRlL2xs"- "dm0tcHJvamVjdCByb2MtNy4xLjAgMjU0MjUgMWIwZWFkYTZiMGVlOTNlMmU2OTRjOGMxNDZkMjNmY2E5MGJjMTFjNSkATGlua2Vy"- "OiBBTUQgTExEIDIwLjAuMCAoL2xvbmdlcl9wYXRobmFtZV9zb190aGF0X3JwbXNfY2FuX3N1cHBvcnRfcGFja2FnaW5nX3RoZV9k"- "ZWJ1Z19pbmZvX2Zvcl9hbGxfb3NfcHJvZmlsZXMvc3JjL2xsdm0tcHJvamVjdC9sbHZtIDFiMGVhZGE2YjBlZTkzZTJlNjk0Yzhj"- "MTQ2ZDIzZmNhOTBiYzExYzUpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABADx/wAAAAAAAAAAAAAAAAAAAAAM"- "AAAAAgAMALBgAAAAAAAAOAAAAAAAAAAWAAAAAQAZANiKAAAAAAAAAQAAAAAAAAAuAAAAAQALAABPAAAAAAAAAAAAAAAAAABAAAAA"- "AQAZAOCKAAAAAAAAQAAAAAAAAABTAAAAAgAMAPBgAAAAAAAASgAAAAAAAABdAAAAAQAZACCLAAAAAAAAAQAAAAAAAABzAAAAAQAQ"- "ACB4AAAAAAAACAAAAAAAAAB6AAAAAQARADB4AAAAAAAACAAAAAAAAABOAQAAAQIWAEiKAAAAAAAACAAAAAAAAACBAAAABADx/wAA"- "AAAAAAAAAAAAAAAAAACRAAAAAgAMAFBmAAAAAAAAlAAAAAAAAACjAAAAAQAZACiLAAAAAAAACAAAAAAAAADIAAAAAQAXAFCKAAAA"- "AAAAGAAAAAAAAADdAAAAAgAMAPBmAAAAAAAAIgAAAAAAAADvAAAABADx/wAAAAAAAAAAAAAAAAAAAADvAgAAAQILAABPAAAAAAAA"- "BAAAAAAAAAAHAQAAAgINADRnAAAAAAAAAAAAAAAAAAAjAQAAAgIOAFBnAAAAAAAAAAAAAAAAAAANAQAAAAIYAGiKAAAAAAAAAAAA"- "AAAAAAAFAwAAAAITAEh4AAAAAAAAAAAAAAAAAACmAgAAAgIMACBnAAAAAAAAEgAAAAAAAAD4AAAAIAAAAAAAAAAAAAAAAAAAAAAA"- "AAApAQAAIgAAAAAAAAAAAAAAAAAAAAAAAAA/AQAAIgAAAAAAAAAAAAAAAAAAAAAAAABbAQAAIgAAAAAAAAAAAAAAAAAAAAAAAABz"- "AQAAEgAMAEBhAAAAAAAA9AAAAAAAAACaAQAAEgAAAAAAAAAAAAAAAAAAAAAAAAC0AQAAEQASADh4AAAAAAAACAAAAAAAAADMAQAA"- "EgAAAAAAAAAAAAAAAAAAAAAAAADcAQAAEgAMAEBiAAAAAAAA4wAAAAAAAAAGAgAAEQASAEB4AAAAAAAACAAAAAAAAAAhAgAAEgAM"- "ADBjAAAAAAAAnwEAAAAAAAAzAgAAEgAAAAAAAAAAAAAAAAAAAAAAAABOAgAAEgAAAAAAAAAAAAAAAAAAAAAAAABeAgAAEgAMANBk"- "AAAAAAAAgAEAAAAAAAB5AgAAEgAAAAAAAAAAAAAAAAAAAAAAAACQAgAAEgAAAAAAAAAAAAAAAAAAAAAAAACtAgAAEgAAAAAAAAAA"- "AAAAAAAAAAAAAADGAgAAEQAZADCLAAAAAAAAAQAAAAAAAADiAgAAEgAAAAAAAAAAAAAAAAAAAAAAAAAALmR5bnN5bQAuZ251LnZl"- "cnNpb24ALmdudS52ZXJzaW9uX3IALmdudS5oYXNoAC5keW5zdHIALnJlbGEuZHluAC5yZWxhLnBsdAAucm9kYXRhAC5oaXBfZmF0"- "YmluAC5laF9mcmFtZV9oZHIALmVoX2ZyYW1lAC50ZXh0AC5pbml0AC5maW5pAC5wbHQALmluaXRfYXJyYXkALmZpbmlfYXJyYXkA"- "LmRhdGEucmVsLnJvAC5keW5hbWljAC5nb3QALnJlbHJvX3BhZGRpbmcALmRhdGEALmhpcEZhdEJpblNlZ21lbnQALmdvdC5wbHQA"- "LmJzcwAuY29tbWVudAAuc3ltdGFiAC5zaHN0cnRhYgAuc3RydGFiAABjcnRiZWdpbi5jAF9fZG9faW5pdABfX2RvX2luaXQuX19p"- "bml0aWFsaXplZABfX0VIX0ZSQU1FX0xJU1RfXwBfX2RvX2luaXQuX19vYmplY3QAX19kb19maW5pAF9fZG9fZmluaS5fX2ZpbmFs"- "aXplZABfX2luaXQAX19maW5pAG14ZnA0X2Z1c2VkLmhpcABfX2hpcF9tb2R1bGVfY3RvcgBfX2hpcF9ncHViaW5faGFuZGxlXzUw"- "MjNkZjQzZmFjOGRhNTcAX19oaXBfZmF0YmluX3dyYXBwZXIAX19oaXBfbW9kdWxlX2R0b3IAY3J0ZW5kLmMAX19nbW9uX3N0YXJ0"- "X18AX2luaXQAX0dMT0JBTF9PRkZTRVRfVEFCTEVfAF9maW5pAF9fcmVnaXN0ZXJfZnJhbWVfaW5mbwBfX2N4YV9maW5hbGl6ZQBf"- "X2Rzb19oYW5kbGUAX19kZXJlZ2lzdGVyX2ZyYW1lX2luZm8AX19kZXZpY2Vfc3R1Yl9fZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwA"- "X19oaXBQb3BDYWxsQ29uZmlndXJhdGlvbgBmdXNlZF9teGZwNF9nZW1tX2tlcm5lbABoaXBMYXVuY2hLZXJuZWwAX19kZXZpY2Vf"- "c3R1Yl9fZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwAZnVzZWRfcXVhbnRfc2h1ZmZsZV9rZXJuZWwAbGF1bmNoX2Z1c2VkX2dl"- "bW0AX19oaXBQdXNoQ2FsbENvbmZpZ3VyYXRpb24AaGlwR2V0TGFzdEVycm9yAGxhdW5jaF9mdXNlZF9xdWFudF9zaHVmZmxlAF9f"- "aGlwUmVnaXN0ZXJGYXRCaW5hcnkAX19oaXBSZWdpc3RlckZ1bmN0aW9uAGF0ZXhpdABfX2hpcFVucmVnaXN0ZXJGYXRCaW5hcnkA"- "X19oaXBfY3VpZF81MDIzZGY0M2ZhYzhkYTU3AF9fY3hhX2F0ZXhpdABfX0VIX0ZSQU1FX0xJU1RfRU5EX18AX0RZTkFNSUMAAAAA"- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACwAAAAIAAAAA"- "AAAAOAIAAAAAAAA4AgAAAAAAAOABAAAAAAAABQAAAAEAAAAIAAAAAAAAABgAAAAAAAAACQAAAP///28CAAAAAAAAABgEAAAAAAAA"- "GAQAAAAAAAAoAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAACAAAAAAAAABYAAAD+//9vAgAAAAAAAABABAAAAAAAAEAEAAAAAAAAYAAA"- "AAAAAAAFAAAAAwAAAAQAAAAAAAAAAAAAAAAAAAAlAAAA9v//bwIAAAAAAAAAoAQAAAAAAACgBAAAAAAAAEAAAAAAAAAAAQAAAAAA"- "AAAIAAAAAAAAAAAAAAAAAAAALwAAAAMAAAACAAAAAAAAAOAEAAAAAAAA4AQAAAAAAAA0AgAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA"- "AAAAAAAAADcAAAAEAAAAAgAAAAAAAAAYBwAAAAAAABgHAAAAAAAAOAEAAAAAAAABAAAAAAAAAAgAAAAAAAAAGAAAAAAAAABBAAAA"- "BAAAAEIAAAAAAAAAUAgAAAAAAABQCAAAAAAAAAgBAAAAAAAAAQAAABgAAAAIAAAAAAAAABgAAAAAAAAASwAAAAEAAAAyAAAAAAAA"- "AFgJAAAAAAAAWAkAAAAAAAAzAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAFMAAAABAAAAAgAAAAAAAAAAEAAAAAAAAAAQ"- "AAAAAAAAqD4AAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAABfAAAAAQAAAAIAAAAAAAAAqE4AAAAAAACoTgAAAAAAAFQAAAAA"- "AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAbQAAAAEAAAACAAAAAAAAAABPAAAAAAAAAE8AAAAAAACkAQAAAAAAAAAAAAAAAAAA"- "CAAAAAAAAAAAAAAAAAAAAHcAAAABAAAABgAAAAAAAACwYAAAAAAAALBQAAAAAAAAhAYAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAA"- "AAAAAAB9AAAAAQAAAAYAAAAAAAAANGcAAAAAAAA0VwAAAAAAABsAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAgwAAAAEA"- "AAAGAAAAAAAAAFBnAAAAAAAAUFcAAAAAAAANAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAIkAAAABAAAABgAAAAAAAABg"- "ZwAAAAAAAGBXAAAAAAAAwAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACOAAAADgAAAAMAAAAAAAAAIHgAAAAAAAAgWAAA"- "AAAAABAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAmgAAAA8AAAADAAAAAAAAADB4AAAAAAAAMFgAAAAAAAAIAAAAAAAA"- "AAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAKYAAAABAAAAAwAAAAAAAAA4eAAAAAAAADhYAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAgA"- "AAAAAAAAAAAAAAAAAACzAAAABgAAAAMAAAAAAAAASHgAAAAAAABIWAAAAAAAANABAAAAAAAABQAAAAAAAAAIAAAAAAAAABAAAAAA"- "AAAAvAAAAAEAAAADAAAAAAAAABh6AAAAAAAAGFoAAAAAAAAwAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAMEAAAAIAAAA"- "AwAAAAAAAABIegAAAAAAAEhaAAAAAAAAuAUAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAADQAAAAAQAAAAMAAAAAAAAASIoA"- "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"+ "AAAAAACAAQAAAAAAAAMAAAAAAAAAeI8AAAAAAAAUAAAAAAAAAAcAAAAAAAAABgAAAAAAAAA4AgAAAAAAAAsAAAAAAAAAGAAAAAAA"+ "AAAFAAAAAAAAAIgFAAAAAAAACgAAAAAAAACNAgAAAAAAAPX+/28AAAAAQAUAAAAAAAAZAAAAAAAAADB9AAAAAAAAGwAAAAAAAAAQ"+ "AAAAAAAAABoAAAAAAAAAQH0AAAAAAAAcAAAAAAAAAAgAAAAAAAAADAAAAAAAAAD0awAAAAAAAA0AAAAAAAAAEGwAAAAAAADw//9v"+ "AAAAAKgEAAAAAAAA/v//bwAAAADcBAAAAAAAAP///28AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGUElIAQAAAAAAAAAAAAAAAAAAAAAAAABYfQAAAAAAAAAA"+ "AAAAAAAAAAAAAAAAAAA2bAAAAAAAAEZsAAAAAAAAVmwAAAAAAABmbAAAAAAAAHZsAAAAAAAAhmwAAAAAAACWbAAAAAAAAKZsAAAA"+ "AAAAtmwAAAAAAADGbAAAAAAAANZsAAAAAAAA5mwAAAAAAAD2bAAAAAAAAAZtAAAAAAAAFm0AAAAAAAAmbQAAAAAAAABBTUQgY2xh"+ "bmcgdmVyc2lvbiAyMC4wLjBnaXQgKGh0dHBzOi8vZ2l0aHViLmNvbS9SYWRlb25PcGVuQ29tcHV0ZS9sbHZtLXByb2plY3Qgcm9j"+ "LTcuMS4wIDI1NDI1IDFiMGVhZGE2YjBlZTkzZTJlNjk0YzhjMTQ2ZDIzZmNhOTBiYzExYzUpAExpbmtlcjogQU1EIExMRCAyMC4w"+ "LjAgKC9sb25nZXJfcGF0aG5hbWVfc29fdGhhdF9ycG1zX2Nhbl9zdXBwb3J0X3BhY2thZ2luZ190aGVfZGVidWdfaW5mb19mb3Jf"+ "YWxsX29zX3Byb2ZpbGVzL3NyYy9sbHZtLXByb2plY3QvbGx2bSAxYjBlYWRhNmIwZWU5M2UyZTY5NGM4YzE0NmQyM2ZjYTkwYmMx"+ "MWM1KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQA8f8AAAAAAAAAAAAAAAAAAAAADAAAAAIADAAwYQAAAAAA"+ "ADgAAAAAAAAAFgAAAAEAGQAQkAAAAAAAAAEAAAAAAAAALgAAAAEACwAITwAAAAAAAAAAAAAAAAAAQAAAAAEAGQAYkAAAAAAAAEAA"+ "AAAAAAAAUwAAAAIADABwYQAAAAAAAEoAAAAAAAAAXQAAAAEAGQBYkAAAAAAAAAEAAAAAAAAAcwAAAAEAEAAwfQAAAAAAAAgAAAAA"+ "AAAAegAAAAEAEQBAfQAAAAAAAAgAAAAAAAAAfgEAAAECFgBYjwAAAAAAAAgAAAAAAAAAgQAAAAQA8f8AAAAAAAAAAAAAAAAAAAAA"+ "kQAAAAEAGQBgkAAAAAAAAAgAAAAAAAAAnAAAAAEAGQBokAAAAAAAAAgAAAAAAAAAqAAAAAEAGQBwkAAAAAAAAAgAAAAAAAAAtAAA"+ "AAEAGQB4kAAAAAAAAAgAAAAAAAAAwQAAAAIADAAQawAAAAAAAJQAAAAAAAAA0wAAAAEAGQCAkAAAAAAAAAgAAAAAAAAA+AAAAAEA"+ "FwBgjwAAAAAAABgAAAAAAAAADQEAAAIADACwawAAAAAAACIAAAAAAAAAHwEAAAQA8f8AAAAAAAAAAAAAAAAAAAAAeAMAAAECCwAI"+ "TwAAAAAAAAQAAAAAAAAANwEAAAICDQD0awAAAAAAAAAAAAAAAAAAUwEAAAICDgAQbAAAAAAAAAAAAAAAAAAAPQEAAAACGAB4jwAA"+ "AAAAAAAAAAAAAAAAjgMAAAACEwBYfQAAAAAAAAAAAAAAAAAALwMAAAICDADgawAAAAAAABIAAAAAAAAAKAEAACAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAWQEAACIAAAAAAAAAAAAAAAAAAAAAAAAAbwEAACIAAAAAAAAAAAAAAAAAAAAAAAAAiwEAACIAAAAAAAAAAAAAAAAA"+ "AAAAAAAAowEAABIADADAYQAAAAAAAPQAAAAAAAAAygEAABIAAAAAAAAAAAAAAAAAAAAAAAAA5AEAABEAEgBIfQAAAAAAAAgAAAAA"+ "AAAA/AEAABIAAAAAAAAAAAAAAAAAAAAAAAAADAIAABIADADAYgAAAAAAAOMAAAAAAAAANgIAABEAEgBQfQAAAAAAAAgAAAAAAAAA"+ "UQIAABIADACwYwAAAAAAAJ8BAAAAAAAAYwIAABIAAAAAAAAAAAAAAAAAAAAAAAAAfgIAABIAAAAAAAAAAAAAAAAAAAAAAAAAjgIA"+ "ABIADABQZQAAAAAAAIABAAAAAAAAqQIAABIADADQZgAAAAAAADYEAAAAAAAAuQIAABIAAAAAAAAAAAAAAAAAAAAAAAAAwAIAABIA"+ "AAAAAAAAAAAAAAAAAAAAAAAA1gIAABIAAAAAAAAAAAAAAAAAAAAAAAAA3wIAABIAAAAAAAAAAAAAAAAAAAAAAAAA7QIAABIAAAAA"+ "AAAAAAAAAAAAAAAAAAAAAgMAABIAAAAAAAAAAAAAAAAAAAAAAAAAGQMAABIAAAAAAAAAAAAAAAAAAAAAAAAANgMAABIAAAAAAAAA"+ "AAAAAAAAAAAAAAAATwMAABEAGQCIkAAAAAAAAAEAAAAAAAAAawMAABIAAAAAAAAAAAAAAAAAAAAAAAAAAC5keW5zeW0ALmdudS52"+ "ZXJzaW9uAC5nbnUudmVyc2lvbl9yAC5nbnUuaGFzaAAuZHluc3RyAC5yZWxhLmR5bgAucmVsYS5wbHQALnJvZGF0YQAuaGlwX2Zh"+ "dGJpbgAuZWhfZnJhbWVfaGRyAC5laF9mcmFtZQAudGV4dAAuaW5pdAAuZmluaQAucGx0AC5pbml0X2FycmF5AC5maW5pX2FycmF5"+ "AC5kYXRhLnJlbC5ybwAuZHluYW1pYwAuZ290AC5yZWxyb19wYWRkaW5nAC5kYXRhAC5oaXBGYXRCaW5TZWdtZW50AC5nb3QucGx0"+ "AC5ic3MALmNvbW1lbnQALnN5bXRhYgAuc2hzdHJ0YWIALnN0cnRhYgAAY3J0YmVnaW4uYwBfX2RvX2luaXQAX19kb19pbml0Ll9f"+ "aW5pdGlhbGl6ZWQAX19FSF9GUkFNRV9MSVNUX18AX19kb19pbml0Ll9fb2JqZWN0AF9fZG9fZmluaQBfX2RvX2ZpbmkuX19maW5h"+ "bGl6ZWQAX19pbml0AF9fZmluaQBteGZwNF9mdXNlZC5oaXAAX1pMNnNfZm4zMgBfWkw3c19mbjE5MgBfWkw3c19tb2QzMgBfWkw4"+ "c19tb2QxOTIAX19oaXBfbW9kdWxlX2N0b3IAX19oaXBfZ3B1YmluX2hhbmRsZV81MDIzZGY0M2ZhYzhkYTU3AF9faGlwX2ZhdGJp"+ "bl93cmFwcGVyAF9faGlwX21vZHVsZV9kdG9yAGNydGVuZC5jAF9fZ21vbl9zdGFydF9fAF9pbml0AF9HTE9CQUxfT0ZGU0VUX1RB"+ "QkxFXwBfZmluaQBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8AX19jeGFfZmluYWxpemUAX19kc29faGFuZGxlAF9fZGVyZWdpc3Rlcl9m"+ "cmFtZV9pbmZvAF9fZGV2aWNlX3N0dWJfX2Z1c2VkX214ZnA0X2dlbW1fa2VybmVsAF9faGlwUG9wQ2FsbENvbmZpZ3VyYXRpb24A"+ "ZnVzZWRfbXhmcDRfZ2VtbV9rZXJuZWwAaGlwTGF1bmNoS2VybmVsAF9fZGV2aWNlX3N0dWJfX2Z1c2VkX3F1YW50X3NodWZmbGVf"+ "a2VybmVsAGZ1c2VkX3F1YW50X3NodWZmbGVfa2VybmVsAGxhdW5jaF9mdXNlZF9nZW1tAF9faGlwUHVzaENhbGxDb25maWd1cmF0"+ "aW9uAGhpcEdldExhc3RFcnJvcgBsYXVuY2hfZnVzZWRfcXVhbnRfc2h1ZmZsZQBsYXVuY2hfY29tYmluZWQAbWVtc2V0AGhpcE1v"+ "ZHVsZUxhdW5jaEtlcm5lbABzbnByaW50ZgBoaXBNb2R1bGVMb2FkAGhpcE1vZHVsZUdldEZ1bmN0aW9uAF9faGlwUmVnaXN0ZXJG"+ "YXRCaW5hcnkAX19oaXBSZWdpc3RlckZ1bmN0aW9uAGF0ZXhpdABfX2hpcFVucmVnaXN0ZXJGYXRCaW5hcnkAX19oaXBfY3VpZF81"+ "MDIzZGY0M2ZhYzhkYTU3AF9fY3hhX2F0ZXhpdABfX0VIX0ZSQU1FX0xJU1RfRU5EX18AX0RZTkFNSUMAAAAAAAAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALAAAAAgAAAAAAAAA4AgAAAAAAADgC"+ "AAAAAAAAcAIAAAAAAAAFAAAAAQAAAAgAAAAAAAAAGAAAAAAAAAAJAAAA////bwIAAAAAAAAAqAQAAAAAAACoBAAAAAAAADQAAAAA"+ "AAAAAQAAAAAAAAACAAAAAAAAAAIAAAAAAAAAFgAAAP7//28CAAAAAAAAANwEAAAAAAAA3AQAAAAAAABgAAAAAAAAAAUAAAADAAAA"+ "BAAAAAAAAAAAAAAAAAAAACUAAAD2//9vAgAAAAAAAABABQAAAAAAAEAFAAAAAAAASAAAAAAAAAABAAAAAAAAAAgAAAAAAAAAAAAA"+ "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")- # ---- Load library ----def _load():try:so = base64.b64decode(_SO_B64)⋯ 3 unchanged lineslib = ctypes.cdll.LoadLibrary(p)# Fused GEMMlib.launch_fused_gemm.restype = ctypes.c_int- lib.launch_fused_gemm.argtypes = [- ctypes.c_void_p]*4 + [ctypes.c_int]*6 + [ctypes.c_void_p]- # Fused quant+shuffle- lib.launch_fused_quant_shuffle.restype = ctypes.c_int- lib.launch_fused_quant_shuffle.argtypes = [- ctypes.c_void_p]*3 + [ctypes.c_int]*6 + [ctypes.c_void_p]+ lib.launch_fused_gemm.argtypes = [ctypes.c_void_p]*4 + [ctypes.c_int]*6 + [ctypes.c_void_p]+ # Combined quant + ASM gemm+ lib.launch_combined.restype = ctypes.c_int+ lib.launch_combined.argtypes = (+ [ctypes.c_void_p]*3 + # A_bf16, Aq_out, As_out+ [ctypes.c_int]*6 + # m, k, m_pad_q, ks_pad, stride_a, stride_aq+ [ctypes.c_void_p]*3 + # B_shuffle, B_scale_sh, C_out+ [ctypes.c_int]*5 + # N, stride_bsh, stride_bsc, m_pad_gemm, log2_ksplit+ [ctypes.c_void_p] # null+ )return libexcept: return None_lib = _load()+ _out = {}+ _qs = {}- # ---- Caches ----- _out_cache = {}- _qs_cache = {}-def _fused_gemm(A, B_q, B_sc, m, n, k):- """Single launch: quant A + GEMM → C. Best for small K."""B_q_u8 = B_q.view(torch.uint8)B_sc_u8 = B_sc.contiguous().view(torch.uint8)- ks_pad = ((k//32+7)//8)*8+ ksp = ((k//32+7)//8)*8key = (m,n)- if key not in _out_cache:- _out_cache[key] = torch.empty((m,n), dtype=torch.bfloat16, device='cuda')- C = _out_cache[key]+ if key not in _out: _out[key] = torch.empty((m,n), dtype=torch.bfloat16, device='cuda')+ C = _out[key]_lib.launch_fused_gemm(ctypes.c_void_p(A.data_ptr()), ctypes.c_void_p(B_q_u8.data_ptr()),ctypes.c_void_p(B_sc_u8.data_ptr()), ctypes.c_void_p(C.data_ptr()),ctypes.c_int(m), ctypes.c_int(n), ctypes.c_int(k),ctypes.c_int(A.stride(0)), ctypes.c_int(B_q_u8.stride(0)),- ctypes.c_int(ks_pad), ctypes.c_void_p(0))+ ctypes.c_int(ksp), ctypes.c_void_p(0))return C- def _hip_quant_shuffle(A, m, k):- """HIP quant+shuffle → (A_q, A_scale_sh). For large K path."""+ def _choose_log2_ksplit(m, n, k):+ """Choose log2_k_split to maximize occupancy (256 CUs target)."""+ tile_M, tile_N = 32, 128+ m_pad = ((m + 31) // 32) * 32+ base_wgs = ((n + tile_N - 1) // tile_N) * ((m_pad + tile_M - 1) // tile_M)+ # Want at least 256 workgroups for full CU occupancy+ if base_wgs >= 256:+ return 0 # enough parallelism+ # Try increasing split-K+ for log2s in range(1, 6):+ if base_wgs * (1 << log2s) >= 256:+ return log2s+ return 5 # max split = 32++ def _combined(A, B_shuffle, B_scale_sh, m, n, k):+ B_sh_u8 = B_shuffle.view(torch.uint8)+ B_sc_u8 = B_scale_sh.contiguous().view(torch.uint8)ks = k//32- m_pad = ((m+255)//256)*256+ m_pad_q = ((m+255)//256)*256ks_pad = ((ks+7)//8)*8- key = (m_pad, k, ks_pad)- if key not in _qs_cache:- _qs_cache[key] = {- 'Aq': torch.zeros(m_pad, k//2, dtype=torch.uint8, device='cuda'),- 'As': torch.zeros(m_pad*ks_pad, dtype=torch.uint8, device='cuda'),+ m_pad_gemm = ((m+31)//32)*32++ log2_ks = 0 # explicit split-K is slower for all our shapes++ key = (m_pad_q, k, ks_pad, m_pad_gemm, n)+ if key not in _qs:+ _qs[key] = {+ 'Aq': torch.zeros(m_pad_q, k//2, dtype=torch.uint8, device='cuda'),+ 'As': torch.zeros(m_pad_q * ks_pad, dtype=torch.uint8, device='cuda'),+ 'C': torch.empty(m_pad_gemm, n, dtype=torch.bfloat16, device='cuda'),}- c = _qs_cache[key]- _lib.launch_fused_quant_shuffle(- ctypes.c_void_p(A.data_ptr()), ctypes.c_void_p(c['Aq'].data_ptr()),+ c = _qs[key]++ err = _lib.launch_combined(+ ctypes.c_void_p(A.data_ptr()),+ ctypes.c_void_p(c['Aq'].data_ptr()),ctypes.c_void_p(c['As'].data_ptr()),- ctypes.c_int(m), ctypes.c_int(k), ctypes.c_int(m_pad), ctypes.c_int(ks_pad),- ctypes.c_int(A.stride(0)), ctypes.c_int(c['Aq'].stride(0)),- ctypes.c_void_p(0))- return c['Aq'][:m].view(dtypes.fp4x2), c['As'].view(m_pad, ks_pad).view(dtypes.fp8_e8m0)+ ctypes.c_int(m), ctypes.c_int(k), ctypes.c_int(m_pad_q),+ ctypes.c_int(ks_pad), ctypes.c_int(A.stride(0)), ctypes.c_int(c['Aq'].stride(0)),+ ctypes.c_void_p(B_sh_u8.data_ptr()),+ ctypes.c_void_p(B_sc_u8.data_ptr()),+ ctypes.c_void_p(c['C'].data_ptr()),+ ctypes.c_int(n), ctypes.c_int(B_sh_u8.stride(0)), ctypes.c_int(B_sc_u8.stride(0)),+ ctypes.c_int(m_pad_gemm),+ ctypes.c_int(log2_ks),+ ctypes.c_void_p(0),+ )+ if err != 0:+ return None+ return c['C'][:m]- # ---- Fallback ----+ # Fallback_a_cache = None- def _fallback_quant(A):+ def _fallback(data):global _a_cache- if _a_cache is not None and _a_cache[0] is A:- return _a_cache[1], _a_cache[2]+ A, B, B_q, B_shuffle, B_scale_sh = data+ if _a_cache is not None and _a_cache[0] is A: return _a_cache[1], _a_cache[2]Aq, As = dynamic_mxfp4_quant(A)- Ash = e8m0_shuffle(As)- r = (Aq.view(dtypes.fp4x2), Ash.view(dtypes.fp8_e8m0))- _a_cache = (A, r[0], r[1])- return r+ Ash = e8m0_shuffle(As).view(dtypes.fp8_e8m0)+ Aq = Aq.view(dtypes.fp4x2)+ _a_cache = (A, Aq, Ash)+ return Aq, Ash- # ---- Entry ----+ _combined_ok = None+def custom_kernel(data: input_t) -> output_t:+ global _combined_okA, B, B_q, B_shuffle, B_scale_sh = datam, k = A.shapen = B_q.shape[0]if _lib is not None and k <= 1024:- # Small K: fused single-launch kernelreturn _fused_gemm(A, B_q, B_scale_sh, m, n, k)- if _lib is not None:- # Large K: HIP quant+shuffle + ASM GEMM (2 launches)- Aq, Ash = _hip_quant_shuffle(A, m, k)- else:- # Fallback: Python quant+shuffle- Aq, Ash = _fallback_quant(A)+ if _lib is not None and _combined_ok is not False:+ try:+ result = _combined(A, B_shuffle, B_scale_sh, m, n, k)+ if result is not None:+ _combined_ok = True+ return result+ except Exception as e:+ import sys+ print(f"COMBINED_FAIL: {e}", file=sys.stderr)+ _combined_ok = False+ # Fallback: Python quant + aiter gemm+ Aq, Ash = _fallback(data)return aiter.gemm_a4w4(Aq, B_shuffle, Ash, B_scale_sh, dtype=dtypes.bf16, bpreshuffle=True)
scrolls · 510 diff lines total
Best evidence level for this revision: reported
JSON