From kde-core-devel Thu Mar 07 07:58:45 2002 From: Michael Matz Date: Thu, 07 Mar 2002 07:58:45 +0000 To: kde-core-devel Subject: [patch] Zone allocator and kcompletion using it X-MARC-Message: https://marc.info/?l=kde-core-devel&m=101548821111372 MIME-Version: 1 Content-Type: multipart/mixed; boundary="---559023410-1932422408-1015487925=:21480" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---559023410-1932422408-1015487925=:21480 Content-Type: TEXT/PLAIN; charset=US-ASCII Hi, while looking for the cause of so many malloc() that we now even have a whole malloc() replacement, one thing (among others) we found was KCompletion. The attached patch reworks it to not use QValueList<> anymore for the children per node, which quarters the amount of malloc(). I.e. QValueList<> is not the optimal thing for holding many small things. The second thing which this patch does is to rework KZoneAllocator to make it more usefull. It now can be used as a real obstack (i.e. clearing all objects allocated since a certain one) or as a general purpose allocator with a normal deallocate (or as a mixture of both). Because it does no compaction it's still much faster than malloc()/free() (some simple tests just allocating heaps of small objects and deallocating them again show that it's 5 times faster than malloc()/free()). It's still targeted at allocating many small objects. Also to not hold memory longer than necessary nearby objects (as defined by allocation time) should be deallocated also nearly together. I.e. something like allocating 100 things, and then only freeing every second one will not free any memory. It also potentially uses less memory, because we have no per-object overhead item as in malloc, which for small objects (say 4 bytes) might double the amount actually needed. And the final thing is to make use of that KZoneAllocator in KCompletion by defining operators new and delete for KCompTreeNode which gets rid of the last malloc() in the code. A changed kcompletiontest which just add a big number of strings in different ways, and clears the completion object in between showed more than a double speedup (from 4950 to 2100 msec). I'm using various versions of this patch since last sunday (or saturday?). Binary compatibility is not really an issue here, because KZoneAllocator wasn't used anywhere in kdecvs. I think it could be used very well in khtml and similar things dealing with a large number of rather small objects. If used correctly it can also greatly simplify code because there's no need to remember pointer just for freeing them (this only works for objects without destructors of course), but if not it makes it faster because of no needed free() calls. Kind of like a poor mans garbage collection ;-) Ciao, Michael. ---559023410-1932422408-1015487925=:21480 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="allocation2.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="allocation2.diff" PyBNYWtlZmlsZS5pbi5yZWFsDQo/IGtjaGFyc2V0cy5jcHBfbW0NCj8ga2No YXJzZXRzLmRpZmYNCj8ga2RlY29yZS5kaWZmDQo/IGtsaWJsb2FkZXIuZGlm Zg0KSW5kZXg6IGthbGxvY2F0b3IuY3BwDQo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQpSQ1MgZmlsZTogL2hvbWUva2RlL2tkZWxpYnMva2RlY29yZS9rYWxs b2NhdG9yLmNwcCx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNA0KZGlmZiAt dSAtcCAtcjEuNCBrYWxsb2NhdG9yLmNwcA0KLS0tIGthbGxvY2F0b3IuY3Bw CTIwMDAvMTAvMDkgMjE6Mjk6MDAJMS40DQorKysga2FsbG9jYXRvci5jcHAJ MjAwMi8wMy8wNyAwNzoyMTozNg0KQEAgLTIsNiArMiw3IEBADQogICAgIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBLREUgbGlicmFyaWVzDQogDQogICAg IENvcHlyaWdodCAoQykgMTk5OSBXYWxkbyBCYXN0aWFuIChiYXN0aWFuQGtk ZS5vcmcpDQorICAgIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE1hdHog KG1hdHpAa2RlLm9yZykNCiANCiAgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICAg ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy eSBHZW5lcmFsIFB1YmxpYw0KQEAgLTE4LDQ2ICsxOSwyMjcgQEANCiAgICAg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl IFBsYWNlIC0gU3VpdGUgMzMwLA0KICAgICBCb3N0b24sIE1BIDAyMTExLTEz MDcsIFVTQS4NCiAqLw0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KLS8vDQotLy8gS0RFIEhUTUwgV2lkZ2V0IC0tIE9iamVjdHMNCisN CisvKiBGYXN0IHpvbmUgbWVtb3J5IGFsbG9jYXRvciB3aXRoIGRlYWxsb2Nh dGlvbiBzdXBwb3J0LCBmb3IgdXNlIGFzIG9ic3RhY2sNCisgICBvciBhcyBn ZW5lcmFsIHB1cnBvc2UgYWxsb2NhdG9yLiAgSXQgZG9lcyBubyBjb21wYWN0 aW9uLiAgSWYgdGhlIHVzYWdlDQorICAgcGF0dGVybiBpcyBub24tb3B0aW1h bCBpdCBtaWdodCB3YXN0ZSBzb21lIG1lbW9yeSB3aGlsZSBydW5uaW5nLiAg RS5nLg0KKyAgIGFsbG9jYXRpbmcgbWFueSBzbWFsbCB0aGluZ3MgYXQgb25j ZSwgYW5kIHRoZW4gZGVhbGxvY2F0aW5nIG9ubHkgZXZlcnkNCisgICBzZWNv bmQgb25lLCB0aGVyZSBpcyBhIGhpZ2ggY2hhbmNlLCB0aGF0IGFjdHVhbGx5 IG5vIG1lbW9yeSBpcyBmcmVlZC4gICovDQogLy8gJElkOiBrYWxsb2NhdG9y LmNwcCx2IDEuNCAyMDAwLzEwLzA5IDIxOjI5OjAwIHphbmRlciBFeHAgJA0K IA0KICNpbmNsdWRlICJrYWxsb2NhdG9yLmgiDQogI2luY2x1ZGUgPGtkZWJ1 Zy5oPg0KIA0KLUtab25lQWxsb2NhdG9yOjpLWm9uZUFsbG9jYXRvcihsb25n IF9ibG9ja1NpemUpDQotOiBibG9ja1NpemUoX2Jsb2NrU2l6ZSksIGJsb2Nr T2Zmc2V0KDApDQorY2xhc3MgS1pvbmVBbGxvY2F0b3I6Ok1lbUJsb2NrDQor ew0KKyAgcHVibGljOg0KKyAgICBNZW1CbG9jayhzaXplX3QgcykgOiBzaXpl KHMpLCByZWYoMCksIG9sZGVyKDApLCBuZXdlcigwKQ0KKyAgICAgIHsgYmVn aW4gPSBuZXcgY2hhcltzXTsgfQ0KKyAgICB+TWVtQmxvY2soKSB7IGRlbGV0 ZSBbXSBiZWdpbjsgfQ0KKyAgICBib29sIGlzX2luKHZvaWQgKnB0cikgY29u c3Qge3JldHVybiAhKGJlZ2luID4gKGNoYXIgKilwdHINCisgICAgCQkJCSAg ICAgICAgICB8fCAoYmVnaW4gKyBzaXplKSA8PSAoY2hhciAqKXB0cik7IH0N CisgICAgc2l6ZV90IHNpemU7DQorICAgIHVuc2lnbmVkIGludCByZWY7DQor ICAgIGNoYXIgKmJlZ2luOw0KKyAgICBNZW1CbG9jayAqb2xkZXI7DQorICAg IE1lbUJsb2NrICpuZXdlcjsNCit9Ow0KKw0KK0tab25lQWxsb2NhdG9yOjpL Wm9uZUFsbG9jYXRvcih1bnNpZ25lZCBsb25nIF9ibG9ja1NpemUpDQorOiBj dXJyZW50QmxvY2soMCksIGJsb2NrU2l6ZSgxKSwgYmxvY2tPZmZzZXQoMCks IGxvZzIoMCksIG51bV9ibG9ja3MoMCksIA0KKyAgaGFzaExpc3QoMCksIGhh c2hTaXplKDApLCBoYXNoRGlydHkodHJ1ZSkNCiB7DQotICAgIGN1cnJlbnRC bG9jayA9IG5ldyBjaGFyW19ibG9ja1NpemVdOw0KLSAgICBtZW1vcnlCbG9j a3MuYXBwZW5kKGN1cnJlbnRCbG9jayk7DQorICB3aGlsZSAoYmxvY2tTaXpl IDwgX2Jsb2NrU2l6ZSkNCisgICAgYmxvY2tTaXplIDw8PSAxLCBsb2cyKys7 DQorICBibG9ja09mZnNldCA9IGJsb2NrU2l6ZTsNCiB9DQogDQogS1pvbmVB bGxvY2F0b3I6On5LWm9uZUFsbG9jYXRvcigpDQogew0KLSAgICB3aGlsZSAo IW1lbW9yeUJsb2Nrcy5pc0VtcHR5KCkpDQotICAgIHsNCi0gICAgICAgIGNo YXIgKm9sZEJ1ZmZlciA9IChjaGFyICopIG1lbW9yeUJsb2Nrcy50YWtlKDAp Ow0KLSAgICAgICAgZGVsZXRlIFtdIG9sZEJ1ZmZlcjsNCisgIHVuc2lnbmVk IGludCBjb3VudCA9IDA7DQorICBpZiAoaGFzaExpc3QpIHsNCisgICAgLyog Tm8gbmVlZCB0byBtYWludGFpbiB0aGUgZGlmZmVyZW50IGxpc3RzIGluIGhh c2hMaXN0W10gYW55bW9yZS4NCisgICAgICAgSS5lLiBubyBuZWVkIHRvIHVz ZSBkZWxCbG9jaygpLiAgKi8NCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBo YXNoU2l6ZTsgaSsrKQ0KKyAgICAgIGRlbGV0ZSBoYXNoTGlzdFtpXTsNCisg ICAgZGVsZXRlIFtdIGhhc2hMaXN0Ow0KKyAgICBoYXNoTGlzdCA9IDA7DQor ICB9DQorICBNZW1CbG9jayAqbmV4dDsNCisgIGZvciAoOyBjdXJyZW50Qmxv Y2s7IGN1cnJlbnRCbG9jayA9IG5leHQpIHsNCisgICAgbmV4dCA9IGN1cnJl bnRCbG9jay0+b2xkZXI7DQorICAgIGRlbGV0ZSBjdXJyZW50QmxvY2s7DQor ICAgIGNvdW50Kys7DQorICB9DQorICBpZiAoY291bnQgPiAxKQ0KKyAgICBx RGVidWcoInpvbmUgc3RpbGwgY29udGFpbmVkICVkIGJsb2NrcyIsIGNvdW50 KTsNCit9DQorDQordm9pZCBLWm9uZUFsbG9jYXRvcjo6aW5zZXJ0SGFzaChN ZW1CbG9jayAqYikNCit7DQorICB1bnNpZ25lZCBpbnQgYWRyID0gKCh1bnNp Z25lZCBpbnQpYi0+YmVnaW4pICYgKH4oYmxvY2tTaXplIC0gMSkpOw0KKyAg dW5zaWduZWQgaW50IGVuZCA9ICgodW5zaWduZWQgaW50KWItPmJlZ2luKSAr IGJsb2NrU2l6ZTsNCisgIHdoaWxlIChhZHIgPCBlbmQpIHsNCisgICAgdW5z aWduZWQgaW50IGtleSA9IGFkciA+PiBsb2cyOw0KKyAgICBrZXkgPSBrZXkg JiAoaGFzaFNpemUgLSAxKTsNCisgICAgaWYgKCFoYXNoTGlzdFtrZXldKQ0K KyAgICAgIGhhc2hMaXN0W2tleV0gPSBuZXcgUVZhbHVlTGlzdDxNZW1CbG9j ayAqPjsNCisgICAgaGFzaExpc3Rba2V5XS0+YXBwZW5kKGIpOw0KKyAgICBh ZHIgKz0gYmxvY2tTaXplOw0KKyAgfQ0KK30NCisNCit2b2lkIEtab25lQWxs b2NhdG9yOjphZGRCbG9jayhNZW1CbG9jayAqYikNCit7DQorICBiLT5uZXdl ciA9IDA7DQorICBiLT5vbGRlciA9IGN1cnJlbnRCbG9jazsNCisgIGlmIChj dXJyZW50QmxvY2spDQorICAgIGItPm9sZGVyLT5uZXdlciA9IGI7DQorICBj dXJyZW50QmxvY2sgPSBiOw0KKyAgbnVtX2Jsb2NrcysrOw0KKyAgLyogSWYg d2UgZWl0aGVyIGhhdmUgbm8gaGFzaExpc3QgYXQgYWxsLCBvciBzaW5jZSBp dCdzIGxhc3QgY29uc3RydWN0aW9uDQorICAgICB0aGVyZSBhcmUgbm93IG1h bnkgbW9yZSBibG9ja3Mgd2UgcmVjb25zdHJ1Y3QgdGhlIGxpc3QuICBCdXQg ZG9uJ3QNCisgICAgIG1ha2UgaXQgbGFyZ2VyIHRoYW4gYSBjZXJ0YWluIG1h eGltdW0uICAqLw0KKyAgaWYgKGhhc2hMaXN0ICYmICgobnVtX2Jsb2NrcyAv IDQpID4gaGFzaFNpemUgJiYgaGFzaFNpemUgPCA2NCoxMDI0KSkNCisgICAg aGFzaERpcnR5ID0gdHJ1ZTsNCisgIC8qIE9ubHkgaW5zZXJ0IHRoaXMgYmxv Y2sgaW50byB0aGUgaGFzaGxpc3RzLCBpZiB3ZSBhcmVuJ3QgZ29pbmcgdG8N CisgICAgIHJlY29uc3RydWN0IHRoZW0gYW55d2F5LiAgKi8NCisgIGlmICho YXNoTGlzdCAmJiAhaGFzaERpcnR5KQ0KKyAgICBpbnNlcnRIYXNoIChiKTsN Cit9DQorDQordm9pZCBLWm9uZUFsbG9jYXRvcjo6aW5pdEhhc2goKQ0KK3sN CisgIGlmIChoYXNoTGlzdCkgew0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8 IGhhc2hTaXplOyBpKyspDQorICAgICAgZGVsZXRlIGhhc2hMaXN0W2ldOw0K KyAgICBkZWxldGUgW10gaGFzaExpc3Q7DQorICAgIGhhc2hMaXN0ID0gMDsN CisgIH0NCisgIGhhc2hTaXplID0gMTsNCisgIHdoaWxlIChoYXNoU2l6ZSA8 IG51bV9ibG9ja3MpDQorICAgIGhhc2hTaXplIDw8PSAxOw0KKyAgaWYgKGhh c2hTaXplIDwgMTAyNCkNCisgICAgaGFzaFNpemUgPSAxMDI0Ow0KKyAgaWYg KGhhc2hTaXplID4gNjQqMTAyNCkNCisgICAgaGFzaFNpemUgPSA2NCoxMDI0 Ow0KKyAgaGFzaExpc3QgPSBuZXcgUVZhbHVlTGlzdDxNZW1CbG9jayAqPiAq W2hhc2hTaXplXTsNCisgIG1lbXNldCAoaGFzaExpc3QsIDAsIHNpemVvZihR VmFsdWVMaXN0PE1lbUJsb2NrKj4gKikgKiBoYXNoU2l6ZSk7DQorICBoYXNo RGlydHkgPSBmYWxzZTsNCisgIGZvciAoTWVtQmxvY2sgKmIgPSBjdXJyZW50 QmxvY2s7IGI7IGIgPSBiLT5vbGRlcikNCisgICAgaW5zZXJ0SGFzaChiKTsN Cit9DQorDQordm9pZCBLWm9uZUFsbG9jYXRvcjo6ZGVsQmxvY2soTWVtQmxv Y2sgKmIpDQorew0KKyAgLyogVXBkYXRlIGFsc28gdGhlIGhhc2hsaXN0cyBp ZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gcmVjb25zdHJ1Y3QgdGhlbQ0KKyAgICAg c29vbi4gICovDQorICBpZiAoaGFzaExpc3QgJiYgIWhhc2hEaXJ0eSkgew0K KyAgICB1bnNpZ25lZCBpbnQgYWRyID0gKCh1bnNpZ25lZCBpbnQpYi0+YmVn aW4pICYgKH4oYmxvY2tTaXplIC0gMSkpOw0KKyAgICB1bnNpZ25lZCBpbnQg ZW5kID0gKCh1bnNpZ25lZCBpbnQpYi0+YmVnaW4pICsgYmxvY2tTaXplOw0K KyAgICB3aGlsZSAoYWRyIDwgZW5kKSB7DQorICAgICAgdW5zaWduZWQgaW50 IGtleSA9IGFkciA+PiBsb2cyOw0KKyAgICAgIGtleSA9IGtleSAmIChoYXNo U2l6ZSAtIDEpOw0KKyAgICAgIGlmIChoYXNoTGlzdFtrZXldKSB7DQorCVFW YWx1ZUxpc3Q8TWVtQmxvY2sgKj4gKmxpc3QgPSBoYXNoTGlzdFtrZXldOw0K KwlRVmFsdWVMaXN0PE1lbUJsb2NrICo+OjpJdGVyYXRvciBpdCA9IGxpc3Qt PmJlZ2luKCk7DQorCVFWYWx1ZUxpc3Q8TWVtQmxvY2sgKj46Okl0ZXJhdG9y IGVuZGl0ID0gbGlzdC0+ZW5kKCk7DQorCWZvciAoOyBpdCAhPSBlbmRpdDsg KytpdCkNCisJICBpZiAoKml0ID09IGIpIHsNCisJICAgIGxpc3QtPnJlbW92 ZShpdCk7DQorCSAgICBicmVhazsNCisJICB9DQorICAgICAgfQ0KKyAgICAg IGFkciArPSBibG9ja1NpemU7DQogICAgIH0NCisgIH0NCisgIGlmIChiLT5v bGRlcikNCisgICAgYi0+b2xkZXItPm5ld2VyID0gYi0+bmV3ZXI7DQorICBp ZiAoYi0+bmV3ZXIpDQorICAgIGItPm5ld2VyLT5vbGRlciA9IGItPm9sZGVy Ow0KKyAgaWYgKGIgPT0gY3VycmVudEJsb2NrKSB7DQorICAgIGN1cnJlbnRC bG9jayA9IDA7DQorICAgIGJsb2NrT2Zmc2V0ID0gYmxvY2tTaXplOw0KKyAg fQ0KKyAgZGVsZXRlIGI7DQorICBudW1fYmxvY2tzLS07DQogfQ0KIA0KIHZv aWQgKg0KIEtab25lQWxsb2NhdG9yOjphbGxvY2F0ZShzaXplX3QgX3NpemUp DQogew0KICAgIC8vIFVzZSB0aGUgc2l6ZSBvZiAodm9pZCAqKSBhcyBhbGln bm1lbnQNCi0gICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gc2l6ZW9mKHZv aWQgKik7DQotICAgX3NpemUgPSAoX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAm IH4oYWxpZ25tZW50IC0gMSk7ICAgDQorICAgY29uc3Qgc2l6ZV90IGFsaWdu bWVudCA9IHNpemVvZih2b2lkICopIC0gMTsNCisgICBfc2l6ZSA9IChfc2l6 ZSArIGFsaWdubWVudCkgJiB+YWxpZ25tZW50OyAgIA0KIA0KLSAgIGlmICgo bG9uZykgX3NpemUgKyBibG9ja09mZnNldCA+IGJsb2NrU2l6ZSkNCisgICBp ZiAoKHVuc2lnbmVkIGxvbmcpIF9zaXplICsgYmxvY2tPZmZzZXQgPiBibG9j a1NpemUpDQogICAgew0KLSAgICAgIGN1cnJlbnRCbG9jayA9IG5ldyBjaGFy W2Jsb2NrU2l6ZV07DQotICAgICAgbWVtb3J5QmxvY2tzLmFwcGVuZChjdXJy ZW50QmxvY2spOw0KKyAgICAgIGlmIChfc2l6ZSA+IGJsb2NrU2l6ZSkgew0K KwlxRGVidWcoIktab25lQWxsb2NhdG9yOiBhbGxvY2F0aW5nIG1vcmUgdGhh biAldSBieXRlcyIsIGJsb2NrU2l6ZSk7DQorCXJldHVybiAwOw0KKyAgICAg IH0NCisgICAgICBhZGRCbG9jayhuZXcgTWVtQmxvY2soYmxvY2tTaXplKSk7 DQogICAgICAgYmxvY2tPZmZzZXQgPSAwOw0KLSAgICAgIGtkRGVidWcgKCkg PDwgIkFsbG9jYXRpbmcgYmxvY2sgIyIgPDwgIG1lbW9yeUJsb2Nrcy5jb3Vu dCgpIDw8IGVuZGw7DQotICAgfSANCi0gICB2b2lkICpyZXN1bHQgPSAodm9p ZCAqKShjdXJyZW50QmxvY2srYmxvY2tPZmZzZXQpOw0KKyAgICAgIC8vcURl YnVnICgiQWxsb2NhdGluZyBibG9jayAjJWQgKCV4KVxuIiwgbnVtX2Jsb2Nr cywgY3VycmVudEJsb2NrLT5iZWdpbik7DQorICAgfQ0KKyAgIHZvaWQgKnJl c3VsdCA9ICh2b2lkICopKGN1cnJlbnRCbG9jay0+YmVnaW4rYmxvY2tPZmZz ZXQpOw0KKyAgIGN1cnJlbnRCbG9jay0+cmVmKys7DQogICAgYmxvY2tPZmZz ZXQgKz0gX3NpemU7DQogICAgcmV0dXJuIHJlc3VsdDsNCiB9DQogDQordm9p ZA0KK0tab25lQWxsb2NhdG9yOjpkZWFsbG9jYXRlKHZvaWQgKnB0cikNCit7 DQorICBpZiAoaGFzaERpcnR5KQ0KKyAgICBpbml0SGFzaCgpOw0KKw0KKyAg dW5zaWduZWQgaW50IGtleSA9ICgoKHVuc2lnbmVkIGludClwdHIpID4+IGxv ZzIpICYgKGhhc2hTaXplIC0gMSk7DQorICBRVmFsdWVMaXN0PE1lbUJsb2Nr ICo+ICpsaXN0ID0gaGFzaExpc3Rba2V5XTsNCisgIGlmICghbGlzdCkgew0K KyAgICAvKiBDYW4gaGFwcGVuIHdpdGggY2VydGFpbiB1c2FnZSBwYXR0ZXJu IG9mIGludGVybWl4ZWQgZnJlZV9zaW5jZSgpDQorICAgICAgIGFuZCBkZWFs bG9jYXRlKCkuICAqLw0KKyAgICAvL3FEZWJ1ZygiVWhvaCIpOw0KKyAgICBy ZXR1cm47DQorICB9DQorICBRVmFsdWVMaXN0PE1lbUJsb2NrKj46OkNvbnN0 SXRlcmF0b3IgaXQgPSBsaXN0LT5iZWdpbigpOw0KKyAgUVZhbHVlTGlzdDxN ZW1CbG9jayo+OjpDb25zdEl0ZXJhdG9yIGVuZGl0ID0gbGlzdC0+ZW5kKCk7 DQorICBmb3IgKDsgaXQgIT0gZW5kaXQ7ICsraXQpIHsNCisgICAgTWVtQmxv Y2sgKmN1ciA9ICppdDsNCisgICAgaWYgKGN1ci0+aXNfaW4ocHRyKSkgew0K KyAgICAgIGlmICghLS1jdXItPnJlZikgew0KKwlpZiAoY3VyICE9IGN1cnJl bnRCbG9jaykNCisJICBkZWxCbG9jayAoY3VyKTsNCisJZWxzZQ0KKwkgIGJs b2NrT2Zmc2V0ID0gMDsNCisgICAgICB9DQorICAgICAgcmV0dXJuOw0KKyAg ICB9DQorICB9DQorICAvKiBDYW4gaGFwcGVuIHdpdGggY2VydGFpbiB1c2Fn ZSBwYXR0ZXJuIG9mIGludGVybWl4ZWQgZnJlZV9zaW5jZSgpDQorICAgICBh bmQgZGVhbGxvY2F0ZSgpLiAgKi8NCisgIC8vcURlYnVnKCJVaG9oMiIpOw0K K30NCisNCit2b2lkDQorS1pvbmVBbGxvY2F0b3I6OmZyZWVfc2luY2Uodm9p ZCAqcHRyKQ0KK3sNCisgIC8qIElmIHdlIGhhdmUgYSBoYXNoTGlzdCBhbmQg aXQncyBub3QgeWV0IGRpcnR5LCBzZWUsIGlmIHdlIHdpbGwgZGlydHkNCisg ICAgIGl0IGJ5IHJlbW92aW5nIHRvbyBtYW55IGJsb2Nrcy4gIFRoaXMgd2ls bCBtYWtlIHRoZSBiZWxvdyBkZWxCbG9jaygpcw0KKyAgICAgZmFzdGVyLiAg Ki8NCisgIGlmIChoYXNoTGlzdCAmJiAhaGFzaERpcnR5KQ0KKyAgICB7DQor ICAgICAgY29uc3QgTWVtQmxvY2sgKmI7DQorICAgICAgdW5zaWduZWQgaW50 IHJlbW92ZWQgPSAwOw0KKyAgICAgIGZvciAoYiA9IGN1cnJlbnRCbG9jazsg YjsgYiA9IGItPm9sZGVyLCByZW1vdmVkKyspDQorCWlmIChiLT5pc19pbiAo cHRyKSkNCisJICBicmVhazsNCisgICAgICBpZiAoaGFzaFNpemUgPj0gNCAq IChudW1fYmxvY2tzIC0gcmVtb3ZlZCkpDQorICAgICAgICBoYXNoRGlydHkg PSB0cnVlOw0KKyAgICB9DQorICB3aGlsZSAoY3VycmVudEJsb2NrICYmICFj dXJyZW50QmxvY2stPmlzX2luKHB0cikpIHsNCisgICAgY3VycmVudEJsb2Nr ID0gY3VycmVudEJsb2NrLT5vbGRlcjsNCisgICAgZGVsQmxvY2sgKGN1cnJl bnRCbG9jay0+bmV3ZXIpOw0KKyAgfQ0KKyAgYmxvY2tPZmZzZXQgPSAoKGNo YXIqKXB0cikgLSBjdXJyZW50QmxvY2stPmJlZ2luOw0KK30NCkluZGV4OiBr YWxsb2NhdG9yLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxl OiAvaG9tZS9rZGUva2RlbGlicy9rZGVjb3JlL2thbGxvY2F0b3IuaCx2DQpy ZXRyaWV2aW5nIHJldmlzaW9uIDEuNg0KZGlmZiAtdSAtcCAtcjEuNiBrYWxs b2NhdG9yLmgNCi0tLSBrYWxsb2NhdG9yLmgJMjAwMS8xMi8wNiAxMzowMzo1 NwkxLjYNCisrKyBrYWxsb2NhdG9yLmgJMjAwMi8wMy8wNyAwNzoyMTozNg0K QEAgLTIsNiArMiw3IEBADQogICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRo ZSBLREUgbGlicmFyaWVzDQogDQogICAgIENvcHlyaWdodCAoQykgMTk5OSBX YWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpDQorICAgIENvcHlyaWdo dCAoQykgMjAwMiBNaWNoYWVsIE1hdHogKG1hdHpAa2RlLm9yZykNCiAgICAg ICAgICAgICAgIA0KICAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQogICAgIG1vZGlm eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy YWwgUHVibGljDQpAQCAtMjYsMTcgKzI3LDIxIEBADQogI2lmbmRlZiBLQUxM T0NBVE9SX0gNCiAjZGVmaW5lIEtBTExPQ0FUT1JfSA0KIA0KLSNpbmNsdWRl IDxzdGRpby5oPg0KLSNpbmNsdWRlIDxxcHRybGlzdC5oPg0KKyNpbmNsdWRl IDxxdmFsdWVsaXN0Lmg+DQogDQogY2xhc3MgS1pvbmVBbGxvY2F0b3JQcml2 YXRlOw0KIA0KKw0KIC8qKg0KICAqIE1lbW9yeSBhbGxvY2F0b3IgZm9yIGxh cmdlIGdyb3VwcyBvZiBzbWFsbCBvYmplY3RzLg0KICAqIFRoaXMgc2hvdWxk IGJlIHVzZWQgZm9yIGxhcmdlIGdyb3VwcyBvZiBvYmplY3RzIHRoYXQgYXJl IGNyZWF0ZWQgYW5kDQogICogZGVzdHJveWVkIHRvZ2V0aGVyLiBXaGVuIHVz ZWQgY2FyZWZ1bGx5IGZvciB0aGlzIHB1cnBvc2UgaXQgaXMgZmFzdGVyDQot ICogYW5kIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0aGFuIG1hbGxvYy4NCi0g KiBAYXV0aG9yIFdhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4NCisg KiBhbmQgbW9yZSBtZW1vcnkgZWZmaWNpZW50IHRoYW4gbWFsbG9jLiAgQWRk aXRpb25hbGx5IHRvIGEgdXN1YWwgb2JzdGFjaw0KKyAqIGxpa2UgYWxsb2Nh dG9yIHlvdSBjYW4gYWxzbyBmcmVlIHRoZSBvYmplY3RzIGluZGl2aWR1YWxs eS4gIEJlY2F1c2UgaXQNCisgKiBkb2VzIG5vIGNvbXBhY3Rpb24gaXQgc3Rp bGwgaXMgZmFzdGVyIHRoZW4gbWFsbG9jKCkvZnJlZSgpLiAgRGVwZW5kaW5n DQorICogb24gdGhlIGV4YWN0IHVzYWdlIHBhdHRlcm4gdGhhdCBtaWdodCBj b21lIGF0IHRoZSBleHBlbnNlIG9mIHNvbWUNCisgKiBtZW1vcnkgdGhvdWdo Lg0KKyAqIEBhdXRob3IgV2FsZG8gQmFzdGlhbiA8YmFzdGlhbkBrZGUub3Jn PiwgTWljaGFlbCBNYXR6IDxtYXR6QGtkZS5vcmc+DQogICogQHZlcnNpb24g JElkOiBrYWxsb2NhdG9yLmgsdiAxLjYgMjAwMS8xMi8wNiAxMzowMzo1NyBm YXVyZSBFeHAgJA0KICAqLw0KIGNsYXNzIEtab25lQWxsb2NhdG9yDQpAQCAt NDYsNyArNTEsNyBAQCBwdWJsaWM6DQogICAgICAqIENyZWF0ZXMgYSBLWm9u ZUFsbG9jYXRvciBvYmplY3QuDQogICAgICAqIEBwYXJhbSBfYmxvY2tTaXpl IFNpemUgaW4gYnl0ZXMgb2YgdGhlIGJsb2NrcyByZXF1ZXN0ZWQgZnJvbSBt YWxsb2MuDQogICAgICAqLw0KLSAgICBLWm9uZUFsbG9jYXRvcihsb25nIF9i bG9ja1NpemUgPSAxMjgqMTAyNCk7DQorICAgIEtab25lQWxsb2NhdG9yKHVu c2lnbmVkIGxvbmcgX2Jsb2NrU2l6ZSA9IDgqMTAyNCk7DQogDQogICAgIC8q Kg0KICAgICAgKiBEZXN0cnVjdHMgdGhlIFpvbmVBbGxvY2F0b3IgYW5kIGZy ZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgaXQuDQpAQCAtNTUsMTUgKzYw LDcwIEBAIHB1YmxpYzoNCiANCiAgICAgLyoqDQogICAgICAqIEFsbG9jYXRl cyBhIG1lbW9yeSBibG9jay4NCi0gICAgICogQHBhcmFtIF9zaXplIFNpemUg aW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSBibG9jay4gTWVtb3J5IGlzIG5vdCBh bGlnbmVkIQ0KKyAgICAgKiBAcGFyYW0gX3NpemUgU2l6ZSBpbiBieXRlcyBv ZiB0aGUgbWVtb3J5IGJsb2NrLiBNZW1vcnkgaXMgYWxpZ25lZCB0bw0KKyAg ICAgKiB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIuDQogICAgICAqLw0KICAgICB2 b2lkKiBhbGxvY2F0ZShzaXplX3QgX3NpemUpOw0KIA0KKyAgICAvKioNCisg ICAgICogR2l2ZXMgYmFjayBhIGJsb2NrIHJldHVybmVkIGJ5IEByZWYgYWxs b2NhdGUoKSB0byB0aGUgem9uZQ0KKyAgICAgKiBhbGxvY2F0b3IsIGFuZCBw b3NzaWJseSBkZWFsbG9jYXRlcyB0aGUgYmxvY2sgaG9sZGluZyBpdCAod2hl biBpdCdzDQorICAgICAqIGVtcHR5KS4gIFRoZSBmaXJzdCBAcmVmIGRlYWxs b2NhdGUoKSBhZnRlciBtYW55IEByZWYgYWxsb2NhdGUoKSBjYWxscw0KKyAg ICAgKiAob3IgdGhlIGZpcnN0IGF0IGFsbCkgYnVpbGRzIGFuIGludGVybmFs IGRhdGEgc3RydWN0dXJlIGZvciBzcGVlZGluZw0KKyAgICAgKiB1cCBkZWFs bG9jYXRpb24uICBUaGUgY29uc2lzdGVuY3kgb2YgdGhhdCBzdHJ1Y3R1cmUg aXMgbWFpbnRhaW5lZA0KKyAgICAgKiBmcm9tIHRoZW4gb24gKGJ5IEByZWYg YWxsb2NhdGUoKSBhbmQgQHJlZiBkZWFsbG9jYXRlKCkpIHVubGVzcyBtYW55 DQorICAgICAqIG1vcmUgb2JqZWN0cyBhcmUgYWxsb2NhdGVkIHdpdGhvdXQg YW55IGludGVydmVuaW5nIGRlYWxsb2NhdGlvbiwgaW4NCisgICAgICogd2hp Y2ggY2FzZSBpdCdzIHRocm93biBhd2F5IGFuZCByZWJ1aWx0IGF0IHRoZSBu ZXh0IEByZWYgZGVhbGxvY2F0ZSgpLg0KKyAgICAgKg0KKyAgICAgKiBUaGUg ZWZmZWN0IG9mIHRoaXMgaXMsIHRoYXQgc3VjaCBpbml0aWFsIEByZWYgZGVh bGxvY2F0ZSgpIGNhbGxzIHRha2UNCisgICAgICogbW9yZSB0aW1lIHRoZW4g dGhlIG5vcm1hbCBjYWxscywgYW5kIHRoYXQgYWZ0ZXIgdGhpcyBsaXN0IGlz IGJ1aWx0LCBpLmUuDQorICAgICAqIGdlbmVyYWxseSBpZiBAcmVmIGRlYWxs b2NhdGUoKSBpcyB1c2VkIGF0IGFsbCwgYWxzbyBhbGxvY2F0ZSgpIGlzIGEN CisgICAgICogbGl0dGxlIGJpdCBzbG93ZXIuICBUaGlzIG1lYW5zLCB0aGF0 IGlmIHlvdSB3YW50IHRvIHNxdWVlemUgb3V0IHRoZSBsYXN0DQorICAgICAq IGJpdCBwZXJmb3JtYW5jZSB5b3Ugd291bGQgd2FudCB0byB1c2UgS1pvbmVB bGxvY2F0b3IgYXMgYW4gb2JzdGFjaywgaS5lLg0KKyAgICAgKiBqdXN0IHVz ZSB0aGUgZnVuY3Rpb25zIEByZWYgYWxsb2NhdGUoKSBhbmQgQHJlZiBmcmVl X3NpbmNlKCkuICBBbGwgdGhlDQorICAgICAqIHJlbWFpbmluZyBtZW1vcnkg aXMgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBpZiB0aGUgem9uZSBhbGxvY2F0 b3INCisgICAgICogaXMgZGVzdHJveWVkLg0KKyAgICAgKiBAcGFyYW0gcHRy IFBvaW50ZXIgYXMgcmV0dXJuZWQgYnkgQHJlZiBhbGxvY2F0ZSgpLg0KKyAg ICAgKi8NCisgICAgdm9pZCBkZWFsbG9jYXRlKHZvaWQgKnB0cik7DQorDQor ICAgIC8qKg0KKyAgICAgKiBEZWFsbG9jYXRlIG1hbnkgb2JqZWN0cyBhdCBv bmNlLg0KKyAgICAgKiBAcmVmIGZyZWVfc2luY2UoKSBkZWFsbG9jYXRlcyBh bGwgb2JqZWN0cyBhbGxvY2F0ZWQgYWZ0ZXIgQHAgcHRyLCANCisgICAgICog QGVtIGluY2x1ZGluZyBAcCBwdHIgaXRzZWxmLg0KKyAgICAgKiBAcGFyYW0g cHRyIFBvaW50ZXIgYXMgcmV0dXJuZWQgYnkgQHJlZiBhbGxvY2F0ZSgpLiAg SXQgYWN0cyBsaWtlDQorICAgICAqIGEga2luZCBvZiBtYXJrIG9mIGEgY2Vy dGFpbiBwb3NpdGlvbiBpbiB0aGUgc3RhY2sgb2YgYWxsIG9iamVjdHMsDQor ICAgICAqIG9mZiB3aGljaCB5b3UgY2FuIHRocm93IGF3YXkgZXZlcnl0aGlu ZyBhYm92ZSB0aGF0IG1hcmsuDQorICAgICAqDQorICAgICAqIFRoZSBpbnRl bmRlZCB1c2UgaXMgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZjoNCisg ICAgICogPHByZT4NCisgICAgICogS1pvbmVBbGxvY2F0b3IgYWxsb2MoODE5 Mik7DQorICAgICAqIHZvaWQgKnJlbWVtYmVyX21lID0gYWxsb2MuYWxsb2Nh dGUoMCk7DQorICAgICAqIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsr KQ0KKyAgICAgKiAgIGRvX3NvbWV0aGluZ193aXRoIChhbGxvYy5hbGxvY2F0 ZSgxMikpOw0KKyAgICAgKiBhbGxvYy5mcmVlX3NpbmNlIChyZW1lbWJlcl9t ZSk7DQorICAgICAqIDwvcHJlPg0KKyAgICAgKiBOb3RlLCB0aGF0IHdlIGRv bid0IG5lZWQgdG8gcmVtZW1iZXIgYWxsIHRoZSBwb2ludGVycyB0byB0aGUg MTItYnl0ZQ0KKyAgICAgKiBvYmplY3RzIGZvciBmcmVlaW5nIHRoZW0uICBU aGUgQHJlZiBmcmVlX3NpbmNlKCkgZG9lcyBkZWFsbG9jYXRlIHRoZW0NCisg ICAgICogYWxsIGF0IG9uY2UuDQorICAgICAqLw0KKyAgICB2b2lkIGZyZWVf c2luY2Uodm9pZCAqcHRyKTsNCisNCiBwcm90ZWN0ZWQ6DQotICAgIGxvbmcg YmxvY2tTaXplOw0KLSAgICBRUHRyTGlzdDxjaGFyPiBtZW1vcnlCbG9ja3M7 DQotICAgIGNoYXIgKmN1cnJlbnRCbG9jazsNCi0gICAgbG9uZyBibG9ja09m ZnNldDsNCisgICAgY2xhc3MgTWVtQmxvY2s7DQorICAgIHR5cGVkZWYgUVZh bHVlTGlzdDxNZW1CbG9jayAqPiBNZW1MaXN0Ow0KKyAgICB2b2lkIGFkZEJs b2NrKE1lbUJsb2NrICpiKTsNCisgICAgdm9pZCBkZWxCbG9jayhNZW1CbG9j ayAqYik7DQorICAgIHZvaWQgaW5zZXJ0SGFzaChNZW1CbG9jayAqYik7DQor ICAgIHZvaWQgaW5pdEhhc2goKTsNCisgICAgTWVtQmxvY2sgKmN1cnJlbnRC bG9jazsNCisgICAgdW5zaWduZWQgbG9uZyBibG9ja1NpemU7DQorICAgIHVu c2lnbmVkIGxvbmcgYmxvY2tPZmZzZXQ7DQorICAgIHVuc2lnbmVkIGludCBs b2cyOw0KKyAgICB1bnNpZ25lZCBpbnQgbnVtX2Jsb2NrczsNCisgICAgTWVt TGlzdCAqKmhhc2hMaXN0Ow0KKyAgICB1bnNpZ25lZCBpbnQgaGFzaFNpemU7 DQorICAgIGJvb2wgaGFzaERpcnR5Ow0KIHByaXZhdGU6DQogICAgIEtab25l QWxsb2NhdG9yUHJpdmF0ZSAqZDsNCiB9Ow0KSW5kZXg6IGtjb21wbGV0aW9u LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9ob21l L2tkZS9rZGVsaWJzL2tkZWNvcmUva2NvbXBsZXRpb24uY3BwLHYNCnJldHJp ZXZpbmcgcmV2aXNpb24gMS40OQ0KZGlmZiAtdSAtcCAtcjEuNDkga2NvbXBs ZXRpb24uY3BwDQotLS0ga2NvbXBsZXRpb24uY3BwCTIwMDIvMDMvMDMgMjE6 MjA6MjUJMS40OQ0KKysrIGtjb21wbGV0aW9uLmNwcAkyMDAyLzAzLzA3IDA3 OjIxOjM2DQpAQCAtNTQ2LDE1ICs1NDYsMTQgQEAgdm9pZCBLQ29tcGxldGlv bjo6ZXh0cmFjdFN0cmluZ3NGcm9tTm9kZQ0KICAgICAgICAgcmV0dXJuOw0K IA0KICAgICAvLyBrRGVidWcoKSA8PCAiQmVnaW5uaW5nOiAiIDw8IGJlZ2lu bmluZyA8PCBlbmRsOw0KLSAgICBLQ29tcFRyZWVDaGlsZHJlbjo6Q29uc3RJ dGVyYXRvciBpdDsNCiAgICAgY29uc3QgS0NvbXBUcmVlQ2hpbGRyZW4gKmxp c3QgPSBub2RlLT5jaGlsZHJlbigpOw0KICAgICBRU3RyaW5nIHN0cmluZzsN CiAgICAgUVN0cmluZyB3Ow0KIA0KICAgICAvLyBsb29wIHRocnUgYWxsIGNo aWxkcmVuDQotICAgIGZvciAoIGl0ID0gbGlzdC0+YmVnaW4oKTsgaXQgIT0g bGlzdC0+ZW5kKCk7ICsraXQgKSB7DQorICAgIGZvciAoIEtDb21wVHJlZU5v ZGUgKmN1ciA9IGxpc3QtPmJlZ2luKCk7IGN1ciA7IGN1ciA9IGN1ci0+bmV4 dCkgew0KICAgICAgICAgc3RyaW5nID0gYmVnaW5uaW5nOw0KLSAgICAgICAg bm9kZSA9ICppdDsNCisJbm9kZSA9IGN1cjsNCiAJaWYgKCAhbm9kZS0+aXNO dWxsKCkgKQ0KIAkgICAgc3RyaW5nICs9ICpub2RlOw0KIA0KQEAgLTY2MCw5 ICs2NTksMTIgQEAgdm9pZCBLQ29tcGxldGlvbjo6ZG9CZWVwKCBCZWVwTW9k ZSBtb2RlIA0KIEtDb21wVHJlZU5vZGU6On5LQ29tcFRyZWVOb2RlKCkNCiB7 DQogICAgIC8vIGRlbGV0ZSBhbGwgY2hpbGRyZW4NCi0gICAgS0NvbXBUcmVl Q2hpbGRyZW46Okl0ZXJhdG9yIGl0Ow0KLSAgICBmb3IgKCBpdCA9IG15Q2hp bGRyZW4uYmVnaW4oKTsgaXQgIT0gbXlDaGlsZHJlbi5lbmQoKTsgKytpdCAp DQotICAgICAgICBkZWxldGUgKml0Ow0KKyAgICBLQ29tcFRyZWVOb2RlICpj dXIgPSBteUNoaWxkcmVuLmJlZ2luKCk7DQorICAgIHdoaWxlIChjdXIpIHsN CisgICAgICAgIEtDb21wVHJlZU5vZGUgKiBuZXh0ID0gY3VyLT5uZXh0Ow0K KyAgICAgICAgZGVsZXRlIG15Q2hpbGRyZW4ucmVtb3ZlKGN1cik7DQorICAg ICAgICBjdXIgPSBuZXh0Ow0KKyAgICB9DQogfQ0KIA0KIA0KQEAgLTY3Niwx NCArNjc4LDE5IEBAIEtDb21wVHJlZU5vZGUgKiBLQ29tcFRyZWVOb2RlOjpp bnNlcnQoIGMNCiANCiAJLy8gRklYTUUsIGZpcnN0IChzbG93KSBzb3J0ZWQg aW5zZXJ0aW9uIGltcGxlbWVudGF0aW9uDQogCWlmICggc29ydGVkICkgew0K LQkgICAgS0NvbXBUcmVlQ2hpbGRyZW46Okl0ZXJhdG9yIGl0ID0gbXlDaGls ZHJlbi5iZWdpbigpOw0KLQkgICAgd2hpbGUgKCBpdCAhPSBteUNoaWxkcmVu LmVuZCgpICkgew0KLQkgICAgICAgIGlmICggY2ggPiAqKCppdCkgKQ0KLQkJ ICAgICsraXQ7DQotCQllbHNlDQorCSAgICBLQ29tcFRyZWVOb2RlICogcHJl diA9IDA7DQorCSAgICBLQ29tcFRyZWVOb2RlICogY3VyID0gbXlDaGlsZHJl bi5iZWdpbigpOw0KKwkgICAgd2hpbGUgKCBjdXIgKSB7DQorCSAgICAgICAg aWYgKCBjaCA+ICpjdXIgKSB7DQorCQkgICAgcHJldiA9IGN1cjsNCisJCSAg ICBjdXIgPSBjdXItPm5leHQ7DQorCQl9IGVsc2UNCiAJCSAgICBicmVhazsN CiAJICAgIH0NCi0JICAgIG15Q2hpbGRyZW4uaW5zZXJ0KCBpdCwgY2hpbGQg KTsNCisJICAgIGlmIChwcmV2KQ0KKwkgICAgICAgIG15Q2hpbGRyZW4uaW5z ZXJ0KCBwcmV2LCBjaGlsZCApOw0KKwkgICAgZWxzZQ0KKwkgICAgICAgIG15 Q2hpbGRyZW4ucHJlcGVuZChjaGlsZCk7DQogCX0NCiANCiAJZWxzZQ0KQEAg LTcwNSw4ICs3MTIsNyBAQCB2b2lkIEtDb21wVHJlZU5vZGU6OnJlbW92ZSgg Y29uc3QgUVN0cmluDQogDQogICAgIGlmICggc3RyaW5nLmlzRW1wdHkoKSAp IHsNCiAgICAgICAgIGNoaWxkID0gZmluZCggMHgwICk7DQotICAgICAgICBk ZWxldGUgY2hpbGQ7DQotICAgICAgICBteUNoaWxkcmVuLnJlbW92ZSggY2hp bGQgKTsNCisgICAgICAgIGRlbGV0ZSBteUNoaWxkcmVuLnJlbW92ZSggY2hp bGQgKTsNCiAgICAgICAgIHJldHVybjsNCiAgICAgfQ0KIA0KQEAgLTcxNSw4 ICs3MjEsNyBAQCB2b2lkIEtDb21wVHJlZU5vZGU6OnJlbW92ZSggY29uc3Qg UVN0cmluDQogICAgIGlmICggY2hpbGQgKSB7DQogICAgICAgICBjaGlsZC0+ cmVtb3ZlKCBzdHJpbmcucmlnaHQoIHN0cmluZy5sZW5ndGgoKSAtMSApICk7 DQogICAgICAgICBpZiAoIGNoaWxkLT5teUNoaWxkcmVuLmNvdW50KCkgPT0g MCApIHsNCi0gICAgICAgICAgICBkZWxldGUgY2hpbGQ7DQotICAgICAgICAg ICAgbXlDaGlsZHJlbi5yZW1vdmUoIGNoaWxkICk7DQorICAgICAgICAgICAg ZGVsZXRlIG15Q2hpbGRyZW4ucmVtb3ZlKCBjaGlsZCApOw0KICAgICAgICAg fQ0KICAgICB9DQogfQ0KQEAgLTc4Niw2ICs3OTEsNzkgQEAgdm9pZCBLQ29t cGxldGlvbk1hdGNoZXM6OnJlbW92ZUR1cGxpY2F0ZQ0KICAgICAgICAgfQ0K ICAgICB9DQogfQ0KKw0KK3ZvaWQgS0NvbXBUcmVlTm9kZUxpc3Q6OmFwcGVu ZChLQ29tcFRyZWVOb2RlICppdGVtKQ0KK3sNCisgICAgbV9jb3VudCsrOw0K KyAgICBpZiAoIWxhc3QpIHsNCisJbGFzdCA9IGl0ZW07DQorCWxhc3QtPm5l eHQgPSAwOw0KKwlmaXJzdCA9IGl0ZW07DQorCXJldHVybjsNCisgICAgfQ0K KyAgICBsYXN0LT5uZXh0ID0gaXRlbTsNCisgICAgaXRlbS0+bmV4dCA9IDA7 DQorICAgIGxhc3QgPSBpdGVtOw0KK30NCisNCit2b2lkIEtDb21wVHJlZU5v ZGVMaXN0OjpwcmVwZW5kKEtDb21wVHJlZU5vZGUgKml0ZW0pDQorew0KKyAg ICBtX2NvdW50Kys7DQorICAgIGlmICghbGFzdCkgew0KKwlsYXN0ID0gaXRl bTsNCisJbGFzdC0+bmV4dCA9IDA7DQorCWZpcnN0ID0gaXRlbTsNCisJcmV0 dXJuOw0KKyAgICB9DQorICAgIGl0ZW0tPm5leHQgPSBmaXJzdDsNCisgICAg Zmlyc3QgPSBpdGVtOw0KK30NCisNCit2b2lkIEtDb21wVHJlZU5vZGVMaXN0 OjppbnNlcnQoS0NvbXBUcmVlTm9kZSAqYWZ0ZXIsIEtDb21wVHJlZU5vZGUg Kml0ZW0pDQorew0KKyAgICBpZiAoIWFmdGVyKSB7DQorCWFwcGVuZChpdGVt KTsNCisJcmV0dXJuOw0KKyAgICB9DQorDQorICAgIG1fY291bnQrKzsNCisN CisgICAgaXRlbS0+bmV4dCA9IGFmdGVyLT5uZXh0Ow0KKyAgICBhZnRlci0+ bmV4dCA9IGl0ZW07DQorDQorICAgIGlmIChhZnRlciA9PSBsYXN0KQ0KKwls YXN0ID0gaXRlbTsNCit9DQorDQorS0NvbXBUcmVlTm9kZSAqS0NvbXBUcmVl Tm9kZUxpc3Q6OnJlbW92ZShLQ29tcFRyZWVOb2RlICppdGVtKQ0KK3sNCisg ICAgaWYgKCFmaXJzdCB8fCAhaXRlbSkNCisJcmV0dXJuIDA7DQorICAgIEtD b21wVHJlZU5vZGUgKmN1ciA9IDA7DQorDQorICAgIGlmIChpdGVtID09IGZp cnN0KQ0KKwlmaXJzdCA9IGZpcnN0LT5uZXh0Ow0KKyAgICBlbHNlIHsNCisJ Y3VyID0gZmlyc3Q7DQorCXdoaWxlIChjdXIgJiYgY3VyLT5uZXh0ICE9IGl0 ZW0pIGN1ciA9IGN1ci0+bmV4dDsNCisJaWYgKCFjdXIpDQorCSAgICByZXR1 cm4gMDsNCisJY3VyLT5uZXh0ID0gaXRlbS0+bmV4dDsNCisgICAgfQ0KKyAg ICBpZiAoaXRlbSA9PSBsYXN0KQ0KKwlsYXN0ID0gY3VyOw0KKyAgICBtX2Nv dW50LS07DQorICAgIHJldHVybiBpdGVtOw0KK30NCisNCitLQ29tcFRyZWVO b2RlICpLQ29tcFRyZWVOb2RlTGlzdDo6YXQodWludCBpbmRleCkgY29uc3QN Cit7DQorICAgIEtDb21wVHJlZU5vZGUgKmN1ciA9IGZpcnN0Ow0KKyAgICB3 aGlsZSAoaW5kZXgtLSAmJiBjdXIpIGN1ciA9IGN1ci0+bmV4dDsNCisgICAg cmV0dXJuIGN1cjsNCit9DQorDQorS1pvbmVBbGxvY2F0b3IgS0NvbXBUcmVl Tm9kZTo6YWxsb2MoODE5Mik7DQogDQogdm9pZCBLQ29tcGxldGlvbjo6dmly dHVhbF9ob29rKCBpbnQsIHZvaWQqICkNCiB7IC8qQkFTRTo6dmlydHVhbF9o b29rKCBpZCwgZGF0YSApOyovIH0NCkluZGV4OiBrY29tcGxldGlvbl9wcml2 YXRlLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvaG9t ZS9rZGUva2RlbGlicy9rZGVjb3JlL2tjb21wbGV0aW9uX3ByaXZhdGUuaCx2 DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTINCmRpZmYgLXUgLXAgLXIxLjEy IGtjb21wbGV0aW9uX3ByaXZhdGUuaA0KLS0tIGtjb21wbGV0aW9uX3ByaXZh dGUuaAkyMDAyLzAxLzExIDE2OjEyOjQyCTEuMTINCisrKyBrY29tcGxldGlv bl9wcml2YXRlLmgJMjAwMi8wMy8wNyAwNzoyMTozNg0KQEAgLTI1LDggKzI1 LDMwIEBADQogI2luY2x1ZGUgPGtzb3J0YWJsZXZhbHVlbGlzdC5oPg0KIA0K IGNsYXNzIEtDb21wVHJlZU5vZGU7DQotdHlwZWRlZiBRVmFsdWVMaXN0PEtD b21wVHJlZU5vZGUgKj4gS0NvbXBUcmVlQ2hpbGRyZW47DQogDQorI2luY2x1 ZGUgPGthbGxvY2F0b3IuaD4NCisNCitjbGFzcyBLQ29tcFRyZWVOb2RlTGlz dA0KK3sNCitwdWJsaWM6DQorICAgIEtDb21wVHJlZU5vZGVMaXN0KCkgOiBm aXJzdCgwKSwgbGFzdCgwKSwgbV9jb3VudCgwKSB7fQ0KKyAgICBLQ29tcFRy ZWVOb2RlICpiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGZpcnN0OyB9DQorICAg IEtDb21wVHJlZU5vZGUgKmVuZCgpIGNvbnN0IHsgcmV0dXJuIGxhc3Q7IH0N CisNCisgICAgS0NvbXBUcmVlTm9kZSAqYXQodWludCBpbmRleCkgY29uc3Q7 DQorICAgIHZvaWQgYXBwZW5kKEtDb21wVHJlZU5vZGUgKml0ZW0pOyANCisg ICAgdm9pZCBwcmVwZW5kKEtDb21wVHJlZU5vZGUgKml0ZW0pOyANCisgICAg dm9pZCBpbnNlcnQoS0NvbXBUcmVlTm9kZSAqYWZ0ZXIsIEtDb21wVHJlZU5v ZGUgKml0ZW0pOw0KKyAgICBLQ29tcFRyZWVOb2RlICpyZW1vdmUoS0NvbXBU cmVlTm9kZSAqaXRlbSk7DQorICAgIHVpbnQgY291bnQoKSBjb25zdCB7IHJl dHVybiBtX2NvdW50OyB9DQorDQorcHJpdmF0ZToNCisgICAgS0NvbXBUcmVl Tm9kZSAqZmlyc3QsICpsYXN0Ow0KKyAgICB1aW50IG1fY291bnQ7DQorfTsN CisNCit0eXBlZGVmIEtDb21wVHJlZU5vZGVMaXN0IEtDb21wVHJlZUNoaWxk cmVuOw0KKw0KIC8qKg0KICAqIEEgaGVscGVyIGNsYXNzIGZvciBLQ29tcGxl dGlvbi4gSW1wbGVtZW50cyBhIHRyZWUgb2YgUUNoYXIuDQogICoNCkBAIC01 OCw2ICs4MCw5IEBAIHR5cGVkZWYgUVZhbHVlTGlzdDxLQ29tcFRyZWVOb2Rl ICo+IEtDb20NCiAgKi8NCiBjbGFzcyBLQ29tcFRyZWVOb2RlIDogcHVibGlj IFFDaGFyDQogew0KKyAgZnJpZW5kIGNsYXNzIEtDb21wVHJlZU5vZGVMaXN0 Ow0KKyAgZnJpZW5kIGNsYXNzIEtDb21wbGV0aW9uOw0KKw0KIHB1YmxpYzoN CiAgICAgS0NvbXBUcmVlTm9kZSgpIDogUUNoYXIoKSwgbXlXZWlnaHQoMCkg e30NCiAgICAgS0NvbXBUcmVlTm9kZSggY29uc3QgUUNoYXImIGNoLCB1aW50 IHdlaWdodCA9IDAgKQ0KQEAgLTY1LDE1ICs5MCwxOSBAQCBwdWJsaWM6DQog ICAgICAgICAgIG15V2VpZ2h0KCB3ZWlnaHQgKSB7fQ0KICAgICB+S0NvbXBU cmVlTm9kZSgpOw0KIA0KKyAgICB2b2lkICogb3BlcmF0b3IgbmV3KCBzaXpl X3QgcyApIHsNCisgICAgICByZXR1cm4gYWxsb2MuYWxsb2NhdGUoIHMgKTsN CisgICAgfQ0KKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSggdm9pZCAqIHMg KSB7DQorICAgICAgYWxsb2MuZGVhbGxvY2F0ZSggcyApOw0KKyAgICB9DQor DQogICAgIC8vIFJldHVybnMgYSBjaGlsZCBvZiB0aGlzIG5vZGUgbWF0Y2hp bmcgY2gsIGlmIGF2YWlsYWJsZS4NCiAgICAgLy8gT3RoZXJ3aXNlLCByZXR1 cm5zIDBMDQogICAgIGlubGluZSBLQ29tcFRyZWVOb2RlICogZmluZCggY29u c3QgUUNoYXImIGNoICkgY29uc3Qgew0KLQlLQ29tcFRyZWVDaGlsZHJlbjo6 Q29uc3RJdGVyYXRvciBpdDsNCi0JZm9yICggaXQgPSBteUNoaWxkcmVuLmJl Z2luKCk7IGl0ICE9IG15Q2hpbGRyZW4uZW5kKCk7ICsraXQgKQ0KLQkgICAg aWYgKCAqKCppdCkgPT0gY2ggKQ0KLQkJcmV0dXJuICppdDsNCi0NCi0JcmV0 dXJuIDBMOw0KKyAgICAgIEtDb21wVHJlZU5vZGUgKiBjdXIgPSBteUNoaWxk cmVuLmJlZ2luKCk7DQorICAgICAgd2hpbGUgKGN1ciAmJiAoKmN1ciAhPSBj aCkpIGN1ciA9IGN1ci0+bmV4dDsNCisgICAgICByZXR1cm4gY3VyOw0KICAg ICB9DQogICAgIEtDb21wVHJlZU5vZGUgKglpbnNlcnQoIGNvbnN0IFFDaGFy JiwgYm9vbCBzb3J0ZWQgKTsNCiAgICAgdm9pZCAJCXJlbW92ZSggY29uc3Qg UVN0cmluZyYgKTsNCkBAIC05MCwyMCArMTE5LDIyIEBAIHB1YmxpYzoNCiAJ cmV0dXJuICZteUNoaWxkcmVuOw0KICAgICB9DQogICAgIGlubGluZSBjb25z dCBLQ29tcFRyZWVOb2RlICogY2hpbGRBdChpbnQgaW5kZXgpIGNvbnN0IHsN Ci0JcmV0dXJuIG15Q2hpbGRyZW5baW5kZXhdOw0KKwlyZXR1cm4gbXlDaGls ZHJlbi5hdChpbmRleCk7DQogICAgIH0NCiAgICAgaW5saW5lIGNvbnN0IEtD b21wVHJlZU5vZGUgKiBmaXJzdENoaWxkKCkgY29uc3Qgew0KLQlyZXR1cm4g bXlDaGlsZHJlbi5maXJzdCgpOw0KKwlyZXR1cm4gbXlDaGlsZHJlbi5iZWdp bigpOw0KICAgICB9DQogICAgIGlubGluZSBjb25zdCBLQ29tcFRyZWVOb2Rl ICogbGFzdENoaWxkKCkgIGNvbnN0IHsNCi0JcmV0dXJuIG15Q2hpbGRyZW4u bGFzdCgpOw0KKwlyZXR1cm4gbXlDaGlsZHJlbi5lbmQoKTsNCiAgICAgfQ0K IA0KIHByaXZhdGU6DQogICAgIHVpbnQgbXlXZWlnaHQ7DQotICAgIEtDb21w VHJlZUNoaWxkcmVuCW15Q2hpbGRyZW47DQotDQorICAgIEtDb21wVHJlZU5v ZGVMaXN0CW15Q2hpbGRyZW47DQorICAgIEtDb21wVHJlZU5vZGUgKm5leHQ7 DQorICAgIHN0YXRpYyBLWm9uZUFsbG9jYXRvciBhbGxvYzsNCiB9Ow0KKw0K IA0KIA0KIC8vIHNvbWUgbW9yZSBoZWxwZXIgc3R1ZmYNCg== ---559023410-1932422408-1015487925=:21480--