SW50cm8KLS0tLS0KVGhpcyBkZXNjcmliZXMgYW4gYWRhcHRpdmUsIHN0YWJsZSwgbmF0dXJhbCBtZXJnZXNvcnQsIG1vZGVzdGx5IGNhbGxlZAp0aW1zb3J0IChoZXksIEkgZWFybmVkIGl0IDx3aW5rPikuICBJdCBoYXMgc3VwZXJuYXR1cmFsIHBlcmZvcm1hbmNlIG9uIG1hbnkKa2luZHMgb2YgcGFydGlhbGx5IG9yZGVyZWQgYXJyYXlzIChsZXNzIHRoYW4gbGcoTiEpIGNvbXBhcmlzb25zIG5lZWRlZCwgYW5kCmFzIGZldyBhcyBOLTEpLCB5ZXQgYXMgZmFzdCBhcyBQeXRob24ncyBwcmV2aW91cyBoaWdobHkgdHVuZWQgc2FtcGxlc29ydApoeWJyaWQgb24gcmFuZG9tIGFycmF5cy4KCkluIGEgbnV0c2hlbGwsIHRoZSBtYWluIHJvdXRpbmUgbWFyY2hlcyBvdmVyIHRoZSBhcnJheSBvbmNlLCBsZWZ0IHRvIHJpZ2h0LAphbHRlcm5hdGVseSBpZGVudGlmeWluZyB0aGUgbmV4dCBydW4sIHRoZW4gbWVyZ2luZyBpdCBpbnRvIHRoZSBwcmV2aW91cwpydW5zICJpbnRlbGxpZ2VudGx5Ii4gIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb21wbGljYXRpb24gZm9yIHNwZWVkLCBhbmQgc29tZQpoYXJkLXdvbiBtZWFzdXJlIG9mIG1lbW9yeSBlZmZpY2llbmN5LgoKCkNvbXBhcmlzb24gd2l0aCBQeXRob24ncyBTYW1wbGVzb3J0IEh5YnJpZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0aW1zb3J0IGNhbiByZXF1aXJlIGEgdGVtcCBhcnJheSBjb250YWluaW5nIGFzIG1hbnkgYXMgTi8vMiBwb2ludGVycywKICB3aGljaCBtZWFucyBhcyBtYW55IGFzIDIqTiBleHRyYSBieXRlcyBvbiAzMi1iaXQgYm94ZXMuICBJdCBjYW4gYmUKICBleHBlY3RlZCB0byByZXF1aXJlIGEgdGVtcCBhcnJheSB0aGlzIGxhcmdlIHdoZW4gc29ydGluZyByYW5kb20gZGF0YTsgb24KICBkYXRhIHdpdGggc2lnbmlmaWNhbnQgc3RydWN0dXJlLCBpdCBtYXkgZ2V0IGF3YXkgd2l0aG91dCB1c2luZyBhbnkgZXh0cmEKICBoZWFwIG1lbW9yeS4gIFRoaXMgYXBwZWFycyB0byBiZSB0aGUgc3Ryb25nZXN0IGFyZ3VtZW50IGFnYWluc3QgaXQsIGJ1dAogIGNvbXBhcmVkIHRvIHRoZSBzaXplIG9mIGFuIG9iamVjdCwgMiB0ZW1wIGJ5dGVzIHdvcnN0LWNhc2UgKGFsc28gZXhwZWN0ZWQtCiAgY2FzZSBmb3IgcmFuZG9tIGRhdGEpIGRvZXNuJ3Qgc2NhcmUgbWUgbXVjaC4KCiAgSXQgdHVybnMgb3V0IHRoYXQgUGVybCBpcyBtb3ZpbmcgdG8gYSBzdGFibGUgbWVyZ2Vzb3J0LCBhbmQgdGhlIGNvZGUgZm9yCiAgdGhhdCBhcHBlYXJzIGFsd2F5cyB0byByZXF1aXJlIGEgdGVtcCBhcnJheSB3aXRoIHJvb20gZm9yIGF0IGxlYXN0IE4KICBwb2ludGVycy4gKE5vdGUgdGhhdCBJIHdvdWxkbid0IHdhbnQgdG8gZG8gdGhhdCBldmVuIGlmIHNwYWNlIHdlcmVuJ3QgYW4KICBpc3N1ZTsgSSBiZWxpZXZlIGl0cyBlZmZvcnRzIGF0IG1lbW9yeSBmcnVnYWxpdHkgYWxzbyBzYXZlIHRpbXNvcnQKICBzaWduaWZpY2FudCBwb2ludGVyLWNvcHlpbmcgY29zdHMsIGFuZCBhbGxvdyBpdCB0byBoYXZlIGEgc21hbGxlciB3b3JraW5nCiAgc2V0LikKCisgQWNyb3NzIGFib3V0IGZvdXIgaG91cnMgb2YgZ2VuZXJhdGluZyByYW5kb20gYXJyYXlzLCBhbmQgc29ydGluZyB0aGVtCiAgdW5kZXIgYm90aCBtZXRob2RzLCBzYW1wbGVzb3J0IHJlcXVpcmVkIGFib3V0IDEuNSUgbW9yZSBjb21wYXJpc29ucwogICh0aGUgcHJvZ3JhbSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSkuCgorIEluIHJlYWwgbGlmZSwgdGhpcyBtYXkgYmUgZmFzdGVyIG9yIHNsb3dlciBvbiByYW5kb20gYXJyYXlzIHRoYW4KICBzYW1wbGVzb3J0IHdhcywgZGVwZW5kaW5nIG9uIHBsYXRmb3JtIHF1aXJrcy4gIFNpbmNlIGl0IGRvZXMgZmV3ZXIKICBjb21wYXJpc29ucyBvbiBhdmVyYWdlLCBpdCBjYW4gYmUgZXhwZWN0ZWQgdG8gZG8gYmV0dGVyIHRoZSBtb3JlCiAgZXhwZW5zaXZlIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBpcy4gIE9UT0gsIGl0IGRvZXMgbW9yZSBkYXRhIG1vdmVtZW50CiAgKHBvaW50ZXIgY29weWluZykgdGhhbiBzYW1wbGVzb3J0LCBhbmQgdGhhdCBtYXkgbmVnYXRlIGl0cyBzbWFsbAogIGNvbXBhcmlzb24gYWR2YW50YWdlIChkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzKSB1bmxlc3MgY29tcGFyaXNvbgogIGlzIHZlcnkgZXhwZW5zaXZlLgoKKyBPbiBhcnJheXMgd2l0aCBtYW55IGtpbmRzIG9mIHByZS1leGlzdGluZyBvcmRlciwgdGhpcyBibG93cyBzYW1wbGVzb3J0IG91dAogIG9mIHRoZSB3YXRlci4gIEl0J3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBzYW1wbGVzb3J0IGV2ZW4gb24gc29tZQogIGNhc2VzIHNhbXBsZXNvcnQgd2FzIHNwZWNpYWwtY2FzaW5nIHRoZSBzbm90IG91dCBvZi4gIEkgYmVsaWV2ZSB0aGF0IGxpc3RzCiAgdmVyeSBvZnRlbiBkbyBoYXZlIGV4cGxvaXRhYmxlIHBhcnRpYWwgb3JkZXIgaW4gcmVhbCBsaWZlLCBhbmQgdGhpcyBpcyB0aGUKICBzdHJvbmdlc3QgYXJndW1lbnQgaW4gZmF2b3Igb2YgdGltc29ydCAoaW5kZWVkLCBzYW1wbGVzb3J0J3Mgc3BlY2lhbCBjYXNlcwogIGZvciBleHRyZW1lIHBhcnRpYWwgb3JkZXIgYXJlIGFwcHJlY2lhdGVkIGJ5IHJlYWwgdXNlcnMsIGFuZCB0aW1zb3J0IGdvZXMKICBtdWNoIGRlZXBlciB0aGFuIHRob3NlLCBpbiBwYXJ0aWN1bGFyIG5hdHVyYWxseSBjb3ZlcmluZyBldmVyeSBjYXNlIHdoZXJlCiAgc29tZW9uZSBoYXMgc3VnZ2VzdGVkICJhbmQgaXQgd291bGQgYmUgY29vbCBpZiBsaXN0LnNvcnQoKSBoYWQgYSBzcGVjaWFsCiAgY2FzZSBmb3IgdGhpcyB0b28gLi4uIGFuZCBmb3IgdGhhdCAuLi4iKS4KCisgSGVyZSBhcmUgZXhhY3QgY29tcGFyaXNvbiBjb3VudHMgYWNyb3NzIGFsbCB0aGUgdGVzdHMgaW4gc29ydHBlcmYucHksCiAgd2hlbiBydW4gd2l0aCBhcmd1bWVudHMgIjE1IDIwIDEiLgoKICBGaXJzdCB0aGUgdHJpdmlhbCBjYXNlcywgdHJpdmlhbCBmb3Igc2FtcGxlc29ydCBiZWNhdXNlIGl0IHNwZWNpYWwtY2FzZWQKICB0aGVtLCBhbmQgdHJpdmlhbCBmb3IgdGltc29ydCBiZWNhdXNlIGl0IG5hdHVyYWxseSB3b3JrcyBvbiBydW5zLiAgV2l0aGluCiAgYW4gIm4iIGJsb2NrLCB0aGUgZmlyc3QgbGluZSBnaXZlcyB0aGUgIyBvZiBjb21wYXJlcyBkb25lIGJ5IHNhbXBsZXNvcnQsCiAgdGhlIHNlY29uZCBsaW5lIGJ5IHRpbXNvcnQsIGFuZCB0aGUgdGhpcmQgbGluZSBpcyB0aGUgcGVyY2VudGFnZSBieQogIHdoaWNoIHRoZSBzYW1wbGVzb3J0IGNvdW50IGV4Y2VlZHMgdGhlIHRpbXNvcnQgY291bnQ6CgogICAgICBuICAgXHNvcnQgICAvc29ydCAgID1zb3J0Ci0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tICAtLS0tLS0KICAzMjc2OCAgIDMyNzY4ICAgMzI3NjcgICAzMjc2NyAgc2FtcGxlc29ydAogICAgICAgICAgMzI3NjcgICAzMjc2NyAgIDMyNzY3ICB0aW1zb3J0CiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUgIChzYW1wbGVzb3J0IC0gdGltc29ydCkgLyB0aW1zb3J0CgogIDY1NTM2ICAgNjU1MzYgICA2NTUzNSAgIDY1NTM1CiAgICAgICAgICA2NTUzNSAgIDY1NTM1ICAgNjU1MzUKICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQoKIDEzMTA3MiAgMTMxMDcyICAxMzEwNzEgIDEzMTA3MQogICAgICAgICAxMzEwNzEgIDEzMTA3MSAgMTMxMDcxCiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUKCiAyNjIxNDQgIDI2MjE0NCAgMjYyMTQzICAyNjIxNDMKICAgICAgICAgMjYyMTQzICAyNjIxNDMgIDI2MjE0MwogICAgICAgICAgMC4wMCUgICAwLjAwJSAgIDAuMDAlCgogNTI0Mjg4ICA1MjQyODggIDUyNDI4NyAgNTI0Mjg3CiAgICAgICAgIDUyNDI4NyAgNTI0Mjg3ICA1MjQyODcKICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQoKMTA0ODU3NiAxMDQ4NTc2IDEwNDg1NzUgMTA0ODU3NQogICAgICAgIDEwNDg1NzUgMTA0ODU3NSAxMDQ4NTc1CiAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUKCiAgVGhlIGFsZ29yaXRobXMgYXJlIGVmZmVjdGl2ZWx5IGlkZW50aWNhbCBpbiB0aGVzZSBjYXNlcywgZXhjZXB0IHRoYXQKICB0aW1zb3J0IGRvZXMgb25lIGxlc3MgY29tcGFyZSBpbiBcc29ydC4KCiAgTm93IGZvciB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gIGxnKG4hKSBpcyB0aGUgaW5mb3JtYXRpb24tdGhlb3JldGljCiAgbGltaXQgZm9yIHRoZSBiZXN0IGFueSBjb21wYXJpc29uLWJhc2VkIHNvcnRpbmcgYWxnb3JpdGhtIGNhbiBkbyBvbgogIGF2ZXJhZ2UgKGFjcm9zcyBhbGwgcGVybXV0YXRpb25zKS4gIFdoZW4gYSBtZXRob2QgZ2V0cyBzaWduaWZpY2FudGx5CiAgYmVsb3cgdGhhdCwgaXQncyBlaXRoZXIgYXN0cm9ub21pY2FsbHkgbHVja3ksIG9yIGlzIGZpbmRpbmcgZXhwbG9pdGFibGUKICBzdHJ1Y3R1cmUgaW4gdGhlIGRhdGEuCgogICAgICBuICAgbGcobiEpICAgICpzb3J0ICAgIDNzb3J0ICAgICArc29ydCAgICVzb3J0ICAgIH5zb3J0ICAgICAhc29ydAotLS0tLS0tICAtLS0tLS0tICAgLS0tLS0tICAgLS0tLS0tLSAgLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tICAtLS0tLS0tLQogIDMyNzY4ICAgNDQ0MjU1ICAgNDUzMDk2ICAgNDUzNjE0ICAgIDMyOTA4ICAgNDUyODcxICAgMTMwNDkxICAgIDQ2OTE0MSBvbGQKICAgICAgICAgICAgICAgICAgIDQ0ODg4NSAgICAzMzAxNiAgICAzMzAwNyAgICA1MDQyNiAgIDE4MjA4MyAgICAgNjU1MzQgbmV3CiAgICAgICAgICAgICAgICAgICAgMC45NCUgMTI3My45MiUgICAtMC4zMCUgIDc5OC4wOSUgIC0yOC4zMyUgICA2MTUuODclICVjaCBmcm9tIG5ldwoKICA2NTUzNiAgIDk1NDAzNyAgIDk3MjY5OSAgIDk4MTk0MCAgICA2NTY4NiAgIDk3MzEwNCAgIDI2MDAyOSAgIDEwMDQ2MDcKICAgICAgICAgICAgICAgICAgIDk2Mjk5MSAgICA2NTgyMSAgICA2NTgwOCAgIDEwMTY2NyAgIDM2NDM0MSAgICAxMzEwNzAKICAgICAgICAgICAgICAgICAgICAxLjAxJSAxMzkxLjgzJSAgIC0wLjE5JSAgODU3LjE1JSAgLTI4LjYzJSAgIDY2Ni40NyUKCiAxMzEwNzIgIDIwMzkxMzcgIDIxMDE4ODEgIDIwOTE0OTEgICAxMzEyMzIgIDIwOTI4OTQgICA1NTQ3OTAgICAyMTYxMzc5CiAgICAgICAgICAgICAgICAgIDIwNTc1MzMgICAxMzE0MTAgICAxMzEzNjEgICAyMDYxOTMgICA3Mjg4NzEgICAgMjYyMTQyCiAgICAgICAgICAgICAgICAgICAgMi4xNiUgMTQ5MS41OCUgICAtMC4xMCUgIDkxNS4wMiUgIC0yMy44OCUgICA3MjQuNTElCgogMjYyMTQ0ICA0MzQwNDA5ICA0NDY0NDYwICA0NDAzMjMzICAgMjYyMzE0ICA0NDQ1ODg0ICAxMTA3ODQyICAgNDU4NDU2MAogICAgICAgICAgICAgICAgICA0Mzc3NDAyICAgMjYyNDM3ICAgMjYyNDU5ICAgNDE2MzQ3ICAxNDU3OTQ1ICAgIDUyNDI4NgogICAgICAgICAgICAgICAgICAgIDEuOTklIDE1NzcuODIlICAgLTAuMDYlICA5NjcuODMlICAtMjQuMDElICAgNzc0LjQ0JQoKIDUyNDI4OCAgOTIwNTA5NiAgOTQ1MzM1NiAgOTQwODQ2MyAgIDUyNDQ2OCAgOTQ0MTkzMCAgMjIxODU3NyAgIDk2OTIwMTUKICAgICAgICAgICAgICAgICAgOTI3ODczNCAgIDUyNDU4MCAgIDUyNDYzMyAgIDgzNzk0NyAgMjkxNjEwNyAgIDEwNDg1NzQKICAgICAgICAgICAgICAgICAgIDEuODglICAxNjkzLjUyJSAgIC0wLjAzJSAxMDI2Ljc5JSAgLTIzLjkyJSAgIDgyNC4zMCUKCjEwNDg1NzYgMTk0NTg3NTYgMTk5NTAyNzIgMTk4Mzg1ODggIDEwNDg3NjYgMTk5MTIxMzQgIDQ0MzA2NDkgIDIwNDM0MjEyCiAgICAgICAgICAgICAgICAgMTk2MDYwMjggIDEwNDg5NTggIDEwNDg5NDEgIDE2OTQ4OTYgIDU4MzI0NDUgICAyMDk3MTUwCiAgICAgICAgICAgICAgICAgICAgMS43NiUgMTc5MS4yNyUgICAtMC4wMiUgMTA3NC44MyUgIC0yNC4wMyUgICA4NzQuMzglCgogIERpc2N1c3Npb24gb2YgY2FzZXM6CgogICpzb3J0OiAgVGhlcmUncyBubyBzdHJ1Y3R1cmUgaW4gcmFuZG9tIGRhdGEgdG8gZXhwbG9pdCwgc28gdGhlIHRoZW9yZXRpY2FsCiAgbGltaXQgaXMgbGcobiEpLiAgQm90aCBtZXRob2RzIGdldCBjbG9zZSB0byB0aGF0LCBhbmQgdGltc29ydCBpcyBodWdnaW5nCiAgaXQgKGluZGVlZCwgaW4gYSAqbWFyZ2luYWwqIHNlbnNlLCBpdCdzIGEgc3BlY3RhY3VsYXIgaW1wcm92ZW1lbnQgLS0KICB0aGVyZSdzIG9ubHkgYWJvdXQgMSUgbGVmdCBiZWZvcmUgaGl0dGluZyB0aGUgd2FsbCwgYW5kIHRpbXNvcnQga25vd3MKICBkYXJuZWQgd2VsbCBpdCdzIGRvaW5nIGNvbXBhcmVzIHRoYXQgd29uJ3QgcGF5IG9uIHJhbmRvbSBkYXRhIC0tIGJ1dCBzbwogIGRvZXMgdGhlIHNhbXBsZXNvcnQgaHlicmlkKS4gIEZvciBjb250cmFzdCwgSG9hcmUncyBvcmlnaW5hbCByYW5kb20tcGl2b3QKICBxdWlja3NvcnQgZG9lcyBhYm91dCAzOSUgbW9yZSBjb21wYXJlcyB0aGFuIHRoZSBsaW1pdCwgYW5kIHRoZSBtZWRpYW4tb2YtMwogIHZhcmlhbnQgYWJvdXQgMTklIG1vcmUuCgogIDNzb3J0LCAlc29ydCwgYW5kICFzb3J0OiAgTm8gY29udGVzdDsgdGhlcmUncyBzdHJ1Y3R1cmUgaW4gdGhpcyBkYXRhLCBidXQKICBub3Qgb2YgdGhlIHNwZWNpZmljIGtpbmRzIHNhbXBsZXNvcnQgc3BlY2lhbC1jYXNlcy4gIE5vdGUgdGhhdCBzdHJ1Y3R1cmUKICBpbiAhc29ydCB3YXNuJ3QgcHV0IHRoZXJlIG9uIHB1cnBvc2UgLS0gaXQgd2FzIGNyYWZ0ZWQgYXMgYSB3b3JzdCBjYXNlIGZvcgogIGEgcHJldmlvdXMgcXVpY2tzb3J0IGltcGxlbWVudGF0aW9uLiAgVGhhdCB0aW1zb3J0IG5haWxzIGl0IGNhbWUgYXMgYQogIHN1cnByaXNlIHRvIG1lIChhbHRob3VnaCBpdCdzIG9idmlvdXMgaW4gcmV0cm9zcGVjdCkuCgogICtzb3J0OiAgc2FtcGxlc29ydCBzcGVjaWFsLWNhc2VzIHRoaXMgZGF0YSwgYW5kIGRvZXMgYSBmZXcgbGVzcyBjb21wYXJlcwogIHRoYW4gdGltc29ydC4gIEhvd2V2ZXIsIHRpbXNvcnQgcnVucyB0aGlzIGNhc2Ugc2lnbmlmaWNhbnRseSBmYXN0ZXIgb24gYWxsCiAgYm94ZXMgd2UgaGF2ZSB0aW1pbmdzIGZvciwgYmVjYXVzZSB0aW1zb3J0IGlzIGluIHRoZSBidXNpbmVzcyBvZiBtZXJnaW5nCiAgcnVucyBlZmZpY2llbnRseSwgd2hpbGUgc2FtcGxlc29ydCBkb2VzIG11Y2ggbW9yZSBkYXRhIG1vdmVtZW50IGluIHRoaXMKICAoZm9yIGl0KSBzcGVjaWFsIGNhc2UuCgogIH5zb3J0OiAgc2FtcGxlc29ydCdzIHNwZWNpYWwgY2FzZXMgZm9yIGxhcmdlIG1hc3NlcyBvZiBlcXVhbCBlbGVtZW50cyBhcmUKICBleHRyZW1lbHkgZWZmZWN0aXZlIG9uIH5zb3J0J3Mgc3BlY2lmaWMgZGF0YSBwYXR0ZXJuLCBhbmQgdGltc29ydCBqdXN0CiAgaXNuJ3QgZ29pbmcgdG8gZ2V0IGNsb3NlIHRvIHRoYXQsIGRlc3BpdGUgdGhhdCBpdCdzIGNsZWFybHkgZ2V0dGluZyBhCiAgZ3JlYXQgZGVhbCBvZiBiZW5lZml0IG91dCBvZiB0aGUgZHVwbGljYXRlcyAodGhlICMgb2YgY29tcGFyZXMgaXMgbXVjaCBsZXNzCiAgdGhhbiBsZyhuISkpLiAgfnNvcnQgaGFzIGEgcGVyZmVjdGx5IHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9mIGp1c3QgNAogIGRpc3RpbmN0IHZhbHVlcywgYW5kIGFzIHRoZSBkaXN0cmlidXRpb24gZ2V0cyBtb3JlIHNrZXdlZCwgc2FtcGxlc29ydCdzCiAgZXF1YWwtZWxlbWVudCBnaW1taWNrcyBiZWNvbWUgbGVzcyBlZmZlY3RpdmUsIHdoaWxlIHRpbXNvcnQncyBhZGFwdGl2ZQogIHN0cmF0ZWdpZXMgZmluZCBtb3JlIHRvIGV4cGxvaXQ7IGluIGEgZGF0YWJhc2Ugc3VwcGxpZWQgYnkgS2V2aW4gQWx0aXMsIGEKICBzb3J0IG9uIGl0cyBoaWdobHkgc2tld2VkICJvbiB3aGljaCBzdG9jayBleGNoYW5nZSBkb2VzIHRoaXMgY29tcGFueSdzCiAgc3RvY2sgdHJhZGU/IiBmaWVsZCByYW4gb3ZlciB0d2ljZSBhcyBmYXN0IHVuZGVyIHRpbXNvcnQuCgogIEhvd2V2ZXIsIGRlc3BpdGUgdGhhdCB0aW1zb3J0IGRvZXMgbWFueSBtb3JlIGNvbXBhcmlzb25zIG9uIH5zb3J0LCBhbmQKICB0aGF0IG9uIHNldmVyYWwgcGxhdGZvcm1zIH5zb3J0IHJ1bnMgaGlnaGx5IHNpZ25pZmljYW50bHkgc2xvd2VyIHVuZGVyCiAgdGltc29ydCwgb24gb3RoZXIgcGxhdGZvcm1zIH5zb3J0IHJ1bnMgaGlnaGx5IHNpZ25pZmljYW50bHkgZmFzdGVyIHVuZGVyCiAgdGltc29ydC4gIE5vIG90aGVyIGtpbmQgb2YgZGF0YSBoYXMgc2hvd24gdGhpcyB3aWxkIHgtcGxhdGZvcm0gYmVoYXZpb3IsCiAgYW5kIHdlIGRvbid0IGhhdmUgYW4gZXhwbGFuYXRpb24gZm9yIGl0LiAgVGhlIG9ubHkgdGhpbmcgSSBjYW4gdGhpbmsgb2YKICB0aGF0IGNvdWxkIHRyYW5zZm9ybSB3aGF0ICJzaG91bGQgYmUiIGhpZ2hseSBzaWduaWZpY2FudCBzbG93ZG93bnMgaW50bwogIGhpZ2hseSBzaWduaWZpY2FudCBzcGVlZHVwcyBvbiBzb21lIGJveGVzIGFyZSBjYXRhc3Ryb3BoaWMgY2FjaGUgZWZmZWN0cwogIGluIHNhbXBsZXNvcnQuCgogIEJ1dCB0aW1zb3J0ICJzaG91bGQgYmUiIHNsb3dlciB0aGFuIHNhbXBsZXNvcnQgb24gfnNvcnQsIHNvIGl0J3MgaGFyZAogIHRvIGNvdW50IHRoYXQgaXQgaXNuJ3Qgb24gc29tZSBib3hlcyBhcyBhIHN0cmlrZSBhZ2FpbnN0IGl0IDx3aW5rPi4KCisgSGVyZSdzIHRoZSBoaWdod2F0ZXIgbWFyayBmb3IgdGhlIG51bWJlciBvZiBoZWFwLWJhc2VkIHRlbXAgc2xvdHMgKDQKICBieXRlcyBlYWNoIG9uIHRoaXMgYm94KSBuZWVkZWQgYnkgZWFjaCB0ZXN0LCBhZ2FpbiB3aXRoIGFyZ3VtZW50cwogICIxNSAyMCAxIjoKCiAgIDIqKmkgICpzb3J0IFxzb3J0IC9zb3J0ICAzc29ydCAgK3NvcnQgICVzb3J0ICB+c29ydCAgPXNvcnQgICFzb3J0CiAgMzI3NjggIDE2Mzg0ICAgICAwICAgICAwICAgNjI1NiAgICAgIDAgIDEwODIxICAxMjI4OCAgICAgIDAgIDE2MzgzCiAgNjU1MzYgIDMyNzY2ICAgICAwICAgICAwICAyMTY1MiAgICAgIDAgIDMxMjc2ICAyNDU3NiAgICAgIDAgIDMyNzY3CiAxMzEwNzIgIDY1NTM0ICAgICAwICAgICAwICAxNzI1OCAgICAgIDAgIDU4MTEyICA0OTE1MiAgICAgIDAgIDY1NTM1CiAyNjIxNDQgMTMxMDcyICAgICAwICAgICAwICAzNTY2MCAgICAgIDAgMTIzNTYxICA5ODMwNCAgICAgIDAgMTMxMDcxCiA1MjQyODggMjYyMTQyICAgICAwICAgICAwICAzMTMwMiAgICAgIDAgMjEyMDU3IDE5NjYwOCAgICAgIDAgMjYyMTQzCjEwNDg1NzYgNTI0Mjg2ICAgICAwICAgICAwIDMxMjQzOCAgICAgIDAgNDg0OTQyIDM5MzIxNiAgICAgIDAgNTI0Mjg3CgogIERpc2N1c3Npb246ICBUaGUgdGVzdHMgdGhhdCBlbmQgdXAgZG9pbmcgKGNsb3NlIHRvKSBwZXJmZWN0bHkgYmFsYW5jZWQKICBtZXJnZXMgKCpzb3J0LCAhc29ydCkgbmVlZCBhbGwgTi8vMiB0ZW1wIHNsb3RzIChvciBhbG1vc3QgYWxsKS4gIH5zb3J0CiAgYWxzbyBlbmRzIHVwIGRvaW5nIGJhbGFuY2VkIG1lcmdlcywgYnV0IHN5c3RlbWF0aWNhbGx5IGJlbmVmaXRzIGEgbG90IGZyb20KICB0aGUgcHJlbGltaW5hcnkgcHJlLW1lcmdlIHNlYXJjaGVzIGRlc2NyaWJlZCB1bmRlciAiTWVyZ2UgTWVtb3J5IiBsYXRlci4KICAlc29ydCBhcHByb2FjaGVzIGhhdmluZyBhIGJhbGFuY2VkIG1lcmdlIGF0IHRoZSBlbmQgYmVjYXVzZSB0aGUgcmFuZG9tCiAgc2VsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIHJlcGxhY2UgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhbiBvdXQtb2Ytb3JkZXIKICBlbGVtZW50IG5lYXIgdGhlIG1pZHBvaW50LiAgXHNvcnQsIC9zb3J0LCA9c29ydCBhcmUgdGhlIHRyaXZpYWwgb25lLXJ1bgogIGNhc2VzLCBuZWVkaW5nIG5vIG1lcmdpbmcgYXQgYWxsLiAgK3NvcnQgZW5kcyB1cCBoYXZpbmcgb25lIHZlcnkgbG9uZyBydW4KICBhbmQgb25lIHZlcnkgc2hvcnQsIGFuZCBzbyBnZXRzIGFsbCB0aGUgdGVtcCBzcGFjZSBpdCBuZWVkcyBmcm9tIHRoZSBzbWFsbAogIHRlbXBhcnJheSBtZW1iZXIgb2YgdGhlIE1lcmdlU3RhdGUgc3RydWN0IChub3RlIHRoYXQgdGhlIHNhbWUgd291bGQgYmUKICB0cnVlIGlmIHRoZSBuZXcgcmFuZG9tIGVsZW1lbnRzIHdlcmUgcHJlZml4ZWQgdG8gdGhlIHNvcnRlZCBsaXN0IGluc3RlYWQsCiAgYnV0IG5vdCBpZiB0aGV5IGFwcGVhcmVkICJpbiB0aGUgbWlkZGxlIikuICAzc29ydCBhcHByb2FjaGVzIE4vLzMgdGVtcAogIHNsb3RzIHR3aWNlLCBidXQgdGhlIHJ1biBsZW5ndGhzIHRoYXQgcmVtYWluIGFmdGVyIDMgcmFuZG9tIGV4Y2hhbmdlcwogIGNsZWFybHkgaGFzIHZlcnkgaGlnaCB2YXJpYW5jZS4KCgpBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRpbXNvcnQgZm9sbG93cy4KClJ1bnMKLS0tLQpjb3VudF9ydW4oKSByZXR1cm5zIHRoZSAjIG9mIGVsZW1lbnRzIGluIHRoZSBuZXh0IHJ1bi4gIEEgcnVuIGlzIGVpdGhlcgoiYXNjZW5kaW5nIiwgd2hpY2ggbWVhbnMgbm9uLWRlY3JlYXNpbmc6CgogICAgYTAgPD0gYTEgPD0gYTIgPD0gLi4uCgpvciAiZGVzY2VuZGluZyIsIHdoaWNoIG1lYW5zIHN0cmljdGx5IGRlY3JlYXNpbmc6CgogICAgYTAgPiBhMSA+IGEyID4gLi4uCgpOb3RlIHRoYXQgYSBydW4gaXMgYWx3YXlzIGF0IGxlYXN0IDIgbG9uZywgdW5sZXNzIHdlIHN0YXJ0IGF0IHRoZSBhcnJheSdzCmxhc3QgZWxlbWVudC4KClRoZSBkZWZpbml0aW9uIG9mIGRlc2NlbmRpbmcgaXMgc3RyaWN0LCBiZWNhdXNlIHRoZSBtYWluIHJvdXRpbmUgcmV2ZXJzZXMKYSBkZXNjZW5kaW5nIHJ1biBpbi1wbGFjZSwgdHJhbnNmb3JtaW5nIGEgZGVzY2VuZGluZyBydW4gaW50byBhbiBhc2NlbmRpbmcKcnVuLiAgUmV2ZXJzYWwgaXMgZG9uZSB2aWEgdGhlIG9idmlvdXMgZmFzdCAic3dhcCBlbGVtZW50cyBzdGFydGluZyBhdCBlYWNoCmVuZCwgYW5kIGNvbnZlcmdlIGF0IHRoZSBtaWRkbGUiIG1ldGhvZCwgYW5kIHRoYXQgY2FuIHZpb2xhdGUgc3RhYmlsaXR5IGlmCnRoZSBzbGljZSBjb250YWlucyBhbnkgZXF1YWwgZWxlbWVudHMuICBVc2luZyBhIHN0cmljdCBkZWZpbml0aW9uIG9mCmRlc2NlbmRpbmcgZW5zdXJlcyB0aGF0IGEgZGVzY2VuZGluZyBydW4gY29udGFpbnMgZGlzdGluY3QgZWxlbWVudHMuCgpJZiBhbiBhcnJheSBpcyByYW5kb20sIGl0J3MgdmVyeSB1bmxpa2VseSB3ZSdsbCBzZWUgbG9uZyBydW5zLiAgSWYgYSBuYXR1cmFsCnJ1biBjb250YWlucyBsZXNzIHRoYW4gbWlucnVuIGVsZW1lbnRzIChzZWUgbmV4dCBzZWN0aW9uKSwgdGhlIG1haW4gbG9vcAphcnRpZmljaWFsbHkgYm9vc3RzIGl0IHRvIG1pbnJ1biBlbGVtZW50cywgdmlhIGEgc3RhYmxlIGJpbmFyeSBpbnNlcnRpb24gc29ydAphcHBsaWVkIHRvIHRoZSByaWdodCBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZm9sbG93aW5nIHRoZSBzaG9ydCBuYXR1cmFsCnJ1bi4gIEluIGEgcmFuZG9tIGFycmF5LCAqYWxsKiBydW5zIGFyZSBsaWtlbHkgdG8gYmUgbWlucnVuIGxvbmcgYXMgYQpyZXN1bHQuICBUaGlzIGhhcyB0d28gcHJpbWFyeSBnb29kIGVmZmVjdHM6CgoxLiBSYW5kb20gZGF0YSBzdHJvbmdseSB0ZW5kcyB0aGVuIHRvd2FyZCBwZXJmZWN0bHkgYmFsYW5jZWQgKGJvdGggcnVucyBoYXZlCiAgIHRoZSBzYW1lIGxlbmd0aCkgbWVyZ2VzLCB3aGljaCBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIHByb2NlZWQgd2hlbgogICBkYXRhIGlzIHJhbmRvbS4KCjIuIEJlY2F1c2UgcnVucyBhcmUgbmV2ZXIgdmVyeSBzaG9ydCwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgZG9lc24ndCBtYWtlCiAgIGhlcm9pYyBlZmZvcnRzIHRvIHNoYXZlIGEgZmV3IGN5Y2xlcyBvZmYgcGVyLW1lcmdlIG92ZXJoZWFkcy4gIEZvcgogICBleGFtcGxlLCByZWFzb25hYmxlIHVzZSBvZiBmdW5jdGlvbiBjYWxscyBpcyBtYWRlLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8KICAgaW5saW5lIGV2ZXJ5dGhpbmcuICBTaW5jZSB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIE4vbWlucnVuIHJ1bnMgdG8gYmVnaW4KICAgd2l0aCwgYSBmZXcgImV4dHJhIiBmdW5jdGlvbiBjYWxscyBwZXIgbWVyZ2UgaXMgYmFyZWx5IG1lYXN1cmFibGUuCgoKQ29tcHV0aW5nIG1pbnJ1bgotLS0tLS0tLS0tLS0tLS0tCklmIE4gPCA2NCwgbWlucnVuIGlzIE4uICBJT1csIGJpbmFyeSBpbnNlcnRpb24gc29ydCBpcyB1c2VkIGZvciB0aGUgd2hvbGUKYXJyYXkgdGhlbjsgaXQncyBoYXJkIHRvIGJlYXQgdGhhdCBnaXZlbiB0aGUgb3ZlcmhlYWRzIG9mIHRyeWluZyBzb21ldGhpbmcKZmFuY2llci4KCldoZW4gTiBpcyBhIHBvd2VyIG9mIDIsIHRlc3Rpbmcgb24gcmFuZG9tIGRhdGEgc2hvd2VkIHRoYXQgbWlucnVuIHZhbHVlcyBvZgoxNiwgMzIsIDY0IGFuZCAxMjggd29ya2VkIGFib3V0IGVxdWFsbHkgd2VsbC4gIEF0IDI1NiB0aGUgZGF0YS1tb3ZlbWVudCBjb3N0CmluIGJpbmFyeSBpbnNlcnRpb24gc29ydCBjbGVhcmx5IGh1cnQsIGFuZCBhdCA4IHRoZSBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyCm9mIGZ1bmN0aW9uIGNhbGxzIGNsZWFybHkgaHVydC4gIFBpY2tpbmcgKnNvbWUqIHBvd2VyIG9mIDIgaXMgaW1wb3J0YW50CmhlcmUsIHNvIHRoYXQgdGhlIG1lcmdlcyBlbmQgdXAgcGVyZmVjdGx5IGJhbGFuY2VkIChzZWUgbmV4dCBzZWN0aW9uKS4gIFdlCnBpY2sgMzIgYXMgYSBnb29kIHZhbHVlIGluIHRoZSBzd2VldCByYW5nZTsgcGlja2luZyBhIHZhbHVlIGF0IHRoZSBsb3cgZW5kCmFsbG93cyB0aGUgYWRhcHRpdmUgZ2ltbWlja3MgbW9yZSBvcHBvcnR1bml0eSB0byBleHBsb2l0IHNob3J0ZXIgbmF0dXJhbApydW5zLgoKQmVjYXVzZSBzb3J0cGVyZi5weSBvbmx5IHRyaWVzIHBvd2VycyBvZiAyLCBpdCB0b29rIGEgbG9uZyB0aW1lIHRvIG5vdGljZQp0aGF0IDMyIGlzbid0IGEgZ29vZCBjaG9pY2UgZm9yIHRoZSBnZW5lcmFsIGNhc2UhICBDb25zaWRlciBOPTIxMTI6Cgo+Pj4gZGl2bW9kKDIxMTIsIDMyKQooNjYsIDApCj4+PgoKSWYgdGhlIGRhdGEgaXMgcmFuZG9tbHkgb3JkZXJlZCwgd2UncmUgdmVyeSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggNjYgcnVucwplYWNoIG9mIGxlbmd0aCAzMi4gIFRoZSBmaXJzdCA2NCBvZiB0aGVzZSB0cmlnZ2VyIGEgc2VxdWVuY2Ugb2YgcGVyZmVjdGx5CmJhbGFuY2VkIG1lcmdlcyAoc2VlIG5leHQgc2VjdGlvbiksIGxlYXZpbmcgcnVucyBvZiBsZW5ndGhzIDIwNDggYW5kIDY0IHRvCm1lcmdlIGF0IHRoZSBlbmQuICBUaGUgYWRhcHRpdmUgZ2ltbWlja3MgY2FuIGRvIHRoYXQgd2l0aCBmZXdlciB0aGFuIDIwNDgrNjQKY29tcGFyZXMsIGJ1dCBpdCdzIHN0aWxsIG1vcmUgY29tcGFyZXMgdGhhbiBuZWNlc3NhcnksIGFuZC0tIG1lcmdlc29ydCdzCmJ1Z2Fib28gcmVsYXRpdmUgdG8gc2FtcGxlc29ydCAtLWEgbG90IG1vcmUgZGF0YSBtb3ZlbWVudCAoTyhOKSBjb3BpZXMganVzdAp0byBnZXQgNjQgZWxlbWVudHMgaW50byBwbGFjZSkuCgpJZiB3ZSB0YWtlIG1pbnJ1bj0zMyBpbiB0aGlzIGNhc2UsIHRoZW4gd2UncmUgdmVyeSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggNjQKcnVucyBlYWNoIG9mIGxlbmd0aCAzMywgYW5kIHRoZW4gYWxsIG1lcmdlcyBhcmUgcGVyZmVjdGx5IGJhbGFuY2VkLiAgQmV0dGVyIQoKV2hhdCB3ZSB3YW50IHRvIGF2b2lkIGlzIHBpY2tpbmcgbWlucnVuIHN1Y2ggdGhhdCBpbgoKICAgIHEsIHIgPSBkaXZtb2QoTiwgbWlucnVuKQoKcSBpcyBhIHBvd2VyIG9mIDIgYW5kIHI+MCAodGhlbiB0aGUgbGFzdCBtZXJnZSBvbmx5IGdldHMgciBlbGVtZW50cyBpbnRvCnBsYWNlLCBhbmQgciA8IG1pbnJ1biBpcyBzbWFsbCBjb21wYXJlZCB0byBOKSwgb3IgcSBhIGxpdHRsZSBsYXJnZXIgdGhhbiBhCnBvd2VyIG9mIDIgcmVnYXJkbGVzcyBvZiByICh0aGVuIHdlJ3ZlIGdvdCBhIGNhc2Ugc2ltaWxhciB0byAiMjExMiIsIGFnYWluCmxlYXZpbmcgdG9vIGxpdHRsZSB3b3JrIGZvciB0aGUgbGFzdCBtZXJnZSB0byBkbykuCgpJbnN0ZWFkIHdlIHBpY2sgYSBtaW5ydW4gaW4gcmFuZ2UoMzIsIDY1KSBzdWNoIHRoYXQgTi9taW5ydW4gaXMgZXhhY3RseSBhCnBvd2VyIG9mIDIsIG9yIGlmIHRoYXQgaXNuJ3QgcG9zc2libGUsIGlzIGNsb3NlIHRvLCBidXQgc3RyaWN0bHkgbGVzcyB0aGFuLAphIHBvd2VyIG9mIDIuICBUaGlzIGlzIGVhc2llciB0byBkbyB0aGFuIGl0IG1heSBzb3VuZDogIHRha2UgdGhlIGZpcnN0IDYKYml0cyBvZiBOLCBhbmQgYWRkIDEgaWYgYW55IG9mIHRoZSByZW1haW5pbmcgYml0cyBhcmUgc2V0LiAgSW4gZmFjdCwgdGhhdApydWxlIGNvdmVycyBldmVyeSBjYXNlIGluIHRoaXMgc2VjdGlvbiwgaW5jbHVkaW5nIHNtYWxsIE4gYW5kIGV4YWN0IHBvd2VycwpvZiAyOyBtZXJnZV9jb21wdXRlX21pbnJ1bigpIGlzIGEgZGVjZXB0aXZlbHkgc2ltcGxlIGZ1bmN0aW9uLgoKClRoZSBNZXJnZSBQYXR0ZXJuCi0tLS0tLS0tLS0tLS0tLS0tCkluIG9yZGVyIHRvIGV4cGxvaXQgcmVndWxhcml0aWVzIGluIHRoZSBkYXRhLCB3ZSdyZSBtZXJnaW5nIG9uIG5hdHVyYWwKcnVuIGxlbmd0aHMsIGFuZCB0aGV5IGNhbiBiZWNvbWUgd2lsZGx5IHVuYmFsYW5jZWQuICBUaGF0J3MgYSBHb29kIFRoaW5nCmZvciB0aGlzIHNvcnQhICBJdCBtZWFucyB3ZSBoYXZlIHRvIGZpbmQgYSB3YXkgdG8gbWFuYWdlIGFuIGFzc29ydG1lbnQgb2YKcG90ZW50aWFsbHkgdmVyeSBkaWZmZXJlbnQgcnVuIGxlbmd0aHMsIHRob3VnaC4KClN0YWJpbGl0eSBjb25zdHJhaW5zIHBlcm1pc3NpYmxlIG1lcmdpbmcgcGF0dGVybnMuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZQozIGNvbnNlY3V0aXZlIHJ1bnMgb2YgbGVuZ3RocwoKICAgIEE6MTAwMDAgIEI6MjAwMDAgIEM6MTAwMDAKCndlIGRhcmUgbm90IG1lcmdlIEEgd2l0aCBDIGZpcnN0LCBiZWNhdXNlIGlmIEEsIEIgYW5kIEMgaGFwcGVuIHRvIGNvbnRhaW4KYSBjb21tb24gZWxlbWVudCwgaXQgd291bGQgZ2V0IG91dCBvZiBvcmRlciB3cnQgaXRzIG9jY3VyZW5jZShzKSBpbiBCLiAgVGhlCm1lcmdpbmcgbXVzdCBiZSBkb25lIGFzIChBK0IpK0Mgb3IgQSsoQitDKSBpbnN0ZWFkLgoKU28gbWVyZ2luZyBpcyBhbHdheXMgZG9uZSBvbiB0d28gY29uc2VjdXRpdmUgcnVucyBhdCBhIHRpbWUsIGFuZCBpbi1wbGFjZSwKYWx0aG91Z2ggdGhpcyBtYXkgcmVxdWlyZSBzb21lIHRlbXAgbWVtb3J5IChtb3JlIG9uIHRoYXQgbGF0ZXIpLgoKV2hlbiBhIHJ1biBpcyBpZGVudGlmaWVkLCBpdHMgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHB1c2hlZCBvbiBhIHN0YWNrCmluIHRoZSBNZXJnZVN0YXRlIHN0cnVjdC4gIG1lcmdlX2NvbGxhcHNlKCkgaXMgdGhlbiBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgaXQKc2hvdWxkIG1lcmdlIGl0IHdpdGggcHJlY2VkaW5nIHJ1bihzKS4gIFdlIHdvdWxkIGxpa2UgdG8gZGVsYXkgbWVyZ2luZyBhcwpsb25nIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGV4cGxvaXQgcGF0dGVybnMgdGhhdCBtYXkgY29tZSB1cCBsYXRlciwgYnV0IHdlCmxpa2UgZXZlbiBtb3JlIHRvIGRvIG1lcmdpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBleHBsb2l0IHRoYXQgdGhlIHJ1biBqdXN0CmZvdW5kIGlzIHN0aWxsIGhpZ2ggaW4gdGhlIG1lbW9yeSBoaWVyYXJjaHkuICBXZSBhbHNvIGNhbid0IGRlbGF5IG1lcmdpbmcKInRvbyBsb25nIiBiZWNhdXNlIGl0IGNvbnN1bWVzIG1lbW9yeSB0byByZW1lbWJlciB0aGUgcnVucyB0aGF0IGFyZSBzdGlsbAp1bm1lcmdlZCwgYW5kIHRoZSBzdGFjayBoYXMgYSBmaXhlZCBzaXplLgoKV2hhdCB0dXJuZWQgb3V0IHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIG1haW50YWlucyB0d28gaW52YXJpYW50cyBvbiB0aGUKc3RhY2sgZW50cmllcywgd2hlcmUgQSwgQiBhbmQgQyBhcmUgdGhlIGxlbmd0aHMgb2YgdGhlIHRocmVlIHJpZ2htb3N0IG5vdC15ZXQKbWVyZ2VkIHNsaWNlczoKCjEuICBBID4gQitDCjIuICBCID4gQwoKTm90ZSB0aGF0LCBieSBpbmR1Y3Rpb24sICMyIGltcGxpZXMgdGhlIGxlbmd0aHMgb2YgcGVuZGluZyBydW5zIGZvcm0gYQpkZWNyZWFzaW5nIHNlcXVlbmNlLiAgIzEgaW1wbGllcyB0aGF0LCByZWFkaW5nIHRoZSBsZW5ndGhzIHJpZ2h0IHRvIGxlZnQsCnRoZSBwZW5kaW5nLXJ1biBsZW5ndGhzIGdyb3cgYXQgbGVhc3QgYXMgZmFzdCBhcyB0aGUgRmlib25hY2NpIG51bWJlcnMuClRoZXJlZm9yZSB0aGUgc3RhY2sgY2FuIG5ldmVyIGdyb3cgbGFyZ2VyIHRoYW4gYWJvdXQgbG9nX2Jhc2VfcGhpKE4pIGVudHJpZXMsCndoZXJlIHBoaSA9ICgxK3NxcnQoNSkpLzIgfj0gMS42MTguICBUaHVzIGEgc21hbGwgIyBvZiBzdGFjayBzbG90cyBzdWZmaWNlCmZvciB2ZXJ5IGxhcmdlIGFycmF5cy4KCklmIEEgPD0gQitDLCB0aGUgc21hbGxlciBvZiBBIGFuZCBDIGlzIG1lcmdlZCB3aXRoIEIgKHRpZXMgZmF2b3IgQywgZm9yIHRoZQpmcmVzaG5lc3MtaW4tY2FjaGUgcmVhc29uKSwgYW5kIHRoZSBuZXcgcnVuIHJlcGxhY2VzIHRoZSBBLEIgb3IgQixDIGVudHJpZXM7CmUuZy4sIGlmIHRoZSBsYXN0IDMgZW50cmllcyBhcmUKCiAgICBBOjMwICBCOjIwICBDOjEwCgp0aGVuIEIgaXMgbWVyZ2VkIHdpdGggQywgbGVhdmluZwoKICAgIEE6MzAgIEJDOjMwCgpvbiB0aGUgc3RhY2suICBPciBpZiB0aGV5IHdlcmUKCiAgICBBOjUwMCAgQjo0MDA6ICBDOjEwMDAKCnRoZW4gQSBpcyBtZXJnZWQgd2l0aCBCLCBsZWF2aW5nCgogICAgQUI6OTAwICBDOjEwMDAKCm9uIHRoZSBzdGFjay4KCkluIGJvdGggZXhhbXBsZXMsIHRoZSBzdGFjayBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBtZXJnZSBzdGlsbCB2aW9sYXRlcwppbnZhcmlhbnQgIzIsIGFuZCBtZXJnZV9jb2xsYXBzZSgpIGdvZXMgb24gdG8gY29udGludWUgbWVyZ2luZyBydW5zIHVudGlsCmJvdGggaW52YXJpYW50cyBhcmUgc2F0aXNmaWVkLiAgQXMgYW4gZXh0cmVtZSBjYXNlLCBzdXBwb3NlIHdlIGRpZG4ndCBkbyB0aGUKbWlucnVuIGdpbW1pY2ssIGFuZCBuYXR1cmFsIHJ1bnMgd2VyZSBvZiBsZW5ndGhzIDEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwKYW5kIDIuICBOb3RoaW5nIHdvdWxkIGdldCBtZXJnZWQgdW50aWwgdGhlIGZpbmFsIDIgd2FzIHNlZW4sIGFuZCB0aGF0IHdvdWxkCnRyaWdnZXIgNyBwZXJmZWN0bHkgYmFsYW5jZWQgbWVyZ2VzLgoKVGhlIHRocnVzdCBvZiB0aGVzZSBydWxlcyB3aGVuIHRoZXkgdHJpZ2dlciBtZXJnaW5nIGlzIHRvIGJhbGFuY2UgdGhlIHJ1bgpsZW5ndGhzIGFzIGNsb3NlbHkgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgYSBsb3cgYm91bmQgb24gdGhlIG51bWJlciBvZgpydW5zIHdlIGhhdmUgdG8gcmVtZW1iZXIuICBUaGlzIGlzIG1heGltYWxseSBlZmZlY3RpdmUgZm9yIHJhbmRvbSBkYXRhLAp3aGVyZSBhbGwgcnVucyBhcmUgbGlrZWx5IHRvIGJlIG9mIChhcnRpZmljaWFsbHkgZm9yY2VkKSBsZW5ndGggbWlucnVuLCBhbmQKdGhlbiB3ZSBnZXQgYSBzZXF1ZW5jZSBvZiBwZXJmZWN0bHkgYmFsYW5jZWQgbWVyZ2VzICh3aXRoLCBwZXJoYXBzLCBzb21lCm9kZGJhbGxzIGF0IHRoZSBlbmQpLgoKT1RPSCwgb25lIHJlYXNvbiB0aGlzIHNvcnQgaXMgc28gZ29vZCBmb3IgcGFydGx5IG9yZGVyZWQgZGF0YSBoYXMgdG8gZG8Kd2l0aCB3aWxkbHkgdW5iYWxhbmNlZCBydW4gbGVuZ3Rocy4KCgpNZXJnZSBNZW1vcnkKLS0tLS0tLS0tLS0tCk1lcmdpbmcgYWRqYWNlbnQgcnVucyBvZiBsZW5ndGhzIEEgYW5kIEIgaW4tcGxhY2UgaXMgdmVyeSBkaWZmaWN1bHQuClRoZW9yZXRpY2FsIGNvbnN0cnVjdGlvbnMgYXJlIGtub3duIHRoYXQgY2FuIGRvIGl0LCBidXQgdGhleSdyZSB0b28gZGlmZmljdWx0CmFuZCBzbG93IGZvciBwcmFjdGljYWwgdXNlLiAgQnV0IGlmIHdlIGhhdmUgdGVtcCBtZW1vcnkgZXF1YWwgdG8gbWluKEEsIEIpLAppdCdzIGVhc3kuCgpJZiBBIGlzIHNtYWxsZXIgKGZ1bmN0aW9uIG1lcmdlX2xvKSwgY29weSBBIHRvIGEgdGVtcCBhcnJheSwgbGVhdmUgQiBhbG9uZSwKYW5kIHRoZW4gd2UgY2FuIGRvIHRoZSBvYnZpb3VzIG1lcmdlIGFsZ29yaXRobSBsZWZ0IHRvIHJpZ2h0LCBmcm9tIHRoZSB0ZW1wCmFyZWEgYW5kIEIsIHN0YXJ0aW5nIHRoZSBzdG9yZXMgaW50byB3aGVyZSBBIHVzZWQgdG8gbGl2ZS4gIFRoZXJlJ3MgYWx3YXlzIGEKZnJlZSBhcmVhIGluIHRoZSBvcmlnaW5hbCBhcmVhIGNvbXByaXNpbmcgYSBudW1iZXIgb2YgZWxlbWVudHMgZXF1YWwgdG8gdGhlCm51bWJlciBub3QgeWV0IG1lcmdlZCBmcm9tIHRoZSB0ZW1wIGFycmF5ICh0cml2aWFsbHkgdHJ1ZSBhdCB0aGUgc3RhcnQ7CnByb2NlZWQgYnkgaW5kdWN0aW9uKS4gIFRoZSBvbmx5IHRyaWNreSBiaXQgaXMgdGhhdCBpZiBhIGNvbXBhcmlzb24gcmFpc2VzIGFuCmV4Y2VwdGlvbiwgd2UgaGF2ZSB0byByZW1lbWJlciB0byBjb3B5IHRoZSByZW1haW5pbmcgZWxlbWVudHMgYmFjayBpbiBmcm9tCnRoZSB0ZW1wIGFyZWEsIGxlc3QgdGhlIGFycmF5IGVuZCB1cCB3aXRoIGR1cGxpY2F0ZSBlbnRyaWVzIGZyb20gQi4gIEJ1dAp0aGF0J3MgZXhhY3RseSB0aGUgc2FtZSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlmIHdlIHJlYWNoIHRoZSBlbmQgb2YgQiBmaXJzdCwKc28gdGhlIGV4aXQgY29kZSBpcyBwbGVhc2FudGx5IGNvbW1vbiB0byBib3RoIHRoZSBub3JtYWwgYW5kIGVycm9yIGNhc2VzLgoKSWYgQiBpcyBzbWFsbGVyIChmdW5jdGlvbiBtZXJnZV9oaSwgd2hpY2ggaXMgbWVyZ2VfbG8ncyAibWlycm9yIGltYWdlIiksCm11Y2ggdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWVyZ2UgcmlnaHQgdG8gbGVmdCwgY29weWluZyBCIGludG8gYQp0ZW1wIGFycmF5IGFuZCBzdGFydGluZyB0aGUgc3RvcmVzIGF0IHRoZSByaWdodCBlbmQgb2Ygd2hlcmUgQiB1c2VkIHRvIGxpdmUuCgpBIHJlZmluZW1lbnQ6ICBXaGVuIHdlJ3JlIGFib3V0IHRvIG1lcmdlIGFkamFjZW50IHJ1bnMgQSBhbmQgQiwgd2UgZmlyc3QgZG8KYSBmb3JtIG9mIGJpbmFyeSBzZWFyY2ggKG1vcmUgb24gdGhhdCBsYXRlcikgdG8gc2VlIHdoZXJlIEJbMF0gc2hvdWxkIGVuZCB1cAppbiBBLiAgRWxlbWVudHMgaW4gQSBwcmVjZWRpbmcgdGhhdCBwb2ludCBhcmUgYWxyZWFkeSBpbiB0aGVpciBmaW5hbApwb3NpdGlvbnMsIGVmZmVjdGl2ZWx5IHNocmlua2luZyB0aGUgc2l6ZSBvZiBBLiAgTGlrZXdpc2Ugd2UgYWxzbyBzZWFyY2ggdG8Kc2VlIHdoZXJlIEFbLTFdIHNob3VsZCBlbmQgdXAgaW4gQiwgYW5kIGVsZW1lbnRzIG9mIEIgYWZ0ZXIgdGhhdCBwb2ludCBjYW4KYWxzbyBiZSBpZ25vcmVkLiAgVGhpcyBjdXRzIHRoZSBhbW91bnQgb2YgdGVtcCBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzYW1lCmFtb3VudC4KClRoZXNlIHByZWxpbWluYXJ5IHNlYXJjaGVzIG1heSBub3QgcGF5IG9mZiwgYW5kIGNhbiBiZSBleHBlY3RlZCAqbm90KiB0bwpyZXBheSB0aGVpciBjb3N0IGlmIHRoZSBkYXRhIGlzIHJhbmRvbS4gIEJ1dCB0aGV5IGNhbiB3aW4gaHVnZSBpbiBhbGwgb2YKdGltZSwgY29weWluZywgYW5kIG1lbW9yeSBzYXZpbmdzIHdoZW4gdGhleSBkbyBwYXksIHNvIHRoaXMgaXMgb25lIG9mIHRoZQoicGVyLW1lcmdlIG92ZXJoZWFkcyIgbWVudGlvbmVkIGFib3ZlIHRoYXQgd2UncmUgaGFwcHkgdG8gZW5kdXJlIGJlY2F1c2UKdGhlcmUgaXMgYXQgbW9zdCBvbmUgdmVyeSBzaG9ydCBydW4uICBJdCdzIGdlbmVyYWxseSB0cnVlIGluIHRoaXMgYWxnb3JpdGhtCnRoYXQgd2UncmUgd2lsbGluZyB0byBnYW1ibGUgYSBsaXR0bGUgdG8gd2luIGEgbG90LCBldmVuIHRob3VnaCB0aGUgbmV0CmV4cGVjdGF0aW9uIGlzIG5lZ2F0aXZlIGZvciByYW5kb20gZGF0YS4KCgpNZXJnZSBBbGdvcml0aG1zCi0tLS0tLS0tLS0tLS0tLS0KbWVyZ2VfbG8oKSBhbmQgbWVyZ2VfaGkoKSBhcmUgd2hlcmUgdGhlIGJ1bGsgb2YgdGhlIHRpbWUgaXMgc3BlbnQuICBtZXJnZV9sbwpkZWFscyB3aXRoIHJ1bnMgd2hlcmUgQSA8PSBCLCBhbmQgbWVyZ2VfaGkgd2hlcmUgQSA+IEIuICBUaGV5IGRvbid0IGtub3cKd2hldGhlciB0aGUgZGF0YSBpcyBjbHVzdGVyZWQgb3IgdW5pZm9ybSwgYnV0IGEgbG92ZWx5IHRoaW5nIGFib3V0IG1lcmdpbmcKaXMgdGhhdCBtYW55IGtpbmRzIG9mIGNsdXN0ZXJpbmcgInJldmVhbCB0aGVtc2VsdmVzIiBieSBob3cgbWFueSB0aW1lcyBpbiBhCnJvdyB0aGUgd2lubmluZyBtZXJnZSBlbGVtZW50IGNvbWVzIGZyb20gdGhlIHNhbWUgcnVuLiAgV2UnbGwgb25seSBkaXNjdXNzCm1lcmdlX2xvIGhlcmU7IG1lcmdlX2hpIGlzIGV4YWN0bHkgYW5hbG9nb3VzLgoKTWVyZ2luZyBiZWdpbnMgaW4gdGhlIHVzdWFsLCBvYnZpb3VzIHdheSwgY29tcGFyaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIEEKdG8gdGhlIGZpcnN0IG9mIEIsIGFuZCBtb3ZpbmcgQlswXSB0byB0aGUgbWVyZ2UgYXJlYSBpZiBpdCdzIGxlc3MgdGhhbiBBWzBdLAplbHNlIG1vdmluZyBBWzBdIHRvIHRoZSBtZXJnZSBhcmVhLiAgQ2FsbCB0aGF0IHRoZSAib25lIHBhaXIgYXQgYSB0aW1lIgptb2RlLiAgVGhlIG9ubHkgdHdpc3QgaGVyZSBpcyBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIGluIGEgcm93ICJ0aGUKd2lubmVyIiBjb21lcyBmcm9tIHRoZSBzYW1lIHJ1bi4KCklmIHRoYXQgY291bnQgcmVhY2hlcyBNSU5fR0FMTE9QLCB3ZSBzd2l0Y2ggdG8gImdhbGxvcGluZyBtb2RlIi4gIEhlcmUKd2UgKnNlYXJjaCogQiBmb3Igd2hlcmUgQVswXSBiZWxvbmdzLCBhbmQgbW92ZSBvdmVyIGFsbCB0aGUgQidzIGJlZm9yZQp0aGF0IHBvaW50IGluIG9uZSBjaHVuayB0byB0aGUgbWVyZ2UgYXJlYSwgdGhlbiBtb3ZlIEFbMF0gdG8gdGhlIG1lcmdlCmFyZWEuICBUaGVuIHdlIHNlYXJjaCBBIGZvciB3aGVyZSBCWzBdIGJlbG9uZ3MsIGFuZCBzaW1pbGFybHkgbW92ZSBhCnNsaWNlIG9mIEEgaW4gb25lIGNodW5rLiAgVGhlbiBiYWNrIHRvIHNlYXJjaGluZyBCIGZvciB3aGVyZSBBWzBdIGJlbG9uZ3MsCmV0Yy4gIFdlIHN0YXkgaW4gZ2FsbG9waW5nIG1vZGUgdW50aWwgYm90aCBzZWFyY2hlcyBmaW5kIHNsaWNlcyB0byBjb3B5Cmxlc3MgdGhhbiBNSU5fR0FMTE9QIGVsZW1lbnRzIGxvbmcsIGF0IHdoaWNoIHBvaW50IHdlIGdvIGJhY2sgdG8gb25lLXBhaXItCmF0LWEtdGltZSBtb2RlLgoKQSByZWZpbmVtZW50OiAgVGhlIE1lcmdlU3RhdGUgc3RydWN0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBtaW5fZ2FsbG9wIHRoYXQKY29udHJvbHMgd2hlbiB3ZSBlbnRlciBnYWxsb3BpbmcgbW9kZSwgaW5pdGlhbGl6ZWQgdG8gTUlOX0dBTExPUC4KbWVyZ2VfbG8oKSBhbmQgbWVyZ2VfaGkoKSBhZGp1c3QgdGhpcyBoaWdoZXIgd2hlbiBnYWxsb3BpbmcgaXNuJ3QgcGF5aW5nCm9mZiwgYW5kIGxvd2VyIHdoZW4gaXQgaXMuCgoKR2FsbG9waW5nCi0tLS0tLS0tLQpTdGlsbCB3aXRob3V0IGxvc3Mgb2YgZ2VuZXJhbGl0eSwgYXNzdW1lIEEgaXMgdGhlIHNob3J0ZXIgcnVuLiAgSW4gZ2FsbG9waW5nCm1vZGUsIHdlIGZpcnN0IGxvb2sgZm9yIEFbMF0gaW4gQi4gIFdlIGRvIHRoaXMgdmlhICJnYWxsb3BpbmciLCBjb21wYXJpbmcKQVswXSBpbiB0dXJuIHRvIEJbMF0sIEJbMV0sIEJbM10sIEJbN10sIC4uLiwgQlsyKipqIC0gMV0sIC4uLiwgdW50aWwgZmluZGluZwp0aGUgayBzdWNoIHRoYXQgQlsyKiooay0xKSAtIDFdIDwgQVswXSA8PSBCWzIqKmsgLSAxXS4gIFRoaXMgdGFrZXMgYXQgbW9zdApyb3VnaGx5IGxnKEIpIGNvbXBhcmlzb25zLCBhbmQsIHVubGlrZSBhIHN0cmFpZ2h0IGJpbmFyeSBzZWFyY2gsIGZhdm9ycwpmaW5kaW5nIHRoZSByaWdodCBzcG90IGVhcmx5IGluIEIgKG1vcmUgb24gdGhhdCBsYXRlcikuCgpBZnRlciBmaW5kaW5nIHN1Y2ggYSBrLCB0aGUgcmVnaW9uIG9mIHVuY2VydGFpbnR5IGlzIHJlZHVjZWQgdG8gMioqKGstMSkgLSAxCmNvbnNlY3V0aXZlIGVsZW1lbnRzLCBhbmQgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoIHJlcXVpcmVzIGV4YWN0bHkgay0xCmFkZGl0aW9uYWwgY29tcGFyaXNvbnMgdG8gbmFpbCBpdC4gIFRoZW4gd2UgY29weSBhbGwgdGhlIEIncyB1cCB0byB0aGF0CnBvaW50IGluIG9uZSBjaHVuaywgYW5kIHRoZW4gY29weSBBWzBdLiAgTm90ZSB0aGF0IG5vIG1hdHRlciB3aGVyZSBBWzBdCmJlbG9uZ3MgaW4gQiwgdGhlIGNvbWJpbmF0aW9uIG9mIGdhbGxvcGluZyArIGJpbmFyeSBzZWFyY2ggZmluZHMgaXQgaW4gbm8KbW9yZSB0aGFuIGFib3V0IDIqbGcoQikgY29tcGFyaXNvbnMuCgpJZiB3ZSBkaWQgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoLCB3ZSBjb3VsZCBmaW5kIGl0IGluIG5vIG1vcmUgdGhhbgpjZWlsaW5nKGxnKEIrMSkpIGNvbXBhcmlzb25zIC0tIGJ1dCBzdHJhaWdodCBiaW5hcnkgc2VhcmNoIHRha2VzIHRoYXQgbWFueQpjb21wYXJpc29ucyBubyBtYXR0ZXIgd2hlcmUgQVswXSBiZWxvbmdzLiAgU3RyYWlnaHQgYmluYXJ5IHNlYXJjaCB0aHVzIGxvc2VzCnRvIGdhbGxvcGluZyB1bmxlc3MgdGhlIHJ1biBpcyBxdWl0ZSBsb25nLCBhbmQgd2Ugc2ltcGx5IGNhbid0IGd1ZXNzCndoZXRoZXIgaXQgaXMgaW4gYWR2YW5jZS4KCklmIGRhdGEgaXMgcmFuZG9tIGFuZCBydW5zIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBBWzBdIGJlbG9uZ3MgYXQgQlswXSBoYWxmCnRoZSB0aW1lLCBhdCBCWzFdIGEgcXVhcnRlciBvZiB0aGUgdGltZSwgYW5kIHNvIG9uOiAgYSBjb25zZWN1dGl2ZSB3aW5uaW5nCnN1Yi1ydW4gaW4gQiBvZiBsZW5ndGggayBvY2N1cnMgd2l0aCBwcm9iYWJpbGl0eSAxLzIqKihrKzEpLiAgU28gbG9uZwp3aW5uaW5nIHN1Yi1ydW5zIGFyZSBleHRyZW1lbHkgdW5saWtlbHkgaW4gcmFuZG9tIGRhdGEsIGFuZCBndWVzc2luZyB0aGF0IGEKd2lubmluZyBzdWItcnVuIGlzIGdvaW5nIHRvIGJlIGxvbmcgaXMgYSBkYW5nZXJvdXMgZ2FtZS4KCk9UT0gsIGlmIGRhdGEgaXMgbG9wc2lkZWQgb3IgbHVtcHkgb3IgY29udGFpbnMgbWFueSBkdXBsaWNhdGVzLCBsb25nCnN0cmV0Y2hlcyBvZiB3aW5uaW5nIHN1Yi1ydW5zIGFyZSB2ZXJ5IGxpa2VseSwgYW5kIGN1dHRpbmcgdGhlIG51bWJlciBvZgpjb21wYXJpc29ucyBuZWVkZWQgdG8gZmluZCBvbmUgZnJvbSBPKEIpIHRvIE8obG9nIEIpIGlzIGEgaHVnZSB3aW4uCgpHYWxsb3BpbmcgY29tcHJvbWlzZXMgYnkgZ2V0dGluZyBvdXQgZmFzdCBpZiB0aGVyZSBpc24ndCBhIGxvbmcgd2lubmluZwpzdWItcnVuLCB5ZXQgZmluZGluZyBzdWNoIHZlcnkgZWZmaWNpZW50bHkgd2hlbiB0aGV5IGV4aXN0LgoKSSBmaXJzdCBsZWFybmVkIGFib3V0IHRoZSBnYWxsb3Bpbmcgc3RyYXRlZ3kgaW4gYSByZWxhdGVkIGNvbnRleHQ7IHNlZToKCiAgICAiQWRhcHRpdmUgU2V0IEludGVyc2VjdGlvbnMsIFVuaW9ucywgYW5kIERpZmZlcmVuY2VzIiAoMjAwMCkKICAgIEVyaWsgRC4gRGVtYWluZSwgQWxlamFuZHJvIEzzcGV6LU9ydGl6LCBKLiBJYW4gTXVucm8KCmFuZCBpdHMgZm9sbG93dXAocykuICBBbiBlYXJsaWVyIHBhcGVyIGNhbGxlZCB0aGUgc2FtZSBzdHJhdGVneQoiZXhwb25lbnRpYWwgc2VhcmNoIjoKCiAgICJPcHRpbWlzdGljIFNvcnRpbmcgYW5kIEluZm9ybWF0aW9uIFRoZW9yZXRpYyBDb21wbGV4aXR5IgogICBQZXRlciBNY0lscm95CiAgIFNPREEgKEZvdXJ0aCBBbm51YWwgQUNNLVNJQU0gU3ltcG9zaXVtIG9uIERpc2NyZXRlIEFsZ29yaXRobXMpLCBwcAogICA0NjctNDc0LCBBdXN0aW4sIFRleGFzLCAyNS0yNyBKYW51YXJ5IDE5OTMuCgphbmQgaXQgcHJvYmFibHkgZGF0ZXMgYmFjayB0byBhbiBlYXJsaWVyIHBhcGVyIGJ5IEJlbnRsZXkgYW5kIFlhby4gIFRoZQpNY0lsb3J5IHBhcGVyIGluIHBhcnRpY3VsYXIgaGFzIGdvb2QgYW5hbHlzaXMgb2YgYSBtZXJnZXNvcnQgdGhhdCdzCnByb2JhYmx5IHN0cm9uZ2x5IHJlbGF0ZWQgdG8gdGhpcyBvbmUgaW4gaXRzIGdhbGxvcGluZyBzdHJhdGVneS4KCgpHYWxsb3Bpbmcgd2l0aCBhIEJyb2tlbiBMZWcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvIHdoeSBkb24ndCB3ZSBhbHdheXMgZ2FsbG9wPyAgQmVjYXVzZSBpdCBjYW4gbG9zZSwgb24gdHdvIGNvdW50czoKCjEuIFdoaWxlIHdlJ3JlIHdpbGxpbmcgdG8gZW5kdXJlIHNtYWxsIHBlci1tZXJnZSBvdmVyaGVhZHMsIHBlci1jb21wYXJpc29uCiAgIG92ZXJoZWFkcyBhcmUgYSBkaWZmZXJlbnQgc3RvcnkuICBDYWxsaW5nIFlldCBBbm90aGVyIEZ1bmN0aW9uIHBlcgogICBjb21wYXJpc29uIGlzIGV4cGVuc2l2ZSwgYW5kIGdhbGxvcF9sZWZ0KCkgYW5kIGdhbGxvcF9yaWdodCgpIGFyZQogICB0b28gbG9uZy13aW5kZWQgZm9yIHNhbmUgaW5saW5pbmcuCgoyLiBHYWxsb3BpbmcgY2FuLS0gYWxhcyAtLXJlcXVpcmUgbW9yZSBjb21wYXJpc29ucyB0aGFuIGxpbmVhciBvbmUtYXQtdGltZQogICBzZWFyY2gsIGRlcGVuZGluZyBvbiB0aGUgZGF0YS4KCiMyIHJlcXVpcmVzIGRldGFpbHMuICBJZiBBWzBdIGJlbG9uZ3MgYmVmb3JlIEJbMF0sIGdhbGxvcGluZyByZXF1aXJlcyAxCmNvbXBhcmUgdG8gZGV0ZXJtaW5lIHRoYXQsIHNhbWUgYXMgbGluZWFyIHNlYXJjaCwgZXhjZXB0IGl0IGNvc3RzIG1vcmUKdG8gY2FsbCB0aGUgZ2FsbG9wIGZ1bmN0aW9uLiAgSWYgQVswXSBiZWxvbmdzIHJpZ2h0IGJlZm9yZSBCWzFdLCBnYWxsb3BpbmcKcmVxdWlyZXMgMiBjb21wYXJlcywgYWdhaW4gc2FtZSBhcyBsaW5lYXIgc2VhcmNoLiAgT24gdGhlIHRoaXJkIGNvbXBhcmUsCmdhbGxvcGluZyBjaGVja3MgQVswXSBhZ2FpbnN0IEJbM10sIGFuZCBpZiBpdCdzIDw9LCByZXF1aXJlcyBvbmUgbW9yZQpjb21wYXJlIHRvIGRldGVybWluZSB3aGV0aGVyIEFbMF0gYmVsb25ncyBhdCBCWzJdIG9yIEJbM10uICBUaGF0J3MgYSB0b3RhbApvZiA0IGNvbXBhcmVzLCBidXQgaWYgQVswXSBkb2VzIGJlbG9uZyBhdCBCWzJdLCBsaW5lYXIgc2VhcmNoIHdvdWxkIGhhdmUKZGlzY292ZXJlZCB0aGF0IGluIG9ubHkgMyBjb21wYXJlcywgYW5kIHRoYXQncyBhIGh1Z2UgbG9zcyEgIFJlYWxseS4gIEl0J3MKYW4gaW5jcmVhc2Ugb2YgMzMlIGluIHRoZSBudW1iZXIgb2YgY29tcGFyZXMgbmVlZGVkLCBhbmQgY29tcGFyaXNvbnMgYXJlCmV4cGVuc2l2ZSBpbiBQeXRob24uCgppbmRleCBpbiBCIHdoZXJlICAgICMgY29tcGFyZXMgbGluZWFyICAjIGdhbGxvcCAgIyBiaW5hcnkgIGdhbGxvcApBWzBdIGJlbG9uZ3MgICAgICAgIHNlYXJjaCBuZWVkcyAgICAgICBjb21wYXJlcyAgY29tcGFyZXMgIHRvdGFsCi0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tCiAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAxICAgICAgICAgMCAgICAgICAxCgogICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgMiAgICAgICAgIDAgICAgICAgMgoKICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIDMgICAgICAgICAxICAgICAgIDQKICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgIDMgICAgICAgICAxICAgICAgIDQKCiAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgIDUgICAgICAgICA0ICAgICAgICAgMiAgICAgICA2CiAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICA0ICAgICAgICAgMiAgICAgICA2CiAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICAgICAgIDcgICAgICAgICA0ICAgICAgICAgMiAgICAgICA2CiAgICAgICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgIDggICAgICAgICA0ICAgICAgICAgMiAgICAgICA2CgogICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgNSAgICAgICAgIDMgICAgICAgOAogICAgICAgICAgICAgICA5ICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgNSAgICAgICAgIDMgICAgICAgOAogICAgICAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgNSAgICAgICAgIDMgICAgICAgOAogICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgNSAgICAgICAgIDMgICAgICAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCgpJbiBnZW5lcmFsLCBpZiBBWzBdIGJlbG9uZ3MgYXQgQltpXSwgbGluZWFyIHNlYXJjaCByZXF1aXJlcyBpKzEgY29tcGFyaXNvbnMKdG8gZGV0ZXJtaW5lIHRoYXQsIGFuZCBnYWxsb3BpbmcgYSB0b3RhbCBvZiAyKmZsb29yKGxnKGkpKSsyIGNvbXBhcmlzb25zLgpUaGUgYWR2YW50YWdlIG9mIGdhbGxvcGluZyBpcyB1bmJvdW5kZWQgYXMgaSBncm93cywgYnV0IGl0IGRvZXNuJ3Qgd2luIGF0CmFsbCB1bnRpbCBpPTYuICBCZWZvcmUgdGhlbiwgaXQgbG9zZXMgdHdpY2UgKGF0IGk9MiBhbmQgaT00KSwgYW5kIHRpZXMKYXQgdGhlIG90aGVyIHZhbHVlcy4gIEF0IGFuZCBhZnRlciBpPTYsIGdhbGxvcGluZyBhbHdheXMgd2lucy4KCldlIGNhbid0IGd1ZXNzIGluIGFkdmFuY2Ugd2hlbiBpdCdzIGdvaW5nIHRvIHdpbiwgdGhvdWdoLCBzbyB3ZSBkbyBvbmUgcGFpcgphdCBhIHRpbWUgdW50aWwgdGhlIGV2aWRlbmNlIHNlZW1zIHN0cm9uZyB0aGF0IGdhbGxvcGluZyBtYXkgcGF5LiAgTUlOX0dBTExPUAppcyA3LCBhbmQgdGhhdCdzIHByZXR0eSBzdHJvbmcgZXZpZGVuY2UuICBIb3dldmVyLCBpZiB0aGUgZGF0YSBpcyByYW5kb20sIGl0CnNpbXBseSB3aWxsIHRyaWdnZXIgZ2FsbG9waW5nIG1vZGUgcHVyZWx5IGJ5IGx1Y2sgZXZlcnkgbm93IGFuZCBhZ2FpbiwgYW5kCml0J3MgcXVpdGUgbGlrZWx5IHRvIGhpdCBvbmUgb2YgdGhlIGxvc2luZyBjYXNlcyBuZXh0LiAgT24gdGhlIG90aGVyIGhhbmQsCmluIGNhc2VzIGxpa2UgfnNvcnQsIGdhbGxvcGluZyBhbHdheXMgcGF5cywgYW5kIE1JTl9HQUxMT1AgaXMgbGFyZ2VyIHRoYW4gaXQKInNob3VsZCBiZSIgdGhlbi4gIFNvIHRoZSBNZXJnZVN0YXRlIHN0cnVjdCBrZWVwcyBhIG1pbl9nYWxsb3AgdmFyaWFibGUKdGhhdCBtZXJnZV9sbyBhbmQgbWVyZ2VfaGkgYWRqdXN0OiAgdGhlIGxvbmdlciB3ZSBzdGF5IGluIGdhbGxvcGluZyBtb2RlLAp0aGUgc21hbGxlciBtaW5fZ2FsbG9wIGdldHMsIG1ha2luZyBpdCBlYXNpZXIgdG8gdHJhbnNpdGlvbiBiYWNrIHRvCmdhbGxvcGluZyBtb2RlIChpZiB3ZSBldmVyIGxlYXZlIGl0IGluIHRoZSBjdXJyZW50IG1lcmdlLCBhbmQgYXQgdGhlCnN0YXJ0IG9mIHRoZSBuZXh0IG1lcmdlKS4gIEJ1dCB3aGVuZXZlciB0aGUgZ2FsbG9wIGxvb3AgZG9lc24ndCBwYXksCm1pbl9nYWxsb3AgaXMgaW5jcmVhc2VkIGJ5IG9uZSwgbWFraW5nIGl0IGhhcmRlciB0byB0cmFuc2l0aW9uIGJhY2sKdG8gZ2FsbG9waW5nIG1vZGUgKGFuZCBhZ2FpbiBib3RoIHdpdGhpbiBhIG1lcmdlIGFuZCBhY3Jvc3MgbWVyZ2VzKS4gIEZvcgpyYW5kb20gZGF0YSwgdGhpcyBhbGwgYnV0IGVsaW1pbmF0ZXMgdGhlIGdhbGxvcCBwZW5hbHR5OiAgbWluX2dhbGxvcCBncm93cwpsYXJnZSBlbm91Z2ggdGhhdCB3ZSBhbG1vc3QgbmV2ZXIgZ2V0IGludG8gZ2FsbG9waW5nIG1vZGUuICBBbmQgZm9yIGNhc2VzCmxpa2UgfnNvcnQsIG1pbl9nYWxsb3AgY2FuIGZhbGwgdG8gYXMgbG93IGFzIDEuICBUaGlzIHNlZW1zIHRvIHdvcmsgd2VsbCwKYnV0IGluIGFsbCBpdCdzIGEgbWlub3IgaW1wcm92ZW1lbnQgb3ZlciB1c2luZyBhIGZpeGVkIE1JTl9HQUxMT1AgdmFsdWUuCgoKR2FsbG9waW5nIENvbXBsaWNhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBkZXNjcmlwdGlvbiBhYm92ZSB3YXMgZm9yIG1lcmdlX2xvLiAgbWVyZ2VfaGkgaGFzIHRvIG1lcmdlICJmcm9tIHRoZQpvdGhlciBlbmQiLCBhbmQgcmVhbGx5IG5lZWRzIHRvIGdhbGxvcCBzdGFydGluZyBhdCB0aGUgbGFzdCBlbGVtZW50IGluIGEgcnVuCmluc3RlYWQgb2YgdGhlIGZpcnN0LiAgR2FsbG9waW5nIGZyb20gdGhlIGZpcnN0IHN0aWxsIHdvcmtzLCBidXQgZG9lcyBtb3JlCmNvbXBhcmlzb25zIHRoYW4gaXQgc2hvdWxkICh0aGlzIGlzIHNpZ25pZmljYW50IC0tIEkgdGltZWQgaXQgYm90aCB3YXlzKS4KRm9yIHRoaXMgcmVhc29uLCB0aGUgZ2FsbG9wX2xlZnQoKSBhbmQgZ2FsbG9wX3JpZ2h0KCkgZnVuY3Rpb25zIGhhdmUgYQoiaGludCIgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBpbmRleCBhdCB3aGljaCBnYWxsb3Bpbmcgc2hvdWxkIGJlZ2luLiAgU28KZ2FsbG9waW5nIGNhbiBhY3R1YWxseSBzdGFydCBhdCBhbnkgaW5kZXgsIGFuZCBwcm9jZWVkIGF0IG9mZnNldHMgb2YgMSwgMywKNywgMTUsIC4uLiBvciAtMSwgLTMsIC03LCAtMTUsIC4uLiBmcm9tIHRoZSBzdGFydGluZyBpbmRleC4KCkluIHRoZSBjb2RlIGFzIEkgdHlwZSBpdCdzIGFsd2F5cyBjYWxsZWQgd2l0aCBlaXRoZXIgMCBvciBuLTEgKHdoZXJlIG4gaXMKdGhlICMgb2YgZWxlbWVudHMgaW4gYSBydW4pLiAgSXQncyB0ZW1wdGluZyB0byB0cnkgdG8gZG8gc29tZXRoaW5nIGZhbmNpZXIsCm1lbGRpbmcgZ2FsbG9waW5nIHdpdGggc29tZSBmb3JtIG9mIGludGVycG9sYXRpb24gc2VhcmNoOyBmb3IgZXhhbXBsZSwgaWYKd2UncmUgbWVyZ2luZyBhIHJ1biBvZiBsZW5ndGggMSB3aXRoIGEgcnVuIG9mIGxlbmd0aCAxMDAwMCwgaW5kZXggNTAwMCBpcwpwcm9iYWJseSBhIGJldHRlciBndWVzcyBhdCB0aGUgZmluYWwgcmVzdWx0IHRoYW4gZWl0aGVyIDAgb3IgOTk5OS4gIEJ1dAppdCdzIHVuY2xlYXIgaG93IHRvIGdlbmVyYWxpemUgdGhhdCBpbnR1aXRpb24gdXNlZnVsbHksIGFuZCBtZXJnaW5nIG9mCndpbGRseSB1bmJhbGFuY2VkIHJ1bnMgYWxyZWFkeSBlbmpveXMgZXhjZWxsZW50IHBlcmZvcm1hbmNlLgoKfnNvcnQgaXMgYSBnb29kIGV4YW1wbGUgb2Ygd2hlbiBiYWxhbmNlZCBydW5zIGNvdWxkIGJlbmVmaXQgZnJvbSBhIGJldHRlcgpoaW50IHZhbHVlOiAgdG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhpcyB3b3VsZCBsaWtlIHRvIHVzZSBhIHN0YXJ0aW5nCm9mZnNldCBlcXVhbCB0byB0aGUgcHJldmlvdXMgdmFsdWUgb2YgYWNvdW50L2Jjb3VudC4gIERvaW5nIHNvIHNhdmVzIGFib3V0CjEwJSBvZiB0aGUgY29tcGFyZXMgaW4gfnNvcnQuICBIb3dldmVyLCBkb2luZyBzbyBpcyBhbHNvIGEgbWl4ZWQgYmFnLApodXJ0aW5nIG90aGVyIGNhc2VzLgoKCkNvbXBhcmluZyBBdmVyYWdlICMgb2YgQ29tcGFyZXMgb24gUmFuZG9tIEFycmF5cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KW05PVEU6ICBUaGlzIHdhcyBkb25lIHdoZW4gdGhlIG5ldyBhbGdvcml0aG0gdXNlZCBhYm91dCAwLjElIG1vcmUgY29tcGFyZXMKIG9uIHJhbmRvbSBkYXRhIHRoYW4gZG9lcyBpdHMgY3VycmVudCBpbmNhcm5hdGlvbi5dCgpIZXJlIGxpc3Quc29ydCgpIGlzIHNhbXBsZXNvcnQsIGFuZCBsaXN0Lm1zb3J0KCkgdGhpcyBzb3J0OgoKIiIiCmltcG9ydCByYW5kb20KZnJvbSB0aW1lIGltcG9ydCBjbG9jayBhcyBub3cKCmRlZiBmaWxsKG4pOgogICAgZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQogICAgcmV0dXJuIFtyYW5kb20oKSBmb3IgaSBpbiB4cmFuZ2UobildCgpkZWYgbXljbXAoeCwgeSk6CiAgICBnbG9iYWwgbmNtcAogICAgbmNtcCArPSAxCiAgICByZXR1cm4gY21wKHgsIHkpCgpkZWYgdGltZWl0KHZhbHVlcywgbWV0aG9kKToKICAgIGdsb2JhbCBuY21wCiAgICBYID0gdmFsdWVzWzpdCiAgICBib3VuZCA9IGdldGF0dHIoWCwgbWV0aG9kKQogICAgbmNtcCA9IDAKICAgIHQxID0gbm93KCkKICAgIGJvdW5kKG15Y21wKQogICAgdDIgPSBub3coKQogICAgcmV0dXJuIHQyLXQxLCBuY21wCgpmb3JtYXQgPSAiJTVzICAlOS4yZiAgJTExZCIKZjIgICAgID0gIiU1cyAgJTkuMmYgICUxMS4yZiIKCmRlZiBkcml2ZSgpOgogICAgY291bnQgPSBzc3QgPSBzc2NtcCA9IG1zdCA9IG1zY21wID0gbmVsdHMgPSAwCiAgICB3aGlsZSBUcnVlOgogICAgICAgIG4gPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMCkKICAgICAgICBuZWx0cyArPSBuCiAgICAgICAgeCA9IGZpbGwobikKCiAgICAgICAgdCwgYyA9IHRpbWVpdCh4LCAnc29ydCcpCiAgICAgICAgc3N0ICs9IHQKICAgICAgICBzc2NtcCArPSBjCgogICAgICAgIHQsIGMgPSB0aW1laXQoeCwgJ21zb3J0JykKICAgICAgICBtc3QgKz0gdAogICAgICAgIG1zY21wICs9IGMKCiAgICAgICAgY291bnQgKz0gMQogICAgICAgIGlmIGNvdW50ICUgMTA6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHByaW50ICJjb3VudCIsIGNvdW50LCAibmVsdHMiLCBuZWx0cwogICAgICAgIHByaW50IGZvcm1hdCAlICgic29ydCIsICBzc3QsIHNzY21wKQogICAgICAgIHByaW50IGZvcm1hdCAlICgibXNvcnQiLCBtc3QsIG1zY21wKQogICAgICAgIHByaW50IGYyICAgICAlICgiIiwgKHNzdC1tc3QpKjFlMi9tc3QsIChzc2NtcC1tc2NtcCkqMWUyL21zY21wKQoKZHJpdmUoKQoiIiIKCkkgcmFuIHRoaXMgb24gV2luZG93cyBhbmQga2VwdCB1c2luZyB0aGUgY29tcHV0ZXIgbGlnaHRseSB3aGlsZSBpdCB3YXMKcnVubmluZy4gIHRpbWUuY2xvY2soKSBpcyB3YWxsLWNsb2NrIHRpbWUgb24gV2luZG93cywgd2l0aCBiZXR0ZXIgdGhhbgptaWNyb3NlY29uZCByZXNvbHV0aW9uLiAgc2FtcGxlc29ydCBzdGFydGVkIHdpdGggYSAxLjUyJSAjLW9mLWNvbXBhcmlzb25zCmRpc2FkdmFudGFnZSwgZmVsbCBxdWlja2x5IHRvIDEuNDglLCBhbmQgdGhlbiBmbHVjdHVhdGVkIHdpdGhpbiB0aGF0IHNtYWxsCnJhbmdlLiAgSGVyZSdzIHRoZSBsYXN0IGNodW5rIG9mIG91dHB1dCBiZWZvcmUgSSBraWxsZWQgdGhlIGpvYjoKCmNvdW50IDI2MzAgbmVsdHMgMTMwOTA2NTQzCiBzb3J0ICAgIDYxMTAuODAgICAxOTM3ODg3NTczCm1zb3J0ICAgIDYwMDIuNzggICAxOTA5Mzg5MzgxCiAgICAgICAgICAgIDEuODAgICAgICAgICAxLjQ5CgpXZSd2ZSBkb25lIG5lYXJseSAyIGJpbGxpb24gY29tcGFyaXNvbnMgYXBpZWNlIGF0IFB5dGhvbiBzcGVlZCB0aGVyZSwgYW5kCnRoYXQncyBlbm91Z2ggPHdpbms+LgoKRm9yIHJhbmRvbSBhcnJheXMgb2Ygc2l6ZSAyICh5ZXMsIHRoZXJlIGFyZSBvbmx5IDIgaW50ZXJlc3Rpbmcgb25lcyksCnNhbXBsZXNvcnQgaGFzIGEgNTAlKCEpIGNvbXBhcmlzb24gZGlzYWR2YW50YWdlLiAgVGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mCnNhbXBsZXNvcnQgc3BlY2lhbC1jYXNpbmcgYXQgbW9zdCBvbmUgYXNjZW5kaW5nIHJ1biBhdCB0aGUgc3RhcnQsIHRoZW4KZmFsbGluZyBiYWNrIHRvIHRoZSBnZW5lcmFsIGNhc2UgaWYgaXQgZG9lc24ndCBmaW5kIGFuIGFzY2VuZGluZyBydW4KaW1tZWRpYXRlbHkuICBUaGUgY29uc2VxdWVuY2UgaXMgdGhhdCBpdCBlbmRzIHVwIHVzaW5nIHR3byBjb21wYXJlcyB0byBzb3J0ClsyLCAxXS4gIEdyYXRpZnlpbmdseSwgdGltc29ydCBkb2Vzbid0IGRvIGFueSBzcGVjaWFsLWNhc2luZywgc28gaGFkIHRvIGJlCnRhdWdodCBob3cgdG8gZGVhbCB3aXRoIG1peHR1cmVzIG9mIGFzY2VuZGluZyBhbmQgZGVzY2VuZGluZyBydW5zCmVmZmljaWVudGx5IGluIGFsbCBjYXNlcy4K