From apahim at redhat.com Thu Nov 20 07:20:09 2014
Content-Type: multipart/mixed; boundary="===============5779157013650671914=="
MIME-Version: 1.0
From: Amador Pahim
To: users at ovirt.org
Subject: Re: [ovirt-users] Cumulative VM network usagePERIOD_TIME
Date: Thu, 20 Nov 2014 09:20:07 -0300
Message-ID: <546DDC77.3090803@redhat.com>
In-Reply-To: 5461DFFE.9060006@redhat.com
--===============5779157013650671914==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
This is a multi-part message in MIME format.
--------------080401060806050003020601
Content-Type: text/plain; charset=3Dwindows-1252; format=3Dflowed
Content-Transfer-Encoding: 7bit
Hi Lior,
Thank you for this. Indeed I have seen multiple requests for this. I =
also have a bugzilla for it: =
https://bugzilla.redhat.com/show_bug.cgi?id=3D1108144. Some comments bellow.
On 11/11/2014 07:07 AM, Lior Vernia wrote:
> Hello,
>
> The need to monitor cumulative VM network usage has come up several
> times in the past; while this should be handled as part of
> (https://bugzilla.redhat.com/show_bug.cgi?id=3D1063343), in the mean time
> I've written a small Python script that monitors those statistics,
> attached here.
>
> The script polls the engine via RESTful API periodically and dumps the
> up-to-date total usage into a file. The output is a multi-level
> map/dictionary in JSON format, where:
> * The top level keys are VM names.
> * Under each VM, the next level keys are vNIC names.
> * Under each vNIC, there are keys for total 'rx' (received) and 'tx'
> (transmitted), where the values are in Bytes.
>
> The script is built to run forever. It may be stopped at any time, but
> while it's not running VM network usage data will "be lost". When it's
> re-run, it'll go back to accumulating data on top of its previous data.
This could be mitigated if along with rx and tx data, vdsm was reporting =
a timestamp reflecting the time when data was collected. So, even with =
gaps, we should be able to calculate the cumulative information.
>
> A few disclaimers:
> * I haven't tested this with any edge cases (engine service dies, etc.).
> * Tested this with tens of VMs, not sure it'll work fine with hundreds.
> * The PERIOD_TIME (polling interval) should be set so that it matches
> both the engine's and vdsm's polling interval (see comments inside the
> script), otherwise data will be either lost or counted multiple times.
> From 3.4 onwards, default configuration should be fine with 15 seconds.
Here we have another issue. In 3.4, 15 seconds is fine... backend and =
vdsm are in line with 15 seconds. But up to 3.3, vdsm is pooling the =
data every 5 seconds and backend is collecting data every 15 seconds. So =
2 in 3 vdsm poolings are droped. Since you're handling total bytes, this =
might not be a big issue.
> * The precision of traffic measurement on a NIC is 0.1% of the
> interface's speed over each PERIOD_TIME interval. For example, on a
> 1Gbps vNIC, when PERIOD_TIME =3D 15s, data will only be measured in 15Mb
> (~2MB) quanta. Specifically what this means is, that in this example,
> any traffic smaller than 2MB over a 15-second period would be negligible
> and wouldn't be recorded.
Looking to the code, if "overhead" is bigger than "PERIOD_TIME", =
cumulative data for a given period will never be accurate. Anyway the =
script will fall in exception when that is the case (negative value for =
time.sleep()). The mentioned timestamp reported by vdsm could drop the =
need for the "overhead" calculation.
>
> Knock yourselves out :)
>
>
> _______________________________________________
> Users mailing list
> Users(a)ovirt.org
> http://lists.ovirt.org/mailman/listinfo/users
--------------080401060806050003020601
Content-Type: text/html; charset=3Dwindows-1252
Content-Transfer-Encoding: 7bit
Hello,
The need to monitor cumulative VM network usage has come up several
times in the past; while this should be handled as part of
(https://bugzilla.redhat.com/show_bug.cgi?id=3D10633=
43), in the mean time
I've written a small Python script that monitors those statistics,
attached here.
The script polls the engine via RESTful API periodically and dumps the
up-to-date total usage into a file. The output is a multi-level
map/dictionary in JSON format, where:
* The top level keys are VM names.
* Under each VM, the next level keys are vNIC names.
* Under each vNIC, there are keys for total 'rx' (received) and 'tx'
(transmitted), where the values are in Bytes.
The script is built to run forever. It may be stopped at any time, but
while it's not running VM network usage data will "be lost". When it's
re-run, it'll go back to accumulating data on top of its previous data.
This could be mitigated if along with rx and tx data, vdsm was
reporting a timestamp reflecting the time when data was collected.
So, even with gaps, we should be able to calculate the cumulative
information.
A few disclaimers:
* I haven't tested this with any edge cases (engine service dies, etc.).
* Tested this with tens of VMs, not sure it'll work fine with hundreds.
* The PERIOD_TIME (polling interval) should be set so that it matches
both the engine's and vdsm's polling interval (see comments inside the
script), otherwise data will be either lost or counted multiple times.
>From 3.4 onwards, default configuration should be fine with 15 seconds.
Here we have another issue. In 3.4, 15 seconds is fine... backend
and vdsm are in line with 15 seconds. But up to 3.3, vdsm is pooling
the data every 5 seconds and backend is collecting data every 15
seconds. So 2 in 3 vdsm poolings are droped. Since you're handling
total bytes, this might not be a big issue.
* The precision of traffic measurement on a NIC is 0.1% of the
interface's speed over each PERIOD_TIME interval. For example, on a
1Gbps vNIC, when PERIOD_TIME =3D 15s, data will only be measured in 15Mb
(~2MB) quanta. Specifically what this means is, that in this example,
any traffic smaller than 2MB over a 15-second period would be negligible
and wouldn't be recorded.
Looking to the code, if "overhead" is bigger than "PERIOD_TIME",
cumulative data for a given period will never be accurate. Anyway
the script will fall in exception when that is the case (negative
value for time.sleep()). The mentioned timestamp reported by vdsm
could drop the need for the "overhead" calculation.
Knock yourselves out :)
_______________________________________________
Users mailing list
Use=
rs(a)ovirt.org
http://lists.ovirt.org/mailman/listinfo/users
--------------080401060806050003020601--
--===============5779157013650671914==
Content-Type: multipart/alternative
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="attachment.bin"
VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KLS0tLS0tLS0tLS0t
LS0wODA0MDEwNjA4MDYwNTAwMDMwMjA2MDEKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
c2V0PXdpbmRvd3MtMTI1MjsgZm9ybWF0PWZsb3dlZApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n
OiA3Yml0CgpIaSBMaW9yLAoKVGhhbmsgeW91IGZvciB0aGlzLiBJbmRlZWQgSSBoYXZlIHNlZW4g
bXVsdGlwbGUgcmVxdWVzdHMgZm9yIHRoaXMuIEkgCmFsc28gaGF2ZSBhIGJ1Z3ppbGxhIGZvciBp
dDogCmh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTEwODE0NC4g
U29tZSBjb21tZW50cyBiZWxsb3cuCgpPbiAxMS8xMS8yMDE0IDA3OjA3IEFNLCBMaW9yIFZlcm5p
YSB3cm90ZToKPiBIZWxsbywKPgo+IFRoZSBuZWVkIHRvIG1vbml0b3IgY3VtdWxhdGl2ZSBWTSBu
ZXR3b3JrIHVzYWdlIGhhcyBjb21lIHVwIHNldmVyYWwKPiB0aW1lcyBpbiB0aGUgcGFzdDsgd2hp
bGUgdGhpcyBzaG91bGQgYmUgaGFuZGxlZCBhcyBwYXJ0IG9mCj4gKGh0dHBzOi8vYnVnemlsbGEu
cmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzM0MyksIGluIHRoZSBtZWFuIHRpbWUKPiBJ
J3ZlIHdyaXR0ZW4gYSBzbWFsbCBQeXRob24gc2NyaXB0IHRoYXQgbW9uaXRvcnMgdGhvc2Ugc3Rh
dGlzdGljcywKPiBhdHRhY2hlZCBoZXJlLgo+Cj4gVGhlIHNjcmlwdCBwb2xscyB0aGUgZW5naW5l
IHZpYSBSRVNUZnVsIEFQSSBwZXJpb2RpY2FsbHkgYW5kIGR1bXBzIHRoZQo+IHVwLXRvLWRhdGUg
dG90YWwgdXNhZ2UgaW50byBhIGZpbGUuIFRoZSBvdXRwdXQgaXMgYSBtdWx0aS1sZXZlbAo+IG1h
cC9kaWN0aW9uYXJ5IGluIEpTT04gZm9ybWF0LCB3aGVyZToKPiAqIFRoZSB0b3AgbGV2ZWwga2V5
cyBhcmUgVk0gbmFtZXMuCj4gKiBVbmRlciBlYWNoIFZNLCB0aGUgbmV4dCBsZXZlbCBrZXlzIGFy
ZSB2TklDIG5hbWVzLgo+ICogVW5kZXIgZWFjaCB2TklDLCB0aGVyZSBhcmUga2V5cyBmb3IgdG90
YWwgJ3J4JyAocmVjZWl2ZWQpIGFuZCAndHgnCj4gKHRyYW5zbWl0dGVkKSwgd2hlcmUgdGhlIHZh
bHVlcyBhcmUgaW4gQnl0ZXMuCj4KPiBUaGUgc2NyaXB0IGlzIGJ1aWx0IHRvIHJ1biBmb3JldmVy
LiBJdCBtYXkgYmUgc3RvcHBlZCBhdCBhbnkgdGltZSwgYnV0Cj4gd2hpbGUgaXQncyBub3QgcnVu
bmluZyBWTSBuZXR3b3JrIHVzYWdlIGRhdGEgd2lsbCAiYmUgbG9zdCIuIFdoZW4gaXQncwo+IHJl
LXJ1biwgaXQnbGwgZ28gYmFjayB0byBhY2N1bXVsYXRpbmcgZGF0YSBvbiB0b3Agb2YgaXRzIHBy
ZXZpb3VzIGRhdGEuCgpUaGlzIGNvdWxkIGJlIG1pdGlnYXRlZCBpZiBhbG9uZyB3aXRoIHJ4IGFu
ZCB0eCBkYXRhLCB2ZHNtIHdhcyByZXBvcnRpbmcgCmEgdGltZXN0YW1wIHJlZmxlY3RpbmcgdGhl
IHRpbWUgd2hlbiBkYXRhIHdhcyBjb2xsZWN0ZWQuIFNvLCBldmVuIHdpdGggCmdhcHMsIHdlIHNo
b3VsZCBiZSBhYmxlIHRvIGNhbGN1bGF0ZSB0aGUgY3VtdWxhdGl2ZSBpbmZvcm1hdGlvbi4KCj4K
PiBBIGZldyBkaXNjbGFpbWVyczoKPiAqIEkgaGF2ZW4ndCB0ZXN0ZWQgdGhpcyB3aXRoIGFueSBl
ZGdlIGNhc2VzIChlbmdpbmUgc2VydmljZSBkaWVzLCBldGMuKS4KPiAqIFRlc3RlZCB0aGlzIHdp
dGggdGVucyBvZiBWTXMsIG5vdCBzdXJlIGl0J2xsIHdvcmsgZmluZSB3aXRoIGh1bmRyZWRzLgo+
ICogVGhlIFBFUklPRF9USU1FIChwb2xsaW5nIGludGVydmFsKSBzaG91bGQgYmUgc2V0IHNvIHRo
YXQgaXQgbWF0Y2hlcwo+IGJvdGggdGhlIGVuZ2luZSdzIGFuZCB2ZHNtJ3MgcG9sbGluZyBpbnRl
cnZhbCAoc2VlIGNvbW1lbnRzIGluc2lkZSB0aGUKPiBzY3JpcHQpLCBvdGhlcndpc2UgZGF0YSB3
aWxsIGJlIGVpdGhlciBsb3N0IG9yIGNvdW50ZWQgbXVsdGlwbGUgdGltZXMuCj4gIEZyb20gMy40
IG9ud2FyZHMsIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZmluZSB3aXRoIDE1IHNl
Y29uZHMuCgpIZXJlIHdlIGhhdmUgYW5vdGhlciBpc3N1ZS4gSW4gMy40LCAxNSBzZWNvbmRzIGlz
IGZpbmUuLi4gYmFja2VuZCBhbmQgCnZkc20gYXJlIGluIGxpbmUgd2l0aCAxNSBzZWNvbmRzLiBC
dXQgdXAgdG8gMy4zLCB2ZHNtIGlzIHBvb2xpbmcgdGhlIApkYXRhIGV2ZXJ5IDUgc2Vjb25kcyBh
bmQgYmFja2VuZCBpcyBjb2xsZWN0aW5nIGRhdGEgZXZlcnkgMTUgc2Vjb25kcy4gU28gCjIgaW4g
MyB2ZHNtIHBvb2xpbmdzIGFyZSBkcm9wZWQuIFNpbmNlIHlvdSdyZSBoYW5kbGluZyB0b3RhbCBi
eXRlcywgdGhpcyAKbWlnaHQgbm90IGJlIGEgYmlnIGlzc3VlLgoKPiAqIFRoZSBwcmVjaXNpb24g
b2YgdHJhZmZpYyBtZWFzdXJlbWVudCBvbiBhIE5JQyBpcyAwLjElIG9mIHRoZQo+IGludGVyZmFj
ZSdzIHNwZWVkIG92ZXIgZWFjaCBQRVJJT0RfVElNRSBpbnRlcnZhbC4gRm9yIGV4YW1wbGUsIG9u
IGEKPiAxR2JwcyB2TklDLCB3aGVuIFBFUklPRF9USU1FID0gMTVzLCBkYXRhIHdpbGwgb25seSBi
ZSBtZWFzdXJlZCBpbiAxNU1iCj4gKH4yTUIpIHF1YW50YS4gU3BlY2lmaWNhbGx5IHdoYXQgdGhp
cyBtZWFucyBpcywgdGhhdCBpbiB0aGlzIGV4YW1wbGUsCj4gYW55IHRyYWZmaWMgc21hbGxlciB0
aGFuIDJNQiBvdmVyIGEgMTUtc2Vjb25kIHBlcmlvZCB3b3VsZCBiZSBuZWdsaWdpYmxlCj4gYW5k
IHdvdWxkbid0IGJlIHJlY29yZGVkLgoKTG9va2luZyB0byB0aGUgY29kZSwgaWYgIm92ZXJoZWFk
IiBpcyBiaWdnZXIgdGhhbiAiUEVSSU9EX1RJTUUiLCAKY3VtdWxhdGl2ZSBkYXRhIGZvciBhIGdp
dmVuIHBlcmlvZCB3aWxsIG5ldmVyIGJlIGFjY3VyYXRlLiBBbnl3YXkgdGhlIApzY3JpcHQgd2ls
bCBmYWxsIGluIGV4Y2VwdGlvbiB3aGVuIHRoYXQgaXMgdGhlIGNhc2UgKG5lZ2F0aXZlIHZhbHVl
IGZvciAKdGltZS5zbGVlcCgpKS4gVGhlIG1lbnRpb25lZCB0aW1lc3RhbXAgcmVwb3J0ZWQgYnkg
dmRzbSBjb3VsZCBkcm9wIHRoZSAKbmVlZCBmb3IgdGhlICJvdmVyaGVhZCIgY2FsY3VsYXRpb24u
Cgo+Cj4gS25vY2sgeW91cnNlbHZlcyBvdXQgOikKPgo+Cj4gX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18KPiBVc2VycyBtYWlsaW5nIGxpc3QKPiBVc2Vyc0Bv
dmlydC5vcmcKPiBodHRwOi8vbGlzdHMub3ZpcnQub3JnL21haWxtYW4vbGlzdGluZm8vdXNlcnMK
CgotLS0tLS0tLS0tLS0tLTA4MDQwMTA2MDgwNjA1MDAwMzAyMDYwMQpDb250ZW50LVR5cGU6IHRl
eHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog
N2JpdAoKPGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJz
ZXQ9d2luZG93cy0xMjUyIgogICAgICBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiPgogIDwvaGVh
ZD4KICA8Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KICAgIDxkaXYgY2xh
c3M9Im1vei1jaXRlLXByZWZpeCI+SGkgTGlvciw8YnI+CiAgICAgIDxicj4KICAgICAgVGhhbmsg
eW91IGZvciB0aGlzLiBJbmRlZWQgSSBoYXZlIHNlZW4gbXVsdGlwbGUgcmVxdWVzdHMgZm9yIHRo
aXMuCiAgICAgIEkgYWxzbyBoYXZlIGEgYnVnemlsbGEgZm9yIGl0OgogICAgICA8YSBjbGFzcz0i
bW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20v
c2hvd19idWcuY2dpP2lkPTExMDgxNDQiPmh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93
X2J1Zy5jZ2k/aWQ9MTEwODE0NDwvYT4uIFNvbWUgY29tbWVudHMKICAgICAgYmVsbG93Ljxicj4K
ICAgICAgPGJyPgogICAgICBPbiAxMS8xMS8yMDE0IDA3OjA3IEFNLCBMaW9yIFZlcm5pYSB3cm90
ZTo8YnI+CiAgICA8L2Rpdj4KICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1NDYxREZGRS45MDYw
MDA2QHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgogICAgICA8cHJlIHdyYXA9IiI+SGVsbG8sCgpU
aGUgbmVlZCB0byBtb25pdG9yIGN1bXVsYXRpdmUgVk0gbmV0d29yayB1c2FnZSBoYXMgY29tZSB1
cCBzZXZlcmFsCnRpbWVzIGluIHRoZSBwYXN0OyB3aGlsZSB0aGlzIHNob3VsZCBiZSBoYW5kbGVk
IGFzIHBhcnQgb2YKKDxhIGNsYXNzPSJtb3otdHh0LWxpbmstZnJlZXRleHQiIGhyZWY9Imh0dHBz
Oi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzM0MyI+aHR0cHM6Ly9i
dWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMDYzMzQzPC9hPiksIGluIHRoZSBt
ZWFuIHRpbWUKSSd2ZSB3cml0dGVuIGEgc21hbGwgUHl0aG9uIHNjcmlwdCB0aGF0IG1vbml0b3Jz
IHRob3NlIHN0YXRpc3RpY3MsCmF0dGFjaGVkIGhlcmUuCgpUaGUgc2NyaXB0IHBvbGxzIHRoZSBl
bmdpbmUgdmlhIFJFU1RmdWwgQVBJIHBlcmlvZGljYWxseSBhbmQgZHVtcHMgdGhlCnVwLXRvLWRh
dGUgdG90YWwgdXNhZ2UgaW50byBhIGZpbGUuIFRoZSBvdXRwdXQgaXMgYSBtdWx0aS1sZXZlbApt
YXAvZGljdGlvbmFyeSBpbiBKU09OIGZvcm1hdCwgd2hlcmU6CiogVGhlIHRvcCBsZXZlbCBrZXlz
IGFyZSBWTSBuYW1lcy4KKiBVbmRlciBlYWNoIFZNLCB0aGUgbmV4dCBsZXZlbCBrZXlzIGFyZSB2
TklDIG5hbWVzLgoqIFVuZGVyIGVhY2ggdk5JQywgdGhlcmUgYXJlIGtleXMgZm9yIHRvdGFsICdy
eCcgKHJlY2VpdmVkKSBhbmQgJ3R4JwoodHJhbnNtaXR0ZWQpLCB3aGVyZSB0aGUgdmFsdWVzIGFy
ZSBpbiBCeXRlcy4KClRoZSBzY3JpcHQgaXMgYnVpbHQgdG8gcnVuIGZvcmV2ZXIuIEl0IG1heSBi
ZSBzdG9wcGVkIGF0IGFueSB0aW1lLCBidXQKd2hpbGUgaXQncyBub3QgcnVubmluZyBWTSBuZXR3
b3JrIHVzYWdlIGRhdGEgd2lsbCAiYmUgbG9zdCIuIFdoZW4gaXQncwpyZS1ydW4sIGl0J2xsIGdv
IGJhY2sgdG8gYWNjdW11bGF0aW5nIGRhdGEgb24gdG9wIG9mIGl0cyBwcmV2aW91cyBkYXRhLjwv
cHJlPgogICAgPC9ibG9ja3F1b3RlPgogICAgPGJyPgogICAgVGhpcyBjb3VsZCBiZSBtaXRpZ2F0
ZWQgaWYgYWxvbmcgd2l0aCByeCBhbmQgdHggZGF0YSwgdmRzbSB3YXMKICAgIHJlcG9ydGluZyBh
IHRpbWVzdGFtcCByZWZsZWN0aW5nIHRoZSB0aW1lIHdoZW4gZGF0YSB3YXMgY29sbGVjdGVkLgog
ICAgU28sIGV2ZW4gd2l0aCBnYXBzLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBjYWxjdWxhdGUgdGhl
IGN1bXVsYXRpdmUKICAgIGluZm9ybWF0aW9uLjxicj4KICAgIDxicj4KICAgIDxibG9ja3F1b3Rl
IGNpdGU9Im1pZDo1NDYxREZGRS45MDYwMDA2QHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgogICAg
ICA8cHJlIHdyYXA9IiI+CgpBIGZldyBkaXNjbGFpbWVyczoKKiBJIGhhdmVuJ3QgdGVzdGVkIHRo
aXMgd2l0aCBhbnkgZWRnZSBjYXNlcyAoZW5naW5lIHNlcnZpY2UgZGllcywgZXRjLikuCiogVGVz
dGVkIHRoaXMgd2l0aCB0ZW5zIG9mIFZNcywgbm90IHN1cmUgaXQnbGwgd29yayBmaW5lIHdpdGgg
aHVuZHJlZHMuCiogVGhlIFBFUklPRF9USU1FIChwb2xsaW5nIGludGVydmFsKSBzaG91bGQgYmUg
c2V0IHNvIHRoYXQgaXQgbWF0Y2hlcwpib3RoIHRoZSBlbmdpbmUncyBhbmQgdmRzbSdzIHBvbGxp
bmcgaW50ZXJ2YWwgKHNlZSBjb21tZW50cyBpbnNpZGUgdGhlCnNjcmlwdCksIG90aGVyd2lzZSBk
YXRhIHdpbGwgYmUgZWl0aGVyIGxvc3Qgb3IgY291bnRlZCBtdWx0aXBsZSB0aW1lcy4KPkZyb20g
My40IG9ud2FyZHMsIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZmluZSB3aXRoIDE1
IHNlY29uZHMuPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8YnI+CiAgICBIZXJlIHdlIGhh
dmUgYW5vdGhlciBpc3N1ZS4gSW4gMy40LCAxNSBzZWNvbmRzIGlzIGZpbmUuLi4gYmFja2VuZAog
ICAgYW5kIHZkc20gYXJlIGluIGxpbmUgd2l0aCAxNSBzZWNvbmRzLiBCdXQgdXAgdG8gMy4zLCB2
ZHNtIGlzIHBvb2xpbmcKICAgIHRoZSBkYXRhIGV2ZXJ5IDUgc2Vjb25kcyBhbmQgYmFja2VuZCBp
cyBjb2xsZWN0aW5nIGRhdGEgZXZlcnkgMTUKICAgIHNlY29uZHMuIFNvIDIgaW4gMyB2ZHNtIHBv
b2xpbmdzIGFyZSBkcm9wZWQuIFNpbmNlIHlvdSdyZSBoYW5kbGluZwogICAgdG90YWwgYnl0ZXMs
IHRoaXMgbWlnaHQgbm90IGJlIGEgYmlnIGlzc3VlLjxicj4KICAgIDxicj4KICAgIDxibG9ja3F1
b3RlIGNpdGU9Im1pZDo1NDYxREZGRS45MDYwMDA2QHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgog
ICAgICA8cHJlIHdyYXA9IiI+CiogVGhlIHByZWNpc2lvbiBvZiB0cmFmZmljIG1lYXN1cmVtZW50
IG9uIGEgTklDIGlzIDAuMSUgb2YgdGhlCmludGVyZmFjZSdzIHNwZWVkIG92ZXIgZWFjaCBQRVJJ
T0RfVElNRSBpbnRlcnZhbC4gRm9yIGV4YW1wbGUsIG9uIGEKMUdicHMgdk5JQywgd2hlbiBQRVJJ
T0RfVElNRSA9IDE1cywgZGF0YSB3aWxsIG9ubHkgYmUgbWVhc3VyZWQgaW4gMTVNYgoofjJNQikg
cXVhbnRhLiBTcGVjaWZpY2FsbHkgd2hhdCB0aGlzIG1lYW5zIGlzLCB0aGF0IGluIHRoaXMgZXhh
bXBsZSwKYW55IHRyYWZmaWMgc21hbGxlciB0aGFuIDJNQiBvdmVyIGEgMTUtc2Vjb25kIHBlcmlv
ZCB3b3VsZCBiZSBuZWdsaWdpYmxlCmFuZCB3b3VsZG4ndCBiZSByZWNvcmRlZC48L3ByZT4KICAg
IDwvYmxvY2txdW90ZT4KICAgIDxicj4KICAgIExvb2tpbmcgdG8gdGhlIGNvZGUsIGlmICJvdmVy
aGVhZCIgaXMgYmlnZ2VyIHRoYW4gIlBFUklPRF9USU1FIiwKICAgIGN1bXVsYXRpdmUgZGF0YSBm
b3IgYSBnaXZlbiBwZXJpb2Qgd2lsbCBuZXZlciBiZSBhY2N1cmF0ZS4gQW55d2F5CiAgICB0aGUg
c2NyaXB0IHdpbGwgZmFsbCBpbiBleGNlcHRpb24gd2hlbiB0aGF0IGlzIHRoZSBjYXNlIChuZWdh
dGl2ZQogICAgdmFsdWUgZm9yIHRpbWUuc2xlZXAoKSkuIFRoZSBtZW50aW9uZWQgdGltZXN0YW1w
IHJlcG9ydGVkIGJ5IHZkc20KICAgIGNvdWxkIGRyb3AgdGhlIG5lZWQgZm9yIHRoZSAib3Zlcmhl
YWQiIGNhbGN1bGF0aW9uLjxicj4KICAgIDxicj4KICAgIDxibG9ja3F1b3RlIGNpdGU9Im1pZDo1
NDYxREZGRS45MDYwMDA2QHJlZGhhdC5jb20iIHR5cGU9ImNpdGUiPgogICAgICA8cHJlIHdyYXA9
IiI+CgpLbm9jayB5b3Vyc2VsdmVzIG91dCA6KQo8L3ByZT4KICAgICAgPGJyPgogICAgICA8Zmll
bGRzZXQgY2xhc3M9Im1pbWVBdHRhY2htZW50SGVhZGVyIj48L2ZpZWxkc2V0PgogICAgICA8YnI+
CiAgICAgIDxwcmUgd3JhcD0iIj5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXwpVc2VycyBtYWlsaW5nIGxpc3QKPGEgY2xhc3M9Im1vei10eHQtbGluay1hYmJy
ZXZpYXRlZCIgaHJlZj0ibWFpbHRvOlVzZXJzQG92aXJ0Lm9yZyI+VXNlcnNAb3ZpcnQub3JnPC9h
Pgo8YSBjbGFzcz0ibW96LXR4dC1saW5rLWZyZWV0ZXh0IiBocmVmPSJodHRwOi8vbGlzdHMub3Zp
cnQub3JnL21haWxtYW4vbGlzdGluZm8vdXNlcnMiPmh0dHA6Ly9saXN0cy5vdmlydC5vcmcvbWFp
bG1hbi9saXN0aW5mby91c2VyczwvYT4KPC9wcmU+CiAgICA8L2Jsb2NrcXVvdGU+CiAgICA8YnI+
CiAgPC9ib2R5Pgo8L2h0bWw+CgotLS0tLS0tLS0tLS0tLTA4MDQwMTA2MDgwNjA1MDAwMzAyMDYw
MS0tCg==
--===============5779157013650671914==--