From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Keith David Bershatsky Newsgroups: gmane.emacs.devel Subject: Re: Problems with move_it_in_display_line_to X when tabs exist. Date: Sun, 21 Jan 2018 12:32:34 -0800 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart_Sun_Jan_21_12:32:34_2018-1" X-Trace: blaine.gmane.org 1516566669 5726 195.159.176.226 (21 Jan 2018 20:31:09 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 21 Jan 2018 20:31:09 +0000 (UTC) Cc: emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Jan 21 21:31:05 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1edMGa-0000y3-62 for ged-emacs-devel@m.gmane.org; Sun, 21 Jan 2018 21:31:00 +0100 Original-Received: from localhost ([::1]:48108 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1edMIa-0006cs-Ga for ged-emacs-devel@m.gmane.org; Sun, 21 Jan 2018 15:33:04 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:60473) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1edMIN-0006aU-UP for emacs-devel@gnu.org; Sun, 21 Jan 2018 15:32:53 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1edMIK-0006II-PD for emacs-devel@gnu.org; Sun, 21 Jan 2018 15:32:51 -0500 Original-Received: from gateway34.websitewelcome.com ([192.185.149.13]:44901) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1edMIK-0005ul-Ec for emacs-devel@gnu.org; Sun, 21 Jan 2018 15:32:48 -0500 Original-Received: from cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway34.websitewelcome.com (Postfix) with ESMTP id 35E949ABD44 for ; Sun, 21 Jan 2018 14:32:36 -0600 (CST) Original-Received: from gator3053.hostgator.com ([50.87.144.69]) by cmsmtp with SMTP id dMI7e0rfUuMnydMI7ekJHZ; Sun, 21 Jan 2018 14:32:36 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lawlist.com ; s=default; h=Content-Type:MIME-Version:Subject:Cc:To:From:Message-ID:Date: Sender:Reply-To:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=GGxpwtprFzSWVodoiB2CeCtx0bLwqJscmDhpmBRwdrE=; b=Q7dYpehGjw1TXqGH+lbi9MRbgZ d8BRkCynxqjp7vIo47h/+4lYdUYNDF9FgpYM/+nJHZGct/0IPXd+8Hw2U/hmZlGZyEhXGVazmOAD5 pwfirHAlvhVYXjZbS5fNH8stUpot3n8rYzfr3Ba4W3bSRZDgyx4zUrl8QgdpPnw7esw3cPmm9NsGL 66GhLPGG8u1sCLn3A/JarmM4H9SLalbuRjMIpp4qqL6J5Pyp5/J2Ftna+oBY5eJc24SPdHwU3bUk2 U1+IzVFpckbHNwMv27WQcu5q5GIH5EVppGEcGvsYjImOoazhucqoi/WTce/nM6z0FYQ6Qs2nS7N1L mnfpW+fA==; Original-Received: from cpe-45-48-239-195.socal.res.rr.com ([45.48.239.195]:51471 helo=server.private) by gator3053.hostgator.com with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.89_1) (envelope-from ) id 1edMI7-002ecX-4s; Sun, 21 Jan 2018 14:32:35 -0600 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator3053.hostgator.com X-AntiAbuse: Original Domain - gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lawlist.com X-BWhitelist: no X-Source-IP: 45.48.239.195 X-Source-L: No X-Exim-ID: 1edMI7-002ecX-4s X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: cpe-45-48-239-195.socal.res.rr.com (server.private) [45.48.239.195]:51471 X-Source-Auth: lawlist X-Email-Count: 1 X-Source-Cap: bGF3bGlzdDtsYXdsaXN0O2dhdG9yMzA1My5ob3N0Z2F0b3IuY29t X-Local-Domain: yes X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 192.185.149.13 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:222129 Archived-At: --Multipart_Sun_Jan_21_12:32:34_2018-1 Content-Type: text/plain; charset=US-ASCII I was able to obtain the correct width of the tab STRETCH (in this example) by adding the following snippet to x_produce_glyphs. However, it.current_x is wrong for the glyphs that _follow_ the tab STRETCH -- the difference is an extra font->space_width. It is impossible for IT to land on the first character following the tab STRETCH using move_it_in_display_line_to -- i.e., IT stops one (1) character to the right of where it should be. I have revised the function debug-tab-pixel-width to include the output of dump_glyph_row so that we can see the values for it->pixel_width are wrong as to the tab STRETCH width. [We force a redisplay _before_ calling dump_glyph_row so that the values reflect what we actually see on the screen.] There are seven (7) new screen-shots that include the STDERR output to the terminal as we increase the value of w->hscroll by a factor of 1 in each subsequent image; i.e., as we call (scroll-left 1) again and again. Attached is a revised patch.diff to run similar tests as we did before, but now using the new method of calculating the tab STRETCH width. Any ideas regarding how to fix the erroneous it.current_x as to glyphs that _follow_ the tab STRETCH would be greatly appreciated. [Other IT values may be incorrect as well, but I've only noticed problems with the pixel_width and current_x.] Also, there may be a better way to properly calculate the correct value of the tab STRETCH in this example? I used a new pointer of it->my_pixel_width so as not to break anything in the process while working on this issue. dispextern.h (new snippet added): int my_pixel_width; xdisp.c (new snippet added): if (it->char_to_display == '\t' && !NILP (Vdisplay_line_numbers) && it->w->hscroll > 0 && it->current_x < it->lnum_pixel_width) { int my_tab_width = it->tab_width * font->space_width; int my_x = it->current_x + it->continuation_lines_width; int my_next_tab_x = ((1 + my_x + my_tab_width - 1) / my_tab_width) * my_tab_width; if (my_next_tab_x - my_x < font->space_width) my_next_tab_x += my_tab_width; if (!NILP (Vdisplay_line_numbers)) my_next_tab_x += it->lnum_pixel_width - ((it->w->hscroll * font->space_width) % my_tab_width); /* FIXME: Should we use font->space_width instead of it->current_x? */ it->my_pixel_width = my_next_tab_x - it->lnum_pixel_width - it->current_x; } else it->my_pixel_width = 0; GOAL: The goal is to interactively call (scroll-left 1) -- one or more times in a row -- and obtain the beginning _visible_ X and HPOS of the tab STRETCH; and, also obtain its _visible_ pixel-width. 00. Opening screen-shot -- just setting up the test buffer. https://www.lawlist.com/images/debug_tab_width_00.png 01. Place the cursor at the end of the line containing " @" and press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_01.png OBSERVATIONS (w->hscroll == 1): There is a hiccup on loops 3 and 4 (see screen-shot) -- perhaps this is due to the wrong value of it.pixel_width when calling: move_it_in_display_line_to (&it, ZV, it.current_x + it.pixel_width, MOVE_TO_POS | MOVE_TO_X); The expected result is that the tab STRETCH will have an it.pixel_width of 42. The third (3rd) iteration/loop has the wrong value; i.e., 49. The fourth (4th) iteration/loop has the correct value (i.e., 42) -- this is the _only_ occasion where we see the correct value of it.pixel_width (in this example). When w->hscroll > 1, it.pixel_width is _never_ correct as to the tab STRETCH (in this example). 02. With the cursor at the end of the line containing " @", press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_02.png OBSERVATIONS (w->hscroll == 2): The expected result is that the tab STRETCH will have an it.pixel_width of 35; however, it has a value of 49 instead. 03. With the cursor at the end of the line containing " @", press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_03.png OBSERVATIONS (w->hscroll == 3): The expected result is that the tab STRETCH will have an it.pixel_width of 28; however, it has a value of 49 instead. 04. With the cursor at the end of the line containing " @", press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_04.png OBSERVATIONS (w->hscroll == 4): The expected result is that the tab STRETCH will have an it.pixel_width of 21; however, it has a value of 49 instead. 05. With the cursor at the end of the line containing " @", press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_05.png OBSERVATIONS (w->hscroll == 5): The expected result is that the tab STRETCH will have an it.pixel_width of 14; however, it has a value of 49 instead. 06. With the cursor at the end of the line containing " @", press the f5 key one time. https://www.lawlist.com/images/debug_tab_width_06.png OBSERVATIONS (w->hscroll == 6): The expected result is that the tab STRETCH will have an it.pixel_width of 7; however, it has a value of 49 instead. LISP CODE (buffer-local): (setq display-line-numbers t) (setq buffer-display-table (make-display-table)) (aset buffer-display-table ?\t (vector (make-glyph-code ?\u00BB 'font-lock-warning-face) (make-glyph-code ?\t 'highlight))) (setq tab-width 8) (global-set-key [f5] (lambda () (interactive) (debug-tab-pixel-width))) TEST TEXT (a tab, followed by the "@" symbol) -- the text begins on line 13: @ C CODE: Apply the attached patch.diff to Emacs 26 as of 01/21/2018 bearing last commit c965e5a641d9478d23a233b48977503506b1b603. --Multipart_Sun_Jan_21_12:32:34_2018-1 Content-Type: application/diff; type=patch Content-Disposition: attachment; filename="patch.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9kaXNwZXh0ZXJuLmggYi9zcmMvZGlzcGV4dGVybi5oCmluZGV4IDI1 YmQ2YjIuLjQ4ZTI2MDYgMTAwNjQ0Ci0tLSBhL3NyYy9kaXNwZXh0ZXJuLmgKKysrIGIvc3JjL2Rp c3BleHRlcm4uaApAQCAtMjU4Nyw2ICsyNTg3LDE2IEBAIHN0cnVjdCBpdAogICAgICBwcm9kdWNl X2dseXBocy4gICovCiAgIGludCBwaXhlbF93aWR0aDsKIAorCisvKiAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogKi8KKy8qIERlYnVnIHRoZSBwaXhlbC13aWR0aCBvZiBhIHN0cmV0Y2ggdGFiLiAqLworCisg IC8qIFdpZHRoIG9mIHRoZSBkaXNwbGF5IGVsZW1lbnQgaW4gcGl4ZWxzLiAgUmVzdWx0IG9mIHBy b2R1Y2VfZ2x5cGhzLiAgKi8KKyAgaW50IG15X3BpeGVsX3dpZHRoOworCisvKiAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiogKi8KKworCiAgIC8qIEN1cnJlbnQsIG1heGltdW0gbG9naWNhbCwgYW5kIG1heGlt dW0gcGh5c2ljYWwgbGluZSBoZWlnaHQKICAgICAgaW5mb3JtYXRpb24uICBSZXN1bHQgb2YgcHJv ZHVjZV9nbHlwaHMuICAqLwogICBpbnQgYXNjZW50LCBkZXNjZW50LCBtYXhfYXNjZW50LCBtYXhf ZGVzY2VudDsKZGlmZiAtLWdpdCBhL3NyYy94ZGlzcC5jIGIvc3JjL3hkaXNwLmMKaW5kZXggOTAz ODE1Yy4uNzI1NjA2MyAxMDA2NDQKLS0tIGEvc3JjL3hkaXNwLmMKKysrIGIvc3JjL3hkaXNwLmMK QEAgLTI4Mjk1LDYgKzI4Mjk1LDM0IEBAIHhfcHJvZHVjZV9nbHlwaHMgKHN0cnVjdCBpdCAqaXQp CiAJICAgIH0KIAl9CiAKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBEZWJ1ZyB0aGUg cGl4ZWwtd2lkdGggb2YgYSBzdHJldGNoIHRhYi4gKi8KKworICBpZiAoaXQtPmNoYXJfdG9fZGlz cGxheSA9PSAnXHQnCisgICAgICAmJiAhTklMUCAoVmRpc3BsYXlfbGluZV9udW1iZXJzKQorICAg ICAgJiYgaXQtPnctPmhzY3JvbGwgPiAwCisgICAgICAmJiBpdC0+Y3VycmVudF94IDwgaXQtPmxu dW1fcGl4ZWxfd2lkdGgpCisgICAgeworICAgICAgaW50IG15X3RhYl93aWR0aCA9IGl0LT50YWJf d2lkdGggKiBmb250LT5zcGFjZV93aWR0aDsKKyAgICAgIGludCBteV94ID0gaXQtPmN1cnJlbnRf eCArIGl0LT5jb250aW51YXRpb25fbGluZXNfd2lkdGg7CisgICAgICBpbnQgbXlfbmV4dF90YWJf eCA9ICgoMSArIG15X3ggKyBteV90YWJfd2lkdGggLSAxKSAvIG15X3RhYl93aWR0aCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgKiBteV90YWJfd2lkdGg7CisgICAgICBpZiAobXlfbmV4dF90 YWJfeCAtIG15X3ggPCBmb250LT5zcGFjZV93aWR0aCkKKyAgICAgICAgbXlfbmV4dF90YWJfeCAr PSBteV90YWJfd2lkdGg7CisgICAgICBpZiAoIU5JTFAgKFZkaXNwbGF5X2xpbmVfbnVtYmVycykp CisgICAgICAgIG15X25leHRfdGFiX3ggKz0gaXQtPmxudW1fcGl4ZWxfd2lkdGgKKyAgICAgICAg ICAgICAgICAgICAgICAgICAtICgoaXQtPnctPmhzY3JvbGwgKiBmb250LT5zcGFjZV93aWR0aCkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG15X3RhYl93aWR0aCk7CisgICAgICAvKiBG SVhNRTogIFNob3VsZCB3ZSB1c2UgZm9udC0+c3BhY2Vfd2lkdGggaW5zdGVhZCBvZiBpdC0+Y3Vy cmVudF94PyAqLworICAgICAgaXQtPm15X3BpeGVsX3dpZHRoID0gbXlfbmV4dF90YWJfeCAtIGl0 LT5sbnVtX3BpeGVsX3dpZHRoIC0gaXQtPmN1cnJlbnRfeDsKKyAgICB9CisgICAgZWxzZQorICAg ICAgaXQtPm15X3BpeGVsX3dpZHRoID0gMDsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisK KwogICAgICAgaWYgKEZPTlRfVE9PX0hJR0ggKGZvbnQpKQogCXsKIAkgIGludCBmb250X2FzY2Vu dCwgZm9udF9kZXNjZW50OwpAQCAtMzIyNTEsOSArMzIyNzksMTc2IEBAIHhfaW50ZXJzZWN0X3Jl Y3RhbmdsZXMgKFhSZWN0YW5nbGUgKnIxLCBYUmVjdGFuZ2xlICpyMiwgWFJlY3RhbmdsZSAqcmVz dWx0KQogCQkJICAgIEluaXRpYWxpemF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKworLyogKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqICovCisvKiBEZWJ1ZyB0aGUgcGl4ZWwtd2lkdGggb2YgYSBzdHJldGNo IHRhYi4gKi8KKworREVGVU4gKCJkZWJ1Zy10YWItcGl4ZWwtd2lkdGgiLCBGZGVidWdfdGFiX3Bp eGVsX3dpZHRoLCBTZGVidWdfdGFiX3BpeGVsX3dpZHRoLCAwLCAwLCAwLAorICAgICAgIGRvYzog LyogRGVidWcgdGhlIHBpeGVsLXdpZHRoIG9mIGEgc3RyZXRjaCB0YWIuICovKQorICAodm9pZCkK K3sKKyAgRnNjcm9sbF9sZWZ0IChtYWtlX251bWJlciAoMSksIFFuaWwpOworICBzdHJ1Y3Qgd2lu ZG93ICp3ID0gZGVjb2RlX2xpdmVfd2luZG93IChzZWxlY3RlZF93aW5kb3cpOworICBzdHJ1Y3Qg ZnJhbWUgKmYgPSBYRlJBTUUgKHctPmZyYW1lKTsKKyAgTGlzcF9PYmplY3QgYnVmID0gdy0+Y29u dGVudHM7CisgIENIRUNLX0JVRkZFUiAoYnVmKTsKKyAgc3RydWN0IGJ1ZmZlciAqYiA9IFhCVUZG RVIgKGJ1Zik7CisgIHN0cnVjdCBpdCBpdDsKKyAgdm9pZCAqaXRkYXRhID0gYmlkaV9zaGVsdmVf Y2FjaGUgKCk7CisgIHN0cnVjdCBpdCBzYXZlZF9pdF9mb3Jfd2luZG93X3N0YXJ0OworICB2b2lk ICpzYXZlZF9pdGRhdGFfZm9yX3dpbmRvd19zdGFydCA9IE5VTEw7CisgIGVudW0gbW92ZV9pdF9y ZXN1bHQgcmMgPSBNT1ZFX1hfUkVBQ0hFRDsKKyAgc3RydWN0IHRleHRfcG9zIHN0YXJ0X3RleHRf cG9zaXRpb247CisgIHB0cmRpZmZfdCBpdF9zdGFydDsKKyAgaW50IGZpcnN0X3gsIGxhc3RfeDsK KyAgaW50IGxudW1fd2lkdGggPSAwOworICBpbnQgbG51bV9waXhlbF93aWR0aCA9IDA7CisgIGlu dCBmcmFtZV9jaGFyX3dpZHRoID0gRlJBTUVfQ09MVU1OX1dJRFRIIChmKTsKKyAgYm9vbCBoc2Ns ID0gKCF3LT5zdXNwZW5kX2F1dG9faHNjcm9sbAorICAgICAgICAgICAgICAgJiYgRVEgKEZidWZm ZXJfbG9jYWxfdmFsdWUgKFFhdXRvX2hzY3JvbGxfbW9kZSwgYnVmKSwgUWN1cnJlbnRfbGluZSkK KyAgICAgICAgICAgICAgICYmIHctPmhzY3JvbGwgPiAwKTsKKyAgaW50IHdfaHNjcm9sbCA9IHct PmhzY3JvbGw7CisgIGludCBoc2NsX2ZpcnN0X2hwb3MgPSB3aW5kb3dfaHNjcm9sbF9saW1pdGVk ICh3LCBmKTsKKyAgaW50IGhzY2xfZmlyc3RfeCA9IGhzY2xfZmlyc3RfaHBvcyAqIGZyYW1lX2No YXJfd2lkdGg7CisgIGludCB0ZXh0X2FyZWFfd2lkdGggPSB3aW5kb3dfYm94X3dpZHRoICh3LCBU RVhUX0FSRUEpOworICBpbnQgaGVhZGVyX2xpbmVfaGVpZ2h0ID0gV0lORE9XX0hFQURFUl9MSU5F X0hFSUdIVCAodyk7CisgIGludCByZWxhdGl2ZV94LCBocG9zLCB2cG9zOworICBpbnQgb3BvaW50 X3ggPSB3LT5vdXRwdXRfY3Vyc29yLng7CisgIGludCBvcG9pbnRfeSA9IHctPm91dHB1dF9jdXJz b3IueTsKKyAgaW50IG9wb2ludF9ocG9zID0gdy0+b3V0cHV0X2N1cnNvci5ocG9zOworICBpbnQg b3BvaW50X3Zwb3MgPSB3LT5vdXRwdXRfY3Vyc29yLnZwb3M7CisgIGludCBjb3VudCA9IDE7Cisg IGludCBteV9waXhlbF93aWR0aCA9IDA7CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAg ICAgICAgICAgICAgICAgICBTVEFSVCBESVNQTEFZIEFORCBQUklNRSBJVAorKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqICovCisgIC8qIEJlZ2luIHRoZSBqb3VybmV5IGF0IHctPnN0YXJ0LiAqLworICBT RVRfVEVYVF9QT1NfRlJPTV9NQVJLRVIgKHN0YXJ0X3RleHRfcG9zaXRpb24sIHctPnN0YXJ0KTsK KyAgc3RhcnRfZGlzcGxheSAoJml0LCB3LCBzdGFydF90ZXh0X3Bvc2l0aW9uKTsKKyAgZmlyc3Rf eCA9IGl0LmZpcnN0X3Zpc2libGVfeDsKKyAgbGFzdF94ID0gaXQubGFzdF92aXNpYmxlX3g7Cisg IGl0X3N0YXJ0ID0gSVRfQ0hBUlBPUyAoaXQpOworICBTQVZFX0lUIChzYXZlZF9pdF9mb3Jfd2lu ZG93X3N0YXJ0LCBpdCwgc2F2ZWRfaXRkYXRhX2Zvcl93aW5kb3dfc3RhcnQpOworICAvKiBGaW5p c2ggcHJpbWluZyB0aGUgSVQgZm9yIHBvdGVudGlhbCBsaW5lIG51bWJlcnMuICovCisgIGlmICgh TklMUCAoVmRpc3BsYXlfbGluZV9udW1iZXJzKQorICAgICAgJiYgIUVRIChWZGlzcGxheV9saW5l X251bWJlcnMsIFF2aXN1YWwpKQorICAgIHsKKyAgICAgIGl0LmZpcnN0X3Zpc2libGVfeCA9IDA7 CisgICAgICBtb3ZlX2l0X2J5X2xpbmVzICgmaXQsIDEpOworICAgICAgbG51bV93aWR0aCA9IGl0 LmxudW1fd2lkdGg7CisgICAgICBsbnVtX3BpeGVsX3dpZHRoID0gaXQubG51bV9waXhlbF93aWR0 aDsKKyAgICAgIFJFU1RPUkVfSVQgKCZpdCwgJnNhdmVkX2l0X2Zvcl93aW5kb3dfc3RhcnQsIHNh dmVkX2l0ZGF0YV9mb3Jfd2luZG93X3N0YXJ0KTsKKyAgICAgIGl0LmZpcnN0X3Zpc2libGVfeCA9 IGZpcnN0X3g7CisgICAgICBpdC5sYXN0X3Zpc2libGVfeCA9IGxhc3RfeDsKKyAgICAgIGl0Lmxu dW1fd2lkdGggPSBsbnVtX3dpZHRoOworICAgICAgaXQubG51bV9waXhlbF93aWR0aCA9IGxudW1f cGl4ZWxfd2lkdGg7CisgICAgICBTQVZFX0lUIChzYXZlZF9pdF9mb3Jfd2luZG93X3N0YXJ0LCBp dCwgc2F2ZWRfaXRkYXRhX2Zvcl93aW5kb3dfc3RhcnQpOworICAgIH0KKy8qICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPVE8gTElORSBCRUdJTgor KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqICovCisgIC8qIFBsYWNlIHRoZSBJVCBvbiB0aGUgY3VycmVu dCBsaW5lIGNvbnRhaW5pbmcgUFQuICovCisgIGludCB2b2Zmc2V0ID0gKGhlYWRlcl9saW5lX2hl aWdodCA+IDAKKyAgICAgICAgICAgICAgICAgJiYgb3BvaW50X3Zwb3MgPiAwKQorICAgICAgICAg ICAgICAgICAgPyBvcG9pbnRfdnBvcyAtIDEKKyAgICAgICAgICAgICAgICAgIDogb3BvaW50X3Zw b3M7CisgIGlmICh2b2Zmc2V0ID4gMCkKKyAgICBtb3ZlX2l0X2J5X2xpbmVzICgmaXQsIHZvZmZz ZXQpOworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBG SVJTVCBYID0+IFBFTlVMVElNQVRFIEVPTAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgIHdo aWxlICh0cnVlKQorICAgIHsKKyAgICAgIGlmIChoc2NsKQorICAgICAgICB7CisgICAgICAgICAg cmVsYXRpdmVfeCA9IGl0LmN1cnJlbnRfeCAtIChoc2NsX2ZpcnN0X2hwb3MgKiBmcmFtZV9jaGFy X3dpZHRoKTsKKyAgICAgICAgICBocG9zID0gaXQuaHBvcyAtIGhzY2xfZmlyc3RfaHBvczsKKyAg ICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgcmVsYXRpdmVf eCA9IGl0LmN1cnJlbnRfeCAtIGZpcnN0X3g7CisgICAgICAgICAgICBocG9zID0gaXQuaHBvczsK KyAgICAgICAgICB9CisgICAgICBpZiAoaGVhZGVyX2xpbmVfaGVpZ2h0ID4gMCkKKyAgICAgICAg dnBvcyA9IGl0LnZwb3MgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgdnBvcyA9IGl0LnZw b3M7CisgICAgICBib29sIGZpbmFsX2xvb3BfcCA9IChJVEVSQVRPUl9BVF9FTkRfT0ZfTElORV9Q ICgmaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBGRVRDSF9CWVRFIChJVF9CWVRF UE9TIChpdCkpID09ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJjID09IE1P VkVfUE9TX01BVENIX09SX1pWKTsKKyAgICAgIGlmIChmaW5hbF9sb29wX3ApCisgICAgICAgIGJy ZWFrOworICAgICAgYm9vbCBub3RoaW5nX3AgPSAoaXQuYyA9PSAwKTsKKyAgICAgIGJvb2wgdGFi X3Zpc2libGVfcCA9IChpdC5jID09IDE4Nyk7CisgICAgICBib29sIHRhYl9pbnZpc2libGVfcCA9 IChpdC5jID09ICdcdCcpOworICAgICAgaWYgKHctPmhzY3JvbGwgPiAwKQorICAgICAgICBmcHJp bnRmIChzdGRlcnIsICJcbiVkLiAgJXNcblwKKyAgICBpdC5jICglZClcblwKKyAgICB3LT5oc2Ny b2xsICglZClcblwKKyAgICBpdC5jdXJyZW50X3ggKCVkKVxuXAorICAgIGl0LnBpeGVsX3dpZHRo ICglZClcblwKKyAgICBpdC5teV9waXhlbF93aWR0aCAoJWQpXG5cCisgICAgJXMgKCVkKVxuIiwK KyAgICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgIChub3RoaW5nX3AKKyAg ICAgICAgICAgICAgICAgICA/ICJOT1RISU5HIgorICAgICAgICAgICAgICAgICAgIDogdGFiX3Zp c2libGVfcAorICAgICAgICAgICAgICAgICAgICAgPyAiVEFCIENIQVJBQ1RFUiIKKyAgICAgICAg ICAgICAgICAgICA6IHRhYl9pbnZpc2libGVfcAorICAgICAgICAgICAgICAgICAgICAgPyAiVEFC IFNUUkVUQ0giCisgICAgICAgICAgICAgICAgICAgOiAiVEVYVCIpLAorICAgICAgICAgICAgICAg ICBpdC5jLAorICAgICAgICAgICAgICAgICB3X2hzY3JvbGwsCisgICAgICAgICAgICAgICAgIGl0 LmN1cnJlbnRfeCwKKyAgICAgICAgICAgICAgICAgaXQucGl4ZWxfd2lkdGgsCisgICAgICAgICAg ICAgICAgIGl0Lm15X3BpeGVsX3dpZHRoLAorICAgICAgICAgICAgICAgICAoKCFub3RoaW5nX3AK KyAgICAgICAgICAgICAgICAgICAmJiAhdGFiX3Zpc2libGVfcAorICAgICAgICAgICAgICAgICAg ICYmICF0YWJfaW52aXNpYmxlX3ApCisgICAgICAgICAgICAgICAgICA/ICJmaXJzdF94ICsgbG51 bV9waXhlbF93aWR0aCArIGl0Lm15X3BpeGVsX3dpZHRoIgorICAgICAgICAgICAgICAgICAgOiAi Ti9BIiksCisgICAgICAgICAgICAgICAgICgoIW5vdGhpbmdfcAorICAgICAgICAgICAgICAgICAg ICYmICF0YWJfdmlzaWJsZV9wCisgICAgICAgICAgICAgICAgICAgJiYgIXRhYl9pbnZpc2libGVf cCkKKyAgICAgICAgICAgICAgICAgID8gZmlyc3RfeCArIGxudW1fcGl4ZWxfd2lkdGggKyBteV9w aXhlbF93aWR0aAorICAgICAgICAgICAgICAgICAgOiAwKSk7CisgICAgICByYyA9IG1vdmVfaXRf aW5fZGlzcGxheV9saW5lX3RvICgmaXQsIFpWLCBpdC5jdXJyZW50X3ggKyBpdC5waXhlbF93aWR0 aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVkVfVE9fUE9TIHwg TU9WRV9UT19YKTsKKyAgICAgIGNvdW50ID0gY291bnQgKyAxOworICAgICAgaWYgKGl0Lm15X3Bp eGVsX3dpZHRoID4gMCkKKyAgICAgICAgbXlfcGl4ZWxfd2lkdGggPSBpdC5teV9waXhlbF93aWR0 aDsKKyAgICAgIGlmIChyYyA9PSBNT1ZFX0xJTkVfQ09OVElOVUVEKQorICAgICAgICBicmVhazsK KyAgICAgIHJlbGF0aXZlX3ggPSAoaHNjbCkKKyAgICAgICAgICAgICAgICAgICA/IGl0LmN1cnJl bnRfeCAtIChoc2NsX2ZpcnN0X2hwb3MgKiBmcmFtZV9jaGFyX3dpZHRoKQorICAgICAgICAgICAg ICAgICAgIDogaXQuY3VycmVudF94IC0gZmlyc3RfeDsKKyAgICAgIGlmIChyZWxhdGl2ZV94ICsg ZnJhbWVfY2hhcl93aWR0aCA+PSB0ZXh0X2FyZWFfd2lkdGgpCisgICAgICAgIGJyZWFrOworICAg IH0KKyAgcmVkaXNwbGF5X2ludGVybmFsICgpOworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwor ICBzdHJ1Y3QgZ2x5cGhfcm93ICpnbHlwaF9yb3cgPSBNQVRSSVhfUk9XICh3LT5jdXJyZW50X21h dHJpeCwgaXQudnBvcyk7CisgIGR1bXBfZ2x5cGhfcm93IChnbHlwaF9yb3csIGl0LnZwb3MsIDIp OworICBiaWRpX3Vuc2hlbHZlX2NhY2hlIChpdGRhdGEsIGZhbHNlKTsKKyAgcmV0dXJuIFFuaWw7 Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKIHZvaWQKIHN5bXNfb2ZfeGRpc3Ag KHZvaWQpCiB7CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBEZWJ1ZyB0aGUgcGl4 ZWwtd2lkdGggb2YgYSBzdHJldGNoIHRhYi4gKi8KKworICBkZWZzdWJyICgmU2RlYnVnX3RhYl9w aXhlbF93aWR0aCk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKICAgVndpdGhfZWNo b19hcmVhX3NhdmVfdmVjdG9yID0gUW5pbDsKICAgc3RhdGljcHJvICgmVndpdGhfZWNob19hcmVh X3NhdmVfdmVjdG9yKTsKIAo= --Multipart_Sun_Jan_21_12:32:34_2018-1--