From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: [PATCH 03/10] drm/msm/gpu: Capture the state of the GPU Date: Thu, 5 Apr 2018 16:00:49 -0600 Message-ID: <20180405220056.29423-4-jcrouse@codeaurora.org> References: <20180405220056.29423-1-jcrouse@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180405220056.29423-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org QWRkIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBjYXB0dXJlIHRoZSBzdGF0ZSBjdXJyZW50IHN0YXRl IG9mIHRoZQpHUFUgYW5kIHN0b3JlIGl0IGluIG1lbW9yeS4gVGhpcyBpcyB1c2VmdWwgZm9yIHN0 b3JpbmcgdGhlIHN0YXRlCm9mIGEgaHVuZyBHUFUgc28gaXQgY2FuIGJlIGR1bXBlZCBsYXRlci4K CkZvciBub3cgZ3JhYiB0aGUgc2FtZSBiYXNpYyByaW5nYnVmZmVyIGluZm9ybWF0aW9uIGFuZCBy ZWdpc3RlcnMKdGhhdCBhcmUgcHJvdmlkZWQgYnkgdGhlIGRlYnVnZnMgJ2dwdScgbm9kZSBidXQg b2J2aW91c2x5IHRoaXMgY2FuCmJlIGV4dGVuZGVkIHRvIGNhcHR1cmUgYSBtdWNoIGxhcmdlciBz ZXQgb2YgR1BVIGluZm9ybWF0aW9uLgoKU2lnbmVkLW9mZi1ieTogSm9yZGFuIENyb3VzZSA8amNy b3VzZUBjb2RlYXVyb3JhLm9yZz4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4 X2dwdS5jICAgfCAxNSArKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E0eHhf Z3B1LmMgICB8IDE0ICsrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTV4eF9n cHUuYyAgIHwgMjIgKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2Fk cmVub19ncHUuYyB8IDU0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oIHwgIDMgKysKIGRyaXZlcnMvZ3B1L2Ry bS9tc20vbXNtX2dwdS5oICAgICAgICAgICB8IDE5ICsrKysrKysrKysrKwogNiBmaWxlcyBjaGFu Z2VkLCAxMjcgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20v YWRyZW5vL2EzeHhfZ3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5j CmluZGV4IDNlYmJlYjNhOWI2OC4uYjcwN2I1YmNhOWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vbXNtL2FkcmVuby9hM3h4X2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRy ZW5vL2EzeHhfZ3B1LmMKQEAgLTQyNyw2ICs0MjcsMTkgQEAgc3RhdGljIHZvaWQgYTN4eF9kdW1w KHN0cnVjdCBtc21fZ3B1ICpncHUpCiAJCQlncHVfcmVhZChncHUsIFJFR19BM1hYX1JCQk1fU1RB VFVTKSk7CiAJYWRyZW5vX2R1bXAoZ3B1KTsKIH0KKworc3RhdGljIHN0cnVjdCBtc21fZ3B1X3N0 YXRlICphM3h4X2dwdV9zdGF0ZV9nZXQoc3RydWN0IG1zbV9ncHUgKmdwdSkKK3sKKwlzdHJ1Y3Qg bXNtX2dwdV9zdGF0ZSAqc3RhdGUgPSBhZHJlbm9fZ3B1X3N0YXRlX2dldChncHUpOworCisJaWYg KElTX0VSUihzdGF0ZSkpCisJCXJldHVybiBzdGF0ZTsKKworCXN0YXRlLT5yYmJtX3N0YXR1cyA9 IGdwdV9yZWFkKGdwdSwgUkVHX0EzWFhfUkJCTV9TVEFUVVMpOworCisJcmV0dXJuIHN0YXRlOwor fQorCiAvKiBSZWdpc3RlciBvZmZzZXQgZGVmaW5lcyBmb3IgQTNYWCAqLwogc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGludCBhM3h4X3JlZ2lzdGVyX29mZnNldHNbUkVHX0FEUkVOT19SRUdJU1RFUl9N QVhdID0gewogCVJFR19BRFJFTk9fREVGSU5FKFJFR19BRFJFTk9fQ1BfUkJfQkFTRSwgUkVHX0FY WFhfQ1BfUkJfQkFTRSksCkBAIC00NTMsNiArNDY2LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBh ZHJlbm9fZ3B1X2Z1bmNzIGZ1bmNzID0gewogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCQkuc2hv dyA9IGEzeHhfc2hvdywKICNlbmRpZgorCQkuZ3B1X3N0YXRlX2dldCA9IGEzeHhfZ3B1X3N0YXRl X2dldCwKKwkJLmdwdV9zdGF0ZV9wdXQgPSBhZHJlbm9fZ3B1X3N0YXRlX3B1dCwKIAl9LAogfTsK IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTR4eF9ncHUuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E0eHhfZ3B1LmMKaW5kZXggMTZkM2Q1OTY2MzhlLi4x N2U5N2ViYzEwNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2E0eHhf Z3B1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTR4eF9ncHUuYwpAQCAtNDY1 LDYgKzQ2NSwxOCBAQCBzdGF0aWMgdm9pZCBhNHh4X3Nob3coc3RydWN0IG1zbV9ncHUgKmdwdSwg c3RydWN0IHNlcV9maWxlICptKQogfQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwdV9z dGF0ZSAqYTR4eF9ncHVfc3RhdGVfZ2V0KHN0cnVjdCBtc21fZ3B1ICpncHUpCit7CisJc3RydWN0 IG1zbV9ncHVfc3RhdGUgKnN0YXRlID0gYWRyZW5vX2dwdV9zdGF0ZV9nZXQoZ3B1KTsKKworCWlm IChJU19FUlIoc3RhdGUpKQorCQlyZXR1cm4gc3RhdGU7CisKKwlzdGF0ZS0+cmJibV9zdGF0dXMg PSBncHVfcmVhZChncHUsIFJFR19BNFhYX1JCQk1fU1RBVFVTKTsKKworCXJldHVybiBzdGF0ZTsK K30KKwogLyogUmVnaXN0ZXIgb2Zmc2V0IGRlZmluZXMgZm9yIEE0WFgsIGluIG9yZGVyIG9mIGVu dW0gYWRyZW5vX3JlZ3MgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYTR4eF9yZWdpc3Rl cl9vZmZzZXRzW1JFR19BRFJFTk9fUkVHSVNURVJfTUFYXSA9IHsKIAlSRUdfQURSRU5PX0RFRklO RShSRUdfQURSRU5PX0NQX1JCX0JBU0UsIFJFR19BNFhYX0NQX1JCX0JBU0UpLApAQCAtNTQxLDYg KzU1Myw4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRyZW5vX2dwdV9mdW5jcyBmdW5jcyA9IHsK ICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAkJLnNob3cgPSBhNHh4X3Nob3csCiAjZW5kaWYKKwkJ LmdwdV9zdGF0ZV9nZXQgPSBhNHh4X2dwdV9zdGF0ZV9nZXQsCisJCS5ncHVfc3RhdGVfcHV0ID0g YWRyZW5vX2dwdV9zdGF0ZV9wdXQsCiAJfSwKIAkuZ2V0X3RpbWVzdGFtcCA9IGE0eHhfZ2V0X3Rp bWVzdGFtcCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNXh4 X2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYTV4eF9ncHUuYwppbmRleCBhNGY2 OGFmZmMxM2IuLjA4ZjI1Nzk4YWJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9h ZHJlbm8vYTV4eF9ncHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hNXh4X2dw dS5jCkBAIC0xMTk1LDYgKzExOTUsMjYgQEAgc3RhdGljIGludCBhNXh4X2dldF90aW1lc3RhbXAo c3RydWN0IG1zbV9ncHUgKmdwdSwgdWludDY0X3QgKnZhbHVlKQogCXJldHVybiAwOwogfQogCitz dGF0aWMgc3RydWN0IG1zbV9ncHVfc3RhdGUgKmE1eHhfZ3B1X3N0YXRlX2dldChzdHJ1Y3QgbXNt X2dwdSAqZ3B1KQoreworCXN0cnVjdCBtc21fZ3B1X3N0YXRlICpzdGF0ZTsKKworCS8qCisJICog VGVtcG9yYXJpbHkgZGlzYWJsZSBoYXJkd2FyZSBjbG9jayBnYXRpbmcgYmVmb3JlIGdvaW5nIGlu dG8KKwkgKiBhZHJlbm9fc2hvdyB0byBhdm9pZCBpc3N1ZXMgd2hpbGUgcmVhZGluZyB0aGUgcmVn aXN0ZXJzCisJICovCisJYTV4eF9zZXRfaHdjZyhncHUsIGZhbHNlKTsKKworCXN0YXRlID0gYWRy ZW5vX2dwdV9zdGF0ZV9nZXQoZ3B1KTsKKworCWlmICghSVNfRVJSKHN0YXRlKSkKKwkJc3RhdGUt PnJiYm1fc3RhdHVzID0gZ3B1X3JlYWQoZ3B1LCBSRUdfQTVYWF9SQkJNX1NUQVRVUyk7CisKKwlh NXh4X3NldF9od2NnKGdwdSwgdHJ1ZSk7CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKICNpZmRlZiBD T05GSUdfREVCVUdfRlMKIHN0YXRpYyB2b2lkIGE1eHhfc2hvdyhzdHJ1Y3QgbXNtX2dwdSAqZ3B1 LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CkBAIC0xMjQ0LDYgKzEyNjQsOCBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IGFkcmVub19ncHVfZnVuY3MgZnVuY3MgPSB7CiAJCS5kZWJ1Z2ZzX2luaXQgPSBh NXh4X2RlYnVnZnNfaW5pdCwKICNlbmRpZgogCQkuZ3B1X2J1c3kgPSBhNXh4X2dwdV9idXN5LAor CQkuZ3B1X3N0YXRlX2dldCA9IGE1eHhfZ3B1X3N0YXRlX2dldCwKKwkJLmdwdV9zdGF0ZV9wdXQg PSBhZHJlbm9fZ3B1X3N0YXRlX3B1dCwKIAl9LAogCS5nZXRfdGltZXN0YW1wID0gYTV4eF9nZXRf dGltZXN0YW1wLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2Fk cmVub19ncHUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYwppbmRl eCAxN2QwNTA2ZDA1OGMuLmIyY2NhZjI1NzY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJt L21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2FkcmVub19ncHUuYwpAQCAtMzY4LDYgKzM2OCw2MCBAQCBib29sIGFkcmVub19pZGxlKHN0cnVj dCBtc21fZ3B1ICpncHUsIHN0cnVjdCBtc21fcmluZ2J1ZmZlciAqcmluZykKIAlyZXR1cm4gZmFs c2U7CiB9CiAKK3N0cnVjdCBtc21fZ3B1X3N0YXRlICphZHJlbm9fZ3B1X3N0YXRlX2dldChzdHJ1 Y3QgbXNtX2dwdSAqZ3B1KQoreworCXN0cnVjdCBhZHJlbm9fZ3B1ICphZHJlbm9fZ3B1ID0gdG9f YWRyZW5vX2dwdShncHUpOworCXN0cnVjdCBtc21fZ3B1X3N0YXRlICpzdGF0ZTsKKwlpbnQgaSwg Y291bnQgPSAwOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWRvX2dldHRp bWVvZmRheSgmc3RhdGUtPnRpbWUpOworCisJZm9yIChpID0gMDsgaSA8IGdwdS0+bnJfcmluZ3M7 IGkrKykgeworCQlzdGF0ZS0+cmluZ1tpXS5mZW5jZSA9IGdwdS0+cmJbaV0tPm1lbXB0cnMtPmZl bmNlOworCQlzdGF0ZS0+cmluZ1tpXS5zZXFubyA9IGdwdS0+cmJbaV0tPnNlcW5vOworCQlzdGF0 ZS0+cmluZ1tpXS5ycHRyID0gZ2V0X3JwdHIoYWRyZW5vX2dwdSwgZ3B1LT5yYltpXSk7CisJCXN0 YXRlLT5yaW5nW2ldLndwdHIgPSBnZXRfd3B0cihncHUtPnJiW2ldKTsKKwl9CisKKwkvKiBDb3Vu dCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGFkcmVub19ncHUtPnJl Z2lzdGVyc1tpXSAhPSB+MDsgaSArPSAyKQorCQljb3VudCArPSBhZHJlbm9fZ3B1LT5yZWdpc3Rl cnNbaSArIDFdIC0KKwkJCWFkcmVub19ncHUtPnJlZ2lzdGVyc1tpXSArIDE7CisKKwlzdGF0ZS0+ cmVnaXN0ZXJzID0ga2NhbGxvYyhjb3VudCAqIDIsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsK KwlpZiAoc3RhdGUtPnJlZ2lzdGVycykgeworCQlpbnQgcG9zID0gMDsKKworCQlmb3IgKGkgPSAw OyBhZHJlbm9fZ3B1LT5yZWdpc3RlcnNbaV0gIT0gfjA7IGkgKz0gMikgeworCQkJdWludDMyX3Qg c3RhcnQgPSBhZHJlbm9fZ3B1LT5yZWdpc3RlcnNbaV07CisJCQl1aW50MzJfdCBlbmQgICA9IGFk cmVub19ncHUtPnJlZ2lzdGVyc1tpKzFdOworCQkJdWludDMyX3QgYWRkcjsKKworCQkJZm9yIChh ZGRyID0gc3RhcnQ7IGFkZHIgPD0gZW5kOyBhZGRyKyspIHsKKwkJCQlzdGF0ZS0+cmVnaXN0ZXJz W3BvcysrXSA9IGFkZHI7CisJCQkJc3RhdGUtPnJlZ2lzdGVyc1twb3MrK10gPSBncHVfcmVhZChn cHUsIGFkZHIpOworCQkJfQorCQl9CisKKwkJc3RhdGUtPm5yX3JlZ2lzdGVycyA9IGNvdW50Owor CX0KKworCXJldHVybiBzdGF0ZTsKK30KKwordm9pZCBhZHJlbm9fZ3B1X3N0YXRlX3B1dChzdHJ1 Y3QgbXNtX2dwdV9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKElTX0VSUl9PUl9OVUxMKHN0YXRlKSkK KwkJcmV0dXJuOworCisJa2ZyZWUoc3RhdGUtPnJlZ2lzdGVycyk7CisJa2ZyZWUoc3RhdGUpOwor fQorCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiB2b2lkIGFkcmVub19zaG93KHN0cnVjdCBtc21f Z3B1ICpncHUsIHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5v L2FkcmVub19ncHUuaAppbmRleCBkNmIwZTdiODEzZjQuLjBiZWIwNzhlYjY1OCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5oCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuaApAQCAtMjI4LDYgKzIyOCw5IEBAIGludCBh ZHJlbm9fZ3B1X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldiwKIHZvaWQgYWRyZW5vX2dwdV9jbGVhbnVwKHN0cnVjdCBhZHJlbm9fZ3B1ICpn cHUpOwogCiAKK3N0cnVjdCBtc21fZ3B1X3N0YXRlICphZHJlbm9fZ3B1X3N0YXRlX2dldChzdHJ1 Y3QgbXNtX2dwdSAqZ3B1KTsKK3ZvaWQgYWRyZW5vX2dwdV9zdGF0ZV9wdXQoc3RydWN0IG1zbV9n cHVfc3RhdGUgKnN0YXRlKTsKKwogLyogcmluZ2J1ZmZlciBoZWxwZXJzICh0aGUgcGFydHMgdGhh dCBhcmUgYWRyZW5vIHNwZWNpZmljKSAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9t c21fZ3B1LmgKaW5kZXggYjgyNDExNzkxNzVhLi40YmU3MmE2MTJiZWMgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9tc20vbXNtX2dwdS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNt X2dwdS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKIHN0cnVjdCBtc21fZ2VtX3N1Ym1pdDsKIHN0cnVj dCBtc21fZ3B1X3BlcmZjbnRyOworc3RydWN0IG1zbV9ncHVfc3RhdGU7CiAKIHN0cnVjdCBtc21f Z3B1X2NvbmZpZyB7CiAJY29uc3QgY2hhciAqaW9uYW1lOwpAQCAtNjksNiArNzAsOCBAQCBzdHJ1 Y3QgbXNtX2dwdV9mdW5jcyB7CiAJaW50ICgqZGVidWdmc19pbml0KShzdHJ1Y3QgbXNtX2dwdSAq Z3B1LCBzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CiAjZW5kaWYKIAlpbnQgKCpncHVfYnVzeSko c3RydWN0IG1zbV9ncHUgKmdwdSwgdWludDY0X3QgKnZhbHVlKTsKKwlzdHJ1Y3QgbXNtX2dwdV9z dGF0ZSAqKCpncHVfc3RhdGVfZ2V0KShzdHJ1Y3QgbXNtX2dwdSAqZ3B1KTsKKwl2b2lkICgqZ3B1 X3N0YXRlX3B1dCkoc3RydWN0IG1zbV9ncHVfc3RhdGUgKnN0YXRlKTsKIH07CiAKIHN0cnVjdCBt c21fZ3B1IHsKQEAgLTE3NSw2ICsxNzgsMjIgQEAgc3RydWN0IG1zbV9ncHVfc3VibWl0cXVldWUg ewogCXN0cnVjdCBrcmVmIHJlZjsKIH07CiAKK3N0cnVjdCBtc21fZ3B1X3N0YXRlIHsKKwlzdHJ1 Y3QgdGltZXZhbCB0aW1lOworCisJc3RydWN0IHsKKwkJdTMyIGZlbmNlOworCQl1MzIgc2Vxbm87 CisJCXUzMiBycHRyOworCQl1MzIgd3B0cjsKKwl9IHJpbmdbTVNNX0dQVV9NQVhfUklOR1NdOwor CisJaW50IG5yX3JlZ2lzdGVyczsKKwl1MzIgKnJlZ2lzdGVyczsKKworCXUzMiByYmJtX3N0YXR1 czsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBncHVfd3JpdGUoc3RydWN0IG1zbV9ncHUgKmdw dSwgdTMyIHJlZywgdTMyIGRhdGEpCiB7CiAJbXNtX3dyaXRlbChkYXRhLCBncHUtPm1taW8gKyAo cmVnIDw8IDIpKTsKLS0gCjIuMTYuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KRnJlZWRyZW5vIG1haWxpbmcgbGlzdApGcmVlZHJlbm9AbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZnJlZWRyZW5vCg==