From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20156 invoked by alias); 1 Jun 2011 09:23:32 -0000 Received: (qmail 19738 invoked by uid 22791); 1 Jun 2011 09:23:28 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,TW_TM X-Spam-Check-By: sourceware.org Received: from mail-qy0-f182.google.com (HELO mail-qy0-f182.google.com) (209.85.216.182) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 01 Jun 2011 09:23:10 +0000 Received: by qyk27 with SMTP id 27so2928084qyk.20 for ; Wed, 01 Jun 2011 02:23:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.224.135.133 with SMTP id n5mr5078545qat.392.1306920189365; Wed, 01 Jun 2011 02:23:09 -0700 (PDT) Received: by 10.224.60.74 with HTTP; Wed, 1 Jun 2011 02:23:09 -0700 (PDT) Date: Wed, 01 Jun 2011 09:23:00 -0000 Message-ID: Subject: [patch] Improve detection of widening multiplication in the vectorizer From: Ira Rosen To: gcc-patches@gcc.gnu.org Cc: Patch Tracking Content-Type: multipart/mixed; boundary=000e0cd1041ea30fdb04a4a311de Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg00017.txt.bz2 --000e0cd1041ea30fdb04a4a311de Content-Type: text/plain; charset=ISO-8859-1 Content-length: 2723 Hi, The vectorizer expects widening multiplication pattern to be: type a_t, b_t; TYPE a_T, b_T, prod_T; a_T = (TYPE) a_t; b_T = (TYPE) b_t; prod_T = a_T * b_T; where type 'TYPE' is double the size of type 'type'. This works fine when the types are signed. For the unsigned types the code looks like: unsigned type a_t, b_t; unsigned TYPE u_prod_T; TYPE a_T, b_T, prod_T; a_T = (TYPE) a_t; b_T = (TYPE) b_t; prod_T = a_T * b_T; u_prod_T = (unsigned TYPE) prod_T; i.e., the multiplication is done on signed, followed by a cast to unsigned. This patch adds a support of such patterns and generates WIDEN_MULT_EXPR for the unsigned type. Another unsupported case is multiplication by a constant (e.g., b_T is a constant). This patch checks that the constant fits the smaller type 'type' and recognizes such cases as widening multiplication. Bootstrapped and tested on powerpc64-suse-linux. Tested the vectorization testsuite on arm-linux-gnueabi. I'll commit the patch shortly if there are no comments/objections. Ira ChangeLog: * tree-vectorizer.h (vect_recog_func_ptr): Make last argument to be a pointer. * tree-vect-patterns.c (vect_recog_widen_sum_pattern, vect_recog_widen_mult_pattern, vect_recog_dot_prod_pattern, vect_recog_pow_pattern): Likewise. (vect_pattern_recog_1): Remove declaration. (widened_name_p): Remove declaration. Add new argument to specify whether to check that both types are either signed or unsigned. (vect_recog_widen_mult_pattern): Update documentation. Handle unsigned patterns and multiplication by constants. (vect_pattern_recog_1): Update vect_recog_func references. Use statement information from the statement returned from pattern detection functions. (vect_pattern_recog): Update vect_recog_func reference. * tree-vect-stmts.c (vectorizable_type_promotion): For widening multiplication by a constant use the type of the other operand. testsuite/ChangeLog: * lib/target-supports.exp (check_effective_target_vect_widen_mult_qi_to_hi): Add NEON as supporting target. (check_effective_target_vect_widen_mult_hi_to_si): Likewise. (check_effective_target_vect_widen_mult_qi_to_hi_pattern): New. (check_effective_target_vect_widen_mult_hi_to_si_pattern): New. * gcc.dg/vect/vect-widen-mult-u8.c: Expect to be vectorized using widening multiplication on targets that support it. * gcc.dg/vect/vect-widen-mult-u16.c: Likewise. * gcc.dg/vect/vect-widen-mult-const-s16.c: New test. * gcc.dg/vect/vect-widen-mult-const-u16.c: New test. --000e0cd1041ea30fdb04a4a311de Content-Type: text/plain; charset=US-ASCII; name="widen-mult-patch.txt" Content-Disposition: attachment; filename="widen-mult-patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_goe0kzf00 Content-length: 26011 SW5kZXg6IHRyZWUtdmVjdG9yaXplci5oCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIHRyZWUtdmVjdG9yaXplci5oCShyZXZpc2lvbiAxNzQ0NzUpCisr KyB0cmVlLXZlY3Rvcml6ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtODk2LDcg Kzg5Niw3IEBAIGV4dGVybiB2b2lkIHZlY3Rfc2xwX3RyYW5zZm9ybV9iYiAo YmFzaWNfYmxvY2spOwogLyogUGF0dGVybiByZWNvZ25pdGlvbiBmdW5jdGlv bnMuCiAgICBBZGRpdGlvbmFsIHBhdHRlcm4gcmVjb2duaXRpb24gZnVuY3Rp b25zIGNhbiAoYW5kIHdpbGwpIGJlIGFkZGVkCiAgICBpbiB0aGUgZnV0dXJl LiAgKi8KLXR5cGVkZWYgZ2ltcGxlICgqIHZlY3RfcmVjb2dfZnVuY19wdHIp IChnaW1wbGUsIHRyZWUgKiwgdHJlZSAqKTsKK3R5cGVkZWYgZ2ltcGxlICgq IHZlY3RfcmVjb2dfZnVuY19wdHIpIChnaW1wbGUgKiwgdHJlZSAqLCB0cmVl ICopOwogI2RlZmluZSBOVU1fUEFUVEVSTlMgNAogdm9pZCB2ZWN0X3BhdHRl cm5fcmVjb2cgKGxvb3BfdmVjX2luZm8pOwogCkluZGV4OiB0cmVlLXZlY3Qt cGF0dGVybnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0cmVlLXZl Y3QtcGF0dGVybnMuYwkocmV2aXNpb24gMTc0NDc1KQorKysgdHJlZS12ZWN0 LXBhdHRlcm5zLmMJKHdvcmtpbmcgY29weSkKQEAgLTM4LDE2ICszOCwxMSBA QCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYg bm90IHNlZQogI2luY2x1ZGUgInJlY29nLmgiCiAjaW5jbHVkZSAiZGlhZ25v c3RpYy1jb3JlLmgiCiAKLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXN0 YXRpYyB2b2lkIHZlY3RfcGF0dGVybl9yZWNvZ18xCi0gIChnaW1wbGUgKCog KSAoZ2ltcGxlLCB0cmVlICosIHRyZWUgKiksIGdpbXBsZV9zdG10X2l0ZXJh dG9yKTsKLXN0YXRpYyBib29sIHdpZGVuZWRfbmFtZV9wICh0cmVlLCBnaW1w bGUsIHRyZWUgKiwgZ2ltcGxlICopOwotCiAvKiBQYXR0ZXJuIHJlY29nbml0 aW9uIGZ1bmN0aW9ucyAgKi8KLXN0YXRpYyBnaW1wbGUgdmVjdF9yZWNvZ193 aWRlbl9zdW1fcGF0dGVybiAoZ2ltcGxlLCB0cmVlICosIHRyZWUgKik7Ci1z dGF0aWMgZ2ltcGxlIHZlY3RfcmVjb2dfd2lkZW5fbXVsdF9wYXR0ZXJuIChn aW1wbGUsIHRyZWUgKiwgdHJlZSAqKTsKLXN0YXRpYyBnaW1wbGUgdmVjdF9y ZWNvZ19kb3RfcHJvZF9wYXR0ZXJuIChnaW1wbGUsIHRyZWUgKiwgdHJlZSAq KTsKLXN0YXRpYyBnaW1wbGUgdmVjdF9yZWNvZ19wb3dfcGF0dGVybiAoZ2lt cGxlLCB0cmVlICosIHRyZWUgKik7CitzdGF0aWMgZ2ltcGxlIHZlY3RfcmVj b2dfd2lkZW5fc3VtX3BhdHRlcm4gKGdpbXBsZSAqLCB0cmVlICosIHRyZWUg Kik7CitzdGF0aWMgZ2ltcGxlIHZlY3RfcmVjb2dfd2lkZW5fbXVsdF9wYXR0 ZXJuIChnaW1wbGUgKiwgdHJlZSAqLCB0cmVlICopOworc3RhdGljIGdpbXBs ZSB2ZWN0X3JlY29nX2RvdF9wcm9kX3BhdHRlcm4gKGdpbXBsZSAqLCB0cmVl ICosIHRyZWUgKik7CitzdGF0aWMgZ2ltcGxlIHZlY3RfcmVjb2dfcG93X3Bh dHRlcm4gKGdpbXBsZSAqLCB0cmVlICosIHRyZWUgKik7CiBzdGF0aWMgdmVj dF9yZWNvZ19mdW5jX3B0ciB2ZWN0X3ZlY3RfcmVjb2dfZnVuY19wdHJzW05V TV9QQVRURVJOU10gPSB7CiAJdmVjdF9yZWNvZ193aWRlbl9tdWx0X3BhdHRl cm4sCiAJdmVjdF9yZWNvZ193aWRlbl9zdW1fcGF0dGVybiwKQEAgLTYxLDEw ICs1NiwxMiBAQCBzdGF0aWMgdmVjdF9yZWNvZ19mdW5jX3B0ciB2ZWN0X3Zl Y3RfcmVjb2dfZnVuY19wdAogICAgaXMgYSByZXN1bHQgb2YgYSB0eXBlLXBy b21vdGlvbiwgc3VjaCB0aGF0OgogICAgICBERUZfU1RNVDogTkFNRSA9IE5P UCAobmFtZTApCiAgICB3aGVyZSB0aGUgdHlwZSBvZiBuYW1lMCAoSEFMRl9U WVBFKSBpcyBzbWFsbGVyIHRoYW4gdGhlIHR5cGUgb2YgTkFNRS4KLSovCisg ICBJZiBDSEVDS19TSUdOIGlzIFRSVUUsIGNoZWNrIHRoYXQgZWl0aGVyIGJv dGggdHlwZXMgYXJlIHNpZ25lZCBvciBib3RoIGFyZQorICAgdW5zaWduZWQu ICAqLwogCiBzdGF0aWMgYm9vbAotd2lkZW5lZF9uYW1lX3AgKHRyZWUgbmFt ZSwgZ2ltcGxlIHVzZV9zdG10LCB0cmVlICpoYWxmX3R5cGUsIGdpbXBsZSAq ZGVmX3N0bXQpCit3aWRlbmVkX25hbWVfcCAodHJlZSBuYW1lLCBnaW1wbGUg dXNlX3N0bXQsIHRyZWUgKmhhbGZfdHlwZSwgZ2ltcGxlICpkZWZfc3RtdCwK KwkJYm9vbCBjaGVja19zaWduKQogewogICB0cmVlIGR1bW15OwogICBnaW1w bGUgZHVtbXlfZ2ltcGxlOwpAQCAtOTgsNyArOTUsNyBAQCBzdGF0aWMgYm9v bAogCiAgICpoYWxmX3R5cGUgPSBUUkVFX1RZUEUgKG9wcm5kMCk7CiAgIGlm ICghSU5URUdSQUxfVFlQRV9QICh0eXBlKSB8fCAhSU5URUdSQUxfVFlQRV9Q ICgqaGFsZl90eXBlKQotICAgICAgfHwgKFRZUEVfVU5TSUdORUQgKHR5cGUp ICE9IFRZUEVfVU5TSUdORUQgKCpoYWxmX3R5cGUpKQorICAgICAgfHwgKChU WVBFX1VOU0lHTkVEICh0eXBlKSAhPSBUWVBFX1VOU0lHTkVEICgqaGFsZl90 eXBlKSkgJiYgY2hlY2tfc2lnbikKICAgICAgIHx8IChUWVBFX1BSRUNJU0lP TiAodHlwZSkgPCAoVFlQRV9QUkVDSVNJT04gKCpoYWxmX3R5cGUpICogMikp KQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTY4LDEyICsxNjUsMTIgQEAg dmVjdF9yZWNvZ190ZW1wX3NzYV92YXIgKHRyZWUgdHlwZSwgZ2ltcGxlIHN0 bXQpCiAgICAgICAgICBpbm5lci1sb29wIG5lc3RlZCBpbiBhbiBvdXRlci1s b29wIHRoYXQgdXMgYmVpbmcgdmVjdG9yaXplZCkuICAqLwogCiBzdGF0aWMg Z2ltcGxlCi12ZWN0X3JlY29nX2RvdF9wcm9kX3BhdHRlcm4gKGdpbXBsZSBs YXN0X3N0bXQsIHRyZWUgKnR5cGVfaW4sIHRyZWUgKnR5cGVfb3V0KQordmVj dF9yZWNvZ19kb3RfcHJvZF9wYXR0ZXJuIChnaW1wbGUgKmxhc3Rfc3RtdCwg dHJlZSAqdHlwZV9pbiwgdHJlZSAqdHlwZV9vdXQpCiB7CiAgIGdpbXBsZSBz dG10OwogICB0cmVlIG9wcm5kMCwgb3BybmQxOwogICB0cmVlIG9wcm5kMDAs IG9wcm5kMDE7Ci0gIHN0bXRfdmVjX2luZm8gc3RtdF92aW5mbyA9IHZpbmZv X2Zvcl9zdG10IChsYXN0X3N0bXQpOworICBzdG10X3ZlY19pbmZvIHN0bXRf dmluZm8gPSB2aW5mb19mb3Jfc3RtdCAoKmxhc3Rfc3RtdCk7CiAgIHRyZWUg dHlwZSwgaGFsZl90eXBlOwogICBnaW1wbGUgcGF0dGVybl9zdG10OwogICB0 cmVlIHByb2RfdHlwZTsKQEAgLTE4MSwxMCArMTc4LDEwIEBAIHN0YXRpYyBn aW1wbGUKICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09QX1ZJTkZPX0xPT1Ag KGxvb3BfaW5mbyk7CiAgIHRyZWUgdmFyOwogCi0gIGlmICghaXNfZ2ltcGxl X2Fzc2lnbiAobGFzdF9zdG10KSkKKyAgaWYgKCFpc19naW1wbGVfYXNzaWdu ICgqbGFzdF9zdG10KSkKICAgICByZXR1cm4gTlVMTDsKIAotICB0eXBlID0g Z2ltcGxlX2V4cHJfdHlwZSAobGFzdF9zdG10KTsKKyAgdHlwZSA9IGdpbXBs ZV9leHByX3R5cGUgKCpsYXN0X3N0bXQpOwogCiAgIC8qIExvb2sgZm9yIHRo ZSBmb2xsb3dpbmcgcGF0dGVybgogICAgICAgICAgIERYID0gKFRZUEUxKSBY OwpAQCAtMjEwLDcgKzIwNyw3IEBAIHN0YXRpYyBnaW1wbGUKICAgLyogU3Rh cnRpbmcgZnJvbSBMQVNUX1NUTVQsIGZvbGxvdyB0aGUgZGVmcyBvZiBpdHMg dXNlcyBpbiBzZWFyY2gKICAgICAgb2YgdGhlIGFib3ZlIHBhdHRlcm4uICAq LwogCi0gIGlmIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChsYXN0X3N0bXQp ICE9IFBMVVNfRVhQUikKKyAgaWYgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUg KCpsYXN0X3N0bXQpICE9IFBMVVNfRVhQUikKICAgICByZXR1cm4gTlVMTDsK IAogICBpZiAoU1RNVF9WSU5GT19JTl9QQVRURVJOX1AgKHN0bXRfdmluZm8p KQpAQCAtMjMxLDE0ICsyMjgsMTQgQEAgc3RhdGljIGdpbXBsZQogCiAgICAg ICBpZiAoU1RNVF9WSU5GT19ERUZfVFlQRSAoc3RtdF92aW5mbykgIT0gdmVj dF9yZWR1Y3Rpb25fZGVmKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAg IG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAobGFzdF9zdG10KTsKLSAg ICAgIG9wcm5kMSA9IGdpbXBsZV9hc3NpZ25fcmhzMiAobGFzdF9zdG10KTsK KyAgICAgIG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoKmxhc3Rfc3Rt dCk7CisgICAgICBvcHJuZDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKCpsYXN0 X3N0bXQpOwogICAgICAgaWYgKCF0eXBlc19jb21wYXRpYmxlX3AgKFRSRUVf VFlQRSAob3BybmQwKSwgdHlwZSkKIAkgIHx8ICF0eXBlc19jb21wYXRpYmxl X3AgKFRSRUVfVFlQRSAob3BybmQxKSwgdHlwZSkpCiAgICAgICAgIHJldHVy biBOVUxMOwotICAgICAgc3RtdCA9IGxhc3Rfc3RtdDsKKyAgICAgIHN0bXQg PSAqbGFzdF9zdG10OwogCi0gICAgICBpZiAod2lkZW5lZF9uYW1lX3AgKG9w cm5kMCwgc3RtdCwgJmhhbGZfdHlwZSwgJmRlZl9zdG10KSkKKyAgICAgIGlm ICh3aWRlbmVkX25hbWVfcCAob3BybmQwLCBzdG10LCAmaGFsZl90eXBlLCAm ZGVmX3N0bXQsIHRydWUpKQogICAgICAgICB7CiAgICAgICAgICAgc3RtdCA9 IGRlZl9zdG10OwogICAgICAgICAgIG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25f cmhzMSAoc3RtdCk7CkBAIC0yNDcsNyArMjQ0LDcgQEAgc3RhdGljIGdpbXBs ZQogICAgICAgICBoYWxmX3R5cGUgPSB0eXBlOwogICAgIH0KIAotICAvKiBT byBmYXIgc28gZ29vZC4gU2luY2UgbGFzdF9zdG10IHdhcyBkZXRlY3RlZCBh cyBhIChzdW1tYXRpb24pIHJlZHVjdGlvbiwKKyAgLyogU28gZmFyIHNvIGdv b2QuICBTaW5jZSAqbGFzdF9zdG10IHdhcyBkZXRlY3RlZCBhcyBhIChzdW1t YXRpb24pIHJlZHVjdGlvbiwKICAgICAgd2Uga25vdyB0aGF0IG9wcm5kMSBp cyB0aGUgcmVkdWN0aW9uIHZhcmlhYmxlIChkZWZpbmVkIGJ5IGEgbG9vcC1o ZWFkZXIKICAgICAgcGhpKSwgYW5kIG9wcm5kMCBpcyBhbiBzc2EtbmFtZSBk ZWZpbmVkIGJ5IGEgc3RtdCBpbiB0aGUgbG9vcCBib2R5LgogICAgICBMZWZ0 IHRvIGNoZWNrIHRoYXQgb3BybmQwIGlzIGRlZmluZWQgYnkgYSAod2lkZW5f KW11bHRfZXhwciAgKi8KQEAgLTI5MywxMCArMjkwLDEwIEBAIHN0YXRpYyBn aW1wbGUKICAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChUUkVFX1RZ UEUgKG9wcm5kMCksIHByb2RfdHlwZSkKICAgICAgICAgICB8fCAhdHlwZXNf Y29tcGF0aWJsZV9wIChUUkVFX1RZUEUgKG9wcm5kMSksIHByb2RfdHlwZSkp CiAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgaWYgKCF3aWRlbmVkX25h bWVfcCAob3BybmQwLCBzdG10LCAmaGFsZl90eXBlMCwgJmRlZl9zdG10KSkK KyAgICAgIGlmICghd2lkZW5lZF9uYW1lX3AgKG9wcm5kMCwgc3RtdCwgJmhh bGZfdHlwZTAsICZkZWZfc3RtdCwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiBO VUxMOwogICAgICAgb3BybmQwMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVm X3N0bXQpOwotICAgICAgaWYgKCF3aWRlbmVkX25hbWVfcCAob3BybmQxLCBz dG10LCAmaGFsZl90eXBlMSwgJmRlZl9zdG10KSkKKyAgICAgIGlmICghd2lk ZW5lZF9uYW1lX3AgKG9wcm5kMSwgc3RtdCwgJmhhbGZfdHlwZTEsICZkZWZf c3RtdCwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgb3By bmQwMSA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOwogICAgICAg aWYgKCF0eXBlc19jb21wYXRpYmxlX3AgKGhhbGZfdHlwZTAsIGhhbGZfdHlw ZTEpKQpAQCAtMzIyLDcgKzMxOSw3IEBAIHN0YXRpYyBnaW1wbGUKIAogICAv KiBXZSBkb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgb3JkZXIgb2YgdGhlIGNv bXB1dGF0aW9uIGluIHRoZSBpbm5lci1sb29wCiAgICAgIHdoZW4gZG9pbmcg b3V0ZXItbG9vcCB2ZWN0b3JpemF0aW9uLiAgKi8KLSAgZ2NjX2Fzc2VydCAo IW5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwgbGFzdF9zdG10KSk7Cisg IGdjY19hc3NlcnQgKCFuZXN0ZWRfaW5fdmVjdF9sb29wX3AgKGxvb3AsICps YXN0X3N0bXQpKTsKIAogICByZXR1cm4gcGF0dGVybl9zdG10OwogfQpAQCAt MzQyLDI0ICszMzksNDcgQEAgc3RhdGljIGdpbXBsZQogCiAgICB3aGVyZSB0 eXBlICdUWVBFJyBpcyBhdCBsZWFzdCBkb3VibGUgdGhlIHNpemUgb2YgdHlw ZSAndHlwZScuCiAKKyAgIEFsc28gZGV0ZWN0IHVuc2dpZ25lZCBjYXNlczoK KworICAgICB1bnNpZ25lZCB0eXBlIGFfdCwgYl90OworICAgICB1bnNpZ25l ZCBUWVBFIHVfcHJvZF9UOworICAgICBUWVBFIGFfVCwgYl9ULCBwcm9kX1Q7 CisKKyAgICAgUzEgIGFfdCA9IDsKKyAgICAgUzIgIGJfdCA9IDsKKyAgICAg UzMgIGFfVCA9IChUWVBFKSBhX3Q7CisgICAgIFM0ICBiX1QgPSAoVFlQRSkg Yl90OworICAgICBTNSAgcHJvZF9UID0gYV9UICogYl9UOworICAgICBTNiAg dV9wcm9kX1QgPSAodW5zaWduZWQgVFlQRSkgcHJvZF9UOworCisgICBhbmQg bXVsdGlwbGljYXRpb24gYnkgY29uc3RhbnRzOgorCisgICAgIHR5cGUgYV90 OworICAgICBUWVBFIGFfVCwgcHJvZF9UOworCisgICAgIFMxICBhX3QgPSA7 CisgICAgIFMzICBhX1QgPSAoVFlQRSkgYV90OworICAgICBTNSAgcHJvZF9U ID0gYV9UICogQ09OU1Q7CisKICAgIElucHV0OgogCi0gICAqIExBU1RfU1RN VDogQSBzdG10IGZyb20gd2hpY2ggdGhlIHBhdHRlcm4gc2VhcmNoIGJlZ2lu cy4gSW4gdGhlIGV4YW1wbGUsCi0gICB3aGVuIHRoaXMgZnVuY3Rpb24gaXMg Y2FsbGVkIHdpdGggUzUsIHRoZSBwYXR0ZXJuIHtTMyxTNCxTNX0gaXMgYmUg ZGV0ZWN0ZWQuCisgICAqIExBU1RfU1RNVDogQSBzdG10IGZyb20gd2hpY2gg dGhlIHBhdHRlcm4gc2VhcmNoIGJlZ2lucy4gIEluIHRoZSBleGFtcGxlLAor ICAgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIFM1LCB0aGUg cGF0dGVybiB7UzMsUzQsUzUsKFM2KX0gaXMKKyAgIGRldGVjdGVkLgogCiAg ICBPdXRwdXQ6CiAKICAgICogVFlQRV9JTjogVGhlIHR5cGUgb2YgdGhlIGlu cHV0IGFyZ3VtZW50cyB0byB0aGUgcGF0dGVybi4KIAotICAgKiBUWVBFX09V VDogVGhlIHR5cGUgb2YgdGhlIG91dHB1dCAgb2YgdGhpcyBwYXR0ZXJuLgor ICAgKiBUWVBFX09VVDogVGhlIHR5cGUgb2YgdGhlIG91dHB1dCBvZiB0aGlz IHBhdHRlcm4uCiAKICAgICogUmV0dXJuIHZhbHVlOiBBIG5ldyBzdG10IHRo YXQgd2lsbCBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHNlcXVlbmNlIG9mCi0g ICBzdG10cyB0aGF0IGNvbnN0aXR1dGUgdGhlIHBhdHRlcm4uIEluIHRoaXMg Y2FzZSBpdCB3aWxsIGJlOgorICAgc3RtdHMgdGhhdCBjb25zdGl0dXRlIHRo ZSBwYXR0ZXJuLiAgSW4gdGhpcyBjYXNlIGl0IHdpbGwgYmU6CiAgICAgICAg IFdJREVOX01VTFQgPGFfdCwgYl90PgogKi8KIAogc3RhdGljIGdpbXBsZQot dmVjdF9yZWNvZ193aWRlbl9tdWx0X3BhdHRlcm4gKGdpbXBsZSBsYXN0X3N0 bXQsCit2ZWN0X3JlY29nX3dpZGVuX211bHRfcGF0dGVybiAoZ2ltcGxlICps YXN0X3N0bXQsCiAJCQkgICAgICAgdHJlZSAqdHlwZV9pbiwKIAkJCSAgICAg ICB0cmVlICp0eXBlX291dCkKIHsKQEAgLTM2Nyw0MCArMzg3LDExMSBAQCBz dGF0aWMgZ2ltcGxlCiAgIHRyZWUgb3BybmQwLCBvcHJuZDE7CiAgIHRyZWUg dHlwZSwgaGFsZl90eXBlMCwgaGFsZl90eXBlMTsKICAgZ2ltcGxlIHBhdHRl cm5fc3RtdDsKLSAgdHJlZSB2ZWN0eXBlLCB2ZWN0eXBlX291dDsKKyAgdHJl ZSB2ZWN0eXBlLCB2ZWN0eXBlX291dCA9IE5VTExfVFJFRTsKICAgdHJlZSBk dW1teTsKICAgdHJlZSB2YXI7CiAgIGVudW0gdHJlZV9jb2RlIGR1bW15X2Nv ZGU7CiAgIGludCBkdW1teV9pbnQ7CiAgIFZFQyAodHJlZSwgaGVhcCkgKmR1 bW15X3ZlYzsKKyAgYm9vbCBvcDBfb2ssIG9wMV9vazsKIAotICBpZiAoIWlz X2dpbXBsZV9hc3NpZ24gKGxhc3Rfc3RtdCkpCisgIGlmICghaXNfZ2ltcGxl X2Fzc2lnbiAoKmxhc3Rfc3RtdCkpCiAgICAgcmV0dXJuIE5VTEw7CiAKLSAg dHlwZSA9IGdpbXBsZV9leHByX3R5cGUgKGxhc3Rfc3RtdCk7CisgIHR5cGUg PSBnaW1wbGVfZXhwcl90eXBlICgqbGFzdF9zdG10KTsKIAogICAvKiBTdGFy dGluZyBmcm9tIExBU1RfU1RNVCwgZm9sbG93IHRoZSBkZWZzIG9mIGl0cyB1 c2VzIGluIHNlYXJjaAogICAgICBvZiB0aGUgYWJvdmUgcGF0dGVybi4gICov CiAKLSAgaWYgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGxhc3Rfc3RtdCkg IT0gTVVMVF9FWFBSKQorICBpZiAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo Kmxhc3Rfc3RtdCkgIT0gTVVMVF9FWFBSKQogICAgIHJldHVybiBOVUxMOwog Ci0gIG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAobGFzdF9zdG10KTsK LSAgb3BybmQxID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChsYXN0X3N0bXQpOwor ICBvcHJuZDAgPSBnaW1wbGVfYXNzaWduX3JoczEgKCpsYXN0X3N0bXQpOwor ICBvcHJuZDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKCpsYXN0X3N0bXQpOwog ICBpZiAoIXR5cGVzX2NvbXBhdGlibGVfcCAoVFJFRV9UWVBFIChvcHJuZDAp LCB0eXBlKQogICAgICAgfHwgIXR5cGVzX2NvbXBhdGlibGVfcCAoVFJFRV9U WVBFIChvcHJuZDEpLCB0eXBlKSkKICAgICByZXR1cm4gTlVMTDsKIAotICAv KiBDaGVjayBhcmd1bWVudCAwICovCi0gIGlmICghd2lkZW5lZF9uYW1lX3Ag KG9wcm5kMCwgbGFzdF9zdG10LCAmaGFsZl90eXBlMCwgJmRlZl9zdG10MCkp Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25f cmhzMSAoZGVmX3N0bXQwKTsKKyAgLyogQ2hlY2sgYXJndW1lbnQgMC4gICov CisgIG9wMF9vayA9IHdpZGVuZWRfbmFtZV9wIChvcHJuZDAsICpsYXN0X3N0 bXQsICZoYWxmX3R5cGUwLCAmZGVmX3N0bXQwLCBmYWxzZSk7CisgIC8qIENo ZWNrIGFyZ3VtZW50IDEuICAqLworICBvcDFfb2sgPSB3aWRlbmVkX25hbWVf cCAob3BybmQxLCAqbGFzdF9zdG10LCAmaGFsZl90eXBlMSwgJmRlZl9zdG10 MSwgZmFsc2UpOwogCi0gIC8qIENoZWNrIGFyZ3VtZW50IDEgKi8KLSAgaWYg KCF3aWRlbmVkX25hbWVfcCAob3BybmQxLCBsYXN0X3N0bXQsICZoYWxmX3R5 cGUxLCAmZGVmX3N0bXQxKSkKKyAgLyogSW4gY2FzZSBvZiBtdWx0aXBsaWNh dGlvbiBieSBhIGNvbnN0YW50IG9uZSBvZiB0aGUgb3BlcmFuZHMgbWF5IG5v dCBtYXRjaAorICAgICB0aGUgcGF0dGVybiwgYnV0IG5vdCBib3RoLiAgKi8K KyAgaWYgKCFvcDBfb2sgJiYgIW9wMV9vaykKICAgICByZXR1cm4gTlVMTDsK LSAgb3BybmQxID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdDEpOwog CisgIGlmIChvcDBfb2sgJiYgb3AxX29rKQorICAgIHsKKyAgICAgIG9wcm5k MCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQwKTsKKyAgICAgIG9w cm5kMSA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQxKTsKKyAgICB9 CSAgICAgICAKKyAgZWxzZSBpZiAoIW9wMF9vaykKKyAgICB7CisgICAgICBp ZiAoQ09OU1RBTlRfQ0xBU1NfUCAob3BybmQwKQorCSAgJiYgVFJFRV9DT0RF IChoYWxmX3R5cGUxKSA9PSBJTlRFR0VSX1RZUEUKKwkgICYmIHRyZWVfaW50 X2NzdF9sdCAob3BybmQwLCBUWVBFX01BWFZBTCAoaGFsZl90eXBlMSkpCisg ICAgICAgICAgJiYgdHJlZV9pbnRfY3N0X2x0IChUWVBFX01JTlZBTCAoaGFs Zl90eXBlMSksIG9wcm5kMCkpCisgICAgICAgIHsKKwkgIC8qIE9QUk5EMCBp cyBhIGNvbnN0YW50IG9mIEhBTEZfVFlQRTEuICAqLworIAkgIGhhbGZfdHlw ZTAgPSBoYWxmX3R5cGUxOworICAgICAgICAgIG9wcm5kMSA9IGdpbXBsZV9h c3NpZ25fcmhzMSAoZGVmX3N0bXQxKTsKKyAgICAgICAgfQorICAgICAgZWxz ZQorCXJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoIW9wMV9vaykK KyAgICB7CisgICAgICBpZiAoQ09OU1RBTlRfQ0xBU1NfUCAob3BybmQxKQor ICAgICAgICAgICYmIFRSRUVfQ09ERSAoaGFsZl90eXBlMCkgPT0gSU5URUdF Ul9UWVBFCisgICAgICAgICAgJiYgdHJlZV9pbnRfY3N0X2x0IChvcHJuZDEs IFRZUEVfTUFYVkFMIChoYWxmX3R5cGUwKSkKKyAgICAgICAgICAmJiB0cmVl X2ludF9jc3RfbHQgKFRZUEVfTUlOVkFMIChoYWxmX3R5cGUwKSwgb3BybmQx KSkKKyAgICAgICAgeworCSAgLyogT1BSTkQxIGlzIGEgY29uc3RhbnQgb2Yg SEFMRl9UWVBFMC4gICovCisgICAgICAgICAgaGFsZl90eXBlMSA9IGhhbGZf dHlwZTA7CisgICAgICAgICAgb3BybmQwID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChkZWZfc3RtdDApOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAg IHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBIYW5kbGUgdW5zaWduZWQg Y2FzZS4gIExvb2sgZm9yCisgICAgIFM2ICB1X3Byb2RfVCA9ICh1bnNpZ25l ZCBUWVBFKSBwcm9kX1Q7CisgICAgIFVzZSB1bnNpZ25lZCBUWVBFIGFzIHRo ZSB0eXBlIGZvciBXSURFTl9NVUxUX0VYUFIuICAqLworICBpZiAoVFlQRV9V TlNJR05FRCAodHlwZSkgIT0gVFlQRV9VTlNJR05FRCAoaGFsZl90eXBlMCkp CisgICAgeworICAgICAgdHJlZSBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAo Kmxhc3Rfc3RtdCksIHVzZV9saHM7CisgICAgICBpbW1fdXNlX2l0ZXJhdG9y IGltbV9pdGVyOworICAgICAgdXNlX29wZXJhbmRfcCB1c2VfcDsKKyAgICAg IGludCBudXNlcyA9IDA7CisgICAgICBnaW1wbGUgdXNlX3N0bXQgPSBOVUxM OworICAgICAgdHJlZSB1c2VfdHlwZTsKKworICAgICAgaWYgKFRZUEVfVU5T SUdORUQgKHR5cGUpID09IFRZUEVfVU5TSUdORUQgKGhhbGZfdHlwZTEpKQor ICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgRk9SX0VBQ0hfSU1NX1VT RV9GQVNUICh1c2VfcCwgaW1tX2l0ZXIsIGxocykKKyAgICAgICAgeworICAg ICAgICAgIHVzZV9zdG10ID0gVVNFX1NUTVQgKHVzZV9wKTsKKyAgICAgICAg ICBudXNlcysrOworICAgICAgICB9CisKKyAgICAgIGlmIChudXNlcyAhPSAx IHx8ICFpc19naW1wbGVfYXNzaWduICh1c2Vfc3RtdCkKKyAgICAgICAgICB8 fCBnaW1wbGVfYXNzaWduX3Joc19jb2RlICh1c2Vfc3RtdCkgIT0gTk9QX0VY UFIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICB1c2VfbGhzID0g Z2ltcGxlX2Fzc2lnbl9saHMgKHVzZV9zdG10KTsKKyAgICAgIHVzZV90eXBl ID0gVFJFRV9UWVBFICh1c2VfbGhzKTsKKyAgICAgIGlmICghSU5URUdSQUxf VFlQRV9QICh1c2VfdHlwZSkKKyAgICAgICAgICB8fCAoVFlQRV9VTlNJR05F RCAodHlwZSkgPT0gVFlQRV9VTlNJR05FRCAodXNlX3R5cGUpKQorICAgICAg ICAgIHx8IChUWVBFX1BSRUNJU0lPTiAodHlwZSkgIT0gVFlQRV9QUkVDSVNJ T04gKHVzZV90eXBlKSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAg ICB0eXBlID0gdXNlX3R5cGU7CisgICAgICAqbGFzdF9zdG10ID0gdXNlX3N0 bXQ7CisgICAgfQorCiAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChoYWxm X3R5cGUwLCBoYWxmX3R5cGUxKSkKICAgICByZXR1cm4gTlVMTDsKIApAQCAt NDEzLDcgKzUwNCw3IEBAIHN0YXRpYyBnaW1wbGUKICAgdmVjdHlwZV9vdXQg PSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUgKHR5cGUpOwogICBpZiAo IXZlY3R5cGUKICAgICAgIHx8ICF2ZWN0eXBlX291dAotICAgICAgfHwgIXN1 cHBvcnRhYmxlX3dpZGVuaW5nX29wZXJhdGlvbiAoV0lERU5fTVVMVF9FWFBS LCBsYXN0X3N0bXQsCisgICAgICB8fCAhc3VwcG9ydGFibGVfd2lkZW5pbmdf b3BlcmF0aW9uIChXSURFTl9NVUxUX0VYUFIsICpsYXN0X3N0bXQsCiAJCQkJ CSAgdmVjdHlwZV9vdXQsIHZlY3R5cGUsCiAJCQkJCSAgJmR1bW15LCAmZHVt bXksICZkdW1teV9jb2RlLAogCQkJCQkgICZkdW1teV9jb2RlLCAmZHVtbXlf aW50LCAmZHVtbXlfdmVjKSkKQEAgLTQ2MiwxNiArNTUzLDE2IEBAIHN0YXRp YyBnaW1wbGUKICovCiAKIHN0YXRpYyBnaW1wbGUKLXZlY3RfcmVjb2dfcG93 X3BhdHRlcm4gKGdpbXBsZSBsYXN0X3N0bXQsIHRyZWUgKnR5cGVfaW4sIHRy ZWUgKnR5cGVfb3V0KQordmVjdF9yZWNvZ19wb3dfcGF0dGVybiAoZ2ltcGxl ICpsYXN0X3N0bXQsIHRyZWUgKnR5cGVfaW4sIHRyZWUgKnR5cGVfb3V0KQog ewogICB0cmVlIGZuLCBiYXNlLCBleHAgPSBOVUxMOwogICBnaW1wbGUgc3Rt dDsKICAgdHJlZSB2YXI7CiAKLSAgaWYgKCFpc19naW1wbGVfY2FsbCAobGFz dF9zdG10KSB8fCBnaW1wbGVfY2FsbF9saHMgKGxhc3Rfc3RtdCkgPT0gTlVM TCkKKyAgaWYgKCFpc19naW1wbGVfY2FsbCAoKmxhc3Rfc3RtdCkgfHwgZ2lt cGxlX2NhbGxfbGhzICgqbGFzdF9zdG10KSA9PSBOVUxMKQogICAgIHJldHVy biBOVUxMOwogCi0gIGZuID0gZ2ltcGxlX2NhbGxfZm5kZWNsIChsYXN0X3N0 bXQpOworICBmbiA9IGdpbXBsZV9jYWxsX2ZuZGVjbCAoKmxhc3Rfc3RtdCk7 CiAgIGlmIChmbiA9PSBOVUxMX1RSRUUgfHwgREVDTF9CVUlMVF9JTl9DTEFT UyAoZm4pICE9IEJVSUxUX0lOX05PUk1BTCkKICAgIHJldHVybiBOVUxMOwog CkBAIC00ODEsOCArNTcyLDggQEAgc3RhdGljIGdpbXBsZQogICAgIGNhc2Ug QlVJTFRfSU5fUE9XSToKICAgICBjYXNlIEJVSUxUX0lOX1BPV0Y6CiAgICAg Y2FzZSBCVUlMVF9JTl9QT1c6Ci0gICAgICBiYXNlID0gZ2ltcGxlX2NhbGxf YXJnIChsYXN0X3N0bXQsIDApOwotICAgICAgZXhwID0gZ2ltcGxlX2NhbGxf YXJnIChsYXN0X3N0bXQsIDEpOworICAgICAgYmFzZSA9IGdpbXBsZV9jYWxs X2FyZyAoKmxhc3Rfc3RtdCwgMCk7CisgICAgICBleHAgPSBnaW1wbGVfY2Fs bF9hcmcgKCpsYXN0X3N0bXQsIDEpOwogICAgICAgaWYgKFRSRUVfQ09ERSAo ZXhwKSAhPSBSRUFMX0NTVAogCSAgJiYgVFJFRV9DT0RFIChleHApICE9IElO VEVHRVJfQ1NUKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTU3NCwyMSAr NjY1LDIxIEBAIHN0YXRpYyBnaW1wbGUKIAkgaW5uZXItbG9vcCBuZXN0ZWQg aW4gYW4gb3V0ZXItbG9vcCB0aGF0IHVzIGJlaW5nIHZlY3Rvcml6ZWQpLiAg Ki8KIAogc3RhdGljIGdpbXBsZQotdmVjdF9yZWNvZ193aWRlbl9zdW1fcGF0 dGVybiAoZ2ltcGxlIGxhc3Rfc3RtdCwgdHJlZSAqdHlwZV9pbiwgdHJlZSAq dHlwZV9vdXQpCit2ZWN0X3JlY29nX3dpZGVuX3N1bV9wYXR0ZXJuIChnaW1w bGUgKmxhc3Rfc3RtdCwgdHJlZSAqdHlwZV9pbiwgdHJlZSAqdHlwZV9vdXQp CiB7CiAgIGdpbXBsZSBzdG10OwogICB0cmVlIG9wcm5kMCwgb3BybmQxOwot ICBzdG10X3ZlY19pbmZvIHN0bXRfdmluZm8gPSB2aW5mb19mb3Jfc3RtdCAo bGFzdF9zdG10KTsKKyAgc3RtdF92ZWNfaW5mbyBzdG10X3ZpbmZvID0gdmlu Zm9fZm9yX3N0bXQgKCpsYXN0X3N0bXQpOwogICB0cmVlIHR5cGUsIGhhbGZf dHlwZTsKICAgZ2ltcGxlIHBhdHRlcm5fc3RtdDsKICAgbG9vcF92ZWNfaW5m byBsb29wX2luZm8gPSBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfdmlu Zm8pOwogICBzdHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAo bG9vcF9pbmZvKTsKICAgdHJlZSB2YXI7CiAKLSAgaWYgKCFpc19naW1wbGVf YXNzaWduIChsYXN0X3N0bXQpKQorICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24g KCpsYXN0X3N0bXQpKQogICAgIHJldHVybiBOVUxMOwogCi0gIHR5cGUgPSBn aW1wbGVfZXhwcl90eXBlIChsYXN0X3N0bXQpOworICB0eXBlID0gZ2ltcGxl X2V4cHJfdHlwZSAoKmxhc3Rfc3RtdCk7CiAKICAgLyogTG9vayBmb3IgdGhl IGZvbGxvd2luZyBwYXR0ZXJuCiAgICAgICAgICAgRFggPSAoVFlQRSkgWDsK QEAgLTYwMCwyNSArNjkxLDI1IEBAIHN0YXRpYyBnaW1wbGUKICAgLyogU3Rh cnRpbmcgZnJvbSBMQVNUX1NUTVQsIGZvbGxvdyB0aGUgZGVmcyBvZiBpdHMg dXNlcyBpbiBzZWFyY2gKICAgICAgb2YgdGhlIGFib3ZlIHBhdHRlcm4uICAq LwogCi0gIGlmIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChsYXN0X3N0bXQp ICE9IFBMVVNfRVhQUikKKyAgaWYgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUg KCpsYXN0X3N0bXQpICE9IFBMVVNfRVhQUikKICAgICByZXR1cm4gTlVMTDsK IAogICBpZiAoU1RNVF9WSU5GT19ERUZfVFlQRSAoc3RtdF92aW5mbykgIT0g dmVjdF9yZWR1Y3Rpb25fZGVmKQogICAgIHJldHVybiBOVUxMOwogCi0gIG9w cm5kMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAobGFzdF9zdG10KTsKLSAgb3By bmQxID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChsYXN0X3N0bXQpOworICBvcHJu ZDAgPSBnaW1wbGVfYXNzaWduX3JoczEgKCpsYXN0X3N0bXQpOworICBvcHJu ZDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKCpsYXN0X3N0bXQpOwogICBpZiAo IXR5cGVzX2NvbXBhdGlibGVfcCAoVFJFRV9UWVBFIChvcHJuZDApLCB0eXBl KQogICAgICAgfHwgIXR5cGVzX2NvbXBhdGlibGVfcCAoVFJFRV9UWVBFIChv cHJuZDEpLCB0eXBlKSkKICAgICByZXR1cm4gTlVMTDsKIAotICAvKiBTbyBm YXIgc28gZ29vZC4gU2luY2UgbGFzdF9zdG10IHdhcyBkZXRlY3RlZCBhcyBh IChzdW1tYXRpb24pIHJlZHVjdGlvbiwKKyAgLyogU28gZmFyIHNvIGdvb2Qu ICBTaW5jZSAqbGFzdF9zdG10IHdhcyBkZXRlY3RlZCBhcyBhIChzdW1tYXRp b24pIHJlZHVjdGlvbiwKICAgICAgd2Uga25vdyB0aGF0IG9wcm5kMSBpcyB0 aGUgcmVkdWN0aW9uIHZhcmlhYmxlIChkZWZpbmVkIGJ5IGEgbG9vcC1oZWFk ZXIKICAgICAgcGhpKSwgYW5kIG9wcm5kMCBpcyBhbiBzc2EtbmFtZSBkZWZp bmVkIGJ5IGEgc3RtdCBpbiB0aGUgbG9vcCBib2R5LgogICAgICBMZWZ0IHRv IGNoZWNrIHRoYXQgb3BybmQwIGlzIGRlZmluZWQgYnkgYSBjYXN0IGZyb20g dHlwZSAndHlwZScgdG8gdHlwZQogICAgICAnVFlQRScuICAqLwogCi0gIGlm ICghd2lkZW5lZF9uYW1lX3AgKG9wcm5kMCwgbGFzdF9zdG10LCAmaGFsZl90 eXBlLCAmc3RtdCkpCisgIGlmICghd2lkZW5lZF9uYW1lX3AgKG9wcm5kMCwg Kmxhc3Rfc3RtdCwgJmhhbGZfdHlwZSwgJnN0bXQsIHRydWUpKQogICAgIHJl dHVybiBOVUxMOwogCiAgIG9wcm5kMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAo c3RtdCk7CkBAIC02MzksNyArNzMwLDcgQEAgc3RhdGljIGdpbXBsZQogCiAg IC8qIFdlIGRvbid0IGFsbG93IGNoYW5naW5nIHRoZSBvcmRlciBvZiB0aGUg Y29tcHV0YXRpb24gaW4gdGhlIGlubmVyLWxvb3AKICAgICAgd2hlbiBkb2lu ZyBvdXRlci1sb29wIHZlY3Rvcml6YXRpb24uICAqLwotICBnY2NfYXNzZXJ0 ICghbmVzdGVkX2luX3ZlY3RfbG9vcF9wIChsb29wLCBsYXN0X3N0bXQpKTsK KyAgZ2NjX2Fzc2VydCAoIW5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwg Kmxhc3Rfc3RtdCkpOwogCiAgIHJldHVybiBwYXR0ZXJuX3N0bXQ7CiB9CkBA IC02NjksMjMgKzc2MCwyNyBAQCBzdGF0aWMgZ2ltcGxlCiAKIHN0YXRpYyB2 b2lkCiB2ZWN0X3BhdHRlcm5fcmVjb2dfMSAoCi0JZ2ltcGxlICgqIHZlY3Rf cmVjb2dfZnVuYykgKGdpbXBsZSwgdHJlZSAqLCB0cmVlICopLAorCWdpbXBs ZSAoKiB2ZWN0X3JlY29nX2Z1bmMpIChnaW1wbGUgKiwgdHJlZSAqLCB0cmVl ICopLAogCWdpbXBsZV9zdG10X2l0ZXJhdG9yIHNpKQogewogICBnaW1wbGUg c3RtdCA9IGdzaV9zdG10IChzaSksIHBhdHRlcm5fc3RtdDsKLSAgc3RtdF92 ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7Cisg IHN0bXRfdmVjX2luZm8gc3RtdF9pbmZvOwogICBzdG10X3ZlY19pbmZvIHBh dHRlcm5fc3RtdF9pbmZvOwotICBsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8g PSBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbyk7CisgIGxvb3Bf dmVjX2luZm8gbG9vcF92aW5mbzsKICAgdHJlZSBwYXR0ZXJuX3ZlY3R5cGU7 CiAgIHRyZWUgdHlwZV9pbiwgdHlwZV9vdXQ7CiAgIGVudW0gdHJlZV9jb2Rl IGNvZGU7CiAgIGludCBpOwogICBnaW1wbGUgbmV4dDsKIAotICBwYXR0ZXJu X3N0bXQgPSAoKiB2ZWN0X3JlY29nX2Z1bmMpIChzdG10LCAmdHlwZV9pbiwg JnR5cGVfb3V0KTsKKyAgcGF0dGVybl9zdG10ID0gKCogdmVjdF9yZWNvZ19m dW5jKSAoJnN0bXQsICZ0eXBlX2luLCAmdHlwZV9vdXQpOwogICBpZiAoIXBh dHRlcm5fc3RtdCkKICAgICByZXR1cm47CiAKKyAgc2kgPSBnc2lfZm9yX3N0 bXQgKHN0bXQpOworICBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3Rt dCk7CisgIGxvb3BfdmluZm8gPSBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0 bXRfaW5mbyk7CisgCiAgIGlmIChWRUNUT1JfTU9ERV9QIChUWVBFX01PREUg KHR5cGVfaW4pKSkKICAgICB7CiAgICAgICAvKiBObyBuZWVkIHRvIGNoZWNr IHRhcmdldCBzdXBwb3J0IChhbHJlYWR5IGNoZWNrZWQgYnkgdGhlIHBhdHRl cm4KQEAgLTgzMiw3ICs5MjcsNyBAQCB2ZWN0X3BhdHRlcm5fcmVjb2cgKGxv b3BfdmVjX2luZm8gbG9vcF92aW5mbykKICAgdW5zaWduZWQgaW50IG5iYnMg PSBsb29wLT5udW1fbm9kZXM7CiAgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIHNp OwogICB1bnNpZ25lZCBpbnQgaSwgajsKLSAgZ2ltcGxlICgqIHZlY3RfcmVj b2dfZnVuY19wdHIpIChnaW1wbGUsIHRyZWUgKiwgdHJlZSAqKTsKKyAgZ2lt cGxlICgqIHZlY3RfcmVjb2dfZnVuY19wdHIpIChnaW1wbGUgKiwgdHJlZSAq LCB0cmVlICopOwogCiAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQ T1JUX0RFVEFJTFMpKQogICAgIGZwcmludGYgKHZlY3RfZHVtcCwgIj09PSB2 ZWN0X3BhdHRlcm5fcmVjb2cgPT09Iik7CkluZGV4OiB0cmVlLXZlY3Qtc3Rt dHMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0cmVlLXZlY3Qtc3Rt dHMuYwkocmV2aXNpb24gMTc0NDc1KQorKysgdHJlZS12ZWN0LXN0bXRzLmMJ KHdvcmtpbmcgY29weSkKQEAgLTMyMzIsNiArMzIzMiwzMyBAQCB2ZWN0b3Jp emFibGVfdHlwZV9wcm9tb3Rpb24gKGdpbXBsZSBzdG10LCBnaW1wbGVfcwog CWZwcmludGYgKHZlY3RfZHVtcCwgInVzZSBub3Qgc2ltcGxlLiIpOwogICAg ICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICBvcF90eXBlID0gVFJFRV9D T0RFX0xFTkdUSCAoY29kZSk7CisgIGlmIChvcF90eXBlID09IGJpbmFyeV9v cCkKKyAgICB7CisgICAgICBib29sIG9rOworCisgICAgICBvcDEgPSBnaW1w bGVfYXNzaWduX3JoczIgKHN0bXQpOworICAgICAgaWYgKGNvZGUgPT0gV0lE RU5fTVVMVF9FWFBSKQorICAgICAgICB7CisJICAvKiBGb3IgV0lERU5fTVVM VF9FWFBSLCBpZiBPUDAgaXMgYSBjb25zdGFudCwgdXNlIHRoZSB0eXBlIG9m CisJICAgICBPUDEuICAqLworICAgICAgICAgIGlmIChDT05TVEFOVF9DTEFT U19QIChvcDApKQorICAgICAgICAgICAgb2sgPSB2ZWN0X2lzX3NpbXBsZV91 c2VfMSAob3AxLCBsb29wX3ZpbmZvLCBOVUxMLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmZGVmX3N0bXQsICZkZWYsICZkdFsxXSwgJnZlY3R5 cGVfaW4pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9rID0gdmVj dF9pc19zaW1wbGVfdXNlIChvcDEsIGxvb3BfdmluZm8sIE5VTEwsICZkZWZf c3RtdCwgJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAmZHRbMV0pOworCisgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAg ICAgIHsKKwkgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9S VF9ERVRBSUxTKSkKKwkgICAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwgInVz ZSBub3Qgc2ltcGxlLiIpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKwog ICAvKiBJZiBvcDAgaXMgYW4gZXh0ZXJuYWwgb3IgY29uc3RhbnQgZGVmIHVz ZSBhIHZlY3RvciB0eXBlIHdpdGgKICAgICAgdGhlIHNhbWUgc2l6ZSBhcyB0 aGUgb3V0cHV0IHZlY3RvciB0eXBlLiAgKi8KICAgaWYgKCF2ZWN0eXBlX2lu KQpAQCAtMzI2NCwxOCArMzI5MSw2IEBAIHZlY3Rvcml6YWJsZV90eXBlX3By b21vdGlvbiAoZ2ltcGxlIHN0bXQsIGdpbXBsZV9zCiAKICAgZ2NjX2Fzc2Vy dCAobmNvcGllcyA+PSAxKTsKIAotICBvcF90eXBlID0gVFJFRV9DT0RFX0xF TkdUSCAoY29kZSk7Ci0gIGlmIChvcF90eXBlID09IGJpbmFyeV9vcCkKLSAg ICB7Ci0gICAgICBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOwot ICAgICAgaWYgKCF2ZWN0X2lzX3NpbXBsZV91c2UgKG9wMSwgbG9vcF92aW5m bywgTlVMTCwgJmRlZl9zdG10LCAmZGVmLCAmZHRbMV0pKQotICAgICAgICB7 Ci0JICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxT KSkKLQkgICAgZnByaW50ZiAodmVjdF9kdW1wLCAidXNlIG5vdCBzaW1wbGUu Iik7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg fQotCiAgIC8qIFN1cHBvcnRhYmxlIGJ5IHRhcmdldD8gICovCiAgIGlmICgh c3VwcG9ydGFibGVfd2lkZW5pbmdfb3BlcmF0aW9uIChjb2RlLCBzdG10LCB2 ZWN0eXBlX291dCwgdmVjdHlwZV9pbiwKIAkJCQkgICAgICAgJmRlY2wxLCAm ZGVjbDIsICZjb2RlMSwgJmNvZGUyLApAQCAtMzMwMSw2ICszMzE2LDE0IEBA IHZlY3Rvcml6YWJsZV90eXBlX3Byb21vdGlvbiAoZ2ltcGxlIHN0bXQsIGdp bXBsZV9zCiAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAidHJhbnNmb3JtIHR5 cGUgcHJvbW90aW9uIG9wZXJhdGlvbi4gbmNvcGllcyA9ICVkLiIsCiAgICAg ICAgICAgICAgICAgICAgICAgICBuY29waWVzKTsKIAorICBpZiAoY29kZSA9 PSBXSURFTl9NVUxUX0VYUFIpCisgICAgeworICAgICAgaWYgKENPTlNUQU5U X0NMQVNTX1AgKG9wMCkpCisJb3AwID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZ UEUgKG9wMSksIG9wMCk7CisgICAgICBlbHNlIGlmIChDT05TVEFOVF9DTEFT U19QIChvcDEpKQorCW9wMSA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChv cDApLCBvcDEpOworICAgIH0KKwogICAvKiBIYW5kbGUgZGVmLiAgKi8KICAg LyogSW4gY2FzZSBvZiBtdWx0aS1zdGVwIHByb21vdGlvbiwgd2UgZmlyc3Qg Z2VuZXJhdGUgcHJvbW90aW9uIG9wZXJhdGlvbnMKICAgICAgdG8gdGhlIGlu dGVybWVkaWF0ZSB0eXBlcywgYW5kIHRoZW4gZnJvbSB0aGF0IHR5cGVzIHRv IHRoZSBmaW5hbCBvbmUuCg== --000e0cd1041ea30fdb04a4a311de Content-Type: text/plain; charset=US-ASCII; name="tests.txt" Content-Disposition: attachment; filename="tests.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_goe0l6vg1 Content-length: 12802 SW5kZXg6IHRlc3RzdWl0ZS9saWIvdGFyZ2V0LXN1cHBvcnRzLmV4cAo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSB0ZXN0c3VpdGUvbGliL3RhcmdldC1z dXBwb3J0cy5leHAJKHJldmlzaW9uIDE3NDQ3NSkKKysrIHRlc3RzdWl0ZS9s aWIvdGFyZ2V0LXN1cHBvcnRzLmV4cAkod29ya2luZyBjb3B5KQpAQCAtMjY2 OCw3ICsyNjY4LDggQEAgcHJvYyBjaGVja19lZmZlY3RpdmVfdGFyZ2V0X3Zl Y3Rfd2lkZW5fbXVsdF9xaV90b18KIAl9IGVsc2UgewogCSAgICBzZXQgZXRf dmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3NhdmVkIDAKIAl9Ci0gICAgICAg IGlmIHsgW2lzdGFyZ2V0IHBvd2VycGMqLSotKl0gfSB7CisgICAgICAgIGlm IHsgW2lzdGFyZ2V0IHBvd2VycGMqLSotKl0KKyAgICAgICAgICAgICAgfHwg KFtpc3RhcmdldCBhcm0qLSotKl0gJiYgW2NoZWNrX2VmZmVjdGl2ZV90YXJn ZXRfYXJtX25lb25dKSB9IHsKICAgICAgICAgICAgIHNldCBldF92ZWN0X3dp ZGVuX211bHRfcWlfdG9faGlfc2F2ZWQgMQogICAgICAgICB9CiAgICAgfQpA QCAtMjcwMSw3ICsyNzAyLDggQEAgcHJvYyBjaGVja19lZmZlY3RpdmVfdGFy Z2V0X3ZlY3Rfd2lkZW5fbXVsdF9oaV90b18KIAkgICAgICB8fCBbaXN0YXJn ZXQgc3B1LSotKl0KIAkgICAgICB8fCBbaXN0YXJnZXQgaWE2NC0qLSpdCiAJ ICAgICAgfHwgW2lzdGFyZ2V0IGk/ODYtKi0qXQotCSAgICAgIHx8IFtpc3Rh cmdldCB4ODZfNjQtKi0qXSB9IHsKKwkgICAgICB8fCBbaXN0YXJnZXQgeDg2 XzY0LSotKl0KKyAgICAgICAgICAgICAgfHwgKFtpc3RhcmdldCBhcm0qLSot Kl0gJiYgW2NoZWNrX2VmZmVjdGl2ZV90YXJnZXRfYXJtX25lb25dKSB9IHsK ICAgICAgICAgICAgIHNldCBldF92ZWN0X3dpZGVuX211bHRfaGlfdG9fc2lf c2F2ZWQgMQogICAgICAgICB9CiAgICAgfQpAQCAtMjcxMCw2ICsyNzEyLDUy IEBAIHByb2MgY2hlY2tfZWZmZWN0aXZlX3RhcmdldF92ZWN0X3dpZGVuX211 bHRfaGlfdG9fCiB9CiAKICMgUmV0dXJuIDEgaWYgdGhlIHRhcmdldCBwbHVz IGN1cnJlbnQgb3B0aW9ucyBzdXBwb3J0cyBhIHZlY3RvcgorIyB3aWRlbmlu ZyBtdWx0aXBsaWNhdGlvbiBvZiAqY2hhciogYXJncyBpbnRvICpzaG9ydCog cmVzdWx0LCAwIG90aGVyd2lzZS4KKyMKKyMgVGhpcyB3b24ndCBjaGFuZ2Ug Zm9yIGRpZmZlcmVudCBzdWJ0YXJnZXRzIHNvIGNhY2hlIHRoZSByZXN1bHQu CisKK3Byb2MgY2hlY2tfZWZmZWN0aXZlX3RhcmdldF92ZWN0X3dpZGVuX211 bHRfcWlfdG9faGlfcGF0dGVybiB7IH0geworICAgIGdsb2JhbCBldF92ZWN0 X3dpZGVuX211bHRfcWlfdG9faGlfcGF0dGVybgorCisgICAgaWYgW2luZm8g ZXhpc3RzIGV0X3ZlY3Rfd2lkZW5fbXVsdF9xaV90b19oaV9wYXR0ZXJuX3Nh dmVkXSB7CisgICAgICAgIHZlcmJvc2UgImNoZWNrX2VmZmVjdGl2ZV90YXJn ZXRfdmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm46IHVzaW5nIGNh Y2hlZCByZXN1bHQiIDIKKyAgICB9IGVsc2UgeworICAgICAgICBzZXQgZXRf dmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm5fc2F2ZWQgMAorICAg ICAgICBpZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdCisgICAgICAgICAg ICAgIHx8IChbaXN0YXJnZXQgYXJtKi0qLSpdICYmIFtjaGVja19lZmZlY3Rp dmVfdGFyZ2V0X2FybV9uZW9uXSkgfSB7CisgICAgICAgICAgICBzZXQgZXRf dmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm5fc2F2ZWQgMQorICAg ICAgICB9CisgICAgfQorICAgIHZlcmJvc2UgImNoZWNrX2VmZmVjdGl2ZV90 YXJnZXRfdmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm46IHJldHVy bmluZyAkZXRfdmVjdF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm5fc2F2 ZWQiIDIKKyAgICByZXR1cm4gJGV0X3ZlY3Rfd2lkZW5fbXVsdF9xaV90b19o aV9wYXR0ZXJuX3NhdmVkCit9CisKKyMgUmV0dXJuIDEgaWYgdGhlIHRhcmdl dCBwbHVzIGN1cnJlbnQgb3B0aW9ucyBzdXBwb3J0cyBhIHZlY3RvcgorIyB3 aWRlbmluZyBtdWx0aXBsaWNhdGlvbiBvZiAqc2hvcnQqIGFyZ3MgaW50byAq aW50KiByZXN1bHQsIDAgb3RoZXJ3aXNlLgorIworIyBUaGlzIHdvbid0IGNo YW5nZSBmb3IgZGlmZmVyZW50IHN1YnRhcmdldHMgc28gY2FjaGUgdGhlIHJl c3VsdC4KKworcHJvYyBjaGVja19lZmZlY3RpdmVfdGFyZ2V0X3ZlY3Rfd2lk ZW5fbXVsdF9oaV90b19zaV9wYXR0ZXJuIHsgfSB7CisgICAgZ2xvYmFsIGV0 X3ZlY3Rfd2lkZW5fbXVsdF9oaV90b19zaV9wYXR0ZXJuCisKKyAgICBpZiBb aW5mbyBleGlzdHMgZXRfdmVjdF93aWRlbl9tdWx0X2hpX3RvX3NpX3BhdHRl cm5fc2F2ZWRdIHsKKyAgICAgICAgdmVyYm9zZSAiY2hlY2tfZWZmZWN0aXZl X3RhcmdldF92ZWN0X3dpZGVuX211bHRfaGlfdG9fc2lfcGF0dGVybjogdXNp bmcgY2FjaGVkIHJlc3VsdCIgMgorICAgIH0gZWxzZSB7CisgICAgICAgIHNl dCBldF92ZWN0X3dpZGVuX211bHRfaGlfdG9fc2lfcGF0dGVybl9zYXZlZCAw CisgICAgICAgIGlmIHsgW2lzdGFyZ2V0IHBvd2VycGMqLSotKl0KKyAgICAg ICAgICAgICAgfHwgW2lzdGFyZ2V0IHNwdS0qLSpdCisgICAgICAgICAgICAg IHx8IFtpc3RhcmdldCBpYTY0LSotKl0KKyAgICAgICAgICAgICAgfHwgW2lz dGFyZ2V0IGk/ODYtKi0qXQorICAgICAgICAgICAgICB8fCBbaXN0YXJnZXQg eDg2XzY0LSotKl0KKyAgICAgICAgICAgICAgfHwgKFtpc3RhcmdldCBhcm0q LSotKl0gJiYgW2NoZWNrX2VmZmVjdGl2ZV90YXJnZXRfYXJtX25lb25dKSB9 IHsKKyAgICAgICAgICAgIHNldCBldF92ZWN0X3dpZGVuX211bHRfaGlfdG9f c2lfcGF0dGVybl9zYXZlZCAxCisgICAgICAgIH0KKyAgICB9CisgICAgdmVy Ym9zZSAiY2hlY2tfZWZmZWN0aXZlX3RhcmdldF92ZWN0X3dpZGVuX211bHRf aGlfdG9fc2lfcGF0dGVybjogcmV0dXJuaW5nICRldF92ZWN0X3dpZGVuX211 bHRfaGlfdG9fc2lfcGF0dGVybl9zYXZlZCIgMgorICAgIHJldHVybiAkZXRf dmVjdF93aWRlbl9tdWx0X2hpX3RvX3NpX3BhdHRlcm5fc2F2ZWQKK30KKwor IyBSZXR1cm4gMSBpZiB0aGUgdGFyZ2V0IHBsdXMgY3VycmVudCBvcHRpb25z IHN1cHBvcnRzIGEgdmVjdG9yCiAjIGRvdC1wcm9kdWN0IG9mIHNpZ25lZCBj aGFycywgMCBvdGhlcndpc2UuCiAjCiAjIFRoaXMgd29uJ3QgY2hhbmdlIGZv ciBkaWZmZXJlbnQgc3VidGFyZ2V0cyBzbyBjYWNoZSB0aGUgcmVzdWx0LgpJ bmRleDogdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVsdC11 OC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHRlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC92ZWN0LXdpZGVuLW11bHQtdTguYwkocmV2aXNpb24gMTc0NDc1 KQorKysgdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVsdC11 OC5jCSh3b3JraW5nIGNvcHkpCkBAIC05LDcgKzksNyBAQCB1bnNpZ25lZCBj aGFyIFhbTl0gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKF9fQgogdW5z aWduZWQgY2hhciBZW05dIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhf X0JJR0dFU1RfQUxJR05NRU5UX18pKSk7CiB1bnNpZ25lZCBzaG9ydCByZXN1 bHRbTl07CiAKLS8qIGNoYXItPnNob3J0IHdpZGVuaW5nLW11bHQgKi8KKy8q IHVuc2lnbmVkIGNoYXItPiB1bnNpZ25lZCBzaG9ydCB3aWRlbmluZy1tdWx0 LiAgKi8KIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpIGludAogZm9vMShp bnQgbGVuKSB7CiAgIGludCBpOwpAQCAtMjgsOCArMjgsNyBAQCBpbnQgbWFp biAodm9pZCkKICAgZm9yIChpPTA7IGk8TjsgaSsrKSB7CiAgICAgWFtpXSA9 IGk7CiAgICAgWVtpXSA9IDY0LWk7Ci0gICAgaWYgKGklNCA9PSAwKQotICAg ICAgWFtpXSA9IDU7CisgICAgX19hc21fXyB2b2xhdGlsZSAoIiIpOwogICB9 CiAKICAgZm9vMSAoTik7CkBAIC00Myw1ICs0Miw3IEBAIGludCBtYWluICh2 b2lkKQogfQogCiAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgInZlY3Rvcml6ZWQgMSBsb29wcyIgMSAidmVjdCIgeyB0YXJnZXQgeyB2 ZWN0X3dpZGVuX211bHRfcWlfdG9faGkgfHwgdmVjdF91bnBhY2sgfSB9IH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2 ZWN0X3JlY29nX3dpZGVuX211bHRfcGF0dGVybjogZGV0ZWN0ZWQiIDEgInZl Y3QiIHsgdGFyZ2V0IHZlY3Rfd2lkZW5fbXVsdF9xaV90b19oaV9wYXR0ZXJu IH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgInBhdHRlcm4gcmVjb2duaXplZCIgMSAidmVjdCIgeyB0YXJnZXQgdmVj dF93aWRlbl9tdWx0X3FpX3RvX2hpX3BhdHRlcm4gfSB9IH0gKi8KIC8qIHsg ZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCiAK SW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LXdpZGVuLW11bHQt Y29uc3QtczE2LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdGVzdHN1 aXRlL2djYy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVsdC1jb25zdC1zMTYuYwko cmV2aXNpb24gMCkKKysrIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LXdp ZGVuLW11bHQtY29uc3QtczE2LmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs NjAgQEAKKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3Rf aW50IH0gKi8KKworI2luY2x1ZGUgInRyZWUtdmVjdC5oIgorI2luY2x1ZGUg PHN0ZGxpYi5oPgorCisjZGVmaW5lIE4gMzIKKworX19hdHRyaWJ1dGVfXyAo KG5vaW5saW5lKSkgdm9pZCAKK2ZvbyAoaW50ICpfX3Jlc3RyaWN0IGEsCisg ICAgIHNob3J0ICpfX3Jlc3RyaWN0IGIsCisgICAgIGludCBuKQoreworICBp bnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIGFbaV0g PSBiW2ldICogMjMzMzsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQor ICAgIGlmIChhW2ldICE9IGJbaV0gKiAyMzMzKQorICAgICAgYWJvcnQgKCk7 Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQKK2JhciAo aW50ICpfX3Jlc3RyaWN0IGEsCisgICAgIHNob3J0ICpfX3Jlc3RyaWN0IGIs CisgICAgIGludCBuKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBp IDwgbjsgaSsrKQorICAgIGFbaV0gPSBiW2ldICogKHNob3J0KSAyMzMzOwor CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgaWYgKGFbaV0gIT0g YltpXSAqIChzaG9ydCkgMjMzMykKKyAgICAgIGFib3J0ICgpOworfQorCitp bnQgbWFpbiAodm9pZCkKK3sKKyAgaW50IGk7CisgIGludCBhW05dOworICBz aG9ydCBiW05dOworCisgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAg eworICAgICAgYVtpXSA9IDA7CisgICAgICBiW2ldID0gaTsKKyAgICAgIF9f YXNtX18gdm9sYXRpbGUgKCIiKTsKKyAgICB9CisKKyAgZm9vIChhLCBiLCBO KTsKKyAgYmFyIChhLCBiLCBOKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAidmVjdG9yaXplZCAx IGxvb3BzIiAyICJ2ZWN0IiB7IHRhcmdldCB2ZWN0X3dpZGVuX211bHRfaGlf dG9fc2kgfSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyAidmVjdF9yZWNvZ193aWRlbl9tdWx0X3BhdHRlcm46IGRldGVj dGVkIiAyICJ2ZWN0IiB7IHRhcmdldCB2ZWN0X3dpZGVuX211bHRfaGlfdG9f c2lfcGF0dGVybiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wLXRpbWVzICJwYXR0ZXJuIHJlY29nbml6ZWQiIDIgInZlY3QiIHsg dGFyZ2V0IHZlY3Rfd2lkZW5fbXVsdF9oaV90b19zaV9wYXR0ZXJuIH0gfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1bXAgInZlY3Qi IH0gfSAqLworCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC13 aWRlbi1tdWx0LWNvbnN0LXUxNi5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LXdpZGVuLW11bHQtY29u c3QtdTE2LmMJKHJldmlzaW9uIDApCisrKyB0ZXN0c3VpdGUvZ2NjLmRnL3Zl Y3QvdmVjdC13aWRlbi1tdWx0LWNvbnN0LXUxNi5jCShyZXZpc2lvbiAwKQpA QCAtMCwwICsxLDc3IEBACisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRh cmdldCB2ZWN0X2ludCB9ICovCisKKyNpbmNsdWRlICJ0cmVlLXZlY3QuaCIK KyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBOIDMyCisKK19fYXR0 cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgCitmb28gKHVuc2lnbmVkIGlu dCAqX19yZXN0cmljdCBhLAorICAgICB1bnNpZ25lZCBzaG9ydCAqX19yZXN0 cmljdCBiLAorICAgICBpbnQgbikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChp ID0gMDsgaSA8IG47IGkrKykKKyAgICBhW2ldID0gYltpXSAqIDIzMzM7CisK KyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICBpZiAoYVtpXSAhPSBi W2ldICogMjMzMykKKyAgICAgIGFib3J0ICgpOworfQorCitfX2F0dHJpYnV0 ZV9fICgobm9pbmxpbmUpKSB2b2lkCitiYXIgKHVuc2lnbmVkIGludCAqX19y ZXN0cmljdCBhLAorICAgICB1bnNpZ25lZCBzaG9ydCAqX19yZXN0cmljdCBi LAorICAgICBpbnQgbikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsg aSA8IG47IGkrKykKKyAgICBhW2ldID0gKHVuc2lnbmVkIHNob3J0KSAyMzMz ICogYltpXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIGlm IChhW2ldICE9IGJbaV0gKiAodW5zaWduZWQgc2hvcnQpIDIzMzMpCisgICAg ICBhYm9ydCAoKTsKK30KKworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkg dm9pZAorYmF6ICh1bnNpZ25lZCBpbnQgKl9fcmVzdHJpY3QgYSwKKyAgICAg dW5zaWduZWQgc2hvcnQgKl9fcmVzdHJpY3QgYiwKKyAgICAgaW50IG4pCit7 CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAg YVtpXSA9IGJbaV0gKiAyMzMzMzMzMzM7CisKKyAgZm9yIChpID0gMDsgaSA8 IG47IGkrKykKKyAgICBpZiAoYVtpXSAhPSBiW2ldICogMjMzMzMzMzMzKQor ICAgICAgYWJvcnQgKCk7Cit9CisKKworaW50IG1haW4gKHZvaWQpCit7Cisg IGludCBpOworICB1bnNpZ25lZCBpbnQgYVtOXTsKKyAgdW5zaWduZWQgc2hv cnQgYltOXTsKKworICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsK KyAgICAgIGFbaV0gPSAwOworICAgICAgYltpXSA9IGk7CisgICAgICBfX2Fz bV9fIHZvbGF0aWxlICgiIik7CisgICAgfQorCisgIGZvbyAoYSwgYiwgTik7 CisgIGJhciAoYSwgYiwgTik7CisgIGJheiAoYSwgYiwgTik7CisgIHJldHVy biAwOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgInZlY3Rvcml6ZWQgMSBsb29wcyIgMyAidmVjdCIgeyB0YXJnZXQgdmVj dF93aWRlbl9tdWx0X2hpX3RvX3NpIH0gfSB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInZlY3RfcmVjb2dfd2lkZW5fbXVs dF9wYXR0ZXJuOiBkZXRlY3RlZCIgMiAidmVjdCIgeyB0YXJnZXQgdmVjdF93 aWRlbl9tdWx0X2hpX3RvX3NpX3BhdHRlcm4gfSB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAicGF0dGVybiByZWNvZ25p emVkIiAyICJ2ZWN0IiB7IHRhcmdldCB2ZWN0X3dpZGVuX211bHRfaGlfdG9f c2lfcGF0dGVybiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IGNsZWFudXAt dHJlZS1kdW1wICJ2ZWN0IiB9IH0gKi8KKwpJbmRleDogdGVzdHN1aXRlL2dj Yy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVsdC11MTYuYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC13aWRl bi1tdWx0LXUxNi5jCShyZXZpc2lvbiAxNzQ0NzUpCisrKyB0ZXN0c3VpdGUv Z2NjLmRnL3ZlY3QvdmVjdC13aWRlbi1tdWx0LXUxNi5jCSh3b3JraW5nIGNv cHkpCkBAIC05LDEzICs5LDExIEBAIHVuc2lnbmVkIHNob3J0IFhbTl0gX19h dHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKF9fCiB1bnNpZ25lZCBzaG9ydCBZ W05dIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhfX0JJR0dFU1RfQUxJ R05NRU5UX18pKSk7CiB1bnNpZ25lZCBpbnQgcmVzdWx0W05dOwogCi0vKiBz aG9ydC0+aW50IHdpZGVuaW5nLW11bHQgKi8KKy8qIHVuc2lnbmVkIHNob3J0 LT51bnNpZ25lZCBpbnQgd2lkZW5pbmctbXVsdC4gICovCiBfX2F0dHJpYnV0 ZV9fICgobm9pbmxpbmUpKSBpbnQKIGZvbzEoaW50IGxlbikgewogICBpbnQg aTsKIAotICAvKiBOb3QgdmVjdG9yaXplZCBiZWNhdXNlIFhbaV0gYW5kIFlb aV0gYXJlIGNhc3RlZCB0byAnaW50JwotICAgICBzbyB0aGUgd2lkZW5pbmcg bXVsdGlwbGljYXRpb24gcGF0dGVybiBpcyBub3QgcmVjb2duaXplZC4gICov CiAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CiAgICAgcmVzdWx0W2ldID0g KHVuc2lnbmVkIGludCkoWFtpXSAqIFlbaV0pOwogICB9CkBAIC00Myw4ICs0 MSw4IEBAIGludCBtYWluICh2b2lkKQogICByZXR1cm4gMDsKIH0KIAotLypU aGUgaW5kdWN0aW9uIGxvb3AgaXMgdmVjdG9yaXplZCAgKi8KLS8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAidmVjdG9yaXplZCAxIGxv b3BzIiAyICJ2ZWN0IiB7IHhmYWlsICotKi0qIH0gfSB9ICovCi0vKiB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInZlY3Rvcml6ZWQgMSBs b29wcyIgMSAidmVjdCIgeyB0YXJnZXQgdmVjdF9wYWNrX3RydW5jIH0gfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInZl Y3Rvcml6ZWQgMSBsb29wcyIgMSAidmVjdCIgeyB0YXJnZXQgeyB2ZWN0X3dp ZGVuX211bHRfaGlfdG9fc2kgfHwgdmVjdF91bnBhY2sgfSB9IH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2ZWN0X3Jl Y29nX3dpZGVuX211bHRfcGF0dGVybjogZGV0ZWN0ZWQiIDEgInZlY3QiIHsg dGFyZ2V0IHZlY3Rfd2lkZW5fbXVsdF9oaV90b19zaV9wYXR0ZXJuIH0gfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInBh dHRlcm4gcmVjb2duaXplZCIgMSAidmVjdCIgeyB0YXJnZXQgdmVjdF93aWRl bl9tdWx0X2hpX3RvX3NpX3BhdHRlcm4gfSB9IH0gKi8KIC8qIHsgZGctZmlu YWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCiAK --000e0cd1041ea30fdb04a4a311de--