From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Wilck Subject: Re: [PATCH] multipath-tools:Prioritizer based on a time-delay algorithm Date: Thu, 11 May 2017 13:14:03 +0200 Message-ID: <1494501243.6093.16.camel@suse.com> References: <1494215904-7564-1-git-send-email-philip.yang@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1494215904-7564-1-git-send-email-philip.yang@huawei.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com To: Yang Feng , dm-devel@redhat.com Cc: guanjunxiong@huawei.com, hege09@huawei.com, zouming.zouming@huawei.com, shenhong09@huawei.com List-Id: dm-devel.ids SGVsbG8gWWFuZywKCnRoYW5rIHlvdSBmb3IgeW91ciB3b3JrLiBQbGVhc2UgZmluZCBteSByZW1h cmtzIGJlbG93LgoKT24gTW9uLCAyMDE3LTA1LTA4IGF0IDExOjU4ICswODAwLCBZYW5nIEZlbmcg d3JvdGU6Cj4gUHJpb3JpdGl6ZXIgZm9yIGRldmljZSBtYXBwZXIgbXVsdGlwYXRoLCB3aGVyZSB0 aGUgY29ycmVzcG9uZGluZwo+IHByaW9yaXR5Cj4gdmFsdWVzIG9mIHNwZWNpZmljIHBhdGhzIGFy ZSBwcm92aWRlZCBieSBhIHRpbWUtZGVsYXkgYWxnb3JpdGhtLiBBbmQKPiB0aGUKPiB0aW1lLWRl bGF5IGFsZ29yaXRobSBpcyBkZXBlbmRlbnQgb24gdGhlIGZvbGxvd2luZwo+IGFyZ3VtZW50cyhk ZWxheV9pbnRlcnZhbCwKPiBjb25zX251bSkuCj4gVGhlIHByaW5jaXBsZSBvZiB0aGUgYWxnb3Jp dGhtIGlzIGlsbHVzdHJhdGVkIGFzIGZvbGxvd3M6Cj4gMS4gQnkgc2VuZGluZyBhIGNlcnRhaW4g bnVtYmVyICJjb25zX251bSIgb2YgcmVhZCBJT3MgdG8gdGhlIGN1cnJlbnQKPiBwYXRoCj4gwqDC oMKgY29udGludW91c2x5LCB0aGUgSU9zJyBhdmVyYWdlIGRlbGF5IGNhbiBiZSBjYWxjdWxhdGVk Lgo+IDIuIEFjY29yZGluZyB0byB0aGUgYXZlcmFnZSBkZWxheSBvZiBlYWNoIHBhdGggYW5kIHRo ZSB3ZWlnaHQgdmFsdWUKPiDCoMKgwqAiZGVsYXlfaW50ZXJ2YWwiLCB0aGUgcHJpb3JpdHkgInJj IiBvZiBlYWNoIHBhdGggY2FuIGJlIHByb3ZpZGVkLgo+IAo+IMKgwqDCoMKgwqBkZWxheV9pbnRl cnZhbMKgwqBkZWxheV9pbnRlcnZhbMKgwqBkZWxheV9pbnRlcnZhbMKgwqDCoMKgwqDCoMKgZGVs YXlfaW50ZXIKCkhvdyBkb2VzIHRoaXMgYWxnb3JpdGhtIGJlaGF2ZSB1bmRlciBsb2FkPyBDYW4g d2UgYmUgc3VyZSB0aGF0CnByaW9yaXRpZXMgZG9uJ3Qgc3RhcnQgdG8gZmx1Y3R1YXRlIHdpbGRs eSBiZWNhdXNlIGJ1c3kgcGF0aHMgd2lsbAp1c3VhbGx5IGhhdmUgbG9uZ2VyIGxhdGVuY2llcyB0 aGFuIGlkbGUgb25lcz8KCgo+IHZhbAo+IMKgwqDCoMKgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0t LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfAnCoHwtLS0tCj4gLS0tLS0tLS0tLS18Cj4gwqDCoMKg wqB8cHJpb3JpdHkgcmFuazEgfHByaW9yaXR5IHJhbmsyIHxwcmlvcml0eSByYW5rMyB8Li4uIHxw cmlvcml0eQo+IHJhbms0IHwKPiDCoMKgwqDCoHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0t LS0tfC0tLS0tLS0tLS0tLS0tLXzCoMKgwqDCoHwtLS0tLS0tLS0tLQo+IC0tLS18Cj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFByaW9yaXR5IFJhbmsgUGFy dGl0aW9uaW5nCj4gLS0tCj4gwqBsaWJtdWx0aXBhdGgvTWFrZWZpbGXCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqAyICstCj4gwqBsaWJtdWx0aXBhdGgvY2hlY2tl cnMvTWFrZWZpbGXCoMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqA3ICstCj4gwqBsaWJtdWx0aXBh dGgvY2hlY2tlcnMvZW1jX2NsYXJpaW9uLmPCoMKgwqDCoHzCoMKgwqAyICstCj4gwqBsaWJtdWx0 aXBhdGgvY2hlY2tlcnMvbGlic2cuY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoDk0IC0tLS0t LS0tLS0tLQo+IMKgbGlibXVsdGlwYXRoL2NoZWNrZXJzL2xpYnNnLmjCoMKgwqDCoMKgwqDCoMKg wqDCoMKgfMKgwqDCoDkgLS0KPiDCoGxpYm11bHRpcGF0aC9jaGVja2Vycy9yZWFkc2VjdG9yMC5j wqDCoMKgwqDCoHzCoMKgwqAyICstCj4gwqBsaWJtdWx0aXBhdGgvbGlic2cuY8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoDk0ICsrKysrKysrKysrKwo+IMKgbGli bXVsdGlwYXRoL2xpYnNnLmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg fMKgwqDCoDkgKysKPiDCoGxpYm11bHRpcGF0aC9wcmlvcml0aXplcnMvTWFrZWZpbGXCoMKgwqDC oMKgwqB8wqDCoMKgNiArLQo+IMKgbGlibXVsdGlwYXRoL3ByaW9yaXRpemVycy9kZWxheWVkcGF0 aC5jIHwgMjQ2IAoKV2h5IGRvIHlvdSBoYXZlIHRvIG1vdmUgbGlic2cgZm9yIHRoaXM/IEl0J3Mg YWxyZWFkeSB1c2VkIGJ5IHZhcmlvdXMKY2hlY2tlcnMsIHdoeSBjYW4ndCB5b3VyIGNoZWNrZXIg ZG8gdGhlIHNhbWU/IElmIHlvdSByZWFsbHkgbmVlZCB0byBkbwppdCwgeW91IHNob3VsZCBhdCBs ZWFzdCBzZXBhcmF0ZSB0aGF0IHBhcnQgb2YgdGhlIHBhdGNoIGZyb20gdGhlIGFkZGVkCmNvZGUu Cgo+IGRpZmYgLS1naXQgYS9saWJtdWx0aXBhdGgvcHJpb3JpdGl6ZXJzL2RlbGF5ZWRwYXRoLmMK PiBiL2xpYm11bHRpcGF0aC9wcmlvcml0aXplcnMvZGVsYXllZHBhdGguYwo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNGMxY2ZlYQo+IC0tLSAvZGV2L251bGwKPiArKysg Yi9saWJtdWx0aXBhdGgvcHJpb3JpdGl6ZXJzL2RlbGF5ZWRwYXRoLmMKPiBAQCAtMCwwICsxLDI0 NiBAQAo+ICsvKgo+ICsgKiAoQykgQ29weXJpZ2h0IEhVQVdFSSBUZWNobm9sb2d5IENvcnAuIDIw MTcsIDIwMjHCoMKgwqBBbGwgUmlnaHRzCj4gUmVzZXJ2ZWQuCj4gKyAqCj4gKyAqIG1haW4uYwo+ ICsgKgo+ICsgKiBQcmlvcml0aXplciBmb3IgZGV2aWNlIG1hcHBlciBtdWx0aXBhdGgsIHdoZXJl IHRoZSBjb3JyZXNwb25kaW5nCj4gcHJpb3JpdHnCoAo+ICsgKiB2YWx1ZXMgb2Ygc3BlY2lmaWMg cGF0aHMgYXJlIHByb3ZpZGVkIGJ5IGEgdGltZS1kZWxheSBhbGdvcml0aG0uCj4gQW5kIHRoZQo+ ICsgKiB0aW1lLWRlbGF5IGFsZ29yaXRobSBpcyBkZXBlbmRlbnQgb24gYXJndW1lbnRzLgo+ICsg KsKgCj4gKyAqIFRoZSBwcmluY2lwbGUgb2YgdGhlIGFsZ29yaXRobSBhcyBmb2xsb3dzOsKgCj4g KyAqIDEuIEJ5IHNlbmRpbmcgYSBjZXJ0YWluIG51bWJlciAiY29uc19udW0iIG9mIHJlYWQgSU9z IHRvIHRoZQo+IGN1cnJlbnQgcGF0aMKgCj4gKyAqwqDCoMKgwqBjb250aW51b3VzbHksIHRoZSBJ T3MnIGF2ZXJhZ2UgZGVsYXkgY2FuIGJlIGNhbGN1bGF0ZWQuwqAKPiArICogMi4gQWNjb3JkaW5n IHRvIHRoZSBhdmVyYWdlIGRlbGF5IG9mIGVhY2ggcGF0aCBhbmQgdGhlIHdlaWdodAo+IHZhbHVl wqAKPiArICrCoMKgwqDCoCJkZWxheV9pbnRlcnZhbCIsIHRoZSBwcmlvcml0eSAicmMiIG9mIGVh Y2ggcGF0aCBjYW4gYmUKPiBwcm92aWRlZC7CoAo+ICsgKgo+ICsgKiBBdXRob3Iocyk6IFlhbmcg RmVuZyA8cGhpbGlwLnlhbmdAaHVhd2VpLmNvbT4KPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBab3UgTWluZyA8em91bWluZy56b3VtaW5nQGh1YXdlaS5jb20+Cj4gKyAqCj4gKyAqIFRoaXMg ZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgo+ICsgKi8KPiArI2luY2x1ZGUgPHN0ZGlv Lmg+Cj4gKyNpbmNsdWRlIDxjdHlwZS5oPgo+ICsjaW5jbHVkZSA8c3lzL3RpbWUuaD4KPiArCj4g KyNpbmNsdWRlICJkZWJ1Zy5oIgo+ICsjaW5jbHVkZSAicHJpby5oIgo+ICsjaW5jbHVkZSAic3Ry dWN0cy5oIgo+ICsjaW5jbHVkZSAiLi4vbGlibXVsdGlwYXRoL2xpYnNnLmgiCj4gKwo+ICsjaW5j bHVkZSAiZGVsYXllZHBhdGguaCIKPiArCj4gKyNkZWZpbmUgVEhSRVNfVVNFQ19WQUxVRcKgwqDC oMKgwqDCoMKgwqAzMDAwMDAwMDBMTMKgwqDCoMKgLypVU0VDLCAzMDBTRUMqLwo+ICsjZGVmaW5l IERFRkFVTFRfREVMQVlfSU5URVJWQUzCoMKgMTDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8q TVNFQyovCj4gKyNkZWZpbmUgREVGQVVMVF9DT05TX05VTcKgwqDCoMKgwqDCoMKgwqAyMMKgwqDC oMKgCj4gKwo+ICsjZGVmaW5lIE1BWF9DSEFSX1NJWkXCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMzAK PiArCj4gKyNkZWZpbmUgQ0hBUl9TRUPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCJT RUMiCj4gKyNkZWZpbmUgQ0hBUl9NU0VDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIk1T RUMiCj4gKyNkZWZpbmUgQ0hBUl9VU0VDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIlVT RUMiCgpJIHN1Z2dlc3QgdG8gdXNlICJzIiwgIm1zIiwgYW5kICJ1cyIgaGVyZSBpbnN0ZWFkLgoK SWYgeW91IGNyZWF0ZSBhbiBhcnJheSBvZiAiY29uc3QgY2hhcioiIGluc3RlYWQgbGlrZSB5b3Ug ZGlkIGZvcgpjb252ZXJzaW9uX3JhdGlvIGJlbG93LCB5b3UgY291bGQgaW1wbGVtZW50IGdldF9p bnRlcnZhbF90eXBlKCkgbW9yZQplbGVnYW50bHkgdXNpbmcgYSBsb29wIG92ZXIgdGhhdCBhcnJh eS4KCj4gKwo+ICtlbnVtIGludGVydmFsX3R5cGUgewo+ICvCoMKgwqDCoElOVEVSVkFMX1NFQywK PiArwqDCoMKgwqBJTlRFUlZBTF9NU0VDLAo+ICvCoMKgwqDCoElOVEVSVkFMX1VTRUMsCj4gK8Kg wqDCoMKgSU5URVJWQUxfSU5WQUxJRAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBjb252ZXJzaW9u X3JhdGlvW10gPSB7Cj4gKwlbSU5URVJWQUxfU0VDXQkJPSBVU0VDX1BFUl9TRUMsCj4gKwlbSU5U RVJWQUxfTVNFQ10JwqDCoMKgwqA9IFVTRUNfUEVSX01TRUMsCj4gKwlbSU5URVJWQUxfVVNFQ10J CT0gVVNFQ19QRVJfVVNFQywKPiArCVtJTlRFUlZBTF9JTlZBTElEXQk9IDAsCj4gK307Cj4gKwo+ ICsKPiArc3RhdGljIGludCBkb19yZWFkc2VjdG9yMChpbnQgZmQsIHVuc2lnbmVkIGludCB0aW1l b3V0KQo+ICt7Cj4gKwl1bnNpZ25lZCBjaGFyIGJ1Zls0MDk2XTsKPiArCXVuc2lnbmVkIGNoYXIg c2J1ZltTRU5TRV9CVUZGX0xFTl07Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHNnX3JlYWQo ZmQsICZidWZbMF0sIDQwOTYsICZzYnVmWzBdLAo+ICsJCcKgwqDCoMKgwqDCoFNFTlNFX0JVRkZf TEVOLCB0aW1lb3V0KTsKPiArwqDCoMKgwqAKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgZ2V0X2ludGVydmFsX3R5cGUoY2hhciAqc291cmNlLCBjaGFyICp0eXBlKQo+ICt7 wqDCoAo+ICvCoMKgwqDCoC8qaXMgVVNFQyovCj4gK8KgwqDCoMKgaWYgKChzdHJzdHIoc291cmNl LCBDSEFSX1VTRUMpICE9IE5VTEwpCj4gK8KgwqDCoMKgwqDCoMKgwqAmJiAoc3Ryc3RyKHNvdXJj ZSwgQ0hBUl9VU0VDKVs0XSA9PSAnXycpKQoKUGxlYXNlIGF2b2lkIHRoZXNlIGRvdWJsZSBzdHJz dHIoKSBpbnZvY2F0aW9uLiBUaGUgY29tcGlsZXIgbWF5Cm9wdGltaXplIGl0IGF3YXksIGJ1dCBp dCBqdXN0IGxvb2tzIHN0cmFuZ2UuIFRoZSBmb2xsb3dpbmcgd291bGTCoApsb29rIGJldHRlciB0 byBtZSwgYW5kIEkgZmluZCBpdCBhY3R1YWxseSBtb3JlIHJlYWRhYmxlOgoKICAgICAgICBpZiAo KChwID0gc3Ryc3RyKHNvdXJjZSwgQ0hBUl9VU0VDKSkgIT0gTlVMTCkgJiYgcFs0XSA9PSAnXycp Cgo+ICvCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoG1lbWNweSh0eXBlLCBDSEFSX1VTRUMs IHN0cmxlbihDSEFSX1VTRUMpKzEpO8KgwqDCoMKgwqDCoMKgwqAKPiArwqDCoMKgwqDCoMKgwqDC oHJldHVybiBJTlRFUlZBTF9VU0VDOwo+ICvCoMKgwqDCoH0KPiArCj4gK8KgwqDCoMKgLyppcyBN U0VDKi8KPiArwqDCoMKgwqBpZiAoKHN0cnN0cihzb3VyY2UsIENIQVJfTVNFQykgIT0gTlVMTCnC oAo+ICvCoMKgwqDCoMKgwqDCoMKgJiYgKHN0cnN0cihzb3VyY2UsIENIQVJfTVNFQylbNF0gPT0g J18nKSkKPiArwqDCoMKgwqB7Cj4gK8KgwqDCoMKgwqDCoMKgwqBtZW1jcHkodHlwZSwgQ0hBUl9N U0VDLCBzdHJsZW4oQ0hBUl9NU0VDKSsxKTsKPiArwqDCoMKgwqDCoMKgwqDCoHJldHVybiBJTlRF UlZBTF9NU0VDOwo+ICvCoMKgwqDCoH0KPiArCj4gK8KgwqDCoMKgLyppcyBTRUMqLwo+ICsJaWYg KChzdHJzdHIoc291cmNlLCBDSEFSX1NFQykgIT0gTlVMTCkKPiArwqDCoMKgwqDCoMKgwqDCoCYm IChzdHJzdHIoc291cmNlLCBDSEFSX1NFQylbNF0gPT0gJ18nKSkKPiArwqDCoMKgwqB7Cj4gK8Kg wqDCoMKgwqDCoMKgwqBtZW1jcHkodHlwZSwgQ0hBUl9TRUMsIHN0cmxlbihDSEFSX1NFQykrMSk7 Cj4gK8KgwqDCoMKgwqDCoMKgwqByZXR1cm4gSU5URVJWQUxfU0VDOwo+ICvCoMKgwqDCoH0KPiAr Cj4gK8KgwqDCoMKgcmV0dXJuIElOVEVSVkFMX0lOVkFMSUQ7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZ2V0X3N0cmluZ19mcm9tX3VuZGVyKGNoYXIgKmFyZ3MsCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgY2hhciAqYmVmb3Jlc3RyaW5nLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNoYXIg KmFmdGVyc3RyaW5nLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCAqdHlwZSkKCk1heWJl IHlvdSBjb3VsZCBmaWd1cmUgb3V0IGEgbW9yZSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGlzIGZ1 bmN0aW9uPwoKQSBjb21tZW50IGluIHRoZSBjb2RlIHNob3dpbmcgaG93IHRoZSBzdHJpbmcgdG8g YmUgcGFyc2VkIHR5cGljYWxseQpsb29rcyBsaWtlIHdvdWxkIGJlIGhlbHBmdWwgZm9yIHRoZSBy ZWFkZXIuCgo+ICt7Cj4gK8KgwqDCoMKgY2hhciBzb3VyY2VbTUFYX0NIQVJfU0laRV07Cj4gK8Kg wqDCoMKgY2hhciBjaGFyX3R5cGVbTUFYX0NIQVJfU0laRV07Cj4gK8KgwqDCoMKgY2hhciB1bmRl cltdID0gIl8iOwo+ICvCoMKgwqDCoGNoYXIgKnRva2VuwqDCoD0gTlVMTDsKPiArwqDCoMKgwqBj aGFyICp0bXAgPSBOVUxMOwo+ICvCoMKgwqDCoGNoYXIgKnNhdmVwdHIgPSBOVUxMOwo+ICvCoMKg wqDCoHVuc2lnbmVkIGludCBzaXplID0gc3RybGVuKGFyZ3MpOwo+ICsKPiArwqDCoMKgwqBpZiAo KGFyZ3MgPT0gTlVMTCkgfHwgKGJlZm9yZXN0cmluZyA9PSBOVUxMKcKgCj4gK8KgwqDCoMKgwqDC oMKgwqB8fCAoYWZ0ZXJzdHJpbmcgPT0gTlVMTCkgfHwgKHR5cGUgPT0gTlVMTCkpCj4gK8KgwqDC oMKgwqDCoMKgwqByZXR1cm4gMDsKPiArCj4gK8KgwqDCoMKgLyogaW50IHR5cGUgKi8KPiArwqDC oMKgwqBpZiAoKHNpemUgPCAxKSB8fCAoc2l6ZSA+IE1BWF9DSEFSX1NJWkUtMSkpCj4gK8KgwqDC oMKgwqDCoMKgwqByZXR1cm4gMDsKPiArwqDCoMKgwqAKPiArwqDCoMKgwqBtZW1jcHkoc291cmNl LCBhcmdzLCBzaXplKzEpOwo+ICvCoMKgwqDCoGlmIChzdHJzdHIoc291cmNlLCB1bmRlcikgPT0g TlVMTCkKPiArwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ICsKPiArwqDCoMKgwqAqdHlwZSA9 IGdldF9pbnRlcnZhbF90eXBlKHNvdXJjZSwgY2hhcl90eXBlKTsKPiArwqDCoMKgwqBpZiAoKnR5 cGUgPT0gSU5URVJWQUxfSU5WQUxJRCkKPiArwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ICsK PiArwqDCoMKgwqB0b2tlbiA9IHN0cnRva19yKHNvdXJjZSwgdW5kZXIsICZzYXZlcHRyKTsKPiAr wqDCoMKgwqB0b2tlbiA9IHN0cnRvayh0b2tlbiwgY2hhcl90eXBlKTsKCkknbSBwcmV0dHkgc3Vy ZSB0aGlzIGlzIGlzIG5vdCB3aGF0IHlvdSBpbnRlbmRlZCB0byB3cml0ZS4gSWYgY2hhcl90eXBl CmlzICJ1c2VjIiwgdGhpcyB3b3VsZCBzcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBwb3NzaWJsZSBk ZWxpbWl0ZXJzICd1JywKJ3MnLCAnZScsIGFuZCAnYycgKHRoZSAybmQgYXJndW1lbnQgb2Ygc3Ry dG9rKDMpIGlzIG5vdCBhIHNlcXVlbmNlLCBidXQKYSAnc2V0JyBvZiBieXRlcykuIEl0IG1pZ2h0 IGFjY2lkZW50YWxseSB3b3JrIHdpdGggdGhlIGlucHV0IHN0cmluZ3MKeW91IGFyZSB1c2luZyAo aW4gcGFydGljdWxhciBiZWNhdXNlIHlvdSBvbmx5IGxvb2sgYXQgdGhlIGZpcnN0IHRva2VuKSwK YnV0IG5ldmVydGhlbGVzcyBpdCdzIHdyb25nLgoKPiArwqDCoMKgwqBpZiAoKHRva2VuID09IE5V TEwpIHx8IChzYXZlcHRyID09IE5VTEwpKQo+ICvCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4g Kwo+ICvCoMKgwqDCoHRtcCA9IHRva2VuOwo+ICvCoMKgwqDCoHdoaWxlICgqdG1wICE9ICdcMCcp Cj4gK8KgwqDCoMKgwqDCoMKgwqBpZiAoIWlzZGlnaXQoKnRtcCsrKSkKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gKwo+ICvCoMKgwqDCoHRtcCA9IHNhdmVwdHI7Cj4gK8Kg wqDCoMKgd2hpbGUgKCp0bXAgIT0gJ1wwJykKPiArwqDCoMKgwqDCoMKgwqDCoGlmICghaXNkaWdp dCgqdG1wKyspKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiArCj4gK8Kg wqDCoMKgc3RybmNweShiZWZvcmVzdHJpbmcsIHRva2VuLCBzdHJsZW4odG9rZW4pICsgMSk7Cj4g K8KgwqDCoMKgc3RybmNweShhZnRlcnN0cmluZywgc2F2ZXB0ciwgc3RybGVuKHNhdmVwdHIpICsg MSk7Cj4gK8KgwqDCoMKgcmV0dXJuIDE7Cj4gK30KCkkgZG9uJ3QgdGhpbmsgaXQncyBzYWZlIHRv IHVzZSBzYXZlcHRyIHRoZSB3YXkgeW91IGRvIGl0LiBUaGUgc3RydG9rX3IKbWFuIHBhZ2Ugc2F5 cyB0aGlzIHBhcmFtZXRlciBpcyBmb3IgImludGVybmFsIHVzZSIuIFdoaWxlIGl0IG1ha2VzCnNl bnNlIHRvIGFzc3VtZSB0aGF0IGl0IHBvaW50cyB0byB0aGUgbmV4dCB0b2tlbiwgSSdtIG5vdCBz dXJlIGlmCnRoYXQncyBndWFyYW50ZWVkLiBZb3Ugd291bGQgYmUgc2FmZSBieSBjYWxsaW5nIAoK ICAgIHNvbWV2YXIgPSBzdHJ0b2tfcihOVUxMLCB1bmRlciwgJnNhdmVwdHIpCgphbmQgdXNlICJz b21ldmFyIi4KCkluIGdlbmVyYWwsIHRoaXMgd2hvbGUgcGFyc2luZyBjb2RlIGlzIG9kZC4gSUlV QyB0aGlzIHBhcnNlc8KgaW5wdXQKbG9va2luZyBsaWtlIChbMC05XSspKFNFQ3xNU0VDfFVTRUMp XyhbMC05XSspIGFuZCBzZXRzIGJlZm9yZXN0cmluZywKdHlwZSwgYW5kIGFmdGVyc3RyaW5nIHRv IHRoZSByZWdleCBtYXRjaGVzIFwxLCBcMiwgYW5kIFwzLApyZXNwZWN0aXZlbHkuCgpXaHkgZG9u J3QgeW91IHN0YXJ0IHBhcnNpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCwgZS5n LiB3aXRoCnN0cnRvdWwoKSwgYW5kIGxvb2sgYXQgdGhlIHJlc3QgbGF0ZXI/Cgo+ICsKPiAraW50 IGNoZWNrYXJndmFsaWQoaW50IGRlbGF5X2ludGVydmFsLCBpbnQgY29uc19udW0sIGludCB0eXBl KQo+ICt7Cj4gK8KgwqDCoMKgaWYgKHR5cGUgPT0gSU5URVJWQUxfU0VDKQo+ICvCoMKgwqDCoHsK PiArwqDCoMKgwqDCoMKgwqDCoGlmICgoZGVsYXlfaW50ZXJ2YWwgPCAxKSB8fCAoZGVsYXlfaW50 ZXJ2YWwgPiA2MCkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ICvCoMKg wqDCoH0KPiArwqDCoMKgwqBlbHNlIGlmICh0eXBlICE9IElOVEVSVkFMX0lOVkFMSUQpCj4gK8Kg wqDCoMKgewo+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKChkZWxheV9pbnRlcnZhbCA8IDEpIHx8IChk ZWxheV9pbnRlcnZhbCA+PSAxMDAwKSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IDA7Cj4gK8KgwqDCoMKgfQoKWW91IGNvdWxkIGJlIG1vcmUgZm9yZ2l2aW5nIGhlcmUuIDE1MDAw TVNFQyBjb3VsZCBiZSBhIGxlZ2FsIHZhbHVlLgoKPiArwqDCoMKgwqAKPiArwqDCoMKgwqBpZiAo KGNvbnNfbnVtIDwgMykgfHwgKGNvbnNfbnVtID4gMTAwMCkpCj4gK8KgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMDsKPiArCj4gK8KgwqDCoMKgcmV0dXJuIDE7Cj4gK30KPiArCj4gK2ludCBnZXRfZGVs YXlfcHJlZl9hcmcoY2hhciAqYXJncywgaW50ICpkZWxheV9pbnRlcnZhbCwgaW50Cj4gKmNvbnNf bnVtLCBpbnQgKnR5cGUpCj4gK3sKPiArwqDCoMKgwqBjaGFyIGRlbGF5aW50ZXJ2YWxzdHJbTUFY X0NIQVJfU0laRV07Cj4gK8KgwqDCoMKgY2hhciBjb25zbnVtc3RyW01BWF9DSEFSX1NJWkVdOwo+ ICsKPiArwqDCoMKgwqBpZiAoZ2V0X3N0cmluZ19mcm9tX3VuZGVyKGFyZ3MsIGRlbGF5aW50ZXJ2 YWxzdHIsIGNvbnNudW1zdHIsCj4gdHlwZSkgPT0gMCkKPiArwqDCoMKgwqDCoMKgwqDCoHJldHVy biAwOwoKSXQgbWlnaHQgYmUgZ29vZCB0byB3cml0ZSB0aGUgcGFyc2VyIHNvIHRoYXQgdGhlIGNv bnNudW0gcGFydCBjYW4gYmUKbGVmdCBvdXQgYnkgdGhlIHVzZXIsIGFuZCBhc3N1bWUgYSByZWFz b25hYmxlIGRlZmF1bHQgaW4gdGhhdCBjYXNlLgoKPiArCj4gK8KgwqDCoMKgKmRlbGF5X2ludGVy dmFsID0gYXRvaShkZWxheWludGVydmFsc3RyKTsKPiArwqDCoMKgwqAqY29uc19udW0gPSBhdG9p KGNvbnNudW1zdHIpOwo+ICsKPiArwqDCoMKgwqBpZiAoY2hlY2thcmd2YWxpZCgqZGVsYXlfaW50 ZXJ2YWwsICpjb25zX251bSwgKnR5cGUpID09IDApCj4gK8KgwqDCoMKgwqDCoMKgwqByZXR1cm4g MDsKPiArwqDCoMKgwqAKPiArwqDCoMKgwqByZXR1cm4gMTsKPiArfQo+ICsKPiArbG9uZyBsb25n IGdldF9jb252ZXJzaW9uX3JhdGlvKGludCB0eXBlKQo+ICt7Cj4gK8KgwqDCoMKgcmV0dXJuIGNv bnZlcnNpb25fcmF0aW9bdHlwZV07Cj4gK30KPiArwqDCoMKgwqAKPiAraW50IGdldHByaW8gKHN0 cnVjdCBwYXRoICpwcCwgY2hhciAqYXJncywgdW5zaWduZWQgaW50IHRpbWVvdXQpCj4gK3sKPiAr wqDCoMKgwqBpbnQgcmMsIGRlbGF5X2ludGVydmFsLCBjb25zX251bSwgdHlwZSwgdGVtcDsKPiAr wqDCoMKgwqBsb25nIGxvbmcgZGVsYXksIGF2Z2RlbGF5LCByYXRpbzsKPiArwqDCoMKgwqBsb25n IGxvbmcgbWluID0gVEhSRVNfVVNFQ19WQUxVRTsKPiArwqDCoMKgwqBsb25nIGxvbmcgbWF4ID0g MDsKPiArwqDCoMKgwqBsb25nIGxvbmcgdG9sZGVsYXkgPSAwOwo+ICvCoMKgwqDCoGxvbmcgbG9u ZyBiZWZvcmUsIGFmdGVyOwo+ICvCoMKgwqDCoHN0cnVjdCB0aW1ldmFsIHR2Owo+ICsKPiArwqDC oMKgwqBpZiAoZ2V0X2RlbGF5X3ByZWZfYXJnKGFyZ3MsICZkZWxheV9pbnRlcnZhbCwgJmNvbnNf bnVtLCAmdHlwZSkKPiA9PSAwKQo+ICvCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoGNvbmRs b2coMywgIiVzOiBnZXQgZGVsYXkgYXJnIGZhaWwiLCBwcC0+ZGV2KTsKPiArwqDCoMKgwqDCoMKg wqDCoGRlbGF5X2ludGVydmFsID0gREVGQVVMVF9ERUxBWV9JTlRFUlZBTDsKPiArwqDCoMKgwqDC oMKgwqDCoGNvbnNfbnVtID0gREVGQVVMVF9DT05TX05VTTsKPiArwqDCoMKgwqDCoMKgwqDCoHR5 cGUgPSBJTlRFUlZBTF9NU0VDOwo+ICvCoMKgwqDCoH0KPiArCj4gK8KgwqDCoMKgdGVtcCA9IGNv bnNfbnVtOwo+ICvCoMKgwqDCoHdoaWxlICh0ZW1wLS0gPiAwKQo+ICvCoMKgwqDCoHsKPiArwqDC oMKgwqDCoMKgwqDCoCh2b2lkKWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwo+ICvCoMKgwqDCoMKg wqDCoMKgYmVmb3JlID0gdGltZXZhbF90b191cygmdHYpOwkJCj4gKwo+ICvCoMKgwqDCoMKgwqDC oMKgaWYgKGRvX3JlYWRzZWN0b3IwKHBwLT5mZCwgdGltZW91dCkgPT0gMikKPiArwqDCoMKgwqDC oMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29uZGxvZygwLCAiJXM6IHBhdGgg ZG93biIsIHBwLT5kZXYpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMTsKPiAr wqDCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoMKgwqDCoAo+ICvCoMKgwqDCoMKgwqDCoMKg KHZvaWQpZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CgpJdCdzIGJldHRlciB0byB1c2UgY2xvY2tf Z2V0dGltZShDTE9DS19NT05PVE9OSUMsIC4uLikgaGVyZS4gVGhlbiB5b3UKY2FuIHRocm93IGF3 YXkgdGhlIGRlbGF5IDwgMCBjaGVjayBiZWxvdy4KCj4gK8KgwqDCoMKgwqDCoMKgwqBhZnRlciA9 IHRpbWV2YWxfdG9fdXMoJnR2KTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqBkZWxheSA9IGFmdGVy IC0gYmVmb3JlOwo+ICvCoMKgwqDCoMKgwqDCoMKgaWYgKGRlbGF5IDwgMCkKPiArwqDCoMKgwqDC oMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29uZGxvZygwLCAiJXM6IGRlbGF5 IGNhbGMgZXJyb3IiLCBwcC0+ZGV2KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IDE7Cj4gK8KgwqDCoMKgwqDCoMKgwqB9Cj4gK8KgwqDCoMKgCQo+ICvCoMKgwqDCoMKgwqDCoMKg bWluID0gKG1pbiA8PSBkZWxheSkgPyBtaW4gOiBkZWxheTsKPiArwqDCoMKgwqDCoMKgwqDCoG1h eCA9IChtYXggPj0gZGVsYXkpID8gbWF4IDogZGVsYXk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgCj4gK8KgwqDCoMKgwqDCoMKgwqB0b2xkZWxheSArPSBkZWxheTsKPiArwqDC oMKgwqB9Cj4gKwo+ICvCoMKgwqDCoHRvbGRlbGF5IC09IG1pbiArIG1heDsKPiArwqDCoMKgwqBh dmdkZWxheSA9IHRvbGRlbGF5Lyhsb25nIGxvbmcpKGNvbnNfbnVtIC0gMik7Cj4gK8KgwqDCoMKg aWYgKGF2Z2RlbGF5ID4gVEhSRVNfVVNFQ19WQUxVRSnCoAo+ICvCoMKgwqDCoHvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgCj4gK8KgwqDCoMKgwqDCoMKgwqBjb25kbG9nKDAsICIlczogYXZnZGVsYXkg aXMgbW9yZSB0aGFuIHRocmVzb2xkIiwgcHAtPmRldik7Cj4gK8KgwqDCoMKgwqDCoMKgwqByZXR1 cm4gMTsKPiArwqDCoMKgwqB9Cj4gK8KgwqDCoMKgCj4gKwlyYXRpbyA9IGdldF9jb252ZXJzaW9u X3JhdGlvKHR5cGUpOwo+ICsJcmMgPSAoaW50KShUSFJFU19VU0VDX1ZBTFVFIC0gKGF2Z2RlbGF5 LygoKGxvbmcKPiBsb25nKWRlbGF5X2ludGVydmFsKSAqIHJhdGlvKSkpOwo+ICsKPiArwqDCoMKg wqByZXR1cm4gcmM7Cj4gK30KCklzIGl0IHJlYXNvbmFibGUgdG8gZG8gdGhlc2UgaW50ZXJ2YWwg Y2FsY3VsYXRpb25zIHN5bmNocm9ub3VzbHkgaW4KZ2V0cHJpbygpPyBjb25zX251bSBpcyBsaW1p dGVkIHRvIDEwMDAsIHNvIHRoaXMgcm91dGluZSBjb3VsZCBpc3N1ZQoxMDAwIHJlYWRzIG9uIHRo ZSBkZXZpY2UgYmVmb3JlIHJldHVybmluZy4gSW4gcGFydGljdWxhciBpZiB0aGUgZGV2aWNlCmlz IHVuZGVyIElPIGxvYWQgYW5kIHRoZSBkZWxheSBpcyBoaWdoLCBleGVjdXRpb24gaWYgdGhpcyBy b3V0aW5lIGNvdWxkCmJlIHJlYWxseSBzbG93LgoKSXQgd291bGQgbWFrZSBtb3JlIHNlbnNlIHRv IG1lIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdApjYWxjdWxhdGVzIHNvbWUgc29ydCBv ZiAicnVubmluZyBhdmVyYWdlIiBmb3IgdGhlIGRlbGF5IG9mIHRoZQpkaWZmZXJlbnQgcGF0aHMs IGFuZCBoYXZlIGdldHByaW8oKSBqdXN0IGZldGNoIHRoZSBjdXJyZW50IHZhbHVlIG9mCnRoYXQg dmFyaWFibGUuCgpSZWdhcmRzCk1hcnRpbgoKLS0gCkRyLiBNYXJ0aW4gV2lsY2sgPG13aWxja0Bz dXNlLmNvbT4sIFRlbC7CoCs0OSAoMCk5MTEgNzQwNTMgMjEwNwpTVVNFIExpbnV4IEdtYkgsIEdG OiBGZWxpeCBJbWVuZMO2cmZmZXIsIEphbmUgU21pdGhhcmQsIEdyYWhhbSBOb3J0b24KSFJCIDIx Mjg0IChBRyBOw7xybmJlcmcpCgotLQpkbS1kZXZlbCBtYWlsaW5nIGxpc3QKZG0tZGV2ZWxAcmVk aGF0LmNvbQpodHRwczovL3d3dy5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vZG0tZGV2ZWw=