From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Dana How" Subject: [PATCH] git-{repack,pack-objects} accept --{pack,blob}-limit to control pack size Date: Wed, 4 Apr 2007 13:40:42 -0700 Message-ID: <56b7f5510704041340l5997b04dp853e8270a644ab28@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_39225_10261285.1175719242978" Cc: "Git Mailing List" , danahow@gmail.com To: "Junio C Hamano" X-From: git-owner@vger.kernel.org Wed Apr 04 22:40:54 2007 Return-path: Envelope-to: gcvg-git@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1HZCHk-0004Sp-7h for gcvg-git@gmane.org; Wed, 04 Apr 2007 22:40:53 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750968AbXDDUkr (ORCPT ); Wed, 4 Apr 2007 16:40:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750987AbXDDUkr (ORCPT ); Wed, 4 Apr 2007 16:40:47 -0400 Received: from nz-out-0506.google.com ([64.233.162.237]:19889 "EHLO nz-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750968AbXDDUko (ORCPT ); Wed, 4 Apr 2007 16:40:44 -0400 Received: by nz-out-0506.google.com with SMTP id s1so182629nze for ; Wed, 04 Apr 2007 13:40:44 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:mime-version:content-type; b=bgg5DUaCGSZldJFnX0xRMURHIY1B8P0j3MA9dhIKbdK1tSN3+4ijRsy2lII8EOXll42AUSnufHlBbXRQrhxqfKAMySykOLQZvB3c1wkeJFjfoWF7vVWNsOtsAsK0+gZ19hkWNI70WgBpd+I6wa/BTWLkoqV4uHhm0PIu+BWRWy0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type; b=L2lIOmMSaHLI0rM1gGFR0hUBUigxMJ9Xw+4sudgio3lOubdDjQ5CUg0kKZgLhfcDDh6p8PGgnhUpbEUjy2wVzlONNfFyncQ9m4/VYfylrUkLSmY6W4H3SQdpRNGUdkw6BQkjkaGu6TAnVasaP39hB8/j/MXtGD932pTBtxp8EOY= Received: by 10.114.173.15 with SMTP id v15mr435839wae.1175719243032; Wed, 04 Apr 2007 13:40:43 -0700 (PDT) Received: by 10.114.46.4 with HTTP; Wed, 4 Apr 2007 13:40:42 -0700 (PDT) Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_39225_10261285.1175719242978 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline The motivations are to better support portable media, older filesystems, and larger repositories without awkward enormous packfiles. When --pack-limit[=N] is specified and --stdout is not, all bytes in the resulting packfile(s) appear at offsets less than N (which defaults to 1<<31). The default guarantees mmap(2) on 32b systems never sees signed off_t's. The object stream may be broken into multiple packfiles as a result, each properly and conventionally built. When --stdout is also specified, all objects in the resulting packfile(s) _start_ at offsets less than N. All the packfiles appear concatenated on stdout, and each has its object count set to 0. The behavior without --stdout cannot be duplicated here since lseek(2) is not generally possible on stdout. The end of each pack in the concatenated whole can be detected by asking, just before reading each object, if the next 20 bytes match the SHA-1 of what came before. A future change might insert a null-byte EOF marker (i.e. type=OBJ_NONE/length=0) before each pack's final SHA-1 or before only the final pack's SHA-1. When --blob-limit=N is specified, blobs whose uncompressed size is greater than or equal to N are omitted from the pack(s). If --pack-limit is specified, --blob-limit is not, and --stdout is not, then --blob-limit defaults to 1/4 of the --pack-limit. To enable this, csum-file.c now has the ability to rollback a checksummed write (see sha1mark/sha1undo). Signed-off-by: Dana L. How --- builtin-pack-objects.c | 300 ++++++++++++++++++++++++++++++++++++++-------- builtin-unpack-objects.c | 2 +- csum-file.c | 41 +++++++ csum-file.h | 6 + git-repack.sh | 12 ++- http-fetch.c | 2 +- http-push.c | 2 +- index-pack.c | 2 +- sha1_file.c | 2 +- 9 files changed, 307 insertions(+), 62 deletions(-) [Full patch attached since gmail insists on wordwrap and eating ws] Thanks, -- Dana L. How danahow@gmail.com +1 650 804 5991 cell ------=_Part_39225_10261285.1175719242978 Content-Type: text/plain; name=0001-git-repack-pack-objects-accept-pack-blob-limit.patch.txt; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f048rupa Content-Disposition: attachment; filename="0001-git-repack-pack-objects-accept-pack-blob-limit.patch.txt" RnJvbSBmOWRhOTBmYjgxYThlZDMzMzY4MjljODI0YmFmM2ZkNWMwOGNmNzRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5hIEwuIEhvdyA8ZGFuYWhvd0BnbWFpbC5jb20+CkRhdGU6 IFdlZCwgNCBBcHIgMjAwNyAxMzoxNTo0NSAtMDcwMApTdWJqZWN0OiBbUEFUQ0hdIGdpdC17cmVw YWNrLHBhY2stb2JqZWN0c30gYWNjZXB0IC0te3BhY2ssYmxvYn0tbGltaXQgdG8gY29udHJvbCBw YWNrIHNpemUKClRoZSBtb3RpdmF0aW9ucyBhcmUgdG8gYmV0dGVyIHN1cHBvcnQgcG9ydGFibGUg bWVkaWEsCm9sZGVyIGZpbGVzeXN0ZW1zLCAgYW5kIGxhcmdlciByZXBvc2l0b3JpZXMgd2l0aG91 dAphd2t3YXJkIGVub3Jtb3VzIHBhY2tmaWxlcy4KCldoZW4gLS1wYWNrLWxpbWl0Wz1OXSBpcyBz cGVjaWZpZWQgYW5kIC0tc3Rkb3V0IGlzIG5vdCwKYWxsIGJ5dGVzIGluIHRoZSByZXN1bHRpbmcg cGFja2ZpbGUocykgYXBwZWFyIGF0IG9mZnNldHMKbGVzcyB0aGFuIE4gKHdoaWNoIGRlZmF1bHRz IHRvIDE8PDMxKS4gIFRoZSBkZWZhdWx0Cmd1YXJhbnRlZXMgbW1hcCgyKSBvbiAzMmIgc3lzdGVt cyBuZXZlciBzZWVzIHNpZ25lZCBvZmZfdCdzLgpUaGUgb2JqZWN0IHN0cmVhbSBtYXkgYmUgYnJv a2VuIGludG8gbXVsdGlwbGUgcGFja2ZpbGVzCmFzIGEgcmVzdWx0LCAgZWFjaCBwcm9wZXJseSBh bmQgY29udmVudGlvbmFsbHkgYnVpbHQuCgpXaGVuIC0tc3Rkb3V0IGlzIGFsc28gc3BlY2lmaWVk LCAgYWxsIG9iamVjdHMgaW4gdGhlCnJlc3VsdGluZyBwYWNrZmlsZShzKSBfc3RhcnRfIGF0IG9m ZnNldHMgbGVzcyB0aGFuIE4uCkFsbCB0aGUgcGFja2ZpbGVzIGFwcGVhciBjb25jYXRlbmF0ZWQg b24gc3Rkb3V0LAphbmQgZWFjaCBoYXMgaXRzIG9iamVjdCBjb3VudCBzZXQgdG8gMC4gIFRoZSBi ZWhhdmlvcgp3aXRob3V0IC0tc3Rkb3V0IGNhbm5vdCBiZSBkdXBsaWNhdGVkIGhlcmUgc2luY2UK bHNlZWsoMikgaXMgbm90IGdlbmVyYWxseSBwb3NzaWJsZSBvbiBzdGRvdXQuICBUaGUgZW5kCm9m IGVhY2ggcGFjayBpbiB0aGUgY29uY2F0ZW5hdGVkIHdob2xlIGNhbiBiZSBkZXRlY3RlZCBieQph c2tpbmcsICBqdXN0IGJlZm9yZSByZWFkaW5nIGVhY2ggb2JqZWN0LCAgaWYgdGhlIG5leHQKMjAg Ynl0ZXMgbWF0Y2ggdGhlIFNIQS0xIG9mIHdoYXQgY2FtZSBiZWZvcmUuCkEgZnV0dXJlIGNoYW5n ZSBtaWdodCBpbnNlcnQgYSBudWxsLWJ5dGUgRU9GIG1hcmtlcgooaS5lLiB0eXBlPU9CSl9OT05F L2xlbmd0aD0wKSBiZWZvcmUgZWFjaCBwYWNrJ3MgZmluYWwgU0hBLTEKb3IgYmVmb3JlIG9ubHkg dGhlIGZpbmFsIHBhY2sncyBTSEEtMS4KCldoZW4gLS1ibG9iLWxpbWl0PU4gaXMgc3BlY2lmaWVk LCAgYmxvYnMgd2hvc2UgdW5jb21wcmVzc2VkCnNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFs IHRvIE4gYXJlIG9taXR0ZWQgZnJvbSB0aGUgcGFjayhzKS4KSWYgLS1wYWNrLWxpbWl0IGlzIHNw ZWNpZmllZCwgLS1ibG9iLWxpbWl0IGlzIG5vdCwgYW5kCi0tc3Rkb3V0IGlzIG5vdCwgIHRoZW4g LS1ibG9iLWxpbWl0IGRlZmF1bHRzIHRvIDEvNApvZiB0aGUgLS1wYWNrLWxpbWl0LgoKVG8gZW5h YmxlIHRoaXMsICBjc3VtLWZpbGUuYyBub3cgaGFzIHRoZSBhYmlsaXR5IHRvIHJvbGxiYWNrCmEg Y2hlY2tzdW1tZWQgd3JpdGUgKHNlZSBzaGExbWFyay9zaGExdW5kbykuCgpTaWduZWQtb2ZmLWJ5 OiBEYW5hIEwuIEhvdyA8ZGFuYWhvd0BnbWFpbC5jb20+Ci0tLQogYnVpbHRpbi1wYWNrLW9iamVj dHMuYyAgIHwgIDMwMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0t LS0tCiBidWlsdGluLXVucGFjay1vYmplY3RzLmMgfCAgICAyICstCiBjc3VtLWZpbGUuYyAgICAg ICAgICAgICAgfCAgIDQxICsrKysrKysKIGNzdW0tZmlsZS5oICAgICAgICAgICAgICB8ICAgIDYg KwogZ2l0LXJlcGFjay5zaCAgICAgICAgICAgIHwgICAxMiArKy0KIGh0dHAtZmV0Y2guYyAgICAg ICAgICAgICB8ICAgIDIgKy0KIGh0dHAtcHVzaC5jICAgICAgICAgICAgICB8ICAgIDIgKy0KIGlu ZGV4LXBhY2suYyAgICAgICAgICAgICB8ICAgIDIgKy0KIHNoYTFfZmlsZS5jICAgICAgICAgICAg ICB8ICAgIDIgKy0KIDkgZmlsZXMgY2hhbmdlZCwgMzA3IGluc2VydGlvbnMoKyksIDYyIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2J1aWx0aW4tcGFjay1vYmplY3RzLmMgYi9idWlsdGluLXBh Y2stb2JqZWN0cy5jCmluZGV4IGI1Zjk2NDguLjBhMTExMTMgMTAwNjQ0Ci0tLSBhL2J1aWx0aW4t cGFjay1vYmplY3RzLmMKKysrIGIvYnVpbHRpbi1wYWNrLW9iamVjdHMuYwpAQCAtMTQsOCArMTQs OCBAQAogI2luY2x1ZGUgImxpc3Qtb2JqZWN0cy5oIgogCiBzdGF0aWMgY29uc3QgY2hhciBwYWNr X3VzYWdlW10gPSAiXAotZ2l0LXBhY2stb2JqZWN0cyBbeyAtcSB8IC0tcHJvZ3Jlc3MgfCAtLWFs bC1wcm9ncmVzcyB9XSBcblwKLQlbLS1sb2NhbF0gWy0taW5jcmVtZW50YWxdIFstLXdpbmRvdz1O XSBbLS1kZXB0aD1OXSBcblwKK2dpdC1wYWNrLW9iamVjdHMgW3sgLXEgfCAtLXByb2dyZXNzIHwg LS1hbGwtcHJvZ3Jlc3MgfV0gWy0tcGFjay1saW1pdFs9Tl1dXG5cCisJWy0tYmxvYi1saW1pdD1O XSBbLS1sb2NhbF0gWy0taW5jcmVtZW50YWxdIFstLXdpbmRvdz1OXSBbLS1kZXB0aD1OXVxuXAog CVstLW5vLXJldXNlLWRlbHRhXSBbLS1kZWx0YS1iYXNlLW9mZnNldF0gWy0tbm9uLWVtcHR5XSBc blwKIAlbLS1yZXZzIFstLXVucGFja2VkIHwgLS1hbGxdKl0gWy0tcmVmbG9nXSBbLS1zdGRvdXQg fCBiYXNlLW5hbWVdIFxuXAogCVs8cmVmLWxpc3QgfCA8b2JqZWN0LWxpc3RdIjsKQEAgLTI5LDYg KzI5LDcgQEAgc3RydWN0IG9iamVjdF9lbnRyeSB7CiAJdW5zaWduZWQgaW50IGRlcHRoOwkvKiBk ZWx0YSBkZXB0aCAqLwogCXVuc2lnbmVkIGludCBkZWx0YV9saW1pdDsJLyogYmFzZSBhZGp1c3Rt ZW50IGZvciBpbi1wYWNrIGRlbHRhICovCiAJdW5zaWduZWQgaW50IGhhc2g7CS8qIG5hbWUgaGlu dCBoYXNoICovCisJY2hhciBub193cml0ZTsJCS8qIGZsYWc6IHdyaXR0ZW4gdG8gcHJldmlvdXMg cGFjayBPUiB0b28gYmlnICovCiAJZW51bSBvYmplY3RfdHlwZSB0eXBlOwogCWVudW0gb2JqZWN0 X3R5cGUgaW5fcGFja190eXBlOwkvKiBjb3VsZCBiZSBkZWx0YSAqLwogCXVuc2lnbmVkIGxvbmcg ZGVsdGFfc2l6ZTsJLyogZGVsdGEgZGF0YSBzaXplICh1bmNvbXByZXNzZWQpICovCkBAIC02OCw3 ICs2OSwxMCBAQCBzdGF0aWMgaW50IGFsbG93X29mc19kZWx0YTsKIAogc3RhdGljIHN0cnVjdCBv YmplY3RfZW50cnkgKipzb3J0ZWRfYnlfc2hhLCAqKnNvcnRlZF9ieV90eXBlOwogc3RhdGljIHN0 cnVjdCBvYmplY3RfZW50cnkgKm9iamVjdHM7Ci1zdGF0aWMgdWludDMyX3QgbnJfb2JqZWN0cywg bnJfYWxsb2MsIG5yX3Jlc3VsdDsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqd3JpdHRl bl9saXN0Oworc3RhdGljIHVpbnQzMl90IG5yX29iamVjdHMsIG5yX2FsbG9jLCBucl9yZXN1bHQs IG5yX3dyaXR0ZW4sIG5yX3NraXBwZWQgPSAwOworc3RhdGljIHVpbnQzMl90IG9mZnNldF9saW1p dCA9IDA7CitzdGF0aWMgdWludDMyX3QgYmxvYl9saW1pdCA9IDA7CiBzdGF0aWMgY29uc3QgY2hh ciAqYmFzZV9uYW1lOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFja19maWxlX3NoYTFbMjBdOwog c3RhdGljIGludCBwcm9ncmVzcyA9IDE7CkBAIC00MTUsMTMgKzQxOSwxNyBAQCBzdGF0aWMgb2Zm X3Qgd3JpdGVfb2JqZWN0KHN0cnVjdCBzaGExZmlsZSAqZiwKIAl9CiAKIAlpZiAoIXRvX3JldXNl KSB7CisJCWludCB1c2FibGVfZGVsdGEgPQkhZW50cnktPmRlbHRhID8gMCA6CisJCQkJCSFvZmZz ZXRfbGltaXQgPyAxIDoKKwkJCQkJZW50cnktPmRlbHRhLT5ub193cml0ZSA/IDAgOgorCQkJCQll bnRyeS0+ZGVsdGEtPm9mZnNldCA/IDEgOiAwOwogCQlidWYgPSByZWFkX3NoYTFfZmlsZShlbnRy eS0+c2hhMSwgJnR5cGUsICZzaXplKTsKIAkJaWYgKCFidWYpCiAJCQlkaWUoInVuYWJsZSB0byBy ZWFkICVzIiwgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKIAkJaWYgKHNpemUgIT0gZW50cnkt PnNpemUpCiAJCQlkaWUoIm9iamVjdCAlcyBzaXplIGluY29uc2lzdGVuY3kgKCVsdSB2cyAlbHUp IiwKIAkJCSAgICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSksIHNpemUsIGVudHJ5LT5zaXplKTsK LQkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQlpZiAodXNhYmxlX2RlbHRhKSB7CiAJCQlidWYgPSBk ZWx0YV9hZ2FpbnN0KGJ1Ziwgc2l6ZSwgZW50cnkpOwogCQkJc2l6ZSA9IGVudHJ5LT5kZWx0YV9z aXplOwogCQkJb2JqX3R5cGUgPSAoYWxsb3dfb2ZzX2RlbHRhICYmIGVudHJ5LT5kZWx0YS0+b2Zm c2V0KSA/CkBAIC01MDMsNjIgKzUxMSwyMTIgQEAgc3RhdGljIG9mZl90IHdyaXRlX29uZShzdHJ1 Y3Qgc2hhMWZpbGUgKmYsCiAJCQkgICAgICAgc3RydWN0IG9iamVjdF9lbnRyeSAqZSwKIAkJCSAg ICAgICBvZmZfdCBvZmZzZXQpCiB7Ci0JaWYgKGUtPm9mZnNldCB8fCBlLT5wcmVmZXJyZWRfYmFz ZSkKKwlzdHJ1Y3Qgc2hhMXBvc24gcG9zbjsKKwl1aW50MzJfdCBzYXZlX3dyaXR0ZW4gPSAwLCBz YXZlX3dyaXR0ZW5fZGVsdGEgPSAwOworCXVpbnQzMl90IHNhdmVfcmV1c2VkID0gMCwgc2F2ZV9y ZXVzZWRfZGVsdGEgPSAwOworCWlmIChlLT5vZmZzZXQgfHwgZS0+cHJlZmVycmVkX2Jhc2UgfHwg ZS0+bm9fd3JpdGUpCiAJCS8qIG9mZnNldCBzdGFydHMgZnJvbSBoZWFkZXIgc2l6ZSBhbmQgY2Fu bm90IGJlIHplcm8KIAkJICogaWYgaXQgaXMgd3JpdHRlbiBhbHJlYWR5LgogCQkgKi8KIAkJcmV0 dXJuIG9mZnNldDsKIAkvKiBpZiB3ZSBhcmUgZGVsdGlmaWVkLCB3cml0ZSBvdXQgaXRzIGJhc2Ug b2JqZWN0IGZpcnN0LiAqLwotCWlmIChlLT5kZWx0YSkKKwlpZiAoZS0+ZGVsdGEpIHsKIAkJb2Zm c2V0ID0gd3JpdGVfb25lKGYsIGUtPmRlbHRhLCBvZmZzZXQpOworCQlpZiAoIW9mZnNldCkKKwkJ CXJldHVybiBvZmZzZXQ7CisJfQorCWlmIChvZmZzZXRfbGltaXQpIHsKKwkJaWYgKCAhcGFja190 b19zdGRvdXQgKSB7CisJCQkvKiBzYXZlIHN0YXRlIGJlZm9yZSB3cml0ZSBmb3IgcG9zc2libGUg bGF0ZXIgc2Vla2JhY2sgKi8KKwkJCXNhdmVfd3JpdHRlbiA9IHdyaXR0ZW4sIHNhdmVfd3JpdHRl bl9kZWx0YSA9IHdyaXR0ZW5fZGVsdGE7CisJCQlzYXZlX3JldXNlZCA9IHJldXNlZCwgc2F2ZV9y ZXVzZWRfZGVsdGEgPSByZXVzZWRfZGVsdGE7CisJCQlzaGExbWFyayhmLCAmcG9zbik7CisJCX0g ZWxzZSBpZiAoICh1bnNpZ25lZCBsb25nKW9mZnNldCA+PSAodW5zaWduZWQgbG9uZylvZmZzZXRf bGltaXQgKQorCQkJLyoKKwkJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG9iamVjdCdzIG9mZnNl dCBpbiB0aGUgcGFjaworCQkJICogZXhjZWVkcyBvciBpcyBlcXVhbCB0byB0aGUgb2Zmc2V0X2xp bWl0LiAgSXQgaXMKKwkJCSAqIGEgbG9vc2VyIHdheSBvZiBsaW1pdGluZyBwYWNrc2l6ZSB3L28g c2Vla2luZyBhbmQKKwkJCSAqIGlzIHVzZWQgaW4gLS1zdGRvdXQgbW9kZS4KKwkJCSAqLworCQkJ cmV0dXJuIDA7CisJfQogCWUtPm9mZnNldCA9IG9mZnNldDsKLQlyZXR1cm4gb2Zmc2V0ICsgd3Jp dGVfb2JqZWN0KGYsIGUpOworCW9mZnNldCArPSB3cml0ZV9vYmplY3QoZiwgZSk7CisJLyoKKwkg KiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGFja2ZpbGUgc2l6ZSBuZXZlciBleGNlZWRzIG9yIG1h dGNoZXMKKwkgKiB0aGUgb2Zmc2V0X2xpbWl0IGlmIHN1cHBsaWVkLiAgVGhlICIyMCIgaXMgZm9y IHRoZSBmaW5hbCBTSEExLgorCSAqIFRoaXMgbGltaXQgaXNuJ3QgdXNlZCB3aXRoIC0tc3Rkb3V0 IHNpbmNlIGl0IHJlcXVpcmVzIHNlZWtpbmcuCisJICovCisJaWYgKG9mZnNldF9saW1pdCAmJiAh cGFja190b19zdGRvdXQgJiYKKwkgICAgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0ID49ICh1bnNpZ25l ZCBsb25nKShvZmZzZXRfbGltaXQgLSAyMCkpIHsKKwkJd3JpdHRlbiA9IHNhdmVfd3JpdHRlbiwg d3JpdHRlbl9kZWx0YSA9IHNhdmVfd3JpdHRlbl9kZWx0YTsKKwkJcmV1c2VkID0gc2F2ZV9yZXVz ZWQsIHJldXNlZF9kZWx0YSA9IHNhdmVfcmV1c2VkX2RlbHRhOworCQlzaGExdW5kbyhmLCAmcG9z biwgb2Zmc2V0LCBlLT5vZmZzZXQpOworCQllLT5vZmZzZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9 CisJKndyaXR0ZW5fbGlzdCsrID0gZTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKgorICogTW92 ZSB0aGlzLCB0aGUgdmVyc2lvbiBpbiBmYXN0LWltcG9ydC5jLAorICogYW5kIGluZGV4X3BhY2su YzpyZWFkanVzdF9wYWNrX2hlYWRlcl9hbmRfc2hhMSBpbnRvIHNoYTFfZmlsZS5jID8KKyAqLwor c3RhdGljIHZvaWQgZml4dXBfaGVhZGVyX2Zvb3RlcihpbnQgcGFja19mZCwgdW5zaWduZWQgY2hh ciAqcGFja19maWxlX3NoYTEsCisJCQkJY2hhciAqcGFja19uYW1lLCB1aW50MzJfdCBvYmplY3Rf Y291bnQpCit7CisJc3RhdGljIGNvbnN0IGludCBidWZfc3ogPSAxMjggKiAxMDI0OworCVNIQV9D VFggYzsKKwlzdHJ1Y3QgcGFja19oZWFkZXIgaGRyOworCWNoYXIgKmJ1ZjsKKworCWlmIChsc2Vl ayhwYWNrX2ZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKKwkJZGllKCJGYWlsZWQgc2Vla2luZyB0byBz dGFydDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChyZWFkX2luX2Z1bGwocGFja19mZCwg Jmhkciwgc2l6ZW9mKGhkcikpICE9IHNpemVvZihoZHIpKQorCQlkaWUoIlVuYWJsZSB0byByZXJl YWQgaGVhZGVyIG9mICVzIiwgcGFja19uYW1lKTsKKwlpZiAobHNlZWsocGFja19mZCwgMCwgU0VF S19TRVQpICE9IDApCisJCWRpZSgiRmFpbGVkIHNlZWtpbmcgdG8gc3RhcnQ6ICVzIiwgc3RyZXJy b3IoZXJybm8pKTsKKwloZHIuaGRyX2VudHJpZXMgPSBodG9ubChvYmplY3RfY291bnQpOworCXdy aXRlX29yX2RpZShwYWNrX2ZkLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwlTSEExX0luaXQoJmMp OworCVNIQTFfVXBkYXRlKCZjLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwlidWYgPSB4bWFsbG9j KGJ1Zl9zeik7CisJZm9yICg7OykgeworCQlzaXplX3QgbiA9IHhyZWFkKHBhY2tfZmQsIGJ1Ziwg YnVmX3N6KTsKKwkJaWYgKCFuKQorCQkJYnJlYWs7CisJCWlmIChuIDwgMCkKKwkJCWRpZSgiRmFp bGVkIHRvIGNoZWNrc3VtICVzIiwgcGFja19uYW1lKTsKKwkJU0hBMV9VcGRhdGUoJmMsIGJ1Ziwg bik7CisJfQorCWZyZWUoYnVmKTsKKworCVNIQTFfRmluYWwocGFja19maWxlX3NoYTEsICZjKTsK Kwl3cml0ZV9vcl9kaWUocGFja19mZCwgcGFja19maWxlX3NoYTEsIDIwKTsKKwljbG9zZShwYWNr X2ZkKTsKIH0KIAordHlwZWRlZiBpbnQgKCplbnRyeV9zb3J0X3QpKGNvbnN0IHN0cnVjdCBvYmpl Y3RfZW50cnkgKiwgY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqKTsKKworc3RhdGljIGVudHJ5 X3NvcnRfdCBjdXJyZW50X3NvcnQ7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciB3cml0 ZV9wYWNrX2ZpbGUgKi8KKy8qIChwcm9iYWJseSBzaG91bGQgbW92ZSBzb3J0aW5nIHN0dWZmIHVw IGhlcmUpICovCitzdGF0aWMgaW50IHNvcnRfY29tcGFyYXRvcihjb25zdCB2b2lkICpfYSwgY29u c3Qgdm9pZCAqX2IpOworc3RhdGljIGludCBzaGExX3NvcnQoY29uc3Qgc3RydWN0IG9iamVjdF9l bnRyeSAqYSwgY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqYik7CitzdGF0aWMgdm9pZCB3cml0 ZV9pbmRleF9maWxlKHZvaWQpOworCiBzdGF0aWMgdm9pZCB3cml0ZV9wYWNrX2ZpbGUodm9pZCkK IHsKLQl1aW50MzJfdCBpOworCXVpbnQzMl90IGksIGo7CiAJc3RydWN0IHNoYTFmaWxlICpmOwog CW9mZl90IG9mZnNldDsKIAlzdHJ1Y3QgcGFja19oZWFkZXIgaGRyOwogCXVuc2lnbmVkIGxhc3Rf cGVyY2VudCA9IDk5OTsKLQlpbnQgZG9fcHJvZ3Jlc3MgPSBwcm9ncmVzczsKKwlpbnQgZG9fcHJv Z3Jlc3MgPSBwcm9ncmVzcyA+PiAhYmFzZV9uYW1lOworCWNoYXIgb2xkbmFtZVtQQVRIX01BWF07 CisJaW50IHBhY2tfZmQ7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3Q7CisJU0hBX0NUWCBj dHg7CisJdWludDMyX3QgbnJfYWN0dWFsID0gbnJfcmVzdWx0IC0gbnJfc2tpcHBlZDsKIAotCWlm ICghYmFzZV9uYW1lKSB7Ci0JCWYgPSBzaGExZmQoMSwgIjxzdGRvdXQ+Iik7Ci0JCWRvX3Byb2dy ZXNzID4+PSAxOwotCX0KLQllbHNlCi0JCWYgPSBzaGExY3JlYXRlKCIlcy0lcy4lcyIsIGJhc2Vf bmFtZSwKLQkJCSAgICAgICBzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSwgInBhY2siKTsK IAlpZiAoZG9fcHJvZ3Jlc3MpCi0JCWZwcmludGYoc3RkZXJyLCAiV3JpdGluZyAldSBvYmplY3Rz LlxuIiwgbnJfcmVzdWx0KTsKLQotCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoUEFDS19TSUdO QVRVUkUpOwotCWhkci5oZHJfdmVyc2lvbiA9IGh0b25sKFBBQ0tfVkVSU0lPTik7Ci0JaGRyLmhk cl9lbnRyaWVzID0gaHRvbmwobnJfcmVzdWx0KTsKLQlzaGExd3JpdGUoZiwgJmhkciwgc2l6ZW9m KGhkcikpOwotCW9mZnNldCA9IHNpemVvZihoZHIpOwotCWlmICghbnJfcmVzdWx0KQotCQlnb3Rv IGRvbmU7Ci0JZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgewotCQlvZmZzZXQgPSB3 cml0ZV9vbmUoZiwgb2JqZWN0cyArIGksIG9mZnNldCk7Ci0JCWlmIChkb19wcm9ncmVzcykgewot CQkJdW5zaWduZWQgcGVyY2VudCA9IHdyaXR0ZW4gKiAxMDAgLyBucl9yZXN1bHQ7Ci0JCQlpZiAo cHJvZ3Jlc3NfdXBkYXRlIHx8IHBlcmNlbnQgIT0gbGFzdF9wZXJjZW50KSB7Ci0JCQkJZnByaW50 ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCi0JCQkJCXBlcmNlbnQsIHdyaXR0ZW4s IG5yX3Jlc3VsdCk7Ci0JCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKLQkJCQlsYXN0X3BlcmNlbnQg PSBwZXJjZW50OworCQlmcHJpbnRmKHN0ZGVyciwgIldyaXRpbmcgJXUgb2JqZWN0cy5cbiIsIG5y X2FjdHVhbCk7CisJd3JpdHRlbl9saXN0ID0gbGlzdCA9IHhtYWxsb2MobnJfb2JqZWN0cyAqIHNp emVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICopKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmpl Y3RzOykgeworCQlpZiAoIWJhc2VfbmFtZSkgeworCQkJZiA9IHNoYTFmZChwYWNrX2ZkID0gMSwg IjxzdGRvdXQ+Iik7CisJCX0KKwkJZWxzZSB7CisJCQlpbnQgbGVuID0gc25wcmludGYob2xkbmFt ZSwgc2l6ZW9mIG9sZG5hbWUsICIlcy1YWFhYWFgiLCBiYXNlX25hbWUpOworCQkJaWYgKGxlbiA+ PSBQQVRIX01BWCkKKwkJCQlkaWUoImV4Y2Vzc2l2ZSBwYXRobmFtZSBsZW5ndGggZm9yIGluaXRp YWwgcGFja2ZpbGUgbmFtZSIpOworCQkJcGFja19mZCA9IG1rc3RlbXAob2xkbmFtZSk7CisJCQlp ZiAocGFja19mZCA8IDApCisJCQkJZGllKCJjYW4ndCBjcmVhdGUgJXM6ICVzIiwgb2xkbmFtZSwg c3RyZXJyb3IoZXJybm8pKTsKKwkJCWYgPSBzaGExZmQocGFja19mZCwgb2xkbmFtZSk7CisJCX0K KworCQloZHIuaGRyX3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKTsKKwkJaGRyLmhk cl92ZXJzaW9uID0gaHRvbmwoUEFDS19WRVJTSU9OKTsKKwkJaGRyLmhkcl9lbnRyaWVzID0gaHRv bmwoIWJhc2VfbmFtZSAmJiBvZmZzZXRfbGltaXQgPyAwIDogbnJfYWN0dWFsKTsKKwkJc2hhMXdy aXRlKGYsICZoZHIsIHNpemVvZihoZHIpKTsKKwkJb2Zmc2V0ID0gc2l6ZW9mKGhkcik7CisJCWZv ciAoOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlvZmZfdCBvZmZzZXRfb25lID0gd3JpdGVf b25lKGYsIG9iamVjdHMgKyBpLCBvZmZzZXQpOworCQkJaWYgKCFvZmZzZXRfb25lKQorCQkJCWJy ZWFrOworCQkJb2Zmc2V0ID0gb2Zmc2V0X29uZTsKKwkJCWlmIChkb19wcm9ncmVzcykgeworCQkJ CXVuc2lnbmVkIHBlcmNlbnQgPSB3cml0dGVuICogMTAwIC8gbnJfYWN0dWFsOworCQkJCWlmIChw cm9ncmVzc191cGRhdGUgfHwgcGVyY2VudCAhPSBsYXN0X3BlcmNlbnQpIHsKKwkJCQkJZnByaW50 ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJCQlwZXJjZW50LCB3cml0dGVu LCBucl9hY3R1YWwpOworCQkJCQlwcm9ncmVzc191cGRhdGUgPSAwOworCQkJCQlsYXN0X3BlcmNl bnQgPSBwZXJjZW50OworCQkJCX0KIAkJCX0KIAkJfQorCQlucl93cml0dGVuID0gd3JpdHRlbl9s aXN0IC0gbGlzdDsKKwkJd3JpdHRlbl9saXN0ID0gbGlzdDsKKworCQkvKgorCQkgKiBXcml0ZSB0 ZXJtaW5hdG9yIHJlY29yZCBoZXJlIGlmIGRlc2lyZWQ6CisJCSAqIHR5cGU9T0JKX05PTkUsIGxl bj0wOyAgdGhpcyBpcyBhIHplcm8gYnl0ZS4KKwkJICovCisKKwkJLyoKKwkJICogRGlkIHdlIHdy aXRlIHRoZSB3cm9uZyAjIGVudHJpZXMgaW4gdGhlIGhlYWRlcj8KKwkJICogSWYgc28sIHJld3Jp dGUgaXQgbGlrZSBpbiBmYXN0LWltcG9ydCAoZ2Fja2spLgorCQkgKi8KKwkJaWYgKCAhYmFzZV9u YW1lIHx8IG5yX3dyaXR0ZW4gPT0gbnJfYWN0dWFsICkgeworCQkJc2hhMWNsb3NlKGYsIHBhY2tf ZmlsZV9zaGExLCAxKTsKKwkJfSBlbHNlIHsKKwkJCXNoYTFjbG9zZShmLCBwYWNrX2ZpbGVfc2hh MSwgLTEpOworCQkJZml4dXBfaGVhZGVyX2Zvb3RlcihwYWNrX2ZkLCBwYWNrX2ZpbGVfc2hhMSwg b2xkbmFtZSwgbnJfd3JpdHRlbik7CisJCX0KKworCQkvKgorCQkgKiBjb21wdXRlIG9iamVjdF9s aXN0X3NoYTEgb2Ygc29ydGVkIHNoYSdzIHdlIGp1c3Qgd3JvdGUgb3V0OworCQkgKiB3ZSBhbHNv IG1hcmsgdGhlc2Ugb2JqZWN0cyBhcyB3cml0dGVuCisJCSAqLworCQljdXJyZW50X3NvcnQgPSBz aGExX3NvcnQ7CisJCXFzb3J0KGxpc3QsIG5yX3dyaXR0ZW4sIHNpemVvZihzdHJ1Y3Qgb2JqZWN0 X2VudHJ5ICopLCBzb3J0X2NvbXBhcmF0b3IpOworCQlTSEExX0luaXQoJmN0eCk7CisJCWZvciAo aiA9IDA7IGogPCBucl93cml0dGVuOyBqKyspIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmVu dHJ5ID0gKmxpc3QrKzsKKwkJCWVudHJ5LT5ub193cml0ZSA9IDE7CisJCQlTSEExX1VwZGF0ZSgm Y3R4LCBlbnRyeS0+c2hhMSwgMjApOworCQl9CisJCVNIQTFfRmluYWwob2JqZWN0X2xpc3Rfc2hh MSwgJmN0eCk7CisJCWxpc3QgPSB3cml0dGVuX2xpc3Q7CisJCS8qCisJCSAqIG5vdyB3ZSBjYW4g cmVuYW1lIHRoZSBwYWNrIGNvcnJlY3RseSBhbmQgd3JpdGUgdGhlIGluZGV4IGZpbGUKKwkJICov CisJCWlmIChiYXNlX25hbWUpIHsKKwkJCWNoYXIgbmV3bmFtZVtQQVRIX01BWF07CisJCQlpbnQg bGVuID0gc25wcmludGYobmV3bmFtZSwgc2l6ZW9mIG5ld25hbWUsICIlcy0lcy4lcyIsCisJCQkJ CQliYXNlX25hbWUsIHNoYTFfdG9faGV4KG9iamVjdF9saXN0X3NoYTEpLCAicGFjayIpOworCQkJ aWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJCQlkaWUoImV4Y2Vzc2l2ZSBwYXRobmFtZSBsZW5ndGgg Zm9yIGZpbmFsIHBhY2tmaWxlIG5hbWUiKTsKKwkJCWlmIChyZW5hbWUob2xkbmFtZSwgbmV3bmFt ZSkgPCAwKQorCQkJCWRpZSgiY291bGQgbm90IHJlbmFtZSB0aGUgcGFjayBmaWxlIik7CisJCX0K KwkJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQkJd3JpdGVfaW5kZXhfZmlsZSgpOworCQkJcHV0 cyhzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSk7CisJCX0KIAl9Ci0JaWYgKGRvX3Byb2dy ZXNzKQorCisJZnJlZSh3cml0dGVuX2xpc3QpOworCWlmIChucl9hY3R1YWwgJiYgZG9fcHJvZ3Jl c3MpCiAJCWZwdXRjKCdcbicsIHN0ZGVycik7Ci0gZG9uZToKLQlpZiAod3JpdHRlbiAhPSBucl9y ZXN1bHQpCi0JCWRpZSgid3JvdGUgJXUgb2JqZWN0cyB3aGlsZSBleHBlY3RpbmcgJXUiLCB3cml0 dGVuLCBucl9yZXN1bHQpOwotCXNoYTFjbG9zZShmLCBwYWNrX2ZpbGVfc2hhMSwgMSk7CisJaWYg KHdyaXR0ZW4gIT0gbnJfYWN0dWFsKQorCQlkaWUoIndyb3RlICV1IG9iamVjdHMgd2hpbGUgZXhw ZWN0aW5nICV1Iiwgd3JpdHRlbiwgbnJfYWN0dWFsKTsKIH0KIAogc3RhdGljIHZvaWQgd3JpdGVf aW5kZXhfZmlsZSh2b2lkKQpAQCAtNTY2LDggKzcyNCw4IEBAIHN0YXRpYyB2b2lkIHdyaXRlX2lu ZGV4X2ZpbGUodm9pZCkKIAl1aW50MzJfdCBpOwogCXN0cnVjdCBzaGExZmlsZSAqZiA9IHNoYTFj cmVhdGUoIiVzLSVzLiVzIiwgYmFzZV9uYW1lLAogCQkJCQlzaGExX3RvX2hleChvYmplY3RfbGlz dF9zaGExKSwgImlkeCIpOwotCXN0cnVjdCBvYmplY3RfZW50cnkgKipsaXN0ID0gc29ydGVkX2J5 X3NoYTsKLQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGFzdCA9IGxpc3QgKyBucl9yZXN1bHQ7CisJ c3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3QgPSB3cml0dGVuX2xpc3Q7CisJc3RydWN0IG9iamVj dF9lbnRyeSAqKmxhc3QgPSBsaXN0ICsgbnJfd3JpdHRlbjsKIAl1aW50MzJfdCBhcnJheVsyNTZd OwogCiAJLyoKQEAgLTU4Myw3ICs3NDEsNyBAQCBzdGF0aWMgdm9pZCB3cml0ZV9pbmRleF9maWxl KHZvaWQpCiAJCQkJYnJlYWs7CiAJCQluZXh0Kys7CiAJCX0KLQkJYXJyYXlbaV0gPSBodG9ubChu ZXh0IC0gc29ydGVkX2J5X3NoYSk7CisJCWFycmF5W2ldID0gaHRvbmwobmV4dCAtIHdyaXR0ZW5f bGlzdCk7CiAJCWxpc3QgPSBuZXh0OwogCX0KIAlzaGExd3JpdGUoZiwgYXJyYXksIDI1NiAqIDQp OwpAQCAtNTkxLDggKzc0OSw4IEBAIHN0YXRpYyB2b2lkIHdyaXRlX2luZGV4X2ZpbGUodm9pZCkK IAkvKgogCSAqIFdyaXRlIHRoZSBhY3R1YWwgU0hBMSBlbnRyaWVzLi4KIAkgKi8KLQlsaXN0ID0g c29ydGVkX2J5X3NoYTsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcmVzdWx0OyBpKyspIHsKKwlsaXN0 ID0gd3JpdHRlbl9saXN0OworCWZvciAoaSA9IDA7IGkgPCBucl93cml0dGVuOyBpKyspIHsKIAkJ c3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSAqbGlzdCsrOwogCQl1aW50MzJfdCBvZmZzZXQg PSBodG9ubChlbnRyeS0+b2Zmc2V0KTsKIAkJc2hhMXdyaXRlKGYsICZvZmZzZXQsIDQpOwpAQCAt MTAxNCw3ICsxMTcyLDcgQEAgc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0KHN0cnVjdCBvYmplY3Rf ZW50cnkgKmVudHJ5KQogCQkJCW9mcyA9IGMgJiAxMjc7CiAJCQkJd2hpbGUgKGMgJiAxMjgpIHsK IAkJCQkJb2ZzICs9IDE7Ci0JCQkJCWlmICghb2ZzIHx8IG9mcyAmIH4ofjBVTCA+PiA3KSkKKwkJ CQkJaWYgKCFvZnMgfHwgb2ZzICYgfih+MFVMID4+IDEpKQogCQkJCQkJZGllKCJkZWx0YSBiYXNl IG9mZnNldCBvdmVyZmxvdyBpbiBwYWNrIGZvciAlcyIsCiAJCQkJCQkgICAgc2hhMV90b19oZXgo ZW50cnktPnNoYTEpKTsKIAkJCQkJYyA9IGJ1Zlt1c2VkXzArK107CkBAIC0xMDU4LDYgKzEyMTYs NyBAQCBzdGF0aWMgdm9pZCBjaGVja19vYmplY3Qoc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkp CiAJfQogCiAJZW50cnktPnR5cGUgPSBzaGExX29iamVjdF9pbmZvKGVudHJ5LT5zaGExLCAmZW50 cnktPnNpemUpOworCW5yX3NraXBwZWQgKz0gZW50cnktPm5vX3dyaXRlID0gYmxvYl9saW1pdCAm JiAodW5zaWduZWQgbG9uZyllbnRyeS0+c2l6ZSA+PSBibG9iX2xpbWl0OwogCWlmIChlbnRyeS0+ dHlwZSA8IDApCiAJCWRpZSgidW5hYmxlIHRvIGdldCB0eXBlIG9mIG9iamVjdCAlcyIsCiAJCSAg ICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSkpOwpAQCAtMTEwMywxMCArMTI2Miw2IEBAIHN0YXRp YyB2b2lkIGdldF9vYmplY3RfZGV0YWlscyh2b2lkKQogCX0KIH0KIAotdHlwZWRlZiBpbnQgKCpl bnRyeV9zb3J0X3QpKGNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKiwgY29uc3Qgc3RydWN0IG9i amVjdF9lbnRyeSAqKTsKLQotc3RhdGljIGVudHJ5X3NvcnRfdCBjdXJyZW50X3NvcnQ7Ci0KIHN0 YXRpYyBpbnQgc29ydF9jb21wYXJhdG9yKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikK IHsKIAlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9h OwpAQCAtMTE5Nyw2ICsxMzUyLDEyIEBAIHN0YXRpYyBpbnQgdHJ5X2RlbHRhKHN0cnVjdCB1bnBh Y2tlZCAqdHJnLCBzdHJ1Y3QgdW5wYWNrZWQgKnNyYywKIAlpZiAodHJnX2VudHJ5LT50eXBlICE9 IHNyY19lbnRyeS0+dHlwZSkKIAkJcmV0dXJuIC0xOwogCisJLyogRG9uJ3QgdHJ5IGRlbHRhcyBp bnZvbHZpbmcgZXhjZXNzaXZlbHkgbGFyZ2Ugb2JqZWN0cyB3aGVuCisJICogcGFjayBzaXplIGlz IGxpbWl0ZWQKKwkgKi8KKwlpZiAodHJnX2VudHJ5LT5ub193cml0ZSB8fCBzcmNfZW50cnktPm5v X3dyaXRlKQorCQlyZXR1cm4gLTE7CisKIAkvKiBXZSBkbyBub3QgY29tcHV0ZSBkZWx0YSB0byAq Y3JlYXRlKiBvYmplY3RzIHdlIGFyZSBub3QKIAkgKiBnb2luZyB0byBwYWNrLgogCSAqLwpAQCAt MTUzOCw2ICsxNjk5LDcgQEAgaW50IGNtZF9wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNo YXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCiAJY29uc3QgY2hhciAqKnJwX2F2OwogCWlu dCBycF9hY19hbGxvYyA9IDY0OwogCWludCBycF9hYzsKKwlpbnQgYWRkZWQgPSAwOwogCiAJcnBf YXYgPSB4Y2FsbG9jKHJwX2FjX2FsbG9jLCBzaXplb2YoKnJwX2F2KSk7CiAKQEAgLTE1NjYsNiAr MTcyOCwyNCBAQCBpbnQgY21kX3BhY2tfb2JqZWN0cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFy Z3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKIAkJCWluY3JlbWVudGFsID0gMTsKIAkJCWNvbnRpbnVl OwogCQl9CisJCWlmICghc3RyY21wKCItLXBhY2stbGltaXQiLCBhcmcpKSB7CisJCQlvZmZzZXRf bGltaXQgPSAxVUwgPDwgMzE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChh cmcsICItLXBhY2stbGltaXQ9IikpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCW9mZnNldF9saW1pdCA9 IHN0cnRvdWwoYXJnKzEzLCAmZW5kLCAwKTsKKwkJCWlmICghYXJnWzEzXSB8fCAqZW5kKQorCQkJ CXVzYWdlKHBhY2tfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAo YXJnLCAiLS1ibG9iLWxpbWl0PSIpKSB7CisJCQljaGFyICplbmQ7CisJCQlibG9iX2xpbWl0ID0g c3RydG91bChhcmcrMTMsICZlbmQsIDApOworCQkJaWYgKCFhcmdbMTNdIHx8ICplbmQpCisJCQkJ dXNhZ2UocGFja191c2FnZSk7CisJCQljb250aW51ZTsKKwkJfQogCQlpZiAoIXByZWZpeGNtcChh cmcsICItLXdpbmRvdz0iKSkgewogCQkJY2hhciAqZW5kOwogCQkJd2luZG93ID0gc3RydG91bChh cmcrOSwgJmVuZCwgMCk7CkBAIC0xNjI5LDYgKzE4MDksMjQgQEAgaW50IGNtZF9wYWNrX29iamVj dHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCiAJCX0K IAkJdXNhZ2UocGFja191c2FnZSk7CiAJfQorCWlmICggb2Zmc2V0X2xpbWl0ICYmICFibG9iX2xp bWl0ICYmICFwYWNrX3RvX3N0ZG91dCApIHsKKwkJLyogbmVlZCB0byBsaW1pdCBibG9iIHNpemUg d2hlbiBjcmVhdGluZyBib3VuZGVkIHBhY2tzIG9uIGRpc2sgKi8KKwkJYmxvYl9saW1pdCA9IG9m ZnNldF9saW1pdCA+PiAyOworCQlhZGRlZCB8PSAyOworCX0KKwlpZiAoIG9mZnNldF9saW1pdCAm JiAhbm9fcmV1c2VfZGVsdGEgKSB7CisJCS8qIGRpZG4ndCBhdWRpdCB0aGlzIGNhc2UgeWV0ICov CisJCW5vX3JldXNlX2RlbHRhID0gMTsKKwkJYWRkZWQgfD0gMTsKKwl9CisJaWYgKCBhZGRlZCAp IHsKKwkJZnByaW50ZihzdGRlcnIsICJBZGRlZCB0byBjb21tYW5kIGxpbmU6Iik7CisJCWlmICgg YWRkZWQgJiAxICkKKwkJCWZwcmludGYoc3RkZXJyLCAiIC0tbm8tcmV1c2UtZGVsdGEiKTsKKwkJ aWYgKCBhZGRlZCAmIDIgKQorCQkJZnByaW50ZihzdGRlcnIsICIgLS1ibG9iLWxpbWl0PSV1Iiwg YmxvYl9saW1pdCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl9CiAKIAkvKiBUcmFkaXRp b25hbGx5ICJwYWNrLW9iamVjdHMgW29wdGlvbnNdIGJhc2UgZXh0cmEiIGZhaWxlZDsKIAkgKiB3 ZSB3b3VsZCBob3dldmVyIHdhbnQgdG8gdGFrZSByZWZzIHBhcmFtZXRlciB0aGF0IHdvdWxkCkBA IC0xNjk1LDEwICsxODkzLDYgQEAgaW50IGNtZF9wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0 IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCiAJCQlwcm9ncmVzc191cGRhdGUgPSAw OwogCQl9CiAJCXdyaXRlX3BhY2tfZmlsZSgpOwotCQlpZiAoIXBhY2tfdG9fc3Rkb3V0KSB7Ci0J CQl3cml0ZV9pbmRleF9maWxlKCk7Ci0JCQlwdXRzKHNoYTFfdG9faGV4KG9iamVjdF9saXN0X3No YTEpKTsKLQkJfQogCX0KIAlpZiAocHJvZ3Jlc3MpCiAJCWZwcmludGYoc3RkZXJyLCAiVG90YWwg JXUgKGRlbHRhICV1KSwgcmV1c2VkICV1IChkZWx0YSAldSlcbiIsCmRpZmYgLS1naXQgYS9idWls dGluLXVucGFjay1vYmplY3RzLmMgYi9idWlsdGluLXVucGFjay1vYmplY3RzLmMKaW5kZXggMzk1 NmM1Ni4uODRhNmM1YyAxMDA2NDQKLS0tIGEvYnVpbHRpbi11bnBhY2stb2JqZWN0cy5jCisrKyBi L2J1aWx0aW4tdW5wYWNrLW9iamVjdHMuYwpAQCAtMjA5LDcgKzIwOSw3IEBAIHN0YXRpYyB2b2lk IHVucGFja19kZWx0YV9lbnRyeShlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcg ZGVsdGFfc2l6ZSwKIAkJYmFzZV9vZmZzZXQgPSBjICYgMTI3OwogCQl3aGlsZSAoYyAmIDEyOCkg ewogCQkJYmFzZV9vZmZzZXQgKz0gMTsKLQkJCWlmICghYmFzZV9vZmZzZXQgfHwgYmFzZV9vZmZz ZXQgJiB+KH4wVUwgPj4gNykpCisJCQlpZiAoIWJhc2Vfb2Zmc2V0IHx8IGJhc2Vfb2Zmc2V0ICYg fih+MFVMID4+IDEpKQogCQkJCWRpZSgib2Zmc2V0IHZhbHVlIG92ZXJmbG93IGZvciBkZWx0YSBi YXNlIG9iamVjdCIpOwogCQkJcGFjayA9IGZpbGwoMSk7CiAJCQljID0gKnBhY2s7CmRpZmYgLS1n aXQgYS9jc3VtLWZpbGUuYyBiL2NzdW0tZmlsZS5jCmluZGV4IGI3MTc0YzYuLmUyYmVmNzUgMTAw NjQ0Ci0tLSBhL2NzdW0tZmlsZS5jCisrKyBiL2NzdW0tZmlsZS5jCkBAIC0zNSw3ICszNSwxMCBA QCBpbnQgc2hhMWNsb3NlKHN0cnVjdCBzaGExZmlsZSAqZiwgdW5zaWduZWQgY2hhciAqcmVzdWx0 LCBpbnQgdXBkYXRlKQogCWlmIChvZmZzZXQpIHsKIAkJU0hBMV9VcGRhdGUoJmYtPmN0eCwgZi0+ YnVmZmVyLCBvZmZzZXQpOwogCQlzaGExZmx1c2goZiwgb2Zmc2V0KTsKKwkJZi0+b2Zmc2V0ID0g MDsKIAl9CisJaWYgKHVwZGF0ZSA8IDApCisJCXJldHVybiAwOwkvKiBvbmx5IHdhbnQgdG8gZmx1 c2ggKG5vIGNoZWNrc3VtIHdyaXRlLCBubyBjbG9zZSkgKi8KIAlTSEExX0ZpbmFsKGYtPmJ1ZmZl ciwgJmYtPmN0eCk7CiAJaWYgKHJlc3VsdCkKIAkJaGFzaGNweShyZXN1bHQsIGYtPmJ1ZmZlcik7 CkBAIC02OSw2ICs3Miw0NCBAQCBpbnQgc2hhMXdyaXRlKHN0cnVjdCBzaGExZmlsZSAqZiwgdm9p ZCAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpCiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBTYXZl IGN1cnJlbnQgcG9zaXRpb24vc3RhdGUgaW4gb3V0cHV0IGZpbGUKKyAqIChuZWVkcyB0byBiZSBm YXN0IC0tIG5vIHN5c3RlbSBjYWxscyEpCisgKi8KK3ZvaWQgc2hhMW1hcmsoc3RydWN0IHNoYTFm aWxlICpmLCBzdHJ1Y3Qgc2hhMXBvc24gKnApCit7CisJcC0+b2Zmc2V0ID0gZi0+b2Zmc2V0Owor CXAtPmN0eCA9IGYtPmN0eDsJLyogbGFyZ2VyIHRoYW4gSSdkIGxpa2UgKi8KK30KKworLyoKKyAq IFJlc3RvcmUgcHJldmlvdXMgcG9zaXRpb24vc3RhdGUgaW4gb3V0cHV0IGZpbGUKKyAqIChjYW4g YmUgc2xvdykKKyAqLwordm9pZCBzaGExdW5kbyhzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHN0cnVjdCBz aGExcG9zbiAqcCwgbG9uZyBuZXcsIGxvbmcgb2xkKQoreworCWlmIChuZXcgLSBvbGQgPT0gKGxv bmcpZi0+b2Zmc2V0IC0gKGxvbmcpcC0+b2Zmc2V0KSB7CisJCWYtPmN0eCA9IHAtPmN0eDsKKwkJ Zi0+b2Zmc2V0ID0gcC0+b2Zmc2V0OworCQlyZXR1cm47CisJfQorCWlmIChsc2VlayhmLT5mZCwg KG9mZl90KW9sZCAtIChvZmZfdClwLT5vZmZzZXQsIFNFRUtfU0VUKSA9PSAob2ZmX3QpLTEpCisJ CWRpZSgic2hhMSBmaWxlICclcycgdW5kbyBzZWVrYmFjayBlcnJvciAoJXMpIiwgZi0+bmFtZSwg c3RyZXJyb3IoZXJybm8pKTsKKwlmLT5jdHggPSBwLT5jdHg7CisJd2hpbGUgKHAtPm9mZnNldCkg eworCQlpbnQgcmV0ID0geHJlYWQoZi0+ZmQsIGYtPmJ1ZmZlciwgcC0+b2Zmc2V0KTsKKwkJaWYg KCFyZXQpCisJCQlkaWUoInNoYTEgZmlsZSAnJXMnIHVuZG8gcmVhZGJhY2sgZXJyb3IuIE5vIGRh dGEiLCBmLT5uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlkaWUoInNoYTEgZmlsZSAnJXMnIHVu ZG8gcmVhZGJhY2sgZXJyb3IgKCVzKSIsIGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCVNI QTFfVXBkYXRlKCZmLT5jdHgsIGYtPmJ1ZmZlciwgcmV0KTsKKwkJcC0+b2Zmc2V0IC09IHJldDsK Kwl9CisJaWYgKGZ0cnVuY2F0ZShmLT5mZCwgKG9mZl90KW9sZCkpCisJCWRpZSgic2hhMSBmaWxl ICclcycgdW5kbyB0cnVuY2F0ZSBlcnJvciAoJXMpIiwgZi0+bmFtZSwgc3RyZXJyb3IoZXJybm8p KTsKKwlmLT5vZmZzZXQgPSAwOworfQorCiBzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFjcmVhdGUoY29u c3QgY2hhciAqZm10LCAuLi4pCiB7CiAJc3RydWN0IHNoYTFmaWxlICpmOwpkaWZmIC0tZ2l0IGEv Y3N1bS1maWxlLmggYi9jc3VtLWZpbGUuaAppbmRleCAzYWQxYTk5Li43ODBkZjE3IDEwMDY0NAot LS0gYS9jc3VtLWZpbGUuaAorKysgYi9jc3VtLWZpbGUuaApAQCAtOSwxMSArOSwxNyBAQCBzdHJ1 Y3Qgc2hhMWZpbGUgewogCWNoYXIgbmFtZVtQQVRIX01BWF07CiAJdW5zaWduZWQgY2hhciBidWZm ZXJbODE5Ml07CiB9Oworc3RydWN0IHNoYTFwb3NuIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0Owor CVNIQV9DVFggY3R4OworfTsKIAogZXh0ZXJuIHN0cnVjdCBzaGExZmlsZSAqc2hhMWZkKGludCBm ZCwgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gc3RydWN0IHNoYTFmaWxlICpzaGExY3JlYXRl KGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwg MikpKTsKIGV4dGVybiBpbnQgc2hhMWNsb3NlKHN0cnVjdCBzaGExZmlsZSAqLCB1bnNpZ25lZCBj aGFyICosIGludCk7CiBleHRlcm4gaW50IHNoYTF3cml0ZShzdHJ1Y3Qgc2hhMWZpbGUgKiwgdm9p ZCAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBzaGExd3JpdGVfY29tcHJlc3NlZChzdHJ1 Y3Qgc2hhMWZpbGUgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgc2hhMW1h cmsoc3RydWN0IHNoYTFmaWxlICosIHN0cnVjdCBzaGExcG9zbiAqKTsKK2V4dGVybiB2b2lkIHNo YTF1bmRvKHN0cnVjdCBzaGExZmlsZSAqLCBzdHJ1Y3Qgc2hhMXBvc24gKiwgbG9uZywgbG9uZyk7 CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2l0LXJlcGFjay5zaCBiL2dpdC1yZXBhY2suc2gKaW5k ZXggZGRmYThiNC4uMDI5OWZmMSAxMDA3NTUKLS0tIGEvZ2l0LXJlcGFjay5zaAorKysgYi9naXQt cmVwYWNrLnNoCkBAIC0xOCw2ICsxOCw5IEBAIGRvCiAJLXEpCXF1aWV0PS1xIDs7CiAJLWYpCW5v X3JldXNlX2RlbHRhPS0tbm8tcmV1c2UtZGVsdGEgOzsKIAktbCkJbG9jYWw9LS1sb2NhbCA7Owor CS0tcGFjay1saW1pdCkgZXh0cmE9IiRleHRyYSAkMSIgOzsKKwktLXBhY2stbGltaXQ9KikgZXh0 cmE9IiRleHRyYSAkMSIgOzsKKwktLWJsb2ItbGltaXQ9KikgZXh0cmE9IiRleHRyYSAkMSIgOzsK IAktLXdpbmRvdz0qKSBleHRyYT0iJGV4dHJhICQxIiA7OwogCS0tZGVwdGg9KikgZXh0cmE9IiRl eHRyYSAkMSIgOzsKIAkqKQl1c2FnZSA7OwpAQCAtNjIsMTEgKzY1LDEyIEBAIGNhc2UgIiwkYWxs X2ludG9fb25lLCIgaW4KIGVzYWMKIAogYXJncz0iJGFyZ3MgJGxvY2FsICRxdWlldCAkbm9fcmV1 c2VfZGVsdGEkZXh0cmEiCi1uYW1lPSQoZ2l0LXBhY2stb2JqZWN0cyAtLW5vbi1lbXB0eSAtLWFs bCAtLXJlZmxvZyAkYXJncyA8L2Rldi9udWxsICIkUEFDS1RNUCIpIHx8CituYW1lcz0kKGdpdC1w YWNrLW9iamVjdHMgLS1ub24tZW1wdHkgLS1hbGwgLS1yZWZsb2cgJGFyZ3MgPC9kZXYvbnVsbCAi JFBBQ0tUTVAiKSB8fAogCWV4aXQgMQotaWYgWyAteiAiJG5hbWUiIF07IHRoZW4KK2lmIFsgLXog IiRuYW1lcyIgXTsgdGhlbgogCWVjaG8gTm90aGluZyBuZXcgdG8gcGFjay4KLWVsc2UKK2ZpCitm b3IgbmFtZSBpbiAkbmFtZXMgOyBkbwogCWNobW9kIGEtdyAiJFBBQ0tUTVAtJG5hbWUucGFjayIK IAljaG1vZCBhLXcgIiRQQUNLVE1QLSRuYW1lLmlkeCIKIAlpZiB0ZXN0ICIkcXVpZXQiICE9ICct cSc7IHRoZW4KQEAgLTkyLDcgKzk2LDcgQEAgZWxzZQogCQlleGl0IDEKIAl9CiAJcm0gLWYgIiRQ QUNLRElSL29sZC1wYWNrLSRuYW1lLnBhY2siICIkUEFDS0RJUi9vbGQtcGFjay0kbmFtZS5pZHgi Ci1maQorZG9uZQogCiBpZiB0ZXN0ICIkcmVtb3ZlX3JlZHVuZGFudCIgPSB0CiB0aGVuCmRpZmYg LS1naXQgYS9odHRwLWZldGNoLmMgYi9odHRwLWZldGNoLmMKaW5kZXggNTU3YjQwMy4uMDliYWVk YyAxMDA2NDQKLS0tIGEvaHR0cC1mZXRjaC5jCisrKyBiL2h0dHAtZmV0Y2guYwpAQCAtMTk4LDcg KzE5OCw3IEBAIHN0YXRpYyB2b2lkIHN0YXJ0X29iamVjdF9yZXF1ZXN0KHN0cnVjdCBvYmplY3Rf cmVxdWVzdCAqb2JqX3JlcSkKIAkJU0hBMV9Jbml0KCZvYmpfcmVxLT5jKTsKIAkJaWYgKHByZXZf cG9zbj4wKSB7CiAJCQlwcmV2X3Bvc24gPSAwOwotCQkJbHNlZWsob2JqX3JlcS0+bG9jYWwsIFNF RUtfU0VULCAwKTsKKwkJCWxzZWVrKG9ial9yZXEtPmxvY2FsLCAwLCBTRUVLX1NFVCk7CiAJCQlm dHJ1bmNhdGUob2JqX3JlcS0+bG9jYWwsIDApOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvaHR0cC1w dXNoLmMgYi9odHRwLXB1c2guYwppbmRleCA3MjQ3MjBjLi5lM2Y3Njc1IDEwMDY0NAotLS0gYS9o dHRwLXB1c2guYworKysgYi9odHRwLXB1c2guYwpAQCAtMzEyLDcgKzMxMiw3IEBAIHN0YXRpYyB2 b2lkIHN0YXJ0X2ZldGNoX2xvb3NlKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KQog CQlTSEExX0luaXQoJnJlcXVlc3QtPmMpOwogCQlpZiAocHJldl9wb3NuPjApIHsKIAkJCXByZXZf cG9zbiA9IDA7Ci0JCQlsc2VlayhyZXF1ZXN0LT5sb2NhbF9maWxlbm8sIFNFRUtfU0VULCAwKTsK KwkJCWxzZWVrKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywgMCwgU0VFS19TRVQpOwogCQkJZnRydW5j YXRlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywgMCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9pbmRl eC1wYWNrLmMgYi9pbmRleC1wYWNrLmMKaW5kZXggNjI4NGZlMy4uZDM1YzRjNCAxMDA2NDQKLS0t IGEvaW5kZXgtcGFjay5jCisrKyBiL2luZGV4LXBhY2suYwpAQCAtMjQ5LDcgKzI0OSw3IEBAIHN0 YXRpYyB2b2lkICp1bnBhY2tfcmF3X2VudHJ5KHN0cnVjdCBvYmplY3RfZW50cnkgKm9iaiwgdW5p b24gZGVsdGFfYmFzZSAqZGVsdGFfCiAJCWJhc2Vfb2Zmc2V0ID0gYyAmIDEyNzsKIAkJd2hpbGUg KGMgJiAxMjgpIHsKIAkJCWJhc2Vfb2Zmc2V0ICs9IDE7Ci0JCQlpZiAoIWJhc2Vfb2Zmc2V0IHx8 IGJhc2Vfb2Zmc2V0ICYgfih+MFVMID4+IDcpKQorCQkJaWYgKCFiYXNlX29mZnNldCB8fCBiYXNl X29mZnNldCAmIH4ofjBVTCA+PiAxKSkKIAkJCQliYWRfb2JqZWN0KG9iai0+b2Zmc2V0LCAib2Zm c2V0IHZhbHVlIG92ZXJmbG93IGZvciBkZWx0YSBiYXNlIG9iamVjdCIpOwogCQkJcCA9IGZpbGwo MSk7CiAJCQljID0gKnA7CmRpZmYgLS1naXQgYS9zaGExX2ZpbGUuYyBiL3NoYTFfZmlsZS5jCmlu ZGV4IDljMjYwMzguLjcwODJkM2UgMTAwNjQ0Ci0tLSBhL3NoYTFfZmlsZS5jCisrKyBiL3NoYTFf ZmlsZS5jCkBAIC0xMTQ5LDcgKzExNDksNyBAQCBzdGF0aWMgb2ZmX3QgZ2V0X2RlbHRhX2Jhc2Uo c3RydWN0IHBhY2tlZF9naXQgKnAsCiAJCWJhc2Vfb2Zmc2V0ID0gYyAmIDEyNzsKIAkJd2hpbGUg KGMgJiAxMjgpIHsKIAkJCWJhc2Vfb2Zmc2V0ICs9IDE7Ci0JCQlpZiAoIWJhc2Vfb2Zmc2V0IHx8 IGJhc2Vfb2Zmc2V0ICYgfih+MFVMID4+IDcpKQorCQkJaWYgKCFiYXNlX29mZnNldCB8fCBiYXNl X29mZnNldCAmIH4ofjBVTCA+PiAxKSkKIAkJCQlkaWUoIm9mZnNldCB2YWx1ZSBvdmVyZmxvdyBm b3IgZGVsdGEgYmFzZSBvYmplY3QiKTsKIAkJCWMgPSBiYXNlX2luZm9bdXNlZCsrXTsKIAkJCWJh c2Vfb2Zmc2V0ID0gKGJhc2Vfb2Zmc2V0IDw8IDcpICsgKGMgJiAxMjcpOwotLSAKMS41LjEucmMy LjE4Lmc5Yzg4LWRpcnR5Cgo= ------=_Part_39225_10261285.1175719242978--