🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: gmane.emacs.devel
33 messages
33 total messages Started by JD Smith Thu, 17 Aug 2023 00:01
Tree-sitter navigation time grows as sqrt(line-number)
#306816
Author: JD Smith
Date: Thu, 17 Aug 2023 00:01
765 lines
55459 bytes
--Apple-Mail=_3EDBD708-A953-4306-924A-6AEDAA78B3F5
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

I recently posted about the high variability of Emacs 29’s tree-sitter navigation performance within a file.  I decided to conduct a simple test on a large python file of about 8400 lines to see if I could learn more.  The test is as follows: at the start of each line, locate the current syntax node, and starting from it, navigate up to the root node via `treesit-node-parent’.  

I was surprised to find that the time this takes grows as sqrt(N), for line number N.  This leads to performance variability of >100x for code that needs to walk the local syntax tree in large files.  Such variability can make performance projections and optimizations for latency-sensitive uses of tree-sitter (e.g. via font-lock) tricky.  

I’m unclear whether this is fundamental to the tree-sitter parse/tree algorithm, or if the scaling comes from Emacs’ TS implementation.  It does vaguely remind me of similar scaling with an old line-numbering algorithm, where lines were always being counted from the beginning of the buffer, so very fast at the front, and very slow near the end. 

Code and details here:

  https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472
tree-sitter navigation speed test
gist.github.com
	
--Apple-Mail=_3EDBD708-A953-4306-924A-6AEDAA78B3F5
Content-Type: multipart/related;
	type="text/html";
	boundary="Apple-Mail=_483CCA40-26C0-4A4B-B113-6847A82499E2"


--Apple-Mail=_483CCA40-26C0-4A4B-B113-6847A82499E2
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">I recently posted about the high variability of Emacs 29’s tree-sitter navigation performance within a file.  I decided to conduct a simple test on a large python file of about 8400 lines to see if I could learn more.  The test is as follows: at the start of each line, locate the current syntax node, and starting from it, navigate up to the root node <font color="#000000"><span style="caret-color: rgb(0, 0, 0);">via `treesit-node-parent’.  </span></font><div><br></div><div>I was surprised to find that the time this takes grows as sqrt(N), for line number N.  This leads to performance variability <span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">of >100x </span>for code that needs to walk the local syntax tree in large files.  Such variability can make performance projections and optimizations for latency-sensitive uses of tree-sitter (e.g. via font-lock) tricky.  <div><div><br></div><div>I’m unclear whether this is fundamental to the tree-sitter parse/tree algorithm, or if the scaling comes from Emacs’ TS implementation.  It does vaguely remind me of similar scaling with an old line-numbering algorithm, where lines were always being counted from the beginning of the buffer, so very fast at the front, and very slow near the end. <div><br></div><div>Code and details here:</div><div><br></div><div><div style="display: block;">  <div style="-webkit-user-select: all; -webkit-user-drag: element; display: inline-block;" class="apple-rich-link" draggable="true" role="link" data-url="https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472"><a style="border-radius:10px;font-family:-apple-system, Helvetica, Arial, sans-serif;display:block;-webkit-user-select:none;width:300px;user-select:none;-webkit-user-modify:read-only;user-modify:read-only;overflow:hidden;text-decoration:none;" class="lp-rich-link" rel="nofollow" href="https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472" dir="ltr" role="button" draggable="false" width="300"><table style="table-layout:fixed;border-collapse:collapse;width:300px;background-color:#E5E6E9;font-family:-apple-system, Helvetica, Arial, sans-serif;" class="lp-rich-link-emailBaseTable" cellpadding="0" cellspacing="0" border="0" width="300"><tbody><tr><td vertical-align="center" align="center"><img style="width:300px;filter:brightness(0.97);height:150px;" width="300" height="150" draggable="false" class="lp-rich-link-mediaImage" alt="gist-og-image.png" src="cid:2708D5F0-09C4-4F33-A278-E0B1788A534C"></td></tr><tr><td vertical-align="center"><table bgcolor="#E5E6E9" cellpadding="0" cellspacing="0" width="300" style="font-family:-apple-system, Helvetica, Arial, sans-serif;table-layout:fixed;background-color:rgba(229, 230, 233, 1);" class="lp-rich-link-captionBar"><tbody><tr><td style="padding:8px 0px 8px 0px;" class="lp-rich-link-captionBar-textStackItem"><div style="max-width:100%;margin:0px 16px 0px 16px;overflow:hidden;" class="lp-rich-link-captionBar-textStack"><div style="word-wrap:break-word;font-weight:500;font-size:12px;overflow:hidden;text-overflow:ellipsis;text-align:left;" class="lp-rich-link-captionBar-textStack-topCaption-leading"><a rel="nofollow" href="https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472" style="text-decoration: none" draggable="false"><font color="#272727" style="color: rgba(0, 0, 0, 0.847059);">tree-sitter navigation speed test</font></a></div><div style="word-wrap:break-word;font-weight:400;font-size:11px;overflow:hidden;text-overflow:ellipsis;text-align:left;" class="lp-rich-link-captionBar-textStack-bottomCaption-leading"><a rel="nofollow" href="https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472" style="text-decoration: none" draggable="false"><font color="#808080" style="color: rgba(0, 0, 0, 0.498039);">gist.github.com</font></a></div></div></td></tr></tbody></table></td></tr></tbody></table></a></div><span class="Apple-tab-span" style="white-space:pre">	</span></div></div></div></div></div></body></html>
--Apple-Mail=_483CCA40-26C0-4A4B-B113-6847A82499E2
Content-Transfer-Encoding: base64
Content-Disposition: inline;
	filename=gist-og-image.png
Content-Type: image/png;
	x-unix-mode66;
	name="gist-og-image.png"
Content-Id: <2708D5F0-09C4-4F33-A278-E0B1788A534C>

iVBORw0KGgoAAAANSUhEUgAAAoAAAAFACAYAAAAszc0KAAAAAXNSR0IArs4c6QAAAERlWElmTU0A
KgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACgKADAAQAAAAB
AAABQAAAAABvE1SKAAABzGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxu
czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJE
RiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi
PgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpl
eGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOkNvbG9y
U3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+
MTAyNDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lv
bj41MTI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAg
PC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KMyImCQAAQABJREFUeAHsvQecXFd59//s9LZFq2Z1y7It
uahZtuVesbFNQmyKARtIQrFNC6G8YNqLQ0xP/oS8hlBfQiAxBAhgILwE44YlY4wtF0kukiVZVm+r
bbNTdmb/z+/M3tXM7JR7p+zeWf+OPquZuXPuc57zvXfu/d3ntLb5i5aMyGgaGRkRn98vXdOmS5vH
Y7aOZLPS23NY0um0tLW1WVnLvsJGOBqVWHvnaJ423TcpfUePyEh2rKiy++e+GNH9u4wd2NOCZWig
Xwb7+8z7Kjubr+F/Z1e3qQ82wE5/71FJJoZs1yMQCErHtO6x/NlsRnqPHJbM8LBtP+z4yjwkQAIk
QAIkQAIkMJEEcipvtEQIvHA4Ih6vd8wHvA9FomMiaOyLMm88KryCoXBe/hHx+wMSCAaNCCuz29hm
CDWvzy+BUOhYft0WikSMmDOCcCx36TfIE9T9IWatBL8iWg+82klggTLz83u9PrUbEbsy1k45zEMC
JEACJEACJEACE01gnBrKF02WM16fz3bEC4LJ6/EWiKQ2adNtasNm8qro9KiN/NTW5hm3Lf/74vfw
QYsdSxCFELP5gm7syzJvIPiKkxMWxfvyMwmQAAmQAAmQAAm4gUCBAIRISqfS2l5a6FpGm3/RFGwn
ZTRfJpNR7XVMfY2oweGMNpvaSIi8YX80t2oYcXSPNlN+Rm3YaYbGTunhwnqgSRg+wLatpCyGYaMo
mW36HRMJkAAJkAAJkAAJtCqBAgEIcTUUH5BEIq71yYmcZDIh8cGBPDlXuaoQioMDfabfH3JCVMJm
OpGwLd7Qxw79/bKjYi2TScuAfjZ97yoXb75FPdLJpAwNDo41I+NzXG3AH1tJtWdc90f9TdL9Etp/
MDkUt83CVjnMRAIkQAIkQAIkQAITTKAtfxCIVTYElGnq1A0QXbZFk2VAXxFx82mTK/YdxqCJGpJp
ClYbJiJoN3JXVA6atBGNRPTPbhQz30QjWOTb43sSIAESIAESIAESmGwC4zu5qUdGtGmzby4KaDXD
OnMVYiuNZtw64mUQfvWOuB2utx4QsMaGs/ozNwmQAAmQAAmQAAm4lUBBE/B4J2sTf8fs1Lu/Whrr
B3jMqvN3DfDDeaHcgwRIgARIgARIgARcSaCKAHSlz3SKBEiABEiABEiABEigDgIUgHXA464kQAIk
QAIkQAIk0IoEKABb8ajRZxIgARIgARIgARKogwAFYB3wuCsJkAAJkAAJkAAJtCIBCsBWPGr0mQRI
gARIgARIgATqIEABWAc87koCJEACJEACJEACrUig5DyArVgR+kwCJEAC1QiYuUV1flFMMo8/t6Ws
tZSmTn/lwxrsLkv5E/vDP0yU77bk9mNsMTSLDOg56EaGWLwBfprFGHRRB6apScDb0dV9W3HVcOCt
nzUWTqvlBG2UDcu3WnzQM9jsbi3+VouNRtTDqgNfSYAEJo8AhMHChQvltNNOk1QqKQMDA+Jx0c0N
4q+zs1NWrlwp0WhUDh8+XNO1t9mETz31VFm0aJH09PSYVZ5qua42y0cc49mzZsuKlSt0Gc+k9Pf3
u+4Yh8NhWbFihTnWYGjuMS4S0mB44oknysknnyyDuhzq0NCQqxg269x5KdotKQADgaCEYzEJhsJG
CGZ0GTUnK3rggoB9w7Go+NVWNpPVkzzriG+b1yORcExCeiH0ef1qw/mSdF6fXyKoRzgi3jaPLgeH
lUmcpUAoJOFoTPCKZK1P7MwKc5MACUwmgbSu5gPh98UvflH+8i//Uk466WR58MEHXXNzg/gL6LKV
//sTn5D3ve99cvnll8uWLVtkx44drolUguG1114rn/nMZ8wrxOpDDz3kGgGDqNUJJ5wgn//C5+Ut
b3mLEdJPPvmkEdJuEPoQeoFAQN773vfKrbfeKi9/+culr69PNm3aZIS+G4Q0jvFFF10kX/jCF+R1
r3udnHD8Yvn9g7/XB6aUKx9GJvOaMhXKLojt4gT1+QPS3jVNIpGYhCNR8z4QyIkfWxVWG6FwVDrU
RlhfIyqeYM/jsd/cgh9CLNYh0Y4OtRGRWEenCrkOFaNWXLK6Jx6vTzqmaT2i7TkbnV3qVwTr3FXf
GTk0X1Cf1Do6tR7KIQIW+h5rC9u2Ya8k5iIBEmgyAUQ1zjrrLFm6dKmJDCHKdtJJJ5l1xptctC3z
8G/W7Nly9tq1Jqp23HHHySWXXOKayAvuDWgOhDDt6uoyYgDvO/Qaje/ckMBw9erVoxHelHm/Zs0a
I17c4B9E/jS9J1nHtbu7W6666iojCt3CED5CmM6dO9f8Ns5ae7bMnz/fNb8TNxzHqeRDgQCE8ILY
wQ8dJyT+8OQUiqhwspk8um9IhROSZcOnkbhgMGjrQoF9ILKCwfDY/ogehsIh8ep2fF89qXgLan6N
HFo+mLqpALT9JKgsQqHR/KMsvBqVhCi040F1H5mDBEhgogjgmvb000/LgQMHJKhRmL1798ru3bvt
Xw+a7CiuS2gO3Lp1q/j1Ooemyycef1xwQ3ZDwvUTAuupp56SZCJh+ic+rv6hGR3fuSGB4fZt20zE
D5G2PXv2mCiqW/pSwj8r4of3aKJ+4oknBFE3tzCEH48++qhp+sV5iAg0fjPwl2nqEWibv2hJgZ7p
nNYtARVPltDCCYH+Mr09R2xFviAAu6ZNFw86MI+KNdgY7O+TwYH+qic6yoV461AbaqCAOHxIJRO2
bETbOzRq2D7mA5qw0Xx7tOeQ7Wbcru7ppgk7n8XQUFz6j/ZU9aHAcX4gARKYVALWg+BajbAh8vfI
I4/IM88845rmVcCBwJo/b55crJE/CNQHHnjACEC3iAMwhLC67LLLTOTvnnvukYMHD7pGHFjXaUR3
ly9fLo899phpXnWTeMExnjFjhmEI8XzvvfcaIeimY4yHpfPPP1/mzJkj69evl507d7rmGE/qRWQK
Fl4oAPUHHtIIYKwDIf5jtR3o65Wh+OCxDRXeQfN1aBMBmoEtAYen2N6jRyStTzx2TnT8YDtUiPr9
wZwN9SWtfRD6VADaeSLGhcCvF6pOCNG8JxfUoV/rkle1SjXR5mNthm5XEZmX+rQeCe0Ua6ceebvx
LQmQwCQTwHXBGt2I64JbIkP5WOCfdY1DBMZt1xkwTKuPeLiHUMCf2xIiavAT7MDQbQkiEH9IOAfz
71Fu8NUcY2WI5FaGbuA0FXwoFICjNULfvaA2uSIh3I+olxXNG81S8QUnNAZOQISN6ACQoURcUmrH
SUIzMPoPoi9fJp1SARrXi3dKTdiTbygroM3OYe3L2OZpU/EJGwNjF1c7vuDkR5M4BsUgJRNDORZ2
dmYeEiABEiABEiABEnApgZICEE8A1lPJCPqg5IcDbVYEjbewYfa3uU+pbLBhnohh0L72y5nSeqj6
MwIQNpzubozgSdIMYBkxfrjtibwUM24jARIgARIgARIggUoESs40CpEDEWhSDeIP+0Fs1Sv+YMdq
DqlJvRnfdTBL9ti8hrDpKBkWuY7YFH+OyDEzCZAACZAACZCASwmUFIAu9ZVukQAJkAAJkMDUJqDB
F4RfEISxWuNaLfiA4E8WrWcaQMn3vZXrhGAU/J9KdaIAnNqXEtaOBEiABEigRQhAZKxavUYWLV4s
hw4ekL06lc3OF14wM3G4cdBSMVYIJAxwwVyR8xcslOPmzJWYzsiBwUJJncGjV6c62r17l+x6caeZ
n7El6jQqZjt1LmHUac68ObpSz7E6HUWddu3UOr1opvRphTpZx61kH0DrS76SAAmQAAmQAAlMDAEI
qC6dAWP69Olmqbg58+brSliYw3KTPPv0M+rEsf75E+OR/VIwzZpfB16uOuMMWbDgeJ35o0cO7N9v
Zt7AKlzBYEAnwp4uc3ViaXQS27zxSdm65VmNqGk//Rq7mtn3rracELMhXdVs9Zln6eTY83QauSNa
p31mns5MVuukA0RxvOYvWGAink89vkF2bN82LkpYW+nN34sRwOYzZgkkQAIkQAIkUJUAhFDPkUNy
WKN/EINYVOHkpctk5ao10q4rYm340yMmwmYN0qxqcIIyIHLZrksDXnDhxSr0grL+wQc0erk7Nw5g
TNyhSVvMylxLly2TM1RUYTnBxzc85soBlhC0nbqK2YUXXWwGgq77/f2yf99ewz9fsOI4bXwyIstO
OVXWnne+EYRPPbHBlXUqPh0YASwmws8kQAIkQAIk4AICx5pUp8llV1wpRw4fFggRCK58ETKZriJK
FovF5IqrrpHDhw7Jw39Yb6aP8+oMHurkONesOk2fMVMu0eUE9+/bJ39Y9+BY/7pxO0zCBszHOU0j
ey97+VWmGf6PWifML1lu3kurTrNm6xKOl71M9mgz93pdQ9mjU9C5OXk7urpvc7OD9I0ESIAESIAE
XooEIPIQ7RvSxQd2ax+z5StXG7H1ovahc0MUEMIH8+1efMnlpn/f+t8/YCZbN0KphPjDMbTqFB8c
lD27dmmT8Zm6/KvPCC231CkYCsnFl14uh3QZvPXrfm8Edznxl1+nAV3xbM9uPU6rVptJvvdpFNQN
dSr326EALEeG20mABEiABEjABQQgIhK6EMFBFSRnrDnTrEZ16NDkL8MHAbj23PNNU+69v/utZEYy
tgUP6oQFHlCPs845T/vV9ZkIpxsEE5qysRjF/ff+zhx9uz4h36AKWwwMOUe5oM/g0aNHbTOZ6FON
AnCiibM8EiABEiABEnBIAOJioL/frB185tlrdTTt7kldlnRYm0QXn7BElp5ymtx79/8Y4eM1iybY
rxjq1N/bp30FM7JaI4G7NCKI1ccmq3kbTb8naZ/LE05cIvff8zvD1674s2qNSGFfb6/5iDq9sGOb
aT6erDpZfpV61Ub68QmqHs7iD++dp9w+psImDFyLjVypGCFUczL1QMi5Dhta+DEWNXvCHUmABEiA
BEigLgIQF88/v0UOa1/ANWeeXZetenbGPH+RWFRWrD5Dnnpygxw5crhs/7hq5Xh9Xnlm82YzsnaV
2hsZyS28UG2/Rn+PfpXoy7hi1Sp5/NFHTRTPo7xrSThOT2/aKPH4oJy6fIVpQq7FTrP3KRkBxPq3
mLsnFI5o6LJNoPSdJI8+BWAd30h7u44ICpsDai1+bdeOz+eXmI56gh2sKZzJDDteWSSgw7dhA/Xx
6qLbw8NaDweCFsIxHI1KNJZjAS1rbNitBPORAAmQAAmQQIMIWEGZoyq4lq9cZYQXok1Oo1T1ugOx
tHrNWRKJROThh9aPBUlqsWvVqafnsJyuYunw4UNGDE5GndactVY8eqN/VEdbm0EstVRI90GdMIq4
R5t/EQU8sH+vDAwMTPhxquZ+QWgM0b4gRJMOzfbp/DY+FV7R9k4jBJ1EAqMqHiOxdm1DD5gOou2d
00x7ul0bbRoWjumki/DFq+3wQRWi7R1dOhS7wN2ydUM5KLtdbfhRD7UBIRnVP7sJNiD+IITBAX8Y
5g6f7NbDblnMRwIkQAIkQAJ2CEAYIQL4zNObNVq1uubIm52ySuWB+OvS6VGWnHiybHjsUTPoA4Kn
noQ6Hdp/QJtLt5tBIZMh/jD34gknnigbHn3EiLd66oN9ET08qHMG7tmzSyOla1QU1mux8fsXKCoc
RET9tPE3FylTEYRtQZ2LyO4BQaUhvkzS/SGWPBpJgxCzk5Dfr4INEUAjtPQzonYQcZhh2674wlxE
bRiCrftiH5gJBEPmoNjxA/UO5NXDGFAufp3MkokESIAESIAEJosAolPP6uTQMQ20LDp+sWkhmyhf
0Px76unLdUDKfjOKt1ErX0A7PLN5k3RooGXe/AVGWE5YnVQgnHr6Ctmr/SoPHjzYMFGNoNWTOjn0
zJmz9DidMKF1ssOuQACqWtLZrDPj9sMBtyu8kDcnlvLMQPlCgdlMubKK8uOj/tkR0chj5knKy616
LlcH236ARZEPcCE7fpvNajEbCZAACZAACdRNAMICU8M8oyLw9BWrTIDF7j26nsLRlQsTUi/QJdE2
PvmEbV1gp0wEmfr6+uS5Z56WldoXMKCtbhNVp+kzZqjonC+YwLmRZaJOvdoMvOW5Z+Q0FZjo79hI
+3a4VspTIAChdxI6hBkHGREw/GV1dE5Ch2qr15XsjH0H4ZVIDuUqOWoDfQiTyeRYnkpvUOZwOmWG
vOM94qZ4xTqCad2Oz9USPE1pfpRr2QD0xFDcfmdMsEjk8sMG/tCmn9Sh+EwkQAIkQAIkMJkEzIAQ
XUotoK1SJyw50dy3m+0P7qNLTzlFDh46YJo34UMjE+xtfe5Z7a4VNYIMeqLZydRp6SlmQmpMZN2M
OqG5PhgKmsjmRNTJLrOCQSBG5ChwDIUGlOH0sMQH+iWdsie8UChsDKfSgnXyVG2ZRawH1UZWB3Hg
O7spnUoaH4wAVSEWHxywLUJRDvw3NrTArNZnaGjQCDq75auzktH9MOhDTRlRGh/sPyYqbRtiRhIg
ARIgARJoLAHc51J6r/Vr16jjlyyRbVu3mvuek/usE4/Quoe+f2etPVf+9Mc/NGWgBnxHsAjRvwWL
js+tq+vESYd5Ica6te/fylVnyB8ffkhH7cYd6RQ7xaFOmMMRg1EXLFwk27c93/Ay7PhRKk9BBNDK
AOHU33tU/3py4s/6wvbriCQ12tan+w/09RohZXvX0YwQcBCffbqg9JBGJU3TskMjiGSifPiR1HA5
mpCdprSejOAAHkYIOzXA/CRAAiRAAiTQBAJoYty6ZYsEAyGZq02YzYwuZXV6llNPP12baXt1VOt+
2+MCnFYbgmnLs88YsXncccc1NbIJnbF8xUo5oiOQD2qdmiWecZy2b91ixObMWbOaWicnvEsKQBgA
iHph1G3DDT40iIWTg8K8JEACJEACJFCNAO6xWEFj+7atcsqpp9V9zy5XHlriurq6NYJ1vBnUAKFZ
rz4oVxbEEia83rXzBVl2yqlaTrmc9W1HgKh7+gyZO2++bNr41Fh3s/qslt4bU+NhRRAs53fKaac3
jV3p0stvLSsAy+/Cb0iABEiABEiABNxAAIJpm04OnRNoC5sSXcpmstr371Rdtu2ArnW7q+H95Io5
YpDLs9pvbtbsOSrQFjSlTihz+cqVpj779+xpfp1UyaJOc+fOkxkzZzZkqplibk4/UwA6Jcb8JEAC
JEACJOASAhi00NtzVHbqHHqn6+TQEISNTIj2TeueLguPP142Pfmk6WfYSPulbKEOR44c0YjZTjPl
TKk89Wyz6nTccXNls67YUUPvMMfFo05Y93i3CmhEAd2QGnumuKFG9IEESIAESIAEXkIEMIfe5s0b
JRZtN30B0bzZqIR+cqctX64is0f27dvX9EiZ5TeamJ966gnp1AUd5syb19AoIOp0+ooVsm/vnobO
+2f5Xu4Vddr0xBMyZ85cmTm7uf0by/mQv50CMJ8G35MACZAACZBAixGAsMB8c5s3PSUrV55hFlJo
RBUQKeuaNk0WLlosmzY9qSYnIlaW89xEAXXFk206eGK1rqTRqOlZUCfM+7dgwSLDq0ldDEviN1FA
XeruxRdekFVaJ3yezDS5pU9mzVk2CZAACZAACUwRAhBIGD2L+eaW6JJmmM6t3oRIGdbH3b1rp1n1
o1EizK5fKO9ZnRg6ovMCLlrcmJU0dHirnHHm2brs3DY5pKt+TLQIQ3mIbEJYn3DiSTq/cdoujobn
owBsOFIaJAESIAESIIGJJYAoYCKRMKN0V+lKGl1dXXVNC4N5cDFvXacuzfb4hse0MhMZK8uxg1ga
1DmAn3zicRWiZ0usvb2uOmFxiMU6Z2K72nnC1GlijxFKQ536e3tlo4pAzD+ISa8RlZyMRAE4GdRZ
JgmQAAmQAAk0mAAiZtue3yo92l/vzLPX1mwdggTrDJ+19hzTTNqnzcsTHSmznEe5z295zkwNs+qM
NdZmx6+oE9YZxjJzT+kydv061cyk1QmRTR0RPKBT+Kw+48wJGVhTCljBSiD5GRD6RcJTRa2pUTbc
4EO9LGplyP1IgARIgARIwA4B3Ctx3z148IBZexaDQzDQwYnQwf6wc+Gll2ozckZX/XjY0f52/HSS
B75AvB08cMCIpYz6dGD/Pkc+YX+wuPiyK0xEccOjjzSsT6GTulh5UScM1DmqQn31mWdJUldbO6T1
c3KcLFv1vJYRgG3i8/sUkE/B19bps63Nozb85kSyhKBTR3HAfD6/7jaiJzVCpM7FKPb36lI5OT1b
Q130QMEGfBmpkYXTejM/CZAACZAACdRCAOICq2f1ajPj2vPOl4SugmW3rxvu1fjDcm8zZs6Qe+++
2yznCpuTmVB+PD4ogwMDcs5558mArhJ2WAeI2BFMEH8qROTc8y+QDm36feC+e0y/u8muE3xHfeJ6
rODbER0cgsmi7dSpUcdinADEBIztHV0Sbe+QUDgifhVxWALNtojTk8cXCGqotUvC0ZiE1QZspnXN
QttJbQR1v3btw4D9Q6GQri2clQw6S9o8EXFwUYdYR64eWFsQ6/pmMTzepg0I4HatR1RD4WDhUyGZ
TicnciCUbWTMSAIkQAIkQAIggIBFnwpA9Alce+55kkomVAQeEiznVk5goM+fX++T515wocyfv0Du
+d1vzbJvEz3wo9wRhN9He44Y8XamCtQhFbaHDx0y2qRcnTAQJqB65PwLL5ZZs2bLfVonNP26qU5H
jhxWXZKVs885TwbjAyoED1esUzk+tWwvEICqu3S0TcyMuIExiChE8fSdYE1cOwE4IyBVNAG6ZcOv
7yG+8FdNdUNoIuLWrotOQ4DhuQMns98f0JM4qRHJjC0bwVBYBWCnyYsyEQX06nIsKV3n2E6CHzHd
PxSJmOywAR+wJnFKBXG1etgpg3lIgARIgARIoBkEIIoQ+Tuskw9jJC9W1EAUDcusISpm/eFeh7zz
Fy6Qiy+9TDzaenf/fb8zzZNuEUoWH+iLAwf2m0EUqNNxc+dok26/RtIGjTYwddIgD9r6vJp30fHH
y0VaJ9y377/3bhW0fa4Rf2N1Um1xUOsU18Eua846R2YfN8ccI0QG0UxsHR8rfyNf2+YvWlLQLto5
bboEgsGxiB+EDgRPny6WDEeqJZwwsOFRwaU7mOwYdj040Kd//VWFE8oIasSvo2u67ltYXt/RI5LU
J5pq4gs2Yhr9C8diBSYQ/evVetidJLOre4Z5IrLqjXIRTu/r7bGjhauh4vckQAIkQAIk0FQCiIJN
0ylHVulgg9lzjpMeXWED/emGhuJ6L9UWv/aYio65pqVt2/PP6yjix0yUzW3iLx+SqZOuTrJ6zRqZ
rRMqH9bmU9QpkRhSMevVVswOmT3rOAmqltm69Tl5SkcRZzLD5rt8O256jzpNnz5Dj9MZugTecbpq
yCEj3hEhxLyB1XRPLXUpEIAQOu0dnabpNl/0DMXjqrhV9KgAqpaQBwIQoWTLhu4o/Ud7VDzhhKts
A/ug2blz2gxtOj6WF8reiDcbzcCwEYpETfPtmAjVcp0IWdjo0Cgkmn6tesB3iNhBHblTrR7VOPF7
EiABEiABEpgIArh/4j7WPX26ad7tnjFTIqOtWxiJulfXwsVgkYH+AXPfbYX7G+qENF3rNHfefLO+
bjisU6poPfv7e2Xf7t26csle7S84YCKcrVSnGTpRNeoEIYhpcB5av04js8f0UKPOmQIBCKMIBbd3
TjMCDp/RbAvxBnVqC6DCD2gEL6b9CKHEEYJLqiof6OsdE1KwWy2FVcChDx/KxIFGBDGhQtRuwn5W
P0a8h/8DKmLT6ZSasAcSff5i2pydG4giktL+fwPaSdM68ez6wnwkQALuIICbIP5wTcCfGxOuL273
D9zK9buabKY8xuWPAM4t8EHK/Q7wLvc7wDlnHVOLofUZudyaiuukP56xO7xHg0iIcrZaGqsTjpXW
p1nR2HECEKBw0H3a3w2nBQQTnHGa0OcOwgmjdx0NIskrCD5AhGHyRghRpwknNPrtebwYhJKy3fSb
Xw76HMAGEligLwETCZBA6xFA1w9cEzCoLK4Pk7io4rNbEm668DEcDpvWClx3m3Xhr7XOeJDGgDrc
I9AJH601bkqWcAlqv/Mh0xzoGRM1bvETKz+EgiEzIAOtUm5jiHMQxxfNp4PaDw33YDf9TtxyHKeC
HwWDQKwKmQuRCi6MCirshWflqP4KoYRRu7BRa8pmh01fhNwUMLVZQbs/fnCoU00JF+VRFjXtz51I
gAQmnQBuamgq+vCHPyxve9vbpLu7Wx5//PHRKMjki0BLuLzmNa+RW2+9Vc4++2zZvHmzmcrDLVEY
iL/TTjtNPv7xj8urX/1qI6K3bt3qGoEFhhDP73vf++SWW26RRQsX6oS/T5rrv1sEDET9lVe+XD7y
kVvlsssukxdffFH279/vGob4nSxUbh/72MfkxhtvNKtUbNq0yTW/k0m/kEwxB3SkRpnUiCfjum0g
fFvGP9ubG2Cjfidse8uMJEACjScA8XLJJZcY4YKb8Lx58+TBBx+UjRs3uiICgxvvnDlz5KabbjKv
q1atkhe04/cdd9zReBh1WLzxhhvk8ssvN11qsETYQw89ZISgGwQWHvQv1cmLr7/+ehO1OnnpUtmo
IvpXv/ylifrWUe2G7IrzDg8et9xysyxV38AsqTNb4KEE4tUNDPE7Ab9rrrnGRKPnz58v69etk+e3
bTNMGwKCRlxDoPUax12Djo6QAAm0CgHcYDELAG7CSHhFZA3b3ZLgE4QghIDxy0W+gRGeg+GjJVYs
X93CD37AP/yZ92Bp3rnjP3MOqm8QWVZyWzcE+GX9TnAeQlTn+2v5zdepQaBkE/DUqBprQQIkQAI5
AhB723fsGBMHd955pzzwwANGBLoh8gL/MFoRKwGEtO/VuvXr5V+/+13Tz84tTcAQMM/rNCFYvH7f
vn3yta99TbZpZMgt/sGPvXv3jgmWn/3sZ3LXXXcZQe2WY4y+p3t0xC0YogvCt771LV227aBr+nqC
4bPPPmui4jgfv/e978mjjz7qGv94PWssgZKDQBpbBK2RAAmQwOQTQGQIERf0E7MWgneDMLDIQGAh
qgZxgMgL/tw4CASDAzAwwBogYPnvhlcwRMIUJxBb+OwWgWrxQUQN5yCONQaBgKWbEvzCwBQcZ/xO
3Oafm1i1ui8UgK1+BOk/CZCAbQIQBG4UBfkVgFCFMHWTOM33zxJZbvYPPpJh/lFz9r4VfifOasTc
pQi469GjlIfcRgIkQAINIuBmUWBV0W0RK8sv69Wtwi/fv1bw0fLXja+t8DtxI7dW84mDQFrtiNFf
EiABEiABEiABEqiTAAVgnQC5OwmQAAmQAAmQAAm0GoGyAhDNEPU1ReQ632I939omWsjt5TXLyQFr
LVbQDwT1yC1JZ/VdcXqQ6mfhtETmJwESIAESIAESIIHmERjXBxBt/+FouwR1uSSIrpROVDmoI4Hs
C7AR8eoScNFYu44e8pvlbrCGb2LI/jq+EGoBHYEEGxBvWM0jrkPSU6mko47RoXBMwjoaDHXCMm6o
RzabsUcTo8d0CblwtENHQwWM/EwmEuoHWDCRAAmQAAmQAAmQQOsSKBKAupROJKrCKzZWI2s93zhE
oAqp6qnNCLdgOILVpgWxN2+7zywJZ1fAYR3hWHunrkesawljf/0MIdjbc8SWgMsJyJBEOzrEM+oz
bMFYf9/R6lXQHCg3HIlJRKdksJIv5jdD9xPxQUdC1NqfryRAAiRAAiRAAiTgBgJFTcBt4g8g8gft
lpsuAe/9urC2Kim8rZowb1VONOb2hx2PNsP6dQFxOwn5Me8Qooh4DxGJV4hA/JltNgxhwXJoP+TH
XzY7Yuphd14tRA39/pzPlg0Ua7ceNlxkFhIgARIgARIgARKYFAIFAjAnlMY3kWJpGFVRthzEHFaw
UyAX9YO1PE81IxBt2Qxs5JbzsfLnRJjOj2VtqPKaUT80ZDmWKycGsUyQvXpohUW9GNvfelPsl7Wd
ryRAAiRAAiRAAiTQKgQKBCCcHhoclGHtc2fNA4RZwYe0ybOEFipZx6wKtyHt72dEoKou0/9O++6h
L+ExOVZy19GNbbqUT1qSiaExHyDkkmpzWGfGN2G9SrvrdxB7qWRC0jrLulUP+BWPD4wTluVMQe+C
BcSvZSOjM7gn40PlduF2EiABEiABEiABEmgJAiVXAkFTKwZhQHilVUg5XgxaFRiWkkET6ohG4pIq
AE0U0QESlY4S0IEoXp9Xy88YPyAqnSSPNkcHgiHtP6j1SOnSSuqH04S+gwFtAkfR6VQNLJwWyPwk
QAIkQAIkQAIk0GQCJQUg1I4ltUzUDiE1hylfrCGCVlPK96NGG/X7gT6EOe9rrkdNledOJEACJEAC
JEACJNAcAkWjgEcLUbFVo2Qb87IhYskVfqAZe6xafEMCJEACJEACJEACLU9gXB/Alq8RK0ACJEAC
JEACJEACJFCRAAVgRTz8kgRIgARIgARIgASmHgEKwKl3TFkjEiABEiABEiABEqhIgAKwIh5+SQIk
QAIkQAIkQAJTjwAF4NQ7pqwRCZAACZAACZAACVQkQAFYEQ+/JAESIAESIAESIIGpR4ACcOodU9aI
BEiABEiABEiABCoSKD0PoO5iTaBcz3x+ddsYnQjaTMNX42R8dfvQIBYVjwK/JAESIAESIAESIIEJ
JFBSAEL0meXP1BGsy4vl3JwmLMPm0yXlRrIjksYavmNri9i3hGXYYAfrEWfUDyxN5yyhHgFp06Xg
htPDks1mnO2OEj0eCfj8RhAbFtayII4tcQcSIAESIAESIAEScAeBcQIQgqu9o1P8KpywAtpwKiUD
fb1GhNlyWQWSX9ffjakNr9qCXkomBmWwv38sqmjHTigSlUg0puv4elS4ZSU+0C+JobidXU0eiNho
e4cEQxGzkgfWMx7o75XhpK4HbDOa6FXhF2sHCxWyWg+sJTzQ11eTkLTtODOSAAmQAAmQAAmQQJMJ
jOsDGFbRFVABh2gb/uF9JNZu2w1EzKKa36fiCQlaKxSOSiAUtCUA0WSLyB9sQPwheTxeI+Zg02rS
NV+U+09tBIJhU66l9fwBFXNqE/7ZTVHDIqDZsRxcm4pJtRmJ2PPBbiHMRwIkQAIkQAIkQAITTGCc
GkKzbXFCJM9uX0CINvyN5DX5Qkh6PePtFpdjfcb+bW35ro2Y8iEE7SRELk092vAul9AUjf0tUWlt
r/SKaGhx8nq1HpaqLP6Sn0mABEiABEiABEigBQjkqyzj7nA6Nc5t9OGzFXnTPdFciz57+b31IMPQ
BGsnQWhi/8L+em3mcyYzbFuIor9efsrZRT9Ae/0ZIWBzNvJrIupbWtrQHsxEAiRAAiRAAiRAAi1K
oEAAQuQNDQ5KMjmEYcDmL5VMmG35Eb1KdcWAkfhgvw66yAkw2EzEB0z/ObtRxIyKRfT5swafZFUQ
4jMEoJ2EcuB3YjA+JlzTKggH+wf0sz0BiABmPD4oqVRCi4TgG9G+jEOmHyLln52jwDwkQAIkQAIk
QAJuJdA2f9GScXoGAgr98KB7xkYBO2n2VNHn0aZknzaXIuJWHI2zC8OrNrzabAvhh6hgLcnn11HA
iCqqAMxFFQsjetVsWiwAKWMioRCQzmxUK4PfkwAJkAAJkAAJkMBEEigpAHMOWLqwHrHTKBv1+IDa
wI96bOj+xkQ9NnJU+T8JkAAJkAAJkAAJTDaBCiMzGiF2pooNrUcjqjLZR5vlkwAJkAAJkAAJkIAS
KOgDSCIkQAIkQAIkQAIkQAJTnwAF4NQ/xqwhCZAACZAACZAACRQQoAAswMEPJEACJEACJEACJDD1
CVAATv1jzBqSAAmQAAmQAAmQQAGBCoNACvLxAwmQAAm0NAHMSZpOpSWTzZh1ygO63rnbEibdx6T5
WLEI/mEaKjclTOuV1PXU4ZdfpwrDKlFuSyldvx7ThoFhMBh0m3vm+OI4K0QJ6jF2sjrVRFQGvxMw
xLHGilo4zkxTk4C3o6v7tqlZNdaKBEiABHIEcFNDetnlL5Nrr73WTDK/a9cuV918IfxOOukkedOb
3iTz5s2Tbdu2mZuwW0QgBEFHR4dcf/31cv7558uePXukv7/fVQyxeMDatWvlVa96lRHQOMZu4Yfz
D8IUx/aGG26Qk5culV0vviiJUUGN7yc74XcCwfeKa14hL7/6KhnUhSH2HzjgqmM82YymUvmMAE6l
o8m6kAAJlCSAiMu5554rn7ztkzJz5ky5/LLL5F3vfre8qDfgUuuflzTSxI0QBu3t7fLRj35Uzjvv
PLMKEYTLT3/6U9dEYIbVxzfeeKPcfMstRhAsVQHzsY99TMDWDSILAnrF8uVy++23G5EFgfr+979f
nnjiCVcwhIAOhULywQ9+UK666ioTZZs5Y4Z85StfcY3AwrG87rrr5CMf+YhEIhG5UIU+fidHenp0
UQb2GGviJWBSTJc5oqMTH+OpefTJ2al3uSfu2vdHeZYN6+ndqQ8mv/FfF7KrsR65+tdXj5r85k4k
QAINI4CbLwRLd3e3iVrNnDVL5s6dayJsDSukDkPwb9q0LlmyZImJugSDIVl++umuEQa4fvq0uRdR
K7wfGhqS5Sq2otFo7dfWOniV2hUi+kSNoELgDwwMmNdly5YZgVoq/0RvA7fOzk5zHoIf0vIVK4w4
xfF3Q4KPq1atMk3ng/G4zF+wQKZPny5YjpVp6hEoKQCxfFpMQ/3Rjk7xB4I1/cCDobDE2rsk0t4h
nhr6ibS1eSSsF5f2ji4JR6I1PWGiXJQfUxsh9cd50nC41j/a3qksOnLL4zk3wj1IgAQmmQCifOse
fFA2b95sIn6PPPKIPPP0067pw+bVZTP37dsv9957jyG1e/duufvuu10jUBHhQ4Ttt7/9rfT19Rm/
fvWrX8nRo0ddI1JxjNevX28ifni/YcMGWbdunWv6AaKv3+HDh81xTWmzL9j9+r//20QC3dIPEH06
f/nLX5rIOHqf3n///ea9G/t6TvIlZUoUX7QUHNr/g9Le2SVYh1fjXjKSyUpf7xHBCWsnzI8niEis
XUVTuy6e0aY2ch2v+48esX0xQzlRFW4hCD/4oH8J7YswONBnW4x6dA3hjmnT9GLvN37Dr4G+XkkM
Daq16h2rkT+gorFdRbAlYLN6Aew72qNPlClbLLQgJhIgAZcQgIBZoBEN9MF67tlnpUdvwG66sSEK
hIgaolYQCtu3b3eVf9ZhhH9oyty4caOrxAv8A0NErBYvXiw7duyQgwcPuooh/AM79PXEQIutW7ca
n+3cWy3+zX6Fj8cff7zM0ObpZ555xkRT3SJQm133l5r9IgEo0tE1TRC9gwBCwomZTCaM8NGNVfng
ROnqnpETkHk2+nt7ZSg+UFU4GeGlUbfO7unjyuo9csj8aKr9WGDDEqFGPRpLbZIZTktvz2HbQlQH
yCiLUAGL+GC/Csm+qvUY5zw3kAAJTDoBNBPiBgfh58abGq5dEKrwzU3iNP/AwT/4iShbtWtx/n4T
9R7HF8fZzccY/iHBRzcydPvvZKLOpalezrhBIG0lOno6OkFVMCIVSEX94PFUj7pZsHPlIX+BFVWj
JVusrd0KXj2jfhzbOJL7oY3bfixH8btSN4hSfIr342cSIAF3EsAN163CCsRw7XP7tBsQfm5OuG6X
una7xWccY7czdPvvxC3HstX9KFBUeKpLJoZyES89SXGiQoKh+VfnTbBV14w+Haa0idQSYLCR1X3R
bGonIf+wRuoyppk1597YNt2O93YSfB7Jjoo+3QH7pdJJ251ZFYXWO2GKMmXq/ubpXOcRYyIBEiAB
EiABEiCBViZQMA8ghE5Gh4FD/CBiN6LCDX3vEnH0m7OXYAMCDqlNbQwPZySufffs9iHEfkZoqR8e
LwSgCrdUUuI635QVNkeeSgk+ZHWy12wm15SCfohJHXU1qCPDTOUq7Tz6nZow9YAv8AOjoIYGBo1A
trE7s5AACZAACZAACZCAawmM6wNoeWqF0NGfotYEGxCTEJI1JVVhiCTW4wPEYE4Q1uiDOt4IFjXV
nzuRAAmQAAmQAAmQQBMIlO3MUY/osvys24aqxywUZB0JETz81ZPqrkc9hXNfEiABEiABEiABEmgw
gYI+gA22TXMkQAIkQAIkQAIkQAIuJEAB6MKDQpdIgARIgARIgARIoJkEKACbSZe2SYAESIAESIAE
SMCFBCgAXXhQ6BIJkAAJkAAJkAAJNJMABWAz6dI2CZAACZAACZAACbiQAAWgCw8KXSIBEiABEiAB
EiCBZhKgAGwmXdomARIgARIgARIgARcSoAB04UGhSyRAAiRAAiRAAiTQTAIlBSCWTrPSsXfWFruv
ug6v/jOppomYcyVbNmqZzNnax7Jh1/OCfHm+186iwCI/kAAJkAAJkAAJkMCkEii5Ekg4EpVQKKyO
tUkyOWTWAs7TQZUd1oxtXp9EohHx+4NmGbhEPK52EpX3K/rW6/NLJBYTr8cnw7qm79DggGSGh4ty
Vf4Y1DqEo1EjRNNpXU9Y1wK2RGHlPUe/1WXkwAJ2dEE7Seh6womhuK1dmYkESIAESIAESIAE3Eqg
QABCHIUiEYm1d5r1c+G0P+CXkeyIDMUHx7ZVrIyKpqgKNwgnRMwQA/T5/ZI5kpF0OmXLRpuuIRzr
6JRAQAUk9peACkGv9Pf22FsXWOvh8wekvbPLrOMLG/5AQP/3yGB/r75WT2ARicQk2tFhxTGNzayu
a5xUIYj1hZlIgARIgARIgARIoBUJFDQBQ9QEg2EjbiCActEy3aYRMLuCx6PiDcLNpFEbbW1e8QdH
t1WhhDJ9Gv3zq4Az5etnfWMEHKKCOZ+qGNGvA8GQtHnajtnQbUH1Af7ZSahvQPND5qFM/Fnb7OzP
PCRAAiRAAiRAAiTgVgIl1BDiZYUpJ4AKt5X7hL2LLSBYZle4wW65vOW2j/PFROfgRWGUrtivcfvl
bShblkZDmUiABEiABEiABEiglQkUCUD0c4ubZlZEu/CXzWbNtrY2e8Inm8lIKjFkmFg20HcvlUza
4oR9MsNpzZ8w5edseCSpNrEdn6sliLdc/uExG/A+OTQoGfXPbkok4mORP5QLFk77Mtoti/lIgARI
gARIgARIYKIItM1ftKRQ2aG5VZtPg6GQ+jBihFsqoQM4bAgvy2mIJTTBot/dCESTirdhhwM40FQb
DEfE5/WaQSDodwcB5iT5/D5t9o2YpuDhVEoSo8LUiQ00A+NPsUhaRWkqBSFbXYQ6KYN5SYAESIAE
SIAESGAiCYwXgKZ0aEJL5OS/t+8aonC5aF1t+6Mky4b1ar/08Tlrt5HnP1SgAyE83gtuIQESIAES
IAESIIHJJ1DUBGw5ZIk/fM5/b31f/fVYU21t+5uSR8XWMVvVyy2Xo3Ybef5T/JXDy+0kQAIkQAIk
QAItRKCMAGyhGtBVEiABEiABEiABEiABRwQoAB3hYmYSIAESIAESIAESaH0CFICtfwxZAxIgARIg
ARIgARJwRIAC0BEuZiYBEiABEiABEiCB1idAAdj6x5A1IAESIAESIAESIAFHBCgAHeFiZhIgARIg
ARIgARJofQIUgK1/DFkDEiABEiABEiABEnBEoLkCEBMn15kwgXPdqW4b8KEBftRdERogARIgARIg
ARIggfoJ+EqZwNTHXp/PSJ6sLuFWi/TBxMvGhoovJ+vv5vuD5eA8Hq8uAZdxvAycZcerS8m1tXnU
B62HUyGo+XP18BsGWNM4JwTzJoe2CuIrCZAACZAACZAACbQIgXECEGIp2t5u1gKG8EsnUzLQ32vW
9LVbJ5/frzY6BK8j2RFJDMUlPjiAtd1smhjR9XfDxgYEHMTbYH+/pLCWr93VOFSjRaIxCYWjuhaw
CsB0Wvr7eiUznLbpg4hHy461d+rayEGzD8of6O9zLiRtl8iMJEACJEACJEACJNB8AkVNwCMqmqIS
jqhoUiHo0b9QOCJRFVJOomfRWIcEAiFdRK5NI3getdmun4O2bKAcr9evwqvDRBCBwOvTzx2d5tWO
H8gTCIQlEms35SNe59fyIWztxu5gA/sHIxETBUQkMKRc8GfHh+YfOpZAAiRAAiRAAiRAArURKBKA
beILBIosqSAL+E0UreiLkh8RscPfSF7DMUSXT5uU7Savz6vRN81vRQz1FUISdu0mv7+wPIg2n9ps
s2kDgs+nwnPMh9GC4RsTCZAACZAACZAACbQygQIBCJGUGc6Mq4/p+2aJsXHfFm7IZrOmv15BpE0/
2O0HiP2ymYzqrmyBYfiGvoAFdgtyFH4w5Y0cy42WY/g2on92Uymfsxn7+9sth/lIgARIgARIgARI
YCIJFAhAFDwUH5DhdGrMh2HtO5cYHLTd7AmRNTQ0WDBoI6l951KpxJjNim9UqQ1rP72huJY5mhGv
Q+rDsPYFtNMHEGIvlUzon/YZHE0Qj3Gtm93mW+SDD8Nm4EfOSDqVkuTQMZuWbb6SAAmQAAmQAAmQ
QCsRaJu/aImls8b8xsjbQEgHPqgISqnoQUTOacIAEJ8/oBG3jLHhJPJmlRXQwRdebbaFCE3niVLr
+2qvaMaFjTatz7DWA8LSacJAkEAwZCKHYIH6MJEACZAACZAACZBAKxMoKQBRIStSBhFVa6rfhvYk
VHk6uT40hkWtDLkfCZAACZAACZAACTSaQOFIiTzr9Yguy0z9NnQcce3607hRvw/1CVCLBV9JgARI
gARIgARIwC0ExvUBdItj9IMESIAESIAESIAESKA5BCgAm8OVVkmABEiABEiABEjAtQQoAF17aOgY
CZAACZAACZAACTSHAAVgc7jSKgmQAAmQAAmQAAm4lgAFoGsPDR0jARIgARIgARIggeYQoABsDlda
JQESIAESIAESIAHXEqAAdO2hoWMkQAIkQAIkQAIk0BwCZecBrH8S5/onUB7zAXWvcULAMRs17o+i
G2EDdphIgARIgARIgARIwA0ESgpAj8ejS8GF1T9dCi6JpeB0DV6Hyefziz+oS8FlspJMJlVEZR1a
EAmGQuJVO2YpuFTS8f6YBDqk9WjzegTr+MKO0+Tx+SQYCCoJZZFI6hrHXArOKUPmJwESIAESIAES
cBeBcQLQq4KnvbNLIOA07CbZyLD0He1R8ZSyFYVDtCwUDkuso1ODdmhhbpNgKiF9vT26ju64ZYfL
0ojGYhKOtpv9IUTjgwMSH+gvm7/4C4i/jq4uFaEh7C5ZFaCDvb2SSAzZXloOaxmDhVfXA0bKhNNa
j6OSGXYuiIv942cSIAESIAESIAESmCwC4/oAhqMx8avwyaURjcD5VIhFoeNsJY+KpYja8Hhyognq
KxAMSjAYHmtKrWQIAtLv90soEhvNlhON8MGn263m2Eo2NJMEwxHxB3LiD3m96k+hXxUtqNcjEo5o
mVp/K0EQhtSuLR+snfhKAiRAAiRAAiRAAi4jME4Aer3HBI/lK0RdLppnbSn/6tHIG/IWxPpG2lQQ
jiuqrJE2zVtcnlq1bQNlm/LyRCtEG+x6PHkby3oAvds2FvnLz2aEbR39CfNt8T0JkAAJkAAJkAAJ
TAaBAlUGkTSsfe0Q/cpPaW3+zWbt9eFDvkwmYwSUZQP27Pa/gzxDEyv6HaIZ1yR9hU1styffJFde
XjVgCz5ktE+inWRYlOgzaJrClRMTCZAACZAACZAACbQqAW9HV/dtlvOWSEL0LNfvbUSSQwlHfe9g
C0INUUNE20ZUEMbjA5K02/dOhRrEV0YHW6AfInzKDKdlcKAvJ+r0c7Vk9hkduIJBJEgpFbaD/X1q
254ANCxQD2069uogEojYRDwuQ/HBasXzexIgARIgARIgARJwNYG2+YuWlAxn5ZqCVYhp5K3WBBGI
/nh2o4fF5aAZ2KPiK6s+QBTWknJNwTqYpd56qPDMqiBkIgESIAESIAESIIFWJzC+w99ojTI1TP1S
DKMe0QVbiNZlhu1F7IrLtj7XKj6t/fFabz3ybfE9CZAACZAACZAACUw2gYI+gJPtDMsnARIgARIg
ARIgARJoPgEKwOYzZgkkQAIkQAIkQAIk4CoCFICuOhx0hgRIgARIgARIgASaT4ACsPmMWQIJkAAJ
kAAJkAAJuIoABaCrDgedIQESIAESIAESIIHmE6AAbD5jlkACJEACJEACJEACriJAAeiqw0FnSIAE
SIAESIAESKD5BCoIQKx9Udvky2Num8mb67CB/a2/MaMO39S7vxaX41BHPRy6zOwkQAIkQAIkQAIk
0EwC4wWgEW0ifn/A/GFJtFoS9vMHgmItxebcxohZTs4fDJpXIwSdGxGv32/8qKkeysLUwx80LFB8
rSuS1OA6dyEBEiABEiABEiCBphAYtxIIlk6LdXYZ0YQS0+mUDPT15pZBsyMGVTRBtEXbO3PrCevn
ZDIxug6vzSia7hOKRCQS6xCPLgeX1XWB44MDkhjCOrz2BWm0vUNC4YgBh/WJB3Qt4GFdE1hVndlW
6T8IPZ+Kx5ja8KkYRkonk2pDWej6xkwkQAIkQAIkQAIk0KoExkUAw7GYBEMRE/lC9CsYDEkkGpOR
6popx0AFZCTarhEzf86Gfg6FoxLQaKCd6JklvIz403WAofc8Pp8KShViPr8tG2i0DYbCEla/UQcT
xQsEJBpr1/fjqlz62Gm54Yj6rfW3bATDYQmqoLRTj9JGuZUESIAESIAESIAEJp/AODWUi3YVRuq8
KsAgguwkrwo+r9db0HsQe8KG3eTR/T0eL3RcLmk0DuV7vPZsaHYjFvPLwzav7t8GUWkjqWwUn9c/
LqfXp34xkQAJkAAJkAAJkEALEyhQQ4hsDafT46qD5lMNe43bXmoDmkfxVyAX9UMmkymVfdw26MxM
JqvFFeYfGckaGzZ1qAwPaz3yXMZ+aEp20nybyWq9i1LWZj2KduNHEiABEiABEiABEnANgQIBCK8S
8UHT1y3nYZukUykZGkTfO3sJAgv99fIFX2JoSFLaD7BAFJY11yYZFW9Dg/ExzQlhGh9QmxB1NqxA
7KG8VHJotBS1qcItPthvW8iiTNR7OH1MBKa1/2BS68JEAiRAAiRAAiRAAq1MoG3+oiV5cbJcVTAQ
BAMgkIZTaclq9M1pQlMpRgCPqCBMq42CcJxNY2iO9miTLaJupSKTVc2oEjR9EbU+2D87rFFFeyp0
zDSaon1+nwkmZmBD68NEAiRAAiRAAiRAAq1MoKQARIWsgQ52+/6VglC/DZ2BT+Xp5PrQGBal+HAb
CZAACZAACZAACUwGgbKjKuoRXVZF6reBEbyWtdpe6/ehPgFam9fciwRIgARIgARIgASaR2BcH8Dm
FUXLJEACJEACJEACJEACbiBAAeiGo0AfSIAESIAESIAESGACCVAATiBsFkUCJEACJEACJEACbiBA
AeiGo0AfSIAESIAESIAESGACCVAATiBsFkUCJEACJEACJEACbiBAAeiGo0AfSIAESIAESIAESGAC
CVAATiBsFkUCJEACJEACJEACbiBQdh7AeidxtvZHJWudi89tNmqthxsONH0gARIgARIgARIgAYtA
SQHo9fkkFAppnjZJJBKja/Bau9h7DQRDEggEzTJyyaG4Wc7N6azOoXDELEmHZdyS6ofT5eQ8Xq8E
tR6eNq+kUgmzrrE974/l8uqSeCGtC8QofMhkjq0NfCwX35EACZAACZAACZBA6xAYJwB9un5ve1eX
4BUpGA5L/9GenHiysSwHhFI4EpVoe4dgTWEs5RYIBo0N2+voajnRWLuxg6gbbPj8AxLv7zNr8trB
i7I7OrUeKkKxmEgoG5FB3X8oHrepQ0dUwIYk2tkpPq+uBaw+BFWQgsXwMNY2ZiIBEiABEiABEiCB
1iQwrg9gOBoz4g9CDn9eFT/YZlM1GdEHAZgTf6qaVLL5/UEJaCQO9qol5IH4DKkNpNw+OVHp02ic
HRuaScsLq/gLwIDZB/5YflXzIfd9m/qgEUgj/nL18GlkFILYlg/2CmEuEiABEiABEiABEphwAuME
oMc7bvZdSyIAAEAASURBVJO0qXgyYTQb7kFomahdXl4EDj1t4+3mZSl46/HoGsAlCmyzaQNyzQuf
8xJEG/yCbbvJ4/GOy2q2oUJMJEACJEACJEACJNCiBApVklYilUyOVgUiJyd00qmk7ahXJpMxTaSe
PJEE8ZXWfnx2EkTa8PCw6WuH90h4Rd87bLe2VbOVSqVGuwwes4GmW/hnJ2ncUH1WG2PpGAtEFZlI
gARIgARIgARIoFUJeDu6um/Ldz6jIgn6xqsDKLIjWUnEB2VocDA/S+X3unNOqHlMMzCEW3ygX4Vl
wrZ4g2CEH/BBd5JhFWKD/f22B2BAJGZV6KHPIZqwkVKJIRlUP+w23yICCR/wisEksBUfHBAMaGEi
ARIgARIgARIggVYm0DZ/0ZKS4SzTh09rNqLCp7aUa26FmBxRIek46Y5o8m3TJmn4kLORi8I5sYXm
a+xlewBKCeP1syhhlJtIgARIgARIgARIYJIIjBsFbPlRj2DK2RhR0VVSW1pFVH7VKB6aYUfGmmyd
iz8UYMRj5ZKqfls/i6pFMAMJkAAJkAAJkAAJTBiBcX0AJ6xkFkQCJEACJEACJEACJDApBCgAJwU7
CyUBEiABEiABEiCBySNAATh57FkyCZAACZAACZAACUwKAQrAScHOQkmABEiABEiABEhg8ghQAE4e
e5ZMAiRAAiRAAiRAApNCgAJwUrCzUBIgARIgARIgARKYPAIUgJPHniWTAAmQAAmQAAmQwKQQoACc
FOwslARIgARIgARIgAQmj0BJAZi/XFr+e0duYgkQswYH9qpvQmhH5RZktsrVSaSNPwVf2vqQX//8
97Z2ZiYSIAESIAESIAEScCGBkiuBhMIRCYXDRrcldA1fp+vfYgm3cDQi/kBAV+IYkaGhQUmnUo6q
jzV8w9GoeH0+XVs4LQldjzgztiqIPVP+QEjrEdE1idtM+UO6rrFTEReORCUYDBktmxgakqSuKcxE
AiRAAiRAAiRAAq1MoEAAQhyFQmGJdXaKR0Uckj8YNNGzxFBc1+atvhwbbETbYxKJxsbifr6gX3qP
9EhGhZydhHJiHZ25suFDICg+FYR9R3tsCrgRFY4Bae/sEo/Xa4oMqIiD3cGBPv1srx4RFaCxjq4x
l/3+oCkfItAOi7Ed+YYESIAESIAESIAEXESgoAkYoiYU0YiZij8IOfyNbfMUZC1bBZ9G7EzEDDl0
f/x527AtJ57K7jj6Bcr0+QMmemjtj1eIQL9ux/fVErLAB49XfcYH/cNLIBjWaGCB5i1rCvUOan6k
MRYaSQyEVBAzkQAJkAAJkAAJkEALExin6lQqja+OEVAlto/PacRSic1lt5fKWy4+V9K3EgaO7Z/3
Dm/bYMFePYzZY7sfK8XB7sd24jsSIAESIAESIAEScA+BAgGISFciPiTZbNZE/hAFy2ofvqT2fdM4
mC2v0U8vqf0GkbA//jLZjKRSSVv7I386nZJ0Mmn21f9gSPvwJbUJeTi3rYoleJpSH7LDGZMfNpGS
iYT2Scya99X+MyyGNL8yseoBLrDLRAIkQAIkQAIkQAKtTKBt/qIl45RdQJtbgzp4AimZiKvosSfe
LBAQTNjfDAJRQYj+g8Mq3pwkjzY5hyIx8fm8MpzWQSBqAwLMSfL7/caPNrWVSqZMXVTROTEhwVDI
NB1jp4SygDBlIgESIAESIAESIIFWJlBSABZWCIKpVFtoYa6p++mlXv+pe2RZMxIgARIgARJ4qRIo
aAIuDeGlLP5A5KVe/9JnBbeSAAmQAAmQAAm0LgEbArB1K0fPSYAESIAESIAESIAExhOgABzPhFtI
gARIgARIgARIYEoToACc0oeXlSMBEiABEiABEiCB8QTszYo8fr+X3BZMB4NRyJgWZ2Qka6aHwTb8
WcmabgYjmPEer9Z7Kw9fSYAESIAESIAESGCyCVAAVjgCmNMQfxB+YV0buatrmnRP65I5c+fI7Fkz
pUuXmovGorpMndfkG9D1ivv6+mX//n2yb99+6Tl6VI72HJWBeFy8Kga9mg9/TCRAAiRAAiRAAiQw
mQQoAIvoQ/ClUildS9gn8+bMkVNOWSpnn322LD/tVFmwcKEcN3uWhFQMQvRZEb8iE2bOQ9g4eOiQ
bNu2XZ599jn5wx//KE89uVH27tur9tO6rJ1f5zgk/mJ2/EwCJEACJEACJNB8AjbmAWy+E24oIZPJ
mhVIZsyYIWecsVouuehCufzyy2SeRvuwjnG9KaWTWe/ZvVvuf+BBuee+++TRRzdolHCfBAIBRgXr
hcv9SYAESIAESIAEHBGoIACtvm11zIOH/nGjy7A58io/c5NtIOKHVUrmqtC7+qqXy+uvv15OO+2U
pkbnUOZzW7bIL3/1a/nPH/1Ydux4wUQE2Tycf+D5ngRIgARIgARIoFkEygpADF5Acrr8GvbBwAgs
v+ZR8Qf9NjKS0a3OhCRs5AZQeHR/DL7IrU8M+/YT/NCmWv2X1fWI8xPspzUq194ekz97xTVyy81v
l2VLl+ZnmZD3z2/bJv9+5w/kBz/8kRw8cNBEG8s1LU+IQyyEBEiABEiABEhgyhMYJwDb2jwSibWr
EAkZzYZ1gAcH+mTE5jq8EFY+f0Ci7e3i9/mNGMQ6vvHBAUcwA1o+/PCqgMtkhyU+MCCpxJCjiGIk
GjNrAXu0Tum01qO/TwdrDGvELydIr3r5lfLe97xTVqxYbsSmIwcbnPnJJ5+Sr33jm/Kzn//CMGP/
wAYDpjkSIAESIAESIIExAt6Oru7brE86qYmEVTRFou0aOdO4mUbw/NpHDRE4CEE7kSlE/WIdXRIM
hY2ARAQO/dyGh9OmqbWaDSMgdXBER+c0FZJ+Y8Pr9akffuODnUggbARDIWlXP0wEUIOPPvS106hk
r47MRXPvJz56q3zof71fFiyYb6teFqNmvc6ePVuuevkVsnD+Anly40Y5dOiwaYauxqtZ/tAuCZAA
CZAACZDA1CVQIADRVBrVqFt+9MkSIElE32wkj46OReTNakLGLrCb0X52aR0Za9mrZAoRxHAkWpAF
kUmIUETwqtlAY3MwHBF/MHDMhorCpJZ/uo7m/dI/fF6uvvoq0+/uWIbJfwdmp59+mpx15hrZufNF
2fHCzpaZRxCiG38Q6NYrBtbkPleeN3HyydMDEnBOwJznOO/1nMd5npsyCr+DY+d7vtVq1638vHxP
AiRAAs0mUDAPibmgqcAS0eZfjQZaKas3cnxn5wKGiyHyFiRVZLhA2k24gJri87oNwiZs520qa25k
rDzkzgkTXJyvvvIK+eitH5BZM2eW3dcNX5yxerX83299XW771Kflzh/80IwSzhfUbvARPoBp7qaX
lZBGXDs7OyWsrxg1jfkRTR9O5NPjNqhzJKLPZSqZkqFEQuI6N2JCX3FOIR8eOuycX26pe7Ef1Xwf
95soNlDhcyXb9ditUGRDvqrkNwpws+/lAOB8x6Ax1C0ajUosFjPnPN7nZgvQvsX6Pc5vnOsJfWgd
0i4wg4Nx81vBuc75QMvR5XYSIIGJJFAgAFEwLlY+vYH7tNkVCZG7RHzQlvBCfoi0oaFBiXk7zEAQ
SMF0KqkXwwS+rppwYc2oUEgk4mNRQNwo8Dmjzch65a1qA+IR/QWHtRka8/ml08Pymlf9hXz4A++V
SCRSfX8X5ICY+vxnb5dZOuH0/7njq0ZAu0UE4gYIMdfV1SWnLFsqZ511phlAc9KJS+Q4nTuxu3ua
aW437feGZU6E9/cPSE9Pj+zbv1927dotL764SzZv3ixPPLVRJ8/ebwQhugu4pZ52TgOcm0m9yVcT
MxC4mPvRSYLYwHyS1RKEh9uYQdxj1ZxKyefLdQ+plMct3+FY4JzvnjZNTj31VLnowgtkmc4Ruvj4
42XOcbPNdQWtFLmUG2B2tLdXu3Ickj179o6e60/LU9q9Y7uO+u/V79Ba4m/xBx+3HB/6QQIk4JzA
uEEgMIEnVPSZQxrWGxAufk4SAoDos+fTQSBZ/QABCGHoKKnQy82R5xttPlYbjgxAK7apAPTL29/2
Fnn/375HQnqjbLWEyOkdX/kX+cI/fElFRnZSb/TwBTfBpTpa+rWvvk4uvvgiOWHx8TqSur1mrBA4
hw4flmefe05+8cv/ll/84lf6ADFUMRoIAYpz0hJd5nydhBspeKDuN7zhdSb6mS3zO8GI+HXrHpLf
P7hOReC4Z66S7PDQctqpp8grXnGVslBhgR9VUYJdRJp+9OOfqIA+4Ir5JHFMIHbfeOMb9NxYrNHf
0tcOHLNHHnlUfn7XL1zhdxHasY+oD87RefPmmTpdc/XLtd/wAolpxM9pgi0IvxdefFEee2yD/NdP
fyYbNjxhzFSLljoti/lJgARIoBqBkncj3FyH9caCVMuFCUG6YRUK6PNXqw3c8EzUEPc9E/Qz/xl7
dv7DxRY3x3fccpOKv3e3pPhDPRHZefe73iGIJiASiGhPLcfEDrNKeZLanNXV1Sk33vB6I6jnaqSv
EQkiH7bwd4kKyund3fLlf75jtDmtsARLgC5atEguOP88WbhwgRGLf3zkT+aGikgc7E1UghBdMH+e
vP99760qCNDt4Hf33KP+5UbGV/MxpQ9N5513jp67762YVU9zefrpp01EFaJqshOOEZZNfNc7b9HI
2HEV3Vlywgnyq//+tYluT8Y5XdE5/dJ6yHjd9a/V2QLeJSdqhLuehDoiao6/lcuXm4eor3z1G3LH
V//FPMyUY2BF3HGscYxxDpXLW49/3JcESOClRaCkAASCRlxg6rehos+Z7hs7eul0Si6/7FK9cEP8
oU9j6yaIQNRj9+49Ok3MXRMqckANERBE+m7/+9vkZZdf1jyQeoND02GpBGGBm98bXn+9vOdd79Rl
+ebrPJO5Jrd4fEh+/ZvfyBe++I/ygg6ccdrUWqo8u9twbDJmWqHKe2TRr9VhwkNMtYTR9TX/SKoZ
r+N7O60GdgZ01eFCXbvCf/Rrfcc7bpL3vvtdZX9z+E0e1gj2Ee3agAcQJHQ7QYQQ3U06OzoEqwtF
o+O7nsR0wN2qVSvMQ145Xoi440HnvHPP1YeigGC6qMefeNL8Fuq/vtaFiDuTAAm0OIGyArCV64W1
dk866ST5hy98VmbOnFGxKkeP9uqT/rBpwkPT1UQnXPj7dX7C4eGsTJvWVbY5rLOzQz6tAmzX7l3y
pz89VvaG1Gj/EflbtuxkuePLXzLzJTbafr49DBR59NHH8jeZ9xBC4PTOd9wst37og+MYRSJhefV1
18oiXav57Te/wzXNoeMqwg0tQcASf7d/6jbTvF/sNM7Tu393j/z27t8ZMbZ37z7zkGQJdggzPBig
uX/G9BkyT6PEp2i3ibPOWqMj/M+UOXOOG3vAhsArl/AdJqf/6h1f1n6Hp5hsR3Uaq09/9vPyve//
x4Q+6JTzsdJ28KBIrUSI35HA5BKYeMXT5PoiUgRB8ImPfVSfnBdWLA0DEd7x7r/RfjlH5WQVjOes
XWv6tZ245ISmX7gQOXjg9w+avy26LBymqLn97z5pyi/nNCIJH9f5C298019r02dC+1o1t8kPkb8l
SxbLl7/0j00Xf6hzT89RFbh7TOf4fAZoAjvllGWm6blSM+eZa86Qt/z1X8nff/qz40SiZS8nJhGN
Kx9ds27gvHlZ1Jy9Qvy0KjucHzjfbrnpbSXF34bHn5B//P/+Se655z4Z1gdH1LW4vrBhdVd4YXCn
DvrYIQ9q/8//+6/fFcz3eemlF8tVV16pUb21KuLKd1nAA+lb/vovx8QfjgKajz/wvr9Ve+uN3YmM
dlc7Cyx2ENBggsUEzIwO1Xbk9yRAApNCYMoJQHPxvvmtcuWVl1cF+sijj8r6hx7SkXgBHY36jNyl
AxBmzZwl5+qF+c1vfqNccN65Db+Rbdb+Wv/6r9+T+x54QEcGvqiRg2ETKUDz0U9++nO56KILK5YJ
kXrz298qX/ryHRX7DVWtfJUMuIij2ervPvkJWb1qZZXcjfl66/Nb5cjhIzoCvVDY4sZy6SUX25q+
5+qrrpRvf/s7sv/AATMYId8z2EH/qe5p3ejjoF+VEoFYNjArR44cMVHH/P35vjoBMA6Fjs0iUH0P
d+VA1O1lL7tMbtG+w8Xpu9/7d/ns575gzg30xfXW8ACG0e7/9m/flx/96Cc6J+lppuWhlFgGR0wt
g3XJixNG2S9ctECwjKRbEvxFEzW6iqxauVIuV4bo8/rDH/7E/Obc4if9IAESOEZgSglANP2iqeTm
m96uXQerdx78kw4eQD8yNNXgDxexw0cOm3529953n64R/AojthB9QrPPQZ3S4QWdoHnnCy/oVCYH
zBQPCY3EQbxhxZSAXgAxTQSe8hdpv5352vSDwQ2Y0gWC4hvf+o58/9//Q/bt22/ECZ7wI5Hc1CAQ
Hc8++5wMDAya9YmPHaLCd7hZYGDLI9pU+sADvy85WKJwj9o+4UZ4kwpN9KOcqLRp09OS0MEPmEsw
P4GT3Q74YN89vVv27N07TgCiORvTd3zx859R/adrTJcQgOCL+dve/d73aVP7o3peOJu6Jd/vl+p7
O789N7LBQ8/06dPlIx/+kHQUjWzHWt23/d3fm0FHufn+aqsBItgYJIPZER7bsME87OEcKyUCEYE/
fKRnXEE4j/GgVGqfcZknYAOum4j4/e3fvEfedOMN0qVdWZCeeeZZ8zA1AS6wCBIggRoITBkBiIsQ
Lq7v0n5iiOJVSxBcW7Y+b+YqtPLiggqxgT80sUKsPfzHR+Rijcpt06ftp/WChmkcEGXEzQJ/iCFZ
UhPvsXax15ub2BgX+hOXLDFP8c8+t0UefviP5kIZDhcKHJSPMvft26edyY9UFIDI26Edy2/WJioI
FAg1XHwbmVC/k046Ud6qzamVmlwrlQm+6K+Epm3cyGAHc54FAkGdPDdaUljhhugdHdhRbBv1tJX0
PCih68yuOEfQhIYpPaoldN5HfqaXDgGc9699zatkua7Gk58efewx+dTff9oMUGrUAwGWzKw0Yh3X
Igxu+vf/uFPOOfss85uHTzgnf/yT/9Jpk7aMe8DJ93mi3+Oad/LJJ42JP5RvBkdZF8eJdojlkQAJ
VCUwZQQgonAYoXrNNVdXrTQyIMoDMVfu+gRRBQG3Q/vvYI46NEtCpGE7/ioJI1yk8YfZ/3Hz+MPD
DxvBU+mCD5uDOuF2MpEbSVitEpdpk+gV2szyXz+7SyLqZ6MS/IZ4+6u/fJNZJ9mJXRwDTMly7333
y9bnt8mhg4d01Y8hQZTURFk1ShrWybk7dTqZudoR/pRly2TlyuX6eoqyGjDN8B69kRQn3JgRHbWT
Xty1yzT/Yv3oUgl1q5ZQnp181ezw+9YhgGM+e/Ysef3rXlvg9BGNwN32d7eb6D9GBU9kgtj8n/+5
W9769nfIdde+0qyuc5/+tn7281+Yh09cM9yUwJCJBEigdQiUvku2jv/GU4gWiDM8vdsVQ2j+s9OE
Arv4c5Isu/oQb57yKwm/fLvYD/vYSRCg1117rfzmf36rYsVeXezYRVQTTdfX6FrJTtK6devlX77+
DZ3seL1pJsO+1g0K9dJDpCknjK334Irm3hUrVmiEo92sEFJKWMPO/drcDXG3YP58GCqbfnv3PXLw
4AHlPrE367IO8YuWIIAI87nnniNLTz65wF90BcFDTT3NvgUGHXzAtQC/EQwWQ19l/I7gJ7ZZvy0H
5piVBEiABAoIuOsRssA1+x/w5LnmjNVy5RUvs71T0DRFxlzTzIeIEyIM6EtoN2Hi5AvPP9/cFOzu
Uy0fBOB5eiO000wKW2CPlUre/Ndvk//3m9+ayARulvhDBAN/uGHl+ln6jSBGZ3F8D7GHJmLc3P77
1//P7GuJ53w/sf+WLVvli7oaCib3LpcwiOdrX/+mlhWwLaTL2eL2lw4BPEDifLzkoosKhBUi8v9+
5w9z3TzsPpk1ARsGLkHw4beBh0mKvyZApkkSeAkSmBICEBfwP//zPzMLs9s9hmhqtObWsrtPM/Ph
yX6eRremd0+3XQymu3mdNllBSIFBvQk2INguv/TSsk3jxWUg6vfZz3/RCDM0mZcScMX75H+2bmrV
mtdw4/vPH/1Y3vM375OnntpoxKJlBwNsvvmtb8uHbv2IWWuYN0iLDF/tEMDD1xwdrHXhBecXZH/4
4Ud0qbbHzW+i4At+IAESIIEpQMBZ26YLK4yI1UxdZgv94ZymlStXOBYsTsuwmx/ia9nSk6sOACm2
d9ZZZ5q1SXfu3Om4qbrYFm6Ex+nC9qtXryr+quTnTZuf1mbfb5r+cojSNTNBKKKMX+rSYX/QgTnn
rD3bTKiLwTpYHWHjpk3mWELAMrUuAZyD+C3knmdyXQZw7PFnRcEaXTtEsc84Y5XpA5hv+3f33mdG
5WNam6mW8h8YwZaJBEjgpUeguXftCeCJqV/OPPMMswqEk+J6dOmmH2lEyS0XP0S41q97SDZt2qyj
hk+1XRWst3rB+efK97Zvr1sApvVGeMIJJxgRWN2BEfnmN78tBw4cHDdtS/V9a8uBKCluXJhL7T9/
/BMzyhDHD01kOeGXu5GV6kdoHef8G18lL1AWmqfHJS0Po5kte+O+d8EGiCg7HfLBrFo90ulhZV55
4IxHR77XMyk5fMWDHAQepkxCf1As39jeHjPH9Whvn66W02+mXTJTLqnfjYzyYkqWNatXm+ZV6/BZ
q9I0shzLttNXXOPGjsHo+efULzC2xLUpf9QOligsXsoQ5wR+Q6V+R6V8x7GDf7Cfn7AdMwCU9VUb
LbQo/T3pQxs1aD46vieBCSHQ0gIQUQL0LTv/vPNsX6xAFReqb3/nu3LPfQ9IwCURI1xsd+j8gp/R
5tSv/8sdZi1Ru2fABeefp1PW3Gk3e/l8ChRRSPSHqpae11G+iJBMFD/clJYsOUG5xPT44c5R5CFa
wHXbnt27pU/FgiVscBPC8c5ksirokrZEMvY9Tkcpn7B4cWH91H5ab8aHdO3X4ptdkTeT9hECF9MM
zdD57MZDGnVL64Gb/sGDByVTdNMudhwjYzGwqpxwBqs+XcqwV0WaxbzYRrnPOI4QdNN07swzNOqM
QRiYguWEExab+fhCOA/V/rCK8Z06aTpW4cAgn3vuuVd6+/okqA9NTsss9sXw0r63ixcfX/DVfn2w
2alzfmJ6k8lK8A3XBfwm8YCIUxxCa7ee45gv1E7dLXHd3d1t6ogVjxYdv1Da9XcU0YmmMyoMh4aG
zAwEB/R82LEdK5ds1/WNj0hfX7+pf3F0H+d+7jcF4TdiRPvJJ59oIvL5rDp0+cqF2q0FvpdK8D+T
zegcqT2u/T2V8pvbSGCqEGhxAZg182OduWa1o+OBEaVousTULnYuoo6M15EZF8q7dX3Rn9/1C7nx
Da+3bem0U081E1Af1Zti8Soato1oRlzoT1VbdtL6PzxsInF2xKIde5XyIBq3bNlS+ebXvyqzZ83S
m06Z3CpsvvXt75jVGqz+iJjYd978uXKmRnhWrFiuTX3VzxXcdD9z+6dU7CECqEZHk96vzPyQ173m
esEygs5TOcdLWXKS99j+uOG/+U1v1fkwbzGel7KCeiAy8+a/eqs8tXFTSVEM4Yz5Jr/xta/ISScu
KcsctjBK9W/+9v1GZB/zpPo7zLX4oQ++X175yj+T+fPmmxVESu2F3wXm08TfdX/xSjO10h1f/br5
reBY1fMbhoDBijcLFhSOLn9aV+xBFLBs9KqUow3ehmOA1UC+/KV/kMUqipEght+t/WDvwcNXGWGF
fKhXOp3SCdRPlDfe8Aad0P0SfaiZYx4sK9UJXSpQ79179shjj22Qf/v+93UKpi1jD9iwC2E+Z+4c
XSFolazVOQpX6UpBC5VfLBZD0WPprbqM3Ru0j3Kl47NX5z5945vfYqK7OJZMJEACE0egpQUgLpBz
9UK0qMqav/k4cQHDPFo9+tSJC7+bEi6UeLL+0Y//S16pg1raiy6o5XxFv73Z+ndYB0PUKgDBBRfg
xYsWlStmbDu4Yy3SiUrwLRqJmqXgIEoqpWm6CgHyQ+BceMF58tlP326mtYEgdJKKV4Kw9kXEDE3A
TtOI7pdOZ/QPTaqlZFmhReQFZ6cJ59CsWTM1gqbL3VVIiIhGIpGKvqBZF+cWokeVElZfwbkDm07S
mWeuEfRhdZLwkLL27LM1Uni6GXz0tW98q65I4LFzq3DyeES4E4lERZHlxO/a8qq61hTR6xTEMhIE
PlhXOodMhE7PsTfqqhxYNxjXSLsJ0WMTQZ4xXVbqAxNG3X/q9s8aIYzTNhwJyec+/fdmhSBEbisl
CMJiUVicH+dMWxuFXzEXfiaBiSDg/E42EV7ZLAMXuuO0D1y1C1G+OawR+yddAxhNx25MiKhhhY/H
dALpi3VaCjsJN/ITtXl0sw7KqDXhhoKL9cyZ1UchD+mNccuWLRWjI7BX6SZVyU+ImOKoAZq+7Aii
rBEh2rSk4mn+/AVmRZNKZTn9Dk1m1eXbeKvnnLNW7vjnL5WMto3PnbvRYwnCWhJ+F9US+Ng5PnaY
52xVK3H898XHeHyO8ltwzn/of31Al2bcaaYfQnNwLQmsZs6aMa7bw779+1RsZXQ75rCs5YjX4k3p
ffKPJ95X8gffISr7rptvlg9/6AOjfWML7SIPhB3EZJv2u8QDDUbhlzoeud9ibn/sh+mzEEnHNbf4
HEJkMT+6iPyVzh/YRhcA0d82EwmQwMQTcKcKsskBFxD00yp14SpnAiJp+/YdJS+M5faZyO3WRfGB
36+zLQARFVm6dKmIzoOXuwHkIgdO/MaNBc2luLFWS+iDdKSnt+BiX7wP6mHHVvF++JzVfkEJXRHF
yXEtZ6fU9snYdpI2xeGPqXEEECH/5Cc+bgZO7d27b6yZ0kkJOO+7p3WPux709g2oOJp88eekLsiL
yPef/dkr5NYPf7DgYQOD3u5/4EGz/jD6NmJQDbpWtOkAnqAOosJvFaJunkYLIfBO0S4Xc+fOLWDq
9WJ5urjc+pGPm4dFXGuQ8Iqo5DvfcZOJzpqN+h8Gav3XT39e2I/W+lJf8ftGlLV/oE+vJYwC5qHh
WxKYEAItLwDR98RJ2rr1eXPhqzbvnBObjc6LUYnbtm03zcH5T9SVypmuzXRtZdbRrbSf9R065Hfo
qMugRgKqJYz8HRqKlxVosHXzTW+Viy68UG8Ozp7ucVPATewr//IN+cMf/jDJTXDVSPB7EMBNHKJ9
MtIS7Rt3o/Zx++znvlAgVuz6AvGCpQnzWwQQGRvIG0hk19Zk54OYxSjqt73lrwrEH1oU/k7XMv7T
o4+NReSKH67AAXLOq1E8iLnu7mk6u8B50q9CGA+YVn6wWbf+D7nftf5WkbBvQFtUXvPq68xn6z/0
Hfz1//uNiS5a2wpetUCYQF/GUVMFX/MDCZBAcwm0rADERQfNF7N0UICTtGfv3oqRKye2mpUXF+FD
hw7pyLy47X6AiN5B1GYyta3Hiekg2tsx/Ub1EcBHj/aam751UyjmgJGT6Ky/fPnpxV/Z/oybzIMP
rtObg+1dmHGSCFjNkuXOh2a7hXVyv//9/5A9OqDAaf9MvYxIRH83+Q9aEDlxHRmrHREcu44mTTzA
2d0Tosuj6qcRg6ng98UXXShnad9KKz2/bZvc8q6/kR07dpi1zSHm7CSMzP3RT35qeBbvg2mX8hOu
xRDQ+QzxPfojo161Ns/nl8H3JEACjSdg72rQ+HIbYhEXzi59eneSMOVBKyTcRDBwwG6aphzC4aA2
7WizTi2P01oeLvQevWhXS2CIwQwebSIrl9C8VE+q1HfIrt1mNCvlohXl623XN+YrJIBpTQ7r9DoQ
UD4VExjtjRGwdtLCBQsEk7rvfHFXDQIwqwMbCrs9QNBk8SDl4DBjH6xrfeuHPqh9T+eb6L0d3yGa
9upD6T9+6cumebVYRNmxgTwoH38X6NKQ+ZOhY8DbCzq9lNNBUPAD9ZnqCcxwrUJ9i4WuW+oOYY+H
LDvzdk6Gz/ANPiJyjD83Jut+hGNc0/2xyZXC/Q5/5h6s5+JEpZYWgNA5dm8SFlA3HnzLt4JXvTA5
SVj/tp4fHy6EIR0pa+ciaEV8HN0hnVSmAXlxQceE0VitJHfM9aauTdPTurp0neO5FUsACwwuwHQY
hecL+iwlzV/h9orm+GUZAmg6fmzDBrn33vv19XF5ftt20zcNa0VjaqM3v/FGueaaq6qe1zjvMY8g
1pOuJZV+6HGg/kYLRfQR/i4+/nhHbuzavUf++Y6vmpt8rQIQBeLhBKO28xO6vDi8lOTvPqXf43eO
c2fx4sWmyR8DBOu5hjYDFq61GGWPWQlwTYJIcNO1B/6h5Qlrx6PV6ujRo65iiGOMv+Mxu4UKhl27
dpnPbmKIY4rZLTCgFf3rcd+ZqPOwpQVgLT84jHR1Jq1qKaW+fXDC4mKe/yRfzaLPn5sPDfvWmtD0
XM8NqNZyG7+fjlbUpqd16x+S177uhrFIZTyekNe+5lXy+c/eXrFI/CA/pX2mHly3Xo/BsTZoPHAg
8hmPD00RThUxNP3L++6/X2665d06qfGAueDhfMf5B2F47333y0M61+TXvvJ/dFDDNVV9wVx0uIhi
kILTc3hEj3cjEn558N1pwj71/G5NeVo4Iqf5y9bh5oxofS0NAk7r0Ir5wfyGG26Qm97+dhOF/d+3
3SabNm609RA8EfVF1Op0ne7oU5/6lBEH3/72t+U73/nOhImDanXE+YXBQx/84AflyiuvlI3K7jZl
iIj2RAmYaj4iMnn11VfLBz7wASOcv/zlL8svfvEL1xxjMJwxY4Z88pOf1CmxzpL77rtPPve5z+nE
+pUHWVart93vJy7WaNcjh/lwgJ0ks0JCHSLJSVm15kXzL25meLKym5LJVH1Ph3qXwPQuVqi8UrmY
H85bofm30r4T+R1+XHgiRX8m/PX0HDFPV3Z8GByMj+6D/XJ/sIHRk9rgZscE81QhcOTIUSNQcBPB
uY6bBp7MIeDQZInm4K987WvmYljFlIm6oTXAqZDCwCn0tc1PJjpQi2rSfWqdhzO//Jre68MJHlww
gMpK4GgxcVPEw/JvMl/BChGX17/+9ablY+myZfKKa64x599k+pVfNq5fV111lU6Cv8wIrVe/+tUm
Ggjf3ZBwr8DsE9coN/x+zznnHLngggtMc7Ab/MO1AA9E1/7FX5ixAjNnzjTHG9cWp9eJZtUHx3Lt
2rVykU75husfhPTZOs+pmR6pWYXm2W3pCCAGmOKJ30lyMimqE7uNzKvXctOU4+SijShCPRcGlIkf
dNbGxaVLRxpitDDKdOJjIxnZsQXf8p9E8d5udAj5kD9/fztllsuDi7nT4wP/7TTJlyvT7dvBuNLx
QBR386anZb1Gcq+++qqK1YnpCPZZM2eYZv+KGYu+hM5L4bzX7gFWn1Ywhyh1cpPAsUK07aMf/6R5
eNOdi0rKfcR622frk/4733HzWHklMzrciPLxe9ytzcn56bJLL9GJ7+9SYZjWaHZLX+7zq9WQ9/hN
4g/skKyHXxx3a1tDCqrTCH4j8Ad/lX4vdRZT0+5glc8Q792U8DPEYFGwwy8S/eoxdsBNxxi+gRuO
LV7zeTabZUtfETByFetXOkmLtC9Al/YDG0A7uwJ3Y8KJYOb1c+Bcny4DV8/ceSgzrkwQQcDNr1JC
dBI350oDatCEzXSMwL0a2r/jK18zka0y2mAss14PTDPz9a99tdzwhteNbX+pvcGFEaNxn3xqY1UB
iObjbl39xOkNCGVgVPvwcNp0uwBjSwCWE3HljgME/v2/f7Di4C3zZK9lvlNuUjM54VHOntPt+A0/
8OCDugLIG8a6j7zyz18he3RZt29++zumac668SEv6o5X673T8lo5Px7sDmifv+9+97vy1re+1fRf
Q9Mgzp9GPfTVywfH5a677tIVWVaYZfzuvPNOVzWv4hq/efNm+elPfypXXHGFzse5SZeFfMA1D604
v3E/+8EPfqDrVM8xou/fvvc9c+930r2q3uNYaX+ca+vWrdNlLe/WfsyrdYnHeyd0+rOWFYA4uLiY
YU46J2nRwgVm3c+n9KbiVRHjtoQLUEd7h6zRk8FJ2r//gAkb13pi42LT29unoi6hArlyyfPmzzMT
waJptFRCHe655z5z886/iWI7+jucqGvLvtQSOvr/5n9+a6baQRN/pYTW9d7eflnjcI3rSjZb9Tv8
xsHOEi7l6oGm11hU+/dWRjtu99x5rwJQxVv+IwuWXkOZTlO1KU9w3Qrk9St1ar9Sfvz277//96b/
5JVXvMxkxbb3vPud8rLLL5N79CHk2Wefkx0v7NSlMI9IQpvY0f8Sv/uk3ii9OhkzpnDCTQl+TvWE
Ov74Rz+Sh9avN91fMIih1utnM1jBF6y49D7tvxbVh3IMEMD56pYEfoia/tM//ZP88Ic/lIMajEGL
nFsENDjhYe5eFVUQqmC3D1NFKVe3JPiE++gnPvEJ0yUB/SfxkDhRDFtWAOIAQlA8v/V5R8cS0b81
a86QDY8/Ie6Tf7mZ/C+84Hw5+eQTHdULi7dXu0lWMogTET9g3BCqJYi42bNnmVFppfLiwvC5L/5D
7oeWdxNFNOfVr7pOvnrHl111IStVh0Zvww8a/WQQOa0mLHDvDYXSrnmSbjQLJ/ZwXqLfJX7rlS6K
OOcqfV+uTOumkNAHn0jeetGzdT1lfNdKCQwwghCTPs/R/m3583CecsoywR8SmoqRD60gPT1Hze8e
I0wfe2yDbNy02ayUhJsQIjywOVWTqZvWb+eLL5p61nL+NJsNBAzE+mEVp3jvtgSG6Ie/Q+eZBD+3
MkS0F8mN/sEnRCq3b98+4Qzdd0Y5PMNf1GHdeApxouovu+Ri+cGdP8xN2OrCCxye1p3M25U7eXY4
JFeY3dw89OntkM7FdtJJlcUnbgwrdJLnhx/+Y6GRvE+4eRYP0EGUBTdyJhJwRMCmBsmtZeHIsrnx
46Hn8JHDZvULa+9FixaOifVWEkH4bW7Vh+J3vvu98omPf0Quvvii/7+984CTotjW+PEusCo5CksS
liUtEhTlCoqYEPQhKAaCgApIUkBW8fkURBBUEDHLVTArQeUiYgBRVAyoBAUlL+yCEiSpgKKAvvPV
0tAzO3lne3q3v/ox7Mx0T3XVv7qrTp0651SuQMyYiOCF4PE1a9Swqixy4w2yV52m5s2bL3PmvmO0
ieEE7+M/Lrjv3ChY2WmiL3XzZATPh9sZulHws7dxohgWrCmunZi+R6Nu275N1bo50r3f4aAf22in
2LbtRY552gQtiN8BCLIN1OOrXbu2fkdCf4QN07p16/M0W8cNCIFtzdq1oS+mRzEet2p5tnnog2mz
kJ/Vcdn/4nsmEnALAdyPMHvwd55IT09XW1j3eAtGw8sIgZmZ0rtvf+navadMff4Fs1/ybtUkhUuI
k9nl2mvkuWf/IxMeHGfspf0ncuHy4HESIIGCQaBAawCNALjtZ1WdblS7vqoRE8fsd+iQW+Srr5cY
J5JiLrAJwEwbISn69LlBqmlQzWgSljB2xmGJAB39qlVrIrp0ixZnSe1ap8qGzI1RaV8jypwnkcBR
ArDCi2RLNthVYgIV7fwCAiBMEzbpEhYmhlaqmlJFUlJSZPXqNa7Wvljl9f8LjQwmZ4hl+cWXi80+
39D2oU411A46RY3iK1epLCm6VIxAw/jevsUb+shuXbtI8RLFZVjGHWbZ2M1aKP/68zMJkEB4AgVa
AET1Dh78Qzu5LzWOzrnha2s7o5HO8O+4PUPDNow0mq9EqoitwQub2nfV2Xe0aYUG4IQ9D2yYgmnk
IskTHfyaNWvVDvCAOnmE3oarfLlyGqD3Mpn48CMUACOBy3NiI6BCzIkn5cQIDJUBJi/79x1QaTE2
DTNsgntcp1sx6aoCEvbFbtz4NIGzWDTmJaHK6PQxCLdwSkGfgLiWK7//Qb79boUWA/aSOcuK2AWl
fNmy0qxZU+Mocknbi6WihtOx0uUdOqhX4tcyRb2IIRQykQAJFB4CBXoJ2FpOXKShDyJxXvBvtu7d
usjoUSNMBw/tQSISQkdg8Lr2mqvlvnvviXqwOfL3Efnww49MSJu8CH+oO7QG8DrbvGVzRCiu79lD
nVXSjHYgoh/wJBKIkgAmR4g7GS4d1h1aED0/Em2hf16475cuXSZ7dh9fIkXfckGbNiZIcF6fK//r
Of0ZdcHkDoIshDgEx8V7M+lVvlg9mPvOuzL41gy5Zcit6nCw+1gRIU530IkeQkPRfvcYFr4hgUJB
oEALgGgB2Lus0mUavKJN6Biv79VTxt032iyDIK5dtMF6o72mdT46U3jjwb1/8KCB8sC4MWa5xToe
6d/16zfId9+tzOnMI/1RkPPA41eNJ7h48TdBzvD9GvuO/t//3mGMyeE1WNAHSnvtClNd7PU6/j76
ECfHf+vcuyJJRaSqLk+GS7j/dqsDk97CUSfEA926dZusWLHS57etW58jdevUyeXM5HNSAf+AZx6C
IJzO8PpgwUcybcZMn1qBP7SCFAB9sPADCRR4AgVeAEQHBsFt9uw5QRsDAZJ36+w+2K4h0AS+MfM1
GTr4ZrMDBwYTeNZCGIynIID8oGmE4IfO9pqrr5IZ01+Ru+68w2zZFLQCIQ7MnfuuCWgajyVssEQZ
3547N2Kt3mWXtpNnJj8pTZo0Nk41FjfsrAB21guDB/LGy+0JkeOLFnNPrKhoeUWiBYPWq7Rq1kIN
6vG896OtA85H2UrpDh9nnB4+JuZWje+F5zsWOzXc9wg18556v9rrDIeInj26m3LYv4+lLgXhN9gh
AbuFvK3aQDzHVipVqqSJURbqXrHO5V8SIIGCQ6DAC4BADeFn3vwFsnHjplzkYfuSMfwO6dT5auMR
95DarEFT4J/SdKZ/9113qiA4TcbcO1JatTrbBC1Gp4eBBfvkRtsBYtCAMInf4y8GXAhKtw0bKjNV
8HvisUkm+rdxq/UvUASfEfx5ztvvxDToBcseS0MrVq6U71etDnZKru9bn3uOvPzCVBmt3Jo3P13D
aZRTzWyOEToEPgywEHixVVdlNTjHZzcnaIQaNmxo2rwgDvwwCwiXICid1riR3pfHB3rrN2gzow0/
fES3Tcq/LgJsMRk6pMu3gTjDOSP9tHRji2eVLdhfeMHDDjYWARB5QiBepLt4IBCrPbVXj3x45tsF
IvvxwvYe/BAQ+bC2vZWSlA1WWphIgAQKF4EC7wSC5oAAmL05WzVX78qQwYN8WugkNSBvlN5Q3nn3
PbOl1Oe6r+iizz6XUSPvkmZNm/qciw+1a9WSfjf1lRtuuF5Dq2wwEcSR97ZtOwS//VHjDkYyyBjt
hc6csRdnVfXqhbddeqN0adiggWr7Ts513Vi++O/st2TtunVR2w2Guhbq9ptqQ1544SVprOWNtOPH
xuoD+t0kvXpcp3aEGzQ8z3Zjl/n3kb913+BkY1QPwRB8EycA5uyXGqr+1rFrdRu2xeo9+fU3S3Tw
P2TaPEdI+cfEh4vkHrDycvIvYi0illskqdPlHeT99+fLt+oAAQ90yOWoY7lyZeXM5mfIlVd0Mhrx
SPKK5ZwWLc7U0HO99Hn8wjxXsIVFOSzOeG6HZ9wakXZ8rYYvgtCKiUYsCQJgtnrTv/Pe+9K3943H
soCHbMawITJ4aIbR3ru13Y8VOA5vsOxun6OhPaKd/KIYph0LhqVBHKgxCxIoeAQKhQAIgQKaq2m6
HU2nTh18gpuiw4Zg0qxJExk99n5j7P2ZCoADBg2Rl56fYpwYAjUbQsM0Sm9gXji+bPm3Zp++nMEp
0C9yfwfBoVXLlvmynyu0mDNef9N0svEWqJKLJZsN5Fuf28osU+euWfBvYCwOLSdebku4F/ZoLDRo
Y7EjR6gEQfXlF58zAiDsS7FzQjn1liypQv2kRx7LFTcuVF6OHtPBetfO3BruQGWA1vul56fK519+
qRMo3Q1BTzqlUiVJb9hAd41ooMJU/np9gvGkiRPMjjJrdIuyTRuz5Bd15MAyZC3ds/vss1uYPTwD
ld3+HdoT3rp5Ec7wDGEJ9Jlnn1Nv2Aul1qk1j10CThDQME6YOMloCvNynWOZuvQNTFQaNKjvM/H7
Q1cw8NyE6mfQL/qbd5QqXerYxCnUb12KgsUigUJPoFAIgGglzOAzNSbdjJlvyPDbhuVquH//u4U8
9shE6da9l2D3kMzMTLNd2eQnH/fp7HL9UL+AZgHhThAsNtJQCBgkEE7lyacmS5s2rU3crUB5x/rd
G2/OMptvhxNkYskfnTUGgkmPPiEtzjpTaupgXBgSQl/8+ONPgsDZ2MouXCpVqpQJjYGdWexp1qzZ
smXLj/avXPMe9112drb89ts+ge1WuFS1aopcc1XncKdFdRzP4r+woXGECfHpfHakiPB31mnYI3Wd
eq/n1Q7WaAGV3RNPPiUP3D9Wimo9kPA8YD/d7bqd1KuvTDOCDiacsaZoJpG4Ru7zg6vVrHNjEbgg
wKFena/s5MMSqx9wkgkm+OJaCKa9c+cuHyTpakaRnFxUeSHGaeT3g08m/EACJJBvBPLPwCffihw8
Y3ReU597wWhtAp1VJzVV7tWwLxDicO77avT9zLNTA53q8x20CwioGq2wBU1G5saNZmnaJ8M8flii
ISuefmaKEXrzmFXQn4PPhg0b5K4Ro0yYiKAnFqADGMCwNL16TfjdToJVC4NZsIEw2G+c/B5CEDSW
WSrIJCKpIsgs+SfpMqJT6a05c9VEY3tcngfc99NnvC7Tps/wKT6e/XFjRsukSRPMVokQeIzDk9oI
h0oQyLB8Cps6TKr+VOeKSIVjyEyw5/xT7SSthPZNTj7RbGNpfWf/C5MNOAFBK4oVCAh1cMgKllA+
nIPz4fw05OZB0r7dJT6nf6EaYkyaQgnYyAPmKPYEDe7FF19sJtCWYGo/zvckQAKJJVCoBEB0UHv3
7pUHJzxkDMIDoW178UUCz1Vj1K394sO6nPcfFaZgjB4sfafhIbAEGO0sFuej08eeufHqAKGNHP/Q
w/KTarJCdcjB6hLN9xCU53+wQG4dNjzX7D6afGI5Nz+ELOT5++9/qOPM23Frj1jqFu43EKJQ1mgn
HMjXegY+/viTcJeJ2/Gc5+Kohgd/jLwRXOiI24U1oy36HLw2fWZchD+UC9whsN1//3hZuNCXIXbK
6KLxOqe98qKZSDZXO8nSqiXGM35Al0lxb1kvPKd4QTCCWURKSmVjFtHvpj4yaGD/iCYRKMufGsFg
z97jNp1o3wb165nvIbTZE8pxTquWMvnpJ+SGXj3UwaypLumfoiscRY2AB2c0q3zm/dHylSlTWhDz
cOozT0tGxlAflpvVNGDm62/odzkBsu3Xs7+H9hQBo7FUbKWTtP8YefedcokKgUcsZzrD5aBh419+
63f8SwIk4AwB56bpztTHLOd+rjuDTJ78rGTcOtjMau2XRgeK0A6Id4Xg0RD8Ro8ZJ19//Y107Hi5
pNauJSfpHqDwjsSSxrfffWc6wEidIezXwntc72ddOoJHI2L+5TVBMwFvxWJqp+dEghAy/4MPZIgG
iR11zwipm1bHicvqEuZvKnDH/1IYDN9Wz+nLLm0vF15wfvwvEKccIVRhUI0lwWvztWkzpN0lbYPa
uMaSb7Df4FmBoAOBxckEgechtcvbvHlzWDOOaMoF7nCkGXb7cI1zOVyu9lsir1atmgwa0E9uvL6n
2V0DmvLde/aaSSXaDa+TTLDlYlJCw9icUrGSVKte1cQzDOSkAq/zQLc68oEQif254Uxmpeuu62bi
dWJiitUJOP7g99D0lVa7O0xw8ULfBk1wdvZm9ezdfay/gzCGvLFzEIS/umlp6vXeINeEA/3jeJ1M
r1233qyYWNcP9BfM1qnz18uvvKaOeDcfOwVL+1OnTNYoDR8YZ6OtqqmFsw/6lQO/H5DP1AEI7Yjy
MJEACThLILYRxtkyRnU1dCQYiB5XO57U1NpyRafLc/3+jNNPl/PbnCdvzvqvWQ6Gdm6Oxr569/15
gi3OTi5eXA5qx/vLr79pB/y7GYhjHYzh1YjwFOiM8yoAfvLJp/LA+ImmPpEuI+WqfAxfQPj94MMP
dUk4U/r366sD4pXGqzeGrML+ZKVua/fqa9PlPW0LuwYs4gEizDiCe2OfDmwjRo4ydpkweC9sCbZr
Gzdl6fL9PfLUE4/5bO0VS10hhKxQQeM09QqHNss/HT70l49GFUuQwRK0a1iyrVu3jjqbNAx2Wtjv
8cw+/+JLZnKGZdt4J+SJZeXbht9p9sfGfe9vNwph7qwzm5tXXq6/fUeOUBToHke/M2vWW9Kty7Uq
rJUxl6miHvf3jR6lpgxr5IrO15oYhli+tRLYIC9o8OvXq2de1rFI/2ICNuKee2XmG7MiEq6tfvex
J54ynuPY2chKuGeu6NTRvND+Gh1Udy5KMvcUtIaYQCQlBb9nrHz4lwRIIL4Ejvca8c03oblB64ZO
5f4HxqujxKpcZcHxW24eINWrVzMzbJxwos5I8f0eXULeouEgdqmX7ZEjh00nGqvwZy6s/Ro6ZLzy
kmBfM/LeMWa7qzyVJ4ZCmMFE7Y7gPDPinlHS+6b+Rnj2N/qOIWvzEwjHaCe0V5duPdSO80WjrbBr
lOJpe2fsG9VhaMitt8lCXSrFoBRpgiOJPYENbD3Dpejj6f0TkUataJGiAbUnycnFTLijocNukw3q
8BRLwjIhQiYNvHmIEYQQUD1Q8hHA9D4/8g+0gYGXDNGmL7/6mtzYp59MUXvdn3/eGSjLkN/t1SXR
SY8+LveNfcBo+NEG+ZFQL2irnnx6snS7rqe8oRNGBJSPR8JS6edfLJaRo0brfXi70Yah//FPKMMP
q1YZW2X/JVNoeu39CjAghBNWHGJN0MYh3NWAgYNVuH7TCH+R8sWzgXsGE4/nnsczrHsz+yW0P4Q/
JHhdI+VT85m8+R8JkEBwAidUq5maN8kkeN4JPwI7v3p16xrv36ZNm+Qqz1e67Dtq9BgT4gXyGTok
u9CBzhXLKrB/sX+fK6MQX/ylHWr9enXlzdenS4Xy5UOcGfzQpqws6dtvoG75tsIIpMHPzP8jYAKu
Scqk1qm1NJZiYzm31TnSuEkjUz8Eu7Zr7gKVCKE+MJBu2rRJvlz8lS6/L9FlprXG0BzCrf9AiGtC
m4FwHDVqVDfLjYHyheJpwYKPDKdIhGS0DUKdnN/6PLn6ms7SSDVSlTQMCvZK9U8Y2H5Wk4Bly5fL
mPvGyY4dO83AhSW0Xroncvny5YILkv+cIPMXLDBL9z7Ckv9FbJ8PHz4kzZo1k44d/kf+ZQSD3I8p
BmYEOn/p5VfVS3NrwCVjCA1VqlRWjXcbubrzFVJbTRxQR3/GuDQ4Iwhw5sZN8qmaGcCO8IfVq+XA
/t9V83eSCWeUpsuFf9sCTeO5WKxtOPed98z1kQc0xtD4IP6lz7mqDd+3f5/MUCeL3SoAoUZpqanG
0/qCC9qYGJEVKpQPGMsPtr1YPvxo4UKjQcSEAdeO9bnUS0eVIBjhWjAROV1XENqcd67UV1u8smXK
qrd1KXPP2MuC88EekxusAECjlpW1WR10VsuaNWuNc9iWLT+aiQ7uiVD3K5jihVWLm/r21j4tTcpX
qGAiGXS84irVAO4/xgFlqF6tqtH6QcPa7PSmRtNdsmRJ4xWO58hq+8M6wcX9s089xrGTyqefLjJt
CScz3O/hnuNgAK0JVaP0dLn00kvM8jXuOezpbOUJwfobjbHZ4/reZhJuZxcsX35PAiQQXwKFWgAE
KnTCaWl1dCnsUWnSOHdsuj1quzNv/nx59715RlOCDhsee+iQcmxkyqjn6DZjDxhLJ5VXARD2TQMG
DZZvliw91nnG9xaILTcMSOAELSkGLwyCVXRv4IoVK5r3CPpcUu2fkCCoHNFzsfSK+IXbd+wwy2t4
j4ESCXmE4ovrYccIzSpkQh7WABfyxKMHMVhhMML1U1KqSI3q1Y/WobRibCynAAAKlElEQVSUKHGy
DuC6jeCe3bJj+w7jcLBdB0okq6woF+zftJbmnzno/5+eAwbRlAtZIF/kH7LSehwCoqVN8b80PqN+
yKu4mjZU1TpWP1rHCiq0olwQxH5VoRw7y/ykgmRWVrYRAPBbCCfmHFPPo4GaccBKR+VSu5NATlsF
tuvCMXueKBsmWdBYplSpokJjitlJprQK1qgT2vwXtceD8JednaXl/M1cGe2FcjmZUHarvKgv7m8I
NpjYwWwEtnxWOgjhT5fOIfyhzBBg0Rfl/P5vcy/AUzpSUw6LKSYsNdSuDvvzIj/EJ0WeFgurjGhv
3G9FVDtdqmQpE9zbMm+xwtsc0kkGygZt5Ha9v7HUjxTuWbTqGOqvVV6Uq0SJEqZdK6rQapkQoF/c
of0AQnfhXCYSIAHnCRR6ARBIsRxcr16aPDJxvJxxxhkBKaPDhFYKS7/oWNEJQquDzr13n/4yTx0h
rNlrwAyCfJkXARDBcW9XG6TFX32VcM1fkOqZr9GB4wWGEKgwoKPj9x+frY7eEtLw1xq4QuXvxDGr
/KYOWheIFihbzth0XIDDoBqozFbdApYVLAIeiOzLUHkHKkuwXNE2cAA4ogID6mUXPqxroH54WQKu
f17WefbvoymD/Xf298gX7HPuIfDGUfyXIxxgSTkvmnj7teLxHuW1ygyu/lzAxP6y7vW8ssKzhUlX
Tmw9DbmjpiuhEsplPZM55bSbO2DFI2fVA+UL1uah8o/kmLnvjvYNxzlhQqR7busEg4kESCAxBMIb
LyWmXHG9KrQLa9eulz66jHrPiLulU8cOufLHoFepUkXz8j+oXb3/V/n++RNdjrnr7pHGAw/LNm5O
1kCXXwOIE3VHHSD04xVLyuvAHuqa8crbGuQtDVCoawY7Fq+y+OefV/7++eX3Z5QXL6fv+RyBragK
TpHVEGXMEeojOz8/zrLuu/zIm3mSAAnETuD4mkXseRSIX0II3KbLHEM1nMn4CQ8bzzlHCq4zcDgA
hFqis5cDS6KPP/m02vwN0CXpja7W/NnLzfckQAIkQAIkQAIFh4BnBEA0CTQfWJJ9RD0Ie/ftL18v
WRJRSx1ftojodJ+T8FsIn5EsdaxatVr6D7xZHnhwgjHsjuQ3PhfjBxIgARIgARIgARKIgEBs610R
ZOzWU7AcAqHsY42p9/0PP0hXja/Vt8+NUvmUU4IWOdZlwaAZ+h1A6BnEvpsy5Tk1dt9m7Hry+5p+
ReBHEiABEiABEiABDxHwnACItoVdDIynsb/l4xq4FFs+Xde9q1x80YUmNqB/+8N7Mk8piK0QvOCw
1do0DYuxdOlyY5Dtdnu/PHHgj0mABEiABEiABFxBwBNewOFII64dtIKpqbXl0vbtpOPlHUz8QCzd
InxD1+69zJZwsSzJYpumU9S5ZMa0V038LnzO1MC878+bL7Nnz9G4YGvMtcN584WrA4+TAAmQAAmQ
AAmQQKQEKAAeJQUB0ApjgqCpTZs0kTp1UnUbqNWydNmyPHn7IV8EZcW2Udka1w+xuxADD95xWJKG
RpKJBEiABEiABEiABJwiQAEwAGnErYJW8G8VChHcNR7aOeQHQRAJOyVA8GMiARIgARIgARIggUQQ
8KQNYDjQ0MzF2xYPQh8TCZAACZAACZAACbiBgKfCwLgBOMtAAiRAAiRAAiRAAokmQAEw0S3A65MA
CZAACZAACZCAwwQoADoMnJcjARIgARIgARIggUQToACY6Bbg9UmABEiABEiABEjAYQIUAB0GzsuR
AAmQAAmQAAmQQKIJUABMdAvw+iRAAiRAAiRAAiTgMAEKgA4D5+VIgARIgARIgARIINEEKAAmugV4
fRIgARIgARIgARJwmAAFQIeB83IkQAIkQAIkQAIkkGgCFAAT3QK8PgmQAAmQQEIIYA/4Q4cOHdum
MyGFCHNRbCGKMro1WQyxhapb0+HDhwUvtyawQxuDpZOJAqCTtHktEiABEiABVxDAYHvCCSdIzRo1
pEyZMq4UAiH8oWw1tIx477SAEK6hLIYoH7ZPtfa7D/c7J4+jTJUqVZIqVaqIG4VUlCk5OVlOPfVU
KVq0qKNlTCpVptwoJxuD1yIBEiABEiCBRBOA8NLl2i4yYuQIad26taxcuUJ27dol2AveDQkaofr1
68u4seOka9eupkgrV640QqsbygfBBXvcDxwwUDIyMiQ9PV2WL1smBw4ccBXDli1bytixY6VDhw6y
bds2yczMlKSkJDcgNMIeBPwRI0ZI//79pXr16rJ8+XL5888/HWlnd9zprmgKFoIESIAESMALBKAV
gkaoR6+eUlG1Q82aNZPLLr3MDLpu0bKhjO3bt5fmZzaXypUrS/du3SRFy+wWLRsEVAh9Xbt1NRq2
tm3bynnnneeapVa0I7SSPXv2lLS0NKlVq5b07t1bSpQo4RpNKpalIaCCXdmyZaVjx45y1llnyV9/
/eXIY0gB0BHMvAgJkAAJkIBbCBghTwWEJF0CVmnAFKuYLsO5LRUpUsQUCeW1BFPrrxvKCm0pltFR
JiVpNIL47IZkcUIZ7e+hubQ+u6GcJ+p9Z5UxSctaRLWTTpWPS8BuuANYBhIgARIgAccIQEjZp0uV
ycnFpGHDhmZpcOrUqbJ161ZXLQ9CE9SoUSNjGzZ9+nT5dNEiIyy4QciC0LJ3716pVLGi1FT7tWVL
l8oLL77omiVgMAK/gwcPSpMmTWTfvn0yZcoUWbVqlViCtWM3XIgL7dmzR+rUqSPly5eXhR9/LDO0
naEZdKKNT6hWM9VZt5MQIHiIBEiABEiABJwgAC0LBlksY/7666+SnZ3tGuHPqj+We2vWrGkcQSC4
4LMTgoF1/XB/oU0rXry41KtXT7KysmT37t3uY6hlrJOaaqqyYcMG15UPwh7sAGvXri3r16+X/fv3
O1ZGCoDh7nAeJwESIAESKJQEIATClg3aLDdpheywISBA0IKHqJuEP6uMKBsYgp9bnCussll/UT4k
MHRjAkO0MxjiXnQqUQB0ijSvQwIkQAIkQAIkQAIuIeCcqOmSCrMYJEACJEACJEACJOB1AhQAvX4H
sP4kQAIkQAIkQAKeI0AB0HNNzgqTAAmQAAmQAAl4nQAFQK/fAaw/CZAACZAACZCA5whQAPRck7PC
JEACJEACJEACXidAAdDrdwDrTwIkQAIkQAIk4DkCFAA91+SsMAmQAAmQAAmQgNcJUAD0+h3A+pMA
CZAACZAACXiOAAVAzzU5K0wCJEACJEACJOB1AhQAvX4HsP4kQAIkQAIkQAKeI0AB0HNNzgqTAAmQ
AAmQAAl4nQAFQK/fAaw/CZAACZAACZCA5whQAPRck7PCJEACJEACJEACXidAAdDrdwDrTwIkQAIk
QAIk4DkCFAA91+SsMAmQAAmQAAmQgNcJUAD0+h3A+pMACZAACZAACXiOAAVAzzU5K0wCJEACJEAC
JOB1AhQAvX4HsP4kQAIkQAIkQAKeI0AB0HNNzgqTAAmQAAmQAAl4nQAFQK/fAaw/CZAACZAACZCA
5whQAPRck7PCJEACJEACJEACXidAAdDrdwDrTwIkQAIkQAIk4DkCFAA91+SsMAmQAAmQAAmQgNcJ
UAD0+h3A+pMACZAACZAACXiOwP8D72BFj4OMbiwAAAAASUVORK5CYII--Apple-Mail=_483CCA40-26C0-4A4B-B113-6847A82499E2--

--Apple-Mail=_3EDBD708-A953-4306-924A-6AEDAA78B3F5--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306828
Author: JD Smith
Date: Thu, 17 Aug 2023 08:21
18 lines
790 bytes
Thanks for that, but I’m afraid I haven’t yet had time.  I provided the test code and target file in the hopes that others could confirm the scaling behavior and then experiment with algorithm tweaks, if anything obvious presented itself.

> On Aug 17, 2023, at 6:56 AM, Dmitry Gutov <dmitry@gutov.dev> wrote:
> 
> On 17/08/2023 07:01, JD Smith wrote:
>> I’m unclear whether this is fundamental to the tree-sitter parse/tree algorithm, or if the scaling comes from Emacs’ TS implementation.  It does vaguely remind me of similar scaling with an old line-numbering algorithm, where lines were always being counted from the beginning of the buffer, so very fast at the front, and very slow near the end.
> 
> Have you tried my patch yet?


Re: Tree-sitter navigation time grows as sqrt(line-number)
#306827
Author: <tomas@tuxteam.d
Date: Thu, 17 Aug 2023 13:51
41 lines
1222 bytes
--MMbW8Q8QT+A3vO2G
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Thu, Aug 17, 2023 at 02:41:24PM +0300, Eli Zaretskii wrote:
> > Date: Thu, 17 Aug 2023 13:56:46 +0300
> > From: Dmitry Gutov <dmitry@gutov.dev>
> > 
> > On 17/08/2023 07:01, JD Smith wrote:
> > > It 
> > > does vaguely remind me of similar scaling with an old line-numbering 
> > > algorithm, where lines were always being counted from the beginning of 
> > > the buffer, so very fast at the front, and very slow near the end.
> 
> Why on earth would someone need to count lines far from the beginning
> of the buffer?  Or have a computer with more than 640KB of memory?

Oh, oh, fond memories of Windows around 3.1 where the available editor
(notepad) wasn't capable of loading the only C header (<windows.h>)
because that one had more than 64K lines...

Cheers
-- 
t

--MMbW8Q8QT+A3vO2G
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iF0EABECAB0WIQRp53liolZD6iXhAoIFyCz1etHaRgUCZN4JxAAKCRAFyCz1etHa
RuISAJ9Q/YPZfbu4i7J4GUKpI9g8R3ZScgCfSzVqwJ6rzcs8sKQ8U7ZeDkVbkuQ©Gg
-----END PGP SIGNATURE-----

--MMbW8Q8QT+A3vO2G--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306825
Author: Dmitry Gutov
Date: Thu, 17 Aug 2023 13:56
9 lines
434 bytes
On 17/08/2023 07:01, JD Smith wrote:
> I’m unclear whether this is fundamental to the tree-sitter parse/tree
> algorithm, or if the scaling comes from Emacs’ TS implementation.  It
> does vaguely remind me of similar scaling with an old line-numbering
> algorithm, where lines were always being counted from the beginning of
> the buffer, so very fast at the front, and very slow near the end.

Have you tried my patch yet?

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306826
Author: Eli Zaretskii
Date: Thu, 17 Aug 2023 14:41
12 lines
490 bytes
> Date: Thu, 17 Aug 2023 13:56:46 +0300
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 17/08/2023 07:01, JD Smith wrote:
> > It
> > does vaguely remind me of similar scaling with an old line-numbering
> > algorithm, where lines were always being counted from the beginning of
> > the buffer, so very fast at the front, and very slow near the end.

Why on earth would someone need to count lines far from the beginning
of the buffer?  Or have a computer with more than 640KB of memory?

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306829
Author: Dmitry Gutov
Date: Thu, 17 Aug 2023 15:34
6 lines
329 bytes
On 17/08/2023 15:21, JD Smith wrote:
> I provided the test code and target file in the hopes that others could confirm the scaling behavior and then experiment with algorithm tweaks, if anything obvious presented itself.

I experimented a little bit with benchmarking (treesit-node-parent)
calls, and the patch came from that.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306830
Author: Dmitry Gutov
Date: Thu, 17 Aug 2023 16:19
62 lines
1937 bytes
On 17/08/2023 15:34, Dmitry Gutov wrote:
> On 17/08/2023 15:21, JD Smith wrote:
>> I provided the test code and target file in the hopes that others
>> could confirm the scaling behavior and then experiment with algorithm
>> tweaks, if anything obvious presented itself.
>
> I experimented a little bit with benchmarking (treesit-node-parent)
> calls, and the patch came from that.

In case somebody else here wants to try it:

diff --git a/src/treesit.c b/src/treesit.c
index 1f694e47201..4b35e5ee2e5 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -52,6 +52,7 @@ Copyright (C) 2021-2023 Free Software Foundation, Inc.
  #undef ts_node_named_descendant_for_byte_range
  #undef ts_node_next_named_sibling
  #undef ts_node_next_sibling
+#undef ts_node_parent
  #undef ts_node_prev_named_sibling
  #undef ts_node_prev_sibling
  #undef ts_node_start_byte
@@ -1899,16 +1900,27 @@ DEFUN ("treesit-node-parent",

    TSNode treesit_node = XTS_NODE (node)->node;
    Lisp_Object parser = XTS_NODE (node)->parser;
-  TSTreeCursor cursor;
-  if (!treesit_cursor_helper (&cursor, treesit_node, parser))
-    return return_value;

-  if (ts_tree_cursor_goto_parent (&cursor))
-  {
-    TSNode parent = ts_tree_cursor_current_node (&cursor);
-    return_value = make_treesit_node (parser, parent);
-  }
-  ts_tree_cursor_delete (&cursor);
+  if (treesit_node_uptodate_p(node))
+    {
+      TSNode parent = ts_node_parent (treesit_node);
+      return_value = make_treesit_node (parser, parent);
+    }
+  else
+    {
+      Lisp_Object parser = XTS_NODE (node)->parser;
+      TSTreeCursor cursor;
+      if (!treesit_cursor_helper (&cursor, treesit_node, parser))
+	return return_value;
+
+      if (ts_tree_cursor_goto_parent (&cursor))
+	{
+	  TSNode parent = ts_tree_cursor_current_node (&cursor);
+	  return_value = make_treesit_node (parser, parent);
+	}
+      ts_tree_cursor_delete (&cursor);
+    }
+
    return return_value;
  }



Re: Tree-sitter navigation time grows as sqrt(line-number)
#306851
Author: Yuan Fu
Date: Thu, 17 Aug 2023 20:00
50 lines
2352 bytes

> On Aug 16, 2023, at 9:01 PM, JD Smith <jdtsmith@gmail.com> wrote:
> 
> I recently posted about the high variability of Emacs 29’s tree-sitter navigation performance within a file.  I decided to conduct a simple test on a large python file of about 8400 lines to see if I could learn more.  The test is as follows: at the start of each line, locate the current syntax node, and starting from it, navigate up to the root node via `treesit-node-parent’.  
> 
> I was surprised to find that the time this takes grows as sqrt(N), for line number N.  This leads to performance variability of >100x for code that needs to walk the local syntax tree in large files.  Such variability can make performance projections and optimizations for latency-sensitive uses of tree-sitter (e.g. via font-lock) tricky.  
> 
> I’m unclear whether this is fundamental to the tree-sitter parse/tree algorithm, or if the scaling comes from Emacs’ TS implementation.  It does vaguely remind me of similar scaling with an old line-numbering algorithm, where lines were always being counted from the beginning of the buffer, so very fast at the front, and very slow near the end. 
> 
> Code and details here:
> 
>   
> https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472

I’m not entirely surprised. In the parse tree that tree-sitter generates is a DAG, where the parent node has pointers to the child nodes, but not the other way around. That means to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.

Also, getting the node at point isn’t free either. To get the node at point, we actually iterates from the first child node of the root node until reaching one that contains the point, then iterate from the first child node of that node until reaching one that contains the point, etc, until we reach a leaf node. So log(N) time complexity is expected.

Theses are fundamental limits of tree-sitter, unless it changes its data structure. I’m not too worried tho, because IIRC the absolute time is very short. The 100x variability doesn’t mean much if the 100x is still very fast.

Yuan
Re: Tree-sitter navigation time grows as sqrt(line-number)
#306854
Author: Yuan Fu
Date: Thu, 17 Aug 2023 22:20
100 lines
4567 bytes
>> to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.
> 
> Do you mean linear in the width of the tree?  I’ve color-coded the plot by tree depth (i.e. how many ancestors a given node has back to root).  Or maybe you are thinking of the tree lying on its side (like vundo ;)?

Going down from the root node is proportion to the height of the tree, no?

> 
>> Also, getting the node at point isn’t free either. To get the node at point, we actually iterates from the first child node of the root node until reaching one that contains the point, then iterate from the first child node of that node until reaching one that contains the point, etc, until we reach a leaf node. So log(N) time complexity is expected.
> 
> I tested node-at-point on the same file, and it is quite fast, with worst case performance only 30µs (vs. 3ms for the full parent navigation), and growing very slowly, between sqrt(log(N)) and log(N).  Check the gist for a new figure.
> 
> Unless I am misunderstanding, for the common case of finding parent of the node at point, it seems the algorithm you describe could be tweaked to work well.  I.e. instead of "stop when reaching a leaf node containing point", just "stop when you reach a node containing point who has the original node as a child”?   This should give (hypothetical) “parent-of-node-at-point” the same great speed as node-at-point.  

I should’ve been more clear. For finding the parent of a node x, we stop at the parent of x. We only go to the leaf node when finding the node at point, which always returns a leaf node.

> 
> Then “parent-of-node-at-point-until” could do something quite clever: accumulate parent nodes all the way from root to the child’s direct parent into a list (same low cost, modulo the node storage).  Then run the predicate on that list (in reverse), returning the first match.  Could of course return that full list too (“ancestors-of-node-at-point”), for other uses.  These should all be quite fast compared to a full breadth and depth searching of every nook and cranny in the syntax tree that node-parent seems to do (having no positional information to wield).

Sure, there hasn’t been a clever version because so far no one have complained they can’t find the parent of a node fast enough. Also I doubt the amount of gain we can get with a more clever algorithm. You can try implement one and benchmark it. I’m curious to know the result :-)

> 
>> I’m not too worried tho, because IIRC the absolute time is very short. The 100x variability doesn’t mean much if the 100x is still very fast.
> 
> 
> This is on a brand new fast machine, and 3ms is pretty slow for things that need to run dozens of times per keystroke (e.g. font-lock).

Font-lock doesn’t need to find the parent of a node. So that hasn’t been a problem. In use-cases where finding the parent of a node is useful, 3ms hasn’t been a problem AFAIK. (Well, I guess indentation could benefit from a faster parent-finding function.)

> 
>> These are fundamental limits of tree-sitter, unless it changes its data structure. 
> 
> That is an interesting limitation for sure.  It seems that perhaps each node's start..end information can be really helpful here for winnowing the tree, when you are mostly concerned about nodes relevant to and covering particular positions in the buffer.

> BTW, https://tree-sitter.github.io/tree-sitter/using-parsers says:
>     • 
> A TSNode represents a single node in the syntax tree. It tracks its start and end positions in the source code, as well as its relation to other nodes like its parent, siblings and children.

I’m not entirely sure what exactly do you have in mind. A node’s start and end position doesn’t really help us finding it. Suppose you have an array of numbers, and you know one of the numbers is 3. How do you find the index of the number 3 in the array?

While the documentation say it tracks its relation to other nodes, I think it’s more pedagogical than factual. Behind the scenes, tree-sitter’s own node API does the same thing as I described: it goes from the root node and traverses down.

Yuan




Re: Tree-sitter navigation time grows as sqrt(line-number)
#306852
Author: JD Smith
Date: Fri, 18 Aug 2023 00:19
168 lines
9416 bytes
--Apple-Mail=_C2142055-6695-4BB6-A7AD-FD3A285C1256
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8


> On Aug 17, 2023, at 11:00 PM, Yuan Fu <casouri@gmail.com> wrote:
>> 
>> Code and details here:
>> 
>> https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472
> 
> I’m not entirely surprised. In the parse tree that tree-sitter generates is a DAG, where the parent node has pointers to the child nodes, but not the other way around. That means to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.

Thanks for this info, very interesting.  

> to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.

Do you mean linear in the width of the tree?  I’ve color-coded the plot by tree depth (i.e. how many ancestors a given node has back to root).  Or maybe you are thinking of the tree lying on its side (like vundo ;)?

> Also, getting the node at point isn’t free either. To get the node at point, we actually iterates from the first child node of the root node until reaching one that contains the point, then iterate from the first child node of that node until reaching one that contains the point, etc, until we reach a leaf node. So log(N) time complexity is expected.

I tested node-at-point on the same file, and it is quite fast, with worst case performance only 30µs (vs. 3ms for the full parent navigation), and growing very slowly, between sqrt(log(N)) and log(N).  Check the gist for a new figure.

Unless I am misunderstanding, for the common case of finding parent of the node at point, it seems the algorithm you describe could be tweaked to work well.  I.e. instead of "stop when reaching a leaf node containing point", just "stop when you reach a node containing point who has the original node as a child”?   This should give (hypothetical) “parent-of-node-at-point” the same great speed as node-at-point.  

Then “parent-of-node-at-point-until” could do something quite clever: accumulate parent nodes all the way from root to the child’s direct parent into a list (same low cost, modulo the node storage).  Then run the predicate on that list (in reverse), returning the first match.  Could of course return that full list too (“ancestors-of-node-at-point”), for other uses.  These should all be quite fast compared to a full breadth and depth searching of every nook and cranny in the syntax tree that node-parent seems to do (having no positional information to wield).

> I’m not too worried tho, because IIRC the absolute time is very short. The 100x variability doesn’t mean much if the 100x is still very fast.


This is on a brand new fast machine, and 3ms is pretty slow for things that need to run dozens of times per keystroke (e.g. font-lock).

> These are fundamental limits of tree-sitter, unless it changes its data structure. 

That is an interesting limitation for sure.  It seems that perhaps each node's start..end information can be really helpful here for winnowing the tree, when you are mostly concerned about nodes relevant to and covering particular positions in the buffer.
--Apple-Mail=_C2142055-6695-4BB6-A7AD-FD3A285C1256
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><br><div><blockquote type="cite"><div>On Aug 17, 2023, at 11:00 PM, Yuan Fu <casouri@gmail.com> wrote:</div><div><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><br>Code and details here:<br><br><a href="https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472">https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472</a><br></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;">I’m not entirely surprised. In the parse tree that tree-sitter generates is a DAG, where the parent node has pointers to the child nodes, but not the other way around. That means to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"></div></blockquote></div><br><div>Thanks for this info, very interesting.  </div><div><br></div><div><blockquote type="cite">to go to the parent node from a child node, what tree-sitter actually does is go down from the root node until it hits the parent node. This process is linear to the height of the tree.<br></blockquote><br></div><div>Do you mean linear in the width of the tree?  I’ve color-coded the plot by tree depth (i.e. how many ancestors a given node has back to root).  Or maybe you are thinking of the tree lying on its side (like vundo ;)?</div><div><br></div><div><blockquote type="cite">Also, getting the node at point isn’t free either. To get the node at point, we actually iterates from the first child node of the root node until reaching one that contains the point, then iterate from the first child node of that node until reaching one that contains the point, etc, until we reach a leaf node. So log(N) time complexity is expected.</blockquote><br></div><div>I tested node-at-point on the same file, and it is quite fast, with worst case performance only 30µs (vs. 3ms for the full parent navigation), and growing very slowly, between sqrt(log(N)) and log(N).  Check the gist for a new figure.</div><div><br></div><div>Unless I am misunderstanding, for the common case of finding parent of the node at point, it seems the algorithm you describe could be tweaked to work well.  I.e. instead of "stop when reaching a leaf node containing point", just "stop when you reach a node containing point who has the original node as a child”?   This should give (hypothetical) “parent-of-node-at-point” the same great speed as node-at-point.  </div><div><br></div><div>Then<font color="#000000"> “parent-of-node-at-point-until” could do something quite clever: accumulate parent nodes all the way from root to the child’s direct parent into a list (same low cost, modulo the node storage).  Then run the predicate on that list (in reverse), returning the first match.  Could of course return that full list too (“ancestors-of-node-at-point”), for other uses.  These should all be quite fast compared to a full breadth and depth searching of every nook and cranny in the syntax tree that node-parent seems to do (having no positional information to wield).</font></div><div><br></div><div><blockquote type="cite">I’m not too worried tho, because IIRC the absolute time is very short. The 100x variability doesn’t mean much if the 100x is still very fast.</blockquote></div><div><br></div><div>This is on a brand new fast machine, and 3ms is pretty slow for things that need to run dozens of times per keystroke (e.g. font-lock).</div><div><br></div><div><blockquote type="cite">These are fundamental limits of tree-sitter, unless it changes its data structure. <br></blockquote><div><br></div></div><div>That is an interesting limitation for sure.  It seems that perhaps each node's start..end information can be really helpful here for winnowing the tree, when you are mostly concerned about nodes relevant to and covering particular positions in the buffer.</div></body></html>
--Apple-Mail=_C2142055-6695-4BB6-A7AD-FD3A285C1256--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306862
Author: Dmitry Gutov
Date: Fri, 18 Aug 2023 16:21
13 lines
799 bytes
On 18/08/2023 08:20, Yuan Fu wrote:

>>> I’m not too worried tho, because IIRC the absolute time is very short. The 100x variability doesn’t mean much if the 100x is still very fast.
>>
>>
>> This is on a brand new fast machine, and 3ms is pretty slow for things that need to run dozens of times per keystroke (e.g. font-lock).
>
> Font-lock doesn’t need to find the parent of a node. So that hasn’t been a problem. In use-cases where finding the parent of a node is useful, 3ms hasn’t been a problem AFAIK. (Well, I guess indentation could benefit from a faster parent-finding function.)

It could be unrelated, but someone on Reddit complained about the speed
of rust-ts-mode's font-lock in a large enough file, and this mode's
fontification rules contain treesit-node-parent calls.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306907
Author: JD Smith
Date: Sat, 19 Aug 2023 10:24
27 lines
1186 bytes
Thanks for your patch, Dmitry.  I had a chance to test it this morning (the new, non-crashing version).  I made a new NS build, with and without the patch.  The results are really striking (scroll to bottom):

  https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472

Summary:

- Applying the same test above on _axes.py reproduces the earlier emacs-mac/29 results: the time to navigate from the node at line beginning to root starts at under 10µs, but rises as sqrt(N) by ~100x, reaching over 3000µs.

- With Dimitry’s patch, it performs much, much better, starting off with similar timing at early positions in the file, but rising no higher than 50µs, scaling much shallower than sqrt(N).

I should emphasize this is a new fast machine; I fully expect my old laptop would be much slower (10x ?) than 3ms in files this large, which makes using parent navigation for things like font-lock problematic.

The patched version results also make a lot more sense in terms of their similar logarithmic growth as node-at-point, since the method of search for a node at point and for its parent is, as Yuan points at, quite similar.


Re: Tree-sitter navigation time grows as sqrt(line-number)
#306911
Author: Yuan Fu
Date: Sat, 19 Aug 2023 15:16
79 lines
3519 bytes
--Apple-Mail=_CE95BE45-A34F-4904-A5EB-8F9B30DCFA86
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> On Aug 19, 2023, at 7:24 AM, JD Smith <jdtsmith@gmail.com> wrote:
> 
> Thanks for your patch, Dmitry.  I had a chance to test it this morning (the new, non-crashing version).  I made a new NS build, with and without the patch.  The results are really striking (scroll to bottom):
> 
>  https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472
> 
> Summary:
> 
> - Applying the same test above on _axes.py reproduces the earlier emacs-mac/29 results: the time to navigate from the node at line beginning to root starts at under 10µs, but rises as sqrt(N) by ~100x, reaching over 3000µs.
> 
> - With Dimitry’s patch, it performs much, much better, starting off with similar timing at early positions in the file, but rising no higher than 50µs, scaling much shallower than sqrt(N).
> 
> I should emphasize this is a new fast machine; I fully expect my old laptop would be much slower (10x ?) than 3ms in files this large, which makes using parent navigation for things like font-lock problematic.
> 
> The patched version results also make a lot more sense in terms of their similar logarithmic growth as node-at-point, since the method of search for a node at point and for its parent is, as Yuan points at, quite similar.

I inspected the descending algorithm, and there’s indeed an oversight made by me. Here’s a patch that should fix it. I tested it briefly and it does speeds things up greatly. Thanks for investigating this, JD!

I think the patch is relatively safe, so maybe we can push it to emacs-29 instead of master.

Yuan


--Apple-Mail=_CE95BE45-A34F-4904-A5EB-8F9B30DCFA86
Content-Disposition: attachment;
	filename=node-parent.patch
Content-Type: application/octet-stream;
	x-unix-mode44;
	name="node-parent.patch"
Content-Transfer-Encoding: quoted-printable

From dd20c4449493765c22dd2067ae410490e9f1d1dc Mon Sep 17 00:00:00 2001
From: Yuan Fu <casouri@gmail.com>
Date: Sat, 19 Aug 2023 15:04:20 -0700
Subject: [PATCH] Fix treesit_cursor_helper_1

* src/treesit.c (treesit_cursor_helper_1): Skip child nodes that can't
contain TARGET when traversing the tree: only traverse down the child
node if that node's end is grater or equal to TARGET's end.
---
 src/treesit.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/treesit.c b/src/treesit.c
index 1f694e47201..f9e98244a4f 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -3048,7 +3048,8 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
      siblings that could contain TARGET.  */
   while (ts_node_start_byte (cursor_node) <= end_pos)
     {
-      if (treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
+      if (ts_node_end_byte (cursor_node) >= end_pos
+	  && treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
 	return true;
 
       if (!ts_tree_cursor_goto_next_sibling (cursor))
-- 
2.41.0


--Apple-Mail=_CE95BE45-A34F-4904-A5EB-8F9B30DCFA86--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306915
Author: Yuan Fu
Date: Sat, 19 Aug 2023 19:01
123 lines
6086 bytes
--Apple-Mail=_16D2F22E-327A-46FC-8A07-85E1F80AAEFB
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> On Aug 19, 2023, at 5:39 PM, Dmitry Gutov <dmitry@gutov.dev> wrote:
> 
> On 20/08/2023 03:18, JD Smith wrote:
>> Great, thanks.  I tried this patch out, and there is indeed about 10x of improvement.  Check the bottom of the gist.  That said, node_parent remains 10x faster yet (at worst, in a long file), so maybe there’s room for further improvement?
> 
> Similarly, I also see an improvement from Yuan's patch in my testing (about 2x), while the patch with ts_node_parent remains the fastest anyway. Where my test looks like this:
> 
>  (benchmark 1000 '(treesit-node-parent n))
> 
> I looked around for the reasons for the difference. Built the latest tree-sitter (didn't help) and found these two threads on GH:
> 
> https://github.com/tree-sitter/tree-sitter/issues/567#issuecomment-595564171 - Max Brunsfield says "There is some caching done in that method to make sure it performs well in the common case of walking repeatedly up the tree", but I haven't found where said caching resides so far.
> 
> https://github.com/tree-sitter/tree-sitter/discussions/878 - mentions that mixing cursor and direct node apis leads to suboptimal results, and just using the former gives an improvement. No "good" code example in there.
> 
> >  May be worth looking at how others are doing it, e.g. the python API.
> 
> Apparently they have both a wrapper for a cursor API, and node_get_parent which is implemented using ts_node_parent: https://github.com/tree-sitter/py-tree-sitter/issues/34
> 
> Leaving it to the callers to choose which one to use.

Ok, I fiddled around a bit more, and this patch (applies to master) should make the speed comparable to ts_node_parent.

Yuan


--Apple-Mail=_16D2F22E-327A-46FC-8A07-85E1F80AAEFB
Content-Disposition: attachment;
	filename=node-parent.patch
Content-Type: application/octet-stream;
	x-unix-mode44;
	name="node-parent.patch"
Content-Transfer-Encoding: quoted-printable

From 21d3e612d1d6819278621b956629f6c28a324145 Mon Sep 17 00:00:00 2001
From: Yuan Fu <casouri@gmail.com>
Date: Sat, 19 Aug 2023 15:04:20 -0700
Subject: [PATCH] Improve performance of treesit_cursor_helper_1

* src/treesit.c: (treesit_cursor_helper_1): Use
ts_tree_cursor_goto_first_child_for_byte to speed up traversing among
siblings.  The "while (ts_node_end_byte (cursor_node) < end_pos)" can
be removed with the check added in the loop below.
---
 src/treesit.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/src/treesit.c b/src/treesit.c
index 1f694e47201..1017c64f899 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -3023,7 +3023,8 @@ treesit_assume_true (bool val)
    limit.  */
 static bool
 treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
-			 uint32_t end_pos, ptrdiff_t limit)
+			 uint32_t start_pos, uint32_t end_pos,
+			 ptrdiff_t limit)
 {
   if (limit <= 0)
     return false;
@@ -3032,23 +3033,17 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
   if (ts_node_eq (cursor_node, *target))
     return true;
 
-  if (!ts_tree_cursor_goto_first_child (cursor))
+  if (ts_tree_cursor_goto_first_child_for_byte (cursor, start_pos) == -1)
     return false;
 
-  /* Skip nodes that definitely don't contain TARGET.  */
-  while (ts_node_end_byte (cursor_node) < end_pos)
-    {
-      if (!ts_tree_cursor_goto_next_sibling (cursor))
-	break;
-      cursor_node = ts_tree_cursor_current_node (cursor);
-    }
-
   /* Go through each sibling that could contain TARGET.  Because of
      missing nodes (their width is 0), there could be multiple
      siblings that could contain TARGET.  */
   while (ts_node_start_byte (cursor_node) <= end_pos)
     {
-      if (treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
+      if (ts_node_end_byte (cursor_node) >= end_pos
+	  && treesit_cursor_helper_1 (cursor, target, start_pos, end_pos,
+				      limit - 1))
 	return true;
 
       if (!ts_tree_cursor_goto_next_sibling (cursor))
@@ -3080,11 +3075,12 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
 static bool
 treesit_cursor_helper (TSTreeCursor *cursor, TSNode node, Lisp_Object parser)
 {
+  uint32_t start_pos = ts_node_start_byte (node);
   uint32_t end_pos = ts_node_end_byte (node);
   TSNode root = ts_tree_root_node (XTS_PARSER (parser)->tree);
   *cursor = ts_tree_cursor_new (root);
-  bool success = treesit_cursor_helper_1 (cursor, &node, end_pos,
-					  TREESIT_RECURSION_LIMIT);
+  bool success = treesit_cursor_helper_1 (cursor, &node, start_pos,
+					  end_pos, TREESIT_RECURSION_LIMIT);
   if (!success)
     ts_tree_cursor_delete (cursor);
   return success;
-- 
2.41.0


--Apple-Mail=_16D2F22E-327A-46FC-8A07-85E1F80AAEFB
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=us-ascii




--Apple-Mail=_16D2F22E-327A-46FC-8A07-85E1F80AAEFB--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306912
Author: JD Smith
Date: Sat, 19 Aug 2023 20:18
57 lines
2336 bytes
Great, thanks.  I tried this patch out, and there is indeed about 10x of improvement.  Check the bottom of the gist.  That said, node_parent remains 10x faster yet (at worst, in a long file), so maybe there’s room for further improvement?  May be worth looking at how others are doing it, e.g. the python API.  

Alternatively, have we ruled the seemingly simplest node_parent out prematurely?  If the issue is a node being its own parent in some odd trees, wouldn’t a simple check suffice to guard against this rare possibility?

> On Aug 19, 2023, at 6:16 PM, Yuan Fu <casouri@gmail.com> wrote:
> 
> 
> 
>> On Aug 19, 2023, at 7:24 AM, JD Smith <jdtsmith@gmail.com> wrote:
>> 
>> Thanks for your patch, Dmitry.  I had a chance to test it this morning (the new, non-crashing version).  I made a new NS build, with and without the patch.  The results are really striking (scroll to bottom):
>> 
>> https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472
>> 
>> Summary:
>> 
>> - Applying the same test above on _axes.py reproduces the earlier emacs-mac/29 results: the time to navigate from the node at line beginning to root starts at under 10µs, but rises as sqrt(N) by ~100x, reaching over 3000µs.
>> 
>> - With Dimitry’s patch, it performs much, much better, starting off with similar timing at early positions in the file, but rising no higher than 50µs, scaling much shallower than sqrt(N).
>> 
>> I should emphasize this is a new fast machine; I fully expect my old laptop would be much slower (10x ?) than 3ms in files this large, which makes using parent navigation for things like font-lock problematic.
>> 
>> The patched version results also make a lot more sense in terms of their similar logarithmic growth as node-at-point, since the method of search for a node at point and for its parent is, as Yuan points at, quite similar.
> 
> I inspected the descending algorithm, and there’s indeed an oversight made by me. Here’s a patch that should fix it. I tested it briefly and it does speeds things up greatly. Thanks for investigating this, JD!
> 
> I think the patch is relatively safe, so maybe we can push it to emacs-29 instead of master.
> 
> Yuan
> 
> <node-parent.patch>


Re: Tree-sitter navigation time grows as sqrt(line-number)
#306913
Author: Dmitry Gutov
Date: Sun, 20 Aug 2023 03:39
29 lines
1453 bytes
On 20/08/2023 03:18, JD Smith wrote:
> Great, thanks.  I tried this patch out, and there is indeed about 10x of improvement.  Check the bottom of the gist.  That said, node_parent remains 10x faster yet (at worst, in a long file), so maybe there’s room for further improvement?

Similarly, I also see an improvement from Yuan's patch in my testing
(about 2x), while the patch with ts_node_parent remains the fastest
anyway. Where my test looks like this:

   (benchmark 1000 '(treesit-node-parent n))

I looked around for the reasons for the difference. Built the latest
tree-sitter (didn't help) and found these two threads on GH:

https://github.com/tree-sitter/tree-sitter/issues/567#issuecomment-595564171
- Max Brunsfield says "There is some caching done in that method to make
sure it performs well in the common case of walking repeatedly up the
tree", but I haven't found where said caching resides so far.

https://github.com/tree-sitter/tree-sitter/discussions/878 - mentions
that mixing cursor and direct node apis leads to suboptimal results, and
just using the former gives an improvement. No "good" code example in there.

 >  May be worth looking at how others are doing it, e.g. the python API.

Apparently they have both a wrapper for a cursor API, and
node_get_parent which is implemented using ts_node_parent:
https://github.com/tree-sitter/py-tree-sitter/issues/34

Leaving it to the callers to choose which one to use.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306931
Author: JD Smith
Date: Sun, 20 Aug 2023 08:40
1963 lines
147710 bytes
--Apple-Mail=_017751E0-2B68-4F2E-BE63-4DE9A8352BD3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Looks like a winner (see below, or the gist)!  Thanks all.  

I do think we should consider a treesit-node-ancestors function that collects all the parent (of parent) nodes in one go into an (emacs) list, since you basically have to descend the whole tree from root to find the 1st parent anyway.   Then people who want to know, e.g., “am I in an if block?” can just test node type down the full ancestor list.  Of course, also, node-parent-until/while could be re-written to use node-ancestors, for some additional efficiency.


--Apple-Mail=_017751E0-2B68-4F2E-BE63-4DE9A8352BD3
Content-Disposition: inline;
	filename=PastedGraphic-1.png
Content-Type: image/png;
	name="PastedGraphic-1.png"
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAAERlWElmTU0A
KgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACgKADAAQAAAAB
AAAB4AAAAAAfNMscAAABzWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxu
czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJE
RiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMi
PgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpl
eGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOkNvbG9y
U3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+
MTkyMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lv
bj4xNDQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAg
IDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CpfyZkgAAEAASURBVHgB7J0HnJTV1cZPRJpUBUGkCFYE
RbBhF7tiSSyIGmLsXaMmmsRYo+ZTE2PD3lvEggUrioqoYKMJKiIIgvTeu+93/hfO+O4wW2Zmy8zO
Ob+dfdutz23PPbf9JlIRF0fAEXAEHAFHwBFwBByBgkFgg4KJqUfUEXAEHAFHwBFwBBwBRyAg4ATQ
M4Ij4Ag4Ao6AI+AIOAIFhoATwAJLcI+uI+AIOAKOgCPgCDgCTgA9DzgCjoAj4Ag4Ao6AI1BgCDgB
LLAE9+g6Ao6AI+AIOAKOgCPgBNDzgCPgCDgCjoAj4Ag4AgWGgBPAAktwj64j4Ag4Ao6AI+AIOAJO
AD0POAKOgCPgCDgCjoAjUGAIOAEssAT36DoCjoAj4Ag4Ao6AI+AE0POAI+AIOAKOgCPgCDgCBYaA
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
--Apple-Mail=_017751E0-2B68-4F2E-BE63-4DE9A8352BD3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> On Aug 19, 2023, at 10:01 PM, Yuan Fu <casouri@gmail.com> wrote:
> 
> 
> 
>> On Aug 19, 2023, at 5:39 PM, Dmitry Gutov <dmitry@gutov.dev> wrote:
>> 
>> On 20/08/2023 03:18, JD Smith wrote:
>>> Great, thanks.  I tried this patch out, and there is indeed about 10x of improvement.  Check the bottom of the gist.  That said, node_parent remains 10x faster yet (at worst, in a long file), so maybe there’s room for further improvement?
>> 
>> Similarly, I also see an improvement from Yuan's patch in my testing (about 2x), while the patch with ts_node_parent remains the fastest anyway. Where my test looks like this:
>> 
>> (benchmark 1000 '(treesit-node-parent n))
>> 
>> I looked around for the reasons for the difference. Built the latest tree-sitter (didn't help) and found these two threads on GH:
>> 
>> https://github.com/tree-sitter/tree-sitter/issues/567#issuecomment-595564171 - Max Brunsfield says "There is some caching done in that method to make sure it performs well in the common case of walking repeatedly up the tree", but I haven't found where said caching resides so far.
>> 
>> https://github.com/tree-sitter/tree-sitter/discussions/878 - mentions that mixing cursor and direct node apis leads to suboptimal results, and just using the former gives an improvement. No "good" code example in there.
>> 
>>> May be worth looking at how others are doing it, e.g. the python API.
>> 
>> Apparently they have both a wrapper for a cursor API, and node_get_parent which is implemented using ts_node_parent: https://github.com/tree-sitter/py-tree-sitter/issues/34
>> 
>> Leaving it to the callers to choose which one to use.
> 
> Ok, I fiddled around a bit more, and this patch (applies to master) should make the speed comparable to ts_node_parent.
> 
> Yuan
> 
> <node-parent.patch>
> 


--Apple-Mail=_017751E0-2B68-4F2E-BE63-4DE9A8352BD3--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306918
Author: Eli Zaretskii
Date: Sun, 20 Aug 2023 09:18
14 lines
557 bytes
> From: Yuan Fu <casouri@gmail.com>
> Date: Sat, 19 Aug 2023 15:16:12 -0700
> Cc: Dmitry Gutov <dmitry@gutov.dev>,
>  emacs-devel@gnu.org
>
> I inspected the descending algorithm, and there’s indeed an oversight made by me. Here’s a patch that should fix it. I tested it briefly and it does speeds things up greatly. Thanks for investigating this, JD!
>
> I think the patch is relatively safe, so maybe we can push it to emacs-29 instead of master.

Yes, please install on emacs-29 (assuming no one comes up with some
regression due to it).

Thanks.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#306968
Author: Dmitry Gutov
Date: Sun, 20 Aug 2023 23:26
14 lines
883 bytes
On 20/08/2023 15:40, JD Smith wrote:
> Looks like a winner (see below, or the gist)!  Thanks all.

Same here, thanks all indeed.

> I do think we should consider a treesit-node-ancestors function that collects all the parent (of parent) nodes in one go into an (emacs) list, since you basically have to descend the whole tree from root to find the 1st parent anyway.   Then people who want to know, e.g., “am I in an if block?” can just test node type down the full ancestor list.  Of course, also, node-parent-until/while could be re-written to use node-ancestors, for some additional efficiency.

Should be useful, but the speedup from traversing only once might be
negated by the work of allocating the full list of Lisp objects. So it
might improve only certain applications.

OTOH, node-parent-until/while could be rewritten in a way that only
allocates Lisp on-demand.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307071
Author: Yuan Fu
Date: Mon, 21 Aug 2023 18:41
34 lines
1317 bytes

> On Aug 20, 2023, at 1:26 PM, Dmitry Gutov <dmitry@gutov.dev> wrote:
> 
> On 20/08/2023 15:40, JD Smith wrote:
>> Looks like a winner (see below, or the gist)!  Thanks all.
> 
> Same here, thanks all indeed.

Let’s run with this patch for sometime. If all goes well, I’ll push to emacs-29. 

> 
>> I do think we should consider a treesit-node-ancestors function that collects all the parent (of parent) nodes in one go into an (emacs) list, since you basically have to descend the whole tree from root to find the 1st parent anyway.   Then people who want to know, e.g., “am I in an if block?” can just test node type down the full ancestor list.  Of course, also, node-parent-until/while could be re-written to use node-ancestors, for some additional efficiency.
> 
> Should be useful, but the speedup from traversing only once might be negated by the work of allocating the full list of Lisp objects. So it might improve only certain applications.
> 
> OTOH, node-parent-until/while could be rewritten in a way that only allocates Lisp on-demand.

Yeah, node-parent is already fast, and a tree’s height mostly doesn’t grow higher than, say, 30 levels, so I won’t worry about it until some real scenario pops up.

Yuan
Re: Tree-sitter navigation time grows as sqrt(line-number)
#307087
Author: JD Smith
Date: Tue, 22 Aug 2023 17:07
53 lines
2020 bytes

> On Aug 21, 2023, at 9:41 PM, Yuan Fu <casouri@gmail.com> wrote:
> 
> 
> 
>> On Aug 20, 2023, at 1:26 PM, Dmitry Gutov <dmitry@gutov.dev> wrote:
>> 
>> On 20/08/2023 15:40, JD Smith wrote:
>>> Looks like a winner (see below, or the gist)!  Thanks all.
>> 
>> Same here, thanks all indeed.
> 
> Let’s run with this patch for sometime. If all goes well, I’ll push to emacs-29. 
> 
>> 
>>> I do think we should consider a treesit-node-ancestors function that collects all the parent (of parent) nodes in one go into an (emacs) list, since you basically have to descend the whole tree from root to find the 1st parent anyway.   Then people who want to know, e.g., “am I in an if block?” can just test node type down the full ancestor list.  Of course, also, node-parent-until/while could be re-written to use node-ancestors, for some additional efficiency.
>> 
>> Should be useful, but the speedup from traversing only once might be negated by the work of allocating the full list of Lisp objects. So it might improve only certain applications.
>> 
>> OTOH, node-parent-until/while could be rewritten in a way that only allocates Lisp on-demand.
> 
> Yeah, node-parent is already fast, and a tree’s height mostly doesn’t grow higher than, say, 30 levels, so I won’t worry about it until some real scenario pops up.
> 

Sounds good.  In the meantime I have discovered treesit-query-capture, which is already very fast and can generate a list of all parents (of a certain type etc.):

(let* ((qry (treesit-query-compile 'python '([(argument_list) (parameters) (list) (dictionary)
     (parenthesized_expression) (subscript)]
    @ctx)))
       (n (treesit-node-at (point)))
       (bg (treesit-node-start n))
       (en (treesit-node-end n)))
  (treesit-query-capture 'python qry bg en t))

It is key to compile the query in advance.  It’s actually pretty similar in speed to the parent navigation.
Re: Tree-sitter navigation time grows as sqrt(line-number)
#307558
Author: Yuan Fu
Date: Wed, 30 Aug 2023 21:26
26 lines
564 bytes

> On Aug 22, 2023, at 2:07 PM, JD Smith <jdtsmith@gmail.com> wrote:
> 
> 
> 
>> On Aug 21, 2023, at 9:41 PM, Yuan Fu <casouri@gmail.com> wrote:
>> 
>> 
>> 
>>> On Aug 20, 2023, at 1:26 PM, Dmitry Gutov <dmitry@gutov.dev> wrote:
>>> 
>>> On 20/08/2023 15:40, JD Smith wrote:
>>>> Looks like a winner (see below, or the gist)!  Thanks all.
>>> 
>>> Same here, thanks all indeed.
>> 
>> Let’s run with this patch for sometime. If all goes well, I’ll push to emacs-29. 
>> 

I’ve pushed the patch to emacs-29.

Yuan


Re: Tree-sitter navigation time grows as sqrt(line-number)
#307564
Author: Eli Zaretskii
Date: Thu, 31 Aug 2023 09:03
17 lines
485 bytes
> From: Yuan Fu <casouri@gmail.com>
> Date: Wed, 30 Aug 2023 21:26:58 -0700
> Cc: Dmitry Gutov <dmitry@gutov.dev>,
>  emacs-devel@gnu.org
>
> >>> On 20/08/2023 15:40, JD Smith wrote:
> >>>> Looks like a winner (see below, or the gist)!  Thanks all.
> >>>
> >>> Same here, thanks all indeed.
> >>
> >> Let’s run with this patch for sometime. If all goes well, I’ll push to emacs-29.
> >>
>
> I’ve pushed the patch to emacs-29.

Thanks, but why emacs-29?  Is this a bugfix?

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307639
Author: JD Smith
Date: Thu, 31 Aug 2023 09:58
98 lines
4815 bytes
--Apple-Mail=_15992026-EE10-45A0-BBAF-AE7949D0E5F4
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

The scale of the improvement is up to 100x.  For me it has been on the edge between “acceptable” and “very bad”.  I have the impression that most modes are using treesit-query-capture with compiled queries for performance-sensitive stuff (font lock), which is fast, and hasn’t changed.  So those shouldn’t be affected. 

But any tree-sitter modes developed over the next few years to respect more “containing context” (structural editing, navigation, smarter context highlighting and folding, etc.) will I bet first reach for treesit-node-parent and its friends treesit-parent-while/until, as I did.  For example, I believe combobulate[1] is using these frequently (Mickey copied here).  These functions are up to 100x slower than necessary on long but still reasonable (10k line) files.

Is there a test harness somewhere that exercises treesit commands in large buffers of various different languages?  Perhaps a test could be added to “navigate up several generations” from random locations in the buffer and confirm the same nodes are reached.

[1] https://github.com/mickeynp/combobulate

> On Aug 31, 2023, at 8:51 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> Date: Thu, 31 Aug 2023 14:04:39 +0300
>> Cc: jdtsmith@gmail.com, emacs-devel@gnu.org
>> From: Dmitry Gutov <dmitry@gutov.dev>
>> 
>> On 31/08/2023 09:03, Eli Zaretskii wrote:
>>> Thanks, but why emacs-29?  Is this a bugfix?
>> 
>> Depending on the POV, O(N^2) performance for certain buffer interactions 
>> can be considered a bug.
> 
> Performance improvement is an enhancement.  Unless the performance is
> very bad, I don't think its place is on the release branch, especially
> after the major release.
> 
> Stefan, WDYT?


--Apple-Mail=_15992026-EE10-45A0-BBAF-AE7949D0E5F4
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">The scale of the improvement is up to 100x.  <font color="#000000">For me it has been on the edge between “acceptable” and “very bad”.  I have the impression that most modes are using treesit-query-capture with compiled queries for performance-sensitive stuff (font lock), which is fast, and hasn’t changed.  So those shouldn’t be affected. </font><div><font color="#000000"><br></font></div><div><font color="#000000">But</font> any tree-sitter modes developed over the next few years to respect more “containing context” (structural editing, navigation, smarter context highlighting and folding, etc.) will I bet first reach for treesit-node-parent and its friends treesit-parent-while/<span style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">until</span>, as I did.  For example, I believe combobulate[1] is using these frequently (Mickey copied here).  These functions are up to 100x slower than necessary on long but still reasonable (10k line) files.</div><div><div><div><div><br></div><div>Is there a test harness somewhere that exercises treesit commands in large buffers of various different languages?  Perhaps a test could be added to “navigate up several generations” from random locations in the buffer and confirm the same nodes are reached.<br><div><br></div><div>[1] <a href="https://github.com/mickeynp/combobulate">https://github.com/mickeynp/combobulate</a></div><div><br><blockquote type="cite"><div>On Aug 31, 2023, at 8:51 AM, Eli Zaretskii <eliz@gnu.org> wrote:</div><br class="Apple-interchange-newline"><div><div><blockquote type="cite">Date: Thu, 31 Aug 2023 14:04:39 +0300<br>Cc: jdtsmith@gmail.com, emacs-devel@gnu.org<br>From: Dmitry Gutov <dmitry@gutov.dev><br><br>On 31/08/2023 09:03, Eli Zaretskii wrote:<br><blockquote type="cite">Thanks, but why emacs-29?  Is this a bugfix?<br></blockquote><br>Depending on the POV, O(N^2) performance for certain buffer interactions <br>can be considered a bug.<br></blockquote><br>Performance improvement is an enhancement.  Unless the performance is<br>very bad, I don't think its place is on the release branch, especially<br>after the major release.<br><br>Stefan, WDYT?<br></div></div></blockquote></div><br></div></div></div></div></body></html>
--Apple-Mail=_15992026-EE10-45A0-BBAF-AE7949D0E5F4--

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307663
Author: Yuan Fu
Date: Thu, 31 Aug 2023 12:03
29 lines
896 bytes

> On Aug 30, 2023, at 11:03 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Wed, 30 Aug 2023 21:26:58 -0700
>> Cc: Dmitry Gutov <dmitry@gutov.dev>,
>> emacs-devel@gnu.org
>> 
>>>>> On 20/08/2023 15:40, JD Smith wrote:
>>>>>> Looks like a winner (see below, or the gist)!  Thanks all.
>>>>> 
>>>>> Same here, thanks all indeed.
>>>> 
>>>> Let’s run with this patch for sometime. If all goes well, I’ll push to emacs-29. 
>>>> 
>> 
>> I’ve pushed the patch to emacs-29.
> 
> Thanks, but why emacs-29?  Is this a bugfix?

The line is a bit blurry for this one, as others have discussed. I pushed to emacs-29 because a while ago you said yes to pushing to emacs-29. Admittedly that was a slightly different patch but the result is the same. Personally I don’t have strong feelings either way.

Yuan
Re: Tree-sitter navigation time grows as sqrt(line-number)
#307598
Author: Dmitry Gutov
Date: Thu, 31 Aug 2023 14:04
6 lines
190 bytes
On 31/08/2023 09:03, Eli Zaretskii wrote:
> Thanks, but why emacs-29?  Is this a bugfix?

Depending on the POV, O(N^2) performance for certain buffer interactions
can be considered a bug.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307614
Author: Eli Zaretskii
Date: Thu, 31 Aug 2023 15:51
16 lines
511 bytes
> Date: Thu, 31 Aug 2023 14:04:39 +0300
> Cc: jdtsmith@gmail.com, emacs-devel@gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 31/08/2023 09:03, Eli Zaretskii wrote:
> > Thanks, but why emacs-29?  Is this a bugfix?
>
> Depending on the POV, O(N^2) performance for certain buffer interactions
> can be considered a bug.

Performance improvement is an enhancement.  Unless the performance is
very bad, I don't think its place is on the release branch, especially
after the major release.

Stefan, WDYT?

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307604
Author: Po Lu
Date: Thu, 31 Aug 2023 19:42
8 lines
237 bytes
Dmitry Gutov <dmitry@gutov.dev> writes:

> Depending on the POV, O(N^2) performance for certain buffer
> interactions can be considered a bug.

But is fixing it is worth the risk?  Is the change innocuous enough for
the release branch?

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307657
Author: Dmitry Gutov
Date: Thu, 31 Aug 2023 20:32
18 lines
681 bytes
On 31/08/2023 14:42, Po Lu wrote:
> Dmitry Gutov<dmitry@gutov.dev>  writes:
>
>> Depending on the POV, O(N^2) performance for certain buffer
>> interactions can be considered a bug.
> But is fixing it is worth the risk?  Is the change innocuous enough for
> the release branch?

It seems so, yes.

The change doesn't increase code complexity, and rather fixes an
omission where many nodes weren't outright filtered out during the search.

Also, as JD said, packages using tree-sitter are going to be constrained
by the lower common denominator of the primitives' performance
characteristics. At least some of those will be able to recommend 29.2
(or put it as a dependency).

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307659
Author: Dmitry Gutov
Date: Thu, 31 Aug 2023 20:49
8 lines
297 bytes
On 31/08/2023 15:51, Eli Zaretskii wrote:
> Unless the performance is
> very bad, I don't think its place is on the release branch, especially
> after the major release.

There was a complaint on Reddit about rust-ts-mode's syntax-highlighting
performance is certain large (but not huge) files.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307664
Author: Eli Zaretskii
Date: Thu, 31 Aug 2023 22:06
16 lines
653 bytes
> From: Yuan Fu <casouri@gmail.com>
> Date: Thu, 31 Aug 2023 12:03:49 -0700
> Cc: JD Smith <jdtsmith@gmail.com>,
>  Dmitry Gutov <dmitry@gutov.dev>,
>  emacs-devel@gnu.org
>
> >> I’ve pushed the patch to emacs-29.
> >
> > Thanks, but why emacs-29?  Is this a bugfix?
>
> The line is a bit blurry for this one, as others have discussed. I pushed to emacs-29 because a while ago you said yes to pushing to emacs-29. Admittedly that was a slightly different patch but the result is the same. Personally I don’t have strong feelings either way.

Stefan, WDYT about this?  I admit I'm a bit weary, but everyone else
seems to think this is a bugfix.


Re: Tree-sitter navigation time grows as sqrt(line-number)
#307666
Author: Stefan Kangas
Date: Thu, 31 Aug 2023 22:24
19 lines
743 bytes
Eli Zaretskii <eliz@gnu.org> writes:

> Stefan, WDYT about this?  I admit I'm a bit weary, but everyone else
> seems to think this is a bugfix.

I'm not sure I can be of much help here; I really haven't been
following treesitter development very closely.  Having looked at the
patch, the fix is also slightly less trivial than I had hoped, in the
sense that I don't understand it.  :-)

That said, I do think that stability expectations might be a bit
different for a completely new and (arguably) semi-optional feature.
Yuan Fu's stated opinion up-thread was that the patch is "relatively
safe".

If it was up to me, I'd probably keep it on emacs-29, with a readiness
to revert if any issues were to crop up.  But I won't object either
way.

Re: Tree-sitter navigation time grows as sqrt(line-number)
#307690
Author: Eli Zaretskii
Date: Fri, 01 Sep 2023 08:33
29 lines
1061 bytes
> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Thu, 31 Aug 2023 22:24:03 +0200
> Cc: Yuan Fu <casouri@gmail.com>, jdtsmith@gmail.com, dmitry@gutov.dev,
> 	emacs-devel@gnu.org
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > Stefan, WDYT about this?  I admit I'm a bit weary, but everyone else
> > seems to think this is a bugfix.
>
> I'm not sure I can be of much help here; I really haven't been
> following treesitter development very closely.  Having looked at the
> patch, the fix is also slightly less trivial than I had hoped, in the
> sense that I don't understand it.  :-)
>
> That said, I do think that stability expectations might be a bit
> different for a completely new and (arguably) semi-optional feature.
> Yuan Fu's stated opinion up-thread was that the patch is "relatively
> safe".
>
> If it was up to me, I'd probably keep it on emacs-29, with a readiness
> to revert if any issues were to crop up.  But I won't object either
> way.

OK, so let's keep it on emacs-29 and watch for any possible problems
it could cause.

Thanks.

Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads