ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMTAsIGVkaXRlZCBtYW51YWxseS4gVGhlIG1vc3QKcmVjZW50IGNoYW5nZXMgYXJlIGFsd2F5cyBnZW5lcmF0ZWQgaW50byB0aGUgQ0hBTkdFUyBmaWxlIHN0cmFpZ2h0IGZyb20gZ2l0LgoKS2FtaWwgRHVka2EgKDE3IEp1bmUgMjAxMCkKLSBJbXByb3ZlIHRlc3Q1NzUgaW4gb3JkZXIgdG8gbm90IGZhaWwgd2l0aCB0aHJlYWRlZCBETlMgcmVzb2x2ZXIuCgpWZXJzaW9uIDcuMjEuMCAoMTYgSnVuZSAyMDEwKQoKRGFuaWVsIFN0ZW5iZXJnICg1IEp1bmUgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGNhc2Ugb2Ygc3B1cmlvdXMgU1NMIGNvbm5lY3Rpb24gYWJvcnRzIHVzaW5nCiAgbGliY3VybCBhbmQgT3BlblNTTC4gIkkgdHJhY2tlZCBpdCBkb3duIHRvIHVuY2xlYXJlZCBlcnJvciBzdGF0ZSBvbiB0aGUKICBPcGVuU1NMIGVycm9yIHN0YWNrIC0gcGF0Y2ggYXR0YWNoZWQgZGVhbHMgd2l0aCB0aGF0LiIKCkRhbmllbCBTdGVuYmVyZyAoNSBKdW5lIDIwMTApCi0gRnJhbmsgTWVpZXIgYWRkZWQgQ1VSTElORk9fUFJJTUFSWV9QT1JULCBDVVJMSU5GT19MT0NBTF9JUCBhbmQKICBDVVJMSU5GT19MT0NBTF9QT1JUIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkuCgpZYW5nIFRzZSAoNCBKdW5lIDIwMTApCi0gRW5hYmxlZCBPcGVuTERBUCBzdXBwb3J0IGZvciBjeWd3aW4gYnVpbGRzLiBUaGlzIHN1cHBvcnQgd2FzIGRpc2FibGVkIGJhY2sKICBpbiAyMDA4IGR1ZSB0byBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIE9wZW5TU0wgYW5kIE9wZW5MREFQIGhlYWRlcnMuCiAgY3lnd2luJ3MgT3BlblNTTCAwLjkuOGwgYW5kIE9wZW5MREFQIDIuMy40MyB2ZXJzaW9ucyBvbiBjeWd3aW4gMS41LjI1CiAgYWxsb3cgYnVpbGRpbmcgYW4gT3BlbkxEQVAgZW5hYmxlZCBsaWJjdXJsIHN1cHBvcnRpbmcgYmFjayB0byBXaW5kb3dzIDk1LgoKICBSZW1vdmVkIHRoZSBub24tZnVuY3Rpb25hbCBDVVJMX0xEQVBfSFlCUklEIGNvZGUgYW5kIHJlZmVyZW5jZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIgSnVuZSAyMDEwKQotIEphc29uIE1jRG9uYWxkIHBvc3RlZCBidWcgcmVwb3J0ICMzMDA2Nzg2IHdoZW4gaGUgZm91bmQgdGhhdCB0aGUgU0ZUUCBjb2RlCiAgZGlkbid0IHRpbWVvdXQgcHJvcGVybHkgaW4gc2V2ZXJhbCBwbGFjZXMgaW4gdGhlIGNvZGUgZXZlbiBpZiBhIHRpbWVvdXQgd2FzCiAgc2V0IHByb3Blcmx5LgoKICBCYXNlZCBvbiBoaXMgc3VnZ2VzdGVkIHBhdGNoLCBJIHdyb3RlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIHRoYXQgSQogIHRoaW5rIGFkZHJlc3NlZCB0aGUgaXNzdWUgYmV0dGVyIGFuZCBhbHNvIHVzZXMgdGhlIGNvbm5lY3QgdGltZW91dCBmb3IgdGhlCiAgaW5pdGlhbCBwYXJ0IG9mIHRoZSBTU0gvU0ZUUCBkb25lIGR1cmluZyB0aGUgInByb3RvY29sIGNvbm5lY3QiIHBoYXNlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MzAwNjc4NikKCllhbmcgVHNlICgyIEp1bmUgMjAxMCkKLSBBZGRlZCBtaXNzaW5nIG5ldyBsaWJjdXJsIGZpbGVzIHRvIG5vbi1jb25maWd1cmUgdGFyZ2V0cy4gQWRqdXN0ZWQKICBsaWJjdXJsIHN0YW5kYXJkIGludGVybmFsIGhlYWRlciBpbmNsdXNpb25zIGluIG5ldyBmaWxlcy4gRml4ZWQgYW4KICBTUE5FR08gcmVsYXRlZCBtZW1vcnkgbGVhay4gRml4ZWQgc2V2ZXJhbCBMREFQIHJlbGF0ZWQgY29tcGlsYXRpb24KICBpc3N1ZXMsIGFuZCBmaXhlZCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bmUgMjAxMCkKLSBJZ29yIE5vdm9zZWx0c2V2IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBzb2NrZXQgQVBJIGFuZCB1c2luZwogIHRpbWVvdXRzIGFuZCB0aW1lcnMuIEl0IGJvaWxlZCBkb3duIHRvIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2Ugb2YKICBHZXRUaWNrQ291bnQoKSBpbnRlcmFsbHkgdG8gZmlndXJlIG91dCB0aGUgY3VycmVudCB0aW1lLCB3aGlsZSBJZ29yJ3Mgb3duCiAgYXBwbGljYXRpb24gY29kZSB1c2VkIGFub3RoZXIgZnVuY3Rpb24gY2FsbC4KCiAgSXQgbWFkZSBoaXMgYXBwIGNhbGwgdGhlIHNvY2tldCBBUEkgdGltZW91dCBmdW5jdGlvbiBhIGJpdCBfYmVmb3JlXyBsaWJjdXJsCiAgd291bGQgY29uc2lkZXIgdGhlIHRpbWVvdXQgdG8gdHJpZ2dlciwgYW5kIHRoYXQgY291bGQgZWFzaWx5IGxlYWQgdG8KICB0aW1lb3V0cyBvciBzdGFsbHMgaW4gdGhlIGFwcC4gSXQgc2VlbXMgR2V0VGlja0NvdW50KCkgaW4gZ2VuZXJhbCBvZnRlbiBoYXMKICBubyBiZXR0ZXIgcmVzb2x1dGlvbiB0aGFuIDE2bXMgYW5kIHN3aXRjaGluZyB0byB0aGUgYWx0ZXJuYXRpdmUgZnVuY3Rpb24KICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBoYXMgaXRzIHNoYXJlIG9mIHByb2JsZW1zOgogICAgICBodHRwOi8vd3d3LnZpcnR1YWxkdWIub3JnL2Jsb2cvcGl2b3QvZW50cnkucGhwP2lkPTEwNgoKICBXZSBhZGRyZXNzIHRoaXMgcHJvYmxlbSBieSBzaW1wbHkgaGF2aW5nIGxpYmN1cmwgdHJlYXQgdGltZXJzIHRoYXQgYWxyZWFkeQogIGhhcyBvY2N1cmVkIG9yIHdpbGwgb2NjdXIgd2l0aGluIDQwbXMgc3ViamVjdCBmb3IgdHJlYXRtZW50LiBJJ20gY29uZmlkZW50CiAgdGhhdCB0aGVyZSBhcmUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGFuZCBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIHNpbWlsYXJseSBpbgogIGFjY3VyYXRlIHRpbWVyIGZ1bmN0aW9ucyBzbyBpdCBtYWtlcyBzZW5zZSB0byBoYXZlIGFwcGxpZWQgZ2VuZXJpY2FsbHkgYW5kIEkKICBkb24ndCBiZWxpZXZlIHdlIHNhY3JpZmljZSBtdWNoIGJ5IGFkZGluZyBhIDQwbXMgaW5hY2N1cmFjeSBvbiB0aGVzZQogIHRpbWVvdXRzLgoKS2FtaWwgRHVka2EgKDI3IE1heSAyMDEwKQotIGFkZGVkIGEgbmV3IHRlc3QgZm9yIENSTCBzdXBwb3J0ICh0ZXN0MzEzKQoKLSBUb3IgQXJudHNlbiBjaGFuZ2VkIHRoZSBhbHRlcm5hdGl2ZSBkZWZpbml0aW9uIG9mIGJvb2wgdG8gdXNlIGVudW0gaW5zdGVhZAogIG9mIHVuc2lnbmVkIGNoYXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1heSAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZml4ZWQgdGhlIHdhcm5pbmcgc2VlbiB3aGVuIGNvbXBpbGluZyBsaWIvcnRtcC5jOiBvbmUKICB1bnVzZWQgdmFyaWFibGVzLCBzZXZlcmFsIHVudXNlZCBhcmd1bWVudHMgYW5kIHNvbWUgbWlzc2luZyAjaW5jbHVkZS4KCi0gSnVsaWVuIENoYWZmcmFpeCBmaXhlZCAyIE9PTSBlcnJvcnM6IGEgbWlzc2luZyBOVUxMLWNoZWNrIGluCiAgbGliL2h0dHBfbmVnb2NpYXRlLmMgYW5kIGEgcG90ZW50aWFsIE5VTEwgZGVyZWZlcmVuY2luZyBpbiBsaWIvc3BsYXkuYwoKLSBIb3dhcmQgQ2h1IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBMREFQIGNvZGUgbXVjaCBjbGVhbmVyLCBuaWNlciBhbmQKICBpbiBnZW5lcmFsIGJlaW5nIGEgYmV0dGVyIGxpYmN1cmwgY2l0aXplbi4gSWYgYSBuZXcgZW5vdWdoIE9wZW5MREFQIHZlcnNpb24KICBpcyBkZXRlY3QsIHRoZSBuZXcgYW5kIHNoaW55IGxpYi9vcGVubGRhcC5jIGNvZGUgaXMgdGhlbiB1c2VkIGluc3RlYWQgb2YgdGhlCiAgb2xkIGNydWZ0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBNYXkgMjAxMCkKLSBFcmljIE1lcnRlbnMgcG9zdGVkIGJ1ZyAjMzAwMzcwNTogd2hlbiB3ZSBtYWRlIFRGVFAgdXNlIHRoZSBjb3JyZWN0IHRpbWVvdXQKICBvcHRpb24gd2hlbiBzZW50IHRvIHRoZSBzZXJ2ZXIgKGZpeGVkIE1heSAxOHRoIDIwMTApIGl0IGJlY2FtZSBvYnZpb3VzIHRoYXQKICBsaWJjdXJsIHVzZWQgaW52YWxpZCB0aW1lb3V0IHZhbHVlcyAoMzAwIGJ5IGRlZmF1bHQgd2hpbGUgdGhlIFJGQyBhbGxvd3MKICBub3RoaW5nIGFib3ZlIDI1NSkuIFdoaWxlIG9mIGNvdXJzZSBpdCBpcyBvYnZpb3VzIHRoYXQgYXMgVEZUUCBoYXMgd29ya2VkCiAgdGh1cyBmYXIgd2l0aG91dCBiZWluZyBhYmxlIHRvIHNldCB0aW1lb3V0IGF0IGFsbCwganVzdCByZW1vdmluZyB0aGUgc2V0dGluZwogIHdvdWxkbid0IG1ha2UgYW55IGRpZmZlcmVuY2UgaW4gYmVoYXZpb3IuIEkgZGVjaWRlZCB0byBzdGlsbCBrZWVwIGl0IChidXQKICBmaXggdGhlIHByb2JsZW0pIGFzIGl0IG5vdyBhY3R1YWxseSBhbGxvd3MgZm9yIGVhc2llciAoZnV0dXJlKSBjdXN0b21pemF0aW9uCiAgb2YgdGhlIHRpbWVvdXQuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAzNzA1KQoKLSBEb3VnbGFzIEtpbHBhdHJpY2sgZmlsZWQgYnVnIHJlcG9ydCAjMzAwNDc4NyBhbmQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVEZUUAogIGNvZGUgZGlkbid0IGhhbmRsZSBibG9jayBpZCB3cmFwcyBjb3JyZWN0bHkuIEhpcyBzdWdnZXN0ZWQgZml4IGluc3BpcmVkIHRoZQogIGZpeCBJIGNvbW1pdHRlZC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDQ3ODcpCgpEYW5pZWwgU3RlbmJlcmcgKDIwIE1heSAyMDEwKQotIFRhbmd1eSBGYXV0cmUgYnJvdWdodCBhIGZpeCB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIHdpdGggTWljcm9zb2Z0IFZDMTAuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1heSAyMDEwKQotIEVyaWMgTWVydGVucyBwb3N0ZWQgYnVnIHJlcG9ydCAjMzAwMzAwNSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybCBURlRQCiAgY29kZSB3YXMgbm90IHNlbmRpbmcgdGhlIHRpbWVvdXQgb3B0aW9uIHByb3Blcmx5IHRvIHRoZSBzZXJ2ZXIsIGFuZAogIHN1Z2dlc3RlZCBhIGZpeC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDMwMDUpCgpLYW1pbCBEdWRrYSAoMTYgTWF5IDIwMTApCi0gUGF2ZWwgUmFpc2t1cCBpbnRyb2R1Y2VkIGEgbmV3IG9wdGlvbiBDVVJMT1BUX0ZOTUFUQ0hfREFUQSBpbiBvcmRlciB0byBwYXNzCiAgYSBjdXN0b20gZGF0YSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBzcGVjaWZpZWQgYnkgQ1VSTE9QVF9GTk1BVENIX0ZVTkNUSU9OLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBNYXkgMjAxMCkKLSBKb2huLU1hcmsgQmVsbCBmaWxlZCBidWcgIzMwMDAwNTIgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbSAod2l0aCBhbgogIGFzc29jaWF0ZWQgcGF0Y2gpIHdpdGggdGhlIE9wZW5TU0wgaGFuZHNoYWtlIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGUgbXVsdGkKICBpbnRlcmZhY2UgaXMgdXNlZDoKCiAgUGVyZm9ybWluZyBhbiBodHRwcyByZXF1ZXN0IHVzaW5nIGEgY3VybCBtdWx0aSBoYW5kbGUgYW5kIHVzaW5nIHNlbGVjdCBvcgogIGVwb2xsIHRvIHdhaXQgZm9yIGV2ZW50cyByZXN1bHRzIGluIGEgaGFuZy4gSXQgYXBwZWFycyB0aGF0IHRoZSBjYXVzZSBpcyB0aGUKICBmaXggZm9yIGJ1ZyAjMjk1ODE3OSwgd2hpY2ggbWFrZXMgb3NzbF9jb25uZWN0X2NvbW1vbiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuCiAgZnJvbSB0aGUgc3RlcCAyIGxvb3Agd2hlbiBmZXRjaGluZyBmcm9tIGEgbXVsdGkgaGFuZGxlLgoKICBXaGVuIG9zc2xfY29ubmVjdF9zdGVwMiBoYXMgY29tcGxldGVkLCBpdCB1cGRhdGVzIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUKICB0byBzc2xfY29ubmVjdF8zLiBvc3NsX2Nvbm5lY3RfY29tbW9uIHdpbGwgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgYXMgYQogIG11bHRpIGhhbmRsZSBpcyBpbiB1c2UuIEV2ZW50dWFsbHksIHRoZSBjbGllbnQgY29kZSB3aWxsIGNhbGwKICBjdXJsX211bHRpX2Zkc2V0IHRvIG9idGFpbiBhbiB1cGRhdGVkIGZkc2V0IHRvIHNlbGVjdCBvciBlcG9sbCBvbi4gRm9yIGh0dHBzCiAgcmVxdWVzdHMsIGN1cmxfbXVsdGlfZmRzZXQgd2lsbCBjYXVzZSBodHRwc19nZXRzb2NrIHRvIGJlIGNhbGxlZC4KICBodHRwc19nZXRzb2NrIHdpbGwgb25seSByZXR1cm4gYSBzb2NrZXQgaGFuZGxlIGlmIHRoZSBjb25uZWN0aW5nX3N0YXRlIGlzCiAgc3NsX2Nvbm5lY3RfMl9yZWFkaW5nIG9yIHNzbF9jb25uZWN0XzJfd3JpdGluZy4gIFRoZXJlZm9yZSwgdGhlIGNsaWVudCB3aWxsCiAgbmV2ZXIgb2J0YWluIGEgdmFsaWQgZmRzZXQsIGFuZCB0aHVzIG5vdCBkcml2ZSB0aGUgbXVsdGkgaGFuZGxlLCByZXN1bHRpbmcKICBpbiBhIGhhbmcuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAwMDUyKQoKLSBTZWJhc3RpYW4gViByZXBvcnRlZCBidWcgIzMwMDAwNTYgaWRlbnRpZnlpbmcgYSBwcm9ibGVtIHdpdGggcmVkaXJlY3QKICBmb2xsb3dpbmcuIEl0IHNob3dlZCB0aGF0IHdoZW4gY3VybCBmb2xsb3dlZCByZWRpcmVjdHMgaXQgZGlkbid0IHByb3Blcmx5CiAgaWdub3JlIHRoZSByZXNwb25zZSBib2R5IG9mIHRoZSAzMFggcmVzcG9uc2UgaWYgdGhhdCByZXNwb25zZSB3YXMgdXNpbmcKICBjb21wcmVzc2VkIENvbnRlbnQtRW5jb2RpbmchCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAwMDU2KQogIApEYW5pZWwgU3RlbmJlcmcgKDEyIE1heSAyMDEwKQotIEhvd2FyZCBDaHUgYnJvdWdodCBzdXBwb3J0IGZvciBSVE1QLiBUaGlzIGlzIHBvd2VyZWQgYnkgdGhlIHVuZGVybHlpbmcKICBsaWJydG1wIGxpYnJhcnkuIEl0IHN1cHBvcnRzIGEgcmFuZ2Ugb2YgdmFyaWF0aW9ucyBhbmQgInN1Yi1wcm90b2NvbHMiCiAgd2l0aGluIHRoZSBSVE1QIGZhbWlseS4KCi0gUGF2ZWwgUmFpc2t1cCBicm91Z2h0IHN1cHBvcnQgZm9yIEZUUCBkaXJlY3Rvcnkgd2lsZGNhcmQgbWF0Y2hpbmcgdG8gYWxsb3cKICBzZWxlY3RpdmUgZG93bmxvYWRpbmcuIFRvIHByb3ZpZGUgdGhhdCwgYSBzZXQgb2YgbmV3IG9wdGlvbnMgd2VyZSBhZGRlZDoKCiAgIENVUkxPUFRfV0lMRENBUkRNQVRDSAogICBDVVJMT1BUX0NIVU5LX0JHTl9GVU5DVElPTgogICBDVVJMT1BUX0NIVU5LX0VORF9GVU5DVElPTgogICBDVVJMT1BUX0NIVU5LX0RBVEEKICAgQ1VSTE9QVF9GTk1BVENIX0ZVTkNUSU9OCgogIFRoZXJlIHdlcmUgYWxzbyBhIHNldCBvZiBuZXcgdGVzdHMgYWRkZWQgKDU3NCAtIDU3NykgdG8gdmVyaWZ5IHRoaXMuCgpLYW1pbCBEdWRrYSAoMTEgTWF5IDIwMTApCi0gQ1JMIHN1cHBvcnQgaW4gbGliY3VybC1OU1MgaGFzIGJlZW4gY29tcGxldGVseSBicm9rZW4uIE5vdyBpdCB3b3Jrcy4gT3JpZ2luYWwKICBidWcgcmVwb3J0OiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vNTgxOTI2CgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMTApCi0gRGlyayBNYW5za2UgcmVwb3J0ZWQgYSByZWdyZXNzaW9uLiBXaGVuIGNvbm5lY3Rpbmcgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLAogIHRoZXJlIHdlcmUgc2l0dWF0aW9ucyB3aGVyZSBsaWJjdXJsIHdvdWxkbid0IHN0b3JlIGNvbm5lY3QgdGltZSBjb3JyZWN0bHkgYXMKICBpdCB1c2VkIHRvIChhbmQgaXMgZG9jdW1lbnRlZCB0bykgZG8uCgogIFVzaW5nIGhpcyBmaW5lIHNhbXBsZSBwcm9ncmFtIHdlIGNvdWxkIHJlcGVhdCBpdCwgYW5kIEkgd3JvdGUgdXAgdGVzdCBjYXNlCiAgNTczIHVzaW5nIHRoYXQgY29kZS4gVGhlIHByb2JsZW0gZG9lcyBub3QgZWFzaWx5IHNob3cgaXRzZWxmIHVzaW5nIHRoZSBsb2NhbAogIHRlc3Qgc3VpdGUgdGhvdWdoLgoKICBUaGUgZml4LCBhbHNvIGFzIHN1Z2dlc3RlZCBieSBEaXJrLCBpcyBhIGJpdCBvbiB0aGUgdWdseSBzaWRlIGFzIGl0IGFkZHMgeWV0CiAgYW5vdGhlciBjYWxsIHRvIEN1cmxfdmVyYm9zZWNvbm5lY3QoKSBhbmQgc2V0dGluZyB0aGUgVElNRVJfQ09OTkVDVCB0aW1lLgogIFRoYXQgc2l0dWF0aW9uIGlzIHN1YmplY3QgZm9yIHNvbWUgY2xvc2VyIGluc3BlY3Rpb24gaW4gdGhlIGZ1dHVyZS4KCi0gSG93YXJkIENodSBzcGxpdCB0aGUgSS9PIGhhbmRsaW5nIGZ1bmN0aW9ucyBpbnRvIHByaXZhdGUgaGFuZGxlcnMuCiAgICAKICBIb3dhcmQgQ2h1IGJyb3VnaHQgdGhlIGJ1bGsgd29yayBvZiB0aGlzIHBhdGNoIHRoYXQgcHJvcGVybHkgbW92ZXMgb3V0IHRoZQogIHNlbmRpbmcgYW5kIHJlY3Zpbmcgb2YgZGF0YSB0byB0aGUgcGFydHMgb2YgdGhlIGNvZGUgdGhhdCBhcmUgcHJvcGVybHkKICByZXNwb25zaWJsZSBmb3IgdGhlIHZhcmlvdXMgd2F5cyBvZiBkb2luZyBzby4KICAKICBEYW5pZWwgU3RlbmJlcmcgYXNzaXN0ZWQgd2l0aCBwb2xpc2hpbmcgYSBmZXcgYml0cyBhbmQgZml4ZWQgc29tZSBtaW5vcgogIGZsYXdzIGluIHRoZSBvcmlnaW5hbCBwYXRjaC4KICAKICBBbm90aGVyIHVwc2lkZSBvZiB0aGlzIHBhdGNoIGlzIHRoYXQgd2Ugbm93IGFidXNlIENVUkxjb2RlcyBsZXNzIHdpdGggdGhlCiAgIm1hZ2ljIiAtMSByZXR1cm4gY29kZXMgYW5kIGluc3RlYWQgdXNlIENVUkxFX0FHQUlOIG1vcmUgY29uc2lzdGVudGx5LgoKRGFuaWVsIFN0ZW5iZXJnICg1IE1heSAyMDEwKQotIEhvaS1IbyBDaGFuIGludHJvZHVjZWQgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIFBvbGFyU1NMIGxpYnJhcnkuIFlvdSBjb250cm9sCiAgdGhpcyB3aXRoIHRoZSBuZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcG9sYXJzc2wuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEFwciAyMDEwKQotIEJlbiBHcmVlYXIgbWFkZSB0ZWxuZXQgYSBsb3QgYmV0dGVyL2Vhc2llciB0byB1c2UgYnkgYW4gYXBwbGljYXRpb246CgogIFRoZSBtYWluIGNoYW5nZSBpcyB0byBhbGxvdyBpbnB1dCBmcm9tIHVzZXItc3BlY2lmaWVkIG1ldGhvZHMsIHdoZW4gdGhleSBhcmUKICBzcGVjaWZpZWQgd2l0aCBDVVJMT1BUX1JFQURGVU5DVElPTi4gIEFsbCBjYWxscyB0byBmZmx1c2goc3Rkb3V0KSBpbgogIHRlbG5ldC5jIHdlcmUgcmVtb3ZlZCwgd2hpY2ggbWFrZXMgdXNpbmcgJ2N1cmwgdGVsbmV0Oi8vZm9vLmNvbScgcGFpbmZ1bAogIHNpbmNlIHByb21wdHMgYW5kIG90aGVyIGRhdGEgYXJlIG5vdCBhbHdheXMgcmV0dXJuZWQgdG8gdGhlIHVzZXIgcHJvbXB0bHkuCiAgVXNlICdjdXJsIC0tbm8tYnVmZmVyIHRlbG5ldDovL2Zvby5jb20nIGluc3RlYWQuICBJbiBnZW5lcmFsLCB0aGUgdXNlcgogIHNob3VsZCBoYXZlIHRoZWlyIENVUkxPUFRfV1JJVEVGVU5DVElPTiBkbyBhIGZmbHVzaCBmb3IgaW50ZXJhY3RpdmUgdXNlLgoKICBBbHNvIGZpeCBhc3N1bXB0aW9uIHRoYXQgcmVhZGluZyBmcm9tIHN0ZGluIG5ldmVyIHJldHVybnMgPCAwLgogIE9sZCBjb2RlIGNvdWxkIGNyYXNoIGluIHRoYXQgY2FzZS4KCiAgQ2FsbCBwcm9ncmVzcyBmdW5jdGlvbnMgaW4gdGVsbmV0IG1haW4gbG9vcC4KCkRhbmllbCBTdGVuYmVyZyAoMjYgQXByIDIwMTApCi0gTWFrZSB1c2Ugb2YgdGhlIGxpYnNzaDJfaW5pdC9leGl0IGZ1bmN0aW9ucyB0aGF0IGxpYnNzaDIgYWRkZWQgaW4gdmVyc2lvbgogIDEuMi41LiBVc2luZyB0aGVtIHdpbGwgaW1wcm92ZSBob3cgbGliY3VybCB3b3JrcyBpbiB0aHJlYWRlZCBzaXR1YXRpb25zIHdoZW4KICBTQ1AgYW5kIFNGVFAgYXJlIHRyYW5zZmVyZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IEFwciAyMDEwKQotIEJhc2VkIG9uIHdvcmsgYnkgS2FtaWwgRHVka2EsIEkndmUgaW50cm9kdWNlZCB0aGUgbmV3IGNvbmZpZ3VyZSBvcHRpb24KICAtLWVuYWJsZS10aHJlYWRlZC1yZXNvbHZlci4gV2hlbiB1c2VkLCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGNoZWNrIGZvcgogIHB0aHJlYWRzIGFuZCBpZiBhcm91bmQsIGl0IHdpbGwgYnVpbGQgbGliY3VybCB0byB1c2UgcHRocmVhZHMgdG8gZG8gbmFtZQogIHJlc29sdmluZyBpbiBhIHRocmVhZGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoaXMgaXMganVzdCBhIGZpeCB0byBvZmZlciBhbgogIG9wdGlvbiB0aGF0IGNhbiBlbmFibGUgdGhlIGNvZGUgdGhhdCBhbHJlYWR5IGluY2x1ZGVkLiBUaGUgdGhyZWFkZXIgcmVzb2x2ZXIKICBjb2RlIHdhcyBtb3N0bHkgYWRkZWQgb24gSmFuIDI2IDIwMTAuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEFwciAyMDEwKQotIEFsZXggQmxpZ2ggaW50cm9kdWNlZCB0aGUgLS1wcm90byBhbmQgLXByb3RvLXJlZGlyIG9wdGlvbnMgdGhhdCBsaW1pdCB3aGF0CiAgcHJvdG9jb2xzIGN1cmwgYWNjZXB0cyBmb3IgdGhlIHJlcXVlc3RzIGFuZCB3aGVuIGZvbGxvd2luZyByZWRpcmVjdHMuCgpLYW1pbCBEdWRrYSAoMjQgQXByIDIwMTApCi0gRml4ZWQgdGVzdDUzNiBpbiBvcmRlciB0byBub3QgZmFpbCB3aXRoIHRocmVhZGVkIEROUyByZXNvbHZlciBhbmQgdHdlYWtlZAogIGNvbW1lbnRzIGluIGNlcnRhaW4gZXhhbXBsZXMgdXNpbmcgY3VybF9tdWx0aV9mZHNldCgpLgoKLSBGaXhlZCBTU0wgaGFuZHNoYWtlIHRpbWVvdXQgdW5kZXJmbG93IGluIGxpYmN1cmwtTlNTLCB3aGljaCBjYXVzZWQgdGVzdDQwNQogIHRvIGhhbmcgb24gYSBzbG93IG1hY2hpbmUuCgpEYW5pZWwgU3RlbmJlcmcgKDIxIEFwciAyMDEwKQotIFRoZSAtTyBvcHRpb24gY2F1c2VkIGN1cmwgdG8gY3Jhc2ggb24gd2luZG93cyBhbmQgRE9TIGR1ZSB0byB0aGUgdG9vbAogIHdyaXRpbmcgb3V0IG9mIGJvdW5kYXJ5IG1lbW9yeS4KCllhbmcgVHNlICgyMCBBcHIgMjAxMCkKLSBSdXNsYW4gR2F6aXpvdiBkZXRlY3RlZCB0aGF0IE1TVkMgbWFrZWZpbGVzIHdlcmUgdXNpbmcgd3NvY2szMi5saWIgaW5zdGVhZAogIG9mIHdzMl8zMi5saWIsIHRoaXMgZ2VuZXJhdGVkIGxpbmtpbmcgaXNzdWVzIG9uIE1TVkMgSVB2NiBlbmFibGVkIGJ1aWxkcwogIHRoYXQgd2VyZSBkb25lIHVzaW5nIHRob3NlIG1ha2VmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMTkgQXByIDIwMTApCi0gLUovLS1yZW1vdGUtaGVhZGVyLW5hbWUgZGlkbid0IHN0cmlwIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybnMgb3IgbGluZWZlZWRzCiAgcHJvcGVybHksIHNvIHRoZXkgY291bGQgYmUgdXNlZCBpbiB0aGUgZmlsZSBuYW1lLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBBcHIgMjAxMCkKLSBKZXJvbWUgVm91aWxsb24gbWFkZSB0aGUgR251VExTIFNTTCBoYW5kc2hha2UgcGhhc2Ugbm9uLWJsb2NraW5nLgoKLSBUaGUgcmVjZW50IG92ZXJoYXVsIG9mIHRoZSBTU0wgcmVjdiBmdW5jdGlvbiBtYWRlIHRoZSBHbnVUTFMgc3BlY2lmaWMgY29kZQogIHRyZWF0IGEgemVybyByZXR1cm5lZCBmcm9tIGdudXRsc19yZWNvcmRfcmVjdigpIGFzIGFuIGVycm9yLCBhbmQgdGhpcyBjYXVzZWQKICBvdXIgSFRUUFMgdGVzdCBjYXNlcyB0byBmYWlsLiBXZSBsZWF2ZSBpdCB0byB1cHBlciBsYXllciBjb2RlIHRvIGRldGVjdCBpZgogIGFuIEVPRiBpcyBhIHByb2JsZW0gb3Igbm90LgoKLSBJIHJldmVydGVkIHRoZSByZXNvbHZlciBmaXggZnJvbSB5ZXN0ZXJkYXkgYW5kIGluc3RlYWQgcmVtb3ZlZCBhbGwgdXNlcyBvZgogIEFJX0NBTk9OTkFNRSBhbGwgb3ZlciBsaWJjdXJsIGFuZCBtYWRlIHRoZSBvbmx5IHVzZXIgb2YgdGhhdCBpbmZvIChrcmI1LmMpCiAgdXNlIHRoZSBob3N0IG5hbWUgZnJvbSB0aGUgVVJMIGluc3RlYWQuIE5vIHJldmVyc2UgcmVzb2x2aW5nIGlzIGEgZ29vZAogIHRoaW5nLgoKLSBQYXVsIEhvd2FydGggbWFkZSBjb25maWd1cmUgcHJvcGVybHkgZGV0ZWN0IEdTUyAib24gYW5jaWVudCBMaW51eCBkaXN0cm9zIgogIGJ5IGVkaXRpbmcgaW4gd2hpY2ggb3JkZXIgd2UgdXNlIGhlYWRlcnMgdG8gZGV0ZWN0IEdTUy4KCkRhbmllbCBTdGVuYmVyZyAoMTUgQXByIDIwMTApCi0gUmFpbmVyIENhbmF2YW4gZmlsZWQgYnVnIHJlcG9ydCAjMjk4NzE5NiB0aGF0IGlkZW50aWZpZWQgbGliY3VybCBkb2luZwogIHVubmVjZXNhcnkgcmV2ZXJzZSBuYW1lIGxvb2t1cHMgaW4gbWFueSBjYXNlcyB3aGVuIGJ1aWx0IHRvIHVzZSBJUHY0IGFuZAogIGdldGFkZHJpbmZvKCkuIFRoZSBsb2dpYyBmb3IgaXB2NiBpcyBub3cgdXNlZCBmb3IgaXB2NCB0b28uCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTYzNjc5KQoKVmVyc2lvbiA3LjIwLjEgKDE0IEFwcmlsIDIwMTApCgpEYW5pZWwgU3RlbmJlcmcgKDkgQXByIDIwMTApCi0gUHJlZml4aW5nIHRoZSBGVFAgcXVvdGUgY29tbWFuZHMgd2l0aCBhbiBhc3RlcmlzayByZWFsbHkgb25seSB3b3JrZWQgZm9yIHRoZQogIHBvc3RxdW90ZSBhY3Rpb25zLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDIyNyBoYXMgYmVlbiBleHRlbmRlZCB0bwogIHZlcmlmeS4KCkthbWlsIER1ZGthICg0IEFwciAyMDEwKQotIEVsaW1pbmF0ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiBDdXJsX3Jlc29sdl90aW1lb3V0KCkuCgotIFJlZmFjdG9yaXplZCBpbnRlcmZhY2Ugb2YgQ3VybF9zc2xfcmVjdigpL0N1cmxfc3NsX3NlbmQoKS4KCi0gbGliY3VybC1OU1Mgbm93IHByb3ZpZGVzIG1vcmUgYWNjdXJhdGUgbWVzc2FnZXMgYW5kIGVycm9yIGNvZGVzIGluIGNhc2Ugb2YKICBjbGllbnQgY2VydGlmaWNhdGUgcHJvYmxlbS4gIEVpdGhlciBkdXJpbmcgY29ubmVjdGlvbiwgb3IgdHJhbnNmZXIgcGhhc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEgQXByIDIwMTApCi0gTWF0dCBXaXhzb24gZm91bmQgYW5kIGZpeGVkIGEgYnVnIGluIHRoZSBTQ1AvU0ZUUCBhcmVhIHdoZXJlIHRoZSBjb2RlCiAgdHJlYXRlZCBhIDAgcmV0dXJuIGNvZGUgZnJvbSBsaWJzc2gyIHRvIGJlIHRoZSBzYW1lIGFzIEVBR0FJTiB3aGlsZSBpbgogIHJlYWxpdHkgaXQgaXNuJ3QuIFRoZSBwcm9ibGVtIGNhdXNlZCBhIGhhbmcgaW4gU0ZUUCB0cmFuc2ZlcnMgZnJvbSBhCiAgTWVzc2FnZVdheSBzZXJ2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1hciAyMDEwKQotIEJlbiBHcmVlYXI6IElmIHlvdSBwYXNzIGEgVVJMIHRvIHBvcDMgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgbWVzc2FnZSBJRCBhcwogIHBhcnQgb2YgdGhlIFVSTCwgaXQgd291bGQgcHJldmlvdXNseSBhc2sgZm9yICdJTkJPWCcgd2hpY2gganVzdCBjYXVzZXMgdGhlCiAgcG9wMyBzZXJ2ZXIgdG8gcmV0dXJuIGFuIGVycm9yLgogICAgCiAgTm93IGxpYmN1cmwgdHJlYXRzIGVuIGVtcHR5IG1lc3NhZ2UgSUQgYXMgYSByZXF1ZXN0IGZvciBMSVNUIChsaXN0IG9mIHBvcDMKICBtZXNzYWdlIElEcykuICBVc2VyJ3MgY29kZSBjb3VsZCB0aGVuIHBhcnNlIHRoaXMgYW5kIGRvd25sb2FkIGluZGl2aWR1YWwKICBtZXNzYWdlcyBhcyBkZXNpcmVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGZyb20gbm93IG9uIGFsbG93cyBhbGwgcHJvdG9jb2xzIHRvIHNwZWNpZnkKICBuYW1lIGFuZCB1c2VyIHdpdGhpbiB0aGUgVVJMLCBpbiB0aGUgc2FtZSBtYW5uZXIgSFRUUCBhbmQgRlRQIGhhdmUgYmVlbgogIGFsbG93ZWQgdG8gaW4gdGhlIHBhc3QgLSBhbHRob3VnaCBmYXIgZnJvbSBhbGwgb2YgdGhlIGxpYmN1cmwgc3VwcG9ydGVkCiAgcHJvdG9jbHMgYWN0dWFsbHkgaGF2ZSB0aGF0IGZlYXR1cmUgaW4gdGhlaXIgVVJMIGRlZmluaXRpb24gc3BlYy4KCkRhbmllbCBTdGVuYmVyZyAoMjYgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBicm91Z2h0IGNvZGUgdGhhdCBtYWtlcyB0aGUgcmF0ZSBsaW1pdGluZyBjb2RlIGZvciB0aGUgZWFzeQogIGludGVyZmFjZSBhIGJpdCBzbW9vdGhlciBhcyBpdCBpbnRyb2R1Y2VzIHN1Yi1zZWNvbmQgc2xlZXBzIGR1cmluZyBpdCBhbmQgaXQKICBhbHNvIHRha2VzIHRoZSBidWZmZXIgc2l6ZXMgaW50byBhY2NvdW50LgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBNYXIgMjAxMCkKLSBCb2IgUmljaG1vbmQ6IFRoZXJlJ3MgYW4gYW5ub3lpbmcgc2l0dWF0aW9uIHdoZXJlIGxpYmN1cmwgd2lsbCByZWFkIG5ldyBIVFRQCiAgcmVzcG9uc2UgZGF0YSBmcm9tIGEgc29ja2V0LCB0aGVuIGNoZWNrIGlmIGl0J3MgYSB0aW1lb3V0IGlmIG9uZSBpcyBzZXQuIElmCiAgdGhlIGxhc3QgcGFja2V0IHJlY2VpdmVkIGNvbnN0aXR1dGVzIHRoZSBlbmQgb2YgdGhlIHJlc3BvbnNlIGJvZHksIGxpYmN1cmwKICBzdGlsbCB0cmVhdHMgaXQgYXMgYSB0aW1lb3V0IGNvbmRpdGlvbiBhbmQgcmVwb3J0cyBhIG1lc3NhZ2UgbGlrZToKCiAgIk9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIgMzAwMCBtaWxsaXNlY29uZHMgd2l0aCA4NzYgb3V0IG9mIDg3NiBieXRlcyAKICByZWNlaXZlZCIKCiAgSXQgc2hvdWxkIG9ubHkgYSB0aW1lb3V0IGlmIHRoZSB0aW1lciBsYXBzZWQgYW5kIHdlIERJRE4nVCByZWNlaXZlIHRoZSBlbmQKICBvZiB0aGUgcmVzcG9uc2UgYm9keSB5ZXQuCgotIENocmlzdG9waGVyIENvbnJveSBmaXhlZCBhIHByb2JsZW0gd2l0aCBSVFNQIGFuZCBHRVRfUEFSQU1FVEVSIHJlcG9ydGVkCiAgdG8gdXMgYnkgTWFzc2ltbyBDYWxsZWdhcmkuIFRoZXJlJ3MgYSBuZXcgdGVzdCBjYXNlIDU3MiB0aGF0IHZlcmlmaWVzIHRoaXMKICBub3cuCgotIFRoZSAnYXJlcycgc3VidHJlZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNvdXJjZSByZXBvc2l0b3J5LiBJdCB3YXMKICBhbHdheXMgYSBzZXBhcmF0ZSBwcm9qZWN0IHRoYXQgc29ydCBvZiBwaWdneWJhY2tlZCBvbiB0aGUgY3VybCBwcm9qZWN0IHNpbmNlCiAgdGhlIGRhd24gb2YgdGltZXMgYW5kIG5vdyB0aGUgdGltZSBoYXMgY29tZSBmb3IgaXQgdG8gZ28gc3RhbmQgb24gaXRzIG93bgogIGxlZ3MgYW5kIGNvbnRpbnVlIGxpdmluZyBpdHMgb3duIGxpZmUuIEFsbCBkZXRhaWxzIG9uIGMtYXJlcyBhbmQgaXRzIG5ldwogIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgaXMgZm91bmQgYXQgaHR0cDovL2MtYXJlcy5oYXh4LnNlLwoKRGFuaWVsIFN0ZW5iZXJnICgyMyBNYXIgMjAxMCkKLSBLZW5ueSBUbyBmaWxlZCB0aGUgYnVnIHJlcG9ydCAjMjk2MzY3OSB3aXRoIHBhdGNoIHRvIGZpeCBhIHByb2JsZW0gaGUKICBleHBlcmllbmNlZCB3aXRoIGRvaW5nIG11bHRpIGludGVyZmFjZSBIVFRQIFBPU1Qgb3ZlciBhIHByb3h5IHVzaW5nCiAgUFJPWFlUVU5ORUwuIEhlIGZvdW5kIGEgY2FzZSB3aGVyZSBpdCB3b3VsZCBjb25uZWN0IGZpbmUgYnV0IGJpdHMudGNwY29ubmVjdAogIHdhcyBub3Qgc2V0IGNvcnJlY3Qgc28gbGliY3VybCBkaWRuJ3Qgd29yayBwcm9wZXJseS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjM2NzkpCgotIEFrb3MgUGFzenRvcnkgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzU3MjI3NgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz01NzIyNzYgbWVudGlvbmluZyBhIHByb2JsZW0KICB3aXRoIGEgcmVzb3VyY2UgdGhhdCByZXR1cm5zIGNodW5rZWQtZW5jb2RlZCBfYW5kXyB3aXRoIGEgQ29udGVudC1MZW5ndGgKICBhbmQgbGliY3VybCBmYWlsZWQgdG8gcHJvcGVybHkgaWdub3JlIHRoZSBsYXR0ZXIgaW5mb3JtYXRpb24uCgotIEhhdWtlIER1ZGVuIHByb3ZpZGVkIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSBjcmFzaC4KICBIaXMgZXhhbXBsZSBzaW1wbHkgdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBkaWQgZmlyc3Qgb25lIEZUUCB0cmFuc2ZlcgogIGFuZCBhZnRlciBjb21wbGV0aW9uIGl0IHVzZWQgYSBzZWNvbmQgZWFzeSBoYW5kbGUgYW5kIGRpZCBhbm90aGVyIEZUUAogIHRyYW5zZmVyIG9uIHRoZSBzYW1lIEZUUCBzZXJ2ZXIuCgogIFRoaXMgdHJpZ2dlcmVkIGEgYnVnIGluIHRoZSAiZGVsYXllZCBlYXN5IGhhbmRsZSBraWxsIiBzeXN0ZW0gdGhhdCBjdXJsCiAgdXNlczogd2hlbiBhbiBGVFAgY29ubmVjdGlvbiBpcyBsZWZ0IGFsaXZlIGl0IG11c3Qga2VlcCBhbiBlYXN5IGhhbmRsZQogIGFyb3VuZCBpbnRlcm5hbGx5IC0gb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgaGF2aW5nIGFuIGVhc3kgaGFuZGxlIHdoZW4gaXQKICBsYXRlciBkaXNjb25uZWN0cyBpdC4gVGhlIGNvZGUgYXNzdW1lZCB0aGF0IHdoZW4gdGhlIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkCiAgYW5kIGFuIGludGVybmFsIHJlZmVyZW5jZSB3YXMgbWFkZSwgdGhhdCB2ZXJzaW9uIGNvdWxkIGJlIGtpbGxlZCBsYXRlciBvbgogIHdoZW4gYSBuZXcgZWFzeSBoYW5kbGUgY2FtZSB1c2luZyB0aGUgc2FtZSBjb25uZWN0aW9uLiBUaGlzIHdhcyB3cm9uZyBhcwogIEhhdWtlJ3MgZXhhbXBsZSBzaG93ZWQgdGhhdCB0aGUgcmVtb3ZlZCBoYW5kbGUgd2Fzbid0IGtpbGxlZCBmb3IgcmVhbCB1bnRpbAogIGxhdGVyLiBUaGlzIGNhdXNlZCBhIGRvdWJsZSBjbG9zZSBhdHRlbXB0ID0+IHNlZ2ZhdWx0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAxMCkKLSBUaG9tYXMgTG9wYXRpYyBmaXhlZCB0aGUgYWxhcm0oKS1iYXNlZCBETlMgdGltZW91dDoKCiAgTG9va2luZyBhdCB0aGUgY29kZSBvZiBDdXJsX3Jlc29sdl90aW1lb3V0KCkgaW4gaG9zdGlwLmMsIEkgdGhpbmsgdGhhdCBpbgogIGNhc2Ugb2YgYSB0aW1lb3V0LCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0FMUk0gbmV2ZXIgZ2V0cyByZW1vdmVkLiBJCiAgdGhpbmsgdGhhdCBpbiBteSBjYXNlIGl0IGdldHMgZXhlY3V0ZWQgYXQgc29tZSBwb2ludCBsYXRlciBvbiB3aGVuIGV4ZWN1dGlvbgogIGhhcyBsb25nIGxlZnQgQ3VybF9yZXNvbHZfdGltZW91dCgpIG9yIGV2ZW4gdGhlIGNVUkwgbGlicmFyeS4KICAKICBUaGUgY29kZSB0aGF0IGlzIGp1bXBlZCB0byB3aXRoIHNpZ2xvbmdqbXAoKSBzaW1wbHkgc2V0cyB0aGUgZXJyb3IgbWVzc2FnZQogIHRvICJuYW1lIGxvb2t1cCB0aW1lZCBvdXQiIGFuZCB0aGVuIHJldHVybnMgd2l0aCBDVVJMUkVTT0xWX0VSUk9SLiBJIGd1ZXNzCiAgdGhhdCBpbnN0ZWFkIG9mIHNpbXBseSByZXR1cm5pbmcgd2l0aG91dCBjbGVhbmluZyB1cCwgdGhlIGNvZGUgc2hvdWxkIGhhdmUgYQogIGdvdG8gdGhhdCBqdW1wcyB0byB0aGUgc3BvdCByaWdodCBhZnRlciB0aGUgY2FsbCB0byBDdXJsX3Jlc29sdigpLgoKS2FtaWwgRHVka2EgKDIyIE1hciAyMDEwKQotIERvdWdsYXMgU3RlaW53YW5kIGNvbnRyaWJ1dGVkIGEgcGF0Y2ggZml4aW5nIGluc3VmZmljaWVudCBpbml0aWFsaXphdGlvbiBpbgogIEN1cmxfY2xvbmVfc3NsX2NvbmZpZygpCgpEYW5pZWwgU3RlbmJlcmcgKDIxIE1hciAyMDEwKQotIEJlbiBHcmVlYXIgaW1wcm92ZWQgVEZUUDogdGhlIGVycm9yIGNvZGUgcmV0dXJuaW5nIGFuZCB0aGUgdHJlYXRtZW50CiAgb2YgVFNJWkUgPT0gMCB3aGVuIHVwbG9hZGluZy4KCi0gV2UndmUgc3dpdGNoZWQgZnJvbSBDVlMgdG8gZ2l0LiBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9zb3VyY2UuaHRtbAoKS2FtaWwgRHVka2EgKDE5IE1hciAyMDEwKQotIEltcHJvdmVkIEN1cmxfcmVhZCgpIHRvIG5vdCBpZ25vcmUgdGhlIGVycm9yIHJldHVybmVkIGZyb20gQ3VybF9zc2xfcmVjdigpLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBNYXIgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBicm91Z2h0IGEgcGF0Y2g6CgogIFRoZSBwcm9ibGVtIG1lbnRpb25lZCBvbiBEZWMgMTAgMjAwOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTA1MjIwKSB3YXMgb25seSBwYXJ0aWFsbHkgZml4ZWQuCiAgUGFydGlhbGx5IGJlY2F1c2UgYW4gZWFzeSBoYW5kbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55IGNvbm5lY3Rpb25zIGluCiAgdGhlIGNhY2hlIChlLmcuIGlmIHRoZXJlIGlzIGEgcmVkaXJlY3QgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgZWFzeQogIGhhbmRsZSkuICBUaGUgcHJldmlvdXMgcGF0Y2ggb25seSBjbGVhbmVkIHVwIHRoZSBmaXJzdCBvbmUuIFRoZSBuZXcgZml4IG5vdwogIHJlbW92ZXMgdGhlIGVhc3kgaGFuZGxlIGZyb20gYWxsIGNvbm5lY3Rpb25zLCBub3QganVzdCB0aGUgZmlyc3Qgb25lLgoKRGFuaWVsIFN0ZW5iZXJnICg2IE1hciAyMDEwKQotIEJlbiBHcmVlYXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHJhdGUgbGltaXRpbmcgbG9naWMgZm9yIFRGVFAgd2hlbgogIHRoZSBlYXN5IGludGVyZmFjZSB3YXMgdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoNSBNYXIgMjAxMCkKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCB3aXRoIHRoZSBjbGFuZyBjb21waWxlci4KCllhbmcgVHNlICg1IE1hciAyMDEwKQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGRldGVjdGVkIGFuZCBmaXhlZCBhIGRvdWJsZSBmcmVlIGluIGJ1aWxkcyBkb25lCiAgd2l0aCB0aHJlYWRlZCByZXNvbHZlciBlbmFibGVkIChXaW5kb3dzIGRlZmF1bHQgY29uZmlndXJhdGlvbikgdGhhdCB3b3VsZAogIGdldCB0cmlnZ2VyZWQgd2hlbiBhIGN1cmwgaGFuZGxlIGlzIGNsb3NlZCB3aGlsZSBkb2luZyBETlMgcmVzb2x1dGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMiBNYXIgMjAxMCkKLSBbRGFuaWVsIEpvaG5zb25dIEkndmUgYmVlbiB0cnlpbmcgdG8gYnVpbGQgbGliY3VybCB3aXRoIGNsYW5nIG9uIERhcndpbiBhbmQKICByYW4gaW50byBzb21lIGlzc3VlcyB3aXRoIHRoZSBHU1NBUEkgdGVzdHMgaW4gY29uZmlndXJlLmFjLiBUaGUgdGVzdHMgZmlyc3QKICB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBpbmNsdWRlIGRpcnMgYW5kIGxpYnMgYW5kIHNldCBDUFBGTEFHUyBhbmQgTElCUwogIGFjY29yZGluZ2x5LiBJdCB0aGVuIGNoZWNrcyBmb3IgdGhlIGhlYWRlcnMgYW5kIGZpbmFsbHkgc2V0cyBMSUJTIGEgc2Vjb25kCiAgdGltZSwgY2F1c2luZyB0aGUgbGlicyB0byBiZSBpbmNsdWRlZCB0d2ljZS4gVGhlIGZpcnN0IHNldHRpbmcgb2YgTElCUyBzZWVtcwogIHJlZHVuZGFudCBhbmQgc2hvdWxkIGJlIGxlZnQgb3V0LCBzaW5jZSB0aGUgZmlyc3QgcGFydCBpcyBvdGhlcndpc2UganVzdAogIGFib3V0IGZpbmRpbmcgaGVhZGVycy4KCiAgTXkgc2Vjb25kIGlzc3VlIGlzIHRoYXQgJ2tyYjUtY29uZmlnIC0tbGlicyBnc3NhcGknIG9uIERhcndpbiBpcyBsZXNzIHRoYW4KICB1c2VsZXNzIGFuZCByZXR1cm5zIGp1bmsgdGhhdCwgd2hpbGUgaXQgaGFwcGVucyB0byB3b3JrIHdpdGggZ2NjLCBjYXVzZXMKICBjbGFuZyB0byBjaG9rZS4gRm9yIGV4YW1wbGUsIC0tbGlicyByZXR1cm5zICRDRkxBR1MgYWxvbmcgd2l0aCB0aGUgbGlicywKICB3aGljaCBpcyByZWFsbHkgcmV0YXJkZWQuIFNpbXBseSBzZXR0aW5nICdMSUJTPSIkTElCUyAtbGdzc2FwaV9rcmI1CiAgLWxyZXNvbHYiJyBvbiBEYXJ3aW4gaXMgc3VmZmljaWVudC4KCi0gQmFzZWQgb24gcGF0Y2ggcHJvdmlkZWQgYnkgSmFjb2IgTW9zaGVua28sIHRoZSB0cmFuc2ZlciBsb2dpYyBub3cgcHJvcGVybHkKICBtYWtlcyBzdXJlIHRoYXQgd2hlbiB1c2luZyBzdWItc2Vjb25kIHRpbWVvdXRzLCB0aGVyZSdzIG5vIGZpbmFsIGJhZCAxMDAwbXMKICB3YWl0LiBQcmV2aW91c2x5LCBhIHN1Yi1zZWNvbmQgdGltZW91dCB3b3VsZCBvZnRlbiBtYWtlIHRoZSBlbGFwc2VkIHRpbWUgZW5kCiAgdXAgdGhlIHRpbWUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBzZWNvbmQgKGUuZy4gMXMgZm9yIDIwMG1zIHRpbWVvdXQpCgotIEFuZHJlaSBCZW5lYSBmaWxlZCBidWcgcmVwb3J0ICMyOTU2Njk4IGFuZCBwb2ludGVkIG91dCB0aGF0IHRoZQogIENVUkxPUFRfQ0VSVElORk8gZmVhdHVyZSBsZWFrZWQgbWVtb3J5IGR1ZSB0byBhIG1pc3NpbmcgT3BlblNTTCBmdW5jdGlvbgogIGNhbGwuIEhlIHByb3ZpZGVkIHRoZSBwYXRjaCB0byBmaXggaXQgdG9vLgoKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU2Njk4CgotIE1hcmt1cyBEdWZ0IHBvaW50ZWQgb3V0IGluIGJ1ZyAjMjk2MTc5NiB0aGF0IGV2ZW4gdGhvdWdoIEludGVyaXggaGFzIGEKICBwb2xsKCkgZnVuY3Rpb24gaXQgZG9lc24ndCBxdWl0ZSB3b3JrIHRoZSB3YXkgd2Ugd2FudCBpdCBzbyB3ZSBtdXN0IGRpc2FibGUKICBpdCwgYW5kIGhlIGFsc28gcHJvdmlkZWQgYSBwYXRjaCBmb3IgaXQuCgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjE3OTYKCi0gTWFkZSB0aGUgcGluZ3BvbmcgdGltZW91dCBjb2RlIHByb3Blcmx5IGRlYWwgd2l0aCB0aGUgcmVzcG9uc2UgdGltZW91dCBBTkQKICB0aGUgZ2xvYmFsIHRpbWVvdXQgaWYgc2V0LiBBbHNvLCBhcyB3YXMgcmVwb3J0ZWQgaW4gdGhlIGJ1ZyByZXBvcnQgIzI5NTY0MzcKICBieSBSeWFuIENoYW4sIHRoZSB0aW1lIHN0YW1wIHRvIHVzZSBhcyBiYXNpcyBmb3IgdGhlIHBlciBjb21tYW5kIHRpbWVvdXQgd2FzCiAgbm90IHNldCBwcm9wZXJseSBpbiB0aGUgRE9ORSBwaGFzZSBmb3IgRlRQIChhbmQgbm90IGZvciBTTVRQKSBzbyBJIGZpeGVkCiAgdGhhdCBqdXN0IG5vdy4gVGhpcyB3YXMgYSByZWdyZXNzaW9uIGNvbXBhcmVkIHRvIDcuMTkuNyBkdWUgdG8gdGhlCiAgY29udmVyc2lvbiBvZiBGVFAgY29kZSBvdmVyIHRvIHRoZSBnZW5lcmljIHBpbmdwb25nIGNvbmNlcHRzLgoKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU2NDM3CgpEYW5pZWwgU3RlbmJlcmcgKDEgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBwcm92aWRlZCBhbiB1cGRhdGUgZm9yIFRGVFAgdGhhdCBmaXhlcyB1cGxvYWQuCgotIFdlc2xleSBNaWF3IHJlcG9ydGVkIGJ1ZyAjMjk1ODE3OSB3aGljaCBpZGVudGlmaWVkIGEgY2FzZSBvZiBsb29waW5nIGR1cmluZwogIE9wZW5TU0wgYmFzZWQgU1NMIGhhbmRzaGFraW5nIGV2ZW4gdGhvdWdoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQgYW5kCiAgdGhlcmUgd2FzIG5vIGdvb2QgcmVhc29uIGZvciBpdC4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1ODE3OQoKRGFuaWVsIFN0ZW5iZXJnICgyNiBGZWIgMjAxMCkKLSBQYXQgUmF5IGluIGJ1ZyAjMjk1ODQ3NCBwb2ludGVkIG91dCBhbiBvZmYtYnktb25lIGNhc2Ugd2hlbiByZWNlaXZpbmcgYQogIGNodW5rZWQtZW5jb2RpbmcgdHJhaWxlci4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1ODQ3NAoKRGFuaWVsIEZhbmRyaWNoICgyNSBGZWIgMjAxMCkKLSBGaXhlZCBhIGNvdXBsZSBvZiBvdXQgb2YgbWVtb3J5IGxlYWtzIGFuZCBhIHNlZ2ZhdWx0IGluIHRoZSBTTVRQICYgSU1BUCBjb2RlLgoKWWFuZyBUc2UgKDI1IEZlYiAyMDEwKQotIEkgZml4ZWQgYnVnIHJlcG9ydCAjMjk1ODA3NCBpbmRpY2F0aW5nCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTgwNzQpIHRoYXQgY3VybCBvbiBXaW5kb3dzIHdpdGgKICBvcHRpb24gLS10cmFjZS10aW1lIGRpZCBub3QgdXNlIGxvY2FsIHRpbWUgd2hlbiB0aW1lc3RhbXBpbmcgdHJhY2UgbGluZXMuCiAgVGhpcyBjb3VsZCBhbHNvIGhhcHBlbiBvbiBvdGhlciBzeXN0ZW1zIGRlcGVuZGluZyBvbiB0aW1lIHNvdXVyY2UuCgpQYXRyaWNrIE1vbm5lcmF0ICgyMiBGZWIgMjAxMCkKLSBQcm9wZXIgaGFuZGxpbmcgb2YgU1RBUlRUTFMgb24gU01UUCwgdGFraW5nIENVUkxVU0VTU0xfVFJZIGludG8gYWNjb3VudC4KLSBTTVRQIGZhbGxzIGJhY2sgdG8gUkZDODIxIEhFTE8gd2hlbiBFSExPIGZhaWxzIChhbmQgU1NMIGlzIG5vdCByZXF1aXJlZCkuCi0gVXNlIG9mIHRydWUgbG9jYWwgaG9zdCBuYW1lIChpLmUuOiB2aWEgZ2V0aG9zdG5hbWUoKSkgd2hlbiBhdmFpbGFibGUsIGFzCiAgZGVmYXVsdCBhcmd1bWVudCB0byBTTVRQIEhFTE8vRUhMTy4KLSBUZXN0IGNhc2UgODA0IGZvciBIRUxPIGZhbGxiYWNrLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBGZWIgMjAxMCkKLSBGaXhlZCB0aGUgU01UUCBjb21wbGlhbmNlIGJ5IG1ha2luZyBzdXJlIFJDUFQgVE8gYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQKICBwcm9wZXJseSBpbiBhbmdsZSBicmFja2V0cy4gUmVjaXBpZW50cyBwcm92aWRlZCB3aXRoIENVUkxPUFRfTUFJTF9SQ1BUIG5vdwogIGdldCBhbmdsZSBicmFja2V0IHdyYXBwaW5nIGF1dG9tYXRpY2FsbHkgYnkgbGliY3VybCB1bmxlc3MgdGhlIHJlY2lwaWVudAogIHN0YXJ0cyB3aXRoIGFuIGFuZ2xlIGJyYWNrZXQgYXMgdGhlbiB0aGUgYXBwIGlzIGFzc3VtZWQgdG8gZGVhbCB3aXRoIHRoYXQKICBwcm9wZXJseSBvbiBpdHMgb3duLgoKLSBJIG1hZGUgdGhlIFNNVFAgY29kZSBleHBlY3QgYSAyNTAgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlCiAgZnVsbCBEQVRBIGhhcyBiZWVuIHNlbnQsIGFuZCBJIG1vZGlmaWVkIHRoZSB0ZXN0IFNNVFAgc2VydmVyIHRvIGFsc28gc2VuZAogIHRoYXQgcmVzcG9uc2UuIEFzIHVzdWFsLCB0aGUgRE9ORSBvcGVyYXRpb24gdGhhdCBpcyBtYWRlIGFmdGVyIGEgY29tcGxldGVkCiAgdHJhbnNmZXIgaXMgc3RpbGwgbm90IGRvYWJsZSBpbiBhIG5vbi1ibG9ja2luZyB3YXkgc28gdGhpcyB3YWl0aW5nIGZvciAyNTAKICBpcyB1bmZvcnR1bmF0ZWx5IG1hZGUgYmxvY2tpbmdseS4KCllhbmcgVHNlICgxNCBGZWIgMjAxMCkKLSBPdmVyaGF1bGVkIHRlc3Qgc3VpdGUgZ2V0cGFydCgpIGZ1bmN0aW9uLiBGaXhpbmcgcG90ZW50aWFsIG91dCBvZiBib3VuZHMKICBzdGFjayBhbmQgbWVtb3J5IG92ZXJ3cml0ZXMgdHJpZ2dlcmVkIHdpdGggaHVnZSB0ZXN0IGNhc2UgZGVmaW5pdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEZlYiAyMDEwKQotIE1hcnRpbiBIYWdlciByZXBvcnRlZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggYSBtaXNzaW5nIHF1b3RlIGluIGxpYmN1cmwubTQKCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTEzMTkpCgotIFRvbSBEb25vdmFuIGZpeGVkIHRoZSBDVVJMX0ZPUk1BVF8qIGRlZmluZXMgd2hlbiBidWlsZGluZyB3aXRoIGNtYWtlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1MTI2OSkKCkRhbmllbCBTdGVuYmVyZyAoMTIgRmViIDIwMTApCi0gSmFjayBaaGFuZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBTTVRQOiB3ZSB3cm9uZ2x5IHVzZWQgbXVsdGlwbGUgYWRkcmVzc2VzCiAgaW4gdGhlIHNhbWUgUkNQVCBUTyBsaW5lLCB3aGVuIHRoZXkgc2hvdWxkIGJlIHNlbnQgaW4gc2VwYXJhdGUgc2luZ2xlCiAgY29tbWFuZHMuIEkgdXBkYXRlZCB0ZXN0IGNhc2UgODAyIHRvIHZlcmlmeSB0aGlzLgoKLSBJIGFsc28gZml4ZWQgYSBiYWQgdXNlIG9mIG15X3NldG9wdF9zdHIoKSBvZiBDVVJMT1BUX01BSUxfUkNQVCBpbiB0aGUgY3VybAogIHRvb2wgd2hpY2ggbWFkZSBpdCB0cnkgdG8gb3V0cHV0IGl0IGFzIHN0cmluZyBmb3IgdGhlIC0tbGliY3VybCBmZWF0dXJlCiAgd2hpY2ggY291bGQgbGVhZCB0byBjcmFzaGVzLgoKWWFuZyBUc2UgKDExIEZlYiAyMDEwKQotIFN0ZXZlbiBNLiBTY2h3ZWRhIGZpeGVkIFZNUyBidWlsZGVyIGJhZCBiZWhhdmlvciB3aGVuIHVzZWQgaW4gYSBiYXRjaCBqb2IsCiAgcmVtb3ZlZCBvYnNvbGV0ZSBiYXRjaF9jb21waWxlLmNvbSBhbmQgZGVmaW5lcy5jb20gYW5kIHVwZGF0ZWQgVk1TIHJlYWRtZS4KClZlcnNpb24gNy4yMC4wICg5IEZlYnJ1YXJ5IDIwMTApCgpEYW5pZWwgU3RlbmJlcmcgKDkgRmViIDIwMTApCi0gV2hlbiBkb3dubG9hZGluZyBjb21wcmVzc2VkIGNvbnRlbnQgb3ZlciBIVFRQIGFuZCB0aGUgYXBwIGFza2VkIGxpYmN1cmwgdG8KICBhdXRvbWF0aWNhbGx5IHVuY29tcHJlc3MgaXQgd2l0aCB0aGUgQ1VSTE9QVF9FTkNPRElORyBvcHRpb24sIGxpYmN1cmwgY291bGQKICB3cm9uZ2x5IHByb3ZpZGUgdGhlIGNhbGxiYWNrIHdpdGggbW9yZSBkYXRhIHRoYW4gdGhlIG1heGltdW0gZG9jdW1lbnRlZAogIGFtb3VudC4gQW4gYXBwbGljYXRpb24gY291bGQgdGh1cyBnZXQgdHJpY2tlZCBpbnRvIGJhZG5lc3MgaWYgdGhlIG1heGltdW0KICBsaW1pdCB3YXMgdHJ1c3RlZCB0byBiZSBlbmZvcmNlZCBieSBsaWJjdXJsIGl0c2VsZiAoYXMgaXQgaXMgZG9jdW1lbnRlZCkuCgogIFRoaXMgaXMgZnVydGhlciBkZXRhaWxlZCBhbmQgZXhwbGFpbmVkIGluIHRoZSBsaWJjdXJsIHNlY3VyaXR5IGFkdmlzb3J5CiAgMjAxMDAyMDkgYXQKCiAgICBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMTAwMjA5Lmh0bWwKCkRhbmllbCBGYW5kcmljaCAoMyBGZWIgMjAxMCkKLSBDaGFuZ2VkIHRoZSBXYXRjb20gbWFrZWZpbGVzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jIHdpdGgKICBNYWtlZmlsZS5pbmMgc2luY2UgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBkaXJlY3RseS4KCllhbmcgVHNlICgyIEZlYiAyMDEwKQotIFN5bWJvbCBDVVJMX0ZPUk1BVF9PRkZfVCBub3cgb2Jzb2xldGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSwKICBzeW1ib2wgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBDVVJMX05PX09MRElFUyBkZWZpbmVkLiBVc2UKICBvZiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UIGlzIHByZWZlcnJlZCBzaW5jZSA3LjE5LjAKCkRhbmllbCBTdGVuYmVyZyAoMSBGZWIgMjAxMCkKLSBVc2luZyB0aGUgbXVsdGlfc29ja2V0IEFQSSwgaXQgdHVybnMgb3V0IGF0IHRpbWVzIGl0IHNlZW1lZCB0byAiZm9yZ2V0IgogIGNvbm5lY3Rpb25zICh3aGljaCBjYXVzZWQgYSBoYW5nKS4gSXQgdHVybmVkIG91dCB0byBiZSBhbiBleGlzdGluZyAoNy4xOS43KQogIGJ1ZyBpbiBsaWJjdXJsICh0aGF0J3MgYmVlbiBhcm91bmQgZm9yIGEgbG9uZyB0aW1lKSBhbmQgaXQgaGFwcGVuZWQgbGlrZQogIHRoaXM6CgogIFRoZSBhcHAgY2FsbHMgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgdG8gYWRkIGEgbmV3IGVhc3kgaGFuZGxlLCBsaWJjdXJsIHdpbGwKICB0aGVuIHNldCBpdCB0byB0aW1lb3V0IGluIDEgbWlsbGlzZWNvbmQgc28gbGliY3VybCB3aWxsIHRlbGwgdGhlIGFwcCBhYm91dAogIGl0LgoKICBUaGUgYXBwJ3MgdGltZW91dCBmaXJlcyBvZmYgdGhhdCB0aGVyZSdzIGEgdGltZW91dCwgdGhlIGFwcCBjYWxscyBsaWJjdXJsIGFzCiAgd2Ugc28gb2Z0ZW4gZG9jdW1lbnQgaXQ6CgogIGRvIHsKICAgcmVzID0gY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKC4uLiBUSU1FT1VUIC4uLik7CiAgfSB3aGlsZShDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gPT0gcmVzKTsKCiAgQW5kIHRoaXMgaXMgdGhlIHByb2JsZW0gbnVtYmVyIG9uZToKCiAgV2hlbiBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpcyBjYWxsZWQgd2l0aCBubyBzcGVjaWZpYyBoYW5kbGUsIGJ1dCBvbmx5CiAgYSB0aW1lb3V0LWFjdGlvbiwgaXQgd2lsbCAqb25seSogcGVyZm9ybSBhY3Rpb25zIHdpdGhpbiBsaWJjdXJsIHRoYXQgYXJlCiAgbWFya2VkIHRvIHJ1biBhdCB0aGlzIHRpbWUuIEluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3Qgd291bGQgZ28gZnJvbSBJTklUIHRvCiAgQ09OTkVDVCBhbmQgcmV0dXJuIENVUkxNX0NBTExfTVVMVElfUEVSRk9STS4gV2hlbiB0aGUgYXBwIHRoZW4gY2FsbHMgbGliY3VybAogIGFnYWluLCB0aGVyZSdzIG5vIHRpbWVyIHNldCBmb3IgdGhpcyBoYW5kbGUgc28gaXQgcmVtYWlucyBpbiB0aGUgQ09OTkVDVAogIHN0YXRlLiBUaGUgQ09OTkVDVCBzdGF0ZSBpcyBhIHRyYW5zaXRpb25hbCBzdGF0ZSBpbiBsaWJjdXJsIHNvIGl0IHJlcG9ydHMgbm8KICBzb2NrZXRzIHRoZXJlLCBhbmQgdGh1cyBsaWJjdXJsIG5ldmVyIHRlbGxzIHRoZSBhcHAgYW55dGhpbmcgbW9yZSBhYm91dCB0aGF0CiAgZWFzeSBoYW5kbGUvY29ubmVjdGlvbi4KCiAgbGliY3VybCBfZG9lc18gc2V0IGEgMW1zIHRpbWVvdXQgZm9yIHRoZSBoYW5kbGUgYXQgdGhlIGVuZCBvZgogIG11bHRpX3J1bnNpbmdsZSgpIGlmIGl0IHJldHVybnMgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNLCBidXQgc2luY2UgdGhlIGxvb3AKICBpcyBpbnN0YW50IHRoZSBuZXcgam9iIGlzIG5vdCByZWFkeSB0byBydW4gYXQgdGhhdCBwb2ludCAoYW5kIHRoZXJlJ3Mgbm8KICBjb2RlIHRoYXQgbWFrZXMgbGliY3VybCBjYWxsIHRoZSBhcHAgdG8gdXBkYXRlIHRoZSB0aW1vdXQgZm9yIHRoaXMgbmV3CiAgdGltZW91dCkuIEl0IHdpbGwgc2ltcGx5IHJlbHkgb24gdGhhdCBzb21lIG90aGVyIHRpbWVvdXQgd2lsbCB0cmlnZ2VyIGxhdGVyCiAgb24gb3IgdGhhdCBzb21ldGhpbmcgZWxzZSB3aWxsIHVwZGF0ZSB0aGUgdGltZW91dCBjYWxsYmFjay4gVGhpcyBtYWtlcyB0aGUKICBidWcgZmFpcmx5IGhhcmQgdG8gcmVwZWF0LgoKICBUaGUgZml4IG1hZGUgdG8gYWRyZXNzIHRoaXMgaXNzdWU6CgogIFdlIGludHJvZHVjZSBhIGxvb3AgaW4gbGliL211bHRpLmMgYXJvdW5kIGFsbCBjYWxscyB0byBtdWx0aV9ydW5zaW5nbGUoKSBhbmQKICBzaW1wbHkgY2hlY2sgZm9yIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnRlcm5hbGx5LiBUaGlzIGhhcyB0aGUgYWRkZWQKICBiZW5lZml0IHRoYXQgdGhpcyBnb2VzIGluIGxpbmUgd2l0aCBteSBsb25nLXRlcm0gd2lzaGVzIHRvIGdldCByaWQgb2YgdGhlCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGFsbCB0b2dldGhlciBmcm9tIHRoZSBwdWJsaWMgQVBJLgoKICBUaGUgZG93bnNpZGUgb2YgdGhpcyBmaXgsIGlzIHRoYXQgdGhlIGNvdW50ZXIgd2UgcmV0dXJuIGluICdydW5uaW5nX2hhbmRsZXMnCiAgaW4gc2V2ZXJhbCBvZiBvdXIgcHVibGljIGZ1bmN0aW9ucyB0aGVuIGdldHMgYSBzbGlnaHRseSBuZXcgYW5kIHBvc3NpYmx5CiAgY29uZnVzaW5nIGJlaGF2aW9yIGR1cmluZyB0aW1lczoKCiAgSWYgYW4gYXBwIGFkZHMgYSBoYW5kbGUgdGhhdCBmYWlscyB0byBjb25uZWN0ICh2ZXJ5IHF1aWNrbHkpIGl0IG1heSBqdXN0CiAgYXMgd2VsbCBuZXZlciBhcHBlYXIgYXMgYSAncnVubmluZ19oYW5kbGUnIHdpdGggdGhpcyBmaXguIFByZXZpb3VzbHkgaXQKICB3b3VsZCBmaXJzdCBidW1wIHRoZSBjb3VudGVyIG9ubHkgdG8gZ2V0IGl0IGRlY3JlYXNlZCBhZ2FpbiBhdCBuZXh0IGNhbGwuCiAgRXZlbiBJIGhhdmUgdXNlZCB0aGF0IGNoYW5nZSBpbiBoYW5kbGUgY291bnRlciB0byBzaWduYWwgImVuZCBvZiBhCiAgdHJhbnNmZXIiLiBUaGUgb25seSAqZ29vZCogd2F5IHRvIGZpbmQgdGhlIGVuZCBvZiBhIGluZGl2aWR1YWwgdHJhbnNmZXIKICBpcyBjYWxsaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgdG8gc2VlIGlmIGl0IHJldHVybnMgb25lLgoKICBPZiBjb3Vyc2UsIGlmIHRoZSBhcHAgcHJldmlvdXNseSBkaWQgdGhlIGxvb3BpbmcgYmVmb3JlIGl0IGNoZWNrZWQgdGhlCiAgY291bnRlciwgaXQgcmVhbGx5IHNob3VsZG4ndCBiZSBhbnkgbmV3IGVmZmVjdC4KCllhbmcgVHNlICgyNiBKYW4gMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcycgYW5kIEpvc2h1YSBLd2FuJ3Mgd29yayBkb25lIGluIHRoZSBsYXN0IGZvdXIgbW9udGhzCiAgcmVsYXRpdmUgdG8gdGhlIGFzeW5jaHJvbm91cyBETlMgbG9va3VwcywgYWxvbmcgd2l0aCB3aXRoIHNvbWUgaW50ZWdyYXRpb24KICBhZGp1c3RtZW50cyBJIGhhdmUgZG9uZSBhcmUgZmluYWxseSBjb21taXR0ZWQgdG8gQ1ZTLgoKICBDdXJyZW50bHkgdGhlc2UgZW5oYW5jZW1lbnRzIHdpbGwgYmVuZWZpdCBidWlsZHMgZG9uZSB1c2luZyBjLWFyZXMgb24gYW55CiAgcGxhdGZvcm0gYXMgd2VsbCBhcyBXaW5kb3dzIGJ1aWxkcyB1c2luZyB0aGUgZGVmYXVsdCB0aHJlYWRlZCByZXNvbHZlci4KCiAgVGhpcyByZWxlYXNlIGRvZXMgbm90IG1ha2UgZ2VuZXJhbGx5IGF2YWlsYWJsZSBQT1NJWCB0aHJlYWRlZCBETlMgbG9va3VwcwogIHlldC4gVGhlcmUgaXMgbm8gY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgdGhpcyBmZWF0dXJlIHlldC4gSXQgaXMgcG9zc2libGUKICB0byBleHBlcmltYW50YWxseSB0cnkgdGhpcyBmZWF0dXJlIHJ1bm5pbmcgY29uZmlndXJlIHdpdGggY29tcGlsZXIgZmxhZ3MgdGhhdAogIG1ha2Ugc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgcHJlcHJvY2Vzc29yIHN5bWJvbHMgVVNFX1RIUkVBRFNfUE9TSVggYW5kCiAgSEFWRV9QVEhSRUFEX0gsIGFzIHdlbGwgYXMgd2hhdGV2ZXIgcmVlbnRyYW5jeSBjb21waWxlciBmbGFncyBhbmQgbGlua2VyIG9uZXMKICBhcmUgcmVxdWlyZWQgdG8gbGluayBhbmQgcHJvcGVybHkgdXNlIHB0aHJlYWRfKiBmdW5jdGlvbnMgb24gZWFjaCBwbGF0Zm9ybS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMTApCi0gTWlrZSBDcm93ZSBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX0NPVUxETlRfUkVTT0xWRV9QUk9YWSB3aGVuIGl0IGlzIHRoZQogIHByb3h5IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIHdoZW4gdXNpbmcgYy1hcmVzLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW91cgogIHdoZW4gbm90IHVzaW5nIGMtYXJlcy4KCkJq9nJuIFN0ZW5iZXJnICgyMyBKYW4gMjAxMCkKLSBBZGRlZCBhIG5ldyBmbGFnOiAtSi8tLXJlbW90ZS1oZWFkZXItbmFtZS4gVGhpcyBvcHRpb24gdGVsbHMgdGhlCiAgLU8vLS1yZW1vdGUtbmFtZSBvcHRpb24gdG8gdXNlIHRoZSBzZXJ2ZXItc3BlY2lmaWVkIENvbnRlbnQtRGlzcG9zaXRpb24KICBmaWxlbmFtZSBpbnN0ZWFkIG9mIGV4dHJhY3RpbmcgYSBmaWxlbmFtZSBmcm9tIHRoZSBVUkwuCgpEYW5pZWwgU3RlbmJlcmcgKDIxIEphbiAyMDEwKQotIENocmlzIENvbnJveSBicm91Z2h0IHN1cHBvcnQgZm9yIFJUU1AgdHJhbnNmZXJzLCBhbmQgd2l0aCBpdCBjb21lcyA4KCEpIG5ldwogIGxpYmN1cmwgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgd2hhdCB0byBnZXQgYW5kIGhvdyB0byByZWNlaXZlIHBvc3NzaWJseQogIGludGVybGVhdmVkIFJUUCBkYXRhLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKYW4gMjAxMCkKLSBBcyB3YXMgcG9pbnRlZCBvdXQgb24gdGhlIGh0dHAtc3RhdGUgbWFpbGluZyBsaXN0LCB0aGUgb3JkZXIgb2YgY29va2llcyBpbiBhCiAgSFRUUCBDb29raWU6IGhlYWRlciBfbmVlZHNfIHRvIGJlIHNvcnRlZCBvbiB0aGUgcGF0aCBsZW5ndGggaW4gdGhlIGNhc2VzCiAgd2hlcmUgdHdvIGNvb2tpZXMgdXNpbmcgdGhlIHNhbWUgbmFtZSBhcmUgc2V0IG1vcmUgdGhhbiBvbmNlIHVzaW5nCiAgKG92ZXJsYXBwaW5nKSBwYXRocy4gUmVhbGl6aW5nIHRoaXMsIGlkZW50aWNhbGx5IG5hbWVkIGNvb2tpZXMgbXVzdCBiZQogIHNvcnRlZCBjb3JyZWN0bHkuIEJ1dCBkZXRlY3Rpbmcgb25seSBpZGVudGljYWxseSBuYW1lZCBjb29raWVzIGFuZCB0YWtlIGNhcmUKICBvZiB0aGVtIGluZGl2aWR1YWxseSBpcyBoYXJkZXIgdGhhbiBqdXN0IHRvIGJsaW5kbHkgYW5kIHVuY29uZGl0aW9uYWxseSBzb3J0CiAgYWxsIGNvb2tpZXMgYmFzZWQgb24gdGhlaXIgcGF0aCBsZW5ndGhzLiBBbGwgbWFqb3IgYnJvd3NlcnMgYWxzbyBhbHJlYWR5IGRvCiAgdGhpcywgc28gdGhpcyBtYWtlcyBvdXIgYmVoYXZpb3Igb25lIHN0ZXAgY2xvc2VyIHRvIHRoZW0gaW4gdGhlIGNvb2tpZSBhcmVhLgoKICBUZXN0IGNhc2UgOCB3YXMgdGhlIG9ubHkgb25lIHRoYXQgYnJva2UgZHVlIHRvIHRoaXMgY2hhbmdlIGFuZCBJIHVwZGF0ZWQgaXQKICBhY2NvcmRpbmdseS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgSmFuIDIwMTApCi0gRGF2aWQgTWNDcmVlZHkgYnJvdWdodCBhIGZpeCBhbmQgYSBuZXcgdGVzdCBjYXNlICgxMjkpIHRvIG1ha2UgbGliY3VybCB3b3JrCiAgYWdhaW4gd2hlbiBkb3dubG9hZGluZyBmaWxlcyBvdmVyIEZUUCB1c2luZyBBU0NJSSBhbmQgaXQgdHVybnMgb3V0IHRoYXQgdGhlCiAgZmluYWwgc2l6ZSBvZiB0aGUgZmlsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwgc2l6ZSB0aGUgc2VydmVyCiAgcmVwb3J0ZWQuIFRoaXMgaXMgdmVyeSBjb21tb24gc2luY2Ugc2VydmVycyBkb24ndCB0YWtlIHRoZSBuZXdsaW5lCiAgY29udmVyc2lvbnMgaW50byBhY2NvdW50LgoKS2FtaWwgRHVka2EgKDE0IEphbiAyMDEwKQotIFN1cHByZXNzZWQgc2lkZSBlZmZlY3Qgb2YgT3BlblNTTCBjb25maWd1cmUgY2hlY2tzLCB3aGljaCBwcmV2ZW50ZWQgTlNTIGZyb20KICBiZWluZyBwcm9wZXJseSBkZXRlY3RlZCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuIEl0IGhhZCBiZWVuIGNhdXNlZCBieQogIHN0cmFuZ2UgYmVoYXZpb3Igb2YgcGtnLWNvbmZpZyB3aGVuIGhhbmRsaW5nIFBLR19DT05GSUdfTElCRElSLiBwa2ctY29uZmlnCiAgZGlzdGluZ3Vpc2hlcyBhbW9uZyBlbXB0eSBhbmQgbm9uLWV4aXN0ZW50IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoYXQgY2FzZS4KCkRhbmllbCBTdGVuYmVyZyAoMTIgSmFuIDIwMTApCi0gR2lsIFdlYmVyIHJlcG9ydGVkIGEgcGVjdWxpYXIgZmxhdyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBkb2luZyBTRlRQCiAgdHJhbnNmZXJzOiBjdXJsX211bHRpX2Zkc2V0KCkgd291bGQgcmV0dXJuIC0xIGFuZCBub3Qgc2V0IGFuZCBmaWxlCiAgZGVzY3JpcHRvcnMgc2V2ZXJhbCB0aW1lcyBkdXJpbmcgYSB0cmFuc2ZlciBvZiBhIHNpbmdsZSBmaWxlLiBJdCB0dXJuZWQgb3V0CiAgdG8gYmUgZHVlIHRvIHR3byBkaWZmZXJlbnQgZmxhd3Mgbm93IGZpeGVkLiBHaWwncyBleGNlbGxlbnQgcmVjaXBlIGhlbHBlZCBtZQogIG5haWwgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDIwMTApCi0gTWFkZSBzdXJlIHRoYXQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGlzIHJlcGVhdGVkbHkgY2FsbGVkIGF0IGEgcmVndWxhcgogIGludGVydmFsIGV2ZW4gZHVyaW5nIHZlcnkgc2xvdyBjb25uZWN0cy4KCi0gVGhlIHRlc3RzL3J1bnRlc3RzLnBsIHNjcmlwdCBub3cgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGVzdCBjYXNlIHRoYXQgcnVucyBpcwogIHByZXNlbnQgaW4gdGhlIHRlc3RzL2RhdGEvTWFrZWZpbGUuYW0gYW5kIG91dHB1dHMgYSBub3RpY2UgbWVzc2FnZSBvbiB0aGUKICBzY3JlZW4gaWYgbm90LiBFYWNoIHRlc3QgZmlsZSBoYXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhhdCBNYWtlZmlsZS5hbSB0byBnZXQKICBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBmb3JnZXR0aW5nIHRvIGFkZCBmaWxlcyB0aGVyZSBpcyBhIGNvbW1vbgogIG1pc3Rha2UuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIGl0IGhhcmRlciB0byBmb3JnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDkgSmFuIDIwMTApCi0gSm9oYW4gdmFuIFNlbHN0IGZvdW5kIGFuZCBmaXhlZCBhIE9wZW5TU0wgc2Vzc2lvbiByZWYgY291bnQgbGVhazoKCiAgb3NzbF9jb25uZWN0X3N0ZXAzKCkgaW5jcmVtZW50cyBhbiBTU0wgc2Vzc2lvbiBoYW5kbGUgcmVmZXJlbmNlIGNvdW50ZXIgb24KICBlYWNoIGNhbGwuIFdoZW4gc2Vzc2lvbnMgYXJlIHJlLXVzZWQgdGhpcyByZWZlcmVuY2UgY291bnRlciBtYXkgYmUKICBpbmNyZW1lbnRlZCBtYW55IHRpbWVzLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZCBvbmx5IG9uY2Ugd2hlbiBkb25lIChieQogIEN1cmxfb3NzbF9zZXNzaW9uX2ZyZWUoKSk7IGFuZCB0aGUgaW50ZXJuYWwgT3BlblNTTCBkYXRhIHdpbGwgbm90IGJlIGZyZWVkCiAgaWYgdGhpcyByZWZlcmVuY2UgY291bnQgcmVtYWlucyBwb3NpdGl2ZS4gV2hlbiBhIHNlc3Npb24gaXMgcmUtdXNlZCB0aGUKICByZWZlcmVuY2UgY291bnRlciBzaG91bGQgYmUgY29ycmVjdGVkIGJ5IGV4cGxpY2l0bHkgY2FsbGluZwogIFNTTF9TRVNTSU9OX2ZyZWUoKSBhZnRlciBlYWNoIGNvbnNlY3V0aXZlIFNTTF9nZXQxX3Nlc3Npb24oKSB0byBhdm9pZAogIGludHJvZHVjaW5nIGEgbWVtb3J5IGxlYWsuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTI2Mjg0KQoKRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAyMDEwKQotIE1ha2Ugc3VyZSB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgZXZlbiBkdXJpbmcgdmVyeSBzbG93CiAgbmFtZSByZXNvbHZlcyB3aGVuIGMtYXJlcyBpcyB1c2VkIGZvciByZXNvbHZpbmcuCgpDbGFlcyBKYWtvYnNzb24gKDYgSmFuIDIwMTApCi0gSnVsaWVuIENoYWZmcmFpeCBmaXhlZCBzbyB0aGF0IHRoZSBmcmFnbWVudCBwYXJ0IGluIGFuIFVSTCBpcyBub3Qgc2VudAogIHRvIHRoZSBzZXJ2ZXIgYW55bW9yZS4KCkthbWlsIER1ZGthICgzIEphbiAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZWxpbWluYXRlZCBhIGR1cGxpY2F0ZWQgaW5pdGlhbGl6YXRpb24gaW4gc2luZ2xlc29ja2V0KCkuCgpEYW5pZWwgU3RlbmJlcmcgKDIgSmFuIDIwMTApCi0gTWFrZSBjdXJsIHN1cHBvcnQgLS1zc2wgYW5kIC0tc3NsLXJlcWQgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgRlRQLXNwZWNpZmljCiAgdmVyc2lvbnMgLS1mdHAtc3NsIGFuZCAtLWZ0cC1zc2wtcmVxZCBhcyB0aGVzZSBvcHRpb25zIGFyZSBub3cgdXNlZCB0bwogIGNvbnRyb2wgU1NML1RMUyBmb3IgSU1BUCwgUE9QMyBhbmQgU01UUCBhcyB3ZWxsIGluIGFkZGl0aW9uIHRvIEZUUC4gVGhlIG9sZAogIG9wdGlvbiBuYW1lcyBhcmUgc3RpbGwgd29ya2luZyBidXQgdGhlIG5ldyBvbmVzIGFyZSB0aGUgb25lcyBsaXN0ZWQgYW5kCiAgZG9jdW1lbnRlZC4KCkRhbmllbCBTdGVuYmVyZyAoMSBKYW4gMjAxMCkKLSBJbmdtYXIgUnVuZ2UgZW5oYW5jZWQgbGliY3VybCdzIEZUUCBlbmdpbmUgdG8gc3VwcG9ydCB0aGUgUFJFVCBjb21tYW5kLiBUaGlzCiAgY29tbWFuZCBpcyBhIHNwZWNpYWwgImhhY2siIHVzZWQgYnkgdGhlIGRyZnRwZCBzZXJ2ZXIsIGJ1dCBldmVuIHRob3VnaCBpdCBpcwogIGEgY3VzdG9tIGV4dGVuc2lvbiBJJ3ZlIGRlZW1lZCBpdCBmaW5lIHRvIGFkZCB0byBsaWJjdXJsIHNpbmNlIHRoaXMgc2VydmVyCiAgc2VlbXMgdG8gc3Vydml2ZSBhbmQgcGVvcGxlIGtlZXAgdXNpbmcgaXQgYW5kIHdhbnQgbGliY3VybCB0byBzdXBwb3J0CiAgaXQuIFRoZSBuZXcgbGliY3VybCBvcHRpb24gaXMgbmFtZWQgQ1VSTE9QVF9GVFBfVVNFX1BSRVQsIGFuZCBpdCBpcyBhbHNvCiAgdXNhYmxlIGZyb20gdGhlIGN1cmwgdG9vbCB3aXRoIC0tZnRwLXByZXQuIFVzaW5nIHRoaXMgb3B0aW9uIG9uIGEgc2VydmVyCiAgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBjb21tYW5kIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwuCgogIEkgYWRkZWQgdGVzdCBjYXNlcyAxMTA3IGFuZCAxMTA4IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCiAgVGhlIFBSRVQgY29tbWFuZCBpcyBkb2N1bWVudGVkIGF0CiAgaHR0cDovL3d3dy5kcmZ0cGQub3JnL2luZGV4LnBocC9EaXN0cmlidXRlZF9QQVNWCgpZYW5nIFRzZSAoMzAgRGVjIDIwMDkpCi0gU3RldmVuIE0uIFNjaHdlZGEgaW1wcm92ZWQgVk1TIGJ1aWxkIHN5c3RlbSwgYW5kIENyYWlnIEEuIEJlcnJ5IGhlbHBlZAogIHdpdGggdGhlIHBhdGNoIGFuZCB0ZXN0aW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBEZWMgMjAwOSkKLSBSZW5hdG8gQm90ZWxobyBhbmQgUGV0ZXIgUGVudGNoZXYgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwKICBoZWFkZXJzIHdvcmsgY29ycmVjdGx5IGV2ZW4gb24gRnJlZUJTRCBzeXN0ZW1zIGJlZm9yZSB2OC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTY5MTUpCgpEYW5pZWwgU3RlbmJlcmcgKDE3IERlYyAyMDA5KQotIERhdmlkIEJ5cm9uIGZpeGVkIEN1cmxfb3NzbF9jbGVhbnVwIHRvIGFjdHVhbGx5IGNhbGwgRU5HSU5FX2NsZWFudXAgd2hlbgogIGF2YWlsYWJsZS4KCi0gRm9sbG93LXVwIGZpeCBmb3IgdGhlIHByb3h5IGZpeCBJIGRpZCBmb3IgSm9uIE5lbHNvbidzIGJ1Zy4gSXQgdHVybmVkIG91dCBJCiAgd2FzIGEgYml0IHRvbyBxdWljayBhbmQgYnJva2UgdGVzdCBjYXNlIDExMDEgd2l0aCB0aGF0IGNoYW5nZS4gVGhlIG9yZGVyIG9mCiAgc29tZSBvZiB0aGUgc2V0dXBzIGlzIHNlbnNpdGl2ZS4gSSBub3cgY2hhbmdlZCBpdCBzbGlnaHRseSBhZ2FpbiB0byBtYWtlCiAgc3VyZSB3ZSBkbyB0aGVtIGluIHRoaXMgb3JkZXI6CgogIDEgLSBwYXJzZSBVUkwgYW5kIGZpZ3VyZSBvdXQgd2hhdCBwcm90b2NvbCBpcyB1c2VkIGluIHRoZSBVUkwKICAyIC0gcHJlcGVuZCBwcm90b2NvbDovLyB0byBVUkwgaWYgbWlzc2luZwogIDMgLSBwYXJzZSBuYW1lK3Bhc3N3b3JkIG9mZiBVUkwsIHdoaWNoIG5lZWRzIHRvIGtub3cgd2hhdCBwcm90b2NvbCBpcyB1c2VkCiAgICAgIChzaW5jZSBvbmx5IHNvbWUgYWxsb3dzIGZvciBuYW1lK3Bhc3N3b3JkIGluIHRoZSBVUkwpCiAgNCAtIGZpZ3VyZSBvdXQgaWYgYSBwcm94eSBzaG91bGQgYmUgdXNlZCBzZXQgYnkgYW4gb3B0aW9uCiAgNSAtIGlmIG5vIHByb3h5IG9wdGlvbiwgY2hlY2sgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgNiAtIHJ1biB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgc2V0dXAgZnVuY3Rpb24sIHdoaWNoIG5lZWRzIHRvIGhhdmUgdGhlIHByb3h5CiAgICAgIGFscmVhZHkgc2V0CgpEYW5pZWwgU3RlbmJlcmcgKDE1IERlYyAyMDA5KQotIEpvbiBOZWxzb24gZm91bmQgYSByZWdyZXNzaW9uIHRoYXQgdHVybmVkIG91dCB0byBiZSBhIGZsYXcgaW4gaG93IGxpYmN1cmwKICBkZXRlY3RzIGFuZCB1c2VzIHByb3hpZXMgYmFzZWQgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgdGhlIHByb3h5CiAgd2FzIGdpdmVuIGFzIGFuIGV4cGxpY2l0IG9wdGlvbiBpdCB3b3JrZWQsIGJ1dCBkdWUgdG8gdGhlIHNldHVwIG9yZGVyCiAgbWlzdGFrZSBwcm94aWVzIHdvdWxkIG5vdCBiZSB1c2VkIGZpbmUgZm9yIGEgZmV3IHByb3RvY29scyB3aGVuIHBpY2tlZCB1cAogIGZyb20gJ1twcm90b2NvbF1fcHJveHknLiBPYnZpb3VzbHkgdGhpcyBicm9rZSBhZnRlciA3LjE5LjQuIEkgbm93IGFsc28gYWRkZWQKICB0ZXN0IGNhc2UgMTEwNiB0aGF0IHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTM4ODYpCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA5KQotIElNQVAsIFBPUDMgYW5kIFNNVFAgc3VwcG9ydCBhbmQgdGhlaXIgVExTIHZlcnNpb25zIChpbmNsdWRpbmcgSU1BUFMsIFBPUDNTCiAgYW5kIFNNVFBTKSBhcmUgbm93IHN1cHBvcnRlZC4gVGhlIGN1cnJlbnQgc3RhdGUgbWF5IG5vdCB5ZXQgYmUgc29saWQsIGJ1dAogIHRoZSBmb3VuZGF0aW9uIGlzIGluIHBsYWNlIGFuZCB0aGUgdGVzdCBzdWl0ZSBoYXMgc29tZSBpbml0aWFsIHN1cHBvcnQgZm9yCiAgdGhlc2UgcHJvdG9jb2xzLiBXb3JrIHdpbGwgbm93IHBlcnN1ZSB0byBtYWtlIHRoZW0gbmljZSBsaWJjdXJsIGNpdGl6ZW5zCiAgdW50aWwgcmVsZWFzZS4KCiAgVGhlIHdvcmsgd2l0aCBzdXBwb3J0aW5nIHRoZXNlIG5ldyBwcm90b2NvbHMgd2FzIHNwb25zb3JlZCBieQogIG5ldHdvcmtpbmc0YWxsLmNvbSAtIHRoYW5rcyEKCkRhbmllbCBTdGVuYmVyZyAoMTAgRGVjIDIwMDkpCi0gU2llZ2ZyaWVkIEd5dXJpY3NrbyBmb3VuZCBvdXQgdGhhdCB0aGUgY3VybCBtYW51YWwgc2FpZCAtLXJldHJ5IHdvdWxkIHJldHJ5CiAgb24gRlRQIGVycm9ycyBpbiB0aGUgdHJhbnNpZW50IDV4eCByYW5nZS4gVHJhbnNpZW50IEZUUCBlcnJvcnMgYXJlIGluIHRoZQogIDR4eCByYW5nZS4gVGhlIGNvZGUgaXRzZWxmIG9ubHkgdHJpZWQgb24gNXh4IGVycm9ycyB0aGF0IG9jY3VyZWQgX2F0IGxvZ2luXy4KICBOb3cgdGhlIHJldHJ5IGNvZGUgcmV0cmllcyBvbiBhbGwgRlRQIHRyYW5zZmVyIGZhaWx1cmVzIHRoYXQgZW5kZWQgd2l0aCBhCiAgNHh4IHJlc3BvbnNlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkxMTI3OSkKCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlndXJlZCBvdXQgYSBjYXNlIHdoaWNoIHdvdWxkIGxlYWQgdG8gbGliY3VybAogIGFjY2Vzc2luZyBhbHJlZHkgZnJlZWQgbWVtb3J5IGFuZCB0aHVzIGNyYXNoIHdoZW4gdXNpbmcgSFRUUFMgKHdpdGgKICBPcGVuU1NMKSwgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGFuZCBhIGNlcnRhaW4gb3JkZXIKICBvZiBjbGVhbmluZyB0aGluZ3MgdXAuIEkgZml4ZWQgaXQuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTA1MjIwKQoKRGFuaWVsIFN0ZW5iZXJnICg3IERlYyAyMDA5KQotIE1hcnRpbiBTdG9yc2pvIG1hZGUgbGliY3VybCB1c2UgdGhlIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlciBmb3IgcG9zdHMKICB3aXRoIHVua25vd24gc2l6ZS4gUHJldmlvdXNseSBpdCB3YXMgb25seSB1c2VkIGZvciBwb3N0cyB3aXRoIGEga25vd24gc2l6ZQogIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDEgRGVjIDIwMDkpCi0gSWYgdGhlIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlciBoYXMgYmVlbiBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHRocm91Z2gKICBjdXJsX2Vhc3lfc2V0b3B0IHdpdGggQ1VSTE9QVF9IVFRQSEVBREVSLCB0aGUgbGlicmFyeSBzaG91bGQgc2V0CiAgZGF0YS0+c3RhdGUuZXhwZWN0MTAwaGVhZGVyIGFjY29yZGluZ2x5IC0gdGhlIGN1cnJlbnQgY29kZSAoaW4gNy4xOS43IGF0CiAgbGVhc3QpIGRvZXNuJ3QgaGFuZGxlIHRoaXMgcHJvcGVybHkuIE1hcnRpbiBTdG9yc2pvIHByb3ZpZGVkIHRoZSBmaXghCgpZYW5nIFRzZSAoMjggTm92IDIwMDkpCi0gQWRkZWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyB0byBzZXZlcmFsIHRlc3QgaGFybmVzcyBjZXJ0aWZpY2F0ZSBmaWxlcyBpbgogIFBFTSBmb3JtYXQuIFJlcXVpcmVkIGJ5IHNldmVyYWwgc3R1bm5lbCB2ZXJzaW9ucyB1c2VkIGJ5IG91ciB0ZXN0IGhhcm5lc3MuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE5vdiAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIHByb3ZpZGVkIGEgcG9saXNoZWQgYW5kIHVwZGF0ZWQgdmVyc2lvbiBvZiBDaGFkIE1vbnJvZSdzIFRGVFAKICByZXdvcmsgcGF0Y2ggdGhhdCBub3cgaW50ZWdyYXRlcyBURlRQIHByb3Blcmx5IGludG8gbGliY3VybCBzbyB0aGF0IGl0IGNhbgogIGJlIHVzZWQgbm9uLWJsb2NraW5nIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgbW9yZS4gQkxLU0laRSBhbHNvIHdvcmtzLgoKICBUaGUgLS10ZnRwLWJsa3NpemUgb3B0aW9uIHdhcyBhZGRlZCB0byBhbGxvdyBzZXR0aW5nIHRoZSBURlRQIEJMS1NJWkUgZnJvbQogIHRoZSBjb21tYW5kIGxpbmUuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IE5vdiAyMDA5KQotIEV4dGVuZGVkIGFuZCBmaXhlZCB0aGUgY2hhbmdlIEkgZGlkIG9uIERlYyAxMSBmb3IgdGhlIHRoZSBwcm9ncmVzcwogIG1ldGVyL2NhbGxiYWNrIGR1cmluZyBGVFAgY29tbWFuZC9yZXNwb25zZSBzZXF1ZW5jZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzCiAgcmVhbGx5IGxhbWUgYmVmb3JlIGFuZCBub3cgdGhlIHByb2dyZXNzIG1ldGVyIFNIT1VMRCBnZXQgY2FsbGVkIGF0IGxlYXN0CiAgb25jZSBwZXIgc2Vjb25kLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBOb3YgMjAwOSkKLSBCam9ybiBBdWd1c3Rzc29uIHJlcG9ydGVkIGEgYnVnIHdoaWNoIG1hZGUgY3VybCBub3QgcmVwb3J0IGFueSBwcm9ibGVtcyBldmVuCiAgdGhvdWdoIGl0IGZhaWxlZCB0byB3cml0ZSBhIHZlcnkgc21hbGwgZG93bmxvYWQgdG8gZGlzayAoZG9uZSBpbiBhIHNpbmdsZQogIGZ3cml0ZSBjYWxsKS4gSXQgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGZ3cml0ZSgpIHJldHVybmVkIHN1Y2Nlc3MsIGJ1dAogIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgZXJyb3ItY2hlY2tpbmcgZm9yIHRoZSBmY2xvc2UoKSBjYWxsIHdoaWNoIHRyaWNrZWQKICBjdXJsIHRvIGJlbGlldmUgdGhpbmdzIHdlcmUgZmluZS4KCllhbmcgVHNlICgyMyBOb3YgMjAwOSkKLSBEYXZpZCBCeXJvbiBtb2RpZmllZCBNYWtlZmlsZS5kaXN0IHZjOCBhbmQgdmM5IHRhcmdldHMgaW4gb3JkZXIgdG8gYWxsb3cKICBmaW5lciBncmFudWxhcml0eSBjb250cm9sIHdoZW4gZ2VuZXJhdGluZyBzcmMgYW5kIGxpYiBtYWtlZmlsZXMuCgpZYW5nIFRzZSAoMjIgTm92IDIwMDkpCi0gSSBtb2RpZmllZCBjb25maWd1cmUgdG8gZm9yY2UgcmVtb3ZhbCBvZiB0aGUgY3VybGJ1aWxkLmggZmlsZSBpbmNsdWRlZCBpbgogIGRpc3RyaWJ1dGlvbiB0YXJiYWxscyBmb3IgdXNlIGJ5IG5vbi1jb25maWd1cmUgc3lzdGVtcy4gQXMgaW50ZW5kZWQsIHRoaXMKICB3b3VsZCBnZXQgb3ZlcndyaXRlbiB3aGVuIGRvaW5nIGluLXRyZWUgYnVpbGRzLiBCdXQgVlBBVEggYnVpbGRzIHdvdWxkIGVuZAogIGhhdmluZyB0d28gY3VybGJ1aWxkLmggZmlsZXMsIG9uZSBpbiB0aGUgc291cmNlIHRyZWUgYW5kIGFub3RoZXIgaW4gdGhlCiAgYnVpbGQgdHJlZS4gV2l0aCB0aGUgbW9kaWZpY2F0aW9uIEkgaW50cm9kdWNlZCA1IE5vdiAyMDA5IHRoaXMgY291bGQgYmVjb21lCiAgYW4gaXNzdWUgd2hlbiBydW5uaW5nIGxpYmN1cmwncyB0ZXN0IHN1aXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBpZGVudGlmaWVkIGEgd3JpdGUgYWZ0ZXIgY2xvc2UsIGFzIHRoZSBzb2NrZXRzIHdlcmUKICBjbG9zZWQgYnkgbGliY3VybCBiZWZvcmUgdGhlIFNTTCBsaWIgd2VyZSBzaHV0ZG93biBhbmQgdGhleSBtYXkgd3JpdGUgdG8gaXRzCiAgc29ja2V0LiBEZXRlY3RlZCB0byBhdCBsZWFzdCBoYXBwZW4gd2l0aCBPcGVuU1NMIGJ1aWxkcy4KCi0gSmFkIENoYW1jaGFtIHBvaW50ZWQgb3V0IGEgYnVnIHdpdGggY29ubmVjdGlvbiByZS11c2UuIElmIGEgY29ubmVjdGlvbiBoYWQKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBlbmFibGVkIG92ZXIgYSBwcm94eSwgYSBzdWJzZXF1ZW50IHJlcXVlc3QgdXNpbmcgdGhlCiAgc2FtZSBwcm94eSB3aXRoIHRoZSB0dW5uZWwgb3B0aW9uIGRpc2FibGVkIHdvdWxkIHN0aWxsIHdyb25nbHkgcmUtdXNlIHRoYXQKICBwcmV2aW91cyBjb25uZWN0aW9uIGFuZCB0aGUgb3V0Y29tZSB3b3VsZCBvbmx5IGJlIGJhZG5lc3MuCgpZYW5nIFRzZSAoMTggTm92IDIwMDkpCi0gSSBtb2RpZmllZCB0aGUgbWVtb3J5IHRyYWNraW5nIHN5c3RlbSB0byBtYWtlIGl0IGludG9sZXJhbnQgd2l0aCB6ZXJvIHNpemVkCiAgbWFsbG9jKCksIGNhbGxvYygpIGFuZCByZWFsbG9jKCkgZnVuY3Rpb24gY2FsbHMuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IE5vdiAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIHByb3ZpZGVkIGFub3RoZXIgZml4IGZvciB0aGUgRE5TIGNhY2hlIHRoYXQgY291bGQKICBlbmQgdXAgd2l0aCBlbnRyaWVzIHRoYXQgd291bGRuJ3QgdGltZS1vdXQ6CgogIDEuIFNldCB1cCBhIGZpcnN0IHdlYiBzZXJ2ZXIgdGhhdCByZWRpcmVjdHMgKDMwNykgdG8gYSBodHRwOi8vc2VydmVyOnBvcnQKICAgICB0aGF0J3MgZG93bgogIDIuIEhhdmUgY3VybCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZWIgc2VydmVyIHVzaW5nIGN1cmwgbXVsdGkKCiAgQWZ0ZXIgdGhlIGN1cmxfZWFzeV9jbGVhbnVwIGNhbGwsIHRoZXJlIHdpbGwgYmUgY3VybCBkbnMgZW50cmllcyBoYW5naW5nCiAgYXJvdW5kIHdpdGggaW5fdXNlICE9IDAuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkxNTkxKQoKLSBNYXJjIEtsZWluZS1CdWRkZSBmaXhlZDogY3VybCBzYXZlZCB0aGUgTERGTEFHUyBzZXQgZHVyaW5nIGNvbmZpZ3VyZSBpbnRvCiAgaXRzIHBrZy1jb25maWcgZmlsZS4gIFNvIC1XbCBzdHVmZiBlbmRlZCB1cCBpbiB0aGUgLnBjIGZpbGUsIHdoaWNoIGlzIHJlYWxseQogIGJhZCwgYW5kIGJyZWFrcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgLVdsIGluIG91ciBMREZMQUdTICh3aGljaCBhcmUgaW4KICBQVFhkaXN0KS4gYnVnICMyODkzNTkyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkzNTkyKQoKS2FtaWwgRHVka2EgKDE1IE5vdiAyMDA5KQotIERhdmlkIEJ5cm9uIGltcHJvdmVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSBwa2ctY29uZmlnIHRvIGZpbmQgT3BlblNTTAogIChhbmQgaW4gcGFydGljdWxhciB0aGUgbGlzdCBvZiByZXF1aXJlZCBsaWJyYXJpZXMpIGV2ZW4gaWYgYSBwYXRoIGlzIGdpdmVuCiAgYXMgYXJndW1lbnQgdG8gLS13aXRoLXNzbAoKWWFuZyBUc2UgKDE1IE5vdiAyMDA5KQotIEkgcmVtb3ZlZCBlbmFibGUtdGhyZWFkIC8gZGlzYWJsZS10aHJlYWQgY29uZmlndXJlIG9wdGlvbi4gVGhlc2Ugd2VyZSBvbmx5CiAgcGxhY2VibyBvcHRpb25zLiBUaGUgbGlicmFyeSBpcyBhbHdheXMgYnVpbHQgYXMgdGhyZWFkIHNhZmUgYXMgcG9zc2libGUgb24KICBldmVyeSBzeXN0ZW0uCgpDbGFlcyBKYWtvYnNzb24gKDE0IE5vdiAyMDA5KQotIGN1cmwtY29uZmlnIG5vdyBhY2NlcHRzICctLWNvbmZpZ3VyZScgdG8gc2VlIHdoYXQgYXJndW1lbnRzIHdhcwogIHBhc3NlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIGJ1aWxkaW5nIGN1cmwuCgpEYW5pZWwgU3RlbmJlcmcgKDE0IE5vdiAyMDA5KQotIENsYWVzIEpha29ic3NvbiByZXN0b3JlZCB0aGUgY29uZmlndXJlIGZ1bmN0aW9uYWxpdHkgdG8gZGV0ZWN0IE5TUyB3aGVuCiAgLS13aXRoLW5zcyBpcyBzZXQgYnV0IG5vdCAieWVzIi4KCiAgSSB0aGluayB3ZSBjYW4gc3RpbGwgaW1wcm92ZSB0aGF0IHRvIGNoZWNrIGZvciBwa2ctY29uZmlnIGluIHRoYXQgcGF0aCBldGMsCiAgYnV0IGF0IGxlYXN0IHRoaXMgcGF0Y2ggYnJpbmdzIGJhY2sgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSB3ZSBoYWQgYmVmb3JlLgoKLSBDYW1pbGxlIE1vbmNlbGllciBhZGRlZCBzdXBwb3J0IGZvciB0aGUgZmlsZSB0eXBlIFNTTF9GSUxFVFlQRV9FTkdJTkUgZm9yCiAgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4gSXQgYWxzbyBkaXNhYmxlIHRoZSBrZXkgbmFtZSB0ZXN0IGFzIHNvbWUgZW5naW5lcwogIGNhbiBzZWxlY3QgYSBwcml2YXRlIGtleS9jZXJ0IGF1dG9tYXRpY2FsbHkgKFdoZW4gdGhlcmUgaXMgb25seSBvbmUga2V5CiAgYW5kL29yIGNlcnRpZmljYXRlIG9uIHRoZSBoYXJkd2FyZSBkZXZpY2UgdXNlZCBieSB0aGUgZW5naW5lKQoKWWFuZyBUc2UgKDE0IE5vdiAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIHByb3ZpZGVkIHRoZSBmaXggdGhhdCBlbnN1cmVzIHRoYXQgYW4gU1NMIGNvbm5lY3Rpb24KICB3b24ndCBiZSByZXVzZWQgdW5sZXNzIHByb3RlY3Rpb24gbGV2ZWwgZm9yIHBlZXIgYW5kIGhvc3QgdmVyaWZpY2F0aW9uIG1hdGNoLgoKICBJIHJlZmFjdG9yZWQgaG93IHByZXByb2Nlc3NvciBzeW1ib2wgX1RIUkVBRF9TQUZFIGRlZmluaXRpb24gaXMgZG9uZS4KCkthbWlsIER1ZGthICgxMiBOb3YgMjAwOSkKLSBLZXZpbiBCYXVnaG1hbiBwcm92aWRlZCBhIGZpeCBwcmV2ZW50aW5nIGxpYmN1cmwtTlNTIGZyb20gY3Jhc2ggb24gZG91Ymx5CiAgY2xvc2VkIE5TUFIgZGVzY3JpcHRvci4gVGhlIGlzc3VlIHdhcyBoYXJkIHRvIGZpbmQsIHJlcG9ydGVkIHNldmVyYWwgdGltZXMKICBiZWZvcmUgYW5kIGFsd2F5cyBjbG9zZWQgdW5yZXNvbHZlZC4gTW9yZSBpbmZvIGF0IHRoZSBSSCBidWc6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzUzNDE3NgoKLSBsaWJjdXJsLU5TUyBub3cgdHJpZXMgdG8gcmVjb25uZWN0IHdpdGggVExTIGRpc2FibGVkIGluIGNhc2UgaXQgZGV0ZWN0cwogIGEgYnJva2VuIFRMUyBzZXJ2ZXIuIEhvd2V2ZXIgaXQgZG9lcyBub3QgaGFwcGVuIGlmIFNTTCB2ZXJzaW9uIGlzIHNlbGVjdGVkCiAgbWFudWFsbHkuIFRoZSBhcHByb2FjaCB3YXMgb3JpZ2luYWxseSB0YWtlbiBmcm9tIFBTTS4gS2FzcGFyIEJyYW5kIGhlbHBlZCBtZQogIHRvIGNvbXBsZXRlIHRoZSBwYXRjaC4gT3JpZ2luYWwgYnVnIHJlcG9ydHM6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzUyNTQ5NgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81Mjc3NzEKCllhbmcgVHNlICgxMiBOb3YgMjAwOSkKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gbWFrZSB0aGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24gY2hlY2sgYWxzbwogIHZlcmlmeSBpZiB0aGUgZnVuY3Rpb24gaXMgdGhyZWFkIHNhZmUuCgpZYW5nIFRzZSAoMTEgTm92IDIwMDkpCi0gTWFyY28gTWFnZ2kgcmVwb3J0ZWQgdGhhdCBjb21waWxhdGlvbiBmYWlsZWQgd2hlbiBjb25maWd1cmVkIC0td2l0aC1nc3NhcGkKICBhbmQgR05VIEdTUyBpbnN0YWxsZWQgZHVlIHRvIGEgbWlzc2luZyBtdXR1YWwgZXhjbHVzaW9uIG9mIGhlYWRlciBmaWxlcyBpbgogIHRoZSBLZXJiZXJvcyA1IGNvZGUgcGF0aC4gSGUgYWxzbyB2ZXJpZmllZCB0aGF0IG15IHBhdGNoIHdvcmtlZCBmb3IgaGltLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwb3N0ZWQgYnVnICMyODkxNTk1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4OTE1OTUpIHdoaWNoIGlkZW50aWZpZWQgaG93IGFuIGVudHJ5CiAgaW4gdGhlIEROUyBjYWNoZSB3b3VsZCBsaW5nZXIgdG9vIGxvbmcgaWYgdGhlIHJlcXVlc3QgdGhhdCBhZGRlZCBpdCB3YXMgaW4KICB1c2UgdGhhdCBsb25nLiBIZSBhbHNvIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIGNhcGFibGUgb2YKICBzdGlsbCBkb2luZyBhIHJlcXVlc3Qgd2hpbGUgdGhlIEROUyBoYXNoIGVudHJ5IG1heSBnZXQgdGltZWQgb3V0LgoKLSBDaHJpc3RpYW4gU2NobWl0eiBub3RpY2VkIHRoYXQgdGhlIHByb2dyZXNzIG1ldGVyL2NhbGxiYWNrIHdhcyBub3QgcHJvcGVybHkKICB1c2VkIGR1cmluZyB0aGUgRlRQIGNvbm5lY3Rpb24gcGhhc2UgKGFmdGVyIHRoZSBhY3R1YWwgVENQIGNvbm5lY3QpLCB3aGlsZQogIGl0IG9mIGNvdXJzZSBzaG91bGQgYmUuIEkgYWxzbyBtYWRlIHRoZSBzcGVlZCBjaGVjayBnZXQgY2FsbGVkIGNvcnJlY3RseSBzbwogIHRoYXQgcmVhbGx5IHNsb3cgc2VydmVycyB3aWxsIHRyaWdnZXIgdGhhdCBwcm9wZXJseSB0b28uCgpLYW1pbCBEdWRrYSAoNSBOb3YgMjAwOSkKLSBEcm9wcGVkIG1pc2xlYWRpbmcgdGltZW91dHMgaW4gbGliY3VybC1OU1MgYW5kIG1hZGUgc3VyZSB0aGUgU1NMIHNvY2tldCB3b3JrcwogIGluIG5vbi1ibG9ja2luZyBtb2RlLgoKWWFuZyBUc2UgKDUgTm92IDIwMDkpCi0gSSByZW1vdmVkIGxlYWRpbmcgJ2N1cmwnIHBhdGggb24gdGhlICdjdXJsYnVpbGQuaCcgaW5jbHVkZSBzdGF0ZW1lbnQgaW4KICBjdXJsLmgsIGFkanVzdGluZyBhdXRvLW1ha2VmaWxlcyBpbmNsdWRlIHBhdGgsIHRvIGVuaGFuY2UgcG9ydGFiaWxpdHkgdG8KICBPUydzIHdpdGhvdXQgYW4gb3J0aG9nb25hbCBkaXJlY3RvcnkgdHJlZSBzdHJ1Y3R1cmUgc3VjaCBhcyBPUy80MDAuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTm92IDIwMDkpCi0gSSBmaXhlZCBzZXZlcmFsIHByb2JsZW1zIHdpdGggdGhlIHRyYW5zZmVyIHByb2dyZXNzIG1ldGVyLiBJdCBzaG93ZWQgdGhlCiAgd3JvbmcgcGVyY2VudGFnZSBmb3Igc21hbGwgZmlsZXMsIG1vc3Qgbm90YWJsZSBmb3IgPDEwMDAgYnl0ZXMgYW5kIGNvdWxkCiAgZWFzaWx5IGVuZCB1cCBzaG93aW5nIG1vcmUgdGhhbiAxMDAlIGF0IHRoZSBlbmQuIEl0IGFsc28gZGlkbid0IHNob3cgYW55CiAgcGVyY2VudGFnZSwgdHJhbnNmZXIgc2l6ZSBvciBlc3RpbWF0ZWQgdHJhbnNmZXIgdGltZXMgd2hlbiB0cmFuc2ZlcnJpbmcKICBsZXNzIHRoYW4gMTAwIGJ5dGVzLgoKVmVyc2lvbiA3LjE5LjcgKDQgTm92ZW1iZXIgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMiBOb3YgMjAwOSkKLSBBcyByZXBvcnRlZCBpbmRlcGVuZGVudCBieSBib3RoIFN0YW4gdmFuIGRlIEJ1cmd0IGFuZCBEaWRpZXIgQnJpc2Vib3VyZywKICBDVVJMSU5GT19TSVpFX0RPV05MT0FEICh0aGUgLXcgdmFyaWFibGUgc2l6ZV9kb3dubG9hZCkgZGlkbid0IHdvcmsgd2hlbgogIGdldHRpbmcgZGF0YSBmcm9tIGxkYXAhCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE9jdCAyMDA5KQotIEdhYnJpZWwgS3VyaSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBpZiB0aGUKICBkb3dubG9hZCB3YXMgMCBieXRlcywgYXMgbGliY3VybCB3b3VsZCB0aGVuIHJldHVybiB0aGUgc2l6ZSBhcyB1bmtub3duICgtMSkKICBhbmQgbm90IDAuIEkgd3JvdGUgYSBmaXggYW5kIHRlc3QgY2FzZSA1NjYgdG8gdmVyaWZ5IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBPY3QgMjAwOSkKLSBMaXphIEFsZW5jaGVyeSBtZW50aW9uZWQgYSBwcm9ibGVtIHdpdGggcmUtdXNlZCBTQ1AgY29ubmVjdGlvbiB3aGVuIGEgYmFkCiAgYXV0aCBpcyB1c2VkLCBhcyBpdCBjYXVzZWQgYSBjcmFzaC4gSSBmYWlsZWQgdG8gcmVwZWF0IHRoZSBpc3N1ZSwgYnV0IHN0aWxsCiAgbWFkZSBhIGNoYW5nZSB0aGF0IG5vdyBmb3JjZXMgdGhlIFRDUCBjb25uZWN0aW9uIHVzZWQgZm9yIGEgZnJlZWQgU0NQCiAgc2Vzc2lvbiB0byBnZXQgY2xvc2VkIGFuZCBub3QgYmUgcmUtdXNlZC4KCi0gIlRvbSIgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IG1lbnRpb25lZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbiBkb2luZyBhCiAgUE9TVCB1c2luZyBhIHJlYWQgY2FsbGJhY2ssIHdpdGggRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGFuZAogICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgZW5mb3JjZWQuICBJIHdvdWxkIHRoZW4gY2F1c2UgdGhlIGZpcnN0IHJlcXVlc3QKICB0byBiZSB3cm9uZ2x5IHNlbnQgYW5kIHRoZW4gYmFzaWNhbGx5IGhhbmcgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbi4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQgdGVzdCBjYXNlIDU2NSB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE9jdCAyMDA5KQotIERpbWEgQmFyc2t5IG1hZGUgdGhlIGN1cmwgY29va2llIHBhcnNlciBhY2NlcHQgY29va2llcyBldmVuIHdpdGggYmxhbmsgb3IKICB1bnBhcnNhYmxlIGV4cGlyeSBkYXRlcyBhbmQgdGhlbiB0cmVhdCB0aGVtIGFzIHNlc3Npb24gY29va2llcyAtIHByZXZpb3VzbHkKICBsaWJjdXJsIHdvdWxkIHJlamVjdCBjb29raWVzIHdpdGggYSBkYXRlIGZvcm1hdCBpdCBjb3VsZG4ndCBwYXJzZS4gUmVzZWFyY2gKICBzaG93cyB0aGF0IHRoZSBtYWpvciBicm93c2VyIHRyZWF0IHN1Y2ggY29va2llcyBhcyBzZXNzaW9uIGNvb2tpZXMuIEkKICBtb2RpZmllZCB0ZXN0IDggYW5kIDMxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBPY3QgMjAwOSkKLSBBdHRlbXB0IHRvIHVzZSBwa2ctY29uZmlnIGZvciBmaW5kaW5nIG91dCBsaWJzc2gyIGluc3RhbGxhdGlvbiBkZXRhaWxzCiAgZHVyaW5nIGNvbmZpZ3VyZS4KCi0gQSBwYXRjaCBpbiBidWcgcmVwb3J0ICMyODgzMTc3IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODgzMTc3KQogIGJ5IEpvaGFuIHZhbiBTZWxzdCBpbnRyb2R1Y2VkIHRoZSAtLWNybGZpbGUgb3B0aW9uIHRvIGN1cmwsIHdoaWNoIG1ha2VzIGN1cmwKICB0ZWxsIGxpYmN1cmwgYWJvdXQgYSBmaWxlIHdpdGggQ1JMIChjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QpIGRhdGEgdG8KICByZWFkLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBPY3QgMjAwOSkKLSBSYXkgRGFzc2VuIHByb3ZpZGVkIGEgcGF0Y2ggaW4gRGViaWFuJ3MgYnVnIHRyYWNrZXIgKGJ1ZyBudW1iZXIgIzU1MTQ2MSkKICB0aGF0IG5vdyBtYWtlcyBjdXJsX2dldGRhdGUoMykgYWN0dWFsbHkgaGFuZGxlcyBSRkMgODIyIGZvcm1hdHRlZCBkYXRlcyB0aGF0CiAgdXNlIHRoZSAic2luZ2xlIGxldHRlciBtaWxpdGFyeSB0aW1lem9uZXMiLgogIGh0dHA6Ly93d3cucmZjLXJlZi5vcmcvUkZDLVRFWFRTLzgyMi9jaGFwdGVyNS5odG1sIGhhcyB0aGUgZGV0YWlscy4KCi0gRml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlIFNDUC9TRlRQIGNvZGUgYXMgaXQgbmV2ZXIgZnJlZWQgdGhlIGtub3duaG9zdHMKICBkYXRhIQoKLSBKb2huIERlbm5pcyBmaWxlZCBidWcgcmVwb3J0ICMyODczNjY2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzM2NjYpIHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2hpY2ggbWFkZSBsaWJjdXJsIGxvb3AgaW5maW5pdGVseSB3aGVuIGdpdmVuIGluY29ycmVjdCBjcmVkZW50aWFscyB3aGVuCiAgdXNpbmcgSFRUUCBHU1MgbmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uLiBIZSBhbHNvIHByb3ZpZGVkIGEgc21hbGwgYW5kIHNpbXBsZQogIHBhdGNoIGZvciBpdC4KCi0gS2V2aW4gQmF1Z2htYW4gZm91bmQgYSBkb3VibGUgY2xvc2UoKSBwcm9ibGVtIHdpdGggbGliY3VybC1OU1MsIGFzIHdoZW4KICBsaWJjdXJsIGNhbGxlZCBOU1MgdG8gY2xvc2UgdGhlIFNTTCAic2Vzc2lvbiIgaXQgYWxzbyBjbG9zZWQgdGhlIGFjdHVhbAogIHNvY2tldC4KCllhbmcgVHNlICgxNyBPY3QgMjAwOSkKLSBCdWcgcmVwb3J0ICMyODY2NzI0IGluZGljYXRlZAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODY2NzI0KSB0aGF0IGN1cmwgb24gV2luZG93cyBmYWlsZWQKICB3aGVuIHdyaXRpbmcgZmlsZXMgd2hvc2UgZmlsZSBuYW1lcyBvcmlnaW5hbGx5IGNvbnRhaW5lZCBjaGFyYWN0ZXJzIHdoaWNoCiAgYXJlIG5vdCB2YWxpZCBmb3IgZmlsZSBuYW1lcyBvbiBXaW5kb3dzLiBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYW4gaW5pdGlhbAogIHBhdGNoIGFuZCBhbm90aGVyIHJldmlzZWQgb25lIHRvIGZpeCB0aGlzIGlzc3VlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIE9jdCAyMDA5KQotIFRvbSBNdWVsbGVyIGNvcnJlY3RseSByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMyODcwMjIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzAyMjEpIHRoYXQgbGliY3VybCByZXR1cm5lZCBhbgogIGluY29ycmVjdCByZXR1cm4gY29kZSBmcm9tIHRoZSBpbnRlcm5hbCB0cnluZXh0aXAoKSBmdW5jdGlvbiB3aGljaCBjYXVzZWQKICBoaW0gZ3JpZWYuIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy4xOS4xIGFuZCBJIGZpbmQgaXQKICBzdHJhbmdlIGl0IGhhc24ndCBoaXQgdXMgaGFyZGVyLCBidXQgSSB3b24ndCBwZXJzdWUgaW50byBmaWd1cmluZyBvdXQKICBleGFjdGx5IHdoeS4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXM6IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWx3YXlzIHNldAogIFNPX1NOREJVRiB0byBDVVJMX1dSSVRFX1NJWkUgZXZlbiBpZiB0aGUgU09fU05EQlVGIHN0YXJ0cyBvdXQgbGFyZ2VyLiAgVGhlCiAgcGF0Y2ggZG9lc24ndCBkbyBhIHNldHNvY2tvcHQgaWYgU09fU05EQlVGIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCiAgQ1VSTF9XUklURV9TSVpFLiBUaGlzIHNob3VsZCBoZWxwIGZvbGtzIHdobyBoYXZlIHNldCB1cCB0aGVpciBjb21wdXRlciB3aXRoCiAgbGFyZ2Ugc2VuZCBidWZmZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBTZXAgMjAwOSkKLSBJIGludHJvZHVjZWQgYSBtYXhpbXVtIGxpbWl0IGZvciByZWNlaXZlZCBIVFRQIGhlYWRlcnMuIEl0IGlzIGNvbnRyb2xsZWQgYnkKICB0aGUgZGVmaW5lIENVUkxfTUFYX0hUVFBfSEVBREVSIHdoaWNoIGlzIGV2ZW4gZXhwb3NlZCBpbiB0aGUgcHVibGljIGhlYWRlcgogIGZpbGUgdG8gYWxsb3cgZm9yIHVzZXJzIHRvIGZhaXJseSBlYXN5IHJlYnVpbGQgbGliY3VybCB3aXRoIGEgbW9kaWZpZWQKICBsaW1pdC4gVGhlIHJhdGlvbmFsZSBmb3IgYSBmaXhlZCBsaW1pdCBpcyB0aGF0IGxpYmN1cmwgaXMgcmVhbGxvYygpaW5nIGEKICBidWZmZXIgdG8gYmUgYWJsZSB0byBwdXQgYSBmdWxsIGhlYWRlciBpbnRvIGl0LCBzbyB0aGF0IGl0IGNhbiBjYWxsIHRoZQogIGhlYWRlciBjYWxsYmFjayB3aXRoIHRoZSBlbnRpcmUgaGVhZGVyLCBidXQgdGhhdCBhbHNvIHJpc2sgZ2V0dGluZyBpdCBpbnRvCiAgdHJvdWJsZSBpZiBhIHNlcnZlciBieSBtaXN0YWtlIG9yIHdpbGxpbmdseSBzZW5kcyBhIGhlYWRlciB0aGF0IGlzIG1vcmUgb3IKICBsZXNzIHdpdGhvdXQgYW4gZW5kLiBUaGUgbGltaXQgaXMgc2V0IHRvIDEwMEsuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IFNlcCAyMDA5KQotIEpvaG4gUC4gTWNDYXNrZXkgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IHNob3dlZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbgogIHNhdmluZyByZWNlaXZlZCBjb29raWVzIHdpdGggbm8gZ2l2ZW4gcGF0aCwgaWYgdGhlIHBhdGggaW4gdGhlIHJlcXVlc3QgaGFkIGEKICBxdWVyeSBwYXJ0LiBUaGF0IGlzIG1lYW5zIGEgcXVlc3Rpb24gbWFyayAoPykgYW5kIGNoYXJhY3RlcnMgb24gdGhlIHJpZ2h0CiAgc2lkZSBvZiB0aGF0LiBJIHdyb3RlIHRlc3QgY2FzZSAxMTA1IGFuZCBmaXhlZCB0aGlzIHByb2JsZW0uCgpLYW1pbCBEdWRrYSAoMjYgU2VwIDIwMDkpCi0gSW1wbGVtZW50ZWQgYSBwcm90b2NvbCBpbmRlcGVuZGVudCB3YXkgdG8gc3BlY2lmeSBibG9ja2luZyBkaXJlY3Rpb24sIHVzZWQgYnkKICB0cmFuc2Zlci5jIGZvciBibG9ja2luZy4gSXQgaXMgY3VycmVudGx5IHVzZWQgb25seSBieSBTQ1AgYW5kIFNGVFAgcHJvdG9jb2xzLgogIFRoaXMgZW5oYW5jZW1lbnQgcmVzb2x2ZXMgYW4gaXNzdWUgd2l0aCAxMDAlIENQVSB1c2FnZSBkdXJpbmcgU0ZUUCB1cGxvYWQsCiAgcmVwb3J0ZWQgYnkgVm91cmhleS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDkpCi0gQ2hyaXMgTXVtZm9yZCBmaWxlZCBidWcgcmVwb3J0ICMyODYxNTg3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NjE1ODcpIGlkZW50aWZ5aW5nIHRoYXQgbGliY3VybCB1c2VkCiAgdGhlIE9wZW5TU0wgZnVuY3Rpb24gWDUwOV9sb2FkX2NybF9maWxlKCkgd3JvbmdseSBhbmQgZmFpbGVkIGlmIGl0IHdvdWxkCiAgbG9hZCBhIENSTCBmaWxlIHdpdGggbW9yZSB0aGFuIG9uZSBjZXJ0aWZpY2F0ZSB3aXRoaW4uIFRoaXMgaXMgbm93IGZpeGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBTZXAgMjAwOSkKLSBTdmVuIEFuZGVycyByZXBvcnRlZCB0aGF0IHdlIGludHJvZHVjZWQgYSBjZXJ0IHZlcmZpY2F0aW9uIGZsYXcgZm9yIE9wZW5TU0wtCiAgcG93ZXJlZCBsaWJjdXJsIGluIDcuMTkuNi4gSWYgdGhlcmUgd2FzIGEgWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZQogIGZpZWxkIGluIHRoZSBjZXJ0ZmljYXRlIGl0IGhhZCB0byBtYXRjaCBhbmQgc28gZXZlbiBpZiBub24tRE5TIGFuZCBub24tSVAKICBlbnRyeSB3YXMgcHJlc2VudCBpdCBjYXVzZWQgdGhlIHZlcmlmaWNhdGlvbiB0byBmYWlsLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBTZXAgMjAwOSkKLSBNb3ZlZCB0aGUgbGlic3NoMiBjaGVja3MgYWZ0ZXIgdGhlIFNTTCBsaWJyYXJ5IGNoZWNrcy4gVGhpcyBoZWxwcyB3aGVuCiAgc3RhdGljYWxseSBsaW5raW5nIHNpbmNlIGxpYnNzaDIgbmVlZHMgdGhlIFNTTCBsaWJyYXJ5IGxpbmsgZmxhZ3MgdG8gYmUKICBzZXQgdXAgYWxyZWFkeSB0byBzYXRpc2Z5IGl0cyBkZXBlbmRlbmNpZXMuIFRoaXMgd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmCiAgdGhlIGxpYnNzaDIgY29uZmlndXJlIGNoZWNrIHdhcyBjaGFuZ2VkIHRvIHVzZSBwa2ctY29uZmlnIHNpbmNlIHRoZQogIC0tc3RhdGljIGZsYWcgd291bGQgYWRkIHRoZSBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4KCllhbmcgVHNlICgxNCBTZXAgMjAwOSkKLSBSZXZlcnQgSm9zaHVhIEt3YW4ncyBwYXRjaCBjb21taXR0ZWQgMTEgU2VwIDIwMDkuCgogIFNvbWUgc3lzdGVtcyBwb2xsIGZ1bmN0aW9uIHNldHMgUE9MTEhVUCBpbiByZXZlbnRzIHdpdGhvdXQgc2V0dGluZwogIFBPTExJTiwgYW5kIHNldHMgUE9MTEVSUiB3aXRob3V0IHNldHRpbmcgUE9MTElOIGFuZCBQT0xMT1VULiBJbiBzb21lCiAgbGliY3VybCBjb2RlIGV4ZWN1dGlvbiBwYXRocyB0aGlzIGNvdWxkIHRyaWdnZXIgYnVzeSB3YWl0IGxvb3BzIHdpdGgKICBoaWdoIENQVSB1c2FnZSB1bnRpbCBhIHRpbWVvdXQgY29uZGl0aW9uIGFib3J0ZWQgdGhlIGxvb3AuCgogIFRoZSByZXZlcnRlZCBwYXRjaCBhZGRyZXNzZWQgdGhlIGFib3ZlIGlzc3VlIGZvciBhIHZlcnkgc3BlY2lmaWMgY2FzZSwKICB3aGVuIGF3YWl0aW5nIGMtYXJlcyB0byByZXNvbHZlLiBBIGxpYmN1cmwtd2lkZSBmaXggZm9yIEN1cmxfcG9sbCBub3cKICBzdXBlcmNlZWRzIHRoaXMgb25lLgoKR3VlbnRlciBLbmF1ZiAoMTEgU2VwIDIwMDkpCi0gSm9zaHVhIEt3YW4gcHJvdmlkZWQgYSBwYXRjaCB0byBwYXNzIFBPTExFUlIgLyBQT0xMSFVQIGJhY2sgdG8gYy1hcmVzLgogIFRoaXMgZml4ZXMgYSBsb29wIHByb2JsZW0gd2l0aCBoaWdoIENQVSB1c2FnZS4KCkRhbmllbCBTdGVuYmVyZyAoMTAgU2VwIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvb2tpZSBleHBpcnkgZGF0ZXMgYXQgZXhjdGx5IHRoZSBlcG9jaAogIHN0YXJ0IHNlY29uZCAiVGh1IEphbiAxIDAwOjAwOjAwIEdNVCAxOTcwIiBhcyB0aGUgZGF0ZSBwYXJzZXIgdGhlbiByZXR1cm5zIDAKICB3aGljaCBpbnRlcm5hbGx5IHRoZW4gaXMgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llLiBUaGF0IHBhcnRpY3VsYXIgZGF0ZQogIGlzIG5vdyBtYWRlIHRvIGdldCB0aGUgdmFsdWUgb2YgMS4KCkRhbmllbCBTdGVuYmVyZyAoMiBTZXAgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBmb3VuZCBhIGZsYXcgaW4gdGhlIGNvZGUgY29udmVydGluZyBzZnRwLWVycm9ycyB0byBsaWJjdXJsCiAgZXJyb3JzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIFNlcCAyMDA5KQotIFBldGVyIFN5bHZlc3RlciBtYWRlIGEgZGVidWcgZmVhdHVyZSBmb3IgQ3VybF9yZXNvbHYoKSB0aGF0IG5vdyB3aWxsIGZvcmNlCiAgbGliY3VybCB0byByZXNvbHZlICdsb2NhbGhvc3QnIHdoYXRldmVyIG5hbWUgeW91IHVzZSBpbiB0aGUgVVJMICppZiogeW91IHNldAogIHRoZSAtLWludGVyZmFjZSBvcHRpb24gdG8gKGV4YWN0bHkpICJMb2NhbEhvc3QiLiBUaGlzIHdpbGwgZW5hYmxlIHVzIHRvCiAgd3JpdGUgdGVzdHMgZm9yIGN1c3RvbSBob3N0cyBuYW1lcyBidXQgc3RpbGwgdXNlIGEgbG9jYWwgaG9zdCBzZXJ2ZXIuCgotIGNvbmZpZ3VyZSBub3cgdHJpZXMgdG8gdXNlIHBrZy1jb25maWcgZm9yIGEgbnVtYmVyIG9mIHN1Yi1kZXBlbmRlbmNpZXMgZXZlbgogIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiBUaGUga2V5IHRvIHN1Y2Nlc3MgaXMgdGhlbiB5b3UgcHJvcGVybHkgc2V0dXAKICBQS0dfQ09ORklHX1BBVEggYmVmb3JlIGludm9raW5nIGNvbmZpZ3VyZS4KCiAgSSBhbHNvIGltcHJvdmVkIGhvdyBOU1MgaXMgZGV0ZWN0ZWQgYnkgdHJ5aW5nIG5zcy1jb25maWcgaWYgcGtnLWNvbmZpZyBpc24ndAogIHByZXNlbnQsIGFuZCBhcyBhIGxhc3QgcmVzb3J0IGp1c3QgdXNlIHRoZSBsaWIgbmFtZSBhbmQgZm9yY2UgdGhlIHVzZXIgdG8KICBzZXR1cCB0aGUgTElCUy9MREZMQUdTL0NGTEFHUyBldGMgcHJvcGVybHkuIFRoZSBwcmV2aW91cyBsYXN0IHJlc29ydCB3b3VsZAogIGFkZCBhIHJhbmdlIG9mIHZhcmlvdXMgbGlicyB0aGF0IHdvdWxkIGFsbW9zdCBuZXZlciBiZSBxdWl0ZSBjb3JyZWN0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBBdWcgMjAwOSkKLSBXaGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2l0aCBGVFAgYW5kIHlvdSBhc2tlZCBmb3IgTk9CT0RZLCB5b3UgZGlkIG5vCiAgUVVPVEUgY29tbWFuZHMgYW5kIHRoZSByZXF1ZXN0IHVzZWQgdGhlIHNhbWUgcGF0aCBhcyB0aGUgY29ubmVjdGlvbiBoYWQKICBhbHJlYWR5IGNoYW5nZWQgdG8sIGl0IHdvdWxkIGRlY2lkZSB0aGF0IG5vIGNvbW1hbmRzIHdvdWxkIGJlIG5lY2Vzc2FyeSBmb3IKICB0aGUgIkRPIiBhY3Rpb24gYW5kIHRoYXQgd2FzIG5vdCBoYW5kbGVkIHByb3Blcmx5IGJ1dCBsaWJjdXJsIHdvdWxkIGluc3RlYWQKICBoYW5nLgoKS2FtaWwgRHVka2EgKDI4IEF1ZyAyMDA5KQotIEltcHJvdmVkIGVycm9yIG1lc3NhZ2UgZm9yIG5vdCBtYXRjaGluZyBjZXJ0aWZpY2F0ZSBzdWJqZWN0IG5hbWUgaW4KICBsaWJjdXJsLU5TUy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NiNjOQoKUGF0cmljayBNb25uZXJhdCAoMjQgQXVnIDIwMDkpCi0gSW50cm9kdWNlZCBhIFNZU1QtYmFzZWQgdGVzdCB0byBwcm9wZXJseSBzZXQtdXAgbmFtZSBmb3JtYXQgd2hlbiBkZWFsaW5nCiAgd2l0aCB0aGUgT1MvNDAwIEZUUCBzZXJ2ZXIuCgotIEZpeGVkIGFuIGZ0cF9yZWFkcmVzcCgpIGJ1ZyBwcmV2ZW50aW5nIGRldGVjdGlvbiBvZiBmYWlsaW5nIGNvbnRyb2wgc29ja2V0CiAgYW5kIGNhdXNpbmcgRlRQIGNsaWVudCB0byBsb29wIGZvcmV2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEF1ZyAyMDA5KQotIE1hcmMgZGUgQnJ1aW4gcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS13aXRoLWdudXRscz1QQVRIIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgYW5kIHByb3ZpZGVkIGEgZml4LiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODQzMDA4CgotIEVyaWMgV29uZyBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZSBuZXcgb3B0aW9uIC1ULiAoZG90KSB0aGF0IG1ha2VzIGN1cmwKICByZWFkIHN0ZGluIGluIGEgbm9uLWJsb2NraW5nIGZhc2hpb24uIFRoaXMgYWxzbyBicmluZ3MgYmFjayAtVC0gKG1pbnVzKSB0bwogIHRoZSBwcmV2aW91cyBibG9ja2luZyBiZWhhdmlvciBzaW5jZSBpdCBjb3VsZCBicmVhayBzdHVmZiBmb3IgcGVvcGxlIGF0CiAgdGltZXMuCgpNaWNoYWwgTWFyZWsgKDIxIEF1ZyAyMDA5KQotIFdpdGggQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFLCBhdm9pZCBzZW5kaW5nIGludmFsaWQgVVJMcyBsaWtlCiAgZnRwOi8vZXhhbXBsZS5jb207dHlwZT1pIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBmdHA6Ly9leGFtcGxlLmNvbSB3aXRob3V0IHRoZQogIHNsYXNoLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBBdWcgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IHBvaW50ZWQgb3V0IGEgbWlzc2luZyByZXR1cm4gY29kZSBjaGVjayBmb3IgYQogIHN0cmR1cCgpIHRoYXQgY291bGQgbGVhZCB0byBzZWdmYXVsdCBpZiBpdCByZXR1cm5lZCBOVUxMLiBJIGV4dGVuZGVkIGhpcwogIHN1Z2dlc3QgcGF0Y2ggdG8gbm93IGhhdmUgQ3VybF9yZXRyeV9yZXF1ZXN0KCkgcmV0dXJuIGEgcmVndWxhciByZXR1cm4gY29kZQogIGFuZCBiZXR0ZXIgY2hlY2sgdGhhdC4KCi0gTG90cyBvZiBnb29kIHdvcmsgYnkgS3Jpc3RlciBKb2hhbnNlbiwgbW9zdGx5IHJlbGF0ZWQgdG8gcGlwZWxpbmluZzoKCiAgRml4IFNJR1NFR1Ygb24gZnJlZSdkIGVhc3lfY29ubiB3aGVuIHBpcGUgdW5leHBlY3RlZGx5IGJyZWFrcwogIEZpeCBkYXRhIGNvcnJ1cHRpb24gaXNzdWUgd2l0aCByZS1jb25uZWN0ZWQgdHJhbnNmZXJzCiAgRml4IHVzZSBhZnRlciBmcmVlIGlmIHdlJ3JlIGNvbXBsZXRlZCBidXQgZWFzeV9jb25uIG5vdCBOVUxMCgpLYW1pbCBEdWRrYSAoMTMgQXVnIDIwMDkpCi0gQ2hhbmdlZCBOU1MgY29kZSB0byBub3QgaWdub3JlIHRoZSB2YWx1ZSBvZiBzc2wudmVyaWZ5aG9zdCBhbmQgcHJvZHVjZSBtb3JlCiAgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBdWcgMjAwOSkKLSBLYXJsIE1vZXJkZXIgZml4ZWQgdGhlIE1ha2VmaWxlLnZjKiBtYWtlZmlsZXMgdG8gaW5jbHVkZSB0aGUgbmV3IGZpbGUKICBub25ibG9jay5jIHNvIHRoYXQgdGhleSB3b3JrIGZpbmUgYWdhaW4KCi0gSSBleHBhbmRlZCB0ZXN0IDUxNyB3aXRoIGEgYnVuY2ggb2YgbW9yZSBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZQogIENocm9tZSBicm93c2VyIHRlc3Qgc3VpdGUuIEl0IHR1cm5zIG91dCBtb3N0IG9mIHRoZW0gZ2V0IHBhcnNlZCB0aGUgc2FtZQogIHdheS4KClZlcnNpb24gNy4xOS42ICgxMiBBdWd1c3QgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTIgQXVnIDIwMDkpCi0gQ2Fyc3RlbiBMYW5nZSByZXBvcnRlZCBhIGJ1ZyBhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgVEZUUCB1cGxvYWQgYW5kIHRoZQogIHNlbmRpbmcgb2YgdGhlIFRTSVpFIG9wdGlvbi4gSSBkb24ndCBsaWtlIGZpeGluZyBidWdzIGp1c3QgaG91cnMgYmVmb3JlCiAgYSByZWxlYXNlLCBidXQgc2luY2UgaXQgd2FzIGJyb2tlbiBhbmQgdGhlIHBhdGNoIGZpeGVzIHRoaXMgZm9yIGhpbSBJIGRlY2lkZWQKICB0byBnZXQgaXQgaW4gYW55d2F5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBBdWcgMjAwOSkKLSBQZXRlciBTeWx2ZXN0ZXIgbWFkZSB0aGUgSFRUUFMgdGVzdCBzZXJ2ZXIgdXNlIHNwZWNpZmljIGNlcnRpZmljYXRlcyBmb3IKICBlYWNoIHRlc3QsIHNvIHRoYXQgdGhlIHRlc3Qgc3VpdGUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjdHVhbGx5IHRlc3QgdGhlCiAgdmVyaWZpY2F0aW9uIG9mIGNlcnQgbmFtZXMgZXRjLiBUaGlzIG1hZGUgYW4gZXJyb3Igc2hvdyB1cCBpbiB0aGUgT3BlblNTTC0KICBzcGVjaWZpYyBjb2RlIHdoZXJlIGl0IHdvdWxkIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIENOIGZpZWxkIGV2ZW4gaWYgYQogIHN1YmplY3RBbHROYW1lIGV4aXN0cyB0aGF0IGRvZXNuJ3QgbWF0Y2guIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB2ZXJpZmllZAogIGluIHRlc3QgMzExLgoKLSBCZW5idWNrIE5hc29uIHBvc3RlZCB0aGUgYnVnIHJlcG9ydCAjMjgzNTE5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODM1MTk2KSwgZml4aW5nIGEgZmV3IGNvbXBpbGVyCiAgd2FybmluZ3Mgd2hlbiBtaXhpbmcgaW50cyBhbmQgYm9vbHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEwIEF1ZyAyMDA5KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIEZUUCBjb2RlIGFuZCBhbiBvZmYtYnktb25lIGhlYXAgYnVmZmVyIG92ZXJmbG93LgoKRGFuaWVsIEZhbmRyaWNoICg5IEF1ZyAyMDA5KQotIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBtb3N0IG9mIHRoZQogIHRvcnR1cmUgdGVzdHMgdG8gZmFpbC4KCkRhbmllbCBTdGVuYmVyZyAoMiBBdWcgMjAwOSkKLSBDdXJ0IEJvZ21pbmUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggU05JIGVuYWJsZWQgb24gYSBwYXJ0aWN1bGFyIHNlcnZlci4gV2UKICBzaG91bGQgaW50cm9kdWNlIGFuIG9wdGlvbiB0byBkaXNhYmxlIFNOSSwgYnV0IGFzIHdlJ3JlIGluIGZlYXR1cmUgZnJlZXplCiAgbm93IEkndmUgYWRkcmVzc2VkIHRoZSBvYnZpb3VzIGJ1ZyBoZXJlIChwb2ludGVkIG91dCBieSBQZXRlciBTeWx2ZXN0ZXIpOiB3ZQogIHNob3VsZG4ndCB0cnkgdG8gZW5hYmxlIFNOSSB3aGVuIFNTTHYyIG9yIFNTTHYzIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCiAgQ29kZSBmb3IgT3BlblNTTCBhbmQgR251VExTIHdhcyBmaXhlZC4gTlNTIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgcGFydGljdWxhcgogIG9wdGlvbiBmb3IgU05JLCBvciBhcmUgd2Ugc2ltcGx5IG5vdCB1c2luZyBpdD8KCkRhbmllbCBTdGVuYmVyZyAoMSBBdWcgMjAwOSkKLSBTY290dCBDYW50b3IgcG9zdGVkIHRoZSBidWcgcmVwb3J0ICMyODI5OTU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4Mjk5NTUpIG1lbnRpb25pbmcgdGhlIHJlY2VudCBTU0wgY2VydAogIHZlcmlmaWNhdGlvbiBmbGF3IGZvdW5kIGFuZCBleHBsb2l0ZWQgYnkgTW94aWUgTWFybGluc3Bpa2UuIFRoZSBwcmVzZW50YXRpb24KICBoZSBkaWQgYXQgQmxhY2sgSGF0IGlzIGF2YWlsYWJsZSBoZXJlOgogIGh0dHBzOi8vd3d3LmJsYWNraGF0LmNvbS9odG1sL2JoLXVzYS0wOS9iaC11c2EtMDktYXJjaGl2ZXMuaHRtbCNNYXJsaW5zcGlrZQoKICBBcHBhcmVudGx5IGF0IGxlYXN0IG9uZSBDQSBhbGxvd2VkIGEgc3ViamVjdEFsdE5hbWUgb3IgQ04gdGhhdCBjb250YWluIGEKICB6ZXJvIGJ5dGUsIGFuZCB0aHVzIGNsaWVudHMgdGhhdCBhc3N1bWVkIHRoZXkgd291bGQgbmV2ZXIgaGF2ZSB6ZXJvIGJ5dGVzCiAgd2VyZSBleHBsb2l0ZWQgdG8gT0sgYSBjZXJ0aWZpY2F0ZSB0aGF0IGRpZG4ndCBhY3R1YWxseSBtYXRjaCB0aGUgc2l0ZS4gTGlrZQogIGlmIHRoZSBuYW1lIGluIHRoZSBjZXJ0IHdhcyAiZXhhbXBsZS5jb21cMHRoZWF0dWFsc2l0ZS5jb20iLCBsaWJjdXJsIHdvdWxkCiAgaGFwcGlseSB2ZXJpZnkgdGhhdCBjZXJ0IGZvciBleGFtcGxlLmNvbS4KCiAgbGliY3VybCBub3cgYmV0dGVyIHVzZXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0cmFjdGVkIG5hbWUsIG5vdCB1c2luZyB0aGUgemVybwogIHRlcm1pbmF0aW9uIGZvciBnZXR0aW5nIHRoZSBzdHJpbmcgbGVuZ3RoLgoKICBUaGlzIGZpeGluZyBvbmx5IG1hZGUgYW5kIG5lZWRlZCBpbiBPcGVuU1NMIGludGVyZmFjaW5nIGNvZGUuCgotIFRhbmd1eSBGYXV0cmUgcG9pbnRlZCBvdXQgdGhhdCBPcGVuU1NMJ3MgZnVuY3Rpb24gUkFORF9zY3JlZW4oKSAocHJlc2VudAogIG9ubHkgaW4gc29tZSBPcGVuU1NMIGluc3RhbGxzIC0gbGlrZSBvbiBXaW5kb3dzKSBpc24ndCB0aHJlYWQtc2FmZSBhbmQgd2UKICBhZ3JlZWQgdGhhdCBtb3ZpbmcgaXQgdG8gdGhlIGdsb2JhbF9pbml0KCkgZnVuY3Rpb24gaXMgYSBkZWNlbnQgd2F5IHRvIGRlYWwKICB3aXRoIHRoaXMgc2l0dWF0aW9uLgoKLSBBbGV4YW5kZXIgQmVlZGllIHByb3ZpZGVkIHRoZSBwYXRjaCBmb3IgYSBub3Byb3h5IHByb2JsZW06IElmIEkgaGF2ZSBzZXQKICBDVVJMT1BUX05PUFJPWFkgdG8gIioiLCBvciB0byBhIGhvc3QgdGhhdCBzaG91bGQgbm90IHVzZSBhIHByb3h5LCBJIGFjdHVhbGx5CiAgY291bGQgc3RpbGwgZW5kIHVwIHVzaW5nIGEgcHJveHkgaWYgYSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgc2V0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBKdWwgMjAwOSkKLSBBbGwgdGhlIHF1b3RlIG9wdGlvbnMgKENVUkxPUFRfUVVPVEUsIENVUkxPUFRfUE9TVFFVT1RFIGFuZAogIENVUkxPUFRfUFJFUVVPVEUpIG5vdyBhY2NlcHQgYSBwcmVjZWVkaW5nIGFzdGVyaXNrIGJlZm9yZSB0aGUgY29tbWFuZCB0bwogIHNlbmQgd2hlbiB1c2luZyBGVFAsIGFzIGEgc2lnbiB0aGF0IGxpYmN1cmwgc2hhbGwgc2ltcGx5IGlnbm9yZSB0aGUgcmVzcG9uc2UKICBmcm9tIHRoZSBzZXJ2ZXIgaW5zdGVhZCBvZiB0cmVhdGluZyBpdCBhcyBhbiBlcnJvci4gTm90IHRyZWF0aW5nIGEgNDAwKyBGVFAKICByZXNwb25zZSBjb2RlIGFzIGFuIGVycm9yIG1lYW5zIHRoYXQgZmFpbGVkIGNvbW1hbmRzIHdpbGwgbm90IGFib3J0IHRoZQogIGNoYWluIG9mIGNvbW1hbmRzLCBub3Igd2lsbCB0aGV5IGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGdldCBkaXNjb25uZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEp1bCAyMDA5KQotIEpvaGFuIHZhbiBTZWxzdCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjgyNTk4OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODI1OTg5KSBwb2ludGluZyBvdXQgdGhhdAogIE9wZW5TU0wtcG93ZXJlZCBsaWJjdXJsIGRpZG4ndCBzdXBwb3J0IHRoZSBTSEEtMiBkaWdlc3QgYWxnb3JpdGhtLCBhbmQKICBwcm92aWRlZCB0aGUgc29sdXRpb24gdG9vOiB0byB1c2UgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSBpbiBhZGRpdGlvbgogIHRvIHRoZSBvbGRlciBTU0xlYXlfKiBhbHRlcm5hdGl2ZS4gT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMgd2FzIGFkZGVkIGluCiAgT3BlblNTTCAwLjkuNQoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOSkKLSBBZGRlZCBDVVJMT1BUX1NTSF9LTk9XTkhPU1RTLCBDVVJMT1BUX1NTSF9LRVlGVU5DVElPTiwgQ1VSTE9QVF9TU0hfS0VZREFUQS4KICBUaGV5IGludHJvZHVjZSBrbm93bl9ob3N0IHN1cHBvcnQgZm9yIFNTSCBrZXlzIHRvIGxpYmN1cmwuIFNlZSBkb2NzIGZvcgogIGRldGFpbHMuIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZGVwZW5kcyBvbiBhIG5ldyBlbm91Z2ggbGlic3NoMiB2ZXJzaW9uLCB0bwogIGJlIHN1cHBvcnRlZCBpbiBsaWJzc2gyIDEuMiBhbmQgbGF0ZXIgKG9yIGN1cnJlbnQgZ2l0IHJlcG8gYXQgdGhpcyB0aW1lKS4KCk1pY2hhbCBNYXJlayAoMjIgSnVsIDIwMDkpCi0gRGF2aWQgQmluZGVybWFuIGZvdW5kIGEgbWVtb3J5IGFuZCBmZCBsZWFrIGluIGxpYi9ndGxzLmM6bG9hZF9maWxlKCkKICAoaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tLzUyMzkxOSkuIFdoZW4gbG9va2luZyBhdCB0aGUgY29kZSwgSSBmb3VuZCB0aGF0CiAgYWxzbyB0aGUgcHRyIHBvaW50ZXIgY2FuIGxlYWsuCgpLYW1pbCBEdWRrYSAoMjAgSnVsIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGltcHJvdmVkIHRoZSBzdXBwb3J0IGZvciBjbGllbnQgY2VydGlmaWNhdGVzIGhhbmRsaW5nIGluCiAgTlNTLXBvd2VyZWQgbGliY3VybC4gTm93IHRoZSBjbGllbnQgY2VydGlmaWNhdGVzIGNhbiBiZSBzZWxlY3RlZAogIGF1dG9tYXRpY2FsbHkgYnkgYSBOU1MgYnVpbHQtaW4gaG9vay4gQWRkaXRpb25hbGx5IHByZS1sb2dpbiB0byBhbGwgUEtDUzExCiAgc2xvdHMgaXMgbm8gbW9yZSBwZXJmb3JtZWQuIEl0IHVzZWQgdG8gY2F1c2UgcHJvYmxlbXMgd2l0aCBIVyB0b2tlbnMuCgotIEZpeGVkIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgTlNTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuIE5vdyB0aGUgUEVNIHJlYWRlcgogIG1vZHVsZSBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IHVubG9hZGVkIG9uIEN1cmxfbnNzX2NsZWFudXAoKS4gSWYgdGhlCiAgdW5sb2FkIGZhaWxzIHRob3VnaCwgbGliY3VybCB3aWxsIHRyeSB0byByZXVzZSB0aGUgYWxyZWFkeSBsb2FkZWQgaW5zdGFuY2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE1IEp1bCAyMDA5KQotIEFkZGVkIG5vbmJsb2NrLmMgdG8gdGhlIG5vbi1hdXRvbWFrZSBtYWtlZmlsZXMgKG5vdGUgdGhhdCB0aGUgZGVwZW5kZW5jaWVzCiAgaW4gdGhlIFdhdGNvbSBtYWtlZmlsZXMgYXJlbid0IHF1aXRlIGNvcnJlY3QpLgoKTWljaGFsIE1hcmVrICgxNSBKdWwgMjAwOSkKLSBDaGFuZ2VkIHRoZSBkZXNjcmlwdGlvbiBvZiBDVVJMSU5GT19PU19FUlJOTyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlCiAgZXJybm8gaXMgbm90IHJlc2V0IG9uIHN1Y2Nlc3MuCgpHdWVudGVyIEtuYXVmICgxNCBKdWwgMjAwOSkKLSByZW5hbWVkIGdlbmVyYXRlZCBjb25maWcuaCB0byBjdXJsX2NvbmZpZy5oIHRvIGF2b2lkIGFueSBmdXR1cmUgY2xhc2hlcwogIHdpdGggY29uZmlnLmggZnJvbSBvdGhlciBwcm9qZWN0cy4KCkRhbmllbCBTdGVuYmVyZyAoOSBKdWwgMjAwOSkKLSBFcmljIFdvbmcgaW50cm9kdWNlZCBjdXJseF9ub25ibG9jaygpIHRoYXQgdGhlIGN1cmwgdG9vbCBub3cgKHJlLSl1c2VzIGZvcgogIHNldHRpbmcgYSBmaWxlIGRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLiBVc2VkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IEVyaWMKICBoaW1zZWxmIGJyb3VnaCBvbiBKdW5lIDE1dGguCgpEYW5pZWwgU3RlbmJlcmcgKDggSnVsIDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgcG9zdGVkIGJ1ZyByZXBvcnQgIzI4MTMxMjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjgxMzEyMykgYW5kIGFuIGEgcGF0Y2ggdGhhdCBmaXhlcyB0aGUKICBwcm9ibGVtOgoKICBVcmwgQSBpcyBhY2Nlc3NlZCB1c2luZyBhdXRoLiBVcmwgQSByZWRpcmVjdHMgdG8gVXJsIEIgKG9uIGEgZGlmZmVyZW50CiAgc2VydmVyMC4gVXJsIEIgcmV1c2VzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBVcmwgQiBoYXMgYXV0aCwgZXZlbiB0aG91Z2gKICBpdCdzIG9uIGEgZGlmZmVyZW50IHNlcnZlci4KCiAgTm90ZTogaWYgVXJsIEIgZG9lcyBub3QgcmV1c2UgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24sIGF1dGggaXMgbm90IHNlbnQuCgogIHJlYXNvbjoKCiAgZGF0YS0+c3RhdGUuZmlyc3RfaG9zdCBpcyBub3QgaW5pdGlhbGl6ZWQgYmVjdWFzZSBDdXJsX2h0dHBfY29ubmVjdCBpcyBub3QKICBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgcmV1c2VkLgoKICBTb2x1dGlvbjoKCiAgbW92ZSBpbml0aWFsaXphdGlvbiBvZiBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IHRvIEN1cmxfaHR0cC4gTm8gY29kZSBiZWZvcmUKICBDdXJsX2h0dHAgdXNlcyBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IGFueXdheS4KCkd1ZW50ZXIgS25hdWYgKDQgSnVsIDIwMDkpCi0gTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgYSBwYXRjaCB0byBhdm9pZCBnZXRuYW1laW5mbygpIHVzYWdlIHdoaWNoIGJyb2tlIGEKICBjb3VwbGUgb2YgYm90aCBJUHY0IGFuZCBJUHY2IGF1dG9idWlsZHMuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEp1biAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIG1hZGUgQ1VSTE9QVF9GVFBQT1JUIChhbmQgY3VybCdzIC1QLy0tZnRwcG9ydCkgc3VwcG9ydCBhIHBvcnQKICByYW5nZSBpZiBnaXZlbiBjb2xvbi1zZXBhcmF0ZWQgYWZ0ZXIgdGhlIGhvc3QgbmFtZS9hZGRyZXNzIHBhcnQuIExpa2UKICAiMTkyLjE2OC4wLjE6MjAwMC0xMDAwMCIKCi0gTW9kaWZpZWQgdGhlIHNlcGFyYXRvcnMgdXNlZCBmb3IgQ1VSTE9QVF9DRVJUSU5GTyBpbiBtdWx0aS1wYXJ0IG91dHB1dHMuIEkKICBkb24ndCBrbm93IGhvdyB0aGV5IGdvdCB3cm9uZyBpbiB0aGUgZmlyc3QgcGxhY2UsIGJ1dCB1c2luZyB0aGlzIG91dHB1dAogIGZvcm1hdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBxdWl0ZSBlYXNpbHkgc2VwYXJhdGUgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5CiAgb2YgbXVsdGlwbGUgaXRlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDE2IEp1bmUgMjAwOSkKLSBBZGRlZCBhIGZldyBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBKdW4gMjAwOSkKLSBSZXV2ZW4gV2FjaHRmb2dlbCBtYWRlIGN1cmwgLW8gLSBwcm9wZXJseSBwcm9kdWNlIGEgYmluYXJ5IG91dHB1dCBvbiB3aW5kb3dzCiAgKG5vIG5ld2xpbmUgdHJhbnNsYXRpb25zKS4gVXNlIC1CLy0tdXNlLWFzY2lpIGlmIHlvdSByYXRoZXIgZ2V0IHRoZSBhc2NpaQogIGFwcHJvYWNoLgoKTWljaGFsIE1hcmVrICgxNiBKdW4gMjAwOSkKLSBXaGVuIGRvaW5nIG5vbi1hbm9ueW1vdXMgZnRwIHZpYSBodHRwIHByb3hpZXMgYW5kIHRoZSBwYXNzd29yZCBpcyBub3QKICBwcm92aWRlZCBpbiB0aGUgdXJsLCBhZGQgaXQgdGhlcmUgKHNxdWlkIG5lZWRzIHRoaXMpLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBKdW4gMjAwOSkKLSBFcmljIFdvbmcncyBwYXRjaDoKCiAgVGhpcyBhbGxvd3MgY3VybCgxKSB0byBiZSB1c2VkIGFzIGEgY2xpZW50LXNpZGUgdHVubmVsIGZvciBhcmJpdHJhcnkgc3RyZWFtCiAgcHJvdG9jb2xzIGJ5IGFidXNpbmcgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBpbiBib3RoIHRoZSBIVFRQIHJlcXVlc3QgYW5kCiAgSFRUUCByZXNwb25zZS4gIFRoaXMgcmVxdWlyZXMgc2VydmVyIHN1cHBvcnQgZm9yIHNlbmRpbmcgYSByZXNwb25zZSB3aGlsZSBhCiAgcmVxdWVzdCBpcyBzdGlsbCBiZWluZyByZWFkLCBvZiBjb3Vyc2UuCgogIElmIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHN0ZGluIHJldHVybnMgRUFHQUlOLCB0aGVuIHdlIHBhdXNlIG91ciBzZW5kZXIuCiAgVGhpcyBsZWF2ZXMgY3VybCB0byBhdHRlbXB0IHRvIHJlYWQgZnJvbSB0aGUgc29ja2V0IHdoaWxlIHJlYWRpbmcgZnJvbSBzdGRpbgogIChhbmQgdGh1cyBzZW5kaW5nKSBpcyBwYXVzZWQuCgogIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgdG8gYWxsb3cgc3VjY2Vzc2Z1bGx5IHR1bm5lbGluZyB0aGUgZ2l0IHByb3RvY29sIG92ZXIKICBIVFRQICgtLW5vLWJ1ZmZlciBpcyBuZWVkZWQsIGFzIHdlbGwpLgoKUGF0cmljayBNb25uZXJhdCAoMTUgSnVuIDIwMDkpCi0gUmVwbGFjZWQgdXNlIG9mIHN0YW5kYXJkIEMgbGlicmFyeSByYW5kKCkvc3JhbmQoKSBieSBvdXIgb3duIHBzZXVkby1yYW5kb20KICBudW1iZXIgZ2VuZXJhdG9yLgoKWWFuZyBUc2UgKDExIEp1biAyMDA5KQotIEkgYWRhcHRlZCB0ZXN0Y3VybCBzY3JpcHQgdG8gYWxsb3cgYnVpbGRpbmcgdGVzdCBoYXJuZXNzIHByb2dyYW1zIHdoZW4KICBjcm9zcy1jb21waWxpbmcgZm9yIGEgKi0qLW1pbmd3KiBob3N0LgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKdW4gMjAwOSkKLSBGYWJpYW4gS2VpbCByYW4gY2xhbmcgb24gdGhlIChsaWIpY3VybCBjb2RlLCBmb3VuZCBhIGJ1bmNoIG9mIHdhcm5pbmdzIGFuZAogIGNvbnRyaWJ1dGVkIGEgcmFuZ2Ugb2YgcGF0Y2hlcyB0byBmaXggdGhlbS4KCllhbmcgVHNlICgxMCBKdW4gMjAwOSkKLSBJIGludHJvZHVjZWQgY29uZmlndXJlIHNjcmlwdCBvcHRpb24gLS1lbmFibGUtY3VybGRlYnVnIHdoaWNoIG5vdyBhbGxvd3MKICB0aGUgZGVjb3VwbGVkIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvZiB0aGUgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcKICBmZWF0dXJlIGZyb20gdGhlIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB3aGljaCBubyBsb25nZXIgY29udHJvbHMgdGhpcy4KCiAgY3VybCAtLXZlcnNpb24gd2lsbCBsaXN0ICdEZWJ1ZycgZmVhdHVyZSBmb3IgZGVidWcgZW5hYmxlZCBidWlsZHMsIGFuZAogIHdpbGwgbGlzdCAnVHJhY2tNZW1vcnknIGZlYXR1cmUgZm9yIGN1cmwgZGVidWcgbWVtb3J5IHRyYWNraW5nIGNhcGFibGUKICBidWlsZHMuIFRoZXNlIGZlYXR1cmVzIGFyZSBpbmRlcGVuZGVudCBhbmQgY2FuIGJlIGNvbnRyb2xsZWQgd2hlbiBydW5uaW5nCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFdoZW4gLS1lbmFibGUtZGVidWcgaXMgZ2l2ZW4gYm90aCBmZWF0dXJlcyB3aWxsIGJlCiAgZW5hYmxlZCwgdW5sZXNzIHNvbWUgcmVzdHJpY3Rpb24gcHJldmVudHMgbWVtb3J5IHRyYWNraW5nIGZyb20gYmVpbmcgdXNlZC4KCiAgSW50ZXJuYWxseSwgZGVmaW5pdGlvbiBvZiBwcmVwcm9jZXNzb3Igc3ltYm9sIERFQlVHQlVJTEQgcmVzdHJpY3RzIGNvZGUKICB3aGljaCBpcyBvbmx5IGNvbXBpbGVkIGZvciBkZWJ1ZyBlbmFibGVkIGJ1aWxkcy4gQW5kIHN5bWJvbCBDVVJMREVCVUcgaXMKICB1c2VkIHRvIGRpZmZlcmVudGlhdGUgY29kZSB3aGljaCBpcyBfb25seV8gdXNlZCBmb3IgbWVtb3J5IHRyYWNraW5nLgoKWWFuZyBUc2UgKDkgSnVuIDIwMDkpCi0gRGFuaWVsIFN0ZWluYmVyZyBwb2ludGVkIG91dCB0aGF0IEN1cmxfRm9ybUluaXQoKSBpbiBmb3JtZGF0YS5jIHdhcyBub3QKICBpbml0aWFsaXppbmcgdGhlIGZyZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIHRoaXMgdHJpZ2dlcmVkIGEgY29tcGlsZXIKICB3YXJuaW5nLCBhbHNvIHByb3ZpZGVkIGEgZnJpZW5kbHkgc3VnZ2VzdGlvbiBvbiBob3cgdG8gZml4IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA5KQotIENsYWVzIEpha29ic3NvbiBwcm92aWRlZCBhIHBhdGNoIGZvciBsaWJjdXJsLU5TUyB0aGF0IGZpeGVkIGEgYmFkIHJlZmNvdW50CiAgaXNzdWUgd2l0aCBjbGllbnQgY2VydHMgdGhhdCBjYXVzZWQgaXNzdWVzIGxpa2Ugc2VnZmF1bHRzLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOS0wNS8wMzE2Lmh0bWwKCi0gVHJpZ2dlcmVkIGJ5IGJ1ZyByZXBvcnQgIzI3OTg4NTIgYW5kIHRoZSBwYXRjaCBpbiB0aGVyZSwgSSBmaXhlZCBjb25maWd1cmUKICB0byBkZXRlY3QgZ251dGxzIGJ1aWxkIG9wdGlvbnMgd2l0aCBwa2ctY29uZmlnIG9ubHkgYW5kIG5vdCBsaWJnbnV0bHMtY29uZmlnCiAgYW55bW9yZSBzaW5jZSBHbnVUTFMgaGFzIHN0b3BwZWQgZGlzdHJpYnV0aW5nIHRoYXQgdG9vbC4gSWYgYW4gZXhwbGljaXQgcGF0aAogIGlzIGdpdmVuIHRvIGNvbmZpZ3VyZSwgd2Ugd2lsbCBpbnN0ZWFkIGd1ZXNzIG9uIGhvdyB0byBsaW5rIGFuZCB1c2UgdGhhdAogIGxpYi4gSSBkaWQgbm90IHVzZSB0aGUgcGF0Y2ggZnJvbSB0aGUgYnVnIHJlcG9ydC4KCllhbmcgVHNlICg4IEp1biAyMDA5KQotIElnb3IgTm92b3NlbHRzZXYgYWRqdXN0ZWQgTWFrZWZpbGUudnh3b3JrcyB0byBnZXQgc291cmNlcyBhbmQgaGVhZGVycwogIGluY2x1ZGVkIGZyb20gTWFrZWZpbGUuaW5jLCBhbmQgcHJvdmlkZWQgZG9jc1xJTlNUQUxMIFZ4V29ya3Mgc2VjdGlvbi4KCi0gSSByZW1vdmVkIGJ1aWxkY29uZi5iYXQgZnJvbSByZWxlYXNlIGFuZCBkYWlseSBzbmFwc2hvdCBhcmNoaXZlcy4gVGhpcwogIGZpbGUgaXMgb25seSBmb3IgQ1ZTIHRyZWUgY2hlY2tvdXQgYnVpbGRzLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA5KQotIEVyaWMgV29uZyBmaXhlZCAtLW5vLWJ1ZmZlciB0byBhY3R1YWxseSBzd2l0Y2ggb2ZmIG91dHB1dCBidWZmZXJpbmcuIEJlZW4KICBicm9rZW4gc2luY2UgNy4xOS4wCgpCaWxsIEhvZmZtYW4gKDYgSnVuIDIwMDkpCi0gQWRkZWQgc29tZSBjbWFrZSBkb2NzIGFuZCBmaXhlZCBzb2NrbGVuX3QgaW4gdGhlIGJ1aWxkLgoKWWFuZyBUc2UgKDUgSnVuIDIwMDkpCi0gSm9obiBFLiBNYWxtYmVyZyBwcm92aWRlZCBWTVMgc3BlY2lmaWMgcGF0Y2g6ICJUaGlzIGZpeGVzIGFuIGV4aXN0aW5nIGJ1ZwogIGluIHVybGdsb2IuYyB3aGVyZSBpdCB3YXMgbm90IGNvbnZlcnRpbmcgdGhlIEN1cmwgVW5peCBleGl0IGNvZGUgdG8gYSBWTVMKICBEQ0wgY29tcGF0aWJsZSBleGl0IGNvZGUuICBUaGlzIGZpeCByZXF1aXJlZCB0aGUgZW5oYW5jZW1lbnQgZGVzY3JpYmVkIG5leHQuCiAgVGhpcyBhbHNvIGFkZHMgYW4gZW5oYW5jZW1lbnQgdG8gbWFpbi5jIHNvIHRoYXQgd2hlbiBjdXJsIGlzIHJ1biB1bmRlciBhCiAgVW5peCBzaGVsbCBsaWtlIEJhc2ggb24gVk1TLCBpdCB3aWxsIHJldHVybiB0aGUgc3RhbmRhcmQgVW5peCBleGl0IGNvZGVzCiAgYW5kIG1lc3NhZ2VzLiIgQW5kIGFub3RoZXIgcGF0Y2ggZm9yIGRvY3MvZXhhbXBsZXMuCgogIEkgaW50cm9kdWNlZCBvcy1zcGVjaWZpYy5jIGFuZCBvcy1zcGVjaWZpYy5oIGZvciB1c2UgaW4gY3VybCB0b29sIGNvZGUKICBhbmQgYWRqdXN0ZWQgSm9obiBFLiBNYWxtYmVyZydzIHBhdGNoIHBsYWNlbWVudCB0byB1c2UgdGhlc2UgbmV3IGZpbGVzCiAgYXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgbWFpbi5jIGZyb20gZ3Jvd2luZyBhZCBpbmZpbml0dW0uIENvZGUgYWxyZWFkeQogIGV4aXN0aW5nIGluIG1haW4uYyB3aGljaCBpcyBPUyBzcGVjaWZpYyBzaG91bGQgYmUgbW92ZWQgaW50byB0aGVzZSBmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBKdW5lIDIwMDkpCi0gU2V0dGluZyB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBmcm9tIHlvdXIgYXBwIHdoZW4geW91IGRvIGEgUE9TVCBvciBQVVQKICBpcyBhbG1vc3QgYWx3YXlzIGEgVkVSWSBCQUQgSURFQS4gWWV0IHRoZXJlIGFyZSBzdGlsbCBhcHBzIG91dCB0aGVyZSBkb2luZwogIHRoaXMsIGFuZCBub3cgcmVjZW50bHkgaXQgdHJpZ2dlcmVkIGEgYnVnL3NpZGUtZWZmZWN0IGluIGxpYmN1cmwgYXMgd2hlbgogIGxpYmN1cmwgc2VuZHMgYSBQT1NUIG9yIFBVVCB3aXRoIE5UTE0sIGl0IHNlbmRzIGFuIGVtcHR5IHBvc3QgZmlyc3Qgd2hlbiBpdAogIGtub3dzIGl0IHdpbGwganVzdCBnZXQgYSA0MDEvNDA3IGJhY2suIElmIHRoZSBhcHAgdGhlbiByZXBsYWNlZCB0aGUKICBDb250ZW50LUxlbmd0aCBoZWFkZXIsIGl0IGNhdXNlZCB0aGUgc2VydmVyIHRvIHdhaXQgZm9yIGlucHV0IHRoYXQgbGliY3VybAogIHdvdWxkbid0IHNlbmQuIEFhcm9uIE9uZWFsIHJlcG9ydGVkIHRoaXMgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMyNzk5MDA4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3OTkwMDgpIGFuZCBoZWxwZWQgdXMgdmVyaWZ5IHRoZSBmaXguCgpZYW5nIFRzZSAoNCBKdW4gMjAwOSkKLSBJZ29yIE5vdm9zZWx0c2V2IHByb3ZpZGVkIHBhdGNoZXMgYW5kIGluZm9ybWF0aW9uLCB0aGF0IGFmdGVyIHNvbWUKICBhZGp1c3RtZW50cyB0byBiZXR0ZXIgZml0IGN1cmwncyB3YXkgb2YgZG9pbmcgdGhpbmdzLCBoYXZlIHJlc3VsdGVkCiAgaW4gdGhlIHBvc2liaWxpdHkgb2YgYnVpbGRpbmcgbGliY3VybCBmb3IgVnhXb3Jrcy4KCkRhbmllbCBGYW5kcmljaCAoMiBKdW5lIDIwMDkpCi0gQ2hlY2tlZCBpbiBhIEdvb2dsZSBBbmRyb2lkIG1ha2UgZmlsZS4gVG8gdXNlIGl0LCB5b3UgbXVzdCBmaXJzdAogIGNyZWF0ZSBhIGNvbmZpZy5oIGZpbGUgYnkgcnVubmluZyBjb25maWd1cmUgaW4gdGhlIEFuZHJvaWQgZW52aXJvbm1lbnQsCiAgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGJlIGVhc3kgdG8gZG8uIElmIG5vIGVhc3kgd2F5IGNhbiBiZSBmb3VuZCwgYQogIHN0YXRpYyBjb25maWctYW5kcm9pZC5oIG1heSBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIGNoZWNrZWQgaW4gdG8gdGhlCiAgbGliY3VybCBzb3VyY2UgdHJlZS4KCkRhbmllbCBTdGVuYmVyZyAoMSBKdW5lIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGJldHRlciBmaW5kIGFuZCB1c2UgTlNTCiAgd2l0aG91dCBwa2ctY29uZmlnLgoKWWFuZyBUc2UgKDEgSnVuIDIwMDkpCi0gSm9obiBFLiBNYWxtYmVyZyBwcm92aWRlZCBhIFZNUyBzcGVjaWZpYyBjbGVhbi11cCBmb3IgY3VybC5oLCBhbmQgcG9pbnRlZAogIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcyBmYWlsaW5nIHRvIGRldGVjdCB0aGUgdGltZXZhbCBzdHJ1Y3Qgb24KICBWTVMgd2hlbiBidWlsZGluZyB3aXRoIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgdW5kZWZpbmVkIGR1ZSB0byBkZWZpbml0aW9uCiAgdGFraW5nIHBsYWNlIGluIHNvY2tldC5oIGluc3RlYWQgb2YgdGltZS5oLiAgSSBoYXZlIGFkanVzdGVkIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBhbHNvIGluY2x1ZGUgdGhpcyBoZWFkZXIgd2hlbiBjaGVja2luZyBzdHJ1Y3QgdGltZXZhbC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgTWF5IDIwMDkpCi0gRnJhbmsgTWNHZW91Z2ggcHJvdmlkZWQgYSBzbWFsbCBPcGVuU1NMICNpbmNsdWRlIGZpeCB0byBtYWtlIGxpYmN1cmwgY29tcGlsZQogIGZpbmUgd2l0aCBOb2tpYSA1dGggZWRpdGlvbiAxLjAgU0RLIGZvciBTeW1iaWFuLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGEgY2FsbCB0byBhIE9wZW5TU0wgZnVuY3Rpb24gdGhhdCBkaWRuJ3QgY2hlY2sKICBmb3IgYSBmYWlsdXJlIHByb3Blcmx5LgoKLSBNaWtlIENyb3dlIHBvaW50ZWQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX1VTRVJQV0QgdG8gTlVMTCB1c2VkIHRvIGNsZWFyCiAgdGhlIGF1dGggY3JlZGVudGlhbHMgYmFjayBpbiA3LjE5LjAgYW5kIGVhcmxpZXIgd2hpbGUgbm93IHlvdSBoYXZlIHRvIHNldCAiIgogIHRvIGdldCB0aGUgc2FtZSBlZmZlY3QuIEhpcyBwYXRjaCBicmluZ3MgYmFjayB0aGUgYWJpbGl0eSB0byB1c2UgTlVMTC4KCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIGxpYmN1cmwtTlNTIHRvIGJ1aWxkIGZpbmUgZXZlbiB3aXRob3V0IHRoZQogIFBLMTFfQ3JlYXRlR2VuZXJpY09iamVjdCgpIGZ1bmN0aW9uLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXkgMjAwOSkKLSBidWcgcmVwb3J0ICMyNzk2MzU4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzk2MzU4KSBwb2ludGVkCiAgb3V0IHRoYXQgdGhlIGNvb2tpZSBwYXJzZXIgd291bGQgbGVhayBtZW1vcnkgd2hlbiBpdCBwYXJzZXMgY29va2llcyB0aGF0IGFyZQogIHJlY2VpdmVkIHdpdGggZG9tYWluLCBwYXRoIGV0YyBzZXQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgaGVhZGVyLiBXaGlsZQogIHN1Y2ggYSBjb29raWUgaXMgcXVlc3Rpb25hYmxlLCB0aGV5IG9jY3VyIGluIHRoZSB3aWxkIGFuZCBsaWJjdXJsIG5vIGxvbmdlcgogIGxlYWtzIG1lbW9yeSBmb3IgdGhlbS4gSSBhZGRlZCBzdWNoIGEgaGVhZGVyIHRvIHRlc3QgY2FzZSA4LgoKRGFuaWVsIEZhbmRyaWNoICgyMiBNYXkgMjAwOSkKLSBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZGlnZXN0IGNvZGUgdGhhdCBjYXVzZWQgYSB2YWxncmluZCBlcnJvciBpbiB0ZXN0IDU1MS4KCkRhbmllbCBGYW5kcmljaCAoMjAgTWF5IDIwMDkpCi0gQWRkZWQgIm5vbi1leGlzdGluZyBob3N0IiB0ZXN0IGtleXdvcmRzIHRvIG1ha2UgaXQgZWFzeSB0byBza2lwIHRob3NlCiAgdGVzdHMgb24gbWFjaGluZXMgdGhhdCBoYXZlIGJyb2tlbiBETlMgY29uZmlndXJhdGlvbnMgKHN1Y2ggYXMKICB0aG9zZSBjb25maWd1cmVkIHRvIHVzZSBPcGVuRE5TKS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTWF5IDIwMDkpCi0gS2FtaWwgRHVka2EgYnJvdWdodCB0aGUgcGF0Y2ggZnJvbSB0aGUgUmVkaGF0IGJ1ZyBlbnRyeQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDI3OTY2IHdoaWNoIHdhcyBsaWJjdXJsIGNsb3NpbmcKICBhIGJhZCBmaWxlIGRlc2NyaXB0b3Igd2hlbiBjbG9zaW5nIGRvd24gdGhlIEZUUCBkYXRhIGNvbm5lY3Rpb24uICBDYW9sYW4KICBNY05hbWFyYSBzZWVtcyB0byBiZSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIGl0LgoKVmVyc2lvbiA3LjE5LjUgKDE4IE1heSAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxNyBNYXkgMjAwOSkKLSBKYW1lcyBCdXJzYSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgZml4ZWQgYSBwcm9ibGVtIHdpdGgKICBub19wcm94eSB3aGljaCBtYWRlIGl0IG5vdCBza2lwIHRoZSBwcm94eSBpZiB0aGUgVVJMIGVudGVyZWQgY29udGFpbmVkIGEKICB1c2VyIG5hbWUuIEkgYWRkZWQgdGVzdCBjYXNlIDExMDEgdG8gdmVyaWZ5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXkgMjAwOSkKLSBCYWxpbnQgU3ppbGFrc3ppIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBsaWJjdXJsIGRpZCBnemlwIGRlY29tcHJlc3Npb24KICBvZiBzdHJlYW1zIHRoYXQgaGFkIHNvbWUgcGFydHMgKGxlZ2l0aW1hdGVseSkgbWlzc2luZy4gV2Ugbm93IHByb3ZpZGUgYW5kIHVzZQogIGEgcHJvcGVyIGNsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBjb250ZW50IGVuY29kaW5nIHN1Ym1vZHVsZS4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDUvMDA5Mi5odG1sCgotIEthbWlsIER1ZGthIHByb3ZpZGVkIGEgZml4IGZvciBsaWJjdXJsLU5TUyByZXBvcnRlZCBieSBNaWNoYWVsIENyb25lbndvcnRoCiAgYXQgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00NTM2MTIjYzEyCgogIElmIGFuIGluY29ycmVjdCBwYXNzd29yZCBpcyBnaXZlbiB3aGlsZSBsb2FkaW5nIGEgcHJpdmF0ZSBrZXksIGxpYmN1cmwgZW5kcwogIHVwIGluIGFuIGluZmluaXRlIGxvb3AgY29uc3VtaW5nIG1lbW9yeS4gVGhlIGJ1ZyBpcyBjcml0aWNhbC4KCi0gSSBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIE5UTE0sIFBPU1QgYW5kIHRoZW4gZm9sbG93aW5nIGEgMzAyIHJlZGlyZWN0LAogIGFzIHJlcG9ydGVkIGJ5IEViZW5lemVyIElrb25uZSAob24gY3VybC11c2VycykgYW5kIExhdXJlbnQgUmFicmV0IChvbgogIGN1cmwtbGlicmFyeSkuIFRoZSB0cmFuc2ZlciB3YXMgbWlzdGFrZW5seSBtYXJrZWQgdG8gZ2V0IG1vcmUgZGF0YSB0byBzZW5kCiAgYnV0IHNpbmNlIGl0IGRpZG4ndCBhY3R1YWxseSBoYXZlIHRoYXQsIGl0IGp1c3QgaHVuZyB0aGVyZS4uLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBNYXkgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGNvcnJlY3RseSBwb2ludGVkIG91dCBhbiBvdmVyLWFsbG9jIHdpdGggb25lIHdhc3RlZAogIGJ5dGUgaW4gdGhlIGRpZ2VzdCBjb2RlLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDkpCi0gUmVtb3ZlZCBET1MgYW5kIFRQRiBwYWNrYWdlJ3Mgc3ViZGlyZWN0b3J5IE1ha2VmaWxlLmFtLCBpdCB3YXMgb25seSB1c2VkCiAgdG8gaW5jbHVkZSBzb21lIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gdGFyYmFsbCBzZXJ2aW5nIG5vIG90aGVyIHB1cnBvc2UuCiAgRmlsZXMgZnJvbSB0aGUgRE9TIGFuZCBUUEYgc3ViZGlyZWN0b3JpZXMgYXJlIG5vdyBpbmNsdWRlZCBpbiB0aGUgRVhUUkFfRElTVAogIG9mIHRoZSBNYWtlZmlsZSBpbiB0aGUgcGFyZW50IHN1YmRpcmVjdG9yeS4KCllhbmcgVHNlICg4IE1heSAyMDA5KQotIENoYW5nZWQgaG9zdCBuYW1lIGxpdGVyYWwgaW4gc2V2ZXJhbCB0ZXN0cyB0byBvbmUgdW5kZXIgdGhlIGhheHguc2UgZG9tYWluLgoKLSBSZW5hbWVkIHZjNiB3b3Jrc3BhY2UgYW5kIHByb2plY3QgZmlsZXMgdG8gYXZvaWQgZmlsZW5hbWUgY2xhc2ggd2hlbiB1c2VkCiAgZm9yIGNvbnZlcnNpb24gdG8gbGF0ZXIgVlMgdmVyc2lvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDggTWF5IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZml4ZWQgYnVnIHJlcG9ydCAjMjc4NDA1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg0MDU1KSBpZGVudGlmeWluZyBhIHByb2JsZW0gdG8KICBjb25uZWN0IHRvIFNPQ0tTIHByb3hpZXMgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLiBJdCB0dXJuZWQgb3V0IHRvCiAgYWxtb3N0IG5vdCB3b3JrIGF0IGFsbCBwcmV2aW91c2x5LiBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBUQ1AgY29ubmVjdCB0bwogIGJlIHByb3Blcmx5IHZlcmlmaWVkIGJlZm9yZSBkb2luZyB0aGUgU09DS1MgbWFnaWMuCgogIFRoZXJlJ3Mgc3RpbGwgYSBmbGF3IGluIHRoZSBGVFAgY29kZSBmb3IgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOSkKLSBNYWRlIHRoZSBTT19TTkRCVUYgc2V0dGluZyBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiBzb2NrZXQgZm9yIGZ0cCB1cGxvYWRzIGFzCiAgd2VsbC4gU2VlIGNoYW5nZSAyOCBBcHIgMjAwOS4KCllhbmcgVHNlICg3IE1heSAyMDA5KQotIEZpeGVkIGFuIGlzc3VlIGFmZmVjdGluZyBGVFAgdHJhbnNmZXJzLCBpbnRyb2R1Y2VkIHdpdGggdGhlIHRyYW5zZmVyLmMKICBwYXRjaCBjb21taXR0ZWQgTWF5IDQuCgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMDkpCi0gTWFuIHBhZ2UgKnJvZmYgcHJvYmxlbXMgZml4ZWQgdGhhbmtzIHRvIGlucHV0IGZyb20gQ29saW4gV2F0c29uLiBQcm9ibGVtcwogIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gcGFja2FnZS4KCi0gVmlqYXkgRyBmaWxlZCBidWcgcmVwb3J0ICMyNzIzMjM2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMzYpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoCiAgbGliY3VybCdzIFRGVFAgY29kZSBhbmQgaXRzIGxhY2sgb2YgZGVhbGluZyB3aXRoIHRoZSBPQUNLIHBhY2tldC4KCllhbmcgVHNlICg1IE1heSAyMDA5KQotIEZpeGVkIHRoZSAtLWZ0cC1wb3J0IGFkZHJlc3Mgb2YgdGVzdCAjMjUxIHRvIHRoZSBDTElFTlRJUCBhZGRyZXNzLCBhbmQKICByZXZlcnRlZCB0aGUgY2hhbmdlIGFmZmVjdGluZyB0ZXN0IHN1aXRlIGhhcm5lc3MgY29tbWl0dGVkIDQgTWF5LgoKRGFuaWVsIFN0ZW5iZXJnICg1IE1heSAyMDA5KQotIEluc3BpcmVkIGJ5IE1pY2hhZWwgU21pdGgncyBzZXNzaW9uIGlkIGZpeCBmb3IgT3BlblNTTCwgSSBkaWQgdGhlCiAgY29ycmVzcG9uZGluZyBmaXggaW4gdGhlIEdudVRMUyBjb2RlOiBtYWtlIHN1cmUgdG8gc3RvcmUgdGhlIG5ldyBzZXNzaW9uIGlkCiAgaW4gY2FzZSB0aGUgcHJldmlvdXMgcmUtdXNlZCBvbmUgaXMgcmVqZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTWF5IDIwMDkpCi0gTWljaGFlbCBTbWl0aCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjc4NjI1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg2MjU1KSB3aXRoIGEgcGF0Y2gsIGlkZW50aWZ5aW5nIGhvdwogIGxpYmN1cmwgZGlkIG5vdCBkZWFsIHdpdGggU1NMIHNlc3Npb24gaWRzIHByb3Blcmx5IGlmIHRoZSBzZXJ2ZXIgcmVqZWN0ZWQgYQogIHJlLXVzZSBvZiBvbmUuIFN0YXJ0aW5nIG5vdywgaXQgd2lsbCBmb3JnZXQgdGhlIHJlamVjdGVkIG9uZSBhbmQgcmVtZW1iZXIKICB0aGUgbmV3LiBUaGlzIGNoYW5nZSB3YXMgZm9yIE9wZW5TU0wgb25seSwgaXQgaXMgbGlrZWx5IHRoYXQgb3RoZXIgU1NMIGxpYgogIGNvZGUgbmVlZHMgc2ltaWxhciBmaXhlcy4KCllhbmcgVHNlICg0IE1heSAyMDA5KQotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyAidHJhbnNmZXIuYyBmaXhlcyBmb3IgQ1VSTF9ET19MSU5FRU5EX0NPTlYgYW5kCiAgbm9uLUFTQ0lJIHBsYXRmb3JtIEhUVFAgcmVxdWVzdHMiIHBhdGNoIGFkZHJlc3NpbmcgdHdvIEhUVFAgUFVUIHByb2JsZW1zOgogIDEpIE9uIG5vbi1BU0NJSSBwbGF0Zm9ybXMgbm90IGFsbCBvZiB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgb2YgdGhlIFBVVCBhcmUKICBiZWluZyB0cmFuc2xhdGVkIHRvIEFTQ0lJLiAgMikgT24gYWxsIHBsYXRmb3JtcyB0aGUgbGluZSBlbmRpbmdzIG9mIHBhcnQgb2YKICB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgYXJlIG1hbmdsZWQgZnJvbSBDUkxGIHRvIENSQ1JMRiBpZiBkYXRhLT5zZXQuY3JsZiBvcgogIGRhdGEtPnNldC5wcmVmZXJfYXNjaWkgYXJlIHNldCAoZGVwZW5kaW5nIG9uIENVUkxfRE9fTElORUVORF9DT05WKS4KCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoIHRvIGZpeCB0ZXN0IHN1aXRlIGhhcm5lc3MgdG8gYWxsb3cgdGVzdCBGVFAKICBzZXJ2ZXIgYW5kIGNsaWVudCBvbiBkaWZmZXJlbnQgbWFjaGluZXMsIHByb3ZpZGluZyBGVFAgY2xpZW50IGFkZHJlc3Mgd2hlbgogIHJ1bm5pbmcgdGhlIEZUUCB0ZXN0IHNlcnZlci4KCkRhbmllbCBGYW5kcmljaCAoMyBNYXkgMjAwOSkKLSBBZGRlZCBhbmQgZGlzYWJsZWQgdGVzdCBjYXNlIDU2MyB3aGljaCBzaG93cyBLTk9XTl9CVUdTICM1OS4gIFRoZSBidWcKICByZXBvcnQgZmFpbGVkIHRvIG1lbnRpb24gdGhhdCBhIHByb3h5IG11c3QgYmUgdXNlZCB0byByZXByb2R1Y2UgaXQuCgpZYW5nIFRzZSAoMiBNYXkgMjAwOSkKLSBVc2UgYSBidWlsZC10aW1lIGNvbmZpZ3VyZWQgY3VybF9zb2NrbGVuX3QgZGF0YSB0eXBlIGluc3RlYWQgb2Ygc29ja2xlbl90LgoKWWFuZyBUc2UgKDEgTWF5IDIwMDkpCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoZXMgIlRQRi1wbGF0Zm9ybSBzcGVjaWZpYyBjaGFuZ2VzIHRvIHZhcmlvdXMKICBmaWxlcyIgYW5kICJodHRwLmMgZml4IHRvIEN1cmxfcHJveHlDT05ORUNUIGZvciBub24tQVNDSUkgcGxhdGZvcm1zIiwgdGhlCiAgZm9ybWVyIHdpdGggbWlub3IgZWRpdHMuCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEFwciAyMDA5KQotIEkgd2FzIGdvaW5nIHRvIGZpeCBpc3N1ZSAjNTkgaW4gS05PV05fQlVHUwoKICBJZiB0aGUgQ1VSTE9QVF9QT1JUIG9wdGlvbiBpcyB1c2VkIG9uIGFuIEZUUCBVUkwgbGlrZQogICJmdHA6Ly9leGFtcGxlLmNvbS9maWxlO3R5cGU9QSIgdGhlICI7dHlwZT1BIiBpcyBzdHJpcHBlZCBvZmYuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDU2MiB0byB2ZXJpZnksIG9ubHkgdG8gZmluZCBvdXQgdGhhdCBJIGNvdWxkbid0IHJlcGVhdAogIHRoaXMgYnVnIHNvIEkgaGVyZWJ5IGNvbnNpZGVyIGl0IG5vdCBhIGJ1ZyBhbnltb3JlIQoKRGFuaWVsIFN0ZW5iZXJnICgyOSBBcHIgMjAwOSkKLSBCYXNlZCBvbiBidWcgcmVwb3J0ICMyNzIzMjE5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzIzMjE5KQogIEkndmUgbm93IG1hZGUgVEZUUCAiY29ubmVjdGlvbnMiIG5vdCBiZWluZyBrZXB0IGZvciByZS11c2Ugd2l0aGluIGxpYmN1cmwuCiAgVEZUUCBpcyBVRFAtYmFzZWQgc28gdGhlIGJlbmVmaXQgd2FzIHJlYWxseSBsb3cgKGlmIGV2ZW4gZXhpc3RpbmcpIHRvIGJlZ2luCiAgd2l0aCBzbyBpbnN0ZWFkIG9mIHRyYWNraW5nIGRvd24gdG8gZml4IHRoaXMgcHJvYmxlbSB3ZSBpbnN0ZWFkIHJlbW92ZWQgdGhlCiAgcmUtdXNlLiBJIGFsc28gZW5hYmxlZCB0ZXN0IGNhc2UgMTA5OSB0aGF0IEkgd3JvdGUgYSBmZXcgZGF5cyBhZ28gdG8gdmVyaWZ5CiAgdGhhdCB0aGlzIGNoYW5nZSBmaXhlcyB0aGUgcmVwb3J0ZWQgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjc4MzA5MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzgzMDkwKSBwb2ludGluZyBvdXQgdGhhdCBvbiB3aW5kb3dzCiAgd2UgbmVlZCB0byBncm93IHRoZSBTT19TTkRCVUYgYnVmZmVyIHNvbWV3aGF0IHRvIGdldCByZWFsbHkgZ29vZCB1cGxvYWQKICBzcGVlZHMuIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODIzNzY0IGhhcyB0aGUgZGV0YWlscy4gRnJpZW5kcwogIGNvbmZpcm1lZCB0aGF0IHNpbXBseSBhZGRpbmcgMzIgdG8gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBlbm91Z2guCgotIEJ1ZyByZXBvcnQgIzI3MDkwMDQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MDkwMDQpIGJ5IFRpbQogIENoZW4gcG9pbnRlZCBvdXQgaG93IGN1cmwgY291bGRuJ3QgdXBsb2FkIHdpdGggcmVzdW1lIHdoZW4gcmVhZGluZyBmcm9tIGEKICBwaXBlLgoKICBUaGlzIGVuZGVkIHVwIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyByZXR1cm4gY29kZSBmb3IgdGhlCiAgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gY2FsbGJhY2sgdGhhdCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZSBzZWVrIGZhaWxlZCBidXQKICB0aGF0IGxpYmN1cmwgbWF5IHRyeSB0byByZXNvbHZlIHRoZSBzaXR1YXRpb24gYW55d2F5LiBJbiBvdXIgY2FzZSB0aGlzIG1lYW5zCiAgbGliY3VybCB3aWxsIGF0dGVtcHQgdG8gaW5zdGVhZCByZWFkIHRoYXQgbXVjaCBkYXRhIGZyb20gdGhlIHN0cmVhbSBpbnN0ZWFkCiAgb2Ygc2Vla2luZyBhbmQgdGhhdCB3YXkgY3VybCBjYW4gbm93IHVwbG9hZCB3aXRoIHJlc3VtZSB3aGVuIGRhdGEgaXMgcmVhZAogIGZyb20gYSBzdHJlYW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEFwciAyMDA5KQotIEJ1ZyByZXBvcnQgIzI3Nzk3MzMgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3Nzk3MzMpIGJ5IFN2ZW4KICBXZWdlbmVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FIGRpZG4ndCB3b3JrIHdpdGggdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEFwciAyMDA5KQotIEthbWlsIER1ZGthIGZpeGVkIGFub3RoZXIgTlNTLXJlbGF0ZWQgbGVhayB3aGVuIGNsaWVudCBjZXJ0cyB3ZXJlIHVzZWQuCgotIEJ1ZyByZXBvcnQgIzI3NzkyNDUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3NzkyNDUpIGJ5IFJhaW5lcgogIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBtYW4gcGFnZSBkaWRuJ3QgdGVsbCB0aGF0IHRoZSAqX3Byb3h5CiAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQgbG93ZXIgY2FzZSBvciBVUFBFUiBDQVNFIGFuZCB0aGUKICBsb3dlciBjYXNlIHRha2VzIHByZWNlZGVuY2UsCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBBbWlnYSwgUmlzY09TIGFuZCBWQzYgYnVpbGQgZmlsZXMuCgpZYW5nIFRzZSAoMjEgQXByIDIwMDkpCi0gTW92ZWQgcG90ZW50aWFsIGluY2x1c2lvbiBvZiBzeXN0ZW0ncyBtYWxsb2MuaCBhbmQgbWVtb3J5LmggaGVhZGVyIGZpbGVzIHRvCiAgc2V0dXBfb25jZS5oLiAgSW5jbHVzaW9uIG9mIGVhY2ggaGVhZGVyIGZpbGUgaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YKICBORUVEX01BTExPQ19IIGFuZCBORUVEX01FTU9SWV9IIHJlc3BlY3RpdmVseS4KCiAgUmVuYW1lZCBsaWJjdXJsJ3MgbWVtb3J5LmggdG8gY3VybF9tZW1vcnkuaAoKRGFuaWVsIFN0ZW5iZXJnICgyMCBBcHIgMjAwOSkKLSBMZWFuaWMgTGVmZXZlciByZXBvcnRlZCBhIGNyYXNoIGFuZCBkaWQgc29tZSBkZXRhaWxlZCByZXNlYXJjaCBvbiB3aHkgYW5kCiAgaG93IGl0IG9jY3VycyAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA0LzAyODkuaHRtbCkuIFRoZQogIGNvbmNsdXNpb24gd2FzIHRoYXQgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgYW5kIEN1cmxfZG9uZSgpIGlzIGNhbGxlZCBmb3IKICB0aGUgY29ubmVjdGlvbiwgZnRwX2RvbmUoKSBjb3VsZCBhdCB0aW1lcyByZXR1cm4gYW5vdGhlciBlcnJvciBjb2RlIHRoYXQKICB0aGVuIHdvdWxkIHRha2UgcHJlY2VkZW5jZSBhbmQgdGhhdCBuZXcgY29kZSBjb25mdXNlZCBleGlzdGluZyBsb2dpYyB0aGF0CiAgd29ya3MgZm9yIHRoZSBmaXJzdCBlcnJvciBjb2RlIChDVVJMRV9TRU5EX0VSUk9SKSBvbmx5LgoKLSBHaXNsZSBWYW5lbSBub3RpY2VkIHRoYXQgLS1saWJ0b29sIHdvdWxkIHByb2R1Y2UgYm9ndXMgc3RyaW5ncyBhdCB0aW1lcyBmb3IKICBPQkpFQ1RQT0lOVCBvcHRpb25zLiBOb3cgd2UndmUgaW50cm9kdWNlZCBhIG5ldyBmdW5jdGlvbiAtIG15X3NldG9wdF9zdHIgLQogIHdpdGhpbiB0aGUgYXBwIGZvciBzZXR0aW5nIHBsYWluIHN0cmluZyBvcHRpb25zIHRvIGF2b2lkIHRoZSByaXNrIG9mIHRoaXMKICBtaXN0YWtlIGhhcHBlbmluZy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgQXByIDIwMDkpCi0gUHJhbW9kIFNoYXJtYSByZXBvcnRlZCBhbmQgdHJhY2tlZCBkb3duIGEgYnVnIHdoZW4gZG9pbmcgRlRQIG92ZXIgYSBIVFRQCiAgcHJveHkuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGVhY2gKICByZXF1ZXN0LiBJbiBoaXMgY2FzZSBpdCBoYWQgdGhlIHdlaXJkIHNpZGUtZWZmZWN0IHRoYXQgaXQga2lsbGVkIE5UTE0gYXV0aAogIGZvciB0aGUgcHJveHkgY2F1c2luZyBhbiBpbmlmaW5pdGUgbG9vcCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMTA5OCB0byB2ZXJpZnkgdGhpcyBmaXguIFRoZSB0ZXN0IGNhc2UgZG9lcyBob3dldmVyIG5vdAogIHByb3Blcmx5IHZlcmlmeSB0aGF0IHRoZSB0cmFuc2ZlcnMgYXJlIGRvbmUgcGVyc2lzdGVudGx5IC0gYXMgSSBjb3VsZG4ndAogIHRoaW5rIG9mIGEgY2xldmVyIHdheSB0byBhY2hpZXZlIGl0IHJpZ2h0IG5vdyAtIGJ1dCB5b3UgbmVlZCB0byByZWFkIHRoZQogIHN0ZGVyciBvdXRwdXQgYWZ0ZXIgYSB0ZXN0IHJ1biB0byBzZWUgdGhhdCBpdCB0cnVseSBkaWQgdGhlIHJpZ2h0IHRoaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBBcHIgMjAwOSkKLSBidWcgcmVwb3J0ICMyNzI3OTgxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzI3OTgxKSBieSBNYXJ0aW4KICBTdG9yc2r2IHBvaW50ZWQgb3V0IGhvdyBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIDAgY291bGQgYmUgZG93bnJpZ2h0CiAgY29uZnVzaW5nIGFzIGl0IHNldCB0aGUgbWV0aG9kIHRvIGVpdGhlciBHRVQgb3IgSEVBRC4gVGhlIGV4YW1wbGUgaGUgc2hvd2VkCiAgbG9va2VkIGxpa2U6CgogICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfUFVULCAxKTsKICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CgogIFRoZSBuZXcgd2F5IGRvZXNuJ3QgYWx0ZXIgdGhlIG1ldGhvZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBhYm91dCB0byBzdGFydC4gSWYKICBDVVJMT1BUX05PQk9EWSBpcyB0aGVuIDEgdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIEhFQUQuIElmIENVUkxPUFRfTk9CT0RZIGlzCiAgMCBhbmQgdGhlIHJlcXVlc3QgaGFwcGVucyB0byBoYXZlIGJlZW4gc2V0IHRvIEhFQUQsIGl0IHdpbGwgdGhlbiBpbnN0ZWFkIGJlCiAgc2V0IHRvIEdFVC4gSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBsZXNzIHN1cnByaXNpbmcgdG8gdXNlcnMsIGFuZCBob3BlZnVsbHkKICBub3QgaGl0IGFueSBleGlzdGluZyB1c2VycyBiYWRseS4KCi0gVG9zaGlvIEt1cmF0b21pIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgcHJvYmxlbSB3aXRoIGxpYmN1cmwrTlNTIHRoYXQgdHVybmVkCiAgb3V0IHRvIGJlIGxlYWtpbmcgY2FjZXJ0cy4gS2FtaWwgRHVka2EgaGVscGVkIG1lIGNvbXBsZXRlIHRoZSBmaXguIFRoZSBpc3N1ZQogIGlzIGZvdW5kIGluIFJlZGhhdCdzIGJ1ZyB0cmFja2VyOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyCgogIFRoZXJlIGFyZSBzdGlsbCBtZW1vcnkgbGVha3MgcHJlc2VudCwgYnV0IHRoZXkgc2VlbSB0byBoYXZlIG90aGVyIHJlYXNvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDExIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBTeW1iaWFuIE9TIGJ1aWxkIGZpbGVzLgotIEltcHJvdmVkIFN5bWJpYW4gc3VwcG9ydCBmb3IgU1NMLgoKWWFuZyBUc2UgKDEwIEFwciAyMDA5KQotIERhbmllbCBKb2huc29uIGltcHJvdmVkIHRoZSBNYWNPU1gtRnJhbWV3b3JrIHNoZWxsIHNjcmlwdCB0byBub3cgcGVyZm9ybSBhbGwKICB0aGUgc3RlcHMgcmVxdWlyZWQgdG8gYnVpbGQgYSBNYWMgT1MgWCBmb3VyIHdheSBmYXQgcHBjL2kzODYvcHBjNjQveDg2XzY0CiAgbGliY3VybC5mcmFtZXdvcmsuICBGb3VyIHdheSBmYXQgZnJhbWV3b3JrIHJlcXVpcmVzIE9TIFggMTAuNSBTREsgb3IgbGF0ZXIuCgpZYW5nIFRzZSAoOCBBcHIgMjAwOSkKLSBSZW1vdmVkIFN1biBjb21waWxlcnMgcHJlcHJvY2Vzc29yIGJsb2NrIGZyb20gY3VybGJ1aWxkLmguZGlzdCwgdGhpcyBhbHNvCiAgcmVtb3ZlcyBpdCBmcm9tIHRoZSBjdXJsYnVpbGQuaCBmaWxlIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgdGhlIGNVUkwKICBwcm9qZWN0IGFzIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3Igc3lzdGVtcyBub3QgY2FwYWJsZSBvZiBydW5uaW5nIHRoZQogIGNvbmZpZ3VyZSBzY3JpcHQuICBGb3IgdGhvc2Ugd2hvIGhhdmUgYmVlbiBidWlsZGluZyBjdXJsIG91dCBvZiB0aGUgc291cmNlCiAgY29kZSBjdXJsIGRpc3RyaWJ1dGlvbiB0YXJiYWxsIHByb3ZpZGVkIGJ5IGN1cmwuaGF4eC5zZSB0aGUgY2hhbmdlIGltcGxpZXMKICBub3RoaW5nLiAgUHJldmlvdXMgY2hhbmdlIGluIHRoaXMgYXJlYSBjb21taXR0ZWQgMiBBcHIgYmVjb21lcyBpcnJlbGV2YW50LgoKRGFuaWVsIFN0ZW5iZXJnICg2IEFwciAyMDA5KQotIEkgY2xhcmlmaWVkIGluIHRoZSBkb2NzIHRoYXQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MKICBhbmQgMSBvbiBmYXRhbCBlcnJvcnMuIFByZXZpb3VzbHkgaXQgb25seSBtZW50aW9uZWQgbm9uLXplcm8gb24gZmF0YWwKICBlcnJvcnMuIFRoaXMgaXMgYSBzbGlnaHQgY2hhbmdlIGluIG1lYW5pbmcsIGJ1dCBpdCBmb2xsb3dzIHdoYXQgd2UndmUgZG9uZQogIGVsc2V3aGVyZSBiZWZvcmUgYW5kIGl0IG9wZW5zIHVwIGZvciBMT1RTIG9mIG1vcmUgdXNlZnVsIHJldHVybiBjb2RlcwogIHdoZW5ldmVyIHdlIGNhbiB0aGluayBvZiB0aGVtLi4uCgpZYW5nIFRzZSAoMiBBcHIgMjAwOSkKLSBGaXggY3VybF9vZmZfdCBkZWZpbml0aW9uIGZvciBidWlsZHMgZG9uZSB1c2luZyBTdW4gY29tcGlsZXJzIGFuZCBhCiAgbm9uLWNvbmZpZ3VyZWQgbGliY3VybC4gSW4gdGhpcyBjYXNlIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIHdhcyBnYXRlZAogIHRvIHRoZSBvZmZfdCBkYXRhIHR5cGUgd2hpY2ggZGVwZW5kcyBvbiB0aGUgX0ZJTEVfT0ZGU0VUX0JJVFMuIFRoaXMKICBjb25maWd1cmF0aW9uIGlzIGV4YWN0bHkgdGhlIHVud2FudGVkIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBjdXJsX29mZl90CiAgZGF0YSB0eXBlIHdoaWNoIG11c3Qgbm90IGRlcGVuZCBvbiBzdWNoIHNldHRpbmcuIFRoaXMgYnJlYWtzIEFCSSBmb3IKICBsaWJjdXJsIGxpYnJhcmllcyBidWlsdCB3aXRoIFN1biBjb21waWxlcnMgd2hpY2ggd2VyZSBidWlsdCB3aXRob3V0CiAgaGF2aW5nIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCB3aXRoIF9GSUxFX09GRlNFVF9CSVRTIGRpZmZlcmVudCB0aGFuCiAgNjQgYW5kIHVzaW5nIHRoZSBJTFAzMiBkYXRhIG1vZGVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEFwciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBOVUxMIHBvaW50ZXIgdXNlIGluIGFuIGluZm9mKCkgY2FsbCBpZiBhCiAgc3RyZHVwKCkgY2FsbCBmYWlsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDMxIE1hciAyMDA5KQotIFByb3Blcmx5IHJldHVybiBhbiBlcnJvciBjb2RlIGluIGN1cmxfZWFzeV9yZWN2IChyZXBvcnRlZCBieSBKaW0gRnJlZW1hbikuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1hciAyMDA5KQotIEthbWlsIER1ZGthIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGVuYWJsZXMgNiBhZGRpdGlvbmFsIGNyeXB0byBhbGdvcml0aG1zIHdoZW4KICBOU1MgaXMgdXNlZC4gVGhlc2UgY2lwaGVycyB3ZXJlIGFkZGVkIGluIE5TUyAzLjQgYW5kIHJlcXVpcmUgdG8gYmUgZW5hYmxlZAogIGV4cGxpY2l0bHkuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA5KQotIFVzZSBsaWJzc2gyX3ZlcnNpb24oKSB0byBwcmVzZW50IHRoZSBsaWJzc2gyIHZlcnNpb24gaW4gY2FzZSB0aGUgbGlic3NoMgogIGxpYnJhcnkgaXMgZm91bmQgdG8gc3VwcG9ydCBpdC4KCllhbmcgVHNlICgxMiBNYXIgMjAwOSkKLSBBZGRlZCBtaXNzaW5nIEN1cmxfcmVhZCgpIHJldHVybiBjb2RlIGNoZWNraW5nIGluIFRFTE5FVCB0cmFuc2ZlcnMuCgotIFBpZXJyZSBCcmljbyBmb3VuZCBhbmQgZml4ZWQgVEVMTkVUIHRyYW5zZmVycyBub3QgYmVpbmcgYWJvcnRlZCB1cG9uCiAgYSB3cml0ZSBjYWxsYmFjayBmYWlsdXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIHRoZSBjdXJsIHRvb2wgcHJvcGVybHkgY2FsbCBjdXJsX2dsb2JhbF9pbml0KCkgYmVmb3JlIGFueQogIG90aGVyIGxpYmN1cmwgZnVuY3Rpb24uCgpZYW5nIFRzZSAoMTEgTWFyIDIwMDkpCi0gQWRkZWQgbWlzc2luZyBURUxORVQgdGltZW91dCBzdXBwb3J0IGZvciBXaW5kb3dzIGJ1aWxkcy4gVGhpcyBpc3N1ZSB3YXMKICByZXBvcnRlZCBieSBQaWVycmUgQnJpY28uCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWFyIDIwMDkpCi0gRnJhbmsgSGVtcGVsIGZvdW5kIG91dCBhIGJ1ZyBhbmQgcHJvdmlkZWQgdGhlIGZpeDoKCiAgY3VybF9lYXN5X2R1cGhhbmRsZSBkaWQgbm90IG5lY2Vzc2FyaWx5IGR1cGxpY2F0ZSB0aGUgQ1VSTE9QVF9DT09LSUVGSUxFCiAgb3B0aW9uLiBJdCBvbmx5IGVuYWJsZWQgdGhlIGNvb2tpZSBlbmdpbmUgaW4gdGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBpZgogIGRhdGEtPmNvb2tpZXMgaXMgbm90IE5VTEwgKHdoZXJlIGRhdGEgaXMgdGhlIHNvdXJjZSBoYW5kbGUpLiBJbiBjYXNlIG9mIGEKICBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgd2hpY2gganVzdCBoYWQgdGhlIGNvb2tpZSBzdXBwb3J0IGVuYWJsZWQgYnkgYQogIGN1cmxfZWFzeV9zZXRvcHQoaGFuZGxlLCBDVVJMX0NPT0tJRUZJTEUsICIiKS1jYWxsLCBoYW5kbGUtPmNvb2tpZXMgd2FzCiAgc3RpbGwgTlVMTCBiZWNhdXNlIHRoZSBzZXRvcHQtY2FsbCBvbmx5IGFwcGVuZHMgdGhlIHZhbHVlIHRvCiAgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QsIGhlbmNlIGR1cGxpY2F0aW5nIHRoaXMgaGFuZGxlIHdvdWxkIG5vdCBoYXZlIHRoZQogIGNvb2tpZSBlbmdpbmUgc3dpdGNoZWQgb24uCgogIFdlIGFsc28gY29uY2x1ZGVkIHRoYXQgdGhlIHNsaXN0LWZ1bmN0aW9uYWxpdHkgd291bGQgYmUgc3VpdGFibGUgZm9yIGJlaW5nCiAgcHV0IGluIGl0cyBvd24gbW9kdWxlIHJhdGhlciB0aGFuIHNpbXBseSBoYW5naW5nIG91dCBpbiBsaWIvc2VuZGYuYyBzbyBJCiAgY3JlYXRlZCBsaWIvc2xpc3QuW2NoXSBmb3IgdGhlbS4KCi0gQW5kcmVhcyBGYXJiZXIgbWFkZSB0aGUgJ2J1aWxkY29uZicgc2NyaXB0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgbTQKICBzY3JpcHRzIHRvIG1ha2UgaXQgZGV0ZWN0IGEgYmFkIGNoZWNrb3V0IGVhcmxpZXIuIFBlb3BsZSB3aXRoIG9sZGVyCiAgY2hlY2tvdXRzIHdobyBkb24ndCBkbyBjdnMgdXBkYXRlIHdpdGggdGhlIC1kIG9wdGlvbiB3b24ndCBnZXQgdGhlIG5ldyBkaXJzCiAgYW5kIHRoZW4gd2lsbCBnZXQgZnVubnkgb3V0cHV0cyB0aGF0IGNhbiBiZSBhIGJpdCBoYXJkIHRvIHVuZGVyc3RhbmQgYW5kCiAgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICg4IE1hciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgY29kZSBzZWdtZW50IGluIHNzbHVzZS5jIHdoZXJlIHRoZQogIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSBCSU8gd2FzIG5vdCBiZWluZyBwcm9wZXJseSBjaGVja2VkLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIHRoZSBnbnV0bHMtdXNpbmcgY29kZTogVGhlcmUgYXJlIGEgZmV3IHBsYWNlcwogIGluIHRoZSBnbnV0bHMgY29kZSB3aGVyZSB3ZSB3ZXJlIGNoZWNraW5nIGZvciBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9ycywKICB3aGVuIHRoZSBtYW4gcGFnZXMgc3RhdGUgdGhhdCBHTlVUTFNfRV9TVUNDRVNTIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kCiAgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9yIGNvbmRpdGlvbnMuCgotIEJpbGwgRWdlcnQgcG9pbnRlZCBvdXQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI2NzE2MDIpIHRoYXQKICBjdXJsIGRpZG4ndCB1c2Ugc3ByaW50ZigpIGluIGEgd2F5IHRoYXQgaXMgZG9jdW1lbnRlZCB0byB3b3JrIGluIFBPU0lYIGJ1dAogIHNpbmNlIHdlIHVzZSBvdXIgb3duIHByaW50ZigpIGNvZGUgKGZyb20gbGliY3VybCkgdGhhdCBzaG91bGRuJ3QgYmUgYQogIHByb2JsZW0uIE5vbmV0aGVsZXNzIEkgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm90IHJlbHkgb24gc3VjaCBwYXJ0aWN1bGFyCiAgZmVhdHVyZXMgYW5kIHRvIG5vdCBjYXVzZSBmdXJ0aGVyIHJhaXNlZCBleWVicm93c2Ugd2l0aCBubyBnb29kIHJlYXNvbi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOSkKLSBFeHBhbmRlZCB0aGUgc2VjdXJpdHkgc2VjdGlvbiBvZiB0aGUgbGliY3VybC10dXRvcmlhbCBtYW4gcGFnZSB0byBjb3ZlcgogIG1vcmUgaXNzdWVzIGZvciBhdXRob3JzIHRvIGNvbnNpZGVyIHdoZW4gd3JpdGluZyByb2J1c3QgbGliY3VybC11c2luZwogIGFwcGxpY2F0aW9ucy4KCllhbmcgVHNlICg1IE1hciAyMDA5KQotIEZpeGVkIE5UTE0gYXV0aGVudGljYXRpb24gbWVtb3J5IGxlYWsgb24gU1NQSSBlbmFibGVkIFdpbmRvd3MgYnVpbGRzLiBUaGlzCiAgaXNzdWUgd2FzIG5vdGljZWQgYnkgQ2hyaXMgRGVpZHVuLgoKRGFuaWVsIEZhbmRyaWNoICg0IE1hciAyMDA5KQotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIG00IHF1b3RpbmcgaW4gdGhlIE9wZW5TU0wgY29uZmlndXJlIGNoZWNrIHJlcG9ydGVkCiAgYnkgRGFuaWVsIEpvaG5zb24uCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgSmFtZXMgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBsaWJjdXJsIGNsb3NlIChhbGwpIGRlYWQgY29ubmVjdGlvbnMKICB3aGVuZXZlciB5b3UgYXR0ZW1wdCB0byBvcGVuIGEgbmV3IGNvbm5lY3Rpb24uCgogIDEuIEFmdGVyIGNsZWFuaW5nIHVwIGEgZGVhZCBjb25uZWN0aW9uLCAiY29udGludWUiIGluc3RlYWQgb2YKICAgICByZXR1cm5pbmcgRkFMU0UuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNsZWFuIHVwIGFsbCBkZWFkIGNvbm5lY3Rpb25zLAogICAgIHJhdGhlciB0aGFuIGp1c3QgY2xlYW5pbmcgdXAgdGhlIGZpcnN0IGRlYWQgY29ubmVjdGlvbi4KICAyLiBNb3ZlIHVwIHRoZSBjbGVhbnVwIGZvciBkZWFkIGNvbm5lY3Rpb25zIHNvIHRoYXQgaXQgb2NjdXJzIGZvcgogICAgIGFsbCBjb25uZWN0aW9ucywgcmF0aGVyIHRoYW4ganVzdCB0aGUgY29ubmVjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2FtZQogICAgIHByZWZlcmVuY2VzIGFzIG91ciBjdXJyZW50IG5ldyBjb25uZWN0aW9uLgoKVmVyc2lvbiA3LjE5LjQgKDMgTWFyY2ggMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMyBNYXIgMjAwOSkKLSBEYXZpZCBLaWVyem5vd3NraSBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA5MDMwMy5odG1sIGFsc28ga25vd24gYXMgQ1ZFLTIwMDktMDAzNykgaW4KICB3aGljaCBwcmV2aW91cyBsaWJjdXJsIHZlcnNpb25zIChieSBkZXNpZ24pIGNhbiBiZSB0cmlja2VkIHRvIGFjY2VzcyBhbgogIGFyYml0cmFyeSBsb2NhbC9kaWZmZXJlbnQgZmlsZSBpbnN0ZWFkIG9mIGEgcmVtb3RlIG9uZSB3aGVuCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBUaGlzIGZsYXcgaXMgbm93IGZpeGVkIGluIHRoaXMgcmVsZWFzZQogIHRvZ2V0aGVyIHRoaXMgdGhlIGFkZGl0aW9uIG9mIHR3byBuZXcgc2V0b3B0IG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoaXMKICBuZXcgYmVoYXZpb3I6CgogIG8gQ1VSTE9QVF9SRURJUl9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbHMgbGliY3VybCBpcyBhbGxvd2VkIHRvCiAgZm9sbG93IHRvIHdoZW4gQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbgogIGV4Y2x1ZGVzIHRoZSBGSUxFIGFuZCBTQ1AgcHJvdG9jb2xzIGFuZCB0aHVzIHlvdSBuZWUgdG8gZXhwbGljaXRseSBhbGxvdwogIHRoZW0gaW4geW91ciBhcHAgaWYgeW91IHJlYWxseSB3YW50IHRoYXQgYmVoYXZpb3IuCgogIG8gQ1VSTE9QVF9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbChzKSBsaWJjdXJsIGlzIGFsbG93ZWQgdG8gZmV0Y2gKICB1c2luZyB0aGUgcHJpbWFyeSBVUkwgb3B0aW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhbGxvdyBhIHVzZXIgb3IKICBvdGhlciBvdXRzaWRlcnMgY29udHJvbCB3aGF0IFVSTCB0byBwYXNzIHRvIGxpYmN1cmwgYW5kIHlldCBub3QgYWxsb3cgYWxsCiAgcHJvdG9jb2xzIGxpYmN1cmwgbWF5IGhhdmUgYmVlbiBidWlsdCB0byBzdXBwb3J0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBGZWIgMjAwOSkKLSBTZW50aGlsIFJhamEgVmVsdSByZXBvcnRlZCBhIHByb2JsZW0gd2hlbiBDVVJMT1BUX0lOVEVSRkFDRSBhbmQKICBDVVJMT1BUX0xPQ0FMUE9SVCB3ZXJlIHVzZWQgdG9nZXRoZXIgKHRoZSBsb2NhbCBwb3J0IGJpbmQgZmFpbGVkKSwgYW5kCiAgTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgdGhlIGZpeCEKCkRhbmllbCBTdGVuYmVyZyAoMjUgRmViIDIwMDkpCi0gQXMgRGFuaWVsIEZhbmRyaWNoIGZpZ3VyZWQgb3V0LCB3ZSBtdXN0IGRvIHRoZSBHbnVUTFMgaW5pdGluZyBpbiB0aGUKICBjdXJsX2dsb2JhbF9pbml0KCkgZnVuY3Rpb24gdG8gcHJvcGVybHkgbWFpbnRhaW4gdGhlIHBlcmZvcm1pbmcgZnVuY3Rpb25zCiAgdGhyZWFkLXNhZmUuIFdlJ3ZlIHByZXZpb3VzbHkgKDI4IEFwcmlsIDIwMDcpIG1vdmVkIHRoZSBpbml0IHRvIGEgbGF0ZXIgdGltZQogIGp1c3QgdG8gYXZvaWQgaXQgdG8gZmFpbCB2ZXJ5IGVhcmx5IHdoZW4gbGliZ2NyeXB0IGRpc2xpa2VzIHRoZSBzaXR1YXRpb24sCiAgYnV0IHRoYXQgbW92ZSB3YXMgYmFkIGFuZCB0aGUgZml4IHNob3VsZCByYXRoZXIgYmUgaW4gbGliZ2NyeXB0IG9yCiAgZWxzZXdoZXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBGZWIgMjAwOSkKLSBCcmlhbiBKLiBNdXJyZWxsIGZvdW5kIG91dCB0aGF0IE5lZ290aWF0ZSBwcm94eSBhdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4KICBJdCBoYXBwZW5lZCBiZWNhdXNlIHRoZSBjb2RlIHVzZWQgdGhlIHN0cnVjdCBmb3Igc2VydmVyLWJhc2VkIGF1dGggYWxsIHRoZQogIHRpbWUgZm9yIGJvdGggcHJveHkgYW5kIHNlcnZlciBhdXRoIHdoaWNoIG9mIGNvdXJzZSB3YXMgd3JvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIEZlYiAyMDA5KQotIEFmdGVyIGEgYnVnIHJlcG9ydGVkIGJ5IEphbWVzIENoZW5nIEkndmUgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZvcgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQgcmV0dXJuCiAgLTEgaWYgdGhlIHNpemVzIGFyZW4ndCBrbm93LiBQcmV2aW91c2x5IHRoZXNlIHJldHVybmVkIDAsIG1ha2UgaXQgaW1wb3NzaWJsZQogIHRvIGRldGVjdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbGx5IHplcm8gYW5kIHVua25vd24uCgpZYW5nIFRzZSAoMjMgRmViIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gcHJvdmlkZWQgYSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBuZWVkZWQKICB0byBidWlsZCBhIE1hYyBPUyBYIGZhdCBwcGMvaTM4NiBvciBwcGM2NC94ODZfNjQgbGliY3VybC5mcmFtZXdvcmsKCkRhbmllbCBTdGVuYmVyZyAoMjMgRmViIDIwMDkpCi0gSSByZW5hbWVkIGV2ZXJ5dGhpbmcgaW4gdGhlIHdpbmRvd3MgYnVpbGRzIGZpbGVzIHRoYXQgdXNlZCB0aGUgbmFtZSAnY3VybGxpYicKICB0byB0aGUgcHJvcGVyICdsaWJjdXJsJyBhcyBjbGVhcmx5IHRoaXMgY2F1c2VkIGNvbmZ1c2lvbi4KCllhbmcgVHNlICgyMCBGZWIgMjAwOSkKLSBEbyBub3QgaGFsdCBjb21waWxhdGlvbiB3aGVuIHVzaW5nIFZTMjAwOCB0byBidWlsZCBhIFdpbmRvd3MgMjAwMCB0YXJnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEZlYiAyMDA5KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcmVwb3J0ZWQgYW5kIGhlbHBlZCBtZSByZXBlYXQgYW5kIGZpeCBhIHByb2JsZW0gd2l0aAogIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2U6IHdoZW4gYSB0cmFuc2ZlciBmYWlscywgbGlrZSB3aGVuIGFib3J0ZWQgYnkgYQogIHdyaXRlIGNhbGxiYWNrLCB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdhcyB3cm9uZ2x5IGNsb3NlZCBhbmQgdGh1cyBub3QKICByZS11c2VkIHByb3Blcmx5LgoKICBUaGlzIGNoYW5nZSBpcyBhbHNvIGFuIGF0dGVtcHQgdG8gY2xlYW51cCB0aGUgY29kZSBzb21ld2hhdCBpbiB0aGlzIGFyZWEsIGFzCiAgbm93IHRoZSBGVFAgY29kZSBhdHRlbXB0cyB0byBrZWVwIChiZXR0ZXIpIHRyYWNrIG9uIHBlbmRpbmcgcmVzcG9uc2VzCiAgbmVjZXNzYXJ5IHRvIGdldCByZWFkIGluIGZ0cF9kb25lKCkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEZlYiAyMDA5KQotIFBhdHJpayBUaHVuc3Ryb20gcmVwb3J0ZWQgYSBwcm9ibGVtIGFuZCBoZWxwZWQgbWUgcmVwZWF0IGl0LiBJdCB0dXJuZWQgb3V0CiAgbGliY3VybCBkaWQgYSBzdXBlcmZsdW91cyAxMDAwbXMgd2FpdCB3aGVuIGRvaW5nIFNGVFAgZG93bmxvYWRzIQoKICBXZSByZWFkIGRhdGEgd2l0aCBsaWJzc2gyIHdoaWxlIGRvaW5nIHRoZSAiRE8iIG9wZXJhdGlvbiBmb3IgU0ZUUCBhbmQgdGhlbgogIHdoZW4gd2Ugd2VyZSBhYm91dCB0byBzdGFydCBnZXR0aW5nIGRhdGEgZm9yIHRoZSBhY3R1YWwgZmlsZSBwYXJ0LCB0aGUKICAiVFJBTlNGRVIiIHBhcnQsIHdlIHdhaXRlZCBmb3Igc29ja2V0IGFjdGlvbiAoaW4gMTAwMG1zKSBiZWZvcmUgZG9pbmcgYQogIGxpYnNzaDItcmVhZC4gQnV0IGluIHRoaXMgY2FzZSBsaWJzc2gyIGhhZCBhbHJlYWR5IHJlYWQgYW5kIGJ1ZmZlcmVkIHRoZQogIGRhdGEgc28gd2UgZW5kZWQgdXAgYWx3YXlzIGp1c3Qgd2FpdGluZyAxMDAwbXMgYmVmb3JlIHdlIGdldCB3b3JraW5nIG9uIHRoZQogIGRhdGEhCgpQYXRyaWNrIE1vbm5lcmF0ICgxOCBGZWIgMjAwOSkKLSBGVFAgZG93bmxvYWRzIChpLmUuOiBSRVRSKSBlbmRpbmcgd2l0aCBjb2RlIDU1MCBub3cgcmV0dXJuIGVycm9yCiAgQ1VSTEVfUkVNT1RFX0ZJTEVfTk9UX0ZPVU5EIGluc3RlYWQgb2YgQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBGZWIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIE5TUy1wb3dlcmVkIGJ1aWxkcyBjb21waWxlIGFuZCBydW4gYWdhaW4hCgotIEEgc2Vjb25kIGZvbGxvdy11cCBjaGFuZ2UgYnkgQW5kcmUgR3VpYmVydCBkZSBCcnVldCB0byBmaXggYSByZWxhdGVkIG1lbW9yeQogIGxlYWsgbGlrZSB0aGF0IGZpeGVkIG9uIHRoZSAxNHRoLiBXaGVuIHpsaWIgcmV0dXJucyBmYWlsdXJlLCB3ZSBuZWVkIHRvCiAgY2xlYW51cCBwcm9wZXJseSBiZWZvcmUgcmV0dXJuaW5nIGVycm9yLgoKLSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIGNhbiBub3cgYmUgc2V0IHRvIDIgaW4gYWRkaXRpb24gdG8gMSBmb3IKICBwbGFpbiBGVFAgY29ubmVjdGlvbnMsIGFuZCBpdCB3aWxsIHRoZW4gYWxsb3cgTUtEIHRvIGZhaWwgb25jZSBhbmQgcmV0cnkgdGhlCiAgQ1dEIGFmdGVyd2FyZHMuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91J3JlIGRvaW5nIG1hbnkgc2ltdWx0YW5vZXMKICBjb25uZWN0aW9ucyBhZ2FpbnN0IHRoZSBzYW1lIHNlcnZlciBhbmQgdGhleSBhbGwgaGF2ZSB0aGlzIG9wdGlvbiBlbmFibGVkLAogIGFzIHRoZW4gQ1dEIG1heSBmaXJzdCBmYWlsIGJ1dCB0aGVuIGFub3RoZXIgY29ubmVjdGlvbiBkb2VzIE1LRCBiZWZvcmUgdGhpcwogIGNvbm5lY3Rpb24gYW5kIHRodXMgTUtEIGZhaWxzIGJ1dCB0cnlpbmcgQ1dEIHdvcmtzISBUaGUgbnVtYmVycyBjYW4KICAoc2hvdWxkPykgbm93IGJlIHNldCB3aXRoIHRoZSBjb252ZW5pZW5jZSBlbnVtcyBub3cgY2FsbGVkCiAgQ1VSTEZUUF9DUkVBVEVfRElSIGFuZCBDVVJMRlRQX0NSRUFURV9ESVJfUkVUUlkuCgogIFRlc3RzIGhhcyBwcm92ZW4gdGhhdCBpZiB5b3UncmUgbWFraW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXBsb2FkcyBhIHNldCBvZgogIGZpbGVzIHRvIGFuIGZ0cCBzZXJ2ZXIsIHlvdSB3aWxsIGdldCBhIG5vdGljYWJsZSBnYWluIGluIHNwZWVkIGlmIHlvdSdyZQogIHVzaW5nIG11bHRpcGxlIGNvbm5lY3Rpb25zIGFuZCB0aGlzIG9wdGlvbiB3aWxsIGJlIHRoZW4gYmUgdmVyeSB1c2VmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEZlYiAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvbnRlbnQgZW5jb2RpbmcKICBjb2RlLCB3aGljaCBjb3VsZCBoYXBwZW4gb24gbGlieiBlcnJvcnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEZlYiAyMDA5KQotIEFkZGVkIHN1cHBvcnQgZm9yIERpZ2VzdCBhbmQgTlRMTSBhdXRoZW50aWNhdGlvbiB1c2luZyBHbnVUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEZlYiAyMDA5KQotIENVUkxJTkZPX0NPTkRJVElPTl9VTk1FVCB3YXMgYWRkZWQgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZ2V0IHRvIGtub3cgaWYKICB0aGUgY29uZGl0aW9uIGluIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcyB1bm1ldC4gVGhpcyBpcyB0eXBpY2FsbHkgYSB0aW1lCiAgY29uZGl0aW9uIHNldCB3aXRoIENVUkxPUFRfVElNRUNPTkRJVElPTiBhbmQgd2FzIHByZXZpb3VzbHkgbm90IHBvc3NpYmxlIHRvCiAgcmVsaWFibHkgZmlndXJlIG91dC4gRnJvbSBidWcgcmVwb3J0ICMyNTY1MTI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NjUxMjgpIGZpbGVkIGJ5IEpvY2VseW4gSmF1YmVydC4KCkRhbmllbCBGYW5kcmljaCAoNCBGZWIgMjAwOSkKLSBEb24ndCBhZGQgdGhlIHN0YW5kYXJkIC91c3IvbGliIG9yIC91c3IvaW5jbHVkZSBwYXRocyB0byBMREZMQUdTIGFuZCBDUFBGTEFHUwogIChyZXNwZWN0aXZlbHkpIHdoZW4gLS13aXRoLXNzbD0vdXNyIGlzIHVzZWQgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgoKLSBBZGRlZCBhbiBleHBsaWNpdCBidWZmZXIgbGltaXQgY2hlY2sgaW4gbXNkb3NpZnkoKSAocGF0Y2ggYmFzZWQgb24gRnJlZUJTRCkuCiAgVGhpcyBjb3VsZG4ndCBldmVyIG92ZXJmbG93IGluIGN1cmwsIGJ1dCBtaWdodCBpZiB0aGUgY29kZSB3ZXJlIHVzZWQKICBlbHNld2hlcmUgb3IgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDMgRmViIDIwMDkpCi0gSGlkZW1vdG8gTmFrYWRhIHByb3ZpZGVkIGEgc21hbGwgZml4IHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRoZQogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHNpemUgZnJvbSBmaWxlOi8vICJ0cmFuc2ZlcnMiIHdpdGgKICBDVVJMT1BUX05PQk9EWSBzZXQgdHJ1ZS4KCkRhbmllbCBTdGVuYmVyZyAoMiBGZWIgMjAwOSkKLSBQYXRyaWNrIFNjb3R0IGZvdW5kIGEgcmF0aGVyIGxhcmdlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIENVUkxNT1BUX01BWENPTk5FQ1RTIHRvIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIG51bWJlcgogIG9mIGhhbmRsZXMgeW91IGFkZCB0byB0aGUgbXVsdGkgaGFuZGxlLiBBbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgZGlkbid0IGZpdAogIGluIHRoZSBjYWNoZSB3b3VsZCBub3QgYmUgcHJvcGVybHkgZGlzY29ubmVjdGVkIG5vciBmcmVlZCEKCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgdXM6IGxpYmN1cmwgbm93IGRlZmF1bHRzIHRvIGRvIENPTk5FQ1Qgd2l0aCBIVFRQCiAgdmVyc2lvbiAxLjEgaW5zdGVhZCBvZiAxLjAgbGlrZSBiZWZvcmUuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyB0aGUgbmV3CiAgcHJveHkgdHlwZSBmb3IgbGliY3VybCBjYWxsZWQgJ0NVUkxQUk9YWV9IVFRQXzFfMCcgdGhhdCB0aGVuIGFsbG93cyBhcHBzIHRvCiAgc3dpdGNoIChiYWNrKSB0byBDT05ORUNUIDEuMCByZXF1ZXN0cy4gVGhlIGN1cmwgdG9vbCBhbHNvIGdvdCBhIC0tcHJveHkxLjAKICBvcHRpb24gdGhhdCB3b3JrcyBleGFjdGx5IGxpa2UgLS1wcm94eSBidXQgc2V0cyBDVVJMUFJPWFlfSFRUUF8xXzAuCgogIEkgdXBkYXRlZCBhbGwgdGVzdCBjYXNlcyBjYXNlcyB0aGF0IHVzZSBDT05ORUNUIGFuZCBJIHRyaWVkIHRvIGRvIHNvbWUgdXNpbmcKICAtLXByb3h5MS4wIGFuZCBzb21lIHVwZGF0ZWQgdG8gZG8gQ09OTkVDVCAxLjEgdG8gZ2V0IGJvdGggdmVyc2lvbnMgcnVuLgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBKYW4gMjAwOSkKLSBXaGVuIGJ1aWxkaW5nIHdpdGggYy1hcmVzIDEuNi4xIChub3QgeWV0IHJlbGVhc2VkKSBvciBsYXRlciBhbmQgSVB2NiBzdXBwb3J0CiAgZW5hYmxlZCwgd2UgY2FuIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBpdHMgYnJhbmQgbmV3IEFGX1VOU1BFQyBzdXBwb3J0IGluCiAgYXJlc19nZXRob3N0YnluYW1lKCkuIFRoaXMgbWFrZXMgdGVzdCBjYXNlIDI0MSBmaW5hbGx5IHJ1biBmaW5lIGZvciBtZSB3aXRoCiAgdGhpcyBzZXR1cCBzaW5jZSBpdCBub3cgcGFyc2VzIHRoZSAiOjoxIGlwNi1sb2NhbGhvc3QiIGxpbmUgZmluZSBpbiBteQogIC9ldGMvaG9zdHMgZmlsZSEKCkRhbmllbCBTdGVuYmVyZyAoMzAgSmFuIDIwMDkpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzI1NTAwNjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjU1MDA2MSkgbWVudGlvbmluZyB0aGF0IEkgZmFpbGVkIHRvCiAgcHJvcGVybHkgbWFrZSBzdXJlIHRoYXQgdGhlIFZDOSBtYWtlZmlsZXMgZ290IGluY2x1ZGVkIGluIHRoZSBsYXRlc3QKICByZWxlYXNlLiBJJ3ZlIG5vdyBmaXhlZCB0aGUgcmVsZWFzZSBzY3JpcHQgYW5kIHZlcmlmaWVkIGl0IHNvIG5leHQgcmVsZWFzZQogIHdpbGwgaG9wZWZ1bGx5IGluY2x1ZGUgdGhlbSBwcm9wZXJseSEKCkRhbmllbCBGYW5kcmljaCAoMzAgSmFuIDIwMDkpCi0gRml4ZWQgLS1kaXNhYmxlLXByb3h5IGZvciBGVFAgYW5kIFNPQ0tTLiBUaGFua3MgdG8gRGFuaWVsIEVnZ2VyIGZvcgogIHJlcG9ydGluZy4KCllhbmcgVHNlICgyOSBKYW4gMjAwOSkKLSBJbnRyb2R1Y2VkIGN1cmxfc3NwaS5jIGFuZCBjdXJsX3NzcGkuaCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucwogIEN1cmxfc3NwaV9nbG9iYWxfaW5pdCgpIGFuZCBDdXJsX3NzcGlfZ2xvYmFsX2NsZWFudXAoKSB3aGljaCBwcmV2aW91c2x5IHdlcmUKICBuYW1lZCBDdXJsX250bG1fZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9udGxtX2dsb2JhbF9jbGVhbnVwKCkgaW4gaHR0cF9udGxtLmMKICBBbHNvIGFkanVzdGVkIHNvY2tzX3NzcGkuYyB0byByZW1vdmUgdGhlIGxpbmstdGltZSBkZXBlbmRlbmN5IG9uIHRoZSBXaW5kb3dzCiAgU1NQSSBsaWJyYXJ5IHVzaW5nIGl0IG5vdyBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd2FzIGRvbmUgaW4gaHR0cF9udGxtLmMuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IEphbiAyMDA5KQotIE1hcmt1cyBNb2VsbGVyIGludHJvZHVjZWQgdHdvIG5ldyBvcHRpb25zIHRvIGxpYmN1cmw6CiAgQ1VSTE9QVF9TT0NLUzVfR1NTQVBJX1NFUlZJQ0UgYW5kIENVUkxPUFRfU09DS1M1X0dTU0FQSV9ORUMgdG8gYWxsb3cgbGliY3VybAogIHRvIGRvIEdTUy1zdHlsZSBhdXRoZW50aWNhdGlvbiB3aXRoIFNPQ0tTNSBwcm94aWVzLiBUaGUgY3VybCB0b29sIGdvdCB0aGUKICBvcHRpb25zIGNhbGxlZCAtLXNvY2tzNS1nc3NhcGktc2VydmljZSBhbmQgLS1zb2NrczUtZ3NzYXBpLW5lYyB0byBlbmFibGUKICB0aGVzZS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMDkpCi0gQ2hhZCBNb25yb2UgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1RGVFBfQkxLU0laRSBvcHRpb24gdGhhdCBhbGxvd3MgYW4gYXBwCiAgdG8gc2V0IGRlc2lyZWQgYmxvY2sgc2l6ZSB0byB1c2UgZm9yIFRGVFAgdHJhbnNmZXJzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKICA1MTIgYnl0ZXMuCgotIFRoZSAiLW5vX3RpY2tldCIgb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIE9wZW5zc2wwLjkuOGouIEl0J3MgYSBmbGFnIHRvCiAgZGlzYWJsZSAicmZjNDUwN2JpcyBzZXNzaW9uIHRpY2tldCBzdXBwb3J0Ii4gIHJmYzQ1MDdiaXMgd2FzIGxhdGVyIHR1cm5lZAogIGludG8gdGhlIHByb3BlciBSRkM1MDc3IGl0IHNlZW1zOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MDc3CgogIFRoZSBlbmFibGVkIGV4dGVuc2lvbiBjb25jZXJucyB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50LiBJIHdvbmRlciBob3cgb2Z0ZW4KICBsaWJjdXJsIHN0b3BzIGEgY29ubmVjdGlvbiBhbmQgdGhlbiByZXN1bWVzIGEgVExTIHNlc3Npb24uIGFsc28sIHNlbmRpbmcgdGhlCiAgc2Vzc2lvbiBkYXRhIGlzIHNvbWUgb3ZlcmhlYWQuIC5JIHN1Z2dlc3QgdGhhdCB5b3UganVzdCB1c2UgeW91ciBwcm9wb3NlZAogIHBhdGNoICh3aGljaCBleHBsaWNpdGx5IGRpc2FibGVzIFRJQ0tFVCkuCgogIElmIHNvbWVvbmUgd3JpdGVzIGFuIGFwcGxpY2F0aW9uIHdpdGggbGliY3VybCBhbmQgb3BlbnNzbCB3aG8gd2FudHMgdG8KICBlbmFibGUgdGhlIGZlYXR1cmUsIG9uZSBjYW4gZG8gdGhpcyBpbiB0aGUgU1NMIGNhbGxiYWNrLgoKICBTaGFyYWQgR3VwdGEgYnJvdWdodCB0aGlzIHRvIG15IGF0dGVudGlvbi4gUGV0ZXIgU3lsdmVzdGVyIGhlbHBlZCBtZSBkZWNpZGUKICBvbiB0aGUgcHJvcGVyIGFjdGlvbi4KCi0gQWxleGV5IEJvcnpvdiBmaWxlZCBidWcgcmVwb3J0ICMyNTM1NTA0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1MzU1MDQpIHBvaW50aW5nIG91dCB0aGF0IHJlYWxtcyB3aXRoCiAgcXVvdGVkIHF1b3RhdGlvbiBtYXJrcyBpbiBIVFRQIERpZ2VzdCBoZWFkZXJzIGRpZG4ndCB3b3JrLiBJJ3ZlIG5vdyBhZGRlZAogIHRlc3QgY2FzZSAxMDk1IHRoYXQgdmVyaWZpZXMgbXkgZml4LgoKLSBDcmFpZyBBIFdlc3QgYnJvdWdodCBDVVJMT1BUX05PUFJPWFkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIC0tbm9wcm94eSBvcHRpb24uCiAgVGhleSBiYXNpY2FsbHkgb2ZmZXIgdGhlIHNhbWUgdGhpbmcgdGhlIE5PX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIG9ubHkKICBvZmZlcmVkIHByZXZpb3VzbHk6IGxpc3QgYSBzZXQgb2YgaG9zdCBuYW1lcyB0aGF0IHNoYWxsIG5vdCB1c2UgdGhlIHByb3h5CiAgZXZlbiBpZiBvbmUgaXMgc3BlY2lmaWVkLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBKYW4gMjAwOSkKLSBDYWxsIHNldGxvY2FsZSgpIGZvciBsaWJ0ZXN0IHRlc3RzIHRvIHRlc3QgdGhlIGVmZmVjdHMgb2YgbG9jYWxlLWluZHVjZWQKICBsaWJjIGNoYW5nZXMgb24gbGliY3VybC4KCi0gRml4ZWQgYSBjb3VwbGUgbW9yZSBsb2NhbGUtZGVwZW5kZW50IHRvdXBwZXIgY29udmVyc2lvbnMsIG1haW5seSBmb3IKICBjbGFyaXR5LiAgVGhpcyBkb2VzIGZpeCBvbmUgcHJvYmxlbSB0aGF0IGNhdXNlcyA7dHlwZT1pIEZUUCBVUkxzCiAgdG8gZmFpbCBpbiB0aGUgVHVya2lzaCBsb2NhbGUgd2hlbiBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUgaXMKICB1c2VkICh0ZXN0IGNhc2UgNTYxKQoKLSBBZGRlZCB0ZXN0cyA1NjEgYW5kIDEwOTEgdGhyb3VnaCAxMDk0IHRvIHRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMKICBvZiA7dHlwZT0gYW5kIDttb2RlPSBVUkxzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgZmFpbCBpbiB0aGUgVHVya2lzaAogIGxvY2FsZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgSmFuIDIwMDkpCi0gTGlzYSBYdSBwb2ludGVkIG91dCB0aGF0IHRoZSBzc2gub2JqIGZpbGUgd2FzIG1pc3NpbmcgZnJvbSB0aGUKICBsaWIvTWFrZWZpbGUudmM2IGZpbGUgKGFuZCB0aHVzIGZyb20gdGhlIHZjOCBhbmQgdmM5IG9uZXMgdG9vKS4KClZlcnNpb24gNy4xOS4zICgxOSBKYW51YXJ5IDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDE2IEphbiAyMDA5KQotIEFuZHJldyBkZSBsb3MgUmV5ZXMgZml4ZWQgY3VybGJ1aWxkLmggZm9yICJnZW5lcmljIiBnY2MgYnVpbGRzIG9uIFBQQywgYm90aAogIDMyIGJpdCBhbmQgNjQgYml0LgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMjAwOSkKLSBUaW0gQW5zZWxsIGZpeGVkIGEgY29tcGlsZXIgd2FybmluZyBpbiBsaWIvY29va2llLmMKCkRhbmllbCBTdGVuYmVyZyAoMTQgSmFuIDIwMDkpCi0gR3JhbnQgRXJpY2tzb24gZml4ZWQgdGltZW91dHMgZm9yIFRGVFAgc3VjaCB0aGF0IHNwZWNpZnlpbmcgYQogIGNvbm5lY3QtdGltZW91dCwgYSBtYXgtdGltZSBvciBib3RoIG9wdGlvbnMgd29yayBjb3JyZWN0bHkgYW5kIGFzIGV4cGVjdGVkCiAgYnkgcGFzc2luZyB0aGUgY29ycmVjdCBib29sZWFuIHZhbHVlIHRvIEN1cmxfdGltZWxlZnQgdmlhIHRoZQogICdkdXJpbmdjb25uZWN0JyBwYXJhbWV0ZXIuCgogIFdpdGggdGhpcyBzbWFsbCBjaGFuZ2UsIGN1cmwgVEZUUCBub3cgYmVoYXZlcyBhcyBleHBlY3RlZCAoYW5kIGxpa2VseSBhcwogIG9yaWdpbmFsbHktZGVzaWduZWQpOgoKICAxKSBGb3Igbm9uLWV4aXN0ZW50IG9yIHVucmVhY2hhYmxlIGRvdHRlZCBJUCBhZGRyZXNzZXM6CgogICBhKSBXaXRoIG5vIG9wdGlvbnMsIGZvbGxvd3MgdGhlIGRlZmF1bHQgY3VybCAzMDBzIHRpbWVvdXQuLi4KICAgYikgV2l0aCAtLWNvbm5lY3QtdGltZW91dCBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUuLi4KICAgYykgV2l0aCAtLW1heC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZS4uLgogICBkKSBXaXRoIGJvdGggLS1jb25uZWN0LXRpbWVvdXQgYW5kIC0tbWF4LXRpbWUsIGZvbGxvd3MgdGhlIHNtYWxsZXIgdmFsdWUuLi4KCiAgIGFuZCB0aW1lcyBvdXQgd2l0aCBhICJjdXJsOiAoNykgQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXIiIGVycm9yLgoKICAyKSBGb3IgdHJhbnNmZXJzIHRvL2Zyb20gYSB2YWxpZCBob3N0OgoKICAgYSkgV2l0aCBubyBvcHRpb25zLCBmb2xsb3dzIGRlZmF1bHQgY3VybCAzMDBzIHRpbWVvdXQgZm9yIHRoZQogICAgICBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBkZWZhdWx0IFRGVFAgMzYwMHMKICAgICAgdGltZW91dCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGIpIFdpdGggLS1jb25uZWN0LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlIGZvciB0aGUKICAgICAgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgZGVmYXVsdCBURlRQIDM2MDBzCiAgICAgIHRpbWVvdXQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBjKSBXaXRoIC0tbWF4LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlIGZvciB0aGUgZmlyc3QKICAgICAgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUKICAgICAgdHJhbnNmZXIuLi4KCiAgIGQpIFdpdGggYm90aCAtLWNvbm5lY3QtdGltZW91dCBhbmQgLS1tYXgtdGltZSwgZm9sbG93cyB0aGUgZm9ybWVyCiAgICAgIGZvciB0aGUgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgbGF0dGVyIGZvciB0aGUKICAgICAgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYW5kIHRpbWVzIG91dCB3aXRoIGEgImN1cmw6ICgyOCkgVGltZW91dCB3YXMgcmVhY2hlZCIgZXJyb3IgYXMKICAgYXBwcm9wcmlhdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEphbiAyMDA5KQotIE1pY2hhZWwgV2FsbG5lciBmaXhlZCBhIE5VTEwgcG9pbnRlciBkZXJlZiB3aGVuIGNhbGxpbmcKICBjdXJsX2Vhc3lfc2V0dXAoY3VybCwgQ1VSTE9QVF9DT09LSUVMSVNULCAiU0VTUyIpIG9uIGEgQ1VSTCBoYW5kbGUgd2l0aCBubwogIGNvb2tpZXMgZGF0YS4KCi0gU3RlZmFuIFRlbGVtYW4gYnJvdWdodCBhIHBhdGNoIHRvIGZpeCB0aGUgZGVmYXVsdCBjdXJsYnVpbGQuaCBmaWxlIGZvciB0aGUKICBTdW5Qcm8gY29tcGlsZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBKYW4gMjAwOSkKLSBCYXNlZCBvbiBidWcgcmVwb3J0ICMyNDk4NjY1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDk4NjY1KQogIGJ5IERhbmllbCBCbGFjaywgSSd2ZSBub3cgYWRkZWQgbWFnaWMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWtlcyBpdAogIHVzZSBwa2ctY29uZmlnIHRvIGRldGVjdCBnbnV0bHMgZGV0YWlscyBhcyB3ZWxsIGlmIHRoZSBleGlzdGluZyBtZXRob2QKICAodXNpbmcgbGliZ251dGxzLWNvbmZpZykgZmFpbHMuIFdoaWxlIGRvaW5nIHRoaXMsIEkgY2xlYW5lZCB1cCBhbmQgdW5pZmllZAogIHRoZSBwa2ctY29uZmlnIHVzYWdlIHdoZW4gZGV0ZWN0aW5nIG9wZW5zc2wgYW5kIG5zcyBhcyB3ZWxsLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMjAwOSkKLSBLYXJsIE1vZXJkZXIgYnJvdWdodCB0aGUgcGF0Y2ggdGhhdCBjcmVhdGVzIHZjOSBNYWtlZmlsZXMsIGFuZCBJIG1hZGUKICAnbWFrZXRneicgbm93IHVzZSB0aGUgYWN0dWFsIG1ha2VmaWxlIHRhcmdldHMgdG8gZG8gdGhlIFZDOCBhbmQgVkM5CiAgbWFrZWZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBKYW4gMjAwOSkKLSBFbWlsIFJvbWFudXMgZml4ZWQ6CgogIFdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBvdmVyIEhUVFAgYW5kIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIExvY2F0aW9uCiAgaGVhZGVyLCB0aGUgcnVubmluZyBlYXN5IGhhbmRsZSB3aWxsIGdldCBzdHVjayBpbiB0aGUgQ1VSTE1fU1RBVEVfUEVSRk9STQogIHN0YXRlLCBsZWF2aW5nIHRoZSBleHRlcm5hbCBldmVudCBsb29wIHN0dWNrIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSB0aGUKICBpbmdvaW5nIHNvY2tldCAod2hlbiB1c2luZyB0aGUgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uIHN0dWZmKS4gV2hpbGUgdGhpcwogIGJ1ZyB3YXMgcHJldHR5IGhhcmQgdG8gZmluZCwgaXQgc2VlbXMgdG8gcmVxdWlyZSBvbmx5IGEgb25lLWxpbmUgZml4LiBUaGUKICBicmVhayBzdGF0ZW1lbnQgb24gbGluZSAxMzc0IGluIG11bHRpLmMgY2F1c2VkIHRoZSBmdW5jdGlvbiB0byBza2lwIHRoZSBjYWxsCiAgdG8gbXVsdGlzdGF0ZSgpLgoKICBIb3cgdG8gcmVwcm9kdWNlIHRoaXMgYnVnPyBXZWxsLCB0aGF0J3MgYW5vdGhlciBxdWVzdGlvbi4gIGV2aGlwZXJmaWZvLmMgaW4KICB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IGNob2tlcyBvbiB0aGlzIGJ1ZyBvbmx5IF9zb21ldGltZXNfLCBwcm9iYWJseQogIGRlcGVuZGluZyBvbiBob3cgZmFzdCB0aGUgVVJMcyBhcmUgYWRkZWQuIE9uZSB3YXkgb2YgdGVzdGluZyB0aGUgYnVnIG91dCBpcwogIHdyaXRpbmcgdG8gaGlwZXIuZmlmbyBmcm9tIG1vcmUgdGhhbiBvbmUgc291cmNlIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSmFuIDIwMDkpCi0gVW5pZmllZCBtdWNoIG9mIHRoZSBTZXNzaW9uSGFuZGxlIGluaXRpYWxpemF0aW9uIGRvbmUgaW4gQ3VybF9vcGVuKCkgYW5kCiAgY3VybF9lYXN5X3Jlc2V0KCkgYnkgY3JlYXRpbmcgQ3VybF9pbml0X3VzZXJkZWZpbmVkKCkuIFRoaXMgaGFkIHRoZSBzaWRlCiAgZWZmZWN0IG9mIGZpeGluZyBjdXJsX2Vhc3lfcmVzZXQoKSBzbyBpdCBub3cgYWxzbyByZXNldHMKICBDVVJMT1BUX0ZUUF9GSUxFTUVUSE9EIGFuZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUKCkRhbmllbCBTdGVuYmVyZyAoNyBKYW4gMjAwOSkKLSBSb2IgQ3JpdHRlbmRlbiBkaWQgb25jZSBhZ2FpbiBwcm92aWRlIGFuIE5TUyB1cGRhdGU6CgogIEkgaGF2ZSB0byBqdW1wIHRocm91Z2ggYSBmZXcgaG9vcHMgbm93IHdpdGggdGhlIE5TUyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uCiAgc2luY2UgYW5vdGhlciBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uIG1heSBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgTlNTIGJ5IHRoZQogIHRpbWUgQ3VybCBnZXRzIGludm9rZWQuIFRoaXMgcGF0Y2ggaXMgbW9yZSBjYXJlZnVsIHRvIG9ubHkgc2h1dGRvd24gdGhlIE5TUwogIGxpYnJhcnkgaWYgQ3VybCBkaWQgdGhlIGluaXRpYWxpemF0aW9uLgoKICBJdCBhbHNvIGFkZHMgaW4gYSBiaXQgb2YgY29kZSB0byBzZXQgdGhlIGRlZmF1bHQgY2lwaGVycyBpZiB0aGUgYXBwIHRoYXQKICBjYWxsIE5TU19Jbml0KiBkaWQgbm90IGNhbGwgTlNTX1NldERvbWVzdGljUG9saWN5KCkgb3Igc2V0IHNwZWNpZmljCiAgY2lwaGVycy4gT25lIG1pZ2h0IGFyZ3VlIHRoYXQgdGhpcyBsZXRzIG90aGVyIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgZ2V0CiAgbGF6eSBhbmQvb3IgdGhleSBhcmVuJ3QgdXNpbmcgdGhlIE5TUyBBUEkgY29ycmVjdGx5LCBhbmQgeW91J2QgYmUgcmlnaHQuCiAgQnV0IHN0aWxsLCB0aGlzIHdpbGwgYXZvaWQgdGVycmlibHkgZGlmZmljdWx0LXRvLXRyYWNlIGNyYXNoZXMgYW5kIGlzCiAgZ2VuZXJhbGx5IGhlbHBmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSmFuIDIwMDkpCi0gJ3JlY29uZicgaXMgcmVtb3ZlZCBzaW5jZSB3ZSByYXRoZXIgaGF2ZSB1c2VycyB1c2UgJ2J1aWxkY29uZicKCkRhbmllbCBTdGVuYmVyZyAoMzEgRGVjIDIwMDgpCi0gQmFzIE1ldmlzc2VuIHJlcG9ydGVkIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0NzkwMzAgcG9pbnRpbmcKICBvdXQgdGhhdCAncmVjb25mJyBkaWRuJ3QgcHJvcGVybHkgcG9pbnQgb3V0IHRoZSBtNCBzdWJkaXJlY3Rvcnkgd2hlbiBydW5uaW5nCiAgYWNsb2NhbC4KCkRhbmllbCBTdGVuYmVyZyAoMjkgRGVjIDIwMDgpCiAtIFBoaWwgTGlzaWVja2kgZmlsZWQgYnVnIHJlcG9ydCAjMjQxMzA2NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDEzMDY3KSB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQKICB3b3VsZCBjYXVzZSBsaWJjdXJsIHRvIG1hcmsgYSBETlMgY2FjaGUgZW50cnkgImluIHVzZSIgZXRlcm5hbGx5IGlmIHRoZQogIHN1YnNlcXVlbmNlIFRDUCBjb25uZWN0IGZhaWxlZC4gSXQgd291bGQgdGh1cyBuZXZlciBnZXQgcHJ1bmVkIGFuZCByZWZyZXNoZWQKICBhcyBpdCBzaG91bGQndmUgYmVlbi4KCiAgUGhpbCBwcm92aWRlZCBoaXMgb3duIHBhdGNoIHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdoaWxlIGl0IHNlZW1lZCB0byB3b3JrCiAgd2Fzbid0IGNvbXBsZXRlIGFuZCB0aHVzIEkgd3JvdGUgbXkgb3duIGZpeCB0byB0aGUgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjggRGVjIDIwMDgpCi0gUGV0ZXIgS29yc2dhYXJkIGZpeGVkIGJ1aWxkaW5nIGxpYmN1cmwgd2l0aCAiY29uZmlndXJlIC0td2l0aC1zc2wKICAtLWRpc2FibGUtdmVyYm9zZSIuCgotIEFudGhvbnkgQnJ5YW4gZml4ZWQgbW9yZSBsYW5ndWFnZSBhbmQgc3BlbGxpbmcgZmxhd3MgaW4gbWFuIHBhZ2VzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBEZWMgMjAwOCkKLSBHaXZlbiBhIHJlY2VudCBlbm91Z2ggbGlic3NoMiwgbGliY3VybCBjYW4gbm93IHNlZWsvcmVzdW1lIHdpdGggU0ZUUCBldmVuCiAgb24gZmlsZSBpbmRleGVzIGJleW9uZCAyIG9yIDRHQi4KCi0gQW50aG9ueSBCcnlhbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgY2xlYW5lZCB1cCBtYW51YWwgbGFuZ3VhZ2UsCiAgY29ycmVjdGVkIHNwZWxsaW5ncyBhbmQgbW9yZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRGVjIDIwMDgpCi0gSWdvciBOb3Zvc2VsdHNldiBmaXhlZCBhIGJhZCBzaXR1YXRpb24gZm9yIHRoZSBtdWx0aV9zb2NrZXQoKSBBUEkgd2hlbiBkb2luZwogIHBpcGVsaW5pbmcsIGFzIGxpYmN1cmwgY291bGQgdGhlbiBlYXNpbHkgZ2V0IGNvbmZ1c2VkIGFuZCBBKSB3b3JrIG9uIHRoZQogIGhhbmRsZSB0aGF0IHdhcyBub3QgImZpcnN0IGluIHF1ZXVlIiBvbiBhIHBpcGVsaW5lLCBvciBldmVuIEIpIHRlbGwgdGhlIGFwcAogIHRvIFJFTU9WRSBhIHNvY2tldCB3aGlsZSBpdCB3YXMgaW4gdXNlIGJ5IGEgc2Vjb25kIGhhbmRsZSBpbiBhIHBpcGVsaW5lLiBCb3RoCiAgZXJyb3JzIGNhdXNlZCBoYW5naW5nIG9yIHN0YWxsaW5nIGFwcGxpY2F0aW9ucy4KCkRhbmllbCBTdGVuYmVyZyAoMTkgRGVjIDIwMDgpCi0gY3VybF9tdWx0aV90aW1lb3V0KCkgY291bGQgcmV0dXJuIGEgdGltZW91dCB2YWx1ZSBvZiAwIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICB3YXMgYWN0dWFsbHkgcmVhZHkgdG8gZ2V0IGRvbmUsIGFzIHRoZSBpbnRlcm5hbCB0aW1lIHJlc29sdXRpb24gaXMgaGlnaGVyCiAgdGhhbiB0aGUgcmV0dXJuZWQgbWlsbGlzZWNvbmQgdGltZXIuIFRoZXJlZm9yZSBpdCBjb3VsZCBjYXVzZSBhcHBsaWNhdGlvbnMKICBydW5uaW5nIG9uIGZhc3QgcHJvY2Vzc29ycyB0byBkbyBzaG9ydCBidXJzdHMgb2YgYnVzeS1sb29wcy4KICBjdXJsX211bHRpX3RpbWVvdXQoKSB3aWxsIG5vdyBvbmx5IHJldHVybiAwIGlmIHRoZSB0aW1lb3V0IGlzIGFjdHVhbGx5CiAgYWxyZWF5IHRyaWdnZXJlZC4KCi0gVXNpbmcgdGhlIGxpYnNzaDIgMC4xOSBmdW5jdGlvbiBsaWJzc2gyX3Nlc3Npb25fYmxvY2tfZGlyZWN0aW9ucygpLCBsaWJjdXJsCiAgbm93IGhhcyBhbiBpbXByb3ZlZCBhYmlsaXR5IHRvIGRvIHJpZ2h0IHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSAoYm90aAogICJyZWd1bGFyIiBhbmQgbXVsdGlfc29ja2V0KSBpcyB1c2VkIGZvciBTQ1AgYW5kIFNGVFAgdHJhbnNmZXJzLiBUaGlzIHNob3VsZAogIHJlc3VsdCBpbiAobXVjaCkgbGVzcyBidXN5LWxvb3Agc2l0dWF0aW9ucyBhbmQgdGh1cyBsZXNzIENQVSB1c2FnZSB3aXRoIG5vCiAgc3BlZWQgbG9zcy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgRGVjIDIwMDgpCi0gU0NQIGFuZCBTRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBoYWQgdGhlIHNhbWUgZmxhdzogdGhlICdET05FJwogIG9wZXJhdGlvbiBkaWRuJ3QgY29tcGxldGUgcHJvcGVybHkgaWYgdGhlIEVBR0FJTiBlcXVpdmFsZW50IHdhcyByZXR1cm5lZCBidXQKICBsaWJjdXJsIHdvdWxkIHNpbXBseSBjb250aW51ZSB3aXRoIGEgaGFsZi1jb21wbGV0ZWQgY2xvc2Ugb3BlcmF0aW9uCiAgcGVyZm9ybWVkLiBUaGlzIHJ1aW5lZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gcmUtdXNlIGFuZCBjYXVzZSBzb21lCiAgU1NILXByb3RvY29sIGVycm9ycyBpbiBnZW5lcmFsLiBUaGUgY29ycmVjdGlvbiBpcyB1bmZvcnR1bmF0ZWx5IGFkZGluZyBhCiAgYmxvY2tpbmcgZnVuY3Rpb24gLSBkb2luZyBpdCBlbnRpcmVseSBub24tYmxvY2tpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yCiAgYSBiZXR0ZXIgZml4LgoKR2lzbGUgVmFuZW0gKDE2IERlYyAyMDA4KQotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UgdGhlIFdhdHQtMzIgdGNwL2lwIHN0YWNrIHVuZGVyIFdpbmRvd3MuCiAgVGhlIGNoYW5nZSBzaW1wbHkgaW52b2x2ZWQgYWRkaW5nIGEgVVNFX1dBVFQzMiBzZWN0aW9uIGluIHRoZQogIGNvbmZpZy13aW4zMi5oIGZpbGVzICh1bmRlciAuL2xpYiBhbmQgLi9zcmMpLiBUaGlzIHNlY3Rpb24gZGlzYWJsZXMKICB0aGUgdXNlIG9mIGFueSBXaW5zb2NrIGhlYWRlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IERlYyAyMDA4KQotIGxpYnNzaDJfc2Z0cF9sYXN0X2Vycm9yKCkgd2FzIHdyb25nbHkgdXNlZCBhdCBzb21lIHBsYWNlcyBpbiBsaWJjdXJsIHdoaWNoCiAgbWFkZSBsaWJjdXJsIHNvbWV0aW1lcyBub3QgcHJvcGVybHkgYWJvcnQgcHJvYmxlbWF0aWMgU0ZUUCB0cmFuc2ZlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA4KQotIE1vcmUgd29yayB3aXRoIElnb3IgTm92b3NlbHRzZXYgdG8gZmlyc3QgZml4IHRoZSByZW1haW5pbmcgc3R1ZmYgZm9yCiAgcmVtb3ZpbmcgZWFzeSBoYW5kbGVzIGZyb20gbXVsdGkgaGFuZGxlcyB3aGVuIHRoZSBlYXN5IGhhbmRsZSBpcy93YXMgd2l0aGluCiAgYSBIVFRQIHBpcGVsaW5lLiBIaXMgYnVnIHJlcG9ydCAjMjM1MTY1MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjUzKSB3YXMgYWxzbyByZWxhdGVkIGFuZCB3YXMKICBldmVudHVhbGx5IGZpeGVkIGJ5IGEgcGF0Y2ggYnkgSWdvciBoaW1zZWxmLgoKWWFuZyBUc2UgKDEyIERlYyAyMDA4KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgYSBidWlsZCByZWdyZXNzaW9uLCBpbnRyb2R1Y2VkIGluIDcuMTkuMiwgYWZmZWN0aW5nCiAgT1MvNDAwIGNvbXBpbGF0aW9ucyB3aXRoIElQdjYgZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTIgRGVjIDIwMDgpCi0gTWFyayBLYXJwZWxlcyBmaWxlZCBidWcgcmVwb3J0ICMyNDE2MTgyIHRpdGxlZCAiY3Jhc2ggaW4gQ29ubmVjdGlvbkV4aXN0cwogIHdoZW4gdXNpbmcgZHVwaGFuZGxlK2N1cmxfbXV0bGkiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0MTYxODIpIHdoaWNoIHNob3dlZCB0aGF0CiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdyb25nbHkgYWxzbyBjb3BpZWQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpb24KICBjYWNoZSwgd2hpY2ggd2FzIHBsYWluIHdyb25nIGFuZCBjYXVzZWQgYSBzZWdmYXVsdCBpZiB0aGUgaGFuZGxlIHdvdWxkIGJlCiAgdXNlZCBpbiBhIGRpZmZlcmVudCBtdWx0aSBoYW5kbGUgdGhhbiB0aGUgaGFuZGxlIGl0IHdhcyBkdXBsaWNhdGVkIGZyb20uCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEtlc2hhdiBLcml0eSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGZhaWxlZCB0byBkZWFsIHdpdGggZG90dGVkIElQdjYKICBhZGRyZXNzZXMgaWYgdGhleSB3ZXJlIHZlcnkgbG9uZyAoPjM5IGxldHRlcnMpIGR1ZSB0byBhIHRvbyBzdHJpY3QgYWRkcmVzcwogIHZhbGlkaXR5IHBhcnNlci4gSXQgbm93IGFjY2VwdHMgYWRkcmVzc2VzIHVwIHRvIDQ1IGJ5dGVzIGxvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEludGVybmV0IEV4cGxvcmVyIGhhZCBhIGJyb2tlbiBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdjcgYW5kCiAgdGhlcmUgYXJlIHNlcnZlcnMgIm91dCB0aGVyZSIgdGhhdCByZWxpZXMgb24gdGhlIGNsaWVudCBkb2luZyB0aGlzIGJyb2tlbgogIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gQXBhY2hlIGV2ZW4gY29tZXMgd2l0aCBhbiBvcHRpb24gdG8gd29yayB3aXRoIHN1Y2gKICBicm9rZW4gY2xpZW50cy4KCiAgVGhlIGRpZmZlcmVuY2UgaXMgb25seSBmb3IgVVJMcyB0aGF0IGNvbnRhaW4gYSBxdWVyeS1wYXJ0IChhICc/Jy1sZXR0ZXIgYW5kCiAgdGV4dCB0byB0aGUgcmlnaHQgb2YgaXQpLgoKICBsaWJjdXJsIG5vdyBzdXBwb3J0cyB0aGlzIHF1aXJrLCBhbmQgeW91IGVuYWJsZSBpdCBieSBzZXR0aW5nIHRoZQogIENVUkxBVVRIX0RJR0VTVF9JRSBiaXQgaW4gdGhlIGJpdG1hc2sgeW91IHBhc3MgdG8gdGhlIENVUkxPUFRfSFRUUEFVVEggb3IKICBDVVJMT1BUX1BST1hZQVVUSCBvcHRpb25zLiBUaGV5IGFyZSB0aHVzIGluZGl2aWR1YWxseSBjb250cm9sbGVkIHRvIHNlcnZlcgogIGFuZCBwcm94eS4KCiAgKG5vdGUgdGhhdCB0aGVyZSdzIG5vIHdheSB0byBhY3RpdmF0ZSB0aGlzIHdpdGggdGhlIGN1cmwgdG9vbCB5ZXQpCgpEYW5pZWwgRmFuZHJpY2ggKDkgRGVjIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDg5IGFuZCAxMDkwIHRvIHRlc3QgLS13cml0ZS1vdXQgYWZ0ZXIgYSByZWRpcmVjdCB0bwogIHRlc3QgYSByZXBvcnQgdGhhdCB0aGUgc2l6ZSBkaWRuJ3Qgd29yaywgYnV0IHRoZXNlIHRlc3QgY2FzZXMgcGFzcy4KCi0gRG9jdW1lbnRlZCBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhcyBiZWluZyB1c2VmdWwgb25seSBvbiBIVFRQIFVSTHMuCgpEYW5pZWwgU3RlbmJlcmcgKDkgRGVjIDIwMDgpCi0gS2VuIEhpcnNjaCBzaW1wbGlmaWVkIGhvdyBsaWJjdXJsIGRvZXMgRlRQUzogbm93IGl0IGRvZXNuJ3QgYXNzdW1lIGFueQogIHBhcnRpY3VsYXIgc3RhdGUgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gbGlrZSBpdCBkaWQgYmVmb3JlIGZvciBpbXBsaWNpdAogIEZUUFMgKGxpYmN1cmwgYXNzdW1lZCBzdWNoIGNvbnRyb2wgY29ubmVjdGlvbnMgdG8gYmUgZW5jcnlwdGVkIHdoaWxlIHNvbWUKICBGVFBTIHNlcnZlcnMgc3VjaCBhcyBGaWxlWmlsbGEgYXNzdW1lcyBzdWNoIGNvbm5lY3Rpb25zIHRvIGJlIGNsZWFyCiAgbW9kZSkuIFVzZSB0aGUgQ1VSTE9QVF9VU0VfU1NMIG9wdGlvbiB0byBzZXQgeW91ciBkZXNpcmVkIGxldmVsLgoKRGFuaWVsIFN0ZW5iZXJnICg4IERlYyAyMDA4KQotIEZyZWQgTWFjaGFkbyBwb3N0ZWQgYWJvdXQgYSB3ZWlyZCBGVFAgcHJvYmxlbSBvbiB0aGUgY3VybC11c2VycyBsaXN0IGFuZCB3aGVuCiAgcmVzZWFyY2hpbmcgaXQsIGl0IHR1cm5lZCBvdXQgaGUgZ290IGEgNTUwIHJlc3BvbnNlIGJhY2sgZnJvbSBhIFNJWkUgY29tbWFuZAogIGFuZCB0aGVuIEkgZmVsbCBvdmVyIHRoZSB0ZXh0IGluIFJGQzM2NTkgdGhhdCBzYXlzOgoKICAgVGhlIHByZXNlbmNlIG9mIHRoZSA1NTAgZXJyb3IgcmVzcG9uc2UgdG8gYSBTSVpFIGNvbW1hbmQgTVVTVCBOT1QgYmUgdGFrZW4KICAgYnkgdGhlIGNsaWVudCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgY2Fubm90IGJlIHRyYW5zZmVycmVkIGluIHRoZQogICBjdXJyZW50IE1PREUgYW5kIFRZUEUuCgogIEluIG90aGVyIHdvcmRzOiB0aGUgY2hhbmdlIEkgZGlkIG9uIFNlcHRlbWJlciAzMHRoIDIwMDggYW5kIHRoYXQgaGFzIGJlZW4KICBpbmNsdWRlZCBpbiB0aGUgbGFzdCB0d28gcmVsZWFzZXMgd2VyZSBhIHJlZ3Jlc3Npb24gYW5kIGEgYmFkIGlkZWEuIFdlIE1VU1QKICBOT1QgdGFrZSBhIDU1MCByZXNwb25zZSBmcm9tIFNJWkUgYXMgYSBoaW50IHRoYXQgdGhlIGZpbGUgZG9lc24ndCBleGlzdC4KCi0gQ2hyaXN0aWFuIEtyYXVzZSBmaWxlZCBidWcgIzIyMjEyMzcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIyMTIzNykgdGhhdCBpZGVudGlmaWVkIGFuIGluZmluaXRlCiAgbG9vcCBkdXJpbmcgR1NTIGF1dGhlbnRpY2F0aW9uIGdpdmVuIHNvbWUgc3BlY2lmaWMgY29uZGl0aW9ucy4gV2l0aCBoaXMKICBwYXRpZW5jZSBhbmQgZ3JlYXQgZmVlZGJhY2sgSSBtYW5hZ2VkIHRvIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtIGFuZAogIGV2ZW50dWFsbHkgZml4IGl0IGFsdGhvdWdoIEkgY2FuJ3QgdGVzdCBhbnkgb2YgdGhpcyBteXNlbGYhCgpEYW5pZWwgRmFuZHJpY2ggKDMgRGVjIDIwMDgpCi0gRml4ZWQgdGhlIGdldGlmYWRkcnMgdmVyc2lvbiBvZiBDdXJsX2lmMmlwIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRob3V0IElQdjYKICBzdXBwb3J0IChlLmcuIE1pbml4KQoKRGFuaWVsIFN0ZW5iZXJnICgzIERlYyAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgZmlsZWQgYnVnICMyMzUxNjQ1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzNTE2NDUpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBvY2N1cmVkIGlmIHlvdSByZW1vdmVkIGFuIGVhc3kgaGFuZGxlIHdoaWxlIGluCiAgcHJvZ3Jlc3MgYW5kIHRoZSBoYW5kbGUgd2FzIHVzZWQgaW4gYSBIVFRQIHBpcGVsaW5lLgoKLSBQYXdlbCBLaWVyc2tpIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29va2llIGNvZGUgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBiYWQgZmNsb3NlKCkgYWZ0ZXIgYSBmYXRhbCBlcnJvciBoYWQgb2NjdXJlZC4KICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjM4MjIxOSkKCkRhbmllbCBGYW5kcmljaCAoMjUgTm92IDIwMDgpCi0gSWYgYSBIVFRQIHJlcXVlc3QgaXMgQmFzaWMgYW5kIG51bSBpcyBhbHJlYWR5ID49MTAwMCwgdGhlIEhUVFAgdGVzdAogIHNlcnZlciBhZGRzIDEgdG8gbnVtIHRvIGdldCB0aGUgZGF0YSBzZWN0aW9uIHRvIHJldHVybi4gVGhpcyBhbGxvd3MKICB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9ucyB1c2luZyB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24KICBtZXRob2QuCgotIEFkZGVkIHRlc3RzIDEwODcgYW5kIDEwODggdG8gdGVzdCBCYXNpYyBhdXRoZW50aWNhdGlvbiBvbiBhIHJlZGlyZWN0CiAgd2l0aCBhbmQgd2l0aG91dCAtLWxvY2F0aW9uLXRydXN0ZWQKCkRhbmllbCBTdGVuYmVyZyAoMjQgTm92IDIwMDgpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBWbGFkIEdyYWNob3YsIGxpYmN1cmwgbm93IHVzZXMgYSBuZXcgbGlic3NoMiAwLjE5CiAgZnVuY3Rpb24gd2hlbiBidWlsdCB0byBzdXBwb3J0IFNDUCBhbmQgU0ZUUCB0aGF0IGhlbHBzIHRoZSBsaWJyYXJ5IHRvIGtub3cKICBpbiB3aGljaCBkaXJlY3Rpb24gYSBwYXJ0aWN1bGFyIGxpYnNzaDIgb3BlcmF0aW9uIHdvdWxkIHJldHVybiBFQUdBSU4gc28KICB0aGF0IGxpYmN1cmwga25vd3Mgd2hhdCBzb2NrZXQgY29uZGl0aW9ucyB0byB3YWl0IGZvciBiZWZvcmUgdHJ5aW5nIHRoZQogIGZ1bmN0aW9uIGNhbGwgYWdhaW4uIFByZXZpb3VzbHkgKGFuZCBzdGlsbCB3aGVuIHVzaW5nIGxpYnNzaDIgMC4xOCBvcgogIGVhcmxpZXIpLCBsaWJjdXJsIHdpbGwgYnVzeS1sb29wIGluIHRoaXMgc2l0dWF0aW9uIHdoZW4gdGhlIGVhc3kgaW50ZXJmYWNlCiAgaXMgdXNlZCEKCkRhbmllbCBGYW5kcmljaCAoMjAgTm92IDIwMDgpCi0gQXV0b21hdGljYWxseSBkZXRlY3QgT3BlbkJTRCdzIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBOb3YgMjAwOCkKLSBJIHJlbW92ZWQgdGhlIGRlZmF1bHQgdXNlIG9mICJQcmFnbWE6IG5vLWNhY2hlIiBmcm9tIGxpYmN1cmwgd2hlbiBhIHByb3h5IGlzCiAgdXNlZC4gSXQgaGFzIGJlZW4gdXNlZCBzaW5jZSBmb3JldmVyIGJ1dCBpdCB3YXMgbmV2ZXIgYSBnb29kIGlkZWEgdG8gdXNlCiAgdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgZm9yLgoKLSBKb3NlZiBXb2xmJ3MgZXh0ZW5zaW9uIHRoYXQgYWxsb3dzIGEgJFRFU1RESVIvZ2RiaW5pdCR0ZXN0bnVtIGZpbGUgdGhhdCB3aGVuCiAgeW91IHVzZSBydW50ZXN0cy5wbCAtZywgd2lsbCBiZSBzb3VyY2VkIGJ5IGdkYiB0byBhbGxvdyBhZGRpdGlvbmFsIGZhbmN5IG9yCiAgd2hhdGV2ZXIgeW91IHNlZSBmaXQKCi0gQ2hyaXN0aWFuIEtyYXVzZSByZXBvcnRlZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IHdvdWxkIG9jY3VyIHdpdGggSFRUUAogIEdTUy9rZXJiZXJvcyBhdXRoZW50aWNhdGlvbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI4NDM4NikKCi0gQW5kcmVhcyBXdXJmIGFuZCBNYXJrdXMgS29ldHRlciBoZWxwZWQgbWUgYW5hbHl6ZSBhIHByb2JsZW0gdGhhdCBBbmRyZWFzIGdvdAogIHdoZW4gdXBsb2FkaW5nIGZpbGVzIHRvIGEgc2luZ2xlIEZUUCBzZXJ2ZXIgdXNpbmcgbXVsdGlwbGUgZWFzeSBoYW5kbGUKICBoYW5kbGVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gT2NjYXNpb25hbGx5IGEgaGFuZGxlIHdvdWxkIHN0YWxsIGluCiAgbXlzdGVyaW91cyB3YXlzLgoKICBUaGUgcHJvYmxlbSB0dXJuZWQgb3V0IHRvIGJlIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIENvbm5lY3Rpb25FeGlzdHMoKQogIGZ1bmN0aW9uJ3MgZWFnZXJuZXNzIHRvIHJlLXVzZSBhIGhhbmRsZSBmb3IgSFRUUCBwaXBlbGluaW5nIHNvIGl0IHdvdWxkCiAgc2VsZWN0IGl0IGV2ZW4gaWYgYWxyZWFkeSBiZWluZyBpbiB1c2UsIGR1ZSB0byBhbiBpbmFkZXF1YXRlIGNoZWNrIGZvciBpdHMKICBjaGFuY2VzIG9mIGJlaW5nIHVzZWQgZm9yIHBpcGVsbmluaW5nLgoKRGFuaWVsIEZhbmRyaWNoICgxNyBOb3YgMjAwOCkKLSBBZGRlZCBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjIDQuMwoKWWFuZyBUc2UgKDE3IE5vdiAyMDA4KQotIEZpeCBhIHJlbWFpbmluZyBwcm9ibGVtIGluIHRoZSBpbmV0X3B0b24oKSBydW50aW1lIGNvbmZpZ3VyZSBjaGVjay4gQW5kCiAgZml4IGludGVybmFsIEN1cmxfaW5ldF9wdG9uKCkgZmFpbHVyZXMgdG8gcmVqZWN0IGNlcnRhaW4gbWFsZm9ybWVkIGxpdGVyYWxzLgoKLSBNYWtlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgaWYgaW9jdGwgd2l0aCB0aGUgU0lPQ0dJRkFERFIgY29tbWFuZCBjYW4gYmUKICB1c2VkLCBhbmQgZGVmaW5lIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIgaWYgYXBwcm9wcmlhdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE5vdiAyMDA4KQotIENocmlzdGlhbiBLcmF1c2UgZml4ZWQgYSBidWlsZCBmYWlsdXJlIHdoZW4gYnVpbGRpbmcgd2l0aCBnc3Mgc3VwcG9ydAogIGVuYWJsZWQgYW5kIEZUUCBkaXNhYmxlZC4KCi0gQWRkZWQgY2hlY2sgZm9yIE5VTEwgcmV0dXJucyBmcm9tIHN0cmR1cCgpIGluIHNyYy9tYWluLmMgYW5kIGxpYi9mb3JtZGF0YS5jCiAgLSByZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcgYWxzbyBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBvbiBNU0RPUyB3aGVuIHlvdSBkbwogIGZvciBleGFtcGxlIC1PIG9uIGEgdXJsIHdpdGggYSBmaWxlIG5hbWUgcGFydCBsb25nZXIgdGhhbiBQQVRIX01BWCBsZXR0ZXJzCgotIGxpYi9uc3MuYyBmaXhlcyBiYXNlZCBvbiB0aGUgcmVwb3J0IGJ5IEppbSBNZXllcmluZzogSSB3ZW50IG92ZXIgYW5kIGFkZGVkCiAgY2hlY2tzIGZvciByZXR1cm4gY29kZXMgZm9yIGFsbCBjYWxscyB0byBtYWxsb2MgYW5kIHN0cmR1cCB0aGF0IHdlcmUKICBtaXNzaW5nLiBJIGFsc28gY2hhbmdlZCBhIGZldyBtYWxsb2MoMTMpIHRvIHVzZSBhcnJheXMgb24gdGhlIHN0YWNrIGFuZCBhCiAgZmV3IG1hbGxvYyhQQVRIX01BWCkgdG8gaW5zdGVhZCB1c2UgYXByaW50ZigpIHRvIGxvd2VyIG1lbW9yeSB1c2UuCgotIEkgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiBDdXJsX25zc19jb25uZWN0KCkgd2hlbiBDVVJMT1BUX0lTU1VFUkNFUlQgaXMKICBpbiB1c2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE0IE5vdiAyMDA4KQotIEFkZGVkIC54bWwgYXMgb25lIG9mIHRoZSBmZXcgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyBrbm93biBieSB0aGUgbXVsdGlwYXJ0CiAgZm9ybSBnZW5lcmF0b3IuCgotIEFkZGVkIHNvbWUgI2lmZGVmcyBhcm91bmQgaGVhZGVyIGZpbGVzIGFuZCBjaGFuZ2UgdGhlIEVBR0FJTiB0ZXN0IHRvCiAgZml4IGNvbXBpbGF0aW9uIG9uIENlbGwgKHJlcG9ydGVkIGJ5IEplZmYgQ3VybGV5KS4KCllhbmcgVHNlICgxNCBOb3YgMjAwOCkKLSBGaXhlZCBzZXZlcmFsIGNvbmZpZ3VyZSBzY3JpcHQgaXNzdWVzIGFmZmVjdGluZyBjaGVja3MgZm9yIGluZXRfbnRvYV9yKCksCiAgaW5ldF9udG9wKCksIGluZXRfcHRvbigpLCBnZXRpZmFkZHJzKCksIGZjbnRsKCkgYW5kIGdldGFkZHJpbmZvKCkuCgpZYW5nIFRzZSAoMTMgTm92IDIwMDgpCi0gUmVmYWN0b3JlZCBjb25maWd1cmUgc2NyaXB0IGRldGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byBzZXQgc29ja2V0cyBpbnRvCiAgbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBkZWNvdXBsZSBmdW5jdGlvbiBkZXRlY3Rpb24gZnJvbSBmdW5jdGlvbiBjYXBhYmlsaXR5LgoKVmVyc2lvbiA3LjE5LjIgKDEzIE5vdmVtYmVyIDIwMDgpCgpNaWNoYWwgTWFyZWsgKDEzIE5vdiAyMDA4KQotIEZpeGVkIGEgcG90ZW50aWFsIGRhdGEgbG9zcyBpbiBDdXJsX2NsaWVudF93cml0ZSgpIHdoZW4gdGhlIHRyYW5zZmVyIGlzCiAgcGF1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBOb3YgMjAwOCkKLSBSYWluZXIgQ2FuYXZhbiBmaWxlZCBidWcgIzIyNTU2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI1NTYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBhCiAgcHJvZ3JhbSB1c2luZyBsaWJjdXJsJ3MgbXVsdGkgaW50ZXJmYWNlIHRvIGRvd25sb2FkIGEgSFRUUFMgcGFnZSB3aXRoIGEKICBsaWJjdXJsIGJ1aWx0IHBvd2VyZWQgYnkgT3BlblNTTCwgd291bGQgZWFzaWx5IGdldCBzaWxseSBhbmQgaW5zdGVhZCBoYW5kCiAgb3ZlciBTU0wgZGV0YWlscyBhcyBkYXRhIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBIVFRQIGhlYWRlcnMgYW5kIGJvZHkuIFRoaXMKICBoYXBwZW5lZCBiZWNhdXNlIGxpYmN1cmwgd291bGQgY29uc2lkZXIgdGhlIGNvbm5lY3Rpb24gaGFuZHNoYWtlIGRvbmUgdG9vCiAgZWFybHkuIFRoaXMgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBhdCBTZXB0ZW1iZXIgMjJuZCAyMDA4IHdpdGggbXkgZml4IG9mIHRoZQogIGJ1ZyAjMjEwNzM3NwoKICBUaGUgY29ycmVjdCBmaXggaXMgbm93IGluc3RlYWQgZG9uZSB3aXRoaW4gdGhlIEdudVRMUy1oYW5kbGluZyBjb2RlLCBhcyBib3RoCiAgdGhlIE9wZW5TU0wgYW5kIHRoZSBOU1MgY29kZSBhbHJlYWR5IGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBpbiBzaW1pbGFyCiAgZmFzaGlvbi4gSSBhZGRlZCB0ZXN0IGNhc2UgNTYwIGluIGFuIGF0dGVtcHQgdG8gdmVyaWZ5IHRoaXMgZml4LCBidXQKICB1bmZvcnR1bmF0ZWx5IGl0IGRpZG4ndCB0cmlnZ2VyIGl0IGV2ZW4gYmVmb3JlIHRoaXMgZml4IQoKWWFuZyBUc2UgKDExIE5vdiAyMDA4KQotIFJlbGF0ZWQgd2l0aCBidWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpCiAgRGFuaWVsIEZhbmRyaWNoIG5vdGljZWQgdGhhdCBjdXJsX2FkZHJpbmZvIHdhcyBhbHNvIG1pc3NpbmcgaW4gdGhlIGJ1aWxkCiAgcHJvY2VzcyBvZiBvdGhlciBmb3VyIG5vbi1jb25maWd1cmUgcGxhdGZvcm1zLiBBZGRlZCBub3cuCgpEYW5pZWwgRmFuZHJpY2ggKDcgTm92IDIwMDgpCi0gVGhlIGdldGlmYWRkcnMoKSB2ZXJzaW9uIG9mIEN1cmxfaWYyaXAoKSBjcmFzaGVkIHdoZW4gdXNlZCBvbiBhIExpbnV4CiAgc3lzdGVtIHdpdGggYSBURVFMIGxvYWQtYmFsYW5jaW5nIGRldmljZSBjb25maWd1cmVkLCB3aGljaCBkb2Vzbid0CiAgaGF2ZSBhbiBhZGRyZXNzLiAgVGhhbmtzIHRvIEFkYW0gU2FtcHNvbiBmb3Igc3BvdHRpbmcgdGhpcyAoYnVnICMyMjM0OTIzKS4KCllhbmcgVHNlICg2IE5vdiAyMDA4KQotIE1lcmdlZCBleGlzdGluZyBJUHY0IGFuZCBJUHY2IEN1cmxfaXAyYWRkciBmdW5jdGlvbnMgaW50byBhIHNpbmdsZSBvbmUKICB3aGljaCBub3cgYWxzbyB0YWtlcyBhIHByb3RvY29sIGFkZHJlc3MgZmFtaWx5IGFyZ3VtZW50LgoKLSBCdWcgIzIyMzA1MzUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMzA1MzUpIHBvaW50ZWQgb3V0IGEKICBwcm9ibGVtIHdpdGggTVNWQyA2IG1ha2VmaWxlIHRoYXQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZS4gSXQgd2FzIG5vdGVkIHRoYXQKICB0aGUgY3VybF9hZGRyaW5mby5vYmogcmVmZXJlbmNlIHdhcyBtaXNzaW5nLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHNvcnQKICB0aGUgbGlzdCBpbiB3aGljaCB0aGlzIHdhcyBtaXNzaW5nLiBJc3N1ZSBzdWJtaXR0ZWQgYnkgSm9obiBXaWxraW5zb24uCgpWZXJzaW9uIDcuMTkuMSAoNSBOb3ZlbWJlciAyMDA4KQoKRGFuaWVsIFN0ZW5iZXJnICg0IE5vdiAyMDA4KQotIENVUkxJTkZPX0ZJTEVUSU1FIG5vdyB3b3JrcyBmb3IgZmlsZTovLyB0cmFuc2ZlcnMgYXMgd2VsbAoKRGFuaWVsIFN0ZW5iZXJnICgzIE5vdiAyMDA4KQotIEJ1ZyAjMjIxODQ4MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIxODQ4MCkgcG9pbnRlZCBvdXQgYQogIHByb2JsZW0gd2l0aCBteSBDVVJMSU5GT19QUklNQVJZX0lQIGZpeCBmcm9tIE9jdG9iZXIgN3RoIHRoYXQgY2F1c2VkIGEgTlVMTAogIHBvaW50ZXIgcmVhZC4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHRoaXMgbG9naWMgKHN0b3Jpbmcgb2YKICB0aGUgY29ubmVjdGlvbidzIElQIGFkZHJlc3MpIHNvbWV3aGF0IGFzIHdlIGhhZCBpdCBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudAogIHBsYWNlcyBhbmQgd2F5cyBwcmV2aW91c2x5IGFuZCB0aGV5IGFyZSBub3cgdW5pZmllZC4KCllhbmcgVHNlICgzIE5vdiAyMDA4KQotIEZpeCB1bmRlcnNpemVkIElQdjYgYWRkcmVzcyBpbnRlcm5hbCBidWZmZXIuIElQdjYgYWRkcmVzcyBzdHJpbmdzIGxvbmdlcgogIHRoYW4gMzUgY2hhcmFjdGVycyB3b3VsZCBiZSB0cnVuY2F0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDIgTm92IDIwMDgpCi0gRGFuaWVsIEpvaG5zb24gcmVwb3J0ZWQgYW5kIGZpeGVkOgoKICBXaGVuIGMtYXJlcyBpc24ndCBlbmFibGVkLCBsaWJjdXJsIGJ5IGRlZmF1bHQgY2FsbHMgZ2V0YWRkcmluZm8gd2l0aCBmYW1pbHkKICBzZXQgdG8gUEZfVU5TUEVDIHdoaWNoIGNhdXNlcyBnZXRhZGRyaW5mbyB0byByZXR1cm4gYWxsIGF2YWlsYWJsZSBhZGRyZXNzZXMsCiAgYm90aCBJUHY0IGFuZCBJUHY2LiBMaWJjdXJsIHRoZW4gdHJpZXMgZWFjaCBvbmUgdW50aWwgaXQgY2FuIGNvbm5lY3QuIElmIHRoZQogIG5ldCBjb25uZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBJUHY2LCBsaWJjdXJsIGNhbiBzdGlsbCBmYWxsIGJhY2sgdG8gSVB2NC4KCiAgSG93ZXZlciwgc2luY2UgYy1hcmVzIGRvZXNuJ3Qgc3VwcG9ydCBQRl9VTlNQRUMsIHdoZW4gaXQncyB1c2VkIGl0IGRlZmF1bHRzCiAgdG8gdXNpbmcgZmFtaWx5PVBGX0lORVQ2IGFuZCB0aGVyZWZvcmUgb25seSByZXR1cm5zIElQdjYgYWRkcmVzc2VzIHdoZW4gQUFBQQogIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZXZlbiBpZiBJUHY0IGFkZHJlc3NlcyBhcmUgYWxzbyBhdmFpbGFibGUuIFRoZSBlZmZlY3QKICBpcyB0aGF0IHNpbmNlIG15IElTUCBkb2Vzbid0IGRvIElQdjYsIGxpYmN1cmwgY2FuJ3QgY29ubmVjdCBhdCBhbGwgdG8gYSBzaXRlCiAgdGhhdCBoYXMgQUFBQSByZWNvcmRzLiBJdCB3aWxsIHdvcmsgaWYgSSBleHBsaWNpdGx5IHVzZSBDVVJMX0lQUkVTT0xWRV9WNCBvcgogIC0taXB2NCB3aXRoIHRoZSBjdXJsIHRvb2wuIEkgZGlzY292ZXJlZCB0aGlzIHdoZW4gY3VybCB3b3VsZCBmYWlsIHRvIGNvbm5lY3QKICB0byBzZWVtaW5nbHkgcmFuZG9tIHNpdGVzLiBJdCB0dXJucyBvdXQgdGhleSB3ZXJlbid0IHJhbmRvbSwgdGhleSB3ZXJlIHNpdGVzCiAgd2l0aCBBQUFBIHJlY29yZHMuCgogIFNvIG5vdyBsaWJjdXJsIGRlZmF1bHRzIHRvIFBGX0lORVQuLi4gdW50aWwgYy1hcmVzIGhhcyBiZWVuIHRvdWdodCB0byBvZmZlcgogIGJvdGguCgpZYW5nIFRzZSAoMzEgT2N0IDIwMDgpCi0gVGVzdHMgNTU4IGFuZCA1NTkgYXJlIHN0YWJpbGl6ZWQuIFRoZXNlIHR3byB0ZXN0cyB3ZXJlIGluaXRpYWxseSBpbnRyb2R1Y2VkCiAgdG8gYWlkIGluIHRoZSBsb2NhdGlvbiBvZiBhIHNlZy1mYXVsdCB3aGljaCB3YXMgb25seSB0cmlnZ2VyZWQgb24gbm9uLWRlYnVnCiAgYnVpbGRzIGRvbmUgd2l0aCB0aGUgaWNjIDkuMSBJbnRlbCBjb21waWxlci4gVGVzdCA1NTggZG9lcyBub3QgdHJpZ2dlciB0aGUKICBwcm9ibGVtLCBidXQgdGVzdCA1NTkgZG9lcyB0cmlnZ2VyIGl0LiBBcyBvZiB0b2RheSwgaXQgaXNuJ3QgeWV0IGFic29sdXRlbHkKICBjbGVhciBpZiBpdCBpcyBhIGNvbXBpbGVyIG9wdGltaXplciBpc3N1ZSBvciBhIG1lbW9yeSBjb3JydXB0aW9uIG9uZS4KCllhbmcgVHNlICgzMCBPY3QgMjAwOCkKLSBVc2Ugb3VyIEN1cmxfYWRkcmluZm8gc3RydWN0dXJlIGRlZmluaXRpb24gdG8gaGFuZGxlIGFkZHJlc3MgaW5mbyBkYXRhIGV2ZW4KICB3aGVuIGEgc3lzdGVtIGFkZHJpbmZvIHN0cnVjdCBpcyBhdmFpbGFibGUuIFByb3ZpZGUgYW5kIHVzZSBhIHdyYXBwZXIgYXJvdW5kCiAgc3lzdGVtcyBnZXRhZGRyaW5mbyBmdW5jdGlvbiwgQ3VybF9nZXRhZGRyaW5mb19leCB3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0bwogIGEgbGlzdCBvZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzLgoKICBDb25maWd1cmUgd2lsbCBjaGVjayBmcmVlYWRkcmluZm8gYW5kIGdldGFkZHJpbmZvIGZ1bmN0aW9ucyBhbmQgZGVmaW5lCiAgcHJlcHJvY2Vzc29yIHN5bWJvbHMgSEFWRV9GUkVFQUREUklORk8gYW5kIEhBVkVfR0VUQUREUklORk8gd2hlbiBhcHByb3ByaWF0ZS4KCkRhbmllbCBGYW5kcmljaCAoMjkgT2N0IDIwMDgpCi0gRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgYSBmZXcgYnl0ZXMgb2YgZ2FyYmFnZSB0byBiZSBzZW50IGFmdGVyIGEKICBjdXJsX2Vhc3lfcGF1c2UoKSBkdXJpbmcgYSBjaHVua3kgdXBsb2FkLiBSZXBvcnRlZCBieSBTdGV2ZSBSb3Nrb3dza2kuCgpEYW5pZWwgRmFuZHJpY2ggKDI4IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlICJyZXNvbHZlIiB0ZXN0IHByZWNoZWNrIHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgYW4gSVB2NiBzb2NrZXQKICBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBJUHY2IG5hbWUuICBJbiB0aGUgY29udGV4dCBvZiBydW5uaW5nCiAgYSB0ZXN0LCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcnVuIGFuIElQdjYgdGVzdCB3aGVuIGEgaG9zdCBpcyByZXNvbHZhYmxlCiAgYnV0IElQdjYgaXNuJ3QgdXNhYmxlLiAgVGhpcyBzaG91bGQgZml4IGZhaWx1cmVzIG9mIHRlc3QgMTA4NSBvbiBob3N0cyB3aXRoCiAgbGlicmFyeSBhbmQgRE5TIHN1cHBvcnQgZm9yIElQdjYgYnV0IHdoZXJlIGFjdHVhbCB1c2Ugb2YgSVB2NiBoYXMgYmVlbgogIGFkbWluaXN0cmF0aXZlbHkgZGlzYWJsZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI0IE9jdCAyMDA4KQotIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB6bGliIGFuZCBPcGVuU1NMIG9uIFN5bWJpYW4gT1MuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIE9jdCAyMDA4KQotIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBTRlRQIHJhbmdlIHN1cHBvcnQgdG8gZml4IHRlc3QgY2FzZXMgNjM0IHRocm91Z2gKICA2MzcuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IE9jdCAyMDA4KQotIEZpeGVkIGEgY29tcGlsZSBlcnJvciByZXBvcnRlZCBieSBBbGJlcnQgQ2hpbiBvbiBBSVggYW5kIElSSVggd2hlbiB1c2luZwogIEdUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE9jdCAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgYWRkZWQgQ1VSTE9QVF9QUk9YWVVTRVIgYW5kIENVUkxPUFRfUFJPWFlQQVNTV09SRCB0aGF0IHRoZW4KICBtYWtlIENVUkxPUFRfUFJPWFlVU0VSUFdEIHNvcnQgb2YgZGVwcmVjYXRlZC4gVGhlIHByaW1hcnkgbW90aXZlIGZvciBhZGRpbmcKICB0aGVzZSBuZXcgb3B0aW9ucyBpcyB0aGF0IHRoZXkgaGF2ZSBubyBwcm9ibGVtcyB3aXRoIHRoZSBjb2xvbiBzZXBhcmF0b3IKICB0aGF0IHRoZSBDVVJMT1BUX1BST1hZVVNFUlBXRCBvcHRpb24gZG9lcy4KCkRhbmllbCBTdGVuYmVyZyAoMTUgT2N0IDIwMDgpCi0gUGFzY2FsIFRlcmphbiBmaWxlZCBidWcgIzIxNTQ2MjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjE1NDYyNykgd2hpY2ggcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsCiAgdXNlcyBzdHJjYXNlY21wKCkgaW4gbXVsdGlwbGUgcGxhY2VzIHdoZXJlIGl0IGNhdXNlcyBmYWlsdXJlcyB3aGVuIHRoZQogIFR1cmtpc2ggbG9jYWxlIGlzIHVzZWQuIFRoaXMgaXMgYmVjYXVzZSAnaScgYW5kICdJJyBpc24ndCB0aGUgc2FtZSBsZXR0ZXIgc28KICBzdHJjYXNlY21wKCkgb24gdGhvc2UgbGV0dGVycyBhcmUgZGlmZmVyZW50IGluIFR1cmtpc2ggdGhhbiBpbiBFbmdsaXNoIChvcgogIGp1c3QgYWJvdXQgYWxsIG90aGVyIGxhbmd1YWdlcykuIEkgdGh1cyBpbnRyb2R1Y2VkIGEgdG90YWxseSBuZXcgaW50ZXJuYWwKICBmdW5jdGlvbiBpbiBsaWJjdXJsIChjYWxsZWQgQ3VybF9yYXdfZXF1YWwpIGZvciBkb2luZyBjYXNlIGluc2VudGl2ZQogIGNvbXBhcmlzb25zIGZvciBlbmdsaXNoLShhc2NpaT8pIHN0eWxlIHN0cmluZ3MgdGhhdCB0aHVzIHdpbGwgbWFrZSAiZmlsZSIKICBhbmQgIkZJTEUiIG1hdGNoIGV2ZW4gaWYgdGhlIFR1cmtpc2ggbG9jYWxlIGlzIHNlbGVjdGVkLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBPY3QgMjAwOCkKLSBBIDxwcmVjaGVjaz4gY29tbWFuZCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkIGlmIGl0IHJldHVybnMgYSBub24temVybwogIHJldHVybiBjb2RlLiAgVGhpcyB3YXksIGlmIHRoZSBwcmVjaGVjayBjb21tYW5kIGNhbid0IGJlIHJ1biBhdCBhbGwgZm9yCiAgd2hhdGV2ZXIgcmVhc29uLCBpdCdzIHRyZWF0ZWQgYXMgYSBwcmVjaGVjayBmYWlsdXJlIHdoaWNoIGNhdXNlcyB0aGUKICB0ZXN0IHRvIGJlIHNraXBwZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IE9jdCAyMDA4KQotIEpvaG4gV2lsa2luc29uIGZpbGVkIGJ1ZyAjMjE1NTQ5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTU1NDk2KSBwb2ludGluZyBvdXQgYW4gZXJyb3IgY2FzZQogIHdpdGhvdXQgYSBwcm9wZXIgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gV2hlbiBhIHJlYWQgY2FsbGJhY2sgcmV0dXJucwogIGEgdG9vIGxhcmdlIHZhbHVlIChsaWtlIHdoZW4gdHJ5aW5nIHRvIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlcikgaXQgd291bGQKICB0cmlnZ2VyIGFuZCB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIHRoZW4gbWFrZXMgdGhlIHByb3BsZW0gc2xpZ2h0bHkKICBkaWZmZXJlbnQgdG8gdHJhY2sgZG93bi4gSSd2ZSBhZGRlZCBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGlzIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOSBPY3QgMjAwOCkKLSBGaXhlZCB0aGUgLS1pbnRlcmZhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aCBJUHY2IGNvbm5lY3Rpb25zIG9uIGdsaWJjCiAgc3lzdGVtcyBzdXBwb3J0aW5nIGdldGlmYWRkcnMoKS4gQWxzbyBmaXhlZCBhIHByb2JsZW0gd2hlcmUgYW4gSVB2NgogIGFkZHJlc3MgY291bGQgYmUgY2hvc2VuIGluc3RlYWQgb2YgYW4gSVB2NCBvbmUgZm9yIC0taW50ZXJmYWNlIHdoZW4gaXQKICBpbnZvbHZlZCBhIG5hbWUgbG9va3VwLgoKRGFuaWVsIEZhbmRyaWNoICg4IE9jdCAyMDA4KQotIEFkZGVkIHRlc3RzIDEwODIgdGhyb3VnaCAxMDg1IHRvIHRlc3Qgc3ltYm9saWMgLS1pbnRlcmZhY2UgcGFyYW1ldGVycwoKLSBBZGRlZCB0ZXN0cyA2MzMgdGhyb3VnaCA2MzcgdG8gdGVzdCB0aGUgbmV3IGZpbGUgcmFuZ2Ugc3VwcG9ydCBmb3IgU0ZUUC4KICBBbGwgYnV0IHRoZSBmaXJzdCB0ZXN0IGNhdXNlIGFuIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgZmFpbHVyZSBhbmQgc28KICBhcmUgYWRkZWQgdG8gRElTQUJMRUQuCgpEYW5pZWwgU3RlbmJlcmcgKDggT2N0IDIwMDgpCi0gSm9obiBXaWxraW5zb24gZmlsZWQgYnVnICMyMTUyMjcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTIyNzApIHdoaWNoIGlkZW50aWZpZWQgYW5kIGZpeGVkIGEKICBDVVJMSU5GT19SRURJUkVDVF9VUkwgbWVtb3J5IGxlYWsgYW5kIGFuIGFkZGl0aW9uYWwgd3JvbmctZG9pbmc6CgogIEFueSBzdWJzZXF1ZW50IHRyYW5zZmVyIHdpdGggYSByZWRpcmVjdCBsZWFrcyBtZW1vcnksIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICB0aGUgcHJvY2VzcyBwb3RlbnRpYWxseS4KCiAgQW55IHN1YnNlcXVlbnQgdHJhbnNmZXIgV0lUSE9VVCBhIHJlZGlyZWN0IGNhdXNlcyB0aGUgbW9zdCByZWNlbnQgcmVkaXJlY3QKICB0aGF0IERJRCBvY2N1ciBvbiBzb21lIHByZXZpb3VzIHRyYW5zZmVyIHRvIHN0aWxsIGJlIHJlcG9ydGVkLgoKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjExMTYxMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTExNjEzKSB0aGF0IGV2ZW50dWFsbHkgaWRlbnRpZmllZCBhCiAgZmxhdyBpbiBob3cgdGhlIG11bHRpX3NvY2tldCBpbnRlcmZhY2UgaW4gc29tZSBjYXNlcyBtaXNzZWQgdG8gY2FsbCB0aGUKICB0aW1lb3V0IGNhbGxiYWNrIHdoZW4gZWFzeSBpbnRlcmZhY2VzIGFyZSByZW1vdmVkIGFuZCBhZGRlZCB3aXRoaW4gdGhlIHNhbWUKICBtaWxsaXNlY29uZC4KCi0gSWdvciBOb3Zvc2VsdHNldiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0bwogIGN1cmxfZWFzeV9zZXRvcHQ6IENVUkxPUFRfVVNFUk5BTUUgYW5kIENVUkxPUFRfUEFTU1dPUkQgdGhhdCBzb3J0IG9mCiAgZGVwcmVjYXRlcyB0aGUgZ29vZCBvbGQgQ1VSTE9QVF9VU0VSUFdEIHNpbmNlIHRoZXkgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldAogIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluZGVwZW5kZW50bHkgYW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnRseSBhbGxvdwogIGJvdGggdG8gY29udGFpbiBjb2xvbihzKSB3aGljaCBDVVJMT1BUX1VTRVJQV0QgZG9lc24ndCBmdWxseSBzdXBwb3J0LgoKRGFuaWVsIEZhbmRyaWNoICg3IE9jdCAyMDA4KQotIENoYW5nZWQgdGhlIGhhbmRsaW5nIG9mIHJlYWQvd3JpdGUgZXJyb3JzIGluIEN1cmxfcGVyZm9ybSgpIHRvIGFsbG93IGEKICBhIGZyZXNoIGNvbm5lY3Rpb24gdG8gYmUgbWFkZSBpbiBzdWNoIGNhc2VzIGFuZCB0aGUgcmVxdWVzdCByZXRyYW5zbWl0dGVkLgogIFRoaXMgc2hvdWxkIGZpeCB0ZXN0IGNhc2UgMTYwLiAgQWRkZWQgdGVzdCBjYXNlIDEwNzkgaW4gYW4gYXR0ZW1wdCB0bwogIHRlc3QgYSBzaW1pbGFyIGNvbm5lY3Rpb24gZHJvcHBpbmcgc2NlbmFyaW8sIGJ1dCBhcyBhIHJhY2UgY29uZGl0aW9uLCBpdCdzCiAgaGFyZCB0byB0ZXN0IHJlbGlhYmx5LgoKLSBDcmVhdGVkIHRlc3QgY2FzZXMgMTA4MCBhbmQgMTA4MSB0byByZXByb2R1Y2UgYSBwcm9ibGVtIG9mCiAgQ1VSTElORk9fUkVESVJFQ1RfVVJMIGxlYWtpbmcgbWVtb3J5IGFuZCByZXR1cm5pbmcgaW5jb3JyZWN0IHJlc3VsdHMgd2hlbgogIHR3byBVUkxzIGFyZSByZXF1ZXN0ZWQuIFJlcG9ydGVkIGJ5IHZtcGRlbW8gaW4gYnVnICMyMTUyMjcwCgpEYW5pZWwgU3RlbmJlcmcgKDcgT2N0IDIwMDgpCi0gRml4ZWQgQ1VSTElORk9fUFJJTUFSWV9JUDogV2hlbiBsaWJjdXJsIGNyZWF0ZWQgYSBjb25uZWN0aW9uIHRvIGhvc3QgQSB0aGVuCiAgdGhlIGFwcCByZS11c2VkIHRoZSBoYW5kbGUgdG8gZG8gYSBjb25uZWN0aW9uIHRvIGhvc3QgQiBhbmQgdGhlbiBhZ2FpbgogIHJlLXVzZWQgdGhlIGhhbmRsZSB0byBob3N0IEEsIGl0IHdvdWxkIG5vdCB1cGRhdGUgdGhlIGluZm8gd2l0aCBob3N0IEEncyBJUAogIGFkZHJlc3MgKGR1ZSB0byB0aGUgY29ubmVjdGlvbiBiZWluZyByZS11c2VkKSBidXQgaXQgd291bGQgaW5zdGVhZCByZXBvcnQKICB0aGUgaW5mbyBmcm9tIGhvc3QgQi4KCllhbmcgVHNlICg3IE9jdCAyMDA4KQotIEFkZGVkIC0tZW5hYmxlLW9wdGltaXplIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGNvbXBpbGVyCiAgb3B0aW1pemF0aW9ucyB0byBhbGxvdyBkZWNvdXBsZWQgc2V0dGluZyBmcm9tIC0tZW5hYmxlLWRlYnVnLgoKWWFuZyBUc2UgKDIgT2N0IDIwMDgpCi0gQWRkZWQgLS1lbmFibGUtd2FybmluZ3MgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgc3RyaWN0CiAgY29tcGlsZXIgd2FybmluZ3MgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCiAgcnVudGVzdHMucGwgd2lsbCBub3cgcnVuIHdpdGggcGlja3kgY29tcGlsZXIgd2FybmluZ3MgZW5hYmxlZCB1bmxlc3MKICBleHBsaWNpdGx5IGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgxIE9jdCAyMDA4KQotICJtYWtlIGNsZWFuIiBub3cgY2xlYW5zIG91dCB0aGUgZG9jcyBhbmQgdGVzdHMgZGlyZWN0b3JpZXMsIHRvby4KCkRhbmllbCBTdGVuYmVyZyAoMzAgU2VwIDIwMDgpCi0gVGhlIGxpYmN1cmwgRlRQIGNvZGUgbm93IHJldHVybnMgQ1VSTEVfUkVNT1RFX0ZJTEVfTk9UX0ZPVU5EIGVycm9yIHdoZW4gU0laRQogIGdldHMgYSA1NTAgcmVzcG9uc2UgYmFjayBmb3IgdGhlIGNhc2VzIHdoZXJlIGEgZG93bmxvYWQgKG9yIE5PQk9EWSkgaXMKICB3YW50ZWQuIEl0IHN0aWxsIGFsbG93cyBhIDU1MCBhcyByZXNwb25zZSBpZiB0aGUgU0laRSBpcyB1c2VkIGFzIHBhcnQgb2YgYW4KICB1cGxvYWQgcHJvY2VzcyAobGlrZSBpZiByZXN1bWluZyBhbiB1cGxvYWQgaXMgcmVxdWVzdGVkIGFuZCB0aGUgZmlsZSBpc24ndAogIHRoZXJlIGJlZm9yZSB0aGUgdXBsb2FkKS4gSSBhbHNvIG1vZGlmaWVkIHRoZSBGVFAgdGVzdCBzZXJ2ZXIgYW5kIGEgZmV3IHRlc3QKICBjYXNlcyBhY2NvcmRpbmdseSB0byBtYXRjaCB0aGlzIG1vZGlmaWVkIGJlaGF2aW9yLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBTZXAgMjAwOCkKLSBEYW5pZWwgRWdnZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyB5b3UgdG8gZGlzYWJsZSBwcm94eSBzdXBwb3J0IGluCiAgbGliY3VybCB0byBzb21ld2hhdCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGJpbmFyeS4gUnVuIGNvbmZpZ3VyZQogIC0tZGlzYWJsZS1wcm94eS4KCkRhbmllbCBGYW5kcmljaCAoMjkgU2VwIDIwMDgpCi0gTW92ZWQgYWxsIHNpZ25hbC1iYXNlZCBuYW1lIHJlc29sdXRpb24gdGltZW91dCBoYW5kbGluZyBpbnRvIGEgc2luZ2xlIG5ldwogIEN1cmxfcmVzb2x2X3RpbWVvdXQgZnVuY3Rpb24gdG8gcmVkdWNlIGNvdXBsaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBTZXAgMjAwOCkKLSBJYW4gTHluYWdoIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgQ1VSTE9QVF9SQU5HRSB3b3JrIGZpbmUgZm9yIFNGVFAKICBkb3dubG9hZHMhCgotIE1heGltIEl2YW5vdiBmaWxlZCBidWcgcmVwb3J0ICMyMTA3ODAzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxMDc4MDMpICJubyBDVVJMSU5GT19SRURJUkVDVF9VUkwgaW4KICBtdWx0aSBtb2RlIiB0b2dldGhlciB3aXRoIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjUgU2VwIDIwMDgpCi0gRW1hbnVlbGUgQm92aXNpbyBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMjEyNjQzNS4gV2UgZml4ZWQgdGhlIEhUVFAgRGlnZXN0CiAgYXV0aCBjb2RlIHRvIG5vdCBiZWhhdmUgYmFkbHkgd2hlbiBnZXR0aW5nIGEgYmxhbmsgcmVhbG0gd2l0aAogIHJlYWxtPSIiLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTI2NDM1CgpEYW5pZWwgRmFuZHJpY2ggKDIzIFNlcCAyMDA4KQotIE1ha2Ugc3VyZSBub3QgdG8gZGVyZWZlcmVuY2UgdGhlIHdyb25nIFVybFN0YXRlIHByb3RvIHVuaW9uIG1lbWJlciB3aGVuCiAgc3dpdGNoaW5nIGZyb20gb25lIHByb3RvY29sIHRvIGFub3RoZXIgaW4gYSBzaW5nbGUgcmVxdWVzdCAoZS5nLgogIHJlZGlyZWN0aW5nIGZyb20gSFRUUCB0byBGVFAgYXMgaW4gdGVzdCAxMDU1KSBieSByZXNldHRpbmcKICBzdGF0ZS5leHBlY3QxMDBoZWFkZXIgYmVmb3JlIGV2ZXJ5IHJlcXVlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIFNlcCAyMDA4KQotIEludHJvZHVjaW5nIEphbWllIExva2llcidzIGZ1bmN0aW9uIGZvciBkYXRlIHRvIGVwb2NoIGNvbnZlcnNpb24gdXNlZCBpbiB0aGUKICBkYXRlIHBhcnNlciBmdW5jdGlvbi4gVGhpcyBtYWtlcyBvdXIgZnVuY3Rpb24gbGVzcyBkZXBlbmRlbnQgb24gc3lzdGVtLQogIHByb3ZpZGVkIGZ1bmN0aW9ucyBhbmQgaW5zdGVhZCB3ZSBkbyBhbGwgdGhlIG1hZ2ljIG91cnNlbHZlcy4gV2UgYWxzbyBubwogIGxvbmdlciBkZXBlbmQgb24gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLiBTd2l0Y2hpbmcgdG8gb3VyIG93biBjb252ZXJ0ZXIKICBoYXMgc29tZSBzaWRlLWVmZmVjdCBhbmQgdGhleSBhcmUgbm90ZWQgaGVyZSBmb3IgZnV0dXJlIHJlZmVyZW5jZSAodGFrZW4KICBmcm9tIGEgbWFpbCBieSBtciBMb2tpZXIpOgoKICB0aW1lX3QgaXMgbm90IG1lYXN1cmVkIGluIHNlY29uZHMgaW4gdGhlIEFOU0kgQyBzdGFuZGFyZCAtIG9yIGV2ZW4gY291bnRlZAogIHVuaWZvcm1seSAtIHdlaXJkIHBsYXRmb3JtcyBjYW4gdXNlIG90aGVyIG51bWVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGRhdGVzCiAgaW4gdGltZV90IC0gaGVuY2UgdGhlIGRpZmZ0aW1lKCkgZnVuY3Rpb24uCgogIE9uIFBPU0lYIHRpbWVfdCBpcyBtZWFzdXJlZCBpbiBVVEMgc2Vjb25kcywgd2hpY2ggbWVhbnMgbm90IGluY2x1ZGluZyBsZWFwCiAgc2Vjb25kcy4gIEJ1dCBpdCdzIG1lbnRpb25lZCBpbiBhIGZldyBwbGFjZXMgdGhhdCBzb21lIG9sZCBQT1NJWC1pc2gKICBlbnZpcm9ubWVudHMgaW5jbHVkZSBsZWFwIHNlY29uZHMgaW4gdGhlaXIgdGltZV90IGNvdW50cy4uLgoKICBJJ20gcHJldHR5IHN1cmUgW3RoZSBuZXcgaW1wbGVtZW50YXRpb24gaXNdIGNvcnJlY3Qgb24gYW55dGhpbmcgdHJ1bHkgUE9TSVguCiAgQW5kIGl0J3Mgb2J2aW91c2x5IGEgbG90IGxlc3MgZGVwZW5kZW50IG9uIHBsYXRmb3JtIHF1aXJrcyBhbmQgY29ybmVyIGNhc2VzCiAgaW4gbWFueSB3YXlzIHRoYW4gdGhlIG1rdGltZSgpIHZlcnNpb24uCgotIFJvYiBDcml0dGVuZGVuIGJyb3VnaHQgYSBwYXRjaCB0byAiYWRkIHNvbWUgbG9ja2luZyBmb3IgdGhyZWFkLXNhZmV0eSB0byBOU1MKICBpbXBsZW1lbnRhdGlvbiIuCgpEYW5pZWwgU3RlbmJlcmcgKDIyIFNlcCAyMDA4KQotIE1hZGUgdGhlIFNPQ0tTIGNvZGUgdXNlIHRoZSBuZXcgQ3VybF9yZWFkX3BsYWluKCkgZnVuY3Rpb24gdG8gZml4IHRoZSBidWcKICBNYXJrdXMgTW9lbGxlciByZXBvcnRlZDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwOC0wOS8wMDE2Lmh0bWwKCi0gcmVjdigpIGVycm9ycyBvdGhlciB0aGFuIHRob3NlIGVxdWFsIHRvIEVBR0FJTiBub3cgY2F1c2UgcHJvcGVyCiAgQ1VSTEVfUkVDVl9FUlJPUiB0byBnZXQgcmV0dXJuZWQuIFRoaXMgbWFkZSB0ZXN0IGNhc2UgMTYwIGZhaWwgc28gSSd2ZSBub3cKICBkaXNhYmxlZCBpdCB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBhbm90aGVyIHdheSB0byBleGVyY2lzZSB0aGF0IGxvZ2ljLgoKLSBNaWNoYWVsIEdvZmZpb3VsIGZpbGVkIGJ1ZyByZXBvcnQgIzIxMDczNzcgIlByb2JsZW0gd2l0aCBtdWx0aSArIEdudVRMUyArCiAgcHJveHkiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTA3Mzc3KSB0aGF0IHNob3dlZCBob3cgYSBtdWx0aQogIGludGVyZmFjZSB1c2luZyBwcm9ncmFtIGRpZG4ndCB3b3JrIHdoZW4gYnVpbHQgd2l0aCBHbnVUTFMgYW5kIGEgQ09OTkVDVAogIHJlcXVlc3Qgd2FzIGRvbmUgb3ZlciBhIHByb3h5IChiYXNpY2FsbHkgdGVzdCA1MDIgb3ZlciBhIHByb3h5IHRvIGEgSFRUUFMKICBzaXRlKS4gSXQgdHVybmVkIG91dCB0aGUgc3NsIGNvbm5lY3QgZnVuY3Rpb24gd291bGQgZ2V0IGNhbGxlZCB0d2ljZSB3aGljaAogIGNhdXNlZCB0aGUgc2Vjb25kIGNhbGwgdG8gZmFpbC4KCkRhbmllbCBGYW5kcmljaCAoMjIgU2VwIDIwMDgpCi0gRml4ZWQgdGVzdCA1MzkgdG8gaGFuZGxlIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uIHRoYXQgc2hvd3MgdXAgbm93CiAgdGhhdCBtZW1kZWJ1Zy5oIGlzIGluY2x1ZGVkIGluIHRoZSB0ZXN0IHByb2dyYW1zLgoKWWFuZyBUc2UgKDIwIFNlcCAyMDA4KQotIEZpeCByZWdyZXNzaW9uIGluIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggYWZmZWN0ZWQgT3BlblNTTCBidWlsZHMgb24gTVNZUy4KCllhbmcgVHNlICgxOSBTZXAgMjAwOCkKLSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgYXZhaWxhYmlsaXR5IG9mIHRoZSBhbGFybSgpIGZ1bmN0aW9uLgoKRGFuaWVsIEZhbmRyaWNoICgxOCBTZXAgMjAwOCkKLSBEb24ndCBib3RoZXIgdG8gaW5zdGFsbCBhIFNJR0FMUk0gaGFuZGxlciB1bmxlc3MgYWxhcm0oKSBpcyBhdmFpbGFibGUuCiAgQWxzbywgbGVhdmUgdGhlIGV4aXN0aW5nIFNJR0FMUk0gaGFuZGxlciBhbG9uZSBpZiB0aGUgdGltZW91dCBpcyB0b28gc21hbGwKICB0byBoYW5kbGUuCgpEYW5pZWwgRmFuZHJpY2ggKDE3IFNlcCAyMDA4KQotIFJlbW92ZWQgcmVmZXJlbmNlIHRvIGN1cmwtY2EtYnVuZGxlLmNydCBpbiB0aGUgaG9zdCB2ZXJpZmljYXRpb24gZmFpbHVyZQogIGVycm9yIG1lc3NhZ2UuCgpZYW5nIFRzZSAoMTcgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIGdldGhvc3RuYW1lKCksIGxvY2FsdGltZV9yKCksIHN0cnN0cigpLAogIGdldHNlcnZieXBvcnRfcigpLCBnZXRob3N0YnlhZGRyX3IoKSBhbmQgZ2V0aG9zdGJ5bmFtZV9yKCkuCgpZYW5nIFRzZSAoMTQgU2VwIDIwMDgpCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIHN0cmNhc2VjbXAoKSwgc3RyY2FzZXN0cigpLCBzdHJjbXBpKCksCiAgc3RyaWNtcCgpLCBzdHJsY2F0KCksIHN0cm5jYXNlY21wKCksIHN0cm5jbXBpKCkgYW5kIHN0cm5pY21wKCkuCgpZYW5nIFRzZSAoMTMgU2VwIDIwMDgpCi0gRGlzYWJsZSB0cmFja2luZyBvZiBmZG9wZW4oKSBjYWxscyBpbiB0aGUgbG93LWxldmVsIG1lbW9yeSBsZWFrIHRyYWNraW5nCiAgY29kZSB3aGVuIGZkb3BlbigpIGlzIG5vdCBhdmFpbGFibGUsIHRvIGF2b2lkIGNvbXBpbGVyIGVycm9yLgoKWWFuZyBUc2UgKDEyIFNlcCAyMDA4KQotIEZ1cnRoZXIgYWRqdXN0IGRldGVjdGlvbiBvZiBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzLCBhbmQKICBlbnN1cmUgdGhhdCBlcnJubyBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIEN1cmxfc3RyZXJyb3IoKS4KCllhbmcgVHNlICgxMCBTZXAgMjAwOCkKLSBJbXByb3ZlIGRldGVjdGlvbiBvZiBnbXRpbWVfcigpLCBzdHJ0b2xsKCksIHNpZ2FjdGlvbigpLCBzdHJ0b2tfcigpLAogIHN0cmR1cCgpIGFuZCBmdHJ1bmNhdGUoKSBpbiB0aGUgY29uZmlndXJlIHByb2Nlc3MuCgpEYW5pZWwgRmFuZHJpY2ggKDkgU2VwIDIwMDgpCi0gTWlrZSBSZXZpIGRpc2NvdmVyZWQgc29tZSBzd2FwcGVkIHNwZWVkIHN3aXRjaGVzIGRvY3VtZW50ZWQgaW4gdGhlIGN1cmwgbWFuCiAgcGFnZS4KCi0gQ2hlY2tlZCBpbiBzb21lIGRvY3VtZW50YXRpb24gYW5kIGNvZGUgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcyB0aGF0IEkKICBkaXNjb3ZlcmVkIGluIHRoZSBGcmVlQlNEIHBvcnRzIHN5c3RlbS4KCkRhbmllbCBTdGVuYmVyZyAoOCBTZXAgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHBhdGNoZWQgYSBwcm9ibGVtOiBJIGhhdmUgZm91bmQgYnVnIGluIHBpcGVsaW5pbmcgdGhyb3VnaAogIHByb3h5LiBJIGhhdmUgYSB0cmFuc3BhcmVudCBwcm94eS4gV2hlbiBydW5uaW5nIHdpdGggaHR0cF9wcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIG5vdCBzZXQgbXkgdGVzdCBjb21wbGV0ZXMgZmluZSAoaXQgZ29lcyB0aHJvdWdoIHRyYW5zcGFyZW50CiAgcHJveHkpLiBXaGVuIEkgc2V0IGh0dHBfcHJveHkgdmFyaWFibGUgbXkgdGVzdCBoYW5ncyBhZnRlciB0aGUgZmlyc3QKICBkb3dubG9hZGVkIGlzIGNvbXBsZXRlLiBMb29rcyBsaWtlIHRoZSBzZWNvbmQgaGFuZGxlIG5ldmVyIGdldHMgb3V0IGZyb20KICBXQUlURE8gc3RhdGUuCgogIFRoZSBmaXg6IEl0IG1ha2VzIGNoZWNrUGVuZFBpcGVsaW5lIG1vdmUgMSBoYW5kbGVyIGZyb20gcGVuZCBwaXBlIHRvIHNlbmQKICBwaXBlIGlmIHBpcGVsaW5pbmcgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIgYnV0IHRoZXJlIGFyZSBubyBoYW5kbGVzIGluCiAgc2VuZCBhbmQgcmVjdiBwaXBlcy4KCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd291bGQgd3JvbmdseSBzZW5kIGF3YXkgY29va2llcyB0bwogIHNpdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBjb29raWUgY2xlYXJseSBoYXMgYSB2ZXJ5IG9sZCBleHBpcnkgZGF0ZS4gVGhlCiAgY29uZGl0aW9uIHdhcyBzaW1wbHkgdGhhdCBsaWJjdXJsJ3MgZGF0ZSBwYXJzZXIgd291bGQgZmFpbCB0byBjb252ZXJ0IHRoZQogIGRhdGUgYW5kIGl0IHdvdWxkIHRoZW4gY291bnQgYXMgYSAodGltZWQtYmFzZWQpIG1hdGNoLiBTdGFydGluZyBub3csIGEKICBtaXNzZWQgZGF0ZSBkdWUgdG8gYW4gdW5zdXBwb3J0ZWQgZGF0ZSBmb3JtYXQgb3IgZGF0ZSByYW5nZSB3aWxsIG5vdyBjYXVzZQogIHRoZSBjb29raWUgdG8gbm90IG1hdGNoLgoKRGFuaWVsIEZhbmRyaWNoICg1IFNlcCAyMDA4KQotIEltcHJvdmVkIHRoZSBsb2dpYyB0aGF0IGRlY2lkZXMgd2hldGhlciB0byB1c2UgSFRUUCAxLjEgZmVhdHVyZXMgb3Igbm90IGluIGEKICByZXF1ZXN0LiAgU2V0dGluZyBhIHNwZWNpZmljIHZlcnNpb24gd2l0aCBDVVJMT1BUX0hUVFBfVkVSU0lPTiBvdmVycmlkZXMKICBhbGwgb3RoZXIgY2hlY2tzLCBidXQgb3RoZXJ3aXNlLCBhIDEuMCByZXF1ZXN0IHdpbGwgYmUgbWFkZSBpZiB0aGUgc2VydmVyCiAgaXMga25vd24gdG8gc3VwcG9ydCBvbmx5IDEuMCBiZWNhdXNlIGl0IHByZXZpb3VzbHkgcmVzcG9uZGVkIHNvIGFuZCB0aGUKICBjb25uZWN0aW9uIHdhcyBrZXB0IGFsaXZlLCBvciBhIHJlc3BvbnNlIHRvIGEgcHJldmlvdXMgcmVxdWVzdCBvbiB0aGlzIGhhbmRsZQogIGNhbWUgYmFjayBhcyAxLjAuIFRoZSBsYXR0ZXIgY291bGQgdGFrZSBwbGFjZSBpbiBjYXNlcyBsaWtlIHJlZGlyZWN0aW9uIG9yCiAgYXV0aGVudGljYXRpb24gd2hlcmUgc2V2ZXJhbCByZXF1ZXN0cyBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBvcGVyYXRpb24KICBpcyBjb21wbGV0ZS4gIElmIGFueSBvbmUgb2YgdGhlIHNlcnZlcnMgaW4gYSByZWRpcmVjdGlvbiBjaGFpbiBzdXBwb3J0cyBvbmx5CiAgMS4wLCB0aGVuIHJlbWFpbmluZyByZXF1ZXN0cyB3aWxsIGJlIHNlbnQgaW4gMS4wIG1vZGUuCgotIERldGVjdCBjYXNlcyB3aGVyZSBhbiB1cGxvYWQgbXVzdCBiZSBzZW50IGNodW5rZWQgYW5kIHRoZSBzZXJ2ZXIgc3VwcG9ydHMKICBvbmx5IEhUVFAgMS4wIGFuZCByZXR1cm4gQ1VSTEVfVVBMT0FEX0ZBSUxFRC4KCkRhbmllbCBTdGVuYmVyZyAoNSBTZXAgMjAwOCkKLSBNYXJ0aW4gRHJhc2FyIHByb3ZpZGVkIHRoZSBDVVJMT1BUX1BPU1RSRURJUiBwYXRjaC4gSXQgcmVuYW1lcwogIENVUkxPUFRfUE9TVDMwMSAoYnV0IGFkZHMgYSBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB5b3Ugd2hvCiAgZG9uJ3QgZGVmaW5lIENVUkxfTk9fT0xESUVTKS4gVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBub3cgYWxzbyBjaGFuZ2UgdGhlCiAgbGliY3VybCBiZWhhdmlvciBmb3IgYSBIVFRQIHJlc3BvbnNlIDMwMiBhZnRlciBhIFBPU1QgdG8gbm90IHVzZSBHRVQgaW4gdGhlCiAgc3Vic2VxdWVudCByZXF1ZXN0ICh3aGVuIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCkuIEkgZWRpdGVkIHRoZQogIHBhdGNoIHNvbWV3aGF0IGJlZm9yZSBjb21taXQuIFRoZSBjdXJsIHRvb2wgZ290IGEgbWF0Y2hpbmcgLS1wb3N0MzAyCiAgb3B0aW9uLiBUZXN0IGNhc2UgMTA3NiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgotIEludHJvZHVjaW5nIENVUkxPUFRfQ0VSVElORk8gYW5kIHRoZSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0NFUlRJTkZPLiBCeQogIGVuYWJsaW5nIHRoaXMgZmVhdHVyZSB3aXRoIENVUkxPUFRfQ0VSVElORk8gZm9yIGEgcmVxdWVzdCB1c2luZyBTU0wgKEhUVFBTCiAgb3IgRlRQUyksIGxpYmN1cmwgd2lsbCBnYXRoZXIgbG90cyBvZiBzZXJ2ZXIgY2VydGlmaWNhdGUgaW5mbyBhbmQgdGhhdCBpbmZvCiAgY2FuIHRoZW4gZ2V0IGV4dHJhY3RlZCBieSBhIGNsaWVudCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkIHdpdGgKICBjdXJsX2Vhc3lfZ2V0aW5mbygpJ3MgQ1VSTElORk9fQ0VSVElORk8gb3B0aW9uLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nCiAgaGVscGVkIG1lIHRlc3QgYW5kIHNtb290aGVuIG91dCB0aGlzIGZlYXR1cmUuCgogIFVuZm9ydHVuYXRlbHksIHRoaXMgZmVhdHVyZSBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIGxpYmN1cmwgYnVpbHQgdG8gdXNlCiAgT3BlblNTTC4KCiAgVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgbmV0d29ya2luZzRhbGwuY29tIC0gdGhhbmtzIQoKLSBEbWl0cml5IFNlcmdleWV2IHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3BhdXNlKCkgZGlkbid0IHVucGF1c2UgcHJvcGVybHkKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zLiBJIGFsc28gY2hhbmdlZCB0aGlzIGNvZGUgdG8gdXNlIHJlYWxsb2MoKSBiYXNlZAogIG9uIERhbmllbCBGYW5kcmljaCdzIHN1Z2dlc3Rpb24uCgpHdWVudGVyIEtuYXVmICg0IFNlcCAyMDA4KQotIE1pbmdXMzIgbm9uLWNvbmZpZ3VyZSBidWlsZHMgYXJlIG5vdyBsYXJnZWZpbGUgZmVhdHVyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgTmV0V2FyZSBMSUJDIGJ1aWxkcyBhcmUgYWxzbyBub3cgbGFyZ2VmaWxlIGZlYXR1cmUgZW5hYmxlZCBieSBkZWZhdWx0LgoKWWFuZyBUc2UgKDQgU2VwIDIwMDgpCi0gU2V2ZXJhbCBmaXhlcyByZWxhdGVkIHdpdGggcHJpbnQgZm9ybWF0dGluZyBzdHJpbmcgZGlyZWN0aXZlcy4KCkRhbmllbCBGYW5kcmljaCAoMyBTZXAgMjAwOCkKLSBTZWFyY2ggZm9yIHRoZSBGcmVlQlNEIENBIGNlcnQgZmlsZSAvdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QuY3J0CgpEYW5pZWwgRmFuZHJpY2ggKDIgU2VwIDIwMDgpCi0gRml4ZWQgYW4gb3V0IG9mIG1lbW9yeSBwcm9ibGVtIHRoYXQgY2F1c2VkIHRvcnR1cmUgdGVzdCBmYWlsdXJlcyBpbiB0ZXN0cwogIDcwNiBhbmQgNzA3LgoKRGFuaWVsIFN0ZW5iZXJnICgyIFNlcCAyMDA4KQotIEtlaXRoIE1vayBhZGRlZCBzdXBwb3J0ZWRfcHJvdG9jb2xzIGFuZCBzdXBwb3J0ZWRfZmVhdHVyZXMgdG8gdGhlIHBrZy1jb25maWcKICBmaWxlIGZvciBsaWJjdXJsLCBhbmQgd2hpbGUgZG9pbmcgdGhhdCBmaXggaGUgdW5pZmllZCB3aXRoIGN1cmwtY29uZmlnLmluCiAgaG93IHRoZSBzdXBwb3J0ZWQgcHJvdG9jb2xzIGFuZCBmZWF0dXJlcyBhcmUgZXh0cmFjdGVkIGFuZCB1c2VkLCBzbyBib3RoIHRob3NlCiAgdG9vbHMgc2hvdWxkIG5vdyBhbHdheXMgYmUgc3luY2VkLgoKVmVyc2lvbiA3LjE5LjAgKDEgU2VwdGVtYmVyIDIwMDgpCgpEYW5pZWwgRmFuZHJpY2ggKDI5IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3RzIDEwNzEgdGhyb3VnaCAxMDc0IHRvIHRlc3QgYXV0b21hdGljIGRvd25ncmFkaW5nIGZyb20gSFRUUCAxLjEKICB0byBIVFRQIDEuMCB1cG9uIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIEhUVFAgc2VydmVyLiAgVGVzdHMgMTA3MgogIGFuZCAxMDczIGFyZSBzaW1pbGFyIHRvIHRlc3QgMTA2OSBpbiB0aGF0IHRoZXkgaW52b2x2ZSB0aGUgaW1wb3NzaWJsZQogIHNjZW5hcmlvIG9mIHNlbmRpbmcgY2h1bmtlZCBkYXRhIHRvIGEgSFRUUCAxLjAgc2VydmVyLiAgQWxsIHRoZXNlIGZhaWwKICBhbmQgYXJlIGFkZGVkIHRvIERJU0FCTEVELgoKLSBBZGRlZCB0ZXN0IDEwNzUgdG8gdGVzdCAtLWFueWF1dGggd2l0aCBCYXNpYyBhdXRoZW50aWNhdGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXVnIDIwMDgpCi0gV2hlbiBsaWJjdXJsIHdhcyBkb2luZyBhIEhUVFAgUE9TVCBhbmQgdGhlIHNlcnZlciB3b3VsZCByZXNwb25kIHdpdGgKICAiQ29ubmVjdGlvbjogY2xvc2UiIGFuZCBhY3R1YWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGUKICByZXNwb25zZS1ib2R5LCBsaWJjdXJsIGNvdWxkIHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgZGF0YSB0byBzZW5kIGFuZCBpdAogIHdvdWxkIG5vdCBwcm9wZXJseSBub3RpY2UgdGhpcyBhbmQgc3RvcCBzZW5kaW5nLiBUaGlzIGNhdXNlZCB3ZWlyZG5lc3MgYW5kCiAgc2FkIGZhY2VzLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDgwMjIyCgogIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcmVhc29ucyB0byBjb25zaWRlciBsaWJjdXJsJ3MgYmVoYXZpb3Igd2hlbgogIGdldHRpbmcgYSA+PSA0MDAgcmVzcG9uc2UgY29kZSB3aGlsZSBzZW5kaW5nIGRhdGEsIGFzIENyYWlnIFBlcnJhcycgbm90ZQogICJodHRwIHVwbG9hZDogaG93IHRvIHN0b3Agb24gZXJyb3IiIHNwZWNpZmllczoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA4LTA4LzAxMzguaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBdWcgMjAwOCkKLSBEZW5nbWlud2VuIHJlcG9ydGVkIHRoYXQgbGliY3VybCB3b3VsZCBsb2NrIGEgKGNvb2tpZSkgc2hhcmUgdHdpY2UgKHdpdGhvdXQKICBhbiB1bmxvY2sgaW4gYmV0d2VlbikgZm9yIGEgY2VydGFpbiBjYXNlIGFuZCB0aGF0IGluIGZhY3Qgd29ya3Mgd2hlbiB1c2luZwogIHJlZ3VsYXIgd2luZG93cyBtdXRleGVzIGJ1dCBub3Qgd2l0aCBwdGhyZWFkcychIExvY2tzIHNob3VsZCBvZiBjb3Vyc2Ugbm90CiAgZ2V0IGxvY2tlZCBhZ2FpbiBzbyB0aGlzIGlzIG5vdyBmaXhlZC4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDgvMDQyMi5odG1sCgotIEknbSBhYmFuZG9uaW5nIHRoZSBzeXN0ZW0gd2l0aCB0aGUgd2ViIHNpdGUgbWlycm9ycyAoYnV0IGtlZXBpbmcgZG93bmxvYWQKICBmaWxlcyBiaW5nIG1pcnJvcmVkKSBhbmQgdGh1cyBJJ3ZlIGNoYW5nZWQgdGhlIFVSTCBpbiB0aGUgY29va2llamFyIGhlYWRlcgogIHRvIG5vIGxvbmdlciB1c2UgY3VybG0uaGF4eC5zZSBidXQgaW5zdGVhZCB1c2UgdGhlIG1haW4gc2l0ZSBjdXJsLmhheHguc2UKCkRhbmllbCBGYW5kcmljaCAoMjcgQXVnIDIwMDgpCi0gRml4ZWQgdGVzdCBjYXNlIDEwNjUgYnkgY2hhbmdpbmcgdGhlIGhhbmRsaW5nIG9mIENVUkxPUFRfVVBMT0FEIHRvIHNldAogIHRoZSBIVFRQIG1ldGhvZCB0byBHRVQgKG9yIEhFQUQpIHdoZW4gZ2l2ZW4gYSB2YWx1ZSBvZiAwLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNjggYW5kIDEwNjkgdG8gdGVzdCBhIHNpbXBsZSBIVFRQIFBVVCBmcm9tIHN0ZGluLiAgVGVzdAogIGNhc2UgMTA2OSBmYWlscyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRlc3QgMTA2NSBzbyBpcyBhZGRlZCB0byBESVNBQkxFRC4KCllhbmcgVHNlICgyNyBBdWcgMjAwOCkKLSBGaXggZ2VuZXJhdGlvbiBvZiBNUyBWQzYgLmRzcCBmaWxlIHRvIG1ha2UgaXQgc3VwcG9ydCBjb21waWxhdGlvbiBvZiBlaXRoZXIKICBkeW5hbWljIChETEwpIG9yIHN0YXRpYyAoTElCKSBsaWJjdXJsIGxpYnJhcmllcyBpbiBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2Rlcy4KCkRhbmllbCBGYW5kcmljaCAoMjYgQXVnIDIwMDgpCi0gRml4ZWQgb3V0IG9mIG1lbW9yeSBwcm9ibGVtcyB0aGF0IGNhdXNlZCB0b3J0dXJlIHRlc3QgZmFpbHVyZXMgaW4gdGVzdHMKICAxMDIxIGFuZCAxMDY3LgoKWWFuZyBUc2UgKDI2IEF1ZyAyMDA4KQotIEFkZGVkIGNoZWNrIGFuZCBzeW1ib2wgZGVmaW5pdGlvbiBmb3IgV0lOMzIgZmlsZSBBUEkgdXNhZ2UgaW4gY29uZmlndXJlLAogIHN1cHBvcnRpbmcgY29uZmlndXJlJ3MgLS1kaXNhYmxlLWxhcmdlZmlsZSBvcHRpb24gZm9yIFdJTjMyIHRhcmdldHMgYWxzby4KCi0gTm9uLWNvbmZpZ3VyZSBzeXN0ZW1zIHdoaWNoIGRvIG5vdCB1c2UgY29uZmlnLXdpbjMyLmggY29uZmlndXJhdGlvbiBmaWxlLAogIGFuZCB3YW50IHRvIHVzZSB0aGUgV0lOMzIgZmlsZSBBUEksIG11c3QgZGVmaW5lIFVTRV9XSU4zMl9MQVJHRV9GSUxFUyBvcgogIFVTRV9XSU4zMl9TTUFMTF9GSUxFUyBhcyBhcHByb3ByaWF0ZSBpbiB0aGVpciBvd24gY29uZmlndXJhdGlvbiBmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMjMgQXVnIDIwMDgpCi0gUnVubmluZyAnbWFrZSBjYS1maXJlZm94JyBpbiB0aGUgcm9vdCBidWlsZCBkaXIgd2lsbCBub3cgcnVuIHRoZSBuZXcKICBmaXJlZm94LWRiMnBlbS5zaCBjb252ZXJzaW9uIHNjcmlwdCB0aGF0IGNvbnZlcnRzIGEgbG9jYWwgRmlyZWZveCBkYiBvZiBjYQogIGNlcnRzIGludG8gUEVNIGZvcm1hdCwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGEgT3BlblNTTCBvciBHbnVUTFMgYnVpbHQKICBsaWJjdXJsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGJ1ZyB3aGVuIGRvaW5nIHByb3h5IENPTk5FQ1Qgd2l0aCB0aGUgbXVsdGkKICBpbnRlcmZhY2UsIGFuZCB0aGUgcHJveHkgd291bGQgc2VuZCBDb25uZWN0aW9uOiBjbG9zZSBkdXJpbmcgdGhlCiAgYXV0aGVudGljYXRpb24gcGhhc2UuICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDY5MDQ3CgpEYW5pZWwgRmFuZHJpY2ggKDIyIEF1ZyAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIC0tZHVtcC1oZWFkZXIgLSB3YXMgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gb25lIFVSTCwKICB3aGljaCBjYXVzZWQgYW4gZXJyb3Igd2hlbiB0aGUgc2Vjb25kIGhlYWRlciB3YXMgZHVtcGVkIGR1ZSB0byBzdGRvdXQKICBiZWluZyBjbG9zZWQuICBBZGRlZCB0ZXN0IGNhc2UgMTA2NiB0byB2ZXJpZnkuICBBbHNvIGZpeGVkIGEgcG90ZW50aWFsCiAgcHJvYmxlbSB3aGVyZSBhIGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IgbWlnaHQgYmUgdXNlZCBmb3IgYW4gdXBsb2FkCiAgd2hlbiBtb3JlIHRoYW4gb25lIFVSTCBpcyBnaXZlbi4KCllhbmcgVHNlICgyMiBBdWcgMjAwOCkKLSBJbXByb3ZlZCBsaWJjdXJsJ3MgaW50ZXJuYWwgY3VybF9tKnByaW50ZigpIGZ1bmN0aW9ucyBpbnRlZ3JhbCBkYXRhIHR5cGUKICBzaXplIGFuZCBzaWduZWRuZXNzIGhhbmRsaW5nLgoKLSBJbnRlcm5hbCBhZGp1c3RtZW50cyB0byBiZXR0ZXIgc2VsZWN0L2RpZmZlcmVudGlhdGUgd2hlbiBsYXJnZS9zbWFsbCBmaWxlCiAgc3VwcG9ydCBpcyBwcm92aWRlZCB1c2luZyBXSU4zMiBmdW5jdGlvbnMgZGlyZWN0bHkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEF1ZyAyMDA4KQotIEFkZGVkIGFuIGVkaXRlZCB2ZXJzaW9uIG9mIFZpbmNlbnQgTGUgTm9ybWFuZCdzIGRvY3VtZW50YXRpb24gb2YgU0ZUUCBxdW90ZQogIGNvbW1hbmRzIHRvIHRoZSBtYW4gcGFnZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEF1ZyAyMDA4KQotIFBoaWwgUGVsbG91Y2hvdWQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2luZG93cyB2ZXJzaW9uIG9mIGxpYmN1cmwgaGFkIGEKICBtZW1vcnkgbGVhayBiZWNhdXNlIGl0IG5ldmVyIGNhbGxlZCB0aGUgT3BlblNTTCBmdW5jdGlvbgogIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkgYXMgaXQgd2FzIHN1cHBvc2VkIHRvLiBUaGlzIHdhcyBiZWNhdXNlIG9mIGEKICBtaXNzaW5nIGRlZmluZSBpbiBjb25maWctd2luMzIuaCEKCkdpc2xlIFZhbmVtICgxOCBBdWcgMjAwOCkKLSBVcGRhdGVkIGxpYi9NYWtlZmlsZS5XYXRjb20gd2l0aCB0aGUgb3B0aW9uIHRvIHVzZSBjLWFyZXMgKFVTRV9BUkVTPTEpLgoKWWFuZyBUc2UgKDE4IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSA1NTcgdG8gdmVyaWZ5IGxpYmN1cmwncyBpbnRlcm5hbCBjdXJsX20qcHJpbnRmKCkgZnVuY3Rpb25zCiAgZm9ybWF0dGluZyBmdW5jdGlvbmFsaXR5IHdoZW4gaGFuZGxpbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCBsb25ncywgYXMgd2VsbCBhcwogIG91ciBjdXJsX29mZl90IGRhdGEgdHlwZS4KCllhbmcgVHNlICgxNyBBdWcgMjAwOCkKLSBPcGVuU1NsIGVuYWJsZWQgTmV0V2FyZSBidWlsZHMgYXJlIGNoYW5nZWQgdG8gdXNlIHRoZSAnb3BlbnNzbCcgc3ViZGlyZWN0b3J5CiAgd2hlbiBpbmNsdWRpbmcgdGhlIE9wZW5TU0wgaGVhZGVyIGZpbGVzLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLCB0aGlzCiAgcHJldmVudHMgdGhlIHVuZGVzaXJlZCBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aG9zZQogIG9mIE9wZW5TU0wgYnV0IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gdGhlIE9wZW5TU0wgcGFja2FnZS4gVGhlIHZpc2libGUgY2hhbmdlCiAgZnJvbSBwcmV2aW91c2x5IHJlbGVhc2VkIGxpYmN1cmwgdmVyc2lvbnMgaXMgdGhhdCBub3cgT3BlblNTbCBlbmFibGVkIE5ldFdhcmUKICBidWlsZHMgYWxzbyBkZWZpbmUgVVNFX09QRU5TU0wgaW4gY29uZmlnIGZpbGVzLCBhbmQgdGhhdCBPcGVuU1NMIGhlYWRlciBmaWxlcwogIG11c3QgYmUgbG9jYXRlZCBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCAnb3BlbnNzbCcuCgpZYW5nIFRzZSAoMTYgQXVnIDIwMDgpCi0gTGlicmFyeSBpbnRlcm5hbCBvbmx5IEMgcHJlcHJvY2Vzc29yIG1hY3JvcyBGT1JNQVRfT0ZGX1QgYW5kIEZPUk1BVF9PRkZfVFUKICByZW1haW4gaW4gdXNlIGFzIGludGVybmFsIGN1cmxfb2ZmX3QgcHJpbnQgZm9ybWF0dGluZyBzdHJpbmdzIGZvciB0aGUgaW50ZXJuYWwKICAqcHJpbnRmIGZ1bmN0aW9ucyB3aGljaCBzdGlsbCBjYW5ub3QgaGFuZGxlIHByaW50IGZvcm1hdHRpbmcgc3RyaW5nIGRpcmVjdGl2ZXMKICBzdWNoIGFzICJJNjRkIiwgIkk2NHUiLCBhbmQgb3RoZXJzIGF2YWlsYWJsZSBvbiBNU1ZDLCBNaW5HVywgSW50ZWwncyBJQ0MsIGFuZAogIG90aGVyIERPUy9XaW5kb3dzIGNvbXBpbGVycy4KCkRhbmllbCBGYW5kcmljaCAoMTUgQXVnIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDEwNjMgdG8gdGVzdCBpbnZhbGlkIGxvbmcgZmlsZSByYW5nZXMgd2l0aCBmaWxlOiBVUkxzIGFuZAogIDEwNjQgdG8gdGVzdCBtdWx0aXBsZSBodHRwIFBVVHMuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDY1IHRvIHRlc3QgYSBQVVQgd2l0aCBhIHNpbmdsZSBmaWxlIGJ1dCB0d28gVVJMcy4gVGhpcwogIHdhcyBkaXNjb3ZlcmVkIHRvIGJlIHByb2JsZW1hdGljIHdoaWxlIGludmVzdGlnYXRpbmcgYW4gaW5jaWRlbnQgcmVwb3J0ZWQgYnkKICBWb24gYmFjayBpbiBNYXkuICBjdXJsIGluIHRoaXMgY2FzZSBkb2Vzbid0IGluY2x1ZGUgYSBDb250ZW50LUxlbmd0aDogb3IKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBoZWFkZXIgd2hpY2ggaXMgaWxsZWdhbC4gVGhpcyB0ZXN0IGNhc2UgaXMKICBhZGRlZCB0byBESVNBQkxFRCB1bnRpbCBhIHNvbHV0aW9uIGlzIGZvdW5kLgoKWWFuZyBUc2UgKDE1IEF1ZyAyMDA4KQotIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYW5kIGVxdWFsbHkgYXZhaWxhYmxlIGV4dGVybmFsbHkgd2hpY2gKICBhaWQgaW4gdGhlIHVzZSBvZiB0aGUgY3VybF9vZmZfdCBkYXRhIHR5cGUgYXJlIG5hbWVkOiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9ULAogIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVLCBDVVJMX1NJWkVPRl9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULAogIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVLCBDVVJMX09GRl9UX0MgYW5kIENVUkxfT0ZGX1RVX0MuCgpZYW5nIFRzZSAoMTMgQXVnIDIwMDgpCi0gVGhlIHNpemUgb2YgbG9uZyBpcyBhIGJ1aWxkIHRpbWUgY2hhcmFjdGVyaXN0aWMgYW5kIGFzIHN1Y2ggaXQgaXMgbm93IHJlY29yZGVkCiAgaW4gY3VybGJ1aWxkLmggYXMgQ1VSTF9TSVpFT0ZfTE9ORy4gRGVmaW5pdGlvbiBub3cgZG9uZSBmcm9tIGNvbmZpZ3VyZSBwcm9jZXNzCiAgYW5kIGluIENWUyBjdXJsYnVpbGQuaC5kaXN0IGZvciBub24tY29uZmlndXJlIHN5c3RlbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEF1ZyAyMDA4KQotIEZpeGVkIGEgYnVmZmVyIG92ZXJmbG93IHByb2JsZW0gaW4gQ3VybF9wcm94eUNPTk5FQ1QgdGhhdCBjb3VsZCBvY2N1cgogIHdoZW4gYSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggbG9uZyBoZWFkZXJzIGFuZCBkYXRhLiAgTHVja2lseSwgdGhlIGJ1ZmZlcgogIG92ZXJmbG93ZWQgaW50byBhbm90aGVyIHVudXNlZCBidWZmZXIsIHNvIG5vIGFjdHVhbCBoYXJtIHdhcyBkb25lLgogIEFkZGVkIHRlc3QgY2FzZXMgMTA2MCBhbmQgMTA2MSB0byB2ZXJpZnkuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA4KQotIEFuZHkgVHNvdWxhZHplIGZpeGVkIHJ1bnRlc3RzLnBsIHRvIG5vdCBhdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIHN0dW5uZWwKICBfZGlyZWN0b3J5XyBpZiB0aGF0IGhhcHBlbmVkIHRvIGFwcGVhciBpbiB0aGUgcGF0aCEKCllhbmcgVHNlICgxMiBBdWcgMjAwOCkKLSBBZGRlZCBtYWNyb3MgZm9yIG1pbmltdW0td2lkdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIKICBjb25zdGFudHMgQ1VSTF9PRkZfVF9DIGFuZCBDVVJMX09GRl9UVV9DLiBUaGUgY2xldmVyIGRvdWJsZSBoZWxwZXIgbWFjcm8KICB1c2VkIGludGVybmFsbHkgdG8gcHJvdmlkZSBpdHMgZnVuY3Rpb25hbGl0eSBpcyB0aGFua3MgdG8gTGFycyBOaWxzc29uLgoKRGFuaWVsIEZhbmRyaWNoICgxMSBBdWcgMjAwOCkKLSBGaXhlZCBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBlcnJvciBpbiBmdHBfcmVhZHJlc3AoKSB3aGVyZWJ5IGEgbm9uLXRlcm1pbmFsCiAgbGluZSBvZiBhIG11bHRpbGluZSBGVFAgcmVzcG9uc2Ugd2hvc2UgbGFzdCBieXRlIGxhbmRlZCBleGFjdGx5IGF0IHRoZSBlbmQKICBvZiB0aGUgQlVGU0laRS1sZW5ndGggYnVmZmVyIHdvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRlcm1pbmFsIHJlc3BvbnNlCiAgbGluZS4gIFRoZSBmb2xsb3dpbmcgcmVzcG9uc2UgY29kZSByZWFkIGluIHdvdWxkIHRoZW4gYWN0dWFsbHkgYmUgdGhlCiAgZW5kIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZSBsaW5lLCBhbmQgYWxsIHJlc3BvbnNlcyBmcm9tIHRoZW4gb24gd291bGQKICBjb3JyZXNwb25kIHRvIHRoZSB3cm9uZyBjb21tYW5kLiBUZXN0IGNhc2UgMTA2MiB2ZXJpZmllcyB0aGlzLgoKLSBTdG9wIGNsb3NpbmcgYSBuZXZlci1vcGVuZWQgZnRwIHNvY2tldC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgQXVnIDIwMDgpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQzMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDQyNDMwKSB3aXRoIGEgcGF0Y2guICJOVExNIFdpbmRvd3MKICBTU1BJIGNvZGUgaXMgbm90IHRocmVhZCBzYWZlIi4gVGhpcyB3YXMgZHVlIHRvIGxpYmN1cmwgdXNpbmcgc3RhdGljCiAgdmFyaWFibGVzIHRvIHRlbGwgd2V0aGVyIHRvIGxvYWQgdGhlIG5lY2Vzc2FyeSBTU1BJIERMTCwgYnV0IG5vdyB0aGUgbG9hZGluZwogIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBtb3JlIHN1aXRhYmxlIGN1cmxfZ2xvYmFsX2luaXQoKSBjYWxsLgoKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaWxlZCBidWcgcmVwb3J0ICMyMDQyNDQwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwNDI0NDApIHdpdGggYSBwYXRjaC4gSGUgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aGVuIHVzaW5nIE5UTE0gb3ZlciBhIHByb3h5IGJ1dCB0aGUgZW5kLXBvaW50IGRvZXMgQmFzaWMsIGFuZCB0aGVuCiAgbGliY3VybCB3b3VsZCBkbyB3cm9uZyB3aGVuIHRoZSBob3N0IHNlbnQgIkNvbm5lY3Rpb246IGNsb3NlIiBhcyB0aGUgcHJveHkncwogIE5UTE0gc3RhdGUgd2FzIGVycm9uZW91c2x5IGNsZWFyZWQuCgpZYW5nIFRzZSAoMTEgQXVnIDIwMDgpCi0gQWRkZWQgbWlzc2luZyBzaWduZWQgYW5kIHVuc2lnbmVkIGN1cmxfb2ZmX3QgaW50ZWdlciBjb25zdGFudCBzdWZmaXhlcyBmb3IKICBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdXNlLiBDVVJMX1NVRkZJWF9DVVJMX09GRl9ULCBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVS4KCkRhbmllbCBGYW5kcmljaCAoNyBBdWcgMjAwOCkKLSBGaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIG11bHRpX3J1bnNpbmdsZSgpIHRoYXQgY291bGQgY2F1c2UgYQogIHJlcXVlc3QgdG8gcHJlbWF0dXJlbHkgZW5kLgoKLSBBZGRlZCB0ZXN0MTA1OSB0byB0ZXN0IHRoZSBGVFAgcHJveHkgdHVubmVsIHByb2JsZW0gZml4ZWQgSnVseSAxMS4KCllhbmcgVHNlICg3IEF1ZyAyMDA4KQotIEFkZGVkIGN1cmxidWlsZC5oIGFuZCBjdXJscnVsZXMuaCBoZWFkZXIgZmlsZXMgdG8gbGliY3VybCdzIHB1YmxpYyBoZWFkZXJzLgogIEZpbGUgY3VybGJ1aWxkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZSBvbiBjb25maWd1cmUtY2FwYWJsZSBzeXN0ZW1zLiBUaGlzIGlzCiAgYSBmaXJzdCBzdGVwIHRvd2FyZHMgY29uZmlndXJlLWJhc2VkIGluZm8gaW4gcHVibGljIGhlYWRlcnMuIEN1cnJlbnRseSBvbmx5CiAgdXNlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGEgY3VybF9vZmZfdCBkYXRhIHR5cGUgd2hpY2ggaXMgbm90IGdhdGVkIHRvCiAgb2ZmX3QuIEZ1cnRoZXIgZGV0YWlscyBhcmUgZG9jdW1lbnRlZCBpbnNpZGUgdGhlc2UgbWVudGlvbmVkIGhlYWRlciBmaWxlcy4KCi0gRml4IENVUkxfQ0hFQ0tfREVGIHNvIHRoYXQgd2hlbiB0aGUgZXhwYW5zaW9uIG9mIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sCiAgcmVzdWx0cyBpbiBhIHNldCBvZiBkb3VibGUtcXVvdGVkIHN0cmluZ3MsIHRoaXMgbWFjcm8gd2lsbCBub3cgcmV0dXJuIGFuCiAgZXhwYW5zaW9uIHdoaWNoIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGFzIHRoZSByZXN1bHQgb2YKICBjb25jYXRlbmF0aW5nIGFsbCBvZiB0aGVtLgoKLSBTa2lwIGRhdGEgdHlwZSBjaGVjayBpbiBET19DVVJMX09GRl9UX0NIRUNLIG1hY3JvIHdoZW4gYXJndW1lbnQgaXMgZW1wdHkuCgotIEFkanVzdGVkIHRlc3RjdXJsLnBsIHRvIGNvcHkgY2hlY2tlZCBvdXQgY3VybGJ1aWxkLmguZGlzdCBhcyBjdXJsYnVpbGQuaAogIGZvciBub24tY29uZmlndXJlIHRhcmdldHMgd2hlbiB0aGUgaG9zdCBzeXN0ZW0gZG9lc24ndCBydW4gYnVpbGRjb25mLmJhdC4KCi0gUHJldmVudCBidWlsZGNvbmYgZnJvbSByZW1vdmluZyAnTWFrZWZpbGUnIGFuZCAnbWlzc2luZycgZmlsZXMuIFRoaXMgd291bGQKICBibG93IGF3YXkgb3VyIENWUyBjaGVja2VkIGZpbGVzICdtaXNzaW5nJyBhbmQgJ2hpcGVyL01ha2VmaWxlJy4KCi0gUmVtb3ZlIGFkanVzdG1lbnQgZG9uZSB0byB0ZXN0Y3VybC5wbCB0byB2ZXJpZnkgaWYgY2hhbmdlIGludHJvZHVjZWQgYnkKICBHdWVudGVyIEtuYXVmIGluIGxpYi9NYWtlZmlsZS5uZXR3YXJlIGlzIGVub3VnaCB0byBnZXQgdGhlIG5ldHdhcmUgYXV0b2J1aWxkcwogIGdvaW5nIGFnYWluLgoKWWFuZyBUc2UgKDUgQXVnIDIwMDgpCi0gQ2hhbmdlcyBkb25lIHRvIGJ1aWxkY29uZiBzY3JpcHQuIFZhbGlkYXRlIHRoYXQgYXV0b200dGUgYW5kIGF1dG9jb25mLCBhcwogIHdlbGwgYXMgYWNsb2NhbCBhbmQgYXV0b21ha2UsIHZlcnNpb25zIG1hdGNoLiBJbXByb3ZlIHJlbW92YWwgb2YgcHJldmlvdXMKICBydW4gZ2VuZXJhdGVkIGZpbGVzLiBSZW1vdmUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIG9mIGFjbG9jYWwgb24gU29sYXJpcy4KCkRhbmllbCBTdGVuYmVyZyAoNSBBdWcgMjAwOCkKLSBZZWhvc2h1YSBIZXJzaGJlcmcgZm91bmQgYSBwcm9ibGVtIHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIHJlLXVzZSBhCiAgY29ubmVjdGlvbiB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgZXZlbiBpZiBhIHByZXZpb3VzIHVzZSBvZiBpdCBjYXVzZWQgYQogIENVUkxFX1BFRVJfRkFJTEVEX1ZFUklGSUNBVElPTiB0byBnZXQgcmV0dXJuZWQuIEkgbm93IG1ha2Ugc3VyZSB0aGF0IGZhaWxlZAogIFNTTCBjb25uZWN0aW9ucyBwcm9wZXJseSBjbG9zZSB0aGUgY29ubmVjdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlcyAxMDUxLCAxMDUyIGFuZCAxMDU1IHdlcmUgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIG9uIEp1bHkgMzAgYW5kCiAgcHJvdmVkIGhvdyBQVVQgYW5kIFBPU1Qgd2l0aCBhIHJlZGlyZWN0IGNvdWxkIGxlYWQgdG8gYSAiaGFuZyIgZHVlIHRvIHRoZQogIGRhdGEgc3RyZWFtIG5vdCBiZWluZyByZXdvdW5kIHByb3Blcmx5IHdoZW4gaXQgaGFkIHRvIGluIG9yZGVyIHRvIGdldCBzZW50CiAgcHJvcGVybHkgKGFnYWluKSB0byB0aGUgc3Vic2VxdWVudCBVUkwuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGVzZSB0ZXN0CiAgY2FzZXMgYXJlIG5vIGxvbmdlciBkaXNhYmxlZC4KCllhbmcgVHNlICg0IEF1ZyAyMDA4KQotIEF1dG9jb25mIDIuNjIgaGFzIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUNfQUlYIG1hY3JvIHdoaWNoIHdlIHVzZS4KICBQcmlvciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBkZWZpbmVkIF9BTExfU09VUkNFIGlmIF9BSVggd2FzIGRlZmluZWQuIDIuNjIKICB2ZXJzaW9uIG9mIEFDX0FJWCBkZWZpbmVzIF9BTExfU09VUkNFIGFuZCBvdGhlciBmb3VyIHByZXByb2Nlc3NvciBzeW1ib2xzCiAgbm8gbWF0dGVyIGlmIHRoZSBzeXN0ZW0gaXMgQUlYIG9yIG5vdC4gVG8ga2VlcCB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLAogIGFuZCBhbiB1bmlmb3JtIG9uZSBhY3Jvc3MgYXV0b2NvbmYgdmVyc2lvbnMgQUNfQUlYIGlzIHJlcGxhY2VkIHdpdGggb3VyCiAgb3duIGludGVybmFsIG1hY3JvIENVUkxfQ0hFQ0tfQUlYX0FMTF9TT1VSQ0UuCgpEYW5pZWwgU3RlbmJlcmcgKDQgQXVnIDIwMDgpCi0gVGVzdCBjYXNlIDEwNDEgKGFkZGVkIGJ5IERhbmllbCBGYW5kcmljaCBKdWx5IDE0dGgpIHByb3ZlZCBhIGJ1ZyB3aGVyZSBQVVQKICB3aXRoIC1DIC0gc2VudCBnYXJiYWdlIGluIHRoZSBDb250ZW50LVJhbmdlOiBoZWFkZXIuIEkgZml4ZWQgdGhpcyBwcm9ibGVtIGJ5CiAgbWFraW5nIHN1cmUgbGliY3VybCBhbHdheXMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgX2VudGlyZV8gdXBsb2FkIGlmIGFuIGFwcAogIGF0dGVtcHMgdG8gZG8gcmVzdW1lZCB1cGxvYWRzIHNpbmNlIGxpYmN1cmwgc2ltcGx5IGNhbm5vdCBrbm93IHRoZSBzaXplIG9mCiAgd2hhdCBpcyBjdXJyZW50bHkgYXQgdGhlIHNlcnZlciBlbmQuIFRlc3QgMTA0MSBpcyBubyBsb25nZXIgZGlzYWJsZWQuCgpZYW5nIFRzZSAoMiBBdWcgMjAwOCkKLSBObyBsb25nZXIgdGVzdCBhdmFpbGFiaWxpdHkgb2YgdGhlIGdkaTMyIGxpYnJhcnksIG5vciB1c2UgaXQgZm9yIGxpbmtpbmcsIGV2ZW4KICB3aGVuIHdlIGhhdmUgYmVlbiBkb2luZyB0aGlzIHNpbmNlIHJldmlzaW9uIDEuNDcgb2YgY29uZmlndXJlLmFjIDQgeWVhcnMgYW5kCiAgNSBtb250aHMgYWdvIHdoZW4gY3Jvc3MtY29tcGlsaW5nIGEgV2luZG93cyB0YXJnZXQuIFdlIGFjdHVhbGx5IGRvbid0IHVzZSBhbnkKICBmdW5jdGlvbiBmcm9tIHRoZSBXaW5kb3dzIEdESSAoR3JhcGhpY3MgRGV2aWNlIEludGVyZmFjZSkgcmVsYXRlZCB3aXRoIGRyYXdpbmcKICBvciBncmFwaGljcy1yZWxhdGVkIG9wZXJhdGlvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEgQXVnIDIwMDgpCi0gQWRkZWQgc3VwcG9ydCBmb3IgLS1hcHBlbmQgb24gU0ZUUCB1cGxvYWRzLiBVbmZvcnR1bmF0ZWx5LCBPcGVuU1NIIGRvZXNuJ3QKICBzdXBwb3J0IHRoaXMgc28gaXQgZ29lcyB1bnRlc3RlZC4KCllhbmcgVHNlICgxIEF1ZyAyMDA4KQotIENvbmZpZ3VyZSBwcm9jZXNzIG5vdyBjaGVja3MgaWYgdGhlIHByZXByb2Nlc3NvciBfUkVFTlRSQU5UIHN5bWJvbCBpcyBhbHJlYWR5CiAgZGVmaW5lZC4gSWYgaXQgaXNuJ3QgY3VycmVudGx5IGRlZmluZWQgYSBzZXQgb2YgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gdGVzdAogIGlmIGl0cyBkZWZpbml0aW9uIGlzIHJlcXVpcmVkIHRvIG1ha2UgdmlzaWJsZSB0byB0aGUgY29tcGlsZXIgYSBzZXQgb2YgKl9yCiAgZnVuY3Rpb25zLiBGaW5hbGx5LCBpZiBfUkVFTlRSQU5UIGlzIGFscmVhZHkgZGVmaW5lZCBvciBuZWVkZWQgaXQgdGFrZXMgY2FyZQogIG9mIG1ha2luZyBhZGp1c3RtZW50cyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgaXQgaXMgZGVmaW5lZCBlcXVhbGx5IGZvciB0aGUKICBjb25maWd1cmUgcHJvY2VzcyB0ZXN0cyBhbmQgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlLgoKLSBSZW1vdmVkIGRlZmluaXRpb24gb2YgQ1VSTF9DSEVDS19XT1JLSU5HX1JFU09MVkVSIGZyb20gYWNpbmNsdWRlLm00IGl0IGhhcwogIG5vdCBiZWVuIGluIHVzZSBzaW5jZSByZXZpc2lvbiAxLjgxIG9mIGNvbmZpZ3VyZS5pbiA2IHllYXJzLCA5IG1vbnRocyBhZ28uCgpEYW5pZWwgRmFuZHJpY2ggKDMxIEp1bCAyMDA4KQotIEZpeGVkIHBhcnNpbmcgb2YgYW4gSVB2NiBwcm94eSBhZGRyZXNzIHRvIHN1cHBvcnQgYSBzY29wZSBpZGVudGlmaWVyLAogIGFzIHdlbGwgYXMgSVB2NCBhZGRyZXNzZXMgaW4gSVB2NiBmb3JtYXQuIEFsc28sIGJldHRlciBoYW5kbGUgdGhlIGNhc2UKICBvZiBhIG1hbGZvcm1hdHRlZCBJUHY2IGFkZHJlc3MgKGF2b2lkIGVtcHR5IGFuZCBOVUxMIHN0cmluZ3MpLgoKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBhbnkgRlRQIFVSTCBvciBhbnkgVVJMcyBjb250YWluaW5nIGFuIElQdjYgYWRkcmVzcwogIGJlaW5nIG1hbmdsZWQgd2hlbiBwYXNzZWQgdG8gcHJveGllcyB3aGVuIENVUkxPUFRfUE9SVCBpcyBhbHNvIHNldAogIChyZXBvcnRlZCBieSBQcmFtb2QgU2hhcm1hKS4KCi0gVXNlciBuYW1lcyBlbWJlZGRlZCBpbiBwcm94eSBVUkxzIHdpdGhvdXQgYSBwYXNzd29yZCB3ZXJlIHBhcnNlZAogIGluY29ycmVjdGx5LS10aGUgaG9zdCBuYW1lIGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdXNlciBuYW1lIGFuZCB0aGUKICBwb3J0IG51bWJlciBiZWNvbWVzIHRoZSBwYXNzd29yZC4gIFRoaXMgY2FuIGJlIG9ic2VydmVkIGluIHRlc3QgMjc5CiAgKHdhcyBLTk9XTl9JU1NVRSAjNTQpLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdWwgMjAwOCkKLSBQaGlsIEJsdW5kZWxsIGFkZGVkIHRoZSBDVVJMT1BUX0FERFJFU1NfU0NPUEUgb3B0aW9uLCBhcyB3ZWxsIGFzIGFkanVzdGVkCiAgdGhlIFVSTCBwYXJzZXIgdG8gYWxsb3cgbnVtZXJpY2FsIElQdjYtYWRkcmVzc2VzIHRvIGJlIHNwZWNpZmllZCB3aXRoIHRoZQogIHNjb3BlIGdpdmVuLCBhcyBwZXIgUkZDNDAwNyAtIHdpdGggYSBwZXJjZW50IGxldHRlciB0aGF0IGl0c2VsZiBuZWVkcyB0byBiZQogIFVSTCBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgZm9yIGFuIGFkZHJlc3Mgb2YgZmU4MDo6MTIzNCUxIHRoZSBIVFRQIFVSTCBpczoKICAiaHR0cDovL1tmZTgwOjoxMjM0JTI1MV0vIgoKLSBQSFAncyBidWcgcmVwb3J0ICM0MzE1OCAoaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQzMTU4KSBpZGVudGlmaWVzIGEKICB0cnVlIGJ1ZyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggT3BlblNTTC4gSXQgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIG1vcmUgb3IKICBsZXNzIGFsd2F5cyByZXR1cm4gMCBmb3IgQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCBiZWNhdXNlIHRoZSBmdW5jdGlvbiB0aGF0CiAgd291bGQgc2V0IGl0IHRvIHNvbWV0aGluZyBub24temVybyB3b3VsZCByZXR1cm4gYmVmb3JlIHRoZSBhc3NpZ24gaW4gYWxtb3N0CiAgYWxsIGVycm9yIGNhc2VzLiBUaGUgaW50ZXJuYWwgdmFyaWFibGUgaXMgbm93IHNldCB0byBub24temVybyBmcm9tIHRoZSBzdGFydAogIG9mIHRoZSBmdW5jdGlvbiBvbmx5IHRvIGdldCBjbGVhcmVkIGxhdGVyIG9uIGlmIHRoaW5ncyB3b3JrIG91dCBmaW5lLgoKLSBNYWRlIHRoZSBjdXJsIHRvb2wncyAtdyBvcHRpb24gc3VwcG9ydCB0aGUgJXtzc2xfdmVyaWZ5X3Jlc3VsdH0gdmFyaWFibGUKCkRhbmllbCBGYW5kcmljaCAoMzAgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDUyIHRocm91Z2ggMTA1NSB0byB0ZXN0IHVwbG9hZGluZyBkYXRhIGZyb20gZmlsZXMKICBkdXJpbmcgcmVkaXJlY3RzLiAgVGVzdCBjYXNlcyAxMDUyIGFuZCAxMDU1IHNob3cgcHJvYmxlbXMgKG1heWJlIHRoZSBzYW1lCiAgcm9vdCBjYXVzZSBhcyAxMDUxKSBhbmQgYXJlIGRpc2FibGVkLgoKLSBGaXhlZCBhIGNvdXBsZSBvZiBidWZmZXIgb3ZlcmZsb3dzIGluIHRoZSBNUy1ET1MgcG9ydCBvZiB0aGUgY3VybCB0b29sLgoKRGFuaWVsIEZhbmRyaWNoICgyOSBKdWwgMjAwOCkKLSBGaXhlZCAtLXVzZS1hc2NpaSB0byBwcm9wZXJseSBjb252ZXJ0IHRleHQgZmlsZXMgb24gU3ltYmlhbiBPUywgTVMtRE9TCiAgYW5kIE9TLzIuCgotIEFkZGVkIHRlc3QgY2FzZSAxMDUxIHRvIHRlc3QgTG9jYXRpb246IGZvbGxvd2luZyB3aXRoIFBVVCwgYXMgcmVwb3J0ZWQKICBieSBCZW4gU3V0Y2xpZmZlLiAgVGhlIHRlc3Qgd2hlbiBydW4gbWFudWFsbHkgc2hvd3MgYSBwcm9ibGVtIGluIGN1cmwKICBzbyBpdCdzIGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgyOCBKdWwgMjAwOCkKLSBGaXhlZCBkaXNwbGF5IG9mIHRoZSBpbnRlcmZhY2UgYmluZCBhZGRyZXNzIGluIHRoZSB0cmFjZSBvdXRwdXQgd2hlbiBpdCdzCiAgYW4gSVB2NiBhZGRyZXNzLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwNDUgdGhyb3VnaCAxMDQ5IGFzIHNpbXBsZSB0ZXN0cyBvZiAtLWludGVyZmFjZSB1c2luZyB0aGUKICBsb2NhbGhvc3QgaW50ZXJmYWNlLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTA1MCB0byB0ZXN0IC0tZnRwLXBvcnQgd2l0aCBhbiBJUHY2IGFkZHJlc3MKCkRhbmllbCBTdGVuYmVyZyAoMjYgSnVsIDIwMDgpCi0gRGF2aWQgQmF1IGZpbGVkIGJ1ZyByZXBvcnQgIzIwMjYyNDAgIkNVUkxfUkVBREZVTkNfUEFVU0UgbGVhZHMgdG8gYnVmZmVyCiAgb3ZlcnJ1biIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMjYyNDApIGlkZW50aWZ5aW5nIHR3bwogIHByb2JsZW1zLCBhbmQgcHJvdmlkaW5nIHRoZSBmaXggZm9yIHRoZW06CgogIC0gQ1VSTF9SRUFERlVOQ19QQVVTRSBkaWQgaW4gZmFjdCBub3QgcGF1c2UgdGhlIF9zZW5kaW5nXyBvZiBkYXRhIHRoYXQgaXQgaXMKICAgIGRlc2lnbmVkIGZvciBidXQgcGF1c2VkIF9yZWNlaXZpbmdfIG9mIGRhdGEhCgogIC0gbGliY3VybCBkaWRuJ3QgaW50ZXJuYWxseSBzZXQgdGhlIHJlYWQgY291bnRlciB0byB6ZXJvIHdoZW4gdGhpcyByZXR1cm4KICAgIGNvZGUgd2FzIGRldGVjdGVkLCB3aGljaCB3b3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGp1bmsgZ2V0dGluZyBzZW50IHRvCiAgICB0aGUgc2VydmVyLgoKRGFuaWVsIEZhbmRyaWNoICgyNiBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwNDQgdG8gdGVzdCBsYXJnZSBmaWxlIHN1cHBvcnQgaW4gZnRwIHdpdGggLUkuCgotIEVsaW1pbmF0ZSBhIHVubmVjZXNzYXJ5IHNvY2tldCBjcmVhdGlvbiBpbiBDdXJsX2dldGFkZHJpbmZvIGZvciBhbiBJUHY0CiAgYWRkcmVzcyBpbiBhbiBJUHY2IGNhcGFibGUgbGliY3VybC4KCi0gQWRkZWQgZmVhdHVyZSBpbiBydW50ZXN0cy5wbCB0byBzZWxlY3QgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmQuCgpEYW5pZWwgRmFuZHJpY2ggKDIzIEp1bCAyMDA4KQotIENoYW5nZWQgdGhlIGxvbmcgbG9nZmlsZSBlbGlzaW9uIGNvZGUgaW4gcnVudGVzdHMucGwgdG8gcHJvcGVybHkgaGFuZGxlCiAgbGluZXMgZW5kaW5nIGluIFxyLgoKLSBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gVFJVRSBhbmQgRkFMU0UgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdG8KICAxIGFuZCB6ZXJvLCByZXNwZWN0aXZlbHksIHNpbmNlIFRSVUUgYW5kIEZBTFNFIGFyZW4ndCBwYXJ0IG9mIHRoZQogIGxpYmN1cmwgQVBJLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOCkKLSBJIHdlbnQgb3ZlciB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBhbmQgcmVwbGFjZWQgbW9zdCByZWZlcmVuY2VzIHRvCiAgbm9uLXplcm8gd2l0aCB0aGUgZml4ZWQgdmFsdWUgb2YgMS4gV2Ugc2hvdWxkIHN0cml2ZSBhdCBtYWtpbmcgb3B0aW9ucwogIHN1cHBvcnQgJzEnIGZvciBlbmFibGluZyB0aGVtIG1lbnRpb25lZCBleHBsaWNpdGx5LCBhcyB0aGF0IHRoZW4gd2lsbCBhbGxvdwogIHVzIGZvciB0byBleHRlbmQgdGhlbSBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgb2xkZXIgcHJvZ3JhbXMuCgogIFBvc3NpYmx5IHdlIHNob3VsZCBldmVuIGludHJvZHVjZSBhIGZhbmN5IGRlZmluZSB0byB1c2UgaW5zdGVhZCBvZiAnMScgYWxsCiAgb3Zlci4uLgoKWWFuZyBUc2UgKDIxIEp1bCAyMDA4KQotIFVzZSB0aGUgc3JlYWRmcm9tKCkgd3JhcHBlciB0byByZXBsYWNlIHJlY3Zmcm9tKCkgaW4gb3VyIGNvZGUuCgpZYW5nIFRzZSAoMjAgSnVsIDIwMDgpCi0gd2hlbiByZWN2ZnJvbSBwcm90b3R5cGUgdXNlcyBhIHZvaWQgcG9pbnRlciBmb3IgYXJndW1lbnRzIDIsIDUgb3IgNiB0aGlzIHdpbGwKICBub3cgY2F1c2UgdGhlIGRlZmluaXRpb24sIGFzIGFwcHJvcHJpYXRlLCBvZiBSRUNWRlJPTV9UWVBFX0FSRzJfSVNfVk9JRCwKICBSRUNWRlJPTV9UWVBFX0FSRzVfSVNfVk9JRCBvciBSRUNWRlJPTV9UWVBFX0FSRzZfSVNfVk9JRC4KCllhbmcgVHNlICgxNyBKdWwgMjAwOCkKLSBSRUNWRlJPTV9UWVBFX0FSRzIsIFJFQ1ZGUk9NX1RZUEVfQVJHNSBhbmQgUkVDVkZST01fVFlQRV9BUkc2IGFyZSBub3cgZGVmaW5lZAogIHRvIHRoZSBkYXRhIHR5cGUgcG9pbnRlZCBieSBpdHMgcmVzcGVjdGl2ZSBhcmd1bWVudCBhbmQgbm90IHRoZSBwb2ludGVyIHR5cGUuCgpZYW5nIFRzZSAoMTYgSnVsIDIwMDgpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgcmVjdmZyb20oKSBzb2NrZXQgZnVuY3Rpb24gYW5kCiAgZmluZHMgb3V0IGl0cyByZXR1cm4gdHlwZSBhbmQgdGhlIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIEFkZGVkIGRlZmluaXRpb25zCiAgZm9yIG5vbi1jb25maWd1cmUgc3lzdGVtcyBjb25maWcgZmlsZXMsIGFuZCBpbnRyb2R1Y2VkIG1hY3JvIHNyZWFkZnJvbSB3aGljaAogIHdpbGwgYmUgdXNlZCBvbiB1ZHAgc29ja2V0cyBhcyBhIHJlY3Zmcm9tKCkgd3JhcHBlci4KCllhbmcgVHNlICgxNSBKdWwgMjAwOCkKLSBBZGRlZCBkZXNjcmlwdGlvbi9jb21tZW50IHRvIGluY2x1ZGUgcGF0aHMgdXNlZCBpbiBzZXZlcmFsIE1ha2VmaWxlLmFtIGZpbGVzLgogIEFkZGVkIGF1dG9tYWtlIG9wdGlvbiBub3N0ZGluYyB0byB0ZXN0IHNlcnZlcnMgbWFrZWZpbGUgYW5kIG1vZGlmaWVkIGxpYmN1cmwKICBleHRlcm5hbCBoZWFkZXJzIGluY2x1ZGUgcGF0aCBmb3IgbGlidGVzdCBwcm9ncmFtcy4KCkRhbmllbCBGYW5kcmljaCAoMTQgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdDEwNDAgdGhyb3VnaCB0ZXN0MTA0MyB0byB0ZXN0IC1DIC0gb24gSFRUUC4gVGVzdCAxMDQxIGZhaWxlZCBzbwogIGl0J3MgYWRkZWQgdG8gRElTQUJMRUQuCgpZYW5nIFRzZSAoMTQgSnVsIDIwMDgpCi0gSFRUUF9PTkxZIGRlZmluaXRpb24gY2hlY2sgaW4gbGliL3NldHVwLmggaXMgbm93IGRvbmUgb25jZSB0aGF0IGNvbmZpZ3VyYXRpb24KICBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkLiBJbiB0aGlzIHdheSBpZiBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgY29uZmlnIGZpbGUKICBpdCB3aWxsIG5vIGxvbmdlciBiZSBpZ25vcmVkLiAgUmVtb3ZlZCBpbmNsdXNpb24gb2YgcmVtYWluaW5nIHN5c3RlbSBoZWFkZXIKICBmaWxlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMuIE1vdmVkIF9SRUVOVFJBTlQgZGVmaW5pdGlvbiB1cC9lYXJsaWVyIGluCiAgbGliL3NldHVwLmgKCllhbmcgVHNlICgxMSBKdWwgMjAwOCkKLSBBZGRlZCBtaXNzaW5nIG11bHRpcGxlIGhlYWRlciBpbmNsdXNpb24gcHJldmVudGlvbiBkZWZpbml0aW9uIGZvciBoZWFkZXIKICBmaWxlIGNvbnRlbnRfZW5jb2RpbmcuaAoKRGFuaWVsIEZhbmRyaWNoICgxMSBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1MyB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1bCAyMDA4KQotIERhbmllbCBGYW5kcmljaCBmb3VuZCBvdXQgd2UgZGlkbid0IHBhc3Mgb24gdGhlIHVzZXItYWdlbnQgcHJvcGVybHkgd2hlbgogIGRvaW5nICJwcm94eS10dW5uZWxzIiB3aXRoIG5vbi1IVFRQIHByb3RvdG9scyBhbmQgdGhhdCB3YXMgc2ltcGx5IGJlY2F1c2UKICB0aGUgY29kZSBhc3N1bWVkIHRoZSB1c2VyLWFnZW50IHdhcyBvbmx5IG5lZWRlZCBmb3IgSFRUUC4KCkRhbmllbCBGYW5kcmljaCAoMTAgSnVsIDIwMDgpCi0gQ2hhbmdlZCBzbGlnaHRseSB0aGUgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24gYW5kIGNoZ3JwIHRvIG9ubHkKICBzZXQgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBjaGFuZ2VkIGluc3RlYWQgb2YgYWxsIHBvc3NpYmxlIG9uZXMuIEhvcGVmdWxseSwKICB0aGlzIHdpbGwgc29sdmUgdGhlICJQZXJtaXNzaW9uIGRlbmllZCIgcHJvYmxlbSB0aGF0IE5hZ2FyYWphbiBTcmVlbml2YXNhbgogIHJlcG9ydGVkIHdoZW4gc2V0dGluZyBzb21lIG1vZGVzLCBidXQgcmVnYXJkbGVzcywgaXQgc2F2ZXMgYSBwcm90b2NvbAogIHJvdW5kIHRyaXAgaW4gdGhlIGNobW9kIGNhc2UuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAzOCBhbmQgMTAzOSB0byB0ZXN0IEFkcmlhbiBLcmVoZXIncyByZXBvcnQgdGhhdCBmdHAKICB1cGxvYWRzIHdpdGggLUMgLSBkaWRuJ3QgcmVzdW1lIHByb3Blcmx5LCBidXQgdGhlIHRlc3RzIHBhc3MuCgpZYW5nIFRzZSAoMTAgSnVsIDIwMDgpCi0gUGV0ZXIgTGFtYmVyZyBmaWxlZCBidWcgcmVwb3J0ICMyMDE1MTI2OiAicG9sbCBnaXZlcyBXU0FFSU5WQUwgd2hlbiBQT0xMUFJJCiAgaXMgc2V0IGluIGZkc2V0LmV2ZW50cyIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIwMTUxMjYpIHdoaWNoCiAgZXhhY3RseSBwaW5wb2ludGVkIHRoZSBwcm9ibGVtIG9ubHkgdHJpZ2dlcmVkIG9uIFdpbmRvd3MgVmlzdGEsIHByb3ZpZGVkCiAgcmVmZXJlbmNlIHRvIGRvY3MgYW5kIGFsc28gYSBmaXguIFRoZXJlIGlzIG11Y2ggd29yayBiZWhpbmQgUGV0ZXIgTGFtYmVyZydzCiAgZXhjZWxsZW50IGJ1ZyByZXBvcnQuIFRoYW5rIFlvdSEKCkRhbmllbCBGYW5kcmljaCAoOSBKdWwgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDM2IGFuZCAxMDM3IHRvIHZlcmlmeSByZXN1bWVkIGZ0cCBkb3dubG9hZHMgd2l0aCAtQyAtCgpEYW5pZWwgU3RlbmJlcmcgKDkgSnVsIDIwMDgpCi0gQW5kcmVhcyBTY2h1bGRlaSBpbXByb3ZlZCBQaGlsIEJsdW5kZWxsJ3MgcGF0Y2ggZm9yIElQdjYgdXNpbmcgYy1hcmVzLCBhbmQgSQogIGVkaXRlZCBpdCBzbGlnaHRseS4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgSVB2NiBhZGRyZXNzZXMgZmluZSBldmVuCiAgd2l0aCBsaWJjdXJsIGJ1aWx0IHRvIHVzZSBjLWFyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDkgSnVsIDIwMDgpCi0gRml4ZWQgYW4gT09NIGhhbmRsaW5nIHByb2JsZW0gdGhhdCBjYXVzZSB0ZXN0IDExIHRvIGZhaWwgdGhlIHRvcnR1cmUgdGVzdC4KCkRhbmllbCBGYW5kcmljaCAoOCBKdWwgMjAwOCkKLSBGaXhlZCB0ZXN0IDU1NCB0byBwYXNzIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgRmFuZHJpY2ggKDcgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDM0ICYgMTAzNSB0byB0ZXN0IElETiBuYW1lIGNvbnZlcnNpb24gZmFpbHVyZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDcgSnVsIDIwMDgpCi0gU2NvdHQgQmFycmV0dCBwcm92aWRlZCBhIHRlc3QgY2FzZSBmb3IgYSBzZWdmYXVsdCBpbiB0aGUgRlRQIGNvZGUgYW5kIHRoZQogIGZpeCBmb3IgaXQuIEl0IG9jY3VyZWQgd2hlbiB5b3UgZGlkIGEgRlRQIHRyYW5zZmVyIHVzaW5nCiAgQ1VSTEZUUE1FVEhPRF9TSU5HTEVDV0QgYW5kIHRoZW4gZGlkIGFub3RoZXIgb25lIG9uIHRoZSBzYW1lIGVhc3kgaGFuZGxlIGJ1dAogIHN3aXRjaGVkIHRvIENVUkxGVFBNRVRIT0RfTk9DV0QuIER1ZSB0byB0aGUgImRpciBkZXB0aCIgdmFyaWFibGUgbm90IGJlaW5nCiAgY2xlYXJlZCBwcm9wZXJseS4gIFNjb3R0J3MgdGVzdCBjYXNlIGlzIG5vdyBrbm93biBhcyB0ZXN0IDUzOSBhbmQgaXQKICB2ZXJpZmllcyB0aGUgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICgzIEp1bCAyMDA4KQotIFBoaWwgQmx1bmRlbGwgcHJvdmlkZWQgYSBmaXggZm9yIGxpYmN1cmwncyB0cmVhdG1lbnQgb2YgdW5leHBlY3RlZCAxeHgKICByZXNwb25zZSBjb2Rlcy4gUHJldmlvdXNseSBsaWJjdXJsIHdvdWxkIGhhbmcgb24gc3VjaCBvY2N1cmFuY2VzLiBJIGFkZGVkCiAgdGVzdCBjYXNlIDEwMzMgdG8gdmVyaWZ5LgoKLSBJbnRyb2N1ZGluZyBhIG5ldyB0aW1lc3RhbXAgZm9yIGN1cmxfZWFzeV9nZXRpbmZvKCk6CiAgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FLiBUaGlzIGlzIHNldCB3aXRoIHRoZSAiYXBwbGljYXRpb24gbGF5ZXIiCiAgaGFuZHNoYWtlL2Nvbm5lY3Rpb24gaXMgY29tcGxldGVkLiBXaGljaCB0eXBpY2FsbHkgaXMgU1NMLCBUTFMgb3IgU1NIIGFuZCBieQogIHVzaW5nIHRoaXMgeW91IGNhbiBmaWd1cmUgb3V0IHRoZSBhcHBsaWNhdGlvbiBsYXllcidzIG93biBjb25uZWN0IHRpbWUuIFlvdQogIGNhbiBleHRyYWN0IHRoZSB0aW1lIHN0YW1wIHVzaW5nIGN1cmwncyAtdyBvcHRpb24gYW5kIHRoZSBuZXcgdmFyaWFibGUgbmFtZWQKICAndGltZV9hcHBjb25uZWN0Jy4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgTGVubnkgUmFjaGl0c2t5IGF0IE5ldVN0YXIuCgpEYW5pZWwgRmFuZHJpY2ggKDIgSnVsIDIwMDgpCi0gU3VwcG9ydCBPcGVuIFdhdGNvbSBDIG9uIExpbnV4IChhcyB3ZWxsIGFzIFdpbmRvd3MpLgoKWWFuZyBUc2UgKDIgSnVsIDIwMDgpCi0gVGhlIHByZXZpb3VzbHkgY29tbWl0dGVkIGZpeCBmb3IgYnVnIHJlcG9ydCAjMTk5OTE4MSBwcmV2ZW50ZWQgdXNpbmcgdGhlCiAgbW9ub3RvbmljIGNsb2NrIG9uIGFueSBzeXN0ZW0gd2l0aG91dCBhbiBhbHdheXMgc3VwcG9ydGVkIFBPU0lYIGNvbXBsaWFudAogIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlIFBPU0lYIGNvbXBsaWFudCBjb25maWd1cmF0aW9uIGNoZWNrIGlzIHJlbW92ZWQgYW5kCiAgd2lsbCBmYWxsYmFjayB0byBnZXR0aW1lb2ZkYXkgd2hlbiB0aGUgbW9ub3RvbmljIGNsb2NrIGlzIHVuYXZhaWxhYmxlIGF0CiAgcnVuLXRpbWUuCgotIFRoZSBjb25maWd1cmUgcHJvY2VzcyB3aWxsIG5vdyBoYWx0IHdoZW4gc2VkLCBncmVwLCBlZ3JlcCBvciBhciBwcm9ncmFtcwogIGNhbiBub3QgYmUgZm91bmQgYW1vbmcgdGhlIGRpcmVjdG9yaWVzIGluIFBBVEggdmFyaWFibGUuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSnVsIDIwMDgpCi0gUm9sbGFuZCBEdWRlbWFpbmUgcHJvdmlkZWQgZml4ZXMgdG8gZ2V0IGxpYmN1cmwgdG8gYnVpbGQgZm9yIHRoZSBJTlRFR1JJVFkKICBvcGVyYXRpbmcgc3lzdGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBKdW4gMjAwOCkKLSBNYWRlIHRoZSBpbnRlcm5hbCBwcmludGYoKSBzdXBwb3J0ICVsbHUgcHJvcGVybHkgdG8gcHJpbnQgdW5zaWduZWQgbG9uZyBsb25ncy4KCi0gU3RlcGhlbiBDb2xseWVyIGFuZCBUb3IgQXJudHNlbiBoZWxwZWQgaWRlbnRpZnkgYSBmbGF3IGluIHRoZSByYW5nZSBjb2RlCiAgd2hpY2ggb3V0cHV0IHRoZSByYW5nZSB1c2luZyBhIHNpZ25lZCB2YXJpYWJsZSB3aGVyZSBpdCBzaG91bGQgcmF0aGVyIHVzZQogIHVuc2lnbmVkLgoKWWFuZyBUc2UgKDI5IEp1biAyMDA4KQotIEpvaG4gTGlnaHRzZXkgZmlsZWQgYnVnIHJlcG9ydCAjMTk5OTE4MTogIkNMT0NLX01PTk9UT05JQyBhbHdheXMgZmFpbHMgb24KICBzb21lIHN5c3RlbXMiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTk5MTgxKS4gVGhlIHByb2JsZW0gd2FzCiAgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWQgbm90IHVzZSB0aGUgX1BPU0lYX01PTk9UT05JQ19DTE9DSyBmZWF0dXJlIHRlc3QKICBtYWNybyB3aGVuIGNoZWNraW5nIG1vbm90b25pYyBjbG9jayBhdmFpbGFiaWxpdHkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0aGUKICBtb25vdG9uaWMgY2xvY2sgd2lsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIGZlYXR1cmUgdGVzdCBtYWNybyBpcyBkZWZpbmVkCiAgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGluZGljYXRpbmcgYWx3YXlzIHN1cHBvcnRlZC4KCkRhbmllbCBGYW5kcmljaCAoMjUgSnVuIDIwMDgpCi0gSG9ub3VyIC0tc3RkZXJyIHdpdGggdGhlIC12IG9wdGlvbi4KCi0gRml4ZWQgYSBmaWxlIGhhbmRsZSBsZWFrIGluIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50IGlmIG1vcmUgdGhhbiBvbmUKICAtLXN0ZGVyciBvcHRpb24gd2FzIGdpdmVuLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBKdW4gMjAwOCkKLSBFZHVhcmQgQmxvY2ggZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODc1NjcKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4NzU2NykgcG9pbnRpbmcgb3V0IHRoYXQKICBsaWJjdXJsIHVzZWQgQ29udGVudC1SYW5nZTogaW5zdGVhZCBvZiBSYW5nZSB3aGVuIGRvaW5nIGEgcmFuZ2UgcmVxdWVzdCB3aXRoCiAgLS1oZWFkIChDVVJMT1BUX05PQk9EWSkuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgMTAzMiB3YXMgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEp1biAyMDA4KQotIFN0b3BwZWQgdXNpbmcgcmFuZ2VzIGluIHNjYW5mIGNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJVthLXpdKSBzaW5jZSB0aGF0CiAgaXMgbm90IEFOU0kgQywganVzdCBhIGNvbW1vbiBleHRlbnNpb24uICBUaGlzIGNhdXNlZCBwcm9ibGVtcyBvbgogIGF0IGxlYXN0IE9wZW4gV2F0Y29tIEMuCgpZYW5nIFRzZSAoMjAgSnVuIDIwMDgpCi0gTW9kaWZpZWQgY29uZmlndXJhdGlvbiBzY3JpcHQgdG8gYWN0dWFsbHkgdmVyaWZ5IGlmIHRoZSBjb21waWxlciBpcyBnb29kCiAgZW5vdWdoIGF0IGRldGVjdGluZyBjb21waWxhdGlvbiBlcnJvcnMgb3IgYXQgbGVhc3QgaXQgaGFzIGJlZW4gcHJvcGVybHkKICBjb25maWd1cmVkIHRvIGRvIHNvLiBDb25maWd1cmF0aW9uIGhlYXZpbHkgZGVwZW5kcyBvbiB0aGlzIGNhcGFiaWxpdHksIHNvCiAgaWYgdGhpcyBjb21waWxlciBzYW5pdHkgY2hlY2sgZmFpbHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdyBmYWlsLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKdW4gMjAwOCkKLSBQaGlsIFBlbGxvdWNob3VkIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGJ1aWx0IHdpdGggTlNTIGZhaWxlZCB0bwogIGhhbmRzaGFrZSB3aXRoIGEgU1NMdjIgc2VydmVyLCBhbmQgaXQgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGl0IGRpZG4ndAogIHJlY29nbml6ZSB0aGUgY2lwaGVyIG5hbWVkICJyYzQtbWQ1Ii4gSW4gb3VyIGxpc3QgdGhhdCBjaXBoZXIgd2FzIG5hbWVkCiAgcGxhaW5seSAicmM0Ii4gSSd2ZSBub3cgYWRkZWQgcmM0LW1kNSB0byB3b3JrIGFzIGFuIGFsaWFzIGFzIFBoaWwgcmVwb3J0ZWQKICB0aGF0IGl0IG1hZGUgdGhpbmdzIHdvcmsgZm9yIGhpbSBhZ2Fpbi4KCi0gSGFucy1KdXJnZW4gTWF5IHBvaW50ZWQgb3V0IHRoYXQgdHJ5aW5nIFNDUCBvciBTRlRQIG92ZXIgYSBTT0NLUyBwcm94eQogIGNyYXNoZWQgbGliY3VybC4gVGhpcyBpcyBub3cgYWRkcmVzc2VkIGJ5IG1ha2luZyBzdXJlIHdlIHVzZSAicGxhaW4gc2VuZCIKICBpbnRlcm5hbGx5IHdoZW4gZG9pbmcgdGhlIHNvY2tzIGhhbmRzaGFrZSBpbnN0ZWFkIG9mIHRoZSBDdXJsX3dyaXRlKCkKICBmdW5jdGlvbiB3aGljaCBpcyBkZXNpZ25lZCB0byB1c2UgdGhlICJ0YXJnZXQiIHByb3RvY29sLiBUaGF0J3MgdGhlbiBTQ1Agb3IKICBTRlRQIGluIHRoaXMgY2FzZS4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IGFuZCBjbGVhbmVkIHVwIHNvbWUgc3NoLQogIHJlbGF0ZWQgI2lmZGVmcyBpbiB0aGUgY29kZSBmb3IgcmVhZGFiaWxpdHkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEp1biAyMDA4KQotIENocmlzdG9waGVyIFBhbG93IGZpeGVkIGEgY3VybF9tdWx0aV9zb2NrZXQoKSBpc3N1ZSB3aGljaCBwcmV2aW91c2x5IGNhdXNlZAogIGxpYmN1cmwgdG8gbm90IHRlbGwgdGhlIGFwcCBwcm9wZXJseSB3aGVuIGEgc29ja2V0IHdhcyBjbG9zZWQgKHdoZW4gdGhlIG5hbWUKICByZXNvbHZlIGRvbmUgYnkgYy1hcmVzIGlzIGNvbXBsZXRlZCkgYW5kIHRoZW4gaW1tZWRpYXRlbHkgcmUtY3JlYXRlZCBhbmQgcHV0CiAgdG8gdXNlIGFnYWluIChmb3IgdGhlIGFjdHVhbCBjb25uZWN0aW9uKS4gU2luY2UgdGhlIGNsb3N1cmUgd2lsbCBtYWtlIHRoZQogICJ3YXRjaCBzdGF0dXMiIGdldCBsb3N0IGluIHNldmVyYWwgZXZlbnQtYmFzZWQgc3lzdGVtcyBsaWJjdXJsIHdpbGwgbmVlZCB0bwogIHRlbGwgdGhlIGFwcCBhYm91dCB0aGlzIGNsb3NlL3JlLWNyZWF0ZSBjYXNlLgoKLSBEZW5nbWlud2VuIGZvdW5kIGEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBmdW5jdGlvbiB3aGVuIHVzaW5nIHRoZQogIG11bHRpIGludGVyZmFjZSB3aXRoIHBpcGVsaW5pbmcgZW5hYmxlZCBhcyBpdCB3b3VsZCB3cm9uZ2x5IGNoZWNrIGZvciwKICBkZXRlY3QgYW5kIGNsb3NlICJkZWFkIGNvbm5lY3Rpb25zIiBldmVuIHRob3VnaCB0aGF0IGNvbm5lY3Rpb24gd2FzIGFscmVhZHkKICBpbiB1c2UhCgpEYW5pZWwgRmFuZHJpY2ggKDE4IEp1biAyMDA4KQotIEFkZGVkIFNTSCBmYWlsdXJlIHRlc3QgY2FzZXMgNjI4LTYzMgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBhIHZhbGdyaW5kIGVycm9yLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBKdW4gMjAwOCkKLSBSb2IgQ3JpdHRlbmRlbiBicm91Z2h0IGEgZml4IGZvciB0aGUgTlNTIGxheWVyIHRoYXQgbWFrZXMgbGliY3VybCBubyBsb25nZXIKICBhbHdheXMgZmlyZSB1cCBhIG5ldyBjb25uZWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBleGlzdGluZyBvbmUgd2hlbiB0aGUKICBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZC4gT3JpZ2luYWwgYnVnIHJlcG9ydDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ1MDE0MAoKWWFuZyBUc2UgKDE4IEp1biAyMDA4KQotIEludGVybmFsIGNvbmZpZ3VyZSBzY3JpcHQgaW1wcm92ZW1lbnQuIE5vIGxvbmdlciBicmVhayBvdXQgb2Ygc2hlbGwgImZvciIKICBzdGF0ZW1lbnRzIGZyb20gaW5zaWRlIEFDX0ZPT19JRkVMU0UgbWFjcm9zLCBvdGhlcndpc2UgdGVtcG9yYXJ5IG1hY3JvIGZpbGVzCiAgYXJlIG5vdCBwcm9wZXJseSByZW1vdmVkLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBKdW4gMjAwOCkKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWNhIHdoaWNoIHdhc24ndCBiZWluZyBleHBvcnRlZCBieSBjb25maWd1cmUuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEp1biAyMDA4KQotIEkgZGlkIGEgY2xlYW51cCBvZiB0aGUgaW50ZXJuYWwgZ2VuZXJpYyBTU0wgbGF5ZXIgYW5kIGhvdyB0aGUgdmFyaW91cyBTU0wKICBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gU3RhcnRpbmcgbm93LCBlYWNoIHVuZGVybHlpbmcgU1NMIGxpYnJhcnkgc3VwcG9ydAogIGNvZGUgZG9lcyBhIHNldCBvZiBkZWZpbmVzIGZvciB0aGUgMTYgZnVuY3Rpb25zIHRoZSBnZW5lcmljIGxheWVyIChzc2xnZW4uYykKICB1c2VzIChhbGwgdGhlc2UgbmV3IGZ1bmN0aW9uIGRlZmluZXMgdXNlIHRoZSBwcmVmaXggImN1cmxzc2xfIikuIFRoaXMKICBncmVhdGx5IHNpbXBsaWZpZWQgdGhlIGdlbmVyaWMgbGF5ZXIgaW4gcmVhZGFiaWxpdHkgYnkgaW52b2x2aW5nIG11Y2ggbGVzcwogICNpZmRlZnMgYW5kIG90aGVyIHByZXByb2Nlc3NvciBzdHVmZiBhbmQgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIGZvciBwZW9wbGUgdG8KICBtYWtlIGxpYmN1cmwgd29yayB3aXRoIG5ldyBTU0wgbGlicmFyaWVzLgoKICBIb3BlZnVsbHkgSSBjYW4gbGF0ZXIgb24gZG9jdW1lbnQgdGhlc2UgMTYgZnVuY3Rpb25zIHNvbWV3aGF0IGFzIHdlbGwuCgogIEkgYWxzbyBtYWRlIG1vc3Qgb2YgdGhlIGludGVybmFsIFNTTC1kZXBlbmRlbnQgZnVuY3Rpb25zICh1c2luZyBDdXJsX3NzbF8KICBwcmVmaXgpICNkZWZpbmVkIHRvIG5vdGhpbmcgd2hlbiBubyBTU0wgc3VwcG9ydCBpcyByZXF1ZXN0ZWQgLSBwcmV2aW91c2x5CiAgdGhleSB3b3VsZCB1bm5lY2Vzc2FyaWx5IGNhbGwgbW9zdGx5IGVtcHR5IGZ1bmN0aW9ucy4KCiAgSSd2ZSBidWlsdCBsaWJjdXJsIHdpdGggT3BlblNTTCBhbmQgR251VExTIGFuZCB3aXRob3V0IFNTTCB0byB0ZXN0IHRoaXMgYW5kCiAgSSd2ZSBhbHNvIHRyaWVkIGJ1aWxkaW5nIHdpdGggTlNTIGJ1dCB0aGUgTlNTIHN1cHBvcnQgaXMgYSBteXN0ZXJ5IHRvIG1lIGFuZAogIEkgZmFpbGVkIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUgTlNTIGxpYnJhcmllcyBJIGhhdmUgaW5zdGFsbGVkLiBXZSByZWFsbHkKICBzaG91bGQgQSkgaW1wcm92ZSBvdXIgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdW5zdWl0YWJsZSBOU1MgdmVyc2lvbnMKICBhbHJlYWR5IGF0IGNvbmZpZ3VyZSB0aW1lIGFuZCBCKSBkb2N1bWVudCBvdXIgcmVxdWlyZW1lbnRzIGJldHRlciBmb3IgdGhlCiAgU1NMIGxpYnJhcmllcy4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSnVuIDIwMDgpCi0gSSBtYWRlIHRoZSBPcGVuU1NMIGNvZGUgYnVpbGQgYWdhaW4gd2l0aCBPcGVuU1NMIDAuOS42LiBUaGUgQ1JMRklMRQogIGZ1bmN0aW9uYWxpdHkga2lsbGVkIGl0IGR1ZSB0byBpdHMgdW5jb25kaXRpb25hbCB1c2Ugb2YKICBYNTA5X1NUT1JFX3NldF9mbGFncy4uLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1biAyMDA4KQotIER1ZSB0byB0aGUgdGhyZWUgbmV3IGxpYmN1cmwgY2hhbmdlcyBhbmQgdGhlIG1hc3NpdmUgY29tbWFuZCBsaW5lIG9wdGlvbgogIGNoYW5nZSBJIGRlY2lkZWQgd2UnbGwgbWFyayBpdCBieSBidW1waW5nIHRoZSBuZXh0IHJlbGVhc2UgbnVtYmVyIHRvIDcuMTkuMCEKCi0gY3VybCB0aGUgdG9vbCBub3cgZGVhbHMgd2l0aCBpdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgc29tZXdoYXQgZGlmZmVyZW50bHkhCiAgQWxsIGJvb2xlYW4gb3B0aW9ucyAoc3VjaCBhcyAtTywgLUksIC12IGV0YyksIGJvdGggc2hvcnQgYW5kIGxvbmcgdmVyc2lvbnMsCiAgbm93IGFsd2F5cyBzd2l0Y2ggb24vZW5hYmxlIHRoZSBvcHRpb24gbmFtZWQuIFVzaW5nIHRoZSBzYW1lIG9wdGlvbiBtdWx0aXBsZQogIHRpbWVzIHRodXMgbWFrZSBubyBkaWZmZXJlbmNlLiBUbyBzd2l0Y2ggb2ZmIG9uZSBvZiB0aG9zZSBvcHRpb25zLCB5b3UgbmVlZAogIHRvIHVzZSB0aGUgbG9uZyB2ZXJzaW9uIG9mIHRoZSBvcHRpb24gYW5kIHR5cGUgLS1uby1PUFRJT04uIExpa2UgdG8gZGlzYWJsZQogIHZlcmJvc2UgbW9kZSB5b3UgdXNlIC0tbm8tdmVyYm9zZSEKCi0gQWRkZWQgLS1yZW1vdGUtbmFtZS1hbGwgdG8gY3VybCwgd2hpY2ggaWYgdXNlZCBjaGFuZ2VzIHRoZSBkZWZhdWx0IGZvciBhbGwKICBnaXZlbiBVUkxzIHRvIGJlIGRlYWx0IHdpdGggYXMgaWYgLU8gaXMgdXNlZC4gU28gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGF0CiAgZm9yIGEgc3BlY2lmaWMgVVJMIGFmdGVyIC0tcmVtb3RlLW5hbWUtYWxsIGhhcyBiZWVuIHVzZWQsIHlvdSBtdXNlIHVzZSAtbyAtCiAgb3IgLS1uby1yZW1vdGUtbmFtZS4KCkRhbmllbCBTdGVuYmVyZyAoNiBKdW4gMjAwOCkKLSBBeGVsIFRpbGxlcXVpbiBhbmQgQXJuYXVkIEViYWxhcmQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9JU1NVRVJDRVJULCBmb3IKICBPcGVuU1NMLCBOU1MgYW5kIEdudVRMUy1idWlsdCBsaWJjdXJscy4KCi0gQXhlbCBUaWxsZXF1aW4gYW5kIEFybmF1ZCBFYmFsYXJkIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfQ1JMRklMRSwgZm9yCiAgT3BlblNTTCwgTlNTIGFuZCBHbnVUTFMtYnVpbHQgbGliY3VybHMuCgotIEFkZGVkIENVUkxJTkZPX1BSSU1BUllfSVAgYXMgYSBuZXcgaW5mb3JtYXRpb24gcmV0cmlldmFibGUgd2l0aAogIGN1cmxfZWFzeV9nZXRpbmZvLiBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5CiAgdXNlZCBJUCBhZGRyZXNzLiBNb2RpZmllZCB0ZXN0IGNhc2UgNTAwIHRvIGFsc28gdmVyaWZ5IHRoaXMgZmVhdHVyZS4gVGhlCiAgaW1wbGVtZW50aW5nIG9mIHRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IExlbm55IFJhY2hpdHNreSBhdCBOZXVTdGFyLgoKVmVyc2lvbiA3LjE4LjIgKDQgSnVuZSAyMDA4KQoKRGFuaWVsIEZhbmRyaWNoICgzIEp1biAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0ZWxuZXQgZGF0YSB3b3VsZCBiZSBsb3N0IGlmIGFuIEVXT1VMREJMT0NLCiAgY29uZGl0aW9uIHdlcmUgZW5jb3VudGVyZWQuCgpNYXJ0eSBLdWhydCAoMSBKdW4gMjAwOCkKLSBVcGRhdGVkIG1haW4uYyB0byByZXR1cm4gQ1VSTEVfT0sgaWYgUEFSQU1fSEVMUF9SRVFVRVNURUQgd2FzIHJldHVybmVkCiAgZnJvbSBnZXRwYXJhbWV0ZXIgaW5zdGVhZCBvZiBDVVJMRV9GQUlMRURfSU5JVC4gIE5vIHBvaW50IGluIHJldHVybmluZwogIGFuIGVycm9yIGlmIC0taGVscCBvciAtLXZlcnNpb24gd2VyZSByZXF1ZXN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IE1heSAyMDA4KQotIEVtaWwgUm9tYW51cyBmb3VuZCBhIHByb2JsZW0gYW5kIGhlbHBlZCBtZSByZXBlYXQgaXQuIEl0IG9jY3VyZWQgd2hlbiB1c2luZwogIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIEFQSSB3aXRoIEhUVFAgcGlwZWxpbmluZyBlbmFibGVkIGFuZCBjb3VsZCBsZWFkIHRvCiAgdGhlIHBpcGVsaW5lIGJhc2ljYWxseSBzdGFsbGluZyBmb3IgYSB2ZXJ5IGxvbmcgcGVyaW9kIG9mIHRpbWUgdW50aWwgaXQgdG9vawogIG9mZiBhZ2Fpbi4KCi0gSmVmZiBXZWJlciByZXBvcnRlZCBtZW1vcnkgbGVha3Mgd2l0aCBhYm9ydGVkIFNDUCBhbmQgU0ZUUCB0cmFuc2ZlcnMgYW5kCiAgcHJvdmlkZWQgZXhjZWxsZW50IHJlcGVhdCByZWNpcGVzLiBJIGZpeGVkIHRoZSBjYXNlcyBJIG1hbmFnZWQgdG8gcmVwcm9kdWNlCiAgYnV0IEplZmYgc3RpbGwgZ290IHNvbWUgKFNDUCkgcHJvYmxlbXMgZXZlbiBhZnRlciB0aGVzZSBmaXhlczoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDUvMDM0Mi5odG1sCgpEYW5pZWwgU3RlbmJlcmcgKDI2IE1heSAyMDA4KQotIEJ1ZyByZXBvcnQgIzE5NzMzNTIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NzMzNTIpIGlkZW50aWZpZWQKICBob3cgdGhlIEhUVFAgcmVkaXJlY3QgZm9sbG93aW5nIGNvZGUgZGlkbid0IHByb3Blcmx5IGZvbGxvdyB0byBhIG5ldyBVUkwgaWYKICB0aGUgbmV3IHVybCB3YXMgYnV0IGEgcXVlcnkgc3RyaW5nIHN1Y2ggYXMgIkxvY2F0aW9uOiA/bW9vPWZvbyIuIFRlc3QgY2FzZQogIDEwMzEgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzIGZpeC4KCi0gQW5kcmVhcyBGYWVyYmVyIGFuZCBTY290dCBNY0NyZWFyeSBtYWRlIChsaWIpY3VybCBidWlsZCBmb3IgdGhlIEhhaWt1IE9TLgoKWWFuZyBUc2UgKDI2IE1heSAyMDA4KQotIERhdmlkIFJvc2Vuc3RyYXVjaCByZXBvcnRlZCB0aGF0IGhlYWRlciBmaWxlcyBzcG5lZ29oZWxwLmggYW5kCiAgb3BlbnNzbC9vYmplY3RzLmggd2VyZSBuZWVkZWQgdG8gY29tcGlsZSBTUE5FR08gc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoMjIgTWF5IDIwMDgpCi0gTWFkZSBzdXJlIHRvIHBhc3MgbG9uZ3MgaW4gdG8gY3VybF9lYXN5X3NldG9wdCB3aGVyZSBuZWNlc3NhcnkgaW4gdGhlCiAgZXhhbXBsZSBwcm9ncmFtcyBhbmQgbGlidGVzdCBjb2RlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBNYXkgMjAwOCkKLSBXaGVuIHRyeWluZyB0byByZXBlYXQgYSBtdWx0aSBpbnRlcmZhY2UgcHJvYmxlbSBJIGZlbGwgb3ZlciBhIGZldyBtdWx0aQogIGludGVyZmFjZSBwcm9ibGVtczoKCiAgbyB3aXRoIHBpcGVsaW5pbmcgZGlzYWJsZWQsIHRoZSBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIFdBSVRETyBidXQKICAgIHJhdGhlciBnbyBzdHJhaWdodCB0byBETwoKICBvIHdlIGhhZCBtdWx0aXBsZSBzdGF0ZXMgZm9yIHdoaWNoIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiByZXR1cm5lZCBubyBzb2NrZXQKICAgIGF0IGFsbCB0byB3YWl0IGZvciwgd2l0aCB0aGUgZWZmZWN0IHRoYXQgbGliY3VybCBjYWxscyB0aGUgc29ja2V0IGNhbGxiYWNrCiAgICAod2hlbiBjdXJsX211bHRpX3NvY2tldCgpIGlzIHVzZWQpIHdpdGggUkVNT1ZFIHByZW1hdHVyZWx5IChhcyBpdCB3b3VsZCBiZQogICAgYWRkZWQgYWdhaW4gd2l0aGluIHZlcnkgc2hvcnRseSkKCiAgbyB3aGVuIGluIERPIGFuZCBET0lORyBzdGF0ZXMsIHRoZSBIVFRQIGFuZCBIVFRQUyBwcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucwogICAgZGlkbid0IHJldHVybiB0aGF0IHRoZSBzb2NrZXQgc2hvdWxkIGJlIHdhaXRlZCBmb3Igd3JpdGluZywgYnV0IGluc3RlYWQgaXQKICAgIHdhcyB0cmVhdGVkIGFzIGlmIG5vIHNvY2tldCB3YXMgbmVlZGluZyBtb25pdG9yaW5nIHNvIGFnYWluIFJFTU9WRSB3YXMKICAgIGNhbGxlZCBwcmVtYXR1cmVseS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWF5IDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlIDU1NiB0aGF0IHVzZXMgY3VybF9lYXN5X3NlbmQoKSBhbmQgY3VybF9lYXN5X3JlY3YoKQoKRGFuaWVsIFN0ZW5iZXJnICg5IE1heSAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9zZW5kKCkgYW5kIGN1cmxfZWFzeV9yZWN2KCkuIFRoZXkgY2FuIGJlIHVzZWQgdG8gc2VuZAogIGFuZCByZWNlaXZlIGRhdGEgb3ZlciBhIGNvbm5lY3Rpb24gcHJldmlvdXNseSBzZXR1cCB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgaXRzIENVUkxPUFRfQ09OTkVDVF9PTkxZIG9wdGlvbi4gVGhlIHNlbmRyZWN2LmMgZXhhbXBsZSB3YXMgYWRkZWQgdG8KICBzaG93IGhvdyB0aGV5IGNhbiBiZSB1c2VkLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDgpCi0gSW50ZXJuYWwgdGltZSBkaWZmZXJlbmNlcyBub3cgdXNlIG1vbm90b25pYyB0aW1lIHNvdXJjZSBpZiBhdmFpbGFibGUuCiAgVGhpcyBhbHNvIGltcGxpZXMgdGhlIHJlbW92YWwgb2YgdGhlIHdpbm1tLmxpYiBkZXBlbmRlbmN5IGZvciBXSU4zMi4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXkgMjAwOCkKLSBTdGVmYW4gS3JhdXNlIHJlcG9ydGVkIGEgYnVzeS1sb29waW5nIGNhc2Ugd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgYW5kIGRvaW5nIENPTk5FQ1QgdG8gYSBwcm94eS4gVGhlIGFwcCB3b3VsZCB0aGVuIGJ1c3ktbG9vcCB1bnRpbCB0aGUgcHJveHkKICBjb21wbGV0ZWQgaXRzIHJlc3BvbnNlLgoKTWljaGFsIE1hcmVrICg5IE1heSAyMDA4KQotIE1ha2UgQ3VybF93cml0ZSBhbmQgaXQncyBjYWxsZWVzIGFjY2VwdCBhIGNvbnN0IHBvaW50ZXIsIGluIHByZXBhcmF0aW9uCiAgb2YgdGV0ZXRlc3QncyBwYXRjaCBmb3IgY3VybF9lYXN5X3NlbmQoKQoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA4KQotIExpYW0gSGVhbHkgZmlsZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICM0ODAwNDQKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQ4MDA0NCkgaWRlbnRpZnlpbmcgYQogIHNlZ2ZhdWx0IHdoZW4gdXNpbmcga3JiNSBmdHAsIGJ1dCB0aGUga3JiNCBjb2RlIGhhZCB0aGUgc2FtZSBwcm9ibGVtLgoKWWFuZyBUc2UgKDcgTWF5IDIwMDgpCi0gQ2hyaXN0b3BoZXIgUGFsb3cgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICB1c2Ugb2YgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBrZXlzIGZvciBpbnRlcm5hbCBzcGxheSB0cmVlcy4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOCkKLSBZdXJpeSBTb3NvdiBwb2ludGVkIG91dCBhIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBjLWFyZXMgd2hlbiB0aGF0IGlzCiAgYnVpbHQgZGVidWctZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMyBNYXkgMjAwOCkKLSBCZW4gVmFuIEhvZiBmaWxlZCBidWcgcmVwb3J0ICMxOTQ1MjQwOiAibGliY3VybCBzb21ldGltZXMgc2VuZHMgYm9keSB0d2ljZQogIHdoZW4gdXNpbmcgQ1VSTF9BVVRIX0FOWSIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NDUyNDApLgogIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHdoZW4gbGliY3VybCByZXdvdW5kIGEgc3RyZWFtIG1lYW50IGZvciB1cGxvYWQgd2hlbiBpdAogIHdvdWxkIHByZXBhcmUgZm9yIGEgc2Vjb25kIHJlcXVlc3QsIGl0IGNvdWxkIGFjY2lkZW50YWxseSBjb250aW51ZSB0aGUKICBzZW5kaW5nIG9mIHRoZSByZXdvdW5kIGRhdGEgb24gdGhlIGZpcnN0IHJlcXVlc3QgaW5zdGVhZCBvZiBvbiB0aGUgc2Vjb25kLgogIEJlbiBhbHNvIHByb3ZpZGVkIHRlc3QgY2FzZSAxMDMwIHRoYXQgdmVyaWZpZXMgdGhpcyBmaXguCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWF5IDIwMDgpCi0gSmVhbi1GcmFuY29pcyBCZXJ0cmFuZCByZXBvcnRlZCBhIGxpYmN1cmwgY3Jhc2ggd2l0aCBDVVJMT1BUX1RDUF9OT0RFTEFZCiAgc2luY2UgbGliY3VybCB1c2VkIGdldHByb3RvYnluYW1lKCkgYW5kIHRoYXQgaXNuJ3QgdGhyZWFkLXNhZmUuIFdlIG5vdwogIHN3aXRjaGVkIHRvIHVzZSBJUFBST1RPX1RDUCB1bmNvbmRpdGlvbmFsbHksIGJ1dCBwZXJoYXBzIHRoZSBwcm9wZXIgZml4IGlzCiAgdG8gZGV0ZWN0IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgdXNlIHRoYXQuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAwMTEuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgxIE1heSAyMDA4KQotIEJhcnQgV2hpdGVsZXkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgbGliY3VybCB3b3JrIHByb3Blcmx5IHdoZW4gYW4gYXBwCiAgdXNlcyB0aGUgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdW5peCBkb21haW4gc29ja2V0CiAgdG8gYSBodHRwIHNlcnZlci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDgpCi0gVG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgbG90cyBvZiBtYWdpYyBzdHVmZiBkb25lIG9uCiAgcmVkaXJlY3Rpb25zIGFuZCB0aHVzIGNhbm5vdCB1c2UgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBlYXNpbHksIHdlIG5vdwogIGludHJvZHVjZSB0aGUgbmV3IENVUkxJTkZPX1JFRElSRUNUX1VSTCBvcHRpb24gdGhhdCBsZXRzIGFwcGxpY2F0aW9ucwogIGV4dHJhY3QgdGhlIFVSTCBsaWJjdXJsIHdvdWxkJ3ZlIHJlZGlyZWN0ZWQgdG8gaWYgaXQgaGFkIGJlZW4gdG9sZCB0by4gVGhpcwogIHRoZW4gZW5hYmxlcyB0aGUgYXBwbGljYXRpb24gdG8gY29udGludWUgdG8gdGhhdCBVUkwgYXMgaXQgdGhpbmtzIGlzCiAgc3VpdGFibGUsIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWltcGxlbWVudCB0aGUgbWFnaWMgb2YgY3JlYXRpbmcgdGhlIG5ldyBVUkwKICBmcm9tIHRoZSBMb2NhdGlvbjogaGVhZGVyIGV0Yy4gVGVzdCAxMDI5IHZlcmlmaWVzIGl0LgoKWWFuZyBUc2UgKDI5IEFwciAyMDA4KQotIEltcHJvdmVkIGVhc3kgaW50ZXJmYWNlIHJlc29sdmluZyB0aW1lb3V0IGhhbmRsaW5nIGluIGMtYXJlcyBlbmFibGVkIGJ1aWxkcwoKRGFuaWVsIEZhbmRyaWNoICgyOCBBcHIgMjAwOCkKLSBBZGRlZCB0ZXN0IDEwMjggdG8gdGVzdCBhbiBIVFRQIHJlZGlyZWN0IHRvIGEgRlRQIFVSTC4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDgpCi0gTm9yYmVydCBGcmVzZSBmaWxlZCBidWcgcmVwb3J0ICMxOTUxNTg4OiAiUHJvYmxlbSB3aXRoIGN1cmxmdHBmcyBhbmQKICBsaWJjdXJsIiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk1MTU4OCkgd2hpY2ggc2VlbXMgdG8gYmUgYW4KICBpZGVudGljYWwgcmVwb3J0IHRvIHdoYXQgRGVuaXMgR29sb3ZhbiByZXBvcnRlZCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wMi8wMTA4Lmh0bWwgVGhlIEZUUCBjb2RlIGRpZG4ndCByZXNldCB0aGUKICB1c2VyL3Bhc3N3b3JkIHBvaW50ZXJzIHByb3Blcmx5IGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0J3ZlIGJlZW4gYSBuZXcKICBzdHJ1Y3QvY2Nvbm5lY3Rpb24gZ2V0dGluZyB1c2VkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAwOCkKLSBSZXZlcnRlZCBiYWNrIHRvIHVzZSBhdXRvbWFrZSAxLjkuNiBpbiB0aGUgbmV4dCByZWxlYXNlIChmcm9tIGF1dG9tYWtlCiAgMS4xMC4xKSBzaW5jZSBpdCAqc3RpbGwqIHN1ZmZlcnMgZnJvbSBTb2xhcmlzLXJlbGF0ZWQgYnVncy4gT3VyIHByZXZpb3VzCiAgYXV0b21ha2UgMS4xMCBwcm9ibGVtIHdhcyByZXBvcnRlZCBpbiBidWcgIzE3MDEzNjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwMTM2MCkgYW5kIHRoaXMgcmVjZW50IHByb2JsZW0gd2FzCiAgYnVnICMxOTQ0ODI1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ0ODI1KS4gSSBoYXZlIG5vdAogIHBlcnNvbmFsbHkgYXBwcm9hY2hlZCB0aGUgYXV0b21ha2UgdGVhbSBhYm91dCBlaXRoZXIgb25lIG9mIHRoZXNlIGJ1dCBJCiAgZmlndXJlIHdlIG5lZWQgYSBTb2xhcmlzIDEwIGd1eSB0byBkbyBpdCEKCllhbmcgVHNlICgyNSBBcHIgMjAwOCkKLSBBZGRlZCAndGltZW91dCcgYW5kICdkZWxheScgYXR0cmlidXRlcyBzdXBwb3J0IGZvciB0aGUgdGVzdCBoYXJuZXNzCiAgPGNvbW1hbmQ+IHN1YnNlY3Rpb24uCgpEYW5pZWwgRmFuZHJpY2ggKDI0IEFwciAyMDA4KQotIE1hZGUgLS1zdGRlcnIgYWJsZSB0byByZWRpcmVjdCBhbGwgc3RkZXJyIG1lc3NhZ2VzLgoKWWFuZyBUc2UgKDIzIEFwciAyMDA4KQotIEltcHJvdmUgc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGVzdCBoYXJuZXNzIHJ1bnRlc3RzLnBsIHNjcmlwdAogIGFuZCB0ZXN0IGhhcm5lc3Mgc2VydmVycyB0byBtaW5pbWl6ZSByaXNrIG9mIGZhbHNlIHRlc3QgZmFpbHVyZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDIyIEFwciAyMDA4KQotIEFkZGVkIHN1cHBvcnQgZm9yIHJ1bm5pbmcgb24gU3ltYmlhbiBPUy4KCkRhbmllbCBGYW5kcmljaCAoMTggQXByIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDI2IGFuZCAxMDI3IHRvIGRvIHNvbWUgcnVkaW1lbnRhcnkgdGVzdHMgb24gdGhlIC0tbWFudWFsCiAgYW5kIC0taGVscCBvcHRpb25zLgoKTWljaGFsIE1hcmVrICgxNCBBcHIgMjAwOCkKLSBhbGxvdyBkaXNhYmxpbmcgdGhlIHR5cGVjaGVja2VyIGJ5IGRlZmluaW5nIENVUkxfRElTQUJMRV9UWVBFQ0hFQ0ssIGFzCiAgZGlzY3Vzc2VkIGluIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wNC8wMjkxLmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMTQgQXByIDIwMDgpCi0gU3RlZmFuIEtyYXVzZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgdGhlIE9wZW5TU0wgaGFuZHNoYWtlIHBoYXNlIHdhc24ndAogIHByb3Blcmx5IGFja25vd2xlZGdpbmcgdGhlIHRpbWVvdXQgdmFsdWVzLCBsaWtlIGlmIHlvdSBwdWxsZWQgdGhlIG5ldHdvcmsKICBwbHVnIGluIHRoZSBtaWRzdCBvZiBpdC4KCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCBhIHNlY29uZCBjYXNlIG9mIG5vdCBjaGVja2luZyB0aGUgbWFsbG9jKCkKICByZXR1cm4gY29kZSBpbiB0aGUgTmVnb3RpYXRlIGNvZGUuCgotIFNhbmRvciBGZWxkaSByZXBvcnRlZCBidWcgIzE5NDIwMjIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk0MjAyMikgcG9pbnRpbmcgb3V0IGEgbWlzdGFrZSBpbiB0aGUKICBsaWIvTWFrZWZpbGUudmNbNjhdIG1ha2VmaWxlcycgcmVsZWFzZS1zc2wtZGxsIHRhcmdldC4KCi0gQnJvY2sgTm9sYW5kIHJlcG9ydGVkIHRoYXQgY3VybCBiZWhhdmVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGljaCBvcmRlcgogIHlvdSB1c2VkIC1pIGFuZCAtSS4KCkRhbmllbCBTdGVuYmVyZyAoMTIgQXByIDIwMDgpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmb3VuZCBhbmQgZml4ZWQgYSBjYXNlIHdoZXJlIG1hbGxvYygpIHdhcyBjYWxsZWQgYnV0CiAgd2FzIG5vdCBjaGVja2VkIGZvciBhIE5VTEwgcmV0dXJuLCBpbiB0aGUgTmVnb3RpYXRlIGNvZGUuCgpEYW5pZWwgRmFuZHJpY2ggKDkgQXByIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDI0ICYgMTAyNSB0byB0ZXN0IGEgc2NlbmFyaW8gc2ltaWxhciB0byB0aGUgb25lIHJlcG9ydGVkCiAgYnkgQmVuIENvbWJlZSB3aGVyZSBsaWJjdXJsIHdvdWxkIHNlbmQgdGhlIHdyb25nIGNvb2tpZSB0byBhIHJlZGlyZWN0ZWQKICBzZXJ2ZXIuICBsaWJjdXJsIHdhcyBkb2luZyB0aGUgcmlnaHQgdGhpbmcgaW4gdGhlc2UgdGVzdCBjYXNlcy4KCk1pY2hhbCBNYXJlayAoNyBBcHIgMjAwOCkKLSBGaXggdGhlIE1JVCAvIEhlaW1kYWwgY2hlY2sgZm9yIGdvb2Q6CiAgRGVmaW5lIEhBVkVfR1NTTUlUIGlmIDxnc3NhcGkve2dzc2FwaS5oLGdzc2FwaV9nZW5lcmljLmgsZ3NzYXBpX2tyYjUuaH0+IGFyZQogIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRlZmluZSBIQVZFX0dTU0hFSU1EQUwgaWYgPGdzc2FwaS5oPiBpcyBhdmFpbGFibGUuCgogIE9ubHkgZGVmaW5lIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIHRvIGdzc19udF9zZXJ2aWNlX25hbWUgaWYKICBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSBpc24ndCBkZWNsYXJlZCBieSB0aGUgZ3NzYXBpIGhlYWRlcnMuIFRoaXMgc2hvdWxkCiAgYXZvaWQgYnJlYWthZ2UgaW4gY2FzZSB3ZSB3cm9uZ2x5IHJlY29nbml6ZSBIZWltZGFsIGFzIE1JVCBhZ2Fpbi4KCkRhbmllbCBTdGVuYmVyZyAoNSBBcHIgMjAwOCkKLSBBbGV4ZXkgU2ltYWsgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgdG8gcmVzZXQgdGhlIG1heCByZWRpcmVjdCBsaW1pdCBwcm9wZXJseQoKLSBCYXNlZCBvbiB0aGUgRGViaWFuIGJ1ZyByZXBvcnQgIzQ3NDIyNCB0aGF0IGNvbXBsYWluZWQgYWJvdXQgdGhlIEZUUCBlcnJvcgogIG1lc3NhZ2Ugd2hlbiBsaWJjdXJsIGRvZXNuJ3QgZ2V0IGEgMjIwIGJhY2sgaW1tZWRpYXRlbHkgb24gY29ubmVjdCwgSSBub3cKICBjaGFuZ2VkIGl0IHRvIGJlIG1vcmUgc3BlY2lmaWMgb24gd2hhdCB0aGUgcHJvYmxlbSBpcy4gQWxzbyB3b3J0aCBub3RpY2luZzoKICB3aGlsZSB0aGUgYnVnIHJlcG9ydCBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlIHRoZSByZXNwb25zZSBpczoKCiAgICA0MjEgVGhlcmUgYXJlIHRvbyBtYW55IGNvbm5lY3RlZCB1c2VycywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcgoKICB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBhbHdheXMgYmUgdGhpcyByZWFkYWJsZSBub3IKICB0aGF0IGl0IGZpdHMgd2l0aGluIGEgcGFydGljdWxhciBib3VuZGFyeSBldGMuCgpEYW5pZWwgRmFuZHJpY2ggKDMgQXByIDIwMDgpCi0gQWRkZWQgdGVzdDYyNyB0byB0ZXN0IFNGVFAgd2l0aCBDVVJMT1BUX05PQk9EWQoKRGFuaWVsIFN0ZW5iZXJnICgzIEFwciAyMDA4KQotIFNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gRkFMU0Ugd2lsbCBub3cgc3dpdGNoIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIHRvCiAgR0VUIHNpbXBseSBiZWNhdXNlIHByZXZpb3VzbHkgd2hlbiB5b3Ugc2V0IENVUkxPUFRfTk9CT0RZIHRvIFRSVUUgZmlyc3QgYW5kCiAgdGhlbiBGQUxTRSB5b3UnZCBlbmQgdXAgaW4gYSBicm9rZW4gc3RhdGUgd2hlcmUgYSBIVFRQIHJlcXVlc3Qgd291bGQgZG8gYQogIEhFQUQgYnkgc3RpbGwgYWN0IGEgbG90IGxpa2UgZm9yIGEgR0VUIGFuZCBoYW5nIHdhaXRpbmcgZm9yIHRoZSBjb250ZW50IGV0Yy4KCi0gU2NvdHQgQmFycmV0dCBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX05PQk9EWSBvdmVyIFNGVFAKCkRhbmllbCBGYW5kcmljaCAoMyBBcHIgMjAwOCkKLSBNYWRlIHN1cmUgdGhhdCBjdXJsX2dsb2JhbF9pbml0IGlzIGNhbGxlZCBpbiBhbGwgdGhlIG11bHRpdGhyZWFkZWQKICBleGFtcGxlIHByb2dyYW1zLgoKTWljaGFsIE1hcmVrICgzMSBNYXIgMjAwOCkKLSBSZW1vdmVkIHRoZSBnZW5lcmF0ZWQgY2EtYnVuZGxlLmggZmlsZS4gVGhlIHZlcmJhdGltIHZhbHVlIG9mICRjYSBhbmQKICAkY2FwYXRoIGlzIGtub3duIHRvIGNvbmZpZ3VyZSwgc28gaXQgY2FuIGJlIGRlZmluZWQgaW4gY29uZmlnLmggaW5zdGVhZC4KCkRhbmllbCBTdGVuYmVyZyAoMzEgTWFyIDIwMDgpCi0gQWRkZWQgQ1VSTEZPUk1fU1RSRUFNIGFzIGEgc3VwcG9ydGVkIG9wdGlvbiB0byBjdXJsX2Zvcm1hZGQoKSB0byBhbGxvdyBhbgogIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgZGF0YSBmb3IgYSBtdWx0aXBhcnQgd2l0aCB0aGUgcmVhZCBjYWxsYmFjay4gTm90ZQogIHRoYXQgdGhlIHNpemUgbmVlZHMgdG8gYmUgcHJvdmlkZWQgd2l0aCBDVVJMRk9STV9DT05URU5UU0xFTkdUSCB3aGVuIHRoZQogIHN0cmVhbSBvcHRpb24gaXMgdXNlZC4gVGhpcyBmZWF0dXJlIGlzIHZlcmlmaWVkIGJ5IHRoZSBuZXcgdGVzdCBjYXNlCiAgNTU0LiBUaGlzIGZlYXR1cmUgd2FzIHNwb25zb3JlZCBieSBYcG9uYXV0LgoKRGFuaWVsIEZhbmRyaWNoICgzMCBNYXIgMjAwOCkKLSBDaGFuZ2VkIHRoZSBtYWtlZmlsZSBzbyB0aGUgZG9jL2V4YW1wbGVzLyBwcm9ncmFtcyBhcmUgbmV2ZXIgYnVpbHQgaW4gYQogIG5vcm1hbCBidWlsZC9pbnN0YWxsIChvbmx5IHdpdGggdGhlICdtYWtlIGNoZWNrJyB0YXJnZXQpLCBzbyB0aGF0IGEKICBidWlsZCBmYWlsdXJlIGluIHRoZSBleGFtcGxlcyBpc24ndCBmYXRhbC4KClZlcnNpb24gNy4xOC4xICgzMCBNYXJjaCAyMDA4KQoKRGFuaWVsIFN0ZW5iZXJnICgyOCBNYXIgMjAwOCkKLSBTdGVwaGVuIENvbGx5ZXIgcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS13aXRoLWxpYnNzaDIgd2l0aG91dCBhIGdpdmVuCiAgcGF0aCBkaWRuJ3Qgd29yayBwcm9wZXJseS4KCkRhbmllbCBTdGVuYmVyZyAoMjcgTWFyIDIwMDgpCi0gQXMgZm91bmQgb3V0IGFuZCByZXBvcnRlZCBieSBEYW4gUGV0aXR0LCBsaWJjdXJsIGRpZG4ndCBzaG93IHByb2dyZXNzL2NhbGwKICB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgZm9yIHRoZSBmaXJzdCAocG90ZW50aWFsbHkgaHVnZSkgcGllY2Ugb2YgYm9keSBkYXRhCiAgc2VudCB0b2dldGhlciB3aXRoIHRoZSBQT1NUIHJlcXVlc3QgaGVhZGVycyBpbiB0aGUgaW5pdGlhbCBzZW5kKCkuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1hciAyMDA4KQotIE1hZGUgc2V0dGluZyB0aGUgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIG9wdGlvbiByZXR1cm4gYSBmYWlsdXJlIGluIGNhc2UKICBsaWJjdXJsIHdhc24ndCBidWlsdCB0byB1c2UgT3BlblNTTCBhcyB0aGF0IGlzIGEgcHJlcmVxdWlzaXRlIGZvciB0aGlzCiAgb3B0aW9uIHRvIGZ1bmN0aW9uIQoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAwOCkKLSBGaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIGEgemVybyBieXRlIFNDUCB0cmFuc2ZlciwgdmVyaWZpZWQgd2l0aCB0ZXN0CiAgY2FzZSA2MTcgKHdoaWNoIHdhcyBhZGRlZCBieSBEYW5pZWwgRmFuZHJpY2ggNSBNYXIgMjAwOCkuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE1hciAyMDA4KQotIEZpeGVkIGEgcHJvYmxlbSB3aGVyZSBjdXJsLWNvbmZpZyAtLXByb3RvY29scyBjb3VsZCBlcnJvbmVvdXNseSBzaG93IExEQVBTCiAgc3VwcG9ydCB3aGVuIGN1cmwgZGlkbid0IGV2ZW4gaGF2ZSByZWd1bGFyIExEQVAgc3VwcG9ydC4gIEl0IGxvb2tzIGxpa2UKICB0aGlzIGNvdWxkIGhhcHBlbiB3aGVuIHRoZSAtLWVuYWJsZS1sZGFwcyBjb25maWd1cmUgc3dpdGNoIGlzIGdpdmVuIGJ1dAogIGNvbmZpZ3VyZSBjb3VsZG4ndCBmaW5kIHRoZSBMREFQIGhlYWRlcnMgb3IgbGlicmFyaWVzLgoKTWljaGFsIE1hcmVrICgyMCBNYXIgMjAwOCkKLSBBZGRlZCAtLXdpdGgtY2EtcGF0aD1ESVJFQ1RPUlkgY29uZmlndXJlIG9wdGlvbiB0byB1c2UgYW4gb3BlblNTTCBDQXBhdGggYnkKICBkZWZhdWx0IGluc3RlYWQgb2YgYSBjYSBidW5kbGUuIFRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWxzbyBsb29rIGZvciBhCiAgY2EgcGF0aCBpZiBubyBjYSBidW5kbGUgaXMgZm91bmQgYW5kIG5vIG9wdGlvbiBnaXZlbi4KCi0gRml4ZWQgZGV0ZWN0aW9uIG9mIHByZXZpb3VzbHkgaW5zdGFsbGVkIGN1cmwtY2EtYnVuZGxlLmNydAoKRGFuaWVsIEZhbmRyaWNoICgxOCBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0IDYyNiB0byByZXByb2R1Y2UgYW4gaW5maW5pdGUgbG9vcCB3aGVuIGdpdmVuIGFuIGludmFsaWQKICBTRlRQIHF1b3RlIGNvbW1hbmQgcmVwb3J0ZWQgYnkgVmluY2VudCBMZSBOb3JtYW5kLCBhbmQgZml4ZWQgaXQuCgpNaWNoYWwgTWFyZWsgKDE4IE1hciAyMDA4KQotIEFkZGVkIGN1cmxfZWFzeV9nZXRpbmZvIHR5cGVjaGVja2VyLgoKLSBBZGRlZCBtYWNyb3MgZm9yIGN1cmxfc2hhcmVfc2V0b3B0IGFuZCBjdXJsX211bHRpX3NldG9wdCB0byBjaGVjayBhdCBsZWFzdAogIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEzIE1hciAyMDA4KQotIEFkZGVkIHRlc3RzIDYyMi02MjUgdG8gdGVzdCBTRlRQL1NDUCB1cGxvYWRzLiBUZXN0IDYyNSB3YXMgYW4gYXR0ZW1wdCB0bwogIHJlcHJvZHVjZSB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgcHJvYmxlbSByZXBvcnRlZCBieSBCcmlhbiBVbG0sIGJ1dCB0aGF0CiAgc2VlbXMgdG8gbmVlZCBhIGNhbGwgY3VybF9lYXN5X3Jlc2V0KCkgd2hpY2ggdGhpcyB0ZXN0IGNhc2UgZG9lc24ndCBkby4KCkRhbmllbCBTdGVuYmVyZyAoMTMgTWFyIDIwMDgpCi0gQnJpYW4gVWxtIGZpZ3VyZWQgb3V0IHRoYXQgaWYgeW91IGRpZCBhbiBTRlRQIHVwbG9hZCB3aXRoCiAgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyB0byBjcmVhdGUgYSBkaXJlY3RvcnksIGFuZCB0aGVuIHJlLXVzZWQgdGhlCiAgaGFuZGxlIGFuZCB1cGxvYWRlZCBhbm90aGVyIGZpbGUgdG8gYW5vdGhlciBkaXJlY3RvcnkgdGhhdCBuZWVkZWQgdG8gYmUKICBjcmVhdGVkLCB0aGUgc2Vjb25kIHVwbG9hZCB3b3VsZCBmYWlsLiBBbm90aGVyIGNhc2Ugb2YgYSBzdGF0ZSB2YXJpYWJsZSB0aGF0CiAgd2Fzbid0IHByb3Blcmx5IHJlc2V0IGJldHdlZW4gcmVxdWVzdHMuCgotIEkgcmV3cm90ZSB0aGUgMTAwLWNvbnRpbnVlIGNvZGUgdG8gdXNlIGEgc2luZ2xlIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YKICB0aGUgcHJldmlvdXMgdHdvIG9uZXMuIEkgdGhpbmsgaXQgbWFkZSB0aGUgbG9naWMgc29tZXdoYXQgY2xlYXJlci4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTWFyIDIwMDgpCi0gRG1pdHJ5IFBvcG92IGZpbGVkIGJ1ZyByZXBvcnQgIzE5MTEwNjkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTkxMTA2OSkgdGhhdCBpZGVudGlmaWVkIGEgcmFjZQogIGNvbmRpdGlvbiBpbiB0aGUgbmFtZSByZXNvbHZlciBjb2RlIHdoZW4gdGhlIEROUyBjYWNoZSBpcyBzaGFyZWQgYmV0d2VlbgogIG11bHRpcGxlIGVhc3kgaGFuZGxlcywgZWFjaCBydW5uaW5nIGluIHNpbXVsdGFuZW91cyB0aHJlYWRzIHRoYXQgY291bGQgY2F1c2UKICBjcmFzaGVzLgoKLSBBZGRlZCBhIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCkgdGhhdCBhY2NlcHRzIHRocmVlIGFyZ3VtZW50cyBhbmQgc2ltcGx5CiAgZG9lcyBub3RoaW5nIHdpdGggdGhlbSwganVzdCB0byBtYWtlIHN1cmUgbGliY3VybCB1c2VycyBhbHdheXMgdXNlIHRocmVlCiAgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uIER1ZSB0byBpdHMgdXNlIG9mIC4uLiBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50LCBpdAogIGlzIG90aGVyd2lzZSBoYXJkIHRvIGRldGVjdCBhYnVzZS4KCk1pY2hhbCBNYXJlayAoMTEgTWFyIDIwMDgpCi0gQWRkZWQgYSB0eXBlIGNoZWNraW5nIG1hY3JvIGZvciBjdXJsX2Vhc3lfc2V0b3B0KCksIG5lZWRzIGdjYy00LjMgYW5kIG9ubHkKICB3b3JrcyBpbiBDIG1vZGUgYXRtIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDI2Ny5odG1sICwKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDI5Mi5odG1sICkKCkRhbmllbCBGYW5kcmljaCAoMTAgTWFyIDIwMDgpCi0gQWRkZWQgdGVzdHMgNjE4LTYyMSB0byB0ZXN0IFNGVFAvU0NQIHRyYW5zZmVycyBvZiBtb3JlIHRoYW4gb25lIGZpbGUKICAodGVzdCA2MjAgdGVzdHMgdGhlIGp1c3QtZml4ZWQgcHJvYmxlbSByZXBvcnRlZCBieSBCcmlhbiBVbG0pLgoKRGFuaWVsIFN0ZW5iZXJnICg5IE1hciAyMDA4KQotIEJyaWFuIFVsbSByZXBvcnRlZCBhIGNyYXNoIHdoZW4gZG9pbmcgYSBzZWNvbmQgU0ZUUCB0cmFuc2ZlciBvbiBhIHJlLXVzZWQKICBlYXN5IGhhbmRsZSBpZiBjdXJsX2Vhc3lfcmVzZXQoKSB3YXMgdXNlZCBiZXR3ZWVuIHRoZW0uIEkgZml4ZWQgaXQgYW5kIEJyaWFuCiAgdmVyaWZpZWQgdGhhdCBpdCBjdXJlZCBoaXMgcHJvYmxlbS4KCi0gQnJpYW4gVWxtIHJlcG9ydGVkIHRoYXQgaWYgeW91IGZpcnN0IHRyaWVkIHRvIGRvd25sb2FkIGEgbm9uLWV4aXN0aW5nIFNGVFAKICBmaWxlIGFuZCB0aGVuIGZldGNoZWQgYW4gZXhpc3Rpbmcgb25lIGFuZCByZS11c2VkIHRoZSBoYW5kbGUsIGxpYmN1cmwgd291bGQKICBzdGlsbCByZXBvcnQgdGhlIHNlY29uZCBvbmUgYXMgbm9uLWV4aXN0aW5nIGFzIHdlbGwhIEkgZml4ZWQgaXQgYW5kIEJyaWFuCiAgdmVyaWZpZWQgdGhhdCBpdCBjdXJlZCBoaXMgcHJvYmxlbS4KCk1pY2hhbCBNYXJlayAoNiBNYXIgMjAwOCkKLSBGaXggdGhlIGdzc2FwaSBjb25maWd1cmUgY2hlY2sgdG8gZGV0ZWN0IG5ld2VyIE1JVCBLZXJiZXJvcyAocGF0Y2ggYnkKICBNaWNoYWVsIENhbG1lcikKCllhbmcgVHNlICg2IE1hciAyMDA4KQotIEZpeCByZWdyZXNzaW9uIG9uIEN1cmxfc29ja2V0X3JlYWR5KCkgYW5kIEN1cmxfcG9sbCgpIHNvIHRoYXQgdGhlc2Ugd2lsbAogIGFnYWluIGZhaWwgb24gc2VsZWN0L3BvbGwgZXJyb3JzIGRpZmZlcmVudCB0aGFuIEVJTlRSLgoKRGFuaWVsIEZhbmRyaWNoICg1IE1hciAyMDA4KQotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gaXQgd2lsbCB3cml0ZSBvdXQgemVyby1sZW5ndGggZGF0YSBmaWxlcy4KCi0gQWRkZWQgdGVzdHMgNjE2IGFuZCA2MTcgdG8gc2VlIGhvdyBTRlRQIGFuZCBTQ1AgY29wZSB3aXRoIHplcm8tbGVuZ3RoCiAgZmlsZXMsIGFzIHF1ZXN0aW9uZWQgYnkgTWlrZSBQcm90dHMuIFNGVFAgZG9lcyBmb3IgbWUgYnV0IFNDUCBkb2Vzbid0CiAgc28gdGVzdCA2MTcgaXMgZGlzYWJsZWQgZm9yIG5vdy4KCkRhbmllbCBTICg0IE1hciAyMDA4KQotIE1pa2UgUHJvdHRzIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHJlc3VtZWQgdHJhbnNmZXJzIHdvcmsgd2l0aCBTRlRQLgoKRGFuaWVsIFMgKDEgTWFyIDIwMDgpCi0gQW5hdG9saSBUdWJtYW4gZm91bmQgYW5kIGZpeGVkIGEgY3Jhc2ggd2l0aCBOZWdvdGlhdGUgYXV0aGVudGljYXRpb24gdXNlZCBvbgogIGEgcmUtdXNlZCBjb25uZWN0aW9uIHdoZXJlIGJvdGggcmVxdWVzdHMgdXNlZCBOZWdvdGlhdGUuCgpHdWVudGVyIEtuYXVmICgyNiBGZWIgMjAwOCkKLSBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCB0byBzdXBwb3J0IHNlcnZlciBuYW1lIGluZGljYXRpb24gKFJGQyA0MzY2KS4KCkRhbmllbCBTICgyNSBGZWIgMjAwOCkKLSBLYXNwYXIgQnJhbmQgbWFkZSBHbnVUTFMtYnVpbHQgbGliY3VybCBwcm9wZXJseSBhY2tub3dsZWRnZSB0aGUgb3B0aW9uIHRoYXQKICBmb3JjZXMgaXQgdG8gcHJlZmVyIFNTTHYzLgoKRGFuaWVsIFMgKDIzIEZlYiAyMDA4KQotIFNhbSBMaXN0b3BhZCBwcm92aWRlZCBhIHBhdGNoIGluIGZlYXR1cmUtcmVxdWVzdCAjMTkwMDAxNAogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL2ZlYXR1cmUuY2dpP2lkPTE5MDAwMTQgdGhhdCBtYWtlcyBsaWJjdXJsIChidWlsdCB0bwogIHVzZSBPcGVuU1NMKSBzdXBwb3J0IGEgZnVsbCBjaGFpbiBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBnaXZlbiBQS0NTMTIKICBjZXJ0aWZpY2F0ZS4KCkRhbmllbCBTICgyMiBGZWIgMjAwOCkKLSBHZW9yZyBMaXBwaXRzY2ggbWFkZSB0aGUgc3JjL01ha2VmaWxlLnZjNiBtYWtlZmlsZSB1c2UgdGhlIHNhbWUgbWVtb3J5IG1vZGVsCiAgb3B0aW9ucyBhcyB0aGUgbGliL01ha2VmaWxlLnZjNiBhbHJlYWR5IGRpZC4KCkRhbmllbCBTICgyMSBGZWIgMjAwOCkKLSBabWV5IFBldHJvZmYgZm91bmQgYSBjcmFzaCB3aGVuIGxpYmN1cmwgYWNjZXNzZWQgYSBOVUxMIHBvaW50ZXIsIHdoaWNoCiAgaGFwcGVuZWQgaWYgeW91IHNldCB0aGUgY29ubmVjdGlvbiBjYWNoZSBzaXplIHRvIDEgYW5kIGZvciBleGFtcGxlIGZhaWxlZCB0bwogIGxvZ2luIHRvIGFuIEZUUCBzaXRlLiBCdWcgcmVwb3J0ICMxODk2Njk4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4OTY2OTgpCgpEYW5pZWwgUyAoMjAgRmViIDIwMDgpCi0gRml4ZWQgdGVzdCBjYXNlIDQwNSB0byBub3QgZmFpbCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHbnVUTFMKCi0gQmFzZWQgb24gaW5pdGlhbCB3b3JrIGRvbmUgYnkgR2F1dGFtIEthY2hyb28gdG8gYWRkcmVzcyBhIGJ1Zywgd2Ugbm93IGtlZXAKICBiZXR0ZXIgY29udHJvbCBhdCB0aGUgZXhhY3Qgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24ncyBTU0wgc3RhdHVzIHNvIHRoYXQgd2UKICBrbm93IGV4YWN0bHkgd2hlbiBpdCBoYXMgY29tcGxldGVkIHRoZSBTU0wgbmVnb3RpYXRpb24gb3Igbm90IHNvIHRoYXQgdGhlcmUKICB3b24ndCBiZSBhY2NpZGVudGFsIHJlLXVzZXMgb2YgY29ubmVjdGlvbnMgdGhhdCBhcmUgd3JvbmdseSBiZWxpZXZlZCB0byBiZQogIGluIFNTTC1jb21wbGV0ZWQtbmVnb3RpYXRlIHN0YXRlLgoKLSBXZSBubyBsb25nZXIgc3VwcG9ydCBzZXR0aW5nIHRoZSBDVVJMT1BUX1VSTCBvcHRpb24gZnJvbSBpbnNpZGUgYSBjYWxsYmFjawogIHN1Y2ggYXMgdGhlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiBvbmUgdHJlYXQgdGhhdCBhcyBpZiBpdCB3YXMgYSBMb2NhdGlvbjoKICBmb2xsb3dpbmcuIFRoZSBwYXRjaCB0aGF0IGludHJvZHVjZWQgdGhpcyBmZWF0dXJlIHdhcyBkb25lIGZvciA3LjExLjAsIGJ1dAogIHRoaXMgY29kZSBhbmQgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBicm9rZW4gc2luY2UgYWJvdXQgNy4xNS40IChNYXJjaCAyMDA2KQogIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBub24tYmxvY2tpbmcgT3BlblNTTCAiY29ubmVjdHMiLgoKICBJdCB3YXMgYSBoYWNrIHRvIGJlZ2luIHdpdGggYW5kIHNpbmNlIGl0IGRvZXNuJ3Qgd29yayBhbmQgaGFzbid0IHdvcmtlZAogIGNvcnJlY3RseSBmb3IgYSBsb25nIHRpbWUgYW5kIG5vYm9keSBoYXMgZXZlbiBub3RpY2VkLCBJIGNvbnNpZGVyIGl0IGEgdmVyeQogIHN1aXRhYmxlIHN1YmplY3QgZm9yIHBsYWluIHJlbW92YWwuIEFuZCBzbyBpdCB3YXMgZG9uZS4KCkd1ZW50ZXIgS25hdWYgKDE5IEZlYiAyMDA4KQotIFdlIGRvIG5vIGxvbmdlciBzdXBwb3J0IFNTTHYyIGJ5IGRlZmF1bHQgc2luY2UgaXQgaGFzIGtub3duIGZsYXdzLgogIEthc3BhciBCcmFuZCBwcm92aWRlZCBhIHBhdGNoIGZvciBhbGwgc3VwcG9ydGVkIFNTTCB0b29sa2l0cy4KCkRhbmllbCBGYW5kcmljaCAoMTkgRmViIDIwMDgpCi0gQWRkZWQgdGVzdDMwOSB0byB0ZXN0IEhUVFAgcmVkaXJlY3QgdG8gSFRUUFMgVVJMCgpEYW5pZWwgUyAoMTggRmViIDIwMDgpCi0gV2UncmUgbm8gbG9uZ2VyIHByb3ZpZGluZyBhIHZlcnkgb2xkIGNhLWJ1bmRsZSBpbiB0aGUgY3VybCB0YXJiYWxsLiBZb3UgY2FuCiAgZ2V0IGEgZnJlc2ggb25lIGRvd25sb2FkZWQgYW5kIGNyZWF0ZWQgd2l0aCAnbWFrZSBjYS1idW5kbGUnIG9yIHlvdSBjYW4gZ2V0CiAgb25lIGZyb20gaGVyZSA9PiBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY2FleHRyYWN0Lmh0bWwgaWYgeW91IHdhbnQgYSBmcmVzaAogIG5ldyBvbmUgZXh0cmFjdGVkIGZyb20gTW96aWxsYSdzIHJlY2VudCBsaXN0IG9mIGNhIGNlcnRzLgoKICBUaGUgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtY2EtYnVuZGxlIG5vdyBsZXRzIHlvdSBzcGVjaWZ5IHdoYXQgZmlsZSB0byB1c2UKICBhcyBkZWZhdWx0IGNhIGJ1bmRsZSBmb3IgeW91ciBidWlsZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGNoZWNrIGEgZmV3IGtub3duIHN0YW5kYXJkIHBsYWNlcyBmb3IgYSBnbG9iYWwgY2EgY2VydCB0byB1c2UuCgpEYW5pZWwgUyAoMTcgRmViIDIwMDgpCi0gSmVyb21lIE11ZmZhdC1NZXJpZG9sIGhlbHBlZCBtZSBmaXggQ3VybF9kb25lKCkgdG8gY2xvc2UgdGhlIGN1cnJlbnQKICBjb25uZWN0aW9uIGJ5IGZvcmNlIHdoZW4gaXQgd2FzIGNhbGxlZCBiZWZvcmUgdGhlIGVudGlyZSByZXF1ZXN0IGlzCiAgY29tcGxldGVkLCBzaW1wbHkgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBjb25uZWN0aW9uIHJlYWxseSBjYW4gYmUKICByZS11c2VkIHNhZmVseSBhdCB0aGF0IHBvaW50LgoKLSBCYXNlZCBvbiB0aGUgc2FtZSBkZWJ1Z2dpbmcgbG9naWMsIEkndmUgYWxzbyBtYWRlIEN1cmxfaHR0cF9kb25lKCkgbm90CiAgcmV0dXJuIENVUkxFX0dPVF9OT1RISU5HIGlmIGNhbGxlZCAicHJlbWF0dXJlbHkiLiBUaGlzIHNob3VsZCBoYXZlIG5vIHJlYWwKICBlZmZlY3QgdG8gYW55dGhpbmcgYnV0IHRoZSBjb2RlIG1ha2VzIG1vcmUgc2Vuc2UgbGlrZSB0aGlzLgoKRGFuaWVsIFMgKDE1IEZlYiAyMDA4KQotIE1hZGUgdGhlIGdudXRscyBjb2RlIHBhdGggbm90IGV2ZW4gdHJ5IHRvIGdldCB0aGUgc2VydmVyIGNlcnQgaWYgbm8gcGVlcgogIHZlcmlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQuIFByZXZpb3VzbHkgaXQgd291bGQgZXZlbiByZXR1cm4gZmFpbHVyZSBpZiBnbnV0bHMKICBmYWlsZWQgdG8gZ2V0IHRoZSBzZXJ2ZXIgY2VydCBldmVuIHRob3VnaCBubyB2ZXJpZmljYXRpb24gd2FzIGFza2VkIGZvci4KICBQdWJsaWMgc2VydmVyIHNob3dpbmcgdGhlIHByb2JsZW06IGh0dHBzOi8vd3d3Lm5ldDIyMi5jYWlzc2UtZXBhcmduZS5mcgoKLSBGaXggbXkgQ3VybF90aW1lbGVmdCgpIGxlZnRvdmVyIG1pc3Rha2UgaW4gdGhlIGdudXRscyBjb2RlCgotIFBvb3lhbiBNY1Nwb3JyYW4gZm91bmQgYW5kIGZpeGVkIGEgZmxhdyB3aGVyZSB5b3UgZmlyc3Qgd291bGQgZG8gYSBub3JtYWwKICBodHRwIHJlcXVlc3QgYW5kIHRoZW4geW91J2QgcmV1c2UgdGhlIGhhbmRsZSBhbmQgcmVwbGFjZSB0aGUgQWNjZXB0OiBoZWFkZXIsCiAgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIHNlbmQgdHdvIEFjY2VwdDogaGVhZGVycyEKCkRhbmllbCBTICgxMSBGZWIgMjAwOCkKLSBZYW5nIFRzZSBwb2ludGVkIG91dCBhIGZldyByZW1haW5pbmcgcXVpcmtzIGZyb20gbXkgdGltZW91dCByZWZhY3RvcmluZyBmcm9tCiAgRmViIDcgdGhhdCBkaWRuJ3QgYWJvcnQgcHJvcGVybHkgb24gdGltZW91dHMuIFRoZXNlIGFyZSBhY3R1YWxseSBvbGQKICBwcm9ibGVtcyBidXQgbm93IHRoZXkgc2hvdWxkIGJlIGZpeGVkLgoKWWFuZyBUc2UgKDEwIEZlYiAyMDA4KQotIEJ1ZyByZXBvcnQgIzE4ODg5MzIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4ODg5MzIpIHBvaW50cyBvdXQKICBhbmQgcHJvdmlkZXMgdGVzdCBwcm9ncmFtIHRoYXQgZGVtb25zdHJhdGVzIHRoYXQgbGliY3VybCBtaWdodCBub3Qgc2V0IGVycm9yCiAgZGVzY3JpcHRpb24gbWVzc2FnZSBmb3IgZXJyb3IgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgZm9yIFdpbmRvd3MgdGhyZWFkZWQKICBuYW1lIHJlc29sdmVyIGJ1aWxkcy4gRml4ZWQgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg4IEZlYiAyMDA4KQotIEFkZGVkIGtleSB3b3JkcyB0byBhbGwgU1NMLXVzaW5nIHRlc3RzIHNvIHRoZXkgY2FuIGJlIHNraXBwZWQgaWYgbmVjZXNzYXJ5LgogIFJlbW92ZWQgYSBmZXcgdW5uZWNlc3NhcnkgcmVxdWlyZXMgU1NMIHN0YXRlbWVudHMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBNaWtlIEhvbW1leSBmaWxlZCBhbmQgZml4ZWQgYnVnIHJlcG9ydCAjMTg4OTg1NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODg5ODU2KTogV2hlbiB1c2luZyB0aGUgZ251dGxzIHNzbAogIGxheWVyLCBjbGVhbmluZy11cCBhbmQgcmVpbml0aWFsaXppbmcgY3VybCBlbmRzIHVwIHdpdGggaHR0cHMgcmVxdWVzdHMKICBmYWlsaW5nIHdpdGggIkFTTjEgcGFyc2VyOiBFbGVtZW50IHdhcyBub3QgZm91bmQiIGVycm9ycy4gT2J2aW91c2x5IGEKICByZWdyZXNzaW9uIGFkZGVkIGluIDcuMTYuMy4KCllhbmcgVHNlICg4IEZlYiAyMDA4KQotIEltcHJvdmVkIHRlc3QgaGFybmVzcyBTQ1AvU0ZUUCBzdGFydCB1cCBzZXJ2ZXIgdmVyaWZpY2F0aW9uLCBkb2luZyBhIHJlYWwKICBjb25uZWN0aW9uIHRvIHRoZSBzZnRwIHNlcnZlciwgYXV0aGVudGljYXRpbmcgYW5kIHJ1bm5pbmcgYSBzaW1wbGUgc2Z0cAogIHB3ZCBjb21tYW5kIHVzaW5nIHRoZSB0ZXN0IGhhcm5lc3MgZ2VuZXJhdGVkIGNvbmZpZ3VyYXRpb24gYW5kIGtleSBmaWxlcy4KCkRhbmllbCBTICg4IEZlYiAyMDA4KQotIEf8bnRlciBLbmF1ZiBhZGRlZCBsaWIvbWstY2EtYnVuZGxlLnBsIHdoaWNoIGdldHMgdGhlIEZpcmVmb3ggY2EgYnVuZGxlIGFuZAogIGNyZWF0ZXMgYSBzdWl0YWJsZSBjYS1idW5kbGUuY3J0IGZpbGUgaW4gUEVNIGZvcm1hdCBmb3IgdXNlIHdpdGggY3VybC4gVGhlCiAgcmVjb21tZW5kZWQgd2F5IHRvIHJ1biBpdCBpcyB0byB1c2UgJ21ha2UgY2EtYnVuZGxlJyBpbiB0aGUgYnVpbGQgdHJlZSByb290LgoKRGFuaWVsIEZhbmRyaWNoICg3IEZlYiAyMDA4KQotIEFkZGVkIHRlc3RzIDEwMjIgYW5kIDEwMjMgdG8gdmFsaWRhdGUgb3V0cHV0IG9mIGN1cmwtY29uZmlnIC0tdmVyc2lvbiBhbmQKICAtLXZlcm51bQoKRGFuaWVsIFMgKDcgRmViIDIwMDgpCi0gUmVmYWN0b3JlZCBhIGxvdCBvZiB0aW1lb3V0IGNvZGUgaW50byBhIGZldyBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBtYWtlCiAgdGhlbSBhbGwgdXNlIHRoZSBzYW1lIChob3BlZnVsbHkgY29ycmVjdCkgbG9naWMgdG8gbWFrZSBpdCBsZXNzIGVycm9yLXByb25lCiAgYW5kIGVhc2llciB0byBpbnRyb2R1Y2UgbGlicmFyeS13aWRlIHdoZXJlIGl0IHNob3VsZCBiZSB1c2VkLgoKWWFuZyBUc2UgKDYgRmViIDIwMDgpCi0gRml4IGFuIGlzc3VlIGluIHN0cmR1cCByZXBsYWNlbWVudCBmdW5jdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBhYnNvbHV0ZWx5CiAgaHVnZSBzdHJpbmdzLiBPbmx5IHN5c3RlbXMgd2l0aG91dCBhIHN0YW5kYXJkIHN0cmR1cCB3b3VsZCBiZSBhZmZlY3RlZC4KCkRhbmllbCBTICgzIEZlYiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gY2xlYW5lZCB1cCB0aGUgcGlwZWxpbmluZyBjb2RlIGFuZCByZW1vdmVkIHRoZSBuZWVkIGZvciBhbmQKICB1c2Ugb2YgdGhlICJpc19pbl9waXBlbGluZSIgc3RydWN0IGZpZWxkLgoKLSBJIHdyb3RlIHVwIGFuZCBhZGRlZCB0aGUgdGhyZWFkZWQtc3NsLmMgZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IHNob3dzIGhvdwogIHRvIGRvIG11bHRpLXRocmVhZGVkIGRvd25sb2FkcyBvZiBIVFRQUyBmaWxlcyB3aXRoIGEgbGliY3VybCB0aGF0IGlzIGJ1aWx0CiAgd2l0aCBPcGVuU1NMLiBJdCB1c2VzIHB0aHJlYWRzIGZvciB0aGUgdGhyZWFkaW5nLgoKRGFuaWVsIFMgKDMxIEphbiAyMDA4KQotIE5pa2xhcyBBbmdlYnJhbmQgbWFkZSB0aGUgY29va2llIHN1cHBvcnQgaW4gbGliY3VybCBwcm9wZXJseSBkZWFsIHdpdGggdGhlCiAgIkh0dHBPbmx5IiBmZWF0dXJlIGludHJvZHVjZWQgYnkgTWljcm9zb2Z0IGFuZCBhcHBhcmVudGx5IGFsc28gc3VwcG9ydGVkIGJ5CiAgRmlyZWZveDogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzMzA0Ni5hc3B4IC4gSHR0cE9ubHkKICBpcyBub3cgc3VwcG9ydGVkIHdoZW4gcmVjZWl2ZWQgZnJvbSBzZXJ2ZXJzIGluIEhUVFAgaGVhZGVycywgd2hlbiB3cml0dGVuIHRvCiAgY29va2llIGphcnMgYW5kIHdoZW4gcmVhZCBmcm9tIGV4aXN0aW5nIGNvb2tpZSBqYXJzLgoKICBJIG1vZGlmaWVkIHRlc3QgY2FzZSAzMSBhbmQgNDYgdG8gYWxzbyBkbyBzb21lIGJhc2ljIEh0dHBPbmx5IHRlc3RpbmcuCgotIERtaXRyeSBLdXJvY2hraW4gbW92ZWQgc2V2ZXJhbCBzdHJ1Y3QgZmllbGRzIGZyb20gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCB0bwogIHRoZSBTaW5nbGVSZXF1ZXN0IG9uZSB0byBtYWtlIHBpcGVsaW5pbmcgYmV0dGVyLiBJdCBpcyBhIGJpdCB0cmlja3kgdG8ga2VlcAogIHRoZW0gaW4gdGhlIHJpZ2h0IHBsYWNlLCB0byBrZWVwIHRoaW5ncyByZWxhdGVkIHRvIHRoZSBhY3R1YWwgcmVxdWVzdCBvciB0bwogIHRoZSBhY3R1YWwgY29ubmVjdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuCgpEYW5pZWwgUyAoMjkgSmFuIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiBmaXhlZCBDdXJsX2RvbmUoKSBmb3IgcGlwZWxpbmluZywgYXMgaXQgY291bGQgcHJldmlvdXNseQogIGNyYXNoIQoKLSBNaWNoYWwgTWFyZWsgZml4ZWQgbWlub3IgbWlzdGFrZSBpbiB0ZXN0IGNhc2UgNTUzIHRoYXQgcHJldmVudGVkIGl0IGZyb20KICB3b3JraW5nIG9uIG90aGVyIElQLWFkZHJlc3NlcyBvciBwb3J0IG51bWJlcnMuCgpWZXJzaW9uIDcuMTguMCAoMjggSmFudWFyeSAyMDA4KQoKRGFuaWVsIFMgKDI3IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW46IEluICJyZWFsIHdvcmxkIiB0ZXN0aW5nIEkgZm91bmQgbW9yZSBidWdzIGluCiAgcGlwZWxpbmluZy4gQnJva2VuIGNvbm5lY3Rpb24gaXMgbm90IHJlc3RvcmVkIGFuZCB3ZSBnZXQgaW50byBpbmZpbml0ZQogIGxvb3AuIEl0IGhhcHBlbnMgYmVjYXVzZSBvZiB3cm9uZyBpc19pbl9waXBlbGluZSB2YWx1ZXMuCgpEYW5pZWwgUyAoMjYgSmFuIDIwMDgpCi0gS2V2aW4gUmVlZCBmaWxlZCBidWcgcmVwb3J0ICMxODc5Mzc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NzkzNzUpIHdoaWNoIGRlc2NyaWJlcyBob3cgbGliY3VybAogIGdvdCBsb3N0IGluIHRoaXMgc2NlbmFyaW86IHByb3h5IHR1bm5lbCAob3IgSFRUUFMgb3ZlciBwcm94eSksIGFzayB0byBkbyBhbnkKICBwcm94eSBhdXRoZW50aWNhdGlvbiBhbmQgdGhlIHByb3h5IHJlcGxpZXMgd2l0aCBhbiBhdXRoIChsaWtlIE5UTE0pIGFuZCB0aGVuCiAgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFmdGVyIHRoYXQgaW5pdGlhbCBpbmZvcm1hdGlvbmFsIHJlc3BvbnNlLgoKICBsaWJjdXJsIHdvdWxkIG5vdCBwcm9wZXJseSByZS1pbml0aWFsaXplIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBhbmQKICBjb250aW51ZSB0aGUgYXV0aCBuZWdvdGlhdGlvbiBsaWtlIHN1cHBvc2VkLiBJdCBkb2VzIG5vdyBob3dldmVyLCBhcyBpdCB3aWxsCiAgbm93IGRldGVjdCBpZiBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHdlcmUgYXZhaWxhYmxlIGFuZCBhc2tlZAogIGZvciwgYW5kIHdpbGwgdGh1cyByZXRyeSB0aGUgY29ubmVjdGlvbiBhbmQgY29udGludWUgZnJvbSB0aGVyZS4KCi0gSSBtYWRlIHRoZSBwcm9ncmVzcyBjYWxsYmFjayBnZXQgY2FsbGVkIHByb3Blcmx5IGR1cmluZyBwcm94eSBDT05ORUNULgoKRGFuaWVsIFMgKDIzIEphbiAyMDA4KQotIElnb3IgRnJhbmNodWsgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0NPT0tJRUxJU1Qgc2V0IHRvICJBTEwiIGxlYWtlZAogIG1lbW9yeSwgYW5kIHNvIGRpZCAiU0VTUyIuIEZpeGVkIG5vdy4KCllhbmcgVHNlICgyMiBKYW4gMjAwOCkKLSBDaGVjayBwb2xsLmggYXQgY29uZmlndXJhdGlvbiB0aW1lLCBhbmQgdXNlIGl0IHdoZW4gc3lzL3BvbGwuaCB1bmF2YWlsYWJsZQoKRGFuaWVsIFMgKDIyIEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gcmVtb3ZlZCB0aGUgY2FuY2VsbGVkIHN0YXRlIGZvciBwaXBlbGluaW5nLCBhcyB3ZSBhZ3JlZWQKICB0aGF0IGl0IGlzIGJhZCBhbnl3YXkuIFN0YXJ0aW5nIG5vdywgcmVtb3ZpbmcgYSBoYW5kbGUgdGhhdCBpcyBpbiB1c2VkIGluIGEKICBwaXBlbGluZSB3aWxsIGJyZWFrIHRoZSBwaXBlbGluZSAtIGl0J2xsIGJlIHNldCBiYWNrIHVwIGFnYWluIGJ1dCBzdGlsbC4uLgoKWWFuZyBUc2UgKDIxIEphbiAyMDA4KQotIERpc2FibGUgbGRhcCBzdXBwb3J0IGZvciBjeWd3aW4gYnVpbGRzLCBzaW5jZSBpdCBicmVha3Mgd2hvbGUgYnVpbGQgcHJvY2Vzcy4KICBGaXhpbmcgaXQgd2lsbCBhZmZlY3Qgb3RoZXIgcGxhdGZvcm1zLCBzbyBpdCBpcyBwb3N0cG9uZWQgZm9yIGFub3RoZXIgcmVsZWFzZS4KCkRhbmllbCBTICgxOCBKYW4gMjAwOCkKLSBMYXUgSGFuZyBLaW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBkb2luZwogIENPTk5FQ1Qgb3ZlciBhIHByb3h5LiBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJlcG9ydCBiYWNrIHRoZSBzb2NrZXQKICBwcm9wZXJseSBkdXJpbmcgdGhhdCBzdGF0ZSwgZHVlIHRvIGEgbWlzc2luZyBjYXNlIGluIHRoZSBzd2l0Y2ggaW4gdGhlCiAgbXVsdGlfZ2V0c29jaygpIGZ1bmN0aW9uLgoKWWFuZyBUc2UgKDE3IEphbiAyMDA4KQotIERvbid0IGFib3J0IHRlc3RzIDUxOCBhbmQgNTM3IHdoZW4gdW5hYmxlIHRvIHJhaXNlIHRoZSBvcGVuLWZpbGUgc29mdCBsaW1pdC4KCkRhbmllbCBTICgxNiBKYW4gMjAwOCkKLSBOYXRoYW4gQ291bHRlcidzIHBhdGNoIHRoYXQgbWFrZXMgcnVudGVzdHMucGwgcmVzcGVjdCB0aGUgUEFUSCB3aGVuIGZpZ3VyaW5nCiAgb3V0IHdoYXQgdmFsZ3JpbmQgdG8gcnVuLgoKWWFuZyBUc2UgKDE2IEphbiAyMDA4KQotIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dCBvZiBtZW1vcnkgaW4gdGhlIGNvbW1hbmQgbGluZSB0b29sIHRoYXQgYWZlY3RlZAogIGRhdGEgdXJsIGVuY29kZWQgSFRUUCBQT1NUcyB3aGVuIHJlYWRpbmcgaXQgZnJvbSBhIGZpbGUuCgpEYW5pZWwgUyAoMTYgSmFuIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiB3b3JrZWQgYSBsb3Qgb24gaW1wcm92aW5nIHRoZSBIVFRQIFBpcGVsaW5pbmcgc3VwcG9ydCB0aGF0CiAgcHJldmlvdXNseSBoYWQgYSBudW1iZXIgb2YgZmxhd3MsIHBlcmhhcHMgbW9zdCBub3RhYmx5IHdoZW4gYW4gYXBwbGljYXRpb24KICBmaXJlZCB1cCBOIHRyYW5zZmVycyBhdCBvbmNlIGFzIHRoZW4gdGhleSB3b3VsZG4ndCBwaXBlbGluZSBhdCBhbGwgdGhhdAogIG5pY2VseSBhcyBhbnlvbmUgd291bGQgdGhpbmsuLi4gVGVzdCBjYXNlIDUzMCB3YXMgYWxzbyB1cGRhdGVkIHRvIHRha2UgdGhlCiAgaW1wcm92ZWQgZnVuY3Rpb25hbGl0eSBpbnRvIGFjY291bnQuCgotIENhbGxzIHRvIEN1cmxfZmFpbGYoKSBhcmUgbm90IHN1cHBvc2VkIHRvIHByb3ZpZGUgYSB0cmFpbGluZyBuZXdsaW5lIGFzIHRoZQogIGZ1bmN0aW9uIGl0c2VsZiBhZGRzIHRoYXQuIEZpeGVkIG9uIDUwIG9yIHNvbWV0aGluZyBzdHJpbmdzIQoKRGFuaWVsIFMgKDE1IEphbiAyMDA4KQotIEkgbWFkZSB0aGUgdG9ydHVyZSB0ZXN0IG9uIHRlc3QgNTMwIGdvIHRocm91Z2guIFRoaXMgd2FzIGFjdHVhbGx5IGR1ZSB0bwogIHNpbGx5IGNvZGUgbGVmdCBmcm9tIHdoZW4gd2Ugc3dpdGNoZWQgdG8gbGV0IHRoZSBtdWx0aSBoYW5kbGUgImhvbGQiIHRoZSBkbnMKICBjYWNoZSB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuLi4gT2YgY291cnNlIHRoaXMgb25seSB0cmlnZ2VyZWQgd2hlbiBhCiAgY2VydGFpbiBmdW5jdGlvbiBjYWxsIHJldHVybmVkIGVycm9yIGF0IHRoZSBjb3JyZWN0IG1vbWVudC4KCkRhbmllbCBTICgxNCBKYW4gMjAwOCkKLSBKb2UgTWFsaWNraSBmaWxlZCBidWcgcmVwb3J0ICMxODcxMjY5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NzEyNjkpIGFuZCB3ZSBjb3VsZCBmaXggaGlzIGhhbmctCiAgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG9pbmcgYSBsYXJnZSBIVFRQIFBPU1QgcmVxdWVzdCB3aXRoIHRoZQogIHJlc3BvbnNlLWJvZHkgcmVhZCBmcm9tIGEgY2FsbGJhY2suCgpEYW5pZWwgUyAoMTIgSmFuIDIwMDgpCi0gSSByZS1hcnJhbmdlZCB0aGUgY3VybCAtLWhlbHAgb3V0cHV0LiBBbGwgdGhlIG9wdGlvbnMgYXJlIG5vdyBzb3J0ZWQgb24KICB0aGVpciBsb25nIG9wdGlvbiBuYW1lcyBhbmQgYWxsIGRlc2NyaXB0aW9ucyBhcmUgb25lLWxpbmVycy4KCi0gRXJpYyBMYW5kZXMgcHJvdmlkZWQgdGhlIHBhdGNoIChlZGl0ZWQgYnkgbWUpIHRoYXQgaW50cm9kdWNlcyB0aGUKICAtLWtlZXBhbGl2ZS10aW1lIHRvIGN1cmwgdG8gc2V0IHRoZSBrZWVwYWxpdmUgcHJvYmUgaW50ZXJ2YWwuIEkgYWxzbyB0b29rCiAgdGhlIG9wcG9ydHVuaXR5IHRvIHJlbmFtZSB0aGUgcmVjZW50bHkgYWRkZWQgbm8ta2VlcC1hbGl2ZSBvcHRpb24gdG8KICBuby1rZWVwYWxpdmUgdG8ga2VlcCBhIGNvbnNpc3RlbnQgbmFtaW5nIGFuZCB0byBhdm9pZCBnZXR0aW5nIHR3byBkYXNoZXMgaW4KICB0aGVzZSBvcHRpb24gbmFtZXMuIEVyaWMgYWxzbyBwcm92aWRlZCBhbiB1cGRhdGUgdG8gdGhlIG1hbiBwYWdlIGZvciB0aGUgbmV3CiAgb3B0aW9uLgoKRGFuaWVsIFMgKDExIEphbiAyMDA4KQotIERhbmllbCBFZ2dlciBtYWRlIENVUkxPUFRfUkFOR0Ugd29yayBvbiBmaWxlOi8vIFVSTHMgdGhlIHZlcnkgc2FtZSB3YXkgaXQKICBhbHJlYWR5IHdvcmtlZCBmb3IgRlRQOi8vIFVSTHMuCgotIEkgbWFkZSB0aGUgY3VybCB0b29sIHN3aXRjaCBmcm9tIHVzaW5nIENVUkxPUFRfSU9DVExGVU5DVElPTiB0byBub3cgdXNlIHRoZQogIHNwYW5raW5nIG5ldyBDVVJMT1BUX1NFRUtGVU5DVElPTiBzaW1wbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGltcHJvdmVkCiAgcGVyZm9ybWFuY2UgZm9yIHRoZSB1cGxvYWQgcmVzdW1lIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIHVwbG9hZCB0aGUgbGFzdAogIGZldyBieXRlcyBvZiBhIHZlcnkgbGFyZ2UgZmlsZS4gVG8gaW1wbGVtZW50IHRoaXMgZGVjZW50bHksIEkgaGFkIHRvIHN3aXRjaAogIHRoZSBjbGllbnQgY29kZSBmb3IgdXBsb2FkaW5nIGZyb20gZm9wZW4oKS9mcmVhZCgpIHRvIHBsYWluIG9wZW4oKS9yZWFkKCkgc28KICB0aGF0IHdlIGNhbiB1c2UgbHNlZWsoKSB0byBkbyA+MzJiaXQgc2Vla3MgKGFzIGZzZWVrKCkgZG9lc24ndCBhbGxvdyB0aGF0KQogIG9uIHN5c3RlbXMgdGhhdCBvZmZlciBzdXBwb3J0IGZvciB0aGF0LgoKRGFuaWVsIFMgKDEwIEphbiAyMDA4KQotIE1pY2hhbCBNYXJlayBtYWRlIGN1cmwtY29uZmlnIC0tbGlicyBub3QgaW5jbHVkZSAvdXNyL2xpYjY0IGluIHRoZSBvdXRwdXQKICAoaXQgYWxyZWFkeSBiZWZvcmUgc2tpcHBlZCAvdXNyL2xpYikuICAvdXNyL2xpYjY0IGlzIHRoZSBkZWZhdWx0IGxpYnJhcnkKICBkaXJlY3Rvcnkgb24gbWFueSA2NGJpdCBzeXN0ZW1zIGFuZCBpdCdzIHVubGlrZWx5IHRoYXQgYW55b25lIHdvdWxkIHVzZSB0aGUKICBwYXRoIHByaXZhdGVseSBvbiBzeXN0ZW1zIHdoZXJlIGl0J3Mgbm90LgoKLSBHZW9yZyBMaXBwaXRzY2ggYnJvdWdodCBDVVJMT1BUX1NFRUtGVU5DVElPTiBhbmQgQ1VSTE9QVF9TRUVLREFUQSB0byBhbGxvdwogIGxpYmN1cmwgdG8gc2VlayBpbiBhIGdpdmVuIGlucHV0IHN0cmVhbS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdoZW4KICBkb2luZyB1cGxvYWQgcmVzdW1lcyB3aGVuIHRoZXJlJ3MgYWxyZWFkeSBhIGh1Z2UgcGFydCBvZiB0aGUgZmlsZSBwcmVzZW50CiAgcmVtb3RlbHkuIEJlZm9yZSwgYW5kIHN0aWxsIGlmIHRoaXMgY2FsbGJhY2sgaXNuJ3QgdXNlZCwgbGliY3VybCB3aWxsIHJlYWQKICBhbmQgdGhyb3VnaCBhd2F5IHRoZSBlbnRpcmUgZmlsZSB1cCB0byB0aGUgcG9pbnQgdG8gd2hlcmUgdGhlIHJlc3VtaW5nCiAgYmVnaW5zICh3aGljaCBvZiBjb3Vyc2UgY2FuIGJlIGEgc2xvdyBvcGVyZXJhdGlvbiBkZXBlbmRpbmcgb24gZmlsZSBzaXplLAogIEkvTyBiYW5kd2lkdGggYW5kIG1vcmUpLiBUaGlzIG5ldyBmdW5jdGlvbiB3aWxsIGFsc28gYmUgcHJlZmVycmVkIHRvIGdldAogIHVzZWQgaW5zdGVhZCBvZiB0aGUgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGZvciBzZWVraW5nIGJhY2sgaW4gYSBzdHJlYW0gd2hlbgogIGRvaW5nIG11bHRpLXN0YWdlIEhUVFAgYXV0aCB3aXRoIFBPU1QvUFVULgoKLSBOaWtpdGluc2tpdCBEbWl0cml5IGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjgyNTUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg2ODI1NSkgd2l0aCBhIHBhdGNoLiBJdCBpZGVudGlmaWVzCiAgYW5kIGZpeGVzIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgV1dXLUF1dGhlbnRpY2F0ZTogaGVhZGVycyB3aXRoIGFkZGl0aW9uYWwKICBzcGFjZXMgaW4gdGhlIGxpbmUgdGhhdCB0aGUgcGFyc2VyIHdhc24ndCB3cml0dGVuIHRvIGRlYWwgd2l0aC4KCkRhbmllbCBTICg4IEphbiAyMDA4KQotIEludHJvZHVjaW5nIGN1cmxfZWFzeV9wYXVzZSgpIGFuZCBuZXcgbWFnaWMgcmV0dXJuIGNvZGVzIGZvciBib3RoIHRoZSByZWFkCiAgYW5kIHRoZSB3cml0ZSBjYWxsYmFja3MgdGhhdCBub3cgY2FuIG1ha2UgYSBjb25uZWN0aW9uJ3MgcmVhZGluZyBhbmQvb3IKICB3cml0aW5nIGdldCBwYXVzZWQuCgpEYW5pZWwgUyAoNiBKYW4gMjAwOCkKLSBKZWZmIEpvaG5zb24gZmlsZWQgYnVnIHJlcG9ydCAjMTg2MzE3MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODYzMTcxKSB3aGVyZSBoZSBwb2ludGVkIG91dCB0aGF0CiAgbGliY3VybCdzIGRhdGUgcGFyc2VyIGRpZG4ndCBhY2NlcHQgYSArMTMwMCB0aW1lIHpvbmUgd2hpY2ggYWN0dWFsbHkgaXMgdXNlZAogIGZhaXJseSBvZnRlbiAobGlrZSBOZXcgWmVhbGFuZCdzIERhaWxpZ2h0IFNhdmluZ3MgVGltZSksIHNvIEkgbW9kaWZpZWQgdGhlCiAgcGFyc2VyIHRvIG5vdyBhY2NlcHQgdXAgdG8gYW5kIGluY2x1ZGluZyAtMTQwMCB0byArMTQwMC4KCkRhbmllbCBTICg1IEphbiAyMDA4KQotIEJhc2VkIG9uIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvbiBjdXJsLWxpYnJhcnksIEkgcmV2ZXJ0ZWQgeWVzdGVyZGF5J3MgU09DS1M1CiAgY29kZSB0byBpbnN0ZWFkIGludHJvZHVjZSBzdXBwb3J0IGZvciBhIG5ldyBwcm94eSB0eXBlIGNhbGxlZAogIENVUkxQUk9YWV9TT0NLUzVfSE9TVE5BTUUgdGhhdCBpcyB1c2VkIHRvIHNlbmQgdGhlIGhvc3QgbmFtZSB0byB0aGUgcHJveHkKICBpbnN0ZWFkIG9mIElQIGFkZHJlc3MgYW5kIHRoZXJlJ3MgdGh1cyBubyBsb25nZXIgYW55IG5lZWQgZm9yIGEgbmV3CiAgY3VybF9lYXN5X3NldG9wdCgpIG9wdGlvbi4KCiAgVGhlIGRlZmF1bHQgU09DS1M1IHByb3h5IGlzIGFnYWluIGJhY2sgdG8gc2VuZGluZyB0aGUgSVAgYWRkcmVzcyB0byB0aGUKICBwcm94eS4gIFRoZSBuZXcgY3VybCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBlbmFibGluZyBzZW5kaW5nIGhvc3QgbmFtZSB0byBhCiAgU09DS1M1IHByb3h5IGlzIG5vdyAtLXNvY2tzNS1ob3N0bmFtZS4KCkRhbmllbCBTICg0IEphbiAyMDA4KQotIEJhc2VkIG9uIE1heGltIFBlcmVuZXNlbmtvJ3MgcGF0Y2gsIHdlIG5vdyBkbyBTT0NLUzUgb3BlcmF0aW9ucyBhbmQgbGV0IHRoZQogIHByb3h5IGRvIHRoZSBob3N0IG5hbWUgcmVzb2x2aW5nIGFuZCBvbmx5IGlmIC0tc29ja3M1aXAgKG9yCiAgQ1VSTE9QVF9TT0NLUzVfUkVTT0xWRV9MT0NBTCkgaXMgdXNlZCB3ZSByZXNvbHZlIHRoZSBob3N0IG5hbWUgbG9jYWxseSBhbmQKICBwYXNzIG9uIHRoZSBJUCBhZGRyZXNzIG9ubHkgdG8gdGhlIHByb3h5LgoKWWFuZyBUc2UgKDMgSmFuIDIwMDgpCi0gTW9kaWZpZWQgdGVzdCBoYXJuZXNzIHRvIGFsbG93IFNDUCwgU0ZUUCBhbmQgU09DS1M0IHRlc3RzIHRvIHJ1biB3aXRoCiAgT3BlblNTSCAyLjkuOSwgU3VuU1NIIDEuMCBvciBsYXRlciB2ZXJzaW9ucy4gU09DS1M1IHRlc3RzIG5lZWQgT3BlblNTSAogIDMuNywgU3VuU1NIIDEuMCBvciBsYXRlci4KCkRhbmllbCBTICgyIEphbiAyMDA4KQotIEkgZml4ZWQgdHdvIGNhc2VzIG9mIG1pc3NpbmcgcmV0dXJuIGNvZGUgY2hlY2tzIHdoZW4gaGFuZGxpbmcgY2h1bmtlZAogIGRlY29kaW5nIHdoZXJlIGEgd3JpdGUgZXJyb3IgKG9yIGFib3J0IHJldHVybiBmcm9tIGEgY2FsbGJhY2spIGRpZG4ndCBzdG9wCiAgbGliY3VybCdzIHByb2Nlc3NpbmcuCgotIEkgcmVtb3ZlZCB0aGUgc29ja2xlbl90IHVzZSBmcm9tIHRoZSBwdWJsaWMgY3VybC9jdXJsLmggaGVhZGVyIGFuZCBpbnN0ZWFkCiAgbWFkZSBpdCBhbiB1bnNpZ25lZCBpbnQuIFRoZSB0eXBlIHdhcyBvbmx5IHVzZWQgaW4gdGhlIGN1cmxfc29ja2FkZHIgc3RydWN0CiAgZGVmaW5pdGlvbiAob25seSB1c2VkIGJ5IHRoZSBjdXJsX29wZW5zb2NrZXRfY2FsbGJhY2spLiBPbiBhbGwgcGxhdGZvcm1zIEkKICBjb3VsZCBmaW5kIGluZm9ybWF0aW9uIGFib3V0LCBzb2NrbGVuX3QgaXMgMzIgdW5zaWduZWQgYml0cyBsYXJnZSBzbyBJIGRvbid0CiAgdGhpbmsgdGhpcyB3aWxsIGJyZWFrIHRoZSBBUEkgb3IgQUJJLiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIG9mCiAgY291cnNlIGZvciBhbGwgdGhlIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgYSBzb2NrbGVuX3QgZGVmaW5pdGlvbiBpbiB0aGVpcgogIGhlYWRlcnMgdG8gYnVpbGQgZmluZSBhZ2Fpbi4gUHJvdmlkaW5nIG91ciBvd24gY29uZmlndXJlIG1hZ2ljIGFuZCBjdXN0b20KICBkZWZpbml0aW9uIG9mIHNvY2tsZW5fdCBvbiB0aG9zZSBzeXN0ZW1zIHByb3ZlZCB0byB3b3JrIGJ1dCB3YXMgYSBsb3Qgb2YKICBjcnVmdCwgY29kZSBhbmQgZXh0cmEgbWFnaWMgbmVlZGVkIC0gd2hlbiB0aGlzIHZlcnkgc21hbGwgY2hhbmdlIG9mIHR5cGUKICBzZWVtcyBoYXJtbGVzcyBhbmQgc3RpbGwgc29sdmVzIHRoZSBtaXNzaW5nIHNvY2tsZW5fdCBwcm9ibGVtLgoKLSBSaWNoYXJkIEF0dGVyZXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgYWRkZWQgc3VwcG9ydCBmb3IgU09DS1M0YSBwcm94aWVzLAogIHdoaWNoIGlzIGFuIGlub2ZmaWNpYWwgUFJPWFk0IHZhcmlhbnQgdGhhdCBzZW5kcyB0aGUgaG9zdG5hbWUgdG8gdGhlIHByb3h5CiAgaW5zdGVhZCBvZiB0aGUgcmVzb2x2ZWQgYWRkcmVzcyAod2hpY2ggaXMgYWxyZWFkeSBzdXBwb3J0ZWQgYnkgU09DS1M1KS4KICAtLXNvY2tzNGEgaXMgdGhlIGN1cmwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgaXQgYW5kIENVUkxPUFRfUFJPWFlUWVBFIGNhbgogIG5vdyBiZSBzZXQgdG8gQ1VSTFBST1hZX1NPQ0tTNEEgYXMgd2VsbC4KCkRhbmllbCBTICgxIEphbiAyMDA4KQotIE1vaHVuIEJpc3dhcyBwb2ludGVkIG91dCB0aGF0IC0tbGliY3VybCBnZW5lcmF0ZWQgYSBzb3VyY2UgY29kZSB3aXRoIGFuIGludAogIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudC4gV2hpbGUgZml4aW5nIHRoYXQsIEkgYWxzbyB0b29rIGNhcmUKICBhYm91dCBhZGRpbmcgc29tZSBiZXR0ZXIgY29tbWVudHMgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KCkRhbmllbCBTICgyNyBEZWMgMjAwNykKLSBEbWl0cnkgS3Vyb2Noa2luIG1lbnRpb25lZCBhIGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTEyLzAyNTIuaHRtbCkgaW4gZGV0ZWN0X3Byb3h5KCkgd2hpY2gKICBmYWlsZWQgdG8gc2V0IHRoZSBiaXRzLnByb3h5IHZhcmlhYmxlIHByb3Blcmx5IHdoZW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICB0b2xkIGxpYmN1cmwgdG8gdXNlIGEgaHR0cCBwcm94eS4KCkRhbmllbCBTICgyNiBEZWMgMjAwNykKLSBJbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCB0aGUgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxODUwNzMwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NTA3MzApIEkgd3JvdGUgdXAgdGVzdCBjYXNlIDU1Mi4gVGhlCiAgdGVzdCBpcyBkb2luZyBhIDcwSyBQT1NUIHdpdGggYSByZWFkIGNhbGxiYWNrIGFuZCBhbiBpb2N0bCBjYWxsYmFjayBvdmVyIGEKICBwcm94eSByZXF1aXJpbmcgRGlnZXN0IGF1dGguIFRoZSB0ZXN0IGNhc2UgY29kZSBpcyBtb3JlIG9yIGxlc3MgaWRlbnRpY2FsIHRvCiAgdGhlIHRlc3QgcmVjaXBlIGNvZGUgcHJvdmlkZWQgYnkgU3BhY2VuIEphc3NldCAod2hvIHN1Ym1pdHRlZCB0aGUgYnVnCiAgcmVwb3J0KS4KCkRhbmllbCBTICgyNSBEZWMgMjAwNykKLSBHYXJ5IE1heHdlbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTg1NjYyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODU2NjI4KSBhbmQgcHJvdmlkZWQgYSBmaXggZm9yIHRoZQogIChzbWFsbCkgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZS4gSXQgaGFwcGVuZWQgd2hlbiBhCiAgcHJldmlvdXMgZW50cnkgaW4gdGhlIGNhY2hlIHdhcyByZS11c2VkLgoKRGFuaWVsIEZhbmRyaWNoICgxOSBEZWMgMjAwNykKLSBFbnN1cmUgdGhhdCBucm9mZiBkb2Vzbid0IHB1dCBhbnl0aGluZyBidXQgQVNDSUkgY2hhcmFjdGVycyBpbnRvIHRoZQogIC0tbWFudWFsIHRleHQuCgpZYW5nIFRzZSAoMTggRGVjIDIwMDcpCi0gTVNWQyA5LjAgKFZTMjAwOCkgZG9lcyBub3Qgc3VwcG9ydCBXaW5kb3dzIGJ1aWxkIHRhcmdldHMgcHJpb3IgdG8gV2luWFAsCiAgYW5kIG1ha2VzIHdyb25nIGFzdW1wdGlvbnMgb2YgYnVpbGQgdGFyZ2V0IHdoZW4gaXQgaXNuJ3Qgc3BlY2lmaWVkLiBTbywKICBpZiBubyBidWlsZCB0YXJnZXQgaGFzIGJlZW4gZGVmaW5lZCB3ZSB3aWxsIHRhcmdldCBXaW5YUCB3aGVuIGJ1aWxkaW5nCiAgY3VybC9saWJjdXJsIHdpdGggTVNWQyA5LjAgKFZTMjAwOCkuCgotIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA3LTEyLzAwMzkuaHRtbCkgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgYSBmaWxlIHRydW5jYXRpb24gcHJvYmxlbSBvbiBXaW5kb3dzIGJ1aWxkIHRhcmdldHMgdHJpZ2dlcmVkIHdoZW4gcmV0cnlpbmcKICBhIGRvd25sb2FkIHdpdGggY3VybC4KCkRhbmllbCBTICgxNyBEZWMgMjAwNykKLSBNYXRldXN6IExvc2tvdCBwb2ludGVkIG91dCB0aGF0IE1TVkMgOS4wIChWUzIwMDgpIGhhcyB0aGUgcG9sbGZkIHN0cnVjdCBhbmQKICBkZWZpbmVzIGluIHdpbnNvY2syLmggc29tZWhvdyBkaWZmZXJlbnRseSB0aGFuIHByZXZpb3VzIHZlcnNpb25zIGFuZCB0aGF0CiAgY3VybCA3LjE3LjEgd291bGQgZmFpbCB0byBjb21waWxlIG91dCBvZiB0aGUgYm94LgoKRGFuaWVsIFMgKDEzIERlYyAyMDA3KQotIERhdmlkIFdyaWdodCBmaWxlZCBidWcgcmVwb3J0ICMxODQ5NzY0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDk3NjQpIHdpdGggYW4gaW5jbHVkZWQgZml4LiBIZQogIGlkZW50aWZpZWQgYSBwcm9ibGVtIGZvciByZS11c2VkIGNvbm5lY3Rpb25zIHRoYXQgcHJldmlvdXNseSBoYWQgc2VudAogIEV4cGVjdDogMTAwLWNvbnRpbnVlIGFuZCBpbiBzb21lIHNpdHVhdGlvbnMgdGhlIHN1YnNlcXVlbnQgUE9TVCAodGhhdCBkaWRuJ3QKICB1c2UgRXhwZWN0Oikgc3RpbGwgaGFkIHRoZSBpbnRlcm5hbCBmbGFnIHNldCBmb3IgaXRzIHVzZS4gRGF2aWQncyBmaXggKHRoYXQKICBtYWtlcyB0aGUgc2V0dGluZyBvZiB0aGUgZmxhZyBpbiBldmVyeSBzaW5nbGUgcmVxdWVzdCB1bmNvbmRpdGlvbmFsbHkpIGlzCiAgZmluZSBhbmQgaXMgbm93IHVzZWQhCgpEYW5pZWwgUyAoMTIgRGVjIDIwMDcpCi0gR2lsbGVzIEJsYW5jIG1hZGUgdGhlIGN1cmwgdG9vbCBlbmFibGUgU09fS0VFUEFMSVZFIGZvciB0aGUgY29ubmVjdGlvbnMgYW5kCiAgYWRkZWQgdGhlIC0tbm8ta2VlcC1hbGl2ZSBvcHRpb24gdGhhdCBjYW4gZGlzYWJsZSB0aGF0IG9uIGRlbWFuZC4KCkRhbmllbCBTICg5IERlYyAyMDA3KQotIEFuZHJldyBNb2lzZSBmaWxlZCBidWcgcmVwb3J0ICMxODQ3NTAxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDc1MDEpIGFuZCBwb2ludGVkIG91dCBhIG1lbWNweSgpCiAgdGhhdCBzaG91bGQgYmUgbWVtbW92ZSgpIGluIHRoZSBjb252ZXJ0X2xpbmVlbmRzKCkgZnVuY3Rpb24uCgpEYW5pZWwgUyAoOCBEZWMgMjAwNykKLSBSZW5hbWVkIGFsbCBpbnRlcm5hbCBzdGF0aWMgZnVuY3Rpb25zIHRoYXQgaGFkIEN1cmxfIHByZWZpeGVzIHRvIG5vIGxvbmdlcgogIGhhdmUgdGhlbS4gVGhlIEN1cmxfIHByZWZpeCBpcyBleGNsdXNpdmVseSB1c2VkIGZvciBsaWJyYXJ5IGludGVybmFsIGdsb2JhbAogIHN5bWJvbHMuIFN0YXRpYyBmdW5jdGlvbnMgY2FuIGJlIG5hbWVkIGFueXRoaW5nLCBleGNlcHQgZm9yIHVzaW5nIEN1cmxfIG9yCiAgY3VybF8gcHJlZml4ZXMuIFRoaXMgaXMgZm9yIGNvbnNpc3RlbmN5IGFuZCBmb3IgZWFzaWVyIG1haW50YWluYW5jZSBhbmQKICBvdmVydmlldy4KCi0gQ2xlYW5lZCB1cCBhbmQgcmVmb3JtYXR0ZWQgdGhlIFRPRE8gZG9jdW1lbnQgdG8gbG9vayBsaWtlIHRoZSBGQVEgYW5kCiAgQ09OVFJJQlVURSwgd2hpY2ggbWFrZXMgbmljZXIgd2ViIHBhZ2VzCgotIEFkZGVkIHRlc3QgY2FzZXMgNTQ5IGFuZCA1NTAgdGhhdCB0ZXN0IENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERS4KCi0gQWRkZWQga2V5d29yZHMgb24gYSBidW5jaCBvZiB0ZXN0IGNhc2VzCgotIEZpeGVkIGFuIE9PTSBwcm9ibGVtIGluIHRoZSBjdXJsIGNvZGUgdGhhdCB3b3VsZCBsZWFkIHRvIGZjbG9zZSBvbiBhIGJhZAogIGhhbmRsZSBhbmQgY3Jhc2gKCkRhbmllbCBTICg1IERlYyAyMDA3KQotIFNwYWNlbiBKYXNzZXQgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggZG9pbmcgUE9TVCAod2l0aCBkYXRhIHJlYWQgd2l0aCBhCiAgY2FsbGJhY2spIG92ZXIgYSBwcm94eSB3aGVuIE5UTE0gaXMgdXNlZCBhcyBhdXRoIHdpdGggdGhlIHByb3h5LiBUaGUgYnVnCiAgYWxzbyBjb25jZXJuZWQgRGlnZXN0IGFuZCB3YXMgbGltaXRlZCB0byB1c2luZyBjYWxsYmFjayBvbmx5LiBTcGFjZW4gd29ya2VkCiAgd2l0aCB1cyB0byBwcm92aWRlIGEgdXNlZnVsIHBhdGNoLiBJIGFkZGVkIHRoZSB0ZXN0IGNhc2UgNTQ3IGFuZCA1NDggdG8KICB2ZXJpZnkgdHdvIHZhcmlhdGlvbnMgb2YgUE9TVCBvdmVyIHByb3h5IHdpdGggTlRMTS4KCkRhbmllbCBTICgzIERlYyAyMDA3KQotIFJheSBQZWtvd3NraSBmaWxlZCBidWcgcmVwb3J0ICMxODQyMDI5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NDIwMjkpIGluIHdoaWNoIGhlIGlkZW50aWZpZWQgYQogIHByb2JsZW0gd2l0aCBTU0wgc2Vzc2lvbiBjYWNoaW5nIHRoYXQgcHJldmVudCBpdCBmcm9tIHdvcmtpbmcsIGFuZCBwcm92aWRlZAogIHRoZSBhc3NvY2lhdGVkIGZpeCEKCi0gTm93IGxpYmN1cmwgKGJ1aWx0IHdpdGggT3BlblNTTCkgZG9lc24ndCByZXR1cm4gZXJyb3IgYW55bW9yZSBpZiB0aGUgcmVtb3RlCiAgU1NMLWJhc2VkIHNlcnZlciBkb2Vzbid0IHByZXNlbnQgYSBjZXJ0aWZpY2F0ZSB3aGVuIHRoZSByZXF1ZXN0IGlzIHRvbGQgdG8KICBpZ25vcmUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFueXdheS4KCi0gTWljaGFsIE1hcmVrIGludHJvZHVjZWQgQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbAogIHRoZSBhcHBlbmRpbmcgb2YgdGhlICJ0eXBlPSIgdGhpbmcgb24gRlRQIFVSTHMgd2hlbiB0aGV5IGFyZSBwYXNzZWQgdG8gYQogIEhUVFAgcHJveHkuIFNvbWUgcHJveGllcyBqdXN0IGRvbid0IGxpa2UgdGhhdCBhcHBlbmRpbmcgKHdoaWNoIGlzIGRvbmUKICB1bmNvbmRpdGlvbmFsbHkgaW4gNy4xNy4xKSwgYW5kIHNvbWUgcHJveGllcyB0cmVhdCBiaW5hcnkvYXNjaWkgdHJhbnNmZXJzCiAgYmV0dGVyIHdpdGggdGhlIGFwcGVuZGluZyBkb25lIQoKRGFuaWVsIFMgKDI5IE5vdiAyMDA3KQotIEEgYnVnIHJlcG9ydCBvbiB0aGUgY3VybC1saWJyYXJ5IGxpc3Qgc2hvd2VkIGEgSFRUUCBEaWdlc3Qgc2Vzc2lvbiBnb2luZyBvbgogIHdpdGggYSA3MDArIGxldHRlciBub25jZS4gUHJldmlvdXNseSBsaWJjdXJsIG9ubHkgc3VwcG9ydCAxMjcgbGV0dGVyIG9uZXMKICBhbmQgbm93IEkgYnVtcGVkIGl0IHRvIDEwMjMuCgotIEZpeGVkIHRoZSByZXN1bWVkIEZUUCB1cGxvYWQgbG9vcCB0byBub3QgcmVxdWlyZSB0aGF0IHRoZSByZWFkIGNhbGxiYWNrCiAgcmV0dXJucyBhIGZ1bGwgYnVmZmVyIG9uIGVhY2ggaW52b2tlLgoKRGFuaWVsIFMgKDI1IE5vdiAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDE1IHRoYXQgdGVzdHMgLS1kYXRhLXVybGVuY29kZSBpbiBtdWx0aXBsZSB3YXlzCgotIEZpeGVkIC0tZGF0YS11cmxlbmNvZGUgZm9yIHdoZW4gbm8gQCBvciA9IGFyZSB1c2VkCgotIEV4dGVuZGVkIHRoZSB1c2VyLWFnZW50IGJ1ZmZlciBjdXJsIHVzZXMsIHNpbmNlIHdlIGNhbiBoaXQgdGhlIDEyOCBieXRlCiAgYm9yZGVyIHdpdGggcGxlbnR5IGRldmVsb3BtZW50IGxpYnJhcmllcyB1c2VkLiBMaWtlIG15IGN1cnJlbnQgc2V0OiAiY3VybAogIDcuMTcuMi1DVlMgKGk2ODYtcGMtbGludXgtZ251KSBsaWJjdXJsLzcuMTcuMi1DVlMgT3BlblNTTC8wLjkuOGcKICB6bGliLzEuMi4zLjMgYy1hcmVzLzEuNS4yLUNWUyBsaWJpZG4vMS4xIGxpYnNzaDIvMC4xOS4wLUNWUyIKCkRhbmllbCBTICgyNCBOb3YgMjAwNykKLSBJbnRlcm5hbCByZWFycmFuZ2VtZW50cywgc28gdGhhdCB0aGUgcHJldmlvdXMgc3RydWN0IEhhbmRsZURhdGEgaXMgbm8gbW9yZS4KICBJdCBpcyBub3cga25vd24gYXMgU2luZ2xlUmVxdWVzdCBhbmQgdGhlIEN1cmxfdHJhbnNmZXJfa2VlcGVyIHN0cnVjdCB3aXRoaW4KICB0aGF0IHdhcyByZW1vdmUgZW50aXJlbHkuIFRoaXMgaGFzIHRoZSB1cHNpZGUgdGhhdCB0aGVyZSBhcmUgbGVzcyBkdXBsaWNhdGUKICBzdHJ1Y3QgbWVtYmVycyB0aGF0IG1hZGUgaXQgaGFyZCB0byBzZWUgYW5kIHJlbWVtYmVyIHdoYXQgc3RydWN0IHRoYXQgd2FzCiAgdXNlZCB0byBzdG9yZSB3aGF0IGRhdGEuIFRoZSB0cmFuc2Zlcl9rZWVwZXIgdGhpbmcgd2FzIG9uY2Ugc3RvcmVkIG9uIGEKICBwZXItY29ubmVjdGlvbiBiYXNpcyBhbmQgdGhlbiBpdCBtYWRlIHNlbnNlIHRvIGhhdmUgdGhlIGR1cGxpY2F0ZSBpbmZvIGJ1dAogIHNpbmNlIGl0IHdhcyBtb3ZlZCB0byB0aGUgU2Vzc2lvbkhhbmRsZSAoaW4gNy4xNi4wKSBpdCBqdXN0IGFkZGVkIHdlaXJkbmVzcy4KICBUaGUgU2luZ2xlUmVxdWVzdCBzdHJ1Y3QgaXMgdXNlZCBieSBkYXRhIHRoYXQgb25seSBpcyB2YWxpZCBmb3IgdGhpcyBzaW5nbGUKICByZXF1ZXN0LgoKWWFuZyBUc2UgKDIyIE5vdiAyMDA3KQotIFByb3ZpZGUgYSBzb2NrbGVuX3QgZGVmaW5pdGlvbiBpbiBjdXJsLmggZm9yIFdpbjMyIEFQSSBidWlsZCB0YXJnZXRzCiAgd2hpY2ggZG9uJ3QgaGF2ZSBvbmUuCgpEYW5pZWwgUyAoMjIgTm92IDIwMDcpCi0gQWxlc3NhbmRybyBWZXNlbHkgaGVscGVkIG1lIGltcHJvdmUgdGhlIC0tZGF0YS11cmxlbmNvZGUncyBzeW50YXgsIHBhcnNlcgogIGFuZCBkb2N1bWVudGF0aW9uLgoKRGFuaWVsIFMgKDIxIE5vdiAyMDA3KQotIFdoaWxlIGluc3BlY3RpbmcgdGhlIE5lZ290aWF0ZSBjb2RlLCBJIG5vdGljZWQgaG93IHRoZSBwcm94eSBhdXRoIHdhcyB1c2luZwogIHRoZSBzYW1lIHN0YXRlIHN0cnVjdCBhcyB0aGUgaG9zdCBhdXRoLCBzbyBib3RoIGNvdWxkIG5ldmVyIGJlIHVzZWQgYXQgdGhlCiAgc2FtZSB0aW1lISBJIGZpeGVkIGl0ICh3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2spIHRvIHVzZSB0d28gc2VwYXJhdGUKICBzdHJ1Y3RzIHRvIGFsbG93IGF1dGhlbnRpY2F0aW9uIHVzaW5nIE5lZ290aWF0ZSBvbiBob3N0IGFuZCBwcm94eQogIHNpbXVsdGFuZW91c2x5LgoKRGFuaWVsIFMgKDIwIE5vdiAyMDA3KQotIEVtaWwgUm9tYW51cyBwb2ludGVkIG91dCBhIGJ1ZyB0aGF0IG1hZGUgYW4gZWFzeSBoYW5kbGUgZ2V0IHRoZSBjb29raWUKICBlbmdpbmUgYWN0aXZhdGVkIHdoZW4gc2V0IHRvIHVzZSBhIHNoYXJlIChldmVuIGlmIHRoZSBzaGFyZSBkb2Vzbid0IHNoYXJlCiAgY29va2llcykuIEkgZml4ZWQgaXQuCgotIEZpeGVkIGEgdmVyeSBsb25nLWxhc3RpbmcgbXByaW50ZigpIGJ1ZyB0aGF0IG9jY3VycmVkIHdoZW4gd2UgZGlkICIlLipzJXMiLAogIHNpbmNlIHRoZSBzZWNvbmQgJXMgd291bGQgdGhlbiB3cm9uZ2x5IHVzZWQgdGhlIG51bWVyaWNhbCBwcmVjaXNpb24gYXJndW1lbnQKICBpbnN0ZWFkIGFuZCBjcmFzaC4KCi0gSW50cm9kdWNlZCAtLWRhdGEtdXJsZW5jb2RlIHRvIHRoZSBjdXJsIHRvb2wgZm9yIGVhc2llciB1cmwgZW5jb2Rpbmcgb2YgdGhlCiAgZGF0YSBzZW50IGluIGEgcG9zdC4KCkRhbmllbCBTICgxOCBOb3YgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBmaXhlZCBTU0wgY29ubmVjdGlvbnMgd2l0aCBOU1MgZG9uZSB3aXRoIHRoZSBtdWx0aS1pbnRlcmZhY2UKCkRhbmllbCBTICgxNyBOb3YgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSB0aGUgdGVzdCBzdWl0ZSByZW1lbWJlciB3aGF0IHRlc3Qgc2VydmVycyB0aGF0IGZhaWwgdG8KICBzdGFydCBzbyB0aGF0IHN1YnNlcXVlbnQgdHJpZXMgYXJlIHNpbXBseSBza2lwcGVkLgoKLSBBbmRyZXMgR2FyY2lhIG1hZGUgdGhlIGV4YW1wbGVzIGJ1aWxkIGZpbmUgb24gV2luZG93cyAobWluZ3cgKyBtc3lzKSB3aGVuCiAgdGhlIGxpYiB3YXMgYnVpbHQgc3RhdGljbHkuCgpEYW5pZWwgUyAoMTYgTm92IDIwMDcpCi0gQXRlcyBHb3JhbCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBodHRwLmM6YWRkX2J1ZmZlcl9zZW5kKCkgd2hlbiBhIGRlYnVnCiAgY2FsbGJhY2sgd2FzIHVzZWQsIGFzIGl0IGNvdWxkIHdyb25nbHkgcGFzcyBvbiBhIGJhZCBzaXplIGZvciB0aGUgb3V0Z29pbmcKICBIVFRQIGhlYWRlci4gVGhlIGJhZCBzaXplIHdvdWxkIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZSBhcyBpdCB3YXMgYSB3cmFwcGVkCiAgc2l6ZV90IGNvbnRlbnQuIFRoaXMgaGFwcGVuZWQgd2hlbiB0aGUgd2hvbGUgSFRUUCByZXF1ZXN0IGZhaWxlZCB0byBnZXQgc2VudAogIGluIG9uZSBzaW5nbGUgc2VuZC4gIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMS8wMTY1Lmh0bWwKCkRhbmllbCBTICgxNSBOb3YgMjAwNykKLSBGaXhlZCB5ZXQgYW5vdGhlciByZW1haW5pbmcgcHJvYmxlbSB3aXRoIGRvaW5nIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmdzIG9uIGEKICByZS11c2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gTWVudGlvbmVkIGJ5IEltbWFudWVsIEdyZWdvaXJlIG9uIHRoZSBtYWlsaW5nCiAgbGlzdC4KCi0gTWljaGFsIE1hcmVrIGZpeGVkIHRoZSB0ZXN0IHN1aXRlIHRvIGJldHRlciBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlbiB0aGUgSFRUUAogIGlwdjYgc2VydmVyIGNhbid0IHJ1bi4KCllhbmcgVHNlICgxNCBOb3YgMjAwNykKLSBGaXggYSB2YXJpYWJsZSBwb3RlbnRpYWwgd3JhcHBpbmcgaW4gYWRkX2J1ZmZlcigpIHdoZW4gdXNpbmcgYWJzb2x1dGVseQogIGh1Z2Ugc2VuZCBidWZmZXIgc2l6ZXMuCgpEYW5pZWwgUyAoMTMgTm92IDIwMDcpCi0gRml4ZWQgYSByZW1haW5pbmcgcHJvYmxlbSB3aXRoIGRvaW5nIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmdzIG9uIGEgcmUtdXNlZAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gTWVudGlvbmVkIGJ5IEltbWFudWVsIEdyZWdvaXJlIG9uIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgUyAoMTIgTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgzMDYzNyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgzMDYzNyksIHdoaWNoIHdhcwogIGZvcndhcmRlZCBmcm9tIHRoZSBHZW50b28gYnVnIHRyYWNrZXIgYnkgRGFuaWVsIEJsYWNrIGFuZCB3YXMgb3JpZ2luYWxseQogIHN1Ym1pdHRlZCBieSBSb2JpbiBKb2huc29uLCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd291bGQgZG8gYmFkIG1lbW9yeQogIHJlZmVyZW5jZXMgd2hlbiBpdCBmYWlsZWQgYW5kIGJhaWxlZCBvdXQgYmVmb3JlIHRoZSBoYW5kbGVyIHRoaW5nIHdhcwogIHNldHVwLiBNeSBmaXggaXMgbm90IGRvbmUgbGlrZSB0aGUgcHJvdmlkZWQgcGF0Y2ggZG9lcyBpdCwgYnV0IGluc3RlYWQgSQogIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgbmV2ZXIgYW55IGNoYW5jZSBmb3IgYSBOVUxMIHBvaW50ZXIgaW4gdGhhdCBzdHJ1Y3QKICBtZW1iZXIuCgpZYW5nIFRzZSAoMTAgTm92IDIwMDcpCi0gVmlrcmFtIFNheGVuYSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTExLzAwOTYuaHRtbCkgcG9pbnRlZCBvdXQKICB0aGF0IHRoZSBwb2xsZmQgc3RydWN0IHdhcyBiZWluZyBtdWx0aSBkZWZpbmVkIHdoZW4gdXNpbmcgVlMyMDA4LiBUaGlzIGlzCiAgbm93IGZpeGVkIGluIC9jdXJsL2xpYi9zZWxlY3QuaAoKRGFuaWVsIFMgKDggTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyMzQ4NyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgyMzQ4NykgcG9pbnRlZAogIG91dCB0aGF0IFNGVFAgcmVxdWVzdHMgZGlkbid0IHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBOZWl0aGVyIGRpZCBTQ1AKICBvbmVzLiAgSSBnYXZlIHRoZSBTU0ggY29kZSBhIGdvb2QgYmVhdGluZyBhbmQgbm93IGJvdGggU0NQIGFuZCBTRlRQIHNob3VsZAogIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGZpbmUuIEkgYWxzbyBkaWQgYSBidW5jaCBvZiBpbmRlbnQgY2hhbmdlcyBhcwogIHdlbGwgYXMgYSBidWcgZml4IGZvciB0aGUgImtleWJvYXJkIGludGVyYWN0aXZlIiBhdXRoLgoKRGFuIEYgKDYgTm92IDIwMDcpCi0gSW1wcm92ZWQgdGVsbmV0IHN1cHBvcnQgYnkgZHJhc3RpY2FsbHkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiB3cml0ZQogIGNhbGxiYWNrcyBuZWVkZWQgdG8gcGFzcyBhIGJ1ZmZlciB0byB0aGUgdXNlci4gIEluc3RlYWQgb25lIHBlciBieXRlIGl0CiAgaXMgbm93IGFzIGxpdHRsZSBhcyBvbmUgcGVyIHNlZ21lbnQuCgpZYW5nIFRzZSAoNiBOb3YgMjAwNykKLSBCdWcgcmVwb3J0ICMxODI0ODk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODI0ODk0KSBwb2ludGVkCiAgb3V0IGEgcHJvYmxlbSBpbiBjdXJsLmggd2hlbiBidWlsZGluZyBDKysgYXBwcyB3aXRoIE1TVkMuIFRvIGZpeCBpdCwgdGhlCiAgaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlcyBpbiBjdXJsLmggaXMgbW92ZWQgb3V0c2lkZSBvZiB0aGUgQysrIGV4dGVybiAiQyIKICBsaW5rYWdlIGJsb2NrLgoKRGFuaWVsIFMgKDEgTm92IDIwMDcpCi0gVG9ieSBQZXRlcnNvbiBwYXRjaGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gdGhlIGNvbW1hbmQgbGluZSB0b29sIHRoYXQKICBoYXBwZW5lZCB3aGVuIGEgdXNlciBoYWQgYSBob21lIGRpciBhcyBhbiBlbXB0eSBzdHJpbmcuIGN1cmwgd291bGQgdGhlbiBkbwogIGZyZWUoKSBvbiBhIHdyb25nIGFyZWEuCgpEYW4gRiAoMSBOb3YgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIHRvIG5vdCBkaXNwbGF5IGxpYnogd2hlbiBpdCB3YXNuJ3QgdXNlZAogIGR1ZSB0byBhIG1pc3NpbmcgaGVhZGVyIGZpbGUuCgpEYW4gRiAoMzEgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSBvdXRwdXQgb2YgY3VybC1jb25maWcgLS1wcm90b2NvbHMgd2hpY2ggc2hvd2VkIFNDUCBhbmQgU0ZUUAogIGFsd2F5cywgZXhjZXB0IHdoZW4gLS13aXRob3V0LWxpYnNzaDIgd2FzIGdpdmVuCgotIEFkZGVkIHRlc3QgY2FzZXMgMTAxMyBhbmQgMTAxNCB0byBjaGVjayB0aGF0IGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzIGFuZAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgbWF0Y2hlcyB0aGUgb3V0cHV0IG9mIGN1cmwgLS12ZXJzaW9uCgpEYW4gRiAoMzAgT2N0b2JlciAyMDA3KQotIEZpeGVkIGFuIE9PTSBwcm9ibGVtIHdpdGggZmlsZTogVVJMcwoKLSBNb3ZlZCBDdXJsX2ZpbGVfY29ubmVjdCBpbnRvIHRoZSBwcm90b2NvbCBoYW5kbGVyIHN0cnVjdAoKRGFuIEYgKDI5IE9jdG9iZXIgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgNTQ2IHRvIGNoZWNrIHRoYXQgc3Vic2VxdWVudCBGVFAgdHJhbnNmZXJzIHdvcmsgYWZ0ZXIgYQogIGZhaWxlZCBvbmUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQoKRGFuaWVsIFMgKDI5IE9jdG9iZXIgMjAwNykKLSBCYXNlZCBvbiBvbmUgb2YgdGhvc2UgYnVnIHJlcG9ydHMgdGhhdCBhcmUgaW50ZXJjZXB0ZWQgYnkgYSBkaXN0cm8ncyBidWcKICB0cmFja2VyIChodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTMxNjE5MSksIEkgbm93IG1hZGUKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIGFuZCAtLXByb3RvY29scyBzaG93IHRoZSBjb3JyZWN0IG91dHB1dCB3aGVuIGJ1aWx0CiAgd2l0aCBOU1MuCgpWZXJzaW9uIDcuMTcuMSAoMjkgT2N0b2JlciAyMDA3KQoKRGFuIEYgKDI1IE9jdG9iZXIgMjAwNykKLSBBZGRlZCB0aGUgLS1zdGF0aWMtbGlicyBvcHRpb24gdG8gY3VybC1jb25maWcKCkRhbmllbCBTICgyNSBPY3RvYmVyIDIwMDcpCi0gTWFkZSBsaWJjdXJsIGJ1aWx0IHdpdGggTlNTIHBvc3NpYmxlIHRvIGlnbm9yZSB0aGUgcGVlciB2ZXJpZmljYXRpb24uCiAgUHJldmlvdXNseSBpdCB3b3VsZCBmYWlsIGlmIHRoZSBjYSBidW5kbGUgd2Fzbid0IHByZXNlbnQsIGV2ZW4gaWYgdGhlIGNvZGUKICBpZ25vcmVkIHRoZSB2ZXJpZmljYXRpb24gcmVzdWx0cy4KClBhdHJpY2sgTSAoMjUgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRlc3Qgc2VydmVyIHRvIGFsbG93IG51bGwgYnl0ZXMgaW4gYmluYXJ5IHBvc3RzLgpfIEFkZGVkIHRlc3RzIDM1LCA1NDQgJiA1NDUgdG8gY2hlY2sgYmluYXJ5IGRhdGEgcG9zdHMsIGJvdGggc3RhdGljIChpbiBwbGFjZSkKICBhbmQgZHluYW1pYyAoY29waWVkKS4KCkRhbmllbCBTICgyNSBPY3RvYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIGZpeGVkIHRoZSB0ZXN0IHNjcmlwdCB0byBiZSBhYmxlIHRvIHVzZSB2YWxncmluZCBldmVuIHdoZW4gdGhlCiAgbGliIGlzIGJ1aWx0IHNoYXJlZCB3aXRoIGxpYnRvb2wuCgotIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcyB3aGVuIHRoZSBzYW1lIGVhc3kgaGFuZGxlIGlzIHJlLXVzZWQgdG8gcmVxdWVzdAogIFVSTHMgd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2xzLiBGVFAgYW5kIFRGVFAgcmVsYXRlZCBsZWFrcy4gQ2F1Z2h0IHRoYW5rcyB0bwogIERhbiBGJ3MgbmV3IHRlc3QgY2FzZXMuCgpEYW4gRiAoMjQgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSB0ZXN0IEZUUCBhbmQgVEZUUCBzZXJ2ZXJzIHRvIHN1cHBvcnQgdGhlID4xMDAwMCB0ZXN0IG51bWJlcgogIG5vdGF0aW9uCgotIEFkZGVkIHRlc3QgY2FzZXMgMjAwMCB0aHJvdWdoIDIwMDMgd2hpY2ggdGVzdCBtdWx0aXBsZSBwcm90b2NvbHMgdXNpbmcgdGhlCiAgc2FtZSBlYXN5IGhhbmRsZQoKLSBGaXhlZCB0aGUgZmlsZWNoZWNrOiBtYWtlIHRhcmdldCB0byB3b3JrIG91dHNpZGUgdGhlIHNvdXJjZSB0cmVlCgpEYW5pZWwgUyAoMjQgT2N0b2JlciAyMDA3KQotIFZsYWRpbWlyIExhemFyZW5rbyBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCBkbyBzb21lICdtdCcgbWFnaWMgd2hlbgogIGJ1aWxkaW5nIHdpdGggVkM4IHRvIGdldCB0aGUgIm1hbmlmZXN0IiBlbWJlZGRlZCB0byBtYWtlIGZpbmUgc3RhbmQtYWxvbmUKICBiaW5hcmllcy4gVGhlIG1ha2V0Z3ogYW5kIHRoZSBzcmMvTWFrZWZpbGUudmM2IGZpbGVzIHdlcmUgYWRqdXN0ZWQKICBhY2NvcmRpbmdseS4KCkRhbmllbCBTICgyMyBPY3RvYmVyIDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgxMjE5MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxMjE5MCkgcG9pbnRzIG91dAogIHRoYXQgbGliY3VybCB0cmllZCB0byByZS11c2UgY29ubmVjdGlvbnMgYSBiaXQgdG9vIG11Y2ggd2hlbiB1c2luZyBub24tU1NMCiAgcHJvdG9jb2xzIHR1bm5lbGVkIG92ZXIgYSBIVFRQIHByb3h5LgoKRGFuaWVsIFMgKDIyIE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgZm9yd2FyZGVkIHRoZSBidWcgcmVwb3J0CiAgaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD0zMzI5MTcgYWJvdXQgYSBIVFRQIHJlZGlyZWN0IHRvCiAgRlRQIHRoYXQgY2F1c2VkIG1lbW9yeSBoYXZvYy4gSGlzIHdvcmsgdG9nZXRoZXIgd2l0aCBteSBlZmZvcnRzIGNyZWF0ZWQgdHdvCiAgZml4ZXM6CgogICMxIC0gRlRQOjpmaWxlIHdhcyBtb3ZlZCB0byBzdHJ1Y3QgZnRwX2Nvbm4sIGJlY2F1c2UgaXMgaGFzIHRvIGJlIGRlYWx0IHdpdGgKICAgICAgIGF0IGNvbm5lY3Rpb24gY2xlYW51cCwgYXQgd2hpY2ggdGltZSB0aGUgc3RydWN0IEhhbmRsZURhdGEgY291bGQgYmUKICAgICAgIHVzZWQgYnkgYW5vdGhlciBjb25uZWN0aW9uLgogICAgICAgQWxzbywgdGhlIHVudXNlZCBjaGFyICp1cmxwYXRoIG1lbWJlciBpcyByZW1vdmVkIGZyb20gc3RydWN0IEZUUC4KCiAgIzIgLSBwcm92aWRlIGEgQ3VybF9yZXNldF9yZXFwcm90bygpIGZ1bmN0aW9uIHRoYXQgZnJlZXMKICAgICAgIGRhdGEtPnJlcWRhdGEucHJvdG8uKiBvbiBjb25uZWN0aW9uIHNldHVwIGlmIG5lZWRlZCAodGhhdCBpcyBpZiB0aGUKICAgICAgIFNlc3Npb25IYW5kbGUgd2FzIHVzZWQgYnkgYSBkaWZmZXJlbnQgY29ubmVjdGlvbikuCgogIEEgbG9uZy10ZXJtIGdvYWwgaXMgb2YgY291cnNlIHRvIHNvbWVob3cgZ2V0IHJpZCBvZiBob3cgdGhlIHJlcWRhdGEgc3RydWN0CiAgaXMgdXNlZCwgYXMgaXQgaXMgdG9vIGVycm9yLXByb25lLgoKLSBCdWcgcmVwb3J0ICMxODE1NTMwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODE1NTMwKSBwb2ludHMgb3V0CiAgdGhhdCBzcGVjaWZ5aW5nIGEgcHJveHkgd2l0aCBhIHRyYWlsaW5nIHNsYXNoIGRpZG4ndCB3b3JrICh1bmxlc3MgaXQgYWxzbwogIGNvbnRhaW5lZCBhIHBvcnQgbnVtYmVyKS4KClBhdHJpY2sgTSAoMTUgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSBkeW5hbWljIENVUkxPUFRfUE9TVEZJRUxEUyBwcm9ibGVtOiB0aGlzIG9wdGlvbiBpcyBub3cgc3RhdGljIGFnYWluCiAgYW5kIG9wdGlvbiBDVVJMT1BUX0NPUFlQT1NURklFTERTIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgZHluYW1pYyBtb2RlLgoKUGF0cmljayBNICgxMiBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgcGVyLXByb3RvY29sIGNhbGxiYWNrIHN0YXRpYyB0YWJsZXMsIHJlcGxhY2luZyBjYWxsYmFjayBwdHIgc3RvcmFnZQogIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3R1cmUgYnkgYSBzaW5nbGUgaGFuZGxlciB0YWJsZSBwdHIuCgpEYW4gRiAoMTEgT2N0b2JlciAyMDA3KQotIEZpeGVkIHRoZSAtbCBvcHRpb24gb2YgcnVudGVzdHMucGwKCi0gQWRkZWQgc3VwcG9ydCBmb3Igc2tpcHBpbmcgdGVzdHMgYmFzZWQgb24ga2V5IHdvcmRzLgoKRGFuaWVsIFMgKDkgT2N0b2JlciAyMDA3KQotIE1pY2hhbCBNYXJlayByZW1vdmVkIHRoZSBubyBsb25nZXIgZXhpc3RpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlIGN1cmwuMQogIG1hbiBwYWdlLgoKRGFuaWVsIFMgKDcgT2N0b2JlciAyMDA3KQotIEtub3duIGJ1ZyAjNDcsIHdoaWNoIGNvbmZ1c2VkIGxpYmN1cmwgaWYgZG9pbmcgTlRMTSBhdXRoIG92ZXIgYSBwcm94eSB3aXRoCiAgYSByZXNwb25zZSB0aGF0IHdhcyBsYXJnZXIgdGhhbiAxNktCIGlzIG5vdyBpbXByb3ZlZCBzbGlnaHRseSBzbyB0aGF0IG5vdwogIHRoZSByZXN0cmljdGlvbiBhdCAxNktCIGlzIGZvciB0aGUgaGVhZGVycyBvbmx5IGFuZCBpdCBzaG91bGQgYmUgYSByYXJlCiAgc2l0dWF0aW9uIHdoZXJlIHRoZSByZXNwb25zZS1oZWFkZXJzIGV4Y2VlZCAxNktCLiBUaHVzLCBJIGNvbnNpZGVyICM0NyBmaXhlZAogIGFuZCB0aGUgaGVhZGVyIGxpbWl0YXRpb24gaXMgbm93IGtub3duIGFzIGtub3duIGJ1ZyAjNDguCgpEYW5pZWwgUyAoNSBPY3RvYmVyIDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIG1hZGUgdGhlIENVTFJPUFRfQ09PS0lFTElTVCBvcHRpb24gc3VwcG9ydCBhIG5ldyBtYWdpYwogIHN0cmluZzogIkZMVVNIIi4gVXNpbmcgdGhhdCB3aWxsIGNhdXNlIGxpYmN1cmwgdG8gZmx1c2ggaXRzIGNvb2tpZXMgdG8gdGhlCiAgQ1VSTE9QVF9DT09LSUVKQVIgZmlsZS4KCi0gVGhlIG5ldyBmaWxlIGRvY3MvbGliY3VybC9BQkkgZGVzY3JpYmVzIGhvdyB3ZSB2aWV3IEFCSSBicmVha2FnZXMsIHNvbmFtZQogIGJ1bXBzIGFuZCB3aGF0IHRoZSB2ZXJzaW9uIG51bWJlcidzIHNpZ25pZmljYW5jZSB0byBhbGwgdGhhdCBpcy4KCkRhbmllbCBTICg0IE9jdG9iZXIgMjAwNykKLSBJIGVuYWJsZWQgdGVzdCAxMDA5IGFuZCBtYWRlIHRoZSAtLWxvY2FsLXBvcnQgdXNlIGEgd2lkZSByYW5nZSB0byByZWR1Y2UgdGhlCiAgcmlzayBvZiBmYWlsdXJlcy4KCi0gS2ltIFJpbm5ld2l0eiByZXBvcnRlZCB0aGF0IC0tbG9jYWwtcG9ydCBkaWRuJ3Qgd29yayB3aXRoIFRGVFAgdHJhbnNmZXJzLgogIFRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdGZ0cCBjb2RlIGFsd2F5cyB1bmNvbmRpb25hbGx5IGRpZCBhIGJpbmQoKQogIHdpdGhvdXQgY2FyaW5nIGlmIG9uZSBhbHJlYWR5IGhhZCBiZWVuIGRvbmUgYW5kIHRoZW4gaXQgZmFpbGVkLiBJIHdyb3RlIGEKICB0ZXN0IGNhc2UgKDEwMDkpIHRvIHZlcmlmeSB0aGlzLCBidXQgaXQgaXMgYSBiaXQgZXJyb3ItcHJvbmUgc2luY2UgaXQgd2lsbAogIGhhdmUgdG8gcGljayBhIGZpeGVkIGxvY2FsIHBvcnQgbnVtYmVyIGFuZCBzaW5jZSB0aGUgdGVzdHMgYXJlIHJ1biBvbiBzbwogIG1hbnkgZGlmZmVyZW50IGhvc3RzIGluIGRpZmZlcmVudCBzaXR1YXRpb25zIEknbGwgYWRkIGl0IGluIGRpc2FibGVkIHN0YXRlLgoKWWFuZyBUc2UgKDMgT2N0b2JlciAyMDA3KQotIEZpeGVkIGlzc3VlIHJlbGF0ZWQgd2l0aCB0aGUgdXNlIG9mIGFyZXNfdGltZW91dCgpIHJlc3VsdC4KCkRhbmllbCBTICgzIE9jdG9iZXIgMjAwNykKLSBBbGV4ZXkgUGVzdGVybmlrb3YgaW50cm9kdWNlZCBDVVJMT1BUX09QRU5TT0NLRVRGVU5DVElPTiBhbmQKICBDVVJMT1BUX09QRU5TT0NLRVREQVRBIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvCiAgcmVwbGFjZSB0aGUgc29ja2V0KCkgY2FsbCB1c2VkIGJ5IGxpYmN1cmwuIEl0IGJhc2ljYWxseSBhbGxvd3MgdGhlIGFwcCB0bwogIGNoYW5nZSBhZGRyZXNzLCBwcm90b2NvbCBvciB3aGF0ZXZlciBvZiB0aGUgc29ja2V0LgoKLSBJIHJlbmFtZWQgdGhlIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGVycm9yIGNvZGUgdG8KICBDVVJMRV9QRUVSX0ZBSUxFRF9WRVJJRklDQVRJT04gKHN0YW5kYXJkIENVUkxfTk9fT0xESUVTIHN0eWxlKSwgYW5kIG1hZGUKICB0aGlzIHJldHVybiBjb2RlIGdldCB1c2VkIGJ5IHRoZSBwcmV2aW91cyBTU0ggTUQ1IGZpbmdlcnByaW50IGNoZWNrIGluIGNhc2UKICBpdCBmYWlscy4KCi0gQmFzZWQgb24gYSBwYXRjaCBicm91Z2h0IGJ5IEpvaG5ueSBMdW9uZywgbGliY3VybCBub3cgb2ZmZXJzCiAgQ1VSTE9QVF9TU0hfSE9TVF9QVUJMSUNfS0VZX01ENSBhbmQgdGhlIGN1cmwgdG9vbCAtLWhvc3RwdWJtZDUuIFRoZXkgYm90aAogIG1ha2UgdGhlIFNDUCBvciBTRlRQIGNvbm5lY3Rpb24gdmVyaWZ5IHRoZSByZW1vdGUgaG9zdCdzIG1kNSBjaGVja3N1bSBvZiB0aGUKICBwdWJsaWMga2V5IGJlZm9yZSBkb2luZyBhIGNvbm5lY3QsIHRvIHJlZHVjZSB0aGUgcmlzayBvZiBhIG1hbi1pbi10aGUtbWlkZGxlCiAgYXR0YWNrLgoKRGFuaWVsIFMgKDIgT2N0b2JlciAyMDA3KQotIGxpYmN1cmwgbm93IGhhbmRsZXMgY2h1bmtlZC1lbmNvZGVkIENPTk5FQ1QgcmVzcG9uc2VzCgpEYW5pZWwgUyAoMSBPY3RvYmVyIDIwMDcpCi0gQWxleCBGaXNobWFuIHJlcG9ydGVkIGEgY3VybF9lYXN5X2VzY2FwZSgpIHByb2JsZW0gdGhhdCB3YXMgbWFkZSB0aGUKICBmdW5jdGlvbiBkbyB3cm9uZyBvbiBhbGwgaW5wdXQgYnl0ZXMgdGhhdCBhcmUgPj0gMHg4MCAoZGVjaW1hbCAxMjgpIGR1ZSB0byBhCiAgc2lnbmVkIC8gdW5zaWduZWQgbWlzdGFrZSBpbiB0aGUgY29kZS4gSSBmaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDU0MyB0bwogIHZlcmlmeS4KCkRhbmllbCBTICgyOSBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBmaXhlZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IHRyYW5zZmVycyBvdmVyIFNGVFAuCgpEYW5pZWwgUyAoMjggU2VwdGVtYmVyIDIwMDcpCi0gQWRhcHRlZCB0aGUgYy1hcmVzIGNvZGUgdG8gdGhlIEFQSSBjaGFuZ2UgYy1hcmVzIDEuNS4wIGJyaW5ncyBpbiB0aGUKICBub3RpZmllciBjYWxsYmFjayhzKS4KCkRhbiBGICgyNiBTZXB0ZW1iZXIgMjAwNykKLSBFbmFibGVkIGEgZmV3IG1vcmUgZ2NjIHdhcm5pbmdzIHdpdGggLS1lbmFibGUtZGVidWcuICBSZW5hbWVkIGEgZmV3CiAgdmFyaWFibGVzIHRvIGF2b2lkIHNoYWRvd2luZyBnbG9iYWwgZGVjbGFyYXRpb25zLgoKRGFuaWVsIFMgKDI2IFNlcHRlbWJlciAyMDA3KQotIFBoaWxpcCBMYW5nZGFsZSBwcm92aWRlZCB0aGUgbmV3IENVUkxPUFRfUE9TVDMwMSBvcHRpb24gZm9yCiAgY3VybF9lYXN5X3NldG9wdCgpIHRoYXQgYWx0ZXJzIGhvdyBsaWJjdXJsIGZ1bmN0aW9ucyB3aGVuIGZvbGxvd2luZwogIHJlZGlyZWN0cy4gSXQgbWFrZXMgbGliY3VybCBvYmV5IHRoZSBSRkMyNjE2IHdoZW4gYSAzMDEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKICBhZnRlciBhIG5vbi1HRVQgcmVxdWVzdCBpcyBtYWRlLiBEZWZhdWx0IGxpYmN1cmwgYmVoYXZpb3VyIGlzIHRvIGNoYW5nZQogIG1ldGhvZCB0byBHRVQgaW4gdGhlIHN1YnNlcXVlbnQgcmVxdWVzdCAobGlrZSBpdCBkb2VzIGZvciByZXNwb25zZSBjb2RlIDMwMgogIC0gYmVjYXVzZSB0aGF0J3Mgd2hhdCBtYW55L21vc3QgYnJvd3NlcnMgZG8pLCBidXQgd2l0aCB0aGlzIENVUkxPUFRfUE9TVDMwMQogIG9wdGlvbiBlbmFibGVkIGl0IHdpbGwgZG8gd2hhdCB0aGUgc3BlYyBzYXlzIGFuZCBkbyB0aGUgbmV4dCByZXF1ZXN0IHVzaW5nCiAgdGhlIHNhbWUgbWV0aG9kIGFnYWluLiBJLmUga2VlcCBQT1NUIGFmdGVyIDMwMS4KCiAgVGhlIGN1cmwgdG9vbCBnb3QgdGhpcyBvcHRpb24gYXMgLS1wb3N0MzAxCgogIFRlc3QgY2FzZSAxMDExIGFuZCAxMDEyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5LgoKLSBNYXggS2F0c2V2IHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIGxpYmN1cmwgRlRQIHJlcXVlc3Qgd2l0aAogIENVUkxPUFRfTk9CT0RZIGVuYWJsZWQgYnV0IG5vdCBDVVJMT1BUX0hFQURFUiwgbGliY3VybCB3b3VsZG4ndCBkbyBUWVBFCiAgYmVmb3JlIGl0IGRvZXMgU0laRSB3aGljaCBtYWtlcyBpdCBsZXNzIHVzZWZ1bC4gSSB3YWxrZWQgb3ZlciB0aGUgY29kZSBhbmQKICBtYWRlIGl0IGRvIHRoaXMgcHJvcGVybHksIGFuZCBhZGRlZCB0ZXN0IGNhc2UgNTQyIHRvIHZlcmlmeSBpdC4KCkRhbmllbCBTICgyNCBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBmaXhlZCBLTk9XTl9CVUdTICM0NDogLS1mdHAtbWV0aG9kIG5vY3dkIGRpZCBub3QgaGFuZGxlCiAgVVJMcyBlbmRpbmcgd2l0aCBhIHNsYXNoIHByb3Blcmx5IChpdCBzaG91bGQgbGlzdCB0aGUgY29udGVudHMgb2YgdGhhdAogIGRpcmVjdG9yeSkuIFRlc3QgY2FzZSAzNTEgYnJvdWdodCBiYWNrIGFuZCBhbHNvIHRlc3QgMTAxMCB3YXMgYWRkZWQuCgpEYW5pZWwgUyAoMjEgU2VwdGVtYmVyIDIwMDcpCi0gTWFyayBEYXZpZXMgZml4ZWQgTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIG92ZXIgcHJveHksIGFuZCBhbHNvIGludHJvZHVjZWQKICB0aGUgLS1wcm94eS1uZWdvdGlhdGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBhbGxvdyBhIHVzZXIgdG8gZXhwbGljaXRseQogIHNlbGVjdCBpdC4KCkRhbmllbCBTICgxOSBTZXB0ZW1iZXIgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBwcm92aWRlZCBhbiBOU1MgdXBkYXRlIHdpdGggdGhlIGZvbGxvd2luZyBoaWdobGlnaHRzOgoKICBvIEl0IGxvb2tzIGZvciB0aGUgTlNTIGRhdGFiYXNlIGZpcnN0IGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBTU0xfRElSLAogICAgdGhlbiBpbiAvZXRjL3BraS9uc3NkYiwgdGhlbiBpdCBpbml0aWFsaXplcyB3aXRoIG5vIGRhdGFiYXNlIGlmIG5laXRoZXIgb2YKICAgIHRob3NlIGV4aXN0LgoKICBvIElmIHRoZSBOU1MgUEtDUyMxMSBsaWJuc3BzZW0uc28gZHJpdmVyIGlzIGF2YWlsYWJsZSB0aGVuIFBFTSBmaWxlcyBtYXkgYmUKICAgIGxvYWRlZCwgaW5jbHVkaW5nIHRoZSBjYS1idW5kbGUuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiBvbmx5CiAgICBjZXJ0aWZpY2F0ZXMgYWxyZWFkeSBpbiB0aGUgTlNTIGRhdGFiYXNlIGFyZSB1c2VkLgoKICBvIFRyaWVzIHRvIGRldGVjdCB3aGV0aGVyIGEgZmlsZSBvciBuaWNrbmFtZSBpcyBiZWluZyBwYXNzZWQgaW4gc28gdGhlIHJpZ2h0CiAgICB0aGluZyBpcyBkb25lCgogIG8gQWRkZWQgYSBiaXQgb2YgY29kZSB0byBtYWtlIHRoZSBvdXRwdXQgbW9yZSBsaWtlIHRoZSBPcGVuU1NMIG1vZHVsZSwKICAgIGluY2x1ZGluZyBkaXNwbGF5aW5nIHRoZSBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbiB3aGVuIGNvbm5lY3RpbmcgaW4KICAgIHZlcmJvc2UgbW9kZQoKICBvIEltcHJvdmVkIGhhbmRsaW5nIG9mIGNlcnRpZmljYXRlIGVycm9ycyAoZXhwaXJlZCwgdW50cnVzdGVkLCBldGMpCgogIFRoZSBsaWJuc3NwZW0uc28gUEtDUyMxMSBtb2R1bGUgaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGluIEZlZG9yYQogIDgvcmF3aGlkZS4gV29yayB3aWxsIGJlIGRvbmUgc29vbiB0byB1cHN0cmVhbSBpdC4gVGhlIE5TUyBtb2R1bGUgd2lsbCB3b3JrCiAgd2l0aCBvciB3aXRob3V0IGl0LCBhbGwgdGhhdCBjaGFuZ2VzIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGNlcnRpZmljYXRlcyBhbmQKICBrZXlzLgoKRGFuaWVsIFMgKDE4IFNlcHRlbWJlciAyMDA3KQotIEltbWFudWVsIEdyZWdvaXJlIHBvaW50ZWQgb3V0IHRoYXQgcHVibGljIGtleSBTU0ggYXV0aCBmYWlsZWQgaWYgbm8KICBwdWJsaWMvcHJpdmF0ZSBrZXkgd2FzIHNwZWNpZmllZCBhbmQgdGhlcmUgd2FzIG5vIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUsCiAgYW5kIHRoZW4gaXQgZGlkbid0IGNvbnRpbnVlIHRvIHRyeSB0aGUgb3RoZXIgYXV0aCBtZXRob2RzLiBOb3cgaXQgd2lsbAogIGluc3RlYWQgdHJ5IHRvIGdldCB0aGUgZmlsZXMgaWRfZHNhLnB1YiBhbmQgaWRfZHNhIGZyb20gdGhlIGN1cnJlbnQKICBkaXJlY3RvcnkgaWYgbm9uZSBvZiB0aGUgdHdvIGNvbmRpdGlvbnMgd2VyZSBtZXQuCgpEYW4gRiAoMTcgU2VwdGVtYmVyIDIwMDcpCi0gQWRkZWQgaG9va3MgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0ZXN0IGEgY3VybCBydW5uaW5nCiAgb24gYSByZW1vdGUgaG9zdC4KCi0gQ2hhbmdlZCBzb21lIEZUUCB0ZXN0cyB0byB2YWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSBQT1JUIGFuZCBFUFJUIGNvbW1hbmRzCiAgc2VudCBieSBjdXJsLCBpZiBub3QgdGhlIGFkZHJlc3NlcyB0aGVtc2VsdmVzLgoKRGFuaWVsIFMgKDE1IFNlcHRlbWJlciAyMDA3KQotIE1pY2hhbCBNYXJlayBtYWRlIGxpYmN1cmwgYXV0b21hdGljYWxseSBhcHBlbmQgIjt0eXBlPTxhfGk+IiB3aGVuIHVzaW5nIEhUVFAKICBwcm94aWVzIGZvciBGVFAgdXJscy4KCi0gR/xudGVyIEtuYXVmIGZpeGVkIExEQVAgYnVpbGRzIGluIHRoZSBXaW5kb3dzIG1ha2VmaWxlcyBhbmQgZml4ZWQgTERBUHYzCiAgc3VwcG9ydCBvbiBXaW5kb3dzLgoKRGFuIEYgKDEzIFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIExEQVBTLCBTQ1AgYW5kIFNGVFAgdG8gY3VybC1jb25maWcgLS1wcm90b2NvbHMuIFJlbW92ZWQgYW5kCiAgZml4ZWQgc29tZSBBQ19TVUJTVCBjb25maWd1cmUgZW50cmllcy4KClZlcnNpb24gNy4xNy4wICgxMyBTZXB0ZW1iZXIgMjAwNykKCkRhbmllbCBTICgxMiBTZXB0ZW1iZXIgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzkyNjQ5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzkyNjQ5KSBwb2ludGVkCiAgb3V0IGEgcHJvYmxlbSB3aXRoIGRvaW5nIGFuIGVtcHR5IHVwbG9hZCBvdmVyIEZUUCBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbi4KICBJIGFkZGVkIHRlc3QgY2FzZSA1NDEgdG8gcmVwcm9kdWNlIGl0IGFuZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gSSBub3RpY2VkIHdoaWxlIHdyaXRpbmcgdGVzdCA1NDEgdGhhdCB0aGUgRlRQIGNvZGUgd3JvbmdseSBkaWQgYSBDV0Qgb24gdGhlCiAgc2Vjb25kIHRyYW5zZmVyIGFzIGl0IGRpZG4ndCBzdG9yZSBhbmQgcmVtZW1iZXIgdGhlICIiIHBhdGggZnJvbSB0aGUKICBwcmV2aW91cyB0cmFuc2ZlciBzbyBpdCB3b3VsZCBpbnN0ZWFkIENXRCB0byB0aGUgZW50cnkgcGF0aCBhcyBzdG9yZWQuIFRoaXMKICB3b3JrZWQsIGJ1dCBkaWQgYSBzdXBlcmZsdW91cyBjb21tYW5kLiBUaHVzLCB0ZXN0IGNhc2UgNTQxIG5vdyBhbHNvIHZlcmlmaWVzCiAgdGhpcyBmaXguCgpEYW4gRiAoNSBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgMTAwNyB0byB0ZXN0IHBlcm1pc3Npb24gcHJvYmxlbSB3aGVuIHVwbG9hZGluZyB3aXRoIFRGVFAKICAodG8gdmFsaWRhdGUgYnVnICMxNzkwNDAzKS4KCi0gVEZUUCBub3cgcmVwb3J0cyB0aGUgIm5vdCBkZWZpbmVkIiBURlRQIGVycm9yIGNvZGUgMCBhcyBhbiBlcnJvciwKICBub3Qgc3VjY2Vzcy4KCkRhbmllbCBTICg1IFNlcHRlbWJlciAyMDA3KQotIENvbnRpbnVlZCB0aGUgd29yayBvbiBhIGZpeCBmb3IgIzE3NzkwNTQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTA1NCkuIE15IHByZXZpb3VzIGZpeCBmcm9tIEF1Z3VzdAogIDI0IHdhcyBub3QgY29tcGxldGUgKGVpdGhlcikgYnV0IGNvdWxkIGFjY2lkZW50YWxseSAiZm9yZ2V0IiBwYXJ0cyBvZiBhCiAgc2VydmVyIHJlc3BvbnNlIHdoaWNoIGxlZCB0byBmYXVsdHkgc2VydmVyIHJlc3BvbnNlIHRpbWUtb3V0IGVycm9ycy4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIE1pbml4IGRvZXNuJ3Qgc3VwcG9ydCBnZXRzb2Nrb3B0IG9uIFVEUCBzb2NrZXRzIG9yIHNlbmQvcmVjdiBvbiBUQ1AKICBzb2NrZXRzLgoKRGFuIEYgKDMxIEF1Z3VzdCAyMDA3KQotIE1hZGUgc29tZSBvZiB0aGUgZXJyb3Igc3RyaW5ncyByZXR1cm5lZCBieSB0aGUgKnN0cmVycm9yIGZ1bmN0aW9ucyBtb3JlCiAgZ2VuZXJpYywgYW5kIG1vcmUgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuCgotIFJlbmFtZWQgdGhlIGN1cmxfZnRwc3NsIGVudW0gdG8gY3VybF91c2Vzc2wgYW5kIGl0cyBlbnVtZXJhdGVkIGNvbnN0YW50cywKICBjcmVhdGluZyBtYWNyb3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CgogICAgQ1VSTEZUUFNTTF9OT05FID0+IENVUkxVU0VTU0xfTk9ORQogICAgQ1VSTEZUUFNTTF9UUlkgPT4gQ1VSTFVTRVNTTF9UUlkKICAgIENVUkxGVFBTU0xfQ09OVFJPTCA9PiBDVVJMVVNFU1NMX0NPTlRST0wKICAgIENVUkxGVFBTU0xfQUxMID0+IENVUkxVU0VTU0xfQUxMCiAgICBDVVJMRlRQU1NMX0xBU1QgPT4gQ1VSTFVTRVNTTF9MQVNUCgpEYW4gRiAoMzAgQXVndXN0IDIwMDcpCi0gUmVuYW1lZCBzZXZlcmFsIGxpYmN1cmwgZXJyb3IgY29kZXMgYW5kIG9wdGlvbnMgdG8gbWFrZSB0aGVtIG1vcmUgZ2VuZXJhbAogIGFuZCBhbGxvdyByZXVzZSBieSBtdWx0aXBsZSBwcm90b2NvbHMuIFNldmVyYWwgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUKICByZW1vdmVkLiAgSW4gYWxsIGNhc2VzLCBtYWNyb3Mgd2VyZSBhZGRlZCB0byBwcmVzZXJ2ZSBzb3VyY2UgKGFuZCBiaW5hcnkpCiAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgbmFtZXMuICBUaGVzZSBtYWNyb3MgYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCBhdAogIGEgZnV0dXJlIGRhdGUsIGJ1dCBwcm9iYWJseSBub3QgYmVmb3JlIDIwMDkuICBBbiBhcHBsaWNhdGlvbiBjYW4gYmUKICB0ZXN0ZWQgdG8gc2VlIGlmIGl0IGlzIHVzaW5nIGFueSBvYnNvbGV0ZSBjb2RlIGJ5IGNvbXBpbGluZyBpdCB3aXRoIHRoZQogIENVUkxfTk9fT0xESUVTIG1hY3JvIGRlZmluZWQuCgogIFRoZSBmb2xsb3dpbmcgdW51c2VkIGVycm9yIGNvZGVzIHdlcmUgcmVtb3ZlZDoKCiAgICBDVVJMRV9CQURfQ0FMTElOR19PUkRFUgogICAgQ1VSTEVfQkFEX1BBU1NXT1JEX0VOVEVSRUQKICAgIENVUkxFX0ZUUF9DQU5UX1JFQ09OTkVDVAogICAgQ1VSTEVfRlRQX0NPVUxETlRfR0VUX1NJWkUKICAgIENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9BU0NJSQogICAgQ1VSTEVfRlRQX1VTRVJfUEFTU1dPUkRfSU5DT1JSRUNUCiAgICBDVVJMRV9GVFBfV0VJUkRfVVNFUl9SRVBMWQogICAgQ1VSTEVfRlRQX1dSSVRFX0VSUk9SCiAgICBDVVJMRV9MSUJSQVJZX05PVF9GT1VORAogICAgQ1VSTEVfTUFMRk9STUFUX1VTRVIKICAgIENVUkxFX09CU09MRVRFCiAgICBDVVJMRV9TSEFSRV9JTl9VU0UKICAgIENVUkxFX1VSTF9NQUxGT1JNQVRfVVNFUgoKICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIHdlcmUgcmVuYW1lZDoKCiAgICBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCA9PiAgICAgIENVUkxFX1JFTU9URV9BQ0NFU1NfREVOSUVECiAgICBDVVJMRV9GVFBfQ09VTEROVF9TRVRfQklOQVJZID0+IENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9UWVBFCiAgICBDVVJMRV9GVFBfU1NMX0ZBSUxFRCA9PiAgICAgICAgIENVUkxFX1VTRV9TU0xfRkFJTEVECiAgICBDVVJMRV9GVFBfUVVPVEVfRVJST1IgPT4gICAgICAgIENVUkxFX1FVT1RFX0VSUk9SCiAgICBDVVJMRV9URlRQX0RJU0tGVUxMID0+ICAgICAgICAgIENVUkxFX1JFTU9URV9ESVNLX0ZVTEwKICAgIENVUkxFX1RGVFBfRVhJU1RTID0+ICAgICAgICAgICAgQ1VSTEVfUkVNT1RFX0ZJTEVfRVhJU1RTCiAgICBDVVJMRV9IVFRQX1JBTkdFX0VSUk9SID0+ICAgICAgIENVUkxFX1JBTkdFX0VSUk9SCgogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0QgPT4gQ1VSTE9QVF9LRVlQQVNTV0QKICAgIENVUkxPUFRfRlRQQVBQRU5EID0+ICAgIENVUkxPUFRfQVBQRU5ECiAgICBDVVJMT1BUX0ZUUExJU1RPTkxZID0+ICBDVVJMT1BUX0RJUkxJU1RPTkxZCiAgICBDVVJMT1BUX0ZUUF9TU0wgPT4gICAgICBDVVJMT1BUX1VTRV9TU0wKCiAgQSBmZXcgbW9yZSBjaGFuZ2VzIHdpbGwgdGFrZSBwbGFjZSB3aXRoIHRoZSBuZXh0IFNPTkFNRSBidW1wIG9mIHRoZQogIGxpYnJhcnkuICBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiBkb2NzL1RPRE8KCi0gRG9jdW1lbnRlZCBzb21lIG5ld2VyIGVycm9yIGNvZGVzIGluIGxpYmN1cmwtZXJyb3IoMykKCi0gQWRkZWQgbW9yZSBhY2N1cmF0ZSBlcnJvciBjb2RlIHJldHVybnMgZnJvbSBTRlRQIG9wZXJhdGlvbnMuICBBZGRlZCB0ZXN0CiAgY2FzZSA2MTUgdG8gdGVzdCBhbiBTRlRQIHVwbG9hZCBmYWlsdXJlLgoKRGFuIEYgKDI4IEF1Z3VzdCAyMDA3KQotIFNvbWUgbWlub3IgaW50ZXJuYWwgdHlwZSBhbmQgY29uc3QgY2hhbmdlcyBiYXNlZCBvbiBhIHNwbGludCBzY2FuLgoKRGFuaWVsIFMgKDI0IEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3NzkwNTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpIHBvaW50ZWQKICBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCBkZWFsIHdpdGggbGFyZ2UgcmVzcG9uc2VzIGZyb20gc2VydmVyIGNvbW1hbmRzLCB3aGVuCiAgdGhlIHNpbmdsZSByZXNwb25zZSB3YXMgY29uc2lzdGluZyBvZiBtdWx0aXBsZSBsaW5lcyBidXQgb2YgYSB0b3RhbCBzaXplIG9mCiAgMTZLQiBvciBtb3JlLiBEYW4gRmFuZHJpY2ggaW1wcm92ZWQgdGhlIGZ0cCB0ZXN0IHNjcmlwdCBhbmQgcHJvdmlkZWQgdGVzdAogIGNhc2UgMTAwNiB0byByZXBlYXQgdGhlIHByb2JsZW0sIGFuZCBJIGZpeGVkIHRoZSBjb2RlIHRvIG1ha2Ugc3VyZSB0aGlzIG5ldwogIHRlc3QgY2FzZSBydW5zIGZpbmUuCgpQYXRyaWNrIE0gKDIzIEF1Z3VzdCAyMDA3KQotIE9TLzQwMCBwb3J0OiBuZXcgZmlsZXMgbGliL2NvbmZpZy1vczQwMC5oIGxpYi9zZXR1cC1vczQwMC5oIHBhY2thZ2VzL09TNDAwLyouCiAgU2VlIHBhY2thZ2VzL09TNDAwL1JFQURNRS5PUzQwMC4KCkRhbmllbCBTICgyMyBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5NzUxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5NzUxKSBwb2ludGVkCiAgb3V0IHRoYXQgZG9pbmcgZmlyc3QgYSBmaWxlOi8vIHVwbG9hZCBhbmQgdGhlbiBhbiBGVFAgdXBsb2FkIGNyYXNoZWQgbGliY3VybAogIG9yIGF0IGJlc3QgY2F1c2VkIGZ1cmlvdXMgdmFsZ3JpbmQgY29tcGxhaW50cy4gRml4ZWQgbm93IQoKRGFuaWVsIFMgKDIyIEF1Z3VzdCAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3NzkwNTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpIHBvaW50ZWQKICBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCBkZWFsIHdpdGggdmVyeSBsb25nICg+MTZLKSBGVFAgc2VydmVyIHJlc3BvbnNlIGxpbmVzCiAgcHJvcGVybHkuIFN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsIGNob3AgdGhlbSBvZmYgKHRodXMgdGhlIGNsaWVudCBhcHAgd2lsbAogIG5vdCBnZXQgdGhlIGZ1bGwgbGluZSkgYnV0IHN1cnZpdmUgYW5kIGRlYWwgd2l0aCB0aGVtIGZpbmUgb3RoZXJ3aXNlLiBUZXN0CiAgY2FzZSAxMDAzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCBTICgyMCBBdWd1c3QgMjAwNykKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IENocmlzdGlhbiBWb2d0LCB0aGUgRlRQIGNvZGUgbm93IHNldHMgdGhlIHVwY29taW5nCiAgZG93bmxvYWQgdHJhbnNmZXIgc2l6ZSBtdWNoIGVhcmxpZXIgdG8gYmUgcG9zc2libGUgdG8gZ2V0IHJlYWQgd2l0aAogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFzIHNvb24gYXMgcG9zc2libGUuIFRoaXMgaXMgdmVyeSBtdWNoIGluIGEKICBzaW1pbGFyIHNwaXJpdCB0byB0aGUgSFRUUCBzaXplIGNoYW5nZSBmcm9tIEF1Z3VzdCAxMSAyMDA3LgoKRGFuaWVsIFMgKDE4IEF1Z3VzdCAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTc3NjIzMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc2MjMyKSBhYm91dCBsaWJjdXJsIGNhbGxpbmcKICBDdXJsX2NsaWVudF93cml0ZSgpLCBwYXNzaW5nIG9uIGEgY29uc3Qgc3RyaW5nIHRoYXQgdGhlIGNhbGxlciBtYXkgbm90CiAgbW9kaWZ5IGFuZCB5ZXQgaXQgZG9lcyAob24gc29tZSBwbGF0Zm9ybXMpLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NzYyMzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzNSkgYWJvdXQgZnRwIHJlcXVlc3RzIHdpdGggTk9CT0RZCiAgb24gYSBkaXJlY3Rvcnkgd291bGQgZG8gYSAiU0laRSAobnVsbCkiIHJlcXVlc3QuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0CiAgY2FzZSAxMDAwIHdhcyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgUyAoMTcgQXVndXN0IDIwMDcpCi0gU29uZyBNYSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgY3VyZXMgYSBwcm9ibGVtIGxpYmN1cmwgaGFzIHdoZW4gZG9pbmcgcmVzdW1lCiAgSFRUUCBQVVQgdXNpbmcgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBUZXN0IGNhc2UgNTMyMCBhbmQgNTMyMiB3ZXJlIGFsc28KICBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgUyAoMTQgQXVndXN0IDIwMDcpCi0gQW5kcmV3IFdhbnNpbmsgcHJvdmlkZWQgYW4gTlRMTSBidWdmaXg6IGluIHRoZSBjYXNlIHRoZSBzZXJ2ZXIgc2V0cyB0aGUgZmxhZwogIE5UTE1GTEFHX05FR09USUFURV9VTklDT0RFLCB3ZSBuZWVkIHRvIGZpbHRlciBpdCBvZmYgYmVjYXVzZSBsaWJjdXJsIGRvZXNuJ3QKICBVTklDT0RFIGVuY29kZSB0aGUgc3RyaW5ncyBpdCBwYWNrcyBpbnRvIHRoZSBOVExNIGF1dGhlbnRpY2F0ZSBwYWNrZXQuCgpEYW5pZWwgUyAoMTEgQXVndXN0IDIwMDcpCi0gQWxsZW4gUHVsc2lmZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc2V0IHRoZSBleHBlY3RlZCBkb3dubG9hZAogIHNpemUgZWFybGllciB3aGVuIGRvaW5nIEhUVFAgZG93bmxvYWRzLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBhbmQgdGhlCiAgcHJvZ3Jlc3MgbWV0ZXIgZXRjIGtub3cgZ2V0IHRoZSBpbmZvIGVhcmxpZXIgaW4gdGhlIGZsb3cgdGhhbiBiZWZvcmUuCgotIFBhdHJpY2sgTW9ubmVyYXQgbW9kaWZpZWQgdGhlIExEQVAgY29kZSBhbmQgYXBwcm9hY2ggaW4gY3VybC4gU3RhcnRpbmcgbm93LAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrcyBmb3Igb3BlbmxkYXAgYW5kIGZyaWVuZHMgYW5kIHdlIGxpbmsgd2l0aCB0aG9zZQogIGxpYnMganVzdCBsaWtlIHdlIGxpbmsgYWxsIG90aGVyIHRoaXJkIHBhcnR5IGxpYnJhcmllcywgYW5kIHdlIG5vIGxvbmdlcgogIGRsb3BlbigpIHRob3NlIGxpYnJhcmllcy4gT3VyIHByaXZhdGUgaGVhZGVyIGZpbGUgbGliL2xkYXAuaCB3YXMgcmVuYW1lZCB0bwogIGxpYi9jdXJsX2xkYXAuaCBkdWUgdG8gdGhpcy4gSSBzZXQgYSB0YWcgaW4gQ1ZTIChjdXJsLTdfMTdfMC1wcmVsZGFwZml4KQogIGp1c3QgYmVmb3JlIHRoaXMgY29tbWl0LCBqdXN0IGluIGNhc2UuCgpEYW4gRiAoOCBBdWd1c3QgMjAwNykKLSBTb25nIE1hIG5vdGVkIGEgemxpYiBtZW1vcnkgbGVhayBpbiB0aGUgaWxsZWdhbCBjb21wcmVzc2VkIGhlYWRlcgogIGNvdW50ZXJtZWFzdXJlcyBjb2RlIHBhdGguCgpEYW5pZWwgUyAoNCBBdWd1c3QgMjAwNykKLSBQYXRyaWNrIE1vbm5lcmF0IGZpeGVkIGN1cmxfZWFzeV9lc2NhcGUoKSBhbmQgY3VybHhfc3RydG9sbCgpIHRvIHdvcmsgb24KICBub24tQVNDSUkgc3lzdGVtcy4KCkRhbmllbCBTICgzIEF1Z3VzdCAyMDA3KQotIEkgY3V0IG91dCBzdXBwb3J0IGZvciBsaWJzc2gyIHZlcnNpb25zIG9sZGVyIHRoYW4gMC4xNiB0byBtYWtlIG91ciBjb2RlIGEKICBsb3Qgc2ltcGxlciwgYW5kIHRvIGF2b2lkIGdldHRpbmcgdHJvdWJsZSB3aXRoIHRoZSBMSUJTU0gyX0FQSU5PIGRlZmluZQogIHRoYXQgMSkgZGlkbid0IHdvcmsgcHJvcGVybHkgc2luY2UgaXQgd2FzID4zMiBiaXRzIGFuZCAyKSBpcyByZW1vdmVkIGluCiAgbGlic3NoMiAwLjE2Li4uCgpEYW5pZWwgUyAoMiBBdWd1c3QgMjAwNykKLSBTY290dCBDYW50b3IgZmlsZWQgYnVnIHJlcG9ydCAjMTc2NjMyMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzY2MzIwKSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybAogIGNvZGUgYWNjZXNzZWQgdHdvIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb25zIChDVVJMT1BUX0ROU19DQUNIRV9USU1FT1VUIGFuZAogIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUpIGFzIGludHMgZXZlbiB0aG91Z2ggdGhleSdyZSBkb2N1bWVudGVkIHRvIGJlCiAgcGFzc2VkIGluIGFzIGxvbmdzLCBhbmQgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2Ugb24gNjQgYml0IGFyY2hpdGVjdHVyZXMuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcmVwb3J0ZWQgYSByZWdyZXNzaW9uOiByZXN1bWVkIGZpbGU6Ly8gdHJhbnNmZXJzIGJyb2tlCiAgYWZ0ZXIgNy4xNi4yLiBUaGlzIGlzIG11Y2ggZHVlIHRvIHRoZSBkaWZmZXJlbnQgdHJlYXRtZW50IGZpbGU6Ly8gZ2V0cwogIGludGVybmFsbHksIGJ1dCBub3cgSSBhZGRlZCB0ZXN0IDIzMSB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IHRvIGhhcHBlbiBhZ2FpbgogIHdpdGhvdXQgdXMgbm90aWNpbmchCgpEYW5pZWwgUyAoMSBBdWd1c3QgMjAwNykKLSBQYXRyaWNrIE1vbm5lcmF0IGFuZCBJIG1vZGlmaWVkIGxpYmN1cmwgc28gdGhhdCBub3cgaXQgKmNvcGllcyogYWxsIHN0cmluZ3MKICBwYXNzZWQgdG8gaXQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkhIFByZXZpb3VzbHkgaXQgaGFzIGFsd2F5cyBqdXN0IHJlZmVyZWQKICB0byB0aGUgZGF0YSwgZm9yY2luZyB0aGUgdXNlciB0byBrZWVwIHRoZSBkYXRhIGFyb3VuZCB1bnRpbCBsaWJjdXJsIGlzIGRvbmUKICB3aXRoIGl0LiBUaGF0IGlzIG5vdyBoaXN0b3J5IGFuZCBsaWJjdXJsIHdpbGwgaW5zdGVhZCBjbG9uZSB0aGUgZ2l2ZW4KICBzdHJpbmdzIGFuZCBrZWVwIHByaXZhdGUgY29waWVzLiBUaGlzIGlzIGFsc28gcGFydCBvZiBQYXRyaWNrIE1vbm5lcmF0J3MKICBPUy80MDAgcG9ydC4KCiAgRHVlIHRvIHRoaXMgYmVpbmcgYSBzb21ld2hhdCBpbnRlcmVzdGluZyBjaGFuZ2UgQVBJIHdpc2UsIEkndmUgZGVjaWRlZCB0bwogIGJ1bXAgdGhlIHZlcnNpb24gb2YgdGhlIHVwY29taW5nIHJlbGVhc2UgdG8gNy4xNy4wLiBPbGRlciBhcHBsaWNhdGlvbnMgd2lsbAogIG9mIGNvdXJzZSBub3Qgbm90aWNlIHRoaXMgY2hhbmdlIG5vciBkbyB0aGV5IGhhdmUgdG8gY2FyZSwgYnV0IG5ldwogIGFwcGxpY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKLSBHcmVnIE1vcnNlIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIFBPU1RpbmcgdXNpbmcgQU5ZQVVUSCB0byBhIHNlcnZlcgogIHJlcXVpcmluZyBOVExNLCBhbmQgaGUgcHJvdmlkZWQgdGVzdCBjb2RlIGFuZCBhIHRlc3Qgc2VydmVyIGFuZCB3ZSB3b3JrZWQKICBvdXQgYSBidWcgZml4LiBXZSBmYWlsZWQgdG8gY291bnQgc2VudCBib2R5IGRhdGEgYXQgdGltZXMsIHdoaWNoIHRoZW4gY2F1c2VkCiAgaW50ZXJuYWwgY29uZnVzaW9ucyB3aGVuIGxpYmN1cmwgdHJpZWQgdG8gc2VuZCB0aGUgcmVzdCBvZiB0aGUgZGF0YSBpbiBvcmRlcgogIHRvIG1haW50YWluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYWxpdmUuCgpEYW5pZWwgUyAoMzEgSnVseSAyMDA3KQotIFBldGVyIE8nR29ybWFuIHBvaW50ZWQgb3V0IChhbmQgZml4ZWQpIHRoYXQgdGhlIG5vbi1ibG9ja2luZyBjaGVjayBpbgogIGNvbmZpZ3VyZSBtYWRlIGxpYmN1cmwgdXNlIGJsb2NraW5nIHNvY2tldHMgb24gQUlYIDQgYW5kIDUsIHdoaWxlIHRoYXQKICB3YXNuJ3QgdGhlIGludGVudGlvbi4KCkRhbmllbCBTICgyOSBKdWx5IDIwMDcpCi0gSmF5ZXNoIEEgU2hhaCBmaWxlZCBidWcgcmVwb3J0ICMxNzU5NTQyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NTk1NDIpIGlkZW50aWZ5aW5nIGEgcmF0aGVyIHNlcmlvdXMKICBwcm9ibGVtIHdpdGggRlRQUzogbGliY3VybCBjbG9zZWQgdGhlIGRhdGEgY29ubmVjdGlvbiBzb2NrZXQgYW5kIHRoZW4gbGF0ZXIKICBpbiB0aGUgZmxvdyBpdCB3b3VsZCBjYWxsIHRoZSBTU0wgbGF5ZXIgdG8gZG8gU1NMIHNodXRkb3duIHdoaWNoIHRoZW4gd291bGQKICB1c2UgYSBzb2NrZXQgdGhhdCBoYWQgYWxyZWFkeSBiZWVuIGNsb3NlZCAtIHNvIGlmIHRoZSBhcHBsaWNhdGlvbiBoYWQgb3BlbmVkCiAgYSBuZXcgb25lIGluIHRoZSBtZWFuIHRpbWUsIGxpYmN1cmwgY291bGQgc2VuZCBnaWJiZXJpc2ggdGhhdCB3YXkhIEkgd29ya2VkCiAgd2l0aCBHcmVnIFphdmVydG5payB0byBwcm9wZXJseSBkaWFnbm9zZSBhbmQgZml4IHRoaXMuIFRoZSBmaXggYWZmZWN0cyBjb2RlCiAgZm9yIGFsbCBTU0wgbGlicmFyaWVzIHdlIHN1cHBvcnQsIGJ1dCBpdCBoYXMgb25seSBiZWVuIHRydWx5IHZlcmlmaWVkIHRvCiAgd29yayBmaW5lIGZvciB0aGUgT3BlblNTTCB2ZXJzaW9uLiBUaGUgb3RoZXJzIGhhdmUgb25seSBiZWVuIGNvZGUgcmV2aWV3ZWQuCgpEYW5pZWwgUyAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIHRoZSBwYXJ0cyBvZiBQYXRyaWNrIE1vbm5lcmF0J3MgT1MvNDAwIHBhdGNoIHRoYXQgaW50cm9kdWNlcwogIHN1cHBvcnQgZm9yIHRoZSBPUy80MDAgU2VjdXJlIFNvY2tldHMgTGF5ZXIgbGlicmFyeS4KCkRhbiBGICgyMyBKdWx5IDIwMDcpCi0gSW1wbGVtZW50ZWQgb25seSB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IHJlbmFtZWQKICBzb21lIGZldyBpbnRlcm5hbCBpZGVudGlmaWVycyB0byBhdm9pZCBjb25mbGljdHMsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bCBvbgogIG90aGVyIHBsYXRmb3Jtcy4KCkRhbmllbCBTICgyMiBKdWx5IDIwMDcpCi0gSFRUUCBEaWdlc3QgYnVnIGZpeCBieSBDaHJpcyBGbGVyYWNrZXJzOgoKICBTY2VuYXJpbwoKICAtIFBlcmZvbWluZyBhIFBPU1QgcmVxdWVzdCB3aXRoIGJvZHkKICAtIFdpdGggYXV0aGVudGljYXRpb24gKG9ubHkgRGlnZXN0KQogIC0gUmUtdXNpbmcgYSBjb25uZWN0aW9uCgogIGxpYmN1cmwgd291bGQgc2VuZCBhIEhUVFAgUE9TVCB3aXRoIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyIGJ1dCB3aXRob3V0CiAgYm9keS4gT3VyIHNlcnZlciB3b3VsZCByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0IGluIHRoYXQgY2FzZSAoYmVjYXVzZQogIGF1dGhlbnRpY2F0aW9uIHBhc3NlZCwgYnV0IHRoZSBib2R5IHdhcyBlbXB0eSkuCgogIENhdXNlCgogIDEpIGh0dHBfZGlnZXN0LmMgLT4gQ3VybF9vdXRwdXRfZGlnZXN0CiAgLSBVcGRhdGVzIGFsbG9jcHRyLnVzZXJwd2QvYWxsb2NwdHIucHJveHl1c2VycHdkICpvbmx5KiBpZiBkLT5ub25jZSBpcwogIGZpbGxlZCBpbiAoYW5kIG5vIGVycm9ycykKICAtIGF1dGhwLT5kb25lID0gVFJVRSBpZiBkLT5ub25jZSBpcyBmaWxsZWQgaW4KICAyKSBodHRwLmMgLT4gQ3VybF9odHRwCiAgLSAqQWx3YXlzKiB1c2VzIGFsbG9jcHRyLnVzZXJwd2QvYWxsb2NwdHIucHJveHl1c2VycHdkIGlmIG5vdCBOVUxMCiAgMykgaHR0cC5jIC0+IEN1cmxfaHR0cCwgQ3VybF9odHRwX291dHB1dF9hdXRoCgogIFNvIHdoYXQgaGFwcGVucyBpcyB0aGF0IEN1cmxfb3V0cHV0X2RpZ2VzdCBjYW5ub3QgeWV0IHVwZGF0ZSB0aGUKICBBdXRob3JpemF0aW9uIGhlYWRlciAoYWxsb2NwdHIudXNlcnB3ZCkgd2hpY2ggcmVzdWx0cyBpbiBhdXRoaG9zdC0+ZG9uZT0wIC0+CiAgYXV0aGhvc3QtPm11bHRpPTEgLT4gY29ubi0+Yml0cy5hdXRobmVnID0gVFJVRS4gIFRoZSBib2R5IGlzIG5vdAogIGFkZGVkLiAqSG93ZXZlciosIGFsbG9jcHRyLnVzZXJwd2QgaXMgc3RpbGwgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSByZXF1ZXN0CgotIEFkZGVkIHRlc3QgY2FzZSAzNTQgdGhhdCBtYWtlcyBhIHNpbXBsZSBGVFAgcmV0cmlldmFsIHdpdGhvdXQgcGFzc3dvcmQsIHdoaWNoCiAgdmVyaWZpZXMgdGhlIGJ1ZyBmaXggaW4gIzE3NTczMjguCgpEYW5pZWwgUyAoMjEgSnVseSAyMDA3KQotIFRvIGFsbG93IG1vcmUgZmxleGliaWxpdHkgaW4gRlRQIHRlc3QgY2FzZXMsIEkndmUgcmVtb3ZlZCB0aGUgZW5mb3JjZWQgc3RhdGVzCiAgZnJvbSB0aGUgdGVzdCBzZXJ2ZXIgY29kZSBhcyB0aGV5IHNlcnZlZCBubyByZWFsIHB1cnBvc2UuIFRoZSB0ZXN0IHNlcnZlcgogIGlzIGhlcmUgdG8gc2VydmUgZm9yIHRoZSB0ZXN0IGNhc2VzLCBub3QgdG8gYXR0ZW1wdCB0byBmdW5jdGlvbiBhcyBhIHJlYWwKICBzZXJ2ZXIhIFdoaWxlIGF0IGl0LCBJIG1vZGlmaWVkIHRlc3QgY2FzZSAxNDEgdG8gYmV0dGVyIHRlc3QgYW5kIHZlcmlmeQogIGN1cmwgLUkgb24gYSBzaW5nbGUgRlRQIGZpbGUuCgpEYW5pZWwgUyAoMjAgSnVseSAyMDA3KQotIEphbWVzIEhvdXNsZXkgZml4ZWQgdGhlIFNGVFAgUFdEIGNvbW1hbmQgdG8gd29yay4KCi0gUmFsZiBTLiBFbmdlbHNjaGFsbCBmaWxlZCBidWcgcmVwb3J0ICMxNzU3MzI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NTczMjgpIGFuZCBzdWJtaXR0ZWQgYSBwYXRjaC4gSXQKICB0dXJucyBvdXQgd2UgYnJva2UgbG9naW4gdG8gRlRQIHNlcnZlcnMgdGhhdCBkb24ndCByZXF1aXJlIChub3IgdW5kZXJzdGFuZCkKICBQQVNTIGFmdGVyIHRoZSBVU0VSIGNvbW1hbmQuIFRoZSBicmVha2FnZSB3YXMgZG9uZSBhcyBwYXJ0IG9mIHRoZSBrcmI1CiAgY29tbWl0IHNvIGEga3JiLXVzaW5nIHBlcnNvbiBuZWVkcyB0byB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG5vdwogIHdvcmtzIG9yIGlmIHdlIG5lZWQgdG8gZml4IGl0IChpbiBhIGRpZmZlcmVudCB3YXkgb2YgY291cnNlKS4KCkRhbiBGICgxNyBKdWx5IDIwMDcpCi0gRml4ZWQgdGVzdCBjYXNlcyA2MTMgYW5kIDYxNCBieSBpbXByb3ZpbmcgdGhlIGxvZyBwb3N0cHJvY2Vzc29yIHRvIGhhbmRsZQogIGEgbmV3IGRpcmVjdG9yeSBsaXN0aW5nIGZvcm1hdCB0aGF0IG5ld2VyIGxpYnNzaDIncyBjYW4gcHJvdmlkZS4gIFRoaXMKICBpcyBwcm9iYWJseSBOT1Qgc3VmZmljaWVudCB0byBoYW5kbGUgYWxsIGRpcmVjdG9yeSBsaXN0aW5nIGZvcm1hdHMgdGhhdAogIHNlcnZlcidzIGNhbiBwcm92aWRlLCBhbmQgc2hvdWxkIGJlIHJldmlzaXRlZC4KCkRhbmllbCBTICgxNyBKdWx5IDIwMDcpCi0gRGFuaWVsIEpvaG5zb24gZml4ZWQgYSBidWcgaW4gaG93IGxpYnNzaDJfc2Vzc2lvbl9sYXN0X2Vycm9yKCkgd2FzIHVzZWQsIGluCiAgdHdvIHBsYWNlcy4KCi0gSm9mZWxsIEdhbGxhcmRvIHBvc3RlZCBhIGxpYmN1cmwgbG9nIHVzaW5nIEZUUCB0aGF0IGV4cG9zZWQgYSBidWcgd2hpY2ggbWFkZQogIGEgY29udHJvbCBjb25uZWN0aW9uIHRoYXQgd2FzIGRlZW1lZCAiZGVhZCIgdG8geWV0IGJlIHJlLXVzZWQgaW4gYSBmb2xsb3dpbmcKICByZXF1ZXN0LgoKRGFuaWVsIFMgKDEzIEp1bHkgMjAwNykKLSBDb2xpbiBIb2diZW4gZmlsZWQgYnVnIHJlcG9ydCAjMTc1MDI3NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzUwMjc0KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2ggZm9yIHRoZQogIGNhc2Ugd2hlcmUgbGliY3VybCBkaWQgYSBjb25uZWN0IGF0dGVtcHQgdG8gYSBub24tbGlzdGVuaW5nIHBvcnQgYW5kIGRpZG4ndAogIHByb3ZpZGUgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcgYmFjay4KCi0gRGFuaWVsIENhdGVyIGZpeGVzOgogIDEgLSBtYWRlICdtYWtlIHZjOCcgd29yayBvbiB3aW5kb3dzLgogIDIgLSBtYWRlIGxpYmN1cmwgaXRzZWxmIGJ1aWx0IHdpdGggQ1VSTF9OT19PTERJRVMgZGVmaW5lZCAod2hpY2ggZG9lc24ndAogICAgICBkZWZpbmUgdGhlIHN5bWJvbHMgZm9yIGJhY2t3YXJkcyBzb3VyY2UgY29tcGF0aWJpbGl0eSkKICAzIC0gdXBkYXRlZCBsaWJjdXJsLWVycm9ycy4zCiAgNCAtIGFkZGVkIENVUkxfRElTQUJMRV9URlRQIHRvIGRvY3MvSU5TVEFMTAoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBNYWRlIHRoZSBrcmI1IGNvZGUgYnVpbGQgd2l0aCBIZWltZGFsJ3MgR1NTQVBJIGxpYi4KCkRhbiBGICgxMiBKdWx5IDIwMDcpCi0gQ29tcGlsZSBtb3N0IG9mIHRoZSBleGFtcGxlIGFwcHMgaW4gZG9jcy9leGFtcGxlcyB3aGVuIGRvaW5nIGEgJ21ha2UgY2hlY2snLgogIEZpeGVkIHNvbWUgY29tcGlsZSB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRob3NlIGV4YW1wbGVzLgoKLSBSZW1vdmVkIHRoZSBleGFtcGxlIHByb2dyYW0gZnRwM3JkcGFydHkuYyBzaW5jZSBsaWJjdXJsIGRvZXNuJ3Qgc3VwcG9ydAogIDNyZCBwYXJ0eSBGVFAgdHJhbnNmZXJzIGFueSBsb25nZXIuCgpEYW5pZWwgUyAoMTIgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZm91bmQgYW4gKGFsYmVpdCByYXJlKSBjYXNlIHdoZXJlIHRoZSBwcm94eSBDT05ORUNUIG9wZXJhdGlvbgogIGNvdWxkIGluIGZhY3QgZ2V0IHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcC4KCi0gTWFkZSBDVVJMT1BUX1NTTF9WRVJJRllIT1NUIHNldCB0byAxIGFjdHMgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uOgogIGZhaWwgdG8gY29ubmVjdCBpZiB0aGVyZSBpcyBubyBDb21tb24gTmFtZSBmaWVsZCBmb3VuZCBpbiB0aGUgcmVtb3RlIGNlcnQuCiAgV2Ugc2hvdWxkIGRlcHJlY2F0ZSB0aGUgc3VwcG9ydCBmb3IgdGhpcyBzZXQgdG8gMSBhbnl3YXkgc29vbiwgc2luY2UgdGhlCiAgZmVhdHVyZSBpcyBwb2ludGxlc3MgYW5kIG1vc3QgbGlrZWx5IG5ldmVyIHJlYWxseSB1c2VkIGJ5IGFueW9uZS4KCkRhbmllbCBTICgxMSBKdWx5IDIwMDcpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhIGJ1ZyB3aXRoIHRyYW5zZmVyLWVuY29kaW5nIHNraXBwaW5nIGR1cmluZyB0aGUgNDA3CiAgZXJyb3IgcGFnZXMgZm9yIHByb3h5IGF1dGhlbnRpY2F0aW9uLgoKLSBHaWFuY2FybG8gRm9ybWljdWNjaWEgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGEgY2xvc2VkIGNvbm5lY3Rpb24KICB0byBhIHByb3h5IGR1cmluZyBDT05ORUNUIGF1dGggbmVnb3RpYXRpb24uCgpEYW4gRiAoMTAgSnVseSAyMDA3KQotIEZpeGVkIGEgY3VybCBtZW1vcnkgbGVhayByZXBvcnRlZCBieSBTb25nIE1hIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCiAgb2YgdGhlIHBhdGNoIGhlIHN1Z2dlc3RlZC4gIEFkZGVkIGhpcyB0ZXN0IGNhc2UgYXMgdGVzdDI4OSB0byB2ZXJpZnkuCgotIEZvcmNlIHRoZSB0aW1lIHpvbmUgdG8gR01UIGluIHRoZSBjb29raWUgdGVzdHMgaW4gY2FzZSB0aGUgdXNlciBpcwogIHVzaW5nIG9uZSBvZiB0aGUgc28tY2FsbGVkICdyaWdodCcgdGltZSB6b25lcyB0aGF0IHRha2UgaW50byBhY2NvdW50CiAgbGVhcCBzZWNvbmRzLCB3aGljaCBjYXVzZXMgdGhlIHRlc3RzIHRvIGZhaWwgKGFzIHJlcG9ydGVkIGJ5CiAgRGFuaWVsIEJsYWNrIGluIGJ1ZyByZXBvcnQgIzE3NDU5NjQpLgoKVmVyc2lvbiA3LjE2LjQgKDEwIEp1bHkgMjAwNykKCkRhbmllbCBTICgxMCBKdWx5IDIwMDcpCi0gS2VlcyBDb29rIG5vdGlmaWVkIHVzIGFib3V0IGEgc2VjdXJpdHkgZmxhdwogIChodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDcwNzEwLmh0bWwpIGluIHdoaWNoIGxpYmN1cmwgZmFpbGVkIHRvCiAgcHJvcGVybHkgcmVqZWN0IHNvbWUgb3V0ZGF0ZWQgb3Igbm90IHlldCB2YWxpZCBzZXJ2ZXIgY2VydGlmaWNhdGVzIHdoZW4KICBidWlsdCB3aXRoIEdudVRMUy4gS2VlcyBhbHNvIHByb3ZpZGVkIHRoZSBwYXRjaC4KCkphbWVzIEggKDUgSnVseSAyMDA3KQotIEdhdnJpZSBQaGlsaXBzb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IHdpbGwgdXNlIGEgbW9yZSBzcGVjaWZpYyBlcnJvcgogIG1lc3NhZ2UgZm9yIGFuIHNjcDovLyB1cGxvYWQgZmFpbHVyZS4gIElmIGxpYnNzaDIgaGFzIGhpcyBtYXRjaGluZwogIHBhdGNoLCB0aGVuIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybiBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZCBpbnN0ZWFkCiAgb2YgYSBtb3JlIGdlbmVyaWMgZXJyb3IuCgpEYW5pZWwgUyAoMSBKdWx5IDIwMDcpCi0gVGhvbWFzIEouIE1vb3JlIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIEtlcmJlcm9zNSBzdXBwb3J0IGluCiAgbGliY3VybC4gVGhpcyBhbHNvIG1ha2VzIHRoZSBvcHRpb25zIGNoYW5nZSBuYW1lIHRvIC0ta3JiIChmcm9tIC0ta3JiNCkgYW5kCiAgQ1VSTE9QVF9LUkJMRVZFTCAoZnJvbSBDVVJMT1BUX0tSQjRMRVZFTCkgYnV0IHRoZSBvbGQgbmFtZXMgYXJlIHN0aWxsCgotIFNvbmcgTWEgaGVscGVkIG1lIHZlcmlmeSBhbmQgZXh0ZW5kIGEgZml4IGZvciBkb2luZyBGVFAgb3ZlciBhIFNPQ0tTNC81CiAgcHJveHkuCgpEYW5pZWwgUyAoMjcgSnVuZSAyMDA3KQotIEphbWVzIEhvdXNsZXk6IEFkZCB0d28gbmV3IG9wdGlvbnMgZm9yIHRoZSBTRlRQL1NDUC9GSUxFIHByb3RvY29sczoKICBDVVJMT1BUX05FV19GSUxFX1BFUk1TIGFuZCBDVVJMT1BUX05FV19ESVJFQ1RPUllfUEVSTVMuIFRoZXNlIGNvbnRyb2wgdGhlCiAgcHJlbWlzc2lvbnMgZm9yIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBjcmVhdGVkIG9uIHRoZSByZW1vdGUKICBzZXJ2ZXIuIENVUkxPUFRfTkVXX0ZJTEVfUEVSTVMgZGVmYXVsdHMgdG8gMDY0NCBhbmQKICBDVVJMT1BUX05FV19ESVJFQ1RPUllfUEVSTVMgZGVmYXVsdHMgdG8gMDc1NQoKLSBJIGNvcnJlY3RlZCB0aGUgMTAtYXQtYS10aW1lLmMgZXhhbXBsZSBhbmQgYXBwbGllZCBhIHBhdGNoIGZvciBpdCBieSBKYW1lcwogIEJ1cnNhLgoKRGFuaWVsIFMgKDI2IEp1bmUgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIHJlLWFycmFuZ2VkIHRoZSBpbnRlcm5hbCBoYXNoIGNvZGUgdG8gd29yayB3aXRoIGEgY3VzdG9tCiAgaGFzaCBmdW5jdGlvbiBmb3IgZGlmZmVyZW50IGhhc2hlcywgYW5kIGFsc28gZXhwYW5kZWQgdGhlIGRlZmF1bHQgc2l6ZSBmb3IKICB0aGUgc29ja2V0IGhhc2ggdGFibGUgdXNlZCBpbiBtdWx0aSBoYW5kbGVzIHRvIGdyZWF0bHkgZW5oYW5jZSBzcGVlZCB3aGVuCiAgdmVyeSBtYW55IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCBhbmQgdGhlIHNvY2tldCBBUEkgaXMgdXNlZC4KCi0gSmFtZXMgSG91c2xleSBtYWRlIHRoZSBDVVJMT1BUX0ZUUExJU1RPTkxZIG1vZGUgd29yayBmb3IgU0ZUUCBkaXJlY3RvcnkKICBsaXN0aW5ncyBhcyB3ZWxsCgpEYW5pZWwgUyAoMjUgSnVuZSAyMDA3KQotIEFkanVzdGVkIGhvdyBsaWJjdXJsIHRyZWF0cyBIVFRQIDEuMSByZXNwb25zZXMgd2l0aG91dCBjb250ZW50LWxlbnRoIG9yCiAgY2h1bmtlZCBlbmNvZGluZyAodGhhdCBhbHNvIGxhY2tzICJDb25uZWN0aW9uOiBjbG9zZSIpLiBJdCBub3cgc2ltcGx5CiAgYXNzdW1lcyB0aGF0IHRoZSBjb25uZWN0aW9uIFdJTEwgYmUgY2xvc2VkIHRvIHNpZ25hbCB0aGUgZW5kLCBhcyB0aGF0IGlzIGhvdwogIFJGQzI2MTYgc2VjdGlvbiA0LjQgcG9pbnQgIzUgc2F5cyB3ZSBzaG91bGQgYmVoYXZlLgoKVmVyc2lvbiA3LjE2LjMgKDI1IEp1bmUgMjAwNykKCkRhbmllbCBTICgyMyBKdW5lIDIwMDcpCi0gQXMgcmVwb3J0ZWQgYnkgIlRybyIgaW4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxNjEuaHRtbCBhbmQKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMDYvMDIzOC5odG1sLCBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBkbwogIG5vLWJvZHkgcmVxdWVzdHMgb24gRlRQIGZpbGVzIG9uIHJlLXVzZWQgY29ubmVjdGlvbnMgcHJvcGVybHksIG9yIGF0IGxlYXN0CiAgaXQgZGlkbid0IHByb3ZpZGUgdGhlIGluZm8gYmFjayBpbiB0aGUgaGVhZGVyIGNhbGxiYWNrIHByb3Blcmx5IGluIHRoZQogIHN1YnNlcXVlbnQgcmVxdWVzdHMuCgpEYW5pZWwgUyAoMjEgSnVuZSAyMDA3KQotIEdlcnJpdCBCcnVjaGjkdXNlciBwb2ludGVkIG91dCBhIHdhcm5pbmcgdGhhdCB0aGUgSW50ZWwoUikgVGhyZWFkIENoZWNrZXIKICB0b29sIHJlcG9ydHMgYW5kIGl0IHdhcyBpbmRlZWQgYSBsZWdpdGltYXRlIG9uZSBhbmQgaXQgaXMgb25lIGZpeGVkLiBJdCB3YXMKICBhIHVzZSBvZiBhIHNoYXJlIHdpdGhvdXQgZG9pbmcgdGhlIHByb3BlciBsb2NraW5nIGZpcnN0LgoKRGFuaWVsIFMgKDIwIEp1bmUgMjAwNykKLSBBZGFtIFBpZ2dvdHQgZmlsZWQgYnVnIHJlcG9ydCAjMTc0MDI2MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzQwMjYzKS4gQWRhbSBkaXNjb3ZlcmVkIHRoYXQgd2hlbgogIGdldHRpbmcgYSBsYXJnZSBhbW91bnQgb2YgVVJMcyB3aXRoIGN1cmwsIHRoZXkgd2VyZSBmZXRjaGVkIHNsb3dlciBhbmQKICBzbG93ZXIuLi4gd2hpY2ggdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIHRoZSAtLWxpYmN1cmwgZGF0YSBjb2xsZWN0aW5nIHdoaWNoCiAgd3JvbmdseSBhbHdheXMgd2FzIGVuYWJsZWQsIGJ1dCBubyBsb25nZXIgaXMuLi4KCkRhbmllbCBTICgxOCBKdW5lIDIwMDcpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzM5MTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzkxMDApIHRoYXQgbWVudGlvbmVkIHRoYXQgbGliY3VybAogIGNvdWxkIG5vdCBhY3R1YWxseSBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBnaXZlbiBGVFAKICBzZXJ2ZXIgaWYgdGhlIGxvZ2luIGRpcmVjdG9yeSBpc24ndCByb290LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZAogIHRocmVlIHRlc3QgY2FzZXMgKG9uZSBpcyBkaXNhYmxlZCBmb3Igbm93IHNpbmNlIEkgaWRlbnRpZmllZCBLTk9XTl9CVUdTICM0NCwKICB3ZSBjYW5ub3QgdXNlIC0tZnRwLW1ldGhvZCBub2N3ZCBhbmQgbGlzdCBmdHAgZGlyZWN0b3JpZXMpLgoKRGFuaWVsIFMgKDE0IEp1bmUgMjAwNykKLSBTaG11bGlrIFJlZ2V2OgoKICBJJ3ZlIGVuY291bnRlcmVkIChhbmQgaG9wZWZ1bGx5IGZpeGVkKSBhIHByb2JsZW0gaW52b2x2aW5nIHByb3h5IENPTk5FQ1QKICByZXF1ZXN0cyBhbmQgZWFzeSBoYW5kbGVzIHN0YXRlIG1hbmFnZW1lbnQuIFRoZSBwcm9ibGVtIGlzbid0IHNpbXBsZSB0bwogIHJlcHJvZHVjZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHNvY2tldCBzdGF0ZS4gSXQgb25seSBtYW5pZmVzdHMgaXRzZWxmIHdoZW4KICB3b3JraW5nIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuCgogIEhlcmUgaXMgdGhlIHNjZW5hcmlvOgoKICAxLiBpbiBtdWx0aV9ydW5zaW5nbGUgdGhlIGVhc3kgaGFuZGxlIGlzIGluIHRoZSBDVVJMTV9TVEFURV9XQUlUQ09OTkVDVCBhbmQKICBjYWxscyBDdXJsX3Byb3RvY29sX2Nvbm5lY3QKCiAgMi4gaW4gQ3VybF9wcm94eUNPTk5FQ1QsIGxpbmUgMTI0NywgaWYgdGhlIHNvY2tldCBpc24ndCByZWFkeSB0aGUgZnVuY3Rpb24KICByZXR1cm5zIGFuZCBjb25uLT5iaXRzLnR1bm5lbF9jb25uZWN0aW5nIGlzIFRSVUUKCiAgMy4gd2hlbiB0aGUgY2FsbCB0byBDdXJsX3Byb3RvY29sX2Nvbm5lY3QgcmV0dXJucyB0aGUgcHJvdG9jb2xfY29ubmVjdCBmbGFnCiAgaXMgZmFsc2UgYW5kIHRoZSBlYXN5IHN0YXRlIGlzIGNoYW5nZWQgdG8gQ1VSTE1fU1RBVEVfUFJPVE9DT05ORUNUIHdoaWNoCiAgaXNuJ3QgY29ycmVjdCBpZiBhIHByb3h5IGlzIHVzZWQuICBSYXRoZXIgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVAogIHNob3VsZCBiZSB1c2VkLgoKICBJIGRpc2NvdmVyZWQgdGhpcyB3aGlsZSBwZXJmb3JtaW5nIGFuIEhUVFBTIHJlcXVlc3QgdGhyb3VnaCBhIHByb3h5IChzcXVpZCkKICBvbiBteSBsb2NhbCBuZXR3b3JrLiBUaGUgcHJvYmxlbSBjYXVzZWQgb3BlbnNzbCB0byBmYWlsIGFzIGl0IHJlYWQgdGhlIHByb3h5CiAgcmVzcG9uc2UgdG8gdGhlIENPTk5FQ1QgY2FsbCAoJ0hUVFAvMS4wIEVzdGFibGlzaGVkJykgcmF0aGVyIHRoYW4gdGhlIFNTTAogIGhhbmRzaGFrZSAodGhlIGV4YWN0IG9wZW5zc2wgZXJyb3Igd2FzICd3cm9uZyBzc2wgdmVyc2lvbicgYnV0IHRoaXMgaXNuJ3QKICB2ZXJ5IGltcG9ydGFudCkKCi0gRGF2ZSBWYXNpbGV2c2t5IGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzY4NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczNjg3NSkgYWxtb3N0IHNpbXVsdGFub3Vlc2x5IGFzIERhbgogIEZhbmRyaWNoIG1lbnRpb25lZCBhIHJlbGF0ZWQgYnVpbGQgcHJvYmxlbSBvbiB0aGUgbGliY3VybCBtYWlsaW5nIGxpc3Q6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxMzEuaHRtbC4gQm90aCBwcm9ibGVtcyBoYWQgdGhlIHNhbWUKICByZWFzb246IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgUE9MTCogZGVmaW5lcyBhbmQgdGhlIHBvbGxmZCBzdHJ1Y3QgaW4gdGhlCiAgbGliY3VybCBjb2RlIHdhcyBkZXBlbmRpbmcgb24gSEFWRV9QT0xMIGluc3RlYWQgb2YgSEFWRV9TWVNfUE9MTF9ILgoKRGFuaWVsIFMgKDEzIEp1bmUgMjAwNykKLSBUb20gUmVnbmVyIHByb3ZpZGVkIGEgcGF0Y2ggYW5kIHdvcmtlZCB0b2dldGhlciB3aXRoIEphbWVzIEhvdXNsZXksIHNvIG5vdwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgd29ya3MgZm9yIFNGVFAgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBGVFAKICBvbmVzLgoKLSBSaWNoIFJhdWVuemFobiBmaWxlZCBidWcgcmVwb3J0ICMxNzMzMTE5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzMxMTkpIGFuZCB3ZSBjb2xsYWJvcmF0ZWQgb24gdGhlCiAgZml4LiAgVGhlIHByb2JsZW0gaXMgdGhhdCBmb3IgNjRiaXQgSFBVWCBidWlsZHMsIHNldmVyYWwgc29ja2V0LXJlbGF0ZWQKICBmdW5jdGlvbnMgd291bGQgc3RpbGwgYXNzdW1lIGludCAoMzIgYml0KSBhcmd1bWVudHMgYW5kIG5vdCBzb2NrbGVuX3QgKDY0CiAgYml0KSBvbmVzLgoKRGFuaWVsIFMgKDEyIEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgaGlzIHJldmFtcGVkIFNTSCBjb2RlIHRoYXQgaXMgc3RhdGUtbWFjaGluZSBkcml2ZW4gdG8KICByZWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5vdyB0b3RhbGx5IG5vbi1ibG9ja2luZyBsaWJzc2gyIChpbiBDVlMpLgoKRGFuIEYgKDggSnVuZSAyMDA3KQotIEluY29ycG9yYXRlZCBEYW5pZWwgQmxhY2sncyB0ZXN0NzA2IGFuZCB0ZXN0NzA3IFNPQ0tTIHRlc3QgY2FzZXMuCgotIEZpeGVkIGEgZmV3IHByb2JsZW1zIHdoZW4gc3RhcnRpbmcgdGhlIFNPQ0tTIHNlcnZlci4KCi0gUmV2ZXJ0ZWQgc29tZSByZWNlbnQgY2hhbmdlcyB0byBydW50ZXN0cy5wbCB0aGF0IHdlcmVuJ3QgY29tcGF0aWJsZSB3aXRoCiAgcGVybCA1LjAuCgotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gdGhhdCBpdCBhY3R1YWxseSBraWxscyB0aGUgc3NoIGJlaW5nIHVzZWQgYXMKICB0aGUgU09DS1Mgc2VydmVyLgoKRGFuaWVsIFMgKDYgSnVuZSAyMDA3KQotIC1zLy0tc2lsZW50IGNhbiBub3cgYmUgdXNlZCB0byB0b2dnbGUgb2ZmIHRoZSBzaWxlbmNlIGFnYWluIGlmIHVzZWQgYSBzZWNvbmQKICB0aW1lLgoKRGFuaWVsIFMgKDUgSnVuZSAyMDA3KQotIEFkZGVkIERhbmllbCBCbGFjaydzIHdvcmsgdGhhdCBhZGRzIHRoZSBmaXJzdCBmZXcgU09DS1MgdGVzdCBjYXNlcy4gSSBhbHNvCiAgZml4ZWQgdHdvIG1pbm9yIFNPQ0tTIHByb2JsZW1zIHRvIG1ha2UgdGhlIHRlc3QgY2FzZXMgcnVuIGZpbmUuCgpEYW5pZWwgUyAoMzEgTWF5IDIwMDcpCi0gRmVuZyBUdSBtYWRlIChsaWIpY3VybCBzdXBwb3J0ICJ1cGxvYWQiIHJlc3VtaW5nIHdvcmsgZm9yIGZpbGU6Ly8gVVJMcy4KCkRhbmllbCBTICgzMCBNYXkgMjAwNykKLSBJIG1vZGlmaWVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIHRvIHRyYW5zZmVyIDUwMCBkb3dubG9hZHMgaW4gcGFyYWxsZWwKICB3aXRoIGEgYy1hcmVzIGVuYWJsZWQgYnVpbGQgb25seSB0byBmaW5kIHRoYXQgaXQgY3Jhc2hlZCBtaXNlcmFibHksIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBzb21lIHNlbGVjdCgpaXNtcyBsZWZ0IGluIHRoZSBjb2RlLiBUaGlzIHdhcyBkdWUgdG8gQVBJCiAgcmVzdHJpY3Rpb25zIGluIGMtYXJlcyAxLjMueCwgYnV0IHdpdGggdGhlIHVwY29taW5nIGMtYXJlcyAxLjQuMCB0aGlzIGlzIG5vCiAgbG9uZ2VyIHRoZSBjYXNlIHNvIG5vdyBsaWJjdXJsIHJ1bnMgbXVjaCBiZXR0ZXIgd2l0aCBjLWFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZSB3aXRoID4gMTAyNCBmaWxlIGRlc2NyaXB0b3JzIGluIHVzZS4KCiAgRXh0cmEgbm90ZTogc3RhcnRpbmcgbm93IHdlIHJlcXVpcmUgYy1hcmVzIDEuNC4wIGZvciBhc3luY2hyb25vdXMgbmFtZQogIHJlc29sdmVzLgoKLSBBZGRlZCBDVVJMTU9QVF9NQVhDT05ORUNUUyB3aGljaCBpcyBhIGN1cmxfbXVsdGlfc2V0b3B0KCkgb3B0aW9uIGZvciBzZXR0aW5nCiAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBjYWNoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG11bHRpIGhhbmRsZS4KCkRhbmllbCBTICgyNyBNYXkgMjAwNykKLSBXaGVuIHdvcmtpbmcgd2l0aCBhIHByb2JsZW0gU3RlZmFuIEJlY2tlciBoYWQsIEkgZm91bmQgYW4gb2ZmLWJ5LW9uZSBidWZmZXIKICBvdmVyd3JpdGUgaW4gQ3VybF9zZWxlY3QoKS4gV2hpbGUgZml4aW5nIGl0LCBJIGFsc28gaW1wcm92ZWQgaXRzIHBlcmZvcm1hbmNlCiAgc29tZXdoYXQgYnkgY2hhbmdpbmcgY2FsbG9jIHRvIG1hbGxvYyBhbmQgYnJlYWtpbmcgb3V0IG9mIGEgbG9vcCBlYXJsaWVyCiAgKHdoZW4gcG9zc2libGUpLgoKRGFuaWVsIFMgKDI1IE1heSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGZpeGVkIGJ1ZyAjMTcwNTgwMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1ODAyKSwgd2hpY2ggd2FzIGZpbGVkIGJ5IERhbmllbAogIEJsYWNrIGlkZW50aWZ5aW5nIHNldmVyYWwgRlRQLVNTTCB0ZXN0IGNhc2VzIGZhaWwgd2hlbiB3ZSBidWlsZCBsaWJjdXJsIHdpdGgKICBOU1MgZm9yIFRMUy9TU0wuIExpc3RlZCBhcyAjNDIgaW4gS05PV05fQlVHUy4KCkRhbmllbCBTICgyNCBNYXkgMjAwNykKLSBTb25nIE1hIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MjQwMTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyNDAxNikgbm90aWNpbmcgdGhhdCBkb3dubG9hZGluZwogIGdsb2ItcmFuZ2VzIGZvciBURlRQIHdhcyBicm9rZW4gaW4gQ1ZTLiBGaXhlZCBub3cuCgotICdteXR4JyBpbiBidWcgcmVwb3J0ICMxNzIzMTk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzIzMTk0KQogIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdhcm5mKCkgZnVuY3Rpb24gaW4gdGhlIGN1cmwgdG9vbCBkaWRuJ3QgcHJvcGVybHkgZGVhbAogIHdpdGggdGhlIGNhc2VzIHdoZW4gZXhjZXNzaXZlbHkgbG9uZyB3b3JkcyB3ZXJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjaG9wCiAgdXAuCgpEYW5pZWwgUyAoMjIgTWF5IDIwMDcpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIHRoZQogIHBlZXIncyBuYW1lIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgd2hlbiBidWlsdCBmb3IgT3BlblNTTC4gVGhlIGxlYWsgaGFwcGVucwogIGZvciBsaWJjdXJscyB3aXRoIENVUkxfRE9FU19DT05WRVJTSU9OUyBlbmFibGVkIHRoYXQgZmFpbCB0byBjb252ZXJ0IHRoZSBDTgogIG5hbWUgZnJvbSBVVEY4LiBIZSBhbHNvIGZpeGVkIGEgbGVhayB3aGVuIFBLQ1MgIzEyIHBhcnNpbmcgZmFpbGVkLgoKRGFuaWVsIFMgKDE4IE1heSAyMDA3KQotIEZlbmcgVHUgcmVwb3J0ZWQgdGhhdCBjdXJsIC13IGRpZCB3cm9uZyBvbiBURlRQIHRyYW5zZmVycyBpbiBidWcgcmVwb3J0CiAgIzE3MTUzOTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTQpLCBhbmQgdGhlCiAgdHJhbnNmZXItcmVsYXRlZCBpbmZvICJ2YXJpYWJsZXMiIHdlcmUgaW5kZWVkIG92ZXJ3cml0dGVuIHdpdGggemVyb2VzCiAgd3JvbmdseSBhbmQgaGF2ZSBub3cgYmVlbiBhZGp1c3RlZC4gVGhlIHVwbG9hZCBzaXplIHN0aWxsIGlzbid0IGFjY3VyYXRlLgoKRGFuaWVsIFMgKDE3IE1heSAyMDA3KQotIEZlbmcgVHUgcG9pbnRlZCBvdXQgYSBkaXZpc2lvbiBieSB6ZXJvIGVycm9yIGluIHRoZSBURlRQIGNvbm5lY3QgdGltZW91dAogIGNvZGUgZm9yIHRpbWVvdXRzIGxlc3MgdGhhbiBmaXZlIHNlY29uZHMsIGFuZCBhbHNvIHByb3ZpZGVkIGEgZml4IGZvciBpdC4KICBCdWcgcmVwb3J0ICMxNzE1MzkyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzE1MzkyKQoKRGFuIEYgKDE2IE1heSAyMDA3KQotIEFkZGVkIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB1bmRlciBNaW5peCAzLjEuMyB1c2luZyBBQ0suCgpEYW4gRiAoMTQgTWF5IDIwMDcpCi0gQWRkZWQgU0ZUUCBkaXJlY3RvcnkgbGlzdGluZyB0ZXN0IGNhc2UgNjEzLgoKLSBBZGRlZCBzdXBwb3J0IGZvciBxdW90ZSBjb21tYW5kcyBiZWZvcmUgYSB0cmFuc2ZlciB1c2luZyBTRlRQIGFuZCB0ZXN0CiAgY2FzZSA2MTQuCgotIENoYW5nZWQgdGhlIHBvc3QtcXVvdGUgY29tbWFuZHMgdG8gb2NjdXIgYWZ0ZXIgdGhlIHRyYW5zZmVycmVkIGZpbGUgaXMKICBjbG9zZWQuCgotIEFsbG93IFNGVFAgcXVvdGUgY29tbWFuZHMgY2htb2QsIGNob3duLCBjaGdycCB0byBzZXQgYSB2YWx1ZSBvZiAwLgoKRGFuIEYgKDkgTWF5IDIwMDcpCi0gS3Jpc3RpYW4gR3Vuc3RvbmUgZml4ZWQgYSBwcm9ibGVtIHdoZXJlIG92ZXJ3cml0aW5nIGFuIHVwbG9hZGVkIGZpbGUgd2l0aAogIHNmdHAgZGlkbid0IHRydW5jYXRlIGl0IGZpcnN0LCB3aGljaCB3b3VsZCBjb3JydXB0IHRoZSBmaWxlIGlmIHRoZSBuZXcKICBmaWxlIHdhcyBzaG9ydGVyIHRoYW4gdGhlIG9sZC4KCkRhbiBGICg4IE1heSAyMDA3KQotIEFkZGVkIEZUUFMgdGVzdCBjYXNlcyA0MDYgYW5kIDQwNwoKRGFuaWVsIFMgKDggTWF5IDIwMDcpCi0gQ1VSTEVfRlRQX0NPVUxETlRfU1RPUl9GSUxFIGlzIG5vdyBrbm93biBhcyBDVVJMRV9VUExPQURfRkFJTEVELiBUaGlzIGlzCiAgYmVjYXVzZSBJIGp1c3QgbWFkZSBTQ1AgdXBsb2FkcyByZXR1cm4gdGhpcyB2YWx1ZSBpZiB0aGUgZmlsZSBzaXplIG9mCiAgdGhlIHVwbG9hZCBmaWxlIGlzbid0IGdpdmVuIHdpdGggQ1VSTE9QVF9JTkZJTEVTSVpFKi4gRG9jcyB1cGRhdGVkIHRvCiAgcmVmbGVjdCB0aGlzIG5ld3MsIGFuZCBhIGRlZmluZSBmb3IgdGhlIG9sZCBuYW1lIHdhcyBhZGRlZCB0byB0aGUgcHVibGljCiAgaGVhZGVyIGZpbGUuCgpEYW5pZWwgUyAoNyBNYXkgMjAwNykKLSBKYW1lcyBCdXJzYSBmaXhlZCBhIGJ1ZyBpbiB0aGUgbXVsdGkgaGFuZGxlIGNvZGUgdGhhdCBtYWRlIHRoZSBjb25uZWN0aW9uCiAgY2FjaGUgZ3JvdyBhIGJpdCB0b28gbXVjaCwgYmV5b25kIHRoZSBub3JtYWwgNCAqIGVhc3lfaGFuZGxlcy4KCkRhbmllbCBTICgyIE1heSAyMDA3KQotIEFuZGVycyBHdXN0YWZzc29uIHJlbWFya2VkIHRoYXQgcmVxdWlyaW5nIENVUkxPUFRfSFRUUF9WRVJTSU9OIHNldCB0byAxLjAKICB3aGVuIENVUkxPUFRfSFRUUDIwMEFMSUFTRVMgaXMgdXNlZCB0byBhdm9pZCB0aGUgcHJvYmxlbSBtZW50aW9uZWQgYmVsb3cgaXMKICBub3QgdmVyeSBuaWNlIGlmIHRoZSBjbGllbnQgd2FudHMgdG8gYmUgYWJsZSB0byB1c2UgX2VpdGhlcl8gYSBIVFRQIDEuMQogIHNlcnZlciBvciBvbmUgd2l0aGluIHRoZSBhbGlhc2VzIGxpc3QuLi4gc28gc3RhcnRpbmcgbm93LCBsaWJjdXJsIHdpbGwKICBzaW1wbHkgY29uc2lkZXIgMjAwLWFsaWFzIG1hdGNoZXMgdGhlIHRvIGJlIEhUVFAgMS4wIGNvbXBsaWFudC4KCi0gVG9iaWFzIFJ1bmRzdHL2bSByZXBvcnRlZCBhIHByb2JsZW0gdGhleSBleHBlcmllbmNlZCB3aXRoIHhtbXMyIGFuZCByZWNlbnQKICBsaWJjdXJscywgd2hpY2ggdHVybmVkIG91dCB0byBiZSB0aGUgMjUtbm92LTIwMDYgY2hhbmdlIHdoaWNoIHRyZWF0cyBIVFRQCiAgcmVzcG9uc2VzIHdpdGhvdXQgQ29udGVudC1MZW5ndGggb3IgY2h1bmtlZCBlbmNvZGluZyBhcyB3aXRob3V0IGJvZGllcy4gV2UKICBub3cgYWRkZWQgdGhlIGNvbmRpdGlvbmFsIHRoYXQgdGhlIGFib3ZlIG1lbnRpb25lZCByZXNwb25zZSBpcyBvbmx5IHdpdGhvdXQKICBib2R5IGlmIHRoZSByZXNwb25zZSBpcyBIVFRQIDEuMS4KCi0gSmVmZiBQb2hsbWV5ZXIgaW1wcm92ZWQgdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgdG8gdXNlIHRoZQogIENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gY2FsbGJhY2sgb3B0aW9uLgoKLSBTZXQgdGhlIHRpbWVvdXQgZm9yIGVhc3kgaGFuZGxlcyB0byBleHBpcmUgcmVhbGx5IHNvb24gYWZ0ZXIgYWRkaXRpb24gb3IKICB3aGVuIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpcyByZXR1cm5lZCBmcm9tIGN1cmxfbXVsdGlfc29ja2V0Ki9wZXJmb3JtLAogIHRvIG1ha2UgYXBwbGljYXRpb25zIHVzaW5nIG9ubHkgY3VybF9tdWx0aV9zb2NrZXQoKSB0byBwcm9wZXJseSBmdW5jdGlvbgogIHdoZW4gYWRkaW5nIGVhc3kgaGFuZGxlcyAib24gdGhlIGZseSIuIEJ1ZyByZXBvcnQgYW5kIHRlc3QgYXBwIHByb3ZpZGVkIGJ5CiAgTWljaGFlbCBXYWxsbmVyLgoKRGFuIEYgKDMwIEFwcmlsIDIwMDcpCi0gSW1wcm92ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBhbGxvdyBydW5uaW5nIHRlc3Qgc2VydmVycyBvbiBvdGhlciB0aGFuCiAgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXJzLCBhbGxvd2luZyBtb3JlIHRoYW4gb25lIHRlc3Qgc3VpdGUgdG8gcnVuCiAgc2ltdWx0YW5lb3VzbHkgb24gdGhlIHNhbWUgaG9zdC4KCkRhbmllbCBTICgyOCBBcHJpbCAyMDA3KQotIFBldGVyIE8nR29ybWFuIGZpeGVkIGxpYmN1cmwgdG8gbm90IGluaXQgR251VExTIGFzIGVhcmx5IGFzIHdlIGRpZCBiZWZvcmUsCiAgc2luY2UgaXQgdGhlbiBpbml0cyBsaWJnY3J5cHQgYW5kIGxpYmdjcnlwdCBpcyBiZWluZyBldmlsIGFuZCBFWElUUyB0aGUKICBhcHBsaWNhdGlvbiBpZiBpdCBmYWlscyB0byBnZXQgYSBmaW5lIHJhbmRvbSBzZWVkLiBUaGF0J3MgcmVhbGx5IG5vdCBhIG5pY2UKICB0aGluZyB0byBkbyBieSBhIGxpYnJhcnkuCgotIEZyYW5rIEhlbXBlbCBmaXhlZCBhIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBjcmFzaCBvbiBhIGhhbmRsZSB0aGF0IGhhZAogIGJlZW4gcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlLCBhbmQgdGhlbiBmaXhlZCBhbm90aGVyIGZsYXcgdGhhdCBwcmV2ZW50ZWQKICBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgdG8gd29yayBldmVuIGFmdGVyIHRoZSBmaXJzdCBmaXggLSB0aGUgaGFuZGxlIHdhcwogIHN0aWxsIG1hcmtlZCBhcyB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKRGFuaWVsIFMgKDI2IEFwcmlsIDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gZm91bmQgYSBwcm9ibGVtIHdpdGggU0NQIGRvd25sb2FkcyB3aGVuIHRoZSBkb3dubG9hZGVkIGZpbGUKICB3YXMgMTYzODUgYnl0ZXMgKDE2SysxKSBhbmQgaXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgcHJvcGVybHkgYWx3YXlzICJzdWNrCiAgb3V0IiBhbGwgZGF0YSBmcm9tIGxpYnNzaDIuIFRoZSBlZmZlY3QgYmVpbmcgdGhhdCBsaWJjdXJsIHdvdWxkIGhhbmcgb24gdGhlCiAgc29ja2V0IHdhaXRpbmcgZm9yIGRhdGEgd2hlbiBsaWJzc2gyIGhhZCBpbiBmYWN0IGFscmVhZHkgcmVhZCBpdCBhbGwuLi4KCkRhbiBGICgyNSBBcHJpbCAyMDA3KQotIEFkZGVkIHN1cHBvcnQgaW4gcnVudGVzdHMucGwgZm9yICIhbiIgdGVzdCBudW1iZXJzIHRvIGRpc2FibGUgaW5kaXZpZHVhbAogIHRlc3RzLiAgQ2hhbmdlZCAtdCB0byBvbmx5IGtlZXAgbG9nIGZpbGVzIGFyb3VuZCB3aGVuIC1rIGlzIHNwZWNpZmllZCwKICB0byBoYXZlIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB3aXRob3V0IC10LgoKRGFuaWVsIFMgKDI1IEFwcmlsIDIwMDcpCi0gU29uaWEgU3VicmFtYW5pYW4gYnJvdWdodCBvdXIgYXR0ZW50aW9uIHRvIGEgcHJvYmxlbSB0aGF0IGhhcHBlbnMgaWYgeW91IHNldAogIHRoZSBDVVJMT1BUX1JFU1VNRV9GUk9NIG9yIENVUkxPUFRfUkFOR0Ugb3B0aW9ucyBhbmQgYW4gZXhpc3RpbmcgY29ubmVjdGlvbgogIGluIHRoZSBjb25uZWN0aW9uIGNhY2hlIGlzIGNsb3NlZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgb25lIHdoZW4geW91IGNhbGwKICBjdXJsX2Vhc3lfcGVyZm9ybSgpLiBJdCB3b3VsZCB0aGVuIHdyb25nbHkgZnJlZSByYW5nZS1yZWxhdGVkIGRhdGEgaW4gdGhlCiAgY29ubmVjdGlvbiBjbG9zZSBmdW50aW9uLgoKWWFuZyBUc2UgKDI1IEFwcmlsIDIwMDcpCi0gU3RldmUgTGl0dGxlIGZpeGVkIGNvbXBpbGF0aW9uIG9uIFZNUyA2NC1iaXQgbW9kZQoKRGFuaWVsIFMgKDI0IEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBtYWRlIHRoZSAnbWFzdGVyX2J1ZmZlcicgZ2V0IGFsbG9jYXRlZCBmaXJzdCBvbmNlIGl0IGlzCiAgY2FuL3dpbGwgYmUgdXNlZCBhcyBpdCB0aGVuIG1ha2VzIHRoZSBjb21tb24gY2FzZXMgc2F2ZSAxNktCIG9mIGRhdGEgZm9yIGVhY2gKICBlYXN5IGhhbmRsZSB0aGF0IGlzbid0IHVzZWQgZm9yIHBpcGVsaW5pbmcuCgpEYW4gRiAoMjMgQXByaWwgMjAwNykKLSBBZGRlZCA8cG9zdGNoZWNrPiBzdXBwb3J0IHRvIHRoZSB0ZXN0IGhhcm5lc3MuCgotIEFkZGVkIHRlc3RzIDYxMC02MTIgdG8gdGVzdCBtb3JlIFNGVFAgcG9zdC1xdW90ZSBjb21tYW5kcy4KCkRhbmllbCBTICgyMiBBcHJpbCAyMDA3KQotIFNvbmcgTWEncyB3YXJuaW5nIGlmIC1yLy0tcmFuZ2UgaXMgZ2l2ZW4gd2l0aCBhICJiYWQiIHJhbmdlLCBhbHNvIG5vdGVkIGluCiAgdGhlIG1hbiBwYWdlIG5vdy4KCi0gRGFuaWVsIEJsYWNrIGZpbGVkIGJ1ZyAjMTcwNTE3NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1MTc3KSB3aGVyZSAtLXdpdGhvdXQtc3NsCiAgLS13aXRoLWdudXRsIG91dHB1dHMgYSB3YXJuaW5nIGFib3V0IFNTTCBub3QgYmVpbmcgZW5hYmxlZCBldmVuIHRob3VnaCBHbnVUTFMKICB3YXMgZm91bmQgYW5kIHVzZWQuCgpEYW5pZWwgUyAoMjEgQXByaWwgMjAwNykKLSBEYW5pZWwgQmxhY2sgZmlsZWQgYnVnICMxNzA0Njc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDQ2NzUpIGlkZW50aWZ5aW5nIGEgZG91YmxlLWZyZWUKICBwcm9ibGVtIGluIHRoZSBTU0wtZGVhbGluZyBsYXllciwgdGVsbGluZyBHbnVUTFMgdG8gZnJlZSBOVUxMIGNyZWRlbnRpYWxzIG9uCiAgY2xvc2Vkb3duIGFmdGVyIGEgZmFpbHVyZSBhbmQgYSBiYWQgI2lmZGVmIGZvciBOU1Mgd2hlbiBjbG9zaW5nIGRvd24gU1NMLgoKWWFuZyBUc2UgKDIwIEFwcmlsIDIwMDcpCi0gU2F2ZSBvbmUgY2FsbCB0byBjdXJseF90dm5vdygpLCB3aGljaCBjYWxscyBnZXR0aW1lb2ZkYXkoKSwgaW4gZWFjaCBvZgogIEN1cmxfc29ja2V0X3JlYWR5KCksIEN1cmxfcG9sbCgpIGFuZCBDdXJsX3NlbGVjdCgpIHdoZW4gdGhlc2UgYXJlIGNhbGxlZAogIHdpdGggYSB6ZXJvIHRpbWVvdXQgb3IgYSB0aW1lb3V0IHZhbHVlIGluZGljYXRpbmcgYSBibG9ja2luZyBjYWxsIHNob3VsZAogIGJlIHBlcmZvcm1lZC4KCkRhbmllbCBTICgxOCBBcHJpbCAyMDA3KQotIEphbWVzIEhvdXNsZXkgbWFkZSBTRlRQIHVwbG9hZHMgdXNlIGxpYnNzaDIncyBub24tYmxvY2tpbmcgQVBJCgotIFByZXZlbnQgdGhlIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGZyb20gdXBkYXRpbmcgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZQogIHBlciBzZWNvbmQuCgpEYW4gRiAoMTcgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NiwgMjk3IGFuZCAyOTggdG8gdGVzdCAtLWZ0cC1tZXRob2QgaGFuZGxpbmcKCkRhbmllbCBTICgxNiBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbCBhZGRlZCBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSB0byBsaWJjdXJsLCB3aGljaCBpcyBhCiAgZnVuY3Rpb24gdGhhdCBkZXByZWNhdGVzIHRoZSBjdXJsX211bHRpX3NvY2tldCgpIGZ1bmN0aW9uLiBVc2luZyB0aGUgbmV3CiAgZnVuY3Rpb24gdGhlIGFwcGxpY2F0aW9uIHRlbGwgbGliY3VybCB3aGF0IGFjdGlvbiB0aGF0IHdhcyBmb3VuZCBpbiB0aGUKICBzb2NrZXQgdGhhdCBpdCBwYXNzZXMgaW4uIFRoaXMgZ2l2ZXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdCBhcyBpdAogIGFsbG93cyBsaWJjdXJsIHRvIGF2b2lkIGEgY2FsbCB0byBwb2xsKCkvc2VsZWN0KCkgZm9yIGV2ZXJ5IGNhbGwgdG8KICBjdXJsX211bHRpX3NvY2tldCooKS4KCiAgSSBhZGRlZCBhIGRlZmluZSBpbiB0aGUgcHVibGljIGN1cmwvbXVsdGkuaCBoZWFkZXIgZmlsZSB0aGF0IHdpbGwgbWFrZSB5b3VyCiAgZXhpc3RpbmcgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSB1c2UgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgaW5zdGVhZCBvZgogIGN1cmxfbXVsdGlfc29ja2V0KCkgd2hlbiB5b3UgcmVjb21waWxlLiBCdXQgb2YgY291cnNlIHlvdSdsbCBnZXQgYmV0dGVyCiAgcGVyZm9ybWFuY2UgaWYgeW91IGFkanVzdCB5b3VyIGNvZGUgbWFudWFsbHkgYW5kIGFjdHVhbGx5IHBhc3MgaW4gdGhlCiAgY29ycmVjdCBhY3Rpb24gYml0bWFzayB0byB0aGlzIGZ1bmN0aW9uLgoKRGFuaWVsIFMgKDE0IEFwcmlsIDIwMDcpCi0gSmF5IEF1c3RpbiBhZGRlZCAiREggUEFSQU1FVEVSUyIgdG8gdGhlIHN0dW5uZWwucGVtIGNlcnRpZmljYXRlIGZvciB0aGUgdGVzdAogIHN1aXRlIHRvIG1ha2Ugc3R1bm5lbCBydW4gYmV0dGVyIGluIHNvbWUgKG1vc3Q/KSBlbnZpcm9ubWVudHMuCgpEYW4gRiAoMTMgQXByaWwgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2VzIDI5NCBhbmQgMjk1IHRvIHRlc3QgLS1mdHAtYWNjb3VudCBoYW5kbGluZwoKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIGZ0cC4KCllhbmcgVHNlICgxMyBBcHJpbCAyMDA3KQotIEZpeCB0ZXN0IGNhc2UgNTM0IHdoaWNoIHN0YXJ0ZWQgdG8gZmFpbCAyMDA3LTA0LTEzIGR1ZSB0byB0aGUgZXhpc3RhbmNlCiAgb2YgYSBuZXcgaG9zdCBvbiB0aGUgbmV0IHdpdGggdGhlIHNhbWUgc2lsbHkgZG9tYWluIHRoZSB0ZXN0IHdhcyB1c2luZwogIGZvciBhIGhvc3Qgd2hpY2ggd2FzIHN1cHBvc2VkIG5vdCB0byBleGlzdC4KCkRhbmllbCBTICgxMiBBcHJpbCAyMDA3KQotIFNvbmcgTWEgZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgaWYyaXAgY29kZSBpZiB5b3UgcGFzcyBpbiBhbiBpbnRlcmZhY2UKICBuYW1lIGxvbmdlciB0aGFuIHRoZSBuYW1lIGZpZWxkIG9mIHRoZSBpZnJlcSBzdHJ1Y3QgKHR5cGljYWxseSA2IGJ5dGVzKSwgYXMKICB0aGVuIGl0IHdvdWxkbid0IGNsb3NlIHRoZSB1c2VkIGR1bW15IHNvY2tldC4gQnVnICMxNjk4OTc0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2OTg5NzQpCgpWZXJzaW9uIDcuMTYuMiAoMTEgQXByaWwgMjAwNykKCllhbmcgVHNlICgxMCBBcHJpbCAyMDA3KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIHNvbWUgZml4ZXMgZm9yIEhUVFAgcGlwZWxpbmluZwoKLSBjb25maWd1cmUgc2NyaXB0IHdpbGwgaWdub3JlIC0tZW5hYmxlLXNzcGkgb3B0aW9uIGZvciBub24tbmF0aXZlIFdpbmRvd3MuCgpEYW5pZWwgUyAoOSBBcHJpbCAyMDA3KQotIE5pY2sgWml0em1hbm4gZGlkIHNzaC5jIGNsZWFudXBzCgpEYW5pZWwgUyAoMyBBcHJpbCAyMDA3KQotIFJvYiBKb25lcyBmaXhlZCBiZXR0ZXIgI2lmZGVmJ2luZyBmb3IgYSBidW5jaCBvZiAjaW5jbHVkZSBsaW5lcy4KCkRhbmllbCBTICgyIEFwcmlsIDIwMDcpCi0gTmljayBaaXR6bWFubiBtYWRlIHRoZSBDVVJMT1BUX1BPU1RRVU9URSBvcHRpb24gd29yayBmb3IgU0ZUUCBhcyB3ZWxsLiBUaGUKICBhY2NlcHRlZCBjb21tYW5kcyBhcmUgYXMgZm9sbG93czoKCiAgY2hncnAgKGdpZCkgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSBncm91cCBJRCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvIChnaWQpLiAoZ2lkKQogICAgbXVzdCBiZSBhIG51bWJlci4KCiAgY2htb2QgKHBlcm1zKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8KICAgIChwZXJtcykuIChwZXJtcykgbXVzdCBiZSBhIG51bWJlciBpbiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIGNobW9kIFVuaXgKICAgIGNvbW1hbmQuCgogIGNob3duICh1aWQpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgdXNlciBJRCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvICh1aWQpLiAodWlkKQogICAgbXVzdCBiZSBhIG51bWJlci4KCiAgbG4gKHNvdXJjZSkgKGRlc3QpCiAgICBDcmVhdGVzIGEgc3ltYm9saWMgbGluayBhdCAoZGVzdCkgdGhhdCBwb2ludHMgdG8gdGhlIGZpbGUgbG9jYXRlZCBhdAogICAgKHNvdXJjZSkuCgogIG1rZGlyIChwYXRoKQogICAgQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgYXQgKHBhdGgpLgoKICByZW5hbWUgKHNvdXJjZSkgKGRlc3QpCiAgICBNb3ZlcyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHNvdXJjZSkgdG8gKGRlc3QpLgoKICBybSAocGF0aCkKICAgIERlbGV0ZXMgdGhlIGZpbGUgbG9jYXRlZCBhdCAocGF0aCkuCgogIHJtZGlyIChwYXRoKQogICAgRGVsZXRlcyB0aGUgZGlyZWN0b3J5IGxvY2F0ZWQgYXQgKHBhdGgpLiBUaGlzIGNvbW1hbmQgd2lsbCByYWlzZSBhbiBlcnJvcgogICAgaWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkuCgogIHN5bWxpbmsgKHNvdXJjZSkgKGRlc3QpCiAgICBTYW1lIGFzIGxuLgoKRGFuaWVsIFMgKDEgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIG1hZGUgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgYSBsb3QgZmFzdGVyIHdoZW4gbWFueQogIGVhc3kgaGFuZGxlcyBhcmUgYWRkZWQgdG8gYSBtdWx0aSBoYW5kbGUsIGJ5IGF2b2lkaW5nIHRoZSBsb29waW5nIG92ZXIgYWxsCiAgdGhlIGhhbmRsZXMgdG8gZmluZCB3aGljaCBvbmUgdG8gcmVtb3ZlLgoKLSBNYXR0IEtyYWFpIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBjdXJsIGJ1aWxkIG9uIFFOWCA2IGZpbmUgYWdhaW4uCgpEYW5pZWwgUyAoMzEgTWFyY2ggMjAwNykKLSBGaXhlZCBzZXZlcmFsIG1pbm9yIGlzc3VlcyBkZXRlY3RlZCBieSB0aGUgY292ZXJpdHkuY29tIHNjYW5uZXIuCgotICJQaXhlbCIgZml4ZWQgYSBwcm9ibGVtIHRoYXQgYXBwZWFyZWQgd2hlbiB5b3UgdXNlZCAtZiB3aXRoIHVzZXIrcGFzc3dvcmQKICBlbWJlZGRlZCBpbiB0aGUgVVJMLgoKRGFuIEYgKDI5IE1hcmNoIDIwMDcpCi0gRG9uJ3QgdGVhciBkb3duIHRoZSBmdHAgY29ubmVjdGlvbiBpZiB0aGUgbWF4aW11bSBmaWxlc2l6ZSB3YXMgZXhjZWVkZWQKICBhbmQgYWRkZWQgdGVzdHMgMjkwIGFuZCAyOTEgdG8gY2hlY2suCgotIEFkZGVkIGZ0cHMgdXBsb2FkIGFuZCBTU0wgcmVxdWlyZWQgdGVzdHMgNDAxIGFuZCA0MDIuCgotIFNlbmQgYW4gRU9GIG1lc3NhZ2UgYmVmb3JlIGNsb3NpbmcgYW4gU0NQIGNoYW5uZWwsIGFzIHJlY29tbWVuZGVkIGJ5CiAgUkZDNDI1NC4gRW5hYmxlIGxpYnNzaDIgdHJhY2luZyB3aGVuIHNzaCBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLgoKWWFuZyBUc2UgKDI3IE1hcmNoIDIwMDcpCi0gSW50ZXJuYWwgZnVuY3Rpb24gQ3VybF9zZWxlY3QoKSByZW5hbWVkIHRvIEN1cmxfc29ja2V0X3JlYWR5KCkKCiAgTmV3IEludGVybmFsIHdyYXBwZXIgZnVuY3Rpb24gQ3VybF9zZWxlY3QoKSBhcm91bmQgc2VsZWN0ICgyKSwgaXQKICB1c2VzIHBvbGwoKSB3aGVuIGEgZmluZSBwb2xsKCkgaXMgYXZhaWxhYmxlLCBzbyBub3cgbGliY3VybCBjYW4gYmUKICBidWlsdCB3aXRob3V0IHNlbGVjdCgpIHN1cHBvcnQgYXQgYWxsIGlmIGEgZmluZSBwb2xsKCkgaXMgYXZhaWxhYmxlLgoKRGFuaWVsIFMgKDI1IE1hcmNoIDIwMDcpCi0gRGFuaWVsIEpvaG5zb24gZml4ZWQgbXVsdGkgY29kZSB0byB0cmF2ZXJzZSB0aGUgZWFzeSBoYW5kbGUgbGlzdCBwcm9wZXJseS4KICBBIGxlZnQtb3ZlciBidWcgZnJvbSB0aGUgRmVicnVhcnkgMjEgZml4LgoKRGFuIEYgKDIzIE1hcmNoIDIwMDcpCi0gQWRkZWQgLS1wdWJrZXkgb3B0aW9uIHRvIGN1cmwgYW5kIG1hZGUgLS1rZXkgYWxzbyB3b3JrIGZvciBTQ1AvU0ZUUCwKICBwbHVzIG1hZGUgLS1wYXNzIHdvcmsgb24gYW4gU1NIIHByaXZhdGUga2V5IGFzIHdlbGwuCgotIENoYW5nZWQgdGhlIHRlc3QgaGFybmVzcyB0byBhdHRlbXB0IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHNlcnZlcnMKICBiZWZvcmUgcmVzb3J0aW5nIHRvIHRoZSBraWxsIC05IGhhbW1lci4KCi0gQWRkZWQgdGVzdCBoYXJuZXNzIGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgc2NwL3NmdHAgdGVzdHMsIHVzaW5nCiAgT3BlblNTSCBhcyB0aGUgc2VydmVyLgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gc3BlY2lmeWluZyBhIHByb3h5IHdpdGggYSBmaWxlOiBVUkwuCgpZYW5nIFRzZSAoMjAgTWFyY2ggMjAwNykKLSBGaXhlZDogV2hlbiBhIHNpZ25hbCB3YXMgY2F1Z2h0IGF3YWl0aW5nIGZvciBhbiBldmVudCB1c2luZyBDdXJsX3NlbGVjdCgpCiAgb3IgQ3VybF9wb2xsKCkgd2l0aCBhIG5vbi16ZXJvIHRpbWVvdXQgYm90aCBmdW5jdGlvbnMgd291bGQgcmVzdGFydCB0aGUKICBzcGVjaWZpZWQgdGltZW91dC4gVGhpcyBjb3VsZCBldmVuIGxlYWQgdG8gdGhlIGV4dHJlbWUgY2FzZSB0aGF0IGlmIGEKICBzaWduYWwgYXJyaXZlZCB3aXRoIGEgZnJlY3VlbmN5IGxvd2VyIHRvIHRoZSBzcGVjaWZpZWQgdGltZW91dCBuZWl0aGVyCiAgZnVuY3Rpb24gd291bGQgZXZlciBleGl0LgoKICBBZGRlZCBleHBlcmltZW50YWwgc3ltYm9sIGRlZmluaXRpb24gY2hlY2sgQ1VSTF9BQ0tOT1dMRURHRV9FSU5UUiBpbgogIEN1cmxfc2VsZWN0KCkgYW5kIEN1cmxfcG9sbCgpLiBXaGVuIGNvbXBpbGVkIHdpdGggQ1VSTF9BQ0tOT1dMRURHRV9FSU5UUgogIGRlZmluZWQgYm90aCBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYXMgc29vbiBhcyBhIHNpZ25hbCBpcyBjYXVnaHQuIFVzZSBpdAogIGF0IHlvdXIgb3duIHJpc2ssIGFsbCBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkgc2hvdWxkIGJlCiAgcmV2aXNpdGVkIGFuZCBjaGVja2VkIGJlZm9yZSBmdWxseSBzdXBwb3J0aW5nIHRoaXMgZmVhdHVyZS4KCllhbmcgVHNlICgxOSBNYXJjaCAyMDA3KQotIEJyeWFuIEhlbmRlcnNvbiBmaXhlZCB0aGUgcHJvZ3Jlc3MgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gZ2V0IGNhbGxlZCBtb3JlCiAgZnJlcXVlbnRseSBhbGxvd2luZyBzYW1lIGNhbGxpbmcgZnJlY3VlbmN5IGZvciB0aGUgY2xpZW50IHByb2dyZXNzIGNhbGxiYWNrLgoKRGFuIEYgKDE1IE1hcmNoIDIwMDcpCi0gVmFyaW91cyBtZW1vcnkgbGVha3MgcGx1Z2dlZCBhbmQgTlVMTCBwb2ludGVyIGZpeGVzIG1hZGUgaW4gdGhlIHNzaCBjb2RlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA3KQotIE5pY2sgbWFkZSB0aGUgY3VybCB0b29sIGFjY2VwdCBnbG9iYmluZyByYW5nZXMgdGhhdCBvbmx5IGlzIG9uZSBudW1iZXIsIGkuZQogIHlvdSBjYW4gbm93IHVzZSBbMS0xXSB3aXRob3V0IGN1cmwgY29tcGxhaW5pbmcuCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDcpCi0gRXlnZW5lIFJ5YWJpbmtpbjoKCiAgVGhlIHByb2JsZW0gaXMgdGhlIGZvbGxvd2luZzogd2hlbiB3ZSdyZSBjYWxsaW5nIEN1cmxfZG9uZSBhbmQgaXQgZGVjaWRlcyB0bwogIGtlZXAgdGhlIGNvbm5lY3Rpb24gb3BlbmVkICgnbGVmdCBpbnRhY3QnKSwgdGhlbiB0aGUgY2FsbGVyIGlzIG5vdCBub3RpZmllZAogIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRvbmUgdmlhIHRoZSBOVUxMaWZ5aW5nIG9mIHRoZSBwb2ludGVyLCBzbyBzb21lIGVhc3kKICBoYW5kbGUgaXMga2VlcGluZyB0aGUgcG9pbnRlciB0byB0aGlzIGNvbm5lY3Rpb24uCgogIExhdGVyIENvbm5lY3Rpb25FeGlzdHMgY2FuIHNlbGVjdCBzdWNoIGNvbm5lY3Rpb24gZm9yIHJldXNlIGV2ZW4gaWYgd2UncmUKICBub3QgcGlwZWxpbmluZzogcGlwZUxlbiBpcyB6ZXJvLCBzbyB0aGUgKHBpcGVMZW4gPiAwICYmICFjYW5QaXBlbGluZSkgaXMKICBmYWxzZSBhbmQgd2UgY2FuIHJldXNlIHRoaXMgY29ubmVjdGlvbiBmb3IgYW5vdGhlciBlYXN5IGhhbmRsZS4gQnV0IHRodXMgdGhlCiAgY29ubmVjdGlvbiB3aWxsIGJlIHNoYXJlZCBiZXR3ZWVuIHR3byBlYXN5IGhhbmRsZXMgaWYgdGhlIGhhbmRsZSB0aGF0IHdhbnRzCiAgdG8gdGFrZSB0aGUgb3duZXJzaGlwIGlzIG5vdCB0aGUgc2FtZSBhcyB3YXMgbm90IG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uCiAgd2FzIGRvbmUgaW4gQ3VybF9kb25lLiBBbmQgd2hlbiBzb21lIG9mIHRoZXNlIGVhc3kgaGFuZGxlcyB3aWxsIGdldCB0aGVpcgogIGNvbm5lY3Rpb24gcmVhbGx5IGZyZWVkIHRoZSBhbm90aGVyIG9uZSB3aWxsIHN0aWxsIGtlZXAgdGhlIHBvaW50ZXIuCgogIE15IGZpeCB3YXMgcmF0aGVyIHRyaXZpYWw6IEkganVzdCBhZGRlZCB0aGUgTlVMTGlmaWNhdGlvbiB0byB0aGUgJ2Vsc2UnCiAgYnJhbmNoIGluIHRoZSBDdXJsX2RvbmUuIE15IHRlc3RzIHdpdGggR2l0IGFuZCBFbGVjdHJpY0ZlbmNlIHNob3dlZCBubwogIHByb2JsZW1zIGJvdGggZm9yIEhUVFAgcHVsbGluZyBhbmQgY2xvbmluZy4gUmVwb3NpdG9yeSBzaXplIGlzIGFib3V0IDI1MCBNYiwKICBzbyBpdCB3YXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIEN1cmwncyB3b3JrLgoKRGFuIEYgKDkgTWFyY2ggMjAwNykKLSBVcGRhdGVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYWRkIGEgbmV3ICJjcnlwdG8iIGZlYXR1cmUgY2hlY2sgYW5kIHVwZGF0ZWQgdGhlCiAgYXBwcm9wcmlhdGUgdGVzdCBjYXNlIHRvIHVzZSBpdC4gIEZvciBub3csIHRoaXMgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyB0aGUKICAiU1NMIiBmZWF0dXJlIGJlY2F1c2UgY3VybCBkb2Vzbid0IGxpc3QgaXQgc2VwYXJhdGVseS4KCkRhbmllbCAoOSBNYXJjaCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgZml4ZWQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIElQdjYuCgotIFJvYmVydCBBLiBNb25hdCBpbXByb3ZlZCB0aGUgbWFrZXRneiBhbmQgVkM2LzggZ2VuZXJhdGluZyB0byBzZXQgdGhlIGNvcnJlY3QKICBtYWNoaW5lIHR5cGUgdG9vLgoKLSBKdXN0aW4gRmxldGNoZXIgZml4ZWQgYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiB0aGUgY3VybCB0b29sIHdoZW4gdHJ5aW5nIHRvCiAgdXBsb2FkIGEgZmlsZSBpdCBjb3VsZG4ndCBvcGVuLiBCdWcgIzE2NzY1ODEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTY3NjU4MSkKCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGNoZWNrIGZvciBwcm90b2NvbCBzdXBwb3J0IGJlZm9yZSBydW5uaW5nIGVhY2gKICB0ZXN0LCBmaXhpbmcgS05PV05fQlVHUyAjMTEuCgpEYW4gRiAoNyBNYXJjaCAyMDA3KQotIFJlaW50cm9kdWNlZCAoYWZ0ZXIgYSAzIHllYXIgaGlhdHVzKSBhbiBGVFBTIHRlc3QgY2FzZSAoNDAwKSBpbnRvIHRoZSB0ZXN0CiAgaGFybmVzcy4gIEl0IGlzIHZlcnkgbGltaXRlZCBhcyBpdCBzdXBwb3J0cyBvbmx5IGZ0cHM6Ly8gVVJMcyB3aXRoCiAgLS1mdHAtc3NsLWNvbnRyb2wgc3BlY2lmaWVkLCB3aGljaCBpbXBsaWNpdGx5IGVuY3J5cHRzIHRoZSBjb250cm9sCiAgY2hhbm5lbCBidXQgbm90IHRoZSBkYXRhIGNoYW5uZWxzLiAgVGhhdCBhbGxvd3Mgc3R1bm5lbCB0byBiZSB1c2VkIHdpdGgKICBhbiB1bm1vZGlmaWVkIGZ0cCBzZXJ2ZXIgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgdGVzdCBodHRwcwogIHNlcnZlciBpcyBzZXQgdXAuCgpEYW4gRiAoNyBNYXJjaCAyMDA3KQotIEhvbm91ciAtLWZ0cC1zc2wtY29udHJvbCBvbiBmdHBzOi8vIFVSTHMgdG8gYWxsb3cgZW5jcnlwdGVkIGNvbnRyb2wgYW5kCiAgdW5lbmNyeXB0ZWQgZGF0YSBjb25uZWN0aW9ucy4KCkRhbiBGICg2IE1hcmNoIDIwMDcpCi0gRml4ZWQgYSBjb3VwbGUgb2YgaW1wcm9wZXIgcG9pbnRlciB1c2VzIGRldGVjdGVkIGJ5IHZhbGdyaW5kIGluIHRlc3QKICBjYXNlcyAxODEgJiAyMTYuCgpEYW5pZWwgKDIgTWFyY2ggMjAwNykKLSBSb2JlcnQgQS4gTW9uYXQgYW5kIFNobXVsaWsgUmVnZXYgaGVscGVkIG91dCB0byBmaXggdGhlIG5ldyAqL01ha2VmaWxlLnZjOAogIG1ha2VmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIHJlbGVhc2UgYXJjaGl2ZXMsIGdlbmVyYXRlZCBmcm9tCiAgdGhlIE1ha2VmaWxlLnZjNiBmaWxlcyBieSB0aGUgbWFrZXRneiBzY3JpcHQuIEkgYWxzbyBtb2RpZmllZCB0aGUgcm9vdAogIE1ha2VmaWxlIHRvIGhhdmUgYSBWQyB2YXJpYWJsZSB0aGF0IGRlZmF1bHRzIHRvIHZjNiBidXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8KICBhbGxvdyBpdCB0byBiZSB1c2VkIGZvciB2YzggYXMgd2VsbC4gTGlrZSB0aGlzOgoKICAgIG5tYWtlIFZDPXZjOCB2YwoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA3KQotIEhhbmcgS2luIExhdSBmb3VuZCBhbmQgZml4ZWQ6IFdoZW4gSSB1c2UgbGliY3VybCB0byBjb25uZWN0IHRvIGFuIGh0dHBzCiAgc2VydmVyIHRocm91Z2ggYSBwcm94eSBhbmQgaGF2ZSB0aGUgcmVtb3RlIGh0dHBzIHNlcnZlciBwb3J0IHNldCB1c2luZyB0aGUKICBDVVJMT1BUX1BPUlQgb3B0aW9uLCBwcm90b2NvbCBnZXRzIHJlc2V0IHRvIGh0dHAgZnJvbSBodHRwcyBhZnRlciB0aGUgZmlyc3QKICByZXF1ZXN0LgoKICBVc2VyIGRlZmluZWQgVVJMIHdhcyBtb2RpZmllZCBpbnRlcm5hbGx5IGJ5IGxpYmN1cmwgYW5kIHN1YnNlcXVlbnQgcmV1c2Ugb2YKICB0aGUgZWFzeSBoYW5kbGUgbWF5IGxlYWQgdG8gY29ubmVjdGlvbiB1c2luZyBhIGRpZmZlcmVudCBwcm90b2NvbCAoaWYgbm90CiAgb3JpZ2luYWxseSBodHRwKS4KCiAgSSBmb3VuZCB0aGF0IGxpYmN1cmwgaGFyZGNvZGVkIHRoZSBwcm90b2NvbCB0byAiaHR0cCIgd2hlbiBpdCB0cmllcyB0bwogIHJlZ2VuZXJhdGUgdGhlIFVSTCBpZiBDVVJMT1BUX1BPUlQgaXMgc2V0LiBJIHRyaWVkIHRvIGZpeCB0aGUgcHJvYmxlbSBhcwogIGZvbGxvd3MgYW5kIGl0J3Mgd29ya2luZyBmaW5lIHNvIGZhcgoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA3KQotIEFkYW0gRC4gTW9zcyBtYWRlIHRoZSBIVFRQIENPTk5FQ1QgcHJvY2VkdXJlIGxlc3MgYmxvY2tpbmcgd2hlbiB1c2VkIGZyb20KICB0aGUgbXVsdGkgaW50ZXJmYWNlLiBOb3RlIHRoYXQgaXQgc3RpbGwgZG9lcyBhIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gaW4gYQogIGJsb2NraW5nIG1hbm5lci4KCkRhbmllbCAoMjMgRmVicnVhcnkgMjAwNykKLSBBZGRlZCB3YXJuaW5nIG91dHB1dHMgaWYgdGhlIGNvbW1hbmQgbGluZSB1c2VzIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnMKICAtdiwgLS10cmFjZSBhbmQgLS10cmFjZS1hc2NpaSwgc2luY2UgaXQgY291bGQgcmVhbGx5IGNvbmZ1c2UgdGhlIHVzZXIuCiAgQ2xhcmlmaWVkIHRoaXMgZmFjdCBpbiB0aGUgbWFuIHBhZ2UuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgd29yayBvbiBsaWJjdXJsIG1ha2luZyBwaXBlbGluaW5nIG1vcmUgcm9idXN0IGFuZAogIGZpeGluZyBzb21lIGJ1Z3M6CiAgbyBEb24ndCBtaXggR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGluIGEgcGlwZWxpbmUKICBvIEZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggcmVxdWVzdHMgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgcGlwZWxpbmUKICBvIEZpeGVkIHNldmVyYWwgY3VybCBidWdzIHdpdGggcGlwZWxpbmluZyB3aGVuIHRoZSBzZXJ2ZXIgaXMgcmV0dXJuaW5nCiAgICBjaHVua2VkIGVuY29kaW5nOgogICAgKiBBZGRlZCBzdGF0ZXMgdG8gY2h1bmtlZCBwYXJzaW5nIGZvciBmaW5hbCBDUkxGCiAgICAqIFJld2luZCBidWZmZXIgYWZ0ZXIgcGFyc2luZyBjaHVuayB3aXRoIGRhdGEgcmVtYWluaW5nCiAgICAqIE1vdmVkIGNodW5rZWQgaGVhZGVyIGluaXRpYWxpemluZyB0byBhIHNwb3QganVzdCBiZWZvcmUgcmVjZWl2aW5nCiAgICAgIGhlYWRlcnMKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGNoYW5nZWQgdGhlIENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIHRvIGhhbmRsZQogIGFjdGl2ZSBhbmQgcGFzc2l2ZSBDQ0Mgc2h1dGRvd24gYW5kIGFkZGVkIHRoZSAtLWZ0cC1zc2wtY2NjLW1vZGUgY29tbWFuZAogIGxpbmUgb3B0aW9uLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA3KQotIElhbiBUdXJuZXIgZml4ZWQgdGhlIGxpYmN1cmwubTQgbWFjcm8ncyBzdXBwb3J0IGZvciAtLXdpdGgtbGliY3VybC4KCi0gU2htdWxpayBSZWdldiBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHJlLXVzZWQgSFRUUFMgY29ubmVjdGlvbnMsIGF0IGxlYXN0CiAgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIG1hZGUgcGFzc2l2ZSBGVFAgdHJhbnNmZXJzIHdvcmsgd2l0aCBTT0NLUyAoYm90aCA0IGFuZAogIDUpLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA3KQotIEplZmYgUG9obG1leWVyIGlkZW50aWZpZWQgdHdvIHByb2JsZW1zOiBmaXJzdCBhIHJhdGhlciBvYnNjdXJlIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Rpb24gcmUtdXNlIHRoYXQgY291bGQgbWFrZSBhCiAgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgcnVpbiBhIHBvaW50ZXIgaW4gYW5vdGhlciBoYW5kbGUuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSB3YXMgbGVzcyBvZiBhbiBhY3R1YWwgcHJvYmxlbSBidXQgbW9yZSBvZiBtaW5vciBxdWlyazoKICB0aGUgcmUtdXNpbmcgb2YgY29ubmVjdGlvbnMgd2Fzbid0IHByb3Blcmx5IGNoZWNraW5nIGlmIHRoZSBjb25uZWN0aW9uIHdhcwogIG1hcmtlZCBmb3IgY2xvc3VyZS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNykKLSBEdW5jYW4gTWFjLVZpY2FyIFByZXR0IGFuZCBNaWNoYWwgTWFyZWsgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCByZXNldHRpbmcKICBDVVJMT1BUX1JBTkdFIGJhY2sgdG8gbm8gcmFuZ2Ugb24gYW4gZWFzeSBoYW5kbGUgd2hlbiB1c2luZyBGVFAuCgpEYW4gRiAoMTQgRmVicnVhcnkgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWxpYnMgc28gaXQgZG9lc24ndCBsaXN0IHVubmVjZXNzYXJ5IGxpYnJhcmllcyAoYW5kCiAgdGhlcmVmb3JlIGludHJvZHVjZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMpIHdoZW4gaXQncyBub3QgbmVlZGVkLgogIEFsc28sIGRvbid0IGJvdGhlciBhZGRpbmcgYSBsaWJyYXJ5IHBhdGggb2YgL3Vzci9saWIKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNykKLSBUaGUgZGVmYXVsdCBwYXNzd29yZCBmb3IgYW5vbnltb3VzIEZUUCBjb25uZWN0aW9ucyBpcyBub3cgY2hhbmdlZCB0byBiZQogICJmdHBAZXhhbXBsZS5jb20iLgoKLSBSb2JlcnQgQS4gTW9uYXQgbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBWQzIwMDUgLSBpdCBkb2Vzbid0IGhhdmUKICBnbXRpbWVfcigpIGxpa2UgdGhlIG9sZGVyIFZDIHZlcnNpb25zLiBIZSBhbHNvIG1hZGUgdXNlIG9mIHNvbWUgbWFjaGluZS0KICBzcGVjaWZpYyBkZWZpbmVzIHRvIGRpZmZlcmVudGlhdGUgdGhlICJPUyIgZGVmaW5lLgoKRGFuaWVsICgxMiBGZWJydWFyeSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGFkZGVkIHN1cHBvcnQgZm9yIE5TUyAoTmV0d29yayBTZWN1cml0eSBTZXJ2aWNlKSBmb3IgdGhlCiAgU1NML1RMUyBsYXllci4gaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9wa2kvbnNzLwoKICBUaGlzIGlzIHRoZSBmb3VydGggc3VwcG9ydGVkIGxpYnJhcnkgZm9yIFRMUy9TU0wgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIQoKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIENSTEYgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFyZSBzZW50CiAgdG8gdGhlIGRlYnVnIGNhbGxiYWNrLgoKLSBTaG11bGlrIFJlZ2V2IGFkZGVkIENVUkxPUFRfSFRUUF9DT05URU5UX0RFQ09ESU5HIGFuZAogIENVUkxPUFRfSFRUUF9UUkFOU0ZFUl9ERUNPRElORyB0aGF0IGlmIHNldCB0byB6ZXJvIHdpbGwgZGlzYWJsZSBsaWJjdXJsJ3MKICBpbnRlcm5hbCBkZWNvZGluZyBvZiBjb250ZW50IG9yIHRyYW5zZmVyIGVuY29kZWQgY29udGVudC4gVGhpcyBtYXkgYmUKICBwcmVmZXJhYmxlIGluIGNhc2VzIHdoZXJlIHlvdSB1c2UgbGliY3VybCBmb3IgcHJveHkgcHVycG9zZXMgb3Igc2ltaWxhci4gVGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgZ290IGEgLS1yYXcgb3B0aW9uIHRvIGRpc2FibGUgYm90aCBhdCBvbmNlLgoKLSByZWxlYXNlIHRhcmJhbGxzIG1hZGUgd2l0aCBtYWtldGd6IHdpbGwgZnJvbSBub3cgb24gaGF2ZSBhIExJQkNVUkxfVElNRVNUQU1QCiAgZGVmaW5lIHNldCB0byBob2xkIHRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIG9mIHdoZW4gdGhlIHRhcmJhbGwgd2FzIGJ1aWx0LCBhcwogIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHVzaW5nIHRoZSBVVEMgdGltZSB6b25lLgoKLSBKZWZmIFBvaGxtZXllciBmaXhlZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgd2hlbiBhZGRpbmcgYSBoYW5kbGUKICB0aGF0IGhhcyBhbiBlYXN5IGhhbmRsZSBwcmVzZW50IGluIHRoZSAiY2xvc3VyZSIgbGlzdCBwZW5kaW5nIGNsb3N1cmUuCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNykKLSBSZWd1bGFyIGZpbGUgZG93bmxvYWRzIHdpaHQgU0ZUUCBhbmQgU0NQIGFyZSBub3cgZG9uZSB1c2luZyB0aGUgbm9uLWJsb2NraW5nCiAgQVBJIG9mIGxpYnNzaDIsIGlmIHRoZSBsaWJzc2gyIGhlYWRlcnMgc2VlbSB0byBzdXBwb3J0IHRoZW0uIFRoaXMgd2lsbCBtYWtlCiAgU0NQIGFuZCBTRlRQIG11Y2ggbW9yZSByZXNwb25zaXZlIGFuZCBiZXR0ZXIgbGliY3VybCBjaXRpemVucyB3aGVuIHVzZWQgd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgZXRjLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfVElNRU9VVF9NUyBhbmQKICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUX01TIHRoYXQsIGFzIHRoZWlyIG5hbWVzIHN1Z2dlc3QsIGRvIHRoZSB0aW1lb3V0cyB3aXRoCiAgbWlsbGlzZWNvbmQgcmVzb2x1dGlvbi4gVGhlIG9ubHkgcmVzdHJpY3Rpb24gdG8gdGhhdCBpcyB0aGUgYWxhcm0oKQogIChzb21ldGltZXMpIHVzZWQgdG8gYWJvcnQgbmFtZSByZXNvbHZlcyBhcyB0aGF0IHVzZXMgZnVsbCBzZWNvbmRzLiBJIGZpeGVkCiAgdGhlIEZUUCByZXNwb25zZSB0aW1lb3V0IHBhcnQgb2YgdGhlIHBhdGNoLgoKICBJbnRlcm5hbGx5IHdlIG5vdyBjb3VudCBhbmQga2VlcCB0aGUgdGltZW91dHMgaW4gbWlsbGlzZWNvbmRzIGJ1dCBpdCBhbHNvCiAgbWVhbnMgd2UgbXVsdGlwbHkgc2V0IHRpbWVvdXRzIHdpdGggMTAwMC4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgbm8KICB0aW1lb3V0IGNhbiBiZSBzZXQgdG8gbW9yZSB0aGFuIDJeMzEgbWlsbGlzZWNvbmRzIChvbiAzMiBiaXQgc3lzdGVtcyksIHdoaWNoCiAgZXF1YWxzIDI0Ljg2IGRheXMuICBXZSBwcm9iYWJseSBjb3VsZG4ndCBiZWZvcmUgZWl0aGVyIHNpbmNlIHRoZSBjb2RlIGRpZAogICoxMDAwIG9uIHRoZSB0aW1lb3V0IHZhbHVlcyBvbiBzZXZlcmFsIHBsYWNlcyBhbHJlYWR5LgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDcpCi0gWWFuZyBUc2UgZml4ZWQgdGhlIGNvb2tpZSBleHBpcnkgZGF0ZSBpbiBzZXZlcmFsIHRlc3QgY2FzZXMgdGhhdCBzdGFydGVkIHRvCiAgZmFpbCBzaW5jZSB0aGV5IHVzZWQgIjEgZmViIDIwMDciLi4uCgotIE1hbmZyZWQgU2Nod2FyYiByZXBvcnRlZCB0aGF0IHNvY2tzNSBzdXBwb3J0IHdhcyBicm9rZW4gYW5kIGhlbHAgdXMgcGlucG9pbnQKICB0aGUgcHJvYmxlbS4gVGhlIGNvZGUgbm93IHRyaWVzIGhhcmRlciB0byB1c2UgaHR0cHJveHkgYW5kIHByb3h5IHdoZXJlCiAgYXBwcHJvcHJpYXRlLCBhcyBub3QgYWxsIHByb3hpZXMgYXJlIEhUVFAuLi4KClZlcnNpb24gNy4xNi4xICgyOSBKYW51YXJ5IDIwMDcpCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgQ09OTkVDVCB3aXRoIGEgY3VzdG9tIFVzZXItQWdlbnQKICBoZWFkZXIsIHlvdSBnb3QgX3R3b18gVXNlci1BZ2VudCBoZWFkZXJzIGluIHRoZSBDT05ORUNUIHJlcXVlc3QuLi4hIEFkZGVkCiAgdGVzdCBjYXNlIDI4NyB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA3KQotIGN1cmxfZWFzeV9yZXNldCgpIG5vdyByZXNldHMgdGhlIENBIGJ1bmRsZSBwYXRoIGNvcnJlY3RseS4KCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgdGhlIEN1cmwgY29tbWFuZCBsaW5lIHRvb2wgZm9yIEhUVFAgb24gbm9uLUFTQ0lJCiAgcGxhdGZvcm1zLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDcpCi0gQWRkZWQgdGhlIC0tbGliY3VybCBbZmlsZV0gb3B0aW9uIHRvIGN1cmwuIEFwcGVuZCB0aGlzIG9wdGlvbiB0byBhbnkKICBvcmRpbmFyeSBjdXJsIGNvbW1hbmQgbGluZSwgYW5kIHlvdSB3aWxsIGdldCBhIGxpYmN1cmwtdXNpbmcgc291cmNlIGNvZGUKICB3cml0dGVuIHRvIHRoZSBmaWxlIHRoYXQgZG9lcyB0aGUgZXF1aXZhbGVudCBvcGVyYXRpb24gb2Ygd2hhdCB5b3VyIGNvbW1hbmQKICBsaW5lIG9wZXJhdGlvbiBkb2VzIQoKRGFuIEYgKDI0IEphbnVhcnkgMjAwNykKLSBGaXhlZCBhIGRhbmdsaW5nIHBvaW50ZXIgcHJvYmxlbSB0aGF0IHByZXZlbnRlZCB0aGUgaHR0cF9wcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIGZyb20gYmVpbmcgcHJvcGVybHkgdXNlZCBpbiBtYW55IGNhc2VzIChhbmQgY2F1c2VkIHRlc3QgY2FzZSA2MwogIHRvIGZhaWwpLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgZGlkIE5UTE0gY2hhbmdlcyBtYWlubHkgZm9yIG5vbi1BU0NJSSBwbGF0Zm9ybXM6CgogICMxCiAgVGhlcmUncyBhIGNvbXBpbGF0aW9uIGVycm9yIGluIGh0dHBfbnRsbS5jIGlmIFVTRV9OVExNMlNFU1NJT04gaXMgTk9UCiAgZGVmaW5lZC4gIEkgbm90aWNlZCB0aGlzIHdoaWxlIHRlc3RpbmcgdmFyaW91cyBjb25maWd1cmF0aW9ucy4gIExpbmUgODY3IG9mCiAgdGhlIGN1cnJlbnQgaHR0cF9udGxtLmMgaXMgYSBjbG9zaW5nIGJyYWNrZXQgZm9yIGFuIGlmL2Vsc2UgcGFpciB0aGF0IG9ubHkKICBnZXRzIGNvbXBpbGVkIGluIGlmIFVTRV9OVExNMlNFU1NJT04gaXMgZGVmaW5lZC4gIEJ1dCB0aGlzIGNsb3NpbmcgYnJhY2tldAogIHdhc24ndCBpbiBhbiAjaWZkZWYgc28gdGhlIGNvZGUgZmFpbHMgdG8gY29tcGlsZSB1bmxlc3MgVVNFX05UTE0yU0VTU0lPTiB3YXMKICBkZWZpbmVkLiAgTGluZXMgMTk4IGFuZCAxNDAgb2YgbXkgcGF0Y2ggd3JhcHMgdGhhdCBjbG9zaW5nIGJyYWNrZXQgaW4gYW4KICAjaWZkZWYgVVNFX05UTE0yU0VTU0lPTi4KCiAgIzIKICBJIG5vdGljZWQgc2V2ZXJhbCBwaWNreSBjb21waWxlciB3YXJuaW5ncyB3aGVuIERFQlVHX01FIGlzIGRlZmluZWQuICBJJ3ZlCiAgZml4ZWQgdGhlbSB3aXRoIGNhc3RpbmcuICBCeSB0aGUgd2F5LCBERUJVR19NRSB3YXMgYSBodWdlIGhlbHAgaW4KICB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZS4KCiAgIzMKICBIb3BlZnVsbHkgdGhlIGxhc3Qgbm9uLUFTQ0lJIGNvbnZlcnNpb24gcGF0Y2ggZm9yIGxpYmN1cmwgaW4gYSB3aGlsZS4gIEkKICBjaGFuZ2VkIHRoZSAiTlRMTVNTUCIgbGl0ZXJhbCB0byBoZXggc2luY2UgdGhpcyBzaWduYXR1cmUgbXVzdCBhbHdheXMgYmUgaW4KICBBU0NJSS4KCiAgQ29udmVyc2lvbiBjb2RlIHdhcyBzdHJhdGVnaWNhbGx5IGFkZGVkIHdoZXJlIG5lY2Vzc2FyeS4gIEFuZCB0aGUKICBDdXJsX2Jhc2U2NF9lbmNvZGUgY2FsbHMgd2VyZSBjaGFuZ2VkIHNvIHRoZSBiaW5hcnkgImJsb2JzIiBodHRwX250bG0uYwogIGNyZWF0ZXMgYXJlIE5PVCB0cmFuc2xhdGVkIG9uIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW4gRiAoMjIgSmFudWFyeSAyMDA3KQotIENvbnZlcnRlZCAobW9zdCBvZikgdGhlIHRlc3QgZGF0YSBmaWxlcyBpbnRvIGdlbnVpbmUgWE1MLiAgQSBoYW5kZnVsIHN0aWxsCiAgYXJlIG5vdCwgZHVlIG1haW5seSB0byB0aGUgbGFjayBvZiBzdXBwb3J0IGZvciBYTUwgY2hhcmFjdGVyIGVudGl0aWVzCiAgKGUuZy4gJiA9PiAmYW1wOyApLiAgVGhpcyB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHZhbGlkYXRlIHRlc3QgZmlsZXMgdXNpbmcKICB0b29scyBsaWtlIHhtbGxpbnQsIGFzIHdlbGwgYXMgdG8gZWRpdCBhbmQgdmlldyB0aGVtIHVzaW5nIFhNTCB0b29scy4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDA3KQotIEFybWVsIEFzc2VsaW4gaW1wcm92ZWQgbGliY3VybCB0byBiZWhhdmUgYSBsb3QgYmV0dGVyIHdoZW4gYW4gZWFzeSBoYW5kbGUKICBkb2luZyBhbiBGVFAgdHJhbnNmZXIgaXMgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlIGJlZm9yZSBjb21wbGV0aW9uLiBUaGUKICBmaXggYWxzbyBmaXhlZCB0aGUgImFsaXZlIGNvdW50ZXIiIHRvIGJlIGNvcnJlY3Qgb24gInByZW1hdHVyZSByZW1vdmFsIiBmb3IKICBhbGwgcHJvdG9jb2xzLgoKRGFuIEYgKDE2IEphbnVhcnkgMjAwNykKLSBGaXhlZCBhIHNtYWxsIG1lbW9yeSBsZWFrIGluIHRmdHAgdXBsb2FkcyBkaXNjb3ZlcmVkIGJ5IGN1cmwncyBtZW1vcnkgbGVhawogIGRldGVjdG9yLiAgQWxzbyBjaGFuZ2VkIHRmdHAgZG93bmxvYWRzIHRvIFVSTC11bmVzY2FwZSB0aGUgZG93bmxvYWRlZAogIGZpbGUgbmFtZS4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IHByb3ZpZGVkIGxpYmN1cmwgY2hhbmdlcyBmb3IgZG9pbmcgSFRUUCBjb21tdW5pY2F0aW9uIG9uCiAgbm9uLUFTQ0lJIHBsYXRmb3Jtcy4gSXQgZG9lcyBhZGQgc29tZSBjb21wbGV4aXR5LCBtb3N0IG5vdGFibHkgd2l0aCBtb3JlCiAgI2lmZGVmcywgYnV0IEkgd2FudCB0byBzZWUgdGhpcyBzdXBwb3J0ZWQgYWRkZWQgYW5kIEkgY2FuJ3Qgc2VlIGhvdyB3ZSBjYW4KICBhZGQgaXQgd2l0aG91dCB0aGUgZXh0cmEgc3R1ZmYgYWRkZWQuCgotIFNldHRpbmcgQ1VSTE9QVF9DT09LSUVMSVNUIHRvICJBTEwiIHdoZW4gbm8gY29va2llcyBhdCBhbGwgd2FzIHByZXNlbnQsCiAgbGliY3VybCB3b3VsZCBjcmFzaCB3aGVuIHRyeWluZyB0byByZWFkIGEgTlVMTCBwb2ludGVyLgoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDcpCi0gVG9ieSBQZXRlcnNvbiBmb3VuZCBhIG5hc3R5IGJ1ZyB0aGF0IHByZXZlbnRlZCAobGliKWN1cmwgZnJvbSBwcm9wZXJseQogIGRvd25sb2FkaW5nIChtb3N0KSB0aGluZ3MgdGhhdCB3ZXJlIGxhcmdlciB0aGFuIDRHQiBvbiAzMiBiaXQgc3lzdGVtcy4gIE1hdHQKICBXaXRoZXJzcG9vbiBoZWxwZWQgYXMgbmFycm93IGRvd24gdGhlIHByb2JsZW0uCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA3KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaW50cm9kdWNlZCB0aGUgLS1mdHAtc3NsLWNjYyBjb21tYW5kIGxpbmUgb3B0aW9uIHRvCiAgY3VybCB0aGF0IHVzZXMgdGhlIG5ldyBDVVJMT1BUX0ZUUF9TU0xfQ0NDIG9wdGlvbiBpbiBsaWJjdXJsLiBJZiBlbmFibGVkLCBpdAogIHdpbGwgbWFrZSBsaWJjdXJsIHNodXRkb3duIFNTTC9UTFMgYWZ0ZXIgdGhlIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmUgb24gYQogIEZUUC1TU0wgb3BlcmF0aW9uLgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBtYWRlIGNoYW5nZXMgdG8gYWxsb3cgYmFzZTY0IGVuY29kaW5nL2RlY29kaW5nIHRvIHdvcmsgb24KICBub24tQVNDSUkgcGxhdGZvcm1zLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwNykKLSBNYXR0IFdpdGhlcnNwb29uIGZpeGVkIHRoZSBmbGF3IHdoaWNoIG1hZGUgbGliY3VybCA3LjE2LjAgYWx3YXlzIHN0b3JlCiAgZG93bmxvYWRlZCBkYXRhIGluIHR3byBidWZmZXJzLCBqdXN0IHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoIGEgc3BlY2lhbCBIVFRQCiAgcGlwZWxpbmluZyBjYXNlLiBUaGF0IGlzIG5vdyBvbmx5IGFjdGl2YXRlZCBmb3IgcGlwZWxpbmVkIHRyYW5zZmVycy4gSW4KICBNYXR0J3MgY2FzZSwgaXQgc2hvd2VkIGFzIGEgY29uc2lkZXJhYmxlIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA3KQotIFZpY3RvciBTbmV6aGtvIGhlbHBlZCB1cyBmaXggYnVnIHJlcG9ydCAjMTYwMzcxMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjAzNzEyKSAoa25vd24gYnVnICMzNikgLS1saW1pdC1yYXRlCiAgKENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UpIGFyZSBicm9rZW4KICBvbiBXaW5kb3dzIChzaW5jZSA3LjE2LjAsIGJ1dCB0aGF0J3Mgd2hlbiB0aGV5IHdlcmUgaW50cm9kdWNlZCBhcyBwcmV2aW91cwogIHRvIHRoYXQgdGhlIGxpbWl0aW5nIGxvZ2ljIHdhcyBtYWRlIGluIHRoZSBhcHBsaWNhdGlvbiBvbmx5IGFuZCBub3QgaW4gdGhlCiAgbGlicmFyeSkuIEl0IHdhcyBhY3R1YWxseSBhbHNvIGJyb2tlbiBvbiBzZWxlY3QoKS1iYXNlZCBzeXN0ZW1zIChhcyBhcHBvc2VkCiAgdG8gcG9sbCgpKSBidXQgd2UgaGF2ZW4ndCBoYWQgYW55IHN1Y2ggcmVwb3J0cy4gV2Ugbm93IHVzZSBzZWxlY3QoKSwgU2xlZXAoKQogIG9yIGRlbGF5KCkgcHJvcGVybHkgdG8gc2xlZXAgYSB3aGlsZSB3aXRob3V0IHdhaXRpbmcgZm9yIGFueXRoaW5nIGlucHV0IG9yCiAgb3V0cHV0IHdoZW4gdGhlIHJhdGUgbGltaXRpbmcgaXMgYWN0aXZhdGVkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlLgoKLSBNb2RpZmllZCBsaWJjdXJsLnBjLmluIHRvIHVzZSBMaWJzLnByaXZhdGUgZm9yIHRoZSBsaWJzIGxpYmN1cmwgaXRzZWxmIG5lZWRzCiAgdG8gZ2V0IGJ1aWx0IHN0YXRpYy4gSXQgaGFzIGJlZW4gbWVudGlvbmVkIGJlZm9yZSBhbmQgd2FzIGFnYWluIGJyb3VnaHQgdG8KICBvdXIgYXR0ZW50aW9uIGJ5IE5hdGhhbmFlbCBOZXJvZGUgd2hvIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICM0MDUyMjYKICAoaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTQwNTIyNikuCgpEYW5pZWwgKDI5IERlY2VtYmVyIDIwMDYpCi0gTWFrZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgc2V0IHRoZSBtYWdpYyBudW1iZXIgaW4gdGhlIG5ldyBoYW5kbGUuCgpEYW5pZWwgKDIyIERlY2VtYmVyIDIwMDYpCi0gUm9iZXJ0IEZvcmVtYW4gcHJvdmlkZWQgYSBwcmltZSBleGFtcGxlIHNuaXBwZXQgc2hvd2luZyBob3cgbGliY3VybCB3b3VsZAogIGdldCBjb25mdXNlZCBhbmQgbm90IGFja25vd2xlZGdlIHRoZSAnbm9fcHJveHknIHZhcmlhYmxlIHByb3Blcmx5IG9uY2UgaXQKICBoYWQgdXNlZCB0aGUgcHJveHkgYW5kIHlvdSByZS11c2VkIHRoZSBzYW1lIGVhc3kgaGFuZGxlLiBJIG1hZGUgc3VyZSB0aGUKICBwcm94eSBuYW1lIGlzIHByb3Blcmx5IHN0b3JlZCBpbiB0aGUgY29ubmVjdCBzdHJ1Y3QgcmF0aGVyIHRoYW4gdGhlCiAgc2Vzc2lvbmhhbmRsZS9lYXN5IHN0cnVjdC4KCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBiYWQgY2FsbCB0byBnZXRzb2NrbmFtZSgpIHRoYXQgd3JvbmdseSB1c2VkIGEgc2l6ZV90CiAgdmFyaWFibGUgdG8gcG9pbnQgdG8gd2hlbiBpdCBzaG91bGQgYmUgYSBzb2NrbGVuX3QuCgotIFdoZW4gc2V0dGluZyBhIHByb3h5IHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCAoZm9yIGV4YW1wbGUpIHJ1bm5pbmcKICAnY3VybCBbVVJMXScgd2l0aCBhIFVSTCB3aXRob3V0IGEgcHJvdG9jb2wgcHJlZml4LCBjdXJsIHdvdWxkIG5vdCBzZW5kIGEKICBjb3JyZWN0IHJlcXVlc3QgYXMgaXQgZmFpbGVkIHRvIGFkZCB0aGUgcHJvdG9jb2wgcHJlZml4LgoKRGFuaWVsICgyMSBEZWNlbWJlciAyMDA2KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gcmVwb3J0ZWQgYnVnICMxNjE4MzU5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MTgzNTkpIGFuZCBzdWJzZXF1ZW50bHkgcHJvdmlkZWQgYQogIHBhdGNoIGZvciBpdDogd2hlbiBkb3dubG9hZGluZyAyIHplcm8gYnl0ZSBmaWxlcyBpbiBhIHJvdywgY3VybCA3LjE2LjAKICBlbnRlcnMgYW4gaW5maW5pdGUgbG9vcCwgd2hpbGUgY3VybCA3LjE2LjEtMjAwNjEyMTggZG9lcyBvbmUgYWRkaXRpb25hbAogIHVubmVjZXNzYXJ5IHJlcXVlc3QuCgogIEZpeDogRHVyaW5nIHRoZSAiTWFqb3Igb3ZlcmhhdWwgaW50cm9kdWNpbmcgaHR0cCBwaXBlbGluaW5nIHN1cHBvcnQgYW5kCiAgc2hhcmVkIGNvbm5lY3Rpb24gY2FjaGUgd2l0aGluIHRoZSBtdWx0aSBoYW5kbGUuIiBjaGFuZ2UsIGhlYWRlcmJ5dGVjb3VudAogIHdhcyBtb3ZlZCB0byBsaXZlIGluIHRoZSBDdXJsX3RyYW5zZmVyX2tlZXBlciBzdHJ1Y3R1cmUuIEJ1dCB0aGF0IHN0cnVjdHVyZQogIGlzIHJlc2V0IGluIHRoZSBUcmFuc2ZlciBtZXRob2QsIGxvc2luZyB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBoYWQgYWJvdXQKICB0aGUgaGVhZGVyIHNpemUuIFRoaXMgcGF0Y2ggbW92ZXMgaXQgYmFjayB0byB0aGUgY29ubmVjdGRhdGEgc3RydWN0LgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA2KQotIEJyZW5kYW4gSnVyZCBwcm92aWRlZCBhIGZpeCB0aGF0IG5vdyBwcmV2ZW50cyBsaWJjdXJsIGZyb20gZ2V0dGluZyBhIFNJR1BJUEUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIHdoZW4gR251VExTIGlzIHVzZWQuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDYpCi0gQWxleGV5IFNpbWFrIGZvdW5kIG91dCB0aGF0IHdoZW4gZG9pbmcgRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQKICBzb21ldGhpbmcgd2VudCB3cm9uZyBsaWtlIGl0IGdvdCBhIGJhZCByZXNwb25zZSBjb2RlIGJhY2sgZnJvbSB0aGUgc2VydmVyLAogIGxpYmN1cmwgd291bGQgbGVhayBtZW1vcnkuIEFkZGVkIHRlc3QgY2FzZSA1MzggdG8gdmVyaWZ5IHRoZSBmaXguCgogIEkgYWxzbyBub3RlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGdldCBjYWNoZWQgaW4gdGhhdCBjYXNlLCB3aGljaAogIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZSBpdCBjYW5ub3QgYmUgcmUtdXNlIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIGhhcwogIGZhaWxlZC4gSSBmaXhlZCB0aGF0IGlzc3VlIHRvbyBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgYWxzbyB0aGF0IHRoZSBwYXRoCiAgd291bGQgYmUgInJlbWVtYmVyZWQiIGluIHZhaW4gZm9yIGNhc2VzIHdoZXJlIHRoZSBjb25uZWN0aW9uIHdhcyBhYm91dCB0bwogIGdldCBjbG9zZWQuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNikKLSBTZWJhc3RpZW4gV2lsbGVtaWpucyByZXBvcnRlZCBidWcgIzE2MDM3MTIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgd2hpY2ggaXMgYWJvdXQgY29ubmVjdGlvbnMKICBnZXR0aW5nIGN1dCBvZmYgcHJlbWF0dXJlbHkgd2hlbiAtLWxpbWl0LXJhdGUgaXMgdXNlZC4gV2hpbGUgSSBmb3VuZCBubyBzdWNoCiAgcHJvYmxlbXMgaW4gbXkgdGVzdHMgbm9yIGluIG15IHJlYWRpbmcgb2YgdGhlIGNvZGUsIEkgZm91bmQgdGhhdCB0aGUKICAtLWxpbWl0LXJhdGUgY29kZSB3YXMgc2V2ZXJseSBmbGF3ZWQgKHNpbmNlIGl0IHdhcyBtb3ZlZCBpbnRvIHRoZSBsaWIsIHNpbmNlCiAgNy4xNS41KSB3aGVuIHVzZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UgYW5kIGl0IGRpZG4ndCB3b3JrIGFzIGRvY3VtZW50ZWQKICBzbyBJIHJld29ya2VkIGl0IHNvbWV3aGF0IGFuZCBub3cgaXQgd29ya3MgZm9yIG15IHRlc3RzLgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDYpCi0gU3RlZmFuIEtyYXVzZSBwb2ludGVkIG91dCBhIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBhIHBpY2t5IE1TQ1YgY29tcGlsZXIgd2hlbgogIHBhc3NpbmcgYSBjdXJsX29mZl90IGFyZ3VtZW50IHRvIHRoZSBDdXJsX3JlYWRfcmV3aW5kKCkgZnVuY3Rpb24gd2hpY2ggdGFrZXMKICBhbiBzaXplX3QgYXJndW1lbnQuIEN1cmxfcmVhZF9yZXdpbmQoKSBhbHNvIGhhZCBkZWJ1ZyBjb2RlIGxlZnQgaW4gaXQgYW5kIGl0CiAgd2FzIHB1dCBpbiBhIGRpZmZlcmVudCBzb3VyY2UgZmlsZSB3aXRoIG5vIGdvb2QgcmVhc29uIHdoZW4gb25seSB1c2VkIGZyb20KICBvbmUgc2luZ2xlIHNwb3QuCgotIFNoIERpYW8gcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NMT1NFUE9MSUNZIGRvZXNuJ3Qgd29yaywgYW5kIGluZGVlZCwgdGhlcmUgaXMKICBubyBjb2RlIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkgdGhhdCByZWNlaXZlcyB0aGUgb3B0aW9uLiBTaW5jZSBpdCB3YXMgbm90CiAgcG9zc2libGUgdG8gdXNlLCB3ZSBrbm93IHRoYXQgbm8gY3VycmVudCB1c2VycyBleGlzdCBhbmQgdGh1cyB3ZSBzaW1wbHkKICByZW1vdmVkIGl0IGZyb20gdGhlIGRvY3MgYW5kIG1hZGUgdGhlIGNvZGUgYWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBwYXRoIG9mCiAgdGhlIGNvZGUuCgotIEphcmVkIEx1bmRlbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTYwNDk1NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjA0OTU2KSB3aGljaCBpZGVudGlmaWVkIHNldHRpbmcKICBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIHplcm8gY2F1c2VkIGxpYmN1cmwgdG8gU0lHU0VHVi4gU3RhcnRpbmcgbm93LCBsaWJjdXJsCiAgd2lsbCBhbHdheXMgaW50ZXJuYWxseSB1c2Ugbm8gbGVzcyB0aGFuIDEgZW50cnkgaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUuCgotIFNoIERpYW8gcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0ZPUkJJRF9SRVVTRSBubyB3b3JrcywgYW5kIGluZGVlZCBpdCBicm9rZSBpbgogIHRoZSA3LjE2LjAgcmVsZWFzZS4KCi0gTWFydGluIFNraW5uZXIgYnJvdWdodCBiYWNrIGJ1ZyByZXBvcnQgIzEyMzAxMTggdG8gaGF1bnQgdXMgb25jZSBhZ2Fpbi4KICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIzMDExOCkgY3VybF9nZXRkYXRlKCkgZGlkIG5vdCB3b3JrCiAgcHJvcGVybHkgZm9yIGFsbCBpbnB1dCBkYXRlcyBvbiBXaW5kb3dzLiBJdCB3YXMgbW9zdGx5IHNlZW4gb24gc29tZSBUWiB0aW1lCiAgem9uZXMgdXNpbmcgRFNULiBMdWNraWx5LCBNYXJ0aW4gYWxzbyBwcm92aWRlZCBhIGZpeC4KCi0gQWxleGV5IFNpbWFrIGZpbGVkIGJ1ZyByZXBvcnQgIzE2MDA0NDcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMDQ0NykgaW4gd2hpY2ggaGUgbm90ZWQgdGhhdCBhY3RpdmUKICBGVFAgY29ubmVjdGlvbnMgZG9uJ3Qgd29yayB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIFRoZSBwcm9ibGVtIGlzIGhlcmUKICB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2Ugc3RhdGUgbWFjaGluZSBoYXMgYSBzdGF0ZSBkdXJpbmcgd2hpY2ggaXQgY2FuIHdhaXQKICBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiB0byBjb25uZWN0LCBidXQgdGhlIGFjdGl2ZSBjb25uZWN0aW9uIGlzIG5vdCBkb25lIGluCiAgdGhlIHNhbWUgc3RlcCBpbiB0aGUgc2VxdWVuY2UgYXMgdGhlIHBhc3NpdmUgb25lIGlzIHNvIGl0IGRvZXNuJ3QgcXVpdGUgd29yawogIGZvciBhY3RpdmUuIFRoZSBhY3RpdmUgRlRQIGNvZGUgc3RpbGwgdXNlIGEgYmxvY2tpbmcgZnVuY3Rpb24gdG8gYWxsb3cgdGhlCiAgcmVtb3RlIHNlcnZlciB0byBjb25uZWN0LgoKICBUaGUgZml4ICh3b3JrLWFyb3VuZCBpcyBhIGJldHRlciB3b3JkKSBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHNldCB0aGUKICBib29sZWFuIHByZW1hdHVyZWx5IHRoYXQgdGhlIGRhdGEgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoYXQgdGhlICJ3YWl0CiAgZm9yIGNvbm5lY3QiIHBoYXNlIGVuZHMgYXQgb25jZS4KCiAgVGhlIHByb3BlciBmaXgsIGxlZnQgZm9yIHRoZSBmdXR1cmUsIGlzIG9mIGNvdXJzZSB0byBtYWtlIHRoZSBhY3RpdmUgRlRQCiAgY2FzZSB0byBhY3QgaW4gYSBub24tYmxvY2tpbmcgd2F5IHRvby4KCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCBhIHByb2JsZW0gY2FzZSB3aGVuIHRoZSBDUFUgbG9hZCB3ZW50IHRvIDEwMCUgd2hlbiBhCiAgSFRUUCB1cGxvYWQgd2FzIGRpc2Nvbm5lY3RlZDoKCiAgIldoYXQgYXBwZWFycyB0byBiZSBoYXBwZW5pbmcgaXMgdGhhdCBteSBzeXN0ZW0gKExpbnV4IDIuNi4xNyBhbmQgMi42LjEzKSBpcwogIHNldHRpbmcgKm9ubHkqIFBPTExIVVAgb24gcG9sbCgpIHdoZW4gdGhlIGNvbmRpdGlvbnMgaW4gbXkgcHJldmlvdXMgbWFpbAogIG9jY3VyLiBBcyB5b3UgY2FuIHNlZSwgc2VsZWN0LmM6Q3VybF9zZWxlY3QoKSBkb2VzIG5vdCBjaGVjayBmb3IgUE9MTEhVUC4gU28KICBiYXNpY2FsbHkgd2hhdCB3YXMgaGFwcGVuaW5nLCBpcyBwb2xsKCkgd2FzIHJldHVybmluZyBpbW1lZGlhdGVseSAod2l0aAogIFBPTExIVVAgc2V0KSwgYnV0IHdoZW4gQ3VybF9zZWxlY3QoKSBsb29rZWQgYXQgdGhlIGJpdHMsIG5laXRoZXIgUE9MTEVSUiBvcgogIFBPTExPVVQgd2FzIHNldC4gVGhpcyBzdGlsbCBjYXVzZWQgQ3VybF9yZWFkd3JpdGUoKSB0byBiZSBjYWxsZWQsIHdoaWNoCiAgcXVpY2tseSByZXR1cm5lZC4gVGhlbiB0aGUgdHJhbnNmZXIoKSBsb29wIGtlcHQgY29udGludWluZyBhdCBmdWxsIHNwZWVkCiAgZm9yZXZlci4iCgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwNikKLSBUb29uIFZlcndhZXN0IHJlcG9ydGVkIHRoYXQgdGhlcmUgYXJlIHNlcnZlcnMgdGhhdCBzZW5kIHRoZSBDb250ZW50LVJhbmdlOgogIGhlYWRlciBpbiBhIHRoaXJkLCBub3Qgc3VwcHBvcnRlZCBieSBsaWJjdXJsLCBmb3JtYXQgYW5kIHdlIGFncmVlZCB0aGF0IHdlCiAgY291bGQgbWFrZSB0aGUgcGFyc2VyIG1vcmUgZm9yZ2l2aW5nIHRvIGFjY2VwdCBhbGwgdGhlIHRocmVlIGZvdW5kCiAgdmFyaWF0aW9ucy4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNikKLSBWZW5rYXQgQWtlbGxhIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgcmVzcG9uc2VzIHRoYXQgc2ltcGx5CiAgcmVzcG9uZGVkIHdpdGggYSBzaW5nbGUgc3RhdHVzIGxpbmUgYW5kIG5vIGhlYWRlcnMgbm9yIGJvZHkuIFN0YXJ0aW5nIG5vdywgYQogIEhUVFAgcmVzcG9uc2Ugb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gKGkuZSBub3Qgc2V0IHRvIGJlIGNsb3NlZCBhZnRlciB0aGUKICByZXNwb25zZSBoYXMgYmVlbiB0YWtlbiBjYXJlIG9mKSBtdXN0IGhhdmUgQ29udGVudC1MZW5ndGggb3IgY2h1bmtlZAogIGVuY29kaW5nIHNldCwgb3IgbGliY3VybCB3aWxsIHNpbXBseSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubyBib2R5LgoKICBUbyBteSBob3Jyb3IgSSBsZWFybmVkIHRoYXQgd2UgaGFkIG5vIGxlc3MgdGhhbiA1NyghKSB0ZXN0IGNhc2VzIHRoYXQgZGlkIGJhZAogIEhUVFAgcmVzcG9uc2VzIGxpa2UgdGhpcywgYW5kIGV2ZW4gdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgKHN3cykgcmVzcG9uZGVkIGJhZGx5CiAgd2hlbiBxdWVyaWVkIGJ5IHRoZSB0ZXN0IHN5c3RlbSBpZiBpdCBpcyB0aGUgdGVzdCBzeXN0ZW0uIFNvIGFsdGhvdWdoIHRoZQogIGFjdHVhbCBmaXggZm9yIHRoZSBwcm9ibGVtIHdhcyB0aW55LCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgbmV3bHkgZmFpbGluZyB0ZXN0CiAgY2FzZXMgZ290IHJlYWxseSBwYWluZnVsIGFuZCBib3JpbmcuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDYpCi0gSmFtZXMgSG91c2xleSBkaWQgbG90cyBvZiB3b3JrIGFuZCBpbnRyb2R1Y2VkIFNGVFAgZG93bmxvYWRzLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDA2KQotIFJvbiBpbiBidWcgIzE1OTUzNDggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1OTUzNDgpIHBvaW50ZWQKICBvdXQgYSBzdGFjayBvdmVyd3JpdGUgKGFuZCB0aGUgY29ycmVzcG9uZGluZyBmaXgpIG9uIDY0Yml0IFdpbmRvd3Mgd2hlbgogIGRlYWxpbmcgd2l0aCBIVFRQIGNodW5rZWQgZW5jb2RpbmcuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNikKLSBOaXIgU29mZmVyIHVwZGF0ZWQgbGliY3VybC5mcmFtZXdvcmsubWFrZToKICBvIGZpeCBzeW1saW5rcywgc2hvdWxkIGxpbmsgdG8gVmVyc2lvbnMsIG5vdCB0byAuL1ZlcnNpb25zCiAgbyBpbmRlbnRhdGlvbiBpbXByb3ZtZW50cwoKLSBEbWl0cml5IFNlcmdleWV2IGZvdW5kIGEgU0lHU0VHViB3aXRoIGhpcyB0ZXN0MDQuYyBleGFtcGxlIHBvc3RlZCBvbiA3IE5vdgogIDIwMDYuIEl0IHR1cm5lZCBvdXQgd2Ugd3JvbmdseSBhc3N1bWVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gY2FjaGUgd2FzIHByZXNlbnQKICB3aGVuIHRlYXJpbmcgZG93biBhIGNvbm5lY3Rpb24uCgotIENpcHJpYW4gQmFkZXNjdSBmb3VuZCBhIFNJR1NFR1Ygd2hlbiBkb2luZyBtdWx0aXBsZSBURlRQIHRyYW5zZmVycyB1c2luZyB0aGUKICBtdWx0aSBpbnRlcmZhY2UsIGJ1dCBJIGNvdWxkIGFsc28gcmVwZWF0IGl0IGRvaW5nIG11bHRpcGxlIHNlcXVlbnRpYWwgb25lcwogIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlLiBVc2luZyBDaXByaWFuJ3MgdGVzdCBjYXNlLCBJIGNvdWxkIGZpeCBpdC4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA2KQotIEJyYWRmb3JkIEJydWNlIHJlcG9ydGVkIHRoYXQgd2hlbiBzZXR0aW5nIENVUkxPUFRfREVCVUdGVU5DVElPTiB3aXRob3V0CiAgQ1VSTE9QVF9WRVJCT1NFIHNldCB0byBub24temVybywgeW91IHN0aWxsIGdvdCBhIGZldyBkZWJ1ZyBtZXNzYWdlcyBmcm9tIHRoZQogIFNTTCBoYW5kc2hha2UuIFRoaXMgaXMgbm93IHN0b3BwZWQuCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwNikKLSBPbGFmIGZpeGVkIGEgbGVmdG92ZXIgcHJvYmxlbSB3aXRoIHRoZSBDT05ORUNUIGZpeCBvZiBoaXMgdGhhdCB3b3VsZCBsZWF2ZSBhCiAgd3JvbmcgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSBidWZmZXIuCgpEYW5pZWwgKDMgTm92ZW1iZXIgMjAwNikKLSBPbGFmIFN0dWViZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IEkgZWRpdGVkIHNsaWdodGx5LiBJdCBmaXhlcyB0aGUgbm90b3Jpb3VzCiAgS05PV05fQlVHUyAjMjUsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIHByb3h5IGNsb3NlcyB0aGUgY29ubmVjdGlvbiB3aGVuCiAgbGliY3VybCBoYXMgc2VudCBDT05ORUNULCBhcyBwYXJ0IG9mIGFuIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9uLiBTdGFydGluZwogIG5vdywgbGliY3VybCB3aWxsIHJlLWNvbm5lY3QgYWNjb3JkaW5nbHkgYW5kIGNvbnRpbnVlIHRoZSBhdXRoZW50aWNhdGlvbiBhcwogIGl0IHNob3VsZC4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDA2KQotIEphbWVzIEhvdXNsZXkgYnJvdWdodCBzdXBwb3J0IGZvciBTQ1AgdHJhbnNmZXJzLCBiYXNlZCBvbiB0aGUgbGlic3NoMiBsaWJyYXJ5CiAgZm9yIHRoZSBhY3R1YWwgbmV0d29yayBwcm90b2NvbCBzdHVmZi4KCiAgQWRkZWQgdGhlc2UgbmV3IGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb25zOgoKICAgIENVUkxPUFRfU1NIX0FVVEhfVFlQRVMKICAgIENVUkxPUFRfU1NIX1BVQkxJQ19LRVlGSUxFCiAgICBDVVJMT1BUX1NTSF9QUklWQVRFX0tFWUZJTEUKClZlcnNpb24gNy4xNi4wICgzMCBPY3RvYmVyIDIwMDYpCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNikKLSBGaXhlZCBDVVJMT1BUX0ZBSUxPTkVSUk9SIHRvIHJldHVybiBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIGV2ZW4gZm9yIHRoZQogIGNhc2Ugd2hlbiA0MDEgb3IgNDA3IGFyZSByZXR1cm5lZCwgKklGKiBubyBhdXRoIGNyZWRlbnRpYWxzIGhhdmUgYmVlbiBnaXZlbi4KICBUaGUgQ1VSTE9QVF9GQUlMT05FUlJPUiBvcHRpb24gaXMgbm90IHBvc3NpYmxlIHRvIG1ha2UgZm9vbC1wcm9vZiBmb3IgNDAxCiAgYW5kIDQwNyBjYXNlcyB3aGVuIGF1dGggY3JlZGVudGlhbHMgaXMgZ2l2ZW4sIGJ1dCB3ZSd2ZSBub3cgY292ZXJlZCB0aGlzCiAgc29tZXdoYXQgbW9yZS4KCiAgWW91IG1pZ2h0IGdldCBzb21lIGFtb3VudHMgb2YgaGVhZGVycyB0cmFuc2ZlcnJlZCBiZWZvcmUgdGhpcyBzaXR1YXRpb24gaXMKICBkZXRlY3RlZCwgbGlrZSBmb3Igd2hlbiBhICIxMDAtY29udGludWUiIGlzIHJlY2VpdmVkIGFzIGEgcmVzcG9uc2UgdG8gYQogIFBPU1QvUFVUIGFuZCBhIDQwMSBvciA0MDcgaXMgcmVjZWl2ZWQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4KCiAgQWRkZWQgdGVzdCAyODEgdG8gdmVyaWZ5IHRoaXMgY2hhbmdlLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDYpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgYSBtYWpvciB1cGRhdGUgd2l0aCBwaXBlbGluaW5nIGZpeGVzLiBXZSBhbHNvIG5vIGxvbmdlcgogIHJlLXVzZSBjb25uZWN0aW9ucyAoZm9yIHBpcGVsaW5pbmcpIGJlZm9yZSB0aGUgbmFtZSByZXNvbHZpbmcgaXMgZG9uZS4KCkRhbmllbCAoMjEgT2N0b2JlciAyMDA2KQotIE5pciBTb2ZmZXIgbWFkZSB0aGUgdGVzdHMvbGlidGVzdC9NYWtlZmlsZS5hbSB1c2UgYSBwcm9wZXIgdmFyaWFibGUgZm9yIGFsbAogIHRoZSBzaW5nbGUgdGVzdCBhcHBsaWNhdGlvbnMnIGxpbmsgYW5kIGRlcGVuZGVuY2VzLCBzbyB0aGF0IHlvdSBlYXNpZXIgY2FuCiAgb3ZlcnJpZGUgdGhvc2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdoZW4gdXNpbmcgbWFrZS4KCi0gQXJtZWwgQXNzZWxpbiBzZXBhcmF0ZWQgQ0EgY2VydCB2ZXJpZmljYXRpb24gcHJvYmxlbXMgZnJvbSBwcm9ibGVtcyB3aXRoCiAgcmVhZGluZyB0aGUgKGxvY2FsKSBDQSBjZXJ0IGZpbGUgdG8gbGV0IHVzZXJzIGVhc2llciBwaW5wb2ludCB0aGUgYWN0dWFsCiAgcHJvYmxlbS4gQ1VSTEVfU1NMX0NBQ0VSVF9CQURGSUxFICg3NykgaXMgdGhlIG5ldyBsaWJjdXJsIGVycm9yIGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNikKLSBSZW1vdmVkIHRoZSAicHJvdG9jb2wtZ3Vlc3NpbmciIGZvciBVUkxzIHdpdGggaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoIEZUUFMKICBvciBURUxORVQgc2luY2UgdGhleSBhcmUgcHJhY3RpY2FsbHkgbm9uLWV4aXN0YW50LiBUaGlzIGxlYXZlcyB1cyB3aXRoIG9ubHkKICB0aHJlZSBkaWZmZXJlbnQgcHJlZml4ZXMgdGhhdCB3b3VsZCBhc3N1bWUgdGhlIHByb3RvY29sIGlzIGFueXRoaW5nIGJ1dAogIEhUVFAsIGFuZCB0aGV5IGFyZSBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggImZ0cC4iLCAiZGljdC4iIG9yICJsZGFwLiIuCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwNikKLSBCdWcgcmVwb3J0ICMxNTc5MTcxIHBvaW50ZWQgb3V0IGNvZGUgZmxhd3MgZGV0ZWN0ZWQgd2l0aCAicHJlZmFzdCIsIGFuZCB0aGV5CiAgd2VyZSAxIC0gYSB0b28gc21hbGwgbWVtb3J5IGNsZWFyIHdpdGggbWVtc2V0KCkgaW4gdGhlIHRocmVhZGVkIHJlc29sdmVyIGFuZAogIDIgLSBhIHJhbmdlIG9mIHBvdGVudGlhbGx5IGJhZCB1c2VzIG9mIHRoZSBjdHlwZSBmYW1pbHkgb2YgaXMqKCkgZnVuY3Rpb25zCiAgc3VjaCBhcyBpc2RpZ2l0KCksIGlzYWxudW0oKSwgaXNwcmludCgpIGFuZCBtb3JlLiBUaGUgbGF0dGVyIG1hZGUgbWUgc3dpdGNoCiAgdG8gdXNpbmcgb3VyIG93biBzZXQgb2YgdGhlc2UgZnVuY3Rpb25zL21hY3JvcyB1c2luZyB1cHBlcmNhc2UgbGV0dGVycywgYW5kCiAgd2l0aCBzb21lIGV4dHJhIHNldCBvZiBjcmF6eSB0eXBlY2FzdHMgdG8gYXZvaWQgbWlzdGFraW5nbHkgcGFzc2luZyBpbgogIG5lZ2F0aXZlIG51bWJlcnMgdG8gdGhlIHVuZGVybHlpbmcgaXMqKCkgZnVuY3Rpb25zLgoKLSBXaXRoIEplZmYgUG9obG1leWVyJ3MgaGVscCwgSSBmaXhlZCB0aGUgZXhwaXJlIHRpbWVyIHdoZW4gdXNpbmcKICBjdXJsX211bHRpX3NvY2tldCgpIGR1cmluZyBuYW1lIHJlc29sdmVzIHdpdGggYy1hcmVzIGFuZCB0aGUgTE9XX1NQRUVECiAgb3B0aW9ucyBub3cgd29yayBmaW5lIHdpdGggY3VybF9tdWx0aV9zb2NrZXQoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDYpCi0gQWRkZWQgYSBjaGVjayBpbiBjb25maWd1cmUgdGhhdCBzaW1wbHkgdHJpZXMgdG8gcnVuIGEgcHJvZ3JhbSAobm90IHdoZW4KICBjcm9zcy1jb21waWxpbmcpIGluIG9yZGVyIHRvIGRldGVjdCBwcm9ibGVtcyB3aXRoIHJ1bi10aW1lIGxpYnJhcmllcyB0aGF0CiAgb3RoZXJ3aXNlIHdvdWxkIG9jY3VyIHdoZW4gdGhlIHNpemVvZiB0ZXN0cyBmb3IgY3VybF9vZmZfdCB3b3VsZCBydW4gYW5kCiAgdGh1cyBiZSBtdWNoIG1vcmUgY29uZnVzaW5nIHRvIHVzZXJzLiBUaGUgY2hlY2sgb2YgY291cnNlIHNob3VsZCBydW4gYWZ0ZXIKICBhbGwgbGliLWNoZWNrcyBhcmUgZG9uZSBhbmQgYmVmb3JlIGFueSBvdGhlciB0ZXN0IGlzIHVzZWQgdGhhdCB3b3VsZCBydW4gYW4KICBleGVjdXRhYmxlIGJ1aWx0IGZvciB0ZXN0aW5nLXB1cnBvc2VzLgoKRGFuIEYgKDEzIE9jdG9iZXIgMjAwNikKLSBUaGUgdGFnZ2luZyBvZiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgUE9TVCBib2R5IGRhdGEgc2VudAogIHRvIHRoZSBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gY2FsbGJhY2sgaGFzIGJlZW4gZml4ZWQgKGl0IHdhcyBlcnJvbmVvdXNseQogIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGhlYWRlcikuICBBIG1lc3NhZ2Ugd2FzIGFsc28gYWRkZWQgdG8gdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2hvdyB3aGVuIGRhdGEgaXMgYmVpbmcgc2VudCwgZW5hYmxlZCB3aGVuCiAgLS12ZXJib3NlIGlzIHVzZWQuCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwNikKLSBTdGFydGluZyBub3csIGFkZGluZyBhbiBlYXN5IGhhbmRsZSB0byBhIG11bHRpIHN0YWNrIHRoYXQgd2FzIGFscmVhZHkgYWRkZWQKICB0byBhIG11bHRpIHN0YWNrIHdpbGwgY2F1c2UgQ1VSTE1fQkFEX0VBU1lfSEFORExFIHRvIGdldCByZXR1cm5lZC4KCi0gSmVmZiBQb2hsbWV5ZXIgaGFzIGJlZW4gd29ya2luZyB3aXRoIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIHNvdXJjZSBjb2RlLAogIGFuZCB3aGlsZSBkb2luZyBzbyBpdCBiZWNhbWUgYXBwYXJlbnQgdGhhdCB0aGUgY3VycmVudCB0aW1lb3V0IHN5c3RlbSBmb3IKICB0aGUgc29ja2V0IEFQSSByZWFsbHkgd2FzIGEgYml0IGF3a3dhcmQgc2luY2UgaXQgYmVjb21lIHF1aXRlIHNvbWUgd29yayB0bwogIGJlIHN1cmUgd2UgaGF2ZSB0aGUgY29ycmVjdCB0aW1lb3V0IHNldC4KCiAgSmVmZiB0aGVuIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE1PUFRfVElNRVJGVU5DVElPTiB0aGF0IGlzIHlldCBhbm90aGVyCiAgY2FsbGJhY2sgdGhlIGFwcCBjYW4gc2V0IHRvIGdldCB0byBrbm93IHdoZW4gdGhlIGdlbmVyYWwgdGltZW91dCB0aW1lCiAgY2hhbmdlcyBhbmQgdGh1cyBmb3IgYW4gYXBwbGljYXRpb24gbGlrZSBoaXBlcmZpZm8uYyBpdCBtYWtlcyBldmVyeXRoaW5nIGEKICBsb3QgZWFzaWVyIGFuZCBuaWNlci4gVGhlcmUncyBhIENVUkxNT1BUX1RJTUVSREFUQSBvcHRpb24gdG9vIG9mIGNvdXJzZSBpbgogIGdvb2Qgb2xkIGxpYmN1cmwgdHJhZGl0aW9uLgoKICBKZWZmIGhhcyBhbHNvIHVwZGF0ZWQgdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgY29kZSB0byB1c2UgdGhpcyBuZXdzLgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwNikKLSBCb2dkYW4gTmljdWxhJ3Mgc2Vjb25kIHRlc3QgY2FzZSAocG9zdGVkIFN1biwgMDggT2N0IDIwMDYpIGNvbnZlcnRlZCB0byB0ZXN0CiAgY2FzZSA1MzUgYW5kIGl0IG5vdyBydW5zIGZpbmUuIEFnYWluIGEgcHJvYmxlbSB3aXRoIHRoZSBwaXBlbGluaW5nIGNvZGUgbm90CiAgdGFraW5nIGFsbCBwb3NzaWJsZSAoZXJyb3IpIGNvbmRpdGlvbnMgaW50byBhY2NvdW50LgoKRGFuaWVsICg2IE9jdG9iZXIgMjAwNikKLSBCb2dkYW4gTmljdWxhJ3MgaGFuZ2luZyB0ZXN0IGNhc2UgKHBvc3RlZCBXZWQsIDA0IE9jdCAyMDA2KSB3YXMgY29udmVydGVkIHRvCiAgdGVzdCBjYXNlIDUzMyBhbmQgdGhlIHRlc3Qgbm93IHJ1bnMgZmluZS4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDYpCi0gRG1pdHJpeSBTZXJnZXlldiBwcm92aWRlZCBhbiBleGFtcGxlIHNvdXJjZSBjb2RlIHRoYXQgY3Jhc2hlZCBDVlMgbGliY3VybAogIGJ1dCB0aGF0IHdvcmtlZCBuaWNlbHkgaW4gNy4xNS41LiBJIGNvbnZlcnRlZCBpdCBpbnRvIHRlc3QgY2FzZSA1MzIgYW5kCiAgZml4ZWQgdGhlIHByb2JsZW0uCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDA2KQotIFJlbW92ZWQgYSBmZXcgb3RoZXIgbm8tbG9uZ2VyIHByZXNlbnQgb3B0aW9ucyBmcm9tIHRoZSBoZWFkZXIgZmlsZS4KCi0gU3VwcG9ydCBmb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVycyB3YXMgcmVtb3ZlZC4gSGVyZSdzIHdoeToKCiAgbyBUaGUgcmVjZW50IG11bHRpIGludGVyZmFjZSBjaGFuZ2VzIGJyb2tlIGl0IGFuZCB0aGUgZGVzaWduIG9mIHRoZSAzcmQgcGFydHkKICAgIHRyYW5zZmVycyBtYWRlIGl0IHZlcnkgaGFyZCB0byBmaXggdGhlIHByb2JsZW1zCiAgbyBJdCB3YXMgc3RpbGwgYmxvY2tpbmcgYW5kIHRodXMgbmFzdHkgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKICBvIEl0IHdhcyBhIGxvdCBvZiBleHRyYSBjb2RlIGZvciBhIHZlcnkgcmFyZWx5IHVzZWQgZmVhdHVyZQogIG8gSXQgZGlkbid0IHVzZSB0aGUgc2FtZSBjb2RlIGFzIGZvciAicGxhaW4iIEZUUCB0cmFuc2ZlcnMsIHNvIGl0IGRpZG4ndCB3b3JrCiAgICBmaW5lIGZvciBJUHY2IGFuZCBpdCBkaWRuJ3QgcHJvcGVybHkgcmUtdXNlIGNvbm5lY3Rpb25zIGFuZCBtb3JlCiAgbyBUaGVyZSdzIG5vYm9keSBhcm91bmQgd2hvJ3Mgd2lsbGluZyB0byB3b3JrIG9uIGFuZCBpbXByb3ZlIHRoZSBleGlzdGluZwogICAgY29kZQoKICBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgYXJlIGJhbm5lZCBmb3JldmVyLCBvbmx5IHRoYXQKICB0aGV5IG5lZWQgdG8gYmUgZG9uZSBiZXR0ZXIgaWYgdGhleSBhcmUgdG8gYmUgcmUtYWRkZWQgaW4gdGhlIGZ1dHVyZS4KCiAgVGhlIENVUkxPUFRfU09VUkNFXyogb3B0aW9ucyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBsaWIgYW5kIHNvIGFyZSB0aGUgLS0zcCoKICBvcHRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0b29sLiBGb3IgdGhpcyByZWFzb24sIEkgYWxzbyBidW1wZWQgdGhlCiAgdmVyc2lvbiBpbmZvIGZvciB0aGUgbGliLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwNikKLSBSZXBvcnRlZCBpbiAjMTU2MTQ3MCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU2MTQ3MCksIGxpYmN1cmwKICB3b3VsZCBjcmFzaCBpZiBhIGJhZCBmdW5jdGlvbiBzZXF1ZW5jZSB3YXMgdXNlZCB3aGVuIHNodXR0aW5nIGRvd24gYWZ0ZXIKICB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIChpLmUgdXNpbmcgZWFzeV9jbGVhbnVwIGFmdGVyIG11bHRpX2NsZWFudXApIHNvCiAgcHJlY2F1dGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGFueSBtb3JlIC0gdGVzdCBjYXNlIDUyOQogIHdhcyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA2KQotIFRoZSBVUkwgaW4gdGhlIGNvb2tpZSBqYXIgZmlsZSBpcyBub3cgY2hhbmdlZCBzaW5jZSBpdCB3YXMgZ2l2aW5nIGEgNDA0LgogIFJlcG9ydGVkIGJ5IFRpbW90aHkgU3RvbmUuIFRoZSBuZXcgVVJMIHdpbGwgdGFrZSB0aGUgdmlzaXRvciB0byBhIGN1cmwgd2ViCiAgc2l0ZSBtaXJyb3Igd2l0aCB0aGUgZG9jdW1lbnQuCgpEYW5pZWwgKDI0IFNlcHRlbWJlciAyMDA2KQotIEJlcm5hcmQgTGVhayBmaXhlZCBjb25maWd1cmUgLS13aXRoLWdzc2FwaS1saWJzLgoKLSBDb3J5IE5lbHNvbiBtYWRlIGxpYmN1cmwgdXNlIHRoZSBXU0FQb2xsKCkgZnVuY3Rpb24gaWYgYnVpbHQgZm9yIFdpbmRvd3MKICBWaXN0YSAoX1dJTjMyX1dJTk5UID49IDB4MDYwMCkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDYpCi0gTWlrZSBQcm90dHMgYWRkZWQgLS1mdHAtc3NsLWNvbnRyb2wgdG8gbWFrZSBjdXJsIHVzZSBGVFAtU1NMLCBidXQgb25seQogIGVuY3J5cHQgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBhbmQgdXNlIHRoZSBkYXRhIGNvbm5lY3Rpb24gInBsYWluIi4KCi0gRG1pdHJpeSBTZXJnZXlldiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgU09DS1NbNDVdIGNvZGUgd29yayBiZXR0ZXIKICBhcyBpdCBub3cgd2lsbCByZWFkIHRoZSBmdWxsIGRhdGEgc2VudCBmcm9tIHNlcnZlcnMuIFRoZSBTT0NLUy1yZWxhdGVkIGNvZGUKICB3YXMgYWxzbyBtb3ZlZCB0byB0aGUgbmV3IGxpYi9zb2Nrcy5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNikKLSBBZGRlZCB0ZXN0IGNhc2UgNTMxIGluIGFuIGF0dGVtcHQgdG8gcmVwZWF0IGJ1ZyByZXBvcnQgIzE1NjE0NzAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU2MTQ3MCkgdGhhdCBpcyBzYWlkIHRvIGNyYXNoIHdoZW4gYW4KICBGVFAgdXBsb2FkIGZhaWxzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gSXQgZGlkIG5vdCwgYnV0IEkgbWFkZSBhIGZhaWxlZAogIHVwbG9hZCBzdGlsbCBhc3N1bWUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB0byBiZSBmaW5lLgoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwNikKLSBBcm1lbCBBc3NlbGluIGZpeGVkIHByb2JsZW1zIHdoZW4geW91IGdhdmUgYSBwcm94eSBVUkwgd2l0aCB1c2VyIG5hbWUgYW5kCiAgZW1wdHkgcGFzc3dvcmQgb3Igbm8gcGFzc3dvcmQgYXQgYWxsLiBUZXN0IGNhc2UgMjc4IGFuZCAyNzkgd2VyZSBhZGRlZCB0bwogIHZlcmlmeS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgZG9jcy9leGFtcGxlcy8xMC1hdC1hLXRpbWUuYyBieSBNaWNoYWVsIFdhbGxuZXIKCi0gQWRkZWQgZG9jcy9leGFtcGxlcy9oaXBlcmZpZm8uYyBieSBKZWZmIFBvaGxtZXllcgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNikKLSBGaXhlZCBteSBicmVha2FnZSBmcm9tIGVhcmxpZXIgdG9kYXkgc28gdGhhdCBkb2luZyBjdXJsX2Vhc3lfY2xlYW51cCgpIG9uIGEKICBoYW5kbGUgdGhhdCBpcyBwYXJ0IG9mIGEgbXVsdGkgaGFuZGxlIGZpcnN0IHJlbW92ZXMgdGhlIGhhbmRsZSBmcm9tIHRoZQogIHN0YWNrLgoKLSBBZGRlZCBDVVJMT1BUX1NTTF9TRVNTSU9OSURfQ0FDSEUgYW5kIC0tbm8tc2Vzc2lvbmlkIHRvIGRpc2FibGUgU1NMCiAgc2Vzc2lvbi1JRCByZS11c2Ugb24gZGVtYW5kIHNpbmNlIHRoZXJlIG9idmlvdXNseSBhcmUgYnJva2VuIHNlcnZlcnMgb3V0CiAgdGhlcmUgdGhhdCBtaXNiZWhhdmUgd2l0aCBzZXNzaW9uLUlEcyB1c2VkLgoKLSBKZWZmIFBvaGxtZXllciBwcmVzZW50ZWQgYSAqbXVsdGlfc29ja2V0KCktdXNpbmcgcHJvZ3JhbSB0aGF0IGV4cG9zZWQgYQogIHByb2JsZW0gd2l0aCBpdCAoU0lHU0VHVi1zdHlsZSkuIEl0IGNsZWFybHkgc2hvd2VkIHRoYXQgdGhlIGV4aXN0aW5nCiAgc29ja2V0LXN0YXRlIGFuZCBzdGF0ZS1kaWZmZXJlbmNlIGZ1bmN0aW9uIHdhc24ndCBnb29kIGVub3VnaCBzbyBJIHJld3JvdGUKICBpdCBhbmQgY291bGQgdGhlbiByZS1ydW4gSmVmZidzIHByb2dyYW0gd2l0aG91dCBhbnkgY3Jhc2guIFRoZSBwcmV2aW91cwogIHZlcnNpb24gY2xlYXJseSBjb3VsZCBtaXNzIHRvIHRlbGwgdGhlIGFwcGxpY2F0aW9uIHdoZW4gYSBoYW5kbGUgY2hhbmdlZAogIGZyb20gdXNpbmcgb25lIHNvY2tldCB0byB1c2luZyBhbm90aGVyLgoKICBXaGlsZSBJIHdhcyBhdCBpdCAoYXMgSSBjb3VsZCB1c2UgdGhpcyBhcyBhIG1lYW5zIHRvIHRyYWNrIHRoaXMgcHJvYmxlbQogIGRvd24pLCBJJ3ZlIG5vdyBhZGRlZCBhICdtYWdpYycgbnVtYmVyIHRvIHRoZSBlYXN5IGhhbmRsZSBzdHJ1Y3QgdGhhdCBpcwogIGluaXRlZCBhdCBjdXJsX2Vhc3lfaW5pdCgpIHRpbWUgYW5kIGNsZWFyZWQgYXQgY3VybF9lYXN5X2NsZWFudXAoKSB0aW1lIHRoYXQKICB3ZSBjYW4gdXNlIGludGVybmFsbHkgdG8gZGV0ZWN0IHRoYXQgYW4gZWFzeSBoYW5kbGUgc2VlbXMgdG8gYmUgZmluZSwgb3IgYXQKICBsZWFzdCBub3QgY2xvc2VkIG9yIGZyZWVkIChmcmVlaW5nIGluIGRlYnVnIGJ1aWxkcyBmaWxsIHRoZSBhcmVhIHdpdGggMHgxMwogIGJ5dGVzIGJ1dCBpbiBub3JtYWwgYnVpbGRzIHdlIGNhbiBvZiBjb3Vyc2Ugbm90IGFzc3VtZSBhbnkgcGFydGljdWxhciBkYXRhCiAgaW4gdGhlIGZyZWVkIGFyZWFzKS4KCkRhbmllbCAoOSBTZXB0ZW1iZXIgMjAwNikKLSBNaWNoZWxlIEJpbmkgZml4ZWQgaG93IHRoZSBob3N0bmFtZSBpcyBwdXQgaW4gTlRMTSBwYWNrYWdlcy4gQXMgc2VydmVycwogIGRvbid0IGV4cGVjdCBmdWxseSBxdWFsaWZpZWQgbmFtZXMgd2UgbmVlZCB0byBjdXQgdGhlbSBvZmYgYXQgdGhlIGZpcnN0IGRvdC4KCi0gUGV0ZXIgU3lsdmVzdGVyIGNsZWFuZWQgdXAgYW5kIGZpeGVkIHRoZSBnZXRzb2NrbmFtZSgpIHVzZXMgaW4gZnRwLmMuIFNvbWUKICBvZiB0aGVtIGNhbiBiZSBjb21wbGV0ZXRseSByZW1vdmVkIHRob3VnaC4uLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA2KQotIFJhdmkgUHJhdGFwIGFuZCBJIGhhdmUgaW1wbGVtZW50ZWQgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQuIEVuYWJsZSBpdCBmb3IgYQogIG11bHRpIGhhbmRsZSB1c2luZyBDVVJMTU9QVF9QSVBFTElOSU5HIGFuZCBhbGwgSFRUUCBjb25uZWN0aW9ucyBkb25lIG9uIHRoYXQKICBoYW5kbGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gZ2V0IHBpcGVsaW5lZCBpbnN0ZWFkIG9mIGRvbmUgaW4gcGFyYWxsZWxsIGFzCiAgdGhleSBhcmUgcGVyZm9ybWVkIG90aGVyd2lzZS4KCiAgQXMgYSBzaWRlLWVmZmVjdCBmcm9tIHRoaXMgd29yaywgY29ubmVjdGlvbnMgYXJlIG5vdyBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeQogIGhhbmRsZXMgd2l0aGluIGEgbXVsdGkgaGFuZGxlLCBzbyBpZiB5b3UgdXNlIE4gZWFzeSBoYW5kbGVzIGZvciB0cmFuc2ZlcnMsCiAgZWFjaCBvZiB0aGVtIGNhbiBwaWNrIHVwIGFuZCByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgdXNlZCBieQogIGFueSBvZiB0aGUgaGFuZGxlcywgYmUgaXQgdGhlIHNhbWUgb3Igb25lIG9mIHRoZSBvdGhlcnMuCgogIFRoaXMgc2VwYXJhdGlvbiBvZiB0aGUgdGlnaHQgcmVsYXRpb25zaGlwIGJldHdlZW4gY29ubmVjdGlvbnMgYW5kIGVhc3kKICBoYW5kbGVzIGlzIG1vc3Qgbm90aWNhYmxlIHdoZW4geW91IGNsb3NlIGVhc3kgaGFuZGxlcyB0aGF0IGhhdmUgYmVlbiB1c2VkIGluCiAgYSBtdWx0aSBoYW5kbGUgYW5kIGNoZWNrIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBvciB3YXRjaCB0aGUgZGVidWcgb3V0cHV0LCBhcwogIHRoZXJlIGFyZSB0aW1lcyB3aGVuIGxpYmN1cmwgd2lsbCBrZWVwIHRoZSBlYXN5IGhhbmRsZSBhcm91bmQgZm9yIGEgd2hpbGUKICBsb25nZXIgdG8gYmUgYWJsZSB0byBjbG9zZSBpdCBwcm9wZXJseS4gTGlrZSBmb3Igc2VuZGluZyBRVUlUIHRvIGNsb3NlIGRvd24KICBhbiBGVFAgY29ubmVjdGlvbi4KCiAgVGhpcyBpcyBhIG1ham9yIGNoYW5nZS4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNikKLSBEbWl0cnkgUmVjaGtpbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU1MTQxMikgcHJvdmlkZWQgYQogIHBhdGNoIHRoYXQgd2hpbGUgbm90IGZpeGluZyB0aGluZ3MgdmVyeSBuaWNlbHksIGl0IGRvZXMgbWFrZSB0aGUgU09DS1M1CiAgcHJveHkgY29ubmVjdGlvbiBzbGlnaHRseSBiZXR0ZXIgYXMgaXQgbm93IGFja25vd2xlZGdlcyB0aGUgdGltZW91dCBmb3IKICBjb25uZWN0aW9uIGFuZCBpdCBubyBsb25nZXIgc2VnZmF1bHRzIGluIHRoZSBjYXNlIHdoZW4gU09DS1MgcmVxdWlyZXMKICBhdXRoZW50aWNhdGlvbiBhbmQgeW91IGRpZCBub3Qgc3BlY2lmeSB1c2VybmFtZTpwYXNzd29yZC4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDYpCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhbmQgZml4ZWQgYSBtdWx0aSBpbnRlcmZhY2UgZmxhdyB3aGVuIHVzaW5nIGFzeW5jaAogIG5hbWUgcmVzb2x2ZXMuIEl0IGNvdWxkIGdldCBzdHVjayBpbiB0aGUgd3Jvbmcgc3RhdGUuCgpHaXNsZSAoMjkgQXVndXN0IDIwMDYpCi0gQWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgTVMtRE9TIGNvbXBpbGVycyAoZGVzaWRlcyBkamdwcCkuIEFsbCBNUy1ET1MKICBjb21waWxlciBub3cgdXNlcyB0aGUgc2FtZSBjb25maWcuZG9zIGZpbGUgKHJlbmFtZWQgdG8gY29uZmlnLmggYnkKICBtYWtlKS4gbGliY3VybCBub3cgYnVpbGRzIGZpbmUgdXNpbmcgV2F0Y29tIGFuZCBNZXRhd2FyZSdzIEhpZ2gtQwogIHVzaW5nIHRoZSBXYXR0LTMyIHRjcC9pcC1zdGFjay4KCkRhbmllbCAoMjkgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgQ1VSTE9QVF9TT0NLT1BURlVOQ1RJT04gYW5kIENVUkxPUFRfU09DS09QVERBVEEgdG8KICBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2V0IHRoZWlyIG93biBzb2NrZXQgb3B0aW9ucy4KCkRhbmllbCAoMjUgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiByZXBvcnRlZCB0aGF0IHRoZSAncnVubmluZ19oYW5kbGVzJyBjb3VudGVyIHdhc24ndCB1cGRhdGVkCiAgcHJvcGVybHkgaWYgeW91IHJlbW92ZWQgYSAibGl2ZSIgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgd2l0aAogIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpLgoKRGFuaWVsICgyMiBBdWd1c3QgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIHJlbWFpbmluZyBtaXN0YWtlIGZyb20gdGhlIEF1Z3VzdCAxOSBUWVBFIGNoYW5nZS4KCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgQWxsb3dTZXJ2ZXJDb25uZWN0KCkgaW4gdGhlIEZUUAogIGNvZGUgd2hlbiBkb2luZyBwdXJlIGlwdjYgRVBSVCBjb25uZWN0aW9ucy4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDYpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBBcm1lbCBBc3NlbGluLCB0aGUgRlRQIGNvZGUgbm8gbG9uZ2VyIHJlLWlzc3VlcyB0aGUgVFlQRQogIGNvbW1hbmQgb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiB1bmxlc3MgaXQgaGFzIHRvLgoKLSBBcm1lbCBBc3NlbGluIGZpeGVkIGEgY3Jhc2ggaW4gdGhlIEZUUCBjb2RlIHdoZW4gdXNpbmcgU0lOR0xFQ1dEIG1vZGUgYW5kCiAgZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgoKLSBBbmRyZXcgQmlnZ3MgcG9pbnRlZCBvdXQgYSAiRXhwZWN0OiAxMDAtY29udGludWUiIGZsYXcgd2hlcmUgbGliY3VybCBkaWRuJ3QKICBzZW5kIHRoZSB3aG9sZSByZXF1ZXN0IGF0IG9uY2UsIGV2ZW4gdGhvdWdoIHRoZSBFeHBlY3Q6IGhlYWRlciB3YXMgZGlzYWJsZWQKICBieSB0aGUgYXBwbGljYXRpb24uIEFuIGVmZmVjdCBvZiB0aGlzIGNoYW5nZSBpcyBhbHNvIHRoYXQgc21hbGwgKDwgMTAyNAogIGJ5dGVzKSBQT1NUcyBhcmUgbm93IGFsd2F5cyBzZW50IHdpdGhvdXQgRXhwZWN0OiBoZWFkZXIgc2luY2Ugd2UgZGVlbSBpdAogIG1vcmUgY29zdGx5IHRvIGJvdGhlciBhYm91dCB0aGF0IHRoYW4gdGhlIHJpc2sgdGhhdCB3ZSBzZW5kIHRoZSBkYXRhIGluCiAgdmFpbi4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNikKLSBBcm1lbCBBc3NlbGluIG1hZGUgdGhlIENVUkxPUFRfUFJFUVVPVEUgb3B0aW9uIHdvcmsgZmluZSBldmVuIHdoZW4KICBDVVJMT1BUX05PQk9EWSBpcyBzZXQgdHJ1ZS4gUFJFUVVPVEUgaXMgdGhlbiBydW4gcm91Z2hseSBhdCB0aGUgc2FtZSBwbGFjZQogIGluIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFzIGl0IHdvdWxkIGhhdmUgcnVuIGlmIHRoZXJlIHdvdWxkJ3ZlIGJlZW4gYQogIHRyYW5zZmVyLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA2KQotIEZpeGVkIGEgZmxhdyBpbiB0aGUgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiB0cmVhdG1lbnQuIElmIHlvdSBkaWQgdHdvIFBPU1RzCiAgb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIGFsbG93ZWQgdGhlIGZpcnN0IHRvIHVzZSB0aGF0IGhlYWRlciwgeW91CiAgY291bGQgbm90IGRpc2FibGUgaXQgZm9yIHRoZSBzZWNvbmQgcmVxdWVzdC4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNikKLSBEb21lbmljbyBBbmRyZW9sZm91bmQgYSBxdWljayBidWlsZCBlcnJvciB3aGljaCBoYXBwZW5lZCBiZWNhdXNlCiAgc3JjL2NvbmZpZy5oLmluIHdhcyBub3QgYSBwcm9wZXIgZHVwbGNhdGUgb2YgbGliL2NvbmZpZy5oLmluIHdoaWNoIGl0CiAgc2hvdWxkJ3ZlIGJlZW4gYW5kIHRoaXMgd2FzIGR1ZSB0byB0aGUgbWFrZXRneiBzY3JpcHQgbm90IGRvaW5nIHRoZSBjcAogIHByb3Blcmx5LgoKVmVyc2lvbiA3LjE1LjUgKDcgQXVndXN0IDIwMDYpCgpEYW5pZWwgKDIgQXVndXN0IDIwMDYpCi0gTWFyayBMZW50Y3puZXIgZml4ZWQgaG93IGxpYmN1cmwgd2FzIG5vdCBwcm9wZXJseSBkb2luZyBjaHVua2VkIGVuY29kaW5nCiAgaWYgdGhlIGhlYWRlciAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIHdhcyBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzE4MzgKCkRhbmllbCAoMSBBdWd1c3QgMjAwNikKLSBNYWNpZWogS2FycGl1ayBmaXhlZCBhIGNyYXNoIHRoYXQgd291bGQgb2NjdXIgaWYgd2UgcGFzc2VkIEN1cmxfc3RyZXJyb3IoKQogIGFuIHVua25vd24gZXJyb3IgbnVtYmVyIG9uIGdsaWJjIHN5c3RlbXMuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMjI4OQoKRGFuaWVsICgzMSBKdWx5IDIwMDYpCi0gKkFMRVJUKiBjdXJsX211bHRpX3NvY2tldCgpIGFuZCBjdXJsX211bHRpX3NvY2tldF9hbGwoKSBnb3QgbW9kaWZpZWQKICBwcm90b3R5cGVzOiB0aGV5IGJvdGggbm93IHByb3ZpZGUgdGhlIG51bWJlciBvZiBydW5uaW5nIGhhbmRsZXMgYmFjayB0byB0aGUKICBjYWxsaW5nIGZ1bmN0aW9uLiBJdCBtYWtlcyB0aGUgZnVuY3Rpb25zIHJlc2VtYmxlIHRoZSBnb29kIG9sZAogIGN1cmxfbXVsdGlfcGVyZm9ybSgpIG1vcmUgYW5kIHByb3ZpZGVzIGEgbmljZSB3YXkgdG8ga25vdyB3aGVuIHRoZSBtdWx0aQogIGhhbmRsZSBnb2VzIGVtcHR5LgoKICBBTEVSVDI6IGRvbid0IHVzZSB0aGUgY3VybF9tdWx0aV9zb2NrZXQqKCkgZnVuY3Rpb25hbGl0eSBpbiBhbnl0aGluZwogIHByb2R1Y3Rpb24tbGlrZSB1bnRpbCBJIHNheSBpdCdzIHNvbWV3aGF0IHNldHRsZWQsIGFzIEkgc3VzcGVjdCB0aGVyZSBtaWdodAogIGJlIHNvbWUgZnVydGhlciBBUEkgY2hhbmdlcyBiZWZvcmUgSSdtIGRvbmUuLi4KCkRhbmllbCAoMjggSnVseSAyMDA2KQotIFl2ZXMgTGVqZXVuZSBmaXhlZCBzbyB0aGF0IHJlcGxhY2luZyBDb250ZW50LVR5cGU6IHdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzIHdvcmsgZXhhY3RseSB0aGUgd2F5IHlvdSB3YW50IGl0IChhbmQgdGhlIHdheSB5b3UnZCBhc3N1bWUgaXQKICB3b3JrcykuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCAtLWZ0cC1zc2wtcmVxZCB3aGljaCBtYWtlcyBjdXJsICpyZXF1aXJlKiBTU0wgZm9yIGJvdGgKICBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24sIGFzIHRoZSBleGlzdGluZyAtLWZ0cC1zc2wgb3B0aW9uIG9ubHkgcmVxdWVzdHMKICBpdC4KCi0gW0hpcGVyLXJlbGF0ZWQgd29ya10gQWRkZWQgYSBmdW5jdGlvbiBjYWxsZWQgY3VybF9tdWx0aV9hc3NpZ24oKSB0aGF0IHdpbGwKICBzZXQgYSBwcml2YXRlIHBvaW50ZXIgYWRkZWQgdG8gdGhlIGludGVybmFsIGxpYmN1cmwgaGFzaCB0YWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciBzb2NrZXQgcGFzc2VkIGluIHRvIHRoaXMgZnVuY3Rpb246CgogIENVUkxNY29kZSBjdXJsX211bHRpX2Fzc2lnbihDVVJMTSAqbXVsdGlfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NvY2tldF90IHNvY2tmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc29ja3ApOwoKICAnc29ja3AnIGJlaW5nIGEgY3VzdG9tIHBvaW50ZXIgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICB0aGlzIHNvY2tldC4gVGhlIHNvY2tldCBoYXMgdG8gYmUgYWxyZWFkeSBleGlzdGluZyBhbmQgaW4tdXNlIGJ5IGxpYmN1cmwsCiAgbGlrZSBoYXZpbmcgYWxyZWFkeSBjYWxsZWQgdGhlIGNhbGxiYWNrIHRlbGxpbmcgYWJvdXQgaXRzIGV4aXN0YW5jZS4KCiAgVGhlIHNldCBoYXNocCBwb2ludGVyIHdpbGwgdGhlbiBiZSBwYXNzZWQgb24gdG8gdGhlIGNhbGxiYWNrIGluIHVwY29taW5nCiAgY2FsbHMgd2hlbiB0aGlzIHNhbWUgc29ja2V0IGlzIHVzZWQgKGluIHRoZSBicmFuZCBuZXcgJ3NvY2tldHAnIGFyZ3VtZW50KS4KCkRhbmllbCAoMjYgSnVseSAyMDA2KQotIERhbiBOZWxzb24gYWRkZWQgdGhlIENVUkxPUFRfRlRQX0FMVEVSTkFUSVZFX1RPX1VTRVIgbGliY3VybCBvcHRpb24gYW5kIGN1cmwKICB0b29sIG9wdGlvbiBuYW1lZCAtLWZ0cC1hbHRlcm5hdGl2ZS10by11c2VyLiBJdCBwcm92aWRlcyBhIG1lYW4gdG8gc2VuZCBhCiAgcGFydGljdWxhciBjb21tYW5kIGlmIHRoZSBub3JtYWwgVVNFUi9QQVNTIGFwcHJvYWNoIGZhaWxzLgoKLSBNaWNoYWVsIEplcnJpcyBhZGRlZCBtYWdpYyB0aGF0IGJ1aWxkcyBsaWIvY3VybGxpYi52Y3Byb2ogYXV0b21hdGljYWxseSBmb3IKICBuZXdlciBNU1ZDLgoKRGFuaWVsICgyNSBKdWx5IDIwMDYpCi0gR2VvcmcgSG9ybiBtYWRlIHRoZSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBtb3JlIGRldGFpbHMuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGJ1aWxkIGVycm9yIHdoZW4gYnVpbGRpbmcgbGliY3VybCB3aXRoIEhUVFAgZGlzYWJsZWQsCiAgcHJvYmxlbSBhZGRlZCB3aXRoIHRoZSBjdXJsX2Zvcm1nZXQoKSBwYXRjaC4KCkRhbmllbCAoMTcgSnVseSAyMDA2KQotIEphcmkgU3VuZGVsbCBkaWQgc29tZSBleGNlbGxlbnQgcmVzZWFyY2ggYW5kIGJ1ZyB0cmFja2luZywgZmlndXJlZCBvdXQgdGhhdAogIHdlIGRpZCB3cm9uZyBhbmQgcGF0Y2hlZCBpdDogV2hlbiBub2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgc3BsYXkgdHJlZSwKICBhbmQgd2UgZGlkbid0IHByb3Blcmx5IHJlbW92ZSBpdCBmcm9tIHRoZSBzcGxheSB0cmVlIHdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzCiAgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgc3RhY2sgYW5kIHRodXMgd2UgY291bGQgd3JvbmdseSBsZWF2ZSBhIG5vZGUgaW4gdGhlCiAgc3BsYXkgdHJlZSBwb2ludGluZyB0byAoYmFkKSBtZW1vcnkuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGZsYXcgd2hlcmUgdGhlIENSTEYgY291bnRlciB3YXNuJ3QgcHJvcGVybHkgY2xlYXJlZAogIGZvciBGVFAgQVNDSUkgdHJhbnNmZXJzLgoKRGFuaWVsICg4IEp1bHkgMjAwNikKLSBBdGVzIEdvcmFsIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGNvb2tpZSBwYXJzZXIgZGlkIGNhc2UgaW5zZW5zaXRpdmUKICBzdHJpbmcgY29tcGFyaXNvbnMgb24gdGhlIHBhdGggd2hpY2ggaXMgaW5jb3JyZWN0IGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQKICBmaXhlcyB0aGlzLiBJIGVkaXRlZCB0ZXN0IGNhc2UgOCB0byBpbmNsdWRlIGRldGFpbHMgdGhhdCB0ZXN0IGZvciB0aGlzLgoKLSBJbmdtYXIgUnVuZ2UgcHJvdmlkZWQgYSBzb3VyY2Ugc25pcHBldCB0aGF0IGNhdXNlZCBhIGNyYXNoLiBUaGUgcmVhc29uIGZvcgogIHRoZSBjcmFzaCB3YXMgdGhhdCBsaWJjdXJsIGludGVybmFsbHkgd2FzIGEgYml0IGNvbmZ1c2VkIGFib3V0IHdobyBvd25lZCB0aGUKICBETlMgY2FjaGUgYXQgYWxsIHRpbWVzIHNvIGlmIHlvdSBjcmVhdGVkIGFuIGVhc3kgaGFuZGxlIHRoYXQgdXNlcyBhIHNoYXJlZAogIEROUyBjYWNoZSBhbmQgYWRkZWQgdGhhdCB0byBhIG11bHRpIGhhbmRsZSBpdCB3b3VsZCBjcmFzaC4gTm93IHdlIGtlZXAgbW9yZQogIGNhcmVmdWwgaW50ZXJuYWwgdHJhY2sgb2YgZXhhY3RseSB3aGF0IGtpbmQgb2YgRE5TIGNhY2hlIGVhY2ggZWFzeSBoYW5kbGUKICB1c2VzOiBOb25lLCBQcml2YXRlIChhbGxvY2F0ZWQgZm9yIGFuZCB1c2VkIG9ubHkgYnkgdGhpcyBzaW5nbGUgaGFuZGxlKSwKICBTaGFyZWQgKHBvaW50cyB0byBhIGNhY2hlIGhlbGQgYnkgYSBzaGFyZWQgb2JqZWN0KSwgR2xvYmFsIChwb2ludHMgdG8gdGhlCiAgZ2xvYmFsIGNhY2hlKSBvciBNdWx0aSAocG9pbnRzIHRvIHRoZSBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZSB0aGF0IGlzCiAgYXV0b21hdGljYWxseSBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeSBoYW5kbGVzIHRoYXQgYXJlIGFkZGVkIHdpdGggcHJpdmF0ZQogIGNhY2hlcykuCgpEYW5pZWwgKDQgSnVseSAyMDA2KQotIFRvc2hpeXVraSBNYWV6YXdhIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSB5b3UgY291bGRuJ3Qgb3ZlcnJpZGUgdGhlCiAgUHJveHktQ29ubmVjdGlvbjogaGVhZGVyIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgbm90IGRvaW5nIENPTk5FQ1QuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgY3VybF9mb3JtZ2V0KCksIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBleHRyYWN0CiAgKHNlcmlhbGlzZSkgYSBwcmV2aW91c2x5IGJ1aWx0IGZvcm1wb3N0IChhcyB3aXRoIGN1cmxfZm9ybWFkZCgpKS4KCkRhbmllbCAoMjMgSnVuZSAyMDA2KQotIEFydmUgS251ZHNlbiBmb3VuZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9mZHNldCgpIGZvciBzeXN0ZW1zIHdoZXJlCiAgY3VybF9zb2NrZXRfdCBpcyB1bnNpZ25lZCAobGlrZSBXaW5kb3dzKSB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIHdyb25nbHkKICByZXR1cm4gYSBtYXggZmQgb2YgLTEuCgpEYW5pZWwgKDIwIEp1bmUgMjAwNikKLSBQZXRlciBTaWx2YSBpbnRyb2R1Y2VkIENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kCiAgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSB0aGF0IGxpbWl0IHRoYSBtYXhpbXVtIHJhdGUgbGliY3VybCBpcyBhbGxvd2VkCiAgdG8gc2VuZCBvciByZWNlaXZlIGRhdGEuIFRoaXMga2luZCBvZiBhZGRzIHRoZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wncwogIG9wdGlvbiAtLWxpbWl0LXJhdGUgdG8gdGhlIGxpYnJhcnkuCgogIFRoZSByYXRlIGxpbWl0aW5nIGxvZ2ljIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgcmVtb3ZlZCBhbmQgaXMgaW5zdGVhZAogIHByb3ZpZGVkIGJ5IGxpYmN1cmwgaXRzZWxmLiBUcmFuc2ZlciByYXRlIGxpbWl0aW5nIHdpbGwgbm93IGFsc28gd29yayBmb3IgLWQKICBhbmQgLUYsIHdoaWNoIGl0IGRpZG4ndCBiZWZvcmUuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNikKLSBNYWRlIC1LIG9uIGEgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlYWQgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIGRpc3BsYXllZC4KCkRhbmllbCAoMTMgSnVuZSAyMDA2KQotIERhbiBGYW5kcmljaCBpbXBsZW1lbnRlZCAtLWVuYWJsZS1oaWRkZW4tc3ltYm9scyBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZQogIC1mdmlzaWJpbGl0eT1oaWRkZW4gb24gZ2NjID49IDQuMC4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbGliY3VybAogIGJpbmFyeSBhbmQgc3BlZWRzIHVwIGR5bmFtaWMgbGlua2luZyBieSBoaWRpbmcgYWxsIHRoZSBpbnRlcm5hbCBzeW1ib2xzIGZyb20KICB0aGUgc3ltYm9sIHRhYmxlLgoKVmVyc2lvbiA3LjE1LjQgKDEyIEp1bmUgMjAwNikKCkRhbmllbCAoOCBKdW5lIDIwMDYpCi0gQnJpYW4gRGVzc2VudCBmaXhlZCB0aGUgY29kZSBmb3IgY3lnd2luIGluIHRocmVlIGRpc3RpbmN0IHdheXM6CgogIFRoZSBmaXJzdCBtb2RpZmllcyB7bGliLHNyY30vc2V0dXAuaCB0byBub3QgaW5jbHVkZSB0aGUgd2luc29jayBoZWFkZXJzCiAgdW5kZXIgQ3lnd2luLiAgVGhpcyBmaXhlcyB0aGUgcmVwb3J0ZWQgYnVpbGQgcHJvYmxlbS4gIEN5Z3dpbiBhdHRlbXB0cyBhcwogIG11Y2ggYXMgcG9zc2libGUgdG8gZW11bGF0ZSBhIHBvc2l4IGVudmlyb25tZW50IHVuZGVyIFdpbmRvd3MuICBUaGlzIG1lYW5zCiAgdGhhdCBXSU4zMiBpcyAqbm90KiAjZGVmaW5lZCBhbmQgKHRvIHRoZSBleHRlbnQgcG9zc2libGUpIGV2ZXJ5dGhpbmcgaXMgZG9uZQogIGFzIGl0IHdvdWxkIGJlIG9uIGEgKml4IHR5cGUgc3lzdGVtLiAgVGh1cyA8c3lzL3NvY2tldC5oPiBpcyB0aGUgcHJvcGVyCiAgaW5jbHVkZSwgYW5kIGV2ZW4gdGhvdWdoIHdpbnNvY2syLmggaXMgcHJlc2VudCwgaW5jbHVkaW5nIGl0IGp1c3QgaW50cm9kdWNlcwogIGEgd2hvbGUgYnVuY2ggb2YgaW5jb21wYXRpYmxlIHNvY2tldCBBUEkgc3R1ZmYuCgogIFRoZSBzZWNvbmQgaXMgYSBwYXRjaCBJJ3ZlIGluY2x1ZGVkIGluIHRoZSBDeWd3aW4gYmluYXJ5IHBhY2thZ2VzIGZvciBhCiAgd2hpbGUuICBJdCBza2lwcyB0d28gdW5uZWNlc3NhcnkgbGlicmFyeSBjaGVja3MgKC1sd2lubW0gYW5kIC1sZ2RpMzIpLiAgVGhlCiAgY2hlY2tzIGFyZSBpbm5vY3VvdXMgYW5kIHRoZXkgZG8gc3VjY2VlZCwgYnV0IHRoZXkgcG9sbHV0ZSBMSUJTIHdpdGgKICB1bm5lY2Vzc2FyeSBzdHVmZiB3aGljaCBnZXRzIHJlY29yZGVkIGFzIHN1Y2ggaW4gdGhlIGxpYmN1cmwubGEgZmlsZSwgd2hpY2gKICBicmluZ3MgdGhlbSBpbnRvIHRoZSBidWlsZCBvZiBhbnkgbGliY3VybC1kb3duc3RyZWFtLiAgQXMgZmFyIGFzIEkga25vdwogIHRoZXNlIGxpYnMgYXJlIHJlYWxseSBvbmx5IG5lY2Vzc2FyeSBmb3IgbWluZ3csIHNvIGFsdGVybmF0aXZlbHkgdGhleSBjb3VsZAogIGJlIGRlc2lnbmVkIHRvIG9ubHkgcnVuIGlmICRob3N0IG1hdGNoZXMgKi0qLW1pbmd3KiBidXQgSSB0b29rIHRoZSBzYWZlcgogIHJvdXRlIG9mIHNraXBwaW5nIHRoZW0gZm9yICotKi1jeWd3aW4qLgoKICBUaGUgdGhpcmQgcGF0Y2ggcmVwbGFjZXMgYWxsIHVzZXMgb2YgdGhlIGFuY2llbnQgYW5kIG9ic29sZXRlIF9fQ1lHV0lOMzJfXwogIHdpdGggX19DWUdXSU5fXy4gUmVmOiA8aHR0cDovL2N5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDMtMDkvbXNnMDE1MjAuaHRtbD4uCgpEYW5pZWwgKDcgSnVuZSAyMDA2KQotIE1pa2FlbCBTZW5uZXJob2xtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBOVExNMiBzZXNzaW9uIHJlc3BvbnNlIHN1cHBvcnQKICB0byBsaWJjdXJsLiBUaGUgMjEgTlRMTSB0ZXN0IGNhc2VzIHdlcmUgYWdhaW4gbW9kaWZpZWQgdG8gY29tcGx5Li4uCgpEYW5pZWwgKDI3IE1heSAyMDA2KQotINNzY2FyIE1vcmFsZXMgVml28yB1cGRhdGVkIHRoZSBsaWJjdXJsLmZyYW1ld29yay5tYWtlIGZpbGUuCgpEYW5pZWwgKDI2IE1heSAyMDA2KQotIE9sYWYgU3T8YmVuIGZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIERpZ2VzdCBhdXRoZW50aWNhdGlvbiB3aXRoIG1kNS1zZXNzIHRvCiAgZmFpbC4gV2hlbiB1c2luZyB0aGUgbWQ1LXNlc3MsIHRoZSByZXN1bHQgd2FzIG5vdCBNZDUgZW5jb2RlZCBhbmQgQmFzZTY0CiAgdHJhbnNmb3JtZWQuCgpEYW5pZWwgKDI1IE1heSAyMDA2KQotIE1pY2hhZWwgV2FsbG5lciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzICJTRVNTIiB0byBiZSBzZXQgd2l0aAogIENVUkxPUFRfQ09PS0lFTElTVCwgd2hpY2ggdGhlbiBtYWtlcyBhbGwgc2Vzc2lvbiBjb29raWVzIGdldCBjbGVhcmVkLgoKRGFuaWVsICgyNCBNYXkgMjAwNikKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3QgMjcxIHJ1biBmaW5lIGFnYWluIHNpbmNlIHRoZSBURlRQIHBhdGggZml4LgoKRGFuaWVsICgyMyBNYXkgMjAwNikKLSBNYXJ0aW4gTWljaGxtYXlyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNjc5NTQsIGJ1dCB0aGUgc2FtZSBlcnJvciBhbHNvCiAgc2hvd2VkIHVwIGluIHRoZSBhdXRvYnVpbGRzLiBJdCBzZWVtcyBhIHJhdGhlciBsb25nLXNpbmNlIGludHJvZHVjZWQgc2hlbGwKICBzY3JpcHQgZmxhdyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzdWRkZW5seSB3YXMgZGV0ZWN0ZWQgYnkgdGhlIGJhc2gKICB2ZXJzaW9uIGluIERlYmlhbiBVbnN0YWJsZS4gSXQgaGFkIHByZXZpb3VzbHkgcGFzc2VkIHVuZGV0ZWN0ZWQgYnkgYWxsCiAgc2hlbGxzIHVzZWQgc28gZmFyLi4uCgotIERhdmlkIE1jQ3JlZWR5IHVwZGF0ZWQgbGliL2NvbmZpZy10cGYuaAoKRGFuaWVsICgxMSBNYXkgMjAwNikKLSBGaXhlZCB0aGUgY29uZmlndXJlJ3MgY2hlY2sgZm9yIG9sZC1zdHlsZSBTU0xlYXkgaGVhZGVycyBzaW5jZSBJIGZlbGwgb3ZlciBhCiAgY2FzZSB3aXRoIGEgZHVwbGljYXRlIGZpbGUgbmFtZSAoYSBrcmI0IGltcGxlbWVudGF0aW9uIHdpdGggYW4gZXJyLmgKICBmaWxlKS4gSSBjb252ZXJ0ZWQgdGhlIGNoZWNrIHRvIG1hbnVhbGx5IG1ha2Ugc3VyZSB0aHJlZSBvZiB0aGUgaGVhZGVycyBhcmUKICBwcmVzZW50IGJlZm9yZSBjb25zaWRlcmluZyB0aGVtIGZpbmUuCgotIERhdmlkIE1jQ3JlZWR5IHByb3ZpZGVkIGEgZml4IGZvciBDVVJMSU5GT19MQVNUU09DS0VUIHRoYXQgZG9lcyBleHRlbmRlZAogIGNoZWNrcyBvbiB0aGUgdG8tYmUtcmV0dXJuZWQgc29ja2V0IHRvIG1ha2Ugc3VyZSBpdCB0cnVseSBzZWVtcyB0byBiZSBhbGl2ZQogIGFuZCB3ZWxsLiBGb3IgU1NMIGNvbm5lY3Rpb24gaXQgKG9ubHkpIHVzZXMgT3BlblNTTCBmdW5jdGlvbnMuCgpEYW5pZWwgKDEwIE1heSAyMDA2KQotIEZpeGVkIERJQ1QgaW4gdHdvIGFzcGVjdHM6CgogIDEgLSBhbGxvdyBwcm9wZXJseSBVUkwtZXNjYXBlZCB3b3JkcywgbGlrZSB1c2luZyAlMjAgZm9yIHNwYWNlcwoKICAyIC0gcHJvcGVybHkgZXNjYXBlIGNlcnRhaW4gbGV0dGVycyB3aXRoaW4gYSB3b3JkIHRvIGNvbXBseSB0byB0aGUgUkZDMjIyOQoKRGFuaWVsICg5IE1heSAyMDA2KQotIEFuZHJlYXMgTnRhZmxvcyByZXBvcnRlZCBhIGJ1ZyBpbiBsaWJjdXJsLm00OiBXaGVuIGNvbmZpZ3VyaW5nIG15IEdOVQogIGF1dG90b29scyBwcm9qZWN0LCB3aGljaCBvcHRpb25hbGx5IChkZWZhdWx0PXllcykgdXNlcyBsaWJjdXJsIG9uIGEgc3lzdGVtCiAgd2l0aG91dCBhICh1c2FibGUpIGxpYmN1cmwgaW5zdGFsbGF0aW9uLCBidXQgbm90IHNwZWNpZnlpbmcKICBgLS13aXRob3V0LWxpYmN1cmwnLCBjb25maWd1cmUgZGV0ZXJtaW5lcyBjb3JyZWN0bHkgdGhhdCBubyBsaWJjdXJsIGlzCiAgYXZhaWxhYmxlLCBob3dldmVyLCB0aGUgTElCQ1VSTCB2YXJpYWJsZSBnZXRzIGV4cGFuZGVkIHRvIGBMSUJDVVJMID0gLWxjdXJsJwogIGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGVzLgoKICBEYXZpZCBTaGF3IGZpeGVkIHRoZSBmbGF3LgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgcmVjZW50bHkgYWRkZWQgbm9uLWJsb2NraW5nIFNTTAogIGNvbm5lY3RzLiBUaGUgc3RhdGUgbWFjaGluZSB3YXMgbm90IHJlc2V0IHByb3Blcmx5IHNvIHRoYXQgc3Vic2VxdWVudAogIGNvbm5lY3RzIHVzaW5nIHRoZSBzYW1lIGhhbmRsZSB3b3VsZCBmYWlsLCBhbmQgdGhlcmUgd2VyZSB0d28gbWVtb3J5IGxlYWtzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB5b3UgYWRkZWQgYW4gZWFzeSBoYW5kbGUgdG8gYQogIG11bHRpIHN0YWNrIGFuZCB0aGF0IGVhc3kgaGFuZGxlIGhhZCBhbHJlYWR5IGJlZW4gdXNlZCB0byBkbyBvbmUgb3IgbW9yZQogIGVhc3kgaW50ZXJmYWNlIHRyYW5zZmVycywgYXMgdGhlbiB0aGUgY29kZSB0aHJldyBhd2F5IHRoZSBwcmV2aW91c2x5IHVzZWQKICBETlMgY2FjaGUgd2l0aG91dCBwcm9wZXJseSBmcmVlaW5nIGl0LgoKRGFuaWVsICg4IE1heSAyMDA2KQotIERhbiBGYW5kcmljaCB3ZW50IG92ZXIgdGhlIFRGVFAgY29kZSBhbmQgaGUgcG9pbnRlZCBvdXQgYW5kIGZpeGVkIG51bWVyb3VzCiAgcHJvYmxlbXM6CgogICogVGhlIHJlY2VpdmVkIGZpbGUgaXMgY29ycnVwdGVkIHdoZW4gYSBwYWNrZXQgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAogICAgKHRoaXMgaXMgYSBzZXJpb3VzIHByb2JsZW0hKQoKICAqIFRyYW5zbWl0dGluZyBhIGZpbGUgYWJvcnRzIGlmIGEgYmxvY2sgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAoKICAqIERhdGEgaXMgc3RvcmVkIGluIHRoZSB3cm9uZyBsb2NhdGlvbiBpbiB0aGUgYnVmZmVyIGZvciB1cGxvYWRzLCBzbyB1cGxvYWRzCiAgICBhbHdheXMgZmFpbCAoSSBkb24ndCBzZWUgaG93IGl0IGNvdWxkIGhhdmUgZXZlciB3b3JrZWQsIGJ1dCBpdCBkaWQgb24geDg2CiAgICBhdCBsZWFzdCkKCiAgKiBBIG51bWJlciBvZiBjYWxscyBhcmUgbWFkZSB0byBzdHJlcnJvciBpbnN0ZWFkIG9mIEN1cmxfc3RyZXJyb3IsIG1ha2luZwogICAgdGhlIGNvZGUgbm90IHRocmVhZCBzYWZlCgogICogVGhlcmUgYXJlIHJlZmVyZW5jZXMgdG8gZXJybm8gaW5zdGVhZCBvZiBDdXJsX3NvY2tlcnJubygpLCBjYXVzaW5nCiAgICBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZXMgb24gV2luZG93cwoKICAqIFRoZSBmaWxlIG5hbWUgaW5jbHVkZXMgYSBsZWFkaW5nIC8gd2hpY2ggdmlvbGF0ZXMgUkZDMzYxNy4gRG9pbmcgc29tZXRoaW5nCiAgICBzaW1pbGFyIHRvIGZ0cCwgd2hlcmUgdHdvIHNsYXNoZXMgYWZ0ZXIgdGhlIGhvc3QgbmFtZSBtZWFucyBhbiBhYnNvbHV0ZQogICAgcmVmZXJlbmNlIHNlZW1zIGEgcmVhc29uYWJsZSBleHRlbnNpb24gdG8gZml4IHRoaXMuCgogICogRmFpbHVyZXMgaW4gRUJDRElDIGNvbnZlcnNpb24gYXJlIG5vdCBwcm9wYWdhdGVkIHVwIHRvIHRoZSBjYWxsZXIgYnV0IGFyZQogICAgc2lsZW50bHkgaWdub3JlZAoKLSBGaXhlZCBrbm93biBidWcgIzI4LiBUaGUgVEZUUCBjb2RlIG5vIGxvbmdlciBhc3N1bWVzIGEgcGFja2VkIHN0cnVjdCBhbmQKICB0aHVzIHdvcmtzIHJlbGlhYmx5IG9uIG1vcmUgcGxhdGZvcm1zLgoKRGFuaWVsICg1IE1heSAyMDA2KQotIFJvbGFuZCBCbG9tIGZpbGVkIGJ1ZyByZXBvcnQgIzE0ODEyMTcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ4MTIxNyksIHdpdGggZm9sbG93LXVwcyBieSBNaWNoZWxlCiAgQmluaSBhbmQgRGF2aWQgQnlyb24uIGxpYmN1cmwgcHJldmlvdXNseSB3cm9uZ2x5IHVzZWQgR2V0TGFzdEVycm9yKCkgb24KICB3aW5kb3dzIHRvIGdldCBlcnJvciBkZXRhaWxzIGFmdGVyIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9uIGNhbGxzLCB3aGVuIGl0CiAgcmVhbGx5IHNob3VsZCB1c2UgV1NBR2V0TGFzdEVycm9yKCkgaW5zdGVhZC4KCiAgV2hlbiBjaGFuZ2luZyB0byB0aGlzLCB0aGUgZm9ybWVyIGZ1bmN0aW9uIEN1cmxfb3VyZXJybm8oKSBpcyBub3cgaW5zdGVhZAogIGNhbGxlZCBDdXJsX3NvY2tlcnJubygpIGFzIGl0IGlzIG5lY2Vzc2FyeSB0byBvbmx5IHVzZSBpdCB0byBnZXQgZXJybm8gZnJvbQogIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9ucyBhcyBvdGhlcndpc2UgaXQgd29uJ3Qgd29yayBhcyBpbnRlbmRlZCBvbiBXaW5kb3dzLgoKRGFuaWVsICg0IE1heSAyMDA2KQotIE1hcmsgRWljaGluIHN1Ym1pdHRlZCBidWcgcmVwb3J0ICMxNDgwODIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODA4MjEpIEhlIGZvdW5kIGFuZCBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggaG93IGxpYmN1cmwgZGVhbHQgd2l0aCBHbnVUTFMgYW5kIGEgY2FzZSB3aGVyZSBnbnV0bHMgcmV0dXJuZWQKICBHTlVUTFNfRV9BR0FJTiBpbmRpY2F0aW5nIGl0IHdvdWxkIGJsb2NrLiBJdCB3b3VsZCB0aGVuIHJldHVybiBhbiB1bmV4cGVjdGVkCiAgcmV0dXJuIGNvZGUsIG1ha2luZyBDdXJsX3NzbF9zZW5kKCkgY29uZnVzZSB0aGUgdXBwZXIgbGF5ZXIgLSBjYXVzaW5nIHJhbmRvbQogIDI4IGJ5dGVzIHRyYXNoIGRhdGEgdG8gZ2V0IGluc2VydGVkIGluIHRoZSB0cmFuc2ZlcmVkIHN0cmVhbS4KCiAgVGhlIHByb3BlciBmaXggd2FzIHRvIG1ha2UgdGhlIEN1cmxfZ3Rsc19zZW5kKCkgZnVuY3Rpb24gcmV0dXJuIHRoZSBwcm9wZXIKICByZXR1cm4gY29kZXMgdGhhdCB0aGUgY2FsbGVycyB3b3VsZCBleHBlY3QuIFRoZSBDdXJsX29zc2xfc2VuZCgpIGZ1bmN0aW9uCiAgYWxyZWFkeSBkaWQgdGhpcy4KCkRhbmllbCAoMiBNYXkgMjAwNikKLSBBZGRlZCBhIC0tY2hlY2tmb3Igb3B0aW9uIHRvIGN1cmwtY29uZmlnIHRvIGFsbG93IHVzZXJzIHRvIGVhc2llcgogIHdyaXRlIGZvciBleGFtcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYQogIG5ldy1lbm91Z2ggbGliY3VybCB2ZXJzaW9uLiBJZiAtLWNoZWNrZm9yIGlzIGdpdmVuIGEgdmVyc2lvbiBzdHJpbmcKICBuZXdlciB0aGFuIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZCwgY3VybC1jb25maWcgd2lsbCByZXR1cm4gYQogIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgb3V0cHV0IGEgc3RyaW5nIGFib3V0IHRoZSB1bmZ1bGZpbGxlZAogIHJlcXVpcmVtZW50LgoKRGFuaWVsICgyNiBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGJyb3VnaHQgaW5pdGlhbCBsaW5lIGVuZCBjb252ZXJzaW9ucyB3aGVuIGRvaW5nIEZUUCBBU0NJSQogIHRyYW5zZmVycy4gVGhleSBhcmUgZG9uZSBvbiBub24td2luZG93cyBzeXN0ZW1zIGFuZCB0cmFuc2xhdGUgQ1JMRiB0byBMRi4KCiAgSSBtb2RpZmllZCB0aGUgMTUgTElTVC11c2luZyB0ZXN0IGNhc2VzIGFjY29yZGluZ2x5LiBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cKICB3ZSdsbCBoYXZlIGV2ZW4gbW9yZSB0cm91YmxlIHRvIGdldCB0aGUgdGVzdHMgdG8gcnVuIG9uIFdpbmRvd3Mgc2luY2UgdGhleQogIHNob3VsZCBnZXQgQ1JMRiBuZXdsaW5lcyBsZWZ0IGludGFjdCB3aGljaCB0aGUgKm5peCB2ZXJzaW9ucyBkb24ndC4gSSBmaWd1cmUKICB0aGUgb25seSBzYW5lIHRoaW5nIHRvIGRvIGlzIHRvIGFkZCBzb21lIGtpbmQgb2YgW25ld2xpbmVdIG1hY3JvIGZvciB0aGUgdGVzdAogIGNhc2UgZmlsZXMgYW5kIGhhdmUgdGhlbSBleHBhbmRlZCB0byB0aGUgcHJvcGVyIG5hdGl2ZSBsaW5lIGVuZGluZyB3aGVuIHRoZQogIHRlc3QgY2FzZXMgYXJlIHJ1bi4gVGhpcyBpcyBob3dldmVyIGxlZnQgdG8gaW1wbGVtZW50LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA2KQotIFBhdWwgUXVlcm5hIGZpeGVkIGxpYmN1cmwgdG8gYmV0dGVyIGRlYWwgd2l0aCBkZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcKICB3aGVuIHRoZSBzdHJlYW0gKHdyb25nbHkpIGxhY2tzIGEgcHJvcGVyIHpsaWIgaGVhZGVyLiBUaGlzIHNlZW1zIHRvIGJlIHRoZQogIGNhc2Ugb24gdG9vIG1hbnkgYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDYpCi0gQWxlIFZlc2VseSBmaXhlZCBDVVJMT1BUX0lOVEVSRkFDRSB3aGVuIHVzaW5nIGEgaG9zdG5hbWUuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDYpCi0gQmFzZWQgb24gcHJldmlvdXMgaW5mbyBmcm9tIFRvciBBcm50c2VuLCBJIG1hZGUgY29uZmlndXJlIGRldGVjdCB0aGUgSW50ZWwKICBJQ0MgY29tcGlsZXIgdG8gYWRkIGEgY29tcGlsZXIgb3B0aW9uIGZvciBpdCwgaW4gb3JkZXIgZm9yIGNvbmZpZ3VyZSB0bwogIHByb3Blcmx5IGJlIGFibGUgdG8gZGV0ZWN0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgbGVzcyBlYWdlciB0byBjbG9zZQogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2hlbiB1c2luZyBGVFAsIGZvciBleGFtcGxlIHdoZW4geW91IHJlbW92ZSBhbiBlYXN5CiAgaGFuZGxlIGZyb20gYSBtdWx0aSBzdGFjay4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEF0ZXMgR29yYWwgYW5kIEthdGllIFdhbmcgdGhhdCBjb3JyZWN0ZWQgbXkgYmFkIGZpeAogIGF0dGVtcHQgZnJvbSBBcHJpbCAxMC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNikKLSAjMTQ2ODMzMCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ2ODMzMCkgcG9pbnRlZCBvdXQgYSBiYWQKICB0eXBlY2FzdCBpbiB0aGUgY3VybCB0b29sIGxlYWRpbmcgdG8gYSBjcmFzaCB3aXRoICg2NGJpdD8pIFZTMjAwNSAoYXQgbGVhc3QpCiAgc2luY2UgdGhlIHN0cnVjdCB0aW1ldmFsIGZpZWxkIHR2X3NlYyBpcyBhbiBpbnQgd2hpbGUgdGltZV90IGlzIDY0Yml0LgoKRGFuaWVsICgxMCBBcHJpbCAyMDA2KQotIEF0ZXMgR29yYWwgZm91bmQgb3V0IHRoYXQgaWYgeW91IHNwZWNpZmllZCBib3RoIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgYW5kCiAgQ1VSTE9QVF9USU1FT1VULCB0aGUgX2xvbmdlcl8gdGltZSB3b3VsZCB3cm9uZ2x5IGJlIHVzZWQgZm9yIHRoZSBTU0wKICBjb25uZWN0aW9uIHRpbWUtb3V0IQoKLSBJIG1lcmdlZCBteSBoaXBlciBwYXRjaCAoaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2hpcGVyLykgaW50byB0aGUgbWFpbgogIHNvdXJjZXMuIFNlZSB0aGUgbGliL1JFQURNRS5tdWx0aV9zb2NrZXQgZm9yIGltcGxlbWVudGF0aW9uIHN0b3J5IHdpdGgKICBkZXRhaWxzLiBEb24ndCBleHBlY3QgaXQgdG8gd29yayBmdWxseSB5ZXQuIEkgZG9uJ3QgaW50ZW5kIHRvIGJsb3cgYW55CiAgd2hpc3RsZXMgb3IgcmluZyBhbnkgYmVsbHMgYWJvdXQgaXQgdW50aWwgSSdtIG1vcmUgY29udmluY2VkIGl0IHdvcmtzIGF0CiAgbGVhc3Qgc29tZXdoYXQgcmVsaWFibHkuCgpEYW5pZWwgKDcgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSdzIEVCQ0RJQyBhbmQgVFBGIGNoYW5nZXMuIFRocmVlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkKICBvcHRpb25zIChjYWxsYmFja3MpIHdlcmUgYWRkZWQ6CgogIENPTlZfRlJPTV9ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9UT19ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9GUk9NX1VURjhfRlVOQ1RJT04KCkRhbmllbCAoNSBBcHJpbCAyMDA2KQotIE1pY2hlbGUgQmluaSBtb2RpZmllZCB0aGUgTlRMTSBjb2RlIHRvIHdvcmsgZm9yIGhpcyAid2VpcmQgSUlTIGNhc2UiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNi0wMi8wMTU0Lmh0bWwpIGJ5IGFkZGluZyB0aGUgTlRMTSBoYXNoCiAgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIExNIG9uZSBhbmQgbWFraW5nIHNvbWUgb3RoZXIgYWRqdXN0bWVudHMgaW4gdGhlCiAgb3JkZXIgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgZGF0YSBibG9jayBhcmUgc2VudCBpbiB0aGUgVHlwZS0yIHJlcGx5LgogIEluc3BpcmF0aW9uIGZvciB0aGlzIHdvcmsgd2FzIHRha2VuIGZyb20gdGhlIEZpcmVmb3ggTlRMTSBpbXBsZW1lbnRhdGlvbi4KCiAgSSBlZGl0ZWQgdGhlIGV4aXN0aW5nIDIxKCEpIE5UTE0gdGVzdCBjYXNlcyB0byBydW4gZmluZSB3aXRoIHRoZXNlIG5ld3MuIER1ZQogIHRvIHRoZSBmYWN0IHRoYXQgd2Ugbm93IHByb3Blcmx5IGluY2x1ZGUgdGhlIGhvc3QgbmFtZSBpbiB0aGUgVHlwZS0yIG1lc3NhZ2UKICB0aGUgdGVzdCBjYXNlcyBub3cgb25seSBjb21wYXJlIHBhcnRzIG9mIHRoYXQgY2h1bmsuCgpEYW5pZWwgKDI4IE1hcmNoIDIwMDYpCi0gIzE0NTE5MjkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NTE5MjkpIGRldGFpbGVkIGEgYnVnIHRoYXQKICBvY2N1cnJlZCB3aGVuIGFza2luZyBsaWJjdXJsIHRvIGZvbGxvdyBIVFRQIHJlZGlyZWN0cyBhbmQgdGhlIG9yaWdpbmFsIFVSTAogIGhhZCBtb3JlIHRoYW4gb25lIHF1ZXN0aW9uIG1hcmsgKD8pLiBBZGRlZCB0ZXN0IGNhc2UgMjc2IHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwNikKLSBEYXZpZCBCeXJvbiBmb3VuZCBhIHByb2JsZW0gbXVsdGlwbGUgLWQgb3B0aW9ucyB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGgKICAtLWVuYWJsZS1kZWJ1ZywgYXMgdGhlbiBjdXJsIHVzZWQgZnJlZSgpIG9uIG1lbW9yeSBhbGxvY2F0ZWQgYm90aCB3aXRoCiAgbm9ybWFsIG1hbGxvYygpIGFuZCB3aXRoIGxpYmN1cmwtcHJvdmlkZWQgZnVuY3Rpb25zLCB3aGVuIHRoZSBsYXR0ZXIgTVVTVCBiZQogIGZyZWVkIHdpdGggY3VybF9mcmVlKCkgaW4gZGVidWcgYnVpbGRzLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA2KQotIFRvciBBcm50c2VuIGZpZ3VyZWQgb3V0IHRoYXQgVEZUUCB3YXMgYnJva2VuIG9uIGEgbG90IG9mIHN5c3RlbXMgc2luY2Ugd2UKICBjYWxsZWQgYmluZCgpIHdpdGggYSB0b28gYmlnIGFyZ3VtZW50IGluIHRoZSAzcmQgcGFyYW1ldGVyIGFuZCBhdCBsZWFzdAogIFRydTY0LCBBSVggYW5kIElSSVggc2VlbSB0byBiZSB2ZXJ5IHBpY2t5IGFib3V0IGl0LgoKRGFuaWVsICgyMSBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxJTkZPX0ZUUF9FTlRSWV9QQVRILgoKLSBYYXZpZXIgQm91Y2hvdXggbWFkZSB0aGUgU1NMIGNvbm5lY3Rpb24gbm9uLWJsb2NraW5nIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgKHdoZW4gdXNpbmcgT3BlblNTTCkuCgotIFRvciBBcm50c2VuIGZpeGVkIHRoZSBBSVggVG9vbGJveCBSUE0gc3BlYwoKRGFuaWVsICgyMCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGxpYmN1cmwgdG8gbm8gbG9uZ2VyIGlnbm9yZSBBVVRIIGZhaWx1cmVzIGFuZCBub3cgaXQKICByZWFjdHMgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBDVVJMT1BUX0ZUUF9TU0wgc2V0dGluZy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHR3byBURlRQIHByb2JsZW1zOiBGaXhlZCBhIGJ1ZyB3aGVyZWJ5IGEgcmVjZWl2ZWQgZmlsZQogIHdob3NlIGxlbmd0aCB3YXMgYSBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMgY291bGQgaGF2ZSByYW5kb20gZ2FyYmFnZQogIGFwcGVuZGVkLiBBbHNvLCBzdG9wIHByb2Nlc3NpbmcgVEZUUCBwYWNrZXRzIHdoaWNoIGFyZSB0b28gc2hvcnQgdG8gYmUKICBsZWdhbC4KCi0gSWxqYSB2YW4gU3BydW5kZWwgcmVwb3J0ZWQgYSBwb3NzaWJsZSBjcmFzaCBpbiB0aGUgY3VybCB0b29sIHdoZW4gdXNpbmcKICAiY3VybCBob3N0d2l0aG91dHNsYXNoIC1kIGRhdGEgLUciCgpWZXJzaW9uIDcuMTUuMyAoMjAgTWFyY2ggMjAwNikKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBWVUxORVJBQklMSVRZIHJlcG9ydGVkIHRvIHVzIGJ5IFVsZiBIYXJuaGFtbWFyLgoKICBsaWJjdXJsIHVzZXMgdGhlIGdpdmVuIGZpbGUgcGFydCBvZiBhIFRGVFAgVVJMIGluIGEgbWFubmVyIHRoYXQgYWxsb3dzIGEKICBtYWxpY2lvdXMgdXNlciB0byBvdmVyZmxvdyBhIGhlYXAtYmFzZWQgbWVtb3J5IGJ1ZmZlciBkdWUgdG8gdGhlIGxhY2sgb2YKICBib3VuZGFyeSBjaGVjay4KCiAgVGhpcyBvdmVyZmxvdyBoYXBwZW5zIGlmIHlvdSBwYXNzIGluIGEgVVJMIHdpdGggYSBURlRQIHByb3RvY29sIHByZWZpeAogICgidGZ0cDovLyIpLCB1c2luZyBhIHZhbGlkIGhvc3QgYW5kIGEgcGF0aCBwYXJ0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gNTEyCiAgYnl0ZXMuCgogIFRoZSBhZmZlY3RlZCBmbGF3IGNhbiBiZSB0cmlnZ2VyZWQgYnkgYSByZWRpcmVjdCwgaWYgY3VybC9saWJjdXJsIGlzIHRvbGQgdG8KICBmb2xsb3cgcmVkaXJlY3RzIGFuZCBhbiBIVFRQIHNlcnZlciBwb2ludHMgdGhlIGNsaWVudCB0byBhIHRmdHAgVVJMIHdpdGggdGhlCiAgY2hhcmFjdGVyaXN0aWNzIGRlc2NyaWJlZCBhYm92ZS4KCiAgVGhlIENvbW1vbiBWdWxuZXJhYmlsaXRpZXMgYW5kIEV4cG9zdXJlcyAoQ1ZFKSBwcm9qZWN0IGhhcyBhc3NpZ25lZCB0aGUgbmFtZQogIENWRS0yMDA2LTEwNjEgdG8gdGhpcyBpc3N1ZS4KCkRhbmllbCAoMTYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIFJQTSBzcGVjIGZpbGUgZm9yIEFJWCBUb29sYm94LCB0aGF0IG5vdyBpcyBpbmNsdWRlZAogIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQ6CgogIGEgYmFkIFNTTCBlcnJvciBtZXNzYWdlIHdoZW4gT3BlblNTTCBjZXJ0aWZpY2F0ZXMgYXJlIHZlcmlmaWVkIGZpbmUuCgogIGEgbWlzc2luZyByZXR1cm4gY29kZSBhc3NpZ25tZW50IGluIHRoZSBGVFAgY29kZQoKRGFuaWVsICg3IE1hcmNoIDIwMDYpCi0gTWFya3VzIEtvZXR0ZXIgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzM1NTcxNSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgbXVsdGktcGFydCBmb3JtcG9zdHMuIFRoZSBmaXggZnJvbSBGZWJydWFyeQogIDIybmQgY291bGQgbWFrZSB0aGUgQ3VybF9kb25lKCkgZnVuY3Rpb24gZ2V0IGNhbGxlZCB0d2ljZSBvbiB0aGUgc2FtZQogIGNvbm5lY3Rpb24gYW5kIGl0IHdhcyBub3QgZGVzaWduZWQgZm9yIHRoYXQgYW5kIHRodXMgdHJpZWQgdG8gY2FsbCBmcmVlKCkgb24KICBhbiBhbHJlYWR5IGZyZWVkIG1lbW9yeSBhcmVhIQoKLSBQZXRlciBIZXVjaGVydCBtYWRlIHN1cmUgdGhlIENVUkxGVFBTU0xfQ09OVFJPTCBzZXR0aW5nIGZvciBDVVJMT1BUX0ZUUF9TU0wKICBpcyB1c2VkIHByb3Blcmx5LgoKRGFuaWVsICg2IE1hcmNoIDIwMDYpCi0gTG90cyBvZiB1c2VycyBvbiBXaW5kb3dzIGhhdmUgcmVwb3J0ZWQgZ2V0dGluZyB0aGUgIlNTTDogY291bGRuJ3Qgc2V0CiAgY2FsbGJhY2siIGVycm9yIG1lc3NhZ2Ugc28gSSd2ZSBub3cgbWFkZSB0aGUgc2V0dGluZyBvZiB0aGF0IGNhbGxiYWNrIG5vdCBiZQogIGFzIGNyaXRpY2FsIGFzIGJlZm9yZS4gVGhlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgYWRkaXRpb25hbCBsb2dnZ2luZy8KICB0cmFjZSBhbnl3YXkgc28gYSBmYWlsdXJlIGp1c3QgbWVhbnMgc2xpZ2h0bHkgbGVzcyBkYXRhLiBJdCBzaG91bGQgc3RpbGwgYmUKICBhYmxlIHRvIHByb2NlZWQgYW5kIGNvbm5lY3QgZmluZSB0byB0aGUgc2VydmVyLgoKRGFuaWVsICg0IE1hcmNoIDIwMDYpCi0gVGhvbWFzIEtsYXVzbmVyIHByb3ZpZGVkIGEgcGF0Y2ggd3JpdHRlbiBieSBUb2RkIFZpZXJsaW5nIGluIGJ1ZyByZXBvcnQKICAjMTQ0MjQ3MSB0aGF0IGZpeGVzIGEgYnVpbGQgcHJvYmxlbSBvbiBJbnRlcml4LgoKRGFuaWVsICgyIE1hcmNoIDIwMDYpCi0gRlRQIHVwbG9hZCB3aXRob3V0IGEgZmlsZSBuYW1lIHBhcnQgaW4gdGhlIFVSTCBub3cgY2F1c2VzCiAgY3VybF9lYXN5X3BlcmZvcm0oKSB0byByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVC4gUHJldmlvdXNseSBpdCBhbGxvd2VkIHRoZQogIHVwbG9hZCBidXQgbmFtZWQgdGhlIGZpbGUgIihuaWwpIiAod2l0aG91dCB0aGUgcXVvdGVzKS4gVGVzdCBjYXNlIDUyNAogIHZlcmlmaWVzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBnZXRwcm90b2J5bmFtZSBpbiBjb25maWd1cmUgc28gdGhhdCBpdCdsbCBiZSB1c2VkLCB0aGFua3MKICB0byBHaXNsZSBWYW5lbSdzIGNoYW5nZSB0aGUgb3RoZXIgZGF5LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDA2KQotIERhbiBGYW5kcmljaCBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgc3R1Y2sgaW4gYW4gZW5kbGVzcyBsb29wIGluIGNhc2Ugd2UKICBhcmUgb3V0IG9mIGZpbGUgaGFuZGxlcyB2ZXJ5IGVhcmx5IGluIGN1cmwncyBjb2RlIHdoZXJlIGl0IG1ha2VzIHN1cmUgdGhhdAogIDAsIDEgYW5kIDIgYXJlbid0IGdvbm5hIGJlIHVzZWQgYnkgdGhlIGxpYiBmb3IgdHJhbnNmZXJzLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA2KQotIE1hcnR5IEt1aHJ0IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgd2VyZSB0d28gVk1TLXNwZWNpZmljIGZpbGVzIG1pc3NpbmcgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKVmVyc2lvbiA3LjE1LjIgKDI3IEZlYnJ1YXJ5IDIwMDYpCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDYpCi0gTG90cyBvZiB3b3JrIGFuZCBhbmFseXNpcyBieSAieGJ4X19fIiBpbiBidWcgIzE0MzE3NTAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQzMTc1MCkgaGVscGVkIG1lIGlkZW50aWZ5IGFuZCBmaXggdHdvCiAgZGlmZmVyZW50IGJ1dCByZWxhdGVkIGJ1Z3M6CgogIDEpIFJlbW92aW5nIGFuIGVhc3kgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIHRoZSB0cmFuc2ZlciBpcyBkb25lCiAgICAgY291bGQgbGVhdmUgYSBjb25uZWN0aW9uIGluIHRoZSBjb25uZWN0aW9uIGNhY2hlIGZvciB0aGF0IGhhbmRsZSB0aGF0IGlzCiAgICAgaW4gYSBzdGF0ZSB0aGF0IGlzbid0IHN1aXRhYmxlIGZvciByZS11c2UuIEEgc3Vic2VxdWVudCByZS11c2UgY291bGQgdGhlbgogICAgIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlciBhbmQgc2VnZmF1bHQuCgogIDIpIFdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbXVsdGkgaGFuZGxlLCB0aGVyZSBjb3VsZCBiZSBhbgogICAgIG91dHN0YW5kaW5nIGMtYXJlcyBETlMgbmFtZSByZXNvbHZlIHJlcXVlc3QuIFdoZW4gdGhlIHJlc3BvbnNlIGFycml2ZWQsCiAgICAgaXQgY2F1c2VkIGhhdm9jIHNpbmNlIHRoZSBjb25uZWN0aW9uIHN0cnVjdCBpdCAiYmVsb25nZWQiIHRvIGNvdWxkJ3ZlCiAgICAgYmVlbiBmcmVlZCBhbHJlYWR5LgoKICBOb3cgQ3VybF9kb25lKCkgaXMgY2FsbGVkIHdoZW4gYW4gZWFzeSBoYW5kbGUgaXMgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlCiAgcHJlLW1hdHVyZWx5ICh0aGF0IGlzLCBiZWZvcmUgdGhlIHRyYW5zZmVyIHdhcyBjb21wbHRldGVkKS4gQ3VybF9kb25lKCkgYWxzbwogIG1ha2VzIHN1cmUgdG8gY2FuY2VsIGFsbCAoaWYgYW55KSBvdXRzdGFuZGluZyBjLWFyZXMgcmVxdWVzdHMuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDYpCi0gUGV0ZXIgU3UgYWRkZWQgc3VwcG9ydCBmb3IgU09DS1M0IHByb3hpZXMuIEVuYWJsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIHByb3h5CiAgdHlwZSB0byB0aGUgYWxyZWFkeSBwcm92aWRlZCB0eXBlIENVUkxQUk9YWV9TT0NLUzQuCgogIEkgYWRkZWQgYSAtLXNvY2tzNCBvcHRpb24gdGhhdCB3b3JrcyBsaWtlIHRoZSBjdXJyZW50IC0tc29ja3M1IG9wdGlvbiBidXQKICBpbnN0ZWFkIHVzZSB0aGUgc29ja3M0IHByb3RvY29sLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYW4gaXNzdWUgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIGFuZCBjb21wcmVzc2VkCiAgY29udGVudCB3aGVuIGxpYmN1cmwgZGlkbid0IGhvbm9yIHRoZSBpbnRlcm5hbCBpZ25vcmVib2R5IGZsYWcuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDYpCi0gVWxmIEjkcm5oYW1tYXIgZml4ZWQgYSBmb3JtYXQgc3RyaW5nIChwcmludGYgc3R5bGUpIHByb2JsZW0gaW4gdGhlIE5lZ290aWF0ZQogIGNvZGUuIEl0IHNob3VsZCBob3dldmVyIG5vdCBiZSB0aGUgY2F1c2Ugb2YgYW55IHRyb3VibGVzLiBIZSBhbHNvIGZpeGVkIGEKICBmZXcgc2ltaWxhciBwcm9ibGVtcyBpbiB0aGUgSFRUUCB0ZXN0IHNlcnZlciBjb2RlLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBETlMgY2FjaGUgd2hlbiB1c2luZyBzaG9ydCBsaWZlIHRpbWVzLAogIGFzIHByZXZpb3VzbHkgaXQgY291bGQgYmUgaG9sZGluZyBvbiB0byBvbGQgY2FjaGVkIGVudHJpZXMgbG9uZ2VyIHRoYW4KICByZXF1ZXN0ZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDYpCi0gS2FybCBNb2VyZGVyIGFkZGVkIHRoZSBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhbmQgQ1VSTElORk9fTEFTVFNPQ0tFVCBvcHRpb25zCiAgdGhhdCBhbiBhcHAgY2FuIHVzZSB0byBsZXQgbGliY3VybCBvbmx5IGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdCBhbmQgdGhlbgogIGV4dHJhY3QgdGhlIHNvY2tldCBmcm9tIGxpYmN1cmwuIGxpYmN1cmwgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRvIGFueQogIHRyYW5zZmVyIGF0IGFsbCBhZnRlciB0aGUgY29ubmVjdCBpcyBkb25lLgoKLSBLZW50IEJvb3J0eiBpbXByb3ZlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZvciBHbnVUTFMgdG8gcHJvcGVybHkgc2V0IExJQlMKICBpbnN0ZWFkIG9mIExERkxBR1MuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNikKLSBQaGlsaXBwZSBWYXVjaGVyIHByb3ZpZGVkIGEgYnJpbGxpYW50IHBpZWNlIG9mIHRlc3QgY29kZSB0aGF0IHNob3cgYSBwcm9ibGVtCiAgd2l0aCByZS11c2VkIEZUUCBjb25uZWN0aW9ucy4gSWYgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24KICB3YXMgc2V0IG5vdCB0byBmZXRjaCBhICJib2R5IiwgbGliY3VybCBjb3VsZCBnZXQgY29uZnVzZWQgYW5kIGNvbnNpZGVyIGl0IGFuCiAgYXR0ZW1wdCB0byB1c2UgYSBkZWFkIGNvbm5lY3Rpb24gYW5kIHdvdWxkIGdvIGFjdGluZyBtaWdodHkgc3RyYW5nZS4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA2KQotIE1ha2UgLS1saW1pdC1yYXRlIFtudW1dIG1lYW4gYnl0ZXMuIEl0IHVzZWQgdG8gYmUgdGhhdCBidXQgaXQgYnJva2UgaW4gbXkKICBjaGFuZ2UgZG9uZSBpbiBOb3ZlbWJlciAyMDA1LgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDYpCi0gQWRkZWQgQ1VSTE9QVF9MT0NBTFBPUlQgYW5kIENVUkxPUFRfTE9DQUxQT1JUUkFOR0UgdG8gbGliY3VybC4gU2V0IHdpdGggdGhlCiAgY3VybCB0b29sIHdpdGggLS1sb2NhbC1wb3J0LiBQbGFpbiBhbmQgc2ltcGx5IHNldCB0aGUgcmFuZ2Ugb2YgcG9ydHMgdG8gYmluZAogIHRoZSBsb2NhbCBlbmQgb2YgY29ubmVjdGlvbnMgdG8uIEltcGxlbWVudGVkIG9uIHRvIHBvcHVsYXIgZGVtYW5kLgoKLSBCYXNlZCBvbiBhbiBlcnJvciByZXBvcnQgYnkgUGhpbGlwcGUgVmF1Y2hlciwgd2Ugbm8gbG9uZ2VyIGNvdW50IGEgcmV0cmllZAogIGNvbm5lY3Rpb24gc2V0dXAgYXMgYSBmb2xsb3ctcmVkaXJlY3QuIEl0IHR1cm5zIG91dCAxKSB0aGlzIGZhaWxzIHdoZW4gYSBGVFAKICBjb25uZWN0aW9uIGlzIHJlLXNldHVwIGFuZCAyKSBpdCBkb2VzIG1ha2UgdGhlIG1heC1yZWRpcnMgY291bnRlciBiZWhhdmUKICB3cm9uZy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDA2KQotIE1pY2hhbCBNYXJlayBwcm92aWRlZCBhIHBhdGNoIGZvciBGVFAgdGhhdCBtYWtlcyBsaWJjdXJsIGNvbnRpbnVlIHRvIHRyeQogIFBBU1YgZXZlbiBhZnRlciBFUFNWIHJldHVybmVkIGEgcG9zaXRpdmUgcmVzcG9uc2UgY29kZSwgaWYgbGliY3VybCBmYWlsZWQgdG8KICBjb25uZWN0IHRvIHRoZSBwb3J0IG51bWJlciB0aGUgRVBTViByZXNwb25zZSBzYWlkLiBPYnZpb3VzbHkgc29tZSBwZW9wbGUgYXJlCiAgZ29pbmcgdGhyb3VnaCBwcm90b2NvbC1zZW5zaXRpdmUgZmlyZXdhbGxzIChvciBzaW1pbGFyKSB0aGF0IGRvbid0CiAgdW5kZXJzdGFuZCBFUFNWIGFuZCB0aGVuIHRoZXkgZG9uJ3QgYWxsb3cgdGhlIHNlY29uZCBjb25uZWN0aW9uIHVubGVzcyBQQVNWCiAgd2FzIHVzZWQuIFRoaXMgYWxzbyBjYWxsZWQgZm9yIGEgbWlub3IgZml4IG9mIHRlc3QgY2FzZSAyMzguCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNikKLSBEdWFuZSBDYXRoZXkgd2FzIG9uZSBvZiBvdXIgZnJpZW5kcyB3aG8gcmVwb3J0ZWQgdGhhdCBjdXJsIC1QIFtJUF0KICAoQ1VSTE9QVF9GVFBQT1JUKSBkaWRuJ3Qgd29yayBmb3IgaXB2Ni1lbmFiZWQgY3VybHMgaWYgdGhlIElQIHdhc24ndCBhCiAgIm5hdGl2ZSIgSVAgd2hpbGUgaXQgd29ya3MgZmluZSBmb3IgaXB2Ni1kaXNhYmxlZCBidWlsZHMhCgogIEluIHRoZSBwcm9jZXNzIG9mIGZpeGluZyB0aGlzLCBJIHJlbW92ZWQgdGhlIHN1cHBvcnQgZm9yIExQUlQgc2luY2UgSSBjYW4ndAogIHRoaW5rIG9mIG1hbnkgcmVhc29ucyB0byBrZWVwIGRvaW5nIGl0IGFuZCBhc2tpbmcgb24gdGhlIG1haWxpbmcgbGlzdCBkaWRuJ3QKICByZXZlYWwgYW55b25lIGVsc2UgdGhhdCBjb3VsZCBlaXRoZXIuIFRoZSBjb2RlIHRoYXQgc2VuZHMgRVBSVCBhbmQgUE9SVCBpcwogIG5vdyBhbHNvIGEgbG90IHNpbXBsZXIgdGhhbiBiZWZvcmUgKElNSE8pLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDYpCi0gSm9uIFR1cm5lciBwb2ludGVkIG91dCB0aGF0IGRvaW5nIC1QIFtob3N0bmFtZV0gKENVUkxPUFRfRlRQUE9SVCkgd2l0aCBjdXJsCiAgKGJ1aWx0IGlwdjQtb25seSkgZGlkbid0IHdvcmsuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwNikKLSBBcyByZXBvcnRlZCBpbiBidWcgIzE0MDg3NDIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MDg3NDIpLAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBsYWluZWQgYWJvdXQgYSBtaXNzaW5nICJtaXNzaW5nIiBzY3JpcHQgaWYgeW91IHJhbgogIGNvbmZpZ3VyZSB3aXRoaW4gYSBwYXRoIHdob3NlIG5hbWUgaW5jbHVkZWQgb25lIG9yIG1vcmUgc3BhY2VzLiBUaGlzIGlzIGR1ZQogIHRvIGEgZmxhdyBpbiBhdXRvbWFrZSAoMS45LjYgYW5kIGVhcmxpZXIpLiBJJ3ZlIG5vdyB3b3JrZWQgYXJvdW5kIGl0IGJ5CiAgaW5jbHVkaW5nIGFuICJvdmVybG9hZGVkIiB2ZXJzaW9uIG9mIHRoZSBBTV9NSVNTSU5HX0hBU19SVU4gc2NyaXB0IHRoYXQnbGwKICBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZSBhdXRvbWFrZSBzaGlwcyB3aXRoLiBUaGlzIGtsdWRnZSBuZWVkcyB0byBiZQogIHJlbW92ZWQgb25jZSB3ZSBnZXQgYW4gYXV0b21ha2UgdmVyc2lvbiB3aXRoIHRoaXMgcHJvYmxlbSBjb3JyZWN0ZWQuCiAgUG9zc2libHkgd2UnbGwgdGhlbiBuZWVkIHRvIGNvbnZlcnQgdGhpcyBpbnRvIGEga2x1ZGdlIGRlcGVuZGluZyBvbiB3aGF0CiAgYXV0b21ha2UgdmVyc2lvbiB0aGF0IGlzIHVzZWQgYW5kIHRoYXQgaXMgZ29ubmEgYmUgcGFpbmZ1bCBhbmQgSSBkb24ndCBldmVuCiAgd2FudCB0byB0aGluayBhYm91dCB0aGF0IG5vdy4uLiEKCkRhbmllbCAoMTcgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXc6IEhlcmUgaXMgdGhlIGxhdGVzdCBsaWJjdXJsLm00IGF1dG9jb25mIHRlc3RzLiBJdCBpcyB1cGRhdGVkIHdpdGgKICB0aGUgbGF0ZXN0IGZlYXR1cmVzIGFuZCBwcm90b2NvbHMgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIGFuZCBoYXMgYSBtaW5vciBmaXgKICB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBvYnNjdXJlIGNhc2Ugd2hlcmUgc29tZW9uZSBoYXMgbW9yZSB0aGFuIG9uZSBsaWJjdXJsCiAgaW5zdGFsbGVkIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3IGZpbmFsbHkgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIEdvcGhlciBhbmQgd2UgYXJlIG5vdyBvZmZpY2lhbGx5CiAgbm90IHN1cHBvcnRpbmcgaXQuIEl0IGhhc24ndCBiZWVuIGZ1bmN0aW9uaW5nIGZvciB5ZWFycyBhbnl3YXksIHNvIHRoaXMgaXMKICBqdXN0IGZpbmFsbHkgc3RhdGluZyB3aGF0IGFscmVhZHkgd2FzIHRydWUuIEFuZCBhIGNsZWFudXAgYXQgdGhlIHNhbWUgdGltZS4KCi0gQnJ5YW4gSGVuZGVyc29uIHR1cm5lZCB0aGUgJ2luaXRpYWxpemVkJyB2YXJpYWJsZSBmb3IgY3VybF9nbG9iYWxfaW5pdCgpCiAgaW50byBhIGNvdW50ZXIsIGFuZCB0aHVzIHlvdSBjYW4gbm93IGRvIG11bHRpcGxlIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgeW91CiAgYXJlIHRoZW4gc3VwcG9zZWQgdG8gZG8gdGhlIHNhbWUgYW1vdW50IG9mIGNhbGxzIHRvIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KICBCcnlhbiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBkb2NzIGFjY29yZGluZ2x5LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmV3IEJlbmhhbSBmaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgY291bGQgY2F1c2UgdGhlCiAgdGVzdCBzY3JpcHQgdG8ga2lsbCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgZ3JvdXAhCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG46CgogIEZpeGVkIEZUUF9TS0lQX1BBU1ZfSVAgYW5kIEZUUF9VU0VfRVBTViB0byAiZG8gcmlnaHQiIHdoZW4gdXNlZCBvbiBGVFAgdGhydQogIEhUVFAgcHJveHkuCgogIEZpeGVkIFBST1hZVFVOTkVMIHRvIHdvcmsgZmluZSB3aGVuIHlvdSBkbyBmdHAgdGhyb3VnaCBhIHByb3h5LiAgSXQgd291bGQKICBwcmV2aW91c2x5IG92ZXJ3cml0ZSBpbnRlcm5hbCBtZW1vcnkgYW5kIGNhdXNlIHVucHJlZGljdGVkIGJlaGF2aW91ciEKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA2KQotIEkgZGVjaWRlZCB0byBkb2N1bWVudCB0aGUgInNlY3JldCBvcHRpb24iIGhlcmUgbm93LCBhcyBJJ3ZlIHJlY2VpdmVkICpOTyoKICBmZWVkYmFjayBhdCBhbGwgb24gbXkgbWFpbGluZyBsaXN0IHJlcXVlc3RzIGZyb20gTm92ZW1iZXIgMjAwNToKCiAgSSdtIGxvb2tpbmcgZm9yIGZlZWRiYWNrIGFuZCBjb21tZW50cy4gSSBhZGRlZCBzb21lIGV4cGVyaW1lbnRhbCBjb2RlIHRoZQogIG90aGVyIGRheSwgdGhhdCBhbGxvd3MgYSBsaWJjdXJsIHVzZXIgdG8gc2VsZWN0IHdoYXQgbWV0aG9kIGxpYmN1cmwgc2hvdWxkCiAgdXNlIHRvIHJlYWNoIGEgZmlsZSBvbiBhIEZUUChTKSBzZXJ2ZXIuCgogIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gQ1ZTIGNvZGUgYW5kIGluIHJlY2VudCBkYWlseSBzbmFwc2hvdHMuCgogIExldCBtZSBleHBsYWluLi4uCgogIFRoZSBjdXJyZW50IG5hbWUgZm9yIHRoZSBvcHRpb24gaXMgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCAoLS1mdHAtbWV0aG9kIGZvcgogIHRoZSBjb21tYW5kIGxpbmUgdG9vbCkgYW5kIHlvdSBzZXQgaXQgdG8gYSBsb25nICh0aGVyZSBhcmUgY3VycmVubHkgbm8KICBkZWZpbmVzIGZvciB0aGUgYXJndW1lbnQgdmFsdWVzLCBqdXN0IHBsYWluIG51bWVyaWNhbHMpLiBZb3UgY2FuIHNldCB0aHJlZQogIGRpZmZlcmVudCAibWV0aG9kcyIgdGhhdCBkbyB0aGlzOgoKICAxIG11bHRpY3dkIC0gbGlrZSB0b2RheSwgY3VybCB3aWxsIGRvIGEgc2luZ2xlIENXRCBvcGVyYXRpb24gZm9yIGVhY2ggcGF0aAogICAgICAgICAgIHBhcnQgaW4gdGhlIGdpdmVuIFVSTC4gRm9yIGRlZXAgaGllcmFyY2hpZXMgdGhpcyBtZWFucyB2ZXJ5IG1hbnkKICAgICAgICAgICBjb21tYW5kcy4gVGhpcyBpcyBob3cgUkZDMTczOCBzYXlzIGl0IHNob3VsZCBiZSBkb25lLiBUaGlzIGlzIHRoZQogICAgICAgICAgIGRlZmF1bHQuCgogIDIgbm9jd2QgLSBubyBDV0QgYXQgYWxsIGlzIGRvbmUsIGN1cmwgd2lsbCBkbyBTSVpFLCBSRVRSLCBTVE9SIGV0YyBhbmQgZ2l2ZQogICAgICAgICAgIGEgZnVsbCBwYXRoIHRvIHRoZSBzZXJ2ZXIuCgogIDMgc2luZ2xlY3dkIC0gbWFrZSBvbmUgQ1dEIHdpdGggdGhlIGZ1bGwgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgdGhlbiBvcGVyYXRlCiAgICAgICAgICAgIG9uIHRoZSBmaWxlICJub3JtYWxseSIuCgogIChXaXRoIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB5b3UgZG8gLS1mdHAtbWV0aG9kIFtNRVRIT0RdLCB3aGVyZSBbTUVUSE9EXSBpcwogIG9uZSBvZiAibXVsdGljd2QiLCAibm9jd2QiIG9yICJzaW5nbGVjd2QiLikKCiAgV2hhdCBmZWVkYmFjayBJJ20gaW50ZXJlc3RlZCBpbjoKCiAgMSAtIERvIHRoZXkgd29yayBhdCBhbGw/IERvIHlvdSBmaW5kIHNlcnZlcnMgd2hlcmUgb25lIG9mIHRoZXNlIGRvbid0IHdvcms/CgogIDIgLSBXaGF0IHdvdWxkIHByb3BlciBuYW1lcyBmb3IgdGhlIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50cyBiZSwgaWYgd2UKICAgICAgY29uc2lkZXIgdGhpcyBmZWF0dXJlIGdvb2QgZW5vdWdoIHRvIGdldCBpbmNsdWRlZCBhbmQgZG9jdW1lbnRlZCBpbgogICAgICB1cGNvbWluZyByZWxlYXNlcz8KCiAgMyAtIFNob3VsZCB3ZSBtYWtlIGxpYmN1cmwgYWJsZSB0byAid2FsayB0aHJvdWdoIiB0aGVzZSBvcHRpb25zIGluIGNhc2Ugb2YKICAgICAgKHBhdGggcmVsYXRlZCkgZmFpbHVyZXMsIG9yIHNob3VsZCBpdCBmYWlsIGFuZCBsZXQgdGhlIHVzZXIgcmVkbyBhbnkKICAgICAgcG9zc2libGUgcmV0cmllcz8KCiAgKFRoaXMgb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGluIGFueSBtYW4gcGFnZSBqdXN0IHlldCBzaW5jZSBJJ20gbm90IHN1cmUKICB0aGVzZSBuYW1lcyB3aWxsIGJlIHVzZWQgb3IgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgd2lsbCBlbmQgdXAgZXhhY3RseSBsaWtlCiAgdGhpcy4gIEFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSBoYXZlIG5vIHRlc3QgY2FzZXMgZm9yIHRoZXNlIHlldC4pCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNikKLSBXaGVuIHVzaW5nIGEgYmFkIHBhdGggb3ZlciBGVFAsIGFzIGluIHdoZW4gbGliY3VybCBjb3VsZG4ndCBDV0QgaW50byBhbGwKICBnaXZlbiBzdWJkaXJzLCBsaWJjdXJsIHdvdWxkIHN0aWxsICJyZW1lbWJlciIgdGhlIGZ1bGwgcGF0aCBhcyBpZiBpdCBpcyB0aGUKICBjdXJyZW50IGRpcmVjdG9yeSBsaWJjdXJsIGlzIGluIHNvIHRoYXQgdGhlIG5leHQgY3VybF9lYXN5X3BlcmZvcm0oKSB3b3VsZAogIGdldCByZWFsbHkgY29uZnVzZWQgaWYgaXQgdHJpZWQgdGhlIHNhbWUgcGF0aCBhZ2FpbiAtIGFzIGl0IHdvdWxkIG5vdCBpc3N1ZQogIGFueSBDV0QgY29tbWFuZHMgYXQgYWxsLCBhc3N1bWluZyBpdCBpcyBhbHJlYWR5IGluIHRoZSAicHJvcGVyIiBkaXIuCgogIFN0YXJ0aW5nIG5vdywgYSBmYWlsZWQgQ1dEIGNvbW1hbmQgc2V0cyBhIGZsYWcgdGhhdCBwcmV2ZW50cyB0aGUgcGF0aCB0byBiZQogICJyZW1lbWJlcmVkIiBhZnRlciByZXR1cm5pbmcuCgpEYW5pZWwgKDcgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobiBmaXhlZCBzbyB0aGF0IHRoZSBzZWNvbmQgQ09OTkVDVCB3aGVuIGRvaW5nIEZUUCBvdmVyIGEgSFRUUAogIHByb3h5IGFjdHVhbGx5IHVzZWQgYSBuZXcgY29ubmVjdGlvbiBhbmQgbm90IHNlbnQgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZQogIGZpcnN0IHNvY2tldCEKCkRhbmllbCAoNiBKYW51YXJ5IDIwMDYpCi0gQWxleGFuZGVyIExhemljIG1hZGUgdGhlIGJ1aWxkY29uZiBydW4gdGhlIGJ1aWxkY29uZiBpbiB0aGUgYXJlcyBkaXIgaWYgdGhhdAogIGlzIHByZXNlbnQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbWltaWMgdGhhdCBzY3JpcHQgaW4gY3VybCdzIGJ1aWxkY29uZgogIHNjcmlwdC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBURlRQIHRlc3Qgc2VydmVyIGJ1aWxkIHdpdGggbWluZ3cuCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNSkKLSBKZWFuIEphY3F1ZXMgRHJvdWluIHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkIG9ubHkgaGF2ZSBhIHVzZXIgbmFtZSBvcgogIHBhc3N3b3JkIG9mIDEyNyBieXRlcyBvciBsZXNzIGVtYmVkZGVkIGluIGEgVVJMLCB3aGVyZSBhY3R1YWxseSB0aGUgY29kZQogIHVzZXMgYSAyNTUgYnl0ZSBidWZmZXIgZm9yIGl0ISBNb2RpZmllZCBub3cgdG8gdXNlIHRoZSBmdWxsIGJ1ZmZlciBzaXplLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDA1KQotIERvdiBNdXJpayBjb3JyZWN0ZWQgdGhlIEhUVFBfT05MWSBkZWZpbmUgdG8gZGlzYWJsZSB0aGUgVEZUUCBzdXBwb3J0IHByb3Blcmx5CgpWZXJzaW9uIDcuMTUuMSAoNyBEZWNlbWJlciAyMDA1KQoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDUpCi0gRnVsbCB0ZXh0IGhlcmU6IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwNTEyMDcuaHRtbCBQb2ludGVkIG91dCBieQogIFN0ZWZhbiBFc3Nlci4KCiAgVlVMTkVSQUJJTElUWQoKICBsaWJjdXJsJ3MgVVJMIHBhcnNlciBmdW5jdGlvbiBjYW4gb3ZlcmZsb3cgYSBtYWxsb2NlZCBidWZmZXIgaW4gdHdvIHdheXMsIGlmCiAgZ2l2ZW4gYSB0b28gbG9uZyBVUkwuCgogIFRoZXNlIG92ZXJmbG93cyBoYXBwZW4gaWYgeW91CgogIDEgLSBwYXNzIGluIGEgVVJMIHdpdGggbm8gcHJvdG9jb2wgKGxpa2UgImh0dHA6Ly8iKSBwcmVmaXgsIHVzaW5nIG5vIHNsYXNoCiAgICAgIGFuZCB0aGUgc3RyaW5nIGlzIDI1NiBieXRlcyBvciBsb25nZXIuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIDIgLSBwYXNzIGluIGEgVVJMIHdpdGggb25seSBhIHF1ZXN0aW9uIG1hcmsgYXMgc2VwYXJhdG9yIChubyBzbGFzaCkgYmV0d2VlbgogICAgICB0aGUgaG9zdCBhbmQgdGhlIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTC4gVGhpcyBsZWFkcyB0byBhIHNpbmdsZSB6ZXJvIGJ5dGUKICAgICAgb3ZlcmZsb3cgb2YgdGhlIG1hbGxvY2VkIGJ1ZmZlci4KCiAgQm90aCBvdmVyZmxvd3MgY2FuIGJlIG1hZGUgd2l0aCB0aGUgc2FtZSBpbnB1dCBzdHJpbmcsIGxlYWRpbmcgdG8gdHdvIHNpbmdsZQogIHplcm8gYnl0ZSBvdmVyd3JpdGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGJ1dCB0aGUgbG9uZyBVUkwgbXVzdAogIGJlIHBhc3NlZCBpbiAiZGlyZWN0bHkiIHRvIGxpYmN1cmwuIEl0IG1ha2VzIHRoaXMgYSAibG9jYWwiIHByb2JsZW0uIE9mCiAgY291cnNlLCBsb3RzIG9mIHByb2dyYW1zIG1heSBzdGlsbCBwYXNzIGluIHVzZXItcHJvdmlkZWQgVVJMcyB0byBsaWJjdXJsCiAgd2l0aG91dCBkb2luZyBtdWNoIHN5bnRheCBjaGVja2luZyBvZiB0aGVpciBvd24sIGFsbG93aW5nIGEgdXNlciB0byBleHBsb2l0CiAgdGhpcyB2dWxuZXJhYmlsaXR5LgoKICBUaGVyZSBpcyBubyBrbm93biBleHBsb2l0IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNSkKLSBKYW1pZSBOZXd0b24gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsJ3MgZmlsZTovLyBjb2RlIHdvdWxkIGNsb3NlKCkgYSB6ZXJvCiAgZmlsZSBkZXNjcmlwdG9yIGlmIGdpdmVuIGEgbm9uLWV4aXN0aW5nIGZpbGUuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDUpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGEgc2V0IG9mIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gREpHUFAKICBhZ2FpbiB1c2luZyBjb25maWd1cmUuCgotIFlhbmcgVHNlIHByb3ZpZGVkIGEgd2hvbGUgc2VyaWVzIG9mIHBhdGNoZXMgdG8gY2xlYXIgdXAgY29tcGlsZXIgd2FybmluZ3Mgb24KICBNU1ZDIDYuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDUpCi0gSSBleHRlbmRlZCBhIHBhdGNoIGZyb20gRGF2aWQgU2hhdyB0byBtYWtlIGxpYmN1cmwgX2Fsd2F5c18gcHJvdmlkZSBhbiBlcnJvcgogIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZXJyb3IgYnVmZmVyIHRvIGFkZHJlc3MgdGhlIGZsYXcgbWVudGlvbiBvbiAyMSBzZXAgMjAwNS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwNSkKLSBBcHBsaWVkIEFsYmVydCBDaGluJ3MgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgbGliY3VybC5wYyBwa2djb25maWcgZmlsZSBnZXQKICBpbnN0YWxsZWQgb24gJ21ha2UgaW5zdGFsbCcgdGltZS4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwNSkKLSBRdWFnbWlyZSByZXBvcnRlZCB0aGF0IGhlIG5lZWRlZCB0byByYWlzZSBhIE5UTE0gYnVmZmVyIGZvciBTU1BJIHRvIHdvcmsKICBwcm9wZXJseSBmb3IgYSBjYXNlLCBhbmQgc28gd2UgZGlkLiBXZSByYWlzZWQgaXQgZXZlbiBmb3Igbm9uLVNTUEkgYnVpbGRzCiAgYnV0IGl0IHNob3VsZCBub3QgZG8gYW55IGhhcm0uIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzNTY3MTUKCi0gSmFuIEt1bmRlcidzIGRlYmlhbiBidWcgcmVwb3J0CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMzODY4MCBpZGVudGlmaWVkIGEgd2VpcmQKICBlcnJvciBtZXNzYWdlIGZvciB3aGVuIHlvdSB0cnkgdG8gdXBsb2FkIGEgZmlsZSBhbmQgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkKICBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQgc2VydmVyLgoKLSBZYW5nIFRzZSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBsaWIvc3NsdXNlLmMgd2l0aCBPcGVuU1NMIDAuOS44IGFuZCBpbgogIGxpYi9tZW1kZWJ1Zy5oIHRoYXQgc2hvd2VkIHVwIGluIGhpcyBtc3ZjIGJ1aWxkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNSkKLSBEZWJpYW4gYnVnIHJlcG9ydCAzMzg2ODEgYnkgSmFuIEt1bmRlcjogbWFrZSBjdXJsIGJldHRlciBkZXRlY3QgYW5kIHJlcG9ydAogIGJhZCBsaW1pdC1yYXRlIHVuaXRzOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODEgTm93IGN1cmwgd2lsbCByZXR1cm4KICBlcnJvciBpZiBhIGJhZCB1bml0IGlzIHVzZWQuCgotIFRoYW5rcyB0byB0aGlzIG5pY2Ugc3VtbWFyeSBvZiBwb2xsKCkgaW1wbGVtZW50YXRpb25zOgogIGh0dHA6Ly93d3cuZ3JlZW5lbmQub3JnLnVrL3Jqay8yMDAxLzA2L3BvbGwuaHRtbCBhbmQgZnVydGhlciB0ZXN0cyBieSBFdWdlbmUKICBLb3RseWFyb3YsIHdlIG5vdyBrbm93IHRoYXQgY3lnd2luJ3MgcG9sbCByZXR1cm5zIG9ubHkgUE9MTEhVUCBvbiByZW1vdGUKICBjb25uZWN0aW4gY2xvc3VyZSBzbyB3ZSBjaGVjayBmb3IgdGhhdCBjYXNlICh0b28pIGFuZCByZS1lbmFibGUgcG9sbCBmb3IKICBjeWd3aW4gYnVpbGRzLgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDA1KQotIEV1Z2VuZSBLb3RseWFyb3YgZm91bmQgb3V0IHRoYXQgY3lnd2luJ3MgcG9sbCgpIGZ1bmN0aW9uIGlzbid0IGRvaW5nIHRoaW5ncwogIHJpZ2h0OiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTExLzAwNDUuaHRtbCBzbyB3ZSBub3cgZGlzYWJsZQogIHBvbGwoKSBhbmQgdXNlIHNlbGVjdCgpIG9uIGN5Z3dpbiB0b28gKHdlIGFscmVhZHkgZG8gdGhlIHNhbWUgY2hvaWNlIG9uIE1hYwogIE9TIFgpCgotIERpbWEgQmFyc2t5IHBhdGNoZWQgcHJvYmxlbSAjMTM0ODkzMDogdGhlIEdudVRMUyBjb2RlIGNvbXBsZXRlbHkgaWdub3JlZAogIGNsaWVudCBjZXJ0aWZpY2F0ZXMhIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzQ4OTMwKS4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNSkKLSBEYXZpZCBMYW5nIGZpeGVkIElQdjYgc3VwcG9ydCBmb3IgVEZUUCEKCi0gSW50cm9kdWNpbmcgcmFuZ2Ugc3RlcHBpbmcgdG8gdGhlIGN1cmwgZ2xvYmJpbmcgc3VwcG9ydC4gTm93IHlvdSBjYW4gc3BlY2lmeQogIHN0ZXAgY291bnRlciBieSBhZGRpbmcgOltudW1dIHdpdGhpbiB0aGUgYnJhY2tldHMgd2hlbiBzcGVjaWZ5aW5nIGEgcmFuZ2U6CgogICBbMS0xMDA6MTBdCiAgIFthLXo6Ml0KCiAgSWYgbm8gc3RlcCBjb3VudGVyIGlzIHNldCwgaXQgZGVmYXVsdHMgdG8gMSBhcyBiZWZvcmU6CgogICBbMS0xMDBdCiAgIFtkLWhdCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNSkKLSBSZW1vdmVkIHRoZSB1c2Ugb2YgQUlfQ0FOT05OQU1FIGluIHRoZSBJUHY2LWVuYWJsZWQgcmVzb2x2ZXIgZnVuY3Rpb25zIHNpbmNlCiAgd2UgcmVhbGx5IGhhdmUgbm8gdXNlIGZvciByZXZlcnNlIGxvb2t1cHMgb2YgdGhlIGFkZHJlc3MuCgogIEkgdHJ1bHkgaG9wZSB0aGVzZSBhcmUgdGhlIGxhc3QgcmV2ZXJzZSBsb29rdXBzIHdlIGhhZCBsaW5nZXJpbmcgaW4gdGhlCiAgY29kZSEKCi0gRG1pdHJ5IEJhcnRzZXZpY2ggZGlzY292ZXJlZCBzb21lIGlzc3VlcyBpbiBjb21wYXRpYmlsdHkgb2YgU1NQSS1lbmFibGVkCiAgdmVyc2lvbiBvZiBsaWJjdXJsIHdpdGggZGlmZmVyZW50IFdpbmRvd3MgdmVyc2lvbnMuIEN1cnJlbnQgdmVyc2lvbiBvZgogIGxpYmN1cmwgaW1wb3J0cyBTU1BJIGZ1bmN0aW9ucyBmcm9tIHNlY3VyMzIuZGxsLiBIb3dldmVyLCB1bmRlciBXaW5kb3dzIE5UCiAgNC4wIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBpbiBzZWN1cml0eS5kbGwsIHVuZGVyIFdpbmRvd3MgOXggLSBpbgogIHNlY3VyMzIuZGxsIGFuZCBXaW5kb3dzIDIwMDAgYW5kIFhQIGNvbnRhaW5zIGJvdGggdGhlc2UgRExMcyAoc2VjdXJpdHkuZGxsCiAganVzdCBmb3J3YXJkcyBjYWxscyB0byBzZWN1cjMyLmRsbCkuCgogIERtaXRyeSdzIHBhdGNoIGxvYWRzIHByb3BlciBsaWJyYXJ5IGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBXaW5kb3dzCiAgdmVyc2lvbi4gRnVuY3Rpb24gSW5pdFNlY3VyaXR5SW50ZXJmYWNlKCkgaXMgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMgdG8gYWxsCiAgb2YgU1NQSSBmdW5jdGlvbiBpbiBvbmUgc3RydWN0dXJlLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDUpCi0gVmlsbW9zIE5lYmVoYWogaW1wcm92ZWQgbGliY3VybCdzIExEQVAgYWJpbGl0aWVzOgoKICBUaGUgTERBUCBjb2RlIGluIGxpYmN1cmwgY2FuJ3QgaGFuZGxlIExEQVAgc2VydmVycyBvZiBMREFQdjMgbm9yIGJpbmFyeQogIGF0dHJpYnV0ZXMgaW4gTERBUCBvYmplY3RzLiBTbywgSSBtYWRlIGEgcXVpY2sgcGF0Y2ggdG8gYWRkcmVzcyB0aGVzZQogIHByb2JsZW1zLgoKICBUaGUgc29sdXRpb24gaXMgc2ltcGxlOiBpZiB3ZSBjb25uZWN0IHRvIGFuIExEQVAgc2VydmVyLCBmaXJzdCB0cnkgTERBUHYzCiAgKHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgcHJvdG9jb2wgYXMgb2Ygbm93KSBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gTERBUHYyLgogIEluIGNhc2Ugb2YgYmluYXJ5IGF0dHJpYnV0ZXMsIHdlIGZpcnN0IGNvbnZlcnQgdGhlbSB0byBiYXNlNjQsIGp1c3QgbGlrZSB0aGUKICBvcGVubGRhcCBjbGllbnQgZG9lcy4gSXQgdXNlcyBsZGFwX2dldF92YWx1ZXNfbGVuKCkgaW5zdGVhZCBvZgogIGxkYXBfZ2V0X3ZhbHVlcygpIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgYmluYXJ5IGF0dHJpYnV0ZXMgY29ycmVjdGx5LiBJCiAgZGVmaW5lZCB0aGUgbmVjZXNzYXJ5IExEQVAgbWFjcm9zIGluIGxpYi9sZGFwLmMgdG8gYmUgYWJsZSB0byBjb21waWxlCiAgbGliY3VybCB3aXRob3V0IHRoZSBwcmVzZW5jZSBvZiBsaWJsZGFwCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNSkKLSBOaXMgSm9yZ2Vuc2VuIGZpbGVkIGJ1ZyByZXBvcnQgIzEzMzg2NDgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzODY0OCkgd2hpY2ggcmVhbGx5IGlzIG1vcmUgb2YgYQogIGZlYXR1cmUgcmVxdWVzdCwgYnV0IGFueXdheS4gSXQgcG9pbnRlZCBvdXQgdGhhdCAtLW1heC1yZWRpcnMgZGlkIG5vdCBhbGxvdwogIGl0IHRvIGJlIHNldCB0byAwLCB3aGljaCB0aGVuIHdvdWxkIHJldHVybiBhbiBlcnJvciBjb2RlIG9uIHRoZSBmaXJzdAogIExvY2F0aW9uOiBmb3VuZC4gQmFzZWQgb24gTmlzJyBwYXRjaCwgbm93IGxpYmN1cmwgc3VwcG9ydHMgQ1VSTE9QVF9NQVhSRURJUlMKICBzZXQgdG8gMCwgb3IgLTEgZm9yIGluZmluaXR5LiBBZGRlZCB0ZXN0IGNhc2UgMjc0IHRvIHZlcmlmeS4KCi0gdG9tbWlua1thdF1wb3N0LnBsIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEzMzc3MjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzNzcyMykgdGhhdCBjdXJsIGNvdWxkIG5vdCB1cGxvYWQKICBiaW5hcnkgZGF0YSBmcm9tIHN0ZGluIG9uIFdpbmRvd3MgaWYgdGhlIGRhdGEgY29udGFpbmVkIGNvbnRyb2wtWiAoaGV4IDFhKQogIHNpbmNlIHRoYXQgaXMgdHJlYXRlZCBhcyBlbmQtb2YtZmlsZSB3aGVuIHJlYWQgaW4gdGV4dCBtb2RlLiBHaXNsZSBWYW5lbQogIHBvaW50ZWQgb3V0IHRoZSBmaXgsIGFuZCBJIG1hZGUgYm90aCAtVCBhbmQgLS1kYXRhLWJpbmFyeSB0YWtlIGFkdmFudGFnZSBvZgogIGl0LgoKLSBKYXogRnJlc2ggcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCAiLXIgW251bWJlcl0iIGFzIHdhcyB3cm9uZ2x5IGRlc2NyaWJlZAogIGluIHRoZSBtYW4gcGFnZSwgY3VybCB3b3VsZCBzZW5kIGFuIGludmFsaWQgSFRUUCBSYW5nZTogaGVhZGVyLiBUaGUgY29ycmVjdAogIHdheSB3b3VsZCBiZSB0byB1c2UgIi1yIFtudW1iZXJdLSIgb3IgZXZlbiAiLXIgLVtudW1iZXJdIi4gU3RhcnRpbmcgbm93LAogIGN1cmwgd2lsbCB3YXJuIGlmIHRoaXMgaXMgZGlzY292ZXJlZCwgYW5kIGF1dG9tYXRpY2FsbHkgYXBwZW5kIGEgZGFzaCB0byB0aGUKICByYW5nZSBiZWZvcmUgcGFzc2luZyBpdCB0byBsaWJjdXJsLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDUpCi0gQW1vbCBQYXR0ZWthciByZXBvcnRlZCBhIGJ1ZyB3aXRoIGdyZWF0IGRldGFpbCBhbmQgYSBmaW5lIGV4YW1wbGUgaW4gYnVnCiAgIzEzMjYzMDYgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjYzMDYpLiBXaGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3Qgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIGFuZCBvbmUgb2YKICB0aGUgYWRkcmVzc2VzIGZhaWxzIHRvIGNvbm5lY3QgKHRoZSBzZXJ2ZXIgbXVzdCBleGlzdCBhbmQgcmVzcG9uZCwganVzdCBub3QKICBhY2NlcHQgY29ubmVjdGlvbnMpIGxpYmN1cmwgbGVha3MgYSBzb2NrZXQgZGVzY3JpcHRvci4gVGhhbmtzIHRvIHRoZSBmaW5lCiAgcmVwb3J0LCBJIGNvdWxkIGZpbmQgYW5kIGZpeCB0aGlzLgoKRGFuaWVsICgyMiBPY3RvYmVyIDIwMDUpCi0gRGltYSBCYXJza3kgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggR251VExTLWVuYWJsZWQgbGliY3VybCBpbiBidWcgcmVwb3J0CiAgIzEzMzQzMzggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzQzMzgpLiBXaGVuIHJlYWRpbmcgYW4gU1NMCiAgc3RyZWFtIGZyb20gYSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgcmVxdWVzdHMgYSAicmVoYW5kc2hha2UiLCB0aGUgY3VycmVudAogIGNvZGUgc2ltcGx5IHJldHVybnMgdGhpcyBhcyBhbiBlcnJvci4gSSBoYXZlIG5vIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcywgYnV0CiAgSSd2ZSBhZGRlZCBhIGNydWRlIGF0dGVtcHQgb2YgZGVhbGluZyB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciAtCiAgaXQgbWFrZXMgYSBibG9ja2luZyBoYW5kc2hha2UgaWYgdGhpcyBoYXBwZW5zLiBEb25lIGxpa2UgdGhpcyBiZWNhdXNlIGZpeGluZwogIHRoaXMgdGhlICJwcm9wZXIiIHdheSAodGhhdCB3b3VsZCBoYW5kc2hha2UgYXN5bmNocm9ub3VzbHkpIHdpbGwgcmVxdWlyZQogIHF1aXRlIHNvbWUgd29yayBhbmQgSSByZWFsbHkgbmVlZCBhIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcyB0byBkbyBzdWNoIGEKICBjaGFuZ2UuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNSkKLSAiT2ZlciIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdoZW4gbGliY3VybCByZS11c2VkIGEgY29ubmVjdGlvbiBhbmQgZmFpbGVkIHRvIGRvCiAgaXQsIGl0IGNvdWxkIHRoZW4gYWNjaWRlbnRhbGx5IGFjdHVhbGx5IGNyYXNoLiBQcmVzdW1hYmx5LCB0aGlzIGNvbmNlcm5zIEZUUAogIGNvbm5lY3Rpb25zLiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzMDMxMAoKLSBUZW1wcmltdXMgaW1wcm92ZWQgdGhlIE1TVkMgbWFrZWZpbGUgc28gdGhhdCB0aGUgc3RhdGljIGRlYnVnIFNTTCBsaWJzIGFyZQogIGxpbmtlZCB0byB0aGUgZXhlY3V0YWJsZSBhbmQgbm90IHRvIHRoZSBsaWJjdXJsZC5saWIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2Njc2CgotIEJyYWRmb3JkIEJydWNlIG1hZGUgdGhlIHdpbmRvd3MgcmVzb2x2ZXIgY29kZSBwcm9wZXJseSByZXR1cm4KICBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFkgYW5kIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIG9uIHJlc29sdmluZwogIGVycm9ycyAoYXMgZG9jdW1lbnRlZCkuCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGxpYmN1cmwgdW5kZXJzdGFuZCBhbmQgaGFuZGxlIGNhc2VzIHdoZW4gdGhlIHNlcnZlcgogICh3cm9uZ2x5KSBzZW5kcyAqdHdvKiBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgZm9yIERpZ2VzdC4gV2hpbGUgdGhpcyBzaG91bGQKICBuZXZlciBoYXBwZW4gaW4gYSBzYW5lIHdvcmxkLCBsaWJjdXJsIHByZXZpb3VzbHkgZ290IGludG8gYW4gaW5maW5pdGUgbG9vcAogIHdoZW4gdGhpcyBvY2N1cnJlZC4gRGF2ZSBhZGRlZCB0ZXN0IDI3MyB0byB2ZXJpZnkgdGhpcy4KCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlOiAibWFrZXMgYSBidWlsZCBvcHRpb24gYXZhaWxhYmxlIHNvIGlmCiAgeW91IHNldCBydGxpYmNmZz1zdGF0aWMgZm9yIHRoZSBtYWtlLCB0aGVuIGl0IHdvdWxkIGJ1aWxkIHdpdGggL01ULiBUaGUKICBkZWZhdWx0IGJlaGF2aW91ciBpcyAvTUQgKHRoZSBvcmlnaW5hbCkuIgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjY2NjUKCkRhbmllbCAoMTQgT2N0b2JlciAyMDA1KQotIFJldmVydGVkIHRoZSBMSUJDVVJMX1ZFUlNJT05fTlVNIGNoYW5nZSBmcm9tIE9jdG9iZXIgNi4gQXMgRGF2ZSBEcmliaW4KICByZXBvcnRlZCwgdGhlIGRlZmluZSBpcyB1c2VkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBpcyBhc3N1bWVkIHRvIHVzZQogIHRoZSAweFlZWFhaWiBmb3JtYXQuIFRoaXMgbWFkZSAiY3VybC1jb25maWcgLS12ZXJudW0iIGZhaWwgaW4gdGhlIDcuMTUuMAogIHJlbGVhc2UgdmVyc2lvbi4KClZlcnNpb24gNy4xNS4wICgxMyBPY3RvYmVyIDIwMDUpCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwNSkKLSBNaWNoYWVsIFN1dHRvbiBvZiBpREVGRU5TRSByZXBvcnRlZCBhbmQgSSBmaXhlZCBhIHNlY3VyaXRmeSBmbGF3IGluIHRoZSBOVExNCiAgY29kZSB0aGF0IHdvdWxkIG92ZXJmbG93IGEgYnVmZmVyIGlmIGdpdmVuIGEgdG9vIGxvbmcgdXNlciBuYW1lIG9yIGRvbWFpbgogIG5hbWUuIFRoaXMgd291bGQgaGFwcGVuIGlmIHlvdSBlbmFibGUgTlRMTSBhdXRoZW50aWNhdGlvbiBhbmQgZWl0aGVyCgogIEEgLSBwYXNzIGluIGEgdXNlciBuYW1lIGFuZCBkb21haW4gbmFtZSB0byBsaWJjdXJsIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlcgogICAgICB0aGFuIDE5MiBieXRlcwoKICBCIC0gYWxsb3cgKGxpYiljdXJsIHRvIGZvbGxvdyBIVFRQICJyZWRpcmVjdHMiIChMb2NhdGlvbjogYW5kIHRoZQogICAgICBhcHByb3ByaWF0ZSBIVFRQIDMweCByZXNwb25zZSBjb2RlKSBhbmQgdGhlIG5ldyBVUkwgY29udGFpbnMgYSBVUkwgd2l0aAogICAgICBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdGhhdCB0b2dldGhlciBhcmUgbG9uZ2VyIHRoYW4gMTkyIGJ5dGVzCgogIFNlZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3Mvc2VjdXJpdHkuaHRtbCBmb3IgZnVydGhlciBkZXRhaWxzIGFuZCB1cGRhdGVzCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA1KQotIERhcnJ5bCBIb3VzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCB1c2luZyAteiB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEZUUC4KICBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlIGdpdmVuIHRpbWUgc3RhbXAgd2FzIGV4YWN0IHRoZSBzYW1lIGFzIHRoZSByZW1vdGUKICB0aW1lIHN0YW1wLCB0aGUgZmlsZSB3b3VsZCBzdGlsbCB3cm9uZ2x5IGJlIGRvd25sb2FkZWQuIEFkZGVkIHRlc3QgY2FzZSAyNzIKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA1KQotIERvbWVuaWNvIEFuZHJlb2xpIGZpeGVkIGEgbWFuIHBhZ2UgbWFsZm9ybWF0IGFuZCByZW1vdmVkIG9kZCAoMHhhMCkgYnl0ZXMKICBmcm9tIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBNaWNoYWVsIFdhbGxuZXIgcmVwb3J0ZWQgdGhhdCB0aGUgZGF0ZSBwYXJzZXIgaGFkIHdyb25nIG9mZnNldCBzdG9yZWQgZm9yCiAgdGhlIE1FU1QgYW5kIENFU1QgdGltZSB6b25lcy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDUpCi0gRGF2aWQgWWFuIGZpbGVkIGJ1ZyAjMTI5OTE4MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI5OTE4MSkKICB0aGF0IGlkZW50aWZpZWQgYSBzaWxseSBwcm9ibGVtIHdpdGggQ29udGVudC1SYW5nZTogaGVhZGVycyB3aXRoIHRoZSAnYnl0ZXMnCiAga2V5d29yZCB3cml0dGVuIGluIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBhbGwgbG93ZXJjYXNlISBJdCB3b3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQhCgotIFRKIFNhdW5kZXJzIG9mIHRoZSBwcm9mdHBkIHByb2plY3QgaWRlbnRpZmllZCBhbmQgcG9pbnRlZCBvdXQgcHJvYmxlbXMgd2l0aAogIHRoZSBtb2RpZmllZCBGVFBTIG5lZ290aWF0aW9uIGNoYW5nZSBvZiBBdWd1c3QgMTkgMjAwNS4gVGh1cywgd2UgcmV2ZXJ0IHRoZQogIGNoYW5nZSBiYWNrIHRvIHByZS03LjE0LjEgc3RhdHVzLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNSkKLSBGaXhlZCAiY3V0IG9mZiIgc2VudGVuY2UgaW4gdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2U6CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMwNQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2Ugd2hhdCB0aGUgZGVmYXVsdAogIENVUkxPUFRfV1JJVEVGVU5DVElPTiBhbmQgQ1VSTE9QVF9XUklURURBVEEgbWVhbjoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI5MzExCgotIENsYXJpZmllZCBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSB0aGF0IENVUkxPUFRfRVJST1JCVUZGRVIKICBzb21ldGltZXMgZG9lc24ndCBmaWxsIGluIHRoZSBidWZmZXIgZXZlbiB0aG91Z2ggaXQgaXMgc3VwcG9zZWQgdG86CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMwoKLSBXaGVuIENVUkxFX1VSTF9NQUxGT1JNQVQgaXMgcmV0dXJuZWQgZHVlIHRvIGEgbWlzc2luZyBVUkwsIGl0IG5vdyBoYXMgYW4KICBlcnJvciBzdHJpbmcgc2V0LgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNSkKLSBEbWl0cnkgQmFydHNldmljaCBtYWRlIHRoZSBTU1BJIHN1cHBvcnQgd29yayBvbiBXaW5kb3dzIDl4IGFzIHdlbGwuCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDA1KQotIEFkZGVkIGEgVEZUUCBzZXJ2ZXIgdG8gdGhlIHRlc3Qgc3VpdGUgYW5kIG1hZGUgdGhlIHRlc3Qgc3VpdGUgY2FwYWJsZSBvZgogIHVzaW5nIGl0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDA1KQotIEJlbiBNYWRzZW4ncyBkZXRhaWxlZCByZXBvcnRzIHRoYXQgZnVubmlseSBlbm91Z2ggb25seSBvY2N1cnJlZCB3aXRoIGNlcnRhaW4KICBnbGliYyB2ZXJzaW9ucyB0dXJuZWQgb3V0IHRvIGJlIGN1cmwgdXNpbmcgYW4gYWxyZWFkeSBjbG9zZWQgZmlsZSBoYW5kbGUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIChsaWtlIHdoZW4gc2F2aW5nIEZUUCBzZXJ2ZXIgImhlYWRlcnMiKS4KCi0gU2NvdHQgRGF2aXMgaGVscGVkIG1lIHRyYWNrIGRvd24gYSBwcm9ibGVtIGluIHRoZSB0ZXN0IEhUVFAgc2VydmVyIHRoYXQgbWFkZQogIHRlc3QgY2FzZSA1NiB3cm9uZ2x5IGZhaWwgYXQgdGltZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzIGR1ZSB0byB0aGUgc2VydmVyCiAgZmluZGluZyB0aGUgZW5kIG9mIGEgY2h1bmtlZC1lbmNvZGVkIFBPU1QgdG9vIGVhcmx5LgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA1KQotIE5vdyBjdXJsIHdhcm5zIGlmIGFuIHVua25vd24gdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgLXcvLS13cml0ZW91dCBhcmd1bWVudC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNSkKLSBJIGFwcGxpZWQgTmljb2xhcyBGcmFu529pcycgbWFuIHBhZ2UgcGF0Y2ggaGUgcG9zdGVkIHRvIHRoZSBEZWJpYW4gYnVnCiAgdHJhY2tlci4gSXQgY29ycmVjdGVkIHR3byBsaW5lcyB0aGF0IHN0YXJ0ZWQgd2l0aCBhcG9zdHJvcGhlcywgd2hpY2ggaXNuJ3QKICBsZWdhbCBucm9mZiBmb3JtYXQuIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjY1MTEKCi0gQWRkZWQgLS1mdHAtc2tpcC1wYXN2LWlwIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbCwgdGhhdCBzZXRzIHRoZSBuZXcKICBDVVJMT1BUX0ZUUF9TS0lQX1BBU1ZfSVAgb3B0aW9uLiBJdCBtYWtlcyBsaWJjdXJsIHJlLXVzZSB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24ncyBJUCBhZGRyZXNzIHdoZW4gc2V0dGluZyB1cCB0aGUgZGF0YSBjb25uZWN0aW9uIGluc3RlYWQgb2YKICBleHRyYWN0dGluZyB0aGUgSVAgYWRkcmVzcyBmcm9tIHRoZSBQQVNWIHJlc3BvbnNlLiBJdCBoYXMgdHVybmVkIG91dCB0aGlzCiAgZmVhdHVyZSBpcyBmcmVxdWVudGx5IG5lZWRlZCBieSBwZW9wbGUgdG8gY2lyY3VtdmVudCBzaWxseSBzZXJ2ZXJzIGFuZCBzaWxseQogIGZpcmV3YWxscywgZXNwZWNpYWxseSB3aGVuIEZUUFMgaXMgdXNlZCBhbmQgdGhlIFBBU1YgY29tbWFuZC1yZXNwb25zZSBpcwogIHNlbnQgZW5jcnR5cGVkLgoKICBTcG9uc29yZWQgYnkgQ1UqQW5zd2VycwoKRGFuaWVsICgxIFNlcHRlbWJlciAyMDA1KQotIEpvaG4gS2VsbHkgYWRkZWQgVEZUUCBzdXBwb3J0IHRvIGxpYmN1cmwuIEEgYnVuY2ggb2YgbmV3IGVycm9yIGNvZGVzIHdhcwogIGFkZGVkLiBUT0RPOiBhZGQgdGhlbSB0byBkb2NzLiBhZGQgVEZUUCBzZXJ2ZXIgdG8gdGVzdCBzdWl0ZS4gYWRkIFRGVFAgdG8KICBsaXN0IG9mIHByb3RvY29scyB3aGVyZWV2ZXIgdGhvc2UgYXJlIG1lbnRpb25lZC4KClZlcnNpb24gNy4xNC4xICgxIFNlcHRlbWJlciAyMDA1KQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwNSkKLSBLZXZpbiBMdXNzaWVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGN1cmxsaWIuZHNwIGFuZCBob3cgdG8gZml4IGl0LgoKLSBJZ29yIFBvbHlha292IGZpeGVkIGEgcmF0aGVyIG5hc3R5IHByb2JsZW0gd2l0aCB0aGUgdGhyZWFkZWQgbmFtZSByZXNvbHZlcgogIGZvciBXaW5kb3dzLCB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gQWNjZXNzIFZpb2xhdGlvbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB3YXMgdXNlZCBkdWUgdG8gYW4gaXNzdWUgd2l0aCBob3cgdGhlIHJlc29sdmVyIHRocmVhZCB3YXMgYW5kIHdhcyBub3QKICB0ZXJtaW5hdGVkLgoKLSBTaW1vbiBKb3NlZnNzb24gYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGN1cmwgdG8gZ2V0IGJ1aWx0IHRvIHVzZSBHTlUgR1NTCiAgaW5zdGVhZCBvZiBNSVQvSGVpbWRhbCBmb3IgR1NTIGNhcGFiaWxpdGllcy4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDUpCi0gVG9ieSBQZXRlcnNvbiBhZGRlZCBDVVJMT1BUX0lHTk9SRV9DT05URU5UX0xFTkdUSCB0byB0aGUgbGlicmFyeSwgYWNjZXNzaWJsZQogIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0b29sIHdpdGggLS1pZ25vcmUtY29udGVudC1sZW5ndGguIFRoaXMgd2lsbCBtYWtlIGl0CiAgZWFzaWVyIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gQXBhY2hlIDEueCAoYW5kIHNpbWlsYXIpIHNlcnZlcnMgdGhhdCBhcmUKICBzdGlsbCBoYXZpbmcgcHJvYmxlbXMgc2VydmluZyBmaWxlcyBsYXJnZXIgdGhhbiAyIG9yIDQgR0IuIFdoZW4gdGhpcyBvcHRpb24KICBpcyBlbmFibGVkLCBjdXJsIHdpbGwgc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIHRvIHNpZ25hbCBlbmQgb2YgdHJhbnNmZXIuIEkgd3JvdGUgdGVzdCBjYXNlIDI2OSB0aGF0IHJ1bnMgYQogIHNpbXBsZSB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoaXMgd29ya3MuCgotIChUcnlpbmcgaGFyZCB0byBleGNsdWRlIGVtb3Rpb25zIG5vdy4pIHZhbGdyaW5kIHZlcnNpb24gMyBzdWRkZW5seSByZW5hbWVkCiAgdGhlIC0tbG9nZmlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIC0tbG9nLWZpbGUsIGFuZCB0aHVzIHRoZSB0ZXN0IHNjcmlwdAogIHZhbGdyaW5kIGF1dG9kZXRlY3Rpb24gbm93IGhhcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIGNoZWNrIHRvIGRvIGFuZCB0aGVuIGl0CiAgYWx0ZXJzIHRoZSB2YWxncmluZCBjb21tYW5kIGxpbmUgYWNjb3JkaW5nbHkuCgotIEZpeGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHVzaW5nIEdudVRMUyB3aXRoIHRoZSBkZWZhdWx0IGJ1bmRsZSwgd2hpY2gKICBwcmV2aW91c2x5IGZhaWxlZCBkdWUgdG8gR251VExTIG5vdCBhbGxvd2luZyB4NTA5IHYxIENBIGNlcnRzIGJ5IGRlZmF1bHQuCiAgUmFscGggTWl0Y2hlbGwgcmVwb3J0ZWQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA1KQotIE5vcmJlcnQgTm92b3RueSBoYWQgcHJvYmxlbXMgd2l0aCBGVFBTIGFuZCBoZSBoZWxwZWQgbWUgd29yayBvdXQgYSBwYXRjaAogIHRoYXQgbWFkZSBjdXJsIHJ1biBmaW5lIGluIGhpcyBlbmQuIFRoZSBrZXkgd2FzIHRvIG1ha2Ugc3VyZSB3ZSBkbyB0aGUKICBTU0wvVExTIG5lZ290aWF0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBUQ1AgY29ubmVjdCBpcyBkb25lIGFuZCBub3QgYWZ0ZXIKICBhIGZldyBvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4gc2VudCBsaWtlIHdlIGRpZCBwcmV2aW91c2x5LiBJIGRvbid0IGNvbnNpZGVyCiAgdGhpcyBjaGFuZ2UgbmVjZXNzYXJ5IHRvIG9iZXkgdGhlIHN0YW5kYXJkcywgSSB0aGluayB0aGlzIHNlcnZlciBpcyBwaWNraWVyCiAgdGhhbiB3aGF0IHRoZSBzcGVjcyBhbGxvdyBpdCB0byBiZSwgYnV0IEkgY2FuJ3Qgc2VlIGhvdyB0aGlzIG1vZGlmaWVkCiAgbGliY3VybCBjb2RlIGNhbiBhZGQgYW55IHByb2JsZW1zIHRvIHRob3NlIHdobyBhcmUgaW50ZXJwcmV0aW5nIHRoZQogIHN0YW5kYXJkcyBtb3JlIGxpYmVyYWxseS4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDUpCi0gSmVmZiBQb2hsbWV5ZXIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGFzayBsaWJjdXJsIHRvIGxvYWQgYSBjb29raWVmaWxlICh3aXRoCiAgQ1VSTE9QVF9DT09LSUVGSUxFKSwgYWRkIGEgY29va2llICh3aXRoIENVUkxPUFRfQ09PS0lFTElTVCksIHRlbGwgaXQgdG8KICB3cml0ZSB0aGUgcmVzdWx0IHRvIGEgZ2l2ZW4gY29va2llIGphciBhbmQgdGhlbiBuZXZlciBhY3R1YWxseSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKSAtIHRoZSBnaXZlbiBmaWxlKHMpIHRvIHJlYWQgd2FzIG5ldmVyIHJlYWQgYnV0IHRoZQogIG91dHB1dCBmaWxlIHdhcyB3cml0dGVuIGFuZCB0aHVzIGl0IGNhdXNlZCBhICJmdW5ueSIgcmVzdWx0LgoKLSBXaGlsZSBkb2luZyBzb21lIHRlc3RzIGZvciB0aGUgYnVnIGFib3ZlLCBJIG5vdGljZWQgdGhhdCBGaXJlZm94IGdlbmVyYXRlcwogIGxhcmdlIG51bWJlcnMgKGZvciB0aGUgZXhwaXJlIHRpbWUpIGluIHRoZSBjb29raWVzLnR4dCBmaWxlIGFuZCBsaWJjdXJsCiAgZGlkbid0IHRyZWF0IHRoZW0gcHJvcGVybHkuIE5vdyBpdCBkb2VzLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNSkKLSBBZGRlZCBtb3JlIHZlcmJvc2UgIndhcm5pbmciIG1lc3NhZ2VzIHRvIHRoZSBjdXJsIGNsaWVudCBmb3IgY2FzZXMgd2hlcmUgaXQKICBmYWlscyB0byBvcGVuL3JlYWQgZmlsZXMgZXRjIHRvIGhlbHAgdXNlcnMgZGlhZ25vc2Ugd2h5IGl0IGRvZXNuJ3QgZG8gd2hhdAogIHlvdSdkIGV4cGVjdCBpdCB0by4gQ29udmVydGVkIGxvdHMgb2Ygb2xkIG1lc3NhZ2VzIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMKICBmdW5jdGlvbiBJIHdyb3RlIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDA1KQotIEphbWVzIEJ1cnNhIGlkZW50aWZpZWQgYSBsaWJjdXJsIEhUVFAgYnVnIGFuZCBhIGdvb2Qgd2F5IHRvIHJlcGVhdCBpdC4gSWYgYQogIHNpdGUgcmVzcG9uZHMgd2l0aCBiYWQgSFRUUCByZXNwb25zZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgaGVhZGVyIGF0IGFsbCwKICBvbmx5IGEgcmVzcG9uc2UgYm9keSwgYW5kIHRoZSB3cml0ZSBjYWxsYmFjayByZXR1cm5zIDAgdG8gYWJvcnQgdGhlCiAgdHJhbnNmZXIsIGl0IGRpZG4ndCBoYXZlIGFueSByZWFsIGVmZmVjdCBidXQgdGhlIHdyaXRlIGNhbGxiYWNrIHdvdWxkIGJlCiAgY2FsbGVkIG9uY2UgbW9yZSBhbnl3YXkuCgpEYW5pZWwgKDEyIEF1Z3VzdCAyMDA1KQotIEJhc2VkIG9uIFJpY2hhcmQgQ2xheXRvbidzIHJlcG9ydHMsIEkgZm91bmQgb3V0IHRoYXQgdXNpbmcgY3VybCAtZCBAZmlsZW5hbWUKICB3aGVuICdmaWxlbmFtZScgd2FzIG5vdCBwb3NzaWJsZSB0byBhY2Nlc3MgbWFkZSBjdXJsIHVzZSBhIEdFVCByZXF1ZXN0CiAgaW5zdGVhZC4KCi0gVGhlIHRpbWUgY29uZGl0aW9uIGlsbGVnYWwgc3ludGF4IHdhcm5pbmcgaXMgbm93IGluaGliaXRlZCBpZiAtcyBpcyB1c2VkLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNSkKLSBNYXJpbyBTY2hyb2VkZXIgZm91bmQgb3V0IHRoYXQgb25lIG9mIHRoZSBkZWJ1ZyBjYWxsYmFja3MgY2FsbHMgdGhhdCByZWdhcmRzCiAgU1NMIGRhdGEgd2l0aCB0aGUgQ1VSTElORk9fVEVYVCB0eXBlIGNsYWltZWQgdGhhdCB0aGUgZGF0YSB3YXMgb25lIGJ5dGUKICBsYXJnZXIgdGhhbiBpdCBhY3R1YWxseSBpcywgdGh1cyBmYWxzZWx5IHRlbGxpbmcgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlCiAgdGVybWluYXRpbmcgemVybyB3YXMgcGFydCBvZiB0aGUgZGF0YS4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgdGhlIG9mZnNldHMgdXNlZCBmb3IgZGF0ZSBwYXJzaW5ncyB3aGVuIHRoZSB0aW1lCiAgem9uZSBuYW1lIG9mIGEgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyB1c2VkLiBGb3IgZXhhbXBsZSwgUERUIHZzIFBEUy4gVGhpcwogIGZsYXcgd2FzIGludHJvZHVjZWQgd2l0aCB0aGUgbmV3IGRhdGUgcGFyc2VyICgxMSBzZXAgMjAwNCAtIDcuMTIuMikuCiAgRm9ydHVuYXRlbHksIG5vIHdlYiBzZXJ2ZXIgb3IgY29va2llIHN0cmluZyBldGMgc2hvdWxkIGJlIHVzaW5nIHN1Y2ggdGltZQogIHpvbmUgbmFtZXMgdGh1cyBsaW1pdGluZyB0aGUgZWZmZWN0IG9mIHRoaXMgYnVnLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA1KQotIEpvbiBHcnViYnMgZmlsZWQgYnVnIHJlcG9ydCAjMTI0OTk2MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjQ5OTYyKSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggTlRMTSBvbiBhIEhUVFAgcHJveHkgaWYgYW4gRlRQIFVSTCB3YXMgZ2l2ZW4uIGxpYmN1cmwgbm93IHByb3Blcmx5CiAgc3dpdGNoZXMgdG8gcHVyZSBIVFRQIGludGVybmFsbHkgd2hlbiBhbiBIVFRQIHByb3h5IGlzIHVzZWQsIGV2ZW4gZm9yIEZUUAogIFVSTHMuIFRoZSBwcm9ibGVtIHdvdWxkIGFsc28gb2NjdXIgd2l0aCBvdGhlciBtdWx0aS1wYXNzIGF1dGggbWV0aG9kcy4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNSkKLSBXaGVuIGN1cmwgaXMgYnVpbHQgd2l0aCBHbnVUTFMsIGN1cmwtY29uZmlnIGRpZG4ndCBpbmNsdWRlICJTU0wiIHdoZW4KICAtLWZlYXR1cmVzIHdhcyB1c2VkLgoKRGFuaWVsICgyOCBKdWx5IDIwMDUpCi0gSWYgYW55IG9mIHRoZSBvcHRpb25zIENVUkxPUFRfSFRUUEdFVCwgQ1VSTE9QVF9QT1NUIGFuZCBDVVJMT1BUX0hUVFBQT1NUIGlzCiAgc2V0IHRvIDEsIENVUkxPUFRfTk9CT0RZIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgYmUgc2V0IHRvIDAuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlcyBvdmVyIHRoZSBsYXN0IHdlZWs6IGZpeGVkIG51bWVyb3VzIG1pbm9yIGNvbmZpZ3VyZQogIG9wdGlvbiBwYXJzaW5nIGZsYXdzOiAtLXdpdGhvdXQtZ251dGxzLCAtLXdpdGhvdXQtc3BuZWdvIC0td2l0aG91dC1nc3NhcGkKICBhbmQgLS13aXRob3V0LWtyYjQuIFNwZWxsZml4ZWQgc2V2ZXJhbCBlcnJvciBtZXNzYWdlcy4KCi0gUGV0ZXJpcyBLcnVtaW5zIGFkZGVkIENVUkxPUFRfQ09PS0lFTElTVCBhbmQgQ1VSTElORk9fQ09PS0lFTElTVCwgd2hpY2ggaXMgYQogIHNpbXBsZSBpbnRlcmZhY2UgdG8gZXh0cmFjdGluZyBhbmQgc2V0dGluZyBjb29raWVzIGluIGxpYmN1cmwncyBpbnRlcm5hbAogICJjb29raWUgamFyIi4gU2VlIHRoZSBuZXcgY29va2llX2ludGVyZmFjZS5jIGV4YW1wbGUgY29kZS4KCkRhbmllbCAoMTMgSnVseSAyMDA1KQotIERpZWdvIENhc29ycmFuIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gQW1pZ2EgYWdhaW4uCgpEYW5pZWwgKDEyIEp1bHkgMjAwNSkKLSBBZHJpYW4gU2NodXVyIGFkZGVkIHRyYWlsZXIgc3VwcG9ydCBpbiB0aGUgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0uIFRoZQogIHRyYWlsZXIgaXMgdGhlbiBzZW50IHRvIHRoZSBub3JtYWwgaGVhZGVyIGNhbGxiYWNrL3N0cmVhbS4gSSB3cm90ZSB1cCB0ZXN0CiAgY2FzZSAyNjYgdG8gdmVyaWZ5IHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5LiBEbyBub3RlIHRoYXQgdGVzdCBjYXNlIDM0CiAgY29udGFpbnMgYSBmbGF3ZWQgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0gdGhhdCBzdGlsbCB3b3JrcyB0aGUgc2FtZS4KCkRhbmllbCAoNSBKdWx5IDIwMDUpCi0gR2lzbGUgVmFuZW0gY2FtZSB1cCB3aXRoIGEgbmljZSBsaXR0bGUgd29yay1hcm91bmQgZm9yIGJ1ZyAjMTIzMDExOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KS4gSXQgc2VlbXMgdGhlIFdpbmRvd3MgKE1TVkMpCiAgbGliYyB0aW1lIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIGRhdGEgb25lIGhvdXIgb2ZmIGlmIFRaIGlzIG5vdCBzZXQgYW5kCiAgYXV0b21hdGljIERTVCBhZGp1c3RtZW50IGlzIGVuYWJsZWQuIFRoaXMgbWFkZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gd3JvbmcKICB2YWx1ZSwgYW5kIGl0IGFsc28gY29uY2VybmVkIGludGVybmFsIGNvb2tpZSBleHBpcmF0aW9ucyBldGMuCgpEYW5pZWwgKDQgSnVseSAyMDA1KQotIEFuZHJldyBCdXNobmVsbCBwcm92aWRlZCBlbm91Z2ggaW5mbyBmb3IgbWUgdG8gdGVsbCB0aGF0IHdlIGJhZGx5IG5lZWRlZCB0bwogIGZpeCB0aGUgQ09OTkVDVCBhdXRoZW50aWNhdGlvbiBjb2RlIHdpdGggbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMgKHN1Y2ggYXMKICBOVExNKSBhcyBpdCBkaWRuJ3QgcHJldmlvdXNseSBwcm9wZXJseSBpZ25vcmUgcmVzcG9uc2UtYm9kaWVzIC0gaW4gZmFjdCBpdAogIHN0b3BwZWQgcmVhZGluZyBhZnRlciBhbGwgcmVzcG9uc2UgaGVhZGVycyBoYWQgYmVlbiByZWNlaXZlZC4gVGhpcyBjb3VsZAogIGxlYWQgdG8gbGliY3VybCBzZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3QgYW5kIHJlYWRpbmcgdGhlIGJvZHkgZnJvbSB0aGUgZmlyc3QKICByZXF1ZXN0IGFzIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgcmVxdWVzdC4gKEkgYWxzbyByZW5hbWVkIHRoZSBmdW5jdGlvbiwKICB3aGljaCB3YXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dC4uLikKCiAgVGhlIGJlc3QgZml4IHdvdWxkIHRvIG9uY2UgYW5kIGZvciBhbGwgbWFrZSB0aGUgQ09OTkVDVCBjb2RlIHVzZSB0aGUKICBvcmRpbmFyeSByZXF1ZXN0IHNlbmRpbmcvcmVjZWl2aW5nIGNvZGUsIHRyZWF0aW5nIGl0IGFzIGFueSBvcmRpbmFyeSByZXF1ZXN0CiAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbC1wdXJwb3NlIGZ1bmN0aW9uIHdlIGhhdmUgbm93LiBJdCBzaG91bGQgbWFrZSBpdAogIGJldHRlciBmb3IgbXVsdGktaW50ZXJmYWNlIHRvby4gQW5kIHBvc3NpYmx5IGxlYWQgdG8gbGVzcyBjb2RlLi4uCgogIEFkZGVkIHRlc3QgY2FzZSAyNjUgZm9yIHRoaXMuIEl0IGRvZXNuJ3Qgd29yayBhcyBhIF9yZWFsbHlfIGdvb2QgdGVzdCBjYXNlCiAgc2luY2UgdGhlIHRlc3QgcHJveHkgaXMgdG9vIHN0dXBpZCwgYnV0IHRoZSB0ZXN0IGNhc2UgaGVscHMgd2hlbiBydW5uaW5nIHRoZQogIGRlYnVnZ2VyIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgSnVuZSAyMDA1KQotIERhbiBGYW5kcmljaCBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCdzIGFiaWxpdHkgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQKICBvZiBzdHJlcnJvcl9yKCkgQVBJIHRoYXQgaXMgdXNlZCB3aGVuIGNyb3NzLWNvbXBpbGluZy4gSWYgX19HTElCX18gaXMKICBkZWZpbmVkLCBpdCBhc3N1bWVzIHRoZSBnbGliYyBBUEkuIElmIG5vdCwgaXQgaXNzdWVzIGEgbm90aWNlIGFzIGJlZm9yZSB0aGF0CiAgdGhlIHVzZXIgbmVlZHMgdG8gbWFudWFsbHkgZWRpdCBsaWIvY29uZmlnLmggZm9yIHRoaXMuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3J3MgZml4IHRoYXQgdW5pZmllcyBwcm94eSBzdHJpbmcgdHJlYXRtZW50IHNvIHRoYXQgYSBwcm94eSBnaXZlbgogIHdpdGggQ1VSTE9QVF9QUk9YWSBjYW4gdXNlIGEgaHR0cDovLyBwcmVmaXggYW5kIHVzZXIgKyBwYXNzd29yZC4gVGhlIHVzZXIKICBhbmQgcGFzc3dvcmQgZmllbGRzIGFyZSBub3cgYWxzbyBVUkwgZGVjb2RlZCBwcm9wZXJseS4gVGVzdCBjYXNlIDI2NCBhZGRlZAogIHRvIHZlcmlmeS4KCkRhbmllbCAoMjIgSnVuZSAyMDA1KQotIERhdmlkIFNoYXcgdXBkYXRlZCBsaWJjdXJsLm00CgpEYW5pZWwgKDE0IEp1bmUgMjAwNSkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIHBvdGVudGlhbCB0aHJlYWQgaGFuZGxlIGxlYWsuIEJ1ZyByZXBvcnQgIzEyMTY1MDAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIxNjUwMCkuICBDb21tZW50IGluCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTA2LzAwNTkuaHRtbAoKRGFuaWVsICgxMyBKdW5lIDIwMDUpCi0gTWFkZSBidWlsZGNvbmYgcnVuIGxpYnRvb2xpemUgaW4gdGhlIGFyZXMgZGlyIHRvbyAoaW5zcGlyZWQgYnkgVHVwb25lJ3MKICByZXZlcnRlZCBwYXRjaCkuCgpEYW5pZWwgKDkgSnVuZSAyMDA1KQotIEluY29ycG9yYXRlZCBUdXBvbmUncyBmaW5kdG9vbCBmaXggaW4gYnVpbGRjb25mIChzbGlnaHRseSBlZGl0ZWQpCgotIEluY29ycG9yYXRlZCBUdXBvbmUncyBoZWFkIC1uIGZpeCBpbiBidWlsZGNvbmYuCgpEYW5pZWwgKDggSnVuZSAyMDA1KQotIFJldmVydGVkIFR1cG9uZSdzIHBhdGNoIGFnYWluLCBpdCBicm9rZSBudW1lcm91cyBhdXRvYnVpbGRzLiBMZXQncyBhcHBseSBpdAogIGluIHBpZWNlcywgb25lIGJ5IG9uZSBhbmQgc2VlIHdoYXQgd2UgbmVlZCB0byBhZGp1c3QgdG8gd29yayBhbGwgb3Zlci4KCkRhbmllbCAoNiBKdW5lIDIwMDUpCi0gVHVwb25lIEFsZnJlZG8gZml4ZWQgdGhyZWUgcHJvYmxlbXMgaW4gYnVpbGRjb25mOgoKICAxKSBmaW5kdG9vbCBkb2VzIGxvb2sgcGVyIHRvb2wgaW4gUEFUSCBhbmQgdGhpbmsgLi9wZXJsIGlzIHRoZSBwZXJsCiAgZXhlY3V0YWJsZSwgd2hpbGUgaXMganVzdCBhIGxvY2FsIGRpcmVjdG9yeSAoSSBoYXZlIC4gaW4gdGhlIFBBVEgpCgogIDIpIEkgZ290IHNldmVyYWwgd2FybmluZyBmb3IgaGVhZCAtMSBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBoZWFkIC1uIDEKCiAgMykgYXJlcyBkaXJlY3RvcnkgaXMgbWlzc2luZyBzb21lIGZpbGUgKG1pc3NpbmcgaXMgbWlzc2luZyA6LSkgKSBiZWNhdXNlCiAgYXV0b21ha2UgYW5kIGZyaWVuZHMgaXMgbm90IHJ1bi4KCkRhbmllbCAoMyBKdW5lIDIwMDUpCi0gQWRkZWQgZG9jcy9saWJjdXJsL2dldGluZm8tdGltZXMsIGJhc2VkIG9uIGZlZWRiYWNrIGZyb20gJ0VkaSc6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMTE3ODMyNTc5ODI5OSZzdXBwb3J0PXllcwoKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIHlldCBhbm90aGVyIHRleHQgbW9kZSBwYXRjaCBmb3Igc2V2ZXJhbCB0ZXN0IGNhc2VzIHNvCiAgdGhhdCB0aGV5IGRvIHRleHQgY29tcGFyaXNpb25zIGJldHRlciBvbiBXaW5kb3dzIChuZXdsaW5lLXdpc2UpLgoKRGFuaWVsICgxIEp1bmUgMjAwNSkKLSBUaGUgY29uZmlndXJlIGNoZWNrIGZvciBjLWFyZXMgbm93IGFkZHMgdGhlIGNhcmVzIGxpYiBiZWZvcmUgdGhlIG90aGVyIGxpYnMsCiAgdG8gbWFrZSBpdCBidWlsZCBmaW5lIHdpdGggbWluZ3cuIEluc3BpcmVkIGJ5IFR1cG9uZSBBbGZyZWRvJ3MgYnVnIHJlcG9ydAogIGFuZCBwYXRjaDogaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIxMjk0MAoKRGFuaWVsICgzMSBNYXkgMjAwNSkKLSBUb2RkIEt1bGVzemEgcmVwb3J0ZWQgYSBmbGF3IGluIHRoZSBwcm94eSBvcHRpb24sIHNpbmNlIGEgbnVtZXJpY2FsIElQdjYKICBhZGRyZXNzIHdhcyBub3QgcG9zc2libGUgdG8gdXNlLiBJdCBpcyBub3csIGJ1dCByZXF1aXJlcyBpdCB3cml0dGVuCiAgUkZDMjczMi1zdHlsZSwgd2l0aGluIGJyYWNrZXRzIC0gd2hpY2ggaW5jaWRlbnRseSBpcyBob3cgeW91IGVudGVyIG51bWVyaWNhbAogIElQdjYgYWRkcmVzc2VzIGluIFVSTHMuIFRlc3QgY2FzZSAyNjMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgzMCBNYXkgMjAwNSkKLSBFcmljIENvb3BlciByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gd2l0aCBIVFRQIHNlcnZlcnMgdGhhdCByZXNwb25kcyB3aXRoCiAgYmluYXJ5IHplcm9lcyB3aXRoaW4gdGhlIGhlYWRlcnMuIFRoZXkgY29uZnVzZWQgbGliY3VybCB0byBkbyB3cm9uZyBzbyB0aGUKICBkb3dubG9hZGVkIGhlYWRlcnMgYmVjb21lIGluY29tcGxldGUuIFRoZSBmaXggaXMgbm93IHZlcmlmaWVkIHdpdGggdGVzdCBjYXNlCiAgMjYyLiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzEwOTQ4CgpEYW5pZWwgKDI1IE1heSAyMDA1KQotIEZpeGVkIHByb2JsZW1zIHdpdGggdGhlIHRlc3Qgc3VpdGUsIGFuZCBpbiBwYXJ0aWN1bGFyIHRoZSBGVFAgdGVzdCBjYXNlcwogIHNpbmNlIGl0IHByZXZpb3VzbHkgd2FzIGZhaWxpbmcgZXZlcnkgbm93IGFuZCB0aGVuIGluIGEgbm9uc2Vuc2UgbWFubmVyLgoKLSAtLXRyYWNlLXRpbWUgbm93IG91dHB1dHMgdGhlIGZ1bGwgbWljcm9zZWNvbmQsIGFsbCA2IGRpZ2l0cy4KCkRhbmllbCAoMjQgTWF5IDIwMDUpCi0gQW5kcmVzIEdhcmNpYSBwcm92aWRlZCBhIHRleHQgbW9kZSBwYXRjaCBmb3Igc2V2ZXJhbCB0ZXN0IGNhc2VzIHNvIHRoYXQgdGhleQogIGRvIHRleHQgY29tcGFyaXNpb25zIGJldHRlciBvbiBXaW5kb3dzIChuZXdsaW5lLXdpc2UpLgoKLSBBbnkgMnh4IHJlc3BvbnNlIChhbmQgbm90IGp1c3QgMjAwKSBpcyBub3cgY29uc2lkZXJlZCBhIGZpbmUgcmVzcG9uc2UgdG8KICBUWVBFLCBhcyBzb21lIHNlcnZlcnMgb2J2aW91c2x5IHNlbmRzIGEgMjI2IHRoZXJlLiBBZGRlZCB0ZXN0IGNhc2UgMjYxIHRvCiAgdmVyaWZ5LiBCYXNlZCBvbiBhIHF1ZXN0aW9uL3JlcG9ydCBieSBHZW9yZyBXaWNoZXJza2kuCgpEYW5pZWwgKDIwIE1heSAyMDA1KQotIEltcHJvdmVkIHJ1bnRlc3RzLnBsIHRvIGFsbG93IHN0ZG91dCB0ZXN0cyB0byBiZSBtb2RlPXRleHQgYXMgd2VsbCwganVzdAogIGFzIGZpbGUgY29tcGFyaXNvbnMgYWxyZWFkeSBzdXBwb3J0cy4gQWRkZWQgdGhpcyBpbmZvIHRvIHRoZSBGSUxFRk9STUFUCiAgZG9jcy4KCkRhbmllbCAoMTggTWF5IDIwMDUpCi0gSm9obiBNY0dvd2FuIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGJ1ZyByZXBvcnQgIzEyMDQ0MzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIwNDQzNSkgd2l0aCBtYWxmb3JtZWQgVVJMcyBsaWtlCiAgImh0dHA6Ly9zb21laG9zdD9kYXRhIiBhcyBpdCBhZGRlZCBhIHNsYXNoIHRvbyBtdWNoIGluIHRoZSByZXF1ZXN0ICgiR0VUCiAgLz9kYXRhLyIuLi4pLiBBZGRlZCB0ZXN0IGNhc2UgMjYwIHRvIHZlcmlmeS4KCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGZhaWxlZCB0byBkZXRlY3QgdGhlIHByb3BlciBBUEkgYXQKICB0aW1lcywgbGlrZSBvbiBIUC1VWCAxMC4yMC4gVGhlbiBsaWIvc3RyZXJyb3IuYyBiYWRseSBhc3N1bWVkIHRoZSBnbGliYwogIHZlcnNpb24gaWYgdGhlIHBvc2l4IGRlZmluZSB3YXNuJ3Qgc2V0IChzaW5jZSBpdCBfaGFkXyBmb3VuZCBhIHN0cmVycm9yX3IpLgoKRGFuaWVsICgxNiBNYXkgMjAwNSkKLSBUaGUgZ210aW1lX3IoKSBmdW5jdGlvbiBpbiBIUC1VWCAxMC4yMCBpcyBicm9rZW4uIEFib3V0IDEzIHRlc3QgY2FzZXMgZmFpbAogIGR1ZSB0byB0aGlzLiBUaGVyZSdzIG5vdyBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0IGF0dGVtcHRzIHRvIGRldGVjdCB0aGUgYmFkCiAgZnVuY3Rpb24gYW5kIG5vdCB1c2UgaXQgb24gc3VjaCBzeXN0ZW1zLgoKVmVyc2lvbiA3LjE0LjAgKDE2IE1heSAyMDA1KQoKRGFuaWVsICgxMyBNYXkgMjAwNSkKLSBHcmlnb3J5IEVudGluIHJlcG9ydGVkIHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBkZXRlY3RzIGEgZmluZSBwb2xsKCkgZm9yIE1hYwogIE9TIFggMTAuNCAod2hpbGUgMTAuMyBvciBsYXRlciBkZXRlY3RlZCBhICJiYWQiIG9uZSksIGJ1dCB0aGUgZXhlY3V0YWJsZQogIGRvZXNuJ3Qgd29yayBhcyBnb29kIGFzIGlmIGJ1aWx0IHdpdGhvdXQgcG9sbCgpLiBJJ3ZlIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICB0byBhbHdheXMgc2tpcCB0aGUgZmluZS1wb2xsKCkgdGVzdCBvbiBNYWMgT1MgWCAoZGFyd2luKS4KCkRhbmllbCAoMTIgTWF5IDIwMDUpCi0gV2hlbiBkb2luZyBhIHNlY29uZCByZXF1ZXN0IChhZnRlciBhIGRpc2Nvbm5lY3QpIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLAogIG92ZXIgYSBwcm94eSB0aGF0IHVzZXMgTlRMTSBhdXRoZW50aWNhdGlvbiwgbGliY3VybCBmYWlsZWQgdG8gdXNlIE5UTE0gYWdhaW4KICBwcm9wZXJseSAodGhlIGF1dGggbWV0aG9kIHdhcyBhY2NpZGVudGFsbHkgcmVzZXQgdG8gdGhlIHNhbWUgYXMgaGFkIGJlZW4gc2V0CiAgZm9yIGhvc3QgYXV0aCwgd2hpY2ggZGVmYXVsdHMgdG8gQmFzaWMpLiBCdWcgcmVwb3J0ICMxMjAwNjYxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMDA2NjEpIGlkZW50aWZpZWQgdGhlIHRoZSBwcm9ibGVtIGFuZAogIHRoZSBmaXguCgotIElmIC16Ly0tdGltZS1jb25kIGlzIHVzZWQgd2l0aCBhbiBpbnZhbGlkIGRhdGUgc3ludGF4LCB0aGlzIGlzIG5vIGxvbmdlcgogIHNpbGVudGx5IGRpc2NhcmRlZC4gSW5zdGVhZCBhIHByb3BlciB3YXJuaW5nIG1lc3NhZ2UgaXMgZGlwbGF5ZWQgdGhhdAogIGluZm9ybXMgYWJvdXQgaXQuIEJ1dCBpdCBzdGlsbCBjb250aW51ZXMgd2l0aG91dCB0aGUgY29uZGl0aW9uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMiAoMTEgTWF5IDIwMDUpCgpEYW5pZWwgKDExIE1heSAyMDA1KQotIFN0YXJ0aW5nIG5vdywgbGliY3VybCBzZW5kcyBhIGxpdHRsZSBkaWZmZXJlbnQgc2V0IG9mIGhlYWRlcnMgaW4gaXRzIGRlZmF1bHQKICBIVFRQIHJlcXVlc3RzOgoKICBBKSBOb3JtYWwgbm9uLXByb3h5IEhUVFA6CiAgICAtIG5vIG1vcmUgIlByYWdtYTogbm8tY2FjaGUiICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgdG8gcHJveGllcykKCiAgQikgTm9uLUNPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJQcmFnbWE6IG5vLWNhY2hlIiBpcyB1c2VkIChsaWtlIGJlZm9yZSkKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiIChmb3Igb2xkZXIgc3R5bGUgMS4wLXByb3hpZXMpCgogIEMpIENPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJIb3N0OiBbbmFtZV06W3BvcnRdIgogICAgLSAiUHJveHktQ29ubmVjdGlvbjogS2VlcC1hbGl2ZSIKCiAgVGhlIEEpIGNhc2UgaXMgbW9zdGx5IHRvIHJlZHVjZSB0aGUgZGVmYXVsdCBoZWFkZXIgc2l6ZSBhbmQgcmVtb3ZlIGEKICBwb2ludGxlc3MgaGVhZGVyLgoKICBUaGUgQikgaXMgdG8gYWRkcmVzcyAocmFyZSkgcHJvYmxlbXMgd2l0aCBIVFRQIDEuMCBwcm94aWVzCgogIFRoZSBDKSBoZWFkZXJzIGFyZSBib3RoIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggc29tZSBwcm94aWVzLiBUaGUKICBjb2RlIGluIGxpYmN1cmwgdGhhdCBkZWFscyB3aXRoIENPTk5FQ1QgcmVxdWVzdHMgbmVlZCBhIHJld3JpdGUsIGJ1dCBpdAogIGZlZWxzIGxpa2UgYSB0b28gYmlnIGEgam9iIGZvciBtZSB0byBkbyBub3cuIERldGFpbHMgYXJlIGFkZGVkIGluIHRoZSBjb2RlCiAgY29tbWVudHMgZm9yIG5vdy4KCiAgVXBkYXRlZCBhIGxhcmdlIGFtb3VudCBvZiB0ZXN0IGNhc2VzIHRvIHJlZmxlY3QgdGhlIG5ld3MuCgpEYW5pZWwgKDEwIE1heSAyMDA1KQotIEhhbGYtYmFrZWQgYXR0ZW1wdCB0byBiYWlsIG91dCBpZiBzZWxlY3QoKSByZXR1cm5zIF9vbmx5XyBlcnJvcmZkcyB3aGVuIHRoZQogIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbiBhdHRlbXB0IHRvIGZpeCBBbGxhbidzIHByb2JsZW0uIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNS8wMDczLmh0bWwgYW5kIHRoZSByZXN0IG9mIHRoYXQgdGhyZWFkCiAgZm9yIGRldGFpbHMuCgogIEknbSBzdGlsbCBub3Qgc3VyZSB0aGlzIGlzIHRoZSByaWdodCBmaXgsIGJ1dC4uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMSAoOSBNYXkgMjAwNSkKCkRhbmllbCAoMiBNYXkgMjAwNSkKLSBTb3J0IG9mICJmaXhlZCIgS05PV05fQlVHUyAjNDogY3VybCBub3cgYnVpbGRzIElQdjYgZW5hYmxlZCBvbiBBSVggNC4zLiBBdAogIGxlYXN0IGl0IHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSBjb21waWxlciBlcnJvci4gSG93ZXZlciwgaXQgZG9lcyBub3QgaGF2ZQogIEFJX05VTUVSSUNIT1NUIHNvIHdlIGNhbm5vdCBnZXRhZGRyaW5mbygpIGFueSBudW1lcmljYWwgYWRkcmVzc2VzIHdpdGggaXQKICAod2UgdXNlIHRoYXQgZm9yIEZUUCBQT1JUL0VQUlQpISBTbywgSSBtb2RpZmllZCB0aGUgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgdGhlIGdldGFkZHJpbmZvKCkgaXMgd29ya2luZywgdG8gdXNlIEFJX05VTUVSSUNIT1NUIHNpbmNlIHRoZW4KICBpdCdsbCBmYWlsIG9uIEFJWCA0LjMgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBidWlsZCB3aXRoIElQdjYgc3VwcG9ydAogIGRpc2FibGVkLgoKLSBBZGRlZCAtLXRyYWNlLXRpbWUgdGhhdCB3aGVuIHVzZWQgYWRkcyBhIHRpbWUgc3RhbXAgdG8gZWFjaCB0cmFjZSBsaW5lIHRoYXQKICAtLXRyYWNlLCAtLXRyYWNlLWFzY2lpIGFuZCAtLXZlcmJvc2Ugb3V0cHV0LiBJIGFsc28gbWFkZSB0aGUgJz4nIGRpc3BsYXkKICBzZXBhcmF0ZSBlYWNoIGxpbmUgb24gdGhlIGxpbmVmZWVkIHNvIHRoYXQgSFRUUCByZXF1ZXN0cyBldGMgbG9vayBuaWNlciBpbgogIHRoZSAtdiBvdXRwdXQuCgotIE1hZGUgY3VybCByZWNvZ25pemUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBMeW54IChhbmQgb3RoZXJzPykgc3VwcG9ydCBmb3IKICBwb2ludGluZyBvdXQgdGhlIENBIGNlcnQgcGF0aC9maWxlOiBTU0xfQ0VSVF9ESVIgYW5kIFNTTF9DRVJUX0ZJTEUuIElmCiAgQ1VSTF9DQV9CVU5ETEUgaXMgbm90IHNldCwgdGhleSBhcmUgY2hlY2tlZCBhZnRlcndhcmRzLgoKICBMaWtlIGJlZm9yZTogb24gd2luZG93cyBpZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIGl0IGNoZWNrcyBmb3IgdGhlIGNhIGNlcnQKICBmaWxlIGxpa2UgdGhpczoKCiAgMS4gYXBwbGljYXRpb24ncyBkaXJlY3RvcnkKICAyLiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgMy4gV2luZG93cyBTeXN0ZW0gZGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3Ncc3lzdGVtMzIpCiAgNC4gV2luZG93cyBEaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93cykKICA1LiBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgJVBBVEglCgpEYW5pZWwgKDEgTWF5IDIwMDUpCi0gVGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBub3cgc3RhcnRzIHRlc3Qgc2VydmVycyBieSBkb2luZyBmb3JrKCkgYW5kIGV4ZWMoKQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGFwcHJvYWNoLiBUaGlzIGlzIGxlc3MgY29tcGxpY2F0ZWQgYW5kIHNob3VsZAogIGhvcGVmdWxseSBsZWFkIHRvIGxlc3MgImxlYWtlZCIgc2VydmVycyAoc2VydmVycyB0aGF0IGFyZW4ndCBzdG9wcGVkCiAgcHJvcGVybHkgd2hlbiB0aGUgdGVzdHMgYXJlIHN0b3BwZWQpLgoKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIGEgY2FzZSB3aGVuIHlvdSBkaWQgImN1cmwgLUkgW1VSTF0iIGFuZCBpdAogIGNvbXBsYWluZWQgb24gdGhlIGNodW5rZWQgZW5jb2RpbmcsIGV2ZW4gdGhvdWdoIGEgSEVBRCBzaG91bGQgbmV2ZXIgcmV0dXJuIGEKICBib2R5IGFuZCB0aHVzIGl0IGNhbm5vdCBiZSBhIGNodW5rZWQtZW5jb2RpbmcgcHJvYmxlbSEKCkRhbmllbCAoMzAgQXByaWwgMjAwNSkKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIG91dCB0aGF0IChsaWIpY3VybCBTSUdTRUdWZWQgd2hlbiB1c2luZwogIC0taW50ZXJmYWNlIG9uIGFuIGFkZHJlc3MgdGhhdCBjYW4ndCBiZSBib3VuZC4KCkRhbmllbCAoMjggQXByaWwgMjAwNSkKLSBXb3JraW5nIG9uIGZpeGluZyB1cCB0ZXN0IGNhc2VzIHRvIG1hcmsgc2VjdGlvbnMgYXMgJ21vZGU9dGV4dCcgZm9yIHRoaW5ncwogIHRoYXQgY3VybCB3cml0ZXMgYXMgdGV4dCBmaWxlcywgc2luY2UgdGhlbiB0aGV5IGNhbiBnZXQgZGlmZmVyZW50IGxpbmUKICBlbmRpbmdzIGRlcGVuZGluZyBvbiBPUy4gQW5kculzIEdhcmPtYSBoZWxwcyBtZSB3b3JrIHRoaXMgb3V0LgoKICBEaWQgbG90cyBvZiBvdGhlciBtaW5vciB0d2Vha3Mgb24gdGhlIHRlc3Qgc2NyaXB0cyB0byB3b3JrIGJldHRlciBhbmQgbW9yZQogIHJlbGlhYmx5IGZpbmQgdGVzdCBzZXJ2ZXJzIGFuZCBhbHNvIGtpbGwgdGVzdCBzZXJ2ZXJzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgaG93IHRoZSBydW50ZXN0cy5wbCBzY3JpcHQga2lsbGVkIHRoZSBIVFRQIHNlcnZlcgogIGluc3RlYWQgb2YgdGhlIEhUVFBTIHNlcnZlciB3aGVuIGNsb3NpbmcgaXQgZG93bi4KCkRhbmllbCAoMjcgQXByaWwgMjAwNSkKLSBQYXVsIE1vb3JlIG1hZGUgY3VybCBjaGVjayBmb3IgdGhlIC5jdXJscmMgZmlsZSAoX2N1cmxyYyBvbiB3aW5kb3dzKSBvbiB0d28KICBtb3JlIHBsYWNlcy4gRmlyc3QsIENVUkxfSE9NRSBpcyBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGlzIHVzZWQKICBpbnN0ZWFkIG9mIEhPTUUgaWYgaXQgaXMgc2V0LCB0byBwb2ludCBvdXQgd2hlcmUgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUKICBsaXZlcy4gSWYgdGhlcmUncyBubyBjb25maWcgZmlsZSBpbiB0aGUgZGlyIHBvaW50ZWQgb3V0IGJ5IG9uZSBvZiB0aGUKICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbCBpbnN0ZWFkIGNoZWNrIHRoZSBzYW1lCiAgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGN1cmwgaXMgbG9jYXRlZCBpbi4KCkRhbmllbCAoMjYgQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbidzIHdvcmsgb24gbnVraW5nIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgb24geDY0IHdpdGgKICBWUzIwMDUuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDUpCi0gRnJlZCBOZXcgcmVwb3J0ZWQgYSBidWcgd2hlcmUgd2UgdXNlZCBCYXNpYyBhdXRoIGFuZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCiAgaW4gLm5ldHJjLCBhbmQgd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogdGhlIHN1YnNlcXVlbnQgcmVxdWVzdHMgZGlkbid0CiAgcHJvcGVybHkgdXNlIHRoZSBhdXRoIGFzIGZvdW5kIGluIHRoZSBuZXRyYyBmaWxlLiBBZGRlZCB0ZXN0IGNhc2UgMjU3IHRvCiAgdmVyaWZ5IG15IGZpeC4KCi0gQmFzZWQgb24gZmVlZGJhY2sgZnJvbSBDb3J5IE5lbHNvbiwgSSBhZGRlZCBzb21lIHByZXByb2Nlc3NvciBtYWdpYyBpbgogICovc2V0dXAuaCBhbmQgKi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIHdpdGggVlMyMDA1IG9uIHg2NC4KCkRhbmllbCAoMjMgQXByaWwgMjAwNSkKLSBBbGV4IFN1eWtvdiBtYWRlIHRoZSBjdXJsIHRvb2wgbm93IGFzc3VtZSB0aGF0IHVwbG9hZHMgdXNpbmcgSFRUUDovLyBvcgogIEhUVFBTOi8vIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgc2hvdyBvdXRwdXQgYW5kIHRodXMgbW90aXZhdGVzIGEgc3dpdGNoZWQKICBvZmYgcHJvZ3Jlc3MgbWV0ZXIgaWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIHRoZSB0ZXJtaW5hbC4gVGhpcyBtYWtlcyBGVFAKICB1cGxvYWRzIHdpdGhvdXQgJz4nLCAtbyBvciAtTyBzaG93IHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjIgQXByaWwgMjAwNSkKLSBEYXZlIERyaWJpbidzIE1TVkMgbWFrZWZpbGUgZml4OiBzZXQgQ1VSTF9TVEFUSUNMSUIgd2hlbiBpdCBidWlsZHMgc3RhdGljCiAgbGlicmFyeSB2YXJpYW50cy4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCBjb25maWd1cmUgdG8gc2V0IHRoZSBwcm9wZXIgZGVmaW5lIHdoZW4gYnVpbGRpbmcgc3RhdGljCiAgbGliY3VybCBvbiB3aW5kb3dzLgoKLSAtLXJldHJ5LWRlbGF5IGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBBcHJpbCAyMDA1KQotIE9saXZpZXIgcmVwb3J0ZWQgdGhhdCBldmVuIHRob3VnaCBoZSB1c2VkIENVUkxPUFRfUE9SVCwgbGliY3VybCBjbGVhcmx5CiAgc3RpbGwgdXNlZCB0aGUgZGVmYXVsdCBwb3J0LiBIZSB3YXMgcmlnaHQuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkIHRoZQogIHRlc3QgY2FzZXMgNTIxLCA1MjIgYW5kIDUyMyB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gVG9zaGl5dWtpIE1hZXphd2EgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjaywKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzZW5kIGFuIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlci4gSXQgZG9lcyBub3cuCgotIEkgY29tbWl0dGVkIGJ5IG1pZyBjaGFuZ2UgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgbW92ZXMgb3V0IGFsbAogIHNvY2tldC9UQ1AgY29kZSB0byBhIHNlcGFyYXRlIEMgcHJvZ3JhbSBuYW1lZCBzb2NrZmlsdC4gQW5kIGFkZGVkIDQgbmV3CiAgdGVzdCBjYXNlcyBmb3IgRlRQIG92ZXIgSVB2Ni4KCkRhbmllbCAoOCBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGEgSFRUUCBzZXJ2ZXIgdGhhdCByZXNwb25kZWQgd2l0aCBhIDMwNAogIHJlc3BvbnNlIGNvbnRhaW5pbmcgYW4gImlsbGVnYWwiIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIsIHdoaWNoIHdhcyBub3QKICBwcm9wZXJseSBpZ25vcmVkIGJ5IGxpYmN1cmwuIE5vdyBpdCBpcy4gVGVzdCBjYXNlIDI0OSB2ZXJpZmllcy4KCkRhbmllbCAoNyBBcHJpbCAyMDA1KQotIEFkZGVkIGFiaWxpdHkgdG8gYnVpbGQgYW5kIHJ1biB3aXRoIEdudVRMUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBPcGVuU1NMIGZvcgogIHRoZSBzZWN1cmUgbGF5ZXIuIGNvbmZpZ3VyZSAtLXdpdGgtZ251dGxzIGVuYWJsZXMgd2l0aC4gTm90ZSB0aGF0IHRoZQogIHByZXZpb3VzIE9wZW5TU0wgY2hlY2sgc3RpbGwgaGFzIHByZWZlcmVuY2UgYW5kIGlmIGl0IGZpcnN0IGRldGVjdHMgT3BlblNTTCwKICBpdCB3aWxsIG5vdCBjaGVjayBmb3IgR251VExTLiBZb3UgbWF5IG5lZWQgdG8gZXhwbGljdGx5IGRpYWJsZSBPcGVuU1NMIHdpdGgKICAtLXdpdGhvdXQtc3NsLgoKICBUaGlzIHdvcmsgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5IFRoZSBXcml0dGVuIFdvcmQuCgpEYW5pZWwgKDUgQXByaWwgMjAwNSkKLSBDaHJpc3RvcGhlIExlZ3J5IGZpeGVkIHRoZSBwb3N0LXVwbG9hZCBjaGVjayBmb3IgRlRQIHRvIG5vdCBjb21wbGFpbiBpZiB0aGUKICB1cGxvYWQgd2FzIHNraXBwZWQgZHVlIHRvIGEgdGltZS1jb25kaXRpb24gYXMgc2V0IHdpdGgKICBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEkgYWRkZWQgdGVzdCBjYXNlIDI0NyBhbmQgMjQ4IHRvIHZlcmlmeS4KClZlcnNpb24gNy4xMy4yICg1IEFwcmlsIDIwMDUpCgpEYW5pZWwgKDQgQXByaWwgMjAwNSkKLSBNYXJjZWxvIEp1Y2hlbSBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZSBmb3IgbGliY3VybAoKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGNyYXNoIGluIGxpYmN1cmwsIHRoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBlYXN5IGhhbmRsZQogIHdhcyBraWxsZWQgYmVmb3JlIHRoZSB0aHJlYWRpbmcgcmVzb2x2ZXIgKHdpbmRvd3Mgb25seSkgc3RpbGwgaGFkbid0CiAgY29tcGxldGVkLgoKLSBIYXJkZWVwIFNpbmdoIHJlcG9ydGVkIGEgcHJvYmxlbSBkb2luZyBIVFRQIFBPU1Qgd2l0aCBEaWdlc3QuIChJdCB3YXMKICBhY3R1YWxseSBhbHNvIGFmZmVjdGluZyBOVExNIGFuZCBOZWdvdGlhdGUuKSBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlCiAgc2VydmVyIHJlc3BvbmRlZCB3aXRoIDEwMCBDb250aW51ZSBiZWZvcmUgdGhlIGluaXRpYWwgNDAxIHJlc3BvbnNlLCBsaWJjdXJsCiAgZGlkbid0IHRha2UgY2FyZSBvZiB0aGUgcmVzcG9uc2UgcHJvcGVybHkuIFRlc3QgY2FzZSAyNDUgYW5kIDI0NiBhZGRlZCB0bwogIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA1KQotIEFuZHJlcyBHYXJjaWEgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGxpYmdkaTMyIGJlZm9yZQogIGxpYmNyeXB0bywgdG8gbWFrZSB0aGUgU1NMIGNoZWNrIHdvcmsgZmluZSBvbiBtc3lzL21pbmd3LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA1KQotIFRvbSBNb2VycyBpZGVudGlmaWVkIGEgZmxhdyB3aGVuIHlvdSBzZW50IGEgUE9TVCB3aXRoIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhcyBpbiB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIGN1cmwgc2VuZHMgYSBQT1NUIHdpdGggQ29udGVudC1MZW5ndGg6IDAsIGl0CiAgc3RpbGwgZm9yY2libHkgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBkb2luZyB0aGUgbmV4dCBzdGVwIGluIHRoZSBhdXRoCiAgbmVnb3RpYXRpb24uCgotIEplc3BlciBKZW5zZW4gZm91bmQgb3V0IHRoYXQgRlRQLVNTTCBkaWRuJ3Qgd29yayBzaW5jZSBteSBGVFAKICByZXdyaXRlLiBGaXhpbmcgdGhhdCB3YXMgZWFzeSwgYnV0IGl0IGFsc28gcmV2ZWFsZWQgYSBtdWNoIHdvcnNlIHByb2JsZW06CiAgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggcmVhZGluZwogIHJlc3BvbnNlcyBpbiBtdWx0aXBsZSB0aW55IGNodW5rcyBwcm9wZXJseSEgSSBtb2RpZmllZCB0aGUgRlRQIHNlcnZlciB0bwogIGFsbG93IGl0IHRvIHByb2R1Y2Ugc3VjaCBzcGxpdC11cCByZXNwb25zZXMgdG8gbWFrZSBzdXJlIGN1cmwgZGVhbHMgd2l0aAogIHRoZW0gYXMgaXQgc2hvdWxkLgoKLSBCYXNlZCBvbiBBdWd1c3R1cyBTYXVuZGVycycgY29tbWVudHMgYW5kIGZpbmRpbmdzLCB0aGUgSFRUUCBvdXRwdXQgYXV0aAogIGZ1bmN0aW9uIHdhcyBmaXhlZCB0byB1c2UgdGhlIHByb3BlciBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIG11bHRpcGxlIG9uZXMKICBhcmUgYWNjZXB0ZWQuIHRlc3QgMjM5IGFuZCB0ZXN0IDI0MyB3ZXJlIGFkZGVkIHRvIHJlcGVhdCB0aGUgcHJvYmxlbXMgYW5kCiAgdmVyaWZ5IHRoZSBmaXhlcy4KCiAgLS1wcm94eS1hbnlhdXRoIHdhcyBhZGRlZCB0byB0aGUgY3VybCB0b29sCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDUpCi0gVHJ1NjQgYW5kIHNvbWUgSVJJWCBib3hlcyBzZWVtIHRvIG5vdCBsaWtlIHRlc3QgMjM3IGFzIGl0IGlzLiBUaGVpcgogIGluZXRfYWRkcigpIGZ1bmN0aW9ucyBzZWVtcyB0byB1c2UgJjI1NSBvbiBhbGwgbnVtZXJpY2FscyBpbiBhIGlwdjQgZG90dGVkCiAgYWRkcmVzcyB3aGljaCBtYWtlcyBhIGRpZmZlcmVudCBmYWlsdXJlLi4uIE5vdyBJJ3ZlIG1vZGlmaWVkIHRoZSBpcHY0CiAgcmVzb2x2ZSBjb2RlIHRvIHVzZSBpbmV0X3B0b24oKSBpbnN0ZWFkIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGVzZSBzeXN0ZW1zCiAgYmV0dGVyIGRldGVjdCB0aGlzIGFzIGEgYmFkIElQIGFkZHJlc3MgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSB0b2FsbHkgYm9ndXMKICBhZGRyZXNzIHRoYXQgaXMgdGhlbiBwYXNzZWQgb24gYW5kIHVzZWQuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIG1hZGUgdGhlIGNvZGUgcHJvcGVybHkgdXNlIHRoZSB1Q2xpYmMncyB2ZXJzaW9uIG9mCiAgaW5ldF9udG9hX3IoKSB3aGVuIGJ1aWx0IHdpdGggaXQuCgotIEFkZGVkIHRlc3QgMjM3IGFuZCAyMzg6IHRlc3QgRVBTViBhbmQgUEFTViByZXNwb25zZSBoYW5kbGluZyB3aGVuIHRoZXkgZ2V0CiAgd2VsbC0gZm9ybWF0ZWQgZGF0YSBiYWNrIGJ1dCB1c2luZyBpbGxlZ2FsIHZhbHVlcy4gSW4gMjM3IFBBU1YgZ2V0cyBhbiBJUAogIGFkZHJlc3MgdGhhdCBpcyB3YXkgYmFkLiBJbiAyMzggRVBTViBnZXRzIGEgcG9ydCB0aGF0IGlzIHdheSBvdXQgb2YgcmFuZ2UuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDUpCi0gQWRkZWQgYSBmZXcgbWlzc2luZyBmZWF0dXJlcyB0byB0aGUgY3VybC1jb25maWcgLS1mZWF0dXJlcyBsaXN0CgotIE1vZGlmaWVkIHRlc3RjdXJsLnBsIHRvIG5vdyBvZmZlcgogIDEgLSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgYWxsIGluZm8gaXQgcHJldmlvdXNseSBvbmx5IHJlYWQgZnJvbQogICAgICBmaWxlOiAtLW5hbWUsIC0tZW1haWwsIC0tZGVzYyBhbmQgLS1jb25maWd1cmUKICAyIC0gLS1ub2N2c3VwIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRvIGRvIGN2cyB1cGRhdGUKICAzIC0gLS1jcm9zc2NvbXBpbGUgaW5mb3JtcyBpdCBhbmQgbWFrZXMgaXQgbm90IGF0dGVtcHQgdGhpbmdzIGl0IGNhbid0IGRvCgotIEZpeGVkIG51bWVyb3VzIHdpbjMyIGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBSZW1vdmVkIHRoZSBsaWIvc2VjdXJpdHkuaCBmaWxlIHNpbmNlIGl0IHNoYWRvd2VkIHRoZSBtaW5ndy93aW4zMiBoZWFkZXIKICB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggaXMgbmVlZGVkIGZvciBTU1BJIGJ1aWxkcy4gVGhlIGNvbnRlbnRzIG9mIHRoZQogIGZvcm1lciBzZWN1cml0eS5oIGlzIG5vdyBpIGtyYjQuaAoKLSBjb25maWd1cmUgLS1lbmFibGUtc3NwaSBub3cgZW5hYmxlcyBTU1BJIGluIHRoZSBidWlsZC4gSXQgb25seSB3b3JrcyBmb3IKICB3aW5kb3dzIGJ1aWxkcyAoaW5jbHVkaW5nIGNyb3NzLWNvbXBpbGVzIGZvciB3aW5kb3dzKS4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNSkKLSBEYXZpZCBIb3VsZGVyIGFkZGVkIC0tZm9ybS1zdHJpbmcgdGhhdCBhZGRzIHRoYXQgc3RyaW5nIHRvIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgcGFydCwgd2l0aG91dCBzcGVjaWFsIGNoYXJhY3RlcnMgaGF2aW5nIHNwZWNpYWwgbWVhbmluZ3MgZXRjIGxpa2UKICAtLWZvcm0gZmVhdHVyZXMuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSByZXR1cm5zIHRoZSBmZWF0dXJlIGJpdCBDVVJMX1ZFUlNJT05fU1NQSSBpZiBpdCB3YXMKICBidWlsdCB3aXRoIFNTUEkgc3VwcG9ydC4KCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIG1hZGUgaXQgcG9zc2libGUgdG8gYnVpbGQgbGliY3VybCB3aXRoIHRoZQogIFVTRV9XSU5ET1dTX1NTUEkgb24gV2luZG93cywgYW5kIHRoZW4gbGliY3VybCB3aWxsIGJlIGJ1aWx0IHRvIHVzZSB0aGUKICBuYXRpdmUgd2F5IHRvIGRvIE5UTE0uIFNTUEkgYWxzbyBhbGxvd3MgbGliY3VybCB0byBwYXNzIG9uIHRoZSBjdXJyZW50IHVzZXIKICBhbmQgaXRzIHBhc3N3b3JkIGluIHRoZSByZXF1ZXN0LgoKRGFuaWVsICg5IE1hcmNoIDIwMDUpCi0gRGFuIEYgaW1wcm92ZWQgdGhlIFNTTCBsaWIgc2V0dXAgaW4gY29uZmlndXJlLgoKLSBOb2RhayBTb2RhayByZXBvcnRlZCBhIGNyYXNoIHdoZW4gdXNpbmcgYSBTT0NLUzQgcHJveHkuCgotIEplYW4tTWFyYyBSYW5nZXIgcG9pbnRlZCBvdXQgYW4gZW1iYXJhc3NpbmcgZGVidWcgcHJpbnRmKCkgbGVmdG92ZXIgaW4gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGNvZGUuCgotIEFkanVzdGVkIHRoZSBtYW4gcGFnZSBmb3IgdGhlIGN1cmxfZ2V0ZGF0ZSgpIHJldHVybiB2YWx1ZSBmb3IgZGF0ZXMgYWZ0ZXIKICB5ZWFyIDIwMzguIEZvciAzMiBiaXQgdGltZV90IGl0IHJldHVybnMgMHg3ZmZmZmZmZiBidXQgZm9yIDY0Yml0IHRpbWVfdCBpdAogIHJldHVybnMgZWl0aGVyIHRoZSBjb3JyZWN0IHZhbHVlIG9yIGV2ZW4gLTEgb24gc29tZSBzeXN0ZW1zIHRoYXQgc3RpbGwgc2VlbQogIHRvIG5vdCBkZWFsIHdpdGggdGhpcyBwcm9wZXJseS4gVG9yIEFybnRzZW4gZm91bmQgYSA2NGJpdCBBSVggc3lzdGVtIGZvciB1cwogIHRoYXQgZGlkIHRoZSBsYXR0ZXIuIEd3ZW5vbGUgQmVhdWNoZXNuZSdzIE1hbmRyYWtlIHBhdGNoIHB1dCB0aGUgbGlnaHRzIG9uCiAgdGhpcyBwcm9ibGVtIGluIHRoZSBmaXJzdCBwbGFjZS4KCkRhbmllbCAoOCBNYXJjaCAyMDA1KQotIERvbWluaWNrIE1lZ2xpbyByZXBvcnRlZCB0aGF0IHVzaW5nIENVUkxPUFRfRklMRVRJTUUgd2hlbiB0cmFuc2ZlcnJpbmcgYSBGVFAKICBmaWxlIGdvdCBhIExhc3QtTW9kaWZpZWQ6IGhlYWRlciB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSwgY29ycnVwdGluZyB0aGUKICBhY3R1YWwgZGF0YS4gVGhpcyB3YXMgYmVjYXVzZSBzb21lIGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJldmlvdXMgRlRQIGNvZGUgd2FzCiAgbm90IHByb3Blcmx5IGJyb3VnaHQgaW50byB0aGUgbmV3IEZUUCBjb2RlLiBJIGZpeGVkIGFuZCBJIGFkZGVkIHRlc3QgY2FzZQogIDUyMCB0byB2ZXJpZnkuIChUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiA3LjEzLjEpCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgY29uZmlndXJlIC0td2l0aC16bGliIG9wdGlvbiB0byBhbHdheXMgY29uc2lkZXIgdGhlCiAgZ2l2ZW4gcGF0aCBiZWZvcmUgYW55IHN0YW5kYXJkIHBhdGhzLgoKRGFuaWVsICg2IE1hcmNoIDIwMDUpCi0gUmFuZHkgTWNNdXJjaHkgd2FzIHRoZSBmaXJzdCB0byByZXBvcnQgdGhhdCB2YWxncmluZC5wbSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIHJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyAnbWFrZSB0ZXN0JyBmYWlscy4KCkRhbmllbCAoNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBhZGRlZCBIQVZFX0ZUUlVOQ0FURSB0byBzZXZlcmFsIGNvbmZpZy0qLmggZmlsZXMuCgotIEFkZGVkIHRlc3QgY2FzZSAyMzUgdGhhdCBtYWtlcyBhIHJlc3VtZWQgdXBsb2FkIG9mIGEgZmlsZSB0aGF0IGlzbid0IHByZXNlbnQKICBvbiB0aGUgcmVtb3RlIHNpZGUuIFRoaXMgdGhlbiBjb252ZXJ0cyB0aGUgb3BlcmF0aW9uIHRvIGFuIG9yZGluYXJ5IFNUT1IKICB1cGxvYWQuIFRoaXMgd2FzIHJlcXVlc3RlZC9wb2ludGVkIG91dCBieSBJZ25hY2lvIFZhenF1ZXotQWJyYW1zLgoKICBJdCBhbHNvIHByb3ZlZCAoYW5kIEkgZml4ZWQpIGEgYnVnIGluIHRoZSBuZXdseSByZXdyaXR0ZW4gZnRwIGNvZGUgKGFuZAogIHByZXNlbnQgaW4gdGhlIDcuMTMuMSByZWxlYXNlKSB3aGVuIHRyeWluZyB0byByZXN1bWUgYW4gdXBsb2FkIGFuZCB0aGUKICBzZXJ2ZXJzIHJldHVybnMgYW4gZXJyb3IgdG8gdGhlIFNJWkUgY29tbWFuZC4gbGliY3VybCB0aGVuIGxvb3BzIGFuZCBzZW5kcwogIFNJWkUgY29tbWFuZHMgaW5maW5pdGVseS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgU1NMIHByb2JsZW0gaW50cm9kdWNlZCBvbiBGZWJydWFyeSA5dGggdGhhdCBtYWRlCiAgbGliY3VybCBhdHRlbXB0IHRvIGxvYWQgdGhlIHdob2xlIHJhbmRvbSBmaWxlIHRvIHNlZWQgdGhlIFBSTkcuIFRoaXMgaXMKICByZWFsbHkgYmFkIHNpbmNlIHRoaXMgdHVybnMgb3V0IHRvIGJlIHVzaW5nIC9kZXYvdXJhbmRvbSBhdCB0aW1lcy4uLgoKVmVyc2lvbiA3LjEzLjEgKDQgTWFyY2ggMjAwNSkKCkRhbmllbCAoNCBNYXJjaCAyMDA1KQotIERhdmUgRHJpYmluIG1hZGUgaXQgcG9zc2libGUgdG8gc2V0IENVUkxPUFRfQ09PS0lFRklMRSB0byAiIiB0byBhY3RpdmF0ZQogIHRoZSBjb29raWUgImVuZ2luZSIgd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbiBlbXB0eSBvciBub24tZXhpc3RpbmcgZmlsZS4KCi0gUmVuZSBSZWJlIGZpeGVkIGEgLSMgY3Jhc2ggd2hlbiBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCB3YXMgcmV0cmlldmVkLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA1KQotIE5UTE0gYW5kIGZ0cC1rcmI0IGJ1ZmZlciBvdmVyZmxvdyBmaXhlZCwgYXMgcmVwb3J0ZWQgaGVyZToKICBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2FyY2hpdmUvMS8zOTEwNDIgYW5kIHRoZSBDQU4gcmVwb3J0IGhlcmU6CiAgaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNBTi0yMDA1LTA0OTAKCiAgSWYgdGhlc2Ugc2VjdXJpdHkgZ3V5cyB3ZXJlIHNlcmlvdXMsIHdlJ2QgYmVlbiBub3RpZmllZCBpbiBhZHZhbmNlIGFuZCB3ZQogIGNvdWxkJ3ZlIHNhdmVkIGEgZmV3IG9mIHlvdSBhIGxpdHRsZSBzdXJwcmlzZSwgYnV0IG5vdyB3ZSB3ZXJlbid0LgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA1KQotIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkIGEgZmxhdyB3aGVuIHlvdSB1c2VkIGEgcHJveHkgd2l0aCBhdXRoLCBhbmQgeW91CiAgcmVxdWVzdGVkIGRhdGEgZnJvbSBhIGhvc3QgYW5kIHRoZW4gZm9sbG93ZWQgYSByZWRpcmVjdCB0byBhbm90aGVyCiAgaG9zdC4gbGliY3VybCB0aGVuIGRpZG4ndCB1c2UgdGhlIHByb3h5LWF1dGggcHJvcGVybHkgaW4gdGhlIHNlY29uZCByZXF1ZXN0LAogIGR1ZSB0byB0aGUgaG9zdC1vbmx5IGNoZWNrIGZvciBvcmlnaW5hbCBob3N0IG5hbWUgd3JvbmdseSBiZWluZyBleHRlbmRlZCB0bwogIHRoZSBwcm94eSBhdXRoIGFzIHdlbGwuIEFkZGVkIHRlc3QgY2FzZSAyMzMgdG8gdmVyaWZ5IHRoZSBmbGF3IGFuZCB0aGF0IHRoZQogIGZpeCByZW1vdmVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA1KQotIE1pa2UgRG9iYnMgcmVwb3J0ZWQgYSBtaW5ndyBidWlsZCBmYWlsdXJlIGR1ZSB0byB0aGUgbGFjayBvZgogIEJVSUxESU5HX0xJQkNVUkwgYmVpbmcgZGVmaW5lZCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQuIE5vdyB0aGlzIGlzIGRlZmluZWQgYnkKICBjb25maWd1cmUgd2hlbiBtaW5ndyBpcyB1c2VkLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA1KQotIERhdmlkIGluIGJ1ZyByZXBvcnQgIzExMjQ1ODggZm91bmQgYW5kIGZpeGVkIGEgc29ja2V0IGxlYWsgd2hlbiBsaWJjdXJsCiAgZGlkbid0IGNsb3NlIHRoZSBzb2NrZXQgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgZXJyb3IgZHVlIHRvIGZhaWxpbmcKICBsb2NhbGJpbmQKCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggSFRUUC1QT1NUaW5nIHVzaW5nICJhbnlhdXRoIgogIHRoYXQgcGlja3MgTlRMTS4gVGhhbmtzIHRvIERhdmlkIEJ5cm9uIGxldHRpbmcgbWUgdGVzdCBOVExNIGFnYWluc3QgaGlzCiAgc2VydmVycywgSSBjb3VsZCBxdWlja2x5IHJlcGVhdCBhbmQgZml4IHRoZSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IHRvIGJlOgoKICBXaGVuIGxpYmN1cmwgUE9TVHMgd2l0aG91dCBrbm93aW5nL3VzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCBnZXRzIGJhY2sKICBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB3aGljaCBpdCBwaWNrcyBOVExNLCBpdCBuZWVkcyB0byBlaXRoZXIgY29udGludWUKICBzZW5kaW5nIGl0cyBkYXRhIGlmIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIGFsaXZlLCBvciBub3Qgc2VuZCB0aGUgZGF0YSBidXQKICBjbG9zZSB0aGUgY29ubmVjdGlvbi4gVGhlbiBkbyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgTlRMTSBhdXRoLiBsaWJjdXJsCiAgZGlkbid0IHNlbmQgdGhlIGRhdGEgbm9yIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJ1dCBzaW1wbHkgcmVhZCB0aGUKICByZXNwb25zZS1ib2R5IGFuZCB0aGVuIHNlbnQgdGhlIGZpcnN0IG5lZ290aWF0aW9uIHN0ZXAuIFdoaWNoIHRoZW4gZmFpbGVkCiAgbWlzZXJhYmx5IG9mIGNvdXJzZS4gVGhlIGZpeGVkIHZlcnNpb24gZm9yY2VzIGEgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBtb3JlCiAgdGhhbiAyMDAwIGJ5dGVzIGxlZnQgdG8gc2VuZC4KCkRhbmllbCAoMTQgRmVicnVhcnkgMjAwNSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHNvIGl0CiAgd2FzIG5ldmVyIHVzZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDUpCi0gUmVtb3ZlZCBhbGwgdXNlcyBvZiBzdHJmdGltZSgpIHNpbmNlIGl0IHVzZXMgdGhlIGxvY2FsaXNlZCB2ZXJzaW9uIG9mIHRoZQogIHdlZWsgZGF5IG5hbWVzIGFuZCBtb250aCBuYW1lcyBhbmQgc2VydmVycyBkb24ndCBsaWtlIHRoYXQuCgpEYW5pZWwgKDEwIEZlYnJ1YXJ5IDIwMDUpCi0gTm93IHRoZSB0ZXN0IHNjcmlwdCBkaXNhYmxlcyB2YWxncmluZC10ZXN0aW5nIHdoZW4gdGhlIHRlc3Qgc3VpdGUgcnVucyBpZgogIGxpYmN1cmwgaXMgYnVpbHQgc2hhcmVkLiBPdGhlcndpc2UgdmFsZ3JpbmQgb25seSB0ZXN0cyB0aGUgc2hlbGwgdGhhdCBydW5zCiAgdGhlIHdyYXBwZXItc2NyaXB0IG5hbWVkICdjdXJsJyB0aGF0IGlzIGEgZnJvbnQtZW5kIHRvIGN1cmwgaW4gdGhpcyBjYXNlLgogIFRoaXMgc2hvdWxkIGFsc28gZml4IHRoZSBodWdlIGFtb3VudCBvZiByZXBvcnRzIG9mIGZhbHNlIHBvc2l0aXZlcyB3aGVuCiAgdmFsZ3JpbmQgaGFzIGlkZW50aWZpZWQgbGVha3MgaW4gKGJhKXNoIGFuZCBub3QgaW4gY3VybCBhbmQgcGVvcGxlIHJlcG9ydAogIHRoYXQgYXMgY3VybCBidWdzLiBCdWcgcmVwb3J0ICMxMTE2NjcyIGlzIG9uZSBleGFtcGxlLgoKICBBbHNvLCB0aGUgdmFsZ3JpbmQgcmVwb3J0IHBhcnNlciBoYXMgYmVlbiBhZGFwdGVkIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lCiAgb2YgdGhlIHNvdXJjZXMgaW4gYSBzdGFjayBzdHJhY2UgaXMgb25lIG9mIChsaWIpY3VybCdzIHNvdXJjZSBmaWxlcyBvcgogIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvYmxlbSB0byBjb25jZXJuIChsaWIpY3VybC4KCi0gTWFydHkgS3VocnQgc3RyZWFtbGluZWQgdGhlIFZNUyBidWlsZC4KCkRhbmllbCAoOSBGZWJydWFyeSAyMDA1KQotIERhdmlkIEJ5cm9uIGZpeGVkIGhpcyBTU0wgcHJvYmxlbXMsIGluaXRpYWxseSBtZW50aW9uZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDEvMDI0MC5odG1sLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCB1c2UKICBTU0xfcGVuZGluZygpIGFzIHdlIHNob3VsZC4KCi0gQ29udmVydGVkIGxvdHMgb2YgRlRQIGNvZGUgdG8gYSBzdGF0ZW1hY2hpbmUsIHNvIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZQogIGRvZXNuJ3QgYmxvY2sgd2hpbGUgY29tbXVuaWNhdGluZyBjb21tYW5kcy1yZXNwb25zZXMgd2l0aCBhbiBGVFAgc2VydmVyLgoKICBJJ3ZlIGFkZGVkIGEgY29tbWVudCBsaWtlIEJMT0NLSU5HIGluIHRoZSBjb2RlIG9uIGFsbCBzcG90cyBJIGNvdWxkIGZpbmQKICB3aGVyZSB3ZSBzdGlsbCBoYXZlIGJsb2NraW5nIG9wZXJhdGlvbnMuIFdoZW4gd2UgY2hhbmdlIGN1cmxfZWFzeV9wZXJmb3JtKCkKICB0byB1c2UgdGhlIG11bHRpIGludGVyZmFjZSwgd2UnbGwgYWxzbyBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIHNpbmNlCiAgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSAiaW50ZXJuYWwgaW50ZXJmYWNlIi4KCiAgV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgbWFkZSBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCBzZXBhcmF0ZSBmcm9tIHRoZQogIG5ldyBDVVJMRV9MT0dJTl9ERU5JRUQuIFRoZSBmaXJzdCBvbmUgaXMgbm93IGFjY2VzcyBkZW5pZWQgdG8gYSBmdW5jdGlvbiwKICBsaWtlIGNoYW5naW5nIGRpcmVjdG9yeSBvciByZXRyaWV2aW5nIGEgZmlsZSwgd2hpbGUgdGhlIHNlY29uZCBtZWFucyB0aGF0IHdlCiAgd2VyZSBkZW5pZWQgbG9naW4uCgogIFRoZSBDVlMgdGFnICdiZWZvcmVfZnRwX3N0YXRlbWFjaGluZScgd2FzIHNldCBqdXN0IGJlZm9yZSB0aGlzIHdlbnQgaW4sIGluCiAgY2FzZSBvZiBmdXR1cmUgbmVlZC4KCi0gR2lzbGUgbWFkZSB0aGUgRElDVCBjb2RlIHNlbmQgQ1JMRiBhbmQgbm90IGp1c3QgTEYgYXMgdGhlIHNwZWMgc2F5cyBzby4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA1KQotIEdpc2xlIGZpeGVkIHByb2JsZW1zIHdoZW4gbGliY3VybCBydW5zIG91dCBvZiBtZW1vcnksIGFuZCB3b3JrZWQgb24gbWFraW5nCiAgc3VyZSB0aGUgcHJvcGVyIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgZm9yIHRob3NlIG9jY2F0aW9ucy4KCkRhbmllbCAoNyBGZWJydWFyeSAyMDA1KQotIE1hcnVrbyBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBpbmZsYXRlIGRlY29tcHJlc3NpbmcgZXhhY3RseSA2NEsKICBjb250ZW50cy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA1KQotIEVyaWMgVmVyZ25hdWQgZm91bmQgYSB1c2Ugb2YgYW4gdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiB0aGUgZnRwIHdoZW4gZG9pbmcKICBQT1JUIG9uIGlwdjYtZW5hYmxlZCBob3N0cy4KCi0gRGF2aWQgQnlyb24gcG9pbnRlZCBvdXQgd2UgY291bGQgdXNlIEJVRlNJWkUgdG8gcmVhZCBkYXRhIChpbgogIGxpYi90cmFuc2Zlci5jKSBpbnN0ZWFkIG9mIHVzaW5nIEJVRlNJWkUgLTEuCgpWZXJzaW9uIDcuMTMuMCAoMSBGZWJydWFyeSAyMDA1KQoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTGFycyBOaWxzc29uJ3MgaHRtbHRpdGxlLmNjIGV4YW1wbGUKCkRhbmllbCAoMzAgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgRE8gb3BlcmF0aW9uCiAgZmFpbGVkIChhcyBpbiB0ZXN0IGNhc2UgMjA1KS4KCi0gRml4ZWQgYSB2YWxncmluZCB3YXJuaW5nIGZvciBmaWxlOi8vIG9wZXJhdGlvbnMuCgotIEZpeGVkIGEgdmFsZ3JpbmQgcmVwb3J0IGluIHRoZSB1cmwgZ2xvYmJpbmcgY29kZSBmb3IgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbC4KCi0gQnVnZml4ZWQgdGhlIHBhcnNlciB0aGF0IHNjYW5zIHRoZSB2YWxncmluZCByZXBvcnQgb3V0cHV0cyAoaW4gcnVudGVzdHMucGwpLgogIEkgbm90aWNlZCB0aGF0IGl0IHByZXZpb3VzbHkgZGlkbid0IGRldGVjdCBhbmQgcmVwb3J0IHRoZSAiQ29uZGl0aW9uYWwganVtcAogIG9yIG1vdmUgZGVwZW5kcyBvbiB1bmluaXRpYWxpc2VkIHZhbHVlKHMpIiBlcnJvci4gV2hlbiBJIGZpeGVkIHRoaXMsIEkKICBjYXVnaHQgYSBmZXcgY3VybCBidWdzIHdpdGggaXQuIEFuZCB0aGVuIEkgaGFkIHRvIHNwZW5kIHRpbWUgdG8gbWFrZSB0aGUKICB0ZXN0IHN1aXRlIElHTk9SRSB0aGVzZSBlcnJvcnMgd2hlbiBPcGVuU1NMIGlzIHVzZWQgc2luY2UgaXQgcHJvZHVjZSBtYXNzaXZlCiAgYW1vdW50cyBvZiB2YWxncmluZCB3YXJuaW5ncyAoYnV0IG9ubHkgb2YgdGhlICJDb25kaXRpb25hbC4uLiIga2luZCBpdAogIHNlZW1zKS4gU28sIGlmIGEgdGVzdCB0aGF0IHJlcXVpcmVzIFNTTCBpcyBydW4sIGl0IGlnbm9yZXMgdGhlCiAgIkNvbmRpdGlvbmFsLi4uIiBlcnJvcnMsIGFuZCB5b3UnbGwgZ2V0IGEgInZhbGdyaW5kIFBBUlRJQUwiIG91dHB1dCBpbnN0ZWFkCiAgb2YgInZhbGdyaW5kIE9LIi4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA1KQotIFVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UsIGFuZCBkb2luZyBhIHJlcXVzdGVkIGEgcmUtdXNlZCBjb25uZWN0aW9uIHRoYXQKICBnZXRzIGNsb3NlZCBqdXN0IGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgZmFpbGVkIGFuZCBkaWQgbm90IHJlLWlzc3VlCiAgYSByZXF1ZXN0IG9uIGEgZnJlc2ggcmVjb25uZWN0IGxpa2UgdGhlIGVhc3kgaW50ZXJmYWNlIGRpZC4gTm93IGl0IGRvZXMhCgotIERlZmluZSBDVVJMX01VTFRJRUFTWSB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgKGxpYi9lYXN5LmMgdG8gYmUgZXhhY3QpLCB0byB1c2UKICBteSBuZXcgY3VybF9lYXN5X3BlcmZvcm0oKSB0aGF0IHVzZXMgdGhlIG11bHRpIGludGVyZmFjZSB0byBydW4gdGhlCiAgcmVxdWVzdC4gSXQgaXMgYSBncmVhdCB0ZXN0YmVkIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBJIGJlbGlldmUgd2UKICBzaGFsbCBkbyBpdCB0aGlzIHdheSBmb3IgcmVhbCBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgaGF2ZSBhIHN1Y2Nlc3NvciB0bwogIGN1cmxfbXVsdGlfZmRzZXQoKS4gSSd2ZSB1c2VkIHRoaXMgYXBwcm9hY2ggdG8gZGV0ZWN0IGFuZCBmaXggc2V2ZXJhbCBvZiB0aGUKICByZWNlbnQgbXVsdGktaW50ZXJmYWNlcyBpc3N1ZXMuCgotIEFkanVzdGVkIHRoZSBLTk9XTl9CVUdTICMxNyBmaXggYSBiaXQgbW9yZSBzaW5jZSB0aGUgRlRQIGNvZGUgYWxzbyBkaWQgc29tZQogIGJhZCBhc3N1bXB0aW9ucy4KCi0gbXVsdGkgaW50ZXJmYWNlOiB3aGVuIGEgcmVxdWVzdCBpcyBkZW5pZWQgZHVlIHRvICJNYXhpbXVtIHJlZGlyZWN0cwogIGZvbGxvd2VkIiBsaWJjdXJsIGxlYWtlZCB0aGUgbGFzdCBMb2NhdGlvbjogVVJMLgoKLSBDb25uZWN0IGZhaWx1cmVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3YXMgb2Z0ZW4gcmV0dXJuZWQgYXMgImNvbm5lY3QoKQogIHRpbWVkIG91dCIgZXZlbiB0aG91Z2ggdGhlIHJlYXNvbiB3YXMgZGlmZmVyZW50LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDUpCi0gS05PV05fQlVHUyAjMTcgZml4ZWQuIEEgRE5TIGNhY2hlIGVudHJ5IG1heSBub3QgcmVtYWluIGxvY2tlZCBiZXR3ZWVuIHR3bwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgaW52b2tlcy4gSXQgd2FzIHByZXZpb3VzbHkgdW5sb2NrZWQgYXQgZGlzY29ubmVjdCwgd2hpY2gKICBjb3VsZCBtZWFuIHRoYXQgaXQgcmVtYWluZWQgbG9ja2VkIGJldHdlZW4gbXVsdGlwbGUgdHJhbnNmZXJzLiBUaGUgRE5TIGNhY2hlCiAgbWF5IG5vdCBsaXZlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gY2FjaGUgZG9lcywgYXMgdGhleSBhcmUgc2VwYXJhdGUuCgogIFRvIGRlYWwgd2l0aCB0aGUgbGFjayBvZiBETlMgKGhvc3QgYWRkcmVzcykgZGF0YSBhdmFpbGFiaWxpdHkgaW4gcmUtdXNlZAogIGNvbm5lY3Rpb25zLCBsaWJjdXJsIG5vdyBrZWVwcyBhIGNvcHkgb2YgdGhlIElQIGFkcmVzcyBhcyBhIHN0cmluZywgdG8gYmUKICBhYmxlIHRvIHNob3cgaXQgZXZlbiBvbiBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uCgogIFRoZSBwcm9ibGVtIGNvdWxkIGJlIG1hZGUgdG8gYXBwZWFyIHdpdGggdGhpcyBzdHVudDoKCiAgMS4gY3JlYXRlIGEgbXVsdGkgaGFuZGxlCiAgMi4gYWRkIGFuIGVhc3kgaGFuZGxlCiAgMy4gZmV0Y2ggYSBVUkwgdGhhdCBpcyBwZXJzaXN0ZW50IChsZWF2ZXMgdGhlIGNvbm5lY3Rpb24gYWxpdmUpCiAgNC4gcmVtb3ZlIHRoZSBlYXN5IGhhbmRsZSBmcm9tIHRoZSBtdWx0aQogIDUuIGtpbGwgdGhlIG11bHRpIGhhbmRsZQogIDYuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDcuIGFkZCB0aGUgc2FtZSBlYXN5IGhhbmRsZSB0byB0aGUgbmV3IG11bHRpIGhhbmRsZQogIDguIGZldGNoIGEgVVJMIGZyb20gdGhlIHNhbWUgc2VydmVyIGFzIGJlZm9yZSAocmUtdXNpbmcgdGhlIGNvbm5lY3Rpb24pCgotIFN0ZXBoZW4gTW9yZSBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfRlRQUE9SVCBhbmQgdGhlIC1QIG9wdGlvbiBkaWRuJ3Qgd29yawogIHdoZW4gYnVpbHQgaXB2Ni1lbmFibGVkLiBJJ3ZlIG5vdyBtYWRlIGEgZml4IGZvciBpdC4gV3JpdGluZyB0ZXN0IGNhc2VzIGZvcgogIGN1c3RvbSBwb3J0IGhvc3RzIHR1cm5lZCB0b28gdHJpY2t5IHNvIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBub25lLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDUpCi0gSWFuIEZvcmQgYXNrZWQgYWJvdXQgc3VwcG9ydCBmb3IgdGhlIEZUUCBjb21tYW5kIEFDQ1QsIGFuZCBJIGRpc2NvdmVyZWQgaXQKICBpcyBwcmVzZW50IGluIFJGQzk1OS4uLiBzbyBub3cgKGxpYiljdXJsIHN1cHBvcnRzIGl0IGFzIHdlbGwuIC0tZnRwLWFjY291bnQKICBhbmQgQ1VSTE9QVF9GVFBfQUNDT1VOVCBzZXQgdGhlIGFjY291bnQgc3RyaW5nLiAoVGhlIHNlcnZlciBtYXkgYXNrIGZvciBhbgogIGFjY291bnQgc3RyaW5nIGFmdGVyIFBBU1MgaGF2ZSBiZWVuIHNlbnQgYXdheS4gVGhlIGNsaWVudCByZXNwb25kcwogIHdpdGggIkFDQ1QgW2FjY291bnQgc3RyaW5nXSIuKSBBZGRlZCB0ZXN0IGNhc2UgMjI4IGFuZCAyMjkgdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuIFVwZGF0ZWQgdGhlIHRlc3QgRlRQIHNlcnZlciB0byBzdXBwb3J0IEFDQ1Qgc29tZXdoYXQuCgotIERhdmlkIFNoYXcgY29udHJpYnV0ZWQgYSBmYWlybHkgY29tcGxldGUgYW5kIGRldGFpbGVkIGF1dG9jb25mIHRlc3QgeW91IGNhbgogIHVzZSB0byBkZXRlY3QgbGliY3VybCBhbmQgc2V0dXAgdmFyaWFibGVzIGZvciB0aGUgcHJvdG9jb2xzIHRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHN1cHBvcnRzOiBkb2NzL2xpYmN1cmwvbGliY3VybC5tNAoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDUpCi0gTWFqb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVyIG92ZXJoYXVsLgoKICBUaGVzZSBmb3VyIG9wdGlvbnMgYXJlIG5vdyBvYnNvbGV0ZTogQ1VSTE9QVF9TT1VSQ0VfSE9TVCwKICBDVVJMT1BUX1NPVVJDRV9QQVRILCBDVVJMT1BUX1NPVVJDRV9QT1JUICh0aGlzIG9wdGlvbiBkaWRuJ3Qgd29yayBiZWZvcmUpCiAgYW5kIENVUkxPUFRfUEFTVl9IT1NULgoKICBUaGVzZSB0d28gb3B0aW9ucyBhcmUgYWRkZWQ6IENVUkxPUFRfU09VUkNFX1VSTCBhbmQgQ1VSTE9QVF9TT1VSQ0VfUVVPVEUuCgogIFRoZSB0YXJnZXQtc2lkZSBkaWRuJ3QgdXNlIHRoZSBwcm9wZXIgcGF0aCB3aXRoIFJFVFIsIGFuZCB0aHVzIHRoaXMgb25seQogIHdvcmtlZCBjb3JyZWN0bHkgaW4gdGhlIGxvZ2luIHBhdGggKGkuZSB3aXRob3V0IGRvaW5nIGFueSBDV0QpLiBUaGUgc291cmNlLQogIHNpZGUgc3RpbGwgdXNlcyBhIHdyb25nIHBhdGgsIGJ1dCB0aGUgZml4IGZvciB0aGlzIHdpbGwgbmVlZCB0byB3YWl0LiBWZXJpZnkKICB0aGUgZmxhdyBieSB1c2luZyBhIHNvdXJjZSBVUkwgd2l0aCBpbmNsdWRlZCAlWFgtY29kZXMuCgogIE1hZGUgQ1VSTE9QVF9GVFBQT1JUIGNvbnRyb2wgd2VhdGhlciB0aGUgdGFyZ2V0IG9wZXJhdGlvbiBzaG91bGQgdXNlIFBPUlQKICAob3Igbm90KS4gVGhlIG90aGVyIHNpZGUgdGh1cyB1c2VzIHBhc3NpdmUgKFBBU1YpIG1vZGUuCgogIFVwZGF0ZWQgdGhlIGZ0cDNyZHBhcnR5LmMgZXhhbXBsZSBzb3VyY2UgdG8gdXNlIHRoZSB1cGRhdGVkIG9wdGlvbnMuCgogIEFkZGVkIHN1cHBvcnQgZm9yIGEgc2Vjb25kIEZUUCBzZXJ2ZXIgaW4gdGhlIHRlc3Qgc3VpdGUuIE5hbWVkLi4uIGZ0cDIuCiAgQWRkZWQgdGVzdCBjYXNlcyAyMzAsIDIzMSBhbmQgMjMyIGFzIGEgZmV3IGZpcnN0IGJhc2ljIHRlc3RzIG9mIHZlcnkgc2ltcGxlCiAgM3JkIHBhcnR5IHRyYW5zZmVycy4KCiAgQ2hhbmdlZCB0aGUgZGVidWcgb3V0cHV0IHRvIGluY2x1ZGUgJ3RhcmdldCcgYW5kICdzb3VyY2UnIHdoZW4gYSAzcmQgcGFydHkKICBpcyBiZWluZyBtYWRlLCB0byBtYWtlIGl0IGNsZWFyZXIgd2hhdCBjb21tYW5kcy9yZXNwb25zZXMgY2FtZSBvbiB3aGF0CiAgY29ubmVjdGlvbi4KCiAgQWRkZWQgdGhyZWUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtLTNwLXVybCwgLS0zcC11c2VyIGFuZCAtLTNwLXF1b3RlLgoKICBEb2N1bWVudGVkIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlIGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyByZWxhdGVkCiAgdG8gdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKICAoVGVtcG9yYXJpbHkpIGRpc2FibGVkIHRoZSBhYmlsaXR5IHRvIHJlLXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIGZvciB0aGUKICBzb3VyY2UgY29ubmVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIGl0IG5lZWRzIHRvIGZvcmNlIGEgbmV3IGluIGNhc2UgdGhlCiAgc291cmNlIGFuZCB0YXJnZXQgaXMgdGhlIHNhbWUgaG9zdCwgYW5kIHRoZSBob3N0IG5hbWUgY2hlY2sgaXMgdHJpY2tpZXIgbm93CiAgd2hlbiB0aGUgc291cmNlIGlzIGlkZW50aWZpZWQgd2l0aCBhIGZ1bGwgVVJMIGluc3RlYWQgb2YgYSBwbGFpbiBob3N0IG5hbWUKICBsaWtlIGJlZm9yZS4KCiAgVE9ETyAoc2hvcnQtdGVybSkgZm9yIDNyZCBwYXJ0eSB0cmFuc2ZlcnM6IHF1b3RlIHN1cHBvcnQuIFRoZSBvcHRpb25zIGFyZQogIHRoZXJlLCB3ZSBuZWVkIHRvIGFkZCB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB0aGVpciBmdW5jdGlvbmFsaXR5LgoKICBUT0RPIChsb25nLXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBJUHY2IHN1cHBvcnQgKEVQUlQgYW5kIEVQU1YgZXRjKQogIGFuZCBTU0wvVFNMIHN1cHBvcnQuCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNSkKLSBQaGlsaXBwZSBIYW1lYXUgZm91bmQgb3V0IHRoYXQgLVEgIitbY29tbWFuZF0iIGRpZG4ndCB3b3JrLCBhbHRob3VnaCBzb21lCiAgY29kZSB3YXMgd3JpdHRlbiBmb3IgaXQuIEkgZml4ZWQgYW5kIGFkZGVkIHRlc3QgY2FzZSAyMjcgdG8gdmVyaWZ5IGl0LgogIFRoZSBjdXJsLjEgbWFuIHBhZ2UgZGlkbid0IG1lbnRpb24gdGhlICcrJyBzbyBJIGFkZGVkIGl0LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDUpCi0gU3RlcGhhbiBCZXJnbWFubiBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQgaWYgYW4gRlRQIFVSTAogIGNvbnRhaW5zICUwYSBvciAlMGQgaW4gdGhlIHVzZXIsIHBhc3N3b3JkIG9yIENXRCBwYXJ0cy4gKEEgZnV0dXJlIGZpeCB3b3VsZAogIGluY2x1ZGUgZG9pbmcgaXQgZm9yICUwMCBhcyB3ZWxsIC0gc2VlIEtOT1dOX0JVR1MgZm9yIGRldGFpbHMuKSBUZXN0IGNhc2UKICAyMjUgYW5kIDIyNiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGlzCgotIFN0ZXBoYW4gQmVyZ21hbm4gcG9pbnRlZCBvdXQgdHdvIGZsYXdzIGluIGxpYmN1cmwgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGVkOgoKICAxKSB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdGlsbCByZWFkIGFuZCB1c2VkIHRvIHNldCBIVFRQIHByb3h5CgogIDIpIHlvdSBjb3VsZG4ndCBkaXNhYmxlIGh0dHAgcHJveHkgd2l0aCBDVVJMT1BUX1BST1hZIChzaW5jZSB0aGUgb3B0aW9uIHdhcwogICAgIGRpc2FibGVkKS4gVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgYXBwcyBtYXkgd2FudCB0byBkaXNhYmxlIEhUVFAgcHJveHkKICAgICB3aXRob3V0IGFjdHVhbGx5IGtub3dpbmcgaWYgbGliY3VybCB3YXMgYnVpbHQgdG8gZGlzYWJsZSBIVFRQIG9yIG5vdC4KCiAgQmFzZWQgb24gU3RlcGhhbidzIHBhdGNoLCBib3RoIHRoZXNlIGlzc3VlcyBzaG91bGQgbm93IGJlIGZpeGVkLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDUpCi0gQ29keSBKb25lcycgZW5oYW5jZWQgdmVyc2lvbiBvZiBTYW11ZWwgRO1heiBHYXJj7WEncyBNU1ZDIG1ha2VmaWxlIHBhdGNoIHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNSkKLSBBbGV4IGFrYSBXaW5kRWFnbGUgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGRvaW5nICJjdXJsIC12IGRpY3Rpb25hcnkuY29tIiwgY3VybAogIGFzc3VtZWQgdGhpcyB1c2VkIHRoZSBESUNUIHByb3RvY29sLiBXaGlsZSBndWVzc2luZyBwcm90b2NvbHMgd2lsbCByZW1haW4KICBmdXp6eSwgSSd2ZSBub3cgbWFkZSBzdXJlIHRoYXQgdGhlIGhvc3QgbmFtZXMgbXVzdCBzdGFydCB3aXRoICJbcHJvdG9jb2xdLiIKICBmb3IgdGhlbSB0byBiZSBhIHZhbGlkIGd1ZXNzYWJsZSBuYW1lLiBJIGFsc28gcmVtb3ZlZCAiaHR0cHMiIGFzIGEgcHJlZml4CiAgdGhhdCBpbmRpY2F0ZXMgSFRUUFMsIHNpbmNlIHdlIGhhcmRseSBldmVyIHNlZSBhbnkgaG9zdCBuYW1lcyB1c2luZyB0aGF0LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDUpCi0gSW5zcGlyZWQgYnkgTWFydGlqbiBLb3N0ZXIncyBwYXRjaCBhbmQgZXhhbXBsZSBzb3VyY2UgYXQKICBodHRwOi8vd3d3LmdyZWVuaGlsbHMuY28udWsvbWFrL2dlbnRvby9jdXJsLWVpbnRyLWJ1Zy5jLCBJIG5vdyBtYWRlIHRoZQogIHNlbGVjdCgpIGFuZCBwb2xsKCkgY2FsbHMgcHJvcGVybHkgbG9vcCBpZiB0aGV5IHJldHVybiAtMSBhbmQgZXJybm8gaXMKICBFSU5UUi4gZ2xpYmMgZG9jcyBmb3IgdGhpcyBpcyBmb3VuZCBoZXJlOgogIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvSW50ZXJydXB0ZWQtUHJpbWl0aXZlcy5odG1sCgogIFRoaXMgbGFzdCBsaW5rIHNheXMgQlNEIGRvZXNuJ3QgaGF2ZSB0aGlzICJlZmZlY3QiLiBXaWxsIHRoZXJlIGJlIGEgcHJvYmxlbQogIGlmIHdlIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5PwoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDUpCi0gRGFuIFRvcm9wIGNsZWFuZWQgdXAgYSBmZXcgbm8gbG9uZ2VyIHVzZWQgdmFyaWFibGVzIGZyb20gRGF2aWQgUGhpbGxpcHMnCiAgc2VsZWN0KCkgb3ZlcmhhdWwgZml4LgoKLSBDeXJpbGwgT3N0ZXJ3YWxkZXIgcG9zdGVkIGEgZGV0YWlsZWQgYW5hbHlzaXMgYWJvdXQgYSBidWcgdGhhdCBvY2N1cnMgd2hlbgogIHVzaW5nIGEgY3VzdG9tIEhvc3Q6IGhlYWRlciBhbmQgY3VybCBmYWlscyB0byBzZW5kIGEgcmVxdWVzdCBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIHRodXMgY3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmRzIGl0LiBJdAogIHRoZW4gc2VudCB0d28gSG9zdDogaGVhZGVycy4gQ3lyaWxsJ3MgYW5hbHlzaXMgd2FzIHBvc3RlZCBoZXJlOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMDEvMDAyMi5odG1sCgotIEJydWNlIE1pdGNoZW5lciBpZGVudGlmaWVkIChidWcgcmVwb3J0ICMxMDk5NjQwKSB0aGUgbmV2ZXItZW5kaW5nIFNPQ0tTNQogIHByb2JsZW0gd2l0aCB0aGUgdmVyc2lvbiBieXRlIGFuZCB0aGUgY2hlY2sgZm9yIGJhZCB2ZXJzaW9ucy4gQnJ1Y2UgaGFzIGxvdHMKICBvZiBjbHVlcyBvbiB0aGlzLCBhbmQgYmFzZWQgb24gaGlzIHN1Z2dlc3Rpb24gSSd2ZSBub3cgcmVtb3ZlZCB0aGUgY2hlY2sgb2YKICB0aGF0IGJ5dGUgc2luY2UgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjb250YWluIDEgb3IgNS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDA1KQotIFBhdmVsIE9yZWhvdiByZXBvcnRlZCBtZW1vcnkgcHJvYmxlbXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGluIGJ1ZyByZXBvcnQKICAjMTA5ODg0My4gSW4gc2hvcnQsIGEgc2hhcmVkIEROUyBjYWNoZSB3YXMgc2V0dXAgZm9yIGEgbXVsdGkgaGFuZGxlIGFuZCB3aGVuCiAgdGhlIHNoYXJlZCBjYWNoZSB3YXMgZGVsZXRlZCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgZWFzeSBoYW5kbGVzLCB0aGUgbGF0dGVyCiAgY2xlYW51cHMgY2F1c2VkIHJlYWQvd3JpdGVzIHRvIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKLSBIemhpanVuIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSBjb2RlLCB0aGF0IGxlYWtlZCB0aGUKICByZW1vdGUgY2VydGlmaWNhdGUgbmFtZSB3aGVuIGl0IGRpZG4ndCBtYXRjaCB0aGUgdXNlZCBob3N0IG5hbWUuCgpHaXNsZSAoOCBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTWFrZWZpbGUuV2F0Y29tIGZpbGVzIChzcmMvbGliKS4gVXBkYXRlZCBNYWtlZmlsZS5kaXN0LgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNSkKLSBJbXByb3ZlZCB0aGUgdGVzdCBzY3JpcHQncyB2YWxncmluZCBsb2cgcGFyc2VyIHRvIGFjdHVhbGx5IHdvcmshIEFsc28gYWRkZWQKICB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSBsb2cgc2Nhbm5lciBmb3Igc3BlY2lmaWMgdGVzdCBjYXNlcy4gVGVzdCBjYXNlCiAgNTA5IHJlc3VsdHMgaW4gbnVtZXJvdXMgcHJvYmxlbXMgYW5kIGxlYWtzIGluIE9wZW5TU0wgYW5kIGhhcyB0byBnZXQgaXQKICBkaXNhYmxlZC4KCkRhbmllbCAoNiBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBzaW5nbGUtYnl0ZSByZWFkIG91dCBvZiBib3VuZHMgaW4gdGVzdCBjYXNlIDM5IGluIHRoZSBjdXJsIHRvb2wgY29kZQogIChpLmUgbm90IGluIHRoZSBsaWJyYXJ5KS4KCi0gQnVnIHJlcG9ydCAjMTA5NzAxOSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIGRvaW5nIC1kICJkYXRhIiB3aXRoIC1HIGFuZAogIHNlbmRpbmcgaXQgdG8gdHdvIFVSTHMgd2l0aCB7fS4gQWRkZWQgdGVzdCAxOTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA1KQotIE1hcnR5IEt1aHJ0IGFkanVzdGVkIGEgVk1TIGJ1aWxkIHNjcmlwdCBzbGlnaHRseQoKLSBLYWkgU29tbWVyZmVsZCBhbmQgR2lzbGUgVmFuZW0gZml4ZWQgbGliY3VybCB0byBidWlsZCB3aXRoIElQdjYgc3VwcG9ydCBvbgogIFdpbjIwMDAuCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA1KQotIEFsZXggTmVibGV0dCB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyBzbGlnaHRseS4KRGFuaWVsICgyNSBEZWNlbWJlciAyMDA0KQotIFJlbW92ZWQgc3JjL2NvbmZpZy5oLmluIGZyb20gQ1ZTLCBpdCBpcyBub3cgY29waWVkIGZyb20gdGhlIChnZW5lcmF0ZWQpCiAgbGliL2NvbmZpZy5oLmluIGluc3RlYWQsIGFzIHRoZXkgY2FuIHZlcnkgd2VsbCBiZSB0aGUgc2FtZS4gVGhpcyByZW1vdmVzIGEKICAibWFudWFsIGhhc3NsZSIuIFlvdSBtYXkgd2FudCB0byByZS1ydW4gYnVpbGRjb25mIG5vdy4KCi0gV2VybmVyIEtvY2ggZmlsZWQgRGViaWFuIGJ1ZyByZXBvcnQgIzI4Njc5NCwgbWVudGlvbmluZyB0aGF0IGN1cmwgY29udGFpbmVkCiAgbm9uLWZyZWUgKGJ5IERlYmlhbidzIHZpZXcpIHNvdXJjZSBjb2RlLiBUaGlzIHdhcyBBbmd1cyBNYWNrYXkncwogIHNyYy9nZXRwYXNzLmMgc291cmNlIGNvZGUuIEkgdHJpZWQgdG8gY29udGFjdCBoaW0gYWJvdXQgaXQgdG8gcXVpY2tseSBzb2x2ZQogIHRoaXMgaXNzdWUsIGJ1dCBoaXMgZW1haWwgYWRkcmVzc2VzIGJvdW5jZSBhbmQgSSBnb3Qgc29tZSB0aW1lICJvdmVyIiBhbmQKICByZWltcGxlbWVudGVkIHRoZSBmdW5jdGlvbmFsaXR5IG9uY2UgYnJvdWdodCBieSBBbmd1cy4gV2Ugbm8gbG9uZ2VyIHVzZSBhbnkKICBvZiBBbmd1cycgb3JpZ2luYWwgY29kZSBhbmQgdGhlIG5ldyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgKElNTykuIElzc3VlCiAgc29sdmVkLgoKRGFuaWVsICgyNCBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgYWRkZWQgLS1wcm90b2NvbHMgdG8gY3VybC1jb25maWcsIHNvIHRoYXQgaXQgbm93IGxpc3RzIGFsbAogIHByb3RvY29scyBsaWJjdXJsIHdhcyBidWlsdCB0byBzdXBwb3J0LiAtLWZlYXR1cmUgbm8gbG9uZ2VyIGxpc3RzIGRpc2FibGVkCiAgcHJvdG9jb2xzLgoKRGFuaWVsICgyMyBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLWRpc2FibGUtW3Byb3RvY29sXSB2YXJpYWJsZXMgc28gdGhhdAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgd29ya3MgY29ycmVjdGx5IQoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA0KQotIFJ1bmUgS2xldmVsYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgZm9yIHJlY2VpdmVkIGNvb2tpZXMgd2l0aCB0aGUKICAocmFyZSkgdmVyc2lvbiBhdHRyaWJ1dGUgc2V0LgoKLSBNYXJjaW4gS29uaWNraSBwcm92aWRlZCB0d28gY29uZmlndXJlIGZpeGVzIGFuZCBhIHNvdXJjZSBmaXggdG8gbWFrZSBjdXJsCiAgYnVpbGQgb3V0LW9mLXRoZS1ib3ggb24gQmVPUy4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMjE3IHRoYXQgdmVyaWZpZWQgQ1VSTElORk9fSFRUUF9DT05ORUNUQ09ERSwgYW5kIEkgbWFkZSB0aGUKICAtdyBvcHRpb24gc3VwcG9ydCAnaHR0cF9jb25uZWN0JyB0byBtYWtlIGl0IGVhc2llciB0byB2ZXJpZnkhCgotIEZpeGVkIGxpYi9zZWxlY3QuYyBpbmNsdWRlIG9yZGVyIHRvIGJ1aWxkIGZpbmUgb24gRnJlZUJTRAoKLSBGaXhlZCBmYWlsZigpJ3MgcmV1c2Ugb2YgdGhlIHZhX2xpc3QgdmFyaWFibGUgdGhhdCBjcmFzaGVkIG9uIEZyZWVCU0QuCiAgUG9pbnRlZCBvdXQgYnkgUGV0ZXIgUGVudGNoZXYuCgpWZXJzaW9uIDcuMTIuMyAoMjAgRGVjZW1iZXIgMjAwNCkKCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwNCkKLSBJIGludmVzdGlnYXRlZCBvdXIgUEtDUzEyIGJ1aWxkIHByb2JsZW0gb24gU29sYXJpcyAyLjcgd2l0aCBPcGVuU1NMIDAuOS43ZSwKICBhbmQgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgZmF1bHQgb2YgdGhlIHpsaWIgMS4xLjQgaGVhZGVycyBkb2luZyBhIHR5cGVkZWYKICBuYW1lZCAnZnJlZV9mdW5jJyBhbmQgdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIGEgcHJvdG90eXBlIHRoYXQgdXNlcwogICdmcmVlX2Z1bmMnIGluIG9uZSBvZiBpdHMgYXJndW1lbnRzLiBUaGlzIGlzIHdoeSB0aGUgY29tcGlsZSBlcnJvcnMgb3V0LgoKICBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBvcGVuc3NsL3BrY3MxMi5oIGhlYWRlciBiZWZvcmUgdGhlCiAgemxpYi5oIGhlYWRlciBhbmQgaXQgYnVpbGRzIGZpbmUuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHRoaXMKICBmaWxlIGFuZCBpdCB0aGVuIGdldHMgaW5jbHVkZWQgZWFybHkgaW4gbGliL3VybGRhdGEuaC4KCkRhbmllbCAoMTggRGVjZW1iZXIgMjAwNCkKLSBTYW11ZWwgTGlzdG9wYWQgYWRkZWQgc3VwcG9ydCBmb3IgUEtDUzEyIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMuCgotIFNhbXVlbCBMaXN0b3BhZCBmaXhlZCAtRSB0byBzdXBwb3J0ICJDOi9wYXRoIiAod2l0aCBmb3J3YXJkIHNsYXNoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIGRpcmVjdG9yeSByZS11c2UgZm9yIEZUUC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMjE1IGFuZCAyMTYgdG8gYmV0dGVyIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRGluYXIgaW4gYnVnIHJlcG9ydCAjMTA4NjEyMSwgZm91bmQgYSBmaWxlIGhhbmRsZSBsZWFrIHdoZW4gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCAoaW5jbHVkaW5nIGEgZmlsZSB1cGxvYWQgcGFydCkgd2FzIGFib3J0ZWQgYmVmb3JlIHRoZSB3aG9sZSBmaWxlCiAgd2FzIHNlbnQuCgpEYW5pZWwgKDE1IERlY2VtYmVyIDIwMDQpCi0gVG9tIExlZSBmb3VuZCBvdXQgdGhhdCBnbG9iYmluZyBvZiBzdHJpbmdzIHdpdGggYmFja3NsYXNoZXMgZGlkbid0IHdvcmsgYXMKICB5b3UnZCBleHBlY3QuIEJhY2tzbGFzaGVzIGFyZSBzdWNoIGEgY2VudHJhbCBwYXJ0IG9mIHdpbmRvd3MgZmlsZSBuYW1lcyB0aGF0CiAgZm9yY2luZyBiYWNrc2xhc2hlcyB0byBoYXZlIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2hlcyBpcyBhIGJpdCB0b28KICBhd2t3YXJkIHRvIHVzZXJzLiBTdGFydGluZyBub3csIHlvdSBvbmx5IG5lZWQgdG8gZXNjYXBlIGdsb2JiaW5nIGNoYXJhY3RlcnMKICBzdWNoIGFzIHRoZSBmaXZlIGxldHRlcnM6ICJbXXt9LCIuIEFkZGVkIHRlc3QgY2FzZSAyMTQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDQpCi0gSGFyc2hhbCBQcmFkaGFuIHBhdGNoZWQgYSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBmbGF3OiBpZiB0aGUgdXNlciBuYW1lCiAgYW5kL29yIHBhc3N3b3JkIHdlcmUgbW9kaWZpZWQgYmV0d2VlbiB0d28gcmVxdWVzdHMgb24gYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiwgdGhlIHNlY29uZCByZXF1ZXN0IHdlcmUgc3RpbGwgbWFkZSB3aXRoIHRoZSBmaXJzdCBzZXR1cCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTE5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMyBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGFkZGVkIENVUkxJTkZPX1NTTF9FTkdJTkVTIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdG8gYWxsb3cgYW4gYXBwCiAgdG8gbGlzdCBhbGwgYXZhaWxhYmxlIGNyeXB0byBFTkdJTkVTLgoKLSBHaXNsZSBmaXhlZCBidWcgcmVwb3J0ICMxMDgzNTQyLCB3aGljaCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCByZXN1bWluZwogIGxhcmdlIGZpbGUgKD40R0IpIGZpbGU6Ly8gdHJhbnNmZXJzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDQpCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciAoc3dzKSBjYXBhYmxlIG9mIHVzaW5nIElQdjYsIGFuZCB0aGVuCiAgZXh0ZW5kZWQgdGhlIHRlc3QgZW52aXJvbm1lbnQgdG8gc3VwcG9ydCB0aGF0IGFuZCBhbHNvIGFkZGVkIHRocmVlIHRlc3QKICBjYXNlcyAoMjQwLCAyNDEsIDI0MikgdGhhdCBydW4gdGVzdHMgdXNpbmcgSVB2Ni4gVGVzdCAyNDIgdXNlcyBhIFVSTCB0aGF0CiAgZGlkbid0IHdvcmsgYmVmb3JlIHRoZSAxMCBkZWMgZml4IGJ5IEthaSBTb21tZXJmZWxkLgoKLSBNYWRlIGEgZmFpbGVkIGZpbGU6Ly8gcmVzdW1lIG91dHB1dCBhbiBlcnJvciBtZXNzYWdlCgotIENvcnJlY3RlZCB0aGUgQ1VSTEVfQkFEX0RPV05MT0FEX1JFU1VNRSBlcnJvciBtZXNzYWdlIGluIGxpYi9zdHJlcnJvci5jCgotIERhbiBGYW5kcmljaDoKCiAgc2ltcGxpZmllZCBhbmQgY29uc29saWRhdGVkIHRoZSBTU0wgY2hlY2tzIGluIGNvbmZpZ3VyZSBhbmQgdGhlIHVzYWdlIG9mIHRoZQogIGRlZmluZXMgaW4gbGliL3NldHVwLmgKCiAgcHJvdmlkZWQgYSBmaXJzdCBsaWJjdXJsLnBjLmluIGZpbGUgZm9yIHBrZy1jb25maWcgKGJ1dCB0aGUgcmVzdWx0IGlzIG5vdAogIGluc3RhbGxlZCBhbnl3aGVyZSBhdCB0aGlzIHBvaW50KQoKICBleHRlbmRlZCB0aGUgY3Jvc3MgY29tcGlsZSBzZWN0aW9uIGluIHRoZSBkb2NzL0lOU1RBTEwgZmlsZQoKRGFuaWVsICgxMCBEZWNlbWJlciAyMDA0KQotIFdoZW4gcHJvdmlkaW5nIHVzZXIgbmFtZSBpbiB0aGUgVVJMIGFuZCBhIElQdjYtc3R5bGUgSVAtYWRkcmVzcyAobGlrZSBpbgogICJmdHA6Ly91c2VyQFs6OjFdL3RtcCIpLCB0aGUgVVJMIHBhcnNlciBkaWRuJ3QgZ2V0IHRoZSBob3N0IGV4dHJhY3RlZAogIHByb3Blcmx5LiAgUmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEthaSBTb21tZXJmZWxkLgoKRGFuaWVsICg5IERlY2VtYmVyIDIwMDQpCi0gVG9uIFZvb24gcHJvdmlkZWQgYSBjb25maWd1cmUgZml4IHRoYXQgc2hvdWxkIGZpeCB0aGUgbm90b3Jpb3VzIChtb3N0bHkKICByZXBvcnRlZCBvbiBTb2xhcmlzKSBwcm9ibGVtIHdoZXJlIHRoZSBzaXplX3QgY2hlY2sgZmFpbHMgZHVlIHRvIHRoZSBTU0wKICBsaWJzIGJlaW5nIGZvdW5kIGluIGEgZGlyIG5vdCBzZWFyY2hlZCB0aHJvdWdoIGJ5IHRoZSBydW4tdGltZSBsaW5rZXIuCiAgcGF0Y2gtdHJhY2tlciBlbnRyeSAjMTA4MTcwNy4KCi0gQnJ5YW4gSGVuZGVyc29uIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzEwODE3ODggdGhhdCB0aGUgY3VybC1jb25maWcKICAtLXZlcm51bSBvdXRwdXQgd2Fzbid0IHplcm8gcHJlZml4ZWQgcHJvcGVybHkgKGFzIGNsYWltZWQgaW4gZG9jdW1lbnRhdGlvbikuCiAgVGhpcyBpcyBmaXhlZCBpbiBtYWtldGd6IG5vdy4KCkRhbmllbCAoOCBEZWNlbWJlciAyMDA0KQotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgbWFjaC1PIGZyYW1ld29yayBmaWxlcyBmb3IgTWFjIE9TIFguCgotIFJlbmUgQmVybmhhcmR0IGZvdW5kIGFuZCBmaXhlZCBhIGJ1ZmZlciBvdmVycnVuIGluIHRoZSBOVExNIGNvZGUsIHdoZXJlCiAgbGliY3VybCBhbHdheXMgYW5kIHVuY29uZGl0aW9uYWxseSBvdmVyd3JvdGUgYSBzdGFjay1iYXNlZCBhcnJheSB3aXRoIDMgemVybwogIGJ5dGVzLiBUaGlzIGlzIG5vdCBhbiBleHBsb2l0YWJsZSBidWZmZXIgb3ZlcmZsb3cuIE5vIG5lZWQgdG8gZ2V0IGFsYXJtZWQuCgpEYW5pZWwgKDcgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBlcnJvciBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHZlcmJvc2UgaW5mbyAic3RyZWFtIgogIGV2ZW4gaWYgbm8gZXJyb3JidWZmZXIgaXMgc2V0LgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY29va2llcyBvcHRpb24gdG8gY29uZmlndXJlIHRvIGJ1aWxkCiAgbGliY3VybCB3aXRob3V0IGNvb2tpZSBzdXBwb3J0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYnVpbGQgYQogIG1pbmltYWxpc3RpYyBsaWJjdXJsIHdpdGggbm8gY29va2llcyBzdXBwb3J0IGF0IGFsbC4gTGlrZSBmb3IgZW1iZWRkZWQKICBzeXN0ZW1zIG9yIHNpbWlsYXIuCgotIFJpY2hhcmQgQXR0ZXJlciBmaXhlZCBsaWJjdXJsJ3Mgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUgRVBTVgogIHJlc3BvbnNlLiBQcmV2aW91c2x5LCBsaWJjdXJsIHdvdWxkIHJlLXJlc29sdmUgdGhlIGhvc3QgbmFtZSB3aXRoIHRoZSBuZXcKICBwb3J0IG51bWJlciBhbmQgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoYXQsIHdoaWxlIGl0IHNob3VsZCB1c2UgdGhlIElQIGZyb20KICB0aGUgY29udHJvbCBjaGFubmVsLiBUaGlzIGJ1ZyBtYWRlIGl0IGhhcmQgdG8gRVBTViBmcm9tIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIG11bHRpcGxlIElQIGFkZHJlc3NlcyEKCkRhbmllbCAoMyBEZWNlbWJlciAyMDA0KQotIEJ1ZyByZXBvcnQgIzEwNzgwNjY6IHdoZW4gYSBjaHVua2VkIHRyYW5zZmVyIHdhcyBwcmUtbWF0dXJlbHkgY2xvc2VkIGV4YWN0bHkKICBhdCBhIGNodW5rIGJvdW5kYXJ5IGl0IHdhcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvciBhbmQgdGh1cyB3ZW50IHVubm90aWNlZC4KICBGaXhlZCBieSBNYXVyaWNlIEJhcm51bS4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNyB0byB2ZXJpZnkuCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCB0aGUgQ09OTkVDVCBsb29wIHRvIGRlZmF1bHQgdGltZW91dCB0byAzNjAwIHNlY29uZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAyMDYgdGhhdCBtYWtlcyBDT05ORUNUIHdpdGggRGlnZXN0LgoKICBGaXhlZCBhIGZsYXcgdGhhdCBwcmVwZW5kZWQgIihuaWwpIiB0byB0aGUgaW5pdGlhbCBDT05ORUNUIHJxZXVlc3QncyB1c2VyLQogIGFnZW50IGZpZWxkLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCdzIGZpeCBmb3IgbGlieiAxLjEgYW5kICJleHRyYSBmaWVsZCIgdXNhZ2UgaW4gYSBnemlwIHN0cmVhbQoKLSBEYW4gYWxzbyBoZWxwZWQgbWUgd2l0aCBpbnB1dCBkYXRhIHRvIGNyZWF0ZSB0aHJlZSBtb3JlIHRlc3QgY2FzZXMgZm9yIHRoZQogIC0tY29tcHJlc3NlZCBvcHRpb24uCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDQpCi0gSSBpbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byBlbmFibGUgYmluYXJ5IGNvbnRlbnRzIGluIHRoZSB0ZXN0cyAoYnkgcHJvdmluZwogIGl0IGJhc2U2NCBlbmNvZGVkKSwgbGlrZSBmb3IgdGVzdGluZyBkZWNvbXByZXNzIGV0Yy4gQWRkZWQgdGVzdCAyMjAgYW5kIDIyMQogIGZvciB0aGlzIHB1cnBvc2UuIFRlc3RzIGNhbiBub3cgYWxzbyBkZXBlbmQgb24gbGlieiB0byBydW4uCgotIEFzIHJlcG9ydGVkIGJ5IFJlaW5vdXQgdmFuIFNjaG91d2VuIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg1CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4NSksIHdoZW4gY29ubmVjdGluZyB0byBhbgogIElQdjYgaG9zdCB3aXRoIEZUUCwgLS1kaXNhYmxlLWVwc3YgKG9yIC0tZGlzYWJsZS1lcHJ0KSBlZmZlY3RpdmVseSBkaXNhYmxlcwogIHRoZSBhYmlsaXR5IHRvIHRyYW5zZmVyIGEgZmlsZS4gTm93LCB3aGVuIGNvbm5lY3RlZCB0byBhbiBGVFAgc2VydmVyIHdpdGgKICBJUHY2LCB0aGVzZSBGVFAgY29tbWFuZHMgY2FuJ3QgYmUgZGlzYWJsZWQgZXZlbiBpZiBhc2tlZCB0byB3aXRoIHRoZQogIGF2YWlsYWJsZSBsaWJjdXJsIG9wdGlvbnMuCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDQpCi0gQXMgcmVwb3J0ZWQgaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODkKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg5KSwgY3VybCB3b3VsZCBwcmludCBhCiAgbmV3bGluZSB0byAiZmluaXNoIiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYWZ0ZXIgZWFjaCByZWRpcmVjdCBhbmQgbm90IG9ubHkKICBhZnRlciBhIGNvbXBsZXRlZCB0cmFuc2Zlci4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNCkKLSBGVFAgaW1wcm92ZW1lbnRzOgoKICBJZiBFUFNWLCBFUFJUIG9yIExQUlQgaXMgdHJpZWQgYW5kIGRvZXNuJ3Qgd29yaywgaXQgd2lsbCBub3QgYmUgcmV0cmllZCBvbgogIHRoZSBzYW1lIHNlcnZlciBhZ2FpbiBldmVuIGlmIGEgZm9sbG93aW5nIHJlcXVlc3QgaXMgbWFkZSB1c2luZyBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLgoKICBJZiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgdG8gYSBzZXJ2ZXIsIHJlcXVlc3RpbmcgYSBmaWxlIGZyb20gdGhlIHNhbWUKICBkaXJlY3RvcnkgYXMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgb3BlcmF0ZWQgb24sIGxpYmN1cmwgd2lsbCBubyBsb25nZXIgbWFrZQogIHRoYXQgbG9uZyBzZXJpZXMgb2YgQ1dEIGNvbW1hbmRzIGp1c3QgdG8gZW5kIHVwIG9uIHRoZSBzYW1lIHNwb3QuIE5vdGUgdGhhdAogIHRoaXMgaXMgb25seSBmb3IgKmV4YWN0bHkqIHRoZSBzYW1lIGRpci4gVGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgaW1wcm92ZW1lbnRzCiAgdG8gb3B0aW1pemUgdGhlIENXRC1zZW5kaW5nIHdoZW4gdGhlIGRpcnMgYXJlIG9ubHkgc2xpZ2h0bHkgZGlmZmVyZW50LgoKICBBZGRlZCB0ZXN0IDIxMCwgMjExIGFuZCAyMTIgdG8gdmVyaWZ5IHRoZXNlIGNoYW5nZXMuIEhhZCB0byBpbXByb3ZlIHRoZQogIHRlc3Qgc2NyaXB0IHRvbyBhbmQgYWRkZWQgYSBuZXcgcHJpbWl0aXZlIHRvIHRoZSB0ZXN0IGZpbGUgZm9ybWF0LgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNlbGVjdCBwcm9wZXJseSB3aGVuIHJ1bgogIHdpdGggTXN5cy9NaW5ndyBvbiBXaW5kb3dzLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDA0KQotIE1hZGUgSFRUUCBQVVQgYW5kIFBPU1QgcmVxdWVzdHMgbm8gbG9uZ2VyIHVzZSBIRUFEIHdoZW4gZG9pbmcgbXVsdGktcGFzcwogIGF1dGggbmVnb3RpYXRpb24gKE5UTE0sIERpZ2VzdCBhbmQgTmVnb3RpYXRlKSwgYnV0IGluc3RlYWQgdXNlIHRoZSByZXF1ZXN0CiAga2V5d29yZCAicHJvcGVybHkiLiBEZXRhaWxzIGluIGxpYi9SRUFETUUuaHR0cGF1dGguIFRoaXMgYWxzbyBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGFuZCBDVVJMT1BUX0lPQ1RMREFUQSwgdG8gYmUgdXNlZCBieSBhcHBzIHRoYXQgdXNlIHRoZQogICJhbnkiIGF1dGggYWx0ZXJuYXRpdmUgYXMgdGhlbiBsaWJjdXJsIG1heSBuZWVkIHRvIHNlbmQgdGhlIFBVVC9QT1NUIGRhdGEKICBtb3JlIHRoYW4gb25jZSBhbmQgdGh1cyBtYXkgbmVlZCB0byBhc2sgdGhlIGFwcCB0byAicmV3aW5kIiB0aGUgcmVhZCBkYXRhCiAgc3RyZWFtIHRvIHN0YXJ0LgoKICBTZWUgYWxzbyB0aGUgbmV3IGV4YW1wbGUgdXNpbmcgdGhpczogZG9jcy9leGFtcGxlcy9hbnlhdXRocHV0LmMKCi0gRGF2aWQgUGhpbGxpcHMgZW5oYW5jZWQgdGVzdCA1MTguIEkgbWFkZSBpdCBkZXBlbmQgb24gYSAiZmVhdHVyZSIgc28gdGhhdAogIHN5c3RlbXMgd2l0aG91dCBnZXRybGltaXQoKSB3b24ndCBhdHRlbXB0IHRvIHRlc3QgNTE4LiBjb25maWd1cmUgbm93IGNoZWNrcwogIGZvciBnZXRybGltaXQoKSBhbmQgc2V0cmxpbWl0KCkgZm9yIHRoaXMgdGVzdCBjYXNlLgoKRGFuaWVsICgxOCBOb3ZlbWJlciAyMDA0KQotIERhdmlkIFBoaWxsaXBzIGZpeGVkIGxpYmN1cmwgdG8gbm90IGNyYXNoIGFueW1vcmUgd2hlbiBtb3JlIHRoYW4gRkRfU0VUU0laRQogIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGluIHVzZS4gVGVzdCBjYXNlIDUxOCBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDQpCi0gVG8gdGVzdCBteSBmaXggZm9yIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIGJ1ZywgSSBhZGRlZCB0aW1lX3JlZGlyZWN0IGFuZAogIG51bV9yZWRpcmVjdHMgc3VwcG9ydCB0byB0aGUgLXcgd3JpdGVvdXQgb3B0aW9uIGZvciB0aGUgY29tbWFuZCBsaW5lIHRvb2wuCgotIFdvamNpZWNoIFp3aWVma2EgZm91bmQgb3V0IHRoYXQgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBkaWRuJ3Qgd29yayBhcwogIGRvY3VtZW50ZWQuCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbW9kaWdpZWQgdGhlIE1TVkMgYW5kIE5ldHdhcmUgbWFrZWZpbGVzIHRvIGJ1aWxkIHdpdGhvdXQKICBsaWJjdXJsLmRlZgoKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jcnlwdG8tYXV0aCBvcHRpb24gdG8gY29uZmlndXJlIHRvIGFsbG93CiAgbGliY3VybCB0byBidWlsZCB3aXRob3V0IERpZ2VzdCBzdXBwb3J0LiAoSSBmaWd1cmUgaXQgc2hvdWxkIGFsc28gZXhwbGljaXRseQogIGRpc2FibGUgTmVnb3RpYXRlIGFuZCBOVExNLikKCi0gICAgICAgICAgICAgICAgICoqKiBNb2RpZmllZCBCZWhhdmlvdXIgQWxlcnQgKioqCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgd2lsbCBubyBsb25nZXIgZG8gYSBHRVQuCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvICIiIHdpbGwgc2VuZCBhIHplcm8gYnl0ZSBQT1NUIGFuZCBzZXR0aW5nCiAgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgYW5kIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byB6ZXJvIHdpbGwgYWxzbyBtYWtlCiAgYSB6ZXJvIGJ5dGUgUE9TVC4gQWRkZWQgdGVzdCBjYXNlIDUxNSB0byB2ZXJpZnkgdGhpcy4KCiAgU2V0dGluZyBDVVJMT1BUX0hUVFBQT1NUIHRvIE5VTEwgbWFrZXMgYSB6ZXJvIGJ5dGUgcG9zdC4gQWRkZWQgdGVzdCBjYXNlIDUxNgogIHRvIHZlcmlmeSB0aGlzLgoKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgbXVzdCBub3cgYmUgc2V0IHRvIC0xIHRvIHNpZ25hbCAid2UgZG9uJ3Qga25vdyIuCiAgU2V0dGluZyBpdCB0byB6ZXJvIHNpbXBseSBzYXlzIHRoaXMgaXMgYSB6ZXJvIGJ5dGUgUE9TVC4KCiAgV2hlbiBwcm92aWRpbmcgUE9TVCBkYXRhIHdpdGggYSByZWFkIGNhbGxiYWNrLCBzZXR0aW5nIHRoZSBzaXplIHVwIGZyb250CiAgaXMgbm93IG1hZGUgd2l0aCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgYW5kIG5vdCB3aXRoIENVUkxPUFRfSU5GSUxFU0laRS4KCkRhbmllbCAoMTEgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgLS1kaXNhYmxlLXZlcmJvc2UgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgYnVpbGRzCiAgd2l0aG91dCB2ZXJib3NlIHN0cmluZ3MgaW4gdGhlIGNvZGUsIHRvIHNhdmUgc29tZSAxMktCIHNwYWNlLiBNYWtlcyBzZW5zZQogIG9ubHkgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IGxpdHRsZSBtZW1vcnkgcmVzb3VyY2VzLgoKLSBKZWZmIFBoaWxsaXBzIGZvdW5kIG91dCB0aGF0IGEgZGF0ZSBzdHJpbmcgd2l0aCBhIHllYXIgYmV5b25kIDIwMzggY291bGQKICBjcmFzaCB0aGUgbmV3IGRhdGUgcGFyc2VyIG9uIHN5c3RlbXMgd2l0aCAzMmJpdCB0aW1lX3QuIFdlIG5vdyBjaGVjayBmb3IKICB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdC4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNCkKLSBJIGluc3RhbGxlZCBIZWltZGFsIG9uIG15IERlYmlhbiBib3ggKHVzaW5nIHRoZSBkZWJpYW4gcGFja2FnZSkgYW5kIG5vdGljZWQKICB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpIGZhaWxlZCB0byBjcmVhdGUgYSBuaWNlIGJ1aWxkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYXJrZWQgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGxzIHdpdGggQ1VSTF9FWFRFUk4gc28gdGhhdCBub3cKICB0aGUgV2luZG93cywgTmV0d2FyZSBhbmQgb3RoZXIgYnVpbGRzIG5vIGxvbmdlciBuZWVkIGxpYmN1cmwuZGVmIG9yIHNpbWlsYXIKICBmaWxlcy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA0KQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgZm9yIHRsZC5oIGlmIGxpYmlkbiB3YXMgZGV0ZWN0ZWQsIHNpbmNlCiAgbGliaWRuIDAuMy5YIGRpZG4ndCBoYXZlIHN1Y2ggYSBoZWFkZXIgYW5kIHdlIGRvbid0IHdvcmsgd2l0aCBhbnl0aGluZwogIGJlZm9yZSBsaWJpZG4gMC40LjEgYW55d2F5ISBTdXNlIDkuMSBhcHBhcmVudGx5IHNoaXBzIHdpdGggYSAwLjMuWCB2ZXJzaW9uCiAgb2YgbGliaWRuIHdoaWNoIG1ha2VzIHRoZSBjdXJsIDcuMTIuMiBidWlsZCBmYWlsLiBKZWFuLVBoaWxpcHBlCiAgQmFycmV0dGUtTGFQaWVycmUgaGVscGVkIHBvaW50aW5nIHRoaXMgb3V0LgoKLSBJYW4gR3VsbGl2ZXIgcmVwb3J0ZWQgaW4gZGViaWFuIGJ1ZyByZXBvcnQgIzI3ODY5MTogaWYgY3VybCBpcyBpbnZva2VkIGluIGFuCiAgZW52aXJvbm1lbnQgd2hlcmUgc3RkZXJyIGlzIGNsb3NlZCB0aGUgLXYgb3V0cHV0IHdpbGwgc3RpbGwgYmUgc2VudCB0byBmaWxlCiAgZGVzY3JpcHRvciAyIHdoaWNoIHRoZW4gbWlnaHQgYmUgdGhlIG5ldHdvcmsgc29ja2V0IGhhbmRsZSEgTm93IHdlIGhhdmUgYQogIHdlaXJkIGhhY2sgaW5zdGVhZCB0aGF0IGF0dGVtcHRzIHRvIG1ha2Ugc3VyZSB0aGF0IGZpbGUgZGVzY3JpcHRvciAyIGlzCiAgb3BlbmVkICh3aXRoIGEgY2FsbCB0byBwaXBlKCkpIGJlZm9yZSBsaWJjdXJsIGlzIGNhbGxlZCB0byBkbyB0aGUgdHJhbnNmZXIuCiAgY29uZmlndXJlIG5vdyBjaGVja3MgZm9yIHBpcGUoKSBhbmQgc3lzdGVtcyB3aXRob3V0IHBpcGUgZG9uJ3QgZ2V0IHRoZSB3ZWlyZAogIGhhY2sgZG9uZS4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDA0KQotIFRpbSBTbmVkZG9uIG1hZGUgbGliY3VybCBzZW5kIG5vIG1vcmUgdGhhbiA2NEsgaW4gYSBzaW5nbGUgZmlyc3QgY2h1bmsgd2hlbgogIGRvaW5nIGEgaHVnZSBQT1NUIG9uIFZNUywgYXMgdGhpcyBpcyBhIHN5c3RlbSBsaW1pdGF0aW9uLiBEZWZhdWx0IG9uIGdlbmVyYWwKICBzeXN0ZW1zIGlzIDEwMEsuCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwNCkKLSBBbmRyZXMgR2FyY2lhIG1hZGUgaXQgYnVpbGQgb24gbWluZ3cgYWdhaW5hLCBteSAtLXJldHJ5IGNvZGUgYnJva2UgdGhlIGJ1aWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDQpCi0gQWRkZWQgLS1yZXRyeS1tYXgtdGltZSB0aGF0IGFsbG93cyBhIG1heGltdW0gdGltZSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuCiAgcmVhY2hlZCBmb3IgYSByZXRyeSB0byBiZSBtYWRlLiBJZiBub3Qgc2V0IHRoZXJlIGlzIG5vIG1heGltdW0gdGltZSwgb25seQogIHRoZSBhbW91bnQgb2YgcmV0cmllcyBzZXQgd2l0aCAtLXJldHJ5LgoKLSBQYXVsIE5vbGFuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG5pY2VseSBvbiBXaW5kb3dzIENFLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDQpCi0gV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vIGxvbmdlciBhdHRlbXB0cyB0byB1c2UKICBwa2ctY29uZmlnIG9uIHRoZSBidWlsZCBob3N0IGluIG9yZGVyIHRvIGRldGVjdCBPcGVuU1NMIGNvbXBpbGVyIG9wdGlvbnMuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2g6CgogIEFuIGltcHJvdmVtZW50IHRvIHRoZSBnemlwIGhhbmRsaW5nIG9mIGxpYmN1cmwuIFRoZXJlIHdlcmUgdHdvIHByb2JsZW1zIHdpdGgKICB0aGUgb2xkIHZlcnNpb246IGl0IHdhcyBwb3NzaWJsZSBmb3IgYSBtYWxpY2lvdXMgZ3ppcCBmaWxlIHRvIGNhdXNlIGxpYmN1cmwKICB0byBsZWFrIG1lbW9yeSwgYXMgYSBidWZmZXIgd2FzIG1hbGxvY2VkIHRvIGhvbGQgdGhlIGhlYWRlciBhbmQgbmV2ZXIgZnJlZWQKICBpZiB0aGUgaGVhZGVyIGVuZGVkIHdpdGggbm8gZmlsZSBjb250ZW50cy4gIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IHRoZQogIDY0IEtpQiBkZWNvbXByZXNzaW9uIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgd2hpY2ggY2F1c2VkCiAgdW5leHBlY3RlZGx5IGhpZ2ggc3RhY2sgdXNhZ2UgYW5kIG92ZXJmbG93ZWQgdGhlIHN0YWNrIG9uIHNvbWUgc3lzdGVtcwogIChzb21lb25lIGNvbXBsYWluZWQgYWJvdXQgdGhhdCBpbiB0aGUgbWFpbGluZyBsaXN0IGFib3V0IGEgeWVhciBhZ28pLgoKICBCb3RoIHByb2JsZW1zIGFyZSBmaXhlZCBieSB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIGlzIGZpeGVkIHdoZW4gYSByZWNlbnQKICAoMS4yKSB2ZXJzaW9uIG9mIHpsaWIgaXMgdXNlZCwgYXMgaXQgdGFrZXMgY2FyZSBvZiBnemlwIGhlYWRlciBwYXJzaW5nCiAgaXRzZWxmLiAgQSBjaGVjayBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGRvbmUgYXQgcnVuLXRpbWUgYW5kIGxpYmN1cmwgdXNlcwogIHRoYXQgZmVhdHVyZSBpZiBpdCdzIHByZXNlbnQuIEkndmUgY3JlYXRlZCBhIGRlZmluZSBPTERfWkxJQl9TVVBQT1JUIHRoYXQKICBjYW4gYmUgY29tbWVudGVkIG91dCB0byBzYXZlIHNvbWUgY29kZSBzcGFjZSBpZiBsaWJjdXJsIGlzIGd1YXJhbnRlZWQgdG8gYmUKICB1c2luZyBhIDEuMiB2ZXJzaW9uIG9mIHpsaWIuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgZHluYW1pY2FsbHkgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGJ1ZmZlcgogIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBvbiB0aGUgc3RhY2suIFRoZSBhbGxvY2F0aW9uL2ZyZWUgaXMgZG9uZSBmb3IgZXZlcnkKICBpbmNvbWluZyBwYWNrZXQsIHdoaWNoIGlzIHN1Ym9wdGltYWwsIGJ1dCBzaG91bGQgYmUgZHdhcmZlZCBieSB0aGUgYWN0dWFsCiAgZGVjb21wcmVzc2lvbiBjb21wdXRhdGlvbi4KCiAgSSd2ZSBhbHNvIGZhY3RvcmVkIG91dCBzb21lIGNvbW1vbiBjb2RlIGJldHdlZW4gZGVmbGF0ZSBhbmQgZ3ppcCB0byByZWR1Y2UKICB0aGUgY29kZSBmb290cHJpbnQgc29tZXdoYXQuICBJJ3ZlIHRlc3RlZCB0aGUgZ3ppcCBjb2RlIG9uIGEgZmV3IHRlc3QgZmlsZXMKICBhbmQgSSB0cmllZCBkZWZsYXRlIHVzaW5nIHRoZSBmcmVzaG1lYXQubmV0IHNlcnZlciwgYW5kIGl0IGFsbCBsb29rcyBPSy4gSQogIGRpZG4ndCB0cnkgcnVubmluZyBpdCB3aXRoIHZhbGdyaW5kLCBob3dldmVyLgoKLSBBZGRlZCBhIC0tcmV0cnkgb3B0aW9uIHRvIGN1cmwgdGhhdCB0YWtlcyBhIG51bWVyaWNhbCBvcHRpb24gZm9yIHRoZSBudW1iZXIKICBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkLiBJdCBpcyByZXRyaWVkIGlmIGEgdHJhbnNpZW50IGVycm9yCiAgaXMgZGV0ZWN0ZWQgb3IgaWYgYSB0aW1lb3V0IG9jY3VycmVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGZpcnN0IHdhaXQgb25lCiAgc2Vjb25kIGJldHdlZW4gdGhlIHJldHJpZXMgYW5kIHRoZW4gZG91YmxlIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gZWFjaCByZXRyeQogIHVudGlsIHRoZSBkZWxheSB0aW1lIGlzIHRlbiBtaW51dGVzIHdoaWNoIHRoZW4gd2lsbCBiZSB0aGUgZGVsYXkgdGltZQogIGJldHdlZW4gYWxsIGZvcnRoY29taW5nIHJldHJpZXMuIFlvdSBjYW4gc2V0IGEgc3RhdGljIGRlbGF5IHRpbWUgd2l0aAogICItLXJldHJ5LWRlbGF5IFtudW1dIiB3aGVyZSBbbnVtXSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuCiAgZWFjaCByZXRyeS4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA0KQotIFRvbWFzIFBvc3Bpc2VrIGZpbGVkIGJ1ZyByZXBvcnQgIzEwNTMyODcgdGhhdCBwcm92ZWQgLUMgLSBhbmQgLS1mYWlsIG9uIGEKICBmaWxlIHRoYXQgd2FzIGFscmVhZHkgY29tcGxldGVseSBkb3dubG9hZGVkIGNhdXNlZCBhbiBlcnJvciwgd2hpbGUgaXQKICBkb2Vzbid0IGlmIHlvdSBkb24ndCB1c2UgLS1mYWlsISBJIGFkZGVkIHRlc3QgY2FzZSAxOTQgdG8gdmVyaWZ5IHRoZSBmaXguCiAgR3Jyci4gQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBub3cgYWRkZWQgdG8gdGhlIGxpc3Qgc3R1ZmYgdG8gcmVtb3ZlIGluCiAgbGliY3VybCB2OCBkdWUgdG8gYWxsIHRoZSBrbHVkZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgoKLSBNb2h1biBCaXN3YXMgZm91bmQgb3V0IHRoYXQgZm9ybXBvc3RpbmcgYSB6ZXJvLWJ5dGUgZmlsZSBkaWRuJ3Qgd29yayB2ZXJ5CiAgZ29vZC4gSSBmaXhlZC4KCkRhbmllbCAoMTkgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgaXQgcG9zc2libGUgdG8gbWFrZSBGVFAgM3JkIHBhcnR5IHRyYW5zZmVycwogIHdpdGggYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJlaW5nIHRoZSBzYW1lIGhvc3QuIEl0IGNhbiBiZSB1c2VmdWwgaWYKICB5b3Ugd2FudCB0byBtb3ZlIGEgZmlsZSBvbiBhIHNlcnZlciBvciBzaW1pbGFyLgoKLSBHdWlsbGF1bWUgQXJsdWlzb24gYWRkZWQgQ1VSTElORk9fTlVNX0NPTk5FQ1RTIHRvIGFsbG93IGFuIGFwcCB0byBmaWd1cmUKICBvdXQgaG93IG1hbnkgbmV3IGNvbm5lY3RzIGEgcHJldmlvdXMgdHJhbnNmZXIgcmVxdWlyZWQuCgogIEkgYWRkZWQgJXtudW1fY29ubmVjdHN9IHRvIHRoZSBjdXJsIHRvb2wgYW5kIGFkZGVkIHRlc3QgY2FzZSAxOTIgYW5kIDE5MwogIHRvIHZlcmlmeSB0aGUgbmV3IGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNCkKLSBQZXRlciBXdWxsaW5nZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHNob3VsZCBjYWxsIHNldGxvY2FsZSgpIHByb3Blcmx5IHRvCiAgaW5pdGlhdGUgdGhlIHNwZWNpZmljIGxhbmd1YWdlIG9wZXJhdGlvbnMsIHRvIG1ha2UgdGhlIElETiBzdHVmZiB3b3JrCiAgYmV0dGVyLgoKVmVyc2lvbiA3LjEyLjIgKDE4IE9jdG9iZXIgMjAwNCkKCkRhbmllbCAoMTYgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uIHdvcmsKICBmaW5lIGV2ZW4gZm9yIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCi0gcnVuZWtsIGF0IG9wb2ludC5jb20gZm91bmQgb3V0IChhbmQgcHJvdmlkZWQgYSBmaXgpIHRoYXQgbGliY3VybCBsZWFrZWQKICBtZW1vcnkgZm9yIGNvb2tpZXMgd2l0aCB0aGUgIm1heC1hZ2UiIGZpZWxkIHNldC4KCkdpc2xlICgxNiBPY3RvYmVyIDIwMDQpCi0gSXNzdWUgNTAgaW4gVE9ETy1SRUxFQVNFOyBBZGRlZCBUcmFpYW4gTmljb2xlc2N1J3MgcGF0Y2hlcyBmb3IgdGhyZWFkZWQKICByZXNvbHZlciBvbiBXaW5kb3dzLiBQbHVnZ2VkIHNvbWUgcG90ZW50aWFsIGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDQpCi0gRXJpYyBWZXJnbmF1ZCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0ID8tbGV0dGVycyBpbiB0aGUgdXNlcgogIG5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcyBwcm9wZXJseSBpbiBVUkxzLCBsaWtlCiAgZnRwOi8vdXM/ZXI6cGFzcz93b3JkQHNpdGUuY29tLy4gQWRkZWQgdGVzdCAxOTEgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwNCkKLSBsaWJjdXJsIG5vdyB1c2VzIFNPX05PU0lHUElQRSBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKE1hYyBPUyBYIDEwLjIgb3IKICBsYXRlciBpcyBvbmUpIHRvIGluaGliaXQgdGhlIFNJR1BJUEUgc2lnbmFsIHdoZW4gd3JpdGluZyB0byBhIHNvY2tldCB3aGlsZQogIHRoZSBwZWVyIGRpZXMuIFRoZSBzYW1lIGVmZmVjdCBpcyBwcm92aWRlIGJ5IHRoZSBNU0dfTk9TSUdOQUwgcGFyYW1ldGVyIHRvCiAgc2VuZCgpIG9uIG90aGVyIHN5c3RlbXMuIEFsYW4gUGluc3RlaW4gdmVyaWZpZWQgdGhlIGZpeC4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDA0KQotIFN5c3RlbXMgd2l0aCA2NGJpdCBsb25ncyBubyBsb25nZXIgdXNlIHN0cnRvbGwoKSBvciBvdXIgc3RydG9sbC0gcmVwbGFjZW1lbnQKICB0byBwYXJzZSA2NCBiaXQgbnVtYmVycy4gc3RydG9sKCkgd29ya3MgZmluZS4gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgdG8KICBkZXRlY3QgaWYgW2NvbnN0YW50XUxMIHdvcmtzIGFuZCBpZiBzbywgdXNlIHRoYXQgaW4gdGhlIHN0cnRvbGwgcmVwbGFjZW1lbnQKICBjb2RlIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVyIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IEFuZHkgQ2VkaWxuaWsuCgpHaXNsZSAoNiBPY3RvYmVyIDIwMDQpCi0gRm9yIFVTRV9MSUJJRE4gYnVpbGRzOiBBZGRlZCBUb3AtTGV2ZWwtRG9tYWluIChUTEQpIGNoZWNrIG9mIGhvc3QtbmFtZQogIHVzZWQgaW4gZml4X2hvc3RuYW1lKCkuIENoZWNrcyBpZiBjaGFyYWN0ZXJzIGluICdob3N0LT5uYW1lJyAoaW5kaXJlY3RseQogIHZpYSAnYWNlX2hvc3RuYW1lJykgYXJlIGxlZ2FsIGFjY29yZGluZyB0byB0aGUgVExEIHRhYmxlcyBpbiBsaWJpZG4uCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA0KQotIENoaWgtQ2h1bmcgQ2hhbmcgcmVwb3J0ZWQgdGhhdCBpZiB5b3UgdXNlIENVUkxPUFRfUkVTVU1FX0ZST00gYW5kIGVuYWJsZWQKICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBsaWJjdXJsIHJlcG9ydGVkIGVycm9yIGlmIGEgcmVkaXJlY3QgaGFwcGVuZWQgZXZlbgogIGlmIHRoZSBuZXcgVVJMIHdvdWxkIHByb3ZpZGUgdGhlIHJlc3VtZWQgZmlsZS4gVGVzdCBjYXNlIDE4OCBhZGRlZCB0byB2ZXJpZnkKICB0aGUgZml4ICh0b2dldGhlciB3aXRoIGV4aXN0aW5nIHRlc3QgOTkpLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBjb25maWd1cmUgZmxhdyBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgYm90aCBuc2wgYW5kIHNvY2tldAogIGxpYnMgdG8gdXNlIGdldGhvc3RieW5hbWUoKS4KCi0gUmVtb3ZlZCB0YWJzIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbG90cyBvZiBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA0KQotIE1hZGUgY29uZmlndXJlIC0td2l0aC1saWJpZG49UEFUSCB0cnkgdGhlIGdpdmVuIFBBVEggYmVmb3JlIHRoZSBkZWZhdWx0CiAgcGF0aHMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZS4KCi0gSWYgaWRuYV9zdHJlcnJvcigpIGlzIHByZXNlbnQgaW4gbGliaWRuLCB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBvdXIKICBpbnRlcm5hbCByZXBsYWNlbWVudC4gVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgYnkgU2ltb24gaW4gbGliaWRuIDAuNS42IGFuZAogIGlzIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZS4KCi0gSXQgc2VlbXMgYmFzZW5hbWUoKSBvbiBJUklYIGlzIGluIHRoZSBsaWJnZW4gbGlicmFyeSBhbmQgc2luY2Ugd2UgZG9uJ3QgdXNlCiAgdGhhdCwgY29uZmlndXJlIGZpbmRzIGxpYmdlbi5oIGJ1dCBub3QgYmFzZW5hbWUgYW5kIHRoZW4gd2UgZ2V0IGEgY29tcGlsZXIKICBlcnJvciBiZWNhdXNlIG91ciBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHByb3RvIGluCiAgbGliZ2VuLmguIFN0YXJ0aW5nIG5vdywgd2UgZG9uJ3QgaW5jbHVkZSB0aGUgZmlsZSBpZiBiYXNlbmFtZSB3YXNuJ3QgZm91bmQKICBhcyB3ZWxsLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNCkKLSBDaHJpcyBmb3VuZCBhIHJhY2UgY29uZGl0aW9uIHJlc3VsdGluZyBpbiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBhbmQKICBwb3RlbnRpYWwgY3Jhc2gsIGluIHRoZSB3aW5kb3dzIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDQpCi0gUmVwbGFjZWQgdGhlIHVzZSBvZiBpc3NwYWNlKCkgaW4gY29va2llLmMgd2l0aCBvdXIgb3duIHZlcnNpb24gaW5zdGVhZCBzaW5jZQogIHdlIGhhdmUgbW9zdCBkYXRhIGFzICdjaGFyIConIGFuZCB0aGF0IG1ha2VzIHVzIHBhc3MgaW4gbmVnYXRpdmUgdmFsdWVzIGlmCiAgdGhlcmUgaXMgOGJpdCBkYXRhIGluIHRoZSBzdHJpbmcuIENoYW5naW5nIHRvIHVuc2lnbmVkIGNhdXNlcyB0b28gbXVjaAogIHdhcm5pbmdzIG9yIHRvbyBtYW55IHJlcXVpcmVkIHR5cGVjYXN0cyB0byB0aGUgbm9ybWFsIHN0cmluZyBmdW5jdGlvbnMuCiAgSGFyc2hhbCBQcmFkaGFuIGlkZW50aWZpZWQgdGhpcyBwcm9ibGVtLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhIGNhc2Ugd2hlcmUgbGliY3VybCBjb3VsZCByZWFkIGFscmVhZHkgZnJlZWQKICBkYXRhIHdoZW4gQ1VSTE9QVF9WRVJCT1NFIGlzIHVzZWQgYW5kIGEgKHZlcnkpIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gSXQKICBoYXBwZW5lZCB3aGVuIHRoZSBkbnMgY2FjaGUgZW50cnkgZm9yIHRoZSBjb25uZWN0aW9uIHdhcyBwcnVuZWQgd2hpbGUgdGhlCiAgY29ubmVjdGlvbiB3YXMgc3RpbGwgYWxpdmUgYW5kIHRoZW4gYWdhaW4gcmUtdXNlZC4gV2Ugd29ya2VkIHRvZ2V0aGVyIG9uCiAgdGhpcyBmaXguCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIChsaWJpZG4KICBiYXNlZCkgSUROIGNvbnZlcnNpb24gZmFpbHMuIFRoaXMgaXMgcmVhbGx5IGR1ZSB0byBhIG1pc3Npbmcgc3VpdGFibGUKICBmdW5jdGlvbiBpbiB0aGUgbGliaWRuIEFQSSB0aGF0IEkgaG9wZSB3ZSBjYW4gcmVtb3ZlIG9uY2UgbGliaWRuIGdldHMgYQogIGZ1bmN0aW9uIGxpa2UgdGhpcy4KCkRhbmllbCAoMSBPY3RvYmVyIDIwMDQpCi0gQWxla3NhbmRhciBNaWxpdm9qZXZpYyByZXBvcnRlZCBhIHByb2JsZW0gaW4gdGhlIFJlZGhhdCBidWd6aWxsYSAoc2VlCiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMzQxMzMpIGFuZCBub3QgdG8KICBhbnlvbmUgaW52b2x2ZWQgaW4gdGhlIGN1cmwgcHJvamVjdCEgVGhpcyBoYXBwZW5zIHdoZW4geW91IHRyeSB0byBjdXJsIGEKICBmaWxlIGZyb20gYSBwcm9mdHBkIHNpdGUgdXNpbmcgU1NMLiBJdCBzZWVtcyBwcm9mdHBkIHNlbmRzIGEgc29tZXdoYXQKICB1bm9ydGhvZG94IHJlc3BvbnNlIGNvZGUgKDIzMiBpbnN0ZWFkIG9mIDIzMCkuIEkgcmVsYXhlZCB0aGUgcmVzcG9uc2UgY29kZQogIGNoZWNrIHRvIGRlYWwgd2l0aCB0aGlzIGFuZCBzaW1pbGFyIGNhc2VzLgoKLSBCYXNlZCBvbiBGZWRvciBLYXJwZWxldml0Y2gncyBmb3JtcG9zdCBwYXRoIGJhc2VuYW1lIHBhdGNoLCBmaWxlIHBhcnRzIGluCiAgZm9ybXBvc3RzIG5vIGxvbmdlciBpbmNsdWRlIHRoZSBwYXRoIHBhcnQuIElmIHlvdSBfcmVhbGx5XyB3YW50IHRoZW0sIHlvdQogIG11c3QgcHJvdmlkZSB5b3VyIHByZWZlcnJlZCBmdWxsIGZpbGUgbmFtZSB3aXRoIENVUkxGT1JNX0ZJTEVOQU1FLgoKICBBZGRlZCBkZXRlY3Rpb24gZm9yIGxpYmdlbi5oIGFuZCBiYXNlbmFtZSgpIHRvIGNvbmZpZ3VyZS4gTXkgY3VzdG9tCiAgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LCBtaWdodCBiZSBhIGJpdCB0b28KICBuYWl2ZS4uLgoKICBVcGRhdGVkIDYgdGVzdCBjYXNlcyB0byBtYWtlIHRoZW0gd29yayB3aXRoIHRoZSBzdHJpcHBlZCBwYXRocy4KCkRhbmllbCAoMzAgU2VwdGVtYmVyIDIwMDQpCi0gTGFycnkgQ2FtcGJlbGwgYWRkZWQgQ1VSTElORk9fT1NfRVJSTk8gdG8gY3VybF9lYXN5X2dldGluZm8oKSB0aGF0IGFsbG93cyBhbgogIGFwcCB0byByZXRyaWV2ZSB0aGUgZXJybm8gdmFyaWFibGUgYWZ0ZXIgYSAoY29ubmVjdCkgZmFpbHVyZS4gSXQgd2lsbCBtYWtlCiAgc2Vuc2UgdG8gcHJvdmlkZSB0aGlzIGZvciBtb3JlIGZhaWx1cmVzIGluIGEgbW9yZSBnZW5lcmljIHdheSwgYnV0IGxldCdzCiAgc3RhcnQgbGlrZSB0aGlzLgoKLSBH/G50ZXIgS25hdWYgYW5kIENhc2V5IE8nRG9ubmVsbCB3b3JrZWQgb3V0IGFuIGV4dHJhICNpZiBjb25kaXRpb24gZm9yIHRoZQogIGN1cmwvbXVsdGkuaCBoZWFkZXIgdG8gd29yayBiZXR0ZXIgaW4gd2luc29jay11c2luZyBhcHBzLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgYnVpbGRjb25mIHJ1biBiZXR0ZXIgb24gTWFjIE9TIFggYnkKICBwcm9wZXJseSB1c2luZyBnbGlidG9vbGl6ZSBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2xpemUuIChUaGlzIGlzIG1hZGUgaWYKICBnbGlidG9vbCB3YXMgZm91bmQgYW5kIHVzZWQgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29sLikKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgc28gdGhhdCBpdCBkb2Vzbid0IG1pc3Rha2luZ2x5CiAgZW5hYmxlIHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDQpCi0gIk1la29uaWt1bSIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGJ1aWx0IGN1cmwgd2l0aG91dCBTU0wgc3VwcG9ydCwgYWx0aG91Z2gKICB5b3VyIGN1cnJlbnQgU1NMIGluc3RhbGxhdGlvbiBzdXBwb3J0cyBFbmdpbmUsIHRoZSBjb21waWxlIGZhaWxzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNCkKLSBXaGVuIC0td2l0aC1zc2w9UEFUSCBpcyB1c2VkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpdCBubyBsb25nZXIgdXNlcwogIHBrZy1jb25maWcgdG8gZmlndXJlIG91dCBleHRyYSBkZXRhaWxzLiBUaGF0IGlzIG5vdyBvbmx5IGRvbmUgaWYgbm8gUEFUSCBpcwogIGluY2x1ZGVkIG9yIGlmIFNTTCBpcyBjaGVja2VkIGZvciBieSBkZWZhdWx0IHdpdGhvdXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX1NTTEVOR0lORSBjb3VsZG4ndCBldmVuIGJlIHNldCB0bwogIE5VTEwgd2hlbiBubyBlbmdpbmUgd2FzIHN1cHBvcnRlZC4gSXQgY2FuIG5vdy4KCkRhbmllbCAoMjIgU2VwdGVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRocmVlIHRlc3QgY2FzZXMgdG8gbm8gbG9uZ2VyIHVzZSAibG9jYWxob3N0IiBidXQgaW5zdGVhZAogIHVzZSAiMTI3LjAuMC4xIiB0byBhdm9pZCByZXF1aXJpbmcgdGhhdCBsb2NhbGhvc3QgcmVzb2x2ZXMgbmljZWx5LgoKLSBKZWFuLUNsYXVkZSBDaGF1dmUgZml4ZWQgYW4gTERBUCBjcmFzaCB3aGVuIG1vcmUgdGhhbiBvbmUgcmVjb3JkIHdhcwogIHJldHJpZXZlZC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDQpCi0gQW5kcmVhcyBSaWVrZSBwb2ludGVkIG91dCB0aGF0IHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB3aXRob3V0CiAgYSBzZXJ2aWNlIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCwgY3VybF9lYXN5X3BlcmZvcm0oKSBkaWRuJ3QgcHJvcGVybHkgcHJvdmlkZQogIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIENVUkxPUFRfRVJST1JCVUZGRVIgYnVmZmVyLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW5pZWwgYXQgdG91Y2h0dW5lcyB1c2VzIHRoZSBGVFArU1NMIHNlcnZlciAiQlNERlRQRC1TU0wgZnJvbQogIGh0dHA6Ly9ic2RmdHBkLXNzbC5zYy5ydS8iIHdoaWNoIGFjY29yZGluZ2x5IGRvZXNuJ3QgcHJvcGVybHkgd29yayB3aXRoIGN1cmwKICB3aGVuICJBVVRIIFNTTCIgaXMgaXNzdWVkIChhbHRob3VnaCB0aGUgc2VydmVyIHJlc3BvbmRzIGZpbmUgYW5kIGV2ZXJ5dGhpbmcpCiAgYnV0IHJlcXVpcmVzIHRoYXQgY3VybCBpc3N1ZXMgIkFVVEggVExTIiBpbnN0ZWFkLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL2ZlZWRiYWNrL2Rpc3BsYXkuY2dpP2lkPTEwOTUxOTQ0OTM3NjAzJnN1cHBvcnQ9eWVzCgogIEludHJvZHVjaW5nIENVUkxPUFRfRlRQU1NMQVVUSCB0aGF0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2VsZWN0IHdoaWNoCiAgb2YgdGhlIEFVVEggc3RyaW5ncyB0byBhdHRlbXB0IGZpcnN0LgoKLSBBbm9ueW1vdXMgZmlsZWQgYnVnIHJlcG9ydCAjMTAyOTQ3OCB3aGljaCBpZGVudGlmaWVkIGEgYnVnIHdoZW4geW91IDEpIHVzZWQKICBhIFVSTCB3aXRob3V0IHByb3Blcmx5IHNlcGVyYXRpbmcgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBhcmFtZXRlcnMgd2l0aCBhCiAgc2xhc2guIDIpIHRoZSBVUkwgaGFkIHBhcmFtZXRlcnMgdG8gdGhlIHJpZ2h0IG9mIGEgPyB0aGF0IGNvbnRhaW5zIGEgc2xhc2gKICAzKSBjdXJsIHdhcyB0b2xkIHRvIGZvbGxvdyBMb2NhdGlvbjpzIDQpIHRoZSByZXF1ZXN0IGdvdCBhIHJlc3BvbnNlIHRoYXQKICBjb250YWluZWQgYSBMb2NhdGlvbjogdG8gcmVkaXJlY3QgdG8gIi9kaXIiLiBjdXJsIHRoZW4gYXBwZW5kZWQgdGhlIG5ldyBwYXRoCiAgb24gdGhlIHdyb25nIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBVUkwuCgogIFRlc3QgY2FzZSAxODcgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgd2FzIGZpeGVkIHByb3Blcmx5LgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNCkKLSBBZGRlZCBwYXJzZWRhdGUuYyB0aGF0IGNvbnRhaW5zIGEgcmV3cml0ZSBvZiB0aGUgZGF0ZSBwYXJzZXIgY3VycmVudGx5CiAgcHJvdmlkZWQgYnkgZ2V0ZGF0ZS55LiBUaGUgbmV3IG9uZSBpcyBNVUNIIHNtYWxsZXIgYW5kIHdpbGwgYWxsb3cgdXMgdG8gcnVuCiAgYXdheSBmcm9tIHRoZSB5YWNjL2Jpc29uIGp1bmdsZS4gSXQgaXMgYWxzbyBzbGlnaHRseSBsYWNraW5nIGluIGZlYXR1cmVzCiAgY29tcGFyZWQgdG8gdGhlIG9sZCBvbmUsIGJ1dCBpdCBzdXBwb3J0cyBwYXJzaW5nIG9mIGFsbCBkYXRlIGZvcm1hdHMgSFRUUAogIGludm9sdmVzIChhbmQgYSBmYWlyIGJ1bmNoIG9mIG90aGVycykuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDA0KQotIEFzIGZvdW5kIG91dCBieSBKb25hcyBGb3JzbWFuLCBjdXJsIGRpZG4ndCBhbGxvdyAtRiB0byBzZXQgQ29udGVudC1UeXBlIG9uCiAgdGV4dC1wYXJ0cy4gU3RhcnRpbmcgbm93LCB3ZSBjYW4gZG8gLUYgIm5hbWU9ZGFuaWVsO3R5cGU9dGV4dC9leHRyYSIuIEFkZGVkCiAgdGVzdCBjYXNlIDE4NiB0byB2ZXJpZnkuCgotIEJ1ZyByZXBvcnQgIzEwMjU5ODYuIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHdpdGggYSBjdXN0b20gSG9zdDogaGVhZGVyCiAgcmVwbGFjZW1lbnQsIGN1cmwgb25seSByZXBsYWNlZCB0aGUgSG9zdDogaGVhZGVyIG9uIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgZGlkbid0IHJlcGxhY2UgaXQgb24gdGhlIGZvbGxvd2luZyBvbmVzLiBUaGlzIHJlc3VsdGVkIGluIHJlcXVlc3RzIHdpdGgKICB0d28gSG9zdDogaGVhZGVycy4KCiAgTm93LCBjdXJsIGNoZWNrcyBpZiB0aGUgbG9jYXRpb24gaXMgb24gdGhlIHNhbWUgaG9zdCBhcyB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIHRoZW4gY29udGludWVzIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlci4gQW5kIHdoZW4gaXQgbW92ZXMgdG8gYW5vdGhlcgogIGhvc3QsIGl0IGRvZXNuJ3QgcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGJ1dCBpdCBhbHNvIGRvZXNuJ3QgbWFrZSB0aGUKICBzZWNvbmQgSG9zdDogaGVhZGVyIGdldCB1c2VkIGluIHRoZSByZXF1ZXN0LgoKICBUaGlzIGNoYW5nZSBpcyB2ZXJpZmllZCBieSB0aGUgdHdvIG5ldyB0ZXN0IGNhc2VzIDE4NCBhbmQgMTg1LgoKRGFuaWVsICg4IFNlcHRlbWJlciAyMDA0KQotIE1vZGlmaWVkIHRoZSB0ZXN0IHN1aXRlIHRvIGJlIGFibGUgdG8gdXNlIGFuZCBydW4gd2l0aCBjdXN0b21pemVkIHBvcnQKICBudW1iZXJzLiBUaGlzIHdhcyBhbHdheXMgaW50ZW5kZWQgYnV0IG5ldmVyIGJlZm9yZSBwb3NzaWJsZS4gTm93IGEgc2ltcGxlCiAgY2hhbmdlIGluIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2FuIG1ha2UgYWxsIHRlc3RzIHVzZSBkaWZmZXJlbnQgcG9ydHMuCiAgVGhlIGRlZmF1bHQgcG9ydHMgaW4gdXNlIGZyb20gbm93IG9uIGFyZSA4OTkwIHRvIDg5OTMuCgpEYW5pZWwgKDIgU2VwdGVtYmVyIDIwMDQpCi0gTWlub3IgbW9kaWZpY2F0aW9uIG9mIGFuIFNTTC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA0KQotIERhdmlkIFRhcmVuZGFzaCBmb3VuZCBvdXQgdGhhdCBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSByZXR1cm5lZAogIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnN0ZWFkIG9mIENVUkxNX09LLgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwNCkKLSBNYWtlICJQcm94eS1Db25uZWN0aW9uOiBjbG9zZSIgY2xvc2UgdGhlIGN1cnJlbnQgcHJveHkgY29ubmVjdGlvbiwgYXMgUm9tYW4KICBLb2lmbWFuIGZvdW5kIG91dC4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDQpCi0gRml4ZWQgYSBnZXRkYXRlIHByb2JsZW0gYnkgcG9zdC1yZXBsYWNpbmcgdGhlIGdldGRhdGUuYyBmaWxlIGFmdGVyIHRoZQogIGJpc29uL3lhY2MgcHJvY2VzcyB0byBhZGQgdGhlIGZpeCBIYXJzaGFsIFByYWRoYW4gc3VnZ2VzdGVkLiBUaGUgcHJvYmxlbQogIGNhdXNlZCBhIGNyYXNoIG9uIFdpbmRvd3Mgd2hlbiBwYXJzaW5nIHNvbWUgZGF0ZXMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDA0KQotIFJvbWFuIEtvaWZtYW4gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHNlbmQgRXhwZWN0OiAxMDAtY29udGludWUgb24gUE9TVHMKICBldmVuIHdoZW4gdG9sZCB0byB1c2UgSFRUUCAxLjAsIHdoaWNoIGlzIG5vdCBjb3JyZWN0LiBUZXN0IGNhc2UgMTgwIGFuZAogIDE4MSB2ZXJpZnkgdGhpcy4KCi0gQWRkZWQgdGVzdCBjYXNlIDE4MiB0byB2ZXJpZnkgdGhhdCB6ZXJvIGJ5dGUgdHJhbnNmZXJzIGNhbGwgdGhlIGNhbGxiYWNrCiAgcHJvcGVybHkuCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIHdyaXRlIGNhbGxiYWNrIGdldCBjYWxsZWQgZXZlbiB3aGVuIGEgemVybwogIGJ5dGUgZmlsZSBpcyBkb3dubG9hZGVkLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwNCkKLSBMaW5nIFRoaW8gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQgaXB2Ni1lbmFibGVkLCBpdCBzdGlsbCBkaWQKICByZXZlcnNlIEROUyBsb29rdXBzIHdoZW4gZmVkIHdpdGggYSBudW1lcmljYWwgSVAtYWRkcmVzcyAobGlrZQogIGh0dHA6Ly8xMjcuMC4wLjEvKSwgYWx0aG91Z2ggaXQgZG9lc24ndCB3aGVuIGJ1aWx0IGlwdjYtZGlzYWJsZWQuIGxpYmN1cmwKICBzaG91bGQgbmV2ZXIgZG8gcmV2ZXJzZSBsb29rdXBzLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwNCkKLSBLamV0aWwgSmFjb2JzZW4gbm90aWNlZCB0aGF0IHdoZW4gdHJhbnNmZXJyaW5nIGEgZmlsZTovLyBVUkwgcG9pbnRpbmcgdG8gYW4KICBlbXB0eSBmaWxlLCBsaWJjdXJsIHdvdWxkIHJldHVybiB3aXRoIHRoZSBmaWxlIHN0aWxsIG9wZW4uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbmVlZHMgdG8gZGVmaW5lCiAgX1RIUkVBRF9TQUZFIGZvciBBSVggc3lzdGVtcyB0byBtYWtlIGxpYmN1cmwgYnVpbHQgcmVhbGx5IHRocmVhZC1zYWZlLgoKICBBbHNvIGFkZGVkIGEgY2hlY2sgZm9yIHRoZSB4bGMgY29tcGlsZXIgb24gQUlYLCBhbmQgaWYgdGhhdCBpcyBkZXRlY3Qgd2UgdXNlCiAgdGhlIC1xdGhyZWFkZWQgY29tcGlsZXIgb3B0aW9uCgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDA0KQotIGxpYmN1cmwgbm93IGFsbG93cyBhIGN1c3RvbSAiQWNjZXB0LUVuY29kaW5nOiIgaGVhZGVyIG92ZXJyaWRlIHRoZQogIGludGVybmFsbHkgc2V0IG9uZSB0aGF0IGdldHMgc2V0IHdpdGggQ1VSTE9QVF9FTkNPRElORy4gUG9pbnRlZCBvdXQgYnkgQWxleC4KCi0gUm9sYW5kIEtyaWthdmEgZm91bmQgYW5kIGZpeGVkIGEgY29va2llIHByb2JsZW0gd2hlbiB1c2luZyBhIHByb3h5ICh0aGUKICBwYXRoIG1hdGNoaW5nIHdhcyB3cm9uZykuIEkgYWRkZWQgdGVzdCBjYXNlIDE3OSB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8KICByaWdodC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDQpCi0gQ2FzZXkgTydEb25uZWxsIGZpeGVkIHNvbWUgTVNWQyBtYWtlZmlsZSB0YXJnZXRzIHRvIGxpbmsgcHJvcGVybHkuCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDA0KQotIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBfWE9QRU5fU09VUkNFIHRvIDUwMCBvbiBzeXN0ZW1zIHRoYXQgbmVlZCBpdCB0byBidWlsZAogIHdhcm5pbmctZnJlZSAodGhlIG9ubHkga25vd24gb25lIHNvIGZhciBpcyBub24tZ2NjIGJ1aWxkcyBvbiA2NGJpdCBTR0kKICBJUklYKS4gKFJldmVydGVkIHRoaXMgY2hhbmdlIGxhdGVyIGFzIGl0IGNhdXNlZCBjb21waWxlciBlcnJvcnMuKQoKLSB0aGUgRlRQIGNvZGUgbm93IGluY2x1ZGVzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUKICBzZXJ2ZXIgZ2l2ZXMgYmFjayBhIDUzMCBhZnRlciB0aGUgcGFzc3dvcmQgaXMgcHJvdmlkZWQsIGFzIGl0IGlzbid0CiAgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgYSBiYWQgdXNlciBuYW1lIG9yIHBhc3N3b3JkLgoKVmVyc2lvbiA3LjEyLjEgKDEwIEF1Z3VzdCAyMDA0KQoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNCkKLSBJbiBPcGVuU1NMIDAuOS43ZCBhbmQgZWFybGllciwgQVNOMV9TVFJJTkdfdG9fVVRGOCBmYWlscyBpZiB0aGUgaW5wdXQgaXMKICBhbHJlYWR5IFVURi04IGVuY29kZWQuIFRoaXMgbWFkZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWwgaWYgdGhlCiAgcmVtb3RlIHNlcnZlciB1c2VkIGEgY2VydGlmaWNhdGUgd2l0aCB0aGUgbmFtZSBVVEYtOCBlbmNvZGVkLgoKICBXb3JrLWFyb3VuZCBicm91Z2h0IGJ5IEFsZXhpcyBTLiBMLiBDYXJ2YWxoby4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNCkKLSBJIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBrcmI0IHRvIHVzZSAtbGNvbV9lcnIgYXMgd2VsbCwgYXMgSSBzdGFydGVkCiAgdG8gZ2V0IGxpbmsgcHJvYmxlbXMgd2l0aCBpdCB1bmxlc3MgSSBkaWQgdGhhdCBvbiBteSBTb2xhcmlzIDIuNyBib3guIEkKICBkb24ndCB1bmRlcnN0YW5kIHdoeSBJIHN0YXJ0ZWQgdG8gZ2V0IHByb2JsZW1zIHdpdGggdGhpcyBub3chCgpEYW5pZWwgKDUgQXVndXN0IDIwMDQpCi0gRW5yaWNvIFNjaG9seiBmaXhlZCB0aGUgSFRUUC1OZWdvdGlhdGUgc2VydmljZSBuYW1lIHRvIGJlIHVwcGVyY2FzZSBhcwogIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEwMDQxMDUKCkRhbmllbCAoNCBBdWd1c3QgMjAwNCkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3QKICB1c2luZyBtdWx0aXBsZSBJUCAoYmFkKSBhZGRyZXNzZXMuCgotIER5bGFuIFNhbGlzYnVyeSBtYWRlIGxpYmN1cmwgbm8gbG9uZ2VyIGFjY2VwdCBjb29raWVzIHNldCB0byBhIFRMRCBvbmx5IChpdAogIHByZXZpb3VzbHkgYWxsb3dlZCB0aGF0IG9uIHRoZSBzZXZlbiB0aHJlZS1sZXR0ZXIgZG9tYWlucykuCgpEYW5pZWwgKDMxIEp1bHkgMjAwNCkKLSBKb2VsIENoZW4gcmVwb3J0ZWQgdGhhdCB0aGUgZGlnZXN0IGNvZGUgYXNzdW1lZCBxdW90ZXMgYXJvdW5kIHRoZSBjb250ZW50cyBhCiAgYml0IHRvbyBtdWNoLgoKRGFuaWVsICgyOCBKdWx5IDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGhlIGhvc3QgbmFtZSB0byBnZXQgc2V0dXAgcHJvcGVybHkgZXZlbiB3aGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQsIHdoZW4gYSBwcm94eSBpcyBpbiB1c2UuIFByZXZpb3VzbHkgdGhlIHdyb25nIEhvc3Q6CiAgaGVhZGVyIGNvdWxkIGdldCBzZW50IHdoZW4gcmUtdXNpbmcgYSBwcm94eSBjb25uZWN0aW9uIHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgotIEZpeGVkIEJyaWFuIEFraW5zJyByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIGR1cGxpY2F0ZSBIb3N0OiBoZWFkZXJzIG9uIHJlLXVzZWQKICBjb25uZWN0aW9ucy4gSWYgeW91IGF0dGVtcHRlZCB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgaW4gdGhlIHNlY29uZAogIHJlcXVlc3QsIHlvdSBnb3QgdHdvIHN1Y2ggaGVhZGVycyEKCi0gc3JjL01ha2VmaWxlLmFtIG5vdyBpbmNsdWRlcyB0aGUgTWFrZWZpbGUuaW5jIGZpbGUgdG8gZ2V0IGluZm8gYWJvdXQgZmlsZXMKCkRhbmllbCAoMjYgSnVseSAyMDA0KQotIE1hZGUgImN1cmwgW1VSTF0gLW8gbmFtZSMyIiB3b3JrIGFzIGV4cGVjdGVkLiBJZiB0aGVyZSdzIG5vIGdsb2JiaW5nIGZvciB0aGUKICAjLW51bWJlciwgaXQgd2lsbCBzaW1wbHkgYmUgdXNlZCBhcyAjMiBpbiB0aGUgZmlsZSBuYW1lLgoKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0ZXN0aW5nIHdpdGggdmFsZ3JpbmQgMi4xLnggYW5kIGFkZGVkIHR3byBtaXNzaW5nCiAgbmV3bGluZXMgaW4gdGhlIGNvb2tpZSBpbmZvcm1hdGlvbmFscy4KCkRhbmllbCAoMjQgSnVseSAyMDA0KQotIEkgZml4ZWQgdGhlIGF1dG9idWlsZHMgd2l0aCBhcmVzLCBzaW5jZSB0aGV5IG5vdyBuZWVkIHRvIGhhdmUgYnVpbGRjb25mIHJ1bgogIGluIHRoZSBhcmVzIGRpciBiZWZvcmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuLgoKLSBBZGRlZCBDYXNleSBPJ0Rvbm5lbGwncyBjdXJsX2Vhc3lfcmVzZXQoKSBmdW5jdGlvbi4gSXQgaGFzIGEgcHJvdG8gaW4KICBjdXJsL2N1cmwuaCBidXQgd2UgaGF2ZSBubyBtYW4gcGFnZSB5ZXQuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNCkKLSBBZGRlZCBidWlsZGNvbmYgYW5kIGJ1aWxkY29uZi5iYXQgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZXMsIHNpbmNlIHRoZXkgYXJlCiAgaGFuZHkgZm9yIHJlYnVpbGRpbmcgY3VybCB3aGVuIHVzaW5nIGEgZGFpbHkgc25hcHNob3QgKGFuZCBub3QgYSBwdXJlIENWUwogIGNoZWNrb3V0KS4KCkRhbmllbCAoMTYgSnVseSAyMDA0KQotIEFzIHN1Z2dlc3RlZCBieSBUb2J5IFBldGVyc29uLCBsaWJjdXJsIG5vdyBpZ25vcmVzIENvbnRlbnQtTGVuZ3RoIGRhdGEgaWYgdGhlCiAgZ2l2ZW4gc2l6ZSBpcyBhIG5lZ2F0aXZlIG51bWJlci4gVGVzdCBjYXNlIDE3OCB2ZXJpZmllcyB0aGlzLgoKRGFuaWVsICgxNCBKdWx5IDIwMDQpCi0gR/xudGVyIEtuYXVmIGhhcyBtYWRlIHRoZSBOZXR3YXJlIGJ1aWxkcyBkbyB3aXRob3V0IHRoZSBjb25maWctbmV0d2FyZS5oCiAgZmlsZXMsIHNvIHRoZXkgYXJlIG5vdyByZW1vdmVkIGZyb20gdGhlIGRpc3QgcGFja2FnZXMuCgotIEf8bnRlciBLbmF1ZiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgYnVpbGQgd2l0aCBCb3JsYW5kIGFnYWluLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIHRoZSBjb21tb24gdGVzdCA1MDUgZmFpbHVyZXMgb24gd2luZG93cy4KCkRhbmllbCAoNiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSB3aW5kb3dzIHRlc3RzIGZhaWxlZCBvbiBmaWxlOi8vICJ1cGxvYWRzIi4KCkRhbmllbCAoMiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSByZXBvcnRlZCBhIGN1cmxfc2hhcmVfY2xlYW51cCgpIGNyYXNoIHRoYXQgb2NjdXJzIHdoZW4gbm8KICBsb2NrL3VubG9jayBjYWxsYmFja3MgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIHNoYXJlIGlzIGNsZWFuZWQgdXAuCgpEYW5pZWwgKDEgSnVseSAyMDA0KQotIFdoZW4gdXNpbmcgY3VybCAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWksIG5vIHRyYWNlIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50CiAgYnkgY3VybF9lYXN5X2NsZWFudXAoKSB3ZXJlIGluY2x1ZGVkIGluIHRoZSB0cmFjZSBmaWxlLiBUaGlzIG1hZGUgdGhlCiAgbWVzc2FnZSAiQ2xvc2luZyBjb25uZWN0aW9uICMwIiBuZXZlciBhcHBlYXIgaW4gdHJhY2UgZHVtcHMuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNCkKLSBOaWVscyB2YW4gVG9uZ2VyZW4gZm91bmQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIFRSVUUgZG9lc24ndCBkaXNhYmxlCiAgYSBwcmV2aW91c2x5IHNldCBQT1NUIHJlcXVlc3QsIG1ha2luZyBhIHZlcnkgb2RkIHJlcXVlc3QgZ2V0IHNlbnQgKHVubGVzcwogIHlvdSBkaXNhYmxlZCB0aGUgUE9TVCkgYSBIRUFEIHJlcXVlc3Qgd2l0aCBhIFBPU1QgcmVxdWVzdC1ib2R5LiBJJ3ZlIG5vdwogIG1hZGUgQ1VSTE9QVF9OT0JPRFkgZW5mb3JjZSBhIHByb3BlciBIRUFELiBBZGRlZCB0ZXN0IGNhc2UgNTE0IGZvciB0aGlzLgoKRGFuaWVsICgyOSBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIG1hZGUgdGhlIHRlc3RjdXJsLnBsIHNjcmlwdCBjYXBhYmxlIG9mIHVzaW5nIGEgY3VzdG9tIHNldHVwCiAgZmlsZSB0byBlYXNpZXIgcnVuIG11bHRpcGxlIGF1dG9idWlsZHMgb24gdGhlIHNhbWUgc291cmNlIHRyZWUuCgotIEdpc2xlIGZpeGVkIHRoZSBkamdwcCBidWlsZCBhbmQgZml4ZWQgYSBtZW1vcnkgcHJvYmxlbSBpbiBzb21lIG9mIHRoZQogIHJlb3JnZWQgbmFtZSByZXNvbHZlZCBjb2RlLgoKLSBGaXhlZCBjb2RlIHRvIGFsbG93IGNvbm5lY3RzIGRvbmUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0byBhdHRlbXB0IHRoZQogIG5leHQgSVAgd2hlbiBjb25uZWN0aW5nIHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvIG11bHRpcGxlIElQcyBhbmQgYQogIGNvbm5lY3QgYXR0ZW1wdCBmYWlscy4KCkRhbmllbCAoMjcgSnVuZSAyMDA0KQotIEJhc2VkIG9uIFJvYiBTdGFuemVsJ3MgYnVnIHJlcG9ydCAjOTc5NDgwLCBJIHdyb3RlIGEgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgcG9sbCgpIGNhbiBiZSB1c2VkIHRvIHdhaXQgb24gTlVMTCBhcyBvdGhlcndpc2Ugc2VsZWN0KCkgc2hvdWxkIGJlCiAgdXNlZCB0byBkbyBpdC4gVGhlIHNlbGVjdCgpIHVzYWdlIHdhcyBhbHNvIGZpeGVkIGFjY29yZGluZyB0byBoaXMgcmVwb3J0LgoKICBNYWMgT1MgWCAxMC4zIHNheXMgInBvbGwoKSBmdW5jdGlvbmFsaXR5IGZvciBNYWMgT1MgWCBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KICBlbXVsYXRpb24gbGF5ZXIgb24gdG9wIG9mIHNlbGVjdCgpLCBub3QgaW4gdGhlIGtlcm5lbCBkaXJlY3RseS4gSXQgaXMKICByZWNvbW1lbmRlZCB0aGF0IHByb2dyYW1zIHJ1bm5pbmcgdW5kZXIgT1MgWCAxMC4zIHByZWZlciBzZWxlY3QoKSBvdmVyCiAgcG9sbCgpLiBDb25maWd1cmUgc2NyaXB0cyBzaG91bGQgbG9vayBmb3IgdGhlIF9QT0xMX0VNVUxfSF8gZGVmaW5lIChpbnN0ZWFkCiAgb2YgX1BPTExfSF8gb3IgX1NZU19QT0xMX0hfKSBhbmQgYXZvaWQgaW1wbGVtZW50YXRpb25zIHdoZXJlIHBvbGwgaXMgbm90CiAgaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbC4iCgogIFllcywgd2UgY2FuIHByb2JhYmx5IHVzZSBzZWxlY3QoKSBvbiBtb3N0IHBsYXRmb3JtcyBidXQgdG9kYXkgSSBwcmVmZXJlZCB0bwogIGxlYXZlIHRoZSBjb2RlIHVuYWx0ZXJlZC4KCkRhbmllbCAoMjQgSnVuZSAyMDA0KQotIFRoZSBzdGFuZGFyZCBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IG9ubHkgaW5jbHVkZXMgdmVyc2lvbiBpbmZvIGFib3V0CiAgaW52b2x2ZWQgbGlicmFyaWVzIGFuZCBub3QgYWJvdXQgcGFydGljdWxhciBmZWF0dXJlcy4gVGh1cyBpdCB3aWxsIG5vIGxvbmdlcgogIGluY2x1ZGUgaW5mbyBhYm91dCBpcHY2IG5vciBHU1MuIFRoYXQgaW5mbyBpcyBvZiBjb3Vyc2Ugc3RpbGwgYXZhaWxhYmxlIGluCiAgdGhlIGZlYXR1cmUgYml0bWFzayBjdXJsX3ZlcnNpb25faW5mbygpIG9mZmVycy4KCi0gUmVwbGFjZWQgYWxsIG9jY3VyYW5jZXMgb2Ygc3ByaW50ZigpIHdpdGggc25wcmludGYoKS4gVGhpcyBpcyBtb3N0bHkgYmVjYXVzZQogIGl0IGlzICJBIEdvb2QgVGhpbmciIHJhdGhlciB0aGFuIGFjdHVhbGx5IGZpeGluZyBhbnkga25vd24gcHJvYmxlbS4gVGhpcwogIHdpbGwgaGVscCBwcmV2ZW50aW5nIGZ1dHVyZSBwb3NzaWJsZSBtaXN0YWtlcyB0byBjYXVzZSBidWZmZXIgb3ZlcmZsb3dzLgoKLSBNYWpvciByZW9yZ2FuaXphdGlvbiBpbiB0aGUgaG9zdCByZXNvbHZlIGNvZGUgKGFnYWluKS4gVGhpcyB0aW1lLCBJJ3ZlCiAgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm93IGFsd2F5cyB1c2UgYSBsaW5rZWQgbGlzdCBvZiBDdXJsX2FkZHJpbmZvIHN0cnVjdHMKICB0byByZXR1cm4gcmVzb2x2ZWQgaW5mbyBpbiwgbm8gbWF0dGVyIHdoYXQgcmVzb2x2ZXIgbWV0aG9kIG9yIHN1cHBvcnQgdGhhdAogIGlzIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0uIEl0IG1ha2VzIGl0IGEgbG90IGVhc2llciB0byB3cml0ZSBjb2RlIHRoYXQKICB1c2VzIG9yIGRlcGVuZHMgb24gcmVzb2x2ZWQgZGF0YS4KCiAgSW50ZXJuYWxseSwgdGhpcyBtZWFucyBhbW9uZ3N0IG90aGVyIHRoaW5ncyB0aGF0IHdlIGNhbiBzdG9wIGRvaW5nIHRoZSB3ZWlyZAogICJpbmNyZWFzZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCB3b3JrcyIgdHJpY2sgd2hlbiByZXNvbHZpbmcgaG9zdHMgb24KICBpcHY0LW9ubHkgd2l0aCBnZXRob3N0YnluYW1lX3IoKSwgd2Ugc3VwcG9ydCBzb2NrcyBldmVuIG9uIGxpYmN1cmxzIGJ1aWx0CiAgd2l0aCBpcHY2IGVuYWJsZWQgKGJ1dCBvbmx5IHRvIHNvY2tzIHNlcnZlcnMgdGhhdCByZXNvbHZlIHRvIGFuIGlwdjQKICBhZGRyZXNzKSBhbmQgd2Ugbm8gbG9uZ2VyIGRlZXAtY29weSBvciByZWxvY2F0ZSBob3N0ZW50IHN0cnVjdHMgKHdlIGNyZWF0ZQogIEN1cmxfYWRkcmluZm8gY2hhaW5zIGluc3RlYWQpLgoKICBUaGUgbmV3ICJob3N0ZW50IHRvIEN1cmxfYWRkcmluZm8iIGNvbnZlcnRlciBmdW5jdGlvbiBpcyBuYW1lZCBDdXJsX2hlMmFpKCkKICBhbmQgaXMgc2xpZ2h0bHkgbmFpdmUgYW5kIHNpbXBsZSwgeWV0IEkgYmVsaWV2ZSBpdCBpcyBmdW5jdGlvbmFsIGVub3VnaCB0bwogIHdvcmsgZm9yIGxpYmN1cmwuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNCkKLSBEYXZpZCBDb2hlbiBwb2ludGVkIG91dCB0aGF0IFJGQzIxMDkgc2F5cyBjbGllbnRzIHNob3VsZCBhbGxvdyBjb29raWVzIHRvCiAgY29udGFpbiBsZWFzdCA0MDk2IGJ5dGVzIHdoaWxlIGxpYmN1cmwgb25seSBhbGxvd2VkIDIwNDcuIEkgcmFpc2VkIHRoZSBsaW1pdAogIHRvIDQ5OTkgbm93IGFuZCBtYWRlIHRoZSB1c2VkIGJ1ZmZlciBnZXQgbWFsbG9jKCllZCBpbnN0ZWFkIG9mIHNpbXBseQogIGFsbG9jYXRlZCBvbiBzdGFjayBhcyBiZWZvcmUuIEV4dGVuZGVkIHRlc3QgY2FzZSA0NiB0byBpbmNsdWRlIGEgY29va2llIHdpdGgKICB2ZXJ5IGh1Z2UgY29udGVudCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gR/xudGVyIEtuYXVmIGZpeGVkIGdldGRhdGUueSB0byByZW1vdmUgYSBmZXcgd2FybmluZ3MuIEkgcmVtb3ZlZCB0aGUKICBpZmRlZidlZCB0ZXN0IHdlIG5ldmVyIGV2ZXIgdXNlIGFueXdheS4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNlcnRpZmljYXRlIHdpbGRjYXJkIGNoZWNrcyB0byBzdXBwb3J0IGEgJyonLWxldHRlcgogIGFueXdoZXJlIGluIHRoZSB3aWxkY2FyZCBzdHJpbmcsIHN1cHBvcnQgbXVsdGlwbGUgJyonLWxldHRlcnMgaW4gdGhlCiAgd2lsZGNhcmQgYW5kIHRvIGFsbG93IHRoZSAnKictbGV0dGVyIHRvIG1hdGNoIGEgc3RyaW5nIHRoYXQgaW5jbHVkZXMgYSBkb3QuCgpEYW5pZWwgKDIxIEp1bmUgMjAwNCkKLSB0ZXN0Y3VybC5zaCBpcyBub3cgcmVtb3ZlZCBjb21wbGV0ZWx5LCB0ZXN0cy90ZXN0Y3VybC5wbCBpcyB0aGUgc2NyaXB0IHRvCiAgdXNlIHdoZW4gYXV0b2J1aWxkaW5nIGN1cmwhCgotIEtqZXRpbCBKYWNvYnNlbiBicm91Z2h0IG15IGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0IHlvdSBjYW5ub3QgcHJvcGVybHkKICBhYm9ydCBhbiB1cGxvYWQgd2l0aCB0aGUgcmVhZGZ1bmN0aW9uIGNhbGxiYWNrLCBzaW5jZSByZXR1cm5pbmcgMCBvciAtMSBvbmx5CiAgc3RvcHMgdGhlIHVwbG9hZCBhbmQgbGliY3VybCB3aWxsIGNvbnRpbnVlIHdhaXRpbmcgZm9yIGRvd25sb2FkZWQgZGF0YSBhbmQKICB0aGUgc2VydmVyIG9mdGVuIHdhaXRzIGZvciB0aGUgcmVzdCBvZiB0aGUgdXBsb2FkIGRhdGEgdG8gYXJyaXZlLgoKICBUaHVzLCBJJ3ZlIG5vdyBhZGRlZCB0aGUgYWJpbGl0eSBmb3IgcmVhZCBjYWxsYmFja3MgdG8gcmV0dXJuCiAgQ1VSTF9SRUFERlVOQ19BQk9SVCB0byBhYm9ydCBhbiB1cGxvYWQgZnJvbSBhIHJlYWQgY2FsbGJhY2suIFRoaXMgd2lsbCBzdG9wCiAgdGhlIHRyYW5zZmVyIGltbWVkaWF0ZWx5IHdpdGggYSBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLIHJldHVybiBjb2RlLgoKICBUZXN0IGNhc2UgNTEzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCBpdCB3b3Jrcy4gSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdAogIEhUVFAgc2VydmVyIHRvbyB0byBkdW1wIHRoZSByZXF1ZXN0IHRvIGEgZmlsZSBldmVuIHdoZW4gdGhlIGNsaWVudAogIGRpc2Nvbm5lY3RzIHByZW1hdHVyZWx5LgoKRGFuaWVsICgxOSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcHJvdmlkZWQgYSB0ZXN0IGNhc2Ugd2l0aCBhIGZhaWxpbmcgY3VybCBvcGVyYXRpb246IHdoZW4gd2UgUE9TVAogIHRvIGEgc2l0ZSB3aXRoIC0tZGlnZXN0IChvciBzaW1pbGFyKSBzZXQsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgMzAyCiAgTG9jYXRpb246IHRvIHRoZSAiYXV0aHByb2JlIiByZXF1ZXN0LCBpdCB3YXMgbm90IHRyZWF0ZWQgY29ycmVjdGx5LiBXZSBzdGlsbAogIHdpbGwgYmVoYXZlIGJhZGx5IGlmIEZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQgZm9yIHRoaXMgY2FzZSwgYnV0IEknbSBub3QKICBpbiB0aGUgbW9vZCB0byBkaXZlIGludG8gdGhpcyByaWdodCBub3cgYW5kIHdpbGwgbGVhdmUgaXQgYXMtaXMgZm9yIG5vdy4KICBWZXJpZmllZCBteSBmaXggd2l0aCB0ZXN0IGNhc2UgMTc3LgoKRGFuaWVsICgxOCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IHByb3ZpZGVzIG1vcmUgZGV0YWlscyBmcm9tIHRoZSBTU0wgbGF5ZXJzIChpZiB5b3UKICB1c2UgYW4gT3BlblNTTCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXQpLiBJdCBhbHNvIGludHJvZHVjZXMgdHdvIG5ldyB0eXBlcwogIG9mIGRhdGEgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgZGVidWcgY2FsbGJhY2s6IENVUkxJTkZPX1NTTF9EQVRBX0lOIGFuZAogIENVUkxJTkZPX1NTTF9EQVRBX09VVC4KCi0gV2l0aCBEYXZpZCBCeXJvbidzIHRlc3Qgc2VydmVyIEkgY291bGQgcmVwZWF0IGhpcyBwcm9ibGVtIGFuZCBtYWtlIHN1cmUgdGhhdAogIFBPU1Rpbmcgb3ZlciBIVFRQUzovLyB3aXRoIE5UTE0gd29ya3MgZmluZSBub3cuIFRoZXJlIHdhcyBhIGdlbmVyYWwgcHJvYmxlbQogIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiB3aXRoIG5vbi1HRVQgb3BlcmF0aW9ucyB3aXRoIENPTk5FQ1QuCgpEYW5pZWwgKDE2IEp1bmUgMjAwNCkKLSBNb2RpZmllZCB0byBrZWVwIHRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGluIGFuIGN1cmxfb2ZmX3QsIG5vdCBhbiBpbnQgYXMKICBiZWZvcmUuIDMyYml0cyBpcyBub3QgZW5vdWdoLiBUaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBidWcgSmVhbi1Mb3VpcyBMZW1haXJlCiAgcmVwb3J0ZWQgdGhhdCBtYWtlcyAyR0IgRlRQIHVwbG9hZHMgdG8gcmVwb3J0IGVycm9yICgidW5hbGlnbmVkIGZpbGUgc2l6ZXMiKQogIHdoZW4gY29tcGxldGVkLgoKRGFuaWVsICgxNSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgSSBmaXhlZDogaWYgeW91IGRpZCBhIFBPU1Qgd2l0aAogIENVUkxBVVRIX0RJR0VTVCBzZXQgYnV0IHRoZSBzZXJ2ZXIgZGlkbid0IHJlcXVpcmUgYW55IGF1dGhlbnRpY2F0aW9uLAogIGxpYmN1cmwgd291bGQgcmVwZWF0ZWRseSBzZW5kIEhFQUQgbG90cyBvZiB0aW1lcyB1bnRpbCBpdCBnaXZlcyB1cC4gVGhpcyB3YXMKICBhY3R1YWxseSB0aGUgY2FzZSBmb3IgYWxsIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb25zLiBBZGRlZCB0ZXN0IGNhc2UgMTc0LAogIDE3NSBhbmQgMTc2IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBKdW5lIDIwMDQpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyB1cGxvYWRpbmcgZmlsZXMgbm8gbG9uZ2VyIGluc2VydHMgdGhlIGZpbGVzIHRoZW1zZWx2ZXMKICBpbnRvIHRoZSBodWdlIHByZWJ1aWx0IGNodW5rLiBUaGlzIGVuYWJsZXMgbGliY3VybCB0byBmb3JtcG9zdCBmaWxlcyB0aGF0IGlzCiAgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBzeXN0ZW0gbWVtb3J5LiBXaGVuIHRoZSBmaWxlIGdpdmVuIGlzIHBhc3NlZCBvbgogIHN0ZGluLCBsaWJjdXJsIHN0aWxsIHVzZXMgdGhlIG9sZCBtZXRob2Qgb2YgcmVhZGluZyB0aGUgZnVsbCBmaWxsIGJlZm9yZSB0aGUKICB1cGxvYWQgdGFrZXMgcGxhY2UuIFRoaXMgYXBwcm9hY2ggd2FzIHNlbGVjdGVkIGluIG9yZGVyIHRvIG5vdCBhbHRlciB0aGUKICBiZWhhdmlvciBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLCBhcyB3aGVuIHVzaW5nIHN0ZGluIGxpYmN1cmwgY2FuJ3Qga25vdwogIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBvbgogIEhUVFAgMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNCkKLSBHaXNsZSBmb3VuZCBvdXQgdGhhdCB3ZSBkaWQgd2lsZGNhcmQgY2VydCBuYW1lIGNoZWNrcyB3cm9uZywgc28gdGhhdCBwYXJ0cwogIG9mIHRoZSBjaGVjayB3cm9uZ2x5IHdhcyBjYXNlIHNlbnNpdGl2ZS4KCkRhbmllbCAoMTEgSnVuZSAyMDA0KQotIFRpbSBTbmVkZG9uIGJyb3VnaHQgYSBtaW5vciBWTVMgZml4IHRvIG1ha2UgY3VybCBidWlsZCBwcm9wZXJseSBvbiBoaXMgVk1TCiAgbWFjaGluZS4gSGUgYWxzbyBoYWQgc29tZSBpbnRlcmVzdGluZyBsaWJjdXJsIHBhdGNoZXMuLi4gdGhleSBtaWdodCBiZSBhYmxlCiAgdG8gZG8gaW4gYSBzbGlnaHRseSBuaWNlciB3YXkuIERpc2N1c3Npb25zIGFyZSBpbiBwcm9ncmVzcy4KCkRhbmllbCAoMTAgSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY29kZSBjbGVhbnVwc20gYmV0dGVyIHZlcmJvc2Ugb3V0cHV0IGFuZCBiZXR0ZXIgY29ubmVjdAogIHRpbWVvdXQgaGFuZGxpbmcgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8KICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMuCgotIFN0ZXZlbiBCYXp5bCBhbmQgU2VzaHViYWJ1IFBhc2FtIHBvaW50ZWQgb3V0IGEgYnVnIG9uIHdpbjMyIHdoZW4gZnJlZWluZyB0aGUKICBwYXRoIGFmdGVyIGEgZmlsZTovLyB0cmFuc2Zlci4KCkRhbmllbCAoOSBKdW5lIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSAnY29uZmlndXJlIC0tZGlzYWJsZS1odHRwJyB3b3JrIHRvIGJ1aWxkIGxpYmN1cmwKICB3aXRob3V0IEhUVFAgc3VwcG9ydC4gSSBhZGRlZCBhIG5ldyByZXR1cm4gY29kZSBmb3IgY3VybF9mb3JtYWRkKCkgaW4gY2FzZQogIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGU6IENVUkxfRk9STUFERF9ESVNBQkxFRC4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZpbGUgaW4gdGhlIGdlbmVyYXRlZAogIGN1cmxsaWIuZHNwIGZpbGUsIGFuZCBub3cgcGVvcGxlIGJ1aWxkaW5nIHdpdGggdGhpcyBzaG91bGQgZ2V0IGEgbGliY3VybC5saWIKICBmaWxlIGdlbmVyYXRlZCBhcyBpdCB1c2VkIHRvIGRvIGJlZm9yZSB3ZSBnZW5lcmF0ZWQgdGhpcyBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwNCkKLSBNYXJ0eSBLdWhydCBmaXhlZCBhIG1pbm9yIGJ1aWxkIHByb2JsZW0gZm9yIFZNUy4KCkRhbmllbCAoNyBKdW5lIDIwMDQpCi0gUmV2ZXJ0ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmcm9tIHRoZSA0dGggc2luY2UgaXQgb2J2aW91c2x5IGRpZG4ndCB3b3JrLgogIFJlbWFkZSBpdCBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhdCBob3BlZnVsbHkgd29ya3MgYmV0dGVyLgoKRGFuaWVsICg0IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE5ldFdhcmUgYWdhaW4uCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBjaGVja3MgZm9yIHN0cmVycm9yX3IoKSBub3QgZXhpdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdoZW4gYnVpbHQgZm9yIGNyb3NzLWNvbXBpbGluZy4KCkRhbmllbCAoMyBKdW5lIDIwMDQpCi0gQ2hyaXMgR2F1a3JvZ2VyIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgdGVzdCcgYXR0ZW1wdHMgdG8gcnVuIHRoZSB0ZXN0cyBldmVuCiAgaWYgY3VybCBpcyBidWlsdCBjcm9zcy1jb21waWxlZC4gSSd2ZSBub3cgbWFkZSBpdCBvdXRwdXQgYSBzaG9ydCBtZXNzYWdlCiAgaW5zdGVhZCwgc2F5aW5nIGl0IGlzbid0IHBvc3NpYmxlIHRvIGRvLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBicm91Z2h0IEZUUCAzcmQgcGFydHkgdHJhbnNmZXIgc3VwcG9ydCB0byBsaWJjdXJsLgogIFlvdSBjYW4gbm93IHVzZSBsaWJjdXJsIHRvIHRyYW5zZmVyIGZpbGVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyB1c2luZwogIEZUUC4gVGhlcmUgYXJlIGEgYnVuY2ggb2YgbmV3IG9wdGlvbnMgdG8gY29udHJvbCB0aGlzIHdpdGg6CiAgIENVUkxPUFRfU09VUkNFX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfVVNFUlBXRAogICBDVVJMT1BUX1NPVVJDRV9QQVRICiAgIENVUkxPUFRfU09VUkNFX1BPUlQKICAgQ1VSTE9QVF9QQVNWX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfUFJFUVVPVEUKICAgQ1VSTE9QVF9TT1VSQ0VfUE9TVFFVT1RFCgogIChUaGV5IHN0aWxsIHJlbWFpbiB0byBiZSBkb2N1bWVudGVkIHByb3Blcmx5IGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbgogIHBhZ2UuKQoKICBXaGVuIHVzaW5nIHRoaXMsIHRoZSBvcmRpbmFyeSBDVVJMT1BUX1VSTCBzcGVjaWZpZXMgdGhlIHRhcmdldCBVUkwsIGFuZCB5b3UKICBzcGVjaWZ5IHRoZSBzb3VyY2UgZGF0YSB3aXRoIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gZnRwM3JkcGFydHkuYyBpcyBhCiAgbmV3IGV4YW1wbGUgc291cmNlIGNvZGUgc2hvd2luZyBob3cgdG8gdXNlIHRoaXMuCgotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIHByb3h5IHVzZXIgbmFtZSBhbmQKICBwYXNzd29yZCB3aGVuIGRvaW5nIHByb3h5IGF1dGhlbnRpY2F0aW9uLCBpdCBwcmV2aW91c2x5IGFsd2F5cyB1c2VkIHRoZSBob3N0CiAgdXNlciBuYW1lIGFuZCBwYXNzd29yZCEKCkRhbmllbCAoMiBKdW5lIDIwMDQpCi0gQ1VSTE9QVF9VUExPQUQgYW5kIENVUkxPUFRfUFVUIG5vdyBkbyB0aGUgZXhhY3Qgc2FtZSB0aGluZyBpbnRlcm5hbGx5LCB3aGljaAogIGZpeGVzIHNvbWUgb2xkIGNvbmZ1c2lvbnMgb24gd2hlbiB3aGljaCBvZiB0aGVzZSBzaG91bGQgYmUgdXNlZCBhbmQgd2hhdCB0aGUKICBkaWZmZXJlbmNlcyBhcmUuCgotIEFwcGxpZWQgR2lzbGUncyBmaXhlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSB3aXRoIGxjYy13aW4zMgoKVmVyc2lvbiA3LjEyLjAgKDIgSnVuZSAyMDA0KQoKRGFuaWVsICgxIEp1bmUgMjAwNCkKLSBJIGNsYXJpZmllZCB0aGUgLS1jcmVhdGUtZGlycyBvcHRpb24gc29tZXdoYXQgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgotIFJlbmF1ZCBEdWhhdXQgY29ycmVjdGVkIHRoZSBjdXJsX3VuZXNjYXBlIG1hbiBwYWdlLgoKLSBEYXZpZCBCeXJvbiBtb2RpZmllZCBvbmUgb2YgTWFzc2ltaWxpYW5vIFppY2NhcmRpJ3MgcmVjZW50IE1TVkMgbWFrZWZpbGUKICBjaGFuZ2VzIHRvIG5vdyBhZ2FpbiB1c2UgdGhlIG1tIGxpYiBieSBkZWZhdWx0LgoKRGFuaWVsICgyNiBNYXkgMjAwNCkKLSBNb2h1biBCaXN3YXMgYWRkZWQgcmVsZWFzZS16bGliIGFuZCBkZWJ1Zy16bGliIHRhcmdldHMgdG8gdGhlIE1TVkMgbGliY3VybAogIE1ha2VmaWxlCgotIERhdmlkIEJ5cm9uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gZG9pbmcgQ09OTkVDVCwKICBsaWtlIHdoZW4gYWNjZXNzaW5nIEhUVFBTIHNpdGVzIHdpaHQgYSBwcm94eS4gVGhpcyBwcm9iYWJseSBicm9rZSB3aGVuIEkKICByZXdyb3RlIHRoZSBhdXRoIHN0dWZmIHJlY2VudGx5LgoKLSBJIGFkZGVkIGZpbGV1cGxvYWQuYyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LCBzaG93aW5nIGhvdyBhbiB1cGxvYWQgdG8gYQogIGZpbGU6Ly8gVVJMIGlzIG1hZGUuCgpEYW5pZWwgKDI1IE1heSAyMDA0KQotIE1hc3NpbWlsaWFubyBaaWNjYXJkaSB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcy4KCkRhbmllbCAoMjQgTWF5IDIwMDQpCi0gbGliY3VybCBub3cgc3VwcG9ydHMgInVwbG9hZGluZyIgdG8gZmlsZTovLyBVUkxzLiBUZXN0IDIwNCBhbmQgMjA1IHdlcmUKICBhZGRlZCB0byB2ZXJpZnkuCgotIFNpbW9uIEpvc2Vmc3NvbiBhZGRlZCBhIGlkbl9mcmVlKCkgZnVuY3Rpb24gaW4gbGliaWRuIDAuNC41IGFzIGEgcmVhY3Rpb24gdG8KICBHaXNsZSdzIHByZXZpb3VzIG1haWwuIFdlIG5vdyB1c2UgdGhpcyBmdW5jdGlvbiwgYW5kIHRodXMgd2UgcmVxdWlyZSBsaWJpZG4KICAwLjQuNSBvciBsYXRlci4gTm8gZWFybGllciB2ZXJzaW9uIHdpbGwgZG8uCgotIFJvYmVydCBELiBZb3VuZyByZXBvcnRlZCB0aGF0IENVUkxPUFRfQ09PS0lFRklMRSBhbmQgQ1VSTE9QVF9DT09LSUUgY291bGQKICBub3QgYmUgdXNlZCBib3RoIGluIG9uZSByZXF1ZXN0LiBGaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE3MiB0byB2ZXJpZnkuCgpEYW5pZWwgKDIxIE1heSAyMDA0KQotIFdoaWxlIHRhbGtpbmcgdG8gaG9zdCBhLmIuYywgbGliY3VybCBkaWQgd3JvbmdseSBub3QgYWNjZXB0IGNvb2tpZXMgdGhhdAogIHdlcmUgc2V0IHRvIHRoZSBkb21haW4gLmEuYi5jICh0aGF0IGlzIHdpdGggYSBkb3QgcHJlZml4KS4gVGhpcyBpcyBub3cgZml4ZWQKICBhbmQgdGVzdCBjYXNlIDE3MSB2ZXJpZmllcyBpdC4KCkRhbmllbCAoMjAgTWF5IDIwMDQpCi0gSmVzc2UgTm9sbGVyIHJlcG9ydGVkIHRoYXQgdGhlIHVwbG9hZCBzcGVlZCBpbmZvIHJlcG9ydGVkIGJ5IGxpYmN1cmwgd2FzCiAgd3JvbmcuIFRoZSBzYW1lIHdhcyB0cnVlIGZvciB0aGUgZG93bmxvYWQgc3BlZWQuIEZpeGVkIG5vdy4KCkRhbmllbCAoMTkgTWF5IDIwMDQpCi0gRGF2aWQgQnlyb24gYWRkZWQgdGVzdCBjYXNlIDE3MCAtIHRoaXMgdXNlZCB0byBjcmFzaCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZgogIGN1cmwuCgpEYW5pZWwgKDE3IE1heSAyMDA0KQotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHRoYXQgYWRkcmVzc2VzIHR3byBmbGF3cyBpbiB0aGUgcGVlciBjZXJ0aWZpY2F0ZQogIG5hbWUgdmVyaWZpY2F0aW9uOgogIG8gd2hlbiBtdWx0aXBsZSBjb21tb24gbmFtZXMgYXJlIHVzZWQgKGFzIGluIHRoZSBjdXJsIHRlc3RzKSwgdGhlIGxhc3QgbmFtZQogICAgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCiAgbyBhbGxvdyBjb21wYXJpbmcgd2l0aCBlbmNvZGVkIHZhbHVlcywgYXQgbGVhc3Qgd2l0aCBCTVAgYW5kIElTTyBsYXRpbjEKICAgIGVuY29kZWQgVDYxc3RyaW5ncy4KCi0gQWxsIDE5MSB0ZXN0IGNhc2VzIHJ1biB0aHJvdWdoIHRoZSB0b3J0dXJlIHRlc3QgT0shICdtYWtlIHRlc3QtdG9ydHVyZScgaXMKICBub3cgYXZhaWxhYmxlIGluIHRoZSByb290IG1ha2VmaWxlIChvbiBjb25maWd1cmUtYmFzZWQgZW52aXJvbm1lbnRzKS4KCkRhbmllbCAoMTQgTWF5IDIwMDQpCi0gV2l0aCBhIHNsaWdodGx5IG1vZGlmaWVkIGZ0cHNlcnZlci5wbCBJJ3ZlIG5vdyBydW4gYWxtb3N0IGFsbCB0ZXN0cyB0aHJvdWdoCiAgd2l0aCBydW50ZXN0cy5wbCAtdC4gVGhpcyBpcyBnb29kbmVzcyEKCi0gU2luY2UgSSBoYXZlIGJlZW4gdW5hYmxlIHRvIGNvbnRhY3QgdGhlIENWUyBhZG1pbnMgZm9yIHNldmVyYWwgbW9udGhzLCBJJ3ZlCiAgZGVjaWRlZCB0aGF0IHRoZSBjdXJyZW50IENWUyBob3N0aW5nIHdhcyBub3QgZ29vZCBlbm91Z2guIEkndmUgbm93IG1vdmVkIHRoZQogIENWUyByZXBvIG9uY2UgYWdhaW4sIHNlZSBSRUFETUUgZm9yIHVwZGF0ZWQgY3ZzIGNoZWNrb3V0IGluc3RydWN0aW9ucy4KCkRhbmllbCAoMTMgTWF5IDIwMDQpCi0gcnVudGVzdHMucGwgLXQgbm93IHJ1bnMgZmluZSBhbGwgdGhlIHdheSB0byB0ZXN0IDEwMC4gSSBiZWxpZXZlIHRlc3QgY2FzZQogIDEwMCBmYWlscyBiZWNhdXNlIG9mIGFuIEZUUCBzZXJ2ZXIgcHJvYmxlbS4KCkRhbmllbCAoMTIgTWF5IDIwMDQpCi0gR2VuZXJhbCBjbGVhbnVwcyBhbGwgb3ZlciB0byBtYWtlIGxpYmN1cmwgc3Vydml2ZSBhbmQgZG8gd2VsbCB3aGVuIGEgbWVtb3J5CiAgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBydW50ZXN0cy5wbCAtdCBub3cgd29ya3MgZmluZSBmb3IgdGhlIGZpcnN0IDI2IHRlc3QKICBjYXNlcy4KCkRhbmllbCAoMTEgTWF5IDIwMDQpCi0gU2VzaHViYWJ1IFBhc2FtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGN1cmxfZ2xvYmFsX2luaXRfbWVtKCkgLQogIGxpa2Ugbm9ybWFsIGN1cmxfZ2xvYmFsX2luaXQoKSBidXQgYWxsb3dzIHRoZSBhcHAgdG8gcmVwbGFjZSBhbGwgbWVtb3J5CiAgZnVuY3Rpb25zIHdpdGggaXRzIG93biBzZXQuIEkgbW9kaWZpZWQgaXQgc2xpZ2h0bHkuCgotIEJhc2VkIG9uIEx1Y2EgQWx0ZWFzJyBjb21tZW50cywgSSBtb2RpZmllZCB0aGUgY3VybGxpYi5kc3AgZ2VuZXJhdGlvbiBjb2RlLgoKRGFuaWVsICgxMCBNYXkgMjAwNCkKLSBHaXNsZSBtYWlsZWQgU2ltb24gSm9zZWZzc29uIChvZiBsaWJpZG4gZmFtZSkgYWJvdXQgdGhlIGJlbmVmaXRzIG9mIGEKICBzZXBhcmF0ZSBmcmVlKCktZnVuY3Rpb24gYnkgdGhhdCBsaWIgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgaXMgZnJlZWQgYnkgdGhlCiAgc2FtZSBtZW1vcnkgc3Vic3lzdGVtIHRoYXQgYWxsb2NhdGVkIGl0LiBIZSByZXNwb25kZWQgcG9zaXRpdmVseSBhbmQgdGhpcwogIHdpbGwgbGlrZWx5IGNhdXNlIHVzIHRvIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYmlkbiBhcyBzb29uIGFzIFNpbW9uCiAgcmVsZWFzZXMgb25lIHdpdGggc3VjaCBhIGxpYmlkbl9mcmVlKCkgZnVuY3Rpb24uCgotIEphbWVzIEJ1cnNhIG1hZGUgcnVudGVzdHMucGwncyAtdCBvcHRpb24gd29yayBmb3IgYW55IGdpdmVuIHRlc3QgY2FzZSwgYW5kIEkKICBlZGl0ZWQgdG8gYWxsb3cgLWcgdG9vLiBOb3QgZXZlbiB0ZXN0IGNhc2UgMSB3b3JrZWQuLi4KCi0gTHVjYSBBbHRlYSBtYWRlIHRoZSBuYz0gZmllbGQgbm90IHVzZSBxdW90ZXMgaW4gb3V0Z29pbmcgSFRUUCBEaWdlc3QgaGVhZGVycy4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIHRlc3Qgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsIHRvCiAgcmVjb2duaXplIG91ciBvd24gcnVubmluZyBIVFRQIHNlcnZlci4KCkRhbmllbCAoNyBNYXkgMjAwNCkKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgdG8gY29uZGVyIG1hbGxvYygwKSBhcmVhcyBPSyB0bwogIGZyZWUoKSBhbmQgaGUgbWFkZSB0d28gZmFpbGVkLXJlc29sdmUgZXJyb3IgbWVzc2FnZXMgdXNlIHRoZSBuZXcgZGlzcGxheS0KICBuYW1lIGluc3RlYWQgb2YgdGhlIGludGVybmFsbHktdXNlZCBuYW1lLgoKLSBHaXNsZSBWYW5lbSB0cmllZCBjdXJsIHdpdGgKICB3d3cuZXRkb21lbmVuYXZua2FubWFrc2ltYWx0aW5uZWhvbGRlc2Vrc3RpdHJlYm9rc3RhdmVyc2xpa3NvbWRldHRlLmNvbQogIHdoaWNoIGNhdXNlZCBwcm9ibGVtcywgYW5kIEkgZml4ZWQgdGhlIHNpbmdsZSB6ZXJvIGJ5dGUgYnVmZmVyIG92ZXJ3cml0ZQogIHRoYXQgb2NjdXJyZWQgKGR1ZSB0byBhIHN0dXBpZCBwcm90b2NvbCBidWZmZXIgc2l6ZSBhbmQgcGFyc2VyKS4KCi0gTWFkZSB0aGUgbGliL2N1cmxsaWIuZHNwIGZpbGUgZ2V0IGdlbmVyYXRlZCBhdXRvbWF0aWNseSB3aGVuIGEgZGlzdHJpYnV0aW9uCiAgcGFja2FnZSBpcyBtYWRlLCB3aXRoIHRoZSBtc3ZjcHJvai4qIGZpbGVzIGFzIHRlbXBsYXRlcyBhbmQgYWxsCiAgd2luMzItc291cmNlcyBhZGRlZC4gSSB0aGluayB0aGlzIGNhbiBiZSBtYWRlIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhlIGFsd2F5cwogIGxhZ2dpbmctYmVoaW5kIHByZXZpb3VzIGFwcHJvYWNoLiBJJ20gbm90IHN1cmUgdGhpcyBidWlsZHMgYSB3b3JraW5nIHByb2plY3QKICBmaWxlIHJpZ2h0IG5vdyB0aG91Z2ghCgpEYW5pZWwgKDYgTWF5IDIwMDQpCi0gTWljaGFlbCBCZW5lZGljdCBicm91Z2h0IGEgZml4IHRoYXQgZmlsbHMgaW4gdGhlIGVycm9yYnVmZmVyIHByb3Blcmx5IHdoZW4KICBhcmVzIGZhaWxzIHRvIHJlc29sdmUgYSBuYW1lIGZvciBhIGNhc2Ugbm90IHByZXZpb3VzbHkgZGVhbHQgd2l0aCBsaWtlIHRoaXMuCgpEYW5pZWwgKDUgTWF5IDIwMDQpCi0gSm9lIEhhbHBpbiBmaXhlZCB0aGUgYW5ub3lpbmcgdHlwZWNhc3Qgd2FybmluZyBpbiBsaWIvbGRhcC5jCgotIEdpc2xlIFZhbmVtIGZpeGVzOgogIG8gbWVtZGVidWcgdG8gbm90IGFjY2VzcyBOVUxMIG9uIHNldmVyYWwgcGxhY2VzCiAgbyBsaWJjdXJsLmRlZjsgY3VybF9mb3JtcGFyc2UgaXMgZ29uZS4KICBvIHByb2dyZXNzLmM7IGZpeGVkIHRoZSBwZXJjZW50IHZhbHVlcyBiZWluZyB0cnVuY2VkIHRvIDAuCiAgbyBpZjJpcC4qOyBjb25zdGlmaWVkIHRoZSAnaW50ZXJmYWNlJyBhcmd1bWVudC4KCi0gVG9yIEFybnRzZW4gcmVwb3J0ZWQgdGhhdCBtYW55IG9mIGhpcyBhdXRvYnVpbGRzIGZyb3plIGFuZCBJIGZvdW5kIGFuZCBmaXhlZAogIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIHdpdGggdGhlIEhUVFAgYXV0aCBvdmVyaGF1bCB0aGF0IGNvdWxkIGxlYWQgdG8gYQogIG5ldmVyLWVuZGluZyBpbnRlcm5hbCByZXF1ZXN0LWxvb3AgZHVlIHRvIHVuLWluaXRpYWxpemVkIHZhcmlhYmxlcyEKCi0gUmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHZhcmlvdXMgY29tcGlsZXJzL3BsYXRmb3Jtcy4KCkRhbmllbCAoNCBNYXkgMjAwNCkKLSBjdXJsX2Zvcm1wYXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeS4gSXQgaGFzIGJlZW4gbWFya2VkIGFuZAogIG1lbnRpb25lZCBhcyBkZXByZWNhdGVkIGZvciBzZXZlcmFsIHllYXJzLgoKRGFuaWVsICgzIE1heSAyMDA0KQotIFJld3JpdHRlbiBIVFRQIGF1dGhlbnRpY2F0aW9uIGNvZGUuIFRoZSBwcmV2aW91cyBjb2RlIGNvdWxkIG5vdCBwcm9wZXJseQogIGRlYWwgd2l0aCB0aGUgYWRkZWQgdGVzdCBjYXNlcyAxNjcsIDE2OCBhbmQgMTY5LiBJJ3ZlIG5vdyByZXdyaXR0ZW4gdGhlIGNvZGUKICB0byBiZXR0ZXIgc2VwYXJhdGUgaG9zdCBhbmQgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIG5vdCByZS11c2UgdGhlIHNhbWUKICB2YXJpYWJsZXMgYXMgbXVjaCBhcyBiZWZvcmUgYXMgaXQgcHJvdmVkIG5vbiB3b3JraW5nIGluIHRoZSBtb3JlIGludm9sdmVkCiAgY2FzZXMuIEFsbCB0aGUgY3VycmVudCB0ZXN0cyBydW4gT0sgbm93LCBhbmQgc28gZG8gdGhlIG5ldyBvbmVzLiBUaGUgY3VybAogIHRvb2wgZ290IGEgbmV3IG9wdGlvbiBuYW1lZCAtLXByb3h5LWRpZ2VzdCB0byBlbmFibGUgSFRUUCBEaWdlc3QKICBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBwcm94eS4gSSBhbHNvIG1hZGUgdGhlIGxpYnJhcnkgc3VwcG9ydCBpdC4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgTERBUCBjb2RlIHdvcmsgd2l0aCB3bGRhcDMyLmRsbCBhcyBzdXBwbGllZCB3aXRoCiAgV2luLTk4L01FLzIwMDAvWFAsIHNvIG5vIGV4dHJhIC5kbGxzIGFyZSByZXF1aXJlZCB3aGVuIGN1cmwvbGliY3VybCBpcyB1c2VkCiAgb24gdGhlc2UgV2luZG93cyB2ZXJzaW9ucy4KCkRhbmllbCAoMzAgQXByaWwgMjAwNCkKLSBydW50ZXN0cy5wbCBub3cgc2NhbnMgdGhlIHZhbGdyaW5kIGxvZyBmb3IgdmFsZ3JpbmQtZGV0ZWN0ZWQgbWVtb3J5IGxlYWtzCiAgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgaWYgdmFsZ3JpbmQgd2FzIGZvdW5kIGFuZCB1c2VkLgoKLSBJIG1vZGlmaWVkIHRoZSBhcHAtY29kZSBpbiBjdXJsIHRvIGluY2x1ZGUgdGhlIG5ldyBsaWIvY3VybHguaCBhbmQgb25seQogIGFjY2VzcyB0aG9zZSBmdW5jdGlvbnMgdXNpbmcgdGhlIGN1cmx4Xy1wcmVmaXggaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBmdXR1cmUKICByZW1vdmFsIG9mIHNldmVyYWwgY3VybF8tZnVuY3Rpb25zIGZyb20gdGhlIHB1YmxpYyBsaWJjdXJsIEFQSS4KCi0gSW50cm9kdWNlZCBsaWIvY3VybHguaCBhcyBhIHNpbmdsZSBoZWFkZXIgdG8gcHJvdmlkZSB0aGUgY3VybHhfLWZ1bmN0aW9ucwogIHRvIGFwcHMuCgotIEFkZGVkIG5vdGljZXMgaW4gdGhlIG1hbiBwYWdlcyBmb3IgY3VybF9nZXRlbnYsIGN1cmxfbXByaW50ZiwgY3VybF9zdHJlcXVhbAogIGFuZCBjdXJsX3N0cm5lcXVhbCB0aGF0IHRoZXkgYXJlIHN1YmplY3QgZm9yIHJlbW92YWwgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICBTVE9QIFVTSU5HIFRIRVNFIEZVTkNUSU9OUy4KCi0gTWloYWkgSW9uZXNjdSBub3RpY2VkIGhlIGNvdWxkbid0IGRvIGZvcm1wb3N0cyB3aXRoIHdoaXRlc3BhY2UgaW4gdGhlIGZpbGUKICBuYW1lcyBhbmQgeWVzLCBJIGJyb2tlIHRoYXQgb24gQXByaWwgMjMuIFNpZ2guIEkgZml4ZWQgaXQgbm93IGFuZCBhZGRlZAogIHRlc3QgY2FzZSAxNjYgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBsZWZ0IGZyb20gdGhlIERpZ2VzdCBwYXRjaCBvZiB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDI5IEFwcmlsIDIwMDQpCi0gTWFkZSBJRE4gZG9tYWlucyB3b3JrIHdoZW4gc2VuZGluZyByZXF1c3RzIG92ZXIgSFRUUCBwcm94eSBhcyB3ZWxsLiBBZGRlZAogIHRlc3QgY2FzZSAxNjUgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgbmV3IGludGVybmFsIGhvc3QgbmFtZSBzZXR1cCB3aGVuIHJlLXVzaW5nIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgd2l0aCBhcmVzLWJ1aWx0IGxpYmN1cmwKICBjcmVhdGVkIGEgYmFkIGhhbmRsZSB0aGF0IHdvdWxkIGNyYXNoIGluIHRoZSBmaXJzdCBuYW1lIHJlc29sdmUgYXR0ZW1wdC4gVGhpcwogIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDUxMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHByb3ZpZGVkIGEgbWFqb3IgSFRUUCBEaWdlc3QgY29kZSBmaXggYW5kIGNsZWFudXAuIFdlIG5vdyBmb2xsb3cKICB0aGUgRGlnZXN0IFJGQyBhIGxvdCBiZXR0ZXIuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIFNTTCBjb2RlIHVzZSBFUlJfZXJyb3Jfc3RyaW5nX24oKSB3aGVyZSBhcHBsaWNhYmxlLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA0KQotIEkgcmVtb2RlbGVkIEdpc2xlJ3MgSUROIGNvZGUgc2xpZ2h0bHkgYW5kIG5vdyB3ZSBjb252ZXJ0IGJvdGggdGhlIGhvc3QgbmFtZQogIGFuZCBwcm94eSBuYW1lIHRvIHRoZSBBQ0UgZW5jb2RlZCB2ZXJzaW9uIHRvIHVzZSBpbnRlcm5hbGx5IGZvciByZXNvbHZlcyBhbmQKICBjb29raWVzIGV0Yy4gVGhleSBhcmUgbm93IHVzaW5nIG9uZSAnc3RydWN0IGhvc3RuYW1lJyBlYWNoIHRoYXQga2VlcCBib3RoCiAgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRoZSBwb3NzaWJseSBlbmNvZGVkIG5hbWUuIElETiByZXNvbHZlcyB3b3JrIGZvciBtZQogIG5vdyB1c2luZyBpcHY2LCBpcHY0IGFuZCBhcmVzIHJlc29sdmluZy4gRXZlbiBjb29raWVzIG9uIElETiBzaXRlcyBzZWVtIHRvCiAgZG8gcmlnaHQuIEkgZ290IHNvbWUgZmFpbHVyZXMgYXQgZmlyc3Qgd2hlbiBDSEFSU0VUIHdhc24ndCBzZXQgYXQgYWxsIHdoaWNoCiAgY29uZnVzZWQgbGliaWRuIGNvbXBsZXRlbHkgYW5kIGl0IGRlY2lkZWQgYnkgZW5jb2Rpbmcgb2YgY2hvaWNlIHdhcwogICdBTlNJX1gzLjQtMTk2OCcuLi4KCi0gbWFkZSAnY29uZmlndXJlIC0td2l0aG91dC1saWJpZG4nIHdvcmsKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBGaXhlZCB0aGUgc3JjL2h1Z2VoZWxwLmMgZmlsZSB0byBpbmNsdWRlICJzZXR1cC5oIiBpbnN0ZWFkIG9mICJjb25maWcuaCIgdG8KICBtYWtlIHRoZSBwcm9ibGVtcyB3aXRoIFVTRV9NQU5VQUwgb24gd2luZG93cyBnbyBhd2F5LgoKLSBjb25maWd1cmUgLS13aXRob3V0LXNzbCBjb3VsZCBzdGlsbCB3cm9uZ2x5IGluY2x1ZGUgc29tZSBPcGVuU1NMIGluZm8gaW4gdGhlCiAgTWFrZWZpbGVzIGlmIHBrZy1jb25maWcgaGFkIGluZm8gYWJvdXQgT3BlblNTTC4gQnVnICM5NDE3NjIgcmVwb3J0ZWQgYnkKICBNYXJ0aW4uCgotIFNpbmNlIHdlIGNhbiBub3cgYnVpbGQgYW5kIHVzZSBxdWl0ZSBhIGxhcmdlIHNldCBvZiAzcmQgcGFydHkgbGlicmFyaWVzLCBJCiAgZGVjaWRlZCBJIHdvdWxkIG1ha2UgY29uZmlndXJlIHByb2R1Y2UgYSBzdW1tYXJ5IGF0IHRoZSBlbmQgc2hvd2luZyB3aGF0CiAgbGlicmFyaWVzIGl0IHVzZXMgYW5kIGlmIG5vdCwgd2hhdCBvcHRpb24gdG8gdXNlIHRvIG1ha2UgaXQgdXNlIHRoYXQuIEkgYWxzbwogIGFkZGVkIHNvbWUgb3RoZXIgcmFuZG9tIGluZm8gdGhhdCBpcyBuaWNlIGluIGEgImNvbmZpZ3VyZSBzdW1tYXJ5IiBvdXRwdXQuCgotIEFwcGxpZWQgVG9tbXlUYW0ncyBwYXRjaCB0aGF0IG5vdyBtYWtlIGN1cmwgd29yayB3aXRoIHRlbG5ldCBhbmQgc3RkaW4KICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBUaGUgY2hhbmdlcyBmb3IgdG9kYXkgYmVsb3cgd2VyZSBtYWRlIGJ5IG1lIGFuZCBHaXNsZSBWYW5lbS4KCiAgVGhlIGZpbGUgcHJldmlvdXNseSBrbm93biBhcyBob3N0aXAuYyBoYXMgbm93IHVuZGVyZ29uZSBhIGh1Z2UgY2xlYW51cCBhbmQKICBzcGxpdDoKCiAgaG9zdGlwLmMgZXhwbGFpbmVkCiAgPT09PT09PT09PT09PT09PT09CgogIFRoZSBtYWluIENPTVBJTEUtVElNRSBERUZJTkVTIHRvIGtlZXAgaW4gbWluZCB3aGVuIHJlYWRpbmcgdGhlIGhvc3QqLmMKICBzb3VyY2UgZmlsZSBhcmUgdGhlc2U6CgogIENVUkxSRVNfSVBWNiAtIHRoaXMgaG9zdCBoYXMgZ2V0YWRkcmluZm8oKSBhbmQgZmFtaWx5LCBhbmQgdGh1cyB3ZSB1c2UKICB0aGF0LiBUaGUgaG9zdCBtYXkgbm90IGJlIGFibGUgdG8gcmVzb2x2ZSBJUHY2LCBidXQgd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8KICB0YWtlIHRoYXQgaW50byBhY2NvdW50LiBIb3N0cyB0aGF0IGFyZW4ndCBJUHY2LWVuYWJsZWQgaGF2ZSBDVVJMUkVTX0lQVjQKICBkZWZpbmVkLgoKICBDVVJMUkVTX0FSRVMgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gdXNlIGMtYXJlcyBmb3IgYXN5bmNocm9ub3VzCiAgbmFtZSByZXNvbHZlcy4gSXQgY2Fubm90IGhhdmUgRU5BQkxFX0lQVjYgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLCBhcwogIGMtYXJlcyBoYXMgbm8gaXB2NiBzdXBwb3J0LiBUaGlzIGNhbiBiZSBXaW5kb3dzIG9yICpuaXguCgogIENVUkxSRVNfVEhSRUFERUQgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gcnVuIHVuZGVyIChuYXRpdmUpCiAgV2luZG93cywgYW5kIHRoZW4gdGhlIG5hbWUgcmVzb2x2ZSB3aWxsIGJlIGRvbmUgaW4gYSBuZXcgdGhyZWFkLCBhbmQgdGhlCiAgc3VwcG9ydGVkIGFzeW5jaCBBUEkgd2lsbCBiZSB0aGUgc2FtZSBhcyBmb3IgYXJlcy1idWlsZHMuCgogIElmIGFueSBvZiB0aGUgdHdvIHByZXZpb3VzIGFyZSBkZWZpbmVkLCBDVVJMUkVTX0FTWU5DSCBpcyBkZWZpbmVkIHRvby4gSWYKICBsaWJjdXJsIGlzIG5vdCBidWlsdCB0byB1c2UgYW4gYXN5bmNocm9ub3VzIHJlc29sdmVyLCBDVVJMUkVTX1NZTkNIIGlzCiAgZGVmaW5lZC4KCiAgVGhlIGhvc3QqLmMgc291cmNlcyBmaWxlcyBhcmUgc3BsaXQgdXAgbGlrZSB0aGlzOgoKICBob3N0aXAuYyAgIC0gbWV0aG9kLWluZGVwZW5kZW50IHJlc29sdmVyIGZ1bmN0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMKICBob3N0YXN5bi5jIC0gZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RzeW4uYyAgLSBmdW5jdGlvbnMgZm9yIHN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0YXJlcy5jIC0gZnVuY3Rpb25zIGZvciBhcmVzLXVzaW5nIG5hbWUgcmVzb2x2ZXMKICBob3N0dGhyZS5jIC0gZnVuY3Rpb25zIGZvciB0aHJlYWRlZCBuYW1lIHJlc29sdmVzCiAgaG9zdGlwNC5jICAtIGlwdjQtc3BlY2lmaWMgZnVuY3Rpb25zCiAgaG9zdGlwNi5jICAtIGlwdjYtc3BlY2lmaWMgZnVuY3Rpb25zCgogIFRoZSBob3N0aXAuaCBpcyB0aGUgc2luZ2xlIHVuaXRlZCBoZWFkZXIgZmlsZSBmb3IgYWxsIHRoaXMuIEl0IGRlZmluZXMgdGhlCiAgQ1VSTFJFU18qIGRlZmluZXMgYmFzZWQgb24gdGhlIGNvbmZpZyouaCBhbmQgc2V0dXAuaCBkZWZpbmVzLgoKLSBBZGRlZCBmdW5jdGlvbiBoZWFkZXIgY29tbWVudHMgdG8gbWFueSBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBiZXR0ZXIKICBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZW0gYWxsLgoKLSBjb25maWd1cmUgLS13aXRoLWxpYmlkbiBpcyBub3cgc3VwcG9ydGVkLiBJdCBtYWtlcyB0aGUgY29uZmlndXJlIHNjcmlwdAogIGNoZWNrIGZvciBsaWJpZG4gbGlicyBhbmQgaW5jbHVkZSBmaWxlcyBpbiB0aGUgcHJlZml4IHBhdGggZ2l2ZW4uIElmIHlvdQogIHNheSAtLXdpdGgtbGliaWRuPS91c3IvbG9jYWwsIGl0IHdpbGwgY2hlY2sgZm9yIHRoZSBsaWIgaW4gL3Vzci9sb2NhbC9saWIKICBhbmQgdGhlIGluY2x1ZGVzIGluIC91c3IvbG9jYWwvaW5jbHVkZSBldGMuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBzdHJ1Y3QgYWdlZCBDVVJMVkVSU0lPTl9USElSRCBpbmNsdWRpbmcKICBsaWJpZG4gdmVyc2lvbiBpbmZvLiBUaGUgc3RyaW5nIGN1cmxfdmVyc2lvbigpIHJldHVybnMgYWxzbyBpbmNsdWRlcyBsaWJpZG4KICB2ZXJzaW9uIGluZm8sIGlmIGF2YWlsYWJsZS4KClZlcnNpb24gNy4xMS4yICgyNiBBcHJpbCAyMDA0KQoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEVyd2luIEF1dGhyaWVkIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwgZGlkbid0IGRvIHJpZ2h0CiAgaWYgeW91IGFscmVhZHkgaGFkIGEgc3JjL2h1Z2VoZWxwLmMgc291cmNlIGZpbGUgcHJlc2VudCAod2hpY2ggbW9zdCBwZW9wbGUKICBkbyBJIGd1ZXNzKS4gSXQgbm93IHVzZXMgdGhlIFVTRV9NQU5VQUwgZGVmaW5lIHByb3Blcmx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gZG9pbmcgKGZhaWxpbmcpIFdpbmRvd3MKICB0aHJlYWRlZCBuYW1lIHJlc29sdmVzLgoKLSBJIGFsc28gYWRkZWQgdGVzdCBjYXNlIDE2MyBqdXN0IHRvIG1ha2Ugc3VyZSAtRiAidmFyPTxmaWxlIiB3b3JrcyBmaW5lIGFuZAogIGNhbiBwYXNzIG9uIGNoYXJhY3RlcnMgc3VjaCBhcyBuZXdsaW5lcywgY2FycmlhZ2UtcmV0dXJuIGFuZCB0YWJzLgoKLSBXaGVuIHdlIGFkZGVkIHRlc3QgY2FzZSAxNjIgd2l0aG91dCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSByZXF1aXJlbWVudCBmaWVsZAogIGluIHRoZSB0ZXN0IG1ldGEgZGF0YSB3ZSBjb3VsZCBzZWUgdGhhdCBjdXJsIGRpZG4ndCBjb21wbGFpbiBpZiB5b3UgdXNlZAogIC0tcHJveHktbnRsbSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIGxpYmN1cmwgaXQgdXNlcyBoYXMgbm8gTlRMTSBzdXBwb3J0ISBJCiAgbm93IG1hZGUgaXQgY2hlY2sgdGhpcyBmaXJzdCwgYW5kIGl0IG5vdyBleGlzdHMgd2l0aCBhICJ0aGUgaW5zdGFsbGVkCiAgbGliY3VybCB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIiBtZXNzYWdlIGlmIGl0IGhhcHBlbnMgYWdhaW4uCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDQpCi0gRGF2aWQgQnlyb24gZm91bmQgYW5kIGZpeGVkIGEgc21hbGwgYnVnIHdpdGggdGhlIC0tZmFpbCBhbmQgYXV0aGVudGljYXRpb24KICBzdHVmZiBhZGRlZCBhIGZldyB3ZWVrcyBhZ28uICBUdXJucyBvdXQgdGhhdCBpZiB5b3Ugc3BlY2lmeSAtLXByb3h5LW50bG0gYW5kCiAgY29tbXVuaWNhdGUgd2l0aCBhIHByb3h5IHRoYXQgcmVxdWlyZXMgYmFzaWMgYXV0aGVudGljYXRpb24sIHRoZSBwcm94eQogIHByb3Blcmx5IHJldHVybnMgYSA0MDcsIGJ1dCB0aGUgZmFpbHVyZSBkZXRlY3Rpb24gY29kZSBkb2Vzbid0IHJlYWxpemUgaXQKICBzaG91bGQgZ2l2ZSB1cCwgc28gY3VybCByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAuIFRlc3QgY2FzZSAxNjIgYWRkZWQgdG8KICB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIGFsbG93IG5ld2xpbmVzIGluIHRoZSBjb250ZW50cyB3aGVuIGRvaW5nIC1GICJ2YXI9W2NvbnRlbnRzXSIKICBSb2JlcnQgTWFybG93IHJlcG9ydGVkLgoKLSBJZiBhIHRyYW5zZmVyIGlzIGZvdW5kIG91dCB0byBiZSBvbmx5IHBhcnRpYWwsIGxpYmN1cmwgd2lsbCBub3cgdHJlYXQgdGhhdAogIGFzIGEgcHJvYmxlbSBzZXJpb3VzIGVub3VnaCB0byBza2lwIHRoZSBmaW5hbCBRVUlUIGNvbW1hbmQgYmVmb3JlIGNsb3NpbmcKICB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBUbyBhdm9pZCB0aGUgcmlzayB0aGF0IGl0IHdpbGwgImhhbmciIHdhaXRpbmcgZm9yCiAgdGhlIFFVSVQgcmVzcG9uc2UuIEFkZGVkIHRlc3QgY2FzZSAxNjEgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgdGhlIGhldXJpc3RpY3MgZm9yIGRlYWxpbmcgd2l0aCB0aGUgdGVzdCAxNjAgc2NlbmFyaW8uIFdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCBhbmQgbm90aGluZyBhdCBhbGwgaXMgcmVjZWl2ZWQgZnJvbSBpdCAoYmVjYXVzZSB0aGUKICBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSwgd2Ugd2lsbCBub3cgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYSBmcmVzaCBuZXcKICBjb25uZWN0aW9uLiBUaGUgcHJldmlvdXMgRUNPTk5SRVNFVCBzdHVmZiBmcm9tIEphbnVhcnkgMzAgd2FzIHJlbW92ZWQgYWdhaW4KICBhcyBpdCBkaWRuJ3QgZGV0ZWN0IHRoZSBzaXR1YXRpb24gZ29vZCBlbm91Z2guCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDE2MCB0byB2ZXJpZnkgdGhhdCBjdXJsIHdvcmtzIGNvcnJlY3RseSB3aGVuIGl0IGdldHMgYQogIGNvbm5lY3Rpb24gcmVzZXQgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIGEgY29ubmVjdGlvbi4gSXQgc2hvdWxkIHRoZW4gc2ltcGx5CiAgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZCB0aGUgcmVxdWVzdC4KCkRhbmllbCAoMTkgQXByaWwgMjAwNCkKLSBObyBtb3JlIDUxMiBieXRlIGxpbWl0IGZvciBob3N0IG5hbWUgKGluY2x1c2luZyBuYW1lICsgcGFzc3dvcmQpIGluIGxpYmN1cmwuCiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkgZm9yIHRoZSB0eXBpY2FsIChzaG9ydGVyIFVSTCkKICBjYXNlLgoKLSBDbGVhbmVkIHVwIHRoZSBzb3VyY2VzIHRvIGJldHRlciB1c2UgdGhlIHRlcm1zICdob3N0bmFtZScgYW5kICdwYXRoJwogIGludGVybmFsbHkgd2hlbiByZWZlcnJpbmcgdG8gdGhhdCBkYXRhLiBUaGUgYnVmZmVycyB1c2VkIGZvciBrZWVwIHRoYXQgaW5mbwogIGlzIGNhbGxlZCAnbmFtZWJ1ZmZlcicgYW5kICdwYXRoYnVmZmVyJy4gTXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZAogIHRoYW4gdGhlIHByZXZpb3VzIG1lc3MuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgcnVudGVzdHMucGwgYWdhaW4gdG8gcmVtb3ZlIGFsbCBsb2cgZmlsZXMgaW4gdGhlIGxvZy8gZGlyIGJldHdlZW4KICBlYWNoIHRlc3QsIGFuZCB0aGVuIG1hZGUgLXAgZGlzcGxheSBhbGwgbm9uLXplcm8gYnl0ZSBmaWxlcyBpbiB0aGUgbG9nIGRpci4KICBJdCBzaG91bGQgbWFrZSB0aGF0IGRhdGEgbW9yZSB1c2FibGUgYW5kIGNvbnRhaW4gbGVzcyBydWJiaXNoLgoKLSBmdHBzZXJ2ZXIucGwgbm93IHByb2R1Y2VzIGxvZyBmaWxlcyBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBzd3Mgb25lcyBsb29rCiAgYW5kIHRoZXkgbm93IGFsc28gY29udGFpbnMgYSBiaXQgbW9yZSBkZXRhaWxzIHRvIGhlbHAgZGVidWdnaW5nIGZ0cAogIHByb2JsZW1zLgoKLSBSZW1vdmVkIHRoZSBmaXhlZCBtYXhpbXVtIGFtb3VudCBvZiBkaXIgbGV2ZWxzIHRoZSBGVFAgY29kZSBzdXBwb3J0ZWQuCiAgUHJldmlvdXNseSB3ZSBoYWQgYSBmaXhlZCBhcnJheSBmb3IgMTAwIGxldmVscywgbm93IHdlIHNhdmUgc3BhY2UgaW4gZWFjaAogIGhhbmRsZSBieSBhbGxvY2F0aW5nIG9ubHkgZm9yIGEgZmV3IGxldmVsIGJ5IGRlZmF1bHQgYW5kIHRoZW4gZW5sYXJnaW5nIHRoYXQKICBpbiBjYXNlIG9mIG5lZWQgKHdpdGggbm8gbWF4aW11bSBkZXB0aCkuIEFkanVzdGVkIHRlc3QgY2FzZSAxNDIgdG8gdmVyaWZ5CiAgdGhhdCAxNTAgZGlyIGxldmVscyB3b3JrIGZpbmUuICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeQogIGZvciB0aGUgdHlwaWNhbCAobm90IHZlcnkgZGVlcCkgY2FzZS4KCkRhbmllbCAoMTQgQXByaWwgMjAwNCkKLSBBc2tpbmcgZm9yIENVUkxfSVBSRVNPTFZFX1Y2IHdoZW4gaXB2NiBhZGRyZXNzZXMgY2FuJ3QgYmUgcmVzb2x2ZWQgd2lsbAogIG5vdyBjYXVzZSB0aGUgcmVzb2x2ZSBmdW5jdGlvbiB0byByZXR1cm4gTlVMTCBpbW1lZGlhdGVseS4gVGhpcyBmbGF3IHdhcwogIHBvaW50ZWQgb3V0IGJ5IEdpc2xlIFZhbmVtLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgLTQvLTYgYWN0dWFsbHkgc2V0IHRoZSBkZXNpcmVkIG9wdGlvbiB0byBsaWJjdXJsLgoKLSBydW50ZXN0cy5wbCBub3cgaGFzIGEgbmV3IG9wdGlvbiAoLXApIHRoYXQgd2lsbCBkaXNwbGF5ICJpbnRlcmVzdGluZyIgbG9nCiAgZmlsZXMgdG8gc3Rkb3V0IGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuIFRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlCiAgdXNlZCBpbiB0aGUgJ2Z1bGwtdGVzdCcgbWFrZSB0YXJnZXQgdGhhdCBpcyB1c2VkIGJ5IHRoZSBhdXRvYnVpbGQgdGVzdHMsIGFzCiAgd2UgdGhlbiBnZXQgYSBtdWNoIGJldHRlciBjaGFuY2UgdG8gdW5kZXJzdGFuZCAocmVtb3RlKSB0ZXN0IGZhaWx1cmVzIGJhc2VkCiAgb24gYXV0b2J1aWxkIGxvZ3MgYWxvbmUuCgpEYW5pZWwgKDEzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbXVsdGkgaW50ZXJmYWNlIHdvcmsgYWdhaW4gb24gV2luZG93cyBldmVuIHdoZW4gYnVpbHQKICB3aXRob3V0IGFyZXMuIEJlZm9yZSB0aGlzLCBzZWxlY3QoKSB3b3VsZCByZXR1cm4gLTEgZHVyaW5nIHRoZSBuYW1lIHJlc29sdmUKICBwaGFzZSBzaW5jZSBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJldHVybiBhbnkgZmRfc2V0IGF0IGFsbCB3aGljaCB3YXNuJ3QKICBhcHByZWNpYXRlZCEKCi0gY3VybF9lYXN5X2R1cGhhbmRsZSgpIG5vdyBkdXBsaWNhdGVzIHRoZSB0Y3Bfbm9kZWxheSBpbmZvIGFzIHdlbGwuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDQpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIHBhdGNoIGZvciB0aGUgTVNWQyBsaWJjdXJsIG1ha2VmaWxlIGZvciBidWlsZHMgd2l0aAogIHpsaWIuCgpEYW5pZWwgKDkgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBpbXByb3ZlZCB0aGUgdGltZXIgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fKl9USU1FLCBpdCBjYW4gbm93CiAgYmUgZG93biB0byB1c2VjIGlmIHRoZSBzeXN0ZW0gc3lwcG9ydHMgaXQuCgpEYW5pZWwgKDcgQXByaWwgMjAwNCkKLSBBIHJlcXVlc3QgdGhhdCBzZW5kcyAiRXhwZWN0OiAxMDAtY29udGludWUiIGFuZCBnZXRzIG5vdGhpbmcgYnV0IGEgc2luZ2xlCiAgMTAwIHJlc3BvbnNlIGJhY2sgd2lsbCBub3cgcmV0dXJuIGEgQ1VSTEVfR09UX05PVEhJTkcuIFRlc3QgMTU4IHZlcmlmaWVzLgoKLSBUaGUgc3RydG9vZmZ0KCkgbWFjcm8gaXMgbm93IG5hbWVkIGN1cmx4X3N0cnRvb2ZmdCgpIHRvIHVzZSB0aGUgY3VybHhfKgogIGFwcHJvYWNoIGZ1bGx5LgoKRGFuaWVsICg2IEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXhlZCBidWcgIzkyNzk3OSByZXBvcnRlZCBieSBOYXRoYW4gTydTdWxsaXZhbi4gVGhlIHByb2JsZW0KICBtYWRlIGxpYmN1cmwgb24gV2luZG93cyBsZWFrIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSBpbiBlYWNoIG5hbWUgcmVzb2x2ZQogIHdoZW4gbm90IHVzZWQgYXMgYSBETEwuCgotIE5ldyBhdXRoZW50aWNhdGlvbiBjb2RlIGFkZGVkLCBwYXJ0aWN1bGFybHkgbm90aWNhYmxlIHdoZW4gZG9pbmcgUE9TVCBvciBQVVQKICB3aXRoIERpZ2VzdCBvciBOVExNLiBsaWJjdXJsIHdpbGwgbm93IHVzZSBIRUFEIHRvIG5lZ290aWF0ZSB0aGUKICBhdXRoZW50aWNhdGlvbiBhbmQgd2hlbiBkb25lIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBQT1NULiBQcmV2aW91c2x5IGxpYmN1cmwKICBzZW50IFBPU1QgaW1tZWRpYXRlbHkgYW5kIGV4cGVjdGVkIHRoZSBzZXJ2ZXIgdG8gcmVwbHkgYSBmaW5hbCBzdGF0dXMgY29kZQogIHdpdGggYW4gZXJyb3IgYW5kIHRoZW4gbGliY3VybCB3b3VsZCBub3Qgc2VuZCB0aGUgcmVxdWVzdC1ib2R5IGJ1dCBpbnN0ZWFkCiAgc2VuZCB0aGVuIG5leHQgcmVxdWVzdCBpbiB0aGUgc2VxdWVuY2UuCgogIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIGR1ZSB0byBJSVM2IGJhcmZpbmcgb24gbGliY3VybCB3aGVuIHdlIGF0dGVtcHQKICB0byBQT1NUIHdpdGggTlRMTSBhdXRoZW50aWNhdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhlIHByb2JsZW1zIGlzIGZvdW5kIGluCiAgUkZDMjYxNiBzZWN0aW9uIDguMi4zIHJlZ2FyZGluZyBob3cgc2VydmVycyBzaG91bGQgZGVhbCB3aXRoIHRoZSAxMDAKICBjb250aW51ZSByZXF1ZXN0LWhlYWRlcjoKCiAgICAgICAgSWYgaXQgcmVzcG9uZHMgd2l0aCBhIGZpbmFsIHN0YXR1cyBjb2RlLCBpdCBNQVkgY2xvc2UgdGhlIHRyYW5zcG9ydAogICAgICAgIGNvbm5lY3Rpb24gb3IgaXQgTUFZIGNvbnRpbnVlIHRvIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAgcmVxdWVzdC4KCiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgSUlTIGNsZWFybHkgZGlkIGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIHRoaXMgY2FzZSwKICB3aGlsZSB0aGlzIG5ld2VyIHZlcnNpb24gZGVjaWRlZCBpdCBzaG91bGQgInJlYWQgYW5kIGRpc2NhcmQiLiBUaGF0IHdvdWxkJ3ZlCiAgZm9yY2VkIHVzIHRvIHNlbmQgdGhlIHdob2xlIFBPU1QgKG9yIFBVVCkgZGF0YSBvbmx5IHRvIGhhdmUgaXQgZGlzY2FyZGVkIGFuZAogIHRoZW4gYmUgZm9yY2VkIHRvIHNlbmQgaXQgYWdhaW4uIFRvIGF2b2lkIHRoYXQgaHVnZSBwZW5hbGl0eSwgd2Ugc3dpdGNoIHRvCiAgdXNpbmcgSEVBRCB1bnRpbCB3ZSBhcmUgYXV0aGVudGljYXRlZCBhbmQgdGhlbiBzZW5kIHRoZSBQT1NULgoKICBUaGUgb25seSBhY3R1YWwgZHJhd2JhY2sgSSBjYW4gdGhpbmsgb2YgKGV4Y2VwdCBmb3IgdGhlIG9kZCBzaXRlcyB0aGF0IG1pZ2h0CiAgdHJlYXQgSEVBRCBkaWZmZXJlbnRseSB0aGFuIHRoZXkgd291bGQgdHJlYXQgUE9TVC9QVVQgd2hlbiBnaXZlbiB0aGUgc2FtZQogIFVSTCkgaXMgdGhhdCBpZiB5b3UgZG8gUE9TVCB3aXRoIENVUkxBVVRIX0FOWSBzZXQgYW5kIHRoZSBzaXRlIHJlcXVpcmVzIE5PCiAgYXV0aGVudGljYXRpb24sIGxpYmN1cmwgd2lsbCBzdGlsbCB1c2UgYSBIRUFEIGluIGEgZmlyc3Qgcm91bmQgYW5kIHRoZW4gZG8gYQogIFBPU1QuCgogIElmIHlvdSBkbyBhIEhFQUQgb3IgYSBHRVQgb24gYSBzaXRlIHVzaW5nIENVUkxBVVRIX0FOWSwgbGliY3VybCB3aWxsIHNlbmQKICBhbiB1bi1hdXRoZW50aWNhdGVkIHJlcXVlc3QgYXQgb25jZSwgd2hpY2ggdGhlbiBpcyB0aGUgb25seSByZXF1ZXN0IGlmIHRoZQogIHNpdGUgcmVxdWlyZXMgbm8gYXV0aC4KCiAgQWxhbiBQaW5zdGVpbiBoZWxwZWQgbWUgd29yayBvdXQgdGhlIHByb3RvY29sIGRldGFpbHMgYnkgZmlndXJpbmcgb3V0IHdoeQogIGxpYmN1cmwgZmFpbGVkIGFuZCB3aGF0IElJUzYgZXhwZWN0cy4KCi0gVGhlIC0tbGltaXQtcmF0ZSBsb2dpYyB3YXMgY29ycmVjdGVkIGFuZCBub3cgaXQgd29ya3MgYSBsb3QgYmV0dGVyIGZvcgogIGhpZ2hlciBzcGVlZHMsIHN1Y2ggYXMgJzEwbScgb3Igc2ltaWxhci4gUmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjOTMwMjQ5LgoKLSBJbnRyb2R1Y2luZyBjdXJseF90dm5vdygpIGFuZCBjdXJseF90dmRpZmYoKSB1c2luZyB0aGUgbmV3IGN1cmx4XyogZmFzaGlvbi4KICAjaW5jbHVkZSAidGltZXZhbC5oIiBmcm9tIHRoZSBsaWIgZGlyIHRvIGdldCB0aGUgcHJvdG9zIGV0Yy4gIE5vdGUgdGhhdAogIHRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgbGliY3VybCBBUEkuIFRoZSBjdXJsIGFwcCBzaW1wbHkgdXNlcyB0aGUgc2FtZQogIHNvdXJjZSBmaWxlcyBhcyB0aGUgbGlicmFyeSBkb2VzIGFuZCB0aGVyZWZvcmUgdGhlIGZpbGUgbmVlZHMgdG8gYmUgY29tcGlsZWQKICBhbmQgbGlua2VkIHdpdGggY3VybCB0b28sIG5vdCBqdXN0IHdoZW4gY3JlYXRpbmcgbGliY3VybC4KCi0gbGliL3N0cmVycm9yLmMgbm8gbG9uZ2VyIHVzZXMgc3lzX25lcnIgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIHNpbmNlIGl0CiAgaXNuJ3QgcG9ydGFibGUgZW5vdWdoCgpEYW5pZWwgKDIgQXByaWwgMjAwNCkKLSBJbiB0aGUgY3VybF9zdHJucXVhbC4zIG1hbiBwYWdlLCB3ZSBub3cgcHJlcGVuZCB0aGUgbWFuMyBkaXIgdG8gdGhlIGZpbGUKICBuYW1lIHRvIHdvcmsgYmV0dGVyLiBBcyBwb2ludGVkIG91dCBieSBSb2JpbiBLYXkuCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIHByb2JsZW0gSSByZWNlbnRseSBhZGRlZCBpbiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgY29kZSB0aGF0CiAgYnJva2Ugc3Vic2Vjb25kIHJlc29sdXRpb24gZm9yIENVUkxJTkZPX1RPVEFMX1RJTUUuIEhlIGFsc28gcG9pbnRlZCBvdXQgYQogIG1pc3Rha2UgaW4gdGhlIGNvZGUgdGhhdCBwcm9kdWNlcyB0aGUgZmluYWwgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlcgogIHRoYXQgd291bGQgb2Z0ZW4gcHJldmVudCBpdCBmcm9tIGFjdHVhbGx5IGJlaW5nIHVwZGF0ZWQgdGhhdCBmaW5hbCB0aW1lLgoKRGFuaWVsICgxIEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gd2UgdXNlIGFyZXMgZm9yIG5hbWUKICByZXNvbHZlcyBhbmQgZGVjaWRlcyB0byB0aW1lLW91dCBiZWZvcmUgYXJlcyBkb2VzIGl0LiBUaGlzIGZpeCB1c2VzIHRoZQogIGJyYW5kIG5ldyBhcmVzX2NhbmNlbCgpIGZ1bmN0aW9uIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIGMtYXJlcyAxLjEuMC4KCiAgV2hlbiB0b2xkIHRvIGVuYWJsZSBhcmVzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciBwcmVzZW5jZSBvZgogIHRoZSBhcmVzX2NhbmNlbCBmdW5jdGlvbiB0byBhbGVydCB1c2VycyBpZiB0aGV5IGF0dGVtcHQgdG8gdXNlIGEgdG9vIG9sZAogIGMtYXJlcyBsaWJyYXJ5LgoKRGFuaWVsICgzMSBNYXJjaCAyMDA0KQotIFJveSBTaGFuIGZpeGVkIGEgZmxhdyB0aGF0IHByZXZlbnRlZCBhcmVzIG5hbWUgcmVzb2x2ZSB0aW1lb3V0cyB0byBvY2N1ciEKCi0gRGlyayBNYW5za2UgZm91bmQgb3V0IHRoYXQgbGliY3VybCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzb2x2ZXMgZmFyIHRvbwogIGVhc3kgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB0byB1c2UgKGMtKWFyZXMgZm9yIG5hbWUgcmVzb2x2aW5nLgoKLSBGdXJ0aGVyIERpZ2VzdCBmaXhpbmcgYW5kIGEgc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UgMTUzIG5vdyBtYWtlcyBtZSBiZWxpZXZlCiAgTWl0eiBXYXJrJ3MgcHJvYmxlbXMgYXJlIGZpeGVkLgoKLSBBbmRyZXMgR2FyY2lhIGZpZ3VyZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDYzLCB3aGlsZSB3b3JraW5nLCBvbmx5IHByb3ZlZCBhCiAgZmxhdyBpbiBsaWJjdXJsJ3MgJ2h0dHBfcHJveHknIHBhcnNlciB3aGVuIGEgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpcwogIHByb3ZpZGVkLiBUaGUgdXNlciBuYW1lIHdhcyBub3QgZXh0cmFjdGVkIHByb3Blcmx5IChhbmQgJ2h0dHAnIHdhcyBhbHdheXMKICB1c2VkIGFzIHVzZXIgbmFtZSkuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gb3VyIGlvY3Rsc29ja2V0KCkgdXNhZ2UuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDQpCi0gSm9lIEhhbHBpbiBmYWNlZCBwcm9ibGVtcyB3aXRoIHRoZSBnZXRuYW1laW5mbygpIGFyZ3VtZW50IGFpX2ZsYWdzIGFuZCB0aGUKICBwYXJ0aWN1bGFyIGJpdCBuYW1lZCAnTklfV0lUSFNDT1BFSUQnIG9uIFNvbGFyaXMgOSBmb3IgSW50ZWwuICBJJ3ZlIG5vdwogIHdyaXR0ZW4gYSBjb25maWd1cmUgdGVzdCB0aGF0IGNoZWNrcyBmb3IgYSB3b3JraW5nIE5JX1dJVEhTQ09QRUlECiAgaW1wbGVtZW5hdGlvbi4gTm8gY29kZSB1c2VzIHRoZSByZXN1bHQgZnJvbSB0aGlzIHRlc3QgeWV0LCBpdCBpcyBzdGlsbAogIGV4cGVyaW1lbnRhbC4gSmFtZXMgQ2FybHNvbiB3cm90ZSBpbiBjb21wLnVuaXguc29sYXJpczogIkl0J3MgYSBidWcKICAoNTAwNjYyMykgLS0gaXQncyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGRuJ3QgYmUgaW4gdGhlIGhlYWRlciBmaWxlLiIKCi0gSSBwcm92aWRlZCBNaXR6IFdhcmsgd2l0aCBhIGZpcnN0IHBhdGNoIGluIG9yZGVyIHRvIGZpeCBsaWJjdXJsJ3MgcHJvYmxlbXMKICB0byByZS1uZWdvdGlhdGUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uICh3aGVuICdzdGFsZT10cnVlJyBpcyBpbmNsdWRlZCBpbiB0aGUKICByZXNwb25zZSBoZWFkZXIpLgoKLSBSb3kgU2hhbiBkaXNjb3ZlcmVkIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZSBkaWRuJ3QgcHJvcGVybHkgdGltZW91dCBuYW1lCiAgbG9va3VwcyB3aGljaCBjb3VsZCBtYWtlIGhhbmRsZXMgZ2V0IHN0dWNrIGluIHRoYXQgc3RhdGUgYW5kIHRodXMgbmV2ZXIgZ2V0CiAgY29tcGxldGVkLiBJJ3ZlIHByb2R1Y2VkIGEgZmlyc3QgdGVzdCBwYXRjaCB0aGF0IGF0dGVtcHRzIHRvIGNvcnJlY3QgdGhpcy4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwcGxpZWQgdG8gbWFrZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIHdvcmsgbmljZWx5CiAgZXZlbiB3aXRoIGF1dGhlbnRjYXRpb25zIHN1Y2ggYXMgTlRMTSBvciBEaWdlc3QgZW5hYmxlZC4gVGVzdCBjYXNlcyAxNTAsIDE1MQogIGFuZCAxNTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCBmaWxlcyBmb3IgdGhlIGRqZ3BwL01TLURPUyBidWlsZC4KCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgd29yayBvdXQgYSBmaXggZm9yIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gbWFrZQogIHRoZSBmaWxlOi8vIHRlc3RzIHJ1biBmaW5lIHdoZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3LWJ1aWx0IHZlcnNpb24gb2YgY3VybC4KCi0gRml4ZWQgYW4gaW5jbHVkZSBpc3N1ZSB3aXRoIG5ldGluZXQvdGNwLmggb24gQUlYLCBiYXNlZCBvbiBpbnB1dCBieSBUb3IuCiAgVGhpcyBhbHNvIHJlcXVpcmVkIGEgbWlub3IgZml4IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBUaGUgcG9zdGl0Mi5jIHNvdXJjZSBleGFtcGxlIHVzZWQgdGhlIHdyb25nIHN0cnVjdCBuYW1lIGZvciB0aGUgcG9zdCBkYXRhLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGlwdjYgc3VwcG9ydCBvbiB3aW5kb3dzIGJ5IG1ha2luZyB0aGUgY3VybCBidWlsZCB0byB1c2UKICB0aGUgY29ycmVjdCBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLgoKRGFuaWVsICgyNSBNYXJjaCAyMDA0KQotIEl0IHR1cm5lZCBvdXQgdGhhdCBBSVgsIGRlc3BpdGUgaGF2aW5nIGEgInRocmVhZC1zYWZlIGxpYmMiLCBkb2Vzbid0IG9mZmVyCiAgYWxsIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucyB0aHJlYWQtc2FmZS4gVGhpcyBVUkwgaXMgaW5mb3JtYXRpdmUgb24gdGhpcwogIHN1YmplY3Q6CgogICAgaHR0cDovL3B1YmxpYm4uYm91bGRlci5pYm0uY29tL2RvY19saW5rL2VuX1VTL2FfZG9jX2xpYi9haXhwcmdnZC8gXAogICAgZ2VucHJvZ2MvdGhyZWFkX3F1aWNrX3JlZi5odG0KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgd2Ugbm93IGNoZWNrIGZvciB0aHJlZSAqX3IoKSBmdW5jdGlvbnMgb24gcmVjZW50IEFJWAogIHZlcnNpb25zIGFzIHdlbGwgdGhhdCB0aGUgVVJMIG1lbnRpb25zIGFyZW4ndCB0aHJlYWQtc2FmZSBpbiBBSVggNS4xLgoKLSByZW5hbWVkIGN1cmxfc3RyZXJyb3IuW2NoXSB0byBzdHJlcnJvci5bY2hdCgotIEpvZSBIYWxwaW4gYWRkZWQgQ1VSTE9QVF9UQ1BfTk9ERUxBWSBhbmQgLS10Y3Atbm9kZWxheSB0byBtYWtlIGl0IHBvc3NpYmxlCiAgZm9yIHVzZXJzIHRvIGRpc2FibGUgdGhlIE5hZ2xlIGFsZ29ydGhpbS11c2FnZS4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgc29tZSBpbnRlcmVzdGluZyBzdHJlcnJvcl9yKCkga25vd2xlZGdlLiBnbGliYyBoYXMgaXRzCiAgb3duIEFQSSB3aGljaCBkaWZmZXJzIGZyb20gdGhlIFBPU0lYIG9uZS4gRGFuaWVsIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gZGV0ZWN0IHRoZSB2ZXJzaW9uIGluIHVzZSwgYW5kIHRoZSBjb2RlIG5vdyB1c2VzIHRoZSBuZXcgZGVmaW5lcwogIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBzb21lIGJ1aWxkIGZsYXdzIHdpdGggdGhlIG5ldyBsaWIvY3VybF9zdHJlcnJvci5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyNCBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4IHRvIHJlcGxhY2UgdGhlIGJhZCB1c2Ugb2Ygc3RyZXJyb3IoKS4gVGhpcyBpbnRyb2R1Y2VzCiAgQ3VybF9zdHJlcnJvcigpIHRoYXQgYXR0ZW1wdHMgdG8gYmUgdGhyZWFkLXNhZmUgX2FuZF8gd29ya3Mgb24gV2luZG93cyB0b28hCgotIFRvciBBcm50c2VuIHNwZWxsLWZpeGVkIGxvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMuCgotIFRvciBBcm50c2VuIG1hZGUgdGVzdGN1cmwucGwgd29yayB3aXRoIG9sZGVyIHBlcmwgNSB2ZXJzaW9ucywgYW5kIERhbmllbAogIG1hZGUgaXQgbm90IHVzZSBjaGRpciAuLiB0byBnbyBiYWNrLCBhcyB0aGF0IGlzbid0IHZlcnkgZ29vZCB3aGVuIHlvdSd2ZQogIHNldHVwIGEgdGVzdGRpciBjb250YWluaW5nIHN5bWxpbmtzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDQpCi0gQWRkZWQgR3JlZyBIZXdnaWxsJ3MgdGVzdGN1cmwucGwgc2NyaXB0IHRvIENWUy4gV2UgaGF2ZSBub3QgbW92ZWQgb3ZlciB0bwogIHVzZSB0aGlzIHNjcmlwdCBmb3IgdGhlIHJlYWwgZGlzdHJpYnV0ZWQgdGVzdGluZyBqdXN0IHlldCwgYnV0IGl0IGlzIG9ubHkKICBhIG1hdHRlciBvZiB0aW1lLgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgbWFrZXMgY3VybCByZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogIGlmIC0taW50ZXJmYWNlIGZhaWxzIG9uIHdpbmRvd3MuCgotIFRoZSByZWd1bGFyIHByb2dyZXNzIG1ldGVyIGlzIG5vdyBmaXhlZCB0byBuZXZlciB3cmFwIGR1ZSB0byBsb25nIGxpbmVzLiBBbGwKICBmaWVsZHMgYXJlIG5vdyBzdGF0aWMgc2l6ZWQuIElmIHRoZSB0aW1lIGluIHRoZSB0aW1lIGZpZWxkcyBnZXQgYSB0aW1lIHZhbHVlCiAgdGhhdCB3b3VsZCByZXByZXNlbnQgYSB0aW1lIHRoYXQgaXMgMTAwIGhvdXJzIG9yIG1vcmUgKGlmIG5vdCwgaXQgcmVtYWlucwogIHVzaW5nIGEgSEg6TU06U1MgZGlzcGxheSksIGl0IHN3aXRjaGVzIGZpcnN0IHRvIGEgIk5OTmQgTk5oIiBkaXNwbGF5IChmb3IKICBkYXlzIGFuZCBob3VycykgYW5kIGlmIHRoYXQgaXNuJ3QgZW5vdWdoIGl0IHN3aXRjaGVzIHRvIGEgIk5OTmQiIGRpc3BsYXkgaWYKICBpdCBpcyBtb3JlIHRoYW4gOTk5IGRheXMuCgogIFNldmVyYWwgb2YgdGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGFsc28gbW92ZWQgdG8gZml4ZWQtcG9pbnQgbWF0aCBpbnN0ZWFkIG9mCiAgdXNpbmcgZG91Ymxlcy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwNCkKLSBHbGVuIE5ha2FtdXJhIG5vdGljZWQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgZGlkbid0IHdvcmsgYXMgaXQKICB1c2VkIHRvIGRvIGlmIENVUkxPUFRfTk9CT0RZIGlzIHNldCBUUlVFLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIG1ha2VmaWxlIGFuZCBSRUFETUUgdG8gYWRqdXN0IHRvCiAgbmV3IGN5Z3dpbiBwYWNrYWdpbmcgZ3VpZGVsaW5lcy4KCi0gRW5hYmxlZCAiTlQgcmVzcG9uc2VzIiBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4gRG9pbmcgdGhpcyBzaW1wbHkgbWVhbnMKICB0aGF0IHdlIHByb3ZpZGUgYW4gZXh0cmEgY2h1bmsgb2YgZGF0YSBpbiBlYWNoICJ0eXBlLTMgbWVzc2FnZSIuIFRoZSBvbmx5CiAgcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXQgaXQgc2VlbXMgdGhhdCB1c2luZyBvbmx5IHRoZSAiTGFubWFuYWdlciBoYXNoIgogIChhcyB3ZSd2ZSBiZWVuIGRvaW5nIHVudGlsIG5vdykgZG9lc24ndCBzdXBwb3J0IHBhc3N3b3JkcyBsb25nZXIgdGhhbiAxNAogIGNoYXJhY3RlcnMgYW5kIGl0IHR1cm5zIG91dCB0aGVyZSBhcmUgdXNlcnMgb3V0IHRoZXJlIHdobyB3YW50IHRvIHVzZQogIGxpYmN1cmwgYW5kIE5UTE0gd2l0aCBzdWNoIHBhc3N3b3JkcyEgOy0pIFNldmVuIE5UTE0tcmVsYXRlZCB0ZXN0IGNhc2VzIHdlcmUKICB1cGRhdGVkIGFjY29yZGluZ2x5LiBNZW50aW9uZWQgYXMgaXNzdWUgMjkgaW4gVE9ETy1SRUxFQVNFLCBidWcgcmVwb3J0CiAgIzkxNTYwOQoKLSBNb3ZlZCB0aGUgZ2VuZXJhdGVkIGxpYmN1cmwgdmVyc2lvbiBpbmZvIHRvIGEgbmV3IGhlYWRlciBmaWxlLCBuYW1lZAogIGN1cmwvY3VybHZlci5oLiBOb3cgaW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiBpbmNsdWRlIE9OTFkgdmVyc2lvbiBpbmZvLCBzaG91bGQKICBhbnlvbmUgd2FudCB0aGF0IChhbmQgaXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB3aW5kb3dzIHJlc291cmNlIGZpbGVzIHdvdWxkKS4KICBNZW50aW9uZWQgYXMgaXNzdWUgMjcgaW4gVE9ETy1SRUxFQVNFLgoKRGFuaWVsICgyMSBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSByb290IE1ha2VmaWxlIHRvIHVzZSB0YWJzIGZvciB0aGUgbmV0d2FyZSB0YXJnZXQuIEf8bnRlciBLbmF1ZgogIHBvaW50ZWQgdGhpcyBvdXQuCgotIE1hcnR5IEt1aHJ0J3MgVk1TIGNsZWFudXAKCi0gVGhvbWFzIFNjaHdpbmdlIG1hZGUgYnVpbGRjb25mIHJlY29nbml6ZSBBQ0xPQ0FMX0ZMQUdTIHRvIGludm9rZSBhY2xvY2FsCiAgd2l0aCBwYXJ0aWN1bGFyIHByZS1kZXRlcm1pbmVkIG9wdGlvbnMuCgpWZXJzaW9uIDcuMTEuMSAoMTkgTWFyY2ggMjAwNCkKCkRhbmllbCAoMTggTWFyY2ggMjAwNCkKLSBUb3IgQXJudHNlbiBicm91Z2h0IHNvbWUgaW5mbyBhYm91dCBTR0kgSVJJWDoKCiAgSVJJWCBzdXBwb3J0cyAzIGRpZmZlcmVudCBleGVjdXRhYmxlL29iamVjdCBmb3JtYXRzLCAtMzIsIC1uMzIgYW5kIC02NC4KICAtbjMyIGlzIGRlZmF1bHQgMzItYml0IGZvcm1hdCwgLTMyIGlzIHRoZSAib2xkIiAzMi1iaXQgZm9ybWF0LCBhbmQgLTY0IGlzCiAgdGhlIDY0LWJpdCBmb3JtYXQuICBMaWJyYXJpZXMgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyBhcmUgaW4gbGliLCBsaWIzMgogIGFuZCBsaWI2NCByZXNwZWN0aXZlbHkuCgogIFdlJ3ZlIG5vdyBhZGp1c3RlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhZGFwdCB0byB0aGlzIHdoZW4gc2Nhbm5pbmcgZm9yCiAgM3JkIHBhcnR5IGxpYnMsIHN1Y2ggYXMgT3BlblNTTC4KCkRhbmllbCAoMTcgTWFyY2ggMjAwNCkKLSBXYXR6IHBvaW50ZWQgb3V0IGEgZmV3IG1pc3NpbmcgZmlsZXMgaW4gdGhlIE1TVkMgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlLgoKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzLCBjb2RlIGFuZCBtYWtlZmlsZXMgdG8gYnVpbGQgY3VybCBvbiBOb3ZlbGwKICBOZXRXYXJlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA0KQotIExvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMgd2VyZSB1cGRhdGVkIHRvIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBtYW4KICBwYWdlcyB0aGUgcmVjb2duaXplZCB3YXkgc28gdGhhdCB0aGV5IGFwcGVhciBhcyBuaWNlIGh5cGVybGlua3MgaW4gdGhlIEhUTUwKICB2ZXJzaW9ucy4KCi0gYnVpbGRjb25mIG5vdyBjaGVja3MgdGhlIG00IHZlcnNpb24gdG9vLCBzaW5jZSBhdXRvY29uZiByZXF1aXJlcyBhIEdOVSBtNAogIHZlcnNpb24gdG8gYnVpbGQgcHJvcGVyIGNvbmZpZ3VyZSBzY3JpcHRzLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxPUFRfUE9TVEZJRUxEU0laRV9MQVJHRSwgdGhlIGxhcmdlIGZpbGUgdmVyc2lvbiBvZgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byBhbGxvdyBQT1NUcyBsYXJnZXIgdGhhbiAyR0IuCgotIERhdmlkIEJ5cm9uIGZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FzZS9jcmFzaC4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNCkKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgU1NMIGNvbm5lY3Rpb24gdG8gZGVhbCB3aXRoIHJlY2VpdmVkIHNpZ25hbHMgZHVyaW5nIHRoZQogIGNvbm5lY3QuCgotIENoYW5nZWQgdGhlIE9TIHN0cmluZyBmb3Igd2luMzIgdG8gYmVjb21lICJpMzg2LXBjLXdpbjMyIi4KCkRhbmllbCAoOSBNYXJjaCAyMDA0KQotIENoYW5nZWQgdGhlIGludGVybmFscyB0byB1c2UgY3VybF9zb2NrZXRfdCBmb3Igc29ja2V0IHZhcmlhYmxlIHR5cGUuIFRoaXMKICBzaG91bGQgZW5hYmxlIHVzIHRvIGJ1aWxkIHdpdGggbGVzcyB3YXJuaW5ncyBvbiBXaW5kb3dzLCB3aGVyZSBTT0NLRVQgaXMKICB1c2VkIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludCwgd2hpbGUgbW9zdCBvdGhlciBwbGF0Zm9ybXMgdXNlIGEgbWVyZSBpbnQuCgotIE1vZGlmaWVkIGxpYi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIG9uIE1TVkMgYWdhaW4uCgpWZXJzaW9uIDcuMTEuMS1wcmUxICg4IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDggTWFyY2ggMjAwNCkKLSBNaW5vciBmaXggdG8gbWFrZSBjdXJsIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgaXMgb25seSBzZXQgaWYgY3VybF9vZmZfdCBpcwogIGxhcmdlciB0aGFuIDQgYnl0ZXMuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJbXByb3ZlZCBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgc28gY2FsbGVkIGlzc3VlIDEyLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBIVFRQIHNlcnZlciBhIGxvdCB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIGNoYW5nZXMgZm9yCiAgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiAobGlrZSB0ZXN0IGNhc2UgODgpLiBBZGRlZCBBbmRy6XMKICBHYXJj7WEncyB3aW4zMi1jaGFuZ2VzLiBJbXByb3ZlZCB0aGUgbG9nZ2luZy4KCi0gRml4ZWQgdGhlIGZpbGU6LXJlbGF0ZWQgcHJvZ3Jlc3MvZ2V0aW5mbyBzdHVmZiBhIGJpdCBtb3JlLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSSBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOgogIGhlYWRlciBvciB3aGVuIGRvaW5nIG11bHRpcGxlLXJlcXVlc3QgYXV0aGVudGljYXRpb25zLiBBIHN1YnNlcXVlbnQgcmVxdWVzdAogIGNvdWxkIGVycm9uZW91c2x5IHJlLXVzZSBhIHByZXZpb3VzIGNvbm5lY3Rpb24gdGhhdCB3YXMgc2VudCB3aXRoCiAgQ29ubmVjdGlvbjogY2xvc2UuIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZC4KCi0gQW5kculzIEdhcmPtYSBwYXRjaGVkIGN1cmwgdG8gcHJldmVudCB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcgd2l0aCBtaW5ndywKICBtYWlubHkgYmVjYXVzZSBpdCBpcyBub3cgcG9zc2libGUgdG8gaGF2ZSBib3RoIFdJTjMyIGFuZCBIQVZFX0NPTkZJR19ICiAgZGVmaW5lZC4KCi0gV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgZnJvbSBhIGZpbGU6IFVSTCwgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBvdGhlcgogIHRyYW5zZmVyIG1ldHJpY3Mgd2VyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4KCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSAidmVyc2lvbiByZXNvdXJjZSIgZmlsZSB0byB0aGUgY3VybCBleGVjdXRhYmxlIGZvcgogIHRoZSB3aW5kb3dzIGJ1aWxkcy4KCkRhbmllbCAoMyBNYXJjaCAyMDA0KQotIERhdmlkIEJ5cm9uJ3Mgd29yayBvbiBtYWtpbmcgbGliY3VybCBvbmx5IHJlcXVpcmUgd2luc29jayAxLjEgb24gV2luZG93cwogIG1hY2hpbmVzLgoKLSBNb3JlIHZhcmlhYmxlIGNsZWFudXBzIGJhc2VkIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBUb3IgQXJudHNlbidzCiAgYXV0b2J1aWxkcyB3aXRoIE1JUFNQcm8uCgotIEpvZSBIYWxwaW4gaGVscGVkIHVzIGZpeCBzb21lIHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIG9uIEZyZWVCU0QuCgotIEFwcGxpZWQgVG9tIEJhdGVzJyBwYXRjaCB0byBidWlsZCBvbiBuc3ItdGFuZGVtLW5zay4KCi0gRGFuIEZhbmRyaWNoIGNvcnJlY3RlZCBzb21lIGZsYXdzIGluIHRoZSBjb25maWd1cmUgR1NTIGRldGVjdGlvbi4KCkRhbmllbCAoMiBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSBsaWJjdXJsIGNvZGUgdG8gdXNlIEZPUk1BVF9PRkZfVCBmb3IgcHJpbnRmKCkgZm9ybWF0dGluZwogIGN1cmxfb2ZmX3QgdHlwZXMgaW50ZXJuYWxseS4KCkRhbmllbCAoMSBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgYXMgYSBmZWF0dXJlLWJpdCBpbiB0aGUgY3VybF92ZXJzaW9uX2luZm8oKQogIHJlc3BvbnNlLCB0aGF0IHNpZ25hbHMgaWYgdGhpcyBsaWJjdXJsIHN1cHBvcnRzID4yR0IgZmlsZXMuIGN1cmwgLVYgbm93CiAgb3V0cHV0cyAnTGFyZ2VmaWxlJyBpbiB0aGUgRmVhdHVyZXM6IGZpZWxkIGlmIHRoaXMgaXMgdGhlIGNhc2UuIE1vc3Qgc3lzdGVtcwogIGFyZSBsaWtlbHkgdG8gc3VwcG9ydCB0aGlzLgoKLSBXZSBvZmZlciBhIENVUkxfRk9STUFUX09GRl9UIGRlZmluZSBpbiB0aGUgcHVibGljIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQKICB0byBwcmludGYoKSBjdXJsX29mZl90IHZhcmlhYmxlcy4gV2UgYWxzbyBtb2RpZmllZCB0aGUgbGliY3VybCBzb3VyY2VzIHRvCiAgdXNlIHRoaXMgZGVmaW5lIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICVPZCBhcHByb2FjaCAoYWx0aG91Z2ggSSd2ZSBsZWZ0IHRoZQogIE8tZmxhZyBmdW5jdGlvbmFsIGluIHRoZSBjb2RlKS4gVGhpcyBzaG91bGQgYWxzbyBwcmV2ZW50IGNvbXBpbGVycyB0byB3YXJuCiAgb24gdGhlIGhvbWUtZ3Jvd24gb3B0aW9uLgoKLSBGaXhlZCB0aGUgcmVzdW1lLWNoZWNrIGNvZGUgdG8gdGVzdCBmb3IgYSB3b3JraW5nIHJlc3VtZSBhdCB0aGUgZW5kIG9mIHRoZQogIGhlYWRlcnMgYW5kIG5vdCBhdCB0aGUgZmlyc3QgYm9keS1ieXRlLgoKLSBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiBTdG9wIHVzaW5nIGl0LiBJZgogIHlvdSBuZWVkIGEgZ2xvYmFsIEROUyBjYWNoZSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB1c2UgdGhlIHNoYXJlIGludGVyZmFjZSBhbmQKICB5b3UnbGwgZ2V0IGEgZ2xvYmFsIGNhY2hlIHRoYXQgd29ya3MgdGhlIHdheSBpdCBzaG91bGQgd29yay4gWW91IGNhbiBldmVuCiAgaGF2ZSBhbnkgbnVtYmVyIG9mIGdsb2JhbCBjYWNoZXMsIGFsbCBhdCB5b3VyIGNvbW1hbmQuIFRoaXMgaXMgbm93IGFsc28KICBtZW50aW9uZWQgaW4gdGhlIGRvY3MuCgotIE1hZGUgdGhlICpwcmludGYgY29kZSBzdXBwb3J0IHRoZSB6LWZsYWcgdG8gZW5hYmxlIHNpemVfdCBwcmludGYoKSBpbiBhCiAgbWFubmVyIHNpbWlsYXIgdG8gaG93IGdsaWJjIGFsbG93cyBpdC4gVG8gbWFrZSBwcmludGZpbmcgb2YgdGhpcyB3b3JrIG9uCiAgcGxhdGZvcm1zIHdpdGggNjRiaXQgc2l6ZV90IGFuZCAzMmJpdCBpbnRzLiBJZiB0aGVyZSBldmVuIGFyZSBhbnkhIDstKQoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QgYW5kCiAgQ1VSTEFVVEhfTlRMTSAob3IgQ1VSTEFVVEhfQU5ZIGFuZCBsaWJjdXJsIHRoZW4gcGlja2VkIE5UTE0pLCBsaWJjdXJsIHdvdWxkCiAgbG9vcCB3aXRob3V0IHN1Y2NlZWRpbmcgdG8gYXV0aGVudGljYXRlIGR1ZSB0byB0aGUgbmV3IGNvbm5lY3Rpb24gdGhhdCB3YXMKICBtYWRlIGZvciBhbGwgcm91bmQtdHJpcHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLiBOb3csIHRoZSBGUkVTSF9DT05ORUNUIGlzCiAgcmVtYWRlIHRvIG9ubHkgbWF0dGVyIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYWRlIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBtaWdodCBmb2xsb3cgZHVlIHRvIEZPTExPV0xPQ0FUSU9OIG9yIEhUVFAKICBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGlnbm9yaW5nIHRoYXQgb3B0aW9uLgoKLSBBZGp1c3RlZCB0aGUgUVVJVCBjb2RlIHNsaWdodGx5IHNpbmNlIGl0IGNvdWxkIGNvcmUtZHVtcC4KCi0gQ29ycmVjdGVkIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBwcm92aWRlIGEgY29ycmVjdCBzaXplIHRvIHRoZQogICd2ZXJpZmllZHNlcnZlcicgcmVxdWVzdC4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNCkKLSBKb2UgSGFscGluIG1hZGUgdGhlIEZUUCBjb2RlIHNlbmQgUVVJVCBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGJlZm9yZQogIGRpc2Nvbm5lY3RpbmcgdGhlIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIHdoYXQgZ29vZC1iZWhhdmluZyBmdHAgY2xpZW50cwogIHNob3VsZCBkby4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiB1cGRhdGVkIHNldmVyYWwgZmlsZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTVNWQyA2LiBIZQogIGFsc28gYWRkZWQgdGhlICdidWlsZGNvbmYuYmF0JyB0aGF0IHdvcmtzIGxpa2UgdGhlICdidWlsZGNvbmYgKyBjb25maWd1cmUnCiAgY29tYm8gZG9lcyBvbiB1bml4ZXMuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG1lbWRlYnVnIHN0dWZmIHN1cHBvcnQgY2FsbG9jKCkgYXMgd2VsbC4KCi0gVG9yIEFybnRzZW4gcG9pbnRlZCBvdXQgdGhhdCB0ZXN0Y3VybC5zaCBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKICBmaWxlcyBpbiBvcmRlciB0byBoYXZlIHRoZW0gcmUtZ2VuZXJhdGVkIGluIGVhY2ggYnVpbGQuCgotIEFuZHkgU2VycGEgZm91bmQgb3V0IHRoYXQgdGhlIHNoYXJlIGludGVyZmFjZSBkaWQgbm90IGVuam95IGxpZmUgd2hlbiBub3QKICBoYXZpbmcgdGhlIGxvY2sgYW5kIHVubG9jayBjYWxsYmFja3Mgc2V0LCBldmVuIHRob3VnaCBkb2N1bWVudGVkIHRvIGJlCiAgT0suIEl0IHN0aWxsIGlzIE9LLCBhbmQgbm93IHRoZSBjb2RlIHdvbid0IHNlZ2ZhdWx0IGFueW1vcmUhCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHcmVnIEhld2dpbGwgSSBtb2RpZmllZCBob3cgbG9uZyBsb25nIGlzIHVzZWQgaW4gdGhlCiAgbXByaW50ZiBjb2RlLCBhcyB3ZSBjYW4gdXNlIGEgNjRiaXQgdHlwZSB3aXRoIE1TVkMgdGhhdCBpcyBhIGxvbmcgbG9uZwogIGVxdWl2YWxlbnQuIFRoaXMgY29ycmVjdHMgc29tZSB3ZWlyZCBsYXJnZSBmaWxlIGJlaGF2aW9ycyBvbiB3aW5kb3dzLgoKLSBUb3IgQXJudHNlbiBoZWxwZWQgbWUgd29yayBvdXQgLS1lbmFibGUtZGVidWcgdG8gd29yayBiZXR0ZXIgd2l0aCBkaWZmZXJlbnQKICB2ZXJzaW9ucyBvZiB0aGUgZ2NjIGFuZCBpY2MgY29tcGlsZXJzLgoKLSBBZGRlZCBDVVJMT1BUX1NIQVJFIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDQpCi0gQXBwbGllZCB0aGUgZmluYWwgcGllY2VzIG9mIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBicmluZ3MgYSB3b3JraW5nIG5hbWUKICByZXNvbHZlIHRpbWVvdXQgdG8gdGhlIHdpbmRvd3MgdmVyc2lvbnMgb2YgY3VybCEKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbidzIGZpeCB0byBhbGxvdyB0aGUgc3BlZWQtbGltaXQgbG9naWMgd29yayBldmVuIGlmIHlvdSBzZXQKICBsaW1pdC1yYXRlLiBJdCBkb2VzIHdvcmsgb24gdGhlIGV4cGVuc2Ugb2YgdGhlIHJhdGUgbGltaXRlci4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNCkKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgd2l0aCBnY2Mgbm93IGFsc28gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpY2MgY29tcGlsZXIKICAod2hpY2ggc29tZWhvdyBnZXRzIHRyZWF0ZWQgYXMgaWYgaXQgaXMgYSBnY2MpIHRvIHN0b3AgdXNpbmcgYWxsIHRoZSBnY2MKICBvcHRpb25zIHdpdGggaXQsIGFuZCB3ZSBhbHNvIHByb3ZpZGUgLWlzeXN0ZW0gb3B0aW9ucyBmb3IgZWFjaCBleHRyYSAtSQogIG9wdGlvbiB0aGUgY29uZmlndXJlIHNjcmlwdCBoYXMgZmlndXJlZCBvdXQgKGZvciBPcGVuU1NMLCBrZXJiZXJvcywgemxpYiwKICBIZWltZGFsIGV0YykuIFRoaXMgb2YgY291cnNlIHRvIHByZXZlbnQgd2FybmluZ3Mgb24gaGVhZGVycyB3ZSBkb24ndCBoYXZlCiAgY29udHJvbCBvZi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNCkKLSBEb3VnIFBvcnRlciBtYWRlIGxpYmN1cmwgdXNlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSB0aGUKICBnZXRwd3VpZCByZXN1bHRzIHdoZW4gbG9va2luZyBmb3IgLm5ldHJjIGZpbGVzLgoKLSBJZiAnY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnJyBpcyB1c2VkIHdpdGggZ2NjLCBpdCBub3cgY2hlY2tzIHdoaWNoIGdjYwogIHZlcnNpb24gaXQgaXMgYW5kIHVzZXMgYXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBhcyBwb3NzaWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciB2ZXJzaW9uLgoKLSBDb2RlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCBpbiB0aGUgY3VybCBhcHAgaXMgbm93IG1hZGUgdG8gdXNlCiAgdGhlIGN1cmx4XyBwcmVmaXguIFRoZSBmaXJzdCBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUgbGlrZSB0aGlzIGlzIHRoZQogIGN1cmx4X3N0cnRvbGwoKSBmdW5jdGlvbi4gVGhpcyBpcyBtYWRlIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGV4aXN0aW5nIGNvZGUsCiAgYnV0IHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBsaWJjdXJsIEFQSS4gRnVydGhlciBleHBsYW5hdGlvbnMgcG9zdGVkIGhlcmU6CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA0LTAyLzAyMTUuaHRtbAoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGJ1aWxkY29uZiB0byBub3QgdXNlICJ3aGljaCIgYXMgQUlYIGFuZCBUcnU2NCBoYXZlIHdoYXQgaGF2ZSBiZWVuCiAgcmVmZXJyZWQgdG8gYXMgImhvcnJpYmx5IGJyb2tlbiAnd2hpY2gnIHByb2dyYW1zIi4KCi0gTWFkZSBzdXJlIGRucyBjYWNoZSB0aW1lb3V0IHNldCB0byAtMSByZWFsbHkgbWVhbnMgY2FjaGluZyBmb3JldmVyLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA0KQotIE1hZGUgaXQgcG9zc2libHkgdG8gYnVpbGQgYy1hcmVzIHdpdGggdGhlIGxpYmN1cmwgbWVtZGVidWcgc3lzdGVtIHRvIGJldHRlcgogIHRyYWNrIG1lbW9yeS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNCkKLSBXaGVuIHVzaW5nIGFyZXMsIHdlIG5vdyBpbml0aWFsaXplIHRoZSBhcmVzICdjaGFubmVsJyBpbiBjdXJsX2Vhc3lfaW5pdCgpCiAgYW5kIHJlLXVzZSB0aGF0IHNhbWUgaGFuZGxlIGR1cmluZyB0aGUgZW50aXJlIGN1cmwgaGFuZGxlJ3MgbGlmZS10aW1lLiBJdAogIGltcHJvdmVzIHBlcmZvcm1hbmNlLgoKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiBkaXNwbGF5aW5nIHZlcmJvc2UgZm9yIGlwdjYtZW5hYmxlZCBsaWJjdXJscyBhbmQKICByZS11c2VkIGNvbm5lY3Rpb25zLiBQcm9ibGVtIHJlcG9ydGVkIGFuZCBmaXggdmVyaWZpZWQgYnkgR3JpZ29yeSBFbnRpbi4KCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIHZlcnNpb24tY2hlY2sgaW4gdGhlIFNPQ0tTNSBjb2RlLgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGEgY2FzZSB3aGVyZSBhIGhvc3QgY2FjaGUgZW50cnkgd2FzIG5vdCBmbGFnZ2VkIGluLXVzZSBwcm9wZXJseSB3aGVuIGEKICBjYWNoZWQgZW50cnkgd2FzIHVzZWQuCgotIEFuZHLpcyBHYXJj7WEncyBwYXRjaCB0aGF0IGNoZWNrcyBmb3Igd2lubW0gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNCkKLSBCZW4gR3JlZWFyJ3MgU09fQklORFRPREVWSUNFIHBhdGNoIGZvciB0aGUgYmluZGluZyBvZiB0aGUgbG9jYWwgZW5kIHRvIGEKICBzcGVjaWZpYyBuZXR3b3JrIGludGVyZmFjZS4KCi0gR3JlZyBIZXdnaWxsIGZvdW5kIG91dCB0aGF0IHRoZSB2YXJpYWJsZSBob2xkaW5nICdjb250ZW50bGVuZ3RoJyB3YXNuJ3QgYmlnCiAgZW5vdWdoIHRvIGhvbGQgYSBsYXJnZSBmaWxlIQoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIDY0Yml0LXJlbGF0ZWQgcHJvYmxlbSBpbiBkYXRlLXJlbGF0ZWQgY29kZSBpbiB0aGUgZnRwCiAgZGVwYXJ0bWVudCwgYW5kIHRoZXJlIHdhcyBhbm90aGVyIHBvdGVudGlhbCBwcm9ibGVtIGluIHRoZSBuYW1lIHJlc29sdmUgY29kZQogIHRvby4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNCkKLSBSZW1vdmVkIGEgZmV3IHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSBzZXQgYnV0IG5ldmVyIHVzZWQsIGFzIHNvbWUgY29tcGlsZXJzCiAgd2FybiBhYm91dCB0aGF0IGFuZCB3ZSBkbyBub3QgbGlrZSBjb21waWxlciB3YXJuaW5ncyEKCi0gUmVtb3ZlZCB0aGUgbmVlZCBmb3Igc3ltbGlua3MgaW4gdGhlIHRlc3RzL2RhdGEgZGlyZWN0b3J5IGlmIGN1cmwgaXMgYnVpbHQKICBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgJ21ha2UgdGVzdCcgaXMgdXNlZC4gVGhpcyB3YXMgZG9uZQogIGJ5IHByb3ZpZGluZyBhICJzb3VyY2UgZGlyIHBhdGgiIHRvIHRoZSBzY3JpcHRzL3NlcnZlcnMuCgotIE5vdywgaWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZmluZCBhbiBucm9mZiB0b29sIG9yIGFuIG9wdGlvbiB0byBucm9mZgogIHRvIHVzZSB0byBjb252ZXJ0IG1hbiBwYWdlcyB3aXRoLCBpdCB3aWxsIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgYnVpbHQtaW4KICBtYW51YWwuCgotICdjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCcgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgYnVpbHQtaW4gbWFudWFsIGZyb20KICB0aGUgY3VybCBjb21tYW5kIHRvb2wuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgbWlub3Igc291cmNlIGVkaXQsIGFuZCBub3cKICBoZSBoYXMgbWFuYWdlZCB0byBnZXQgbXN5cy9taW5ndyB0byBydW4gY29uZmlndXJlIGFuZCB0aGVuIGJ1aWxkIQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGRlZmF1bHQgSFRUUCBBY2NlcHQ6IGhlYWRlciB3YXMgbW9kaWZpZWQgdG8gdGhlIG11Y2ggc2ltcGxlcgogICJBY2NlcHQ6ICovKiIuCgotIFAgUiBTY2hhZmZuZXIgdXBkYXRlZCB0aGUgY3VybC1zc2wgc3BlYyBmaWxlIGZvciBSUE1zLgoKLSBEb21pbmljayBNZWdsaW8gYnJvdWdodCBsb3RzIG9mIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzaGFyZSBpbnRlcmZhY2UncyBtYW4KICBwYWdlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBtaXNzaW5nLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCB3b3JrLWFyb3VuZCBhIGJ1ZyBpbiB0aGUKICBBSVg1IGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvKCkuIFRoaXMgbWFrZXMgdGhlIEZUUCBQT1JUIHN0dWZmIHdvcmsgb24KICBpcHY2LWVuYWJsZWQgQUlYIGJ1aWxkcy4KCi0gS2VuIFJhc3RhdHRlciBwcm92aWRlZCBwb3J0YWJpbGl0eSBmaXhlcyBmb3IgdGhlIGN1cmxndGsuYyBleGFtcGxlLCBhbmQgbm93CiAgaXQgcnVucyBvbiB3aW5kb3dzIHdpdGggR1RLIGFzIHdlbGwhCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBnZXRob3N0YnluYW1lKCkgZmluZSB3aGVuIHJ1bgogIHdpdGggbWluZ3cgb24gd2luZG93cy4KCi0gTW9kaWZpZWQgdGhlIGxkYXAgY29kZSB0byB1c2UgcHJvcGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFsbCBvdmVyIChpbnN0ZWFkIG9mCiAgbWl4ZWQgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRvIHdvcmstYXJvdW5kIHRoZSBwaWNreSBNSVBTUHJvIGNvbXBpbGVyCiAgd2FybmluZ3MuCgotIEEgY3VzdG9tIEhvc3Q6IGhlYWRlciBpcyBvbmx5IGNvbnNpZGVyZWQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IG1hZGUgYnkKICBmb2xsb3dpbmcgYSBsb2NhdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBUaW0gQmFrZXIuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNCkKLSBUaGUgbGlieiBwYXJ0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBvbmx5IHNldCB0aGUgdHdvIGxpYnotcmVsYXRlZAogIGRlZmluZSBIQVZFX1pMSUJfSCBhbmQgSEFWRV9MSUJaIGlmIGJvdGggdGhlIGxpYiBhbmQgdGhlIGhlYWRlciBpcyBmb3VuZC4KICBJZiBvbmUgaXMgbWlzc2luZywgbm9uZSBvZiB0aGUgZGVmaW5lcyBpcyBzZXQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIE1pbmd3IG1ha2VmaWxlcy4KCi0gTGVuIEtyYXVzZSByZXBvcnRlZCB0aGF0IGN1cmwgNy45LlggY291bGQgZG8gdXBsb2FkaW5nIGZyb20gc3RkaW4gd2l0aG91dAogIGRvaW5nIGNodW5rZWQgZW5jb2RpbmcsIHdoaWNoIGN1cnJlbnQgY3VybCBjYW5ub3QgZG8gZXZlbiBpZiB5b3UgZGlzYWJsZQogIHRoZSB0cmFuc2Zlci1lbmNvZGluZyBjaHVua2VkIGhlYWRlci4gTm93IGl0IGNhbiBhZ2FpbiwgYW5kIHRlc3QgY2FzZSA5OAogIHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgYSB3ZWlyZCBnZXRhZGRyaW5mbygpIHVzYWdlIGluIHRoZSBGVFAgY29kZSwgcHJldmVudGluZwogIHRoZSBpcHY2LWNvZGUgZm9yIFBPUlQgd29yayBvbiBBSVggNS4yLiBXZSBub3cgYWxzbyBwcm92aWRlIChiZXR0ZXIpIGVycm9yCiAgbWVzc2FnZXMgd2hlbiBiYWlsaW5nIG91dCBpbiB0aGUgdGhhdCBmdW5jdGlvbi4KCi0gVG9yIEFybnRzZW4gbm93IHByb3ZpZGVzIEFJWCBhbmQgSVJJWCAodXNpbmcgZ2NjLCB4bGMgYW5kIHRoZSBNSVBTUHJvCiAgY29tcGlsZXJzKSBhdXRvbWF0ZWQgYnVpbGQgbG9ncyAoaHR0cDovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCkRhbmllbCAoMTkgRGVjZW1iZXIpCi0gQ1VSTE9QVF9JUFJFU09MVkUgd2FzIG5vdCBwb3NzaWJsZSB0byBzZXQuCgotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgdGhlIGRqZ3BwIGJ1aWxkIGZpbGVzLgoKRGFuaWVsICgxOCBEZWNlbWJlcikKLSBKb2huIE1jR293YW4gcmVwb3J0ZWQgYSByZWRpcmVjdC1wcm9ibGVtIHRoYXQgaGFwcGVuZWQgaWYgYSBzaXRlIHVzZWQgYSBVUkwKICBsaWtlICJ1cmwuY29tP3Zhcj1jb250ZW50IiAod2l0aG91dCBhIHByb3BlciBzbGFzaCkgYW5kIGZyb20gdGhhdCBhZGRyZXNzCiAgcmVkaXJlY3RlZCB0aGUgdXNlci1hZ2VudCB0byBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkuCgotIERhdmlkIEJ5cm9uIG1hZGUgbGliY3VybCBidWlsZCBmaW5lIHdpdGggYm90aCB0aGUgLk5FVCBhbmQgVkM2IHZlcnNpb25zIG9mCiAgTVNWQwoKRGFuaWVsICgxNiBEZWNlbWJlcikKLSBVcGRhdGVkIHRlc3QgNTA2IHNpbmNlIGl0IHN0YXJ0ZWQgdG8gZmFpbCBhZnRlciB0aGUgY2FjaGUgcHJ1bmUgY2hhbmdlCiAgeWVzdGVyZGF5LiBJIGFsc28gY2hhbmdlZCBpdCBzbGlnaHRseSB0byBmZWF0dXJlIGEgY291bnRlciBpbiBlYWNoIGRlYnVnCiAgb3V0cHV0IGZvciBlYXNpZXIgdHJhY2luZy4KCkRhbmllbCAoMTUgRGVjZW1iZXIpCi0gT2xkIEROUyBjYWNoZSBlbnRyaWVzIGFyZSBub3cgb25seSBwcnVuZWQgYWZ0ZXIgY3VybCBpcyBkb25lIHdpdGggYSByZXF1ZXN0LAogIGFuZCBub3QgaW4gdGhlIGFjdHVhbCBuYW1lIHJlc29sdmUgY2FsbC4KCi0gY29ycmVjdGVkIHRoZSAtLWVuYWJsZS1hcmVzIHBhdGNoCgotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoaW4gbGliY3VybCB0aGF0IHJlLXVzZWQKICBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCkRhbmllbCAoMTAgRGVjZW1iZXIpCi0gR2lzbGUgVmFuZW0gcmVwb3J0ZWQgdGhhdCB0aGUgZGljdCBzdXBwb3J0IHdhcyBicm9rZW4uIEkgYnJva2UgaXQgZHVyaW5nIG15CiAgZnRwcy1jaGFuZ2VzIG92ZXJoYXVsLiBJJ3ZlIG5vdyBhZGRlZCBhICdjdXJsYXNzZXJ0JyBmdW5jdGlvbiB0aGF0IGNhbiBiZQogIHVzZWQgdG8gdmVyaWZ5IGV4cHJlc3Npb25zLCB0byBwcmV2ZW50IGZ1dHVyZSBlcnJvcnMgb2YgdGhlIHNhbWUKICBraW5kLiBUaGV5J3JlIG9ubHkgcHJlc2VudCBpbiBkZWJ1Zy1idWlsZHMuCgotIERpZWdvIENhc29ycmFuIG1hZGUgY3VybCBhbmQgbGliY3VybCBwb3NzaWJsZSB0byBidWlsZCBuYXRpdmVseSAobm8gbW9yZQogIG5lZWQgZm9yIHRoZSBpeGVtdWwgbGlicmFyeSkgb24gQW1pZ2FPUy4KCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgY29uZmlndXJlIC0tZW5hYmxlLWFyZXMgc3VwcG9ydCBhIGdpdmVuIHBhdGggdG8gdGhlCiAgaW5zdGFsbGVkIGFyZXMgbGliLCBpbnN0ZWFkIG9mIGFsd2F5cyB1c2luZyBpdCBpbiB0aGUgY3VybCBzb3VyY2UgdHJlZS4KICBUaGlzIGFsc28gZml4ZWQgdGhlIGN1cmwtY29uZmlnIC0tbGlicyBvdXRwdXQuCgotIEVyaWMgUy4gUmF5bW9uZCBwYXRjaGVkIGEgdmVyeSBtaW5vciBtYW4gcGFnZSBmb3JtYXQgZXJyb3IgaW4KICBsaWJjdXJsLWVycm9ycy4zCgpEYW5pZWwgKDggRGVjZW1iZXIpCi0gRml4ZWQgdGhlIGZsYXcgdGhhdCBtYWRlIC1seiBhcHBlYXIgdHdpY2Ugb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lLgoKLSBBZnRlciBjb3JyZXNwb25kZW5jZSB3aXRoIEdpc2xlIFZhbmVtLCBJIGNoYW5nZWQgdGhlICdjb25uZWN0aW9uIGFib3J0ZWQnCiAgZXJyb3IgdGV4dCB3aGVuIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGVyIGZhaWxlZCB0byBtb3JlIHNwZWNpZmljbHkgaWRlbnRpZnkKICB3aGF0IHRoZSBwcm9ibGVtIGlzLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGZyb20gRG9taW5pY2sgTWVnbGlvLCBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgbm93IG91dHB1dHMKICAnQXN5bmNoRE5TJyBhcyBhIGZlYXR1cmUgaWYgbGliY3VybCB3YXMgYnVpbHQgd2l0aCBhcmVzLiBUaGUgZmVhdHVyZSBuYW1lCiAgaXMgdGhlIHNhbWUgdGhhdCAnY3VybCAtVicgb3V0cHV0cywgZm9yIHNpbXBsaWNpdHkuCgpEYW5pZWwgKDMgRGVjZW1iZXIpCi0gTWFydHkgS3VocnQgbWFkZSB0aGUgYnVpbGQgdXAtdG8tZGF0ZSBvbiBWTVMsIGFuZCBtb3ZlZCBtb3N0IG9mIHRoZSBWTVMtCiAgc3BlY2lmaWMgc3R1ZmYgaW4gdGhlIGNsaWVudCBjb2RlIHRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCgotIFN0ZXZlIEdyZWVuIGZpeGVkIGEgcmV0dXJuIGNvZGUgYnVnIGluIEN1cmxfcmVzb2x2KCksIHRoYXQgbWFkZSB0aGUgc29ja3M1CiAgY29kZSBmYWlsLgoKLSBzd2Fsa2F1cyBhdCB5YWhvby5jb20gcGF0Y2hlZCBsaWJjdXJsIHRvIGlnbm9yZSBDb250ZW50LUxlbmd0aDogaGVhZGVycwogIHdoZW4gVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQgaXMgdXNlZCwgYXMgbWFuZGF0ZWQgYnkgUkZDMjYxNi4KCkRhbmllbCAoMiBEZWNlbWJlcikKLSAtLWZ0cC1wYXN2IHdhcyBhZGRlZCwgd2hpY2ggc2VydmVzIHRoZSBvbmx5IHB1cnBvc2Ugb2Ygb3ZlcnJpZGluZyBhCiAgcHJldmlvdXNseSBzZXQgLS1mdHBwb3J0IG9wdGlvbi4gU3RhcnRpbmcgbm93LCAtLWZ0cC1wb3J0IGlzIGEgcmVjb2duaXplZAogIGFsaWFzIGZvciAtLWZ0cHBvcnQgZm9yIGNvbnNpc3RlbmN5LgoKLSBHaXVzZXBwZSBBdHRhcmRpIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHVzZSBNU0dfTk9TSUdOQUwgd2hlbiB3ZSB1c2UKICBzZW5kKCkgYW5kIHJlY3YoKS4gSSBhZGRlZCBjaGVja3MgZm9yIHRoZSBkZWZpbmUgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgYWRqdXN0ZWQgdGhlIGNvZGUgYWNjb3JkaW5nbHkuIElmIHRoZSBzeW1ib2wgaXMgcHJlc2VudCwgd2Ugd29uJ3QgYXR0ZW1wdAogIHRvIGlnbm9yZSB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDEgRGVjZW1iZXIpCi0gTWF0aGlhcyBBeGVsc3NvbiBzZXQgdXAgYSBic2RmdHBkLXNzbCBzZXJ2ZXIgZm9yIG1lIGFuZCBJIGNvdWxkIG1ha2UgY3VybAogIHJ1biBmaW5lIGFnYWluc3QgaXRzIEZUUFMgaW1wbGVtZW50YXRpb24uIE5vdyB0aGVzZSBGVFBTLXJlbGF0ZWQgdGhpbmdzCiAgd29yazoKICAgbyBleHBsaWNpdCBhbmQgaW1wbGljaXQgRlRQUwogICBvIGFjdGl2ZSAoUE9SVCkgYW5kIHBhc3NpdmUgKFBBU1YpCiAgIG8gdXBsb2FkIGFuZCBkb3dubG9hZAogICBvIHZlcmlmaWVkIGFnYWluc3QgYnNkZnRwZC1zc2wgYW5kIFJhaWRlbkZUUEQKCkRhbmllbCAoMjcgTm92ZW1iZXIpCi0gSmFtZXMgQ2xhbmN5IG1hZGUgdGhlIEJvcmxhbmQgTWFrZWZpbGVzIHVwIHRvIGRhdGUuCgotIE1hcmt1cyBNb2VsbGVyIGltcHJvdmVkIHRoZSBTUE5FR08gZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyNSBOb3ZlbWJlcikKLSBEYXZlIE1heSBmaWxlZCBidWcgcmVwb3J0ICM4NDgzNzEsIGlkZW50aWZ5aW5nIHRoYXQgaWYgeW91J2QgZG8gUE9TVCBvdmVyIGEKICBwcm94eSB0byBhIGh0dHBzIHNlcnZlciwgbGliY3VybCBkaWRuJ3QgUE9TVCBhdCBhbGwsIGl0IGp1c3QgbWFkZSBhIEdFVCEgSXQKICB0dXJuZWQgb3V0IHRvIGJlIGJlY2F1c2UgbGliY3VybCB3cm9uZ2x5IGRpZG4ndCBjb25zaWRlciB0aGUgYXV0aGVudGljYXRpb24KICAibmVnb3RpYXRpb24gcGhhc2UiIHRvIGJlIGNvbXBsZXRlIHlldC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgOTUgdG8gdmVyaWZ5IG15IGZpeCBmb3IgdGhpcy4KCkRhbmllbCAoMjQgTm92ZW1iZXIpCi0gVGhhbmtzIHRvIE1hdGhpYXMgQXhlbHNzb24sIEkndmUgYmVlbiBhYmxlIHRvIHdvcmsgb24gRlRQUyBmb3IgbGliY3VybCBhbmQgaXQKICBzZWVtcyB0byB3b3JrIHNvbWV3aGF0IGZpbmUgbm93LgoKICBUaGUgRlRQUyBzdHVmZiBpcyBiYXNlZCBvbiBSRkMyMjI4IGFuZCB0aGUgbXVycmF5LWF1dGgtZnRwLXNzbCBkcmFmdAogICh2ZXJzaW9uIDEyKS4gVGhlcmUgc2VlbXMgdG8gZXhpc3QgcXVpdGUgYSBmZXcgc2VydmVycyB0aGF0IGhhdmUgaW1wbGVtZW50ZWQKICB0aGUgc2VydmVyIHNpZGUgb2YgdGhpcy4KCiAgV2UgY2FuIG5vdyB1c2UgZnRwczovLyBVUkxzIHRvIGV4cGxpY2l0bHkgc3dpdGNoIG9uIFNTTC9UU0wgZm9yIHRoZSBjb250cm9sCiAgY29ubmVjdGlvbiBhbmQgdGhlIGRhdGEgY29ubmVjdGlvbiAoZGVhbGluZyB3aXRoIHR3byBTU0wgY29ubmVjdGlvbnMgZm9yY2VkCiAgbWUgdG8gY2hhbmdlIGEgbG90IG9mIHN0dWZmIGluIGxpYmN1cmwpLgoKICBBbHRlcm5hdGl2ZWx5LCBhbmQgd2hhdCBzZWVtcyB0byBiZSB0aGUgcmVjb21tZW5kZWQgd2F5LCB3ZSBjYW4gc2V0IHRoZSBuZXcKICBvcHRpb24gQ1VSTE9QVF9GVFBfU1NMIHRvIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CgogICAgIENVUkxGVFBTU0xfTk9QRSwgICAtIGRvIG5vdCBhdHRlbXB0IHRvIHVzZSBTU0wKICAgICBDVVJMRlRQU1NMX1RSWSAgICAgLSB0cnkgdXNpbmcgU1NMLCBwcm9jZWVkIGFueXdheSBvdGhlcndpc2UKICAgICBDVVJMRlRQU1NMX0NPTlRST0wgLSBTU0wgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gb3IgZmFpbAogICAgIENVUkxGVFBTU0xfQUxMICAgICAtIFNTTCBmb3IgYWxsIGNvbW11bmljYXRpb24gb3IgZmFpbAoKICBBbnkgZmFpbHVyZSB0byBzZXQgdGhlIGRlc2lyZWQgbGV2ZWwgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbCB3aXRoIHRoZSBlcnJvcgogIGNvZGUgQ1VSTEVfRlRQX1NTTF9GQUlMRUQuIFRoaXMgbmV3IG9wdGlvbiBtYWtlcyBhICJub3JtYWwiIGZ0cDovLyB0cmFuc2ZlcgogIGF0dGVtcHQgdG8gYmUgbWFkZSBzZWN1cmVseS4KCiAgSSd2ZSBiZWVuIGFibGUgdG8gbG9naW4gYW5kIGdldCBmaWxlcyAocGFzc2l2ZWx5KSBmcm9tIE1hdGhpYXMnIHNlcnZlciB1c2luZwogIGJvdGggZnRwczovLyBhbmQgQ1VSTE9QVF9GVFBfU1NMLiAoSSd2ZSBtYWRlICdjdXJsJyB1bmRlcnN0YW5kIHRoZSAtLWZ0cC1zc2wKICBvcHRpb24gdGhhdCBzZXRzIENVUkxGVFBTU0xfVFJZLikKCi0gR2F6IElxYmFsIGZpeGVkIGEgcmFuZ2Ugc3RyaW5nIG1lbW9yeSBsZWFrLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgV2luZG93cyBidWlsZHMuCgotIEFkZGVkIHRoZSBuZXcgRlRQU1NMIGRlZmluZXMgaW4gY3VybC9jdXJsLmgKCkRhbmllbCAoMjAgTm92ZW1iZXIpCi0gSm9zaCBLYXBlbGwgZmlsZWQgYnVnIHJlcG9ydCAjODQ1MjQ3IGFzIGhlIGZvdW5kIGFuIGVuZGxlc3MgbG9vcCB3aGVuCiAgZ2V0dGluZyBhIDQwNyBiYWNrIGZyb20gYSBwcm94eSB3aGVuIG5vIHVzZXIrcGFzc3dvcmQgd2FzIGdpdmVuLiBBZGRlZCB0ZXN0CiAgY2FzZSA5NCB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTkgTm92ZW1iZXIpCi0gS2V2aW4gUm90aCBmaXhlZCBhIHByb2dyZXNzLWJhciBwcm9ibGVtIG9uIFdpbmRvd3MuCgotIFdoaWxlIHdvcmtpbmcgd2l0aCBOaWNvbGFzIENyb2lzZXQncyBidWcgcmVwb3J0ICM4NDM3MzksIEkgbm90aWNlZCB0d28gbWlub3IKICBwcm9ibGVtcyByZWxhdGVkIHRvIGZ0cCBwYXJ0aWFsIGRvd25sb2FkczogaWYgYSBwYXJ0aWFsIHRyYW5zZmVyIGlzCiAgZGV0ZWN0ZWQsIHdlIG11c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYXMgd2UgY2Fubm90IGtub3cgaW4gd2hhdCBzdGF0ZSBpdCBpcwogIGFueW1vcmUuIFRoaXMgbG9va3MgbGlrZSBhIFByb0ZUUEQgYnVnOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwMy0xMS8wMDc5Lmh0bWwKCkRhbmllbCAoMTcgTm92ZW1iZXIpCi0gTWFjaWVqIFcuIFJvenlja2kgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCB1c2UgYSBjYWNoZSB2YXJpYWJsZSBmb3IgdGhlCiAgd3JpdGFibGUgYXJndiB0ZXN0LiBUaGlzIHdheSwgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYmV0dGVyIChmb3IKICBjcm9zcy1jb21waWxlcyBldGMpCgpEYW5pZWwgKDE1IE5vdmVtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gZm91bmQgb3V0IGxpYmN1cmwgc29tZXRpbWVzIGZyZWVkIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUKICB0d2ljZSwgbGVhZGluZyB0byBjcmFzaGVzIQoKRGFuaWVsICgxNCBOb3ZlbWJlcikKLSBTaWRkaGFydGhhIFByYWthc2ggSmFpbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCByZXNvbHZlIHRoYXQgd2UgZGlkbid0CiAgcHJvcGVybHkgYmFpbCBvdXQgZnJvbSwgd2hlbiB1c2luZyBhcmVzLgoKRGFuaWVsICgxMyBOb3ZlbWJlcikKLSBEZWZhdWx0IENvbnRlbnQtVHlwZSBmb3IgcGFydHMgaW4gbXVsdGlwYXJ0IGZvcm1wb3N0cyBoYXMgY2hhbmdlZCB0bwogICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLiAgVGhpcyBzZWVtcyBtb3JlIGFwcHJvcHJpYXRlLCBhbmQgSSBiZWxpZXZlCiAgbW96aWxsYSBhbmQgdGhlIGxpa2VzIGRvIHRoaXMuIEluIHRoZSBzYW1lIGFyZWE6IC5odG1sIGZpbGVzIG5vdyBnZXQKICB0ZXh0L2h0bWwgYXMgQ29udGVudC1UeXBlLiAoUG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCAjODM5ODA2KQoKLSBHaXNsZSBWYW5lbSBjb3JyZWN0ZWQgdGhlIC0tcHJvZ3Jlc3MtYmFyIG91dHB1dCBieSBkb2luZyBhIGZsdXNoIG9mIHRoZQogIG91dHB1dCwgd2hpY2ggYXBwYXJlbnRseSBtYWtlcyBpdCBsb29rIGJldHRlciBvbiBhdCBsZWFzdCB3aW5kb3dzLCBidXQKICBwb3NzaWJseSBvdGhlciBwbGF0Zm9ybXMgdG9vLgoKLSBQZXRlciBTeWx2ZXN0ZXIgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gdGhlIGNvbm5lY3QgY29kZSwgd2hpY2ggbWFkZSB0aGUKICBtdWx0aSBpbnRlcmZhY2Ugb24gYSBpcHY2LWVuYWJsZWQgc29sYXJpcyBib3ggZG8gYmFkLiBUZXN0IGNhc2UgNTA0IHRvIGJlCiAgc3BlY2lmaWMuIEkndmUgc3BlbnQgc29tZSB0aW1lIHRvIGNsZWFuLXVwIHRoZSBDdXJsX2Nvbm5lY3Rob3N0KCkgZnVuY3Rpb24KICBub3cgdG8gdXNlIGxlc3MgZHVwbGljYXRlZCBjb2RlIGZvciB0aGUgdHdvIGRpZmZlcmVudCBzZWN0aW9uczogaXB2NiBhbmQKICBpcHY0LgoKRGFuaWVsICgxMSBOb3ZlbWJlcikKLSBBZGRlZCBDVVJMT1BUX05FVFJDX0ZJTEUuIFVzZSB0aGlzIHRvIHRlbGwgbGliY3VybCB3aGljaCBmaWxlIHRvIHVzZSBpbnN0ZWFkCiAgb2YgdHJ5aW5nIHRvIGZpbmQgYSAubmV0cmMgaW4gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBUaGUKICBleGlzdGluZyAubmV0cmMgZmlsZSBmaW5kZXIgaXMgc29tZXdoYXQgbmFpdmUgYW5kIGlzIGZhciBmcm9tIHBlcmZlY3Qgb24KICBzZXZlcmFsIHBsYXRmb3JtcyB0aGF0IGFyZW4ndCB1bml4LXN0eWxlLiBJZiB0aGlzIG9wdGlvbiBpc24ndCBzZXQgd2hlbgogIENVUkxPUFRfTkVUUkMgaXMgc2V0LCB0aGUgcHJldmlvdXMgYXBwcm9hY2ggd2lsbCBzdGlsbCBiZSB1c2VkLgoKICBUaGUgY3VycmVudCAubmV0cmMgY2hlY2sgY29kZSBub3cgYWxzbyBzdXBwb3J0IGxvbmdlciB0aGFuIDI1NiBieXRlcyBwYXRoCiAgbmFtZXMuCgpEYW5pZWwgKDEwIE5vdmVtYmVyKQotIEthbmctSmluIExlZSBwb2ludGVkIG91dCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2EtYnVuZGxlLmggZmlsZSBzaG91bGRuJ3QgYmUKICB3cml0dGVuIGluIHRoZSBzb3VyY2UgZGlyIGlmIGEgZGlmZmVyZW50IGJ1aWxkIGRpciBpcyB1c2VkLgoKLSBBZnRlciBT6WJhc3RpZW4gV2lsbGVtaWpucycgYnVnIHJlcG9ydCwgd2Ugbm93IGNoZWNrIHRoZSBzZXBhcmF0b3JzIHByb3Blcmx5CiAgaW4gdGhlIDIyOS1yZXBseSBzZXJ2ZXJzIHJlc3BvbmQgb24gYSBFUFNWIGNvbW1hbmQgYW5kIGJhaWwgb3V0IGJldHRlciBpZgogIHRoZSByZXBseSBzdHJpbmcgaXMgbm90IFJGQzI0MjgtY29tcGxpYW50LgoKRGFuaWVsICg3IE5vdmVtYmVyKQotIEJhc2VkIG9uIEdpc2xlIFZhbmVtJ3MgcGF0Y2gsIEkgbWFkZSBjdXJsIHRyeSBoYXJkZXIgdG8gZ2V0IHRoZSBob21lCiAgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHVzZXIsIGluIG9yZGVyIHRvIGZpbmQgdGhlIGRlZmF1bHQgLmN1cmxyYyBmaWxlLgogIFdlJ3JlIGFsc28gY29uc2lkZXJpbmcgbW92aW5nIG91dCB0aGUgSE9NRS1kaXIgY29kZSBmcm9tIGxpYmN1cmwsIGFuZAogIGluc3RlYWQgaGF2ZSB0aGUgYXBwIHBhc3MgaW4gdGhlIHBhdGggdG8gdGhlIC5uZXRyYyBmaWxlICh3aGljaCBpcyB0aGUgb25seQogIGxvZ2ljIGxlZnQgaW4gbGliY3VybCB0aGF0IHVzZXMgdGhlIEhPTUUgZGlyKS4gVGhlbiBjdXJsIGNhbiB1c2UgdGhlIGhvbWUKICBkaXIgZm9yIHRoYXQgcHVycG9zZSB0b28uCgotIFJhbHBoIE1pdGNoZWxsJ3MgdXBkYXRlZCB0ZXN0Y3VybC5zaCB0byB0aGUgc2NyaXB0IHRvIHRha2UgYW4gZXhpc3RpbmcKICBkaXJlY3RvcnkgbmFtZSBhbmQgYnVpbGQvcnVuL3Rlc3QgY3VybCBpbiB0aGVyZSBpbnN0ZWFkIG9mIHRyeWluZyB0byB1cGRhdGUKICBmcm9tIENWUy4gVXNpbmcgdGhpcyBhcHByb2FjaCwgdGhlIHNjcmlwdCBjYW4gbm93IGJlIHVzZWQgdG8gdGVzdCBkYWlseQogIHRhcmJhbGxzIGV0Yy4KCi0gR2lzbGUgVmFuZW0gYWRkZWQgYSAicmVzb3VyY2UgZmlsZSIgdG8gdGhlIFdpbmRvd3MgRExMIGJ1aWxkcywgdG8gY29udGFpbgogIGluZm9ybWF0aW9uIHN1Y2ggYXMgdmVyc2lvbiBudW1iZXIsIGxpYnJhcnkgbmFtZSwgY29weXJpZ2h0IGluZm8gZXRjLgoKRGFuaWVsICg2IE5vdmVtYmVyKQotIGN1cmwgY2hlY2tzIGlmIHRoZSBleGlzdGluZyBsaWJjdXJsIHN1cHBvcnRzIHRoaW5ncyBsaWtlIC0tbnRsbSwgLS1uZWdvdGlhdGUKICBhbmQgLS1rcmI0IGFuZCByZXR1cm5zIGVycm9yIGlmIG5vdC4KCi0gSSBhZGRlZCB0aHJlZSBuZXcgZ2xvYmFsIGRlZmluZXMgaW4gdGhlIGN1cmwvY3VybC5oIGhlYWRlcjoKICBMSUJDVVJMX1ZFUlNJT05fTUFKT1IsIExJQkNVUkxfVkVSU0lPTl9NSU5PUiBhbmQgTElCQ1VSTF9WRVJTSU9OX1BBVENILiBUaGV5CiAgYXJlIHRoZSB0aHJlZSBudW1iZXJzIGluIHRoZSBsaWJyYXJ5J3MgdmVyc2lvbiBudW1iZXIsIHNlcGFyYXRlZCBmb3IgZWFzaWVyCiAgdXNhZ2UuICdtYWtldGd6JyB3YXMgdXBkYXRlZCBhY2NvcmRpbmdseSB0byBnZW5lcmF0ZSB0aGVzZSBudW1iZXJzIHByb3Blcmx5CiAgd2hlbiBidWlsZGluZyByZWxlYXNlLWFyY2hpdmVzLgoKLSBVbmluaXRpYWxpemVkIHZhcmlhYmxlIGZpeCwgcmVwb3J0ZWQgYnkgYm90aCBNYXJ0eSBLdWhydCBhbmQgQmVuamFtaW4KICBHZXJhcmQuCgotIE1hdHQgVmVlbnN0cmEgcHJvdmlkZWQgYnVpbGQgZmlsZXMgdG8gYnVpbGQgbGliY3VybCBhcyBhICJmcmFtZXdvcmsiIHVuZGVyCiAgTWFjIE9TIFguIFNlZSB0aGUgbGliL2xpYmN1cmwuZnJhbWV3b3JrLm1ha2UgZm9yIGRldGFpbHMuCgotIFJlbW92ZWQgdGhlIGRlZmluZXMgb2YgVFJVRSBhbmQgRkFMU0UgZnJvbSB0aGUgY3VybC9jdXJsLmggaGVhZGVyIGZpbGUuCiAgVGhleSdyZSBub3QgaW4gb3VyIG5hbWUgc3BhY2Ugc28gd2Ugc2hvdWxkIG5vdCBmaWRkbGUgd2l0aCB0aGVtLgoKRGFuaWVsICg1IE5vdmVtYmVyKQotIFJlcGxhY2VkIHRoZSBtYW4gcGFnZSB0byBIVE1MIGNvbnZlcnRlciBwcm9ncmFtIHdpdGggYSBuZXcgb25lOiByb2ZmaXQuCiAgTWFrZXMgbmljZXIgd2ViIHBhZ2VzLgoKRGFuaWVsICg0IE5vdmVtYmVyKQotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZXMgdG8gbGV0IHRoZW0gYnVpbGQgY3VybCBmaW5lCiAgb24gV2luZG93cy4KCi0gS2V2aW4gUm90aCBjb3JyZWN0ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGdlbmVyYXRvciBhbmQgc3BlbGwtZml4ZWQgdGhlCiAgY29tbWVudCBpbiB0aGUgY2EtYnVuZGxlLmggZmlsZS4KClZlcnNpb24gNy4xMC44ICgxIE5vdmVtYmVyIDIwMDMpCgpEYW5pZWwgKDMxIE9jdG9iZXIpCi0gQXNzdW1lIHRoYXQgTURUTSBvbiBhbiBGVFAgc2VydmVyIHJldHVybnMgdGhlIHRpbWVzdGFtcCB1c2luZyB0aGUgVVRDIHRpbWUKICB6b25lLiBUaGlzIGNoYW5nZXMgdGhlIHRpbWUgQ1VSTElORk9fRklMRVRJTUUgcmV0dXJucyBmb3IgYSBnaXZlbiBmaWxlIG92ZXIKICBGVFAsIGFuZCB3aWxsIGNoYW5nZSBleGlzdGluZyB1c2VzIG9mIENVUkxPUFRfVElNRUNPTkRJVElPTi4gSXQgd2lsbCBtYWtlCiAgdGhlIGZ1bmN0aW9uYWxpdHkgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgSFRUUCBvbmUgaXMgYWxyZWFkeSB3b3JraW5nLgoKLSBDb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IHRha2UgbnVtZXJpY2FsIHBhcmFtZXRlcnMgKHN1Y2ggYXMgLXksIC1ZLCAtQyBldGMpCiAgbm93IHJlcG9ydCBlcnJvciBhbmQgZXhpdCBpZiB0aGUgcGFyYW1ldGVyIGlzbid0IHRydWx5IGEgbnVtYmVyIGdyZWF0ZXIgdGhhbgogIG9yIGVxdWFsIHRvIHplcm8uIFRoaXMgaGVscHMgdXNlcnMgdG8gbm90aWNlIGJhZCB1c2FnZSBlYXJsaWVyLiBCZWZvcmUsIHdoZW4KICBhIHVzZXIgZm9yZ290IG9yIG1pc3NlZCB0byBhZGQgYSBudW1lcmljYWwgcGFyYW1ldGVyIHRvIGFuIG9wdGlvbiwgdGhlCiAgY29tbWFuZCBsaW5lIHBhcnNlciB3b3VsZCBzaW1wbHkgImVhdCIgdGhlIGZvbGxvd2luZyBvcHRpb24gYW5kIGl0IHdvdWxkCiAgY2F1c2UgZ3JlYXQgY29uZnVzaW9uLgoKRGFuaWVsICgzMCBPY3RvYmVyKQotIERhdmlkIEh1bGwgbWFkZSBsaWJjdXJsIGRlYWwgd2l0aCBOT0JPRFkgYW5kIEhFQURFUiBmb3IgZmlsZTovLyB0aGUgc2FtZSB3YXkKICBpdCBhbHJlYWR5IGRvZXMgZm9yIEZUUDogaXQgcHJvdmlkZXMgSFRUUC1sb29raW5nIGhlYWRlcnMgdGhhdCBwcm92aWRlIGluZm8KICBvbmx5IGFib3V0IHRoZSBmaWxlLCB3aXRob3V0IGRvaW5nIHRoZSBhY3R1YWwgdHJhbnNmZXIuIFRoZSBjdXJsIHRvb2wgdGhlbgogIGxldHMgLS1oZWFkIGRvIHRoaXMuCgpEYW5pZWwgKDI5IE9jdG9iZXIpCi0gcnVudGVzdHMucGwgbm93IGNoZWNrcyBmb3IgYW5kIHVzZSB2YWxncmluZCBpZiBwcmVzZW50LiBJdCB3aWxsIHJlZGlyZWN0IHRoZQogIHZhbGdyaW5kIHJlc3VsdHMgaW4gbG9nL3ZhbGdyaW5kW251bV0gYnV0IGl0IGN1cnJlbnRseSBkb2Vzbid0IHNjYW4gdGhhdAogIGZpbGUgZm9yIGFueSBlcnJvcnMgb3IgYW55dGhpbmcsIHRoYXQgaXMgc3RpbGwgb25seSBtYWRlIG1hbnVhbGx5LgoKLSBEYXZpZCBIdWxsIG1hZGUgdGhlIGZpbGU6IFVSTCBwYXJzZXIgYWxzbyBhY2NlcHQgdGhlIHNvbWV3aGF0IHNsb3BweSBmaWxlCiAgc3ludGF4OiBmaWxlOi9wYXRoLiBJIGFkZGVkIHRlc3QgY2FzZSAyMDMgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDI4IE9jdG9iZXIpCi0gRGFuIEMgdHJhY2tlZCBkb3duIHlldCBhbm90aGVyIHdlaXJkIGJlaGF2aW9yIGluIHRoZSBnbGliYyBnZXRob3N0YnluYW1lX3IoKQogIGZ1bmN0aW9uIGZvciBzb21lIHNwZWNpZmljIHZlcnNpb25zIChyZXBvcnRlZCBvbiAyLjIuNSBhbmQgMi4xLjEpLCBhbmQKICBwcm92aWRlZCBhIGZpeC4gT24gTGludXggbWFjaGluZXMgd2l0aCB0aGVzZSBnbGliYyB2ZXJzaW9ucywgbm9uLWlwdjYKICBidWlsZHMgb2YgbGliY3VybCB3b3VsZCBvZnRlbiBmYWlsIHRvIHJlc29sdmUgcGVyZmVjdGx5IHJlc29sdmFibGUgaG9zdAogIG5hbWVzLgoKRGFuaWVsICgyNiBPY3RvYmVyKQotIEphbWVzIEJ1cnNhIGZvdW5kIG91dCB0aGF0IGN1cmxfbXNucHJpbnRmKCkgY291bGQgd3JpdGUgdGhlIHRyYWlsaW5nCiAgemVyby1ieXRlIG91dHNpZGUgaXRzIGdpdmVuIGJ1ZmZlciBzaXplLiBUaGlzIGNvdWxkIGhhcHBlbiBpZiB5b3UgZ2VuZXJhdGVkCiAgYSB2ZXJ5IGxvbmcgZXJyb3IgbWVzc2FnZSBhcyB0aGVuIGxpYmN1cmwgd291bGQgb3ZlcndyaXRlIHRoZSBFUlJPUkJVRkZFUgogIHdpdGggb25lIGJ5dGUuIFVzaW5nIGEgbm9uLWV4aXN0aW5nIHZlcnkgbG9uZyBsb2NhbCBmaWxlOi8vIG5hbWUgaXMgb25lIGNhc2UKICB0aGF0IGNvdWxkIG1ha2UgdGhpcyBvY2N1ci4KCkRhbmllbCAoMjQgT2N0b2JlcikKLSBEYXZpZCBIdWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzgyOTgyNy4gSXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aCAtQyAtIGlmCiAgdGhlIGZ1bGwgZmlsZSBhbHJlYWR5IHdhcyBkb3dubG9hZGVkIGFuZCB0aHVzIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYQogIDQxNi4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgdXNlIHRoZSBDb250ZW50LUxlbmd0aDogaGVhZGVyIGFuZCBleHBlY3QKICB0aGF0IHNpemUgdG8gZ2V0IHRyYW5zZmVyLCBjYXVzaW5nIGEgImhhbmciIHVudGlsIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZQogIGNvbm5lY3Rpb24gYW5kIHRoZW4gYW4gZXJyb3IgMTggKCJzdGlsbCBOIGJ5dGVzIGRhdGEgbGVmdCBvZiB0aGUgdHJhbnNmZXIiKS4KCiAgTm93IHdlIGRvbid0IHJldHVybiBhbnkgZXJyb3IgYXQgYWxsLCBidXQgSSB0aGluayBsaWJjdXJsIHNob3VsZCBwZXJoYXBzCiAgcmV0dXJuIHNvbWUga2luZCBvZiBpbmZvIHNpbmNlIHRoZSByZXF1ZXN0ZWQgcmFuZ2Ugd2FzIG91dCBvZiB0aGUgc2l6ZSBvZgogIHRoZSBkb2N1bWVudC4KCi0gQmFzZWQgb24gRGF2aWQgSHVsbCdzIGZpeCBpbiBidWcgcmVwb3J0ICM4MDQ1OTksIHdlIG5vdyBjaGVjayBmb3Igc29sYXJpcyBhbmQKICBnY2MgaW4gY29uZmlndXJlIGFuZCBzZXQgdGhlIC1taW1wdXJlLXRleHQgbGluayBmbGFnIGZvciBsaW5raW5nIHRoZSBsaWIKICBiZXR0ZXIuCgotIEkndmUgaW50cm9kdWNlZCBhIC10IG9wdGlvbiB0byB0aGUgcnVudGVzdHMucGwgc2NyaXB0LiBXaXRoIHRoYXQgb3B0aW9uIHNldCwKICB0aGUgc2NyaXB0IHJ1bnMgc3BlY2lhbCAibWVtb3J5IHRvcnR1cmUiIHRlc3RzLiBGb3IgZWFjaCB0ZXN0IGNvbW1hbmQgbGluZQogIGluIHRoYXQgc2VjdGlvbiwgdGhlIHNjcmlwdCBmaXJzdCBydW5zIHRoZSBjb21tYW5kIGxpbmUgYW5kIGNvdW50cyB0aGUgdG90YWwKICBhbW91bnQgb2YgYWxsb2NhdGlvbnMgbWFkZS4gSXQgdGhlbiBydW5zIHRoZSBleGFjdCBzYW1lIGNvbW1hbmQgbGluZSBhZ2FpbiwKICBmb3JjaW5nIGFsbG9jYXRpb24gbnVtYmVyIE4gdG8gZmFpbC4gSXQgd2lsbCB0cnkgZXZlcnkgTiBmcm9tIDEgdG8gdGhlIHRvdGFsCiAgbnVtYmVyIG9mIGFtb3VudHMgbWFkZS4gRm9yIGV2ZXJ5IGludm9rZSwgaXQgY2hlY2tzIHRoYXQgbm8gbWVtb3J5IHdhcwogIGxlYWtlZCBhcyB0aGF0IHdvdWxkIGluZGljYXRlIGEgYmFkIGNsZWFudXAgc29tZXdoZXJlIGluIHRoZSBjb2RlLgoKICBUaGlzIGlzIGp1c3QgYmVnaW5uaW5nIHRvIHdvcmssIGFuZCBJJ3ZlIGFscmVhZHkgbWFkZSBzb21lIGNvcnJlY3Rpb25zIGluCiAgbGliY3VybCBjb2RlLiBXaGVuIHRoaXMgY29kZSB3b3JrcyBzb21ld2hhdCBmaW5lLCBJJ2xsIG1ha2Ugc3VyZSAnbWFrZSB0ZXN0JwogIGluIHRoZSByb290IGRpciB3aWxsIHJ1biB0aGVzZSB0ZXN0cyBhcyB3ZWxsLgoKRGFuaWVsICgyMyBPY3RvYmVyKQotIEdlb3JnIEhvcm4gZml4ZWQgaG93IHRoZSBDQSB2ZXJpZmljYXRpb24gaXMgbWFkZS4gVmVyaWZpY2F0aW9ucyBjYW4gbm93IGJlCiAgbWFkZSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIHRoZSByZXN1bHQgb2YgaXQgY2FuIGJlIGlnbm9yZWQuIFRoaXMgYWxzbwogIGFmZmVjdHMgdGhlIGN1cmwgdG9vbCBhcyAtayBjYW4gbm93IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAtLWNhY2VydCBvcgogIC0tY2FwYXRoLgoKRGFuaWVsICgyMiBPY3RvYmVyKQotIEdpc2xlIFZhbmVtIGZvdW5kIG91dCAtLWRpc2FibGUtZXBydCBkaWRuJ3Qgd29yayBhbmQgcGF0Y2hlZCBpdC4KCi0gVGVzdCBjYXNlIDkxIHdhcyBtb2RpZmllZCBhbmQgY291bGQgbm93IHJlcGVhdCB0aGUgcHJvYmxlbSBLZXZpbiBSb3RoIGhhcwogIHJlcG9ydGVkLCBhbmQgdGhlIGJ1ZyB3YXMgZml4ZWQuCgotIER5bGFuIEVsbGljb3R0IGFkZGVkIHZjLWxpYmN1cmwtc3NsLWRsbCBhcyBhIHRhcmdldCB0byB0aGUgcm9vdCBtYWtlZmlsZQogIHRvIGJ1aWxkIGEgc3RhdGljIGxpYmN1cmwgdGhhdCBsaW5rcyB3aXRoIGEgc2hhcmVkIE9wZW5TU0wgdXNpbmcgTVNWQy4KCkRhbmllbCAoMjEgT2N0b2JlcikKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjEwLjgtcHJlNSAoMjEgT2N0b2JlciAyMDAzKQoKRGFuaWVsICgxOSBPY3RvYmVyKQotIEdlb3JnIEhvcm4gbWFkZSBsaWJjdXJsIG91dHB1dCBtb3JlIGluZm8gb24gU1NMIGZhaWx1cmVzIHdoZW4gcmVjZWl2aW5nCiAgZGF0YS4KClZlcnNpb24gNy4xMC44LXByZTQgKDE4IE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTcgT2N0b2JlcikKLSBEb21pbmljayBNZWdsaW8gaW1wbGVtZW50ZWQgQ1VSTE9QVF9NQVhGSUxFU0laRSBhbmQgLS1tYXgtZmlsZXNpemUuCgotIE1hZGUgbGliY3VybCBzaG93IHZlcmJvc2UgaW5mbyBhYm91dCB3aGF0IGF1dGggdHlwZSBhbmQgdXNlciBuYW1lIHRoYXQgaXMKICBiZWluZyBzZW50IGluIGl0cyBIVFRQIHJlcXVlc3QtaGVhZGVycy4KCkRhbmllbCAoMTYgT2N0b2JlcikKLSBSZW1vdmVkIHN1cHBvcnQgZm9yIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4gbGliY3VybAogIG5vIGxvbmdlciBwcm9tcHQgZm9yIHBhc3N3b3JkcyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4gUGFzc3dvcmQgcHJvbXB0aW5nCiAgd2FzIGluc3RlYWQgbW92ZWQgdG8gY3VybCwgd2hpY2ggbm93IHByb21wdHMgZm9yIHBhc3N3b3JkIGlmIC11IG9yIC1VIGxhY2sKICBpdC4gVGhpcyBzb2x2ZXMgdGhlIHByb2JsZW0gS2V2aW4gUm90aCByZXBvcnRlZCB3aGVuIGN1cmwgcHJvbXB0ZWQgZm9yCiAgcGFzc3dvcmQgdHdpY2Ugd2hlbiBkb2luZyBOVExNIGF1dGhlbnRpY2F0aW9uLgoKLSBJIHJld3JvdGUgdGhlIFNTTCBzdWJqZWN0QWx0TmFtZSBjaGVjayB0byBhdm9pZCBoYXZpbmcgdG8gcmVseSBvbiBPcGVuTERBUC0KICBsaWNlbnNlZCBkZXJpdmF0ZSBjb2RlLgoKRGFuaWVsICgxNSBPY3RvYmVyKQotIEF2b2lkIGRvaW5nIGdldHNvY2tvcHQoKSBvbiBXaW5kb3dzIHRvIHZlcmlmeSBjb25uZWN0cy4gSXQgc2VlbXMgdGhhdCB0aGlzCiAgaG9ncyBXaW5kb3dzIG1hY2hpbmVzIHdoZW4gbGliY3VybCBpcyBiZWluZyB1c2VkIG11bHRpLXRocmVhZGVkICh3aXRoID4gfjUwCiAgdGhyZWFkcykuIEFuZHJldyBGdWxsZXIgaGVscGVkIHVzIHZlcmlmeSBhbmQgdGVzdCB0aGlzLgoKRGFuaWVsICgxNCBPY3RvYmVyKQotIEtpbW1vIEtpbm51bmVuIGZpeGVkIGEgY3Jhc2ggd2l0aCBkdXBoYW5kbGUoKSB3aGVuIENVUkxERUJVRyBpcyBzZXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgbGliY3VybCBidWlsZCBhbmQgd29yayB3aXRoIElQdjYgb24gV2luZG93cy4KCkRhbmllbCAoMTMgT2N0b2JlcikKLSBHaXVzZXBwZSBBdHRhcmRpIHJlcG9ydGVkIHlldCBhbm90aGVyIHNlZ2ZhdWx0IHdpdGggYXJlcyBhbmQgdGhlIG11bHRpCiAgaW50ZXJmYWNlLiBNZSBmaXhlZC4KCi0gRG9tZW5pY28gQW5kcmVvbGkgcmVtb3ZlZCB0aGUgZXh0cmEgTERGTEFHUyBhc3NpZ25tZW50IGluIGxpYi9NYWtlZmlsZS5hbQogIHRoYXQgd2FzIHJlcG9ydGVkIGFib3V0IGluIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjMjEyMDg2LgoKICBEb21lbmljbyBhbHNvIGZpeGVkIHR3byBtYWtlZmlsZXMgd2hlcmUgd2UgdXNlZCAnZ25yb2ZmJyBpbnN0ZWFkIG9mIHRoZSBtb3JlCiAgcG9ydGFibGUgJChOUk9GRikuCgpEYW5pZWwgKDEyIE9jdG9iZXIpCi0gRGlyayBNYW5za2UgbWFkZSB0aGUgc2hhcmUgbG9ja2luZyBhcm91bmQgRE5TIGxvb2t1cHMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvCiAgYWxsb3cgdGhlIHNoYXJlIHN5c3RlbSdzIEROUyBsb29rdXBzIHRvIHJ1biBzb21ld2hhdCBtb3JlCiAgaW5kZXBlbmRlbnQvZmFzdGVyLgoKRGFuaWVsICg5IE9jdG9iZXIpCi0gTGFjaGxhbiBPJ0RlYSBmaXhlZCBhIHJlc3VtZSBwcm9ibGVtOiAiSWYgSSBzZXQgQ1VSTE9QVF9SRVNVTUVfRlJPTSwgcGVyZm9ybQogIGFuIEhUVFAgZG93bmxvYWQsIHRoZW4gcmVzZXQgQ1VSTE9QVF9SRVNVTUVfRlJPTSB0byAwLCB0aGUgbmV4dCBkb3dubG9hZAogIHN0aWxsIGhhcyBhIFJhbmdlIGhlYWRlciB3aXRoIGEgZ2FyYmFnZSB2YWx1ZS4iIGJ1ZyByZXBvcnQgIzgyMDUwMgoKLSBEb21pbmljayBNZWdsaW8gbWFkZSB0aGUgaW5ldF9wdG9uLmMgZmlsZSBidWlsZCBmaW5lIHVzaW5nIE1TVkMuCgotIFRoZSAnc3dzJyB0ZXN0IHN1aXRlIHdlYiBzZXJ2ZXIgbm93ICNpbmNsdWRlIHNldHVwLmggZnJvbSB0aGUgbGliIGRpcmVjdG9yeS4KICBUaGlzIG1ha2VzIGl0IG1vcmUgcG9ydGFibGUgZWFzaWVyLgoKVmVyc2lvbiA3LjEwLjgtcHJlMyAoOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDggT2N0b2JlcikKLSBGcmFuayBUaWNoZWxlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZXMgaG93IGxpYmN1cmwgY29ubmVjdHMgdG8gbXVsdGlwbGUKICBhZGRyZXNzZXMsIGlmIG9uZSBvZiB0aGVtIGZhaWxzIChpcHY0LWNvZGUpLgoKRGFuaWVsICg3IE9jdG9iZXIpCi0gTmVpbCBEdW5iYXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIGNoZWNrIFNTTAogIHN1YmplY3RBbHROYW1lcyB3aGVuIG1hdGNoaW5nIGNlcnRzLiBUaGlzIGlzIGFwcGFyZW50bHkgZGV0YWlsZWQgaW4gUkZDMjgxOAogIGFzIHRoZSByaWdodCB0aGluZyB0byBkby4gSSBoYWQgdG8gYWRkIGNvbmZpZ3VyZSBjaGVja3MgZm9yIGluZXRfcHRvbigpIGFuZAogIG91ciBvd24gKHN0cmljdGx5IHNwZWFraW5nLCBjb2RlIGZyb20gQklORCB3cml0dGVuIGJ5IFBhdWwgVml4aWUpIHByb3ZpZGVkCiAgY29kZSBmb3IgdGhlIGZ1bmN0aW9uIGZvciBwbGF0Zm9ybXMgdGhhdCBtaXNzIGl0LgoKLSBIVFRQIFBPU1QgdXNpbmcgdGhlIHJlYWQgY2FsbGJhY2sgZGlkbid0IHdvcmssIGFzIEZsb3JpYW4gU2Nob3BwbWFubgogIHJlcG9ydGVkLgoKRGFuaWVsICg1IE9jdG9iZXIpCi0gU2hhcmVkIHByb3ZpZGVkIGEgZmV3IGZpeGVzIHRvIG1ha2UgbGliY3VybCBidWlsZCBvbiBCZU9TCiAgb3V0LW9mLXRoZS1ib3guIE5ldyBjb2RlIGZvciBCZU9TLXN0eWxlIG5vbi1ibG9ja2luZyBzb2NrZXRzLCBwcm92aWRlZCBieQogIFNoYXJkIGFuZCBKZXJlbXkgRnJpZXNuZXIuIE1vZGlmaWVkIHRoZSBhdXRvY29uZiBjaGVjayBmb3Igbm9uLWJsb2NraW5nCiAgc29ja2V0cyB0byBjaGVjayBmb3IgdGhpcyBraW5kIHRvby4KCkRhbmllbCAoNCBPY3RvYmVyKQotIFZpbmNlbnQgQnJvbm5lciBwb2ludGVkIG91dCB0aGF0IGlmIHlvdSBzZXQgQ1VSTE9QVF9DT09LSUUgZm9yIGEgdHJhbnNmZXIKICBhbmQgdGhlbiBzZXQgaXQgdG8gTlVMTCBpbiBhIHN1YnNlcXVlbnQgb25lLCB0aGUgcHJldmlvdXMgY29va2llIHdhcyBzdGlsbAogIHNlbnQgb2ZmIQoKLSBKb24gVHVybmVyIGZpeGVkIGEgcHJvYmxlbSBsaWJjdXJsIGhhZCB3aGVuIGl0IGZhaWxlZCBvbiBhbiBGVFAgdHJhbnNmZXIgZHVlCiAgdG8gYSBiYWQgcGF0aCwgaXQgd291bGQgY2F1c2UgdGhlIG5leHQgdHJhbnNmZXIgdG8gdXNlIGEgYmFkIHBhdGggYXMgd2VsbC4KCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gcHJvdmlkZWQgYSBwYXRjaCB3aXRoIGEgZml4IGZvciBsaWJjdXJsIHdpdGggYXJlcywKICB3aGVuIHdvcmtpbmcgb24gSVAtb25seSBuYW1lcyBhcyB3ZSB0aGVuIGNvdWxkIHJldHVybiAid2FpdCIgc3RhdHVzIHdoZW4gdGhlCiAgbmFtZSBpbiBmYWN0IGFscmVhZHkgd2FzIHJlc29sdmVkLiBJIGVkaXRlZCB0aGUgcGF0Y2ggc2xpZ2h0bHkgdG8gbm90IGV4cG9zZQogIGFzeW5jaCBkZXRhaWxzIHRvIG5vbi1hcmVzIGF3YXJlIHNvdXJjZSBjb2RlLgoKRGFuaWVsICgzIE9jdG9iZXIpCi0gTmVpbCBTcHJpbmcgcG9zdGVkIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjMjEzMTgwLCBhbmQgcG9pbnRlZCBvdXQgdGhhdCB1c2luZwogIHRoZSBuYW1lICdhY2Nlc3MnIGluIGEgZnVuY3Rpb24gcHJvdG90eXBlIGlzIG5vdCB2ZXJ5IHdpc2UgYXMgc29tZSBjb21waWxlcnMKICBjb21wbGFpbi4KCi0gUGV0ZXIgU3lsdmVzdGVyIHByb3ZpZGVkIGhpcyBhbmQgSmVhbi1QYXVsIE1lcmxpbidzIGN1cmx4LmMgZXhhbXBsZSBzb3VyY2UKICBjb2RlIHRoYXQgc2hvd3MgaG93IHRoZXkgdXNlIHNzbCBhbmQgY2FsbGJhY2tzLgoKRGFuaWVsICgyIE9jdG9iZXIpCi0gSmFtZXMgTWFjTWlsbGFuJ3MgcGF0Y2ggbWFrZXMgY3VybCBidWlsZCBvbiBRTlggNi4yLnguCgpEYW5pZWwgKDI2IFNlcHRlbWJlcikKLSBNeSBkYXVnaHRlciB3YXMgYm9ybiEKCkRhbmllbCAoMjMgU2VwdGVtYmVyKQotIEFkZGVkIHN1cHBvcnQgZm9yIC00Ly0taXB2NCBhbmQgLTYvLS1pcHY2IHRvIGZvcmNlIG5hbWVzIHRvIHJlc29sdmUgdG8gdGhhdAogIHBhcnRpY3VsYXIgSVAgdmVyc2lvbi4gVGhleSBvbmx5IHdvcmsgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCi0gY3VybCAtViBub3cgb3V0cHV0cyAnU1BORUdPJyBhcyBhIGZlYXR1cmUgaW4gY2FzZSBsaWJjdXJsIHdhcyBidWlsdCB0bwogIHN1cHBvcnQgdGhhdC4KClZlcnNpb24gNy4xMC44LXByZTIgKDIyIFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICgyMiBTZXB0ZW1iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSBmb3VuZCBhIHNlZ2ZhdWx0IGluIGxpYmN1cmwgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2l0aCBhcmVzIGFuZCBkb2luZyByZXBlYXRlZCBvcGVyYXRpb25zIGFnYWluc3QgYSBub24tcmVzb2x2aW5nIGhvc3QgbmFtZS4KCkRhbmllbCAoMTkgU2VwdGVtYmVyKQotIEFkZGVkIHRoZSBDVVJMT1BUX0lQUkVTT0xWRSBvcHRpb24sIHRoYXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNlbGVjdAogIHdoYXQga2luZCBvZiBJUCBhZGRyZXNzZXMgaGUgd2FudHMgdG8gdXNlIHdoZW4gcmVzb2x2aW5nIGhvc3QgbmFtZXMuIFRoaXMKICBpcyBvbmx5IGludGVyZXN0aW5nIHdoZW4gdXNpbmcgaG9zdCBuYW1lcyB0aGF0IHJlc29sdmUgYWRkcmVzc2VzIHVzaW5nIG1vcmUKICB0aGFuIG9uZSB2ZXJzaW9uIG9mIElQLgoKLSBBcHBsaWVkIE1hcmt1cyBNb2VsbGVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIFNQTkVHTyBzdXBwb3J0IGlmIGxpYmN1cmwKICBpcyBidWlsdCB3aXRoIHRoZSBGQm9wZW5zc2wgbGlicmFyaWVzLiBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zCiAgaW5mbyBvbiBTUE5FR08gYXZhaWxhYmlsaXR5LiBUaGUgcGF0Y2ggYWxzbyBtYWRlIHRoZSBHU1NBUEkgc3R1ZmYgd29yayBmaW5lCiAgd2l0aCB0aGUgTUlUIEdTUy1saWJyYXJ5ICh0aGUgSGVpbWRhbCBvbmUgc3RpbGwgd29ya3MgdG9vKS4KCkRhbmllbCAoMTYgU2VwdGVtYmVyKQotIERvaW5nIFBVVCB3aXRoIC0tZGlnZXN0IGZhaWxlZCwgYXMgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjODA1ODUzLgoKLSBVc2luZyAtLWFueWF1dGggdGhhdCBwaWNrZWQgTlRMTSwgYW5kIHRoZW4gYSByZWRpcmVjdCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24KICBhbmQgdG9vayBjdXJsIHRvIGEgc2Vjb25kIE5UTE0gcGFnZSBtYWRlIGN1cmwgZmFpbC4gQnVnIHJlcG9ydCAjODA2MzI4CiAgaWRlbnRpZmllZCB0aGUgcHJvYmxlbSwgdGVzdCBjYXNlIDkwIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTQgU2VwdGVtYmVyKQotIGNvZGVtYXN0ciBicm91Z2h0IGEgcGF0Y2ggZm9yIGFyZXMgdG8gbWFrZSB0aGUgV2luZG93cyBwb3J0aW9ucyBvZiBpdCB3b3JrCiAgcHJvcGVybHkgb24gTlQ0LiBJIHVwbG9hZGVkIGEgbmV3IGRpZmYgYW5kIHVwZGF0ZWQgdGhlIGRvY3Mgb24gd2hlcmUgdG8gZ2V0CiAgaXQgZXRjLgoKLSBKZWZmIFBvaGxtZXllciB0cmFja2VkIGRvd24gYSB2ZXJ5IGhhcmQtdG8tZmluZCBidWcgd2hlcmUgd2UgcmVtb3ZlZCBhCiAgY2FjaGVkIEROUyBlbnRyeSBldmVuIHRob3VnaCBpdCBtYXkgYmUgaW4gdXNlLCB3aGljaCBjYXVzZWQgInJhbmRvbSIgbWVtb3J5CiAgdG8gZ2V0IG92ZXJ3cml0dGVuIGFuZCB0aHVzICJyYW5kb20iIGNyYXNoZXMuCgpEYW5pZWwgKDEyIFNlcHRlbWJlcikKLSBCYXNlZCBvbiBhIGJ1ZyByZXBvcnQgYnkgRGF2aWQgS2ltZG9uLCBJIG1hZGUgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBjbGVhcgogIGFsbCBwb3NzaWJsZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHRoZSB0ZXN0cyBhcmUgcnVuLgoKLSBCeSBkZWZhdWx0LCBlYXN5IGhhbmRsZXMgd2l0aGluIGEgbXVsdGkgaGFuZGxlIG5vdyBzaGFyZSBETlMgY2FjaGUuCgotIFRpbSBCYXJ0bGV5IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBHU1NORUdPVElBVEUgb3B0aW9uIHdvcmsgZm9yCiAgTWljcm9zb2Z0J3MgIk5lZ290aWF0ZSIgYXV0aGVudGljYXRpb24gYXMgd2VsbC4KCkRhbmllbCAoMTEgU2VwdGVtYmVyKQotIEEgemVyby1sZW5ndGggcHJveHkgc3RyaW5nIGNvbmZ1c2VkIEZUUCB0cmFuc2ZlcnMuCgotIEJqb3JuIFJlZXNlIGZvdW5kIGEgY2FzZSB3aXRoIGFuIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciwgb25seSBwcmVzZW50IHdoZW4KICBidWlsdCBmb3IgYXJlcy4KClZlcnNpb24gNy4xMC44LXByZTEgKDggU2VwdGVtYmVyIDIwMDMpCgpEYW5pZWwgKDcgU2VwdGVtYmVyKQotIEp1cmlqIFNtYWtvdiBmb3VuZCBvdXQgdGhhdCB0aGUgbm9uLU9wZW5TU0wgTUQ1IGNvZGUgd2FzIG5vdCB3b3JraW5nIG9uCiAgQWxwaGEgKG9yIGlhNjQpLiBPbmx5IHRoZSBPcGVuU1NMLXZlcnNpb24gZGlkLiBJIG1hZGUgYSBmaXggSSB0aGluayBjb3JyZWN0cwogIHRoZSBwcm9ibGVtLgoKRGFuaWVsICg1IFNlcHRlbWJlcikKLSBLZXZpbiBGaXNrIHJlcG9ydGVkIHRoYXQgY29uZmlndXJlIC0tZW5hYmxlLXRocmVhZCBkaWRuJ3Qgd29yay4gSSBmaXhlZC4KCi0gRGUtbWFjcm9maWVkIHRoZSBsaWIvaGFzaC5jIHNvdXJjZSBjb2RlIHNvbWV3aGF0LgoKRGFuaWVsICg0IFNlcHRlbWJlcikKLSBDVVJMSU5GT19IVFRQQVVUSF9BVkFJTCBhbmQgQ1VSTElORk9fUFJPWFlBVVRIX0FWQUlMIGFkZGVkLCBCYXNlZCBvbiBKb2VyZwogIE11ZWxsZXItVG9saydzIHBhdGNoLAoKRWFybHkgKDQgU2VwdGVtYmVyKQotIEFkZGVkIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQgLSBhbGxvd3MgdXNlciB0byBzZXQgc3RyaWN0IHRpbWVvdXQKICByZXF1aXJlbWVudHMgb24gdGhlIEZUUCBzZXJ2ZXIncyBhYmlsaXR5IHRvIHJlc3BvbmQgdG8gaW5kaXZpZHVhbCBjb21tYW5kcwogIHdpdGhvdXQgcGxhY2luZyBnbG9iYWwgcmVxdWlyZW1lbnRzIG9uIHRyYW5zZmVyIG9yIGNvbm5lY3QgdGltZS4gIEZpbGVzCiAgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBicmFuY2ggaW5zaWRlIEN1cmxfR2V0RlRQUmVzcG9uc2UgdG8gY2hlY2sgZm9yCiAgICAgICAgZGF0YS0+c2V0LmZ0cF9yZXNwb25zZV90aW1lb3V0CiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfcmVzcG9uc2VfdGltZW91dCB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCkRhbmllbCAoMyBTZXB0ZW1iZXIpCi0gUGV0ZXIgUGVudGNoZXYgZm91bmQgYW5kIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgdGVzdCBzdWl0ZSdzIHdlYiBzZXJ2ZXIKICBjb2RlLCB0aGF0IG1hZGUgaXQgc2VnZmF1bHQgYXQgdGltZXMuCgotIEr2cmcgTXVlbGxlci1Ub2xrIGltcHJvdmVkIHRoZSBwcm94eSB1c2VyK3Bhc3N3b3JkIGhhbmRsaW5nLCBlc3BlY2lhbGx5CiAgd2hlbiBwcm92aWRpbmcgYSBibGFuayBwYXNzd29yZC4KCkRhbmllbCAoMiBTZXB0ZW1iZXIpCi0gRml4IGZvciBtYWtpbmcgQ09OTkVDVCB0byBwcm94aWVzIGRvIHRoZSBjb3JyZWN0IG1hZ2ljIHRvIGFsbG93IE5UTE0sIERpZ2VzdAogIGFuZCBzaW1pbGFyIHRvIHdvcmsuCgpEYW5pZWwgKDEgU2VwdGVtYmVyKQotIEhlbnJpayBTdG9ybmVyIG1hZGUgbGliY3VybCB3b3JrIGZpbmUgd2l0aCBPcGVuTERBUCAyLjEuMjIgKGN1cnJlbnQpLgoKLSBKZWZmIFBvaGxtZXllciBhZGRlZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIGZvciBub24tcmVzb2x2aW5nIGhvc3RzIHdoZW4KICB1c2luZyBhcmVzIGZvciBsb29rdXBzLgoKRGFuaWVsICgyNSBBdWd1c3QpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIHRoYXQgY3VybCAtayBzdGlsbCBmYWlsZWQgaWYgdGhlIEhUVFBTIHNlcnZlcidzIENOCiAgZmllbGQgd2Fzbid0IG9idGFpbmFibGUuIFRoaXMgd2FzIGR1ZSB0byB0aGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBiZWluZwogIHNldCB0byAxLCBhbmQgbGliY3VybCBmYWlsZWQgaWYgdGhlIENOIHdhcyBtaXNzaW5nLiBTdGFydGluZyBub3csIGhhdmluZyBpdAogIHNldCB0byAxIHdpbGwgc2ltcGx5IG91dHB1dCBhIHdhcm5pbmcgaWYgbm8gQ04gY291bGQgYmUgb2J0YWluZWQgKGFzIGhhdmluZwogIGEgbWlzbWF0Y2ggaXMgT0spLgoKRGFuaWVsICgyMSBBdWd1c3QpCi0gVmluY2VudCBTYW5kZXJzIHByb3ZpZGVkIGEgZml4IGZvciBuYW1lIHJlc29sdmluZyB3aGVuIGxpbmtlZCB3aXRoIHVDbGliYy4KCkRhbmllbCAoMjAgQXVndXN0KQotIEdlcmQgdi4gRWdpZHkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RvcmUgdGhlIEZUUCByZXNwb25zZQogIGNvZGUgZnJvbSBmdHAgc2VydmVycy4gVXNpbmcgY3VybF9lYXN5X2dldGluZm8oKSB3aXRoIENVUkxJTkZPX0hUVFBfQ09ERQogIHJldHVybnMgdGhhdCBkYXRhLiBUaGUgb3B0aW9uIGlzIHRoZXJlZm9yZSBub3cgYWxzbyBrbm93biBhcwogIENVUkxJTkZPX1JFU1BPTlNFX0NPREUuCgotIEFudG9pbmUgQ2FsYW5kbyBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gZG9pbmcgbXVsdGktcGFydC9mb3JtcG9zdCB1c2luZwogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgotIEFudG9pbmUgQ2FsYW5kbyBwb2ludGVkIG91dCB0aGF0IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgZGlkbid0IHNldCB0aGUKICBtc2dzX2luX3F1ZXVlIHRvIDAgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgTlVMTC4KCkRhbmllbCAoMTkgQXVndXN0KQotIEkgbWFkZSBjdXJsIHN1cHBvcnQgbXVsdGlwbGUgLVQgb3B0aW9ucywgYXMgd2VsbCBhcyAtVCAie2ZpbGUxLGZpbGUyfSIKICBzdHlsZSBnbG9iYmluZy4gT25lIC1UIGZvciBlYWNoIFVSTCBpcyBzdXBwb3J0ZWQuCgotIEplZmYgUG9obG1leWVyIGZvdW5kIGEgc2VnZmF1bHQgd2hlbiB1c2luZyBhcmVzLWVuYWJsZWQgbGliY3VybCBhbmQgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIHdoZW4gdHJ5aW5nIGEgbm9uLWV4aXN0aW5nIGhvc3QgbmFtZS4KCi0gTWFkZSB0aGUgbGliY3VybCBwcmludGYgY29kZSBzdXBwb3J0IGxvbmcgbG9uZ3MgaWYgYXZhaWxhYmxlLgoKLSBMb3JlbiBLaXJrYnkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBkaWQgbm90IGNsZWFuIHVwIGFsbCBTU0wtYWxsb2NhdGVkIG1lbW9yeQogIGluIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KCkRhbmllbCAoMTcgQXVndXN0KQotIFNldHRpbmcgQ1VSTE9QVF9XUklURUZVTkNUSU9OIG9yIENVUkxPUFRfUkVBREZVTkNUSU9OIHRvIE5VTEwgd2lsbCBub3cgbWFrZQogIHRoZW0gZ2V0IHRoZSBpbnRlcm5hbCBkZWZhdWx0cyByZXN0b3JlZC4gUHJldmlvdXNseSB0aGlzIGNvdWxkIGNhdXNlIGEKICBzZWdmYXVsdC4gV2Ugc2hvdWxkIGFpbSBhdCBoYXZpbmcgYWxsIHBvaW50ZXItcmVsYXRlZCBvcHRpb25zIGdldCByZXN0b3JlZAogIHRvIGRlZmF1bHQvc2FmZSB2YWx1ZXMgd2hlbiBzZXQgdG8gTlVMTC4KClZlcnNpb24gNy4xMC43ICgxNSBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTQgQXVndXN0KQotIEkgbW9kaWZpZWQgdGhlIG1lbWRlYnVnIHN5c3RlbSB0byByZXR1cm4gZmFpbHVyZSBvbiBtZW1vcnkgYWxsb2NhdGlvbgogIGZ1bmN0aW9ucyBhZnRlciBhIHNldCBhbW91bnQgb2Ygc3VjY2Vzc2Z1bCBvbmVzLiBUaGlzIGVuYWJsZXMgdXMgdG8gdGVzdAogIG91dC1vZi1tZW1vcnkgc2l0dWF0aW9ucyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyIGFuZCB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQKICBjdXJsL2xpYmN1cmwgYmVoYXZlcyBnb29kIGluIHRob3NlLgoKICBUaGlzIG1hZGUgbWUgZmluZCBhbmQgZml4IHNldmVyYWwgc3BvdHMgd2hlcmUgd2UgZGlkIG5vdCBjbGVhbnVwIHByb3Blcmx5CiAgd2hlbiBiYWlsaW5nIG91dCBkdWUgdG8gZXJyb3JzIChsb3cgbWVtb3J5KS4KCi0gQ29ycmVjdGVkIHRlc3QgY2FzZSA3NC4gTWFkZSB1c2luZyAtbyB3aXRoIGJhZCAjW251bV0gY29kZXMgY29tcGxhaW4gYW5kCiAgYmFpbCBvdXQuIE1hZGUgI1tudW1dIHN1cHBvcnQgbnVtYmVycyBsYXJnZXIgdGhhbiA5IGFzIHdlbGwuIEFkZGVkIHRlc3QKICBjYXNlIDg2IGZvciBhIHByb3BlciByYW5nZSBnbG9iYmluZyB0ZXN0IGFzIHdlbGwuCgpWZXJzaW9uIDcuMTAuNy1wcmU0ICgxMiBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTIgQXVndXN0KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBmbGFnIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXN5bmNoIEROUwogIHN1cHBvcnQsIGFuZCB0aGlzIGlzIG5vdyBhbHNvIGRpc3BsYXllZCB3aXRoICdjdXJsIC1WJy4KCi0gQWRkZWQgYSBmZXcgbmV3IG1hbiBwYWdlcyB0byB0aGUgZG9jcy9saWJjdXJsIGRpcjogY3VybF9zaGFyZV9pbml0LAogIGN1cmxfc2hhcmVfc2V0b3B0LCBjdXJsX3NoYXJlX2NsZWFudXAsIGxpYmN1cmwtZWFzeSBhbmQgbGliY3VybC1zaGFyZS4KCkRhbmllbCAoMTEgQXVndXN0KQotIE1pa2UgQ2hlcmVwb3YgbWFkZSB0aGUgbG9jYWwgYmluZGluZyBjb2RlIHdvcmsgZm9yIFdpbmRvd3MsIHdoaWNoIG1ha2VzCiAgdGhlIG9wdGlvbiBDVVJMT1BUX0lOVEVSRkFDRSB3b3JrIG9uIFdpbmRvd3MgYXMgd2VsbC4KCi0gVmluY2VudCBTYW5kZXJzIHVwZGF0ZWQgdGhlIGZvcGVuLmMgZXhhbXBsZSBjb2RlIGEgbG90LgoKLSAtLXByb3h5LW50bG0gaXMgbm93IHN1cHBvcnRlZCBieSB0aGUgY3VybCB0b29sLiBJdCBmb3JjZXMgdGhlIHByb3h5CiAgYXV0aGVudGljYXRpb24gdG8gYmUgbWFkZSB1c2luZyBOVExNLiBJdCBkb2VzIG5vdCB5ZXQgd29yayBmb3IgSFRUUFMgb3ZlcgogIHByb3hpZXMgKG9yIG90aGVyIHByb3h5LXR1bm5lbGluZyBvcHRpb25zKS4gVGVzdCBjYXNlIDgxIGFuZCA4MiBkbyBzb21lCiAgc2ltcGxlIGluaXRpYWwgbnRsbSB0ZXN0aW5nLgoKLSBGb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHdpdGgKICBwcm94eS1hdXRoZW50aWNhdGlvbi4KCi0gSSByZW1vdmVkIC1AIGFuZCAtWiBhcyB2YWxpZCBzaG9ydCBvcHRpb25zLiBUaGV5IHdlcmUgdmVyeSByYXJlbHkgdXNlZCAoQAogIHdhc24ndCBldmVuIGRvY3VtZW50ZWQpLgoKLSBTZXJnZSBTZW1hc2hrbyBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlBVVRILCBhbmQgbWFrZSBpdCB3b3JrIHdoZW4gc2V0IHRvCiAgQ1VSTEFVVEhfTlRMTSBhbmQvb3IgQ1VSTEFVVEhfQkFTSUMuIFRoZSBQUk9YQVVUSCBpcyBzaW1pbGFyIHRvIEhUVFBBVVRILAogIGJ1dCBpcyBmb3IgdGhlIHByb3h5IGNvbm5lY3Rpb24gb25seSwgYW5kIEhUVFBBVVRIIGlzIGZvciB0aGUgcmVtb3RlIGhvc3QuCgotIEZpeGVkIGxvYWRpbmcgb2YgY29va2llcyB3aXRoIGJsYW5rIGNvbnRlbnRzIGZyb20gYSBjb29raWUgamFyLiBBbHNvIG1hZGUgdGhlCiAgY29va2llIGZ1bmN0aW9ucyBpbmZvcm0gb24gYWRkZWQgYW5kIHNraXBwZWQgY29va2llcyAoZm9yIGNvb2tpZSBkZWJ1Z2dpbmcpLgoKVmVyc2lvbiA3LjEwLjctcHJlMyAoOCBBdWd1c3QgMjAwMykKCkRhbmllbCAoOCBBdWd1c3QpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIGZpeCBmb3IgZmlsZTovLyBVUkxzIHdpdGggZHJpdmUgbGV0dGVycyBpbmNsdWRlZC4KCi0gSSBhZGRlZCB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgdG8gdGhlIGNsaWVudCBjb2RlLCB3aGljaCBhY3RpdmF0ZXMgRWFybHkncwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uLCBhbmQgd3JvdGUgdGVzdCBjYXNlIDE0NyB0byB2ZXJpZnkKICBpdC4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUgY3VybC4xIG1hbiBwYWdlIHRvby4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUKICBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UgdG9vLgoKRGFuaWVsICg3IEF1Z3VzdCkKLSBUZXN0IGNhc2UgNjAgZmFpbGVkIG9uIGlhNjQgYW5kIEFNRCBPcHRlcm9uLiBGaXhlZCBub3cuCgotIEZpeGVkIGEgcHJpbnRmIHByb2JsZW0gdGhhdCByZXN1bHRlZCBpbiB1cmxnbG9iYmluZyBidWdzIChidWcgIzIwMzgyNyBpbiB0aGUKICBkZWJpYW4gYnVnIHRyYWNrZXIpLiBBZGRlZCB0ZXN0IGNhc2UgNzQgdG8gdmVyaWZ5IHRoZSBmaXggYW5kIHRvIGRpc2NvdmVyIGlmCiAgdGhpcyBicmVha3MgaW4gdGhlIGZ1dHVyZS4KCi0gIm1ha2UgZGlzdGNoZWNrIiB3b3JrcyBhZ2Fpbi4KClZlcnNpb24gNy4xMC43LXByZTIgKDYgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDUgQXVndXN0KQotIER1bmNhbiBXaWxjb3ggaGVscGVkIG1lIHZlcmlmeSB0aGF0IHRoZSBsYXRlc3QgaW5jYXJuYXRpb24gb2YgbXkgYXJlcyBwYXRjaAogIGJ1aWxkcyBmaW5lIG9uIE1hYyBPUyBYIChzZWUgdGhlIG5ldyBsaWIvUkVBRE1FLmFyZXMpIGZpbGUgZm9yIGFsbCBkZXRhaWxzLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmaWxlZCBidWcgcmVwb3J0ICM3ODMxMTYgYW5kIEVhcmx5IEVobGluZ2VyIHBvc3RlZCBhCiAgYnVnIHJlcG9ydCB0byB0aGUgbGliY3VybCBsaXN0LCBib3RoIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoIEZUUAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGhvdyB0aGUgZGlyIGhpZXJhcmNoeSB3YXMgbm90IHByb3Blcmx5IHJlc2V0CiAgYmV0d2VlbiBmaWxlcy4KCi0gRGF2aWQgQnlyb24ncyB0aG91Z2h0cyBvbiBhIGZpeGVkIE1ha2VmaWxlIGluIHRlc3RzLyB3ZXJlIGFwcGxpZWQuCgotIEphbiBTdW5kaW4gcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGN1cmwgaWdub3JlZCBhIGNvb2tpZSB0aGF0IGJyb3dzZXJzIGRvbid0LAogIHdoaWNoIHR1cm5lZCB1cCB0byBiZSBkdWUgdG8gdGhlIG51bWJlciBvZiBkb3RzIGluIHRoZSAnZG9tYWluJy4gSSd2ZSBub3cKICBtYWRlIGN1cmwgZm9sbG93IHRoZSB0aGUgb3JpZ2luYWwgbmV0c2NhcGUgY29va2llIHNwZWMgbGVzcyBzdHJpY3Qgb24gdGhhdAogIHBhcnQuCgpEYW5pZWwgKDQgQXVndXN0KQotIERpcmsgTWFuc2tlIGFkZGVkIGNvb2tpZSBzdXBwb3J0IGZvciB0aGUgZXhwZXJpbWVudGFsLCBoaWRkZW4gYW5kIHN0aWxsCiAgdW5kb2N1bWVudGVkIHNoYXJlIGZlYXR1cmUhCgotIE1hcmsgRmxldGNoZXIgcHJvdmlkZWQgYW4gZXhjZWxsZW50IGJ1ZyByZXBvcnQgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggRk9MTE9XTE9DQVRJT04gYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcsIGFzIGxpYmN1cmwgd291bGQgbm90CiAgcHJvcGVybHkgaWdub3JlIHRoZSBib2R5IGNvbnRlbnRzIG9mIDNYWCByZXNwb25zZSB0aGF0IGluY2x1ZGVkIHRoZQogIExvY2F0aW9uOiBoZWFkZXIuCgpFYXJseSAoNiBBdWd1c3QpCi0gQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIFRoaXMgb3B0aW9uIHdpbGwgZm9yY2UgdGhlIHRhcmdldCBmaWxlJ3MgcGF0aCB0byBiZSBjcmVhdGVkIGlmIGl0CiAgICBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSByZW1vdGUgc3lzdGVtLgoKICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9ta2QsIHdoaWNoIGlzc3VlcyBhIE1LRCBjb21tYW5kCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX2ZvcmNlX2N3ZCwgd2hpY2ggYXR0ZW1wdHMgYSBDV0QsCiAgICAgICAgICBhbmQgZG9lcyBhIE1LRCBhbmQgcmV0cmllcyB0aGUgQ1dEIGlmIHRoZSBvcmlnaW5hbCBDV0QKICAgICAgICAgIGZhaWxzCiAgICAgICAgTW9kaWZpZWQgZnRwX3BlcmZvcm0oKSB0byBjYWxsIGl0cyBjaGFuZ2UgZGlyZWN0b3J5IGZ1bmN0aW9uCiAgICAgICAgICB0aHJvdWdoIGEgcG9pbnRlci4gIFRoZSBwb2ludGVyIHBvaW50cyB0byBmdHBfY3dkIGJ5IGRlZmF1bHQsCiAgICAgICAgICBhbmQgaXMgbW9kaWZpZWQgdG8gcG9pbnQgdG8gZnRwX2ZvcmNlX2N3ZCBJRkYKICAgICAgICAgIGRhdGEtPnNldC5mdHBfY3JlYXRlX21pc3NpbmdfZGlycyBpcyBub3QgMC4KICAgIC0gbGliL3VybC5jCiAgICAgICAgTW9kaWZpZWQgQ3VybF9zZXRvcHQgdG8gcmVjb2duaXplIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL3VybGRhdGEuaAogICAgICAgIEFkZGVkIGZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIHRvIHN0cnVjdCBVc2VyRGVmaW5lZAoKLSBNaW5vciBCdWdmaXggZm9yIENVUkxPUFRfVElNRUNPTkRJVElPTiB3aXRoIEZUUCAtIGlmIHRoZSBmaWxlIHdhcyBub3QKICBwcmVzZW50IHRvIGRvIHRoZSB0aW1lIGNvbXBhcmlzb24sIGl0IHdvdWxkIGZhaWwuCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGxpYi9mdHAuYwogICAgICAgIEluIGZ0cF9wZXJmb3JtKCksIHRoZSBjYWxsIHRvIGZ0cF9nZXRmaWxldGltZSgpIHVzZWQgdG8gYmUgZm9sbG93ZWQKICAgICAgICBieQoJICBpZiAocmVzdWx0KQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIEFuZCB0aGVuIGJ5IHRoZSBjb2RlIHRoYXQgYWN0dWFsbHkgZGlkIHRoZSB0aW1lIGNvbXBhcmlzb24uCiAgICAgICAgVGhlIGNvZGUgdGhhdCBkaWQgdGhlIGNvbXBhcmlzb24gaGFuZGxlZCB0aGUgY2FzZSB3aGVyZSB0aGUgZmlsZXRpbWUKICAgICAgICB3YXMgbm90IGF2YWlsYWJsZSAoYXMgaW5kaWNhdGVkIGJ5IGluZm8uZmlsZXRpbWUgPCAwIG9yIHNldC50aW1ldmFsdWUKICAgICAgICA8IDApLCBzbyBJIHJlcGxhY2VkIHRoZSBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0IHdpdGggYSBzd2l0Y2gocmVzdWx0KQogICAgICAgIHRoYXQgYWxsb3dzIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRSB0byBmYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgICAgbm9ybWFsIHRpbWUgY29tcGFyaXNvbi4KCkRhbmllbCAoMyBBdWd1c3QpCi0gV2hlbiBwcm94eSBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIGluIGEgQ09OTkVDVCByZXF1ZXN0IChhcyB1c2VkIGZvciBhbGwgU1NMCiAgY29ubmVjdHMgYW5kIG90aGVyd2lzZSBlbmZvcmNlZCB0dW5uZWwtdGhydS1wcm94eSByZXF1ZXN0cyksIHRoZSBzYW1lCiAgYXV0aGVudGljYXRpb24gaGVhZGVyIGlzIGFsc28gd3JvbmdseSBzZW50IHRvIHRoZSByZW1vdGUgaG9zdC4KCiAgVGhpcyBpcyBhIHJhdGhlciBzaWduaWZpY2FudCBpbmZvIGxlYWsuIEkndmUgZml4ZWQgaXQgbm93IGFuZCBtYWlsZWQgYSBwYXRjaAogIGFuZCB3YXJuaW5nIHRvIHRoZSBtYWlsaW5nIGxpc3RzLgoKRGFuaWVsICgxIEF1Z3VzdCkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRvIG1ha2UgNy4xMC42IGJ1aWxkIGNvcnJlY3RseSB3aXRoIHRoZQogIGNvbXByZXNzZWQgaHVnZWhlbHAuYyBzb3VyY2UgZmlsZS4KClZlcnNpb24gNy4xMC43LXByZTEgKDMxIEp1bHkgMjAwMykKCkRhbmllbCAoMzAgSnVseSkKLSBK9nJnIE38bGxlci1Ub2xrIHVwZGF0ZWQgdGhlIFZDIG1ha2VmaWxlLgoKLSBEYW5pZWwgTm9ndWVyb2wgbWFkZSB0aGUgZnRwIGNvZGUgb3V0cHV0ICJBY2NlcHQtUmFuZ2VzOiBieXRlcyIgaW4gc2ltaWxhcgogIHN0eWxlIGxpa2Ugb3RoZXIgZmFrZWQgSFRUUCBoZWFkZXJzIHdoZW4gTk9CT0RZIGFuZCBIRUFERVIgYXJlIHVzZWQuIEkKICB1cGRhdGVkIHR3byBjb3JyZXNwb25kaW5nIHRlc3QgY2FzZXMgdG9vLgoKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gb24gVk1TIGR1ZSB0byBteSBoYXZpbmcKICBjaGFuZ2VkIGEgdHlwZSBmcm9tIGxvbmcgdG8gdGltZV90LCBhbmQgSSdtIG5vdyBjaGFuZ2luZyBpdCBiYWNrIHRvIHdvcmsKICBtb3JlIHBvcnRhYmx5Li4uCgogIEhlIGFsc28gaW5kaWNhdGVkIHRoYXQgZGlzdHJpYnV0aW5nIHRoZSBzcmMvaHVnZWhlbHAuYyBpbiBhIGNvbXByZXNzZWQgc3RhdGUKICBsaWtlIEkgYWNjaWRlbnRhbGx5IGRpZCBtYXkgbm90IGJlIHRoZSBzbWFydGVzdCBtb3ZlLi4uIEkndmUgbm93IGZpeGVkIHRoZQogIGRpc3RyaWJ1dGUgcHJvY2VkdXJlIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gd2hlbiBJCiAgbWFrZSByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgyOSBKdWx5KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY2hhbmdlcyB0byB0aGUgbWtoZWxwIHNjcmlwdCBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlCiAgY29tcHJlc3NlZCBoZWxwIHRleHQgb24gc29tZSBwbGF0Zm9ybXMuCgpWZXJzaW9uIDcuMTAuNiAoMjggSnVseSAyMDAzKQoKRGFuaWVsICgyOCBKdWx5KQotIEZyYW7nb2lzIFBvbnMgYnJvdWdodCBhIHBhdGNoIHRoYXQgb25jZSBhZ2FpbiBtYWRlIGN1cmwgZGVhbCB3aXRoIGZ0cCBhbmQKICAiZG91YmxlIHNsYXNoIiBhcyBpbmRpY2F0aW5nIHRoZSByb290IGRpcmVjdG9yeS4gSW4gdGhlIFJGQzE3MzgtZml4IG9mIEFwcmlsCiAgMzAsIHRoYXQgYWJpbGl0eSB3YXMgcmVtb3ZlZCAoc2luY2UgaXQgaXMgbm90IHRoZSAicmlnaHQiIHdheSkuIFNvLCBzdGFydGluZwogIG5vdyB3ZSBjYW4gbGlzdCB0aGUgcm9vdCBkaXIgb2YgYW4gZnRwIHNlcnZlciBib3RoIHRoZXNlIHdheXM6CgogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLyUyZiAgYXMgd2VsbCBhcwogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLy8KCkRhbmllbCAoMjQgSnVseSkKLSBIZW5yeSBCbGFuZCBwb2ludGVkIG91dCB0aGF0IHdlIGluY2x1ZGVkIHN5cy9yZXNvdXJjZS5oIHdpdGhvdXQgZ29vZCByZWFzb24KICBpbiBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gV2l0aG91dCBpdCBpbmNsdWRlZCwgUU5YIGJ1aWxkcyBiZXR0ZXIuLi4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgpEYW5pZWwgKDIzIEp1bHkpCi0gVHJhY3kgQm9laHJlciBleHBlcmllbmNlZCBETlMgY2FjaGUgcHJvYmxlbXMgYW5kIGRpZCBzb21lIG5pY2UgZGVidWdnaW5nCiAgYW5kIHRyYWNraW5nIHdoaWNoIG1hZGUgaXQgZWFzeSBmb3IgbWUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbSBhbmQgVHJhY3kKICBjb3VsZCB2ZXJpZnkgdGhhdCBpdCBkaWQgY3VyZSB0aGUgcHJvYmxlbSEgV2hlbiByZS11c2luZyBhIGNvbm5lY3Rpb24gd2UKICBub3cgbWFrZSBzdXJlIHdlIGRvbid0IHJlLXVzZSB0aGUgJ2Nvbm5lY3RfYWRkcicgc3RydWN0LgoKLSBEYW5pZWwgS291cmlsIGNvcnJlY3RlZCB0aGUgR1NTLU5lZ290aWF0ZSBjb2RlLgoKLSBKdWFuIEYuIENvZGFnbm9uZSBwcm92aWRlZCBmaXhlcyB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIGZpbmUgb24gV2luZG93cwogIGFnYWluLgoKRGFuaWVsICgyMiBKdWx5KQotIEVkaXRlZCB0aGUgY3VybC9jdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJ1aWxkIG9uIFdpbmRvd3MgcHJvcGVybHkuCgpEYW5pZWwgKDIxIEp1bHkpCi0gTW92ZWQgdGhlIHByb3h5IGNyZWRlbnRpYWxzIGZyb20gdGhlIFNlc3Npb25IYW5kbGUgc3RydWN0IHRvIHRoZSBjb25uZWN0ZGF0YQogIHN0cnVjdCwgdG8gbWFrZSBtdWx0aXBsZSBwcm94eSBjb25uZWN0aW9ucyB3aXRoIGRpZmZlcmVyZW50IHVzZXIgbmFtZXMgd29yay4KCi0gQWRqdXN0ZWQgdGhlIE5UTE0gY29kZSB0byBzdXBwb3J0IHByb3h5IGZ1bmN0aW9uYWxpdHkuCgotIE1hZGUgdGhlIGtyYjQgc3R1ZmYgY29tcGlsZSB3aXRoIHRoZSB1c2VyK3Bhc3N3b3JkIGZpZWxkcyBtb3ZlZC4KClZlcnNpb24gNy4xMC42LXByZTQgKDIxIEp1bHkgMjAwMykKCkRhbmllbCAoMjAgSnVseSkKLSBEYXZpZCBHYXJkbmVyIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgNzcwNzU1IHRoYXQgdXNpbmcgdGhlIEZUUCBjb21tYW5kCiAgQ1dEIHdpdGggYSBibGFuayBhcmd1bWVudCBpcyBhIGJhZCBpZGVhIGFuZCBJIG1hZGUgbGliY3VybCBza2lwIGVtcHR5IHBhdGgKICBzZWdtZW50cyBzdGFydGluZyBub3cuCgpEYW5pZWwgKDE4IEp1bHkpCi0gQ3JpcyBwb2ludGVkIG91dCB0aGF0IG15IGZpeCBvbiBKdWx5IDE2dGggZGlkbid0IHdvcmsgZnVsbHkuIEhpcyBwb2ludGluZwogIG91dCB0aGlzIChhbmQgaGlzIHBhdGNoKSBhbHNvIG1hZGUgbWUgcmVhbGl6ZSB0aGF0IHdlIGhhdmUgYSB2ZXJ5IHNpbWlsYXIKICBidWcgaW4gdGhlIEZUUCBjb25uZWN0aW9uIHJlLXVzZSBjb2RlLiBXZSBtdXN0IHN0b3JlIGEgc2VwYXJhdGUgdXNlciBhbmQKICBwYXNzd29yZCBmaWVsZCBmb3IgZWFjaCBjb25uZWN0aW9uIHdlIGtlZXAgKGF0IGxlYXN0IGZvciBGVFAgYW5kIEhUVFArTlRMTQogIGNvbm5lY3Rpb25zLCBzbyBJIG1hZGUgdXMgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkpLgoKLSBTaW5jZSBOVExNIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiBzaW5nbGUgcmVxdWVzdHMsIEkgaGFkIHRvCiAgcmUtYXJyYW5nZSBob3cgd2Ugc3RvcmUgdGhlIE5UTE0gZGF0YSBhbmQgSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdCBzdWl0ZSB0bwogIGZpbmFsbHkgd29yayBwcm9wZXJseSB3aXRoIHBlcnNpc3RlbmN5IHRvIG1ha2UgdGhlIE5UTE0gdGVzdHMgcnVuIGZpbmUKICBhZ2Fpbi4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBoYXZlIHRvIHVwZGF0ZSBsb3RzIG9mIEhUVFAgdGVzdCBjYXNlcy4KCkRhbmllbCAoMTYgSnVseSkKLSBDcmlzIEJhaWxpZmYncyBidWcgcmVwb3J0IDc2ODI3NSBwb2ludGVkIG91dCB0aGF0IHVzaW5nIEJhc2ljIGF1dGggd2l0aAogIHdyb25nIHVzZXIrcGFzc3dvcmQgY2F1c2VkIGFuIGVuZGxlc3MgbG9vcC4gRml4ZWQgbm93LiBIZSBhbHNvIGZvdW5kIG91dCB0aGF0CiAgd2UgZGlkbid0IHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucyB3aXRoIE5UTE0uIEZpeGVkIHRvby4KCi0gRGFuIFdpbnNoaXAgcHJvdmlkZWQgZml4ZXMgZm9yIHRoZSBOVExNIGNvZGUuCgpEYW5pZWwgKDUgSnVseSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYWRkaXRpb25hbCBmaXhlcyBmb3IgdGhlIERPUyBwb3J0LgoKRGFuaWVsICg0IEp1bHkpCi0gUmljayBSaWNoYXJkc29uIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgc2V0dmJ1ZigpIHRvIGFjaGlldmUgbm9uLWJ1ZmZlcmluZwogIG9uIG91dHB1dCBpcyBuby1nb29kIGZvciBTQ08gWGVuaXggYW5kIG90aGVyIHVuaXhlcy4gV2Ugc3dpdGNoZWQgb3ZlciB0bwogIHVzaW5nIHBsYWluIGZmbHVzaCgpIGluc3RlYWQuCgotIERhbiBHcmF5c29uIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2V0IHRoZSBDVVJMX0NBX0JVTkRMRSB2YXJpYWJsZSB3cm9uZ2x5IGluCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGFuZCBJIGhhZCB0byBjaGFuZ2Ugc29tZSBidWlsZCBzdHVmZiB0byBtYWtlIHRoZSBuZXcKICB3YXkgd29yay4KCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggd2FzIGFwcGxpZWQgdGhhdCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CgogICBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gdG8gc2V0IGEgY2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCB3aXRoIHRoZQogICBPcGVuU1NMJ3Mgc3NsX2N0eCBwb2ludGVyIHBhc3NlZCBpbiBhbmQgYWxsb3cgYSBjYWxsYmFjayB0byBhY3Qgb24gaXQuIElmCiAgIGFueXRoaW5nIGJ1dCBDVVJMRV9PSyBpcyByZXR1cm5lZCwgdGhhdCB3aWxsIGFsc28gYmUgcmV0dXJuZWQgYnkgbGliY3VybAogICBhbGwgdGhlIHdheSBiYWNrLiBJZiB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIENVUkxPUFRfVVJMLCBsaWJjdXJsIHdpbGwKICAgZGV0ZWN0IHRoaXMgYW5kIGluc3RlYWQgZ28gdXNlIHRoZSBuZXcgVVJMLgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0RBVEEgaXMgYSBwb2ludGVyIHlvdSBzZXQgdG8gZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgc2V0CiAgIHdpdGggQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OLgoKRGFuaWVsICgxIEp1bHkpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyBhIGNsaWVudCB0byBxdWl0IHRoZSB0ZXN0IHN1aXRlJ3MKICBIVFRQIHNlcnZlci4KCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIHBhdGNoZWQgYSBsaWIgaGFuZGxlIGxlYWsgaW4gdGhlIGxkYXAgY29kZS4KCkRhbmllbCAoMjUgSnVuZSkKLSBNb3JlIE5UTE0taW1wcm92ZW1lbnRzLiBMZXNzIGNvZGUuIFNtYWxsZXIgcGFja2V0cyBiYWNrIGFuZCBmb3J0aC4KCkRhbmllbCAoMjMgSnVuZSkKLSBFcmljIEdsYXNzIHByb3ZpZGVkIHVzIHdpdGggYSBiZXR0ZXIgZG9jIG9uIE5UTE0gZGV0YWlscywgYW5kIEkgYWRkZWQgbW9yZQogIGNvbW1lbnRzIGFuZCBjbGFyaWZpZWQgdGhlIGN1cnJlbnQgY29kZSBtb3JlLiBVc2luZyB0aGUgbmV3IGtub3dsZWRnZSwgd2UKICBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBOVExNIHN0dWZmIHdvcmsgZXZlbiBiZXR0ZXIuCiAgRXJpYydzIG9yaWdpbmFsIFVSTDogaHR0cDovL2RhdmVucG9ydC5zb3VyY2Vmb3JnZS5uZXQvbnRsbS5odG1sCiAgVmVyc2lvbiBzdG9yZWQgYW5kIHByb3ZpZGVkIGF0IGN1cmwgc2l0ZTogaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sCgotIEZpeGVkIHRoZSBtaW5vciBjb21waWxlIHByb2JsZW1zIHByZTMgaGFkIGlmIGJ1aWx0IHdpdGhvdXQgR1NTQVBJIGFuZC9vcgogIFNTTC4KClZlcnNpb24gNy4xMC42LXByZTMgKDE5IEp1bmUgMjAwMykKCkRhbmllbCAoMTkgSnVuZSkKLSBNYWRlIGN1cmwgdXNlIGN1cmxfZnJlZSgpIG9uIG1lbW9yeSByZXR1cm5lZCBieSBjdXJsX2dldGVudigpLCBhcyB0aGlzCiAgc2hvdWxkIHRoZW9yZXRpY2x5IG1ha2UgaXQgcG9zc2libHkgdG8gYnVpbGQgYW5kIHJ1biBjdXJsIGFuZCBsaWJjdXJsIHdpdGgKICBkaWZmZXJlbnQgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lcyB3aXRoIG5vIHByb2JsZW1zLgoKRGFuaWVsICgxOCBKdW5lKQotIEltcHJvdmVkIHRoZSBta2hlbHAucGwgYSBiaXQgZnVydGhlciB0byBtYWtlIGEgbmljZXIgaHVnZWhlbHAgdGV4dCBhbmQgdG8KICBpbmNsdWRlIGEgYmV0dGVyIGNvbW1lbnQgaW4gdGhlIHRvcCBmb3IgdGhlIGd6aXAgY29tcHJlc3NlZCB2ZXJzaW9uLgoKRGFuaWVsICgxNyBKdW5lKQotIENVUkxPUFRfSFRUUEFVVEggaXMgbm93IGEgYml0bWFzaywgaW4gd2hpY2ggeW91IHNldCB3aGljaCBhdXRoZW50aWNhdGlvbgogIHR5cGUocykgeW91IHdhbnQgdG8gdXNlLiBJZiBtb3JlIHRoYW4gb25lIGlzIHNldCwgbGliY3VybCB3aWxsIHVzZSBvbmUgb2YKICB0aGUgc2VsZWN0ZWQgb25lIGFuZCB0aGUgb25lIGl0IGNvbnNpZGVycyBpcyBtb3JlIHNlY3VyZS4gVGVzdCBjYXNlIDY3IGFuZAogIDY4IChmb3IgTlRMTSkgd2VyZSBmaXhlZCBhbmQgd2UndmUgcmVkdWNlZCBhIHJvdW5kLXRyaXAgZm9yIHNwZWNpZmljIC0tbnRsbQogIGZldGNoZXMsIGFuZCB0ZXN0IGNhc2UgNjkgYW5kIDcwIHdlcmUgYWRkZWQgZm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24KICAicGlja2luZyIuIC0tYW55YXV0aCBpcyB0aGUgbmV3IGNvbW1hbmQgbGluZSB0b29sIG9wdGlvbiwgYW5kIEkgYWxzbyBhZGRlZAogIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAodGhhdCdzIHRoZSBkZWZhdWx0IHR5cGUpLgoKLSBGaXhlZCB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIHVzZSB0aGUgaW5mbyBwcm92aWRlZCBieSB0aGUgbmV3IGN1cmwgLVYKICBvdXRwdXQuCgotIC0tZW5hYmxlLWRlYnVnIG5vdyBzZXRzIHRoZSBDVVJMREVCVUcgZGVmaW5lIGluc3RlYWQgb2YgTUFMTE9DREVCVUcsIGFzIGl0CiAgaXMgbWVhbnQgdG8gYmUgYSBnZW5lcmljIGRlYnVnIGNvbmRpdGlvbmFsLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIGNhbiBub3cgcmV0dXJuIENVUkxfVkVSU0lPTl9ERUJVRyBhcyBhIGZlYXR1cmUgYml0LCB0bwogIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IHdpdGggQ1VSTERFQlVHIHNldC4KCi0gUmFscGggTWl0Y2hlbGwgZm91bmQgb3V0IHRoYXQgc29tZSB3ZWIgYXBwbGljYXRpb25zIHZlcnkgYmFkbHkgdXNlcyB3aGl0ZQogIHNwYWNlcyBpbiBMb2NhdGlvbjogcmVkaXJlY3RzLCBhbmQgYXBwYXJlbnRseSBJRSBpcyBhIGJyb3dzZXIgKHRoZSBvbmx5CiAgb25lPykgdGhhdCBzdXBwb3J0cyB0aGlzIGFib21pbmF0aW9uLiBCYXNlZCBvbiBSYWxwaCdzIHBhdGNoLCBJIGFkZGVkIGNvZGUKICB0aGF0IG5vdyBhdHRlbXB0cyB0byByZXBsYWNlIHdoaXRlIHNwYWNlcyB3aXRoIHRoZSBwcm9wZXIgIiUyMCIgb3IgIisiLgogIFRlc3QgY2FzZSA0MCBhbmQgNDIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgbXkgY2hhbmdlcy4KCi0gY3VybCAtViBub3cgYWxzbyBvdXRwdXRzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGUgYXZhaWxhYmxlIGxpYnJhcnkgb2ZmZXJzIChpZgogIGFueSkuCgotIFRoZSBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IGluY2x1ZGVzICJHU1MiIGlmIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHU1NBUEkKICBzdXBwb3J0LgoKLSBEYXZpZCBPcnJlbGwgcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIHN0aWxsIGNyYXNoZWQgd2hlbiBzZW5kaW5nIEhVR0UgcmVxdWVzdHMKICBvdmVyIEhUVFBTLi4uIEkgZml4ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmUyICgxNiBKdW5lIDIwMDMpCgpEYW5pZWwgKDE2IEp1bmUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBiaXRtYXNrZWQgaW5mb3JtYXRpb24gd2VhdGhlciBOVExNIGFuZAogIEdTU05FR09USUFURSBhcmUgc3VwcG9ydGVkLCBzaW5jZSBpdCBpcyBkb29tZWQgdG8gdmFyeSBvbiBkaWZmZXJlbnQKICBpbnN0YWxsYXRpb25zLgoKLSBJIHJlbWFkZSB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIE1ENS1jb2RlIHByb3ZpZGVkIGJ5IE9wZW5TU0wgaWYKICB0aGF0IGlzIHByZXNlbnQsIGFuZCBvbmx5IHVzZSBvdXIgb3duIE1ENS1jb2RlIGlmIGl0IGlzbid0LgoKRGFuaWVsICgxMyBKdW5lKQotIE1vcmUgTlRMTSBoZWxwLCBmaXhlcyBhbmQgcGF0Y2hlcyBmcm9tIENyaXMgQmFpbGlmZi4KCi0gTWFydHkgS3VocnQgYnJvdWdodCBpbmNsdWRlIGZpeGVzIGZvciBtYWtpbmcgVk1TIGJ1aWxkcyB3YXJuaW5nLWZyZWUuCgpEYW5pZWwgKDEyIEp1bmUpCi0gTlRMTSBhdXRoZW50aWNhdGlvbiB3b3JrcyBzb21ld2hhdCBhZ2FpbnN0IHRoZSB0ZXN0IHNlcnZlcnMgcHJvdmlkZWQgYnkKICBNYXRoaWFzIEF4ZWxzc29uIGFuZCBDcmlzIEJhaWxpZmYuIFVzZSBieSBzZXR0aW5nIENVUkxPUFRfSFRUUEFVVEggdG8KICBDVVJMQVVUSF9OVExNIHRvIGxpYmN1cmwsIG9yIC0tbnRsbSBmb3IgdGhlIGN1cmwgdG9vbC4gVGVzdCBjYXNlIDY3IGFuZCA2OAogIHdlcmUgYWRkZWQgZm9yIHRoaXMuIE5UTE0tc3VwcG9ydCByZXF1aXJlcyBPcGVuU1NMLgoKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBwYXRjaCwgdGhhdCBncmFudGVkIHRoYXQgZ3ppcCBhbmQgbGlieiBhcmUgYXZhaWxhYmxlCiAgYXQgYnVpbGQtdGltZSwgY29tcHJlc3NlcyB0aGUgaHVnZWhlbHAgdGV4dCBpbiB0aGUgY3VybCBjb21tYW5kIGxpbmUgYW5kCiAgdW5jb21wcmVzc2VzIGl0IGF0IHJlcXVlc3QuIFNhdmVzIHNvbWUgfjYwSyBpbiB0aGUgZmluYWwgb3V0cHV0IGV4ZWN1dGFibGUuCgpEYW5pZWwgKDExIEp1bmUpCi0gTG9uZyBkYXkgb2YgZmlnaHRpbmcgdGhlIE5UTE0gZGVtb25zLgoKRGFuaWVsICgxMCBKdW5lKQotIE1vZGlmaWVkIGhvdyB0byBzZXQgYXV0aCB0eXBlIHRvIGxpYmN1cmwuIE5vdyB1c2UgQ1VSTE9QVF9IVFRQQVVUSCBpbnN0ZWFkLAogIGFuZCBwaWNrIG1ldGhvZC4gU3VwcG9ydGVkIG9uZXMgY3VycmVudGx5IGFyZToKICBDVVJMQVVUSF9CQVNJQyAgICAgLSBkZWZhdWx0IHNlbGVjdGlvbgogIENVUkxBVVRIX0RJR0VTVCAgICAtIGZvcm1lcmx5IENVUkxPUFRfSFRUUERJR0VTVAogIENVUkxBVVRIX0dTU05FR09USUFURQoKLSBEYW5pZWwgS291cmlsIGFkZGVkIEhUVFAgR1NTLU5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0LCBhcyBkZWZpbmVkIGluCiAgdGhlIElFVEYgZHJhZnQgZHJhZnQtYnJlemFrLXNwbmVnby1odHRwLTA0LnR4dC4gSW4gdXNlIGFscmVhZHkgYnkgdmFyaW91cwogIE1pY3Jvc29mdCB3ZWIgYXBwbGljYXRpb25zLiAtLW5lZ290aWF0ZSBpcyB0aGUgbmV3IGZhbWlseSBtZW1iZXIuIFRvIHRha2UKICBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91IG5lZWQgb25lIG9mIHRoZXNlIHBhY2thZ2VzOgoKICBvIEhlaW1kYWwgS2VyYmVyb3M1ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5wZGMua3RoLnNlL2hlaW1kYWwvaGVpbWRhbC5odG1sCiAgbyBHU1NBUEkgZnJvbSBHbG9idXMgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5nbG9idXMub3JnLwogIG8gR1NTQVBJIGxpYnJhcmllcyBmcm9tIE1JVCBLZXJiZXJvczUgIGh0dHA6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy93d3cvCgotIEEgbWlzc2luZyBlbmRpbmcgYnJhY2tldCAoJ10nKSB3aGlsZSBkb2luZyBVUkwgZ2xvYmJpbmcgY291bGQgbGVhZCB0byBhCiAgc2VnZmF1bHQuIFdoaWxlIGZpeGluZyB0aGlzLCBJIGFsc28gaW50cm9kdWNlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIHRoZQogIGdsb2JiaW5nIGNvZGUuIChBbGwgdGhpcyBpcyBhcHBsaWNhdGlvbiBjb2RlIG91dHNpZGUgbGliY3VybC4pCgpEYW5pZWwgKDYgSnVuZSkKLSBEYXZpZCBPcnJlbGwgZm91bmQgb3V0IHRoYXQgc2VuZGluZyBhIGh1Z2UgR0VUIHJlcXVlc3Qgb3ZlciBIVFRQUyBjb3VsZAogIG1ha2UgbGliY3VybCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZS4KCkRhbmllbCAoMiBKdW5lKQotIFJpY2hhcmQgQnJhbWFudGUgZm91bmQgb3V0IHRoYXQgIkNvbnRlbnQtTGVuZ3RoOiAwIiB3YXMgbm90IHByb3Blcmx5IHVzZWQgYnkKICBsaWJjdXJsIGlmIHRoZSByZXNwb25zZS1oZWFkZXJzIGluZGljYXRlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlCiAgY2xvc2VkLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBsaWVkLCB0aGF0IG1ha2VzIHRoZSAtLXByb2dyZXNzLWJhciB0YWtlIHRoZQogIGxvY2FsIHNpemUgaW50byBhY2NvdW50IHdoZW4gZG9pbmcgcmVzdW1lZCBkb3dubG9hZHMuCgotIEZlZWRiYWNrIGZyb20gU2VyZ2UgU2VtYXNoa28gbWFkZSBtZSBjaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgd2hlbgogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgaXMgcmV0dXJuZWQuCgotIEFub255bW91cyBpbiBidWcgcmVwb3J0ICM3NDUxMjIgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nCiAgU1NMX0NUWF9zZXRfb3B0aW9ucyguLi4gU1NMX09QX0FMTCkgdG8gd29yayBhcm91bmQgZmxhd3MgaW4gZXhpc3RpbmcgU1NMCiAgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyNyBNYXkpCi0gQW5kcmVhcyBMZXkgYW5kIFJpY2ggR3JheSBoZWxwZWQgbWUgcG9pbnQgb3V0IHRoYXQgbm8gdmVyc2lvbiBvZiBIUC1VWCBoYXMKICB0aGUgc3lzL3NlbGVjdC5oIGhlYWRlciBmaWxlIHNvIGluY2x1ZGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gY3VybC9tdWx0aS5oCiAgaXMgbm90IGEgZ29vZCB0aGluZy4gTm93IHdlIGNoZWNrIGZvciBIUFVYIGFuZCBhdm9pZCB1c2luZyB0aGF0IGhlYWRlciBvbgogIHN1Y2ggc3lzdGVtcy4KCi0gUnVkeSBLb2VudG8gZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBjdXJsJ3MgcmVjZW50IGhhYml0IG9mIFBPU1RpbmcgZGF0YSBpbgogIHR3byBzZXBhcmF0ZSBzZW5kKCkgY2FsbHMsIGZpcnN0IHRoZSBoZWFkZXJzIGFuZCB0aGVuIHRoZSBkYXRhLiBJJ3ZlIG5vdwogIG1hZGUgYSBmaXggdGhhdCBmb3Igc3RhdGljIGFuZCBrbm93biBjb250ZW50IHRoYXQgaXMgbGVzcyB0aGFuIDEwMEsgaW4gc2l6ZSwKICBldmVyeXRoaW5nIGlzIG5vdyBzZW50IGluIG9uZSBzaW5nbGUgc3lzdGVtIGNhbGwgYWdhaW4uIFRoaXMgaXMgYWxzbyBiZXR0ZXIKICBmb3IgbmV0d29yayBwZXJmb3JtYW5jZSByZWFzb25zLgoKLSBJIG1vZGlmaWVkIHRoZSBtYWluIG1ha2VmaWxlIHRvIG5vdCBidWlsZCB0aGUgdGVzdCBzdWl0ZSBhbmQgYSBmZXcgb3RoZXIKICB1bm5lY2Vzc2FyeSB0aGluZ3MgYnkgZGVmYXVsdC4gTm93LCB0aGUgdGVzdCBzdWl0ZSBpcyBidWlsdCB3aGVuICdtYWtlIHRlc3QnCiAgaXMgcnVuLiAgVGhpcyByZWR1Y2VzIGJ1aWxkIHRpbWUgZm9yIHRob3NlIHdobyBkb24ndCBjYXJlIGZvciB0aGUgdGVzdAogIHN1aXRlLCBhbmQgaXQgYWxzbyByZWR1Y2VzIGNvbmZ1c2lvbiBmb3IgcGVvcGxlIHVzaW5nIHBsYXRmb3JtcyB3aGVyZSB0aGUKICB0ZXN0IHN1aXRlIGJ1aWxkIGZhaWxzIQoKRGFuaWVsICgyNiBNYXkpCi0gQ2hyaXMgTGV3aXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSAjaWZkZWZzIGluIGN1cmwvbXVsdGkuaCBmb3IgV2luZG93cywKICB3aGljaCBpcyBub3cgY29ycmVjdGVkLgoKLSBKaXMgSm95IGZvdW5kIGFub3RoZXIgZmxhdyBpbiB0aGUgU09DSzUgY29kZSwgYXMgbGliY3VybCB0cmVhdGVkIHRoZSBzb2NrczUKICBwcm94eSBhIGxpdHRsZSB0b28gbXVjaCBsaWtlIGFzIGlmIGl0IHdhcyBhIGh0dHAgcHJveHkuCgpEYW5pZWwgKDIzIE1heSkKLSBSaWNhcmRvIENhZGltZSBmb3VuZCBhIHNvY2tldCBsZWFrIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRob3V0CiAgY29udGVudHMuIFRlc3QgY2FzZXMgMTQ0IGFuZCAxNDUgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gUnVkeSBLb2VudG8gZm91bmQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aGVuIGEgSFRUUCBzZXJ2ZXIgcmV0dXJucyBvbmx5IGEKICBzaW5nbGUtbGluZSBvZiBjb250ZW50cyB3aXRob3V0IGFueSBoZWFkZXJzIGF0IGFsbC4gbGliY3VybCB0aGVuIGZhaWxlZCB0bwogIGNvdW50IHRoZSBkYXRhLCB0aHVzIHJldHVybmluZyBlcnJvciA1MiAibm8gY29udGVudHMiLiBUZXN0IGNhc2UgNjYgd2FzCiAgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvIHJpZ2h0LgoKVmVyc2lvbiA3LjEwLjYtcHJlMSAoMjMgTWF5IDIwMDMpCgpEYW5pZWwgKDIzIE1heSkKLSBKaXMgaW4gYnVnIHJlcG9ydCAjNzQxODQxLCBmaXhlZCBhIGJ1ZyBpbiB0aGUgU09DS1M1IHByb3h5LXVzaW5nIGNvZGUuCgpEYW5pZWwgKDIyIE1heSkKLSBEYXZpZCBSZW1haGwgc2V0IHVwIGEgdGVzdC1zZXJ2ZXIgZm9yIG1lIHByb3ZpZGluZyBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYW5kIEkgd3JvdGUgdGhlIGZpcnN0IHdvcmtpbmcgY29kZSB0aGF0IHN1cHBvcnQgaXQuIFRoZSB0ZXN0IHN1aXRlIHdhcwogIG1vZGlmaWVkIHNsaWdodGx5IGFzIHdlbGwgdG8gd29yayBiZXR0ZXIgZm9yIGl0IGFuZCAtLWRpZ2VzdCB3YXMgYWRkZWQgdG8KICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGFuZCBDVVJMT1BUX0hUVFBESUdFU1QgdG8gdGhlIGxpYnJhcnkpLi4uICBSRkMyNjE3CiAgaGFzIGFsbCB0aGUgZ29yeSBkZXRhaWxzLgoKRGFuaWVsICgyMSBNYXkpCi0gRGF2aWQgQmFsYXppYyBwb2ludGVkIG91dCB0aGF0IGN1cmxfdW5lc2NhcGUoKSBkaWRuJ3QgY2hlY2sgdGhhdCAlLWNvZGVzCiAgd2VyZSBjb3JyZWN0bHkgZm9sbG93ZWQgYnkgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyB3aGVuIGl0IHVuZXNjYXBlIHN0cmluZ3MuCiAgTm93LCB3ZSBkbyB0aGUgY2hlY2sgYW5kIG9ubHkgJVhYIGNvZGVzIGFyZSB1bmVzY2FwZWQgaWYgdGhlIFggbGV0dGVycyBhcmUKICBoZXhhZGVjaW1hbHMuCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCBidWlsZCB3aXRoIGRqZ3BwIG9uIERPUy4KCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgdGhlIG1raGVscC5wbCBzY3JpcHQgdG8gbWFrZSBhIG5pY2VyIG1hbnVhbCB0aGF0IGlzCiAgc2hvd24gd2l0aCBjdXJsIC1NLgoKRGFuaWVsICgyMCBNYXkpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIG1vcmUgY29uc2VydmF0aXZlLCBub3QKICBleHBlY3RpbmcgaF9hbGlhc2VzIG9mIHRoZSBob3N0ZW50IHN0cnVjdCB0byBhbHdheXMgYmUgbm9uLU5VTEwuCgpEYW5pZWwgKDE5IE1heSkKLSBBcyByZXF1ZXN0ZWQgYnkgTWFydGluIE1pY2hsbWF5ciBpbiBEZWJpYW4gYnVnIHJlcG9ydCAjMTkzNjMwLCBsaWJjdXJsIG5vdwogIHN1cHBvcnRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy4gQWRkZWQKICB0ZXN0IGNhc2UgNjMgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuMTAuNSAoMTkgTWF5IDIwMDMpCgpEYW5pZWwgKDE1IE1heSkKLSBDaGFuZ2VkIHRoZSBvcmRlciBmb3IgdGhlIGluX2FkZHJfdCB0ZXN0aW5nLCBhcyAndW5zaWduZWQgbG9uZycgc2VlbXMgdG8gYmUKICBhIHZlcnkgY29tbW9uIHR5cGUgaW5ldF9hZGRyKCkgcmV0dXJucy4KCkRhbmllbCAoMTQgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwcm92aWRlZCBhIGZpeCB0aGF0IGNhbGxzIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHdhaXRpbmcKICBmb3IgRlRQIGNvbW1hbmQgcmVzcG9uc2VzIHRha2UgPjEgc2Vjb25kLiBJdCdsbCBtYWtlIGFwcGxpY2F0aW9ucyBtb3JlCiAgInJlc3BvbnNpdmUiIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBzbG93IGZ0cCBzZXJ2ZXJzLgoKRGFuaWVsICgxMiBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB1cGxvYWRzIGhhZCB0d28gcXVpcmtzOgogICBvIHdoZW4gdXNpbmcgRlRQIFBPUlQgY29tbWFuZCwgaXQgdXNlZCBibG9ja2luZyBzb2NrZXRzIQogICBvIGl0IGNvdWxkIGxvb3AgYSBsb25nIHRpbWUgd2l0aG91dCBkb2luZyBwcm9ncmVzcyBtZXRlciB1cGRhdGVzCiAgQm90aCBpdGVtcyBhcmUgZml4ZWQgbm93LgoKRGFuaWVsICg5IE1heSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlZCBDVVJMT1BUX0VOQ09ESU5HIHRvIHNlbGVjdCBhbGwgc3VwcG9ydGVkIGVuY29kaW5ncyBpZgogIHNldCB0byAiIi4gIFRoaXMgZnJlZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gaGF2aW5nIHRvIGtub3cgd2hpY2ggZW5jb2RpbmdzCiAgdGhlIGxpYnJhcnkgc3VwcG9ydHMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCB3ZSBoYWQgdGhyZWUgdW5uZWNlc3NhcnkgZmlsZXMgaW4gQ1ZTIHRoYXQgaXMKICBnZW5lcmF0ZWQgd2l0aCBsaWJ0b29saXplLCBzbyB0aGV5J3JlIG5vdyByZW1vdmVkIGFuZCBsaWJ0b29saXplIGlzIGludm9rZWQKICBhY2NvcmRpbmdseSBpbiB0aGUgYnVpbGRjb25mIHNjcmlwdC4KCi0gQXZlcnkgRmF5IGZvdW5kIG91dCB0aGF0IHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3YXkgb2YgZmlyc3QgY2hlY2tpbmcgaWYgdGhlCiAgZ2l2ZW4gbmFtZSBpcyBhIG5ldHdvcmsgaW50ZXJmYWNlIGdhdmUgYSByZWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gTGludXgsCiAgc28gbm93IHdlIG1vcmUgYXBwcm9wcmlhdGVseSBmaXJzdCBjaGVjayBpZiBpdCBpcyBhbiBJUCBudW1iZXIgYW5kIGlmIHNvCiAgd2UgZG9uJ3QgY2hlY2sgZm9yIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCB0aGF0IG5hbWUuCgotIENVUkxPUFRfRlRQX1VTRV9FUFJUIGFkZGVkLiBTZXQgdGhpcyB0byBGQUxTRSB0byBkaXNhYmxlIGxpYmN1cmwncyBhdHRlbXB0cwogIHRvIHVzZSBFUFJUIGFuZCBMUFJUIGJlZm9yZSB0aGUgdHJhZGl0aW9uYWwgUE9SVCBjb21tYW5kLiBUaGUgY29tbWFuZCBsaW5lCiAgdG9vbCBzZXRzIHRoaXMgb3B0aW9uIHdpdGggJy0tZGlzYWJsZS1lcHJ0Jy4KClZlcnNpb24gNy4xMC41LXByZTIgKDYgTWF5IDIwMDMpCgpEYW5pZWwgKDYgTWF5KQotIEtldmluIERlbGFmaWVsZCByZXBvcnRlZCBhbm90aGVyIGNhc2Ugd2hlcmUgd2UgZGlkbid0IGNvcnJlY3RseSBjaGVjayBmb3IKICBFQUdBSU4gYnV0IG9ubHkgRVdPVUxEQkxPQ0ssIHdoaWNoIGNhdXNlZCBiYWRuZXNzIG9uIEhQVVguCgpEYW5pZWwgKDQgTWF5KQotIEJlbiBHcmVlYXIgbm90aWNlZCB0aGF0IHRoZSBjaGVjayBmb3IgJ3dyaXRhYmxlIGFyZ3YnIGV4aXRlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHdoZW4gcnVuIGZvciBjcm9zcy1jb21waWxpbmcsIHdoaWNoIHdhc24ndCBuaWNlLiBOb3cgaXQnbGwgZGVmYXVsdCB0bwogIG5vIGFuZCBvdXRwdXQgYSB3YXJuaW5nIGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgd2FzIG5vdCBjaGVja2VkIGZvci4KCkRhbmllbCAoMiBNYXkpCi0gQWRkZWQgdGVzdCBjYXNlIDYyIGFuZCBmaXhlZCBzb21lIG1vcmUgb24gdGhlIGNvb2tpZSBzZW5kaW5nIHdpdGggYSBjdXN0b20KICBIb3N0OiBoZWFkZXIgc2V0LgoKRGFuaWVsICgxIE1heSkKLSBBbmR5IENlZGlsbmlrIGZpeGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBNYWRlIHRoZSAiU1NMIHJlYWQgZXJyb3I6IDUiIGVycm9yIG1lc3NhZ2UgbW9yZSB2ZXJib3NlLCBieSBhZGRpbmcgY29kZSB0aGF0CiAgcXVlcmllcyB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGZpbGwgaW4gdGhlIGVycm9yIGJ1ZmZlci4KCkRhbmllbCAoMzAgQXByKQotIEFkZGVkIHN5cy9zZWxlY3QuaCBpbmNsdWRlIGluIHRoZSBjdXJsL211bHRpLmggZmlsZSwgYWZ0ZXIgaGF2aW5nIGJlZW4KICByZW1pbmRlZCBhYm91dCB0aGlzIGJ5IFJpY2ggR3JheS4KCi0gSSBtYWRlIGVhY2ggdGVzdCBzZXQgaXRzIG93biBzZXJ2ZXIgcmVxdWlyZW1lbnRzLCB0aHVzIGFiYW5kb25pbmcgdGhlCiAgcHJldmlvdXMgc3lzdGVtIHdoZXJlIHRoZSB0ZXN0IG51bWJlciBpbXBsaWVkIHdoYXQgc2VydmVyKHMpIHRvIHVzZSBmb3IgYQogIHNwZWNpZmljIHRlc3QuCgotIERhdmlkIEJhbGF6aWMgbWFkZSBjdXJsIG1vcmUgUkZDMTczOC1jb21wbGlhbnQgZm9yIEZUUCBVUkxzLCBieSBmaXhpbmcgc28KICB0aGF0IGxpYmN1cmwgbm93IHVzZXMgb25lIENXRCBjb21tYW5kIGZvciBlYWNoIHBhdGggcGFydC4gQSBidW5jaCBvZiB0ZXN0CiAgY2FzZXMgd2VyZSBmaXhlZCB0byB3b3JrIGFjY29yZGluZ2x5LgoKLSBDb29raWUgZml4ZXM6CgogIEEuIFNhdmUgZG9tYWlucyBpbiBqYXJzIGxpa2UgTW96aWxsYSBkb2VzLiBJdCBtZWFucyBhbGwgZG9tYWlucyBzZXQgaW4KICAgICBTZXQtQ29va2llOiBoZWFkZXJzIGFyZSBkb3QtcHJlZml4ZWQuCiAgQi4gU2F2ZSBhbmQgdXNlIHRoZSAndGFpbG1hdGNoJyBmaWVsZCBpbiB0aGUgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgamFycwogICAgICh0aGUgc2Vjb25kIGNvbHVtbikuCiAgQy4gUmVqZWN0IGNvb2tpZXMgdXNpbmcgaWxsZWdhbCBkb21haW5zIGluIHRoZSBTZXQtQ29va2llOiBsaW5lLiBDb25jZXJucwogICAgIGJvdGggZG9tYWlucyB3aXRoIHRvbyBmZXcgZG90cyBvciBkb21haW5zIHRoYXQgYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseQogICAgIG9wZXJhdGluZyBzZXJ2ZXIgaG9zdCdzIGRvbWFpbi4KICBELiBTZXQgdGhlIHBhdGggcGFydCBieSBkZWZhdWx0IHRvIHRoZSBvbmUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgaWYgbm9uZSB3YXMKICAgICBzZXQgaW4gdGhlIFNldC1Db29raWUgbGluZS4KCiAgVG8gbWFrZSBpdGVtIEMgcmVhbGx5IGdvb2QsIEkgYWxzbyBtYWRlIGxpYmN1cmwgbm90aWNlIGN1c3RvbSBIb3N0OiBoZWFkZXJzCiAgYW5kIGV4dHJhY3QgdGhlIGhvc3QgbmFtZSBzZXQgaW4gdGhlcmUgYW5kIHVzZSB0aGF0IGFzIHRoZSBob3N0IG5hbWUgZm9yIHRoZQogIHNpdGUgd2UncmUgZ2V0dGluZyB0aGUgY29va2llcyBmcm9tLiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBzaXRlJ3MKICBJUC1hZGRyZXNzLCBidXQgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGFuZCBzZW5kIGl0cyBjb29raWVzIHByb3Blcmx5IGlmCiAgeW91IHByb3ZpZGUgYSB2YWxpZCBIb3N0OiBuYW1lIGZvciB0aGUgc2l0ZS4KCkRhbmllbCAoMjkgQXByKQotIFBldGVyIEtvdmFjcyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENVUkxJTkZPX0NPTk5FQ1RfVElNRSB3b3JrIGZpbmUKICB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKHRvbykuCgpWZXJzaW9uIDcuMTAuNS1wcmUxICgyMyBBcHIgMjAwMykKCkRhbmllbCAoMjMgQXByKQotIFVwZ3JhZGVkIHRvIGxpYnRvb2wgMS41LgoKRGFuaWVsICgyMiBBcHIpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3NldG9wdCgpIHdpbGwgYWx3YXlzICh3cm9uZ2x5KQogIHJldHVybiBDVVJMRV9PSyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgc29tZSBnemlwIGRlY29tcHJlc3Npb24gYnVncyBhbmQgZmxhd3MuCgpEYW5pZWwgKDE2IEFwcikKLSBGaXhlZCBtaW5vciB0eXBvIGluIG1hbiBwYWdlLCByZXBvcnRlZCBpbiB0aGUgRGViaWFuIGJ1ZyB0cmFja2VyLgoKRGFuaWVsICgxNSBBcHIpCi0gRml4ZWQgc29tZSBGVFAgdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBmYWlsZWQgb24gbXkgU29sYXJpcyBob3N0LCBkdWUKICB0byB0aGUgY29uZmlnLmggbm90IGJlaW5nIGluY2x1ZGVkIGJlZm9yZSB0aGUgc3lzdGVtIGhlYWRlcnMuIFdoZW4gZG9uZSB0aGF0CiAgd2F5LCBpdCBkaWQgZ2V0IGEgbWl4ZWQgc2Vuc2Ugb2YgaWYgYmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb3Igbm90IGFuZCB0aGVuCiAgc3RhdCgpIGFuZCBmc3RhdCgpIChhcyB1c2VkIGluIHRlc3QgY2FzZSA1MDUpIGdvdCBjb25mdXNlZCBhbmQgZmFpbGVkIHRvCiAgcmV0dXJuIGEgcHJvcGVyIGZpbGUgc2l6ZS4KCi0gRm9ybXBvc3RpbmcgYSBmaWxlIHVzaW5nIGEgLmh0bWwgc3VmZml4IGlzIG5vdyBwcm9wZXJseSBzZXQgdG8gQ29udGVudC1UeXBlOiAgICB0ZXh0L2h0bWwuCgpEYW5pZWwgKDE0IEFwcikKLSBGaXhlZCB0aGUgU1NMIGVycm9yIGhhbmRsaW5nIHRvIHJldHVybiBwcm9wZXIgU1NMIGVycm9yIG1lc3NhZ2VzIGFnYWluLCB0aGV5CiAgYnJva2UgaW4gNy4xMC40LiBJIGFsc28gYXR0ZW1wdCB0byB0cmFjayBkb3duIENBIGNlcnQgcHJvYmxlbXMgYW5kIHRoZW4KICByZXR1cm4gdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZS4KCi0gVGhlIGN1cmwgdG9vbCBub3cgaW50ZXJjZXB0cyB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlIGFuZCBkaXNwbGF5cwogIGEgZmFpcmx5IGJpZyBhbmQgZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZS4gS2V2aW4gUm90aCBoZWxwZWQgbWUgb3V0IHdpdGgKICB0aGUgd29yZGluZy4KCkRhbmllbCAoMTEgQXByKQotIE5pYyBIaW5lcyBwcm92aWRlZCBhIHNlY29uZCBwYXRjaCBmb3IgZ3ppcCBkZWNvbXByZXNzaW9uLCBhbmQgZml4ZWQgYSBidWcKICB3aGVuIGRlZmxhdGUgb3IgZ3ppcCBjb250ZW50cyB3ZXJlIGRvd25sb2FkZWQgdXNpbmcgY2h1bmtlZCBlbmNvZGluZy4KCi0gRGFuIEZhbmRyaWNoIG1hZGUgbGliY3VybCBzdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGd6aXAgY29udGVudHMKICAoYXMgYW4gYWRkaXRpb24gdG8gdGhlIHByZXZpb3VzIGRlZmxhdGUgc3VwcG9ydCkuCgotIEkgbWFkZSB0aGUgQ1dEIGNvbW1hbmQgZHVyaW5nIEZUUCBzZXNzaW9uIGNvbnNpZGVyIGFsbCAyeHkgY29kZXMgdG8gYmUgT0sKICByZXNwb25zZXMuCgpEYW5pZWwgKDEwIEFwcikKLSBWbGFkIEtydXBpbiBmaXhlZCBhIFVSTCBwYXJzaW5nIGlzc3VlLiBVUkxzIHRoYXQgd2VyZSBub3QgdXNpbmcgYSBzbGFzaAogIGFmdGVyIHRoZSBob3N0IG5hbWUsIGJ1dCBzdGlsbCBoYWQgIj8iIGFuZCBwYXJhbWV0ZXJzIGFwcGVuZGVkLCBhcyBpbgogICJodHRwOi8vaG9zdG5hbWUuY29tP2Zvb2Jhcj1tb28iLCB3ZXJlIG5vdCBwcm9wZXJseSBwYXJzZWQgYnkgbGliY3VybC4KCkRhbmllbCAoOSBBcHIpCi0gTWFkZSBDVVJMT1BUX1RJTUVDT05ESVRJT04gd29yayBmb3IgRlRQIHRyYW5zZmVycywgdXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzCiAgZm9yIEhUVFAuIFRoaXMgdGhlbiBtYWRlIC16IHdvcmsgZm9yIGZ0cCB0cmFuc2ZlcnMgdG9vLiBBZGRlZCB0ZXN0IGNhc2UgMTM5CiAgYW5kIDE0MCBmb3IgdmVyaWZ5aW5nIHRoaXMuCgotIEdldHRpbmcgdGhlIGZpbGUgZGF0ZSBvZiBhbiBmdHAgZmlsZSB1c2VkIHRoZSB3cm9uZyB0aW1lIHpvbmUgd2hlbgogIGRpc3BsYXllZC4gSXQgaXMgc3VwcG9zZWRseSBhbHdheXMgR01ULiBBZGRlZCB0ZXN0IGNhc2UgMTQxIGZvciB0aGlzLgoKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciBzdXBwb3J0IE1EVE0uCgotIFRoZSBkZWZhdWx0IERFQlVHRlVOQ1RJT04sIGFzIGVuYWJsZWQgd2l0aCBDVVJMT1BUX1ZFUkJPU0Ugbm93IG91dHB1dHMKICBDVVJMSU5GT19IRUFERVJfSU4gZGF0YSBhcyB3ZWxsLiBUaGUgbW9zdCBub3RhYmxlIGVmZmVjdCBmcm9tIHRoaXMgaXMgdGhhdAogIHVzaW5nIGN1cmwgLXYsIHlvdSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyAiaGVhZGVycyIgYXMgd2VsbC4gVGhpcyBpcwogIHBlcmhhcHMgbW9zdCB1c2VmdWwgd2hlbiBkb2luZyBmdHAuCgpEYW5pZWwgKDggQXByKQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgZmxhdyBpbiB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gY29kZSwgd2hpY2ggbWlzc2VkCiAgdGhlIGZpcnN0IGxldHRlciBpZiBubyBzcGFjZSBmb2xsb3dlZCB0aGUgY29sb24uCgotIE1hZ251cyBOaWxzc29uIHBvaW50ZWQgb3V0IHRoYXQgc2hhcmUuYyB3YXMgbWlzc2luZyBpbiB0aGUgTVNWQyBwcm9qZWN0CiAgZmlsZS4KCkRhbmllbCAoNiBBcHIpCi0gUnlhbiBXZWF2ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDQSBjZXJ0IGJ1bmRsZSBub3QgZ2V0IGluc3RhbGxlZAogIGFueW1vcmUgd2hlbiAnY29uZmlndXJlIC0td2l0aG91dC1zc2wnIGhhcyBiZWVuIHVzZWQuCgpEYW5pZWwgKDQgQXByKQotIE1hcnRpam4gQnJvZW5sYW5kIGZvdW5kIGFub3RoZXIgY2FzZXMgd2hlcmUgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZGlkbid0CiAgbGlrZSB0aGUgYm91bmRhcnkgc3RyaW5nIHVzZWQgYnkgY3VybCB3aGVuIGRvaW5nIGEgbXVsdGktcGFydC9mb3JtcG9zdC4gV2UKICBtb2RpZmllZCB0aGUgYm91bmRhcnkgc3RyaW5nIHRvIGxvb2sgbGlrZSB0aGUgb25lIElFIHVzZXMsIGFzIHRoaXMgaXMKICBwcm9iYWJseSBnb25uYSBtYWtlIGN1cmwgd29yayB3aXRoIG1vcmUgYXBwbGljYXRpb25zLgoKRGFuaWVsICgzIEFwcikKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgYSBidW5jaCBvZiB0ZXN0cyBmYWlscyBvbiBjeWd3aW4uIE9uZSBzZXQgZmFpbHMKICB3aGVuIHVzaW5nIHBlcmwgNS44IChhbmQgdGhleSBydW4gZmluZSB3aXRoIHBlcmwgNS42KSwgYW5kIGFub3RoZXIgc2V0CiAgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gYXJ0aWZhY3QgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgSQogIGNvcnJlY3RlZC4gSXQgdHVybmVkIG91dCB0aGUgRlRQIHNlcnZlciBjb2RlIHdhcyBzdGlsbCBoYXZpbmcgYSBmaWxlIG9wZW5lZAogIHdoaWxlIHRoZSBtYWluIHRlc3Qgc2NyaXB0IHJlbW92ZWQgaXQgYW5kIGludm9rZWQgdGhlIEhUVFAgc2VydmVyIHRoYXQKICBhdHRlbXB0ZWQgdG8gY3JlYXRlIHRoZSBzYW1lIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgRlRQIHNlcnZlciBrZXB0IG9wZW4uCiAgVGhpcyBvcGVyYXRpb24gd29ya3MgZmluZSBvbiB1bml4LCBidXQgbm90IG9uIGN5Z3dpbi4KClZlcnNpb24gNy4xMC40ICgyIEFwciAyMDAzKQoKRGFuaWVsICgxIEFwcikKLSBBZGRlZCB0ZXN0IGNhc2UgNTA1IHRvIGV4ZXJjaXNlIEZUUCB1cGxvYWQgd2l0aCByZW5hbWUgZG9uZSB3aXRoIGxpYmN1cmwsCiAgYW5kIGZvciB0aGF0IEkgaGFkIHRvIGV4dGVuZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gZGVhbCB3aXRoIHRoZQogIFJORlIgYW5kIFJOVE8gY29tbWFuZHMuCgpEYW5pZWwgKDMxIE1hcikKLSBFdmVuIG1vcmUgU1NMIGNvbmZpZyBjaGVjayBtb2RpZmljYXRpb25zIGFmdGVyIFJpY2hhcmQncyB0ZXN0aW5nLgoKVmVyc2lvbiA3LjEwLjQtcHJlNiAoMzEgTWFyIDIwMDMpCgpEYW5pZWwgKDMxIE1hcikKLSBNb3JlIGZpeGVzIGZvciB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgY2hlY2tzIHdoZW4gU1NMIGNvbmZpZ3MgYXJlIGNoYW5nZWQKICBiZXR3ZWVuIGNvbm5lY3Rpb25zLiBCYXNlZCBvbiB0ZXN0cyBhbmQgdGFsa3Mgd2l0aCBSaWNoYXJkIEJyYW1hbnRlLgoKLSBHdWlsbGF1bWUgQ290dGVuY2VhdSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgQ1VSTE9QVF9VTlJFU1RSSUNURURfQVVUSC4KICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgcHJldmVudCBsaWJjdXJsIGZyb20gbGltaXRpbmcgdG8gd2hpY2ggaG9zdCBpdCBzZW5kcwogIHVzZXIrcGFzc3dvcmQgdG8gd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLiBCeSBkZWZhdWx0LCBsaWJjdXJsIG9ubHkgc2VuZHMKICBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgaG9zdCB1c2VkIGluIHRoZSBmaXJzdCBVUkwsIGJ1dCB3aXRoIHRoaXMKICBvcHRpb24gc2V0IGl0IHdpbGwgc2VuZCB0aGUgYXV0aCBpbmZvIHRvIGFsbCBob3N0cyBpdCBmb2xsb3dzIGxvY2F0aW9uCiAgaGVhZGVycyB0by4gVGhlIG5ldyB0b29sIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoaXMgaXMgbmFtZWQKICAiLS1sb2NhdGlvbi10cnVzdGVkIi4KCi0gRnJhbmtpZSBGb25nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgaWYgeW91IHJlLXVzZWQgYW4gZWFzeSBoYW5kbGUKICB3aXRoIGEgcHJveHksIGFuZCB5b3UgZmlyc3QgbWFkZSBhIGh0dHBzOi8vIGNvbm5lY3Rpb24gdG8gYSBob3N0IGFuZCB0aGVuCiAgc3dpdGNoZWQgdG8gYSBodHRwOi8vIG9uZSB0byB0aGUgc2FtZSBob3N0LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSByZS11c2UKICB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBpdCBhbmQgZmFpbCB0byBnZXQgdGhlIHNlY29uZCBVUkwgcHJvcGVybHkKCkRhbmllbCAoMjkgTWFyKQotIERhbiBTaGVhcmVyJ3MgZml4IHRoYXQgbWFrZXMgY3VybCBjb21wbGFpbiBpZiBpbnZva2VkIHdpdGggbm90aGluZyBidXQgImN1cmwKICAtTyIgd2FzIGFwcGxpZWQuCgpEYW5pZWwgKDI2IE1hcikKLSBCcnlhbiBLZW1wIHdhcyBmcmllbmRseSBlbm91Z2ggdG8gbGVuZCBtZSBhbiBhY2NvdW50IG9uIGhpcyBSZWRoYXQgOSBib3ggYW5kCiAgSSBjb3VsZCBmaXggdGhlIGNvbmZpZ3VyZSBwcm9ibGVtcyBvbiByZWRoYXQgOC4xIGFuZCA5IGluIG5vIHRpbWUgdGhhbmtzIHRvCiAgdGhpcy4gVGhhbmtzIGEgYnVuY2ggQnJ5YW4hCgpEYW5pZWwgKDI1IE1hcikKLSBSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMKClZlcnNpb24gNy4xMC40LXByZTUgKDI1IE1hciAyMDAzKQoKRGFuaWVsICgyNSBNYXIpCi0gUmljaGFyZCBCcmFtYW50ZSBwcm92aWRlZCBhIGZpeCBmb3IgYSBoYW5kbGUgcmUtdXNlIHByb2JsZW0gc2VlbiB3aGVuIHlvdQogIGNoYW5nZSBvcHRpb25zIG9uIGFuIFNTTC1lbmFibGVkIGNvbm5lY3Rpb24gYmV0d2VlbiByZXF1ZXN0cy4gUHJldmlvdXNseSwKICBjaGFuZ2luZyBwZWVyIHZlcmlmaWNhdGlvbiBvciBob3N0IHZlcmlmaWNhdGlvbiBhbmQgc2ltaWxhciB0aGluZ3Mgd2FzIG5vdAogIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGEgY29ubmVjdGlvbiB3ZXJlIGNoZWNrZWQgZm9yIHJlLXVzZSBhbmQgdGh1cwogIGVuYWJsaW5nIHN0cmljdGVyIGNoZWNrIGJldHdlZW4gcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gbWFkZSBubwogIGRpZmZlcmVuY2UgYW5kIHRoZSBjb25uZWN0aW9uIHdvdWxkIHRodXMgYmUgdXNlZCBlcnJvbmVvdXNseS4KCkRhbmllbCAoMjQgTWFyKQotIEf2dHogQmFiaW4tRWJlbGwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY2EtYnVuZGxlLmNydCBmaWxlIGNvbnRhaW5lZCBhCiAgY2VydGlmaWNhdGUgZnJvbSBUcnVzdGNlbnRlciB0aGF0IHdhcyBhIGRlbW8gY2VydGlmaWNhdGUgb25seSB0aGF0IHdhcyBuZXZlcgogIGludGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBDQSBidW5kbGUuCgpEYW5pZWwgKDIxIE1hcikKLSBMaWZlIGlzIGEgbXlzdGVyeS4gV2l0aGluIGEgdGltZSBwZXJpb2Qgb2YgMTcgaG91cnMsIFRpbSBQb3BlIGFuZCBNaWNoYWVsCiAgQ2h1cmNoaWxsIGZpbGVkIG9uZSBidWcgcmVwb3J0IGVhY2gsIGJvdGggaWRlbnRpZnlpbmcgcHJvYmxlbXMgd2l0aCBhIHNlY29uZAogIHRyYW5zZmVyIHdoZW4gZG9pbmcgcGVyc2lzdGVudCB0cmFuc2ZlcnMgcmUtdXNpbmcgYSBjb25uZWN0aW9uLiBUaW0ncyBvbmUgaXMKICAjNzA2NjI0LCBsYWJlbGVkICJNdWx0aXBsZSB1cGxvYWRzIHBlciBoYW5kbGUgZmFpbCIgYW5kIE1pY2hhZWwncyAjNzA3MDAzCiAgIkRvZXMgbm90IHNlbmQgQXV0aG9yaXphdGlvbjogaGVhZGVyIHdoZW4gcmV1c2luZyBjb25uZWN0aW9uIi4gSSBjb3VsZCB0cmFjawogIGJvdGggZG93biB0byB0aGUgc2FtZSBwaWVjZSBvZiBsb2dpYyBhbmQgaXQgdHVybmVkIG91dCBsaWJjdXJsIHdhcyBub3QgdXNpbmcKICBuZXcgc2V0dGluZ3MgcHJvcGVybHkgd2hlbiByZS11c2luZyBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBUaGlzIGNvbmNlcm5lZAogIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBhbmQgaW52b2x2ZWQgZXhhY3RseSB0aG9zZSBwaWVjZXMgdGhlc2UgdHdvCiAgcmVwb3J0cyBpZGVudGlmaWVkLiBUaGlzIGNvZGUgaGFzIGJlZW4gdGhpcyBmYXVsdHkgc2luY2UgdGhlIGRheSBJCiAgaW50cm9kdWNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLCBtb3JlIHRoYW4gMiB5ZWFycyBhZ28uCgpEYW5pZWwgKDIwIE1hciAyMDAzKQotIEZpdmUgeWVhciBhbm5pdmVyc2FyeS4gVG9kYXkgZml2ZSB5ZWFycyBhZ28sIHRoZSBmaXJzdCBldmVyIGN1cmwgcmVsZWFzZSBzYXcKICB0aGUgbGlnaHQgb2YgZGF5LgoKRGFuaWVsICgxNyBNYXIpCi0gQW5keSBDZWRpbG5payBjb3JyZWN0ZWQgZmxhd3MgaW4gc29tZSBsaWJjdXJsIGV4YW1wbGUtdXNhZ2Ugc291cmNlcy4KCkRhbmllbCAoMTYgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIHJlcG9ydGVkIHRoYXQgdGhlIGZpeCBmcm9tIE1hcmNoIDJuZCB3YXMgaW5jb21wbGV0ZS4KCi0gQWRkZWQgY29kZSB0byB0aGUgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvciBzZWxlY3QoKSBhcmd1bWVudCB0eXBlcy4gSSd2ZQogIG5vdCBtYWRlIGFueSBjb2RlIHVzZSB0aGUgcmVzdWx0cyBqdXN0IHlldCB0aG91Z2guCgpEYW5pZWwgKDE1IE1hcikKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCB0d28gcGF0Y2hlcyB0byBidWlsZCBiZXR0ZXIgb24gV2luZG93cy4KCi0gQWRqdXN0ZWQgdGhlIHRlc3Qgc3VpdGUgY29kZSB0byBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlcihzKSByZXF1aXJlZAogIGZvciBhIHNwZWNpZmljIHRlc3QgaXMgcHJvcGVybHkgc3RhcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBhdHRlbXB0ZWQuCiAgTWFueSB0ZXN0cyBub3cgcnVuIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMTQgTWFyKQotIEFub3RoZXIgY29uZmlndXJlLmluIGFkanVzdG1lbnQgbWFkZSB0aGUgY29uZmlndXJlIGRldGVjdCBmdW5jdGlvbnMgcHJvcGVybHkKICBvbiBIUFVYIG5vdy4KCkRhbmllbCAoMTMgTWFyKQotIFBoaWxpcHBlIFJhb3VsdCBmaXhlZCBwcmU0LWNvbXBpbGUgcXVpcmtzIGZvciBGcmVlQlNELgoKVmVyc2lvbiA3LjEwLjQtcHJlNCAoMTMgTWFyIDIwMDMpCgpEYW5pZWwgKDEzIE1hcikKLSBBZGRlZCBhIGJhY2t1cC1jaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGZvdW5kIGJ5IEFDX0NIRUNLX0ZVTkNTKCkKICBhcyBJIGJlbGlldmUgc29tZSBjaGVja3Mgb24gSFBVWCBuZWVkIHRoaXMuIEF0IGxlYXN0IHNvbWUgb2YgdGhlIGluZm8gZ2l2ZW4KICB0byB1cyBieSBSaWNrIEpvbmVzIHNlZW1lZCB0byBpbmRpY2F0ZSB0aGlzLgoKRGFuaWVsICgxMiBNYXIpCi0gVGhvbWFzIFRvbmlubyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCB0aGUgY3VybCB0b29sIHRvIGRvIFBVVCBvcGVyYXRpb25zCiAgYXMgaW4gJ2N1cmwgd3d3LmZvby5jb20vZGlyLyAtVCBmaWxlJyBhbmQgdGhlIGZpbGUgbmFtZSBpbmNsdWRlZCBmb3IgZXhhbXBsZQogIHNwYWNlIG9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBiZWxvbmcgaW4gVVJMcywgY3VybCBkaWQgbm90IHByb3Blcmx5CiAgVVJMIGVuY29kZSB0aGVtIGJlZm9yZSB1c2luZyB0aGVtIGluIHRoZSBVUkwuCgotIEFkZGVkIGFuIG9wdGlvbiB0byBjb25maWd1cmUgY2FsbGVkIC0tZW5hYmxlLWxpYmdjYyB0aGF0IHNpbXBseSBhZGRzIC1sZ2NjCiAgdG8gdGhlIExJQlMgdmFyaWFibGUsIGFzIHRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbS4KCi0gSSBtb2RpZmllZCB0aGUgY29uZmlndXJlLmluIGZpbGUsIHNvIHRoYXQgdGhlIGhlYWRlcnMgYXJlIG5vdyBjaGVja2VkIGluIGFuCiAgb3JkZXIgb2YgInZpYWxpdHkiLiBXZSBtdXN0IGFsc28gbWFrZSBzdXJlIHRvIHVzZSB0aGUgImRlZmF1bHQgaGVhZGVycyIKICBwYXJhbWV0ZXIgdG8gQUNfQ0hFQ0tfSEVBREVSUygpIHNvIHRoYXQgaGVhZGVycyBhcmUgY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIKICBwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIChpLmUgYWxsIHRoZSBtYWpvciBhbmQgZ2VuZXJhbGx5IGltcG9ydGFudCBoZWFkZXIKICBmaWxlcyBhcmUgaW5jbHVkZWQgdGhlcmUgYnkgZGVmYXVsdCkuIFRoaXMgbWlnaHQgYmUgd2hhdCB3ZSBuZWVkIGZvciB2YXJpb3VzCiAgU3VuLCBIUCwgQUlYIGFuZCBUcnU2NCBzeXN0ZW1zIHRvIGJlaGF2ZSBnb29kIGFnYWluIG9uIHRoZSBoZWFkZXIgY2hlY2sKICBmcm9udC4KCi0gUmljayBKb25lcyBwb2ludGVkIG91dCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBvbiBIUC1VWCB0aGF0IEkgYWRkcmVzc2VkLgoKLSBJIG1hZGUgdGhlIGNvbmZpZ3VyZSAtLWhlbHAgb3V0cHV0IG5pY2VyIGJ5IHVzaW5nIEFDX0hFTFBfU1RSSU5HKCkgYSBsb3QKICBtb3JlLgoKRGFuaWVsICgxMSBNYXIpCi0gQ2hyaXN0b3BoZSBEZW1vcnkgZml4ZWQgdGhlIHNvY2tldCBzZW5kaW5nIGNvZGUgdG8gd29yayBiZXR0ZXIgb24gSFAtVVgKICB3aGVuIHNlbmRpbmcgZGF0YSB0byBhIHNvY2tldCB0aGF0IHdvdWxkIGJsb2NrLiBJdCB0aGVuIHJldHVybnMgRUFHQUlOLCBub3QKICBFV09VTERCTE9DSy4KCi0gUmljaGFyZCBHb3J0b24gaW1wcm92ZWQgdGhlIHNlZWRpbmcgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBhIGdvb2QKICBhbmQgcmVsaWFibGUgcmFuZG9tIHNvdXJjZS4KCi0gUmljaGFyZCBHb3J0b24gZml4ZWQgYSBmZXcgd2FybmluZ3MgdGhhdCBwb3BwZWQgdXAgd2hlbiB5b3UgYnVpbHQgY3VybAogIHVzaW5nIHRoZSBTdW4gY29tcGlsZXIgb24gYSA2NGJpdCBTUEFSQyBwbGF0Zm9ybS4KCi0gTWFydGluIEMuIE1hcnRpbiBmaXhlZCBhIGNhc2Ugd2hlcmUgYSBjb25uZWN0IGZhaWx1cmUgdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGRpZG4ndCBwcm9kdWNlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nLgoKRGFuaWVsICgxMCBNYXIpCi0gUmV2ZXJ0ZWQgbHRtYWluLnNoIGJhY2sgdG8gbGlidG9vbCAxLjQuMiBzdGF0dXMgYWdhaW4sIGFzIHRoZSAxLjQuMyB2ZXJzaW9uCiAgYnJva2UgdGhlIGJ1aWxkIG9uIG51bWVyb3VzIHBsYXRmb3Jtcy4gSXQgc2VlbXMgdGhhdCBsaWJ0b29sIDEuNC4zIHB1dHMgc29tZQogIHJlcXVpcmVtZW50cyBvbiB3aGF0IHZlcnNpb25zIG9mIHRoZSBvdGhlciB0b29scyAoYXV0b2NvbmYgKyBhdXRvbWFrZSkgdGhhdAogIEkgYW0gbm90IGZhbWlsaWFyIHdpdGggYW5kIHRodXMgSSBjb3VsZG4ndCBmdWxmaWxsIGF0IHRoaXMgcG9pbnQuCgogIFllcywgdGhpcyBpcyBtb3JlIHRoYW4gbWlsZGx5IGZydXN0cmF0aW5nLgoKRGFuaWVsICg3IE1hcikKLSBSdW4gbGlidG9vbGl6ZSB2ZXJzaW9uIDEuNC4zLgoKVmVyc2lvbiA3LjEwLjQtcHJlMyAoNCBNYXIgMjAwMykKCkRhbmllbCAoMyBNYXIpCi0gQWRkZWQgc2hhcmUub2JqIHRvIHRoZSBWQzYgYW5kIEJvcmxhbmQgbGliY3VybCBtYWtlZmlsZXMuCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmb3VuZCBhbmQgaW52ZXN0aWdhdGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgb24gQUlYLAogIHByZXN1bWFibHkgb25seSBvbiA0LjMgb3IgbGF0ZXIuIGdldGhvc3RieW5hbWVfcigpIGlzIG5vdCByZXR1cm5pbmcgZGF0YQogIHRoYXQgaXMgcG9zc2libGUgdG8gImtlZXAiIGFuZCBjYWNoZSB0aGUgd2F5IGxpYmN1cmwgZG9lcy4gQnV0IGluc3RlYWQgdGhlc2UKICB2ZXJzaW9ucyBvZiBBSVggdXNlcyBhIGdldGhvc3RieW5hbWUoKSB0aGF0IHdvcmtzIHRocmVhZC1zYWZlbHkgd2UgY2FuCiAgaW5zdGVhZCB1c2UgdGhlIG9yZGluYXJ5IGdldGhvc3RieW5hbWUoKSBhbmQgb3VyIHBhY2tfaG9zdGVudCgpIGFwcHJvYWNoIHRvCiAgYWNoaWV2ZSB3aGF0IHdlIHdhbnQuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgQUlYIDQuMyBvcgogIGxhdGVyIHRvIGFkanVzdCBmb3IgdGhpcy4KCkRhbmllbCAoMiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgZm91bmQgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy4xMC4zIHdoZW4geW91IGZpcnN0IGRpZCBhCiAgUE9TVCBhbmQgdGhlbiBiYWNrIHRvIGEgR0VUIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLgoKRGFuaWVsICgyOCBGZWIpCi0gUmVtb3ZlZCB0aGUgc3RyZXF1YWwgYW5kIHN0cm5lcXVhbCBkZWZpbmVzIGZyb20gY3VybC9jdXJsLmggaGVhZGVyLiBUaGV5CiAgd2VyZSBuZXZlciBtZWFudCBmb3IgdGhlIHB1YmxpYyBoZWFkZXIgYW55d2F5LiBQaGlsaXBwZSBSYW91bHQgYnJvdWdodCBpdAogIHVwLgoKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgUklTQyBPUyBidWlsZC4KCkRhbmllbCAoMjcgRmViKQotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGUgdmVyeSBtaXNsZWFkaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkIG1hbiBwYWdlLCBhbmQKICBJIHVwZGF0ZWQgaXQgdG8gYmVjb21lIG1vcmUgYWNjdXJhdGUuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZGluZyB0aGF0IHR1cm5lZCBvdXQgdG8KICBiZSBoaXMgRlRQIHNlcnZlciByZXR1cm5pbmcgc2l6ZSB6ZXJvICgwIGJ5dGVzKSB3aGVuIFNJWkUgd2FzIHVzZWQgb24gYSBmaWxlCiAgd2hpbGUgYmVpbmcgaW4gQklOQVJZIG1vZGUuIFdlIG5vdyBtYWtlIGEgc2Vjb25kIGNoZWNrIGZvciB0aGUgYWN0dWFsIHNpemUKICBieSBzY2FubmluZyB0aGUgUkVUUiByZXBseSBhbnl3YXksIGV2ZW4gaWYgdGhlIFNJWkUgY29tbWFuZCByZXR1cm5lZCAwLgoKRGFuaWVsICgyNiBGZWIpCi0gS3lsZSBTYWxsZWUgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGhlIHdvdWxkIGRvIGEgdHJhbnNmZXIgdGhhdCBkaWRuJ3QgdXBkYXRlCiAgdGhlIHByb2dyZXNzIG1ldGVyIHByb3Blcmx5LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgbG9vcCBhIGxpdHRsZSB0b28gZWFnZXJseSBpbiB0aGUgdHJhbnNmZXIgbG9vcCwgd2hpY2ggaXNuJ3QgcmVhbGx5IGdvb2QgZm9yCiAgdGhlIEFQSXMsIGVzcGVjaWFsbHkgbm90IHRoZSBtdWx0aSBBUEkuCgpWZXJzaW9uIDcuMTAuNC1wcmUyICgyNCBGZWIgMjAwMykKCkRhbmllbCAoMjQgRmViKQotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBvdXQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTUFYQ09OTkVDVFMgdG8gYSB2YWx1ZSBoaWdoZXIKICB0aGFuIDUgY291bGQgY2F1c2UgYSBzZWdmYXVsdC4KCi0gSSBiZWxpZXZlIEkgZml4ZWQgdGhlICdFeHBlY3Q6IDEwMC1jb250aW51ZScgYmVoYXZpb3IgdGhhdCBoYXMgYmVlbiBicm9rZW4KICBmb3IgYSB3aGlsZSAoSSB0aGluayBzaW5jZSBteSBjaGFuZ2UgZGF0ZWQgRGVjIDEwIDIwMDIpLiBXaGVuIHRoaXMgaGVhZGVyIGlzCiAgdXNlZCwgbGliY3VybCBzaG91bGQgd2FpdCBmb3IgYSBIVFRQIDEwMCAob3IgdGltZW91dCkgYmVmb3JlIHNlbmRpbmcgdGhlCiAgcG9zdC9wdXQgZGF0YS4KCkRhbmllbCAoMTQgRmViKQotIE1hdHRoZXcgQ2xhcmtlIHByb3ZpZGVkIHNvbWUgaW5mbyB3aGF0IHRvIG1vZGlmeSB0byBtYWtlIGN1cmwgYnVpbGQKICBmbGF3bGVzc2x5IG9uIEFJWCAzLjIuNS4KCi0gTWFydGluIEMuIE1hcnRpbiBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbgogIHJ1bm5pbmcgb24gV2luZG93cyBhbmQgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBwb3J0IHdpdGhvdXQgYSBsaXN0ZW5lci4KCkRhbmllbCAoMTMgRmViKQotIENocmlzdG9waGVyIFIuIFBhbG1lciBmaXhlZCBDdXJsX2Jhc2U2NF9lbmNvZGUoKSB0byBkZWFsIHdpdGggemVyb2VzIGluIHRoZQogIGRhdGEgdG8gZW5jb2RlLgoKRGFuaWVsICg0IEZlYikKLSBKZWFuLVBoaWxpcHBlIGFkZGVkIHRoZSBmaXJzdCBjb2RlIHRoYXQgZW5hYmxlcyB0aGUgJ3NoYXJlJyBzeXN0ZW0uIFRoaXMKICBzaG91bGQgbm93IGVuYWJsZSBzaGFyaW5nIG9mIEROUyBkYXRhIGJldHdlZW4gdHdvIGN1cmwgZWFzeSBoYW5kbGVzLgoKLSBJbmNvcnBvcmF0ZWQgTmljbyBCYWdndXMnIGZpeGVzIHRvIGFnYWluIGNvbXBpbGUgZmxhd2xlc3NseSBvbiBWTVMuCgotIEphbWVzIEJ1cnNhIGNvcnJlY3RlZCBhIGJhZCBjb21tZW50IGluIHRoZSBwdWJsaWMgaW5jbHVkZSBmaWxlIGN1cmwvbXVsdGkuaAoKLSBQZXRlciBGb3JyZXQgcmVwb3J0ZWQgb25lIG9mIHRob3NlIGVycm9yOjAwMDAwMDAwIGNhc2VzIGluIGxpYmN1cmwgYWdhaW4KICB3aGVuIGNvbm5lY3RpbmcgdG8gYSBIVFRQUyBzaXRlLCBhbmQgdGhpcyB0aW1lIEkgZGlkIGRpc2NvdmVyIHNvbWUgb2RkaXRpZXMKICBpbiBob3cgY3VybCByZXBvcnRzIFNTTCBlcnJvcnMgYmFjay4gSXQgY291bGQgbWlzcyBzaG93aW5nIHRoZSBhY3R1YWwgZXJyb3IuCgpWZXJzaW9uIDcuMTAuNC1wcmUxICgzIEZlYiAyMDAzKQoKRGFuaWVsICgzIEZlYikKLSBSZW1vdmVkIHRoaW5ncyBpbiB0aGUgZG9jcyBzYXlpbmcgY2FwYXRoIGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzLCBhcyBKdWxpYW4KICBOb2JsZSB0b2xkIHVzIGl0IHdvcmtzIGZpbmUuCgpEYW5pZWwgKDMxIEphbikKLSBLZXZpbiBSb3RoIGZpeGVkIHRoZSB6bGliIGJ1aWxkIHN0dWZmIGluIHRoZSBNaW5ndzMyIG1ha2VmaWxlLgoKRGFuaWVsICgzMCBKYW4pCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBjdXJsIG9uIFdpbmRvd3MgYWx3YXlzIGNoZWNrZWQgZm9yIHRoZSBDQSBjZXJ0CiAgYnVuZGxlIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlIHBhdGggc2NhbiwgZXZlbiB0aG91Z2gKICAtay8tLWluc2VjdXJlIHdhcyB1c2VkLgoKLSBIYW1pc2ggTWFja2VuemllIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBvbmx5IGRpZCBzdHJpY3QgaG9zdCBuYW1lIHZlcmlmeWluZwogIGlmIGNhcGF0aCBvciBjYWluZm8gd2FzIHVzZWQuIE5vdyBpdCdsbCBhbHdheXMgZG8gaXQgdW5sZXNzIC1rIC8gLS1pbnNlY3VyZQogIGlzIHVzZWQhCgotIFBhdmVsIENlbmVrIHBvaW50ZWQgb3V0IHRoYXQgdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIHdhcyBkb25lIHdyb25nbHkKICBhcyB0aGUgZnVsbCBzdHJpbmcgd2FzIG5vdCBmZXRjaGVkLiBBZGRlZCB0ZXN0IGNhc2UgNTcgdG8gdmVyaWZ5IHRoYXQgY3VybAogIGRvZXMgaXQgcmlnaHQgbm93LgoKRGFuaWVsICgyOSBKYW4pCi0gSmFtaWUgV2lsa2luc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgY3VybCBhdHRlbXB0IHRvIGNsZWFyIG91dAogICJzZW5zaXRpdmUiIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBwcyBvdXRwdXRzCiAgKG9ubHkgb24gcGxhdGZvcm1zIHRoYXQgYWxsb3cgd3JpdGluZyB0byBhcmd2W10pLgoKLSBKb2huIE1jR293YW4gZm91bmQgb3V0IHRoYXQgdGhlIERFQlVHRlVOQ1RJT04gY291bGQgYmUgY2FsbGVkIHdpdGggYmFkCiAgYXJndW1lbnRzIGFuZCB0aHVzIGNhdXNlIHRoZSAtLXRyYWNlIG91dHB1dHMgdG8gZ28gd3JvbmcuCgotIFJlbW92ZWQgYWxsIHRoZSBlbWFjcyBsb2NhbCB2YXJpYWJsZXMgZnJvbSBhbGwgZmlsZXMuIE1hdHMgTGlkZWxsIHByb3ZpZGVkCiAgdGhlIG5ldyBzYW1wbGUuZW1hY3MgZmlsZSAoZm9yIGEgc2FtcGxlIG9mIHdoYXQgdG8gaW5jbHVkZSBpbiB5b3VyIC5lbWFjcykKICBhbmQgdGhlIGN1cmwtc3R5bGUuZWwgdGhhdCBzZXRzIGEgYmV0dGVyIGMtc3R5bGUgZm9yIGVkaXRpbmcgY3VybCBzb3VyY2VzLgoKLSBEYXZlIEhhbGJha2tlbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBGVFAgZG93bmxvYWRzIHRoYXQgY291bGQgYWNjaWRlbnRseQogIHJldHVybiBDVVJMRV9QQVJUSUFMX0ZJTEUgd2hlbiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdhcyBjYWxsZWQgd2l0aCBOT0JPRFkKICBzZXQgVFJVRS4KCkRhbmllbCAoMjcgSmFuKQotIFRoZSBmb3Blbi5jIGV4YW1wbGUgd2FzIGZsYXdlZCBhcyBOaWNrIEh1bWZyZXkgbm90aWNlZCwgYW5kIEkgZml4ZWQgaXQgdG8KICB3b3JrIGFnYWluLgoKRGFuaWVsICgyNCBKYW4pCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgKHRoZSBjb250ZW50LXR5cGUgc3RyaW5nKQogIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4KCkRhbmllbCAoMjIgSmFuIDIwMDMpCi0gSWFuIFdpbGtlcyBhbmQgTGVnb2ZmIFZpbmNlbnQgYm90aCBpbmRlcGVuZGVudGx5IHByb3ZpZGVkIGZpeGVzIGZvciBtYWtpbmcKICBjdXJsL211bHRpLmggd29yayBwcm9wZXJseSB3aGVuIGNvbXBpbGVkIHdpdGggYSBDKysgY29tcGlsZXIuCgpEYW5pZWwgKDIwIEphbiAyMDAzKQotIEZpeGVkICdidWlsZGNvbmYnIHRvIGNoZWNrIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZXF1aXJlZCB0b29scyBiZWZvcmUKICB0aGV5J3JlIGFjdHVhbGx5IHVzZWQuCgotIFdyb3RlICd0ZXN0Y3VybC5zaCcsIGEgc2NyaXB0IHRhcmdldGVkIGZvciBhdXRvbWF0aWMgYW5kIGRpc3RyaWJ1dGVkIGN1cmwKICB0ZXN0cyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KCi0gRGF2aWQgVGhpZWwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLm5ldHJjIGZpbGUgd2FzIG5vdCBiZWluZyBkZWFsdCB3aXRoCiAgcHJvcGVybHkgYW55bW9yZS4gSSBicm9rZSB0aGlzIGluIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgImZpeCIuCgotIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIHBhdGNoZWQgbGliY3VybCB0byBhbGxvY2F0ZSB0aGUgc2NyYXRjaCBidWZmZXIgb25seQogIG9uIGRlbWFuZCBhbmQgdGh1cyB3ZSBzYXZlIDMyS0IgaW4gZWFjaCBjdXJsIGhhbmRsZSB0aGF0IGRvbid0IHVzZSB0aGF0CiAgYnVmZmVyLiBUaGlzIG5lZWQgYXBwZWFyZWQgd2hlbiBzb21lIHBlb3BsZSBzdGFydGVkIHVzaW5nIHRob3VzYW5kcyBvZgogIHNpbXVsdGFuZW91cyBjdXJsIGhhbmRsZXMuLi4gOi0pCgpEYW5pZWwgKDE2IEphbiAyMDAzKQotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgY3VybC1jb25maWcgLS1jZmxhZ3Mgd2hlbiB0aGUgaW5jbHVkZWRpciB3YXMgbm90CiAgL3Vzci9pbmNsdWRlLgoKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIENVUkxJTkZPX1BSSVZBVEUgdG8gcHJvcGVybHkgcmV0dXJuIE5VTEwgaWYgaXQgd2FzCiAgc2V0IHRvIE5VTEwhCgpWZXJzaW9uIDcuMTAuMyAoMTQgSmFuIDIwMDMpCgpEYW5pZWwgKDEwIEphbiAyMDAzKQotIFN0ZXZlIE9saXBoYW50IHBvaW50ZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDEwNSBkaWQgbm90IHdvcmsgYW55bW9yZSBhbmQgdGhpcwogIHdhcyBkdWUgdG8gYSBtaXNzaW5nIGZpeCBmb3IgdGhlIHBhc3N3b3JkIHByb21wdGluZy4KClZlcnNpb24gNy4xMC4zLXByZTYgKDEwIEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEJyeWFuIEtlbXAgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIC11IGNvdWxkIG5vdCBwcm92aWRlIGEgYmxhbmsgcGFzc3dvcmQKICB3aXRob3V0IHByb21wdGluZyB0aGUgdXNlci4gSXQgY2FuIG5vdy4gLXUgdXNlcm5hbWU6IG1ha2VzIHRoZSBwYXNzd29yZAogIGVtcHR5LCB3aGlsZSAtdSB1c2VybmFtZSBtYWtlcyBjdXJsIHByb21wdCB0aGUgdXNlciBmb3IgYSBwYXNzd29yZC4KCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIGEgcmVtYWluaW5nIGNvbm5lY3QgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIG9uCiAgaXB2NCBzeXN0ZW1zIChMaW51eCBvbmx5PyksIHRoYXQgSSBmaXhlZCBhbmQgS2pldGlsIHZlcmlmaWVkIHRoYXQgaXQgZml4ZWQKICBoaXMgcHJvYmxlbXMuCgotIG1lbWFuYWx5emUucGwgbm93IHJlYWRzIGEgZmlsZSBuYW1lIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYW5kIG5vIGxvbmdlcgogIHRha2VzIHRoZSBkYXRhIG9uIHN0ZGluIGFzIGJlZm9yZS4KClZlcnNpb24gNy4xMC4zLXByZTUgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gRml4ZWQgdGVzdHMvbWVtYW5hbHl6ZS5wbCB0byB3b3JrIHdpdGggZmlsZSBuYW1lcyB0aGF0IGNvbnRhaW4gY29sb25zIChhcyBvbgogIFdpbmRvd3MpLgoKLSBLamV0aWwgSmFjb2JzZW4gcXVpY2tseSBwb2ludGVkIG91dCB0aGF0IGxpYi9zaGFyZS5oIHdhcyBtaXNzaW5nLi4uCgpWZXJzaW9uIDcuMTAuMy1wcmU0ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIFVwZGF0ZWQgbGliL3NoYXJlLmMgcXVpdGUgYSBiaXQgdG8gbWF0Y2ggdGhlIGRlc2lnbiBkb2N1bWVudCBhdAogIGh0dHA6Ly9jdXJsLmhheHguc2UvZGV2L3NoYXJpbmcudHh0IGEgbG90IG1vcmUuCgogIEknbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgc29vbmlzaC4gc2hhcmUuYyBpcyBzdGlsbCBub3QgYWN0dWFsbHkgdXNlZAogIGJ5IGxpYmN1cmwsIGJ1dCB0aGUgQVBJIGlzIHNsb3dseSBnZXR0aW5nIHRoZXJlIGFuZCB3ZSBjYW4gc3RhcnQKICBpbXBsZW1lbnRpbmcgY29kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIHN5c3RlbS4KCkRhbmllbCAoOCBKYW4gMjAwMykKLSBVcGRhdGVkIHNoYXJlIHN0dWZmIGluIGN1cmwvY3VybC5oLCBpbmNsdWRpbmcgZGF0YSB0eXBlcywgc3RydWN0cyBhbmQKICBmdW5jdGlvbiBwcm90b3R5cGVzLiBUaGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiBsaWIvIHdlcmUgYWxzbyBtb2RpZmllZAogIG9mIGNvdXJzZSB0byByZW1haW4gY29tcGlsYWJsZS4gQmFzZWQgb24gaW5wdXQgZnJvbSBKZWFuLVBoaWxpcHBlIGFuZCBhbHNvCiAgdG8gbWFrZSBpdCBtb3JlIGluIGxpbmUgd2l0aCB0aGUgZGVzaWduIGRvY3VtZW50LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHBhdGNoZWQgYSB2ZXJ5IHRyaXZpYWwgbWVtb3J5IGxlYWsgaW4KICBjdXJsX2VzY2FwZSgpIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gcmVhbGxvYygpIHJldHVybnMgTlVMTC4uLgoKLSBNYXR0aGV3IEJsYWluIHByb3ZpZGVkIGZlZWRiYWNrIHRvIG1ha2UgdGhlIC0tY3JlYXRlLWRpcnMgc3R1ZmYgYnVpbGQKICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gdGVzdHMvbGlidGVzdC9maXJzdC5jIGFzIExlZ29mZiBWaW5jZW50IHBvaW50ZWQgb3V0LgoKRGFuaWVsICg3IEphbiAyMDAzKQotIFBoaWxpcHBlIFJhb3VsdCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgcHJvcGVybHkgc3VwcG9ydAogIHdpbGRjYXJkIGNoZWNrcyBmb3IgY2VydGlmaWNhdGUgbmFtZXMuCgotIFNpbW9uIExpdSBhZGRlZCBDVVJMT1BUX0hUVFAyMDBBTElBU0VTLCB0byBsZXQgYW4gYXBwbGljYXRpb24gc2V0IG90aGVyCiAgc3RyaW5ncyByZWNvZ25pemVkIGFzICJIVFRQIDIwMCIgdG8gYWxsb3cgaHR0cC1saWtlIHByb3RvY29scyB0byBnZXQKICBkb3dubG9hZGVkIGZpbmUgYnkgY3VybC4KCi0gTm93IHVzaW5nIGF1dG9jb25mIDIuNTcgYW5kIGF1dG9tYWtlIDEuNy4yCgotIERvaW5nICJjdXJsIC1JIGZ0cDovL2RvbWFpbi9ub24tZXhpc3RpbmctZmlsZSIgc3RpbGwgb3V0cHV0ZWQgYSBkYXRlIQogIFdheW5lIEhhaWdoIHJlcG9ydGVkLgoKLSBUaGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgd3JpdHRlbiBwcm9wZXJseSB3aXRoIGEgbmV3bGluZSBpbiB0aGUgLS10cmFjZQogIGZpbGUuCgpEYW5pZWwgKDYgSmFuIDIwMDMpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgcG9zc2libGUgYnVnOiBwcmV2aW91c2x5LCBpZiB5b3UgY2FsbGVkCiAgY3VybF9lYXN5X3BlcmZvcm0gYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgZG5zIGNhY2hlLCB0aGUgZ2xvYmFsIGNhY2hlCiAgd291bGRuJ3QgYmUgdXNlZC4gUG9pbnRlZCBvdXQgYnkgSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZS4KCi0gTWF0dGhldyBCbGFpbidzIGZpeGVkIHRoZSBWQzYgbGliY3VybCBtYWtlZmlsZSB0byBpbmNsdWRlIGJldHRlciBkZWJ1ZyBkYXRhCiAgb24gZGVidWcgYnVpbGRzLgpEYW5pZWwgKDI3IERlYyAyMDAyKQotIFBoaWxpcHBlIFJhb3VsdCByZXBvcnRlZCBhIGJ1ZyB3aXRoIEhUVFBTIGNvbm5lY3Rpb25zIHdoaWNoIEkgZXZpZGVudGx5CiAgYWRkZWQgaW4gbXkgMTkgZGVjIGZpeC4gSSBjb3JyZWN0ZWQgaXQuCgpEYW5pZWwgKDIwIERlYykKLSBJZGVhIGZyb20gdGhlIERlYmlhbiBsYXRlc3QgcGF0Y2g6IHVzZSBBTV9NQUlOVEFJTkVSX01PREUgaW4gdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBtYWtlIHRoZSBkZWZhdWx0IG1ha2VmaWxlIGxlc3MgY29uZnVzaW5nICJ0byB0aGUgY2FzdWFsCiAgaW5zdGFsbGVyIi4KClZlcnNpb24gNy4xMC4zLXByZTMgKDIwIERlYykKCkRhbmllbCAoMTkgRGVjKQotIE1hdHRoZXcgQmxhaW4gcGF0Y2hlZCB0aGUgQ3VybF9iYXNlNjRfZGVjb2RlKCkgZnVuY3Rpb24uCgotIEV2YW4gSm9yZGFuIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzY1MzAyMiB0aGF0IHRoZSBTU0xfcmVhZCgpIHVzYWdlIHdhcwogIHdyb25nLCBhbmQgaXQgY2VydGFpbmx5IHdhcy4gSXQgY291bGQgbGVhZCB0byBjdXJsIHVzaW5nIHRvbyBtdWNoIENQVSBkdWUgdG8KICBhIHN0dXBpZCBsb29wLgoKRGFuaWVsICgxOCBEZWMpCi0gQXMgc3VnZ2VzdGVkIGJ5IE1hcmd1cyBGcmV1ZGVudGhhbCwgQ1VSTEVfSFRUUF9OT1RfRk9VTkQgd2FzIHJlbmFtZWQgdG8KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIHNpbmNlIGl0IGlzIHJldHVybmVkIG9uIGFueSA+PSA0MDAgY29kZSB3aGVuCiAgQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBzZXQuCgpEYW5pZWwgKDE3IERlYykKLSBCdWcgcmVwb3J0ZWQgIzY1MTQ2NCwgcmVwb3J0ZWQgYnkgQ2hyaXN0b3BoZXIgUGFsbWVyLCBwcm92aWRlZCBhbiBleGFtcGxlCiAgc291cmNlIGNvZGUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0aGF0IGhhbmcgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBhCiAgcHJveHkgb24gYSBsb2NhbGhvc3QgcG9ydCB3aGVyZSBubyBwcm94eSB3YXMgbGlzdGVuaW5nLiBUaGlzIGJ1ZyB3YXMgbm90CiAgcmVwZWF0YWJsZSBvbiBsaWJjdXJscyB0aGF0IHdlcmUgSVB2Ni1lbmFibGVkLgoKRGFuaWVsICgxNiBEZWMpCi0gQ2hyaXN0b3BoZXIgUGFsbWVyIGFsc28gbm90aWNlZCB3aGF0IFZvanRlY2ggSmFub3RhIGFscmVhZHkgd2FzCiAgZXhwZXJpZW5jaW5nOiBUaGUgYXR0ZW1wdGVkIG5hbWUgcmVzb2x2ZSBmaXggZm9yIGdsaWJjIDIuMi45MyBjYXVzZWQgbGliY3VybAogIHRvIGNyYXNoIHdoZW4gdXNlZCBvbiBzb21lIG9sZGVyIGdsaWJjIHZlcnNpb25zLiBUaGUgcHJvYmxlbSBpcyBvZiBjb3Vyc2UKICB0aGUgc2lsbGluZXNzIG9mIHRoZSAyLjIuOTMuIEkgY29tbWl0dGVkIGEgZml4IHRoYXQgaG9wZWZ1bGx5IHNob3VsZCBtYWtlCiAgdGhlIGJpbmFyeSBydW4gZmluZSBvbiBlaXRoZXIgb25lIG9mIHRoZSB2ZXJzaW9ucywgZXZlbiB0aG91Z2ggdGhlIHNvbHV0aW9uCiAgaXMgbm90IGFzIG5pY2UgYXMgSSdkIGxpa2UgaXQgdG8gYmUuCgpEYW5pZWwgKDEzIERlYykKLSBCdWcgcmVwb3J0ICM2NTE0NjAgYnkgQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHNob3dlZCB0aGF0IHdoZW4gdXNpbmcgbGliY3VybAogIHRvIGZvciBleGFtcGxlIGdvIG92ZXIgYSBwcm94eSBvbiBsb2NhbGhvc3QsIGl0IHdvdWxkIGF0dGVtcHQgdG8gY29ubmVjdAogIHRocm91Z2ggdGhlIHByb3h5IFRXSUNFLgoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MDMgd2l0aCB3aGljaCBJIG1hbmFnZWQgdG8gcmVwZWF0IHRoaXMgcHJvYmxlbSBhbmQgSQogIGZpeGVkIHRoZSBjb2RlIHRvIG5vdCByZS1hdHRlbXB0IGFueSBjb25uZWN0cyAod2hpY2ggYWxzbyBtYWRlIGl0IGEgbmljZXIKICBmaXggZm9yIHRoZSAjNjUwOTQxIGJ1ZyBtZW50aW9uZWQgYmVsb3cpLgoKICBUaGUgc3dzIHNlcnZlciB3YXMgZXh0ZW5kZWQgdG8gZGVhbCB3aXRoIENPTk5FQ1QgaW4gb3JkZXIgdG8gbWFrZSB0ZXN0CiAgY2FzZSA1MDMgZG8gZ29vZC4KCi0gRXZhbiBKb3JkYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzY1MDk4OSBhYm91dCBhIG1lbW9yeSBsZWFrIGluIHRoZSBwdWJsaWMga2V5CiAgcmV0cmlldmluZyBjb2RlLiBIZSBwcm92aWRlZCBhIHN1Z2dlc3RlZCBmaXggYW5kIEkgbWVyZWx5IGFwcGxpZWQgaXQhCgotIEJ1ZyByZXBvcnQgIzY1MDk0MSwgcG9zdGVkIGJ5IENocmlzdG9waGVyIFIuIFBhbG1lciBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgZ2V0dGluZyBmaWxlOi8vIFVSTHMuIFRoaXMgd2FzIG5vdyBmaXhlZCBhbmQKICB0ZXN0IGNhc2UgNTAyIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTIgRGVjKQotIFRlc3QgY2FzZSA1MDAgYW5kIDUwMSBhcmUgdGhlIGZpcnN0IGV2ZXIgbGliY3VybCB0ZXN0IGNhc2VzIHRoYXQgcnVuLgoKLSBNYWRlICJjb25maWd1cmUgLS1lbmFibGUtZGVidWciIGN1dCBvZmYgYWxsIC1PKiBvcHRpb25zIHRvIHRoZSBjb21waWxlcgoKLSBGaW5hbGx5IGZpeGVkIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlciBzbyB0aGF0IHRlc3QgY2FzZSA0MDIgZG9lc24ndAogIGNhdXNlIHRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlIHRvIGZhaWwgYW55bW9yZSEKCkRhbmllbCAoMTEgRGVjKQotIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgbm93IGRlY3JlYXNlZCB0byAxNktCIHNpbmNlIGl0IG1ha2VzIHRoZSBXaW5kb3dzCiAgdmVyc2lvbiBwZXJmb3JtIHVwbG9hZHMgbXVjaCBmYXN0ZXIhISEgUkJyYW1hbnRlIGRpZCBsb3RzIG9mIHJlc2VhcmNoIG9uCiAgdGhpcyB0b3BpYy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIGN1cmwvY3VybC5oIHRvIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIG91dHNpZGUgdGhlCiAgZXh0ZXJuICJDIiBzY29wZS4KCkRhbmllbCAoMTAgRGVjKQotIE1vdmVkIGFyb3VuZCBhbmQgYWRkZWQgbW9yZSBsb2dpYzoKCiAgRmlyc3QsIFBPU1QgZGF0YSBpcyBuZXZlciBzZW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QgaGVhZGVycyBpbiB0aGUgaHR0cC5jCiAgY29kZS4gSXQgaXMgYWx3YXlzIHNlbnQgdGhlICJub3JtYWwiIHJlYWQgY2FsbGJhY2sgdGhlbiBzZW5kKCkgd2F5LiBUaGlzIG5vdwogIGVuYWJsZXMgYSBwbGFpbiBIVFRQIFBPU1QgdG8gYmUgc2VudCBjaHVua2VkIGlmIHdlIHdhbnQgdG8uIFRoaXMgYWxzbwogIHJlZHVjZXMgdGhlIHJpc2sgb2YgaGF2aW5nIHZlcnkgYmlnIFBPU1RzIGNhdXNpbmcgcHJvYmxlbXMuCgogIEZ1cnRoZXIsIHNlbmRpbmcgb2ZmIHRoZSBpbml0aWFsIEhUVFAgcmVxdWVzdCBpcyBub3QgZG9uZSB1c2luZyBhIGxvb3AKICBhbnltb3JlLiBJZiBpdCB3YXNuJ3QgYWxsIHNlbnQgb2ZmIGluIHRoZSBmaXJzdCBzZW5kKCksIHRoZSByZXN0IG9mIHRoZQogIHJlcXVlc3QgaXMgc2VudCBvZmYgaW4gdGhlIG5vcm1hbCB0cmFuc2ZlciBzZWxlY3QoKSBsb29wLiBUaGlzIG1ha2VzIHNldmVyYWwKICB0aGluZ3MgcG9zc2libGUsIGJ1dCBtYWlubHkgaXQgbWFrZXMgbGliY3VybCBibG9jayBsZXNzIHdoZW4gdXNlZCBmcm9tIHRoZQogIG11bHRpIGludGVyZmFjZSBhbmQgaXQgYWxzbyByZWR1Y2VzIHRoZSByaXNrIG9mIHByb2JsZW1zIHdpdGggaXNzdWluZyB2ZXJ5CiAgbGFyZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDkgRGVjKQotIE1vdmVkIHRoZSByZWFkIGNhbGxiYWNrIHBvaW50ZXIgYW5kIGRhdGEgd2l0aGluIHRoZSBzdHJ1Y3RzIHRvIGEgbW9yZQogIHN1aXRhYmxlIHBsYWNlLiBUaGlzIGluIHByZXBhcmF0aW9uIGZvciBhIGJldHRlciBIVFRQLXJlcXVlc3Qgc2VuZGluZyBjb2RlCiAgd2l0aG91dCAoYSBzaWxseSkgbG9vcC4KCi0gVGhlIERvZGRzIGZpeCBzZWVtcyBub3QgdG8gd29yay4KCi0gVm9qdGVjaCBKYW5vdGEgdGVzdHMgcHJvdmVkIHRoYXQgdGhlIHJlc29sdmUgZml4IGZyb20gb2N0IDIxc3QgaXMgbm90IGdvb2QKICBlbm91Z2ggc2luY2Ugb2J2aW91c2x5IG9sZGVyIGdsaWJjcyBtaWdodCByZXR1cm4gRUFHQUlOIHdpdGhvdXQgdGhpcyBtZWFuaW5nCiAgdGhhdCB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCgotIFt0aGUgb3RoZXIgZGF5XSBNYWRlIGxpYmN1cmwgbG9vcCBvbiByZWN2KCkgYW5kIHNlbmQoKSBub3cgdW50aWwgZG9uZSwgYW5kCiAgdGhlbiBnZXQgYmFjayB0byBzZWxlY3QoKS4gUHJldmlvdXNseSBpdCB3ZW50IGJhY2sgdG8gc2VsZWN0KCkgbW9yZSBvZnRlbgogIHdoaWNoIHJlYWxseSB3YXMgYSBzbGlnaHQgb3ZlcmhlYWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgcmVwb3J0ZWQgcGVyZm9ybWFuY2UKICBwcm9ibGVtcyBvbiBIVFRQIFBVVCBvbiBXaW5kb3dzLiBJIGNvdWxkbid0IHNlZSBhbnkgbm90YWJsZSBkaWZmZXJlbmNlIG9uCiAgTGludXguLi4KClZlcnNpb24gNy4xMC4zLXByZTIgKDQgRGVjIDIwMDIpCgpEYW5pZWwgKDQgRGVjIDIwMDIpCi0gTG90cyBvZiB3b3JrIHdpdGggTWFsY29sbSBEb2RkcyBtYWRlIG1lIGFkZCBhIHRlbXBvcmFyeSBjb2RlIGZpeCB0aGF0IG5vdwogIHNob3J0ZW5zIHRoZSB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSAyMjYgb3IgMjUwIGxpbmUgYWZ0ZXIgYSBjb21wbGV0ZWQKICBGVFAgdHJhbnNmZXIuCgogIElmIG5vIGRhdGEgaXMgcmVjZWl2ZWQgd2l0aGluIDYwIHNlY29uZHMsIHRoaXMgaXMgdGFrZW4gYXMgYSBzaWduIG9mIGEgZGVhZAogIGNvbnRyb2wgY29ubmVjdGlvbiBhbmQgd2UgYmFpbCBvdXQuCgpEYW5pZWwgKDMgRGVjIDIwMDIpCi0gUmFscGgncyBidWcgcmVwb3J0ICM2NDQ4NDEgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gd2hpY2ggY3VybCByZXR1cm5lZCBhCiAgdGltZW91dCBlcnJvciBjb2RlIHdoZW4gaW4gZmFjdCB0aGUgcHJvYmxlbSB3YXMgbm90IGEgdGltZW91dC4gVGhlIHByb3BlcgogIGVycm9yIHNob3VsZCBub3cgYmUgcHJvcGFnYXRlZCBiZXR0ZXIgd2hlbiB0aGV5J3JlIGRldGVjdGVkIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uLgoKLSBVcGRhdGVkIHRoZSBCb3JsYW5kIE1ha2VmaWxlcy4KCkRhbmllbCAoMiBEZWMgMjAwMikKLSBOaWNvbGFzIEJlcmxvcXVpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCAtLWNyZWF0ZS1kaXJzIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sLiBXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAtbywgaXQgbGV0cyBjdXJsIGNyZWF0ZQogIFtub24tZXhpc3RpbmddIGRpcmVjdG9yaWVzIHVzZWQgaW4gLW8sIHN1aXRhYmx5IHVzZWQgd2l0aCAjLWNvbWJpbmF0aW9ucwogIHN1Y2ggYXM6CgogICAgIGN1cmwgInd3dy5pbWFnZXMuY29tL3tmbG93ZXJzLGNpdGllcyxwYXJrcyxtb3VudGFpbnN9L3BpY19bMS0xMDBdLmpwZyBcCiAgICAgICAtbyAiZGlyXyMxL3BpYyMyLmpwZyIgLS1jcmVhdGUtZGlycwoKVmVyc2lvbiA3LjEwLjMtcHJlMQoKRGFuaWVsICgyOCBOb3YgMjAwMikKLSBJIHZpc2l0ZWQgTGFycyBOb3JkZ3JlbiBhbmQgaGFkIGEgZ28gd2l0aCBoaXMgcHJvYmxlbSwgd2hpY2ggbGVhZCBtZSB0bwogIGltcGxlbWVudCB0aGlzIGZpeC4gSWYgbGliY3VybCBkZXRlY3RzIHRoZSBhZGRlZCBjdXN0b20gaGVhZGVyCiAgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiwgaXQgd2lsbCBub3cgZW5hYmxlIGEgY2h1bmtlZCB0cmFuc2Zlci4KCiAgQWxzbywgY2h1bmtlZCB0cmFuc2ZlciBkaWRuJ3QgcXVpdGUgd29yayBiZWZvcmUgYnV0IHNlZW1zIHRvIGRvIHNvIG5vdy4KCi0gS2pldGlsIEphY29ic2VuIHBvaW50ZWQgb3V0IHRoYXQgLi9jb25maWd1cmUgLS1kaXNhYmxlLWlwdjYgLS13aXRob3V0LXpsaWIKICBkaWRuJ3Qgd29yayBvbiBhbnkgcGxhdGZvcm0uLi4KCkRhbmllbCAoMjYgTm92IDIwMDIpCi0gRml4ZWQgYSBiYWQgYWRkcmluZm8gZnJlZSBpbiB0aGUgaG9zdGlwLmMgY29kZSwgaGFyZGx5IGV4cG9zZWQgYW55d2hlcmUKCi0gRGFuIEJlY2tlciBmb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiBwZXJzaXN0ZW50IGNvbm5uZWN0aW9ucwogIHVzaW5nIENVUkxPUFRfVVNFUlBXRC4KCkRhbmllbCAoMjIgTm92IDIwMDIpCi0gQmFzZWQgb24gUmFscGggTWl0Y2hlbGwncyBleGNlbGxlbnQgYW5hbHlzaXMgSSBmb3VuZCBhIGJ1ZyBpbiB0aGUgdGVzdCBzdWl0ZQogIHdlYiBzZXJ2ZXIgKHN3cykgd2hpY2ggbm93IGxldHMgdGVzdCBjYXNlIDMwNiBydW4gZmluZSBldmVuIGluIGNvbWJpbmF0aW9uCiAgd2l0aCB0aGUgb3RoZXIgdGVzdCBjYXNlcy4KCi0gSnVhbiBJZ25hY2lvIEhlcnbhcyBmb3VuZCBhIGNyYXNoIGluIHRoZSB2ZXJib3NlIGNvbm5lY3QgbWVzc2FnZSB0aGF0IGlzCiAgdXNlZCBvbiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBUaGlzIGJ1ZyB3YXMgYWRkZWQgaW4gNy4xMC4yIGR1ZSB0byB0aGUKICByZWFycmFuZ2VkIG5hbWUgcmVzb2x2ZSBjb2RlLgoKRGFuaWVsICgyMCBOb3YgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXM6CgogICBDVVJMT1BUX1BSSVZBVEUgc3RvcmVzIGEgcHJpdmF0ZSBwb2ludGVyIGluIHRoZSBjdXJsIGhhbmRsZS4KCiAgIENVUkxJTkZPX1BSSVZBVEUgcmV0cmlldmVzIHRoZSBwcml2YXRlIHBvaW50ZXIgZnJvbSB0aGUgY3VybCBoYW5kbGUuCgotIEthcm9sIFBpZXRyemFrIHBvaW50ZWQgb3V0IGhvdyBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaWRuJ3Qgb3V0cHV0IGEgZ29vZAogIGluY2x1ZGUgZGlyIHNvIEkndmUgcmVtb3ZlZCB0aGF0IGZvciBub3cuCgpWZXJzaW9uIDcuMTAuMiAoMTggTm92IDIwMDIpCgpEYW5pZWwgKDExIE5vdiAyMDAyKQotIERhdmUgSGFsYmFra2VuIGFkZGVkIGN1cmxfdmVyc2lvbl9pbmZvIHRvIGxpYi9saWJjdXJsLmRlZiB0byBtYWtlIGxpYmN1cmwKICBwcm9wZXJseSBidWlsZCB3aXRoIE1TVkMgb24gV2luZG93cy4KCkRhbmllbCAoOCBOb3YgMjAwMikKLSBEb2luZyBIVFRQIFBVVCB3aXRob3V0IGEgc3BlY2lmaWVkIGZpbGUgc2l6ZSBub3cgbWFrZXMgbGliY3VybCB1c2UKICBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZC4KCkRhbmllbCAoNyBOb3YgMjAwMikKLSBCdWcgcmVwb3J0ICM2MzQ2MjUgaWRlbnRpZmllZCBob3cgY3VybCByZXR1cm5lZCB0aW1lb3V0IGltbWVkaWF0ZWx5IHdoZW4KICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIHdhcyB1c2VkIGFuZCBwcm92aWRlZCBhIGZpeC4KClZlcnNpb24gNy4xMC4yLXByZTQgKDYgTm92IDIwMDIpCgpEYW5pZWwgKDUgTm92IDIwMDIpCi0gTGVoZWwgQmVybmFkdCBmb3VuZCBvdXQgYW5kIGZpeGVkLiBsaWJjdXJsIHNlbnQgZXJyb3IgbWVzc2FnZSB0byB0aGUgZGVidWcKICBvdXRwdXQgd2hlbiBpdCBzdG9yZWQgdGhlIGVycm9yIG1lc3NhZ2UuCgotIEF2ZXJ5IEZheSBmb3VuZCBzb21lIHByb2JsZW1zIHdpdGggdGhlIEROUyBjYWNoZSAod2hlbiB0aGUgY2FjaGUgdGltZSB3YXMKICBzZXQgdG8gMCB3ZSBnb3QgYSBtZW1vcnkgbGVhaywgYnV0IHdoZW4gdGhlIGxlYWsgd2FzIGZpeGVkIGhlIGdvdCBhIGNyYXNoCiAgd2hlbiBoZSB1c2VkIHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3aXRoIHRoYXQpIHRoYXQgaGFkIG1lIGRvIHNvbWUgcmVhbAogIHJlc3RydWN0dXJpbmcgc28gdGhhdCB3ZSBub3cgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBkbnMgY2FjaGUKICBlbnRyaWVzIHRvIHByZXZlbnQgYW4gZW50cnkgdG8gZ2V0IGZsdXNoZWQgd2hpbGUgc3RpbGwgYWN0dWFsbHkgaW4gdXNlLgoKICBJIGFsc28gZGV0ZWN0ZWQgdGhhdCB3ZSBwcmV2aW91c2x5IGRpZG4ndCB1cGRhdGUgdGhlIHRpbWUgc3RhbXAgd2hlbiB3ZQogIGV4dHJhY3RlZCBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZSBzbyB0aGF0IG11c3QndmUgYmVlbiBhIHJlYXNvbiBmb3Igc29tZQogIHZlcnkgd2VpcmQgZG5zIGNhY2hlIGJ1Z3MuCgpWZXJzaW9uIDcuMTAuMi1wcmUzCgpEYW5pZWwgKDMxIE9jdCAyMDAyKQotIERvd25ncmFkZWQgYXV0b21ha2UgdG8gMS42LjMgaW4gYW4gYXR0ZW1wdCB0byBmaXggY3lnd2luIHByb2JsZW1zLiAoSXQKICB0dXJuZWQgb3V0IHRoaXMgZGlkbid0IGhlbHAgdGhvdWdoLikKCi0gRGlzYWJsZSB0aGUgRE5TIGNhY2hlIChieSBzZXR0aW5nIHRoZSB0aW1lb3V0IHRvIDApIG1hZGUgbGliY3VybCBsZWFrCiAgbWVtb3J5LiBBdmVyeSBGYXkgYnJvdWdodCB0aGUgZXhhbXBsZSBjb2RlIHRoYXQgcHJvdmVkIHRoaXMuCgpWZXJzaW9uIDcuMTAuMi1wcmUyCgpEYW5pZWwgKDI4IE9jdCAyMDAyKQotIFVwZ3JhZGVkIHRvIGF1dG9jb25mIDIuNTQgYW5kIGF1dG9tYWtlIDEuNyBvbiB0aGUgcmVsZWFzZS1idWlsZCBob3N0LgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGNvbW1hbmQgbGluZSB0b29sIGNoZWNrIGZvciBhIENVUkxfQ0FfQlVORExFIGVudmlyb25tZW50CiAgdmFyaWFibGUgKGlmIC0tY2FjZXJ0IGlzbid0IHVzZWQpIGFuZCBpZiBub3Qgc2V0LCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwKICBjaGVjayBmb3IgYSBmaWxlIG5hbWVkICJjdXJsLWNhLWJ1bmRsZS5jcnQiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvciB0aGUKICBkaXJlY3Rvcnkgd2hlcmUgY3VybCBpcyBsb2NhdGVkLiBUaGF0IGZpbGUgaXMgdGhlbiB1c2VkIGFzIENBIHJvb3QgY2VydAogIGJ1bmRsZS4KCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBzY3JpcCBkaWRuJ3QgZ2V0IHJpZ2h0IGlmIHlvdQogIHVzZWQgYXV0b2NvbmYgbmV3ZXIgdGhhbiAyLjUyLiBUaGlzIHdhcyBkdWUgdG8gc29tZSBiYWRseSBxdW90ZWQgY29kZS4KClZlcnNpb24gNy4xMC4yLXByZTEKCkRhbmllbCAoMjMgT2N0IDIwMDIpCi0gRW1pbGlhbm8gSWRhIGNvbmZpcm1lZCB0aGF0IHdlIG5vdyBidWlsZCBwcm9wZXJseSB3aXRoIHRoZSBCb3JsYW5kIEMrKwogIGNvbXBpbGVyIHRvby4gV2UgbmVlZGVkIHlldCBhbm90aGVyIGZpeCBmb3IgdGhlIElTTyBjcHAgY2hlY2sgaW4gdGhlIGN1cmwuaAogIGhlYWRlciBmaWxlLgoKLSBZZXQgYW5vdGhlciBmaXggd2FzIG5lZWRlZCB0byBnZXQgdGhlIEhUVFAgZG93bmxvYWQgd2l0aG91dCBoZWFkZXJzIHRvIHdvcmsuCiAgVGhpcyB0aW1lIGl0IHdhcyBuZWVkZWQgaWYgdGhlIGZpcnN0ICJiZWxpZXZlZCBoZWFkZXIiIHdhcyByZWFkIGFsbCBpbiB0aGUKICBmaXJzdCByZWFkLiBUZXN0IDMwNiBoYXMgbm90IHJ1biBwcm9wZXJseSBzaW5jZSB0aGUgMTF0aCBvY3RvYmVyIGZpeC4KCkRhbmllbCAoMjEgT2N0IDIwMDIpCi0gWnZpIEhhcidFbCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsJ3MgbmFtZSByZXNvbHZpbmcgb24gUmVkaGF0IDgKICBtYWNoaW5lcyAocnVubmluZyBJUHY2IGRpc2FibGVkKS4gTWF0cyBMaWRlbGwgbGV0IG1lIHVzZSBhbiBhY2NvdW50IG9uIGhpcwogIG1hY2hpbmUgYW5kIEkgY291bGQgdmVyaWZ5IHRoYXQgZ2V0aG9zdGJ5bmFtZV9yKCkgaGFzIGJlZW4gY2hhbmdlZCB0byByZXR1cm4KICBFQUdBSU4gaW5zdGVhZCBvZiBFUkFOR0Ugd2hlbiB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsLiBUaGlzIGlzCiAgZ2xpYmMgMi4yLjkzLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgZ2V0IHRoZSAtbm8tdW5kZWZpbmVkIG9wdGlvbiBjb3JyZWN0ZWQgaW4KICBsaWIvTWFrZWZpbGUuYW0gc2luY2UgQ3lnd2luIGJ1aWxkcyB3YW50IGl0IHRoZXJlIHdoaWxlIFNvbGFyaXMgYnVpbGRzIGRvbid0CiAgd2FudCBpdCBwcmVzZW50LiBLZXZpbiBSb3RoIGhlbHBlZCBtZSB0cnkgaXQgb3V0IG9uIGN5Z3dpbi4KCi0gTmlraXRhIFNjaG1pZHQgcHJvdmlkZWQgYSBidWcgZml4IGZvciBhIEZPTExPV0xPQ0FUSU9OIGJ1ZyBpbnRyb2R1Y2VkIHdoZW4KICB0aGUgLi4vIHN1cHBvcnQgZ290IGluICg3LjEwLjEpLgoKRGFuaWVsICgxOCBPY3QgMjAwMikKLSBGYWJyaXppbyBBbW1vbGxvIHBvaW50ZWQgb3V0IGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBGT0xMT1dMT0NBVElPTiBpbgogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgKDE3IE9jdCAyMDAyKQotIFJpY2hhcmQgQ29vcGVyJ3MgZXhwZXJpbWVudGluZyBwcm92ZWQgdGhhdCAtaiAoQ1VSTE9QVF9DT09LSUVTRVNTSU9OKSBkaWRuJ3QKICB3b3JrIHF1aXRlIGFzIHN1cHBvc2VkLiBZb3UgbmVlZGVkIHRvIHNldCBpdCAqYmVmb3JlKiB5b3UgdXNlCiAgQ1VSTE9QVF9DT09LSUVGSUxFLCBhbmQgd2UgZG9udCcgd2FudCB0aGF0IGtpbmQgb2YgZGVwZW5kZW5jaWVzLgoKRGFuaWVsICgxNSBPY3QgMjAwMikKLSBBbmRy6XMgR2FyY+1hIHByb3ZpZGVkIGNvcnJlY3Rpb25zIGZvciBlcnJhdGFzIGluIGZvdXIgbGliY3VybCBtYW4gcGFnZXMuCgpEYW5pZWwgKDEzIE9jdCAyMDAyKQotIFN0YXJ0aW5nIG5vdywgd2UgZ2VuZXJhdGUgYW5kIGluY2x1ZGUgUERGIHZlcnNpb25zIG9mIGFsbCB0aGUgZG9jcyBpbiB0aGUKICByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgxMiBPY3QgMjAwMikKLSBUcnlpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgb24gYSBiYWQgcG9ydCBudW1iZXIgY2F1c2VkIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB0byBuZXZlciByZXR1cm4gZmFpbHVyZSBhbmQgaXQgYXBwZWFyZWQgdG8ga2VlcCBvbiB0cnlpbmcgZm9yZXZlciAoaXQganVzdAogIGRpZG4ndCBkbyBhbnl0aGluZykuCgpEYW5pZWwgKDExIE9jdCAyMDAyKQotIERvd25sb2FkaW5nIEhUVFAgd2l0aG91dCBoZWFkZXJzIGRpZG4ndCB3b3JrIDEwMCUsIHNvbWUgb2YgdGhlIGluaXRpYWwgZGF0YQogIGdvdCB3cml0dGVuIHR3aWNlLiBLZXZpbiBSb3RoIHJlcG9ydGVkLgoKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGUgImNvbmZpZyBmaWxlIiBwYXJzZXIgaW4gdGhlIGNsaWVudCBjb2RlIGNvdWxkCiAgc2VnZmF1bHQsIGxpa2UgaWYgRE9TIG5ld2xpbmVzIHdlcmUgdXNlZC4KClZlcnNpb24gNy4xMC4xICgxMSBPY3QgMjAwMikKCkRhbmllbCAoMTAgT2N0IDIwMDIpCi0gSmVmZiBMYXdzb24gZml4ZWQgYSBmZXcgcHJvYmxlbXMgd2l0aCBjb25uZWN0aW9uIHJlLXVzZSB0aGF0IHJlbWFpbmVkIHdoZW4KICB5b3Ugc2V0IENVUkxPUFRfUFJPWFkgdG8gIiIuCgpEYW5pZWwgKDkgT2N0IDIwMDIpCi0gQ3JhaWcgRGF2aXNvbiBmb3VuZCBhIHRlcnJpYmxlIGZsYXcgYW5kIENyaXMgQmFpbGlmZiBoZWxwZWQgb3V0IGluIHRoZQogIHNlYXJjaC4gR2V0dGluZyBIVFRQIGRhdGEgZnJvbSBzZXJ2ZXJzIHdoZW4gdGhlIGhlYWRlcnMgYXJlIHNwbGl0IHVwIGluCiAgbXVsdGlwbGUgcmVhZHMsIGNvdWxkIGNhdXNlIGp1bmsgZGF0YSB0byBnZXQgaW5zZXJ0ZWQgYW1vbmcgdGhlIHNhdmVkCiAgaGVhZGVycy4gVGhpcyBvbmx5IGNvbmNlcm5zIEhUVFAoUykgaGVhZGVycy4KCkRhbmllbCAoOCBPY3QgMjAwMikKLSBWaW5jZW50IFBlbnF1ZXJjJ2ggZ2F2ZSB1cyB0aGUgZ29vZCBzdWdnZXN0aW9uIHRoYXQgd2hlbiB0aGUgRVJSUk9SQlVGRkVSCiAgaXMgc2V0IGludGVybmFsbHksIHRoZSBlcnJvciB0ZXh0IGlzIHNlbnQgdG8gdGhlIGRlYnVnIGZ1bmN0aW9uIGFzIHdlbGwuCgotIEkgZml4ZWQgdGhlIHRlbG5ldCBjb2RlIHRvIHRpbWVvdXQgcHJvcGVybHkgYXMgdGhlIG9wdGlvbiB0ZWxscyBpdCB0by4gT24KICBub24td2luZG93cyBwbGF0Zm9ybXMuCgpEYW5pZWwgKDcgT2N0IDIwMDIpCi0gSm9obiBDcm93IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybC10aGUtZ3VpZGUgd2Fzbid0IGluY2x1ZGVkIGluIHRoZSByZWxlYXNlCiAgdGFyYmFsbCEKCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0aGF0IG1ha2UgaW5zdGFsbCBkaWRuJ3QgZG8gcmlnaHQgaWYgYnVpbGQgb3V0c2lkZQogIHRoZSBzb3VyY2UgdHJlZSAoY2EtYnVuZGxlIHdpc2UpLgoKLSBGT0xMT1dMT0NBVElPTiBidWdmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKCkRhbmllbCAoNCBPY3QgMjAwMikKLSBLZXZpbiBSb3RoIGdvdCBwcm9ibGVtcyB3aXRoIGhpcyBjeWd3aW4gYnVpbGQgd2l0aCAtbm8tdW5kZWZpbmVkIHdhcyBub3QKICBwcmVzZW50IGluIGxpYi9NYWtlZmlsZS5hbSBzbyBJIHB1dCBpdCBiYWNrIGluIHRoZXJlIGFnYWluLiBUaGUgcG9vciBvbmUgd2hvCiAgbmVlZHMgdG8gcmVtb3ZlIGl0IGFnYWluIG11c3Qgd3JpdGUgYSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCB0aGF0IG5lZWQuCgotIFJhbHBoIE1pdGNoZWxsIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgYSBiaXQgbmFpdmUgYW5kIGRpZG4ndCBkZWFsIHdpdGggLi8KICBvciAuLi8gc3R1ZmYgaW4gdGhlIHN0cmluZyBwYXNzZWQgYmFjayBpbiBhIExvY2F0aW9uOiBoZWFkZXIgd2hlbiBmb2xsb3dpbmcKICBsb2NhdGlvbnMuCgotIEFsYmVydCBDaGluIGhlbHBlZCBtZSB0byB3b3JrIG91dCBhIGJldHRlciBjb25maWd1cmUuaW4gY2hlY2sgZm9yIHpsaWIsIGFuZAogIGJvdGggLS13aXRob3V0LXpsaWIgYW5kIC13aXRoLXpsaWIgc2VlbSB0byB3b3JrIHJhdGhlciB3ZWxsIHJpZ2h0IG5vdy4KCi0gWnZpIEhhcidFbCBpbXByb3ZpZWQgdGhlIE9wZW5TU0wgRU5HSU5FIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvCiAgYmVjb21lIG1vcmUgYWNjdXJhdGUuCgpEYW5pZWwgKDEgT2N0IDIwMDIpCi0gRGV0bGVmIFNjaG1pZXIgcG9pbnRlZCBvdXQgdGhlIGxhY2sgb2YgYSAtLXdpdGhvdXQtbGlieiBvcHRpb24gdG8gY29uZmlndXJlLAogIHNvIEkgYWRkZWQgb25lLgoKVmVyc2lvbiA3LjEwICgxIE9jdCAyMDAyKQoKRGFuaWVsICgzMCBTZXAgMjAwMikKLSBNb2RpZmllZCB0aGUgY3VybF92ZXJzaW9uX2luZm8oKSBwcm90byBhbmQgcmV0dXJuZWQgc3RydWN0IG9uY2UgYWdhaW4sIGFuZAogIHVwZGF0ZWQgdGhlIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKLSBDcmlzIEJhaWxpZmYgZm91bmQgb3V0IHRoYXQgdGhlIHByZS1yZWxlYXNlcyBjcmFzaGVkIG9uIG5hbWUgbG9va3VwcyBvbgogIG5hbWVzIHN1Y2ggYXMgImE6IiBvciAiYmF6OiIgKG9uIExpbnV4IHZlcnNpb25zIG5vdCBiZWluZyBpcHY2LWVuYWJsZWQpIGR1ZQogIHRvIHNvbWUgd2VpcmQgcmV0dXJuIGNvZGVzIGZyb20gZ2V0aG9zdGJ5bmFtZV9yKCkuIEknbGwgYmxhbWUgdGhlIGNvbXBsZXRlCiAgbGFjayBvZiBkb2NzIGluIHRoYXQgZGVwYXJ0bWVudC4gQ3JpcyBwcm92aWRlZCBhIGZpeCwgd2hpY2ggSSBtb2RpZmllZCBvbmx5CiAgc2xpZ2h0bHkuCgpEYW5pZWwgKDI3IFNlcCAyMDAyKQotIEFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIENocmlzdGlhbiBLdXJ6IHRvIERlYmlhbiBjdXJsIHBhY2thZ2UgbWFpbnRhaW5lcgogIERvbWVuaWNvIEFuZHJlb2xpLCBJIG1hZGUgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHByb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGVzIGJldHRlci4gTm93LCBieSBzZXR0aW5nIC14ICIiIHlvdSBjYW4gZXhwbGljaXRseSB0ZWxsIGxpYmN1cmwgdG8KICBub3QgdXNlIGEgcHJveHksIG5vIG1hdHRlciB3aGFuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2F5LgoKVmVyc2lvbiA3LjEwLXByZTQKCkRhbmllbCAoMjYgU2VwIDIwMDIpCi0gRXh0ZW5kZWQgY3VybF92ZXJzaW9uX2luZm8oKSBtb3JlIGFuZCB3cm90ZSBhIG1hbiBwYWdlIGZvciBpdC4KCkRhbmllbCAoMjUgU2VwIDIwMDIpCi0gbGliY3VybCBjb3VsZCBsZWFrIG1lbW9yeSB3aGVuIGRvd25sb2FkaW5nIG11bHRpcGxlIGZpbGVzIHVzaW5nIGh0dHAgcmFuZ2VzLAogIHJlcG9ydGVkIGFuZCBmaXhlZCBieSBKZWFuLUx1YyBHdWV2ZWwuCgotIFdhbHRlciBKLiBNYWNrIHByb3ZpZGVkIGNvZGUgYW5kIGRvY3MgZm9yIHRoZSBuZXcgY3VybF9mcmVlKCkgZnVuY3Rpb24gdGhhdAogIHNoYWxsIGJlIHVzZWQgdG8gZnJlZSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgbGliY3VybCBhbmQgcmV0dXJuZWQgYmFjawogIHRvIHRoZSBhcHBsaWNhdGlvbiwgYXMgY3VybF9lc2NhcGUoKSBhbmQgY3VybF91bmVzY2FwZSgpIGRvLgoKLSBZYXJyYW0gU3VuaWwgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlcmUgYSBmYWlsZWQKICBjb25uZWN0aW9uIGRpZG4ndCBjbG9zZSBkb3duIHByb3Blcmx5IGFuZCB0aHVzIGEgc2Vjb25kIHRyYW5zZmVyIHVzaW5nIHRoZQogIHNhbWUgaGFuZGxlIGZhaWxlZC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIGZsYXcgdGhhdCBtYWRlIChhbW9uZyBvdGhlciB0aGluZ3MpIGRpY3QtZmV0Y2hlcwogIHJldHVybiBhIHJhbmRvbSB2YWx1ZS4KCkRhbmllbCAoMjQgU2VwIDIwMDIpCi0gV2V6IEZ1cmxvbmcgYnJvdWdodCBoaXMgaW5pdGlhbCBwYXRjaCB0aGF0IGludHJvZHVjZWQgY3VybF92ZXJzaW9uX2luZm8oKS4KICBXZSBtaWdodCBuZWVkIHRvIHR3ZWFrIGl0IHNvbWV3aGF0IGJlZm9yZSByZWxlYXNlLgoKRGFuaWVsICgyMCBTZXAgMjAwMikKLSBDcmFpZyBNYXJrd2FyZHQgZml4ZWQgYW5vdGhlciBUcnU2NCBJUCByZXNvbHZlIHByb2JsZW0uCgpEYW5pZWwgKDE5IFNlcCAyMDAyKQotIERvbGJuZWZmIEEuViBhbmQgU3Bpcmlkb25vZmYgQS5WIG1hZGUgdGhlIGZpbGU6Ly8gY29kZSB3b3JrIHdpdGggcmVzdW1lcwogIGluIHRoZSBzYW1lIHN0eWxlIG90aGVyIGNvZGUgZG9lcy4KCi0gSWxndWl6IExhdHlwb3YgZml4ZWQgYSBmbGF3IGluIHRoZSBjbGllbnQgY29kZSB3aGVuIGZldGNoaW5nIG11bHRpcGxlIFVSTHMKICBhbmQgLUMgLSB3YXMgdXNlZC4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgcG9zaXRpb24gd2FzIHRoZW4gYWNjaWRlbnRhbGx5CiAgcmV1c2VkIG9uIGFsbCB0aGUgb3RoZXIgZmlsZXMgdG9vLgoKRGFuaWVsICgxOCBTZXAgMjAwMikKLSBUaGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHdhcyBncmVhdGx5IG1vZGlmaWVkIGFuZCB0aGUgb3B0aW9ucyBoYXZlCiAgbm93IGJlZW4gZ3JvdXBlZCBpbiBsb2dpY2FsIGdyb3VwcyBzbyB0aGF0IGl0IHNob3VsZCBiZSBzb21ld2hhdCBlYXNpZXIgdG8KICByZWFkIGl0IGFuZCBmaW5kIHRoaW5ncyB5b3Ugc2VhcmNoIGZvci4KCkRhbmllbCAoMTMgU2VwIDIwMDIpCi0gS2V2aW4gUm90aCBwaW5wb2ludGVkIGEgc2NhcnkgZmxhdyBpbiBsaWJjdXJsLCB3aGVuIHRoZSBIVFRQIHNlcnZlciBkb2Vzbid0CiAgc2VuZCBhbnkgaGVhZGVycyBiYWNrLCBvbmx5IHJhdyBjb250ZW50LiBSaWdodCwgdGhhdCBpcyBhIHZpb2xhdGlvbiBvZiB0aGUKICBzdGFuZGFyZCBidXQgc3RpbGwgaGFwcGVucyBhdCB0aW1lcyBhbmQgd2UgbmVlZCB0byBkZWFsIHdpdGggaXQuIFRlc3QgY2FzZQogIDMwNiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2UgZG8gcmlnaHQgbm93LgoKVmVyc2lvbiA3LjEwLXByZTMKCkRhbmllbCAoMTEgU2VwIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSBmb3VuZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBzZW5kIGEgY29ycmVjdCBIVFRQIEhvc3Q6IGhlYWRlcgogIHdoZW4geW91IHNwZWNpZmllZCB0aGUgVVJMIHdpdGggYW4gSVB2NiBJUC1hZGRyZXNzLgoKRGFuaWVsICg0IFNlcCAyMDAyKQotIFN2ZW4gTmV1aGF1cyBtYWRlIC0tc2lsZW50IGJlaW5nIGFja25vd2xlZGdlZCBldmVuIHdoZW4gbXVsdGlwbGUgVVJMcwogIHdlcmUgdXNlZC4gSXQgdXNlZCB0byBvdXRwdXQgIlsxLzJdOiBodHRwOi8vaG9zdC9hLmh0bWwuZGUgLS0+IGEuaHRtbC5kIiBldGMKICBldmVuIHdoZW4gdG9sZCB0byBzaHV0IHVwLgoKRGFuaWVsICgzIFNlcCAyMDAyKQotIFVwZGF0ZWQgYWxsIHNvdXJjZSBjb2RlIGhlYWRlcnMgdG8gdXNlIE1JVC1saWNlbnNlIHJlZmVyZW5jZXMgb25seSwgYW5kCiAgcG9pbnQgdG8gdGhlIENPUFlJTkcgZmlsZSBhbmQgdGhlIGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbAogIFVSTC4gSSd2ZSBjdXQgb3V0IGFsbCByZWZlcmVuY2VzIHRvIE1QTCB0aGF0IEkgY291bGQgZmluZC4KCi0gQ29yZWN0ZWQgdGhlIG1ha2VmaWxlcyB0byBub3QgYWx3YXlzIHVzZSAtbHogd2hlbiBsaW5raW5nCgpWZXJzaW9uIDcuMTAtcHJlMgoKRGFuaWVsICgyIFNlcCAyMDAyKQotIEphbWVzIEdhbGxhZ2hlciBhZGRlZCBDb250ZW50LUVuY29kaW5nIHN1cHBvcnQgdG8gbGliY3VybCBzbyBub3cgY3VybCBhbmQKICBsaWJjdXJsLXVzaW5nIGFwcHMgY2FuIHJlcXVlc3QgY29tcHJlc3NlZCBjb250ZW50cyB1c2luZyB0aGUgJ2RlZmxhdGUnCiAgbWV0aG9kLiBTZWUgdGhlIHNwZWNpYWwgZmlsZSBsaWIvUkVBRE1FLmVuY29kaW5nIGZvciBkZXRhaWxzLgoKICBjdXJsIC0tY29tcHJlc3NlZCBpcyBub3cgdXNlZCB0byByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMuCgogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSB3aWxsIGluY2x1ZGUgJ2xpYnonIGlmIHRoaXMgZmVhdHVyZSB3YXMgYXJvdW5kIHdoZW4KICB0aGUgbGlicmFyeSB3YXMgYnVpbHQuCgpEYW5pZWwgKDMwIEF1ZyAyMDAyKQotIEFwcGxpZWQgYW4gYW5vbnltb3VzIFNPQ0tTNS1wcm94eSBwYXRjaC4gTm90IHByb3Blcmx5IHdvcmtpbmcgaW4gYWxsCiAgc2l0dWF0aW9ucyB0aG91Z2gsIGFzIGFsbCBnZXRhZGRyaW5mbygpLXVzaW5nIGxpYmN1cmxzIHdpbGwgZmFpbCBvbiB0aGlzLgogIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgc29tZXdoYXQgbmFpdmUgd2F5IHRoZSBjdXJyZW50IGNvZGUgdHJpZXMgdG8gZXh0cmFjdAogIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBwcm94eS4KCi0gRml4ZWQgdXAgdGhlIFNTTCBjZXJ0IGZpeGVzIGZyb20gdGhlIG90aGVyIGRheSBldmVuIG1vcmUgYWZ0ZXIgbW9yZSBpbnB1dHMKICBmcm9tIENyaXMuIEFkZGVkIHRocmVlIG5ldyBTU0wgZXJyb3IgY29kZXMgdG8gbWFrZSB0aGUKICBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUiBzbGlnaHRseSBsZXNzIG92ZXJsb2FkZWQuCgpEYW5pZWwgKDI3IEF1ZyAyMDAyKQotIEFmdGVyIGxvdHMgb2YgdGFsayB3aXRoIFRvbSBaZXJ1Y2hhLCBOaWNrIEdpbWJyb25lIGFuZCBDcmlzIEJhaWxpZmYgSQogIGRlY2lkZWQgdG8gdGFsayB0aGUgYm9sZCBwYXRoIGFuZCBJIG5vdyBtYWRlIGxpYmN1cmwgZG8gQ0EgY2VydGlmaWNhdGUKICB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gVGh1cyBsaWJyYXJ5IHVzZXJzIG5lZWQgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb2ZmCiAgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byBzaXRlcyB3aXRob3V0IHByb3BlciBjaGVja2luZy4gV2UgYWxzbyBpbnN0YWxsIGEKICBDQSBjZXJ0IGJ1bmRsZSBvbiAnbWFrZSBpbnN0YWxsJyBub3cuCgogIFRoZSBjdXJsIHRvb2wgbm93IHJlcXVpcmVzIHRoZSAtay8tLWluc2VjdXJlIG9wdGlvbiBpbiBvcmRlciB0byBhbGxvdwogIGNvbm5lY3Rpb25zIGFuZCBvcGVyYXRpb25zIG9uIFNTTCBzaXRlcyB0aGF0IGFyZW4ndCBwcm9wZXJseSB2ZXJpZmllZCB3aXRoCiAgLWNhZmlsZSBvciAtLWNhcGF0aC4KCiAgY3VybC1jb25maWcgLS1jYSBkaXNwbGF5cyB0aGUgYnVpbHQtaW4gcGF0aCB0byB0aGUgQ0EgY2VydCBidW5kbGUuCgpEYW5pZWwgKDI2IEF1ZyAyMDAyKQotIEFuZHJldyBGcmFuY2lzIGNsZWFuZWQgdXAgc29tZSBjb2RlIHRoYXQgbm93IGNvbXBpbGVzIGZpbmUgd2l0aG91dCB0aGUgbmVlZAogIGZvciB1Z2x5IE1TVkMgcHJhZ21hcy4KCi0gS2VpdGggTWFjRG9uYWxkIGZvdW5kIGEgbWlub3IgYnVnIGluIHNyYy9tYWluLmMgdGhhdCBtYWRlIGl0IGNsb3NlIHN0ZGluCiAgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGZpbGUgaGFuZGxlLiBJdCBzaG91bGRuJ3QgaGF2ZSByZXN1bHRlZCBpbiBtdWNoCiAgdHJvdWJsZSBhcyBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zIGNsb3NlIGFsbCBmaWxlIGhhbmRsZXMgb24gcHJvY2VzcyBleGl0CiAgYW55d2F5LgoKRGFuaWVsICgyMiBBdWcgMjAwMikKLSBNYXJrdXMgT2Jlcmh1bWVyIHByb3ZpZGVkIHNvbWUgZG9jdW1lbnRhdGlvbiBmb3IgaGlzIHByZXZpb3VzbHkgcHJvdmlkZWQKICBDVVJMT1BUX05PU0lHTkFMIGZpeC4KCi0gUGF0Y2hlZCB0aGUgbGliL01ha2VmaWxlLmFtIHRvIGhvcGVmdWxseSBubyBsb25nZXIgY29tcGxhaW4gb24gdW5kZWZpbmVkCiAgc3ltYm9scyB0aGF0IHNlZW1lZCB0byBvY2N1ciBvbiBidWlsZHMgd2l0aCBzaGFyZWQgT3BlblNTTCBsaWJyYXJpZXMgb24KICBTb2xhcmlzIGxhdGVseS4uLgoKRGFuaWVsICgyMCBBdWcgMjAwMikKLSBGaXhlZCBjb21waWxlciB3YXJuaW5ncyBvbiBNU0NWKysgY29tcGlsZXMuIFdlJ3JlIGxvb2tpbmcgZm9yIGhlbHAgaGVyZToKICByZW1vdmUgdGhlIHByYWdtYXMgZnJvbSBsaWIvY29uZmlnLXdpbjMyLmggYW5kIGFkanVzdCB0aGUgc291cmNlcyB3aGVyZQogIHRoZSB3YXJuaW5ncyBvY2N1ci4gSGlkaW5nIHRoZW0gd2l0aCBwcmFnbWFzIGxpa2UgdGhpcyBpcyBub3QgdGhlIGNvcnJlY3QKICB3YXkgb2YgZGVhbGluZyB3aXRoIGNvbXBpbGVyIHdhcm5pbmdzLgoKRGFuaWVsICgxMyBBdWcgMjAwMikKLSBVbHJpY2ggWmFkb3cgbWFkZSB0aGUgZ2xvYmFsIGluY2x1ZGUgZmlsZXMgaW4gY3VybC8qIGluY2x1ZGUgdGhlbXNlbHZlcwogIHVzaW5nICJjdXJsLmgiIGluc3RlYWQgb2YgPGN1cmwvY3VybC5oPiB3aGljaCB0aHVzIGFsbG93cyBwZW9wbGUgdG8gbW9yZQogIGZyZWVseSBkZWNpZGUgaG93IHRvIGluY2x1ZGUgY3VybCBhbmQgaG93IHRvIHNldHVwIHRoZWlyIGluY2x1ZGUgcGF0aHMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBhZGRlZCB0aGUgY3VybF9zaGFyZSogaW50ZXJmYWNlLCBzb21ld2hhdCBhcyBkaXNjdXNzZWQKICBwcmV2aW91c2x5LgoKLSBK9nJuIEhhcnRyb3RoIHBvaW50ZWQgb3V0IHRoYXQgcG9sbCgpIHdhcyB1c2VkIGluIHRoZSBwcmUxIHNvdXJjZSBjb2RlIGFuZAogIGl0IGlzbid0IHZlcnkgcG9ydGFibGUsIHNvIG5vdyBJIGNoZWNrIGZvciBpdCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQKICB3b3JrIGFyb3VuZCBpdC4KClZlcnNpb24gNy45LjktcHJlMQoKRGFuaWVsICgxMiBBdWcgMjAwMikKLSBBcHBsaWVkIG15IGluaXRpYWwgdGFrZSBvbiBtYWtpbmcgdGhlIG11bHRpIHN0dWZmIG1vcmUgYXN5bmNocm9ub3VzLiBDb25uZWN0cwogIHNob3VsZCBub3cgcmV0dXJuIGJhY2sgd2l0aG91dCAiaGFuZ2luZyIgdW50aWwgaXQgaGFzIGNvbm5lY3RlZCBmb3IgcmVhbC4KICBUaGlzIHNob3VsZCBhbHNvIGJlIHRoZSBjYXNlIGZvciBGVFAtUEFTViBjb25uZWN0cy4KCkRhbmllbCAoOSBBdWcgMjAwMikKLSBBcHBsaWVkIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIENVUkxPUFRfTk9TSUdOQUwsCiAgd2hpY2ggZWZmZWN0aXZlbHkgcHJldmVudHMgbGliY3VybCBmcm9tIGRvaW5nIGFueXRoaW5nIHRoYXQgbWF5IGNhdXNlCiAgc2lnbmFscyB0byBnZXQgc2VudC4gVGhpcyBpcyBiYXNpY2x5IGZvciBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgdGhhdAogIG5vdyBjYW4gdXNlIHRpbWVvdXRzIHByb3Blcmx5LCB3aXRob3V0IHJpc2tpbmcgYW55IHNpZ25hbHMgdG8gYnVyc3QgaW4gYW5kCiAgcnVpbiB0aGUgcGFydHkuCgpEYW5pZWwgKDUgQXVnIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSByZXBvcnRlZCB0aGF0IFJGQzI3MzItc3R5bGUgbGl0ZXJhbCBJUHY2IGFkZHJlc3NlcyBkaWRuJ3QKICB3b3JrLiBXaGVuIGRpZCB0aGF0IGNvZGUgdmFuaXNoPyBBbnl3YXksIGl0J3MgYmFjayBhZ2FpbiBub3cgYW5kIHNlZW1zIHRvCiAgd29yayEKCi0gSm9uYXRhbiBMYW5kZXIgZm91bmQgb3V0IHRoYXQgUE9TVGluZyBhbiBlbXB0eSBzdHJpbmcgZGlkbid0IHdvcmsgd2l0aCB0aGUKICBjb21tYW5kIGxpbmUgdG9vbC4KCkRhbmllbCAoMyBBdWcgMjAwMikKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIHRoZSBsaWJjdXJsLmRlZiBmaWxlIHRvIGJ1aWxkIHRoZSB3aW5kb3dzIERMTCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBlbmFibGVkLgoKRGFuaWVsICgxIEF1ZyAyMDAyKQotIFRoZSBmdHAgUE9SVCBjb21tYW5kIG5vdyB1c2VzIGEgYmV0dGVyIGRlZmF1bHQgSVAgYWRkcmVzcywgYXMgaXQgd2lsbAogIGV4dHJhY3QgYW5kIHVzZSB0aGUgbG9jYWwgSVAgYWRkcmVzcyB1c2VkIGJ5IHRoZSBjb250cm9sIGNvbm5lY3Rpb24uCgotIE1vZGlmaWVkIHRoZSAjaW5jbHVkZSBsaW5lcyBpbiBjdXJsL211bHRpLmggdG8gd29yayBiZXR0ZXIgb24gbW9yZQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMzEgSnVsIDIwMDIpCi0gQXR0ZW1wdGVkIGEgZml4IGZvciBSYXkgRGVHZW5uYXJvJ3MgcmVwb3J0ZWQgSFAtVVggaG9zdCBuYW1lIHJlc29sdmUKICBwcm9ibGVtcy4KCkRhbmllbCAoMzAgSnVsIDIwMDIpCi0gUHJpeWEgUmFtYWtyaXNobmFuIGFuZCBSeWFuIEpvbmVzIGNvbXBpbGVzIGN1cmwvY3VybC5oIHdpdGggYSBDKysgY29tcGlsZXIKICBhbmQgZG9uJ3QgZ2V0IF9fU1REQ19fIGRlZmluZWQsIHdoaWNoIHJlcXVpcmVkIHVzIHRvIGV4dGVuZCB0aGUgcHJlcHJvY2Vzc29yCiAgY2hlY2sgZm9yIHRoZSAjIyBvcGVyYXRvciB1c2FnZS4KCi0gQ29ycmVjdCB0aGUgZGVzY3JpcHRpb24gZm9yIENVUkxPUFRfUEFTU1dERlVOQ1RJT04sIGlmIHNldCB0byBOVUxMIHRoZQogIGludGVybmFsIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSBwdXQgYmFjay4KCi0gZGFuZnV6eiBhdCBtaWxrLmNvbSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGJhZGx5IGFzc3VtZWQgYSBzcGFjZSBhZnRlcgogICdTZXQtQ29va2llOicgc28gaWYgaXQgd2Fzbid0IHByZXNlbnQsIGl0IGNhdXNlZCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZQogIGNvb2tpZSBuYW1lIHRvIGZhbGwgb2ZmIQoKRGFuaWVsICgyOSBKdWwgMjAwMikKLSBUaGUgcGFzc3dvcmQgcHJvbXB0IGFza2luZyBmb3IgdXNlciBwYXNzd29yZCB1c2VkIHN0ZG91dCBhbmQgbm93IHVzZXMKICBzdGRlcnIgaW5zdGVhZCB0byBiZXR0ZXIgYWxsb3cgcmVkaXJlY3RpbmcuIEl0IGFsc28gbGVha2VkIGEgZm9wZW4oKSBmaWxlCiAgaGFuZGxlIHRoYXQgaXMgbm93IGZpeGVkLgoKRGFuaWVsICgyOCBKdWwgMjAwMikKLSBIQVZFX1NFVFZCVUYgd2FzIGxlZnQgb3V0IGZyb20gc3JjL21haW4uYyB3aGljaCBtYWRlIC1OIG5vdCB3b3JrLiBGb3VuZCBvdXQKICBieSBNIFQuCgpEYW5pZWwgKDI2IEp1biAyMDAyKQotIEdsZW4gTmFrYW11cmEgc29sdmVkIGEgY3Jhc2ggaW4gdGhlIG5hbWUgcmVzb2x2aW5nIGZ1bmN0aW9uIGZvciBJUC1vbmx5CiAgYWRkcmVzc2VzIG9uIEFscGhhIExpbnV4IChhdCBsZWFzdCkuCgotIFQuIEJoYXJhdGggY29ycmVjdGVkIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50cm9kdWNlZCBpbiA3LjkuOC4KCkRhbmllbCAoMjIgSnVuIDIwMDIpCi0gQW5kculzIEdhcmPtYSBwb2ludGVkIG91dCBtYW4gcGFnZSBlcnJvcnMgaW4gY3VybF9mb3JtYWRkLjMuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IEp1biAyMDAyKQotIENocmlzIENvbWJlcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gY3VybF9lc2NhcGUoKS4gSSBmaXhlZC4gV2Ugbm8gbG9uZ2VyCiAgdHJpZXMgdG8gZ2VuZXJhdGUgbm9yIHBhcnNlICcrJyBpbiBVUkxzLiBTcGFjZXMgYmVjb21lICUyMCwgYW5kIG9ubHkgJS1jb2RlcwogIGFyZSB0cmFuc2xhdGVkIGJ5IGN1cmxfdW5lc2NhcGUoKS4KCkRhbmllbCAoMTUgSnVuIDIwMDIpCi0gQWRkZWQgLS1saW1pdC1yYXRlIHRvIHRoZSBjdXJsIHRvb2wuIEFsbG93cyB0aGUgdXNlciB0byBzZXQgYSBtYXhtaW11bQogIHVwcGVyIGxpbWl0IHRvIGhvdyBtdWNoIGJhbmR3aWR0aCB0byB1c2UgZm9yIHRyYW5zZmVycy4KCi0gQ1VSTE9QVF9CVUZGRVJTSVpFIHdhcyBhZGRlZCB0byBsaWJjdXJsLiBUaGlzIHNldHMgYSBwcmVmZXJlZCBzaXplIGZvciB0aGUKICByZWNlaXZlIGJ1ZmZlciBpbiBsaWJjdXJsLiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzIHdvdWxkIGJlIHRoYXQgdGhlIHdyaXRlCiAgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgbW9yZSBvZnRlbiBhbmQgd2l0aCBzbWFsbGVyIGNodW5rcy4KCkRhbmllbCAoMTQgSnVuIDIwMDIpCi0gWWFycmFtIFN1bmlsIGZvdW5kIG91dCB0aGF0IHRoZSBTb2NrZXRJc0RlYWQoKSBmdW5jdGlvbiBwZXJmb3JtZWQgYSBsb3QKICBmYXN0ZXIgb24gV2luZG93cyB3aGVuIHJlbW92aW5nIHRoZSAxIG1pY3Jvc2Vjb25kIHRpbWVvdXQuCgotIEhhbm5vIEwuIEtyYW56aG9mZiBmaXhlZCB0aGUgVkMrKyBwcm9qZWN0IGZpbGVzLgoKLSBUb20gTWF0dGlzb24gZm91bmQgb3V0IHRoYXQgZnRwIHRyYW5zZmVycyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYSBsaXR0bGUKICB0b28gb2Z0ZW4uCgotIE1pa2xvcyBOZW1ldGggcG9zdGVkIGEgVkMrKyBtYWtlZmlsZSBmaXggYW5kIHNvbWUgSU5TVEFMTCBjb21tZW50cyBvbiBob3cKICB0byBkaXNhYmxlIHNwZWNpZmljIHByb3RvY29scyB3aGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzLgoKVmVyc2lvbiA3LjkuOAoKRGFuaWVsICgxMyBKdW4gMjAwMikKLSBUaW1lIHRvIGxldCB0aGlzIGJhYnkgZ28uCgpEYW5pZWwgKDEyIEp1biAyMDAyKQotIENocmlzIENvbWJlcyBhZGRlZCB0aHJlZSBuZXcgb3B0aW9ucyBmb3IgY3VybF9mb3JtYWRkKCk6IENVUkxGT1JNX0JVRkZFUiwKICBDVVJMRk9STV9CVUZGRVJQVFIsIENVUkxGT1JNX0JVRkZFUkxFTkdUSC4gIFRoZXkgYXJlIHVzZWQgdG8gY3JlYXRlIGEKICBtdWx0aXBhcnQgdGhhdCBhcHBlYXJzIGFzIGEgcmVndWxhciBmaWxlIHVwbG9hZCwgYnV0IHRoZSBkYXRhIGlzIHByb3ZpZGVkCiAgd2l0aCBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KCi0gTmljbyBCYWdndXMgbWFkZSB0aGUgVk1TIHZlcnNpb24gdXNlIHNpZ3NldGptcCgpIHRvby4KCi0gSvZybiBIYXJ0cm90aCBmaXhlZCB0aGUgbWluZ3czMiBidWlsZCB1c2luZyB0aGUgbW0gbGliLgoKLSBBcHBsaWVkIHBhdGNoZXMgYnkgS3JpcyBLZW5uYXdheSB0aGF0IGNvcnJlY3QgZm9ybWF0IHN0cmluZyBwcm9ibGVtcyBpbgogIGxpYi9mdHAuYyBhbmQgbGliL2xkYXAuYy4KClZlcnNpb24gNy45LjgtcHJlMwoKRGFuaWVsICgxMSBKdW4gMjAwMikKLSBKYW1lcyBDb25lIGJyb3VnaHQgdGhlIGlkZWEgb2YgdXNpbmcgc2lnc2V0am1wKCkgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHRvCiAgbWFrZSB0aGUgdGltZS1vdXQgb2YgbmFtZSBsb29rdXBzIHRvIHdvcmssIGV2ZW4gd2hlbiB0aGUgdW5kZXJseWluZyBuYW1lCiAgcmVzb2x2ZXIgbGlicmFyeSB0cmFwcyBFSU5UUi4gVGhlIHVzZSBvZiBzaWdzZXRqbXAoKSBhbmQgc2lnbG9uZ2ptcCgpIGZvcgogIHRoaXMgbWF5IGJlIGEgYml0IGRyYXN0aWMsIGFuZCBhbHNvIG5vdCBsaWtlbHkgdG8gZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4gIEkKICBhZGRlZCBjYXJlZnVsIGNoZWNraW5nIGZvciB0aGlzIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LCBldmVuIGNoZWNrcyBmb3IgaXQKICBiZWluZyBhIG1hY3JvICh3aGljaCBzZWVtcyB0byBiZSB0aGUgY2FzZSBpbiBmb3IgZXhhbXBsZSBMaW51eCkuCgogIHNpZ3NldGptcCgpIHNlZW1zIHRvIGJlIG1lbnRpb25lZCBpbiB0aGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbi4KCi0gTWlrbG9zIE5lbWV0aCBicm91Z2h0IGEgcGF0Y2ggdGhhdCBhbGxvd3MgbGliY3VybCB0byBnZXQgYnVpbHQgd2l0aCBzcGVjaWZpYwogIHByb3RvY29scyBkaXNhYmxlZC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgLi9jb25maWd1cmUKICAtLWRpc2FibGUtW3Byb3RvY29sXS4KCi0gRlRQIHJhbmdlIGRvd25sb2FkcyBjb3VsZCBtYWtlIENVUkxFX0ZUUF9XUklURV9FUlJPUiBnZXQgcmV0dXJuZWQuIFdlIG5vdwogIG1ha2UgcHJlY2F1dGlvbnMgdG8gbm90IHJldHVybiB0aGlzIGZvciByYW5nZSBkb3dubG9hZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAxMzUgdGhhdCBtYWtlcyBhbiBmdHAgcmFuZ2UgZG93bmxvYWQuIEhhZCB0byB0d2VhayB0aGUKICBydW50ZXN0cy5wbCBzY3JpcHQgYSBiaXQgdG9vLgoKLSBCdWcgcmVwb3J0ICM1NjY4MzUgaWRlbnRpZmllZCBhIHN0cmxlbigpIG9uIGEgTlVMTCBwb2ludGVyLiBBZGRlZCBhZGRpdGlvbmFsCiAgY2hlY2sgdG8gcHJldmVudCB0aGlzLgoKRGFuaWVsICgxMCBKdW4gMjAwMikKLSBGb3VuZCBhbmQgY29ycmVjdGVkIGEgY29ubmVjdCBmYWlsdXJlIHByb2JsZW0gdGhhdCBkaWRuJ3QgY3JlYXRlIGEgaHVtYW4KICBlcnJvciB0ZXh0LgoKLSBBZGRlZCBjb2RlIHRvIGNvbXBpbGUgd2l0aCBPcGVuU1NMIDAuOS43LiBCYXNlZCBvbiBwYXRjaCBmcm9tIEphY29iIE1ldXNlcgogIGFuZCBjb21tZW50cyBmcm9tIEf2dHogQmFiaW4tRWJlbGwuCgotIEdhdXRhbSBNYW5pIGZvdW5kIGEgc29ja2V0IGRlc2NyaXB0b3IgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gRlRQIHRyYW5zZmVycwogIGZhaWxlZCBhbmQgeW91IHJlaW52b2tlZCBjdXJsX2Vhc3lfcGVyZm9ybSgpLgoKRGFuaWVsICg1IEp1biAyMDAyKQotIEd1c3RhZiBIdWkgY29ycmVjdGVkIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIHNvIHRoYXQgaXQgd29uJ3QgY3Jhc2ggbm8KICBtYXR0ZXIgd2hlbiB5b3UgZGVjaWRlIHRvIHJlbW92ZSB0aGUgQ1VSTCBoYW5kbGUuCgotIEhBVkVfUkFORF9TVEFUVVMgd2FzIGFkZGVkIHRvIGxpYi9jb25maWctd2luMzIuaCBieSBBbmRyZWFzIE9sc3NvbiwgYXMgaXQKICBtYWtlcyB3aW5kb3dzIGJ1aWxkcyBzdG9wIGNvbXBsYWluaW5nIGFib3V0ICJ3ZWFrIHNlZWRpbmciIHdoZW4gaXQgaW4gZmFjdAogIGlzbid0LgoKLSBBbm90aGVyIDY0Yml0IGFyY2hpdGVjdHVyZSBjcmFzaCB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDcuOS43IHdhcyBub3cKICByZW1vdmVkLCBhcyBidWcgcmVwb3J0ICM1NjQ1ODUgY2xhcmlmaWVkLiBUaGlzIGhhcHBlbmVkIGR1ZSB0byBvdXIgYXR0ZW1wdHMKICB0byBvbmx5IGFsbG9jYXRlIG9ubHkgYXMgbXVjaCBtZW1vcnkgYXMgaXMgYWN0dWFsbHkgbmVlZGVkIGZvciBuYW1lCiAgcmVzb2x2aW5nICh1c2luZyByZWFsbG9jKSB3aGljaCBjYWxsZWQgZm9yIGEgZnVuY3Rpb24gdGhhdCBjb3VsZCAnbW92ZScgYQogIGhvc3RlbnQgc3RydWN0IGluIG1lbW9yeS4KClZlcnNpb24gNy45LjgtcHJlMgoKRGFuaWVsICgzIEp1biAyMDAyKQotIFQuIEJoYXJhdGggZml4ZWQgdGhlIENVUkxJTkZPX1JFRElSRUNUX1RJTUUgdG8gcmV0dXJuIGEgY29ycmVjdCB0aW1lIGFuZAogIG1hZGUgdGhlIENVUkxJTkZPX1JFUVVFU1RfU0laRSByZXR1cm4gdGhlIGNvcnJlY3QgdG90YWwgcmVxdWVzdCBzaXplLiBIZQogIGFsc28gbWFkZSB0aGUgd2luMzIgdGltZXJzIHVzZSBoaWdoZXIgcmVzb2x1dGlvbiB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMjkgTWF5IDIwMDIpCi0gUmVuYXVkIENoYWlsbGF0IG1hZGUgbWUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCBsaWJjdXJsIHJldHVybmVkIGFuIGVycm9yIGlmCiAgeW91IHRyaWVkIHRvIGdldCBhbiBlbXB0eSBGVFAgZmlsZS4gVGhpcyBzZWVtZWQgbGlrZSBhIHdyb25nIHRoaW5nIHRvIGRvLCBzbwogIG5vdyBpdCBubyBsb25nZXIgZG9lcyB0aGF0ISBJIGp1c3QgaG9wZSB0aGF0IG5vIG9uZSBidWlsdCBhbnl0aGluZyBmYW5jeQogIHVwb24gdGhpcyB1bmV4cGVjdGVkIGJlaGF2aW9yLi4uCgpEYW5pZWwgKDI4IE1heSAyMDAyKQotIENyaXMgQmFpbGlmZiBicm91Z2h0IENVUkxPUFRfQ0FQQVRIIHRoYXQgd29ya3MgbGlrZSBDVVJMT1BUX0NBSU5GTyBidXQKICBzcGVjaWZpZXMgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdpdGggY2VydGlmaWNhdGVzIHJhdGhlciB0aGFuIGEgc2luZ2xlIGZpbGUKICB3aXRoIHRoZW0gYWxsIGNvbmNhdGVuYXRlZC4gLS1jYXBhdGggd2FzIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbAogIGZvciB0aGUgc2FtZSBmdW5jdGlvbi4KCiAgV2luZG93cyB1c2VycyBuZWVkIHRvIHBheSBhdHRlbnRpb24gdGhhdCB0aGUgZGlyZWN0b3J5IHNob3VsZCBiZSBzZXR1cCB3aXRoCiAgdGhlIGNfcmVoYXNoIHRvb2wgb2YgdGhlIE9wZW5TU0wgcGFja2FnZSwgYW5kIHRoYXQgY3JlYXRlcyBzeW1saW5rcyBieQogIGRlZmF1bHQgdGhhdCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggYWN0dWFsIGNvcGllcyB0byB3b3JrIG9uIFdpbmRvd3MuCgotIEd1c3RhZiBIdWkgcHJvdmlkZWQgbmV3IGNvZGUgdGhhdCBjaGFuZ2VzIGhvdyBjdXJsX211bHRpX2luZm9fcmVhZCgpCiAgbWVzc2FnZXMgYXJlIHN0b3JlZCwgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gYmUga2VwdCBhcm91bmQgZm9yIHRoZSBtdWx0aQogIGhhbmRsZSdzIGVudGlyZSBsaWZlIHRpbWUuIEhlIGFsc28gbWFkZSBpdCByZXR1cm4gZmFpbHVyZSBjb2RlcyBwcm9wZXJseQogIHdoaWNoIGl0IGRpZG4ndCBkbyBiZWZvcmUuCgpEYW5pZWwgKDI3IE1heSAyMDAyKQotIEd1c3RhZiBIdWkgcG9pbnRlZCBvdXQgdGhhdCBydW5uaW5nIGN1cmxfbXVsdGlfcGVyZm9ybSgpIHdpdGhvdXQgZG9pbmcKICBjdXJsX211bHRpX2Zkc2V0KCkgZmlyc3Qgd2FzIG5vdCByZWFsbHkgYSB3b3JraW5nIGNvbWJvLiBJIGFkZGVkIGFuIGludGVybmFsCiAgY2hlY2sgZm9yIHRoaXMgYW5kIGhhdmUgc29tZSBleHRyYSBzZWxlY3QoKSBjb2RlIHdpdGhvdXQgdGltZW91dCB0byBtYWtlIHRoZQogIGxpYnJhcnkgaW50ZXJuYWxzIHdvcmsgaWRlbnRpY2FsbHkgbmV2ZXJ0aGVsZXNzLiBXZSBtaWdodCBuZWVkIHRvIHNvbWVob3cKICBlaXRoZXIgZG9jdW1lbnQgdGhhdCBvbmNlIHlvdSd2ZSB1c2VkIHRoZSAqX2Zkc2V0KCkgeW91IHNob3VsZCByZW1haW4gdXNpbmcKICB0aGVtIGluIHNlbGVjdCgpIG9yIHlvdSBzaG91bGQgYmxhbmsgdGhlbSBzb21laG93IHNvIHRoYXQgbGliY3VybCB3b24ndCBnbwogIGNyYXp5LgoKVmVyc2lvbiA3LjkuOC1wcmUxCgpEYW5pZWwgKDIyIE1heSAyMDAyKQotIEphbWVzIENvbmUgYnJvdWdodCBhbiBleGNlbGxlbnQgcGF0Y2gsIGluY2x1ZGluZyBzZXZlcmFsIHRlc3RzIGFuZCBkb2NzIQogIENVUkxPUFRfTkVUUkMgbm93IHRha2VzIGFuIGVudW0gYXMgYXJndW1lbnQgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgYm9vbGVhbi4KICAtLW5ldHJjLW9wdGlvbmFsIHdhcyBpbnRyb2R1Y2VkIGFzIGFuIGFkZGl0aW9uIHRvIC0tbmV0cmMgdG8gYWxsb3cgdGhlCiAgY29tbWFuZCBsaW5lIGNsaWVudCB0byB0YWtlIHVzZSBvZiBhbGwgdGhhdCBuZXcgbmV0cmMgc3R1ZmYuCgotIEJ1ZyByZXBvcnQgIzU1ODg4OCBzaG93ZWQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgcmUtdXNlZCB0aGUgcHJldmlvdXMgaG9zdAogIG5hbWUgd2hlbiBhIGNvbm5lY3Rpb24gb3ZlciBhIHByb3h5IHdhcyByZS11c2VkIGJ1dCB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKRGFuaWVsICgyMSBNYXkgMjAwMikKLSBFZGluIEthZHJpYmFzaWMgaGVscGVkIG1lIHNvcnQgb3V0IGEgcHJvYmxlbSB0byBtYWRlIGxpYmN1cmwgY3Jhc2ggd2hlbgogIHRyeWluZyB0byBIVFRQIFBPU1QgYW4gZW1wdHkgc3RyaW5nLgoKLSBDbGFyaWZpZWQgdGhhdCBKdWVyZ2VuIFdpbGtlIGRvbmF0ZWQgdGhlIG9yaWdpbmFsIHRlc3RzL3NlcnZlci9zd3MuYyBjb2RlLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgY3VybF9mb3JtYWRkKCkgcmV0dXJuIGEgdHlwZWRlZiBuYW1lZAogIENVUkxGT1JNY29kZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAnaW50JywgYW5kIHRoZSB2YXJpb3VzIHJldHVybiBjb2RlcyBhcmUKICBub3cgZ2xvYmFsbHkgZXhwb3J0ZWQuIEl0IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gYmV0dGVyIGZpZ3VyZSBvdXQgd2hhdCBnb2VzCiAgd3Jvbmcgd2hlbiBjdXJsX2Zvcm1hZGQoKSByZXR1cm5zIGVycm9ycy4KCkRhbmllbCAoMjAgTWF5IDIwMDIpCi0gUm9sYW5kIFppbW1lcm1hbm4gcG9pbnRlZCBvdXQgdGhhdCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCkKICBpcyBwcmVmZXJlZCB0byBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKCkuCgpEYW5pZWwgKDE3IE1heSAyMDAyKQotIEJ1ZyByZXBvcnQgIzU1Njg2OSBwb2ludGVkIG91dCB0aGF0IHNyYy93cml0ZW91dC5jIGRpZG4ndCBjb21waWxlIG9uIGZyZWVic2QKICBhZnRlciBteSBBSVggZml4ZXMgdGhlIG90aGVyIHdlZWsuCgotIEJ1ZyByZXBvcnQgIzU1NjkzMCBwb2ludGVkIG91dCBhIEZyZWVCU0QgY29yZSBkdW1wIGludHJvZHVjZWQgaW4gNy45LjcgaW4KICB0aGUgRE5TIHN0cnVjdCByZWFsbG9jIHN0dWZmLiBBY3R1YWxseSwgdGhpcyBjcmFzaCBjb3VsZCBoYXBwZW4gb24gYWxsCiAgc3lzdGVtcyB0aGF0IG1hZGUgdGhlIHBhY2tfaG9zdGVudCgpIGZ1bmN0aW9uIGdldCBpbnZva2VkLgoKLSBJIHJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZSdzIEhUVFAgc2VydmVyLgoKVmVyc2lvbiA3LjkuNwoKRGFuaWVsICgxMCBNYXkgMjAwMikKLSBLZXZpbiBSb3RoIGFkanVzdGVkIHRoZSAtLXRyYWNlLWFzY2lpIG91dHB1dCBzbGlnaHRseS4KCi0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIG91dCB0aGF0IHNyYy93cml0ZW91dC5jIG5lZWRlZCBhbiBhZGRpdGlvbmFsIGhlYWRlcgogIGZpbGUgaW5jbHVkZWQgZm9yIEFJWCBidWlsZHMKClZlcnNpb24gNy45LjctcHJlMgoKRGFuaWVsICg3IE1heSAyMDAyKQotIFVwZGF0ZWQgdGhlIG1hbiBwYWdlIHdpdGggLS10cmFjZS1hc2NpaSBhbmQgLWovLS1qdW5rLXNlc3Npb24tY29va2llcy4KCi0gTWFkZSAtLXRyYWNlLWFzY2lpIGRvIHByZXR0eSBtdWNoIHRoZSBzYW1lIGFzIC0tdHJhY2UgYnV0IHdpdGhvdXQgdGhlIGhleAogIHBhcnQgaW4gdGhlIG91dHB1dC4KCi0gQWRkZWQgQ1VSTE9QVF9DT09LSUVTRVNTSU9OIHRoYXQgd2hlbiBlbmFibGVkIG1ha2VzIGxpYmN1cmwgaWdub3JlIHNlc3Npb24KICBjb29raWVzIHJlYWQgZnJvbSBhIGZpbGUuIFRoaXMgb3B0aW9uIGlzIGVuZm9yY2VkIGJ5IHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wgdXNpbmcgdGhlIG5ldyAtai8tLWp1bmstc2Vzc2lvbi1jb29raWVzIG9wdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aAogIEtldmluIFJvdGguIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBjdXJsIHRvIGZ1bGx5IGVtdWxhdGUgYSBicm93c2VyJ3MKICBiZWhhdmlvciwgZXZlbiB3aGVuIGl0IGNvbWVzIHRvICJzZXNzaW9uIGNvb2tpZXMiLiBTZXNzaW9uIGNvb2tpZXMgYXJlCiAgY29va2llcyB0aGF0IGEgbm9ybWFsIGJyb3dzZXIgZGlzY2FyZHMgd2hlbiB0aGUgYnJvd3NlciBpcyBzaHV0CiAgZG93bi4gVGhleSdyZSBpZGVudGlmaWVkIGJ5IG5vdCBoYXZpbmcgYW55IGV4cGlyZSBkYXRlL3RpbWUuCgotIFdoZW4gQ1VSTE9QVF9ERUJVR0RBVEEgd2FzIHNldCwgaXQgcnVpbmVkIHRoZSBDVVJMT1BUX1NUREVSUiBzZXR0aW5nIGFuZAogIHRoaXMgd2FzIGRpc2NvdmVyZWQgd2hlbiAtLXRyYWNlIHdhcyBtYWRlIHRvIGNyYXNoLgoKLSBVc2luZyAtdiBhbmQgLS10cmFjZSBhdCB0aGUgc2FtZSB0aW1lIGNvbmZ1c2VkIG1hdHRlcnMuIC12IGlzIG5vdyBwcmV0dHkKICBtdWNoIGlnbm9yZWQgd2hlbiAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWkgaXMgdXNlZC4KCi0gTWFkZSAtLXRyYWNlIChhbmQgLS10cmFjZS1hc2NpaSkgc3VwcG9ydCAtIGFzIGZpbGUgbmFtZSB0byBwYXNzIG91dHB1dCB0bwogIHN0ZG91dCBpbnN0ZWFkLiBJdCBtYWtlcyBpdCBjb25zaXN0ZW50IHdpdGggaG93IG90aGVyIG9wdGlvbnMgd29yay4KClZlcnNpb24gNy45LjctcHJlMQoKRGFuaWVsICg2IE1heSAyMDAyKQotIEFkZGVkIG11bHRpLXBvc3QuYyB0byB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LiBJIGdvdCB0aGUgYmFzaWMgc291cmNlIGZvcgogIHRoaXMgZnJvbSBHdXN0YWYgSHVpLgoKRGFuaWVsICgzIE1heSAyMDAyKQotIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgbm93IGFuIGV4cG9ydGVkICNkZWZpbmUgaW4gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBhbmQKICBjYW4gYmUgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHlvdXIgd3JpdGUgY2FsbGJhY2sgY2FuCiAgZ2V0LgoKLSBDVVJMT1BUX1JFQUREQVRBIGlzIG5vdyBhbiBhbGlhcyBmb3IgQ1VSTE9QVF9JTkZJTEUgYW5kIENVUkxPUFRfV1JJVEVEQVRFIGlzCiAgYW4gYWxpYXMgZm9yIENVUkxPUFRfRklMRS4gVGhlc2UgdHdvIHdlcmUgYWRkZWQgZm9yIGNvbmZvcm1pdHkuIE1vc3Qgb3RoZXIKICBjYWxsYmFjayBmdW5jdGlvbidzIHVzZXJkYXRhIGFyZSBwcm92aWRlZCB3aXRoIG9wdGlvbnMgdXNpbmcgYSBzaW1pbGFyIG5hbWUtCiAgc2NoZW1lLgoKLSBBZGRlZCAiLS10cmFjZSBbZmlsZV0iIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gSXQgbWFrZXMgYSB2ZXJ5IGRldGFpbGVkCiAgdHJhY2UgZHVtcCBnZXQgc3RvcmVkLCB3aXRoIGEgZnVsbCBwcm90b2NvbCBkdW1wIHRoYXQgaW5jbHVkZXMgYWxsIHJlY2VpdmVkCiAgYW5kIHRyYW5zbWl0dGVkIGRhdGEuIFRoaXMgY291bGQgYmUgYSB2ZXJ5IGVmZmVjdGl2ZSB0b29sIGZvciBkZWJ1Z2dpbmcgd2hhdAogIGdvZXMgd3JvbmcuIFRoaXMgZHVtcCBpbmNsdWRlcyBldmVyeSBieXRlIHRoZSB3YXkgaXQgaXMgc2VudCB0by9yZWNlaXZlZAogIGZyb20gdGhlIHNlcnZlci4gVGhlIGR1bXAgaXMgdGhlIHBsYWluLXRleHQgdmVyc2lvbiwgc28gU1NMIHRyYW5zZmVycyB3aWxsCiAgc3RpbGwgYmUgcmVhZGFibGUuCgotIEkgZm91bmQgb3V0IHRoYXQgdGhlIERFQlVHRlVOQ1RJT04gd2FzIG5vdCBjYWxsZWQgcHJvcGVybHkgZXZlcnl3aGVyZSBhcyB3ZQogIHdhbnRlZCBpdCB0by4gSSBmaXhlZCBpdC4KCi0gLUQgbm93IHN0b3JlcyBhbGwgaGVhZGVycyB0byB0aGUgc2FtZSBmaWxlIGlmIG11bHRpcGxlIFVSTHMgYXJlIGdpdmVuIG9uIHRoZQogIGNvbW1hbmQgbGluZSEgS2V2aW4gUm90aCBtYWRlIG1lIGF3YXJlIG9mIHRoYXQgaXQgZGlkbid0IGFscmVhZHkgZG8gdGhpcyEKCi0gR3VzdGFmIEh1aSB3cm90ZSBhbiBleGNlbGxlbnQgZm9ybXBvc3QgZXhhbXBsZSB0aGF0IHVzZWQgdGhlIG11bHRpCiAgaW50ZXJmYWNlLiAgVW5mb3J0dW5hdGVseSwgaXQgZGlkbid0IHdvcmsgZHVlIHRvIHNldmVyYWwgYnVncyBpbiBob3cKICB0cmFuc2ZlcnMgd2VyZSBtYWRlIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSB3YXMgdXNlZC4KCkRhbmllbCAoMiBNYXkgMjAwMikKLSBIYW5ubyBLcmFuemhvZmYgZm91bmQgb3V0IHRoYXQgd2hlbiBkb2luZyBtdWx0aXBsZSB0cmFuc2ZlcnMgb24gdGhlIHNhbWUKICBlYXN5IGhhbmRsZSwgdGhlIHByb2dyZXNzIG1ldGVyIHdvdWxkIHNob3cgYSBiYWQgImN1cnJlbnRseSBkb3dubG9hZGVkCiAgdmFsdWUiIHdoZW4gdGhlIHRyYW5zZmVyIHN0YXJ0cy4KCkRhbmllbCAoMSBNYXkgMjAwMikKLSBBcHBsaWVkIGFub3RoZXIgcGF0Y2ggYnkgSmFja3kgTGFtIHRvIG1ha2UgdGhlIG5hbWUgcmVzb2x2ZSBpbmZvIHJlYWxsb2MoKQogIHN0dWZmIHdvcmsgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEFwcmlsIDIwMDIpCi0gY3VybF9tdWx0aV9pbmZvX3JlYWQoKSBpcyBub3cgaW1wbGVtZW50ZWQhCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDIpCi0gVXBkYXRlZCBCVUdTLCBUT0RPLCBGQVEsIElOU1RBTEwgYW5kIGFkZGVkIEJJTkRJTkdTLgoKLSBJIHRoaW5rIEkgZml4ZWQgdGhlIEROUyBjYWNoZSBwcnVuZSBjcmFjaCBKYWNreSBMYW0gZm91bmQgYW5kIHJlcG9ydGVkLgoKLSBJIGNsZWFuZWQgdXAgdGhlIG5hbWUgcHJlZml4IHN0dWZmIGluIHRoZSBoYXNoIGFuZCBsbGlzdCBtb2R1bGVzLgoKLSBGVFAgcmVzcG9uc2VzIHNob3VsZCBub3cgYmUgYmV0dGVyIG9uIHRpbWluZyBvdXQgcHJvcGVybHkuIFRoZSB0aW1lb3V0IHZhbHVlCiAgaXMgbWF4aW11bSB0aW1lb3V0IGZvciB0aGUgZW50aXJlIHJlcXVlc3Qgb3BlcmF0aW9uLCBidXQgYmVmb3JlIHRoaXMsIHRoZQogIHRpbWVvdXQgd2FzIHVzZWQgYXMgYSBtYXhpbXVtIGFsbG93ZWQgdGltZSBiZXR3ZWVuIHR3byByZWFkcy4uLgoKRGFuaWVsICgyNiBBcHJpbCAyMDAyKQotIEZpeGVkIHRoZSB0ZXN0IHN1aXRlIGh0dHAgc2VydmVyIHRvIG5vdCB1c2Ugc25wcmludGYoKSBhbnltb3JlIGR1ZSB0byBiZXR0ZXIKICBwb3J0YWJpbGl0eS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMikKLSBXaXRoIFN0ZXJsaW5nIEh1Z2hlcycgbmV3IEROUyBwcnVuaW5nLCBKYWNreSBMYW0gYXNrZWQgaWYgdGhpcyB3b3VsZG4ndAogIGNhdXNlIHByb2JsZW1zIHNpbmNlIHRoZSBwcnVuaW5nIGlzIG9ubHkgY2hlY2tpbmcgdGhlIGVudHJ5IHRpbWUsIGFuZCBpdAogIHN1cmUgY291bGQgY2F1c2UgcHJvYmxlbXMuIFRoZXJlZm9yLCBJJ3ZlIG5vdyBhZGRlZCBhbmQgY2hhbmdlZCBjb2RlIHNvIHRoYXQKICB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLiBOb3doZXJlIGluIHRoZSBjb2RlIHdpbGwgYmUgc3RvcmUgbmFtZQogIHJlc29sdmVkIGluZm9ybWF0aW9uIGFyb3VuZCBzbyB0aGF0IGEgc3Vuc2VxdWVudCBETlMgY2FjaGUgcHJ1bmUgc2hvdWxkCiAgY2F1c2UgYSBwcm9ibGVtLiBUaGlzIG9mIGNvdXJzZSBjYWxsZWQgZm9yIHNvbWUgbWlsZCBpbnRlcm5hbCBjaGFuZ2VzLgoKRGFuaWVsICgyMyBBcHJpbCAyMDAyKQotIEltcHJvdmVkIHRoZSAnbm9fcHJveHknIGNoZWNrLCBhcyB1c2luZyBwb3J0IG51bWJlcnMgaW4gdGhlIFVSTCBjb25mdXNlZCBpdAogIHByZXZpb3VzbHkuIFJlcG9ydGVkIGJ5IEVyd2FuIExlZ3JhbmQgaW4gYnVnIHJlcG9ydCAjNTQ3NDg0LgoKLSBUaGUgLS1pbnRlcmZhY2Ugb3B0aW9uIG5vdyB3b3JrcyBldmVuIG9uIElQdjYgZW5hYmxlZCBidWlsZHMuIFJlcG9ydGVkIGJ5CiAgJ3Rob3InLgoKRGFuaWVsICgyMiBBcHJpbCAyMDAyKQotIFRoZSAjZGVmaW5lcyBuYW1lcyBzdGFydGluZyB3aXRoIFRJTUVDT05EIG5vdyBoYXMgQ1VSTF8gcHJlZml4ZXMuIChUaGUgb2xkCiAgbmFtZXMgYXJlIHN0aWxsICNkZWZpbmVkIHRvby4pIFBvaW50ZWQgb3V0IGJ5IFJvYmVydCBPbHNvbi4KCi0gSmFja3kgTGFtIGJyb3VnaHQgY29kZSB0aGF0IGxldHMgdGhlIG5hbWUgcmVzb2x2ZSBmdW5jdGlvbiBvbmx5IHVzZSBhcyBtdWNoCiAgbWVtb3J5IGFzIGl0IGFjdHVhbGx5IG5lZWRzLiBUaGlzIG9ubHkgd29ya3Mgb24gY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcywKICBidXQgaXMgdG90YWxseSB0cmFuc3BhcmFudCB0byBhbGwgdXNlcnMuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDIpCi0gQmpvcm4gUmVlc2UgZml4ZWQgcGFja19ob3N0ZW50IHRvIHdvcmsgcHJvcGVybHkgd2l0aCA2NCBiaXQgcG9pbnRlcnMuCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDIpCi0gU3RlcmxpbmcgSHVnaGVzIGFkZGVkIGNvZGUgdG8gcHJ1bmUgb2xkIEROUyBjYWNoZSBlbnRyaWVzLCBzaW5jZSBKYWNreSBMYW0KICBleHBlcmllbmNlZCB2ZXJ5IGJpZyBjYWNoZXMuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgcGF0Y2hlZCB0aGUgMzAxIHJlc3BvbnNlIHRvIHdvcmsgYWdhaW5zdCB0aGUgUkZDIGJ1dCBtb3JlIGxpa2UKICBjb21tb24gYnJvd3NlcnMgZG8uIElmIGEgUE9TVCBnZXQgYSAzMDEgYmFjaywgaXQnbGwgc3dpdGNoIHRvIEdFVCBpbiB0aGUKICBuZXh0IHJlcXVlc3QgKGlmIGxvY2F0aW9uLWZvbGxvd2luZyBpcyBlbmFibGVkKS4KCkRhbmllbCAoMTYgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBwb3N0ZWQgYSBwYXRjaCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSW5nbyBXaWxrZW4gdGhhdCBpbnRyb2R1Y2VkCiAgdHdvIG5ldyBDVVJMSU5GT18qIHZhbHVlczogQ1VSTElORk9fUkVESVJFQ1RfVElNRSBhbmQKICBDVVJMSU5GT19SRURJUkVDVF9DT1VOVC4KCkRhbmllbCAoMTUgQXByaWwgMjAwMikKLSBKb25hdGFuIExhbmRlciBwYXRjaGVkIHRoZSB2ZXJib3NlIHRleHQgJ0Rpc2FibGVzIFBPU1QsIGdvZXMgd2l0aCBHRVQnIHRvCiAgcmVmbGVjdCByZWFsaXR5IGJldHRlciwgbGlrZSB3aGVuIHRoZSBmaXJzdCByZXF1ZXN0IGlzbid0IFBPU1QgYW5kIHdoZW4KICB0aGUgc2Vjb25kIGlzbid0IEdFVC4uLiA6LSkKCi0gQ3JhaWcgRGF2aXNvbiBwb2ludGVkIG91dCB0aGF0IHdoZW4gY3VybF9mb3JtYWRkKClpbmcgYSBmaWxlIHRoYXQgZG9lc24ndAogIGV4aXN0LCBsaWJjdXJsIGRvZXNuJ3QgcmV0dXJuIGVycm9yLiBOb3csIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2lsbCByZXR1cm4KICBDVVJMRV9SRUFEX0VSUk9SIGlmIHRoYXQgaXMgdGhlIGNhc2UuIFRlc3QgNDEgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKVmVyc2lvbiA3LjkuNgoKRGFuaWVsICgxNCBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIHN0cmlwIG9mZiB3aGl0ZSBzcGFjZXMgZnJvbSB0aGUKICBiZWdpbm5pbmcgb2YgY29va2llIGNvbnRlbnRzLgoKLSBIYWQgdG8gcGF0Y2ggaW5jbHVkZS9jdXJsL2N1cmwuaCBzaW5jZSBNU1ZDIGRvZXNuJ3Qgc2V0IHRoZSBfX1NURENfXyBkZWZpbmUuCiAgTW9vbmVzYW15IHBvaW50ZWQgb3V0IHRoZSBwcm9ibGVtLCBCam9ybiBSZWVzZSB0aGUgc29sdXRpb24uCgpWZXJzaW9uIDcuOS42LXByZTUKCkRhbmllbCAoMTIgQXByaWwgMjAwMikKLSBGaXhlZCB0aGUgVElNRVJfQ09OTkVDVCB0byBiZSBtb3JlIGFjY3VyYXRlIGZvciBGVFAgdHJhbnNmZXJzLiBQcmV2aW91c2x5CiAgRlRQIHRyYW5zZmVycyBnb3QgdGhlICJjb25uZWN0IGRvbmUiIHRpbWUgc2V0IGFmdGVyIHRoZSBpbml0aWFsIEZUUCBjb21tYW5kcwogIGFuZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIFRDUC9JUCBjb25uZWN0IGFzIGl0IHNob3VsZC4KCiAgSSBhbHNvIG1hZGUgdGhlIHRpbWUgc3RhbXAgZ2V0IHNldCBldmVuIGlmIHRoZSBjb25uZWN0IGl0c2VsZiBmYWlscywgd2hpY2gKICBpdCBkaWRuJ3QgZG8gcHJldmlvdXNseS4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwcm92aWRlZCBoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGFuZCBDVVJMT1BUX0RFQlVHREFUQS4gVGhleSBhbGxvdyBhIHByb2dyYW0gdG8gYSBzZXQgYQogIGNhbGxiYWNrIHRvIHJlY2VpdmUgZGVidWcvaW5mb3JtYXRpb24gZGF0YS4gVGhhdCBpbmNsdWRlcyBoZWFkZXJzIGFuZCBkYXRhCiAgdGhhdCBpcyByZWNlaXZlZCBhbmQgc2VudC4gQ1VSTE9QVF9WRVJCT1NFIHN0aWxsIGNvbnRyb2xzIGl0LgoKICBCeSBkZWZhdWx0LCB0aGVyZSBpcyBhbiBpbnRlcm5hbCBkZWJ1Z2Z1bmN0aW9uIHRoYXQgd2lsbCBtYWtlIHRoaW5ncyBsb29rCiAgYW5kIHdvcmsgYXMgYmVmb3JlIGlmIG5vdCBjaGFuZ2VkLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAyKQotIFNlYmFzdGllbiBXaWxsZW1pam5zIGZvdW5kIG91dCB0aGF0IC14IGRpZG4ndCB1c2UgdGhlIGRlZmF1bHQgcG9ydCBudW1iZXIgYXMKICBpcyBkb2N1bWVudGVkLiBJdCBkb2VzIG5vdy4KCi0gbGliY3VybC1lcnJvcnMuMyBpcyBhIG5ldyBtYW4gcGFnZSBhdHRlbXB0aW5nIHRvIGRvY3VtZW50IGFsbCBsaWJjdXJsIGVycm9yCiAgY29kZXMKCi0gQWRkZWQgdHdvIG5ldyBlcnJvciBjb2RlcyBhbmQgY2hhbmdlZCB0aGUgYmVoYXZpb3VyIG9mIHR3byBvbGQgb25lcwogIHNsaWdodGx5OgoKICBDVVJMRV9XUklURV9FUlJPUgogICBUaGlzIGVycm9yIHdhcyByZXR1cm5lZCAqYm90aCogZm9yIGVycm9ycyB0aGF0IG9jY3VyZWQgd2hlbiB3cml0aW5nCiAgIHJlY2VpdmVkIGRhdGEgdG8gYSBsb2NhbCBmaWxlLCBhcyB3ZWxsIGFzIHdoZW4gd2UgZ2V0IHByb2JsZW1zIHdyaXRpbmcgZGF0YQogICB0byBhIHJlbW90ZSBzZXJ2ZXIuIENVUkxFX1NFTkRfRVJST1IgaGFzIG5vdyBiZWVuIGFkZGVkIGZvciB0aGUgbGF0dGVyCiAgIGVycm9yLgoKICBDVVJMRV9SRUFEX0VSUk9SCiAgIFRoaXMgZXJyb3Igd2FzIHNpbWlsYXJseSByZXR1cm5lZCAqYm90aCogZm9yIGVycm9ycyB3aGVuIHJlYWRpbmcgYSBsb2NhbAogICBmaWxlLCBhcyB3ZWxsIGFzIHdoZW4gZ2V0dGluZyBwcm9ibGVtcyB3aGVuIHJlYWRpbmcgbmV0d29yayBkYXRhLgogICBDVVJMRV9SRUNWX0VSUk9SIGhhcyBub3cgYmVlbiBhZGRlZCBmb3IgdGhlIGxhdHRlciBlcnJvci4KCiAoVHdvIHRlc3QgY2FzZXMgd2VyZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4pCgpEYW5pZWwgKDkgQXByaWwgMjAwMikKLSBydW50ZXN0cy5wbCBub3cgc2V0cyB0aGUgSE9NRSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBjdXJsLCB0byBwcmV2ZW50IGFueQogIGFjdHVhbCB+Ly5jdXJscmMgZmlsZSB0byBmb29sIHRoZSB0ZXN0cyEKClZlcnNpb24gNy45LjYtcHJlNAoKRGFuaWVsICg4IEFwcmlsIDIwMDIpCi0gTWljaGFlbCBDdXJ0aXMgcHJvdmlkZWQgbmV3IGZ1bmN0aW9uYWxpdHkgZm9yIGN1cmwgb24gc29tZSBwbGF0Zm9ybXMuIFVzaW5nCiAgdGhlIC0tZW52aXJvbm1lbnQgb3B0aW9uLCBjdXJsIHdpbGwgKnNldCogYSBidW5jaCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICB0byB2YWx1ZXMuIFRoZSBuYW1lcyBhcmUgdGhlIHNhbWUgb25lcyBhcyBmb3IgdGhlIC13Ly0td3JpdGVvdXQgb3B0aW9uLgoKICBGb3Igbm93LCB0aGlzIG9ubHkgd29ya3Mgb24gdGhlIFJJU0MgT1MgdmVyc2lvbiwgYXMgdGhpcyBmZWF0dXJlIHJlbGllcyBvbgogIGJvdGggT1Mgc3VwcG9ydCBhbmQgdGhhdCBpdCBtYXRjaGVzIE9TIHBhcmFkaWdtcy4KCi0gSmFja3kgTGFtIHByb3ZpZGVkIGEgZml4IGZvciBnZXR0aW5nIGhlYWRlcnMtb25seSB3aGVuIHRoZSByZXBseSBpcyBIVFRQLzEuMAogIGFuZCAzMDQsIEkgZWRpdGVkIGl0IHNsaWdodGx5LgoKRGFuaWVsICg1IEFwcmlsIDIwMDIpCi0gQXMgcmVxdWVzdGVkIGJ5IEpheSBHcmF2ZXMsIHRoZSAnLmN1cmxyYycgZmlsZSAob3IgX2N1cmxyYyBhcyBpdCBpcyBjYWxsZWQKICB3aGVuIHVzZWQgaW4gd2luZG93cyksIGlzIG5vdyBsb2FkZWQgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhlIEhPTUUKICBlbnZpcm9ubWVudCB2YXJpYWJsZSBpc24ndCBzZXQgKG9yIGlmIGl0IGlzIHRvbyBsb25nKS4gSSBhbHNvIGVubGFyZ2VkIHRoZQogIGFycmF5IHVzZWQgdG8gc3RvcmUgdGhlIGZ1bGwgZmlsZSBwYXRoIGluLCB0byA1MTIgYnl0ZXMuCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdG8gbWUgd2h5IHRoZSAiMTkgTWFyY2giIGNoYW5nZSByZWdhcmRpbmcgLUcgYW5kIC1JCiAgd2FzIHN0dXBpZCBhbmQgdGhlIGNoYW5nZSB3YXMgcmV2ZXJ0ZWQuIEFkZGVkIHRlc3QgY2FzZSA0OCB0byB2ZXJpZnkgdGhlCiAgZnVuY3Rpb25hbGl0eS4KClZlcnNpb24gNy45LjYtcHJlMwoKRGFuaWVsICg0IEFwcmlsIDIwMDIpCi0gSm9uYXRhbiBMYW5kZXIgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgY3VybC9jdXJsLmggY29tcGlsZSBuaWNlbHkgb24KICBwcmUtSVNPIGNvbXBpbGVycywgbGlrZSB3aGVuIHVzaW5nIGdjYyAtdHJhZGl0aW9uYWwuCgpEYW5pZWwgKDMgQXByaWwgMjAwMikKLSBKYWNreSBMYW0gaWRlbnRpZmllZCBhIGdsaXRjaCB3aGVuIGdldHRpbmcgaGVhZGVycy1vbmx5LCB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgImhhbmciIDEgc2Vjb25kIGluIHZhaW4gaW4gdGhlIHNlbGVjdCgpIGxvb3AgYmVmb3JlIHJldHVybmluZyBiYWNrLgoKLSBUb3IgQXJudHNlbiBicm91Z2h0IGEgcGF0Y2ggZm9yIG11bHRpcGFydCBmb3JtcG9zdHMuIEl0IHR1cm5lZCBvdXQgdGhhdCB0aGUKICAiQ0dJX0xpdGUgUGVybCBwYWNrYWdlIiBtYWtlcyBzb21lIGJhZCBhc3N1bXB0aW9ucyBvbiB3aGF0IGxldHRlcnMgdGhhdCBtYXkKICBiZSB1c2VkIGluIGJvdW5kYXJ5IHN0cmluZ3MgYW5kIHRodXMgY3VybCBjb3VsZCBjb25mdXNlIGl0IGJ5IGluY2x1ZGluZyAnKycKICBhbmQgJy8nLiBXaGlsZSB0aGlzIGlzIHN0YW5kYXJkcy1jb21wbGlhbnQsIHdlIGNoYW5nZSB0aGUgYmVoYXZpb3IgdG8gd29yawogIHNtb290aGx5IHdpdGggZXhpc3Rpbmcgc29mdHdhcmUgYmFzZWQgb24gdGhhdCBwYWNrYWdlLgoKRGFuaWVsICgyIEFwcmlsIDIwMDIpCi0gR2VyaGFyZCBIZXJyZSBmaWxlZCBidWcgcmVwb3J0ICM1MzYyMzggd2hlcmUgaGUgcG9pbnRlZCBvdXQgYSBjcmFzaCBpbgogIHZlcmJvc2UgRlRQIHBhc3NpdmUgdHJhbnNmZXJzIGZvciBBSVguCgotIENsYXJlbmNlIEdhcmRuZXIgcG9pbnRlZCBvdXQgYSBtaW5vciBmbGF3IGluIGhvdyBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseQogIHRha2UgY2FyZSBvZiBhbGwgZXJyb3JzIHRoYXQgU1NMX3JlYWQoKSBjb3VsZCByZXR1cm4uCgotIEphY2t5IExhbSBmaXhlZCBhIE1BTExPQ0RFQlVHIHByb2JsZW0gaW4gbGliL2dldGluZm8uYwoKRGFuaWVsICgyNyBNYXJjaCAyMDAyKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBmdW5jdGlvbiB0aGF0IGRpZG4ndAogIGNoZWNrIHByb3h5IGNvbm5lY3Rpb25zIHByb3Blcmx5IGZvciAiZGVhZG5lc3MiIGJlZm9yZSB0aGV5IHdlcmUgcmUtdXNlZC4KCi0gUGVkcm8gTmV2ZXMgZm91bmQgb3V0IHRoYXQgSFRUUCBQT1NUaW5nIHdpdGggLS1kYXRhLWJpbmFyeSBkaWQgbm90IHByb3Blcmx5CiAgd29yayB1bmRlciBXaW5kb3dzIGFzIHRoZSBmaWxlIHNwZWNpZmllZCB3YXNuJ3QgcmVhZCBmdWxseSBiaW5hcnkhCgpEYW5pZWwgKDI1IE1hcmNoIDIwMDIpCi0gSmFja3kgTGFtIGJyb3VnaHQgYSBmaXggdGhhdCBpbXByb3ZlcyB0cmVhdG1lbnQgb2YgY29va2llcyB1c2luZyBpZGVudGljYWwKICBkb21haW5zIGJ1dCB3aXRoIGxlYWRpbmcgZG90cyBwcm9wZXJseS4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMikKLSBNaWtsb3MgTmVtZXRoIHVwZGF0ZWQgdGhlIHdpbmRvd3Mgc2VjdGlvbiBvZiB0aGUgZG9jcy9JTlNUQUxMIGZpbGUgYW5kIHRoZQogIHdpbmRvd3MgbWFrZWZpbGVzLgoKLSBKb24gRGlsbG9uIHByb3ZpZGVkIHVzIHdpdGggc2V2ZXJhbCBnb29kLWxvb2tpbmcgY3VybCBpbWFnZXMgZm9yCiAgcHJvbW90aW9uLiBWaWV3IHRoZW0gaGVyZSBodHRwOi8vY3VybC5oYXh4LnNlL2ljb25zLmh0bWwKCkRhbmllbCAoMjAgTWFyY2ggMjAwMikKLSBQZXRlciBWZXJoYXMgZm91bmQgb3V0IHRoYXQgQ1JMRiByZXBsYWNlbWVudCBpbiB1cGxvYWRzIHdhcyBub3Qgd29ya2luZy4gSQogIGZpeGVkIGl0LCBhbmQgYWRkZWQgdGVzdCBjYXNlIDEyOCB0aGF0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBUaGUgbGlzdCBmb3JtZXJseSBrbm93biBhcyBjdXJsLW1haW4gaXMgbm93IG5hbWVkIGN1cmwtdXNlcnMgYW5kIGlzIGhvc3RlZAogIGJ5IHNvdXJjZWZvcmdlLiBTdXNiY3JpYmUgdG8gdGhlIG5ldyBsaXN0LCBnZXQgb2ZmIHRoZSBvbGQgb25lLgoKVmVyc2lvbiA3LjkuNi1wcmUyCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDIpCi0gTWFkZSAtRyBhbmQgLUkgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIGNhdXNlIGFuIGVycm9yLgoKLSBNb3ZlZCB0aGUgbXVsdGkuaCBmaWxlIHRvIHRoZSAicHVibGljIiBpbmNsdWRlIGRpcmVjdG9yeSBhbmQgbWFkZSBpdCBnZXQKICBpbmNsdWRlZCBieSBjdXJsLmggc28gdGhhdCBubyBleHRyYSBpbmNsdWRlIGZpbGVzIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHVzZQogIGl0LgoKICBBZGRlZCBkb2NzIGFuZCBtYW4gcGFnZXMgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KICBBZGRlZCB0aGUgdGhyZWUgZXhhbXBsZSBzb3VyY2UgY29kZXMgdG9vLgoKICBOZWNlc3Nhcnkgc3RlcHMgaW4gbXkgY2FtcGFpZ24gdG8gc25lYWsgaW4gdGhlIG11bHRpIGludGVyZmFjZS4uLiA7LSkKCi0gVXBkYXRlZCB0aGUgeWVhciBpbiBhbGwgY29weXJpZ2h0IG5vdGljZXMgaW4gYWxsIEMgYW5kIEggZmlsZXMuCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDIpCi0gVG9tYXMgU3plcGUgZm91bmQgb3V0IHRoYXQgLWQgYW5kIC1HIGRpZG4ndCBtaXggYXMgdGhleSBzaG91bGQuIEkgYnJva2UgdGhpcwogIGluIDcuOS41Li4uIEFkZGVkIHRlc3QgY2FzZSAzMiBmb3IgdGhpcy4KClZlcnNpb24gNy45LjYtcHJlMQoKRGFuaWVsICgxNiBNYXJjaCAyMDAyKQotIFBldGVyIFZlcmhhcyBwb2ludGVkIG91dCB0aGF0IHRoZSBjdXJsX2VzY2FwZSBhbmQgY3VybF91bnNjYXBlIG1hbiBwYWdlcwogIGNvbnRhaW5lZCBmYWN0dWFsIGVycm9ycy4KCi0gQWxiZXJ0IENob3kgZm91bmQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCB0aGUgdmVyYm9zZSBvdXRwdXQgd2hlbiBkb2luZwogIFBBU1YgZnRwIHRyYW5zZmVycy4gSXQgY291bGQgbWFrZSBsaWJjdXJsIGNyYXNoLgoKICBEZXRhaWxzIGluIGJ1ZyByZXBvcnQgIzUzMDU2MjoKICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9MTAwOTc2JmFpZD01MzA1NjImZ3JvdXBfaWQ9OTc2CgpEYW5pZWwgKDE1IE1hcmNoIDIwMDIpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpbGVkIGJ1ZyByZXBvcnQgIzUzMDIwNCB0aGF0IGNsZWFybHkgcG9pbnRlZCBvdXQKICB0aGUgUEZfSU5FVCBmaXggZnJvbSBGZWJydWFyeSAxOSBhcyBhIG5vdC12ZXJ5LWdvb2QgZml4IGFzIGl0IGJyb2tlIElQdjYKICBjYXBhYmlsaXR5ISBUaGF0IHBhdGNoIGlzIG5vdyByZXZlcnRlZC4KCiAgVGhlIHByb2JsZW0gd2l0aCBzbG93IG5hbWUgbG9va3VwcyB3aXRoIGdldGFkZHJpbmZvKCkgb24gbm9uLUlQdjYgZW5hYmxlZAogIGhvc3RzIGFyZSBpbnN0ZWFkIG1hZGUgYnkgZmlyc3QgY2hlY2tpbmcgaWYgdGhlIHN0YWNrIGlzIElQdjYtZW5hYmxlZCBhbmQgaWYKICBub3QsIHRoZSBQRl9JTkVUIGlzIHVzZWQgYW5kIG90aGVyd2lzZSB3ZSBnbyB3aXRoIHRoZSBmdWxsIFBGX1VOU1BFQy4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCB0aGF0IHdoZW4gd2UgcmV0dXJuIGFuICJlcnJvciIgZnJvbSBhIFdSSVRFRlVOQ1RJT04KICBhcyBkZXNjcmliZWQgaW4gdGhlIG1hbiBwYWdlLCBsaWJjdXJsIGRpZCBub3QgcmV0dXJuIHRoZSBkb2N1bWVudGVkIGVycm9yCiAgY29kZSAoQ1VSTEVfV1JJVEVfRVJST1IpIGJ1dCB3b3VsZCBpbnN0ZWFkIHJldHVybiBDVVJMRV9SRUFEX0VSUk9SLiBUaGlzIGlzCiAgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMikKLSBTZXR0aW5nIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIG5vdyByZWFkIHRoZSBQT1NULQogIGRhdGEgZnJvbSB0aGUgY2FsbGJhY2suCgotIFRoZSBHT1BIRVIgc3VwcG9ydCBzZWVtcyB0byBiZSBicm9rZW4uIEkgZG9uJ3QgdGhpbmsgSSdsbCBldmVuIHN0YXJ0IGZpeGluZwogIGl0IHVudGlsIHNvbWVvbmUgZWxzZSBmaW5kcyBvdXQuLi4gOi0pCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDIpCi0gVHJ5aW5nICdjdXJsIC1JIGZ0cC5zdW5ldC5zZScgb3Igc2ltaWxhciBkaWQgYSBTSVpFIG9uIGEgc2lsbHkgIihuaWwpIgogIHN0cmluZy4gSWYgc3VjaCBhIGZpbGUgd291bGQgYmUgcHJlc2VudCwgY3VybCByZXR1cm5lZCB0aGUgc2l6ZSBvZiBpdCEgTm93CiAgd2UgcHJldmVudCB0aGlzLgoKLSBDdXJsX3NlbmRmKCkgd2FzIGZpeGVkIHRvIGRlYWwgd2l0aCBzaXR1YXRpb24gd2hlcmUgQ3VybF93cml0ZSgpIHdvdWxkJ3ZlCiAgYmxvY2tlZCBhbmQgdGh1cyByZXR1cm4gLTEuCgotIFNldHRpbmcgQ1VSTE9QVF9QUk9HUkVTU0ZVTkNUSU9OIHRvIE5VTEwgbm93IHJlc3RvcmVzIHRoZSBpbnRlcm5hbCBmdW5jdGlvbi4KCi0gQWxsIENVUkxGT1JNXyogb3B0aW9ucyBjYW4gbm93IGJlIHVzZWQgaW4gYSBDVVJMRk9STV9BUlJBWSBleGNlcHQgdGhlCiAgQ1VSTEZPUk1fQVJSQVkgaXRzZWxmLiBUaGlzIHdhcyBuZWNlc3Nhcnkgc2luY2Ugd2UgY291bGRuJ3QgZXhwYW5kIHRoZQogIENVUkxGT1JNXyogbGlzdCBwcm9wcmVseSBhbmQgdW5yZXN0cmljdGVkIHVudGlsIHRoaXMgd2FzIHRoZSBjYXNlLiBJdCB3YXMKICBhbHNvIGEgYml0IHBlY3VsaWFyIHRvIHVzZXJzIHdoeSBzb21lIG9wdGlvbnMgY291bGQgYmUgdXNlZCBpbiBhbiBhcnJheQogIHdoaWxlIG90aGVycyBjb3VsZG4ndC4KCi0gUmVtb3ZlZCBzb21lIHNpbGx5IENSTEYgbGluZXMgdGhhdCBoYWQgYWNjaWRlbnRhbGx5IHNsaXBwZWQgaW50byBzcmMvbWFpbi5jCiAgTmljbyBCYWdndXMgcG9pbnRlZCB0aGVtIG91dCB0byBtZS4KCkRhbmllbCAoMTEgTWFyY2ggMjAwMikKLSBDVVJMRk9STV9GSUxFTkFNRSB3YXMgYWRkZWQuIFRoaXMgY2FuIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgZmlsZSB1cGxvYWQKICBwYXJ0LCB0byBzZXQgdGhlICdmaWxlbmFtZScgZmllbGQgdG8gYSBjdXN0b20gdmFsdWUuIElmIHRoaXMgaXNuJ3QgdXNlZCwKICB0aGUgYWN0dWFsbHkgdXNlZCBmaWxlbmFtZSB3aWxsIGJlIGluY2x1ZGVkIGluc3RlYWQgKGFzIGxpYmN1cmwgYWx3YXlzIGhhcwogIGRvbmUpLiBjdXJsIHdhcyBhZGp1c3RlZCBhY2NvcmRpbmdseSwgYW5kIG5vdyAtRiBhY2NlcHRzIGEgJ2ZpbGVuYW1lPScgZmllbGQKICB0b28sIGFuZCBhbGxvd3MgY29uc3RydWN0cyBzdWNoIGFzOgoKICAgIC1GICduYW1lPUBmaWxlbmFtZTtmaWxlbmFtZT0vZGV2L251bGwnCgogIGFuZCB0aGlzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHR5cGU9IHRvbywgaW4gYSBtYW5uZXIgc2ltaWxhciB0bzoKCiAgIC1GICJmaWxlPUBsb2cvdGVzdDM5LnR4dDtmaWxlbmFtZT1mYWtlcmZpbGU7dHlwZT1tb28vZm9vYmFyIgoKICBUZXN0IGNhc2UgMzkgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRoZSBzdHJ1Y3QgZm9ybWVybHkga25vd24gYXMgSHR0cFBvc3QgaXMgbm93IG5hbWVkIGN1cmxfaHR0cHBvc3QgdG8gcHJvcGVybHkKICB1c2UgdGhlIGN1cmwgbmFtZSBzcGFjZS4gSSBhZGRlZCBhICNkZWZpbmUgZm9yIHRoZSBvbGQgbmFtZSB0byBtYWtlIGV4aXN0aW5nCiAgcHJvZ3JhbXMgY29tcGlsZSBldmVuIHdoZW4gdGhpcyBuZXcgaW5jbHVkZSBmaWxlIGlzIHVzZWQuCgpEYW5pZWwgKDggTWFyY2ggMjAwMikKLSBDbGlmZm9yZCBhbHNvIGRpc2NvdmVyZWQgdGhhdCBpZiB0aGUgY2xpZW50IGNvZGUgZmFpbGVkIGVhcmx5LCBhcyB3aGVuIGRvaW5nCiAgImN1cmwgLU8iIG9ubHksIGl0IHdvdWxkIGRvIGZjbG9zZShOVUxMKSB3aGljaCBjYXVzZWQgYSBzZWdtZW50YXRpb24gZmF1bHQKICBvbiBzb21lIHN5c3RlbXMuCgotIENsaWZmb3JkIFdvbGYgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgLS1wcm9ncmVzcy1iYXIgd29yayBhZ2Fpbi4KCi0gSSBjbG9zZWQgYnVnIHJlcG9ydCAjNTI3MDMyIGJ5IG1ha2luZyBzdXJlIHRoYXQgd2UgYWRkIGEgbmV3bGluZSBhZnRlciBhCiAgdHJhbnNmZXIgd2hlbiAtLXByb2dyZXNzLWJhciBoYXMgYmVlbiB1c2VkLiBCZWZvcmUsIHdpdGhvdXQgdGhlIG5ld2xpbmUsIGl0CiAgbWFkZSB0aGUgc3Vic2VxdWVudCB0ZXh0IGNvbWUgb3V0IHdyb25nLgoKVmVyc2lvbiA3LjkuNQoKRGFuaWVsICg3IE1hcmNoIDIwMDIpCi0gQWRkZWQgZG9jcy9LTk9XTl9CVUdTIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDYgTWFyY2ggMjAwMikKLSBLZXZpbiBSb3RoIGNvcnJlY3RlZCBhIGZsYXcgaW4gdGhlIGN1cmwgY2xpZW50IGdsb2JiaW5nIGNvZGUgdGhhdCBtYWRlIGl0CiAgbWVzcyB1cCBiYWNrc2xhc2hlcy4gVGhpcyB3YXMgbW9zdCBub3RhYmxlIG9uIHdpbmRvd3MgKGN5Z3dpbikgbWFjaGluZXMgd2hlbgogIHVzaW5nIGZpbGU6Ly8uCgotIEJyYWQgcHJvdmlkZWQgYW5vdGhlciBmaXggZm9yIGJ1aWxkaW5nIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLgoKLSBSYWxwaCBNaXRjaGVsbCBwYXRjaGVkIGF3YXkgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MgaW4gdGVzdHMvc2VydmVyL3N3cy5jCgpEYW5pZWwgKDUgTWFyY2ggMjAwMikKLSBJIG5vdGljZWQgdGhhdCB0aGUgdHlwZWRlZiBpbiBjdXJsLmggZm9yIHRoZSBwcm9ncmVzcyBjYWxsYmFjayBwcm90b3R5cGUgd2FzCiAgd3JvbmcgYW5kIHRodXMgYXBwbGljYXRpb25zIHRoYXQgdXNlZCBpdCB3b3VsZCBub3QgZ2V0IHRoZSBwcm9wZXIgaW5wdXQKICBkYXRhLiBJdCB1c2VkIHNpemVfdCB3aGVyZSB0aGUgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgdXNlcyBkb3VibGVzIQoKICBJIHdpc2ggSSBjb3VsZCBibGFtZSBzb21lb25lIGVsc2UsIGJ1dCB0aGlzIHdhcyBteSBmYXVsdC4gQWdhaW4uCgpWZXJzaW9uIDcuOS41LXByZTYKCkRhbmllbCAoNCBNYXJjaCAyMDAyKQotIEN1dCBvZmYgdGhlIGNoYW5nZXMgZG9uZSBkdXJpbmcgMjAwMSBmcm9tIHRoaXMgY2hhbmdlbG9nIGZpbGUgYW5kIHB1dCB0aGVtCiAgaW4gYSBzZXBhcmF0ZSBmaWxlIChDSEFOR0VTLjIwMDEpLCBhdmFpbGFibGUgZnJvbSBDVlMgb2YgY291cnNlLgoKLSBJIHJlbW92ZWQgdGhlIG11bHRpIGRpcmVjdG9yeS4gVGhlIGV4YW1wbGUgc291cmNlcyB3ZXJlIG1vdmVkIHRvIHRoZQogIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdoZXJlIHRoZXkgYmVsb25nLgoKLSBXcm90ZSA3IG5ldyBtYW4gcGFnZXMgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9ucyBpbiB0aGUgbmV3IG11bHRpIGludGVyZmFjZS4KICBUaGV5J3JlIGFsbCBzdGlsbCBwcmV0dHkgYmFzaWMsIGJ1dCB3ZSBjYW4gdXNlIHRoZW0gYXMgYSBzdGFydCBhbmQgYWRkIG1vcmUKICBjb250ZW50cyB0byB0aGVtIHdoZW4gd2UgZmlndXJlIG91dCB3aGF0IHRvIHdyaXRlLiBUaGUgbGFyZ2UgYW1vdW50IG9mIG1hbgogIHBhZ2VzIGZvciBsaWJjdXJsIG5vdyBwcmVzZW50IG1hZGUgbWUgZGVjaWRlIHRvIHB1dCB0aGVtIGluIGEgbmV3IHNlcGFyYXRlCiAgc3ViZGlyZWN0b3J5IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gTmFtZWQgbGliY3VybC4KCi0gR2l1c2VwcGUgQ29yYmVsbGkgcHJvdmlkZWQgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgRVBNIHBhY2thZ2UgbWFuYWdlciwgaXQKICBnZXRzIGdlbmVyYXRlZCBuaWNlbHkgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93LgoKVmVyc2lvbiA3LjkuNS1wcmU1CgpEYW5pZWwgKDEgTWFyY2ggMjAwMikKLSBNb3ZlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgaW50byB0aGUgdGVzdHMvIGRpciBhbmQgYWRkZWQgaXQgdG8gdGhlCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgd2FzIHByZXZpb3VzbHkgb25seSBwcmVzZW50IGluIHRoZSBDVlMgdHJlZS4KCi0gTW9kaWZpZWQgdGhlIEZlYnJ1YXJ5IDE3dGggSG9zdDogZml4LCBhcyBidWcgcmVwb3J0ICM1MjM3MTggcG9pbnRlZCBvdXQgdGhhdAogIGl0IGNhdXNlZCBjcmFzaGVzIQoKLSBOaWNvIEJhZ2d1cyBhZGRlZCBtb3JlIGVycm9yIGNvZGVzIHRvIHRoZSBWTVMgc3R1ZmYuCgotIFdlc2xleSBMYXh0b24gYnJvdWdodCB0aGUgY29kZSB0aGF0IGludHJvZHVjZWQgdGhlIG5ldyBDVVJMT1BUX1BSRVFVT1RFCiAgb3B0aW9uLiBJdCBpcyBqdXN0IGFub3RoZXIgRlRQIHF1b3RlIG9wdGlvbiB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5CiAgYSBsaXN0IG9mIEZUUCBjb21tYW5kcyB0byBpc3N1ZSAqanVzdCBiZWZvcmUqIHRoZSB0cmFuc2ZlciBjb21tYW5kIChSRVRSIG9yCiAgU1RPUiBldGMpLiBJdCBoYXMgdHVybmVkIHVwIGEgZmV3IHN5c3RlbXMgdGhhdCByZWFsbHkgbmVlZCB0aGlzLgoKICBUaGUgY3VybCBjb21tYW5kIGxpbmUgdG9vbCBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGJ5IHByZWZpeGluZyB0aGUKICBxdW90ZSBjb21tYW5kcyB3aXRoIGEgcGx1cyAoKykgaW4gc2ltaWxhciBzdHlsZSB0aGF0IHBvc3QgdHJhbnNmZXIgcXVvdGUKICBjb21tYW5kcyBhcmUgc3BlY2lmaWVkLgoKICBUaGlzIGlzIG5vdCB5ZXQgZG9jdW1lbnRlZC4gVGhlcmUgaXMgbm8gdGVzdCBjYXNlIGZvciB0aGlzIHlldC4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwMikKLSBSYWxwaCBNaXRjaGVsbCBtYWRlIHNvbWUgc2VyaW91cyBlZmZvcnRzIGFuZCBwdXQgYSBsb3Qgb2Ygc3dlYXQgaW4gc2V0dGluZwogIHVwIHNjcmlwdHMgYW5kIHRoaW5ncyBmb3IgbWUgdG8gYmUgYWJsZSB0byByZXBlYXQgaGlzIHByb2JsZW1zLCBhbmQgSQogIGZpbmFsbHkgY291bGQuICBJIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHRoZSBoZWFkZXIgYnl0ZSBjb3VudGVyIHRoYXQgd2Fzbid0CiAgaW5jcmVhc2VkIHByb3Blcmx5IGFuZCB0aHVzIHdlIGNvdWxkIHJldHVybiBDVVJMRV9HT1RfTk9USElORyB3aGVuIHdlIGluCiAgZmFjdCBoYWQgcmVjZWl2ZWQgZGF0YS4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwMikKLSBJIGhhZCB0byByZXZlcnQgdGhlIG5vbi1zcGFjZSBwYXJzaW5nIGNvb2tpZSBmaXggSSBwb3N0ZWQgdG8gdGhlIG1haWxpbmcKICBsaXN0LiBFeHBpcmUgZGF0ZXMgZG8gaGF2ZSBzcGFjZXMgYW5kIHN0aWxsIG5lZWQgdG8gZ2V0IHBhcnNlZCBwcm9wZXJseSEKICBJbnN0ZWFkIHdlIGp1c3QgaWdub3JlIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGFuZCBpdCBzZWVtcyB0byB3b3JrLi4uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDIpCi0gTWFkZSB0aGUgY29va2llIHByb3BlcnR5ICdNYXgtQWdlJyB3b3JrLCBqdXN0IHNpbmNlIHdlIGFscmVhZHkgdHJpZWQgdG8KICBzdXBwb3J0IGl0LCBpdCBpcyBiZXR0ZXIgdG8gZG8gaXQgcmlnaHQuIE5vIG9uZSB1c2VzIHRoaXMgYW55d2F5LgoKLSBUaGUgY29va2llIHBhcnNlciBjb3VsZCBjcmFzaCBpZiBhIHJlYWxseSB3ZWlyZCAoaWxsZWdhbCkgY29va2llIGxpbmUgd2FzCiAgcmVjZWl2ZWQuIEkgYWxzbyBtYWRlIGl0IGJldHRlciBkaXNjYXJkIHJlYWxseSBvZGRseSBmb3JtYXR0ZWQgbGluZXMgYmV0dGVyLgoKICBNYWRlIHRoZSBjb29raWUgamFyIHN0b3JlIHRoZSBzZWNvbmQgZmllbGQgZnJvbSB0aGUgbGVmdCB1c2luZyB0aGUgc3ludGF4CiAgdGhhdCBOZXRzY2FwZSBhbmQgTW96aWxsYSBwcm9iYWJseSBsaWtlLiBDdXJsIGl0c2VsZiBpZ25vcmVzIGl0LgoKICBBZGRlZCB0ZXN0IGNhc2UgMzEgZm9yIHRoZXNlIGNhc2VzLgoKICBDbGF5IExvdmVsZXNzJyBlbWFpbCByZWdhcmRpbmcgc29tZSBjb29raWUgaXNzdWVzIHN0YXJ0ZWQgbXkgY2xlYW51cC4KCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0aGF0IG15IGF1dG9tYWtlIGZpZGRsZXMgYnJva2UgdGhlIGFiaWxpdHkgdG8gYnVpbGQKICBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZSBhbmQgSSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgYnJpbmdzCiAgdGhpcyBhYmlsaXR5IGJhY2suCgpWZXJzaW9uIDcuOS41LXByZTQKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwMikKLSBGaWRkbGVkIHdpdGggdGhlIGF1dG9tYWtlIGZpbGVzIHRvIG1ha2UgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgbGliCiAgZGlyZWN0b3J5IG5vdCBoYXZlIC4uL3NyYyBpbiB0aGUgaW5jbHVkZSBwYXRoLCBhbmQgdGhlIHNyYyBzb3VyY2VzIHNob3VsZG4ndAogIGhhdmUgLi4vbGliIQoKLSBBbGwgNzkgdGVzdCBjYXNlcyByYW4gT0sgdW5kZXIgTGludXggYW5kIFNvbGFyaXMgdXNpbmcgdGhlIG5ldyBIVFRQIHNlcnZlcgogIGluIHRoZSB0ZXN0IHN1aXRlLiBUaGUgbmV3IEhUVFAgc2VydmVyIHdhcyBmaXJzdCBkb25hdGVkIGJ5IEdlb3JnIEhvcm4gYW5kCiAgc3Vic2VxdWVudGx5IG1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgdGVzdCBzdWl0ZS4gSXQgaXMgY3VycmVudGx5IHN0aWxsIG5vdAogIHBvcnRhYmxlIGVub3VnaCB0byBydW4gb24gImFsbCBvdmVyIiBidXQgdGhpcyBpcyBhIHN0YXJ0IGFuZCBJIGNhbiBydW4gYWxsCiAgY3VybCB0ZXN0cyBvbiBteSBtYWNoaW5lcy4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgcmVxdWlyZW1lbnQgZm9yIHRoZSB1cGNvbWluZwogIHB1YmxpYyByZWxlYXNlLgoKLSBVc2luZyAtZCBhbmQgLUkgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIG5vdyByZXBvcnRzIGFuIGVycm9yLCBhcyBpdCBpbXBsaWVzCiAgdHdvIGRpZmZlcmVudCBIVFRQIHJlcXVlc3RzIHRoYXQgY2FuJ3QgYmUgbWl4ZWQuCgotIEplZmZyZXkgUG9obG1leWVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSAtdy8tLXdyaXRlLW91dCBvcHRpb24KICBzdXBwb3J0ICV7Y29udGVudF90eXBlfSB0byBnZXQgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVjZW50IGRvd25sb2FkLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgcHJlMiBhbmQgcHJlMyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBjeWd3aW4sCiAgYW5kIHRoaXMgd2FzIGJlY2F1c2UgSSB1c2VkICNpZmRlZiBIQVZFX1dJTlNPQ0tfSCBpbiBsaWIvbXVsdGkuaCB0byBmaWd1cmUKICBvdXQgaWYgd2UgY291bGQgaW5jbHVkZSB3aW5zb2NrLmggd2hpY2ggdHVybnMgb3V0IG5vdCB0byBiZSBhIHdpc2UgY2hvaWNlIHRvCiAgZG8gb24gY3lnd2luIHNpbmNlIGl0IGhhcyB0aGUgZmlsZSBidXQgY2FuJ3QgaW5jbHVkZSBpdCEKCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMikKLSBBZGRlZCBzcmMvY29uZmlnLXZtcy5oIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCgotIEZpeGVkIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgYWdhaW4sIHRoZSBjaGFuZ2UgZnJvbSBGZWJydWFyeSAxOCB3YXNuJ3QKICBjb21wbGV0ZS4KClZlcnNpb24gNy45LjUtcHJlMwoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAyKQotIEtldmluIFJvdGggYW5kIEFuZHLpcyBHYXJj7WEgYm90aCBmb3VuZCBvdXQgdGhhdCBsaWIvY29uZmlnLmguaW4gd2FzIG1pc3NpbmcKICBpbiB0aGUgcHJlLXJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQuCgpWZXJzaW9uIDcuOS41LXByZTIKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMikKLSBBbmRy6XMgR2FyY+1hIHByb3ZpZGVkIGEgc29sdXRpb24gdG8gYnVnIHJlcG9ydCAjNTE1MjI4LiB0aGUgdG90YWwgdGltZQogIGNvdW50ZXIgd2FzIG5vdCBzZXQgY29ycmVjdGx5IHdoZW4gLUkgd2FzIHVzZWQgZHVyaW5nIHNvbWUgY29uZGl0aW9ucyAoYWxsCiAgaGVhZGVycyB3ZXJlIHJlYWQgaW4gb25lIHNpbmdsZSByZWFkKS4KCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgYSBodWdlIHBhdGNoIHdpdGggbWlub3IgdHdlYWtzIGFsbCBvdmVyIHRvIG1ha2UgY3VybAogIGNvbXBpbGUgbmljZWx5IG9uIFZNUy4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMikKLSBSaWNrIFJpY2hhcmRzb24gZm91bmQgb3V0IHRoYXQgYnkgcmVwbGFjaW5nIFBGX1VOU1BFQyB3aXRoIFBGX0lORVQgaW4gdGhlCiAgZ2V0YWRkcmluZm8oKSBjYWxscywgaGUgY291bGQgc3BlZWQgdXAgc29tZSBuYW1lIHJlc29sdmluZyBjYWxscyB3aXRoIGFuCiAgb3JkZXIgb2YgbWFnbml0dWRlcyBvbiBoaXMgUmVkaGF0IExpbnV4IDcuMi4KCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIHNlY29uZCBJTkFERFJfTk9ORSBwcm9ibGVtIHdoZXJlIHdlIHVzZWQgbG9uZwogIGludGVhZCBvZiBpbl9hZGRyX3Qgd2hpY2ggY2F1c2VkIDY0Yml0IHByb2JsZW1vcy4gV2UgcmVhbGx5IHNob3VsZG4ndCBkZWZpbmUKICB0aGF0IG9uIHR3byBkaWZmZXJlbnQgcGxhY2VzLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDAyKQotIFBoaWxpcCBHbGFkc3RvbmUgZm91bmQgYSBwcm9ibGVtIGluIGhvdyBIVFRQIHJlcXVlc3RzIHdlcmUgc2VudCBpZiB0aGUKICByZXF1ZXN0IGNvdWxkbid0IGJlIHNlbnQgYWxsIGF0IG9uY2UuCgotIEVtaWwgZm91bmQgYW5kIGNvcnJlY3RlZCBhIGJhZCBjb25uZWN0aW9uIHRpbWVvdXQgY29tcGFyaXNvbiB0aGF0IG1hZGUgY3VybAogIHVzZSB0aGUgbG9uZ2VzdCBvZiBjb25uZWN0LXRpbWVvdXQgYW5kIHRpbW91dCBhcyBhIHRpbWVvdXQgdmFsdWUsIGluc3RlYWQgb2YKICB0aGUgc2hvcnRlc3QgYXMgaXQgd2FzIHN1cHBvc2VkIHRvIQoKLSBBcm9uIFJvYmVydHMgcHJvdmlkZWQgdXBkYXRlZCBpbmZvcm1hdGlvbiBhYm91dCBMREFQIFVSTCBzeW50YXggdG8gZ28gaW50bwogIHRoZSBtYW51YWwgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9sZCByZWZlcmVuY2VzLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDAyKQotIFBoaWxpcCBHbGFkc3RvbmUgcG9pbnRlZCBvdXQgdHdvIG1pc3NpbmcgaW5jbHVkZSBmaWxlcyB0aGF0IG1hZGUgY3VybCBjb3JlCiAgZHVtcCBvbiA2NGJpdCBhcmNoaXRlY3R1cmVzLiBXZSBuZWVkIHRvIHBheSBtb3JlIGF0dGVudGlvbiBvbiB0aGVzZSBkZXRhaWxzLgogIEl0IGlzICpsZXRoYWwqIHRvIGZvciBleGFtcGxlIGZvcmdldCB0aGUgbWFsbG9jKCkgcHJvdG90eXBlLCBhcyAnaW50JyBpcwogIDMyYml0IGFuZCBtYWxsb2MoKSBtdXN0IHJldHVybiBhIDY0Yml0IHBvaW50ZXIgb24gdGhlc2UgcGxhdGZvcm1zLgoKLSBHaWFzbGFzIEdlb3JnaW9zIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhvc3Q6IGhlYWRlcnMgb24gcmVwZWF0ZWQgcmVxdWVzdHMgb24KICB0aGUgc2FtZSBoYW5kbGUgdXNpbmcgYSBwcm94eS4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAyKQotIEhhbm5vIEwuIEtyYW56aG9mZiBhY2N1cmF0ZWx5IGZvdW5kIG91dCB0aGF0IGRpc2FibGluZyB0aGUgRXhwZWN0OiBoZWFkZXIKICB3aGVuIGRvaW5nIG11bHRpcGFydCBmb3JtcG9zdHMgZGlkbid0IHdvcmsgdmVyeSB3ZWxsLiBJdCBkaXNhYmxlZCBvdGhlcgogIHBhcnRzIG9mIHRoZSByZXF1ZXN0IGhlYWRlciB0b28sIHJlc3VsdGluZyBpbiBhIGJyb2tlbiBoZWFkZXIuIFdoZW4gSSBmaXhlZAogIHRoaXMsIEkgYWxzbyBub3RpY2VkIHRoYXQgdGhlIENvbnRlbnQtVHlwZSB3YXNuJ3QgcG9zc2libGUgdG8gZGlzYWJsZS4gSXQgaXMKICBub3csIGV2ZW4gdGhvdWdoIGl0IHByb2JhYmx5IGlzIHJlYWxseSBzdHVwaWQgdG8gdHJ5IHRvIGRvIHRoaXMgKGJlY2F1c2Ugb2YKICB0aGUgYm91bmRhcnkgc3RyaW5nIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlciwKICB1c2VkIGFzIGZvcm0gcGFydCBzZXBhcmF0b3IuKQoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDIpCi0gSSBtb3ZlZCB0aGUgY29uZmlnKi5oIGZpbGVzIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHRoZSBsaWIvIGRpcmVjdG9yeS4KCi0gSSd2ZSBhZGRlZCB0aGUgbmV3IHRlc3Qgc3VpdGUgSFRUUCBzZXJ2ZXIgdG8gdGhlIENWUyByZXBvc2l0b3J5LCBJdCBzZWVtcyB0bwogIHdvcmsgcHJldHR5IGdvb2Qgbm93LCBidXQgd2UgbXVzdCBtYWtlIGl0IGdldCB1c2VkIGJ5IHRoZSB0ZXN0IHNjcmlwdHMKICBwcm9wZXJseSBhbmQgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNvbXBpbGVzLCBidWlsZHMgYW5kIHJ1bnMgb24KICBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLgoKVmVyc2lvbiA3LjkuNS1wcmUxCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMikKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIHVwZGF0ZWQgd2luZG93cyBtYWtlZmlsZXMgYW5kIElOU1RBTEwgZG9jcy4KCi0gTXIgTGFycnkgRmFobm9lIGZvdW5kIGEgcHJvYmxlbSB3aXRoIGZvcm1wb3N0cyBhbmQgSSBtYW5hZ2VkIHRvIHRyYWNrIGRvd24KICBhbmQgcGF0Y2ggdGhpcyBidWcuIFRoaXMgd2FzIGFjdHVhbGx5IHR3byBidWdzLCBhcyB0aGUgcG9zdGVkIHNpemUgd2FzIGFsc28KICBzYWlkIHRvIGJlIHR3byBieXRlcyB0b28gbGFyZ2UuCgotIEJyZW50IEJlYXJkc2xleSBmb3VuZCBvdXQgYW5kIGJyb3VnaHQgYSBjb3JyZWN0aW9uIGZvciB0aGUKICBDVVJMSU5GT19DT05URU5UX1RZUEUgcGFyc2VyIHRoYXQgd2FzIG9mZiBvbmUgYnl0ZS4gVGhpcyB3YXMgbXkgZmF1bHQsIEkKICBhY2NpZGVudGFseSBicm9rZSBHaWFzbGFzIEdlb3JnaW9zJyBwYXRjaC4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAyKQotIEtldmluIFJvdGggZm91bmQgeWV0IGFub3RoZXIgU1NMIGRvd25sb2FkIHByb2JsZW0uCgpWZXJzaW9uIDcuOS40CgotIG5vIGNoYW5nZXMgc2luY2UgcHJlLXJlbGVhc2UKClZlcnNpb24gNy45LjQtcHJlMgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDIpCi0gRXJpYyBNZWx2aWxsZSBwcm92aWRlZCBhIGZldyBzcGVsbGluZyBjb3JyZWN0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMSBGZWJydWFyeSAyMDAyKQotIEFuZHJlYXMgRGFtbSBjb3JyZWN0ZWQgdGhlIHVuY29uZGl0aW9uYWwgdXNlIG9mIGdtdGltZSgpIGluIGdldGRhdGUsIGl0IG5vdwogIHVzZXMgZ210aW1lX3IoKSBvbiBhbGwgaG9zdHMgdGhhdCBoYXZlIGl0LgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDIpCi0gQW4gYW5vbnltb3VzIGJ1ZyByZXBvcnQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gdGhlIEROUyBjYWNoaW5nIHdoaWNoIG1hZGUgaXQKICBzb21ldGltZXMgYWxsb2NhdGUgb25lIGJ5dGUgdG9vIGxpdHRsZSB0byBzdG9yZSB0aGUgY2FjaGUgZW50cnkgaW4uIFRoaXMKICBoYXBwZW5lZCB3aGVuIHRoZSBwb3J0IG51bWJlciBzdGFydGVkIHdpdGggMSEKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGltcHJvdmVzIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjb25maWd1cmUKICBjaGVjayBvbiBIUC1VWCAxMS4wMC4KClZlcnNpb24gNy45LjQtcHJlMQoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDIpCi0gR2VvcmcgSG9ybiBmb3VuZCBhbm90aGVyIHdheSB0aGUgU1NMIHJlYWRpbmcgZmFpbGVkIGR1ZSB0byB0aGUgbm9uLWJsb2NraW5nCiAgc3RhdGUgb2YgdGhlIHNvY2tldHMhIEkgZml4ZWQuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMikKLSBNdWx0aXBhcnQgZm9ybXBvc3RzIG5vdyBzZW5kIHRoZSBmdWxsIHJlcXVlc3QgcHJvcGVybHksIGluY2x1ZGluZyB0aGUgQ1JMRi4KICBUaGV5IHdlcmUgcHJldmlvdXNseSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHBvc3QgZGF0YS4KCi0gVGhlIHVwbG9hZCBieXRlIGNvdW50ZXIgYnVnZ2VkLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2VlZCBTU0wgb24gZXZlcnkgY29ubmVjdCwgd2hpY2ggaXMgYSB0aW1lLQogIGNvbnN1bWluZyBvcGVyYXRpb24gdGhhdCBzaG91bGQgb25seSBiZSBuZWVkZWQgdG8gZG8gb25jZS4gV2UgcGF0Y2hlZAogIGxpYmN1cmwgdG8gbm93IG9ubHkgc2VlZCBvbiB0aGUgZmlyc3QgY29ubmVjdCB3aGVuIHVuc2VlZGVkLiBUaGUgc2VlZGVkCiAgc3RhdHVzIGlzIGdsb2JhbCBzbyBpdCdsbCBub3cgb25seSBoYXBwZW4gb25jZSBkdXJpbmcgYSBwcm9ncmFtJ3MgbGlmZSB0aW1lLgoKICBJZiB0aGUgcmFuZG9tX2ZpbGUgb3IgZWdkc29ja2V0IGlzIHNldCwgdGhlIHNlZWQgd2lsbCBiZSByZS1tYWRlIHRob3VnaC4KCi0gR2lhc2xhcyBHZW9yZ2lvcyBpbnRyb2R1Y2VkIENVUkxJTkZPX0NPTlRFTlRfVFlQRSB0aGF0IGxldHMKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIHJlYWQgdGhlIGNvbnRlbnQtdHlwZSBmcm9tIHRoZSBwcmV2aW91cyByZXF1ZXN0LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIGEgd2F5IHRvIGNyYXNoIGN1cmwgYW5kIGFmdGVyIG11Y2ggZGVidWdnaW5nLCBpdAogIHR1cm5lZCBvdXQgaXQgd2FzIGEgSVB2NC1saW51eCBvbmx5IHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjkuMyByZWxhdGVkIHRvCiAgbmFtZSByZXNvbHZpbmcuCgotIEFuZHJlYXMgRGFtbSBwb3N0ZWQgYSBodWdlIHBhdGNoIHRoYXQgbWFkZSB0aGUgY3VybF9nZXRkYXRlKCkgZnVuY3Rpb24gZnVsbHkKICByZWVudHJhbnQhCgotIFN0ZXZlIE1hcnggcG9pbnRlZCBvdXQgdGhhdCB5b3UgY291bGRuJ3QgbWl4IENVUkxPUFRfQ1VTVE9NUkVRVUVTVCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTLiBZb3UgY2FuIG5vdyEKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAyKQotIEtyaXNobmVuZHUgTWFqdW1kYXIgcG9pbnRlZCBvdXQgdGhhdCB0aGUgaGVhZGVyIGxlbmd0aCBjb3VudGVyIHdhcyBub3QgcmVzZXQKICBiZXR3ZWVuIG11bHRpcGxlIHJlcXVlc3RzIG9uIHRoZSBzYW1lIGhhbmRsZS4KCi0gUGVkcm8gTmV2ZXMgcmlnaHRmdWxseSBxdWVzdGlvbmVkIHdoeSBjdXJsIGFsd2F5cyBhcHBlbmQgXHJcbiB0byB0aGUgZGF0YQogIHRoYXQgaXMgc2VudCBpbiBIVFRQIFBPU1QgcmVxdWVzdHMuIFVuZm9ydHVuYXRlbHksIHRoaXMgYnJva2UgdGhlIHRlc3Qgc3VpdGUKICBhcyB0aGUgdGVzdCBIVFRQIHNlcnZlciBpcyBsYW1lIGVub3VnaCBub3QgdG8gZGVhbCB3aXRoIHRoaXMuLi4gOi1PCgotIEZvbGxvd2luZyBMb2NhdGlvbjogaGVhZGVycyB3aGVuIHRoZSBjb25uZWN0aW9uIGRpZG4ndCBjbG9zZSBkaWRuJ3Qgd29yayBhcwogIGxpYmN1cmwgZGlkbid0IHByb3Blcmx5IHN0b3AgcmVhZGluZy4gVGhpcyBwcm9ibGVtIHdhcyBhZGRlZCBpbiA3LjkuMyBkdWUgdG8KICB0aGUgcmVzdHJ1Y3R1cmVkIGludGVybmFscy4gJ0ZyYW5rJyBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHRoaXMuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIHZlcnkgcXVpY2tseSBzcG90dGVkIHRoYXQgd2Ugd3JvbmdseSBpbnN0YWxsZWQgdGhlIGV4YW1wbGUKICBwcm9ncmFtcyB0aGF0IHdlcmUgYnVpbHQgaW4gdGhlIG11bHRpIGRpcmVjdG9yeSwgd2hlbiAnbWFrZSBpbnN0YWxsJyB3YXMKICB1c2VkLiA6LS8KClZlcnNpb24gNy45LjMKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAyKQotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBwZXJzaXN0YW5jeSBwcm9ibGVtIHdoZW4gZG9pbmcgSFRUUCBIRUFELCB0aGF0IG1hZGUKICBjdXJsICJoYW5nIiB1bnRpbCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgcHJvYmxlbSBoYXMKICBiZWVuIGludHJvZHVjZWQgaW4gNy45LjMgZHVlIHRvIGludGVybmFsIHJld3JpdGVzLCB0aGlzIHdhcyBub3QgcHJlc2VudCBpbgogIDcuOS4yLgoKVmVyc2lvbiA3LjkuMy1wcmU0CgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMikKLSBBbnRvbmlvIGZpbGVkIGJ1ZyByZXBvcnQgIzUwNTUxNCBhbmQgcHJvdmlkZWQgYSBmaXghIFdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzLCBsaWJjdXJsIHdvdWxkIGluY2x1ZGUgYW4gZXJyb3IgdGV4dCBpbiB0aGUgYWN0dWFsIHBvc3QgaWYgYQogIHNwZWNpZmllZCBmaWxlIHdhc24ndCBmb3VuZC4gVGhpcyBpcyBub3QgbGliY3VybCdzIGpvYi4gSW5zdGVhZCB3ZSBhZGQgYW4KICBlbXB0eSBwYXJ0LgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDIpCi0gUGxheWVkIGFyb3VuZCB3aXRoIHN0cmljdGVyIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBnY2MgKHdoZW4gLi9jb25maWd1cmUKICAtLWVuYWJsZS1kZWJ1ZyBpcyB1c2VkKSBhbmQgY2hhbmdlZCBzb21lIG1pbm9yIHRoaW5ncyB0byBzdG9wIHRoZSB3YXJuaW5ncy4KCi0gQ29tbWVudGVkIG91dCB0aGUgJ2xvbmcgbG9uZycgYW5kICdsb25nIGRvdWJsZScgY2hlY2tzIGluIGNvbmZpZ3VyZS5pbiwgYXMKICB3ZSBkb24ndCBjdXJyZW50bHkgdXNlIHRoZW0gYW55d2F5IGFuZCB0aGUgY29kZSBpbiBsaWIvbXByaW50Zi5jIHRoYXQgdXNlCiAgdGhlbSBjYXVzZXMgd2FybmluZ3MuCgotIFNhdWwgR29vZCBhbmQgam9uYXRhbiBwb2ludGVkIG91dCBNYWMgT1MgWCBidWlsZCBwcm9ibGVtcyB3aXRoIHByZTMgYW5kIGhvdwogIHRvIGNvcnJlY3QgdGhlbS4gVHdvIGNvbXBpbGVyIHdhcm5pbmdzIHdlcmUgcmVtb3ZlZCBhcyB3ZWxsLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHR3byBtaW5vciBtaW5ndzMyIGJ1aWxkaW5nIHByb2JsZW1zLgoKVmVyc2lvbiA3LjkuMy1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMikKLSBkb2NzL2xpYmN1cmwtdGhlLWd1aWRlIGlzIGEgbmV3IHR1dG9yaWFsIGZvciBvdXIgbGliY3VybCBwcm9ncmFtbWluZwogIGZyaWVuZHMuCgotIFJpY2hhcmQgQXJjaGVyIGJyb3VnaHQgYmFjayB0aGUgYWJpbGl0eSB0byBjb21waWxlIGFuZCBidWlsZCB3aXRoIE9wZW5TU0wKICB2ZXJzaW9ucyBiZWZvcmUgMC45LjUuCiAgW2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD0xMDA5NzYmYWlkPTUwNDE2MyZncm91cF9pZD05NzZdCgotIFRoZSBETlMgY2FjaGUgY29kZSBkaWRuJ3QgdGFrZSB0aGUgcG9ydCBudW1iZXIgaW50byBhY2NvdW50LCB3aGljaCBtYWRlIGl0CiAgd29yayByYXRoZXIgYmFkIG9uIElQdjYtZW5hYmxlZCBob3N0cyAoZXNwZWNpYWxseSB3aGVuIGRvaW5nIHBhc3NpdmUKICBGVFApLiBTdGVybGluZyBmaXhlZCBpdC4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDAyKQotIEdlb3JnIEhvcm4gY291bGQgbWFrZSBhIHRyYW5zZmVyIHRpbWUtb3V0IHdpdGhvdXQgZXJyb3IgdGV4dC4gSSBmb3VuZCBpdCBhbmQKICBjb3JyZWN0ZWQgaXQuCgotIFNTTCB3cml0ZXMgZGlkbid0IHdvcmssIHRoZXkgcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUgdGhhdCBjYXVzZWQKICBoYXZvYyBhbGwgb3Zlci4gR2VvcmcgSG9ybiBleHBlcmllbmNlZCB0aGlzLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN1cmxfdmVyc2lvbigpIGZ1bmN0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIE9wZW5TU0wKICBmdW5jdGlvbiBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4gVGhpcyB3YXksIGN1cmwgd2lsbCByZXBvcnQgdGhlIHZlcnNpb24gb2YKICB0aGUgU1NMIGxpYnJhcnkgYWN0dWFsbHkgcnVubmluZyByaWdodCBub3csIG5vdCB0aGUgb25lIHRoYXQgaGFkIGl0cyBoZWFkZXJzCiAgaW5zdGFsbGVkIHdoZW4gbGliY3VybCB3YXMgYnVpbHQuIE1haW5seSBpbnRlcnN0aW5nIHdoZW4gcnVubmluZyB3aXRoIHNoYXJlZAogIE9wZW5TU0wgbGlicmFyaWVzLgoKVmVyc2lvbiA3LjkuMy1wcmUyCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwMikKLSBNb2ZpZWQgdGhlIG1haW4gdHJhbnNmZXIgbG9vcCBhbmQgcmVsYXRlZCBzdHVmZiB0byBkZWFsIHdpdGggbm9uLWJsb2NraW5nCiAgc29ja2V0cyBpbiB0aGUgdXBsb2FkIHNlY3Rpb24uIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IHNlcGFyYXRlZCB0aGUKICBjb25uZWN0aW9uIG9yaWVudGVkIGJ1ZmZlcnMgdG8gaGF2ZSBvbmUgZm9yIGRvd25sb2FkcyBhbmQgb25lIGZvciB1cGxvYWRzCiAgKGFzIHR3byBjYW4gaGFwcGVuIHNpbXVsdGFuZW91c2x5KS4gSSBhbHNvIHNocnVuayB0aGUgYnVmZmVycyB0byAyMEsKICBlYWNoLiBBcyB3ZSBoYXZlIGEgc2NyYXRjaCBidWZmZXIgdHdpY2UgdGhlIHNpemUgb2YgdGhlIHVwbG9hZCBidWZmZXIsIHdlCiAgYXJyaXZlZCBhdCA4MEsgZm9yIGJ1ZmZlcnMgY29tcGFyZWQgd2l0aCB0aGUgcHJldmlvdXMgMTUwSy4KCi0gQWRkZWQgdGhlIC0tY2Mgb3B0aW9uIHRvIGN1cmwtY29uZmlnIGNvbW1hbmQgYXMgaXQgZW5hYmxlcyBzbyB2ZXJ5IGNvb2wKICBvbmUtbGluZXJzLiBIYXZlIGEgZ28gYSB0aGlzIG9uZSwgYnVpbGRpbmcgdGhlIHNpbXBsZS5jIGV4YW1wbGU6CgogICAgICAgICQgYGN1cmwtY29uZmlnIC0tY2MgLS1jZmxhZ3MgLS1saWJzYCAtbyBleGFtcGxlIHNpbXBsZS5jCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwMikKLSBJIG1hZGUgYWxsIHNvY2tldCByZWFkcyAocmVjdikgaGFuZGxlIEVXT1VMREJMT0NLLiBJIGhvcGUgbmljZWx5LiBOb3cgd2UKICBvbmx5IG5lZWQgdG8gYWRkcmVzcyBhbGwgd3JpdGVzIChzZW5kKSB0b28gYW5kIHRoZW4gSSdtIHJlYWR5IGZvciBhbm90aGVyCiAgcHJlLXJlbGVhc2UuLi4KCi0gU3RvbmVkIEVsaXBvdCBwYXRjaGVkIHRoZSBpbl9hZGRyX3QgY29uZmlndXJlIHRlc3QgdG8gbWFrZSBpdCB3b3JrIGJldHRlciBvbgogIG1vcmUgcGxhdGZvcm1zLgoKRGFuaWVsICg5IEphbnVhcnkgMjAwMikKLSBDcmlzIEJhaWxpZmYgZm91bmQgb3V0IHRoYXQgZmlsbGluZyB1cCBjdXJsJ3MgU1NMIHNlc3Npb24gY2FjaGUgY2F1c2VkIGEKICBjcmFzaCEKCi0gUG9zdGVkIHRoZSBjdXJsIHF1ZXN0aW9ubmFpcmUgb24gdGhlIHdlYiBzaXRlLiBJZiB5b3UgaGF2ZW4ndCBwb3N0ZWQgeW91cgogIG9waW5pb25zIHRoZXJlIHlldCwgZ28gdGhlcmUgYW5kIGRvIGl0IG5vdyB3aGlsZSBpdCBpcyBzdGlsbCB0aGVyZToKCiAgICAgICAgaHR0cDovL2N1cmwuaGF4eC5zZS9xLwoKLSBHZW9yZyBIb3JuIHF1aWNrbHkgZm91bmQgb3V0IHRoYXQgdGhlIFNTTCByZWFkaW5nIG5vIGxvbmdlciB3b3JrZWQgYXMKICBzdXBwb3NlZCBzaW5jZSB0aGUgc3dpdGNoIHRvIG5vbi1ibG9ja2luZyBzb2NrZXRzLiBJJ3ZlIG1hZGUgYSBxdWljayBwYXRjaAogIChmb3IgcmVhZGluZyBvbmx5KSBidXQgd2Ugc2hvdWxkIGltcHJvdmUgaXQgZXZlbiBmdXJ0aGVyLgoKVmVyc2lvbiA3LjkuMy1wcmUxCgpEYW5pZWwgKDcgSmFudWFyeSAyMDAyKQotIEkgbWFkZSB0aGUgJ2Jvb2wnIHR5cGVkZWYgdXNlIGFuICJ1bnNpZ25lZCBjaGFyIi4gSXQgbWFrZXMgaXQgdGhlIHNhbWUgb24KICBhbGwgcGxhdGZvcm1zLCBubyBtYXR0ZXIgd2hhdCB0aGUgcGxhdGZvcm0gdGhpbmtzIHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IKICBjaGFyIGlzLiBUaGlzIHdhcyBub3RpY2VkIHNpbmNlIHdlIG1hZGUgYSBzaWxseSBjb21wYXJpc29uIGludm9sdmluZyBzdWNoIGEKICBib29sIHZhcmlhYmxlLCBhbmQgb25seSBvbmUgY29tcGlsZXIvcGxhdGZvcm0gY29tYmluYXRpb24gKG9uIERlYmlhbiBMaW51eCkKICBjb21wbGFpbmVkIGFib3V0IGl0ICh0aGF0IGhhcHBlbmVkIHRvIGhhdmUgaXRzIGNoYXIgdW5zaWduZWQgYnkgZGVmYXVsdCkuCgotIEJ1ZyByZXBvcnQgIzQ5NTI5MCBpZGVudGlmaWVkIGEgY29va2llIHBhcnNpbmcgcHJvYmxlbSB0aGF0IHdhcyBjb3JyZWN0ZWQuCiAgV2hlbiBhIFNldC1Db29raWU6IGxpbmUgaXMgcmVjZWl2ZWQgd2l0aG91dCBhIHRyYWlsaW5nIHNlbWljb2xvbiwgbGliY3VybAogIGRpZG4ndCByZWFkIHRoZSBsYXN0ICJuYW1lPXZhbHVlIiBwYWlyIG9mIHRoZSBsaW5lLCBsZWFkaW5nIHRvIGNvbmZ1c2lvbnMuLi4KCi0gU3RlcmxpbmcgY29tbWl0dGVkIGhpcyB1cGRhdGVkIEROUyBjYWNoZSBjb2RlLgoKLSBJIHdvcmtlZCB3aXRoIEdlb3JnIEhvcm4gYW5kIGNvbW1lbnRzIGZyb20gR/Z0eiBCYWJpbi1FYmVsbCBhbmQgc3dpdGNoZWQKICBjdXJsJ3Mgc29ja2V0IG9wZXJhdGlvbnMgY29tcGxldGVseSBvdmVyIHRvIG5vbi1ibG9ja2luZyBmb3IgdGhlIGVudGlyZQogIG9wZXJhdGlvbiAocHJldmlvdXNseSB3ZSB1c2VkIG5vbi1ibG9ja2luZyBvbmx5IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSkuCiAgV2UgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UgdGltZW91dCBwcm9wZXJseSB3aXRob3V0CiAgdGhlIHVzZSBvZiBzaWduYWxzLiBBIGxpdHRsZSBleHRyYSBjb2RlIHRvIGRlYWwgd2l0aCB0aGlzIHdhcyBhZGRlZC4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIHNsaWdodGx5IG9ic2N1cmUgY29va2llIGVuZ2luZSBmbGF3LgoKLSBQZXRlIFN1IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgdHJlYXQgSFRUUCBjb2RlIDIwNCBhcyBpdCBzaG91bGQuCiAgMjA0LXJlcGxpZXMgbmV2ZXIgcHJvdmlkZXMgYSByZXNwb25zZS1ib2R5LiBUaGlzIHJlc3VsdGVkIGluIGJhZCBwZXJzaXN0YW50CiAgYmVoYXZpb3Igd2hlbiAyMDQgd2FzIHJlY2VpdmVkLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMikKLSBTTSB1cGRhdGVkIHRoZSBWQysrIGxpYnJhcnkgTWFrZWZpbGVzIGZvciB0aGUgbmV3IHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDIpCi0gSSBkaXNjb3ZlcmVkIHRoYXQgd2Ugd3JvbmdseSB1c2VkIGluZXRfbnRvYSgpIChpbnN0ZWFkIG9mIGluZXRfbnRvYV9yKCkgaW4KICB0d28gcGxhY2VzIGluIHRoZSBzb3VyY2UgY29kZSkuIE9uZSBoYXBwZW5lZCB3aXRoIFZFUkJPU0Ugc2V0IG9uIGNvbm5lY3RzLAogIGFuZCB0aGUgb3RoZXIgd2hlbiBWRVJCT1NFIHdhcyBvbiBhbmQga3JiNCBvdmVyIG5hdCB3YXMgdXNlZC4uLiBJIGhvbmVzdGx5CiAgZG9uJ3QgdGhpbmsgYW55b25lIGhhcyBzdWZmZXJlZCBmcm9tIHRoZXNlIG1pc3Rha2VzLgoKLSBJIHJlcGxhY2VkIGEgbG90IG9mIHNpbGx5IG9jY3VyYW5jZXMgb2YgcHJpbnRmKCkgdG8gaW5zdGVhZCB1c2UgdGhlIG1vcmUKICBhcHByb3ByaWF0ZSBDdXJsX2luZm9mKCkgb3IgQ3VybF9mYWlsZigpLiBUaGUga3JiNCBhbmQgdGVsbmV0IGNvZGUgd2VyZQogIGFmZmVjdGVkLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgZmV3IG1vcmUgcHJvYmxlbXMgd2l0aCA2NC1iaXQgYXJjaHMgKHRoZSA2NC1iaXQKICBzcGFyYyBvbiBzb2xhcmlzIDgpLgoKLSBBZnRlciBkaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggUmFvdWwgQ3JpZGxpZywgSSBqdXN0IG1hZGUgRlRQCiAgcmVzcG9uc2UgbGluZXMgZ2V0IHBhc3NlZCB0byB0aGUgaGVhZGVyIGNhbGxiYWNrIGlmIHN1Y2ggYSBvbmUgaXMKICByZWdpc3RlcmVkLiBJdCdsbCBtYWtlIGl0IHBvc3NpYmxlIGZvciBhbnkgYXBwbGljYXRpb24gdG8gZ2V0IGFsbCB0aGUKICByZXNwb25zZXMgYW4gRlRQIHNlcnZlciBzZW5kcyB0byBsaWJjdXJsLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMikKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBhIGZldyBidWNrZXRzIG9mIGNvZGUuIE5vdywgbGliY3VybCB3aWxsCiAgYXV0b21hdGljYWxseSBjYWNoZSBETlMgbG9va3VwcyBhbmQgcmUtdXNlIHRoZSBwcmV2aW91cyByZXN1bHRzIGZpcnN0IGlmIGFueQogIHN1Y2ggaXMgYXZhaWxhYmxlLiBJdCBncmVhdGx5IGltcHJvdmVzIHNwZWVkIHdoZW4gZG9pbmcgbWFueSByZXBlYXRlZAogIG9wZXJhdGlvbnMgdG8gdGhlIHNhbWUgaG9zdC4KCi0gQXMgdGhlIHRlc3QgY2FzZSB1c2VzIC0taW5jbHVkZSBhbmQgdGhlbiAtLWhlYWQsIEkgaGFkIHRvIG1vZGlmeSBzcmMvbWFpbi5jCiAgdG8gZGVhbCB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciB0aGFuIHByZXZpb3VzbHkuIFdoZW4gZG9uZSwgd2UKICBoYXZlIDEwMCUgZ29vZCB0ZXN0cyBhZ2FpbiBpbiB0aGUgbWFpbiBicmFuY2guCgpEYW5pZWwgKDIgSmFudWFyeSAyMDAyKQotIE1hZGUgdGVzdCBjYXNlIDI1IHJ1biBhZ2FpbiBpbiB0aGUgbXVsdGktZGV2IGJyYW5jaC4gQnV0IGl0IHNlZW1zIHRoYXQgdGhlCiAgY2hhbmdlcyBkb25lIG9uIGRlYy0yMCBtYWRlIHRlc3QgY2FzZSAxMDQgY2Vhc2UgdG8gd29yayAoaW4gYm90aCBicmFuY2hlcykuCgotIFBoaWxpcCBHbGFkc3RvbmUgcG9pbnRlZCBvdXQgYSBmZXcgcG9ydGFiaWxpdHkgcHJvYmxlbXMgaW4gdGhlIHNvdXJjZSBjb2RlCiAgdGhhdCBkaWRuJ3QgY29tcGlsZSBvbiA2NC1iaXQgc3BhcmNzIHVzaW5nIFN1bidzIG5hdGl2ZSBjb21waWxlci4KRGFuaWVsICgyMCBEZWNlbWJlciAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNhdWdodCBhbiB1bnBsZWFzZW50IChidXQgaGFyZC10by1maW5kKSBidWcgdGhhdCBjb3VsZCBjYXVzZQogIGxpYmN1cmwgdG8gaGFuZyBvbiB0cmFuc2ZlcnMgb3ZlciBwcm94eSwgd2hlbiB0aGUgcHJveHkgd2FzIHNwZWNpZmllZCB3aXRoCiAgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUhCgotIEFkZGVkIGNvZGUgdG8gbWFrZSBmdHAgb3BlcmF0aW9ucyB0cmVhdCB0aGUgTk9fQk9EWSBhbmQgSEVBREVSUyBvcHRpb25zCiAgYmV0dGVyOgoKICAgTk9fQk9EWSBzZXQgVFJVRSBhbmQgSEVBREVSUyBzZXQgVFJVRToKICAgIFJldHVybiBhIHNldCBvZiBoZWFkZXJzIHdpdGggZmlsZSBpbmZvCgogICBOT19CT0RZIHNldCBGQUxTRQogICAgVHJhbnNmZXIgZGF0YSBhcyB1c3VhbCwgSEVBREVSUyBpcyBpZ25vcmVkCgogICBOT19CT0RZIHNldCBUUlVFIGFuZCBIRUFERVJTIHNldCBGQUxTRQogICAgRG9uJ3QgdHJhbnNmZXIgYW55IGRhdGEsIGRvbid0IHJldHVybiBhbnkgaGVhZGVycy4gSnVzdCBwZXJmb3JtIHRoZSBzZXQKICAgIG9mIEZUUCBjb21tYW5kcy4KCkRhbmllbCAoMTcgRGVjZW1iZXIgMjAwMSkKLSBH9nR6IEJhYmluLUViZWxsIGRvdmUgaW50byB0aGUgZGFyayBkdW5nZW9ucyBvZiB0aGUgT3BlblNTTCBFTkdJTkUgc3R1ZmYgYW5kCiAgbWFkZSBsaWJjdXJsIHN1cHBvcnQgaXQhIFRoaXMgYWxsb3dzIGxpYmN1cmwgdG8gZG8gU1NMIGNvbm5lY3Rpb25zIHdpdGggdGhlCiAgcHJpdmF0ZSBrZXkgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLgoKICBUbyBtYWtlIHRoaXMgZ29vZCwgaGUgaGFkIHRvIGFkZCBhIGJ1bmNoIG9mIG5ldyBsaWJyYXJ5IG9wdGlvbnMgdGhhdCdsbCBiZQogIHVzZWZ1bCB0byBvdGhlcnMgYXMgd2VsbDoKCiAgIENVUkxPUFRfU1NMQ0VSVFRZUEUgIHNldCBTU0wgY2VydCB0eXBlIChQRU0vREVSKQogICBDVVJMT1BUX1NTTEtFWSAgICAgICBzZXQgU1NMIHByaXZhdGUga2V5IChmaWxlKQogICBDVVJMT1BUX1NTTEtFWVRZUEU6ICBzZXQgU1NMIGtleSB0eXBlIChQRU0vREVSL0VORykKICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0Q6IHNldCB0aGUgcGFzc3BocmFzZSBmb3IgeW91ciBwcml2YXRlIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgIChDVVJMT1BUX1NTTENFUlRQQVNTV0QgaXMgYW4gYWxpYXMpCiAgIENVUkxPUFRfU1NMRU5HSU5FOiAgIHNldCB0aGUgbmFtZSBvZiB0aGUgY3J5cHRvIGVuZ2luZQogICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJucyBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5EIG9uIGVycm9yKQogICBDVVJMT1BUX1NTTEVOR0lORV9ERUZBVUxUOiBzZXQgdGhlIGRlZmF1bHQgZW5naW5lCgogIFRoZXJlIGFyZSB0d28gbmV3IGZhaWx1cmUgY29kZXM6CgogICBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5ECiAgIENVUkxFX1NTTF9FTkdJTkVfU0VURkFJTEVECgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDEpCi0gV2UgaGF2ZSAiYnJhbmNoZWQiIHRoZSBzb3VyY2UtdHJlZSBhdCBhIGZldyBwbGFjZXMuIENoZWNrb3V0IHRoZSBDVlMgc291cmNlcwogIHdpdGggdGhlICdtdWx0aS1kZXYnIGxhYmVsIHRvIGdldCB0aGUgbGF0ZXN0IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudAogIHRyZWUuIFRoZSBpZGVhIGlzIHRvIG9ubHkgYnJhbmNoIGFmZmVjdGVkIGZpbGVzIGFuZCB0byByZXN0cmljdCB0aGUgYnJhbmNoCiAgdG8gdGhlIHY4IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudCBvbmx5LgoKICAqTk9URSogdGhhdCBpZiB3ZSBnZXQgYnVnIHJlcG9ydHMgYW5kIHBhdGNoZXMgZXRjLCB3ZSBtaWdodCBuZWVkIHRvIGFwcGx5CiAgdGhlbSBpbiBib3RoIGJyYW5jaGVzIQoKICBUaGUgbXVsdGktZGV2IGJyYW5jaCBpcyB3aGF0IHdlIGFyZSBnb25uYSB1c2UgYXMgbWFpbiBicmFuY2ggaW4gdGhlIGZ1dHVyZQogIGlmIGl0IHR1cm5zIG91dCBzdWNjZXNzZnVsLiBUaHVzLCB3ZSBtdXN0IG1haW50YWluIGJvdGggbm93IGluIGNhc2Ugd2UgbmVlZAogIHRoZW0uIFRoZSBjdXJyZW50IG1haW4gYnJhbmNoIHdpbGwgYmUgdXNlZCBpZiB3ZSB3YW50IHRvIHJlbGVhc2UgYSA3LjkuMyBvcgogIHBlcmhhcHMgYSA3LjEwIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gOC4gV2hpY2ggaXMgdmVyeSBsaWtlbHkuCgotIE1hcmN1cyBXZWJzdGVyIHByb3ZpZGVkIGNvZGUgZm9yIHRoZSBuZXcgQ1VSTEZPUk1fQ09OVEVOVEhFQURFUiBvcHRpb24gZm9yCiAgY3VybF9mb3JtYWRkKCksIHRoYXQgbGV0cyBhbiBhcHBsaWNhdGlvbiBhZGQgYSBzZXQgb2YgaGVhZGVycyBmb3IgdGhhdAogIHBhcnRpY3VsYXIgcGFydCBpbiBhIG11bHRpcGFydC9mb3JtLXBvc3QuIEhlIGFsc28gcHJvdmlkZWQgYSBzZWN0aW9uIHRvIHRoZQogIG1hbiBwYWdlIHRoYXQgZGVzY3JpYmVzIHRoZSBuZXcgb3B0aW9uLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAxKQotIEJlbiBHcmVlYXIgbWFkZSBtZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBDdXJsX2ZhaWxmKCkgdXNhZ2UgaW50ZXJuYWxseQogIHdhcyBhIGJpdCBzbG9wcHkgd2l0aCBhZGRpbmcgbmV3bGluZXMgb3Igbm90IHRvIHRoZSBlcnJvciBtZXNzYWdlcy4gTGV0J3MKICBvbmNlIGFuZCBmb3IgYWxsIHNheSB0aGF0IHRoZXkgZG8gbm90IGJlbG9uZyB0aGVyZSEKCi0gV2hlbiB1cGxvYWRpbmcgZmlsZXMgd2l0aCAtVCB0byBnaXZlIGEgbG9jYWwgZmlsZSBuYW1lLCBhbmQgeW91IGVuZCB0aGUgVVJMCiAgd2l0aCBhIHNsYXNoIHRvIGhhdmUgdGhlIGxvY2FsIGZpbGUgbmFtZSB1c2VkIHJlbW90ZSB0b28sIHdlIG5vdyBubyBsb25nZXIKICB1c2UgdGhlIGxvY2FsIGRpcmVjdG9yeSBhcyB3ZWxsLiBPbmx5IHRoZSBmaWxlIHBhcnQgb2YgdGhlIC1UIGZpbGUgbmFtZQogIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzbGFzaCBpbiB0aGUgVVJMLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDEpCi0gTWljaGFsIEJvbmlubyBwb2ludGVkIG91dCB0aGF0IERpZ2l0YWwgVW5peCBkb2Vzbid0IGhhdmUgZ210aW1lX3Igc28gdGhlCiAgbGluayBmYWlsZWQuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGFuZCBjb3JyZWN0ZWQgc291cmNlIGNvZGUuCgpWZXJzaW9uIDcuOS4yCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMSkKLSBKb24gVHJhdmlzIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIGxpYmN1cmwgYW5kIENVUkxPUFRfVVBMT0FEIGFuZCB0aGVuCiAgb24gdGhlIHNhbWUgaGFuZGxlIHVzZWQgQ1VSTE9QVF9IVFRQR0VUIGl0IHdvdWxkIHN0aWxsIGF0dGVtcHQgdG8gdXBsb2FkLgogIEhpcyBzdWdnZXN0ZWQgZml4IHdhcyBwZXJmZWN0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDEpCi0gSW5jb3Jwb3JhdGVkIG1vcmUgbWFjb3MgZml4ZXMgYW5kIGFkZGVkIGZvdXIgc3BlY2lmaWMgZmlsZXMgaW4gYSBuZXcKICBzdWJkaXJlY3RvcnkgYmVsb3cgc3JjLgoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lIHJlcG9ydGVkIHR3byBwcm9ibGVtczoKCiAgRmlyc3Qgb25lIGluIHRoZSBjdXJsX3N0cm5lcXVhbCgpIGZ1bmN0aW9uLiBJIHRoaW5rIHRoaXMgcHJvYmxlbSBpcyByYXRoZXIKICBtYWNvcyA5IHNwZWNpZmljLCBhcyBtb3N0IHBsYXRmb3JtIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gdXNlIGluc3RlYWQgb2YgdGhlCiAgb25lIHByb3ZpZGVkIGJ5IGxpYmN1cmwuCgogIEEgc2Vjb25kLCBtb3JlIGltcG9ydGFudCwgd2FzIGluIHRoZSB3YXkgd2UgdGFrZSBjYXJlIG9mIEZUUCByZXNwb25zZXMuIFRoZQogIGNvZGUgd291bGQgcmVhZCBhIGxhcmdlIGNodW5rIG9mIGRhdGEgYW5kIHNlYXJjaCBmb3IgdGhlIGVuZC1vZi1yZXNwb25zZQogIGxpbmUgd2l0aGluIHRoYXQgY2h1bmsuIFdoZW4gZm91bmQsIGl0IHdvdWxkIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUKICBkYXRhLiBIb3dldmVyLCB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb25zIGFyZSBzcGVjaWFsLCBvciBwZXJoYXBzIHRoZQogIHNlcnZlciBpcywgd2UgY291bGQgYWN0dWFsbHkgZ2V0IG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgaW4gdGhhdCBjaHVuayBvZgogIGRhdGEgc28gdGhhdCB3aGVuIHRoZSBuZXh0IGludm9rZSB0byB0aGlzIGZ1bmN0aW9uIHdhcyBkb25lLCB0aGUgcmVzcG9uc2UKICBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYW5kIHRocm93biBhd2F5LiBOb3csIHdlIGNhY2hlIHRoZSBkYXRhIG5vdCB1c2VkIGluCiAgb25lIGNhbGwsIGFzIGl0IGNvdWxkIGJlIHVzZWZ1bCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsLiBUZXN0IGNhc2UgMTI2IHdhcwogIGFkZGVkIGFuZCB0aGUgdGVzdCBmdHAgc2VydmVyIG1vZGlmaWVkLCB0byBleGVyY2lzZSB0aGlzIHBhcnRpY3VsYXIgY2FzZS4KClZlcnNpb24gNy45LjItcHJlOAoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDEpCi0gQnVnIHJlcG9ydCAjNDg3ODI1IGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgYW5kCiAgZm9sbG93aW5nIGEgcmVkaXJlY3Rpb24gZnJvbSBIVFRQIHRvIEhUVFBTLiBsaWJjdXJsIHRoZW4gcmUtdXNlZCB0aGUgc2FtZQogIHByb3h5IGNvbm5lY3Rpb24gYnV0IHdpdGhvdXQgZG9pbmcgYSBwcm9wZXIgSFRUUFMgcmVxdWVzdC4KCi0gRml4ZWQgd2luMzIgY29tcGlsaW5nIHF1aXJrcy4KClZlcnNpb24gNy45LjItcHJlNwoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAxKQotIERvY3VtZW50ZWQgLS1kaXNhYmxlLWVwc3YgYW5kIENVUkxPUFRfRlRQX1VTRV9FUFNWLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAxKQotIEFkZGVkIC0tZGlzYWJsZS1lcHN2IGFzIGFuIG9wdGlvbi4gV2hlbiB1c2VkLCBjdXJsIHdvbid0IGF0dGVtcHQgdG8gdXNlIHRoZQogIEVQU1YgY29tbWFuZCB3aGVuIGRvaW5nIHBhc3NpdmUgRlRQIGRvd25sb2Fkcy4gV3JvdGUgYSB0ZXN0IGNhc2UgZm9yIGl0LgoKLSBFcmljIHByb3ZpZGVkIGEgZmV3IG1vcmUgZml4ZXMgZm9yIGJ1aWxkaW5nIG9uIE1hY3MuIEhlIGFsc28gcG9pbnRlZCBvdXQKICBhIGZsYXcgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHJlc3RvcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDEpCi0gRmlkZGxlZCB3aXRoIHNvbWUgVHJ1NjQgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgRGltaXRyaXMgU2FycmlzLiBUaGV5IGFwcGVhcmVkCiAgb25seSB3aGVuIHVzaW5nIFZFUkJPU0UgZnRwIHRyYW5zZmVycy4gRG8gd2UgdXNlIGEgdG9vIHNtYWxsIGJ1ZmZlciBmb3IKICBnZXRob3N0YnlhZGRyX3IoKSwgd2FzIHRoZSBsYWNrIG9mIHVzaW5nIGluX2FkZHJfdCB3cm9uZyBvciBpcyBpdCB0aGF0IHRoZQogIGhvc3RlbnQgc3RydWN0IG11c3QgYmUgYmxhbmtlZCBiZWZvcmUgdXNlPyBXaXRoIERpbWl0cmlzIGhlbHAgYW5kIHRoZXNlCiAgcGF0Y2hlcywgdGhlIHByb2JsZW1zIHNlZW0gdG8gYmUgaGlzdG9yeS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQU1Ygd2FzIGFkZGVkIGFuZCBjYW4gYmUgc2V0IHRvIEZBTFNFIHRvIHByZXZlbnQgbGliY3VybAogIGZyb20gdXNpbmcgdGhlIEVQU1YgY29tbWFuZCBiZWZvcmUgdHJ5aW5nIHRoZSBub3JtYWwgUEFTVi4gSGVpa2tpIEtvcnBlbGEKICBwb2ludGVkIG91dCB0aGF0IHNvbWUgZmlyZXdhbGxzIGFuZCBzaW1pbGFyIGRvbid0IGxpa2UgdGhlIEVQU1Ygc28gd2UgbXVzdAogIGJlIGFibGUgdG8gc2h1dCBpZiBvZmYgdG8gd29yayBldmVyeXdoZXJlLgoKLSBJIGFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciAnaW5fYWRkcl90JyBhbmQgbWFkZSB0aGUgZnRwIGNvZGUgdXNlIHRoYXQgdG8KICByZWNlaXZlIHRoZSBpbmV0X2FkZHIoKSByZXR1cm4gY29kZSBpbi4gV29ya3Mgb24gU29sYXJpcyBhbmQgTGludXggYXQKICBsZWFzdC4gVGhlIExpbnV4IG1hbiBwYWdlIGZvciBpbmV0X2FkZHIoKSBkb2Vzbid0IGV2ZW4gbWVudGlvbiBpbl9hZGRyX3QuLi4KCi0gQWRqdXN0ZWQgKGFsbW9zdCkgYWxsIEZUUCB0ZXN0cyB0byB0aGUgbmV3IGNvbW1hbmQgc2VxdWVuY2UuCgotIEZUUCBjb21tYW5kIHNlcXVlbmNlIGNoYW5nZXM6CgogIEVQU1YgaXMgbm93IGFsd2F5cyBhdHRlbXB0ZWQgYmVmb3JlIFBBU1YuIEl0IGlzIHRoZSBmaW5hbCB0b3VjaCB0byBtYWtlIElQdjYKICBwYXNzaXZlIEZUUCBkb3dubG9hZHMgdG8gd29yaywgYnV0IEVQU1YgaXMgbm90IHJlc3RyaWN0ZWQgdG8gSVB2NiBidXQgd29ya3MKICBmaW5lIHdpdGggSVB2NCB0b28gb24gdGhlIHNlcnZlcnMgdGhhdCBzdXBwb3J0IGl0LgoKICBTSVpFIGlzIG5vdyBhbHdheXMgaXNzdWVkIGJlZm9yZSBSRVRSLiBJdCBtYWtlcyBjdXJsIGtub3cgdGhlIGFjdHVhbAogIGRvd25sb2FkIHNpemUgYmVmb3JlIHRoZSBkb3dubG9hZCB0YWtlcyBwbGFjZSwgYXMgaXQgbWFrZXMgaXQgbGVzcyBpbXBvcnRhbnQKICB0byBmaW5kIHRoZSBzaXplIHNlbnQgaW4gUkVUUiByZXNwb25zZXMuIE1hbnkgc2l0ZXMgZG9uJ3QgaW5jbHVkZSB0aGUgc2l6ZQogIGluIHRoZXJlLgoKICBCb3RoIHRoZXNlIGNoYW5nZXMgbWFkZSBpdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlcgogIGNvZGUsIGFuZCBhbGwgRlRQIHRlc3QgY2FzZXMgbmVlZCB0byBiZSBjaGVja2VkIGFuZCBhZGp1c3RlZCEKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBIYW5zIFN0ZWVnZXJzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlbG5ldCBjb2RlIHJlYWQgZnJvbSBzdGRvdXQsIG5vdCBzdGRpbgogIGFzIGl0IGlzIHN1cHBvc2VkIHRvIGRvIQoKVmVyc2lvbiA3LjkuMi1wcmU2CgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lJ3MgbWlub3IgY2hhbmdlcyB0byBidWlsZCBvbiBNYWNPUyBiZWZvcmUgT1MgWCB3ZXJlIGFwcGxpZWQuCgotIGdyZWVwIGF0IG1pbmRzcHJpbmcuY29tIHByb3ZpZGVkIGEgbWFpbiBpbmRleC5odG1sIHBhZ2UgZm9yIG91ciByZWxlYXNlCiAgYXJjaGl2ZSBkb2NzIGRpcmVjdG9yeS4gSXQganVzdCBsaW5rcyB0byBhbGwgdGhlIGV4aXN0aW5nIEhUTUwgZmlsZXMsIGJ1dAogIEkgdGhpbmsgaXQgbWF5IGNvbWUgdXNlZnVsIHRvIHBlb3BsZS4KCi0gVGhlcmUncyBub3cgc29tZSBpbml0aWFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgRVBTViBGVFAgY29tbWFuZC4gVGhhdCBzaG91bGQKICBiZSB1c2VkIHRvIGRvIHBhc3NpdmUgdHJhbnNmZXJzIElQdjYtc3R5bGUuIFRoZSBjb2RlIGlzIHN0aWxsICNpZiAwJ2VkIGluCiAgbGliL2Z0cC5jIGFzIEkgaGF2ZSBubyBJUHY2IGZ0cCBzZXJ2ZXIgdG8gdGVzdCB0aGlzIHdpdGguCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDEpCi0gUm9iZXJ0IFNjaGxhYmJhY2ggaGFkIHByb2JsZW1zIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHJlc3VtZWQgdHJhbnNmZXJzLAogIGFuZCBJIGNsYXJpZmllZCB0aGUgbWFuIHBhZ2UgLUMgc2VjdGlvbiBzb21ld2hhdC4KClZlcnNpb24gNy45LjItcHJlNQoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAxKQotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIG91dCB0byB0cmFjayBkb3duIHRoZSByb290cyBvZiBidWcgcmVwb3J0ICM0Nzk1MzcsCiAgd2hpY2ggd2FzIGNvbmNlcm5pbmcgY3VybCByZXR1cm5pbmcgdGhlIHdyb25nIGVycm9yIGNvZGUgd2hlbiBmYWlsaW5nIHRvCiAgY29ubmVjdC4gVGhpcyBkaWRuJ3QgaGFwcGVuIG9uIGFsbCBzeXN0ZW1zLCBhbmQgbW9yZSBzcGVjaWZpY2x5IEkndmUgc28gZmFyCiAgb25seSBzZWVuIHRoaXMgaGFwcGVuIG9uIElQdjQtb25seSBMaW51eCBob3N0cy4KCi0gSSBhcHBsaWVkIHRoZSBmaXhlcyBmb3IgdGhlIHR3byBidWdzIEVyaWMgTGF2aWduZSBmb3VuZCB3aGVuIGRvaW5nIGhpcyBNYWNPUwogIHBvcnQuIEEgbWlzc2luZyBjb21tYSBpbiBhcnBhX3RlbG5ldC5oIGFuZCBhIHByZXR0eSB3aWxkIHdyaXRlIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgd3JpdGUgaXMgaG93ZXZlciBsaWtlbHkgdG8gb2NjdXIgaW4gb3VyCiAgb3duIGJ1ZmZlciB1bmxlc3MgdmVyeSBiaWcgRlRQIHNlcnZlciByZXBsaWVzICg+MjVLKSBhcmUgcmVhZC4gSSd2ZSBuZXZlcgogIHNlZW4gc3VjaCBhIHJlcGx5IGV2ZXIsIHNvIEkgdGhpbmsgdGhpcyBpcyBhIHJlbGF0aXZlbHkgbWlub3Igcmlzay4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMSkKLSBNb29uZXNhbXkgcHJvdmlkZWQgY29kZSB0byBwcmV2ZW50IGp1bmsgZnJvbSBiZWluZyBvdXRwdXQgd2hlbiBsaWJjdXJsCiAgcmV0dXJucyBhbiBlcnJvciBjb2RlIGJ1dCBubyBlcnJvciBkZXNjcmlwdGlvbiBhbmQgdGhhdCBjb3JyZWN0cyBob3cgbWFrZSBpcwogIHJ1biBpbiB0aGUgTWFrZWZpbGUuZGlzdCBmaWxlICh0aGF0IGFwcGVhcnMgYXMgcm9vdCBNYWtlZmlsZSBpbiByZWxlYXNlCiAgYXJjaGl2ZXMpLgoKLSBFcmljIExhdmlnbmUgbWFpbGVkIG1lIGJ1Z2ZpeGVzIGFuZCBwYXRjaGVzIGZvciBidWlsZGluZyBsaWJjdXJsIG9uIE1hY09TCiAgKG5vbi1YKS4KCi0gS2V2aW4gUm90aCBtb2RpZmllZCB0aGUgY3lnd2luIGZpbGVzIG9uY2UgYWdhaW4sIG5vdyB0byBidWlsZCBhZ2FpbnN0IHRoZQogIHNoYXJlZCBPcGVuU1NMIERMTHMuCgpWZXJzaW9uIDcuOS4yLXByZTQKCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMSkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FLAogIGNvbXBsZXRlIHdpdGggbWFuIHBhZ2UgdXBkYXRlcyEKCkRhbmllbCAoMTkgTm92ZW1iZXIgMjAwMSkKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIGRldGFpbHMgZW5vdWdoIHRvIHVwZGF0ZSB0aGUgQm9ybGFuZCBtYWtlZmlsZQogIHByb3Blcmx5LgoKLSBMYXJzIE0gR3VzdGFmc3NvbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCBmcmVlKCkuIEluIGZhY3QsIGl0IHdhcyBzbyBiYWQgSSdtCiAgYW1hemVkIHdlIG5ldmVyIHNhdyB0aGlzIGJlZm9yZSEKCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gTWFrZmlsZS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwMSkKLSBLbGV2dHNvdiBWYWRpbSBmaXhlZCBhIGJ1ZyBpbiBob3cgdGltZS1jb25kaXRpb25hbHMgd2VyZSBzZW50IHdoZW4gZG9pbmcKICBIVFRQLgoKVmVyc2lvbiA3LjkuMi1wcmUzCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDEpCi0gU2FtdWVsIExpc3RvcGFkIHBhdGNoZWQgYXdheSB0aGUgcHJvYmxlbSB3aXRoIFNTTCB3ZSBnb3Qgd2hlbiBzb21lb25lIGNhbGwKICBjdXJsX2dsb2JhbF9pbml0KCkgPT4gY3VybF9nbG9iYWxfY2xlYW51cCgpID0+IGN1cmxfZ2xvYmFsX2luaXQoKS4gVGhlCiAgc2Vjb25kIGluaXQgd291bGQgbm90ICJ0YWtlIiBhbmQgU1NMIHdvdWxkIGJlIHVudXNhYmxlIHdpdGggY3VybCBmcm9tIHRoYXQKICBwb2ludC4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgZmFjdCB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHdheSBpcwogIHdyb25nLiBjdXJsX2dsb2JhbF9pbml0KCkgc2hvdWxkIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYW5kIG5vdCBtb3JlLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAxKQotIEZpeGVkIHNvbWUgbWlub3IgdmFyaWFibGUgdHlwZSBtaXh1cHMgaW4gZnRwLmMgdGhhdCBjYXVzZWQgY29tcGlsZXIgd2FybmluZ3MKICBvbiBIUC1VWCAxMS4wMC4KCi0gVGhlIEZUUCBmaXggSSBkaWQgeWVzdGVyZGF5IHVzZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB0aGF0IGNhdXNlZAogIHNwdXJpb3VzIGVycm9ycyB3aGVuIGRvaW5nIEZUUC4KClZlcnNpb24gNy45LjItcHJlMgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJpY2FyZG8gQ2FkaW1lIGZlbGwgb3ZlciBhIG11bHRpcGxlLXJlcXVlc3RzIHByb2JsZW0gd2hlbiBmaXJzdCBhIEZUUAogIGRpcmVjdG9yeSBmZXRjaCBmYWlsZWQgYW5kIHRoZW4gYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIGFmdGVyIHRoYXQuIFRoZQogIHNlY29uZCByZXF1ZXN0IGhhcHBlbmVkIHRvIGdldCB0aGUgRlRQIHNlcnZlciByZXNwb25zZSBiYWNrIGZyb20gdGhlCiAgcHJldmlvdXMgcmVxdWVzdCwgd2hlbiBpdCBkaWQgaXRzIGluaXRpYWwgQ1dEIGNvbW1hbmQuCgotIEJqb3JuIFJlZXNlIHBvaW50ZWQgb3V0IHRoYXQgd2UgY291bGQgaW1wcm92ZSB0aGUgdGltZSBkaWZmIGZ1bmN0aW9uIHRvCiAgcHJldmVudCB0cnVuY2F0aW9uIGEgYml0LgoKLSBLYWktVXdlIFJvbW1lbCBtYWRlIG1lIGF3YXJlIHRoYXQgLXAgKGh0dHAgcHJveHkgdHVubmVsKSBzaWxseSBlbm91Z2ggZGlkbid0CiAgd29yayBmb3IgcGxhaW4gSFRUUCByZXF1ZXN0cyEgU28gSSBtYWRlIHRoYXQgd29yay4KClZlcnNpb24gNy45LjItcHJlMQoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJld3JvdGUgdGhlIEN1cmxfQ29ubmVjdEhUVFBQcm94eVR1bm5lbCgpLiBJdCBzaG91bGQgbm93IG5vdCBvbmx5IHdvcmsgYSBsb3QKICBmYXN0ZXIsIGl0IHNob3VsZCBhbHNvIHN1cHBvcnQgc3VjaCAoImJyb2tlbiIpIHByb3hpZXMgdGhhdCBKb2huIExhc2sKICBwcmV2aW91c2x5IGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aC4gSGlzIHByb3h5IHNlbmRzIGEgdHJhaWxpbmcgemVybyBieXRlCiAgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgKHByb3h5LSkgaGVhZGVycy4gSSd2ZSB0ZXN0ZWQgdGhpcyBteXNlbGYgYW5kIGl0IHNlZW1zCiAgdG8gd29yayBvbiBhIHByb3h5IHRoZSBwcmV2aW91cyB2ZXJzaW9uIGFsc28gd29ya2VkIHdpdGguLi4hIFRoaXMgcmV3cml0ZSBpcwogIGR1ZSB0byB0aGUgcHJvYmxlbXMgSm9obiBMYXNrIHByZXZpb3VzbHkgZXhwZXJpZW5jZWQuCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgImN1cnJlbnQgc3BlZWQiIG1ldGVyIHNvbWV0aW1lcyBzaG93ZWQgMjA0OEsKICBmb3IgdmVyeSBxdWljayB0cmFuc2ZlcnMuIEl0IHR1cm5lZCBvdXQgdGhlICJ0aW1lIGRpZmYiLWZ1bmN0aW9uIHJldHVybmVkIGEKICB6ZXJvIG1pbGxpc2Vjb25kIGRpZmYuIFdlIG5vdyBhbHdheXMgc2F5IGl0IGlzIGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCEgSW4KICByZWFsaXR5LCB0aGVzZSB0aW1lcnMgdmVyeSByYXJlbHkgaGF2ZSB0aGF0IGdvb2QgcmVzb2x1dGlvbiBzbyBldmVuIHRob3VnaAogIHRoZSB0aW1lIGRpZmYgd2FzIGxvbmdlciB0aGFuIDEgbWlsbGlzZWNvbmQsIGl0IHdhcyByZXBvcnRlZCBhcyBubyBkaWZmLgoKLSBJIGFsc28gbW9kaWZpZWQgdGhlIGdldGluZm8oKSBhZ2FpbiB3aGVuIHJldHVybmluZyB0aW1lcywgYXMgUGF1bCBIYXJyaW5ndG9uCiAgcmVwb3J0cyB0aGF0IDcuOS4xIG9ubHkgcmV0dXJucyB0aW1lcyB3aXRoIDEgc2Vjb25kIGFjY3VyYWN5LCB3aGljaCBpbmRlZWQKICBpcyB3cm9uZy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDAxKQotIE1hcmN1cyBXZWJzdGVyIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCgpIGNvdWxkIHJlYWQgb25lIGJ5dGUgb3V0c2lkZSBhCiAgYnVmZmVyIGJvdW5kYXJ5LCB3aGljaCB0aGVuIG9mIGNvdXJzZSBjb3VsZCBsZWFkIHRvIGEgY3Jhc2guIE1hcmN1cyBhbHNvCiAgZ3JhY2VmdWxseSBwcm92aWRlZCBhIHBhdGNoIGZvciB0aGlzIHRoaXMuCgotIEdsZW4gU2NvdHQgcmFuIGNvbmZpZ3VyZSBvbiBoaXMgQ29iYWx0IFF1YmUgYW5kIGl0IGRpZG4ndCBmaWd1cmUgb3V0IHRoZQogIGNvcnJlY3Qgd2F5IG9mIGNhbGxpbmcgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHRodXMgZmFpbGVkIHRvIHJlc29sdmUgaG9zdHMuCiAgVGhpcyBpcyB0d28gZXJyb3JzOiBpdCBzaG91bGRuJ3QgY29udGludWUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgaXQgZmluZHMKICBnZXRob3N0YnluYW1lX3IoKSBidXQgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0LCBhbmQgaXQgc2hvdWxkIHJlYWxseQogIGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCBhcyBpdCB3YXMgcnVubmluZyBMaW51eCBhbmQgd2Uga25vdyBob3cgdGhhdAogIHdvcmtzLi4uCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMSkKLSBkb2NzL1ZFUlNJT05TIGlzIGEgbmV3IGZpbGUgaW4gdGhlIGFyY2hpdmUgdGhhdCBleHBsYWlucyB0aGUgdmVyc2lvbiBudW1iZXIKICBzeXN0ZW0gd2UgdXNlIGluIHRoZSBjdXJsIHByb2plY3QuCgotIERpZCBzb21lIG1vcmUgZml4ZXMgdGhhdCBub3cgbWFrZXMgbGliY3VybCBvbmx5IGlnbm9yZSBzaWduYWxzIGFzIGxvbmcgYXMKICBpdCBuZWVkcyB0bywgYW5kIHRoZW4gcmVzdG9yZSAoaWYgYW55KSBwcmV2aW91cyBzaWduYWwgaGFuZGxlciBhZ2Fpbi4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAxKQotIEVucmlrIEJlcmtoYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzQ3ODc4MCwgaW4gd2hpY2ggaGUgdmVyeSBjb3JyZWN0bHkgcG9pbnRlZAogIG91dCB0d28gYmFkIHRpbWVvdXQgbWF0dGVycyBpbiBsaWJjdXJsOiB3ZSBkaWRuJ3QgcmVzdG9yZSB0aGUgc2lnYWN0aW9uCiAgc3RydWN0ICh0aGUgYWxhcm0gaGFuZGxlciBmb3IgU0lHQUxSTSkgbm9yIGRpZCB3ZSByZXN0b3JlIHRoZSBwcmV2aW91cwogIGFsYXJtKCkgdGltZW91dCB0aGF0IGNvdWxkJ3ZlIGJlZW4gc2V0IGJ5IGEgInBhcmVudCIgcHJvY2VzcyBvciBzaW1pbGFyLgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGN5Z3dpbiBiaW5hcnkgZ2V0IHN0cmlwcGVkIGJlZm9yZSBpbnN0YWxsLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDEpCi0gRGV0bGVmIFNjaG1pZXIgcmVwb3J0ZWQgdGhhdCBjdXJsIGRpZG4ndCBjb21waWxlIHVzaW5nIFNvbGFyaXMgOCB3aXRoIHRoZQogIG5hdGl2ZSBjYyBjb21waWxlci4gSXQgd2FzIGR1ZSB0byBhIGJhZCBmdW5jdGlvbiBwcm90b3R5cGUuIEZpeGVkIG5vdy4KICBVbmZvcnR1bmF0ZWx5LCBJIGNhbid0IGVuYWJsZSB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBpbiBteSBkZWJ1ZyBidWlsZHMKICB0aG91Z2gsIGFzIGdjYyB0aGVuIGNvbXBsYWlucyBsaWtlIGNyYXp5IG9uIE9wZW5TU0wgaW5jbHVkZSBmaWxlcy4uLiA6LSgKCi0gSm9obiBMYXNrIHByb3ZpZGVkIFNTTCBvdmVyIEhUVFAgcHJveHkgZml4ZXMuIFRoZXknbGwgbmVlZCBzb21lIHR3ZWFraW5nCiAgdG8gd29yayBvbiBhbGwgcGxhdGZvcm1zLgoKLSBKb2huIExhc2sgYWRkZWQgdGhlIC0xLy0tVExTdjEgb3B0aW9ucyB0aGF0IGZvcmNlcyBTU0wgaW50byB1c2luZyBUTFMKICB2ZXJzaW9uIDEgd2hlbiBzcGVha2luZyBIVFRQUy4KCi0gSm9obiBMYXNrIGJyb3VnaHQgYSBicmFuZCBuZXcgVkMrKyBtYWtlZmlsZSBmb3IgdGhlIGxpYiBkaXJlY3RvcnksIHRoYXQKICB3b3JrcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMhCgotIFJhbWFuYSBNb2trYXBhdGkgYnJvdWdodCBzb21lIGNsZXZlciBpbnNpZ2h0cyBvbiB0aGUgTERBUCBmYWlsdXJlcyAoYnVnCiAgcmVwb3J0ICM0NzU0MDcpLCBhbmQgaGlzIHN1Z2dlc3RlZCBjaGFuZ2VzIGFyZSBub3cgYXBwbGllZC4KClZlcnNpb24gNy45LjEKCkRhbmllbCAoNCBOb3ZlbWJlciAyMDAxKQotIEkndmUgYWRkZWQgYSBudW1iZXIgb2YgbmV3IHRlc3QgY2FzZXMgdGhlIGxhc3QgZmV3IGRheXMuIEEgZmV3IG9mIHRoZW0gc2luY2UKICBJIGdvdCByZXBvcnRzIHRoYXQgaGludGVkIG9uIHByb2JsZW1zIG9uIHRpbWVvdXRzLCBzbyBJIGFkZGVkIGZvdXIgdGVzdHMKICB3aXRoIHRpbWVvdXRzIGZvciBhbGwgc29ydHMgb2YgcHJvdG9jb2xzIGFuZCBzdHVmZi4gSSBhbHNvIGNhbWUgdG8gdGhpbmsgb2YKICBhIGZldyBvdGhlciBlcnJvciBzY2VuYXJpb3MgdGhhdCB3ZSBjdXJyZW50bHkgZGlkbid0IHRlc3QgcHJvcGVybHksIHNvIEkKICB3cm90ZSB1cCB0ZXN0cyBmb3IgYSBmZXcgb2YgdGhvc2UgdG9vLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDEpCi0gUmVwbGFjZWQgcmVhZCgpIGFuZCB3cml0ZSgpIHdpdGggcmVjdigpIGFuZCBzZW5kKCkgZm9yIHNvY2tldCBvcGVyYXRpb25zCiAgZXZlbiB1bmRlciBub3JtYWwgdW5peGVzLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgd2FzIGFib3J0ZWQgZHVlIHRvIGEgdGltZW91dCwgaXQgd2Fzbid0IHJlYWxseSBhd2FyZSBvZgogIGhvdyBtYW55IGJ5dGVzIHRoYXQgaGFkIGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSBlcnJvciB0ZXh0IGFsd2F5cyBzYWlkIDAKICBieXRlcy4gSSBtb2RpZmllZCB0aGlzIHRvIG91dHB1dCB0aGUgYWN0dWFsbHkgdHJhbnNmZXJyZWQgYW1vdW50ISA6LSkKCi0gVGhlIEZUUCBmaXhlcyBpbiBwcmU3IGRpZG4ndCBjb21waWxlIG9uIElQdjYgZW5hYmxlZCBob3N0cy4gRG9lcyBub3cuIEkgYWxzbwogIGFkZGVkIG1vcmUgY29tbWVudHMgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgZmlsZS4KCi0gTWlub3IgdXBkYXRlcyB0byB0aGUgRkFRLCBhZGRlZCBhIGJyYW5kIG5ldyBzZWN0aW9uIHRvIHRoZSB3ZWIgc2l0ZSBhYm91dAogIHRoZSBuYW1lIGlzc3VlICh3aG8gb3ducyAiY3VybCI/IHdpbGwgc29tZW9uZSBzdWUgdXM/IGV0YyBldGMpOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbGVnYWwvdGhlbmFtZS5odG1sCgpWZXJzaW9uIDcuOS4xLXByZTcKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRpbWVycyBhY2NpZGVudGFsbHkgbG9zdCB0aGVpciBzdWJzZWNvbmQgYWNjdXJhY3kgYXMKICB0aGUgY2FsY3VsYXRpb25zIHVzZWQgbG9uZ3MgaW5zdGVhZCBvZiBkb3VibGVzISBQYXVsIEhhcnJpbmd0b24gcmVwb3J0ZWQuCgotIFRoZSBTU0wgU29ja2V0SXNEZWFkKCkgY2hlY2tzIHdlcmVuJ3QgZ29vZCBlbm91Z2ggKGFzIGV4cGVjdGVkIHJlYWxseSksIHNvIEkKICBoYWQgdG8gYWRkIGEgZ2VuZXJpYyBpbnRlcm5hbCB0cnktaXQtb3V0IHN5c3RlbS4gSWYgdGhlIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgY29ubmVjdGlvbiBzZWVtcyB0byBmYWlsLCB0aGVuIHdlIGdvIGJhY2sgYW5kIGdldCBhIG5ldyAoZnJlc2gpIGNvbm5lY3Rpb24KICBhbmQgcmUtdHJpZXMgdGhlIHJlcXVlc3Qgb24gdGhhdCBpbnN0ZWFkLiBJdCBraW5kIG9mIG1ha2VzIHRoZQogIFNvY2tldElzRGVhZCgpIGNoZWNrIG9ic29sZXRlLCBidXQgSSB0aGluayBpdCBpcyBhIHF1aWNrZXIgd2F5IGZvciB0aG9zZQogIGNhc2VzIHdoZXJlIGl0IGFjdHVhbGx5IGRpc2NvdmVycyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGRlYWQuCgotIFdoZW4gZml4aW5nIHRoZSBhYm92ZSwgSSBub3RpY2VkIHRoYXQgd2UgZGlkIHF1aXRlIGEgZmV3IHdyaXRlcyB0byBzb2NrZXRzCiAgaW4gbGliY3VybCB3aGVyZSB3ZSBkaWRuJ3QgY2hlY2sgdGhlIHJldHVybiBjb2RlICh0aGF0IGl0IGFjdHVhbGx5IHdvcmtlZCB0bwogIHNlbmQgdGhlIGRhdGEpLiBXaXRoIHRoZSBuZXcgImF0dGVtcHRlZCByZXF1ZXN0IiBzeXN0ZW0gd2UgbXVzdCBkZXRlY3QgdGhvc2UKICBzaXR1YXRpb25zIHNvIEkgd2VudCBvdmVyIGEgYnVuY2ggb2YgZnVuY3Rpb25zLCBjaGFuZ2VkIHJldHVybiB0eXBlcyBhbmQKICBhZGRlZCBjaGVja3MgZm9yIHdoYXQgdGhleSBhY3R1YWxseSByZXR1cm4uCgpWZXJzaW9uIDcuOS4xLXByZTYKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFBhdWwgSGFycmluZ3RvbiBkZXRlY3RlZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0YW50IFNTTCBjb25uZWN0aW9ucy4gT3IgdG8gYmUKICBtb3JlIGV4YWN0LCB3ZSBkaWRuJ3QgcHJvcGVybHkgZGV0ZWN0IHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRlYWQgYW5kIHRoZW4KICBhIHNlY29uZCBjb25uZWN0aW9uIHdvdWxkIHRyeSB0byByZS11c2UgaXQgd3JvbmdseS4gVGhlIHNvbHV0aW9uIHRvIHRoaXMKICBwcm9ibGVtIGlzIHN0aWxsIG5vdCB2ZXJ5IGNsZWFyIGFuZCBJJ20gd29ya2luZyBvbiBpdC4gT25lIE9wZW5TU0wgaW5zaWRlcgogIHNhaWQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgdGhlIFNTTCBjb25uZWN0aW9uIGlzIGFsaXZlIG9yIG5vdCB3aXRob3V0CiAgYWN0dWFsbHkgdHJ5aW5nIGFuIG9wZXJhdGlvbi4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAxKQotIElmIGEgY29va2llIHdhcyByZWFkIGZyb20gYSBmaWxlLCBpdCBjb3VsZCBhY2NpZGVudGFsbHkgc3RyZHVwKCkgYSBOVUxMCiAgcG9pbnRlci4gUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvb2tpZS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XQoKLSBUaGUgTUFOVUFMIGZpbGUgbm93IGRvY3VtZW50cyAtdCBjb3JyZWN0bHkuIEkgYWxzbyBmaXhlZCB0aGUgLVQgZGVzY3JpcHRpb24KICBpbiB0aGUgY3VybC4xIG1hbiBwYWdlLgoKRGFuaWVsICgyOSBPY3RvYmVyIDIwMDEpCi0gSm9obiBKYW5zc2VuIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCB3YXMgbWlzc2luZyBpbiB0aGUgbGliY3VybC5kZWYgZmlsZQogIGFuZCB0aGF0IHRoZSBkb2NzIHN0YXRlZCB0aGUgd3JvbmcgcmV0dXJuIHR5cGUgZm9yIHRoZSBmdW5jdGlvbi4KCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIGJ1ZyB3aXRoIG11bHRpcGxlIGZpbGVzIGluIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbiwKICB0aGF0IEkgcmVtb3ZlZCB3aXRoIHRoaXMgcGF0Y2ggW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9mb3JtZGF0YS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XS4KCi0gS2V2aW4gUm90aCBicm91Z2h0IGFub3RoZXIgcGF0Y2ggdGhhdCBtb3ZlZCB0aGUgY3lnd2luIHBhY2thZ2UgZmlsZXMgdG8gdGhlCiAgcGFja2FnZXMvV2luMzIvY3lnd2luIGRpcmVjdG9yeS4KCi0gQSBidWcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGxvZ2ljIG1hZGUgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgRlRQCiAgc2VydmVyICh3aGVuIHVzaW5nIG5hbWUrcGFzd29yZCBpbiB0aGUgVVJMKSBzb21ldGltZXMgdXNlIG1vcmUgdGhhbiBvbmUKICBjb25uZWN0aW9uLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3VybC5jLmRpZmY/cjE9MS4xNjYmcjI9MS4xNjddCgotIE1vb25lc2FteSB0cmFja2VkIGRvd24gYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBuZXcgNy45LjEgY29ubmVjdAogIGNvZGUuIFRoaXMgY29ycmVjdGVkIHRoZSBlcnJvciBLZXZpbiBSb3RoIHJlcG9ydGVkIG9uIHRoZSA3LjkuMS1wcmU1IHJlbGVhc2UKICAodGVzdCAxOSkuLi4KICBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvbm5lY3QuYy5kaWZmP3IxPTEuMTMmcjI9MS4xNF0KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAxKQotIEFkZGVkIHRlc3QyOCB3aGljaCB2ZXJpZmllcyB0aGF0ICJMb2NhdGlvbjoiLWZvbGxvd2luZyB3b3JrcyBldmVuIGlmIHRoZQogIGNvbnRlbnRzIGlzIHNlcGFyYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgc3BhY2UuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwMSkKLSBSYW1hbmEgTW9ra2FwYXRpIHBvaW50ZWQgb3V0IHRoYXQgTERBUCB0cmFuc2ZlcnMgd291bGQgJ2hhbmcnIGFmdGVyIHRoZQogIGNvcnJlY3QgZGF0YSBoYXMgYmVlbiBvdXRwdXQuCgpWZXJzaW9uIDcuOS4xLXByZTUKCkRhbmllbCAoMjQgT2N0b2JlciAyMDAxKQotIFQuIEJoYXJhdGggZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29va2llIGVuZ2luZS4gV2hlbiB3ZSB1cGRhdGUgYSBjb29raWUKICB0aGF0IHdlIGFscmVhZHkga25ldyBhYm91dCwgd2UgbG9zdCBhIGNodW5rIG9mIG1lbW9yeSBpbiB0aGUgcHJvZ3Jlc3MuLi4gVGhlCiAgYnJhbmQgbmV3IHRlc3QgY2FzZSAyNyBub3cgdGVzdHMgZm9yIHRoaXMgb2NjdXJyZW5jZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjQmcjI9MS4yNV0KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAxKQotIHBhY2tfaG9zdGVudCgpIGRpZG4ndCBwcm9wZXJseSBhbGlnbiBzb21lIHBvaW50ZXJzLCBzbyBhdCBsZWFzdCBTUEFSQyBDUFVzCiAgd291bGQgY29yZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9ob3N0aXAuYy5kaWZmP3IxPTEuMzQmcjI9MS4zNV0KCkRhbmllbCAoMjIgT2N0b2JlciAyMDAxKQotIFRvbSBCZW5vaXN0IHJlcG9ydGVkIHRoYXQgdGhpcyBTR0kgSVJJWCBjb21waWxlciBkaWRuJ3QgaGFuZGxlIGluZGVudGVkCiAgcHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc28gdGhleSdyZSBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlIQoKLSBBcHBsaWVkIEtldmluIFJvdGgncyBwYXRjaGVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIGN5Z3dpbiBwYWNrYWdlcyBmcm9tCiAgdGhlIG91dC1vZi10aGUtYm94IGN1cmwgcmVsZWFzZSBhcmNoaXZlcy4KCi0gSSBmb3Jnb3QgdG8gbWVudGlvbiBpdCBiZWxvdywgYnV0IGxpYmN1cmwgbm93IGNsb3NlcyBjb25uZWN0aW9ucyB0aGF0IHJlcG9ydAogIHRyYW5zZmVyIGZhaWx1cmVzLiBVbmNvbmRpdGlvbmFsbHkuIFRoaXMgY291bGQgYmUgbWFkZSBtb3JlIG5pY2VseSBpbiB0aGUKICBmdXR1cmUgaWYgd2Ugc2V0IGEgZmxhZyBvciBzb21ldGhpbmcgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBnb29kIHRvIGJlCiAgdXNlZCBmb3IgdGhlIGVycm9ycyB0aGF0IGtub3cgdGhhdCBmb3IgYSBmYWN0LiBXZSBoYXZlIHRvIGNsb3NlIHRoZQogIGNvbm5lY3Rpb24gZm9yIHRoZSBjYXNlcyB3aGVyZSB3ZSBhYm9ydCBmb3IgZXhhbXBsZSBhIEhUVFAgdHJhbnNmZXIgaW4gdGhlCiAgbWlkZGxlLCBvciBvdGhlcndpc2Ugd2UgbWlnaHQgcmUtdXNlIHRoYXQgY29ubmVjdGlvbiBsYXRlciB3aXRoIGxvdHMgb2YgZGF0YQogIHN0aWxsIGJlaW5nIHNlbnQgdG8gdXMgb24gaXQuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjMmcjI9MS42NF0KCkRhbmllbCAoMTkgT2N0b2JlciAyMDAxKQotIENVUkxFX0dPVF9OT1RISU5HIGlzIG5vdyByZXR1cm5lZCB3aGVuIGEgSFRUUCBzZXJ2ZXIgZG9lc24ndCByZXR1cm4KICBhbnl0aGluZywgbm90IGV2ZW4gYSBoZWFkZXIuIHRlc3QgY2FzZSAzNyB3YXMgYWRkZWQgdG8gdGVzdCBmb3IgdGhpcy4KCi0gVC4gQmhhcmF0aCBtYWRlIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBwcm9wZXJseSBjbG9uZSB0aGUgY29va2llIHN0YXR1cyBhcwogIHdlbGwuCgpWZXJzaW9uIDcuOS4xLXByZTQKCkRhbmllbCAoMTggT2N0b2JlciAyMDAxKQotIENVUkxPUFRfRkFJTE9ORVJST1IsIHNldCB3aXRoICJjdXJsIC0tZmFpbCIgbm8gbG9uZ2VyIHJldHVybnMgYW4gZXJyb3IgaWYKICB0aGUgSFRUUCByZXR1cm4gY29kZSBpcyBiZWxvdyA0MDAuCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMSkKLSBUaGUgdGVzdCBzdWl0ZSBub3cga2lsbHMgYW55IHJ1bm5pbmcgdGVzdCBodHRwIHNlcnZlciB3aGVuIHlvdSByZS1zdGFydCB0aGUKICB0ZXN0cy4KCi0gV2UgaGFkIHRvIHJlbW92ZSAndXNlIHN0cmljdCcgZnJvbSB0d28gcGVybCBzY3JpcHRzLCBhcyB0aGUgY3lnd2luCiAgYWRqdXN0bWVudHMgZGlkbid0IHBsYXkgbmljZWx5IG90aGVyd2lzZSBmb3Igc29tZSByZWFzb24uIEFueSBwZXJsIHdpemFyZAogIG91dCB0aGVyZSB3aG8gY2FuIHB1dCB0aGUgc2NyaWN0IGJhY2sgYW5kIHN0aWxsIG1ha2UgaXQgcnVuIGdvb2Qgb24gdW5peCBhbmQKICBjeWd3aW4/CgotIEEgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHBvaW50ZWQgb3V0IHRvIHVzIGJ5IFlhbmljayBQZWxsZXRpZXIgd2FzIHJlbW92ZWQuCiAgSXQgd291bGQgb2NjdXIgd2hlbiBhIGh0dHAgZmlsZSB0cmFuc2ZlciBmYWlscy4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi90cmFuc2Zlci5jLmRpZmY/cjE9MS42MCZyMj0xLjYxXQoKLSBUaGUgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0gc2hvdWxkIG5vIGxvbmdlciBkaXNwbGF5IGFueXRoaW5nIHRvIHN0ZGVycgogIGlmIHRoZSBjdXJsX21lbWRlYnVnKCkgaGFzbid0IGJlZW4gdXNlZCB0byBleHBsaWNpdGx5IHNheSBzby4gVGhpcyBtYWtlcyBpdAogIGVhc2llciB0byB1c2UgdGhlIG1lbW9yeSBkZWJ1ZyBzeXN0ZW0gYW5kIHN3aXRjaCB0aGUgbG9nZ2luZyBvbi9vZmYuCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGZpeGVzIGZvciBidWlsZGluZyBjdXJsIG5pY2VyIGluIGN5Z3dpbiBlbnZpcm9ubWVudHMuCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMSkKLSBDbGVhbmluZyB1cCB0aGUgcHJvZ3Jlc3MgbWV0ZXIvaW5mbyBjb2RlLiBUaGUgImN1cnJlbnQgc3BlZWQiIGlzIG5vdyBtb3JlCiAgYWNjdXJhdGUgdGhhbiBiZWZvcmUgYXMgd2Ugbm93IHVzZSB0aGUgdHJ1ZSB0aW1lIHNwZW50IGJldHdlZW4gdGhlIG1lYXN1cmVzLAogIGFuZCBub3QganVzdCAiYXNzdW1pbmciIGV2ZXJ5LXNlY29uZC11cGRhdGUgbGlrZSBiZWZvcmUuIFRoZSBvdXRwdXQgc2hvdWxkCiAgbm93IGFsc28gYmUgb2YgdGhlIHNhbWUgd2lkdGggYXQgYWxsIHRpbWVzLCBuZXZlciB0byBzaG93ICJleHRyYSIgemVyb2VzIG9uCiAgdGhlIHJpZ2h0IGVkZ2UuCgotIEFmdGVyIHRhbGtpbmcgYWJvdXQgcG9zc2libGUgTG9jYXRpb246IGJ1Z3Mgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBtb2RpZmllZAogIHRoZSAiYWJzb2x1dGUgVVJMIiBjaGVja2VyIGluIGxpYi90cmFuc2Zlci5jIHRvIGJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcKICBpZiB0aGUgcmVkaXJlY3RlZCBVUkwgaXMgYWJzb2x1dGUuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIHBhdGNoZXMgdGhhdCBtYWtlIHRoZSB0ZXN0IHN1aXRlIHJ1biBmaW5lIG9uIFdpbmRvd3MKICAyMDAwIHJ1bm5pbmcgY3lnd2luLgoKRGFuaWVsICgxMCBPY3RvYmVyIDIwMDEpCi0gU2V0dGluZyB0aGUgLWMgb3IgdGhlIENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiBub3cgZW5hYmxlcyB0aGUgY29va2llIHBhcnNlci4KICBQcmV2aW91c2x5IC1iIG9yIENVUkxPUFRfQ09PS0lFRklMRSB3YXMgYWxzbyByZXF1aXJlZCBmb3IgdGhlIGphciB0byB3b3JrLgoKVmVyc2lvbiA3LjkuMS1wcmUzCgpEYW5pZWwgKDkgT2N0b2JlciAyMDAxKQotIEFkZGVkIGEgbmV3IG9wdGlvbiB0byB0aGUgY29tbWFuZCBsaW5lIGNsaWVudDogLTAvLS1odHRwMS4wLiBJdCB1c2VzIHRoZSBuZXcKICBsaWJjdXJsIG9wdGlvbiBDVVJMT1BUX0hUVFBfVkVSU0lPTiB0byByZXF1ZXN0IHRoYXQgbGliY3VybCB1c2VzIEhUVFAgMS4wCiAgcmVxdWVzdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB2ZXJzaW9uICgxLjEpLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQogIHJlYWxseSBNVVNUIGRvIHRoYXQgYmVjYXVzZSBvZiBhIHNpbGx5IHJlbW90ZSBzZXJ2ZXIuCgotIFJlbmFtZWQgdGhlICdUaW1lQ29uZCcgdHlwZWRlZiBpbiBjdXJsL2N1cmwuaCB0byB1c2UgYSAnY3VybF8nIHByZWZpeCBhcwogIGFsbCBwdWJsaWMgY3VybC1zeW1ib2xzIHNob3VsZC4KCi0gbGliY3VybCBub3cgZXhwbGljaXRseSBpZ25vcmVzIHRoZSBTSUdQSVBFIHNpZ25hbC4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCdzIGNoYW5nZSB0byB0aGUgY29va2llLWphciBjb21tZW50IChpbiB0aGUgc3RvcmVkIGZpbGUpIHdhcwogIGFwcGxpZWQuCgotIEx1Y2FzIEFkYW1za2kncyBtaW5vciBidWcgaW4gdGhlIGJpbmQgZXJyb3IgY29kZSBmYWlsZigpIHdhcyBmaXhlZC4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDEpCi0gTW9vbmVzYW15IGZpeGVkIHRoZSBDdXJsX2Nvbm5lY3Rob3N0KCkgZnVuY3Rpb24gdG8gbm90IGdpdmUgY29tcGlsZXIgZXJyb3JzCiAgb24gYSBidW5jaCBvZiBjb21waWxlcnMsIGR1ZSB0byB0aGUgYXJndW1lbnQgbmFtZWQgJ3NvY2tldCcuCgotIE1vb25lc2FteSBhbHNvIHByb3ZpZGVkIHVwZGF0ZWQgVkMrKyBtYWtlZmlsZXMgYW5kIHByb2plY3QgZmlsZXMuCgpWZXJzaW9uIDcuOS4xLXByZTIKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDEpCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgc2NyaXB0IGRldGVjdCBwcm9wZXIKICBnZXRob3N0YnluYW1lX3IoKSBtZXRob2Qgd2l0aG91dCBhY3R1YWxseSBydW5uaW5nIGFueSBjb2RlLCBvbmx5IGNvbXBpbGluZwogIGlzIG5lY2Vzc2FyeS4gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5lZWQgb2YgaGF2aW5nIGEgcmVzb2x2aW5nICdsb2NhbGhvc3QnCiAgbmFtZS4KCi0gRm91bmQgYW5kIHJlbW92ZWQgbWVtb3J5IGxlYWthZ2UgKG5hbWUgcmVzb2x2ZSBkYXRhKSBpbiBsaWJjdXJsIG9uCiAgSVB2Ni1lbmFibGVkIGhvc3RzLiBUaGVzZSBjb3VsZCBzbmVhayB0aHJvdWdoIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmUgYW55CiAgcmVzb3VyY2UgdHJhY2luZyBvbiB0aGUgSVB2Ni1yZWxhdGVkIGZ1bmN0aW9ucy4gV2UgZG8gbm93LgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBLZWl0aCBNY0d1aWdhbiBwYXRjaGVkIGF3YXkgYSAobWFpbmx5IFdpbmRvd3MtKSBwcm9ibGVtIHdpdGggdGhlIG5hbWUKICByZXNvbHZlciBkYXRhIGJlaW5nIGtlcHQgaW4gdGhlIHN0YXRpYyBtZW1vcnkgYXJlYSwgd2hpY2ggaXMgcmVtb3ZlZCB3aGVuIGEKICB0aHJlYWQgaXMga2lsbGVkLiBUaGUgY3VybCBoYW5kbGUgaXRzZWxmIHRob3VnaCBwZXJmZWN0bHkgaGFuZGxlcyBiZWluZwogIHBhc3NlZCBiZXR3ZWVuIHRocmVhZHMuCgotIERpcmsgRWRkZWxidWV0dGVsIHJlcG9ydGVkIGFuIG9kZCBidWcgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGhpcyBwcm94eSB0aGF0CiAgcmVxdWlyZWQgYW4gQXV0aG9yaXphdGlvbjogaGVhZGVyLiBOb3csIHByb3hpZXMgYXJlIG5vdCBzdXBwb3NlZCB0byByZXF1aXJlCiAgdGhhdCBoZWFkZXIsIHRoYXQgaXMgZm9yIHRydWUgc2VydmVycy4uLgoKLSBJIGFjY2lkZW50YWxseSBydWluZWQgR2VvcmcncyBjdXJsX2Zvcm1hZGQoKS4gVWgsIGJhZCBtZS4gQ29ycmVjdGVkIG5vdy4KClZlcnNpb24gNy45LjEtcHJlMQoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIgb25jZSBhZ2FpbiBtYWRlIGFuIGVmZm9ydCBiZXlvbmQgdGhlIGNhbGwgb2YgZHV0eSBhbmQgbm90CiAgb25seSBpbXByb3ZlZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sIGJ1dCBhbHNvIHRvb2sgY2FyZSBvZiBhZGp1c3RpbmcKICB0aGUgY3VybCBjb21tYW5kIGxpbmUgY2xpZW50IHRvIHVzZSB0aGlzIG5ldyBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZQogIG9ic29sZXRlZCBjdXJsX2Zvcm1wYXJzZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDEpCi0gTWFqb3IgZml4IGluIGhvdyBsaWJjdXJsIGRvZXMgVENQIGNvbm5lY3RzLiBJdCBub3cgZG9lcyBub24tYmxvY2tpbmcKICBjb25uZWN0cyB0byBlbmFibGUgZ29vZCB0aW1lb3V0cyB3aXRob3V0IHNpZ25hbHMsIGFuZCBpdCBub3cgdHJpZXMgYWxsIElQCiAgYWRkcmVzc2VzIGZvciBhbnkgZ2l2ZW4gaG9zdCAoaWYgaXQgcmVzb2x2ZXMgbW9yZSB0aGFuIG9uZSBhbmQgdGhlIGZpcnN0CiAgb25lKHMpIGRvbid0IGNvbm5lY3QpLiBBZGRlZCBhIG5ldyBzb3VyY2UgZmlsZSAnY29ubmVjdC5jJyB0byBkZWFsIHdpdGggYWxsCiAgdGhlIFRDUCBjb25uZWN0IHN0dWZmLgoKLSBXZSBub3cgc3VwcG9ydCBJUHY0LXN0eWxlIElQLWFkZHJlc3NlcyBpbiByZmMyNzMyLWZvcm1hdCwgdG8gYmV0dGVyIHN1cHBvcnQKICBwZW9wbGUgd3JpdGluZyBzY3JpcHRzIHdpdGhvdXQga25vd2luZyB3aGF0IGFkZHJlc3MgdGhlcmUgaXMuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAxKQotIENsZWFudXBzIGluIHRoZSBGVFAgc291cmNlIGNvZGUuIERpdmlkZWQgdGhlIGNvZGUgaW50byBldmVuIG1vcmUgc21hbGxlcgogIGZ1bmN0aW9ucyBhbmQgZ2VuZXJhbGx5IHRyaWVkIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSVB2NCBhbmQgSVB2NgogIGdldCBsZXNzIG5vdGljYWJsZSBpbiB0aGUgc291cmNlcy4KCi0gSWYgdGhlIHJlbW90ZSBmaWxlIHRpbWUgaXMgbm90IHJlYWRhYmxlL2FjY2Vzc2FibGUvdW5kZXJzdG9vZCBieSBsaWJjdXJsLAogIGxpYmN1cmwgbm93IHJldHVybnMgLTEgaW4gdGhlIENVUkxJTkZPX0ZJTEVUSU1FIGRhdGEsIG5vdCAwIGFzIGl0IHByZXZpb3VzbHkKICBkaWQuIFRoaXMgc2hvdWxkIG1ha2UgY3VybCBub3QgdG91Y2ggdGhlIGZpbGUgZGF0YSB1bmxlc3MgdGhlcmUgd2FzIGEga25vd24KICByZW1vdGUgZGF0ZSB3aGVuIC1SIGlzIHVzZWQuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDAxKQotIFdvcmtpbmcgb24gZ2V0dGluZyBub24tYmxvY2tpbmcgY29ubmVjdHMgd29ya2luZyBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gV2UKICB3aWxsIGFsc28gbWFrZSBjdXJsIHRyeSBhbGwgSVBzIGZvciBhIGdpdmVuIGhvc3QgaWYgdGhlIGZpcnN0IG9uZSBzaG91bGQKICBmYWlsLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGEgY29va2llIGV4YW1wbGUgdGhhdCBwcm92ZWQgdGhlIGNvb2tpZSBqYXIKICBmdW5jdGlvbmFsaXR5IHdhc24ndCB3b3JraW5nIHByb3Blcmx5LiBJIGFkZGVkIHRlc3QgY2FzZSA0NiBhbmQgbWFkZSBpdAogIHdvcmsuCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAxKQotIEr2cm4gSGFydHJvdGggdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuOQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMSkKLSBGb3VuZCBhbmQgcmVtb3ZlZCBhICdzb2NrZXQgbGVhaycgdGhhdCB3b3VsZCBvY2N1ciBvbiBJUHY2IGVuYWJsZWQgaG9zdHMKICB3aGVuIEZUUCBSRVRSIGZhaWxlZC4KCi0gTWFkZSB0aGUgRlRQIHVwbG9hZCB0ZXN0cyBydW4gZmluZSBvbiBtYWNoaW5lcyB3aXRoIElQdjYgZW5hYmxlZC4KClZlcnNpb24gNy45LXByZTgKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDEpCi0gVm9qdGVjaCBNaW5hcmlrIHNldCB1cCBhIHNwZWNpYWwtcHVycG9zZSB0ZXN0IHNlcnZlciBhbmQgcHJvdmlkZWQgbWUgd2l0aAogIHRlc3QgY2VydGlmaWNhdGVzIGluIG9yZGVyIGZvciBtZSB0byByZXBlYXQgdGhlIGJ1ZyByZXBvcnRzICM0NDAwNjggYW5kCiAgIzQ0MDM3My4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgY2hlY2sgYWxsIHRoZSBlcnJvciBjb2RlcyBwcm9wZXJseS4gV2UgZG8KICBub3csIGFuZCBjb25uZWN0aW5nIHdpdGggYSB1bmFjY2VwdGFibGUgY2VydGlmaWNhdGUgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbAogIHRvIGNvbm5lY3Qgd2l0aCBhbiBlcnJvciBjb2RlIHJldHVybmVkLgoKLSBSYW1hbmEgTW9ra2FwYXRpIGZvdW5kIGEgY2FzZSB3aGVuIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgZGlkIHdyb25nLgogIEkgd3JvdGUgYSB0ZXN0IGNhc2UgZm9yIHRoaXMgKDQ1KS4KClZlcnNpb24gNy45LXByZTcKCkRhbmllbCAoMTcgU2VwdGVtYmVyIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBmaXhlZCB0ZWxuZXQgZm9yIHdpbjMyLiBJdCBtYWtlcyBsaWJjdXJsIHJlcXVpcmUKICB3aW5zb2NrIDIuMC4KClZlcnNpb24gNy45LXByZTYKCi0gbGlidG9vbCAxLjQuMiBpcyBub3cgaW4gdXNlIQoKVmVyc2lvbiA3LjktcHJlNQoKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCBhbm90aGVyIDE0IGZ0cCB0ZXN0cy4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHRoZSBlYXN5LmggaGVhZGVyIGZpbGUuIEl0IGhhcyBub3cgYmVlbgogIHRlc3RlZCBhbmQgcHJvdmVkIHRvIHdvcmsgaW4gYSByZWFsLXdvcmxkIHRlc3RzIGJ5IFQgQmhhcmF0aC4gV2Ugc3RpbGwgbmVlZAogIHRvIHdyaXRlIHVwIHNvbWUgZG9jcyBmb3IgdGhpcyBmdW5jdGlvbi4KCi0gQWRkZWQgZm91ciBtb3JlIGZ0cCB0ZXN0cyB0byB0aGUgdGVzdCBzdWl0ZS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDEpCi0gQ1VSTE9QVF9TU0xfQ0lQSEVSX0xJU1Qgd2FzIGFkZGVkLCBhbmQgdGhlIGN1cmwgdG9vbCBvcHRpb24gaXMgbmFtZWQKICAtLWNpcGhlcnMuIFVzZSB0aGVtIHRvIHNwZWNpZnkgYSBsaXN0IG9mIGNpcGhlcnMgdG8gdXNlIGluIHRoZSBTU0wKICBjb25uZWN0aW9uLgoKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybCdzIHdpbmRvd3MgdmVyc2lvbi4gSXQgdHVybmVkIG91dAogIHRvIGJlIHRoZSBuZXcgZHVwaGFuZGxlKCkgdGhhdCBkaWRuJ3QgcXVpdGUgd29yayB5ZXQuCgpWZXJzaW9uIDcuOS1wcmU0CgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIHZlcmJvc2Ugb3V0cHV0IGZvciBTU0wgY29ubmVjdGlvbnMgdGhhdCBvdXRwdXQgdGhlIHNlcnZlcgogIGNlcnRpZmljYXRlJ3Mgc3RhcnQgYW5kIGV4cGlyZSBkYXRlcy4gQXMgc3VnZ2VzdGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCi0gSGVpa2tpIEtvcnBlbGEgZm91bmQgcHJvYmxlbXMgaW4gdGhlIHBlcmwgZnRwIHNlcnZlciB1c2VkIGZvciB0aGUgdGVzdAogIHN1aXRlLCB3aGVuIGhlIHJ1bnMgb24gb24gT3BlbkJTRCB3aXRoIHBlcmwgNS42LiBTb21lIGNoYW5nZXMgaGF2ZSBiZWVuCiAgbWFkZSwgYnV0IG5vdGhpbmcgcmVhbGx5IGNlcnRhaW4uCgotIFQuIEJoYXJhdGggaGFzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggbGliY3VybCdzIHN0YWNrIHVzYWdlIG9uIHdpbmRvd3MKICBhbmQgd29ya3Mgb24gcmVkdWNpbmcgaXQuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgcGVybCBpbnRlcmZhY2UuIEl0IHN0b3BwZWQgd29ya2luZyBzaW5jZSB0aGUgY2hhbmdlZAogIGJlaGF2aW9yIHdpdGggV1JJVEVIRUFERVIgYW5kIE5VTEwgcG9pbnRlcnMuCgotIFRoZSAib3V0cHV0IGNvb2tpZXMiIGZ1bmN0aW9uIGNvdWxkIGR1bXAgY29yZSBpZiBubyBjb29raWVzIHdlcmUgZW5hYmxlZC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMSkKLSBTTSBwb2ludGVkIG91dCB0aGF0IHRoZSBTU0wgY29kZSBkaWRuJ3QgY29tcGlsZSBhbnkgbG9uZ2VyIGlmIFNTTCB3YXMKICBkaXNhYmxlZC4uLiBBbHNvLCB3ZSBuZWVkZWQgdG8gY29ycmVjdCB0aGUgI2luY2x1ZGUgZm9yIHRoZSB1dGltZSBzdHVmZiBvbgogIHdpbmRvd3MuCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDEpCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIFNTTCBzZXNzaW9uIGNhY2hlIGNvZGUgdGhhdCBtYWRlIGl0CiAgc29tZXRpbWVzIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlci4KClZlcnNpb24gNy45LXByZTMKCkRhbmllbCAoMyBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB0aGUgLVIvLS1yZW1vdGUtdGltZSBvcHRpb24sIHRoYXQgdXNlcyB0aGUgcmVtb3RlIGZpbGUncyBkYXRlc3RhbXAgdG8KICBzZXQgdGhlIGxvY2FsIGZpbGUncyBkYXRlc3RhbXAuIFRodXMsIHdoZW4geW91IGdldCBhIHJlbW90ZSBmaWxlIHlvdXIgbG9jYWwKICBmaWxlIHdpbGwgZ2V0IHRoZSBzYW1lIHRpbWUgYW5kIGRhdGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2hlbiB5b3UgdXNlCiAgLW8gb3IgLU8uCgotIEluc3RhbGxlZCBsaWJ0b29sIDEuNC4xLCBsaWJ0b29saXplZCBhbmQgZXZlcnl0aGluZy4KCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb2ludGVkIG91dCB0aGF0IEkgZGlkIG5vdCBzaGlwIHRoZSBwcm9wZXIgbGlidG9vbCBzdHVmZiBpbgogIHRoZSBwcmUtcmVsZWFzZXMsIGV2ZW4gdGhvdWdoIHRoYXQgd2FzIG15IGludGVudGlvbi4gbGlidG9vbGl6ZSBoYXMgbm93CiAgYmVlbiByZS1ydW4uCgotIEhlaWtraSBhbHNvIHBhdGNoZWQgYXdheSB0aGUgYmFkIHVzZSBvZiAnbWFrZSAtQycgaW4gdGhlIHRlc3Qgc3VpdGUKICBtYWtlZmlsZS4gbWFrZSAtQyBpcyBub3QgdmVyeSBwb3J0YWJsZSBhbmQgaXMgbm93IGJhbm5lZCBmcm9tIGhlcmUuCgpWZXJzaW9uIDcuOS1wcmUyCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAxKQotIEkganVzdCBtYWRlIGEgaHVnZSBpbnRlcm5hbCBzdHJ1Y3QgcmVoYXVsLCBhbmQgYWxsIHRoZSBiaWcgaW50ZXJuYWxseSB1c2VkCiAgc3RydWN0cyBoYXZlIGJlZW4gcmVuYW1lZCwgcmVkZXNpZ25lZCBhbmQgc3R1ZmYgaGF2ZSBiZWVuIG1vdmVkIGFyb3VuZCBhIGJpdAogIHRvIG1ha2UgdGhlIHNvdXJjZSBlYXNpZXIgdG8gZm9sbG93LCBtb3JlIGxvZ2ljYWxseSBncm91cGVkIGFuZCB0byBob3BlZnVsbHkKICBkZWNyZWFzZSBmdXR1cmUgYnVncy4gSSBhbHNvIGhvcGUgdGhhdCB0aGlzIHdpbGwgbWFrZSBuZXcgZnVuY3Rpb25zIHRvIGdldAogIGVhc2llciB0byBhZGQsIGFuZCBtYWtlIGl0IGxlc3MgbGlrZWx5IHRoYXQgd2UgaGF2ZSBidWdzIGxlZnQgbGlrZSB0aGUgVVJMLQogIGZyZWUgYnVnIGZyb20gQXVndXN0IDIzLgoKVmVyc2lvbiA3LjktcHJlMQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwMSkKLSBUaGUgbmV3IGNvb2tpZSBjb2RlIGhhdmUgZW5hYmxlZCB0aGUgYnJhbmQgbmV3ICctYy8tLWNvb2tpZS1qYXInIG9wdGlvbi4gVXNlCiAgdGhhdCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgaW4gd2hpY2ggeW91IHdhbnQgdG8gaGF2ZSBhbGwgY29va2llcyBjdXJsCiAga25vd3Mgb2YsIGR1bXBlZCB0by4gSXQnbGwgYmUgd3JpdHRlbiB1c2luZyB0aGUgbmV0c2NhcGUgY29va2llIGZvcm1hdC4KCiAgVGhpcyBpcyBpbnRlcm5hbGx5IGRvbmUgd2l0aCB0aGUgbmV3IENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiB0byBsaWJjdXJsLAogIHdoaWNoIGluIHR1cm4gZHVtcHMgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGN1cmxfZWFzeV9jbGVhbnVwKCkgaXMgaW52b2tlZC4KICBUaGVyZSBtaWdodCBiZSByZWFzb25zIHRvIHJlLWNvbnNpZGVyIG15IGNob2ljZSBvZiBwdXR0aW5nIGl0IHRoZXJlLiBQZXJoYXBzCiAgaXQgaXMgYmV0dGVyIHBsYWNlZCB0byBnZXQgZG9uZSBqdXN0IGJlZm9yZSAqX3BlcmZvcm0oKSBpcyBkb25lLiBJdCBpcyBhbGwKICBvZiBjb3Vyc2UgZGVwZW5kaW5nIG9uIGhvdyB5b3UgZ3V5cyB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUuLi4KCi0gQWRkZWQgZnRwdXBsb2FkLmMgaW4gdGhlIHNvdXJjZSBleGFtcGxlcyBzZWN0aW9uLCBiYXNlZCBvbiBzb3VyY2UgY29kZSBwb3N0ZWQKICBieSBFcmljayBOdXdlbmRhbS4KCkRhbmllbCAoMjggQXVndXN0IDIwMDEpCi0gTm93IHJ1bm5pbmcgbGlidG9vbCBDVlMgYnJhbmNoLTEtNCB0byBnZW5lcmF0ZSBzdHVmZi4gU2hvdWxkIGZpeCBwcm9ibGVtcwogIG9uIE9wZW5CU0QgYW5kIGhvcGVmdWxseSBvbiBGcmVlQlNEIGFzIHdlbGwhCgotIEdlb3JnIEh1ZXR0ZW5lZ2dlciBtb2RpZmllZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb25hbGl0eSBzbGlnaHRseSwgYW5kCiAgYWRkZWQgc3VwcG9ydCBmb3IgZXJyb3IgY29kZSA0MTcgd2hlbiBkb2luZyBmb3JtIHBvc3QgYW5kIHVzaW5nIHRoZSBFeHBlY3Q6CiAgaGVhZGVyLiBHcmVhdCB3b3JrIQoKLSBNYWRlIHNvbWUgdGVzdHMgd2l0aCBjYWNoZWQgU1NMIHNlc3Npb24gSURzLCBhbmQgdGhleSBzZWVtIHRvIHdvcmsuIFRoZXJlCiAgc2hvdWxkIGJlIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQgaW4gdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlLCBidXQKICBpbiBteSB0aW55IHRlc3RzIGl0IGp1c3QgaXNuJ3QgcG9zc2libGUgdG8gbm90aWNlIGFueSBkaWZmZXJlbmNlLiBMaWtlIG90aGVyCiAgY2FjaGluZyBpbiBsaWJjdXJsLCB5b3UgbXVzdCByZXVzZSB0aGUgc2FtZSBoYW5kbGUgZm9yIHRoZSBjYWNoaW5nIHRvIHRha2UKICBlZmZlY3QuIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgaXMgZG9uZSBvbiBhIHBlciBob3N0LW5hbWUgYW5kIGRlc3RpbmF0aW9uCiAgcG9ydCBudW1iZXIgYmFzaXMuCgogIFNldCB2ZXJib3NlLCBhbmQgeW91J2xsIGdldCBpbmZvcm1hdGlvbmFsIHRlc3RzIHdoZW4gbGliY3VybCBkZXRlY3RzIGFuZAogIHVzZXMgYSBwcmV2aW91cyBTU0wgc2Vzc2lvbiBJRC4KCi0gVXBncmFkZWQgdG8gYXV0b21ha2UgMS41IG9uIG15IGRldmVsb3BtZW50L3JlbGVhc2UgbWFjaGluZS4KCkRhbmllbCAoMjcgQXVndXN0IDIwMDEpCi0gU2xvd2x5IHN0YXJ0ZWQgd3JpdGluZyBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGNvZGUKCkRhbmllbCAoMjQgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCByZW1vdmVkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHdpbmRvd3MgYW5kIHVwZGF0ZWQgdGhlIE1TIHByb2plY3QKICBmaWxlcy4KCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0d28ga2luZHMgb2YgY29tbWFuZCBsaW5lIGNvbnN0cnVjdHMgd2l0aCB0aGUgbmV3IC1HIHRoYXQKICBjdXJsIGRpZG4ndCByZWFsbHkgZGVhbCB3aXRoIHRoZSB3YXkgb25lIHdvdWxkIGxpa2UuCgotIFRpbSBDb3N0ZWxsbyBwYXRjaGVkIGF3YXkgYSB1c2Ugb2Ygc3RyY2FzZWNtcCgpIGluIHRoZSBTU0wgY29kZS4gV2UgaGF2ZSBvdXIKICBvd24gcG9ydGFibGUgdmVyc2lvbiBuYW1lZCBzdHJlcXVhbCgpIHRoYXQgc2hvdWxkIGJlIHVzZWQhCgotIFRpbSBhbHNvIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlLnZjNiBmaWxlIHRoYXQgbWFkZSBpdCBtaXgKICBkZWJ1ZyBvYmplY3QgbW9kdWxlcyBjYXVzaW5nIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggYWNjdXJhdGVseSBmb3VuZCBhIGxpYmN1cmwgYnVnIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gZG9pbmcgYQogIHNlY29uZCBpbnZva2Ugb2YgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRoIGEgbmV3IFVSTCB3aGVuIHRoZSBwcmV2aW91cyBpbnZva2UKICBmb2xsb3dlZCBhIExvY2F0aW9uOiBoZWFkZXIuCgotIFN0YXJ0ZWQgdGhlIGltcHJvdmVtZW50IHdvcmsgb24gdGhlIGNvb2tpZSBlbmdpbmU6CiAgLSBOb3cga2VlcHMgY29va2llcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgY29va2llIGZpbGUKICAtIEEgd3JpdGUgdG8gdGhlIHBvc3NpYmx5IHN0YXRpYyBzdHJpbmcgd2FzIHJlbW92ZWQKICAtIEFkZGVkIGEgZnVuY3Rpb24gdGhhdCBjYW4gb3V0cHV0IGFsbCBjb29raWVzCiAgLSBOb3cgc3VwcG9ydHMgcmVhZGluZyBtdWx0aXBsZSBjb29raWUgZmlsZXMKCi0gU3RldmUgTGhvbW1lIGNvcnJlY3RlZCBhIERMTCBuYW1pbmcgaXNzdWUgaW4gdGhlIE1TVkMrKyBwcm9qZWN0IGZpbGUuCgotIFNwbGl0IHVwIHRoZSBtb25zdGVyIGZ1bmN0aW9uIGluIGxpYi9mdHAuYyB0byB1c2UgbW9yZSBzbWFsbGlzaCBmdW5jdGlvbnMgdG8KICBpbmNyZWFzZSByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIncyBiaWcgcGF0Y2ggd2FzIGFwcGxpZWQuIE5vdyB3ZSBoYXZlOgogIG8gIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBzdXBwb3J0LiBXZSB3aWxsIGZyb20gbm93IG9uIHNlbmQgdGhhdCBoZWFkZXIgaW4KICAgIGFsbCByZmMxODY3LXBvc3RzLCBhcyB0aGF0IG1ha2VzIHVzIGFib3J0IG11Y2ggZmFzdGVyIHdoZW4gdGhlIHNlcnZlcgogICAgcmVqZWN0cyBvdXIgUE9TVC4gUG9zdGluZyB3aXRob3V0IHRoZSBFeHBlY3Q6IGhlYWRlciBpcyBzdGlsbCBwb3NzaWJsZSBpbgogICAgdGhlIHN0YW5kYXJkIHJlcGxhY2UtaW50ZXJuYWwtaGVhZGVyIHN0eWxlLgogIG8gY3VybF9mb3JtYWRkKCkgaXMgYSBuZXcgZm9ybXBvc3QgYnVpbGRpbmcgZnVuY3Rpb24gdGhhdCBpcyBpbnRyb2R1Y2VkIHRvCiAgICByZXBsYWNlIHRoZSBub3cgZGVwcmVjYXRlZCBjdXJsX2Zvcm1wYXJzZSgpIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIGZ1bmN0aW9uCiAgICB3aWxsIHN0aWxsIGhhbmcgYXJvdW5kIGZvciBhIHdoaWxlLCBidXQgdGhlIGN1cmxfZm9ybWFkZCgpIGlzIHRoZSBuZXcgd2F5CiAgICBhbmQgY29ycmVjdCB3YXkgdG8gYnVpbGQgZm9ybSBwb3N0cy4KICBvIERvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoZXNlIGNoYW5nZXMKCiAgVGhlc2UgY2hhbmdlcyBhcmUgcmVhc29uIGVub3VnaCB0byBuYW1lIHRoZSBuZXh0IGN1cmwgcmVsZWFzZSA3LjkuLi4KCi0gV2Ugbm93IGNvbnZlcnQgbWFuIHBhZ2VzIHRvIEhUTUwgcGFnZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB0aGUgcmVsZWFzZQogIGFyY2hpdmUuIEZvciB0aGUgcGxlYXN1cmUgb2YgZXZlcnlvbmUgd2l0aG91dCBucm9mZiB3aXRoaW4gcmVhY2guCgotIEFuZHLpcyBHYXJj7WEncyBzdWdnZXN0ZWQgZmx1c2hpbmcgb2YgdGhlIHByb2dyZXNzIG1ldGVyIG91dHB1dCBzdHJlYW0gd2FzCiAgYWRkZWQuIEl0IHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciBsb29rIGJldHRlciBvbiBXaW5kb3dzLgoKLSBUcm95IEVuZ2VsIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbAogIG9uIG1hbnkgUmVkIEhhdCBib3hlcyEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gV2UgbmVlZCBhbiB1cGRhdGVkIGxpYnRvb2wgdG8gbWFrZSBhIGJldHRlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgT3BlbkJTRAogIGFzIHdlbGwgYXMgRnJlZUJTRAoKVmVyc2lvbiA3LjguMQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBCcmFkIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hpcCB0d28gZXh0cmEgbGlidG9vbCBmaWxlcyBpbiB0aGUgdGFyYmFsbHMgdGhhdAogIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvISBSZW1vdmluZyB0aGVtIG1ha2VzIHRoZSBnei1hcmNoaXZlIGFib3V0IDYwSwogIHNtYWxsZXIhCgotIEFsYmVydCBDaGluIGJyb3VnaHQgZml4ZXMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzb2NrbGVuX3QKICBwcm9wZXJseSBhcyB3ZWxsIGFzIG1vdmluZyBsb3RzIG9mIG91ciBjdXN0b20gYXV0b2NvbmYgbWFjcm9zIHRvCiAgYWNpbmNsdWRlLm00LgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwMSkKLSBNb29uZXNhbXkgaW1wcm92ZWQgaGlzIC1HIGZlYXR1cmUgZm9yIGhvc3QgbmFtZXMgb25seSBVUkxzLi4uCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAxKQotIEZpbmFsbHkgY2xlYW5lZCB1cCB0aGUga2VyYmVyb3MgY29kZSB0byB1c2UgQ3VybF8gcHJlZml4ZXMgb24gYWxsIGdsb2JhbAogIHN5bWJvbHMgYW5kIHRvIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4KClZlcnNpb24gNy44LjEtcHJlNgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgYWRkZWQgdGhlIC1HIG9wdGlvbiB0byBjdXJsLCB0aGF0IGNvbnZlcnRzIHRoZSBkYXRhIHNwZWNpZmllZAogIHdpdGggLWQgdG8gYSBHRVQgcmVxdWVzdC4gRGVmYXVsdCBhY3Rpb24gd2hlbiB1c2luZyAtZCBpcyBQT1NULiBXaGVuIC1HIGlzCiAgdXNlZCwgdGhlIC1kIHNwZWNpZmllZCBkYXRhIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIFVSTCB3aXRoIGEgJz8nCiAgc2VwYXJhdG9yLiBBcyBzdWdnZXN0ZWQgcHJldmlvdXNseSBieSBLZXZpbiBSb3RoLgoKLSBjdXJsLWNvbmZpZyAtLWxpYnMgc2hvdWxkIG5vdyBkaXNwbGF5IGFsbCBsaW5rZXIgb3B0aW9ucyByZXF1aXJlZCB0byBsaW5rCiAgd2l0aCBsaWJjdXJsLiBJdCBpbmNsdWRlcyB0aGUgcGF0aCBhbmQgb3B0aW9ucyBmb3IgbGliY3VybCBpdHNlbGYuCiAgY3VybC1jb25maWcgLS1jZmxhZ3MgZGlzcGxheXMgdGhlIGNvbXBpbGVyIG9wdGlvbihzKSBuZWVkZWQgdG8gY29tcGlsZQogIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSBsaWJjdXJsIGZ1bmN0aW9ucy4gQmFzaWNhbGx5LCB0aGF0IHNldHMgdGhlIGluY2x1ZGUKICBwYXRoIGNvcnJlY3QuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAxKQotIEFya2FkaXVzeiBNaXNraWV3aWN6IHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiBob3cgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMKICB3ZXJlIHBhcnNlZCBhbmQgdXNlZC4gKFJGQzI3MzItZm9ybWF0KQoKLSBCdWcgIzEyNzMzIG92ZXIgb24gcGhwLm5ldCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBsaWJjdXJsIHRoYXQgbWFkZSBpdCBjb3JlCiAgZHVtcCBpZiB5b3UgdXNlZCBDVVJMT1BUX1BPU1Qgd2l0aG91dCBzZXR0aW5nIGFueSBkYXRhIHRvIHBvc3Qgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyEgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuIE5vdCB1c2luZyBDVVJMT1BUX1BPU1RGSUVMRFMKICBub3cgZXF1YWxzIHNldHRpbmcgaXQgdG8gbm8gZGF0YSBhdCBhbGwuCgotIFJhbWFuYSBNb2trYXBhdGkgcmVwb3J0ZWQgdGhhdCBjdXJsIHdpdGggJy13ICV7aHR0cF9jb2RlfScgZGlkbid0IHdvcmsKICBwcm9wZXJseSB3aGVuIHVzZWQgZm9yIG11bHRpcGxlIFVSTHMgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lLiBJbmRlZWQsIHRoZQogIHZhcmlhYmxlIHdhcyBub3QgcmVzZXQgYmV0d2VlbiB0aGUgcmVxdWVzdHMuIFRoaXMgaXMgbm93IGZpeGVkLgoKLSBEYXZpZCBKYW1lcyBmaXhlZCB0aGUgQm9ybGFuZCBtYWtlZmlsZSBzbyB0aGF0IGxpYmN1cmwgc3RpbGwgY29tcGlsZXMgYW5kCiAgYnVpbGRzIHdpdGggdGhhdCBjb21waWxlci4KCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gT29wcy4gSSBydWluZWQgTmljbydzIHNvY2tsZW5fdCBkZWZpbmUgaW4gY29uZmlnLXZtcy5oLCBjb3JyZWN0ZWQgaXQgbm93LgoKLSBBbiBvbGRlciBpdGVtIG5vdCBtZW50aW9uZWQgaGVyZSBiZWZvcmU6IENVUkxfR0xPQkFMX1dJTjMyIGlzIGEgZGVmaW5lIGZvcgogIHdpbmRvd3MgdXNlcnMgdG8gY3VybF9nbG9iYWxfaW5pdCgpLCB0aGF0IG1ha2VzIGxpYmN1cmwgaW5pdCB0aGUgd2luc29jawogIHN0dWZmLiBJZiBsaWJjdXJsIGlzIGFsbCBzb2NrZXQgc3R1ZmYgeW91IGRvLCB0aGVuIGFsbG93aW5nIGl0IHRvIGZpZGRsZQogIHdpdGggdGhpcyBpcyBhIGNvbWZvcnRhYmxlIHNob3J0Y3V0IHRvIGZhbWUuCgpWZXJzaW9uIDcuOC4xLXByZTUKCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgbW9yZSBmZWVkYmFjayBmcm9tIGhpcyBWTVMgcG9ydGluZyBlZmZvcnRzIGFuZCBhIGZldwogIG1pbm9yIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnkuCgotIEkgbW9kaWZpZWQgY29uZmlndXJlLmluIHNvIHRoYXQgLS1lbmFibGUtZGVidWcgc2V0cyBtb3JlIHBpY2t5IGdjYyBvcHRpb25zLgogIEkgdGhlbiByZW1vdmVkIGFsbW9zdCBhbGwgdGhlIG5ldyB3YXJuaW5ncyB0aGF0IGFwcGVhcmVkLCBhbmQgYnkgZG9pbmcgc28gSQogIGNvcnJlY3RlZCB0aGUgc2l6ZV90LXRyZWF0ZWQtYXMtc2lnbmVkIHByb2JsZW0gdGhhdCBoYXMgYmVlbiBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0IHByZXZpb3VzbHkuIEkgYWxzbyByZW1vdmVkIGEgYnVuY2ggb2YgdGhlIGp1c3QgcmVjZW50bHkKICBhZGRlZCAjaWZkZWYgVk1TIGxpbmVzLgoKLSBJIHJlbW92ZWQgdGhlIHVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgU1NMIGNvZGUuIEl0IHdhcyBvbmNlCiAgbmVjZXNzYXJ5IGJ1dCBoYXNuJ3QgYmVlbiBuZWVkZWQgc2luY2UgT3BlblNTTCAwLjkuNC4gVGhlIG9sZCBjb2RlIHNob3VsZAogIChob3BlZnVsbHkpIHN0aWxsIHdvcmsgaWYgbGliY3VybCBpcyBidWlsdCBhZ2FpbnN0IGFuIGFuY2llbnQgdmVyc2lvbiBvZgogIE9wZW5TU0wuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDAxKQotIFBldGVyIFRvZGQgcG9zdGVkIGEgcGF0Y2ggdGhhdCBub3cgYWxsb3dzIG5vbi1maWxlIHJjMTg2Ny1zdHlsZSBmb3JtIHBvc3RzCiAgdG8gYmUgbGFyZ2VyIHRoYW4gNEsuCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBmaXhlZCBidWdzIGZvciBidWlsZGluZyBkZWJ1ZyBhbmQgU1NMIGxpYiBpbiBWQyBtYWtlZmlsZQoKRGFuaWVsICg5IEF1Z3VzdCAyMDAxKQotIFRoZSByZWRpcmVjdGVkIGVycm9yIHN0cmVhbSB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY3VybF9lYXN5X2NsZWFudXAoKSBjYWxsCiAgd2FzIG1hZGUsIGFuZCB3aGVuIFZFUkJPU0Ugd2FzIGVuYWJsZWQsIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIHRyaWVkIHRvIHVzZQogIHRoZSBzdHJlYW0uIEl0IGNvdWxkIGxlYWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQuIEFsc28sIHRoZSBzdHJlYW0gd2FzCiAgY2xvc2VkIGV2ZW4gaWYgd2UgbG9vcGVkIHRvIGdldCBtb3JlIGZpbGVzLiAgQ29ycmVjdHMgRHVzdGluIEJvc3dlbGwncyBidWcKICByZXBvcnQgIzQ0MTYxMAoKLSBOb3cgZ2VuZXJhdGVzIHRoZSByZWxlYXNlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCBhdXRvY29uZiAyLjUyCgpWZXJzaW9uIDcuOC4xLXByZTQKCkRhbmllbCAoOCBBdWd1c3QgMjAwMSkKLSBjdXJsIC1FIHVzZXMgYSBjb2xvbiB0byBzZXBhcmF0ZSBhIGZpbGUgbmFtZSBmcm9tIGEgcGFzc3BocmFzZS4gVGhpcyB0dXJuZWQKICBvdXQgcmVhbGx5IGJhZCBmb3IgdGhlIHdpbmRvd3MgcGVvcGxlIHdobyB3YW50cyB0byBpbmNsdWRlIGEgZHJpdmUgbGV0dGVyIGluCiAgdGhlIGZpbGUgbmFtZSBsaWtlICJjOlxjZXJ0LnBlbSIuIFRoZXJlJ3Mgbm93IGEgd2luMzIgd29yay1hcm91bmQKICBpbXBsZW1lbnRlZCB0aGF0IHRyaWVzIHdvcmsgYXJvdW5kIHRoYXQsIHdoZW4gdGhlIGNvbG9uIHNlZW1zIHRvIGJlIHVzZWQgZm9yCiAgdGhpcyBraW5kIG9mIGNvbnN0cnVjdC4KCi0gUGF0cmljayBCaWhhbi1GYW91IGludHJvZHVjZWQgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgd2hpY2ggbWFrZXMgY3VybAogIHZlcmlmeSB0aGUgc2VydmVyJ3MgQ04gZmllbGQgd2hlbiB0YWxraW5nIGh0dHBzOi8vLiBJZiAtLWNhY2VydCBpcyBub3QgdXNlZCwKICBhbnkgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgaXMgb25seSBkaXNwbGF5ZWQgYXMgaW5mb3JtYXRpb24gKC12KS4KCkRhbmllbCAoNyBBdWd1c3QgMjAwMSkKLSBXcm90ZSB1cCBuaW5lIG1vcmUgdGVzdCBjYXNlcywgbW9yZSBvciBsZXNzIGNvbnZlcnRlZCBmcm9tIHRoZSBmb3JtZXIgdGVzdAogIHN1aXRlLgoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEhlaWtraSBLb3JwZWxhIHBvc3RlZCBhIHBhdGNoIHRoYXQgbWFrZXMgJ2N1cmwtY29uZmlnIC0tbGlicycgaW5jbHVkZSB0aGUKICBkaXJlY3RvcnkgaW4gd2hpY2ggbGliY3VybCBpdHNlbGYgaXMgaW5zdGFsbGVkIGluLiBXaGlsZSB0aGlzIHdhc24ndCBteQogIGluaXRpYWwgaW50ZW50aW9uIHdpdGggdGhpcyBvcHRpb24sIGl0IG1ha2VzIHNlbnNlIGFuZCBtYWtlcyBsaW5raW5nIHdpdGgKICBsaWJjdXJsIGVhc2llci4KCi0gU3RlZmFuIFVscmljaCBwb2ludGVkIG91dCB0byB1cyB0aGF0IG90aGVyIHRvb2xzIGFuZCBsaWJyYXJpZXMgdHJlYXQgZmlsZTovLwogIFVSTHMgd2l0aCBvbmx5IG9uZSBzbGFzaCBhZnRlciB0aGUgaG9zdCBuYW1lIHNsaWdobHkgZGlmZmVyZW50IHRoYW4gbGliY3VybAogIGRvZXMuIFNpbmNlIGFsbCB0aGUgb3RoZXJzIHNlZW0gdG8gYWdyZWUsIHdlIGJldHRlciBmb2xsb3cgdGhlbS4KCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgdXMgd2l0aCBhIGh1Z2Ugc2V0IG9mIGZpeGVzIHRvIG1ha2UgY3VybCBjb21waWxlIGFuZAogIGJ1aWxkIHVuZGVyIE9wZW5WTVMuCgpWZXJzaW9uIDcuOC4xLXByZTMKCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBKb25hdGhhbiBIc2V1IG5vdGljZWQgdGhhdCB5b3UgY291bGRuJ3QgZ2V0IGEgaGVhZGVyIGNhbGxiYWNrIHVubGVzcyB5b3UKICBzZXQgQ1VSTE9QVF9XUklURUhFQURFUiB0byBub24tTlVMTCwgZXZlbiBpZiB5b3UgZGlkbid0IGNhcmUgYWJvdXQgdGhhdAogIGRhdGEuIFRoaXMgaXMgbm93IGZpeGVkLgoKRGFuaWVsICg1IEF1Z3VzdCAyMDAxKQotIFNlcmdpbyBCYWxsZXN0cmVybyBwcm92aWRlZCBhIHBhdGNoIGZvciByZWFkaW5nIHJlc3BvbnNlcyBmcm9tIE5DU0EgaHR0cGQKICAxLjUueCBzZXJ2ZXJzLCBhcyB0aGV5IHJldHVybiByZWFsbHkgc2NyZXdlZCB1cCByZXNwb25zZSBoZWFkZXJzIHdoZW4gYXNrZWQKICBmb3Igd2l0aCBIVFRQIDEuMS4KCi0gY3VybF9lc2NhcGUoKSBubyBsb25nZXIgdHJlYXRzIGFscmVhZHkgZW5jb2RlZCBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dAogIHN0cmluZyBlc3BlY2lhbGx5LgoKRGFuaWVsICgzIEF1Z3VzdCAyMDAxKQotIEkgcmVwbGFjZWQgdGhlIGZvcm1lciBsaWIvYXJwYV90ZWxuZXQuaCBmaWxlIHdpdGggb25lIEkgd3JvdGUgbXlzZWxmLCB0bwogIGF2b2lkIHRoZSBCU0QgYW5ub3VjZW1lbnQgY2xhdXNlIG9mIHRoZSBsaWNlbnNlIGluIHRoZSBmb3JtZXIgZmlsZS4KCi0gQW5kcmV3IEZyYW5jaXMgcHJvdmlkZWQgYSBuZXcgdmVyc2lvbiBvZiBiYXNlNjQuYyB0byB3b3JrIGFyb3VuZCB0aGUgbGljZW5zZQogIGJvaWxlciBwbGF0ZSB0aGF0IGNhbWUgd2l0aCB0aGUgcHJldmlvdXMgb25lLiBJIHBhdGNoZWQgaXQsIGJ1dCB0aGUgZ2xvcnkKICBzaG91bGQgZ28gdG8gQW5kcmV3IGZvciBoaXMgaGVhZHMgdXAuCgotIFRvbWFzeiBMYWNraSBub3RpY2VkIHRoYXQgd2hlbiB5b3UgZG8gcmVwZWF0ZWQgdHJhbnNmZXJzIHdpdGggbGliY3VybCB5b3UKICBjb3VsZG4ndCBhbHdheXMgcmVsaWFibHkgY2hhbmdlIEhUVFAgcmVxdWVzdC4gVGhpcyBoYXMgbm93IGJlZW4gZml4ZWQgYW5kIGEKICBuZXcgbGliY3VybCBvcHRpb24gd2FzIGFkZGVkOiBDVVJMT1BUX0hUVFBHRVQsIHRoYXQgY2FuIGZvcmNlIHRoZSBIVFRQCiAgcmVxdWVzdHIgKGJhY2spIHRvIEdFVC4KCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBwb2ludGVkIG91dCB0aGF0IGh0dHBzc2VydmVyLnBsIHdhc24ndCBpbmNsdWRlZCBpbgogIHJlbGVhc2UgYXJjaGl2ZXMuIEl0IHNob3VsZCBiZSBub3cuCgpEYW5pZWwgKDIgQXVndXN0IDIwMDEpCi0gRnJhbmsgS2VlbmV5IHBvaW50ZWQgb3V0IGEgbWFudWFsIG1pc3Rha2UgZm9yIGNlcnRpZmljYXRlIGNvbnZlcnRpb25zLgoKLSBUb21hc3ogTGFja2kgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSB0cmFuc2ZlciBsb29wIHRoYXQgY291bGQgbWFrZSB0aGUKICBzZWxlY3QoKSBsb29wIHVzZSBmYXIgdG9vIG11Y2ggQ1BVLgoKLSBQYXdlbCBBLiBHYWpkYSBwb2ludGVkIG91dCBhbiBvdXRwdXQgbWlzdGFrZSBkb25lIHdoZW4gdXNpbmcgbGliY3VybCdzCiAgcHJvZ3Jlc3MgY2FsbGJhY2suCgpEYW5pZWwgKDI5IEp1bmUgMjAwMSkKLSBOYXZlZW4gTm9lbCBub3RpY2VkIHRoYXQgdGhlIEJvcmxhbmQgbGlicmFyeSBtYWtlZmlsZSB3YXNuJ3QgdXBkYXRlZC4KCi0gTmljIFJvZXRzIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBTU0wuCgpEYW5pZWwgKDI3IEp1bmUgMjAwMSkKLSBNYWRlIHRoZSBGVFAgdGVzdHMgcnVuIE9LIGV2ZW4gb24gbWFjaGluZXMgcnVubmluZyBjdXJsIElQdjYtZW5hYmxlZC4KCi0gVHJveSBFbmdlbCBjb3JyZWN0ZWQgc29tZSBSUE0gcGFja2FnZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjguMS1wcmUyCgpEYW5pZWwgKDI1IEp1bmUgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBjb3JyZWN0bHkgaWRlbnRpZmllZCBhIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvd25sb2FkaW5nCiAgc2V2ZXJhbCBmaWxlcyB3aXRoIGN1cmwsIGFuZCB1c2luZyByZXN1bWUuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIGluZGV4IHdhcwogIHRoZW4gdXNlZCBmb3IgYWxsIGZpbGVzLCByZXN1bHRpbmcgaW4gd2VpcmQgcmVzdWx0cy4uLgoKLSBBbnRvbiBLYWxteWtvdiBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGN1cmwgd29yayB3aXRoIGZvcm0gZmllbGQgbmFtZXMKICB3aXRoIHNwYWNlcyBsaWtlIHdoZW4gLUYgaXMgdXNlZC4KClZlcnNpb24gNy44LjEtcHJlMQoKRGFuaWVsICgyMCBKdW5lIDIwMDEpCi0gTWlrZSBCeXRuYXIgcHJvdmlkZWQgYSBmaW5lIHJlcG9ydCB0aGF0IHByb3ZlZCB0aGF0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbgogIGZvciBjb25maWd1cmUgbmVlZGVkIHR3ZWFraW5nLiBJdCBubyBsb25nZXIgc2VhcmNoZXMgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMKICBmb3IgT3BlblNTTCBsaWJzIG9yIGRpcmVjdG9yaWVzIHdoZW4gYSBzcGVjaWZpZWQgcGF0aCBpcyBnaXZlbi4KCkRhbmllbCAoMTkgSnVuZSAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIGlzIGN1dCBvZmYgZHVyaW5nIHRyYW5zZmVyLCBjdXJsIGNvdWxkIHByZXNlbnQgYSB0cnVseQogIGdhcmJhZ2VkIGVycm9yIG1lc3NhZ2UgYW5kIGluIHdvcnN0IGNhc2UgZHVtcCBjb3JlLiBUaGFua3MgdG8gZGV0YWlsZWQKICByZXBvcnRzIGZyb20gU2hhd24gUG91bHNvbiB3ZSBuYWlsZWQgdGhpcy4KCkRhbmllbCAoMTIgSnVuZSAyMDAxKQotIFNhbHZhZG9yIEThdmlsYSBwcm92aWRlZCBhIGZpeCBmb3IgRlRQIHJhbmdlIGRvd25sb2Fkcy4KCi0gQWRkZWQgYSBmZXcgbW9yZSB0ZXN0IGNhc2VzIGZyb20gdGhlIGZvcm1lciB0ZXN0IHN1aXRlIHRvIHRoZSBuZXcgZmlsZQogIGZvcm1hdC4gV2UncmUgbm93IGF0IGEgdG90YWwgb2YgMjYgdGVzdHMuCgpEYW5pZWwgKDExIEp1bmUgMjAwMSkKLSBsaWJjdXJsJ3MgdmVyc2lvbi1pbmZvIHdhcyB3cm9uZywgYXMgbm90ZWQgYnkgYm90aCBEb21lbmljbyBBbmRyZW9saSBhbmQKICBEYXZpZCBPZGluLgoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBK9nJuIGZpeGVkIHRoZSBjdXJsX3VuZXNjYXBlIGR1cGxpY2F0ZSBlbnRyeSBpbiBsaWIvbGliY3VybC5kZWYKCi0gSSBtYWRlIFNTTCBjZXJ0aWZpY2F0ZSBmYWlsdXJlIG1lc3NhZ2VzIHRvIGJlIG1vcmUgZGV0YWlsZWQuCgpWZXJzaW9uIDcuOAoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBTRGF2aWxhIHByb3ZpZGVkIGEgcmVzdW1lZCBkb3dubG9hZCBmaXguCgpWZXJzaW9uIDcuOC1wcmU0CgpEYW5pZWwgKDEgSnVuZSAyMDAxKQotIFN0ZXJsaW5nIHByb3ZpZGVkIHNvbWUgbmV3IFBIUCBleGFtcGxlcy4KCi0gQ2hhbmdlZCB0aGUgQ1ZTIGhpZXJhcmNoeSBhbmQgdGhlIG9sZGVyIGNoZWNrb3V0IGluc3RydWN0aW9uIGRvZXMgbm8gbG9uZ2VyCiAgd29yay4gV2UgbW92ZWQgdGhlIGVudGlyZSBzb3VyY2UgY29kZSBpbnRvIGEgQ1ZTIG1vZHVsZSBuYW1lZCAnY3VybCcuCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIENVUkxPUFRfTVVURSBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJdCBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUKICB0byBub3QgY2F1c2UgY29tcGlsZXIgZXJyb3JzIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgaXQsIGJ1dCBpdCBpc24ndCB1c2VkCiAgYW55d2hlcmUgaW4gdGhlIGxpYnJhcnkuCgpWZXJzaW9uIDcuOC1wcmUzCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIE9uY2UgYW5kIGZvciBhbGwgZml4ZWQgdGhlIF9SRUVOVFJBTlQgbWVzcyBmb3IgU29sYXJpcyBjb21waWxlcyB0byBwcmVzZW50CiAgbGVzcyB3YXJuaW5ncy4KCi0gU3RlcmxpbmcgSHVnaGVzIHRpcmVsZXNzbHkgcG9pbnRzIG91dCBhbmQgY29ycmVjdHMgbXkgbWlzdGFrZXMuLi4hIFNvLAogIGN1cmxfZ2xvYmFsX2luaXQoKSBub3cgbGV0cyB0aGUgYXJndW1lbnQgZmxhZ3MgKlNFVCogd2hhdCBwYXJ0cyB0bwogIGluaXQuIENVUkxfR0xPQkFMX0RFRkFVTFQgbWFrZXMgYSBuaWNlIGRlZmF1bHQsIENVUkxfR0xPQkFMX0FMTCBpbml0cyBhbGwKICBrbm93biBzdWJzeXN0ZW1zIGFuZCBDVVJMX0dMT0JBTF9OT05FIGluaXRzIG5vdGhpbmcgbW9yZSB0aGFuIGFic29sdXRlbHkKICBuZWNlc3NhcnkuIE1hbiBwYWdlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHRoZSBzdHJ0b2suaCBpbmNsdWRlIGZpbGUgYXMgaXQgd291bGRuJ3QgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zIQoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBNYWRlIGxpYmN1cmwgYnkgZGVmYXVsdCBhY3QgYXMgaWYgQ1VSTE9QVF9NVVRFIGFuZCBDVVJMT1BUX05PUFJPR1JFU1Mgd2VyZQogIHNldCBUUlVFLiBTZXQgdGhlbSB0byBGQUxTRSB0byBtYWtlIGxpYmN1cmwgbW9yZSB0YWxrYXRpdmUuIFRoZSAqX01VVEUKICBvcHRpb24gaXMgc3ViamVjdCBmb3IgY29tcGxldGUgcmVtb3ZhbC4uLgoKVmVyc2lvbiA3LjgtcHJlMgoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgd3JvdGUgYSBtYWtlZmlsZSBmb3IgYnVpbGRpbmcgU29sYXJpcyBwYWNrYWdlcy4KCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgZml4ZXMgZm9yICdidWlsZGNvbmYnICh0aGUgYnVpbGQtZnJvbS1DVlMgdG9vbCkgYW5kCiAgd2UgZGlzY3Vzc2VkIGFuZCBhZGRlZCBhIGZldyBDVVJMX0dMT0JBTF8qIGZsYWdzIGluIGluY2x1ZGUvY3VybC5oCgotIEtqZXRpbCBKYWNvYnNlbiBwcml2YXRlbHkgYW5ub3VuY2VkIGhpcyBweXRob24gaW50ZXJmYWNlIHRvIGxpYmN1cmwsCiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weWN1cmwuc291cmNlZm9yZ2UubmV0LwoKRGFuaWVsICgyOSBNYXkgMjAwMSkKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBzdHJ0b2soKSBwcm9ibGVtIGluIGxpYmN1cmwuIEl0IGlzIG5vdCBhIHRocmVhZC0KICBzYWZlIGZ1bmN0aW9uLiBOb3cgY29uZmlndXJlIGNoZWNrcyBmb3IgYSB0aHJlYWQtc2FmZSB2ZXJzaW9uLCBhbmQKICBsaWIvc3RydG9rLmMgb2ZmZXJzIG9uZSBmb3IgdGhlIHN5c3RlbXMgdGhhdCBkb24ndCBjb21lIHdpdGggb25lIGluY2x1ZGVkIQoKLSBNZXR0Z3V0IEphbWFsbGEgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3YXMgd3JpdHRlbgogIHRvIHN0ZGVyciBldmVuIHRob3VnaCAtLXN0ZGVyciByZWRpcmVjdGlvbiB3YXMgdXNlZC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJIG1vdmVkIG91dCB0aGUgbGlzdCBvZiBjb250cmlidXRvcnMgZnJvbSB0aGUgY3VybC4xIG1hbiBwYWdlIGFuZCBtYWRlIGEKICBzZXBhcmF0ZSBkb2NzL1RIQU5LUyBmaWxlLiBJdCBtYWtlcyB0aGUgbGlzdCBlYXNpZXIgdG8gZmluZCwgYW5kIG1hZGUgaXQKICBlYXNpZXIgZm9yIG1lIHRvIG1ha2UgYSBzZXBhcmF0ZSB3ZWIgcGFnZSB3aXRoIHRoYXQgc2FtZSBpbmZvcm1hdGlvbi4KCiAgSSByZWFsbHkgZG8gd2FudCBhbGwgeW91IGd1eXMgbWVudGlvbmVkIGluIHRoZXJlIHRvIGZlZWwgeW91IGdldCB0aGUgY3JlZGl0CiAgeW91IGRlc2VydmUuCgotIGxpYi9lYXN5LmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgaW4gdGhlIDcuOC1wcmUxIGR1ZSB0byBhIHNpbGx5IG1pc3Rha2UKClZlcnNpb24gNy44LXByZTEKCkRhbmllbCAoMjggTWF5IDIwMDEpCi0gY3VybC1jb25maWcgbm93IHN1cHBvcnRzICctLXZlcm51bScgdGhhdCBvdXRwdXRzIGEgcGxhaW4gaGV4YWRlY2ltYWwgdmVyc2lvbgogIG9mIHRoZSBsaWJjdXJsIHZlcnNpb24gbnVtYmVyICh1c2luZyA4IGJpdHMgZm9yIGVhY2ggMyBudW1iZXJzKS4gVmVyc2lvbgogIDcuNy40IGFwcGVhcnMgYXMgMDcwNzA0CgotIFdyb3RlIG1hbiBwYWdlcyBmb3IgY3VybF9nbG9iYWxfaW5pdCBhbmQgY3VybF9nbG9iYWxfY2xlYW51cC4uLgoKLSBULiBCaGFyYXRoIGJyb3VnaHQgbmV3cyBhYm91dCB0aGUgdXNhZ2Ugb2YgdGhlIE9wZW5TU0wgaW50ZXJmYWNlIHRoYXQgd2FzCiAgbm90IHByZXZpb3VzbHkgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGFuZCB0aHVzIGNhdXNlZCBsaWJjdXJsIHRvIGxlYWsKICBtZW1vcnkuICBUaGUgb25seSBzb21ld2hhdCBzYW5lIGFwcHJvYWNoIHRvIGZpeCB0aGlzIGRpbGVtbWEsIGlzIGFkZGluZyB0d28KICB0d28gbmV3IGZ1bmN0aW9ucyBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAoKSB0aGF0IHNob3VsZAogIGJlIGNhbGxlZCAqT05DRSogYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmN1cmwuIFRoZSBpbml0IHNob3VsZCBiZSBkb25lCiAgb25seSBhdCBzdGFydHVwLCBubyBtYXR0ZXIgaG93IG1hbnkgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMgZ29ubmEgdXNlLAogIGFuZCB0aGUgY2xlYW51cCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCB1c2luZwogIGxpYmN1cmwgY29tcGxldGVseS4KCiAgKioqIFVQR1JBREUgTk9USUNFICoqKgoKICBJZiB5b3Ugd3JpdGUgYXBwbGljYXRpb25zIHVzaW5nIGxpYmN1cmwsIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhlIHR3bwogIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUgISEhCgogIEkgY2FuJ3Qgc2F5IEkgdGhpbmsgdGhpcyBpcyBhIHZlcnkgYmVhdXRpZnVsIHNvbHV0aW9uLCBidXQgYXMgT3BlblNTTAogIGluc2lzdHMgb24gbWFraW5nIGxvdHMgb2Ygc3R1ZmYgb24gYSAiZ2xvYmFsIiBzY29wZSwgd2UncmUgZm9yY2VkIHRvIHdhbGsKICB0aGUgcGF0aCB0aGV5IHBvaW50IHVzIHRvLgoKLSBNb3ZpbmcgbW9yZSB0ZXN0IGNhc2VzIGludG8gdGhlIG5ldyBmaWxlIGZvcm1hdC4KClZlcnNpb24gNy43LjQtcHJlMwoKRGFuaWVsICgyMyBNYXkgMjAwMSkKLSBJbnRyb2R1Y2VkIGEgbmV3IGZpbGUgZm9ybWF0IGZvciBzdG9yaW5nIHRlc3QgY2FzZXMsIGFuZCB0aHVzIEkgaGFkIHRvCiAgbW9kaWZ5IGFsbCB0aGUgcGVybCB0ZXN0IHNjcmlwdHMgYW5kIG1vcmUgKEkgYWRkZWQgYSBuZXcgb25lKS4gSSBoYXZlIG5vdAogICJwb3J0ZWQiIGFsbCB0aGUgb2xkIHRlc3QgY2FzZXMgdG8gdGhlIG5ldyBmb3JtYXQgeWV0LCBidXQgaXQnbGwgY29tZS4KCiAgVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZvcm1hdCBpcyB0aGF0IGFsbCB0ZXN0IGRhdGEgZm9yIGVhY2ggdGVzdAogIGNhc2UgaXMgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuIEl0IGdpdmVzIGEgYmV0dGVyIG92ZXJ2aWV3IGZvciBlYWNoIHRlc3QKICBjYXNlIGFuZCBhIGxvdCBsZXNzIGZpbGVzLgoKLSBBbmRy6XMgR2FyY+1hIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBuZXRzY2FwZS9tb3ppbGxhIGNvb2tpZSBmaWxlIHBhcnNpbmcKICBmdW5jdGlvbiwgYXMgaXQgdHVybnMgb3V0IGl0IGRvZXNuJ3QgYWx3YXlzIHN0b3JlIHRoZSBwYXRoIQoKRGFuaWVsICgyMiBNYXkgMjAwMSkKLSBBcyB3YXMgcmVwb3J0ZWQgYW5vbnltb3VzbHksIHdoZW4gRkFJTE9ORVJST1Igd2FzIHVzZWQsIHRoZSBodHRwY29kZSB3YXMKICBub3Qgc3RvcmVkIHByb3Blcmx5IGFuZCB0aHVzIHdhc24ndCBwb3NzaWJseSB0byByZWFkIGFmdGVyIGEgdHJhbnNmZXIgd2l0aAogIHRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZ1bmN0aW9uLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEluc3RhbGxlZCBhbmQgbWFkZSB1c2Ugb2YgdGhlIGZvbGxvd2luZyB0b29sIHZlcnNpb25zOgogICAgYXV0b2NvbmYgMi41MAogICAgbGlidG9vbCAxLjQKICAgIGF1dG9tYWtlIDEuNC1wMQoKICBJIHdvdWxkbid0IHJlY29tbWVuZCBhbnkgZGV2ZWxvcGVyIHRvIHRyeSB0byBnZW5lcmF0ZSB0aGluZ3Mgd2l0aCBvbGRlcgogIHZlcnNpb25zIHRoYW4gdGhlc2UuIEJ1aWxkaW5nIGZyb20gQ1ZTIHdpbGwgcHJvYmFibHkgbW9yZSBvciBsZXNzIHJlcXVpcmUKICBhdCBsZWFzdCB0aGVzZSB2ZXJzaW9ucy4KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZ3JldyB0byBtb3JlIHRoYW4gZG91YmxlIGl0cwogIHByZXZpb3VzIHNpemUhCgogIEFya2FkaXVzeiBNaXNraWV3aWN6IGhlbHBlZCBtZSBieSBwb2ludGluZyBvdXQgSSBoYWQgdG8gcmVtb3ZlIG15CiAgYWNpbmNsdWRlLm00IGZpbGUgYmVmb3JlIEkgY291bGQgZ2V0IGl0IHdvcmtpbmchCgpEYW5pZWwgKDIxIE1heSAyMDAxKQotIEkgbWFkZSBmdHBzOi8vIHdvcmsuIEFkZGVkIHRlc3QgY2FzZSA0MDAgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgYXMgdGhlCiAgZmlyc3QgZnRwczovLyB0ZXN0IGNhc2UuIFJlcXVpcmVzIHN0dW5uZWwuCgotIEFsc28gbWFkZSB0aGUgdGVzdCBjYXNlcyB0aGF0IHJ1bnMgc3NsIHRlc3RzIG5vdCBydW4gaWYgbGliY3VybCBpc24ndCBidWlsdAogIHdpdGggc3NsIHN1cHBvcnQuCgpEYW5pZWwgKDE5IE1heSAyMDAxKQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBub3QgYWRkIGFueSBleHRyYSAtTCBMREZMQUdTIG9yIC1JIENQUEZMQUdTIHVubGVzcyB0aGV5CiAgYXJlIGFjdHVhbGx5IG5lZWRlZC4gQWxiZXJ0IENoaW4ncyBhbmQgRG9tZW5pY28gQW5kcmVvbGkncyBzdWdnZXN0aW9ucwogIGhlbHBlZCBvdXQuCgpWZXJzaW9uIDcuNy40LXByZTIKCkRhbmllbCAoMTggTWF5IDIwMDEpCi0gTmljZXIgY29uZmlndXJlLWNoZWNrIGZvciB0aGUgT3BlblNTTCBoZWFkZXJzLCB3aGljaCB0aGVuIHNldHMgdGhlIHByb3BlcgogIHZhcmlhYmxlIHRvIGhhdmUgY3VybC1jb25maWcgYmUgZ29vZC4gKEFsYmVydCBDaGluIHByb3ZpZGVkIHRoZSBmaXgpCgotIEZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpdyBvd24gJ3N0cmxjYXQoKScgbGliY3VybCBwcm92aWRlcyBpdHMgb3duLgogIEl0IHdhcyBub3cgcmVuYW1lZCB0byBwcmV2ZW50IGNvbGxpZGVzIHdpdGggb3RoZXIgbGlicy4gKEFmdGVyIGRpc2N1c3Npb25zCiAgd2l0aCBTdGVybGluZyBIdWdoZXMgYW5kIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYWQgb24gUEhQIGJ1aWxkcy4pCgpEYW5pZWwgKDE3IE1heSAyMDAxKQotIENvbG0gQnVja2xleSBwb3N0ZWQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IG9uICh0aGUgZGViaWFuaXplZCkgNy43LjMsIHRoYXQKICB0dXJuZWQgb3V0IHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWJpYW4tYnVpbHQgNy43LjMtcGFja2FnZSB0aGF0CiAgY29udGFpbmVkIGZpbGVzIGZyb20gdGhlIDcuNy4yIHJlbGVhc2UhCgotIEkgYWRkZWQgdGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgYWdhaW4sIGJ1dCB3aXRoIGEgZmFrZSB2YWx1ZSwganVzdCB0bwogIG1ha2UgcHJvZ3JhbXMgdGhhdCB1c2UgaXQsIG5vdCBmYWlsIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgdGhpcyB2ZXJzaW9uIG9mCiAgbGliY3VybC4KCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gUGF3ZWwgQS4gR2FqZGEgZml4ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCB0cmFuc2ZlcnMgb24gcmUtdXNlZCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMuCgpWZXJzaW9uIDcuNy40LXByZTEKCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpeGVkIEZUUCBQT1JUIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybC4KCi0gQWRkZWQgdGhlIGZpcnN0IEhUVFBTIHRlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTIgTWF5IDIwMDEpCi0gSnVra2EgUGlobCBzdWdnZXN0ZWQgdGhhdCBpZiAobGliKWN1cmwgaXMgdG9sZCB0byB2ZXJpZnkgdGhlIHBlZXIncwogIGNlcnRpZmljYXRlIGFuZCB0aGUgcGVlciBjYW4ndCBiZSB2ZXJpZmllZCwgaXQgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBhCiAgcHJvcGVyIGVycm9yIGNvZGUuIEkgYWRkZWQgYSBicmFuZCBuZXcgZXJyb3IgY29kZSBuYW1lZAogIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDExIE1heSAyMDAxKQotIEFzIHdhcyBkaXNjdXNzZWQgd2l0aCBGcmVkZXJpYyBMZXBpZWQgYSB3aGlsZSBhZ28sIEkgbm93IG1hZGUgbGliY3VybCBub3QKICByZXR1cm4gZXJyb3IgZXZlbiB0aG91Z2ggbm8gZGF0YSB3YXMgdHJhbnNmZXJlZCBvbiB1cGxvYWQvZG93bmxvYWQgcmVzdW1lCiAgd2hlbiB0aGUgbm8gdHJhbnNmZXIgaXMgbmVlZGVkLiBUaGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBlcnJvciB3YXMgcmVtb3ZlZAogIGZyb20gdGhlIGhlYWRlciBmaWxlIHRvIG1ha2UgYW55IGltcGxlbWVuYXRvciB0aGF0IHVzZXMgdGhhdCB0byBiZSBhd2FyZSBvZgogIHRoZSBmYWN0IHRoYXQgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgYW55bW9yZSEKCi0gSW1wcm92ZWQgZ2VuZXJhbCBoZWFkZXItcGFyc2luZyB0byBiZXR0ZXIgYWxsb3cgd2hpdGUgc3BhY2VzIGFuZCBtb3JlLgoKLSBSb2RuZXkgU2ltbW9ucyBwcm92ZWQgdGhlIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgd2FzIGJhZCBhbmQgSSBoYWQgdG8gcG9zdAogIGFub3RoZXIgb25lLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgdHdvIHJlZGlyZWN0IHByb2JsZW1zIG1vcmUhCgpEYW5pZWwgKDEwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBjb3JyZWN0bHkgbm90ZWQgdGhhdCB0aGUgc3BhY2UtYWZ0ZXItaGVhZGVyIHByb2JsZW0gd2l0aAogIExvY2F0aW9uOiBpcyBwcmVzZW50IG9uIHNldmVyYWwgb3RoZXIgcGxhY2VzIGluIHRoZSBsaWJjdXJsIHNvdXJjZXMuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgaGVhZGVycyB3aXRoIGFuIGV4dHJhIHNwYWNlIGFmdGVyIHRoZSBjb2xvbi4KCi0gUm9kbmV5IFNpbW1vbnMgZm91bmQgb3V0IHRoYXQgbXVsdGlwbGUgRlRQIHRyYW5zZmVycyBkaWQgbm90IHRyZWF0IHJlbGF0aXZlCiAgZGlyZWN0b3JpZXMgY29ycmVjdGx5LgoKRGFuaWVsICg5IE1heSAyMDAxKQotIEdldHRpbmcgYW4gRlRQIGZpbGUgd2l0aCBDVVJMT1BUX05PQk9EWSBzZXQgKG9yIC1JIGZyb20gdGhlIGNvbW1hbmQgbGluZSksCiAgbWFrZXMgY3VybCB1c2UgdGhlIG5vbi1zdGFuZGFyZCBmdHAgY29tbWFuZCAiU0laRSIuIElmIGl0IGZhaWxlZCwgbGliY3VybAogIHJldHVybmVkIGVycm9yLiBTdGFydGluZyBub3csIGl0IGp1c3QgZG9uJ3Qgb3V0cHV0IHRoZSBmaWxlIHNpemUgaW5zdGVhZC4KICBBbm9ueW1vdXMgYnVnIHJlcG9ydC4KCi0gc3R1bm5lbC5wbSB3YXMgYWNjaWRlbnRhbGx5IGxlZnQgb3V0IGZyb20gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgaXQgaXMgbm93CiAgYWRkZWQgKHN0dW5uZWwgaXMgbmVlZGVkIHRvIHJ1biB0aGUgaHR0cHMtdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUpCgpEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvciBhbGwgb3Zlci4gTGludXMgTmllbHNlbiBGZWx0emluZyBoZWxwZWQgbWUKICBmaW5kIHRoaXMuCgotIEFkZGVkIGEgY29uZmlndXJlLmluIGNoZWNrIGZvciBhIHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBpZiBJUHY2IGlzIHJlcXVlc3RlZC4KICBJIGFsc28gbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmZWF0dXJlIC0tZW5hYmxlLWRlYnVnIHdoaWNoIHNldHMgYSBjb3VwbGUKICBvZiBjb21waWxlciBvcHRpb25zIHdoZW4gdXNlZC4gSXQgYXNzdW1lcyBnY2MuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMSkKLSBJIGZpbmFsbHkgdG9vayBhIHN0YWIgYXQgdGhlIGxvbmctdGVybSBGSVhNRSBpdGVtIEkndmUgaGFkIG9uIG15c2VsZiwgYW5kCiAgbm93IGxpYmN1cmwgd2lsbCBwcm9wZXJseSB3b3JrIHdoZW4gZG9pbmcgYSBIVFRQIHJhbmdlLXJlcXVlc3QgdGhhdCBmb2xsb3dzCiAgYSBMb2NhdGlvbjouIFByZXZpb3VzbHkgdGhhdCB3b3VsZCBtYWtlIGxpYmN1cmwgZmFpbCBzYXlpbmcgdGhhdCB0aGUgc2VydmVyCiAgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvciB0aGUgSFRUUCBQVVQgcmVzdW1lIHRoaW5nICh0ZXN0IGNhc2UgMzMpLgoKVmVyc2lvbiA3LjYuMS1wcmUxCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBZZXQgYW5vdGhlciBDb250ZW50LVJhbmdlIGNoYW5nZS4gT2sgbm93PyBCb2IgU2NoYWRlciBjaGVja3MgZnJvbSBoaXMgZW5kCiAgYW5kIGl0IHdvcmtzIGZvciBoaW0uCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwMSkKLSBTbyB0aGUgSFRUUCBQVVQgcmVzdW1lIGZpeCB3YXNuJ3QgZ29vZC4gVGhlcmUgc2hvdWxkIGFwcGVhcmFudGx5IGJlIGEKICBDb250ZW50LVJhbmdlIGhlYWRlciB3aGVuIHJlc3VtaW5nIGEgUFVULgoKLSBJIG5vdGljZWQgSSBicm9rZSB0aGUgZG93bmxvYWQtY2hlY2sgdGhhdCB2ZXJpZmllcyB0aGF0IGEgcmVzdW1lZCBIVFRQCiAgZG93bmxvYWQgaXMgYWN0dWFsbHkgcmVzdW1lZC4gSXQgZ290IGJyb2tlIGJlY2F1c2UgbXkgbmV3ICdodHRwcmVxJyBmaWVsZAogIGluIHRoZSBtYWluIGN1cmwgc3RydWN0LiBJIHNob3VsZCBnZXQgc2xhcHBlZC4gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IKICB0aGlzIG5vdywgc28gSSB3b24ndCBiZSBhYmxlIHRvIHJ1aW4gdGhpcyBhZ2FpbiB3aXRob3V0IG5vdGljaW5nLgoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgY29udGVudC1sZW5ndGggdmVyaWZ5aW5nIHdoZW4gZG93bmxvYWRpbmcgSFRUUC4KCi0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdGl0bGUgc2F5IGlmIHRoZSB0cmFuc2ZlciBpcyBiZWluZyB0cmFuc2ZlcmVkLiBJdAogIG1ha2VzIHRoZSBvdXRwdXQgc2xpZ2h0bHkgYmV0dGVyIGZvciByZXN1bWVzLgoKLSBXaGVuIGRlYWxpbmcgd2l0aCBMb2NhdGlvbjogYW5kIEhUVFAgcmV0dXJuIGNvZGVzLCBsaWJjdXJsIHdpbGwgbm90IGF0dGVtcHQKICB0byBmb2xsb3cgdGhlIHNwaXJpdCBvZiBSRkMyNjE2IGJldHRlci4gSXQgbWVhbnMgdGhhdCB3aGVuIFBPU1RpbmcgdG8gYQogIFVSTCB0aGF0IGlzIGJlaW5nIGZvbGxvd2luZyB0byBhIHNlY29uZCBwbGFjZSwgdGhlIHN0YW5kYXJkIHdpbGwganVkZ2Ugb24KICB3aGF0IHRvIGRvLiBBbGwgSFRUUCBjb2RlcyBleGNlcHQgMzAzIGFuZCAzMDUgd2lsbCBjYXVzZSBjdXJsIHRvIG1ha2UgYQogIHNlY29uZCBQT1NUIG9wZXJhdGlvbi4gMzAzIHdpbGwgbWFrZSBhIEdFVCBhbmQgMzA1IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBJIGFsc28gd3JvdGUgdHdvIHRlc3QgY2FzZXMgZm9yIHRoaXMgUE9TVC9HRVQvTG9jYXRpb24gc3R1ZmYuCgpWZXJzaW9uIDcuNgoKRGFuaWVsICgyNiBKYW51YXJ5IDIwMDEpCi0gTG90cyBvZiBtYWlscyBiYWNrIGFuZCBmb3J0aCB3aXRoIEJvYiBTY2hhZGVyIGZpbmFsbHkgbWFkZSBtZSBhZGQgYSBzbWFsbAogIHBpZWNlIG9mIGNvZGUgaW4gdGhlIEhUVFAgZW5naW5lIHNvIHRoYXQgSFRUUCB1cGxvYWQgcmVzdW1lIHdvcmtzLiBZb3UgY2FuCiAgbm93IGRvIGFuIG9wZXJhdGlvbiBsaWtlICdjdXJsIC1UIGZpbGUgLUMgPG9mZnNldD4gPFVSTD4nIGFuZCBjdXJsIHdpbGwgUFVUCiAgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBmaWxlIHN0YXJ0aW5nIGF0IGdpdmVuIG9mZmV0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgoKVmVyc2lvbiA3LjYtcHJlNAoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDEpCi0gSSB0b29rIGhvbGQgb2YgUmljayBKb25lcycgcXVlc3Rpb24gd2h5IHdlIGRvbid0IHVzZSByZWN2KCkgYW5kIHNlbmQoKSBmb3IKICByZWFkaW5nL3dyaXRpbmcgdG8gdGhlIHNvY2tldHMgYW5kIEkndmUgbm93IG1vZGlmaWVkIHRoZSBzcmVhZCgpIGFuZAogIHN3cml0ZSgpIG1hY3JvcyB0byB1c2UgdGhlbSBpbnN0ZWFkLiBJZiBub3RoaW5nIGVsc2UsIHRoZXkgY291bGQgYmUgdGVzdGVkCiAgaW4gdGhlIG5leHQgYmV0YS1yb3VuZCBjb21pbmcgcmlnaHQgdXAuCgotIEplZmYgTW9ycm93IGZvdW5kIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2FnZSBvZiBTU0xfcmVhZCgpIGFuZCBzdXBwbGllZAogIGhpcyByZXNlYXJjaCByZXN1bHRzIGluIGhvdyB0byBmaXggdGhpcy4gSXQgdHVybnMgb3V0IHdlIGhhdmUgdG8gaW52b2tlIHRoZQogIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMgaW4gc29tZSBjYXNlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIFNTTF93cml0ZSgpLgoKICBJIG1hZGUgc29tZSByYXRoZXIgZHJhc3RpYyBjaGFuZ2VzIGFsbCBvdmVyIGxpYmN1cmwgdG8gbWFrZSBhbGwgd3JpdGVzIGFuZAogIHJlYWRzIGdldCBkb25lIG9uIG9uZSBzaW5nbGUgcGxhY2Ugc28gdGhhdCB0aGlzIHJlcGVhdGVkLWF0dGVtcHRzIHRoaW5nCiAgd291bGQgb25seSBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludC4KCi0gUmljayBKb25lcyBzcG90dGVkIHRoYXQgdGhlICd0b3RhbCB0aW1lJyBjb3VudGVyIHJlYWxseSBkaWRuJ3QgbWVhc3VyZSB0aGUKICB0b3RhbCB0aW1lIHZlcnkgYWNjdXJhdGUgb24gc3Vic2Vjb25kIGxldmVscy4KCi0gSm9oYW4gTmlsc3NvbiBwb2ludGVkIG91dCB0aGUgbmVlZCB0byBtb3JlIGNsZWFybHkgc3BlY2lmeSB0aGF0IHRoZSB0aW1lb3V0CiAgdmFsdWUgeW91IHNldCBmb3IgYSBkb3dubG9hZCBpcyBmb3IgdGhlICplbnRpcmUqIGRvd25sb2FkLiBUaGVyZSdzIGN1cnJlbnRseQogIG5vIG9wdGlvbiBhdmFpbGFibGUgdGhhdCBzZXRzIGEgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2Ugb25seS4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHN1Ym1pdHRlZCBhIHNlcmllcyBvZiBwYXRjaGVzIHJlcXVpcmVkIHRvIGdldCBjdXJsIHRvIGNvbXBpbGUKICBwcm9wZXJseSB3aXRoIGN5Z3dpbi4KCi0gUm9iZXJ0IFdlYXZlciBwb3N0ZWQgYSBmaXggZm9yIHRoZSB3aW4zMiBzZWN0aW9uIG9mIHRoZSBjdXJsX2dldGVudigpIGNvZGUKICB0aGF0IGNvcnJlY3RlZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KCi0gQWRkZWQgY29tbWVudHMgaW4gYSBmZXcgZmlsZXMgaW4gYSBzdWRkZW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBzb3VyY2VzIG1vcmUKICBlYXN5IHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQhCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMSkKLSBBZGRlZCBzaW1wbGUgSVB2NiBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG1hZGUgdGhlIHZlcnNpb24KICBzdHJpbmcgYWRkICdpcHY2JyB0byB0aGUgZW5hYmxlIHNlY3Rpb24gaW4gdGhhdCBjYXNlLiBFTkFCTEVfSVBWNiB3aWxsIGJlCiAgc2V0IGlmIGN1cmwgaXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQgZW5hYmxlZC4KCi0gQWRkZWQgYSBwYXJzZXIgZm9yIElQdjYtc3R5bGUgc3BlY2lmaWVkIElQLWFkZHJlc3NlcyBpbiBhIFVSTC4gVGh1cywgd2hlbgogIElQdjYgZ2V0cyBlbmFibGVkIHNvb24sIHdlIGNhbiB1c2UgVVJMcyBsaWtlICdbMDo6MV06ODAnLi4uCgotIE1hZGUgdGhlIFVSTCBnbG9iYmluZyBpbiB0aGUgY2xpZW50IHBvc3NpYmxlIHRvIGZhaWwgc2lsZW50bHkgaWYgdGhlcmUncyBhbgogIGVycm9yIGluIHRoZSBnbG9iYmluZy4gSXQgbWFrZXMgaXQgYWxtb3N0IGludHVpdGl2ZSwgc28gd2hlbiB5b3UgZG9uJ3QKICBmb2xsb3cgdGhlIHN5bnRheCBydWxlcywgZ2xvYmJpbmcgaXMgc2ltcGx5IHN3aXRjaGVkIG9mZiBhbmQgdGhlIHJhdyBzdHJpbmcKICBpcyB1c2VkIGluc3RlYWQuCgogIEkgc3RpbGwgdGhpbmsgd2UnbGwgZ2V0IHByb2JsZW1zIHdpdGggSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMgd2hlbiB3ZSAqd2FudCoKICBnbG9iYmluZyBvbiBwYXJ0cyBvZiB0aGUgVVJMIGFzIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIFVSTCB3aWxsIGZvciBzdXJlCiAgc2VyaW91c2x5IGNvbmZ1c2UgdGhlIGdsb2JiZXIuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHByb2dyZXNzIG1ldGVyIHBhdGNoIHRoYXQgbWFrZXMgaXQgbG9vayBiZXR0ZXIgZXZlbgogIGR1cmluZyBzbG93IHN0YXJ0cy4gUHJldmlvdXNseSBpdCBtYWRlIHNvbWUgc2lsbHkgYXNzdW1wdGlvbnMuLi4KCi0gQWRkZWQgdHdvIEZUUCB0ZXN0cyBmb3IgLVEgYW5kIC1RIC0gc3R1ZmYgc2luY2UgaXQgd2FzIGJlaW5nIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QuIEhhZCB0byBjb3JyZWN0IHRoZSBmdHBzZXJ2ZXIucGwgdG9vIGFzIGl0IGJ1Z2dlZCBzbGlnaHRseS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIExvY2F0aW9uOiBwYXJzZXJzIGRlYWwgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRodXMgSSByZW1vdmVkIHRoZSBsYXN0CiAgY29kZSB0aGF0IHJlc3RyaWN0cyB0aGUgbGVuZ3RoIG9mIFVSTHMgdGhhdCBjdXJsIHN1cHBvcnRzLgoKLSBBZGRlZCBhIC0tZ2xvYm9mZiB0ZXN0IGNhc2UgKCMyOCkgYW5kIGl0IHF1aWNrbHkgaWRlbnRpZmllZCBhIG1lbW9yeSBwcm9ibGVtCiAgaW4gc3JjL21haW4uYyB0aGF0IEkgdG9vayBjYXJlIG9mLgoKVmVyc2lvbiA3LjYtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgdHdvIGZvcm1lciBmaWxlcyBsaWIvZG93bmxvYWQuYyBhbmQgbGliL2hpZ2hsZXZlbC5jIGJlY29tZSB0aGUgbmV3CiAgbGliL3RyYW5zZmVyLmMgd2hpY2ggbWFrZXMgbW9yZSBzZW5zZS4gSSBhbHNvIGRpZCB0aGUgcmVuYW1lIGZyb20gVHJhbnNmZXIoKQogIHRvIEN1cmxfVHJhbnNmZXIoKSBpbiB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgdXNlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogIGluIHRoZSBzcGlyaXQgb2YgdXNpbmcgQ3VybF8gcHJlZml4IGZvciBsaWJyYXJ5LXNjb3BlZCBnbG9iYWwgc3ltYm9scy4KCkRhbmllbCAoMTEgSmFudWFyeSAyMDAxKQotIEFkZGVkIC1nLy0tZ2xvYm9mZiB0aGF0IHN3aXRjaGVzIE9GRiB0aGUgVVJMIGdsb2JiaW5nIGFuZCB0aHVzIGVuYWJsZXMge31bXQogIGxldHRlcnMgdG8gYmUgcGFydCBvZiB0aGUgVVJMLiBEbyBub3RlIHRoYXQgUkZDMjM5NiBzZWN0aW9uIDIuNC4zIGV4cGxpY2l0bHkKICBtZW50aW9uIHRoZXNlIGxldHRlcnMgdG8gYmUgZXNjYXBlZC4gVGhpcyB3YXMgcG9zdGVkIGFzIGEgZmVhdHVyZSByZXF1ZXN0IGJ5CiAgSm9yZ2UgR3V0aWVycmV6IGFuZCBhcyBhIGJ1ZyBieSBUZXJyeS4KCi0gU2hvcnQgb3B0aW9ucyB0byBjdXJsIHRoYXQgcmVxdWlyZXMgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRob3V0CiAgaGF2aW5nIHRoZSBvcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgc3BhY2Ugc2VwYXJhdGVkLiAtb2ZpbGUgd29ya3MgYXMgZ29vZCBhcwogIC1vIGZpbGUuIC1tMjAgaXMgZXF1YWwgdG8gLW0gMjAuIERvIG5vdGUgdGhhdCB0aGlzIGdvZXMgZm9yIHNpbmdsZS1sZXR0ZXIKICBvcHRpb25zIG9ubHksIHZlcmJvc2UgLS1sb25nLXN0eWxlIG9wdGlvbnMgc3RpbGwgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aAogIHNwYWNlIGZyb20gdGhlaXIgcGFyYW1ldGVycy4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDEpCi0gRnJhbmNpcyBEYWdlbmFpcyByZXBvcnRlZCB0aGF0IHRoZSBTQ08gY29tcGlsZXIgc3RpbGwgZmFpbHMgd2hlbiBjb21waWxpbmcKICBjdXJsIGR1ZSB0byB0aGF0IGdldHBhc3NfcigpIHByb3RvdHlwZS4gSSd2ZSBub3cgcHV0IGl0IGFyb3VuZCAjaWZuZGVmCiAgSEFWRV9HRVRQQVNTX1IgaW4gYW4gYXR0ZW1wdCB0byBwbGVhc2UgdGhlIFNDTyBzeXN0ZW1zLgoKLSBNYWRlIHNvbWUgbWlub3IgY29ycmVjdGlvbnMgdG8gZ2V0IHRoZSBjbGllbnQgdG8gY2xlYW51cCBwcm9wZXJseSBhbmQgSSBtYWRlCiAgdGhlIHNlcGFyYXRvciB3b3JrIGFnYWluIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBnbG9iYmVkIFVSTHMgdG8gc3Rkb3V0LgoKLSBXb3JrZWQgd2l0aCBMb2ljIERhY2hhcnkgdG8gZ2V0IHRoZSBtYWtlIGRpc3QgYW5kIG1ha2UgZGlzdGNoZWNrIHdvcmsKICBjb3JyZWN0bHkuIFRoZSAnbWFrZXRneicgc2NyaXB0IGlzIG5vdyB1c2luZyB0aGUgYXV0b21ha2UgZ2VuZXJhdGVkICdtYWtlCiAgZGlzdCcgd2hlbiBjcmVhdGluZyByZWxlYXNlIGFyY2hpdmVzLiBMb2ljIHN1Y2Nlc3NmdWxseSBtYWRlICdtYWtlIHJwbXMnCiAgYXV0b21hdGljYWxseSBidWlsZCBSUE1zIQoKTG9pYyBEYWNoYXJ5ICg2IEphbnVhcnkgMjAwMSkKLSBBdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBycG0gcGFja2FnZXMsIG5vIG5lZWQgdG8gYmUgcm9vdC4KCi0gbWFrZSBkaXN0Y2hlY2sgZ2VuZXJhdGVzIGEgcHJvcGVyIGRpc3RyaWJ1dGlvbiAoRVhUUkFfRElTVAogIGluIGFsbCBNYWtlZmlsZS5hbSBtb2RpZmllZCB0byBtYXRjaCBGSUxFUykuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAxKQotIEh1Z2UgY2xpZW50LXNpZGUgaGFjazogbm93IG11bHRpcGxlIFVSTHMgYXJlIHN1cHBvcnRlZC4gQW55IG51bWJlciBvZiBVUkxzCiAgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhleSdsbCBhbGwgYmUgZG93bmxvYWRlZC4gVGhlcmUKICBtdXN0IGJlIGEgY29ycmVzcG9uZGluZyAtbyBvciAtTyBmb3IgZWFjaCBVUkwgb3IgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvCiAgc3Rkb3V0LiBUaGlzIG5lZWRzIG1vcmUgdGVzdGluZywgdGltZSB0byByZWxlYXNlIGEgNy42LXByZSBwYWNrYWdlLgoKLSBUaGUga3JiNCBzdXBwb3J0IHdhcyBicm9rZW4gaW4gdGhlIHJlbGVhc2UuIEZpeGVkIG5vdy4KCi0gSHVnZSBpbnRlcm5hbCBzeW1ib2wgcmVuYW1lIG9wZXJhdGlvbi4gQWxsIG5vbi1zdGF0aWMgYnV0IHN0aWxsIGxpYi1pbnRlcm5hbAogIHN5bWJvbHMgc2hvdWxkIG5vdyBiZSBwcmVmaXhlZCB3aXRoICdDdXJsXycgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggb3RoZXIKICBsaWJzLiBBbGwgcHVibGljIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggJ2N1cmxfJyBhbmQgdGhlIHJlc3Qgc2hvdWxkCiAgYmUgc3RhdGljIGFuZCB0aHVzIGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSSB1cGRhdGVkIHRoZSBJTlRFUk5BTFMKICBkb2N1bWVudCB0byBzYXkgdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjUuMgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMSkKLSBBcyBLZXZpbiBQIFJvdGggc3VnZ2VzdGVkLCBJJ3ZlIGFkZGVkIHRleHQgdG8gdGhlIG1hbiBwYWdlIGZvciBldmVyeSBjb21tYW5kCiAgbGluZSBvcHRpb24gYW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBzcGVjaWZ5IHRoYXQgb3B0aW9uIG1vcmUgdGhhbgogIG9uY2UuIFRoYXQgaGFzbid0IGJlZW4gZXhhY3RseSBjcnlzdGFsIGNsZWFyIGJlZm9yZS4KCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBwb3NzaWJsZSB0byBydW4gZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4gRm9yCiAgb2RkIHJlYXNvbnMgSSBjYW4ndCBidWlsZCBjdXJsIHByb3Blcmx5IG91dHNpZGUgdGhvdWdoLiBJdCBoYXMgdG8gZG8gd2l0aAogIGN1cmwncyBkZXBlbmRlbmNpZXMgb24gbGliY3VybC4uLgoKLSBDdXQgb2ZmIGFsbCBvbGRlciAoZGF0ZWQgMTk5OSBhbmQgZWFybGllcikgQ0hBTkdFUyBlbnRyaWVzIGZyb20gdGhpcyBmaWxlLgogIFRoZSBvbGRlciBwaWVjZSBpcyBuYW1lZCBDSEFOR0VTLjAgYW5kIGlzIGFkZGVkIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSBpbgogIGNhc2UgYW55b25lIHdvdWxkIG5lZWQgaXQuCgotIEkgYWRkZWQgYW5vdGhlciBmaWxlICdDVlMtSU5GTycgdG8gdGhlIENWUy4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICBmaWxlcyBpbiB0aGUgQ1ZTIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHJlbGVhc2UgYXJjaGl2ZXMgYW5kIGhvdyB0byBidWlsZAogIGN1cmwgd2hlbiB5b3UgZ2V0IHRoZSBzb3VyY2VzIG9mZiBDVlMuCgotIFVwZGF0ZWQgQ09OVFJJQlVURSBhbmQgRkFRIGR1ZSB0byB0aGUgbmV3IGxpY2Vuc2UuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAxKQotIFJlbmFtZWQgUkVBRE1FLmxpYmN1cmwgdG8gTElCQ1VSTAoKLSBDaGFuZ2VkIGhlYWRlcnMgaW4gYWxsIHNvdXJjZXMgZmlsZXMgdG8gdGhlIG5ldyBkdWFsIGxpY2Vuc2UgY29uY2VwdCBvZgogIGN1cmw6IHVzZSB0aGUgTUlUL1ggZGVyaXZhdGUgbGljZW5zZSAqb3IqIE1QTC4gVGhlIExFR0FMIGZpbGUgd2FzIHVwZGF0ZWQKICBhY2NvcmRpbmdseSBhbmQgdGhlIE1QTCAxLjEgYW5kIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2VzIGFyZSBub3cgcGFydCBvZiB0aGUKICByZWxlYXNlIGFyY2hpdmUuCkRhbmllbCAoMzAgRGVjZW1iZXIgMjAwMCkKLSBNYWRlIGFsbCBGVFAgY29tbWFuZHMgZ2V0IHNlbnQgd2l0aCB0aGUgdHJhaWxpbmcgQ1JMRiBpbiBvbmUgc2luZ2xlIHdyaXRlKCkKICBhcyBzcGxpdHRpbmcgdGhlbSB1cCBzZWVtcyB0byBjb25mdXNlIGF0IGxlYXN0IHNvbWUgZmlyZXdhbGxzIChGVy0xIGJlaW5nCiAgb25lIG1ham9yKS4KCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwMCkKLSBBZGRlZCBmaWxlIGRlc3JjaXB0b3IgYW5kIEZJTEUgaGFuZGxlIGxlYWsgZGV0ZWN0aW9uIHRvIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0KICBhbmQgdGh1cyBJIGZvdW5kIGFuZCByZW1vdmVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWthZ2UgaW4gdGhlIGZ0cCBwYXJ0cwogIHRoYXQgaGFwcGVuZWQgd2hlbiB5b3UgZGlkIFBPUlRlZCBkb3dubG9hZHMuCgotIEFkZGVkIGFuIGluY2x1ZGUgPHN0ZGlvLmg+IGluIDxjdXJsL2N1cmwuaD4gc2luY2UgaXQgdXNlcyBGSUxFICouCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDApCi0gTXVsdGlwbGUgVVJMIGRvd25sb2FkcyB3aXRoIC1PIHdhcyBzdGlsbCBidWdnaW5nLiBOb3QgYW55bW9yZSBJIHRoaW5rIG9yCiAgaG9wZSwgb3IgYXQgbGVhc3QgSSd2ZSB0cmllZC4uLiA6LU8KCi0gRnJhbmNvaXMgUGV0aXRqZWFuIGZpeGVkIGFub3RoZXIgLU8gcHJvYmxlbQoKVmVyc2lvbiA3LjUuMQoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAwKQotIENsZWFuZWQgdXAgYSBmZXcgb2YgdGhlIG1ha2VmaWxlcyB0byB1c2UgdW5peC1zdHlsZSBuZXdsaW5lcyBvbmx5LiBBcyBLZXZpbgogIFAgUm90aCBmb3VuZCBvdXQsIGF0IGxlYXN0IG9uZSBDVlMgY2xpZW50IGJlaGF2ZWQgd3JvbmdseSB3aGVuIGl0IGZvdW5kCiAgZGlmZmVyZW50IG5ld2xpbmUgY29udmVudGlvbnMgd2l0aGluIHRoZSBzYW1lIGZpbGUuCgotIEFsYmVydCBDaGluLUEtWW91bmcgY29ycmVjdGVkIHRoZSBMREZMQUdTIHVzZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IKICB0aGUgU1NMIHN0dWZmLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDApCi0gTWFzc2ltbyBTcXVpbGxhY2UgY29ycmVjdGx5IGRlc2NyaWJlZCBob3cgbGliY3VybCBjb3VsZCB1c2Ugc2Vzc2lvbiBpZHMgd2hlbgogIGRvaW5nIFNTTCBjb25uZWN0aW9ucy4KCi0gSmFtZXMgR3JpZmZpdGhzIGZvdW5kIG91dCB0aGF0IGN1cmwgd291bGQgY3Jhc2ggaWYgdGhlIGZpbGUgeW91IHNwZWNpZnkgd2l0aAogIC1vIGlzIHNob3J0ZXIgdGhhbiB0aGUgVVJMISBUaGlzIHRvb2sgc29tZSBob3VycyB0byBmdWxseSBodW50IGRvd24sIGJ1dCBpdAogIGlzIGZpeGVkIG5vdy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDAwKQotIEphZXBpbCBLaW0gc2VudCB1cyBtYWtlZmlsZXMgdGhhdCBidWlsZCBjdXJsIHVzaW5nIHRoZSBmcmVlIHdpbmRvd3MgYm9ybGFuZAogIGNvbXBpbGVyLiBUaGUgcm9vdCBtYWtlZmlsZSBub3cgYWNjZXB0cyAnbWFrZSBib3JsYW5kJyB0byBidWlsZCBjdXJsIHdpdGgKICB0aGF0IGNvbXBpbGVyLgoKLSBTdGVmYW4gUmFkbWFuIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlc3QgbWFrZWZpbGVzIGRpZG4ndCB1c2UgdGhlIFBFUkwKICB2YXJpYWJsZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0cyBmaWd1cmUgb3V0LiBBY3R1YWxseSwgeW91IHN0aWxsIG5lZWQKICBwZXJsIGluIHRoZSBwYXRoIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBydW4gb2suCgotIFJpY2ggR3JheSBmb3VuZCBudW1lcm91cyBwb3J0YWJpbGl0eSBwcm9ibGVtczoKICAqIFRoZSBTQ08gY29tcGlsZXIgZ290IGFuIGVycm9yIG9uIHRoZSBnZXRwYXNzX3IoKSBwcm90b3R5cGUgaW4gZ2V0cGFzcy5oCiAgICBzaW5jZSB0aGUgY3VybCBvbmUgZGlmZmVyZWQgZnJvbSB0aGUgU0NPIG9uZQogICogVGhlIEhQVVggY29tcGlsZXIgZ290IGFuIGVycm9yIGJlY2F1c2Ugb2YgaG93IGN1cmwgZGlkIHRoZSBzaWdhY3Rpb24KICAgIHN0dWZmIGFuZCB1c2VkIGEgZGVmaW5lIEhQVVggZG9lc24ndCBoYXZlIChvciBuZWVkKS4KICAqIEEgZmV3IG1vcmUgcHJvYmxlbXMgcmVtYWluIHRvIGJlIHJlc2VhcmNoZWQuCgotIFBhdWwgSGFycmluZ3RvbiBleHBlcmllbmNlZCBhIGNvcmUgZHVtcCB1c2luZyBodHRwcy4gTm90IG11Y2ggZGV0YWlscyB5ZXQuCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIGEgcHJvYmxlbSB3aXRoIG11bHRpcGxlIFVSTHMgYW5kIC1vLy1PLgoKVmVyc2lvbiA3LjUKCkRhbmllbCAoMSBEZWNlbWJlciAyMDAwKQotIENyYWlnIERhdmlzb24gZ2F2ZSB1cyBoaXMgdXBkYXRlcyBvbiB0aGUgVkMrKyBtYWtlZmlsZXMsIHNvIG5vdyBjdXJsIHNob3VsZAogIGJ1aWxkIGZpbmUgd2l0aCB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIG9uIHdpbmRvd3MgdG9vLgoKLSBGaXhlZCB0aGUgbGliY3VybCB2ZXJzaW9uaW5nIHNvIHRoYXQgd2UgZG9uJ3QgcnVpbiBvbGQgcHJvZ3JhbXMgd2hlbgogIHJlbGVhc2luZyBuZXcgc2hhcmVkIGxpYnJhcnkgaW50ZXJmYWNlcy4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMCkKLSBSZW5hbWVkIGRvY3MvUkVBRE1FLmN1cmwgdG8gZG9jcy9NQU5VQUwgdG8gYmV0dGVyIHJlZmxlY3Qgd2hhdCB0aGUgZG9jdW1lbnQKICBhY3R1YWxseSBjb250YWlucy4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMCkKLSBJIHJlbW92ZWQgYSBidW5jaCBvZiAnI2lmIDAnIHNlY3Rpb25zIGZyb20gdGhlIGNvZGUuIFRoZXkgb25seSBtYWtlIHRoaW5ncwogIGhhcmRlciB0byBmb2xsb3cuIEFmdGVyIGFsbCwgd2UgZG8gaGF2ZSBhbGwgb2xkZXIgdmVyc2lvbnMgaW4gdGhlIENWUy4KClZlcnNpb24gNy41LXByZTUKCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMCkKLSBJIGZpbGxlZCBpbiBtb3JlIGVycm9yIGNvZGVzIGluIHRoZSBtYW4gcGFnZSBlcnJvciBjb2RlIGxpc3QgdGhhdCBoYWQgYmVlbgogIGxhZ2dpbmcuCgotIEphbWVzIEdyaWZmaXRocyBtYWlsZWQgbWUgYSBmaW5lIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgQ1VSTE9QVF9NQVhSRURJUlMKICBsaWJjdXJsIG9wdGlvbi4gV2hlbiB1c2VkLCBpdCdsbCBwcmV2ZW50IGxvY2F0aW9uIGZvbGxvd2luZyBtb3JlIHRoYW4gdGhlCiAgc2V0IG51bWJlciBvZiB0aW1lcy4gSXQgaXMgdXNlZnVsIHRvIGJyZWFrIG91dCBvZiBlbmRsZXNzIHJlZGlyZWN0LWxvb3BzLgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHR3byB0ZXN0IGNhc2VzIGZvciBmaWxlOi8vLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHRoZSBsaWJjdXJsIENVUkxPUFRfRklMRVRJTUUgc2V0b3B0LCB3aGVuIHNldCBpdCB0cmllcyB0byBnZXQgdGhlCiAgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpb24gc2luY2UgaXQKICBpbnZvbHZlcyBhbiBleHRyYSBzZXQgb2YgY29tbWFuZHMgb24gRlRQIHNlcnZlcnMuIChVc2luZyB0aGUgTURUTSBjb21tYW5kCiAgd2hpY2ggaXMgbm90IGluIHRoZSBSRkM5NTkpCgogIGN1cmxfZWFzeV9nZXRpbmZvKCkgZ290IGEgY29ycmVzcG9uZGluZyBDVVJMSU5GT19GSUxFVElNRSB0byBnZXQgdGhlIHRpbWUKICBhZnRlciBhIHRyYW5zZmVyLiBJdCdsbCByZXR1cm4gYSB6ZXJvIGlmIENVUkxPUFRfRklMRVRJTUUgd2Fzbid0IHVzZWQgb3IgaWYKICB0aGUgdGltZSB3YXNuJ3QgcG9zc2libGUgdG8gZ2V0LgoKICAtLWhlYWQvLUkgdXNlZCBvbiBhIEZUUCBzZXJ2ZXIgd2lsbCBub3cgcHJlc2VudCBhICdMYXN0LU1vZGlmaWVkOicgaGVhZGVyCiAgaWYgY3VybCBjb3VsZCBnZXQgdGhlIHRpbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgoKLSBBZGRlZCB0aGUgb3B0aW9uICctLWNhY2VydCBbZmlsZV0nIHRvIGN1cmwsIHdoaWNoIGFsbG93cyBhIHNwZWNpZmllZCBQRU0KICBmaWxlIHRvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgd2hlbiBkb2luZyBIVFRQUwogIGNvbm5lY3Rpb25zLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZCwgcmF0aGVyIHJlY2VudGx5IGJ5IEh1bGthIEJvaHVzbGF2IGJ1dAogIG90aGVycyBoYXZlIGFza2VkIGZvciBpdCBiZWZvcmUgYXMgd2VsbC4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMCkKLSBOdW1lcm91cyBmaXhlcyB0aGUgdGVzdCBzdWl0ZSBoYXMgYnJvdWdodCBpbnRvIHRoZSBkYXlsaWdodDoKCiAgICogY3VybF91bmVzY2FwZSgpIGNvdWxkIHJldHVybiBhIHRvbyBsb25nIHN0cmluZwogICAqIG9uIGZ0cCB0cmFuc2ZlciBmYWlsdXJlcywgdGhlcmUgY291bGQgYmUgbWVtb3J5IGxlYWtzCiAgICogZnRwIENXRCBjb3VsZCB1c2UgYmFkIGRpcmVjdG9yeSBuYW1lcwogICAqIG1lbWRlYnVnIG5vdyB1c2VzIHRoZSBtcHJpbnRmKCkgcm91dGluZXMgZm9yIGJldHRlciBwb3J0YWJpbGl0eQogICAqIGZyZWUoTlVMTCkgcmVtb3ZlZCB3aGVuIGRvaW5nIHJlc3VtZWQgdHJhbnNmZXJzCgotIEFkZGVkIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBmb3IgRlRQLgoKLSBHZW5lcmFsIGNsZWFudXBzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyB3aXRoIGdjYyAtV2FsbCAtcGVkYW50aWMuCgotIEkgbWFkZSB0aGUgdGVzdHMvZnRwc2VydmVyLnBsIHdvcmsgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ0cAogIG9wZXJhdGlvbnMuIFBPUlQsIFBBU1YsIFJFVFIsIFNUT1IsIExJU1QsIFNJWkUsIFVTRVIsIFBBU1MgYWxsIHdvcmsgbm93LiBOb3cKICBhbGwgSSBoYXZlIHRvIGRvIGlzIGludGVncmF0ZSB0aGUgZnRwIHNlcnZlciBkb2luZ3MgaW4gdGhlIHJ1bnRlc3RzLnBsCiAgc2NyaXB0IHNvIHRoYXQgZnRwIHRlc3RzIGNhbiBiZSBydW4gdGhlIHNhbWUgd2F5IGh0dHAgdGVzdHMgYWxyZWFkeSBydW4uCgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDApCi0gTWFkZSBsaWJjdXJsIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGhlIGZvcm1lciBsaW1pdCBvZgogIDQwOTYgYnl0ZXMgd2FzIGEgYml0IGFubm95aW5nIHdoZW4gcGVvcGxlIHdhbnRlZCB0byB1c2UgY3VybCB0byByZWFsbHkgbWFrZQogIGxpZmUgdG91Z2ggb24gYSB3ZWIgc2VydmVyLiBOb3csIHRoZSBjb21tYW5kIGxpbmUgbGltaXQgaXMgdGhlIG1vc3QgYW5ub3lpbmcKICBidXQgdGhhdCBjYW4gYmUgY2lyY3VtdmVudGVkIGJ5IHVzaW5nIGEgY29uZmlnIGZpbGUuCgogIE5PVEU6IHRoZXJlIGlzIHN0aWxsIGEgNDA5Ni1ieXRlIGxpbWl0IG9uIFVSTHMgZXh0cmFjdGVkIGZyb20gTG9jYXRpb246CiAgaGVhZGVycy4KCi0gQ29ycmVjdGVkIHRoZSBzcGVsbGluZyBvZiAncmVzb2x2ZScgaW4gdHdvIGVycm9yIG1lc3NhZ2VzLgoKLSBBbGV4YW5kZXIgS291cmFrb3MgcG9zdGVkIGEgYnVnIHJlcG9ydCBhbmQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCEgSXQKICB0dXJuZWQgb3V0IHRoYXQgbHlueCBhbmQgd2dldCBzdXBwb3J0IGxvd2VyY2FzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcwogIHdoZXJlIGN1cmwgb25seSBsb29rZWQgZm9yIHRoZSB1cHBlcmNhc2UgdmVyc2lvbnMuIE5vdyBjdXJsIHdpbGwgdXNlIHRoZQogIGxvd2VyY2FzZSB2ZXJzaW9ucyBpZiB0aGV5IGV4aXN0LCBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgdXNlIHRoZSB1cHBlcmNhc2UKICB2ZXJzaW9ucy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMjAwMCkKLSBjdXJsX2Zvcm1mcmVlKCkgd2FzIGFkZGVkLiBIb3cgY29tZSBubyBvbmUgbWlzc2VkIHRoYXQgb25lIGJlZm9yZT8gSSByYW4gdGhlCiAgdGVzdCBzdWl0ZSB3aXRoIHRoZSBtYWxsb2MgZGVidWcgZW5hYmxlZCBhbmQgZ290IGxvdHMgb2YgIm5pY2UiIHdhcm5pbmdzIG9uCiAgbWVtb3J5IGxlYWtzLiBUaGUgbW9zdCBzZXJpb3VzIG9uZSB3YXMgdGhpcy4gVGhlcmUgd2VyZSBhbHNvIGxlYWtzIGluIHRoZQogIGNvb2tpZSBoYW5kbGluZywgYW5kIGEgZmV3IGVycm9ycyB3aGVuIGN1cmwgZmFpbGVkIHRvIGNvbm5lY3QgYW5kIHNpbWlsYXIKICB0aGluZ3MuIE1vcmUgdGVzdHMgY2FzZXMgd2VyZSBhZGRlZCB0byBjb3ZlciB1cCBhbmQgdG8gdmVyaWZ5IHRoYXQgdGhlc2UKICBwcm9ibGVtcyBoYXZlIGJlZW4gcmVtb3ZlZC4KCi0gTXVjaG8gdXBkYXRlZCBjb25maWcgZmlsZSBwYXJzZXIgKEknbSBkZWFkIHRpcmVkIG9mIGFsbCB0aGUgYnVnIHJlcG9ydHMgYW5kCiAgd2VpcmQgYmVoYXZpb3VyIEkgZ2V0IG9uIHRoZSBmb3JtZXIgb25lKS4gSXQgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgbm93LAogIGFsdGhvdWdoIEkgZG91YnQgbWFueSBwZW9wbGUgd2lsbCBub3RpY2UgdGhlIGRpZmZlcmVuY2VzLiBUaGUgbWFpbgogIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBpZiB5b3UgdXNlIG9wdGlvbnMgdGhhdCByZXF1aXJlIHBhcmFtZXRlcnMsIHRoZXkgbXVzdAogIGJvdGggYmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGxpbmUuIFdpdGggdGhpcyBuZXcgcGFyc2VyLCB5b3UgY2FuIGFsc28KICBzcGVjaWZ5IGxvbmcgb3B0aW9ucyB3aXRob3V0ICctLScgYW5kIHlvdSBtYXkgc2VwYXJhdGUgb3B0aW9ucyBhbmQKICBwYXJhbWV0ZXJzIHdpdGggOiBvciA9LiBJdCBtYWtlcyBhIGNvbmZpZyBmaWxlIGxpbmUgY291bGQgbG9vayBsaWtlOgoKICAgICAgICB1c2VyLWFnZW50ID0gImZvb2JhciBhbmQgc29tZXRoaW5nIgoKICBQYXJhbWV0ZXJzIHdpdGhpbiBxdW90ZXMgbWF5IGNvbnRhaW4gc3BhY2VzLiBXaXRob3V0IHF1b3RlcywgdGhleSdyZQogIGV4cGVjdGVkIHRvIGJlIGEgc2luZ2xlIG5vbi1zcGFjZSB3b3JkLgoKICBIYWQgdG8gcGF0Y2ggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzZXIgYSBsaXR0bGUgdG8gbWFrZSB0aGlzIHdvcmsuCgotIEFkZGVkIC0tdXJsIGFzIGFuIG9wdGlvbiB0byBhbGxvdyB0aGUgVVJMIHRvIGJlIHNwZWNpZmllZCB0aGlzIHdheS4gSXQgbWFrZXMKICB3YXkgbmljZXIgY29uZmlnIGZpbGVzLiBUaGUgcHJldmlvdXMgd2F5IG9mIHNwZWNpZnlpbmcgVVJMcyBpbiB0aGUgY29uZmlnCiAgZmlsZSBkb2Vzbid0IHdvcmsgYW55bW9yZS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSBVc2luZyBjZXJ0YWluIGNoYXJhY3RlcnMgaW4gdXNlcm5hbWVzIG9yIHBhc3N3b3JkcyBmb3IgSFRUUCBhdXRoZW50aWNhdGlvbgogIGZhaWxlZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSBtcHJpbnRmKCkgdGhhdCBoYWQgYSBzaWxseSBjaGVjayBmb3IgbGV0dGVycywKICBhbmQgaWYgdGhleSB3ZXJlbid0IGlzcHJpbnQoKSB0aGV5IHdlcmVuJ3Qgb3V0cHV0ZWQgImFzLWlzIi4gVGhpcyBjYXVzZWQKICBwYXNzd29yZHMgYW5kIHVzZXJuYW1lcyB1c2luZyAnpycgKGZvciBleGFtcGxlKSB0byBmYWlsLgoKVmVyc2lvbiA3LjQuMgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotICd0ZXN0cy9ydW50ZXN0cy5wbCcgbm93IHNvcnRzIHRoZSB0ZXN0IGNhc2VzIHByb3Blcmx5IHdoZW4gJ2FsbCcgaXMgdXNlZC4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMCkKLSBJIGZlbGwgb3ZlciB0aGUgZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xMi50eHQgSW50ZXJuZXQgRHJhZnQgdGl0bGVkCiAgIkV4dGVuc2lvbnMgdG8gRlRQIiB0aGF0IGNvbnRhaW5zIGEgZGVmaW5lZCB3YXkgaG93IHRoZSBmdHAgY29tbWFuZCBTSVpFCiAgY291bGQgYmUgYXNzdW1lZCB0byB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHVzaW5nICItQyAtIiBhbmQgRlRQIHVwbG9hZGluZyBhCiAgZmlsZSB0aGF0IGlzbid0IHByc2VudCBvbiB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG1pZ2h0IHRoZW4gcmV0dXJuIGEgNTUwIGFuZAogIGN1cmwgd2lsbCBmYWlsLiBTaG91bGQgaXQgaW5zdGVhZCBhcyBMYXVyZW50IFBhcGllciBzdWdnZXN0cywgc3RhcnQKICB1cGxvYWRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIGFzIGEgbm9ybWFsIHVwbG9hZD8KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMCkKLSBGaXhlZCBhIGNyYXNoIHdpdGggdGhlIGZvbGxvd2xvY2F0aW9uIGNvdW50ZXIuCgotIFdoaWxlIHdyaXRpbmcgdGVzdCBjYXNlcyBmb3IgdGhlIHRlc3Qgc3VpdGUsIEkgZGlzY292ZXJlZCBhbiBvbGQgbGltaXRhdGlvbgogIHRoYXQgcHJldmVudGVkIC1vIGFuZCAtVCB0byBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEkgcmVtb3ZlZCB0aGlzCiAgaW1tZWRpYXRlbHkgYXMgdGhpcyBoYXMgbm8gcmVsZXZhbmNlIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCgotIENocmlzIEZhaGVydHkgZml4ZWQgYSBmcmVlLXR3aWNlIHByb2JsZW0gaW4gbGliL2ZpbGUuYwoKLSBJIGZpeGVkIHRoZSBwZXJsIGh0dHAgc2VydmVyIHByb2JsZW0gaW4gdGhlIHRlc3Qgc3VpdGUuCgpWZXJzaW9uIDcuNC4yIHByZTQKCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwMCkKLSBJJ3ZlIChmaW5hbGx5KSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIGN1cmwgdGVzdCBzdWl0ZS4gSXQgaXMgaW4gdGhlIG5ldwogIHRlc3RzLyBkaXJlY3RvcnkuIEl0IHJlcXVpcmVzIHNoIGFuZCBwZXJsLiBUaGVyZSdzIGEgVENQIHNlcnZlciBpbiBwZXJsIGFuZAogIG1vc3Qgb2YgdGhlIG90aGVyIHN0dWZmIHJ1bm5pbmcgYSBwcmV0dHkgc2ltcGxlIHNoZWxsIHNjcmlwdC4KCiAgSSd2ZSBvbmx5IG1hZGUgZm91ciB0ZXN0IGNhc2VzIHNvIGZhciwgYnV0IGl0IHByb3ZlcyB0aGUgc3lzdGVtIGNhbiB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBub3RpY2VkIHRoYXQgY3VybCBkaWRuJ3Qgc2V0IFRZUEUgd2hlbiBkb2luZyAtLWhlYWQgY2hlY2tzCiAgZm9yIHNpemVzIG9uIEZUUCBzZXJ2ZXJzLiBTb21lIHNlcnZlcnMgc2VlbSB0byByZXR1cm4gZGlmZmVyZW50IHNpemVzCiAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgQVNDSUkgb3IgQklOQVJZIGlzIHVzZWQhCgotIExhdXJlbnQgUGFwaWVyIGRldGVjdGVkIHRoYXQgaWYgeW91IGFwcGVuZGVkIGEgRlRQIHVwbG9hZCBhbmQgZXZlcnl0aGluZyB3YXMKICBhbHJlYWR5IHVwbG9hZGVkLCBjdXJsIHdvdWxkIGhhbmcuCgotIEFuZ3VzIE1hY2theSdzIGdldHBhc3NfcigpIGluIGxpYi9nZXRwYXNzLmMgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZQogIGdldHBhc3NfcigpIGZ1bmN0aW9uIGl0IHNlZW1zIHNvbWUgc3lzdGVtcyBhY3R1YWxseSBoYXZlLgoKLSBWZW5rYXRhcmFtYW5hIE1va2thcGF0aSBkZXRlY3RlZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlciBhbmQgY29ycmVjdGVkCiAgaXQuICBJZiB0aGUgY29va2llIHdhcyBzZXQgZm9yIHRoZSBmdWxsIGhvc3QgbmFtZSAoZG9tYWluPWZ1bGwuaG9zdC5jb20pLAogIHRoZSBjb29raWUgd2FzIG5ldmVyIHNlbnQgYmFjayBiZWNhdXNlIG9mIGEgZmF1bHR5IGxlbmd0aCBjb21wYXJpc29uIGJldHdlZW4KICB0aGUgc2V0IGRvbWFpbiBsZW5ndGggYW5kIHRoZSBjdXJyZW50IGhvc3QgbmFtZS4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IChPUy8yIHNlZW1zIHRvIG5lZWQKICBpdCkuIEFkZGVkIGEgY2hlY2sgZm9yIFJTQWdsdWUvcnNhcmVmIGZvciB0aGUgY2FzZXMgd2hlcmUgbGliY3J5cHRvIGlzIGZvdW5kCiAgYnV0IGxpYnNzbCBpc24ndC4gSSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgZml4IHlldCB0aG91Z2gsIGFzIEkgaGF2ZSBubwogIHN5c3RlbSB0aGF0IHJlcXVpcmVzIHRob3NlIGxpYnMgdG8gYnVpbGQuCgpWZXJzaW9uIDcuNC4yIHByZTMKCkRhbmllbCAoNyBOb3ZlbWJlciAyMDAwKQotIFJlbW92ZWQgcGVycm9yKCkgb3V0cHV0cyBmcm9tIGdldHBhc3MuYy4gQW5ndXMgTWFja2F5IGFsc28gYWdyZWVkIHRvIGEKICBzbGlnaHRseSBtb2RpZmllZCBsaWNlbnNlIG9mIHRoZSBnZXRwYXNzLmMgZmlsZSBhcyB0aGUgcHJvdG90eXBlIHdhcyBjaGFuZ2VkLgoKRGFuaWVsICg2IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgcG9zc2liaWxpdHkgdG8gc2V0IGEgcGFzc3dvcmQgY2FsbGJhY2sgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluLgogIFRoZXkncmUgY29udHJvbGVkIHdpdGggY3VybF9lYXN5X3NldG9wdCgpIG9mIGNvdXJzZSwgdGhlIHRhZ3MgYXJlCiAgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLgoKLSBVc2VkIFQuIEJoYXJhdGgncyB0aGlua2luZyBhbmQgZml4ZWQgdGhlIHRpbWVycyB0aGF0IHNob3dlZCB0ZXJyaWJseSB3cm9uZwogIHRpbWVzIHdoZW4gbG9jYXRpb246IGhlYWRlcnMgd2VyZSBmb2xsb3dlZC4KCi0gRW1tYW51ZWwgVHljaG9uIGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZG4ndCByZWFsbHkgbGlrZSB1c2VyIG5hbWVzIG9ubHkgaW4KICB0aGUgVVJMLiBJIGNvcnJlY3RlZCB0aGlzIGFuZCBJIGFsc28gZml4ZWQgdGhlIHNpbmNlIGxvbmcgbGl2aW5nIHByb2JsZW0KICB3aXRoIFVSTCBlbmNvZGVkIHVzZXIgbmFtZXMgYW5kIHBhc3N3b3JkcyBpbiB0aGUgVVJMcy4gVGhleSBzaG91bGQgd29yayBub3cuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMCkKLSBXaGVuIEkgYWRkZWQgLS1pbnRlcmZhY2UsIHRoZSBuZXcgZXJyb3IgY29kZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGl0IHdhcwogIGluc2VydGVkIGluIHRoZSB3cm9uZyBwbGFjZSBhbmQgdGh1cyBhbGwgZXJyb3IgY29kZXMgZnJvbSAzNSBhbmQgdXB3YXJkcyBnb3QKICBpbmNyZWFzZWQgb25lIHN0ZXAuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCwgd2UncmUgYmFjayBhdCB0aGUgcHJldmlvdXMKICBudW1iZXJzLiBBbGwgbmV3IGV4aXQgY29kZXMgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBlbmQuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNoZWNrIGZvciBzaWduYWwoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzbyB0aGF0IGlmIHNpZ2FjdGlvbigpCiAgaXNuJ3QgcHJlc2VudCwgd2UgY2FuIHVzZSBzaWduYWwoKSBpbnN0ZWFkLgoKLSBJJ20gaGF2aW5nIGEgbGljZW5zZSBkaXNjdXNzaW9uIGdvaW5nIG9uIHByaXZhdGVseS4gVGhlIGlzc3VlIGlzIHlldCBhZ2FpbgogIEdQTC1saWNlbnNlZCBwcm9ncmFtcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCBNUEwuIEkgYW0gbGVhbmluZyB0b3dhcmRzCiAgbWFraW5nIGEga2luZCBvZiBkdWFsLWxpY2Vuc2UgdGhhdCB3aWxsIHNvbHZlIHRoaXMgb25jZSBhbmQgZm9yIGFsbC4uLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDApCi0gQWRkZWQgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuIEkgaW50ZW5kIHRvIGxldCB0aGlzIGNvbnRhaW4gc29tZSBkb2NzIGFuZAogIHRlbXBsYXRlcyBvbiBob3cgdG8gZ2VuZXJhdGUgY3VzdG9tLWZvcm1hdCBwYWNrYWdlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMuCiAgSSd2ZSBub3cgcmVtb3ZlZCB0aGUgUlBNIHJlbGF0ZWQgY3VybC5zcGVjIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgcm9vdC4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAwKQotIFQuIEJoYXJhdGggYnJvdWdodCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgYnJpbmcgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGFuZCBjdXJsX2Vhc3lfc2V0b3B0KCkuIE5vdyB5b3UgY2FuIHJlcXVlc3QgcGVlcgogIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSAqc2V0b3B0KCkgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiBvcHRpb24KICBhbmQgdGhlbiB1c2UgdGhlIENVUkxPUFRfQ0FJTkZPIHRvIHNldCB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSByZW1vdGUKICBwZWVyIGFnYWluc3QuIEFmdGVyIGFuIHN1Y2ggYW4gb3BlcmF0aW9uIHdpdGggYSB2ZXJpZmljYXRpb24gcmVxdWVzdCwgdGhlCiAgKl9nZXRpbmZvKCkgb3B0aW9uIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKICB3aGV0aGVyIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIG9yIG5vdC4KCkRhbmllbCAoMjcgT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gYnJvdWdodCB1cyBhIHNwbGVuZGlkIHBhdGNoIHRoYXQgc29sdmVzIHRoZSBsb25nLXN0YW5kaW5nCiAgYW5ub3lpbmcgcHJvYmxlbSB3aXRoIHRpbWVvdXRzIHRoYXQgbWFkZSBjdXJsIGV4aXQgd2l0aCBzaWxseSBleGl0IGNvZGVzCiAgKHdoaWNoIGFzIGJlZW4gY29tbWVudGVkIG91dCBsYXRlbHkpLiBUaGlzIHNvbHV0aW9uIGlzIHNpZ2FjdGlvbigpIGJhc2VkIGFuZAogIG9mIGNvdXJzZSB0aGVuIG9ubHkgd29ya3MgZm9yIHVuaXhlcyAoYW5kIG9ubHkgdGhvc2UgdW5peGVzIHRoYXQgYWN0dWFsbHkKICBoYXZlIHRoZSBzaWdhY3Rpb24oKSBmdW5jdGlvbikuCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIGZsYXcgbWVudGlvbmVkIGJ5IEtldmluIFJvdGgKICB0aGF0IG1hZGUgdGhlIHBhc3N3b3JkIGdldCBlY2hvZWQgd2hlbiBwcm9tcHRlZCBmb3IgaW50ZXJhY3RpdmVseS4gVGhlCiAgZ2V0cGFzcygpIGZ1bmN0aW9uIChub3cga25vd24gYXMgbXlfZ2V0cGFzcygpKSB3YXMgYWxzbyBmaXhlZCB0byBub3QgdXNlIGFueQogIHN0YXRpYyBidWZmZXJzLiBUaGlzIGFsc28gbWVhbnMgd2UgY2Fubm90IHVzZSB0aGUgInN0YW5kYXJkIiBnZXRwYXNzKCkKICBmdW5jdGlvbiBldmVuIGZvciB0aG9zZSBzeXN0ZW1zIHRoYXQgaGF2ZSBpdCwgc2luY2UgaXQgaXNuJ3QgdGhyZWFkLXNhZmUuCgotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgaWYgeW91J2Qgd3JpdGUgYSBjb25maWcgZmlsZSB3aXRoICctdiB1cmwnLCB0aGUKICB1cmwgd291bGQgbm90IGJlIHVzZWQgYXMgImRlZmF1bHQgVVJMIiBhcyBkb2N1bWVudGVkLCBhbHRob3VnaCBpZiB5b3Ugd3JvdGUKICBpdCAndXJsIC12JyBpdCB3b3JrZWQhIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkIG5vdy4KCi0gS2V2aW4gUm90aCdzIGlkZWEgb2YgdXNpbmcgbXVsdGlwbGUgLWQgb3B0aW9ucyBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgd2FzCiAganVzdCBicmlsbGlhbnQsIGFuZCBJIGNvdWxkbid0IHJlYWxseSB0aGluayBvZiBhbnkgcmVhc29uIHdoeSB3ZSBzaG91bGRuJ3QKICBzdXBwb3J0IGl0ISBUaGUgYXBwZW5kIGZ1bmN0aW9uIGFsd2F5cyBhcHBlbmQgJyYnIGFuZCB0aGVuIHRoZSBuZXcgLWQKICBjaHVuay4gVGhpcyBlbmFibGVzIGNvbnN0cnVjdHMgbGlrZSB0aGUgZm9sbG93aW5nOgoKICAgICAgICBjdXJsIC1kIG5hbWU9ZGFuaWVsIC1kIGFnZT11bmtub3duIGZvb2JhcnNpdGUuY29tCgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMCkKLSBJIGZpeGVkIHRoZSBsaWIvbWVtZGVidWcuYyBzb3VyY2Ugc28gdGhhdCBpdCBjb21waWxlcyBvbiBMaW51eCBhbmQgb3RoZXIKICBzeXN0ZW1zLiBJdCB3aWxsIGJlIHVzZWZ1bCBvbmUgZGF5IHdoZW4gc29tZW9uZSBlbHNlIGJ1dCBtZSB3YW50cyB0byBydW4gdGhlCiAgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0uCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMCkKLSBJIG1vZGlmaWVkIHRoZSBtYWtldGd6IGFuZCBjb25maWd1cmUgc2NyaXB0cywgc28gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgZmV0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlIGluY2x1ZGUvY3VybC9jdXJsLmggaGVhZGVyIGZpbGVzLCBhbmQKICB0aGVuIHRoZSBtYWtldGd6IGRvZXNuJ3QgaGF2ZSB0byByZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gSSBidWlsZAogIHJlbGVhc2UtYXJjaGl2ZXMuCgotIEJq9nJuIFN0ZW5iZXJnIGFuZCBMaW51cyBOaWVsc2VuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHNpbGx5CiAgZW5vdWdoIHRvIG5vdCBhbGxvdyBALWxldHRlcnMgaW4gcGFzc3dvcmRzIHdoZW4gdGhleSB3ZXJlIHNwZWNpZmllZCB3aXRoIHRoZQogIC11IG9yIC1VIGZsYWdzIChDVVJMT1BUX1VTRVJQV0QgYW5kIENVUkxPUFRfUFJPWFlVU0VSUFdEKS4gVGhpcyBhbHNvCiAgc3VnZ2VzdHMgdGhhdCBjdXJsIHByb2JhYmx5IHNob3VsZCB1cmwtZGVjb2RlIHRoZSBwYXNzd29yZCBwaWVjZSBvZiBhbiBVUkwKICBzbyB0aGF0IHlvdSBjb3VsZCBwYXNzIGFuIGVuY29kZWQgQC1sZXR0ZXIgdGhlcmUuLi4KCkRhbmllbCAoMjAgT2N0b2JlciAyMDAwKQotIFlldCBhbm90aGVyIGh0dHAgc2VydmVyIGJhcmZlZCBvbiBjdXJsJ3MgcmVxdWVzdCB0aGF0IGluY2x1ZGUgdGhlIHBvcnQKICBudW1iZXIgaW4gdGhlIEhvc3Q6IGhlYWRlciBhbHdheXMuIEkgbm93IG9ubHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgaXQKICBpc24ndCB0aGUgZGVmYXVsdCAoODAgZm9yIEhUVFAsIDQ0MyBmb3IgSFRUUFMpLiB3d3cucGVybC5jb20gdHVybmVkIG91dCB0bwogIHJ1biBvbmUgb2YgdGhvc2UgbmFzdHkgc2VydmVycy4KCi0gVGhlIFBIUDQgbW9kdWxlIGZvciBjdXJsIGhhZCBwcm9ibGVtcyB3aXRoIHJlZmVyZXIgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4KICBjb3JyZWN0ZWQganVzdCB5ZXN0ZXJkYXkuIChTdGVybGluZyBIdWdoZXMgb2YgdGhlIFBIUCB0ZWFtIGNvbmZpcm1lZCB0aGlzKQoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDApCi0gVmxhZGltaXIgT2Jsb21vdiByZXBvcnRlZCB0aGF0IHRoZSAtWSBhbmQgLXkgb3B0aW9ucyBkaWRuJ3Qgd29yay4gVGhleQogIGRpZG4ndCB3b3JrIGZvciBtZSBlaXRoZXIuIFRoaXMgb25jZSBhZ2FpbiBwcm92ZXMgd2Ugc2hvdWxkIGhhdmUgdGhhdCB0ZXN0CiAgc3VpdGUuLi4KCi0gSSBmaW5hbGx5IGNoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgbGliY3VybCByZXR1cm5zIGlmIHlvdSB0cnkgYSBodHRwczovLwogIFVSTCB3aGVuIHRoZSBsaWJyYXJ5IHdhc24ndCBidWlsZCB3aXRoIFNTTCBlbmFibGVkLiBJdCB3aWxsIG5vdyByZXR1cm4gdGhpcwogIGVycm9yOgogICAgICAgICJsaWJjdXJsIHdhcyBidWlsdCB3aXRoIFNTTCBkaXNhYmxlZCwgaHR0cHM6IG5vdCBzdXBwb3J0ZWQhIgoKICBJIHJlYWxseSBob3BlIGl0IHdpbGwgbWFrZSBpdCBhIGJpdCBjbGVhcmVyIHRvIHVzZXJzIHdoZXJlIHRoZSBhY3R1YWwKICBwcm9ibGVtIGxpZXMuCgpWZXJzaW9uIDcuNC4xCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBJIGZvcmdvdCB0byByZW1vdmUgc29tZSBvZiB0aGUgbWFsbG9jIGRlYnVnIGRlZmluZXMgZnJvbSB0aGUgbWFrZWZpbGVzIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZSAob2YgY291cnNlKS4KClZlcnNpb24gNy40CgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBUaGUgYnVmZmVyIG92ZXJmbG93IG1lbnRpb25lZCBiZWxvdyB3YXMgcG9zdGVkIHRvIGJ1Z3RyYXEgb24gRnJpZGF5IDEzdGguCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMCkKLSBDb2xpbiBSb2JlcnQgUGhpcHBzIGVsZWdhbnRseSBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cuIEl0IGNvdWxkIGJlIHVzZWQKICBieSBhbiBldmlsIGZ0cCBzZXJ2ZXIgdG8gY3Jhc2ggY3VybC4gSSB0b29rIHRoZSBvcHBvcnR1bml0eSBvZiByZXBsYWNpbmcgYQogIGZldyBvdGhlciBzcHJpbnRmKClzIGludG8gc25wcmludGYoKXMgYXMgd2VsbC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDAwKQotIEZvdW5kIHNvbWUgbW9yZSBtZW1vcnkgbGVha3MuIFRoaXMgbmV3IHNpbXBsZSBtZW1vcnkgZGVidWdnZXIgaGFzIHR1cm5lZCBvdXQKICByZWFsbHkgdXNlZnVsIQoKVmVyc2lvbiA3LjQgcHJlNgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBGbG9yaWFuIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBib29sIHR5cGVkZWYgaW4gdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUKICBmaWxlIHdhcyBicmVha2luZyBQSFAgNC4wLjMgY29tcGlsaW5nLiBUaGUgYm9vbCB0eXBlZGVmIGlzIG5vdCB1c2VkIGluIHRoZQogIHB1YmxpYyBpbnRlcmZhY2UgYW5kIHdhcyB3cm9uZ2x5IGluc2VydGVkIGluIHRoYXQgaGVhZGVyIGZpbGUuCgotIEr2cmcgSGFydHJvdGggY29ycmVjdGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgaW4gdGhlIHNyYy91cmxnbG9iLmMgc3R1ZmYuIEl0CiAgZGlkbid0IGhhcm0gYW55b25lIHNpbmNlIHRoZSBtZW1vcnkgaXMgZnJlZSgpZWQgb24gZXhpdCBhbnl3YXkuCgotIENvcnJlY3RlZCB0aGUgc3JjL21haW4uYy4gV2UgdXNlIHRoZSBfTVBSSU5URl9SRVBMQUNFICNkZWZpbmUgdG8gdXNlIG91cgogIGxpYmN1cmwtcHJpbnRmKCkgZnVuY3Rpb25zLiBUaGlzIGdpdmVzIHVzIHNucHJpbnRmKCkgZXQgYWwgb24gYWxsCiAgcGxhdGZvcm1zLiBJIGNvbnZlcnRlZCB0aGUgYWxsb2NhdGVkIHVzZXJhZ2VudCBzdHJpbmcgdG8gb25lIHRoYXQgdXNlcyBhCiAgbG9jYWwgYnVmZmVyLgoKLSBJJ3ZlIHNldCBhbiAjaWYgMCBzZWN0aW9uIGFyb3VuZCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKICBnZW5lcmF0ZWQgaW4gbGliL2Zvcm1kYXRhLmMuIFRoaXMgd2lsbCBob3BlZnVsbHkgbWFrZSBjdXJsIGRvIG1vcmUKICBQSFAtZnJpZW5kbHkgbXVsdGktcGFydCBwb3N0cy4KClZlcnNpb24gNy40IHByZTUKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gTmljbyBCYWdndXMgZm91bmQgb3V0IHRoYXQgY3VybCdzIGFiaWxpdHkgdG8gZm9yY2UgYSBBU0NJSSBkb3dubG9hZCB3aGVuCiAgdXNpbmcgRlRQIHdhcyBubyBsb25nZXIgd29ya2luZyEgSSBjb3JyZWN0ZWQgdGhpcy4gVGhpcyBwcm9ibGVtIHdhcyBwcm9iYWJseQogIGludHJvZHVjZWQgd2hlbiBJIHJlZGVzaWduZWQgbGliY3VybCBmb3IgdmVyc2lvbiA3LgoKLSBHZW9yZyBIb3JuIHByb3ZpZGVkIGEgc291cmNlIGV4YW1wbGUgdGhhdCBwcm92ZWQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsLgogIEkgYWRkZWQgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyBhbmQgbm93IHdlIGNhbiBtYWtlIGxpYmN1cmwgbG9nCiAgYWxsIG1lbW9yeSBmaWRkbGluZyBmdW5jdGlvbnMuIEFuIGFkZGl0aW9uYWwgcGVybCBzY3JpcHQgaXMgdXNlZCB0byBhbmFseXplCiAgdGhlIG91dHB1dCBsb2dmaWxlIGFuZCB0byBtYXRjaCBtYWxsb2MoKXMgd2l0aCBmcmVlKClzIGV0Yy4gVGhlIG1lbW9yeSBsZWFrCiAgR2VvcmcgZm91bmQgdHVybmVkIG91dCB0byBiZSB0aGUgbWFpbiBjb29raWUgc3RydWN0IHRoYXQgY29va2llX2NsZWFudXAoKQogIGRpZG4ndCBmcmVlISBUaGUgcGVybCBzY3JpcHQgaXMgbmFtZWQgbWVtYW5hbHl6ZS5wbCBhbmQgaXQgaXMgYXZhaWxhYmxlIGluCiAgdGhlIENWUyByZXNwb3NpdG9yeSwgbm90IGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gZm91bmQgYSBHZXRIb3N0KCkgcHJvYmxlbS4gSXQgdHVybmVkIG91dCBpdCBuZXZlciBhc3NpZ25lZCB0aGUKICBwb2ludGVyIGluIHRoZSB0aGlyZCBhcmd1bWVudCBwcm9wZXJseSEgVGhpcyBjb3VsZCBtYWtlIGEgY3Jhc2gsIG9yIGF0IGJlc3QKICBhIG1lbW9yeSBsZWFrIQoKVmVyc2lvbiA3LjQgcHJlNAoKRGFuaWVsICg2IE9jdG9iZXIgMjAwMCkKLSBJcyB0aGUgLUYgcG9zdCBmb2xsb3dpbmcgdGhlIFJGQyAxODY3IHNwZWM/IFdlIGhhZCB0aGlzIGRpY3Vzc2lvbiBvbiB0aGUKICBtYWlsaW5nIGxpc3Qgc2luY2UgaXQgYXBwZWFycyBjdXJsIGNhbid0IHBvc3QgLUYgZm9ybSBwb3N0cyB0byBhIFBIUAogIHJlY2VpdmVyLi4uIEkndmUgYmVlbiBpbiB0b3VjaCB3aXRoIHRoZSBQSFAgZGV2ZWxvcGVycyBhYm91dCB0aGlzLgoKLSBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgdGhhdCB0aGUgbG9uZyBvcHRpb24gJy0tcHJveHknIHdhc24ndCB3b3JraW5nCiAgYW55bW9yZSEgVGhlIG9wdGlvbiBwYXJzZXIgZ290IGNvbmZ1c2VkIHdoZW4gSSBhZGRlZCB0aGUgLS1wcm94eXR1bm5lbCBmb3IKICA3LjMuIFRoaXMgd2FzIGluZGVlZCBhIHZlcnkgb2xkIGZsYXcgdGhhdCBoYXNuJ3QgdHVybmVkIHVwIHVudGlsIG5vdy4uLgoKLSBK9nJuIEhhcnRyb3RoIHByb3ZpZGVkIHBhdGNoZXMsIHVwZGF0ZWQgbWFrZWZpbGVzIGFuZCB0d28gbmV3IGZpbGVzIGZvciBETEwKICBzdHVmZiBvbiB3aW4zMi4gSGUgYWxzbyBwb2ludGVkIG91dCB0aGF0IGxpYiBzb3VyY2UgZmlsZXMgd2VyZSBjb21waWxlZCB3aXRoCiAgLUkuLi9zcmMgd2hpY2ggaXNuJ3Qgb25seSB3cm9uZyBidXQgcGxhaW4gc3R1cGlkIQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgYSBwcm9ibGVtIHdpdGggSFRUUCByZXN1bWUuIEN1cmwgcHJldmlvdXNseSB1c2VkCiAgYSBsb2NhbCB2YXJpYWJsZSBiYWRseSwgdGhhdCBjb3VsZCBsZWFkIHRvIGNyYXNoZXMuCgpWZXJzaW9uIDcuNCBwcmUzCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAwKQotIE1vcmUgZG9jcyB3cml0dGVuLiBUaGUgY3VybF9lYXN5X2dldGluZm8uMyBtYW4gcGFnZSBpcyBub3cgcHJldHR5IGFjY3VyYXRlLAogIGFzIGlzIHRoZSAtdyBzZWN0aW9uIGluIGN1cmwuMS4gSSBhZGRlZCB0d28gb3B0aW9ucyB0byBlbmFibGUgdGhlIHVzZXIgdG8KICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2VpdmVkIGhlYWRlcnMnIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBIVFRQCiAgcmVxdWVzdC4gVC4gQmhhcmF0aCByZXF1ZXN0ZWQgdGhlbS4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gQ29ycmVjdGVkIGEgc2V2ZXIgZnJlZSgpIGJlZm9yZSB1c2UgaW4gdGhlIG5ldyBhZGRfYnVmZmVyX3NlbmQoKSEgOy0pCgpWZXJzaW9uIDcuNCBwcmUyCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIEphc29uIFMuIFByaWViZSBzZW50IG1lIHBhdGNoZXMgdGhhdCBjaGFuZ2VkIHRoZSB3YXkgY3VybCBpc3N1ZXMgSFRUUAogIHJlcXVlc3RzLiBUaGUgZW50aXJlIHJlcXVlc3QgaXMgbm93IGlzc3VlZCBpbiBvbmUgc2luZ2xlIHNob3QuIEl0IGRpZG4ndCBkbwogIHRoaXMgcHJldmlvdXNseSwgYW5kIGl0IGhhcyB0dXJuZWQgb3V0IHRoYXQgc2luY2UgdGhlIGNvbW1vbiBicm93c2VycyBkbyBpdAogIHRoaXMgd2F5LCBzb21lIHNpdGVzIGhhdmUgdHVybmVkIG91dCB0byB3b3JrIHdpdGggYnJvd3NlcnMgYnV0IG5vdCB3aXRoCiAgY3VybCEgQWx0aG91Z2ggdGhpcyBpcyBub3QgYSBjbGllbnQtc2lkZSBwcm9ibGVtLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KICBmdWxseSBlbXVsYXRlIGJyb3dzZXJzLCBhbmQgdGh1cyB3ZSBoYXZlIG5vdyBhZGp1c3RlZCB0aGUgbmV0d29ya2luZyBsYXllcgogIHRvIHNsaWdodGx5IG1vcmUgYXBwZWFyIGFzIGEgYnJvd3Nlci4gSSBhZGp1c3RlZCBKYXNvbidzIHBhdGNoLCB0aGUgZmF1bHRzCiAgYXJlIHByb2JhYmx5IG1pbmUuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAwKQotIEFueW9uZSB3aG8gZXZlciB1cGxvYWRlZCBkYXRhIHdpdGggY3VybCBvbiBhIHNsb3cgbGluayBoYXMgbm90aWNlZCB0aGF0IHRoZQogIHByb2dlc3MgbWV0ZXIgaXMgdXBkYXRlZCB2ZXJ5IGluZnJlcXVlbnRseS4gVGhhdCBpcyBkdWUgdG8gdGhlIGxhcmdlIGJ1ZmZlcgogIHNpemUgY3VybCBpcyB1c2luZy4gSXQgcmVhZHMgNTBLYiBhbmQgc2VuZHMgaXQsIHVwZGF0ZXMgdGhlIHByb2dyZXNzIG1ldGVyCiAgYW5kIGxvb3BzLiA1MEtiIGlzIHZlcnkgbXVjaCBvbiBhIHNsb3cgbGluaywgYWx0aG91Z2ggaXQgaXMgcHJldHR5IG5lYXQgdG8KICB1c2Ugb24gYSBmYXN0IG9uZS4KCiAgSSd2ZSBub3cgbWFkZSBhbiBhZGp1c3RtZW50IHRoYXQgbWFrZXMgY3VybCB1c2UgYSAyS2IgYnVmZmVyIGZvciB1cGxvYWRzIHRvCiAgc3RhcnQgd2l0aC4gSWYgY3VybCdzIGF2ZXJhZ2UgdXBsb2FkIHNwZWVkIGlzIGZhc3RlciB0aGFuIGJ1ZmZlciBzaXplIGJ5dGVzCiAgcGVyIHNlY29uZCwgY3VybCB3aWxsIGluY3JlYXNlIHRoZSB1c2VkIGJ1ZmZlciBzaXplIHVwIHRvIG1heCA1MEtiLiBJdAogIHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciB3b3JrIGJldHRlci4KClZlcnNpb24gNy40IHByZTEKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDApCi0gUmlwcGVkIG91dCB0aGUgLXcgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeSBhbmQgcHV0IGluIHRoZSBjdXJsIHRvb2wuIEl0IGdldHMKICBhbGwgdGhlIHJlbGV2YW50IGluZm8gZnJvbSB0aGUgbGlicmFyeSB1c2luZyB0aGUgbmV3IGN1cmxfZWFzeV9nZXRpbmZvKCkKICBmdW5jdGlvbi4KCi0gYnJhZCBhdCBvcGVuYnNkLm9yZyBtYWlsZWQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBteSBrZXJiZXJvcyBtaXN0YWtlIGFuZAogIHJlbW92ZWQgYSBjb21waWxlciB3YXJuaW5nIGZyb20gaG9zdGlwLmMgdGhhdCBPcGVuQlNEIHBlb3BsZSBnZXQuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIE9mIGNvdXJzZSAoSSBzaG91bGQgcHJvYmFibHkgZ2V0IHB1bmlzaGVkIHNvbWVob3cpIEkgZGlkbid0IHByb3Blcmx5IGNvcnJlY3QKICB0aGUgI2luY2x1ZGUgbGluZXMgZm9yIHRoZSBiYXNlNjQgc3R1ZmYgaW4gdGhlIGtlcmJlcm9zIHNvdXJjZXMgaW4gdGhlIGp1c3QKICByZWxlYXNlZCA3LjMgcGFja2FnZS4gVGhleSBzdGlsbCBpbmNsdWRlIHRoZSAqX2tyYi5oIGZpbGVzISBOb3csIHRoZSBlcnJvcgogIGlzIHNvb28gdmVyeSBlYXN5IHRvIHNwb3QgYW5kIGZpeCBzbyBJIHdvbid0IGJvdGhlciB3aXRoIGEgcXVpY2sgYnVnIGZpeAogIHJlbGVhc2UuIEknbGwgcG9zdCBhIHBhdGNoIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQgaW5zdGVhZC4gSXQnbGwgYmUKICBhdmFpbGFibGUgaW4gdGhlIENWUyBpbiBhIGZldyBtaW51dGVzIGFueXdheS4KClZlcnNpb24gNy4zCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIFJlbW92ZWQgdGhlIGJhc2U2NF9rcmIuW2NoXSBmaWxlcy4gVGhleSd2ZSBub3cgcmVwbGFjZWQgdGhlIGZvcm1lcgogIGJhc2U2NC5bY2hdIGZpbGVzLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIHNvbWUgZG9jcy4KCi0gSSBjaGFuZ2VkIHRoZSBPcGVuU1NMIGZpeCB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgYXMgd2VsbC4gVGhlIHBvc3RlZAogIHBhdGNoIHdhcyBvbmx5IHdvcmtpbmcgd2l0aCAwLjkuNiBhbmQgbm8gb2xkZXIgb25lcy4KClZlcnNpb24gNy4zLXByZTgKCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDApCi0gRXJkbXV0IFBmZWlmZXIgaW5mb3JtZWQgdXMgdGhhdCBjdXJsIGRpZG4ndCBidWlsZCB3aXRoIE9wZW5TU0wgMC45LjYgYW5kCiAgc2hvd2VkIHVzIHdoYXQgbmVlZGVkIHRvIGdldCBwYXRjaGVkIGluIG9yZGVyIHRvIG1ha2UgaXQgYnVpbGQgcHJvcGVybHkKICBhZ2Fpbi4KCi0gRGlyayBLcnVzY2hld3NraSBmb3VuZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlci4gSSBtYWRlIGFuIGFsdGVybmF0aXZlCiAgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIERpcmsgaGltc2VsZiBzdWdnZXN0ZWQuIFRoZSBidWcgbWFkZSBhIGNvb2tpZQogIGhlYWRlciB0aGF0IGRpZG4ndCBlbmQgd2l0aCBhIHRyYWlsaW5nIHNlbWljb2xvbiB0byBub3QgZ2V0IHBhcnNlZC4KCi0gSSd2ZSBtYXJrZWQgLWMgYW5kIC10IGRlcHJlY2F0ZWQgbm93LiBJZiB5b3UgdXNlIGFueSBvZiB0aGVtLCBjdXJsIHdpbGwgdGVsbAogIHlvdSB0byB1c2UgIi1DIC0iIG9yICItVCAtIiBpbnN0ZWFkLiBJIGRvbid0IHRoaW5rIG9jY3VweWluZyB0d28gbGV0dGVycyBmb3IKICBuZWFybHkgaWRlbnRpY2FsIGZ1bmN0aW9ucyBpcyBnb29kIHVzZS4gQWxzbywgLVQgLSBraW5kIG9mIGZvbGxvd3MgdGhlIGN1cmwKICB0cmFkaXRpb24gb2YgdXNpbmcgLSBmb3Igc3RkaW4gd2hlcmUgYSBmaWxlIG5hbWUgaXMgZXhwZWN0ZWQuCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgZmluYWxseSBtYWRlIHRoZSBrcmI0IGZ0cCB1cGxvYWQKICB3b3JrIQoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3MgY29kZSBpcyBub3QgcXVpdGUgdGhyZWFkLXNhZmUgeWV0LiBUaGVyZSBhcmUgYSBmZXcgbW9yZSBnbG9iYWxzCiAgdGhhdCBuZWVkIHRvIGJlIHRha2UgY2FyZSBvZi4gTGV0J3MgZ2V0IHRoZSB1cGxvYWQgd29ya2luZyBmaXJzdCEKCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDApCi0gUmljaGFyZCBQcmVzY290dCBzb2x2ZWQgYW5vdGhlciBuYW1lIGxvb2t1cCBidWZmZXIgc2l6ZSBwcm9ibGVtLiBJIHRvb2sgdGhpcwogIG9wcG9ydHVuaXR5IHRvIHJld3JpdGUgdGhlIEdldEhvc3QoKSBmdW5jdGlvbi4gV2l0aCB0aGVzZSBsYXJnZSBidWZmZXIKICBzaXplcywgSSB0aGluayBrZWVwaW5nIHRoZW0gYXMgbG9jYWwgYXJyYXlzIHF1aWNrbHkgdHVybiB1Z2x5LiBJIG5vdyB1c2UKICBtYWxsb2MoKSB0byBnZXQgdGhlIGJ1ZmZlciBtZW1vcnkuIFRoYW5rcyB0byB0aGlzLCBJIG5vdyBjYW4gcmVhbGxvYygpIHRvIGEKICBsYXJnZSBidWZmZXIgaW4gY2FzZSBvZiBkZW1hbmQgKGVycm5vID09IEVSQU5HRSkgaW4gY2FzZSBhIHNvbHV0aW9uIGxpa2UKICB0aGF0IHdvdWxkIGJlY29tZSBuZWNlc3NhcnkuIEkgc3RpbGwgd2FudCB0byBhdm9pZCB0aGF0IGtpbmQgb2YgbmFzdGluZXNzLgoKLSBUcmllZCB0byBjb21waWxlIGFuZCBydW4gY3VybCBvbiBMaW51eCBmb3IgYWxwaGEgYW5kIEZyZWVCU0QgZm9yIGFscGhhLiBXZW50CiAgYXMgc21vb3RoIGFzIGl0IGNvdWxkLgoKLSBBZGRlZCBhIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdpdGggdHdvIHRpbnkgZXhhbXBsZSBzb3VyY2VzIHRoYXQgc2hvdyBob3cKICB0byB1c2UgbGliY3VybC4gSSBob3BlIHVzZXJzIHdpbGwgc3VwcGx5IG1lIHdpdGggbW9yZSB1c2VmdWwgZXhhbXBsZXMKICBmdXJ0aGVyIG9uLgoKLSBBcHBsaWVkIGEgcGF0Y2ggYnkgSvZybiBIYXJ0cm90aCB0byBubyBsb25nZXIgdXNlIHRoZSB3b3JkICdpbnRlZmFjZScgaW4gdGhlCiAgY29uZmlnIHN0cnVjdCBpbiB0aGUgc3JjL21haW4uYyBmaWxlIHNpbmNlIGNlcnRhaW4gY29tcGlsZXJzIGhhdmUgdGhhdCB3b3JkCiAgInJlc2VydmVyZWQiLiAgSSBmaWd1cmUgdGhhdCBpcyBzb21lIGtpbmQgb2YgQysrIGRlY2Vhc2UuCgotIFVwZGF0ZWQgdGhlIGN1cmwuMSBtYW4gcGFnZSB3aXRoIC0taW50ZXJmYWNlIGFuZCAtLWtyYjQuCgotIE1vZGlmaWVkIHRoZSBiYXNlNjRFbmNvZGUoKSBmdW5jdGlvbiB0byB3b3JrIGxpa2UgdGhlIGtlcmJlcm9zIG9uZSwgc28gdGhhdAogIEkgY291bGQgcmVtb3ZlIHRoZSB1c2Ugb2YgdGhhdC4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgKnR3byogYmFzZTY0IGVuY29kaW5nCiAgZnVuY3Rpb25zISA7LSkKClZlcnNpb24gNy4zcHJlNQoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3M0LWxheWVyIHNvdXJjZSBjb2RlIHRoYXQgaXMgbXVjaCAiaW5mbHVlbmNlZCIgYnkgdGhlIG9yaWdpbmFsCiAga3JiNCBzb3VyY2UgY29kZSwgdGhyb3VnaCB5YWZjIGludG8gY3VybCwgd2FzIHVzaW5nIHF1aXRlIGEgbG90IG9mIGdsb2JhbAogIHZhcmlhYmxlcy4gbGliY3VybCBjYW4ndCB3b3JrIHByb3Blcmx5IHdpdGggZ2xvYmFscyBsaWtlIHRoYXQgd2h5IEkgaGFkIHRvCiAgY2xlYW4gdXAgYWxtb3N0IGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBuZXcgc2VjdXJpdHkuYyB0byBtYWtlIHRoZW0gdXNlCiAgY29ubmVjdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgZ2xvYmFscy4gSSBqdXN0IGhvcGUgSSBkaWRuJ3QKICBkZXN0cm95IGFueXRoaW5nIG5vdy4uLiA6LSkgY29uZmlndXJlIHVwZGF0ZWQsIHZlcnNpb24gc3RyaW5nIG5vdyByZWZsZWN0cwogIGtyYjQgYnVpbHQtaW4uIEl0IGFsbW9zdCB3b3JrcyBub3cuIE9ubHkgdXBsb2FkcyBhcmUgc3RpbGwgYmVpbmcgbmF1Z2h0eS4KClZlcnNpb24gNy4zcHJlMwoKRGFuaWVsICgxOCBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHN1cHBsaWVkIGEgbWFqb3IgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGtyYjQtZnRwIHN1cHBvcnQgdG8KICBjdXJsLiBNYXJ0aW4gaXMgdGhlIHByaW1hcnkgYXV0aG9yIG9mIHRoZSBmdHAgY2xpZW50IG5hbWVkIHlhZmMgYW5kIGhlIGRpZAogIG5vdCBoZXNpdGF0ZSB0byBoZWxwIHVzIGltcGxlbWVudCB0aGlzIHdoZW4gSSBhc2tlZCBoaW0uIE1hbnkgYW5kIHNpbmNlcmUKICB0aGFua3MgdG8gYSBzcGxlbmRpZCBlZmZvcnQuIEl0IGRpZG4ndCBldmVuIHRha2UgbWFueSBob3VycyEKCi0gU3RlcGhlbiBLaWNrIHN1cHBsaWVkIGEgYmlnIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgLS1pbnRlcmZhY2UgZmxhZyB0bwogIHRoZSBjdXJsIHRvb2wgYW5kIENVUkxPUFRfSU5URVJGQUNFIGZvciBsaWJjdXJsLiBJdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KICBvdXRnb2luZyBpbnRlcmZhY2UgdG8gdXNlIGZvciB5b3VyIHJlcXVlc3QuIFRoaXMgbWF5IG5vdCB3b3JrIG9uIGFsbAogIHBsYXRmb3Jtcy4gVGhpcyBuZWVkcyB0ZXN0aW5nLgoKLSBSaWNoYXJkIFByZXNjb3R0IG5vdGljZWQgdGhhdCBjdXJsIG9uIFRydTY0IHVuaXggY291bGQgY29yZSBkdW1wZWQgaWYgdGhlCiAgbmFtZSBkaWRuJ3QgcmVzb2x2ZSBwcm9wZXJseS4gVGhpcyB3YXMgZHVlIHRvIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24gbm90CiAgcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gdGhvdWdoIGl0IGZhaWxlZCBvbiBzb21lIHBsYXRmb3JtcyEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBhbGwgc29ydHMgb2YgZG9jdW1lbnRzIGluIHJlZ2FyZHMgdG8gdGhlIG5ldyBwcm94eXR1bm5lbCBzdXBwb3J0LgoKVmVyc2lvbiA3LjNwcmUyCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIEthaS1Vd2UgUm9tbWVsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgaHR0cHByb3h5dHVubmVsIHN0dWZmIGZvciBmdHAuCiAgQWRqdXN0ZWQgaXQuIEFkZGVkIGJldHRlciBpbmZvIG1lc3NhZ2Ugd2hlbiBzZXR0aW5nIHVwIHRoZSB0dW5uZWwgYW5kIHRoZQogIHBhc3YgbWVzc2FnZSB3aGVuIGRvaW5nIHRoZSBzZWNvbmQgY29ubmVjdC4KClZlcnNpb24gNy4zcHJlMQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgImh0dHBwcm94eXR1bm5lbCIgdG8gYW4gYXJiaXRyYXJ5IGhvc3QgYW5kIHBvcnQgbmFtZS4gVGhlCiAgc2Vjb25kIGNvbm5lY3Rpb24gb24gZnRwIG5lZWRlZCB0aGF0LgoKLSBUaGVBcnRPZkhUVFBTY3JpcHRpbmcgd2FzIGNvcnJlY3RlZCBhbGwgb3Zlci4gSSBib3RoIHR5cGUgYW5kIHNwZWxsIHJlYWxseQogIGJhZCBhdCB0aW1lcyEKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDApCi0gLXAvLS1wcm94eXR1bm5lbCB3YXMgYWRkZWQgdG8gJ2N1cmwnLiBJdCB1c2VzIHRoZSBuZXcKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBsaWJjdXJsIG9wdGlvbiB0aGF0IGFsbG93cyAiYW55IiBwcm90b2NvbCB0byB0dW5uZWwKICB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaHR0cCBwcm94eS4gQXQgdGhlIG1vbWVudCwgdGhpcyBzaG91bGQgd29yayB3aXRoIGZ0cC4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDApCi0gSm9jaGVuIFNjaGFldWJsZSBmb3VuZCB0aGF0IGZpbGU6Ly8gZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuIENvcnJlY3RlZCB0aGlzCiAgYW5kIG1haWxlZCB0aGUgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMCkKLSBJIGNoYW5nZWQgdGhlICNkZWZpbmUgVCgpIGluIGN1cmwuaCBzaW5jZSBpdCB0dXJuZWQgb3V0IGl0IHdhc24ndCByZWFsbHkKICBhIGdvb2Qgc3ltYm9sIHRvIHVzZSAod2hlbiB5b3UgY29tcGlsZWQgUEhQIHdpdGggY3VybCBhcyBhIG1vZHVsZSwgdGhhdAogIGRlZmluZSBjb2xsaWRlZCB3aXRoIHNvbWUgSU1BUCBkZWZpbmUgb3Igc29tZXRoaW5nKS4gVGhpcyB3YXMgcG9zdGVkIHRvIHRoZQogIFBIUCBidWcgdHJhY2tlci4KCi0gSSBhZGRlZCBleHRlcm4gIkMiIHN0dWZmIGluIHR3byBoZWFkZXIgZmlsZXMgdG8gYmV0dGVyIGFsbG93IGxpYmN1cmwgdXNhZ2UKICBpbiBDKysgc29yY2VzLiBEaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggRGFubnkgSG9yc3dlbGwgbGVhZCB0bwogIHRoaXMuCgpWZXJzaW9uIDcuMi4xCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKmFnYWluKiBhbmQgbm93IGl0IHNlZW1zIHRvCiAgZGV0ZWN0IExpbnV4IG5hbWUgcmVzb2x2aW5nIHByb3Blcmx5ISAoaGVhcmQgdGhhdCBiZWZvcmU/KQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gcG9pbnRlZCBvdXQgdGhhdCBkb3dubG9hZGluZyBhIGZpbGUgY29udGFpbmluZyB0aGUKICBsZXR0ZXIgJysnIGZyb20gYW4gZnRwIHNlcnZlciBkaWRuJ3Qgd29yay4gSXQgZGlkIHdvcmsgZnJvbSBIVFRQIHRob3VnaCBhbmQKICB0aGUgcmVhc29uIHdhcyBteSBsYW1lIFVSTCBkZWNvZGVyLgoKLSBJIGhhcHBlbmVkIHRvIG5vdGljZSB0aGF0IC1JIGRpZG4ndCBhdCBhbGwgd29yayBvbiBmdHAgYW55bW9yZS4gSSBjb3JyZWN0ZWQKICB0aGF0LgoKVmVyc2lvbiA3LjIKCkRhbmllbCAoMzAgQXVndXN0IDIwMDApCi0gVW5kZXJzdGFuZGluZyBBSVggaXMgYSBoYXJkIHRhc2suIEkgYmVsaWV2ZSBJJ2xsIG5ldmVyIGZpZ3VyZSBvdXQgd2h5IHRoZXkKICBzb2x2ZSB0aGluZ3Mgc28gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgdW5peGVzLiBOb3csIEknbSBsZWZ0IHdpdGggdGhlCiAgQUlYIDQuMyBydW4tdGltZSB3YXJuaW5ncyBhYm91dCBkdXBsaWNhdGUgc3ltYm9scyB0aGF0IGFjY29yZGluZyB0byB0aGlzCiAgYXJ0aWNsZSAoaHR0cDovL3d3dy5nZW9jcmF3bGVyLmNvbS9hcmNoaXZlcy8zLzQwNS8xOTk5LzkvMC8yNTkzNDI4LykgaXMgYQogIGxpYnRvb2wgZmxhdy4gSSB0cmllZCB0aGUgbWVudGlvbmVkIHBhdGNoLCBhbHRob3VnaCB0aGF0IHN0b3BzIHRoZSBsaW5raW5nCiAgY29tcGxldGVseS4KCiAgU28sIGlmIEkgc2VsZWN0IHRvIGlnbm9yZSB0aGUgbGQgd2FybmluZ3MgdGhlcmUgYXJlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKICBmaWxsIHRoZSBzY3JlZW4gcHJldHR5IGJhZCB3aGVuIGN1cmwgY29tcGlsZXMuIEl0IHR1cm5zIG91dCB0aGF0IGlmIEkgd2FudAogIHRvICcjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+JywgSSBjYW4gZ2V0IHRpZCBvZiB0aGUgd2FybmluZ3MgYnkgaW5jbHVkZSB0aGUKICBmb2xsb3dpbmcgdGhyZWUgaW5jbHVkZSBmaWxlcyBiZWZvcmUgdGhhdCBvbmU6CgogICAgICAgICNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KICAgICAgICAjaW5jbHVkZSA8c3lzL21idWYuaD4KICAgICAgICAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgoKICBOb3csIGlzIGl0IHJlYWxseSBzYW5lIHRvIGFkZCB0aG9zZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSBhcnBhL2luZXQuaCBpbiBhbGwKICB0aGUgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBpdD8KCiAgVGhhbmtzIHRvIEFsYmVydCBDaGluLUEtWW91bmcgYXQgdGhld3JpdHRlbndvcmQuY29tIHdobyBnYXZlIG1lIHRoZSBBSVgKICBsb2dpbiB0byB0cnkgZXZlcnl0aGluZyBvbi4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDApCi0gSmFuIFNjaG1pZHQgc3VwcGxpZWQgdXMgYSBuZXcgVkM2IG1ha2VmaWxlIGZvciBXaW5kb3dzIGFzIHRoZSBwcmV2aW91cyBvbmUKICB3YXMgbm90IHVwIHRvIGRhdGUgYnV0IGxhY2tlZCBzZXZlcmFsIG9iamVjdCBmaWxlcy4KCi0gTW9yZSB3b3JrIG9uIHRoZSBuYW1pbmcuCgotIEFsYmVydCBDaGluLUEtWW91bmcgcHJvdmlkZWQgYSBjb25maWd1cmUtY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYXMKICBzb21lIHN5c3RlbXMgc2VlbSB0byBuZWVkIHRoYXQgZm9yIHRoZW0gdG8gd29yay4gSGFkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KICBmb3IgdGhlIGNvbmZpZy5oIGluY2x1ZGUgZmlsZSBpbiBldmVyeSAuYyBmaWxlIGluIHRoZSBsaWJjdXJsIGRpci4uLgoKLSBBcyBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCAoYnkgVHJveSBFbmdlbCksIEkgZGlkIHVzZSBhIC0tZGF0YS1iaW5hcnkKICBvcHRpb24gaW5zdGVhZCBvZiB0aGUgbWVzc3kgd2F5IEkndmUgbGVmdCBkZXNjcmliZWQgYmVsb3cuIEl0IHNlZW1zIHRvCiAgd29yay4gVGhlIGxpYmN1cmwgZml4IHJlbWFpbmVkIHRoZSBzYW1lIGFzIHllc3RlcmRheS4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDApCi0gQmFjayBvbiB0aGUgLWQgc3RyaXBwaW5nIG5ld2xpbmVzIHRoaW5nLiBUaGUgJ3BsYWluIHBvc3QnIHRoaW5nIHdhcyBhZGRlZAogIHdoZW4gSSBoYWQgbm8gdGhvdWdodCBvZiB0aGF0IG9uZSBjb3VsZCBhY3R1YWxseSBwb3N0IGJpbmFyeSBkYXRhIHdpdGgKICBpdC4gTm93LCBJIGhhdmUgdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGdyYWNlZnVsIG1hbm5lciBhbmQgSSB0aGluawogIEkndmUgbWFuYWdlZCB0byBjb21lIHVwIHdpdGggYSB3YXk6ICctZCBAZmlsZTtiaW5hcnknIHdpbGwgdGh1cyBwb3N0IHRoZQogIGZpbGUgYmluYXJ5LCBleGFjdGx5IGFzIGl0cyBjb250ZW50cyBhcmUuIEl0IGlzIGltcGxlbWVudGVkIHdpdGggYSBuZXcKICAqc2V0b3B0KCkgb3B0aW9uIChDVVJMT1BUX1BPU1RGSUVMRFNJWkUpIHRvIHNldCB0aGUgcG9zdGZpZWxkIHNpemUsIHNpbmNlCiAgbGliY3VybCBjYW4ndCBzdHJsZW4oKSB0aGUgZGF0YSBpbiB0aGVzZSBjYXNlcy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWRlIHNvbWUgdmVyeSBzZXJpb3VzIGVmZm9ydHMgYW5kIGFsbCB0aGUgbmFtZQogIHJlc29sdmluZyBwcm9ibGVtcyBzZWVtIHRvIGhhdmUgYmVlbiBzb3J0ZWQgb3V0IG5vdyBvbiBhbGwgdGhlIHBsYXRmb3JtcwogIHRoYXQgcHJldmlvdXNseSBzaG93ZWQgdGhlbS4gSSdsbCBtYWtlIGFub3RoZXIgcmVsZWFzZSBub3cgYW55ZGF5IGJlY2F1c2Ugb2YKICB0aGlzLgoKLSBUaGUgRkFRIHdhcyBtdWNoIGVuaGFuY2VkIHdoZW4gaXQgY29tZXMgdG8gdGhlIGxpY2Vuc2luZyBpc3N1ZXMgdGhhbmtzIHRvCiAgQmpvcm4gUmVlc2UuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIFJpY2sgV2VseWtvY2h5IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHlvdSB1c2UgLWQgdG8gcG9zdCBhbmQgeW91IHdhbnQgdG8KICBrZWVwIHRoZSBuZXdsaW5lcywgYXMgY3VybCBzdHJpcHMgdGhlbSBvZmYgYXMgYSBib251cyBiZWZvcmUgcG9zdGluZy4uLgogIFRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgoKVmVyc2lvbiA3LjEuMQoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBHb3QgbW9yZSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIG1lc3MuIENhb2xhbiBNY05hbWFyYSBzZW50CiAgbWUgY29uZmlndXJlLWNvZGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHZlcnkgc2ltaWxhciB0byBteSBleGlzdGluZyB0ZXN0cwogIHdoaWNoIG9ubHkgbWFrZSBtZSBtb3JlIHN1cmUgSSdtIG9uIHRoZSByaWdodCBwYXRoLiBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mCiAgdGhlIHRlc3RzIHNsaWdodGx5LCBhcyBpdCBzZWVtcyB0aGF0IHNvbWUgY29tcGlsZXJzIGRvbid0IHllbGwgZXJyb3IgaWYgYQogIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCB0b28gbWFueSBwYXJhbWV0ZXJzLiBUaHVzLCB0aGUgZmlyc3QgdGVzdGVkIGZ1bmN0aW9uCiAgd2lsbCBzZWVtIG9rLi4uIExldCdzIGhvcGUgbW9yZSBjb21waWxlcnMgdGhpbmsgb2YgdG9vLWZldyBwYXJhbWV0ZXJzIGFzIGJhZAogIG1hbm5lcnMsIGFzIHdlJ3JlIG5vdyB0cnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG9yZGVyOyBmZXdlciBmaXJzdC4gSQogIHNob3VsZCBhbHNvIGFkZCB0aGF0IExhcnMgSGVja2luZyBtYWlsZWQgbWUgYW5kIHZvbHVudGVlcmVkIHRvIHJ1biB0ZXN0cyBvbgogIGEgZmV3IG9kZCBzeXN0ZW1zLiBDb2FsYW4gaXMga2VlcGluZyBoaXMgd29yayBvdmVyIGF0CiAgaHR0cDovL3d3dy5jc24udWwuaWUvfmNhb2xhbi9wdWJsaW5rL2dldGhvc3RieW5hbWVfci8uIE1pZ2h0IGJlIGhhbmR5IGluIHRoZQogIGZ1dHVyZSBhcyB3ZWxsLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwMCkKLSBJIG5vdGljZWQgSSBoYWRuJ3QgaW5jcmVhc2VkIHRoZSBuYW1lIGxvb2t1cCBidWZmZXIgaW4gbGliL2Z0cC5jLiBJIGRvbid0CiAgdGhpbmsgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgY29udGludWVkIHRyb3VibGUgdGhvdWdoLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMCkKLSBGcmVkIE5veiBjb3JyZWN0ZWQgbXkgc3R1cGlkIG1pc3Rha2VzIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBmbHVmZi4gSXQKICBzaG91bGQgYWZmZWN0IHNvbWUgQUlYLCBEaWdpdGFsIFVuaXggYW5kIEhQVVggMTAgc3lzdGVtcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDApCi0gTWF0aGlldSBMZWdhcmUgY29tcGlsZWQgYW5kIGJ1aWxkIDcuMSB3aXRob3V0IGVycm9ycyBvbiBib3RoIEFJWCA0LjIgYXMgd2VsbAogIGFzIEFJWCA0LjMuIE5vdyB3aHkgZGlkIHByb2JsZW1zIG9jY3VyIGJlZm9yZT8KCi0gRnJlZCBOb3ogcmVwb3J0ZWQgYSAtdy8tLXdyaXRlLW91dCBidWcgdGhhdCBjYXVzZWQgaXQgdG8gbWFsZnVuY3Rpb24gd2hlbgogIHVzZWQgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBVUkwgcmV0cmlldmFsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGRpc3BsYXkgZ290CiAgc2NyZXdlZCB1cCEKCkRhbmllbCAoMTEgQXVndXN0IDIwMDApCi0gSmFzb24gUHJpZWJlIGFuZCBhbiBhbm9ueW1vdXMgZnJpZW5kIGZvdW5kIHNvbWUgaG9zdCBuYW1lcyB0aGUgTGludXggdmVyc2lvbgogIG9mIGN1cmwgY291bGQgbm90IHJlc29sdmUuIEl0IHR1cm5lZCBvdXQgdGhlIGJ1ZmZlciB1c2VkIHRvIHJldHJpZXZlIHRoYXQKICBpbmZvcm1hdGlvbiB3YXMgdG9vIHNtYWxsLiBGaXhlZC4gT25lIGNvdWxkIGFyZ3VlIGFib3V0IHRoZSB1c2VmdWxuZXNzIG9mCiAgbm90IGhhdmluZyB0aGUgc2xpZ2h0ZXN0IHRyYWNlIG9mIGEgbWFuIHBhZ2UgZm9yIGdldGhvc3RieW5hbWVfcigpIG9uIG15CiAgTGludXggUmVkaGF0IGluc3RhbGxhdGlvbi4uLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMCkKLSBCYWxhamkgUyBSYW8gd2FzIGZpcnN0IGluIGxpbmUgdG8gbm90ZSB0aGUgbWlzc2luZyBwb3NzaWJpbGl0eSB0byByZXBsYWNlCiAgdGhlIENvbnRlbnQtVHlwZTogYW5kIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzIHdoZW4gZG9pbmcgLWQgcG9zdHMuIEkgYWRkZWQKICB0aGUgcG9zc2liaWxpdHkganVzdCBub3cuIEl0IHNlZW1zIHNvbWUgcGVvcGxlIHdhbnRzIHRvIGRvIHN0YW5kYXJkIHBvc3RzCiAgdXNpbmcgY3VzdG9tIENvbnRlbnQtVHlwZXMuCgpEYW5pZWwgKDggQXVndXN0IDIwMDApCi0gTWlrZSBEb3dlbGwgY29ycmVjdGx5IGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZCBub3QgYXBwcm92ZSBvZiBVUkxzIHdpdGggbm8KICB1c2VyIG5hbWUgYnV0IHBhc3N3b3JkLiBBcyBpbiAnaHR0cDovLzpmb29AaGF4eC5zZScuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMQoKRGFuaWVsICg3IEF1Z3VzdCAyMDAwKQotIE15IEFJWCA0IGZpeCBkb2VzIG5vdCB3b3JrLiBJIG5lZWQgaGVscCBmcm9tIGEgQUlYIDQgaGFja2VyLgoKLSBJIGFkZGVkIG15IG5ldyBkb2N1bWVudCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIEl0IGlzIGFpbWVkIHRvIGJlY29tZSBhIHNvcnQKICBvZiB0dXRvcmlhbCBvbiBob3cgdG8gZG8gSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICg0IEF1Z3VzdCAyMDAwKQotIFdvcmtpbmcgd2l0aCBSaWNoIEdyYXkgb24gY29tcGlsaW5nIGN1cmwgZm9yIGxvdHMgb2YgZGlmZmVyZW50IHBsYXRmb3Jtcy4KICBNeSBmaXggZm9yIEFJWCAzLjIgd2FzIG5vdCBnb29kIGVub3VnaCBhbmQgd2FzIHNsaWdodGx5IGNoYW5nZWQsIEkgaGFkIHRvCiAgbW92ZSBhbiBpbmNsdWRlIGZpbGUgYmVmb3JlIGFub3RoZXIsIGFzIGlzIG5vdyBkZXNjcmliZWQgaW4gdGhlIHNvdXJjZS4KCiAgQUlYIDQuMiAoNC5YPykgaGFzIGRpZmZlcmVudCBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkKICBmdW5jdGlvbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGFuZCB0aHVzIHRoZSBjb21waWxlCiAgYnJva2Ugd2l0aCBhbiBlcnJvci4gSSBoYXZlIG5vdyBjaGFuZ2VkIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjaGVjayBpbiB0aGUKICBjb25maWd1cmUgZmlsZSB0byBzdXBwb3J0IGFsbCB0aHJlZSB2ZXJzaW9ucyBvZiBib3RoIHRoZXNlIGZ1bmN0aW9ucy4gTXkKICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEFJWC1zdHlsZSBpcyB0aG91Z2ggbm90IHlldCB2ZXJpZmllZCBhbmQgSSBtYXkKICBnZXQgcHJvYmxlbXMgdG8gZml4IGl0IGlmIGl0IHR1cm5zIG91dCB0byBidWcgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwogIGFueSBzeXN0ZW0gdXNpbmcgdGhhdC4KCiAgRm9yIHByb2JsZW1zIGxpa2UgdGhhdCwgSSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFsbG93IC0tZGlzYWJsZS10aHJlYWQKICB0byBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGNoZWNrIGZvciB0aHJlYWRzYWZlIHZlcnNpb25zIG9mIGEgZmV3CiAgZnVuY3Rpb25zIGFuZCB0aHVzIGdvIHdpdGggdGhlICJnb29kIG9sZCB2ZXJzaW9ucyIgdGhhdCB0ZW5kIHRvIHdvcmsKICBhbHRob3VnaCB3aWxsIGJyZWFrIHRocmVhZC1zYWZlbmVzcyBmb3IgbGliY3VybC4gTW9zdCBwZW9wbGUgd29uJ3QgdXNlCiAgbGliY3VybCBmb3Igb3RoZXIgdGhpbmdzIHRoYW4gY3VybCB0aG91Z2gsIGFuZCBjdXJsIGRvZXNuJ3QgbmVlZCBhCiAgdGhyZWFkLXNhZmUgbGliLgoKLSBXb3JraW5nIG9uIG15IGJpZyB0dXRvcmlhbCBhYm91dCBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gUmljaCBHcmF5IHNwb3R0ZWQgYSBwcm9ibGVtIGluIHNyYy9zZXR1cC5oIGNhdXNlZCBieSBhICNkZWZpbmUgc3RyZXF1YWwoKQogIHRoYXQgd2FzIGp1c3QgYSBsZWZ0LW92ZXIgZnJvbSBwYXNzZWQgdGltZXMuIFRoZSBzdHJlcXVhbCgpIGlzIG5vdyBhIHRydWUKICBmdW5jdGlvbiBzdXBwbGllZCBieSBsaWJjdXJsIGZvciBhIHBvcnRhYmxlIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyaXNvbi4gSSBhZGRlZCB0aGUgcHJvdG90eXBlcyBpbiBpbmNsdWRlL2N1cmwuaCBhbmQgcmVtb3ZlZCB0aGUKICBub3cgb2Jzb2xldGUgI2RlZmluZS4KCi0gSWdvciBLaHJpc3RvcGhvcm92IG1hZGUgYSBmaXggdG8gYWxsb3cgcmVzdW1lZCBkb3dubG9hZCBmcm9tIFN1bidzCiAgSmF2YVdlYlNlcnZlci8xLjEuMS4gSXQgc2VlbXMgdGhhdCB0aGVpciBzZXJ2ZXIgc2VuZHMgYmFkIENvbnRlbnQtUmFuZ2UKICBoZWFkZXJzLgoKLSBUaGUgbWFrZWZpbGVzIGZvcmNlZCBhIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkLCB3aGljaCBpcyBiYWQgc2luY2Ugd2Ugbm93IHVzZQogIGxpYnRvb2wgYW5kIHRodXMgaGF2ZSBleGNlbGxlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCEgQWxiZXJ0IENoaW4tQS1Zb3VuZwogIGZvdW5kIG91dC4KClZlcnNpb24gNy4wLjExYmV0YQoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSBpbnN0YWxsJyBkaWQgbm90IHByb3Blcmx5IGNyZWF0ZQogIHRoZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnksIHdoeSBpdCBmYWlsZWQgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGFzCiAgaXQgc2hvdWxkLiBBdXRvbWFrZSBpc24ndCByZWFsbHkgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIHN1YmRpcmVjdG9yaWVzCiAgd2l0aG91dCBNYWtlZmlsZXMgaW4gYW55IG5pY2Ugd2F5LiBJIGhhZCB0byBydW4gYWhlYWQgYW5kIGFkZCBNYWtlZmlsZXMgaW4KICBib3RoIGluY2x1ZGUgYW5kIGluY2x1ZGUvY3VybCBiZWZvcmUgSSBtYW5hZ2VkIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAogIG1ha2VmaWxlIHRoYXQgc3VjY2VlZHMgaW4gaW5zdGFsbCBldmVyeXRoaW5nIHByb3Blcmx5IQoKLSBPaywgbm8gbW9yZSAiZmVhdHVyZXMiIGFkZGVkIG5vdy4gTGV0J3MganVzdCB2ZXJpZnkgdGhhdCB0aGVyZSdzIG5vIG1ham9yCiAgZmxhd3MgYWRkZWQgbm93LgoKRGFuaWVsICgzMSBKdWx5IDIwMDApCi0gQm90aCBKZWZmIFNjaGFzbnkgYW5kIEtldGlsIEZyb3luIGFza2VkIG1lIGhvdyB0byB0ZWxsIGN1cmwgbm90IHRvIHNlbmQgb25lCiAgb2YgdGhvc2UgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycy4gVGhleSBkaWRuJ3Qgc2V0dGxlIHdpdGggdGhlIGJsYW5rCiAgb25lcyB5b3UgY291bGQgdGVsbCBjdXJsIHRvIHVzZS4gSSByZXdyb3RlIHRoZSBoZWFkZXItcmVwbGFjZSBzdHVmZiBhCiAgbGl0dGxlLiBOb3csIGlmIHlvdSByZXBsYWNlIGFuIGludGVybmFsIGhlYWRlciB3aXRoIHlvdXIgb3duIGFuZCB0aGF0IG5ldwogIG9uZSBpcyBhIGJsYW5rIGhlYWRlciB5b3Ugd2lsbCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgb25lIGFuZCBub3QgZ2V0IGFueQogIGJsYW5rLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW55IGNhc2Ugd2hlbiB5b3Ugd2FudCB0aGF0IGJsYW5rIGhlYWRlci4KCkRhbmllbCAoMjkgSnVseSAyMDAwKQotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSBsaWIgdXNlZCBsb2NhbHRpbWUoKSB3aGljaCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIG5vdwogIEkgdXNlIGxvY2FsdGltZV9yKCkgaW4gdGhlIHN5c3RlbXMgdGhhdCBoYXMgaXQuCgotIEkgd2VudCB0aHJvdWdoIHRoaXMgZW50aXJlIGRvY3VtZW50IGFuZCByZW1vdmVkIGFsbCBlbWFpbCBhZGRyZXNzZXMgYW5kIGxlZnQKICBuYW1lcyBvbmx5LiBJJ3ZlIHJlYWxseSBtYWRlIGFuIGVmZm9ydCB0byBhbHdheXMgbm90ZSB3aG8gYnJvdWdodCBiZSBidWcKICByZXBvcnRzIG9yIGZpeGVzLCBidXQgbW9yZSBhbmQgbW9yZSBwZW9wbGUgYXNrIG1lIHRvIHJlbW92ZSB0aGUgZW1haWwKICBhZGRyZXNzZXMgc2luY2UgdGhleSBiZWNvbWUgdmljdGltcyBmb3Igc3BhbXMgdGhpcyB3YXkuIEdvcmRvbiBCZWF0b24gZ290IG1lCiAgd29ya2luZyBvbiB0aGlzLgoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBmb3VuZCBvdXQgdGhhdCB3aGVuIHlvdSBzcGVjaWZpZWQgYSBIVFRQIHByb3h5IGluIGFuCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHVzZWQgLUwsIGN1cmwgZmFpbGVkIGluIHRoZSBzZWNvbmQgZmV0Y2guIEkKICBjb3JyZWN0ZWQgdGhpcyBwcm9ibGVtIGFuZCBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbGlzdC4gTm8gbmVlZCBmb3IgYW4gZXh0cmEKICBiZXRhIHJlbGVhc2UganVzdCBmb3IgdGhpcy4KClZlcnNpb24gNy4wLjEwYmV0YQoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gU28sIGxpYnRvb2wgcmVwbGFjZWQgdHdvIG9mIG15IGZpbGVzIHdpdGggc3ltYm9saWMgbGlua3MgYW5kIEkgZm9yZ290IHRvIGFkZAogIHRoZSB0d28gbmV3IGxpYnRvb2wgZmlsZXMgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSAoYW5kIHRoZXkgd2VyZSBhZGRlZCBhcwogIHN5bWxpbmtzIGFzIHdlbGwhKSBUaGlzIG9mIGNvdXJzZSBsZWFkIHRvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkCiAgb24gNy4wLjkuLi4KClZlcnNpb24gNy4wLjliZXRhCgpEYW5pZWwgKDI1IEp1bHkgMjAwMCkKLSBLcmlzdGlhbiBL9mhudG9wcCA8a3JpcyBhdCBrb2VobnRvcHAuZGU+IGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsCiAgbGlidG9vbGlmaWVkLCBqdXN0IGFzIHdlJ3ZlIHdhbnRlZCBmb3IgYSB3aGlsZSBub3cuIEhlIGFsc28gbWFkZSB0aGUKICByZWNlbnRseSBhZGRlZCBtYW4gcGFnZXMgZ2V0IGluc3RhbGxlZCBwcm9wZXJseSBvbiAnbWFrZSBpbnN0YWxsJyBhbmQgc29tZQogIG90aGVyIG5pY2UgY2xlYW51cHMuCgotIEluIGEgZGlzY3Vzc2lvbiB3aXRoIEVldHUgT2phbmVuIGl0IHN0cnVjayBtZSB0aGF0IGlmIHdlIHVzZSBjdXJsIHRvIGdldCBhCiAgcGFnZSB1c2luZyBhIHBhc3N3b3JkLCBhbmQgdGhhdCBwYWdlIHRoZW4gc2VuZHMgYSBMb2NhdGlvbjogdG8gYW5vdGhlcgogIHNlcnZlciB0aGF0IGN1cmwgZm9sbG93cywgY3VybCB3aWxsIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhhdAogIHNlcnZlciBhcyB3ZWxsLgoKICBOb3csIEknbGwgbmV2ZXIgYmUgYWJsZSB0byBtYWtlIGN1cmwgZG8gTG9jYXRpb246IGZvbGxvd2luZyBhbGwgdGhhdCBwZXJmZWN0CiAgYW5kIHlvdSdyZSBhbGwgc29vbmVyIG9yIGxhdGVyIHJlcXVpcmVkIHRvIHdyaXRlIGEgc2NyaXB0IHRvIGRvIHNldmVyYWwKICBmZXRjaGVzIHdoZW4geW91J3JlIGRvaW5nIGFkdmFuY2VkIHN0dWZmLCBidXQgbm93IEkndmUgbW9kaWZpZWQgY3VybCB0byBhdAogIGxlYXN0ICpvbmx5KiBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIFdoaWNoCiAgbWVhbnMgdGhhdCBpZiBnZXQgYSBwYWdlIGZyb20gc2VydmVyIEEgd2l0aCBhIHBhc3N3b3JkLCB0aGF0IGZvcndhcmRzIGN1cmwKICB0byBzZXJ2ZXIgQiwgY3VybCB3b24ndCB1c2UgdGhlIHBhc3N3b3JkIHRoZXJlLiBJZiBzZXJ2ZXIgQiB0aGVuIGZvcndhcmRzCiAgY3VybCBiYWNrIHRvIHNlcnZlciBBIGFnYWluLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGFnYWluLgoKICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW1wbGVtZW50YXRpb24sIGFzIGluIGEgYnJvd3NlciBjYXNlIGl0IHdvdWxkIG9ubHkgdXNlCiAgdGhlIHBhc3N3b3JkIGlmIHRoZSBsZWZ0LXByZWZpeCBvZiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgc2FtZS4gSSBqdXN0IHRoaW5rCiAgdGhhdCB0aGlzIGZpeCBwcmV2ZW50cyBhIHNvbWV3aGF0IGx1cmt5ICJzZWN1cml0eSBob2xlIi4KCiAgQXMgYSBzaWRlLW5vdGUgaW4gdGhpcyBzdWJqZWN0OiBIVFRQIHBhc3N3b3JkcyBhcmUgc2VudCBpbiBjbGVhcnRleHQgYW5kCiAgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNhZmUgb3Igc2VjdXJlLiBVc2UgSFRUUFMgZm9yIHRoYXQuCgotIEFzIGRpc2N1c3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIGNvbnZlcnRlZCB0aGUgRlRQIHJlc3BvbnNlIHJlYWRpbmcKICBmdW5jdGlvbiBpbnRvIHVzaW5nIHNlbGVjdCgpIHdoaWNoIHRoZW4gYWxsb3dzIHRpbWVvdXRzIChldmVuIHVuZGVyIHdpbjMyISkKICBpZiB0aGUgY29tbWFuZC1yZXBseSBzZXNzaW9uIGdldHMgdG9vIHNsb3cgb3IgZGllcyBjb21wbGV0ZWx5LiBJIG1hZGUgYQogIGRlZmF1bHQgdGltZW91dCBvbiAzNjAwIHNlY29uZHMgdW5sZXNzIGFueXRoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLCBzaW5jZSBJCiAgZG9uJ3QgdGhpbmsgYW55b25lIHdhbnRzIHRvIHdhaXQgbW9yZSB0aGFuIHRoYXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciB0bwogIGdldCByZWNlaXZlZC4uLgoKLSBUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGF0IGdteC5uZXQ+IGJyb3VnaHQgYSBzZXQgb2YgZml4ZXMgZm9yCiAgdGhlIHJmYzE4NjcgZm9ybSBwb3N0cy4gSGUgaW50cm9kdWNlZCAnbmFtZT08ZmlsZScgd2hpY2ggYnJpbmdzIGEgbWVhbnMgdG8KICBzdXVwbHkgdmVyeSBsYXJnZSB0ZXh0IGNodW5rcyByZWFkIGZyb20gdGhlIGdpdmVuIGZpbGUgbmFtZS4gSXQgZGlmZmVycyBmcm9tCiAgJ25hbWU9QGZpbGUnIGluIHRoZSB3YXkgdGhhdCB0aGlzIGxhdHRlciB0aGluZyBpcyBtYXJrZWQgaW4gdGhlIHVwbG9hZGVkCiAgY29udGVudHMgYXMgYSBmaWxlIHVwbG9hZCwgd2hpbGUgdGhlIGZpcnN0IGlzIGp1c3QgdGV4dCAoYXMgaW4gYSBpbnB1dCBvcgogIHRleHRhcmVhIGZpZWxkKS4gVG9yc3RlbiBhbHNvIGNvcnJlY3RlZCBhIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiBpZiB5b3UgdXNlZAogICVzIG9yIHNpbWlsYXIgaW4gYSAtRiBmaWxlIG5hbWUuCgotIEFzIGRpc2NvdmVyZWQgYnkgTmljbyBCYWdndXMgPE5pY28uQmFnZ3VzIGF0IG1haWwuaW5nLm5sPiwgd2hlbiB0cmFuc2ZlcnJpbmcKICBmaWxlcyB0by9mcm9tIEZUUCB1c2luZyB0eXBlIEFTQ0lJIGN1cmwgc2hvdWxkIG5vdCBleHBlY3QgdGhlIHRyYW5zZmVyIHRvIGJlCiAgdGhlIGV4YWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciBhcyB0aGUgZmlsZSBzaXplLiBTaW5jZSBBU0NJSSBtYXkgdmVyeQogIHdlbGwgbWVhbiB0aGF0IHRoZSBjb250ZW50IGlzIHRyYW5zbGF0ZWQgd2hpbGUgdHJhbnNmZXJlZCwgdGhlIGZpbmFsIHNpemUKICBtYXkgdmVyeSB3ZWxsIGRpZmZlci4gVGhlcmVmb3IsIGN1cmwgbm93IGlnbm9yZXMgdGhlIGZpbGUgc2l6ZSB3aGVuIGRvaW5nCiAgQVNDSUkgdHJhbnNmZXJzIGluIEZUUC4KCkRhbmllbCAoMjQgSnVseSAyMDAwKQotIEFkZGVkIENVUkxPUFRfUFJPWFlQT1JUIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgY2FsbCB0byBhbGxvdyB0aGUgcHJveHkKICBwb3J0IG51bWJlciB0byBiZSBzZXQgc2VwYXJhdGVseSBmcm9tIHRoZSBwcm94eSBob3N0IG5hbWUuCgotIEFuZHJldyA8YW5kcmV3IGF0IHVnaC5uZXQuYXU+IHBvaW50ZWQgb3V0IGEgbmV0cmMgbWFudWFsIGJ1Zy4KCi0gVGhlIEZUUCB0cmFuc2ZlciBjb2RlIG5vdyBhY2NlcHRzIGEgMjUwLWNvZGUgYXMgd2VsbCBhcyB0aGUgcHJldmlvdXNseQogIGFjY2VwdGVkIDIyNiwgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGUgdHJhbnNmZXIuIE1vaGFuIDxtbmFpciBhdAogIGV2ZXJncmVlbi1mdW5kcy5jb20+IHBvaW50ZWQgdGhpcyBvdXQuCgotIFRoZSBjaGVjayBmb3IgKmJvdGgqIG5zbCBhbmQgc29ja2V0IHdhcyBuZXZlciBhZGRlZCBpbiB0aGUgdjcgY29uZmlndXJlLmluCiAgd2hlbiBJIG1vdmVkIHRoZSBtYWluIGJyYW5jaC4gSSByZS1hZGRlZCB0aGF0IGNoZWNrIHRvIGNvbmZpZ3VyZS5pbi4gVGhpcyB3YXMKICBkaXNjb3ZlcmVkIGJ5IFJpY2ggR3JheS4KCi0gSG93YXJkLCBCbGFpc2UgPEJsYWlzZS5Ib3dhcmQgYXQgZmFjdGl2YS5jb20+IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmcmVlKCkgaW4KICBjdXJsX2Rpc2Nvbm5lY3QoKSB3aGljaCBvZiBjb3Vyc2UgbWVhbnQgbGliY3VybCBhdGUgbWVtb3J5LgoKLSBCcmlhbiBFLiBHYWxsZXcgbm90ZWQgdGhhdCB0aGUgSFRUUCAnSG9zdDonIGhlYWRlciBjdXJsIHNlbnQgZGlkIG5vdAogIHByb3Blcmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIG5vbi1kZWZhdWx0IHBvcnRzIHdlcmUgdXNlZC4gVGhpcyBzaG91bGQKICBub3cgaGF2ZSBiZWVuIGZpeGVkLgoKLSBIVFRQIGNvbm5lY3QgZXJyb3JzIG5vdyByZXR1cm4gZXJyb3JzIGVhcmxpZXIuIFRoaXMgd2FzIG1vc3Qgbm90YWJseSBjYXVzaW5nCiAgcHJvYmxlbXMgd2hlbiB0aGUgSFRUUFMgY2VydGlmaWNhdGUgaGFkIHByb2JsZW1zIGFuZCBsYXRlciBjYXVzZWQgYSBjcmFzaC4KICBNYW55IHRoYW5rcyB0byBHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHMgYXQgbGV2ZWw4LmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgYW5kIHN1Z2dlc3RpbmcgYSBmaXguLi4KCkRhbmllbCAoMjEgSnVuZSAyMDAwKQotIEFmdGVyIGEgImJ1ZyByZXBvcnQiIEkgcmVjZWl2ZWQgd2hlcmUgdGhlIHVzZXIgd2FzIHVzaW5nIGJvdGggLUYgYW5kIC1JIGluIGEKICBIVFRQIHJlcXVlc3QgKGl0IHNldmVybHkgY29uZnVzZWQgdGhlIGxpYnJhcnkgSSBzaG91bGQgYWRkKSwgSSBhZGRlZCBzb21lCiAgY2hlY2tzIHRvIHNyYy9tYWluLmMgdGhhdCBwcmV2ZW50cyBzZXR0aW5nIG1vcmUgdGhhbiBvbmUgSFRUUCByZXF1ZXN0CiAgY29tbWFuZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHVzZXIgd2FudHMhIDstKQoKVmVyc2lvbiA3LjAuOGJldGEKCkRhbmllbCAoMjAgSnVuZSAyMDAwKQotIEkgZGlkIGEgbWFqb3IgcmVwbGFjZSBpbiBtYW55IGZpbGVzIHRvIHVzZSB0aGUgbmV3IGN1cmwgZG9tYWluIGhheHguc2UKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBvbmUuCgotIEFzIEVldHUgT2phbmVuIHN1Z2dlc3RlZCwgSSBmaW5hbGx5IHRvb2sgdGhlIHN0ZXAgYW5kIG5vdyBsaWJjdXJsIG5vIGxvbmdlcgogIG1ha2VzIGEgUE9TVCBhZnRlciBpdCBoYXMgZm9sbG93ZWQgYSBsb2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBQT1NUIGhhcwogIGJlZW4gZG9uZSwgaXQnbGwgdHVybmVkIGludG8gYSBHRVQgZm9yIHRoZSBmdXJ0aGVyIHJlcXVlc3RzLiBUaGlzIGlzIG9ubHkKICBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIC1MLy0tbG9jYXRpb24gKmFuZCogZG9pbmcgYSBQT1NUIGF0IHRoZSBzYW1lIHRpbWUuCgogIFdoaWxlIG1lc3Npbmcgd2l0aCB0aGlzLCBJIGFkZGVkIGFub3RoZXIgd2VpcmQgZmVhdHVyZSBJIGNhbGwgJ2F1dG8KICByZWZlcmVyJy4gSWYgeW91IGFwcGVuZCAnO2F1dG8nIHRvIHRoZSByaWdodCBvZiBhIGdpdmVuIHJlZmVyZXIgc3RyaW5nIChvcgogIG9ubHkgdXNlIHRoYXQgc3RyaW5nIGFzIHJlZmVyZXIpLCBsaWJjdXJsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlCiAgcHJldmlvdWQgVVJMIGFzIHJlZmVyZWQgd2hlbiBpdCBmb2xsb3dzIGEgTG9jYXRpb246IGFuZCBnZXRzIGEgc3VjY2VlZGluZwogIGRvY3VtZW50LgoKLSBNeSBoZXJvIFJpY2ggR3JheSBmb3VuZCB0aGUgdmVyeSBvYnNjdXJlIEZUUCBidWcgdGhhdCBoYXBwZW5lZCB0byBoaW0gb25seQogIHdoZW4gcGFzc2luZyB0aHJvdWdoIGEgcGFydGljdWxhciBmaXJld2FsbCBhbmQgdXNpbmcgdGhlIFBPUlQgY29tbWFuZC4gSXQKICB0dXJuZWQgb3V0IHRoYXQgUE9SVCB3YXMgdGhlIG9ubHkgY29tbWFuZCBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSB0aGF0CiAgZGlkbid0IHNlbmQgYSBwcm9wZXIgXHJcbiBzZXF1ZW5jZSBidXQgaW5zdGVhZCB1c2VkIHRoZSBmYXVsdHkgXG4gd2hpY2ggYXMKICBpdCBzZWVtZWQgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbWFqb3IgZnRwIHNlcnZlcnMuLi4gOi1PCgpWZXJzaW9uIDcuMC43YmV0YQoKRGFuaWVsICgxNiBKdW5lIDIwMDApCi0gSSBoYWQgYXZvaWRlZCB0aGlzIGxvbmcgZW5vdWdoIG5vdywgc28gSSBtb3ZlZCB0aGUgYWx0ZXJuYXRpdmUgcHJvZ3Jlc3MgYmFyCiAgc3R1ZmYgZnJvbSB0aGUgbGliIGFuZCBhZGRlZCBpdCB0byB0aGUgY2xpZW50IGNvZGUuIFRoaXMgaXMgbm93IHVzaW5nIHRoZQogIHJlY2VudGx5IGFkZGVkIHByb2dyZXNzIGNhbGxiYWNrIGFuZCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSBtdWNoIGxpa2UKICBiZWZvcmUuIFNpbmNlIGl0IGlzIG9ubHkgb25lIHByb2dyZXNzIGJhciBhbmQgeW91IGFuZCBkb3dubG9hZCBhbmQgdXBsb2FkIGF0CiAgdGhlIHNhbWUgdGltZSwgdGhpcyBiYXIgc2hvd3MgdGhlIGNvbWJpbmVkIHByb2dyZXNzIG9mIGJvdGggZGlyZWN0aW9ucy4gVGhpcwogIGNvZGUgd2FzIGp1c3QgcG9ydGVkIGZyb20gdGhlIG9sZCBwbGFjZSB0byB0aGlzLCBMYXJzIGlzIHN0aWxsIG91ciBzYXZpb3VyIQogIDstKSBUaGlzIGFsc28gbWFkZSB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIGFjY3VyYXRlIHNpbmNlIEkgbmV2ZXIgcmVtb3ZlZAogIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgZG9jcyEgQWx0aG91Z2ggSSBub3cgcmVtb3ZlZCB0aGUgQ1VSTE9QVF9QUk9HUkVTU01PREUKICBmcm9tIHRoZSBsaWJyYXJ5IHNpbmNlIHRoZSBsaWIgaGFzIG9ubHkgb25lIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGFuZCBpdAogIHdpbGwgbmV2ZXIgZ2V0IGFub3RoZXIuIEl0IGlzIGFsdGhvdWdoIGxpa2VseSB0aGF0IHRoZSBpbnRlcm5hbCBvbmUgYWxzbwogIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNsaWVudCBjb2RlIGluIHRoZSBmdXR1cmUgKHdoZW4gSSBoYXZlIG90aGVyIG1lYW5zIG9mCiAgZ2V0dGluZyB0aGUgd3JpdGVvdXQgZGF0YSBhbmQgbW92ZSB0aGF0IHRvbyB0byB0aGUgY2xpZW50KS4KCi0gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnkgdGhhdCBzdGFuZGFyZCBwcm9ncmVzcyBtZXRlciB3b3JrcyBhbmQgSQogIGZvdW5kIG91dCBpdCBkaWRuJ3QgZ2V0IGluaXRlZCBwcm9wZXJseS4gR3Jyci4gSSBjb3JyZWN0ZWQgdGhhdCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBKdW5lIDIwMDApCi0gSSB0aG91Z2h0IEknZCBiZXR0ZXIgdmVyaWZ5IHRoYXQgdGhlIC1GIG9wdGlvbiBzdGlsbCB3b3JrcyBpbiB2NyBhbmQgb2YKICBjb3Vyc2UgaXQgZGlkbid0Li4uIDotLyBBbnl3YXksIEkgaGFkIHRoZSBwcm9ibGVtcyBJIGNvdWxkIGRpc2NvdmVyCiAgY29ycmVjdGVkLiBBYm91dCBvbmUgbW9udGggb2YgYmV0YSB0ZXN0aW5nIGFuZCBub3QgYSBzaW5nbGUgcGVyc29uIGhhcyB1c2VkCiAgdGhpcyBmZWF0dXJlIHdpdGggdjc/CgotIEJq9nJuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtLXByb2dyZXNzLWJhciBzdGlsbCBkb2Vzbid0IHdvcmsgaW4KICB2Ny4gSG0uCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBUaW0gVGFzc29uaXMgZGlzY292ZXJlZCB0aGF0IGN1cmwgNyBkaWRuJ3QgaGFuZGxlIG5vcm1hbCBodHRwIFBPU1QgYXMgaXQKICBzaG91bGQuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMC42YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgcG9pbnRlZCBvdXQgc2V2ZXJhbCBwcm9ibGVtcyAocmVsYXRlZCB0byB3aW4zMiBjb21waWxpbmcpOgogIGxpYi9zdHJlcXVhbC5jIGhhZCBhIGJhZCAjaWZkZWYgZm9yIG9uZSBvZiB0aGUgc3RyaW5nIGNvbXBhcmlzb25zICh3aW4zMikKICBzcmMvbWFpbi5jIGhhZCBzZXZlcmFsIG1pbm9yIHByb2JsZW1zCiAgbGliL21ha2VmaWxlLm0zMiBoYWQgZ2V0cGFzcy5bY29dIHR3aWNlCiAgc3JjL2NvbmZpZy13aW4zMi5oIGxhY2tlZCB0aGUgSEFWRV9GQ05UTF9IIGRlZmluZQogIGJvdGggY29uZmlnLXdpbjMyLmggZmlsZXMgbm93IG9ubHkgc2V0IHRoZSBIQVZFX1VOSVNURF9IIGRlZmluZSBpZiB0aGUKICBkZWZpbmUgTUlOR1czMiBpcyBzZXQsIGFuZCBJIG1vZGlmaWVkIHNyYy9tYWtlZmlsZS5tMzIgYW5kIGxpYi9tYWtlZmlsZS5tMzIKICB0byBzZXQgaXQuCgpWZXJzaW9uIDcuMC41YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQXBwbGllZCBMdW9uZyBEaW5oIER1bmcncyBjb21tZW50cyBhYm91dCBhIGZldyB3aW4zMiBjb21waWxlIHByb2JsZW1zLgoKLSBBcHBsaWVkIEJq9nJuIFN0ZW5iZXJnJ3Mgc3VnZ2VzdGVkIGZpeCB0aGF0IHR1cm5zIHRoZSB3aW4zMiBzdGRvdXQgdG8KICBiaW5hcnkuIEl0IHdvbid0IGRvIGl0IGlmIHRoZSAtQiAvIC0tdXNlLWFzY2lpIG9wdGlvbiBpcyB1c2VkLiBUaGF0IG9wdGlvbgogIGlzIG5vdyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyAtQiAvLS1mdHAtLWFzY2lpLiBUaGUgZmxhZyB3YXMKICBhbHJlYWR5IGluIHVzZSBiZSB0aGUgbGRhcCBhcyB3ZWxsIHNvIHRoZSBuZXcgbmFtZSBmaXRzIHByZXR0eSBnb29kLiBUaGUKICBsaWJjeXJsIENVUkxPUFRfVFJBTlNGRVJURVhUIHdhcyBhbHNvIGludHJvZHVjZWQgYXMgYW4gYWxpYXMgdG8gdGhlIG5vdwogIG9ic29sZXRlIENVUkxPUFRfRlRQQVNDSUkuIENhbid0IHZlcmlmeSB0aGlzIGZpeCBteXNlbGYgYXMgSSBoYXZlIG5vIHdpbjMyCiAgY29tcGlsZXIgYXJvdW5kLgoKRGFuaWVsICgxMyBKdW5lIDIwMDApCi0gTHVvbmcgRGluaCBEdW5nIDxkdW5nIGF0IHNjaC5ibWUuaHU+IGZvdW5kIGEgcHJvYmxlbSBpbiBjdXJsX2Vhc3lfY2xlYW51cCgpCiAgc2luY2UgaXQgZnJlZSgpZWQgdGhlIG1haW4gY3VybCBzdHJ1Y3QgKnR3aWNlKi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKRGFuaWVsICg5IEp1bmUgMjAwMCkKLSBVcGRhdGVkIHRoZSBSRVNPVVJDRVMgZmlsZSwgYWRkZWQgYSBSRUFETUUud2luMzIgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDApCi0gU28gSSBmaW5hbGx5IGFkZGVkIHRoZSBwcm9ncmVzcyBjYWxsYmFjayB0byB0aGUgKnNldG9wdCgpIG9wdGlvbnMgYW5kIGl0CiAgc2hvdWxkIHdvcmsgbm93LiBJIGRvbid0IGhhdmUgdGhlIGVuZXJneSB0byB3cml0ZSBhbnkgdGVzdCBwcm9ncmFtIGZvciBpdAogIHJpZ2h0IG5vdy4KLSBNYWRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlZGVmcyBwdWJsaWMgaW4gY3VybC9jdXJsLmggZm9yIGNvbWZvcnQuIEp1c3QKICBpbiBjYXNlIGFueW9uZSB3YW5uYSBmaWRkbGUgd2l0aCBzdWNoIHBvaW50ZXJzLgotIFVwZGF0ZWQgdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KClZlcnNpb24gNy4wLjRiZXRhCgpEYW5pZWwgKDIgSnVuZSAyMDAwKQotIEkgbm90aWNlZCB0aGF0IHdoZW4gZG9pbmcgTG9jYXRpb246IGZvbGxvd2luZywgd2UgbG9zdCBjdXN0b20gaGVhZGVycyBpbiBhbGwKICBidXQgdGhlIGZpcnN0IHJlcXVlc3QuCi0gUmVtb3ZlZCB0aGUgJ0h0dHBQb3N0JyBzdHJ1Y3QgYW5kIG1vdmVkIHRoZSBoZWFkZXIgc3R1ZmYgdG8gdGhlIG1vcmUgZ2VuZXJpYwogIGN1cmxfc2xpc3QuCi0gQWRkZWQgc29tZSBiZXR0ZXIgc2xpc3QtY2xlYW51cHMgaW4gc3JjL21haW4uYwoKVmVyc2lvbiA3LjAuM2JldGEKCkRhbmllbCAoMzEgTWF5IDIwMDApCi0gU28gSSBkaXNjb3ZlcmVkIHRoYXQgSSByZWxlYXNlZCB0aGUgNy4wLjJiZXRhIHdpdGhvdXQgaXQgYmVpbmcgYWJsZSB0bwogIGNvbXBpbGUgdW5kZXIgTGludXguIGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKSB0dXJuZWQgb3V0IHRvCiAgZmVhdHVyZSBhIGRpZmZlcmVudCBhbW91bnQgb2YgYXJndW1lbnRzIG9uIGRpZmZlcmVudCBzeXN0ZW1zIHNvIEkgaGFkIHRvIGFkZAogIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGlzIGFuZCBhZGp1c3QgdGhlIGNvZGUgc2xpZ2h0bHkuCgpWZXJzaW9uIDcuMC4yYmV0YQoKRGFuaWVsICgyOSBNYXkgMjAwMCkKLSBDb3JyZWN0ZWQgdGhlIGJpdHMuKiBhc3NpZ25tZW50cyB3aGVuIHVzaW5nIENVUkxPUFQgb3B0aW9ucyB0aGF0IG9ubHkKICB0b2dnbGVzIG9uZSBvZiB0aG9zZSBiaXRzLgoKLSBBcHBsaWVkIHRoZSBodWdlIHBhdGNoZXMgZnJvbSBEYXZpZCBMZUJsYW5jIDxkbGVibGFuYyBhdCBxbnguY29tPiB0aGF0IGFkZAogIHVzYWdlIG9mIHRoZSBnZXRob3N0YnluYW1lX3IoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgaW4gY2FzZSB0aGV5J3JlIGFyb3VuZCwKICBzaW5jZSB0aGF0IG1ha2UgbGliY3VybCBtdWNoIGJldHRlciB0aHJlYWRzYWZlIGluIG1hbnkgc3lzdGVtcyAoc3VjaCBhcwogIHNvbGFyaXMpLiBJIGFkZGVkIHRoZSBjaGVja3MgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KCiAgSSBjYW4ndCBleHBsYWluIHdoeSwgYnV0IHRoZSBpbmV0X250b2FfcigpIGZ1bmN0aW9uIGRpZCBub3QgYXBwZWFyIGluIG15CiAgU29sYXJpcyBpbmNsdWRlIGZpbGVzLCBJIGhhZCB0byBhZGQgbXkgb3duIGluY2x1ZGUgZmlsZSBmb3IgdGhpcyBmb3Igbm93LgoKRGFuaWVsICgyMiBNYXkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgZml4ZXMgdG8gbWFrZSB0aGUgd2luMzIgdmVyc2lvbiBjb21waWxlIHByb3Blcmx5IGFzCiAgd2VsbCBhcyBhIHJlbmFtZSBvZiB0aGUgJ2ludGVyZmFjZScgZmllbGQgaW4gdGhlIHVybGRhdGEgc3RydWN0LCBhcyBpdCBzZWVtcwogIHRvIGJlIHJlc2VydmVkIGluIHNvbWUgZ2NjIHZlcnNpb25zIQoKLSBSaWNoIEdyYXkgc3RydWNrIGJhY2sgd2l0aCB5ZXQgc29tZSBwb3J0YWJpbGl0eSByZXBvcnRzLiBEYXRhIEdlbmVyYWwgREcvVVgKICBuZWVkZWQgYSBsaXR0bGUgZml4IGluIGxpYi9sZGFwLmMgc2luY2UgaXQgZG9lc24ndCBoYXZlIFJUTERfR0xPQkFMIGRlZmluZWQuCiAgTW9yZSBmaXhlcyBhcmUgZXhwZWN0ZWQgYXMgYSByZXN1bHQgb2YgUmljaGllcyB2ZXJ5IGhlbHBmdWwgd29yay4KClZlcnNpb24gNy4wLjFiZXRhCgpEYW5pZWwgKDIxIE1heSAyMDAwKQotIFVwZGF0ZWQgbG90cyBvZiAjZGVmaW5lcywgZW51bXMgYW5kIHZhcmlhYmxlIHR5cGUgbmFtZXMgaW4gdGhlIGxpYnJhcnkuIE5vCiAgbW9yZSB3ZWlyZCBVUkcgb3IgVVJMVEFHIHByZWZpeGVzLiBBbGwgdHlwZXMgYW5kIG5hbWVzIHNob3VsZCBiZSBjdXJsLQogIHByZWZpeGVkIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcy4gVGhlIEZMQUdTLXBhcmFtZXRlciB0byB0aGUgZm9ybWVyCiAgY3VybF91cmxnZXQoKSBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGJ1bmNoIG9mIGZsYWdzIHRvIHVzZSBpbiBzZXBhcmF0ZQogIHNldG9wdCBjYWxscy4gSSdtIHN0aWxsIGZvY3VzaW5nIG9uIHRoZSBlYXN5LWludGVyZmFjZSwgYXMgdGhlIGN1cmwgdG9vbCBpcwogIG5vdyB1c2luZyB0aGF0LgoKLSBCam9ybiBSZWVzZSBoYXMgcHJvdmlkZWQgbWUgd2l0aCBhbiBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlciB0aGF0IEkgcGxhbgogIHRvIHVzZSBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBjdXJsIHRvIGJlIGFibGUgdG8gZ3JhY2VmdWxseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzLgoKVmVyc2lvbiA3LjBiZXRhCgpEYW5pZWwgKDE4IE1heSAyMDAwKQotIEludHJvZHVjZWQgTElCQ1VSTF9WRVJTSU9OX05VTSB0byB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSB0byBiZXR0ZXIgYWxsb3cKICBzb3VyY2UgY29kZXMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBsaWIgdmVyc2lvbi4gVGhpcyBkZWZpbmUgaXMgbm93IHNldCB0bwogIGEgZGV4YWRlY2ltYWwgbnVtYmVyLCB3aXRoIDggYml0cyBlYWNoIGZvciBtYWpvciBudW1iZXIsIG1pbm9yIG51bWJlciBhbmQKICBwYXRjaCBudW1iZXIuIEluIG90aGVyIHdvcmRzLCB2ZXJzaW9uIDEuMi4zIHdvdWxkIG1ha2UgaXQgMHgwMTAyMDMuIEl0IGFsc28KICBtYWtlcyBhIGxhcmdlciBudW1iZXIgYSBuZXdlciB2ZXJzaW9uLgoKRGFuaWVsICgxNyBNYXkgMjAwMCkKLSBNYXJ0aW4gS2FtbWVyaG9mZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHNldmVyYWwgZmxhd3MgaW4gdGhlIEZUUCByYW5nZQogIG9wdGlvbi4gSSBjb3JyZWN0ZWQgdGhlbS4KLSBSZW1vdmVkIHRoZSB3aW4zMiB3aW5zb2NrIGluaXQgY3JhcCBmcm9tIHRoZSBsaWIgdG8gdGhlIHNyYy9tYWluLmMgZmlsZQogIGluIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkLiBUaGV5IGNhbid0IGJlIGluIHRoZSBsaWIsIGVzcGVjaWFsbHkgbm90IGZvcgogIG11bHRpdGhyZWFkZWQgcHVycG9zZXMuCgpEYW5pZWwgKDE2IE1heSAyMDAwKQotIFJld3JvdGUgdGhlIHNyYy9tYWluLmMgc291cmNlIHRvIHVzZSB0aGUgbmV3IGVhc3ktaW50ZXJmYWNlIHRvIGxpYmN1cmwgNy4KICBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIGJ1dCB0aGUgZmlyc3Qgc3RlcCBpcyBub3cgdGFrZW4uCiAgPGN1cmwvZWFzeS5oPiBpcyB0aGUgaW5jbHVkZSBmaWxlIHRvIHVzZS4KCkRhbmllbCAoMTQgTWF5IDIwMDApCi0gRlRQIFVSTHMgYXJlIG5vdyB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudCwgbW9yZSBhY2NvcmRpbmcgdG8gUkZDIDE3MzguCi0gRlRQIHNlc3Npb25zIGFyZSBub3cgcGVyZm9ybWVkIGRpZmZlcmVudGx5LCB3aXRoIENXRCBjb21tYW5kcyB0byBjaGFuZ2UKICBkaXJlY3RvcnkgaW5zdGVhZCBvZiBSRVRSL1NUT1IvTElTVCB3aXRoIHRoZSBmdWxsIHBhdGguIERpc2N1c3Npb25zIHdpdGgKICBSaWNoIEdyYXkgbWFkZSBtZSBub3RpY2UgdGhlc2UgcHJvYmxlbXMuCi0gSmFubmUgSm9oYW5zc29uIGRpc2NvdmVyZWQgYW5kIGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUKICBzcmMvdXNyZ2xvYi5jIGZpbGUuCi0gSSBoYWQgdG8gYWRkIGEgbGliL3N0cmVxdWFsLmMgZmlsZSBmb3IgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJlcyBvbiBhbGwgcGxhdGZvcm1zLgoKRGFuaWVsICg4IE1heSAyMDAwKToKLSBCZWVuIHdvcmtpbmcgbG90cyBvbiB0aGUgbmV3IGxpYi4KLSBUb2dldGhlciB3aXRoIFJpY2ggR3JheSwgSSd2ZSB0cmllZCB0byBhZGp1c3QgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yawogIGJldHRlciBvbiB0aGUgTkNSIE1QLVJBUyBVbml4LgoKRGFuaWVsICgyIE1heSAyMDAwKToKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgSSBoYWQgYSBmZXcgdG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluCiAgY29uZmlndXJlLmluIHRoYXQgZGlkbid0IGRvIGFueSBnb29kLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAwKToKLSBBZGRlZCBhIG5ldyBwYXJhZ3JhcGggdG8gdGhlIEZBUSBhYm91dCB3aGF0IHRvIGRvIHdoZW4gY29uZmlndXJlIGNhbid0CiAgZmluZCBPcGVuU1NMIGV2ZW4gdGhvdWdoIGl0IGlzIGluc3RhbGxlZC4gU3VwcGxpZWQgYnkgQm9iIEFsbGlzb24KCkRhbmllbCAoMTIgQXByaWwgMjAwMCk6Ci0gU3RhcnRlZCBtZXNzaW5nIGFyb3VuZCBiaWctdGltZSB0byBjb252ZXJ0IHRoZSBvbGQgbGlicmFyeSBpbnRlcmZhY2UgdG8gYQogIGJldHRlciBvbmUuLi4KCkRhbmllbCAoOCBBcHJpbCAyMDAwKToKLSBNYWRlIHRoZSBwcm9ncmVzcyBiYXIgbG9vayBiZXR0ZXIgZm9yIGZpbGUgc2l6ZXMgYmV0d2VlbiA5OTk5IGtpbG9ieXRlcwogIGFuZCAxMDAgbWVnYWJ5dGVzLiBUaGV5J3JlIG5vdyBkaXNwbGF5ZWQgWFguWE0uCi0gSSBhbHNvIG5vdGljZWQgdGhhdCBmdHAgZmV0Y2hlcyB0aHJvdWdoIEhUVFAgcHJveGllcyBkaWRuJ3QgYWRkIHRoZSB1c2VyCiAgYWdlbnQgc3RyaW5nLiBJdCBkb2VzIG5vdy4KLSBIYWJpYmllIDxoYWJpYmllIGF0IE1haWxhbmROZXdzLmNvbT4gc3VwcGxpZWQgYSBwcmV0dHkgZ29vZCB3YXkgdG8gYnVpbGQgUlBNcwogIG9uIGEgTGludXggbWFjaGluZS4gSXQgc3RpbGwgYSkgcmVxdWlyZXMgbWUgdG8gYmUgcm9vdCB0byBkbyBpdCwgYikgbGVhdmVzCiAgdGhlIHJwbSBwYWNrYWdlcyBsYXlpbmcgYXQgc29tZSBvZGQgcGxhY2Ugb24gbXkgZGlzayBjKSBkb2Vzbid0IHdvcmsgdG8KICBidWlsZCB0aGUgc3NsIHZlcnNpb24gb2YgY3VybCBzaW5jZSBJIGRpZG4ndCBpbnN0YWxsIG9wZW5zc2wgZnJvbSBhbiBycG0KICBwYWNrYWdlIHNvIG5vdyB0aGUgcnBtIGNyYXAgdGhpbmtzIEkgZG9uJ3QgaGF2ZSBvcGVuc3NsIGFuZCByZWZ1c2VzIHRvIGJ1aWxkCiAgYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBzc2wuLi4gRGlkIEkgbWVudGlvbiBJIGRvbid0IGdldCBhbG9uZyB3aXRoIFJQTT8KLSBPbmNlIGFnYWluIEkgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGFib3V0IGF1dG9jb25mIG5vdCBzZXR0aW5nIC1MIHByaW9yIHRvIC1sCiAgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNoZWNraW5nIGZvciBsaWJzLiBJbiB0aGlzIGNhc2UgaXQgbWFkZSB0aGUgbmF0aXZlCiAgY2MgY29tcGlsZXIgb24gU29sYXJpcyA3IHRvIGZhaWwgdGhlIE9wZW5TU0wgY2hlY2suIFRoaXMgaGFzIHByZXZpb3VzbHkgYmVlbgogIHJlcG9ydGVkIHRvIGNhdXNlIHByb2JsZW1zIG9uIEhQLVVYIGFuZCBpcyBhIGtub3duIGZsYXcgaW4gYXV0b2NvbmYgMi4xMy4gSXQKICBpcyBhIHBpdHkgdGhlcmUncyBubyBuZXdlciByZWxlYXNlIGFyb3VuZC4uLgoKRGFuaWVsICg0IEFwcmlsIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggdHdvIGZpeGVzIHRoYXQKICBhcHBlYXJhbnRseSBtYWtlcyB0aGUgT1MvMiBwb3J0IHdvcmsgYmV0dGVyIHdpdGggbXVsdGlwbGUgVVJMcy4KCkRhbmllbCAoMiBBcHJpbCAyMDAwKToKLSBBbm90aGVyIExvY2F0aW9uOiBmaXguIFRoaXMgdGltZSwgd2hlbiBjdXJsIGNvbm5lY3RlZCB0byBhIHBvcnQgYW5kIHRoZW4KICBmb2xsb3dlZCBhIGxvY2F0aW9uIHdpdGggYW4gYWJzb2x1dGUgVVJMIHRvIGFub3RoZXIgcG9ydCwgaXQgbWlzYmVoYXZlZC4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMCk6Ci0gSC4gRGFwaG5lIEx1b25nIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgd3JvbmdseQogIG1lc3NpbmcgdXAgdGhlIHByb3h5IHN0cmluZyB3aGVuIGZldGNoaW5nIGEgZG9jdW1lbnQgdGhyb3VnaCBhIGh0dHAgcHJveHksCiAgd2hpY2ggc2NyZXdlZCB1cCBtdWx0aXBsZSBmZXRjaGVzIHN1Y2ggYXMgaW4gbG9jYXRpb246IGZvbGxvd2luZ3MuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIGNvcnJlY3RlZCBteSBiYWRseSBhcHBsaWVkIHBhdGNoIGhlCiAgYWN0dWFsbHkgYWxyZWFkeSB0b2xkIG1lIGFib3V0IQoKLSBILiBEYXBobmUgTHVvbmcgYnJvdWdodCBtZSBhIGZpeCB0aGF0IG5vdyBtYWtlcyBjdXJsCiAgaWdub3JlIHNlbGVjdCgpIGVycm9ycyBpbiB0aGUgZG93bmxvYWQgaWYgZXJybm8gaXMgRUlOVFIsIHdoaWNoIHR1cm5zIG91dCB0bwogIGhhcHBlbiBldmVyeSBub3cgYW5kIHRoZW4gd2hlbiB1c2luZyBsaWJjdXJsIG11bHRpLXRocmVhZGVkLi4uCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIGNvdXBsZSBvZiB3aW4zMiBmaXhlcy4gSEFWRV9VTkFNRQogIHdhcyBhY2NpZGVudGFsbHkgI2RlZmluZWQgaW4gY29uZmlnLXdpbjMyLmgsIHdoaWNoIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4uCiAgVGhlIEhBVkVfVU5JU1REX0ggaXMgbm90IGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aCB0aGUgTWFrZWZpbGUudmM2CiAgbWFrZWZpbGUgZm9yIE1TIFZDKysuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIEkgcmVtb3ZlZCB0aGUgQUNfUFJPR19JTlNUQUxMIG1hY3JvIGZyb20gY29uZmlndXJlLmluLCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBvbmUgb2YgdGhlIEFNXyogbWFjcm9zIHNlYXJjaGVzIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwgYWxyZWFkeS4gSmFubmUKICBKb2hhbnNzb24gbWFkZSBtZSBhd2FyZSBvZiB0aGlzLgoKVmVyc2lvbiA2LjUuMgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcXVpY2tseSBwb2ludGVkIG91dCB0byBtZSB0aGF0IDYuNS4xCiAgY3Jhc2hlcyBoYXJkLiBJIHVwbG9hZCA2LjUuMiBub3cgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSEgVGhlIHByb2JsZW0gd2FzCiAgdGhlIC1EIGFkanVzdG1lbnRzIGluIHNyYy9tYWluLmMuCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFub255bW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJzaW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggYSBzZXJpZXMgb2YgcGF0Y2hlcwogIHRoYXQgbm93IGFsbG93cyBjdXJsIHRvIGdldCBjb21waWxlZCBvbiBPUy8yLiBJdCBldmVuIGluY2x1ZGVzIGEgc2VjdGlvbiBpbgogIHRoZSBJTlNUQUxMIGZpbGUuIFZlcnkgbmljZSBqb2IhCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIHBhdGNoIGZvciB0aGUgbGliL01ha2VmaWxlLnZjNgogIGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlIGNvbmZpZy13aW4zMi5oIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQgb3BpbmlvbnMgYWJvdXQgKGF0IGxlYXN0KSB1bmlzdGQuaCdzCiAgZXhpc3RlbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsIGF0IHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCwgQ2hyaXMgPGNiYXlsaXNzIGF0IGNzYy5jb21lPiBhbmQgVWxmCiAgTfZsbGVyIGZyb20gdGhlIG9wZW5zc2wgZGV2ZWxvcG1lbnQgdGVhbSBoZWxwZWQgYnJpbmdpbmcgbWUgdGhlIGRldGFpbHMgZm9yCiAgZml4aW5nIGFuIE9wZW5TU0wgdXNhZ2UgZmxhdy4gSXQgYmVjYW1lIGFwcGFyZW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVycmVkIHRpbWUuIEFuZHJldyA8dG1yIGF0IGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlIG9uIFVsdHJpeC4KCkRhbmllbCAoMjQgRmVicnVhcnkgMjAwMCk6Ci0gQXBwbGllZCBK9nJuIEhhcnRyb3RoJ3MgZml4ZXMgZm9yIGNvbmZpZy13aW4zMi5oIGFuZCBsaWIvTWFrZWZpbGUudzMyLgoKICBJIHNob3VsZCBhbHNvIG1ha2UgYSBub3RlIGhlcmUsIGlmIG5vdGhpbmcgZWxzZSB0byBteXNlbGYsIHRoYXQgd2hlbiB1c2luZwogIHRoZSAlLXN5bnRheCBmb3IgdmFyaWFibGVzIGluIERPUyBjb21tYW5kIHByb21wdHMsIHlvdSBtdXN0IHVzZSB0d28gJS0KICBsZXR0ZXJzIGZvciBlYWNoIG9uZSBzaW5jZSB0aGF0IGlzIGFuIGVzY2FwZSBsZXR0ZXIgdGhlcmUhIE1heWJlIEkgc2hvdWxkCiAgdXNlIGFub3RoZXIgbGV0dGVyIGluc3RlYWQhCgotIEFkZGVkIG1vcmUgdmFyaWFibGVzIHRvIC13OgoKICAnaHR0cF9jb2RlJwogICd0aW1lX25hbWVsb29rdXAnCiAgJ3RpbWVfY29ubmVjdCcKICAndGltZV9wcmV0cmFuc2ZlcicKICAndXJsX2VmZmVjdGl2ZScKCi0gTWFkZSAtd0BmaWxlbmFtZSByZWFkIHRoZSBzeW50YXggZnJvbSBhIGZpbGUgYW5kIC13QC0gcmVhZHMgdGhlIHN5bnRheCBmcm9tCiAgc3RkaW4gaW4gdGhlIGdvb2Qgb2xkICJzdGFuZGFyZCIgY3VybCB3YXkuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDApOgotIFJlbGVhc2VkIGEgNi41cHJlMSB2ZXJzaW9uIHRvIGdldCBzb21lIHRlc3QgYW5kIHVzZXIgZmVlZGJhY2suCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDApOgoKLSBJIGFkZGVkIHRoZSAtdy8tLXdyaXRlLW91dCBmbGFnIGFuZCBzb21lIHZhcmlhYmxlcyB0byBnbyB3aXRoIGl0LiAtdyBpcyBhCiAgc2luZ2xlIHN0cmluZywgd2hhdGV2ZXIgeW91IGVudGVyIHRoZXJlIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2hlbiBjdXJsIGhhcwogIGNvbXBsZXRlZCBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4gVGhlcmUgYXJlIHNvbWUgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyBhbmQKICB0aGV5IGFyZSBzcGVjaWZpZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmx5IHJlYWRzIHRoZSBjb29raWVzIGZyb20gc3RkaW4uCgotIFJlbWluZGVyOiAtRCBzaG91bGQgbm90IHdyaXRlIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLCBpbiB0aGUgc2FtZSB3YXkKICAtbyBkb2VzLiBUaGF0IHdvdWxkIGVuYWJsZSBjdXJsIHRvIHVzZSAtYiBhbmQgLUQgb24gdGhlIHNhbWUgZmlsZS4uLgoKLSBFbGxpcyBQcml0Y2hhcmQgbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIGhlbHBlZCBtZSBvdXQgZmluZGluZyB0aGUgY3Jhc2ggaW4gdGhlCiAgY29va2llIHBhcnNlci4gSGUgYWxzbyBwb2ludGVkIG91dCBjdXJsJ3MgaGFiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgY29ycmVjdGVkIGEgcHJvYmxlbSBpbiBzcmMvdXJsZ2xvYi5jIHRoYXQKICAgcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIGNvbXBpbGVkIG9uIHN1bm9zIDQuIFRoZSBwcm9ibGVtIGhhZCB0byBkbwogICB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHNwcmludGYoKSByZXR1cm4gY29kZSB0eXBlcy4KCiAtIFRyYW5zZmVyKCkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvd25sb2FkIGFuZCB1cGxvYWQgc2ltdWx0YW5lb3VzbHkuIExldCdzCiAgIGRvIHNvbWUgcHJvZ3Jlc3MgbWV0ZXIgZml4ZXMgbGF0ZXIgdGhpcyB3ZWVrLgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDApOgogLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2libGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMKICAgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgYSBmaXggdGhhdCBvbmNlIGFnYWluCiAgIG1hZGUgaXQgcG9zc2libGUgdG8gc2VsZWN0IHByb2dyZXNzIGJhci4KCiAtIEr2cm4gYWxzbyBmaXhlZCBhIGZldyBpbmNsdWRlIHByb2JsZW1zLgoKVmVyc2lvbiA2LjQKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAwKToKIC0gQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBCavZybiBTdGVuYmVyZywgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgpEYW5pZWwgKDI4IERlY2VtYmVyIDE5OTkpOgogLSBUaW0gVmVyaG9ldmVuIGNvcnJlY3RseSBpZGVudGlmaWVkIHRoYXQgY3VybAogICBkb2Vzbid0IHN1cHBvcnQgVVJMIGZvcm1hdHRlZCBmaWxlIG5hbWVzIHdoZW4gZ2V0dGluZyBmdHAuIE5vdywgdGhlcmUncyBhCiAgIHByb2JsZW0gd2l0aCBnZXR0aW5nIHZlcnkgd2VpcmQgZmlsZSBuYW1lcyBvZmYgRlRQIHNlcnZlcnMuIFJGQyA5NTkgZGVmaW5lcwogICB0aGF0IHRoZSBmaWxlIG5hbWUgc3ludGF4IHRvIHVzZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gdGhlIG5hdGl2ZSBPUyBvZgogICB0aGUgc2VydmVyLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBwZWVyIHNlcnZlciBzeXN0ZW0gd2UgY3VycmVudGx5IGp1c3QKICAgdHJhbnNsYXRlIHRoZSBVUkwgc3ludGF4IGludG8gcGxhaW4gbGV0dGVycy4gSXQgaXMgc3RpbGwgYmV0dGVyIGFuZCB3aXRoCiAgIHRoZSBzb2xhcmlzIDIuNi1zdXBwbGllZCBmdHAgc2VydmVyIGl0IHdvcmtzIHdpdGggc3BhY2VzIGluIHRoZSBmaWxlIG5hbWVzLgoKRGFuaWVsICgyNyBEZWNlbWJlciAxOTk5KToKIC0gV2hlbiBjdXJsIHBhcnNlZCBjb29raWVzIHN0cmFpZ2h0IG9mZiBhIHJlbW90ZSBzaXRlLCBpdCBjb3JydXB0ZWQgdGhlIGlucHV0CiAgIGRhdGEsIHdoaWNoLCBpZiB0aGUgZG93bmxvYWRlZCBoZWFkZXJzIHdlcmUgc3RvcmVkIG1hZGUgdmVyeSBvZGQgY2hhcmFjdGVycwogICBpbiB0aGUgc2F2ZWQgZGF0YS4gQ29ycmVjdGx5IGlkZW50aWZpZWQgYW5kIHJlcG9ydGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMTk5OSk6CiAtIEdlbmVyYWwgY2xlYW51cHMgaW4gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLiBUaGVyZSBoYWQgYmVlbiBzb21lIGJhZCBrbHVkZ2VzCiAgIGFkZGVkIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MgYW5kIEkgZGlkIG15IGJlc3QgdG8gY2xlYW4gdGhlbSBvZmYuIEl0IHdhcwogICBib3RoIHJlZ2FyZGluZyB0aGUgbGliIEFQSSBhcyB3ZWxsIGFzIGluY2x1ZGUgZmlsZSBjb25mdXNpb25zLgoKRGFuaWVsICgzIERlY2VtYmVyIDE5OTkpOgogLSBBIHNtYWxsIC0tc3RkZXJyIGJ1ZyB3YXMgcmVwb3J0ZWQgYnkgRWV0dSBPamFuZW4uLi4KCiAtIHdobyBhbHNvIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24gb2YgZXh0ZW5kaW5nIHRoZSAtWCBmbGFnIHRvIGZ0cCBsaXN0IGFzCiAgIHdlbGwuIFNvLCBub3cgaXQgaXMgYW5kIHRoZSBsb25nIG9wdGlvbiBpcyBub3cgLS1yZXF1ZXN0IGluc3RlYWQuIEl0IGlzCiAgIG9ubHkgZm9yIGZ0cCBsaXN0IGZvciBub3cgKGFuZCB0aGUgZm9ybWVyIGh0dHAgc3R1ZmYgdG9vIG9mIGNvdXJzZSkuCgpMYXJzIEouIEFhcyAoMjQgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdGNoZWQgY3VybCB0byBjb21waWxlIGFuZCBidWlsZCB1bmRlciBCZU9TLiBEb2Vzbid0IHdvcmsgeWV0IHRob3VnaCEKCiAtIENvcnJlY3RlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMgdG8gYWxsb3cgcHV0dGluZyBvYmplY3QgZmlsZXMgaW4KICAgZGlmZmVyZW50IGRpcmVjdG9yaWVzIHRoYW4gdGhlIHNvdXJjZXMuCgpWZXJzaW9uIDYuMy4xCgpEYW5pZWwgKDIzIE5vdmVtYmVyIDE5OTkpOgogLSBJJ3ZlIGhhZCB0aGlzIG1ham9yIGRpc2sgY3Jhc2guIE15IGdvb2Qgb2xkIHRydXN0LXdvcnRoeSBzb3VyY2UgZGlzayBkaWVkCiAgIGFsb25nIHdpdGggdGhlIG1hY2hpbmUgdGhhdCBob3N0ZWQgaXQuIFRoYW5rIGdvb2RuZXNzIG1vc3Qgb2YgYWxsIHRoZQogICB0aGluZ3MgSSd2ZSBkb25lIGFyZSBlaXRoZXIgYmFja2VkIHVwIGVsc2V3aGVyZSBvciBzdG9yZWQgaW4gdGhpcyBDVlMKICAgc2VydmVyIQoKIC0gTWljaGFlbCBTLiBTdGV1ZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIC1GIGhhbmRsaW5nCiAgIHRoYXQgbWFkZSBjdXJsIGhhbmcgaWYgeW91IHBvc3RlZCBhbiBlbXB0eSB2YXJpYWJsZSBzdWNoIGFzICctRiBuYW1lPScuIEl0CiAgIHdhcyBvbmUgb2YgdGhvc2Ugb2xkIGJ1Z3MgdGhhdCBuZXZlciBoYXZlIHdvcmtlZCBwcm9wZXJseS4uLgoKIC0gSmFzb24gQmFpZXR0byBwb2ludGVkIG91dCBhIGdlbmVyYWwgZmxhdyBpbiB0aGUgSFRUUAogICBkb3dubG9hZC4gQ3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgaXQgd2FzIHByZW1hdHVyZWx5IGFib3J0ZWQgYmVmb3JlIHRoZQogICBlbnRpcmUgZG93bmxvYWQgd2FzIGNvbXBsZXRlZC4gSXQgZG9lcyBub3cuCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDE5OTkpOgogLSBDaHJpcyBNYWx0YnkgdmVyeSBhY2N1cmF0ZWx5IGNyaXRpY2l6ZWQgdGhlIGxhY2sgb2YKICAgcmV0dXJuIGNvZGUgY2hlY2tzIG9uIHRoZSBmd3JpdGUoKSBjYWxscy4gSSBkaWQgYSB0aG9yb3VnaCBjaGVjayBmb3IgYWxsCiAgIG9jY3VycmVuY2VzIGFuZCBjb3JyZWN0ZWQgdGhpcy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAtbS8tLW1heC10aW1lIG9wdGlvbgogICBkb2Vzbid0IHdvcmsgZm9yIHRoZSBzbG93IHN5c3RlbSBjYWxscyBsaWtlIGdldGhvc3RieW5hbWUoKS4uLiBJIGRvbid0IGhhdmUKICAgYW55IGdvb2QgZml4IHlldCwganVzdCBhIHNsaWdodGx5IGxlc3MgYmFkIG9uZSB0aGF0IG1ha2VzIGN1cmwgZXhpdCBoYXJkCiAgIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSBwb2ludCBvdXQgYSBwb3NzaWJsZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdGhlIHJlYXNvbgogICB3aHkgVGhvbWFzIEh1cnN0IGV4cGVyaWVuY2UgcHJvYmxlbXMgaW4gaGlzIEFtaWdhIHZlcnNpb24uCgogRGFuaWVsICgxMiBOb3ZlbWJlciAxOTk5KToKIC0gSSBmb3VuZCBhIGNyYXNoIGluIHRoZSBuZXcgY29va2llIGZpbGUgcGFyc2VyLiBJdCBjcmFzaGVkIHdoZW4geW91IGdhdmUKICAgYSBwbGFpbiBodHRwIGhlYWRlciBmaWxlIGFzIGlucHV0Li4uCgpWZXJzaW9uIDYuMwoKIERhbmllbCAoMTAgTm92ZW1iZXIgMTk5OSk6CiAtIEkga2luZCBvZiBmb3VuZCBvdXQgdGhhdCB0aGUgSFRUUCB0aW1lLWNvbmRpdGlvbmFsIEdFVHMgKC16KSBhcmVuJ3QgYWx3YXlzCiAgIHJlc3BlY3RlZCBieSB0aGUgd2ViIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50IGlzIHRoZXJlZm9yZSBzZW50IGluIHdob2xlCiAgIGFnYWluLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZGl0aW9uLiBBZnRlciByZWFkaW5nCiAgIHNlY3Rpb24gMTMuMy40IG9mIFJGQyAyNjE2LCBJIHRoaW5rIEknbSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgbm93IHdoZW4gSSBkbwogICBteSBvd24gY2hlY2sgYXMgd2VsbC4gSWYgY3VybCB0aGlua3MgdGhlIGNvbmRpdGlvbiBpc24ndCBtZXQsIHRoZSB0cmFuc2ZlcgogICBpcyBhYm9ydGVkIHByZW1hdHVyZWx5IChhZnRlciBhbGwgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkKS4KCiAtIEFmdGVyIGNvbW1lbnRzIGZyb20gUm9iZXJ0IExpbmRlbiBJIGFsc28gcmV3cm90ZSBzb21lIHBhcnRzIG9mIHRoZSBtYW4gcGFnZQogICB0byBiZXR0ZXIgZGVzY3JpYmUgaG93IHRoZSAtRiB3b3Jrcy4KCiAtIE1pY2hhZWwgQW50aSBwdXQgdXAgYSBuZXcgY3VybCBkb3dubG9hZCBtaXJyb3IgaW4KICAgQ2hpbmE6ICBodHRwOi8vd3d3LnBzaG93aW5nLmNvbS9jdXJsLwoKIC0gSSBhZGRlZCB0aGUgbGlzdCBvZiBkb3dubG9hZCBtaXJyb3JzIHRvIHRoZSBSRUFETUUgZmlsZQoKIC0gSSBkaWQgYWRkIG1vcmUgZXhwbGFuYXRpb25zIHRvIHRoZSBtYW4gcGFnZQoKIERhbmllbCAoOCBOb3ZlbWJlciAxOTk5KToKIC0gSSBtYWRlIHRoZSAtYi8tLWNvb2tpZSBvcHRpb24gY2FwYWJsZSBvZiByZWFkaW5nIG5ldHNjYXBlIGZvcm1hdHRlZCBjb29raWUKICAgZmlsZXMgYXMgd2VsbCBhcyBub3JtYWwgaHR0cC1oZWFkZXIgZmlsZXMuIEl0IHNob3VsZCBiZSBhYmxlIHRvCiAgIHRyYW5zcGFyZW50bHkgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZmlsZSBpdCBnb3QgYXMgaW5wdXQuCgogRGFuaWVsICgyOSBPY3RvYmVyIDE5OTkpOgogLSBBbm90aGVyIG9uZSBvZiBTZWJhc3RpYWFuIHZhbiBFcmsncyBpZGVhcyAodGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlCiAgIGJ1dCBJIHNlZW0gdG8gaGF2ZSBmb3Jnb3R0ZW4gd2hvIGl0IHdhcyksIGlzIHRvIGFkZCBzdXBwb3J0IGZvciByYW5nZXMgaW4KICAgRlRQIGRvd25sb2Fkcy4gQXMgdXN1YWwsIG9uZSByZXF1ZXN0IGlzIGp1c3QgYSByZXF1ZXN0LCB3aGVuIHRoZXkncmUgdHdvCiAgIGl0IGlzIGEgZGVtYW5kLiBJJ3ZlIGFkZGVkIHNpbXBsZSBzdXBwb3J0IGZvciBYLVkgc3R5bGUgZmV0Y2hlcy4gWCBoYXMgdG8KICAgYmUgdGhlIGxvd2VyIG51bWJlciwgdGhvdWdoIHlvdSBtYXkgb21pdCBvbmUgb2YgdGhlIG51bWJlcnMuIFVzZSB0aGUgLXIvCiAgIC0tcmFuZ2Ugc3dpdGNoIChwcmV2aW91c2x5IEhUVFAtb25seSkuCgogLSBTZWJhc3RpYWFuIHZhbiBFcmsgc3VnZ2VzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUKICAgYWJsZSB0byBzaG93IHRoZSBmaWxlIHNpemUgb2YgYSBzcGVjaWZpZWQgZmlsZS4gSSB0aGluayB0aGlzIGlzIGEgc3BsZW5kaWQKICAgaWRlYSBhbmQgdGhlIC1JIGZsYWcgaXMgbm93IHdvcmtpbmcgZm9yIEZUUC4gSXQgZGlzcGxheXMgdGhlIGZpbGUgc2l6ZSBpbgogICB0aGlzIG1hbm5lcjoKICAgICAgICBDb250ZW50LUxlbmd0aDogWFhYWAogICBBcyBpdCByZXNlbWJsZXMgbm9ybWFsIGhlYWRlcnMsIGFuZCBsZWF2ZXMgdXMgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBtb3JlCiAgIGluZm8gaW4gdGhhdCBkaXNwbGF5IGlmIHdlIGNhbiBjb21lIHVwIHdpdGggbW9yZSBpbiB0aGUgZnV0dXJlISBJdCBhbHNvCiAgIG1ha2VzIHNlbnNlIHNpbmNlIGlmIHlvdSBhY2Nlc3MgZnRwIHRocm91Z2ggYSBIVFRQIHByb3h5LCB5b3UnZCBnZXQgdGhlCiAgIGZpbGUgc2l6ZSB0aGUgc2FtZSB3YXkuCgogICBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mIHRoZSBRVU9URSBjb21tYW5kIGV4ZWN1dGlvbnMuIFRoZXkncmUgbm93IGV4ZWN1dGVkCiAgIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luIGFuZCBiZWZvcmUgYW55IG90aGVyIGNvbW1hbmQuIEkgbWFkZSB0aGlzIHRvIGVuYWJsZQogICBxdW90ZSBjb21tYW5kcyB0byBydW4gYmVmb3JlIHRoZSAtSSBzdHVmZiBpcyBkb25lIHRvby4KCiAtIEkgZm91bmQgb3V0IHRoYXQgLUQvLS1kdW1wLWhlYWRlciBhbmQgLVYvLS12ZXJzaW9uIHdlcmVuJ3QgZG9jdW1lbnRlZCBpbgogICB0aGUgbWFuIHBhZ2UuCgogLSBNYW55IEhUVFAvMS4xIHNlcnZlcnMgZG8gbm90IHN1cHBvcnQgcmFuZ2VzLiBEb24ndCBhc2sgbWUgd2h5LiBJIGRpZCBhZGQKICAgc29tZSB0ZXh0IGFib3V0IHRoaXMgaW4gdGhlIG1hbiBwYWdlIGZvciB0aGUgcmFuZ2Ugb3B0aW9uLiBUaGUgdGhyZWFkIGluCiAgIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBzdGFydGVkIHRoaXMgd2FzIGluaXRpYXRlZCBieSBNaWNoYWVsIEFudGkuCgogLSBJIGdldCByZXBvcnRzIGFib3V0IG5yb2ZmIGNyYXNoZXMgb24gc29sYXJpcyAyLjYrIHdoZW4gZGlzcGxheWluZyB0aGUgY3VybAogICBtYW4gcGFnZS4gU3dpdGNoIHRvIGducm9mZiBpbnN0ZWFkLCBpdCBpcyByZXBvcnRlZCB0byB3b3JrKCEpLiBBZGFtIEJhcmNsYXkKICAgcmVwb3J0ZWQgYW5kIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24uCgogLSBJbiBhIGRpYWxvZ3VlIHdpdGggSm9oYW5uZXMgRy4gS3Jpc3RpbnNzb24gd2UgY2FtZQogICB1cCB3aXRoIHRoZSBpZGVhIHRvIGxldCAtSC8tLWhlYWRlciBzcGVjaWZpZWQgaGVhZGVycyByZXBsYWNlIHRoZQogICBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLCBpZiB5b3UgaGFwcGVuZWQgdG8gc2VsZWN0IHRvIGFkZCBhIGhlYWRlcgogICB0aGF0IGN1cmwgbm9ybWFsbHkgdXNlcyBieSBpdHNlbGYuIFRoZSBhZHZhbnRhZ2Ugd2l0aCB0aGlzIGlzIG5vdCBlbnRpcmVseQogICBvYnZpb3VzLCBidXQgaW4gSm9oYW5uZXMnIGNhc2UgaXQgbWVhbnMgdGhhdCBoZSBjYW4gdXNlIGFub3RoZXIgSG9zdDogdGhhbgogICB0aGUgb25lIGN1cmwgd291bGQgc2V0LgoKIERhbmllbCAoMjcgT2N0b2JlciAxOTk5KToKIC0gSm9uZ2tpIFN1d2FuZGkgYnJvdWdodCBhIG5pY2UgcGF0Y2ggZm9yICh5ZXQgYW5vdGhlcikgY3Jhc2ggd2hlbiBmb2xsb3dpbmcKICAgYSBsb2NhdGlvbjouIFRoaXMgdGltZSB5b3UgaGFkIHRvIGZvbGxvdyBhIGh0dHBzOi8vIHNlcnZlcidzIHJlZGlyZWN0IHRvCiAgIGdldCB0aGUgY29yZS4KClZlcnNpb24gNi4yCgogRGFuaWVsICgyMSBPY3RvYmVyIDE5OTkpOgogLSBJIHRoaW5rIEkgbWFuYWdlZCB0byByZW1vdmUgdGhlIHN1c3BpY2lvdXMgKG5pbCkgdGhhdCBoYXMgYmVlbiBzZWVuIGp1c3QKICAgYmVmb3JlIHRoZSAiSG9zdDoiIGluIEhUVFAgcmVxdWVzdHMgd2hlbiAtdiB3YXMgdXNlZC4KIC0gSSBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgZm9sbG93ZWQgYSBsb2NhdGlvbjogd2hlbiB1c2luZyBhIHByb3h5LCB3aXRob3V0CiAgIGhhdmluZyBzcGVjaWZpZWQgaHR0cDovLyBpbiB0aGUgVVJMLCB0aGUgcHJvdG9jb2wgcGFydCB3YXMgYWRkZWQgb25jZSBhZ2FpbgogICB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBVUkwhIChUaGUgcHJvdG9jb2wgcGFydCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlCiAgIFVSTCB3aGVuIGdvaW5nIHRocm91Z2ggYSBwcm94eSBzaW5jZSBpdCBoYXMgbm8gcHJvdG9jb2wtZ3Vlc3Npbmcgc3lzdGVtCiAgIHN1Y2ggYXMgY3VybCBoYXMuKQogLSBCZW5qYW1pbiBSaXRjZXkgcmVwb3J0ZWQgYSBjb3JlIGR1bXAgdW5kZXIgc29sYXJpcyAyLjYKICAgd2l0aCBPcGVuU1NMIDAuOS40LiBJdCB0dXJuZWQgb3V0IHRoaXMgd2FzIGR1ZSB0byBhIGJhZCBmcmVlKCkgaW4gbWFpbi5jCiAgIHRoYXQgb2NjdXJyZWQgYWZ0ZXIgdGhlIGRvd25sb2FkIHdhcyBkb25lIGFuZCBjb21wbGV0ZWQuCiAtIEJlbmphbWluIGZvdW5kIGZ0cCBkb3dubG9hZHMgdG8gc2hvdyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZG93bmxvYWQgbWV0ZXIKICAgdG8gZ2V0IHdyaXR0ZW4gdHdpY2UsIGFuZCBJIHJlbW92ZWQgdGhhdCBwcm9ibGVtLiBJdCB3YXMgaW50cm9kdWNlZCB3aXRoCiAgIHRoZSBtdWx0aXBsZSBVUkwgc3VwcG9ydC4KIC0gRGFuIFppdHRlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIDYuMSBhbmQgZWFybGllciB2ZXJzaW9ucyBkaWRuJ3QKICAgaG9ub3IgUkZDIDI2MTYgY2hhcHRlciA0IHNlY3Rpb24gMiwgIk1lc3NhZ2UgSGVhZGVycyI6ICIuLi5GaWVsZCBuYW1lcyBhcmUKICAgY2FzZS1pbnNlbnNpdGl2ZS4uLiIgIEhUVFAgaGVhZGVyIHBhcnNpbmcgYXNzdW1lZCBhIGNlcnRhaW4gY2FzaW5nLiBEYW4KICAgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgdGhpcywgd2hpY2ggSSB0b29rIHRoZSBsaWJlcnR5CiAgIG9mIGVkaXRpbmcgc2xpZ2h0bHkuCiAtIERhbiBaaXR0ZXIgYWxzbyBwcm92aWRlZCBhIG5pY2UgcGF0Y2ggZm9yIGNvbmZpZy5ndWVzcyB0byBiZXR0ZXIgcmVjb2duaXplCiAgIHRoZSBNYWMgT1MgWAogLSBEYW4gYWxzbyBjb3JyZWN0ZWQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUgdGhhdCBjYXVzZWQgbGlua2luZwogICB0byBmYWlsIG9uIE9TIFguCgogRGFuaWVsICgxOSBPY3RvYmVyIDE5OTkpOgogLSBMZW4gTWFyaW5hY2NpbyBjYW1lIHVwIHdpdGggc29tZSBwcm9ibGVtcyB3aXRoIGN1cmwuICBTaW5jZSBXaW5kb3dzIGhhcyBhCiAgIGNyaXBwbGVkIHNoZWxsLCBpdCBjYW4ndCByZWRpcmVjdCBzdGRlcnIgYW5kIHRoYXQgY2F1c2VzIHRyb3VibGUuIEkgYWRkZWQKICAgLS1zdGRlcnIgdG9kYXkgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHJlZGlyZWN0IHRoZSBzdGRlcnIgc3RyZWFtIHRvIGEKICAgZmlsZSBvciBzdGRvdXQuCgogRGFuaWVsICgxOCBPY3RvYmVyIDE5OTkpOgogLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgdGhlICctLXdpdGhvdXQtc3NsJyBmbGFnLCB3aGljaCBub3cKICAgdG90YWxseSBkaXNhYmxlIFNTTC9odHRwcyBzdXBwb3J0LiBQcmV2aW91c2x5IGl0IHdhc24ndCBwb3NzaWJsZSB0byBmb3JjZQogICB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBsZWF2ZSBTU0wgYWxvbmUuIFRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IGhhcwogICBiZWVuIHJldGFpbmVkLiBUcm95IEVuZ2VsIGhlbHBlZCB0ZXN0IHRoaXMgbmV3IG9uZS4KClZlcnNpb24gNi4xIChPY3RvYmVyIDE3IDE5OTkpCgogRGFuaWVsICgxNyBPY3RvYmVyIDE5OTkpOgogLSBJIGlmZGVmJ2VkIG9yIGNvbW1lbnRlZCBhbGwgdGhlIHpsaWIgc3R1ZmYgaW4gdGhlIHNvdXJjZXMgYW5kIGNvbmZpZ3VyZQogICBzY3JpcHQuIEl0IHR1cm5lZCBvdXQgd2UgbmVlZGVkIHRvIG1vY2sgbW9yZSB3aXRoIHpsaWIgdGhhbiBJIGluaXRpYWxseQogICB0aG91Z2h0LCB0byBtYWtlIGl0IGNhcGFibGUgb2YgZG93bmxvYWRpbmcgY29tcHJlc3NlZCBIVFRQIGRvY3VtZW50cyBhbmQKICAgdW5jb21wcmVzcyB0aGVtIG9uIHRoZSBmbHkuIEkgZGlkbid0IG1lYW4gdGhlIHpsaWIgcGFydHMgb2YgY3VybCB0byBiZWNvbWUKICAgbW9yZSB0aGFuIG1pbm9yIHNvIHRoaXMgbWVhbnMgSSBoYWx0IHRoZSB6bGliIGV4cGVkaXRpb24gZm9yIG5vdyBhbmQgd2FpdAogICB1bnRpbCBzb21lb25lIGVpdGhlciB3cml0ZXMgdGhlIGNvZGUgb3IgemxpYiBnZXRzIHVwZGF0ZWQgYW5kIGJldHRlcgogICBhZGp1c3RlZCBmb3IgdGhpcyBraW5kIG9mIHVzYWdlLiAgSSB3b24ndCBnZXQgaW50byBkZXRhaWxzIGhlcmUsIGJ1dCBhCiAgIHNob3J0IGEgc3VtbWFyeSBpcyBzdWl0YWJsZToKICAgLSB6bGliIGNhbid0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdG8gdXNlIHpsaWIgb3IgZ3ppcAogICAgIGRlY29tcHJlc3Npb24gbWV0aG9kcy4KICAgLSB6bGliIGlzIHZlcnkgbmVhdCBmb3IgcmVhZGluZyBnemlwcGVkIGZpbGVzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsCiAgICAgYWx0aG91Z2ggbm90IGFzIG5pY2UgZm9yIHJlYWRpbmcgYnVmZmVyLWJhc2VkIGRhdGEgc3VjaCBhcyB3ZSB3b3VsZAogICAgIHdhbnQgaXQuCiAgIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgd2luMzIgdmVyc2lvbiB3aGVuIHJlYWRpbmcgZnJvbQogICAgIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHRoYXQgaXMgYSBzb2NrZXQKCiBEYW5pZWwgKDE0IE9jdG9iZXIgMTk5OSk6CiAtIE1vdmVkIHRoZSAoZXh0ZXJuYWwpIGluY2x1ZGUgZmlsZXMgZm9yIGxpYmN1cmwgaW50byBhIHN1YmRpcmVjdG9yeSBuYW1lZAogICBjdXJsIGFuZCBhZGp1c3RlZCBhbGwgI2luY2x1ZGUgbGluZXMgdG8gdXNlIDxjdXJsL1hYWFg+IHRvIG1haW50YWluIGEKICAgYmV0dGVyIG5hbWUgc3BhY2UgYW5kIGNvbnRyb2wgb2YgdGhlIGhlYWRlcnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLgoKIERhbmllbCAoMTIgT2N0b2JlciAxOTk5KToKIC0gSSBtb2RpZmllZCB0aGUgJ21ha2V0Z3onIHNjcmlwdCB0byBwZXJmb3JtIGEgJ21ha2UnIHRvbyBiZWZvcmUgYSByZWxlYXNlCiAgIGFyY2hpdmUgaXMgcHV0IHRvZ2V0aGVyIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgdGltZSBzdGFtcHMgYmV0dGVyIGFuZAogICBob3BlZnVsbHkgYXZvaWQgdGhlIGRvdWJsZSBjb25maWd1cmUtcnVubmluZyB0aGF0IHVzZSB0byBvY2N1ci4KCiBEYW5pZWwgKDExIE9jdG9iZXIgMTk5OSk6CiAtIEFwcGxpZWQgSvZybidzIHBhdGNoZXMgdGhhdCBmaXhlcyB6bGliIGZvciBtaW5ndzMyIGNvbXBpbGVzIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBtaXNzaW5nIHpsaWIgI2lmZGVmIGFuZCBtb3JlIHRleHQgb24gdGhlIG11bHRpcGxlIFVSTCBkb2NzIGluCiAgIHRoZSBtYW4gcGFnZS4KClZlcnNpb24gNi4xYmV0YQoKIERhbmllbCAoNiBPY3RvYmVyIDE5OTkpOgogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBzZW50IG1lIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzIEkKICAganVzdCBtYWRlOiB0aGUgLWQgc3dpdGNoIGlzIG5vdyBjYXBhYmxlIG9mIHJlYWRpbmcgcG9zdCBkYXRhIGZyb20gYSBuYW1lZAogICBmaWxlIG9yIHN0ZGluLiAgVXNlIGl0IHNpbWlsYXJseSB0byB0aGUgLUYuIFRvIHJlYWQgdGhlIHBvc3QgZGF0YSBmcm9tIGEKICAgZ2l2ZW4gZmlsZToKCiAgICAgICAgY3VybCAtZCBAcGF0aC90by9maWxlbmFtZSB3d3cucG9zdHNpdGUuY29tCgogICBvciBsZXQgY3VybCByZWFkIGl0IG91dCBmcm9tIHN0ZGluOgoKICAgICAgICBjdXJsIC1kIEAtIHd3dy5wb3N0aXQuY29tCgogSvZybiBIYXJ0cm90aCAoMyBPY3RvYmVyIDE5OTkpOgogLSBCcm91Z2h0IHNvbWUgbW9yZSBwYXRjaGVzIGZvciBtdWx0aXBsZSBVUkwgZnVuY3Rpb25hbGl0eS4gVGhlIE1JTUUKICAgc2VwYXJhdGlvbiBpZGVhcyBhcmUgYWxtb3N0IHNjcmFwcGVkIG5vdywgYW5kIGEgY3VzdG9tIHNlcGFyYXRvciBpcyBiZWluZwogICB1c2VkIGluc3RlYWQuIFRoaXMgaXMgc3RpbGwgY29tcGlsZS10aW1lICJmbGFnZ2VkIi4KCiBEYW5pZWwKIC0gVXBkYXRlZCBjdXJsLjEgd2l0aCBtdWx0aXBsZSBVUkwgaW5mby4KCiBEYW5pZWwgKDMwIFNlcHRlbWJlciAxOTk5KToKIC0gRmVsaXggdm9uIExlaXRuZXIgYnJvdWdodCBvcGVuc3NsLWNoZWNrIGZpeGVzIGZvciBjb25maWd1cmUuaW4gdG8gd29yawogICBvdXQtb2YtdGhlLWJveCB3aGVuIHRoZSBvcGVuc3NsIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBkZWZhdWx0CiAgIGRpcnMuCgogRGFuaWVsICgyOCBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgbGlieiBmdW5jdGlvbmFsaXR5LiBUaGlzIHNob3VsZCBlbmFibGUgZGVjb21wcmVzc2luZyBnemlwLCBjb21wcmVzcwogICBvciBkZWZsYXRlIGVuY29kaW5nIEhUVFAgZG9jdW1lbnRzLiBJdCBhbHNvIG1ha2VzIGN1cmwgc2VuZCBhbiBhY2NlcHQgdGhhdAogICBpdCBhY2NlcHRzIHRoYXQga2luZCBvZiBlbmNvZGluZy4gQ29tcHJlc3NlZCBjb250ZW50cyB1c3VhbGx5IHNob3J0ZW5zCiAgIGRvd25sb2FkIHRpbWUuIEkgKm5lZWQqIHNvbWVvbmUgdG8gdGVsbCBtZSBhIHNpdGUgdGhhdCB1c2VzIGNvbXByZXNzZWQgSFRUUAogICBkb2N1bWVudHMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoaXMgb3V0IHByb3Blcmx5LgoKIC0gQXMgYSByZXN1bHQgb2YgdGhlIGFkZGluZyBvZiB6bGliIGF3YXJlbmVzcywgSSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHN0cmluZwogICBhIGxpdHRsZS4gSSBwbGFuIHRvIGFkZCBvcGVubGRhcCB2ZXJzaW9uIHJlcG9ydGluZyBpbiB0aGVyZSB0b28uCgogRGFuaWVsICgxNyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSB0aGUgLUYgb3B0aW9uIGFsbG93IHN0ZGluIHdoZW4gc3BlY2lmeWluZyBmaWxlcy4gQnkgdXNpbmcgJy0nIGluc3RlYWQKICAgb2YgZmlsZSBuYW1lLCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbi4KClZlcnNpb24gNi4wIChTZXB0ZW1iZXIgMTQgMTk5OSkKCiBEYW5pZWwgKDEzIFNlcHRlbWJlciAxOTk5KQogLSBBZGRlZCAtWC8tLWh0dHAtcmVxdWVzdCA8cmVxdWVzdD4gdG8gZW5hYmxlIGFueSBIVFRQIGNvbW1hbmQgdG8gYmUgc2VudC4KICAgRG8gbm90IHRoYXQgeW91ciBzZXJ2ZXIgaGFzIHRvIHN1cHBvcnQgdGhlIGV4YWN0IHN0cmluZyB5b3UgZW50ZXIuIFRoaXMKICAgc2hvdWxkIHBvc3NpYmx5IGEgc3RyaW5nIGxpa2UgREVMRVRFIG9yIFRSQUNFLgoKIC0gQXBwbGllZCBEb3VnbGFzJyBtaW5ndzMyLWZpeGVzIGZvciB0aGUgbWFrZWZpbGVzLgoKIERhbmllbCAoMTAgU2VwdGVtYmVyIDE5OTkpCiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIHBvaW50ZWQgb3V0IGEgcHJvYmxlbS4gQ3VybCBkaWRuJ3QgY2hlY2sgdGhlIEZUUAogICBzZXJ2ZXJzIHJldHVybiBjb2RlIHByb3Blcmx5IGFmdGVyIHRoZSAtLXF1b3RlIGNvbW1hbmRzIHdlcmUgaXNzdWVkLiBJdAogICB0b29rIGFueXRoaW5nIG5vbiAyMDAgYXMgYW4gZXJyb3IsIHdoZW4gYWxsIDJYWCBjb2RlcyBzaG91bGQgYmUgYWNjZXB0ZWQgYXMKICAgT0suCgogLSBTZW5kaW5nIGNvb2tpZXMgdG8gdGhlIHNhbWUgc2l0ZSBpbiBtdWx0aXBsZSBsaW5lcyBsaWtlIGN1cmwgdXNlZCB0byBkbwogICB0dXJuZWQgb3V0IHRvIGJlIGJhZCBhbmQgYnJlYWtpbmcgdGhlIGNvb2tpZSBzcGVjcy4gQ3VybCBub3cgc2VuZHMgYWxsCiAgIGNvb2tpZXMgb24gYSBzaW5nbGUgQ29va2llOiBsaW5lLiBDdXJsIGlzIG5vdCB5ZXQgUkZDIDIxMDkgY29tcGxpYW50LCBidXQgSQogICBkb3VidCB0aGF0IG1hbnkgc2VydmVycyBkbyB1c2UgdGhhdCBzeW50YXggKHlldCkuCgogRGFuaWVsICg4IFNlcHRlbWJlciAxOTk5KQogLSBK9nJuIGhlbHBlZCBtZSBtYWtlIHN1cmUgaXQgc3RpbGwgY29tcGlsZXMgbmljZWx5IHdpdGggbWluZ3czMiB1bmRlciB3aW4zMi4KCiBEYW5pZWwgKDcgU2VwdGVtYmVyIDE5OTkpCiAtIEZUUCB1cGxvYWQgdGhyb3VnaCBwcm94eSBpcyBub3cgdHVybmVkIGludG8gYSBIVFRQIFBVVC4gUmVxdWVzdGVkIGJ5CiAgIFN0ZWZhbiBLYW50aGFrLgoKIC0gQWRkZWQgdGhlIGxkYXAgZmlsZXMgdG8gdGhlIC5tMzIgbWFrZWZpbGUuCgogRGFuaWVsICgzIFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIGNvb2tpZSBtYXRjaGluZyB3b3JrIHdoaWxlIHVzaW5nIEhUVFAgcHJveHkuCgogQmpvcm4gUmVlc2UgKDMxIEF1Z3VzdCAxOTk5KQogLSBQYXNzZWQgaGlzIGxkYXA6Ly8gcGF0Y2guIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBvcGVubGRhcCBzaGFyZWQKICAgbGlicmFyeSB0byBiZSBpbnN0YWxsZWQgYW5kIHRoYXQgTERfTElCUkFSWV9QQVRIIHBvaW50cyB0byB0aGUKICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWIgd2lsbCBiZSBmb3VuZCB3aGVuIGN1cmwgaXMgcnVuIHdpdGggYQogICBsZGFwOi8vIFVSTC4KCiBK9nJuIEhhcnRyb3RoICgzMSBBdWd1c3QgMTk5OSkKIC0gTWFkZSB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW50byBzaW5nbGUgZmlsZXMuCiAtIE1hZGUgZmlsZTovLyB3b3JrIGZvciBXaW4zMi4gVGhlIHNhbWUgY29kZSBpcyBub3cgdXNlZCBmb3IgdW5peCBhcyB3ZWxsIGZvcgogICBwZXJmb3JtYW5jZSByZWFzb25zLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkICgzMCBBdWd1c3QgMTk5OSkKIC0gUGF0Y2hlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgZm9yIFNTTCBidWlsZHMuCgogTWF0dGhldyBDbGFya2UgKDMwIEF1Z3VzdCAxOTk5KQogLSBNYWRlIGEgY29vbCBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRvIGFsbG93IC0td2l0aC1zc2wgdG8gc3BlY2lmeSB0aGUKICAgcm9vdCBkaXIgb2YgdGhlIG9wZW5zc2wgaW5zdGFsbGF0aW9uLCBhcyBpbgoKICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtc3NsPS91c3Ivc3NsX2hlcmUKCiAtIENvcnJlY3RlZCB0aGUgJ3JlY29uZicgc2NyaXB0IHRvIHdvcmsgYmV0dGVyIHdpdGggc29tZSBzaGVsbHMuCgogSvZybiBIYXJ0cm90aCAoMjYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbiBsaWIvIGFuZCBjb3JyZWN0ZWQgdGhlIGZpbGUuYyBmb3Igd2luMzIKICAgY29tcGlsZXMuCgpWZXJzaW9uIDUuMTEKCiBEYW5pZWwgKDI1IEF1Z3VzdCAxOTk5KQogLSBKb2huIFdlaXNtaWxsZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIGhlYWRlci1saW5lCiAgIHJlYWxsb2MoKSBzeXN0ZW0gaW4gZG93bmxvYWQuYy4KCiAtIEkgYWRkZWQgbGliL2ZpbGUuW2NoXSB0byBvZmZlciBhIGZpcnN0LCBzaW1wbGUsIGZpbGU6Ly8gc3VwcG9ydC4gSXQKICAgcHJvYmFibHkgd29uJ3QgZG8gbXVjaCBnb29kIG9uIHdpbjMyIHN5c3RlbSBhdCB0aGlzIHBvaW50LCBidXQgSSBzZWUgaXQKICAgYXMgYSBzdGFydC4KCiAtIE1hZGUgdGhlIHJlbGVhc2UgYXJjaGl2ZXMgZ2V0IGEgTWFrZWZpbGUgaW4gdGhlIHJvb3QgZGlyLCB3aGljaCBjYW4gYmUKICAgdXNlZCB0byBzdGFydCB0aGUgY29tcGlsaW5nL2J1aWxkaW5nIHByb2Nlc3MgZWFzaWVyLiBJIGhhdmVuJ3QgcmVhbGx5CiAgIGNoYW5nZWQgYW55IElOU1RBTEwgdGV4dCB5ZXQsIEkgd2FudGVkIHRvIGdldCBzb21lIGZlZWQtYmFjayBvbiB0aGlzCiAgIGZpcnN0LgoKIERhbmllbCAoMTcgQXVndXN0IDE5OTkpCiAtIEFub3RoZXIgTG9jYXRpb246IGJ1Zy4gQ3VybCBkaWRuJ3QgZG8gcHJvcGVyIHJlbGF0aXZlIGxvY2F0aW9ucyBpZiB0aGUKICAgb3JpZ2luYWwgVVJMIGhhZCBjZ2ktcGFyYW1ldGVycyB0aGF0IGNvbnRhaW5lZCBhIHNsYXNoLiBOdXN1J3MgcGFnZQogICBhZ2Fpbi4KCiAtIENvcnJlY3RlZCB0aGUgTk9fUFJPWFkgdXNhZ2UuIEl0IGlzIGEgbGlzdCBvZiBzdWJzdHJpbmdzIHRoYXQgaWYgb25lIG9mCiAgIHRoZW0gbWF0Y2hlcyB0aGUgdGFpbCBvZiB0aGUgaG9zdCBuYW1lIGl0IHNob3VsZCBjb25uZWN0IHRvLCBjdXJsIHNob3VsZAogICBub3QgdXNlIGEgcHJveHkgdG8gY29ubmVjdCB0aGVyZS4gUG9pbnRlZCBvdXQgdG8gbWUgYnkgRG91Z2xhcwogICBFLiBXZWdzY2hlaWQuICBJIGFsc28gY2hhbmdlZCB0aGUgUkVBRE1FIHRleHQgYSBsaXR0bGUgcmVnYXJkaW5nIHRoaXMuCgogRGFuaWVsICgxNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgYSBtZW1vcnkgYnVnIHdpdGggaHR0cC1zZXJ2ZXJzIHRoYXQgc2VudCBMb2NhdGlvbjogdG8gYSBMb2NhdGlvbjoKICAgcGFnZS4gTnVzdSdzIHBhZ2Ugc2hvd2VkIHRoaXMgdG9vLgoKIC0gTWFkZSBjb29raWVzIHdvcmsgYSBsb3QgYmV0dGVyLiBTZXR0aW5nIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHNldmVyYWwgdGltZXMKICAgdXNlZCB0byBhZGQgbW9yZSBjb29raWVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZSBmb3JtZXIgb25lIHdoaWNoIGl0CiAgIHNob3VsZCd2ZS4gTnVzdSA8bnVzIGF0IGludGVyZ29yai5ybz4gYnJvdWdodCBtZSBhbiBVUkwgdGhhdCBtYWRlIHRoaXMKICAgcGFpbmZ1bGx5IHZpc2libGUuLi4KCiBUcm95ICgxNSBBdWd1c3QgMTk5OSkKIC0gQnJvdWdodCBuZXcgLnNwZWMgZmlsZXMgYXMgd2VsbCBhcyBhIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdGhhdCBsZXRzIHRoZQogICBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgZmlsZXMgYmV0dGVyLCBldmVuIHdoZW4gdGhlIGluY2x1ZGUKICAgZmlsZXMgYXJlIGluIC91c3IvaW5jbHVkZS9vcGVuc3NsCgpWZXJzaW9uIDUuMTAKCiBEYW5pZWwgKDEzIEF1Z3VzdCAxOTk5KQogLSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYigpIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSAwLjkuNCB2ZXJzaW9uIG9mCiAgIE9wZW5TU0wuIE5vdyB3aHkgY291bGRuJ3QgdGhleSBzaW1wbHkgYWRkIGEgKm5ldyogZnVuY3Rpb24gaW5zdGVhZCBvZgogICBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBmdW5jdGlvbj8gVGhpcyB3YXksIHdlIGdldAogICBhIGNvbXBpbGVyIHdhcm5pbmcgaWYgY29tcGlsaW5nIHdpdGggMC45LjQgYnV0IG5vdCB3aXRoIGVhcmxpZXIuIFNvLCBJIGhhZAogICB0byBjb21lIHVwIHdpdGggYSAjaWYgY29uc3RydWN0aW9uIHRoYXQgZGVhbHMgd2l0aCB0aGlzLi4uCgogLSBNYWRlIGN1cmwgb3V0cHV0IHRoZSBTU0wgdmVyc2lvbiBudW1iZXIgZ2V0IGRpc3BsYXllZCBwcm9wZXJseSB3aXRoIDAuOS40LgoKIFRyb3kgKDEyIEF1Z3VzdCAxOTk5KQogLSBBZGRlZCBNaW5nVzMyIChHQ0MtMi45NSkgc3VwcG9ydCB1bmRlciBXaW4zMi4gVGhlIElOU1RBTEwgZmlsZSB3YXMgYWxzbwogICBhIGJpdCByZWFycmFuZ2VkLgoKIERhbmllbCAoMTIgQXVndXN0IDE5OTkpCiAtIEkgaGFkIHRvIGNvcHkgYSBnb29kIDxhcnBhL3RlbG5ldC5oPiBpbmNsdWRlIGZpbGUgaW50byB0aGUgY3VybCBzb3VyY2UKICAgdHJlZSB0byBlbmFibGUgdGhlIHNpbGx5IHdpbjMyIHN5c3RlbXMgdG8gY29tcGlsZS4gVGhlIGRpc3RyaWJ1dGlvbiByaWdodHMKICAgYWxsb3dzIHVzIHRvIGRvIHRoYXQgYXMgbG9uZyBhcyB0aGUgZmlsZSByZW1haW5zIHVubW9kaWZpZWQuCgogLSBJIGNvcnJlY3RlZCBhIGZldyBtaW5vciB0aGluZ3MgdGhhdCBtYWRlIHRoZSBjb21waWxlciBjb21wbGFpbiB3aGVuCiAgIC1XYWxsIC1wZWRhbnRpYyB3YXMgdXNlZC4KCiAtIEknbSBtb3ZpbmcgdGhlIG9mZmljaWFsIGN1cmwgd2ViIHBhZ2UgdG8gaHR0cDovL2N1cmwuaGF4eC5udS4gSSB0aGluayBpdAogICB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHJlbWVtYmVyIGFzIGl0IGlzIGEgbG90IHNob3J0ZXIgYW5kIGxlc3MgY3J5cHRpYy4KICAgVGhlIG9sZCBvbmUgc3RpbGwgd29ya3MgYW5kIHNob3dzIHRoZSBzYW1lIGluZm8uCgogRGFuaWVsICgxMSBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWlsZWQgbWUgYW5vdGhlciBjb3JyZWN0aW9uIGZvciBOUk9GRiBpbiB0aGUKICAgY29uZmlndXJlLmluIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYmV0dGVyIGZvciBJUklYIHVzZXJzLgoKIERhbmllbCAoMTAgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgaGVscGVkIG1lIHdpdGggc29tZSBzdHVwaWQgTWFrZWZpbGUgdGhpbmdzLCBhcyB3ZWxsIGFzCiAgIHNvbWUgZmlkZGxpbmcgd2l0aCB0aGUgZ2V0ZGF0ZS5jIHN0dWZmIHRoYXQgaGUgaGFkIHByb2JsZW1zIHdpdGggdW5kZXIKICAgSFAtVVggdjEwLiBnZXRkYXRlLnkgd2lsbCBub3cgYmUgY29tcGlsZWQgaW50byBnZXRkYXRlLmMgaWYgdGhlIGFwcHJvcHJpYXRlCiAgIHlhY2Mgb3IgYmlzb24gaXMgZm91bmQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFNpbmNlIHRoaXMgaXMgc2xpZ2h0bHkgbmV3LAogICB3ZSBuZWVkIHRvIHRlc3QgdGhlIG91dHB1dCBnZXRkYXRlLmMgd2l0aCB3aW4zMiBzeXN0ZW1zIHRvIG1ha2Ugc3VyZSBpdAogICBzdGlsbCBjb21waWxlcyB0aGVyZS4KCiBEYW5pZWwgKDUgQXVndXN0IDE5OTkpCiAtIEkndmUganVzdCBzZXR1cCBhIG5ldyBtYWlsaW5nIGxpc3Qgd2l0aCB0aGUgaW50ZW50aW9uIHRvIGtlZXAgZGlzY3Vzc2lvbnMKICAgYXJvdW5kIGxpYmN1cmwgZGV2ZWxvcG1lbnQgaW4gaXQuIEkgbWFpbmx5IGV4cGVjdCBpdCB0byBiZSBmb3IgdGhvdWdodHMgYW5kCiAgIGJyYWluc3Rvcm1pbmcgYXJvdW5kIGEgIm5leHQgZ2VuZXJhdGlvbiIgbGlicmFyeSwgcmF0aGVyIHRoYW4gbml0cGlja2luZwogICBhYm91dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvciBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCgogICBUbyBqb2luIG91ciBoYXBweSBidW5jaCBvZiBmdXR1cmUtbG9va2luZyBnZWVrcywgZW50ZXIgJ3N1YnNjcmliZQogICA8YWRkcmVzcz4nIGluIHRoZSBib2R5IG9mIGEgbWFpbCBhbmQgc2VuZCBpdCB0bwogICBsaWJjdXJsLXJlcXVlc3RAbGlzdHNlcnYuZnRzLmZyb250ZWMuc2UuICBDdXJsIGJ1ZyByZXBvcnRzLCB0aGUgdXN1YWwgY3VybAogICB0YWxrIGFuZCBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIHN0aWxsIGJlIGtlcHQgaW4gdGhpcyBtYWlsaW5nIGxpc3QuIEkndmUKICAgc3RhcnRlZCB0byBhcmNoaXZlIHRoaXMgbWFpbGluZyBsaXN0IGFuZCBoYXZlIHB1dCB0aGUgbGliY3VybCB3ZWIgcGFnZSBhdAogICB3d3cuZnRzLmZyb250ZWMuc2UvfmRhc3QvbGliY3VybC8uCgogLSBTdGVmYW4gS2FudGhhayBjb250YWN0ZWQgbWUgcmVnYXJkaW5nIGEgZmV3IHByb2JsZW1zIGluIHRoZSBjb25maWd1cmUKICAgc2NyaXB0IHdoaWNoIGhlIGRpc2NvdmVyZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyCiAgIFNpZW1lbnMgU0lOSVgtWiBWNS40MkIyMDA0IQoKIC0gTWFyY3VzIEtsZWluIHZlcnkgYWNjdXJhdGVseSBpbmZvcm1lZCBtZSB0aGF0IHNyYy92ZXJzaW9uLmggd2FzIG5vdCBwcmVzZW50CiAgIGluIHRoZSBDVlMgcmVwb3NpdG9yeS4gT2gsIGhvdyBzaWxseS4uLgoKIC0gTGludXMgTmllbHNlbiByZXdyb3RlIHRoZSB0ZWxuZXQ6Ly8gcGFydCBhbmQgbm93IGN1cmwgb2ZmZXJzIGxpbWl0ZWQgdGVsbmV0CiAgIHN1cHBvcnQuIElmIHlvdSBydW4gY3VybCBsaWtlICdjdXJsIHRlbG5ldDovL2hvc3QnIHlvdSdsbCBnZXQgYWxsIG91dHB1dCBvbgogICB0aGUgc2NyZWVuIGFuZCBjdXJsIHdpbGwgcmVhZCBpbnB1dCBmcm9tIHN0ZGluLiBZb3UnbGwgYmUgYWJsZSB0byBsb2dpbiBhbmQKICAgcnVuIGNvbW1hbmRzIGV0YywgYnV0IHNpbmNlIHRoZSBvdXRwdXQgaXMgYnVmZmVyZWQsIGV4cGVjdCB0byBnZXQgYSBsaXR0bGUKICAgd2VpcmQgb3V0cHV0LgoKICAgVGhpcyBpcyBzdGlsbCBpbiBpdHMgaW5mYW5jeSBhbmQgaXQgbWlnaHQgZ2V0IGNoYW5nZWQuIFdlIG5lZWQgeW91cgogICBmZWVkLWJhY2sgYW5kIGlucHV0IGluIGhvdyB0aGlzIGlzIGJlc3QgZG9uZS4KCiAgIFdJTjMyIE5PVEU6IEkgYmV0IHdlJ2xsIGdldCBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSBjdXJyZW50CiAgIGxpYi90ZWxuZXQuYyBvbiB3aW4zMiwgYnV0IEkgdGhpbmsgd2UgY2FuIHNvcnQgdGhlbSBvdXQgaW4gdGltZS4KCiAtIERhdmlkIFNhbmRlcnNvbiByZXBvcnRlZCB0aGF0IEZPUkNFX0FMTE9DQV9IIG9yIEhBVkVfQUxMT0NBX0ggbXVzdCBiZQogICBkZWZpbmVkIGZvciBnZXRkYXRlLmMgdG8gY29tcGlsZSBwcm9wZXJseSBvbiBIUC1VWCAxMS4wLiBJIHVwZGF0ZWQgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGFsbG9jYS5oIHdoaWNoIHNob3VsZCBtYWtlIGl0LgoKIERhbmllbCAoNCBBdWd1c3QgMTk5OSkKIC0gSSBmaW5hbGx5IGdvdCB0byB1bmRlcnN0YW5kIE1hcmN1cyBLbGVpbidzIGZ0cCBkb3dubG9hZCByZXN1bWUgcHJvYmxlbSwKICAgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGR1ZSB0byBkaWZmZXJlbnQgb3V0cHV0cyBmcm9tIGRpZmZlcmVudCBmdHAKICAgc2VydmVycy4gSXQgbWFrZXMgZnRwIGRvd25sb2FkIHJlc3VtaW5nIGEgbGl0dGxlIHRyaWNraWVyLCBidXQgSSd2ZSBtYWRlCiAgIHNvbWUgbW9kaWZpY2F0aW9ucyBJIHJlYWxseSBiZWxpZXZlIHdpbGwgd29yayBmb3IgbW9zdCBmdHAgc2VydmVycyBhbmQgSSBkbwogICBob3BlIHlvdSByZXBvcnQgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGlzIQoKIC0gQWRkZWQgdGV4dCBhYm91dCBmaWxlIHRyYW5zZmVyIHJlc3VtaW5nIHRvIFJFQURNRS5jdXJsLgoKIERhbmllbCAoMiBBdWd1c3QgMTk5OSkKIC0gQXBwbGllZCBhIHByb2dyZXNzLWJhciBwYXRjaCBmcm9tIExhcnMgSi4gQWFzLiBJdCBvZmZlcnMKICAgYSBuZXcgc3R5bGVkIHByb2dyZXNzIGJhciBlbmFibGVkIHdpdGggLSMvLS1wcm9ncmVzcy1iYXIuCgogVC4gWWFtYWRhIDx0YWkgYXQgaW1hc3kub3IuanA+ICgzMCBKdWx5IDE5OTkpCiAtIEl0IGJyZWFrcyB3aXRoIHNlZ2ZhdWx0IHdoZW4gMSkgY3VybCBpcyB1c2luZyAubmV0cmMgdG8gb2J0YWluCiAgIHVzZXJuYW1lL3Bhc3N3b3JkIChvcHRpb24gJy1uJyksIGFuZCAyKSBpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQgdG8KICAgYW5vdGhlciBsb2NhdGlvbiAob3B0aW9uICctTCcpLgoKICAgVGhlcmUgaXMgYSBzbWFsbCBidWcgaW4gbGliL3VybC5jIChibG9jayBzdGFydGluZyBmcm9tIGxpbmUgNjQxKSwgd2hpY2gKICAgdHJpZXMgdG8gdGFrZSBvdXQgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB1c2VyLSBzdXBwbGllZCBjb21tYW5kLWxpbmUKICAgYXJndW1lbnQgKCctdScgb3B0aW9uKS4gVGhpcyBibG9jayBpcyBuZXZlciBleGVjdXRlZCBvbiBmaXJzdCBhdHRlbXB0IHNpbmNlCiAgIENPTkZfVVNFUlBXRCBiaXQgaXNuJ3Qgc2V0IGF0IGZpcnN0LCBidXQgY3VybCBsYXRlciB0dXJucyBpdCBvbiB3aGVuIGl0CiAgIGNoZWNrcyBmb3IgQ09ORl9ORVRSQyBiaXQuIFNvIHdoZW4gY3VybCB0cmllcyB0byByZWRvIGV2ZXJ5dGhpbmcgZHVlIHRvCiAgIHJlZGlyZWN0aW9uLCBpdCBzZWdmYXVsdHMgdHJ5aW5nIHRvIGFjY2VzcyAqZGF0YS0+dXNlcnB3ZC4KClZlcnNpb24gNS45LjEKCiBEYW5pZWwgKDMwIEp1bHkgMTk5OSkKIC0gU3RldmUgV2FsY2ggcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrIGluIHRoZSBmb3JtZGF0YQogICBmdW5jdGlvbnMuIEkgYWRkZWQgYSBGb3JtRnJlZSgpIGZ1bmN0aW9uIHRoYXQgaXMgbm93IHVzZWQgYW5kIHN1cHBvc2VkIHRvCiAgIGNvcnJlY3QgdGhpcyBmbGF3LgoKIC0gTWFyayBXb3R0b24gcmVwb3J0ZWQ6CiAgICdjdXJsIC1MIGh0dHBzOi8vd3d3LmN3YS5jb20uYXUvJyBjb3JlIGR1bXBzLiAgSSBtYW5hZ2VkIHRvIGN1cmUgdGhpcyBieQogICBjb3JyZWN0aW5nIHRoZSBjbGVhbnVwIHByb2NlZHVyZS4gVGhlIGJ1ZyBzZWVtcyB0byBiZSBnb25lIHdpdGggbXkgT3BlblNTTAogICAwLjkuMmIsIGFsdGhvdWdoIHN0aWxsIG9jY3VycyB3aGVuIEkgcnVuIHRoZSB+MTAwIHllYXJzIG9sZCBTU0xlYXkgMC44LjAuIEkKICAgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGN1cmwgb3IgU1NMZWF5IHRoYXQgaXMgdG8gYmxhbWUgZm9yIHRoYXQuCgogLSBNYXJjdXMgS2xlaW46CiAgIFJlcG9ydGVkIGFuIEZUUCB1cGxvYWQgcmVzdW1lIGJ1ZyB0aGF0IEkgcmVhbGx5IGNhbid0IHJlcGVhdCBub3IgdW5kZXJzdGFuZC4KICAgSSBsZWF2ZSBpdCBoZXJlIHNvIHRoYXQgaXQgd29uJ3QgYmUgZm9yZ290dGVuLgoKIERhbmllbCAoMjkgSnVseSAxOTk5KQogLSBDb3N0eWEgU2h1bHl1cGluIHN1Z2dlc3RlZCBzdXBwb3J0IGZvciBsb25nZXIgVVJMcyB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICAgYW5kIEkgY291bGQgb25seSBhZ3JlZSBhbmQgZml4IGl0IQoKIC0gTGVpZ2ggUHVyZGllIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgdXBsb2FkL1BPU1QgZGVwYXJ0bWVudC4gSXQgdHVybmVkIG91dAogICB0aGF0IGh0dHAuYyBhY2NpZGVudGFseSBjbGVhcmVkIHRoZSBwb2ludGVyIGluc3RlYWQgb2YgdGhlIGJ5dGUgY291bnRlcgogICB3aGVuIHN1cHBvc2VkIHRvLgoKIC0gQ29zdHlhIFNodWx5dXBpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwb3J0IG51bWJlcnMgYW5kIExvY2F0aW9uOi4gSWYKICAgeW91IGhhZCBhIHNlcnZlciBhdCBhIG5vbi1zdGFuZGFyZCBwb3J0IHRoYXQgcmVkaXJlY3RlZCB0byBhbiBVUkwgdXNpbmcgYQogICBzdGFuZGFyZCBwb3J0IG51bWJlciwgY3VybCBzdGlsbCB1c2VkIHRoYXQgZmlyc3QgcG9ydCBudW1iZXIuCgogLSBSYWxwaCBCZWNrbWFubiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB1c2luZyBib3RoIENPTkZfRk9MTE9XTE9DQVRJT04KICAgYW5kIENPTkZfRkFJTE9ORVJST1Igc2ltdWx0YW5lb3VzbHkuIFNpbmNlIHRoZSBDT05GX0ZBSUxPTkVSUk9SIGV4aXRzIG9uCiAgIHRoZSAzMDItY29kZSB0aGF0IHRoZSBmb2xsb3cgbG9jYXRpb24gaGVhZGVyIG91dHB1dHMgaXQgd2lsbCBuZXZlciBzaG93IGFueQogICBodG1sIG9uIGxvY2F0aW9uOiBwYWdlcy4gSSBoYXZlIG5vdyBtYWRlIGl0IGxvb2sgZm9yID49NDAwIGNvZGVzIGlmCiAgIENPTkZfRk9MTE9XTE9DQVRJT04gaXMgc2V0LgoKIC0gJ3N0cnVjdCBzbGlzdCcgaXMgbm93IHJlbmFtZWQgdG8gJ3N0cnVjdCBjdXJsX3NsaXN0JyAoYXMgc3VnZ2VzdGVkIGJ5IFJhbHBoCiAgIEJlY2ttYW5uKS4KCiAtIEpvc2h1YSBTd2luayBhbmQgUmljayBXZWx5a29jaHkgd2VyZSB0aGUgZmlyc3QgdG8gcG9pbnQgb3V0IHRvIG1lIHRoYXQgdGhlCiAgIGxhdGVzdCBPcGVuU1NMIHBhY2thZ2Ugbm93IGhhdmUgbW92ZWQgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aC4gSXQgaXMgbm93CiAgIGluIC91c3IvbG9jYWwvc3NsL2luY2x1ZGUvb3BlbnNzbCBhbmQgSSBoYXZlIG5vdyBtb2RpZmllZCB0aGUgLS1lbmFibGUtc3NsCiAgIG9wdGlvbiBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdXNlIHRoYXQgYXMgdGhlIHByaW1hcnkgcGF0aCwgYW5kIEkKICAgbGVhdmUgdGhlIGZvcm1lciBwYXRoIHRvbyB0byB3b3JrIHdpdGggb2xkZXIgcGFja2FnZXMgb2YgT3BlblNTTCB0b28uCgogRGFuaWVsICg5IEp1bmUgMTk5OSkKIC0gSSBmaW5hbGx5IHVuZGVyc3Rvb2QgdGhlIElSSVggcHJvYmxlbSBhbmQgbm93IGl0IHNlZW0gdG8gY29tcGlsZSBvbiBpdCEKICAgSSBhbSBnb25uYSByZW1vdmUgdGhvc2UgI2RlZmluZSBzdHJjYXNlY21wKCkgdGhpbmdzIG9uY2UgYW5kIGZvciBhbGwgbm93LgoKIERhbmllbCAoNCBKdW5lIDE5OTkpCiAtIEkgYWRqdXN0ZWQgdGhlIEZUUCByZXBseSAyMjcgcGFyc2VyIHRvIG1ha2UgdGhlIFBBU1YgY29tbWFuZCB3b3JrIGJldHRlcgogICB3aXRoIG1vcmUgZnRwIHNlcnZlcnMuIEFwcGVhcmFudGx5IHRoZSBSb3hlbiBDaGFsbGFuZ2VyIHNlcnZlciByZXBsaWVkCiAgIHNvbWV0aGluZyBjdXJsIDUuOSBjb3VsZCBkZWFsIHdpdGghIDotKCBSZXBvcnRlZCBieSBBc2hsZXkgUmVpZC1Nb250YW5hcm8KICAgYW5kIE1hcmsgQnV0bGVyIGJyb3VnaHQgYSBzb2x1dGlvbiBmb3IgaXQuCgogRGFuaWVsICgyNiBNYXkgMTk5OSkKIC0gUmVhcnJhbmdlZC4gUkVBRE1FIGlzIG5ldywgdGhlIG9sZCBvbmUgaXMgbm93IFJFQURNRS5jdXJsIGFuZCBJIGFkZGVkIGEKICAgUkVBRE1FLmxpYmN1cmwgd2l0aCB0ZXh0IEkgZ290IGZyb20gUmFscGggQmVja21hbm4uCgogLSBJIGFsc28gdXBkYXRlZCB0aGUgSU5TVEFMTCB0ZXh0LgoKIERhbmllbCAoMjUgTWF5IDE5OTkpCiAtIERhdmlkIEpvbmF0aGFuIExvd3NreSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgIHdpdGggZm9ybSBwb3N0aW5nIHdoZXJlIHRoZSB2YXJpYWJsZSBzaG91bGRuJ3QgaGF2ZSBhbnkgY29udGVudCwgYXMgaW4gY3VybAogICAtRiAiZm9ybT0iIHd3dy5zaXRlLmNvbS4gSXQgd2FzIG5vdyBmaXhlZC4KClZlcnNpb24gNS45IChNYXkgMjIgMTk5OSkKCiBEYW5pZWwgKDIyIE1heSAxOTk5KQogLSBJJ3ZlIGdvdCBhIGJ1ZyByZXBvcnQgZnJvbSBBYXJvbiBTY2FyaXNicmljayBpbiB3aGljaCBoZSBzdGF0ZXMgaGUgaGFzIHNvbWUKICAgcHJvYmxlbXMgd2l0aCAtTCB1bmRlciBGcmVlQlNEIDMuMC4gSSBoYXZlIHByZXZpb3VzbHkgZ290IGFub3RoZXIgYnVnCiAgIHJlcG9ydCBmcm9tIFN0ZWZhbiBHcmV0aGVyIHdoaWNoIHBvaW50cyBhdCBhbiBlcnJvciB3aXRoIHNpbWlsYXIgc3ltcHRob21zCiAgIHdoZW4gdXNpbmcgd2luMzIuIEkgbWFkZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3IHVybCBzdHJpbmcgYSBiaXQgZmFzdGVyCiAgIGFuZCBkaWZmZXJlbnQsIGRvbid0IGtub3cgaWYgaXQgYWN0dWFsbHkgaW1wcm92ZXMgYW55dGhpbmcgdGhvdWdoLi4uCgogRGFuaWVsICgyMCBNYXkgMTk5OSkKIC0gTWFkZSB0aGUgY29va2llIHBhcnNlciBkZWFsIHdpdGggQ1JMRiBuZXdsaW5lcyB0b28uCgogRGFuaWVsICgxOSBNYXkgMTk5OSkKIC0gRG93bmxvYWQoKSBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIGZhaWxpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlIHNyZWFkKCkKICAgZnVuY3Rpb24uIEFkYW0gQ295bmUgZm91bmQgdGhlIHByb2JsZW0gaW4gdGhlIHdpbjMyIHZlcnNpb24sIGFuZCBUcm95IEVuZ2VsCiAgIGhlbHBlZCBtZSBvdXQgaXNvbGF0aW5nIGl0LgoKIERhbmllbCAoMTYgTWF5IDE5OTkpCiAtIFJpY2hhcmQgQWRhbXMgcG9pbnRlZCBvdXQgYSBidWcgSSBpbnRyb2R1Y2VkIGluIDUuOC4gLS1kdW1wLWhlYWRlciBkb2Vzbid0CiAgIHdvcmsgYW55bW9yZSEgOi0vIEkgZml4ZWQgaXQgbm93LgoKIC0gQWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEpvc2h1YSBTd2luayBJIGFkZGVkIC1TIC8gLS1zaG93LWVycm9yIHRvIGZvcmNlIGN1cmwKICAgdG8gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGFuIGVycm9yLCBldmVuIGlmIC1zLy0tc2lsZW50IHdhcwogICB1c2VkLgoKIERhbmllbCAoMTAgTWF5IDE5OTkpCiAtIEkgbW92ZWQgdGhlIHN0dWZmIGNvbmNlcm5pbmcgSFRUUCwgRElDVCBhbmQgVEVMTkVUIGl0IHRoZWlyIG93biBzb3VyY2UKICAgZmlsZXMgbm93LiBJdCBpcyBhIGJlZ2lubmluZyBvbiBteSBjbGVhbi11cCBvZiB0aGUgc291cmNlcyB0byBtYWtlIHRoZW0KICAgbGF5ZXIgYWxsIHRob3NlIHByb3RvY29scyBiZXR0ZXIgdG8gZW5hYmxlIG1vcmUgdG8gYmUgYWRkZWQgZWFzaWVyIGluIHRoZQogICBmdXR1cmUhCgogLSBMZW9uIEJyZWVkdCBzZW50IG1lIHNvbWUgZmlsZXMgSSd2ZSBub3QgcHV0IGludG8gdGhlIG1haW4gY3VybAogICBhcmNoaXZlLiBUaGV5J3JlIGZvciBjcmVhdGluZyB0aGUgRGViaWFuIHBhY2thZ2UgdGhpbmdpZS4gSGUgYWxzbyBzZW50IG1lIGEKICAgZGViaWFuIHBhY2thZ2UgdGhhdCBJJ3ZlIG1hZGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhdCB0aGUgd2ViIHBhZ2UKCiBEYW5pZWwgKDkgTWF5IDE5OTkpCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBjeWd3aW4gdG9vLgoKIFRyb3kgRW5nZWwgKDcgTWF5IDE5OTkpCiAtIEJyb3VnaHQgYSBzZXJpZXMgb2YgcGF0Y2hlcyB0byBhbGxvdyBjdXJsIHRvIGNvbXBpbGUgc21vb3RobHkgb24gTVNWQysrIDYKICAgYWdhaW4hCgogRGFuaWVsICg2IE1heSAxOTk5KQogLSBJIGNoYW5nZWQgdGhlICNpZmRlZiBIQVZFX1NUUkZUSU1FIHBsYWNlbWVudCBmb3IgdGhlIC16IGNvZGUgc28gdGhhdCBpdAogICB3aWxsIGJlIGVhc2llciB0byBkaXNjb3ZlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGF0IGZ1bmN0aW9uIGFuZCB0aHVzCiAgIGNhbid0IHVzZSAteiBzdWNjZXNzZnVsbHkuIE1hZGUgdGhlIHN0cmZ0aW1lKCkgZ2V0IHVzZWQgaWYgV0lOMzIgaXMgZGVmaW5lZAogICB0b28uCgpWZXJzaW9uIDUuOAoKIERhbmllbCAoNSBNYXkgMTk5OSkKIC0gSSd2ZSBoYWQgaXQgd2l0aCB0aGlzIGF1dG9jb25mL2F1dG9tYWtlIG1lc3MuIEl0IHNlZW1zIHRvIHdvcmsgYWxscmlnaHQKICAgZm9yIG1vc3QgcGVvcGxlIHdobyBkb24ndCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCwgYnV0IGZvciB0aG9zZSB3aG8gaGF2ZQogICB0aGVyZSBhcmUgcHJvYmxlbXMgYWxsIG92ZXIuCgogICBJJ3ZlIGdvdCBsaWtlIGZpdmUgZGlmZmVyZW50IGJ1ZyByZXBvcnRzIG9uIHRoaXMgb25seSB0aGUgbGFzdAogICB3ZWVrLi4uIENsYXVkaW8gTmV2ZXMgYW5kIEZlZGVyaWNvIEJpYW5jaGkgYW5kIHJvb3QgPGR1Z2dlcmowMDEgYXQKICAgaGF3YWlpLnJyLmNvbT4gYXJlIHNvbWUgb2YgdGhlbSByZXBvcnRpbmcgdGhpcy4KCiAgIEN1cnJlbnRseSwgSSBoYXZlIG5vIHJlYWxseSBnb29kIGZpeCBzaW5jZSBJIHdhbnQgdG8gdXNlIGF1dG9tYWtlIG15c2VsZiB0bwogICBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuaW4gZmlsZXMuIEkndmUgZm91bmQgb3V0IHRoYXQgdGhlIEBTSEVMTEAtcHJvYmxlbXMKICAgY2FuIG9mdGVuIGJlIGZpeGVkIGJ5IG1hbnVhbGx5IGludm9raW5nICdhdXRvbWFrZScgaW4gdGhlIGFyY2hpdmUgcm9vdAogICBiZWZvcmUgeW91IHJ1biAuL2NvbmZpZ3VyZS4uLiBJJ3ZlIGhhY2tlZCBteSBtYWtldGd6IHNjcmlwdCBub3cgdG8gZmlkZGxlCiAgIGEgYml0IHdpdGggdGhpcyBhbmQgbXkgdGVzdHMgc2VlbSB0byB3b3JrIGJldHRlciB0aGFuIGJlZm9yZSBhdCBsZWFzdCEKCiBEYW5pZWwgKDQgTWF5IDE5OTkpCiAtIG1raGVscC5wbCBoYXMgYmVlbiBkb2luZyBiYWRseSBsYXRlbHkuIEkgY29ycmVjdGVkIGEgY2FzZSBwcm9ibGVtIGluCiAgIHRoZSByZWdleGVzLgoKIC0gSSd2ZSBub3cgcmVtYWRlIHRoZSAtbyBvcHRpb24gdG8gbm90IHRvdWNoIHRoZSBmaWxlIHVubGVzcyBpdCBuZWVkcyB0by4KICAgSSBoYWQgdG8gZG8gdGhpcyB0byBtYWtlIC16IG9wdGlvbiByZWFsbHkgZmluZSwgc2luY2Ugbm93IHlvdSBjYW4gbWFrZSBhCiAgIGN1cmwgZmV0Y2ggYW5kIHVzZSBhIGxvY2FsIGNvcHkncyB0aW1lIHdoZW4gZG93bmxvYWRpbmcgdG8gdGhhdCBmaWxlLCBhcwogICBpbjoKCiAgICAgICAgY3VybCAteiBkdW1wIC1vIGR1bXAgcmVtb3RlLnNpdGUuY29tL2ZpbGUuaHRtbAoKICAgVGhpcyB3aWxsIG9ubHkgZ2V0IHRoZSBmaWxlIGlmIHRoZSByZW1vdGUgb25lIGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsLgogICBJJ20gYXdhcmUgdGhhdCB0aGlzIGFsdGVycyBwcmV2aW91cyBiZWhhdmlvdXIgYSBsaXR0bGUuIFNvbWUgc2NyaXB0cyBvdXQKICAgdGhlcmUgbWF5IGRlcGVuZCBvbiB0aGF0IHRoZSBmaWxlIGlzIGFsd2F5cyB0b3VjaGVkLi4uCgogLSBDb3JyZWN0ZWQgYSBidWcgaW4gdGhlIFNTTHYyL3YzIHNlbGVjdGlvbi4KCiAtIEZlbGl4IHZvbiBMZWl0bmVyIHJlcXVlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlIGFibGUgdG8gc2VuZAogICAiSWYtTW9kaWZpZWQtU2luY2UiIGhlYWRlcnMsIHdoaWNoIGluZGVlZCBpcyBhIGZhaXIgaWRlYS4gIEkgaW1wbGVtZW50ZWQgaXQKICAgcmlnaHQgYXdheSEgVHJ5IC16IDxleHByZXNzaW9uPiB3aGVyZSBleHByZXNzaW9uIGlzIGEgZnVsbCBHTlUgZGF0ZQogICBleHByZXNzaW9uIG9yIGEgZmlsZSBuYW1lIHRvIGdldCB0aGUgZGF0ZSBmcm9tIQoKIFN0ZXBoYW4gTGFnZXJob2xtICgzMCBBcHIgMTk5OSkKIC0gUG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggdGhlIHNyYy9NYWtlZmlsZSBmb3IgRnJlZUJTRC4gVGhlIFJNIHZhcmlhYmxlCiAgIGlzbid0IHNldCBhbmQgY2F1c2VzIHRoZSBtYWtlIHRvIGZhaWwuCgogRGFuaWVsICgyNiBBcHJpbCAxOTk5KQogLSBBbSBJIHNpbGx5IG9yIHdoYXQ/IElydmluZyBXb2xmZSBwb2ludGVkIG91dCB0byBtZSB0aGF0IHRoZSBjdXJsIHZlcnNpb24KICAgbnVtYmVyIHdhcyBub3Qgc2V0IHByb3Blcmx5LiBIYXNuJ3QgYmVlbiBzaW5jZSA1LjYuIFRoaXMgd2FzIGR1ZSB0byBhIGJ1ZwogICBpbiBteSBtYWtldGd6IHNjcmlwdCEKCiBEYXZpZCBFcmlrc3NvbiAoMjUgQXByIDE5OTkpCiAtIEZvdW5kIGEgYnVnIGluIGNvb2tpZXMuYyB0aGF0IG1hZGUgaXQgY3Jhc2ggYXQgdGltZXMuCgpWZXJzaW9uIDUuNy4xCgogRG91ZyBLYXVmbWFuICgyMyBBcHIgMTk5OSkKIC0gQnJvdWdodCB0d28gc3Vub3MgNCBmaXhlcy4gT25lIG9mIHRoZW0gYmVpbmcgdGhlIGhvc3RpcC5jIGZpeCBtZW50aW9uZWQKICAgYmVsb3cgYW5kIHRoZSBvdGhlciBvbmUgYSBjb3JyZWN0aW9uIGluIGluY2x1ZGUvc3RkY2hlYWRlcnMuaAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggYWJvdXQgY29tcGlsaW5nIHdpdGggdGhlIFVTLXZlcnNpb24gb2Ygb3BlbnNzbCB0byB0aGUKICAgSU5TVEFMTCBmaWxlLgoKIERhbmllbAogLSBOZXcgbWFpbGluZyBsaXN0IGFkZHJlc3MuIEluZm8gdXBkYXRlZCBvbiB0aGUgd2ViIHBhZ2UgYXMgd2VsbCBhcyBpbiB0aGUKICAgUkVBRE1FIGZpbGUKCiBHcmVnIE9udWZlciAoMjAgQXByIDE5OTkpCiAtIGhvc3RpcC5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIFN1bk9TIDUuNS4xLgogICBJdCBuZWVkcyBhbiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgpWZXJzaW9uIDUuNwoKIERhbmllbCAoQXByIDIwIDE5OTkpCiAtIERlY2lkZWQgdG8gdXBsb2FkIGEgbm9uLWJldGEgdmVyc2lvbiByaWdodCBub3chCgogLSBNYWRlIGN1cmwgc3VwcG9ydCBhbnktbGVuZ3RoIEhUVFAgaGVhZGVycy4gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBub3cKICAgc2ltcGx5IGVubGFyZ2VkIGV2ZXJ5IHRpbWUgaXQgdHVybnMgb3V0IHRvIGJlIHRvbyBzbWFsbCEKCiAtIEFkZGVkIHRoZSBGQVEgZmlsZSB0byB0aGUgYXJjaGl2ZS4gU3RpbGwgYSBiaXQgc21hbGxpc2gsIGJ1dCBpdCBpcyBhCiAgIHN0YXJ0LgoKIEVyaWMgVGhlbGluICgxNSBBcHIgMTk5OSkKIC0gTWFkZSAtRCBhY2NlcHQgJy0nIGluc3RlYWQgb2YgZmlsZW5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgoKVmVyc2lvbiA1LjYuM2JldGEKCiBEYW5pZWwgKEFwciAxMiAxOTk5KQoKIC0gQ2hhbmdlZCB0d28gI2lmZGVmIFdJTjMyIHRvIGJldHRlciAjaWZkZWYgPGVycm9yY29kZT4gd2hlbiBjb25uZWN0KClpbmcKICAgaW4gdXJsLmMgYW5kIGZ0cC5jLiBNYWtlcyBjeWd3aW4zMiBkZWFsIHdpdGggdGhlbSBiZXR0ZXIgdG9vLiBXZSBzaG91bGQKICAgdHJ5IHRvIGdldCBzb21lIGRlY2VudCB3aW4zMi1yZXBsYWNlbWVudCB0aGVyZS4gQW55b25lPwoKIC0gVGhlIG9sZCAtMy8tLWNybGYgb3B0aW9uIGlzIG5vdyBPTkxZIC0tY3JsZiEKCiAtIEkgY2hhbmdlZCB0aGUgIlNTTCBmaXgiIHRvIGEgbW9yZSBsYW1lIG9uZSwgYnV0IHRoYXQgZG9lc24ndCByZW1vdmUgYXMKICAgbXVjaCBmdW5jdGlvbmFsaXR5LiBOb3cgSSd2ZSBlbmFibGVkIHRoZSBsaWIgdG8gc2VsZWN0IHdoYXQgU1NMIHZlcnNpb24gaXQKICAgc2hvdWxkIHRyeSBmaXJzdC4gQXBwZWFyYW50bHkgc29tZSBvbGRlciBTU0wtc2VydmVycyBkb24ndCBsaWtlIHdoZW4geW91CiAgIHRhbGsgdjMgd2l0aCB0aGVtIHNvIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gZm9yY2UgY3VybCB0byB0YWxrIHYyIGZyb20gdGhlCiAgIHN0YXJ0LiBUaGUgZml4IGRhdGVkIEFwcmlsIDYgYW5kIHBvc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGZvcmNlZCBjdXJsIHRvCiAgIHVzZSB2MiBhdCBhbGwgdGltZXMgdXNpbmcgYSBtb2Rlcm4gT3BlblNTTCB2ZXJzaW9uLCBidXQgd2UgZG9uJ3QgcmVhbGx5CiAgIHdhbnQgc3VjaCBhIGNyaXBwbGVkIHNvbHV0aW9uLgoKIC0gTWFyYyBCb3VjaGVyIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBhIG1hdGggZXJyb3IgZm9yIHRoZQogICAiQ3Vyci5TcGVlZCIgcHJvZ3Jlc3MgbWV0ZXIuCgogLSBFcmljIFRoZWxpbiBzZW50IG1lIGEgcGF0Y2ggdGhhdCBlbmFibGVzICctSyAtJyB0byByZWFkIGEgY29uZmlnIGZpbGUgZnJvbQogICBzdGRpbi4KCiAtIEkgZm91bmQgb3V0IHdlIGRpZG4ndCBjbG9zZSB0aGUgZmlsZSBwcm9wZXJseSBiZWZvcmUgc28gSSBhZGRlZCBpdCEKCiBEYW5pZWwgKEFwciA5IDE5OTkpCiAtIFl1IFhpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBmdHAgZG93bmxvYWQgcmVzdW1lLiAgSXQgZGlkbid0IHdvcmsgYXQKICAgYWxsISA7LU8KCiBEYW5pZWwgKEFwciA2IDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgdmVyc2lvbiBzdHJpbmcgcGFydCBnZW5lcmF0ZWQgZm9yIHRoZSBTU0wgdmVyc2lvbi4KCiAtIEkgZm91bmQgYSB3YXkgdG8gbWFrZSBzb21lIG90aGVyIFNTTCBwYWdlIHdvcmsgd2l0aCBvcGVuc3NsIDAuOS4xKyB0aGF0CiAgIHByZXZpb3VzbHkgZGlkbid0IChzc2xlYXkgMC44LjAgd29ya3Mgd2l0aCBpdCB0aG91Z2ghKS4gVHJ5aW5nIHRvIGdldAogICBzb21lIHJlYWwgaW5mbyBmcm9tIHRoZSBPcGVuU1NMIGd1eXMgdG8gc2VlIGhvdyBJIHNob3VsZCBkbyB0byBiZWhhdmUgdGhlCiAgIGJlc3Qgd2F5LiBTU0xlYXkgMC44LjAgc2hvdWxkbid0IGJlIHRoYXQgbXVjaCBpbiB1c2UgYW55d2F5IHRoZXNlIGRheXMhCgpWZXJzaW9uIDUuNi4yYmV0YQoKIERhbmllbCAoQXByIDQgMTk5OSkKIC0gRmluYWxseSBoYXZlIGN1cmwgbW9yZSBjb29raWUgImF3YXJlIi4gTm93IHJlYWQgY2FyZWZ1bGx5LiBUaGlzIGlzIGhvdwogICBpdCB3b3Jrcy4KICAgVG8gbWFrZSBjdXJsIHJlYWQgY29va2llcyBmcm9tIGFuIGFscmVhZHkgZXhpc3RpbmcgZmlsZSwgaW4gcGxhaW4gaGVhZGVyLQogICBmb3JtYXQgKGxpa2UgZnJvbSB0aGUgaGVhZGVycyBvZiBhIHByZXZpb3VzIGZldGNoKSBpbnZva2UgY3VybCB3aXRoIHRoZQogICAtYiBmbGFnIGxpa2U6CgogICAgICAgIGN1cmwgLWIgZmlsZSBodHRwOi8vc2l0ZS9mb28uaHRtbAoKICAgQ3VybCB3aWxsIHRoZW4gdXNlIGFsbCBjb29raWVzIGl0IGZpbmRzIG1hdGNoaW5nLiBUaGUgb2xkIHN0eWxlIHRoYXQgc2V0cwogICBhIHNpbmdsZSBjb29raWUgd2l0aCAtYiBpcyBzdGlsbCBzdXBwb3J0ZWQgYW5kIGlzIHVzZWQgaWYgdGhlIHN0cmluZwogICBmb2xsb3dpbmcgLWIgaW5jbHVkZXMgYSAnPScgbGV0dGVyLCBhcyBpbiAiLWIgbmFtZT1kYW5pZWwiLgoKICAgVG8gbWFrZSBjdXJsIHJlYWQgdGhlIGNvb2tpZXMgc2VudCBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9jYXRpb246ICh3aGljaAogICBzaXRlcyBvZnRlbiBkbykgcG9pbnQgY3VybCB0byByZWFkIGEgbm9uLWV4aXN0aW5nIGZpbGUgYXQgZmlyc3QgKGkuZQogICB0byBzdGFydCB3aXRoIG5vIGV4aXN0aW5nIGNvb2tpZXMpLCBsaWtlOgoKICAgICAgICBjdXJsIC1iIG5vd2hlcmUgaHR0cDovL3NpdGUvc2V0Y29va2llYW5kcmVsb2NhdGUuaHRtbAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggaW4gdGhlIFRPRE8gZmlsZSBhYm91dCB0aGUgU1NMIHByb2JsZW1zIHJlY2VudGx5CiAgIHJlcG9ydGVkLiBFdmlkZW50bHksIHNvbWUga2luZCBvZiBTU0wtcHJvYmxlbSBjdXJsIG1heSBuZWVkIHRvIGFkZHJlc3MuCgogLSBCZXR0ZXIgIkxvY2F0aW9uOiIgZm9sbG93aW5nLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkIChUdWUsIDMwIE1hciAxOTk5KQogLSBBIHN1YnNlY29uZCBkaXNwbGF5IHBhdGNoLgoKIERhbmllbCAoTWFyIDE0IDE5OTkpCiAtIEkndmUgc2VwYXJhdGVkIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsaWJjdXJsIGFuZCBjdXJsIG5vdy4gVG8gbWFrZQogICB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyLCBJIGRlY2lkZWQgdG8gc3RhcnQgdGhlIGN1cmwgbnVtYmVyaW5nIGZyb20KICAgNS42IGFuZCB0aGUgZm9ybWVyIHZlcnNpb24gbnVtYmVyIGtub3duIGFzICJjdXJsIiBpcyBub3cgdGhlIG9uZQogICBzZXQgZm9yIGxpYmN1cmwuCgogLSBSZW1vdmVkIHRoZSAnZW5hYmxlLW5vLXBhc3MnIGZyb20gY29uZmlndXJlLCBJIGRvdWJ0IGFueW9uZSB3YW50ZWQKICAgdGhhdC4KCiAtIE1hZGUgbG90cyBvZiB0aW55IGFkanVzdG1lbnRzIHRvIGNvbXBpbGUgc21vb3RobHkgd2l0aCBjeWd3aW4gdW5kZXIKICAgd2luMzIuIEl0J3MgYSBraWxsZXIgZm9yIHBvcnRpbmcgdGhpcyB0byB3aW4zMiwgYnllIGJ5ZSBWQysrISA7LSkKICAgQ29tcGlsZXMgYW5kIGJ1aWxkcyBvdXQtb2YtdGhlLWJveCBub3cuIFNlZSB0aGUgbmV3IHdvcmRpbmdzIGluCiAgIElOU1RBTEwgZm9yIGRldGFpbHMuCgogLSBCZWdpbm5pbmcgZXhwZXJpbWVudHMgd2l0aCBkb3dubG9hZGluZyBtdWx0aXBsZSBkb2N1bWVudCBmcm9tIGEgaHR0cAogICBzZXJ2ZXIgd2hpbGUgcmVtYWluaW5nIGNvbm5lY3RlZC4KClZlcnNpb24gNS42YmV0YQoKIERhbmllbCAoTWFyIDEzIDE5OTkpCiAtIFNpbmNlIEkndmUgY2hhbmdlZCBzbyBtdWNoLCBJIHRob3VnaHQgSSdkIGp1c3QgZ28gYWhlYWQgYW5kIGltcGxlbWVudCB0aGUKICAgc3VnZ2VzdGlvbiBmcm9tIERvdWdsYXMgRS4gV2Vnc2NoZWlkLiAtRCBvciAtLWR1bXAtaGVhZGVyIGlzIG5vdyBzdG9yaW5nCiAgIEhUVFAgaGVhZGVycyBzZXBhcmF0ZWx5IGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAtIEFkZGVkIG5ldyB0ZXh0IHRvIElOU1RBTEwgb24gd2hhdCB0byBkbyB0byBidWlsZCB0aGlzIG9uIHdpbjMyIG5vdy4KCiAtIEFhYXJnaC4gSSBoYWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgcHJlZml4IHRoZSBzaGFyZWQgI2luY2x1ZGUgZmlsZXMKICAgaW4gdGhlIHNvdXJjZXMgd2l0aCAiLi4vaW5jbHVkZS8iIHRvIHBsZWFzZSBWQysrLi4uCgogRGFuaWVsIChNYXIgMTIgMTk5OSkKIC0gU3BsaXQgdGhlIHVybC5jIHNvdXJjZSBpbnRvIG1hbnkgdGlueSBzb3VyY2VzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkKICAgYW5kIHNtYWxsZXIgc2l6ZS4KCiBEYW5pZWwgKE1hciAxMSAxOTk5KQogLSBTdGFydGVkIHRvIGNoYW5nZSBzdHVmZiBmb3IgYSBtb3ZlIHRvIG1ha2UgbGliY3VybCBhbmQgYSBtb3JlIHNlcGFyYXRlCiAgIGN1cmwgYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoZSBsaWJjdXJsLiBNYWRlIHRoZSBsaWJjdXJsIHNvdXJjZXMgaW50bwogICB0aGUgbmV3IGxpYiBkaXJlY3Rvcnkgd2hpbGUgdGhlIGN1cmwgYXBwbGljYXRpb24gd2lsbCByZW1haW4gaW4gc3JjIGFzCiAgIGJlZm9yZS4gTmV3IG1ha2VmaWxlcywgYWRqdXN0ZWQgY29uZmlndXJlIHNjcmlwdCBhbmQgc28uCgogICBsaWJjdXJsLmEgYnVpbHQgcXVpY2tseSBhbmQgZWFzaWx5LiBJIGJldHRlciBtYWtlIGEgYmV0dGVyIGludGVyZmFjZSB0bwogICB0aGUgbGliIGZ1bmN0aW9ucyB0aG91Z2guCgogICBUaGUgbmV3IHJvb3QgZGlyIGluY2x1ZGUvIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdGhlIHB1YmxpYyBpbmZvcm1hdGlvbgogICBhYm91dCB0aGUgbmV3IGxpYmN1cmwuIEl0IGlzIGEgbGl0dGxlIHVnbHkgc28gZmFyIDotKQoKCiBEYW5pZWwgKE1hciAxIDE5OTkpCiAtIFRvZGQgS2F1Zm1hbm4gc2VudCBtZSBhIGdvb2QgbGluayB0byBOZXRzY2FwZSdzIGNvb2tpZSBzcGVjIGFzIHdlbGwgYXMgdGhlCiAgIGluZm8gdGhhdCBSRkMgMjEwOSBzcGVjaWZpZXMgaG93IHRvIHVzZSB0aGVtLiAgVGhlIGxpbmsgaXMgbm93IGluIHRoZQogICBSRUFETUUgYW5kIHRoZSBSRkMgaW4gdGhlIFJFU09VUkNFUy4KCiBEYW5pZWwgKEZlYiAyMyAxOTk5KQogLSBGaW5hbGx5IG1hZGUgY29uZmlndXJlIGFjY2VwdCAtLXdpdGgtc3NsIHRvIGxvb2sgZm9yIFNTTCBsaWJzIGFuZCBpbmNsdWRlcwogICBpbiB0aGUgInN0YW5kYXJkIiBwbGFjZSAvdXNyL2xvY2FsL3NzbC4uLgoKIERhbmllbCAoRmViIDIyIDE5OTkpCiAtIFZlcmlmaWVkIHRoYXQgY3VybCBsaW5rZWQgZmluZSB3aXRoIE9wZW5TU0wgMC45LjFjIHdoaWNoIHNlZW1zIHRvIGJlCiAgIHRoZSBtb3N0IHJlY2VudC4KCiBIZW5yaSBHb21leiAoRnJpIEZlYiAgNSAxOTk5KQogLSBTZW50IGluIGFuIHVwZGF0ZWQgY3VybC1zc2wuc3BlYy4gSSBzdGlsbCBtaXNzIHRoZSBzY3JpcHQgdGhhdCBidWlsZHMgYW4KICAgUlBNIGF1dG9tYXRpY2FsbHkuLi4KClZlcnNpb24gNS41LjEKCiBNYXJrIEJ1dGxlciAoMjcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCBwcm9ibGVtcyBpbiBEb3dubG9hZCgpLgoKIERhbml0ZWwgU3RlbmJlcmcgKDI1IEphbiAxOTk5KQogLSBKZXJlbWllIFBldGl0IHBvaW50ZWQgb3V0IGEgZmV3IGZsYXdzIGluIHRoZSBzb3VyY2UgdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbQogICBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBuYXRpdmUgY29tcGlsZXIgdW5kZXIgRGlnaXRhbCBVbml4IHY0LjBkLgoKVmVyc2lvbiA1LjUKCiBEYW5pZWwgU3RlbmJlcmcgKDE1IEphbiAxOTk5KQogLSBBZGRlZCBCam9ybnMgc21hbGwgdGV4dCB0byB0aGUgUkVBRE1FIGFib3V0IHRoZSBESUNUIHByb3RvY29sLgoKIERhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDE5OTkpCiAtIDxqc3dpbmsgYXQgc29mdGNvbS5uZXQ+IHJlcG9ydGVkIGFib3V0IHRoZSB3aW4zMi12ZXJzaW9pbjogIkRvZXNuJ3QgdXNlCiAgIEFMTF9QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZSIuIFR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBvZiB0aGUgc3RhdGljLQogICBidWZmZXIgbmF0dXJlIG9mIHRoZSB3aW4zMiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxscyEKCiBCam9ybiBSZWVzZSAoMTAgSmFuIDE5OTkpCiAtIEkgaGF2ZSBhdHRhY2hlZCBhIHNpbXBsZSBhZGRpdGlvbiBmb3IgdGhlIERJQ1QgcHJvdG9jb2wgKFJGQyAyMjI5KS4KICAgSXQgcGVyZm9ybXMgZGljdGlvbmFyeSBsb29rdXBzLiBUaGUgb3V0cHV0IHN0aWxsIG5lZWRzIHRvIGJlIGJldHRlcgogICBmb3JtYXR0ZWQuCgogICBUbyB0ZXN0IGl0IHRyeSAodGhlIGV4YWN0IGZvcm1hdCwgYW5kIG1vcmUgZXhhbXBsZXMgYXJlIGRlc2NyaWJlZCBpbgogICB0aGUgUkZDKQoKICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbwogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvOjpzb3VuZGV4CgoKIFZpY2VudGUgR2FyY2lhICgxMCBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMjBNQi4KCiBEYW5pZWwgU3RlbmJlcmcgKDcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgLXQgYW5kIC1UIGhlbHAgdGV4dHMuIFRoZXkgY2xhaW1lZCB0byBiZSBGVFAgb25seS4KClZlcnNpb24gNS40CgogRGFuaWVsIFN0ZW5iZXJnCiAoNyBKYW4gMTk5OSkKIC0gSXJ2aW5nIFdvbGZlIHJlcG9ydGVkIHRoYXQgY3VybCAtcyBkaWRuJ3QgYWx3YXlzIHN1cHJlc3MgdGhlIHByb2dyZXNzCiAgIHJlcG9ydGluZy4gSXQgd2FzIHRoZSBmb3JtIHBvc3QgdGhhdCBhdXRvYW10aWNhbGx5IGFsd2F5cyBzd2l0Y2hlZCBpdCBvbgogICBhZ2Fpbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkIQoKICg0IEphbiAxOTk5KQogLSBBbmRyZWFzIEtvc3R5cmthIHN1Z2dlc3RlZCBJJ2QgYWRkIFBVVCBhbmQgaGUgaGVscGVkIG1lIG91dCB0byB0ZXN0IGl0LiBJZgogICB5b3UgdXNlIC10IG9yIC1UIG5vdyBvbiBhIGh0dHAgb3IgaHR0cHMgc2VydmVyLCBQVVQgd2lsbCBiZSB1c2VkIGZvciBmaWxlCiAgIHVwbG9hZC4KCiAgIEkgcmVtb3ZlZCB0aGUgZm9ybWVyIHVzZSBvZiAtVCB3aXRoIEhUVFAuIEkgZG91YnQgYW55b25lIGV2ZXIgcmVhbGx5IHVzZWQKICAgdGhhdC4KCiAoNCBKYW4gMTk5OSkKIC0gRXJpayBKYWNvYnNlbiBmb3VuZCBhIHdpZHRoIGJ1ZyBpbiB0aGUgbXByaW50ZigpIGZ1bmN0aW9uLiAgSSBjb3JyZWN0ZWQgaXQKICAgbm93LgoKICg0IEphbiAxOTk5KQogLSBBcyBKb2huIFYuIENob3cgcG9pbnRlZCBvdXQgdG8gbWUsIGN1cmwgYWNjZXB0ZWQgdmVyeSBsaW1pdGVkIFVSTCBzaXplcy4gSXQKICAgc2hvdWxkIG5vdyBhY2NlcHQgcGF0aCBwYXJ0cyB0aGF0IGFyZSB1cCB0byBhdCBsZWFzdCA0MDk2IGJ5dGVzLgoKIC0gU29tZWhvdyBJIHNjcmV3ZWQgdXAgd2hlbiBhcHBseWluZyB0aGUgQUlYIGZpeCBmcm9tIEdpbGJlcnQgUmFtaXJleiwgc28KICAgSSByZWRpZCB0aGF0IG5vdy4KClZlcnNpb24gNS4zYSAod2luMzIgb25seSkKCiBUcm95IEVuZ2VsCiAtIENvcnJlY3RlZCBhIHdpbjMyIGJ1ZyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgcGFydC4KClZlcnNpb24gNS4zCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMjEgRGVjIDE5OTgpCiAtIEkgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgInF1b3RlIiBmdW5jdGlvbiBvZiBGVFAgY2xpZW50cy4gSXQgYWxsb3dzIHlvdSB0bwogICBzZW5kIGFyYml0cmFyeSBjb21tYW5kcyB0byB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuIEkgY2hvc2UgdGhlIC1RLy0tcXVvdGUKICAgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KCiAgIFlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHF1b3RlZCBzdHJpbmcsIGFuZCBjdXJsIHdpbGwgYXBwbHkgdGhlbSBpbgogICBvcmRlci4gIFRoaXMgaXMgd2hhdCBJIHVzZSBmb3IgbXkgTVZTIHVwbG9hZDoKCiAgY3VybCAtQiAtLWNybGYgLVEgInNpdGUgbHJlY2w9ODAiIC1RICJzaXRlIGJsaz04MDAwIiAtVCBmaWxlIGZ0cDovL29zMzkwL3Rlc3QKCiAgIEN1cmwgd2lsbCBzZW5kIHRoZSB0d28gcXVvdGVkICJzaXRlIiBjb21tYW5kcyBpbiB0aGUgcHJvcGVyIG9yZGVyLgoKIC0gTWFkZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFJWC4KCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgxOCBEZWMgMTk5OCkKIC0gQnJvdWdodCBhbiBNVlMgcGF0Y2g6IC0zLy0tbXZzLCBmb3IgZnRwIHVwbG9hZCB0byB0aGUgTVZTIGZ0cCBzZXJ2ZXIuCgogVHJveSBFbmdlbCAoMTcgRGVjIDE5OTgpCiAtIEJyb3VnaHQgYSBjb3JyZWN0aW9uIHRoYXQgZml4ZXMgdGhlIHdpbjMyIGN1cmwgYnVnLgoKIERhbmllbCBTdGVuYmVyZwogLSBBIGJ1ZywgcG9pbnRlZCBvdXQgdG8gbWUgYnkgRHIgSC4gVC4gTGV1bmcsIGNhdXNlZCBjdXJsIHRvIGNyYXNoIG9uIHRoZSAtQQogICBmbGFnIG9uIGNlcnRhaW4gc3lzdGVtcy4gQWN0dWFsbHksIGFsbCBzeXN0ZW1zIHNob3VsZCd2ZSEKCiAtIEFkZGVkIGEgZmV3IGRlZmluZXMgdG8gbWFrZSBkaXJlY3Rvcmllcy9maWxlIG5hbWVzIGdldCBidWlsZCBuaWNlciAod2l0aCBfCiAgIGluc3RlYWQgb2YgLiBhbmQgXCBpbnN0ZWFkIG9mIC8gaW4gd2luMzIpLgoKIC0gc3RldmUgPGZpc2sgYXQgcG9sYXIuYm93ZG9pbi5lZHU+IHJlcG9ydGVkIGEgd2VpcmQgYnVnIHRoYXQgb2NjdXJlZCBpZiB0aGUKICAgZnRwIHNlcnZlciByZXNwb25zZSBsaW5lIGhhZCBhIHBhcmVudGhlc2lzIG9uIHRoZSBsaW5lIGJlZm9yZSB0aGUgKHNpemUpCiAgIGluZm8uIEkgaG9wZSBpdCB3b3JrcyBiZXR0ZXIgbm93IQoKVmVyc2lvbiA1LjIuMQoKIFN0ZXZlbiBHLiBKb2huc29uIChEZWMgMTQsIDE5OTgpCiAtIEJyb3VnaHQgYSBmaXggdGhhdCBjb3JyZWN0ZWQgYSBjcmFzaCBpbiA1LjIgZHVlIHRvIGJhZCB0cmVhdG1lbnQgb2YgdGhlCiAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4KClZlcnNpb24gNS4yCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTQsIDE5OTgpCiAtIFJld3JvdGUgdGhlIG1raGVscCBzY3JpcHQgYW5kIG5vdywgdGhlIG1raGVscC5wbCBzY3JpcHQgZ2VuZXJhdGVzIHRoZQogICBodWdlaGVscC5jIGZpbGUgZnJvbSB0aGUgUkVBRE1FICphbmQqIHRoZSBtYW4gcGFnZSBmaWxlIGN1cmwuMS4gQnkgdXNpbmcKICAgYm90aCBmaWxlcywgSSBubyBsb25nZXIgbmVlZCB0byBoYXZlIGRvdWJsZSBpbmZvcm1hdGlvbiBpbiBib3RoIHRoZSBtYW4KICAgcGFnZSBhbmQgdGhlIFJFQURNRSBhcyB3ZWxsLiBTbywgd2luMzItdXNlcnMgd2lsbCBvbmx5IGhhdmUgdGhlIGh1Z2VoZWxwLmMKICAgZmlsZSBmb3IgYWxsIGluZm8sIGJ1dCB0aGVuLCB0aGV5IGRvd25sb2FkIHRoZSBwbGFpbiBiaW5hcnkgbW9zdCB0aW1lcwogICBhbnl3YXkuCgogLSBnY2MyLjguMSB3aXRoIHRoZSAtV2FsbCBmbGFnIGNvbXBsYWludHMgYSBsb3Qgb24gc3Vic2NyaXB0IGhhcyB0eXBlIGBjaGFyJwogICBpZiBJIGRvbid0IGV4cGxpY2l0bHkgdHlwZWNhc3QgdGhlIGFyZ3VtZW50IHRvIGlzZGlnaXQoKSBvciBpc3NwYWNlKCkgdG8KICAgaW50LiBTbyBJIGRpZCB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoYXQgdG9vLgoKIC0gQWRkZWQgY2hlY2tzIGZvciAnbG9uZyBkb3VibGUnIGFuZCAnbG9uZyBsb25nJyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gSQogICBuZWVkIHRob3NlIGZvciB0aGUgbXByaW50Zi5jIHNvdXJjZSB0byBjb21waWxlIHdlbGwgb24gbm9uIGxvbmcgbG9uZwogICBjb21mb3JtaW5nIHN5c3RlbXMhCgpWZXJzaW9uIDUuMSAobm90IHB1YmxpY2x5IHJlbGVhc2VkKQoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDEwLCAxOTk4KQogLSBJIGdvdCBhIHJlcXVlc3QgZm9yIGEgcHJlLWNvbXBpbGVkIE5UIEFscGhhIHZlcnNpb24uIEFueW9uZT8KCiAtIEFkZGVkIEx5bngvQ0VSTiB3d3cgbGliIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQuIFRoYXQgbWVhbnMgY3VybAogICBub3cgcmVhZHMgYW5kIHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgoKCUhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBGVFBfUFJPWFksIEdPUEhFUl9QUk9YWQoKICAgVGhleSBzaG91bGQgYmUgc2V0IGZvciBwcm90b2NvbC1zcGVjaWZpYyBwcm94aWVzLiBHZW5lcmFsIHByb3h5IHNob3VsZCBiZQogICBzZXQgd2l0aAoJCglBTExfUFJPWFkKCiAgIEFuZCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGhvc3QgbmFtZXMgdGhhdCBzaG91bGRuJ3QgZ28gdGhyb3VnaCBhbnkKICAgcHJveHkgaXMgc2V0IGluIChvbmx5IGFuIGFzdGVyaXNrLCAnKicgbWF0Y2hlcyBhbGwgaG9zdHMpLgoKCU5PX1BST1hZCgogICBUaGUgdXNhZ2Ugb2YgdGhlIC14Ly0tcHJveHkgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAtIFByb3h5IGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGggYSBwcm9jb3RvbDovLyBwcmVmaXguCgogLSBXcm90ZSB0aGUgY3VybC4xIG1hbiBwYWdlLgoKIC0gSW50cm9kdWNlZCBhIHdob2xlIG5ldyBkeW5hbWljIGJ1ZmZlciBzeXN0ZW0gZm9yIGFsbCBzcHJpbnRmKClzLiBJdCBpcwogICBiYXNlZCBvbiB0aGUgKnByaW50ZigpIHBhY2thZ2UgYnkgeW91cnMgdHJ1bHkgYW5kIEJqb3JuIFJlZXNlLiBIb3BlZnVsbHksCiAgIHRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgYnVmZmVyIG92ZXJmbG93IHJpc2tzIGxlZnQgbm93LgoKIC0gQWgsIEkgc2hvdWxkIG1lbnRpb24gSSd2ZSBjb21waWxlZCBhbmQgYnVpbHQgY3VybCBzdWNjZXNzZnVsbHkgdW5kZXIKICAgc29sYXJpcyAyLjYgd2l0aCBnY2Mgbm93LCBnY2MgMi43LjIgd29uJ3Qgd29yayBidXQgMi44LjEgZGlkIG9rLgoKIE9yZW4gVGlyb3NoIChEZWMgMywgMTk5OCkKIC0gQnJvdWdodCB0d28gLnNwZWMgZmlsZXMsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIChMaW51eCkgUmVkaGF0IHN0eWxlIFJQTQogICBwYWNrYWdlcy4gVGhleSdyZSBuYW1lZCBjdXJsLnNwZWMgYW5kIGN1cmwtc3NsLnNwZWMuCgogVHJveSBFbmdlbAogLSBTdXBwbGllZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmb3IgZWFzeSBjb21waWxpbmcgd2l0aCBWQysrIHVuZGVyIFdpbjMyLgoKVmVyc2lvbiA1LjAKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxLCAxOTk4KQogLSBOb3QgYSBzaW5nbGUgYnVnIHJlcG9ydCBpbiBhZ2VzLgogLSBDb3JyZWN0ZWQgZ2V0cGFzcy5jIGFuZCBtYWluLmMgdG8gY29tcGlsZSB3YXJuaW5nIGFuZCBlcnJvciBmcmVlIHdpdGggdGhlCiAgIFdpbjMyIFZDKysgY3JhcC4KClZlcnNpb24gNS4wIGJldGEgMjQKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAyMCwgMTk5OCkKCiBIT1cgVE8gQlVJTEQgQSBSRUxFQVNFIEFSQ0hJVkU6CgogKiBQcmUtcmVxdWlzaXRlIHNvZnR3YXJlOgogICBXaGF0CQkgICAgIFRvIGJ1aWxkIHdoYXQgICAgICAgICAgICAgUmVhZHMgZGF0YSBmcm9tCiAgID09PT0gICAgICAgICAgICAgID09PT09PT09PT09PT0gICAgICAgICAgICAgPT09PT09PT09PT09PT09CiAgIEdOVSBhdXRvbWFrZSAgICAgIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00ICAgY29uZmlndXJlLmluCiAgICAgR05VIG1ha2UoMSkgICAgICAtICIgLQogICAgIEdOVSBnY2MoMSkgICAgICAgLSAiIC0KICAgR05VIGF1dG9jb25mICAgICAgY29uZmlndXJlICAgICAgICAgICAgICAgICBjb25maWd1cmUuaW4KICAgR05VIGF1dG9oZWFkZXIoMikgY29uZmlnLmguaW4JICAgICAgIGNvbmZpZ3VyZS5pbiwgYWNjb25maWcuaAoKICogTWFrZSBzdXJlIGFsbCBmaWxlcyB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBhcmNoaXZlIGFyZSBwdXQgaW4gRklMRVMuCgogKiBSdW4gJy4vbWFrZXRneicgYW5kIGVudGVyIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBuZXcgdG8gYmVjb21lIGFyY2hpdmUuCgogICBtYWtldGd6IGRvZXM6CgogICAtIEVudGVycyB0aGUgbmV3bHkgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBpbiB1cmwuaC4KICAgLSAoSWYgeW91IGRvbid0IGhhdmUgYXV0b21ha2UsIHRoaXMgc2NyaXB0IHdpbGwgd2FybiBhYm91dCB0aGF0LCBidXQgdW5sZXNzCiAgICAgeW91IGhhdmUgY2hhbmdlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMsIHRoYXQgaXMgbm90aGluZyB0byBjYXJlIGFib3V0LikKICAgICBJZiB5b3UgaGF2ZSBpdCwgaXQnbGwgcnVuIGl0LgogICAtIElmIHlvdSBoYXZlIGF1dG9jb25mLCB0aGUgY29uZmlndXJlLmluIHdpbGwgYmUgZWRpdGVkIHRvIGdldCB0aGUgbmV3bHkKICAgICBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGFuZCBhdXRvY29uZiB3aWxsIGJlIHJ1bi4KICAgLSBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBjdXJsLTx2ZXJzaW9uPi4gKEFjdHVhbGx5LCBpdCB1c2VzIHRoZSBiYXNlCiAgICAgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXAgdG8gdGhlIGZpcnN0ICctJy4pCiAgIC0gQ29waWVzIGFsbCBmaWxlcyBtZW50aW9uZWQgaW4gRklMRVMgdG8gdGhlIG5ldyBkaXJlY3RvcnkuIFNhdmluZwogICAgIHBlcm1pc3Npb25zIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlLgogICAtIFVzZXMgdGFyIHRvIGNyZWF0ZSBhbiBhcmNoaXZlIG9mIGl0IGFsbCwgbmFtZWQgY3VybC08dmVyc2lvbj4udGFyLmd6CiAgIC0gZ3ppcHMgdGhlIGFyY2hpdmUKICAgLSBSZW1vdmVzIHRoZSBuZXcgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzLgoKICogV2hlbiBkb25lLCB5b3UgaGF2ZSBhbiBhcmNoaXZlIHN0b3JlZCBpbiB5b3VyIGRpcmVjdG9yeSBuYW1lZAogICBjdXJsLTx2ZXJzaW9uPi50YXIuZ3ouCgogICBEb25lIQoKICAgKDEpIFRoZXkncmUgcmVxdWlyZWQgdG8gbWFrZSBhdXRvbWFrZSBydW4gcHJvcGVybHkuCiAgICgyKSBJdCBpcyBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgdGhlIEdOVSBhdXRvY29uZiBhcmNoaXZlLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDE4LCAxOTk4KQogLSBJIGNoYW5nZWQgdGhlIFRBRy1zeXN0ZW0uIElmIHlvdSBldmVyIHVzZWQgdXJsZ2V0KCkgZnJvbSB0aGlzIHBhY2thZ2UgaW4KICAgYW5vdGhlciBwcm9kdWN0LCB5b3UgbmVlZCB0byByZWNvbXBpbGUgd2l0aCB0aGUgbmV3IGhlYWRlcnMuIEkgZGlkIHRoaXMKICAgbmV3IHN0dWZmIHRvIGJldHRlciBkZWFsIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyBhbmQgc3lzdGVtIHdpdGggZGlmZmVyZW50CiAgIHZhcmlhYmxlIHNpemVzLiBJIHRoaW5rIGl0IG1ha2VzIGl0IGEgbGl0dGxlIG1vcmUgcG9ydGFibGUuIFRoaXMgcHJvdmVzCiAgIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIHByb2JsZW1hdGljIElSSVggY29tcGlsZXIhCiAtIFdpbjMyIGNvbXBpbGVkIHdpdGggYSBzaWxseSBlcnJvci4gQ29ycmVjdGVkIG5vdy4KIC0gQnJpYW4gQ2hhcGxpbiByZXBvcnRlZCB5ZXQgYW5vdGhlciBwcm9ibGVtIGluCiAgIG11bHRpbGluZSBGVFAgcmVzcG9uc2VzLiBJJ3ZlIHRyaWVkIHRvIGNvcnJlY3QgaXQuIEkgbWFpbGVkIGhpbSBhIG5ldwogICB2ZXJzaW9uIGFuZCBJIGhvcGUgaGUgZ2V0cyBiYWNrIHNvb24gd2l0aCBwb3NpdGl2ZSBmZWVkYmFjayEKIC0gSW1wcm92ZWQgdGhlICdtYWtldGd6JyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRyZWUgd2hpY2ggaXQgbWFrZXMKICAgYW4gYXJjaGl2ZSBmcm9tIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIHJlbmFtaW5nIG9mIHRoZSBjdXJyZW50IG9uZS4KIC0gTWFpbGluZyBsaXN0IG9wZW5lZCAoc2VlIFJFQURNRSkuCiAtIE1hZGUgLXYgbW9yZSB2ZXJib3NlIG9uIHRoZSBQQVNWIHNlY3Rpb24gb2YgZnRwIHRyYW5zZmVycy4gTm93IGl0IHRlbGxzCiAgIGhvc3QgbmFtZSBhbmQgSVAgb2YgdGhlIG5ldyBob3N0IChhbmQgcG9ydCBudW1iZXIpLiBJIGFsc28gYWRkZWQgYSBzZWN0aW9uCiAgIGFib3V0IFBPUlQgdnMgUEFTViBpbiB0aGUgUkVBRE1FLgoKVmVyc2lvbiA1LjAgYmV0YSAyMQoKIEFuZ3VzIE1hY2theSAoTm92IDE1LCAxOTk4KQogLSBJbnRyb2R1Y2VkIGF1dG9tYWtlIHN0dWZmLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEzLCAxOTk4KQogLSBKdXN0IG1hZGUgYSBzdWNjZXNzZnVsIEdFVCBvZiBhIGRvY3VtZW50IGZyb20gYW4gU1NMLXNlcnZlciB1c2luZyBteSBvd24KICAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24hIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgdG8gYmUgaW4gUEVNCiAgIGZvcm1hdC4gWW91IGRvIHRoYXQgdGhlIGVhc2llc3Qgd2F5IChhbHRob3VnaCBub3QgKnRoYXQqIGVhc3kpIGJ5CiAgIGRvd25sb2FkaW5nIHRoZSBTU0x5ZWF5IFBLQ1MjMTItcGF0Y2ggYnkgRHIgU3RlcGhlbiBOLiBIZW5zb24gZnJvbSBoaXMgc2l0ZQogICBhdDogaHR0cDovL3d3dy5kcmgtY29uc3VsdGFuY3kuZGVtb24uY28udWsvLiBVc2luZyBoaXMgdG9vbCwgeW91IGNhbgogICBjb252ZXJ0IGFueSBtb2Rlcm4gTmV0c2NhcGUgb3IgKGV2ZW4pIE1TSUUgY2VydGlmaWNhdGUgdG8gUEVNLWZvcm1hdC4gIFVzZQogICBpdCB3aXRoICdjdXJsIC1FIDxjZXJ0aWZpY2F0ZTpwYXNzd29yZD4gaHR0cHM6Ly9zaXRlLmNvbScuICBJZiB0aGlzIGlzbid0IGEKICAgY29vbCBmZWF0dXJlLCB0aGVuIEkgZG9uJ3Qga25vdyB3aGF0IGNvb2wgZmVhdHVyZXMgbG9vayBsaWtlISA7LSkKIC0gV29ya2luZyBzbG93bHkgb24gdGVsbmV0IGNvbm5lY3Rpb25zLiAjZGVmaW5lIFRSWV9URUxORVQgdG8gdHJ5IGl0IG91dC4KICAgKGN1cmwgLXUgdXNlcjpwYXNzd2QgInRlbG5ldDovL2hvc3QuY29tL2NhdCAubG9naW4iIGlzIG9uZSBleGFtcGxlKSBJIGRvCiAgIGhhdmUgcHJvYmxlbSB0byBkZWZpbmUgaG93IGl0IHNob3VsZCB3b3JrLiBUaGUgcHJpbWUgcHVycG9zZSBmb3IgdGhpcyBtdXN0CiAgIGJlIHRvIGdldCAoOGJpdCBjbGVhbikgZmlsZXMgdmlhIHRlbG5ldCwgYW5kIGl0IHJlYWxseSBpc24ndCB0aGF0IGVhc3kgdG8KICAgZ2V0IGZpbGVzIHRoaXMgd2F5LiBTdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBcbiBiZWluZyBjb252ZXJ0ZWQgdG8gXHJcbi4KCiBBbmd1cyBNYWNrYXkgKE5vdiAxMiwgMTk5OCkKIC0gQ29ycmVjdGVkIGFub3RoZXIgYnVnIGluIHRoZSBsb25nIHBhcmFtZXRlciBuYW1lIHBhcnNlci4KIC0gTW9kaWZpZWQgZ2V0cGFzcy5jIChOT1RFOiBzZWUgdGhlIHNwZWNpYWwgbGljZW5zaW5nIGluIHRoZSB0b3Agb2YgdGhhdAogICBzb3VyY2UgZmlsZSkuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTIsIDE5OTgpCiAtIFdlIG1heSBoYXZlIHJlbW92ZWQgdGhlIHNpbGx5IHdhcm5pbmdzIGZyb20gdXJsLmMgd2hlbiBjb21waWxlZCB1bmRlciBJUklYLgogICBUaGFua3MgYWdhaW4gdG8gQmpvcm4gUmVlc2UgYW5kIE1hcnRpbiBTdGFhZWwuCiAtIFdyb3RlIGZvcm1maW5kLnBsIHdoaWNoIGlzIGEgbmV3IHBlcmwgc2NyaXB0IGludGVuZGVkIHRvIGhlbHAgeW91IGZpbmQgb3V0CiAgIGhvdyBhIEZPUk0gc3VibWlzc2lvbiBzaG91bGQgYmUgZG9uZS4gVGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsgdG8gZ2V0CiAgIHJlYWxseSBnb29kLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDExLCAxOTk4KQogLSBNYWRlIHRoZSBIVFRQIGhlYWRlci1jaGVja2VyIGFjY2VwdCB3aGl0ZSBzcGFjZXMgYmVmb3JlIHRoZSBIVFRQLzEuPyBsaW5lLgogICBBcHBlYXJhbnRseSBzb21lIHByb3hpZXMvc2l0ZXMgYWRkIHN1Y2ggYXQgdGltZXMgKG15IHRlc3QgcHJveHkgZGlkIHdoZW4gSQogICBkb3dubG9hZGVkIGEgZ29waGVyIHBhZ2Ugd2l0aCBpdCkhCiAtIE1vdmVkIHRoZSBmb3JtZXIgLWggdG8gLU0gYW5kIG1hZGUgLWggc2hvdyB0aGUgc2hvcnQgaGVscCB0ZXh0IGluc3RlYWQuIEkKICAgaGFkIHRvIGVuYWJsZSBhIGZvcmNlZCBoZWxwIHRleHQgb3B0aW9uLiBOb3cgYW4gZXZlbiBzaG9ydGVyIGhlbHAgdGV4dCB3aWxsCiAgIGJlIHByZXNlbnRlZCB3aGVuIGFuIHVua25vd24gb3B0aW9uIGFuZCBzaW1pbGFyLCBpcyB1c2VkLgogLSBzdGRjaGVhZGVycy5oIGRpZG4ndCB3b3JrIHdpdGggSVJJWCA2LjQgbmF0aXZlIGNjIGNvbXBpbGVyLiBJIGhvcGUgbXkKICAgY2hhbmdlcyBkb24ndCBtYWtlIG90aGVyIHZlcnNpb25zIGdvIG51dHMgaW5zdGVhZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMCwgMTk5OCkKIC0gQWRkZWQgYSB3ZWlyZCBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgdGhlIHNpbGx5IEFJWAogICB3YXJuaW5ncyBhYm91dCBteSAjZGVmaW5lIHN0cmNhc2VjbXAoKSBzdHVmZi4gSSBkbyB0aGF0IGRlZmluZSB0byBwcmV2ZW50CiAgIG1lIGFuZCBvdGhlciBjb250cmlidXRvcnMgdG8gYWNjaWRlbnRhbHkgdXNlIHRoYXQgZnVuY3Rpb24gbmFtZSBpbnN0ZWFkCiAgIG9mIHN0cmVxdWFsKCkuLi4KIC0gSSBidWdmaXhlZCBBbmd1cydzIGdldHBhc3MuYyB2ZXJ5IGxpdHRsZS4KIC0gRml4ZWQgdGhlIHZlcmJvc2UgZmxhZyBuYW1lcyB0byBnZXRvcHQtc3R5bGUsIGkuZSAnY3VybCAtLWxvYycgd2lsbCBiZQogICBzdWZmaWNpZW50IGluc3RlYWQgb2YgLS1sb2NhdGlvbiBhcyAibG9jIiBpcyBhIHVuaXF1ZSBwcmVmaXguIEFsc28sIGFueXRoaW5nCiAgIGFmdGVyIGEgJy0tJyBpcyB0cmVhdGVkIGFzIGFuIFVSTC4gU28gaWYgeW91IGRvIGhhdmUgYSBob3N0IHdpdGggYSB3ZWVlaXJkCiAgIG5hbWUgeW91IGNhbiBkbyAnY3VybCAtLSAtaG9zdC5jb20nLgogLSBBbm90aGVyIGdldG9wdC1hZGp1c3Q7IGN1cmwgbm93IGFjY2VwdHMgZmxhZ3MgYWZ0ZXIgdGhlIFVSTCBvbiB0aGUgY29tbWFuZAogICBsaW5lLiAnY3VybCB3d3cuZm9vLmNvbSAtTycgaXMgcGVyZmVjdGx5IHZhbGlkLgogLSBDb3JyZWN0ZWQgdGhlIC5jdXJscmMgcGFyc2VyIHNvIHRoYXQgc3RydG9rKCkgaXMgbm8gbG9uZ2VyIHVzZWQgYW5kIEkKICAgYmVsaWV2ZSBpdCB3b3JrcyBiZXR0ZXIuIEV2ZW4gVVJMcyBjYW4gYmUgc3BlY2lmaWVkIGluIGl0IG5vdy4KCiBBbmd1cyBNYWNrYXkgKE5vdiA5LCAxOTk4KQogLSBSZXBsYWNlZCBnZXRwYXNzLmMgd2l0aCBhIG5ld2x5IHdyaXR0ZW4gb25lLCBub3QgdW5kZXIgR1BMIGxpY2Vuc2UKIC0gQ2hhbmdlZCBPUyB0byBhICNkZWZpbmUgaW4gY29uZmlnLmggaW5zdGVhZCBvZiBjb21waWxlciBmbGFnCiAtIE1ha2VmaWxlIG5vdyB1c2VzIC1ESEFWRV9DT05GSUdfSAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDksIDE5OTgpCiAtIE9rLCBJIGV4cGFuZGVkIHRoZSB0Z3otdGFyZ2V0IHRvIHVwZGF0ZSB0aGUgdmVyc2lvbiBzdHJpbmcgb24gZWFjaCBvY2NhdGlvbgogICBJIGJ1aWxkIGEgcmVsZWFzZSBhcmNoaXZlIQogLSBJIHJlYWN0ZWQgb24gQW5ndXMgTWFja2F5J3MgaW5pdGlhdGl2ZSBhbmQgcmVtYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2VyIHRvCiAgIGJlIG1vcmUgZ2V0b3B0IGNvbXBsaWFudC4gQ3VybCBub3cgc3VwcG9ydHMgIm1lcmdlZCIgZmxhZ3MgYXMgaW4KCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIGhlbHBlZCBtZSBkZXNpZ24gdGhlIHVzZXIKICAgaW50ZXJmYWNlIGZvciB0aGlzIGJlYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHF1aXRlIHNvbWUgZG9jcywKICAgc2luY2UgaXQgaGFzIHR1cm5lZCBvdXQgbm90IG9ubHkgcXVpdGUgY2FwYWJsZSwgYnV0IGFsc28gY29tcGxpY2F0ZWQhIDotKQogLSBBIG5vdGUgaGVyZSwgc2luY2UgSSd2ZSByZWNlaXZlZCBtYWlsIGFib3V0IGl0LiBTU0xlYXkgdmVyc2lvbnMgcHJpb3IgdG8KICAgMC44IHdpbGwgKm5vdCogd29yayB3aXRoIGN1cmwhCiAtIFdpbCBMYW5nZm9yZCByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBidWcgaW4gbXkgZ2V0ZW52KCJIT01FIikKICAgdXNhZ2UgZm9yIHdpbjMyIHN5c3RlbXMuIEkgaW50cm9kdWNlIGdldGVudi5jIHRvIGJldHRlciBjb3BlIHdpdGgKICAgdGhpcy4gTXIgRW5nZWwgaGVscHMgbWUgd2l0aCB0aGUgZGV0YWlscyBhcm91bmQgdGhhdC4uLgogLSBBIGxpdHRsZSBub3RlIHRvIG15c2VsZiBhbmQgb3RoZXJzLCBJIHNob3VsZCBtYWtlIHRoZSB3aW4zMi1iaW5hcnkgYnVpbHQKICAgd2l0aCBTU0wgc3VwcG9ydC4uLgogLSBSeWFuIE5lbHNvbiBzZW50IG1lIGNvbW1lbnRzIGFib3V0IGJ1aWxkaW5nIGN1cmwKICAgd2l0aCBTU0wgdW5kZXIgRnJlZUJTRC4gU2VlIHRoZSBNYWtlZmlsZSBmb3IgZGV0YWlscy4gVXNpbmcgdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQsIGl0IHNob3VsZCB3b3JrIGJldHRlciBhbmQgYXV0b21hdGljYWxseSBub3cuLi4KIC0gQ2xlYW5lZCB1cCBpbiB0aGUgcG9ydCBudW1iZXIgbWVzcyBpbiB0aGUgc291cmNlLiBObyBsb25nZXIgc3RvcmVzIGFuZCB1c2VzCiAgIHByb3h5IHBvcnQgbnVtYmVyIHNlcGFyYXRlIGZyb20gbm9ybWFsIHBvcnQgbnVtYmVyLgogLSAnY29uZmlndXJlJyBzY3JpcHQgd29ya2luZy4gQ29uZmlybWVkIGNvbXBpbGVzIG9uOgogICAgSG9zdCAgICAgICAgIFNTTCAgQ29tcGlsZXIKICAgIFN1bk9TIDUuNSAgICBubyAgIGdjYwogICAgU3VuT1MgNS41LjEgIHllcyAgZ2NjCiAgICBTdW5PUyA1LjYgICAgbm8gICBjYyAgKHdpdGggZ2NjLCBpdCBoYXMgdGhlICJnY2MgaW5jbHVkZSBmaWxlcyIgcHJvYmxlbSkKICAgIFN1bk9TIDQuMS4zICBubyAgIGdjYyAod2l0aG91dCBBTlNJIEMgaGVhZGVycykKICAgIFN1bk9TIDQuMS4yICBubyAgIGdjYyAobmF0aXZlIGNvbXBpbGVyIGZhaWxlZCkKICAgIExpbnV4IDIuMC4xOCBubyAgIGdjYwogICAgTGludXggMi4wLjMyIHllcyAgZ2NjCiAgICBMaW51eCAyLjAuMzUgbm8gICBnY2MgKHdpdGggZ2xpYmMpCiAgICBJUklYIDYuMiAgICAgbm8gICBnY2MgKGNjIGNvbXBpbGVzIGdlbmVyYXRlIGEgZmV3IHdhcm5pbmdzKQogICAgSVJJWCA2LjQgICAgIG5vICAgY2MgIChnZW5lcmF0ZWQgd2FybmluZ3MgdGhvdWdoKQogICAgV2luMzIgICAgICAgIG5vICAgQm9ybGFuZAogICAgT1NGNC4wCSBubyAgID8KCiAtIE9vb3BzLiBUaGUgNWJldGEgKGFuZCA0LjEwKSB1bmRlciB3aW4zMiBmYWlsZWQgaWYgdGhlIEhPTUUgdmFyaWFibGUgd2Fzbid0CiAgIHNldC4KIC0gV2hlbiB1c2luZyBhIHByb3h5LCBjdXJsIG5vdyBndWVzc2VzIGFuZCB1c2VzIHRoZSBwcm90b2NvbCBwYXJ0IGluIGNhc2VzCiAgIGxpa2U6CgljdXJsIC14IHByb3h5OjgwIHd3dy5zaXRlLmNvbQogICBQcm94aWVzIG5vcm1hbGx5IGdvIG51dHMgdW5sZXNzIGh0dHA6Ly8gaXMgcHJlcGVuZGVkIHRvIHRoZSBob3N0IG5hbWUsIHNvCiAgIGlmIGN1cmwgaXMgdXNlZCBsaWtlIHRoaXMsIGl0IGd1ZXNzZXMgcHJvdG9jb2wgYW5kIGFwcGVuZHMgdGhlIHByb3RvY29sCiAgIHN0cmluZyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcHJveHkuIEl0IGFscmVhZHkgZGlkIHRoaXMgd2hlbiB1c2VkCiAgIHdpdGhvdXQgcHJveHkuCiAtIEJldHRlciBwb3J0IHVzYWdlIHdpdGggU1NMIHRocm91Z2ggcHJveHkgbm93LiBJZiB5b3Ugc3BlY2lmaWVkIGEgZGlmZmVyZW50CiAgIGh0dHBzLXBvcnQgd2hlbiBhY2Nlc3NpbmcgdGhyb3VnaCBhIHByb3h5LCBpdCBkaWRuJ3QgdXNlIHRoYXQgbnVtYmVyCiAgIGNvcnJlY3RseS4gSSBhbHNvIHJld3JvdGUgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIHN0dWZmIHJlYWQgZnJvbSB0aGUKICAgcHJveHkgd2hlbiB5b3Ugd2FubmEgY29ubmVjdCB0aHJvdWdoIGl0IHdpdGggU1NMLgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgd29yayBhcm91bmQgb25lIG9mIHRoZSBjb21waWxlcgogICB3YXJuaW5ncyBvbiBJUklYIG5hdGl2ZSBjYyBjb21waWxlcy4KClZlcnNpb24gNC4xMCAoT2N0IDI2LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEpvaG4gQS4gQnJpc3RvciBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIHN1Z2dlc3RlZCBjdXJsIHdvdWxkIHN1cHBvcnQgY29va2llcy4KICAgSSBhZGRlZCAtYi8tLWNvb2tpZSB0byBlbmFibGUgZnJlZS10ZXh0IGNvb2tpZSBkYXRhIHRvIGJlIHBhc3NlZC4gVGhlcmUncwogICBhbHNvIGEgbGl0dGxlIGJsdXJiIGFib3V0IGdlbmVyYWwgY29va2llIHN0dWZmIGluIHRoZSBSRUFETUUvaGVscCB0ZXh0LgogLSBkbWggPGRtaCBhdCBqZXQuZXM+IHN1Z2dlc3RlZCBIVFRQIHJlc3VtZSBjYXBhYmlsaXRpZXMuIEFsdGhvdWdoIHlvdSBjb3VsZAogICBtYW51YWxseSBnZXQgY3VybCB0byByZXN1bWUgSFRUUCBkb2N1bWVudHMsIEkgbWFkZSB0aGUgLWMgcmVzdW1lIGZsYWcgd29yawogICBmb3IgSFRUUCB0b28gKHVubGVzcyAtciBpcyB1c2VkIHRvbywgd2hpY2ggd291bGQgYmUgdmVyeSBvZGQgYW55d2F5KS4KIC0gQWRkZWQgY2hlY2tsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gSXQgaXMgYSBzdGlsbCBleHBlcmltZW50YWwgcGVybCBzY3JpcHQKICAgdGhhdCBjaGVja3MgYWxsIGxpbmtzIG9mIGEgd2ViIHBhZ2UgYnkgdXNpbmcgY3VybC4KIC0gUmVhcnJhbmdlZCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkgYSBsaXR0bGUuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIGluIHRoZQogICBzcmMvIGRpciBmcm9tIG5vdyBvbiEKIC0gVmVyc2lvbiA0LjkgYW5kIGhlcmVhZnRlciwgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZS4KICAgSSBoYXZlIG5vdyB1cGRhdGVkIHRoZSBMRUdBTCBmaWxlIGV0YyBhbmQgbm93IHRoaXMgaXMgcmVsZWFzZWQgdXNpbmcgdGhlCiAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgdG8gYXZvaWQgdGhlIHBsYWd1ZSBrbm93biBhcyAidGhlIEdQTCB2aXJ1cyIuIFlvdQogICBtdXN0IG1ha2UgdGhlIHNvdXJjZSBhdmFpbGFibGUgaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYW5kL29yIHJlZGlzdHJpYnV0ZQogICBjdXJsLCBidXQgaWYgeW91IGRlY2lkZSB0byB1c2UgY3VybCB3aXRoaW4gc29tZXRoaW5nIGVsc2UgeW91IGRvIG5vdCBuZWVkCiAgIHRvIG9mZmVyIHRoZSB3b3JsZCB0aGUgc291cmNlIHRvIHRoYXQgdG9vLgogLSBDdXJsIGRpZCBub3QgbGlrZSBIVFRQIHNlcnZlcnMgdGhhdCBzZW50IG5vIGhlYWRlcnMgYXQgYWxsIG9uIGEgR0VUCiAgIHJlcXVlc3QuICBJdCBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyMDY4IGJ1dCBhcHBlYXJhbnRseSBzb21lIHNlcnZlcnMgZG8KICAgdGhhdCBhbnl3YXkuICBUaGFua3MgdG8gR29yZG9uIEJlYXRvbiBmb3IgdGhlIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbC4gVGhpcyBtYWtlcwogICBjdXJsIEFUVEVNUFQgdG8gZm9sbG93IHRoZSBMb2NhdGlvbjogcmVkaXJlY3QgaWYgb25lIGlzIHByZXNlbnQgaW4gdGhlIEhUVFAKICAgaGVhZGVycy4gSWYgLWkgb3IgLUkgaXMgdXNlZCB3aXRoIHRoaXMgZmxhZywgeW91IHdpbGwgc2VlIGhlYWRlcnMgZnJvbSBhbGwKICAgc2l0ZXMgdGhlIExvY2F0aW9uOiBwb2ludHMgdG8uIERvIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VydmVyIGNhbiBwb2ludCB0byBhCiAgIHNlY29uZCB0aGF0IHBvaW50cyB0byBhIHRoaXJkIGV0Yy4gSXQgc2VlbXMgdGhlIExvY2F0aW9uOiBwYXJhbWV0ZXIgKHNhaWQKICAgdG8gYmUgYW4gQWJzb2x1dGVVUkkgaW4gUkZDMjA2OCkgaXNuJ3QgYWx3YXlzIGFic29sdXRlLi4gOi0vIEFueXdheSwgSSd2ZQogICBtYWRlIGN1cmwgQVRURU1QVCB0byBkbyB0aGUgYmVzdCBpdCBjYW4gdG8gZGVhbCB3aXRoIHRoZSByZWFsaXR5LgogLSBBZGRlZCBnZXRsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gZ2V0bGlua3MucGwgc2VsZWN0aXZlbHkgZG93bmxvYWRzCiAgIGZpbGVzIHRoYXQgYSB3ZWIgcGFnZSBsaW5rcyB0by4KClZlcnNpb24gNC44LjQKIERhbmllbCBTdGVuYmVyZwogLSBBcyBKdWxpYW4gUm9tZXJvIE5pZXRvIHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIHBvaW50ZWQgb3V0LCB0aGUgd2luMzIgdmVyc2lvbiBvZiA0LjggKGFuZCBwcm9iYWJseSBhbGwKICAgb3RoZXIgdmVyc2lvbnMgZm9yIHdpbjMyKSBkaWRuJ3Qgd29yayB3aXRoIGJpbmFyeSBmaWxlcyBzaW5jZSBJJ20gdG9vIHVzZWQKICAgdG8gdGhlIFVOSVggc3R5bGUgZm9wZW4oKSB3aGVyZSBiaW5hcnkgYW5kIHRleHQgZG9uJ3QgZGlmZmVyLi4uCiAtIFJhbHBoIEJlY2ttYW5uIGJyb3VnaHQgbWUgc29tZSBjaGFuZ2VzIHRoYXQgbGV0cyBjdXJsIGNvbXBpbGUgZXJyb3IgYW5kCiAgIHdhcm5pbmcgZnJlZSB3aXRoIC1XYWxsIC1wZWRhbnRpYyB3aXRoIGcrKy4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvCiAgIGNsZWFuIG9mZiBzb21lIHVudXNlZCB2YXJpYWJsZXMgYW5kIHNpbWlsYXIuCiAtIFJhbHBoIEJlY2ttYW5uIG1hZGUgbWUgYXdhcmUgb2YgYSByZWFsbHkgb2RkIGJ1ZyBub3cgY29ycmVjdGVkLiBXaGVuIGN1cmwKICAgcmVhZCBhIHNldCBvZiBoZWFkZXJzIGZyb20gYSBIVFRQIHNlcnZlciwgZGl2aWRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgcmVhZAogICBhbmQgdGhlIGZpcnN0IHJlYWQgc2hvd2VkIGEgZnVsbCBsaW5lICpleGFjdGx5KiAoaS5lIGVuZGluZyB3aXRoIGEKICAgbmV3bGluZSksIGN1cmwgZGlkIG5vdCBiZWhhdmUgd2VsbC4KClZlcnNpb24gNC44LjMKIERhbmllbCBTdGVuYmVyZwogLSBJIHdhcyB0b28gcXVpY2sgdG8gcmVsZWFzZSA0LjguMiB3aXRoIHRvbyBsaXR0bGUgdGVzdGluZy4gT25lIG9mIHRoZQogICBjaGFuZ2VzIGlzIG5vdyByZXZlcnRlZCBzbGlnaHRseSB0byB0aGUgNC44LjEgd2F5IHNpbmNlIDQuOC4yIGNvdWxkbid0CiAgIHVwbG9hZCBmaWxlcy4gSSBzdGlsbCB0aGluayBib3RoIHByb2JsZW1zIGNvcnJlY3RlZCBpbiA0LjguMiByZW1haW4KICAgY29ycmVjdGVkLiAgUmVwb3J0ZWQgYnkgSnVsaWFuIFJvbWVybyBOaWV0by4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiByZXBvcnRlZCB0d28gRlRQIHByb3RvY29sIGVycm9ycyBjdXJsIGRpZC4gVGhleSdyZSBub3cKICAgY29ycmVjdGVkLiBCb3RoIGFwcGVhcmVkIHdoZW4gZ2V0dGluZyBmaWxlcyBmcm9tIGEgTVMgRlRQIHNlcnZlciEgOi0pCgpWZXJzaW9uIDQuOC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBsYXN0IHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gVGhlCiAgIGZpbmFsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGRpZG4ndCBoYXZlIHRvIGJlIHRoZSBmaW5hbCBzaXplIHRyYW5zZmVyZWQKICAgd2hpY2ggbWFkZSBpdCBzb21ldGltZXMgbG9vayBvZGQuCiAtIFRoYW5rcyB0byBEYXZpZCBMb25nIEkgZ290IHJpZCBvZiBhIHNpbGx5IGJ1ZyB0aGF0IGhhcHBlbmVkIGlmIGEgSFRUUC1wYWdlCiAgIGhhZCBub3RoaW5nIGJ1dCBoZWFkZXIuIEFwcGVhcmFudGx5IFNvbGFyaXMgZGVhbHMgd2l0aCBuZWdhdGl2ZSBzaXplcyBpbgogICBmd3JpdGUoKSBjYWxscyBhIGxvdCBiZXR0ZXIgdGhhbiBMaW51eCBkb2VzLi4uID1CLV0KClZlcnNpb24gNC44IChBdWcgMzEsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ29udGludWUgRlRQIGZpbGUgdHJhbnNmZXIuIC1jIGlzIHRoZSBzd2l0Y2guIE5vdGUgdGhhdCB5b3UgbmVlZCB0bwogICBzcGVjaWZ5IGEgZmlsZSBuYW1lIGlmIHlvdSB3YW5uYSByZXN1bWUgYSBkb3dubG9hZCAoeW91IGNhbid0IHJlc3VtZSBhCiAgIGRvd25sb2FkIHNlbnQgdG8gc3Rkb3V0KS4gUmVzdW1pbmcgdXBsb2FkIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBzZXJ2ZXIKICAgc2luY2UgY3VybCBpcyB0aGVuIHVzaW5nIHRoZSBub24tUkZDOTU5IGNvbW1hbmQgU0laRSB0byBnZXQgdGhlIHNpemUgb2YKICAgdGhlIHRhcmdldCBmaWxlIGJlZm9yZSB1cGxvYWQgYmVnaW5zICh0byBmaWd1cmUgb3V0IHdoaWNoIG9mZnNldCB0bwogICB1c2UpLiBVc2UgLUMgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IHlvdXJzZWxmISAtQyBpcyBoYW5keSBpZiB5b3UncmUgZG9pbmcKICAgdGhlIG91dHB1dCB0byBzb21ldGhpbmcgZWxzZSBidXQgYSBwbGFpbiBmaWxlIG9yIHdoZW4geW91IGp1c3Qgd2FudCB0byBnZXQKICAgdGhlIGVuZCBvZiBhIGZpbGUuCiAtIHJlY3Vyc2l2ZWZ0cGdldC5wbCBub3cgZmVhdHVyZXMgYSBtYXhpbXVtIHJlY3Vyc2l2ZSBsZXZlbCBhcmd1bWVudC4KClZlcnNpb24gNC43CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgc3VwcG9ydCB0byBhYm9ydCBhIGRvd25sb2FkIGlmIHRoZSBzcGVlZCBpcyBiZWxvdyBhIGNlcnRhaW4gYW1vdW50CiAgIChzcGVlZC1saW1pdCkgYnl0ZXMgcGVyIHNlY29uZCBmb3IgYSBjZXJ0YWluIChzcGVlZC10aW1lKSB0aW1lLgogLSBXcm90ZSBhIHBlcmwgc2NyaXB0ICdyZWN1cnNpdmVmdHBnZXQucGwnIHRvIHJlY3Vyc2l2ZWx5IHVzZSBjdXJsIHRvIGdldCBhCiAgIHdob2xlIGZ0cCBkaXJlY3RvcnkgdHJlZS4gSXQgaXMgbWVhbnQgYXMgYW4gZXhhbXBsZSBvZiBob3cgY3VybCBjYW4gYmUKICAgdXNlZC4gIEkgYWdyZWUgaXQgaXNuJ3QgdGhlIHdpc2VzdCB0aGluZyB0byBkbyB0byBtYWtlIGEgc2VwYXJhdGUgbmV3CiAgIGNvbm5lY3Rpb24gZm9yIGVhY2ggZmlsZSBhbmQgZGlyZWN0b3J5IGZvciB0aGlzLgoKVmVyc2lvbiA0LjYKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGZpcnN0IGF0dGVtcHQgdG8gb3B0aW9uYWxseSBwYXJzZSB0aGUgLm5ldHJjIGZpbGUgZm9yIGxvZ2luIHVzZXIKICAgYW5kIHBhc3N3b3JkLiBJZiB1c2VkIHdpdGggaHR0cCwgaXQgZW5hYmxlcyB1c2VyIGF1dGhlbnRpY2F0aW9uLiAtbiBpcwogICB0aGUgbmV3IHN3aXRjaC4KIC0gUmVtb3ZlZCB0aGUgZXh0cmEgbmV3bGluZXMgb24gdGhlIGRlZmF1bHQgdXNlci1hZ2VudCBzdHJpbmcuCiAtIENvcnJlY3RlZCB0aGUgbWlzc2luZyBmdHAgdXBsb2FkIGVycm9yIG1lc3NhZ2VzIHdoZW4gaXQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgIHZlcmJvc2UgZmxhZyBzZXQuIEdhcnkgVy4gU3dlYXJpbmdlbiBmb3VuZCBpdC4KIC0gTm93IHVzaW5nIGFsYXJtKCkgdG8gZW5hYmxlIHNlY29uZC1wcmVjaXNpb24gdGltZW91dCBldmVuIG9uIHRoZSBuYW1lCiAgIHJlc29sdmluZy9jb25uZWN0aW5nIHBoYXNlLiBUaGUgdGltZW91dCBpcyBhbHRob3VnaCByZXNldCBhZnRlciB0aGF0IGZpcnN0CiAgIHNlcXVlbmNlLiAoVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkLikgR2FyeSBXLiBTd2VhcmluZ2VuIHJlcG9ydGVkLgogLSBOb3cgc3BlbGxzICJVbmtub3duIiBwcm9wZXJseSwgYXMgaW4gIlVua25vd24gb3B0aW9uICd6JyIuLi4gOi0pCiAtIEFkZGVkIGJ1ZyByZXBvcnQgZW1haWwgYWRkcmVzcyBpbiB0aGUgUkVBRE1FLgogLSBBZGRlZCBhICJjdXJyZW50IHNwZWVkIiBmaWVsZCB0byB0aGUgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dzIHRoZSBhdmVyYWdlCiAgIHNwZWVkIHRoZSBsYXN0IDUgc2Vjb25kcy4gVGhlIG90aGVyIHNwZWVkIGZpZWxkIHNob3dzIHRoZSBhdmVyYWdlIHNwZWVkIG9mCiAgIHRoZSBlbnRpcmUgdHJhbnNmZXIgc28gZmFyLgoKVmVyc2lvbiA0LjUuMQogTGluYXMgVmVwc3RhcwogLSBTU0wgdGhyb3VnaCBwcm94eSBmaXgKIC0gQWRkZWQgLUEgdG8gYWxsb3cgVXNlci1BZ2VudDogY2hhbmdlcwoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtQSB3b3JrIHdoZW4gU1NMLXRocm91Z2gtcHJveHkuCgpWZXJzaW9uIDQuNQogTGluYXMgVmVwc3RhcwogLSBNb3JlIFNTTCBjb3JyZWN0aW9ucwogLSBJJ3ZlIGFkZGVkIGEgcG9ydCB0byBBSVguCiAtIHJ1bm5pbmcgU1NMIHRocm91Z2ggYSBwcm94eSBjYXVzZXMgYSBjaHVuayBvZiBjb2RlIHRvIGJlIGV4ZWN1dHJlZCB0d2ljZS4KICAgb25lIG9mIHRob3NlIGJsb2NrcyBuZWVkcyB0byBiZSBkZWxldGVkLgoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIC1pIGFuZCAtSSB3b3JrIGFnYWluCgpWZXJzaW9uIDQuNAogTGluYXMgVmVwc3RhcwogLSAteCBjYW4gbm93IGFsc28gc3BlY2lmeSBwcm94eXBvcnQgd2hlbiB1c2VkIGFzIGluICdwcm94eWhvc3Q6cHJveHlwb3J0JwogLSBTU0wgZml4ZXMKClZlcnNpb24gNC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgdG8gY29tcGlsZSB1bmRlciB3aW4zMiAoVmlzdWFsQysrIDUpLiBUaGUgLVAgc3dpdGNoIGRvZXMgbm90CiAgIHN1cHBvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZXMgaW4gd2luMzIuIEkgY291bGRuJ3QgZmlndXJlIG91dCBob3chCgpWZXJzaW9uIDQuMgogTGluYXMgVmVwc3RhcyAvIFNhbXBvIEtlbGxvbWFraQogLSBBZGRlZCBTU0wgLyBTU0xlYXkgc3VwcG9ydCAoaHR0cHM6Ly8pCiAtIEFkZGVkIHRoZSAtVCB1c2FnZSBmb3IgSFRUUCBQT1NULgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgU1NMIGltcGxlbWVudGF0aW9uLgogLSBNYWRlIC1QIGEgbG90IGJldHRlciB0byB1c2Ugb3RoZXIgSVAgYWRkcmVzc2VzLiBJdCBub3cgYWNjZXB0cyBhIGZvbGxvd2luZwogICBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyCiAgICAgICAgaW50ZXJmYWNlIC0gaS5lICJldGgwIiB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSdzIElQIGFkZHJlc3MgeW91CiAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UKICAgICAgICBJUCBhZGRyZXNzIC0gaS5lICIxOTIuMTY4LjEwLjEiIHRvIHNwZWNpZnkgZXhhY3QgSVAgbnVtYmVyCiAgICAgICAgaG9zdCBuYW1lIC0gaS5lICJteS5ob3N0LmRvbWFpbiIgdG8gc3BlY2lmeSBtYWNoaW5lCiAgICAgICAgIi0iICAgICAgIC0gKGFueSBzaW5nbGUtbGV0dGVyIHN0cmluZykgdG8gbWFrZSBpdCBwaWNrIHRoZSBtYWNoaW5lJ3MKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAtIFRoZSBNYWtlZmlsZSBpcyBub3cgcmVhZHkgdG8gY29tcGlsZSBmb3Igc29sYXJpcywgc3Vub3M0IGFuZCBsaW51eCByaWdodAogICBvdXQgb2YgdGhlIGJveC4KIC0gQmV0dGVyIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBzZWVuIHdpdGggJ2N1cmwgLVYnCgpWZXJzaW9uIDQuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBJUCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgYXMgYSByZXBseSB0byBQQVNWIGRvZXMgbm8gbG9uZ2VyCiAgIGhhdmUgdG8gRE5TIHJlc29sdmUuIEluIGZhY3QsIG5vIElQLW51bWJlci1vbmx5IGFkZHJlc3NlcyBoYXZlIHRvIGFueW1vcmUuCiAtIEJpbmRzIGJldHRlciB0byBhdmFpbGFibGUgcG9ydCB3aGVuIC1QIGlzIHVzZWQuCiAtIE5vdyBMSVNUcyAuLyBpbnN0ZWFkIG9mIC8gd2hlbiB1c2VkIGFzIGluIGZ0cDovL2Z0cC5mdW5ldC5maS8uIFRoZSByZWFzb24KICAgZm9yIHRoaXMgaXMgdGhhdCBleGFjdGx5IHRoYXQgc2l0ZSwgZnRwLmZ1bmV0LmZpLCBkb2VzIG5vdCBhbGxvdyBMSVNUIC8KICAgd2hpbGUgTElTVCAuLyBpcyBmaW5lLiBBbnkgb2JqZWN0aW9ucz8KClZlcnNpb24gNCAoMTk5OC0wMy0yMCkKIERhbmllbCBTdGVuYmVyZwogLSBJIHRvb2sgYW5vdGhlciBodWdlIHN0ZXAgYW5kIGNoYW5nZWQgYm90aCB2ZXJzaW9uIG51bWJlciBhbmQgcHJvamVjdCBuYW1lIQogICBUaGUgcmVhc29uIGZvciB0aGUgbmV3IG5hbWUgaXMgdGhhdCB0aGVyZSBhcmUganVzdCBvbmUgdG9vIG1hbnkgcHJvZ3JhbXMKICAgbmFtZWQgdXJsZ2V0IGFscmVhZHkgYW5kIHRoaXMgcHJvZ3JhbSBhbHJlYWR5IGNhbiBhIGxvdCBtb3JlIHRoYW4gbWVyZWx5CiAgIGdldHRpbmcgVVJMcywgYW5kIHRoZSByZWFzb24gZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB0aGF0IEkgZGlkIGFkZCB0aGUKICAgcHJldHR5IGJpZyBjaGFuZ2UgaW4gLVAgYW5kIHNpbmNlIEkgY2hhbmdlZCBuYW1lIEkgd2FudGVkIHRvIHN0YXJ0IHdpdGgKICAgc29tZXRoaW5nIGZyZXNoIQogLSBUaGUgLS1zdHlsZSBmbGFncyBhcmUgd29ya2luZyBiZXR0ZXIgbm93LgogLSBMaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGggRlRQIG9mdGVuIHJlcG9ydGVkIHRoYXQgdGhlIGZpbGUgdHJhbnNmZXIgd2FzCiAgIGluY29tcGxldGUuIFdyb25nIGFzc3VtcHRpb25zIHdlcmUgdG9vIGNvbW1vbiBmb3IgZGlyZWN0b3JpZXMsIHdoeSBubwogICBzaXplIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBjb21wYXJlZCBvbiB0aGVtIGZyb20gbm93IG9uLgogLSBJbXBsZW1lbnRlZCB0aGUgLVAgZmxhZyB0aGF0IGxldCdzIHRoZSBmdHAgY29udHJvbCBpc3N1ZSBhIFBPUlQgY29tbWFuZAogICBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBQQVNWLgogLSAtYSBmb3IgYXBwZW5kaW5nIEZUUCB1cGxvYWRzIHdvcmtzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpWZXJzaW9uIDMuMTIgKDE0IE1hcmNoIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gRW5kLW9mLWhlYWRlciB0cmFja2luZyBzdGlsbCBsYWNrZWQgc3VwcG9ydCBmb3IgXHJcbiBvciBqdXN0IFxuIGF0IHRoZQogICBlbmQgb2YgdGhlIGxhc3QgaGVhZGVyIGxpbmUuCiBTZXJnaW8gQmFycmVzaQogLSBBZGRlZCBQUk9YWSBhdXRoZW50aWNhdGlvbi4KIFJhZmFlbCBTYWd1bGEKIC0gRml4ZWQgc29tZSBsaXR0bGUgYnVncy4KClZlcnNpb24gMy4xMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBoZWFkZXIgcGFyc2luZyB3YXMgc3RpbGwgbm90IGNvcnJlY3Qgc2luY2UgdGhlIDMuMiBtb2RpZmljYXRpb24uLi4KClZlcnNpb24gMy4xMAogRGFuaWVsIFN0ZW5iZXJnCiAtIDMuNyBhbmQgMy45IHdlcmUgc2ltdWx0YW5lb3VzbHkgZGV2ZWxvcGVkIGFuZCBtZXJnZWQgaW50byB0aGlzIHZlcnNpb24uCiAtIEZUUCB1cGxvYWQgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBzaW5jZSAzLjIuCgpWZXJzaW9uIDMuOQogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCB0aGUgIi1lIDx1cmw+IC8gLS1yZWZlcmVyIDx1cmw+IiBvcHRpb24gd2hlcmUgd2UgY2FuIHNwZWNpZnkKICAgdGhlIHJlZmVyZXIgcGFnZS4gT2J2aW91c2x5LCB0aGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIGZvb2wgdGhlCiAgIHNlcnZlciwgYnV0Li4uCgpWZXJzaW9uIDMuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIE5vdyBjaGVja3MgdGhlIGxhc3QgZXJyb3IgY29kZSBzZW50IGZyb20gdGhlIGZ0cCBzZXJ2ZXIgYWZ0ZXIgYSBmaWxlIGhhcwogICBiZWVuIHJlY2VpdmVkIG9yIHVwbG9hZGVkLiBXYXNuJ3QgZG9uZSBwcmV2aW91c2x5LgogLSBXaGVuICd1cmxnZXQgPGhvc3Q+JyBpcyB1c2VkIHdpdGhvdXQgYSAncHJvdG9jb2w6Ly8nIGZpcnN0IGluIHRoZSBob3N0IHBhcnQsCiAgIGl0IG5vdyBjaGVja3MgZm9yIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBmdHAgb3IgZ29waGVyIGFuZCBpZiBpdCBkb2VzLAogICBpdCB1c2VzIHRoYXQgcHJvdG9jb2wgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGh0dHAuCgpWZXJzaW9uIDMuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIFNpbGx5IG1pc3Rha2UgbWFkZSB0aGUgUE9TVCBidWcuIFRoaXMgaGFzIG5vdyBhbHNvIGJlZW4gdGVzdGVkIHRvIHdvcmsgd2l0aAogICBwcm94eS4KClZlcnNpb24gMy41CiBEYW5pZWwgU3RlbmJlcmcKIC0gSGlnaGx5IGluc3BpcmVkIGJ5IFJhZmFlbCBTYWd1bGEncyBjaGFuZ2VzIHRvIHRoZSAzLjEgdGhhdCBhZGRlZCBhbiBhbG1vc3QKICAgZnVuY3Rpb25hbCBQT1NULCBJIGFwcGxpZWQgaGlzIGNoYW5nZXMgaW50byB0aGlzIHZlcnNpb24gYW5kIG1hZGUgdGhlbSB3b3JrLgogICAoSXQgc2VlbXMgUE9TVCByZXF1aXJlcyB0aGUgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LUxlbmd0aCBoZWFkZXJzLikgSXQgaXMKICAgbm93IHVzYWJsZSB3aXRoIHRoZSAtZCBzd2l0Y2guCgpWZXJzaW9uIDMuMyAtIDMuNAogUGFzc2VkIHRvIGF2b2lkIGNvbmZ1c2lvbnMKClZlcnNpb24gMy4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFqb3IgcmV3cml0ZSBvZiB0d28gY3J1Y2lhbCBwYXJ0cyBvZiB0aGlzIGNvZGU6IHVwbG9hZCBhbmQgZG93bmxvYWQuCiAgIFRoZXkgYXJlIGJvdGggbm93IHVzaW5nIGEgc2VsZWN0KCkgc3dpdGNoLCB0aGF0IGFsbG93cyBtdWNoIGJldHRlcgogICBwcm9ncmVzcyBtZXRlciBhbmQgdGltZSBjb250cm9sLgogLSBhbGFybSgpIHVzYWdlIHJlbW92ZWQgY29tcGxldGVseQogLSBGVFAgZ2V0IGNhbiBub3cgbGlzdCBkaXJlY3RvcnkgY29udGVudHMgaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggJy8nLgogICBVcmxnZXQgb24gYSBmdHAtcGF0aCB0aGF0IGRvZXNuJ3QgZW5kIHdpdGggYSBzbGFzaCBtZWFucyB1cmxnZXQgd2lsbAogICBhdHRlbXB0IGdldHRpbmcgaXQgYXMgYSBmaWxlIG5hbWUuCiAtIEZUUCBkaXJlY3RvcnkgdmlldyBzdXBwb3J0cyAtbCBmb3IgImxpc3Qtb25seSIgd2hpY2ggbGlzdHMgdGhlIGZpbGUgbmFtZXMKICAgb25seS4KIC0gQWxsIG9wZXJhdGlvbnMgc3VwcG9ydCAtbSBmb3IgbWF4IHRpbWUgdXNhZ2UgaW4gc2Vjb25kcyBhbGxvd2VkLgogLSBGVFAgdXBsb2FkIG5vdyBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHVwbG9hZGVkIGZpbGUgdG8gYmUgcHJvdmlkZWQsIGFuZAogICB0aHVzIGl0IGNhbiBiZXR0ZXIgY2hlY2sgaXQgYWN0dWFsbHkgdXBsb2FkZWQgdGhlIHdob2xlIGZpbGUuIEl0IGFsc28KICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGZvciB1cGxvYWRzIG11Y2ggYmV0dGVyIQogLSBNYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmYWlsIGluIGNhc2VzIGxpa2UgJ3VybGdldCAtciA5MDAnIHdoaWNoCiAgIHByZXZpb3VzbHkgdHJpZWQgdG8gY29ubmVjdCB0byB0aGUgaG9zdCBuYW1lZCAnOTAwJy4KClZlcnNpb24gMy4xCiBLamVsbCBFcmljc29uCiAtIFBvaW50ZWQgb3V0IGhvdyB0byBjb3JyZWN0IHRoZSAzIHdhcm5pbmdzIGluIHdpbjMyLWNvbXBpbGVzLgoKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIGFsbCBjYWxscyB0byBleGl0KCkuCiAtIE1hZGUgdGhlIHNob3J0IGhlbHAgdGV4dCBnZXQgd3JpdHRlbiB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuCiAtIE1hZGUgdGhpcyBmaWxlIGluc3RlYWQgb2Yga2VlcGluZyB0aGVzZSBjb21tZW50cyBpbiB0aGUgc291cmNlLgogLSBNYWRlIHR3byBjYWxsYmFjayBob29rcywgdGhhdCBlbmFibGUgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gdXNlIHVybGdldCgpCiAgIGVhc2llciBhbmQgdG8gZ3JhYiB0aGUgb3V0cHV0L29mZmVyIHRoZSBpbnB1dCBlYXNpZXIuCiAtIEl0IGlzIGV2aWRlbnQgdGhhdCBXaW4zMi1jb21waWxlcyBhcmUgcGFpbmZ1bC4gSSB3YXRjaGVkIHRoZSBvdXRwdXQgZnJvbQogICB0aGUgQm9ybGFuZCBDKysgdjUgYW5kIGl0IHdhcyBhd2Z1bC4gSnVzdCBpZ25vcmUgYWxsIHRob3NlIHdhcm5pbmdzLgoKVmVyc2lvbiAzLjAKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBGVFAgdXBsb2FkIGNhcGFiaWxpdGllcy4gVGhlIG5hbWUgdXJsZ2V0IGdldHMgYSBiaXQgc2lsbHkgbm93CiAgIHdoZW4gd2UgY2FuIHB1dCB0b28uLi4gPSkKIC0gUmVzdHJ1Y3R1cmVkIHRoZSBzb3VyY2UgcXVpdGUgYSBsb3QuCiAgIENoYW5nZWQgdGhlIHVybGdldCgpIGludGVyZmFjZS4gVGhpcyB3YXksIHdlIHdpbGwgc3Vydml2ZSBjaGFuZ2VzIG11Y2gKICAgYmV0dGVyLiBOZXcgZmVhdHVyZXMgY2FuIGNvbWUgYW5kIG9sZCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHVzIG5lZWRpbmcKICAgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UuIEkndmUgd3JpdHRlbiBhIHNtYWxsIGV4cGxhbmF0aW9uIGluIHVybGdldC5oCiAgIHRoYXQgZXhwbGFpbnMgaXQuCiAtIE5ldyBmbGFncyBpbmNsdWRlIC10LCAtVCwgLU8gYW5kIC1oLiBUaGUgLWggdGV4dCBpcyBnZW5lcmF0ZWQgYnkgdGhlIG5ldwogICBta2hlbHAgc2NyaXB0LgoKVmVyc2lvbiAyLjkKIFJlbWNvIHZhbiBIb29mZgogLSBBZGRlZCBhIGZpeCB0byBtYWtlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQW1pZ2EgdXNpbmcgdGhlIFNBUy9DCiAgIGNvbXBpbGVyLgoKIERhbmllbCBTdGVuYmVyZwogLSBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHRoZSBTVFVQSUQgTm92ZWxsIHdlYiBzZXJ2ZXIgc2VlbXMgdG8gcmVxdWlyZQogICB0aGF0IHRoZSBIb3N0OiBrZXl3b3JkIGlzIHVzZWQsIHNvIHdlbGwgSSB1c2UgaXQgYW5kIEkgKHJlLWludHJvZHVjZSkgdGhlCiAgIHVybGdldCBVc2VyLUFnZW50Oi4gSSBzdGlsbCBoYXZlIHRvIGNoZWNrIHRoYXQgdGhpcyBIb3N0OiB1c2FnZSB3b3JrcyB3aXRoCiAgIHByb3hpZXMuLi4gJ0hvc3Q6JyBpcyByZXF1aXJlZCBmb3IgSFRUUC8xLjEgR0VUIGFjY29yZGluZyB0byBSRkMyMDY4LgoKVmVyc2lvbiAyLjgKIFJhZmFlbCBTYWd1bGEKIC0gc29tZSBsaXR0bGUgbW9kaWZpY2F0aW9ucwoKVmVyc2lvbiAyLjcKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIHRoZSAtbCBvcHRpb24gYW5kIGludHJvZHVjZWQgdGhlIC1mIG9wdGlvbiBpbnN0ZWFkLiBOb3cgSSdsbAogICByZXdyaXRlIHRoZSBmb3JtZXIgLWwga2x1ZGdlIGluIGFuIGV4dGVybmFsIHNjcmlwdCB0aGF0J2xsIHVzZSB1cmxnZXQgdG8KICAgZmV0Y2ggbXVsdGlwYXJ0IGZpbGVzIGxpa2UgdGhhdC4KIC0gJy1mJyBpcyBpbnRyb2R1Y2VkLCBpdCBtZWFucyBGYWlsIHdpdGhvdXQgb3V0cHV0IGluIGNhc2Ugb2YgSFRUUCBzZXJ2ZXIKICAgZXJyb3JzIChyZXR1cm4gY29kZSA+PTMwMCkuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIC1yLCByYW5nZXMuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiBhIGRvY3VtZW50IHlvdQogICB3YW50LCBhbmQgb25seSB0aGF0IHBhcnQgaXMgcmV0dXJuZWQuIE9ubHkgd2l0aCBIVFRQLzEuMS1zZXJ2ZXJzLgogLSBTcGxpdCB1cCB0aGUgc291cmNlIGluIDMgcGFydHMuIE5vdyBhbGwgcHVyZSBVUkwgZnVuY3Rpb25zIGFyZSBpbgogICB1cmxnZXQuYyBhbmQgc3R1ZmYgdGhhdCBkZWFscyB3aXRoIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtIGlzIGluIG1haW4uYy4KIC0gSSB0b29rIGEgZmV3IG1pbnV0ZXMgYW5kIHdyb3RlIGFuIGVtYnJ5byBvZiBhIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4KICAgYSBmZXcgdGhpbmdzLgoKVmVyc2lvbiAyLjYKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtbCAobG9vcCkgdGhpbmcgdXNlIHRoZSBuZXcgQ09ORl9GQUlMT05FUlJPUiB3aGljaCBtYWtlcwogICB1cmxnZXQoKSByZXR1cm4gZXJyb3IgY29kZSBpZiBub24tc3VjY2Vzc2Z1bC4gSXQgYWxzbyB3b24ndCBvdXRwdXQgYW55dGhpbmcKICAgdGhlbi4gTm93IGZpbmFsbHkgcmVtb3ZlZCB0aGUgSFRUUCAxLjAgYW5kIGVycm9yIDQwNCBkZXBlbmRlbmNpZXMuCiAtIEFkZGVkIC1JIHdoaWNoIHVzZXMgdGhlIEhFQUQgcmVxdWVzdCB0byBnZXQgdGhlIGhlYWRlciBvbmx5IGZyb20gYQogICBodHRwLXNlcnZlci4KClZlcnNpb24gMi41CiBSYWZhZWwgU2FndWxhCiAtIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHVzZSBISEg6TU06U1MgaW5zdGVhZCBvZiBvbmx5IHNlY29uZHMuCgpWZXJzaW9uIDIuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHByb2dyZXNzIG1ldGVyLiBJdCBhcHBlYXJzIHdoZW4gZG93bmxvYWRpbmcgPiBCVUZGRVIgU0laRSBhbmQKICAgbXV0ZSBpcyBub3Qgc2VsZWN0ZWQuIEkgZm91bmQgb3V0IHRoYXQgd2hlbiBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBmcm9tCiAgIHJlYWxseSByZWFsbHkgc2xvdyBzaXRlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKICAgZG93bmxvYWQuIERvIG5vdGUgdGhhdCBzb21lIGRvd25sb2FkcyBhcmUgZG9uZSB1bmF3YXJpbmcgb2YgdGhlIHNpemUsIHdoaWNoCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBsZXNzIHRocmlsbGluZyA7KSBJZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gYSB0dHksCiAgIHRoZSBwcm9ncmVzcyBtZXRlciBpcyBzaHV0IG9mZi4KIC0gSW5jcmVhc2VkIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJlYWRpbmcuCiAtIEFkZGVkIGxlbmd0aCBjaGVja3MgaW4gdGhlIHVzZXIrcGFzc3dkIHBhcnNpbmcuCiAtIE1hZGUgaXQgZ3JvayB1c2VyK3Bhc3N3ZCBmb3IgSFRUUCBmZXRjaGVzLiBUaGUgdHJpY2sgaXMgdG8gYmFzZTY0CiAgIGVuY29kZSB0aGUgdXNlcitwYXNzd2QgYW5kIHNlbmQgYW4gZXh0cmEgaGVhZGVyIGxpbmUuIFJlYWQgY2hhcHRlciAxMS4xIGluCiAgIFJGQzIwNjggZm9yIGRldGFpbHMuIEkgYWRkZWQgaXQgdG8gYmUgdXNlZCBqdXN0IGxpa2UgdGhlIGZ0cCBvbmUuICBUbyBnZXQgYQogICBodHRwIGRvY3VtZW50IGZyb20gYSBwbGFjZSB0aGF0IHJlcXVpcmVzIHVzZXIgYW5kIHBhc3N3b3JkLCB1c2UgYW4gVVJMCiAgIGxpa2U6CgogICAgICAgIGh0dHA6Ly91c2VyOnBhc3N3ZEB3d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKICAgSSBhbHNvIGFkZGVkIHRoZSAtdSBmbGFnLCBzaW5jZSBXSEVOIFVTSU5HIEEgUFJPWFkgWU9VIENBTidUIFNQRUNJRlkgVEhFCiAgIFVTRVIgQU5EIFBBU1NXT1JEIFdJVEggSFRUUCBMSUtFIFRIQVQuIFRoZSAtdSBmbGFnIHdvcmtzIGZvciBmdHAgdG9vLCBidXQKICAgbm90IGlmIHVzZWQgd2l0aCBwcm94eS4gVG8gZG8gdGhlIHNhbWUgYXMgdGhlIGFib3ZlIG9uZSwgeW91IGNhbiBpbnZva2U6CgogICAgICAgIHVybGdldCAtdSB1c2VyOnBhc3N3ZCBodHRwOi8vd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKClZlcnNpb24gMi4zCiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkICItbyIgb3B0aW9uIChvdXRwdXQgZmlsZSkKIC0gQWRkZWQgVVJHX0hUVFBfTk9UX0ZPVU5EIHJldHVybiBjb2RlLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFBlcmhhcHMgd2Ugc2hvdWxkIGRldGVjdCBhbGwga2luZHMgb2YgZXJyb3JzIGFuZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhhdAogICBjdXN0b20gc3RyaW5nIGZvciB0aGUgcGFydGljdWxhciA0MDQtZXJyb3IsIHVzZSB0aGUgZXJyb3IgdGV4dCB3ZSBhY3R1YWxseQogICBnZXQgZnJvbSB0aGUgc2VydmVyLiBTZWUgZnVydGhlciBkZXRhaWxzIGluIFJGQzIwNjggKEhUVFAgMS4xCiAgIGRlZmluaXRpb24pLiBUaGUgY3VycmVudCB3YXkgYWxzbyByZWxpZXMgb24gYSBIVFRQLzEuMCByZXBseSwgd2hpY2ggbmV3ZXIKICAgc2VydmVycyBtaWdodCBub3QgZG8uCiAtIExvb3BpbmcgbW9kZSAoIi1sIiBvcHRpb24pLiBJdCdzIGVhc2llciB0byBnZXQgdmFyaW91cyBzcGxpdCBmaWxlcy4KICAgKERhbmllbCdzIG5vdGU6KQogICBVc2UgaXQgbGlrZSAndXJsZ2V0IC1sIDEgaHR0cDovL2Zyb20udGhpcy5zaXRlL2ZpbGUlZC5odG1sJywgd2hpY2ggd2lsbAogICBtYWtlIHVybGdldCB0byBhdHRlbXB0IHRvIGZldGNoIGFsbCBmaWxlcyBuYW1lZCBmaWxlMS5odG1sLCBmaWxlMi5odG1sIGV0YwogICB1bnRpbCBubyBtb3JlIGZpbGVzIGFyZSBmb3VuZC4gVGhpcyBpcyBvbmx5IGEgbW9kaWZpY2F0aW9uIG9mIHRoZQogICBTVEFORF9BTE9ORSBwYXJ0LCBub3RoaW5nIGluIHRoZSB1cmxnZXQoKSBmdW5jdGlvbiB3YXMgbW9kZmlmaWVkIGZvciB0aGlzLgogRGFuaWVsIFN0ZW5iZXJnCiAtIENoYW5nZWQgdGhlIC1oIHRvIGJlIC1pIGluc3RlYWQuIC1oIHNob3VsZCBiZSBwcmVzZXJ2ZWQgdG8gaGVscCB1c2UuCiAtIEJqb3JuIFJlZXNlIGluZGljYXRlZCB0aGF0IEJvcmxhbmQgX21pZ2h0XyB1c2UgJ19XSU4zMicgaW5zdGVhZCBvZiB0aGUKICAgVkMrKyBXSU4zMiBkZWZpbmUgYW5kIHRoZXJlZm9yZSBJIGFkZGVkIGEgbGl0dGxlIGZpeCBmb3IgdGhhdC4KClZlcnNpb24gMi4yCiBKb2hhbiBBbmRlcnNzb24KIC0gVGhlIHVybGdldCBmdW5jdGlvbiBkaWRuJ3Qgc2V0IHRoZSBwYXRoIHRvIHVybCB3aGVuIHVzaW5nIHByb3h5LgogLSBGaXhlZCBidWcgd2l0aCBJTUMgcHJveHkuIE5vdyB1c2luZyAoYWxtb3N0KSBjb21wbGV0ZSBHRVQgY29tbWFuZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSBpdCBjb21waWxlIG9uIFNvbGFyaXMuIEhhZCB0byByZW9yZ2FuaXplIHRoZSBpbmNsdWRlcyBhIGJpdC4KICAgKHNvIFdpbjMyLCBMaW51eCwgU3VuT1MgNCBhbmQgU29sYXJpcyAyIGNvbXBpbGUgZmluZS4pCiAtIE1hZGUgSm9oYW4ncyBrZWVwYWxpdmUga2V5d29yZCBvcHRpb25hbCB3aXRoIHRoZSAtayBmbGFnIChzaW5jZSBpdAogICBtYWtlcyBhIGxvdCBvZiB1cmxnZXRzIHRha2UgYSBsb3QgbG9uZ2VyIHRpbWUpLgogLSBNYWRlIGEgJy1oJyBzd2l0Y2ggaW4gY2FzZSB5b3Ugd2FudCB0aGUgSFRUUC1oZWFkZXIgaW4gdGhlIG91dHB1dC4KClZlcnNpb24gMi4xCiBEYW5pZWwgU3RlbmJlcmcgYW5kIEtqZWxsIEVyaWNzb24KIC0gV2luMzItY29tcGlsYWJsZQogLSBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMKIC0gTXV0ZSBvcHRpb24gKG5vIG91dHB1dCBhdCBhbGwgdG8gc3RkZXJyKQogLSBGdWxsIHJhbmdlIG9mIHJldHVybiBjb2RlcyBmcm9tIHVybGdldCgpLCB3aGljaCBpcyBub3cgd3JpdHRlbiB0byBiZSBhCiAgIGZ1bmN0aW9uIGZvciBlYXN5LXRvLXVzZSBpbiBbb3RoZXJdIHByb2dyYW1zLgogLSBEZWZpbmUgU1RBTkRfQUxPTkUgdG8gY29tcGlsZSB0aGUgc3RhbmQgYWxvbmUgdXJsZ2V0IHByb2dyYW0KIC0gTm93IGNvbXBpbGVzIHdpdGggZ2NjIG9wdGlvbnMgLWFuc2kgLVdhbGwgLXBlZGFudGljIDspCgpWZXJzaW9uIDIuMAogLSBJbnRyb2R1Y2luZyBmdHAgR0VUIHN1cHBvcnQuIFRoZSBGVFAgVVJMIHR5cGUgaXMgcmVjb2duaXplZCBhbmQgdXNlZC4KIC0gUmVuYW1lZCB0aGUgcHJvamVjdCB0byAndXJsZ2V0Jy4KIC0gU3VwcG9ydHMgdGhlIHVzZXIrcGFzc3dkIGluIHRoZSBGVFAgVVJMIChvdGhlcndpc2UgaXQgdHJpZXMgYW5vbnltb3VzCiAgIGxvZ2luIHdpdGggYSB3ZWlyZCBlbWFpbCBhZGRyZXNzIGFzIHBhc3N3b3JkKS4KClZlcnNpb24gMS41CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIHNraXBfaGVhZGVyKCkgY3JhcCBtZXNzZWQgaXQgdXAgYmlnLXRpbWUuIEJ5IHNpbXBseSByZW1vdmluZyB0aGF0CiAgIG9uZSB3ZSBjYW4gYWxsIG9mIGEgc3VkZGVuIGRvd25sb2FkIGFueXRoaW5nIDspCiAtIE5vIGxvbmdlciByZXF1aXJlcyBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkxzLgogLSBJZiB0aGUgZ2l2ZW4gVVJMIGlzbid0IHByZWZpeGVkIHdpdGggJ2h0dHA6Ly8nLCBIVFRQIGlzIGFzc3VtZWQgYW5kCiAgIGdpdmVuIGEgdHJ5IQogLSAndm9pZCBtYWluKCknIGlzIGhpc3RvcnkuCgpWZXJzaW9uIDEuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBnb3BoZXIgc291cmNlIHVzZWQgdGhlIHBwYXRoIHZhcmlhYmxlIGluc3RlYWQgb2YgcGF0aCB3aGljaCBjb3VsZAogICBsZWFkIHRvIGRpc2FzdGVyLgoKVmVyc2lvbiAxLjMKIERhbmllbCBTdGVuYmVyZwogLSBXZWxsLCBJIGFkZGVkIGEgbGFtZSB0ZXh0IGFib3V0IHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IHRoZSBkYXRhLiBJIGFsc28KICAgZm91Z2h0IGFnYWluc3QgSm9oYW4gdG8gcHJldmVudCBoaXMgLWYgb3B0aW9uICh0byBzcGVjaWZ5IGEgZmlsZSBuYW1lCiAgIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBzdGRvdXQpISA9KQogLSBNYWRlIGl0IHdyaXRlICdjb25uZWN0aW9uIHJlZnVzZWQnIGZvciB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdCgpCiAgIHByb2JsZW0uCiAtIFJlbnVtYmVyZWQgdGhlIHZlcnNpb24uIExldCdzIG5vdCBtYWtlIHNpbGx5IDEuMC5YIHZlcnNpb25zLCB0aGlzIGlzCiAgIGEgcGxhaW4gMS4zIGluc3RlYWQuCgpWZXJzaW9uIDEuMgogSm9oYW4gQW5kZXJzc29uCiAtIERpc2NvdmVyZWQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZ2V0dGluZyBiaW5hcnkgZmlsZXMuIHB1dHMoKSBpcwogICBub3cgcmVwbGFjZWQgd2l0aCBmd3JpdGUoKS4gKERhbmllbCdzIG5vdGU6IHRoaXMgYWxzbyBmaXhlZCB0aGUgYnVmZmVyCiAgIG92ZXJ3cml0ZSBwcm9ibGVtIEkgZm91bmQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24uKQoKIFJhZmFlbCBTYWd1bGEKIC0gTGV0ICItcCIgYmVmb3JlICIteCIuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJ1Z2ZpeGVkIHRoZSBwcm94eSB1c2FnZS4gSXQgc2hvdWxkICpOT1QqIHVzZSBub3Igc3RyaXAgdGhlIHBvcnQgbnVtYmVyCiAgIGZyb20gdGhlIFVSTCBidXQgc2ltcGx5IHBhc3MgdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUgcHJveHkuIFRoaXMgYWxzbwogICBtYWRlIHRoZSB1c2VyL3Bhc3N3b3JkIGZpZWxkcyBwb3NzaWJsZSB0byB1c2UgaW4gcHJveHkgW2Z0cC1dIFVSTHMuCiAgIChsaWtlIGluIGZ0cDovL3VzZXI6cGFzc3dvcmRAZnRwLm15LnNpdGU6ODAyMS9SRUFETUUpCgogSm9oYW4gQW5kZXJzc29uCiAtIEltcGxlbWVudGVkIEhUVFAgcHJveHkgc3VwcG9ydC4KIC0gUmVjZWl2ZSBieXRlIGNvdW50ZXIgYWRkZWQuCgogQmpvcm4gUmVlc2UKIC0gSW1wbGVtZW50ZWQgVVJMcyAoYW5kIHNraXBwZWQgdGhlIG9sZCBzeW50YXgpLgogLSBPdXRwdXQgaXMgd3JpdHRlbiB0byBzdGRvdXQsIHNvIHRvIGFjaGlldmUgdGhlIGFib3ZlIGV4YW1wbGUsIGRvOgogICBodHRwZ2V0IGh0dHA6Ly8xNDMuNTQuMTAuNi9pbmZvX2xvZ28uZ2lmID4gdGVzdC5naWYKClZlcnNpb24gMS4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgaXQgc2xpZ2h0bHkgdG8gYWNjZXB0IG5hbWVkIGhvc3RzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFdlCiAgIHdvdWxkbid0IHdhbm5hIHVzZSBJUCBudW1iZXJzIGZvciB0aGUgcmVzdCBvZiBvdXIgbGlmZXMsIHdvdWxkIHdlPwoKVmVyc2lvbiAxLjAKICBSYWZhZWwgU2FndWxhCiAgLSBXcm90ZSB0aGUgaW5pdGlhbCBodHRwZ2V0LCB3aGljaCBzdGFydGVkIGFsbCB0aGlzIQo=