From mboxrd@z Thu Jan 1 00:00:00 1970 From: John.C.Harrison@Intel.com Subject: [PATCH 07/39] drm/i915: Start of GPU scheduler Date: Mon, 23 Nov 2015 11:39:02 +0000 Message-ID: <1448278774-31376-8-git-send-email-John.C.Harrison@Intel.com> References: <1448278774-31376-1-git-send-email-John.C.Harrison@Intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id EFCD6721F8 for ; Mon, 23 Nov 2015 03:39:42 -0800 (PST) In-Reply-To: <1448278774-31376-1-git-send-email-John.C.Harrison@Intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-GFX@Lists.FreeDesktop.Org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogSm9obiBIYXJyaXNvbiA8Sm9obi5DLkhhcnJpc29uQEludGVsLmNvbT4KCkluaXRpYWwg Y3JlYXRpb24gb2Ygc2NoZWR1bGVyIHNvdXJjZSBmaWxlcy4gTm90ZSB0aGF0IHRoaXMgcGF0Y2gK aW1wbGVtZW50cyBtb3N0IG9mIHRoZSBzY2hlZHVsZXIgZnVuY3Rpb25hbGl0eSBidXQgZG9lcyBu b3QgaG9vayBpdCBpbgp0byB0aGUgZHJpdmVyIHlldC4gSXQgYWxzbyBsZWF2ZXMgdGhlIHNjaGVk dWxlciBjb2RlIGluICdwYXNzIHRocm91Z2gnCm1vZGUgc28gdGhhdCBldmVuIHdoZW4gaXQgaXMg aG9va2VkIGluLCBpdCB3aWxsIG5vdCBhY3R1YWxseSBkbyB2ZXJ5Cm11Y2guIFRoaXMgYWxsb3dz IHRoZSBob29rcyB0byBiZSBhZGRlZCBvbmUgYXQgYSB0aW1lIGluIGJ5dGUgc2l6ZQpjaHVua3Mg YW5kIG9ubHkgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIGZpbmFsbHkgZW5hYmxlZCBhdCB0aGUgZW5k IGRvZXMKYW55dGhpbmcgc3RhcnQgaGFwcGVuaW5nLgoKVGhlIGdlbmVyYWwgdGhlb3J5IG9mIG9w ZXJhdGlvbiBpcyB0aGF0IHdoZW4gYmF0Y2ggYnVmZmVycyBhcmUKc3VibWl0dGVkIHRvIHRoZSBk cml2ZXIsIHRoZSBleGVjYnVmZmVyKCkgY29kZSBhc3NpZ25zIGEgdW5pcXVlCnJlcXVlc3QgYW5k IHRoZW4gcGFja2FnZXMgdXAgYWxsIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBleGVjdXRl CnRoZSBiYXRjaCBidWZmZXIgYXQgYSBsYXRlciB0aW1lLiBUaGlzIHBhY2thZ2UgaXMgZ2l2ZW4g b3ZlciB0byB0aGUKc2NoZWR1bGVyIHdoaWNoIGFkZHMgaXQgdG8gYW4gaW50ZXJuYWwgbm9kZSBs aXN0LiBUaGUgc2NoZWR1bGVyIGFsc28Kc2NhbnMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhc3NvY2lh dGVkIHdpdGggdGhlIGJhdGNoIGJ1ZmZlciBhbmQKY29tcGFyZXMgdGhlbSBhZ2FpbnN0IHRoZSBv YmplY3RzIGFscmVhZHkgaW4gdXNlIGJ5IG90aGVyIGJ1ZmZlcnMgaW4KdGhlIG5vZGUgbGlzdC4g SWYgbWF0Y2hlcyBhcmUgZm91bmQgdGhlbiB0aGUgbmV3IGJhdGNoIGJ1ZmZlciBub2RlIGlzCm1h cmtlZCBhcyBiZWluZyBkZXBlbmRlbnQgdXBvbiB0aGUgbWF0Y2hpbmcgbm9kZS4gVGhlIHNhbWUg aXMgZG9uZSBmb3IKdGhlIGNvbnRleHQgb2JqZWN0LiBUaGUgc2NoZWR1bGVyIGFsc28gYnVtcHMg dXAgdGhlIHByaW9yaXR5IG9mIHN1Y2gKbWF0Y2hpbmcgbm9kZXMgb24gdGhlIGdyb3VuZHMgdGhh dCB0aGUgbW9yZSBkZXBlbmRlbmNpZXMgYSBnaXZlbiBiYXRjaApidWZmZXIgaGFzIHRoZSBtb3Jl IGltcG9ydGFudCBpdCBpcyBsaWtlbHkgdG8gYmUuCgpUaGUgc2NoZWR1bGVyIGFpbXMgdG8gaGF2 ZSBhIGdpdmVuICh0dW5lYWJsZSkgbnVtYmVyIG9mIGJhdGNoIGJ1ZmZlcnMKaW4gZmxpZ2h0IG9u IHRoZSBoYXJkd2FyZSBhdCBhbnkgZ2l2ZW4gdGltZS4gSWYgZmV3ZXIgdGhhbiB0aGlzIGFyZQpj dXJyZW50bHkgZXhlY3V0aW5nIHdoZW4gYSBuZXcgbm9kZSBpcyBxdWV1ZWQsIHRoZW4gdGhlIG5v ZGUgaXMgcGFzc2VkCnN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIHN1Ym1pdCBmdW5jdGlvbi4gT3Ro ZXJ3aXNlIGl0IGlzIHNpbXBseSBhZGRlZAp0byB0aGUgcXVldWUgYW5kIHRoZSBkcml2ZXIgcmV0 dXJucyBiYWNrIHRvIHVzZXIgbGFuZC4KCkFzIGVhY2ggYmF0Y2ggYnVmZmVyIGNvbXBsZXRlcywg aXQgcmFpc2VzIGFuIGludGVycnVwdCB3aGljaCB3YWtlcyB1cAp0aGUgc2NoZWR1bGVyLiBOb3Rl IHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIG11bHRpcGxlIGJ1ZmZlcnMgdG8KY29tcGxldGUgYmVm b3JlIHRoZSBJUlEgaGFuZGxlciBnZXRzIHRvIHJ1bi4gRnVydGhlciwgaXQgaXMgcG9zc2libGUK Zm9yIHRoZSBzZXFubyB2YWx1ZXMgdG8gYmUgdW4tb3JkZXJlZCAocGFydGljdWxhcmx5IG9uY2Ug cHJlLWVtcHRpb24KaXMgZW5hYmxlZCkuIEhvd2V2ZXIsIHRoZSBzY2hlZHVsZXIga2VlcHMgdGhl IGxpc3Qgb2YgZXhlY3V0aW5nCmJ1ZmZlcnMgaW4gb3JkZXIgb2YgaGFyZHdhcmUgc3VibWlzc2lv bi4gVGh1cyBpdCBjYW4gc2NhbiB0aHJvdWdoIHRoZQpsaXN0IHVudGlsIGEgbWF0Y2hpbmcgc2Vx bm8gaXMgZm91bmQgYW5kIHRoZW4gbWFyayBhbGwgaW4gZmxpZ2h0IG5vZGVzCmZyb20gdGhhdCBw b2ludCBvbiBhcyBjb21wbGV0ZWQuCgpBIGRlZmVycmVkIHdvcmsgcXVldWUgaXMgYWxzbyBwb2tl ZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuIFdoZW4KdGhpcyB3YWtlcyB1cCBpdCBjYW4gZG8g bW9yZSBpbnZvbHZlZCBwcm9jZXNzaW5nIHN1Y2ggYXMgYWN0dWFsbHkKcmVtb3ZpbmcgY29tcGxl dGVkIG5vZGVzIGZyb20gdGhlIHF1ZXVlIGFuZCBmcmVlaW5nIHVwIHRoZSByZXNvdXJjZXMKYXNz b2NpYXRlZCB3aXRoIHRoZW0gKGludGVybmFsIG1lbW9yeSBhbGxvY2F0aW9ucywgRFJNIG9iamVj dApyZWZlcmVuY2VzLCBjb250ZXh0IHJlZmVyZW5jZSwgZXRjLikuIFRoZSB3b3JrIGhhbmRsZXIg YWxzbyBjaGVja3MgdGhlCmluIGZsaWdodCBjb3VudCBhbmQgY2FsbHMgdGhlIHN1Ym1pc3Npb24g Y29kZSBpZiBhIG5ldyBzbG90IGhhcwphcHBlYXJlZC4KCldoZW4gdGhlIHNjaGVkdWxlcidzIHN1 Ym1pdCBjb2RlIGlzIGNhbGxlZCwgaXQgc2NhbnMgdGhlIHF1ZXVlZCBub2RlCmxpc3QgZm9yIHRo ZSBoaWdoZXN0IHByaW9yaXR5IG5vZGUgdGhhdCBoYXMgbm8gdW5tZXQgZGVwZW5kZW5jaWVzLgpO b3RlIHRoYXQgdGhlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gaXMgY29tcGxleCBhcyBpdCBtdXN0 IHRha2UKaW50ZXItcmluZyBkZXBlbmRlbmNpZXMgYW5kIHBvdGVudGlhbCBwcmVlbXB0aW9ucyBp bnRvIGFjY291bnQuIE5vdGUKYWxzbyB0aGF0IGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIGJlIGV4 dGVuZGVkIHRvIGluY2x1ZGUgZXh0ZXJuYWwKZGVwZW5kZW5jaWVzIHN1Y2ggYXMgdGhlIEFuZHJv aWQgTmF0aXZlIFN5bmMgZmlsZSBkZXNjcmlwdG9ycyBhbmQvb3IKdGhlIGxpbnV4IGRtYS1idWZm IHN5bmNocm9uaXNhdGlvbiBzY2hlbWUuCgpJZiBhIHN1aXRhYmxlIG5vZGUgaXMgZm91bmQgdGhl biBpdCBpcyBzZW50IHRvIGV4ZWNidWZmX2ZpbmFsKCkgZm9yCnN1Ym1pc3Npb24gdG8gdGhlIGhh cmR3YXJlLiBUaGUgaW4gZmxpZ2h0IGNvdW50IGlzIHRoZW4gcmUtY2hlY2tlZCBhbmQKYSBuZXcg bm9kZSBwb3BwZWQgZnJvbSB0aGUgbGlzdCBpZiBhcHByb3ByaWF0ZS4KCk5vdGUgdGhhdCB0aGlz IHBhdGNoIGRvZXMgbm90IGltcGxlbWVudCBwcmUtZW1wdGl2ZSBzY2hlZHVsaW5nLiBPbmx5CmJh c2ljIHNjaGVkdWxpbmcgYnkgcmUtb3JkZXJpbmcgYmF0Y2ggYnVmZmVyIHN1Ym1pc3Npb24gaXMg Y3VycmVudGx5CmltcGxlbWVudGVkLgoKdjI6IENoYW5nZWQgcHJpb3JpdHkgbGV2ZWxzIHRvICsv LTEwMjMgZHVlIHRvIGZlZWRiYWNrIGZyb20gQ2hyaXMKV2lsc29uLgoKUmVtb3ZlZCByZWR1bmRh bnQgaW5kZXggZnJvbSBzY2hlZHVsZXIgbm9kZS4KCkNoYW5nZWQgdGltZSBzdGFtcHMgdG8gdXNl IGppZmZpZXMgaW5zdGVhZCBvZiByYXcgbW9ub3RvbmljLiBUaGlzCnByb3ZpZGVzIGxvd2VyIHJl c29sdXRpb24gYnV0IGltcHJvdmVkIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBpOTE1CmNvZGUu CgpNYWpvciByZS13cml0ZSBvZiBjb21wbGV0aW9uIHRyYWNraW5nIGNvZGUgZHVlIHRvIHN0cnVj dCBmZW5jZQpjb252ZXJzaW9uLiBUaGUgc2NoZWR1bGVyIG5vIGxvbmdlciBoYXMgaXQncyBvd24g cHJpdmF0ZSBJUlEgaGFuZGxlcgpidXQganVzdCBsZXRzIHRoZSBleGlzdGluZyByZXF1ZXN0IGNv ZGUgaGFuZGxlIGNvbXBsZXRpb24gZXZlbnRzLgpJbnN0ZWFkLCB0aGUgc2NoZWR1bGVyIG5vdyBo b29rcyBpbnRvIHRoZSByZXF1ZXN0IG5vdGlmeSBjb2RlIHRvIGJlCnRvbGQgd2hlbiBhIHJlcXVl c3QgaGFzIGNvbXBsZXRlZC4KClJlZHVjZWQgZHJpdmVyIG11dGV4IGxvY2tpbmcgc2NvcGUuIFJl bW92YWwgb2Ygc2NoZWR1bGVyIG5vZGVzIG5vCmxvbmdlciBncmFicyB0aGUgbXV0ZXggbG9jay4K CkNoYW5nZS1JZDogSTFlMDhmNTllNjUwYTNjMmJiYWFhOWRlNzYyN2RhMzM4NDliMDYxMDYKRm9y OiBWSVotMTU4NwpTaWduZWQtb2ZmLWJ5OiBKb2huIEhhcnJpc29uIDxKb2huLkMuSGFycmlzb25A SW50ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgfCAg IDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAgICB8ICAgNCArCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAgICAgIHwgICA1ICsKIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfc2NoZWR1bGVyLmMgfCA3NDAgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuaCB8ICA5MCArKysr KwogNSBmaWxlcyBjaGFuZ2VkLCA4NDAgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc2NoZWR1bGVyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmls ZQppbmRleCAxNTM5OGM1Li43OWNiMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtMTAsNiAr MTAsNyBAQCBjY2ZsYWdzLXkgOj0gLVdlcnJvcgogaTkxNS15IDo9IGk5MTVfZHJ2Lm8gXAogCSAg aTkxNV9pcnEubyBcCiAJICBpOTE1X3BhcmFtcy5vIFwKKwkgIGk5MTVfc2NoZWR1bGVyLm8gXAog ICAgICAgICAgIGk5MTVfc3VzcGVuZC5vIFwKIAkgIGk5MTVfc3lzZnMubyBcCiAJICBpbnRlbF9j c3IubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA1ZDM5MGQ5Li4yM2FlZDMyIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTE2OTUsNiArMTY5NSw4IEBAIHN0cnVjdCBpOTE1X2V4 ZWNidWZmZXJfcGFyYW1zIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgICAgICpyZXF1 ZXN0OwogfTsKIAorc3RydWN0IGk5MTVfc2NoZWR1bGVyOworCiAvKiB1c2VkIGluIGNvbXB1dGlu ZyB0aGUgbmV3IHdhdGVybWFya3Mgc3RhdGUgKi8KIHN0cnVjdCBpbnRlbF93bV9jb25maWcgewog CXVuc2lnbmVkIGludCBudW1fcGlwZXNfYWN0aXZlOwpAQCAtMTk0Nyw2ICsxOTQ5LDggQEAgc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgewogCiAJc3RydWN0IGk5MTVfcnVudGltZV9wbSBwbTsKIAor CXN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyOworCiAJLyogQWJzdHJhY3QgdGhlIHN1 Ym1pc3Npb24gbWVjaGFuaXNtIChsZWdhY3kgcmluZ2J1ZmZlciBvciBleGVjbGlzdHMpIGF3YXkg Ki8KIAlzdHJ1Y3QgewogCQlpbnQgKCpleGVjYnVmX3N1Ym1pdCkoc3RydWN0IGk5MTVfZXhlY2J1 ZmZlcl9wYXJhbXMgKnBhcmFtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IGIyMzc0NmEu LjUyMzkzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMzgsNiArMzgsNyBAQAogI2lu Y2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KICNpbmNsdWRl IDwuLi9kcml2ZXJzL2FuZHJvaWQvc3luYy5oPgorI2luY2x1ZGUgImk5MTVfc2NoZWR1bGVyLmgi CiAKICNkZWZpbmUgUlFfQlVHX09OKGV4cHIpCiAKQEAgLTUyNzcsNiArNTI3OCwxMCBAQCBpbnQg aTkxNV9nZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCSAqLwogCWludGVsX3VuY29y ZV9mb3JjZXdha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKIAorCXJldCA9IGk5MTVf c2NoZWR1bGVyX2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2s7CisKIAly ZXQgPSBpOTE1X2dlbV9pbml0X3VzZXJwdHIoZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF91 bmxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5j IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi43Njk3M2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9zY2hlZHVsZXIuYwpAQCAtMCwwICsxLDc0MCBAQAorLyoKKyAqIENv cHlyaWdodCAoYykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0 aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhF IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImk5MTVfZHJ2Lmgi CisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9zY2hlZHVsZXIuaCIKKwor c3RhdGljIGludCAgICAgICAgIGk5MTVfc2NoZWR1bGVyX2ZseV9ub2RlKHN0cnVjdCBpOTE1X3Nj aGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZSk7CitzdGF0aWMgaW50ICAgICAgICAgaTkxNV9zY2hl ZHVsZXJfcmVtb3ZlX2RlcGVuZGVudChzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgKnNjaGVkdWxlciwK KwkJCQkJCSAgIHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqcmVtb3ZlKTsKK3N0 YXRpYyBpbnQgICAgICAgICBpOTE1X3NjaGVkdWxlcl9zdWJtaXQoc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqcmluZywKKwkJCQkJIGJvb2wgaXNfbG9ja2VkKTsKK3N0YXRpYyB1aW50MzJfdCAgICBp OTE1X3NjaGVkdWxlcl9jb3VudF9mbHlpbmcoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVs ZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpyaW5nKTsKK3N0YXRpYyB2 b2lkICAgICAgICBpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wX2NsZWFyKHN0cnVjdCBpOTE1 X3NjaGVkdWxlciAqc2NoZWR1bGVyKTsKK3N0YXRpYyBpbnQgICAgICAgICBpOTE1X3NjaGVkdWxl cl9wcmlvcml0eV9idW1wKHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAorCQkJCQkJ c3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICp0YXJnZXQsCisJCQkJCQl1aW50MzJf dCBidW1wKTsKKworaW50IGk5MTVfc2NoZWR1bGVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRl dikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2 YXRlOworCXN0cnVjdCBpOTE1X3NjaGVkdWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2No ZWR1bGVyOworCWludCAgICAgICAgICAgICAgICAgICAgIHI7CisKKwlpZiAoc2NoZWR1bGVyKQor CQlyZXR1cm4gMDsKKworCXNjaGVkdWxlciA9IGt6YWxsb2Moc2l6ZW9mKCpzY2hlZHVsZXIpLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXNjaGVkdWxlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGlu X2xvY2tfaW5pdCgmc2NoZWR1bGVyLT5sb2NrKTsKKworCWZvciAociA9IDA7IHIgPCBJOTE1X05V TV9SSU5HUzsgcisrKQorCQlJTklUX0xJU1RfSEVBRCgmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3Jd KTsKKworCS8qIERlZmF1bHQgdHVuaW5nIHZhbHVlczogKi8KKwlzY2hlZHVsZXItPnByaW9yaXR5 X2xldmVsX21pbiAgICAgPSAtMTAyMzsKKwlzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21heCAg ICAgPSAxMDIzOworCXNjaGVkdWxlci0+cHJpb3JpdHlfbGV2ZWxfcHJlZW1wdCA9IDkwMDsKKwlz Y2hlZHVsZXItPm1pbl9mbHlpbmcgICAgICAgICAgICAgPSAyOworCisJZGV2X3ByaXYtPnNjaGVk dWxlciA9IHNjaGVkdWxlcjsKKworCXJldHVybiAwOworfQorCitpbnQgaTkxNV9zY2hlZHVsZXJf cXVldWVfZXhlY2J1ZmZlcihzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnFlKQor eworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHFlLT5wYXJhbXMuZGV2LT5k ZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgICAqc2NoZWR1bGVyID0gZGV2X3By aXYtPnNjaGVkdWxlcjsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICAqcmluZyA9IHFlLT5wYXJh bXMucmluZzsKKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgICpub2RlOworCXN0 cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKnRlc3Q7CisJdW5zaWduZWQgbG9uZyAg ICAgICBmbGFnczsKKwlib29sICAgICAgICAgICAgICAgIG5vdF9mbHlpbmcsIGZvdW5kOworCWlu dCAgICAgICAgICAgICAgICAgaSwgaiwgcjsKKwlpbnQgICAgICAgICAgICAgICAgIGluY29tcGxl dGUgPSAwOworCisJQlVHX09OKCFzY2hlZHVsZXIpOworCisJaWYgKDEvKmk5MTUuc2NoZWR1bGVy X292ZXJyaWRlICYgaTkxNV9zb19kaXJlY3Rfc3VibWl0Ki8pIHsKKwkJaW50IHJldDsKKworCQlz Y2hlZHVsZXItPmZsYWdzW3FlLT5wYXJhbXMucmluZy0+aWRdIHw9IGk5MTVfc2Zfc3VibWl0dGlu ZzsKKwkJcmV0ID0gZGV2X3ByaXYtPmd0LmV4ZWNidWZfZmluYWwoJnFlLT5wYXJhbXMpOworCQlz Y2hlZHVsZXItPmZsYWdzW3FlLT5wYXJhbXMucmluZy0+aWRdICY9IH5pOTE1X3NmX3N1Ym1pdHRp bmc7CisKKwkJLyoKKwkJICogRG9uJ3QgZG8gYW55IGNsZWFuIHVwIG9uIGZhaWx1cmUgYmVjYXVz ZSB0aGUgY2FsbGVyIHdpbGwKKwkJICogZG8gaXQgYWxsIGFueXdheS4KKwkJICovCisJCWlmIChy ZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIEZyZWUgZXZlcnl0aGluZyB0aGF0IGlzIG93bmVk IGJ5IHRoZSBRRSBzdHJ1Y3R1cmU6ICovCisJCWtmcmVlKHFlLT5wYXJhbXMuY2xpcHJlY3RzKTsK KwkJaWYgKHFlLT5wYXJhbXMuZGlzcGF0Y2hfZmxhZ3MgJiBJOTE1X0RJU1BBVENIX1NFQ1VSRSkK KwkJCWk5MTVfZ2VtX2V4ZWNidWZmX3JlbGVhc2VfYmF0Y2hfb2JqKHFlLT5wYXJhbXMuYmF0Y2hf b2JqKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlub2RlID0ga21hbGxvYyhzaXplb2YoKm5vZGUp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCisJKm5vZGUg PSAqcWU7CisJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmxpbmspOworCW5vZGUtPnN0YXR1cyA9IGk5 MTVfc3FzX3F1ZXVlZDsKKwlub2RlLT5zdGFtcCAgPSBqaWZmaWVzOworCWk5MTVfZ2VtX3JlcXVl c3RfcmVmZXJlbmNlKG5vZGUtPnBhcmFtcy5yZXF1ZXN0KTsKKworCS8qIE5lZWQgdG8gZGV0ZXJt aW5lIHRoZSBudW1iZXIgb2YgaW5jb21wbGV0ZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFzCisJICog dGhhdCB3aWxsIGJlIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlcGVuZGVuY3kgbGlzdC4KKwkg KgorCSAqIE5vdGUgdGhhdCB0aGUgYWxsb2NhdGlvbiBtdXN0IG5vdCBiZSBtYWRlIHdpdGggdGhl IHNwaW5sb2NrIGFjcXVpcmVkCisJICogYXMga21hbGxvYyBjYW4gc2xlZXAuIEhvd2V2ZXIsIHRo ZSB1bmxvY2svcmVsb2NrIGlzIHNhZmUgYmVjYXVzZSBubworCSAqIG5ldyBlbnRyaWVzIGNhbiBi ZSBxdWV1ZWQgdXAgZHVyaW5nIHRoZSB1bmxvY2sgYXMgdGhlIGk5MTUgZHJpdmVyCisJICogbXV0 ZXggaXMgc3RpbGwgaGVsZC4gRW50cmllcyBjb3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qg YnV0IHRoYXQKKwkgKiBqdXN0IG1lYW5zIHRoZSBkZXBfbGlzdCB3aWxsIGJlIG92ZXItYWxsb2Nh dGVkIHdoaWNoIGlzIGZpbmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaGVkdWxlci0+ bG9jaywgZmxhZ3MpOworCWZvciAociA9IDA7IHIgPCBJOTE1X05VTV9SSU5HUzsgcisrKSB7CisJ CWxpc3RfZm9yX2VhY2hfZW50cnkodGVzdCwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyXSwgbGlu aykgeworCQkJaWYgKEk5MTVfU1FTX0lTX0NPTVBMRVRFKHRlc3QpKQorCQkJCWNvbnRpbnVlOwor CisJCQlpbmNvbXBsZXRlKys7CisJCX0KKwl9CisKKwkvKiBUZW1wb3JhcmlseSB1bmxvY2sgdG8g YWxsb2NhdGUgbWVtb3J5OiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaGVkdWxlci0+ bG9jaywgZmxhZ3MpOworCWlmIChpbmNvbXBsZXRlKSB7CisJCW5vZGUtPmRlcF9saXN0ID0ga21h bGxvYyhzaXplb2Yobm9kZS0+ZGVwX2xpc3RbMF0pICogaW5jb21wbGV0ZSwKKwkJCQkJIEdGUF9L RVJORUwpOworCQlpZiAoIW5vZGUtPmRlcF9saXN0KSB7CisJCQlrZnJlZShub2RlKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlCisJCW5vZGUtPmRlcF9saXN0ID0gTlVMTDsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKKwlub2RlLT5udW1f ZGVwcyA9IDA7CisKKwlpZiAobm9kZS0+ZGVwX2xpc3QpIHsKKwkJZm9yIChyID0gMDsgciA8IEk5 MTVfTlVNX1JJTkdTOyByKyspIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVzdCwgJnNjaGVk dWxlci0+bm9kZV9xdWV1ZVtyXSwgbGluaykgeworCQkJCWlmIChJOTE1X1NRU19JU19DT01QTEVU RSh0ZXN0KSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKgorCQkJCSAqIEJhdGNoZXMgb24gdGhl IHNhbWUgcmluZyBmb3IgdGhlIHNhbWUKKwkJCQkgKiBjb250ZXh0IG11c3QgYmUga2VwdCBpbiBv cmRlci4KKwkJCQkgKi8KKwkJCQlmb3VuZCA9IChub2RlLT5wYXJhbXMuY3R4ID09IHRlc3QtPnBh cmFtcy5jdHgpICYmCisJCQkJCShub2RlLT5wYXJhbXMucmluZyA9PSB0ZXN0LT5wYXJhbXMucmlu Zyk7CisKKwkJCQkvKgorCQkJCSAqIEJhdGNoZXMgd29ya2luZyBvbiB0aGUgc2FtZSBvYmplY3Rz IG11c3QKKwkJCQkgKiBiZSBrZXB0IGluIG9yZGVyLgorCQkJCSAqLworCQkJCWZvciAoaSA9IDA7 IChpIDwgbm9kZS0+bnVtX29ianMpICYmICFmb3VuZDsgaSsrKSB7CisJCQkJCWZvciAoaiA9IDA7 IGogPCB0ZXN0LT5udW1fb2JqczsgaisrKSB7CisJCQkJCQlpZiAobm9kZS0+c2F2ZWRfb2JqZWN0 c1tpXS5vYmogIT0KKwkJCQkJCQkgICAgdGVzdC0+c2F2ZWRfb2JqZWN0c1tqXS5vYmopCisJCQkJ CQkJY29udGludWU7CisKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9 CisJCQkJfQorCisJCQkJaWYgKGZvdW5kKSB7CisJCQkJCW5vZGUtPmRlcF9saXN0W25vZGUtPm51 bV9kZXBzXSA9IHRlc3Q7CisJCQkJCW5vZGUtPm51bV9kZXBzKys7CisJCQkJfQorCQkJfQorCQl9 CisKKwkJQlVHX09OKG5vZGUtPm51bV9kZXBzID4gaW5jb21wbGV0ZSk7CisJfQorCisJaWYgKG5v ZGUtPnByaW9yaXR5ID4gc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXgpCisJCW5vZGUtPnBy aW9yaXR5ID0gc2NoZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXg7CisJZWxzZSBpZiAobm9kZS0+ cHJpb3JpdHkgPCBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbikKKwkJbm9kZS0+cHJpb3Jp dHkgPSBzY2hlZHVsZXItPnByaW9yaXR5X2xldmVsX21pbjsKKworCWlmICgobm9kZS0+cHJpb3Jp dHkgPiAwKSAmJiBub2RlLT5udW1fZGVwcykgeworCQlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9i dW1wX2NsZWFyKHNjaGVkdWxlcik7CisKKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm51bV9kZXBz OyBpKyspCisJCQlpOTE1X3NjaGVkdWxlcl9wcmlvcml0eV9idW1wKHNjaGVkdWxlciwKKwkJCQkJ bm9kZS0+ZGVwX2xpc3RbaV0sIG5vZGUtPnByaW9yaXR5KTsKKwl9CisKKwlsaXN0X2FkZF90YWls KCZub2RlLT5saW5rLCAmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3JpbmctPmlkXSk7CisKKwlub3Rf Zmx5aW5nID0gaTkxNV9zY2hlZHVsZXJfY291bnRfZmx5aW5nKHNjaGVkdWxlciwgcmluZykgPAor CQkJCQkJIHNjaGVkdWxlci0+bWluX2ZseWluZzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKG5vdF9mbHlpbmcpCisJCWk5MTVfc2No ZWR1bGVyX3N1Ym1pdChyaW5nLCB0cnVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGk5MTVfc2NoZWR1bGVyX2ZseV9ub2RlKHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRy eSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub2RlLT5w YXJhbXMuZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXIgICAqc2NoZWR1 bGVyID0gZGV2X3ByaXYtPnNjaGVkdWxlcjsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICAqcmlu ZzsKKworCUJVR19PTighc2NoZWR1bGVyKTsKKwlCVUdfT04oIW5vZGUpOworCUJVR19PTihub2Rl LT5zdGF0dXMgIT0gaTkxNV9zcXNfcG9wcGVkKTsKKworCXJpbmcgPSBub2RlLT5wYXJhbXMucmlu ZzsKKworCS8qIEFkZCB0aGUgbm9kZSAod2hpY2ggc2hvdWxkIGN1cnJlbnRseSBiZSBpbiBzdGF0 ZSBub25lKSB0byB0aGUgZnJvbnQKKwkgKiBvZiB0aGUgcXVldWUuIFRoaXMgZW5zdXJlIHRoYXQg Zmx5aW5nIG5vZGVzIGFyZSBhbHdheXMgaGVsZCBpbgorCSAqIGhhcmR3YXJlIHN1Ym1pc3Npb24g b3JkZXIuICovCisJbGlzdF9hZGQoJm5vZGUtPmxpbmssICZzY2hlZHVsZXItPm5vZGVfcXVldWVb cmluZy0+aWRdKTsKKworCW5vZGUtPnN0YXR1cyA9IGk5MTVfc3FzX2ZseWluZzsKKworCWlmICgh KHNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+aWRdICYgaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWQp KSB7CisJCWJvb2wgICAgc3VjY2VzcyA9IHRydWU7CisKKwkJc3VjY2VzcyA9IHJpbmctPmlycV9n ZXQocmluZyk7CisJCWlmIChzdWNjZXNzKQorCQkJc2NoZWR1bGVyLT5mbGFnc1tyaW5nLT5pZF0g fD0gaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWQ7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFM OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTm9kZXMgYXJlIGNvbnNpZGVyZWQgdmFs aWQgZGVwZW5kZW5jaWVzIGlmIHRoZXkgYXJlIHF1ZXVlZCBvbiBhbnkgcmluZyBvcgorICogaWYg dGhleSBhcmUgaW4gZmxpZ2h0IG9uIGEgZGlmZmVyZW50IHJpbmcuIEluIGZsaWdodCBvbiB0aGUg c2FtZSByaW5nIGlzIG5vCisgKiBsb25nZXIgaW50ZXJlc3RpbmcgZm9yIG5vbi1wcmVtcHRpdmUg bm9kZXMgYXMgdGhlIHJpbmcgc2VyaWFsaXNlcyBleGVjdXRpb24uCisgKiBGb3IgcHJlLWVtcHRp bmcgbm9kZXMsIGFsbCBpbiBmbGlnaHQgZGVwZW5kZW5jaWVzIGFyZSB2YWxpZCBhcyB0aGV5IG11 c3Qgbm90CisgKiBiZSBqdW1wZWQgYnkgdGhlIGFjdCBvZiBwcmUtZW1wdGluZy4KKyAqCisgKiBB bnl0aGluZyB0aGF0IGlzIG5laXRoZXIgcXVldWVkIG5vciBmbHlpbmcgaXMgdW5pbnRlcmVzdGlu Zy4KKyAqLworc3RhdGljIGlubGluZSBib29sIGk5MTVfc2NoZWR1bGVyX2lzX2RlcGVuZGVuY3lf dmFsaWQoCisJCQlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKm5vZGUsIHVpbnQz Ml90IGlkeCkKK3sKKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKmRlcDsKKwor CWRlcCA9IG5vZGUtPmRlcF9saXN0W2lkeF07CisJaWYgKCFkZXApCisJCXJldHVybiBmYWxzZTsK KworCWlmIChJOTE1X1NRU19JU19RVUVVRUQoZGVwKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAo STkxNV9TUVNfSVNfRkxZSU5HKGRlcCkpIHsKKwkJaWYgKG5vZGUtPnBhcmFtcy5yaW5nICE9IGRl cC0+cGFyYW1zLnJpbmcpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9 CisKK3N0YXRpYyB1aW50MzJfdCBpOTE1X3NjaGVkdWxlcl9jb3VudF9mbHlpbmcoc3RydWN0IGk5 MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIsCisJCQkJCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz ICpyaW5nKQoreworCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqbm9kZTsKKwl1 aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZmx5aW5nID0gMDsKKworCWxpc3RfZm9y X2VhY2hfZW50cnkobm9kZSwgJnNjaGVkdWxlci0+bm9kZV9xdWV1ZVtyaW5nLT5pZF0sIGxpbmsp CisJCWlmIChJOTE1X1NRU19JU19GTFlJTkcobm9kZSkpCisJCQlmbHlpbmcrKzsKKworCXJldHVy biBmbHlpbmc7Cit9CisKKy8qIEFkZCBhIHBvcHBlZCBub2RlIGJhY2sgaW4gdG8gdGhlIHF1ZXVl LiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGUgcmluZyB3YXMKKyAqIGh1bmcgd2hlbiBleGVjZmlu YWwoKSB3YXMgY2FsbGVkIGFuZCB0aHVzIHRoZSByaW5nIHN1Ym1pc3Npb24gbmVlZHMgdG8gYmUK KyAqIHJldHJpZWQgbGF0ZXIuICovCitzdGF0aWMgdm9pZCBpOTE1X3NjaGVkdWxlcl9ub2RlX3Jl cXVldWUoc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlKQoreworCUJVR19P Tighbm9kZSk7CisJQlVHX09OKCFJOTE1X1NRU19JU19GTFlJTkcobm9kZSkpOworCisJbm9kZS0+ c3RhdHVzID0gaTkxNV9zcXNfcXVldWVkOworCW5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubyA9 IDA7Cit9CisKKy8qIEdpdmUgdXAgb24gYSBwb3BwZWQgbm9kZSBjb21wbGV0ZWx5LiBGb3IgZXhh bXBsZSwgYmVjYXVzZSBpdCBpcyBjYXVzaW5nIHRoZQorICogcmluZyB0byBoYW5nIG9yIGlzIHVz aW5nIHNvbWUgcmVzb3VyY2UgdGhhdCBubyBsb25nZXIgZXhpc3RzLiAqLworc3RhdGljIHZvaWQg aTkxNV9zY2hlZHVsZXJfbm9kZV9raWxsKHN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRy eSAqbm9kZSkKK3sKKwlCVUdfT04oIW5vZGUpOworCUJVR19PTighSTkxNV9TUVNfSVNfRkxZSU5H KG5vZGUpKTsKKworCW5vZGUtPnN0YXR1cyA9IGk5MTVfc3FzX2RlYWQ7Cit9CisKKy8qCisgKiBB IHNlcXVlbmNlIG51bWJlciBoYXMgcG9wcGVkIG91dCBvZiB0aGUgaGFyZHdhcmUgYW5kIHRoZSBy ZXF1ZXN0IGhhbmRsaW5nCisgKiBjb2RlIGhhcyBtYXBwZWQgaXQgYmFjayB0byBhIHJlcXVlc3Qg YW5kIHdpbGwgbWFyayB0aGF0IHJlcXVlc3QgY29tcGxldGUuCisgKiBJdCBhbHNvIGNhbGxzIHRo aXMgZnVuY3Rpb24gdG8gbm90aWZ5IHRoZSBzY2hlZHVsZXIgYWJvdXQgdGhlIGNvbXBsZXRpb24K KyAqIHNvIHRoZSBzY2hlZHVsZXIncyBub2RlIGNhbiBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHku CisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc2NoZWR1bGVyIG1hbmFnZWQsIGZh bHNlIGlmIG5vdC4KKyAqLworYm9vbCBpOTE1X3NjaGVkdWxlcl9ub3RpZnlfcmVxdWVzdChzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYgID0gdG9faTkxNShyZXEtPnJpbmctPmRldik7CisJc3RydWN0IGk5MTVfc2No ZWR1bGVyICAgKnNjaGVkdWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7CisJLyogWFhYOiBOZWVk IHRvIG1hcCBiYWNrIGZyb20gcmVxdWVzdCB0byBub2RlICovCisJc3RydWN0IGk5MTVfc2NoZWR1 bGVyX3F1ZXVlX2VudHJ5ICpub2RlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICAgICAgIGZsYWdz OworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm c2NoZWR1bGVyLT5sb2NrLCBmbGFncyk7CisKKwlXQVJOX09OKCFJOTE1X1NRU19JU19GTFlJTkco bm9kZSkpOworCisJLyogTm9kZSB3YXMgaW4gZmxpZ2h0IHNvIG1hcmsgaXQgYXMgY29tcGxldGUu ICovCisJaWYgKHJlcS0+Y2FuY2VsbGVkKQorCQlub2RlLT5zdGF0dXMgPSBpOTE1X3Nxc19kZWFk OworCWVsc2UKKwkJbm9kZS0+c3RhdHVzID0gaTkxNV9zcXNfY29tcGxldGU7CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogWFhY OiBJZiB0aGUgaW4tZmxpZ2h0IGxpc3QgaXMgbm93IGVtcHR5IHRoZW4gbmV3IHdvcmsgc2hvdWxk IGJlCisJICogc3VibWl0dGVkLiBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9t IGludGVycnVwdCBjb250ZXh0CisJICogYW5kIHRodXMgY2Fubm90IGFjcXVpcmUgbXV0ZXggbG9j a3MgYW5kIG90aGVyIHN1Y2ggdGhpbmdzIHRoYXQgYXJlCisJICogbmVjZXNzYXJ5IGZvciBmcmVz aCBzdWJtaXNzaW9uLgorCSAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBpOTE1X3NjaGVk dWxlcl9yZW1vdmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqcmluZykKK3sKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVj dCBpOTE1X3NjaGVkdWxlciAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+c2NoZWR1bGVyOworCXN0 cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKm5vZGUsICpub2RlX25leHQ7CisJdW5z aWduZWQgbG9uZyAgICAgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgICAgIGZseWluZyA9IDAs IHF1ZXVlZCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICByZXQgPSAwOworCWJvb2wgICAgICAg ICAgICAgICAgZG9fc3VibWl0OworCXVpbnQzMl90ICAgICAgICAgICAgbWluX3NlcW5vOworCXN0 cnVjdCBsaXN0X2hlYWQgICAgcmVtb3ZlOworCisJaWYgKGxpc3RfZW1wdHkoJnNjaGVkdWxlci0+ bm9kZV9xdWV1ZVtyaW5nLT5pZF0pKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZzY2hlZHVsZXItPmxvY2ssIGZsYWdzKTsKKworCS8qIC9pOTE1X3NjaGVkdWxlcl9kdW1wX2xv Y2tlZChyaW5nLCAicmVtb3ZlL3ByZSIpOy8gKi8KKworCS8qCisJICogSW4gdGhlIGNhc2Ugd2hl cmUgdGhlIHN5c3RlbSBpcyBpZGxlLCBzdGFydGluZyAnbWluX3NlcW5vJyBmcm9tIGEgYmlnCisJ ICogbnVtYmVyIHdpbGwgY2F1c2UgYWxsIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXMgdGhleSBhcmUg bm93IGJhY2sgdG8KKwkgKiBiZWluZyBpbi1vcmRlci4gSG93ZXZlciwgdGhpcyB3aWxsIGJlIGEg cHJvYmxlbSBpZiB0aGUgbGFzdCBvbmUgdG8KKwkgKiBjb21wbGV0ZSB3YXMgYWN0dWFsbHkgb3V0 LW9mLW9yZGVyIGFzIHRoZSByaW5nIHNlcW5vIHZhbHVlIHdpbGwgYmUKKwkgKiBsb3dlciB0aGFu IG9uZSBvciBtb3JlIGNvbXBsZXRlZCBidWZmZXJzLiBUaHVzIGNvZGUgbG9va2luZyBmb3IgdGhl CisJICogY29tcGxldGlvbiBvZiBzYWlkIGJ1ZmZlcnMgd2lsbCB3YWl0IGZvcmV2ZXIuCisJICog SW5zdGVhZCwgdXNlIHRoZSBoYXJkd2FyZSBzZXFubyBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuIFRo aXMgbWVhbnMKKwkgKiB0aGF0IHNvbWUgYnVmZmVycyBtaWdodCBiZSBrZXB0IGFyb3VuZCBldmVu IGluIGEgY29tcGxldGVseSBpZGxlCisJICogc3lzdGVtIGJ1dCBpdCBzaG91bGQgZ3VhcmFudGVl IHRoYXQgbm8tb25lIGV2ZXIgZ2V0cyBjb25mdXNlZCB3aGVuCisJICogd2FpdGluZyBmb3IgYnVm ZmVyIGNvbXBsZXRpb24uCisJICovCisJbWluX3NlcW5vID0gcmluZy0+Z2V0X3NlcW5vKHJpbmcs IHRydWUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2RlX3F1 ZXVlW3JpbmctPmlkXSwgbGluaykgeworCQlpZiAoSTkxNV9TUVNfSVNfUVVFVUVEKG5vZGUpKQor CQkJcXVldWVkKys7CisJCWVsc2UgaWYgKEk5MTVfU1FTX0lTX0ZMWUlORyhub2RlKSkKKwkJCWZs eWluZysrOworCQllbHNlIGlmIChJOTE1X1NRU19JU19DT01QTEVURShub2RlKSkKKwkJCWNvbnRp bnVlOworCisJCWlmIChub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vxbm8gPT0gMCkKKwkJCWNvbnRp bnVlOworCisJCWlmICghaTkxNV9zZXFub19wYXNzZWQobm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNl cW5vLCBtaW5fc2Vxbm8pKQorCQkJbWluX3NlcW5vID0gbm9kZS0+cGFyYW1zLnJlcXVlc3QtPnNl cW5vOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZyZW1vdmUpOworCWxpc3RfZm9yX2VhY2hfZW50 cnlfc2FmZShub2RlLCBub2RlX25leHQsICZzY2hlZHVsZXItPm5vZGVfcXVldWVbcmluZy0+aWRd LCBsaW5rKSB7CisJCS8qCisJCSAqIE9ubHkgcmVtb3ZlIGNvbXBsZXRlZCBub2RlcyB3aGljaCBo YXZlIGEgbG93ZXIgc2Vxbm8gdGhhbgorCQkgKiBhbGwgcGVuZGluZyBub2Rlcy4gV2hpbGUgdGhl cmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIHRoZQorCQkgKiByaW5nJ3Mgc2Vxbm8gY291bnRpbmcg YmFja3dhcmRzLCBhbGwgaGlnaGVyIGJ1ZmZlcnMgbXVzdAorCQkgKiBiZSByZW1lbWJlcmVkIHNv IHRoYXQgdGhlICdpOTE1X3NlcW5vX3Bhc3NlZCgpJyB0ZXN0IGNhbgorCQkgKiByZXBvcnQgdGhh dCB0aGV5IGhhdmUgaW4gZmFjdCBwYXNzZWQuCisJCSAqCisJCSAqIE5COiBUaGlzIGlzIG5vdCB0 cnVlIGZvciAnZGVhZCcgbm9kZXMuIFRoZSBHUFUgcmVzZXQgY2F1c2VzCisJCSAqIHRoZSBzb2Z0 d2FyZSBzZXFubyB0byByZXN0YXJ0IGZyb20gaXRzIGluaXRpYWwgdmFsdWUuIFRodXMKKwkJICog dGhlIGRlYWQgbm9kZXMgbXVzdCBiZSByZW1vdmVkIGV2ZW4gdGhvdWdoIHRoZWlyIHNlcW5vIHZh bHVlcworCQkgKiBhcmUgcG90ZW50aWFsbHkgdmFzdGx5IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVu dCByaW5nIHNlcW5vLgorCQkgKi8KKwkJaWYgKCFJOTE1X1NRU19JU19DT01QTEVURShub2RlKSkK KwkJCWNvbnRpbnVlOworCisJCWlmIChub2RlLT5zdGF0dXMgIT0gaTkxNV9zcXNfZGVhZCkgewor CQkJaWYgKGk5MTVfc2Vxbm9fcGFzc2VkKG5vZGUtPnBhcmFtcy5yZXF1ZXN0LT5zZXFubywgbWlu X3NlcW5vKSAmJgorCQkJICAgIChub2RlLT5wYXJhbXMucmVxdWVzdC0+c2Vxbm8gIT0gbWluX3Nl cW5vKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWxpc3RfZGVsKCZub2RlLT5saW5rKTsKKwkJ bGlzdF9hZGQoJm5vZGUtPmxpbmssICZyZW1vdmUpOworCisJCS8qIFN0cmlwIHRoZSBkZXBlbmRl bmN5IGluZm8gd2hpbGUgdGhlIG11dGV4IGlzIHN0aWxsIGxvY2tlZCAqLworCQlpOTE1X3NjaGVk dWxlcl9yZW1vdmVfZGVwZW5kZW50KHNjaGVkdWxlciwgbm9kZSk7CisKKwkJY29udGludWU7CisJ fQorCisJLyoKKwkgKiBObyBpZGVhIHdoeSBidXQgdGhpcyBzZWVtcyB0byBjYXVzZSBwcm9ibGVt cyBvY2Nhc2lvbmFsbHkuCisJICogTm90ZSB0aGF0IHRoZSAnaXJxX3B1dCcgY29kZSBpcyBpbnRl cm5hbGx5IHJlZmVyZW5jZSBjb3VudGVkCisJICogYW5kIHNwaW5fbG9ja2VkIHNvIGl0IHNob3Vs ZCBiZSBzYWZlIHRvIGNhbGwuCisJICovCisJLyppZiAoKHNjaGVkdWxlci0+ZmxhZ3NbcmluZy0+ aWRdICYgaTkxNV9zZl9pbnRlcnJ1cHRzX2VuYWJsZWQpICYmCisJICAgIChmaXJzdF9mbGlnaHRb cmluZy0+aWRdID09IE5VTEwpKSB7CisJCXJpbmctPmlycV9wdXQocmluZyk7CisJCXNjaGVkdWxl ci0+ZmxhZ3NbcmluZy0+aWRdICY9IH5pOTE1X3NmX2ludGVycnVwdHNfZW5hYmxlZDsKKwl9Ki8K KworCS8qIExhdW5jaCBtb3JlIHBhY2tldHMgbm93PyAqLworCWRvX3N1Ym1pdCA9IChxdWV1ZWQg PiAwKSAmJiAoZmx5aW5nIDwgc2NoZWR1bGVyLT5taW5fZmx5aW5nKTsKKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFkb19zdWJtaXQg JiYgbGlzdF9lbXB0eSgmcmVtb3ZlKSkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJnJp bmctPmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChkb19zdWJtaXQpCisJCXJldCA9IGk5MTVf c2NoZWR1bGVyX3N1Ym1pdChyaW5nLCB0cnVlKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcmVt b3ZlKSkgeworCQlub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmcmVtb3ZlLCB0eXBlb2YoKm5vZGUp LCBsaW5rKTsKKwkJbGlzdF9kZWwoJm5vZGUtPmxpbmspOworCisJCS8qIFRoZSBiYXRjaCBidWZm ZXIgbXVzdCBiZSB1bnBpbm5lZCBiZWZvcmUgaXQgaXMgdW5yZWZlcmVuY2VkCisJCSAqIG90aGVy d2lzZSB0aGUgdW5waW4gZmFpbHMgd2l0aCBhIG1pc3Npbmcgdm1hIT8gKi8KKwkJaWYgKG5vZGUt PnBhcmFtcy5kaXNwYXRjaF9mbGFncyAmIEk5MTVfRElTUEFUQ0hfU0VDVVJFKQorCQkJaTkxNV9n ZW1fZXhlY2J1ZmZfcmVsZWFzZV9iYXRjaF9vYmoobm9kZS0+cGFyYW1zLmJhdGNoX29iaik7CisK KwkJLyogRnJlZSBldmVyeXRoaW5nIHRoYXQgaXMgb3duZWQgYnkgdGhlIG5vZGU6ICovCisJCWk5 MTVfZ2VtX3JlcXVlc3RfdW5yZWZlcmVuY2Uobm9kZS0+cGFyYW1zLnJlcXVlc3QpOworCQlrZnJl ZShub2RlLT5wYXJhbXMuY2xpcHJlY3RzKTsKKwkJa2ZyZWUobm9kZS0+ZGVwX2xpc3QpOworCQlr ZnJlZShub2RlKTsKKwl9CisKKwltdXRleF91bmxvY2soJnJpbmctPmRldi0+c3RydWN0X211dGV4 KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfc2NoZWR1bGVyX3ByaW9y aXR5X2J1bXBfY2xlYXIoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIpCit7CisJc3Ry dWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICpub2RlOworCWludCBpOworCisJLyoKKwkg KiBFbnN1cmUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGRvbid0IGNhdXNlIHByb2JsZW1zIGFuZCB0 aGF0IGEgYnVtcAorCSAqIGJ5IG9iamVjdCB1c2FnZSBvbmx5IGJ1bXBzIGVhY2ggdXNpbmcgYnVm ZmVyIG9uY2U6CisJICovCisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsK KwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW2ldLCBs aW5rKQorCQkJbm9kZS0+YnVtcGVkID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgaW50IGk5MTVf c2NoZWR1bGVyX3ByaW9yaXR5X2J1bXAoc3RydWN0IGk5MTVfc2NoZWR1bGVyICpzY2hlZHVsZXIs CisJCQkJCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAqdGFyZ2V0LAorCQkJCQl1 aW50MzJfdCBidW1wKQoreworCXVpbnQzMl90IG5ld19wcmlvcml0eTsKKwlpbnQgICAgICBpLCBj b3VudDsKKworCWlmICh0YXJnZXQtPnByaW9yaXR5ID49IHNjaGVkdWxlci0+cHJpb3JpdHlfbGV2 ZWxfbWF4KQorCQlyZXR1cm4gMTsKKworCWlmICh0YXJnZXQtPmJ1bXBlZCkKKwkJcmV0dXJuIDA7 CisKKwluZXdfcHJpb3JpdHkgPSB0YXJnZXQtPnByaW9yaXR5ICsgYnVtcDsKKwlpZiAoKG5ld19w cmlvcml0eSA8PSB0YXJnZXQtPnByaW9yaXR5KSB8fAorCSAgICAobmV3X3ByaW9yaXR5ID4gc2No ZWR1bGVyLT5wcmlvcml0eV9sZXZlbF9tYXgpKQorCQl0YXJnZXQtPnByaW9yaXR5ID0gc2NoZWR1 bGVyLT5wcmlvcml0eV9sZXZlbF9tYXg7CisJZWxzZQorCQl0YXJnZXQtPnByaW9yaXR5ID0gbmV3 X3ByaW9yaXR5OworCisJY291bnQgPSAxOworCXRhcmdldC0+YnVtcGVkID0gdHJ1ZTsKKworCWZv ciAoaSA9IDA7IGkgPCB0YXJnZXQtPm51bV9kZXBzOyBpKyspIHsKKwkJaWYgKCF0YXJnZXQtPmRl cF9saXN0W2ldKQorCQkJY29udGludWU7CisKKwkJaWYgKHRhcmdldC0+ZGVwX2xpc3RbaV0tPmJ1 bXBlZCkKKwkJCWNvbnRpbnVlOworCisJCWNvdW50ICs9IGk5MTVfc2NoZWR1bGVyX3ByaW9yaXR5 X2J1bXAoc2NoZWR1bGVyLAorCQkJCQkJICAgICAgdGFyZ2V0LT5kZXBfbGlzdFtpXSwKKwkJCQkJ CSAgICAgIGJ1bXApOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBpOTE1 X3NjaGVkdWxlcl9wb3BfZnJvbV9xdWV1ZV9sb2NrZWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAq cmluZywKKwkJCQkgICAgc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICoqcG9wX25v ZGUsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICAgICAgICAgICAgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlz dHJ1Y3QgaTkxNV9zY2hlZHVsZXIgICAgICAgICAgICAgICpzY2hlZHVsZXIgPSBkZXZfcHJpdi0+ c2NoZWR1bGVyOworCXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9lbnRyeSAgKmJlc3Q7CisJ c3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVlX2VudHJ5ICAqbm9kZTsKKwlpbnQgICAgIHJldDsK KwlpbnQgICAgIGk7CisJYm9vbAlhbnlfcXVldWVkOworCWJvb2wJaGFzX2xvY2FsLCBoYXNfcmVt b3RlLCBvbmx5X3JlbW90ZTsKKworCSpwb3Bfbm9kZSA9IE5VTEw7CisJcmV0ID0gLUVOT0RBVEE7 CisKKwlhbnlfcXVldWVkID0gZmFsc2U7CisJb25seV9yZW1vdGUgPSBmYWxzZTsKKwliZXN0ID0g TlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJnNjaGVkdWxlci0+bm9kZV9xdWV1 ZVtyaW5nLT5pZF0sIGxpbmspIHsKKwkJaWYgKCFJOTE1X1NRU19JU19RVUVVRUQobm9kZSkpCisJ CQljb250aW51ZTsKKwkJYW55X3F1ZXVlZCA9IHRydWU7CisKKwkJaGFzX2xvY2FsICA9IGZhbHNl OworCQloYXNfcmVtb3RlID0gZmFsc2U7CisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fZGVw czsgaSsrKSB7CisJCQlpZiAoIWk5MTVfc2NoZWR1bGVyX2lzX2RlcGVuZGVuY3lfdmFsaWQobm9k ZSwgaSkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChub2RlLT5kZXBfbGlzdFtpXS0+cGFyYW1z LnJpbmcgPT0gbm9kZS0+cGFyYW1zLnJpbmcpCisJCQkJaGFzX2xvY2FsID0gdHJ1ZTsKKwkJCWVs c2UKKwkJCQloYXNfcmVtb3RlID0gdHJ1ZTsKKwkJfQorCisJCWlmIChoYXNfcmVtb3RlICYmICFo YXNfbG9jYWwpCisJCQlvbmx5X3JlbW90ZSA9IHRydWU7CisKKwkJaWYgKCFoYXNfbG9jYWwgJiYg IWhhc19yZW1vdGUpIHsKKwkJCWlmICghYmVzdCB8fAorCQkJICAgIChub2RlLT5wcmlvcml0eSA+ IGJlc3QtPnByaW9yaXR5KSkKKwkJCQliZXN0ID0gbm9kZTsKKwkJfQorCX0KKworCWlmIChiZXN0 KSB7CisJCWxpc3RfZGVsKCZiZXN0LT5saW5rKTsKKworCQlJTklUX0xJU1RfSEVBRCgmYmVzdC0+ bGluayk7CisJCWJlc3QtPnN0YXR1cyAgPSBpOTE1X3Nxc19wb3BwZWQ7CisKKwkJcmV0ID0gMDsK Kwl9IGVsc2UgeworCQkvKiBDYW4gb25seSBnZXQgaGVyZSBpZjoKKwkJICogKGEpIHRoZXJlIGFy ZSBubyBidWZmZXJzIGluIHRoZSBxdWV1ZQorCQkgKiAoYikgYWxsIHF1ZXVlZCBidWZmZXJzIGFy ZSBkZXBlbmRlbnQgb24gb3RoZXIgYnVmZmVycworCQkgKiAgICAgZS5nLiBvbiBhIGJ1ZmZlciB0 aGF0IGlzIGluIGZsaWdodCBvbiBhIGRpZmZlcmVudCByaW5nCisJCSAqLworCQlpZiAob25seV9y ZW1vdGUpIHsKKwkJCS8qIFRoZSBvbmx5IGRlcGVuZGVudCBidWZmZXJzIGFyZSBvbiBhbm90aGVy IHJpbmcuICovCisJCQlyZXQgPSAtRUFHQUlOOworCQl9IGVsc2UgaWYgKGFueV9xdWV1ZWQpIHsK KwkJCS8qIEl0IHNlZW1zIHRoYXQgc29tZXRoaW5nIGhhcyBnb25lIGhvcnJpYmx5IHdyb25nISAq LworCQkJRFJNX0VSUk9SKCJCcm9rZW4gZGVwZW5kZW5jeSB0cmFja2luZyBvbiByaW5nICVkIVxu IiwKKwkJCQkgIChpbnQpIHJpbmctPmlkKTsKKwkJfQorCX0KKworCS8qIGk5MTVfc2NoZWR1bGVy X2R1bXBfcXVldWVfcG9wKHJpbmcsIGJlc3QpOyAqLworCisJKnBvcF9ub2RlID0gYmVzdDsKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGk5MTVfc2NoZWR1bGVyX3N1Ym1pdChzdHJ1Y3Qg aW50ZWxfZW5naW5lX2NzICpyaW5nLCBib29sIHdhc19sb2NrZWQpCit7CisJc3RydWN0IGRybV9k ZXZpY2UgICAqZGV2ID0gcmluZy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGk5MTVfc2NoZWR1bGVyICAgKnNjaGVk dWxlciA9IGRldl9wcml2LT5zY2hlZHVsZXI7CisJc3RydWN0IGk5MTVfc2NoZWR1bGVyX3F1ZXVl X2VudHJ5ICAqbm9kZTsKKwl1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworCWludCAgICAgICAg ICAgICAgICAgcmV0ID0gMCwgY291bnQgPSAwOworCisJaWYgKCF3YXNfbG9ja2VkKSB7CisJCXJl dCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CisJCWlmIChyZXQpCisJCQly ZXR1cm4gcmV0OworCX0KKworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9t dXRleCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOwor CisJLyogRmlyc3QgdGltZSBhcm91bmQsIGNvbXBsYWluIGlmIGFueXRoaW5nIHVuZXhwZWN0ZWQg b2NjdXJzOiAqLworCXJldCA9IGk5MTVfc2NoZWR1bGVyX3BvcF9mcm9tX3F1ZXVlX2xvY2tlZChy aW5nLCAmbm9kZSwgJmZsYWdzKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOworCisJCWlmICghd2FzX2xvY2tlZCkKKwkJCW11 dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJCXJldHVybiByZXQ7CisJfQorCisJ ZG8geworCQlCVUdfT04oIW5vZGUpOworCQlCVUdfT04obm9kZS0+cGFyYW1zLnJpbmcgIT0gcmlu Zyk7CisJCUJVR19PTihub2RlLT5zdGF0dXMgIT0gaTkxNV9zcXNfcG9wcGVkKTsKKwkJY291bnQr KzsKKworCQkvKiBUaGUgY2FsbCB0byBwb3AgYWJvdmUgd2lsbCBoYXZlIHJlbW92ZWQgdGhlIG5v ZGUgZnJvbSB0aGUKKwkJICogbGlzdC4gU28gYWRkIGl0IGJhY2sgaW4gYW5kIG1hcmsgaXQgYXMg aW4gZmxpZ2h0LiAqLworCQlpOTE1X3NjaGVkdWxlcl9mbHlfbm9kZShub2RlKTsKKworCQlzY2hl ZHVsZXItPmZsYWdzW3JpbmctPmlkXSB8PSBpOTE1X3NmX3N1Ym1pdHRpbmc7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBkZXZfcHJp di0+Z3QuZXhlY2J1Zl9maW5hbCgmbm9kZS0+cGFyYW1zKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUo JnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZXItPmZsYWdzW3JpbmctPmlkXSAm PSB+aTkxNV9zZl9zdWJtaXR0aW5nOworCisJCWlmIChyZXQpIHsKKwkJCWludCByZXF1ZXVlID0g MTsKKworCQkJLyogT2ggZGVhciEgRWl0aGVyIHRoZSBub2RlIGlzIGJyb2tlbiBvciB0aGUgcmlu ZyBpcworCQkJICogYnVzeS4gU28gbmVlZCB0byBraWxsIHRoZSBub2RlIG9yIHJlcXVldWUgaXQg YW5kIHRyeQorCQkJICogYWdhaW4gbGF0ZXIgYXMgYXBwcm9wcmlhdGUuICovCisKKwkJCXN3aXRj aCAoLXJldCkgeworCQkJY2FzZSBFTk9ERVY6CisJCQljYXNlIEVOT0VOVDoKKwkJCQkvKiBGYXRh bCBlcnJvcnMuIEtpbGwgdGhlIG5vZGUuICovCisJCQkJcmVxdWV1ZSA9IC0xOworCQkJYnJlYWs7 CisKKwkJCWNhc2UgRUFHQUlOOgorCQkJY2FzZSBFQlVTWToKKwkJCWNhc2UgRUlPOgorCQkJY2Fz ZSBFTk9NRU06CisJCQljYXNlIEVSRVNUQVJUU1lTOgorCQkJY2FzZSBFSU5UUjoKKwkJCQkvKiBT dXBwb3NlZGx5IHJlY292ZXJhYmxlIGVycm9ycy4gKi8KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0 OgorCQkJCURSTV9ERUJVR19EUklWRVIoIjwlcz4gR290IHVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBl eGVjZmluYWwoKTogJWQhXG4iLAorCQkJCQkJIHJpbmctPm5hbWUsIHJldCk7CisJCQkJLyogQXNz dW1lIGl0IGlzIHJlY292ZXJhYmxlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4gKi8KKwkJCWJyZWFr OworCQkJfQorCisJCQkvKiBDaGVjayB0aGF0IHRoZSB3YXRjaGRvZy9yZXNldCBjb2RlIGhhcyBu b3QgbnVrZWQKKwkJCSAqIHRoZSBub2RlIHdoaWxlIHdlIHdlcmVuJ3QgbG9va2luZzogKi8KKwkJ CWlmIChub2RlLT5zdGF0dXMgPT0gaTkxNV9zcXNfZGVhZCkKKwkJCQlyZXF1ZXVlID0gMDsKKwor CQkJaWYgKHJlcXVldWUgPT0gMSkgeworCQkJCWk5MTVfc2NoZWR1bGVyX25vZGVfcmVxdWV1ZShu b2RlKTsKKwkJCQkvKiBObyBwb2ludCBzcGlubmluZyBpZiB0aGUgcmluZyBpcyBjdXJyZW50bHkK KwkJCQkgKiB1bmF2YWlsYWJsZSBzbyBqdXN0IGdpdmUgdXAgYW5kIGNvbWUgYmFjaworCQkJCSAq IGxhdGVyLiAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChyZXF1ZXVlID09IC0xKQorCQkJ CWk5MTVfc2NoZWR1bGVyX25vZGVfa2lsbChub2RlKTsKKwkJfQorCisJCS8qIEtlZXAgbGF1bmNo aW5nIHVudGlsIHRoZSBza3kgaXMgc3VmZmljaWVudGx5IGZ1bGwuICovCisJCWlmIChpOTE1X3Nj aGVkdWxlcl9jb3VudF9mbHlpbmcoc2NoZWR1bGVyLCByaW5nKSA+PQorCQkJCQkJc2NoZWR1bGVy LT5taW5fZmx5aW5nKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gaTkxNV9zY2hlZHVsZXJfcG9wX2Zy b21fcXVldWVfbG9ja2VkKHJpbmcsICZub2RlLCAmZmxhZ3MpOworCX0gd2hpbGUgKHJldCA9PSAw KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaGVkdWxlci0+bG9jaywgZmxhZ3MpOwor CisJaWYgKCF3YXNfbG9ja2VkKQorCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsK KworCS8qIERvbid0IGNvbXBsYWluIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIHN1Ym1pdCBleHRy YSBlbnRyaWVzICovCisJaWYgKHJldCA9PSAtRU5PREFUQSkKKwkJcmV0ID0gMDsKKworCXJldHVy biAocmV0IDwgMCkgPyByZXQgOiBjb3VudDsKK30KKworc3RhdGljIGludCBpOTE1X3NjaGVkdWxl cl9yZW1vdmVfZGVwZW5kZW50KHN0cnVjdCBpOTE1X3NjaGVkdWxlciAqc2NoZWR1bGVyLAorCQkJ CQkgICBzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnJlbW92ZSkKK3sKKwlzdHJ1 Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgICpub2RlOworCWludCAgICAgaSwgcjsKKwlp bnQgICAgIGNvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCByZW1vdmUtPm51bV9kZXBzOyBp KyspCisJCWlmICgocmVtb3ZlLT5kZXBfbGlzdFtpXSkgJiYKKwkJICAgICghSTkxNV9TUVNfSVNf Q09NUExFVEUocmVtb3ZlLT5kZXBfbGlzdFtpXSkpKQorCQkJY291bnQrKzsKKwlCVUdfT04oY291 bnQpOworCisJZm9yIChyID0gMDsgciA8IEk5MTVfTlVNX1JJTkdTOyByKyspIHsKKwkJbGlzdF9m b3JfZWFjaF9lbnRyeShub2RlLCAmc2NoZWR1bGVyLT5ub2RlX3F1ZXVlW3JdLCBsaW5rKSB7CisJ CQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX2RlcHM7IGkrKykgeworCQkJCWlmIChub2RlLT5k ZXBfbGlzdFtpXSAhPSByZW1vdmUpCisJCQkJCWNvbnRpbnVlOworCisJCQkJbm9kZS0+ZGVwX2xp c3RbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3NjaGVkdWxlci5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9zY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5lZTM5Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9z Y2hlZHVsZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IElu dGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBz b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJl IiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs dWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9k aWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBz ZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9t IHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBm b2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBh bmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3Jh cGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlv bnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQg IkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1Q TElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9O SU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlS SUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisg KiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9U SEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRX QVJFLgorICoKKyAqLworCisjaWZuZGVmIF9JOTE1X1NDSEVEVUxFUl9IXworI2RlZmluZSBfSTkx NV9TQ0hFRFVMRVJfSF8KKworZW51bSBpOTE1X3NjaGVkdWxlcl9xdWV1ZV9zdGF0dXMgeworCS8q IExpbWJvOiAqLworCWk5MTVfc3FzX25vbmUgPSAwLAorCS8qIE5vdCB5ZXQgc3VibWl0dGVkIHRv IGhhcmR3YXJlOiAqLworCWk5MTVfc3FzX3F1ZXVlZCwKKwkvKiBQb3BwZWQgZnJvbSBxdWV1ZSwg cmVhZHkgdG8gZmx5OiAqLworCWk5MTVfc3FzX3BvcHBlZCwKKwkvKiBTZW50IHRvIGhhcmR3YXJl IGZvciBwcm9jZXNzaW5nOiAqLworCWk5MTVfc3FzX2ZseWluZywKKwkvKiBGaW5pc2hlZCBwcm9j ZXNzaW5nIG9uIHRoZSBoYXJkd2FyZTogKi8KKwlpOTE1X3Nxc19jb21wbGV0ZSwKKwkvKiBLaWxs ZWQgYnkgd2F0Y2hkb2cgb3IgY2F0YXN0cm9waGljIHN1Ym1pc3Npb24gZmFpbHVyZTogKi8KKwlp OTE1X3Nxc19kZWFkLAorCS8qIExpbWl0IHZhbHVlIGZvciB1c2Ugd2l0aCBhcnJheXMvbG9vcHMg Ki8KKwlpOTE1X3Nxc19NQVgKK307CisKKyNkZWZpbmUgSTkxNV9TUVNfSVNfUVVFVUVEKG5vZGUp CSgoKG5vZGUpLT5zdGF0dXMgPT0gaTkxNV9zcXNfcXVldWVkKSkKKyNkZWZpbmUgSTkxNV9TUVNf SVNfRkxZSU5HKG5vZGUpCSgoKG5vZGUpLT5zdGF0dXMgPT0gaTkxNV9zcXNfZmx5aW5nKSkKKyNk ZWZpbmUgSTkxNV9TUVNfSVNfQ09NUExFVEUobm9kZSkJKCgobm9kZSktPnN0YXR1cyA9PSBpOTE1 X3Nxc19jb21wbGV0ZSkgfHwgXAorCQkJCQkgKChub2RlKS0+c3RhdHVzID09IGk5MTVfc3FzX2Rl YWQpKQorCitzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfb2JqX2VudHJ5IHsKKwlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAgICAgICAgICAqb2JqOworfTsKKworc3RydWN0IGk5MTVfc2NoZWR1bGVy X3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgaTkxNV9leGVjYnVmZmVyX3BhcmFtcyAgICAgICBwYXJh bXM7CisJLyogLTEwMjMgPSBsb3dlc3QgcHJpb3JpdHksIDAgPSBkZWZhdWx0LCAxMDIzID0gaGln aGVzdCAqLworCWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5Owor CXN0cnVjdCBpOTE1X3NjaGVkdWxlcl9vYmpfZW50cnkgICAgICpzYXZlZF9vYmplY3RzOworCWlu dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vYmpzOworCWJvb2wgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBlZDsKKwlzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJf cXVldWVfZW50cnkgICAqKmRlcF9saXN0OworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG51bV9kZXBzOworCWVudW0gaTkxNV9zY2hlZHVsZXJfcXVldWVfc3RhdHVzICAgIHN0 YXR1czsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgICBzdGFtcDsKKwlzdHJ1 Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICAgICBsaW5rOworfTsKKworc3RydWN0IGk5MTVf c2NoZWR1bGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIG5vZGVfcXVldWVbSTkxNV9OVU1fUklO R1NdOworCXVpbnQzMl90ICAgICAgICAgICAgZmxhZ3NbSTkxNV9OVU1fUklOR1NdOworCXNwaW5s b2NrX3QgICAgICAgICAgbG9jazsKKworCS8qIFR1bmluZyBwYXJhbWV0ZXJzOiAqLworCWludDMy X3QgICAgICAgICAgICAgcHJpb3JpdHlfbGV2ZWxfbWluOworCWludDMyX3QgICAgICAgICAgICAg cHJpb3JpdHlfbGV2ZWxfbWF4OworCWludDMyX3QgICAgICAgICAgICAgcHJpb3JpdHlfbGV2ZWxf cHJlZW1wdDsKKwl1aW50MzJfdCAgICAgICAgICAgIG1pbl9mbHlpbmc7Cit9OworCisvKiBGbGFn IGJpdHMgZm9yIGk5MTVfc2NoZWR1bGVyOjpmbGFncyAqLworZW51bSB7CisJaTkxNV9zZl9pbnRl cnJ1cHRzX2VuYWJsZWQgID0gKDEgPDwgMCksCisJaTkxNV9zZl9zdWJtaXR0aW5nICAgICAgICAg ID0gKDEgPDwgMSksCit9OworCitpbnQgICAgICAgICBpOTE1X3NjaGVkdWxlcl9pbml0KHN0cnVj dCBkcm1fZGV2aWNlICpkZXYpOworaW50ICAgICAgICAgaTkxNV9zY2hlZHVsZXJfcXVldWVfZXhl Y2J1ZmZlcihzdHJ1Y3QgaTkxNV9zY2hlZHVsZXJfcXVldWVfZW50cnkgKnFlKTsKK2Jvb2wgICAg ICAgIGk5MTVfc2NoZWR1bGVyX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVx dWVzdCAqcmVxKTsKKworI2VuZGlmICAvKiBfSTkxNV9TQ0hFRFVMRVJfSF8gKi8KLS0gCjEuOS4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=