From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vinay Belgaumkar Subject: [PATCH i-g-t] tests/gem_softpin: New tests for softpin feature Date: Thu, 3 Dec 2015 00:36:32 -0800 Message-ID: <1449131792-10008-1-git-send-email-vinay.belgaumkar@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 3A2F86EC6C for ; Thu, 3 Dec 2015 08:37:18 -0800 (PST) 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 Cc: Vinay Belgaumkar List-Id: intel-gfx@lists.freedesktop.org VGhlc2UgdGVzdHMgZXhlcmNpc2UgdGhlIHVzZXJwdHIgaW9jdGwgdG8gY3JlYXRlIHNoYXJlZCBi dWZmZXJzCmJldHdlZW4gQ1BVIGFuZCBHUFUuIFRoZXkgY29udGFpbiBlcnJvciBhbmQgbm9ybWFs IHVzYWdlIHNjZW5hcmlvcy4KVGhleSBhbHNvIGNvbnRhaW4gYSBjb3VwbGUgb2Ygc3RyZXNzIHRl c3RzIHdoaWNoIGNvcHkgYnVmZmVycyBiZXR3ZWVuCkNQVSBhbmQgR1BVLiBUaGVzZSB0ZXN0cyBy ZWx5IG9uIHRoZSBzb2Z0cGluIHBhdGNoIGluIG9yZGVyIHRvIHBpbiBidWZmZXJzCnRvIGEgY2Vy dGFpbiBWQS4KCkNhdmVhdDogVGhlc2UgdGVzdHMgd2VyZSBkZXNpZ25lZCB0byBydW4gb24gNjQt Yml0IHN5c3RlbS4gRnV0dXJlIHdvcmsKaW5jbHVkZXMgYWRkaW5nIGxvZ2ljIHRvIGVuc3VyZSB0 aGVzZSB0ZXN0cyBjYW4gcnVuIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGgKUFBHVFQgc3VwcG9ydC4g U29tZSB0ZXN0cyBhcmUgY3VycmVudGx5IGRpc2FibGVkIGZvciAzMi1iaXQgc3lzdGVtcyBmb3Ig dGhhdApyZWFzb24uCgp2MjogQWRkZWQgY2MgYW5kIHNpZ25lZC1vZmYtYnkgZmllbGRzCgp2Mzog Rml4ZWQgcmV2aWV3IGNvbW1lbnRzLCBhZGRlZCBoZWxwZXIgZnVuY3Rpb25zLiBSZW1vdmVkIHVz ZXJwdHIgZXJyb3IKc2NlbmFyaW9zIGNvdmVyZWQgYnkgZXhpc3RpbmcgdXNlcnB0ciB0ZXN0cy4g TW9kaWZpZWQgc3RyZXNzIHRlc3QgdG8gaGF2ZQoxMDBLIGJ1ZmZlcnMsIGl0IG5vdyBydW5zIGZv ciB+MzAgbWlucywgY2hlY2tzIGV2ZXJ5IGVsZW1lbnQgaGFzIGJlZW4gd3JpdHRlbgp0byBjb3Jy ZWN0bHksIGFuZCBwaW5zIGJ1ZmZlcnMgYXQgZGlmZmVyZW50IFZNQXMuCgp2NDogQ2hhbmdlZCBu YW1lIHRvIGdlbV9zb2Z0cGluCgp2NTogTW9yZSBmaXhlcy4gUmVtb3ZlZCB0aGUgZmlsZSBiYXNl ZCB0ZXN0cywgd2lsbCBtb3ZlIHRoZW0gdG8gdXNlcnB0ciB0ZXN0cy4KQWRkZWQgYSBmdW5jdGlv biB0aGF0IHZhbGlkYXRlcyBhcHByb3ByaWF0ZSBQUEdUVCBzdXBwb3J0IGJlZm9yZSBydW5uaW5n IHRlc3RzLgpPcHRpbWl6ZWQgc3RhY2sgc3BhY2UgYW5kIG1lbW9yeSBmb290cHJpbnQgaW4gc3Ry ZXNzIHRlc3QuIFJlbW92ZWQgdGhlIGV2aWN0aW9uCnRlc3QsIHdpbGwgYWRkIGl0IGJhY2sgYWZ0 ZXIgdmVyaWZ5aW5nIHByb3BlciBmdW5jdGlvbmFsaXR5LgoKdjY6IFNwbGl0IGJhc2ljIHRlc3Qg aW50byB1c2VycHRyIGFuZCBibwpGaXhlZCBzb21lIGNvZGluZyBzdHlsZSBpc3N1ZXMuCgp2Nzog RW5oYW5jZWQgaW52YWxpZCB2bWEgcGlubmluZyB0ZXN0IHRvIHZlcmlmeSAzMi1iaXQgUFBHVFQg ZnVuY3Rpb25hbGl0eS4KRW5hYmxlZCB0aGUgdGVzdCBmb3IgMzItYml0IFBQR1RUIHN5c3RlbXMs IGFuZCB2ZXJpZnkgcGlubmluZyBmYWlscyBhYm92ZQozMi1iaXQgYWRkcmVzc2VzLiBFbmhhbmNl ZCB0aGUgaGlnaCBhZHJlc3MgcGlubmluZyB0ZXN0IHRvIGVuc3VyZSBwaW5uaW5nCmZhaWxzIHdo ZW4gRVhFQ19PQkpFQ1RfUElOTkVEIGZsYWcgaXMgbm90IHVzZWQuIFNvbWUgbW9yZSBjb3NtZXRp YyBmaXhlcyB0bwpjbG9zZSBidWZmZXIgaGFuZGxlcy4gQ2hhbmdlZCB1c2VycHRyIGZ1bmN0aW9u IHRvIHVzZWQgc3luY2hyb25pemVkIG9wZXJhdGlvbnMuCgp2ODogTWlub3IgY2hhbmdlIHRvIGhp Z2ggYWRkcmVzcyBwaW5uaW5nIHRlc3QgYXMgcGVyIGNvbW1lbnQuCgp2OTogU2tpcCB0aGUgdGVz dHMgaWYgc29mdHBpbiBzdXBwb3J0IGlzIG5vdCBwcmVzZW50LgoKdjEwOiBSZW1vdmVkIHRyYWls aW5nIHdoaXRlIHNwYWNlcy4KCkNjOiBNaWNoZWwgVGhpZXJyeSA8bWljaGVsLnRoaWVycnlAaW50 ZWwuY29tPgpDYzogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KU2ln bmVkLW9mZi1ieTogVmluYXkgQmVsZ2F1bWthciA8dmluYXkuYmVsZ2F1bWthckBpbnRlbC5jb20+ Ci0tLQogdGVzdHMvLmdpdGlnbm9yZSAgICAgICB8ICAgIDEgKwogdGVzdHMvTWFrZWZpbGUuc291 cmNlcyB8ICAgIDEgKwogdGVzdHMvZ2VtX3NvZnRwaW4uYyAgICB8IDEwODYgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEw ODggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2dlbV9zb2Z0cGluLmMK CmRpZmYgLS1naXQgYS90ZXN0cy8uZ2l0aWdub3JlIGIvdGVzdHMvLmdpdGlnbm9yZQppbmRleCA4 MGFmOWE3Li40MjQ4NzBiIDEwMDY0NAotLS0gYS90ZXN0cy8uZ2l0aWdub3JlCisrKyBiL3Rlc3Rz Ly5naXRpZ25vcmUKQEAgLTIxLDYgKzIxLDcgQEAgZ2VtX2JhZF9ibGl0CiBnZW1fYmFkX2xlbmd0 aAogZ2VtX2JhZF9yZWxvYwogZ2VtX2Jhc2ljCitnZW1fc29mdHBpbgogZ2VtX2NhY2hpbmcKIGdl bV9jbG9zZV9yYWNlCiBnZW1fY29uY3VycmVudF9hbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2Vm aWxlLnNvdXJjZXMgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDhmYjJkZTguLjIwMDhk NGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZp bGUuc291cmNlcwpAQCAtMTEsNiArMTEsNyBAQCBURVNUU19wcm9nc19NID0gXAogCWRydl9oYW5n bWFuIFwKIAlnZW1fYmFkX3JlbG9jIFwKIAlnZW1fYmFzaWMgXAorCWdlbV9zb2Z0cGluIFwKIAln ZW1fY2FjaGluZyBcCiAJZ2VtX2Nsb3NlX3JhY2UgXAogCWdlbV9jb25jdXJyZW50X2JsaXQgXApk aWZmIC0tZ2l0IGEvdGVzdHMvZ2VtX3NvZnRwaW4uYyBiL3Rlc3RzL2dlbV9zb2Z0cGluLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMzY5NAotLS0gL2Rldi9udWxsCisr KyBiL3Rlc3RzL2dlbV9zb2Z0cGluLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogQ29weXJp Z2h0IMKpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVi eSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICog Y29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMg KHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5l eHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJz dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFV VEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFH RVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisg KiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFZpbmF5IEJlbGdhdW1r YXIgPHZpbmF5LmJlbGdhdW1rYXJAaW50ZWwuY29tPgorICogICAgVGhvbWFzIERhbmllbCA8dGhv bWFzLmRhbmllbEBpbnRlbC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNp bmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5o PgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50 dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5j bHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxtYWxs b2MuaD4KKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpb2N0bF93cmFwcGVycy5oIgorI2lu Y2x1ZGUgImRybXRlc3QuaCIKKyNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCisjaW5jbHVkZSAi aW50ZWxfaW8uaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgor I2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5 cy9zaG0uaD4KKyNpbmNsdWRlICJpZ3Rfa21zLmgiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNp bmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lIEJP X1NJWkUgNDA5NgorI2RlZmluZSBNVUxUSVBBR0VfQk9fU0laRSAyICogQk9fU0laRQorI2RlZmlu ZSBTVE9SRV9CQVRDSF9CVUZGRVJfU0laRSA0CisjZGVmaW5lIEVYRUNfT0JKRUNUX1BJTk5FRAko MTw8NCkKKyNkZWZpbmUgRVhFQ19PQkpFQ1RfU1VQUE9SVFNfNDhCX0FERFJFU1MgKDE8PDMpCisj ZGVmaW5lIFNIQVJFRF9CVUZGRVJfU0laRSA0MDk2CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1 X2dlbV91c2VycHRyIGk5MTVfZ2VtX3VzZXJwdHI7CisKK3N0YXRpYyB1aW50MzJfdCBpbml0X3Vz ZXJwdHIoaW50IGZkLCBpOTE1X2dlbV91c2VycHRyICosIHZvaWQgKnB0ciwgdWludDY0X3Qgc2l6 ZSk7CitzdGF0aWMgdm9pZCAqY3JlYXRlX21lbV9idWZmZXIodWludDY0X3Qgc2l6ZSk7CitzdGF0 aWMgaW50IGdlbV9jYWxsX3VzZXJwdHJfaW9jdGwoaW50IGZkLCBpOTE1X2dlbV91c2VycHRyICp1 c2VycHRyKTsKK3N0YXRpYyB2b2lkIGdlbV9waW5fdXNlcnB0cl90ZXN0KHZvaWQpOworc3RhdGlj IHZvaWQgZ2VtX3Bpbl9ib190ZXN0KHZvaWQpOworc3RhdGljIHZvaWQgZ2VtX3Bpbl9pbnZhbGlk X3ZtYV90ZXN0KHZvaWQpOworc3RhdGljIHZvaWQgZ2VtX3Bpbl9vdmVybGFwX3Rlc3Qodm9pZCk7 CitzdGF0aWMgdm9pZCBnZW1fcGluX2hpZ2hfYWRkcmVzc190ZXN0KHZvaWQpOworCisjZGVmaW5l IE5PX1BQR1RUIDAKKyNkZWZpbmUgQUxJQVNJTkdfUFBHVFQgMQorI2RlZmluZSBGVUxMXzMyX0JJ VF9QUEdUVCAyCisjZGVmaW5lIEZVTExfNDhfQklUX1BQR1RUIDMKKy8qIHVzZXNfZnVsbF9wcGd0 dAorICogRmluZHMgc3VwcG9ydGVkIFBQR1RUIGRldGFpbHMuCisgKiBAZmQgRFJNIGZkCisgKiBA bWluIGNhbiBiZQorICogMCAtIE5vIFBQR1RUCisgKiAxIC0gQWxpYXNpbmcgUFBHVFQKKyAqIDIg LSBGdWxsIFBQR1RUICgzMmIpCisgKiAzIC0gRnVsbCBQUEdUVCAoNDhiKQorICogUkVUVVJOUyB0 cnVlL2ZhbHNlIGlmIG1pbiBzdXBwb3J0IGlzIHByZXNlbnQKKyovCitzdGF0aWMgYm9vbCB1c2Vz X2Z1bGxfcHBndHQoaW50IGZkLCBpbnQgbWluKQoreworCXN0cnVjdCBkcm1faTkxNV9nZXRwYXJh bSBncDsKKwlpbnQgdmFsID0gMDsKKworCW1lbXNldCgmZ3AsIDAsIHNpemVvZihncCkpOworCWdw LnBhcmFtID0gMTg7IC8qIEhBU19BTElBU0lOR19QUEdUVCAqLworCWdwLnZhbHVlID0gJnZhbDsK KworCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCkpCisJCXJl dHVybiAwOworCisJZXJybm8gPSAwOworCXJldHVybiB2YWwgPj0gbWluOworfQorCisvKiBoYXNf c29mdHBpbl9zdXBwb3J0CisgKiBGaW5kcyBpZiBzb2Z0cGluIGZlYXR1cmUgaXMgc3VwcG9ydGVk CisgKiBAZmQgRFJNIGZkCisqLworc3RhdGljIGJvb2wgaGFzX3NvZnRwaW5fc3VwcG9ydChpbnQg ZmQpCit7CisJc3RydWN0IGRybV9pOTE1X2dldHBhcmFtIGdwOworCWludCB2YWwgPSAwOworCisJ bWVtc2V0KCZncCwgMCwgc2l6ZW9mKGdwKSk7CisJZ3AucGFyYW0gPSAzNzsgLyogSTkxNV9QQVJB TV9IQVNfRVhFQ19TT0ZUUElOICovCisJZ3AudmFsdWUgPSAmdmFsOworCisJaWYgKGRybUlvY3Rs KGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKSkKKwkJcmV0dXJuIDA7CisKKwllcnJu byA9IDA7CisJcmV0dXJuICh2YWwgPT0gMSk7Cit9CisKKy8qIGdlbV9jYWxsX3VzZXJwdHJfaW9j dGwKKyAqIEhlbHBlciB0byBjYWxsIGlvY3RsIC0gVE9ETzogbW92ZSB0byBsaWIKKyAqIEBmZCAt IGRybSBmZAorICogQHVzZXJwdHIgLSBwb2ludGVyIHRvIGluaXRpYWxpc2VkIHVzZXJwdHIKKyAq IFJFVFVSTlMgc3RhdHVzIG9mIGlvY3RsIGNhbGwKKyovCitzdGF0aWMgaW50IGdlbV9jYWxsX3Vz ZXJwdHJfaW9jdGwoaW50IGZkLCBpOTE1X2dlbV91c2VycHRyICp1c2VycHRyKQoreworCWludCBy ZXQ7CisKKwlyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsIHVz ZXJwdHIpOworCisJaWYgKHJldCkKKwkJcmV0ID0gZXJybm87CisKKwlyZXR1cm4gcmV0OworfQor CisvKiBpbml0X3VzZXJwdHIKKyAqIEhlbHBlciB0aGF0IGluaXRzIHVzZXJwdHIgYW4gcmV0dXJu cyBoYW5kbGUKKyAqIEBmZCAtIGRybSBmZAorICogQHVzZXJwdHIgLSBwb2ludGVyIHRvIGVtcHR5 IHVzZXJwdHIKKyAqIEBwdHIgLSBidWZmZXIgdG8gYmUgc2hhcmVkCisgKiBAc2l6ZSAtIHNpemUg b2YgYnVmZmVyCisgKiBAcm8gLSByZWFkIG9ubHkgZmxhZworICogUkVUVVJOUyBoYW5kbGUgdG8g c2hhcmVkIGJ1ZmZlcgorKi8KK3N0YXRpYyB1aW50MzJfdCBpbml0X3VzZXJwdHIoaW50IGZkLCBp OTE1X2dlbV91c2VycHRyICp1c2VycHRyLCB2b2lkICpwdHIsCisJCQkgICAgIHVpbnQ2NF90IHNp emUpCit7CisJaW50IHJldDsKKworCW1lbXNldCgodm9pZCopdXNlcnB0ciwgMCwgc2l6ZW9mKGk5 MTVfZ2VtX3VzZXJwdHIpKTsKKworCXVzZXJwdHItPnVzZXJfcHRyID0gKHVpbnQ2NF90KXB0cjsg LyogTmVlZCB0aGUgY2FzdCB0byBvdmVyY29tZSBjb21waWxlciB3YXJuaW5nICovCisJdXNlcnB0 ci0+dXNlcl9zaXplID0gc2l6ZTsKKwl1c2VycHRyLT5mbGFncyA9IDA7IC8qIHVzZSBzeW5jaHJv bml6ZWQgb3BlcmF0aW9uICovCisKKwlyZXQgPSBnZW1fY2FsbF91c2VycHRyX2lvY3RsKGZkLCB1 c2VycHRyKTsKKwlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7CisKKwlyZXR1cm4gdXNlcnB0ci0+aGFu ZGxlOworfQorCisvKiBjcmVhdGVfbWVtX2J1ZmZlcgorICogQ3JlYXRlcyBhIDRLIGFsaWduZWQg Q1BVIGJ1ZmZlcgorICogQHNpemUgLSBzaXplIG9mIGJ1ZmZlcgorICogUkVUVVJOUyBwb2ludGVy IHRvIGJ1ZmZlciBvZiBAc2l6ZQorKi8KK3N0YXRpYyB2b2lkICpjcmVhdGVfbWVtX2J1ZmZlcih1 aW50NjRfdCBzaXplKQoreworCXZvaWQgKmFkZHI7CisJaW50IHJldDsKKworCXJldCA9IHBvc2l4 X21lbWFsaWduKCZhZGRyLCA0MDk2LCBzaXplKTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKwor CXJldHVybiBhZGRyOworfQorCisvKiBzZXR1cF9leGVjX29iagorICogcG9wdWxhdGUgZXhlYyBv YmplY3QKKyAqIEBleGVjIC0gZXhlYyBvYmplY3QKKyAqIEBoYW5kbGUgLSBoYW5kbGUgdG8gZ2Vt IGJ1ZmZlcgorICogQGZsYWdzIC0gYW55IGZsYWdzCisgKiBAb2Zmc2V0IC0gcmVxdWVzdGVkIFZN QQorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2V4ZWNfb2JqKHN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y19vYmplY3QyICpleGVjLAorCQkJICAgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCBmbGFncywK KwkJCSAgIHVpbnQ2NF90IG9mZnNldCkKK3sKKwltZW1zZXQoZXhlYywgMCwgc2l6ZW9mKHN0cnVj dCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyKSk7CisJZXhlYy0+aGFuZGxlID0gaGFuZGxlOwor CWV4ZWMtPmZsYWdzID0gZmxhZ3M7CisJZXhlYy0+b2Zmc2V0ID0gb2Zmc2V0OworfQorCisvKiBn ZW1fc3RvcmVfZGF0YV9zdm0KKyAqIHBvcHVsYXRlIGJhdGNoIGJ1ZmZlciB3aXRoIE1JX1NUT1JF X0RXT1JEX0lNTSBjb21tYW5kCisgKiBAZmQ6IGRybSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBjbWRf YnVmOiBiYXRjaCBidWZmZXIKKyAqIEB2YWRkcjogZGVzdGluYXRpb24gVmlydHVhbCBhZGRyZXNz CisgKiBAZGF0YTogZGF0YSB0byBiZSBzdG9yZSBhdCBkZXN0aW5hdGlvbgorICogQGVuZDogd2hl dGhlciB0byBlbmQgYmF0Y2ggYnVmZmVyIG9yIG5vdAorKi8KK3N0YXRpYyBpbnQgZ2VtX3N0b3Jl X2RhdGFfc3ZtKGludCBmZCwgdWludDMyX3QgKmNtZF9idWYsIHVpbnQ2NF90IHZhZGRyLAorCQkJ ICAgICAgdWludDMyX3QgZGF0YSwgYm9vbCBlbmQpCit7CisJaW50IGkgPSAwOworCisJY21kX2J1 ZltpKytdID0gTUlfU1RPUkVfRFdPUkRfSU1NOworCWNtZF9idWZbaSsrXSA9IHZhZGRyICYgMHhG RkZGRkZGQzsKKwljbWRfYnVmW2krK10gPSAodmFkZHIgPj4gMzIpICYgMHhGRkZGOyAvKiBiaXRz IDMyOjQ3ICovCisKKwljbWRfYnVmW2krK10gPSBkYXRhOworCWlmIChlbmQpIHsKKwkJY21kX2J1 ZltpKytdID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwkJY21kX2J1ZltpKytdID0gMDsKKwl9CisK KwlyZXR1cm4oaSAqIHNpemVvZih1aW50MzJfdCkpOworfQorCisvKiBnZW1fc3RvcmVfZGF0YQor ICogcG9wdWxhdGUgYmF0Y2ggYnVmZmVyIHdpdGggTUlfU1RPUkVfRFdPUkRfSU1NIGNvbW1hbmQK KyAqIFRoaXMgb25lIGZpbGxzIHVwIHJlbG9jIGJ1ZmZlciBhcyB3ZWxsCisgKiBAZmQ6IGRybSBm aWxlIGRlc2NyaXB0b3IKKyAqIEBjbWRfYnVmOiBiYXRjaCBidWZmZXIKKyAqIEBkYXRhOiBkYXRh IHRvIGJlIHN0b3JlIGF0IGRlc3RpbmF0aW9uCisgKiBAcmVsb2MgLSByZWxvY2F0aW9uIGVudHJ5 CisgKiBAZW5kOiB3aGV0aGVyIHRvIGVuZCBiYXRjaCBidWZmZXIgb3Igbm90CisqLworc3RhdGlj IGludCBnZW1fc3RvcmVfZGF0YShpbnQgZmQsIHVpbnQzMl90ICpjbWRfYnVmLAorCQkJICB1aW50 MzJfdCBoYW5kbGUsIHVpbnQzMl90IGRhdGEsCisJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVs b2NhdGlvbl9lbnRyeSAqcmVsb2MsCisJCQkgIGJvb2wgZW5kKQoreworCWludCBpID0gMDsKKwor CWNtZF9idWZbaSsrXSA9IE1JX1NUT1JFX0RXT1JEX0lNTTsKKwljbWRfYnVmW2krK10gPSAwOyAv KiBsb3dlciAzMSBiaXRzIG9mIDQ4IGJpdCBhZGRyZXNzIC0gMCByZWxvYyBuZWVkZWQgKi8KKwlj bWRfYnVmW2krK10gPSAwOyAvKiB1cHBlciAxNSBiaXRzIG9mIDQ4IGJpdCBhZGRyZXNzIC0gMCBy ZWxvYyBuZWVkZWQgKi8KKwlyZWxvYy0+b2Zmc2V0ID0gMSAqIHNpemVvZih1aW50MzJfdCk7CisJ cmVsb2MtPmRlbHRhID0gMDsKKwlyZWxvYy0+dGFyZ2V0X2hhbmRsZSA9IGhhbmRsZTsKKwlyZWxv Yy0+cmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKKwlyZWxvYy0+d3JpdGVf ZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKKwlyZWxvYy0+cHJlc3VtZWRfb2Zmc2V0 ID0gMDsKKwljbWRfYnVmW2krK10gPSBkYXRhOworCWlmIChlbmQpIHsKKwkJY21kX2J1ZltpKytd ID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwkJY21kX2J1ZltpKytdID0gMDsKKwl9CisKKwlyZXR1 cm4gKGkgKiBzaXplb2YodWludDMyX3QpKTsKK30KKworLyogc2V0dXBfZXhlY2J1ZmZlcgorICog aGVscGVyIGZvciBidWZmZXIgZXhlY3V0aW9uCisgKiBAZXhlY2J1ZiAtIHBvaW50ZXIgdG8gZXhl Y2J1ZmZlcgorICogQGV4ZWNfb2JqZWN0IC0gcG9pbnRlciB0byBleGVjIG9iamVjdDIgc3RydWN0 CisgKiBAcmluZyAtIHJpbmcgdG8gYmUgdXNlZAorICogQGJ1ZmZlcl9jb3VudCAtIGhvdyBtYW51 IGJ1ZmZlcnMgdG8gc3VibWl0CisgKiBAYmF0Y2hfbGVuZ3RoIC0gbGVuZ3RoIG9mIGJhdGNoIGJ1 ZmZlcgorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2V4ZWNidWZmZXIoc3RydWN0IGRybV9pOTE1X2dl bV9leGVjYnVmZmVyMiAqZXhlY2J1ZiwKKwkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVj X29iamVjdDIgKmV4ZWNfb2JqZWN0LAorCQkJICAgICBpbnQgcmluZywgaW50IGJ1ZmZlcl9jb3Vu dCwgaW50IGJhdGNoX2xlbmd0aCkKK3sKKwlleGVjYnVmLT5idWZmZXJzX3B0ciA9ICh1aW50NjRf dClleGVjX29iamVjdDsKKwlleGVjYnVmLT5idWZmZXJfY291bnQgPSBidWZmZXJfY291bnQ7CisJ ZXhlY2J1Zi0+YmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMDsKKwlleGVjYnVmLT5iYXRjaF9sZW4gPSBi YXRjaF9sZW5ndGg7CisJZXhlY2J1Zi0+Y2xpcHJlY3RzX3B0ciA9IDA7CisJZXhlY2J1Zi0+bnVt X2NsaXByZWN0cyA9IDA7CisJZXhlY2J1Zi0+RFIxID0gMDsKKwlleGVjYnVmLT5EUjQgPSAwOwor CWV4ZWNidWYtPmZsYWdzID0gcmluZzsKKwlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lk KCpleGVjYnVmLCAwKTsKKwlleGVjYnVmLT5yc3ZkMiA9IDA7Cit9CisKKy8qIHN1Ym1pdF9hbmRf c3luYworICogSGVscGVyIGZ1bmN0aW9uIGZvciBleGVjIGFuZCBzeW5jIGZ1bmN0aW9ucworICog QGZkIC0gZHJtIGZkCisgKiBAZXhlY2J1ZiAtIHBvaW50ZXIgdG8gZXhlY2J1ZmZlcgorICogQGJh dGNoX2J1Zl9oYW5kbGUgLSBiYXRjaCBidWZmZXIgaGFuZGxlCisqLworc3RhdGljIHZvaWQgc3Vi bWl0X2FuZF9zeW5jKGludCBmZCwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhl Y2J1ZiwKKwkJCSAgICB1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlKQoreworCWdlbV9leGVjYnVm KGZkLCBleGVjYnVmKTsKKwlnZW1fc3luYyhmZCwgYmF0Y2hfYnVmX2hhbmRsZSk7Cit9CisKKy8q IGdlbV91c2VycHRyX3N5bmMKKyAqIGhlbHBlciBmb3Igc3luY2luZyB0byBDUFUgZG9tYWluIC0g Y29weS9wYXN0ZSBmcm9tIHVzZXJibGl0CisgKiBAZmQgLSBkcm0gZmQKKyAqIEBoYW5kbGUgLSBi dWZmZXIgaGFuZGxlIHRvIHN5bmMKKyovCitzdGF0aWMgdm9pZCBnZW1fdXNlcnB0cl9zeW5jKGlu dCBmZCwgdWludDMyX3QgaGFuZGxlKQoreworCWdlbV9zZXRfZG9tYWluKGZkLCBoYW5kbGUsIEk5 MTVfR0VNX0RPTUFJTl9DUFUsIEk5MTVfR0VNX0RPTUFJTl9DUFUpOworfQorCisKKy8qIGdlbV9w aW5fdXNlcnB0cl90ZXN0CisgKiBUaGlzIHRlc3Qgd2lsbCBjcmVhdGUgYSBzaGFyZWQgYnVmZmVy LCBhbmQgY3JlYXRlIGEgY29tbWFuZAorICogZm9yIEdQVSB0byB3cml0ZSBkYXRhIGluIGl0Cisg KiBDUFUgd2lsbCByZWFkIGFuZCBtYWtlIHN1cmUgZXhwZWN0ZWQgdmFsdWUgaXMgb2J0YWluZWQK KyAqIE1hbGxvYyBhIDRLIGJ1ZmZlcgorICogU2hhcmUgYnVmZmVyIHdpdGggd2l0aCBHUFUgYnkg dXNpbmcgdXNlcnB0ciBpb2N0bAorICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRB IHRvIGZpcnN0IGR3b3JkIG9mIGJ1ZmZlcgorICogVXNlIDB4MTAwMCBhZGRyZXNzIGFzIGRlc3Rp bmF0aW9uIGFkZHJlc3MgaW4gYmF0Y2ggYnVmZmVyCisgKiBTZXQgRVhFQ19PQkpFQ1RfUElOTkVE IGZsYWcgaW4gZXhlYyBvYmplY3QKKyAqIFNldCAnb2Zmc2V0JyBpbiBleGVjIG9iamVjdCB0byAw eDEwMDAKKyAqIFN1Ym1pdCBleGVjYnVmZmVyCisgKiBWZXJpZnkgdmFsdWUgb2YgZmlyc3QgRFdP UkQgaW4gc2hhcmVkIGJ1ZmZlciBtYXRjaGVzIERBVEEKKyovCitzdGF0aWMgdm9pZCBnZW1fcGlu X3VzZXJwdHJfdGVzdCh2b2lkKQoreworCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKKwlpbnQg ZmQ7CisJdWludDMyX3QgKnNoYXJlZF9idWZmZXI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBleGVjYnVmOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNf b2JqZWN0MlsyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZmZXJbU1RPUkVfQkFUQ0hfQlVGRkVSX1NJ WkUgKyAyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlLCBzaGFyZWRfYnVmX2hhbmRsZTsK KwlpbnQgcmluZywgbGVuOworCWNvbnN0IHVpbnQzMl90IGRhdGEgPSAweDEyMzQ1Njc4OworCXVp bnQ2NF90IHBpbm5pbmdfb2Zmc2V0ID0gMHgxMDAwOworCisJZmQgPSBkcm1fb3Blbl9kcml2ZXIo RFJJVkVSX0lOVEVMKTsKKwlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEFMSUFTSU5H X1BQR1RUKSk7CisJaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9ydChmZCkpOworCWJhdGNo X2J1Zl9oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBCT19TSVpFKTsKKworCS8qIGNyZWF0ZSBjcHUg YnVmZmVyICovCisJc2hhcmVkX2J1ZmZlciA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJWkUpOwor CisJLyogc2hhcmUgd2l0aCBHUFUgKi8KKwlzaGFyZWRfYnVmX2hhbmRsZSA9IGluaXRfdXNlcnB0 cihmZCwgJnVzZXJwdHIsIHNoYXJlZF9idWZmZXIsCisJCQkJCSBCT19TSVpFKTsKKworCS8qIGNy ZWF0ZSBjb21tYW5kIGJ1ZmZlciB3aXRoIHdyaXRlIGNvbW1hbmQgKi8KKwlsZW4gPSBnZW1fc3Rv cmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciwgcGlubmluZ19vZmZzZXQsIGRhdGEsIHRydWUp OworCWdlbV93cml0ZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVyLCBsZW4p OworCisJLyogc3VibWl0IGNvbW1hbmQgYnVmZmVyICovCisJc2V0dXBfZXhlY19vYmooJmV4ZWNf b2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUsCisJCSAgICAgICBFWEVDX09CSkVDVF9QSU5O RUQsIHBpbm5pbmdfb2Zmc2V0KTsKKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzFdLCBi YXRjaF9idWZfaGFuZGxlLCAwLCAwKTsKKworCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVSOworCisJ c2V0dXBfZXhlY2J1ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOwor CXN1Ym1pdF9hbmRfc3luYyhmZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5kbGUpOworCWdlbV91 c2VycHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKKworCS8qIENoZWNrIGlmIGRyaXZl ciBwaW5uZWQgdGhlIGJ1ZmZlciBhcyByZXF1ZXN0ZWQgKi8KKwlpZ3RfZmFpbF9vbl9mKGV4ZWNf b2JqZWN0MlswXS5vZmZzZXQgIT0gcGlubmluZ19vZmZzZXQsCisJCQkiXG5GYWlsZWQgdG8gcGlu IGF0IHJlcXVlc3RlZCBvZmZzZXQiKTsKKwkvKiBjaGVjayBvbiBDUFUgdG8gc2VlIGlmIHZhbHVl IGNoYW5nZXMgKi8KKwlpZ3RfZmFpbF9vbl9mKHNoYXJlZF9idWZmZXJbMF0gIT0gZGF0YSwKKwkJ ICAgICAgIlxuQ1BVIHJlYWQgZG9lcyBub3QgbWF0Y2ggR1BVIHdyaXRlLFwKKwkJCWV4cGVjdGVk OiAweCV4LCBnb3Q6IDB4JXhcbiIsCisJCQlkYXRhLCBzaGFyZWRfYnVmZmVyWzBdKTsKKworCWdl bV9jbG9zZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSk7CisJZ2VtX2Nsb3NlKGZkLCBzaGFyZWRfYnVm X2hhbmRsZSk7CisJY2xvc2UoZmQpOworCWZyZWUoc2hhcmVkX2J1ZmZlcik7Cit9CisKKy8qIGdl bV9waW5fYm8KKyAqIFRoaXMgdGVzdCB3aWxsIHRlc3Qgc29mdHBpbm5pbmcgb2YgYSBnZW0gYnVm ZmVyIG9iamVjdAorICogTWFsbG9jIGEgNEsgYnVmZmVyCisgKiBDcmVhdGUgYmF0Y2ggYnVmZmVy IHRvIHdyaXRlIERBVEEgdG8gZmlyc3QgZHdvcmQgb2YgYnVmZmVyCisgKiBVc2UgMHgxMDAwIGFk ZHJlc3MgYXMgZGVzdGluYXRpb24gYWRkcmVzcyBpbiBiYXRjaCBidWZmZXIKKyAqIFNldCBFWEVD X09CSkVDVF9QSU5ORUQgZmxhZyBpbiBleGVjIG9iamVjdAorICogU2V0ICdvZmZzZXQnIGluIGV4 ZWMgb2JqZWN0IHRvIDB4MTAwMAorICogU3VibWl0IGV4ZWNidWZmZXIKKyAqIFZlcmlmeSB2YWx1 ZSBwaW5uZWQgb2Zmc2V0IG1hdGNoZXMgdGhlIHJlcXVlc3QKKyovCitzdGF0aWMgdm9pZCBnZW1f cGluX2JvX3Rlc3Qodm9pZCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBleGVjYnVmOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNf b2JqZWN0MlsyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZmZXJbU1RPUkVfQkFUQ0hfQlVGRkVSX1NJ WkUgKyAyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlLCB1bnNoYXJlZF9idWZfaGFuZGxl OworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSByZWxvY1s0XTsKKwlpbnQg cmluZywgbGVuOworCXVpbnQzMl90IHZhbHVlOworCWNvbnN0IHVpbnQzMl90IGRhdGEgPSAweDEy MzQ1Njc4OworCXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0ID0gMHgxMDAwOworCisJZmQgPSBkcm1f b3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKKwlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQo ZmQsIEFMSUFTSU5HX1BQR1RUKSk7CisJaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9ydChm ZCkpOworCisJYmF0Y2hfYnVmX2hhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIEJPX1NJWkUpOworCisJ LyogY3JlYXRlIGdlbSBidWZmZXIgKi8KKwl1bnNoYXJlZF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0 ZShmZCwgQk9fU0laRSk7CisKKwkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0aCB3cml0ZSBj b21tYW5kICovCisJbGVuID0gZ2VtX3N0b3JlX2RhdGEoZmQsIGJhdGNoX2J1ZmZlciwgdW5zaGFy ZWRfYnVmX2hhbmRsZSwgZGF0YSwKKwkJCQlyZWxvYywgdHJ1ZSk7CisJZ2VtX3dyaXRlKGZkLCBi YXRjaF9idWZfaGFuZGxlLCAwLCBiYXRjaF9idWZmZXIsIGxlbik7CisKKwkvKiBzdWJtaXQgY29t bWFuZCBidWZmZXIgKi8KKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCB1bnNoYXJl ZF9idWZfaGFuZGxlLAorCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVELCBwaW5uaW5nX29mZnNl dCk7CisJc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlsxXSwgYmF0Y2hfYnVmX2hhbmRsZSwg MCwgMCk7CisJZXhlY19vYmplY3QyWzFdLnJlbG9jYXRpb25fY291bnQgPSAxOworCWV4ZWNfb2Jq ZWN0MlsxXS5yZWxvY3NfcHRyID0gKHVpbnQ2NF90KXJlbG9jOworCisJcmluZyA9IEk5MTVfRVhF Q19SRU5ERVI7CisKKwlzZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJp bmcsIDIsIGxlbik7CisJc3VibWl0X2FuZF9zeW5jKGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hh bmRsZSk7CisKKwkvKiBDaGVjayBpZiBkcml2ZXIgcGlubmVkIHRoZSBidWZmZXIgYXMgcmVxdWVz dGVkICovCisJaWd0X2ZhaWxfb25fZihleGVjX29iamVjdDJbMF0ub2Zmc2V0ICE9IHBpbm5pbmdf b2Zmc2V0LAorCQkJIlxuRmFpbGVkIHRvIHBpbiBhdCByZXF1ZXN0ZWQgb2Zmc2V0Iik7CisJZ2Vt X3JlYWQoZmQsIHVuc2hhcmVkX2J1Zl9oYW5kbGUsIDAsICh2b2lkKikmdmFsdWUsIDQpOworCWln dF9hc3NlcnQodmFsdWUgPT0gZGF0YSk7CisKKwlnZW1fY2xvc2UoZmQsIGJhdGNoX2J1Zl9oYW5k bGUpOworCWdlbV9jbG9zZShmZCwgdW5zaGFyZWRfYnVmX2hhbmRsZSk7CisJY2xvc2UoZmQpOwor fQorCisKKy8qIGdlbV9tdWx0aXBsZV9wcm9jZXNzX3Rlc3QKKyAqIFJ1biBiYXNpYyB0ZXN0IHNp bXVsdGFuZW91c2x5IHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzCisgKiBUaGlzIHdpbGwgdGVzdCBw aW5uaW5nIHNhbWUgVkEgc2VwYXJhdGVseSBpbiBlYWNoIHByb2Nlc3MKKworICogZm9yaygpOwor ICogRXhlY3V0ZSBiYXNpYyB0ZXN0IGluIHBhcmVudC9jaGlsZCBwcm9jZXNzZXMKKyovCisjZGVm aW5lIE1BWF9OVU1fUFJPQ0VTU0VTIDEwCisKK3N0YXRpYyB2b2lkIGdlbV9tdWx0aXBsZV9wcm9j ZXNzX3Rlc3Qodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGRybV9vcGVuX2RyaXZlcihEUklW RVJfSU5URUwpOworCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChmZCwgQUxJQVNJTkdfUFBH VFQpKTsKKwlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7CisKKwlpZ3RfZm9y ayhjaGlsZCwgTUFYX05VTV9QUk9DRVNTRVMpIHsKKwkJZ2VtX3Bpbl91c2VycHRyX3Rlc3QoKTsK Kwl9CisJaWd0X3dhaXRjaGlsZHJlbigpOworCisJY2xvc2UoZmQpOworfQorCisKKy8qIGdlbV9y ZXBpbl90ZXN0CisgKiBUaGlzIHRlc3QgdHJpZXMgdG8gcmVwaW4gYSBidWZmZXIgYXQgYSBwcmV2 aW91c2x5IHBpbm5lZCB2bWEKKyAqIGZyb20gYSBkaWZmZXJlbnQgZXhlY2J1Zi4KKyAqIE1hbGxv YyBhIDRLIGJ1ZmZlcgorICogU2hhcmUgYnVmZmVyIHdpdGggd2l0aCBHUFUgYnkgdXNpbmcgdXNl cnB0ciBpb2N0bAorICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRBIHRvIGZpcnN0 IGR3b3JkIG9mIGJ1ZmZlcgorICogVXNlIDB4MTAwMCBhZGRyZXNzIGFzIGRlc3RpbmF0aW9uIGFk ZHJlc3MgaW4gYmF0Y2ggYnVmZmVyCisgKiBTZXQgRVhFQ19PQkpFQ1RfUElOTkVEIGZsYWcgaW4g ZXhlYyBvYmplY3QKKyAqIFNldCAnb2Zmc2V0JyBpbiBleGVjIG9iamVjdCB0byAweDEwMDAgVk1B CisgKiBTdWJtaXQgZXhlY2J1ZmZlcgorICogVmVyaWZ5IHZhbHVlIG9mIGZpcnN0IERXT1JEIGlu IHNoYXJlZCBidWZmZXIgbWF0Y2hlcyBEQVRBCisKKyAqIENyZWF0ZSBzZWNvbmQgc2hhcmVkIGJ1 ZmZlcgorICogRm9sbG93IGFsbCBzdGVwcyBhYm92ZQorICogRXhlY3B0LCBmb3Igb2Zmc2V0LCB1 c2UgVk1BIG9mIGZpcnN0IGJ1ZmZlciBhYm92ZQorICogU3VibWl0IGV4ZWNidWZmZXIKKyAqIFZl cmlmeSB2YWx1ZSBvZiBmaXJzdCBEV09SRCBpbiBzZWNvbmQgc2hhcmVkIGJ1ZmZlciBtYXRjaGVz IERBVEEKKyovCitzdGF0aWMgdm9pZCBnZW1fcmVwaW5fdGVzdCh2b2lkKQoreworCWk5MTVfZ2Vt X3VzZXJwdHIgdXNlcnB0cjsKKwlpOTE1X2dlbV91c2VycHRyIHVzZXJwdHIxOworCWludCBmZDsK Kwl1aW50MzJfdCAqc2hhcmVkX2J1ZmZlcjsKKwl1aW50MzJfdCAqc2hhcmVkX2J1ZmZlcjE7CisJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOworCXN0cnVjdCBkcm1faTkx NV9nZW1fZXhlY19vYmplY3QyIGV4ZWNfb2JqZWN0MlsyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZm ZXJbU1RPUkVfQkFUQ0hfQlVGRkVSX1NJWkUgKyAyXTsKKwl1aW50MzJfdCBiYXRjaF9idWZfaGFu ZGxlLCBzaGFyZWRfYnVmX2hhbmRsZSwgc2hhcmVkX2J1Zl9oYW5kbGUxOworCWludCByaW5nLCBs ZW47CisJY29uc3QgdWludDMyX3QgZGF0YSA9IDB4MTIzNDU2Nzg7CisJdWludDY0X3QgcGlubmlu Z19vZmZzZXQgPSAweDEwMDA7CisKKwkvKiBDcmVhdGUgZ2VtIG9iamVjdCAqLworCWZkID0gZHJt X29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7CisJaWd0X3JlcXVpcmUodXNlc19mdWxsX3BwZ3R0 KGZkLCBBTElBU0lOR19QUEdUVCkpOworCWlndF9yZXF1aXJlKGhhc19zb2Z0cGluX3N1cHBvcnQo ZmQpKTsKKworCWJhdGNoX2J1Zl9oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBCT19TSVpFKTsKKwor CS8qIGNyZWF0ZSBjcHUgYnVmZmVyLCBzZXQgZmlyc3QgZWxlbWVudHMgdG8gMHgwICovCisJc2hh cmVkX2J1ZmZlciA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJWkUpOworCXNoYXJlZF9idWZmZXIx ID0gY3JlYXRlX21lbV9idWZmZXIoQk9fU0laRSk7CisJc2hhcmVkX2J1ZmZlclswXSA9IDB4MDsK KwlzaGFyZWRfYnVmZmVyMVswXSA9IDB4MDsKKworCS8qIHNoYXJlIHdpdGggR1BVIGFuZCBnZXQg aGFuZGxlcyAqLworCXNoYXJlZF9idWZfaGFuZGxlID0gaW5pdF91c2VycHRyKGZkLCAmdXNlcnB0 ciwgc2hhcmVkX2J1ZmZlciwKKwkJCQkJIEJPX1NJWkUpOworCXNoYXJlZF9idWZfaGFuZGxlMSA9 IGluaXRfdXNlcnB0cihmZCwgJnVzZXJwdHIxLCBzaGFyZWRfYnVmZmVyMSwKKwkJCQkJICBCT19T SVpFKTsKKworCS8qIGNyZWF0ZSBjb21tYW5kIGJ1ZmZlciB3aXRoIHdyaXRlIGNvbW1hbmQgKi8K KwlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciwgcGlubmluZ19vZmZz ZXQsIGRhdGEsIHRydWUpOworCWdlbV93cml0ZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgYmF0 Y2hfYnVmZmVyLCBsZW4pOworCisJLyogc3VibWl0IGNvbW1hbmQgYnVmZmVyICovCisJc2V0dXBf ZXhlY19vYmooJmV4ZWNfb2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUsCisJCSAgICAgICBF WEVDX09CSkVDVF9QSU5ORUQsIHBpbm5pbmdfb2Zmc2V0KTsKKwlzZXR1cF9leGVjX29iaigmZXhl Y19vYmplY3QyWzFdLCBiYXRjaF9idWZfaGFuZGxlLCAwLCAwKTsKKworCXJpbmcgPSBJOTE1X0VY RUNfUkVOREVSOworCisJc2V0dXBfZXhlY2J1ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCBy aW5nLCAyLCBsZW4pOworCXN1Ym1pdF9hbmRfc3luYyhmZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9o YW5kbGUpOworCWdlbV91c2VycHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKKworCWln dF9hc3NlcnQoZXhlY19vYmplY3QyWzBdLm9mZnNldCA9PSBwaW5uaW5nX29mZnNldCk7CisJaWd0 X2Fzc2VydCgqc2hhcmVkX2J1ZmZlciA9PSBkYXRhKTsKKworCS8qIFNlY29uZCBidWZmZXIgKi8K KwkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0aCB3cml0ZSBjb21tYW5kICovCisJcGlubmlu Z19vZmZzZXQgPSBleGVjX29iamVjdDJbMF0ub2Zmc2V0OworCWxlbiA9IGdlbV9zdG9yZV9kYXRh X3N2bShmZCwgYmF0Y2hfYnVmZmVyLCBwaW5uaW5nX29mZnNldCwgZGF0YSwgdHJ1ZSk7CisJZ2Vt X3dyaXRlKGZkLCBiYXRjaF9idWZfaGFuZGxlLCAwLCBiYXRjaF9idWZmZXIsIGxlbik7CisKKwkv KiBzdWJtaXQgY29tbWFuZCBidWZmZXIgKi8KKwkvKiBQaW4gYXQgc2hhcmVkX2J1ZmZlciwgbm90 IHNoYXJlZF9idWZmZXIxICovCisJLyogV2UgYXJlIHJlcXVlc3RpbmcgYWRkcmVzcyB3aGVyZSBh bm90aGVyIGJ1ZmZlciB3YXMgcGlubmVkIHByZXZpb3VzbHkgKi8KKwlzZXR1cF9leGVjX29iaigm ZXhlY19vYmplY3QyWzBdLCBzaGFyZWRfYnVmX2hhbmRsZTEsCisJCSAgICAgICBFWEVDX09CSkVD VF9QSU5ORUQsIHBpbm5pbmdfb2Zmc2V0KTsKKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3Qy WzFdLCBiYXRjaF9idWZfaGFuZGxlLCAwLCAwKTsKKworCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVS OworCisJc2V0dXBfZXhlY2J1ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBs ZW4pOworCXN1Ym1pdF9hbmRfc3luYyhmZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5kbGUpOwor CWdlbV91c2VycHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlMSk7CisKKwlpZ3RfYXNzZXJ0 KGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQgPT0gcGlubmluZ19vZmZzZXQpOworCWlndF9hc3NlcnQo KnNoYXJlZF9idWZmZXIxID09IGRhdGEpOworCisJZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFu ZGxlKTsKKwlnZW1fY2xvc2UoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKKwljbG9zZShmZCk7CisK KwlmcmVlKHNoYXJlZF9idWZmZXIpOworCWZyZWUoc2hhcmVkX2J1ZmZlcjEpOworfQorCisKKy8q IGdlbV9yZXBpbl9vdmVybGFwX3Rlc3QKKyAqIFRoaXMgdGVzdCB3aWxsIGF0dGVtcHQgdG8gcGlu IHR3byBidWZmZXJzIGF0IHRoZSBzYW1lIFZNQSBhcyBwYXJ0IG9mIHRoZSBzYW1lCisgICBleGVj YnVmZmVyIG9iamVjdAorCisgKiBNYWxsb2MgYSA0SyBidWZmZXIKKyAqIFNoYXJlIGJ1ZmZlciB3 aXRoIHdpdGggR1BVIGJ5IHVzaW5nIHVzZXJwdHIgaW9jdGwKKyAqIENyZWF0ZSBzZWNvbmQgc2hh cmVkIGJ1ZmZlcgorICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRBIHRvIGZpcnN0 IGR3b3JkIG9mIGVhY2ggYnVmZmVyCisgKiBVc2Ugc2FtZSB2aXJ0dWFsIGFkZHJlc3MgYXMgZGVz dGluYXRpb24gYWRkcmVzc2VzIGluIGJhdGNoIGJ1ZmZlcgorICogU2V0IEVYRUNfT0JKRUNUX1BJ Tk5FRCBmbGFnIGluIGJvdGggZXhlYyBvYmplY3RzCisgKiBTZXQgJ29mZnNldCcgaW4gYm90aCBl eGVjIG9iamVjdHMgdG8gc2FtZSBWTUEKKyAqIFN1Ym1pdCBleGVjYnVmZmVyCisgKiBDb21tYW5k IHNob3VsZCByZXR1cm4gRUlOVkFMLCBzaW5jZSB3ZSBhcmUgdHJ5aW5nIHRvIHBpbiB0byBzYW1l IFZNQQorKi8KK3N0YXRpYyB2b2lkIGdlbV9waW5fb3ZlcmxhcF90ZXN0KHZvaWQpCit7CisJaTkx NV9nZW1fdXNlcnB0ciB1c2VycHRyOworCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjE7CisJaW50 IGZkLCByZXQ7CisJdWludDMyX3QgKnNoYXJlZF9idWZmZXI7CisJdWludDMyX3QgKnNoYXJlZF9i dWZmZXIxOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZjsKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBleGVjX29iamVjdDJbM107CisJdWludDMyX3Qg c2hhcmVkX2J1Zl9oYW5kbGUsIHNoYXJlZF9idWZfaGFuZGxlMTsKKwlpbnQgcmluZywgbGVuOwor CXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0ID0gMHgxMDAwOworCisJZmQgPSBkcm1fb3Blbl9kcml2 ZXIoRFJJVkVSX0lOVEVMKTsKKwlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEFMSUFT SU5HX1BQR1RUKSk7CisJaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9ydChmZCkpOworCisJ c2hhcmVkX2J1ZmZlciA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJWkUpOworCXNoYXJlZF9idWZm ZXIxID0gY3JlYXRlX21lbV9idWZmZXIoQk9fU0laRSAqIDIpOworCisJLyogc2hhcmUgd2l0aCBH UFUgKi8KKwlzaGFyZWRfYnVmX2hhbmRsZSA9IGluaXRfdXNlcnB0cihmZCwgJnVzZXJwdHIsIHNo YXJlZF9idWZmZXIsCisJCQkJCSBCT19TSVpFKTsKKwlzaGFyZWRfYnVmX2hhbmRsZTEgPSBpbml0 X3VzZXJwdHIoZmQsICZ1c2VycHRyMSwgc2hhcmVkX2J1ZmZlcjEsCisJCQkJCSAgQk9fU0laRSAq IDIpOworCisJLyogc3VibWl0IGNvbW1hbmQgYnVmZmVyICovCisJc2V0dXBfZXhlY19vYmooJmV4 ZWNfb2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUsCisJCSAgICAgICBFWEVDX09CSkVDVF9Q SU5ORUQsIHBpbm5pbmdfb2Zmc2V0KTsKKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzFd LCBzaGFyZWRfYnVmX2hhbmRsZTEsCisJCSAgICAgICBFWEVDX09CSkVDVF9QSU5ORUQsIHBpbm5p bmdfb2Zmc2V0KTsKKworCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVSOworCisJc2V0dXBfZXhlY2J1 ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOworCisJcmV0ID0gZHJt SW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWNidWYpOworCisJ LyogZXhwZWN0IHRvIGZhaWwgKi8KKwlpZ3RfYXNzZXJ0X25lcShyZXQsIDApOworCWlndF9hc3Nl cnQoZXJybm8gPT0gRUlOVkFMKTsKKworCWNsb3NlKGZkKTsKKwlmcmVlKHNoYXJlZF9idWZmZXIp OworCWZyZWUoc2hhcmVkX2J1ZmZlcjEpOworfQorCisvKiBnZW1fc29mdHBpbl9zdHJlc3NfdGVz dAorICogU3RyZXNzIHRlc3Qgd2hpY2ggY3JlYXRlcyAxMEsgYnVmZmVycyBhbmQgc2hhcmVzIHdp dGggR1BVCisgKiBDcmVhdGUgMTAwSyB1aW50MzIgYnVmZmVycyBvZiBzaXplIDRLIGVhY2gKKyAq IFNoYXJlIHdpdGggR1BVIHVzaW5nIHVzZXJwdHIgaW9jdGwKKyAqIENyZWF0ZSBiYXRjaCBidWZm ZXIgdG8gd3JpdGUgREFUQSBpbiBmaXJzdCBlbGVtZW50IG9mIGVhY2ggYnVmZmVyCisgKiBQaW4g ZWFjaCBidWZmZXIgdG8gdmFyeWluZyBhZGRyZXNzZXMgc3RhcnRpbmcgZnJvbSAweDgwMDAwMDAw MDAwMCBnb2luZyBiZWxvdworICogRXhlY3V0ZSBCYXRjaCBCdWZmZXIgb24gQmxpdCByaW5nIFNU UkVTU19OVU1fTE9PUFMgdGltZXMKKyAqIFZhbGlkYXRlIGV2ZXJ5IGJ1ZmZlciBoYXMgREFUQSBp biBmaXJzdCBlbGVtZW50CisgKiBSaW5zZSBhbmQgUmVwZWF0IG9uIFJlbmRlciByaW5nCisqLwor I2RlZmluZSBTVFJFU1NfTlVNX0JVRkZFUlMgMTAwMDAwCisjZGVmaW5lIFNUUkVTU19OVU1fTE9P UFMgMTAwCisjZGVmaW5lIFNUUkVTU19TVE9SRV9DT01NQU5EUyA0ICogU1RSRVNTX05VTV9CVUZG RVJTCisKK3N0YXRpYyB2b2lkIGdlbV9zb2Z0cGluX3N0cmVzc190ZXN0KHZvaWQpCit7CisJaTkx NV9nZW1fdXNlcnB0ciB1c2VycHRyOworCWludCBmZDsKKwl1aW50MzJfdCAqKnNoYXJlZF9idWZm ZXI7CisJdWludDMyX3QgKnNoYXJlZF9oYW5kbGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBleGVjYnVmOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVj X29iamVjdDI7CisJdWludDMyX3QgKmJhdGNoX2J1ZmZlcjsKKwl1aW50MzJfdCBiYXRjaF9idWZf aGFuZGxlOworCWludCByaW5nLCBsZW47CisJaW50IGJ1ZiwgbG9vcDsKKwl1aW50NjRfdCBwaW5u aW5nX29mZnNldCA9IDB4ODAwMDAwMDAwMDAwOworCisJZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJ VkVSX0lOVEVMKTsKKwlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEZVTExfNDhfQklU X1BQR1RUKSk7CisJaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9ydChmZCkpOworCisKKwkv KiBBbGxvY2F0ZSBibG9icyBmb3IgYWxsIGRhdGEgc3RydWN0dXJlcyAqLworCXNoYXJlZF9oYW5k bGUgPSBjYWxsb2MoU1RSRVNTX05VTV9CVUZGRVJTLCBzaXplb2YodWludDMyX3QpKTsKKwlzaGFy ZWRfYnVmZmVyID0gY2FsbG9jKFNUUkVTU19OVU1fQlVGRkVSUywgc2l6ZW9mKHVpbnQzMl90ICop KTsKKwlleGVjX29iamVjdDIgPSBjYWxsb2MoU1RSRVNTX05VTV9CVUZGRVJTICsgMSwKKwkJCQlz aXplb2Yoc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIpKTsKKwkvKiA0IGR3b3JkcyBw ZXIgYnVmZmVyICsgMiBmb3IgdGhlIGVuZCBvZiBiYXRjaGJ1ZmZlciAqLworCWJhdGNoX2J1ZmZl ciA9IGNhbGxvYyhTVFJFU1NfU1RPUkVfQ09NTUFORFMgKyAyLCBzaXplb2YodWludDMyX3QpKTsK KwliYXRjaF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgKFNUUkVTU19TVE9SRV9DT01NQU5E UyArIDIpKjQpOworCisJLyogY3JlYXRlIGNvbW1hbmQgYnVmZmVyIHdpdGggd3JpdGUgY29tbWFu ZHMgKi8KKwlsZW4gPSAwOworCWZvcihidWYgPSAwOyBidWYgPCBTVFJFU1NfTlVNX0JVRkZFUlM7 IGJ1ZisrKSB7CisJCXNoYXJlZF9idWZmZXJbYnVmXSA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJ WkUpOworCQkqc2hhcmVkX2J1ZmZlcltidWZdID0gMHhGRkZGRkZGRjsKKworCQkvKiBzaGFyZSB3 aXRoIEdQVSAqLworCQlzaGFyZWRfaGFuZGxlW2J1Zl0gPSBpbml0X3VzZXJwdHIoZmQsICZ1c2Vy cHRyLAorCQkJCQkJICBzaGFyZWRfYnVmZmVyW2J1Zl0sCisJCQkJCQkgIEJPX1NJWkUpOworCisJ CXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbYnVmXSwgc2hhcmVkX2hhbmRsZVtidWZdLAor CQkJICAgICAgIEVYRUNfT0JKRUNUX1BJTk5FRCwgcGlubmluZ19vZmZzZXQpOworCQlsZW4gKz0g Z2VtX3N0b3JlX2RhdGFfc3ZtKGZkLCBiYXRjaF9idWZmZXIgKyAobGVuLzQpLAorCQkJCQkgIHBp bm5pbmdfb2Zmc2V0LCBidWYsCisJCQkJCSAgKGJ1ZiA9PSBTVFJFU1NfTlVNX0JVRkZFUlMtMSk/ IFwKKwkJCQkJICB0cnVlOmZhbHNlKTsKKworCQkvKiBkZWNyZW1lbnRhbCA0SyBhbGlnbmVkIGFk ZHJlc3MgKi8KKwkJcGlubmluZ19vZmZzZXQgLT0gQUxJR04oQk9fU0laRSwgNDA5Nik7CisJfQor CisJLyogc2V0dXAgY29tbWFuZCBidWZmZXIgKi8KKwlnZW1fd3JpdGUoZmQsIGJhdGNoX2J1Zl9o YW5kbGUsIDAsIGJhdGNoX2J1ZmZlciwgbGVuKTsKKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmpl Y3QyW1NUUkVTU19OVU1fQlVGRkVSU10sIGJhdGNoX2J1Zl9oYW5kbGUsCisJCSAgICAgICAwLCAw KTsKKworCS8qIFdlIHdhbnQgdG8gcnVuIHRoaXMgb24gQkxUIHJpbmcgaWYgcG9zc2libGUgKi8K KwlpZiAoSEFTX0JMVF9SSU5HKGludGVsX2dldF9kcm1fZGV2aWQoZmQpKSkgeworCQlyaW5nID0g STkxNV9FWEVDX0JMVDsKKworCQlzZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVj dDIsIHJpbmcsCisJCQkJIFNUUkVTU19OVU1fQlVGRkVSUyArIDEsIGxlbik7CisKKwkJZm9yIChs b29wID0gMDsgbG9vcCA8IFNUUkVTU19OVU1fTE9PUFM7IGxvb3ArKykgeworCQkJc3VibWl0X2Fu ZF9zeW5jKGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hhbmRsZSk7CisJCQkvKiBTZXQgcGlubmlu ZyBvZmZzZXQgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLworCQkJcGlubmluZ19vZmZzZXQgPSAw eDgwMDAwMDAwMDAwMDsKKwkJCWZvcihidWYgPSAwOyBidWYgPCBTVFJFU1NfTlVNX0JVRkZFUlM7 IGJ1ZisrKSB7CisJCQkJZ2VtX3VzZXJwdHJfc3luYyhmZCwgc2hhcmVkX2hhbmRsZVtidWZdKTsK KwkJCQlpZ3RfYXNzZXJ0KGV4ZWNfb2JqZWN0MltidWZdLm9mZnNldCA9PSBwaW5uaW5nX29mZnNl dCk7CisJCQkJaWd0X2ZhaWxfb25fZigqc2hhcmVkX2J1ZmZlcltidWZdICE9IGJ1ZiwgXAorCQkJ CSJNaXNtYXRjaCBpbiBidWZmZXIgJWQsIGl0ZXJhdGlvbiAlZDogMHglMDhYXG4iLCBcCisJCQkJ YnVmLCBsb29wLCAqc2hhcmVkX2J1ZmZlcltidWZdKTsKKwkJCQlwaW5uaW5nX29mZnNldCAtPSBB TElHTihCT19TSVpFLCA0MDk2KTsKKwkJCX0KKwkJCS8qIFJlc2V0IHRoZSBidWZmZXIgZW50cmll cyBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKwkJCWZvcihidWYgPSAwOyBidWYgPCBTVFJFU1NfTlVN X0JVRkZFUlM7IGJ1ZisrKSB7CisJCQkJKnNoYXJlZF9idWZmZXJbYnVmXSA9IDB4RkZGRkZGRkY7 CisJCQl9CisJCX0KKwl9CisKKwkvKiBOb3cgUmVuZGVyIFJpbmcgKi8KKwlyaW5nID0gSTkxNV9F WEVDX1JFTkRFUjsKKwlzZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJp bmcsCisJCQkgU1RSRVNTX05VTV9CVUZGRVJTICsgMSwgbGVuKTsKKwlmb3IgKGxvb3AgPSAwOyBs b29wIDwgU1RSRVNTX05VTV9MT09QUzsgbG9vcCsrKSB7CisJCXN1Ym1pdF9hbmRfc3luYyhmZCwg JmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5kbGUpOworCQlwaW5uaW5nX29mZnNldCA9IDB4ODAwMDAw MDAwMDAwOworCQlmb3IoYnVmID0gMDsgYnVmIDwgU1RSRVNTX05VTV9CVUZGRVJTOyBidWYrKykg eworCQkJZ2VtX3VzZXJwdHJfc3luYyhmZCwgc2hhcmVkX2hhbmRsZVtidWZdKTsKKwkJCWlndF9h c3NlcnQoZXhlY19vYmplY3QyW2J1Zl0ub2Zmc2V0ID09IHBpbm5pbmdfb2Zmc2V0KTsKKwkJCWln dF9mYWlsX29uX2YoKnNoYXJlZF9idWZmZXJbYnVmXSAhPSBidWYsIFwKKwkJCSJNaXNtYXRjaCBp biBidWZmZXIgJWQsIFwKKwkJCWl0ZXJhdGlvbiAlZDogMHglMDhYXG4iLCBidWYsIGxvb3AsICpz aGFyZWRfYnVmZmVyW2J1Zl0pOworCQkJcGlubmluZ19vZmZzZXQgLT0gQUxJR04oQk9fU0laRSwg NDA5Nik7CisJCX0KKwkJLyogUmVzZXQgdGhlIGJ1ZmZlciBlbnRyaWVzIGZvciBuZXh0IGl0ZXJh dGlvbiAqLworCQlmb3IoYnVmID0gMDsgYnVmIDwgU1RSRVNTX05VTV9CVUZGRVJTOyBidWYrKykg eworCQkJKnNoYXJlZF9idWZmZXJbYnVmXSA9IDB4RkZGRkZGRkY7CisJCX0KKwl9CisKKwlmb3Io YnVmID0gMDsgYnVmIDwgU1RSRVNTX05VTV9CVUZGRVJTOyBidWYrKykgeworCQlnZW1fY2xvc2Uo ZmQsIHNoYXJlZF9oYW5kbGVbYnVmXSk7CisJCWZyZWUoc2hhcmVkX2J1ZmZlcltidWZdKTsKKwl9 CisJZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFuZGxlKTsKKwljbG9zZShmZCk7CisKKwlmcmVl KHNoYXJlZF9oYW5kbGUpOworCWZyZWUoc2hhcmVkX2J1ZmZlcik7CisJZnJlZShleGVjX29iamVj dDIpOworCWZyZWUoYmF0Y2hfYnVmZmVyKTsKK30KKworLyogZ2VtX3dyaXRlX211bHRpcGFnZV9i dWZmZXIKKyAqIENyZWF0ZSBhIGJ1ZmZlciBzcGFubmluZyBtdWx0aXBsZSBwYWdlcywgYW5kIHNo YXJlIHdpdGggR1BVLgorICogV3JpdGUgdG8gZXZlcnkgZWxlbWVudCBvZiB0aGUgYnVmZmVyCisg KiBhbmQgdmVyaWZ5IGNvcnJlY3QgY29udGVudHMuCisKKyAqIENyZWF0ZSA4SyBidWZmZXIKKyAq IFNoYXJlIHdpdGggR1BVIHVzaW5nIHVzZXJwdHIgaW9jdGwKKyAqIENyZWF0ZSBiYXRjaCBidWZm ZXIgdG8gd3JpdGUgREFUQSBpbiBhbGwgZWxlbWVudHMgb2YgYnVmZmVyCisgKiBFeGVjdXRlIEJh dGNoIEJ1ZmZlcgorICogVmFsaWRhdGUgZXZlcnkgZWxlbWVudCBoYXMgREFUQQorKi8KKworI2Rl ZmluZSBEV09SRF9TSVpFIHNpemVvZih1aW50MzJfdCkKKyNkZWZpbmUgQkJfU0laRSAoKE1VTFRJ UEFHRV9CT19TSVpFIC8gRFdPUkRfU0laRSkgKiBTVE9SRV9CQVRDSF9CVUZGRVJfU0laRSkgKyAy CisjZGVmaW5lIE5VTV9EV09SRFMgKE1VTFRJUEFHRV9CT19TSVpFL3NpemVvZih1aW50MzJfdCkp CitzdGF0aWMgdm9pZCBnZW1fd3JpdGVfbXVsdGlwYWdlX2J1ZmZlcl90ZXN0KHZvaWQpCit7CisJ aTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOworCWludCBmZDsKKwl1aW50MzJfdCAqc2hhcmVkX2J1 ZmZlcjsKKwl1aW50MzJfdCBzaGFyZWRfaGFuZGxlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y2J1ZmZlcjIgZXhlY2J1ZjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBleGVj X29iamVjdDJbMl07CisJdWludDMyX3QgYmF0Y2hfYnVmZmVyW0JCX1NJWkVdOworCXVpbnQzMl90 IGJhdGNoX2J1Zl9oYW5kbGU7CisJaW50IHJpbmcsIGxlbiwgajsKKwl1aW50NjRfdCBwaW5uaW5n X29mZnNldD0weDEwMDA7CisJdWludDY0X3QgdmFkZHI7CisKKwlmZCA9IGRybV9vcGVuX2RyaXZl cihEUklWRVJfSU5URUwpOworCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChmZCwgQUxJQVNJ TkdfUFBHVFQpKTsKKwlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7CisKKwli YXRjaF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgc2l6ZW9mKGJhdGNoX2J1ZmZlcikpOwor CXNoYXJlZF9idWZmZXIgPSBjcmVhdGVfbWVtX2J1ZmZlcihNVUxUSVBBR0VfQk9fU0laRSk7CisK KwlsZW4gPSAwOworCW1lbXNldChiYXRjaF9idWZmZXIsIDAsIHNpemVvZihiYXRjaF9idWZmZXIp KTsKKwltZW1zZXQoc2hhcmVkX2J1ZmZlciwgMCwgTVVMVElQQUdFX0JPX1NJWkUpOworCisJLyog c2hhcmUgd2l0aCBHUFUgKi8KKwlzaGFyZWRfaGFuZGxlID0gaW5pdF91c2VycHRyKGZkLCAmdXNl cnB0ciwgc2hhcmVkX2J1ZmZlciwKKwkJCQkgICAgIE1VTFRJUEFHRV9CT19TSVpFKTsKKwlzZXR1 cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBzaGFyZWRfaGFuZGxlLAorCQkgICAgICAgRVhF Q19PQkpFQ1RfUElOTkVELCBwaW5uaW5nX29mZnNldCk7CisKKwkvKiBjcmVhdGUgY29tbWFuZCBi dWZmZXIgd2l0aCB3cml0ZSBjb21tYW5kcyAqLworCXZhZGRyID0gcGlubmluZ19vZmZzZXQ7CisJ Zm9yKGo9MDsgajwgTlVNX0RXT1JEUzsgaisrKSB7CisJCWxlbiArPSBnZW1fc3RvcmVfZGF0YV9z dm0oZmQsIGJhdGNoX2J1ZmZlciArIChsZW4vNCksIHZhZGRyLAorCQkJCQkgIGosCisJCQkJCSAg KGogPT0gTlVNX0RXT1JEUyAtIDEpID8gdHJ1ZTpmYWxzZSk7CisJCXZhZGRyICs9IHNpemVvZihz aGFyZWRfYnVmZmVyWzBdKTsgIC8qIDQgYnl0ZXMgKi8KKwl9CisKKwlnZW1fd3JpdGUoZmQsIGJh dGNoX2J1Zl9oYW5kbGUsIDAsIGJhdGNoX2J1ZmZlciwgbGVuKTsKKworCS8qIHN1Ym1pdCBjb21t YW5kIGJ1ZmZlciAqLworCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMV0sIGJhdGNoX2J1 Zl9oYW5kbGUsIDAsIDApOworCisJcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7CisJc2V0dXBfZXhl Y2J1ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOworCXN1Ym1pdF9h bmRfc3luYyhmZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5kbGUpOworCWdlbV91c2VycHRyX3N5 bmMoZmQsIHNoYXJlZF9oYW5kbGUpOworCisJaWd0X2Fzc2VydChleGVjX29iamVjdDJbMF0ub2Zm c2V0ID09IHBpbm5pbmdfb2Zmc2V0KTsKKwlmb3IoaiA9IDA7IGogPCAoTVVMVElQQUdFX0JPX1NJ WkUvc2l6ZW9mKHVpbnQzMl90KSk7IGorKykgeworCQlpZ3RfZmFpbF9vbl9mKHNoYXJlZF9idWZm ZXJbal0gIT0gaiwKKwkJIk1pc21hdGNoIGluIGluZGV4ICVkOiAweCUwOFhcbiIsIGosIHNoYXJl ZF9idWZmZXJbal0pOworCX0KKworCWdlbV9jbG9zZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSk7CisJ Z2VtX2Nsb3NlKGZkLCBzaGFyZWRfaGFuZGxlKTsKKwljbG9zZShmZCk7CisKKwlmcmVlKHNoYXJl ZF9idWZmZXIpOworfQorCisvKiBnZW1fcGluX2ludmFsaWRfdm1hX3Rlc3QKKyAqIFRoaXMgdGVz dCB3aWxsIHJlcXVlc3QgdG8gcGluIGEgc2hhcmVkIGJ1ZmZlciB0byBhbiBpbnZhbGlkCisgKiBW TUEgID4gNDgtYml0IGFkZHJlc3MgaWYgc3lzdGVtIHN1cHBvcnRzIDQ4QiBQUEdUVAorICogSWYg c3lzdGVtIHN1cHBvcnRzIDMyQiBQUEdUVCwgaXQgd2lsbCB0ZXN0IHRoZSBlcXVpdmFsZW50IGlu dmFsaWQgVk1BCisgKiBDcmVhdGUgc2hhcmVkIGJ1ZmZlciBvZiBzaXplIDRLCisgKiBUcnkgYW5k IFBpbiBvYmplY3QgdG8gaW52YWxpZCBhZGRyZXNzCisqLworc3RhdGljIHZvaWQgZ2VtX3Bpbl9p bnZhbGlkX3ZtYV90ZXN0KHZvaWQpCit7CisJaTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOworCWlu dCBmZCwgcmV0OworCXVpbnQzMl90ICpzaGFyZWRfYnVmZmVyOworCXN0cnVjdCBkcm1faTkxNV9n ZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0 MiBleGVjX29iamVjdDJbMV07CisJdWludDMyX3Qgc2hhcmVkX2J1Zl9oYW5kbGU7CisJaW50IHJp bmc7CisJdWludDY0X3QgaW52YWxpZF9hZGRyZXNzX2Zvcl80OGIgPSAweDkwMDAwMDAwMDAwMDA7 IC8qIDUyIGJpdCBhZGRyZXNzICovCisJdWludDY0X3QgaW52YWxpZF9hZGRyZXNzX2Zvcl8zMmIg PSAweDkwMDAwMDAwMDsgLyogMzYgYml0IGFkZHJlc3MgKi8KKworCWZkID0gZHJtX29wZW5fZHJp dmVyKERSSVZFUl9JTlRFTCk7CisJaWd0X3JlcXVpcmUodXNlc19mdWxsX3BwZ3R0KGZkLCBGVUxM XzQ4X0JJVF9QUEdUVCkgfHwKKwkJICAgIHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF8zMl9CSVRf UFBHVFQpKTsKKwlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7CisKKwlzaGFy ZWRfYnVmZmVyID0gY3JlYXRlX21lbV9idWZmZXIoQk9fU0laRSk7CisJKnNoYXJlZF9idWZmZXIg PSAweEZGRkZGRkZGOworCisJLyogc2hhcmUgd2l0aCBHUFUgKi8KKwlzaGFyZWRfYnVmX2hhbmRs ZSA9IGluaXRfdXNlcnB0cihmZCwgJnVzZXJwdHIsIHNoYXJlZF9idWZmZXIsIEJPX1NJWkUpOwor CisJaWYgKHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF80OF9CSVRfUFBHVFQpKSB7CisJCXNldHVw X2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMF0sIHNoYXJlZF9idWZfaGFuZGxlLAorCQkJICAgICAg IEVYRUNfT0JKRUNUX1BJTk5FRCwgaW52YWxpZF9hZGRyZXNzX2Zvcl80OGIpOworCX0gZWxzZSB7 CisJCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMF0sIHNoYXJlZF9idWZfaGFuZGxlLAor CQkJICAgICAgIEVYRUNfT0JKRUNUX1BJTk5FRCwgaW52YWxpZF9hZGRyZXNzX2Zvcl8zMmIpOwor CX0KKworCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVSOworCisJc2V0dXBfZXhlY2J1ZmZlcigmZXhl Y2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAxLCAwKTsKKworCS8qIEV4cGVjdCBleGVjYnVmIHRv IGZhaWwgKi8KKwlyZXQgPSBkcm1Jb2N0bChmZCwKKwkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dF TV9FWEVDQlVGRkVSMiwKKwkJICAgICAgICZleGVjYnVmKTsKKworCWlndF9hc3NlcnQoZXJybm8g PT0gRU5PU1BDKTsKKwlpZ3RfYXNzZXJ0X25lcShyZXQsIDApOworCisJZ2VtX2Nsb3NlKGZkLCBz aGFyZWRfYnVmX2hhbmRsZSk7CisJY2xvc2UoZmQpOworCWZyZWUoc2hhcmVkX2J1ZmZlcik7Cit9 CisKKworLyogZ2VtX3Bpbl9oaWdoX2FkZHJlc3NfdGVzdAorICogVGhpcyB0ZXN0IHdpbGwgY3Jl YXRlIGEgc2hhcmVkIGJ1ZmZlciwgYW5kIGNyZWF0ZSBhIGNvbW1hbmQKKyAqIGZvciBHUFUgdG8g d3JpdGUgZGF0YSBpbiBpdC4gSXQgd2lsbCBhdHRlbXB0IHRvIHBpbiB0aGUgYnVmZmVyIGF0IGFk ZHJlc3MgPiAzMiBiaXRzLgorICogQ1BVIHdpbGwgcmVhZCBhbmQgbWFrZSBzdXJlIGV4cGVjdGVk IHZhbHVlIGlzIG9idGFpbmVkCisKKyAqIE1hbGxvYyBhIDRLIGJ1ZmZlcgorICogU2hhcmUgYnVm ZmVyIHdpdGggd2l0aCBHUFUgYnkgdXNpbmcgdXNlcnB0ciBpb2N0bAorICogQ3JlYXRlIGJhdGNo IGJ1ZmZlciB0byB3cml0ZSBEQVRBIHRvIGZpcnN0IGR3b3JkIG9mIGJ1ZmZlcgorICogVXNlIHZp cnR1YWwgYWRkcmVzcyBvZiBidWZmZXIgYXMgMHgxMTAwMDAwMDAwICg+IDMyIGJpdCkKKyAqIFNl dCBFWEVDX09CSkVDVF9QSU5ORUQgZmxhZyBpbiBleGVjIG9iamVjdAorICogU2V0ICdvZmZzZXQn IGluIGV4ZWMgb2JqZWN0IHRvIHNoYXJlZCBidWZmZXIgVk1BCisgKiBTdWJtaXQgZXhlY2J1ZmZl cgorICogVmVyaWZ5IHZhbHVlIG9mIGZpcnN0IERXT1JEIGluIHNoYXJlZCBidWZmZXIgbWF0Y2hl cyBEQVRBCisgKiBOb3cgdHJ5IHNhbWUgdGVzdCB3aXRob3V0IHVzaW5nIDQ4QklUIGZsYWcKKyAq IHRlc3Qgc2hvdWxkIHBhc3Mgd2l0aCByZXF1ZXN0ZWQgcGlubmluZyBhZGRyZXNzCisqLworCitz dGF0aWMgdm9pZCBnZW1fcGluX2hpZ2hfYWRkcmVzc190ZXN0KHZvaWQpCit7CisJaTkxNV9nZW1f dXNlcnB0ciB1c2VycHRyOworCWludCBmZDsKKwl1aW50MzJfdCAqc2hhcmVkX2J1ZmZlcjsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7CisJc3RydWN0IGRybV9pOTE1 X2dlbV9leGVjX29iamVjdDIgZXhlY19vYmplY3QyWzJdOworCXVpbnQzMl90IGJhdGNoX2J1ZmZl cltTVE9SRV9CQVRDSF9CVUZGRVJfU0laRSArIDJdOworCXVpbnQzMl90IGJhdGNoX2J1Zl9oYW5k bGUsIHNoYXJlZF9idWZfaGFuZGxlOworCWludCByaW5nLCBsZW47CisJY29uc3QgdWludDMyX3Qg ZGF0YSA9IDB4MTIzNDU2Nzg7CisJdWludDY0X3QgaGlnaF9hZGRyZXNzID0gMHgxMTExRkZGRjAw MDsgLyogNDQgYml0IGFkZHJlc3MgKi8KKworCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9J TlRFTCk7CisJaWd0X3JlcXVpcmUodXNlc19mdWxsX3BwZ3R0KGZkLCBGVUxMXzQ4X0JJVF9QUEdU VCkpOworCWlndF9yZXF1aXJlKGhhc19zb2Z0cGluX3N1cHBvcnQoZmQpKTsKKworCWJhdGNoX2J1 Zl9oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBCT19TSVpFKTsKKworCS8qIGNyZWF0ZSBjcHUgYnVm ZmVyLCBzZXQgdG8gYWxsIDB4RidzICovCisJc2hhcmVkX2J1ZmZlciA9IGNyZWF0ZV9tZW1fYnVm ZmVyKEJPX1NJWkUpOworCSpzaGFyZWRfYnVmZmVyID0gMHhGRkZGRkZGRjsKKworCS8qIHNoYXJl IHdpdGggR1BVICovCisJc2hhcmVkX2J1Zl9oYW5kbGUgPSBpbml0X3VzZXJwdHIoZmQsICZ1c2Vy cHRyLCBzaGFyZWRfYnVmZmVyLCBCT19TSVpFKTsKKworCS8qIGNyZWF0ZSBjb21tYW5kIGJ1ZmZl ciB3aXRoIHdyaXRlIGNvbW1hbmQgKi8KKwlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJh dGNoX2J1ZmZlciwgaGlnaF9hZGRyZXNzLCBkYXRhLCB0cnVlKTsKKwlnZW1fd3JpdGUoZmQsIGJh dGNoX2J1Zl9oYW5kbGUsIDAsIGJhdGNoX2J1ZmZlciwgbGVuKTsKKworCS8qIHN1Ym1pdCBjb21t YW5kIGJ1ZmZlciAqLworCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMF0sIHNoYXJlZF9i dWZfaGFuZGxlLAorCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVEIHwgRVhFQ19PQkpFQ1RfU1VQ UE9SVFNfNDhCX0FERFJFU1MsIGhpZ2hfYWRkcmVzcyk7CisJc2V0dXBfZXhlY19vYmooJmV4ZWNf b2JqZWN0MlsxXSwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgMCk7CisKKwlyaW5nID0gSTkxNV9FWEVD X1JFTkRFUjsKKworCXNldHVwX2V4ZWNidWZmZXIoJmV4ZWNidWYsIGV4ZWNfb2JqZWN0Miwgcmlu ZywgMiwgbGVuKTsKKwlzdWJtaXRfYW5kX3N5bmMoZmQsICZleGVjYnVmLCBiYXRjaF9idWZfaGFu ZGxlKTsKKwlnZW1fdXNlcnB0cl9zeW5jKGZkLCBzaGFyZWRfYnVmX2hhbmRsZSk7CisKKwlpZ3Rf YXNzZXJ0KGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQgPT0gaGlnaF9hZGRyZXNzKTsKKwkvKiBjaGVj ayBvbiBDUFUgdG8gc2VlIGlmIHZhbHVlIGNoYW5nZXMgKi8KKwlpZ3RfZmFpbF9vbl9mKHNoYXJl ZF9idWZmZXJbMF0gIT0gZGF0YSwKKwkJIlxuQ1BVIHJlYWQgZG9lcyBub3QgbWF0Y2ggR1BVIHdy aXRlLCBcCisJCWV4cGVjdGVkOiAweCV4LCBnb3Q6IDB4JXhcbiIsIGRhdGEsIHNoYXJlZF9idWZm ZXJbMF0pOworCisJLyogTm93IHRyeSBwaW5uaW5nIHRvIGhpZ2ggYWRkcmVzcyB3aXRob3V0IDQ4 QklUIGZsYWcgKi8KKwlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBzaGFyZWRfYnVm X2hhbmRsZSwKKwkJICAgICAgIEVYRUNfT0JKRUNUX1BJTk5FRCwgaGlnaF9hZGRyZXNzKTsKKwlz ZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJpbmcsIDIsIGxlbik7CisJ c3VibWl0X2FuZF9zeW5jKGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hhbmRsZSk7CisJZ2VtX3Vz ZXJwdHJfc3luYyhmZCwgc2hhcmVkX2J1Zl9oYW5kbGUpOworCisJaWd0X2Fzc2VydChleGVjX29i amVjdDJbMF0ub2Zmc2V0ID09IGhpZ2hfYWRkcmVzcyk7CisKKwlnZW1fY2xvc2UoZmQsIGJhdGNo X2J1Zl9oYW5kbGUpOworCWdlbV9jbG9zZShmZCwgc2hhcmVkX2J1Zl9oYW5kbGUpOworCWNsb3Nl KGZkKTsKKwlmcmVlKHNoYXJlZF9idWZmZXIpOworfQorCisvKiBnZW1fcGluX25lYXJfNDhCaXRf dGVzdAorICogVGhpcyB0ZXN0IHdpbGwgY3JlYXRlIGEgc2hhcmVkIGJ1ZmZlciwKKyAqIGFuZCBj cmVhdGUgYSBjb21tYW5kIGZvciBHUFUgdG8gd3JpdGUgZGF0YSBpbiBpdC4gSXQgd2lsbCBhdHRl bXB0CisgKiB0byBwaW4gdGhlIGJ1ZmZlciBhdCBhZGRyZXNzID4gNDcgYml0cyA8PSA0OC1iaXQu CisgKiBDUFUgd2lsbCByZWFkIGFuZCBtYWtlIHN1cmUgZXhwZWN0ZWQgdmFsdWUgaXMgb2J0YWlu ZWQKKworICogTWFsbG9jIGEgNEsgYnVmZmVyCisgKiBTaGFyZSBidWZmZXIgd2l0aCB3aXRoIEdQ VSBieSB1c2luZyB1c2VycHRyIGlvY3RsCisgKiBDcmVhdGUgYmF0Y2ggYnVmZmVyIHRvIHdyaXRl IERBVEEgdG8gZmlyc3QgZHdvcmQgb2YgYnVmZmVyCisgKiBVc2UgdmlydHVhbCBhZGRyZXNzIG9m IGJ1ZmZlciBhcyByYW5nZSBiZXR3ZWVuIDQ3LWJpdCBhbmQgNDgtYml0CisgKiBTZXQgRVhFQ19P QkpFQ1RfUElOTkVEIGZsYWcgaW4gZXhlYyBvYmplY3QKKyAqIFNldCAnb2Zmc2V0JyBpbiBleGVj IG9iamVjdCB0byBzaGFyZWQgYnVmZmVyIFZNQQorICogU3VibWl0IGV4ZWNidWZmZXIKKyAqIFZl cmlmeSB2YWx1ZSBvZiBmaXJzdCBEV09SRCBpbiBzaGFyZWQgYnVmZmVyIG1hdGNoZXMgREFUQQor Ki8KKyNkZWZpbmUgQkVHSU5fSElHSF9BRERSRVNTIDB4N0ZGRkZGRkZGMDAwCisjZGVmaW5lIEVO RF9ISUdIX0FERFJFU1MgMHhGRkZGRkZGRkMwMDAKKyNkZWZpbmUgQUREUkVTU19JTkNSRU1FTlQg MHgyMDAwMDAwMDAwCitzdGF0aWMgdm9pZCBnZW1fcGluX25lYXJfNDhCaXRfdGVzdCh2b2lkKQor eworCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKKwlpbnQgZmQ7CisJdWludDMyX3QgKnNoYXJl ZF9idWZmZXI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOworCXN0 cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNfb2JqZWN0MlsyXTsKKwl1aW50MzJf dCBiYXRjaF9idWZmZXJbQk9fU0laRV07CisJdWludDMyX3QgYmF0Y2hfYnVmX2hhbmRsZSwgc2hh cmVkX2J1Zl9oYW5kbGU7CisJaW50IHJpbmcsIGxlbjsKKwljb25zdCB1aW50MzJfdCBkYXRhID0g MHgxMjM0NTY3ODsKKwl1aW50NjRfdCBoaWdoX2FkZHJlc3M7CisKKwlmZCA9IGRybV9vcGVuX2Ry aXZlcihEUklWRVJfSU5URUwpOworCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChmZCwgRlVM TF80OF9CSVRfUFBHVFQpKTsKKwlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7 CisKKwliYXRjaF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgQk9fU0laRSk7CisKKwkvKiBj cmVhdGUgY3B1IGJ1ZmZlciwgc2V0IHRvIGFsbCAweEYncyAqLworCXNoYXJlZF9idWZmZXIgPSBj cmVhdGVfbWVtX2J1ZmZlcihCT19TSVpFKTsKKwkqc2hhcmVkX2J1ZmZlciA9IDB4RkZGRkZGRkY7 CisKKwkvKiBzaGFyZSB3aXRoIEdQVSAqLworCXNoYXJlZF9idWZfaGFuZGxlID0gaW5pdF91c2Vy cHRyKGZkLCAmdXNlcnB0ciwgc2hhcmVkX2J1ZmZlciwgQk9fU0laRSk7CisKKwlmb3IgKGhpZ2hf YWRkcmVzcyA9IEJFR0lOX0hJR0hfQUREUkVTUzsgaGlnaF9hZGRyZXNzIDw9IEVORF9ISUdIX0FE RFJFU1M7CisJCQkJCQloaWdoX2FkZHJlc3MrPUFERFJFU1NfSU5DUkVNRU5UKSB7CisJCS8qIGNy ZWF0ZSBjb21tYW5kIGJ1ZmZlciB3aXRoIHdyaXRlIGNvbW1hbmQgKi8KKwkJbGVuID0gZ2VtX3N0 b3JlX2RhdGFfc3ZtKGZkLCBiYXRjaF9idWZmZXIsIGhpZ2hfYWRkcmVzcywKKwkJCQkJZGF0YSwg dHJ1ZSk7CisJCWdlbV93cml0ZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVy LCBsZW4pOworCQkvKiBzdWJtaXQgY29tbWFuZCBidWZmZXIgKi8KKwkJc2V0dXBfZXhlY19vYmoo JmV4ZWNfb2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUsCisJCQkgICAgICAgRVhFQ19PQkpF Q1RfUElOTkVEIHwgRVhFQ19PQkpFQ1RfU1VQUE9SVFNfNDhCX0FERFJFU1MsCisJCQkgICAgICAg aGlnaF9hZGRyZXNzKTsKKwkJc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlsxXSwgYmF0Y2hf YnVmX2hhbmRsZSwgMCwgMCk7CisKKwkJcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7CisJCXNldHVw X2V4ZWNidWZmZXIoJmV4ZWNidWYsIGV4ZWNfb2JqZWN0MiwgcmluZywgMiwgbGVuKTsKKwkJc3Vi bWl0X2FuZF9zeW5jKGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hhbmRsZSk7CisJCWdlbV91c2Vy cHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKKworCQlpZ3RfYXNzZXJ0KGV4ZWNfb2Jq ZWN0MlswXS5vZmZzZXQgPT0gaGlnaF9hZGRyZXNzKTsKKwkJLyogY2hlY2sgb24gQ1BVIHRvIHNl ZSBpZiB2YWx1ZSBjaGFuZ2VzICovCisJCWlndF9mYWlsX29uX2Yoc2hhcmVkX2J1ZmZlclswXSAh PSBkYXRhLAorCQkiXG5DUFUgcmVhZCBkb2VzIG5vdCBtYXRjaCBHUFUgd3JpdGUsIGV4cGVjdGVk OiAweCV4LCBcCisJCWdvdDogMHgleFxuLCAweCUiUFJJeDY0IiIsIGRhdGEsIHNoYXJlZF9idWZm ZXJbMF0sIGhpZ2hfYWRkcmVzcyk7CisJfQorCisJZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFu ZGxlKTsKKwlnZW1fY2xvc2UoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKKwljbG9zZShmZCk7CisJ ZnJlZShzaGFyZWRfYnVmZmVyKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJn dltdKQoreworCWlndF9zdWJ0ZXN0X2luaXQoYXJnYywgYXJndik7CisJaWd0X3NraXBfb25fc2lt dWxhdGlvbigpOworCisJLyogQWxsIHRlc3RzIG5lZWQgUFBHVFQgc3VwcG9ydCAqLworCWlndF9z dWJ0ZXN0KCJnZW1fcGluX3VzZXJwdHIiKSB7CisJCWdlbV9waW5fdXNlcnB0cl90ZXN0KCk7CisJ fQorCWlndF9zdWJ0ZXN0KCJnZW1fcGluX2JvIikgeworCQlnZW1fcGluX2JvX3Rlc3QoKTsKKwl9 CisJaWd0X3N1YnRlc3QoImdlbV9tdWx0aXBsZV9wcm9jZXNzIikgeworCQlnZW1fbXVsdGlwbGVf cHJvY2Vzc190ZXN0KCk7CisJfQorCWlndF9zdWJ0ZXN0KCJnZW1fcmVwaW4iKSB7CisJCWdlbV9y ZXBpbl90ZXN0KCk7CisJfQorCWlndF9zdWJ0ZXN0KCJnZW1fcGluX292ZXJsYXAiKSB7CisJCWdl bV9waW5fb3ZlcmxhcF90ZXN0KCk7CisJfQorCWlndF9zdWJ0ZXN0KCJnZW1fd3JpdGVfbXVsdGlw YWdlX2J1ZmZlciIpIHsKKwkJZ2VtX3dyaXRlX211bHRpcGFnZV9idWZmZXJfdGVzdCgpOworCX0K KworCS8qIEZvbGxvd2luZyB0ZXN0cyBuZWVkIDMyLzQ4IEJpdCBQUEdUVCBzdXBwb3J0ICovCisJ aWd0X3N1YnRlc3QoImdlbV9waW5faW52YWxpZF92bWEiKSB7CisJCWdlbV9waW5faW52YWxpZF92 bWFfdGVzdCgpOworCX0KKworCS8qIEZvbGxvd2luZyB0ZXN0cyBuZWVkIDQ4IEJpdCBQUEdUVCBz dXBwb3J0ICovCisJaWd0X3N1YnRlc3QoImdlbV9zb2Z0cGluX3N0cmVzcyIpIHsKKwkJZ2VtX3Nv ZnRwaW5fc3RyZXNzX3Rlc3QoKTsKKwl9CisJaWd0X3N1YnRlc3QoImdlbV9waW5faGlnaF9hZGRy ZXNzIikgeworCQlnZW1fcGluX2hpZ2hfYWRkcmVzc190ZXN0KCk7CisJfQorCWlndF9zdWJ0ZXN0 KCJnZW1fcGluX25lYXJfNDhCaXQiKSB7CisJCWdlbV9waW5fbmVhcl80OEJpdF90ZXN0KCk7CisJ fQorCisJaWd0X2V4aXQoKTsKK30KLS0gCjEuOS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2ludGVsLWdmeAo=