ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMTAsIGVkaXRlZCBtYW51YWxseS4gVGhlIG1vc3QKcmVjZW50IGNoYW5nZXMgYXJlIGFsd2F5cyBnZW5lcmF0ZWQgaW50byB0aGUgQ0hBTkdFUyBmaWxlIHN0cmFpZ2h0IGZyb20gZ2l0LgoKS2FtaWwgRHVka2EgKDE3IEp1bmUgMjAxMCkKLSBJbXByb3ZlIHRlc3Q1NzUgaW4gb3JkZXIgdG8gbm90IGZhaWwgd2l0aCB0aHJlYWRlZCBETlMgcmVzb2x2ZXIuCgpWZXJzaW9uIDcuMjEuMCAoMTYgSnVuZSAyMDEwKQoKRGFuaWVsIFN0ZW5iZXJnICg1IEp1bmUgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBhIGNhc2Ugb2Ygc3B1cmlvdXMgU1NMIGNvbm5lY3Rpb24gYWJvcnRzIHVzaW5nCiAgbGliY3VybCBhbmQgT3BlblNTTC4gIkkgdHJhY2tlZCBpdCBkb3duIHRvIHVuY2xlYXJlZCBlcnJvciBzdGF0ZSBvbiB0aGUKICBPcGVuU1NMIGVycm9yIHN0YWNrIC0gcGF0Y2ggYXR0YWNoZWQgZGVhbHMgd2l0aCB0aGF0LiIKCkRhbmllbCBTdGVuYmVyZyAoNSBKdW5lIDIwMTApCi0gRnJhbmsgTWVpZXIgYWRkZWQgQ1VSTElORk9fUFJJTUFSWV9QT1JULCBDVVJMSU5GT19MT0NBTF9JUCBhbmQKICBDVVJMSU5GT19MT0NBTF9QT1JUIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkuCgpZYW5nIFRzZSAoNCBKdW5lIDIwMTApCi0gRW5hYmxlZCBPcGVuTERBUCBzdXBwb3J0IGZvciBjeWd3aW4gYnVpbGRzLiBUaGlzIHN1cHBvcnQgd2FzIGRpc2FibGVkIGJhY2sKICBpbiAyMDA4IGR1ZSB0byBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIE9wZW5TU0wgYW5kIE9wZW5MREFQIGhlYWRlcnMuCiAgY3lnd2luJ3MgT3BlblNTTCAwLjkuOGwgYW5kIE9wZW5MREFQIDIuMy40MyB2ZXJzaW9ucyBvbiBjeWd3aW4gMS41LjI1CiAgYWxsb3cgYnVpbGRpbmcgYW4gT3BlbkxEQVAgZW5hYmxlZCBsaWJjdXJsIHN1cHBvcnRpbmcgYmFjayB0byBXaW5kb3dzIDk1LgoKICBSZW1vdmVkIHRoZSBub24tZnVuY3Rpb25hbCBDVVJMX0xEQVBfSFlCUklEIGNvZGUgYW5kIHJlZmVyZW5jZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIgSnVuZSAyMDEwKQotIEphc29uIE1jRG9uYWxkIHBvc3RlZCBidWcgcmVwb3J0ICMzMDA2Nzg2IHdoZW4gaGUgZm91bmQgdGhhdCB0aGUgU0ZUUCBjb2RlCiAgZGlkbid0IHRpbWVvdXQgcHJvcGVybHkgaW4gc2V2ZXJhbCBwbGFjZXMgaW4gdGhlIGNvZGUgZXZlbiBpZiBhIHRpbWVvdXQgd2FzCiAgc2V0IHByb3Blcmx5LgoKICBCYXNlZCBvbiBoaXMgc3VnZ2VzdGVkIHBhdGNoLCBJIHdyb3RlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIHRoYXQgSQogIHRoaW5rIGFkZHJlc3NlZCB0aGUgaXNzdWUgYmV0dGVyIGFuZCBhbHNvIHVzZXMgdGhlIGNvbm5lY3QgdGltZW91dCBmb3IgdGhlCiAgaW5pdGlhbCBwYXJ0IG9mIHRoZSBTU0gvU0ZUUCBkb25lIGR1cmluZyB0aGUgInByb3RvY29sIGNvbm5lY3QiIHBoYXNlLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MzAwNjc4NikKCllhbmcgVHNlICgyIEp1bmUgMjAxMCkKLSBBZGRlZCBtaXNzaW5nIG5ldyBsaWJjdXJsIGZpbGVzIHRvIG5vbi1jb25maWd1cmUgdGFyZ2V0cy4gQWRqdXN0ZWQKICBsaWJjdXJsIHN0YW5kYXJkIGludGVybmFsIGhlYWRlciBpbmNsdXNpb25zIGluIG5ldyBmaWxlcy4gRml4ZWQgYW4KICBTUE5FR08gcmVsYXRlZCBtZW1vcnkgbGVhay4gRml4ZWQgc2V2ZXJhbCBMREFQIHJlbGF0ZWQgY29tcGlsYXRpb24KICBpc3N1ZXMsIGFuZCBmaXhlZCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bmUgMjAxMCkKLSBJZ29yIE5vdm9zZWx0c2V2IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBzb2NrZXQgQVBJIGFuZCB1c2luZwogIHRpbWVvdXRzIGFuZCB0aW1lcnMuIEl0IGJvaWxlZCBkb3duIHRvIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2Ugb2YKICBHZXRUaWNrQ291bnQoKSBpbnRlcmFsbHkgdG8gZmlndXJlIG91dCB0aGUgY3VycmVudCB0aW1lLCB3aGlsZSBJZ29yJ3Mgb3duCiAgYXBwbGljYXRpb24gY29kZSB1c2VkIGFub3RoZXIgZnVuY3Rpb24gY2FsbC4KCiAgSXQgbWFkZSBoaXMgYXBwIGNhbGwgdGhlIHNvY2tldCBBUEkgdGltZW91dCBmdW5jdGlvbiBhIGJpdCBfYmVmb3JlXyBsaWJjdXJsCiAgd291bGQgY29uc2lkZXIgdGhlIHRpbWVvdXQgdG8gdHJpZ2dlciwgYW5kIHRoYXQgY291bGQgZWFzaWx5IGxlYWQgdG8KICB0aW1lb3V0cyBvciBzdGFsbHMgaW4gdGhlIGFwcC4gSXQgc2VlbXMgR2V0VGlja0NvdW50KCkgaW4gZ2VuZXJhbCBvZnRlbiBoYXMKICBubyBiZXR0ZXIgcmVzb2x1dGlvbiB0aGFuIDE2bXMgYW5kIHN3aXRjaGluZyB0byB0aGUgYWx0ZXJuYXRpdmUgZnVuY3Rpb24KICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBoYXMgaXRzIHNoYXJlIG9mIHByb2JsZW1zOgogICAgICBodHRwOi8vd3d3LnZpcnR1YWxkdWIub3JnL2Jsb2cvcGl2b3QvZW50cnkucGhwP2lkPTEwNgoKICBXZSBhZGRyZXNzIHRoaXMgcHJvYmxlbSBieSBzaW1wbHkgaGF2aW5nIGxpYmN1cmwgdHJlYXQgdGltZXJzIHRoYXQgYWxyZWFkeQogIGhhcyBvY2N1cmVkIG9yIHdpbGwgb2NjdXIgd2l0aGluIDQwbXMgc3ViamVjdCBmb3IgdHJlYXRtZW50LiBJJ20gY29uZmlkZW50CiAgdGhhdCB0aGVyZSBhcmUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGFuZCBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIHNpbWlsYXJseSBpbgogIGFjY3VyYXRlIHRpbWVyIGZ1bmN0aW9ucyBzbyBpdCBtYWtlcyBzZW5zZSB0byBoYXZlIGFwcGxpZWQgZ2VuZXJpY2FsbHkgYW5kIEkKICBkb24ndCBiZWxpZXZlIHdlIHNhY3JpZmljZSBtdWNoIGJ5IGFkZGluZyBhIDQwbXMgaW5hY2N1cmFjeSBvbiB0aGVzZQogIHRpbWVvdXRzLgoKS2FtaWwgRHVka2EgKDI3IE1heSAyMDEwKQotIGFkZGVkIGEgbmV3IHRlc3QgZm9yIENSTCBzdXBwb3J0ICh0ZXN0MzEzKQoKLSBUb3IgQXJudHNlbiBjaGFuZ2VkIHRoZSBhbHRlcm5hdGl2ZSBkZWZpbml0aW9uIG9mIGJvb2wgdG8gdXNlIGVudW0gaW5zdGVhZAogIG9mIHVuc2lnbmVkIGNoYXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1heSAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZml4ZWQgdGhlIHdhcm5pbmcgc2VlbiB3aGVuIGNvbXBpbGluZyBsaWIvcnRtcC5jOiBvbmUKICB1bnVzZWQgdmFyaWFibGVzLCBzZXZlcmFsIHVudXNlZCBhcmd1bWVudHMgYW5kIHNvbWUgbWlzc2luZyAjaW5jbHVkZS4KCi0gSnVsaWVuIENoYWZmcmFpeCBmaXhlZCAyIE9PTSBlcnJvcnM6IGEgbWlzc2luZyBOVUxMLWNoZWNrIGluCiAgbGliL2h0dHBfbmVnb2NpYXRlLmMgYW5kIGEgcG90ZW50aWFsIE5VTEwgZGVyZWZlcmVuY2luZyBpbiBsaWIvc3BsYXkuYwoKLSBIb3dhcmQgQ2h1IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBMREFQIGNvZGUgbXVjaCBjbGVhbmVyLCBuaWNlciBhbmQKICBpbiBnZW5lcmFsIGJlaW5nIGEgYmV0dGVyIGxpYmN1cmwgY2l0aXplbi4gSWYgYSBuZXcgZW5vdWdoIE9wZW5MREFQIHZlcnNpb24KICBpcyBkZXRlY3QsIHRoZSBuZXcgYW5kIHNoaW55IGxpYi9vcGVubGRhcC5jIGNvZGUgaXMgdGhlbiB1c2VkIGluc3RlYWQgb2YgdGhlCiAgb2xkIGNydWZ0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBNYXkgMjAxMCkKLSBFcmljIE1lcnRlbnMgcG9zdGVkIGJ1ZyAjMzAwMzcwNTogd2hlbiB3ZSBtYWRlIFRGVFAgdXNlIHRoZSBjb3JyZWN0IHRpbWVvdXQKICBvcHRpb24gd2hlbiBzZW50IHRvIHRoZSBzZXJ2ZXIgKGZpeGVkIE1heSAxOHRoIDIwMTApIGl0IGJlY2FtZSBvYnZpb3VzIHRoYXQKICBsaWJjdXJsIHVzZWQgaW52YWxpZCB0aW1lb3V0IHZhbHVlcyAoMzAwIGJ5IGRlZmF1bHQgd2hpbGUgdGhlIFJGQyBhbGxvd3MKICBub3RoaW5nIGFib3ZlIDI1NSkuIFdoaWxlIG9mIGNvdXJzZSBpdCBpcyBvYnZpb3VzIHRoYXQgYXMgVEZUUCBoYXMgd29ya2VkCiAgdGh1cyBmYXIgd2l0aG91dCBiZWluZyBhYmxlIHRvIHNldCB0aW1lb3V0IGF0IGFsbCwganVzdCByZW1vdmluZyB0aGUgc2V0dGluZwogIHdvdWxkbid0IG1ha2UgYW55IGRpZmZlcmVuY2UgaW4gYmVoYXZpb3IuIEkgZGVjaWRlZCB0byBzdGlsbCBrZWVwIGl0IChidXQKICBmaXggdGhlIHByb2JsZW0pIGFzIGl0IG5vdyBhY3R1YWxseSBhbGxvd3MgZm9yIGVhc2llciAoZnV0dXJlKSBjdXN0b21pemF0aW9uCiAgb2YgdGhlIHRpbWVvdXQuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAzNzA1KQoKLSBEb3VnbGFzIEtpbHBhdHJpY2sgZmlsZWQgYnVnIHJlcG9ydCAjMzAwNDc4NyBhbmQgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVEZUUAogIGNvZGUgZGlkbid0IGhhbmRsZSBibG9jayBpZCB3cmFwcyBjb3JyZWN0bHkuIEhpcyBzdWdnZXN0ZWQgZml4IGluc3BpcmVkIHRoZQogIGZpeCBJIGNvbW1pdHRlZC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDQ3ODcpCgpEYW5pZWwgU3RlbmJlcmcgKDIwIE1heSAyMDEwKQotIFRhbmd1eSBGYXV0cmUgYnJvdWdodCBhIGZpeCB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIHdpdGggTWljcm9zb2Z0IFZDMTAuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1heSAyMDEwKQotIEVyaWMgTWVydGVucyBwb3N0ZWQgYnVnIHJlcG9ydCAjMzAwMzAwNSBwb2ludGluZyBvdXQgdGhhdCB0aGUgbGliY3VybCBURlRQCiAgY29kZSB3YXMgbm90IHNlbmRpbmcgdGhlIHRpbWVvdXQgb3B0aW9uIHByb3Blcmx5IHRvIHRoZSBzZXJ2ZXIsIGFuZAogIHN1Z2dlc3RlZCBhIGZpeC4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTMwMDMwMDUpCgpLYW1pbCBEdWRrYSAoMTYgTWF5IDIwMTApCi0gUGF2ZWwgUmFpc2t1cCBpbnRyb2R1Y2VkIGEgbmV3IG9wdGlvbiBDVVJMT1BUX0ZOTUFUQ0hfREFUQSBpbiBvcmRlciB0byBwYXNzCiAgYSBjdXN0b20gZGF0YSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBzcGVjaWZpZWQgYnkgQ1VSTE9QVF9GTk1BVENIX0ZVTkNUSU9OLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBNYXkgMjAxMCkKLSBKb2huLU1hcmsgQmVsbCBmaWxlZCBidWcgIzMwMDAwNTIgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbSAod2l0aCBhbgogIGFzc29jaWF0ZWQgcGF0Y2gpIHdpdGggdGhlIE9wZW5TU0wgaGFuZHNoYWtlIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGUgbXVsdGkKICBpbnRlcmZhY2UgaXMgdXNlZDoKCiAgUGVyZm9ybWluZyBhbiBodHRwcyByZXF1ZXN0IHVzaW5nIGEgY3VybCBtdWx0aSBoYW5kbGUgYW5kIHVzaW5nIHNlbGVjdCBvcgogIGVwb2xsIHRvIHdhaXQgZm9yIGV2ZW50cyByZXN1bHRzIGluIGEgaGFuZy4gSXQgYXBwZWFycyB0aGF0IHRoZSBjYXVzZSBpcyB0aGUKICBmaXggZm9yIGJ1ZyAjMjk1ODE3OSwgd2hpY2ggbWFrZXMgb3NzbF9jb25uZWN0X2NvbW1vbiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuCiAgZnJvbSB0aGUgc3RlcCAyIGxvb3Agd2hlbiBmZXRjaGluZyBmcm9tIGEgbXVsdGkgaGFuZGxlLgoKICBXaGVuIG9zc2xfY29ubmVjdF9zdGVwMiBoYXMgY29tcGxldGVkLCBpdCB1cGRhdGVzIGNvbm5zc2wtPmNvbm5lY3Rpbmdfc3RhdGUKICB0byBzc2xfY29ubmVjdF8zLiBvc3NsX2Nvbm5lY3RfY29tbW9uIHdpbGwgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgYXMgYQogIG11bHRpIGhhbmRsZSBpcyBpbiB1c2UuIEV2ZW50dWFsbHksIHRoZSBjbGllbnQgY29kZSB3aWxsIGNhbGwKICBjdXJsX211bHRpX2Zkc2V0IHRvIG9idGFpbiBhbiB1cGRhdGVkIGZkc2V0IHRvIHNlbGVjdCBvciBlcG9sbCBvbi4gRm9yIGh0dHBzCiAgcmVxdWVzdHMsIGN1cmxfbXVsdGlfZmRzZXQgd2lsbCBjYXVzZSBodHRwc19nZXRzb2NrIHRvIGJlIGNhbGxlZC4KICBodHRwc19nZXRzb2NrIHdpbGwgb25seSByZXR1cm4gYSBzb2NrZXQgaGFuZGxlIGlmIHRoZSBjb25uZWN0aW5nX3N0YXRlIGlzCiAgc3NsX2Nvbm5lY3RfMl9yZWFkaW5nIG9yIHNzbF9jb25uZWN0XzJfd3JpdGluZy4gIFRoZXJlZm9yZSwgdGhlIGNsaWVudCB3aWxsCiAgbmV2ZXIgb2J0YWluIGEgdmFsaWQgZmRzZXQsIGFuZCB0aHVzIG5vdCBkcml2ZSB0aGUgbXVsdGkgaGFuZGxlLCByZXN1bHRpbmcKICBpbiBhIGhhbmcuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAwMDUyKQoKLSBTZWJhc3RpYW4gViByZXBvcnRlZCBidWcgIzMwMDAwNTYgaWRlbnRpZnlpbmcgYSBwcm9ibGVtIHdpdGggcmVkaXJlY3QKICBmb2xsb3dpbmcuIEl0IHNob3dlZCB0aGF0IHdoZW4gY3VybCBmb2xsb3dlZCByZWRpcmVjdHMgaXQgZGlkbid0IHByb3Blcmx5CiAgaWdub3JlIHRoZSByZXNwb25zZSBib2R5IG9mIHRoZSAzMFggcmVzcG9uc2UgaWYgdGhhdCByZXNwb25zZSB3YXMgdXNpbmcKICBjb21wcmVzc2VkIENvbnRlbnQtRW5jb2RpbmchCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0zMDAwMDU2KQoKRGFuaWVsIFN0ZW5iZXJnICgxMiBNYXkgMjAxMCkKLSBIb3dhcmQgQ2h1IGJyb3VnaHQgc3VwcG9ydCBmb3IgUlRNUC4gVGhpcyBpcyBwb3dlcmVkIGJ5IHRoZSB1bmRlcmx5aW5nCiAgbGlicnRtcCBsaWJyYXJ5LiBJdCBzdXBwb3J0cyBhIHJhbmdlIG9mIHZhcmlhdGlvbnMgYW5kICJzdWItcHJvdG9jb2xzIgogIHdpdGhpbiB0aGUgUlRNUCBmYW1pbHkuCgotIFBhdmVsIFJhaXNrdXAgYnJvdWdodCBzdXBwb3J0IGZvciBGVFAgZGlyZWN0b3J5IHdpbGRjYXJkIG1hdGNoaW5nIHRvIGFsbG93CiAgc2VsZWN0aXZlIGRvd25sb2FkaW5nLiBUbyBwcm92aWRlIHRoYXQsIGEgc2V0IG9mIG5ldyBvcHRpb25zIHdlcmUgYWRkZWQ6CgogICBDVVJMT1BUX1dJTERDQVJETUFUQ0gKICAgQ1VSTE9QVF9DSFVOS19CR05fRlVOQ1RJT04KICAgQ1VSTE9QVF9DSFVOS19FTkRfRlVOQ1RJT04KICAgQ1VSTE9QVF9DSFVOS19EQVRBCiAgIENVUkxPUFRfRk5NQVRDSF9GVU5DVElPTgoKICBUaGVyZSB3ZXJlIGFsc28gYSBzZXQgb2YgbmV3IHRlc3RzIGFkZGVkICg1NzQgLSA1NzcpIHRvIHZlcmlmeSB0aGlzLgoKS2FtaWwgRHVka2EgKDExIE1heSAyMDEwKQotIENSTCBzdXBwb3J0IGluIGxpYmN1cmwtTlNTIGhhcyBiZWVuIGNvbXBsZXRlbHkgYnJva2VuLiBOb3cgaXQgd29ya3MuIE9yaWdpbmFsCiAgYnVnIHJlcG9ydDogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzU4MTkyNgoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDEwKQotIERpcmsgTWFuc2tlIHJlcG9ydGVkIGEgcmVncmVzc2lvbi4gV2hlbiBjb25uZWN0aW5nIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSwKICB0aGVyZSB3ZXJlIHNpdHVhdGlvbnMgd2hlcmUgbGliY3VybCB3b3VsZG4ndCBzdG9yZSBjb25uZWN0IHRpbWUgY29ycmVjdGx5IGFzCiAgaXQgdXNlZCB0byAoYW5kIGlzIGRvY3VtZW50ZWQgdG8pIGRvLgoKICBVc2luZyBoaXMgZmluZSBzYW1wbGUgcHJvZ3JhbSB3ZSBjb3VsZCByZXBlYXQgaXQsIGFuZCBJIHdyb3RlIHVwIHRlc3QgY2FzZQogIDU3MyB1c2luZyB0aGF0IGNvZGUuIFRoZSBwcm9ibGVtIGRvZXMgbm90IGVhc2lseSBzaG93IGl0c2VsZiB1c2luZyB0aGUgbG9jYWwKICB0ZXN0IHN1aXRlIHRob3VnaC4KCiAgVGhlIGZpeCwgYWxzbyBhcyBzdWdnZXN0ZWQgYnkgRGlyaywgaXMgYSBiaXQgb24gdGhlIHVnbHkgc2lkZSBhcyBpdCBhZGRzIHlldAogIGFub3RoZXIgY2FsbCB0byBDdXJsX3ZlcmJvc2Vjb25uZWN0KCkgYW5kIHNldHRpbmcgdGhlIFRJTUVSX0NPTk5FQ1QgdGltZS4KICBUaGF0IHNpdHVhdGlvbiBpcyBzdWJqZWN0IGZvciBzb21lIGNsb3NlciBpbnNwZWN0aW9uIGluIHRoZSBmdXR1cmUuCgotIEhvd2FyZCBDaHUgc3BsaXQgdGhlIEkvTyBoYW5kbGluZyBmdW5jdGlvbnMgaW50byBwcml2YXRlIGhhbmRsZXJzLgoKICBIb3dhcmQgQ2h1IGJyb3VnaHQgdGhlIGJ1bGsgd29yayBvZiB0aGlzIHBhdGNoIHRoYXQgcHJvcGVybHkgbW92ZXMgb3V0IHRoZQogIHNlbmRpbmcgYW5kIHJlY3Zpbmcgb2YgZGF0YSB0byB0aGUgcGFydHMgb2YgdGhlIGNvZGUgdGhhdCBhcmUgcHJvcGVybHkKICByZXNwb25zaWJsZSBmb3IgdGhlIHZhcmlvdXMgd2F5cyBvZiBkb2luZyBzby4KCiAgRGFuaWVsIFN0ZW5iZXJnIGFzc2lzdGVkIHdpdGggcG9saXNoaW5nIGEgZmV3IGJpdHMgYW5kIGZpeGVkIHNvbWUgbWlub3IKICBmbGF3cyBpbiB0aGUgb3JpZ2luYWwgcGF0Y2guCgogIEFub3RoZXIgdXBzaWRlIG9mIHRoaXMgcGF0Y2ggaXMgdGhhdCB3ZSBub3cgYWJ1c2UgQ1VSTGNvZGVzIGxlc3Mgd2l0aCB0aGUKICAibWFnaWMiIC0xIHJldHVybiBjb2RlcyBhbmQgaW5zdGVhZCB1c2UgQ1VSTEVfQUdBSU4gbW9yZSBjb25zaXN0ZW50bHkuCgpEYW5pZWwgU3RlbmJlcmcgKDUgTWF5IDIwMTApCi0gSG9pLUhvIENoYW4gaW50cm9kdWNlZCBzdXBwb3J0IGZvciB1c2luZyB0aGUgUG9sYXJTU0wgbGlicmFyeS4gWW91IGNvbnRyb2wKICB0aGlzIHdpdGggdGhlIG5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wb2xhcnNzbC4KCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMTApCi0gQmVuIEdyZWVhciBtYWRlIHRlbG5ldCBhIGxvdCBiZXR0ZXIvZWFzaWVyIHRvIHVzZSBieSBhbiBhcHBsaWNhdGlvbjoKCiAgVGhlIG1haW4gY2hhbmdlIGlzIHRvIGFsbG93IGlucHV0IGZyb20gdXNlci1zcGVjaWZpZWQgbWV0aG9kcywgd2hlbiB0aGV5IGFyZQogIHNwZWNpZmllZCB3aXRoIENVUkxPUFRfUkVBREZVTkNUSU9OLiAgQWxsIGNhbGxzIHRvIGZmbHVzaChzdGRvdXQpIGluCiAgdGVsbmV0LmMgd2VyZSByZW1vdmVkLCB3aGljaCBtYWtlcyB1c2luZyAnY3VybCB0ZWxuZXQ6Ly9mb28uY29tJyBwYWluZnVsCiAgc2luY2UgcHJvbXB0cyBhbmQgb3RoZXIgZGF0YSBhcmUgbm90IGFsd2F5cyByZXR1cm5lZCB0byB0aGUgdXNlciBwcm9tcHRseS4KICBVc2UgJ2N1cmwgLS1uby1idWZmZXIgdGVsbmV0Oi8vZm9vLmNvbScgaW5zdGVhZC4gIEluIGdlbmVyYWwsIHRoZSB1c2VyCiAgc2hvdWxkIGhhdmUgdGhlaXIgQ1VSTE9QVF9XUklURUZVTkNUSU9OIGRvIGEgZmZsdXNoIGZvciBpbnRlcmFjdGl2ZSB1c2UuCgogIEFsc28gZml4IGFzc3VtcHRpb24gdGhhdCByZWFkaW5nIGZyb20gc3RkaW4gbmV2ZXIgcmV0dXJucyA8IDAuCiAgT2xkIGNvZGUgY291bGQgY3Jhc2ggaW4gdGhhdCBjYXNlLgoKICBDYWxsIHByb2dyZXNzIGZ1bmN0aW9ucyBpbiB0ZWxuZXQgbWFpbiBsb29wLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAxMCkKLSBNYWtlIHVzZSBvZiB0aGUgbGlic3NoMl9pbml0L2V4aXQgZnVuY3Rpb25zIHRoYXQgbGlic3NoMiBhZGRlZCBpbiB2ZXJzaW9uCiAgMS4yLjUuIFVzaW5nIHRoZW0gd2lsbCBpbXByb3ZlIGhvdyBsaWJjdXJsIHdvcmtzIGluIHRocmVhZGVkIHNpdHVhdGlvbnMgd2hlbgogIFNDUCBhbmQgU0ZUUCBhcmUgdHJhbnNmZXJlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjUgQXByIDIwMTApCi0gQmFzZWQgb24gd29yayBieSBLYW1pbCBEdWRrYSwgSSd2ZSBpbnRyb2R1Y2VkIHRoZSBuZXcgY29uZmlndXJlIG9wdGlvbgogIC0tZW5hYmxlLXRocmVhZGVkLXJlc29sdmVyLiBXaGVuIHVzZWQsIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgY2hlY2sgZm9yCiAgcHRocmVhZHMgYW5kIGlmIGFyb3VuZCwgaXQgd2lsbCBidWlsZCBsaWJjdXJsIHRvIHVzZSBwdGhyZWFkcyB0byBkbyBuYW1lCiAgcmVzb2x2aW5nIGluIGEgdGhyZWFkZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGEgZml4IHRvIG9mZmVyIGFuCiAgb3B0aW9uIHRoYXQgY2FuIGVuYWJsZSB0aGUgY29kZSB0aGF0IGFscmVhZHkgaW5jbHVkZWQuIFRoZSB0aHJlYWRlciByZXNvbHZlcgogIGNvZGUgd2FzIG1vc3RseSBhZGRlZCBvbiBKYW4gMjYgMjAxMC4KCkRhbmllbCBTdGVuYmVyZyAoMjQgQXByIDIwMTApCi0gQWxleCBCbGlnaCBpbnRyb2R1Y2VkIHRoZSAtLXByb3RvIGFuZCAtcHJvdG8tcmVkaXIgb3B0aW9ucyB0aGF0IGxpbWl0IHdoYXQKICBwcm90b2NvbHMgY3VybCBhY2NlcHRzIGZvciB0aGUgcmVxdWVzdHMgYW5kIHdoZW4gZm9sbG93aW5nIHJlZGlyZWN0cy4KCkthbWlsIER1ZGthICgyNCBBcHIgMjAxMCkKLSBGaXhlZCB0ZXN0NTM2IGluIG9yZGVyIHRvIG5vdCBmYWlsIHdpdGggdGhyZWFkZWQgRE5TIHJlc29sdmVyIGFuZCB0d2Vha2VkCiAgY29tbWVudHMgaW4gY2VydGFpbiBleGFtcGxlcyB1c2luZyBjdXJsX211bHRpX2Zkc2V0KCkuCgotIEZpeGVkIFNTTCBoYW5kc2hha2UgdGltZW91dCB1bmRlcmZsb3cgaW4gbGliY3VybC1OU1MsIHdoaWNoIGNhdXNlZCB0ZXN0NDA1CiAgdG8gaGFuZyBvbiBhIHNsb3cgbWFjaGluZS4KCkRhbmllbCBTdGVuYmVyZyAoMjEgQXByIDIwMTApCi0gVGhlIC1PIG9wdGlvbiBjYXVzZWQgY3VybCB0byBjcmFzaCBvbiB3aW5kb3dzIGFuZCBET1MgZHVlIHRvIHRoZSB0b29sCiAgd3JpdGluZyBvdXQgb2YgYm91bmRhcnkgbWVtb3J5LgoKWWFuZyBUc2UgKDIwIEFwciAyMDEwKQotIFJ1c2xhbiBHYXppem92IGRldGVjdGVkIHRoYXQgTVNWQyBtYWtlZmlsZXMgd2VyZSB1c2luZyB3c29jazMyLmxpYiBpbnN0ZWFkCiAgb2Ygd3MyXzMyLmxpYiwgdGhpcyBnZW5lcmF0ZWQgbGlua2luZyBpc3N1ZXMgb24gTVNWQyBJUHY2IGVuYWJsZWQgYnVpbGRzCiAgdGhhdCB3ZXJlIGRvbmUgdXNpbmcgdGhvc2UgbWFrZWZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBBcHIgMjAxMCkKLSAtSi8tLXJlbW90ZS1oZWFkZXItbmFtZSBkaWRuJ3Qgc3RyaXAgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJucyBvciBsaW5lZmVlZHMKICBwcm9wZXJseSwgc28gdGhleSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmaWxlIG5hbWUuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IEFwciAyMDEwKQotIEplcm9tZSBWb3VpbGxvbiBtYWRlIHRoZSBHbnVUTFMgU1NMIGhhbmRzaGFrZSBwaGFzZSBub24tYmxvY2tpbmcuCgotIFRoZSByZWNlbnQgb3ZlcmhhdWwgb2YgdGhlIFNTTCByZWN2IGZ1bmN0aW9uIG1hZGUgdGhlIEdudVRMUyBzcGVjaWZpYyBjb2RlCiAgdHJlYXQgYSB6ZXJvIHJldHVybmVkIGZyb20gZ251dGxzX3JlY29yZF9yZWN2KCkgYXMgYW4gZXJyb3IsIGFuZCB0aGlzIGNhdXNlZAogIG91ciBIVFRQUyB0ZXN0IGNhc2VzIHRvIGZhaWwuIFdlIGxlYXZlIGl0IHRvIHVwcGVyIGxheWVyIGNvZGUgdG8gZGV0ZWN0IGlmCiAgYW4gRU9GIGlzIGEgcHJvYmxlbSBvciBub3QuCgotIEkgcmV2ZXJ0ZWQgdGhlIHJlc29sdmVyIGZpeCBmcm9tIHllc3RlcmRheSBhbmQgaW5zdGVhZCByZW1vdmVkIGFsbCB1c2VzIG9mCiAgQUlfQ0FOT05OQU1FIGFsbCBvdmVyIGxpYmN1cmwgYW5kIG1hZGUgdGhlIG9ubHkgdXNlciBvZiB0aGF0IGluZm8gKGtyYjUuYykKICB1c2UgdGhlIGhvc3QgbmFtZSBmcm9tIHRoZSBVUkwgaW5zdGVhZC4gTm8gcmV2ZXJzZSByZXNvbHZpbmcgaXMgYSBnb29kCiAgdGhpbmcuCgotIFBhdWwgSG93YXJ0aCBtYWRlIGNvbmZpZ3VyZSBwcm9wZXJseSBkZXRlY3QgR1NTICJvbiBhbmNpZW50IExpbnV4IGRpc3Ryb3MiCiAgYnkgZWRpdGluZyBpbiB3aGljaCBvcmRlciB3ZSB1c2UgaGVhZGVycyB0byBkZXRlY3QgR1NTLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBBcHIgMjAxMCkKLSBSYWluZXIgQ2FuYXZhbiBmaWxlZCBidWcgcmVwb3J0ICMyOTg3MTk2IHRoYXQgaWRlbnRpZmllZCBsaWJjdXJsIGRvaW5nCiAgdW5uZWNlc2FyeSByZXZlcnNlIG5hbWUgbG9va3VwcyBpbiBtYW55IGNhc2VzIHdoZW4gYnVpbHQgdG8gdXNlIElQdjQgYW5kCiAgZ2V0YWRkcmluZm8oKS4gVGhlIGxvZ2ljIGZvciBJUHY2IGlzIG5vdyB1c2VkIGZvciBJUHY0IHRvby4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjM2NzkpCgpWZXJzaW9uIDcuMjAuMSAoMTQgQXByaWwgMjAxMCkKCkRhbmllbCBTdGVuYmVyZyAoOSBBcHIgMjAxMCkKLSBQcmVmaXhpbmcgdGhlIEZUUCBxdW90ZSBjb21tYW5kcyB3aXRoIGFuIGFzdGVyaXNrIHJlYWxseSBvbmx5IHdvcmtlZCBmb3IgdGhlCiAgcG9zdHF1b3RlIGFjdGlvbnMuIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgMjI3IGhhcyBiZWVuIGV4dGVuZGVkIHRvCiAgdmVyaWZ5LgoKS2FtaWwgRHVka2EgKDQgQXByIDIwMTApCi0gRWxpbWluYXRlZCBhIHJhY2UgY29uZGl0aW9uIGluIEN1cmxfcmVzb2x2X3RpbWVvdXQoKS4KCi0gUmVmYWN0b3JpemVkIGludGVyZmFjZSBvZiBDdXJsX3NzbF9yZWN2KCkvQ3VybF9zc2xfc2VuZCgpLgoKLSBsaWJjdXJsLU5TUyBub3cgcHJvdmlkZXMgbW9yZSBhY2N1cmF0ZSBtZXNzYWdlcyBhbmQgZXJyb3IgY29kZXMgaW4gY2FzZSBvZgogIGNsaWVudCBjZXJ0aWZpY2F0ZSBwcm9ibGVtLiAgRWl0aGVyIGR1cmluZyBjb25uZWN0aW9uLCBvciB0cmFuc2ZlciBwaGFzZS4KCkRhbmllbCBTdGVuYmVyZyAoMSBBcHIgMjAxMCkKLSBNYXR0IFdpeHNvbiBmb3VuZCBhbmQgZml4ZWQgYSBidWcgaW4gdGhlIFNDUC9TRlRQIGFyZWEgd2hlcmUgdGhlIGNvZGUKICB0cmVhdGVkIGEgMCByZXR1cm4gY29kZSBmcm9tIGxpYnNzaDIgdG8gYmUgdGhlIHNhbWUgYXMgRUFHQUlOIHdoaWxlIGluCiAgcmVhbGl0eSBpdCBpc24ndC4gVGhlIHByb2JsZW0gY2F1c2VkIGEgaGFuZyBpbiBTRlRQIHRyYW5zZmVycyBmcm9tIGEKICBNZXNzYWdlV2F5IHNlcnZlci4KCkRhbmllbCBTdGVuYmVyZyAoMjggTWFyIDIwMTApCi0gQmVuIEdyZWVhcjogSWYgeW91IHBhc3MgYSBVUkwgdG8gcG9wMyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBtZXNzYWdlIElEIGFzCiAgcGFydCBvZiB0aGUgVVJMLCBpdCB3b3VsZCBwcmV2aW91c2x5IGFzayBmb3IgJ0lOQk9YJyB3aGljaCBqdXN0IGNhdXNlcyB0aGUKICBwb3AzIHNlcnZlciB0byByZXR1cm4gYW4gZXJyb3IuCgogIE5vdyBsaWJjdXJsIHRyZWF0cyBlbiBlbXB0eSBtZXNzYWdlIElEIGFzIGEgcmVxdWVzdCBmb3IgTElTVCAobGlzdCBvZiBwb3AzCiAgbWVzc2FnZSBJRHMpLiAgVXNlcidzIGNvZGUgY291bGQgdGhlbiBwYXJzZSB0aGlzIGFuZCBkb3dubG9hZCBpbmRpdmlkdWFsCiAgbWVzc2FnZXMgYXMgZGVzaXJlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgTWFyIDIwMTApCi0gQmVuIEdyZWVhciBicm91Z2h0IGEgcGF0Y2ggdGhhdCBmcm9tIG5vdyBvbiBhbGxvd3MgYWxsIHByb3RvY29scyB0byBzcGVjaWZ5CiAgbmFtZSBhbmQgdXNlciB3aXRoaW4gdGhlIFVSTCwgaW4gdGhlIHNhbWUgbWFubmVyIEhUVFAgYW5kIEZUUCBoYXZlIGJlZW4KICBhbGxvd2VkIHRvIGluIHRoZSBwYXN0IC0gYWx0aG91Z2ggZmFyIGZyb20gYWxsIG9mIHRoZSBsaWJjdXJsIHN1cHBvcnRlZAogIHByb3RvY2xzIGFjdHVhbGx5IGhhdmUgdGhhdCBmZWF0dXJlIGluIHRoZWlyIFVSTCBkZWZpbml0aW9uIHNwZWMuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IE1hciAyMDEwKQotIEJlbiBHcmVlYXIgYnJvdWdodCBjb2RlIHRoYXQgbWFrZXMgdGhlIHJhdGUgbGltaXRpbmcgY29kZSBmb3IgdGhlIGVhc3kKICBpbnRlcmZhY2UgYSBiaXQgc21vb3RoZXIgYXMgaXQgaW50cm9kdWNlcyBzdWItc2Vjb25kIHNsZWVwcyBkdXJpbmcgaXQgYW5kIGl0CiAgYWxzbyB0YWtlcyB0aGUgYnVmZmVyIHNpemVzIGludG8gYWNjb3VudC4KCkRhbmllbCBTdGVuYmVyZyAoMjQgTWFyIDIwMTApCi0gQm9iIFJpY2htb25kOiBUaGVyZSdzIGFuIGFubm95aW5nIHNpdHVhdGlvbiB3aGVyZSBsaWJjdXJsIHdpbGwgcmVhZCBuZXcgSFRUUAogIHJlc3BvbnNlIGRhdGEgZnJvbSBhIHNvY2tldCwgdGhlbiBjaGVjayBpZiBpdCdzIGEgdGltZW91dCBpZiBvbmUgaXMgc2V0LiBJZgogIHRoZSBsYXN0IHBhY2tldCByZWNlaXZlZCBjb25zdGl0dXRlcyB0aGUgZW5kIG9mIHRoZSByZXNwb25zZSBib2R5LCBsaWJjdXJsCiAgc3RpbGwgdHJlYXRzIGl0IGFzIGEgdGltZW91dCBjb25kaXRpb24gYW5kIHJlcG9ydHMgYSBtZXNzYWdlIGxpa2U6CgogICJPcGVyYXRpb24gdGltZWQgb3V0IGFmdGVyIDMwMDAgbWlsbGlzZWNvbmRzIHdpdGggODc2IG91dCBvZiA4NzYgYnl0ZXMKICByZWNlaXZlZCIKCiAgSXQgc2hvdWxkIG9ubHkgYSB0aW1lb3V0IGlmIHRoZSB0aW1lciBsYXBzZWQgYW5kIHdlIERJRE4nVCByZWNlaXZlIHRoZSBlbmQKICBvZiB0aGUgcmVzcG9uc2UgYm9keSB5ZXQuCgotIENocmlzdG9waGVyIENvbnJveSBmaXhlZCBhIHByb2JsZW0gd2l0aCBSVFNQIGFuZCBHRVRfUEFSQU1FVEVSIHJlcG9ydGVkCiAgdG8gdXMgYnkgTWFzc2ltbyBDYWxsZWdhcmkuIFRoZXJlJ3MgYSBuZXcgdGVzdCBjYXNlIDU3MiB0aGF0IHZlcmlmaWVzIHRoaXMKICBub3cuCgotIFRoZSAnYXJlcycgc3VidHJlZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNvdXJjZSByZXBvc2l0b3J5LiBJdCB3YXMKICBhbHdheXMgYSBzZXBhcmF0ZSBwcm9qZWN0IHRoYXQgc29ydCBvZiBwaWdneWJhY2tlZCBvbiB0aGUgY3VybCBwcm9qZWN0IHNpbmNlCiAgdGhlIGRhd24gb2YgdGltZXMgYW5kIG5vdyB0aGUgdGltZSBoYXMgY29tZSBmb3IgaXQgdG8gZ28gc3RhbmQgb24gaXRzIG93bgogIGxlZ3MgYW5kIGNvbnRpbnVlIGxpdmluZyBpdHMgb3duIGxpZmUuIEFsbCBkZXRhaWxzIG9uIGMtYXJlcyBhbmQgaXRzIG5ldwogIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgaXMgZm91bmQgYXQgaHR0cDovL2MtYXJlcy5oYXh4LnNlLwoKRGFuaWVsIFN0ZW5iZXJnICgyMyBNYXIgMjAxMCkKLSBLZW5ueSBUbyBmaWxlZCB0aGUgYnVnIHJlcG9ydCAjMjk2MzY3OSB3aXRoIHBhdGNoIHRvIGZpeCBhIHByb2JsZW0gaGUKICBleHBlcmllbmNlZCB3aXRoIGRvaW5nIG11bHRpIGludGVyZmFjZSBIVFRQIFBPU1Qgb3ZlciBhIHByb3h5IHVzaW5nCiAgUFJPWFlUVU5ORUwuIEhlIGZvdW5kIGEgY2FzZSB3aGVyZSBpdCB3b3VsZCBjb25uZWN0IGZpbmUgYnV0IGJpdHMudGNwY29ubmVjdAogIHdhcyBub3Qgc2V0IGNvcnJlY3Qgc28gbGliY3VybCBkaWRuJ3Qgd29yayBwcm9wZXJseS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NjM2NzkpCgotIEFrb3MgUGFzenRvcnkgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzU3MjI3NgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz01NzIyNzYgbWVudGlvbmluZyBhIHByb2JsZW0KICB3aXRoIGEgcmVzb3VyY2UgdGhhdCByZXR1cm5zIGNodW5rZWQtZW5jb2RlZCBfYW5kXyB3aXRoIGEgQ29udGVudC1MZW5ndGgKICBhbmQgbGliY3VybCBmYWlsZWQgdG8gcHJvcGVybHkgaWdub3JlIHRoZSBsYXR0ZXIgaW5mb3JtYXRpb24uCgotIEhhdWtlIER1ZGVuIHByb3ZpZGVkIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSBjcmFzaC4KICBIaXMgZXhhbXBsZSBzaW1wbHkgdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBkaWQgZmlyc3Qgb25lIEZUUCB0cmFuc2ZlcgogIGFuZCBhZnRlciBjb21wbGV0aW9uIGl0IHVzZWQgYSBzZWNvbmQgZWFzeSBoYW5kbGUgYW5kIGRpZCBhbm90aGVyIEZUUAogIHRyYW5zZmVyIG9uIHRoZSBzYW1lIEZUUCBzZXJ2ZXIuCgogIFRoaXMgdHJpZ2dlcmVkIGEgYnVnIGluIHRoZSAiZGVsYXllZCBlYXN5IGhhbmRsZSBraWxsIiBzeXN0ZW0gdGhhdCBjdXJsCiAgdXNlczogd2hlbiBhbiBGVFAgY29ubmVjdGlvbiBpcyBsZWZ0IGFsaXZlIGl0IG11c3Qga2VlcCBhbiBlYXN5IGhhbmRsZQogIGFyb3VuZCBpbnRlcm5hbGx5IC0gb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgaGF2aW5nIGFuIGVhc3kgaGFuZGxlIHdoZW4gaXQKICBsYXRlciBkaXNjb25uZWN0cyBpdC4gVGhlIGNvZGUgYXNzdW1lZCB0aGF0IHdoZW4gdGhlIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkCiAgYW5kIGFuIGludGVybmFsIHJlZmVyZW5jZSB3YXMgbWFkZSwgdGhhdCB2ZXJzaW9uIGNvdWxkIGJlIGtpbGxlZCBsYXRlciBvbgogIHdoZW4gYSBuZXcgZWFzeSBoYW5kbGUgY2FtZSB1c2luZyB0aGUgc2FtZSBjb25uZWN0aW9uLiBUaGlzIHdhcyB3cm9uZyBhcwogIEhhdWtlJ3MgZXhhbXBsZSBzaG93ZWQgdGhhdCB0aGUgcmVtb3ZlZCBoYW5kbGUgd2Fzbid0IGtpbGxlZCBmb3IgcmVhbCB1bnRpbAogIGxhdGVyLiBUaGlzIGNhdXNlZCBhIGRvdWJsZSBjbG9zZSBhdHRlbXB0ID0+IHNlZ2ZhdWx0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBNYXIgMjAxMCkKLSBUaG9tYXMgTG9wYXRpYyBmaXhlZCB0aGUgYWxhcm0oKS1iYXNlZCBETlMgdGltZW91dDoKCiAgTG9va2luZyBhdCB0aGUgY29kZSBvZiBDdXJsX3Jlc29sdl90aW1lb3V0KCkgaW4gaG9zdGlwLmMsIEkgdGhpbmsgdGhhdCBpbgogIGNhc2Ugb2YgYSB0aW1lb3V0LCB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0FMUk0gbmV2ZXIgZ2V0cyByZW1vdmVkLiBJCiAgdGhpbmsgdGhhdCBpbiBteSBjYXNlIGl0IGdldHMgZXhlY3V0ZWQgYXQgc29tZSBwb2ludCBsYXRlciBvbiB3aGVuIGV4ZWN1dGlvbgogIGhhcyBsb25nIGxlZnQgQ3VybF9yZXNvbHZfdGltZW91dCgpIG9yIGV2ZW4gdGhlIGNVUkwgbGlicmFyeS4KCiAgVGhlIGNvZGUgdGhhdCBpcyBqdW1wZWQgdG8gd2l0aCBzaWdsb25nam1wKCkgc2ltcGx5IHNldHMgdGhlIGVycm9yIG1lc3NhZ2UKICB0byAibmFtZSBsb29rdXAgdGltZWQgb3V0IiBhbmQgdGhlbiByZXR1cm5zIHdpdGggQ1VSTFJFU09MVl9FUlJPUi4gSSBndWVzcwogIHRoYXQgaW5zdGVhZCBvZiBzaW1wbHkgcmV0dXJuaW5nIHdpdGhvdXQgY2xlYW5pbmcgdXAsIHRoZSBjb2RlIHNob3VsZCBoYXZlIGEKICBnb3RvIHRoYXQganVtcHMgdG8gdGhlIHNwb3QgcmlnaHQgYWZ0ZXIgdGhlIGNhbGwgdG8gQ3VybF9yZXNvbHYoKS4KCkthbWlsIER1ZGthICgyMiBNYXIgMjAxMCkKLSBEb3VnbGFzIFN0ZWlud2FuZCBjb250cmlidXRlZCBhIHBhdGNoIGZpeGluZyBpbnN1ZmZpY2llbnQgaW5pdGlhbGl6YXRpb24gaW4KICBDdXJsX2Nsb25lX3NzbF9jb25maWcoKQoKRGFuaWVsIFN0ZW5iZXJnICgyMSBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGltcHJvdmVkIFRGVFA6IHRoZSBlcnJvciBjb2RlIHJldHVybmluZyBhbmQgdGhlIHRyZWF0bWVudAogIG9mIFRTSVpFID09IDAgd2hlbiB1cGxvYWRpbmcuCgotIFdlJ3ZlIHN3aXRjaGVkIGZyb20gQ1ZTIHRvIGdpdC4gU2VlIGh0dHA6Ly9jdXJsLmhheHguc2Uvc291cmNlLmh0bWwKCkthbWlsIER1ZGthICgxOSBNYXIgMjAxMCkKLSBJbXByb3ZlZCBDdXJsX3JlYWQoKSB0byBub3QgaWdub3JlIHRoZSBlcnJvciByZXR1cm5lZCBmcm9tIEN1cmxfc3NsX3JlY3YoKS4KCkRhbmllbCBTdGVuYmVyZyAoMTUgTWFyIDIwMTApCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgYnJvdWdodCBhIHBhdGNoOgoKICBUaGUgcHJvYmxlbSBtZW50aW9uZWQgb24gRGVjIDEwIDIwMDkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkwNTIyMCkgd2FzIG9ubHkgcGFydGlhbGx5IGZpeGVkLgogIFBhcnRpYWxseSBiZWNhdXNlIGFuIGVhc3kgaGFuZGxlIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbWFueSBjb25uZWN0aW9ucyBpbgogIHRoZSBjYWNoZSAoZS5nLiBpZiB0aGVyZSBpcyBhIHJlZGlyZWN0IGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIGVhc3kKICBoYW5kbGUpLiAgVGhlIHByZXZpb3VzIHBhdGNoIG9ubHkgY2xlYW5lZCB1cCB0aGUgZmlyc3Qgb25lLiBUaGUgbmV3IGZpeCBub3cKICByZW1vdmVzIHRoZSBlYXN5IGhhbmRsZSBmcm9tIGFsbCBjb25uZWN0aW9ucywgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4KCkRhbmllbCBTdGVuYmVyZyAoNiBNYXIgMjAxMCkKLSBCZW4gR3JlZWFyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSByYXRlIGxpbWl0aW5nIGxvZ2ljIGZvciBURlRQIHdoZW4KICB0aGUgZWFzeSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDUgTWFyIDIwMTApCi0gRGFuaWVsIEpvaG5zb24gcHJvdmlkZWQgZml4ZXMgZm9yIGJ1aWxkaW5nIGN1cmwgd2l0aCB0aGUgY2xhbmcgY29tcGlsZXIuCgpZYW5nIFRzZSAoNSBNYXIgMjAxMCkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBkZXRlY3RlZCBhbmQgZml4ZWQgYSBkb3VibGUgZnJlZSBpbiBidWlsZHMgZG9uZQogIHdpdGggdGhyZWFkZWQgcmVzb2x2ZXIgZW5hYmxlZCAoV2luZG93cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24pIHRoYXQgd291bGQKICBnZXQgdHJpZ2dlcmVkIHdoZW4gYSBjdXJsIGhhbmRsZSBpcyBjbG9zZWQgd2hpbGUgZG9pbmcgRE5TIHJlc29sdXRpb24uCgpEYW5pZWwgU3RlbmJlcmcgKDIgTWFyIDIwMTApCi0gW0RhbmllbCBKb2huc29uXSBJJ3ZlIGJlZW4gdHJ5aW5nIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBjbGFuZyBvbiBEYXJ3aW4gYW5kCiAgcmFuIGludG8gc29tZSBpc3N1ZXMgd2l0aCB0aGUgR1NTQVBJIHRlc3RzIGluIGNvbmZpZ3VyZS5hYy4gVGhlIHRlc3RzIGZpcnN0CiAgdHJ5IHRvIGRldGVybWluZSB0aGUgaW5jbHVkZSBkaXJzIGFuZCBsaWJzIGFuZCBzZXQgQ1BQRkxBR1MgYW5kIExJQlMKICBhY2NvcmRpbmdseS4gSXQgdGhlbiBjaGVja3MgZm9yIHRoZSBoZWFkZXJzIGFuZCBmaW5hbGx5IHNldHMgTElCUyBhIHNlY29uZAogIHRpbWUsIGNhdXNpbmcgdGhlIGxpYnMgdG8gYmUgaW5jbHVkZWQgdHdpY2UuIFRoZSBmaXJzdCBzZXR0aW5nIG9mIExJQlMgc2VlbXMKICByZWR1bmRhbnQgYW5kIHNob3VsZCBiZSBsZWZ0IG91dCwgc2luY2UgdGhlIGZpcnN0IHBhcnQgaXMgb3RoZXJ3aXNlIGp1c3QKICBhYm91dCBmaW5kaW5nIGhlYWRlcnMuCgogIE15IHNlY29uZCBpc3N1ZSBpcyB0aGF0ICdrcmI1LWNvbmZpZyAtLWxpYnMgZ3NzYXBpJyBvbiBEYXJ3aW4gaXMgbGVzcyB0aGFuCiAgdXNlbGVzcyBhbmQgcmV0dXJucyBqdW5rIHRoYXQsIHdoaWxlIGl0IGhhcHBlbnMgdG8gd29yayB3aXRoIGdjYywgY2F1c2VzCiAgY2xhbmcgdG8gY2hva2UuIEZvciBleGFtcGxlLCAtLWxpYnMgcmV0dXJucyAkQ0ZMQUdTIGFsb25nIHdpdGggdGhlIGxpYnMsCiAgd2hpY2ggaXMgcmVhbGx5IHJldGFyZGVkLiBTaW1wbHkgc2V0dGluZyAnTElCUz0iJExJQlMgLWxnc3NhcGlfa3JiNQogIC1scmVzb2x2Iicgb24gRGFyd2luIGlzIHN1ZmZpY2llbnQuCgotIEJhc2VkIG9uIHBhdGNoIHByb3ZpZGVkIGJ5IEphY29iIE1vc2hlbmtvLCB0aGUgdHJhbnNmZXIgbG9naWMgbm93IHByb3Blcmx5CiAgbWFrZXMgc3VyZSB0aGF0IHdoZW4gdXNpbmcgc3ViLXNlY29uZCB0aW1lb3V0cywgdGhlcmUncyBubyBmaW5hbCBiYWQgMTAwMG1zCiAgd2FpdC4gUHJldmlvdXNseSwgYSBzdWItc2Vjb25kIHRpbWVvdXQgd291bGQgb2Z0ZW4gbWFrZSB0aGUgZWxhcHNlZCB0aW1lIGVuZAogIHVwIHRoZSB0aW1lIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kIChlLmcuIDFzIGZvciAyMDBtcyB0aW1lb3V0KQoKLSBBbmRyZWkgQmVuZWEgZmlsZWQgYnVnIHJlcG9ydCAjMjk1NjY5OCBhbmQgcG9pbnRlZCBvdXQgdGhhdCB0aGUKICBDVVJMT1BUX0NFUlRJTkZPIGZlYXR1cmUgbGVha2VkIG1lbW9yeSBkdWUgdG8gYSBtaXNzaW5nIE9wZW5TU0wgZnVuY3Rpb24KICBjYWxsLiBIZSBwcm92aWRlZCB0aGUgcGF0Y2ggdG8gZml4IGl0IHRvby4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1NjY5OAoKLSBNYXJrdXMgRHVmdCBwb2ludGVkIG91dCBpbiBidWcgIzI5NjE3OTYgdGhhdCBldmVuIHRob3VnaCBJbnRlcml4IGhhcyBhCiAgcG9sbCgpIGZ1bmN0aW9uIGl0IGRvZXNuJ3QgcXVpdGUgd29yayB0aGUgd2F5IHdlIHdhbnQgaXQgc28gd2UgbXVzdCBkaXNhYmxlCiAgaXQsIGFuZCBoZSBhbHNvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIGl0LgoKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTYxNzk2CgotIE1hZGUgdGhlIHBpbmdwb25nIHRpbWVvdXQgY29kZSBwcm9wZXJseSBkZWFsIHdpdGggdGhlIHJlc3BvbnNlIHRpbWVvdXQgQU5ECiAgdGhlIGdsb2JhbCB0aW1lb3V0IGlmIHNldC4gQWxzbywgYXMgd2FzIHJlcG9ydGVkIGluIHRoZSBidWcgcmVwb3J0ICMyOTU2NDM3CiAgYnkgUnlhbiBDaGFuLCB0aGUgdGltZSBzdGFtcCB0byB1c2UgYXMgYmFzaXMgZm9yIHRoZSBwZXIgY29tbWFuZCB0aW1lb3V0IHdhcwogIG5vdCBzZXQgcHJvcGVybHkgaW4gdGhlIERPTkUgcGhhc2UgZm9yIEZUUCAoYW5kIG5vdCBmb3IgU01UUCkgc28gSSBmaXhlZAogIHRoYXQganVzdCBub3cuIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBjb21wYXJlZCB0byA3LjE5LjcgZHVlIHRvIHRoZQogIGNvbnZlcnNpb24gb2YgRlRQIGNvZGUgb3ZlciB0byB0aGUgZ2VuZXJpYyBwaW5ncG9uZyBjb25jZXB0cy4KCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjk1NjQzNwoKRGFuaWVsIFN0ZW5iZXJnICgxIE1hciAyMDEwKQotIEJlbiBHcmVlYXIgcHJvdmlkZWQgYW4gdXBkYXRlIGZvciBURlRQIHRoYXQgZml4ZXMgdXBsb2FkLgoKLSBXZXNsZXkgTWlhdyByZXBvcnRlZCBidWcgIzI5NTgxNzkgd2hpY2ggaWRlbnRpZmllZCBhIGNhc2Ugb2YgbG9vcGluZyBkdXJpbmcKICBPcGVuU1NMIGJhc2VkIFNTTCBoYW5kc2hha2luZyBldmVuIHRob3VnaCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkIGFuZAogIHRoZXJlIHdhcyBubyBnb29kIHJlYXNvbiBmb3IgaXQuCgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTgxNzkKCkRhbmllbCBTdGVuYmVyZyAoMjYgRmViIDIwMTApCi0gUGF0IFJheSBpbiBidWcgIzI5NTg0NzQgcG9pbnRlZCBvdXQgYW4gb2ZmLWJ5LW9uZSBjYXNlIHdoZW4gcmVjZWl2aW5nIGEKICBjaHVua2VkLWVuY29kaW5nIHRyYWlsZXIuCgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTg0NzQKCkRhbmllbCBGYW5kcmljaCAoMjUgRmViIDIwMTApCi0gRml4ZWQgYSBjb3VwbGUgb2Ygb3V0IG9mIG1lbW9yeSBsZWFrcyBhbmQgYSBzZWdmYXVsdCBpbiB0aGUgU01UUCAmIElNQVAgY29kZS4KCllhbmcgVHNlICgyNSBGZWIgMjAxMCkKLSBJIGZpeGVkIGJ1ZyByZXBvcnQgIzI5NTgwNzQgaW5kaWNhdGluZwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTU4MDc0KSB0aGF0IGN1cmwgb24gV2luZG93cyB3aXRoCiAgb3B0aW9uIC0tdHJhY2UtdGltZSBkaWQgbm90IHVzZSBsb2NhbCB0aW1lIHdoZW4gdGltZXN0YW1waW5nIHRyYWNlIGxpbmVzLgogIFRoaXMgY291bGQgYWxzbyBoYXBwZW4gb24gb3RoZXIgc3lzdGVtcyBkZXBlbmRpbmcgb24gdGltZSBzb3V1cmNlLgoKUGF0cmljayBNb25uZXJhdCAoMjIgRmViIDIwMTApCi0gUHJvcGVyIGhhbmRsaW5nIG9mIFNUQVJUVExTIG9uIFNNVFAsIHRha2luZyBDVVJMVVNFU1NMX1RSWSBpbnRvIGFjY291bnQuCi0gU01UUCBmYWxscyBiYWNrIHRvIFJGQzgyMSBIRUxPIHdoZW4gRUhMTyBmYWlscyAoYW5kIFNTTCBpcyBub3QgcmVxdWlyZWQpLgotIFVzZSBvZiB0cnVlIGxvY2FsIGhvc3QgbmFtZSAoaS5lLjogdmlhIGdldGhvc3RuYW1lKCkpIHdoZW4gYXZhaWxhYmxlLCBhcwogIGRlZmF1bHQgYXJndW1lbnQgdG8gU01UUCBIRUxPL0VITE8uCi0gVGVzdCBjYXNlIDgwNCBmb3IgSEVMTyBmYWxsYmFjay4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRmViIDIwMTApCi0gRml4ZWQgdGhlIFNNVFAgY29tcGxpYW5jZSBieSBtYWtpbmcgc3VyZSBSQ1BUIFRPIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkCiAgcHJvcGVybHkgaW4gYW5nbGUgYnJhY2tldHMuIFJlY2lwaWVudHMgcHJvdmlkZWQgd2l0aCBDVVJMT1BUX01BSUxfUkNQVCBub3cKICBnZXQgYW5nbGUgYnJhY2tldCB3cmFwcGluZyBhdXRvbWF0aWNhbGx5IGJ5IGxpYmN1cmwgdW5sZXNzIHRoZSByZWNpcGllbnQKICBzdGFydHMgd2l0aCBhbiBhbmdsZSBicmFja2V0IGFzIHRoZW4gdGhlIGFwcCBpcyBhc3N1bWVkIHRvIGRlYWwgd2l0aCB0aGF0CiAgcHJvcGVybHkgb24gaXRzIG93bi4KCi0gSSBtYWRlIHRoZSBTTVRQIGNvZGUgZXhwZWN0IGEgMjUwIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgc2VydmVyIGFmdGVyIHRoZQogIGZ1bGwgREFUQSBoYXMgYmVlbiBzZW50LCBhbmQgSSBtb2RpZmllZCB0aGUgdGVzdCBTTVRQIHNlcnZlciB0byBhbHNvIHNlbmQKICB0aGF0IHJlc3BvbnNlLiBBcyB1c3VhbCwgdGhlIERPTkUgb3BlcmF0aW9uIHRoYXQgaXMgbWFkZSBhZnRlciBhIGNvbXBsZXRlZAogIHRyYW5zZmVyIGlzIHN0aWxsIG5vdCBkb2FibGUgaW4gYSBub24tYmxvY2tpbmcgd2F5IHNvIHRoaXMgd2FpdGluZyBmb3IgMjUwCiAgaXMgdW5mb3J0dW5hdGVseSBtYWRlIGJsb2NraW5nbHkuCgpZYW5nIFRzZSAoMTQgRmViIDIwMTApCi0gT3ZlcmhhdWxlZCB0ZXN0IHN1aXRlIGdldHBhcnQoKSBmdW5jdGlvbi4gRml4aW5nIHBvdGVudGlhbCBvdXQgb2YgYm91bmRzCiAgc3RhY2sgYW5kIG1lbW9yeSBvdmVyd3JpdGVzIHRyaWdnZXJlZCB3aXRoIGh1Z2UgdGVzdCBjYXNlIGRlZmluaXRpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBGZWIgMjAxMCkKLSBNYXJ0aW4gSGFnZXIgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGEgbWlzc2luZyBxdW90ZSBpbiBsaWJjdXJsLm00CgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTUxMzE5KQoKLSBUb20gRG9ub3ZhbiBmaXhlZCB0aGUgQ1VSTF9GT1JNQVRfKiBkZWZpbmVzIHdoZW4gYnVpbGRpbmcgd2l0aCBjbWFrZS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5NTEyNjkpCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEZlYiAyMDEwKQotIEphY2sgWmhhbmcgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggU01UUDogd2Ugd3JvbmdseSB1c2VkIG11bHRpcGxlIGFkZHJlc3NlcwogIGluIHRoZSBzYW1lIFJDUFQgVE8gbGluZSwgd2hlbiB0aGV5IHNob3VsZCBiZSBzZW50IGluIHNlcGFyYXRlIHNpbmdsZQogIGNvbW1hbmRzLiBJIHVwZGF0ZWQgdGVzdCBjYXNlIDgwMiB0byB2ZXJpZnkgdGhpcy4KCi0gSSBhbHNvIGZpeGVkIGEgYmFkIHVzZSBvZiBteV9zZXRvcHRfc3RyKCkgb2YgQ1VSTE9QVF9NQUlMX1JDUFQgaW4gdGhlIGN1cmwKICB0b29sIHdoaWNoIG1hZGUgaXQgdHJ5IHRvIG91dHB1dCBpdCBhcyBzdHJpbmcgZm9yIHRoZSAtLWxpYmN1cmwgZmVhdHVyZQogIHdoaWNoIGNvdWxkIGxlYWQgdG8gY3Jhc2hlcy4KCllhbmcgVHNlICgxMSBGZWIgMjAxMCkKLSBTdGV2ZW4gTS4gU2Nod2VkYSBmaXhlZCBWTVMgYnVpbGRlciBiYWQgYmVoYXZpb3Igd2hlbiB1c2VkIGluIGEgYmF0Y2ggam9iLAogIHJlbW92ZWQgb2Jzb2xldGUgYmF0Y2hfY29tcGlsZS5jb20gYW5kIGRlZmluZXMuY29tIGFuZCB1cGRhdGVkIFZNUyByZWFkbWUuCgpWZXJzaW9uIDcuMjAuMCAoOSBGZWJydWFyeSAyMDEwKQoKRGFuaWVsIFN0ZW5iZXJnICg5IEZlYiAyMDEwKQotIFdoZW4gZG93bmxvYWRpbmcgY29tcHJlc3NlZCBjb250ZW50IG92ZXIgSFRUUCBhbmQgdGhlIGFwcCBhc2tlZCBsaWJjdXJsIHRvCiAgYXV0b21hdGljYWxseSB1bmNvbXByZXNzIGl0IHdpdGggdGhlIENVUkxPUFRfRU5DT0RJTkcgb3B0aW9uLCBsaWJjdXJsIGNvdWxkCiAgd3JvbmdseSBwcm92aWRlIHRoZSBjYWxsYmFjayB3aXRoIG1vcmUgZGF0YSB0aGFuIHRoZSBtYXhpbXVtIGRvY3VtZW50ZWQKICBhbW91bnQuIEFuIGFwcGxpY2F0aW9uIGNvdWxkIHRodXMgZ2V0IHRyaWNrZWQgaW50byBiYWRuZXNzIGlmIHRoZSBtYXhpbXVtCiAgbGltaXQgd2FzIHRydXN0ZWQgdG8gYmUgZW5mb3JjZWQgYnkgbGliY3VybCBpdHNlbGYgKGFzIGl0IGlzIGRvY3VtZW50ZWQpLgoKICBUaGlzIGlzIGZ1cnRoZXIgZGV0YWlsZWQgYW5kIGV4cGxhaW5lZCBpbiB0aGUgbGliY3VybCBzZWN1cml0eSBhZHZpc29yeQogIDIwMTAwMjA5IGF0CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDEwMDIwOS5odG1sCgpEYW5pZWwgRmFuZHJpY2ggKDMgRmViIDIwMTApCi0gQ2hhbmdlZCB0aGUgV2F0Y29tIG1ha2VmaWxlcyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIGtlZXAgaW4gc3luYyB3aXRoCiAgTWFrZWZpbGUuaW5jIHNpbmNlIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgZGlyZWN0bHkuCgpZYW5nIFRzZSAoMiBGZWIgMjAxMCkKLSBTeW1ib2wgQ1VSTF9GT1JNQVRfT0ZGX1Qgbm93IG9ic29sZXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UsCiAgc3ltYm9sIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB3aGVuIGJ1aWxkaW5nIHdpdGggQ1VSTF9OT19PTERJRVMgZGVmaW5lZC4gVXNlCiAgb2YgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCBpcyBwcmVmZXJyZWQgc2luY2UgNy4xOS4wCgpEYW5pZWwgU3RlbmJlcmcgKDEgRmViIDIwMTApCi0gVXNpbmcgdGhlIG11bHRpX3NvY2tldCBBUEksIGl0IHR1cm5zIG91dCBhdCB0aW1lcyBpdCBzZWVtZWQgdG8gImZvcmdldCIKICBjb25uZWN0aW9ucyAod2hpY2ggY2F1c2VkIGEgaGFuZykuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYW4gZXhpc3RpbmcgKDcuMTkuNykKICBidWcgaW4gbGliY3VybCAodGhhdCdzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgdGltZSkgYW5kIGl0IGhhcHBlbmVkIGxpa2UKICB0aGlzOgoKICBUaGUgYXBwIGNhbGxzIGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHRvIGFkZCBhIG5ldyBlYXN5IGhhbmRsZSwgbGliY3VybCB3aWxsCiAgdGhlbiBzZXQgaXQgdG8gdGltZW91dCBpbiAxIG1pbGxpc2Vjb25kIHNvIGxpYmN1cmwgd2lsbCB0ZWxsIHRoZSBhcHAgYWJvdXQKICBpdC4KCiAgVGhlIGFwcCdzIHRpbWVvdXQgZmlyZXMgb2ZmIHRoYXQgdGhlcmUncyBhIHRpbWVvdXQsIHRoZSBhcHAgY2FsbHMgbGliY3VybCBhcwogIHdlIHNvIG9mdGVuIGRvY3VtZW50IGl0OgoKICBkbyB7CiAgIHJlcyA9IGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbiguLi4gVElNRU9VVCAuLi4pOwogIH0gd2hpbGUoQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNID09IHJlcyk7CgogIEFuZCB0aGlzIGlzIHRoZSBwcm9ibGVtIG51bWJlciBvbmU6CgogIFdoZW4gY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgaXMgY2FsbGVkIHdpdGggbm8gc3BlY2lmaWMgaGFuZGxlLCBidXQgb25seQogIGEgdGltZW91dC1hY3Rpb24sIGl0IHdpbGwgKm9ubHkqIHBlcmZvcm0gYWN0aW9ucyB3aXRoaW4gbGliY3VybCB0aGF0IGFyZQogIG1hcmtlZCB0byBydW4gYXQgdGhpcyB0aW1lLiBJbiB0aGlzIGNhc2UsIHRoZSByZXF1ZXN0IHdvdWxkIGdvIGZyb20gSU5JVCB0bwogIENPTk5FQ1QgYW5kIHJldHVybiBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0uIFdoZW4gdGhlIGFwcCB0aGVuIGNhbGxzIGxpYmN1cmwKICBhZ2FpbiwgdGhlcmUncyBubyB0aW1lciBzZXQgZm9yIHRoaXMgaGFuZGxlIHNvIGl0IHJlbWFpbnMgaW4gdGhlIENPTk5FQ1QKICBzdGF0ZS4gVGhlIENPTk5FQ1Qgc3RhdGUgaXMgYSB0cmFuc2l0aW9uYWwgc3RhdGUgaW4gbGliY3VybCBzbyBpdCByZXBvcnRzIG5vCiAgc29ja2V0cyB0aGVyZSwgYW5kIHRodXMgbGliY3VybCBuZXZlciB0ZWxscyB0aGUgYXBwIGFueXRoaW5nIG1vcmUgYWJvdXQgdGhhdAogIGVhc3kgaGFuZGxlL2Nvbm5lY3Rpb24uCgogIGxpYmN1cmwgX2RvZXNfIHNldCBhIDFtcyB0aW1lb3V0IGZvciB0aGUgaGFuZGxlIGF0IHRoZSBlbmQgb2YKICBtdWx0aV9ydW5zaW5nbGUoKSBpZiBpdCByZXR1cm5zIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSwgYnV0IHNpbmNlIHRoZSBsb29wCiAgaXMgaW5zdGFudCB0aGUgbmV3IGpvYiBpcyBub3QgcmVhZHkgdG8gcnVuIGF0IHRoYXQgcG9pbnQgKGFuZCB0aGVyZSdzIG5vCiAgY29kZSB0aGF0IG1ha2VzIGxpYmN1cmwgY2FsbCB0aGUgYXBwIHRvIHVwZGF0ZSB0aGUgdGltb3V0IGZvciB0aGlzIG5ldwogIHRpbWVvdXQpLiBJdCB3aWxsIHNpbXBseSByZWx5IG9uIHRoYXQgc29tZSBvdGhlciB0aW1lb3V0IHdpbGwgdHJpZ2dlciBsYXRlcgogIG9uIG9yIHRoYXQgc29tZXRoaW5nIGVsc2Ugd2lsbCB1cGRhdGUgdGhlIHRpbWVvdXQgY2FsbGJhY2suIFRoaXMgbWFrZXMgdGhlCiAgYnVnIGZhaXJseSBoYXJkIHRvIHJlcGVhdC4KCiAgVGhlIGZpeCBtYWRlIHRvIGFkcmVzcyB0aGlzIGlzc3VlOgoKICBXZSBpbnRyb2R1Y2UgYSBsb29wIGluIGxpYi9tdWx0aS5jIGFyb3VuZCBhbGwgY2FsbHMgdG8gbXVsdGlfcnVuc2luZ2xlKCkgYW5kCiAgc2ltcGx5IGNoZWNrIGZvciBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaW50ZXJuYWxseS4gVGhpcyBoYXMgdGhlIGFkZGVkCiAgYmVuZWZpdCB0aGF0IHRoaXMgZ29lcyBpbiBsaW5lIHdpdGggbXkgbG9uZy10ZXJtIHdpc2hlcyB0byBnZXQgcmlkIG9mIHRoZQogIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBhbGwgdG9nZXRoZXIgZnJvbSB0aGUgcHVibGljIEFQSS4KCiAgVGhlIGRvd25zaWRlIG9mIHRoaXMgZml4LCBpcyB0aGF0IHRoZSBjb3VudGVyIHdlIHJldHVybiBpbiAncnVubmluZ19oYW5kbGVzJwogIGluIHNldmVyYWwgb2Ygb3VyIHB1YmxpYyBmdW5jdGlvbnMgdGhlbiBnZXRzIGEgc2xpZ2h0bHkgbmV3IGFuZCBwb3NzaWJseQogIGNvbmZ1c2luZyBiZWhhdmlvciBkdXJpbmcgdGltZXM6CgogIElmIGFuIGFwcCBhZGRzIGEgaGFuZGxlIHRoYXQgZmFpbHMgdG8gY29ubmVjdCAodmVyeSBxdWlja2x5KSBpdCBtYXkganVzdAogIGFzIHdlbGwgbmV2ZXIgYXBwZWFyIGFzIGEgJ3J1bm5pbmdfaGFuZGxlJyB3aXRoIHRoaXMgZml4LiBQcmV2aW91c2x5IGl0CiAgd291bGQgZmlyc3QgYnVtcCB0aGUgY291bnRlciBvbmx5IHRvIGdldCBpdCBkZWNyZWFzZWQgYWdhaW4gYXQgbmV4dCBjYWxsLgogIEV2ZW4gSSBoYXZlIHVzZWQgdGhhdCBjaGFuZ2UgaW4gaGFuZGxlIGNvdW50ZXIgdG8gc2lnbmFsICJlbmQgb2YgYQogIHRyYW5zZmVyIi4gVGhlIG9ubHkgKmdvb2QqIHdheSB0byBmaW5kIHRoZSBlbmQgb2YgYSBpbmRpdmlkdWFsIHRyYW5zZmVyCiAgaXMgY2FsbGluZyBjdXJsX211bHRpX2luZm9fcmVhZCgpIHRvIHNlZSBpZiBpdCByZXR1cm5zIG9uZS4KCiAgT2YgY291cnNlLCBpZiB0aGUgYXBwIHByZXZpb3VzbHkgZGlkIHRoZSBsb29waW5nIGJlZm9yZSBpdCBjaGVja2VkIHRoZQogIGNvdW50ZXIsIGl0IHJlYWxseSBzaG91bGRuJ3QgYmUgYW55IG5ldyBlZmZlY3QuCgpZYW5nIFRzZSAoMjYgSmFuIDIwMTApCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMnIGFuZCBKb3NodWEgS3dhbidzIHdvcmsgZG9uZSBpbiB0aGUgbGFzdCBmb3VyIG1vbnRocwogIHJlbGF0aXZlIHRvIHRoZSBhc3luY2hyb25vdXMgRE5TIGxvb2t1cHMsIGFsb25nIHdpdGggd2l0aCBzb21lIGludGVncmF0aW9uCiAgYWRqdXN0bWVudHMgSSBoYXZlIGRvbmUgYXJlIGZpbmFsbHkgY29tbWl0dGVkIHRvIENWUy4KCiAgQ3VycmVudGx5IHRoZXNlIGVuaGFuY2VtZW50cyB3aWxsIGJlbmVmaXQgYnVpbGRzIGRvbmUgdXNpbmcgYy1hcmVzIG9uIGFueQogIHBsYXRmb3JtIGFzIHdlbGwgYXMgV2luZG93cyBidWlsZHMgdXNpbmcgdGhlIGRlZmF1bHQgdGhyZWFkZWQgcmVzb2x2ZXIuCgogIFRoaXMgcmVsZWFzZSBkb2VzIG5vdCBtYWtlIGdlbmVyYWxseSBhdmFpbGFibGUgUE9TSVggdGhyZWFkZWQgRE5TIGxvb2t1cHMKICB5ZXQuIFRoZXJlIGlzIG5vIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSB5ZXQuIEl0IGlzIHBvc3NpYmxlCiAgdG8gZXhwZXJpbWFudGFsbHkgdHJ5IHRoaXMgZmVhdHVyZSBydW5uaW5nIGNvbmZpZ3VyZSB3aXRoIGNvbXBpbGVyIGZsYWdzIHRoYXQKICBtYWtlIHNpbXVsdGFuZW91cyBkZWZpbml0aW9uIG9mIHByZXByb2Nlc3NvciBzeW1ib2xzIFVTRV9USFJFQURTX1BPU0lYIGFuZAogIEhBVkVfUFRIUkVBRF9ILCBhcyB3ZWxsIGFzIHdoYXRldmVyIHJlZW50cmFuY3kgY29tcGlsZXIgZmxhZ3MgYW5kIGxpbmtlciBvbmVzCiAgYXJlIHJlcXVpcmVkIHRvIGxpbmsgYW5kIHByb3Blcmx5IHVzZSBwdGhyZWFkXyogZnVuY3Rpb25zIG9uIGVhY2ggcGxhdGZvcm0uCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEphbiAyMDEwKQotIE1pa2UgQ3Jvd2UgbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFkgd2hlbiBpdCBpcyB0aGUKICBwcm94eSB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCB3aGVuIHVzaW5nIGMtYXJlcy4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvdXIKICB3aGVuIG5vdCB1c2luZyBjLWFyZXMuCgpCavZybiBTdGVuYmVyZyAoMjMgSmFuIDIwMTApCi0gQWRkZWQgYSBuZXcgZmxhZzogLUovLS1yZW1vdGUtaGVhZGVyLW5hbWUuIFRoaXMgb3B0aW9uIHRlbGxzIHRoZQogIC1PLy0tcmVtb3RlLW5hbWUgb3B0aW9uIHRvIHVzZSB0aGUgc2VydmVyLXNwZWNpZmllZCBDb250ZW50LURpc3Bvc2l0aW9uCiAgZmlsZW5hbWUgaW5zdGVhZCBvZiBleHRyYWN0aW5nIGEgZmlsZW5hbWUgZnJvbSB0aGUgVVJMLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBKYW4gMjAxMCkKLSBDaHJpcyBDb25yb3kgYnJvdWdodCBzdXBwb3J0IGZvciBSVFNQIHRyYW5zZmVycywgYW5kIHdpdGggaXQgY29tZXMgOCghKSBuZXcKICBsaWJjdXJsIG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHdoYXQgdG8gZ2V0IGFuZCBob3cgdG8gcmVjZWl2ZSBwb3Nzc2libHkKICBpbnRlcmxlYXZlZCBSVFAgZGF0YS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgSmFuIDIwMTApCi0gQXMgd2FzIHBvaW50ZWQgb3V0IG9uIHRoZSBodHRwLXN0YXRlIG1haWxpbmcgbGlzdCwgdGhlIG9yZGVyIG9mIGNvb2tpZXMgaW4gYQogIEhUVFAgQ29va2llOiBoZWFkZXIgX25lZWRzXyB0byBiZSBzb3J0ZWQgb24gdGhlIHBhdGggbGVuZ3RoIGluIHRoZSBjYXNlcwogIHdoZXJlIHR3byBjb29raWVzIHVzaW5nIHRoZSBzYW1lIG5hbWUgYXJlIHNldCBtb3JlIHRoYW4gb25jZSB1c2luZwogIChvdmVybGFwcGluZykgcGF0aHMuIFJlYWxpemluZyB0aGlzLCBpZGVudGljYWxseSBuYW1lZCBjb29raWVzIG11c3QgYmUKICBzb3J0ZWQgY29ycmVjdGx5LiBCdXQgZGV0ZWN0aW5nIG9ubHkgaWRlbnRpY2FsbHkgbmFtZWQgY29va2llcyBhbmQgdGFrZSBjYXJlCiAgb2YgdGhlbSBpbmRpdmlkdWFsbHkgaXMgaGFyZGVyIHRoYW4ganVzdCB0byBibGluZGx5IGFuZCB1bmNvbmRpdGlvbmFsbHkgc29ydAogIGFsbCBjb29raWVzIGJhc2VkIG9uIHRoZWlyIHBhdGggbGVuZ3Rocy4gQWxsIG1ham9yIGJyb3dzZXJzIGFsc28gYWxyZWFkeSBkbwogIHRoaXMsIHNvIHRoaXMgbWFrZXMgb3VyIGJlaGF2aW9yIG9uZSBzdGVwIGNsb3NlciB0byB0aGVtIGluIHRoZSBjb29raWUgYXJlYS4KCiAgVGVzdCBjYXNlIDggd2FzIHRoZSBvbmx5IG9uZSB0aGF0IGJyb2tlIGR1ZSB0byB0aGlzIGNoYW5nZSBhbmQgSSB1cGRhdGVkIGl0CiAgYWNjb3JkaW5nbHkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEphbiAyMDEwKQotIERhdmlkIE1jQ3JlZWR5IGJyb3VnaHQgYSBmaXggYW5kIGEgbmV3IHRlc3QgY2FzZSAoMTI5KSB0byBtYWtlIGxpYmN1cmwgd29yawogIGFnYWluIHdoZW4gZG93bmxvYWRpbmcgZmlsZXMgb3ZlciBGVFAgdXNpbmcgQVNDSUkgYW5kIGl0IHR1cm5zIG91dCB0aGF0IHRoZQogIGZpbmFsIHNpemUgb2YgdGhlIGZpbGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIHNpemUgdGhlIHNlcnZlcgogIHJlcG9ydGVkLiBUaGlzIGlzIHZlcnkgY29tbW9uIHNpbmNlIHNlcnZlcnMgZG9uJ3QgdGFrZSB0aGUgbmV3bGluZQogIGNvbnZlcnNpb25zIGludG8gYWNjb3VudC4KCkthbWlsIER1ZGthICgxNCBKYW4gMjAxMCkKLSBTdXBwcmVzc2VkIHNpZGUgZWZmZWN0IG9mIE9wZW5TU0wgY29uZmlndXJlIGNoZWNrcywgd2hpY2ggcHJldmVudGVkIE5TUyBmcm9tCiAgYmVpbmcgcHJvcGVybHkgZGV0ZWN0ZWQgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLiBJdCBoYWQgYmVlbiBjYXVzZWQgYnkKICBzdHJhbmdlIGJlaGF2aW9yIG9mIHBrZy1jb25maWcgd2hlbiBoYW5kbGluZyBQS0dfQ09ORklHX0xJQkRJUi4gcGtnLWNvbmZpZwogIGRpc3Rpbmd1aXNoZXMgYW1vbmcgZW1wdHkgYW5kIG5vbi1leGlzdGVudCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGF0IGNhc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEphbiAyMDEwKQotIEdpbCBXZWJlciByZXBvcnRlZCBhIHBlY3VsaWFyIGZsYXcgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZG9pbmcgU0ZUUAogIHRyYW5zZmVyczogY3VybF9tdWx0aV9mZHNldCgpIHdvdWxkIHJldHVybiAtMSBhbmQgbm90IHNldCBhbmQgZmlsZQogIGRlc2NyaXB0b3JzIHNldmVyYWwgdGltZXMgZHVyaW5nIGEgdHJhbnNmZXIgb2YgYSBzaW5nbGUgZmlsZS4gSXQgdHVybmVkIG91dAogIHRvIGJlIGR1ZSB0byB0d28gZGlmZmVyZW50IGZsYXdzIG5vdyBmaXhlZC4gR2lsJ3MgZXhjZWxsZW50IHJlY2lwZSBoZWxwZWQgbWUKICBuYWlsIHRoaXMuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAyMDEwKQotIE1hZGUgc3VyZSB0aGF0IHRoZSBwcm9ncmVzcyBjYWxsYmFjayBpcyByZXBlYXRlZGx5IGNhbGxlZCBhdCBhIHJlZ3VsYXIKICBpbnRlcnZhbCBldmVuIGR1cmluZyB2ZXJ5IHNsb3cgY29ubmVjdHMuCgotIFRoZSB0ZXN0cy9ydW50ZXN0cy5wbCBzY3JpcHQgbm93IGNoZWNrcyB0byBzZWUgaWYgdGhlIHRlc3QgY2FzZSB0aGF0IHJ1bnMgaXMKICBwcmVzZW50IGluIHRoZSB0ZXN0cy9kYXRhL01ha2VmaWxlLmFtIGFuZCBvdXRwdXRzIGEgbm90aWNlIG1lc3NhZ2Ugb24gdGhlCiAgc2NyZWVuIGlmIG5vdC4gRWFjaCB0ZXN0IGZpbGUgaGFzIHRvIGJlIGluY2x1ZGVkIGluIHRoYXQgTWFrZWZpbGUuYW0gdG8gZ2V0CiAgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgZm9yZ2V0dGluZyB0byBhZGQgZmlsZXMgdGhlcmUgaXMgYSBjb21tb24KICBtaXN0YWtlLiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gbWFrZSBpdCBoYXJkZXIgdG8gZm9yZ2V0LgoKRGFuaWVsIFN0ZW5iZXJnICg5IEphbiAyMDEwKQotIEpvaGFuIHZhbiBTZWxzdCBmb3VuZCBhbmQgZml4ZWQgYSBPcGVuU1NMIHNlc3Npb24gcmVmIGNvdW50IGxlYWs6CgogIG9zc2xfY29ubmVjdF9zdGVwMygpIGluY3JlbWVudHMgYW4gU1NMIHNlc3Npb24gaGFuZGxlIHJlZmVyZW5jZSBjb3VudGVyIG9uCiAgZWFjaCBjYWxsLiBXaGVuIHNlc3Npb25zIGFyZSByZS11c2VkIHRoaXMgcmVmZXJlbmNlIGNvdW50ZXIgbWF5IGJlCiAgaW5jcmVtZW50ZWQgbWFueSB0aW1lcywgYnV0IGl0IHdpbGwgYmUgZGVjcmVtZW50ZWQgb25seSBvbmNlIHdoZW4gZG9uZSAoYnkKICBDdXJsX29zc2xfc2Vzc2lvbl9mcmVlKCkpOyBhbmQgdGhlIGludGVybmFsIE9wZW5TU0wgZGF0YSB3aWxsIG5vdCBiZSBmcmVlZAogIGlmIHRoaXMgcmVmZXJlbmNlIGNvdW50IHJlbWFpbnMgcG9zaXRpdmUuIFdoZW4gYSBzZXNzaW9uIGlzIHJlLXVzZWQgdGhlCiAgcmVmZXJlbmNlIGNvdW50ZXIgc2hvdWxkIGJlIGNvcnJlY3RlZCBieSBleHBsaWNpdGx5IGNhbGxpbmcKICBTU0xfU0VTU0lPTl9mcmVlKCkgYWZ0ZXIgZWFjaCBjb25zZWN1dGl2ZSBTU0xfZ2V0MV9zZXNzaW9uKCkgdG8gYXZvaWQKICBpbnRyb2R1Y2luZyBhIG1lbW9yeSBsZWFrLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkyNjI4NCkKCkRhbmllbCBTdGVuYmVyZyAoNyBKYW4gMjAxMCkKLSBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGlzIGNhbGxlZCByZXBlYXRlZGx5IGV2ZW4gZHVyaW5nIHZlcnkgc2xvdwogIG5hbWUgcmVzb2x2ZXMgd2hlbiBjLWFyZXMgaXMgdXNlZCBmb3IgcmVzb2x2aW5nLgoKQ2xhZXMgSmFrb2Jzc29uICg2IEphbiAyMDEwKQotIEp1bGllbiBDaGFmZnJhaXggZml4ZWQgc28gdGhhdCB0aGUgZnJhZ21lbnQgcGFydCBpbiBhbiBVUkwgaXMgbm90IHNlbnQKICB0byB0aGUgc2VydmVyIGFueW1vcmUuCgpLYW1pbCBEdWRrYSAoMyBKYW4gMjAxMCkKLSBKdWxpZW4gQ2hhZmZyYWl4IGVsaW1pbmF0ZWQgYSBkdXBsaWNhdGVkIGluaXRpYWxpemF0aW9uIGluIHNpbmdsZXNvY2tldCgpLgoKRGFuaWVsIFN0ZW5iZXJnICgyIEphbiAyMDEwKQotIE1ha2UgY3VybCBzdXBwb3J0IC0tc3NsIGFuZCAtLXNzbC1yZXFkIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIEZUUC1zcGVjaWZpYwogIHZlcnNpb25zIC0tZnRwLXNzbCBhbmQgLS1mdHAtc3NsLXJlcWQgYXMgdGhlc2Ugb3B0aW9ucyBhcmUgbm93IHVzZWQgdG8KICBjb250cm9sIFNTTC9UTFMgZm9yIElNQVAsIFBPUDMgYW5kIFNNVFAgYXMgd2VsbCBpbiBhZGRpdGlvbiB0byBGVFAuIFRoZSBvbGQKICBvcHRpb24gbmFtZXMgYXJlIHN0aWxsIHdvcmtpbmcgYnV0IHRoZSBuZXcgb25lcyBhcmUgdGhlIG9uZXMgbGlzdGVkIGFuZAogIGRvY3VtZW50ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSmFuIDIwMTApCi0gSW5nbWFyIFJ1bmdlIGVuaGFuY2VkIGxpYmN1cmwncyBGVFAgZW5naW5lIHRvIHN1cHBvcnQgdGhlIFBSRVQgY29tbWFuZC4gVGhpcwogIGNvbW1hbmQgaXMgYSBzcGVjaWFsICJoYWNrIiB1c2VkIGJ5IHRoZSBkcmZ0cGQgc2VydmVyLCBidXQgZXZlbiB0aG91Z2ggaXQgaXMKICBhIGN1c3RvbSBleHRlbnNpb24gSSd2ZSBkZWVtZWQgaXQgZmluZSB0byBhZGQgdG8gbGliY3VybCBzaW5jZSB0aGlzIHNlcnZlcgogIHNlZW1zIHRvIHN1cnZpdmUgYW5kIHBlb3BsZSBrZWVwIHVzaW5nIGl0IGFuZCB3YW50IGxpYmN1cmwgdG8gc3VwcG9ydAogIGl0LiBUaGUgbmV3IGxpYmN1cmwgb3B0aW9uIGlzIG5hbWVkIENVUkxPUFRfRlRQX1VTRV9QUkVULCBhbmQgaXQgaXMgYWxzbwogIHVzYWJsZSBmcm9tIHRoZSBjdXJsIHRvb2wgd2l0aCAtLWZ0cC1wcmV0LiBVc2luZyB0aGlzIG9wdGlvbiBvbiBhIHNlcnZlcgogIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoaXMgY29tbWFuZCB3aWxsIG1ha2UgbGliY3VybCBmYWlsLgoKICBJIGFkZGVkIHRlc3QgY2FzZXMgMTEwNyBhbmQgMTEwOCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgogIFRoZSBQUkVUIGNvbW1hbmQgaXMgZG9jdW1lbnRlZCBhdAogIGh0dHA6Ly93d3cuZHJmdHBkLm9yZy9pbmRleC5waHAvRGlzdHJpYnV0ZWRfUEFTVgoKWWFuZyBUc2UgKDMwIERlYyAyMDA5KQotIFN0ZXZlbiBNLiBTY2h3ZWRhIGltcHJvdmVkIFZNUyBidWlsZCBzeXN0ZW0sIGFuZCBDcmFpZyBBLiBCZXJyeSBoZWxwZWQKICB3aXRoIHRoZSBwYXRjaCBhbmQgdGVzdGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMjYgRGVjIDIwMDkpCi0gUmVuYXRvIEJvdGVsaG8gYW5kIFBldGVyIFBlbnRjaGV2IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBsaWJjdXJsCiAgaGVhZGVycyB3b3JrIGNvcnJlY3RseSBldmVuIG9uIEZyZWVCU0Qgc3lzdGVtcyBiZWZvcmUgdjguCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTE2OTE1KQoKRGFuaWVsIFN0ZW5iZXJnICgxNyBEZWMgMjAwOSkKLSBEYXZpZCBCeXJvbiBmaXhlZCBDdXJsX29zc2xfY2xlYW51cCB0byBhY3R1YWxseSBjYWxsIEVOR0lORV9jbGVhbnVwIHdoZW4KICBhdmFpbGFibGUuCgotIEZvbGxvdy11cCBmaXggZm9yIHRoZSBwcm94eSBmaXggSSBkaWQgZm9yIEpvbiBOZWxzb24ncyBidWcuIEl0IHR1cm5lZCBvdXQgSQogIHdhcyBhIGJpdCB0b28gcXVpY2sgYW5kIGJyb2tlIHRlc3QgY2FzZSAxMTAxIHdpdGggdGhhdCBjaGFuZ2UuIFRoZSBvcmRlciBvZgogIHNvbWUgb2YgdGhlIHNldHVwcyBpcyBzZW5zaXRpdmUuIEkgbm93IGNoYW5nZWQgaXQgc2xpZ2h0bHkgYWdhaW4gdG8gbWFrZQogIHN1cmUgd2UgZG8gdGhlbSBpbiB0aGlzIG9yZGVyOgoKICAxIC0gcGFyc2UgVVJMIGFuZCBmaWd1cmUgb3V0IHdoYXQgcHJvdG9jb2wgaXMgdXNlZCBpbiB0aGUgVVJMCiAgMiAtIHByZXBlbmQgcHJvdG9jb2w6Ly8gdG8gVVJMIGlmIG1pc3NpbmcKICAzIC0gcGFyc2UgbmFtZStwYXNzd29yZCBvZmYgVVJMLCB3aGljaCBuZWVkcyB0byBrbm93IHdoYXQgcHJvdG9jb2wgaXMgdXNlZAogICAgICAoc2luY2Ugb25seSBzb21lIGFsbG93cyBmb3IgbmFtZStwYXNzd29yZCBpbiB0aGUgVVJMKQogIDQgLSBmaWd1cmUgb3V0IGlmIGEgcHJveHkgc2hvdWxkIGJlIHVzZWQgc2V0IGJ5IGFuIG9wdGlvbgogIDUgLSBpZiBubyBwcm94eSBvcHRpb24sIGNoZWNrIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcwogIDYgLSBydW4gdGhlIHByb3RvY29sLXNwZWNpZmljIHNldHVwIGZ1bmN0aW9uLCB3aGljaCBuZWVkcyB0byBoYXZlIHRoZSBwcm94eQogICAgICBhbHJlYWR5IHNldAoKRGFuaWVsIFN0ZW5iZXJnICgxNSBEZWMgMjAwOSkKLSBKb24gTmVsc29uIGZvdW5kIGEgcmVncmVzc2lvbiB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgYSBmbGF3IGluIGhvdyBsaWJjdXJsCiAgZGV0ZWN0cyBhbmQgdXNlcyBwcm94aWVzIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIElmIHRoZSBwcm94eQogIHdhcyBnaXZlbiBhcyBhbiBleHBsaWNpdCBvcHRpb24gaXQgd29ya2VkLCBidXQgZHVlIHRvIHRoZSBzZXR1cCBvcmRlcgogIG1pc3Rha2UgcHJveGllcyB3b3VsZCBub3QgYmUgdXNlZCBmaW5lIGZvciBhIGZldyBwcm90b2NvbHMgd2hlbiBwaWNrZWQgdXAKICBmcm9tICdbcHJvdG9jb2xdX3Byb3h5Jy4gT2J2aW91c2x5IHRoaXMgYnJva2UgYWZ0ZXIgNy4xOS40LiBJIG5vdyBhbHNvIGFkZGVkCiAgdGVzdCBjYXNlIDExMDYgdGhhdCB2ZXJpZmllcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yOTEzODg2KQoKRGFuaWVsIFN0ZW5iZXJnICgxMiBEZWMgMjAwOSkKLSBJTUFQLCBQT1AzIGFuZCBTTVRQIHN1cHBvcnQgYW5kIHRoZWlyIFRMUyB2ZXJzaW9ucyAoaW5jbHVkaW5nIElNQVBTLCBQT1AzUwogIGFuZCBTTVRQUykgYXJlIG5vdyBzdXBwb3J0ZWQuIFRoZSBjdXJyZW50IHN0YXRlIG1heSBub3QgeWV0IGJlIHNvbGlkLCBidXQKICB0aGUgZm91bmRhdGlvbiBpcyBpbiBwbGFjZSBhbmQgdGhlIHRlc3Qgc3VpdGUgaGFzIHNvbWUgaW5pdGlhbCBzdXBwb3J0IGZvcgogIHRoZXNlIHByb3RvY29scy4gV29yayB3aWxsIG5vdyBwZXJzdWUgdG8gbWFrZSB0aGVtIG5pY2UgbGliY3VybCBjaXRpemVucwogIHVudGlsIHJlbGVhc2UuCgogIFRoZSB3b3JrIHdpdGggc3VwcG9ydGluZyB0aGVzZSBuZXcgcHJvdG9jb2xzIHdhcyBzcG9uc29yZWQgYnkKICBuZXR3b3JraW5nNGFsbC5jb20gLSB0aGFua3MhCgpEYW5pZWwgU3RlbmJlcmcgKDEwIERlYyAyMDA5KQotIFNpZWdmcmllZCBHeXVyaWNza28gZm91bmQgb3V0IHRoYXQgdGhlIGN1cmwgbWFudWFsIHNhaWQgLS1yZXRyeSB3b3VsZCByZXRyeQogIG9uIEZUUCBlcnJvcnMgaW4gdGhlIHRyYW5zaWVudCA1eHggcmFuZ2UuIFRyYW5zaWVudCBGVFAgZXJyb3JzIGFyZSBpbiB0aGUKICA0eHggcmFuZ2UuIFRoZSBjb2RlIGl0c2VsZiBvbmx5IHRyaWVkIG9uIDV4eCBlcnJvcnMgdGhhdCBvY2N1cmVkIF9hdCBsb2dpbl8uCiAgTm93IHRoZSByZXRyeSBjb2RlIHJldHJpZXMgb24gYWxsIEZUUCB0cmFuc2ZlciBmYWlsdXJlcyB0aGF0IGVuZGVkIHdpdGggYQogIDR4eCByZXNwb25zZS4KCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI5MTEyNzkpCgotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpZ3VyZWQgb3V0IGEgY2FzZSB3aGljaCB3b3VsZCBsZWFkIHRvIGxpYmN1cmwKICBhY2Nlc3NpbmcgYWxyZWR5IGZyZWVkIG1lbW9yeSBhbmQgdGh1cyBjcmFzaCB3aGVuIHVzaW5nIEhUVFBTICh3aXRoCiAgT3BlblNTTCksIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIENVUkxPUFRfREVCVUdGVU5DVElPTiBhbmQgYSBjZXJ0YWluIG9yZGVyCiAgb2YgY2xlYW5pbmcgdGhpbmdzIHVwLiBJIGZpeGVkIGl0LgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjkwNTIyMCkKCkRhbmllbCBTdGVuYmVyZyAoNyBEZWMgMjAwOSkKLSBNYXJ0aW4gU3RvcnNqbyBtYWRlIGxpYmN1cmwgdXNlIHRoZSBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIgZm9yIHBvc3RzCiAgd2l0aCB1bmtub3duIHNpemUuIFByZXZpb3VzbHkgaXQgd2FzIG9ubHkgdXNlZCBmb3IgcG9zdHMgd2l0aCBhIGtub3duIHNpemUKICBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIERlYyAyMDA5KQotIElmIHRoZSBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIgaGFzIGJlZW4gc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0aHJvdWdoCiAgY3VybF9lYXN5X3NldG9wdCB3aXRoIENVUkxPUFRfSFRUUEhFQURFUiwgdGhlIGxpYnJhcnkgc2hvdWxkIHNldAogIGRhdGEtPnN0YXRlLmV4cGVjdDEwMGhlYWRlciBhY2NvcmRpbmdseSAtIHRoZSBjdXJyZW50IGNvZGUgKGluIDcuMTkuNyBhdAogIGxlYXN0KSBkb2Vzbid0IGhhbmRsZSB0aGlzIHByb3Blcmx5LiBNYXJ0aW4gU3RvcnNqbyBwcm92aWRlZCB0aGUgZml4IQoKWWFuZyBUc2UgKDI4IE5vdiAyMDA5KQotIEFkZGVkIERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMgdG8gc2V2ZXJhbCB0ZXN0IGhhcm5lc3MgY2VydGlmaWNhdGUgZmlsZXMgaW4KICBQRU0gZm9ybWF0LiBSZXF1aXJlZCBieSBzZXZlcmFsIHN0dW5uZWwgdmVyc2lvbnMgdXNlZCBieSBvdXIgdGVzdCBoYXJuZXNzLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBOb3YgMjAwOSkKLSBNYXJrdXMgS29ldHRlciBwcm92aWRlZCBhIHBvbGlzaGVkIGFuZCB1cGRhdGVkIHZlcnNpb24gb2YgQ2hhZCBNb25yb2UncyBURlRQCiAgcmV3b3JrIHBhdGNoIHRoYXQgbm93IGludGVncmF0ZXMgVEZUUCBwcm9wZXJseSBpbnRvIGxpYmN1cmwgc28gdGhhdCBpdCBjYW4KICBiZSB1c2VkIG5vbi1ibG9ja2luZyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIG1vcmUuIEJMS1NJWkUgYWxzbyB3b3Jrcy4KCiAgVGhlIC0tdGZ0cC1ibGtzaXplIG9wdGlvbiB3YXMgYWRkZWQgdG8gYWxsb3cgc2V0dGluZyB0aGUgVEZUUCBCTEtTSVpFIGZyb20KICB0aGUgY29tbWFuZCBsaW5lLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBOb3YgMjAwOSkKLSBFeHRlbmRlZCBhbmQgZml4ZWQgdGhlIGNoYW5nZSBJIGRpZCBvbiBEZWMgMTEgZm9yIHRoZSB0aGUgcHJvZ3Jlc3MKICBtZXRlci9jYWxsYmFjayBkdXJpbmcgRlRQIGNvbW1hbmQvcmVzcG9uc2Ugc2VxdWVuY2VzLiBJdCB0dXJuZWQgb3V0IGl0IHdhcwogIHJlYWxseSBsYW1lIGJlZm9yZSBhbmQgbm93IHRoZSBwcm9ncmVzcyBtZXRlciBTSE9VTEQgZ2V0IGNhbGxlZCBhdCBsZWFzdAogIG9uY2UgcGVyIHNlY29uZC4KCkRhbmllbCBTdGVuYmVyZyAoMjMgTm92IDIwMDkpCi0gQmpvcm4gQXVndXN0c3NvbiByZXBvcnRlZCBhIGJ1ZyB3aGljaCBtYWRlIGN1cmwgbm90IHJlcG9ydCBhbnkgcHJvYmxlbXMgZXZlbgogIHRob3VnaCBpdCBmYWlsZWQgdG8gd3JpdGUgYSB2ZXJ5IHNtYWxsIGRvd25sb2FkIHRvIGRpc2sgKGRvbmUgaW4gYSBzaW5nbGUKICBmd3JpdGUgY2FsbCkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBmd3JpdGUoKSByZXR1cm5lZCBzdWNjZXNzLCBidXQKICB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IGVycm9yLWNoZWNraW5nIGZvciB0aGUgZmNsb3NlKCkgY2FsbCB3aGljaCB0cmlja2VkCiAgY3VybCB0byBiZWxpZXZlIHRoaW5ncyB3ZXJlIGZpbmUuCgpZYW5nIFRzZSAoMjMgTm92IDIwMDkpCi0gRGF2aWQgQnlyb24gbW9kaWZpZWQgTWFrZWZpbGUuZGlzdCB2YzggYW5kIHZjOSB0YXJnZXRzIGluIG9yZGVyIHRvIGFsbG93CiAgZmluZXIgZ3JhbnVsYXJpdHkgY29udHJvbCB3aGVuIGdlbmVyYXRpbmcgc3JjIGFuZCBsaWIgbWFrZWZpbGVzLgoKWWFuZyBUc2UgKDIyIE5vdiAyMDA5KQotIEkgbW9kaWZpZWQgY29uZmlndXJlIHRvIGZvcmNlIHJlbW92YWwgb2YgdGhlIGN1cmxidWlsZC5oIGZpbGUgaW5jbHVkZWQgaW4KICBkaXN0cmlidXRpb24gdGFyYmFsbHMgZm9yIHVzZSBieSBub24tY29uZmlndXJlIHN5c3RlbXMuIEFzIGludGVuZGVkLCB0aGlzCiAgd291bGQgZ2V0IG92ZXJ3cml0ZW4gd2hlbiBkb2luZyBpbi10cmVlIGJ1aWxkcy4gQnV0IFZQQVRIIGJ1aWxkcyB3b3VsZCBlbmQKICBoYXZpbmcgdHdvIGN1cmxidWlsZC5oIGZpbGVzLCBvbmUgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBhbm90aGVyIGluIHRoZQogIGJ1aWxkIHRyZWUuIFdpdGggdGhlIG1vZGlmaWNhdGlvbiBJIGludHJvZHVjZWQgNSBOb3YgMjAwOSB0aGlzIGNvdWxkIGJlY29tZQogIGFuIGlzc3VlIHdoZW4gcnVubmluZyBsaWJjdXJsJ3MgdGVzdCBzdWl0ZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgTm92IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgaWRlbnRpZmllZCBhIHdyaXRlIGFmdGVyIGNsb3NlLCBhcyB0aGUgc29ja2V0cyB3ZXJlCiAgY2xvc2VkIGJ5IGxpYmN1cmwgYmVmb3JlIHRoZSBTU0wgbGliIHdlcmUgc2h1dGRvd24gYW5kIHRoZXkgbWF5IHdyaXRlIHRvIGl0cwogIHNvY2tldC4gRGV0ZWN0ZWQgdG8gYXQgbGVhc3QgaGFwcGVuIHdpdGggT3BlblNTTCBidWlsZHMuCgotIEphZCBDaGFtY2hhbSBwb2ludGVkIG91dCBhIGJ1ZyB3aXRoIGNvbm5lY3Rpb24gcmUtdXNlLiBJZiBhIGNvbm5lY3Rpb24gaGFkCiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgZW5hYmxlZCBvdmVyIGEgcHJveHksIGEgc3Vic2VxdWVudCByZXF1ZXN0IHVzaW5nIHRoZQogIHNhbWUgcHJveHkgd2l0aCB0aGUgdHVubmVsIG9wdGlvbiBkaXNhYmxlZCB3b3VsZCBzdGlsbCB3cm9uZ2x5IHJlLXVzZSB0aGF0CiAgcHJldmlvdXMgY29ubmVjdGlvbiBhbmQgdGhlIG91dGNvbWUgd291bGQgb25seSBiZSBiYWRuZXNzLgoKWWFuZyBUc2UgKDE4IE5vdiAyMDA5KQotIEkgbW9kaWZpZWQgdGhlIG1lbW9yeSB0cmFja2luZyBzeXN0ZW0gdG8gbWFrZSBpdCBpbnRvbGVyYW50IHdpdGggemVybyBzaXplZAogIG1hbGxvYygpLCBjYWxsb2MoKSBhbmQgcmVhbGxvYygpIGZ1bmN0aW9uIGNhbGxzLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwcm92aWRlZCBhbm90aGVyIGZpeCBmb3IgdGhlIEROUyBjYWNoZSB0aGF0IGNvdWxkCiAgZW5kIHVwIHdpdGggZW50cmllcyB0aGF0IHdvdWxkbid0IHRpbWUtb3V0OgoKICAxLiBTZXQgdXAgYSBmaXJzdCB3ZWIgc2VydmVyIHRoYXQgcmVkaXJlY3RzICgzMDcpIHRvIGEgaHR0cDovL3NlcnZlcjpwb3J0CiAgICAgdGhhdCdzIGRvd24KICAyLiBIYXZlIGN1cmwgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2ViIHNlcnZlciB1c2luZyBjdXJsIG11bHRpCgogIEFmdGVyIHRoZSBjdXJsX2Vhc3lfY2xlYW51cCBjYWxsLCB0aGVyZSB3aWxsIGJlIGN1cmwgZG5zIGVudHJpZXMgaGFuZ2luZwogIGFyb3VuZCB3aXRoIGluX3VzZSAhPSAwLgoKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg5MTU5MSkKCi0gTWFyYyBLbGVpbmUtQnVkZGUgZml4ZWQ6IGN1cmwgc2F2ZWQgdGhlIExERkxBR1Mgc2V0IGR1cmluZyBjb25maWd1cmUgaW50bwogIGl0cyBwa2ctY29uZmlnIGZpbGUuICBTbyAtV2wgc3R1ZmYgZW5kZWQgdXAgaW4gdGhlIC5wYyBmaWxlLCB3aGljaCBpcyByZWFsbHkKICBiYWQsIGFuZCBicmVha3MgaWYgdGhlcmUgYXJlIG11bHRpcGxlIC1XbCBpbiBvdXIgTERGTEFHUyAod2hpY2ggYXJlIGluCiAgUFRYZGlzdCkuIGJ1ZyAjMjg5MzU5MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg5MzU5MikKCkthbWlsIER1ZGthICgxNSBOb3YgMjAwOSkKLSBEYXZpZCBCeXJvbiBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgcGtnLWNvbmZpZyB0byBmaW5kIE9wZW5TU0wKICAoYW5kIGluIHBhcnRpY3VsYXIgdGhlIGxpc3Qgb2YgcmVxdWlyZWQgbGlicmFyaWVzKSBldmVuIGlmIGEgcGF0aCBpcyBnaXZlbgogIGFzIGFyZ3VtZW50IHRvIC0td2l0aC1zc2wKCllhbmcgVHNlICgxNSBOb3YgMjAwOSkKLSBJIHJlbW92ZWQgZW5hYmxlLXRocmVhZCAvIGRpc2FibGUtdGhyZWFkIGNvbmZpZ3VyZSBvcHRpb24uIFRoZXNlIHdlcmUgb25seQogIHBsYWNlYm8gb3B0aW9ucy4gVGhlIGxpYnJhcnkgaXMgYWx3YXlzIGJ1aWx0IGFzIHRocmVhZCBzYWZlIGFzIHBvc3NpYmxlIG9uCiAgZXZlcnkgc3lzdGVtLgoKQ2xhZXMgSmFrb2Jzc29uICgxNCBOb3YgMjAwOSkKLSBjdXJsLWNvbmZpZyBub3cgYWNjZXB0cyAnLS1jb25maWd1cmUnIHRvIHNlZSB3aGF0IGFyZ3VtZW50cyB3YXMKICBwYXNzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBidWlsZGluZyBjdXJsLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBOb3YgMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gcmVzdG9yZWQgdGhlIGNvbmZpZ3VyZSBmdW5jdGlvbmFsaXR5IHRvIGRldGVjdCBOU1Mgd2hlbgogIC0td2l0aC1uc3MgaXMgc2V0IGJ1dCBub3QgInllcyIuCgogIEkgdGhpbmsgd2UgY2FuIHN0aWxsIGltcHJvdmUgdGhhdCB0byBjaGVjayBmb3IgcGtnLWNvbmZpZyBpbiB0aGF0IHBhdGggZXRjLAogIGJ1dCBhdCBsZWFzdCB0aGlzIHBhdGNoIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2UgaGFkIGJlZm9yZS4KCi0gQ2FtaWxsZSBNb25jZWxpZXIgYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGZpbGUgdHlwZSBTU0xfRklMRVRZUEVfRU5HSU5FIGZvcgogIHRoZSBjbGllbnQgY2VydGlmaWNhdGUuIEl0IGFsc28gZGlzYWJsZSB0aGUga2V5IG5hbWUgdGVzdCBhcyBzb21lIGVuZ2luZXMKICBjYW4gc2VsZWN0IGEgcHJpdmF0ZSBrZXkvY2VydCBhdXRvbWF0aWNhbGx5IChXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGtleQogIGFuZC9vciBjZXJ0aWZpY2F0ZSBvbiB0aGUgaGFyZHdhcmUgZGV2aWNlIHVzZWQgYnkgdGhlIGVuZ2luZSkKCllhbmcgVHNlICgxNCBOb3YgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwcm92aWRlZCB0aGUgZml4IHRoYXQgZW5zdXJlcyB0aGF0IGFuIFNTTCBjb25uZWN0aW9uCiAgd29uJ3QgYmUgcmV1c2VkIHVubGVzcyBwcm90ZWN0aW9uIGxldmVsIGZvciBwZWVyIGFuZCBob3N0IHZlcmlmaWNhdGlvbiBtYXRjaC4KCiAgSSByZWZhY3RvcmVkIGhvdyBwcmVwcm9jZXNzb3Igc3ltYm9sIF9USFJFQURfU0FGRSBkZWZpbml0aW9uIGlzIGRvbmUuCgpLYW1pbCBEdWRrYSAoMTIgTm92IDIwMDkpCi0gS2V2aW4gQmF1Z2htYW4gcHJvdmlkZWQgYSBmaXggcHJldmVudGluZyBsaWJjdXJsLU5TUyBmcm9tIGNyYXNoIG9uIGRvdWJseQogIGNsb3NlZCBOU1BSIGRlc2NyaXB0b3IuIFRoZSBpc3N1ZSB3YXMgaGFyZCB0byBmaW5kLCByZXBvcnRlZCBzZXZlcmFsIHRpbWVzCiAgYmVmb3JlIGFuZCBhbHdheXMgY2xvc2VkIHVucmVzb2x2ZWQuIE1vcmUgaW5mbyBhdCB0aGUgUkggYnVnOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81MzQxNzYKCi0gbGliY3VybC1OU1Mgbm93IHRyaWVzIHRvIHJlY29ubmVjdCB3aXRoIFRMUyBkaXNhYmxlZCBpbiBjYXNlIGl0IGRldGVjdHMKICBhIGJyb2tlbiBUTFMgc2VydmVyLiBIb3dldmVyIGl0IGRvZXMgbm90IGhhcHBlbiBpZiBTU0wgdmVyc2lvbiBpcyBzZWxlY3RlZAogIG1hbnVhbGx5LiBUaGUgYXBwcm9hY2ggd2FzIG9yaWdpbmFsbHkgdGFrZW4gZnJvbSBQU00uIEthc3BhciBCcmFuZCBoZWxwZWQgbWUKICB0byBjb21wbGV0ZSB0aGUgcGF0Y2guIE9yaWdpbmFsIGJ1ZyByZXBvcnRzOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS81MjU0OTYKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vNTI3NzcxCgpZYW5nIFRzZSAoMTIgTm92IDIwMDkpCi0gSSBtb2RpZmllZCBjb25maWd1cmUgc2NyaXB0IHRvIG1ha2UgdGhlIGdldGFkZHJpbmZvIGZ1bmN0aW9uIGNoZWNrIGFsc28KICB2ZXJpZnkgaWYgdGhlIGZ1bmN0aW9uIGlzIHRocmVhZCBzYWZlLgoKWWFuZyBUc2UgKDExIE5vdiAyMDA5KQotIE1hcmNvIE1hZ2dpIHJlcG9ydGVkIHRoYXQgY29tcGlsYXRpb24gZmFpbGVkIHdoZW4gY29uZmlndXJlZCAtLXdpdGgtZ3NzYXBpCiAgYW5kIEdOVSBHU1MgaW5zdGFsbGVkIGR1ZSB0byBhIG1pc3NpbmcgbXV0dWFsIGV4Y2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMgaW4KICB0aGUgS2VyYmVyb3MgNSBjb2RlIHBhdGguIEhlIGFsc28gdmVyaWZpZWQgdGhhdCBteSBwYXRjaCB3b3JrZWQgZm9yIGhpbS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTm92IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgcG9zdGVkIGJ1ZyAjMjg5MTU5NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODkxNTk1KSB3aGljaCBpZGVudGlmaWVkIGhvdyBhbiBlbnRyeQogIGluIHRoZSBETlMgY2FjaGUgd291bGQgbGluZ2VyIHRvbyBsb25nIGlmIHRoZSByZXF1ZXN0IHRoYXQgYWRkZWQgaXQgd2FzIGluCiAgdXNlIHRoYXQgbG9uZy4gSGUgYWxzbyBwcm92aWRlZCB0aGUgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBjYXBhYmxlIG9mCiAgc3RpbGwgZG9pbmcgYSByZXF1ZXN0IHdoaWxlIHRoZSBETlMgaGFzaCBlbnRyeSBtYXkgZ2V0IHRpbWVkIG91dC4KCi0gQ2hyaXN0aWFuIFNjaG1pdHogbm90aWNlZCB0aGF0IHRoZSBwcm9ncmVzcyBtZXRlci9jYWxsYmFjayB3YXMgbm90IHByb3Blcmx5CiAgdXNlZCBkdXJpbmcgdGhlIEZUUCBjb25uZWN0aW9uIHBoYXNlIChhZnRlciB0aGUgYWN0dWFsIFRDUCBjb25uZWN0KSwgd2hpbGUKICBpdCBvZiBjb3Vyc2Ugc2hvdWxkIGJlLiBJIGFsc28gbWFkZSB0aGUgc3BlZWQgY2hlY2sgZ2V0IGNhbGxlZCBjb3JyZWN0bHkgc28KICB0aGF0IHJlYWxseSBzbG93IHNlcnZlcnMgd2lsbCB0cmlnZ2VyIHRoYXQgcHJvcGVybHkgdG9vLgoKS2FtaWwgRHVka2EgKDUgTm92IDIwMDkpCi0gRHJvcHBlZCBtaXNsZWFkaW5nIHRpbWVvdXRzIGluIGxpYmN1cmwtTlNTIGFuZCBtYWRlIHN1cmUgdGhlIFNTTCBzb2NrZXQgd29ya3MKICBpbiBub24tYmxvY2tpbmcgbW9kZS4KCllhbmcgVHNlICg1IE5vdiAyMDA5KQotIEkgcmVtb3ZlZCBsZWFkaW5nICdjdXJsJyBwYXRoIG9uIHRoZSAnY3VybGJ1aWxkLmgnIGluY2x1ZGUgc3RhdGVtZW50IGluCiAgY3VybC5oLCBhZGp1c3RpbmcgYXV0by1tYWtlZmlsZXMgaW5jbHVkZSBwYXRoLCB0byBlbmhhbmNlIHBvcnRhYmlsaXR5IHRvCiAgT1MncyB3aXRob3V0IGFuIG9ydGhvZ29uYWwgZGlyZWN0b3J5IHRyZWUgc3RydWN0dXJlIHN1Y2ggYXMgT1MvNDAwLgoKRGFuaWVsIFN0ZW5iZXJnICg0IE5vdiAyMDA5KQotIEkgZml4ZWQgc2V2ZXJhbCBwcm9ibGVtcyB3aXRoIHRoZSB0cmFuc2ZlciBwcm9ncmVzcyBtZXRlci4gSXQgc2hvd2VkIHRoZQogIHdyb25nIHBlcmNlbnRhZ2UgZm9yIHNtYWxsIGZpbGVzLCBtb3N0IG5vdGFibGUgZm9yIDwxMDAwIGJ5dGVzIGFuZCBjb3VsZAogIGVhc2lseSBlbmQgdXAgc2hvd2luZyBtb3JlIHRoYW4gMTAwJSBhdCB0aGUgZW5kLiBJdCBhbHNvIGRpZG4ndCBzaG93IGFueQogIHBlcmNlbnRhZ2UsIHRyYW5zZmVyIHNpemUgb3IgZXN0aW1hdGVkIHRyYW5zZmVyIHRpbWVzIHdoZW4gdHJhbnNmZXJyaW5nCiAgbGVzcyB0aGFuIDEwMCBieXRlcy4KClZlcnNpb24gNy4xOS43ICg0IE5vdmVtYmVyIDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDIgTm92IDIwMDkpCi0gQXMgcmVwb3J0ZWQgaW5kZXBlbmRlbnQgYnkgYm90aCBTdGFuIHZhbiBkZSBCdXJndCBhbmQgRGlkaWVyIEJyaXNlYm91cmcsCiAgQ1VSTElORk9fU0laRV9ET1dOTE9BRCAodGhlIC13IHZhcmlhYmxlIHNpemVfZG93bmxvYWQpIGRpZG4ndCB3b3JrIHdoZW4KICBnZXR0aW5nIGRhdGEgZnJvbSBsZGFwIQoKRGFuaWVsIFN0ZW5iZXJnICgzMSBPY3QgMjAwOSkKLSBHYWJyaWVsIEt1cmkgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgaWYgdGhlCiAgZG93bmxvYWQgd2FzIDAgYnl0ZXMsIGFzIGxpYmN1cmwgd291bGQgdGhlbiByZXR1cm4gdGhlIHNpemUgYXMgdW5rbm93biAoLTEpCiAgYW5kIG5vdCAwLiBJIHdyb3RlIGEgZml4IGFuZCB0ZXN0IGNhc2UgNTY2IHRvIHZlcmlmeSBpdC4KCkRhbmllbCBTdGVuYmVyZyAoMzAgT2N0IDIwMDkpCi0gTGl6YSBBbGVuY2hlcnkgbWVudGlvbmVkIGEgcHJvYmxlbSB3aXRoIHJlLXVzZWQgU0NQIGNvbm5lY3Rpb24gd2hlbiBhIGJhZAogIGF1dGggaXMgdXNlZCwgYXMgaXQgY2F1c2VkIGEgY3Jhc2guIEkgZmFpbGVkIHRvIHJlcGVhdCB0aGUgaXNzdWUsIGJ1dCBzdGlsbAogIG1hZGUgYSBjaGFuZ2UgdGhhdCBub3cgZm9yY2VzIHRoZSBUQ1AgY29ubmVjdGlvbiB1c2VkIGZvciBhIGZyZWVkIFNDUAogIHNlc3Npb24gdG8gZ2V0IGNsb3NlZCBhbmQgbm90IGJlIHJlLXVzZWQuCgotICJUb20iIHBvc3RlZCBhIGJ1ZyByZXBvcnQgdGhhdCBtZW50aW9uZWQgaG93IGxpYmN1cmwgZGlkIHdyb25nIHdoZW4gZG9pbmcgYQogIFBPU1QgdXNpbmcgYSByZWFkIGNhbGxiYWNrLCB3aXRoIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBhbmQKICAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGVuZm9yY2VkLiAgSSB3b3VsZCB0aGVuIGNhdXNlIHRoZSBmaXJzdCByZXF1ZXN0CiAgdG8gYmUgd3JvbmdseSBzZW50IGFuZCB0aGVuIGJhc2ljYWxseSBoYW5nIHVudGlsIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZQogIGNvbm5lY3Rpb24uIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkIHRlc3QgY2FzZSA1NjUgdG8gdmVyaWZ5IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBPY3QgMjAwOSkKLSBEaW1hIEJhcnNreSBtYWRlIHRoZSBjdXJsIGNvb2tpZSBwYXJzZXIgYWNjZXB0IGNvb2tpZXMgZXZlbiB3aXRoIGJsYW5rIG9yCiAgdW5wYXJzYWJsZSBleHBpcnkgZGF0ZXMgYW5kIHRoZW4gdHJlYXQgdGhlbSBhcyBzZXNzaW9uIGNvb2tpZXMgLSBwcmV2aW91c2x5CiAgbGliY3VybCB3b3VsZCByZWplY3QgY29va2llcyB3aXRoIGEgZGF0ZSBmb3JtYXQgaXQgY291bGRuJ3QgcGFyc2UuIFJlc2VhcmNoCiAgc2hvd3MgdGhhdCB0aGUgbWFqb3IgYnJvd3NlciB0cmVhdCBzdWNoIGNvb2tpZXMgYXMgc2Vzc2lvbiBjb29raWVzLiBJCiAgbW9kaWZpZWQgdGVzdCA4IGFuZCAzMSB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoMjEgT2N0IDIwMDkpCi0gQXR0ZW1wdCB0byB1c2UgcGtnLWNvbmZpZyBmb3IgZmluZGluZyBvdXQgbGlic3NoMiBpbnN0YWxsYXRpb24gZGV0YWlscwogIGR1cmluZyBjb25maWd1cmUuCgotIEEgcGF0Y2ggaW4gYnVnIHJlcG9ydCAjMjg4MzE3NyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg4MzE3NykKICBieSBKb2hhbiB2YW4gU2Vsc3QgaW50cm9kdWNlZCB0aGUgLS1jcmxmaWxlIG9wdGlvbiB0byBjdXJsLCB3aGljaCBtYWtlcyBjdXJsCiAgdGVsbCBsaWJjdXJsIGFib3V0IGEgZmlsZSB3aXRoIENSTCAoY2VydGlmaWNhdGUgcmV2b2NhdGlvbiBsaXN0KSBkYXRhIHRvCiAgcmVhZC4KCkRhbmllbCBTdGVuYmVyZyAoMTggT2N0IDIwMDkpCi0gUmF5IERhc3NlbiBwcm92aWRlZCBhIHBhdGNoIGluIERlYmlhbidzIGJ1ZyB0cmFja2VyIChidWcgbnVtYmVyICM1NTE0NjEpCiAgdGhhdCBub3cgbWFrZXMgY3VybF9nZXRkYXRlKDMpIGFjdHVhbGx5IGhhbmRsZXMgUkZDIDgyMiBmb3JtYXR0ZWQgZGF0ZXMgdGhhdAogIHVzZSB0aGUgInNpbmdsZSBsZXR0ZXIgbWlsaXRhcnkgdGltZXpvbmVzIi4KICBodHRwOi8vd3d3LnJmYy1yZWYub3JnL1JGQy1URVhUUy84MjIvY2hhcHRlcjUuaHRtbCBoYXMgdGhlIGRldGFpbHMuCgotIEZpeGVkIG1lbW9yeSBsZWFrIGluIHRoZSBTQ1AvU0ZUUCBjb2RlIGFzIGl0IG5ldmVyIGZyZWVkIHRoZSBrbm93bmhvc3RzCiAgZGF0YSEKCi0gSm9obiBEZW5uaXMgZmlsZWQgYnVnIHJlcG9ydCAjMjg3MzY2NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODczNjY2KSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdoaWNoIG1hZGUgbGliY3VybCBsb29wIGluZmluaXRlbHkgd2hlbiBnaXZlbiBpbmNvcnJlY3QgY3JlZGVudGlhbHMgd2hlbgogIHVzaW5nIEhUVFAgR1NTIG5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbi4gSGUgYWxzbyBwcm92aWRlZCBhIHNtYWxsIGFuZCBzaW1wbGUKICBwYXRjaCBmb3IgaXQuCgotIEtldmluIEJhdWdobWFuIGZvdW5kIGEgZG91YmxlIGNsb3NlKCkgcHJvYmxlbSB3aXRoIGxpYmN1cmwtTlNTLCBhcyB3aGVuCiAgbGliY3VybCBjYWxsZWQgTlNTIHRvIGNsb3NlIHRoZSBTU0wgInNlc3Npb24iIGl0IGFsc28gY2xvc2VkIHRoZSBhY3R1YWwKICBzb2NrZXQuCgpZYW5nIFRzZSAoMTcgT2N0IDIwMDkpCi0gQnVnIHJlcG9ydCAjMjg2NjcyNCBpbmRpY2F0ZWQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg2NjcyNCkgdGhhdCBjdXJsIG9uIFdpbmRvd3MgZmFpbGVkCiAgd2hlbiB3cml0aW5nIGZpbGVzIHdob3NlIGZpbGUgbmFtZXMgb3JpZ2luYWxseSBjb250YWluZWQgY2hhcmFjdGVycyB3aGljaAogIGFyZSBub3QgdmFsaWQgZm9yIGZpbGUgbmFtZXMgb24gV2luZG93cy4gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGFuIGluaXRpYWwKICBwYXRjaCBhbmQgYW5vdGhlciByZXZpc2VkIG9uZSB0byBmaXggdGhpcyBpc3N1ZS4KCkRhbmllbCBTdGVuYmVyZyAoMSBPY3QgMjAwOSkKLSBUb20gTXVlbGxlciBjb3JyZWN0bHkgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjMjg3MDIyMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODcwMjIxKSB0aGF0IGxpYmN1cmwgcmV0dXJuZWQgYW4KICBpbmNvcnJlY3QgcmV0dXJuIGNvZGUgZnJvbSB0aGUgaW50ZXJuYWwgdHJ5bmV4dGlwKCkgZnVuY3Rpb24gd2hpY2ggY2F1c2VkCiAgaGltIGdyaWVmLiBUaGlzIGlzIGEgcmVncmVzc2lvbiB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDcuMTkuMSBhbmQgSSBmaW5kIGl0CiAgc3RyYW5nZSBpdCBoYXNuJ3QgaGl0IHVzIGhhcmRlciwgYnV0IEkgd29uJ3QgcGVyc3VlIGludG8gZmlndXJpbmcgb3V0CiAgZXhhY3RseSB3aHkuCgotIENvbnN0YW50aW5lIFNhcHVudHpha2lzOiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGFsd2F5cyBzZXQKICBTT19TTkRCVUYgdG8gQ1VSTF9XUklURV9TSVpFIGV2ZW4gaWYgdGhlIFNPX1NOREJVRiBzdGFydHMgb3V0IGxhcmdlci4gIFRoZQogIHBhdGNoIGRvZXNuJ3QgZG8gYSBzZXRzb2Nrb3B0IGlmIFNPX1NOREJVRiBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgogIENVUkxfV1JJVEVfU0laRS4gVGhpcyBzaG91bGQgaGVscCBmb2xrcyB3aG8gaGF2ZSBzZXQgdXAgdGhlaXIgY29tcHV0ZXIgd2l0aAogIGxhcmdlIHNlbmQgYnVmZmVycy4KCkRhbmllbCBTdGVuYmVyZyAoMjcgU2VwIDIwMDkpCi0gSSBpbnRyb2R1Y2VkIGEgbWF4aW11bSBsaW1pdCBmb3IgcmVjZWl2ZWQgSFRUUCBoZWFkZXJzLiBJdCBpcyBjb250cm9sbGVkIGJ5CiAgdGhlIGRlZmluZSBDVVJMX01BWF9IVFRQX0hFQURFUiB3aGljaCBpcyBldmVuIGV4cG9zZWQgaW4gdGhlIHB1YmxpYyBoZWFkZXIKICBmaWxlIHRvIGFsbG93IGZvciB1c2VycyB0byBmYWlybHkgZWFzeSByZWJ1aWxkIGxpYmN1cmwgd2l0aCBhIG1vZGlmaWVkCiAgbGltaXQuIFRoZSByYXRpb25hbGUgZm9yIGEgZml4ZWQgbGltaXQgaXMgdGhhdCBsaWJjdXJsIGlzIHJlYWxsb2MoKWluZyBhCiAgYnVmZmVyIHRvIGJlIGFibGUgdG8gcHV0IGEgZnVsbCBoZWFkZXIgaW50byBpdCwgc28gdGhhdCBpdCBjYW4gY2FsbCB0aGUKICBoZWFkZXIgY2FsbGJhY2sgd2l0aCB0aGUgZW50aXJlIGhlYWRlciwgYnV0IHRoYXQgYWxzbyByaXNrIGdldHRpbmcgaXQgaW50bwogIHRyb3VibGUgaWYgYSBzZXJ2ZXIgYnkgbWlzdGFrZSBvciB3aWxsaW5nbHkgc2VuZHMgYSBoZWFkZXIgdGhhdCBpcyBtb3JlIG9yCiAgbGVzcyB3aXRob3V0IGFuIGVuZC4gVGhlIGxpbWl0IGlzIHNldCB0byAxMDBLLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBTZXAgMjAwOSkKLSBKb2huIFAuIE1jQ2Fza2V5IHBvc3RlZCBhIGJ1ZyByZXBvcnQgdGhhdCBzaG93ZWQgaG93IGxpYmN1cmwgZGlkIHdyb25nIHdoZW4KICBzYXZpbmcgcmVjZWl2ZWQgY29va2llcyB3aXRoIG5vIGdpdmVuIHBhdGgsIGlmIHRoZSBwYXRoIGluIHRoZSByZXF1ZXN0IGhhZCBhCiAgcXVlcnkgcGFydC4gVGhhdCBpcyBtZWFucyBhIHF1ZXN0aW9uIG1hcmsgKD8pIGFuZCBjaGFyYWN0ZXJzIG9uIHRoZSByaWdodAogIHNpZGUgb2YgdGhhdC4gSSB3cm90ZSB0ZXN0IGNhc2UgMTEwNSBhbmQgZml4ZWQgdGhpcyBwcm9ibGVtLgoKS2FtaWwgRHVka2EgKDI2IFNlcCAyMDA5KQotIEltcGxlbWVudGVkIGEgcHJvdG9jb2wgaW5kZXBlbmRlbnQgd2F5IHRvIHNwZWNpZnkgYmxvY2tpbmcgZGlyZWN0aW9uLCB1c2VkIGJ5CiAgdHJhbnNmZXIuYyBmb3IgYmxvY2tpbmcuIEl0IGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgYnkgU0NQIGFuZCBTRlRQIHByb3RvY29scy4KICBUaGlzIGVuaGFuY2VtZW50IHJlc29sdmVzIGFuIGlzc3VlIHdpdGggMTAwJSBDUFUgdXNhZ2UgZHVyaW5nIFNGVFAgdXBsb2FkLAogIHJlcG9ydGVkIGJ5IFZvdXJoZXkuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IFNlcCAyMDA5KQotIENocmlzIE11bWZvcmQgZmlsZWQgYnVnIHJlcG9ydCAjMjg2MTU4NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODYxNTg3KSBpZGVudGlmeWluZyB0aGF0IGxpYmN1cmwgdXNlZAogIHRoZSBPcGVuU1NMIGZ1bmN0aW9uIFg1MDlfbG9hZF9jcmxfZmlsZSgpIHdyb25nbHkgYW5kIGZhaWxlZCBpZiBpdCB3b3VsZAogIGxvYWQgYSBDUkwgZmlsZSB3aXRoIG1vcmUgdGhhbiBvbmUgY2VydGlmaWNhdGUgd2l0aGluLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTYgU2VwIDIwMDkpCi0gU3ZlbiBBbmRlcnMgcmVwb3J0ZWQgdGhhdCB3ZSBpbnRyb2R1Y2VkIGEgY2VydCB2ZXJmaWNhdGlvbiBmbGF3IGZvciBPcGVuU1NMLQogIHBvd2VyZWQgbGliY3VybCBpbiA3LjE5LjYuIElmIHRoZXJlIHdhcyBhIFg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWUKICBmaWVsZCBpbiB0aGUgY2VydGZpY2F0ZSBpdCBoYWQgdG8gbWF0Y2ggYW5kIHNvIGV2ZW4gaWYgbm9uLUROUyBhbmQgbm9uLUlQCiAgZW50cnkgd2FzIHByZXNlbnQgaXQgY2F1c2VkIHRoZSB2ZXJpZmljYXRpb24gdG8gZmFpbC4KCkRhbmllbCBGYW5kcmljaCAoMTUgU2VwIDIwMDkpCi0gTW92ZWQgdGhlIGxpYnNzaDIgY2hlY2tzIGFmdGVyIHRoZSBTU0wgbGlicmFyeSBjaGVja3MuIFRoaXMgaGVscHMgd2hlbgogIHN0YXRpY2FsbHkgbGlua2luZyBzaW5jZSBsaWJzc2gyIG5lZWRzIHRoZSBTU0wgbGlicmFyeSBsaW5rIGZsYWdzIHRvIGJlCiAgc2V0IHVwIGFscmVhZHkgdG8gc2F0aXNmeSBpdHMgZGVwZW5kZW5jaWVzLiBUaGlzIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZgogIHRoZSBsaWJzc2gyIGNvbmZpZ3VyZSBjaGVjayB3YXMgY2hhbmdlZCB0byB1c2UgcGtnLWNvbmZpZyBzaW5jZSB0aGUKICAtLXN0YXRpYyBmbGFnIHdvdWxkIGFkZCB0aGUgZGVwZW5kZW5jaWVzIGF1dG9tYXRpY2FsbHkuCgpZYW5nIFRzZSAoMTQgU2VwIDIwMDkpCi0gUmV2ZXJ0IEpvc2h1YSBLd2FuJ3MgcGF0Y2ggY29tbWl0dGVkIDExIFNlcCAyMDA5LgoKICBTb21lIHN5c3RlbXMgcG9sbCBmdW5jdGlvbiBzZXRzIFBPTExIVVAgaW4gcmV2ZW50cyB3aXRob3V0IHNldHRpbmcKICBQT0xMSU4sIGFuZCBzZXRzIFBPTExFUlIgd2l0aG91dCBzZXR0aW5nIFBPTExJTiBhbmQgUE9MTE9VVC4gSW4gc29tZQogIGxpYmN1cmwgY29kZSBleGVjdXRpb24gcGF0aHMgdGhpcyBjb3VsZCB0cmlnZ2VyIGJ1c3kgd2FpdCBsb29wcyB3aXRoCiAgaGlnaCBDUFUgdXNhZ2UgdW50aWwgYSB0aW1lb3V0IGNvbmRpdGlvbiBhYm9ydGVkIHRoZSBsb29wLgoKICBUaGUgcmV2ZXJ0ZWQgcGF0Y2ggYWRkcmVzc2VkIHRoZSBhYm92ZSBpc3N1ZSBmb3IgYSB2ZXJ5IHNwZWNpZmljIGNhc2UsCiAgd2hlbiBhd2FpdGluZyBjLWFyZXMgdG8gcmVzb2x2ZS4gQSBsaWJjdXJsLXdpZGUgZml4IGZvciBDdXJsX3BvbGwgbm93CiAgc3VwZXJjZWVkcyB0aGlzIG9uZS4KCkd1ZW50ZXIgS25hdWYgKDExIFNlcCAyMDA5KQotIEpvc2h1YSBLd2FuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gcGFzcyBQT0xMRVJSIC8gUE9MTEhVUCBiYWNrIHRvIGMtYXJlcy4KICBUaGlzIGZpeGVzIGEgbG9vcCBwcm9ibGVtIHdpdGggaGlnaCBDUFUgdXNhZ2UuCgpEYW5pZWwgU3RlbmJlcmcgKDEwIFNlcCAyMDA5KQotIENsYWVzIEpha29ic3NvbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBjb29raWUgZXhwaXJ5IGRhdGVzIGF0IGV4Y3RseSB0aGUgZXBvY2gKICBzdGFydCBzZWNvbmQgIlRodSBKYW4gMSAwMDowMDowMCBHTVQgMTk3MCIgYXMgdGhlIGRhdGUgcGFyc2VyIHRoZW4gcmV0dXJucyAwCiAgd2hpY2ggaW50ZXJuYWxseSB0aGVuIGlzIHRyZWF0ZWQgYXMgYSBzZXNzaW9uIGNvb2tpZS4gVGhhdCBwYXJ0aWN1bGFyIGRhdGUKICBpcyBub3cgbWFkZSB0byBnZXQgdGhlIHZhbHVlIG9mIDEuCgpEYW5pZWwgU3RlbmJlcmcgKDIgU2VwIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gZm91bmQgYSBmbGF3IGluIHRoZSBjb2RlIGNvbnZlcnRpbmcgc2Z0cC1lcnJvcnMgdG8gbGliY3VybAogIGVycm9ycy4KCkRhbmllbCBTdGVuYmVyZyAoMSBTZXAgMjAwOSkKLSBQZXRlciBTeWx2ZXN0ZXIgbWFkZSBhIGRlYnVnIGZlYXR1cmUgZm9yIEN1cmxfcmVzb2x2KCkgdGhhdCBub3cgd2lsbCBmb3JjZQogIGxpYmN1cmwgdG8gcmVzb2x2ZSAnbG9jYWxob3N0JyB3aGF0ZXZlciBuYW1lIHlvdSB1c2UgaW4gdGhlIFVSTCAqaWYqIHlvdSBzZXQKICB0aGUgLS1pbnRlcmZhY2Ugb3B0aW9uIHRvIChleGFjdGx5KSAiTG9jYWxIb3N0Ii4gVGhpcyB3aWxsIGVuYWJsZSB1cyB0bwogIHdyaXRlIHRlc3RzIGZvciBjdXN0b20gaG9zdHMgbmFtZXMgYnV0IHN0aWxsIHVzZSBhIGxvY2FsIGhvc3Qgc2VydmVyLgoKLSBjb25maWd1cmUgbm93IHRyaWVzIHRvIHVzZSBwa2ctY29uZmlnIGZvciBhIG51bWJlciBvZiBzdWItZGVwZW5kZW5jaWVzIGV2ZW4KICB3aGVuIGNyb3NzLWNvbXBpbGluZy4gVGhlIGtleSB0byBzdWNjZXNzIGlzIHRoZW4geW91IHByb3Blcmx5IHNldHVwCiAgUEtHX0NPTkZJR19QQVRIIGJlZm9yZSBpbnZva2luZyBjb25maWd1cmUuCgogIEkgYWxzbyBpbXByb3ZlZCBob3cgTlNTIGlzIGRldGVjdGVkIGJ5IHRyeWluZyBuc3MtY29uZmlnIGlmIHBrZy1jb25maWcgaXNuJ3QKICBwcmVzZW50LCBhbmQgYXMgYSBsYXN0IHJlc29ydCBqdXN0IHVzZSB0aGUgbGliIG5hbWUgYW5kIGZvcmNlIHRoZSB1c2VyIHRvCiAgc2V0dXAgdGhlIExJQlMvTERGTEFHUy9DRkxBR1MgZXRjIHByb3Blcmx5LiBUaGUgcHJldmlvdXMgbGFzdCByZXNvcnQgd291bGQKICBhZGQgYSByYW5nZSBvZiB2YXJpb3VzIGxpYnMgdGhhdCB3b3VsZCBhbG1vc3QgbmV2ZXIgYmUgcXVpdGUgY29ycmVjdC4KCkRhbmllbCBTdGVuYmVyZyAoMzEgQXVnIDIwMDkpCi0gV2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHdpdGggRlRQIGFuZCB5b3UgYXNrZWQgZm9yIE5PQk9EWSwgeW91IGRpZCBubwogIFFVT1RFIGNvbW1hbmRzIGFuZCB0aGUgcmVxdWVzdCB1c2VkIHRoZSBzYW1lIHBhdGggYXMgdGhlIGNvbm5lY3Rpb24gaGFkCiAgYWxyZWFkeSBjaGFuZ2VkIHRvLCBpdCB3b3VsZCBkZWNpZGUgdGhhdCBubyBjb21tYW5kcyB3b3VsZCBiZSBuZWNlc3NhcnkgZm9yCiAgdGhlICJETyIgYWN0aW9uIGFuZCB0aGF0IHdhcyBub3QgaGFuZGxlZCBwcm9wZXJseSBidXQgbGliY3VybCB3b3VsZCBpbnN0ZWFkCiAgaGFuZy4KCkthbWlsIER1ZGthICgyOCBBdWcgMjAwOSkKLSBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIGZvciBub3QgbWF0Y2hpbmcgY2VydGlmaWNhdGUgc3ViamVjdCBuYW1lIGluCiAgbGliY3VybC1OU1MuIE9yaWdpbmFsbHkgcmVwb3J0ZWQgYXQ6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01MTYwNTYjYzkKClBhdHJpY2sgTW9ubmVyYXQgKDI0IEF1ZyAyMDA5KQotIEludHJvZHVjZWQgYSBTWVNULWJhc2VkIHRlc3QgdG8gcHJvcGVybHkgc2V0LXVwIG5hbWUgZm9ybWF0IHdoZW4gZGVhbGluZwogIHdpdGggdGhlIE9TLzQwMCBGVFAgc2VydmVyLgoKLSBGaXhlZCBhbiBmdHBfcmVhZHJlc3AoKSBidWcgcHJldmVudGluZyBkZXRlY3Rpb24gb2YgZmFpbGluZyBjb250cm9sIHNvY2tldAogIGFuZCBjYXVzaW5nIEZUUCBjbGllbnQgdG8gbG9vcCBmb3JldmVyLgoKRGFuaWVsIFN0ZW5iZXJnICgyNCBBdWcgMjAwOSkKLSBNYXJjIGRlIEJydWluIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0td2l0aC1nbnV0bHM9UEFUSCBkaWRuJ3Qgd29yawogIHByb3Blcmx5IGFuZCBwcm92aWRlZCBhIGZpeC4gaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjg0MzAwOAoKLSBFcmljIFdvbmcgaW50cm9kdWNlZCBzdXBwb3J0IGZvciB0aGUgbmV3IG9wdGlvbiAtVC4gKGRvdCkgdGhhdCBtYWtlcyBjdXJsCiAgcmVhZCBzdGRpbiBpbiBhIG5vbi1ibG9ja2luZyBmYXNoaW9uLiBUaGlzIGFsc28gYnJpbmdzIGJhY2sgLVQtIChtaW51cykgdG8KICB0aGUgcHJldmlvdXMgYmxvY2tpbmcgYmVoYXZpb3Igc2luY2UgaXQgY291bGQgYnJlYWsgc3R1ZmYgZm9yIHBlb3BsZSBhdAogIHRpbWVzLgoKTWljaGFsIE1hcmVrICgyMSBBdWcgMjAwOSkKLSBXaXRoIENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERSwgYXZvaWQgc2VuZGluZyBpbnZhbGlkIFVSTHMgbGlrZQogIGZ0cDovL2V4YW1wbGUuY29tO3R5cGU9aSBpZiB0aGUgdXNlciBzcGVjaWZpZWQgZnRwOi8vZXhhbXBsZS5jb20gd2l0aG91dCB0aGUKICBzbGFzaC4KCkRhbmllbCBTdGVuYmVyZyAoMjEgQXVnIDIwMDkpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBwb2ludGVkIG91dCBhIG1pc3NpbmcgcmV0dXJuIGNvZGUgY2hlY2sgZm9yIGEKICBzdHJkdXAoKSB0aGF0IGNvdWxkIGxlYWQgdG8gc2VnZmF1bHQgaWYgaXQgcmV0dXJuZWQgTlVMTC4gSSBleHRlbmRlZCBoaXMKICBzdWdnZXN0IHBhdGNoIHRvIG5vdyBoYXZlIEN1cmxfcmV0cnlfcmVxdWVzdCgpIHJldHVybiBhIHJlZ3VsYXIgcmV0dXJuIGNvZGUKICBhbmQgYmV0dGVyIGNoZWNrIHRoYXQuCgotIExvdHMgb2YgZ29vZCB3b3JrIGJ5IEtyaXN0ZXIgSm9oYW5zZW4sIG1vc3RseSByZWxhdGVkIHRvIHBpcGVsaW5pbmc6CgogIEZpeCBTSUdTRUdWIG9uIGZyZWUnZCBlYXN5X2Nvbm4gd2hlbiBwaXBlIHVuZXhwZWN0ZWRseSBicmVha3MKICBGaXggZGF0YSBjb3JydXB0aW9uIGlzc3VlIHdpdGggcmUtY29ubmVjdGVkIHRyYW5zZmVycwogIEZpeCB1c2UgYWZ0ZXIgZnJlZSBpZiB3ZSdyZSBjb21wbGV0ZWQgYnV0IGVhc3lfY29ubiBub3QgTlVMTAoKS2FtaWwgRHVka2EgKDEzIEF1ZyAyMDA5KQotIENoYW5nZWQgTlNTIGNvZGUgdG8gbm90IGlnbm9yZSB0aGUgdmFsdWUgb2Ygc3NsLnZlcmlmeWhvc3QgYW5kIHByb2R1Y2UgbW9yZQogIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMuIE9yaWdpbmFsbHkgcmVwb3J0ZWQgYXQ6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01MTYwNTYKCkRhbmllbCBTdGVuYmVyZyAoMTIgQXVnIDIwMDkpCi0gS2FybCBNb2VyZGVyIGZpeGVkIHRoZSBNYWtlZmlsZS52YyogbWFrZWZpbGVzIHRvIGluY2x1ZGUgdGhlIG5ldyBmaWxlCiAgbm9uYmxvY2suYyBzbyB0aGF0IHRoZXkgd29yayBmaW5lIGFnYWluCgotIEkgZXhwYW5kZWQgdGVzdCA1MTcgd2l0aCBhIGJ1bmNoIG9mIG1vcmUgZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSB0aGUKICBDaHJvbWUgYnJvd3NlciB0ZXN0IHN1aXRlLiBJdCB0dXJucyBvdXQgbW9zdCBvZiB0aGVtIGdldCBwYXJzZWQgdGhlIHNhbWUKICB3YXkuCgpWZXJzaW9uIDcuMTkuNiAoMTIgQXVndXN0IDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEF1ZyAyMDA5KQotIENhcnN0ZW4gTGFuZ2UgcmVwb3J0ZWQgYSBidWcgYW5kIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIFRGVFAgdXBsb2FkIGFuZCB0aGUKICBzZW5kaW5nIG9mIHRoZSBUU0laRSBvcHRpb24uIEkgZG9uJ3QgbGlrZSBmaXhpbmcgYnVncyBqdXN0IGhvdXJzIGJlZm9yZQogIGEgcmVsZWFzZSwgYnV0IHNpbmNlIGl0IHdhcyBicm9rZW4gYW5kIHRoZSBwYXRjaCBmaXhlcyB0aGlzIGZvciBoaW0gSSBkZWNpZGVkCiAgdG8gZ2V0IGl0IGluIGFueXdheS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgQXVnIDIwMDkpCi0gUGV0ZXIgU3lsdmVzdGVyIG1hZGUgdGhlIEhUVFBTIHRlc3Qgc2VydmVyIHVzZSBzcGVjaWZpYyBjZXJ0aWZpY2F0ZXMgZm9yCiAgZWFjaCB0ZXN0LCBzbyB0aGF0IHRoZSB0ZXN0IHN1aXRlIGNhbiBub3cgYmUgdXNlZCB0byBhY3R1YWxseSB0ZXN0IHRoZQogIHZlcmlmaWNhdGlvbiBvZiBjZXJ0IG5hbWVzIGV0Yy4gVGhpcyBtYWRlIGFuIGVycm9yIHNob3cgdXAgaW4gdGhlIE9wZW5TU0wtCiAgc3BlY2lmaWMgY29kZSB3aGVyZSBpdCB3b3VsZCBhdHRlbXB0IHRvIG1hdGNoIHRoZSBDTiBmaWVsZCBldmVuIGlmIGEKICBzdWJqZWN0QWx0TmFtZSBleGlzdHMgdGhhdCBkb2Vzbid0IG1hdGNoLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdmVyaWZpZWQKICBpbiB0ZXN0IDMxMS4KCi0gQmVuYnVjayBOYXNvbiBwb3N0ZWQgdGhlIGJ1ZyByZXBvcnQgIzI4MzUxOTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjgzNTE5NiksIGZpeGluZyBhIGZldyBjb21waWxlcgogIHdhcm5pbmdzIHdoZW4gbWl4aW5nIGludHMgYW5kIGJvb2xzLgoKRGFuaWVsIEZhbmRyaWNoICgxMCBBdWcgMjAwOSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBGVFAgY29kZSBhbmQgYW4gb2ZmLWJ5LW9uZSBoZWFwIGJ1ZmZlciBvdmVyZmxvdy4KCkRhbmllbCBGYW5kcmljaCAoOSBBdWcgMjAwOSkKLSBGaXhlZCBzb21lIG1lbW9yeSBsZWFrcyBpbiB0aGUgY29tbWFuZC1saW5lIHRvb2wgdGhhdCBjYXVzZWQgbW9zdCBvZiB0aGUKICB0b3J0dXJlIHRlc3RzIHRvIGZhaWwuCgpEYW5pZWwgU3RlbmJlcmcgKDIgQXVnIDIwMDkpCi0gQ3VydCBCb2dtaW5lIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIFNOSSBlbmFibGVkIG9uIGEgcGFydGljdWxhciBzZXJ2ZXIuIFdlCiAgc2hvdWxkIGludHJvZHVjZSBhbiBvcHRpb24gdG8gZGlzYWJsZSBTTkksIGJ1dCBhcyB3ZSdyZSBpbiBmZWF0dXJlIGZyZWV6ZQogIG5vdyBJJ3ZlIGFkZHJlc3NlZCB0aGUgb2J2aW91cyBidWcgaGVyZSAocG9pbnRlZCBvdXQgYnkgUGV0ZXIgU3lsdmVzdGVyKTogd2UKICBzaG91bGRuJ3QgdHJ5IHRvIGVuYWJsZSBTTkkgd2hlbiBTU0x2MiBvciBTU0x2MyBpcyBleHBsaWNpdGx5IHNlbGVjdGVkLgogIENvZGUgZm9yIE9wZW5TU0wgYW5kIEdudVRMUyB3YXMgZml4ZWQuIE5TUyBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHBhcnRpY3VsYXIKICBvcHRpb24gZm9yIFNOSSwgb3IgYXJlIHdlIHNpbXBseSBub3QgdXNpbmcgaXQ/CgpEYW5pZWwgU3RlbmJlcmcgKDEgQXVnIDIwMDkpCi0gU2NvdHQgQ2FudG9yIHBvc3RlZCB0aGUgYnVnIHJlcG9ydCAjMjgyOTk1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODI5OTU1KSBtZW50aW9uaW5nIHRoZSByZWNlbnQgU1NMIGNlcnQKICB2ZXJpZmljYXRpb24gZmxhdyBmb3VuZCBhbmQgZXhwbG9pdGVkIGJ5IE1veGllIE1hcmxpbnNwaWtlLiBUaGUgcHJlc2VudGF0aW9uCiAgaGUgZGlkIGF0IEJsYWNrIEhhdCBpcyBhdmFpbGFibGUgaGVyZToKICBodHRwczovL3d3dy5ibGFja2hhdC5jb20vaHRtbC9iaC11c2EtMDkvYmgtdXNhLTA5LWFyY2hpdmVzLmh0bWwjTWFybGluc3Bpa2UKCiAgQXBwYXJlbnRseSBhdCBsZWFzdCBvbmUgQ0EgYWxsb3dlZCBhIHN1YmplY3RBbHROYW1lIG9yIENOIHRoYXQgY29udGFpbiBhCiAgemVybyBieXRlLCBhbmQgdGh1cyBjbGllbnRzIHRoYXQgYXNzdW1lZCB0aGV5IHdvdWxkIG5ldmVyIGhhdmUgemVybyBieXRlcwogIHdlcmUgZXhwbG9pdGVkIHRvIE9LIGEgY2VydGlmaWNhdGUgdGhhdCBkaWRuJ3QgYWN0dWFsbHkgbWF0Y2ggdGhlIHNpdGUuIExpa2UKICBpZiB0aGUgbmFtZSBpbiB0aGUgY2VydCB3YXMgImV4YW1wbGUuY29tXDB0aGVhdHVhbHNpdGUuY29tIiwgbGliY3VybCB3b3VsZAogIGhhcHBpbHkgdmVyaWZ5IHRoYXQgY2VydCBmb3IgZXhhbXBsZS5jb20uCgogIGxpYmN1cmwgbm93IGJldHRlciB1c2VzIHRoZSBsZW5ndGggb2YgdGhlIGV4dHJhY3RlZCBuYW1lLCBub3QgdXNpbmcgdGhlIHplcm8KICB0ZXJtaW5hdGlvbiBmb3IgZ2V0dGluZyB0aGUgc3RyaW5nIGxlbmd0aC4KCiAgVGhpcyBmaXhpbmcgb25seSBtYWRlIGFuZCBuZWVkZWQgaW4gT3BlblNTTCBpbnRlcmZhY2luZyBjb2RlLgoKLSBUYW5ndXkgRmF1dHJlIHBvaW50ZWQgb3V0IHRoYXQgT3BlblNTTCdzIGZ1bmN0aW9uIFJBTkRfc2NyZWVuKCkgKHByZXNlbnQKICBvbmx5IGluIHNvbWUgT3BlblNTTCBpbnN0YWxscyAtIGxpa2Ugb24gV2luZG93cykgaXNuJ3QgdGhyZWFkLXNhZmUgYW5kIHdlCiAgYWdyZWVkIHRoYXQgbW92aW5nIGl0IHRvIHRoZSBnbG9iYWxfaW5pdCgpIGZ1bmN0aW9uIGlzIGEgZGVjZW50IHdheSB0byBkZWFsCiAgd2l0aCB0aGlzIHNpdHVhdGlvbi4KCi0gQWxleGFuZGVyIEJlZWRpZSBwcm92aWRlZCB0aGUgcGF0Y2ggZm9yIGEgbm9wcm94eSBwcm9ibGVtOiBJZiBJIGhhdmUgc2V0CiAgQ1VSTE9QVF9OT1BST1hZIHRvICIqIiwgb3IgdG8gYSBob3N0IHRoYXQgc2hvdWxkIG5vdCB1c2UgYSBwcm94eSwgSSBhY3R1YWxseQogIGNvdWxkIHN0aWxsIGVuZCB1cCB1c2luZyBhIHByb3h5IGlmIGEgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIHNldC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgSnVsIDIwMDkpCi0gQWxsIHRoZSBxdW90ZSBvcHRpb25zIChDVVJMT1BUX1FVT1RFLCBDVVJMT1BUX1BPU1RRVU9URSBhbmQKICBDVVJMT1BUX1BSRVFVT1RFKSBub3cgYWNjZXB0IGEgcHJlY2VlZGluZyBhc3RlcmlzayBiZWZvcmUgdGhlIGNvbW1hbmQgdG8KICBzZW5kIHdoZW4gdXNpbmcgRlRQLCBhcyBhIHNpZ24gdGhhdCBsaWJjdXJsIHNoYWxsIHNpbXBseSBpZ25vcmUgdGhlIHJlc3BvbnNlCiAgZnJvbSB0aGUgc2VydmVyIGluc3RlYWQgb2YgdHJlYXRpbmcgaXQgYXMgYW4gZXJyb3IuIE5vdCB0cmVhdGluZyBhIDQwMCsgRlRQCiAgcmVzcG9uc2UgY29kZSBhcyBhbiBlcnJvciBtZWFucyB0aGF0IGZhaWxlZCBjb21tYW5kcyB3aWxsIG5vdCBhYm9ydCB0aGUKICBjaGFpbiBvZiBjb21tYW5kcywgbm9yIHdpbGwgdGhleSBjYXVzZSB0aGUgY29ubmVjdGlvbiB0byBnZXQgZGlzY29ubmVjdGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBKdWwgMjAwOSkKLSBKb2hhbiB2YW4gU2Vsc3QgcG9zdGVkIGJ1ZyByZXBvcnQgIzI4MjU5ODkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjgyNTk4OSkgcG9pbnRpbmcgb3V0IHRoYXQKICBPcGVuU1NMLXBvd2VyZWQgbGliY3VybCBkaWRuJ3Qgc3VwcG9ydCB0aGUgU0hBLTIgZGlnZXN0IGFsZ29yaXRobSwgYW5kCiAgcHJvdmlkZWQgdGhlIHNvbHV0aW9uIHRvbzogdG8gdXNlIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgaW4gYWRkaXRpb24KICB0byB0aGUgb2xkZXIgU1NMZWF5XyogYWx0ZXJuYXRpdmUuIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zIHdhcyBhZGRlZCBpbgogIE9wZW5TU0wgMC45LjUKCkRhbmllbCBTdGVuYmVyZyAoMjMgSnVsIDIwMDkpCi0gQWRkZWQgQ1VSTE9QVF9TU0hfS05PV05IT1NUUywgQ1VSTE9QVF9TU0hfS0VZRlVOQ1RJT04sIENVUkxPUFRfU1NIX0tFWURBVEEuCiAgVGhleSBpbnRyb2R1Y2Uga25vd25faG9zdCBzdXBwb3J0IGZvciBTU0gga2V5cyB0byBsaWJjdXJsLiBTZWUgZG9jcyBmb3IKICBkZXRhaWxzLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRlcGVuZHMgb24gYSBuZXcgZW5vdWdoIGxpYnNzaDIgdmVyc2lvbiwgdG8KICBiZSBzdXBwb3J0ZWQgaW4gbGlic3NoMiAxLjIgYW5kIGxhdGVyIChvciBjdXJyZW50IGdpdCByZXBvIGF0IHRoaXMgdGltZSkuCgpNaWNoYWwgTWFyZWsgKDIyIEp1bCAyMDA5KQotIERhdmlkIEJpbmRlcm1hbiBmb3VuZCBhIG1lbW9yeSBhbmQgZmQgbGVhayBpbiBsaWIvZ3Rscy5jOmxvYWRfZmlsZSgpCiAgKGh0dHBzOi8vYnVnemlsbGEubm92ZWxsLmNvbS81MjM5MTkpLiBXaGVuIGxvb2tpbmcgYXQgdGhlIGNvZGUsIEkgZm91bmQgdGhhdAogIGFsc28gdGhlIHB0ciBwb2ludGVyIGNhbiBsZWFrLgoKS2FtaWwgRHVka2EgKDIwIEp1bCAyMDA5KQotIENsYWVzIEpha29ic3NvbiBpbXByb3ZlZCB0aGUgc3VwcG9ydCBmb3IgY2xpZW50IGNlcnRpZmljYXRlcyBoYW5kbGluZyBpbgogIE5TUy1wb3dlcmVkIGxpYmN1cmwuIE5vdyB0aGUgY2xpZW50IGNlcnRpZmljYXRlcyBjYW4gYmUgc2VsZWN0ZWQKICBhdXRvbWF0aWNhbGx5IGJ5IGEgTlNTIGJ1aWx0LWluIGhvb2suIEFkZGl0aW9uYWxseSBwcmUtbG9naW4gdG8gYWxsIFBLQ1MxMQogIHNsb3RzIGlzIG5vIG1vcmUgcGVyZm9ybWVkLiBJdCB1c2VkIHRvIGNhdXNlIHByb2JsZW1zIHdpdGggSFcgdG9rZW5zLgoKLSBGaXhlZCByZWZlcmVuY2UgY291bnRpbmcgZm9yIE5TUyBjbGllbnQgY2VydGlmaWNhdGVzLiBOb3cgdGhlIFBFTSByZWFkZXIKICBtb2R1bGUgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSB1bmxvYWRlZCBvbiBDdXJsX25zc19jbGVhbnVwKCkuIElmIHRoZQogIHVubG9hZCBmYWlscyB0aG91Z2gsIGxpYmN1cmwgd2lsbCB0cnkgdG8gcmV1c2UgdGhlIGFscmVhZHkgbG9hZGVkIGluc3RhbmNlLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBKdWwgMjAwOSkKLSBBZGRlZCBub25ibG9jay5jIHRvIHRoZSBub24tYXV0b21ha2UgbWFrZWZpbGVzIChub3RlIHRoYXQgdGhlIGRlcGVuZGVuY2llcwogIGluIHRoZSBXYXRjb20gbWFrZWZpbGVzIGFyZW4ndCBxdWl0ZSBjb3JyZWN0KS4KCk1pY2hhbCBNYXJlayAoMTUgSnVsIDIwMDkpCi0gQ2hhbmdlZCB0aGUgZGVzY3JpcHRpb24gb2YgQ1VSTElORk9fT1NfRVJSTk8gdG8gbWFrZSBpdCBjbGVhciB0aGF0IHRoZQogIGVycm5vIGlzIG5vdCByZXNldCBvbiBzdWNjZXNzLgoKR3VlbnRlciBLbmF1ZiAoMTQgSnVsIDIwMDkpCi0gcmVuYW1lZCBnZW5lcmF0ZWQgY29uZmlnLmggdG8gY3VybF9jb25maWcuaCB0byBhdm9pZCBhbnkgZnV0dXJlIGNsYXNoZXMKICB3aXRoIGNvbmZpZy5oIGZyb20gb3RoZXIgcHJvamVjdHMuCgpEYW5pZWwgU3RlbmJlcmcgKDkgSnVsIDIwMDkpCi0gRXJpYyBXb25nIGludHJvZHVjZWQgY3VybHhfbm9uYmxvY2soKSB0aGF0IHRoZSBjdXJsIHRvb2wgbm93IChyZS0pdXNlcyBmb3IKICBzZXR0aW5nIGEgZmlsZSBkZXNjcmlwdG9yIG5vbi1ibG9ja2luZy4gVXNlZCBieSB0aGUgZnVuY3Rpb25hbGl0eSBFcmljCiAgaGltc2VsZiBicm91Z2ggb24gSnVuZSAxNXRoLgoKRGFuaWVsIFN0ZW5iZXJnICg4IEp1bCAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIHBvc3RlZCBidWcgcmVwb3J0ICMyODEzMTIzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4MTMxMjMpIGFuZCBhbiBhIHBhdGNoIHRoYXQgZml4ZXMgdGhlCiAgcHJvYmxlbToKCiAgVXJsIEEgaXMgYWNjZXNzZWQgdXNpbmcgYXV0aC4gVXJsIEEgcmVkaXJlY3RzIHRvIFVybCBCIChvbiBhIGRpZmZlcmVudAogIHNlcnZlcjAuIFVybCBCIHJldXNlcyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gVXJsIEIgaGFzIGF1dGgsIGV2ZW4gdGhvdWdoCiAgaXQncyBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIuCgogIE5vdGU6IGlmIFVybCBCIGRvZXMgbm90IHJldXNlIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLCBhdXRoIGlzIG5vdCBzZW50LgoKICByZWFzb246CgogIGRhdGEtPnN0YXRlLmZpcnN0X2hvc3QgaXMgbm90IGluaXRpYWxpemVkIGJlY3Vhc2UgQ3VybF9odHRwX2Nvbm5lY3QgaXMgbm90CiAgY2FsbGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIHJldXNlZC4KCiAgU29sdXRpb246CgogIG1vdmUgaW5pdGlhbGl6YXRpb24gb2YgZGF0YS0+c3RhdGUuZmlyc3RfaG9zdCB0byBDdXJsX2h0dHAuIE5vIGNvZGUgYmVmb3JlCiAgQ3VybF9odHRwIHVzZXMgZGF0YS0+c3RhdGUuZmlyc3RfaG9zdCBhbnl3YXkuCgpHdWVudGVyIEtuYXVmICg0IEp1bCAyMDA5KQotIE1hcmt1cyBLb2V0dGVyIHByb3ZpZGVkIGEgcGF0Y2ggdG8gYXZvaWQgZ2V0bmFtZWluZm8oKSB1c2FnZSB3aGljaCBicm9rZSBhCiAgY291cGxlIG9mIGJvdGggSVB2NCBhbmQgSVB2NiBhdXRvYnVpbGRzLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBKdW4gMjAwOSkKLSBNYXJrdXMgS29ldHRlciBtYWRlIENVUkxPUFRfRlRQUE9SVCAoYW5kIGN1cmwncyAtUC8tLWZ0cHBvcnQpIHN1cHBvcnQgYSBwb3J0CiAgcmFuZ2UgaWYgZ2l2ZW4gY29sb24tc2VwYXJhdGVkIGFmdGVyIHRoZSBob3N0IG5hbWUvYWRkcmVzcyBwYXJ0LiBMaWtlCiAgIjE5Mi4xNjguMC4xOjIwMDAtMTAwMDAiCgotIE1vZGlmaWVkIHRoZSBzZXBhcmF0b3JzIHVzZWQgZm9yIENVUkxPUFRfQ0VSVElORk8gaW4gbXVsdGktcGFydCBvdXRwdXRzLiBJCiAgZG9uJ3Qga25vdyBob3cgdGhleSBnb3Qgd3JvbmcgaW4gdGhlIGZpcnN0IHBsYWNlLCBidXQgdXNpbmcgdGhpcyBvdXRwdXQKICBmb3JtYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcXVpdGUgZWFzaWx5IHNlcGFyYXRlIHRoZSBzdHJpbmcgaW50byBhbiBhcnJheQogIG9mIG11bHRpcGxlIGl0ZW1zLgoKRGFuaWVsIEZhbmRyaWNoICgxNiBKdW5lIDIwMDkpCi0gQWRkZWQgYSBmZXcgbW9yZSBjb21waWxlciB3YXJuaW5nIG9wdGlvbnMgZm9yIGdjYy4KCkRhbmllbCBTdGVuYmVyZyAoMTYgSnVuIDIwMDkpCi0gUmV1dmVuIFdhY2h0Zm9nZWwgbWFkZSBjdXJsIC1vIC0gcHJvcGVybHkgcHJvZHVjZSBhIGJpbmFyeSBvdXRwdXQgb24gd2luZG93cwogIChubyBuZXdsaW5lIHRyYW5zbGF0aW9ucykuIFVzZSAtQi8tLXVzZS1hc2NpaSBpZiB5b3UgcmF0aGVyIGdldCB0aGUgYXNjaWkKICBhcHByb2FjaC4KCk1pY2hhbCBNYXJlayAoMTYgSnVuIDIwMDkpCi0gV2hlbiBkb2luZyBub24tYW5vbnltb3VzIGZ0cCB2aWEgaHR0cCBwcm94aWVzIGFuZCB0aGUgcGFzc3dvcmQgaXMgbm90CiAgcHJvdmlkZWQgaW4gdGhlIHVybCwgYWRkIGl0IHRoZXJlIChzcXVpZCBuZWVkcyB0aGlzKS4KCkRhbmllbCBTdGVuYmVyZyAoMTUgSnVuIDIwMDkpCi0gRXJpYyBXb25nJ3MgcGF0Y2g6CgogIFRoaXMgYWxsb3dzIGN1cmwoMSkgdG8gYmUgdXNlZCBhcyBhIGNsaWVudC1zaWRlIHR1bm5lbCBmb3IgYXJiaXRyYXJ5IHN0cmVhbQogIHByb3RvY29scyBieSBhYnVzaW5nIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgaW4gYm90aCB0aGUgSFRUUCByZXF1ZXN0IGFuZAogIEhUVFAgcmVzcG9uc2UuICBUaGlzIHJlcXVpcmVzIHNlcnZlciBzdXBwb3J0IGZvciBzZW5kaW5nIGEgcmVzcG9uc2Ugd2hpbGUgYQogIHJlcXVlc3QgaXMgc3RpbGwgYmVpbmcgcmVhZCwgb2YgY291cnNlLgoKICBJZiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBzdGRpbiByZXR1cm5zIEVBR0FJTiwgdGhlbiB3ZSBwYXVzZSBvdXIgc2VuZGVyLgogIFRoaXMgbGVhdmVzIGN1cmwgdG8gYXR0ZW1wdCB0byByZWFkIGZyb20gdGhlIHNvY2tldCB3aGlsZSByZWFkaW5nIGZyb20gc3RkaW4KICAoYW5kIHRodXMgc2VuZGluZykgaXMgcGF1c2VkLgoKICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIHRvIGFsbG93IHN1Y2Nlc3NmdWxseSB0dW5uZWxpbmcgdGhlIGdpdCBwcm90b2NvbCBvdmVyCiAgSFRUUCAoLS1uby1idWZmZXIgaXMgbmVlZGVkLCBhcyB3ZWxsKS4KClBhdHJpY2sgTW9ubmVyYXQgKDE1IEp1biAyMDA5KQotIFJlcGxhY2VkIHVzZSBvZiBzdGFuZGFyZCBDIGxpYnJhcnkgcmFuZCgpL3NyYW5kKCkgYnkgb3VyIG93biBwc2V1ZG8tcmFuZG9tCiAgbnVtYmVyIGdlbmVyYXRvci4KCllhbmcgVHNlICgxMSBKdW4gMjAwOSkKLSBJIGFkYXB0ZWQgdGVzdGN1cmwgc2NyaXB0IHRvIGFsbG93IGJ1aWxkaW5nIHRlc3QgaGFybmVzcyBwcm9ncmFtcyB3aGVuCiAgY3Jvc3MtY29tcGlsaW5nIGZvciBhICotKi1taW5ndyogaG9zdC4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSnVuIDIwMDkpCi0gRmFiaWFuIEtlaWwgcmFuIGNsYW5nIG9uIHRoZSAobGliKWN1cmwgY29kZSwgZm91bmQgYSBidW5jaCBvZiB3YXJuaW5ncyBhbmQKICBjb250cmlidXRlZCBhIHJhbmdlIG9mIHBhdGNoZXMgdG8gZml4IHRoZW0uCgpZYW5nIFRzZSAoMTAgSnVuIDIwMDkpCi0gSSBpbnRyb2R1Y2VkIGNvbmZpZ3VyZSBzY3JpcHQgb3B0aW9uIC0tZW5hYmxlLWN1cmxkZWJ1ZyB3aGljaCBub3cgYWxsb3dzCiAgdGhlIGRlY291cGxlZCBlbmFibGluZyBvciBkaXNhYmxpbmcgb2YgdGhlIGN1cmwgZGVidWcgbWVtb3J5IHRyYWNraW5nCiAgZmVhdHVyZSBmcm9tIHRoZSAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gd2hpY2ggbm8gbG9uZ2VyIGNvbnRyb2xzIHRoaXMuCgogIGN1cmwgLS12ZXJzaW9uIHdpbGwgbGlzdCAnRGVidWcnIGZlYXR1cmUgZm9yIGRlYnVnIGVuYWJsZWQgYnVpbGRzLCBhbmQKICB3aWxsIGxpc3QgJ1RyYWNrTWVtb3J5JyBmZWF0dXJlIGZvciBjdXJsIGRlYnVnIG1lbW9yeSB0cmFja2luZyBjYXBhYmxlCiAgYnVpbGRzLiBUaGVzZSBmZWF0dXJlcyBhcmUgaW5kZXBlbmRlbnQgYW5kIGNhbiBiZSBjb250cm9sbGVkIHdoZW4gcnVubmluZwogIHRoZSBjb25maWd1cmUgc2NyaXB0LiBXaGVuIC0tZW5hYmxlLWRlYnVnIGlzIGdpdmVuIGJvdGggZmVhdHVyZXMgd2lsbCBiZQogIGVuYWJsZWQsIHVubGVzcyBzb21lIHJlc3RyaWN0aW9uIHByZXZlbnRzIG1lbW9yeSB0cmFja2luZyBmcm9tIGJlaW5nIHVzZWQuCgogIEludGVybmFsbHksIGRlZmluaXRpb24gb2YgcHJlcHJvY2Vzc29yIHN5bWJvbCBERUJVR0JVSUxEIHJlc3RyaWN0cyBjb2RlCiAgd2hpY2ggaXMgb25seSBjb21waWxlZCBmb3IgZGVidWcgZW5hYmxlZCBidWlsZHMuIEFuZCBzeW1ib2wgQ1VSTERFQlVHIGlzCiAgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGNvZGUgd2hpY2ggaXMgX29ubHlfIHVzZWQgZm9yIG1lbW9yeSB0cmFja2luZy4KCllhbmcgVHNlICg5IEp1biAyMDA5KQotIERhbmllbCBTdGVpbmJlcmcgcG9pbnRlZCBvdXQgdGhhdCBDdXJsX0Zvcm1Jbml0KCkgaW4gZm9ybWRhdGEuYyB3YXMgbm90CiAgaW5pdGlhbGl6aW5nIHRoZSBmcmVhZCBjYWxsYmFjayBwb2ludGVyIGFuZCB0aGlzIHRyaWdnZXJlZCBhIGNvbXBpbGVyCiAgd2FybmluZywgYWxzbyBwcm92aWRlZCBhIGZyaWVuZGx5IHN1Z2dlc3Rpb24gb24gaG93IHRvIGZpeCBpdC4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdW4gMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gcHJvdmlkZWQgYSBwYXRjaCBmb3IgbGliY3VybC1OU1MgdGhhdCBmaXhlZCBhIGJhZCByZWZjb3VudAogIGlzc3VlIHdpdGggY2xpZW50IGNlcnRzIHRoYXQgY2F1c2VkIGlzc3VlcyBsaWtlIHNlZ2ZhdWx0cy4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDUvMDMxNi5odG1sCgotIFRyaWdnZXJlZCBieSBidWcgcmVwb3J0ICMyNzk4ODUyIGFuZCB0aGUgcGF0Y2ggaW4gdGhlcmUsIEkgZml4ZWQgY29uZmlndXJlCiAgdG8gZGV0ZWN0IGdudXRscyBidWlsZCBvcHRpb25zIHdpdGggcGtnLWNvbmZpZyBvbmx5IGFuZCBub3QgbGliZ251dGxzLWNvbmZpZwogIGFueW1vcmUgc2luY2UgR251VExTIGhhcyBzdG9wcGVkIGRpc3RyaWJ1dGluZyB0aGF0IHRvb2wuIElmIGFuIGV4cGxpY2l0IHBhdGgKICBpcyBnaXZlbiB0byBjb25maWd1cmUsIHdlIHdpbGwgaW5zdGVhZCBndWVzcyBvbiBob3cgdG8gbGluayBhbmQgdXNlIHRoYXQKICBsaWIuIEkgZGlkIG5vdCB1c2UgdGhlIHBhdGNoIGZyb20gdGhlIGJ1ZyByZXBvcnQuCgpZYW5nIFRzZSAoOCBKdW4gMjAwOSkKLSBJZ29yIE5vdm9zZWx0c2V2IGFkanVzdGVkIE1ha2VmaWxlLnZ4d29ya3MgdG8gZ2V0IHNvdXJjZXMgYW5kIGhlYWRlcnMKICBpbmNsdWRlZCBmcm9tIE1ha2VmaWxlLmluYywgYW5kIHByb3ZpZGVkIGRvY3NcSU5TVEFMTCBWeFdvcmtzIHNlY3Rpb24uCgotIEkgcmVtb3ZlZCBidWlsZGNvbmYuYmF0IGZyb20gcmVsZWFzZSBhbmQgZGFpbHkgc25hcHNob3QgYXJjaGl2ZXMuIFRoaXMKICBmaWxlIGlzIG9ubHkgZm9yIENWUyB0cmVlIGNoZWNrb3V0IGJ1aWxkcy4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdW4gMjAwOSkKLSBFcmljIFdvbmcgZml4ZWQgLS1uby1idWZmZXIgdG8gYWN0dWFsbHkgc3dpdGNoIG9mZiBvdXRwdXQgYnVmZmVyaW5nLiBCZWVuCiAgYnJva2VuIHNpbmNlIDcuMTkuMAoKQmlsbCBIb2ZmbWFuICg2IEp1biAyMDA5KQotIEFkZGVkIHNvbWUgY21ha2UgZG9jcyBhbmQgZml4ZWQgc29ja2xlbl90IGluIHRoZSBidWlsZC4KCllhbmcgVHNlICg1IEp1biAyMDA5KQotIEpvaG4gRS4gTWFsbWJlcmcgcHJvdmlkZWQgVk1TIHNwZWNpZmljIHBhdGNoOiAiVGhpcyBmaXhlcyBhbiBleGlzdGluZyBidWcKICBpbiB1cmxnbG9iLmMgd2hlcmUgaXQgd2FzIG5vdCBjb252ZXJ0aW5nIHRoZSBDdXJsIFVuaXggZXhpdCBjb2RlIHRvIGEgVk1TCiAgRENMIGNvbXBhdGlibGUgZXhpdCBjb2RlLiAgVGhpcyBmaXggcmVxdWlyZWQgdGhlIGVuaGFuY2VtZW50IGRlc2NyaWJlZCBuZXh0LgogIFRoaXMgYWxzbyBhZGRzIGFuIGVuaGFuY2VtZW50IHRvIG1haW4uYyBzbyB0aGF0IHdoZW4gY3VybCBpcyBydW4gdW5kZXIgYQogIFVuaXggc2hlbGwgbGlrZSBCYXNoIG9uIFZNUywgaXQgd2lsbCByZXR1cm4gdGhlIHN0YW5kYXJkIFVuaXggZXhpdCBjb2RlcwogIGFuZCBtZXNzYWdlcy4iIEFuZCBhbm90aGVyIHBhdGNoIGZvciBkb2NzL2V4YW1wbGVzLgoKICBJIGludHJvZHVjZWQgb3Mtc3BlY2lmaWMuYyBhbmQgb3Mtc3BlY2lmaWMuaCBmb3IgdXNlIGluIGN1cmwgdG9vbCBjb2RlCiAgYW5kIGFkanVzdGVkIEpvaG4gRS4gTWFsbWJlcmcncyBwYXRjaCBwbGFjZW1lbnQgdG8gdXNlIHRoZXNlIG5ldyBmaWxlcwogIGFzIGFuIGVmZm9ydCB0byBwcmV2ZW50IG1haW4uYyBmcm9tIGdyb3dpbmcgYWQgaW5maW5pdHVtLiBDb2RlIGFscmVhZHkKICBleGlzdGluZyBpbiBtYWluLmMgd2hpY2ggaXMgT1Mgc3BlY2lmaWMgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlc2UgZmlsZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgSnVuZSAyMDA5KQotIFNldHRpbmcgdGhlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgZnJvbSB5b3VyIGFwcCB3aGVuIHlvdSBkbyBhIFBPU1Qgb3IgUFVUCiAgaXMgYWxtb3N0IGFsd2F5cyBhIFZFUlkgQkFEIElERUEuIFlldCB0aGVyZSBhcmUgc3RpbGwgYXBwcyBvdXQgdGhlcmUgZG9pbmcKICB0aGlzLCBhbmQgbm93IHJlY2VudGx5IGl0IHRyaWdnZXJlZCBhIGJ1Zy9zaWRlLWVmZmVjdCBpbiBsaWJjdXJsIGFzIHdoZW4KICBsaWJjdXJsIHNlbmRzIGEgUE9TVCBvciBQVVQgd2l0aCBOVExNLCBpdCBzZW5kcyBhbiBlbXB0eSBwb3N0IGZpcnN0IHdoZW4gaXQKICBrbm93cyBpdCB3aWxsIGp1c3QgZ2V0IGEgNDAxLzQwNyBiYWNrLiBJZiB0aGUgYXBwIHRoZW4gcmVwbGFjZWQgdGhlCiAgQ29udGVudC1MZW5ndGggaGVhZGVyLCBpdCBjYXVzZWQgdGhlIHNlcnZlciB0byB3YWl0IGZvciBpbnB1dCB0aGF0IGxpYmN1cmwKICB3b3VsZG4ndCBzZW5kLiBBYXJvbiBPbmVhbCByZXBvcnRlZCB0aGlzIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMjc5OTAwOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzk5MDA4KSBhbmQgaGVscGVkIHVzIHZlcmlmeSB0aGUgZml4LgoKWWFuZyBUc2UgKDQgSnVuIDIwMDkpCi0gSWdvciBOb3Zvc2VsdHNldiBwcm92aWRlZCBwYXRjaGVzIGFuZCBpbmZvcm1hdGlvbiwgdGhhdCBhZnRlciBzb21lCiAgYWRqdXN0bWVudHMgdG8gYmV0dGVyIGZpdCBjdXJsJ3Mgd2F5IG9mIGRvaW5nIHRoaW5ncywgaGF2ZSByZXN1bHRlZAogIGluIHRoZSBwb3NpYmlsaXR5IG9mIGJ1aWxkaW5nIGxpYmN1cmwgZm9yIFZ4V29ya3MuCgpEYW5pZWwgRmFuZHJpY2ggKDIgSnVuZSAyMDA5KQotIENoZWNrZWQgaW4gYSBHb29nbGUgQW5kcm9pZCBtYWtlIGZpbGUuIFRvIHVzZSBpdCwgeW91IG11c3QgZmlyc3QKICBjcmVhdGUgYSBjb25maWcuaCBmaWxlIGJ5IHJ1bm5pbmcgY29uZmlndXJlIGluIHRoZSBBbmRyb2lkIGVudmlyb25tZW50LAogIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSBlYXN5IHRvIGRvLiBJZiBubyBlYXN5IHdheSBjYW4gYmUgZm91bmQsIGEKICBzdGF0aWMgY29uZmlnLWFuZHJvaWQuaCBtYXkgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBjaGVja2VkIGluIHRvIHRoZQogIGxpYmN1cmwgc291cmNlIHRyZWUuCgpEYW5pZWwgU3RlbmJlcmcgKDEgSnVuZSAyMDA5KQotIENsYWVzIEpha29ic3NvbiBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBiZXR0ZXIgZmluZCBhbmQgdXNlIE5TUwogIHdpdGhvdXQgcGtnLWNvbmZpZy4KCllhbmcgVHNlICgxIEp1biAyMDA5KQotIEpvaG4gRS4gTWFsbWJlcmcgcHJvdmlkZWQgYSBWTVMgc3BlY2lmaWMgY2xlYW4tdXAgZm9yIGN1cmwuaCwgYW5kIHBvaW50ZWQKICBvdXQgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCB3YXMgZmFpbGluZyB0byBkZXRlY3QgdGhlIHRpbWV2YWwgc3RydWN0IG9uCiAgVk1TIHdoZW4gYnVpbGRpbmcgd2l0aCBfWE9QRU5fU09VUkNFX0VYVEVOREVEIHVuZGVmaW5lZCBkdWUgdG8gZGVmaW5pdGlvbgogIHRha2luZyBwbGFjZSBpbiBzb2NrZXQuaCBpbnN0ZWFkIG9mIHRpbWUuaC4gIEkgaGF2ZSBhZGp1c3RlZCBjb25maWd1cmUKICBzY3JpcHQgdG8gYWxzbyBpbmNsdWRlIHRoaXMgaGVhZGVyIHdoZW4gY2hlY2tpbmcgc3RydWN0IHRpbWV2YWwuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IE1heSAyMDA5KQotIEZyYW5rIE1jR2VvdWdoIHByb3ZpZGVkIGEgc21hbGwgT3BlblNTTCAjaW5jbHVkZSBmaXggdG8gbWFrZSBsaWJjdXJsIGNvbXBpbGUKICBmaW5lIHdpdGggTm9raWEgNXRoIGVkaXRpb24gMS4wIFNESyBmb3IgU3ltYmlhbi4KCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmb3VuZCBhIGNhbGwgdG8gYSBPcGVuU1NMIGZ1bmN0aW9uIHRoYXQgZGlkbid0IGNoZWNrCiAgZm9yIGEgZmFpbHVyZSBwcm9wZXJseS4KCi0gTWlrZSBDcm93ZSBwb2ludGVkIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9VU0VSUFdEIHRvIE5VTEwgdXNlZCB0byBjbGVhcgogIHRoZSBhdXRoIGNyZWRlbnRpYWxzIGJhY2sgaW4gNy4xOS4wIGFuZCBlYXJsaWVyIHdoaWxlIG5vdyB5b3UgaGF2ZSB0byBzZXQgIiIKICB0byBnZXQgdGhlIHNhbWUgZWZmZWN0LiBIaXMgcGF0Y2ggYnJpbmdzIGJhY2sgdGhlIGFiaWxpdHkgdG8gdXNlIE5VTEwuCgotIENsYWVzIEpha29ic3NvbiBmaXhlZCBsaWJjdXJsLU5TUyB0byBidWlsZCBmaW5lIGV2ZW4gd2l0aG91dCB0aGUKICBQSzExX0NyZWF0ZUdlbmVyaWNPYmplY3QoKSBmdW5jdGlvbi4KCkRhbmllbCBTdGVuYmVyZyAoMjUgTWF5IDIwMDkpCi0gYnVnIHJlcG9ydCAjMjc5NjM1OCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc5NjM1OCkgcG9pbnRlZAogIG91dCB0aGF0IHRoZSBjb29raWUgcGFyc2VyIHdvdWxkIGxlYWsgbWVtb3J5IHdoZW4gaXQgcGFyc2VzIGNvb2tpZXMgdGhhdCBhcmUKICByZWNlaXZlZCB3aXRoIGRvbWFpbiwgcGF0aCBldGMgc2V0IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGhlYWRlci4gV2hpbGUKICBzdWNoIGEgY29va2llIGlzIHF1ZXN0aW9uYWJsZSwgdGhleSBvY2N1ciBpbiB0aGUgd2lsZCBhbmQgbGliY3VybCBubyBsb25nZXIKICBsZWFrcyBtZW1vcnkgZm9yIHRoZW0uIEkgYWRkZWQgc3VjaCBhIGhlYWRlciB0byB0ZXN0IGNhc2UgOC4KCkRhbmllbCBGYW5kcmljaCAoMjIgTWF5IDIwMDkpCi0gUmVtb3ZlZCBzb21lIG9ic29sZXRlIGRpZ2VzdCBjb2RlIHRoYXQgY2F1c2VkIGEgdmFsZ3JpbmQgZXJyb3IgaW4gdGVzdCA1NTEuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE1heSAyMDA5KQotIEFkZGVkICJub24tZXhpc3RpbmcgaG9zdCIgdGVzdCBrZXl3b3JkcyB0byBtYWtlIGl0IGVhc3kgdG8gc2tpcCB0aG9zZQogIHRlc3RzIG9uIG1hY2hpbmVzIHRoYXQgaGF2ZSBicm9rZW4gRE5TIGNvbmZpZ3VyYXRpb25zIChzdWNoIGFzCiAgdGhvc2UgY29uZmlndXJlZCB0byB1c2UgT3BlbkROUykuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IE1heSAyMDA5KQotIEthbWlsIER1ZGthIGJyb3VnaHQgdGhlIHBhdGNoIGZyb20gdGhlIFJlZGhhdCBidWcgZW50cnkKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQyNzk2NiB3aGljaCB3YXMgbGliY3VybCBjbG9zaW5nCiAgYSBiYWQgZmlsZSBkZXNjcmlwdG9yIHdoZW4gY2xvc2luZyBkb3duIHRoZSBGVFAgZGF0YSBjb25uZWN0aW9uLiAgQ2FvbGFuCiAgTWNOYW1hcmEgc2VlbXMgdG8gYmUgdGhlIG9yaWdpbmFsIGF1dGhvciBvZiBpdC4KClZlcnNpb24gNy4xOS41ICgxOCBNYXkgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTcgTWF5IDIwMDkpCi0gSmFtZXMgQnVyc2EgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdCB0aGF0IGZpeGVkIGEgcHJvYmxlbSB3aXRoCiAgbm9fcHJveHkgd2hpY2ggbWFkZSBpdCBub3Qgc2tpcCB0aGUgcHJveHkgaWYgdGhlIFVSTCBlbnRlcmVkIGNvbnRhaW5lZCBhCiAgdXNlciBuYW1lLiBJIGFkZGVkIHRlc3QgY2FzZSAxMTAxIHRvIHZlcmlmeS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTWF5IDIwMDkpCi0gQmFsaW50IFN6aWxha3N6aSByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIHdoZW4gbGliY3VybCBkaWQgZ3ppcCBkZWNvbXByZXNzaW9uCiAgb2Ygc3RyZWFtcyB0aGF0IGhhZCBzb21lIHBhcnRzIChsZWdpdGltYXRlbHkpIG1pc3NpbmcuIFdlIG5vdyBwcm92aWRlIGFuZCB1c2UKICBhIHByb3BlciBjbGVhbnVwIGZ1bmN0aW9uIGZvciB0aGUgY29udGVudCBlbmNvZGluZyBzdWJtb2R1bGUuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA1LzAwOTIuaHRtbAoKLSBLYW1pbCBEdWRrYSBwcm92aWRlZCBhIGZpeCBmb3IgbGliY3VybC1OU1MgcmVwb3J0ZWQgYnkgTWljaGFlbCBDcm9uZW53b3J0aAogIGF0IGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyI2MxMgoKICBJZiBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgaXMgZ2l2ZW4gd2hpbGUgbG9hZGluZyBhIHByaXZhdGUga2V5LCBsaWJjdXJsIGVuZHMKICB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIGNvbnN1bWluZyBtZW1vcnkuIFRoZSBidWcgaXMgY3JpdGljYWwuCgotIEkgZml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkb2luZyBOVExNLCBQT1NUIGFuZCB0aGVuIGZvbGxvd2luZyBhIDMwMiByZWRpcmVjdCwKICBhcyByZXBvcnRlZCBieSBFYmVuZXplciBJa29ubmUgKG9uIGN1cmwtdXNlcnMpIGFuZCBMYXVyZW50IFJhYnJldCAob24KICBjdXJsLWxpYnJhcnkpLiBUaGUgdHJhbnNmZXIgd2FzIG1pc3Rha2VubHkgbWFya2VkIHRvIGdldCBtb3JlIGRhdGEgdG8gc2VuZAogIGJ1dCBzaW5jZSBpdCBkaWRuJ3QgYWN0dWFsbHkgaGF2ZSB0aGF0LCBpdCBqdXN0IGh1bmcgdGhlcmUuLi4KCkRhbmllbCBTdGVuYmVyZyAoMTAgTWF5IDIwMDkpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYW4gb3Zlci1hbGxvYyB3aXRoIG9uZSB3YXN0ZWQKICBieXRlIGluIHRoZSBkaWdlc3QgY29kZS4KCllhbmcgVHNlICg5IE1heSAyMDA5KQotIFJlbW92ZWQgRE9TIGFuZCBUUEYgcGFja2FnZSdzIHN1YmRpcmVjdG9yeSBNYWtlZmlsZS5hbSwgaXQgd2FzIG9ubHkgdXNlZAogIHRvIGluY2x1ZGUgc29tZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIHRhcmJhbGwgc2VydmluZyBubyBvdGhlciBwdXJwb3NlLgogIEZpbGVzIGZyb20gdGhlIERPUyBhbmQgVFBGIHN1YmRpcmVjdG9yaWVzIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIEVYVFJBX0RJU1QKICBvZiB0aGUgTWFrZWZpbGUgaW4gdGhlIHBhcmVudCBzdWJkaXJlY3RvcnkuCgpZYW5nIFRzZSAoOCBNYXkgMjAwOSkKLSBDaGFuZ2VkIGhvc3QgbmFtZSBsaXRlcmFsIGluIHNldmVyYWwgdGVzdHMgdG8gb25lIHVuZGVyIHRoZSBoYXh4LnNlIGRvbWFpbi4KCi0gUmVuYW1lZCB2YzYgd29ya3NwYWNlIGFuZCBwcm9qZWN0IGZpbGVzIHRvIGF2b2lkIGZpbGVuYW1lIGNsYXNoIHdoZW4gdXNlZAogIGZvciBjb252ZXJzaW9uIHRvIGxhdGVyIFZTIHZlcnNpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICg4IE1heSAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpeGVkIGJ1ZyByZXBvcnQgIzI3ODQwNTUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc4NDA1NSkgaWRlbnRpZnlpbmcgYSBwcm9ibGVtIHRvCiAgY29ubmVjdCB0byBTT0NLUyBwcm94aWVzIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZS4gSXQgdHVybmVkIG91dCB0bwogIGFsbW9zdCBub3Qgd29yayBhdCBhbGwgcHJldmlvdXNseS4gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgVENQIGNvbm5lY3QgdG8KICBiZSBwcm9wZXJseSB2ZXJpZmllZCBiZWZvcmUgZG9pbmcgdGhlIFNPQ0tTIG1hZ2ljLgoKICBUaGVyZSdzIHN0aWxsIGEgZmxhdyBpbiB0aGUgRlRQIGNvZGUgZm9yIHRoaXMuCgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMDkpCi0gTWFkZSB0aGUgU09fU05EQlVGIHNldHRpbmcgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24gc29ja2V0IGZvciBmdHAgdXBsb2FkcyBhcwogIHdlbGwuIFNlZSBjaGFuZ2UgMjggQXByIDIwMDkuCgpZYW5nIFRzZSAoNyBNYXkgMjAwOSkKLSBGaXhlZCBhbiBpc3N1ZSBhZmZlY3RpbmcgRlRQIHRyYW5zZmVycywgaW50cm9kdWNlZCB3aXRoIHRoZSB0cmFuc2Zlci5jCiAgcGF0Y2ggY29tbWl0dGVkIE1heSA0LgoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA5KQotIE1hbiBwYWdlICpyb2ZmIHByb2JsZW1zIGZpeGVkIHRoYW5rcyB0byBpbnB1dCBmcm9tIENvbGluIFdhdHNvbi4gUHJvYmxlbXMKICByZXBvcnRlZCBpbiB0aGUgRGViaWFuIHBhY2thZ2UuCgotIFZpamF5IEcgZmlsZWQgYnVnIHJlcG9ydCAjMjcyMzIzNgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzIzMjM2KSBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aAogIGxpYmN1cmwncyBURlRQIGNvZGUgYW5kIGl0cyBsYWNrIG9mIGRlYWxpbmcgd2l0aCB0aGUgT0FDSyBwYWNrZXQuCgpZYW5nIFRzZSAoNSBNYXkgMjAwOSkKLSBGaXhlZCB0aGUgLS1mdHAtcG9ydCBhZGRyZXNzIG9mIHRlc3QgIzI1MSB0byB0aGUgQ0xJRU5USVAgYWRkcmVzcywgYW5kCiAgcmV2ZXJ0ZWQgdGhlIGNoYW5nZSBhZmZlY3RpbmcgdGVzdCBzdWl0ZSBoYXJuZXNzIGNvbW1pdHRlZCA0IE1heS4KCkRhbmllbCBTdGVuYmVyZyAoNSBNYXkgMjAwOSkKLSBJbnNwaXJlZCBieSBNaWNoYWVsIFNtaXRoJ3Mgc2Vzc2lvbiBpZCBmaXggZm9yIE9wZW5TU0wsIEkgZGlkIHRoZQogIGNvcnJlc3BvbmRpbmcgZml4IGluIHRoZSBHbnVUTFMgY29kZTogbWFrZSBzdXJlIHRvIHN0b3JlIHRoZSBuZXcgc2Vzc2lvbiBpZAogIGluIGNhc2UgdGhlIHByZXZpb3VzIHJlLXVzZWQgb25lIGlzIHJlamVjdGVkLgoKRGFuaWVsIFN0ZW5iZXJnICg0IE1heSAyMDA5KQotIE1pY2hhZWwgU21pdGggcG9zdGVkIGJ1ZyByZXBvcnQgIzI3ODYyNTUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc4NjI1NSkgd2l0aCBhIHBhdGNoLCBpZGVudGlmeWluZyBob3cKICBsaWJjdXJsIGRpZCBub3QgZGVhbCB3aXRoIFNTTCBzZXNzaW9uIGlkcyBwcm9wZXJseSBpZiB0aGUgc2VydmVyIHJlamVjdGVkIGEKICByZS11c2Ugb2Ygb25lLiBTdGFydGluZyBub3csIGl0IHdpbGwgZm9yZ2V0IHRoZSByZWplY3RlZCBvbmUgYW5kIHJlbWVtYmVyCiAgdGhlIG5ldy4gVGhpcyBjaGFuZ2Ugd2FzIGZvciBPcGVuU1NMIG9ubHksIGl0IGlzIGxpa2VseSB0aGF0IG90aGVyIFNTTCBsaWIKICBjb2RlIG5lZWRzIHNpbWlsYXIgZml4ZXMuCgpZYW5nIFRzZSAoNCBNYXkgMjAwOSkKLSBBcHBsaWVkIERhdmlkIE1jQ3JlZWR5J3MgInRyYW5zZmVyLmMgZml4ZXMgZm9yIENVUkxfRE9fTElORUVORF9DT05WIGFuZAogIG5vbi1BU0NJSSBwbGF0Zm9ybSBIVFRQIHJlcXVlc3RzIiBwYXRjaCBhZGRyZXNzaW5nIHR3byBIVFRQIFBVVCBwcm9ibGVtczoKICAxKSBPbiBub24tQVNDSUkgcGxhdGZvcm1zIG5vdCBhbGwgb2YgdGhlIHByb3RvY29sIHBvcnRpb25zIG9mIHRoZSBQVVQgYXJlCiAgYmVpbmcgdHJhbnNsYXRlZCB0byBBU0NJSS4gIDIpIE9uIGFsbCBwbGF0Zm9ybXMgdGhlIGxpbmUgZW5kaW5ncyBvZiBwYXJ0IG9mCiAgdGhlIHByb3RvY29sIHBvcnRpb25zIGFyZSBtYW5nbGVkIGZyb20gQ1JMRiB0byBDUkNSTEYgaWYgZGF0YS0+c2V0LmNybGYgb3IKICBkYXRhLT5zZXQucHJlZmVyX2FzY2lpIGFyZSBzZXQgKGRlcGVuZGluZyBvbiBDVVJMX0RPX0xJTkVFTkRfQ09OVikuCgotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyBwYXRjaCB0byBmaXggdGVzdCBzdWl0ZSBoYXJuZXNzIHRvIGFsbG93IHRlc3QgRlRQCiAgc2VydmVyIGFuZCBjbGllbnQgb24gZGlmZmVyZW50IG1hY2hpbmVzLCBwcm92aWRpbmcgRlRQIGNsaWVudCBhZGRyZXNzIHdoZW4KICBydW5uaW5nIHRoZSBGVFAgdGVzdCBzZXJ2ZXIuCgpEYW5pZWwgRmFuZHJpY2ggKDMgTWF5IDIwMDkpCi0gQWRkZWQgYW5kIGRpc2FibGVkIHRlc3QgY2FzZSA1NjMgd2hpY2ggc2hvd3MgS05PV05fQlVHUyAjNTkuICBUaGUgYnVnCiAgcmVwb3J0IGZhaWxlZCB0byBtZW50aW9uIHRoYXQgYSBwcm94eSBtdXN0IGJlIHVzZWQgdG8gcmVwcm9kdWNlIGl0LgoKWWFuZyBUc2UgKDIgTWF5IDIwMDkpCi0gVXNlIGEgYnVpbGQtdGltZSBjb25maWd1cmVkIGN1cmxfc29ja2xlbl90IGRhdGEgdHlwZSBpbnN0ZWFkIG9mIHNvY2tsZW5fdC4KCllhbmcgVHNlICgxIE1heSAyMDA5KQotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyBwYXRjaGVzICJUUEYtcGxhdGZvcm0gc3BlY2lmaWMgY2hhbmdlcyB0byB2YXJpb3VzCiAgZmlsZXMiIGFuZCAiaHR0cC5jIGZpeCB0byBDdXJsX3Byb3h5Q09OTkVDVCBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtcyIsIHRoZQogIGZvcm1lciB3aXRoIG1pbm9yIGVkaXRzLgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBBcHIgMjAwOSkKLSBJIHdhcyBnb2luZyB0byBmaXggaXNzdWUgIzU5IGluIEtOT1dOX0JVR1MKCiAgSWYgdGhlIENVUkxPUFRfUE9SVCBvcHRpb24gaXMgdXNlZCBvbiBhbiBGVFAgVVJMIGxpa2UKICAiZnRwOi8vZXhhbXBsZS5jb20vZmlsZTt0eXBlPUEiIHRoZSAiO3R5cGU9QSIgaXMgc3RyaXBwZWQgb2ZmLgoKICBJIGFkZGVkIHRlc3QgY2FzZSA1NjIgdG8gdmVyaWZ5LCBvbmx5IHRvIGZpbmQgb3V0IHRoYXQgSSBjb3VsZG4ndCByZXBlYXQKICB0aGlzIGJ1ZyBzbyBJIGhlcmVieSBjb25zaWRlciBpdCBub3QgYSBidWcgYW55bW9yZSEKCkRhbmllbCBTdGVuYmVyZyAoMjkgQXByIDIwMDkpCi0gQmFzZWQgb24gYnVnIHJlcG9ydCAjMjcyMzIxOSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjcyMzIxOSkKICBJJ3ZlIG5vdyBtYWRlIFRGVFAgImNvbm5lY3Rpb25zIiBub3QgYmVpbmcga2VwdCBmb3IgcmUtdXNlIHdpdGhpbiBsaWJjdXJsLgogIFRGVFAgaXMgVURQLWJhc2VkIHNvIHRoZSBiZW5lZml0IHdhcyByZWFsbHkgbG93IChpZiBldmVuIGV4aXN0aW5nKSB0byBiZWdpbgogIHdpdGggc28gaW5zdGVhZCBvZiB0cmFja2luZyBkb3duIHRvIGZpeCB0aGlzIHByb2JsZW0gd2UgaW5zdGVhZCByZW1vdmVkIHRoZQogIHJlLXVzZS4gSSBhbHNvIGVuYWJsZWQgdGVzdCBjYXNlIDEwOTkgdGhhdCBJIHdyb3RlIGEgZmV3IGRheXMgYWdvIHRvIHZlcmlmeQogIHRoYXQgdGhpcyBjaGFuZ2UgZml4ZXMgdGhlIHJlcG9ydGVkIHByb2JsZW0uCgpEYW5pZWwgU3RlbmJlcmcgKDI4IEFwciAyMDA5KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpbGVkIGJ1ZyByZXBvcnQgIzI3ODMwOTAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc4MzA5MCkgcG9pbnRpbmcgb3V0IHRoYXQgb24gd2luZG93cwogIHdlIG5lZWQgdG8gZ3JvdyB0aGUgU09fU05EQlVGIGJ1ZmZlciBzb21ld2hhdCB0byBnZXQgcmVhbGx5IGdvb2QgdXBsb2FkCiAgc3BlZWRzLiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzgyMzc2NCBoYXMgdGhlIGRldGFpbHMuIEZyaWVuZHMKICBjb25maXJtZWQgdGhhdCBzaW1wbHkgYWRkaW5nIDMyIHRvIENVUkxfTUFYX1dSSVRFX1NJWkUgaXMgZW5vdWdoLgoKLSBCdWcgcmVwb3J0ICMyNzA5MDA0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzA5MDA0KSBieSBUaW0KICBDaGVuIHBvaW50ZWQgb3V0IGhvdyBjdXJsIGNvdWxkbid0IHVwbG9hZCB3aXRoIHJlc3VtZSB3aGVuIHJlYWRpbmcgZnJvbSBhCiAgcGlwZS4KCiAgVGhpcyBlbmRlZCB1cCB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgcmV0dXJuIGNvZGUgZm9yIHRoZQogIENVUkxPUFRfU0VFS0ZVTkNUSU9OIGNhbGxiYWNrIHRoYXQgYmFzaWNhbGx5IHNheXMgdGhhdCB0aGUgc2VlayBmYWlsZWQgYnV0CiAgdGhhdCBsaWJjdXJsIG1heSB0cnkgdG8gcmVzb2x2ZSB0aGUgc2l0dWF0aW9uIGFueXdheS4gSW4gb3VyIGNhc2UgdGhpcyBtZWFucwogIGxpYmN1cmwgd2lsbCBhdHRlbXB0IHRvIGluc3RlYWQgcmVhZCB0aGF0IG11Y2ggZGF0YSBmcm9tIHRoZSBzdHJlYW0gaW5zdGVhZAogIG9mIHNlZWtpbmcgYW5kIHRoYXQgd2F5IGN1cmwgY2FuIG5vdyB1cGxvYWQgd2l0aCByZXN1bWUgd2hlbiBkYXRhIGlzIHJlYWQKICBmcm9tIGEgc3RyZWFtIQoKRGFuaWVsIFN0ZW5iZXJnICgyNiBBcHIgMjAwOSkKLSBCdWcgcmVwb3J0ICMyNzc5NzMzIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzc5NzMzKSBieSBTdmVuCiAgV2VnZW5lciBwb2ludGVkIG91dCB0aGF0IENVUkxJTkZPX0FQUENPTk5FQ1RfVElNRSBkaWRuJ3Qgd29yayB3aXRoIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBwcm9ibGVtIQoKRGFuaWVsIFN0ZW5iZXJnICgyNCBBcHIgMjAwOSkKLSBLYW1pbCBEdWRrYSBmaXhlZCBhbm90aGVyIE5TUy1yZWxhdGVkIGxlYWsgd2hlbiBjbGllbnQgY2VydHMgd2VyZSB1c2VkLgoKLSBCdWcgcmVwb3J0ICMyNzc5MjQ1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzc5MjQ1KSBieSBSYWluZXIKICBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgbWFuIHBhZ2UgZGlkbid0IHRlbGwgdGhhdCB0aGUgKl9wcm94eQogIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgc3BlY2lmaWVkIGxvd2VyIGNhc2Ugb3IgVVBQRVIgQ0FTRSBhbmQgdGhlCiAgbG93ZXIgY2FzZSB0YWtlcyBwcmVjZWRlbmNlLAoKRGFuaWVsIEZhbmRyaWNoICgyMSBBcHIgMjAwOSkKLSBBZGRlZCBuZXcgbGliY3VybCBzb3VyY2UgZmlsZXMgdG8gQW1pZ2EsIFJpc2NPUyBhbmQgVkM2IGJ1aWxkIGZpbGVzLgoKWWFuZyBUc2UgKDIxIEFwciAyMDA5KQotIE1vdmVkIHBvdGVudGlhbCBpbmNsdXNpb24gb2Ygc3lzdGVtJ3MgbWFsbG9jLmggYW5kIG1lbW9yeS5oIGhlYWRlciBmaWxlcyB0bwogIHNldHVwX29uY2UuaC4gIEluY2x1c2lvbiBvZiBlYWNoIGhlYWRlciBmaWxlIGlzIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mCiAgTkVFRF9NQUxMT0NfSCBhbmQgTkVFRF9NRU1PUllfSCByZXNwZWN0aXZlbHkuCgogIFJlbmFtZWQgbGliY3VybCdzIG1lbW9yeS5oIHRvIGN1cmxfbWVtb3J5LmgKCkRhbmllbCBTdGVuYmVyZyAoMjAgQXByIDIwMDkpCi0gTGVhbmljIExlZmV2ZXIgcmVwb3J0ZWQgYSBjcmFzaCBhbmQgZGlkIHNvbWUgZGV0YWlsZWQgcmVzZWFyY2ggb24gd2h5IGFuZAogIGhvdyBpdCBvY2N1cnMgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOS0wNC8wMjg5Lmh0bWwpLiBUaGUKICBjb25jbHVzaW9uIHdhcyB0aGF0IGlmIGFuIGVycm9yIGlzIGRldGVjdGVkIGFuZCBDdXJsX2RvbmUoKSBpcyBjYWxsZWQgZm9yCiAgdGhlIGNvbm5lY3Rpb24sIGZ0cF9kb25lKCkgY291bGQgYXQgdGltZXMgcmV0dXJuIGFub3RoZXIgZXJyb3IgY29kZSB0aGF0CiAgdGhlbiB3b3VsZCB0YWtlIHByZWNlZGVuY2UgYW5kIHRoYXQgbmV3IGNvZGUgY29uZnVzZWQgZXhpc3RpbmcgbG9naWMgdGhhdAogIHdvcmtzIGZvciB0aGUgZmlyc3QgZXJyb3IgY29kZSAoQ1VSTEVfU0VORF9FUlJPUikgb25seS4KCi0gR2lzbGUgVmFuZW0gbm90aWNlZCB0aGF0IC0tbGlidG9vbCB3b3VsZCBwcm9kdWNlIGJvZ3VzIHN0cmluZ3MgYXQgdGltZXMgZm9yCiAgT0JKRUNUUE9JTlQgb3B0aW9ucy4gTm93IHdlJ3ZlIGludHJvZHVjZWQgYSBuZXcgZnVuY3Rpb24gLSBteV9zZXRvcHRfc3RyIC0KICB3aXRoaW4gdGhlIGFwcCBmb3Igc2V0dGluZyBwbGFpbiBzdHJpbmcgb3B0aW9ucyB0byBhdm9pZCB0aGUgcmlzayBvZiB0aGlzCiAgbWlzdGFrZSBoYXBwZW5pbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IEFwciAyMDA5KQotIFByYW1vZCBTaGFybWEgcmVwb3J0ZWQgYW5kIHRyYWNrZWQgZG93biBhIGJ1ZyB3aGVuIGRvaW5nIEZUUCBvdmVyIGEgSFRUUAogIHByb3h5LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoCiAgcmVxdWVzdC4gSW4gaGlzIGNhc2UgaXQgaGFkIHRoZSB3ZWlyZCBzaWRlLWVmZmVjdCB0aGF0IGl0IGtpbGxlZCBOVExNIGF1dGgKICBmb3IgdGhlIHByb3h5IGNhdXNpbmcgYW4gaW5pZmluaXRlIGxvb3AhCgogIEkgYWRkZWQgdGVzdCBjYXNlIDEwOTggdG8gdmVyaWZ5IHRoaXMgZml4LiBUaGUgdGVzdCBjYXNlIGRvZXMgaG93ZXZlciBub3QKICBwcm9wZXJseSB2ZXJpZnkgdGhhdCB0aGUgdHJhbnNmZXJzIGFyZSBkb25lIHBlcnNpc3RlbnRseSAtIGFzIEkgY291bGRuJ3QKICB0aGluayBvZiBhIGNsZXZlciB3YXkgdG8gYWNoaWV2ZSBpdCByaWdodCBub3cgLSBidXQgeW91IG5lZWQgdG8gcmVhZCB0aGUKICBzdGRlcnIgb3V0cHV0IGFmdGVyIGEgdGVzdCBydW4gdG8gc2VlIHRoYXQgaXQgdHJ1bHkgZGlkIHRoZSByaWdodCB0aGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMTMgQXByIDIwMDkpCi0gYnVnIHJlcG9ydCAjMjcyNzk4MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjcyNzk4MSkgYnkgTWFydGluCiAgU3RvcnNq9iBwb2ludGVkIG91dCBob3cgc2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byAwIGNvdWxkIGJlIGRvd25yaWdodAogIGNvbmZ1c2luZyBhcyBpdCBzZXQgdGhlIG1ldGhvZCB0byBlaXRoZXIgR0VUIG9yIEhFQUQuIFRoZSBleGFtcGxlIGhlIHNob3dlZAogIGxvb2tlZCBsaWtlOgoKICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX1BVVCwgMSk7CiAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9OT0JPRFksIDApOwoKICBUaGUgbmV3IHdheSBkb2Vzbid0IGFsdGVyIHRoZSBtZXRob2QgdW50aWwgdGhlIHJlcXVlc3QgaXMgYWJvdXQgdG8gc3RhcnQuIElmCiAgQ1VSTE9QVF9OT0JPRFkgaXMgdGhlbiAxIHRoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBIRUFELiBJZiBDVVJMT1BUX05PQk9EWSBpcwogIDAgYW5kIHRoZSByZXF1ZXN0IGhhcHBlbnMgdG8gaGF2ZSBiZWVuIHNldCB0byBIRUFELCBpdCB3aWxsIHRoZW4gaW5zdGVhZCBiZQogIHNldCB0byBHRVQuIEkgYmVsaWV2ZSB0aGlzIHdpbGwgYmUgbGVzcyBzdXJwcmlzaW5nIHRvIHVzZXJzLCBhbmQgaG9wZWZ1bGx5CiAgbm90IGhpdCBhbnkgZXhpc3RpbmcgdXNlcnMgYmFkbHkuCgotIFRvc2hpbyBLdXJhdG9taSByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIHByb2JsZW0gd2l0aCBsaWJjdXJsK05TUyB0aGF0IHR1cm5lZAogIG91dCB0byBiZSBsZWFraW5nIGNhY2VydHMuIEthbWlsIER1ZGthIGhlbHBlZCBtZSBjb21wbGV0ZSB0aGUgZml4LiBUaGUgaXNzdWUKICBpcyBmb3VuZCBpbiBSZWRoYXQncyBidWcgdHJhY2tlcjoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ1MzYxMgoKICBUaGVyZSBhcmUgc3RpbGwgbWVtb3J5IGxlYWtzIHByZXNlbnQsIGJ1dCB0aGV5IHNlZW0gdG8gaGF2ZSBvdGhlciByZWFzb25zLgoKRGFuaWVsIEZhbmRyaWNoICgxMSBBcHIgMjAwOSkKLSBBZGRlZCBuZXcgbGliY3VybCBzb3VyY2UgZmlsZXMgdG8gU3ltYmlhbiBPUyBidWlsZCBmaWxlcy4KLSBJbXByb3ZlZCBTeW1iaWFuIHN1cHBvcnQgZm9yIFNTTC4KCllhbmcgVHNlICgxMCBBcHIgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBpbXByb3ZlZCB0aGUgTWFjT1NYLUZyYW1ld29yayBzaGVsbCBzY3JpcHQgdG8gbm93IHBlcmZvcm0gYWxsCiAgdGhlIHN0ZXBzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgTWFjIE9TIFggZm91ciB3YXkgZmF0IHBwYy9pMzg2L3BwYzY0L3g4Nl82NAogIGxpYmN1cmwuZnJhbWV3b3JrLiAgRm91ciB3YXkgZmF0IGZyYW1ld29yayByZXF1aXJlcyBPUyBYIDEwLjUgU0RLIG9yIGxhdGVyLgoKWWFuZyBUc2UgKDggQXByIDIwMDkpCi0gUmVtb3ZlZCBTdW4gY29tcGlsZXJzIHByZXByb2Nlc3NvciBibG9jayBmcm9tIGN1cmxidWlsZC5oLmRpc3QsIHRoaXMgYWxzbwogIHJlbW92ZXMgaXQgZnJvbSB0aGUgY3VybGJ1aWxkLmggZmlsZSBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IHRoZSBjVVJMCiAgcHJvamVjdCBhcyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgZm9yIHN5c3RlbXMgbm90IGNhcGFibGUgb2YgcnVubmluZyB0aGUKICBjb25maWd1cmUgc2NyaXB0LiAgRm9yIHRob3NlIHdobyBoYXZlIGJlZW4gYnVpbGRpbmcgY3VybCBvdXQgb2YgdGhlIHNvdXJjZQogIGNvZGUgY3VybCBkaXN0cmlidXRpb24gdGFyYmFsbCBwcm92aWRlZCBieSBjdXJsLmhheHguc2UgdGhlIGNoYW5nZSBpbXBsaWVzCiAgbm90aGluZy4gIFByZXZpb3VzIGNoYW5nZSBpbiB0aGlzIGFyZWEgY29tbWl0dGVkIDIgQXByIGJlY29tZXMgaXJyZWxldmFudC4KCkRhbmllbCBTdGVuYmVyZyAoNiBBcHIgMjAwOSkKLSBJIGNsYXJpZmllZCBpbiB0aGUgZG9jcyB0aGF0IENVUkxPUFRfU0VFS0ZVTkNUSU9OIHNob3VsZCByZXR1cm4gMCBvbiBzdWNjZXNzCiAgYW5kIDEgb24gZmF0YWwgZXJyb3JzLiBQcmV2aW91c2x5IGl0IG9ubHkgbWVudGlvbmVkIG5vbi16ZXJvIG9uIGZhdGFsCiAgZXJyb3JzLiBUaGlzIGlzIGEgc2xpZ2h0IGNoYW5nZSBpbiBtZWFuaW5nLCBidXQgaXQgZm9sbG93cyB3aGF0IHdlJ3ZlIGRvbmUKICBlbHNld2hlcmUgYmVmb3JlIGFuZCBpdCBvcGVucyB1cCBmb3IgTE9UUyBvZiBtb3JlIHVzZWZ1bCByZXR1cm4gY29kZXMKICB3aGVuZXZlciB3ZSBjYW4gdGhpbmsgb2YgdGhlbS4uLgoKWWFuZyBUc2UgKDIgQXByIDIwMDkpCi0gRml4IGN1cmxfb2ZmX3QgZGVmaW5pdGlvbiBmb3IgYnVpbGRzIGRvbmUgdXNpbmcgU3VuIGNvbXBpbGVycyBhbmQgYQogIG5vbi1jb25maWd1cmVkIGxpYmN1cmwuIEluIHRoaXMgY2FzZSBjdXJsX29mZl90IGRhdGEgdHlwZSB3YXMgZ2F0ZWQKICB0byB0aGUgb2ZmX3QgZGF0YSB0eXBlIHdoaWNoIGRlcGVuZHMgb24gdGhlIF9GSUxFX09GRlNFVF9CSVRTLiBUaGlzCiAgY29uZmlndXJhdGlvbiBpcyBleGFjdGx5IHRoZSB1bndhbnRlZCBjb25maWd1cmF0aW9uIGZvciBvdXIgY3VybF9vZmZfdAogIGRhdGEgdHlwZSB3aGljaCBtdXN0IG5vdCBkZXBlbmQgb24gc3VjaCBzZXR0aW5nLiBUaGlzIGJyZWFrcyBBQkkgZm9yCiAgbGliY3VybCBsaWJyYXJpZXMgYnVpbHQgd2l0aCBTdW4gY29tcGlsZXJzIHdoaWNoIHdlcmUgYnVpbHQgd2l0aG91dAogIGhhdmluZyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCBfRklMRV9PRkZTRVRfQklUUyBkaWZmZXJlbnQgdGhhbgogIDY0IGFuZCB1c2luZyB0aGUgSUxQMzIgZGF0YSBtb2RlbC4KCkRhbmllbCBTdGVuYmVyZyAoMSBBcHIgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgTlVMTCBwb2ludGVyIHVzZSBpbiBhbiBpbmZvZigpIGNhbGwgaWYgYQogIHN0cmR1cCgpIGNhbGwgZmFpbGVkLgoKRGFuaWVsIEZhbmRyaWNoICgzMSBNYXIgMjAwOSkKLSBQcm9wZXJseSByZXR1cm4gYW4gZXJyb3IgY29kZSBpbiBjdXJsX2Vhc3lfcmVjdiAocmVwb3J0ZWQgYnkgSmltIEZyZWVtYW4pLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBNYXIgMjAwOSkKLSBLYW1pbCBEdWRrYSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBlbmFibGVzIDYgYWRkaXRpb25hbCBjcnlwdG8gYWxnb3JpdGhtcyB3aGVuCiAgTlNTIGlzIHVzZWQuIFRoZXNlIGNpcGhlcnMgd2VyZSBhZGRlZCBpbiBOU1MgMy40IGFuZCByZXF1aXJlIHRvIGJlIGVuYWJsZWQKICBleHBsaWNpdGx5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBNYXIgMjAwOSkKLSBVc2UgbGlic3NoMl92ZXJzaW9uKCkgdG8gcHJlc2VudCB0aGUgbGlic3NoMiB2ZXJzaW9uIGluIGNhc2UgdGhlIGxpYnNzaDIKICBsaWJyYXJ5IGlzIGZvdW5kIHRvIHN1cHBvcnQgaXQuCgpZYW5nIFRzZSAoMTIgTWFyIDIwMDkpCi0gQWRkZWQgbWlzc2luZyBDdXJsX3JlYWQoKSByZXR1cm4gY29kZSBjaGVja2luZyBpbiBURUxORVQgdHJhbnNmZXJzLgoKLSBQaWVycmUgQnJpY28gZm91bmQgYW5kIGZpeGVkIFRFTE5FVCB0cmFuc2ZlcnMgbm90IGJlaW5nIGFib3J0ZWQgdXBvbgogIGEgd3JpdGUgY2FsbGJhY2sgZmFpbHVyZS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTWFyIDIwMDkpCi0gS2FtaWwgRHVka2EgbWFkZSB0aGUgY3VybCB0b29sIHByb3Blcmx5IGNhbGwgY3VybF9nbG9iYWxfaW5pdCgpIGJlZm9yZSBhbnkKICBvdGhlciBsaWJjdXJsIGZ1bmN0aW9uLgoKWWFuZyBUc2UgKDExIE1hciAyMDA5KQotIEFkZGVkIG1pc3NpbmcgVEVMTkVUIHRpbWVvdXQgc3VwcG9ydCBmb3IgV2luZG93cyBidWlsZHMuIFRoaXMgaXNzdWUgd2FzCiAgcmVwb3J0ZWQgYnkgUGllcnJlIEJyaWNvLgoKRGFuaWVsIFN0ZW5iZXJnICg5IE1hciAyMDA5KQotIEZyYW5rIEhlbXBlbCBmb3VuZCBvdXQgYSBidWcgYW5kIHByb3ZpZGVkIHRoZSBmaXg6CgogIGN1cmxfZWFzeV9kdXBoYW5kbGUgZGlkIG5vdCBuZWNlc3NhcmlseSBkdXBsaWNhdGUgdGhlIENVUkxPUFRfQ09PS0lFRklMRQogIG9wdGlvbi4gSXQgb25seSBlbmFibGVkIHRoZSBjb29raWUgZW5naW5lIGluIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGUgaWYKICBkYXRhLT5jb29raWVzIGlzIG5vdCBOVUxMICh3aGVyZSBkYXRhIGlzIHRoZSBzb3VyY2UgaGFuZGxlKS4gSW4gY2FzZSBvZiBhCiAgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIHdoaWNoIGp1c3QgaGFkIHRoZSBjb29raWUgc3VwcG9ydCBlbmFibGVkIGJ5IGEKICBjdXJsX2Vhc3lfc2V0b3B0KGhhbmRsZSwgQ1VSTF9DT09LSUVGSUxFLCAiIiktY2FsbCwgaGFuZGxlLT5jb29raWVzIHdhcwogIHN0aWxsIE5VTEwgYmVjYXVzZSB0aGUgc2V0b3B0LWNhbGwgb25seSBhcHBlbmRzIHRoZSB2YWx1ZSB0bwogIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0LCBoZW5jZSBkdXBsaWNhdGluZyB0aGlzIGhhbmRsZSB3b3VsZCBub3QgaGF2ZSB0aGUKICBjb29raWUgZW5naW5lIHN3aXRjaGVkIG9uLgoKICBXZSBhbHNvIGNvbmNsdWRlZCB0aGF0IHRoZSBzbGlzdC1mdW5jdGlvbmFsaXR5IHdvdWxkIGJlIHN1aXRhYmxlIGZvciBiZWluZwogIHB1dCBpbiBpdHMgb3duIG1vZHVsZSByYXRoZXIgdGhhbiBzaW1wbHkgaGFuZ2luZyBvdXQgaW4gbGliL3NlbmRmLmMgc28gSQogIGNyZWF0ZWQgbGliL3NsaXN0LltjaF0gZm9yIHRoZW0uCgotIEFuZHJlYXMgRmFyYmVyIG1hZGUgdGhlICdidWlsZGNvbmYnIHNjcmlwdCBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIG00CiAgc2NyaXB0cyB0byBtYWtlIGl0IGRldGVjdCBhIGJhZCBjaGVja291dCBlYXJsaWVyLiBQZW9wbGUgd2l0aCBvbGRlcgogIGNoZWNrb3V0cyB3aG8gZG9uJ3QgZG8gY3ZzIHVwZGF0ZSB3aXRoIHRoZSAtZCBvcHRpb24gd29uJ3QgZ2V0IHRoZSBuZXcgZGlycwogIGFuZCB0aGVuIHdpbGwgZ2V0IGZ1bm55IG91dHB1dHMgdGhhdCBjYW4gYmUgYSBiaXQgaGFyZCB0byB1bmRlcnN0YW5kIGFuZAogIGZpeC4KCkRhbmllbCBTdGVuYmVyZyAoOCBNYXIgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIGNvZGUgc2VnbWVudCBpbiBzc2x1c2UuYyB3aGVyZSB0aGUKICBhbGxvY2F0aW9uIG9mIHRoZSBtZW1vcnkgQklPIHdhcyBub3QgYmVpbmcgcHJvcGVybHkgY2hlY2tlZC4KCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCB0aGUgZ251dGxzLXVzaW5nIGNvZGU6IFRoZXJlIGFyZSBhIGZldyBwbGFjZXMKICBpbiB0aGUgZ251dGxzIGNvZGUgd2hlcmUgd2Ugd2VyZSBjaGVja2luZyBmb3IgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvcnMsCiAgd2hlbiB0aGUgbWFuIHBhZ2VzIHN0YXRlIHRoYXQgR05VVExTX0VfU1VDQ0VTUyBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIGFuZAogIG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBlcnJvciBjb25kaXRpb25zLgoKLSBCaWxsIEVnZXJ0IHBvaW50ZWQgb3V0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNjcxNjAyKSB0aGF0CiAgY3VybCBkaWRuJ3QgdXNlIHNwcmludGYoKSBpbiBhIHdheSB0aGF0IGlzIGRvY3VtZW50ZWQgdG8gd29yayBpbiBQT1NJWCBidXQKICBzaW5jZSB3ZSB1c2Ugb3VyIG93biBwcmludGYoKSBjb2RlIChmcm9tIGxpYmN1cmwpIHRoYXQgc2hvdWxkbid0IGJlIGEKICBwcm9ibGVtLiBOb25ldGhlbGVzcyBJIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdCByZWx5IG9uIHN1Y2ggcGFydGljdWxhcgogIGZlYXR1cmVzIGFuZCB0byBub3QgY2F1c2UgZnVydGhlciByYWlzZWQgZXllYnJvd3NlIHdpdGggbm8gZ29vZCByZWFzb24uCgpEYW5pZWwgRmFuZHJpY2ggKDUgTWFyIDIwMDkpCi0gRXhwYW5kZWQgdGhlIHNlY3VyaXR5IHNlY3Rpb24gb2YgdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2UgdG8gY292ZXIKICBtb3JlIGlzc3VlcyBmb3IgYXV0aG9ycyB0byBjb25zaWRlciB3aGVuIHdyaXRpbmcgcm9idXN0IGxpYmN1cmwtdXNpbmcKICBhcHBsaWNhdGlvbnMuCgpZYW5nIFRzZSAoNSBNYXIgMjAwOSkKLSBGaXhlZCBOVExNIGF1dGhlbnRpY2F0aW9uIG1lbW9yeSBsZWFrIG9uIFNTUEkgZW5hYmxlZCBXaW5kb3dzIGJ1aWxkcy4gVGhpcwogIGlzc3VlIHdhcyBub3RpY2VkIGJ5IENocmlzIERlaWR1bi4KCkRhbmllbCBGYW5kcmljaCAoNCBNYXIgMjAwOSkKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBtNCBxdW90aW5nIGluIHRoZSBPcGVuU1NMIGNvbmZpZ3VyZSBjaGVjayByZXBvcnRlZAogIGJ5IERhbmllbCBKb2huc29uLgoKRGFuaWVsIFN0ZW5iZXJnICgzIE1hciAyMDA5KQotIERhdmlkIEphbWVzIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgbGliY3VybCBjbG9zZSAoYWxsKSBkZWFkIGNvbm5lY3Rpb25zCiAgd2hlbmV2ZXIgeW91IGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uLgoKICAxLiBBZnRlciBjbGVhbmluZyB1cCBhIGRlYWQgY29ubmVjdGlvbiwgImNvbnRpbnVlIiBpbnN0ZWFkIG9mCiAgICAgcmV0dXJuaW5nIEZBTFNFLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBjbGVhbiB1cCBhbGwgZGVhZCBjb25uZWN0aW9ucywKICAgICByYXRoZXIgdGhhbiBqdXN0IGNsZWFuaW5nIHVwIHRoZSBmaXJzdCBkZWFkIGNvbm5lY3Rpb24uCiAgMi4gTW92ZSB1cCB0aGUgY2xlYW51cCBmb3IgZGVhZCBjb25uZWN0aW9ucyBzbyB0aGF0IGl0IG9jY3VycyBmb3IKICAgICBhbGwgY29ubmVjdGlvbnMsIHJhdGhlciB0aGFuIGp1c3QgdGhlIGNvbm5lY3Rpb25zIHdoaWNoIGhhdmUgdGhlIHNhbWUKICAgICBwcmVmZXJlbmNlcyBhcyBvdXIgY3VycmVudCBuZXcgY29ubmVjdGlvbi4KClZlcnNpb24gNy4xOS40ICgzIE1hcmNoIDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgS2llcnpub3dza2kgbm90aWZpZWQgdXMgYWJvdXQgYSBzZWN1cml0eSBmbGF3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwOTAzMDMuaHRtbCBhbHNvIGtub3duIGFzIENWRS0yMDA5LTAwMzcpIGluCiAgd2hpY2ggcHJldmlvdXMgbGliY3VybCB2ZXJzaW9ucyAoYnkgZGVzaWduKSBjYW4gYmUgdHJpY2tlZCB0byBhY2Nlc3MgYW4KICBhcmJpdHJhcnkgbG9jYWwvZGlmZmVyZW50IGZpbGUgaW5zdGVhZCBvZiBhIHJlbW90ZSBvbmUgd2hlbgogIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZC4gVGhpcyBmbGF3IGlzIG5vdyBmaXhlZCBpbiB0aGlzIHJlbGVhc2UKICB0b2dldGhlciB0aGlzIHRoZSBhZGRpdGlvbiBvZiB0d28gbmV3IHNldG9wdCBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGlzCiAgbmV3IGJlaGF2aW9yOgoKICBvIENVUkxPUFRfUkVESVJfUFJPVE9DT0xTIGNvbnRyb2xzIHdoYXQgcHJvdG9jb2xzIGxpYmN1cmwgaXMgYWxsb3dlZCB0bwogIGZvbGxvdyB0byB3aGVuIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZC4gQnkgZGVmYXVsdCwgdGhpcyBvcHRpb24KICBleGNsdWRlcyB0aGUgRklMRSBhbmQgU0NQIHByb3RvY29scyBhbmQgdGh1cyB5b3UgbmVlIHRvIGV4cGxpY2l0bHkgYWxsb3cKICB0aGVtIGluIHlvdXIgYXBwIGlmIHlvdSByZWFsbHkgd2FudCB0aGF0IGJlaGF2aW9yLgoKICBvIENVUkxPUFRfUFJPVE9DT0xTIGNvbnRyb2xzIHdoYXQgcHJvdG9jb2wocykgbGliY3VybCBpcyBhbGxvd2VkIHRvIGZldGNoCiAgdXNpbmcgdGhlIHByaW1hcnkgVVJMIG9wdGlvbi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWxsb3cgYSB1c2VyIG9yCiAgb3RoZXIgb3V0c2lkZXJzIGNvbnRyb2wgd2hhdCBVUkwgdG8gcGFzcyB0byBsaWJjdXJsIGFuZCB5ZXQgbm90IGFsbG93IGFsbAogIHByb3RvY29scyBsaWJjdXJsIG1heSBoYXZlIGJlZW4gYnVpbHQgdG8gc3VwcG9ydC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgRmViIDIwMDkpCi0gU2VudGhpbCBSYWphIFZlbHUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdoZW4gQ1VSTE9QVF9JTlRFUkZBQ0UgYW5kCiAgQ1VSTE9QVF9MT0NBTFBPUlQgd2VyZSB1c2VkIHRvZ2V0aGVyICh0aGUgbG9jYWwgcG9ydCBiaW5kIGZhaWxlZCksIGFuZAogIE1hcmt1cyBLb2V0dGVyIHByb3ZpZGVkIHRoZSBmaXghCgpEYW5pZWwgU3RlbmJlcmcgKDI1IEZlYiAyMDA5KQotIEFzIERhbmllbCBGYW5kcmljaCBmaWd1cmVkIG91dCwgd2UgbXVzdCBkbyB0aGUgR251VExTIGluaXRpbmcgaW4gdGhlCiAgY3VybF9nbG9iYWxfaW5pdCgpIGZ1bmN0aW9uIHRvIHByb3Blcmx5IG1haW50YWluIHRoZSBwZXJmb3JtaW5nIGZ1bmN0aW9ucwogIHRocmVhZC1zYWZlLiBXZSd2ZSBwcmV2aW91c2x5ICgyOCBBcHJpbCAyMDA3KSBtb3ZlZCB0aGUgaW5pdCB0byBhIGxhdGVyIHRpbWUKICBqdXN0IHRvIGF2b2lkIGl0IHRvIGZhaWwgdmVyeSBlYXJseSB3aGVuIGxpYmdjcnlwdCBkaXNsaWtlcyB0aGUgc2l0dWF0aW9uLAogIGJ1dCB0aGF0IG1vdmUgd2FzIGJhZCBhbmQgdGhlIGZpeCBzaG91bGQgcmF0aGVyIGJlIGluIGxpYmdjcnlwdCBvcgogIGVsc2V3aGVyZS4KCkRhbmllbCBTdGVuYmVyZyAoMjQgRmViIDIwMDkpCi0gQnJpYW4gSi4gTXVycmVsbCBmb3VuZCBvdXQgdGhhdCBOZWdvdGlhdGUgcHJveHkgYXV0aGVudGljYXRpb24gZGlkbid0IHdvcmsuCiAgSXQgaGFwcGVuZWQgYmVjYXVzZSB0aGUgY29kZSB1c2VkIHRoZSBzdHJ1Y3QgZm9yIHNlcnZlci1iYXNlZCBhdXRoIGFsbCB0aGUKICB0aW1lIGZvciBib3RoIHByb3h5IGFuZCBzZXJ2ZXIgYXV0aCB3aGljaCBvZiBjb3Vyc2Ugd2FzIHdyb25nLgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBGZWIgMjAwOSkKLSBBZnRlciBhIGJ1ZyByZXBvcnRlZCBieSBKYW1lcyBDaGVuZyBJJ3ZlIG1hZGUgY3VybF9lYXN5X2dldGluZm8oKSBmb3IKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhbmQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FEIHJldHVybgogIC0xIGlmIHRoZSBzaXplcyBhcmVuJ3Qga25vdy4gUHJldmlvdXNseSB0aGVzZSByZXR1cm5lZCAwLCBtYWtlIGl0IGltcG9zc2libGUKICB0byBkZXRlY3QgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWxseSB6ZXJvIGFuZCB1bmtub3duLgoKWWFuZyBUc2UgKDIzIEZlYiAyMDA5KQotIERhbmllbCBKb2huc29uIHByb3ZpZGVkIGEgc2hlbGwgc2NyaXB0IHRoYXQgd2lsbCBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgbmVlZGVkCiAgdG8gYnVpbGQgYSBNYWMgT1MgWCBmYXQgcHBjL2kzODYgb3IgcHBjNjQveDg2XzY0IGxpYmN1cmwuZnJhbWV3b3JrCgpEYW5pZWwgU3RlbmJlcmcgKDIzIEZlYiAyMDA5KQotIEkgcmVuYW1lZCBldmVyeXRoaW5nIGluIHRoZSB3aW5kb3dzIGJ1aWxkcyBmaWxlcyB0aGF0IHVzZWQgdGhlIG5hbWUgJ2N1cmxsaWInCiAgdG8gdGhlIHByb3BlciAnbGliY3VybCcgYXMgY2xlYXJseSB0aGlzIGNhdXNlZCBjb25mdXNpb24uCgpZYW5nIFRzZSAoMjAgRmViIDIwMDkpCi0gRG8gbm90IGhhbHQgY29tcGlsYXRpb24gd2hlbiB1c2luZyBWUzIwMDggdG8gYnVpbGQgYSBXaW5kb3dzIDIwMDAgdGFyZ2V0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBGZWIgMjAwOSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlcG9ydGVkIGFuZCBoZWxwZWQgbWUgcmVwZWF0IGFuZCBmaXggYSBwcm9ibGVtIHdpdGgKICBGVFAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlOiB3aGVuIGEgdHJhbnNmZXIgZmFpbHMsIGxpa2Ugd2hlbiBhYm9ydGVkIGJ5IGEKICB3cml0ZSBjYWxsYmFjaywgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB3YXMgd3JvbmdseSBjbG9zZWQgYW5kIHRodXMgbm90CiAgcmUtdXNlZCBwcm9wZXJseS4KCiAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBhbiBhdHRlbXB0IHRvIGNsZWFudXAgdGhlIGNvZGUgc29tZXdoYXQgaW4gdGhpcyBhcmVhLCBhcwogIG5vdyB0aGUgRlRQIGNvZGUgYXR0ZW1wdHMgdG8ga2VlcCAoYmV0dGVyKSB0cmFjayBvbiBwZW5kaW5nIHJlc3BvbnNlcwogIG5lY2Vzc2FyeSB0byBnZXQgcmVhZCBpbiBmdHBfZG9uZSgpLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBGZWIgMjAwOSkKLSBQYXRyaWsgVGh1bnN0cm9tIHJlcG9ydGVkIGEgcHJvYmxlbSBhbmQgaGVscGVkIG1lIHJlcGVhdCBpdC4gSXQgdHVybmVkIG91dAogIGxpYmN1cmwgZGlkIGEgc3VwZXJmbHVvdXMgMTAwMG1zIHdhaXQgd2hlbiBkb2luZyBTRlRQIGRvd25sb2FkcyEKCiAgV2UgcmVhZCBkYXRhIHdpdGggbGlic3NoMiB3aGlsZSBkb2luZyB0aGUgIkRPIiBvcGVyYXRpb24gZm9yIFNGVFAgYW5kIHRoZW4KICB3aGVuIHdlIHdlcmUgYWJvdXQgdG8gc3RhcnQgZ2V0dGluZyBkYXRhIGZvciB0aGUgYWN0dWFsIGZpbGUgcGFydCwgdGhlCiAgIlRSQU5TRkVSIiBwYXJ0LCB3ZSB3YWl0ZWQgZm9yIHNvY2tldCBhY3Rpb24gKGluIDEwMDBtcykgYmVmb3JlIGRvaW5nIGEKICBsaWJzc2gyLXJlYWQuIEJ1dCBpbiB0aGlzIGNhc2UgbGlic3NoMiBoYWQgYWxyZWFkeSByZWFkIGFuZCBidWZmZXJlZCB0aGUKICBkYXRhIHNvIHdlIGVuZGVkIHVwIGFsd2F5cyBqdXN0IHdhaXRpbmcgMTAwMG1zIGJlZm9yZSB3ZSBnZXQgd29ya2luZyBvbiB0aGUKICBkYXRhIQoKUGF0cmljayBNb25uZXJhdCAoMTggRmViIDIwMDkpCi0gRlRQIGRvd25sb2FkcyAoaS5lLjogUkVUUikgZW5kaW5nIHdpdGggY29kZSA1NTAgbm93IHJldHVybiBlcnJvcgogIENVUkxFX1JFTU9URV9GSUxFX05PVF9GT1VORCBpbnN0ZWFkIG9mIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRS4KCkRhbmllbCBTdGVuYmVyZyAoMTcgRmViIDIwMDkpCi0gS2FtaWwgRHVka2EgbWFkZSBOU1MtcG93ZXJlZCBidWlsZHMgY29tcGlsZSBhbmQgcnVuIGFnYWluIQoKLSBBIHNlY29uZCBmb2xsb3ctdXAgY2hhbmdlIGJ5IEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgdG8gZml4IGEgcmVsYXRlZCBtZW1vcnkKICBsZWFrIGxpa2UgdGhhdCBmaXhlZCBvbiB0aGUgMTR0aC4gV2hlbiB6bGliIHJldHVybnMgZmFpbHVyZSwgd2UgbmVlZCB0bwogIGNsZWFudXAgcHJvcGVybHkgYmVmb3JlIHJldHVybmluZyBlcnJvci4KCi0gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyBjYW4gbm93IGJlIHNldCB0byAyIGluIGFkZGl0aW9uIHRvIDEgZm9yCiAgcGxhaW4gRlRQIGNvbm5lY3Rpb25zLCBhbmQgaXQgd2lsbCB0aGVuIGFsbG93IE1LRCB0byBmYWlsIG9uY2UgYW5kIHJldHJ5IHRoZQogIENXRCBhZnRlcndhcmRzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSdyZSBkb2luZyBtYW55IHNpbXVsdGFub2VzCiAgY29ubmVjdGlvbnMgYWdhaW5zdCB0aGUgc2FtZSBzZXJ2ZXIgYW5kIHRoZXkgYWxsIGhhdmUgdGhpcyBvcHRpb24gZW5hYmxlZCwKICBhcyB0aGVuIENXRCBtYXkgZmlyc3QgZmFpbCBidXQgdGhlbiBhbm90aGVyIGNvbm5lY3Rpb24gZG9lcyBNS0QgYmVmb3JlIHRoaXMKICBjb25uZWN0aW9uIGFuZCB0aHVzIE1LRCBmYWlscyBidXQgdHJ5aW5nIENXRCB3b3JrcyEgVGhlIG51bWJlcnMgY2FuCiAgKHNob3VsZD8pIG5vdyBiZSBzZXQgd2l0aCB0aGUgY29udmVuaWVuY2UgZW51bXMgbm93IGNhbGxlZAogIENVUkxGVFBfQ1JFQVRFX0RJUiBhbmQgQ1VSTEZUUF9DUkVBVEVfRElSX1JFVFJZLgoKICBUZXN0cyBoYXMgcHJvdmVuIHRoYXQgaWYgeW91J3JlIG1ha2luZyBhbiBhcHBsaWNhdGlvbiB0aGF0IHVwbG9hZHMgYSBzZXQgb2YKICBmaWxlcyB0byBhbiBmdHAgc2VydmVyLCB5b3Ugd2lsbCBnZXQgYSBub3RpY2FibGUgZ2FpbiBpbiBzcGVlZCBpZiB5b3UncmUKICB1c2luZyBtdWx0aXBsZSBjb25uZWN0aW9ucyBhbmQgdGhpcyBvcHRpb24gd2lsbCBiZSB0aGVuIGJlIHZlcnkgdXNlZnVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBGZWIgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb250ZW50IGVuY29kaW5nCiAgY29kZSwgd2hpY2ggY291bGQgaGFwcGVuIG9uIGxpYnogZXJyb3JzLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBGZWIgMjAwOSkKLSBBZGRlZCBzdXBwb3J0IGZvciBEaWdlc3QgYW5kIE5UTE0gYXV0aGVudGljYXRpb24gdXNpbmcgR251VExTLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBGZWIgMjAwOSkKLSBDVVJMSU5GT19DT05ESVRJT05fVU5NRVQgd2FzIGFkZGVkIHRvIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGdldCB0byBrbm93IGlmCiAgdGhlIGNvbmRpdGlvbiBpbiB0aGUgcHJldmlvdXMgcmVxdWVzdCB3YXMgdW5tZXQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgdGltZQogIGNvbmRpdGlvbiBzZXQgd2l0aCBDVVJMT1BUX1RJTUVDT05ESVRJT04gYW5kIHdhcyBwcmV2aW91c2x5IG5vdCBwb3NzaWJsZSB0bwogIHJlbGlhYmx5IGZpZ3VyZSBvdXQuIEZyb20gYnVnIHJlcG9ydCAjMjU2NTEyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNTY1MTI4KSBmaWxlZCBieSBKb2NlbHluIEphdWJlcnQuCgpEYW5pZWwgRmFuZHJpY2ggKDQgRmViIDIwMDkpCi0gRG9uJ3QgYWRkIHRoZSBzdGFuZGFyZCAvdXNyL2xpYiBvciAvdXNyL2luY2x1ZGUgcGF0aHMgdG8gTERGTEFHUyBhbmQgQ1BQRkxBR1MKICAocmVzcGVjdGl2ZWx5KSB3aGVuIC0td2l0aC1zc2w9L3VzciBpcyB1c2VkIChwYXRjaCBiYXNlZCBvbiBGcmVlQlNEKS4KCi0gQWRkZWQgYW4gZXhwbGljaXQgYnVmZmVyIGxpbWl0IGNoZWNrIGluIG1zZG9zaWZ5KCkgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgogIFRoaXMgY291bGRuJ3QgZXZlciBvdmVyZmxvdyBpbiBjdXJsLCBidXQgbWlnaHQgaWYgdGhlIGNvZGUgd2VyZSB1c2VkCiAgZWxzZXdoZXJlIG9yIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICgzIEZlYiAyMDA5KQotIEhpZGVtb3RvIE5ha2FkYSBwcm92aWRlZCBhIHNtYWxsIGZpeCB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGdldCB0aGUKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBzaXplIGZyb20gZmlsZTovLyAidHJhbnNmZXJzIiB3aXRoCiAgQ1VSTE9QVF9OT0JPRFkgc2V0IHRydWUuCgpEYW5pZWwgU3RlbmJlcmcgKDIgRmViIDIwMDkpCi0gUGF0cmljayBTY290dCBmb3VuZCBhIHJhdGhlciBsYXJnZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgc2V0dGluZyBDVVJMTU9QVF9NQVhDT05ORUNUUyB0byBzb21ldGhpbmcgbGVzcyB0aGFuIHRoZSBudW1iZXIKICBvZiBoYW5kbGVzIHlvdSBhZGQgdG8gdGhlIG11bHRpIGhhbmRsZS4gQWxsIHRoZSBjb25uZWN0aW9ucyB0aGF0IGRpZG4ndCBmaXQKICBpbiB0aGUgY2FjaGUgd291bGQgbm90IGJlIHByb3Blcmx5IGRpc2Nvbm5lY3RlZCBub3IgZnJlZWQhCgotIENyYWlnIEEgV2VzdCBicm91Z2h0IHVzOiBsaWJjdXJsIG5vdyBkZWZhdWx0cyB0byBkbyBDT05ORUNUIHdpdGggSFRUUAogIHZlcnNpb24gMS4xIGluc3RlYWQgb2YgMS4wIGxpa2UgYmVmb3JlLiBUaGlzIGNoYW5nZSBhbHNvIGludHJvZHVjZXMgdGhlIG5ldwogIHByb3h5IHR5cGUgZm9yIGxpYmN1cmwgY2FsbGVkICdDVVJMUFJPWFlfSFRUUF8xXzAnIHRoYXQgdGhlbiBhbGxvd3MgYXBwcyB0bwogIHN3aXRjaCAoYmFjaykgdG8gQ09OTkVDVCAxLjAgcmVxdWVzdHMuIFRoZSBjdXJsIHRvb2wgYWxzbyBnb3QgYSAtLXByb3h5MS4wCiAgb3B0aW9uIHRoYXQgd29ya3MgZXhhY3RseSBsaWtlIC0tcHJveHkgYnV0IHNldHMgQ1VSTFBST1hZX0hUVFBfMV8wLgoKICBJIHVwZGF0ZWQgYWxsIHRlc3QgY2FzZXMgY2FzZXMgdGhhdCB1c2UgQ09OTkVDVCBhbmQgSSB0cmllZCB0byBkbyBzb21lIHVzaW5nCiAgLS1wcm94eTEuMCBhbmQgc29tZSB1cGRhdGVkIHRvIGRvIENPTk5FQ1QgMS4xIHRvIGdldCBib3RoIHZlcnNpb25zIHJ1bi4KCkRhbmllbCBTdGVuYmVyZyAoMzEgSmFuIDIwMDkpCi0gV2hlbiBidWlsZGluZyB3aXRoIGMtYXJlcyAxLjYuMSAobm90IHlldCByZWxlYXNlZCkgb3IgbGF0ZXIgYW5kIElQdjYgc3VwcG9ydAogIGVuYWJsZWQsIHdlIGNhbiBub3cgdGFrZSBhZHZhbnRhZ2Ugb2YgaXRzIGJyYW5kIG5ldyBBRl9VTlNQRUMgc3VwcG9ydCBpbgogIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpLiBUaGlzIG1ha2VzIHRlc3QgY2FzZSAyNDEgZmluYWxseSBydW4gZmluZSBmb3IgbWUgd2l0aAogIHRoaXMgc2V0dXAgc2luY2UgaXQgbm93IHBhcnNlcyB0aGUgIjo6MSBpcDYtbG9jYWxob3N0IiBsaW5lIGZpbmUgaW4gbXkKICAvZXRjL2hvc3RzIGZpbGUhCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEphbiAyMDA5KQotIFNjb3R0IENhbnRvciBmaWxlZCBidWcgcmVwb3J0ICMyNTUwMDYxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NTAwNjEpIG1lbnRpb25pbmcgdGhhdCBJIGZhaWxlZCB0bwogIHByb3Blcmx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBWQzkgbWFrZWZpbGVzIGdvdCBpbmNsdWRlZCBpbiB0aGUgbGF0ZXN0CiAgcmVsZWFzZS4gSSd2ZSBub3cgZml4ZWQgdGhlIHJlbGVhc2Ugc2NyaXB0IGFuZCB2ZXJpZmllZCBpdCBzbyBuZXh0IHJlbGVhc2UKICB3aWxsIGhvcGVmdWxseSBpbmNsdWRlIHRoZW0gcHJvcGVybHkhCgpEYW5pZWwgRmFuZHJpY2ggKDMwIEphbiAyMDA5KQotIEZpeGVkIC0tZGlzYWJsZS1wcm94eSBmb3IgRlRQIGFuZCBTT0NLUy4gVGhhbmtzIHRvIERhbmllbCBFZ2dlciBmb3IKICByZXBvcnRpbmcuCgpZYW5nIFRzZSAoMjkgSmFuIDIwMDkpCi0gSW50cm9kdWNlZCBjdXJsX3NzcGkuYyBhbmQgY3VybF9zc3BpLmggZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMKICBDdXJsX3NzcGlfZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9zc3BpX2dsb2JhbF9jbGVhbnVwKCkgd2hpY2ggcHJldmlvdXNseSB3ZXJlCiAgbmFtZWQgQ3VybF9udGxtX2dsb2JhbF9pbml0KCkgYW5kIEN1cmxfbnRsbV9nbG9iYWxfY2xlYW51cCgpIGluIGh0dHBfbnRsbS5jCiAgQWxzbyBhZGp1c3RlZCBzb2Nrc19zc3BpLmMgdG8gcmVtb3ZlIHRoZSBsaW5rLXRpbWUgZGVwZW5kZW5jeSBvbiB0aGUgV2luZG93cwogIFNTUEkgbGlicmFyeSB1c2luZyBpdCBub3cgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdhcyBkb25lIGluIGh0dHBfbnRsbS5jLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBKYW4gMjAwOSkKLSBNYXJrdXMgTW9lbGxlciBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0byBsaWJjdXJsOgogIENVUkxPUFRfU09DS1M1X0dTU0FQSV9TRVJWSUNFIGFuZCBDVVJMT1BUX1NPQ0tTNV9HU1NBUElfTkVDIHRvIGFsbG93IGxpYmN1cmwKICB0byBkbyBHU1Mtc3R5bGUgYXV0aGVudGljYXRpb24gd2l0aCBTT0NLUzUgcHJveGllcy4gVGhlIGN1cmwgdG9vbCBnb3QgdGhlCiAgb3B0aW9ucyBjYWxsZWQgLS1zb2NrczUtZ3NzYXBpLXNlcnZpY2UgYW5kIC0tc29ja3M1LWdzc2FwaS1uZWMgdG8gZW5hYmxlCiAgdGhlc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEphbiAyMDA5KQotIENoYWQgTW9ucm9lIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE9QVF9URlRQX0JMS1NJWkUgb3B0aW9uIHRoYXQgYWxsb3dzIGFuIGFwcAogIHRvIHNldCBkZXNpcmVkIGJsb2NrIHNpemUgdG8gdXNlIGZvciBURlRQIHRyYW5zZmVycyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0CiAgNTEyIGJ5dGVzLgoKLSBUaGUgIi1ub190aWNrZXQiIG9wdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBPcGVuc3NsMC45LjhqLiBJdCdzIGEgZmxhZyB0bwogIGRpc2FibGUgInJmYzQ1MDdiaXMgc2Vzc2lvbiB0aWNrZXQgc3VwcG9ydCIuICByZmM0NTA3YmlzIHdhcyBsYXRlciB0dXJuZWQKICBpbnRvIHRoZSBwcm9wZXIgUkZDNTA3NyBpdCBzZWVtczogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTA3NwoKICBUaGUgZW5hYmxlZCBleHRlbnNpb24gY29uY2VybnMgdGhlIHNlc3Npb24gbWFuYWdlbWVudC4gSSB3b25kZXIgaG93IG9mdGVuCiAgbGliY3VybCBzdG9wcyBhIGNvbm5lY3Rpb24gYW5kIHRoZW4gcmVzdW1lcyBhIFRMUyBzZXNzaW9uLiBhbHNvLCBzZW5kaW5nIHRoZQogIHNlc3Npb24gZGF0YSBpcyBzb21lIG92ZXJoZWFkLiAuSSBzdWdnZXN0IHRoYXQgeW91IGp1c3QgdXNlIHlvdXIgcHJvcG9zZWQKICBwYXRjaCAod2hpY2ggZXhwbGljaXRseSBkaXNhYmxlcyBUSUNLRVQpLgoKICBJZiBzb21lb25lIHdyaXRlcyBhbiBhcHBsaWNhdGlvbiB3aXRoIGxpYmN1cmwgYW5kIG9wZW5zc2wgd2hvIHdhbnRzIHRvCiAgZW5hYmxlIHRoZSBmZWF0dXJlLCBvbmUgY2FuIGRvIHRoaXMgaW4gdGhlIFNTTCBjYWxsYmFjay4KCiAgU2hhcmFkIEd1cHRhIGJyb3VnaHQgdGhpcyB0byBteSBhdHRlbnRpb24uIFBldGVyIFN5bHZlc3RlciBoZWxwZWQgbWUgZGVjaWRlCiAgb24gdGhlIHByb3BlciBhY3Rpb24uCgotIEFsZXhleSBCb3J6b3YgZmlsZWQgYnVnIHJlcG9ydCAjMjUzNTUwNAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNTM1NTA0KSBwb2ludGluZyBvdXQgdGhhdCByZWFsbXMgd2l0aAogIHF1b3RlZCBxdW90YXRpb24gbWFya3MgaW4gSFRUUCBEaWdlc3QgaGVhZGVycyBkaWRuJ3Qgd29yay4gSSd2ZSBub3cgYWRkZWQKICB0ZXN0IGNhc2UgMTA5NSB0aGF0IHZlcmlmaWVzIG15IGZpeC4KCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgQ1VSTE9QVF9OT1BST1hZIGFuZCB0aGUgY29ycmVzcG9uZGluZyAtLW5vcHJveHkgb3B0aW9uLgogIFRoZXkgYmFzaWNhbGx5IG9mZmVyIHRoZSBzYW1lIHRoaW5nIHRoZSBOT19QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbmx5CiAgb2ZmZXJlZCBwcmV2aW91c2x5OiBsaXN0IGEgc2V0IG9mIGhvc3QgbmFtZXMgdGhhdCBzaGFsbCBub3QgdXNlIHRoZSBwcm94eQogIGV2ZW4gaWYgb25lIGlzIHNwZWNpZmllZC4KCkRhbmllbCBGYW5kcmljaCAoMjAgSmFuIDIwMDkpCi0gQ2FsbCBzZXRsb2NhbGUoKSBmb3IgbGlidGVzdCB0ZXN0cyB0byB0ZXN0IHRoZSBlZmZlY3RzIG9mIGxvY2FsZS1pbmR1Y2VkCiAgbGliYyBjaGFuZ2VzIG9uIGxpYmN1cmwuCgotIEZpeGVkIGEgY291cGxlIG1vcmUgbG9jYWxlLWRlcGVuZGVudCB0b3VwcGVyIGNvbnZlcnNpb25zLCBtYWlubHkgZm9yCiAgY2xhcml0eS4gIFRoaXMgZG9lcyBmaXggb25lIHByb2JsZW0gdGhhdCBjYXVzZXMgO3R5cGU9aSBGVFAgVVJMcwogIHRvIGZhaWwgaW4gdGhlIFR1cmtpc2ggbG9jYWxlIHdoZW4gQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFIGlzCiAgdXNlZCAodGVzdCBjYXNlIDU2MSkKCi0gQWRkZWQgdGVzdHMgNTYxIGFuZCAxMDkxIHRocm91Z2ggMTA5NCB0byB0ZXN0IHZhcmlvdXMgY29tYmluYXRpb25zCiAgb2YgO3R5cGU9IGFuZCA7bW9kZT0gVVJMcyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGZhaWwgaW4gdGhlIFR1cmtpc2gKICBsb2NhbGUuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEphbiAyMDA5KQotIExpc2EgWHUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgc3NoLm9iaiBmaWxlIHdhcyBtaXNzaW5nIGZyb20gdGhlCiAgbGliL01ha2VmaWxlLnZjNiBmaWxlIChhbmQgdGh1cyBmcm9tIHRoZSB2YzggYW5kIHZjOSBvbmVzIHRvbykuCgpWZXJzaW9uIDcuMTkuMyAoMTkgSmFudWFyeSAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxNiBKYW4gMjAwOSkKLSBBbmRyZXcgZGUgbG9zIFJleWVzIGZpeGVkIGN1cmxidWlsZC5oIGZvciAiZ2VuZXJpYyIgZ2NjIGJ1aWxkcyBvbiBQUEMsIGJvdGgKICAzMiBiaXQgYW5kIDY0IGJpdC4KCkRhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDIwMDkpCi0gVGltIEFuc2VsbCBmaXhlZCBhIGNvbXBpbGVyIHdhcm5pbmcgaW4gbGliL2Nvb2tpZS5jCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEphbiAyMDA5KQotIEdyYW50IEVyaWNrc29uIGZpeGVkIHRpbWVvdXRzIGZvciBURlRQIHN1Y2ggdGhhdCBzcGVjaWZ5aW5nIGEKICBjb25uZWN0LXRpbWVvdXQsIGEgbWF4LXRpbWUgb3IgYm90aCBvcHRpb25zIHdvcmsgY29ycmVjdGx5IGFuZCBhcyBleHBlY3RlZAogIGJ5IHBhc3NpbmcgdGhlIGNvcnJlY3QgYm9vbGVhbiB2YWx1ZSB0byBDdXJsX3RpbWVsZWZ0IHZpYSB0aGUKICAnZHVyaW5nY29ubmVjdCcgcGFyYW1ldGVyLgoKICBXaXRoIHRoaXMgc21hbGwgY2hhbmdlLCBjdXJsIFRGVFAgbm93IGJlaGF2ZXMgYXMgZXhwZWN0ZWQgKGFuZCBsaWtlbHkgYXMKICBvcmlnaW5hbGx5LWRlc2lnbmVkKToKCiAgMSkgRm9yIG5vbi1leGlzdGVudCBvciB1bnJlYWNoYWJsZSBkb3R0ZWQgSVAgYWRkcmVzc2VzOgoKICAgYSkgV2l0aCBubyBvcHRpb25zLCBmb2xsb3dzIHRoZSBkZWZhdWx0IGN1cmwgMzAwcyB0aW1lb3V0Li4uCiAgIGIpIFdpdGggLS1jb25uZWN0LXRpbWVvdXQgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlLi4uCiAgIGMpIFdpdGggLS1tYXgtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUuLi4KICAgZCkgV2l0aCBib3RoIC0tY29ubmVjdC10aW1lb3V0IGFuZCAtLW1heC10aW1lLCBmb2xsb3dzIHRoZSBzbWFsbGVyIHZhbHVlLi4uCgogICBhbmQgdGltZXMgb3V0IHdpdGggYSAiY3VybDogKDcpIENvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyIiBlcnJvci4KCiAgMikgRm9yIHRyYW5zZmVycyB0by9mcm9tIGEgdmFsaWQgaG9zdDoKCiAgIGEpIFdpdGggbm8gb3B0aW9ucywgZm9sbG93cyBkZWZhdWx0IGN1cmwgMzAwcyB0aW1lb3V0IGZvciB0aGUKICAgICAgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgZGVmYXVsdCBURlRQIDM2MDBzCiAgICAgIHRpbWVvdXQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBiKSBXaXRoIC0tY29ubmVjdC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZSBmb3IgdGhlCiAgICAgIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGRlZmF1bHQgVEZUUCAzNjAwcwogICAgICB0aW1lb3V0IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYykgV2l0aCAtLW1heC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZSBmb3IgdGhlIGZpcnN0CiAgICAgIFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlCiAgICAgIHRyYW5zZmVyLi4uCgogICBkKSBXaXRoIGJvdGggLS1jb25uZWN0LXRpbWVvdXQgYW5kIC0tbWF4LXRpbWUsIGZvbGxvd3MgdGhlIGZvcm1lcgogICAgICBmb3IgdGhlIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGxhdHRlciBmb3IgdGhlCiAgICAgIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGFuZCB0aW1lcyBvdXQgd2l0aCBhICJjdXJsOiAoMjgpIFRpbWVvdXQgd2FzIHJlYWNoZWQiIGVycm9yIGFzCiAgIGFwcHJvcHJpYXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBKYW4gMjAwOSkKLSBNaWNoYWVsIFdhbGxuZXIgZml4ZWQgYSBOVUxMIHBvaW50ZXIgZGVyZWYgd2hlbiBjYWxsaW5nCiAgY3VybF9lYXN5X3NldHVwKGN1cmwsIENVUkxPUFRfQ09PS0lFTElTVCwgIlNFU1MiKSBvbiBhIENVUkwgaGFuZGxlIHdpdGggbm8KICBjb29raWVzIGRhdGEuCgotIFN0ZWZhbiBUZWxlbWFuIGJyb3VnaHQgYSBwYXRjaCB0byBmaXggdGhlIGRlZmF1bHQgY3VybGJ1aWxkLmggZmlsZSBmb3IgdGhlCiAgU3VuUHJvIGNvbXBpbGVycy4KCkRhbmllbCBTdGVuYmVyZyAoMTIgSmFuIDIwMDkpCi0gQmFzZWQgb24gYnVnIHJlcG9ydCAjMjQ5ODY2NSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjQ5ODY2NSkKICBieSBEYW5pZWwgQmxhY2ssIEkndmUgbm93IGFkZGVkIG1hZ2ljIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFrZXMgaXQKICB1c2UgcGtnLWNvbmZpZyB0byBkZXRlY3QgZ251dGxzIGRldGFpbHMgYXMgd2VsbCBpZiB0aGUgZXhpc3RpbmcgbWV0aG9kCiAgKHVzaW5nIGxpYmdudXRscy1jb25maWcpIGZhaWxzLiBXaGlsZSBkb2luZyB0aGlzLCBJIGNsZWFuZWQgdXAgYW5kIHVuaWZpZWQKICB0aGUgcGtnLWNvbmZpZyB1c2FnZSB3aGVuIGRldGVjdGluZyBvcGVuc3NsIGFuZCBuc3MgYXMgd2VsbC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDIwMDkpCi0gS2FybCBNb2VyZGVyIGJyb3VnaHQgdGhlIHBhdGNoIHRoYXQgY3JlYXRlcyB2YzkgTWFrZWZpbGVzLCBhbmQgSSBtYWRlCiAgJ21ha2V0Z3onIG5vdyB1c2UgdGhlIGFjdHVhbCBtYWtlZmlsZSB0YXJnZXRzIHRvIGRvIHRoZSBWQzggYW5kIFZDOQogIG1ha2VmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSmFuIDIwMDkpCi0gRW1pbCBSb21hbnVzIGZpeGVkOgoKICBXaGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb3ZlciBIVFRQIGFuZCB0aGUgc2VydmVyIHJldHVybnMgYSBMb2NhdGlvbgogIGhlYWRlciwgdGhlIHJ1bm5pbmcgZWFzeSBoYW5kbGUgd2lsbCBnZXQgc3R1Y2sgaW4gdGhlIENVUkxNX1NUQVRFX1BFUkZPUk0KICBzdGF0ZSwgbGVhdmluZyB0aGUgZXh0ZXJuYWwgZXZlbnQgbG9vcCBzdHVjayB3YWl0aW5nIGZvciBkYXRhIGZyb20gdGhlCiAgaW5nb2luZyBzb2NrZXQgKHdoZW4gdXNpbmcgdGhlIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbiBzdHVmZikuIFdoaWxlIHRoaXMKICBidWcgd2FzIHByZXR0eSBoYXJkIHRvIGZpbmQsIGl0IHNlZW1zIHRvIHJlcXVpcmUgb25seSBhIG9uZS1saW5lIGZpeC4gVGhlCiAgYnJlYWsgc3RhdGVtZW50IG9uIGxpbmUgMTM3NCBpbiBtdWx0aS5jIGNhdXNlZCB0aGUgZnVuY3Rpb24gdG8gc2tpcCB0aGUgY2FsbAogIHRvIG11bHRpc3RhdGUoKS4KCiAgSG93IHRvIHJlcHJvZHVjZSB0aGlzIGJ1Zz8gV2VsbCwgdGhhdCdzIGFub3RoZXIgcXVlc3Rpb24uICBldmhpcGVyZmlmby5jIGluCiAgdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBjaG9rZXMgb24gdGhpcyBidWcgb25seSBfc29tZXRpbWVzXywgcHJvYmFibHkKICBkZXBlbmRpbmcgb24gaG93IGZhc3QgdGhlIFVSTHMgYXJlIGFkZGVkLiBPbmUgd2F5IG9mIHRlc3RpbmcgdGhlIGJ1ZyBvdXQgaXMKICB3cml0aW5nIHRvIGhpcGVyLmZpZm8gZnJvbSBtb3JlIHRoYW4gb25lIHNvdXJjZSBhdCB0aGUgc2FtZSB0aW1lLgoKRGFuaWVsIEZhbmRyaWNoICg3IEphbiAyMDA5KQotIFVuaWZpZWQgbXVjaCBvZiB0aGUgU2Vzc2lvbkhhbmRsZSBpbml0aWFsaXphdGlvbiBkb25lIGluIEN1cmxfb3BlbigpIGFuZAogIGN1cmxfZWFzeV9yZXNldCgpIGJ5IGNyZWF0aW5nIEN1cmxfaW5pdF91c2VyZGVmaW5lZCgpLiBUaGlzIGhhZCB0aGUgc2lkZQogIGVmZmVjdCBvZiBmaXhpbmcgY3VybF9lYXN5X3Jlc2V0KCkgc28gaXQgbm93IGFsc28gcmVzZXRzCiAgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCBhbmQgQ1VSTE9QVF9TU0xfU0VTU0lPTklEX0NBQ0hFCgpEYW5pZWwgU3RlbmJlcmcgKDcgSmFuIDIwMDkpCi0gUm9iIENyaXR0ZW5kZW4gZGlkIG9uY2UgYWdhaW4gcHJvdmlkZSBhbiBOU1MgdXBkYXRlOgoKICBJIGhhdmUgdG8ganVtcCB0aHJvdWdoIGEgZmV3IGhvb3BzIG5vdyB3aXRoIHRoZSBOU1MgbGlicmFyeSBpbml0aWFsaXphdGlvbgogIHNpbmNlIGFub3RoZXIgcGFydCBvZiBhbiBhcHBsaWNhdGlvbiBtYXkgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIE5TUyBieSB0aGUKICB0aW1lIEN1cmwgZ2V0cyBpbnZva2VkLiBUaGlzIHBhdGNoIGlzIG1vcmUgY2FyZWZ1bCB0byBvbmx5IHNodXRkb3duIHRoZSBOU1MKICBsaWJyYXJ5IGlmIEN1cmwgZGlkIHRoZSBpbml0aWFsaXphdGlvbi4KCiAgSXQgYWxzbyBhZGRzIGluIGEgYml0IG9mIGNvZGUgdG8gc2V0IHRoZSBkZWZhdWx0IGNpcGhlcnMgaWYgdGhlIGFwcCB0aGF0CiAgY2FsbCBOU1NfSW5pdCogZGlkIG5vdCBjYWxsIE5TU19TZXREb21lc3RpY1BvbGljeSgpIG9yIHNldCBzcGVjaWZpYwogIGNpcGhlcnMuIE9uZSBtaWdodCBhcmd1ZSB0aGF0IHRoaXMgbGV0cyBvdGhlciBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIGdldAogIGxhenkgYW5kL29yIHRoZXkgYXJlbid0IHVzaW5nIHRoZSBOU1MgQVBJIGNvcnJlY3RseSwgYW5kIHlvdSdkIGJlIHJpZ2h0LgogIEJ1dCBzdGlsbCwgdGhpcyB3aWxsIGF2b2lkIHRlcnJpYmx5IGRpZmZpY3VsdC10by10cmFjZSBjcmFzaGVzIGFuZCBpcwogIGdlbmVyYWxseSBoZWxwZnVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEphbiAyMDA5KQotICdyZWNvbmYnIGlzIHJlbW92ZWQgc2luY2Ugd2UgcmF0aGVyIGhhdmUgdXNlcnMgdXNlICdidWlsZGNvbmYnCgpEYW5pZWwgU3RlbmJlcmcgKDMxIERlYyAyMDA4KQotIEJhcyBNZXZpc3NlbiByZXBvcnRlZCBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDc5MDMwIHBvaW50aW5nCiAgb3V0IHRoYXQgJ3JlY29uZicgZGlkbid0IHByb3Blcmx5IHBvaW50IG91dCB0aGUgbTQgc3ViZGlyZWN0b3J5IHdoZW4gcnVubmluZwogIGFjbG9jYWwuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IERlYyAyMDA4KQogLSBQaGlsIExpc2llY2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzI0MTMwNjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjQxMzA2NykgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0CiAgd291bGQgY2F1c2UgbGliY3VybCB0byBtYXJrIGEgRE5TIGNhY2hlIGVudHJ5ICJpbiB1c2UiIGV0ZXJuYWxseSBpZiB0aGUKICBzdWJzZXF1ZW5jZSBUQ1AgY29ubmVjdCBmYWlsZWQuIEl0IHdvdWxkIHRodXMgbmV2ZXIgZ2V0IHBydW5lZCBhbmQgcmVmcmVzaGVkCiAgYXMgaXQgc2hvdWxkJ3ZlIGJlZW4uCgogIFBoaWwgcHJvdmlkZWQgaGlzIG93biBwYXRjaCB0byB0aGlzIHByb2JsZW0gdGhhdCB3aGlsZSBpdCBzZWVtZWQgdG8gd29yawogIHdhc24ndCBjb21wbGV0ZSBhbmQgdGh1cyBJIHdyb3RlIG15IG93biBmaXggdG8gdGhlIHByb2JsZW0uCgpEYW5pZWwgU3RlbmJlcmcgKDI4IERlYyAyMDA4KQotIFBldGVyIEtvcnNnYWFyZCBmaXhlZCBidWlsZGluZyBsaWJjdXJsIHdpdGggImNvbmZpZ3VyZSAtLXdpdGgtc3NsCiAgLS1kaXNhYmxlLXZlcmJvc2UiLgoKLSBBbnRob255IEJyeWFuIGZpeGVkIG1vcmUgbGFuZ3VhZ2UgYW5kIHNwZWxsaW5nIGZsYXdzIGluIG1hbiBwYWdlcy4KCkRhbmllbCBTdGVuYmVyZyAoMjIgRGVjIDIwMDgpCi0gR2l2ZW4gYSByZWNlbnQgZW5vdWdoIGxpYnNzaDIsIGxpYmN1cmwgY2FuIG5vdyBzZWVrL3Jlc3VtZSB3aXRoIFNGVFAgZXZlbgogIG9uIGZpbGUgaW5kZXhlcyBiZXlvbmQgMiBvciA0R0IuCgotIEFudGhvbnkgQnJ5YW4gcHJvdmlkZWQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGNsZWFuZWQgdXAgbWFudWFsIGxhbmd1YWdlLAogIGNvcnJlY3RlZCBzcGVsbGluZ3MgYW5kIG1vcmUuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIERlYyAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgZml4ZWQgYSBiYWQgc2l0dWF0aW9uIGZvciB0aGUgbXVsdGlfc29ja2V0KCkgQVBJIHdoZW4gZG9pbmcKICBwaXBlbGluaW5nLCBhcyBsaWJjdXJsIGNvdWxkIHRoZW4gZWFzaWx5IGdldCBjb25mdXNlZCBhbmQgQSkgd29yayBvbiB0aGUKICBoYW5kbGUgdGhhdCB3YXMgbm90ICJmaXJzdCBpbiBxdWV1ZSIgb24gYSBwaXBlbGluZSwgb3IgZXZlbiBCKSB0ZWxsIHRoZSBhcHAKICB0byBSRU1PVkUgYSBzb2NrZXQgd2hpbGUgaXQgd2FzIGluIHVzZSBieSBhIHNlY29uZCBoYW5kbGUgaW4gYSBwaXBlbGluZS4gQm90aAogIGVycm9ycyBjYXVzZWQgaGFuZ2luZyBvciBzdGFsbGluZyBhcHBsaWNhdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IERlYyAyMDA4KQotIGN1cmxfbXVsdGlfdGltZW91dCgpIGNvdWxkIHJldHVybiBhIHRpbWVvdXQgdmFsdWUgb2YgMCBldmVuIHRob3VnaCBub3RoaW5nCiAgd2FzIGFjdHVhbGx5IHJlYWR5IHRvIGdldCBkb25lLCBhcyB0aGUgaW50ZXJuYWwgdGltZSByZXNvbHV0aW9uIGlzIGhpZ2hlcgogIHRoYW4gdGhlIHJldHVybmVkIG1pbGxpc2Vjb25kIHRpbWVyLiBUaGVyZWZvcmUgaXQgY291bGQgY2F1c2UgYXBwbGljYXRpb25zCiAgcnVubmluZyBvbiBmYXN0IHByb2Nlc3NvcnMgdG8gZG8gc2hvcnQgYnVyc3RzIG9mIGJ1c3ktbG9vcHMuCiAgY3VybF9tdWx0aV90aW1lb3V0KCkgd2lsbCBub3cgb25seSByZXR1cm4gMCBpZiB0aGUgdGltZW91dCBpcyBhY3R1YWxseQogIGFscmVheSB0cmlnZ2VyZWQuCgotIFVzaW5nIHRoZSBsaWJzc2gyIDAuMTkgZnVuY3Rpb24gbGlic3NoMl9zZXNzaW9uX2Jsb2NrX2RpcmVjdGlvbnMoKSwgbGliY3VybAogIG5vdyBoYXMgYW4gaW1wcm92ZWQgYWJpbGl0eSB0byBkbyByaWdodCB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UgKGJvdGgKICAicmVndWxhciIgYW5kIG11bHRpX3NvY2tldCkgaXMgdXNlZCBmb3IgU0NQIGFuZCBTRlRQIHRyYW5zZmVycy4gVGhpcyBzaG91bGQKICByZXN1bHQgaW4gKG11Y2gpIGxlc3MgYnVzeS1sb29wIHNpdHVhdGlvbnMgYW5kIHRodXMgbGVzcyBDUFUgdXNhZ2Ugd2l0aCBubwogIHNwZWVkIGxvc3MuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IERlYyAyMDA4KQotIFNDUCBhbmQgU0ZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgaGFkIHRoZSBzYW1lIGZsYXc6IHRoZSAnRE9ORScKICBvcGVyYXRpb24gZGlkbid0IGNvbXBsZXRlIHByb3Blcmx5IGlmIHRoZSBFQUdBSU4gZXF1aXZhbGVudCB3YXMgcmV0dXJuZWQgYnV0CiAgbGliY3VybCB3b3VsZCBzaW1wbHkgY29udGludWUgd2l0aCBhIGhhbGYtY29tcGxldGVkIGNsb3NlIG9wZXJhdGlvbgogIHBlcmZvcm1lZC4gVGhpcyBydWluZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIHJlLXVzZSBhbmQgY2F1c2Ugc29tZQogIFNTSC1wcm90b2NvbCBlcnJvcnMgaW4gZ2VuZXJhbC4gVGhlIGNvcnJlY3Rpb24gaXMgdW5mb3J0dW5hdGVseSBhZGRpbmcgYQogIGJsb2NraW5nIGZ1bmN0aW9uIC0gZG9pbmcgaXQgZW50aXJlbHkgbm9uLWJsb2NraW5nIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvcgogIGEgYmV0dGVyIGZpeC4KCkdpc2xlIFZhbmVtICgxNiBEZWMgMjAwOCkKLSBBZGRlZCB0aGUgcG9zc2liaWxpdHkgdG8gdXNlIHRoZSBXYXR0LTMyIHRjcC9pcCBzdGFjayB1bmRlciBXaW5kb3dzLgogIFRoZSBjaGFuZ2Ugc2ltcGx5IGludm9sdmVkIGFkZGluZyBhIFVTRV9XQVRUMzIgc2VjdGlvbiBpbiB0aGUKICBjb25maWctd2luMzIuaCBmaWxlcyAodW5kZXIgLi9saWIgYW5kIC4vc3JjKS4gVGhpcyBzZWN0aW9uIGRpc2FibGVzCiAgdGhlIHVzZSBvZiBhbnkgV2luc29jayBoZWFkZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBEZWMgMjAwOCkKLSBsaWJzc2gyX3NmdHBfbGFzdF9lcnJvcigpIHdhcyB3cm9uZ2x5IHVzZWQgYXQgc29tZSBwbGFjZXMgaW4gbGliY3VybCB3aGljaAogIG1hZGUgbGliY3VybCBzb21ldGltZXMgbm90IHByb3Blcmx5IGFib3J0IHByb2JsZW1hdGljIFNGVFAgdHJhbnNmZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBEZWMgMjAwOCkKLSBNb3JlIHdvcmsgd2l0aCBJZ29yIE5vdm9zZWx0c2V2IHRvIGZpcnN0IGZpeCB0aGUgcmVtYWluaW5nIHN0dWZmIGZvcgogIHJlbW92aW5nIGVhc3kgaGFuZGxlcyBmcm9tIG11bHRpIGhhbmRsZXMgd2hlbiB0aGUgZWFzeSBoYW5kbGUgaXMvd2FzIHdpdGhpbgogIGEgSFRUUCBwaXBlbGluZS4gSGlzIGJ1ZyByZXBvcnQgIzIzNTE2NTMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjM1MTY1Mykgd2FzIGFsc28gcmVsYXRlZCBhbmQgd2FzCiAgZXZlbnR1YWxseSBmaXhlZCBieSBhIHBhdGNoIGJ5IElnb3IgaGltc2VsZi4KCllhbmcgVHNlICgxMiBEZWMgMjAwOCkKLSBQYXRyaWNrIE1vbm5lcmF0IGZpeGVkIGEgYnVpbGQgcmVncmVzc2lvbiwgaW50cm9kdWNlZCBpbiA3LjE5LjIsIGFmZmVjdGluZwogIE9TLzQwMCBjb21waWxhdGlvbnMgd2l0aCBJUHY2IGVuYWJsZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA4KQotIE1hcmsgS2FycGVsZXMgZmlsZWQgYnVnIHJlcG9ydCAjMjQxNjE4MiB0aXRsZWQgImNyYXNoIGluIENvbm5lY3Rpb25FeGlzdHMKICB3aGVuIHVzaW5nIGR1cGhhbmRsZStjdXJsX211dGxpIgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDE2MTgyKSB3aGljaCBzaG93ZWQgdGhhdAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3cm9uZ2x5IGFsc28gY29waWVkIHRoZSBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uCiAgY2FjaGUsIHdoaWNoIHdhcyBwbGFpbiB3cm9uZyBhbmQgY2F1c2VkIGEgc2VnZmF1bHQgaWYgdGhlIGhhbmRsZSB3b3VsZCBiZQogIHVzZWQgaW4gYSBkaWZmZXJlbnQgbXVsdGkgaGFuZGxlIHRoYW4gdGhlIGhhbmRsZSBpdCB3YXMgZHVwbGljYXRlZCBmcm9tLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBLZXNoYXYgS3JpdHkgZm91bmQgb3V0IHRoYXQgbGliY3VybCBmYWlsZWQgdG8gZGVhbCB3aXRoIGRvdHRlZCBJUHY2CiAgYWRkcmVzc2VzIGlmIHRoZXkgd2VyZSB2ZXJ5IGxvbmcgKD4zOSBsZXR0ZXJzKSBkdWUgdG8gYSB0b28gc3RyaWN0IGFkZHJlc3MKICB2YWxpZGl0eSBwYXJzZXIuIEl0IG5vdyBhY2NlcHRzIGFkZHJlc3NlcyB1cCB0byA0NSBieXRlcyBsb25nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBJbnRlcm5ldCBFeHBsb3JlciBoYWQgYSBicm9rZW4gSFRUUCBkaWdlc3QgYXV0aGVudGljYXRpb24gYmVmb3JlIHY3IGFuZAogIHRoZXJlIGFyZSBzZXJ2ZXJzICJvdXQgdGhlcmUiIHRoYXQgcmVsaWVzIG9uIHRoZSBjbGllbnQgZG9pbmcgdGhpcyBicm9rZW4KICBEaWdlc3QgYXV0aGVudGljYXRpb24uIEFwYWNoZSBldmVuIGNvbWVzIHdpdGggYW4gb3B0aW9uIHRvIHdvcmsgd2l0aCBzdWNoCiAgYnJva2VuIGNsaWVudHMuCgogIFRoZSBkaWZmZXJlbmNlIGlzIG9ubHkgZm9yIFVSTHMgdGhhdCBjb250YWluIGEgcXVlcnktcGFydCAoYSAnPyctbGV0dGVyIGFuZAogIHRleHQgdG8gdGhlIHJpZ2h0IG9mIGl0KS4KCiAgbGliY3VybCBub3cgc3VwcG9ydHMgdGhpcyBxdWlyaywgYW5kIHlvdSBlbmFibGUgaXQgYnkgc2V0dGluZyB0aGUKICBDVVJMQVVUSF9ESUdFU1RfSUUgYml0IGluIHRoZSBiaXRtYXNrIHlvdSBwYXNzIHRvIHRoZSBDVVJMT1BUX0hUVFBBVVRIIG9yCiAgQ1VSTE9QVF9QUk9YWUFVVEggb3B0aW9ucy4gVGhleSBhcmUgdGh1cyBpbmRpdmlkdWFsbHkgY29udHJvbGxlZCB0byBzZXJ2ZXIKICBhbmQgcHJveHkuCgogIChub3RlIHRoYXQgdGhlcmUncyBubyB3YXkgdG8gYWN0aXZhdGUgdGhpcyB3aXRoIHRoZSBjdXJsIHRvb2wgeWV0KQoKRGFuaWVsIEZhbmRyaWNoICg5IERlYyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTA4OSBhbmQgMTA5MCB0byB0ZXN0IC0td3JpdGUtb3V0IGFmdGVyIGEgcmVkaXJlY3QgdG8KICB0ZXN0IGEgcmVwb3J0IHRoYXQgdGhlIHNpemUgZGlkbid0IHdvcmssIGJ1dCB0aGVzZSB0ZXN0IGNhc2VzIHBhc3MuCgotIERvY3VtZW50ZWQgQ1VSTE9QVF9DT05ORUNUX09OTFkgYXMgYmVpbmcgdXNlZnVsIG9ubHkgb24gSFRUUCBVUkxzLgoKRGFuaWVsIFN0ZW5iZXJnICg5IERlYyAyMDA4KQotIEtlbiBIaXJzY2ggc2ltcGxpZmllZCBob3cgbGliY3VybCBkb2VzIEZUUFM6IG5vdyBpdCBkb2Vzbid0IGFzc3VtZSBhbnkKICBwYXJ0aWN1bGFyIHN0YXRlIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIGxpa2UgaXQgZGlkIGJlZm9yZSBmb3IgaW1wbGljaXQKICBGVFBTIChsaWJjdXJsIGFzc3VtZWQgc3VjaCBjb250cm9sIGNvbm5lY3Rpb25zIHRvIGJlIGVuY3J5cHRlZCB3aGlsZSBzb21lCiAgRlRQUyBzZXJ2ZXJzIHN1Y2ggYXMgRmlsZVppbGxhIGFzc3VtZXMgc3VjaCBjb25uZWN0aW9ucyB0byBiZSBjbGVhcgogIG1vZGUpLiBVc2UgdGhlIENVUkxPUFRfVVNFX1NTTCBvcHRpb24gdG8gc2V0IHlvdXIgZGVzaXJlZCBsZXZlbC4KCkRhbmllbCBTdGVuYmVyZyAoOCBEZWMgMjAwOCkKLSBGcmVkIE1hY2hhZG8gcG9zdGVkIGFib3V0IGEgd2VpcmQgRlRQIHByb2JsZW0gb24gdGhlIGN1cmwtdXNlcnMgbGlzdCBhbmQgd2hlbgogIHJlc2VhcmNoaW5nIGl0LCBpdCB0dXJuZWQgb3V0IGhlIGdvdCBhIDU1MCByZXNwb25zZSBiYWNrIGZyb20gYSBTSVpFIGNvbW1hbmQKICBhbmQgdGhlbiBJIGZlbGwgb3ZlciB0aGUgdGV4dCBpbiBSRkMzNjU5IHRoYXQgc2F5czoKCiAgIFRoZSBwcmVzZW5jZSBvZiB0aGUgNTUwIGVycm9yIHJlc3BvbnNlIHRvIGEgU0laRSBjb21tYW5kIE1VU1QgTk9UIGJlIHRha2VuCiAgIGJ5IHRoZSBjbGllbnQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUKICAgY3VycmVudCBNT0RFIGFuZCBUWVBFLgoKICBJbiBvdGhlciB3b3JkczogdGhlIGNoYW5nZSBJIGRpZCBvbiBTZXB0ZW1iZXIgMzB0aCAyMDA4IGFuZCB0aGF0IGhhcyBiZWVuCiAgaW5jbHVkZWQgaW4gdGhlIGxhc3QgdHdvIHJlbGVhc2VzIHdlcmUgYSByZWdyZXNzaW9uIGFuZCBhIGJhZCBpZGVhLiBXZSBNVVNUCiAgTk9UIHRha2UgYSA1NTAgcmVzcG9uc2UgZnJvbSBTSVpFIGFzIGEgaGludCB0aGF0IHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCgotIENocmlzdGlhbiBLcmF1c2UgZmlsZWQgYnVnICMyMjIxMjM3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMjEyMzcpIHRoYXQgaWRlbnRpZmllZCBhbiBpbmZpbml0ZQogIGxvb3AgZHVyaW5nIEdTUyBhdXRoZW50aWNhdGlvbiBnaXZlbiBzb21lIHNwZWNpZmljIGNvbmRpdGlvbnMuIFdpdGggaGlzCiAgcGF0aWVuY2UgYW5kIGdyZWF0IGZlZWRiYWNrIEkgbWFuYWdlZCB0byBuYXJyb3cgZG93biB0aGUgcHJvYmxlbSBhbmQKICBldmVudHVhbGx5IGZpeCBpdCBhbHRob3VnaCBJIGNhbid0IHRlc3QgYW55IG9mIHRoaXMgbXlzZWxmIQoKRGFuaWVsIEZhbmRyaWNoICgzIERlYyAyMDA4KQotIEZpeGVkIHRoZSBnZXRpZmFkZHJzIHZlcnNpb24gb2YgQ3VybF9pZjJpcCB0byB3b3JrIG9uIHN5c3RlbXMgd2l0aG91dCBJUHY2CiAgc3VwcG9ydCAoZS5nLiBNaW5peCkKCkRhbmllbCBTdGVuYmVyZyAoMyBEZWMgMjAwOCkKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjM1MTY0NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjQ1KSB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIHRoYXQgb2NjdXJlZCBpZiB5b3UgcmVtb3ZlZCBhbiBlYXN5IGhhbmRsZSB3aGlsZSBpbgogIHByb2dyZXNzIGFuZCB0aGUgaGFuZGxlIHdhcyB1c2VkIGluIGEgSFRUUCBwaXBlbGluZS4KCi0gUGF3ZWwgS2llcnNraSBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvb2tpZSBjb2RlIHRoYXQgY291bGQgbGVhZCB0byBhCiAgYmFkIGZjbG9zZSgpIGFmdGVyIGEgZmF0YWwgZXJyb3IgaGFkIG9jY3VyZWQuCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzODIyMTkpCgpEYW5pZWwgRmFuZHJpY2ggKDI1IE5vdiAyMDA4KQotIElmIGEgSFRUUCByZXF1ZXN0IGlzIEJhc2ljIGFuZCBudW0gaXMgYWxyZWFkeSA+PTEwMDAsIHRoZSBIVFRQIHRlc3QKICBzZXJ2ZXIgYWRkcyAxIHRvIG51bSB0byBnZXQgdGhlIGRhdGEgc2VjdGlvbiB0byByZXR1cm4uIFRoaXMgYWxsb3dzCiAgdGVzdGluZyBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbnMgdXNpbmcgdGhlIEJhc2ljIGF1dGhlbnRpY2F0aW9uCiAgbWV0aG9kLgoKLSBBZGRlZCB0ZXN0cyAxMDg3IGFuZCAxMDg4IHRvIHRlc3QgQmFzaWMgYXV0aGVudGljYXRpb24gb24gYSByZWRpcmVjdAogIHdpdGggYW5kIHdpdGhvdXQgLS1sb2NhdGlvbi10cnVzdGVkCgpEYW5pZWwgU3RlbmJlcmcgKDI0IE5vdiAyMDA4KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgVmxhZCBHcmFjaG92LCBsaWJjdXJsIG5vdyB1c2VzIGEgbmV3IGxpYnNzaDIgMC4xOQogIGZ1bmN0aW9uIHdoZW4gYnVpbHQgdG8gc3VwcG9ydCBTQ1AgYW5kIFNGVFAgdGhhdCBoZWxwcyB0aGUgbGlicmFyeSB0byBrbm93CiAgaW4gd2hpY2ggZGlyZWN0aW9uIGEgcGFydGljdWxhciBsaWJzc2gyIG9wZXJhdGlvbiB3b3VsZCByZXR1cm4gRUFHQUlOIHNvCiAgdGhhdCBsaWJjdXJsIGtub3dzIHdoYXQgc29ja2V0IGNvbmRpdGlvbnMgdG8gd2FpdCBmb3IgYmVmb3JlIHRyeWluZyB0aGUKICBmdW5jdGlvbiBjYWxsIGFnYWluLiBQcmV2aW91c2x5IChhbmQgc3RpbGwgd2hlbiB1c2luZyBsaWJzc2gyIDAuMTggb3IKICBlYXJsaWVyKSwgbGliY3VybCB3aWxsIGJ1c3ktbG9vcCBpbiB0aGlzIHNpdHVhdGlvbiB3aGVuIHRoZSBlYXN5IGludGVyZmFjZQogIGlzIHVzZWQhCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE5vdiAyMDA4KQotIEF1dG9tYXRpY2FsbHkgZGV0ZWN0IE9wZW5CU0QncyBDQSBjZXJ0IGJ1bmRsZS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTm92IDIwMDgpCi0gSSByZW1vdmVkIHRoZSBkZWZhdWx0IHVzZSBvZiAiUHJhZ21hOiBuby1jYWNoZSIgZnJvbSBsaWJjdXJsIHdoZW4gYSBwcm94eSBpcwogIHVzZWQuIEl0IGhhcyBiZWVuIHVzZWQgc2luY2UgZm9yZXZlciBidXQgaXQgd2FzIG5ldmVyIGEgZ29vZCBpZGVhIHRvIHVzZQogIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIGZvci4KCi0gSm9zZWYgV29sZidzIGV4dGVuc2lvbiB0aGF0IGFsbG93cyBhICRURVNURElSL2dkYmluaXQkdGVzdG51bSBmaWxlIHRoYXQgd2hlbgogIHlvdSB1c2UgcnVudGVzdHMucGwgLWcsIHdpbGwgYmUgc291cmNlZCBieSBnZGIgdG8gYWxsb3cgYWRkaXRpb25hbCBmYW5jeSBvcgogIHdoYXRldmVyIHlvdSBzZWUgZml0CgotIENocmlzdGlhbiBLcmF1c2UgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCB3b3VsZCBvY2N1ciB3aXRoIEhUVFAKICBHU1Mva2VyYmVyb3MgYXV0aGVudGljYXRpb24gKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyODQzODYpCgotIEFuZHJlYXMgV3VyZiBhbmQgTWFya3VzIEtvZXR0ZXIgaGVscGVkIG1lIGFuYWx5emUgYSBwcm9ibGVtIHRoYXQgQW5kcmVhcyBnb3QKICB3aGVuIHVwbG9hZGluZyBmaWxlcyB0byBhIHNpbmdsZSBGVFAgc2VydmVyIHVzaW5nIG11bHRpcGxlIGVhc3kgaGFuZGxlCiAgaGFuZGxlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIE9jY2FzaW9uYWxseSBhIGhhbmRsZSB3b3VsZCBzdGFsbCBpbgogIG15c3RlcmlvdXMgd2F5cy4KCiAgVGhlIHByb2JsZW0gdHVybmVkIG91dCB0byBiZSBhIHNpZGUtZWZmZWN0IG9mIHRoZSBDb25uZWN0aW9uRXhpc3RzKCkKICBmdW5jdGlvbidzIGVhZ2VybmVzcyB0byByZS11c2UgYSBoYW5kbGUgZm9yIEhUVFAgcGlwZWxpbmluZyBzbyBpdCB3b3VsZAogIHNlbGVjdCBpdCBldmVuIGlmIGFscmVhZHkgYmVpbmcgaW4gdXNlLCBkdWUgdG8gYW4gaW5hZGVxdWF0ZSBjaGVjayBmb3IgaXRzCiAgY2hhbmNlcyBvZiBiZWluZyB1c2VkIGZvciBwaXBlbG5pbmluZy4KCkRhbmllbCBGYW5kcmljaCAoMTcgTm92IDIwMDgpCi0gQWRkZWQgbW9yZSBjb21waWxlciB3YXJuaW5nIG9wdGlvbnMgZm9yIGdjYyA0LjMKCllhbmcgVHNlICgxNyBOb3YgMjAwOCkKLSBGaXggYSByZW1haW5pbmcgcHJvYmxlbSBpbiB0aGUgaW5ldF9wdG9uKCkgcnVudGltZSBjb25maWd1cmUgY2hlY2suIEFuZAogIGZpeCBpbnRlcm5hbCBDdXJsX2luZXRfcHRvbigpIGZhaWx1cmVzIHRvIHJlamVjdCBjZXJ0YWluIG1hbGZvcm1lZCBsaXRlcmFscy4KCi0gTWFrZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrIGlmIGlvY3RsIHdpdGggdGhlIFNJT0NHSUZBRERSIGNvbW1hbmQgY2FuIGJlCiAgdXNlZCwgYW5kIGRlZmluZSBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSIGlmIGFwcHJvcHJpYXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBOb3YgMjAwOCkKLSBDaHJpc3RpYW4gS3JhdXNlIGZpeGVkIGEgYnVpbGQgZmFpbHVyZSB3aGVuIGJ1aWxkaW5nIHdpdGggZ3NzIHN1cHBvcnQKICBlbmFibGVkIGFuZCBGVFAgZGlzYWJsZWQuCgotIEFkZGVkIGNoZWNrIGZvciBOVUxMIHJldHVybnMgZnJvbSBzdHJkdXAoKSBpbiBzcmMvbWFpbi5jIGFuZCBsaWIvZm9ybWRhdGEuYwogIC0gcmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nIGFsc28gcHJldmVudCBidWZmZXIgb3ZlcmZsb3cgb24gTVNET1Mgd2hlbiB5b3UgZG8KICBmb3IgZXhhbXBsZSAtTyBvbiBhIHVybCB3aXRoIGEgZmlsZSBuYW1lIHBhcnQgbG9uZ2VyIHRoYW4gUEFUSF9NQVggbGV0dGVycwoKLSBsaWIvbnNzLmMgZml4ZXMgYmFzZWQgb24gdGhlIHJlcG9ydCBieSBKaW0gTWV5ZXJpbmc6IEkgd2VudCBvdmVyIGFuZCBhZGRlZAogIGNoZWNrcyBmb3IgcmV0dXJuIGNvZGVzIGZvciBhbGwgY2FsbHMgdG8gbWFsbG9jIGFuZCBzdHJkdXAgdGhhdCB3ZXJlCiAgbWlzc2luZy4gSSBhbHNvIGNoYW5nZWQgYSBmZXcgbWFsbG9jKDEzKSB0byB1c2UgYXJyYXlzIG9uIHRoZSBzdGFjayBhbmQgYQogIGZldyBtYWxsb2MoUEFUSF9NQVgpIHRvIGluc3RlYWQgdXNlIGFwcmludGYoKSB0byBsb3dlciBtZW1vcnkgdXNlLgoKLSBJIGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gQ3VybF9uc3NfY29ubmVjdCgpIHdoZW4gQ1VSTE9QVF9JU1NVRVJDRVJUIGlzCiAgaW4gdXNlLgoKRGFuaWVsIEZhbmRyaWNoICgxNCBOb3YgMjAwOCkKLSBBZGRlZCAueG1sIGFzIG9uZSBvZiB0aGUgZmV3IGNvbW1vbiBmaWxlIGV4dGVuc2lvbnMga25vd24gYnkgdGhlIG11bHRpcGFydAogIGZvcm0gZ2VuZXJhdG9yLgoKLSBBZGRlZCBzb21lICNpZmRlZnMgYXJvdW5kIGhlYWRlciBmaWxlcyBhbmQgY2hhbmdlIHRoZSBFQUdBSU4gdGVzdCB0bwogIGZpeCBjb21waWxhdGlvbiBvbiBDZWxsIChyZXBvcnRlZCBieSBKZWZmIEN1cmxleSkuCgpZYW5nIFRzZSAoMTQgTm92IDIwMDgpCi0gRml4ZWQgc2V2ZXJhbCBjb25maWd1cmUgc2NyaXB0IGlzc3VlcyBhZmZlY3RpbmcgY2hlY2tzIGZvciBpbmV0X250b2FfcigpLAogIGluZXRfbnRvcCgpLCBpbmV0X3B0b24oKSwgZ2V0aWZhZGRycygpLCBmY250bCgpIGFuZCBnZXRhZGRyaW5mbygpLgoKWWFuZyBUc2UgKDEzIE5vdiAyMDA4KQotIFJlZmFjdG9yZWQgY29uZmlndXJlIHNjcmlwdCBkZXRlY3Rpb24gb2YgZnVuY3Rpb25zIHVzZWQgdG8gc2V0IHNvY2tldHMgaW50bwogIG5vbi1ibG9ja2luZyBtb2RlLCBhbmQgZGVjb3VwbGUgZnVuY3Rpb24gZGV0ZWN0aW9uIGZyb20gZnVuY3Rpb24gY2FwYWJpbGl0eS4KClZlcnNpb24gNy4xOS4yICgxMyBOb3ZlbWJlciAyMDA4KQoKTWljaGFsIE1hcmVrICgxMyBOb3YgMjAwOCkKLSBGaXhlZCBhIHBvdGVudGlhbCBkYXRhIGxvc3MgaW4gQ3VybF9jbGllbnRfd3JpdGUoKSB3aGVuIHRoZSB0cmFuc2ZlciBpcwogIHBhdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTm92IDIwMDgpCi0gUmFpbmVyIENhbmF2YW4gZmlsZWQgYnVnICMyMjU1NjI3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyNTU2MjcpIHdoaWNoIHBvaW50ZWQgb3V0IHRoYXQgYQogIHByb2dyYW0gdXNpbmcgbGliY3VybCdzIG11bHRpIGludGVyZmFjZSB0byBkb3dubG9hZCBhIEhUVFBTIHBhZ2Ugd2l0aCBhCiAgbGliY3VybCBidWlsdCBwb3dlcmVkIGJ5IE9wZW5TU0wsIHdvdWxkIGVhc2lseSBnZXQgc2lsbHkgYW5kIGluc3RlYWQgaGFuZAogIG92ZXIgU1NMIGRldGFpbHMgYXMgZGF0YSBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgSFRUUCBoZWFkZXJzIGFuZCBib2R5LiBUaGlzCiAgaGFwcGVuZWQgYmVjYXVzZSBsaWJjdXJsIHdvdWxkIGNvbnNpZGVyIHRoZSBjb25uZWN0aW9uIGhhbmRzaGFrZSBkb25lIHRvbwogIGVhcmx5LiBUaGlzIHByb2JsZW0gd2FzIGludHJvZHVjZWQgYXQgU2VwdGVtYmVyIDIybmQgMjAwOCB3aXRoIG15IGZpeCBvZiB0aGUKICBidWcgIzIxMDczNzcKCiAgVGhlIGNvcnJlY3QgZml4IGlzIG5vdyBpbnN0ZWFkIGRvbmUgd2l0aGluIHRoZSBHbnVUTFMtaGFuZGxpbmcgY29kZSwgYXMgYm90aAogIHRoZSBPcGVuU1NMIGFuZCB0aGUgTlNTIGNvZGUgYWxyZWFkeSBkZWFsIHdpdGggdGhpcyBzaXR1YXRpb24gaW4gc2ltaWxhcgogIGZhc2hpb24uIEkgYWRkZWQgdGVzdCBjYXNlIDU2MCBpbiBhbiBhdHRlbXB0IHRvIHZlcmlmeSB0aGlzIGZpeCwgYnV0CiAgdW5mb3J0dW5hdGVseSBpdCBkaWRuJ3QgdHJpZ2dlciBpdCBldmVuIGJlZm9yZSB0aGlzIGZpeCEKCllhbmcgVHNlICgxMSBOb3YgMjAwOCkKLSBSZWxhdGVkIHdpdGggYnVnICMyMjMwNTM1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMjMwNTM1KQogIERhbmllbCBGYW5kcmljaCBub3RpY2VkIHRoYXQgY3VybF9hZGRyaW5mbyB3YXMgYWxzbyBtaXNzaW5nIGluIHRoZSBidWlsZAogIHByb2Nlc3Mgb2Ygb3RoZXIgZm91ciBub24tY29uZmlndXJlIHBsYXRmb3Jtcy4gQWRkZWQgbm93LgoKRGFuaWVsIEZhbmRyaWNoICg3IE5vdiAyMDA4KQotIFRoZSBnZXRpZmFkZHJzKCkgdmVyc2lvbiBvZiBDdXJsX2lmMmlwKCkgY3Jhc2hlZCB3aGVuIHVzZWQgb24gYSBMaW51eAogIHN5c3RlbSB3aXRoIGEgVEVRTCBsb2FkLWJhbGFuY2luZyBkZXZpY2UgY29uZmlndXJlZCwgd2hpY2ggZG9lc24ndAogIGhhdmUgYW4gYWRkcmVzcy4gIFRoYW5rcyB0byBBZGFtIFNhbXBzb24gZm9yIHNwb3R0aW5nIHRoaXMgKGJ1ZyAjMjIzNDkyMykuCgpZYW5nIFRzZSAoNiBOb3YgMjAwOCkKLSBNZXJnZWQgZXhpc3RpbmcgSVB2NCBhbmQgSVB2NiBDdXJsX2lwMmFkZHIgZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgb25lCiAgd2hpY2ggbm93IGFsc28gdGFrZXMgYSBwcm90b2NvbCBhZGRyZXNzIGZhbWlseSBhcmd1bWVudC4KCi0gQnVnICMyMjMwNTM1IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMjMwNTM1KSBwb2ludGVkIG91dCBhCiAgcHJvYmxlbSB3aXRoIE1TVkMgNiBtYWtlZmlsZSB0aGF0IGNhdXNlZCBhIGJ1aWxkIGZhaWx1cmUuIEl0IHdhcyBub3RlZCB0aGF0CiAgdGhlIGN1cmxfYWRkcmluZm8ub2JqIHJlZmVyZW5jZSB3YXMgbWlzc2luZy4gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byBzb3J0CiAgdGhlIGxpc3QgaW4gd2hpY2ggdGhpcyB3YXMgbWlzc2luZy4gSXNzdWUgc3VibWl0dGVkIGJ5IEpvaG4gV2lsa2luc29uLgoKVmVyc2lvbiA3LjE5LjEgKDUgTm92ZW1iZXIgMjAwOCkKCkRhbmllbCBTdGVuYmVyZyAoNCBOb3YgMjAwOCkKLSBDVVJMSU5GT19GSUxFVElNRSBub3cgd29ya3MgZm9yIGZpbGU6Ly8gdHJhbnNmZXJzIGFzIHdlbGwKCkRhbmllbCBTdGVuYmVyZyAoMyBOb3YgMjAwOCkKLSBCdWcgIzIyMTg0ODAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMTg0ODApIHBvaW50ZWQgb3V0IGEKICBwcm9ibGVtIHdpdGggbXkgQ1VSTElORk9fUFJJTUFSWV9JUCBmaXggZnJvbSBPY3RvYmVyIDd0aCB0aGF0IGNhdXNlZCBhIE5VTEwKICBwb2ludGVyIHJlYWQuIEkgYWxzbyB0b29rIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCB0aGlzIGxvZ2ljIChzdG9yaW5nIG9mCiAgdGhlIGNvbm5lY3Rpb24ncyBJUCBhZGRyZXNzKSBzb21ld2hhdCBhcyB3ZSBoYWQgaXQgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQKICBwbGFjZXMgYW5kIHdheXMgcHJldmlvdXNseSBhbmQgdGhleSBhcmUgbm93IHVuaWZpZWQuCgpZYW5nIFRzZSAoMyBOb3YgMjAwOCkKLSBGaXggdW5kZXJzaXplZCBJUHY2IGFkZHJlc3MgaW50ZXJuYWwgYnVmZmVyLiBJUHY2IGFkZHJlc3Mgc3RyaW5ncyBsb25nZXIKICB0aGFuIDM1IGNoYXJhY3RlcnMgd291bGQgYmUgdHJ1bmNhdGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyIE5vdiAyMDA4KQotIERhbmllbCBKb2huc29uIHJlcG9ydGVkIGFuZCBmaXhlZDoKCiAgV2hlbiBjLWFyZXMgaXNuJ3QgZW5hYmxlZCwgbGliY3VybCBieSBkZWZhdWx0IGNhbGxzIGdldGFkZHJpbmZvIHdpdGggZmFtaWx5CiAgc2V0IHRvIFBGX1VOU1BFQyB3aGljaCBjYXVzZXMgZ2V0YWRkcmluZm8gdG8gcmV0dXJuIGFsbCBhdmFpbGFibGUgYWRkcmVzc2VzLAogIGJvdGggSVB2NCBhbmQgSVB2Ni4gTGliY3VybCB0aGVuIHRyaWVzIGVhY2ggb25lIHVudGlsIGl0IGNhbiBjb25uZWN0LiBJZiB0aGUKICBuZXQgY29ubmVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgSVB2NiwgbGliY3VybCBjYW4gc3RpbGwgZmFsbCBiYWNrIHRvIElQdjQuCgogIEhvd2V2ZXIsIHNpbmNlIGMtYXJlcyBkb2Vzbid0IHN1cHBvcnQgUEZfVU5TUEVDLCB3aGVuIGl0J3MgdXNlZCBpdCBkZWZhdWx0cwogIHRvIHVzaW5nIGZhbWlseT1QRl9JTkVUNiBhbmQgdGhlcmVmb3JlIG9ubHkgcmV0dXJucyBJUHY2IGFkZHJlc3NlcyB3aGVuIEFBQUEKICByZWNvcmRzIGFyZSBhdmFpbGFibGUsIGV2ZW4gaWYgSVB2NCBhZGRyZXNzZXMgYXJlIGFsc28gYXZhaWxhYmxlLiBUaGUgZWZmZWN0CiAgaXMgdGhhdCBzaW5jZSBteSBJU1AgZG9lc24ndCBkbyBJUHY2LCBsaWJjdXJsIGNhbid0IGNvbm5lY3QgYXQgYWxsIHRvIGEgc2l0ZQogIHRoYXQgaGFzIEFBQUEgcmVjb3Jkcy4gSXQgd2lsbCB3b3JrIGlmIEkgZXhwbGljaXRseSB1c2UgQ1VSTF9JUFJFU09MVkVfVjQgb3IKICAtLWlwdjQgd2l0aCB0aGUgY3VybCB0b29sLiBJIGRpc2NvdmVyZWQgdGhpcyB3aGVuIGN1cmwgd291bGQgZmFpbCB0byBjb25uZWN0CiAgdG8gc2VlbWluZ2x5IHJhbmRvbSBzaXRlcy4gSXQgdHVybnMgb3V0IHRoZXkgd2VyZW4ndCByYW5kb20sIHRoZXkgd2VyZSBzaXRlcwogIHdpdGggQUFBQSByZWNvcmRzLgoKICBTbyBub3cgbGliY3VybCBkZWZhdWx0cyB0byBQRl9JTkVULi4uIHVudGlsIGMtYXJlcyBoYXMgYmVlbiB0b3VnaHQgdG8gb2ZmZXIKICBib3RoLgoKWWFuZyBUc2UgKDMxIE9jdCAyMDA4KQotIFRlc3RzIDU1OCBhbmQgNTU5IGFyZSBzdGFiaWxpemVkLiBUaGVzZSB0d28gdGVzdHMgd2VyZSBpbml0aWFsbHkgaW50cm9kdWNlZAogIHRvIGFpZCBpbiB0aGUgbG9jYXRpb24gb2YgYSBzZWctZmF1bHQgd2hpY2ggd2FzIG9ubHkgdHJpZ2dlcmVkIG9uIG5vbi1kZWJ1ZwogIGJ1aWxkcyBkb25lIHdpdGggdGhlIGljYyA5LjEgSW50ZWwgY29tcGlsZXIuIFRlc3QgNTU4IGRvZXMgbm90IHRyaWdnZXIgdGhlCiAgcHJvYmxlbSwgYnV0IHRlc3QgNTU5IGRvZXMgdHJpZ2dlciBpdC4gQXMgb2YgdG9kYXksIGl0IGlzbid0IHlldCBhYnNvbHV0ZWx5CiAgY2xlYXIgaWYgaXQgaXMgYSBjb21waWxlciBvcHRpbWl6ZXIgaXNzdWUgb3IgYSBtZW1vcnkgY29ycnVwdGlvbiBvbmUuCgpZYW5nIFRzZSAoMzAgT2N0IDIwMDgpCi0gVXNlIG91ciBDdXJsX2FkZHJpbmZvIHN0cnVjdHVyZSBkZWZpbml0aW9uIHRvIGhhbmRsZSBhZGRyZXNzIGluZm8gZGF0YSBldmVuCiAgd2hlbiBhIHN5c3RlbSBhZGRyaW5mbyBzdHJ1Y3QgaXMgYXZhaWxhYmxlLiBQcm92aWRlIGFuZCB1c2UgYSB3cmFwcGVyIGFyb3VuZAogIHN5c3RlbXMgZ2V0YWRkcmluZm8gZnVuY3Rpb24sIEN1cmxfZ2V0YWRkcmluZm9fZXggd2hpY2ggcmV0dXJucyBhIHBvaW50ZXIgdG8KICBhIGxpc3Qgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIEN1cmxfYWRkcmluZm8gc3RydWN0cy4KCiAgQ29uZmlndXJlIHdpbGwgY2hlY2sgZnJlZWFkZHJpbmZvIGFuZCBnZXRhZGRyaW5mbyBmdW5jdGlvbnMgYW5kIGRlZmluZQogIHByZXByb2Nlc3NvciBzeW1ib2xzIEhBVkVfRlJFRUFERFJJTkZPIGFuZCBIQVZFX0dFVEFERFJJTkZPIHdoZW4gYXBwcm9wcmlhdGUuCgpEYW5pZWwgRmFuZHJpY2ggKDI5IE9jdCAyMDA4KQotIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGEgZmV3IGJ5dGVzIG9mIGdhcmJhZ2UgdG8gYmUgc2VudCBhZnRlciBhCiAgY3VybF9lYXN5X3BhdXNlKCkgZHVyaW5nIGEgY2h1bmt5IHVwbG9hZC4gUmVwb3J0ZWQgYnkgU3RldmUgUm9za293c2tpLgoKRGFuaWVsIEZhbmRyaWNoICgyOCBPY3QgMjAwOCkKLSBDaGFuZ2VkIHRoZSAicmVzb2x2ZSIgdGVzdCBwcmVjaGVjayBwcm9ncmFtIHRvIHZlcmlmeSB0aGF0IGFuIElQdjYgc29ja2V0CiAgY2FuIGJlIGNyZWF0ZWQgYmVmb3JlIHJlc29sdmluZyB0aGUgSVB2NiBuYW1lLiAgSW4gdGhlIGNvbnRleHQgb2YgcnVubmluZwogIGEgdGVzdCwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJ1biBhbiBJUHY2IHRlc3Qgd2hlbiBhIGhvc3QgaXMgcmVzb2x2YWJsZQogIGJ1dCBJUHY2IGlzbid0IHVzYWJsZS4gIFRoaXMgc2hvdWxkIGZpeCBmYWlsdXJlcyBvZiB0ZXN0IDEwODUgb24gaG9zdHMgd2l0aAogIGxpYnJhcnkgYW5kIEROUyBzdXBwb3J0IGZvciBJUHY2IGJ1dCB3aGVyZSBhY3R1YWwgdXNlIG9mIElQdjYgaGFzIGJlZW4KICBhZG1pbmlzdHJhdGl2ZWx5IGRpc2FibGVkLgoKRGFuaWVsIEZhbmRyaWNoICgyNCBPY3QgMjAwOCkKLSBBZGRlZCBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgemxpYiBhbmQgT3BlblNTTCBvbiBTeW1iaWFuIE9TLgoKRGFuaWVsIEZhbmRyaWNoICgyMSBPY3QgMjAwOCkKLSBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggU0ZUUCByYW5nZSBzdXBwb3J0IHRvIGZpeCB0ZXN0IGNhc2VzIDYzNCB0aHJvdWdoCiAgNjM3LgoKRGFuaWVsIEZhbmRyaWNoICgxNyBPY3QgMjAwOCkKLSBGaXhlZCBhIGNvbXBpbGUgZXJyb3IgcmVwb3J0ZWQgYnkgQWxiZXJ0IENoaW4gb24gQUlYIGFuZCBJUklYIHdoZW4gdXNpbmcKICBHVExTLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBPY3QgMjAwOCkKLSBJZ29yIE5vdm9zZWx0c2V2IGFkZGVkIENVUkxPUFRfUFJPWFlVU0VSIGFuZCBDVVJMT1BUX1BST1hZUEFTU1dPUkQgdGhhdCB0aGVuCiAgbWFrZSBDVVJMT1BUX1BST1hZVVNFUlBXRCBzb3J0IG9mIGRlcHJlY2F0ZWQuIFRoZSBwcmltYXJ5IG1vdGl2ZSBmb3IgYWRkaW5nCiAgdGhlc2UgbmV3IG9wdGlvbnMgaXMgdGhhdCB0aGV5IGhhdmUgbm8gcHJvYmxlbXMgd2l0aCB0aGUgY29sb24gc2VwYXJhdG9yCiAgdGhhdCB0aGUgQ1VSTE9QVF9QUk9YWVVTRVJQV0Qgb3B0aW9uIGRvZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IE9jdCAyMDA4KQotIFBhc2NhbCBUZXJqYW4gZmlsZWQgYnVnICMyMTU0NjI3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIxNTQ2MjcpIHdoaWNoIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybAogIHVzZXMgc3RyY2FzZWNtcCgpIGluIG11bHRpcGxlIHBsYWNlcyB3aGVyZSBpdCBjYXVzZXMgZmFpbHVyZXMgd2hlbiB0aGUKICBUdXJraXNoIGxvY2FsZSBpcyB1c2VkLiBUaGlzIGlzIGJlY2F1c2UgJ2knIGFuZCAnSScgaXNuJ3QgdGhlIHNhbWUgbGV0dGVyIHNvCiAgc3RyY2FzZWNtcCgpIG9uIHRob3NlIGxldHRlcnMgYXJlIGRpZmZlcmVudCBpbiBUdXJraXNoIHRoYW4gaW4gRW5nbGlzaCAob3IKICBqdXN0IGFib3V0IGFsbCBvdGhlciBsYW5ndWFnZXMpLiBJIHRodXMgaW50cm9kdWNlZCBhIHRvdGFsbHkgbmV3IGludGVybmFsCiAgZnVuY3Rpb24gaW4gbGliY3VybCAoY2FsbGVkIEN1cmxfcmF3X2VxdWFsKSBmb3IgZG9pbmcgY2FzZSBpbnNlbnRpdmUKICBjb21wYXJpc29ucyBmb3IgZW5nbGlzaC0oYXNjaWk/KSBzdHlsZSBzdHJpbmdzIHRoYXQgdGh1cyB3aWxsIG1ha2UgImZpbGUiCiAgYW5kICJGSUxFIiBtYXRjaCBldmVuIGlmIHRoZSBUdXJraXNoIGxvY2FsZSBpcyBzZWxlY3RlZC4KCkRhbmllbCBGYW5kcmljaCAoMTUgT2N0IDIwMDgpCi0gQSA8cHJlY2hlY2s+IGNvbW1hbmQgaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZCBpZiBpdCByZXR1cm5zIGEgbm9uLXplcm8KICByZXR1cm4gY29kZS4gIFRoaXMgd2F5LCBpZiB0aGUgcHJlY2hlY2sgY29tbWFuZCBjYW4ndCBiZSBydW4gYXQgYWxsIGZvcgogIHdoYXRldmVyIHJlYXNvbiwgaXQncyB0cmVhdGVkIGFzIGEgcHJlY2hlY2sgZmFpbHVyZSB3aGljaCBjYXVzZXMgdGhlCiAgdGVzdCB0byBiZSBza2lwcGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgxNSBPY3QgMjAwOCkKLSBKb2huIFdpbGtpbnNvbiBmaWxlZCBidWcgIzIxNTU0OTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjE1NTQ5NikgcG9pbnRpbmcgb3V0IGFuIGVycm9yIGNhc2UKICB3aXRob3V0IGEgcHJvcGVyIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuIFdoZW4gYSByZWFkIGNhbGxiYWNrIHJldHVybnMKICBhIHRvbyBsYXJnZSB2YWx1ZSAobGlrZSB3aGVuIHRyeWluZyB0byByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIpIGl0IHdvdWxkCiAgdHJpZ2dlciBhbmQgdGhlIGdlbmVyaWMgZXJyb3IgbWVzc2FnZSB0aGVuIG1ha2VzIHRoZSBwcm9wbGVtIHNsaWdodGx5CiAgZGlmZmVyZW50IHRvIHRyYWNrIGRvd24uIEkndmUgYWRkZWQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBub3cuCgpEYW5pZWwgRmFuZHJpY2ggKDkgT2N0IDIwMDgpCi0gRml4ZWQgdGhlIC0taW50ZXJmYWNlIG9wdGlvbiB0byB3b3JrIHdpdGggSVB2NiBjb25uZWN0aW9ucyBvbiBnbGliYwogIHN5c3RlbXMgc3VwcG9ydGluZyBnZXRpZmFkZHJzKCkuIEFsc28gZml4ZWQgYSBwcm9ibGVtIHdoZXJlIGFuIElQdjYKICBhZGRyZXNzIGNvdWxkIGJlIGNob3NlbiBpbnN0ZWFkIG9mIGFuIElQdjQgb25lIGZvciAtLWludGVyZmFjZSB3aGVuIGl0CiAgaW52b2x2ZWQgYSBuYW1lIGxvb2t1cC4KCkRhbmllbCBGYW5kcmljaCAoOCBPY3QgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDgyIHRocm91Z2ggMTA4NSB0byB0ZXN0IHN5bWJvbGljIC0taW50ZXJmYWNlIHBhcmFtZXRlcnMKCi0gQWRkZWQgdGVzdHMgNjMzIHRocm91Z2ggNjM3IHRvIHRlc3QgdGhlIG5ldyBmaWxlIHJhbmdlIHN1cHBvcnQgZm9yIFNGVFAuCiAgQWxsIGJ1dCB0aGUgZmlyc3QgdGVzdCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIG9yIG90aGVyIGZhaWx1cmUgYW5kIHNvCiAgYXJlIGFkZGVkIHRvIERJU0FCTEVELgoKRGFuaWVsIFN0ZW5iZXJnICg4IE9jdCAyMDA4KQotIEpvaG4gV2lsa2luc29uIGZpbGVkIGJ1ZyAjMjE1MjI3MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTUyMjcwKSB3aGljaCBpZGVudGlmaWVkIGFuZCBmaXhlZCBhCiAgQ1VSTElORk9fUkVESVJFQ1RfVVJMIG1lbW9yeSBsZWFrIGFuZCBhbiBhZGRpdGlvbmFsIHdyb25nLWRvaW5nOgoKICBBbnkgc3Vic2VxdWVudCB0cmFuc2ZlciB3aXRoIGEgcmVkaXJlY3QgbGVha3MgbWVtb3J5LCBldmVudHVhbGx5IGNyYXNoaW5nCiAgdGhlIHByb2Nlc3MgcG90ZW50aWFsbHkuCgogIEFueSBzdWJzZXF1ZW50IHRyYW5zZmVyIFdJVEhPVVQgYSByZWRpcmVjdCBjYXVzZXMgdGhlIG1vc3QgcmVjZW50IHJlZGlyZWN0CiAgdGhhdCBESUQgb2NjdXIgb24gc29tZSBwcmV2aW91cyB0cmFuc2ZlciB0byBzdGlsbCBiZSByZXBvcnRlZC4KCi0gSWdvciBOb3Zvc2VsdHNldiBmaWxlZCBidWcgIzIxMTE2MTMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjExMTYxMykgdGhhdCBldmVudHVhbGx5IGlkZW50aWZpZWQgYQogIGZsYXcgaW4gaG93IHRoZSBtdWx0aV9zb2NrZXQgaW50ZXJmYWNlIGluIHNvbWUgY2FzZXMgbWlzc2VkIHRvIGNhbGwgdGhlCiAgdGltZW91dCBjYWxsYmFjayB3aGVuIGVhc3kgaW50ZXJmYWNlcyBhcmUgcmVtb3ZlZCBhbmQgYWRkZWQgd2l0aGluIHRoZSBzYW1lCiAgbWlsbGlzZWNvbmQuCgotIElnb3IgTm92b3NlbHRzZXYgYnJvdWdodCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCB0d28gbmV3IG9wdGlvbnMgdG8KICBjdXJsX2Vhc3lfc2V0b3B0OiBDVVJMT1BUX1VTRVJOQU1FIGFuZCBDVVJMT1BUX1BBU1NXT1JEIHRoYXQgc29ydCBvZgogIGRlcHJlY2F0ZXMgdGhlIGdvb2Qgb2xkIENVUkxPUFRfVVNFUlBXRCBzaW5jZSB0aGV5IGFsbG93IGFwcGxpY2F0aW9ucyB0byBzZXQKICB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpbmRlcGVuZGVudGx5IGFuZCBwZXJoYXBzIG1vcmUgaW1wb3J0YW50bHkgYWxsb3cKICBib3RoIHRvIGNvbnRhaW4gY29sb24ocykgd2hpY2ggQ1VSTE9QVF9VU0VSUFdEIGRvZXNuJ3QgZnVsbHkgc3VwcG9ydC4KCkRhbmllbCBGYW5kcmljaCAoNyBPY3QgMjAwOCkKLSBDaGFuZ2VkIHRoZSBoYW5kbGluZyBvZiByZWFkL3dyaXRlIGVycm9ycyBpbiBDdXJsX3BlcmZvcm0oKSB0byBhbGxvdyBhCiAgYSBmcmVzaCBjb25uZWN0aW9uIHRvIGJlIG1hZGUgaW4gc3VjaCBjYXNlcyBhbmQgdGhlIHJlcXVlc3QgcmV0cmFuc21pdHRlZC4KICBUaGlzIHNob3VsZCBmaXggdGVzdCBjYXNlIDE2MC4gIEFkZGVkIHRlc3QgY2FzZSAxMDc5IGluIGFuIGF0dGVtcHQgdG8KICB0ZXN0IGEgc2ltaWxhciBjb25uZWN0aW9uIGRyb3BwaW5nIHNjZW5hcmlvLCBidXQgYXMgYSByYWNlIGNvbmRpdGlvbiwgaXQncwogIGhhcmQgdG8gdGVzdCByZWxpYWJseS4KCi0gQ3JlYXRlZCB0ZXN0IGNhc2VzIDEwODAgYW5kIDEwODEgdG8gcmVwcm9kdWNlIGEgcHJvYmxlbSBvZgogIENVUkxJTkZPX1JFRElSRUNUX1VSTCBsZWFraW5nIG1lbW9yeSBhbmQgcmV0dXJuaW5nIGluY29ycmVjdCByZXN1bHRzIHdoZW4KICB0d28gVVJMcyBhcmUgcmVxdWVzdGVkLiBSZXBvcnRlZCBieSB2bXBkZW1vIGluIGJ1ZyAjMjE1MjI3MAoKRGFuaWVsIFN0ZW5iZXJnICg3IE9jdCAyMDA4KQotIEZpeGVkIENVUkxJTkZPX1BSSU1BUllfSVA6IFdoZW4gbGliY3VybCBjcmVhdGVkIGEgY29ubmVjdGlvbiB0byBob3N0IEEgdGhlbgogIHRoZSBhcHAgcmUtdXNlZCB0aGUgaGFuZGxlIHRvIGRvIGEgY29ubmVjdGlvbiB0byBob3N0IEIgYW5kIHRoZW4gYWdhaW4KICByZS11c2VkIHRoZSBoYW5kbGUgdG8gaG9zdCBBLCBpdCB3b3VsZCBub3QgdXBkYXRlIHRoZSBpbmZvIHdpdGggaG9zdCBBJ3MgSVAKICBhZGRyZXNzIChkdWUgdG8gdGhlIGNvbm5lY3Rpb24gYmVpbmcgcmUtdXNlZCkgYnV0IGl0IHdvdWxkIGluc3RlYWQgcmVwb3J0CiAgdGhlIGluZm8gZnJvbSBob3N0IEIuCgpZYW5nIFRzZSAoNyBPY3QgMjAwOCkKLSBBZGRlZCAtLWVuYWJsZS1vcHRpbWl6ZSBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBjb21waWxlcgogIG9wdGltaXphdGlvbnMgdG8gYWxsb3cgZGVjb3VwbGVkIHNldHRpbmcgZnJvbSAtLWVuYWJsZS1kZWJ1Zy4KCllhbmcgVHNlICgyIE9jdCAyMDA4KQotIEFkZGVkIC0tZW5hYmxlLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHN0cmljdAogIGNvbXBpbGVyIHdhcm5pbmdzIHRvIGFsbG93IGRlY291cGxlZCBzZXR0aW5nIGZyb20gLS1lbmFibGUtZGVidWcuCgogIHJ1bnRlc3RzLnBsIHdpbGwgbm93IHJ1biB3aXRoIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIGVuYWJsZWQgdW5sZXNzCiAgZXhwbGljaXRseSBkaXNhYmxlZC4KCkRhbmllbCBGYW5kcmljaCAoMSBPY3QgMjAwOCkKLSAibWFrZSBjbGVhbiIgbm93IGNsZWFucyBvdXQgdGhlIGRvY3MgYW5kIHRlc3RzIGRpcmVjdG9yaWVzLCB0b28uCgpEYW5pZWwgU3RlbmJlcmcgKDMwIFNlcCAyMDA4KQotIFRoZSBsaWJjdXJsIEZUUCBjb2RlIG5vdyByZXR1cm5zIENVUkxFX1JFTU9URV9GSUxFX05PVF9GT1VORCBlcnJvciB3aGVuIFNJWkUKICBnZXRzIGEgNTUwIHJlc3BvbnNlIGJhY2sgZm9yIHRoZSBjYXNlcyB3aGVyZSBhIGRvd25sb2FkIChvciBOT0JPRFkpIGlzCiAgd2FudGVkLiBJdCBzdGlsbCBhbGxvd3MgYSA1NTAgYXMgcmVzcG9uc2UgaWYgdGhlIFNJWkUgaXMgdXNlZCBhcyBwYXJ0IG9mIGFuCiAgdXBsb2FkIHByb2Nlc3MgKGxpa2UgaWYgcmVzdW1pbmcgYW4gdXBsb2FkIGlzIHJlcXVlc3RlZCBhbmQgdGhlIGZpbGUgaXNuJ3QKICB0aGVyZSBiZWZvcmUgdGhlIHVwbG9hZCkuIEkgYWxzbyBtb2RpZmllZCB0aGUgRlRQIHRlc3Qgc2VydmVyIGFuZCBhIGZldyB0ZXN0CiAgY2FzZXMgYWNjb3JkaW5nbHkgdG8gbWF0Y2ggdGhpcyBtb2RpZmllZCBiZWhhdmlvci4KCkRhbmllbCBTdGVuYmVyZyAoMjkgU2VwIDIwMDgpCi0gRGFuaWVsIEVnZ2VyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgeW91IHRvIGRpc2FibGUgcHJveHkgc3VwcG9ydCBpbgogIGxpYmN1cmwgdG8gc29tZXdoYXQgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBiaW5hcnkuIFJ1biBjb25maWd1cmUKICAtLWRpc2FibGUtcHJveHkuCgpEYW5pZWwgRmFuZHJpY2ggKDI5IFNlcCAyMDA4KQotIE1vdmVkIGFsbCBzaWduYWwtYmFzZWQgbmFtZSByZXNvbHV0aW9uIHRpbWVvdXQgaGFuZGxpbmcgaW50byBhIHNpbmdsZSBuZXcKICBDdXJsX3Jlc29sdl90aW1lb3V0IGZ1bmN0aW9uIHRvIHJlZHVjZSBjb3VwbGluZy4KCkRhbmllbCBTdGVuYmVyZyAoMjkgU2VwIDIwMDgpCi0gSWFuIEx5bmFnaCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIENVUkxPUFRfUkFOR0Ugd29yayBmaW5lIGZvciBTRlRQCiAgZG93bmxvYWRzIQoKLSBNYXhpbSBJdmFub3YgZmlsZWQgYnVnIHJlcG9ydCAjMjEwNzgwMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMTA3ODAzKSAibm8gQ1VSTElORk9fUkVESVJFQ1RfVVJMIGluCiAgbXVsdGkgbW9kZSIgdG9nZXRoZXIgd2l0aCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0uCgpEYW5pZWwgU3RlbmJlcmcgKDI1IFNlcCAyMDA4KQotIEVtYW51ZWxlIEJvdmlzaW8gc3VibWl0dGVkIGJ1ZyByZXBvcnQgIzIxMjY0MzUuIFdlIGZpeGVkIHRoZSBIVFRQIERpZ2VzdAogIGF1dGggY29kZSB0byBub3QgYmVoYXZlIGJhZGx5IHdoZW4gZ2V0dGluZyBhIGJsYW5rIHJlYWxtIHdpdGgKICByZWFsbT0iIi4gaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjEyNjQzNQoKRGFuaWVsIEZhbmRyaWNoICgyMyBTZXAgMjAwOCkKLSBNYWtlIHN1cmUgbm90IHRvIGRlcmVmZXJlbmNlIHRoZSB3cm9uZyBVcmxTdGF0ZSBwcm90byB1bmlvbiBtZW1iZXIgd2hlbgogIHN3aXRjaGluZyBmcm9tIG9uZSBwcm90b2NvbCB0byBhbm90aGVyIGluIGEgc2luZ2xlIHJlcXVlc3QgKGUuZy4KICByZWRpcmVjdGluZyBmcm9tIEhUVFAgdG8gRlRQIGFzIGluIHRlc3QgMTA1NSkgYnkgcmVzZXR0aW5nCiAgc3RhdGUuZXhwZWN0MTAwaGVhZGVyIGJlZm9yZSBldmVyeSByZXF1ZXN0LgoKRGFuaWVsIFN0ZW5iZXJnICgyMyBTZXAgMjAwOCkKLSBJbnRyb2R1Y2luZyBKYW1pZSBMb2tpZXIncyBmdW5jdGlvbiBmb3IgZGF0ZSB0byBlcG9jaCBjb252ZXJzaW9uIHVzZWQgaW4gdGhlCiAgZGF0ZSBwYXJzZXIgZnVuY3Rpb24uIFRoaXMgbWFrZXMgb3VyIGZ1bmN0aW9uIGxlc3MgZGVwZW5kZW50IG9uIHN5c3RlbS0KICBwcm92aWRlZCBmdW5jdGlvbnMgYW5kIGluc3RlYWQgd2UgZG8gYWxsIHRoZSBtYWdpYyBvdXJzZWx2ZXMuIFdlIGFsc28gbm8KICBsb25nZXIgZGVwZW5kIG9uIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gU3dpdGNoaW5nIHRvIG91ciBvd24gY29udmVydGVyCiAgaGFzIHNvbWUgc2lkZS1lZmZlY3QgYW5kIHRoZXkgYXJlIG5vdGVkIGhlcmUgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKHRha2VuCiAgZnJvbSBhIG1haWwgYnkgbXIgTG9raWVyKToKCiAgdGltZV90IGlzIG5vdCBtZWFzdXJlZCBpbiBzZWNvbmRzIGluIHRoZSBBTlNJIEMgc3RhbmRhcmQgLSBvciBldmVuIGNvdW50ZWQKICB1bmlmb3JtbHkgLSB3ZWlyZCBwbGF0Zm9ybXMgY2FuIHVzZSBvdGhlciBudW1lcmljIHJlcHJlc2VudGF0aW9ucyBvZiBkYXRlcwogIGluIHRpbWVfdCAtIGhlbmNlIHRoZSBkaWZmdGltZSgpIGZ1bmN0aW9uLgoKICBPbiBQT1NJWCB0aW1lX3QgaXMgbWVhc3VyZWQgaW4gVVRDIHNlY29uZHMsIHdoaWNoIG1lYW5zIG5vdCBpbmNsdWRpbmcgbGVhcAogIHNlY29uZHMuICBCdXQgaXQncyBtZW50aW9uZWQgaW4gYSBmZXcgcGxhY2VzIHRoYXQgc29tZSBvbGQgUE9TSVgtaXNoCiAgZW52aXJvbm1lbnRzIGluY2x1ZGUgbGVhcCBzZWNvbmRzIGluIHRoZWlyIHRpbWVfdCBjb3VudHMuLi4KCiAgSSdtIHByZXR0eSBzdXJlIFt0aGUgbmV3IGltcGxlbWVudGF0aW9uIGlzXSBjb3JyZWN0IG9uIGFueXRoaW5nIHRydWx5IFBPU0lYLgogIEFuZCBpdCdzIG9idmlvdXNseSBhIGxvdCBsZXNzIGRlcGVuZGVudCBvbiBwbGF0Zm9ybSBxdWlya3MgYW5kIGNvcm5lciBjYXNlcwogIGluIG1hbnkgd2F5cyB0aGFuIHRoZSBta3RpbWUoKSB2ZXJzaW9uLgoKLSBSb2IgQ3JpdHRlbmRlbiBicm91Z2h0IGEgcGF0Y2ggdG8gImFkZCBzb21lIGxvY2tpbmcgZm9yIHRocmVhZC1zYWZldHkgdG8gTlNTCiAgaW1wbGVtZW50YXRpb24iLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBTZXAgMjAwOCkKLSBNYWRlIHRoZSBTT0NLUyBjb2RlIHVzZSB0aGUgbmV3IEN1cmxfcmVhZF9wbGFpbigpIGZ1bmN0aW9uIHRvIGZpeCB0aGUgYnVnCiAgTWFya3VzIE1vZWxsZXIgcmVwb3J0ZWQ6IGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDgtMDkvMDAxNi5odG1sCgotIHJlY3YoKSBlcnJvcnMgb3RoZXIgdGhhbiB0aG9zZSBlcXVhbCB0byBFQUdBSU4gbm93IGNhdXNlIHByb3BlcgogIENVUkxFX1JFQ1ZfRVJST1IgdG8gZ2V0IHJldHVybmVkLiBUaGlzIG1hZGUgdGVzdCBjYXNlIDE2MCBmYWlsIHNvIEkndmUgbm93CiAgZGlzYWJsZWQgaXQgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZXhlcmNpc2UgdGhhdCBsb2dpYy4KCi0gTWljaGFlbCBHb2ZmaW91bCBmaWxlZCBidWcgcmVwb3J0ICMyMTA3Mzc3ICJQcm9ibGVtIHdpdGggbXVsdGkgKyBHbnVUTFMgKwogIHByb3h5IiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjEwNzM3NykgdGhhdCBzaG93ZWQgaG93IGEgbXVsdGkKICBpbnRlcmZhY2UgdXNpbmcgcHJvZ3JhbSBkaWRuJ3Qgd29yayB3aGVuIGJ1aWx0IHdpdGggR251VExTIGFuZCBhIENPTk5FQ1QKICByZXF1ZXN0IHdhcyBkb25lIG92ZXIgYSBwcm94eSAoYmFzaWNhbGx5IHRlc3QgNTAyIG92ZXIgYSBwcm94eSB0byBhIEhUVFBTCiAgc2l0ZSkuIEl0IHR1cm5lZCBvdXQgdGhlIHNzbCBjb25uZWN0IGZ1bmN0aW9uIHdvdWxkIGdldCBjYWxsZWQgdHdpY2Ugd2hpY2gKICBjYXVzZWQgdGhlIHNlY29uZCBjYWxsIHRvIGZhaWwuCgpEYW5pZWwgRmFuZHJpY2ggKDIyIFNlcCAyMDA4KQotIEZpeGVkIHRlc3QgNTM5IHRvIGhhbmRsZSBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiB0aGF0IHNob3dzIHVwIG5vdwogIHRoYXQgbWVtZGVidWcuaCBpcyBpbmNsdWRlZCBpbiB0aGUgdGVzdCBwcm9ncmFtcy4KCllhbmcgVHNlICgyMCBTZXAgMjAwOCkKLSBGaXggcmVncmVzc2lvbiBpbiBjb25maWd1cmUgc2NyaXB0IHdoaWNoIGFmZmVjdGVkIE9wZW5TU0wgYnVpbGRzIG9uIE1TWVMuCgpZYW5nIFRzZSAoMTkgU2VwIDIwMDgpCi0gY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGF2YWlsYWJpbGl0eSBvZiB0aGUgYWxhcm0oKSBmdW5jdGlvbi4KCkRhbmllbCBGYW5kcmljaCAoMTggU2VwIDIwMDgpCi0gRG9uJ3QgYm90aGVyIHRvIGluc3RhbGwgYSBTSUdBTFJNIGhhbmRsZXIgdW5sZXNzIGFsYXJtKCkgaXMgYXZhaWxhYmxlLgogIEFsc28sIGxlYXZlIHRoZSBleGlzdGluZyBTSUdBTFJNIGhhbmRsZXIgYWxvbmUgaWYgdGhlIHRpbWVvdXQgaXMgdG9vIHNtYWxsCiAgdG8gaGFuZGxlLgoKRGFuaWVsIEZhbmRyaWNoICgxNyBTZXAgMjAwOCkKLSBSZW1vdmVkIHJlZmVyZW5jZSB0byBjdXJsLWNhLWJ1bmRsZS5jcnQgaW4gdGhlIGhvc3QgdmVyaWZpY2F0aW9uIGZhaWx1cmUKICBlcnJvciBtZXNzYWdlLgoKWWFuZyBUc2UgKDE3IFNlcCAyMDA4KQotIEltcHJvdmUgY29uZmlndXJlIGRldGVjdGlvbiBvZiBnZXRob3N0bmFtZSgpLCBsb2NhbHRpbWVfcigpLCBzdHJzdHIoKSwKICBnZXRzZXJ2Ynlwb3J0X3IoKSwgZ2V0aG9zdGJ5YWRkcl9yKCkgYW5kIGdldGhvc3RieW5hbWVfcigpLgoKWWFuZyBUc2UgKDE0IFNlcCAyMDA4KQotIEltcHJvdmUgY29uZmlndXJlIGRldGVjdGlvbiBvZiBzdHJjYXNlY21wKCksIHN0cmNhc2VzdHIoKSwgc3RyY21waSgpLAogIHN0cmljbXAoKSwgc3RybGNhdCgpLCBzdHJuY2FzZWNtcCgpLCBzdHJuY21waSgpIGFuZCBzdHJuaWNtcCgpLgoKWWFuZyBUc2UgKDEzIFNlcCAyMDA4KQotIERpc2FibGUgdHJhY2tpbmcgb2YgZmRvcGVuKCkgY2FsbHMgaW4gdGhlIGxvdy1sZXZlbCBtZW1vcnkgbGVhayB0cmFja2luZwogIGNvZGUgd2hlbiBmZG9wZW4oKSBpcyBub3QgYXZhaWxhYmxlLCB0byBhdm9pZCBjb21waWxlciBlcnJvci4KCllhbmcgVHNlICgxMiBTZXAgMjAwOCkKLSBGdXJ0aGVyIGFkanVzdCBkZXRlY3Rpb24gb2Ygc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgcHJvY2VzcywgYW5kCiAgZW5zdXJlIHRoYXQgZXJybm8gaXMgbm90IG1vZGlmaWVkIGluc2lkZSBDdXJsX3N0cmVycm9yKCkuCgpZYW5nIFRzZSAoMTAgU2VwIDIwMDgpCi0gSW1wcm92ZSBkZXRlY3Rpb24gb2YgZ210aW1lX3IoKSwgc3RydG9sbCgpLCBzaWdhY3Rpb24oKSwgc3RydG9rX3IoKSwKICBzdHJkdXAoKSBhbmQgZnRydW5jYXRlKCkgaW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzLgoKRGFuaWVsIEZhbmRyaWNoICg5IFNlcCAyMDA4KQotIE1pa2UgUmV2aSBkaXNjb3ZlcmVkIHNvbWUgc3dhcHBlZCBzcGVlZCBzd2l0Y2hlcyBkb2N1bWVudGVkIGluIHRoZSBjdXJsIG1hbgogIHBhZ2UuCgotIENoZWNrZWQgaW4gc29tZSBkb2N1bWVudGF0aW9uIGFuZCBjb2RlIGltcHJvdmVtZW50cyBhbmQgZml4ZXMgdGhhdCBJCiAgZGlzY292ZXJlZCBpbiB0aGUgRnJlZUJTRCBwb3J0cyBzeXN0ZW0uCgpEYW5pZWwgU3RlbmJlcmcgKDggU2VwIDIwMDgpCi0gRG1pdHJ5IEt1cm9jaGtpbiBwYXRjaGVkIGEgcHJvYmxlbTogSSBoYXZlIGZvdW5kIGJ1ZyBpbiBwaXBlbGluaW5nIHRocm91Z2gKICBwcm94eS4gSSBoYXZlIGEgdHJhbnNwYXJlbnQgcHJveHkuIFdoZW4gcnVubmluZyB3aXRoIGh0dHBfcHJveHkgZW52aXJvbm1lbnQKICB2YXJpYWJsZSBub3Qgc2V0IG15IHRlc3QgY29tcGxldGVzIGZpbmUgKGl0IGdvZXMgdGhyb3VnaCB0cmFuc3BhcmVudAogIHByb3h5KS4gV2hlbiBJIHNldCBodHRwX3Byb3h5IHZhcmlhYmxlIG15IHRlc3QgaGFuZ3MgYWZ0ZXIgdGhlIGZpcnN0CiAgZG93bmxvYWRlZCBpcyBjb21wbGV0ZS4gTG9va3MgbGlrZSB0aGUgc2Vjb25kIGhhbmRsZSBuZXZlciBnZXRzIG91dCBmcm9tCiAgV0FJVERPIHN0YXRlLgoKICBUaGUgZml4OiBJdCBtYWtlcyBjaGVja1BlbmRQaXBlbGluZSBtb3ZlIDEgaGFuZGxlciBmcm9tIHBlbmQgcGlwZSB0byBzZW5kCiAgcGlwZSBpZiBwaXBlbGluaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyIGJ1dCB0aGVyZSBhcmUgbm8gaGFuZGxlcyBpbgogIHNlbmQgYW5kIHJlY3YgcGlwZXMuCgotIFN0ZWZhbiBLcmF1c2UgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHdvdWxkIHdyb25nbHkgc2VuZCBhd2F5IGNvb2tpZXMgdG8KICBzaXRlcyBpbiBjYXNlcyB3aGVyZSB0aGUgY29va2llIGNsZWFybHkgaGFzIGEgdmVyeSBvbGQgZXhwaXJ5IGRhdGUuIFRoZQogIGNvbmRpdGlvbiB3YXMgc2ltcGx5IHRoYXQgbGliY3VybCdzIGRhdGUgcGFyc2VyIHdvdWxkIGZhaWwgdG8gY29udmVydCB0aGUKICBkYXRlIGFuZCBpdCB3b3VsZCB0aGVuIGNvdW50IGFzIGEgKHRpbWVkLWJhc2VkKSBtYXRjaC4gU3RhcnRpbmcgbm93LCBhCiAgbWlzc2VkIGRhdGUgZHVlIHRvIGFuIHVuc3VwcG9ydGVkIGRhdGUgZm9ybWF0IG9yIGRhdGUgcmFuZ2Ugd2lsbCBub3cgY2F1c2UKICB0aGUgY29va2llIHRvIG5vdCBtYXRjaC4KCkRhbmllbCBGYW5kcmljaCAoNSBTZXAgMjAwOCkKLSBJbXByb3ZlZCB0aGUgbG9naWMgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIEhUVFAgMS4xIGZlYXR1cmVzIG9yIG5vdCBpbiBhCiAgcmVxdWVzdC4gIFNldHRpbmcgYSBzcGVjaWZpYyB2ZXJzaW9uIHdpdGggQ1VSTE9QVF9IVFRQX1ZFUlNJT04gb3ZlcnJpZGVzCiAgYWxsIG90aGVyIGNoZWNrcywgYnV0IG90aGVyd2lzZSwgYSAxLjAgcmVxdWVzdCB3aWxsIGJlIG1hZGUgaWYgdGhlIHNlcnZlcgogIGlzIGtub3duIHRvIHN1cHBvcnQgb25seSAxLjAgYmVjYXVzZSBpdCBwcmV2aW91c2x5IHJlc3BvbmRlZCBzbyBhbmQgdGhlCiAgY29ubmVjdGlvbiB3YXMga2VwdCBhbGl2ZSwgb3IgYSByZXNwb25zZSB0byBhIHByZXZpb3VzIHJlcXVlc3Qgb24gdGhpcyBoYW5kbGUKICBjYW1lIGJhY2sgYXMgMS4wLiBUaGUgbGF0dGVyIGNvdWxkIHRha2UgcGxhY2UgaW4gY2FzZXMgbGlrZSByZWRpcmVjdGlvbiBvcgogIGF1dGhlbnRpY2F0aW9uIHdoZXJlIHNldmVyYWwgcmVxdWVzdHMgaGF2ZSB0byBiZSBtYWRlIGJlZm9yZSB0aGUgb3BlcmF0aW9uCiAgaXMgY29tcGxldGUuICBJZiBhbnkgb25lIG9mIHRoZSBzZXJ2ZXJzIGluIGEgcmVkaXJlY3Rpb24gY2hhaW4gc3VwcG9ydHMgb25seQogIDEuMCwgdGhlbiByZW1haW5pbmcgcmVxdWVzdHMgd2lsbCBiZSBzZW50IGluIDEuMCBtb2RlLgoKLSBEZXRlY3QgY2FzZXMgd2hlcmUgYW4gdXBsb2FkIG11c3QgYmUgc2VudCBjaHVua2VkIGFuZCB0aGUgc2VydmVyIHN1cHBvcnRzCiAgb25seSBIVFRQIDEuMCBhbmQgcmV0dXJuIENVUkxFX1VQTE9BRF9GQUlMRUQuCgpEYW5pZWwgU3RlbmJlcmcgKDUgU2VwIDIwMDgpCi0gTWFydGluIERyYXNhciBwcm92aWRlZCB0aGUgQ1VSTE9QVF9QT1NUUkVESVIgcGF0Y2guIEl0IHJlbmFtZXMKICBDVVJMT1BUX1BPU1QzMDEgKGJ1dCBhZGRzIGEgZGVmaW5lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgeW91IHdobwogIGRvbid0IGRlZmluZSBDVVJMX05PX09MRElFUykuIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbm93IGFsc28gY2hhbmdlIHRoZQogIGxpYmN1cmwgYmVoYXZpb3IgZm9yIGEgSFRUUCByZXNwb25zZSAzMDIgYWZ0ZXIgYSBQT1NUIHRvIG5vdCB1c2UgR0VUIGluIHRoZQogIHN1YnNlcXVlbnQgcmVxdWVzdCAod2hlbiBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQpLiBJIGVkaXRlZCB0aGUKICBwYXRjaCBzb21ld2hhdCBiZWZvcmUgY29tbWl0LiBUaGUgY3VybCB0b29sIGdvdCBhIG1hdGNoaW5nIC0tcG9zdDMwMgogIG9wdGlvbi4gVGVzdCBjYXNlIDEwNzYgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKLSBJbnRyb2R1Y2luZyBDVVJMT1BUX0NFUlRJTkZPIGFuZCB0aGUgY29ycmVzcG9uZGluZyBDVVJMSU5GT19DRVJUSU5GTy4gQnkKICBlbmFibGluZyB0aGlzIGZlYXR1cmUgd2l0aCBDVVJMT1BUX0NFUlRJTkZPIGZvciBhIHJlcXVlc3QgdXNpbmcgU1NMIChIVFRQUwogIG9yIEZUUFMpLCBsaWJjdXJsIHdpbGwgZ2F0aGVyIGxvdHMgb2Ygc2VydmVyIGNlcnRpZmljYXRlIGluZm8gYW5kIHRoYXQgaW5mbwogIGNhbiB0aGVuIGdldCBleHRyYWN0ZWQgYnkgYSBjbGllbnQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCB3aXRoCiAgY3VybF9lYXN5X2dldGluZm8oKSdzIENVUkxJTkZPX0NFUlRJTkZPIG9wdGlvbi4gTGludXMgTmllbHNlbiBGZWx0emluZwogIGhlbHBlZCBtZSB0ZXN0IGFuZCBzbW9vdGhlbiBvdXQgdGhpcyBmZWF0dXJlLgoKICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGZlYXR1cmUgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBsaWJjdXJsIGJ1aWx0IHRvIHVzZQogIE9wZW5TU0wuCgogIFRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IG5ldHdvcmtpbmc0YWxsLmNvbSAtIHRoYW5rcyEKCi0gRG1pdHJpeSBTZXJnZXlldiBwb2ludGVkIG91dCB0aGF0IGN1cmxfZWFzeV9wYXVzZSgpIGRpZG4ndCB1bnBhdXNlIHByb3Blcmx5CiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucy4gSSBhbHNvIGNoYW5nZWQgdGhpcyBjb2RlIHRvIHVzZSByZWFsbG9jKCkgYmFzZWQKICBvbiBEYW5pZWwgRmFuZHJpY2gncyBzdWdnZXN0aW9uLgoKR3VlbnRlciBLbmF1ZiAoNCBTZXAgMjAwOCkKLSBNaW5nVzMyIG5vbi1jb25maWd1cmUgYnVpbGRzIGFyZSBub3cgbGFyZ2VmaWxlIGZlYXR1cmUgZW5hYmxlZCBieSBkZWZhdWx0LgogIE5ldFdhcmUgTElCQyBidWlsZHMgYXJlIGFsc28gbm93IGxhcmdlZmlsZSBmZWF0dXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KCllhbmcgVHNlICg0IFNlcCAyMDA4KQotIFNldmVyYWwgZml4ZXMgcmVsYXRlZCB3aXRoIHByaW50IGZvcm1hdHRpbmcgc3RyaW5nIGRpcmVjdGl2ZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDMgU2VwIDIwMDgpCi0gU2VhcmNoIGZvciB0aGUgRnJlZUJTRCBDQSBjZXJ0IGZpbGUgL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LmNydAoKRGFuaWVsIEZhbmRyaWNoICgyIFNlcCAyMDA4KQotIEZpeGVkIGFuIG91dCBvZiBtZW1vcnkgcHJvYmxlbSB0aGF0IGNhdXNlZCB0b3J0dXJlIHRlc3QgZmFpbHVyZXMgaW4gdGVzdHMKICA3MDYgYW5kIDcwNy4KCkRhbmllbCBTdGVuYmVyZyAoMiBTZXAgMjAwOCkKLSBLZWl0aCBNb2sgYWRkZWQgc3VwcG9ydGVkX3Byb3RvY29scyBhbmQgc3VwcG9ydGVkX2ZlYXR1cmVzIHRvIHRoZSBwa2ctY29uZmlnCiAgZmlsZSBmb3IgbGliY3VybCwgYW5kIHdoaWxlIGRvaW5nIHRoYXQgZml4IGhlIHVuaWZpZWQgd2l0aCBjdXJsLWNvbmZpZy5pbgogIGhvdyB0aGUgc3VwcG9ydGVkIHByb3RvY29scyBhbmQgZmVhdHVyZXMgYXJlIGV4dHJhY3RlZCBhbmQgdXNlZCwgc28gYm90aCB0aG9zZQogIHRvb2xzIHNob3VsZCBub3cgYWx3YXlzIGJlIHN5bmNlZC4KClZlcnNpb24gNy4xOS4wICgxIFNlcHRlbWJlciAyMDA4KQoKRGFuaWVsIEZhbmRyaWNoICgyOSBBdWcgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDcxIHRocm91Z2ggMTA3NCB0byB0ZXN0IGF1dG9tYXRpYyBkb3duZ3JhZGluZyBmcm9tIEhUVFAgMS4xCiAgdG8gSFRUUCAxLjAgdXBvbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBIVFRQIHNlcnZlci4gIFRlc3RzIDEwNzIKICBhbmQgMTA3MyBhcmUgc2ltaWxhciB0byB0ZXN0IDEwNjkgaW4gdGhhdCB0aGV5IGludm9sdmUgdGhlIGltcG9zc2libGUKICBzY2VuYXJpbyBvZiBzZW5kaW5nIGNodW5rZWQgZGF0YSB0byBhIEhUVFAgMS4wIHNlcnZlci4gIEFsbCB0aGVzZSBmYWlsCiAgYW5kIGFyZSBhZGRlZCB0byBESVNBQkxFRC4KCi0gQWRkZWQgdGVzdCAxMDc1IHRvIHRlc3QgLS1hbnlhdXRoIHdpdGggQmFzaWMgYXV0aGVudGljYXRpb24uCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEF1ZyAyMDA4KQotIFdoZW4gbGliY3VybCB3YXMgZG9pbmcgYSBIVFRQIFBPU1QgYW5kIHRoZSBzZXJ2ZXIgd291bGQgcmVzcG9uZCB3aXRoCiAgIkNvbm5lY3Rpb246IGNsb3NlIiBhbmQgYWN0dWFsbHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlCiAgcmVzcG9uc2UtYm9keSwgbGliY3VybCBjb3VsZCBzdGlsbCBoYXZlIG91dHN0YW5kaW5nIGRhdGEgdG8gc2VuZCBhbmQgaXQKICB3b3VsZCBub3QgcHJvcGVybHkgbm90aWNlIHRoaXMgYW5kIHN0b3Agc2VuZGluZy4gVGhpcyBjYXVzZWQgd2VpcmRuZXNzIGFuZAogIHNhZCBmYWNlcy4gaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjA4MDIyMgoKICBOb3RlIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHJlYXNvbnMgdG8gY29uc2lkZXIgbGliY3VybCdzIGJlaGF2aW9yIHdoZW4KICBnZXR0aW5nIGEgPj0gNDAwIHJlc3BvbnNlIGNvZGUgd2hpbGUgc2VuZGluZyBkYXRhLCBhcyBDcmFpZyBQZXJyYXMnIG5vdGUKICAiaHR0cCB1cGxvYWQ6IGhvdyB0byBzdG9wIG9uIGVycm9yIiBzcGVjaWZpZXM6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwOC0wOC8wMTM4Lmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMjggQXVnIDIwMDgpCi0gRGVuZ21pbndlbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgd291bGQgbG9jayBhIChjb29raWUpIHNoYXJlIHR3aWNlICh3aXRob3V0CiAgYW4gdW5sb2NrIGluIGJldHdlZW4pIGZvciBhIGNlcnRhaW4gY2FzZSBhbmQgdGhhdCBpbiBmYWN0IHdvcmtzIHdoZW4gdXNpbmcKICByZWd1bGFyIHdpbmRvd3MgbXV0ZXhlcyBidXQgbm90IHdpdGggcHRocmVhZHMnISBMb2NrcyBzaG91bGQgb2YgY291cnNlIG5vdAogIGdldCBsb2NrZWQgYWdhaW4gc28gdGhpcyBpcyBub3cgZml4ZWQuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA4LzA0MjIuaHRtbAoKLSBJJ20gYWJhbmRvbmluZyB0aGUgc3lzdGVtIHdpdGggdGhlIHdlYiBzaXRlIG1pcnJvcnMgKGJ1dCBrZWVwaW5nIGRvd25sb2FkCiAgZmlsZXMgYmluZyBtaXJyb3JlZCkgYW5kIHRodXMgSSd2ZSBjaGFuZ2VkIHRoZSBVUkwgaW4gdGhlIGNvb2tpZWphciBoZWFkZXIKICB0byBubyBsb25nZXIgdXNlIGN1cmxtLmhheHguc2UgYnV0IGluc3RlYWQgdXNlIHRoZSBtYWluIHNpdGUgY3VybC5oYXh4LnNlCgpEYW5pZWwgRmFuZHJpY2ggKDI3IEF1ZyAyMDA4KQotIEZpeGVkIHRlc3QgY2FzZSAxMDY1IGJ5IGNoYW5naW5nIHRoZSBoYW5kbGluZyBvZiBDVVJMT1BUX1VQTE9BRCB0byBzZXQKICB0aGUgSFRUUCBtZXRob2QgdG8gR0VUIChvciBIRUFEKSB3aGVuIGdpdmVuIGEgdmFsdWUgb2YgMC4KCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDY4IGFuZCAxMDY5IHRvIHRlc3QgYSBzaW1wbGUgSFRUUCBQVVQgZnJvbSBzdGRpbi4gIFRlc3QKICBjYXNlIDEwNjkgZmFpbHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byB0ZXN0IDEwNjUgc28gaXMgYWRkZWQgdG8gRElTQUJMRUQuCgpZYW5nIFRzZSAoMjcgQXVnIDIwMDgpCi0gRml4IGdlbmVyYXRpb24gb2YgTVMgVkM2IC5kc3AgZmlsZSB0byBtYWtlIGl0IHN1cHBvcnQgY29tcGlsYXRpb24gb2YgZWl0aGVyCiAgZHluYW1pYyAoRExMKSBvciBzdGF0aWMgKExJQikgbGliY3VybCBsaWJyYXJpZXMgaW4gZGVidWcgYW5kIHJlbGVhc2UgbW9kZXMuCgpEYW5pZWwgRmFuZHJpY2ggKDI2IEF1ZyAyMDA4KQotIEZpeGVkIG91dCBvZiBtZW1vcnkgcHJvYmxlbXMgdGhhdCBjYXVzZWQgdG9ydHVyZSB0ZXN0IGZhaWx1cmVzIGluIHRlc3RzCiAgMTAyMSBhbmQgMTA2Ny4KCllhbmcgVHNlICgyNiBBdWcgMjAwOCkKLSBBZGRlZCBjaGVjayBhbmQgc3ltYm9sIGRlZmluaXRpb24gZm9yIFdJTjMyIGZpbGUgQVBJIHVzYWdlIGluIGNvbmZpZ3VyZSwKICBzdXBwb3J0aW5nIGNvbmZpZ3VyZSdzIC0tZGlzYWJsZS1sYXJnZWZpbGUgb3B0aW9uIGZvciBXSU4zMiB0YXJnZXRzIGFsc28uCgotIE5vbi1jb25maWd1cmUgc3lzdGVtcyB3aGljaCBkbyBub3QgdXNlIGNvbmZpZy13aW4zMi5oIGNvbmZpZ3VyYXRpb24gZmlsZSwKICBhbmQgd2FudCB0byB1c2UgdGhlIFdJTjMyIGZpbGUgQVBJLCBtdXN0IGRlZmluZSBVU0VfV0lOMzJfTEFSR0VfRklMRVMgb3IKICBVU0VfV0lOMzJfU01BTExfRklMRVMgYXMgYXBwcm9wcmlhdGUgaW4gdGhlaXIgb3duIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIEF1ZyAyMDA4KQotIFJ1bm5pbmcgJ21ha2UgY2EtZmlyZWZveCcgaW4gdGhlIHJvb3QgYnVpbGQgZGlyIHdpbGwgbm93IHJ1biB0aGUgbmV3CiAgZmlyZWZveC1kYjJwZW0uc2ggY29udmVyc2lvbiBzY3JpcHQgdGhhdCBjb252ZXJ0cyBhIGxvY2FsIEZpcmVmb3ggZGIgb2YgY2EKICBjZXJ0cyBpbnRvIFBFTSBmb3JtYXQsIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBhIE9wZW5TU0wgb3IgR251VExTIGJ1aWx0CiAgbGliY3VybC4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZml4ZWQgYSBidWcgd2hlbiBkb2luZyBwcm94eSBDT05ORUNUIHdpdGggdGhlIG11bHRpCiAgaW50ZXJmYWNlLCBhbmQgdGhlIHByb3h5IHdvdWxkIHNlbmQgQ29ubmVjdGlvbjogY2xvc2UgZHVyaW5nIHRoZQogIGF1dGhlbnRpY2F0aW9uIHBoYXNlLiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjA2OTA0NwoKRGFuaWVsIEZhbmRyaWNoICgyMiBBdWcgMjAwOCkKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiAtLWR1bXAtaGVhZGVyIC0gd2FzIGdpdmVuIHdpdGggbW9yZSB0aGFuIG9uZSBVUkwsCiAgd2hpY2ggY2F1c2VkIGFuIGVycm9yIHdoZW4gdGhlIHNlY29uZCBoZWFkZXIgd2FzIGR1bXBlZCBkdWUgdG8gc3Rkb3V0CiAgYmVpbmcgY2xvc2VkLiAgQWRkZWQgdGVzdCBjYXNlIDEwNjYgdG8gdmVyaWZ5LiAgQWxzbyBmaXhlZCBhIHBvdGVudGlhbAogIHByb2JsZW0gd2hlcmUgYSBjbG9zZWQgZmlsZSBkZXNjcmlwdG9yIG1pZ2h0IGJlIHVzZWQgZm9yIGFuIHVwbG9hZAogIHdoZW4gbW9yZSB0aGFuIG9uZSBVUkwgaXMgZ2l2ZW4uCgpZYW5nIFRzZSAoMjIgQXVnIDIwMDgpCi0gSW1wcm92ZWQgbGliY3VybCdzIGludGVybmFsIGN1cmxfbSpwcmludGYoKSBmdW5jdGlvbnMgaW50ZWdyYWwgZGF0YSB0eXBlCiAgc2l6ZSBhbmQgc2lnbmVkbmVzcyBoYW5kbGluZy4KCi0gSW50ZXJuYWwgYWRqdXN0bWVudHMgdG8gYmV0dGVyIHNlbGVjdC9kaWZmZXJlbnRpYXRlIHdoZW4gbGFyZ2Uvc21hbGwgZmlsZQogIHN1cHBvcnQgaXMgcHJvdmlkZWQgdXNpbmcgV0lOMzIgZnVuY3Rpb25zIGRpcmVjdGx5LgoKRGFuaWVsIEZhbmRyaWNoICgyMCBBdWcgMjAwOCkKLSBBZGRlZCBhbiBlZGl0ZWQgdmVyc2lvbiBvZiBWaW5jZW50IExlIE5vcm1hbmQncyBkb2N1bWVudGF0aW9uIG9mIFNGVFAgcXVvdGUKICBjb21tYW5kcyB0byB0aGUgbWFuIHBhZ2VzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBBdWcgMjAwOCkKLSBQaGlsIFBlbGxvdWNob3VkIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdpbmRvd3MgdmVyc2lvbiBvZiBsaWJjdXJsIGhhZCBhCiAgbWVtb3J5IGxlYWsgYmVjYXVzZSBpdCBuZXZlciBjYWxsZWQgdGhlIE9wZW5TU0wgZnVuY3Rpb24KICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpIGFzIGl0IHdhcyBzdXBwb3NlZCB0by4gVGhpcyB3YXMgYmVjYXVzZSBvZiBhCiAgbWlzc2luZyBkZWZpbmUgaW4gY29uZmlnLXdpbjMyLmghCgpHaXNsZSBWYW5lbSAoMTggQXVnIDIwMDgpCi0gVXBkYXRlZCBsaWIvTWFrZWZpbGUuV2F0Y29tIHdpdGggdGhlIG9wdGlvbiB0byB1c2UgYy1hcmVzIChVU0VfQVJFUz0xKS4KCllhbmcgVHNlICgxOCBBdWcgMjAwOCkKLSBBZGRlZCB0ZXN0IGNhc2UgNTU3IHRvIHZlcmlmeSBsaWJjdXJsJ3MgaW50ZXJuYWwgY3VybF9tKnByaW50ZigpIGZ1bmN0aW9ucwogIGZvcm1hdHRpbmcgZnVuY3Rpb25hbGl0eSB3aGVuIGhhbmRsaW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgbG9uZ3MsIGFzIHdlbGwgYXMKICBvdXIgY3VybF9vZmZfdCBkYXRhIHR5cGUuCgpZYW5nIFRzZSAoMTcgQXVnIDIwMDgpCi0gT3BlblNTbCBlbmFibGVkIE5ldFdhcmUgYnVpbGRzIGFyZSBjaGFuZ2VkIHRvIHVzZSB0aGUgJ29wZW5zc2wnIHN1YmRpcmVjdG9yeQogIHdoZW4gaW5jbHVkaW5nIHRoZSBPcGVuU1NMIGhlYWRlciBmaWxlcy4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgc2V0dGluZywgdGhpcwogIHByZXZlbnRzIHRoZSB1bmRlc2lyZWQgaW5jbHVzaW9uIG9mIGhlYWRlciBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhvc2UKICBvZiBPcGVuU1NMIGJ1dCB3aGljaCBkbyBub3QgYmVsb25nIHRvIHRoZSBPcGVuU1NMIHBhY2thZ2UuIFRoZSB2aXNpYmxlIGNoYW5nZQogIGZyb20gcHJldmlvdXNseSByZWxlYXNlZCBsaWJjdXJsIHZlcnNpb25zIGlzIHRoYXQgbm93IE9wZW5TU2wgZW5hYmxlZCBOZXRXYXJlCiAgYnVpbGRzIGFsc28gZGVmaW5lIFVTRV9PUEVOU1NMIGluIGNvbmZpZyBmaWxlcywgYW5kIHRoYXQgT3BlblNTTCBoZWFkZXIgZmlsZXMKICBtdXN0IGJlIGxvY2F0ZWQgaW4gYSBzdWJkaXJlY3RvcnkgbmFtZWQgJ29wZW5zc2wnLgoKWWFuZyBUc2UgKDE2IEF1ZyAyMDA4KQotIExpYnJhcnkgaW50ZXJuYWwgb25seSBDIHByZXByb2Nlc3NvciBtYWNyb3MgRk9STUFUX09GRl9UIGFuZCBGT1JNQVRfT0ZGX1RVCiAgcmVtYWluIGluIHVzZSBhcyBpbnRlcm5hbCBjdXJsX29mZl90IHByaW50IGZvcm1hdHRpbmcgc3RyaW5ncyBmb3IgdGhlIGludGVybmFsCiAgKnByaW50ZiBmdW5jdGlvbnMgd2hpY2ggc3RpbGwgY2Fubm90IGhhbmRsZSBwcmludCBmb3JtYXR0aW5nIHN0cmluZyBkaXJlY3RpdmVzCiAgc3VjaCBhcyAiSTY0ZCIsICJJNjR1IiwgYW5kIG90aGVycyBhdmFpbGFibGUgb24gTVNWQywgTWluR1csIEludGVsJ3MgSUNDLCBhbmQKICBvdGhlciBET1MvV2luZG93cyBjb21waWxlcnMuCgpEYW5pZWwgRmFuZHJpY2ggKDE1IEF1ZyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSAxMDYzIHRvIHRlc3QgaW52YWxpZCBsb25nIGZpbGUgcmFuZ2VzIHdpdGggZmlsZTogVVJMcyBhbmQKICAxMDY0IHRvIHRlc3QgbXVsdGlwbGUgaHR0cCBQVVRzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTA2NSB0byB0ZXN0IGEgUFVUIHdpdGggYSBzaW5nbGUgZmlsZSBidXQgdHdvIFVSTHMuIFRoaXMKICB3YXMgZGlzY292ZXJlZCB0byBiZSBwcm9ibGVtYXRpYyB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFuIGluY2lkZW50IHJlcG9ydGVkIGJ5CiAgVm9uIGJhY2sgaW4gTWF5LiAgY3VybCBpbiB0aGlzIGNhc2UgZG9lc24ndCBpbmNsdWRlIGEgQ29udGVudC1MZW5ndGg6IG9yCiAgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQgaGVhZGVyIHdoaWNoIGlzIGlsbGVnYWwuIFRoaXMgdGVzdCBjYXNlIGlzCiAgYWRkZWQgdG8gRElTQUJMRUQgdW50aWwgYSBzb2x1dGlvbiBpcyBmb3VuZC4KCllhbmcgVHNlICgxNSBBdWcgMjAwOCkKLSBDIHByZXByb2Nlc3NvciBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGFuZCBlcXVhbGx5IGF2YWlsYWJsZSBleHRlcm5hbGx5IHdoaWNoCiAgYWlkIGluIHRoZSB1c2Ugb2YgdGhlIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIGFyZSBuYW1lZDogQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCwKICBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSwgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCwgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCwKICBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSwgQ1VSTF9PRkZfVF9DIGFuZCBDVVJMX09GRl9UVV9DLgoKWWFuZyBUc2UgKDEzIEF1ZyAyMDA4KQotIFRoZSBzaXplIG9mIGxvbmcgaXMgYSBidWlsZCB0aW1lIGNoYXJhY3RlcmlzdGljIGFuZCBhcyBzdWNoIGl0IGlzIG5vdyByZWNvcmRlZAogIGluIGN1cmxidWlsZC5oIGFzIENVUkxfU0laRU9GX0xPTkcuIERlZmluaXRpb24gbm93IGRvbmUgZnJvbSBjb25maWd1cmUgcHJvY2VzcwogIGFuZCBpbiBDVlMgY3VybGJ1aWxkLmguZGlzdCBmb3Igbm9uLWNvbmZpZ3VyZSBzeXN0ZW1zLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBBdWcgMjAwOCkKLSBGaXhlZCBhIGJ1ZmZlciBvdmVyZmxvdyBwcm9ibGVtIGluIEN1cmxfcHJveHlDT05ORUNUIHRoYXQgY291bGQgb2NjdXIKICB3aGVuIGEgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGxvbmcgaGVhZGVycyBhbmQgZGF0YS4gIEx1Y2tpbHksIHRoZSBidWZmZXIKICBvdmVyZmxvd2VkIGludG8gYW5vdGhlciB1bnVzZWQgYnVmZmVyLCBzbyBubyBhY3R1YWwgaGFybSB3YXMgZG9uZS4KICBBZGRlZCB0ZXN0IGNhc2VzIDEwNjAgYW5kIDEwNjEgdG8gdmVyaWZ5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBdWcgMjAwOCkKLSBBbmR5IFRzb3VsYWR6ZSBmaXhlZCBydW50ZXN0cy5wbCB0byBub3QgYXR0ZW1wdCB0byBleGVjdXRlIHRoZSBzdHVubmVsCiAgX2RpcmVjdG9yeV8gaWYgdGhhdCBoYXBwZW5lZCB0byBhcHBlYXIgaW4gdGhlIHBhdGghCgpZYW5nIFRzZSAoMTIgQXVnIDIwMDgpCi0gQWRkZWQgbWFjcm9zIGZvciBtaW5pbXVtLXdpZHRoIHNpZ25lZCBhbmQgdW5zaWduZWQgY3VybF9vZmZfdCBpbnRlZ2VyCiAgY29uc3RhbnRzIENVUkxfT0ZGX1RfQyBhbmQgQ1VSTF9PRkZfVFVfQy4gVGhlIGNsZXZlciBkb3VibGUgaGVscGVyIG1hY3JvCiAgdXNlZCBpbnRlcm5hbGx5IHRvIHByb3ZpZGUgaXRzIGZ1bmN0aW9uYWxpdHkgaXMgdGhhbmtzIHRvIExhcnMgTmlsc3Nvbi4KCkRhbmllbCBGYW5kcmljaCAoMTEgQXVnIDIwMDgpCi0gRml4ZWQgYSBib3VuZGFyeSBjb25kaXRpb24gZXJyb3IgaW4gZnRwX3JlYWRyZXNwKCkgd2hlcmVieSBhIG5vbi10ZXJtaW5hbAogIGxpbmUgb2YgYSBtdWx0aWxpbmUgRlRQIHJlc3BvbnNlIHdob3NlIGxhc3QgYnl0ZSBsYW5kZWQgZXhhY3RseSBhdCB0aGUgZW5kCiAgb2YgdGhlIEJVRlNJWkUtbGVuZ3RoIGJ1ZmZlciB3b3VsZCBiZSB0cmVhdGVkIGFzIHRoZSB0ZXJtaW5hbCByZXNwb25zZQogIGxpbmUuICBUaGUgZm9sbG93aW5nIHJlc3BvbnNlIGNvZGUgcmVhZCBpbiB3b3VsZCB0aGVuIGFjdHVhbGx5IGJlIHRoZQogIGVuZCBvZiB0aGUgcHJldmlvdXMgcmVzcG9uc2UgbGluZSwgYW5kIGFsbCByZXNwb25zZXMgZnJvbSB0aGVuIG9uIHdvdWxkCiAgY29ycmVzcG9uZCB0byB0aGUgd3JvbmcgY29tbWFuZC4gVGVzdCBjYXNlIDEwNjIgdmVyaWZpZXMgdGhpcy4KCi0gU3RvcCBjbG9zaW5nIGEgbmV2ZXItb3BlbmVkIGZ0cCBzb2NrZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEF1ZyAyMDA4KQotIENvbnN0YW50aW5lIFNhcHVudHpha2lzIGZpbGVkIGJ1ZyByZXBvcnQgIzIwNDI0MzAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjA0MjQzMCkgd2l0aCBhIHBhdGNoLiAiTlRMTSBXaW5kb3dzCiAgU1NQSSBjb2RlIGlzIG5vdCB0aHJlYWQgc2FmZSIuIFRoaXMgd2FzIGR1ZSB0byBsaWJjdXJsIHVzaW5nIHN0YXRpYwogIHZhcmlhYmxlcyB0byB0ZWxsIHdldGhlciB0byBsb2FkIHRoZSBuZWNlc3NhcnkgU1NQSSBETEwsIGJ1dCBub3cgdGhlIGxvYWRpbmcKICBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgbW9yZSBzdWl0YWJsZSBjdXJsX2dsb2JhbF9pbml0KCkgY2FsbC4KCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjA0MjQ0MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDQyNDQwKSB3aXRoIGEgcGF0Y2guIEhlIGlkZW50aWZpZWQgYQogIHByb2JsZW0gd2hlbiB1c2luZyBOVExNIG92ZXIgYSBwcm94eSBidXQgdGhlIGVuZC1wb2ludCBkb2VzIEJhc2ljLCBhbmQgdGhlbgogIGxpYmN1cmwgd291bGQgZG8gd3Jvbmcgd2hlbiB0aGUgaG9zdCBzZW50ICJDb25uZWN0aW9uOiBjbG9zZSIgYXMgdGhlIHByb3h5J3MKICBOVExNIHN0YXRlIHdhcyBlcnJvbmVvdXNseSBjbGVhcmVkLgoKWWFuZyBUc2UgKDExIEF1ZyAyMDA4KQotIEFkZGVkIG1pc3Npbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCBjdXJsX29mZl90IGludGVnZXIgY29uc3RhbnQgc3VmZml4ZXMgZm9yCiAgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHVzZS4gQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCwgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUuCgpEYW5pZWwgRmFuZHJpY2ggKDcgQXVnIDIwMDgpCi0gRml4ZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpbiBtdWx0aV9ydW5zaW5nbGUoKSB0aGF0IGNvdWxkIGNhdXNlIGEKICByZXF1ZXN0IHRvIHByZW1hdHVyZWx5IGVuZC4KCi0gQWRkZWQgdGVzdDEwNTkgdG8gdGVzdCB0aGUgRlRQIHByb3h5IHR1bm5lbCBwcm9ibGVtIGZpeGVkIEp1bHkgMTEuCgpZYW5nIFRzZSAoNyBBdWcgMjAwOCkKLSBBZGRlZCBjdXJsYnVpbGQuaCBhbmQgY3VybHJ1bGVzLmggaGVhZGVyIGZpbGVzIHRvIGxpYmN1cmwncyBwdWJsaWMgaGVhZGVycy4KICBGaWxlIGN1cmxidWlsZC5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUgb24gY29uZmlndXJlLWNhcGFibGUgc3lzdGVtcy4gVGhpcyBpcwogIGEgZmlyc3Qgc3RlcCB0b3dhcmRzIGNvbmZpZ3VyZS1iYXNlZCBpbmZvIGluIHB1YmxpYyBoZWFkZXJzLiBDdXJyZW50bHkgb25seQogIHVzZWQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBhIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIHdoaWNoIGlzIG5vdCBnYXRlZCB0bwogIG9mZl90LiBGdXJ0aGVyIGRldGFpbHMgYXJlIGRvY3VtZW50ZWQgaW5zaWRlIHRoZXNlIG1lbnRpb25lZCBoZWFkZXIgZmlsZXMuCgotIEZpeCBDVVJMX0NIRUNLX0RFRiBzbyB0aGF0IHdoZW4gdGhlIGV4cGFuc2lvbiBvZiB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbAogIHJlc3VsdHMgaW4gYSBzZXQgb2YgZG91YmxlLXF1b3RlZCBzdHJpbmdzLCB0aGlzIG1hY3JvIHdpbGwgbm93IHJldHVybiBhbgogIGV4cGFuc2lvbiB3aGljaCBjb25zaXN0cyBvZiBhIHNpbmdsZSBkb3VibGUtcXVvdGVkIHN0cmluZyBhcyB0aGUgcmVzdWx0IG9mCiAgY29uY2F0ZW5hdGluZyBhbGwgb2YgdGhlbS4KCi0gU2tpcCBkYXRhIHR5cGUgY2hlY2sgaW4gRE9fQ1VSTF9PRkZfVF9DSEVDSyBtYWNybyB3aGVuIGFyZ3VtZW50IGlzIGVtcHR5LgoKLSBBZGp1c3RlZCB0ZXN0Y3VybC5wbCB0byBjb3B5IGNoZWNrZWQgb3V0IGN1cmxidWlsZC5oLmRpc3QgYXMgY3VybGJ1aWxkLmgKICBmb3Igbm9uLWNvbmZpZ3VyZSB0YXJnZXRzIHdoZW4gdGhlIGhvc3Qgc3lzdGVtIGRvZXNuJ3QgcnVuIGJ1aWxkY29uZi5iYXQuCgotIFByZXZlbnQgYnVpbGRjb25mIGZyb20gcmVtb3ZpbmcgJ01ha2VmaWxlJyBhbmQgJ21pc3NpbmcnIGZpbGVzLiBUaGlzIHdvdWxkCiAgYmxvdyBhd2F5IG91ciBDVlMgY2hlY2tlZCBmaWxlcyAnbWlzc2luZycgYW5kICdoaXBlci9NYWtlZmlsZScuCgotIFJlbW92ZSBhZGp1c3RtZW50IGRvbmUgdG8gdGVzdGN1cmwucGwgdG8gdmVyaWZ5IGlmIGNoYW5nZSBpbnRyb2R1Y2VkIGJ5CiAgR3VlbnRlciBLbmF1ZiBpbiBsaWIvTWFrZWZpbGUubmV0d2FyZSBpcyBlbm91Z2ggdG8gZ2V0IHRoZSBuZXR3YXJlIGF1dG9idWlsZHMKICBnb2luZyBhZ2Fpbi4KCllhbmcgVHNlICg1IEF1ZyAyMDA4KQotIENoYW5nZXMgZG9uZSB0byBidWlsZGNvbmYgc2NyaXB0LiBWYWxpZGF0ZSB0aGF0IGF1dG9tNHRlIGFuZCBhdXRvY29uZiwgYXMKICB3ZWxsIGFzIGFjbG9jYWwgYW5kIGF1dG9tYWtlLCB2ZXJzaW9ucyBtYXRjaC4gSW1wcm92ZSByZW1vdmFsIG9mIHByZXZpb3VzCiAgcnVuIGdlbmVyYXRlZCBmaWxlcy4gUmVtb3ZlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBvZiBhY2xvY2FsIG9uIFNvbGFyaXMuCgpEYW5pZWwgU3RlbmJlcmcgKDUgQXVnIDIwMDgpCi0gWWVob3NodWEgSGVyc2hiZXJnIGZvdW5kIGEgcHJvYmxlbSB0aGF0IHdvdWxkIG1ha2UgbGliY3VybCByZS11c2UgYQogIGNvbm5lY3Rpb24gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGV2ZW4gaWYgYSBwcmV2aW91cyB1c2Ugb2YgaXQgY2F1c2VkIGEKICBDVVJMRV9QRUVSX0ZBSUxFRF9WRVJJRklDQVRJT04gdG8gZ2V0IHJldHVybmVkLiBJIG5vdyBtYWtlIHN1cmUgdGhhdCBmYWlsZWQKICBTU0wgY29ubmVjdGlvbnMgcHJvcGVybHkgY2xvc2UgdGhlIGNvbm5lY3Rpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICg0IEF1ZyAyMDA4KQotIFRlc3QgY2FzZXMgMTA1MSwgMTA1MiBhbmQgMTA1NSB3ZXJlIGFkZGVkIGJ5IERhbmllbCBGYW5kcmljaCBvbiBKdWx5IDMwIGFuZAogIHByb3ZlZCBob3cgUFVUIGFuZCBQT1NUIHdpdGggYSByZWRpcmVjdCBjb3VsZCBsZWFkIHRvIGEgImhhbmciIGR1ZSB0byB0aGUKICBkYXRhIHN0cmVhbSBub3QgYmVpbmcgcmV3b3VuZCBwcm9wZXJseSB3aGVuIGl0IGhhZCB0byBpbiBvcmRlciB0byBnZXQgc2VudAogIHByb3Blcmx5IChhZ2FpbikgdG8gdGhlIHN1YnNlcXVlbnQgVVJMLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGhlc2UgdGVzdAogIGNhc2VzIGFyZSBubyBsb25nZXIgZGlzYWJsZWQuCgpZYW5nIFRzZSAoNCBBdWcgMjAwOCkKLSBBdXRvY29uZiAyLjYyIGhhcyBjaGFuZ2VkIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFDX0FJWCBtYWNybyB3aGljaCB3ZSB1c2UuCiAgUHJpb3IgdmVyc2lvbnMgb2YgYXV0b2NvbmYgZGVmaW5lZCBfQUxMX1NPVVJDRSBpZiBfQUlYIHdhcyBkZWZpbmVkLiAyLjYyCiAgdmVyc2lvbiBvZiBBQ19BSVggZGVmaW5lcyBfQUxMX1NPVVJDRSBhbmQgb3RoZXIgZm91ciBwcmVwcm9jZXNzb3Igc3ltYm9scwogIG5vIG1hdHRlciBpZiB0aGUgc3lzdGVtIGlzIEFJWCBvciBub3QuIFRvIGtlZXAgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW91ciwKICBhbmQgYW4gdW5pZm9ybSBvbmUgYWNyb3NzIGF1dG9jb25mIHZlcnNpb25zIEFDX0FJWCBpcyByZXBsYWNlZCB3aXRoIG91cgogIG93biBpbnRlcm5hbCBtYWNybyBDVVJMX0NIRUNLX0FJWF9BTExfU09VUkNFLgoKRGFuaWVsIFN0ZW5iZXJnICg0IEF1ZyAyMDA4KQotIFRlc3QgY2FzZSAxMDQxIChhZGRlZCBieSBEYW5pZWwgRmFuZHJpY2ggSnVseSAxNHRoKSBwcm92ZWQgYSBidWcgd2hlcmUgUFVUCiAgd2l0aCAtQyAtIHNlbnQgZ2FyYmFnZSBpbiB0aGUgQ29udGVudC1SYW5nZTogaGVhZGVyLiBJIGZpeGVkIHRoaXMgcHJvYmxlbSBieQogIG1ha2luZyBzdXJlIGxpYmN1cmwgYWx3YXlzIHNldHMgdGhlIHNpemUgb2YgdGhlIF9lbnRpcmVfIHVwbG9hZCBpZiBhbiBhcHAKICBhdHRlbXBzIHRvIGRvIHJlc3VtZWQgdXBsb2FkcyBzaW5jZSBsaWJjdXJsIHNpbXBseSBjYW5ub3Qga25vdyB0aGUgc2l6ZSBvZgogIHdoYXQgaXMgY3VycmVudGx5IGF0IHRoZSBzZXJ2ZXIgZW5kLiBUZXN0IDEwNDEgaXMgbm8gbG9uZ2VyIGRpc2FibGVkLgoKWWFuZyBUc2UgKDIgQXVnIDIwMDgpCi0gTm8gbG9uZ2VyIHRlc3QgYXZhaWxhYmlsaXR5IG9mIHRoZSBnZGkzMiBsaWJyYXJ5LCBub3IgdXNlIGl0IGZvciBsaW5raW5nLCBldmVuCiAgd2hlbiB3ZSBoYXZlIGJlZW4gZG9pbmcgdGhpcyBzaW5jZSByZXZpc2lvbiAxLjQ3IG9mIGNvbmZpZ3VyZS5hYyA0IHllYXJzIGFuZAogIDUgbW9udGhzIGFnbyB3aGVuIGNyb3NzLWNvbXBpbGluZyBhIFdpbmRvd3MgdGFyZ2V0LiBXZSBhY3R1YWxseSBkb24ndCB1c2UgYW55CiAgZnVuY3Rpb24gZnJvbSB0aGUgV2luZG93cyBHREkgKEdyYXBoaWNzIERldmljZSBJbnRlcmZhY2UpIHJlbGF0ZWQgd2l0aCBkcmF3aW5nCiAgb3IgZ3JhcGhpY3MtcmVsYXRlZCBvcGVyYXRpb25zLgoKRGFuaWVsIEZhbmRyaWNoICgxIEF1ZyAyMDA4KQotIEFkZGVkIHN1cHBvcnQgZm9yIC0tYXBwZW5kIG9uIFNGVFAgdXBsb2Fkcy4gVW5mb3J0dW5hdGVseSwgT3BlblNTSCBkb2Vzbid0CiAgc3VwcG9ydCB0aGlzIHNvIGl0IGdvZXMgdW50ZXN0ZWQuCgpZYW5nIFRzZSAoMSBBdWcgMjAwOCkKLSBDb25maWd1cmUgcHJvY2VzcyBub3cgY2hlY2tzIGlmIHRoZSBwcmVwcm9jZXNzb3IgX1JFRU5UUkFOVCBzeW1ib2wgaXMgYWxyZWFkeQogIGRlZmluZWQuIElmIGl0IGlzbid0IGN1cnJlbnRseSBkZWZpbmVkIGEgc2V0IG9mIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHRvIHRlc3QKICBpZiBpdHMgZGVmaW5pdGlvbiBpcyByZXF1aXJlZCB0byBtYWtlIHZpc2libGUgdG8gdGhlIGNvbXBpbGVyIGEgc2V0IG9mICpfcgogIGZ1bmN0aW9ucy4gRmluYWxseSwgaWYgX1JFRU5UUkFOVCBpcyBhbHJlYWR5IGRlZmluZWQgb3IgbmVlZGVkIGl0IHRha2VzIGNhcmUKICBvZiBtYWtpbmcgYWRqdXN0bWVudHMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGl0IGlzIGRlZmluZWQgZXF1YWxseSBmb3IgdGhlCiAgY29uZmlndXJlIHByb2Nlc3MgdGVzdHMgYW5kIGdlbmVyYXRlZCBjb25maWcgZmlsZS4KCi0gUmVtb3ZlZCBkZWZpbml0aW9uIG9mIENVUkxfQ0hFQ0tfV09SS0lOR19SRVNPTFZFUiBmcm9tIGFjaW5jbHVkZS5tNCBpdCBoYXMKICBub3QgYmVlbiBpbiB1c2Ugc2luY2UgcmV2aXNpb24gMS44MSBvZiBjb25maWd1cmUuaW4gNiB5ZWFycywgOSBtb250aHMgYWdvLgoKRGFuaWVsIEZhbmRyaWNoICgzMSBKdWwgMjAwOCkKLSBGaXhlZCBwYXJzaW5nIG9mIGFuIElQdjYgcHJveHkgYWRkcmVzcyB0byBzdXBwb3J0IGEgc2NvcGUgaWRlbnRpZmllciwKICBhcyB3ZWxsIGFzIElQdjQgYWRkcmVzc2VzIGluIElQdjYgZm9ybWF0LiBBbHNvLCBiZXR0ZXIgaGFuZGxlIHRoZSBjYXNlCiAgb2YgYSBtYWxmb3JtYXR0ZWQgSVB2NiBhZGRyZXNzIChhdm9pZCBlbXB0eSBhbmQgTlVMTCBzdHJpbmdzKS4KCi0gRml4ZWQgYSBwcm9ibGVtIHdpdGggYW55IEZUUCBVUkwgb3IgYW55IFVSTHMgY29udGFpbmluZyBhbiBJUHY2IGFkZHJlc3MKICBiZWluZyBtYW5nbGVkIHdoZW4gcGFzc2VkIHRvIHByb3hpZXMgd2hlbiBDVVJMT1BUX1BPUlQgaXMgYWxzbyBzZXQKICAocmVwb3J0ZWQgYnkgUHJhbW9kIFNoYXJtYSkuCgotIFVzZXIgbmFtZXMgZW1iZWRkZWQgaW4gcHJveHkgVVJMcyB3aXRob3V0IGEgcGFzc3dvcmQgd2VyZSBwYXJzZWQKICBpbmNvcnJlY3RseS0tdGhlIGhvc3QgbmFtZSBpcyB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHVzZXIgbmFtZSBhbmQgdGhlCiAgcG9ydCBudW1iZXIgYmVjb21lcyB0aGUgcGFzc3dvcmQuICBUaGlzIGNhbiBiZSBvYnNlcnZlZCBpbiB0ZXN0IDI3OQogICh3YXMgS05PV05fSVNTVUUgIzU0KS4KCkRhbmllbCBTdGVuYmVyZyAoMzAgSnVsIDIwMDgpCi0gUGhpbCBCbHVuZGVsbCBhZGRlZCB0aGUgQ1VSTE9QVF9BRERSRVNTX1NDT1BFIG9wdGlvbiwgYXMgd2VsbCBhcyBhZGp1c3RlZAogIHRoZSBVUkwgcGFyc2VyIHRvIGFsbG93IG51bWVyaWNhbCBJUHY2LWFkZHJlc3NlcyB0byBiZSBzcGVjaWZpZWQgd2l0aCB0aGUKICBzY29wZSBnaXZlbiwgYXMgcGVyIFJGQzQwMDcgLSB3aXRoIGEgcGVyY2VudCBsZXR0ZXIgdGhhdCBpdHNlbGYgbmVlZHMgdG8gYmUKICBVUkwgZXNjYXBlZC4gRm9yIGV4YW1wbGUsIGZvciBhbiBhZGRyZXNzIG9mIGZlODA6OjEyMzQlMSB0aGUgSFRUUCBVUkwgaXM6CiAgImh0dHA6Ly9bZmU4MDo6MTIzNCUyNTFdLyIKCi0gUEhQJ3MgYnVnIHJlcG9ydCAjNDMxNTggKGh0dHA6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD00MzE1OCkgaWRlbnRpZmllcyBhCiAgdHJ1ZSBidWcgaW4gbGliY3VybCBidWlsdCB3aXRoIE9wZW5TU0wuIEl0IG1hZGUgY3VybF9lYXN5X2dldGluZm8oKSBtb3JlIG9yCiAgbGVzcyBhbHdheXMgcmV0dXJuIDAgZm9yIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgYmVjYXVzZSB0aGUgZnVuY3Rpb24gdGhhdAogIHdvdWxkIHNldCBpdCB0byBzb21ldGhpbmcgbm9uLXplcm8gd291bGQgcmV0dXJuIGJlZm9yZSB0aGUgYXNzaWduIGluIGFsbW9zdAogIGFsbCBlcnJvciBjYXNlcy4gVGhlIGludGVybmFsIHZhcmlhYmxlIGlzIG5vdyBzZXQgdG8gbm9uLXplcm8gZnJvbSB0aGUgc3RhcnQKICBvZiB0aGUgZnVuY3Rpb24gb25seSB0byBnZXQgY2xlYXJlZCBsYXRlciBvbiBpZiB0aGluZ3Mgd29yayBvdXQgZmluZS4KCi0gTWFkZSB0aGUgY3VybCB0b29sJ3MgLXcgb3B0aW9uIHN1cHBvcnQgdGhlICV7c3NsX3ZlcmlmeV9yZXN1bHR9IHZhcmlhYmxlCgpEYW5pZWwgRmFuZHJpY2ggKDMwIEp1bCAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTA1MiB0aHJvdWdoIDEwNTUgdG8gdGVzdCB1cGxvYWRpbmcgZGF0YSBmcm9tIGZpbGVzCiAgZHVyaW5nIHJlZGlyZWN0cy4gIFRlc3QgY2FzZXMgMTA1MiBhbmQgMTA1NSBzaG93IHByb2JsZW1zIChtYXliZSB0aGUgc2FtZQogIHJvb3QgY2F1c2UgYXMgMTA1MSkgYW5kIGFyZSBkaXNhYmxlZC4KCi0gRml4ZWQgYSBjb3VwbGUgb2YgYnVmZmVyIG92ZXJmbG93cyBpbiB0aGUgTVMtRE9TIHBvcnQgb2YgdGhlIGN1cmwgdG9vbC4KCkRhbmllbCBGYW5kcmljaCAoMjkgSnVsIDIwMDgpCi0gRml4ZWQgLS11c2UtYXNjaWkgdG8gcHJvcGVybHkgY29udmVydCB0ZXh0IGZpbGVzIG9uIFN5bWJpYW4gT1MsIE1TLURPUwogIGFuZCBPUy8yLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTA1MSB0byB0ZXN0IExvY2F0aW9uOiBmb2xsb3dpbmcgd2l0aCBQVVQsIGFzIHJlcG9ydGVkCiAgYnkgQmVuIFN1dGNsaWZmZS4gIFRoZSB0ZXN0IHdoZW4gcnVuIG1hbnVhbGx5IHNob3dzIGEgcHJvYmxlbSBpbiBjdXJsCiAgc28gaXQncyBkaXNhYmxlZC4KCkRhbmllbCBGYW5kcmljaCAoMjggSnVsIDIwMDgpCi0gRml4ZWQgZGlzcGxheSBvZiB0aGUgaW50ZXJmYWNlIGJpbmQgYWRkcmVzcyBpbiB0aGUgdHJhY2Ugb3V0cHV0IHdoZW4gaXQncwogIGFuIElQdjYgYWRkcmVzcy4KCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDQ1IHRocm91Z2ggMTA0OSBhcyBzaW1wbGUgdGVzdHMgb2YgLS1pbnRlcmZhY2UgdXNpbmcgdGhlCiAgbG9jYWxob3N0IGludGVyZmFjZS4KCi0gQWRkZWQgdGVzdCBjYXNlIDEwNTAgdG8gdGVzdCAtLWZ0cC1wb3J0IHdpdGggYW4gSVB2NiBhZGRyZXNzCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEp1bCAyMDA4KQotIERhdmlkIEJhdSBmaWxlZCBidWcgcmVwb3J0ICMyMDI2MjQwICJDVVJMX1JFQURGVU5DX1BBVVNFIGxlYWRzIHRvIGJ1ZmZlcgogIG92ZXJydW4iIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDI2MjQwKSBpZGVudGlmeWluZyB0d28KICBwcm9ibGVtcywgYW5kIHByb3ZpZGluZyB0aGUgZml4IGZvciB0aGVtOgoKICAtIENVUkxfUkVBREZVTkNfUEFVU0UgZGlkIGluIGZhY3Qgbm90IHBhdXNlIHRoZSBfc2VuZGluZ18gb2YgZGF0YSB0aGF0IGl0IGlzCiAgICBkZXNpZ25lZCBmb3IgYnV0IHBhdXNlZCBfcmVjZWl2aW5nXyBvZiBkYXRhIQoKICAtIGxpYmN1cmwgZGlkbid0IGludGVybmFsbHkgc2V0IHRoZSByZWFkIGNvdW50ZXIgdG8gemVybyB3aGVuIHRoaXMgcmV0dXJuCiAgICBjb2RlIHdhcyBkZXRlY3RlZCwgd2hpY2ggd291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBqdW5rIGdldHRpbmcgc2VudCB0bwogICAgdGhlIHNlcnZlci4KCkRhbmllbCBGYW5kcmljaCAoMjYgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdCAxMDQ0IHRvIHRlc3QgbGFyZ2UgZmlsZSBzdXBwb3J0IGluIGZ0cCB3aXRoIC1JLgoKLSBFbGltaW5hdGUgYSB1bm5lY2Vzc2FyeSBzb2NrZXQgY3JlYXRpb24gaW4gQ3VybF9nZXRhZGRyaW5mbyBmb3IgYW4gSVB2NAogIGFkZHJlc3MgaW4gYW4gSVB2NiBjYXBhYmxlIGxpYmN1cmwuCgotIEFkZGVkIGZlYXR1cmUgaW4gcnVudGVzdHMucGwgdG8gc2VsZWN0IHRlc3RzIGJhc2VkIG9uIGtleSB3b3JkLgoKRGFuaWVsIEZhbmRyaWNoICgyMyBKdWwgMjAwOCkKLSBDaGFuZ2VkIHRoZSBsb25nIGxvZ2ZpbGUgZWxpc2lvbiBjb2RlIGluIHJ1bnRlc3RzLnBsIHRvIHByb3Blcmx5IGhhbmRsZQogIGxpbmVzIGVuZGluZyBpbiBcci4KCi0gQ2hhbmdlZCByZWZlcmVuY2VzIHRvIFRSVUUgYW5kIEZBTFNFIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHRvCiAgMSBhbmQgemVybywgcmVzcGVjdGl2ZWx5LCBzaW5jZSBUUlVFIGFuZCBGQUxTRSBhcmVuJ3QgcGFydCBvZiB0aGUKICBsaWJjdXJsIEFQSS4KCkRhbmllbCBTdGVuYmVyZyAoMjMgSnVsIDIwMDgpCi0gSSB3ZW50IG92ZXIgdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgYW5kIHJlcGxhY2VkIG1vc3QgcmVmZXJlbmNlcyB0bwogIG5vbi16ZXJvIHdpdGggdGhlIGZpeGVkIHZhbHVlIG9mIDEuIFdlIHNob3VsZCBzdHJpdmUgYXQgbWFraW5nIG9wdGlvbnMKICBzdXBwb3J0ICcxJyBmb3IgZW5hYmxpbmcgdGhlbSBtZW50aW9uZWQgZXhwbGljaXRseSwgYXMgdGhhdCB0aGVuIHdpbGwgYWxsb3cKICB1cyBmb3IgdG8gZXh0ZW5kIHRoZW0gaW4gdGhlIGZ1dHVyZSB3aXRob3V0IGJyZWFraW5nIG9sZGVyIHByb2dyYW1zLgoKICBQb3NzaWJseSB3ZSBzaG91bGQgZXZlbiBpbnRyb2R1Y2UgYSBmYW5jeSBkZWZpbmUgdG8gdXNlIGluc3RlYWQgb2YgJzEnIGFsbAogIG92ZXIuLi4KCllhbmcgVHNlICgyMSBKdWwgMjAwOCkKLSBVc2UgdGhlIHNyZWFkZnJvbSgpIHdyYXBwZXIgdG8gcmVwbGFjZSByZWN2ZnJvbSgpIGluIG91ciBjb2RlLgoKWWFuZyBUc2UgKDIwIEp1bCAyMDA4KQotIHdoZW4gcmVjdmZyb20gcHJvdG90eXBlIHVzZXMgYSB2b2lkIHBvaW50ZXIgZm9yIGFyZ3VtZW50cyAyLCA1IG9yIDYgdGhpcyB3aWxsCiAgbm93IGNhdXNlIHRoZSBkZWZpbml0aW9uLCBhcyBhcHByb3ByaWF0ZSwgb2YgUkVDVkZST01fVFlQRV9BUkcyX0lTX1ZPSUQsCiAgUkVDVkZST01fVFlQRV9BUkc1X0lTX1ZPSUQgb3IgUkVDVkZST01fVFlQRV9BUkc2X0lTX1ZPSUQuCgpZYW5nIFRzZSAoMTcgSnVsIDIwMDgpCi0gUkVDVkZST01fVFlQRV9BUkcyLCBSRUNWRlJPTV9UWVBFX0FSRzUgYW5kIFJFQ1ZGUk9NX1RZUEVfQVJHNiBhcmUgbm93IGRlZmluZWQKICB0byB0aGUgZGF0YSB0eXBlIHBvaW50ZWQgYnkgaXRzIHJlc3BlY3RpdmUgYXJndW1lbnQgYW5kIG5vdCB0aGUgcG9pbnRlciB0eXBlLgoKWWFuZyBUc2UgKDE2IEp1bCAyMDA4KQotIENvbmZpZ3VyZSBwcm9jZXNzIG5vdyBjaGVja3MgYXZhaWxhYmlsaXR5IG9mIHJlY3Zmcm9tKCkgc29ja2V0IGZ1bmN0aW9uIGFuZAogIGZpbmRzIG91dCBpdHMgcmV0dXJuIHR5cGUgYW5kIHRoZSB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiBBZGRlZCBkZWZpbml0aW9ucwogIGZvciBub24tY29uZmlndXJlIHN5c3RlbXMgY29uZmlnIGZpbGVzLCBhbmQgaW50cm9kdWNlZCBtYWNybyBzcmVhZGZyb20gd2hpY2gKICB3aWxsIGJlIHVzZWQgb24gdWRwIHNvY2tldHMgYXMgYSByZWN2ZnJvbSgpIHdyYXBwZXIuCgpZYW5nIFRzZSAoMTUgSnVsIDIwMDgpCi0gQWRkZWQgZGVzY3JpcHRpb24vY29tbWVudCB0byBpbmNsdWRlIHBhdGhzIHVzZWQgaW4gc2V2ZXJhbCBNYWtlZmlsZS5hbSBmaWxlcy4KICBBZGRlZCBhdXRvbWFrZSBvcHRpb24gbm9zdGRpbmMgdG8gdGVzdCBzZXJ2ZXJzIG1ha2VmaWxlIGFuZCBtb2RpZmllZCBsaWJjdXJsCiAgZXh0ZXJuYWwgaGVhZGVycyBpbmNsdWRlIHBhdGggZm9yIGxpYnRlc3QgcHJvZ3JhbXMuCgpEYW5pZWwgRmFuZHJpY2ggKDE0IEp1bCAyMDA4KQotIEFkZGVkIHRlc3QxMDQwIHRocm91Z2ggdGVzdDEwNDMgdG8gdGVzdCAtQyAtIG9uIEhUVFAuIFRlc3QgMTA0MSBmYWlsZWQgc28KICBpdCdzIGFkZGVkIHRvIERJU0FCTEVELgoKWWFuZyBUc2UgKDE0IEp1bCAyMDA4KQotIEhUVFBfT05MWSBkZWZpbml0aW9uIGNoZWNrIGluIGxpYi9zZXR1cC5oIGlzIG5vdyBkb25lIG9uY2UgdGhhdCBjb25maWd1cmF0aW9uCiAgZmlsZSBoYXMgYmVlbiBpbmNsdWRlZC4gSW4gdGhpcyB3YXkgaWYgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBmaWxlCiAgaXQgd2lsbCBubyBsb25nZXIgYmUgaWdub3JlZC4gIFJlbW92ZWQgaW5jbHVzaW9uIG9mIHJlbWFpbmluZyBzeXN0ZW0gaGVhZGVyCiAgZmlsZXMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGVzLiBNb3ZlZCBfUkVFTlRSQU5UIGRlZmluaXRpb24gdXAvZWFybGllciBpbgogIGxpYi9zZXR1cC5oCgpZYW5nIFRzZSAoMTEgSnVsIDIwMDgpCi0gQWRkZWQgbWlzc2luZyBtdWx0aXBsZSBoZWFkZXIgaW5jbHVzaW9uIHByZXZlbnRpb24gZGVmaW5pdGlvbiBmb3IgaGVhZGVyCiAgZmlsZSBjb250ZW50X2VuY29kaW5nLmgKCkRhbmllbCBGYW5kcmljaCAoMTEgSnVsIDIwMDgpCi0gRml4ZWQgdGVzdCA1NTMgdG8gcGFzcyB0aGUgdG9ydHVyZSB0ZXN0LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBKdWwgMjAwOCkKLSBEYW5pZWwgRmFuZHJpY2ggZm91bmQgb3V0IHdlIGRpZG4ndCBwYXNzIG9uIHRoZSB1c2VyLWFnZW50IHByb3Blcmx5IHdoZW4KICBkb2luZyAicHJveHktdHVubmVscyIgd2l0aCBub24tSFRUUCBwcm90b3RvbHMgYW5kIHRoYXQgd2FzIHNpbXBseSBiZWNhdXNlCiAgdGhlIGNvZGUgYXNzdW1lZCB0aGUgdXNlci1hZ2VudCB3YXMgb25seSBuZWVkZWQgZm9yIEhUVFAuCgpEYW5pZWwgRmFuZHJpY2ggKDEwIEp1bCAyMDA4KQotIENoYW5nZWQgc2xpZ2h0bHkgdGhlIFNGVFAgcXVvdGUgY29tbWFuZHMgY2htb2QsIGNob3duIGFuZCBjaGdycCB0byBvbmx5CiAgc2V0IHRoZSBhdHRyaWJ1dGUgdGhhdCBoYXMgY2hhbmdlZCBpbnN0ZWFkIG9mIGFsbCBwb3NzaWJsZSBvbmVzLiBIb3BlZnVsbHksCiAgdGhpcyB3aWxsIHNvbHZlIHRoZSAiUGVybWlzc2lvbiBkZW5pZWQiIHByb2JsZW0gdGhhdCBOYWdhcmFqYW4gU3JlZW5pdmFzYW4KICByZXBvcnRlZCB3aGVuIHNldHRpbmcgc29tZSBtb2RlcywgYnV0IHJlZ2FyZGxlc3MsIGl0IHNhdmVzIGEgcHJvdG9jb2wKICByb3VuZCB0cmlwIGluIHRoZSBjaG1vZCBjYXNlLgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMzggYW5kIDEwMzkgdG8gdGVzdCBBZHJpYW4gS3JlaGVyJ3MgcmVwb3J0IHRoYXQgZnRwCiAgdXBsb2FkcyB3aXRoIC1DIC0gZGlkbid0IHJlc3VtZSBwcm9wZXJseSwgYnV0IHRoZSB0ZXN0cyBwYXNzLgoKWWFuZyBUc2UgKDEwIEp1bCAyMDA4KQotIFBldGVyIExhbWJlcmcgZmlsZWQgYnVnIHJlcG9ydCAjMjAxNTEyNjogInBvbGwgZ2l2ZXMgV1NBRUlOVkFMIHdoZW4gUE9MTFBSSQogIGlzIHNldCBpbiBmZHNldC5ldmVudHMiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMDE1MTI2KSB3aGljaAogIGV4YWN0bHkgcGlucG9pbnRlZCB0aGUgcHJvYmxlbSBvbmx5IHRyaWdnZXJlZCBvbiBXaW5kb3dzIFZpc3RhLCBwcm92aWRlZAogIHJlZmVyZW5jZSB0byBkb2NzIGFuZCBhbHNvIGEgZml4LiBUaGVyZSBpcyBtdWNoIHdvcmsgYmVoaW5kIFBldGVyIExhbWJlcmcncwogIGV4Y2VsbGVudCBidWcgcmVwb3J0LiBUaGFuayBZb3UhCgpEYW5pZWwgRmFuZHJpY2ggKDkgSnVsIDIwMDgpCi0gQWRkZWQgdGVzdHMgMTAzNiBhbmQgMTAzNyB0byB2ZXJpZnkgcmVzdW1lZCBmdHAgZG93bmxvYWRzIHdpdGggLUMgLQoKRGFuaWVsIFN0ZW5iZXJnICg5IEp1bCAyMDA4KQotIEFuZHJlYXMgU2NodWxkZWkgaW1wcm92ZWQgUGhpbCBCbHVuZGVsbCdzIHBhdGNoIGZvciBJUHY2IHVzaW5nIGMtYXJlcywgYW5kIEkKICBlZGl0ZWQgaXQgc2xpZ2h0bHkuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIElQdjYgYWRkcmVzc2VzIGZpbmUgZXZlbgogIHdpdGggbGliY3VybCBidWlsdCB0byB1c2UgYy1hcmVzLgoKRGFuaWVsIEZhbmRyaWNoICg5IEp1bCAyMDA4KQotIEZpeGVkIGFuIE9PTSBoYW5kbGluZyBwcm9ibGVtIHRoYXQgY2F1c2UgdGVzdCAxMSB0byBmYWlsIHRoZSB0b3J0dXJlIHRlc3QuCgpEYW5pZWwgRmFuZHJpY2ggKDggSnVsIDIwMDgpCi0gRml4ZWQgdGVzdCA1NTQgdG8gcGFzcyB0aGUgdG9ydHVyZSB0ZXN0LgoKRGFuaWVsIEZhbmRyaWNoICg3IEp1bCAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTAzNCAmIDEwMzUgdG8gdGVzdCBJRE4gbmFtZSBjb252ZXJzaW9uIGZhaWx1cmVzLgoKRGFuaWVsIFN0ZW5iZXJnICg3IEp1bCAyMDA4KQotIFNjb3R0IEJhcnJldHQgcHJvdmlkZWQgYSB0ZXN0IGNhc2UgZm9yIGEgc2VnZmF1bHQgaW4gdGhlIEZUUCBjb2RlIGFuZCB0aGUKICBmaXggZm9yIGl0LiBJdCBvY2N1cmVkIHdoZW4geW91IGRpZCBhIEZUUCB0cmFuc2ZlciB1c2luZwogIENVUkxGVFBNRVRIT0RfU0lOR0xFQ1dEIGFuZCB0aGVuIGRpZCBhbm90aGVyIG9uZSBvbiB0aGUgc2FtZSBlYXN5IGhhbmRsZSBidXQKICBzd2l0Y2hlZCB0byBDVVJMRlRQTUVUSE9EX05PQ1dELiBEdWUgdG8gdGhlICJkaXIgZGVwdGgiIHZhcmlhYmxlIG5vdCBiZWluZwogIGNsZWFyZWQgcHJvcGVybHkuICBTY290dCdzIHRlc3QgY2FzZSBpcyBub3cga25vd24gYXMgdGVzdCA1MzkgYW5kIGl0CiAgdmVyaWZpZXMgdGhlIGZpeC4KCkRhbmllbCBTdGVuYmVyZyAoMyBKdWwgMjAwOCkKLSBQaGlsIEJsdW5kZWxsIHByb3ZpZGVkIGEgZml4IGZvciBsaWJjdXJsJ3MgdHJlYXRtZW50IG9mIHVuZXhwZWN0ZWQgMXh4CiAgcmVzcG9uc2UgY29kZXMuIFByZXZpb3VzbHkgbGliY3VybCB3b3VsZCBoYW5nIG9uIHN1Y2ggb2NjdXJhbmNlcy4gSSBhZGRlZAogIHRlc3QgY2FzZSAxMDMzIHRvIHZlcmlmeS4KCi0gSW50cm9jdWRpbmcgYSBuZXcgdGltZXN0YW1wIGZvciBjdXJsX2Vhc3lfZ2V0aW5mbygpOgogIENVUkxJTkZPX0FQUENPTk5FQ1RfVElNRS4gVGhpcyBpcyBzZXQgd2l0aCB0aGUgImFwcGxpY2F0aW9uIGxheWVyIgogIGhhbmRzaGFrZS9jb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4gV2hpY2ggdHlwaWNhbGx5IGlzIFNTTCwgVExTIG9yIFNTSCBhbmQgYnkKICB1c2luZyB0aGlzIHlvdSBjYW4gZmlndXJlIG91dCB0aGUgYXBwbGljYXRpb24gbGF5ZXIncyBvd24gY29ubmVjdCB0aW1lLiBZb3UKICBjYW4gZXh0cmFjdCB0aGUgdGltZSBzdGFtcCB1c2luZyBjdXJsJ3MgLXcgb3B0aW9uIGFuZCB0aGUgbmV3IHZhcmlhYmxlIG5hbWVkCiAgJ3RpbWVfYXBwY29ubmVjdCcuIFRoaXMgZmVhdHVyZSB3YXMgc3BvbnNvcmVkIGJ5IExlbm55IFJhY2hpdHNreSBhdCBOZXVTdGFyLgoKRGFuaWVsIEZhbmRyaWNoICgyIEp1bCAyMDA4KQotIFN1cHBvcnQgT3BlbiBXYXRjb20gQyBvbiBMaW51eCAoYXMgd2VsbCBhcyBXaW5kb3dzKS4KCllhbmcgVHNlICgyIEp1bCAyMDA4KQotIFRoZSBwcmV2aW91c2x5IGNvbW1pdHRlZCBmaXggZm9yIGJ1ZyByZXBvcnQgIzE5OTkxODEgcHJldmVudGVkIHVzaW5nIHRoZQogIG1vbm90b25pYyBjbG9jayBvbiBhbnkgc3lzdGVtIHdpdGhvdXQgYW4gYWx3YXlzIHN1cHBvcnRlZCBQT1NJWCBjb21wbGlhbnQKICBpbXBsZW1lbnRhdGlvbi4gTm93IHRoZSBQT1NJWCBjb21wbGlhbnQgY29uZmlndXJhdGlvbiBjaGVjayBpcyByZW1vdmVkIGFuZAogIHdpbGwgZmFsbGJhY2sgdG8gZ2V0dGltZW9mZGF5IHdoZW4gdGhlIG1vbm90b25pYyBjbG9jayBpcyB1bmF2YWlsYWJsZSBhdAogIHJ1bi10aW1lLgoKLSBUaGUgY29uZmlndXJlIHByb2Nlc3Mgd2lsbCBub3cgaGFsdCB3aGVuIHNlZCwgZ3JlcCwgZWdyZXAgb3IgYXIgcHJvZ3JhbXMKICBjYW4gbm90IGJlIGZvdW5kIGFtb25nIHRoZSBkaXJlY3RvcmllcyBpbiBQQVRIIHZhcmlhYmxlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bCAyMDA4KQotIFJvbGxhbmQgRHVkZW1haW5lIHByb3ZpZGVkIGZpeGVzIHRvIGdldCBsaWJjdXJsIHRvIGJ1aWxkIGZvciB0aGUgSU5URUdSSVRZCiAgb3BlcmF0aW5nIHN5c3RlbS4KCkRhbmllbCBTdGVuYmVyZyAoMzAgSnVuIDIwMDgpCi0gTWFkZSB0aGUgaW50ZXJuYWwgcHJpbnRmKCkgc3VwcG9ydCAlbGx1IHByb3Blcmx5IHRvIHByaW50IHVuc2lnbmVkIGxvbmcgbG9uZ3MuCgotIFN0ZXBoZW4gQ29sbHllciBhbmQgVG9yIEFybnRzZW4gaGVscGVkIGlkZW50aWZ5IGEgZmxhdyBpbiB0aGUgcmFuZ2UgY29kZQogIHdoaWNoIG91dHB1dCB0aGUgcmFuZ2UgdXNpbmcgYSBzaWduZWQgdmFyaWFibGUgd2hlcmUgaXQgc2hvdWxkIHJhdGhlciB1c2UKICB1bnNpZ25lZC4KCllhbmcgVHNlICgyOSBKdW4gMjAwOCkKLSBKb2huIExpZ2h0c2V5IGZpbGVkIGJ1ZyByZXBvcnQgIzE5OTkxODE6ICJDTE9DS19NT05PVE9OSUMgYWx3YXlzIGZhaWxzIG9uCiAgc29tZSBzeXN0ZW1zIiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk5OTE4MSkuIFRoZSBwcm9ibGVtIHdhcwogIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdCB1c2UgdGhlIF9QT1NJWF9NT05PVE9OSUNfQ0xPQ0sgZmVhdHVyZSB0ZXN0CiAgbWFjcm8gd2hlbiBjaGVja2luZyBtb25vdG9uaWMgY2xvY2sgYXZhaWxhYmlsaXR5LiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGhlCiAgbW9ub3RvbmljIGNsb2NrIHdpbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBmZWF0dXJlIHRlc3QgbWFjcm8gaXMgZGVmaW5lZAogIHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gemVybyBpbmRpY2F0aW5nIGFsd2F5cyBzdXBwb3J0ZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDI1IEp1biAyMDA4KQotIEhvbm91ciAtLXN0ZGVyciB3aXRoIHRoZSAtdiBvcHRpb24uCgotIEZpeGVkIGEgZmlsZSBoYW5kbGUgbGVhayBpbiB0aGUgY29tbWFuZCBsaW5lIGNsaWVudCBpZiBtb3JlIHRoYW4gb25lCiAgLS1zdGRlcnIgb3B0aW9uIHdhcyBnaXZlbi4KCkRhbmllbCBTdGVuYmVyZyAoMjIgSnVuIDIwMDgpCi0gRWR1YXJkIEJsb2NoIGZpbGVkIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjNDg3NTY3CiAgKGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00ODc1NjcpIHBvaW50aW5nIG91dCB0aGF0CiAgbGliY3VybCB1c2VkIENvbnRlbnQtUmFuZ2U6IGluc3RlYWQgb2YgUmFuZ2Ugd2hlbiBkb2luZyBhIHJhbmdlIHJlcXVlc3Qgd2l0aAogIC0taGVhZCAoQ1VSTE9QVF9OT0JPRFkpLiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDEwMzIgd2FzIGFkZGVkIHRvCiAgdmVyaWZ5LgoKRGFuaWVsIEZhbmRyaWNoICgyMSBKdW4gMjAwOCkKLSBTdG9wcGVkIHVzaW5nIHJhbmdlcyBpbiBzY2FuZiBjaGFyYWN0ZXIgc2VxdWVuY2VzIChlLmcuICVbYS16XSkgc2luY2UgdGhhdAogIGlzIG5vdCBBTlNJIEMsIGp1c3QgYSBjb21tb24gZXh0ZW5zaW9uLiAgVGhpcyBjYXVzZWQgcHJvYmxlbXMgb24KICBhdCBsZWFzdCBPcGVuIFdhdGNvbSBDLgoKWWFuZyBUc2UgKDIwIEp1biAyMDA4KQotIE1vZGlmaWVkIGNvbmZpZ3VyYXRpb24gc2NyaXB0IHRvIGFjdHVhbGx5IHZlcmlmeSBpZiB0aGUgY29tcGlsZXIgaXMgZ29vZAogIGVub3VnaCBhdCBkZXRlY3RpbmcgY29tcGlsYXRpb24gZXJyb3JzIG9yIGF0IGxlYXN0IGl0IGhhcyBiZWVuIHByb3Blcmx5CiAgY29uZmlndXJlZCB0byBkbyBzby4gQ29uZmlndXJhdGlvbiBoZWF2aWx5IGRlcGVuZHMgb24gdGhpcyBjYXBhYmlsaXR5LCBzbwogIGlmIHRoaXMgY29tcGlsZXIgc2FuaXR5IGNoZWNrIGZhaWxzIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBub3cgZmFpbC4KCkRhbmllbCBTdGVuYmVyZyAoMjAgSnVuIDIwMDgpCi0gUGhpbCBQZWxsb3VjaG91ZCBmb3VuZCBhIGNhc2Ugd2hlcmUgbGliY3VybCBidWlsdCB3aXRoIE5TUyBmYWlsZWQgdG8KICBoYW5kc2hha2Ugd2l0aCBhIFNTTHYyIHNlcnZlciwgYW5kIGl0IHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBpdCBkaWRuJ3QKICByZWNvZ25pemUgdGhlIGNpcGhlciBuYW1lZCAicmM0LW1kNSIuIEluIG91ciBsaXN0IHRoYXQgY2lwaGVyIHdhcyBuYW1lZAogIHBsYWlubHkgInJjNCIuIEkndmUgbm93IGFkZGVkIHJjNC1tZDUgdG8gd29yayBhcyBhbiBhbGlhcyBhcyBQaGlsIHJlcG9ydGVkCiAgdGhhdCBpdCBtYWRlIHRoaW5ncyB3b3JrIGZvciBoaW0gYWdhaW4uCgotIEhhbnMtSnVyZ2VuIE1heSBwb2ludGVkIG91dCB0aGF0IHRyeWluZyBTQ1Agb3IgU0ZUUCBvdmVyIGEgU09DS1MgcHJveHkKICBjcmFzaGVkIGxpYmN1cmwuIFRoaXMgaXMgbm93IGFkZHJlc3NlZCBieSBtYWtpbmcgc3VyZSB3ZSB1c2UgInBsYWluIHNlbmQiCiAgaW50ZXJuYWxseSB3aGVuIGRvaW5nIHRoZSBzb2NrcyBoYW5kc2hha2UgaW5zdGVhZCBvZiB0aGUgQ3VybF93cml0ZSgpCiAgZnVuY3Rpb24gd2hpY2ggaXMgZGVzaWduZWQgdG8gdXNlIHRoZSAidGFyZ2V0IiBwcm90b2NvbC4gVGhhdCdzIHRoZW4gU0NQIG9yCiAgU0ZUUCBpbiB0aGlzIGNhc2UuIEkgYWxzbyB0b29rIHRoZSBvcHBvcnR1bml0eSBhbmQgY2xlYW5lZCB1cCBzb21lIHNzaC0KICByZWxhdGVkICNpZmRlZnMgaW4gdGhlIGNvZGUgZm9yIHJlYWRhYmlsaXR5LgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBKdW4gMjAwOCkKLSBDaHJpc3RvcGhlciBQYWxvdyBmaXhlZCBhIGN1cmxfbXVsdGlfc29ja2V0KCkgaXNzdWUgd2hpY2ggcHJldmlvdXNseSBjYXVzZWQKICBsaWJjdXJsIHRvIG5vdCB0ZWxsIHRoZSBhcHAgcHJvcGVybHkgd2hlbiBhIHNvY2tldCB3YXMgY2xvc2VkICh3aGVuIHRoZSBuYW1lCiAgcmVzb2x2ZSBkb25lIGJ5IGMtYXJlcyBpcyBjb21wbGV0ZWQpIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHJlLWNyZWF0ZWQgYW5kIHB1dAogIHRvIHVzZSBhZ2FpbiAoZm9yIHRoZSBhY3R1YWwgY29ubmVjdGlvbikuIFNpbmNlIHRoZSBjbG9zdXJlIHdpbGwgbWFrZSB0aGUKICAid2F0Y2ggc3RhdHVzIiBnZXQgbG9zdCBpbiBzZXZlcmFsIGV2ZW50LWJhc2VkIHN5c3RlbXMgbGliY3VybCB3aWxsIG5lZWQgdG8KICB0ZWxsIHRoZSBhcHAgYWJvdXQgdGhpcyBjbG9zZS9yZS1jcmVhdGUgY2FzZS4KCi0gRGVuZ21pbndlbiBmb3VuZCBhIGJ1ZyBpbiB0aGUgY29ubmVjdGlvbiByZS11c2UgZnVuY3Rpb24gd2hlbiB1c2luZyB0aGUKICBtdWx0aSBpbnRlcmZhY2Ugd2l0aCBwaXBlbGluaW5nIGVuYWJsZWQgYXMgaXQgd291bGQgd3JvbmdseSBjaGVjayBmb3IsCiAgZGV0ZWN0IGFuZCBjbG9zZSAiZGVhZCBjb25uZWN0aW9ucyIgZXZlbiB0aG91Z2ggdGhhdCBjb25uZWN0aW9uIHdhcyBhbHJlYWR5CiAgaW4gdXNlIQoKRGFuaWVsIEZhbmRyaWNoICgxOCBKdW4gMjAwOCkKLSBBZGRlZCBTU0ggZmFpbHVyZSB0ZXN0IGNhc2VzIDYyOC02MzIKCi0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29tbWFuZC1saW5lIHRvb2wgdGhhdCBjYXVzZWQgYSB2YWxncmluZCBlcnJvci4KCkRhbmllbCBTdGVuYmVyZyAoMTggSnVuIDIwMDgpCi0gUm9iIENyaXR0ZW5kZW4gYnJvdWdodCBhIGZpeCBmb3IgdGhlIE5TUyBsYXllciB0aGF0IG1ha2VzIGxpYmN1cmwgbm8gbG9uZ2VyCiAgYWx3YXlzIGZpcmUgdXAgYSBuZXcgY29ubmVjdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGUgZXhpc3Rpbmcgb25lIHdoZW4gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQuIE9yaWdpbmFsIGJ1ZyByZXBvcnQ6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00NTAxNDAKCllhbmcgVHNlICgxOCBKdW4gMjAwOCkKLSBJbnRlcm5hbCBjb25maWd1cmUgc2NyaXB0IGltcHJvdmVtZW50LiBObyBsb25nZXIgYnJlYWsgb3V0IG9mIHNoZWxsICJmb3IiCiAgc3RhdGVtZW50cyBmcm9tIGluc2lkZSBBQ19GT09fSUZFTFNFIG1hY3Jvcywgb3RoZXJ3aXNlIHRlbXBvcmFyeSBtYWNybyBmaWxlcwogIGFyZSBub3QgcHJvcGVybHkgcmVtb3ZlZC4KCkRhbmllbCBGYW5kcmljaCAoMTIgSnVuIDIwMDgpCi0gRml4ZWQgY3VybC1jb25maWcgLS1jYSB3aGljaCB3YXNuJ3QgYmVpbmcgZXhwb3J0ZWQgYnkgY29uZmlndXJlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBKdW4gMjAwOCkKLSBJIGRpZCBhIGNsZWFudXAgb2YgdGhlIGludGVybmFsIGdlbmVyaWMgU1NMIGxheWVyIGFuZCBob3cgdGhlIHZhcmlvdXMgU1NMCiAgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuIFN0YXJ0aW5nIG5vdywgZWFjaCB1bmRlcmx5aW5nIFNTTCBsaWJyYXJ5IHN1cHBvcnQKICBjb2RlIGRvZXMgYSBzZXQgb2YgZGVmaW5lcyBmb3IgdGhlIDE2IGZ1bmN0aW9ucyB0aGUgZ2VuZXJpYyBsYXllciAoc3NsZ2VuLmMpCiAgdXNlcyAoYWxsIHRoZXNlIG5ldyBmdW5jdGlvbiBkZWZpbmVzIHVzZSB0aGUgcHJlZml4ICJjdXJsc3NsXyIpLiBUaGlzCiAgZ3JlYXRseSBzaW1wbGlmaWVkIHRoZSBnZW5lcmljIGxheWVyIGluIHJlYWRhYmlsaXR5IGJ5IGludm9sdmluZyBtdWNoIGxlc3MKICAjaWZkZWZzIGFuZCBvdGhlciBwcmVwcm9jZXNzb3Igc3R1ZmYgYW5kIHNob3VsZCBtYWtlIGl0IGVhc2llciBmb3IgcGVvcGxlIHRvCiAgbWFrZSBsaWJjdXJsIHdvcmsgd2l0aCBuZXcgU1NMIGxpYnJhcmllcy4KCiAgSG9wZWZ1bGx5IEkgY2FuIGxhdGVyIG9uIGRvY3VtZW50IHRoZXNlIDE2IGZ1bmN0aW9ucyBzb21ld2hhdCBhcyB3ZWxsLgoKICBJIGFsc28gbWFkZSBtb3N0IG9mIHRoZSBpbnRlcm5hbCBTU0wtZGVwZW5kZW50IGZ1bmN0aW9ucyAodXNpbmcgQ3VybF9zc2xfCiAgcHJlZml4KSAjZGVmaW5lZCB0byBub3RoaW5nIHdoZW4gbm8gU1NMIHN1cHBvcnQgaXMgcmVxdWVzdGVkIC0gcHJldmlvdXNseQogIHRoZXkgd291bGQgdW5uZWNlc3NhcmlseSBjYWxsIG1vc3RseSBlbXB0eSBmdW5jdGlvbnMuCgogIEkndmUgYnVpbHQgbGliY3VybCB3aXRoIE9wZW5TU0wgYW5kIEdudVRMUyBhbmQgd2l0aG91dCBTU0wgdG8gdGVzdCB0aGlzIGFuZAogIEkndmUgYWxzbyB0cmllZCBidWlsZGluZyB3aXRoIE5TUyBidXQgdGhlIE5TUyBzdXBwb3J0IGlzIGEgbXlzdGVyeSB0byBtZSBhbmQKICBJIGZhaWxlZCB0byBidWlsZCBsaWJjdXJsIHdpdGggdGhlIE5TUyBsaWJyYXJpZXMgSSBoYXZlIGluc3RhbGxlZC4gV2UgcmVhbGx5CiAgc2hvdWxkIEEpIGltcHJvdmUgb3VyIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHVuc3VpdGFibGUgTlNTIHZlcnNpb25zCiAgYWxyZWFkeSBhdCBjb25maWd1cmUgdGltZSBhbmQgQikgZG9jdW1lbnQgb3VyIHJlcXVpcmVtZW50cyBiZXR0ZXIgZm9yIHRoZQogIFNTTCBsaWJyYXJpZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDEwIEp1biAyMDA4KQotIEkgbWFkZSB0aGUgT3BlblNTTCBjb2RlIGJ1aWxkIGFnYWluIHdpdGggT3BlblNTTCAwLjkuNi4gVGhlIENSTEZJTEUKICBmdW5jdGlvbmFsaXR5IGtpbGxlZCBpdCBkdWUgdG8gaXRzIHVuY29uZGl0aW9uYWwgdXNlIG9mCiAgWDUwOV9TVE9SRV9zZXRfZmxhZ3MuLi4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdW4gMjAwOCkKLSBEdWUgdG8gdGhlIHRocmVlIG5ldyBsaWJjdXJsIGNoYW5nZXMgYW5kIHRoZSBtYXNzaXZlIGNvbW1hbmQgbGluZSBvcHRpb24KICBjaGFuZ2UgSSBkZWNpZGVkIHdlJ2xsIG1hcmsgaXQgYnkgYnVtcGluZyB0aGUgbmV4dCByZWxlYXNlIG51bWJlciB0byA3LjE5LjAhCgotIGN1cmwgdGhlIHRvb2wgbm93IGRlYWxzIHdpdGggaXRzIGNvbW1hbmQgbGluZSBvcHRpb25zIHNvbWV3aGF0IGRpZmZlcmVudGx5IQogIEFsbCBib29sZWFuIG9wdGlvbnMgKHN1Y2ggYXMgLU8sIC1JLCAtdiBldGMpLCBib3RoIHNob3J0IGFuZCBsb25nIHZlcnNpb25zLAogIG5vdyBhbHdheXMgc3dpdGNoIG9uL2VuYWJsZSB0aGUgb3B0aW9uIG5hbWVkLiBVc2luZyB0aGUgc2FtZSBvcHRpb24gbXVsdGlwbGUKICB0aW1lcyB0aHVzIG1ha2Ugbm8gZGlmZmVyZW5jZS4gVG8gc3dpdGNoIG9mZiBvbmUgb2YgdGhvc2Ugb3B0aW9ucywgeW91IG5lZWQKICB0byB1c2UgdGhlIGxvbmcgdmVyc2lvbiBvZiB0aGUgb3B0aW9uIGFuZCB0eXBlIC0tbm8tT1BUSU9OLiBMaWtlIHRvIGRpc2FibGUKICB2ZXJib3NlIG1vZGUgeW91IHVzZSAtLW5vLXZlcmJvc2UhCgotIEFkZGVkIC0tcmVtb3RlLW5hbWUtYWxsIHRvIGN1cmwsIHdoaWNoIGlmIHVzZWQgY2hhbmdlcyB0aGUgZGVmYXVsdCBmb3IgYWxsCiAgZ2l2ZW4gVVJMcyB0byBiZSBkZWFsdCB3aXRoIGFzIGlmIC1PIGlzIHVzZWQuIFNvIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhhdAogIGZvciBhIHNwZWNpZmljIFVSTCBhZnRlciAtLXJlbW90ZS1uYW1lLWFsbCBoYXMgYmVlbiB1c2VkLCB5b3UgbXVzZSB1c2UgLW8gLQogIG9yIC0tbm8tcmVtb3RlLW5hbWUuCgpEYW5pZWwgU3RlbmJlcmcgKDYgSnVuIDIwMDgpCi0gQXhlbCBUaWxsZXF1aW4gYW5kIEFybmF1ZCBFYmFsYXJkIGFkZGVkIHN1cHBvcnQgZm9yIENVUkxPUFRfSVNTVUVSQ0VSVCwgZm9yCiAgT3BlblNTTCwgTlNTIGFuZCBHbnVUTFMtYnVpbHQgbGliY3VybHMuCgotIEF4ZWwgVGlsbGVxdWluIGFuZCBBcm5hdWQgRWJhbGFyZCBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX0NSTEZJTEUsIGZvcgogIE9wZW5TU0wsIE5TUyBhbmQgR251VExTLWJ1aWx0IGxpYmN1cmxzLgoKLSBBZGRlZCBDVVJMSU5GT19QUklNQVJZX0lQIGFzIGEgbmV3IGluZm9ybWF0aW9uIHJldHJpZXZhYmxlIHdpdGgKICBjdXJsX2Vhc3lfZ2V0aW5mby4gSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnRseQogIHVzZWQgSVAgYWRkcmVzcy4gTW9kaWZpZWQgdGVzdCBjYXNlIDUwMCB0byBhbHNvIHZlcmlmeSB0aGlzIGZlYXR1cmUuIFRoZQogIGltcGxlbWVudGluZyBvZiB0aGlzIGZlYXR1cmUgd2FzIHNwb25zb3JlZCBieSBMZW5ueSBSYWNoaXRza3kgYXQgTmV1U3Rhci4KClZlcnNpb24gNy4xOC4yICg0IEp1bmUgMjAwOCkKCkRhbmllbCBGYW5kcmljaCAoMyBKdW4gMjAwOCkKLSBGaXhlZCBhIHByb2JsZW0gd2hlcmUgdGVsbmV0IGRhdGEgd291bGQgYmUgbG9zdCBpZiBhbiBFV09VTERCTE9DSwogIGNvbmRpdGlvbiB3ZXJlIGVuY291bnRlcmVkLgoKTWFydHkgS3VocnQgKDEgSnVuIDIwMDgpCi0gVXBkYXRlZCBtYWluLmMgdG8gcmV0dXJuIENVUkxFX09LIGlmIFBBUkFNX0hFTFBfUkVRVUVTVEVEIHdhcyByZXR1cm5lZAogIGZyb20gZ2V0cGFyYW1ldGVyIGluc3RlYWQgb2YgQ1VSTEVfRkFJTEVEX0lOSVQuICBObyBwb2ludCBpbiByZXR1cm5pbmcKICBhbiBlcnJvciBpZiAtLWhlbHAgb3IgLS12ZXJzaW9uIHdlcmUgcmVxdWVzdGVkLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBNYXkgMjAwOCkKLSBFbWlsIFJvbWFudXMgZm91bmQgYSBwcm9ibGVtIGFuZCBoZWxwZWQgbWUgcmVwZWF0IGl0LiBJdCBvY2N1cmVkIHdoZW4gdXNpbmcKICB0aGUgY3VybF9tdWx0aV9zb2NrZXQoKSBBUEkgd2l0aCBIVFRQIHBpcGVsaW5pbmcgZW5hYmxlZCBhbmQgY291bGQgbGVhZCB0bwogIHRoZSBwaXBlbGluZSBiYXNpY2FsbHkgc3RhbGxpbmcgZm9yIGEgdmVyeSBsb25nIHBlcmlvZCBvZiB0aW1lIHVudGlsIGl0IHRvb2sKICBvZmYgYWdhaW4uCgotIEplZmYgV2ViZXIgcmVwb3J0ZWQgbWVtb3J5IGxlYWtzIHdpdGggYWJvcnRlZCBTQ1AgYW5kIFNGVFAgdHJhbnNmZXJzIGFuZAogIHByb3ZpZGVkIGV4Y2VsbGVudCByZXBlYXQgcmVjaXBlcy4gSSBmaXhlZCB0aGUgY2FzZXMgSSBtYW5hZ2VkIHRvIHJlcHJvZHVjZQogIGJ1dCBKZWZmIHN0aWxsIGdvdCBzb21lIChTQ1ApIHByb2JsZW1zIGV2ZW4gYWZ0ZXIgdGhlc2UgZml4ZXM6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTA1LzAzNDIuaHRtbAoKRGFuaWVsIFN0ZW5iZXJnICgyNiBNYXkgMjAwOCkKLSBCdWcgcmVwb3J0ICMxOTczMzUyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTczMzUyKSBpZGVudGlmaWVkCiAgaG93IHRoZSBIVFRQIHJlZGlyZWN0IGZvbGxvd2luZyBjb2RlIGRpZG4ndCBwcm9wZXJseSBmb2xsb3cgdG8gYSBuZXcgVVJMIGlmCiAgdGhlIG5ldyB1cmwgd2FzIGJ1dCBhIHF1ZXJ5IHN0cmluZyBzdWNoIGFzICJMb2NhdGlvbjogP21vbz1mb28iLiBUZXN0IGNhc2UKICAxMDMxIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcyBmaXguCgotIEFuZHJlYXMgRmFlcmJlciBhbmQgU2NvdHQgTWNDcmVhcnkgbWFkZSAobGliKWN1cmwgYnVpbGQgZm9yIHRoZSBIYWlrdSBPUy4KCllhbmcgVHNlICgyNiBNYXkgMjAwOCkKLSBEYXZpZCBSb3NlbnN0cmF1Y2ggcmVwb3J0ZWQgdGhhdCBoZWFkZXIgZmlsZXMgc3BuZWdvaGVscC5oIGFuZAogIG9wZW5zc2wvb2JqZWN0cy5oIHdlcmUgbmVlZGVkIHRvIGNvbXBpbGUgU1BORUdPIHN1cHBvcnQuCgpEYW5pZWwgRmFuZHJpY2ggKDIyIE1heSAyMDA4KQotIE1hZGUgc3VyZSB0byBwYXNzIGxvbmdzIGluIHRvIGN1cmxfZWFzeV9zZXRvcHQgd2hlcmUgbmVjZXNzYXJ5IGluIHRoZQogIGV4YW1wbGUgcHJvZ3JhbXMgYW5kIGxpYnRlc3QgY29kZS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTWF5IDIwMDgpCi0gV2hlbiB0cnlpbmcgdG8gcmVwZWF0IGEgbXVsdGkgaW50ZXJmYWNlIHByb2JsZW0gSSBmZWxsIG92ZXIgYSBmZXcgbXVsdGkKICBpbnRlcmZhY2UgcHJvYmxlbXM6CgogIG8gd2l0aCBwaXBlbGluaW5nIGRpc2FibGVkLCB0aGUgc3RhdGUgc2hvdWxkIG5ldmVyIGJlIHNldCB0byBXQUlURE8gYnV0CiAgICByYXRoZXIgZ28gc3RyYWlnaHQgdG8gRE8KCiAgbyB3ZSBoYWQgbXVsdGlwbGUgc3RhdGVzIGZvciB3aGljaCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gcmV0dXJuZWQgbm8gc29ja2V0CiAgICBhdCBhbGwgdG8gd2FpdCBmb3IsIHdpdGggdGhlIGVmZmVjdCB0aGF0IGxpYmN1cmwgY2FsbHMgdGhlIHNvY2tldCBjYWxsYmFjawogICAgKHdoZW4gY3VybF9tdWx0aV9zb2NrZXQoKSBpcyB1c2VkKSB3aXRoIFJFTU9WRSBwcmVtYXR1cmVseSAoYXMgaXQgd291bGQgYmUKICAgIGFkZGVkIGFnYWluIHdpdGhpbiB2ZXJ5IHNob3J0bHkpCgogIG8gd2hlbiBpbiBETyBhbmQgRE9JTkcgc3RhdGVzLCB0aGUgSFRUUCBhbmQgSFRUUFMgcHJvdG9jb2wgaGFuZGxlciBmdW5jdGlvbnMKICAgIGRpZG4ndCByZXR1cm4gdGhhdCB0aGUgc29ja2V0IHNob3VsZCBiZSB3YWl0ZWQgZm9yIHdyaXRpbmcsIGJ1dCBpbnN0ZWFkIGl0CiAgICB3YXMgdHJlYXRlZCBhcyBpZiBubyBzb2NrZXQgd2FzIG5lZWRpbmcgbW9uaXRvcmluZyBzbyBhZ2FpbiBSRU1PVkUgd2FzCiAgICBjYWxsZWQgcHJlbWF0dXJlbHkuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1heSAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZSA1NTYgdGhhdCB1c2VzIGN1cmxfZWFzeV9zZW5kKCkgYW5kIGN1cmxfZWFzeV9yZWN2KCkKCkRhbmllbCBTdGVuYmVyZyAoOSBNYXkgMjAwOCkKLSBJbnRyb2R1Y2luZyBjdXJsX2Vhc3lfc2VuZCgpIGFuZCBjdXJsX2Vhc3lfcmVjdigpLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHNlbmQKICBhbmQgcmVjZWl2ZSBkYXRhIG92ZXIgYSBjb25uZWN0aW9uIHByZXZpb3VzbHkgc2V0dXAgd2l0aCBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgYW5kIGl0cyBDVVJMT1BUX0NPTk5FQ1RfT05MWSBvcHRpb24uIFRoZSBzZW5kcmVjdi5jIGV4YW1wbGUgd2FzIGFkZGVkIHRvCiAgc2hvdyBob3cgdGhleSBjYW4gYmUgdXNlZC4KCllhbmcgVHNlICg5IE1heSAyMDA4KQotIEludGVybmFsIHRpbWUgZGlmZmVyZW5jZXMgbm93IHVzZSBtb25vdG9uaWMgdGltZSBzb3VyY2UgaWYgYXZhaWxhYmxlLgogIFRoaXMgYWxzbyBpbXBsaWVzIHRoZSByZW1vdmFsIG9mIHRoZSB3aW5tbS5saWIgZGVwZW5kZW5jeSBmb3IgV0lOMzIuCgpEYW5pZWwgU3RlbmJlcmcgKDkgTWF5IDIwMDgpCi0gU3RlZmFuIEtyYXVzZSByZXBvcnRlZCBhIGJ1c3ktbG9vcGluZyBjYXNlIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIGFuZCBkb2luZyBDT05ORUNUIHRvIGEgcHJveHkuIFRoZSBhcHAgd291bGQgdGhlbiBidXN5LWxvb3AgdW50aWwgdGhlIHByb3h5CiAgY29tcGxldGVkIGl0cyByZXNwb25zZS4KCk1pY2hhbCBNYXJlayAoOSBNYXkgMjAwOCkKLSBNYWtlIEN1cmxfd3JpdGUgYW5kIGl0J3MgY2FsbGVlcyBhY2NlcHQgYSBjb25zdCBwb2ludGVyLCBpbiBwcmVwYXJhdGlvbgogIG9mIHRldGV0ZXN0J3MgcGF0Y2ggZm9yIGN1cmxfZWFzeV9zZW5kKCkKCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOCkKLSBMaWFtIEhlYWx5IGZpbGVkIHRoZSBkZWJpYW4gYnVnIHJlcG9ydCAjNDgwMDQ0CiAgKGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00ODAwNDQpIGlkZW50aWZ5aW5nIGEKICBzZWdmYXVsdCB3aGVuIHVzaW5nIGtyYjUgZnRwLCBidXQgdGhlIGtyYjQgY29kZSBoYWQgdGhlIHNhbWUgcHJvYmxlbS4KCllhbmcgVHNlICg3IE1heSAyMDA4KQotIENocmlzdG9waGVyIFBhbG93IHByb3ZpZGVkIHRoZSBwYXRjaCAoZWRpdGVkIGJ5IG1lKSB0aGF0IGludHJvZHVjZXMgdGhlCiAgdXNlIG9mIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24ga2V5cyBmb3IgaW50ZXJuYWwgc3BsYXkgdHJlZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTWF5IDIwMDgpCi0gWXVyaXkgU29zb3YgcG9pbnRlZCBvdXQgYSBjb25maWd1cmUgZml4IGZvciBkZXRlY3RpbmcgYy1hcmVzIHdoZW4gdGhhdCBpcwogIGJ1aWx0IGRlYnVnLWVuYWJsZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWF5IDIwMDgpCi0gQmVuIFZhbiBIb2YgZmlsZWQgYnVnIHJlcG9ydCAjMTk0NTI0MDogImxpYmN1cmwgc29tZXRpbWVzIHNlbmRzIGJvZHkgdHdpY2UKICB3aGVuIHVzaW5nIENVUkxfQVVUSF9BTlkiIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xOTQ1MjQwKS4KICBUaGUgcHJvYmxlbSB3YXMgdGhhdCB3aGVuIGxpYmN1cmwgcmV3b3VuZCBhIHN0cmVhbSBtZWFudCBmb3IgdXBsb2FkIHdoZW4gaXQKICB3b3VsZCBwcmVwYXJlIGZvciBhIHNlY29uZCByZXF1ZXN0LCBpdCBjb3VsZCBhY2NpZGVudGFsbHkgY29udGludWUgdGhlCiAgc2VuZGluZyBvZiB0aGUgcmV3b3VuZCBkYXRhIG9uIHRoZSBmaXJzdCByZXF1ZXN0IGluc3RlYWQgb2Ygb24gdGhlIHNlY29uZC4KICBCZW4gYWxzbyBwcm92aWRlZCB0ZXN0IGNhc2UgMTAzMCB0aGF0IHZlcmlmaWVzIHRoaXMgZml4LgoKRGFuaWVsIFN0ZW5iZXJnICgzIE1heSAyMDA4KQotIEplYW4tRnJhbmNvaXMgQmVydHJhbmQgcmVwb3J0ZWQgYSBsaWJjdXJsIGNyYXNoIHdpdGggQ1VSTE9QVF9UQ1BfTk9ERUxBWQogIHNpbmNlIGxpYmN1cmwgdXNlZCBnZXRwcm90b2J5bmFtZSgpIGFuZCB0aGF0IGlzbid0IHRocmVhZC1zYWZlLiBXZSBub3cKICBzd2l0Y2hlZCB0byB1c2UgSVBQUk9UT19UQ1AgdW5jb25kaXRpb25hbGx5LCBidXQgcGVyaGFwcyB0aGUgcHJvcGVyIGZpeCBpcwogIHRvIGRldGVjdCB0aGUgdGhyZWFkLXNhZmUgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gYW5kIHVzZSB0aGF0LgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOC0wNS8wMDExLmh0bWwKCkRhbmllbCBTdGVuYmVyZyAoMSBNYXkgMjAwOCkKLSBCYXJ0IFdoaXRlbGV5IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIGxpYmN1cmwgd29yayBwcm9wZXJseSB3aGVuIGFuIGFwcAogIHVzZXMgdGhlIENVUkxPUFRfT1BFTlNPQ0tFVEZVTkNUSU9OIGNhbGxiYWNrIHRvIGNyZWF0ZSBhIHVuaXggZG9tYWluIHNvY2tldAogIHRvIGEgaHR0cCBzZXJ2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEFwciAyMDA4KQotIFRvIG1ha2UgaXQgZWFzaWVyIGZvciBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IGxvdHMgb2YgbWFnaWMgc3R1ZmYgZG9uZSBvbgogIHJlZGlyZWN0aW9ucyBhbmQgdGh1cyBjYW5ub3QgdXNlIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gZWFzaWx5LCB3ZSBub3cKICBpbnRyb2R1Y2UgdGhlIG5ldyBDVVJMSU5GT19SRURJUkVDVF9VUkwgb3B0aW9uIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMKICBleHRyYWN0IHRoZSBVUkwgbGliY3VybCB3b3VsZCd2ZSByZWRpcmVjdGVkIHRvIGlmIGl0IGhhZCBiZWVuIHRvbGQgdG8uIFRoaXMKICB0aGVuIGVuYWJsZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRpbnVlIHRvIHRoYXQgVVJMIGFzIGl0IHRoaW5rcyBpcwogIHN1aXRhYmxlLCB3aXRob3V0IGhhdmluZyB0byByZS1pbXBsZW1lbnQgdGhlIG1hZ2ljIG9mIGNyZWF0aW5nIHRoZSBuZXcgVVJMCiAgZnJvbSB0aGUgTG9jYXRpb246IGhlYWRlciBldGMuIFRlc3QgMTAyOSB2ZXJpZmllcyBpdC4KCllhbmcgVHNlICgyOSBBcHIgMjAwOCkKLSBJbXByb3ZlZCBlYXN5IGludGVyZmFjZSByZXNvbHZpbmcgdGltZW91dCBoYW5kbGluZyBpbiBjLWFyZXMgZW5hYmxlZCBidWlsZHMKCkRhbmllbCBGYW5kcmljaCAoMjggQXByIDIwMDgpCi0gQWRkZWQgdGVzdCAxMDI4IHRvIHRlc3QgYW4gSFRUUCByZWRpcmVjdCB0byBhIEZUUCBVUkwuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IEFwciAyMDA4KQotIE5vcmJlcnQgRnJlc2UgZmlsZWQgYnVnIHJlcG9ydCAjMTk1MTU4ODogIlByb2JsZW0gd2l0aCBjdXJsZnRwZnMgYW5kCiAgbGliY3VybCIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NTE1ODgpIHdoaWNoIHNlZW1zIHRvIGJlIGFuCiAgaWRlbnRpY2FsIHJlcG9ydCB0byB3aGF0IERlbmlzIEdvbG92YW4gcmVwb3J0ZWQgaW4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDIvMDEwOC5odG1sIFRoZSBGVFAgY29kZSBkaWRuJ3QgcmVzZXQgdGhlCiAgdXNlci9wYXNzd29yZCBwb2ludGVycyBwcm9wZXJseSBldmVuIHRob3VnaCB0aGVyZSBtaWdodCd2ZSBiZWVuIGEgbmV3CiAgc3RydWN0L2Njb25uZWN0aW9uIGdldHRpbmcgdXNlZC4KCkRhbmllbCBTdGVuYmVyZyAoMjYgQXByIDIwMDgpCi0gUmV2ZXJ0ZWQgYmFjayB0byB1c2UgYXV0b21ha2UgMS45LjYgaW4gdGhlIG5leHQgcmVsZWFzZSAoZnJvbSBhdXRvbWFrZQogIDEuMTAuMSkgc2luY2UgaXQgKnN0aWxsKiBzdWZmZXJzIGZyb20gU29sYXJpcy1yZWxhdGVkIGJ1Z3MuIE91ciBwcmV2aW91cwogIGF1dG9tYWtlIDEuMTAgcHJvYmxlbSB3YXMgcmVwb3J0ZWQgaW4gYnVnICMxNzAxMzYwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDEzNjApIGFuZCB0aGlzIHJlY2VudCBwcm9ibGVtIHdhcwogIGJ1ZyAjMTk0NDgyNSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTk0NDgyNSkuIEkgaGF2ZSBub3QKICBwZXJzb25hbGx5IGFwcHJvYWNoZWQgdGhlIGF1dG9tYWtlIHRlYW0gYWJvdXQgZWl0aGVyIG9uZSBvZiB0aGVzZSBidXQgSQogIGZpZ3VyZSB3ZSBuZWVkIGEgU29sYXJpcyAxMCBndXkgdG8gZG8gaXQhCgpZYW5nIFRzZSAoMjUgQXByIDIwMDgpCi0gQWRkZWQgJ3RpbWVvdXQnIGFuZCAnZGVsYXknIGF0dHJpYnV0ZXMgc3VwcG9ydCBmb3IgdGhlIHRlc3QgaGFybmVzcwogIDxjb21tYW5kPiBzdWJzZWN0aW9uLgoKRGFuaWVsIEZhbmRyaWNoICgyNCBBcHIgMjAwOCkKLSBNYWRlIC0tc3RkZXJyIGFibGUgdG8gcmVkaXJlY3QgYWxsIHN0ZGVyciBtZXNzYWdlcy4KCllhbmcgVHNlICgyMyBBcHIgMjAwOCkKLSBJbXByb3ZlIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRlc3QgaGFybmVzcyBydW50ZXN0cy5wbCBzY3JpcHQKICBhbmQgdGVzdCBoYXJuZXNzIHNlcnZlcnMgdG8gbWluaW1pemUgcmlzayBvZiBmYWxzZSB0ZXN0IGZhaWx1cmVzLgoKRGFuaWVsIEZhbmRyaWNoICgyMiBBcHIgMjAwOCkKLSBBZGRlZCBzdXBwb3J0IGZvciBydW5uaW5nIG9uIFN5bWJpYW4gT1MuCgpEYW5pZWwgRmFuZHJpY2ggKDE4IEFwciAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTAyNiBhbmQgMTAyNyB0byBkbyBzb21lIHJ1ZGltZW50YXJ5IHRlc3RzIG9uIHRoZSAtLW1hbnVhbAogIGFuZCAtLWhlbHAgb3B0aW9ucy4KCk1pY2hhbCBNYXJlayAoMTQgQXByIDIwMDgpCi0gYWxsb3cgZGlzYWJsaW5nIHRoZSB0eXBlY2hlY2tlciBieSBkZWZpbmluZyBDVVJMX0RJU0FCTEVfVFlQRUNIRUNLLCBhcwogIGRpc2N1c3NlZCBpbiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDgtMDQvMDI5MS5odG1sCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEFwciAyMDA4KQotIFN0ZWZhbiBLcmF1c2UgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIHRoZSBPcGVuU1NMIGhhbmRzaGFrZSBwaGFzZSB3YXNuJ3QKICBwcm9wZXJseSBhY2tub3dsZWRnaW5nIHRoZSB0aW1lb3V0IHZhbHVlcywgbGlrZSBpZiB5b3UgcHVsbGVkIHRoZSBuZXR3b3JrCiAgcGx1ZyBpbiB0aGUgbWlkc3Qgb2YgaXQuCgotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBzZWNvbmQgY2FzZSBvZiBub3QgY2hlY2tpbmcgdGhlIG1hbGxvYygpCiAgcmV0dXJuIGNvZGUgaW4gdGhlIE5lZ290aWF0ZSBjb2RlLgoKLSBTYW5kb3IgRmVsZGkgcmVwb3J0ZWQgYnVnICMxOTQyMDIyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5NDIwMjIpIHBvaW50aW5nIG91dCBhIG1pc3Rha2UgaW4gdGhlCiAgbGliL01ha2VmaWxlLnZjWzY4XSBtYWtlZmlsZXMnIHJlbGVhc2Utc3NsLWRsbCB0YXJnZXQuCgotIEJyb2NrIE5vbGFuZCByZXBvcnRlZCB0aGF0IGN1cmwgYmVoYXZlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hpY2ggb3JkZXIKICB5b3UgdXNlZCAtaSBhbmQgLUkuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEFwciAyMDA4KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgY2FzZSB3aGVyZSBtYWxsb2MoKSB3YXMgY2FsbGVkIGJ1dAogIHdhcyBub3QgY2hlY2tlZCBmb3IgYSBOVUxMIHJldHVybiwgaW4gdGhlIE5lZ290aWF0ZSBjb2RlLgoKRGFuaWVsIEZhbmRyaWNoICg5IEFwciAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTAyNCAmIDEwMjUgdG8gdGVzdCBhIHNjZW5hcmlvIHNpbWlsYXIgdG8gdGhlIG9uZSByZXBvcnRlZAogIGJ5IEJlbiBDb21iZWUgd2hlcmUgbGliY3VybCB3b3VsZCBzZW5kIHRoZSB3cm9uZyBjb29raWUgdG8gYSByZWRpcmVjdGVkCiAgc2VydmVyLiAgbGliY3VybCB3YXMgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGluIHRoZXNlIHRlc3QgY2FzZXMuCgpNaWNoYWwgTWFyZWsgKDcgQXByIDIwMDgpCi0gRml4IHRoZSBNSVQgLyBIZWltZGFsIGNoZWNrIGZvciBnb29kOgogIERlZmluZSBIQVZFX0dTU01JVCBpZiA8Z3NzYXBpL3tnc3NhcGkuaCxnc3NhcGlfZ2VuZXJpYy5oLGdzc2FwaV9rcmI1Lmh9PiBhcmUKICBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZpbmUgSEFWRV9HU1NIRUlNREFMIGlmIDxnc3NhcGkuaD4gaXMgYXZhaWxhYmxlLgoKICBPbmx5IGRlZmluZSBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSB0byBnc3NfbnRfc2VydmljZV9uYW1lIGlmCiAgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UgaXNuJ3QgZGVjbGFyZWQgYnkgdGhlIGdzc2FwaSBoZWFkZXJzLiBUaGlzIHNob3VsZAogIGF2b2lkIGJyZWFrYWdlIGluIGNhc2Ugd2Ugd3JvbmdseSByZWNvZ25pemUgSGVpbWRhbCBhcyBNSVQgYWdhaW4uCgpEYW5pZWwgU3RlbmJlcmcgKDUgQXByIDIwMDgpCi0gQWxleGV5IFNpbWFrIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHRvIHJlc2V0IHRoZSBtYXggcmVkaXJlY3QgbGltaXQgcHJvcGVybHkKCi0gQmFzZWQgb24gdGhlIERlYmlhbiBidWcgcmVwb3J0ICM0NzQyMjQgdGhhdCBjb21wbGFpbmVkIGFib3V0IHRoZSBGVFAgZXJyb3IKICBtZXNzYWdlIHdoZW4gbGliY3VybCBkb2Vzbid0IGdldCBhIDIyMCBiYWNrIGltbWVkaWF0ZWx5IG9uIGNvbm5lY3QsIEkgbm93CiAgY2hhbmdlZCBpdCB0byBiZSBtb3JlIHNwZWNpZmljIG9uIHdoYXQgdGhlIHByb2JsZW0gaXMuIEFsc28gd29ydGggbm90aWNpbmc6CiAgd2hpbGUgdGhlIGJ1ZyByZXBvcnQgY29udGFpbnMgYW4gZXhhbXBsZSB3aGVyZSB0aGUgcmVzcG9uc2UgaXM6CgogICAgNDIxIFRoZXJlIGFyZSB0b28gbWFueSBjb25uZWN0ZWQgdXNlcnMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIKCiAgd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYWx3YXlzIGJlIHRoaXMgcmVhZGFibGUgbm9yCiAgdGhhdCBpdCBmaXRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYm91bmRhcnkgZXRjLgoKRGFuaWVsIEZhbmRyaWNoICgzIEFwciAyMDA4KQotIEFkZGVkIHRlc3Q2MjcgdG8gdGVzdCBTRlRQIHdpdGggQ1VSTE9QVF9OT0JPRFkKCkRhbmllbCBTdGVuYmVyZyAoMyBBcHIgMjAwOCkKLSBTZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIEZBTFNFIHdpbGwgbm93IHN3aXRjaCB0aGUgSFRUUCByZXF1ZXN0IG1ldGhvZCB0bwogIEdFVCBzaW1wbHkgYmVjYXVzZSBwcmV2aW91c2x5IHdoZW4geW91IHNldCBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGZpcnN0IGFuZAogIHRoZW4gRkFMU0UgeW91J2QgZW5kIHVwIGluIGEgYnJva2VuIHN0YXRlIHdoZXJlIGEgSFRUUCByZXF1ZXN0IHdvdWxkIGRvIGEKICBIRUFEIGJ5IHN0aWxsIGFjdCBhIGxvdCBsaWtlIGZvciBhIEdFVCBhbmQgaGFuZyB3YWl0aW5nIGZvciB0aGUgY29udGVudCBldGMuCgotIFNjb3R0IEJhcnJldHQgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9OT0JPRFkgb3ZlciBTRlRQCgpEYW5pZWwgRmFuZHJpY2ggKDMgQXByIDIwMDgpCi0gTWFkZSBzdXJlIHRoYXQgY3VybF9nbG9iYWxfaW5pdCBpcyBjYWxsZWQgaW4gYWxsIHRoZSBtdWx0aXRocmVhZGVkCiAgZXhhbXBsZSBwcm9ncmFtcy4KCk1pY2hhbCBNYXJlayAoMzEgTWFyIDIwMDgpCi0gUmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUuIFRoZSB2ZXJiYXRpbSB2YWx1ZSBvZiAkY2EgYW5kCiAgJGNhcGF0aCBpcyBrbm93biB0byBjb25maWd1cmUsIHNvIGl0IGNhbiBiZSBkZWZpbmVkIGluIGNvbmZpZy5oIGluc3RlYWQuCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE1hciAyMDA4KQotIEFkZGVkIENVUkxGT1JNX1NUUkVBTSBhcyBhIHN1cHBvcnRlZCBvcHRpb24gdG8gY3VybF9mb3JtYWRkKCkgdG8gYWxsb3cgYW4KICBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGRhdGEgZm9yIGEgbXVsdGlwYXJ0IHdpdGggdGhlIHJlYWQgY2FsbGJhY2suIE5vdGUKICB0aGF0IHRoZSBzaXplIG5lZWRzIHRvIGJlIHByb3ZpZGVkIHdpdGggQ1VSTEZPUk1fQ09OVEVOVFNMRU5HVEggd2hlbiB0aGUKICBzdHJlYW0gb3B0aW9uIGlzIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyB2ZXJpZmllZCBieSB0aGUgbmV3IHRlc3QgY2FzZQogIDU1NC4gVGhpcyBmZWF0dXJlIHdhcyBzcG9uc29yZWQgYnkgWHBvbmF1dC4KCkRhbmllbCBGYW5kcmljaCAoMzAgTWFyIDIwMDgpCi0gQ2hhbmdlZCB0aGUgbWFrZWZpbGUgc28gdGhlIGRvYy9leGFtcGxlcy8gcHJvZ3JhbXMgYXJlIG5ldmVyIGJ1aWx0IGluIGEKICBub3JtYWwgYnVpbGQvaW5zdGFsbCAob25seSB3aXRoIHRoZSAnbWFrZSBjaGVjaycgdGFyZ2V0KSwgc28gdGhhdCBhCiAgYnVpbGQgZmFpbHVyZSBpbiB0aGUgZXhhbXBsZXMgaXNuJ3QgZmF0YWwuCgpWZXJzaW9uIDcuMTguMSAoMzAgTWFyY2ggMjAwOCkKCkRhbmllbCBTdGVuYmVyZyAoMjggTWFyIDIwMDgpCi0gU3RlcGhlbiBDb2xseWVyIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0td2l0aC1saWJzc2gyIHdpdGhvdXQgYSBnaXZlbgogIHBhdGggZGlkbid0IHdvcmsgcHJvcGVybHkuCgpEYW5pZWwgU3RlbmJlcmcgKDI3IE1hciAyMDA4KQotIEFzIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQgYnkgRGFuIFBldGl0dCwgbGliY3VybCBkaWRuJ3Qgc2hvdyBwcm9ncmVzcy9jYWxsCiAgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGZvciB0aGUgZmlyc3QgKHBvdGVudGlhbGx5IGh1Z2UpIHBpZWNlIG9mIGJvZHkgZGF0YQogIHNlbnQgdG9nZXRoZXIgd2l0aCB0aGUgUE9TVCByZXF1ZXN0IGhlYWRlcnMgaW4gdGhlIGluaXRpYWwgc2VuZCgpLgoKRGFuaWVsIFN0ZW5iZXJnICgyNSBNYXIgMjAwOCkKLSBNYWRlIHNldHRpbmcgdGhlIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiBvcHRpb24gcmV0dXJuIGEgZmFpbHVyZSBpbiBjYXNlCiAgbGliY3VybCB3YXNuJ3QgYnVpbHQgdG8gdXNlIE9wZW5TU0wgYXMgdGhhdCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgdGhpcwogIG9wdGlvbiB0byBmdW5jdGlvbiEKCkRhbmllbCBTdGVuYmVyZyAoMjIgTWFyIDIwMDgpCi0gRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkb2luZyBhIHplcm8gYnl0ZSBTQ1AgdHJhbnNmZXIsIHZlcmlmaWVkIHdpdGggdGVzdAogIGNhc2UgNjE3ICh3aGljaCB3YXMgYWRkZWQgYnkgRGFuaWVsIEZhbmRyaWNoIDUgTWFyIDIwMDgpLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBNYXIgMjAwOCkKLSBGaXhlZCBhIHByb2JsZW0gd2hlcmUgY3VybC1jb25maWcgLS1wcm90b2NvbHMgY291bGQgZXJyb25lb3VzbHkgc2hvdyBMREFQUwogIHN1cHBvcnQgd2hlbiBjdXJsIGRpZG4ndCBldmVuIGhhdmUgcmVndWxhciBMREFQIHN1cHBvcnQuICBJdCBsb29rcyBsaWtlCiAgdGhpcyBjb3VsZCBoYXBwZW4gd2hlbiB0aGUgLS1lbmFibGUtbGRhcHMgY29uZmlndXJlIHN3aXRjaCBpcyBnaXZlbiBidXQKICBjb25maWd1cmUgY291bGRuJ3QgZmluZCB0aGUgTERBUCBoZWFkZXJzIG9yIGxpYnJhcmllcy4KCk1pY2hhbCBNYXJlayAoMjAgTWFyIDIwMDgpCi0gQWRkZWQgLS13aXRoLWNhLXBhdGg9RElSRUNUT1JZIGNvbmZpZ3VyZSBvcHRpb24gdG8gdXNlIGFuIG9wZW5TU0wgQ0FwYXRoIGJ5CiAgZGVmYXVsdCBpbnN0ZWFkIG9mIGEgY2EgYnVuZGxlLiBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGFsc28gbG9vayBmb3IgYQogIGNhIHBhdGggaWYgbm8gY2EgYnVuZGxlIGlzIGZvdW5kIGFuZCBubyBvcHRpb24gZ2l2ZW4uCgotIEZpeGVkIGRldGVjdGlvbiBvZiBwcmV2aW91c2x5IGluc3RhbGxlZCBjdXJsLWNhLWJ1bmRsZS5jcnQKCkRhbmllbCBGYW5kcmljaCAoMTggTWFyIDIwMDgpCi0gQWRkZWQgdGVzdCA2MjYgdG8gcmVwcm9kdWNlIGFuIGluZmluaXRlIGxvb3Agd2hlbiBnaXZlbiBhbiBpbnZhbGlkCiAgU0ZUUCBxdW90ZSBjb21tYW5kIHJlcG9ydGVkIGJ5IFZpbmNlbnQgTGUgTm9ybWFuZCwgYW5kIGZpeGVkIGl0LgoKTWljaGFsIE1hcmVrICgxOCBNYXIgMjAwOCkKLSBBZGRlZCBjdXJsX2Vhc3lfZ2V0aW5mbyB0eXBlY2hlY2tlci4KCi0gQWRkZWQgbWFjcm9zIGZvciBjdXJsX3NoYXJlX3NldG9wdCBhbmQgY3VybF9tdWx0aV9zZXRvcHQgdG8gY2hlY2sgYXQgbGVhc3QKICB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLgoKRGFuaWVsIEZhbmRyaWNoICgxMyBNYXIgMjAwOCkKLSBBZGRlZCB0ZXN0cyA2MjItNjI1IHRvIHRlc3QgU0ZUUC9TQ1AgdXBsb2Fkcy4gVGVzdCA2MjUgd2FzIGFuIGF0dGVtcHQgdG8KICByZXByb2R1Y2UgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtLCBidXQgdGhhdAogIHNlZW1zIHRvIG5lZWQgYSBjYWxsIGN1cmxfZWFzeV9yZXNldCgpIHdoaWNoIHRoaXMgdGVzdCBjYXNlIGRvZXNuJ3QgZG8uCgpEYW5pZWwgU3RlbmJlcmcgKDEzIE1hciAyMDA4KQotIEJyaWFuIFVsbSBmaWd1cmVkIG91dCB0aGF0IGlmIHlvdSBkaWQgYW4gU0ZUUCB1cGxvYWQgd2l0aAogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LCBhbmQgdGhlbiByZS11c2VkIHRoZQogIGhhbmRsZSBhbmQgdXBsb2FkZWQgYW5vdGhlciBmaWxlIHRvIGFub3RoZXIgZGlyZWN0b3J5IHRoYXQgbmVlZGVkIHRvIGJlCiAgY3JlYXRlZCwgdGhlIHNlY29uZCB1cGxvYWQgd291bGQgZmFpbC4gQW5vdGhlciBjYXNlIG9mIGEgc3RhdGUgdmFyaWFibGUgdGhhdAogIHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHJlcXVlc3RzLgoKLSBJIHJld3JvdGUgdGhlIDEwMC1jb250aW51ZSBjb2RlIHRvIHVzZSBhIHNpbmdsZSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mCiAgdGhlIHByZXZpb3VzIHR3byBvbmVzLiBJIHRoaW5rIGl0IG1hZGUgdGhlIGxvZ2ljIHNvbWV3aGF0IGNsZWFyZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE1hciAyMDA4KQotIERtaXRyeSBQb3BvdiBmaWxlZCBidWcgcmVwb3J0ICMxOTExMDY5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE5MTEwNjkpIHRoYXQgaWRlbnRpZmllZCBhIHJhY2UKICBjb25kaXRpb24gaW4gdGhlIG5hbWUgcmVzb2x2ZXIgY29kZSB3aGVuIHRoZSBETlMgY2FjaGUgaXMgc2hhcmVkIGJldHdlZW4KICBtdWx0aXBsZSBlYXN5IGhhbmRsZXMsIGVhY2ggcnVubmluZyBpbiBzaW11bHRhbmVvdXMgdGhyZWFkcyB0aGF0IGNvdWxkIGNhdXNlCiAgY3Jhc2hlcy4KCi0gQWRkZWQgYSBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpIHRoYXQgYWNjZXB0cyB0aHJlZSBhcmd1bWVudHMgYW5kIHNpbXBseQogIGRvZXMgbm90aGluZyB3aXRoIHRoZW0sIGp1c3QgdG8gbWFrZSBzdXJlIGxpYmN1cmwgdXNlcnMgYWx3YXlzIHVzZSB0aHJlZQogIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLiBEdWUgdG8gaXRzIHVzZSBvZiAuLi4gZm9yIHRoZSB0aGlyZCBhcmd1bWVudCwgaXQKICBpcyBvdGhlcndpc2UgaGFyZCB0byBkZXRlY3QgYWJ1c2UuCgpNaWNoYWwgTWFyZWsgKDExIE1hciAyMDA4KQotIEFkZGVkIGEgdHlwZSBjaGVja2luZyBtYWNybyBmb3IgY3VybF9lYXN5X3NldG9wdCgpLCBuZWVkcyBnY2MtNC4zIGFuZCBvbmx5CiAgd29ya3MgaW4gQyBtb2RlIGF0bSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyNjcuaHRtbCAsCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA4LTAyLzAyOTIuaHRtbCApCgpEYW5pZWwgRmFuZHJpY2ggKDEwIE1hciAyMDA4KQotIEFkZGVkIHRlc3RzIDYxOC02MjEgdG8gdGVzdCBTRlRQL1NDUCB0cmFuc2ZlcnMgb2YgbW9yZSB0aGFuIG9uZSBmaWxlCiAgKHRlc3QgNjIwIHRlc3RzIHRoZSBqdXN0LWZpeGVkIHByb2JsZW0gcmVwb3J0ZWQgYnkgQnJpYW4gVWxtKS4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXIgMjAwOCkKLSBCcmlhbiBVbG0gcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIGRvaW5nIGEgc2Vjb25kIFNGVFAgdHJhbnNmZXIgb24gYSByZS11c2VkCiAgZWFzeSBoYW5kbGUgaWYgY3VybF9lYXN5X3Jlc2V0KCkgd2FzIHVzZWQgYmV0d2VlbiB0aGVtLiBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgotIEJyaWFuIFVsbSByZXBvcnRlZCB0aGF0IGlmIHlvdSBmaXJzdCB0cmllZCB0byBkb3dubG9hZCBhIG5vbi1leGlzdGluZyBTRlRQCiAgZmlsZSBhbmQgdGhlbiBmZXRjaGVkIGFuIGV4aXN0aW5nIG9uZSBhbmQgcmUtdXNlZCB0aGUgaGFuZGxlLCBsaWJjdXJsIHdvdWxkCiAgc3RpbGwgcmVwb3J0IHRoZSBzZWNvbmQgb25lIGFzIG5vbi1leGlzdGluZyBhcyB3ZWxsISBJIGZpeGVkIGl0IGFuZCBCcmlhbgogIHZlcmlmaWVkIHRoYXQgaXQgY3VyZWQgaGlzIHByb2JsZW0uCgpNaWNoYWwgTWFyZWsgKDYgTWFyIDIwMDgpCi0gRml4IHRoZSBnc3NhcGkgY29uZmlndXJlIGNoZWNrIHRvIGRldGVjdCBuZXdlciBNSVQgS2VyYmVyb3MgKHBhdGNoIGJ5CiAgTWljaGFlbCBDYWxtZXIpCgpZYW5nIFRzZSAoNiBNYXIgMjAwOCkKLSBGaXggcmVncmVzc2lvbiBvbiBDdXJsX3NvY2tldF9yZWFkeSgpIGFuZCBDdXJsX3BvbGwoKSBzbyB0aGF0IHRoZXNlIHdpbGwKICBhZ2FpbiBmYWlsIG9uIHNlbGVjdC9wb2xsIGVycm9ycyBkaWZmZXJlbnQgdGhhbiBFSU5UUi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOCkKLSBGaXhlZCB0aGUgdGVzdCBoYXJuZXNzIHNvIGl0IHdpbGwgd3JpdGUgb3V0IHplcm8tbGVuZ3RoIGRhdGEgZmlsZXMuCgotIEFkZGVkIHRlc3RzIDYxNiBhbmQgNjE3IHRvIHNlZSBob3cgU0ZUUCBhbmQgU0NQIGNvcGUgd2l0aCB6ZXJvLWxlbmd0aAogIGZpbGVzLCBhcyBxdWVzdGlvbmVkIGJ5IE1pa2UgUHJvdHRzLiBTRlRQIGRvZXMgZm9yIG1lIGJ1dCBTQ1AgZG9lc24ndAogIHNvIHRlc3QgNjE3IGlzIGRpc2FibGVkIGZvciBub3cuCgpEYW5pZWwgUyAoNCBNYXIgMjAwOCkKLSBNaWtlIFByb3R0cyBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyByZXN1bWVkIHRyYW5zZmVycyB3b3JrIHdpdGggU0ZUUC4KCkRhbmllbCBTICgxIE1hciAyMDA4KQotIEFuYXRvbGkgVHVibWFuIGZvdW5kIGFuZCBmaXhlZCBhIGNyYXNoIHdpdGggTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHVzZWQgb24KICBhIHJlLXVzZWQgY29ubmVjdGlvbiB3aGVyZSBib3RoIHJlcXVlc3RzIHVzZWQgTmVnb3RpYXRlLgoKR3VlbnRlciBLbmF1ZiAoMjYgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIHByb3ZpZGVkIGEgcGF0Y2ggdG8gc3VwcG9ydCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIChSRkMgNDM2NikuCgpEYW5pZWwgUyAoMjUgRmViIDIwMDgpCi0gS2FzcGFyIEJyYW5kIG1hZGUgR251VExTLWJ1aWx0IGxpYmN1cmwgcHJvcGVybHkgYWNrbm93bGVkZ2UgdGhlIG9wdGlvbiB0aGF0CiAgZm9yY2VzIGl0IHRvIHByZWZlciBTU0x2My4KCkRhbmllbCBTICgyMyBGZWIgMjAwOCkKLSBTYW0gTGlzdG9wYWQgcHJvdmlkZWQgYSBwYXRjaCBpbiBmZWF0dXJlLXJlcXVlc3QgIzE5MDAwMTQKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy9mZWF0dXJlLmNnaT9pZD0xOTAwMDE0IHRoYXQgbWFrZXMgbGliY3VybCAoYnVpbHQgdG8KICB1c2UgT3BlblNTTCkgc3VwcG9ydCBhIGZ1bGwgY2hhaW4gb2YgY2VydGlmaWNhdGVzIGluIGEgZ2l2ZW4gUEtDUzEyCiAgY2VydGlmaWNhdGUuCgpEYW5pZWwgUyAoMjIgRmViIDIwMDgpCi0gR2VvcmcgTGlwcGl0c2NoIG1hZGUgdGhlIHNyYy9NYWtlZmlsZS52YzYgbWFrZWZpbGUgdXNlIHRoZSBzYW1lIG1lbW9yeSBtb2RlbAogIG9wdGlvbnMgYXMgdGhlIGxpYi9NYWtlZmlsZS52YzYgYWxyZWFkeSBkaWQuCgpEYW5pZWwgUyAoMjEgRmViIDIwMDgpCi0gWm1leSBQZXRyb2ZmIGZvdW5kIGEgY3Jhc2ggd2hlbiBsaWJjdXJsIGFjY2Vzc2VkIGEgTlVMTCBwb2ludGVyLCB3aGljaAogIGhhcHBlbmVkIGlmIHlvdSBzZXQgdGhlIGNvbm5lY3Rpb24gY2FjaGUgc2l6ZSB0byAxIGFuZCBmb3IgZXhhbXBsZSBmYWlsZWQgdG8KICBsb2dpbiB0byBhbiBGVFAgc2l0ZS4gQnVnIHJlcG9ydCAjMTg5NjY5OAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODk2Njk4KQoKRGFuaWVsIFMgKDIwIEZlYiAyMDA4KQotIEZpeGVkIHRlc3QgY2FzZSA0MDUgdG8gbm90IGZhaWwgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTCgotIEJhc2VkIG9uIGluaXRpYWwgd29yayBkb25lIGJ5IEdhdXRhbSBLYWNocm9vIHRvIGFkZHJlc3MgYSBidWcsIHdlIG5vdyBrZWVwCiAgYmV0dGVyIGNvbnRyb2wgYXQgdGhlIGV4YWN0IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uJ3MgU1NMIHN0YXR1cyBzbyB0aGF0IHdlCiAga25vdyBleGFjdGx5IHdoZW4gaXQgaGFzIGNvbXBsZXRlZCB0aGUgU1NMIG5lZ290aWF0aW9uIG9yIG5vdCBzbyB0aGF0IHRoZXJlCiAgd29uJ3QgYmUgYWNjaWRlbnRhbCByZS11c2VzIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHdyb25nbHkgYmVsaWV2ZWQgdG8gYmUKICBpbiBTU0wtY29tcGxldGVkLW5lZ290aWF0ZSBzdGF0ZS4KCi0gV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgc2V0dGluZyB0aGUgQ1VSTE9QVF9VUkwgb3B0aW9uIGZyb20gaW5zaWRlIGEgY2FsbGJhY2sKICBzdWNoIGFzIHRoZSBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gb25lIHRyZWF0IHRoYXQgYXMgaWYgaXQgd2FzIGEgTG9jYXRpb246CiAgZm9sbG93aW5nLiBUaGUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIHRoaXMgZmVhdHVyZSB3YXMgZG9uZSBmb3IgNy4xMS4wLCBidXQKICB0aGlzIGNvZGUgYW5kIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuIHNpbmNlIGFib3V0IDcuMTUuNCAoTWFyY2ggMjAwNikKICB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygbm9uLWJsb2NraW5nIE9wZW5TU0wgImNvbm5lY3RzIi4KCiAgSXQgd2FzIGEgaGFjayB0byBiZWdpbiB3aXRoIGFuZCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgYW5kIGhhc24ndCB3b3JrZWQKICBjb3JyZWN0bHkgZm9yIGEgbG9uZyB0aW1lIGFuZCBub2JvZHkgaGFzIGV2ZW4gbm90aWNlZCwgSSBjb25zaWRlciBpdCBhIHZlcnkKICBzdWl0YWJsZSBzdWJqZWN0IGZvciBwbGFpbiByZW1vdmFsLiBBbmQgc28gaXQgd2FzIGRvbmUuCgpHdWVudGVyIEtuYXVmICgxOSBGZWIgMjAwOCkKLSBXZSBkbyBubyBsb25nZXIgc3VwcG9ydCBTU0x2MiBieSBkZWZhdWx0IHNpbmNlIGl0IGhhcyBrbm93biBmbGF3cy4KICBLYXNwYXIgQnJhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgYWxsIHN1cHBvcnRlZCBTU0wgdG9vbGtpdHMuCgpEYW5pZWwgRmFuZHJpY2ggKDE5IEZlYiAyMDA4KQotIEFkZGVkIHRlc3QzMDkgdG8gdGVzdCBIVFRQIHJlZGlyZWN0IHRvIEhUVFBTIFVSTAoKRGFuaWVsIFMgKDE4IEZlYiAyMDA4KQotIFdlJ3JlIG5vIGxvbmdlciBwcm92aWRpbmcgYSB2ZXJ5IG9sZCBjYS1idW5kbGUgaW4gdGhlIGN1cmwgdGFyYmFsbC4gWW91IGNhbgogIGdldCBhIGZyZXNoIG9uZSBkb3dubG9hZGVkIGFuZCBjcmVhdGVkIHdpdGggJ21ha2UgY2EtYnVuZGxlJyBvciB5b3UgY2FuIGdldAogIG9uZSBmcm9tIGhlcmUgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2NhZXh0cmFjdC5odG1sIGlmIHlvdSB3YW50IGEgZnJlc2gKICBuZXcgb25lIGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByZWNlbnQgbGlzdCBvZiBjYSBjZXJ0cy4KCiAgVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWNhLWJ1bmRsZSBub3cgbGV0cyB5b3Ugc3BlY2lmeSB3aGF0IGZpbGUgdG8gdXNlCiAgYXMgZGVmYXVsdCBjYSBidW5kbGUgZm9yIHlvdXIgYnVpbGQuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2lsbCBjaGVjayBhIGZldyBrbm93biBzdGFuZGFyZCBwbGFjZXMgZm9yIGEgZ2xvYmFsIGNhIGNlcnQgdG8gdXNlLgoKRGFuaWVsIFMgKDE3IEZlYiAyMDA4KQotIEplcm9tZSBNdWZmYXQtTWVyaWRvbCBoZWxwZWQgbWUgZml4IEN1cmxfZG9uZSgpIHRvIGNsb3NlIHRoZSBjdXJyZW50CiAgY29ubmVjdGlvbiBieSBmb3JjZSB3aGVuIGl0IHdhcyBjYWxsZWQgYmVmb3JlIHRoZSBlbnRpcmUgcmVxdWVzdCBpcwogIGNvbXBsZXRlZCwgc2ltcGx5IGJlY2F1c2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgY29ubmVjdGlvbiByZWFsbHkgY2FuIGJlCiAgcmUtdXNlZCBzYWZlbHkgYXQgdGhhdCBwb2ludC4KCi0gQmFzZWQgb24gdGhlIHNhbWUgZGVidWdnaW5nIGxvZ2ljLCBJJ3ZlIGFsc28gbWFkZSBDdXJsX2h0dHBfZG9uZSgpIG5vdAogIHJldHVybiBDVVJMRV9HT1RfTk9USElORyBpZiBjYWxsZWQgInByZW1hdHVyZWx5Ii4gVGhpcyBzaG91bGQgaGF2ZSBubyByZWFsCiAgZWZmZWN0IHRvIGFueXRoaW5nIGJ1dCB0aGUgY29kZSBtYWtlcyBtb3JlIHNlbnNlIGxpa2UgdGhpcy4KCkRhbmllbCBTICgxNSBGZWIgMjAwOCkKLSBNYWRlIHRoZSBnbnV0bHMgY29kZSBwYXRoIG5vdCBldmVuIHRyeSB0byBnZXQgdGhlIHNlcnZlciBjZXJ0IGlmIG5vIHBlZXIKICB2ZXJpZmljYXRpb24gaXMgcmVxdWVzdGVkLiBQcmV2aW91c2x5IGl0IHdvdWxkIGV2ZW4gcmV0dXJuIGZhaWx1cmUgaWYgZ251dGxzCiAgZmFpbGVkIHRvIGdldCB0aGUgc2VydmVyIGNlcnQgZXZlbiB0aG91Z2ggbm8gdmVyaWZpY2F0aW9uIHdhcyBhc2tlZCBmb3IuCiAgUHVibGljIHNlcnZlciBzaG93aW5nIHRoZSBwcm9ibGVtOiBodHRwczovL3d3dy5uZXQyMjIuY2Fpc3NlLWVwYXJnbmUuZnIKCi0gRml4IG15IEN1cmxfdGltZWxlZnQoKSBsZWZ0b3ZlciBtaXN0YWtlIGluIHRoZSBnbnV0bHMgY29kZQoKLSBQb295YW4gTWNTcG9ycmFuIGZvdW5kIGFuZCBmaXhlZCBhIGZsYXcgd2hlcmUgeW91IGZpcnN0IHdvdWxkIGRvIGEgbm9ybWFsCiAgaHR0cCByZXF1ZXN0IGFuZCB0aGVuIHlvdSdkIHJldXNlIHRoZSBoYW5kbGUgYW5kIHJlcGxhY2UgdGhlIEFjY2VwdDogaGVhZGVyLAogIGFzIHRoZW4gbGliY3VybCB3b3VsZCBzZW5kIHR3byBBY2NlcHQ6IGhlYWRlcnMhCgpEYW5pZWwgUyAoMTEgRmViIDIwMDgpCi0gWWFuZyBUc2UgcG9pbnRlZCBvdXQgYSBmZXcgcmVtYWluaW5nIHF1aXJrcyBmcm9tIG15IHRpbWVvdXQgcmVmYWN0b3JpbmcgZnJvbQogIEZlYiA3IHRoYXQgZGlkbid0IGFib3J0IHByb3Blcmx5IG9uIHRpbWVvdXRzLiBUaGVzZSBhcmUgYWN0dWFsbHkgb2xkCiAgcHJvYmxlbXMgYnV0IG5vdyB0aGV5IHNob3VsZCBiZSBmaXhlZC4KCllhbmcgVHNlICgxMCBGZWIgMjAwOCkKLSBCdWcgcmVwb3J0ICMxODg4OTMyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODg4OTMyKSBwb2ludHMgb3V0CiAgYW5kIHByb3ZpZGVzIHRlc3QgcHJvZ3JhbSB0aGF0IGRlbW9uc3RyYXRlcyB0aGF0IGxpYmN1cmwgbWlnaHQgbm90IHNldCBlcnJvcgogIGRlc2NyaXB0aW9uIG1lc3NhZ2UgZm9yIGVycm9yIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGZvciBXaW5kb3dzIHRocmVhZGVkCiAgbmFtZSByZXNvbHZlciBidWlsZHMuIEZpeGVkIG5vdy4KCkRhbmllbCBGYW5kcmljaCAoOCBGZWIgMjAwOCkKLSBBZGRlZCBrZXkgd29yZHMgdG8gYWxsIFNTTC11c2luZyB0ZXN0cyBzbyB0aGV5IGNhbiBiZSBza2lwcGVkIGlmIG5lY2Vzc2FyeS4KICBSZW1vdmVkIGEgZmV3IHVubmVjZXNzYXJ5IHJlcXVpcmVzIFNTTCBzdGF0ZW1lbnRzLgoKRGFuaWVsIFMgKDggRmViIDIwMDgpCi0gTWlrZSBIb21tZXkgZmlsZWQgYW5kIGZpeGVkIGJ1ZyByZXBvcnQgIzE4ODk4NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg4OTg1Nik6IFdoZW4gdXNpbmcgdGhlIGdudXRscyBzc2wKICBsYXllciwgY2xlYW5pbmctdXAgYW5kIHJlaW5pdGlhbGl6aW5nIGN1cmwgZW5kcyB1cCB3aXRoIGh0dHBzIHJlcXVlc3RzCiAgZmFpbGluZyB3aXRoICJBU04xIHBhcnNlcjogRWxlbWVudCB3YXMgbm90IGZvdW5kIiBlcnJvcnMuIE9idmlvdXNseSBhCiAgcmVncmVzc2lvbiBhZGRlZCBpbiA3LjE2LjMuCgpZYW5nIFRzZSAoOCBGZWIgMjAwOCkKLSBJbXByb3ZlZCB0ZXN0IGhhcm5lc3MgU0NQL1NGVFAgc3RhcnQgdXAgc2VydmVyIHZlcmlmaWNhdGlvbiwgZG9pbmcgYSByZWFsCiAgY29ubmVjdGlvbiB0byB0aGUgc2Z0cCBzZXJ2ZXIsIGF1dGhlbnRpY2F0aW5nIGFuZCBydW5uaW5nIGEgc2ltcGxlIHNmdHAKICBwd2QgY29tbWFuZCB1c2luZyB0aGUgdGVzdCBoYXJuZXNzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGFuZCBrZXkgZmlsZXMuCgpEYW5pZWwgUyAoOCBGZWIgMjAwOCkKLSBH/G50ZXIgS25hdWYgYWRkZWQgbGliL21rLWNhLWJ1bmRsZS5wbCB3aGljaCBnZXRzIHRoZSBGaXJlZm94IGNhIGJ1bmRsZSBhbmQKICBjcmVhdGVzIGEgc3VpdGFibGUgY2EtYnVuZGxlLmNydCBmaWxlIGluIFBFTSBmb3JtYXQgZm9yIHVzZSB3aXRoIGN1cmwuIFRoZQogIHJlY29tbWVuZGVkIHdheSB0byBydW4gaXQgaXMgdG8gdXNlICdtYWtlIGNhLWJ1bmRsZScgaW4gdGhlIGJ1aWxkIHRyZWUgcm9vdC4KCkRhbmllbCBGYW5kcmljaCAoNyBGZWIgMjAwOCkKLSBBZGRlZCB0ZXN0cyAxMDIyIGFuZCAxMDIzIHRvIHZhbGlkYXRlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXZlcnNpb24gYW5kCiAgLS12ZXJudW0KCkRhbmllbCBTICg3IEZlYiAyMDA4KQotIFJlZmFjdG9yZWQgYSBsb3Qgb2YgdGltZW91dCBjb2RlIGludG8gYSBmZXcgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gbWFrZQogIHRoZW0gYWxsIHVzZSB0aGUgc2FtZSAoaG9wZWZ1bGx5IGNvcnJlY3QpIGxvZ2ljIHRvIG1ha2UgaXQgbGVzcyBlcnJvci1wcm9uZQogIGFuZCBlYXNpZXIgdG8gaW50cm9kdWNlIGxpYnJhcnktd2lkZSB3aGVyZSBpdCBzaG91bGQgYmUgdXNlZC4KCllhbmcgVHNlICg2IEZlYiAyMDA4KQotIEZpeCBhbiBpc3N1ZSBpbiBzdHJkdXAgcmVwbGFjZW1lbnQgZnVuY3Rpb24gd2hlbiBkZWFsaW5nIHdpdGggYWJzb2x1dGVseQogIGh1Z2Ugc3RyaW5ncy4gT25seSBzeXN0ZW1zIHdpdGhvdXQgYSBzdGFuZGFyZCBzdHJkdXAgd291bGQgYmUgYWZmZWN0ZWQuCgpEYW5pZWwgUyAoMyBGZWIgMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIGNsZWFuZWQgdXAgdGhlIHBpcGVsaW5pbmcgY29kZSBhbmQgcmVtb3ZlZCB0aGUgbmVlZCBmb3IgYW5kCiAgdXNlIG9mIHRoZSAiaXNfaW5fcGlwZWxpbmUiIHN0cnVjdCBmaWVsZC4KCi0gSSB3cm90ZSB1cCBhbmQgYWRkZWQgdGhlIHRocmVhZGVkLXNzbC5jIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBzaG93cyBob3cKICB0byBkbyBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMgb2YgSFRUUFMgZmlsZXMgd2l0aCBhIGxpYmN1cmwgdGhhdCBpcyBidWlsdAogIHdpdGggT3BlblNTTC4gSXQgdXNlcyBwdGhyZWFkcyBmb3IgdGhlIHRocmVhZGluZy4KCkRhbmllbCBTICgzMSBKYW4gMjAwOCkKLSBOaWtsYXMgQW5nZWJyYW5kIG1hZGUgdGhlIGNvb2tpZSBzdXBwb3J0IGluIGxpYmN1cmwgcHJvcGVybHkgZGVhbCB3aXRoIHRoZQogICJIdHRwT25seSIgZmVhdHVyZSBpbnRyb2R1Y2VkIGJ5IE1pY3Jvc29mdCBhbmQgYXBwYXJlbnRseSBhbHNvIHN1cHBvcnRlZCBieQogIEZpcmVmb3g6IGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzMwNDYuYXNweCAuIEh0dHBPbmx5CiAgaXMgbm93IHN1cHBvcnRlZCB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVycyBpbiBIVFRQIGhlYWRlcnMsIHdoZW4gd3JpdHRlbiB0bwogIGNvb2tpZSBqYXJzIGFuZCB3aGVuIHJlYWQgZnJvbSBleGlzdGluZyBjb29raWUgamFycy4KCiAgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMzEgYW5kIDQ2IHRvIGFsc28gZG8gc29tZSBiYXNpYyBIdHRwT25seSB0ZXN0aW5nLgoKLSBEbWl0cnkgS3Vyb2Noa2luIG1vdmVkIHNldmVyYWwgc3RydWN0IGZpZWxkcyBmcm9tIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgdG8KICB0aGUgU2luZ2xlUmVxdWVzdCBvbmUgdG8gbWFrZSBwaXBlbGluaW5nIGJldHRlci4gSXQgaXMgYSBiaXQgdHJpY2t5IHRvIGtlZXAKICB0aGVtIGluIHRoZSByaWdodCBwbGFjZSwgdG8ga2VlcCB0aGluZ3MgcmVsYXRlZCB0byB0aGUgYWN0dWFsIHJlcXVlc3Qgb3IgdG8KICB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gaW4gdGhlIHJpZ2h0IHBsYWNlLgoKRGFuaWVsIFMgKDI5IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gZml4ZWQgQ3VybF9kb25lKCkgZm9yIHBpcGVsaW5pbmcsIGFzIGl0IGNvdWxkIHByZXZpb3VzbHkKICBjcmFzaCEKCi0gTWljaGFsIE1hcmVrIGZpeGVkIG1pbm9yIG1pc3Rha2UgaW4gdGVzdCBjYXNlIDU1MyB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgd29ya2luZyBvbiBvdGhlciBJUC1hZGRyZXNzZXMgb3IgcG9ydCBudW1iZXJzLgoKVmVyc2lvbiA3LjE4LjAgKDI4IEphbnVhcnkgMjAwOCkKCkRhbmllbCBTICgyNyBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luOiBJbiAicmVhbCB3b3JsZCIgdGVzdGluZyBJIGZvdW5kIG1vcmUgYnVncyBpbgogIHBpcGVsaW5pbmcuIEJyb2tlbiBjb25uZWN0aW9uIGlzIG5vdCByZXN0b3JlZCBhbmQgd2UgZ2V0IGludG8gaW5maW5pdGUKICBsb29wLiBJdCBoYXBwZW5zIGJlY2F1c2Ugb2Ygd3JvbmcgaXNfaW5fcGlwZWxpbmUgdmFsdWVzLgoKRGFuaWVsIFMgKDI2IEphbiAyMDA4KQotIEtldmluIFJlZWQgZmlsZWQgYnVnIHJlcG9ydCAjMTg3OTM3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODc5Mzc1KSB3aGljaCBkZXNjcmliZXMgaG93IGxpYmN1cmwKICBnb3QgbG9zdCBpbiB0aGlzIHNjZW5hcmlvOiBwcm94eSB0dW5uZWwgKG9yIEhUVFBTIG92ZXIgcHJveHkpLCBhc2sgdG8gZG8gYW55CiAgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIHRoZSBwcm94eSByZXBsaWVzIHdpdGggYW4gYXV0aCAobGlrZSBOVExNKSBhbmQgdGhlbgogIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciB0aGF0IGluaXRpYWwgaW5mb3JtYXRpb25hbCByZXNwb25zZS4KCiAgbGliY3VybCB3b3VsZCBub3QgcHJvcGVybHkgcmUtaW5pdGlhbGl6ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgYW5kCiAgY29udGludWUgdGhlIGF1dGggbmVnb3RpYXRpb24gbGlrZSBzdXBwb3NlZC4gSXQgZG9lcyBub3cgaG93ZXZlciwgYXMgaXQgd2lsbAogIG5vdyBkZXRlY3QgaWYgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSBhbmQgYXNrZWQKICBmb3IsIGFuZCB3aWxsIHRodXMgcmV0cnkgdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlIGZyb20gdGhlcmUuCgotIEkgbWFkZSB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgZ2V0IGNhbGxlZCBwcm9wZXJseSBkdXJpbmcgcHJveHkgQ09OTkVDVC4KCkRhbmllbCBTICgyMyBKYW4gMjAwOCkKLSBJZ29yIEZyYW5jaHVrIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9DT09LSUVMSVNUIHNldCB0byAiQUxMIiBsZWFrZWQKICBtZW1vcnksIGFuZCBzbyBkaWQgIlNFU1MiLiBGaXhlZCBub3cuCgpZYW5nIFRzZSAoMjIgSmFuIDIwMDgpCi0gQ2hlY2sgcG9sbC5oIGF0IGNvbmZpZ3VyYXRpb24gdGltZSwgYW5kIHVzZSBpdCB3aGVuIHN5cy9wb2xsLmggdW5hdmFpbGFibGUKCkRhbmllbCBTICgyMiBKYW4gMjAwOCkKLSBEbWl0cnkgS3Vyb2Noa2luIHJlbW92ZWQgdGhlIGNhbmNlbGxlZCBzdGF0ZSBmb3IgcGlwZWxpbmluZywgYXMgd2UgYWdyZWVkCiAgdGhhdCBpdCBpcyBiYWQgYW55d2F5LiBTdGFydGluZyBub3csIHJlbW92aW5nIGEgaGFuZGxlIHRoYXQgaXMgaW4gdXNlZCBpbiBhCiAgcGlwZWxpbmUgd2lsbCBicmVhayB0aGUgcGlwZWxpbmUgLSBpdCdsbCBiZSBzZXQgYmFjayB1cCBhZ2FpbiBidXQgc3RpbGwuLi4KCllhbmcgVHNlICgyMSBKYW4gMjAwOCkKLSBEaXNhYmxlIGxkYXAgc3VwcG9ydCBmb3IgY3lnd2luIGJ1aWxkcywgc2luY2UgaXQgYnJlYWtzIHdob2xlIGJ1aWxkIHByb2Nlc3MuCiAgRml4aW5nIGl0IHdpbGwgYWZmZWN0IG90aGVyIHBsYXRmb3Jtcywgc28gaXQgaXMgcG9zdHBvbmVkIGZvciBhbm90aGVyIHJlbGVhc2UuCgpEYW5pZWwgUyAoMTggSmFuIDIwMDgpCi0gTGF1IEhhbmcgS2luIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZG9pbmcKICBDT05ORUNUIG92ZXIgYSBwcm94eS4gY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXBvcnQgYmFjayB0aGUgc29ja2V0CiAgcHJvcGVybHkgZHVyaW5nIHRoYXQgc3RhdGUsIGR1ZSB0byBhIG1pc3NpbmcgY2FzZSBpbiB0aGUgc3dpdGNoIGluIHRoZQogIG11bHRpX2dldHNvY2soKSBmdW5jdGlvbi4KCllhbmcgVHNlICgxNyBKYW4gMjAwOCkKLSBEb24ndCBhYm9ydCB0ZXN0cyA1MTggYW5kIDUzNyB3aGVuIHVuYWJsZSB0byByYWlzZSB0aGUgb3Blbi1maWxlIHNvZnQgbGltaXQuCgpEYW5pZWwgUyAoMTYgSmFuIDIwMDgpCi0gTmF0aGFuIENvdWx0ZXIncyBwYXRjaCB0aGF0IG1ha2VzIHJ1bnRlc3RzLnBsIHJlc3BlY3QgdGhlIFBBVEggd2hlbiBmaWd1cmluZwogIG91dCB3aGF0IHZhbGdyaW5kIHRvIHJ1bi4KCllhbmcgVHNlICgxNiBKYW4gMjAwOCkKLSBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQgb2YgbWVtb3J5IGluIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB0aGF0IGFmZWN0ZWQKICBkYXRhIHVybCBlbmNvZGVkIEhUVFAgUE9TVHMgd2hlbiByZWFkaW5nIGl0IGZyb20gYSBmaWxlLgoKRGFuaWVsIFMgKDE2IEphbiAyMDA4KQotIERtaXRyeSBLdXJvY2hraW4gd29ya2VkIGEgbG90IG9uIGltcHJvdmluZyB0aGUgSFRUUCBQaXBlbGluaW5nIHN1cHBvcnQgdGhhdAogIHByZXZpb3VzbHkgaGFkIGEgbnVtYmVyIG9mIGZsYXdzLCBwZXJoYXBzIG1vc3Qgbm90YWJseSB3aGVuIGFuIGFwcGxpY2F0aW9uCiAgZmlyZWQgdXAgTiB0cmFuc2ZlcnMgYXQgb25jZSBhcyB0aGVuIHRoZXkgd291bGRuJ3QgcGlwZWxpbmUgYXQgYWxsIHRoYXQKICBuaWNlbHkgYXMgYW55b25lIHdvdWxkIHRoaW5rLi4uIFRlc3QgY2FzZSA1MzAgd2FzIGFsc28gdXBkYXRlZCB0byB0YWtlIHRoZQogIGltcHJvdmVkIGZ1bmN0aW9uYWxpdHkgaW50byBhY2NvdW50LgoKLSBDYWxscyB0byBDdXJsX2ZhaWxmKCkgYXJlIG5vdCBzdXBwb3NlZCB0byBwcm92aWRlIGEgdHJhaWxpbmcgbmV3bGluZSBhcyB0aGUKICBmdW5jdGlvbiBpdHNlbGYgYWRkcyB0aGF0LiBGaXhlZCBvbiA1MCBvciBzb21ldGhpbmcgc3RyaW5ncyEKCkRhbmllbCBTICgxNSBKYW4gMjAwOCkKLSBJIG1hZGUgdGhlIHRvcnR1cmUgdGVzdCBvbiB0ZXN0IDUzMCBnbyB0aHJvdWdoLiBUaGlzIHdhcyBhY3R1YWxseSBkdWUgdG8KICBzaWxseSBjb2RlIGxlZnQgZnJvbSB3aGVuIHdlIHN3aXRjaGVkIHRvIGxldCB0aGUgbXVsdGkgaGFuZGxlICJob2xkIiB0aGUgZG5zCiAgY2FjaGUgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIE9mIGNvdXJzZSB0aGlzIG9ubHkgdHJpZ2dlcmVkIHdoZW4gYQogIGNlcnRhaW4gZnVuY3Rpb24gY2FsbCByZXR1cm5lZCBlcnJvciBhdCB0aGUgY29ycmVjdCBtb21lbnQuCgpEYW5pZWwgUyAoMTQgSmFuIDIwMDgpCi0gSm9lIE1hbGlja2kgZmlsZWQgYnVnIHJlcG9ydCAjMTg3MTI2OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODcxMjY5KSBhbmQgd2UgY291bGQgZml4IGhpcyBoYW5nLQogIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvaW5nIGEgbGFyZ2UgSFRUUCBQT1NUIHJlcXVlc3Qgd2l0aCB0aGUKICByZXNwb25zZS1ib2R5IHJlYWQgZnJvbSBhIGNhbGxiYWNrLgoKRGFuaWVsIFMgKDEyIEphbiAyMDA4KQotIEkgcmUtYXJyYW5nZWQgdGhlIGN1cmwgLS1oZWxwIG91dHB1dC4gQWxsIHRoZSBvcHRpb25zIGFyZSBub3cgc29ydGVkIG9uCiAgdGhlaXIgbG9uZyBvcHRpb24gbmFtZXMgYW5kIGFsbCBkZXNjcmlwdGlvbnMgYXJlIG9uZS1saW5lcnMuCgotIEVyaWMgTGFuZGVzIHByb3ZpZGVkIHRoZSBwYXRjaCAoZWRpdGVkIGJ5IG1lKSB0aGF0IGludHJvZHVjZXMgdGhlCiAgLS1rZWVwYWxpdmUtdGltZSB0byBjdXJsIHRvIHNldCB0aGUga2VlcGFsaXZlIHByb2JlIGludGVydmFsLiBJIGFsc28gdG9vawogIHRoZSBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlIHJlY2VudGx5IGFkZGVkIG5vLWtlZXAtYWxpdmUgb3B0aW9uIHRvCiAgbm8ta2VlcGFsaXZlIHRvIGtlZXAgYSBjb25zaXN0ZW50IG5hbWluZyBhbmQgdG8gYXZvaWQgZ2V0dGluZyB0d28gZGFzaGVzIGluCiAgdGhlc2Ugb3B0aW9uIG5hbWVzLiBFcmljIGFsc28gcHJvdmlkZWQgYW4gdXBkYXRlIHRvIHRoZSBtYW4gcGFnZSBmb3IgdGhlIG5ldwogIG9wdGlvbi4KCkRhbmllbCBTICgxMSBKYW4gMjAwOCkKLSBEYW5pZWwgRWdnZXIgbWFkZSBDVVJMT1BUX1JBTkdFIHdvcmsgb24gZmlsZTovLyBVUkxzIHRoZSB2ZXJ5IHNhbWUgd2F5IGl0CiAgYWxyZWFkeSB3b3JrZWQgZm9yIEZUUDovLyBVUkxzLgoKLSBJIG1hZGUgdGhlIGN1cmwgdG9vbCBzd2l0Y2ggZnJvbSB1c2luZyBDVVJMT1BUX0lPQ1RMRlVOQ1RJT04gdG8gbm93IHVzZSB0aGUKICBzcGFua2luZyBuZXcgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2ltcGx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBpbXByb3ZlZAogIHBlcmZvcm1hbmNlIGZvciB0aGUgdXBsb2FkIHJlc3VtZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byB1cGxvYWQgdGhlIGxhc3QKICBmZXcgYnl0ZXMgb2YgYSB2ZXJ5IGxhcmdlIGZpbGUuIFRvIGltcGxlbWVudCB0aGlzIGRlY2VudGx5LCBJIGhhZCB0byBzd2l0Y2gKICB0aGUgY2xpZW50IGNvZGUgZm9yIHVwbG9hZGluZyBmcm9tIGZvcGVuKCkvZnJlYWQoKSB0byBwbGFpbiBvcGVuKCkvcmVhZCgpIHNvCiAgdGhhdCB3ZSBjYW4gdXNlIGxzZWVrKCkgdG8gZG8gPjMyYml0IHNlZWtzIChhcyBmc2VlaygpIGRvZXNuJ3QgYWxsb3cgdGhhdCkKICBvbiBzeXN0ZW1zIHRoYXQgb2ZmZXIgc3VwcG9ydCBmb3IgdGhhdC4KCkRhbmllbCBTICgxMCBKYW4gMjAwOCkKLSBNaWNoYWwgTWFyZWsgbWFkZSBjdXJsLWNvbmZpZyAtLWxpYnMgbm90IGluY2x1ZGUgL3Vzci9saWI2NCBpbiB0aGUgb3V0cHV0CiAgKGl0IGFscmVhZHkgYmVmb3JlIHNraXBwZWQgL3Vzci9saWIpLiAgL3Vzci9saWI2NCBpcyB0aGUgZGVmYXVsdCBsaWJyYXJ5CiAgZGlyZWN0b3J5IG9uIG1hbnkgNjRiaXQgc3lzdGVtcyBhbmQgaXQncyB1bmxpa2VseSB0aGF0IGFueW9uZSB3b3VsZCB1c2UgdGhlCiAgcGF0aCBwcml2YXRlbHkgb24gc3lzdGVtcyB3aGVyZSBpdCdzIG5vdC4KCi0gR2VvcmcgTGlwcGl0c2NoIGJyb3VnaHQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gYW5kIENVUkxPUFRfU0VFS0RBVEEgdG8gYWxsb3cKICBsaWJjdXJsIHRvIHNlZWsgaW4gYSBnaXZlbiBpbnB1dCBzdHJlYW0uIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuCiAgZG9pbmcgdXBsb2FkIHJlc3VtZXMgd2hlbiB0aGVyZSdzIGFscmVhZHkgYSBodWdlIHBhcnQgb2YgdGhlIGZpbGUgcHJlc2VudAogIHJlbW90ZWx5LiBCZWZvcmUsIGFuZCBzdGlsbCBpZiB0aGlzIGNhbGxiYWNrIGlzbid0IHVzZWQsIGxpYmN1cmwgd2lsbCByZWFkCiAgYW5kIHRocm91Z2ggYXdheSB0aGUgZW50aXJlIGZpbGUgdXAgdG8gdGhlIHBvaW50IHRvIHdoZXJlIHRoZSByZXN1bWluZwogIGJlZ2lucyAod2hpY2ggb2YgY291cnNlIGNhbiBiZSBhIHNsb3cgb3BlcmVyYXRpb24gZGVwZW5kaW5nIG9uIGZpbGUgc2l6ZSwKICBJL08gYmFuZHdpZHRoIGFuZCBtb3JlKS4gVGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHByZWZlcnJlZCB0byBnZXQKICB1c2VkIGluc3RlYWQgb2YgdGhlIENVUkxPUFRfSU9DVExGVU5DVElPTiBmb3Igc2Vla2luZyBiYWNrIGluIGEgc3RyZWFtIHdoZW4KICBkb2luZyBtdWx0aS1zdGFnZSBIVFRQIGF1dGggd2l0aCBQT1NUL1BVVC4KCi0gTmlraXRpbnNraXQgRG1pdHJpeSBmaWxlZCBidWcgcmVwb3J0ICMxODY4MjU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NjgyNTUpIHdpdGggYSBwYXRjaC4gSXQgaWRlbnRpZmllcwogIGFuZCBmaXhlcyBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIFdXVy1BdXRoZW50aWNhdGU6IGhlYWRlcnMgd2l0aCBhZGRpdGlvbmFsCiAgc3BhY2VzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHBhcnNlciB3YXNuJ3Qgd3JpdHRlbiB0byBkZWFsIHdpdGguCgpEYW5pZWwgUyAoOCBKYW4gMjAwOCkKLSBJbnRyb2R1Y2luZyBjdXJsX2Vhc3lfcGF1c2UoKSBhbmQgbmV3IG1hZ2ljIHJldHVybiBjb2RlcyBmb3IgYm90aCB0aGUgcmVhZAogIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2tzIHRoYXQgbm93IGNhbiBtYWtlIGEgY29ubmVjdGlvbidzIHJlYWRpbmcgYW5kL29yCiAgd3JpdGluZyBnZXQgcGF1c2VkLgoKRGFuaWVsIFMgKDYgSmFuIDIwMDgpCi0gSmVmZiBKb2huc29uIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NjMxNzEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg2MzE3MSkgd2hlcmUgaGUgcG9pbnRlZCBvdXQgdGhhdAogIGxpYmN1cmwncyBkYXRlIHBhcnNlciBkaWRuJ3QgYWNjZXB0IGEgKzEzMDAgdGltZSB6b25lIHdoaWNoIGFjdHVhbGx5IGlzIHVzZWQKICBmYWlybHkgb2Z0ZW4gKGxpa2UgTmV3IFplYWxhbmQncyBEYWlsaWdodCBTYXZpbmdzIFRpbWUpLCBzbyBJIG1vZGlmaWVkIHRoZQogIHBhcnNlciB0byBub3cgYWNjZXB0IHVwIHRvIGFuZCBpbmNsdWRpbmcgLTE0MDAgdG8gKzE0MDAuCgpEYW5pZWwgUyAoNSBKYW4gMjAwOCkKLSBCYXNlZCBvbiBmdXJ0aGVyIGRpc2N1c3Npb24gb24gY3VybC1saWJyYXJ5LCBJIHJldmVydGVkIHllc3RlcmRheSdzIFNPQ0tTNQogIGNvZGUgdG8gaW5zdGVhZCBpbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgYSBuZXcgcHJveHkgdHlwZSBjYWxsZWQKICBDVVJMUFJPWFlfU09DS1M1X0hPU1ROQU1FIHRoYXQgaXMgdXNlZCB0byBzZW5kIHRoZSBob3N0IG5hbWUgdG8gdGhlIHByb3h5CiAgaW5zdGVhZCBvZiBJUCBhZGRyZXNzIGFuZCB0aGVyZSdzIHRodXMgbm8gbG9uZ2VyIGFueSBuZWVkIGZvciBhIG5ldwogIGN1cmxfZWFzeV9zZXRvcHQoKSBvcHRpb24uCgogIFRoZSBkZWZhdWx0IFNPQ0tTNSBwcm94eSBpcyBhZ2FpbiBiYWNrIHRvIHNlbmRpbmcgdGhlIElQIGFkZHJlc3MgdG8gdGhlCiAgcHJveHkuICBUaGUgbmV3IGN1cmwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgZW5hYmxpbmcgc2VuZGluZyBob3N0IG5hbWUgdG8gYQogIFNPQ0tTNSBwcm94eSBpcyBub3cgLS1zb2NrczUtaG9zdG5hbWUuCgpEYW5pZWwgUyAoNCBKYW4gMjAwOCkKLSBCYXNlZCBvbiBNYXhpbSBQZXJlbmVzZW5rbydzIHBhdGNoLCB3ZSBub3cgZG8gU09DS1M1IG9wZXJhdGlvbnMgYW5kIGxldCB0aGUKICBwcm94eSBkbyB0aGUgaG9zdCBuYW1lIHJlc29sdmluZyBhbmQgb25seSBpZiAtLXNvY2tzNWlwIChvcgogIENVUkxPUFRfU09DS1M1X1JFU09MVkVfTE9DQUwpIGlzIHVzZWQgd2UgcmVzb2x2ZSB0aGUgaG9zdCBuYW1lIGxvY2FsbHkgYW5kCiAgcGFzcyBvbiB0aGUgSVAgYWRkcmVzcyBvbmx5IHRvIHRoZSBwcm94eS4KCllhbmcgVHNlICgzIEphbiAyMDA4KQotIE1vZGlmaWVkIHRlc3QgaGFybmVzcyB0byBhbGxvdyBTQ1AsIFNGVFAgYW5kIFNPQ0tTNCB0ZXN0cyB0byBydW4gd2l0aAogIE9wZW5TU0ggMi45LjksIFN1blNTSCAxLjAgb3IgbGF0ZXIgdmVyc2lvbnMuIFNPQ0tTNSB0ZXN0cyBuZWVkIE9wZW5TU0gKICAzLjcsIFN1blNTSCAxLjAgb3IgbGF0ZXIuCgpEYW5pZWwgUyAoMiBKYW4gMjAwOCkKLSBJIGZpeGVkIHR3byBjYXNlcyBvZiBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNrcyB3aGVuIGhhbmRsaW5nIGNodW5rZWQKICBkZWNvZGluZyB3aGVyZSBhIHdyaXRlIGVycm9yIChvciBhYm9ydCByZXR1cm4gZnJvbSBhIGNhbGxiYWNrKSBkaWRuJ3Qgc3RvcAogIGxpYmN1cmwncyBwcm9jZXNzaW5nLgoKLSBJIHJlbW92ZWQgdGhlIHNvY2tsZW5fdCB1c2UgZnJvbSB0aGUgcHVibGljIGN1cmwvY3VybC5oIGhlYWRlciBhbmQgaW5zdGVhZAogIG1hZGUgaXQgYW4gdW5zaWduZWQgaW50LiBUaGUgdHlwZSB3YXMgb25seSB1c2VkIGluIHRoZSBjdXJsX3NvY2thZGRyIHN0cnVjdAogIGRlZmluaXRpb24gKG9ubHkgdXNlZCBieSB0aGUgY3VybF9vcGVuc29ja2V0X2NhbGxiYWNrKS4gT24gYWxsIHBsYXRmb3JtcyBJCiAgY291bGQgZmluZCBpbmZvcm1hdGlvbiBhYm91dCwgc29ja2xlbl90IGlzIDMyIHVuc2lnbmVkIGJpdHMgbGFyZ2Ugc28gSSBkb24ndAogIHRoaW5rIHRoaXMgd2lsbCBicmVhayB0aGUgQVBJIG9yIEFCSS4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBvZgogIGNvdXJzZSBmb3IgYWxsIHRoZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIGEgc29ja2xlbl90IGRlZmluaXRpb24gaW4gdGhlaXIKICBoZWFkZXJzIHRvIGJ1aWxkIGZpbmUgYWdhaW4uIFByb3ZpZGluZyBvdXIgb3duIGNvbmZpZ3VyZSBtYWdpYyBhbmQgY3VzdG9tCiAgZGVmaW5pdGlvbiBvZiBzb2NrbGVuX3Qgb24gdGhvc2Ugc3lzdGVtcyBwcm92ZWQgdG8gd29yayBidXQgd2FzIGEgbG90IG9mCiAgY3J1ZnQsIGNvZGUgYW5kIGV4dHJhIG1hZ2ljIG5lZWRlZCAtIHdoZW4gdGhpcyB2ZXJ5IHNtYWxsIGNoYW5nZSBvZiB0eXBlCiAgc2VlbXMgaGFybWxlc3MgYW5kIHN0aWxsIHNvbHZlcyB0aGUgbWlzc2luZyBzb2NrbGVuX3QgcHJvYmxlbS4KCi0gUmljaGFyZCBBdHRlcmVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNGEgcHJveGllcywKICB3aGljaCBpcyBhbiBpbm9mZmljaWFsIFBST1hZNCB2YXJpYW50IHRoYXQgc2VuZHMgdGhlIGhvc3RuYW1lIHRvIHRoZSBwcm94eQogIGluc3RlYWQgb2YgdGhlIHJlc29sdmVkIGFkZHJlc3MgKHdoaWNoIGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IFNPQ0tTNSkuCiAgLS1zb2NrczRhIGlzIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIGl0IGFuZCBDVVJMT1BUX1BST1hZVFlQRSBjYW4KICBub3cgYmUgc2V0IHRvIENVUkxQUk9YWV9TT0NLUzRBIGFzIHdlbGwuCgpEYW5pZWwgUyAoMSBKYW4gMjAwOCkKLSBNb2h1biBCaXN3YXMgcG9pbnRlZCBvdXQgdGhhdCAtLWxpYmN1cmwgZ2VuZXJhdGVkIGEgc291cmNlIGNvZGUgd2l0aCBhbiBpbnQKICBmdW5jdGlvbiBidXQgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQuIFdoaWxlIGZpeGluZyB0aGF0LCBJIGFsc28gdG9vayBjYXJlCiAgYWJvdXQgYWRkaW5nIHNvbWUgYmV0dGVyIGNvbW1lbnRzIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCgpEYW5pZWwgUyAoMjcgRGVjIDIwMDcpCi0gRG1pdHJ5IEt1cm9jaGtpbiBtZW50aW9uZWQgYSBmbGF3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMi8wMjUyLmh0bWwpIGluIGRldGVjdF9wcm94eSgpIHdoaWNoCiAgZmFpbGVkIHRvIHNldCB0aGUgYml0cy5wcm94eSB2YXJpYWJsZSBwcm9wZXJseSB3aGVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCiAgdG9sZCBsaWJjdXJsIHRvIHVzZSBhIGh0dHAgcHJveHkuCgpEYW5pZWwgUyAoMjYgRGVjIDIwMDcpCi0gSW4gYW4gYXR0ZW1wdCB0byByZXBlYXQgdGhlIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMTg1MDczMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODUwNzMwKSBJIHdyb3RlIHVwIHRlc3QgY2FzZSA1NTIuIFRoZQogIHRlc3QgaXMgZG9pbmcgYSA3MEsgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjayBhbmQgYW4gaW9jdGwgY2FsbGJhY2sgb3ZlciBhCiAgcHJveHkgcmVxdWlyaW5nIERpZ2VzdCBhdXRoLiBUaGUgdGVzdCBjYXNlIGNvZGUgaXMgbW9yZSBvciBsZXNzIGlkZW50aWNhbCB0bwogIHRoZSB0ZXN0IHJlY2lwZSBjb2RlIHByb3ZpZGVkIGJ5IFNwYWNlbiBKYXNzZXQgKHdobyBzdWJtaXR0ZWQgdGhlIGJ1ZwogIHJlcG9ydCkuCgpEYW5pZWwgUyAoMjUgRGVjIDIwMDcpCi0gR2FyeSBNYXh3ZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NTY2MjgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg1NjYyOCkgYW5kIHByb3ZpZGVkIGEgZml4IGZvciB0aGUKICAoc21hbGwpIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGNvZGUuIEl0IGhhcHBlbmVkIHdoZW4gYQogIHByZXZpb3VzIGVudHJ5IGluIHRoZSBjYWNoZSB3YXMgcmUtdXNlZC4KCkRhbmllbCBGYW5kcmljaCAoMTkgRGVjIDIwMDcpCi0gRW5zdXJlIHRoYXQgbnJvZmYgZG9lc24ndCBwdXQgYW55dGhpbmcgYnV0IEFTQ0lJIGNoYXJhY3RlcnMgaW50byB0aGUKICAtLW1hbnVhbCB0ZXh0LgoKWWFuZyBUc2UgKDE4IERlYyAyMDA3KQotIE1TVkMgOS4wIChWUzIwMDgpIGRvZXMgbm90IHN1cHBvcnQgV2luZG93cyBidWlsZCB0YXJnZXRzIHByaW9yIHRvIFdpblhQLAogIGFuZCBtYWtlcyB3cm9uZyBhc3VtcHRpb25zIG9mIGJ1aWxkIHRhcmdldCB3aGVuIGl0IGlzbid0IHNwZWNpZmllZC4gU28sCiAgaWYgbm8gYnVpbGQgdGFyZ2V0IGhhcyBiZWVuIGRlZmluZWQgd2Ugd2lsbCB0YXJnZXQgV2luWFAgd2hlbiBidWlsZGluZwogIGN1cmwvbGliY3VybCB3aXRoIE1TVkMgOS4wIChWUzIwMDgpLgoKLSAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNy0xMi8wMDM5Lmh0bWwpIHJlcG9ydGVkIGFuZCBmaXhlZAogIGEgZmlsZSB0cnVuY2F0aW9uIHByb2JsZW0gb24gV2luZG93cyBidWlsZCB0YXJnZXRzIHRyaWdnZXJlZCB3aGVuIHJldHJ5aW5nCiAgYSBkb3dubG9hZCB3aXRoIGN1cmwuCgpEYW5pZWwgUyAoMTcgRGVjIDIwMDcpCi0gTWF0ZXVzeiBMb3Nrb3QgcG9pbnRlZCBvdXQgdGhhdCBNU1ZDIDkuMCAoVlMyMDA4KSBoYXMgdGhlIHBvbGxmZCBzdHJ1Y3QgYW5kCiAgZGVmaW5lcyBpbiB3aW5zb2NrMi5oIHNvbWVob3cgZGlmZmVyZW50bHkgdGhhbiBwcmV2aW91cyB2ZXJzaW9ucyBhbmQgdGhhdAogIGN1cmwgNy4xNy4xIHdvdWxkIGZhaWwgdG8gY29tcGlsZSBvdXQgb2YgdGhlIGJveC4KCkRhbmllbCBTICgxMyBEZWMgMjAwNykKLSBEYXZpZCBXcmlnaHQgZmlsZWQgYnVnIHJlcG9ydCAjMTg0OTc2NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQ5NzY0KSB3aXRoIGFuIGluY2x1ZGVkIGZpeC4gSGUKICBpZGVudGlmaWVkIGEgcHJvYmxlbSBmb3IgcmUtdXNlZCBjb25uZWN0aW9ucyB0aGF0IHByZXZpb3VzbHkgaGFkIHNlbnQKICBFeHBlY3Q6IDEwMC1jb250aW51ZSBhbmQgaW4gc29tZSBzaXR1YXRpb25zIHRoZSBzdWJzZXF1ZW50IFBPU1QgKHRoYXQgZGlkbid0CiAgdXNlIEV4cGVjdDopIHN0aWxsIGhhZCB0aGUgaW50ZXJuYWwgZmxhZyBzZXQgZm9yIGl0cyB1c2UuIERhdmlkJ3MgZml4ICh0aGF0CiAgbWFrZXMgdGhlIHNldHRpbmcgb2YgdGhlIGZsYWcgaW4gZXZlcnkgc2luZ2xlIHJlcXVlc3QgdW5jb25kaXRpb25hbGx5KSBpcwogIGZpbmUgYW5kIGlzIG5vdyB1c2VkIQoKRGFuaWVsIFMgKDEyIERlYyAyMDA3KQotIEdpbGxlcyBCbGFuYyBtYWRlIHRoZSBjdXJsIHRvb2wgZW5hYmxlIFNPX0tFRVBBTElWRSBmb3IgdGhlIGNvbm5lY3Rpb25zIGFuZAogIGFkZGVkIHRoZSAtLW5vLWtlZXAtYWxpdmUgb3B0aW9uIHRoYXQgY2FuIGRpc2FibGUgdGhhdCBvbiBkZW1hbmQuCgpEYW5pZWwgUyAoOSBEZWMgMjAwNykKLSBBbmRyZXcgTW9pc2UgZmlsZWQgYnVnIHJlcG9ydCAjMTg0NzUwMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQ3NTAxKSBhbmQgcG9pbnRlZCBvdXQgYSBtZW1jcHkoKQogIHRoYXQgc2hvdWxkIGJlIG1lbW1vdmUoKSBpbiB0aGUgY29udmVydF9saW5lZW5kcygpIGZ1bmN0aW9uLgoKRGFuaWVsIFMgKDggRGVjIDIwMDcpCi0gUmVuYW1lZCBhbGwgaW50ZXJuYWwgc3RhdGljIGZ1bmN0aW9ucyB0aGF0IGhhZCBDdXJsXyBwcmVmaXhlcyB0byBubyBsb25nZXIKICBoYXZlIHRoZW0uIFRoZSBDdXJsXyBwcmVmaXggaXMgZXhjbHVzaXZlbHkgdXNlZCBmb3IgbGlicmFyeSBpbnRlcm5hbCBnbG9iYWwKICBzeW1ib2xzLiBTdGF0aWMgZnVuY3Rpb25zIGNhbiBiZSBuYW1lZCBhbnl0aGluZywgZXhjZXB0IGZvciB1c2luZyBDdXJsXyBvcgogIGN1cmxfIHByZWZpeGVzLiBUaGlzIGlzIGZvciBjb25zaXN0ZW5jeSBhbmQgZm9yIGVhc2llciBtYWludGFpbmFuY2UgYW5kCiAgb3ZlcnZpZXcuCgotIENsZWFuZWQgdXAgYW5kIHJlZm9ybWF0dGVkIHRoZSBUT0RPIGRvY3VtZW50IHRvIGxvb2sgbGlrZSB0aGUgRkFRIGFuZAogIENPTlRSSUJVVEUsIHdoaWNoIG1ha2VzIG5pY2VyIHdlYiBwYWdlcwoKLSBBZGRlZCB0ZXN0IGNhc2VzIDU0OSBhbmQgNTUwIHRoYXQgdGVzdCBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUuCgotIEFkZGVkIGtleXdvcmRzIG9uIGEgYnVuY2ggb2YgdGVzdCBjYXNlcwoKLSBGaXhlZCBhbiBPT00gcHJvYmxlbSBpbiB0aGUgY3VybCBjb2RlIHRoYXQgd291bGQgbGVhZCB0byBmY2xvc2Ugb24gYSBiYWQKICBoYW5kbGUgYW5kIGNyYXNoCgpEYW5pZWwgUyAoNSBEZWMgMjAwNykKLSBTcGFjZW4gSmFzc2V0IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGRvaW5nIFBPU1QgKHdpdGggZGF0YSByZWFkIHdpdGggYQogIGNhbGxiYWNrKSBvdmVyIGEgcHJveHkgd2hlbiBOVExNIGlzIHVzZWQgYXMgYXV0aCB3aXRoIHRoZSBwcm94eS4gVGhlIGJ1ZwogIGFsc28gY29uY2VybmVkIERpZ2VzdCBhbmQgd2FzIGxpbWl0ZWQgdG8gdXNpbmcgY2FsbGJhY2sgb25seS4gU3BhY2VuIHdvcmtlZAogIHdpdGggdXMgdG8gcHJvdmlkZSBhIHVzZWZ1bCBwYXRjaC4gSSBhZGRlZCB0aGUgdGVzdCBjYXNlIDU0NyBhbmQgNTQ4IHRvCiAgdmVyaWZ5IHR3byB2YXJpYXRpb25zIG9mIFBPU1Qgb3ZlciBwcm94eSB3aXRoIE5UTE0uCgpEYW5pZWwgUyAoMyBEZWMgMjAwNykKLSBSYXkgUGVrb3dza2kgZmlsZWQgYnVnIHJlcG9ydCAjMTg0MjAyOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODQyMDI5KSBpbiB3aGljaCBoZSBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggU1NMIHNlc3Npb24gY2FjaGluZyB0aGF0IHByZXZlbnQgaXQgZnJvbSB3b3JraW5nLCBhbmQgcHJvdmlkZWQKICB0aGUgYXNzb2NpYXRlZCBmaXghCgotIE5vdyBsaWJjdXJsIChidWlsdCB3aXRoIE9wZW5TU0wpIGRvZXNuJ3QgcmV0dXJuIGVycm9yIGFueW1vcmUgaWYgdGhlIHJlbW90ZQogIFNTTC1iYXNlZCBzZXJ2ZXIgZG9lc24ndCBwcmVzZW50IGEgY2VydGlmaWNhdGUgd2hlbiB0aGUgcmVxdWVzdCBpcyB0b2xkIHRvCiAgaWdub3JlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbnl3YXkuCgotIE1pY2hhbCBNYXJlayBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERSB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wKICB0aGUgYXBwZW5kaW5nIG9mIHRoZSAidHlwZT0iIHRoaW5nIG9uIEZUUCBVUkxzIHdoZW4gdGhleSBhcmUgcGFzc2VkIHRvIGEKICBIVFRQIHByb3h5LiBTb21lIHByb3hpZXMganVzdCBkb24ndCBsaWtlIHRoYXQgYXBwZW5kaW5nICh3aGljaCBpcyBkb25lCiAgdW5jb25kaXRpb25hbGx5IGluIDcuMTcuMSksIGFuZCBzb21lIHByb3hpZXMgdHJlYXQgYmluYXJ5L2FzY2lpIHRyYW5zZmVycwogIGJldHRlciB3aXRoIHRoZSBhcHBlbmRpbmcgZG9uZSEKCkRhbmllbCBTICgyOSBOb3YgMjAwNykKLSBBIGJ1ZyByZXBvcnQgb24gdGhlIGN1cmwtbGlicmFyeSBsaXN0IHNob3dlZCBhIEhUVFAgRGlnZXN0IHNlc3Npb24gZ29pbmcgb24KICB3aXRoIGEgNzAwKyBsZXR0ZXIgbm9uY2UuIFByZXZpb3VzbHkgbGliY3VybCBvbmx5IHN1cHBvcnQgMTI3IGxldHRlciBvbmVzCiAgYW5kIG5vdyBJIGJ1bXBlZCBpdCB0byAxMDIzLgoKLSBGaXhlZCB0aGUgcmVzdW1lZCBGVFAgdXBsb2FkIGxvb3AgdG8gbm90IHJlcXVpcmUgdGhhdCB0aGUgcmVhZCBjYWxsYmFjawogIHJldHVybnMgYSBmdWxsIGJ1ZmZlciBvbiBlYWNoIGludm9rZS4KCkRhbmllbCBTICgyNSBOb3YgMjAwNykKLSBBZGRlZCB0ZXN0IGNhc2UgMTAxNSB0aGF0IHRlc3RzIC0tZGF0YS11cmxlbmNvZGUgaW4gbXVsdGlwbGUgd2F5cwoKLSBGaXhlZCAtLWRhdGEtdXJsZW5jb2RlIGZvciB3aGVuIG5vIEAgb3IgPSBhcmUgdXNlZAoKLSBFeHRlbmRlZCB0aGUgdXNlci1hZ2VudCBidWZmZXIgY3VybCB1c2VzLCBzaW5jZSB3ZSBjYW4gaGl0IHRoZSAxMjggYnl0ZQogIGJvcmRlciB3aXRoIHBsZW50eSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgdXNlZC4gTGlrZSBteSBjdXJyZW50IHNldDogImN1cmwKICA3LjE3LjItQ1ZTIChpNjg2LXBjLWxpbnV4LWdudSkgbGliY3VybC83LjE3LjItQ1ZTIE9wZW5TU0wvMC45LjhnCiAgemxpYi8xLjIuMy4zIGMtYXJlcy8xLjUuMi1DVlMgbGliaWRuLzEuMSBsaWJzc2gyLzAuMTkuMC1DVlMiCgpEYW5pZWwgUyAoMjQgTm92IDIwMDcpCi0gSW50ZXJuYWwgcmVhcnJhbmdlbWVudHMsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHN0cnVjdCBIYW5kbGVEYXRhIGlzIG5vIG1vcmUuCiAgSXQgaXMgbm93IGtub3duIGFzIFNpbmdsZVJlcXVlc3QgYW5kIHRoZSBDdXJsX3RyYW5zZmVyX2tlZXBlciBzdHJ1Y3Qgd2l0aGluCiAgdGhhdCB3YXMgcmVtb3ZlIGVudGlyZWx5LiBUaGlzIGhhcyB0aGUgdXBzaWRlIHRoYXQgdGhlcmUgYXJlIGxlc3MgZHVwbGljYXRlCiAgc3RydWN0IG1lbWJlcnMgdGhhdCBtYWRlIGl0IGhhcmQgdG8gc2VlIGFuZCByZW1lbWJlciB3aGF0IHN0cnVjdCB0aGF0IHdhcwogIHVzZWQgdG8gc3RvcmUgd2hhdCBkYXRhLiBUaGUgdHJhbnNmZXJfa2VlcGVyIHRoaW5nIHdhcyBvbmNlIHN0b3JlZCBvbiBhCiAgcGVyLWNvbm5lY3Rpb24gYmFzaXMgYW5kIHRoZW4gaXQgbWFkZSBzZW5zZSB0byBoYXZlIHRoZSBkdXBsaWNhdGUgaW5mbyBidXQKICBzaW5jZSBpdCB3YXMgbW92ZWQgdG8gdGhlIFNlc3Npb25IYW5kbGUgKGluIDcuMTYuMCkgaXQganVzdCBhZGRlZCB3ZWlyZG5lc3MuCiAgVGhlIFNpbmdsZVJlcXVlc3Qgc3RydWN0IGlzIHVzZWQgYnkgZGF0YSB0aGF0IG9ubHkgaXMgdmFsaWQgZm9yIHRoaXMgc2luZ2xlCiAgcmVxdWVzdC4KCllhbmcgVHNlICgyMiBOb3YgMjAwNykKLSBQcm92aWRlIGEgc29ja2xlbl90IGRlZmluaXRpb24gaW4gY3VybC5oIGZvciBXaW4zMiBBUEkgYnVpbGQgdGFyZ2V0cwogIHdoaWNoIGRvbid0IGhhdmUgb25lLgoKRGFuaWVsIFMgKDIyIE5vdiAyMDA3KQotIEFsZXNzYW5kcm8gVmVzZWx5IGhlbHBlZCBtZSBpbXByb3ZlIHRoZSAtLWRhdGEtdXJsZW5jb2RlJ3Mgc3ludGF4LCBwYXJzZXIKICBhbmQgZG9jdW1lbnRhdGlvbi4KCkRhbmllbCBTICgyMSBOb3YgMjAwNykKLSBXaGlsZSBpbnNwZWN0aW5nIHRoZSBOZWdvdGlhdGUgY29kZSwgSSBub3RpY2VkIGhvdyB0aGUgcHJveHkgYXV0aCB3YXMgdXNpbmcKICB0aGUgc2FtZSBzdGF0ZSBzdHJ1Y3QgYXMgdGhlIGhvc3QgYXV0aCwgc28gYm90aCBjb3VsZCBuZXZlciBiZSB1c2VkIGF0IHRoZQogIHNhbWUgdGltZSEgSSBmaXhlZCBpdCAod2l0aG91dCBiZWluZyBhYmxlIHRvIGNoZWNrKSB0byB1c2UgdHdvIHNlcGFyYXRlCiAgc3RydWN0cyB0byBhbGxvdyBhdXRoZW50aWNhdGlvbiB1c2luZyBOZWdvdGlhdGUgb24gaG9zdCBhbmQgcHJveHkKICBzaW11bHRhbmVvdXNseS4KCkRhbmllbCBTICgyMCBOb3YgMjAwNykKLSBFbWlsIFJvbWFudXMgcG9pbnRlZCBvdXQgYSBidWcgdGhhdCBtYWRlIGFuIGVhc3kgaGFuZGxlIGdldCB0aGUgY29va2llCiAgZW5naW5lIGFjdGl2YXRlZCB3aGVuIHNldCB0byB1c2UgYSBzaGFyZSAoZXZlbiBpZiB0aGUgc2hhcmUgZG9lc24ndCBzaGFyZQogIGNvb2tpZXMpLiBJIGZpeGVkIGl0LgoKLSBGaXhlZCBhIHZlcnkgbG9uZy1sYXN0aW5nIG1wcmludGYoKSBidWcgdGhhdCBvY2N1cnJlZCB3aGVuIHdlIGRpZCAiJS4qcyVzIiwKICBzaW5jZSB0aGUgc2Vjb25kICVzIHdvdWxkIHRoZW4gd3JvbmdseSB1c2VkIHRoZSBudW1lcmljYWwgcHJlY2lzaW9uIGFyZ3VtZW50CiAgaW5zdGVhZCBhbmQgY3Jhc2guCgotIEludHJvZHVjZWQgLS1kYXRhLXVybGVuY29kZSB0byB0aGUgY3VybCB0b29sIGZvciBlYXNpZXIgdXJsIGVuY29kaW5nIG9mIHRoZQogIGRhdGEgc2VudCBpbiBhIHBvc3QuCgpEYW5pZWwgUyAoMTggTm92IDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gZml4ZWQgU1NMIGNvbm5lY3Rpb25zIHdpdGggTlNTIGRvbmUgd2l0aCB0aGUgbXVsdGktaW50ZXJmYWNlCgpEYW5pZWwgUyAoMTcgTm92IDIwMDcpCi0gTWljaGFsIE1hcmVrIG1hZGUgdGhlIHRlc3Qgc3VpdGUgcmVtZW1iZXIgd2hhdCB0ZXN0IHNlcnZlcnMgdGhhdCBmYWlsIHRvCiAgc3RhcnQgc28gdGhhdCBzdWJzZXF1ZW50IHRyaWVzIGFyZSBzaW1wbHkgc2tpcHBlZC4KCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBleGFtcGxlcyBidWlsZCBmaW5lIG9uIFdpbmRvd3MgKG1pbmd3ICsgbXN5cykgd2hlbgogIHRoZSBsaWIgd2FzIGJ1aWx0IHN0YXRpY2x5LgoKRGFuaWVsIFMgKDE2IE5vdiAyMDA3KQotIEF0ZXMgR29yYWwgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gaHR0cC5jOmFkZF9idWZmZXJfc2VuZCgpIHdoZW4gYSBkZWJ1ZwogIGNhbGxiYWNrIHdhcyB1c2VkLCBhcyBpdCBjb3VsZCB3cm9uZ2x5IHBhc3Mgb24gYSBiYWQgc2l6ZSBmb3IgdGhlIG91dGdvaW5nCiAgSFRUUCBoZWFkZXIuIFRoZSBiYWQgc2l6ZSB3b3VsZCBiZSBhIHZlcnkgbGFyZ2UgdmFsdWUgYXMgaXQgd2FzIGEgd3JhcHBlZAogIHNpemVfdCBjb250ZW50LiBUaGlzIGhhcHBlbmVkIHdoZW4gdGhlIHdob2xlIEhUVFAgcmVxdWVzdCBmYWlsZWQgdG8gZ2V0IHNlbnQKICBpbiBvbmUgc2luZ2xlIHNlbmQuICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMTEvMDE2NS5odG1sCgpEYW5pZWwgUyAoMTUgTm92IDIwMDcpCi0gRml4ZWQgeWV0IGFub3RoZXIgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhCiAgcmUtdXNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZwogIGxpc3QuCgotIE1pY2hhbCBNYXJlayBmaXhlZCB0aGUgdGVzdCBzdWl0ZSB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZW4gdGhlIEhUVFAKICBJUHY2IHNlcnZlciBjYW4ndCBydW4uCgpZYW5nIFRzZSAoMTQgTm92IDIwMDcpCi0gRml4IGEgdmFyaWFibGUgcG90ZW50aWFsIHdyYXBwaW5nIGluIGFkZF9idWZmZXIoKSB3aGVuIHVzaW5nIGFic29sdXRlbHkKICBodWdlIHNlbmQgYnVmZmVyIHNpemVzLgoKRGFuaWVsIFMgKDEzIE5vdiAyMDA3KQotIEZpeGVkIGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBkb2luZyBTRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIE1lbnRpb25lZCBieSBJbW1hbnVlbCBHcmVnb2lyZSBvbiB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsIFMgKDEyIE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MzA2MzcgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MzA2MzcpLCB3aGljaCB3YXMKICBmb3J3YXJkZWQgZnJvbSB0aGUgR2VudG9vIGJ1ZyB0cmFja2VyIGJ5IERhbmllbCBCbGFjayBhbmQgd2FzIG9yaWdpbmFsbHkKICBzdWJtaXR0ZWQgYnkgUm9iaW4gSm9obnNvbiwgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHdvdWxkIGRvIGJhZCBtZW1vcnkKICByZWZlcmVuY2VzIHdoZW4gaXQgZmFpbGVkIGFuZCBiYWlsZWQgb3V0IGJlZm9yZSB0aGUgaGFuZGxlciB0aGluZyB3YXMKICBzZXR1cC4gTXkgZml4IGlzIG5vdCBkb25lIGxpa2UgdGhlIHByb3ZpZGVkIHBhdGNoIGRvZXMgaXQsIGJ1dCBpbnN0ZWFkIEkKICBtYWtlIHN1cmUgdGhhdCB0aGVyZSdzIG5ldmVyIGFueSBjaGFuY2UgZm9yIGEgTlVMTCBwb2ludGVyIGluIHRoYXQgc3RydWN0CiAgbWVtYmVyLgoKWWFuZyBUc2UgKDEwIE5vdiAyMDA3KQotIFZpa3JhbSBTYXhlbmEgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0xMS8wMDk2Lmh0bWwpIHBvaW50ZWQgb3V0CiAgdGhhdCB0aGUgcG9sbGZkIHN0cnVjdCB3YXMgYmVpbmcgbXVsdGkgZGVmaW5lZCB3aGVuIHVzaW5nIFZTMjAwOC4gVGhpcyBpcwogIG5vdyBmaXhlZCBpbiAvY3VybC9saWIvc2VsZWN0LmgKCkRhbmllbCBTICg4IE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MjM0ODcgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MjM0ODcpIHBvaW50ZWQKICBvdXQgdGhhdCBTRlRQIHJlcXVlc3RzIGRpZG4ndCB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gTmVpdGhlciBkaWQgU0NQCiAgb25lcy4gIEkgZ2F2ZSB0aGUgU1NIIGNvZGUgYSBnb29kIGJlYXRpbmcgYW5kIG5vdyBib3RoIFNDUCBhbmQgU0ZUUCBzaG91bGQKICB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBmaW5lLiBJIGFsc28gZGlkIGEgYnVuY2ggb2YgaW5kZW50IGNoYW5nZXMgYXMKICB3ZWxsIGFzIGEgYnVnIGZpeCBmb3IgdGhlICJrZXlib2FyZCBpbnRlcmFjdGl2ZSIgYXV0aC4KCkRhbiBGICg2IE5vdiAyMDA3KQotIEltcHJvdmVkIHRlbG5ldCBzdXBwb3J0IGJ5IGRyYXN0aWNhbGx5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygd3JpdGUKICBjYWxsYmFja3MgbmVlZGVkIHRvIHBhc3MgYSBidWZmZXIgdG8gdGhlIHVzZXIuICBJbnN0ZWFkIG9uZSBwZXIgYnl0ZSBpdAogIGlzIG5vdyBhcyBsaXR0bGUgYXMgb25lIHBlciBzZWdtZW50LgoKWWFuZyBUc2UgKDYgTm92IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTgyNDg5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgyNDg5NCkgcG9pbnRlZAogIG91dCBhIHByb2JsZW0gaW4gY3VybC5oIHdoZW4gYnVpbGRpbmcgQysrIGFwcHMgd2l0aCBNU1ZDLiBUbyBmaXggaXQsIHRoZQogIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMgaW4gY3VybC5oIGlzIG1vdmVkIG91dHNpZGUgb2YgdGhlIEMrKyBleHRlcm4gIkMiCiAgbGlua2FnZSBibG9jay4KCkRhbmllbCBTICgxIE5vdiAyMDA3KQotIFRvYnkgUGV0ZXJzb24gcGF0Y2hlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB0aGF0CiAgaGFwcGVuZWQgd2hlbiBhIHVzZXIgaGFkIGEgaG9tZSBkaXIgYXMgYW4gZW1wdHkgc3RyaW5nLiBjdXJsIHdvdWxkIHRoZW4gZG8KICBmcmVlKCkgb24gYSB3cm9uZyBhcmVhLgoKRGFuIEYgKDEgTm92IDIwMDcpCi0gRml4ZWQgY3VybC1jb25maWcgLS1mZWF0dXJlcyB0byBub3QgZGlzcGxheSBsaWJ6IHdoZW4gaXQgd2Fzbid0IHVzZWQKICBkdWUgdG8gYSBtaXNzaW5nIGhlYWRlciBmaWxlLgoKRGFuIEYgKDMxIE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgb3V0cHV0IG9mIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzIHdoaWNoIHNob3dlZCBTQ1AgYW5kIFNGVFAKICBhbHdheXMsIGV4Y2VwdCB3aGVuIC0td2l0aG91dC1saWJzc2gyIHdhcyBnaXZlbgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDEwMTMgYW5kIDEwMTQgdG8gY2hlY2sgdGhhdCBjdXJsLWNvbmZpZyAtLXByb3RvY29scyBhbmQKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIG1hdGNoZXMgdGhlIG91dHB1dCBvZiBjdXJsIC0tdmVyc2lvbgoKRGFuIEYgKDMwIE9jdG9iZXIgMjAwNykKLSBGaXhlZCBhbiBPT00gcHJvYmxlbSB3aXRoIGZpbGU6IFVSTHMKCi0gTW92ZWQgQ3VybF9maWxlX2Nvbm5lY3QgaW50byB0aGUgcHJvdG9jb2wgaGFuZGxlciBzdHJ1Y3QKCkRhbiBGICgyOSBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlIDU0NiB0byBjaGVjayB0aGF0IHN1YnNlcXVlbnQgRlRQIHRyYW5zZmVycyB3b3JrIGFmdGVyIGEKICBmYWlsZWQgb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UKCkRhbmllbCBTICgyOSBPY3RvYmVyIDIwMDcpCi0gQmFzZWQgb24gb25lIG9mIHRob3NlIGJ1ZyByZXBvcnRzIHRoYXQgYXJlIGludGVyY2VwdGVkIGJ5IGEgZGlzdHJvJ3MgYnVnCiAgdHJhY2tlciAoaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD0zMTYxOTEpLCBJIG5vdyBtYWRlCiAgY3VybC1jb25maWcgLS1mZWF0dXJlcyBhbmQgLS1wcm90b2NvbHMgc2hvdyB0aGUgY29ycmVjdCBvdXRwdXQgd2hlbiBidWlsdAogIHdpdGggTlNTLgoKVmVyc2lvbiA3LjE3LjEgKDI5IE9jdG9iZXIgMjAwNykKCkRhbiBGICgyNSBPY3RvYmVyIDIwMDcpCi0gQWRkZWQgdGhlIC0tc3RhdGljLWxpYnMgb3B0aW9uIHRvIGN1cmwtY29uZmlnCgpEYW5pZWwgUyAoMjUgT2N0b2JlciAyMDA3KQotIE1hZGUgbGliY3VybCBidWlsdCB3aXRoIE5TUyBwb3NzaWJsZSB0byBpZ25vcmUgdGhlIHBlZXIgdmVyaWZpY2F0aW9uLgogIFByZXZpb3VzbHkgaXQgd291bGQgZmFpbCBpZiB0aGUgY2EgYnVuZGxlIHdhc24ndCBwcmVzZW50LCBldmVuIGlmIHRoZSBjb2RlCiAgaWdub3JlZCB0aGUgdmVyaWZpY2F0aW9uIHJlc3VsdHMuCgpQYXRyaWNrIE0gKDI1IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0ZXN0IHNlcnZlciB0byBhbGxvdyBudWxsIGJ5dGVzIGluIGJpbmFyeSBwb3N0cy4KXyBBZGRlZCB0ZXN0cyAzNSwgNTQ0ICYgNTQ1IHRvIGNoZWNrIGJpbmFyeSBkYXRhIHBvc3RzLCBib3RoIHN0YXRpYyAoaW4gcGxhY2UpCiAgYW5kIGR5bmFtaWMgKGNvcGllZCkuCgpEYW5pZWwgUyAoMjUgT2N0b2JlciAyMDA3KQotIE1pY2hhbCBNYXJlayBmaXhlZCB0aGUgdGVzdCBzY3JpcHQgdG8gYmUgYWJsZSB0byB1c2UgdmFsZ3JpbmQgZXZlbiB3aGVuIHRoZQogIGxpYiBpcyBidWlsdCBzaGFyZWQgd2l0aCBsaWJ0b29sLgoKLSBGaXhlZCBhIGZldyBtZW1vcnkgbGVha3Mgd2hlbiB0aGUgc2FtZSBlYXN5IGhhbmRsZSBpcyByZS11c2VkIHRvIHJlcXVlc3QKICBVUkxzIHdpdGggZGlmZmVyZW50IHByb3RvY29scy4gRlRQIGFuZCBURlRQIHJlbGF0ZWQgbGVha3MuIENhdWdodCB0aGFua3MgdG8KICBEYW4gRidzIG5ldyB0ZXN0IGNhc2VzLgoKRGFuIEYgKDI0IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgdGVzdCBGVFAgYW5kIFRGVFAgc2VydmVycyB0byBzdXBwb3J0IHRoZSA+MTAwMDAgdGVzdCBudW1iZXIKICBub3RhdGlvbgoKLSBBZGRlZCB0ZXN0IGNhc2VzIDIwMDAgdGhyb3VnaCAyMDAzIHdoaWNoIHRlc3QgbXVsdGlwbGUgcHJvdG9jb2xzIHVzaW5nIHRoZQogIHNhbWUgZWFzeSBoYW5kbGUKCi0gRml4ZWQgdGhlIGZpbGVjaGVjazogbWFrZSB0YXJnZXQgdG8gd29yayBvdXRzaWRlIHRoZSBzb3VyY2UgdHJlZQoKRGFuaWVsIFMgKDI0IE9jdG9iZXIgMjAwNykKLSBWbGFkaW1pciBMYXphcmVua28gcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgZG8gc29tZSAnbXQnIG1hZ2ljIHdoZW4KICBidWlsZGluZyB3aXRoIFZDOCB0byBnZXQgdGhlICJtYW5pZmVzdCIgZW1iZWRkZWQgdG8gbWFrZSBmaW5lIHN0YW5kLWFsb25lCiAgYmluYXJpZXMuIFRoZSBtYWtldGd6IGFuZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmaWxlcyB3ZXJlIGFkanVzdGVkCiAgYWNjb3JkaW5nbHkuCgpEYW5pZWwgUyAoMjMgT2N0b2JlciAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MTIxOTAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MTIxOTApIHBvaW50cyBvdXQKICB0aGF0IGxpYmN1cmwgdHJpZWQgdG8gcmUtdXNlIGNvbm5lY3Rpb25zIGEgYml0IHRvbyBtdWNoIHdoZW4gdXNpbmcgbm9uLVNTTAogIHByb3RvY29scyB0dW5uZWxlZCBvdmVyIGEgSFRUUCBwcm94eS4KCkRhbmllbCBTICgyMiBPY3RvYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIGZvcndhcmRlZCB0aGUgYnVnIHJlcG9ydAogIGh0dHBzOi8vYnVnemlsbGEubm92ZWxsLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MzMyOTE3IGFib3V0IGEgSFRUUCByZWRpcmVjdCB0bwogIEZUUCB0aGF0IGNhdXNlZCBtZW1vcnkgaGF2b2MuIEhpcyB3b3JrIHRvZ2V0aGVyIHdpdGggbXkgZWZmb3J0cyBjcmVhdGVkIHR3bwogIGZpeGVzOgoKICAjMSAtIEZUUDo6ZmlsZSB3YXMgbW92ZWQgdG8gc3RydWN0IGZ0cF9jb25uLCBiZWNhdXNlIGlzIGhhcyB0byBiZSBkZWFsdCB3aXRoCiAgICAgICBhdCBjb25uZWN0aW9uIGNsZWFudXAsIGF0IHdoaWNoIHRpbWUgdGhlIHN0cnVjdCBIYW5kbGVEYXRhIGNvdWxkIGJlCiAgICAgICB1c2VkIGJ5IGFub3RoZXIgY29ubmVjdGlvbi4KICAgICAgIEFsc28sIHRoZSB1bnVzZWQgY2hhciAqdXJscGF0aCBtZW1iZXIgaXMgcmVtb3ZlZCBmcm9tIHN0cnVjdCBGVFAuCgogICMyIC0gcHJvdmlkZSBhIEN1cmxfcmVzZXRfcmVxcHJvdG8oKSBmdW5jdGlvbiB0aGF0IGZyZWVzCiAgICAgICBkYXRhLT5yZXFkYXRhLnByb3RvLiogb24gY29ubmVjdGlvbiBzZXR1cCBpZiBuZWVkZWQgKHRoYXQgaXMgaWYgdGhlCiAgICAgICBTZXNzaW9uSGFuZGxlIHdhcyB1c2VkIGJ5IGEgZGlmZmVyZW50IGNvbm5lY3Rpb24pLgoKICBBIGxvbmctdGVybSBnb2FsIGlzIG9mIGNvdXJzZSB0byBzb21laG93IGdldCByaWQgb2YgaG93IHRoZSByZXFkYXRhIHN0cnVjdAogIGlzIHVzZWQsIGFzIGl0IGlzIHRvbyBlcnJvci1wcm9uZS4KCi0gQnVnIHJlcG9ydCAjMTgxNTUzMCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxNTUzMCkgcG9pbnRzIG91dAogIHRoYXQgc3BlY2lmeWluZyBhIHByb3h5IHdpdGggYSB0cmFpbGluZyBzbGFzaCBkaWRuJ3Qgd29yayAodW5sZXNzIGl0IGFsc28KICBjb250YWluZWQgYSBwb3J0IG51bWJlcikuCgpQYXRyaWNrIE0gKDE1IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgZHluYW1pYyBDVVJMT1BUX1BPU1RGSUVMRFMgcHJvYmxlbTogdGhpcyBvcHRpb24gaXMgbm93IHN0YXRpYyBhZ2FpbgogIGFuZCBvcHRpb24gQ1VSTE9QVF9DT1BZUE9TVEZJRUxEUyBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IGR5bmFtaWMgbW9kZS4KClBhdHJpY2sgTSAoMTIgT2N0b2JlciAyMDA3KQotIEFkZGVkIHBlci1wcm90b2NvbCBjYWxsYmFjayBzdGF0aWMgdGFibGVzLCByZXBsYWNpbmcgY2FsbGJhY2sgcHRyIHN0b3JhZ2UKICBpbiB0aGUgY29ubmVjdGRhdGEgc3RydWN0dXJlIGJ5IGEgc2luZ2xlIGhhbmRsZXIgdGFibGUgcHRyLgoKRGFuIEYgKDExIE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgLWwgb3B0aW9uIG9mIHJ1bnRlc3RzLnBsCgotIEFkZGVkIHN1cHBvcnQgZm9yIHNraXBwaW5nIHRlc3RzIGJhc2VkIG9uIGtleSB3b3Jkcy4KCkRhbmllbCBTICg5IE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgcmVtb3ZlZCB0aGUgbm8gbG9uZ2VyIGV4aXN0aW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBjdXJsLjEKICBtYW4gcGFnZS4KCkRhbmllbCBTICg3IE9jdG9iZXIgMjAwNykKLSBLbm93biBidWcgIzQ3LCB3aGljaCBjb25mdXNlZCBsaWJjdXJsIGlmIGRvaW5nIE5UTE0gYXV0aCBvdmVyIGEgcHJveHkgd2l0aAogIGEgcmVzcG9uc2UgdGhhdCB3YXMgbGFyZ2VyIHRoYW4gMTZLQiBpcyBub3cgaW1wcm92ZWQgc2xpZ2h0bHkgc28gdGhhdCBub3cKICB0aGUgcmVzdHJpY3Rpb24gYXQgMTZLQiBpcyBmb3IgdGhlIGhlYWRlcnMgb25seSBhbmQgaXQgc2hvdWxkIGJlIGEgcmFyZQogIHNpdHVhdGlvbiB3aGVyZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBleGNlZWQgMTZLQi4gVGh1cywgSSBjb25zaWRlciAjNDcgZml4ZWQKICBhbmQgdGhlIGhlYWRlciBsaW1pdGF0aW9uIGlzIG5vdyBrbm93biBhcyBrbm93biBidWcgIzQ4LgoKRGFuaWVsIFMgKDUgT2N0b2JlciAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciBtYWRlIHRoZSBDVUxST1BUX0NPT0tJRUxJU1Qgb3B0aW9uIHN1cHBvcnQgYSBuZXcgbWFnaWMKICBzdHJpbmc6ICJGTFVTSCIuIFVzaW5nIHRoYXQgd2lsbCBjYXVzZSBsaWJjdXJsIHRvIGZsdXNoIGl0cyBjb29raWVzIHRvIHRoZQogIENVUkxPUFRfQ09PS0lFSkFSIGZpbGUuCgotIFRoZSBuZXcgZmlsZSBkb2NzL2xpYmN1cmwvQUJJIGRlc2NyaWJlcyBob3cgd2UgdmlldyBBQkkgYnJlYWthZ2VzLCBzb25hbWUKICBidW1wcyBhbmQgd2hhdCB0aGUgdmVyc2lvbiBudW1iZXIncyBzaWduaWZpY2FuY2UgdG8gYWxsIHRoYXQgaXMuCgpEYW5pZWwgUyAoNCBPY3RvYmVyIDIwMDcpCi0gSSBlbmFibGVkIHRlc3QgMTAwOSBhbmQgbWFkZSB0aGUgLS1sb2NhbC1wb3J0IHVzZSBhIHdpZGUgcmFuZ2UgdG8gcmVkdWNlIHRoZQogIHJpc2sgb2YgZmFpbHVyZXMuCgotIEtpbSBSaW5uZXdpdHogcmVwb3J0ZWQgdGhhdCAtLWxvY2FsLXBvcnQgZGlkbid0IHdvcmsgd2l0aCBURlRQIHRyYW5zZmVycy4KICBUaGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHRmdHAgY29kZSBhbHdheXMgdW5jb25kaW9uYWxseSBkaWQgYSBiaW5kKCkKICB3aXRob3V0IGNhcmluZyBpZiBvbmUgYWxyZWFkeSBoYWQgYmVlbiBkb25lIGFuZCB0aGVuIGl0IGZhaWxlZC4gSSB3cm90ZSBhCiAgdGVzdCBjYXNlICgxMDA5KSB0byB2ZXJpZnkgdGhpcywgYnV0IGl0IGlzIGEgYml0IGVycm9yLXByb25lIHNpbmNlIGl0IHdpbGwKICBoYXZlIHRvIHBpY2sgYSBmaXhlZCBsb2NhbCBwb3J0IG51bWJlciBhbmQgc2luY2UgdGhlIHRlc3RzIGFyZSBydW4gb24gc28KICBtYW55IGRpZmZlcmVudCBob3N0cyBpbiBkaWZmZXJlbnQgc2l0dWF0aW9ucyBJJ2xsIGFkZCBpdCBpbiBkaXNhYmxlZCBzdGF0ZS4KCllhbmcgVHNlICgzIE9jdG9iZXIgMjAwNykKLSBGaXhlZCBpc3N1ZSByZWxhdGVkIHdpdGggdGhlIHVzZSBvZiBhcmVzX3RpbWVvdXQoKSByZXN1bHQuCgpEYW5pZWwgUyAoMyBPY3RvYmVyIDIwMDcpCi0gQWxleGV5IFBlc3Rlcm5pa292IGludHJvZHVjZWQgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gYW5kCiAgQ1VSTE9QVF9PUEVOU09DS0VUREFUQSB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0bwogIHJlcGxhY2UgdGhlIHNvY2tldCgpIGNhbGwgdXNlZCBieSBsaWJjdXJsLiBJdCBiYXNpY2FsbHkgYWxsb3dzIHRoZSBhcHAgdG8KICBjaGFuZ2UgYWRkcmVzcywgcHJvdG9jb2wgb3Igd2hhdGV2ZXIgb2YgdGhlIHNvY2tldC4KCi0gSSByZW5hbWVkIHRoZSBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBlcnJvciBjb2RlIHRvCiAgQ1VSTEVfUEVFUl9GQUlMRURfVkVSSUZJQ0FUSU9OIChzdGFuZGFyZCBDVVJMX05PX09MRElFUyBzdHlsZSksIGFuZCBtYWRlCiAgdGhpcyByZXR1cm4gY29kZSBnZXQgdXNlZCBieSB0aGUgcHJldmlvdXMgU1NIIE1ENSBmaW5nZXJwcmludCBjaGVjayBpbiBjYXNlCiAgaXQgZmFpbHMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnJvdWdodCBieSBKb2hubnkgTHVvbmcsIGxpYmN1cmwgbm93IG9mZmVycwogIENVUkxPUFRfU1NIX0hPU1RfUFVCTElDX0tFWV9NRDUgYW5kIHRoZSBjdXJsIHRvb2wgLS1ob3N0cHVibWQ1LiBUaGV5IGJvdGgKICBtYWtlIHRoZSBTQ1Agb3IgU0ZUUCBjb25uZWN0aW9uIHZlcmlmeSB0aGUgcmVtb3RlIGhvc3QncyBtZDUgY2hlY2tzdW0gb2YgdGhlCiAgcHVibGljIGtleSBiZWZvcmUgZG9pbmcgYSBjb25uZWN0LCB0byByZWR1Y2UgdGhlIHJpc2sgb2YgYSBtYW4taW4tdGhlLW1pZGRsZQogIGF0dGFjay4KCkRhbmllbCBTICgyIE9jdG9iZXIgMjAwNykKLSBsaWJjdXJsIG5vdyBoYW5kbGVzIGNodW5rZWQtZW5jb2RlZCBDT05ORUNUIHJlc3BvbnNlcwoKRGFuaWVsIFMgKDEgT2N0b2JlciAyMDA3KQotIEFsZXggRmlzaG1hbiByZXBvcnRlZCBhIGN1cmxfZWFzeV9lc2NhcGUoKSBwcm9ibGVtIHRoYXQgd2FzIG1hZGUgdGhlCiAgZnVuY3Rpb24gZG8gd3Jvbmcgb24gYWxsIGlucHV0IGJ5dGVzIHRoYXQgYXJlID49IDB4ODAgKGRlY2ltYWwgMTI4KSBkdWUgdG8gYQogIHNpZ25lZCAvIHVuc2lnbmVkIG1pc3Rha2UgaW4gdGhlIGNvZGUuIEkgZml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSA1NDMgdG8KICB2ZXJpZnkuCgpEYW5pZWwgUyAoMjkgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCB0cmFuc2ZlcnMgb3ZlciBTRlRQLgoKRGFuaWVsIFMgKDI4IFNlcHRlbWJlciAyMDA3KQotIEFkYXB0ZWQgdGhlIGMtYXJlcyBjb2RlIHRvIHRoZSBBUEkgY2hhbmdlIGMtYXJlcyAxLjUuMCBicmluZ3MgaW4gdGhlCiAgbm90aWZpZXIgY2FsbGJhY2socykuCgpEYW4gRiAoMjYgU2VwdGVtYmVyIDIwMDcpCi0gRW5hYmxlZCBhIGZldyBtb3JlIGdjYyB3YXJuaW5ncyB3aXRoIC0tZW5hYmxlLWRlYnVnLiAgUmVuYW1lZCBhIGZldwogIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3dpbmcgZ2xvYmFsIGRlY2xhcmF0aW9ucy4KCkRhbmllbCBTICgyNiBTZXB0ZW1iZXIgMjAwNykKLSBQaGlsaXAgTGFuZ2RhbGUgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1BPU1QzMDEgb3B0aW9uIGZvcgogIGN1cmxfZWFzeV9zZXRvcHQoKSB0aGF0IGFsdGVycyBob3cgbGliY3VybCBmdW5jdGlvbnMgd2hlbiBmb2xsb3dpbmcKICByZWRpcmVjdHMuIEl0IG1ha2VzIGxpYmN1cmwgb2JleSB0aGUgUkZDMjYxNiB3aGVuIGEgMzAxIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgYWZ0ZXIgYSBub24tR0VUIHJlcXVlc3QgaXMgbWFkZS4gRGVmYXVsdCBsaWJjdXJsIGJlaGF2aW91ciBpcyB0byBjaGFuZ2UKICBtZXRob2QgdG8gR0VUIGluIHRoZSBzdWJzZXF1ZW50IHJlcXVlc3QgKGxpa2UgaXQgZG9lcyBmb3IgcmVzcG9uc2UgY29kZSAzMDIKICAtIGJlY2F1c2UgdGhhdCdzIHdoYXQgbWFueS9tb3N0IGJyb3dzZXJzIGRvKSwgYnV0IHdpdGggdGhpcyBDVVJMT1BUX1BPU1QzMDEKICBvcHRpb24gZW5hYmxlZCBpdCB3aWxsIGRvIHdoYXQgdGhlIHNwZWMgc2F5cyBhbmQgZG8gdGhlIG5leHQgcmVxdWVzdCB1c2luZwogIHRoZSBzYW1lIG1ldGhvZCBhZ2Fpbi4gSS5lIGtlZXAgUE9TVCBhZnRlciAzMDEuCgogIFRoZSBjdXJsIHRvb2wgZ290IHRoaXMgb3B0aW9uIGFzIC0tcG9zdDMwMQoKICBUZXN0IGNhc2UgMTAxMSBhbmQgMTAxMiB3ZXJlIGFkZGVkIHRvIHZlcmlmeS4KCi0gTWF4IEthdHNldiByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBsaWJjdXJsIEZUUCByZXF1ZXN0IHdpdGgKICBDVVJMT1BUX05PQk9EWSBlbmFibGVkIGJ1dCBub3QgQ1VSTE9QVF9IRUFERVIsIGxpYmN1cmwgd291bGRuJ3QgZG8gVFlQRQogIGJlZm9yZSBpdCBkb2VzIFNJWkUgd2hpY2ggbWFrZXMgaXQgbGVzcyB1c2VmdWwuIEkgd2Fsa2VkIG92ZXIgdGhlIGNvZGUgYW5kCiAgbWFkZSBpdCBkbyB0aGlzIHByb3Blcmx5LCBhbmQgYWRkZWQgdGVzdCBjYXNlIDU0MiB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgUyAoMjQgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgS05PV05fQlVHUyAjNDQ6IC0tZnRwLW1ldGhvZCBub2N3ZCBkaWQgbm90IGhhbmRsZQogIFVSTHMgZW5kaW5nIHdpdGggYSBzbGFzaCBwcm9wZXJseSAoaXQgc2hvdWxkIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQKICBkaXJlY3RvcnkpLiBUZXN0IGNhc2UgMzUxIGJyb3VnaHQgYmFjayBhbmQgYWxzbyB0ZXN0IDEwMTAgd2FzIGFkZGVkLgoKRGFuaWVsIFMgKDIxIFNlcHRlbWJlciAyMDA3KQotIE1hcmsgRGF2aWVzIGZpeGVkIE5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBvdmVyIHByb3h5LCBhbmQgYWxzbyBpbnRyb2R1Y2VkCiAgdGhlIC0tcHJveHktbmVnb3RpYXRlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gYWxsb3cgYSB1c2VyIHRvIGV4cGxpY2l0bHkKICBzZWxlY3QgaXQuCgpEYW5pZWwgUyAoMTkgU2VwdGVtYmVyIDIwMDcpCi0gUm9iIENyaXR0ZW5kZW4gcHJvdmlkZWQgYW4gTlNTIHVwZGF0ZSB3aXRoIHRoZSBmb2xsb3dpbmcgaGlnaGxpZ2h0czoKCiAgbyBJdCBsb29rcyBmb3IgdGhlIE5TUyBkYXRhYmFzZSBmaXJzdCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgU1NMX0RJUiwKICAgIHRoZW4gaW4gL2V0Yy9wa2kvbnNzZGIsIHRoZW4gaXQgaW5pdGlhbGl6ZXMgd2l0aCBubyBkYXRhYmFzZSBpZiBuZWl0aGVyIG9mCiAgICB0aG9zZSBleGlzdC4KCiAgbyBJZiB0aGUgTlNTIFBLQ1MjMTEgbGlibnNwc2VtLnNvIGRyaXZlciBpcyBhdmFpbGFibGUgdGhlbiBQRU0gZmlsZXMgbWF5IGJlCiAgICBsb2FkZWQsIGluY2x1ZGluZyB0aGUgY2EtYnVuZGxlLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gb25seQogICAgY2VydGlmaWNhdGVzIGFscmVhZHkgaW4gdGhlIE5TUyBkYXRhYmFzZSBhcmUgdXNlZC4KCiAgbyBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBhIGZpbGUgb3Igbmlja25hbWUgaXMgYmVpbmcgcGFzc2VkIGluIHNvIHRoZSByaWdodAogICAgdGhpbmcgaXMgZG9uZQoKICBvIEFkZGVkIGEgYml0IG9mIGNvZGUgdG8gbWFrZSB0aGUgb3V0cHV0IG1vcmUgbGlrZSB0aGUgT3BlblNTTCBtb2R1bGUsCiAgICBpbmNsdWRpbmcgZGlzcGxheWluZyB0aGUgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24gd2hlbiBjb25uZWN0aW5nIGluCiAgICB2ZXJib3NlIG1vZGUKCiAgbyBJbXByb3ZlZCBoYW5kbGluZyBvZiBjZXJ0aWZpY2F0ZSBlcnJvcnMgKGV4cGlyZWQsIHVudHJ1c3RlZCwgZXRjKQoKICBUaGUgbGlibnNzcGVtLnNvIFBLQ1MjMTEgbW9kdWxlIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpbiBGZWRvcmEKICA4L3Jhd2hpZGUuIFdvcmsgd2lsbCBiZSBkb25lIHNvb24gdG8gdXBzdHJlYW0gaXQuIFRoZSBOU1MgbW9kdWxlIHdpbGwgd29yawogIHdpdGggb3Igd2l0aG91dCBpdCwgYWxsIHRoYXQgY2hhbmdlcyBpcyB0aGUgc291cmNlIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgYW5kCiAga2V5cy4KCkRhbmllbCBTICgxOCBTZXB0ZW1iZXIgMjAwNykKLSBJbW1hbnVlbCBHcmVnb2lyZSBwb2ludGVkIG91dCB0aGF0IHB1YmxpYyBrZXkgU1NIIGF1dGggZmFpbGVkIGlmIG5vCiAgcHVibGljL3ByaXZhdGUga2V5IHdhcyBzcGVjaWZpZWQgYW5kIHRoZXJlIHdhcyBubyBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlLAogIGFuZCB0aGVuIGl0IGRpZG4ndCBjb250aW51ZSB0byB0cnkgdGhlIG90aGVyIGF1dGggbWV0aG9kcy4gTm93IGl0IHdpbGwKICBpbnN0ZWFkIHRyeSB0byBnZXQgdGhlIGZpbGVzIGlkX2RzYS5wdWIgYW5kIGlkX2RzYSBmcm9tIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIG5vbmUgb2YgdGhlIHR3byBjb25kaXRpb25zIHdlcmUgbWV0LgoKRGFuIEYgKDE3IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIGhvb2tzIHRvIHRoZSB0ZXN0IHN1aXRlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdGVzdCBhIGN1cmwgcnVubmluZwogIG9uIGEgcmVtb3RlIGhvc3QuCgotIENoYW5nZWQgc29tZSBGVFAgdGVzdHMgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgUE9SVCBhbmQgRVBSVCBjb21tYW5kcwogIHNlbnQgYnkgY3VybCwgaWYgbm90IHRoZSBhZGRyZXNzZXMgdGhlbXNlbHZlcy4KCkRhbmllbCBTICgxNSBTZXB0ZW1iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgbWFkZSBsaWJjdXJsIGF1dG9tYXRpY2FsbHkgYXBwZW5kICI7dHlwZT08YXxpPiIgd2hlbiB1c2luZyBIVFRQCiAgcHJveGllcyBmb3IgRlRQIHVybHMuCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBMREFQIGJ1aWxkcyBpbiB0aGUgV2luZG93cyBtYWtlZmlsZXMgYW5kIGZpeGVkIExEQVB2MwogIHN1cHBvcnQgb24gV2luZG93cy4KCkRhbiBGICgxMyBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCBMREFQUywgU0NQIGFuZCBTRlRQIHRvIGN1cmwtY29uZmlnIC0tcHJvdG9jb2xzLiBSZW1vdmVkIGFuZAogIGZpeGVkIHNvbWUgQUNfU1VCU1QgY29uZmlndXJlIGVudHJpZXMuCgpWZXJzaW9uIDcuMTcuMCAoMTMgU2VwdGVtYmVyIDIwMDcpCgpEYW5pZWwgUyAoMTIgU2VwdGVtYmVyIDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc5MjY0OSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc5MjY0OSkgcG9pbnRlZAogIG91dCBhIHByb2JsZW0gd2l0aCBkb2luZyBhbiBlbXB0eSB1cGxvYWQgb3ZlciBGVFAgb24gYSByZS11c2VkIGNvbm5lY3Rpb24uCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTQxIHRvIHJlcHJvZHVjZSBpdCBhbmQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEkgbm90aWNlZCB3aGlsZSB3cml0aW5nIHRlc3QgNTQxIHRoYXQgdGhlIEZUUCBjb2RlIHdyb25nbHkgZGlkIGEgQ1dEIG9uIHRoZQogIHNlY29uZCB0cmFuc2ZlciBhcyBpdCBkaWRuJ3Qgc3RvcmUgYW5kIHJlbWVtYmVyIHRoZSAiIiBwYXRoIGZyb20gdGhlCiAgcHJldmlvdXMgdHJhbnNmZXIgc28gaXQgd291bGQgaW5zdGVhZCBDV0QgdG8gdGhlIGVudHJ5IHBhdGggYXMgc3RvcmVkLiBUaGlzCiAgd29ya2VkLCBidXQgZGlkIGEgc3VwZXJmbHVvdXMgY29tbWFuZC4gVGh1cywgdGVzdCBjYXNlIDU0MSBub3cgYWxzbyB2ZXJpZmllcwogIHRoaXMgZml4LgoKRGFuIEYgKDUgU2VwdGVtYmVyIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlIDEwMDcgdG8gdGVzdCBwZXJtaXNzaW9uIHByb2JsZW0gd2hlbiB1cGxvYWRpbmcgd2l0aCBURlRQCiAgKHRvIHZhbGlkYXRlIGJ1ZyAjMTc5MDQwMykuCgotIFRGVFAgbm93IHJlcG9ydHMgdGhlICJub3QgZGVmaW5lZCIgVEZUUCBlcnJvciBjb2RlIDAgYXMgYW4gZXJyb3IsCiAgbm90IHN1Y2Nlc3MuCgpEYW5pZWwgUyAoNSBTZXB0ZW1iZXIgMjAwNykKLSBDb250aW51ZWQgdGhlIHdvcmsgb24gYSBmaXggZm9yICMxNzc5MDU0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzkwNTQpLiBNeSBwcmV2aW91cyBmaXggZnJvbSBBdWd1c3QKICAyNCB3YXMgbm90IGNvbXBsZXRlIChlaXRoZXIpIGJ1dCBjb3VsZCBhY2NpZGVudGFsbHkgImZvcmdldCIgcGFydHMgb2YgYQogIHNlcnZlciByZXNwb25zZSB3aGljaCBsZWQgdG8gZmF1bHR5IHNlcnZlciByZXNwb25zZSB0aW1lLW91dCBlcnJvcnMuCgpEYW4gRiAoNSBTZXB0ZW1iZXIgMjAwNykKLSBNaW5peCBkb2Vzbid0IHN1cHBvcnQgZ2V0c29ja29wdCBvbiBVRFAgc29ja2V0cyBvciBzZW5kL3JlY3Ygb24gVENQCiAgc29ja2V0cy4KCkRhbiBGICgzMSBBdWd1c3QgMjAwNykKLSBNYWRlIHNvbWUgb2YgdGhlIGVycm9yIHN0cmluZ3MgcmV0dXJuZWQgYnkgdGhlICpzdHJlcnJvciBmdW5jdGlvbnMgbW9yZQogIGdlbmVyaWMsIGFuZCBtb3JlIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLgoKLSBSZW5hbWVkIHRoZSBjdXJsX2Z0cHNzbCBlbnVtIHRvIGN1cmxfdXNlc3NsIGFuZCBpdHMgZW51bWVyYXRlZCBjb25zdGFudHMsCiAgY3JlYXRpbmcgbWFjcm9zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgoKICAgIENVUkxGVFBTU0xfTk9ORSA9PiBDVVJMVVNFU1NMX05PTkUKICAgIENVUkxGVFBTU0xfVFJZID0+IENVUkxVU0VTU0xfVFJZCiAgICBDVVJMRlRQU1NMX0NPTlRST0wgPT4gQ1VSTFVTRVNTTF9DT05UUk9MCiAgICBDVVJMRlRQU1NMX0FMTCA9PiBDVVJMVVNFU1NMX0FMTAogICAgQ1VSTEZUUFNTTF9MQVNUID0+IENVUkxVU0VTU0xfTEFTVAoKRGFuIEYgKDMwIEF1Z3VzdCAyMDA3KQotIFJlbmFtZWQgc2V2ZXJhbCBsaWJjdXJsIGVycm9yIGNvZGVzIGFuZCBvcHRpb25zIHRvIG1ha2UgdGhlbSBtb3JlIGdlbmVyYWwKICBhbmQgYWxsb3cgcmV1c2UgYnkgbXVsdGlwbGUgcHJvdG9jb2xzLiBTZXZlcmFsIHVudXNlZCBlcnJvciBjb2RlcyB3ZXJlCiAgcmVtb3ZlZC4gIEluIGFsbCBjYXNlcywgbWFjcm9zIHdlcmUgYWRkZWQgdG8gcHJlc2VydmUgc291cmNlIChhbmQgYmluYXJ5KQogIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIG5hbWVzLiAgVGhlc2UgbWFjcm9zIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgYXQKICBhIGZ1dHVyZSBkYXRlLCBidXQgcHJvYmFibHkgbm90IGJlZm9yZSAyMDA5LiAgQW4gYXBwbGljYXRpb24gY2FuIGJlCiAgdGVzdGVkIHRvIHNlZSBpZiBpdCBpcyB1c2luZyBhbnkgb2Jzb2xldGUgY29kZSBieSBjb21waWxpbmcgaXQgd2l0aCB0aGUKICBDVVJMX05PX09MRElFUyBtYWNybyBkZWZpbmVkLgoKICBUaGUgZm9sbG93aW5nIHVudXNlZCBlcnJvciBjb2RlcyB3ZXJlIHJlbW92ZWQ6CgogICAgQ1VSTEVfQkFEX0NBTExJTkdfT1JERVIKICAgIENVUkxFX0JBRF9QQVNTV09SRF9FTlRFUkVECiAgICBDVVJMRV9GVFBfQ0FOVF9SRUNPTk5FQ1QKICAgIENVUkxFX0ZUUF9DT1VMRE5UX0dFVF9TSVpFCiAgICBDVVJMRV9GVFBfQ09VTEROVF9TRVRfQVNDSUkKICAgIENVUkxFX0ZUUF9VU0VSX1BBU1NXT1JEX0lOQ09SUkVDVAogICAgQ1VSTEVfRlRQX1dFSVJEX1VTRVJfUkVQTFkKICAgIENVUkxFX0ZUUF9XUklURV9FUlJPUgogICAgQ1VSTEVfTElCUkFSWV9OT1RfRk9VTkQKICAgIENVUkxFX01BTEZPUk1BVF9VU0VSCiAgICBDVVJMRV9PQlNPTEVURQogICAgQ1VSTEVfU0hBUkVfSU5fVVNFCiAgICBDVVJMRV9VUkxfTUFMRk9STUFUX1VTRVIKCiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgPT4gICAgICBDVVJMRV9SRU1PVEVfQUNDRVNTX0RFTklFRAogICAgQ1VSTEVfRlRQX0NPVUxETlRfU0VUX0JJTkFSWSA9PiBDVVJMRV9GVFBfQ09VTEROVF9TRVRfVFlQRQogICAgQ1VSTEVfRlRQX1NTTF9GQUlMRUQgPT4gICAgICAgICBDVVJMRV9VU0VfU1NMX0ZBSUxFRAogICAgQ1VSTEVfRlRQX1FVT1RFX0VSUk9SID0+ICAgICAgICBDVVJMRV9RVU9URV9FUlJPUgogICAgQ1VSTEVfVEZUUF9ESVNLRlVMTCA9PiAgICAgICAgICBDVVJMRV9SRU1PVEVfRElTS19GVUxMCiAgICBDVVJMRV9URlRQX0VYSVNUUyA9PiAgICAgICAgICAgIENVUkxFX1JFTU9URV9GSUxFX0VYSVNUUwogICAgQ1VSTEVfSFRUUF9SQU5HRV9FUlJPUiA9PiAgICAgICBDVVJMRV9SQU5HRV9FUlJPUgoKICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgd2VyZSByZW5hbWVkOgoKICAgIENVUkxPUFRfU1NMS0VZUEFTU1dEID0+IENVUkxPUFRfS0VZUEFTU1dECiAgICBDVVJMT1BUX0ZUUEFQUEVORCA9PiAgICBDVVJMT1BUX0FQUEVORAogICAgQ1VSTE9QVF9GVFBMSVNUT05MWSA9PiAgQ1VSTE9QVF9ESVJMSVNUT05MWQogICAgQ1VSTE9QVF9GVFBfU1NMID0+ICAgICAgQ1VSTE9QVF9VU0VfU1NMCgogIEEgZmV3IG1vcmUgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2Ugd2l0aCB0aGUgbmV4dCBTT05BTUUgYnVtcCBvZiB0aGUKICBsaWJyYXJ5LiAgVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gZG9jcy9UT0RPCgotIERvY3VtZW50ZWQgc29tZSBuZXdlciBlcnJvciBjb2RlcyBpbiBsaWJjdXJsLWVycm9yKDMpCgotIEFkZGVkIG1vcmUgYWNjdXJhdGUgZXJyb3IgY29kZSByZXR1cm5zIGZyb20gU0ZUUCBvcGVyYXRpb25zLiAgQWRkZWQgdGVzdAogIGNhc2UgNjE1IHRvIHRlc3QgYW4gU0ZUUCB1cGxvYWQgZmFpbHVyZS4KCkRhbiBGICgyOCBBdWd1c3QgMjAwNykKLSBTb21lIG1pbm9yIGludGVybmFsIHR5cGUgYW5kIGNvbnN0IGNoYW5nZXMgYmFzZWQgb24gYSBzcGxpbnQgc2Nhbi4KCkRhbmllbCBTICgyNCBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIGxhcmdlIHJlc3BvbnNlcyBmcm9tIHNlcnZlciBjb21tYW5kcywgd2hlbgogIHRoZSBzaW5nbGUgcmVzcG9uc2Ugd2FzIGNvbnNpc3Rpbmcgb2YgbXVsdGlwbGUgbGluZXMgYnV0IG9mIGEgdG90YWwgc2l6ZSBvZgogIDE2S0Igb3IgbW9yZS4gRGFuIEZhbmRyaWNoIGltcHJvdmVkIHRoZSBmdHAgdGVzdCBzY3JpcHQgYW5kIHByb3ZpZGVkIHRlc3QKICBjYXNlIDEwMDYgdG8gcmVwZWF0IHRoZSBwcm9ibGVtLCBhbmQgSSBmaXhlZCB0aGUgY29kZSB0byBtYWtlIHN1cmUgdGhpcyBuZXcKICB0ZXN0IGNhc2UgcnVucyBmaW5lLgoKUGF0cmljayBNICgyMyBBdWd1c3QgMjAwNykKLSBPUy80MDAgcG9ydDogbmV3IGZpbGVzIGxpYi9jb25maWctb3M0MDAuaCBsaWIvc2V0dXAtb3M0MDAuaCBwYWNrYWdlcy9PUzQwMC8qLgogIFNlZSBwYWNrYWdlcy9PUzQwMC9SRUFETUUuT1M0MDAuCgpEYW5pZWwgUyAoMjMgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTc1MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTc1MSkgcG9pbnRlZAogIG91dCB0aGF0IGRvaW5nIGZpcnN0IGEgZmlsZTovLyB1cGxvYWQgYW5kIHRoZW4gYW4gRlRQIHVwbG9hZCBjcmFzaGVkIGxpYmN1cmwKICBvciBhdCBiZXN0IGNhdXNlZCBmdXJpb3VzIHZhbGdyaW5kIGNvbXBsYWludHMuIEZpeGVkIG5vdyEKCkRhbmllbCBTICgyMiBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIHZlcnkgbG9uZyAoPjE2SykgRlRQIHNlcnZlciByZXNwb25zZSBsaW5lcwogIHByb3Blcmx5LiBTdGFydGluZyBub3csIGxpYmN1cmwgd2lsbCBjaG9wIHRoZW0gb2ZmICh0aHVzIHRoZSBjbGllbnQgYXBwIHdpbGwKICBub3QgZ2V0IHRoZSBmdWxsIGxpbmUpIGJ1dCBzdXJ2aXZlIGFuZCBkZWFsIHdpdGggdGhlbSBmaW5lIG90aGVyd2lzZS4gVGVzdAogIGNhc2UgMTAwMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgUyAoMjAgQXVndXN0IDIwMDcpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBDaHJpc3RpYW4gVm9ndCwgdGhlIEZUUCBjb2RlIG5vdyBzZXRzIHRoZSB1cGNvbWluZwogIGRvd25sb2FkIHRyYW5zZmVyIHNpemUgbXVjaCBlYXJsaWVyIHRvIGJlIHBvc3NpYmxlIHRvIGdldCByZWFkIHdpdGgKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGlzIGlzIHZlcnkgbXVjaCBpbiBhCiAgc2ltaWxhciBzcGlyaXQgdG8gdGhlIEhUVFAgc2l6ZSBjaGFuZ2UgZnJvbSBBdWd1c3QgMTEgMjAwNy4KCkRhbmllbCBTICgxOCBBdWd1c3QgMjAwNykKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NzYyMzIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzMikgYWJvdXQgbGliY3VybCBjYWxsaW5nCiAgQ3VybF9jbGllbnRfd3JpdGUoKSwgcGFzc2luZyBvbiBhIGNvbnN0IHN0cmluZyB0aGF0IHRoZSBjYWxsZXIgbWF5IG5vdAogIG1vZGlmeSBhbmQgeWV0IGl0IGRvZXMgKG9uIHNvbWUgcGxhdGZvcm1zKS4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzc2MjM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzYyMzUpIGFib3V0IGZ0cCByZXF1ZXN0cyB3aXRoIE5PQk9EWQogIG9uIGEgZGlyZWN0b3J5IHdvdWxkIGRvIGEgIlNJWkUgKG51bGwpIiByZXF1ZXN0LiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdAogIGNhc2UgMTAwMCB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsIFMgKDE3IEF1Z3VzdCAyMDA3KQotIFNvbmcgTWEgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGN1cmVzIGEgcHJvYmxlbSBsaWJjdXJsIGhhcyB3aGVuIGRvaW5nIHJlc3VtZQogIEhUVFAgUFVUIHVzaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gVGVzdCBjYXNlIDUzMjAgYW5kIDUzMjIgd2VyZSBhbHNvCiAgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsIFMgKDE0IEF1Z3VzdCAyMDA3KQotIEFuZHJldyBXYW5zaW5rIHByb3ZpZGVkIGFuIE5UTE0gYnVnZml4OiBpbiB0aGUgY2FzZSB0aGUgc2VydmVyIHNldHMgdGhlIGZsYWcKICBOVExNRkxBR19ORUdPVElBVEVfVU5JQ09ERSwgd2UgbmVlZCB0byBmaWx0ZXIgaXQgb2ZmIGJlY2F1c2UgbGliY3VybCBkb2Vzbid0CiAgVU5JQ09ERSBlbmNvZGUgdGhlIHN0cmluZ3MgaXQgcGFja3MgaW50byB0aGUgTlRMTSBhdXRoZW50aWNhdGUgcGFja2V0LgoKRGFuaWVsIFMgKDExIEF1Z3VzdCAyMDA3KQotIEFsbGVuIFB1bHNpZmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHNldCB0aGUgZXhwZWN0ZWQgZG93bmxvYWQKICBzaXplIGVhcmxpZXIgd2hlbiBkb2luZyBIVFRQIGRvd25sb2Fkcywgc28gdGhhdCBhcHBsaWNhdGlvbnMgYW5kIHRoZQogIHByb2dyZXNzIG1ldGVyIGV0YyBrbm93IGdldCB0aGUgaW5mbyBlYXJsaWVyIGluIHRoZSBmbG93IHRoYW4gYmVmb3JlLgoKLSBQYXRyaWNrIE1vbm5lcmF0IG1vZGlmaWVkIHRoZSBMREFQIGNvZGUgYW5kIGFwcHJvYWNoIGluIGN1cmwuIFN0YXJ0aW5nIG5vdywKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjaGVja3MgZm9yIG9wZW5sZGFwIGFuZCBmcmllbmRzIGFuZCB3ZSBsaW5rIHdpdGggdGhvc2UKICBsaWJzIGp1c3QgbGlrZSB3ZSBsaW5rIGFsbCBvdGhlciB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMsIGFuZCB3ZSBubyBsb25nZXIKICBkbG9wZW4oKSB0aG9zZSBsaWJyYXJpZXMuIE91ciBwcml2YXRlIGhlYWRlciBmaWxlIGxpYi9sZGFwLmggd2FzIHJlbmFtZWQgdG8KICBsaWIvY3VybF9sZGFwLmggZHVlIHRvIHRoaXMuIEkgc2V0IGEgdGFnIGluIENWUyAoY3VybC03XzE3XzAtcHJlbGRhcGZpeCkKICBqdXN0IGJlZm9yZSB0aGlzIGNvbW1pdCwganVzdCBpbiBjYXNlLgoKRGFuIEYgKDggQXVndXN0IDIwMDcpCi0gU29uZyBNYSBub3RlZCBhIHpsaWIgbWVtb3J5IGxlYWsgaW4gdGhlIGlsbGVnYWwgY29tcHJlc3NlZCBoZWFkZXIKICBjb3VudGVybWVhc3VyZXMgY29kZSBwYXRoLgoKRGFuaWVsIFMgKDQgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBmaXhlZCBjdXJsX2Vhc3lfZXNjYXBlKCkgYW5kIGN1cmx4X3N0cnRvbGwoKSB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHN5c3RlbXMuCgpEYW5pZWwgUyAoMyBBdWd1c3QgMjAwNykKLSBJIGN1dCBvdXQgc3VwcG9ydCBmb3IgbGlic3NoMiB2ZXJzaW9ucyBvbGRlciB0aGFuIDAuMTYgdG8gbWFrZSBvdXIgY29kZSBhCiAgbG90IHNpbXBsZXIsIGFuZCB0byBhdm9pZCBnZXR0aW5nIHRyb3VibGUgd2l0aCB0aGUgTElCU1NIMl9BUElOTyBkZWZpbmUKICB0aGF0IDEpIGRpZG4ndCB3b3JrIHByb3Blcmx5IHNpbmNlIGl0IHdhcyA+MzIgYml0cyBhbmQgMikgaXMgcmVtb3ZlZCBpbgogIGxpYnNzaDIgMC4xNi4uLgoKRGFuaWVsIFMgKDIgQXVndXN0IDIwMDcpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NjYzMjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc2NjMyMCkgcG9pbnRpbmcgb3V0IHRoYXQgdGhlIGxpYmN1cmwKICBjb2RlIGFjY2Vzc2VkIHR3byBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9ucyAoQ1VSTE9QVF9ETlNfQ0FDSEVfVElNRU9VVCBhbmQKICBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFKSBhcyBpbnRzIGV2ZW4gdGhvdWdoIHRoZXkncmUgZG9jdW1lbnRlZCB0byBiZQogIHBhc3NlZCBpbiBhcyBsb25ncywgYW5kIHRoYXQgbWFrZXMgYSBkaWZmZXJlbmNlIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLgoKLSBEbWl0cml5IFNlcmdleWV2IHJlcG9ydGVkIGEgcmVncmVzc2lvbjogcmVzdW1lZCBmaWxlOi8vIHRyYW5zZmVycyBicm9rZQogIGFmdGVyIDcuMTYuMi4gVGhpcyBpcyBtdWNoIGR1ZSB0byB0aGUgZGlmZmVyZW50IHRyZWF0bWVudCBmaWxlOi8vIGdldHMKICBpbnRlcm5hbGx5LCBidXQgbm93IEkgYWRkZWQgdGVzdCAyMzEgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSB0byBoYXBwZW4gYWdhaW4KICB3aXRob3V0IHVzIG5vdGljaW5nIQoKRGFuaWVsIFMgKDEgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBhbmQgSSBtb2RpZmllZCBsaWJjdXJsIHNvIHRoYXQgbm93IGl0ICpjb3BpZXMqIGFsbCBzdHJpbmdzCiAgcGFzc2VkIHRvIGl0IHdpdGggY3VybF9lYXN5X3NldG9wdCgpISBQcmV2aW91c2x5IGl0IGhhcyBhbHdheXMganVzdCByZWZlcmVkCiAgdG8gdGhlIGRhdGEsIGZvcmNpbmcgdGhlIHVzZXIgdG8ga2VlcCB0aGUgZGF0YSBhcm91bmQgdW50aWwgbGliY3VybCBpcyBkb25lCiAgd2l0aCBpdC4gVGhhdCBpcyBub3cgaGlzdG9yeSBhbmQgbGliY3VybCB3aWxsIGluc3RlYWQgY2xvbmUgdGhlIGdpdmVuCiAgc3RyaW5ncyBhbmQga2VlcCBwcml2YXRlIGNvcGllcy4gVGhpcyBpcyBhbHNvIHBhcnQgb2YgUGF0cmljayBNb25uZXJhdCdzCiAgT1MvNDAwIHBvcnQuCgogIER1ZSB0byB0aGlzIGJlaW5nIGEgc29tZXdoYXQgaW50ZXJlc3RpbmcgY2hhbmdlIEFQSSB3aXNlLCBJJ3ZlIGRlY2lkZWQgdG8KICBidW1wIHRoZSB2ZXJzaW9uIG9mIHRoZSB1cGNvbWluZyByZWxlYXNlIHRvIDcuMTcuMC4gT2xkZXIgYXBwbGljYXRpb25zIHdpbGwKICBvZiBjb3Vyc2Ugbm90IG5vdGljZSB0aGlzIGNoYW5nZSBub3IgZG8gdGhleSBoYXZlIHRvIGNhcmUsIGJ1dCBuZXcKICBhcHBsaWNhdGlvbnMgY2FuIGJlIHdyaXR0ZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KCi0gR3JlZyBNb3JzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBQT1NUaW5nIHVzaW5nIEFOWUFVVEggdG8gYSBzZXJ2ZXIKICByZXF1aXJpbmcgTlRMTSwgYW5kIGhlIHByb3ZpZGVkIHRlc3QgY29kZSBhbmQgYSB0ZXN0IHNlcnZlciBhbmQgd2Ugd29ya2VkCiAgb3V0IGEgYnVnIGZpeC4gV2UgZmFpbGVkIHRvIGNvdW50IHNlbnQgYm9keSBkYXRhIGF0IHRpbWVzLCB3aGljaCB0aGVuIGNhdXNlZAogIGludGVybmFsIGNvbmZ1c2lvbnMgd2hlbiBsaWJjdXJsIHRyaWVkIHRvIHNlbmQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgaW4gb3JkZXIKICB0byBtYWludGFpbiB0aGUgc2FtZSBjb25uZWN0aW9uIGFsaXZlLgoKRGFuaWVsIFMgKDMxIEp1bHkgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBwb2ludGVkIG91dCAoYW5kIGZpeGVkKSB0aGF0IHRoZSBub24tYmxvY2tpbmcgY2hlY2sgaW4KICBjb25maWd1cmUgbWFkZSBsaWJjdXJsIHVzZSBibG9ja2luZyBzb2NrZXRzIG9uIEFJWCA0IGFuZCA1LCB3aGlsZSB0aGF0CiAgd2Fzbid0IHRoZSBpbnRlbnRpb24uCgpEYW5pZWwgUyAoMjkgSnVseSAyMDA3KQotIEpheWVzaCBBIFNoYWggZmlsZWQgYnVnIHJlcG9ydCAjMTc1OTU0MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU5NTQyKSBpZGVudGlmeWluZyBhIHJhdGhlciBzZXJpb3VzCiAgcHJvYmxlbSB3aXRoIEZUUFM6IGxpYmN1cmwgY2xvc2VkIHRoZSBkYXRhIGNvbm5lY3Rpb24gc29ja2V0IGFuZCB0aGVuIGxhdGVyCiAgaW4gdGhlIGZsb3cgaXQgd291bGQgY2FsbCB0aGUgU1NMIGxheWVyIHRvIGRvIFNTTCBzaHV0ZG93biB3aGljaCB0aGVuIHdvdWxkCiAgdXNlIGEgc29ja2V0IHRoYXQgaGFkIGFscmVhZHkgYmVlbiBjbG9zZWQgLSBzbyBpZiB0aGUgYXBwbGljYXRpb24gaGFkIG9wZW5lZAogIGEgbmV3IG9uZSBpbiB0aGUgbWVhbiB0aW1lLCBsaWJjdXJsIGNvdWxkIHNlbmQgZ2liYmVyaXNoIHRoYXQgd2F5ISBJIHdvcmtlZAogIHdpdGggR3JlZyBaYXZlcnRuaWsgdG8gcHJvcGVybHkgZGlhZ25vc2UgYW5kIGZpeCB0aGlzLiBUaGUgZml4IGFmZmVjdHMgY29kZQogIGZvciBhbGwgU1NMIGxpYnJhcmllcyB3ZSBzdXBwb3J0LCBidXQgaXQgaGFzIG9ubHkgYmVlbiB0cnVseSB2ZXJpZmllZCB0bwogIHdvcmsgZmluZSBmb3IgdGhlIE9wZW5TU0wgdmVyc2lvbi4gVGhlIG90aGVycyBoYXZlIG9ubHkgYmVlbiBjb2RlIHJldmlld2VkLgoKRGFuaWVsIFMgKDIzIEp1bHkgMjAwNykKLSBJbXBsZW1lbnRlZCB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBzdXBwb3J0IGZvciB0aGUgT1MvNDAwIFNlY3VyZSBTb2NrZXRzIExheWVyIGxpYnJhcnkuCgpEYW4gRiAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIG9ubHkgdGhlIHBhcnRzIG9mIFBhdHJpY2sgTW9ubmVyYXQncyBPUy80MDAgcGF0Y2ggdGhhdCByZW5hbWVkCiAgc29tZSBmZXcgaW50ZXJuYWwgaWRlbnRpZmllcnMgdG8gYXZvaWQgY29uZmxpY3RzLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwgb24KICBvdGhlciBwbGF0Zm9ybXMuCgpEYW5pZWwgUyAoMjIgSnVseSAyMDA3KQotIEhUVFAgRGlnZXN0IGJ1ZyBmaXggYnkgQ2hyaXMgRmxlcmFja2VyczoKCiAgU2NlbmFyaW8KCiAgLSBQZXJmb21pbmcgYSBQT1NUIHJlcXVlc3Qgd2l0aCBib2R5CiAgLSBXaXRoIGF1dGhlbnRpY2F0aW9uIChvbmx5IERpZ2VzdCkKICAtIFJlLXVzaW5nIGEgY29ubmVjdGlvbgoKICBsaWJjdXJsIHdvdWxkIHNlbmQgYSBIVFRQIFBPU1Qgd2l0aCBhbiBBdXRob3JpemF0aW9uIGhlYWRlciBidXQgd2l0aG91dAogIGJvZHkuIE91ciBzZXJ2ZXIgd291bGQgcmV0dXJuIDQwMCBCYWQgUmVxdWVzdCBpbiB0aGF0IGNhc2UgKGJlY2F1c2UKICBhdXRoZW50aWNhdGlvbiBwYXNzZWQsIGJ1dCB0aGUgYm9keSB3YXMgZW1wdHkpLgoKICBDYXVzZQoKICAxKSBodHRwX2RpZ2VzdC5jIC0+IEN1cmxfb3V0cHV0X2RpZ2VzdAogIC0gVXBkYXRlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCAqb25seSogaWYgZC0+bm9uY2UgaXMKICBmaWxsZWQgaW4gKGFuZCBubyBlcnJvcnMpCiAgLSBhdXRocC0+ZG9uZSA9IFRSVUUgaWYgZC0+bm9uY2UgaXMgZmlsbGVkIGluCiAgMikgaHR0cC5jIC0+IEN1cmxfaHR0cAogIC0gKkFsd2F5cyogdXNlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCBpZiBub3QgTlVMTAogIDMpIGh0dHAuYyAtPiBDdXJsX2h0dHAsIEN1cmxfaHR0cF9vdXRwdXRfYXV0aAoKICBTbyB3aGF0IGhhcHBlbnMgaXMgdGhhdCBDdXJsX291dHB1dF9kaWdlc3QgY2Fubm90IHlldCB1cGRhdGUgdGhlCiAgQXV0aG9yaXphdGlvbiBoZWFkZXIgKGFsbG9jcHRyLnVzZXJwd2QpIHdoaWNoIHJlc3VsdHMgaW4gYXV0aGhvc3QtPmRvbmU9MCAtPgogIGF1dGhob3N0LT5tdWx0aT0xIC0+IGNvbm4tPmJpdHMuYXV0aG5lZyA9IFRSVUUuICBUaGUgYm9keSBpcyBub3QKICBhZGRlZC4gKkhvd2V2ZXIqLCBhbGxvY3B0ci51c2VycHdkIGlzIHN0aWxsIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgcmVxdWVzdAoKLSBBZGRlZCB0ZXN0IGNhc2UgMzU0IHRoYXQgbWFrZXMgYSBzaW1wbGUgRlRQIHJldHJpZXZhbCB3aXRob3V0IHBhc3N3b3JkLCB3aGljaAogIHZlcmlmaWVzIHRoZSBidWcgZml4IGluICMxNzU3MzI4LgoKRGFuaWVsIFMgKDIxIEp1bHkgMjAwNykKLSBUbyBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5IGluIEZUUCB0ZXN0IGNhc2VzLCBJJ3ZlIHJlbW92ZWQgdGhlIGVuZm9yY2VkIHN0YXRlcwogIGZyb20gdGhlIHRlc3Qgc2VydmVyIGNvZGUgYXMgdGhleSBzZXJ2ZWQgbm8gcmVhbCBwdXJwb3NlLiBUaGUgdGVzdCBzZXJ2ZXIKICBpcyBoZXJlIHRvIHNlcnZlIGZvciB0aGUgdGVzdCBjYXNlcywgbm90IHRvIGF0dGVtcHQgdG8gZnVuY3Rpb24gYXMgYSByZWFsCiAgc2VydmVyISBXaGlsZSBhdCBpdCwgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMTQxIHRvIGJldHRlciB0ZXN0IGFuZCB2ZXJpZnkKICBjdXJsIC1JIG9uIGEgc2luZ2xlIEZUUCBmaWxlLgoKRGFuaWVsIFMgKDIwIEp1bHkgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGZpeGVkIHRoZSBTRlRQIFBXRCBjb21tYW5kIHRvIHdvcmsuCgotIFJhbGYgUy4gRW5nZWxzY2hhbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTc1NzMyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU3MzI4KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2guIEl0CiAgdHVybnMgb3V0IHdlIGJyb2tlIGxvZ2luIHRvIEZUUCBzZXJ2ZXJzIHRoYXQgZG9uJ3QgcmVxdWlyZSAobm9yIHVuZGVyc3RhbmQpCiAgUEFTUyBhZnRlciB0aGUgVVNFUiBjb21tYW5kLiBUaGUgYnJlYWthZ2Ugd2FzIGRvbmUgYXMgcGFydCBvZiB0aGUga3JiNQogIGNvbW1pdCBzbyBhIGtyYi11c2luZyBwZXJzb24gbmVlZHMgdG8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBub3cKICB3b3JrcyBvciBpZiB3ZSBuZWVkIHRvIGZpeCBpdCAoaW4gYSBkaWZmZXJlbnQgd2F5IG9mIGNvdXJzZSkuCgpEYW4gRiAoMTcgSnVseSAyMDA3KQotIEZpeGVkIHRlc3QgY2FzZXMgNjEzIGFuZCA2MTQgYnkgaW1wcm92aW5nIHRoZSBsb2cgcG9zdHByb2Nlc3NvciB0byBoYW5kbGUKICBhIG5ldyBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXQgdGhhdCBuZXdlciBsaWJzc2gyJ3MgY2FuIHByb3ZpZGUuICBUaGlzCiAgaXMgcHJvYmFibHkgTk9UIHN1ZmZpY2llbnQgdG8gaGFuZGxlIGFsbCBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXRzIHRoYXQKICBzZXJ2ZXIncyBjYW4gcHJvdmlkZSwgYW5kIHNob3VsZCBiZSByZXZpc2l0ZWQuCgpEYW5pZWwgUyAoMTcgSnVseSAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIGEgYnVnIGluIGhvdyBsaWJzc2gyX3Nlc3Npb25fbGFzdF9lcnJvcigpIHdhcyB1c2VkLCBpbgogIHR3byBwbGFjZXMuCgotIEpvZmVsbCBHYWxsYXJkbyBwb3N0ZWQgYSBsaWJjdXJsIGxvZyB1c2luZyBGVFAgdGhhdCBleHBvc2VkIGEgYnVnIHdoaWNoIG1hZGUKICBhIGNvbnRyb2wgY29ubmVjdGlvbiB0aGF0IHdhcyBkZWVtZWQgImRlYWQiIHRvIHlldCBiZSByZS11c2VkIGluIGEgZm9sbG93aW5nCiAgcmVxdWVzdC4KCkRhbmllbCBTICgxMyBKdWx5IDIwMDcpCi0gQ29saW4gSG9nYmVuIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NTAyNzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1MDI3NCkgYW5kIHN1Ym1pdHRlZCBhIHBhdGNoIGZvciB0aGUKICBjYXNlIHdoZXJlIGxpYmN1cmwgZGlkIGEgY29ubmVjdCBhdHRlbXB0IHRvIGEgbm9uLWxpc3RlbmluZyBwb3J0IGFuZCBkaWRuJ3QKICBwcm92aWRlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nIGJhY2suCgotIERhbmllbCBDYXRlciBmaXhlczoKICAxIC0gbWFkZSAnbWFrZSB2YzgnIHdvcmsgb24gd2luZG93cy4KICAyIC0gbWFkZSBsaWJjdXJsIGl0c2VsZiBidWlsdCB3aXRoIENVUkxfTk9fT0xESUVTIGRlZmluZWQgKHdoaWNoIGRvZXNuJ3QKICAgICAgZGVmaW5lIHRoZSBzeW1ib2xzIGZvciBiYWNrd2FyZHMgc291cmNlIGNvbXBhdGliaWxpdHkpCiAgMyAtIHVwZGF0ZWQgbGliY3VybC1lcnJvcnMuMwogIDQgLSBhZGRlZCBDVVJMX0RJU0FCTEVfVEZUUCB0byBkb2NzL0lOU1RBTEwKCkRhbmllbCBTICgxMiBKdWx5IDIwMDcpCi0gTWFkZSB0aGUga3JiNSBjb2RlIGJ1aWxkIHdpdGggSGVpbWRhbCdzIEdTU0FQSSBsaWIuCgpEYW4gRiAoMTIgSnVseSAyMDA3KQotIENvbXBpbGUgbW9zdCBvZiB0aGUgZXhhbXBsZSBhcHBzIGluIGRvY3MvZXhhbXBsZXMgd2hlbiBkb2luZyBhICdtYWtlIGNoZWNrJy4KICBGaXhlZCBzb21lIGNvbXBpbGUgd2FybmluZ3MgYW5kIGVycm9ycyBpbiB0aG9zZSBleGFtcGxlcy4KCi0gUmVtb3ZlZCB0aGUgZXhhbXBsZSBwcm9ncmFtIGZ0cDNyZHBhcnR5LmMgc2luY2UgbGliY3VybCBkb2Vzbid0IHN1cHBvcnQKICAzcmQgcGFydHkgRlRQIHRyYW5zZmVycyBhbnkgbG9uZ2VyLgoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBTaG11bGlrIFJlZ2V2IGZvdW5kIGFuIChhbGJlaXQgcmFyZSkgY2FzZSB3aGVyZSB0aGUgcHJveHkgQ09OTkVDVCBvcGVyYXRpb24KICBjb3VsZCBpbiBmYWN0IGdldCBzdHVjayBpbiBhbiBlbmRsZXNzIGxvb3AuCgotIE1hZGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBzZXQgdG8gMSBhY3RzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbjoKICBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlcmUgaXMgbm8gQ29tbW9uIE5hbWUgZmllbGQgZm91bmQgaW4gdGhlIHJlbW90ZSBjZXJ0LgogIFdlIHNob3VsZCBkZXByZWNhdGUgdGhlIHN1cHBvcnQgZm9yIHRoaXMgc2V0IHRvIDEgYW55d2F5IHNvb24sIHNpbmNlIHRoZQogIGZlYXR1cmUgaXMgcG9pbnRsZXNzIGFuZCBtb3N0IGxpa2VseSBuZXZlciByZWFsbHkgdXNlZCBieSBhbnlvbmUuCgpEYW5pZWwgUyAoMTEgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYSBidWcgd2l0aCB0cmFuc2Zlci1lbmNvZGluZyBza2lwcGluZyBkdXJpbmcgdGhlIDQwNwogIGVycm9yIHBhZ2VzIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbi4KCi0gR2lhbmNhcmxvIEZvcm1pY3VjY2lhIHJlcG9ydGVkIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCBhIGNsb3NlZCBjb25uZWN0aW9uCiAgdG8gYSBwcm94eSBkdXJpbmcgQ09OTkVDVCBhdXRoIG5lZ290aWF0aW9uLgoKRGFuIEYgKDEwIEp1bHkgMjAwNykKLSBGaXhlZCBhIGN1cmwgbWVtb3J5IGxlYWsgcmVwb3J0ZWQgYnkgU29uZyBNYSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbgogIG9mIHRoZSBwYXRjaCBoZSBzdWdnZXN0ZWQuICBBZGRlZCBoaXMgdGVzdCBjYXNlIGFzIHRlc3QyODkgdG8gdmVyaWZ5LgoKLSBGb3JjZSB0aGUgdGltZSB6b25lIHRvIEdNVCBpbiB0aGUgY29va2llIHRlc3RzIGluIGNhc2UgdGhlIHVzZXIgaXMKICB1c2luZyBvbmUgb2YgdGhlIHNvLWNhbGxlZCAncmlnaHQnIHRpbWUgem9uZXMgdGhhdCB0YWtlIGludG8gYWNjb3VudAogIGxlYXAgc2Vjb25kcywgd2hpY2ggY2F1c2VzIHRoZSB0ZXN0cyB0byBmYWlsIChhcyByZXBvcnRlZCBieQogIERhbmllbCBCbGFjayBpbiBidWcgcmVwb3J0ICMxNzQ1OTY0KS4KClZlcnNpb24gNy4xNi40ICgxMCBKdWx5IDIwMDcpCgpEYW5pZWwgUyAoMTAgSnVseSAyMDA3KQotIEtlZXMgQ29vayBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA3MDcxMC5odG1sKSBpbiB3aGljaCBsaWJjdXJsIGZhaWxlZCB0bwogIHByb3Blcmx5IHJlamVjdCBzb21lIG91dGRhdGVkIG9yIG5vdCB5ZXQgdmFsaWQgc2VydmVyIGNlcnRpZmljYXRlcyB3aGVuCiAgYnVpbHQgd2l0aCBHbnVUTFMuIEtlZXMgYWxzbyBwcm92aWRlZCB0aGUgcGF0Y2guCgpKYW1lcyBIICg1IEp1bHkgMjAwNykKLSBHYXZyaWUgUGhpbGlwc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCB3aWxsIHVzZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IKICBtZXNzYWdlIGZvciBhbiBzY3A6Ly8gdXBsb2FkIGZhaWx1cmUuICBJZiBsaWJzc2gyIGhhcyBoaXMgbWF0Y2hpbmcKICBwYXRjaCwgdGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm4gYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQgaW5zdGVhZAogIG9mIGEgbW9yZSBnZW5lcmljIGVycm9yLgoKRGFuaWVsIFMgKDEgSnVseSAyMDA3KQotIFRob21hcyBKLiBNb29yZSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBLZXJiZXJvczUgc3VwcG9ydCBpbgogIGxpYmN1cmwuIFRoaXMgYWxzbyBtYWtlcyB0aGUgb3B0aW9ucyBjaGFuZ2UgbmFtZSB0byAtLWtyYiAoZnJvbSAtLWtyYjQpIGFuZAogIENVUkxPUFRfS1JCTEVWRUwgKGZyb20gQ1VSTE9QVF9LUkI0TEVWRUwpIGJ1dCB0aGUgb2xkIG5hbWVzIGFyZSBzdGlsbAoKLSBTb25nIE1hIGhlbHBlZCBtZSB2ZXJpZnkgYW5kIGV4dGVuZCBhIGZpeCBmb3IgZG9pbmcgRlRQIG92ZXIgYSBTT0NLUzQvNQogIHByb3h5LgoKRGFuaWVsIFMgKDI3IEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5OiBBZGQgdHdvIG5ldyBvcHRpb25zIGZvciB0aGUgU0ZUUC9TQ1AvRklMRSBwcm90b2NvbHM6CiAgQ1VSTE9QVF9ORVdfRklMRV9QRVJNUyBhbmQgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TLiBUaGVzZSBjb250cm9sIHRoZQogIHByZW1pc3Npb25zIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3JlYXRlZCBvbiB0aGUgcmVtb3RlCiAgc2VydmVyLiBDVVJMT1BUX05FV19GSUxFX1BFUk1TIGRlZmF1bHRzIHRvIDA2NDQgYW5kCiAgQ1VSTE9QVF9ORVdfRElSRUNUT1JZX1BFUk1TIGRlZmF1bHRzIHRvIDA3NTUKCi0gSSBjb3JyZWN0ZWQgdGhlIDEwLWF0LWEtdGltZS5jIGV4YW1wbGUgYW5kIGFwcGxpZWQgYSBwYXRjaCBmb3IgaXQgYnkgSmFtZXMKICBCdXJzYS4KCkRhbmllbCBTICgyNiBKdW5lIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSByZS1hcnJhbmdlZCB0aGUgaW50ZXJuYWwgaGFzaCBjb2RlIHRvIHdvcmsgd2l0aCBhIGN1c3RvbQogIGhhc2ggZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBoYXNoZXMsIGFuZCBhbHNvIGV4cGFuZGVkIHRoZSBkZWZhdWx0IHNpemUgZm9yCiAgdGhlIHNvY2tldCBoYXNoIHRhYmxlIHVzZWQgaW4gbXVsdGkgaGFuZGxlcyB0byBncmVhdGx5IGVuaGFuY2Ugc3BlZWQgd2hlbgogIHZlcnkgbWFueSBjb25uZWN0aW9ucyBhcmUgYWRkZWQgYW5kIHRoZSBzb2NrZXQgQVBJIGlzIHVzZWQuCgotIEphbWVzIEhvdXNsZXkgbWFkZSB0aGUgQ1VSTE9QVF9GVFBMSVNUT05MWSBtb2RlIHdvcmsgZm9yIFNGVFAgZGlyZWN0b3J5CiAgbGlzdGluZ3MgYXMgd2VsbAoKRGFuaWVsIFMgKDI1IEp1bmUgMjAwNykKLSBBZGp1c3RlZCBob3cgbGliY3VybCB0cmVhdHMgSFRUUCAxLjEgcmVzcG9uc2VzIHdpdGhvdXQgY29udGVudC1sZW50aCBvcgogIGNodW5rZWQgZW5jb2RpbmcgKHRoYXQgYWxzbyBsYWNrcyAiQ29ubmVjdGlvbjogY2xvc2UiKS4gSXQgbm93IHNpbXBseQogIGFzc3VtZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBXSUxMIGJlIGNsb3NlZCB0byBzaWduYWwgdGhlIGVuZCwgYXMgdGhhdCBpcyBob3cKICBSRkMyNjE2IHNlY3Rpb24gNC40IHBvaW50ICM1IHNheXMgd2Ugc2hvdWxkIGJlaGF2ZS4KClZlcnNpb24gNy4xNi4zICgyNSBKdW5lIDIwMDcpCgpEYW5pZWwgUyAoMjMgSnVuZSAyMDA3KQotIEFzIHJlcG9ydGVkIGJ5ICJUcm8iIGluIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTYxLmh0bWwgYW5kCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAyMzguaHRtbCwgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgZG8KICBuby1ib2R5IHJlcXVlc3RzIG9uIEZUUCBmaWxlcyBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5LCBvciBhdCBsZWFzdAogIGl0IGRpZG4ndCBwcm92aWRlIHRoZSBpbmZvIGJhY2sgaW4gdGhlIGhlYWRlciBjYWxsYmFjayBwcm9wZXJseSBpbiB0aGUKICBzdWJzZXF1ZW50IHJlcXVlc3RzLgoKRGFuaWVsIFMgKDIxIEp1bmUgMjAwNykKLSBHZXJyaXQgQnJ1Y2ho5HVzZXIgcG9pbnRlZCBvdXQgYSB3YXJuaW5nIHRoYXQgdGhlIEludGVsKFIpIFRocmVhZCBDaGVja2VyCiAgdG9vbCByZXBvcnRzIGFuZCBpdCB3YXMgaW5kZWVkIGEgbGVnaXRpbWF0ZSBvbmUgYW5kIGl0IGlzIG9uZSBmaXhlZC4gSXQgd2FzCiAgYSB1c2Ugb2YgYSBzaGFyZSB3aXRob3V0IGRvaW5nIHRoZSBwcm9wZXIgbG9ja2luZyBmaXJzdC4KCkRhbmllbCBTICgyMCBKdW5lIDIwMDcpCi0gQWRhbSBQaWdnb3R0IGZpbGVkIGJ1ZyByZXBvcnQgIzE3NDAyNjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc0MDI2MykuIEFkYW0gZGlzY292ZXJlZCB0aGF0IHdoZW4KICBnZXR0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIFVSTHMgd2l0aCBjdXJsLCB0aGV5IHdlcmUgZmV0Y2hlZCBzbG93ZXIgYW5kCiAgc2xvd2VyLi4uIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSB0aGUgLS1saWJjdXJsIGRhdGEgY29sbGVjdGluZyB3aGljaAogIHdyb25nbHkgYWx3YXlzIHdhcyBlbmFibGVkLCBidXQgbm8gbG9uZ2VyIGlzLi4uCgpEYW5pZWwgUyAoMTggSnVuZSAyMDA3KQotIFJvYnNvbiBCcmFnYSBBcmF1am8gZmlsZWQgYnVnIHJlcG9ydCAjMTczOTEwMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzM5MTAwKSB0aGF0IG1lbnRpb25lZCB0aGF0IGxpYmN1cmwKICBjb3VsZCBub3QgYWN0dWFsbHkgbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGEgZ2l2ZW4gRlRQCiAgc2VydmVyIGlmIHRoZSBsb2dpbiBkaXJlY3RvcnkgaXNuJ3Qgcm9vdC4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQKICB0aHJlZSB0ZXN0IGNhc2VzIChvbmUgaXMgZGlzYWJsZWQgZm9yIG5vdyBzaW5jZSBJIGlkZW50aWZpZWQgS05PV05fQlVHUyAjNDQsCiAgd2UgY2Fubm90IHVzZSAtLWZ0cC1tZXRob2Qgbm9jd2QgYW5kIGxpc3QgZnRwIGRpcmVjdG9yaWVzKS4KCkRhbmllbCBTICgxNCBKdW5lIDIwMDcpCi0gU2htdWxpayBSZWdldjoKCiAgSSd2ZSBlbmNvdW50ZXJlZCAoYW5kIGhvcGVmdWxseSBmaXhlZCkgYSBwcm9ibGVtIGludm9sdmluZyBwcm94eSBDT05ORUNUCiAgcmVxdWVzdHMgYW5kIGVhc3kgaGFuZGxlcyBzdGF0ZSBtYW5hZ2VtZW50LiBUaGUgcHJvYmxlbSBpc24ndCBzaW1wbGUgdG8KICByZXByb2R1Y2Ugc2luY2UgaXQgZGVwZW5kcyBvbiBzb2NrZXQgc3RhdGUuIEl0IG9ubHkgbWFuaWZlc3RzIGl0c2VsZiB3aGVuCiAgd29ya2luZyB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLgoKICBIZXJlIGlzIHRoZSBzY2VuYXJpbzoKCiAgMS4gaW4gbXVsdGlfcnVuc2luZ2xlIHRoZSBlYXN5IGhhbmRsZSBpcyBpbiB0aGUgQ1VSTE1fU1RBVEVfV0FJVENPTk5FQ1QgYW5kCiAgY2FsbHMgQ3VybF9wcm90b2NvbF9jb25uZWN0CgogIDIuIGluIEN1cmxfcHJveHlDT05ORUNULCBsaW5lIDEyNDcsIGlmIHRoZSBzb2NrZXQgaXNuJ3QgcmVhZHkgdGhlIGZ1bmN0aW9uCiAgcmV0dXJucyBhbmQgY29ubi0+Yml0cy50dW5uZWxfY29ubmVjdGluZyBpcyBUUlVFCgogIDMuIHdoZW4gdGhlIGNhbGwgdG8gQ3VybF9wcm90b2NvbF9jb25uZWN0IHJldHVybnMgdGhlIHByb3RvY29sX2Nvbm5lY3QgZmxhZwogIGlzIGZhbHNlIGFuZCB0aGUgZWFzeSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIENVUkxNX1NUQVRFX1BST1RPQ09OTkVDVCB3aGljaAogIGlzbid0IGNvcnJlY3QgaWYgYSBwcm94eSBpcyB1c2VkLiAgUmF0aGVyIENVUkxNX1NUQVRFX1dBSVRQUk9YWUNPTk5FQ1QKICBzaG91bGQgYmUgdXNlZC4KCiAgSSBkaXNjb3ZlcmVkIHRoaXMgd2hpbGUgcGVyZm9ybWluZyBhbiBIVFRQUyByZXF1ZXN0IHRocm91Z2ggYSBwcm94eSAoc3F1aWQpCiAgb24gbXkgbG9jYWwgbmV0d29yay4gVGhlIHByb2JsZW0gY2F1c2VkIG9wZW5zc2wgdG8gZmFpbCBhcyBpdCByZWFkIHRoZSBwcm94eQogIHJlc3BvbnNlIHRvIHRoZSBDT05ORUNUIGNhbGwgKCdIVFRQLzEuMCBFc3RhYmxpc2hlZCcpIHJhdGhlciB0aGFuIHRoZSBTU0wKICBoYW5kc2hha2UgKHRoZSBleGFjdCBvcGVuc3NsIGVycm9yIHdhcyAnd3Jvbmcgc3NsIHZlcnNpb24nIGJ1dCB0aGlzIGlzbid0CiAgdmVyeSBpbXBvcnRhbnQpCgotIERhdmUgVmFzaWxldnNreSBmaWxlZCBidWcgcmVwb3J0ICMxNzM2ODc1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzY4NzUpIGFsbW9zdCBzaW11bHRhbm91ZXNseSBhcyBEYW4KICBGYW5kcmljaCBtZW50aW9uZWQgYSByZWxhdGVkIGJ1aWxkIHByb2JsZW0gb24gdGhlIGxpYmN1cmwgbWFpbGluZyBsaXN0OgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTMxLmh0bWwuIEJvdGggcHJvYmxlbXMgaGFkIHRoZSBzYW1lCiAgcmVhc29uOiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIFBPTEwqIGRlZmluZXMgYW5kIHRoZSBwb2xsZmQgc3RydWN0IGluIHRoZQogIGxpYmN1cmwgY29kZSB3YXMgZGVwZW5kaW5nIG9uIEhBVkVfUE9MTCBpbnN0ZWFkIG9mIEhBVkVfU1lTX1BPTExfSC4KCkRhbmllbCBTICgxMyBKdW5lIDIwMDcpCi0gVG9tIFJlZ25lciBwcm92aWRlZCBhIHBhdGNoIGFuZCB3b3JrZWQgdG9nZXRoZXIgd2l0aCBKYW1lcyBIb3VzbGV5LCBzbyBub3cKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIHdvcmtzIGZvciBTRlRQIGNvbm5lY3Rpb25zIGFzIHdlbGwgYXMgRlRQCiAgb25lcy4KCi0gUmljaCBSYXVlbnphaG4gZmlsZWQgYnVnIHJlcG9ydCAjMTczMzExOQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzMzMTE5KSBhbmQgd2UgY29sbGFib3JhdGVkIG9uIHRoZQogIGZpeC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgZm9yIDY0Yml0IEhQVVggYnVpbGRzLCBzZXZlcmFsIHNvY2tldC1yZWxhdGVkCiAgZnVuY3Rpb25zIHdvdWxkIHN0aWxsIGFzc3VtZSBpbnQgKDMyIGJpdCkgYXJndW1lbnRzIGFuZCBub3Qgc29ja2xlbl90ICg2NAogIGJpdCkgb25lcy4KCkRhbmllbCBTICgxMiBKdW5lIDIwMDcpCi0gSmFtZXMgSG91c2xleSBicm91Z2h0IGhpcyByZXZhbXBlZCBTU0ggY29kZSB0aGF0IGlzIHN0YXRlLW1hY2hpbmUgZHJpdmVuIHRvCiAgcmVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBub3cgdG90YWxseSBub24tYmxvY2tpbmcgbGlic3NoMiAoaW4gQ1ZTKS4KCkRhbiBGICg4IEp1bmUgMjAwNykKLSBJbmNvcnBvcmF0ZWQgRGFuaWVsIEJsYWNrJ3MgdGVzdDcwNiBhbmQgdGVzdDcwNyBTT0NLUyB0ZXN0IGNhc2VzLgoKLSBGaXhlZCBhIGZldyBwcm9ibGVtcyB3aGVuIHN0YXJ0aW5nIHRoZSBTT0NLUyBzZXJ2ZXIuCgotIFJldmVydGVkIHNvbWUgcmVjZW50IGNoYW5nZXMgdG8gcnVudGVzdHMucGwgdGhhdCB3ZXJlbid0IGNvbXBhdGlibGUgd2l0aAogIHBlcmwgNS4wLgoKLSBGaXhlZCB0aGUgdGVzdCBoYXJuZXNzIHNvIHRoYXQgaXQgYWN0dWFsbHkga2lsbHMgdGhlIHNzaCBiZWluZyB1c2VkIGFzCiAgdGhlIFNPQ0tTIHNlcnZlci4KCkRhbmllbCBTICg2IEp1bmUgMjAwNykKLSAtcy8tLXNpbGVudCBjYW4gbm93IGJlIHVzZWQgdG8gdG9nZ2xlIG9mZiB0aGUgc2lsZW5jZSBhZ2FpbiBpZiB1c2VkIGEgc2Vjb25kCiAgdGltZS4KCkRhbmllbCBTICg1IEp1bmUgMjAwNykKLSBBZGRlZCBEYW5pZWwgQmxhY2sncyB3b3JrIHRoYXQgYWRkcyB0aGUgZmlyc3QgZmV3IFNPQ0tTIHRlc3QgY2FzZXMuIEkgYWxzbwogIGZpeGVkIHR3byBtaW5vciBTT0NLUyBwcm9ibGVtcyB0byBtYWtlIHRoZSB0ZXN0IGNhc2VzIHJ1biBmaW5lLgoKRGFuaWVsIFMgKDMxIE1heSAyMDA3KQotIEZlbmcgVHUgbWFkZSAobGliKWN1cmwgc3VwcG9ydCAidXBsb2FkIiByZXN1bWluZyB3b3JrIGZvciBmaWxlOi8vIFVSTHMuCgpEYW5pZWwgUyAoMzAgTWF5IDIwMDcpCi0gSSBtb2RpZmllZCB0aGUgMTAtYXQtYS10aW1lLmMgZXhhbXBsZSB0byB0cmFuc2ZlciA1MDAgZG93bmxvYWRzIGluIHBhcmFsbGVsCiAgd2l0aCBhIGMtYXJlcyBlbmFibGVkIGJ1aWxkIG9ubHkgdG8gZmluZCB0aGF0IGl0IGNyYXNoZWQgbWlzZXJhYmx5LCBhbmQgdGhpcwogIHdhcyBkdWUgdG8gc29tZSBzZWxlY3QoKWlzbXMgbGVmdCBpbiB0aGUgY29kZS4gVGhpcyB3YXMgZHVlIHRvIEFQSQogIHJlc3RyaWN0aW9ucyBpbiBjLWFyZXMgMS4zLngsIGJ1dCB3aXRoIHRoZSB1cGNvbWluZyBjLWFyZXMgMS40LjAgdGhpcyBpcyBubwogIGxvbmdlciB0aGUgY2FzZSBzbyBub3cgbGliY3VybCBydW5zIG11Y2ggYmV0dGVyIHdpdGggYy1hcmVzIGFuZCB0aGUgbXVsdGkKICBpbnRlcmZhY2Ugd2l0aCA+IDEwMjQgZmlsZSBkZXNjcmlwdG9ycyBpbiB1c2UuCgogIEV4dHJhIG5vdGU6IHN0YXJ0aW5nIG5vdyB3ZSByZXF1aXJlIGMtYXJlcyAxLjQuMCBmb3IgYXN5bmNocm9ub3VzIG5hbWUKICByZXNvbHZlcy4KCi0gQWRkZWQgQ1VSTE1PUFRfTUFYQ09OTkVDVFMgd2hpY2ggaXMgYSBjdXJsX211bHRpX3NldG9wdCgpIG9wdGlvbiBmb3Igc2V0dGluZwogIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbm5lY3Rpb24gY2FjaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtdWx0aSBoYW5kbGUuCgpEYW5pZWwgUyAoMjcgTWF5IDIwMDcpCi0gV2hlbiB3b3JraW5nIHdpdGggYSBwcm9ibGVtIFN0ZWZhbiBCZWNrZXIgaGFkLCBJIGZvdW5kIGFuIG9mZi1ieS1vbmUgYnVmZmVyCiAgb3ZlcndyaXRlIGluIEN1cmxfc2VsZWN0KCkuIFdoaWxlIGZpeGluZyBpdCwgSSBhbHNvIGltcHJvdmVkIGl0cyBwZXJmb3JtYW5jZQogIHNvbWV3aGF0IGJ5IGNoYW5naW5nIGNhbGxvYyB0byBtYWxsb2MgYW5kIGJyZWFraW5nIG91dCBvZiBhIGxvb3AgZWFybGllcgogICh3aGVuIHBvc3NpYmxlKS4KCkRhbmllbCBTICgyNSBNYXkgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBmaXhlZCBidWcgIzE3MDU4MDIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNTgwMiksIHdoaWNoIHdhcyBmaWxlZCBieSBEYW5pZWwKICBCbGFjayBpZGVudGlmeWluZyBzZXZlcmFsIEZUUC1TU0wgdGVzdCBjYXNlcyBmYWlsIHdoZW4gd2UgYnVpbGQgbGliY3VybCB3aXRoCiAgTlNTIGZvciBUTFMvU1NMLiBMaXN0ZWQgYXMgIzQyIGluIEtOT1dOX0JVR1MuCgpEYW5pZWwgUyAoMjQgTWF5IDIwMDcpCi0gU29uZyBNYSBmaWxlZCBidWcgcmVwb3J0ICMxNzI0MDE2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjQwMTYpIG5vdGljaW5nIHRoYXQgZG93bmxvYWRpbmcKICBnbG9iLXJhbmdlcyBmb3IgVEZUUCB3YXMgYnJva2VuIGluIENWUy4gRml4ZWQgbm93LgoKLSAnbXl0eCcgaW4gYnVnIHJlcG9ydCAjMTcyMzE5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyMzE5NCkKICBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXJuZigpIGZ1bmN0aW9uIGluIHRoZSBjdXJsIHRvb2wgZGlkbid0IHByb3Blcmx5IGRlYWwKICB3aXRoIHRoZSBjYXNlcyB3aGVuIGV4Y2Vzc2l2ZWx5IGxvbmcgd29yZHMgd2VyZSB1c2VkIGluIHRoZSBzdHJpbmcgdG8gY2hvcAogIHVwLgoKRGFuaWVsIFMgKDIyIE1heSAyMDA3KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyB0aGUKICBwZWVyJ3MgbmFtZSBpbiB0aGUgU1NMIGNlcnRpZmljYXRlIHdoZW4gYnVpbHQgZm9yIE9wZW5TU0wuIFRoZSBsZWFrIGhhcHBlbnMKICBmb3IgbGliY3VybHMgd2l0aCBDVVJMX0RPRVNfQ09OVkVSU0lPTlMgZW5hYmxlZCB0aGF0IGZhaWwgdG8gY29udmVydCB0aGUgQ04KICBuYW1lIGZyb20gVVRGOC4gSGUgYWxzbyBmaXhlZCBhIGxlYWsgd2hlbiBQS0NTICMxMiBwYXJzaW5nIGZhaWxlZC4KCkRhbmllbCBTICgxOCBNYXkgMjAwNykKLSBGZW5nIFR1IHJlcG9ydGVkIHRoYXQgY3VybCAtdyBkaWQgd3Jvbmcgb24gVEZUUCB0cmFuc2ZlcnMgaW4gYnVnIHJlcG9ydAogICMxNzE1Mzk0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzE1Mzk0KSwgYW5kIHRoZQogIHRyYW5zZmVyLXJlbGF0ZWQgaW5mbyAidmFyaWFibGVzIiB3ZXJlIGluZGVlZCBvdmVyd3JpdHRlbiB3aXRoIHplcm9lcwogIHdyb25nbHkgYW5kIGhhdmUgbm93IGJlZW4gYWRqdXN0ZWQuIFRoZSB1cGxvYWQgc2l6ZSBzdGlsbCBpc24ndCBhY2N1cmF0ZS4KCkRhbmllbCBTICgxNyBNYXkgMjAwNykKLSBGZW5nIFR1IHBvaW50ZWQgb3V0IGEgZGl2aXNpb24gYnkgemVybyBlcnJvciBpbiB0aGUgVEZUUCBjb25uZWN0IHRpbWVvdXQKICBjb2RlIGZvciB0aW1lb3V0cyBsZXNzIHRoYW4gZml2ZSBzZWNvbmRzLCBhbmQgYWxzbyBwcm92aWRlZCBhIGZpeCBmb3IgaXQuCiAgQnVnIHJlcG9ydCAjMTcxNTM5MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5MikKCkRhbiBGICgxNiBNYXkgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGZvciBjb21waWxpbmcgdW5kZXIgTWluaXggMy4xLjMgdXNpbmcgQUNLLgoKRGFuIEYgKDE0IE1heSAyMDA3KQotIEFkZGVkIFNGVFAgZGlyZWN0b3J5IGxpc3RpbmcgdGVzdCBjYXNlIDYxMy4KCi0gQWRkZWQgc3VwcG9ydCBmb3IgcXVvdGUgY29tbWFuZHMgYmVmb3JlIGEgdHJhbnNmZXIgdXNpbmcgU0ZUUCBhbmQgdGVzdAogIGNhc2UgNjE0LgoKLSBDaGFuZ2VkIHRoZSBwb3N0LXF1b3RlIGNvbW1hbmRzIHRvIG9jY3VyIGFmdGVyIHRoZSB0cmFuc2ZlcnJlZCBmaWxlIGlzCiAgY2xvc2VkLgoKLSBBbGxvdyBTRlRQIHF1b3RlIGNvbW1hbmRzIGNobW9kLCBjaG93biwgY2hncnAgdG8gc2V0IGEgdmFsdWUgb2YgMC4KCkRhbiBGICg5IE1heSAyMDA3KQotIEtyaXN0aWFuIEd1bnN0b25lIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSBvdmVyd3JpdGluZyBhbiB1cGxvYWRlZCBmaWxlIHdpdGgKICBzZnRwIGRpZG4ndCB0cnVuY2F0ZSBpdCBmaXJzdCwgd2hpY2ggd291bGQgY29ycnVwdCB0aGUgZmlsZSBpZiB0aGUgbmV3CiAgZmlsZSB3YXMgc2hvcnRlciB0aGFuIHRoZSBvbGQuCgpEYW4gRiAoOCBNYXkgMjAwNykKLSBBZGRlZCBGVFBTIHRlc3QgY2FzZXMgNDA2IGFuZCA0MDcKCkRhbmllbCBTICg4IE1heSAyMDA3KQotIENVUkxFX0ZUUF9DT1VMRE5UX1NUT1JfRklMRSBpcyBub3cga25vd24gYXMgQ1VSTEVfVVBMT0FEX0ZBSUxFRC4gVGhpcyBpcwogIGJlY2F1c2UgSSBqdXN0IG1hZGUgU0NQIHVwbG9hZHMgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhlIGZpbGUgc2l6ZSBvZgogIHRoZSB1cGxvYWQgZmlsZSBpc24ndCBnaXZlbiB3aXRoIENVUkxPUFRfSU5GSUxFU0laRSouIERvY3MgdXBkYXRlZCB0bwogIHJlZmxlY3QgdGhpcyBuZXdzLCBhbmQgYSBkZWZpbmUgZm9yIHRoZSBvbGQgbmFtZSB3YXMgYWRkZWQgdG8gdGhlIHB1YmxpYwogIGhlYWRlciBmaWxlLgoKRGFuaWVsIFMgKDcgTWF5IDIwMDcpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBidWcgaW4gdGhlIG11bHRpIGhhbmRsZSBjb2RlIHRoYXQgbWFkZSB0aGUgY29ubmVjdGlvbgogIGNhY2hlIGdyb3cgYSBiaXQgdG9vIG11Y2gsIGJleW9uZCB0aGUgbm9ybWFsIDQgKiBlYXN5X2hhbmRsZXMuCgpEYW5pZWwgUyAoMiBNYXkgMjAwNykKLSBBbmRlcnMgR3VzdGFmc3NvbiByZW1hcmtlZCB0aGF0IHJlcXVpcmluZyBDVVJMT1BUX0hUVFBfVkVSU0lPTiBzZXQgdG8gMS4wCiAgd2hlbiBDVVJMT1BUX0hUVFAyMDBBTElBU0VTIGlzIHVzZWQgdG8gYXZvaWQgdGhlIHByb2JsZW0gbWVudGlvbmVkIGJlbG93IGlzCiAgbm90IHZlcnkgbmljZSBpZiB0aGUgY2xpZW50IHdhbnRzIHRvIGJlIGFibGUgdG8gdXNlIF9laXRoZXJfIGEgSFRUUCAxLjEKICBzZXJ2ZXIgb3Igb25lIHdpdGhpbiB0aGUgYWxpYXNlcyBsaXN0Li4uIHNvIHN0YXJ0aW5nIG5vdywgbGliY3VybCB3aWxsCiAgc2ltcGx5IGNvbnNpZGVyIDIwMC1hbGlhcyBtYXRjaGVzIHRoZSB0byBiZSBIVFRQIDEuMCBjb21wbGlhbnQuCgotIFRvYmlhcyBSdW5kc3Ry9m0gcmVwb3J0ZWQgYSBwcm9ibGVtIHRoZXkgZXhwZXJpZW5jZWQgd2l0aCB4bW1zMiBhbmQgcmVjZW50CiAgbGliY3VybHMsIHdoaWNoIHR1cm5lZCBvdXQgdG8gYmUgdGhlIDI1LW5vdi0yMDA2IGNoYW5nZSB3aGljaCB0cmVhdHMgSFRUUAogIHJlc3BvbnNlcyB3aXRob3V0IENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQgZW5jb2RpbmcgYXMgd2l0aG91dCBib2RpZXMuIFdlCiAgbm93IGFkZGVkIHRoZSBjb25kaXRpb25hbCB0aGF0IHRoZSBhYm92ZSBtZW50aW9uZWQgcmVzcG9uc2UgaXMgb25seSB3aXRob3V0CiAgYm9keSBpZiB0aGUgcmVzcG9uc2UgaXMgSFRUUCAxLjEuCgotIEplZmYgUG9obG1leWVyIGltcHJvdmVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIHRvIHVzZSB0aGUKICBDVVJMTU9QVF9USU1FUkZVTkNUSU9OIGNhbGxiYWNrIG9wdGlvbi4KCi0gU2V0IHRoZSB0aW1lb3V0IGZvciBlYXN5IGhhbmRsZXMgdG8gZXhwaXJlIHJlYWxseSBzb29uIGFmdGVyIGFkZGl0aW9uIG9yCiAgd2hlbiBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaXMgcmV0dXJuZWQgZnJvbSBjdXJsX211bHRpX3NvY2tldCovcGVyZm9ybSwKICB0byBtYWtlIGFwcGxpY2F0aW9ucyB1c2luZyBvbmx5IGN1cmxfbXVsdGlfc29ja2V0KCkgdG8gcHJvcGVybHkgZnVuY3Rpb24KICB3aGVuIGFkZGluZyBlYXN5IGhhbmRsZXMgIm9uIHRoZSBmbHkiLiBCdWcgcmVwb3J0IGFuZCB0ZXN0IGFwcCBwcm92aWRlZCBieQogIE1pY2hhZWwgV2FsbG5lci4KCkRhbiBGICgzMCBBcHJpbCAyMDA3KQotIEltcHJvdmVkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYWxsb3cgcnVubmluZyB0ZXN0IHNlcnZlcnMgb24gb3RoZXIgdGhhbgogIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVycywgYWxsb3dpbmcgbW9yZSB0aGFuIG9uZSB0ZXN0IHN1aXRlIHRvIHJ1bgogIHNpbXVsdGFuZW91c2x5IG9uIHRoZSBzYW1lIGhvc3QuCgpEYW5pZWwgUyAoMjggQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmaXhlZCBsaWJjdXJsIHRvIG5vdCBpbml0IEdudVRMUyBhcyBlYXJseSBhcyB3ZSBkaWQgYmVmb3JlLAogIHNpbmNlIGl0IHRoZW4gaW5pdHMgbGliZ2NyeXB0IGFuZCBsaWJnY3J5cHQgaXMgYmVpbmcgZXZpbCBhbmQgRVhJVFMgdGhlCiAgYXBwbGljYXRpb24gaWYgaXQgZmFpbHMgdG8gZ2V0IGEgZmluZSByYW5kb20gc2VlZC4gVGhhdCdzIHJlYWxseSBub3QgYSBuaWNlCiAgdGhpbmcgdG8gZG8gYnkgYSBsaWJyYXJ5LgoKLSBGcmFuayBIZW1wZWwgZml4ZWQgYSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgY3Jhc2ggb24gYSBoYW5kbGUgdGhhdCBoYWQKICBiZWVuIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSwgYW5kIHRoZW4gZml4ZWQgYW5vdGhlciBmbGF3IHRoYXQgcHJldmVudGVkCiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHdvcmsgZXZlbiBhZnRlciB0aGUgZmlyc3QgZml4IC0gdGhlIGhhbmRsZSB3YXMKICBzdGlsbCBtYXJrZWQgYXMgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZS4KCkRhbmllbCBTICgyNiBBcHJpbCAyMDA3KQotIFBldGVyIE8nR29ybWFuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIFNDUCBkb3dubG9hZHMgd2hlbiB0aGUgZG93bmxvYWRlZCBmaWxlCiAgd2FzIDE2Mzg1IGJ5dGVzICgxNksrMSkgYW5kIGl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IHByb3Blcmx5IGFsd2F5cyAic3VjawogIG91dCIgYWxsIGRhdGEgZnJvbSBsaWJzc2gyLiBUaGUgZWZmZWN0IGJlaW5nIHRoYXQgbGliY3VybCB3b3VsZCBoYW5nIG9uIHRoZQogIHNvY2tldCB3YWl0aW5nIGZvciBkYXRhIHdoZW4gbGlic3NoMiBoYWQgaW4gZmFjdCBhbHJlYWR5IHJlYWQgaXQgYWxsLi4uCgpEYW4gRiAoMjUgQXByaWwgMjAwNykKLSBBZGRlZCBzdXBwb3J0IGluIHJ1bnRlc3RzLnBsIGZvciAiIW4iIHRlc3QgbnVtYmVycyB0byBkaXNhYmxlIGluZGl2aWR1YWwKICB0ZXN0cy4gIENoYW5nZWQgLXQgdG8gb25seSBrZWVwIGxvZyBmaWxlcyBhcm91bmQgd2hlbiAtayBpcyBzcGVjaWZpZWQsCiAgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgd2l0aG91dCAtdC4KCkRhbmllbCBTICgyNSBBcHJpbCAyMDA3KQotIFNvbmlhIFN1YnJhbWFuaWFuIGJyb3VnaHQgb3VyIGF0dGVudGlvbiB0byBhIHByb2JsZW0gdGhhdCBoYXBwZW5zIGlmIHlvdSBzZXQKICB0aGUgQ1VSTE9QVF9SRVNVTUVfRlJPTSBvciBDVVJMT1BUX1JBTkdFIG9wdGlvbnMgYW5kIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KICBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBpcyBjbG9zZWQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IG9uZSB3aGVuIHlvdSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKS4gSXQgd291bGQgdGhlbiB3cm9uZ2x5IGZyZWUgcmFuZ2UtcmVsYXRlZCBkYXRhIGluIHRoZQogIGNvbm5lY3Rpb24gY2xvc2UgZnVudGlvbi4KCllhbmcgVHNlICgyNSBBcHJpbCAyMDA3KQotIFN0ZXZlIExpdHRsZSBmaXhlZCBjb21waWxhdGlvbiBvbiBWTVMgNjQtYml0IG1vZGUKCkRhbmllbCBTICgyNCBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSB0aGUgJ21hc3Rlcl9idWZmZXInIGdldCBhbGxvY2F0ZWQgZmlyc3Qgb25jZSBpdCBpcwogIGNhbi93aWxsIGJlIHVzZWQgYXMgaXQgdGhlbiBtYWtlcyB0aGUgY29tbW9uIGNhc2VzIHNhdmUgMTZLQiBvZiBkYXRhIGZvciBlYWNoCiAgZWFzeSBoYW5kbGUgdGhhdCBpc24ndCB1c2VkIGZvciBwaXBlbGluaW5nLgoKRGFuIEYgKDIzIEFwcmlsIDIwMDcpCi0gQWRkZWQgPHBvc3RjaGVjaz4gc3VwcG9ydCB0byB0aGUgdGVzdCBoYXJuZXNzLgoKLSBBZGRlZCB0ZXN0cyA2MTAtNjEyIHRvIHRlc3QgbW9yZSBTRlRQIHBvc3QtcXVvdGUgY29tbWFuZHMuCgpEYW5pZWwgUyAoMjIgQXByaWwgMjAwNykKLSBTb25nIE1hJ3Mgd2FybmluZyBpZiAtci8tLXJhbmdlIGlzIGdpdmVuIHdpdGggYSAiYmFkIiByYW5nZSwgYWxzbyBub3RlZCBpbgogIHRoZSBtYW4gcGFnZSBub3cuCgotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDUxNzcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNTE3Nykgd2hlcmUgLS13aXRob3V0LXNzbAogIC0td2l0aC1nbnV0bCBvdXRwdXRzIGEgd2FybmluZyBhYm91dCBTU0wgbm90IGJlaW5nIGVuYWJsZWQgZXZlbiB0aG91Z2ggR251VExTCiAgd2FzIGZvdW5kIGFuZCB1c2VkLgoKRGFuaWVsIFMgKDIxIEFwcmlsIDIwMDcpCi0gRGFuaWVsIEJsYWNrIGZpbGVkIGJ1ZyAjMTcwNDY3NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA0Njc1KSBpZGVudGlmeWluZyBhIGRvdWJsZS1mcmVlCiAgcHJvYmxlbSBpbiB0aGUgU1NMLWRlYWxpbmcgbGF5ZXIsIHRlbGxpbmcgR251VExTIHRvIGZyZWUgTlVMTCBjcmVkZW50aWFscyBvbgogIGNsb3NlZG93biBhZnRlciBhIGZhaWx1cmUgYW5kIGEgYmFkICNpZmRlZiBmb3IgTlNTIHdoZW4gY2xvc2luZyBkb3duIFNTTC4KCllhbmcgVHNlICgyMCBBcHJpbCAyMDA3KQotIFNhdmUgb25lIGNhbGwgdG8gY3VybHhfdHZub3coKSwgd2hpY2ggY2FsbHMgZ2V0dGltZW9mZGF5KCksIGluIGVhY2ggb2YKICBDdXJsX3NvY2tldF9yZWFkeSgpLCBDdXJsX3BvbGwoKSBhbmQgQ3VybF9zZWxlY3QoKSB3aGVuIHRoZXNlIGFyZSBjYWxsZWQKICB3aXRoIGEgemVybyB0aW1lb3V0IG9yIGEgdGltZW91dCB2YWx1ZSBpbmRpY2F0aW5nIGEgYmxvY2tpbmcgY2FsbCBzaG91bGQKICBiZSBwZXJmb3JtZWQuCgpEYW5pZWwgUyAoMTggQXByaWwgMjAwNykKLSBKYW1lcyBIb3VzbGV5IG1hZGUgU0ZUUCB1cGxvYWRzIHVzZSBsaWJzc2gyJ3Mgbm9uLWJsb2NraW5nIEFQSQoKLSBQcmV2ZW50IHRoZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBmcm9tIHVwZGF0aW5nIG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UKICBwZXIgc2Vjb25kLgoKRGFuIEYgKDE3IEFwcmlsIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlcyAyOTYsIDI5NyBhbmQgMjk4IHRvIHRlc3QgLS1mdHAtbWV0aG9kIGhhbmRsaW5nCgpEYW5pZWwgUyAoMTYgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWwgYWRkZWQgY3VybF9tdWx0aV9zb2NrZXRfYWN0aW9uKCkgdG8gbGliY3VybCwgd2hpY2ggaXMgYQogIGZ1bmN0aW9uIHRoYXQgZGVwcmVjYXRlcyB0aGUgY3VybF9tdWx0aV9zb2NrZXQoKSBmdW5jdGlvbi4gVXNpbmcgdGhlIG5ldwogIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiB0ZWxsIGxpYmN1cmwgd2hhdCBhY3Rpb24gdGhhdCB3YXMgZm91bmQgaW4gdGhlCiAgc29ja2V0IHRoYXQgaXQgcGFzc2VzIGluLiBUaGlzIGdpdmVzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYm9vc3QgYXMgaXQKICBhbGxvd3MgbGliY3VybCB0byBhdm9pZCBhIGNhbGwgdG8gcG9sbCgpL3NlbGVjdCgpIGZvciBldmVyeSBjYWxsIHRvCiAgY3VybF9tdWx0aV9zb2NrZXQqKCkuCgogIEkgYWRkZWQgYSBkZWZpbmUgaW4gdGhlIHB1YmxpYyBjdXJsL211bHRpLmggaGVhZGVyIGZpbGUgdGhhdCB3aWxsIG1ha2UgeW91cgogIGV4aXN0aW5nIGFwcGxpY2F0aW9uIGF1dG9tYXRpY2FsbHkgdXNlIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbigpIGluc3RlYWQgb2YKICBjdXJsX211bHRpX3NvY2tldCgpIHdoZW4geW91IHJlY29tcGlsZS4gQnV0IG9mIGNvdXJzZSB5b3UnbGwgZ2V0IGJldHRlcgogIHBlcmZvcm1hbmNlIGlmIHlvdSBhZGp1c3QgeW91ciBjb2RlIG1hbnVhbGx5IGFuZCBhY3R1YWxseSBwYXNzIGluIHRoZQogIGNvcnJlY3QgYWN0aW9uIGJpdG1hc2sgdG8gdGhpcyBmdW5jdGlvbi4KCkRhbmllbCBTICgxNCBBcHJpbCAyMDA3KQotIEpheSBBdXN0aW4gYWRkZWQgIkRIIFBBUkFNRVRFUlMiIHRvIHRoZSBzdHVubmVsLnBlbSBjZXJ0aWZpY2F0ZSBmb3IgdGhlIHRlc3QKICBzdWl0ZSB0byBtYWtlIHN0dW5uZWwgcnVuIGJldHRlciBpbiBzb21lIChtb3N0PykgZW52aXJvbm1lbnRzLgoKRGFuIEYgKDEzIEFwcmlsIDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlcyAyOTQgYW5kIDI5NSB0byB0ZXN0IC0tZnRwLWFjY291bnQgaGFuZGxpbmcKCi0gSW1wcm92ZWQgaGFuZGxpbmcgb2Ygb3V0IG9mIG1lbW9yeSBpbiBmdHAuCgpZYW5nIFRzZSAoMTMgQXByaWwgMjAwNykKLSBGaXggdGVzdCBjYXNlIDUzNCB3aGljaCBzdGFydGVkIHRvIGZhaWwgMjAwNy0wNC0xMyBkdWUgdG8gdGhlIGV4aXN0YW5jZQogIG9mIGEgbmV3IGhvc3Qgb24gdGhlIG5ldCB3aXRoIHRoZSBzYW1lIHNpbGx5IGRvbWFpbiB0aGUgdGVzdCB3YXMgdXNpbmcKICBmb3IgYSBob3N0IHdoaWNoIHdhcyBzdXBwb3NlZCBub3QgdG8gZXhpc3QuCgpEYW5pZWwgUyAoMTIgQXByaWwgMjAwNykKLSBTb25nIE1hIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGlmMmlwIGNvZGUgaWYgeW91IHBhc3MgaW4gYW4gaW50ZXJmYWNlCiAgbmFtZSBsb25nZXIgdGhhbiB0aGUgbmFtZSBmaWVsZCBvZiB0aGUgaWZyZXEgc3RydWN0ICh0eXBpY2FsbHkgNiBieXRlcyksIGFzCiAgdGhlbiBpdCB3b3VsZG4ndCBjbG9zZSB0aGUgdXNlZCBkdW1teSBzb2NrZXQuIEJ1ZyAjMTY5ODk3NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjk4OTc0KQoKVmVyc2lvbiA3LjE2LjIgKDExIEFwcmlsIDIwMDcpCgpZYW5nIFRzZSAoMTAgQXByaWwgMjAwNykKLSBSYXZpIFByYXRhcCBwcm92aWRlZCBzb21lIGZpeGVzIGZvciBIVFRQIHBpcGVsaW5pbmcKCi0gY29uZmlndXJlIHNjcmlwdCB3aWxsIGlnbm9yZSAtLWVuYWJsZS1zc3BpIG9wdGlvbiBmb3Igbm9uLW5hdGl2ZSBXaW5kb3dzLgoKRGFuaWVsIFMgKDkgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIGRpZCBzc2guYyBjbGVhbnVwcwoKRGFuaWVsIFMgKDMgQXByaWwgMjAwNykKLSBSb2IgSm9uZXMgZml4ZWQgYmV0dGVyICNpZmRlZidpbmcgZm9yIGEgYnVuY2ggb2YgI2luY2x1ZGUgbGluZXMuCgpEYW5pZWwgUyAoMiBBcHJpbCAyMDA3KQotIE5pY2sgWml0em1hbm4gbWFkZSB0aGUgQ1VSTE9QVF9QT1NUUVVPVEUgb3B0aW9uIHdvcmsgZm9yIFNGVFAgYXMgd2VsbC4gVGhlCiAgYWNjZXB0ZWQgY29tbWFuZHMgYXJlIGFzIGZvbGxvd3M6CgogIGNoZ3JwIChnaWQpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgZ3JvdXAgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAoZ2lkKS4gKGdpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGNobW9kIChwZXJtcykgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYXQgKHBhdGgpIHRvCiAgICAocGVybXMpLiAocGVybXMpIG11c3QgYmUgYSBudW1iZXIgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBjaG1vZCBVbml4CiAgICBjb21tYW5kLgoKICBjaG93biAodWlkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIHVzZXIgSUQgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0byAodWlkKS4gKHVpZCkKICAgIG11c3QgYmUgYSBudW1iZXIuCgogIGxuIChzb3VyY2UpIChkZXN0KQogICAgQ3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgYXQgKGRlc3QpIHRoYXQgcG9pbnRzIHRvIHRoZSBmaWxlIGxvY2F0ZWQgYXQKICAgIChzb3VyY2UpLgoKICBta2RpciAocGF0aCkKICAgIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IGF0IChwYXRoKS4KCiAgcmVuYW1lIChzb3VyY2UpIChkZXN0KQogICAgTW92ZXMgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChzb3VyY2UpIHRvIChkZXN0KS4KCiAgcm0gKHBhdGgpCiAgICBEZWxldGVzIHRoZSBmaWxlIGxvY2F0ZWQgYXQgKHBhdGgpLgoKICBybWRpciAocGF0aCkKICAgIERlbGV0ZXMgdGhlIGRpcmVjdG9yeSBsb2NhdGVkIGF0IChwYXRoKS4gVGhpcyBjb21tYW5kIHdpbGwgcmFpc2UgYW4gZXJyb3IKICAgIGlmIHRoZSBkaXJlY3RvcnkgaXMgbm90IGVtcHR5LgoKICBzeW1saW5rIChzb3VyY2UpIChkZXN0KQogICAgU2FtZSBhcyBsbi4KCkRhbmllbCBTICgxIEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsaSBtYWRlIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIGEgbG90IGZhc3RlciB3aGVuIG1hbnkKICBlYXN5IGhhbmRsZXMgYXJlIGFkZGVkIHRvIGEgbXVsdGkgaGFuZGxlLCBieSBhdm9pZGluZyB0aGUgbG9vcGluZyBvdmVyIGFsbAogIHRoZSBoYW5kbGVzIHRvIGZpbmQgd2hpY2ggb25lIHRvIHJlbW92ZS4KCi0gTWF0dCBLcmFhaSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgY3VybCBidWlsZCBvbiBRTlggNiBmaW5lIGFnYWluLgoKRGFuaWVsIFMgKDMxIE1hcmNoIDIwMDcpCi0gRml4ZWQgc2V2ZXJhbCBtaW5vciBpc3N1ZXMgZGV0ZWN0ZWQgYnkgdGhlIGNvdmVyaXR5LmNvbSBzY2FubmVyLgoKLSAiUGl4ZWwiIGZpeGVkIGEgcHJvYmxlbSB0aGF0IGFwcGVhcmVkIHdoZW4geW91IHVzZWQgLWYgd2l0aCB1c2VyK3Bhc3N3b3JkCiAgZW1iZWRkZWQgaW4gdGhlIFVSTC4KCkRhbiBGICgyOSBNYXJjaCAyMDA3KQotIERvbid0IHRlYXIgZG93biB0aGUgZnRwIGNvbm5lY3Rpb24gaWYgdGhlIG1heGltdW0gZmlsZXNpemUgd2FzIGV4Y2VlZGVkCiAgYW5kIGFkZGVkIHRlc3RzIDI5MCBhbmQgMjkxIHRvIGNoZWNrLgoKLSBBZGRlZCBmdHBzIHVwbG9hZCBhbmQgU1NMIHJlcXVpcmVkIHRlc3RzIDQwMSBhbmQgNDAyLgoKLSBTZW5kIGFuIEVPRiBtZXNzYWdlIGJlZm9yZSBjbG9zaW5nIGFuIFNDUCBjaGFubmVsLCBhcyByZWNvbW1lbmRlZCBieQogIFJGQzQyNTQuIEVuYWJsZSBsaWJzc2gyIHRyYWNpbmcgd2hlbiBzc2ggZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KCllhbmcgVHNlICgyNyBNYXJjaCAyMDA3KQotIEludGVybmFsIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgcmVuYW1lZCB0byBDdXJsX3NvY2tldF9yZWFkeSgpCgogIE5ldyBJbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9uIEN1cmxfc2VsZWN0KCkgYXJvdW5kIHNlbGVjdCAoMiksIGl0CiAgdXNlcyBwb2xsKCkgd2hlbiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZSwgc28gbm93IGxpYmN1cmwgY2FuIGJlCiAgYnVpbHQgd2l0aG91dCBzZWxlY3QoKSBzdXBwb3J0IGF0IGFsbCBpZiBhIGZpbmUgcG9sbCgpIGlzIGF2YWlsYWJsZS4KCkRhbmllbCBTICgyNSBNYXJjaCAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIG11bHRpIGNvZGUgdG8gdHJhdmVyc2UgdGhlIGVhc3kgaGFuZGxlIGxpc3QgcHJvcGVybHkuCiAgQSBsZWZ0LW92ZXIgYnVnIGZyb20gdGhlIEZlYnJ1YXJ5IDIxIGZpeC4KCkRhbiBGICgyMyBNYXJjaCAyMDA3KQotIEFkZGVkIC0tcHVia2V5IG9wdGlvbiB0byBjdXJsIGFuZCBtYWRlIC0ta2V5IGFsc28gd29yayBmb3IgU0NQL1NGVFAsCiAgcGx1cyBtYWRlIC0tcGFzcyB3b3JrIG9uIGFuIFNTSCBwcml2YXRlIGtleSBhcyB3ZWxsLgoKLSBDaGFuZ2VkIHRoZSB0ZXN0IGhhcm5lc3MgdG8gYXR0ZW1wdCB0byBncmFjZWZ1bGx5IHNodXQgZG93biBzZXJ2ZXJzCiAgYmVmb3JlIHJlc29ydGluZyB0byB0aGUga2lsbCAtOSBoYW1tZXIuCgotIEFkZGVkIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHNjcC9zZnRwIHRlc3RzLCB1c2luZwogIE9wZW5TU0ggYXMgdGhlIHNlcnZlci4KCi0gRml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIHNwZWNpZnlpbmcgYSBwcm94eSB3aXRoIGEgZmlsZTogVVJMLgoKWWFuZyBUc2UgKDIwIE1hcmNoIDIwMDcpCi0gRml4ZWQ6IFdoZW4gYSBzaWduYWwgd2FzIGNhdWdodCBhd2FpdGluZyBmb3IgYW4gZXZlbnQgdXNpbmcgQ3VybF9zZWxlY3QoKQogIG9yIEN1cmxfcG9sbCgpIHdpdGggYSBub24temVybyB0aW1lb3V0IGJvdGggZnVuY3Rpb25zIHdvdWxkIHJlc3RhcnQgdGhlCiAgc3BlY2lmaWVkIHRpbWVvdXQuIFRoaXMgY291bGQgZXZlbiBsZWFkIHRvIHRoZSBleHRyZW1lIGNhc2UgdGhhdCBpZiBhCiAgc2lnbmFsIGFycml2ZWQgd2l0aCBhIGZyZWN1ZW5jeSBsb3dlciB0byB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgbmVpdGhlcgogIGZ1bmN0aW9uIHdvdWxkIGV2ZXIgZXhpdC4KCiAgQWRkZWQgZXhwZXJpbWVudGFsIHN5bWJvbCBkZWZpbml0aW9uIGNoZWNrIENVUkxfQUNLTk9XTEVER0VfRUlOVFIgaW4KICBDdXJsX3NlbGVjdCgpIGFuZCBDdXJsX3BvbGwoKS4gV2hlbiBjb21waWxlZCB3aXRoIENVUkxfQUNLTk9XTEVER0VfRUlOVFIKICBkZWZpbmVkIGJvdGggZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgYSBzaWduYWwgaXMgY2F1Z2h0LiBVc2UgaXQKICBhdCB5b3VyIG93biByaXNrLCBhbGwgY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBsaWJyYXJ5IHNob3VsZCBiZQogIHJldmlzaXRlZCBhbmQgY2hlY2tlZCBiZWZvcmUgZnVsbHkgc3VwcG9ydGluZyB0aGlzIGZlYXR1cmUuCgpZYW5nIFRzZSAoMTkgTWFyY2ggMjAwNykKLSBCcnlhbiBIZW5kZXJzb24gZml4ZWQgdGhlIHByb2dyZXNzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGdldCBjYWxsZWQgbW9yZQogIGZyZXF1ZW50bHkgYWxsb3dpbmcgc2FtZSBjYWxsaW5nIGZyZWN1ZW5jeSBmb3IgdGhlIGNsaWVudCBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbiBGICgxNSBNYXJjaCAyMDA3KQotIFZhcmlvdXMgbWVtb3J5IGxlYWtzIHBsdWdnZWQgYW5kIE5VTEwgcG9pbnRlciBmaXhlcyBtYWRlIGluIHRoZSBzc2ggY29kZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNykKLSBOaWNrIG1hZGUgdGhlIGN1cmwgdG9vbCBhY2NlcHQgZ2xvYmJpbmcgcmFuZ2VzIHRoYXQgb25seSBpcyBvbmUgbnVtYmVyLCBpLmUKICB5b3UgY2FuIG5vdyB1c2UgWzEtMV0gd2l0aG91dCBjdXJsIGNvbXBsYWluaW5nLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA3KQotIEV5Z2VuZSBSeWFiaW5raW46CgogIFRoZSBwcm9ibGVtIGlzIHRoZSBmb2xsb3dpbmc6IHdoZW4gd2UncmUgY2FsbGluZyBDdXJsX2RvbmUgYW5kIGl0IGRlY2lkZXMgdG8KICBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW5lZCAoJ2xlZnQgaW50YWN0JyksIHRoZW4gdGhlIGNhbGxlciBpcyBub3Qgbm90aWZpZWQKICB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkb25lIHZpYSB0aGUgTlVMTGlmeWluZyBvZiB0aGUgcG9pbnRlciwgc28gc29tZSBlYXN5CiAgaGFuZGxlIGlzIGtlZXBpbmcgdGhlIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uLgoKICBMYXRlciBDb25uZWN0aW9uRXhpc3RzIGNhbiBzZWxlY3Qgc3VjaCBjb25uZWN0aW9uIGZvciByZXVzZSBldmVuIGlmIHdlJ3JlCiAgbm90IHBpcGVsaW5pbmc6IHBpcGVMZW4gaXMgemVybywgc28gdGhlIChwaXBlTGVuID4gMCAmJiAhY2FuUGlwZWxpbmUpIGlzCiAgZmFsc2UgYW5kIHdlIGNhbiByZXVzZSB0aGlzIGNvbm5lY3Rpb24gZm9yIGFub3RoZXIgZWFzeSBoYW5kbGUuIEJ1dCB0aHVzIHRoZQogIGNvbm5lY3Rpb24gd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0d28gZWFzeSBoYW5kbGVzIGlmIHRoZSBoYW5kbGUgdGhhdCB3YW50cwogIHRvIHRha2UgdGhlIG93bmVyc2hpcCBpcyBub3QgdGhlIHNhbWUgYXMgd2FzIG5vdCBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbgogIHdhcyBkb25lIGluIEN1cmxfZG9uZS4gQW5kIHdoZW4gc29tZSBvZiB0aGVzZSBlYXN5IGhhbmRsZXMgd2lsbCBnZXQgdGhlaXIKICBjb25uZWN0aW9uIHJlYWxseSBmcmVlZCB0aGUgYW5vdGhlciBvbmUgd2lsbCBzdGlsbCBrZWVwIHRoZSBwb2ludGVyLgoKICBNeSBmaXggd2FzIHJhdGhlciB0cml2aWFsOiBJIGp1c3QgYWRkZWQgdGhlIE5VTExpZmljYXRpb24gdG8gdGhlICdlbHNlJwogIGJyYW5jaCBpbiB0aGUgQ3VybF9kb25lLiBNeSB0ZXN0cyB3aXRoIEdpdCBhbmQgRWxlY3RyaWNGZW5jZSBzaG93ZWQgbm8KICBwcm9ibGVtcyBib3RoIGZvciBIVFRQIHB1bGxpbmcgYW5kIGNsb25pbmcuIFJlcG9zaXRvcnkgc2l6ZSBpcyBhYm91dCAyNTAgTWIsCiAgc28gaXQgd2FzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBDdXJsJ3Mgd29yay4KCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFkZCBhIG5ldyAiY3J5cHRvIiBmZWF0dXJlIGNoZWNrIGFuZCB1cGRhdGVkIHRoZQogIGFwcHJvcHJpYXRlIHRlc3QgY2FzZSB0byB1c2UgaXQuICBGb3Igbm93LCB0aGlzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdGhlCiAgIlNTTCIgZmVhdHVyZSBiZWNhdXNlIGN1cmwgZG9lc24ndCBsaXN0IGl0IHNlcGFyYXRlbHkuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIGZvciBJUHY2LgoKLSBSb2JlcnQgQS4gTW9uYXQgaW1wcm92ZWQgdGhlIG1ha2V0Z3ogYW5kIFZDNi84IGdlbmVyYXRpbmcgdG8gc2V0IHRoZSBjb3JyZWN0CiAgbWFjaGluZSB0eXBlIHRvby4KCi0gSnVzdGluIEZsZXRjaGVyIGZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHRyeWluZyB0bwogIHVwbG9hZCBhIGZpbGUgaXQgY291bGRuJ3Qgb3Blbi4gQnVnICMxNjc2NTgxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2NzY1ODEpCgpEYW4gRiAoOSBNYXJjaCAyMDA3KQotIFVwZGF0ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBjaGVjayBmb3IgcHJvdG9jb2wgc3VwcG9ydCBiZWZvcmUgcnVubmluZyBlYWNoCiAgdGVzdCwgZml4aW5nIEtOT1dOX0JVR1MgIzExLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBSZWludHJvZHVjZWQgKGFmdGVyIGEgMyB5ZWFyIGhpYXR1cykgYW4gRlRQUyB0ZXN0IGNhc2UgKDQwMCkgaW50byB0aGUgdGVzdAogIGhhcm5lc3MuICBJdCBpcyB2ZXJ5IGxpbWl0ZWQgYXMgaXQgc3VwcG9ydHMgb25seSBmdHBzOi8vIFVSTHMgd2l0aAogIC0tZnRwLXNzbC1jb250cm9sIHNwZWNpZmllZCwgd2hpY2ggaW1wbGljaXRseSBlbmNyeXB0cyB0aGUgY29udHJvbAogIGNoYW5uZWwgYnV0IG5vdCB0aGUgZGF0YSBjaGFubmVscy4gIFRoYXQgYWxsb3dzIHN0dW5uZWwgdG8gYmUgdXNlZCB3aXRoCiAgYW4gdW5tb2RpZmllZCBmdHAgc2VydmVyIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoYXQgdGhlIHRlc3QgaHR0cHMKICBzZXJ2ZXIgaXMgc2V0IHVwLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBIb25vdXIgLS1mdHAtc3NsLWNvbnRyb2wgb24gZnRwczovLyBVUkxzIHRvIGFsbG93IGVuY3J5cHRlZCBjb250cm9sIGFuZAogIHVuZW5jcnlwdGVkIGRhdGEgY29ubmVjdGlvbnMuCgpEYW4gRiAoNiBNYXJjaCAyMDA3KQotIEZpeGVkIGEgY291cGxlIG9mIGltcHJvcGVyIHBvaW50ZXIgdXNlcyBkZXRlY3RlZCBieSB2YWxncmluZCBpbiB0ZXN0CiAgY2FzZXMgMTgxICYgMjE2LgoKRGFuaWVsICgyIE1hcmNoIDIwMDcpCi0gUm9iZXJ0IEEuIE1vbmF0IGFuZCBTaG11bGlrIFJlZ2V2IGhlbHBlZCBvdXQgdG8gZml4IHRoZSBuZXcgKi9NYWtlZmlsZS52YzgKICBtYWtlZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSByZWxlYXNlIGFyY2hpdmVzLCBnZW5lcmF0ZWQgZnJvbQogIHRoZSBNYWtlZmlsZS52YzYgZmlsZXMgYnkgdGhlIG1ha2V0Z3ogc2NyaXB0LiBJIGFsc28gbW9kaWZpZWQgdGhlIHJvb3QKICBNYWtlZmlsZSB0byBoYXZlIGEgVkMgdmFyaWFibGUgdGhhdCBkZWZhdWx0cyB0byB2YzYgYnV0IGNhbiBiZSBvdmVycmlkZGVuIHRvCiAgYWxsb3cgaXQgdG8gYmUgdXNlZCBmb3IgdmM4IGFzIHdlbGwuIExpa2UgdGhpczoKCiAgICBubWFrZSBWQz12YzggdmMKCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNykKLSBIYW5nIEtpbiBMYXUgZm91bmQgYW5kIGZpeGVkOiBXaGVuIEkgdXNlIGxpYmN1cmwgdG8gY29ubmVjdCB0byBhbiBodHRwcwogIHNlcnZlciB0aHJvdWdoIGEgcHJveHkgYW5kIGhhdmUgdGhlIHJlbW90ZSBodHRwcyBzZXJ2ZXIgcG9ydCBzZXQgdXNpbmcgdGhlCiAgQ1VSTE9QVF9QT1JUIG9wdGlvbiwgcHJvdG9jb2wgZ2V0cyByZXNldCB0byBodHRwIGZyb20gaHR0cHMgYWZ0ZXIgdGhlIGZpcnN0CiAgcmVxdWVzdC4KCiAgVXNlciBkZWZpbmVkIFVSTCB3YXMgbW9kaWZpZWQgaW50ZXJuYWxseSBieSBsaWJjdXJsIGFuZCBzdWJzZXF1ZW50IHJldXNlIG9mCiAgdGhlIGVhc3kgaGFuZGxlIG1heSBsZWFkIHRvIGNvbm5lY3Rpb24gdXNpbmcgYSBkaWZmZXJlbnQgcHJvdG9jb2wgKGlmIG5vdAogIG9yaWdpbmFsbHkgaHR0cCkuCgogIEkgZm91bmQgdGhhdCBsaWJjdXJsIGhhcmRjb2RlZCB0aGUgcHJvdG9jb2wgdG8gImh0dHAiIHdoZW4gaXQgdHJpZXMgdG8KICByZWdlbmVyYXRlIHRoZSBVUkwgaWYgQ1VSTE9QVF9QT1JUIGlzIHNldC4gSSB0cmllZCB0byBmaXggdGhlIHByb2JsZW0gYXMKICBmb2xsb3dzIGFuZCBpdCdzIHdvcmtpbmcgZmluZSBzbyBmYXIKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwNykKLSBBZGFtIEQuIE1vc3MgbWFkZSB0aGUgSFRUUCBDT05ORUNUIHByb2NlZHVyZSBsZXNzIGJsb2NraW5nIHdoZW4gdXNlZCBmcm9tCiAgdGhlIG11bHRpIGludGVyZmFjZS4gTm90ZSB0aGF0IGl0IHN0aWxsIGRvZXMgYSBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIGluIGEKICBibG9ja2luZyBtYW5uZXIuCgpEYW5pZWwgKDIzIEZlYnJ1YXJ5IDIwMDcpCi0gQWRkZWQgd2FybmluZyBvdXRwdXRzIGlmIHRoZSBjb21tYW5kIGxpbmUgdXNlcyBtb3JlIHRoYW4gb25lIG9mIHRoZSBvcHRpb25zCiAgLXYsIC0tdHJhY2UgYW5kIC0tdHJhY2UtYXNjaWksIHNpbmNlIGl0IGNvdWxkIHJlYWxseSBjb25mdXNlIHRoZSB1c2VyLgogIENsYXJpZmllZCB0aGlzIGZhY3QgaW4gdGhlIG1hbiBwYWdlLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA3KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIHdvcmsgb24gbGliY3VybCBtYWtpbmcgcGlwZWxpbmluZyBtb3JlIHJvYnVzdCBhbmQKICBmaXhpbmcgc29tZSBidWdzOgogIG8gRG9uJ3QgbWl4IEdFVCBhbmQgUE9TVCByZXF1ZXN0cyBpbiBhIHBpcGVsaW5lCiAgbyBGaXggdGhlIG9yZGVyIGluIHdoaWNoIHJlcXVlc3RzIGFyZSBkaXNwYXRjaGVkIGZyb20gdGhlIHBpcGVsaW5lCiAgbyBGaXhlZCBzZXZlcmFsIGN1cmwgYnVncyB3aXRoIHBpcGVsaW5pbmcgd2hlbiB0aGUgc2VydmVyIGlzIHJldHVybmluZwogICAgY2h1bmtlZCBlbmNvZGluZzoKICAgICogQWRkZWQgc3RhdGVzIHRvIGNodW5rZWQgcGFyc2luZyBmb3IgZmluYWwgQ1JMRgogICAgKiBSZXdpbmQgYnVmZmVyIGFmdGVyIHBhcnNpbmcgY2h1bmsgd2l0aCBkYXRhIHJlbWFpbmluZwogICAgKiBNb3ZlZCBjaHVua2VkIGhlYWRlciBpbml0aWFsaXppbmcgdG8gYSBzcG90IGp1c3QgYmVmb3JlIHJlY2VpdmluZwogICAgICBoZWFkZXJzCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBjaGFuZ2VkIHRoZSBDVVJMT1BUX0ZUUF9TU0xfQ0NDIG9wdGlvbiB0byBoYW5kbGUKICBhY3RpdmUgYW5kIHBhc3NpdmUgQ0NDIHNodXRkb3duIGFuZCBhZGRlZCB0aGUgLS1mdHAtc3NsLWNjYy1tb2RlIGNvbW1hbmQKICBsaW5lIG9wdGlvbi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNykKLSBJYW4gVHVybmVyIGZpeGVkIHRoZSBsaWJjdXJsLm00IG1hY3JvJ3Mgc3VwcG9ydCBmb3IgLS13aXRoLWxpYmN1cmwuCgotIFNobXVsaWsgUmVnZXYgZm91bmQgYSBtZW1vcnkgbGVhayBpbiByZS11c2VkIEhUVFBTIGNvbm5lY3Rpb25zLCBhdCBsZWFzdAogIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSB3YXMgdXNlZC4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBtYWRlIHBhc3NpdmUgRlRQIHRyYW5zZmVycyB3b3JrIHdpdGggU09DS1MgKGJvdGggNCBhbmQKICA1KS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNykKLSBKZWZmIFBvaGxtZXllciBpZGVudGlmaWVkIHR3byBwcm9ibGVtczogZmlyc3QgYSByYXRoZXIgb2JzY3VyZSBwcm9ibGVtIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW9uIHJlLXVzZSB0aGF0IGNvdWxkIG1ha2UgYQogIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIHJ1aW4gYSBwb2ludGVyIGluIGFub3RoZXIgaGFuZGxlLgoKICBUaGUgc2Vjb25kIHByb2JsZW0gd2FzIGxlc3Mgb2YgYW4gYWN0dWFsIHByb2JsZW0gYnV0IG1vcmUgb2YgbWlub3IgcXVpcms6CiAgdGhlIHJlLXVzaW5nIG9mIGNvbm5lY3Rpb25zIHdhc24ndCBwcm9wZXJseSBjaGVja2luZyBpZiB0aGUgY29ubmVjdGlvbiB3YXMKICBtYXJrZWQgZm9yIGNsb3N1cmUuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDcpCi0gRHVuY2FuIE1hYy1WaWNhciBQcmV0dCBhbmQgTWljaGFsIE1hcmVrIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggcmVzZXR0aW5nCiAgQ1VSTE9QVF9SQU5HRSBiYWNrIHRvIG5vIHJhbmdlIG9uIGFuIGVhc3kgaGFuZGxlIHdoZW4gdXNpbmcgRlRQLgoKRGFuIEYgKDE0IEZlYnJ1YXJ5IDIwMDcpCi0gRml4ZWQgY3VybC1jb25maWcgLS1saWJzIHNvIGl0IGRvZXNuJ3QgbGlzdCB1bm5lY2Vzc2FyeSBsaWJyYXJpZXMgKGFuZAogIHRoZXJlZm9yZSBpbnRyb2R1Y2UgdW5uZWNlc3NhcnkgZGVwZW5kZW5jaWVzKSB3aGVuIGl0J3Mgbm90IG5lZWRlZC4KICBBbHNvLCBkb24ndCBib3RoZXIgYWRkaW5nIGEgbGlicmFyeSBwYXRoIG9mIC91c3IvbGliCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDcpCi0gVGhlIGRlZmF1bHQgcGFzc3dvcmQgZm9yIGFub255bW91cyBGVFAgY29ubmVjdGlvbnMgaXMgbm93IGNoYW5nZWQgdG8gYmUKICAiZnRwQGV4YW1wbGUuY29tIi4KCi0gUm9iZXJ0IEEuIE1vbmF0IG1hZGUgbGliY3VybCBidWlsZCBmaW5lIHdpdGggVkMyMDA1IC0gaXQgZG9lc24ndCBoYXZlCiAgZ210aW1lX3IoKSBsaWtlIHRoZSBvbGRlciBWQyB2ZXJzaW9ucy4gSGUgYWxzbyBtYWRlIHVzZSBvZiBzb21lIG1hY2hpbmUtCiAgc3BlY2lmaWMgZGVmaW5lcyB0byBkaWZmZXJlbnRpYXRlIHRoZSAiT1MiIGRlZmluZS4KCkRhbmllbCAoMTIgRmVicnVhcnkgMjAwNykKLSBSb2IgQ3JpdHRlbmRlbiBhZGRlZCBzdXBwb3J0IGZvciBOU1MgKE5ldHdvcmsgU2VjdXJpdHkgU2VydmljZSkgZm9yIHRoZQogIFNTTC9UTFMgbGF5ZXIuIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvc2VjdXJpdHkvcGtpL25zcy8KCiAgVGhpcyBpcyB0aGUgZm91cnRoIHN1cHBvcnRlZCBsaWJyYXJ5IGZvciBUTFMvU1NMIHRoYXQgbGliY3VybCBzdXBwb3J0cyEKCi0gU2htdWxpayBSZWdldiBmaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBDUkxGIG9mIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBhcmUgc2VudAogIHRvIHRoZSBkZWJ1ZyBjYWxsYmFjay4KCi0gU2htdWxpayBSZWdldiBhZGRlZCBDVVJMT1BUX0hUVFBfQ09OVEVOVF9ERUNPRElORyBhbmQKICBDVVJMT1BUX0hUVFBfVFJBTlNGRVJfREVDT0RJTkcgdGhhdCBpZiBzZXQgdG8gemVybyB3aWxsIGRpc2FibGUgbGliY3VybCdzCiAgaW50ZXJuYWwgZGVjb2Rpbmcgb2YgY29udGVudCBvciB0cmFuc2ZlciBlbmNvZGVkIGNvbnRlbnQuIFRoaXMgbWF5IGJlCiAgcHJlZmVyYWJsZSBpbiBjYXNlcyB3aGVyZSB5b3UgdXNlIGxpYmN1cmwgZm9yIHByb3h5IHB1cnBvc2VzIG9yIHNpbWlsYXIuIFRoZQogIGNvbW1hbmQgbGluZSB0b29sIGdvdCBhIC0tcmF3IG9wdGlvbiB0byBkaXNhYmxlIGJvdGggYXQgb25jZS4KCi0gcmVsZWFzZSB0YXJiYWxscyBtYWRlIHdpdGggbWFrZXRneiB3aWxsIGZyb20gbm93IG9uIGhhdmUgYSBMSUJDVVJMX1RJTUVTVEFNUAogIGRlZmluZSBzZXQgdG8gaG9sZCB0aGUgZXhhY3QgZGF0ZSBhbmQgdGltZSBvZiB3aGVuIHRoZSB0YXJiYWxsIHdhcyBidWlsdCwgYXMKICBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyB1c2luZyB0aGUgVVRDIHRpbWUgem9uZS4KCi0gSmVmZiBQb2hsbWV5ZXIgZml4ZWQgYSBmbGF3IGluIGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHdoZW4gYWRkaW5nIGEgaGFuZGxlCiAgdGhhdCBoYXMgYW4gZWFzeSBoYW5kbGUgcHJlc2VudCBpbiB0aGUgImNsb3N1cmUiIGxpc3QgcGVuZGluZyBjbG9zdXJlLgoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDcpCi0gUmVndWxhciBmaWxlIGRvd25sb2FkcyB3aWh0IFNGVFAgYW5kIFNDUCBhcmUgbm93IGRvbmUgdXNpbmcgdGhlIG5vbi1ibG9ja2luZwogIEFQSSBvZiBsaWJzc2gyLCBpZiB0aGUgbGlic3NoMiBoZWFkZXJzIHNlZW0gdG8gc3VwcG9ydCB0aGVtLiBUaGlzIHdpbGwgbWFrZQogIFNDUCBhbmQgU0ZUUCBtdWNoIG1vcmUgcmVzcG9uc2l2ZSBhbmQgYmV0dGVyIGxpYmN1cmwgY2l0aXplbnMgd2hlbiB1c2VkIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIGV0Yy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciBhZGRlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1RJTUVPVVRfTVMgYW5kCiAgQ1VSTE9QVF9DT05ORUNUVElNRU9VVF9NUyB0aGF0LCBhcyB0aGVpciBuYW1lcyBzdWdnZXN0LCBkbyB0aGUgdGltZW91dHMgd2l0aAogIG1pbGxpc2Vjb25kIHJlc29sdXRpb24uIFRoZSBvbmx5IHJlc3RyaWN0aW9uIHRvIHRoYXQgaXMgdGhlIGFsYXJtKCkKICAoc29tZXRpbWVzKSB1c2VkIHRvIGFib3J0IG5hbWUgcmVzb2x2ZXMgYXMgdGhhdCB1c2VzIGZ1bGwgc2Vjb25kcy4gSSBmaXhlZAogIHRoZSBGVFAgcmVzcG9uc2UgdGltZW91dCBwYXJ0IG9mIHRoZSBwYXRjaC4KCiAgSW50ZXJuYWxseSB3ZSBub3cgY291bnQgYW5kIGtlZXAgdGhlIHRpbWVvdXRzIGluIG1pbGxpc2Vjb25kcyBidXQgaXQgYWxzbwogIG1lYW5zIHdlIG11bHRpcGx5IHNldCB0aW1lb3V0cyB3aXRoIDEwMDAuIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IG5vCiAgdGltZW91dCBjYW4gYmUgc2V0IHRvIG1vcmUgdGhhbiAyXjMxIG1pbGxpc2Vjb25kcyAob24gMzIgYml0IHN5c3RlbXMpLCB3aGljaAogIGVxdWFscyAyNC44NiBkYXlzLiAgV2UgcHJvYmFibHkgY291bGRuJ3QgYmVmb3JlIGVpdGhlciBzaW5jZSB0aGUgY29kZSBkaWQKICAqMTAwMCBvbiB0aGUgdGltZW91dCB2YWx1ZXMgb24gc2V2ZXJhbCBwbGFjZXMgYWxyZWFkeS4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA3KQotIFlhbmcgVHNlIGZpeGVkIHRoZSBjb29raWUgZXhwaXJ5IGRhdGUgaW4gc2V2ZXJhbCB0ZXN0IGNhc2VzIHRoYXQgc3RhcnRlZCB0bwogIGZhaWwgc2luY2UgdGhleSB1c2VkICIxIGZlYiAyMDA3Ii4uLgoKLSBNYW5mcmVkIFNjaHdhcmIgcmVwb3J0ZWQgdGhhdCBzb2NrczUgc3VwcG9ydCB3YXMgYnJva2VuIGFuZCBoZWxwIHVzIHBpbnBvaW50CiAgdGhlIHByb2JsZW0uIFRoZSBjb2RlIG5vdyB0cmllcyBoYXJkZXIgdG8gdXNlIGh0dHByb3h5IGFuZCBwcm94eSB3aGVyZQogIGFwcHByb3ByaWF0ZSwgYXMgbm90IGFsbCBwcm94aWVzIGFyZSBIVFRQLi4uCgpWZXJzaW9uIDcuMTYuMSAoMjkgSmFudWFyeSAyMDA3KQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIENPTk5FQ1Qgd2l0aCBhIGN1c3RvbSBVc2VyLUFnZW50CiAgaGVhZGVyLCB5b3UgZ290IF90d29fIFVzZXItQWdlbnQgaGVhZGVycyBpbiB0aGUgQ09OTkVDVCByZXF1ZXN0Li4uISBBZGRlZAogIHRlc3QgY2FzZSAyODcgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNykKLSBjdXJsX2Vhc3lfcmVzZXQoKSBub3cgcmVzZXRzIHRoZSBDQSBidW5kbGUgcGF0aCBjb3JyZWN0bHkuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIHRoZSBDdXJsIGNvbW1hbmQgbGluZSB0b29sIGZvciBIVFRQIG9uIG5vbi1BU0NJSQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA3KQotIEFkZGVkIHRoZSAtLWxpYmN1cmwgW2ZpbGVdIG9wdGlvbiB0byBjdXJsLiBBcHBlbmQgdGhpcyBvcHRpb24gdG8gYW55CiAgb3JkaW5hcnkgY3VybCBjb21tYW5kIGxpbmUsIGFuZCB5b3Ugd2lsbCBnZXQgYSBsaWJjdXJsLXVzaW5nIHNvdXJjZSBjb2RlCiAgd3JpdHRlbiB0byB0aGUgZmlsZSB0aGF0IGRvZXMgdGhlIGVxdWl2YWxlbnQgb3BlcmF0aW9uIG9mIHdoYXQgeW91ciBjb21tYW5kCiAgbGluZSBvcGVyYXRpb24gZG9lcyEKCkRhbiBGICgyNCBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBkYW5nbGluZyBwb2ludGVyIHByb2JsZW0gdGhhdCBwcmV2ZW50ZWQgdGhlIGh0dHBfcHJveHkgZW52aXJvbm1lbnQKICB2YXJpYWJsZSBmcm9tIGJlaW5nIHByb3Blcmx5IHVzZWQgaW4gbWFueSBjYXNlcyAoYW5kIGNhdXNlZCB0ZXN0IGNhc2UgNjMKICB0byBmYWlsKS4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IGRpZCBOVExNIGNoYW5nZXMgbWFpbmx5IGZvciBub24tQVNDSUkgcGxhdGZvcm1zOgoKICAjMQogIFRoZXJlJ3MgYSBjb21waWxhdGlvbiBlcnJvciBpbiBodHRwX250bG0uYyBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIE5PVAogIGRlZmluZWQuICBJIG5vdGljZWQgdGhpcyB3aGlsZSB0ZXN0aW5nIHZhcmlvdXMgY29uZmlndXJhdGlvbnMuICBMaW5lIDg2NyBvZgogIHRoZSBjdXJyZW50IGh0dHBfbnRsbS5jIGlzIGEgY2xvc2luZyBicmFja2V0IGZvciBhbiBpZi9lbHNlIHBhaXIgdGhhdCBvbmx5CiAgZ2V0cyBjb21waWxlZCBpbiBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIGRlZmluZWQuICBCdXQgdGhpcyBjbG9zaW5nIGJyYWNrZXQKICB3YXNuJ3QgaW4gYW4gI2lmZGVmIHNvIHRoZSBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgdW5sZXNzIFVTRV9OVExNMlNFU1NJT04gd2FzCiAgZGVmaW5lZC4gIExpbmVzIDE5OCBhbmQgMTQwIG9mIG15IHBhdGNoIHdyYXBzIHRoYXQgY2xvc2luZyBicmFja2V0IGluIGFuCiAgI2lmZGVmIFVTRV9OVExNMlNFU1NJT04uCgogICMyCiAgSSBub3RpY2VkIHNldmVyYWwgcGlja3kgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBERUJVR19NRSBpcyBkZWZpbmVkLiAgSSd2ZQogIGZpeGVkIHRoZW0gd2l0aCBjYXN0aW5nLiAgQnkgdGhlIHdheSwgREVCVUdfTUUgd2FzIGEgaHVnZSBoZWxwIGluCiAgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUuCgogICMzCiAgSG9wZWZ1bGx5IHRoZSBsYXN0IG5vbi1BU0NJSSBjb252ZXJzaW9uIHBhdGNoIGZvciBsaWJjdXJsIGluIGEgd2hpbGUuICBJCiAgY2hhbmdlZCB0aGUgIk5UTE1TU1AiIGxpdGVyYWwgdG8gaGV4IHNpbmNlIHRoaXMgc2lnbmF0dXJlIG11c3QgYWx3YXlzIGJlIGluCiAgQVNDSUkuCgogIENvbnZlcnNpb24gY29kZSB3YXMgc3RyYXRlZ2ljYWxseSBhZGRlZCB3aGVyZSBuZWNlc3NhcnkuICBBbmQgdGhlCiAgQ3VybF9iYXNlNjRfZW5jb2RlIGNhbGxzIHdlcmUgY2hhbmdlZCBzbyB0aGUgYmluYXJ5ICJibG9icyIgaHR0cF9udGxtLmMKICBjcmVhdGVzIGFyZSBOT1QgdHJhbnNsYXRlZCBvbiBub24tQVNDSUkgcGxhdGZvcm1zLgoKRGFuIEYgKDIyIEphbnVhcnkgMjAwNykKLSBDb252ZXJ0ZWQgKG1vc3Qgb2YpIHRoZSB0ZXN0IGRhdGEgZmlsZXMgaW50byBnZW51aW5lIFhNTC4gIEEgaGFuZGZ1bCBzdGlsbAogIGFyZSBub3QsIGR1ZSBtYWlubHkgdG8gdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3IgWE1MIGNoYXJhY3RlciBlbnRpdGllcwogIChlLmcuICYgPT4gJmFtcDsgKS4gIFRoaXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB2YWxpZGF0ZSB0ZXN0IGZpbGVzIHVzaW5nCiAgdG9vbHMgbGlrZSB4bWxsaW50LCBhcyB3ZWxsIGFzIHRvIGVkaXQgYW5kIHZpZXcgdGhlbSB1c2luZyBYTUwgdG9vbHMuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNykKLSBBcm1lbCBBc3NlbGluIGltcHJvdmVkIGxpYmN1cmwgdG8gYmVoYXZlIGEgbG90IGJldHRlciB3aGVuIGFuIGVhc3kgaGFuZGxlCiAgZG9pbmcgYW4gRlRQIHRyYW5zZmVyIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgY29tcGxldGlvbi4gVGhlCiAgZml4IGFsc28gZml4ZWQgdGhlICJhbGl2ZSBjb3VudGVyIiB0byBiZSBjb3JyZWN0IG9uICJwcmVtYXR1cmUgcmVtb3ZhbCIgZm9yCiAgYWxsIHByb3RvY29scy4KCkRhbiBGICgxNiBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBzbWFsbCBtZW1vcnkgbGVhayBpbiB0ZnRwIHVwbG9hZHMgZGlzY292ZXJlZCBieSBjdXJsJ3MgbWVtb3J5IGxlYWsKICBkZXRlY3Rvci4gIEFsc28gY2hhbmdlZCB0ZnRwIGRvd25sb2FkcyB0byBVUkwtdW5lc2NhcGUgdGhlIGRvd25sb2FkZWQKICBmaWxlIG5hbWUuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBsaWJjdXJsIGNoYW5nZXMgZm9yIGRvaW5nIEhUVFAgY29tbXVuaWNhdGlvbiBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuIEl0IGRvZXMgYWRkIHNvbWUgY29tcGxleGl0eSwgbW9zdCBub3RhYmx5IHdpdGggbW9yZQogICNpZmRlZnMsIGJ1dCBJIHdhbnQgdG8gc2VlIHRoaXMgc3VwcG9ydGVkIGFkZGVkIGFuZCBJIGNhbid0IHNlZSBob3cgd2UgY2FuCiAgYWRkIGl0IHdpdGhvdXQgdGhlIGV4dHJhIHN0dWZmIGFkZGVkLgoKLSBTZXR0aW5nIENVUkxPUFRfQ09PS0lFTElTVCB0byAiQUxMIiB3aGVuIG5vIGNvb2tpZXMgYXQgYWxsIHdhcyBwcmVzZW50LAogIGxpYmN1cmwgd291bGQgY3Jhc2ggd2hlbiB0cnlpbmcgdG8gcmVhZCBhIE5VTEwgcG9pbnRlci4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA3KQotIFRvYnkgUGV0ZXJzb24gZm91bmQgYSBuYXN0eSBidWcgdGhhdCBwcmV2ZW50ZWQgKGxpYiljdXJsIGZyb20gcHJvcGVybHkKICBkb3dubG9hZGluZyAobW9zdCkgdGhpbmdzIHRoYXQgd2VyZSBsYXJnZXIgdGhhbiA0R0Igb24gMzIgYml0IHN5c3RlbXMuICBNYXR0CiAgV2l0aGVyc3Bvb24gaGVscGVkIGFzIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGludHJvZHVjZWQgdGhlIC0tZnRwLXNzbC1jY2MgY29tbWFuZCBsaW5lIG9wdGlvbiB0bwogIGN1cmwgdGhhdCB1c2VzIHRoZSBuZXcgQ1VSTE9QVF9GVFBfU1NMX0NDQyBvcHRpb24gaW4gbGliY3VybC4gSWYgZW5hYmxlZCwgaXQKICB3aWxsIG1ha2UgbGliY3VybCBzaHV0ZG93biBTU0wvVExTIGFmdGVyIHRoZSBhdXRoZW50aWNhdGlvbiBpcyBkb25lIG9uIGEKICBGVFAtU1NMIG9wZXJhdGlvbi4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgbWFkZSBjaGFuZ2VzIHRvIGFsbG93IGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZyB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDcpCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCB0aGUgZmxhdyB3aGljaCBtYWRlIGxpYmN1cmwgNy4xNi4wIGFsd2F5cyBzdG9yZQogIGRvd25sb2FkZWQgZGF0YSBpbiB0d28gYnVmZmVycywganVzdCB0byBiZSBhYmxlIHRvIGRlYWwgd2l0aCBhIHNwZWNpYWwgSFRUUAogIHBpcGVsaW5pbmcgY2FzZS4gVGhhdCBpcyBub3cgb25seSBhY3RpdmF0ZWQgZm9yIHBpcGVsaW5lZCB0cmFuc2ZlcnMuIEluCiAgTWF0dCdzIGNhc2UsIGl0IHNob3dlZCBhcyBhIGNvbnNpZGVyYWJsZSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlLAoKRGFuaWVsICgyIEphbnVhcnkgMjAwNykKLSBWaWN0b3IgU25lemhrbyBoZWxwZWQgdXMgZml4IGJ1ZyByZXBvcnQgIzE2MDM3MTIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgKGtub3duIGJ1ZyAjMzYpIC0tbGltaXQtcmF0ZQogIChDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZCBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFKSBhcmUgYnJva2VuCiAgb24gV2luZG93cyAoc2luY2UgNy4xNi4wLCBidXQgdGhhdCdzIHdoZW4gdGhleSB3ZXJlIGludHJvZHVjZWQgYXMgcHJldmlvdXMKICB0byB0aGF0IHRoZSBsaW1pdGluZyBsb2dpYyB3YXMgbWFkZSBpbiB0aGUgYXBwbGljYXRpb24gb25seSBhbmQgbm90IGluIHRoZQogIGxpYnJhcnkpLiBJdCB3YXMgYWN0dWFsbHkgYWxzbyBicm9rZW4gb24gc2VsZWN0KCktYmFzZWQgc3lzdGVtcyAoYXMgYXBwb3NlZAogIHRvIHBvbGwoKSkgYnV0IHdlIGhhdmVuJ3QgaGFkIGFueSBzdWNoIHJlcG9ydHMuIFdlIG5vdyB1c2Ugc2VsZWN0KCksIFNsZWVwKCkKICBvciBkZWxheSgpIHByb3Blcmx5IHRvIHNsZWVwIGEgd2hpbGUgd2l0aG91dCB3YWl0aW5nIGZvciBhbnl0aGluZyBpbnB1dCBvcgogIG91dHB1dCB3aGVuIHRoZSByYXRlIGxpbWl0aW5nIGlzIGFjdGl2YXRlZCB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4KCi0gTW9kaWZpZWQgbGliY3VybC5wYy5pbiB0byB1c2UgTGlicy5wcml2YXRlIGZvciB0aGUgbGlicyBsaWJjdXJsIGl0c2VsZiBuZWVkcwogIHRvIGdldCBidWlsdCBzdGF0aWMuIEl0IGhhcyBiZWVuIG1lbnRpb25lZCBiZWZvcmUgYW5kIHdhcyBhZ2FpbiBicm91Z2h0IHRvCiAgb3VyIGF0dGVudGlvbiBieSBOYXRoYW5hZWwgTmVyb2RlIHdobyBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjNDA1MjI2CiAgKGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00MDUyMjYpLgoKRGFuaWVsICgyOSBEZWNlbWJlciAyMDA2KQotIE1ha2UgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHNldCB0aGUgbWFnaWMgbnVtYmVyIGluIHRoZSBuZXcgaGFuZGxlLgoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA2KQotIFJvYmVydCBGb3JlbWFuIHByb3ZpZGVkIGEgcHJpbWUgZXhhbXBsZSBzbmlwcGV0IHNob3dpbmcgaG93IGxpYmN1cmwgd291bGQKICBnZXQgY29uZnVzZWQgYW5kIG5vdCBhY2tub3dsZWRnZSB0aGUgJ25vX3Byb3h5JyB2YXJpYWJsZSBwcm9wZXJseSBvbmNlIGl0CiAgaGFkIHVzZWQgdGhlIHByb3h5IGFuZCB5b3UgcmUtdXNlZCB0aGUgc2FtZSBlYXN5IGhhbmRsZS4gSSBtYWRlIHN1cmUgdGhlCiAgcHJveHkgbmFtZSBpcyBwcm9wZXJseSBzdG9yZWQgaW4gdGhlIGNvbm5lY3Qgc3RydWN0IHJhdGhlciB0aGFuIHRoZQogIHNlc3Npb25oYW5kbGUvZWFzeSBzdHJ1Y3QuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgYmFkIGNhbGwgdG8gZ2V0c29ja25hbWUoKSB0aGF0IHdyb25nbHkgdXNlZCBhIHNpemVfdAogIHZhcmlhYmxlIHRvIHBvaW50IHRvIHdoZW4gaXQgc2hvdWxkIGJlIGEgc29ja2xlbl90LgoKLSBXaGVuIHNldHRpbmcgYSBwcm94eSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgKGZvciBleGFtcGxlKSBydW5uaW5nCiAgJ2N1cmwgW1VSTF0nIHdpdGggYSBVUkwgd2l0aG91dCBhIHByb3RvY29sIHByZWZpeCwgY3VybCB3b3VsZCBub3Qgc2VuZCBhCiAgY29ycmVjdCByZXF1ZXN0IGFzIGl0IGZhaWxlZCB0byBhZGQgdGhlIHByb3RvY29sIHByZWZpeC4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNikKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHJlcG9ydGVkIGJ1ZyAjMTYxODM1OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjE4MzU5KSBhbmQgc3Vic2VxdWVudGx5IHByb3ZpZGVkIGEKICBwYXRjaCBmb3IgaXQ6IHdoZW4gZG93bmxvYWRpbmcgMiB6ZXJvIGJ5dGUgZmlsZXMgaW4gYSByb3csIGN1cmwgNy4xNi4wCiAgZW50ZXJzIGFuIGluZmluaXRlIGxvb3AsIHdoaWxlIGN1cmwgNy4xNi4xLTIwMDYxMjE4IGRvZXMgb25lIGFkZGl0aW9uYWwKICB1bm5lY2Vzc2FyeSByZXF1ZXN0LgoKICBGaXg6IER1cmluZyB0aGUgIk1ham9yIG92ZXJoYXVsIGludHJvZHVjaW5nIGh0dHAgcGlwZWxpbmluZyBzdXBwb3J0IGFuZAogIHNoYXJlZCBjb25uZWN0aW9uIGNhY2hlIHdpdGhpbiB0aGUgbXVsdGkgaGFuZGxlLiIgY2hhbmdlLCBoZWFkZXJieXRlY291bnQKICB3YXMgbW92ZWQgdG8gbGl2ZSBpbiB0aGUgQ3VybF90cmFuc2Zlcl9rZWVwZXIgc3RydWN0dXJlLiBCdXQgdGhhdCBzdHJ1Y3R1cmUKICBpcyByZXNldCBpbiB0aGUgVHJhbnNmZXIgbWV0aG9kLCBsb3NpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGFkIGFib3V0CiAgdGhlIGhlYWRlciBzaXplLiBUaGlzIHBhdGNoIG1vdmVzIGl0IGJhY2sgdG8gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdC4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNikKLSBCcmVuZGFuIEp1cmQgcHJvdmlkZWQgYSBmaXggdGhhdCBub3cgcHJldmVudHMgbGliY3VybCBmcm9tIGdldHRpbmcgYSBTSUdQSVBFCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyB3aGVuIEdudVRMUyBpcyB1c2VkLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDA2KQotIEFsZXhleSBTaW1hayBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvaW5nIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kCiAgc29tZXRoaW5nIHdlbnQgd3JvbmcgbGlrZSBpdCBnb3QgYSBiYWQgcmVzcG9uc2UgY29kZSBiYWNrIGZyb20gdGhlIHNlcnZlciwKICBsaWJjdXJsIHdvdWxkIGxlYWsgbWVtb3J5LiBBZGRlZCB0ZXN0IGNhc2UgNTM4IHRvIHZlcmlmeSB0aGUgZml4LgoKICBJIGFsc28gbm90ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBnZXQgY2FjaGVkIGluIHRoYXQgY2FzZSwgd2hpY2gKICBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UgaXQgY2Fubm90IGJlIHJlLXVzZSB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbiBoYXMKICBmYWlsZWQuIEkgZml4ZWQgdGhhdCBpc3N1ZSB0b28gYXQgdGhlIHNhbWUgdGltZSwgYW5kIGFsc28gdGhhdCB0aGUgcGF0aAogIHdvdWxkIGJlICJyZW1lbWJlcmVkIiBpbiB2YWluIGZvciBjYXNlcyB3aGVyZSB0aGUgY29ubmVjdGlvbiB3YXMgYWJvdXQgdG8KICBnZXQgY2xvc2VkLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDYpCi0gU2ViYXN0aWVuIFdpbGxlbWlqbnMgcmVwb3J0ZWQgYnVnICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIHdoaWNoIGlzIGFib3V0IGNvbm5lY3Rpb25zCiAgZ2V0dGluZyBjdXQgb2ZmIHByZW1hdHVyZWx5IHdoZW4gLS1saW1pdC1yYXRlIGlzIHVzZWQuIFdoaWxlIEkgZm91bmQgbm8gc3VjaAogIHByb2JsZW1zIGluIG15IHRlc3RzIG5vciBpbiBteSByZWFkaW5nIG9mIHRoZSBjb2RlLCBJIGZvdW5kIHRoYXQgdGhlCiAgLS1saW1pdC1yYXRlIGNvZGUgd2FzIHNldmVybHkgZmxhd2VkIChzaW5jZSBpdCB3YXMgbW92ZWQgaW50byB0aGUgbGliLCBzaW5jZQogIDcuMTUuNSkgd2hlbiB1c2VkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlIGFuZCBpdCBkaWRuJ3Qgd29yayBhcyBkb2N1bWVudGVkCiAgc28gSSByZXdvcmtlZCBpdCBzb21ld2hhdCBhbmQgbm93IGl0IHdvcmtzIGZvciBteSB0ZXN0cy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDA2KQotIFN0ZWZhbiBLcmF1c2UgcG9pbnRlZCBvdXQgYSBjb21waWxlciB3YXJuaW5nIHdpdGggYSBwaWNreSBNU0NWIGNvbXBpbGVyIHdoZW4KICBwYXNzaW5nIGEgY3VybF9vZmZfdCBhcmd1bWVudCB0byB0aGUgQ3VybF9yZWFkX3Jld2luZCgpIGZ1bmN0aW9uIHdoaWNoIHRha2VzCiAgYW4gc2l6ZV90IGFyZ3VtZW50LiBDdXJsX3JlYWRfcmV3aW5kKCkgYWxzbyBoYWQgZGVidWcgY29kZSBsZWZ0IGluIGl0IGFuZCBpdAogIHdhcyBwdXQgaW4gYSBkaWZmZXJlbnQgc291cmNlIGZpbGUgd2l0aCBubyBnb29kIHJlYXNvbiB3aGVuIG9ubHkgdXNlZCBmcm9tCiAgb25lIHNpbmdsZSBzcG90LgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DTE9TRVBPTElDWSBkb2Vzbid0IHdvcmssIGFuZCBpbmRlZWQsIHRoZXJlIGlzCiAgbm8gY29kZSBwcmVzZW50IGluIHRoZSBsaWJyYXJ5IHRoYXQgcmVjZWl2ZXMgdGhlIG9wdGlvbi4gU2luY2UgaXQgd2FzIG5vdAogIHBvc3NpYmxlIHRvIHVzZSwgd2Uga25vdyB0aGF0IG5vIGN1cnJlbnQgdXNlcnMgZXhpc3QgYW5kIHRodXMgd2Ugc2ltcGx5CiAgcmVtb3ZlZCBpdCBmcm9tIHRoZSBkb2NzIGFuZCBtYWRlIHRoZSBjb2RlIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgcGF0aCBvZgogIHRoZSBjb2RlLgoKLSBKYXJlZCBMdW5kZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE2MDQ5NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwNDk1Nikgd2hpY2ggaWRlbnRpZmllZCBzZXR0aW5nCiAgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byB6ZXJvIGNhdXNlZCBsaWJjdXJsIHRvIFNJR1NFR1YuIFN0YXJ0aW5nIG5vdywgbGliY3VybAogIHdpbGwgYWx3YXlzIGludGVybmFsbHkgdXNlIG5vIGxlc3MgdGhhbiAxIGVudHJ5IGluIHRoZSBjb25uZWN0aW9uIGNhY2hlLgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9GT1JCSURfUkVVU0Ugbm8gd29ya3MsIGFuZCBpbmRlZWQgaXQgYnJva2UgaW4KICB0aGUgNy4xNi4wIHJlbGVhc2UuCgotIE1hcnRpbiBTa2lubmVyIGJyb3VnaHQgYmFjayBidWcgcmVwb3J0ICMxMjMwMTE4IHRvIGhhdW50IHVzIG9uY2UgYWdhaW4uCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMzAxMTgpIGN1cmxfZ2V0ZGF0ZSgpIGRpZCBub3Qgd29yawogIHByb3Blcmx5IGZvciBhbGwgaW5wdXQgZGF0ZXMgb24gV2luZG93cy4gSXQgd2FzIG1vc3RseSBzZWVuIG9uIHNvbWUgVFogdGltZQogIHpvbmVzIHVzaW5nIERTVC4gTHVja2lseSwgTWFydGluIGFsc28gcHJvdmlkZWQgYSBmaXguCgotIEFsZXhleSBTaW1hayBmaWxlZCBidWcgcmVwb3J0ICMxNjAwNDQ3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDA0NDcpIGluIHdoaWNoIGhlIG5vdGVkIHRoYXQgYWN0aXZlCiAgRlRQIGNvbm5lY3Rpb25zIGRvbid0IHdvcmsgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBUaGUgcHJvYmxlbSBpcyBoZXJlCiAgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIHN0YXRlIG1hY2hpbmUgaGFzIGEgc3RhdGUgZHVyaW5nIHdoaWNoIGl0IGNhbiB3YWl0CiAgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24gdG8gY29ubmVjdCwgYnV0IHRoZSBhY3RpdmUgY29ubmVjdGlvbiBpcyBub3QgZG9uZSBpbgogIHRoZSBzYW1lIHN0ZXAgaW4gdGhlIHNlcXVlbmNlIGFzIHRoZSBwYXNzaXZlIG9uZSBpcyBzbyBpdCBkb2Vzbid0IHF1aXRlIHdvcmsKICBmb3IgYWN0aXZlLiBUaGUgYWN0aXZlIEZUUCBjb2RlIHN0aWxsIHVzZSBhIGJsb2NraW5nIGZ1bmN0aW9uIHRvIGFsbG93IHRoZQogIHJlbW90ZSBzZXJ2ZXIgdG8gY29ubmVjdC4KCiAgVGhlIGZpeCAod29yay1hcm91bmQgaXMgYSBiZXR0ZXIgd29yZCkgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byBzZXQgdGhlCiAgYm9vbGVhbiBwcmVtYXR1cmVseSB0aGF0IHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLCBzbyB0aGF0IHRoZSAid2FpdAogIGZvciBjb25uZWN0IiBwaGFzZSBlbmRzIGF0IG9uY2UuCgogIFRoZSBwcm9wZXIgZml4LCBsZWZ0IGZvciB0aGUgZnV0dXJlLCBpcyBvZiBjb3Vyc2UgdG8gbWFrZSB0aGUgYWN0aXZlIEZUUAogIGNhc2UgdG8gYWN0IGluIGEgbm9uLWJsb2NraW5nIHdheSB0b28uCgotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgYSBwcm9ibGVtIGNhc2Ugd2hlbiB0aGUgQ1BVIGxvYWQgd2VudCB0byAxMDAlIHdoZW4gYQogIEhUVFAgdXBsb2FkIHdhcyBkaXNjb25uZWN0ZWQ6CgogICJXaGF0IGFwcGVhcnMgdG8gYmUgaGFwcGVuaW5nIGlzIHRoYXQgbXkgc3lzdGVtIChMaW51eCAyLjYuMTcgYW5kIDIuNi4xMykgaXMKICBzZXR0aW5nICpvbmx5KiBQT0xMSFVQIG9uIHBvbGwoKSB3aGVuIHRoZSBjb25kaXRpb25zIGluIG15IHByZXZpb3VzIG1haWwKICBvY2N1ci4gQXMgeW91IGNhbiBzZWUsIHNlbGVjdC5jOkN1cmxfc2VsZWN0KCkgZG9lcyBub3QgY2hlY2sgZm9yIFBPTExIVVAuIFNvCiAgYmFzaWNhbGx5IHdoYXQgd2FzIGhhcHBlbmluZywgaXMgcG9sbCgpIHdhcyByZXR1cm5pbmcgaW1tZWRpYXRlbHkgKHdpdGgKICBQT0xMSFVQIHNldCksIGJ1dCB3aGVuIEN1cmxfc2VsZWN0KCkgbG9va2VkIGF0IHRoZSBiaXRzLCBuZWl0aGVyIFBPTExFUlIgb3IKICBQT0xMT1VUIHdhcyBzZXQuIFRoaXMgc3RpbGwgY2F1c2VkIEN1cmxfcmVhZHdyaXRlKCkgdG8gYmUgY2FsbGVkLCB3aGljaAogIHF1aWNrbHkgcmV0dXJuZWQuIFRoZW4gdGhlIHRyYW5zZmVyKCkgbG9vcCBrZXB0IGNvbnRpbnVpbmcgYXQgZnVsbCBzcGVlZAogIGZvcmV2ZXIuIgoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDYpCi0gVG9vbiBWZXJ3YWVzdCByZXBvcnRlZCB0aGF0IHRoZXJlIGFyZSBzZXJ2ZXJzIHRoYXQgc2VuZCB0aGUgQ29udGVudC1SYW5nZToKICBoZWFkZXIgaW4gYSB0aGlyZCwgbm90IHN1cHBwb3J0ZWQgYnkgbGliY3VybCwgZm9ybWF0IGFuZCB3ZSBhZ3JlZWQgdGhhdCB3ZQogIGNvdWxkIG1ha2UgdGhlIHBhcnNlciBtb3JlIGZvcmdpdmluZyB0byBhY2NlcHQgYWxsIHRoZSB0aHJlZSBmb3VuZAogIHZhcmlhdGlvbnMuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDYpCi0gVmVua2F0IEFrZWxsYSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGRpZCBub3QgbGlrZSBIVFRQIHJlc3BvbnNlcyB0aGF0IHNpbXBseQogIHJlc3BvbmRlZCB3aXRoIGEgc2luZ2xlIHN0YXR1cyBsaW5lIGFuZCBubyBoZWFkZXJzIG5vciBib2R5LiBTdGFydGluZyBub3csIGEKICBIVFRQIHJlc3BvbnNlIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIChpLmUgbm90IHNldCB0byBiZSBjbG9zZWQgYWZ0ZXIgdGhlCiAgcmVzcG9uc2UgaGFzIGJlZW4gdGFrZW4gY2FyZSBvZikgbXVzdCBoYXZlIENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQKICBlbmNvZGluZyBzZXQsIG9yIGxpYmN1cmwgd2lsbCBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlcmUgaXMgbm8gYm9keS4KCiAgVG8gbXkgaG9ycm9yIEkgbGVhcm5lZCB0aGF0IHdlIGhhZCBubyBsZXNzIHRoYW4gNTcoISkgdGVzdCBjYXNlcyB0aGF0IGRpZCBiYWQKICBIVFRQIHJlc3BvbnNlcyBsaWtlIHRoaXMsIGFuZCBldmVuIHRoZSB0ZXN0IGh0dHAgc2VydmVyIChzd3MpIHJlc3BvbmRlZCBiYWRseQogIHdoZW4gcXVlcmllZCBieSB0aGUgdGVzdCBzeXN0ZW0gaWYgaXQgaXMgdGhlIHRlc3Qgc3lzdGVtLiBTbyBhbHRob3VnaCB0aGUKICBhY3R1YWwgZml4IGZvciB0aGUgcHJvYmxlbSB3YXMgdGlueSwgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIG5ld2x5IGZhaWxpbmcgdGVzdAogIGNhc2VzIGdvdCByZWFsbHkgcGFpbmZ1bCBhbmQgYm9yaW5nLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA2KQotIEphbWVzIEhvdXNsZXkgZGlkIGxvdHMgb2Ygd29yayBhbmQgaW50cm9kdWNlZCBTRlRQIGRvd25sb2Fkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNikKLSBSb24gaW4gYnVnICMxNTk1MzQ4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTk1MzQ4KSBwb2ludGVkCiAgb3V0IGEgc3RhY2sgb3ZlcndyaXRlIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZml4KSBvbiA2NGJpdCBXaW5kb3dzIHdoZW4KICBkZWFsaW5nIHdpdGggSFRUUCBjaHVua2VkIGVuY29kaW5nLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDYpCi0gTmlyIFNvZmZlciB1cGRhdGVkIGxpYmN1cmwuZnJhbWV3b3JrLm1ha2U6CiAgbyBmaXggc3ltbGlua3MsIHNob3VsZCBsaW5rIHRvIFZlcnNpb25zLCBub3QgdG8gLi9WZXJzaW9ucwogIG8gaW5kZW50YXRpb24gaW1wcm92bWVudHMKCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhIFNJR1NFR1Ygd2l0aCBoaXMgdGVzdDA0LmMgZXhhbXBsZSBwb3N0ZWQgb24gNyBOb3YKICAyMDA2LiBJdCB0dXJuZWQgb3V0IHdlIHdyb25nbHkgYXNzdW1lZCB0aGF0IHRoZSBjb25uZWN0aW9uIGNhY2hlIHdhcyBwcmVzZW50CiAgd2hlbiB0ZWFyaW5nIGRvd24gYSBjb25uZWN0aW9uLgoKLSBDaXByaWFuIEJhZGVzY3UgZm91bmQgYSBTSUdTRUdWIHdoZW4gZG9pbmcgbXVsdGlwbGUgVEZUUCB0cmFuc2ZlcnMgdXNpbmcgdGhlCiAgbXVsdGkgaW50ZXJmYWNlLCBidXQgSSBjb3VsZCBhbHNvIHJlcGVhdCBpdCBkb2luZyBtdWx0aXBsZSBzZXF1ZW50aWFsIG9uZXMKICB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4gVXNpbmcgQ2lwcmlhbidzIHRlc3QgY2FzZSwgSSBjb3VsZCBmaXggaXQuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNikKLSBCcmFkZm9yZCBCcnVjZSByZXBvcnRlZCB0aGF0IHdoZW4gc2V0dGluZyBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gd2l0aG91dAogIENVUkxPUFRfVkVSQk9TRSBzZXQgdG8gbm9uLXplcm8sIHlvdSBzdGlsbCBnb3QgYSBmZXcgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUKICBTU0wgaGFuZHNoYWtlLiBUaGlzIGlzIG5vdyBzdG9wcGVkLgoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBmaXhlZCBhIGxlZnRvdmVyIHByb2JsZW0gd2l0aCB0aGUgQ09OTkVDVCBmaXggb2YgaGlzIHRoYXQgd291bGQgbGVhdmUgYQogIHdyb25nIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYnVmZmVyLgoKRGFuaWVsICgzIE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBTdHVlYmVuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBJIGVkaXRlZCBzbGlnaHRseS4gSXQgZml4ZXMgdGhlIG5vdG9yaW91cwogIEtOT1dOX0JVR1MgIzI1LCB3aGljaCBoYXBwZW5zIHdoZW4gYSBwcm94eSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbgogIGxpYmN1cmwgaGFzIHNlbnQgQ09OTkVDVCwgYXMgcGFydCBvZiBhbiBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbi4gU3RhcnRpbmcKICBub3csIGxpYmN1cmwgd2lsbCByZS1jb25uZWN0IGFjY29yZGluZ2x5IGFuZCBjb250aW51ZSB0aGUgYXV0aGVudGljYXRpb24gYXMKICBpdCBzaG91bGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNikKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgc3VwcG9ydCBmb3IgU0NQIHRyYW5zZmVycywgYmFzZWQgb24gdGhlIGxpYnNzaDIgbGlicmFyeQogIGZvciB0aGUgYWN0dWFsIG5ldHdvcmsgcHJvdG9jb2wgc3R1ZmYuCgogIEFkZGVkIHRoZXNlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9uczoKCiAgICBDVVJMT1BUX1NTSF9BVVRIX1RZUEVTCiAgICBDVVJMT1BUX1NTSF9QVUJMSUNfS0VZRklMRQogICAgQ1VSTE9QVF9TU0hfUFJJVkFURV9LRVlGSUxFCgpWZXJzaW9uIDcuMTYuMCAoMzAgT2N0b2JlciAyMDA2KQoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDYpCi0gRml4ZWQgQ1VSTE9QVF9GQUlMT05FUlJPUiB0byByZXR1cm4gQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBldmVuIGZvciB0aGUKICBjYXNlIHdoZW4gNDAxIG9yIDQwNyBhcmUgcmV0dXJuZWQsICpJRiogbm8gYXV0aCBjcmVkZW50aWFscyBoYXZlIGJlZW4gZ2l2ZW4uCiAgVGhlIENVUkxPUFRfRkFJTE9ORVJST1Igb3B0aW9uIGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlIGZvb2wtcHJvb2YgZm9yIDQwMQogIGFuZCA0MDcgY2FzZXMgd2hlbiBhdXRoIGNyZWRlbnRpYWxzIGlzIGdpdmVuLCBidXQgd2UndmUgbm93IGNvdmVyZWQgdGhpcwogIHNvbWV3aGF0IG1vcmUuCgogIFlvdSBtaWdodCBnZXQgc29tZSBhbW91bnRzIG9mIGhlYWRlcnMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoaXMgc2l0dWF0aW9uIGlzCiAgZGV0ZWN0ZWQsIGxpa2UgZm9yIHdoZW4gYSAiMTAwLWNvbnRpbnVlIiBpcyByZWNlaXZlZCBhcyBhIHJlc3BvbnNlIHRvIGEKICBQT1NUL1BVVCBhbmQgYSA0MDEgb3IgNDA3IGlzIHJlY2VpdmVkIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuCgogIEFkZGVkIHRlc3QgMjgxIHRvIHZlcmlmeSB0aGlzIGNoYW5nZS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDA2KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIGEgbWFqb3IgdXBkYXRlIHdpdGggcGlwZWxpbmluZyBmaXhlcy4gV2UgYWxzbyBubyBsb25nZXIKICByZS11c2UgY29ubmVjdGlvbnMgKGZvciBwaXBlbGluaW5nKSBiZWZvcmUgdGhlIG5hbWUgcmVzb2x2aW5nIGlzIGRvbmUuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNikKLSBOaXIgU29mZmVyIG1hZGUgdGhlIHRlc3RzL2xpYnRlc3QvTWFrZWZpbGUuYW0gdXNlIGEgcHJvcGVyIHZhcmlhYmxlIGZvciBhbGwKICB0aGUgc2luZ2xlIHRlc3QgYXBwbGljYXRpb25zJyBsaW5rIGFuZCBkZXBlbmRlbmNlcywgc28gdGhhdCB5b3UgZWFzaWVyIGNhbgogIG92ZXJyaWRlIHRob3NlIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aGVuIHVzaW5nIG1ha2UuCgotIEFybWVsIEFzc2VsaW4gc2VwYXJhdGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHByb2JsZW1zIGZyb20gcHJvYmxlbXMgd2l0aAogIHJlYWRpbmcgdGhlIChsb2NhbCkgQ0EgY2VydCBmaWxlIHRvIGxldCB1c2VycyBlYXNpZXIgcGlucG9pbnQgdGhlIGFjdHVhbAogIHByb2JsZW0uIENVUkxFX1NTTF9DQUNFUlRfQkFERklMRSAoNzcpIGlzIHRoZSBuZXcgbGliY3VybCBlcnJvciBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDYpCi0gUmVtb3ZlZCB0aGUgInByb3RvY29sLWd1ZXNzaW5nIiBmb3IgVVJMcyB3aXRoIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBGVFBTCiAgb3IgVEVMTkVUIHNpbmNlIHRoZXkgYXJlIHByYWN0aWNhbGx5IG5vbi1leGlzdGFudC4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBvbmx5CiAgdGhyZWUgZGlmZmVyZW50IHByZWZpeGVzIHRoYXQgd291bGQgYXNzdW1lIHRoZSBwcm90b2NvbCBpcyBhbnl0aGluZyBidXQKICBIVFRQLCBhbmQgdGhleSBhcmUgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoICJmdHAuIiwgImRpY3QuIiBvciAibGRhcC4iLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDYpCi0gQnVnIHJlcG9ydCAjMTU3OTE3MSBwb2ludGVkIG91dCBjb2RlIGZsYXdzIGRldGVjdGVkIHdpdGggInByZWZhc3QiLCBhbmQgdGhleQogIHdlcmUgMSAtIGEgdG9vIHNtYWxsIG1lbW9yeSBjbGVhciB3aXRoIG1lbXNldCgpIGluIHRoZSB0aHJlYWRlZCByZXNvbHZlciBhbmQKICAyIC0gYSByYW5nZSBvZiBwb3RlbnRpYWxseSBiYWQgdXNlcyBvZiB0aGUgY3R5cGUgZmFtaWx5IG9mIGlzKigpIGZ1bmN0aW9ucwogIHN1Y2ggYXMgaXNkaWdpdCgpLCBpc2FsbnVtKCksIGlzcHJpbnQoKSBhbmQgbW9yZS4gVGhlIGxhdHRlciBtYWRlIG1lIHN3aXRjaAogIHRvIHVzaW5nIG91ciBvd24gc2V0IG9mIHRoZXNlIGZ1bmN0aW9ucy9tYWNyb3MgdXNpbmcgdXBwZXJjYXNlIGxldHRlcnMsIGFuZAogIHdpdGggc29tZSBleHRyYSBzZXQgb2YgY3JhenkgdHlwZWNhc3RzIHRvIGF2b2lkIG1pc3Rha2luZ2x5IHBhc3NpbmcgaW4KICBuZWdhdGl2ZSBudW1iZXJzIHRvIHRoZSB1bmRlcmx5aW5nIGlzKigpIGZ1bmN0aW9ucy4KCi0gV2l0aCBKZWZmIFBvaGxtZXllcidzIGhlbHAsIEkgZml4ZWQgdGhlIGV4cGlyZSB0aW1lciB3aGVuIHVzaW5nCiAgY3VybF9tdWx0aV9zb2NrZXQoKSBkdXJpbmcgbmFtZSByZXNvbHZlcyB3aXRoIGMtYXJlcyBhbmQgdGhlIExPV19TUEVFRAogIG9wdGlvbnMgbm93IHdvcmsgZmluZSB3aXRoIGN1cmxfbXVsdGlfc29ja2V0KCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgT2N0b2JlciAyMDA2KQotIEFkZGVkIGEgY2hlY2sgaW4gY29uZmlndXJlIHRoYXQgc2ltcGx5IHRyaWVzIHRvIHJ1biBhIHByb2dyYW0gKG5vdCB3aGVuCiAgY3Jvc3MtY29tcGlsaW5nKSBpbiBvcmRlciB0byBkZXRlY3QgcHJvYmxlbXMgd2l0aCBydW4tdGltZSBsaWJyYXJpZXMgdGhhdAogIG90aGVyd2lzZSB3b3VsZCBvY2N1ciB3aGVuIHRoZSBzaXplb2YgdGVzdHMgZm9yIGN1cmxfb2ZmX3Qgd291bGQgcnVuIGFuZAogIHRodXMgYmUgbXVjaCBtb3JlIGNvbmZ1c2luZyB0byB1c2Vycy4gVGhlIGNoZWNrIG9mIGNvdXJzZSBzaG91bGQgcnVuIGFmdGVyCiAgYWxsIGxpYi1jaGVja3MgYXJlIGRvbmUgYW5kIGJlZm9yZSBhbnkgb3RoZXIgdGVzdCBpcyB1c2VkIHRoYXQgd291bGQgcnVuIGFuCiAgZXhlY3V0YWJsZSBidWlsdCBmb3IgdGVzdGluZy1wdXJwb3Nlcy4KCkRhbiBGICgxMyBPY3RvYmVyIDIwMDYpCi0gVGhlIHRhZ2dpbmcgb2YgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIFBPU1QgYm9keSBkYXRhIHNlbnQKICB0byB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGNhbGxiYWNrIGhhcyBiZWVuIGZpeGVkIChpdCB3YXMgZXJyb25lb3VzbHkKICBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBoZWFkZXIpLiAgQSBtZXNzYWdlIHdhcyBhbHNvIGFkZGVkIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sIHRvIHNob3cgd2hlbiBkYXRhIGlzIGJlaW5nIHNlbnQsIGVuYWJsZWQgd2hlbgogIC0tdmVyYm9zZSBpcyB1c2VkLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDYpCi0gU3RhcnRpbmcgbm93LCBhZGRpbmcgYW4gZWFzeSBoYW5kbGUgdG8gYSBtdWx0aSBzdGFjayB0aGF0IHdhcyBhbHJlYWR5IGFkZGVkCiAgdG8gYSBtdWx0aSBzdGFjayB3aWxsIGNhdXNlIENVUkxNX0JBRF9FQVNZX0hBTkRMRSB0byBnZXQgcmV0dXJuZWQuCgotIEplZmYgUG9obG1leWVyIGhhcyBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBzb3VyY2UgY29kZSwKICBhbmQgd2hpbGUgZG9pbmcgc28gaXQgYmVjYW1lIGFwcGFyZW50IHRoYXQgdGhlIGN1cnJlbnQgdGltZW91dCBzeXN0ZW0gZm9yCiAgdGhlIHNvY2tldCBBUEkgcmVhbGx5IHdhcyBhIGJpdCBhd2t3YXJkIHNpbmNlIGl0IGJlY29tZSBxdWl0ZSBzb21lIHdvcmsgdG8KICBiZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgdGltZW91dCBzZXQuCgogIEplZmYgdGhlbiBwcm92aWRlZCB0aGUgbmV3IENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gdGhhdCBpcyB5ZXQgYW5vdGhlcgogIGNhbGxiYWNrIHRoZSBhcHAgY2FuIHNldCB0byBnZXQgdG8ga25vdyB3aGVuIHRoZSBnZW5lcmFsIHRpbWVvdXQgdGltZQogIGNoYW5nZXMgYW5kIHRodXMgZm9yIGFuIGFwcGxpY2F0aW9uIGxpa2UgaGlwZXJmaWZvLmMgaXQgbWFrZXMgZXZlcnl0aGluZyBhCiAgbG90IGVhc2llciBhbmQgbmljZXIuIFRoZXJlJ3MgYSBDVVJMTU9QVF9USU1FUkRBVEEgb3B0aW9uIHRvbyBvZiBjb3Vyc2UgaW4KICBnb29kIG9sZCBsaWJjdXJsIHRyYWRpdGlvbi4KCiAgSmVmZiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIGNvZGUgdG8gdXNlIHRoaXMgbmV3cy4KCkRhbmllbCAoOSBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIHNlY29uZCB0ZXN0IGNhc2UgKHBvc3RlZCBTdW4sIDA4IE9jdCAyMDA2KSBjb252ZXJ0ZWQgdG8gdGVzdAogIGNhc2UgNTM1IGFuZCBpdCBub3cgcnVucyBmaW5lLiBBZ2FpbiBhIHByb2JsZW0gd2l0aCB0aGUgcGlwZWxpbmluZyBjb2RlIG5vdAogIHRha2luZyBhbGwgcG9zc2libGUgKGVycm9yKSBjb25kaXRpb25zIGludG8gYWNjb3VudC4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIGhhbmdpbmcgdGVzdCBjYXNlIChwb3N0ZWQgV2VkLCAwNCBPY3QgMjAwNikgd2FzIGNvbnZlcnRlZCB0bwogIHRlc3QgY2FzZSA1MzMgYW5kIHRoZSB0ZXN0IG5vdyBydW5zIGZpbmUuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYW4gZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IGNyYXNoZWQgQ1ZTIGxpYmN1cmwKICBidXQgdGhhdCB3b3JrZWQgbmljZWx5IGluIDcuMTUuNS4gSSBjb252ZXJ0ZWQgaXQgaW50byB0ZXN0IGNhc2UgNTMyIGFuZAogIGZpeGVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNikKLSBSZW1vdmVkIGEgZmV3IG90aGVyIG5vLWxvbmdlciBwcmVzZW50IG9wdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUuCgotIFN1cHBvcnQgZm9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgd2FzIHJlbW92ZWQuIEhlcmUncyB3aHk6CgogIG8gVGhlIHJlY2VudCBtdWx0aSBpbnRlcmZhY2UgY2hhbmdlcyBicm9rZSBpdCBhbmQgdGhlIGRlc2lnbiBvZiB0aGUgM3JkIHBhcnR5CiAgICB0cmFuc2ZlcnMgbWFkZSBpdCB2ZXJ5IGhhcmQgdG8gZml4IHRoZSBwcm9ibGVtcwogIG8gSXQgd2FzIHN0aWxsIGJsb2NraW5nIGFuZCB0aHVzIG5hc3R5IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgbyBJdCB3YXMgYSBsb3Qgb2YgZXh0cmEgY29kZSBmb3IgYSB2ZXJ5IHJhcmVseSB1c2VkIGZlYXR1cmUKICBvIEl0IGRpZG4ndCB1c2UgdGhlIHNhbWUgY29kZSBhcyBmb3IgInBsYWluIiBGVFAgdHJhbnNmZXJzLCBzbyBpdCBkaWRuJ3Qgd29yawogICAgZmluZSBmb3IgSVB2NiBhbmQgaXQgZGlkbid0IHByb3Blcmx5IHJlLXVzZSBjb25uZWN0aW9ucyBhbmQgbW9yZQogIG8gVGhlcmUncyBub2JvZHkgYXJvdW5kIHdobydzIHdpbGxpbmcgdG8gd29yayBvbiBhbmQgaW1wcm92ZSB0aGUgZXhpc3RpbmcKICAgIGNvZGUKCiAgVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhpcmQgcGFydHkgdHJhbnNmZXJzIGFyZSBiYW5uZWQgZm9yZXZlciwgb25seSB0aGF0CiAgdGhleSBuZWVkIHRvIGJlIGRvbmUgYmV0dGVyIGlmIHRoZXkgYXJlIHRvIGJlIHJlLWFkZGVkIGluIHRoZSBmdXR1cmUuCgogIFRoZSBDVVJMT1BUX1NPVVJDRV8qIG9wdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGliIGFuZCBzbyBhcmUgdGhlIC0tM3AqCiAgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gRm9yIHRoaXMgcmVhc29uLCBJIGFsc28gYnVtcGVkIHRoZQogIHZlcnNpb24gaW5mbyBmb3IgdGhlIGxpYi4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDYpCi0gUmVwb3J0ZWQgaW4gIzE1NjE0NzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApLCBsaWJjdXJsCiAgd291bGQgY3Jhc2ggaWYgYSBiYWQgZnVuY3Rpb24gc2VxdWVuY2Ugd2FzIHVzZWQgd2hlbiBzaHV0dGluZyBkb3duIGFmdGVyCiAgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAoaS5lIHVzaW5nIGVhc3lfY2xlYW51cCBhZnRlciBtdWx0aV9jbGVhbnVwKSBzbwogIHByZWNhdXRpb25zIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbnkgbW9yZSAtIHRlc3QgY2FzZSA1MjkKICB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNikKLSBUaGUgVVJMIGluIHRoZSBjb29raWUgamFyIGZpbGUgaXMgbm93IGNoYW5nZWQgc2luY2UgaXQgd2FzIGdpdmluZyBhIDQwNC4KICBSZXBvcnRlZCBieSBUaW1vdGh5IFN0b25lLiBUaGUgbmV3IFVSTCB3aWxsIHRha2UgdGhlIHZpc2l0b3IgdG8gYSBjdXJsIHdlYgogIHNpdGUgbWlycm9yIHdpdGggdGhlIGRvY3VtZW50LgoKRGFuaWVsICgyNCBTZXB0ZW1iZXIgMjAwNikKLSBCZXJuYXJkIExlYWsgZml4ZWQgY29uZmlndXJlIC0td2l0aC1nc3NhcGktbGlicy4KCi0gQ29yeSBOZWxzb24gbWFkZSBsaWJjdXJsIHVzZSB0aGUgV1NBUG9sbCgpIGZ1bmN0aW9uIGlmIGJ1aWx0IGZvciBXaW5kb3dzCiAgVmlzdGEgKF9XSU4zMl9XSU5OVCA+PSAweDA2MDApCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDA2KQotIE1pa2UgUHJvdHRzIGFkZGVkIC0tZnRwLXNzbC1jb250cm9sIHRvIG1ha2UgY3VybCB1c2UgRlRQLVNTTCwgYnV0IG9ubHkKICBlbmNyeXB0IHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYW5kIHVzZSB0aGUgZGF0YSBjb25uZWN0aW9uICJwbGFpbiIuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIFNPQ0tTWzQ1XSBjb2RlIHdvcmsgYmV0dGVyCiAgYXMgaXQgbm93IHdpbGwgcmVhZCB0aGUgZnVsbCBkYXRhIHNlbnQgZnJvbSBzZXJ2ZXJzLiBUaGUgU09DS1MtcmVsYXRlZCBjb2RlCiAgd2FzIGFsc28gbW92ZWQgdG8gdGhlIG5ldyBsaWIvc29ja3MuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgdGVzdCBjYXNlIDUzMSBpbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCBidWcgcmVwb3J0ICMxNTYxNDcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApIHRoYXQgaXMgc2FpZCB0byBjcmFzaCB3aGVuIGFuCiAgRlRQIHVwbG9hZCBmYWlscyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIEl0IGRpZCBub3QsIGJ1dCBJIG1hZGUgYSBmYWlsZWQKICB1cGxvYWQgc3RpbGwgYXNzdW1lIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gdG8gYmUgZmluZS4KCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBwcm9ibGVtcyB3aGVuIHlvdSBnYXZlIGEgcHJveHkgVVJMIHdpdGggdXNlciBuYW1lIGFuZAogIGVtcHR5IHBhc3N3b3JkIG9yIG5vIHBhc3N3b3JkIGF0IGFsbC4gVGVzdCBjYXNlIDI3OCBhbmQgMjc5IHdlcmUgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIGRvY3MvZXhhbXBsZXMvMTAtYXQtYS10aW1lLmMgYnkgTWljaGFlbCBXYWxsbmVyCgotIEFkZGVkIGRvY3MvZXhhbXBsZXMvaGlwZXJmaWZvLmMgYnkgSmVmZiBQb2hsbWV5ZXIKCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDYpCi0gRml4ZWQgbXkgYnJlYWthZ2UgZnJvbSBlYXJsaWVyIHRvZGF5IHNvIHRoYXQgZG9pbmcgY3VybF9lYXN5X2NsZWFudXAoKSBvbiBhCiAgaGFuZGxlIHRoYXQgaXMgcGFydCBvZiBhIG11bHRpIGhhbmRsZSBmaXJzdCByZW1vdmVzIHRoZSBoYW5kbGUgZnJvbSB0aGUKICBzdGFjay4KCi0gQWRkZWQgQ1VSTE9QVF9TU0xfU0VTU0lPTklEX0NBQ0hFIGFuZCAtLW5vLXNlc3Npb25pZCB0byBkaXNhYmxlIFNTTAogIHNlc3Npb24tSUQgcmUtdXNlIG9uIGRlbWFuZCBzaW5jZSB0aGVyZSBvYnZpb3VzbHkgYXJlIGJyb2tlbiBzZXJ2ZXJzIG91dAogIHRoZXJlIHRoYXQgbWlzYmVoYXZlIHdpdGggc2Vzc2lvbi1JRHMgdXNlZC4KCi0gSmVmZiBQb2hsbWV5ZXIgcHJlc2VudGVkIGEgKm11bHRpX3NvY2tldCgpLXVzaW5nIHByb2dyYW0gdGhhdCBleHBvc2VkIGEKICBwcm9ibGVtIHdpdGggaXQgKFNJR1NFR1Ytc3R5bGUpLiBJdCBjbGVhcmx5IHNob3dlZCB0aGF0IHRoZSBleGlzdGluZwogIHNvY2tldC1zdGF0ZSBhbmQgc3RhdGUtZGlmZmVyZW5jZSBmdW5jdGlvbiB3YXNuJ3QgZ29vZCBlbm91Z2ggc28gSSByZXdyb3RlCiAgaXQgYW5kIGNvdWxkIHRoZW4gcmUtcnVuIEplZmYncyBwcm9ncmFtIHdpdGhvdXQgYW55IGNyYXNoLiBUaGUgcHJldmlvdXMKICB2ZXJzaW9uIGNsZWFybHkgY291bGQgbWlzcyB0byB0ZWxsIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGEgaGFuZGxlIGNoYW5nZWQKICBmcm9tIHVzaW5nIG9uZSBzb2NrZXQgdG8gdXNpbmcgYW5vdGhlci4KCiAgV2hpbGUgSSB3YXMgYXQgaXQgKGFzIEkgY291bGQgdXNlIHRoaXMgYXMgYSBtZWFucyB0byB0cmFjayB0aGlzIHByb2JsZW0KICBkb3duKSwgSSd2ZSBub3cgYWRkZWQgYSAnbWFnaWMnIG51bWJlciB0byB0aGUgZWFzeSBoYW5kbGUgc3RydWN0IHRoYXQgaXMKICBpbml0ZWQgYXQgY3VybF9lYXN5X2luaXQoKSB0aW1lIGFuZCBjbGVhcmVkIGF0IGN1cmxfZWFzeV9jbGVhbnVwKCkgdGltZSB0aGF0CiAgd2UgY2FuIHVzZSBpbnRlcm5hbGx5IHRvIGRldGVjdCB0aGF0IGFuIGVhc3kgaGFuZGxlIHNlZW1zIHRvIGJlIGZpbmUsIG9yIGF0CiAgbGVhc3Qgbm90IGNsb3NlZCBvciBmcmVlZCAoZnJlZWluZyBpbiBkZWJ1ZyBidWlsZHMgZmlsbCB0aGUgYXJlYSB3aXRoIDB4MTMKICBieXRlcyBidXQgaW4gbm9ybWFsIGJ1aWxkcyB3ZSBjYW4gb2YgY291cnNlIG5vdCBhc3N1bWUgYW55IHBhcnRpY3VsYXIgZGF0YQogIGluIHRoZSBmcmVlZCBhcmVhcykuCgpEYW5pZWwgKDkgU2VwdGVtYmVyIDIwMDYpCi0gTWljaGVsZSBCaW5pIGZpeGVkIGhvdyB0aGUgaG9zdG5hbWUgaXMgcHV0IGluIE5UTE0gcGFja2FnZXMuIEFzIHNlcnZlcnMKICBkb24ndCBleHBlY3QgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIHdlIG5lZWQgdG8gY3V0IHRoZW0gb2ZmIGF0IHRoZSBmaXJzdCBkb3QuCgotIFBldGVyIFN5bHZlc3RlciBjbGVhbmVkIHVwIGFuZCBmaXhlZCB0aGUgZ2V0c29ja25hbWUoKSB1c2VzIGluIGZ0cC5jLiBTb21lCiAgb2YgdGhlbSBjYW4gYmUgY29tcGxldGV0bHkgcmVtb3ZlZCB0aG91Z2guLi4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNikKLSBSYXZpIFByYXRhcCBhbmQgSSBoYXZlIGltcGxlbWVudGVkIEhUVFAgUGlwZWxpbmluZyBzdXBwb3J0LiBFbmFibGUgaXQgZm9yIGEKICBtdWx0aSBoYW5kbGUgdXNpbmcgQ1VSTE1PUFRfUElQRUxJTklORyBhbmQgYWxsIEhUVFAgY29ubmVjdGlvbnMgZG9uZSBvbiB0aGF0CiAgaGFuZGxlIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBwaXBlbGluZWQgaW5zdGVhZCBvZiBkb25lIGluIHBhcmFsbGVsbCBhcwogIHRoZXkgYXJlIHBlcmZvcm1lZCBvdGhlcndpc2UuCgogIEFzIGEgc2lkZS1lZmZlY3QgZnJvbSB0aGlzIHdvcmssIGNvbm5lY3Rpb25zIGFyZSBub3cgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kKICBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSwgc28gaWYgeW91IHVzZSBOIGVhc3kgaGFuZGxlcyBmb3IgdHJhbnNmZXJzLAogIGVhY2ggb2YgdGhlbSBjYW4gcGljayB1cCBhbmQgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHVzZWQgYnkKICBhbnkgb2YgdGhlIGhhbmRsZXMsIGJlIGl0IHRoZSBzYW1lIG9yIG9uZSBvZiB0aGUgb3RoZXJzLgoKICBUaGlzIHNlcGFyYXRpb24gb2YgdGhlIHRpZ2h0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbm5lY3Rpb25zIGFuZCBlYXN5CiAgaGFuZGxlcyBpcyBtb3N0IG5vdGljYWJsZSB3aGVuIHlvdSBjbG9zZSBlYXN5IGhhbmRsZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBpbgogIGEgbXVsdGkgaGFuZGxlIGFuZCBjaGVjayBhbW91bnQgb2YgdXNlZCBtZW1vcnkgb3Igd2F0Y2ggdGhlIGRlYnVnIG91dHB1dCwgYXMKICB0aGVyZSBhcmUgdGltZXMgd2hlbiBsaWJjdXJsIHdpbGwga2VlcCB0aGUgZWFzeSBoYW5kbGUgYXJvdW5kIGZvciBhIHdoaWxlCiAgbG9uZ2VyIHRvIGJlIGFibGUgdG8gY2xvc2UgaXQgcHJvcGVybHkuIExpa2UgZm9yIHNlbmRpbmcgUVVJVCB0byBjbG9zZSBkb3duCiAgYW4gRlRQIGNvbm5lY3Rpb24uCgogIFRoaXMgaXMgYSBtYWpvciBjaGFuZ2UuCgpEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDYpCi0gRG1pdHJ5IFJlY2hraW4gKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NTE0MTIpIHByb3ZpZGVkIGEKICBwYXRjaCB0aGF0IHdoaWxlIG5vdCBmaXhpbmcgdGhpbmdzIHZlcnkgbmljZWx5LCBpdCBkb2VzIG1ha2UgdGhlIFNPQ0tTNQogIHByb3h5IGNvbm5lY3Rpb24gc2xpZ2h0bHkgYmV0dGVyIGFzIGl0IG5vdyBhY2tub3dsZWRnZXMgdGhlIHRpbWVvdXQgZm9yCiAgY29ubmVjdGlvbiBhbmQgaXQgbm8gbG9uZ2VyIHNlZ2ZhdWx0cyBpbiB0aGUgY2FzZSB3aGVuIFNPQ0tTIHJlcXVpcmVzCiAgYXV0aGVudGljYXRpb24gYW5kIHlvdSBkaWQgbm90IHNwZWNpZnkgdXNlcm5hbWU6cGFzc3dvcmQuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgZm91bmQgYW5kIGZpeGVkIGEgbXVsdGkgaW50ZXJmYWNlIGZsYXcgd2hlbiB1c2luZyBhc3luY2gKICBuYW1lIHJlc29sdmVzLiBJdCBjb3VsZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIHN0YXRlLgoKR2lzbGUgKDI5IEF1Z3VzdCAyMDA2KQotIEFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIE1TLURPUyBjb21waWxlcnMgKGRlc2lkZXMgZGpncHApLiBBbGwgTVMtRE9TCiAgY29tcGlsZXIgbm93IHVzZXMgdGhlIHNhbWUgY29uZmlnLmRvcyBmaWxlIChyZW5hbWVkIHRvIGNvbmZpZy5oIGJ5CiAgbWFrZSkuIGxpYmN1cmwgbm93IGJ1aWxkcyBmaW5lIHVzaW5nIFdhdGNvbSBhbmQgTWV0YXdhcmUncyBIaWdoLUMKICB1c2luZyB0aGUgV2F0dC0zMiB0Y3AvaXAtc3RhY2suCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxPUFRfU09DS09QVEZVTkNUSU9OIGFuZCBDVVJMT1BUX1NPQ0tPUFREQVRBIHRvCiAgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldCB0aGVpciBvd24gc29ja2V0IG9wdGlvbnMuCgpEYW5pZWwgKDI1IEF1Z3VzdCAyMDA2KQotIEFybWVsIEFzc2VsaW4gcmVwb3J0ZWQgdGhhdCB0aGUgJ3J1bm5pbmdfaGFuZGxlcycgY291bnRlciB3YXNuJ3QgdXBkYXRlZAogIHByb3Blcmx5IGlmIHlvdSByZW1vdmVkIGEgImxpdmUiIGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIHdpdGgKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKS4KCkRhbmllbCAoMjIgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSByZW1haW5pbmcgbWlzdGFrZSBmcm9tIHRoZSBBdWd1c3QgMTkgVFlQRSBjaGFuZ2UuCgotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIEFsbG93U2VydmVyQ29ubmVjdCgpIGluIHRoZSBGVFAKICBjb2RlIHdoZW4gZG9pbmcgcHVyZSBJUHY2IEVQUlQgY29ubmVjdGlvbnMuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA2KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgQXJtZWwgQXNzZWxpbiwgdGhlIEZUUCBjb2RlIG5vIGxvbmdlciByZS1pc3N1ZXMgdGhlIFRZUEUKICBjb21tYW5kIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gdW5sZXNzIGl0IGhhcyB0by4KCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBhIGNyYXNoIGluIHRoZSBGVFAgY29kZSB3aGVuIHVzaW5nIFNJTkdMRUNXRCBtb2RlIGFuZAogIGZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KCi0gQW5kcmV3IEJpZ2dzIHBvaW50ZWQgb3V0IGEgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBmbGF3IHdoZXJlIGxpYmN1cmwgZGlkbid0CiAgc2VuZCB0aGUgd2hvbGUgcmVxdWVzdCBhdCBvbmNlLCBldmVuIHRob3VnaCB0aGUgRXhwZWN0OiBoZWFkZXIgd2FzIGRpc2FibGVkCiAgYnkgdGhlIGFwcGxpY2F0aW9uLiBBbiBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UgaXMgYWxzbyB0aGF0IHNtYWxsICg8IDEwMjQKICBieXRlcykgUE9TVHMgYXJlIG5vdyBhbHdheXMgc2VudCB3aXRob3V0IEV4cGVjdDogaGVhZGVyIHNpbmNlIHdlIGRlZW0gaXQKICBtb3JlIGNvc3RseSB0byBib3RoZXIgYWJvdXQgdGhhdCB0aGFuIHRoZSByaXNrIHRoYXQgd2Ugc2VuZCB0aGUgZGF0YSBpbgogIHZhaW4uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBtYWRlIHRoZSBDVVJMT1BUX1BSRVFVT1RFIG9wdGlvbiB3b3JrIGZpbmUgZXZlbiB3aGVuCiAgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IHRydWUuIFBSRVFVT1RFIGlzIHRoZW4gcnVuIHJvdWdobHkgYXQgdGhlIHNhbWUgcGxhY2UKICBpbiB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhcyBpdCB3b3VsZCBoYXZlIHJ1biBpZiB0aGVyZSB3b3VsZCd2ZSBiZWVuIGEKICB0cmFuc2Zlci4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNikKLSBGaXhlZCBhIGZsYXcgaW4gdGhlICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgdHJlYXRtZW50LiBJZiB5b3UgZGlkIHR3byBQT1NUcwogIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCBhbGxvd2VkIHRoZSBmaXJzdCB0byB1c2UgdGhhdCBoZWFkZXIsIHlvdQogIGNvdWxkIG5vdCBkaXNhYmxlIGl0IGZvciB0aGUgc2Vjb25kIHJlcXVlc3QuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDYpCi0gRG9tZW5pY28gQW5kcmVvbGZvdW5kIGEgcXVpY2sgYnVpbGQgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYmVjYXVzZQogIHNyYy9jb25maWcuaC5pbiB3YXMgbm90IGEgcHJvcGVyIGR1cGxjYXRlIG9mIGxpYi9jb25maWcuaC5pbiB3aGljaCBpdAogIHNob3VsZCd2ZSBiZWVuIGFuZCB0aGlzIHdhcyBkdWUgdG8gdGhlIG1ha2V0Z3ogc2NyaXB0IG5vdCBkb2luZyB0aGUgY3AKICBwcm9wZXJseS4KClZlcnNpb24gNy4xNS41ICg3IEF1Z3VzdCAyMDA2KQoKRGFuaWVsICgyIEF1Z3VzdCAyMDA2KQotIE1hcmsgTGVudGN6bmVyIGZpeGVkIGhvdyBsaWJjdXJsIHdhcyBub3QgcHJvcGVybHkgZG9pbmcgY2h1bmtlZCBlbmNvZGluZwogIGlmIHRoZSBoZWFkZXIgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiB3YXMgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbi4KICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTMxODM4CgpEYW5pZWwgKDEgQXVndXN0IDIwMDYpCi0gTWFjaWVqIEthcnBpdWsgZml4ZWQgYSBjcmFzaCB0aGF0IHdvdWxkIG9jY3VyIGlmIHdlIHBhc3NlZCBDdXJsX3N0cmVycm9yKCkKICBhbiB1bmtub3duIGVycm9yIG51bWJlciBvbiBnbGliYyBzeXN0ZW1zLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzIyODkKCkRhbmllbCAoMzEgSnVseSAyMDA2KQotICpBTEVSVCogY3VybF9tdWx0aV9zb2NrZXQoKSBhbmQgY3VybF9tdWx0aV9zb2NrZXRfYWxsKCkgZ290IG1vZGlmaWVkCiAgcHJvdG90eXBlczogdGhleSBib3RoIG5vdyBwcm92aWRlIHRoZSBudW1iZXIgb2YgcnVubmluZyBoYW5kbGVzIGJhY2sgdG8gdGhlCiAgY2FsbGluZyBmdW5jdGlvbi4gSXQgbWFrZXMgdGhlIGZ1bmN0aW9ucyByZXNlbWJsZSB0aGUgZ29vZCBvbGQKICBjdXJsX211bHRpX3BlcmZvcm0oKSBtb3JlIGFuZCBwcm92aWRlcyBhIG5pY2Ugd2F5IHRvIGtub3cgd2hlbiB0aGUgbXVsdGkKICBoYW5kbGUgZ29lcyBlbXB0eS4KCiAgQUxFUlQyOiBkb24ndCB1c2UgdGhlIGN1cmxfbXVsdGlfc29ja2V0KigpIGZ1bmN0aW9uYWxpdHkgaW4gYW55dGhpbmcKICBwcm9kdWN0aW9uLWxpa2UgdW50aWwgSSBzYXkgaXQncyBzb21ld2hhdCBzZXR0bGVkLCBhcyBJIHN1c3BlY3QgdGhlcmUgbWlnaHQKICBiZSBzb21lIGZ1cnRoZXIgQVBJIGNoYW5nZXMgYmVmb3JlIEknbSBkb25lLi4uCgpEYW5pZWwgKDI4IEp1bHkgMjAwNikKLSBZdmVzIExlamV1bmUgZml4ZWQgc28gdGhhdCByZXBsYWNpbmcgQ29udGVudC1UeXBlOiB3aGVuIGRvaW5nIG11bHRpcGFydAogIGZvcm1wb3N0cyB3b3JrIGV4YWN0bHkgdGhlIHdheSB5b3Ugd2FudCBpdCAoYW5kIHRoZSB3YXkgeW91J2QgYXNzdW1lIGl0CiAgd29ya3MpLgoKRGFuaWVsICgyNyBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgLS1mdHAtc3NsLXJlcWQgd2hpY2ggbWFrZXMgY3VybCAqcmVxdWlyZSogU1NMIGZvciBib3RoCiAgY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9uLCBhcyB0aGUgZXhpc3RpbmcgLS1mdHAtc3NsIG9wdGlvbiBvbmx5IHJlcXVlc3RzCiAgaXQuCgotIFtIaXBlci1yZWxhdGVkIHdvcmtdIEFkZGVkIGEgZnVuY3Rpb24gY2FsbGVkIGN1cmxfbXVsdGlfYXNzaWduKCkgdGhhdCB3aWxsCiAgc2V0IGEgcHJpdmF0ZSBwb2ludGVyIGFkZGVkIHRvIHRoZSBpbnRlcm5hbCBsaWJjdXJsIGhhc2ggdGFibGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgc29ja2V0IHBhc3NlZCBpbiB0byB0aGlzIGZ1bmN0aW9uOgoKICBDVVJMTWNvZGUgY3VybF9tdWx0aV9hc3NpZ24oQ1VSTE0gKm11bHRpX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zb2NrZXRfdCBzb2NrZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNvY2twKTsKCiAgJ3NvY2twJyBiZWluZyBhIGN1c3RvbSBwb2ludGVyIHNldCBieSB0aGUgYXBwbGljYXRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoCiAgdGhpcyBzb2NrZXQuIFRoZSBzb2NrZXQgaGFzIHRvIGJlIGFscmVhZHkgZXhpc3RpbmcgYW5kIGluLXVzZSBieSBsaWJjdXJsLAogIGxpa2UgaGF2aW5nIGFscmVhZHkgY2FsbGVkIHRoZSBjYWxsYmFjayB0ZWxsaW5nIGFib3V0IGl0cyBleGlzdGFuY2UuCgogIFRoZSBzZXQgaGFzaHAgcG9pbnRlciB3aWxsIHRoZW4gYmUgcGFzc2VkIG9uIHRvIHRoZSBjYWxsYmFjayBpbiB1cGNvbWluZwogIGNhbGxzIHdoZW4gdGhpcyBzYW1lIHNvY2tldCBpcyB1c2VkIChpbiB0aGUgYnJhbmQgbmV3ICdzb2NrZXRwJyBhcmd1bWVudCkuCgpEYW5pZWwgKDI2IEp1bHkgMjAwNikKLSBEYW4gTmVsc29uIGFkZGVkIHRoZSBDVVJMT1BUX0ZUUF9BTFRFUk5BVElWRV9UT19VU0VSIGxpYmN1cmwgb3B0aW9uIGFuZCBjdXJsCiAgdG9vbCBvcHRpb24gbmFtZWQgLS1mdHAtYWx0ZXJuYXRpdmUtdG8tdXNlci4gSXQgcHJvdmlkZXMgYSBtZWFuIHRvIHNlbmQgYQogIHBhcnRpY3VsYXIgY29tbWFuZCBpZiB0aGUgbm9ybWFsIFVTRVIvUEFTUyBhcHByb2FjaCBmYWlscy4KCi0gTWljaGFlbCBKZXJyaXMgYWRkZWQgbWFnaWMgdGhhdCBidWlsZHMgbGliL2N1cmxsaWIudmNwcm9qIGF1dG9tYXRpY2FsbHkgZm9yCiAgbmV3ZXIgTVNWQy4KCkRhbmllbCAoMjUgSnVseSAyMDA2KQotIEdlb3JnIEhvcm4gbWFkZSB0aGUgdHJhbnNmZXIgdGltZW91dCBlcnJvciBtZXNzYWdlIGluY2x1ZGUgbW9yZSBkZXRhaWxzLgoKRGFuaWVsICgyMCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBidWlsZCBlcnJvciB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgd2l0aCBIVFRQIGRpc2FibGVkLAogIHByb2JsZW0gYWRkZWQgd2l0aCB0aGUgY3VybF9mb3JtZ2V0KCkgcGF0Y2guCgpEYW5pZWwgKDE3IEp1bHkgMjAwNikKLSBKYXJpIFN1bmRlbGwgZGlkIHNvbWUgZXhjZWxsZW50IHJlc2VhcmNoIGFuZCBidWcgdHJhY2tpbmcsIGZpZ3VyZWQgb3V0IHRoYXQKICB3ZSBkaWQgd3JvbmcgYW5kIHBhdGNoZWQgaXQ6IFdoZW4gbm9kZXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHNwbGF5IHRyZWUsCiAgYW5kIHdlIGRpZG4ndCBwcm9wZXJseSByZW1vdmUgaXQgZnJvbSB0aGUgc3BsYXkgdHJlZSB3aGVuIGFuIGVhc3kgaGFuZGxlIHdhcwogIHJlbW92ZWQgZnJvbSBhIG11bHRpIHN0YWNrIGFuZCB0aHVzIHdlIGNvdWxkIHdyb25nbHkgbGVhdmUgYSBub2RlIGluIHRoZQogIHNwbGF5IHRyZWUgcG9pbnRpbmcgdG8gKGJhZCkgbWVtb3J5LgoKRGFuaWVsICgxNCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBmbGF3IHdoZXJlIHRoZSBDUkxGIGNvdW50ZXIgd2Fzbid0IHByb3Blcmx5IGNsZWFyZWQKICBmb3IgRlRQIEFTQ0lJIHRyYW5zZmVycy4KCkRhbmllbCAoOCBKdWx5IDIwMDYpCi0gQXRlcyBHb3JhbCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwncyBjb29raWUgcGFyc2VyIGRpZCBjYXNlIGluc2Vuc2l0aXZlCiAgc3RyaW5nIGNvbXBhcmlzb25zIG9uIHRoZSBwYXRoIHdoaWNoIGlzIGluY29ycmVjdCBhbmQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0CiAgZml4ZXMgdGhpcy4gSSBlZGl0ZWQgdGVzdCBjYXNlIDggdG8gaW5jbHVkZSBkZXRhaWxzIHRoYXQgdGVzdCBmb3IgdGhpcy4KCi0gSW5nbWFyIFJ1bmdlIHByb3ZpZGVkIGEgc291cmNlIHNuaXBwZXQgdGhhdCBjYXVzZWQgYSBjcmFzaC4gVGhlIHJlYXNvbiBmb3IKICB0aGUgY3Jhc2ggd2FzIHRoYXQgbGliY3VybCBpbnRlcm5hbGx5IHdhcyBhIGJpdCBjb25mdXNlZCBhYm91dCB3aG8gb3duZWQgdGhlCiAgRE5TIGNhY2hlIGF0IGFsbCB0aW1lcyBzbyBpZiB5b3UgY3JlYXRlZCBhbiBlYXN5IGhhbmRsZSB0aGF0IHVzZXMgYSBzaGFyZWQKICBETlMgY2FjaGUgYW5kIGFkZGVkIHRoYXQgdG8gYSBtdWx0aSBoYW5kbGUgaXQgd291bGQgY3Jhc2guIE5vdyB3ZSBrZWVwIG1vcmUKICBjYXJlZnVsIGludGVybmFsIHRyYWNrIG9mIGV4YWN0bHkgd2hhdCBraW5kIG9mIEROUyBjYWNoZSBlYWNoIGVhc3kgaGFuZGxlCiAgdXNlczogTm9uZSwgUHJpdmF0ZSAoYWxsb2NhdGVkIGZvciBhbmQgdXNlZCBvbmx5IGJ5IHRoaXMgc2luZ2xlIGhhbmRsZSksCiAgU2hhcmVkIChwb2ludHMgdG8gYSBjYWNoZSBoZWxkIGJ5IGEgc2hhcmVkIG9iamVjdCksIEdsb2JhbCAocG9pbnRzIHRvIHRoZQogIGdsb2JhbCBjYWNoZSkgb3IgTXVsdGkgKHBvaW50cyB0byB0aGUgY2FjaGUgd2l0aGluIHRoZSBtdWx0aSBoYW5kbGUgdGhhdCBpcwogIGF1dG9tYXRpY2FsbHkgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kgaGFuZGxlcyB0aGF0IGFyZSBhZGRlZCB3aXRoIHByaXZhdGUKICBjYWNoZXMpLgoKRGFuaWVsICg0IEp1bHkgMjAwNikKLSBUb3NoaXl1a2kgTWFlemF3YSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgeW91IGNvdWxkbid0IG92ZXJyaWRlIHRoZQogIFByb3h5LUNvbm5lY3Rpb246IGhlYWRlciB3aGVuIHVzaW5nIGEgcHJveHkgYW5kIG5vdCBkb2luZyBDT05ORUNULgoKRGFuaWVsICgyNCBKdW5lIDIwMDYpCi0gTWljaGFlbCBXYWxsbmVyIGFkZGVkIGN1cmxfZm9ybWdldCgpLCB3aGljaCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZXh0cmFjdAogIChzZXJpYWxpc2UpIGEgcHJldmlvdXNseSBidWlsdCBmb3JtcG9zdCAoYXMgd2l0aCBjdXJsX2Zvcm1hZGQoKSkuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNikKLSBBcnZlIEtudWRzZW4gZm91bmQgYSBmbGF3IGluIGN1cmxfbXVsdGlfZmRzZXQoKSBmb3Igc3lzdGVtcyB3aGVyZQogIGN1cmxfc29ja2V0X3QgaXMgdW5zaWduZWQgKGxpa2UgV2luZG93cykgdGhhdCBjb3VsZCBjYXVzZSBpdCB0byB3cm9uZ2x5CiAgcmV0dXJuIGEgbWF4IGZkIG9mIC0xLgoKRGFuaWVsICgyMCBKdW5lIDIwMDYpCi0gUGV0ZXIgU2lsdmEgaW50cm9kdWNlZCBDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZAogIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UgdGhhdCBsaW1pdCB0aGEgbWF4aW11bSByYXRlIGxpYmN1cmwgaXMgYWxsb3dlZAogIHRvIHNlbmQgb3IgcmVjZWl2ZSBkYXRhLiBUaGlzIGtpbmQgb2YgYWRkcyB0aGUgdGhlIGNvbW1hbmQgbGluZSB0b29sJ3MKICBvcHRpb24gLS1saW1pdC1yYXRlIHRvIHRoZSBsaWJyYXJ5LgoKICBUaGUgcmF0ZSBsaW1pdGluZyBsb2dpYyBpbiB0aGUgY3VybCBhcHAgaXMgbm93IHJlbW92ZWQgYW5kIGlzIGluc3RlYWQKICBwcm92aWRlZCBieSBsaWJjdXJsIGl0c2VsZi4gVHJhbnNmZXIgcmF0ZSBsaW1pdGluZyB3aWxsIG5vdyBhbHNvIHdvcmsgZm9yIC1kCiAgYW5kIC1GLCB3aGljaCBpdCBkaWRuJ3QgYmVmb3JlLgoKRGFuaWVsICgxOSBKdW5lIDIwMDYpCi0gTWFkZSAtSyBvbiBhIGZpbGUgdGhhdCBjb3VsZG4ndCBiZSByZWFkIGNhdXNlIGEgd2FybmluZyB0byBiZSBkaXNwbGF5ZWQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNikKLSBEYW4gRmFuZHJpY2ggaW1wbGVtZW50ZWQgLS1lbmFibGUtaGlkZGVuLXN5bWJvbHMgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUKICAtZnZpc2liaWxpdHk9aGlkZGVuIG9uIGdjYyA+PSA0LjAuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGxpYmN1cmwKICBiaW5hcnkgYW5kIHNwZWVkcyB1cCBkeW5hbWljIGxpbmtpbmcgYnkgaGlkaW5nIGFsbCB0aGUgaW50ZXJuYWwgc3ltYm9scyBmcm9tCiAgdGhlIHN5bWJvbCB0YWJsZS4KClZlcnNpb24gNy4xNS40ICgxMiBKdW5lIDIwMDYpCgpEYW5pZWwgKDggSnVuZSAyMDA2KQotIEJyaWFuIERlc3NlbnQgZml4ZWQgdGhlIGNvZGUgZm9yIGN5Z3dpbiBpbiB0aHJlZSBkaXN0aW5jdCB3YXlzOgoKICBUaGUgZmlyc3QgbW9kaWZpZXMge2xpYixzcmN9L3NldHVwLmggdG8gbm90IGluY2x1ZGUgdGhlIHdpbnNvY2sgaGVhZGVycwogIHVuZGVyIEN5Z3dpbi4gIFRoaXMgZml4ZXMgdGhlIHJlcG9ydGVkIGJ1aWxkIHByb2JsZW0uICBDeWd3aW4gYXR0ZW1wdHMgYXMKICBtdWNoIGFzIHBvc3NpYmxlIHRvIGVtdWxhdGUgYSBwb3NpeCBlbnZpcm9ubWVudCB1bmRlciBXaW5kb3dzLiAgVGhpcyBtZWFucwogIHRoYXQgV0lOMzIgaXMgKm5vdCogI2RlZmluZWQgYW5kICh0byB0aGUgZXh0ZW50IHBvc3NpYmxlKSBldmVyeXRoaW5nIGlzIGRvbmUKICBhcyBpdCB3b3VsZCBiZSBvbiBhICppeCB0eXBlIHN5c3RlbS4gIFRodXMgPHN5cy9zb2NrZXQuaD4gaXMgdGhlIHByb3BlcgogIGluY2x1ZGUsIGFuZCBldmVuIHRob3VnaCB3aW5zb2NrMi5oIGlzIHByZXNlbnQsIGluY2x1ZGluZyBpdCBqdXN0IGludHJvZHVjZXMKICBhIHdob2xlIGJ1bmNoIG9mIGluY29tcGF0aWJsZSBzb2NrZXQgQVBJIHN0dWZmLgoKICBUaGUgc2Vjb25kIGlzIGEgcGF0Y2ggSSd2ZSBpbmNsdWRlZCBpbiB0aGUgQ3lnd2luIGJpbmFyeSBwYWNrYWdlcyBmb3IgYQogIHdoaWxlLiAgSXQgc2tpcHMgdHdvIHVubmVjZXNzYXJ5IGxpYnJhcnkgY2hlY2tzICgtbHdpbm1tIGFuZCAtbGdkaTMyKS4gIFRoZQogIGNoZWNrcyBhcmUgaW5ub2N1b3VzIGFuZCB0aGV5IGRvIHN1Y2NlZWQsIGJ1dCB0aGV5IHBvbGx1dGUgTElCUyB3aXRoCiAgdW5uZWNlc3Nhcnkgc3R1ZmYgd2hpY2ggZ2V0cyByZWNvcmRlZCBhcyBzdWNoIGluIHRoZSBsaWJjdXJsLmxhIGZpbGUsIHdoaWNoCiAgYnJpbmdzIHRoZW0gaW50byB0aGUgYnVpbGQgb2YgYW55IGxpYmN1cmwtZG93bnN0cmVhbS4gIEFzIGZhciBhcyBJIGtub3cKICB0aGVzZSBsaWJzIGFyZSByZWFsbHkgb25seSBuZWNlc3NhcnkgZm9yIG1pbmd3LCBzbyBhbHRlcm5hdGl2ZWx5IHRoZXkgY291bGQKICBiZSBkZXNpZ25lZCB0byBvbmx5IHJ1biBpZiAkaG9zdCBtYXRjaGVzICotKi1taW5ndyogYnV0IEkgdG9vayB0aGUgc2FmZXIKICByb3V0ZSBvZiBza2lwcGluZyB0aGVtIGZvciAqLSotY3lnd2luKi4KCiAgVGhlIHRoaXJkIHBhdGNoIHJlcGxhY2VzIGFsbCB1c2VzIG9mIHRoZSBhbmNpZW50IGFuZCBvYnNvbGV0ZSBfX0NZR1dJTjMyX18KICB3aXRoIF9fQ1lHV0lOX18uIFJlZjogPGh0dHA6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDAzLTA5L21zZzAxNTIwLmh0bWw+LgoKRGFuaWVsICg3IEp1bmUgMjAwNikKLSBNaWthZWwgU2VubmVyaG9sbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgTlRMTTIgc2Vzc2lvbiByZXNwb25zZSBzdXBwb3J0CiAgdG8gbGliY3VybC4gVGhlIDIxIE5UTE0gdGVzdCBjYXNlcyB3ZXJlIGFnYWluIG1vZGlmaWVkIHRvIGNvbXBseS4uLgoKRGFuaWVsICgyNyBNYXkgMjAwNikKLSDTc2NhciBNb3JhbGVzIFZpdvMgdXBkYXRlZCB0aGUgbGliY3VybC5mcmFtZXdvcmsubWFrZSBmaWxlLgoKRGFuaWVsICgyNiBNYXkgMjAwNikKLSBPbGFmIFN0/GJlbiBmaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBEaWdlc3QgYXV0aGVudGljYXRpb24gd2l0aCBtZDUtc2VzcyB0bwogIGZhaWwuIFdoZW4gdXNpbmcgdGhlIG1kNS1zZXNzLCB0aGUgcmVzdWx0IHdhcyBub3QgTWQ1IGVuY29kZWQgYW5kIEJhc2U2NAogIHRyYW5zZm9ybWVkLgoKRGFuaWVsICgyNSBNYXkgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyAiU0VTUyIgdG8gYmUgc2V0IHdpdGgKICBDVVJMT1BUX0NPT0tJRUxJU1QsIHdoaWNoIHRoZW4gbWFrZXMgYWxsIHNlc3Npb24gY29va2llcyBnZXQgY2xlYXJlZC4KCkRhbmllbCAoMjQgTWF5IDIwMDYpCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0IDI3MSBydW4gZmluZSBhZ2FpbiBzaW5jZSB0aGUgVEZUUCBwYXRoIGZpeC4KCkRhbmllbCAoMjMgTWF5IDIwMDYpCi0gTWFydGluIE1pY2hsbWF5ciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzY3OTU0LCBidXQgdGhlIHNhbWUgZXJyb3IgYWxzbwogIHNob3dlZCB1cCBpbiB0aGUgYXV0b2J1aWxkcy4gSXQgc2VlbXMgYSByYXRoZXIgbG9uZy1zaW5jZSBpbnRyb2R1Y2VkIHNoZWxsCiAgc2NyaXB0IGZsYXcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc3VkZGVubHkgd2FzIGRldGVjdGVkIGJ5IHRoZSBiYXNoCiAgdmVyc2lvbiBpbiBEZWJpYW4gVW5zdGFibGUuIEl0IGhhZCBwcmV2aW91c2x5IHBhc3NlZCB1bmRldGVjdGVkIGJ5IGFsbAogIHNoZWxscyB1c2VkIHNvIGZhci4uLgoKLSBEYXZpZCBNY0NyZWVkeSB1cGRhdGVkIGxpYi9jb25maWctdHBmLmgKCkRhbmllbCAoMTEgTWF5IDIwMDYpCi0gRml4ZWQgdGhlIGNvbmZpZ3VyZSdzIGNoZWNrIGZvciBvbGQtc3R5bGUgU1NMZWF5IGhlYWRlcnMgc2luY2UgSSBmZWxsIG92ZXIgYQogIGNhc2Ugd2l0aCBhIGR1cGxpY2F0ZSBmaWxlIG5hbWUgKGEga3JiNCBpbXBsZW1lbnRhdGlvbiB3aXRoIGFuIGVyci5oCiAgZmlsZSkuIEkgY29udmVydGVkIHRoZSBjaGVjayB0byBtYW51YWxseSBtYWtlIHN1cmUgdGhyZWUgb2YgdGhlIGhlYWRlcnMgYXJlCiAgcHJlc2VudCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlbSBmaW5lLgoKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBhIGZpeCBmb3IgQ1VSTElORk9fTEFTVFNPQ0tFVCB0aGF0IGRvZXMgZXh0ZW5kZWQKICBjaGVja3Mgb24gdGhlIHRvLWJlLXJldHVybmVkIHNvY2tldCB0byBtYWtlIHN1cmUgaXQgdHJ1bHkgc2VlbXMgdG8gYmUgYWxpdmUKICBhbmQgd2VsbC4gRm9yIFNTTCBjb25uZWN0aW9uIGl0IChvbmx5KSB1c2VzIE9wZW5TU0wgZnVuY3Rpb25zLgoKRGFuaWVsICgxMCBNYXkgMjAwNikKLSBGaXhlZCBESUNUIGluIHR3byBhc3BlY3RzOgoKICAxIC0gYWxsb3cgcHJvcGVybHkgVVJMLWVzY2FwZWQgd29yZHMsIGxpa2UgdXNpbmcgJTIwIGZvciBzcGFjZXMKCiAgMiAtIHByb3Blcmx5IGVzY2FwZSBjZXJ0YWluIGxldHRlcnMgd2l0aGluIGEgd29yZCB0byBjb21wbHkgdG8gdGhlIFJGQzIyMjkKCkRhbmllbCAoOSBNYXkgMjAwNikKLSBBbmRyZWFzIE50YWZsb3MgcmVwb3J0ZWQgYSBidWcgaW4gbGliY3VybC5tNDogV2hlbiBjb25maWd1cmluZyBteSBHTlUKICBhdXRvdG9vbHMgcHJvamVjdCwgd2hpY2ggb3B0aW9uYWxseSAoZGVmYXVsdD15ZXMpIHVzZXMgbGliY3VybCBvbiBhIHN5c3RlbQogIHdpdGhvdXQgYSAodXNhYmxlKSBsaWJjdXJsIGluc3RhbGxhdGlvbiwgYnV0IG5vdCBzcGVjaWZ5aW5nCiAgYC0td2l0aG91dC1saWJjdXJsJywgY29uZmlndXJlIGRldGVybWluZXMgY29ycmVjdGx5IHRoYXQgbm8gbGliY3VybCBpcwogIGF2YWlsYWJsZSwgaG93ZXZlciwgdGhlIExJQkNVUkwgdmFyaWFibGUgZ2V0cyBleHBhbmRlZCB0byBgTElCQ1VSTCA9IC1sY3VybCcKICBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlcy4KCiAgRGF2aWQgU2hhdyBmaXhlZCB0aGUgZmxhdy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHJlY2VudGx5IGFkZGVkIG5vbi1ibG9ja2luZyBTU0wKICBjb25uZWN0cy4gVGhlIHN0YXRlIG1hY2hpbmUgd2FzIG5vdCByZXNldCBwcm9wZXJseSBzbyB0aGF0IHN1YnNlcXVlbnQKICBjb25uZWN0cyB1c2luZyB0aGUgc2FtZSBoYW5kbGUgd291bGQgZmFpbCwgYW5kIHRoZXJlIHdlcmUgdHdvIG1lbW9yeSBsZWFrcy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4geW91IGFkZGVkIGFuIGVhc3kgaGFuZGxlIHRvIGEKICBtdWx0aSBzdGFjayBhbmQgdGhhdCBlYXN5IGhhbmRsZSBoYWQgYWxyZWFkeSBiZWVuIHVzZWQgdG8gZG8gb25lIG9yIG1vcmUKICBlYXN5IGludGVyZmFjZSB0cmFuc2ZlcnMsIGFzIHRoZW4gdGhlIGNvZGUgdGhyZXcgYXdheSB0aGUgcHJldmlvdXNseSB1c2VkCiAgRE5TIGNhY2hlIHdpdGhvdXQgcHJvcGVybHkgZnJlZWluZyBpdC4KCkRhbmllbCAoOCBNYXkgMjAwNikKLSBEYW4gRmFuZHJpY2ggd2VudCBvdmVyIHRoZSBURlRQIGNvZGUgYW5kIGhlIHBvaW50ZWQgb3V0IGFuZCBmaXhlZCBudW1lcm91cwogIHByb2JsZW1zOgoKICAqIFRoZSByZWNlaXZlZCBmaWxlIGlzIGNvcnJ1cHRlZCB3aGVuIGEgcGFja2V0IGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKICAgICh0aGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtISkKCiAgKiBUcmFuc21pdHRpbmcgYSBmaWxlIGFib3J0cyBpZiBhIGJsb2NrIGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKCiAgKiBEYXRhIGlzIHN0b3JlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlciBmb3IgdXBsb2Fkcywgc28gdXBsb2FkcwogICAgYWx3YXlzIGZhaWwgKEkgZG9uJ3Qgc2VlIGhvdyBpdCBjb3VsZCBoYXZlIGV2ZXIgd29ya2VkLCBidXQgaXQgZGlkIG9uIHg4NgogICAgYXQgbGVhc3QpCgogICogQSBudW1iZXIgb2YgY2FsbHMgYXJlIG1hZGUgdG8gc3RyZXJyb3IgaW5zdGVhZCBvZiBDdXJsX3N0cmVycm9yLCBtYWtpbmcKICAgIHRoZSBjb2RlIG5vdCB0aHJlYWQgc2FmZQoKICAqIFRoZXJlIGFyZSByZWZlcmVuY2VzIHRvIGVycm5vIGluc3RlYWQgb2YgQ3VybF9zb2NrZXJybm8oKSwgY2F1c2luZwogICAgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2VzIG9uIFdpbmRvd3MKCiAgKiBUaGUgZmlsZSBuYW1lIGluY2x1ZGVzIGEgbGVhZGluZyAvIHdoaWNoIHZpb2xhdGVzIFJGQzM2MTcuIERvaW5nIHNvbWV0aGluZwogICAgc2ltaWxhciB0byBmdHAsIHdoZXJlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBob3N0IG5hbWUgbWVhbnMgYW4gYWJzb2x1dGUKICAgIHJlZmVyZW5jZSBzZWVtcyBhIHJlYXNvbmFibGUgZXh0ZW5zaW9uIHRvIGZpeCB0aGlzLgoKICAqIEZhaWx1cmVzIGluIEVCQ0RJQyBjb252ZXJzaW9uIGFyZSBub3QgcHJvcGFnYXRlZCB1cCB0byB0aGUgY2FsbGVyIGJ1dCBhcmUKICAgIHNpbGVudGx5IGlnbm9yZWQKCi0gRml4ZWQga25vd24gYnVnICMyOC4gVGhlIFRGVFAgY29kZSBubyBsb25nZXIgYXNzdW1lcyBhIHBhY2tlZCBzdHJ1Y3QgYW5kCiAgdGh1cyB3b3JrcyByZWxpYWJseSBvbiBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoNSBNYXkgMjAwNikKLSBSb2xhbmQgQmxvbSBmaWxlZCBidWcgcmVwb3J0ICMxNDgxMjE3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODEyMTcpLCB3aXRoIGZvbGxvdy11cHMgYnkgTWljaGVsZQogIEJpbmkgYW5kIERhdmlkIEJ5cm9uLiBsaWJjdXJsIHByZXZpb3VzbHkgd3JvbmdseSB1c2VkIEdldExhc3RFcnJvcigpIG9uCiAgd2luZG93cyB0byBnZXQgZXJyb3IgZGV0YWlscyBhZnRlciBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbiBjYWxscywgd2hlbiBpdAogIHJlYWxseSBzaG91bGQgdXNlIFdTQUdldExhc3RFcnJvcigpIGluc3RlYWQuCgogIFdoZW4gY2hhbmdpbmcgdG8gdGhpcywgdGhlIGZvcm1lciBmdW5jdGlvbiBDdXJsX291cmVycm5vKCkgaXMgbm93IGluc3RlYWQKICBjYWxsZWQgQ3VybF9zb2NrZXJybm8oKSBhcyBpdCBpcyBuZWNlc3NhcnkgdG8gb25seSB1c2UgaXQgdG8gZ2V0IGVycm5vIGZyb20KICBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbnMgYXMgb3RoZXJ3aXNlIGl0IHdvbid0IHdvcmsgYXMgaW50ZW5kZWQgb24gV2luZG93cy4KCkRhbmllbCAoNCBNYXkgMjAwNikKLSBNYXJrIEVpY2hpbiBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMTQ4MDgyMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDgwODIxKSBIZSBmb3VuZCBhbmQgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aXRoIGhvdyBsaWJjdXJsIGRlYWx0IHdpdGggR251VExTIGFuZCBhIGNhc2Ugd2hlcmUgZ251dGxzIHJldHVybmVkCiAgR05VVExTX0VfQUdBSU4gaW5kaWNhdGluZyBpdCB3b3VsZCBibG9jay4gSXQgd291bGQgdGhlbiByZXR1cm4gYW4gdW5leHBlY3RlZAogIHJldHVybiBjb2RlLCBtYWtpbmcgQ3VybF9zc2xfc2VuZCgpIGNvbmZ1c2UgdGhlIHVwcGVyIGxheWVyIC0gY2F1c2luZyByYW5kb20KICAyOCBieXRlcyB0cmFzaCBkYXRhIHRvIGdldCBpbnNlcnRlZCBpbiB0aGUgdHJhbnNmZXJlZCBzdHJlYW0uCgogIFRoZSBwcm9wZXIgZml4IHdhcyB0byBtYWtlIHRoZSBDdXJsX2d0bHNfc2VuZCgpIGZ1bmN0aW9uIHJldHVybiB0aGUgcHJvcGVyCiAgcmV0dXJuIGNvZGVzIHRoYXQgdGhlIGNhbGxlcnMgd291bGQgZXhwZWN0LiBUaGUgQ3VybF9vc3NsX3NlbmQoKSBmdW5jdGlvbgogIGFscmVhZHkgZGlkIHRoaXMuCgpEYW5pZWwgKDIgTWF5IDIwMDYpCi0gQWRkZWQgYSAtLWNoZWNrZm9yIG9wdGlvbiB0byBjdXJsLWNvbmZpZyB0byBhbGxvdyB1c2VycyB0byBlYXNpZXIKICB3cml0ZSBmb3IgZXhhbXBsZSBzaGVsbCBzY3JpcHRzIHRoYXQgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEKICBuZXctZW5vdWdoIGxpYmN1cmwgdmVyc2lvbi4gSWYgLS1jaGVja2ZvciBpcyBnaXZlbiBhIHZlcnNpb24gc3RyaW5nCiAgbmV3ZXIgdGhhbiB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQsIGN1cmwtY29uZmlnIHdpbGwgcmV0dXJuIGEKICBub24temVybyBleGl0IGNvZGUgYW5kIG91dHB1dCBhIHN0cmluZyBhYm91dCB0aGUgdW5mdWxmaWxsZWQKICByZXF1aXJlbWVudC4KCkRhbmllbCAoMjYgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBicm91Z2h0IGluaXRpYWwgbGluZSBlbmQgY29udmVyc2lvbnMgd2hlbiBkb2luZyBGVFAgQVNDSUkKICB0cmFuc2ZlcnMuIFRoZXkgYXJlIGRvbmUgb24gbm9uLXdpbmRvd3Mgc3lzdGVtcyBhbmQgdHJhbnNsYXRlIENSTEYgdG8gTEYuCgogIEkgbW9kaWZpZWQgdGhlIDE1IExJU1QtdXNpbmcgdGVzdCBjYXNlcyBhY2NvcmRpbmdseS4gVGhlIGRvd25zaWRlIGlzIHRoYXQgbm93CiAgd2UnbGwgaGF2ZSBldmVuIG1vcmUgdHJvdWJsZSB0byBnZXQgdGhlIHRlc3RzIHRvIHJ1biBvbiBXaW5kb3dzIHNpbmNlIHRoZXkKICBzaG91bGQgZ2V0IENSTEYgbmV3bGluZXMgbGVmdCBpbnRhY3Qgd2hpY2ggdGhlICpuaXggdmVyc2lvbnMgZG9uJ3QuIEkgZmlndXJlCiAgdGhlIG9ubHkgc2FuZSB0aGluZyB0byBkbyBpcyB0byBhZGQgc29tZSBraW5kIG9mIFtuZXdsaW5lXSBtYWNybyBmb3IgdGhlIHRlc3QKICBjYXNlIGZpbGVzIGFuZCBoYXZlIHRoZW0gZXhwYW5kZWQgdG8gdGhlIHByb3BlciBuYXRpdmUgbGluZSBlbmRpbmcgd2hlbiB0aGUKICB0ZXN0IGNhc2VzIGFyZSBydW4uIFRoaXMgaXMgaG93ZXZlciBsZWZ0IHRvIGltcGxlbWVudC4KCkRhbmllbCAoMjUgQXByaWwgMjAwNikKLSBQYXVsIFF1ZXJuYSBmaXhlZCBsaWJjdXJsIHRvIGJldHRlciBkZWFsIHdpdGggZGVmbGF0ZSBjb250ZW50IGVuY29kaW5nCiAgd2hlbiB0aGUgc3RyZWFtICh3cm9uZ2x5KSBsYWNrcyBhIHByb3BlciB6bGliIGhlYWRlci4gVGhpcyBzZWVtcyB0byBiZSB0aGUKICBjYXNlIG9uIHRvbyBtYW55IGFjdHVhbCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA2KQotIEFsZSBWZXNlbHkgZml4ZWQgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2hlbiB1c2luZyBhIGhvc3RuYW1lLgoKRGFuaWVsICgxOSBBcHJpbCAyMDA2KQotIEJhc2VkIG9uIHByZXZpb3VzIGluZm8gZnJvbSBUb3IgQXJudHNlbiwgSSBtYWRlIGNvbmZpZ3VyZSBkZXRlY3QgdGhlIEludGVsCiAgSUNDIGNvbXBpbGVyIHRvIGFkZCBhIGNvbXBpbGVyIG9wdGlvbiBmb3IgaXQsIGluIG9yZGVyIGZvciBjb25maWd1cmUgdG8KICBwcm9wZXJseSBiZSBhYmxlIHRvIGRldGVjdCBmdW5jdGlvbiBwcm90b3R5cGVzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIGxlc3MgZWFnZXIgdG8gY2xvc2UKICB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdoZW4gdXNpbmcgRlRQLCBmb3IgZXhhbXBsZSB3aGVuIHlvdSByZW1vdmUgYW4gZWFzeQogIGhhbmRsZSBmcm9tIGEgbXVsdGkgc3RhY2suCgotIEFwcGxpZWQgYSBwYXRjaCBieSBBdGVzIEdvcmFsIGFuZCBLYXRpZSBXYW5nIHRoYXQgY29ycmVjdGVkIG15IGJhZCBmaXgKICBhdHRlbXB0IGZyb20gQXByaWwgMTAuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDYpCi0gIzE0NjgzMzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NjgzMzApIHBvaW50ZWQgb3V0IGEgYmFkCiAgdHlwZWNhc3QgaW4gdGhlIGN1cmwgdG9vbCBsZWFkaW5nIHRvIGEgY3Jhc2ggd2l0aCAoNjRiaXQ/KSBWUzIwMDUgKGF0IGxlYXN0KQogIHNpbmNlIHRoZSBzdHJ1Y3QgdGltZXZhbCBmaWVsZCB0dl9zZWMgaXMgYW4gaW50IHdoaWxlIHRpbWVfdCBpcyA2NGJpdC4KCkRhbmllbCAoMTAgQXByaWwgMjAwNikKLSBBdGVzIEdvcmFsIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZpZWQgYm90aCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIGFuZAogIENVUkxPUFRfVElNRU9VVCwgdGhlIF9sb25nZXJfIHRpbWUgd291bGQgd3JvbmdseSBiZSB1c2VkIGZvciB0aGUgU1NMCiAgY29ubmVjdGlvbiB0aW1lLW91dCEKCi0gSSBtZXJnZWQgbXkgaGlwZXIgcGF0Y2ggKGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9oaXBlci8pIGludG8gdGhlIG1haW4KICBzb3VyY2VzLiBTZWUgdGhlIGxpYi9SRUFETUUubXVsdGlfc29ja2V0IGZvciBpbXBsZW1lbnRhdGlvbiBzdG9yeSB3aXRoCiAgZGV0YWlscy4gRG9uJ3QgZXhwZWN0IGl0IHRvIHdvcmsgZnVsbHkgeWV0LiBJIGRvbid0IGludGVuZCB0byBibG93IGFueQogIHdoaXN0bGVzIG9yIHJpbmcgYW55IGJlbGxzIGFib3V0IGl0IHVudGlsIEknbSBtb3JlIGNvbnZpbmNlZCBpdCB3b3JrcyBhdAogIGxlYXN0IHNvbWV3aGF0IHJlbGlhYmx5LgoKRGFuaWVsICg3IEFwcmlsIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkncyBFQkNESUMgYW5kIFRQRiBjaGFuZ2VzLiBUaHJlZSBuZXcgY3VybF9lYXN5X3NldG9wdCgpCiAgb3B0aW9ucyAoY2FsbGJhY2tzKSB3ZXJlIGFkZGVkOgoKICBDT05WX0ZST01fTkVUV09SS19GVU5DVElPTgogIENPTlZfVE9fTkVUV09SS19GVU5DVElPTgogIENPTlZfRlJPTV9VVEY4X0ZVTkNUSU9OCgpEYW5pZWwgKDUgQXByaWwgMjAwNikKLSBNaWNoZWxlIEJpbmkgbW9kaWZpZWQgdGhlIE5UTE0gY29kZSB0byB3b3JrIGZvciBoaXMgIndlaXJkIElJUyBjYXNlIgogIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDYtMDIvMDE1NC5odG1sKSBieSBhZGRpbmcgdGhlIE5UTE0gaGFzaAogIGZ1bmN0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBMTSBvbmUgYW5kIG1ha2luZyBzb21lIG90aGVyIGFkanVzdG1lbnRzIGluIHRoZQogIG9yZGVyIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGRhdGEgYmxvY2sgYXJlIHNlbnQgaW4gdGhlIFR5cGUtMiByZXBseS4KICBJbnNwaXJhdGlvbiBmb3IgdGhpcyB3b3JrIHdhcyB0YWtlbiBmcm9tIHRoZSBGaXJlZm94IE5UTE0gaW1wbGVtZW50YXRpb24uCgogIEkgZWRpdGVkIHRoZSBleGlzdGluZyAyMSghKSBOVExNIHRlc3QgY2FzZXMgdG8gcnVuIGZpbmUgd2l0aCB0aGVzZSBuZXdzLiBEdWUKICB0byB0aGUgZmFjdCB0aGF0IHdlIG5vdyBwcm9wZXJseSBpbmNsdWRlIHRoZSBob3N0IG5hbWUgaW4gdGhlIFR5cGUtMiBtZXNzYWdlCiAgdGhlIHRlc3QgY2FzZXMgbm93IG9ubHkgY29tcGFyZSBwYXJ0cyBvZiB0aGF0IGNodW5rLgoKRGFuaWVsICgyOCBNYXJjaCAyMDA2KQotICMxNDUxOTI5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDUxOTI5KSBkZXRhaWxlZCBhIGJ1ZyB0aGF0CiAgb2NjdXJyZWQgd2hlbiBhc2tpbmcgbGliY3VybCB0byBmb2xsb3cgSFRUUCByZWRpcmVjdHMgYW5kIHRoZSBvcmlnaW5hbCBVUkwKICBoYWQgbW9yZSB0aGFuIG9uZSBxdWVzdGlvbiBtYXJrICg/KS4gQWRkZWQgdGVzdCBjYXNlIDI3NiB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDYpCi0gRGF2aWQgQnlyb24gZm91bmQgYSBwcm9ibGVtIG11bHRpcGxlIC1kIG9wdGlvbnMgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoCiAgLS1lbmFibGUtZGVidWcsIGFzIHRoZW4gY3VybCB1c2VkIGZyZWUoKSBvbiBtZW1vcnkgYWxsb2NhdGVkIGJvdGggd2l0aAogIG5vcm1hbCBtYWxsb2MoKSBhbmQgd2l0aCBsaWJjdXJsLXByb3ZpZGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUgbGF0dGVyIE1VU1QgYmUKICBmcmVlZCB3aXRoIGN1cmxfZnJlZSgpIGluIGRlYnVnIGJ1aWxkcy4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBmaWd1cmVkIG91dCB0aGF0IFRGVFAgd2FzIGJyb2tlbiBvbiBhIGxvdCBvZiBzeXN0ZW1zIHNpbmNlIHdlCiAgY2FsbGVkIGJpbmQoKSB3aXRoIGEgdG9vIGJpZyBhcmd1bWVudCBpbiB0aGUgM3JkIHBhcmFtZXRlciBhbmQgYXQgbGVhc3QKICBUcnU2NCwgQUlYIGFuZCBJUklYIHNlZW0gdG8gYmUgdmVyeSBwaWNreSBhYm91dCBpdC4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCBDVVJMSU5GT19GVFBfRU5UUllfUEFUSC4KCi0gWGF2aWVyIEJvdWNob3V4IG1hZGUgdGhlIFNTTCBjb25uZWN0aW9uIG5vbi1ibG9ja2luZyBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogICh3aGVuIHVzaW5nIE9wZW5TU0wpLgoKLSBUb3IgQXJudHNlbiBmaXhlZCB0aGUgQUlYIFRvb2xib3ggUlBNIHNwZWMKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBsaWJjdXJsIHRvIG5vIGxvbmdlciBpZ25vcmUgQVVUSCBmYWlsdXJlcyBhbmQgbm93IGl0CiAgcmVhY3RzIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgQ1VSTE9QVF9GVFBfU1NMIHNldHRpbmcuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0d28gVEZUUCBwcm9ibGVtczogRml4ZWQgYSBidWcgd2hlcmVieSBhIHJlY2VpdmVkIGZpbGUKICB3aG9zZSBsZW5ndGggd2FzIGEgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzIGNvdWxkIGhhdmUgcmFuZG9tIGdhcmJhZ2UKICBhcHBlbmRlZC4gQWxzbywgc3RvcCBwcm9jZXNzaW5nIFRGVFAgcGFja2V0cyB3aGljaCBhcmUgdG9vIHNob3J0IHRvIGJlCiAgbGVnYWwuCgotIElsamEgdmFuIFNwcnVuZGVsIHJlcG9ydGVkIGEgcG9zc2libGUgY3Jhc2ggaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHVzaW5nCiAgImN1cmwgaG9zdHdpdGhvdXRzbGFzaCAtZCBkYXRhIC1HIgoKVmVyc2lvbiA3LjE1LjMgKDIwIE1hcmNoIDIwMDYpCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDYpCi0gVlVMTkVSQUJJTElUWSByZXBvcnRlZCB0byB1cyBieSBVbGYgSGFybmhhbW1hci4KCiAgbGliY3VybCB1c2VzIHRoZSBnaXZlbiBmaWxlIHBhcnQgb2YgYSBURlRQIFVSTCBpbiBhIG1hbm5lciB0aGF0IGFsbG93cyBhCiAgbWFsaWNpb3VzIHVzZXIgdG8gb3ZlcmZsb3cgYSBoZWFwLWJhc2VkIG1lbW9yeSBidWZmZXIgZHVlIHRvIHRoZSBsYWNrIG9mCiAgYm91bmRhcnkgY2hlY2suCgogIFRoaXMgb3ZlcmZsb3cgaGFwcGVucyBpZiB5b3UgcGFzcyBpbiBhIFVSTCB3aXRoIGEgVEZUUCBwcm90b2NvbCBwcmVmaXgKICAoInRmdHA6Ly8iKSwgdXNpbmcgYSB2YWxpZCBob3N0IGFuZCBhIHBhdGggcGFydCB0aGF0IGlzIGxvbmdlciB0aGFuIDUxMgogIGJ5dGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGlmIGN1cmwvbGliY3VybCBpcyB0b2xkIHRvCiAgZm9sbG93IHJlZGlyZWN0cyBhbmQgYW4gSFRUUCBzZXJ2ZXIgcG9pbnRzIHRoZSBjbGllbnQgdG8gYSB0ZnRwIFVSTCB3aXRoIHRoZQogIGNoYXJhY3RlcmlzdGljcyBkZXNjcmliZWQgYWJvdmUuCgogIFRoZSBDb21tb24gVnVsbmVyYWJpbGl0aWVzIGFuZCBFeHBvc3VyZXMgKENWRSkgcHJvamVjdCBoYXMgYXNzaWduZWQgdGhlIG5hbWUKICBDVkUtMjAwNi0xMDYxIHRvIHRoaXMgaXNzdWUuCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDYpCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBSUE0gc3BlYyBmaWxlIGZvciBBSVggVG9vbGJveCwgdGhhdCBub3cgaXMgaW5jbHVkZWQKICBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkOgoKICBhIGJhZCBTU0wgZXJyb3IgbWVzc2FnZSB3aGVuIE9wZW5TU0wgY2VydGlmaWNhdGVzIGFyZSB2ZXJpZmllZCBmaW5lLgoKICBhIG1pc3NpbmcgcmV0dXJuIGNvZGUgYXNzaWdubWVudCBpbiB0aGUgRlRQIGNvZGUKCkRhbmllbCAoNyBNYXJjaCAyMDA2KQotIE1hcmt1cyBLb2V0dGVyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNTU3MTUgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIG11bHRpLXBhcnQgZm9ybXBvc3RzLiBUaGUgZml4IGZyb20gRmVicnVhcnkKICAyMm5kIGNvdWxkIG1ha2UgdGhlIEN1cmxfZG9uZSgpIGZ1bmN0aW9uIGdldCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCBpdCB3YXMgbm90IGRlc2lnbmVkIGZvciB0aGF0IGFuZCB0aHVzIHRyaWVkIHRvIGNhbGwgZnJlZSgpIG9uCiAgYW4gYWxyZWFkeSBmcmVlZCBtZW1vcnkgYXJlYSEKCi0gUGV0ZXIgSGV1Y2hlcnQgbWFkZSBzdXJlIHRoZSBDVVJMRlRQU1NMX0NPTlRST0wgc2V0dGluZyBmb3IgQ1VSTE9QVF9GVFBfU1NMCiAgaXMgdXNlZCBwcm9wZXJseS4KCkRhbmllbCAoNiBNYXJjaCAyMDA2KQotIExvdHMgb2YgdXNlcnMgb24gV2luZG93cyBoYXZlIHJlcG9ydGVkIGdldHRpbmcgdGhlICJTU0w6IGNvdWxkbid0IHNldAogIGNhbGxiYWNrIiBlcnJvciBtZXNzYWdlIHNvIEkndmUgbm93IG1hZGUgdGhlIHNldHRpbmcgb2YgdGhhdCBjYWxsYmFjayBub3QgYmUKICBhcyBjcml0aWNhbCBhcyBiZWZvcmUuIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGFkZGl0aW9uYWwgbG9nZ2dpbmcvCiAgdHJhY2UgYW55d2F5IHNvIGEgZmFpbHVyZSBqdXN0IG1lYW5zIHNsaWdodGx5IGxlc3MgZGF0YS4gSXQgc2hvdWxkIHN0aWxsIGJlCiAgYWJsZSB0byBwcm9jZWVkIGFuZCBjb25uZWN0IGZpbmUgdG8gdGhlIHNlcnZlci4KCkRhbmllbCAoNCBNYXJjaCAyMDA2KQotIFRob21hcyBLbGF1c25lciBwcm92aWRlZCBhIHBhdGNoIHdyaXR0ZW4gYnkgVG9kZCBWaWVybGluZyBpbiBidWcgcmVwb3J0CiAgIzE0NDI0NzEgdGhhdCBmaXhlcyBhIGJ1aWxkIHByb2JsZW0gb24gSW50ZXJpeC4KCkRhbmllbCAoMiBNYXJjaCAyMDA2KQotIEZUUCB1cGxvYWQgd2l0aG91dCBhIGZpbGUgbmFtZSBwYXJ0IGluIHRoZSBVUkwgbm93IGNhdXNlcwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgdG8gcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQuIFByZXZpb3VzbHkgaXQgYWxsb3dlZCB0aGUKICB1cGxvYWQgYnV0IG5hbWVkIHRoZSBmaWxlICIobmlsKSIgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFRlc3QgY2FzZSA1MjQKICB2ZXJpZmllcy4KCi0gQWRkZWQgYSBjaGVjayBmb3IgZ2V0cHJvdG9ieW5hbWUgaW4gY29uZmlndXJlIHNvIHRoYXQgaXQnbGwgYmUgdXNlZCwgdGhhbmtzCiAgdG8gR2lzbGUgVmFuZW0ncyBjaGFuZ2UgdGhlIG90aGVyIGRheS4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwNikKLSBEYW4gRmFuZHJpY2ggcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcCBpbiBjYXNlIHdlCiAgYXJlIG91dCBvZiBmaWxlIGhhbmRsZXMgdmVyeSBlYXJseSBpbiBjdXJsJ3MgY29kZSB3aGVyZSBpdCBtYWtlcyBzdXJlIHRoYXQKICAwLCAxIGFuZCAyIGFyZW4ndCBnb25uYSBiZSB1c2VkIGJ5IHRoZSBsaWIgZm9yIHRyYW5zZmVycy4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNikKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIHdlcmUgdHdvIFZNUy1zcGVjaWZpYyBmaWxlcyBtaXNzaW5nIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZS4KClZlcnNpb24gNy4xNS4yICgyNyBGZWJydWFyeSAyMDA2KQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA2KQotIExvdHMgb2Ygd29yayBhbmQgYW5hbHlzaXMgYnkgInhieF9fXyIgaW4gYnVnICMxNDMxNzUwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MzE3NTApIGhlbHBlZCBtZSBpZGVudGlmeSBhbmQgZml4IHR3bwogIGRpZmZlcmVudCBidXQgcmVsYXRlZCBidWdzOgoKICAxKSBSZW1vdmluZyBhbiBlYXN5IGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIGJlZm9yZSB0aGUgdHJhbnNmZXIgaXMgZG9uZQogICAgIGNvdWxkIGxlYXZlIGEgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBmb3IgdGhhdCBoYW5kbGUgdGhhdCBpcwogICAgIGluIGEgc3RhdGUgdGhhdCBpc24ndCBzdWl0YWJsZSBmb3IgcmUtdXNlLiBBIHN1YnNlcXVlbnQgcmUtdXNlIGNvdWxkIHRoZW4KICAgICByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIgYW5kIHNlZ2ZhdWx0LgoKICAyKSBXaGVuIGFuIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkIGZyb20gdGhlIG11bHRpIGhhbmRsZSwgdGhlcmUgY291bGQgYmUgYW4KICAgICBvdXRzdGFuZGluZyBjLWFyZXMgRE5TIG5hbWUgcmVzb2x2ZSByZXF1ZXN0LiBXaGVuIHRoZSByZXNwb25zZSBhcnJpdmVkLAogICAgIGl0IGNhdXNlZCBoYXZvYyBzaW5jZSB0aGUgY29ubmVjdGlvbiBzdHJ1Y3QgaXQgImJlbG9uZ2VkIiB0byBjb3VsZCd2ZQogICAgIGJlZW4gZnJlZWQgYWxyZWFkeS4KCiAgTm93IEN1cmxfZG9uZSgpIGlzIGNhbGxlZCB3aGVuIGFuIGVhc3kgaGFuZGxlIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZQogIHByZS1tYXR1cmVseSAodGhhdCBpcywgYmVmb3JlIHRoZSB0cmFuc2ZlciB3YXMgY29tcGx0ZXRlZCkuIEN1cmxfZG9uZSgpIGFsc28KICBtYWtlcyBzdXJlIHRvIGNhbmNlbCBhbGwgKGlmIGFueSkgb3V0c3RhbmRpbmcgYy1hcmVzIHJlcXVlc3RzLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA2KQotIFBldGVyIFN1IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNCBwcm94aWVzLiBFbmFibGUgdGhpcyBieSBzZXR0aW5nIHRoZSBwcm94eQogIHR5cGUgdG8gdGhlIGFscmVhZHkgcHJvdmlkZWQgdHlwZSBDVVJMUFJPWFlfU09DS1M0LgoKICBJIGFkZGVkIGEgLS1zb2NrczQgb3B0aW9uIHRoYXQgd29ya3MgbGlrZSB0aGUgY3VycmVudCAtLXNvY2tzNSBvcHRpb24gYnV0CiAgaW5zdGVhZCB1c2UgdGhlIHNvY2tzNCBwcm90b2NvbC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIGFuIGlzc3VlIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiBhbmQgY29tcHJlc3NlZAogIGNvbnRlbnQgd2hlbiBsaWJjdXJsIGRpZG4ndCBob25vciB0aGUgaW50ZXJuYWwgaWdub3JlYm9keSBmbGFnLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA2KQotIFVsZiBI5HJuaGFtbWFyIGZpeGVkIGEgZm9ybWF0IHN0cmluZyAocHJpbnRmIHN0eWxlKSBwcm9ibGVtIGluIHRoZSBOZWdvdGlhdGUKICBjb2RlLiBJdCBzaG91bGQgaG93ZXZlciBub3QgYmUgdGhlIGNhdXNlIG9mIGFueSB0cm91Ymxlcy4gSGUgYWxzbyBmaXhlZCBhCiAgZmV3IHNpbWlsYXIgcHJvYmxlbXMgaW4gdGhlIEhUVFAgdGVzdCBzZXJ2ZXIgY29kZS4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IHByb3ZpZGVkIGEgZml4IGZvciB0aGUgRE5TIGNhY2hlIHdoZW4gdXNpbmcgc2hvcnQgbGlmZSB0aW1lcywKICBhcyBwcmV2aW91c2x5IGl0IGNvdWxkIGJlIGhvbGRpbmcgb24gdG8gb2xkIGNhY2hlZCBlbnRyaWVzIGxvbmdlciB0aGFuCiAgcmVxdWVzdGVkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA2KQotIEthcmwgTW9lcmRlciBhZGRlZCB0aGUgQ1VSTE9QVF9DT05ORUNUX09OTFkgYW5kIENVUkxJTkZPX0xBU1RTT0NLRVQgb3B0aW9ucwogIHRoYXQgYW4gYXBwIGNhbiB1c2UgdG8gbGV0IGxpYmN1cmwgb25seSBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QgYW5kIHRoZW4KICBleHRyYWN0IHRoZSBzb2NrZXQgZnJvbSBsaWJjdXJsLiBsaWJjdXJsIHdpbGwgdGhlbiBub3QgYXR0ZW1wdCB0byBkbyBhbnkKICB0cmFuc2ZlciBhdCBhbGwgYWZ0ZXIgdGhlIGNvbm5lY3QgaXMgZG9uZS4KCi0gS2VudCBCb29ydHogaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgR251VExTIHRvIHByb3Blcmx5IHNldCBMSUJTCiAgaW5zdGVhZCBvZiBMREZMQUdTLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDYpCi0gUGhpbGlwcGUgVmF1Y2hlciBwcm92aWRlZCBhIGJyaWxsaWFudCBwaWVjZSBvZiB0ZXN0IGNvZGUgdGhhdCBzaG93IGEgcHJvYmxlbQogIHdpdGggcmUtdXNlZCBGVFAgY29ubmVjdGlvbnMuIElmIHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUgc2FtZSBjb25uZWN0aW9uCiAgd2FzIHNldCBub3QgdG8gZmV0Y2ggYSAiYm9keSIsIGxpYmN1cmwgY291bGQgZ2V0IGNvbmZ1c2VkIGFuZCBjb25zaWRlciBpdCBhbgogIGF0dGVtcHQgdG8gdXNlIGEgZGVhZCBjb25uZWN0aW9uIGFuZCB3b3VsZCBnbyBhY3RpbmcgbWlnaHR5IHN0cmFuZ2UuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNikKLSBNYWtlIC0tbGltaXQtcmF0ZSBbbnVtXSBtZWFuIGJ5dGVzLiBJdCB1c2VkIHRvIGJlIHRoYXQgYnV0IGl0IGJyb2tlIGluIG15CiAgY2hhbmdlIGRvbmUgaW4gTm92ZW1iZXIgMjAwNS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA2KQotIEFkZGVkIENVUkxPUFRfTE9DQUxQT1JUIGFuZCBDVVJMT1BUX0xPQ0FMUE9SVFJBTkdFIHRvIGxpYmN1cmwuIFNldCB3aXRoIHRoZQogIGN1cmwgdG9vbCB3aXRoIC0tbG9jYWwtcG9ydC4gUGxhaW4gYW5kIHNpbXBseSBzZXQgdGhlIHJhbmdlIG9mIHBvcnRzIHRvIGJpbmQKICB0aGUgbG9jYWwgZW5kIG9mIGNvbm5lY3Rpb25zIHRvLiBJbXBsZW1lbnRlZCBvbiB0byBwb3B1bGFyIGRlbWFuZC4KCi0gQmFzZWQgb24gYW4gZXJyb3IgcmVwb3J0IGJ5IFBoaWxpcHBlIFZhdWNoZXIsIHdlIG5vIGxvbmdlciBjb3VudCBhIHJldHJpZWQKICBjb25uZWN0aW9uIHNldHVwIGFzIGEgZm9sbG93LXJlZGlyZWN0LiBJdCB0dXJucyBvdXQgMSkgdGhpcyBmYWlscyB3aGVuIGEgRlRQCiAgY29ubmVjdGlvbiBpcyByZS1zZXR1cCBhbmQgMikgaXQgZG9lcyBtYWtlIHRoZSBtYXgtcmVkaXJzIGNvdW50ZXIgYmVoYXZlCiAgd3JvbmcuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwNikKLSBNaWNoYWwgTWFyZWsgcHJvdmlkZWQgYSBwYXRjaCBmb3IgRlRQIHRoYXQgbWFrZXMgbGliY3VybCBjb250aW51ZSB0byB0cnkKICBQQVNWIGV2ZW4gYWZ0ZXIgRVBTViByZXR1cm5lZCBhIHBvc2l0aXZlIHJlc3BvbnNlIGNvZGUsIGlmIGxpYmN1cmwgZmFpbGVkIHRvCiAgY29ubmVjdCB0byB0aGUgcG9ydCBudW1iZXIgdGhlIEVQU1YgcmVzcG9uc2Ugc2FpZC4gT2J2aW91c2x5IHNvbWUgcGVvcGxlIGFyZQogIGdvaW5nIHRocm91Z2ggcHJvdG9jb2wtc2Vuc2l0aXZlIGZpcmV3YWxscyAob3Igc2ltaWxhcikgdGhhdCBkb24ndAogIHVuZGVyc3RhbmQgRVBTViBhbmQgdGhlbiB0aGV5IGRvbid0IGFsbG93IHRoZSBzZWNvbmQgY29ubmVjdGlvbiB1bmxlc3MgUEFTVgogIHdhcyB1c2VkLiBUaGlzIGFsc28gY2FsbGVkIGZvciBhIG1pbm9yIGZpeCBvZiB0ZXN0IGNhc2UgMjM4LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDYpCi0gRHVhbmUgQ2F0aGV5IHdhcyBvbmUgb2Ygb3VyIGZyaWVuZHMgd2hvIHJlcG9ydGVkIHRoYXQgY3VybCAtUCBbSVBdCiAgKENVUkxPUFRfRlRQUE9SVCkgZGlkbid0IHdvcmsgZm9yIElQdjYtZW5hYmVkIGN1cmxzIGlmIHRoZSBJUCB3YXNuJ3QgYQogICJuYXRpdmUiIElQIHdoaWxlIGl0IHdvcmtzIGZpbmUgZm9yIElQdjYtZGlzYWJsZWQgYnVpbGRzIQoKICBJbiB0aGUgcHJvY2VzcyBvZiBmaXhpbmcgdGhpcywgSSByZW1vdmVkIHRoZSBzdXBwb3J0IGZvciBMUFJUIHNpbmNlIEkgY2FuJ3QKICB0aGluayBvZiBtYW55IHJlYXNvbnMgdG8ga2VlcCBkb2luZyBpdCBhbmQgYXNraW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QgZGlkbid0CiAgcmV2ZWFsIGFueW9uZSBlbHNlIHRoYXQgY291bGQgZWl0aGVyLiBUaGUgY29kZSB0aGF0IHNlbmRzIEVQUlQgYW5kIFBPUlQgaXMKICBub3cgYWxzbyBhIGxvdCBzaW1wbGVyIHRoYW4gYmVmb3JlIChJTUhPKS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA2KQotIEpvbiBUdXJuZXIgcG9pbnRlZCBvdXQgdGhhdCBkb2luZyAtUCBbaG9zdG5hbWVdIChDVVJMT1BUX0ZUUFBPUlQpIHdpdGggY3VybAogIChidWlsdCBJUHY0LW9ubHkpIGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDYpCi0gQXMgcmVwb3J0ZWQgaW4gYnVnICMxNDA4NzQyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDA4NzQyKSwKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21wbGFpbmVkIGFib3V0IGEgbWlzc2luZyAibWlzc2luZyIgc2NyaXB0IGlmIHlvdSByYW4KICBjb25maWd1cmUgd2l0aGluIGEgcGF0aCB3aG9zZSBuYW1lIGluY2x1ZGVkIG9uZSBvciBtb3JlIHNwYWNlcy4gVGhpcyBpcyBkdWUKICB0byBhIGZsYXcgaW4gYXV0b21ha2UgKDEuOS42IGFuZCBlYXJsaWVyKS4gSSd2ZSBub3cgd29ya2VkIGFyb3VuZCBpdCBieQogIGluY2x1ZGluZyBhbiAib3ZlcmxvYWRlZCIgdmVyc2lvbiBvZiB0aGUgQU1fTUlTU0lOR19IQVNfUlVOIHNjcmlwdCB0aGF0J2xsCiAgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvbmUgYXV0b21ha2Ugc2hpcHMgd2l0aC4gVGhpcyBrbHVkZ2UgbmVlZHMgdG8gYmUKICByZW1vdmVkIG9uY2Ugd2UgZ2V0IGFuIGF1dG9tYWtlIHZlcnNpb24gd2l0aCB0aGlzIHByb2JsZW0gY29ycmVjdGVkLgogIFBvc3NpYmx5IHdlJ2xsIHRoZW4gbmVlZCB0byBjb252ZXJ0IHRoaXMgaW50byBhIGtsdWRnZSBkZXBlbmRpbmcgb24gd2hhdAogIGF1dG9tYWtlIHZlcnNpb24gdGhhdCBpcyB1c2VkIGFuZCB0aGF0IGlzIGdvbm5hIGJlIHBhaW5mdWwgYW5kIEkgZG9uJ3QgZXZlbgogIHdhbnQgdG8gdGhpbmsgYWJvdXQgdGhhdCBub3cuLi4hCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3OiBIZXJlIGlzIHRoZSBsYXRlc3QgbGliY3VybC5tNCBhdXRvY29uZiB0ZXN0cy4gSXQgaXMgdXBkYXRlZCB3aXRoCiAgdGhlIGxhdGVzdCBmZWF0dXJlcyBhbmQgcHJvdG9jb2xzIHRoYXQgbGliY3VybCBzdXBwb3J0cyBhbmQgaGFzIGEgbWlub3IgZml4CiAgdG8gYmV0dGVyIGRlYWwgd2l0aCB0aGUgb2JzY3VyZSBjYXNlIHdoZXJlIHNvbWVvbmUgaGFzIG1vcmUgdGhhbiBvbmUgbGliY3VybAogIGluc3RhbGxlZCBhdCB0aGUgc2FtZSB0aW1lLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDYpCi0gRGF2aWQgU2hhdyBmaW5hbGx5IHJlbW92ZWQgYWxsIHRyYWNlcyBvZiBHb3BoZXIgYW5kIHdlIGFyZSBub3cgb2ZmaWNpYWxseQogIG5vdCBzdXBwb3J0aW5nIGl0LiBJdCBoYXNuJ3QgYmVlbiBmdW5jdGlvbmluZyBmb3IgeWVhcnMgYW55d2F5LCBzbyB0aGlzIGlzCiAganVzdCBmaW5hbGx5IHN0YXRpbmcgd2hhdCBhbHJlYWR5IHdhcyB0cnVlLiBBbmQgYSBjbGVhbnVwIGF0IHRoZSBzYW1lIHRpbWUuCgotIEJyeWFuIEhlbmRlcnNvbiB0dXJuZWQgdGhlICdpbml0aWFsaXplZCcgdmFyaWFibGUgZm9yIGN1cmxfZ2xvYmFsX2luaXQoKQogIGludG8gYSBjb3VudGVyLCBhbmQgdGh1cyB5b3UgY2FuIG5vdyBkbyBtdWx0aXBsZSBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIHlvdQogIGFyZSB0aGVuIHN1cHBvc2VkIHRvIGRvIHRoZSBzYW1lIGFtb3VudCBvZiBjYWxscyB0byBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCiAgQnJ5YW4gaGFzIGFsc28gdXBkYXRlZCB0aGUgZG9jcyBhY2NvcmRpbmdseS4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA2KQotIEFuZHJldyBCZW5oYW0gZml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGNvdWxkIGNhdXNlIHRoZQogIHRlc3Qgc2NyaXB0IHRvIGtpbGwgYWxsIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzIGdyb3VwIQoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDYpCi0gTWljaGFlbCBKYWhuOgoKICBGaXhlZCBGVFBfU0tJUF9QQVNWX0lQIGFuZCBGVFBfVVNFX0VQU1YgdG8gImRvIHJpZ2h0IiB3aGVuIHVzZWQgb24gRlRQIHRocnUKICBIVFRQIHByb3h5LgoKICBGaXhlZCBQUk9YWVRVTk5FTCB0byB3b3JrIGZpbmUgd2hlbiB5b3UgZG8gZnRwIHRocm91Z2ggYSBwcm94eS4gIEl0IHdvdWxkCiAgcHJldmlvdXNseSBvdmVyd3JpdGUgaW50ZXJuYWwgbWVtb3J5IGFuZCBjYXVzZSB1bnByZWRpY3RlZCBiZWhhdmlvdXIhCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNikKLSBJIGRlY2lkZWQgdG8gZG9jdW1lbnQgdGhlICJzZWNyZXQgb3B0aW9uIiBoZXJlIG5vdywgYXMgSSd2ZSByZWNlaXZlZCAqTk8qCiAgZmVlZGJhY2sgYXQgYWxsIG9uIG15IG1haWxpbmcgbGlzdCByZXF1ZXN0cyBmcm9tIE5vdmVtYmVyIDIwMDU6CgogIEknbSBsb29raW5nIGZvciBmZWVkYmFjayBhbmQgY29tbWVudHMuIEkgYWRkZWQgc29tZSBleHBlcmltZW50YWwgY29kZSB0aGUKICBvdGhlciBkYXksIHRoYXQgYWxsb3dzIGEgbGliY3VybCB1c2VyIHRvIHNlbGVjdCB3aGF0IG1ldGhvZCBsaWJjdXJsIHNob3VsZAogIHVzZSB0byByZWFjaCBhIGZpbGUgb24gYSBGVFAoUykgc2VydmVyLgoKICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIENWUyBjb2RlIGFuZCBpbiByZWNlbnQgZGFpbHkgc25hcHNob3RzLgoKICBMZXQgbWUgZXhwbGFpbi4uLgoKICBUaGUgY3VycmVudCBuYW1lIGZvciB0aGUgb3B0aW9uIGlzIENVUkxPUFRfRlRQX0ZJTEVNRVRIT0QgKC0tZnRwLW1ldGhvZCBmb3IKICB0aGUgY29tbWFuZCBsaW5lIHRvb2wpIGFuZCB5b3Ugc2V0IGl0IHRvIGEgbG9uZyAodGhlcmUgYXJlIGN1cnJlbmx5IG5vCiAgZGVmaW5lcyBmb3IgdGhlIGFyZ3VtZW50IHZhbHVlcywganVzdCBwbGFpbiBudW1lcmljYWxzKS4gWW91IGNhbiBzZXQgdGhyZWUKICBkaWZmZXJlbnQgIm1ldGhvZHMiIHRoYXQgZG8gdGhpczoKCiAgMSBtdWx0aWN3ZCAtIGxpa2UgdG9kYXksIGN1cmwgd2lsbCBkbyBhIHNpbmdsZSBDV0Qgb3BlcmF0aW9uIGZvciBlYWNoIHBhdGgKICAgICAgICAgICBwYXJ0IGluIHRoZSBnaXZlbiBVUkwuIEZvciBkZWVwIGhpZXJhcmNoaWVzIHRoaXMgbWVhbnMgdmVyeSBtYW55CiAgICAgICAgICAgY29tbWFuZHMuIFRoaXMgaXMgaG93IFJGQzE3Mzggc2F5cyBpdCBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyB0aGUKICAgICAgICAgICBkZWZhdWx0LgoKICAyIG5vY3dkIC0gbm8gQ1dEIGF0IGFsbCBpcyBkb25lLCBjdXJsIHdpbGwgZG8gU0laRSwgUkVUUiwgU1RPUiBldGMgYW5kIGdpdmUKICAgICAgICAgICBhIGZ1bGwgcGF0aCB0byB0aGUgc2VydmVyLgoKICAzIHNpbmdsZWN3ZCAtIG1ha2Ugb25lIENXRCB3aXRoIHRoZSBmdWxsIHRhcmdldCBkaXJlY3RvcnkgYW5kIHRoZW4gb3BlcmF0ZQogICAgICAgICAgICBvbiB0aGUgZmlsZSAibm9ybWFsbHkiLgoKICAoV2l0aCB0aGUgY29tbWFuZCBsaW5lIHRvb2wgeW91IGRvIC0tZnRwLW1ldGhvZCBbTUVUSE9EXSwgd2hlcmUgW01FVEhPRF0gaXMKICBvbmUgb2YgIm11bHRpY3dkIiwgIm5vY3dkIiBvciAic2luZ2xlY3dkIi4pCgogIFdoYXQgZmVlZGJhY2sgSSdtIGludGVyZXN0ZWQgaW46CgogIDEgLSBEbyB0aGV5IHdvcmsgYXQgYWxsPyBEbyB5b3UgZmluZCBzZXJ2ZXJzIHdoZXJlIG9uZSBvZiB0aGVzZSBkb24ndCB3b3JrPwoKICAyIC0gV2hhdCB3b3VsZCBwcm9wZXIgbmFtZXMgZm9yIHRoZSBvcHRpb24gYW5kIGl0cyBhcmd1bWVudHMgYmUsIGlmIHdlCiAgICAgIGNvbnNpZGVyIHRoaXMgZmVhdHVyZSBnb29kIGVub3VnaCB0byBnZXQgaW5jbHVkZWQgYW5kIGRvY3VtZW50ZWQgaW4KICAgICAgdXBjb21pbmcgcmVsZWFzZXM/CgogIDMgLSBTaG91bGQgd2UgbWFrZSBsaWJjdXJsIGFibGUgdG8gIndhbGsgdGhyb3VnaCIgdGhlc2Ugb3B0aW9ucyBpbiBjYXNlIG9mCiAgICAgIChwYXRoIHJlbGF0ZWQpIGZhaWx1cmVzLCBvciBzaG91bGQgaXQgZmFpbCBhbmQgbGV0IHRoZSB1c2VyIHJlZG8gYW55CiAgICAgIHBvc3NpYmxlIHJldHJpZXM/CgogIChUaGlzIG9wdGlvbiBpcyBub3QgZG9jdW1lbnRlZCBpbiBhbnkgbWFuIHBhZ2UganVzdCB5ZXQgc2luY2UgSSdtIG5vdCBzdXJlCiAgdGhlc2UgbmFtZXMgd2lsbCBiZSB1c2VkIG9yIGlmIHRoZSBmdW5jdGlvbmFsaXR5IHdpbGwgZW5kIHVwIGV4YWN0bHkgbGlrZQogIHRoaXMuICBBbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMgd2UgaGF2ZSBubyB0ZXN0IGNhc2VzIGZvciB0aGVzZSB5ZXQuKQoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDYpCi0gV2hlbiB1c2luZyBhIGJhZCBwYXRoIG92ZXIgRlRQLCBhcyBpbiB3aGVuIGxpYmN1cmwgY291bGRuJ3QgQ1dEIGludG8gYWxsCiAgZ2l2ZW4gc3ViZGlycywgbGliY3VybCB3b3VsZCBzdGlsbCAicmVtZW1iZXIiIHRoZSBmdWxsIHBhdGggYXMgaWYgaXQgaXMgdGhlCiAgY3VycmVudCBkaXJlY3RvcnkgbGliY3VybCBpcyBpbiBzbyB0aGF0IHRoZSBuZXh0IGN1cmxfZWFzeV9wZXJmb3JtKCkgd291bGQKICBnZXQgcmVhbGx5IGNvbmZ1c2VkIGlmIGl0IHRyaWVkIHRoZSBzYW1lIHBhdGggYWdhaW4gLSBhcyBpdCB3b3VsZCBub3QgaXNzdWUKICBhbnkgQ1dEIGNvbW1hbmRzIGF0IGFsbCwgYXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBpbiB0aGUgInByb3BlciIgZGlyLgoKICBTdGFydGluZyBub3csIGEgZmFpbGVkIENXRCBjb21tYW5kIHNldHMgYSBmbGFnIHRoYXQgcHJldmVudHMgdGhlIHBhdGggdG8gYmUKICAicmVtZW1iZXJlZCIgYWZ0ZXIgcmV0dXJuaW5nLgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG4gZml4ZWQgc28gdGhhdCB0aGUgc2Vjb25kIENPTk5FQ1Qgd2hlbiBkb2luZyBGVFAgb3ZlciBhIEhUVFAKICBwcm94eSBhY3R1YWxseSB1c2VkIGEgbmV3IGNvbm5lY3Rpb24gYW5kIG5vdCBzZW50IHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUKICBmaXJzdCBzb2NrZXQhCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA2KQotIEFsZXhhbmRlciBMYXppYyBtYWRlIHRoZSBidWlsZGNvbmYgcnVuIHRoZSBidWlsZGNvbmYgaW4gdGhlIGFyZXMgZGlyIGlmIHRoYXQKICBpcyBwcmVzZW50IGluc3RlYWQgb2YgdHJ5aW5nIHRvIG1pbWljIHRoYXQgc2NyaXB0IGluIGN1cmwncyBidWlsZGNvbmYKICBzY3JpcHQuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA2KQotIEFuZHJlcyBHYXJjaWEgbWFkZSB0aGUgVEZUUCB0ZXN0IHNlcnZlciBidWlsZCB3aXRoIG1pbmd3LgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDUpCi0gSmVhbiBKYWNxdWVzIERyb3VpbiBwb2ludGVkIG91dCB0aGF0IHlvdSBjb3VsZCBvbmx5IGhhdmUgYSB1c2VyIG5hbWUgb3IKICBwYXNzd29yZCBvZiAxMjcgYnl0ZXMgb3IgbGVzcyBlbWJlZGRlZCBpbiBhIFVSTCwgd2hlcmUgYWN0dWFsbHkgdGhlIGNvZGUKICB1c2VzIGEgMjU1IGJ5dGUgYnVmZmVyIGZvciBpdCEgTW9kaWZpZWQgbm93IHRvIHVzZSB0aGUgZnVsbCBidWZmZXIgc2l6ZS4KCkRhbmllbCAoMTIgRGVjZW1iZXIgMjAwNSkKLSBEb3YgTXVyaWsgY29ycmVjdGVkIHRoZSBIVFRQX09OTFkgZGVmaW5lIHRvIGRpc2FibGUgdGhlIFRGVFAgc3VwcG9ydCBwcm9wZXJseQoKVmVyc2lvbiA3LjE1LjEgKDcgRGVjZW1iZXIgMjAwNSkKCkRhbmllbCAoNiBEZWNlbWJlciAyMDA1KQotIEZ1bGwgdGV4dCBoZXJlOiBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDUxMjA3Lmh0bWwgUG9pbnRlZCBvdXQgYnkKICBTdGVmYW4gRXNzZXIuCgogIFZVTE5FUkFCSUxJVFkKCiAgbGliY3VybCdzIFVSTCBwYXJzZXIgZnVuY3Rpb24gY2FuIG92ZXJmbG93IGEgbWFsbG9jZWQgYnVmZmVyIGluIHR3byB3YXlzLCBpZgogIGdpdmVuIGEgdG9vIGxvbmcgVVJMLgoKICBUaGVzZSBvdmVyZmxvd3MgaGFwcGVuIGlmIHlvdQoKICAxIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG5vIHByb3RvY29sIChsaWtlICJodHRwOi8vIikgcHJlZml4LCB1c2luZyBubyBzbGFzaAogICAgICBhbmQgdGhlIHN0cmluZyBpcyAyNTYgYnl0ZXMgb3IgbG9uZ2VyLiBUaGlzIGxlYWRzIHRvIGEgc2luZ2xlIHplcm8gYnl0ZQogICAgICBvdmVyZmxvdyBvZiB0aGUgbWFsbG9jZWQgYnVmZmVyLgoKICAyIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG9ubHkgYSBxdWVzdGlvbiBtYXJrIGFzIHNlcGFyYXRvciAobm8gc2xhc2gpIGJldHdlZW4KICAgICAgdGhlIGhvc3QgYW5kIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIEJvdGggb3ZlcmZsb3dzIGNhbiBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaW5wdXQgc3RyaW5nLCBsZWFkaW5nIHRvIHR3byBzaW5nbGUKICB6ZXJvIGJ5dGUgb3ZlcndyaXRlcy4KCiAgVGhlIGFmZmVjdGVkIGZsYXcgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBhIHJlZGlyZWN0LCBidXQgdGhlIGxvbmcgVVJMIG11c3QKICBiZSBwYXNzZWQgaW4gImRpcmVjdGx5IiB0byBsaWJjdXJsLiBJdCBtYWtlcyB0aGlzIGEgImxvY2FsIiBwcm9ibGVtLiBPZgogIGNvdXJzZSwgbG90cyBvZiBwcm9ncmFtcyBtYXkgc3RpbGwgcGFzcyBpbiB1c2VyLXByb3ZpZGVkIFVSTHMgdG8gbGliY3VybAogIHdpdGhvdXQgZG9pbmcgbXVjaCBzeW50YXggY2hlY2tpbmcgb2YgdGhlaXIgb3duLCBhbGxvd2luZyBhIHVzZXIgdG8gZXhwbG9pdAogIHRoaXMgdnVsbmVyYWJpbGl0eS4KCiAgVGhlcmUgaXMgbm8ga25vd24gZXhwbG9pdCBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDUpCi0gSmFtaWUgTmV3dG9uIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGZpbGU6Ly8gY29kZSB3b3VsZCBjbG9zZSgpIGEgemVybwogIGZpbGUgZGVzY3JpcHRvciBpZiBnaXZlbiBhIG5vbi1leGlzdGluZyBmaWxlLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA1KQotIERvdWcgS2F1Zm1hbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIERKR1BQCiAgYWdhaW4gdXNpbmcgY29uZmlndXJlLgoKLSBZYW5nIFRzZSBwcm92aWRlZCBhIHdob2xlIHNlcmllcyBvZiBwYXRjaGVzIHRvIGNsZWFyIHVwIGNvbXBpbGVyIHdhcm5pbmdzIG9uCiAgTVNWQyA2LgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDA1KQotIEkgZXh0ZW5kZWQgYSBwYXRjaCBmcm9tIERhdmlkIFNoYXcgdG8gbWFrZSBsaWJjdXJsIF9hbHdheXNfIHByb3ZpZGUgYW4gZXJyb3IKICBzdHJpbmcgaW4gdGhlIGdpdmVuIGVycm9yIGJ1ZmZlciB0byBhZGRyZXNzIHRoZSBmbGF3IG1lbnRpb24gb24gMjEgc2VwIDIwMDUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDUpCi0gQXBwbGllZCBBbGJlcnQgQ2hpbidzIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwucGMgcGtnY29uZmlnIGZpbGUgZ2V0CiAgaW5zdGFsbGVkIG9uICdtYWtlIGluc3RhbGwnIHRpbWUuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDUpCi0gUXVhZ21pcmUgcmVwb3J0ZWQgdGhhdCBoZSBuZWVkZWQgdG8gcmFpc2UgYSBOVExNIGJ1ZmZlciBmb3IgU1NQSSB0byB3b3JrCiAgcHJvcGVybHkgZm9yIGEgY2FzZSwgYW5kIHNvIHdlIGRpZC4gV2UgcmFpc2VkIGl0IGV2ZW4gZm9yIG5vbi1TU1BJIGJ1aWxkcwogIGJ1dCBpdCBzaG91bGQgbm90IGRvIGFueSBoYXJtLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzU2NzE1CgotIEphbiBLdW5kZXIncyBkZWJpYW4gYnVnIHJlcG9ydAogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODAgaWRlbnRpZmllZCBhIHdlaXJkCiAgZXJyb3IgbWVzc2FnZSBmb3Igd2hlbiB5b3UgdHJ5IHRvIHVwbG9hZCBhIGZpbGUgYW5kIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5CiAgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0IHNlcnZlci4KCi0gWWFuZyBUc2UgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gbGliL3NzbHVzZS5jIHdpdGggT3BlblNTTCAwLjkuOCBhbmQgaW4KICBsaWIvbWVtZGVidWcuaCB0aGF0IHNob3dlZCB1cCBpbiBoaXMgbXN2YyBidWlsZHMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDUpCi0gRGViaWFuIGJ1ZyByZXBvcnQgMzM4NjgxIGJ5IEphbiBLdW5kZXI6IG1ha2UgY3VybCBiZXR0ZXIgZGV0ZWN0IGFuZCByZXBvcnQKICBiYWQgbGltaXQtcmF0ZSB1bml0czoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzM4NjgxIE5vdyBjdXJsIHdpbGwgcmV0dXJuCiAgZXJyb3IgaWYgYSBiYWQgdW5pdCBpcyB1c2VkLgoKLSBUaGFua3MgdG8gdGhpcyBuaWNlIHN1bW1hcnkgb2YgcG9sbCgpIGltcGxlbWVudGF0aW9uczoKICBodHRwOi8vd3d3LmdyZWVuZW5kLm9yZy51ay9yamsvMjAwMS8wNi9wb2xsLmh0bWwgYW5kIGZ1cnRoZXIgdGVzdHMgYnkgRXVnZW5lCiAgS290bHlhcm92LCB3ZSBub3cga25vdyB0aGF0IGN5Z3dpbidzIHBvbGwgcmV0dXJucyBvbmx5IFBPTExIVVAgb24gcmVtb3RlCiAgY29ubmVjdGluIGNsb3N1cmUgc28gd2UgY2hlY2sgZm9yIHRoYXQgY2FzZSAodG9vKSBhbmQgcmUtZW5hYmxlIHBvbGwgZm9yCiAgY3lnd2luIGJ1aWxkcy4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNSkKLSBFdWdlbmUgS290bHlhcm92IGZvdW5kIG91dCB0aGF0IGN5Z3dpbidzIHBvbGwoKSBmdW5jdGlvbiBpc24ndCBkb2luZyB0aGluZ3MKICByaWdodDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNS0xMS8wMDQ1Lmh0bWwgc28gd2Ugbm93IGRpc2FibGUKICBwb2xsKCkgYW5kIHVzZSBzZWxlY3QoKSBvbiBjeWd3aW4gdG9vICh3ZSBhbHJlYWR5IGRvIHRoZSBzYW1lIGNob2ljZSBvbiBNYWMKICBPUyBYKQoKLSBEaW1hIEJhcnNreSBwYXRjaGVkIHByb2JsZW0gIzEzNDg5MzA6IHRoZSBHbnVUTFMgY29kZSBjb21wbGV0ZWx5IGlnbm9yZWQKICBjbGllbnQgY2VydGlmaWNhdGVzISAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTM0ODkzMCkuCgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDUpCi0gRGF2aWQgTGFuZyBmaXhlZCBJUHY2IHN1cHBvcnQgZm9yIFRGVFAhCgotIEludHJvZHVjaW5nIHJhbmdlIHN0ZXBwaW5nIHRvIHRoZSBjdXJsIGdsb2JiaW5nIHN1cHBvcnQuIE5vdyB5b3UgY2FuIHNwZWNpZnkKICBzdGVwIGNvdW50ZXIgYnkgYWRkaW5nIDpbbnVtXSB3aXRoaW4gdGhlIGJyYWNrZXRzIHdoZW4gc3BlY2lmeWluZyBhIHJhbmdlOgoKICAgWzEtMTAwOjEwXQogICBbYS16OjJdCgogIElmIG5vIHN0ZXAgY291bnRlciBpcyBzZXQsIGl0IGRlZmF1bHRzIHRvIDEgYXMgYmVmb3JlOgoKICAgWzEtMTAwXQogICBbZC1oXQoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDUpCi0gUmVtb3ZlZCB0aGUgdXNlIG9mIEFJX0NBTk9OTkFNRSBpbiB0aGUgSVB2Ni1lbmFibGVkIHJlc29sdmVyIGZ1bmN0aW9ucyBzaW5jZQogIHdlIHJlYWxseSBoYXZlIG5vIHVzZSBmb3IgcmV2ZXJzZSBsb29rdXBzIG9mIHRoZSBhZGRyZXNzLgoKICBJIHRydWx5IGhvcGUgdGhlc2UgYXJlIHRoZSBsYXN0IHJldmVyc2UgbG9va3VwcyB3ZSBoYWQgbGluZ2VyaW5nIGluIHRoZQogIGNvZGUhCgotIERtaXRyeSBCYXJ0c2V2aWNoIGRpc2NvdmVyZWQgc29tZSBpc3N1ZXMgaW4gY29tcGF0aWJpbHR5IG9mIFNTUEktZW5hYmxlZAogIHZlcnNpb24gb2YgbGliY3VybCB3aXRoIGRpZmZlcmVudCBXaW5kb3dzIHZlcnNpb25zLiBDdXJyZW50IHZlcnNpb24gb2YKICBsaWJjdXJsIGltcG9ydHMgU1NQSSBmdW5jdGlvbnMgZnJvbSBzZWN1cjMyLmRsbC4gSG93ZXZlciwgdW5kZXIgV2luZG93cyBOVAogIDQuMCB0aGVzZSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQgaW4gc2VjdXJpdHkuZGxsLCB1bmRlciBXaW5kb3dzIDl4IC0gaW4KICBzZWN1cjMyLmRsbCBhbmQgV2luZG93cyAyMDAwIGFuZCBYUCBjb250YWlucyBib3RoIHRoZXNlIERMTHMgKHNlY3VyaXR5LmRsbAogIGp1c3QgZm9yd2FyZHMgY2FsbHMgdG8gc2VjdXIzMi5kbGwpLgoKICBEbWl0cnkncyBwYXRjaCBsb2FkcyBwcm9wZXIgbGlicmFyeSBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gV2luZG93cwogIHZlcnNpb24uIEZ1bmN0aW9uIEluaXRTZWN1cml0eUludGVyZmFjZSgpIGlzIHVzZWQgdG8gb2J0YWluIHBvaW50ZXJzIHRvIGFsbAogIG9mIFNTUEkgZnVuY3Rpb24gaW4gb25lIHN0cnVjdHVyZS4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDA1KQotIFZpbG1vcyBOZWJlaGFqIGltcHJvdmVkIGxpYmN1cmwncyBMREFQIGFiaWxpdGllczoKCiAgVGhlIExEQVAgY29kZSBpbiBsaWJjdXJsIGNhbid0IGhhbmRsZSBMREFQIHNlcnZlcnMgb2YgTERBUHYzIG5vciBiaW5hcnkKICBhdHRyaWJ1dGVzIGluIExEQVAgb2JqZWN0cy4gU28sIEkgbWFkZSBhIHF1aWNrIHBhdGNoIHRvIGFkZHJlc3MgdGhlc2UKICBwcm9ibGVtcy4KCiAgVGhlIHNvbHV0aW9uIGlzIHNpbXBsZTogaWYgd2UgY29ubmVjdCB0byBhbiBMREFQIHNlcnZlciwgZmlyc3QgdHJ5IExEQVB2MwogICh3aGljaCBpcyB0aGUgcHJlZmVycmVkIHByb3RvY29sIGFzIG9mIG5vdykgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIExEQVB2Mi4KICBJbiBjYXNlIG9mIGJpbmFyeSBhdHRyaWJ1dGVzLCB3ZSBmaXJzdCBjb252ZXJ0IHRoZW0gdG8gYmFzZTY0LCBqdXN0IGxpa2UgdGhlCiAgb3BlbmxkYXAgY2xpZW50IGRvZXMuIEl0IHVzZXMgbGRhcF9nZXRfdmFsdWVzX2xlbigpIGluc3RlYWQgb2YKICBsZGFwX2dldF92YWx1ZXMoKSB0byBiZSBhYmxlIHRvIHJldHJpZXZlIGJpbmFyeSBhdHRyaWJ1dGVzIGNvcnJlY3RseS4gSQogIGRlZmluZWQgdGhlIG5lY2Vzc2FyeSBMREFQIG1hY3JvcyBpbiBsaWIvbGRhcC5jIHRvIGJlIGFibGUgdG8gY29tcGlsZQogIGxpYmN1cmwgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2YgbGlibGRhcAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDUpCi0gTmlzIEpvcmdlbnNlbiBmaWxlZCBidWcgcmVwb3J0ICMxMzM4NjQ4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzg2NDgpIHdoaWNoIHJlYWxseSBpcyBtb3JlIG9mIGEKICBmZWF0dXJlIHJlcXVlc3QsIGJ1dCBhbnl3YXkuIEl0IHBvaW50ZWQgb3V0IHRoYXQgLS1tYXgtcmVkaXJzIGRpZCBub3QgYWxsb3cKICBpdCB0byBiZSBzZXQgdG8gMCwgd2hpY2ggdGhlbiB3b3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvbiB0aGUgZmlyc3QKICBMb2NhdGlvbjogZm91bmQuIEJhc2VkIG9uIE5pcycgcGF0Y2gsIG5vdyBsaWJjdXJsIHN1cHBvcnRzIENVUkxPUFRfTUFYUkVESVJTCiAgc2V0IHRvIDAsIG9yIC0xIGZvciBpbmZpbml0eS4gQWRkZWQgdGVzdCBjYXNlIDI3NCB0byB2ZXJpZnkuCgotIHRvbW1pbmtbYXRdcG9zdC5wbCByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMzM3NzIzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzc3MjMpIHRoYXQgY3VybCBjb3VsZCBub3QgdXBsb2FkCiAgYmluYXJ5IGRhdGEgZnJvbSBzdGRpbiBvbiBXaW5kb3dzIGlmIHRoZSBkYXRhIGNvbnRhaW5lZCBjb250cm9sLVogKGhleCAxYSkKICBzaW5jZSB0aGF0IGlzIHRyZWF0ZWQgYXMgZW5kLW9mLWZpbGUgd2hlbiByZWFkIGluIHRleHQgbW9kZS4gR2lzbGUgVmFuZW0KICBwb2ludGVkIG91dCB0aGUgZml4LCBhbmQgSSBtYWRlIGJvdGggLVQgYW5kIC0tZGF0YS1iaW5hcnkgdGFrZSBhZHZhbnRhZ2Ugb2YKICBpdC4KCi0gSmF6IEZyZXNoIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHVzZWQgIi1yIFtudW1iZXJdIiBhcyB3YXMgd3JvbmdseSBkZXNjcmliZWQKICBpbiB0aGUgbWFuIHBhZ2UsIGN1cmwgd291bGQgc2VuZCBhbiBpbnZhbGlkIEhUVFAgUmFuZ2U6IGhlYWRlci4gVGhlIGNvcnJlY3QKICB3YXkgd291bGQgYmUgdG8gdXNlICItciBbbnVtYmVyXS0iIG9yIGV2ZW4gIi1yIC1bbnVtYmVyXSIuIFN0YXJ0aW5nIG5vdywKICBjdXJsIHdpbGwgd2FybiBpZiB0aGlzIGlzIGRpc2NvdmVyZWQsIGFuZCBhdXRvbWF0aWNhbGx5IGFwcGVuZCBhIGRhc2ggdG8gdGhlCiAgcmFuZ2UgYmVmb3JlIHBhc3NpbmcgaXQgdG8gbGliY3VybC4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA1KQotIEFtb2wgUGF0dGVrYXIgcmVwb3J0ZWQgYSBidWcgd2l0aCBncmVhdCBkZXRhaWwgYW5kIGEgZmluZSBleGFtcGxlIGluIGJ1ZwogICMxMzI2MzA2IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2MzA2KS4gV2hlbiB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0IHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBhbmQgb25lIG9mCiAgdGhlIGFkZHJlc3NlcyBmYWlscyB0byBjb25uZWN0ICh0aGUgc2VydmVyIG11c3QgZXhpc3QgYW5kIHJlc3BvbmQsIGp1c3Qgbm90CiAgYWNjZXB0IGNvbm5lY3Rpb25zKSBsaWJjdXJsIGxlYWtzIGEgc29ja2V0IGRlc2NyaXB0b3IuIFRoYW5rcyB0byB0aGUgZmluZQogIHJlcG9ydCwgSSBjb3VsZCBmaW5kIGFuZCBmaXggdGhpcy4KCkRhbmllbCAoMjIgT2N0b2JlciAyMDA1KQotIERpbWEgQmFyc2t5IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEdudVRMUy1lbmFibGVkIGxpYmN1cmwgaW4gYnVnIHJlcG9ydAogICMxMzM0MzM4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM0MzM4KS4gV2hlbiByZWFkaW5nIGFuIFNTTAogIHN0cmVhbSBmcm9tIGEgc2VydmVyIGFuZCB0aGUgc2VydmVyIHJlcXVlc3RzIGEgInJlaGFuZHNoYWtlIiwgdGhlIGN1cnJlbnQKICBjb2RlIHNpbXBseSByZXR1cm5zIHRoaXMgYXMgYW4gZXJyb3IuIEkgaGF2ZSBubyBnb29kIHdheSB0byB0ZXN0IHRoaXMsIGJ1dAogIEkndmUgYWRkZWQgYSBjcnVkZSBhdHRlbXB0IG9mIGRlYWxpbmcgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgLQogIGl0IG1ha2VzIGEgYmxvY2tpbmcgaGFuZHNoYWtlIGlmIHRoaXMgaGFwcGVucy4gRG9uZSBsaWtlIHRoaXMgYmVjYXVzZSBmaXhpbmcKICB0aGlzIHRoZSAicHJvcGVyIiB3YXkgKHRoYXQgd291bGQgaGFuZHNoYWtlIGFzeW5jaHJvbm91c2x5KSB3aWxsIHJlcXVpcmUKICBxdWl0ZSBzb21lIHdvcmsgYW5kIEkgcmVhbGx5IG5lZWQgYSBnb29kIHdheSB0byB0ZXN0IHRoaXMgdG8gZG8gc3VjaCBhCiAgY2hhbmdlLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDUpCi0gIk9mZXIiIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGVuIGxpYmN1cmwgcmUtdXNlZCBhIGNvbm5lY3Rpb24gYW5kIGZhaWxlZCB0byBkbwogIGl0LCBpdCBjb3VsZCB0aGVuIGFjY2lkZW50YWxseSBhY3R1YWxseSBjcmFzaC4gUHJlc3VtYWJseSwgdGhpcyBjb25jZXJucyBGVFAKICBjb25uZWN0aW9ucy4gIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzAzMTAKCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlIHNvIHRoYXQgdGhlIHN0YXRpYyBkZWJ1ZyBTU0wgbGlicyBhcmUKICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYW5kIG5vdCB0byB0aGUgbGliY3VybGQubGliCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMyNjY3NgoKLSBCcmFkZm9yZCBCcnVjZSBtYWRlIHRoZSB3aW5kb3dzIHJlc29sdmVyIGNvZGUgcHJvcGVybHkgcmV0dXJuCiAgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX1BST1hZIGFuZCBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBvbiByZXNvbHZpbmcKICBlcnJvcnMgKGFzIGRvY3VtZW50ZWQpLgoKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDUpCi0gRGF2ZSBEcmliaW4gbWFkZSBsaWJjdXJsIHVuZGVyc3RhbmQgYW5kIGhhbmRsZSBjYXNlcyB3aGVuIHRoZSBzZXJ2ZXIKICAod3JvbmdseSkgc2VuZHMgKnR3byogV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJzIGZvciBEaWdlc3QuIFdoaWxlIHRoaXMgc2hvdWxkCiAgbmV2ZXIgaGFwcGVuIGluIGEgc2FuZSB3b3JsZCwgbGliY3VybCBwcmV2aW91c2x5IGdvdCBpbnRvIGFuIGluZmluaXRlIGxvb3AKICB3aGVuIHRoaXMgb2NjdXJyZWQuIERhdmUgYWRkZWQgdGVzdCAyNzMgdG8gdmVyaWZ5IHRoaXMuCgotIFRlbXByaW11cyBpbXByb3ZlZCB0aGUgTVNWQyBtYWtlZmlsZTogIm1ha2VzIGEgYnVpbGQgb3B0aW9uIGF2YWlsYWJsZSBzbyBpZgogIHlvdSBzZXQgcnRsaWJjZmc9c3RhdGljIGZvciB0aGUgbWFrZSwgdGhlbiBpdCB3b3VsZCBidWlsZCB3aXRoIC9NVC4gVGhlCiAgZGVmYXVsdCBiZWhhdmlvdXIgaXMgL01EICh0aGUgb3JpZ2luYWwpLiIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2NjY1CgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNSkKLSBSZXZlcnRlZCB0aGUgTElCQ1VSTF9WRVJTSU9OX05VTSBjaGFuZ2UgZnJvbSBPY3RvYmVyIDYuIEFzIERhdmUgRHJpYmluCiAgcmVwb3J0ZWQsIHRoZSBkZWZpbmUgaXMgdXNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgaXMgYXNzdW1lZCB0byB1c2UKICB0aGUgMHhZWVhYWlogZm9ybWF0LiBUaGlzIG1hZGUgImN1cmwtY29uZmlnIC0tdmVybnVtIiBmYWlsIGluIHRoZSA3LjE1LjAKICByZWxlYXNlIHZlcnNpb24uCgpWZXJzaW9uIDcuMTUuMCAoMTMgT2N0b2JlciAyMDA1KQoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDUpCi0gTWljaGFlbCBTdXR0b24gb2YgaURFRkVOU0UgcmVwb3J0ZWQgYW5kIEkgZml4ZWQgYSBzZWN1cml0ZnkgZmxhdyBpbiB0aGUgTlRMTQogIGNvZGUgdGhhdCB3b3VsZCBvdmVyZmxvdyBhIGJ1ZmZlciBpZiBnaXZlbiBhIHRvbyBsb25nIHVzZXIgbmFtZSBvciBkb21haW4KICBuYW1lLiBUaGlzIHdvdWxkIGhhcHBlbiBpZiB5b3UgZW5hYmxlIE5UTE0gYXV0aGVudGljYXRpb24gYW5kIGVpdGhlcgoKICBBIC0gcGFzcyBpbiBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdG8gbGliY3VybCB0aGF0IHRvZ2V0aGVyIGFyZSBsb25nZXIKICAgICAgdGhhbiAxOTIgYnl0ZXMKCiAgQiAtIGFsbG93IChsaWIpY3VybCB0byBmb2xsb3cgSFRUUCAicmVkaXJlY3RzIiAoTG9jYXRpb246IGFuZCB0aGUKICAgICAgYXBwcm9wcmlhdGUgSFRUUCAzMHggcmVzcG9uc2UgY29kZSkgYW5kIHRoZSBuZXcgVVJMIGNvbnRhaW5zIGEgVVJMIHdpdGgKICAgICAgYSB1c2VyIG5hbWUgYW5kIGRvbWFpbiBuYW1lIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlciB0aGFuIDE5MiBieXRlcwoKICBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL3NlY3VyaXR5Lmh0bWwgZm9yIGZ1cnRoZXIgZGV0YWlscyBhbmQgdXBkYXRlcwoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNSkKLSBEYXJyeWwgSG91c2UgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggdXNpbmcgLXogdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBGVFAuCiAgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZSBnaXZlbiB0aW1lIHN0YW1wIHdhcyBleGFjdCB0aGUgc2FtZSBhcyB0aGUgcmVtb3RlCiAgdGltZSBzdGFtcCwgdGhlIGZpbGUgd291bGQgc3RpbGwgd3JvbmdseSBiZSBkb3dubG9hZGVkLiBBZGRlZCB0ZXN0IGNhc2UgMjcyCiAgdG8gdmVyaWZ5LgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNSkKLSBEb21lbmljbyBBbmRyZW9saSBmaXhlZCBhIG1hbiBwYWdlIG1hbGZvcm1hdCBhbmQgcmVtb3ZlZCBvZGQgKDB4YTApIGJ5dGVzCiAgZnJvbSB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgdGhlIGRhdGUgcGFyc2VyIGhhZCB3cm9uZyBvZmZzZXQgc3RvcmVkIGZvcgogIHRoZSBNRVNUIGFuZCBDRVNUIHRpbWUgem9uZXMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA1KQotIERhdmlkIFlhbiBmaWxlZCBidWcgIzEyOTkxODEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyOTkxODEpCiAgdGhhdCBpZGVudGlmaWVkIGEgc2lsbHkgcHJvYmxlbSB3aXRoIENvbnRlbnQtUmFuZ2U6IGhlYWRlcnMgd2l0aCB0aGUgJ2J5dGVzJwogIGtleXdvcmQgd3JpdHRlbiBpbiBhIGRpZmZlcmVudCBjYXNlIHRoYW4gYWxsIGxvd2VyY2FzZSEgSXQgd291bGQgY2F1c2UgYQogIHNlZ2ZhdWx0IQoKLSBUSiBTYXVuZGVycyBvZiB0aGUgcHJvZnRwZCBwcm9qZWN0IGlkZW50aWZpZWQgYW5kIHBvaW50ZWQgb3V0IHByb2JsZW1zIHdpdGgKICB0aGUgbW9kaWZpZWQgRlRQUyBuZWdvdGlhdGlvbiBjaGFuZ2Ugb2YgQXVndXN0IDE5IDIwMDUuIFRodXMsIHdlIHJldmVydCB0aGUKICBjaGFuZ2UgYmFjayB0byBwcmUtNy4xNC4xIHN0YXR1cy4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDUpCi0gRml4ZWQgImN1dCBvZmYiIHNlbnRlbmNlIGluIHRoZSBsaWJjdXJsLXR1dG9yaWFsIG1hbiBwYWdlOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMDUKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHdoYXQgdGhlIGRlZmF1bHQKICBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gYW5kIENVUkxPUFRfV1JJVEVEQVRBIG1lYW46CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdGhhdCBDVVJMT1BUX0VSUk9SQlVGRkVSCiAgc29tZXRpbWVzIGRvZXNuJ3QgZmlsbCBpbiB0aGUgYnVmZmVyIGV2ZW4gdGhvdWdoIGl0IGlzIHN1cHBvc2VkIHRvOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMTMKCi0gV2hlbiBDVVJMRV9VUkxfTUFMRk9STUFUIGlzIHJldHVybmVkIGR1ZSB0byBhIG1pc3NpbmcgVVJMLCBpdCBub3cgaGFzIGFuCiAgZXJyb3Igc3RyaW5nIHNldC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDUpCi0gRG1pdHJ5IEJhcnRzZXZpY2ggbWFkZSB0aGUgU1NQSSBzdXBwb3J0IHdvcmsgb24gV2luZG93cyA5eCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwNSkKLSBBZGRlZCBhIFRGVFAgc2VydmVyIHRvIHRoZSB0ZXN0IHN1aXRlIGFuZCBtYWRlIHRoZSB0ZXN0IHN1aXRlIGNhcGFibGUgb2YKICB1c2luZyBpdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwNSkKLSBCZW4gTWFkc2VuJ3MgZGV0YWlsZWQgcmVwb3J0cyB0aGF0IGZ1bm5pbHkgZW5vdWdoIG9ubHkgb2NjdXJyZWQgd2l0aCBjZXJ0YWluCiAgZ2xpYmMgdmVyc2lvbnMgdHVybmVkIG91dCB0byBiZSBjdXJsIHVzaW5nIGFuIGFscmVhZHkgY2xvc2VkIGZpbGUgaGFuZGxlCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyAobGlrZSB3aGVuIHNhdmluZyBGVFAgc2VydmVyICJoZWFkZXJzIikuCgotIFNjb3R0IERhdmlzIGhlbHBlZCBtZSB0cmFjayBkb3duIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBIVFRQIHNlcnZlciB0aGF0IG1hZGUKICB0ZXN0IGNhc2UgNTYgd3JvbmdseSBmYWlsIGF0IHRpbWVzLiBJdCB0dXJuZWQgb3V0IGl0IHdhcyBkdWUgdG8gdGhlIHNlcnZlcgogIGZpbmRpbmcgdGhlIGVuZCBvZiBhIGNodW5rZWQtZW5jb2RlZCBQT1NUIHRvbyBlYXJseS4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNSkKLSBOb3cgY3VybCB3YXJucyBpZiBhbiB1bmtub3duIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIC13Ly0td3JpdGVvdXQgYXJndW1lbnQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDUpCi0gSSBhcHBsaWVkIE5pY29sYXMgRnJhbudvaXMnIG1hbiBwYWdlIHBhdGNoIGhlIHBvc3RlZCB0byB0aGUgRGViaWFuIGJ1ZwogIHRyYWNrZXIuIEl0IGNvcnJlY3RlZCB0d28gbGluZXMgdGhhdCBzdGFydGVkIHdpdGggYXBvc3Ryb3BoZXMsIHdoaWNoIGlzbid0CiAgbGVnYWwgbnJvZmYgZm9ybWF0LiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI2NTExCgotIEFkZGVkIC0tZnRwLXNraXAtcGFzdi1pcCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wsIHRoYXQgc2V0cyB0aGUgbmV3CiAgQ1VSTE9QVF9GVFBfU0tJUF9QQVNWX0lQIG9wdGlvbi4gSXQgbWFrZXMgbGliY3VybCByZS11c2UgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uJ3MgSVAgYWRkcmVzcyB3aGVuIHNldHRpbmcgdXAgdGhlIGRhdGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mCiAgZXh0cmFjdHRpbmcgdGhlIElQIGFkZHJlc3MgZnJvbSB0aGUgUEFTViByZXNwb25zZS4gSXQgaGFzIHR1cm5lZCBvdXQgdGhpcwogIGZlYXR1cmUgaXMgZnJlcXVlbnRseSBuZWVkZWQgYnkgcGVvcGxlIHRvIGNpcmN1bXZlbnQgc2lsbHkgc2VydmVycyBhbmQgc2lsbHkKICBmaXJld2FsbHMsIGVzcGVjaWFsbHkgd2hlbiBGVFBTIGlzIHVzZWQgYW5kIHRoZSBQQVNWIGNvbW1hbmQtcmVzcG9uc2UgaXMKICBzZW50IGVuY3J0eXBlZC4KCiAgU3BvbnNvcmVkIGJ5IENVKkFuc3dlcnMKCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwNSkKLSBKb2huIEtlbGx5IGFkZGVkIFRGVFAgc3VwcG9ydCB0byBsaWJjdXJsLiBBIGJ1bmNoIG9mIG5ldyBlcnJvciBjb2RlcyB3YXMKICBhZGRlZC4gVE9ETzogYWRkIHRoZW0gdG8gZG9jcy4gYWRkIFRGVFAgc2VydmVyIHRvIHRlc3Qgc3VpdGUuIGFkZCBURlRQIHRvCiAgbGlzdCBvZiBwcm90b2NvbHMgd2hlcmVldmVyIHRob3NlIGFyZSBtZW50aW9uZWQuCgpWZXJzaW9uIDcuMTQuMSAoMSBTZXB0ZW1iZXIgMjAwNSkKCkRhbmllbCAoMjkgQXVndXN0IDIwMDUpCi0gS2V2aW4gTHVzc2llciBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsbGliLmRzcCBhbmQgaG93IHRvIGZpeCBpdC4KCi0gSWdvciBQb2x5YWtvdiBmaXhlZCBhIHJhdGhlciBuYXN0eSBwcm9ibGVtIHdpdGggdGhlIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIKICBmb3IgV2luZG93cywgdGhhdCBjb3VsZCBsZWFkIHRvIGFuIEFjY2VzcyBWaW9sYXRpb24gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2FzIHVzZWQgZHVlIHRvIGFuIGlzc3VlIHdpdGggaG93IHRoZSByZXNvbHZlciB0aHJlYWQgd2FzIGFuZCB3YXMgbm90CiAgdGVybWluYXRlZC4KCi0gU2ltb24gSm9zZWZzc29uIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBjdXJsIHRvIGdldCBidWlsdCB0byB1c2UgR05VIEdTUwogIGluc3RlYWQgb2YgTUlUL0hlaW1kYWwgZm9yIEdTUyBjYXBhYmlsaXRpZXMuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA1KQotIFRvYnkgUGV0ZXJzb24gYWRkZWQgQ1VSTE9QVF9JR05PUkVfQ09OVEVOVF9MRU5HVEggdG8gdGhlIGxpYnJhcnksIGFjY2Vzc2libGUKICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB3aXRoIC0taWdub3JlLWNvbnRlbnQtbGVuZ3RoLiBUaGlzIHdpbGwgbWFrZSBpdAogIGVhc2llciB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEFwYWNoZSAxLnggKGFuZCBzaW1pbGFyKSBzZXJ2ZXJzIHRoYXQgYXJlCiAgc3RpbGwgaGF2aW5nIHByb2JsZW1zIHNlcnZpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMiBvciA0IEdCLiBXaGVuIHRoaXMgb3B0aW9uCiAgaXMgZW5hYmxlZCwgY3VybCB3aWxsIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlCiAgY29ubmVjdGlvbiB0byBzaWduYWwgZW5kIG9mIHRyYW5zZmVyLiBJIHdyb3RlIHRlc3QgY2FzZSAyNjkgdGhhdCBydW5zIGEKICBzaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdvcmtzLgoKLSAoVHJ5aW5nIGhhcmQgdG8gZXhjbHVkZSBlbW90aW9ucyBub3cuKSB2YWxncmluZCB2ZXJzaW9uIDMgc3VkZGVubHkgcmVuYW1lZAogIHRoZSAtLWxvZ2ZpbGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byAtLWxvZy1maWxlLCBhbmQgdGh1cyB0aGUgdGVzdCBzY3JpcHQKICB2YWxncmluZCBhdXRvZGV0ZWN0aW9uIG5vdyBoYXMgeWV0IGFub3RoZXIgdmVyc2lvbiBjaGVjayB0byBkbyBhbmQgdGhlbiBpdAogIGFsdGVycyB0aGUgdmFsZ3JpbmQgY29tbWFuZCBsaW5lIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiB1c2luZyBHbnVUTFMgd2l0aCB0aGUgZGVmYXVsdCBidW5kbGUsIHdoaWNoCiAgcHJldmlvdXNseSBmYWlsZWQgZHVlIHRvIEdudVRMUyBub3QgYWxsb3dpbmcgeDUwOSB2MSBDQSBjZXJ0cyBieSBkZWZhdWx0LgogIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkLgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwNSkKLSBOb3JiZXJ0IE5vdm90bnkgaGFkIHByb2JsZW1zIHdpdGggRlRQUyBhbmQgaGUgaGVscGVkIG1lIHdvcmsgb3V0IGEgcGF0Y2gKICB0aGF0IG1hZGUgY3VybCBydW4gZmluZSBpbiBoaXMgZW5kLiBUaGUga2V5IHdhcyB0byBtYWtlIHN1cmUgd2UgZG8gdGhlCiAgU1NML1RMUyBuZWdvdGlhdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgVENQIGNvbm5lY3QgaXMgZG9uZSBhbmQgbm90IGFmdGVyCiAgYSBmZXcgb3RoZXIgY29tbWFuZHMgaGF2ZSBiZWVuIHNlbnQgbGlrZSB3ZSBkaWQgcHJldmlvdXNseS4gSSBkb24ndCBjb25zaWRlcgogIHRoaXMgY2hhbmdlIG5lY2Vzc2FyeSB0byBvYmV5IHRoZSBzdGFuZGFyZHMsIEkgdGhpbmsgdGhpcyBzZXJ2ZXIgaXMgcGlja2llcgogIHRoYW4gd2hhdCB0aGUgc3BlY3MgYWxsb3cgaXQgdG8gYmUsIGJ1dCBJIGNhbid0IHNlZSBob3cgdGhpcyBtb2RpZmllZAogIGxpYmN1cmwgY29kZSBjYW4gYWRkIGFueSBwcm9ibGVtcyB0byB0aG9zZSB3aG8gYXJlIGludGVycHJldGluZyB0aGUKICBzdGFuZGFyZHMgbW9yZSBsaWJlcmFsbHkuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA1KQotIEplZmYgUG9obG1leWVyIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBhc2sgbGliY3VybCB0byBsb2FkIGEgY29va2llZmlsZSAod2l0aAogIENVUkxPUFRfQ09PS0lFRklMRSksIGFkZCBhIGNvb2tpZSAod2l0aCBDVVJMT1BUX0NPT0tJRUxJU1QpLCB0ZWxsIGl0IHRvCiAgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGdpdmVuIGNvb2tpZSBqYXIgYW5kIHRoZW4gbmV2ZXIgYWN0dWFsbHkgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkgLSB0aGUgZ2l2ZW4gZmlsZShzKSB0byByZWFkIHdhcyBuZXZlciByZWFkIGJ1dCB0aGUKICBvdXRwdXQgZmlsZSB3YXMgd3JpdHRlbiBhbmQgdGh1cyBpdCBjYXVzZWQgYSAiZnVubnkiIHJlc3VsdC4KCi0gV2hpbGUgZG9pbmcgc29tZSB0ZXN0cyBmb3IgdGhlIGJ1ZyBhYm92ZSwgSSBub3RpY2VkIHRoYXQgRmlyZWZveCBnZW5lcmF0ZXMKICBsYXJnZSBudW1iZXJzIChmb3IgdGhlIGV4cGlyZSB0aW1lKSBpbiB0aGUgY29va2llcy50eHQgZmlsZSBhbmQgbGliY3VybAogIGRpZG4ndCB0cmVhdCB0aGVtIHByb3Blcmx5LiBOb3cgaXQgZG9lcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDUpCi0gQWRkZWQgbW9yZSB2ZXJib3NlICJ3YXJuaW5nIiBtZXNzYWdlcyB0byB0aGUgY3VybCBjbGllbnQgZm9yIGNhc2VzIHdoZXJlIGl0CiAgZmFpbHMgdG8gb3Blbi9yZWFkIGZpbGVzIGV0YyB0byBoZWxwIHVzZXJzIGRpYWdub3NlIHdoeSBpdCBkb2Vzbid0IGRvIHdoYXQKICB5b3UnZCBleHBlY3QgaXQgdG8uIENvbnZlcnRlZCBsb3RzIG9mIG9sZCBtZXNzYWdlcyB0byB1c2UgdGhlIG5ldyBnZW5lcmljCiAgZnVuY3Rpb24gSSB3cm90ZSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwNSkKLSBKYW1lcyBCdXJzYSBpZGVudGlmaWVkIGEgbGliY3VybCBIVFRQIGJ1ZyBhbmQgYSBnb29kIHdheSB0byByZXBlYXQgaXQuIElmIGEKICBzaXRlIHJlc3BvbmRzIHdpdGggYmFkIEhUVFAgcmVzcG9uc2UgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IGhlYWRlciBhdCBhbGwsCiAgb25seSBhIHJlc3BvbnNlIGJvZHksIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGFib3J0IHRoZQogIHRyYW5zZmVyLCBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVhbCBlZmZlY3QgYnV0IHRoZSB3cml0ZSBjYWxsYmFjayB3b3VsZCBiZQogIGNhbGxlZCBvbmNlIG1vcmUgYW55d2F5LgoKRGFuaWVsICgxMiBBdWd1c3QgMjAwNSkKLSBCYXNlZCBvbiBSaWNoYXJkIENsYXl0b24ncyByZXBvcnRzLCBJIGZvdW5kIG91dCB0aGF0IHVzaW5nIGN1cmwgLWQgQGZpbGVuYW1lCiAgd2hlbiAnZmlsZW5hbWUnIHdhcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIG1hZGUgY3VybCB1c2UgYSBHRVQgcmVxdWVzdAogIGluc3RlYWQuCgotIFRoZSB0aW1lIGNvbmRpdGlvbiBpbGxlZ2FsIHN5bnRheCB3YXJuaW5nIGlzIG5vdyBpbmhpYml0ZWQgaWYgLXMgaXMgdXNlZC4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDUpCi0gTWFyaW8gU2Nocm9lZGVyIGZvdW5kIG91dCB0aGF0IG9uZSBvZiB0aGUgZGVidWcgY2FsbGJhY2tzIGNhbGxzIHRoYXQgcmVnYXJkcwogIFNTTCBkYXRhIHdpdGggdGhlIENVUkxJTkZPX1RFWFQgdHlwZSBjbGFpbWVkIHRoYXQgdGhlIGRhdGEgd2FzIG9uZSBieXRlCiAgbGFyZ2VyIHRoYW4gaXQgYWN0dWFsbHkgaXMsIHRodXMgZmFsc2VseSB0ZWxsaW5nIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQogIHRlcm1pbmF0aW5nIHplcm8gd2FzIHBhcnQgb2YgdGhlIGRhdGEuCgpEYW5pZWwgKDkgQXVndXN0IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIHRoZSBvZmZzZXRzIHVzZWQgZm9yIGRhdGUgcGFyc2luZ3Mgd2hlbiB0aGUgdGltZQogIHpvbmUgbmFtZSBvZiBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB3YXMgdXNlZC4gRm9yIGV4YW1wbGUsIFBEVCB2cyBQRFMuIFRoaXMKICBmbGF3IHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlIG5ldyBkYXRlIHBhcnNlciAoMTEgc2VwIDIwMDQgLSA3LjEyLjIpLgogIEZvcnR1bmF0ZWx5LCBubyB3ZWIgc2VydmVyIG9yIGNvb2tpZSBzdHJpbmcgZXRjIHNob3VsZCBiZSB1c2luZyBzdWNoIHRpbWUKICB6b25lIG5hbWVzIHRodXMgbGltaXRpbmcgdGhlIGVmZmVjdCBvZiB0aGlzIGJ1Zy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNSkKLSBKb24gR3J1YmJzIGZpbGVkIGJ1ZyByZXBvcnQgIzEyNDk5NjIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI0OTk2Mikgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIE5UTE0gb24gYSBIVFRQIHByb3h5IGlmIGFuIEZUUCBVUkwgd2FzIGdpdmVuLiBsaWJjdXJsIG5vdyBwcm9wZXJseQogIHN3aXRjaGVzIHRvIHB1cmUgSFRUUCBpbnRlcm5hbGx5IHdoZW4gYW4gSFRUUCBwcm94eSBpcyB1c2VkLCBldmVuIGZvciBGVFAKICBVUkxzLiBUaGUgcHJvYmxlbSB3b3VsZCBhbHNvIG9jY3VyIHdpdGggb3RoZXIgbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDUpCi0gV2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTLCBjdXJsLWNvbmZpZyBkaWRuJ3QgaW5jbHVkZSAiU1NMIiB3aGVuCiAgLS1mZWF0dXJlcyB3YXMgdXNlZC4KCkRhbmllbCAoMjggSnVseSAyMDA1KQotIElmIGFueSBvZiB0aGUgb3B0aW9ucyBDVVJMT1BUX0hUVFBHRVQsIENVUkxPUFRfUE9TVCBhbmQgQ1VSTE9QVF9IVFRQUE9TVCBpcwogIHNldCB0byAxLCBDVVJMT1BUX05PQk9EWSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byAwLgoKRGFuaWVsICgyNyBKdWx5IDIwMDUpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZXMgb3ZlciB0aGUgbGFzdCB3ZWVrOiBmaXhlZCBudW1lcm91cyBtaW5vciBjb25maWd1cmUKICBvcHRpb24gcGFyc2luZyBmbGF3czogLS13aXRob3V0LWdudXRscywgLS13aXRob3V0LXNwbmVnbyAtLXdpdGhvdXQtZ3NzYXBpCiAgYW5kIC0td2l0aG91dC1rcmI0LiBTcGVsbGZpeGVkIHNldmVyYWwgZXJyb3IgbWVzc2FnZXMuCgotIFBldGVyaXMgS3J1bWlucyBhZGRlZCBDVVJMT1BUX0NPT0tJRUxJU1QgYW5kIENVUkxJTkZPX0NPT0tJRUxJU1QsIHdoaWNoIGlzIGEKICBzaW1wbGUgaW50ZXJmYWNlIHRvIGV4dHJhY3RpbmcgYW5kIHNldHRpbmcgY29va2llcyBpbiBsaWJjdXJsJ3MgaW50ZXJuYWwKICAiY29va2llIGphciIuIFNlZSB0aGUgbmV3IGNvb2tpZV9pbnRlcmZhY2UuYyBleGFtcGxlIGNvZGUuCgpEYW5pZWwgKDEzIEp1bHkgMjAwNSkKLSBEaWVnbyBDYXNvcnJhbiBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIEFtaWdhIGFnYWluLgoKRGFuaWVsICgxMiBKdWx5IDIwMDUpCi0gQWRyaWFuIFNjaHV1ciBhZGRlZCB0cmFpbGVyIHN1cHBvcnQgaW4gdGhlIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtLiBUaGUKICB0cmFpbGVyIGlzIHRoZW4gc2VudCB0byB0aGUgbm9ybWFsIGhlYWRlciBjYWxsYmFjay9zdHJlYW0uIEkgd3JvdGUgdXAgdGVzdAogIGNhc2UgMjY2IHRvIHZlcmlmeSB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eS4gRG8gbm90ZSB0aGF0IHRlc3QgY2FzZSAzNAogIGNvbnRhaW5zIGEgZmxhd2VkIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtIHRoYXQgc3RpbGwgd29ya3MgdGhlIHNhbWUuCgpEYW5pZWwgKDUgSnVseSAyMDA1KQotIEdpc2xlIFZhbmVtIGNhbWUgdXAgd2l0aCBhIG5pY2UgbGl0dGxlIHdvcmstYXJvdW5kIGZvciBidWcgIzEyMzAxMTgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIzMDExOCkuIEl0IHNlZW1zIHRoZSBXaW5kb3dzIChNU1ZDKQogIGxpYmMgdGltZSBmdW5jdGlvbnMgbWF5IHJldHVybiBkYXRhIG9uZSBob3VyIG9mZiBpZiBUWiBpcyBub3Qgc2V0IGFuZAogIGF1dG9tYXRpYyBEU1QgYWRqdXN0bWVudCBpcyBlbmFibGVkLiBUaGlzIG1hZGUgY3VybF9nZXRkYXRlKCkgcmV0dXJuIHdyb25nCiAgdmFsdWUsIGFuZCBpdCBhbHNvIGNvbmNlcm5lZCBpbnRlcm5hbCBjb29raWUgZXhwaXJhdGlvbnMgZXRjLgoKRGFuaWVsICg0IEp1bHkgMjAwNSkKLSBBbmRyZXcgQnVzaG5lbGwgcHJvdmlkZWQgZW5vdWdoIGluZm8gZm9yIG1lIHRvIHRlbGwgdGhhdCB3ZSBiYWRseSBuZWVkZWQgdG8KICBmaXggdGhlIENPTk5FQ1QgYXV0aGVudGljYXRpb24gY29kZSB3aXRoIG11bHRpLXBhc3MgYXV0aCBtZXRob2RzIChzdWNoIGFzCiAgTlRMTSkgYXMgaXQgZGlkbid0IHByZXZpb3VzbHkgcHJvcGVybHkgaWdub3JlIHJlc3BvbnNlLWJvZGllcyAtIGluIGZhY3QgaXQKICBzdG9wcGVkIHJlYWRpbmcgYWZ0ZXIgYWxsIHJlc3BvbnNlIGhlYWRlcnMgaGFkIGJlZW4gcmVjZWl2ZWQuIFRoaXMgY291bGQKICBsZWFkIHRvIGxpYmN1cmwgc2VuZGluZyB0aGUgbmV4dCByZXF1ZXN0IGFuZCByZWFkaW5nIHRoZSBib2R5IGZyb20gdGhlIGZpcnN0CiAgcmVxdWVzdCBhcyByZXNwb25zZSB0byB0aGUgc2Vjb25kIHJlcXVlc3QuIChJIGFsc28gcmVuYW1lZCB0aGUgZnVuY3Rpb24sCiAgd2hpY2ggd2Fzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQuLi4pCgogIFRoZSBiZXN0IGZpeCB3b3VsZCB0byBvbmNlIGFuZCBmb3IgYWxsIG1ha2UgdGhlIENPTk5FQ1QgY29kZSB1c2UgdGhlCiAgb3JkaW5hcnkgcmVxdWVzdCBzZW5kaW5nL3JlY2VpdmluZyBjb2RlLCB0cmVhdGluZyBpdCBhcyBhbnkgb3JkaW5hcnkgcmVxdWVzdAogIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwtcHVycG9zZSBmdW5jdGlvbiB3ZSBoYXZlIG5vdy4gSXQgc2hvdWxkIG1ha2UgaXQKICBiZXR0ZXIgZm9yIG11bHRpLWludGVyZmFjZSB0b28uIEFuZCBwb3NzaWJseSBsZWFkIHRvIGxlc3MgY29kZS4uLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjY1IGZvciB0aGlzLiBJdCBkb2Vzbid0IHdvcmsgYXMgYSBfcmVhbGx5XyBnb29kIHRlc3QgY2FzZQogIHNpbmNlIHRoZSB0ZXN0IHByb3h5IGlzIHRvbyBzdHVwaWQsIGJ1dCB0aGUgdGVzdCBjYXNlIGhlbHBzIHdoZW4gcnVubmluZyB0aGUKICBkZWJ1Z2dlciB0byB2ZXJpZnkuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNSkKLSBEYW4gRmFuZHJpY2ggaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQncyBhYmlsaXR5IHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kCiAgb2Ygc3RyZXJyb3JfcigpIEFQSSB0aGF0IGlzIHVzZWQgd2hlbiBjcm9zcy1jb21waWxpbmcuIElmIF9fR0xJQl9fIGlzCiAgZGVmaW5lZCwgaXQgYXNzdW1lcyB0aGUgZ2xpYmMgQVBJLiBJZiBub3QsIGl0IGlzc3VlcyBhIG5vdGljZSBhcyBiZWZvcmUgdGhhdAogIHRoZSB1c2VyIG5lZWRzIHRvIG1hbnVhbGx5IGVkaXQgbGliL2NvbmZpZy5oIGZvciB0aGlzLgoKRGFuaWVsICgyMyBKdW5lIDIwMDUpCi0gRGF2aWQgU2hhdydzIGZpeCB0aGF0IHVuaWZpZXMgcHJveHkgc3RyaW5nIHRyZWF0bWVudCBzbyB0aGF0IGEgcHJveHkgZ2l2ZW4KICB3aXRoIENVUkxPUFRfUFJPWFkgY2FuIHVzZSBhIGh0dHA6Ly8gcHJlZml4IGFuZCB1c2VyICsgcGFzc3dvcmQuIFRoZSB1c2VyCiAgYW5kIHBhc3N3b3JkIGZpZWxkcyBhcmUgbm93IGFsc28gVVJMIGRlY29kZWQgcHJvcGVybHkuIFRlc3QgY2FzZSAyNjQgYWRkZWQKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3IHVwZGF0ZWQgbGliY3VybC5tNAoKRGFuaWVsICgxNCBKdW5lIDIwMDUpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBwb3RlbnRpYWwgdGhyZWFkIGhhbmRsZSBsZWFrLiBCdWcgcmVwb3J0ICMxMjE2NTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTY1MDApLiAgQ29tbWVudCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNi8wMDU5Lmh0bWwKCkRhbmllbCAoMTMgSnVuZSAyMDA1KQotIE1hZGUgYnVpbGRjb25mIHJ1biBsaWJ0b29saXplIGluIHRoZSBhcmVzIGRpciB0b28gKGluc3BpcmVkIGJ5IFR1cG9uZSdzCiAgcmV2ZXJ0ZWQgcGF0Y2gpLgoKRGFuaWVsICg5IEp1bmUgMjAwNSkKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgZmluZHRvb2wgZml4IGluIGJ1aWxkY29uZiAoc2xpZ2h0bHkgZWRpdGVkKQoKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgaGVhZCAtbiBmaXggaW4gYnVpbGRjb25mLgoKRGFuaWVsICg4IEp1bmUgMjAwNSkKLSBSZXZlcnRlZCBUdXBvbmUncyBwYXRjaCBhZ2FpbiwgaXQgYnJva2UgbnVtZXJvdXMgYXV0b2J1aWxkcy4gTGV0J3MgYXBwbHkgaXQKICBpbiBwaWVjZXMsIG9uZSBieSBvbmUgYW5kIHNlZSB3aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRvIHdvcmsgYWxsIG92ZXIuCgpEYW5pZWwgKDYgSnVuZSAyMDA1KQotIFR1cG9uZSBBbGZyZWRvIGZpeGVkIHRocmVlIHByb2JsZW1zIGluIGJ1aWxkY29uZjoKCiAgMSkgZmluZHRvb2wgZG9lcyBsb29rIHBlciB0b29sIGluIFBBVEggYW5kIHRoaW5rIC4vcGVybCBpcyB0aGUgcGVybAogIGV4ZWN1dGFibGUsIHdoaWxlIGlzIGp1c3QgYSBsb2NhbCBkaXJlY3RvcnkgKEkgaGF2ZSAuIGluIHRoZSBQQVRIKQoKICAyKSBJIGdvdCBzZXZlcmFsIHdhcm5pbmcgZm9yIGhlYWQgLTEgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaGVhZCAtbiAxCgogIDMpIGFyZXMgZGlyZWN0b3J5IGlzIG1pc3Npbmcgc29tZSBmaWxlIChtaXNzaW5nIGlzIG1pc3NpbmcgOi0pICkgYmVjYXVzZQogIGF1dG9tYWtlIGFuZCBmcmllbmRzIGlzIG5vdCBydW4uCgpEYW5pZWwgKDMgSnVuZSAyMDA1KQotIEFkZGVkIGRvY3MvbGliY3VybC9nZXRpbmZvLXRpbWVzLCBiYXNlZCBvbiBmZWVkYmFjayBmcm9tICdFZGknOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTExNzgzMjU3OTgyOTkmc3VwcG9ydD15ZXMKCi0gQW5kcmVzIEdhcmNpYSBwcm92aWRlZCB5ZXQgYW5vdGhlciB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbwogIHRoYXQgdGhleSBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCkRhbmllbCAoMSBKdW5lIDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgYy1hcmVzIG5vdyBhZGRzIHRoZSBjYXJlcyBsaWIgYmVmb3JlIHRoZSBvdGhlciBsaWJzLAogIHRvIG1ha2UgaXQgYnVpbGQgZmluZSB3aXRoIG1pbmd3LiBJbnNwaXJlZCBieSBUdXBvbmUgQWxmcmVkbydzIGJ1ZyByZXBvcnQKICBhbmQgcGF0Y2g6IGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTI5NDAKCkRhbmllbCAoMzEgTWF5IDIwMDUpCi0gVG9kZCBLdWxlc3phIHJlcG9ydGVkIGEgZmxhdyBpbiB0aGUgcHJveHkgb3B0aW9uLCBzaW5jZSBhIG51bWVyaWNhbCBJUHY2CiAgYWRkcmVzcyB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZS4gSXQgaXMgbm93LCBidXQgcmVxdWlyZXMgaXQgd3JpdHRlbgogIFJGQzI3MzItc3R5bGUsIHdpdGhpbiBicmFja2V0cyAtIHdoaWNoIGluY2lkZW50bHkgaXMgaG93IHlvdSBlbnRlciBudW1lcmljYWwKICBJUHY2IGFkZHJlc3NlcyBpbiBVUkxzLiBUZXN0IGNhc2UgMjYzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgTWF5IDIwMDUpCi0gRXJpYyBDb29wZXIgcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIHdpdGggSFRUUCBzZXJ2ZXJzIHRoYXQgcmVzcG9uZHMgd2l0aAogIGJpbmFyeSB6ZXJvZXMgd2l0aGluIHRoZSBoZWFkZXJzLiBUaGV5IGNvbmZ1c2VkIGxpYmN1cmwgdG8gZG8gd3Jvbmcgc28gdGhlCiAgZG93bmxvYWRlZCBoZWFkZXJzIGJlY29tZSBpbmNvbXBsZXRlLiBUaGUgZml4IGlzIG5vdyB2ZXJpZmllZCB3aXRoIHRlc3QgY2FzZQogIDI2Mi4gaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMxMDk0OAoKRGFuaWVsICgyNSBNYXkgMjAwNSkKLSBGaXhlZCBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0IHN1aXRlLCBhbmQgaW4gcGFydGljdWxhciB0aGUgRlRQIHRlc3QgY2FzZXMKICBzaW5jZSBpdCBwcmV2aW91c2x5IHdhcyBmYWlsaW5nIGV2ZXJ5IG5vdyBhbmQgdGhlbiBpbiBhIG5vbnNlbnNlIG1hbm5lci4KCi0gLS10cmFjZS10aW1lIG5vdyBvdXRwdXRzIHRoZSBmdWxsIG1pY3Jvc2Vjb25kLCBhbGwgNiBkaWdpdHMuCgpEYW5pZWwgKDI0IE1heSAyMDA1KQotIEFuZHJlcyBHYXJjaWEgcHJvdmlkZWQgYSB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbyB0aGF0IHRoZXkKICBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCi0gQW55IDJ4eCByZXNwb25zZSAoYW5kIG5vdCBqdXN0IDIwMCkgaXMgbm93IGNvbnNpZGVyZWQgYSBmaW5lIHJlc3BvbnNlIHRvCiAgVFlQRSwgYXMgc29tZSBzZXJ2ZXJzIG9idmlvdXNseSBzZW5kcyBhIDIyNiB0aGVyZS4gQWRkZWQgdGVzdCBjYXNlIDI2MSB0bwogIHZlcmlmeS4gQmFzZWQgb24gYSBxdWVzdGlvbi9yZXBvcnQgYnkgR2VvcmcgV2ljaGVyc2tpLgoKRGFuaWVsICgyMCBNYXkgMjAwNSkKLSBJbXByb3ZlZCBydW50ZXN0cy5wbCB0byBhbGxvdyBzdGRvdXQgdGVzdHMgdG8gYmUgbW9kZT10ZXh0IGFzIHdlbGwsIGp1c3QKICBhcyBmaWxlIGNvbXBhcmlzb25zIGFscmVhZHkgc3VwcG9ydHMuIEFkZGVkIHRoaXMgaW5mbyB0byB0aGUgRklMRUZPUk1BVAogIGRvY3MuCgpEYW5pZWwgKDE4IE1heSAyMDA1KQotIEpvaG4gTWNHb3dhbiBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxMjA0NDM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMDQ0MzUpIHdpdGggbWFsZm9ybWVkIFVSTHMgbGlrZQogICJodHRwOi8vc29tZWhvc3Q/ZGF0YSIgYXMgaXQgYWRkZWQgYSBzbGFzaCB0b28gbXVjaCBpbiB0aGUgcmVxdWVzdCAoIkdFVAogIC8/ZGF0YS8iLi4uKS4gQWRkZWQgdGVzdCBjYXNlIDI2MCB0byB2ZXJpZnkuCgotIFRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBmYWlsZWQgdG8gZGV0ZWN0IHRoZSBwcm9wZXIgQVBJIGF0CiAgdGltZXMsIGxpa2Ugb24gSFAtVVggMTAuMjAuIFRoZW4gbGliL3N0cmVycm9yLmMgYmFkbHkgYXNzdW1lZCB0aGUgZ2xpYmMKICB2ZXJzaW9uIGlmIHRoZSBwb3NpeCBkZWZpbmUgd2Fzbid0IHNldCAoc2luY2UgaXQgX2hhZF8gZm91bmQgYSBzdHJlcnJvcl9yKS4KCkRhbmllbCAoMTYgTWF5IDIwMDUpCi0gVGhlIGdtdGltZV9yKCkgZnVuY3Rpb24gaW4gSFAtVVggMTAuMjAgaXMgYnJva2VuLiBBYm91dCAxMyB0ZXN0IGNhc2VzIGZhaWwKICBkdWUgdG8gdGhpcy4gVGhlcmUncyBub3cgYSBjb25maWd1cmUgY2hlY2sgdGhhdCBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIGJhZAogIGZ1bmN0aW9uIGFuZCBub3QgdXNlIGl0IG9uIHN1Y2ggc3lzdGVtcy4KClZlcnNpb24gNy4xNC4wICgxNiBNYXkgMjAwNSkKCkRhbmllbCAoMTMgTWF5IDIwMDUpCi0gR3JpZ29yeSBFbnRpbiByZXBvcnRlZCB0aGF0IGN1cmwncyBjb25maWd1cmUgZGV0ZWN0cyBhIGZpbmUgcG9sbCgpIGZvciBNYWMKICBPUyBYIDEwLjQgKHdoaWxlIDEwLjMgb3IgbGF0ZXIgZGV0ZWN0ZWQgYSAiYmFkIiBvbmUpLCBidXQgdGhlIGV4ZWN1dGFibGUKICBkb2Vzbid0IHdvcmsgYXMgZ29vZCBhcyBpZiBidWlsdCB3aXRob3V0IHBvbGwoKS4gSSd2ZSBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgdG8gYWx3YXlzIHNraXAgdGhlIGZpbmUtcG9sbCgpIHRlc3Qgb24gTWFjIE9TIFggKGRhcndpbikuCgpEYW5pZWwgKDEyIE1heSAyMDA1KQotIFdoZW4gZG9pbmcgYSBzZWNvbmQgcmVxdWVzdCAoYWZ0ZXIgYSBkaXNjb25uZWN0KSB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZSwKICBvdmVyIGEgcHJveHkgdGhhdCB1c2VzIE5UTE0gYXV0aGVudGljYXRpb24sIGxpYmN1cmwgZmFpbGVkIHRvIHVzZSBOVExNIGFnYWluCiAgcHJvcGVybHkgKHRoZSBhdXRoIG1ldGhvZCB3YXMgYWNjaWRlbnRhbGx5IHJlc2V0IHRvIHRoZSBzYW1lIGFzIGhhZCBiZWVuIHNldAogIGZvciBob3N0IGF1dGgsIHdoaWNoIGRlZmF1bHRzIHRvIEJhc2ljKS4gQnVnIHJlcG9ydCAjMTIwMDY2MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjAwNjYxKSBpZGVudGlmaWVkIHRoZSB0aGUgcHJvYmxlbSBhbmQKICB0aGUgZml4LgoKLSBJZiAtei8tLXRpbWUtY29uZCBpcyB1c2VkIHdpdGggYW4gaW52YWxpZCBkYXRlIHN5bnRheCwgdGhpcyBpcyBubyBsb25nZXIKICBzaWxlbnRseSBkaXNjYXJkZWQuIEluc3RlYWQgYSBwcm9wZXIgd2FybmluZyBtZXNzYWdlIGlzIGRpcGxheWVkIHRoYXQKICBpbmZvcm1zIGFib3V0IGl0LiBCdXQgaXQgc3RpbGwgY29udGludWVzIHdpdGhvdXQgdGhlIGNvbmRpdGlvbi4KClZlcnNpb24gNy4xNC4wLXByZTIgKDExIE1heSAyMDA1KQoKRGFuaWVsICgxMSBNYXkgMjAwNSkKLSBTdGFydGluZyBub3csIGxpYmN1cmwgc2VuZHMgYSBsaXR0bGUgZGlmZmVyZW50IHNldCBvZiBoZWFkZXJzIGluIGl0cyBkZWZhdWx0CiAgSFRUUCByZXF1ZXN0czoKCiAgQSkgTm9ybWFsIG5vbi1wcm94eSBIVFRQOgogICAgLSBubyBtb3JlICJQcmFnbWE6IG5vLWNhY2hlIiAodGhpcyBvbmx5IG1ha2VzIHNlbnNlIHRvIHByb3hpZXMpCgogIEIpIE5vbi1DT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiUHJhZ21hOiBuby1jYWNoZSIgaXMgdXNlZCAobGlrZSBiZWZvcmUpCiAgICAtICJQcm94eS1Db25uZWN0aW9uOiBLZWVwLWFsaXZlIiAoZm9yIG9sZGVyIHN0eWxlIDEuMC1wcm94aWVzKQoKICBDKSBDT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiSG9zdDogW25hbWVdOltwb3J0XSIKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiCgogIFRoZSBBKSBjYXNlIGlzIG1vc3RseSB0byByZWR1Y2UgdGhlIGRlZmF1bHQgaGVhZGVyIHNpemUgYW5kIHJlbW92ZSBhCiAgcG9pbnRsZXNzIGhlYWRlci4KCiAgVGhlIEIpIGlzIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggSFRUUCAxLjAgcHJveGllcwoKICBUaGUgQykgaGVhZGVycyBhcmUgYm90aCB0byBhZGRyZXNzIChyYXJlKSBwcm9ibGVtcyB3aXRoIHNvbWUgcHJveGllcy4gVGhlCiAgY29kZSBpbiBsaWJjdXJsIHRoYXQgZGVhbHMgd2l0aCBDT05ORUNUIHJlcXVlc3RzIG5lZWQgYSByZXdyaXRlLCBidXQgaXQKICBmZWVscyBsaWtlIGEgdG9vIGJpZyBhIGpvYiBmb3IgbWUgdG8gZG8gbm93LiBEZXRhaWxzIGFyZSBhZGRlZCBpbiB0aGUgY29kZQogIGNvbW1lbnRzIGZvciBub3cuCgogIFVwZGF0ZWQgYSBsYXJnZSBhbW91bnQgb2YgdGVzdCBjYXNlcyB0byByZWZsZWN0IHRoZSBuZXdzLgoKRGFuaWVsICgxMCBNYXkgMjAwNSkKLSBIYWxmLWJha2VkIGF0dGVtcHQgdG8gYmFpbCBvdXQgaWYgc2VsZWN0KCkgcmV0dXJucyBfb25seV8gZXJyb3JmZHMgd2hlbiB0aGUKICB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4gQW4gYXR0ZW1wdCB0byBmaXggQWxsYW4ncyBwcm9ibGVtLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDUvMDA3My5odG1sIGFuZCB0aGUgcmVzdCBvZiB0aGF0IHRocmVhZAogIGZvciBkZXRhaWxzLgoKICBJJ20gc3RpbGwgbm90IHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgZml4LCBidXQuLi4KClZlcnNpb24gNy4xNC4wLXByZTEgKDkgTWF5IDIwMDUpCgpEYW5pZWwgKDIgTWF5IDIwMDUpCi0gU29ydCBvZiAiZml4ZWQiIEtOT1dOX0JVR1MgIzQ6IGN1cmwgbm93IGJ1aWxkcyBJUHY2IGVuYWJsZWQgb24gQUlYIDQuMy4gQXQKICBsZWFzdCBpdCBzaG91bGQgbm8gbG9uZ2VyIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGhhdmUKICBBSV9OVU1FUklDSE9TVCBzbyB3ZSBjYW5ub3QgZ2V0YWRkcmluZm8oKSBhbnkgbnVtZXJpY2FsIGFkZHJlc3NlcyB3aXRoIGl0CiAgKHdlIHVzZSB0aGF0IGZvciBGVFAgUE9SVC9FUFJUKSEgU28sIEkgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHRoZSBnZXRhZGRyaW5mbygpIGlzIHdvcmtpbmcsIHRvIHVzZSBBSV9OVU1FUklDSE9TVCBzaW5jZSB0aGVuCiAgaXQnbGwgZmFpbCBvbiBBSVggNC4zIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQKICBkaXNhYmxlZC4KCi0gQWRkZWQgLS10cmFjZS10aW1lIHRoYXQgd2hlbiB1c2VkIGFkZHMgYSB0aW1lIHN0YW1wIHRvIGVhY2ggdHJhY2UgbGluZSB0aGF0CiAgLS10cmFjZSwgLS10cmFjZS1hc2NpaSBhbmQgLS12ZXJib3NlIG91dHB1dC4gSSBhbHNvIG1hZGUgdGhlICc+JyBkaXNwbGF5CiAgc2VwYXJhdGUgZWFjaCBsaW5lIG9uIHRoZSBsaW5lZmVlZCBzbyB0aGF0IEhUVFAgcmVxdWVzdHMgZXRjIGxvb2sgbmljZXIgaW4KICB0aGUgLXYgb3V0cHV0LgoKLSBNYWRlIGN1cmwgcmVjb2duaXplIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgTHlueCAoYW5kIG90aGVycz8pIHN1cHBvcnQgZm9yCiAgcG9pbnRpbmcgb3V0IHRoZSBDQSBjZXJ0IHBhdGgvZmlsZTogU1NMX0NFUlRfRElSIGFuZCBTU0xfQ0VSVF9GSUxFLiBJZgogIENVUkxfQ0FfQlVORExFIGlzIG5vdCBzZXQsIHRoZXkgYXJlIGNoZWNrZWQgYWZ0ZXJ3YXJkcy4KCiAgTGlrZSBiZWZvcmU6IG9uIHdpbmRvd3MgaWYgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LCBpdCBjaGVja3MgZm9yIHRoZSBjYSBjZXJ0CiAgZmlsZSBsaWtlIHRoaXM6CgogIDEuIGFwcGxpY2F0aW9uJ3MgZGlyZWN0b3J5CiAgMi4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogIDMuIFdpbmRvd3MgU3lzdGVtIGRpcmVjdG9yeSAoZS5nLiBDOlx3aW5kb3dzXHN5c3RlbTMyKQogIDQuIFdpbmRvd3MgRGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3MpCiAgNS4gYWxsIGRpcmVjdG9yaWVzIGFsb25nICVQQVRIJQoKRGFuaWVsICgxIE1heSAyMDA1KQotIFRoZSBydW50ZXN0cy5wbCBzY3JpcHQgbm93IHN0YXJ0cyB0ZXN0IHNlcnZlcnMgYnkgZG9pbmcgZm9yaygpIGFuZCBleGVjKCkKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBhcHByb2FjaC4gVGhpcyBpcyBsZXNzIGNvbXBsaWNhdGVkIGFuZCBzaG91bGQKICBob3BlZnVsbHkgbGVhZCB0byBsZXNzICJsZWFrZWQiIHNlcnZlcnMgKHNlcnZlcnMgdGhhdCBhcmVuJ3Qgc3RvcHBlZAogIHByb3Blcmx5IHdoZW4gdGhlIHRlc3RzIGFyZSBzdG9wcGVkKS4KCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBhIGNhc2Ugd2hlbiB5b3UgZGlkICJjdXJsIC1JIFtVUkxdIiBhbmQgaXQKICBjb21wbGFpbmVkIG9uIHRoZSBjaHVua2VkIGVuY29kaW5nLCBldmVuIHRob3VnaCBhIEhFQUQgc2hvdWxkIG5ldmVyIHJldHVybiBhCiAgYm9keSBhbmQgdGh1cyBpdCBjYW5ub3QgYmUgYSBjaHVua2VkLWVuY29kaW5nIHByb2JsZW0hCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDUpCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBvdXQgdGhhdCAobGliKWN1cmwgU0lHU0VHVmVkIHdoZW4gdXNpbmcKICAtLWludGVyZmFjZSBvbiBhbiBhZGRyZXNzIHRoYXQgY2FuJ3QgYmUgYm91bmQuCgpEYW5pZWwgKDI4IEFwcmlsIDIwMDUpCi0gV29ya2luZyBvbiBmaXhpbmcgdXAgdGVzdCBjYXNlcyB0byBtYXJrIHNlY3Rpb25zIGFzICdtb2RlPXRleHQnIGZvciB0aGluZ3MKICB0aGF0IGN1cmwgd3JpdGVzIGFzIHRleHQgZmlsZXMsIHNpbmNlIHRoZW4gdGhleSBjYW4gZ2V0IGRpZmZlcmVudCBsaW5lCiAgZW5kaW5ncyBkZXBlbmRpbmcgb24gT1MuIEFuZHLpcyBHYXJj7WEgaGVscHMgbWUgd29yayB0aGlzIG91dC4KCiAgRGlkIGxvdHMgb2Ygb3RoZXIgbWlub3IgdHdlYWtzIG9uIHRoZSB0ZXN0IHNjcmlwdHMgdG8gd29yayBiZXR0ZXIgYW5kIG1vcmUKICByZWxpYWJseSBmaW5kIHRlc3Qgc2VydmVycyBhbmQgYWxzbyBraWxsIHRlc3Qgc2VydmVycy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IGhvdyB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGtpbGxlZCB0aGUgSFRUUCBzZXJ2ZXIKICBpbnN0ZWFkIG9mIHRoZSBIVFRQUyBzZXJ2ZXIgd2hlbiBjbG9zaW5nIGl0IGRvd24uCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDUpCi0gUGF1bCBNb29yZSBtYWRlIGN1cmwgY2hlY2sgZm9yIHRoZSAuY3VybHJjIGZpbGUgKF9jdXJscmMgb24gd2luZG93cykgb24gdHdvCiAgbW9yZSBwbGFjZXMuIEZpcnN0LCBDVVJMX0hPTUUgaXMgYSBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCBpcyB1c2VkCiAgaW5zdGVhZCBvZiBIT01FIGlmIGl0IGlzIHNldCwgdG8gcG9pbnQgb3V0IHdoZXJlIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlCiAgbGl2ZXMuIElmIHRoZXJlJ3Mgbm8gY29uZmlnIGZpbGUgaW4gdGhlIGRpciBwb2ludGVkIG91dCBieSBvbmUgb2YgdGhlCiAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwgaW5zdGVhZCBjaGVjayB0aGUgc2FtZQogIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBjdXJsIGlzIGxvY2F0ZWQgaW4uCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDUpCi0gQ29yeSBOZWxzb24ncyB3b3JrIG9uIG51a2luZyBjb21waWxlciB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIG9uIHg2NCB3aXRoCiAgVlMyMDA1LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA1KQotIEZyZWQgTmV3IHJlcG9ydGVkIGEgYnVnIHdoZXJlIHdlIHVzZWQgQmFzaWMgYXV0aCBhbmQgdXNlciBuYW1lIGFuZCBwYXNzd29yZAogIGluIC5uZXRyYywgYW5kIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHRoZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGRpZG4ndAogIHByb3Blcmx5IHVzZSB0aGUgYXV0aCBhcyBmb3VuZCBpbiB0aGUgbmV0cmMgZmlsZS4gQWRkZWQgdGVzdCBjYXNlIDI1NyB0bwogIHZlcmlmeSBteSBmaXguCgotIEJhc2VkIG9uIGZlZWRiYWNrIGZyb20gQ29yeSBOZWxzb24sIEkgYWRkZWQgc29tZSBwcmVwcm9jZXNzb3IgbWFnaWMgaW4KICAqL3NldHVwLmggYW5kICovY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSB3aXRoIFZTMjAwNSBvbiB4NjQuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDUpCi0gQWxleCBTdXlrb3YgbWFkZSB0aGUgY3VybCB0b29sIG5vdyBhc3N1bWUgdGhhdCB1cGxvYWRzIHVzaW5nIEhUVFA6Ly8gb3IKICBIVFRQUzovLyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHNob3cgb3V0cHV0IGFuZCB0aHVzIG1vdGl2YXRlcyBhIHN3aXRjaGVkCiAgb2ZmIHByb2dyZXNzIG1ldGVyIGlmIHRoZSBvdXRwdXQgaXMgc2VudCB0byB0aGUgdGVybWluYWwuIFRoaXMgbWFrZXMgRlRQCiAgdXBsb2FkcyB3aXRob3V0ICc+JywgLW8gb3IgLU8gc2hvdyB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDUpCi0gRGF2ZSBEcmliaW4ncyBNU1ZDIG1ha2VmaWxlIGZpeDogc2V0IENVUkxfU1RBVElDTElCIHdoZW4gaXQgYnVpbGRzIHN0YXRpYwogIGxpYnJhcnkgdmFyaWFudHMuCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgY29uZmlndXJlIHRvIHNldCB0aGUgcHJvcGVyIGRlZmluZSB3aGVuIGJ1aWxkaW5nIHN0YXRpYwogIGxpYmN1cmwgb24gd2luZG93cy4KCi0gLS1yZXRyeS1kZWxheSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggQXByaWwgMjAwNSkKLSBPbGl2aWVyIHJlcG9ydGVkIHRoYXQgZXZlbiB0aG91Z2ggaGUgdXNlZCBDVVJMT1BUX1BPUlQsIGxpYmN1cmwgY2xlYXJseQogIHN0aWxsIHVzZWQgdGhlIGRlZmF1bHQgcG9ydC4gSGUgd2FzIHJpZ2h0LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZCB0aGUKICB0ZXN0IGNhc2VzIDUyMSwgNTIyIGFuZCA1MjMgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFRvc2hpeXVraSBNYWV6YXdhIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIFBPU1Qgd2l0aCBhIHJlYWQgY2FsbGJhY2ssCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc2VuZCBhbiBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIuIEl0IGRvZXMgbm93LgoKLSBJIGNvbW1pdHRlZCBieSBtaWcgY2hhbmdlIGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IG1vdmVzIG91dCBhbGwKICBzb2NrZXQvVENQIGNvZGUgdG8gYSBzZXBhcmF0ZSBDIHByb2dyYW0gbmFtZWQgc29ja2ZpbHQuIEFuZCBhZGRlZCA0IG5ldwogIHRlc3QgY2FzZXMgZm9yIEZUUCBvdmVyIElQdjYuCgpEYW5pZWwgKDggQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBhIEhUVFAgc2VydmVyIHRoYXQgcmVzcG9uZGVkIHdpdGggYSAzMDQKICByZXNwb25zZSBjb250YWluaW5nIGFuICJpbGxlZ2FsIiBDb250ZW50LUxlbmd0aDogaGVhZGVyLCB3aGljaCB3YXMgbm90CiAgcHJvcGVybHkgaWdub3JlZCBieSBsaWJjdXJsLiBOb3cgaXQgaXMuIFRlc3QgY2FzZSAyNDkgdmVyaWZpZXMuCgpEYW5pZWwgKDcgQXByaWwgMjAwNSkKLSBBZGRlZCBhYmlsaXR5IHRvIGJ1aWxkIGFuZCBydW4gd2l0aCBHbnVUTFMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gT3BlblNTTCBmb3IKICB0aGUgc2VjdXJlIGxheWVyLiBjb25maWd1cmUgLS13aXRoLWdudXRscyBlbmFibGVzIHdpdGguIE5vdGUgdGhhdCB0aGUKICBwcmV2aW91cyBPcGVuU1NMIGNoZWNrIHN0aWxsIGhhcyBwcmVmZXJlbmNlIGFuZCBpZiBpdCBmaXJzdCBkZXRlY3RzIE9wZW5TU0wsCiAgaXQgd2lsbCBub3QgY2hlY2sgZm9yIEdudVRMUy4gWW91IG1heSBuZWVkIHRvIGV4cGxpY3RseSBkaWFibGUgT3BlblNTTCB3aXRoCiAgLS13aXRob3V0LXNzbC4KCiAgVGhpcyB3b3JrIGhhcyBiZWVuIHNwb25zb3JlZCBieSBUaGUgV3JpdHRlbiBXb3JkLgoKRGFuaWVsICg1IEFwcmlsIDIwMDUpCi0gQ2hyaXN0b3BoZSBMZWdyeSBmaXhlZCB0aGUgcG9zdC11cGxvYWQgY2hlY2sgZm9yIEZUUCB0byBub3QgY29tcGxhaW4gaWYgdGhlCiAgdXBsb2FkIHdhcyBza2lwcGVkIGR1ZSB0byBhIHRpbWUtY29uZGl0aW9uIGFzIHNldCB3aXRoCiAgQ1VSTE9QVF9USU1FQ09ORElUSU9OLiBJIGFkZGVkIHRlc3QgY2FzZSAyNDcgYW5kIDI0OCB0byB2ZXJpZnkuCgpWZXJzaW9uIDcuMTMuMiAoNSBBcHJpbCAyMDA1KQoKRGFuaWVsICg0IEFwcmlsIDIwMDUpCi0gTWFyY2VsbyBKdWNoZW0gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGUgZm9yIGxpYmN1cmwKCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBjcmFzaCBpbiBsaWJjdXJsLCB0aGF0IGNvdWxkIGhhcHBlbiBpZiB0aGUgZWFzeSBoYW5kbGUKICB3YXMga2lsbGVkIGJlZm9yZSB0aGUgdGhyZWFkaW5nIHJlc29sdmVyICh3aW5kb3dzIG9ubHkpIHN0aWxsIGhhZG4ndAogIGNvbXBsZXRlZC4KCi0gSGFyZGVlcCBTaW5naCByZXBvcnRlZCBhIHByb2JsZW0gZG9pbmcgSFRUUCBQT1NUIHdpdGggRGlnZXN0LiAoSXQgd2FzCiAgYWN0dWFsbHkgYWxzbyBhZmZlY3RpbmcgTlRMTSBhbmQgTmVnb3RpYXRlLikgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZQogIHNlcnZlciByZXNwb25kZWQgd2l0aCAxMDAgQ29udGludWUgYmVmb3JlIHRoZSBpbml0aWFsIDQwMSByZXNwb25zZSwgbGliY3VybAogIGRpZG4ndCB0YWtlIGNhcmUgb2YgdGhlIHJlc3BvbnNlIHByb3Blcmx5LiBUZXN0IGNhc2UgMjQ1IGFuZCAyNDYgYWRkZWQgdG8KICB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNSkKLSBBbmRyZXMgR2FyY2lhIG1vZGlmaWVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBsaWJnZGkzMiBiZWZvcmUKICBsaWJjcnlwdG8sIHRvIG1ha2UgdGhlIFNTTCBjaGVjayB3b3JrIGZpbmUgb24gbXN5cy9taW5ndy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNSkKLSBUb20gTW9lcnMgaWRlbnRpZmllZCBhIGZsYXcgd2hlbiB5b3Ugc2VudCBhIFBPU1Qgd2l0aCBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYXMgaW4gdGhlIGZpcnN0IHJlcXVlc3Qgd2hlbiBjdXJsIHNlbmRzIGEgUE9TVCB3aXRoIENvbnRlbnQtTGVuZ3RoOiAwLCBpdAogIHN0aWxsIGZvcmNpYmx5IGNsb3NlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgZG9pbmcgdGhlIG5leHQgc3RlcCBpbiB0aGUgYXV0aAogIG5lZ290aWF0aW9uLgoKLSBKZXNwZXIgSmVuc2VuIGZvdW5kIG91dCB0aGF0IEZUUC1TU0wgZGlkbid0IHdvcmsgc2luY2UgbXkgRlRQCiAgcmV3cml0ZS4gRml4aW5nIHRoYXQgd2FzIGVhc3ksIGJ1dCBpdCBhbHNvIHJldmVhbGVkIGEgbXVjaCB3b3JzZSBwcm9ibGVtOgogIHRoZSBGVFAgc2VydmVyIHJlc3BvbnNlIHJlYWRlciBmdW5jdGlvbiBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIHJlYWRpbmcKICByZXNwb25zZXMgaW4gbXVsdGlwbGUgdGlueSBjaHVua3MgcHJvcGVybHkhIEkgbW9kaWZpZWQgdGhlIEZUUCBzZXJ2ZXIgdG8KICBhbGxvdyBpdCB0byBwcm9kdWNlIHN1Y2ggc3BsaXQtdXAgcmVzcG9uc2VzIHRvIG1ha2Ugc3VyZSBjdXJsIGRlYWxzIHdpdGgKICB0aGVtIGFzIGl0IHNob3VsZC4KCi0gQmFzZWQgb24gQXVndXN0dXMgU2F1bmRlcnMnIGNvbW1lbnRzIGFuZCBmaW5kaW5ncywgdGhlIEhUVFAgb3V0cHV0IGF1dGgKICBmdW5jdGlvbiB3YXMgZml4ZWQgdG8gdXNlIHRoZSBwcm9wZXIgcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBtdWx0aXBsZSBvbmVzCiAgYXJlIGFjY2VwdGVkLiB0ZXN0IDIzOSBhbmQgdGVzdCAyNDMgd2VyZSBhZGRlZCB0byByZXBlYXQgdGhlIHByb2JsZW1zIGFuZAogIHZlcmlmeSB0aGUgZml4ZXMuCgogIC0tcHJveHktYW55YXV0aCB3YXMgYWRkZWQgdG8gdGhlIGN1cmwgdG9vbAoKRGFuaWVsICgxNiBNYXJjaCAyMDA1KQotIFRydTY0IGFuZCBzb21lIElSSVggYm94ZXMgc2VlbSB0byBub3QgbGlrZSB0ZXN0IDIzNyBhcyBpdCBpcy4gVGhlaXIKICBpbmV0X2FkZHIoKSBmdW5jdGlvbnMgc2VlbXMgdG8gdXNlICYyNTUgb24gYWxsIG51bWVyaWNhbHMgaW4gYSBpcHY0IGRvdHRlZAogIGFkZHJlc3Mgd2hpY2ggbWFrZXMgYSBkaWZmZXJlbnQgZmFpbHVyZS4uLiBOb3cgSSd2ZSBtb2RpZmllZCB0aGUgSVB2NAogIHJlc29sdmUgY29kZSB0byB1c2UgaW5ldF9wdG9uKCkgaW5zdGVhZCBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlc2Ugc3lzdGVtcwogIGJldHRlciBkZXRlY3QgdGhpcyBhcyBhIGJhZCBJUCBhZGRyZXNzIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgdG9hbGx5IGJvZ3VzCiAgYWRkcmVzcyB0aGF0IGlzIHRoZW4gcGFzc2VkIG9uIGFuZCB1c2VkLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBtYWRlIHRoZSBjb2RlIHByb3Blcmx5IHVzZSB0aGUgdUNsaWJjJ3MgdmVyc2lvbiBvZgogIGluZXRfbnRvYV9yKCkgd2hlbiBidWlsdCB3aXRoIGl0LgoKLSBBZGRlZCB0ZXN0IDIzNyBhbmQgMjM4OiB0ZXN0IEVQU1YgYW5kIFBBU1YgcmVzcG9uc2UgaGFuZGxpbmcgd2hlbiB0aGV5IGdldAogIHdlbGwtIGZvcm1hdGVkIGRhdGEgYmFjayBidXQgdXNpbmcgaWxsZWdhbCB2YWx1ZXMuIEluIDIzNyBQQVNWIGdldHMgYW4gSVAKICBhZGRyZXNzIHRoYXQgaXMgd2F5IGJhZC4gSW4gMjM4IEVQU1YgZ2V0cyBhIHBvcnQgdGhhdCBpcyB3YXkgb3V0IG9mIHJhbmdlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA1KQotIEFkZGVkIGEgZmV3IG1pc3NpbmcgZmVhdHVyZXMgdG8gdGhlIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgbGlzdAoKLSBNb2RpZmllZCB0ZXN0Y3VybC5wbCB0byBub3cgb2ZmZXIKICAxIC0gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGFsbCBpbmZvIGl0IHByZXZpb3VzbHkgb25seSByZWFkIGZyb20KICAgICAgZmlsZTogLS1uYW1lLCAtLWVtYWlsLCAtLWRlc2MgYW5kIC0tY29uZmlndXJlCiAgMiAtIC0tbm9jdnN1cCBtYWtlcyBpdCBub3QgYXR0ZW1wdCB0byBkbyBjdnMgdXBkYXRlCiAgMyAtIC0tY3Jvc3Njb21waWxlIGluZm9ybXMgaXQgYW5kIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRoaW5ncyBpdCBjYW4ndCBkbwoKLSBGaXhlZCBudW1lcm91cyB3aW4zMiBjb21waWxlciB3YXJuaW5ncy4KCi0gUmVtb3ZlZCB0aGUgbGliL3NlY3VyaXR5LmggZmlsZSBzaW5jZSBpdCBzaGFkb3dlZCB0aGUgbWluZ3cvd2luMzIgaGVhZGVyCiAgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGlzIG5lZWRlZCBmb3IgU1NQSSBidWlsZHMuIFRoZSBjb250ZW50cyBvZiB0aGUKICBmb3JtZXIgc2VjdXJpdHkuaCBpcyBub3cgaSBrcmI0LmgKCi0gY29uZmlndXJlIC0tZW5hYmxlLXNzcGkgbm93IGVuYWJsZXMgU1NQSSBpbiB0aGUgYnVpbGQuIEl0IG9ubHkgd29ya3MgZm9yCiAgd2luZG93cyBidWlsZHMgKGluY2x1ZGluZyBjcm9zcy1jb21waWxlcyBmb3Igd2luZG93cykuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDUpCi0gRGF2aWQgSG91bGRlciBhZGRlZCAtLWZvcm0tc3RyaW5nIHRoYXQgYWRkcyB0aGF0IHN0cmluZyB0byBhIG11bHRpcGFydAogIGZvcm1wb3N0IHBhcnQsIHdpdGhvdXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGhhdmluZyBzcGVjaWFsIG1lYW5pbmdzIGV0YyBsaWtlCiAgLS1mb3JtIGZlYXR1cmVzLgoKRGFuaWVsICgxMSBNYXJjaCAyMDA1KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgcmV0dXJucyB0aGUgZmVhdHVyZSBiaXQgQ1VSTF9WRVJTSU9OX1NTUEkgaWYgaXQgd2FzCiAgYnVpbHQgd2l0aCBTU1BJIHN1cHBvcnQuCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBtYWRlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUKICBVU0VfV0lORE9XU19TU1BJIG9uIFdpbmRvd3MsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBiZSBidWlsdCB0byB1c2UgdGhlCiAgbmF0aXZlIHdheSB0byBkbyBOVExNLiBTU1BJIGFsc28gYWxsb3dzIGxpYmN1cmwgdG8gcGFzcyBvbiB0aGUgY3VycmVudCB1c2VyCiAgYW5kIGl0cyBwYXNzd29yZCBpbiB0aGUgcmVxdWVzdC4KCkRhbmllbCAoOSBNYXJjaCAyMDA1KQotIERhbiBGIGltcHJvdmVkIHRoZSBTU0wgbGliIHNldHVwIGluIGNvbmZpZ3VyZS4KCi0gTm9kYWsgU29kYWsgcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIHVzaW5nIGEgU09DS1M0IHByb3h5LgoKLSBKZWFuLU1hcmMgUmFuZ2VyIHBvaW50ZWQgb3V0IGFuIGVtYmFyYXNzaW5nIGRlYnVnIHByaW50ZigpIGxlZnRvdmVyIGluIHRoZQogIG11bHRpIGludGVyZmFjZSBjb2RlLgoKLSBBZGp1c3RlZCB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gdmFsdWUgZm9yIGRhdGVzIGFmdGVyCiAgeWVhciAyMDM4LiBGb3IgMzIgYml0IHRpbWVfdCBpdCByZXR1cm5zIDB4N2ZmZmZmZmYgYnV0IGZvciA2NGJpdCB0aW1lX3QgaXQKICByZXR1cm5zIGVpdGhlciB0aGUgY29ycmVjdCB2YWx1ZSBvciBldmVuIC0xIG9uIHNvbWUgc3lzdGVtcyB0aGF0IHN0aWxsIHNlZW0KICB0byBub3QgZGVhbCB3aXRoIHRoaXMgcHJvcGVybHkuIFRvciBBcm50c2VuIGZvdW5kIGEgNjRiaXQgQUlYIHN5c3RlbSBmb3IgdXMKICB0aGF0IGRpZCB0aGUgbGF0dGVyLiBHd2Vub2xlIEJlYXVjaGVzbmUncyBNYW5kcmFrZSBwYXRjaCBwdXQgdGhlIGxpZ2h0cyBvbgogIHRoaXMgcHJvYmxlbSBpbiB0aGUgZmlyc3QgcGxhY2UuCgpEYW5pZWwgKDggTWFyY2ggMjAwNSkKLSBEb21pbmljayBNZWdsaW8gcmVwb3J0ZWQgdGhhdCB1c2luZyBDVVJMT1BUX0ZJTEVUSU1FIHdoZW4gdHJhbnNmZXJyaW5nIGEgRlRQCiAgZmlsZSBnb3QgYSBMYXN0LU1vZGlmaWVkOiBoZWFkZXIgd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0sIGNvcnJ1cHRpbmcgdGhlCiAgYWN0dWFsIGRhdGEuIFRoaXMgd2FzIGJlY2F1c2Ugc29tZSBjb25kaXRpb25zIGZyb20gdGhlIHByZXZpb3VzIEZUUCBjb2RlIHdhcwogIG5vdCBwcm9wZXJseSBicm91Z2h0IGludG8gdGhlIG5ldyBGVFAgY29kZS4gSSBmaXhlZCBhbmQgSSBhZGRlZCB0ZXN0IGNhc2UKICA1MjAgdG8gdmVyaWZ5LiAoVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gNy4xMy4xKQoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGgtemxpYiBvcHRpb24gdG8gYWx3YXlzIGNvbnNpZGVyIHRoZQogIGdpdmVuIHBhdGggYmVmb3JlIGFueSBzdGFuZGFyZCBwYXRocy4KCkRhbmllbCAoNiBNYXJjaCAyMDA1KQotIFJhbmR5IE1jTXVyY2h5IHdhcyB0aGUgZmlyc3QgdG8gcmVwb3J0IHRoYXQgdmFsZ3JpbmQucG0gd2FzIG1pc3NpbmcgZnJvbSB0aGUKICByZWxlYXNlIGFyY2hpdmUgYW5kIHRodXMgJ21ha2UgdGVzdCcgZmFpbHMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwNSkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgSEFWRV9GVFJVTkNBVEUgdG8gc2V2ZXJhbCBjb25maWctKi5oIGZpbGVzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMjM1IHRoYXQgbWFrZXMgYSByZXN1bWVkIHVwbG9hZCBvZiBhIGZpbGUgdGhhdCBpc24ndCBwcmVzZW50CiAgb24gdGhlIHJlbW90ZSBzaWRlLiBUaGlzIHRoZW4gY29udmVydHMgdGhlIG9wZXJhdGlvbiB0byBhbiBvcmRpbmFyeSBTVE9SCiAgdXBsb2FkLiBUaGlzIHdhcyByZXF1ZXN0ZWQvcG9pbnRlZCBvdXQgYnkgSWduYWNpbyBWYXpxdWV6LUFicmFtcy4KCiAgSXQgYWxzbyBwcm92ZWQgKGFuZCBJIGZpeGVkKSBhIGJ1ZyBpbiB0aGUgbmV3bHkgcmV3cml0dGVuIGZ0cCBjb2RlIChhbmQKICBwcmVzZW50IGluIHRoZSA3LjEzLjEgcmVsZWFzZSkgd2hlbiB0cnlpbmcgdG8gcmVzdW1lIGFuIHVwbG9hZCBhbmQgdGhlCiAgc2VydmVycyByZXR1cm5zIGFuIGVycm9yIHRvIHRoZSBTSVpFIGNvbW1hbmQuIGxpYmN1cmwgdGhlbiBsb29wcyBhbmQgc2VuZHMKICBTSVpFIGNvbW1hbmRzIGluZmluaXRlbHkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIFNTTCBwcm9ibGVtIGludHJvZHVjZWQgb24gRmVicnVhcnkgOXRoIHRoYXQgbWFkZQogIGxpYmN1cmwgYXR0ZW1wdCB0byBsb2FkIHRoZSB3aG9sZSByYW5kb20gZmlsZSB0byBzZWVkIHRoZSBQUk5HLiBUaGlzIGlzCiAgcmVhbGx5IGJhZCBzaW5jZSB0aGlzIHR1cm5zIG91dCB0byBiZSB1c2luZyAvZGV2L3VyYW5kb20gYXQgdGltZXMuLi4KClZlcnNpb24gNy4xMy4xICg0IE1hcmNoIDIwMDUpCgpEYW5pZWwgKDQgTWFyY2ggMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGl0IHBvc3NpYmxlIHRvIHNldCBDVVJMT1BUX0NPT0tJRUZJTEUgdG8gIiIgdG8gYWN0aXZhdGUKICB0aGUgY29va2llICJlbmdpbmUiIHdpdGhvdXQgaGF2aW5nIHRvIHByb3ZpZGUgYW4gZW1wdHkgb3Igbm9uLWV4aXN0aW5nIGZpbGUuCgotIFJlbmUgUmViZSBmaXhlZCBhIC0jIGNyYXNoIHdoZW4gbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgd2FzIHJldHJpZXZlZC4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNSkKLSBOVExNIGFuZCBmdHAta3JiNCBidWZmZXIgb3ZlcmZsb3cgZml4ZWQsIGFzIHJlcG9ydGVkIGhlcmU6CiAgaHR0cDovL3d3dy5zZWN1cml0eWZvY3VzLmNvbS9hcmNoaXZlLzEvMzkxMDQyIGFuZCB0aGUgQ0FOIHJlcG9ydCBoZXJlOgogIGh0dHA6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DQU4tMjAwNS0wNDkwCgogIElmIHRoZXNlIHNlY3VyaXR5IGd1eXMgd2VyZSBzZXJpb3VzLCB3ZSdkIGJlZW4gbm90aWZpZWQgaW4gYWR2YW5jZSBhbmQgd2UKICBjb3VsZCd2ZSBzYXZlZCBhIGZldyBvZiB5b3UgYSBsaXR0bGUgc3VycHJpc2UsIGJ1dCBub3cgd2Ugd2VyZW4ndC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNSkKLSBSYWxwaCBNaXRjaGVsbCByZXBvcnRlZCBhIGZsYXcgd2hlbiB5b3UgdXNlZCBhIHByb3h5IHdpdGggYXV0aCwgYW5kIHlvdQogIHJlcXVlc3RlZCBkYXRhIGZyb20gYSBob3N0IGFuZCB0aGVuIGZvbGxvd2VkIGEgcmVkaXJlY3QgdG8gYW5vdGhlcgogIGhvc3QuIGxpYmN1cmwgdGhlbiBkaWRuJ3QgdXNlIHRoZSBwcm94eS1hdXRoIHByb3Blcmx5IGluIHRoZSBzZWNvbmQgcmVxdWVzdCwKICBkdWUgdG8gdGhlIGhvc3Qtb25seSBjaGVjayBmb3Igb3JpZ2luYWwgaG9zdCBuYW1lIHdyb25nbHkgYmVpbmcgZXh0ZW5kZWQgdG8KICB0aGUgcHJveHkgYXV0aCBhcyB3ZWxsLiBBZGRlZCB0ZXN0IGNhc2UgMjMzIHRvIHZlcmlmeSB0aGUgZmxhdyBhbmQgdGhhdCB0aGUKICBmaXggcmVtb3ZlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNSkKLSBNaWtlIERvYmJzIHJlcG9ydGVkIGEgbWluZ3cgYnVpbGQgZmFpbHVyZSBkdWUgdG8gdGhlIGxhY2sgb2YKICBCVUlMRElOR19MSUJDVVJMIGJlaW5nIGRlZmluZWQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0LiBOb3cgdGhpcyBpcyBkZWZpbmVkIGJ5CiAgY29uZmlndXJlIHdoZW4gbWluZ3cgaXMgdXNlZC4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBpbiBidWcgcmVwb3J0ICMxMTI0NTg4IGZvdW5kIGFuZCBmaXhlZCBhIHNvY2tldCBsZWFrIHdoZW4gbGliY3VybAogIGRpZG4ndCBjbG9zZSB0aGUgc29ja2V0IHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIGVycm9yIGR1ZSB0byBmYWlsaW5nCiAgbG9jYWxiaW5kCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAtUE9TVGluZyB1c2luZyAiYW55YXV0aCIKICB0aGF0IHBpY2tzIE5UTE0uIFRoYW5rcyB0byBEYXZpZCBCeXJvbiBsZXR0aW5nIG1lIHRlc3QgTlRMTSBhZ2FpbnN0IGhpcwogIHNlcnZlcnMsIEkgY291bGQgcXVpY2tseSByZXBlYXQgYW5kIGZpeCB0aGUgcHJvYmxlbS4gSXQgdHVybmVkIG91dCB0byBiZToKCiAgV2hlbiBsaWJjdXJsIFBPU1RzIHdpdGhvdXQga25vd2luZy91c2luZyBhbiBhdXRoZW50aWNhdGlvbiBhbmQgaXQgZ2V0cyBiYWNrCiAgYSBsaXN0IG9mIHR5cGVzIGZyb20gd2hpY2ggaXQgcGlja3MgTlRMTSwgaXQgbmVlZHMgdG8gZWl0aGVyIGNvbnRpbnVlCiAgc2VuZGluZyBpdHMgZGF0YSBpZiBpdCBrZWVwcyB0aGUgY29ubmVjdGlvbiBhbGl2ZSwgb3Igbm90IHNlbmQgdGhlIGRhdGEgYnV0CiAgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIFRoZW4gZG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIE5UTE0gYXV0aC4gbGliY3VybAogIGRpZG4ndCBzZW5kIHRoZSBkYXRhIG5vciBjbG9zZSB0aGUgY29ubmVjdGlvbiBidXQgc2ltcGx5IHJlYWQgdGhlCiAgcmVzcG9uc2UtYm9keSBhbmQgdGhlbiBzZW50IHRoZSBmaXJzdCBuZWdvdGlhdGlvbiBzdGVwLiBXaGljaCB0aGVuIGZhaWxlZAogIG1pc2VyYWJseSBvZiBjb3Vyc2UuIFRoZSBmaXhlZCB2ZXJzaW9uIGZvcmNlcyBhIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMgbW9yZQogIHRoYW4gMjAwMCBieXRlcyBsZWZ0IHRvIHNlbmQuCgpEYW5pZWwgKDE0IEZlYnJ1YXJ5IDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSBzbyBpdAogIHdhcyBuZXZlciB1c2VkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA1KQotIFJlbW92ZWQgYWxsIHVzZXMgb2Ygc3RyZnRpbWUoKSBzaW5jZSBpdCB1c2VzIHRoZSBsb2NhbGlzZWQgdmVyc2lvbiBvZiB0aGUKICB3ZWVrIGRheSBuYW1lcyBhbmQgbW9udGggbmFtZXMgYW5kIHNlcnZlcnMgZG9uJ3QgbGlrZSB0aGF0LgoKRGFuaWVsICgxMCBGZWJydWFyeSAyMDA1KQotIE5vdyB0aGUgdGVzdCBzY3JpcHQgZGlzYWJsZXMgdmFsZ3JpbmQtdGVzdGluZyB3aGVuIHRoZSB0ZXN0IHN1aXRlIHJ1bnMgaWYKICBsaWJjdXJsIGlzIGJ1aWx0IHNoYXJlZC4gT3RoZXJ3aXNlIHZhbGdyaW5kIG9ubHkgdGVzdHMgdGhlIHNoZWxsIHRoYXQgcnVucwogIHRoZSB3cmFwcGVyLXNjcmlwdCBuYW1lZCAnY3VybCcgdGhhdCBpcyBhIGZyb250LWVuZCB0byBjdXJsIGluIHRoaXMgY2FzZS4KICBUaGlzIHNob3VsZCBhbHNvIGZpeCB0aGUgaHVnZSBhbW91bnQgb2YgcmVwb3J0cyBvZiBmYWxzZSBwb3NpdGl2ZXMgd2hlbgogIHZhbGdyaW5kIGhhcyBpZGVudGlmaWVkIGxlYWtzIGluIChiYSlzaCBhbmQgbm90IGluIGN1cmwgYW5kIHBlb3BsZSByZXBvcnQKICB0aGF0IGFzIGN1cmwgYnVncy4gQnVnIHJlcG9ydCAjMTExNjY3MiBpcyBvbmUgZXhhbXBsZS4KCiAgQWxzbywgdGhlIHZhbGdyaW5kIHJlcG9ydCBwYXJzZXIgaGFzIGJlZW4gYWRhcHRlZCB0byBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZQogIG9mIHRoZSBzb3VyY2VzIGluIGEgc3RhY2sgc3RyYWNlIGlzIG9uZSBvZiAobGliKWN1cmwncyBzb3VyY2UgZmlsZXMgb3IKICBvdGhlcndpc2UgaXQgd2lsbCBub3QgY29uc2lkZXIgdGhlIHByb2JsZW0gdG8gY29uY2VybiAobGliKWN1cmwuCgotIE1hcnR5IEt1aHJ0IHN0cmVhbWxpbmVkIHRoZSBWTVMgYnVpbGQuCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBCeXJvbiBmaXhlZCBoaXMgU1NMIHByb2JsZW1zLCBpbml0aWFsbHkgbWVudGlvbmVkIGhlcmU6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTAxLzAyNDAuaHRtbC4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgdXNlCiAgU1NMX3BlbmRpbmcoKSBhcyB3ZSBzaG91bGQuCgotIENvbnZlcnRlZCBsb3RzIG9mIEZUUCBjb2RlIHRvIGEgc3RhdGVtYWNoaW5lLCBzbyB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UKICBkb2Vzbid0IGJsb2NrIHdoaWxlIGNvbW11bmljYXRpbmcgY29tbWFuZHMtcmVzcG9uc2VzIHdpdGggYW4gRlRQIHNlcnZlci4KCiAgSSd2ZSBhZGRlZCBhIGNvbW1lbnQgbGlrZSBCTE9DS0lORyBpbiB0aGUgY29kZSBvbiBhbGwgc3BvdHMgSSBjb3VsZCBmaW5kCiAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBibG9ja2luZyBvcGVyYXRpb25zLiBXaGVuIHdlIGNoYW5nZSBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgdG8gdXNlIHRoZSBtdWx0aSBpbnRlcmZhY2UsIHdlJ2xsIGFsc28gYmUgYWJsZSB0byBzaW1wbGlmeSB0aGUgY29kZSBzaW5jZQogIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgImludGVybmFsIGludGVyZmFjZSIuCgogIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IG1hZGUgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgc2VwYXJhdGUgZnJvbSB0aGUKICBuZXcgQ1VSTEVfTE9HSU5fREVOSUVELiBUaGUgZmlyc3Qgb25lIGlzIG5vdyBhY2Nlc3MgZGVuaWVkIHRvIGEgZnVuY3Rpb24sCiAgbGlrZSBjaGFuZ2luZyBkaXJlY3Rvcnkgb3IgcmV0cmlldmluZyBhIGZpbGUsIHdoaWxlIHRoZSBzZWNvbmQgbWVhbnMgdGhhdCB3ZQogIHdlcmUgZGVuaWVkIGxvZ2luLgoKICBUaGUgQ1ZTIHRhZyAnYmVmb3JlX2Z0cF9zdGF0ZW1hY2hpbmUnIHdhcyBzZXQganVzdCBiZWZvcmUgdGhpcyB3ZW50IGluLCBpbgogIGNhc2Ugb2YgZnV0dXJlIG5lZWQuCgotIEdpc2xlIG1hZGUgdGhlIERJQ1QgY29kZSBzZW5kIENSTEYgYW5kIG5vdCBqdXN0IExGIGFzIHRoZSBzcGVjIHNheXMgc28uCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNSkKLSBHaXNsZSBmaXhlZCBwcm9ibGVtcyB3aGVuIGxpYmN1cmwgcnVucyBvdXQgb2YgbWVtb3J5LCBhbmQgd29ya2VkIG9uIG1ha2luZwogIHN1cmUgdGhlIHByb3BlciBlcnJvciBjb2RlIGlzIHJldHVybmVkIGZvciB0aG9zZSBvY2NhdGlvbnMuCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwNSkKLSBNYXJ1a28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggaW5mbGF0ZSBkZWNvbXByZXNzaW5nIGV4YWN0bHkgNjRLCiAgY29udGVudHMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNSkKLSBFcmljIFZlcmduYXVkIGZvdW5kIGEgdXNlIG9mIGFuIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gdGhlIGZ0cCB3aGVuIGRvaW5nCiAgUE9SVCBvbiBJUHY2LWVuYWJsZWQgaG9zdHMuCgotIERhdmlkIEJ5cm9uIHBvaW50ZWQgb3V0IHdlIGNvdWxkIHVzZSBCVUZTSVpFIHRvIHJlYWQgZGF0YSAoaW4KICBsaWIvdHJhbnNmZXIuYykgaW5zdGVhZCBvZiB1c2luZyBCVUZTSVpFIC0xLgoKVmVyc2lvbiA3LjEzLjAgKDEgRmVicnVhcnkgMjAwNSkKCkRhbmllbCAoMzEgSmFudWFyeSAyMDA1KQotIEFkZGVkIExhcnMgTmlsc3NvbidzIGh0bWx0aXRsZS5jYyBleGFtcGxlCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIERPIG9wZXJhdGlvbgogIGZhaWxlZCAoYXMgaW4gdGVzdCBjYXNlIDIwNSkuCgotIEZpeGVkIGEgdmFsZ3JpbmQgd2FybmluZyBmb3IgZmlsZTovLyBvcGVyYXRpb25zLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHJlcG9ydCBpbiB0aGUgdXJsIGdsb2JiaW5nIGNvZGUgZm9yIHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wuCgotIEJ1Z2ZpeGVkIHRoZSBwYXJzZXIgdGhhdCBzY2FucyB0aGUgdmFsZ3JpbmQgcmVwb3J0IG91dHB1dHMgKGluIHJ1bnRlc3RzLnBsKS4KICBJIG5vdGljZWQgdGhhdCBpdCBwcmV2aW91c2x5IGRpZG4ndCBkZXRlY3QgYW5kIHJlcG9ydCB0aGUgIkNvbmRpdGlvbmFsIGp1bXAKICBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKSIgZXJyb3IuIFdoZW4gSSBmaXhlZCB0aGlzLCBJCiAgY2F1Z2h0IGEgZmV3IGN1cmwgYnVncyB3aXRoIGl0LiBBbmQgdGhlbiBJIGhhZCB0byBzcGVuZCB0aW1lIHRvIG1ha2UgdGhlCiAgdGVzdCBzdWl0ZSBJR05PUkUgdGhlc2UgZXJyb3JzIHdoZW4gT3BlblNTTCBpcyB1c2VkIHNpbmNlIGl0IHByb2R1Y2UgbWFzc2l2ZQogIGFtb3VudHMgb2YgdmFsZ3JpbmQgd2FybmluZ3MgKGJ1dCBvbmx5IG9mIHRoZSAiQ29uZGl0aW9uYWwuLi4iIGtpbmQgaXQKICBzZWVtcykuIFNvLCBpZiBhIHRlc3QgdGhhdCByZXF1aXJlcyBTU0wgaXMgcnVuLCBpdCBpZ25vcmVzIHRoZQogICJDb25kaXRpb25hbC4uLiIgZXJyb3JzLCBhbmQgeW91J2xsIGdldCBhICJ2YWxncmluZCBQQVJUSUFMIiBvdXRwdXQgaW5zdGVhZAogIG9mICJ2YWxncmluZCBPSyIuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNSkKLSBVc2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLCBhbmQgZG9pbmcgYSByZXF1c3RlZCBhIHJlLXVzZWQgY29ubmVjdGlvbiB0aGF0CiAgZ2V0cyBjbG9zZWQganVzdCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IGZhaWxlZCBhbmQgZGlkIG5vdCByZS1pc3N1ZQogIGEgcmVxdWVzdCBvbiBhIGZyZXNoIHJlY29ubmVjdCBsaWtlIHRoZSBlYXN5IGludGVyZmFjZSBkaWQuIE5vdyBpdCBkb2VzIQoKLSBEZWZpbmUgQ1VSTF9NVUxUSUVBU1kgd2hlbiBidWlsZGluZyBsaWJjdXJsIChsaWIvZWFzeS5jIHRvIGJlIGV4YWN0KSwgdG8gdXNlCiAgbXkgbmV3IGN1cmxfZWFzeV9wZXJmb3JtKCkgdGhhdCB1c2VzIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gcnVuIHRoZQogIHJlcXVlc3QuIEl0IGlzIGEgZ3JlYXQgdGVzdGJlZCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgSSBiZWxpZXZlIHdlCiAgc2hhbGwgZG8gaXQgdGhpcyB3YXkgZm9yIHJlYWwgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGhhdmUgYSBzdWNjZXNzb3IgdG8KICBjdXJsX211bHRpX2Zkc2V0KCkuIEkndmUgdXNlZCB0aGlzIGFwcHJvYWNoIHRvIGRldGVjdCBhbmQgZml4IHNldmVyYWwgb2YgdGhlCiAgcmVjZW50IG11bHRpLWludGVyZmFjZXMgaXNzdWVzLgoKLSBBZGp1c3RlZCB0aGUgS05PV05fQlVHUyAjMTcgZml4IGEgYml0IG1vcmUgc2luY2UgdGhlIEZUUCBjb2RlIGFsc28gZGlkIHNvbWUKICBiYWQgYXNzdW1wdGlvbnMuCgotIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHJlcXVlc3QgaXMgZGVuaWVkIGR1ZSB0byAiTWF4aW11bSByZWRpcmVjdHMKICBmb2xsb3dlZCIgbGliY3VybCBsZWFrZWQgdGhlIGxhc3QgTG9jYXRpb246IFVSTC4KCi0gQ29ubmVjdCBmYWlsdXJlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIG9mdGVuIHJldHVybmVkIGFzICJjb25uZWN0KCkKICB0aW1lZCBvdXQiIGV2ZW4gdGhvdWdoIHRoZSByZWFzb24gd2FzIGRpZmZlcmVudC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA1KQotIEtOT1dOX0JVR1MgIzE3IGZpeGVkLiBBIEROUyBjYWNoZSBlbnRyeSBtYXkgbm90IHJlbWFpbiBsb2NrZWQgYmV0d2VlbiB0d28KICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGludm9rZXMuIEl0IHdhcyBwcmV2aW91c2x5IHVubG9ja2VkIGF0IGRpc2Nvbm5lY3QsIHdoaWNoCiAgY291bGQgbWVhbiB0aGF0IGl0IHJlbWFpbmVkIGxvY2tlZCBiZXR3ZWVuIG11bHRpcGxlIHRyYW5zZmVycy4gVGhlIEROUyBjYWNoZQogIG1heSBub3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGNhY2hlIGRvZXMsIGFzIHRoZXkgYXJlIHNlcGFyYXRlLgoKICBUbyBkZWFsIHdpdGggdGhlIGxhY2sgb2YgRE5TIChob3N0IGFkZHJlc3MpIGRhdGEgYXZhaWxhYmlsaXR5IGluIHJlLXVzZWQKICBjb25uZWN0aW9ucywgbGliY3VybCBub3cga2VlcHMgYSBjb3B5IG9mIHRoZSBJUCBhZHJlc3MgYXMgYSBzdHJpbmcsIHRvIGJlCiAgYWJsZSB0byBzaG93IGl0IGV2ZW4gb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgoKICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBtYWRlIHRvIGFwcGVhciB3aXRoIHRoaXMgc3R1bnQ6CgogIDEuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDIuIGFkZCBhbiBlYXN5IGhhbmRsZQogIDMuIGZldGNoIGEgVVJMIHRoYXQgaXMgcGVyc2lzdGVudCAobGVhdmVzIHRoZSBjb25uZWN0aW9uIGFsaXZlKQogIDQuIHJlbW92ZSB0aGUgZWFzeSBoYW5kbGUgZnJvbSB0aGUgbXVsdGkKICA1LiBraWxsIHRoZSBtdWx0aSBoYW5kbGUKICA2LiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICA3LiBhZGQgdGhlIHNhbWUgZWFzeSBoYW5kbGUgdG8gdGhlIG5ldyBtdWx0aSBoYW5kbGUKICA4LiBmZXRjaCBhIFVSTCBmcm9tIHRoZSBzYW1lIHNlcnZlciBhcyBiZWZvcmUgKHJlLXVzaW5nIHRoZSBjb25uZWN0aW9uKQoKLSBTdGVwaGVuIE1vcmUgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0ZUUFBPUlQgYW5kIHRoZSAtUCBvcHRpb24gZGlkbid0IHdvcmsKICB3aGVuIGJ1aWx0IElQdjYtZW5hYmxlZC4gSSd2ZSBub3cgbWFkZSBhIGZpeCBmb3IgaXQuIFdyaXRpbmcgdGVzdCBjYXNlcyBmb3IKICBjdXN0b20gcG9ydCBob3N0cyB0dXJuZWQgdG9vIHRyaWNreSBzbyB1bmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm9uZS4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA1KQotIElhbiBGb3JkIGFza2VkIGFib3V0IHN1cHBvcnQgZm9yIHRoZSBGVFAgY29tbWFuZCBBQ0NULCBhbmQgSSBkaXNjb3ZlcmVkIGl0CiAgaXMgcHJlc2VudCBpbiBSRkM5NTkuLi4gc28gbm93IChsaWIpY3VybCBzdXBwb3J0cyBpdCBhcyB3ZWxsLiAtLWZ0cC1hY2NvdW50CiAgYW5kIENVUkxPUFRfRlRQX0FDQ09VTlQgc2V0IHRoZSBhY2NvdW50IHN0cmluZy4gKFRoZSBzZXJ2ZXIgbWF5IGFzayBmb3IgYW4KICBhY2NvdW50IHN0cmluZyBhZnRlciBQQVNTIGhhdmUgYmVlbiBzZW50IGF3YXkuIFRoZSBjbGllbnQgcmVzcG9uZHMKICB3aXRoICJBQ0NUIFthY2NvdW50IHN0cmluZ10iLikgQWRkZWQgdGVzdCBjYXNlIDIyOCBhbmQgMjI5IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LiBVcGRhdGVkIHRoZSB0ZXN0IEZUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBBQ0NUIHNvbWV3aGF0LgoKLSBEYXZpZCBTaGF3IGNvbnRyaWJ1dGVkIGEgZmFpcmx5IGNvbXBsZXRlIGFuZCBkZXRhaWxlZCBhdXRvY29uZiB0ZXN0IHlvdSBjYW4KICB1c2UgdG8gZGV0ZWN0IGxpYmN1cmwgYW5kIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHByb3RvY29scyB0aGUgaW5zdGFsbGVkCiAgbGliY3VybCBzdXBwb3J0czogZG9jcy9saWJjdXJsL2xpYmN1cmwubTQKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA1KQotIE1ham9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlciBvdmVyaGF1bC4KCiAgVGhlc2UgZm91ciBvcHRpb25zIGFyZSBub3cgb2Jzb2xldGU6IENVUkxPUFRfU09VUkNFX0hPU1QsCiAgQ1VSTE9QVF9TT1VSQ0VfUEFUSCwgQ1VSTE9QVF9TT1VSQ0VfUE9SVCAodGhpcyBvcHRpb24gZGlkbid0IHdvcmsgYmVmb3JlKQogIGFuZCBDVVJMT1BUX1BBU1ZfSE9TVC4KCiAgVGhlc2UgdHdvIG9wdGlvbnMgYXJlIGFkZGVkOiBDVVJMT1BUX1NPVVJDRV9VUkwgYW5kIENVUkxPUFRfU09VUkNFX1FVT1RFLgoKICBUaGUgdGFyZ2V0LXNpZGUgZGlkbid0IHVzZSB0aGUgcHJvcGVyIHBhdGggd2l0aCBSRVRSLCBhbmQgdGh1cyB0aGlzIG9ubHkKICB3b3JrZWQgY29ycmVjdGx5IGluIHRoZSBsb2dpbiBwYXRoIChpLmUgd2l0aG91dCBkb2luZyBhbnkgQ1dEKS4gVGhlIHNvdXJjZS0KICBzaWRlIHN0aWxsIHVzZXMgYSB3cm9uZyBwYXRoLCBidXQgdGhlIGZpeCBmb3IgdGhpcyB3aWxsIG5lZWQgdG8gd2FpdC4gVmVyaWZ5CiAgdGhlIGZsYXcgYnkgdXNpbmcgYSBzb3VyY2UgVVJMIHdpdGggaW5jbHVkZWQgJVhYLWNvZGVzLgoKICBNYWRlIENVUkxPUFRfRlRQUE9SVCBjb250cm9sIHdlYXRoZXIgdGhlIHRhcmdldCBvcGVyYXRpb24gc2hvdWxkIHVzZSBQT1JUCiAgKG9yIG5vdCkuIFRoZSBvdGhlciBzaWRlIHRodXMgdXNlcyBwYXNzaXZlIChQQVNWKSBtb2RlLgoKICBVcGRhdGVkIHRoZSBmdHAzcmRwYXJ0eS5jIGV4YW1wbGUgc291cmNlIHRvIHVzZSB0aGUgdXBkYXRlZCBvcHRpb25zLgoKICBBZGRlZCBzdXBwb3J0IGZvciBhIHNlY29uZCBGVFAgc2VydmVyIGluIHRoZSB0ZXN0IHN1aXRlLiBOYW1lZC4uLiBmdHAyLgogIEFkZGVkIHRlc3QgY2FzZXMgMjMwLCAyMzEgYW5kIDIzMiBhcyBhIGZldyBmaXJzdCBiYXNpYyB0ZXN0cyBvZiB2ZXJ5IHNpbXBsZQogIDNyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIENoYW5nZWQgdGhlIGRlYnVnIG91dHB1dCB0byBpbmNsdWRlICd0YXJnZXQnIGFuZCAnc291cmNlJyB3aGVuIGEgM3JkIHBhcnR5CiAgaXMgYmVpbmcgbWFkZSwgdG8gbWFrZSBpdCBjbGVhcmVyIHdoYXQgY29tbWFuZHMvcmVzcG9uc2VzIGNhbWUgb24gd2hhdAogIGNvbm5lY3Rpb24uCgogIEFkZGVkIHRocmVlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS0zcC11cmwsIC0tM3AtdXNlciBhbmQgLS0zcC1xdW90ZS4KCiAgRG9jdW1lbnRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgcmVsYXRlZAogIHRvIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCiAgKFRlbXBvcmFyaWx5KSBkaXNhYmxlZCB0aGUgYWJpbGl0eSB0byByZS11c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgdGhlCiAgc291cmNlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBmb3JjZSBhIG5ldyBpbiBjYXNlIHRoZQogIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIHRoZSBzYW1lIGhvc3QsIGFuZCB0aGUgaG9zdCBuYW1lIGNoZWNrIGlzIHRyaWNraWVyIG5vdwogIHdoZW4gdGhlIHNvdXJjZSBpcyBpZGVudGlmaWVkIHdpdGggYSBmdWxsIFVSTCBpbnN0ZWFkIG9mIGEgcGxhaW4gaG9zdCBuYW1lCiAgbGlrZSBiZWZvcmUuCgogIFRPRE8gKHNob3J0LXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBxdW90ZSBzdXBwb3J0LiBUaGUgb3B0aW9ucyBhcmUKICB0aGVyZSwgd2UgbmVlZCB0byBhZGQgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlaXIgZnVuY3Rpb25hbGl0eS4KCiAgVE9ETyAobG9uZy10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogSVB2NiBzdXBwb3J0IChFUFJUIGFuZCBFUFNWIGV0YykKICBhbmQgU1NML1RTTCBzdXBwb3J0LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDUpCi0gUGhpbGlwcGUgSGFtZWF1IGZvdW5kIG91dCB0aGF0IC1RICIrW2NvbW1hbmRdIiBkaWRuJ3Qgd29yaywgYWx0aG91Z2ggc29tZQogIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIGl0LiBJIGZpeGVkIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMjI3IHRvIHZlcmlmeSBpdC4KICBUaGUgY3VybC4xIG1hbiBwYWdlIGRpZG4ndCBtZW50aW9uIHRoZSAnKycgc28gSSBhZGRlZCBpdC4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA1KQotIFN0ZXBoYW4gQmVyZ21hbm4gbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUIGlmIGFuIEZUUCBVUkwKICBjb250YWlucyAlMGEgb3IgJTBkIGluIHRoZSB1c2VyLCBwYXNzd29yZCBvciBDV0QgcGFydHMuIChBIGZ1dHVyZSBmaXggd291bGQKICBpbmNsdWRlIGRvaW5nIGl0IGZvciAlMDAgYXMgd2VsbCAtIHNlZSBLTk9XTl9CVUdTIGZvciBkZXRhaWxzLikgVGVzdCBjYXNlCiAgMjI1IGFuZCAyMjYgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhpcwoKLSBTdGVwaGFuIEJlcmdtYW5uIHBvaW50ZWQgb3V0IHR3byBmbGF3cyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlZDoKCiAgMSkgdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3RpbGwgcmVhZCBhbmQgdXNlZCB0byBzZXQgSFRUUCBwcm94eQoKICAyKSB5b3UgY291bGRuJ3QgZGlzYWJsZSBodHRwIHByb3h5IHdpdGggQ1VSTE9QVF9QUk9YWSAoc2luY2UgdGhlIG9wdGlvbiB3YXMKICAgICBkaXNhYmxlZCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIGFwcHMgbWF5IHdhbnQgdG8gZGlzYWJsZSBIVFRQIHByb3h5CiAgICAgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIGRpc2FibGUgSFRUUCBvciBub3QuCgogIEJhc2VkIG9uIFN0ZXBoYW4ncyBwYXRjaCwgYm90aCB0aGVzZSBpc3N1ZXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA1KQotIENvZHkgSm9uZXMnIGVuaGFuY2VkIHZlcnNpb24gb2YgU2FtdWVsIETtYXogR2FyY+1hJ3MgTVNWQyBtYWtlZmlsZSBwYXRjaCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDUpCi0gQWxleCBha2EgV2luZEVhZ2xlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBkb2luZyAiY3VybCAtdiBkaWN0aW9uYXJ5LmNvbSIsIGN1cmwKICBhc3N1bWVkIHRoaXMgdXNlZCB0aGUgRElDVCBwcm90b2NvbC4gV2hpbGUgZ3Vlc3NpbmcgcHJvdG9jb2xzIHdpbGwgcmVtYWluCiAgZnV6enksIEkndmUgbm93IG1hZGUgc3VyZSB0aGF0IHRoZSBob3N0IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAiW3Byb3RvY29sXS4iCiAgZm9yIHRoZW0gdG8gYmUgYSB2YWxpZCBndWVzc2FibGUgbmFtZS4gSSBhbHNvIHJlbW92ZWQgImh0dHBzIiBhcyBhIHByZWZpeAogIHRoYXQgaW5kaWNhdGVzIEhUVFBTLCBzaW5jZSB3ZSBoYXJkbHkgZXZlciBzZWUgYW55IGhvc3QgbmFtZXMgdXNpbmcgdGhhdC4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA1KQotIEluc3BpcmVkIGJ5IE1hcnRpam4gS29zdGVyJ3MgcGF0Y2ggYW5kIGV4YW1wbGUgc291cmNlIGF0CiAgaHR0cDovL3d3dy5ncmVlbmhpbGxzLmNvLnVrL21hay9nZW50b28vY3VybC1laW50ci1idWcuYywgSSBub3cgbWFkZSB0aGUKICBzZWxlY3QoKSBhbmQgcG9sbCgpIGNhbGxzIHByb3Blcmx5IGxvb3AgaWYgdGhleSByZXR1cm4gLTEgYW5kIGVycm5vIGlzCiAgRUlOVFIuIGdsaWJjIGRvY3MgZm9yIHRoaXMgaXMgZm91bmQgaGVyZToKICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRtbF9ub2RlL0ludGVycnVwdGVkLVByaW1pdGl2ZXMuaHRtbAoKICBUaGlzIGxhc3QgbGluayBzYXlzIEJTRCBkb2Vzbid0IGhhdmUgdGhpcyAiZWZmZWN0Ii4gV2lsbCB0aGVyZSBiZSBhIHByb2JsZW0KICBpZiB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8KCkRhbmllbCAoMTEgSmFudWFyeSAyMDA1KQotIERhbiBUb3JvcCBjbGVhbmVkIHVwIGEgZmV3IG5vIGxvbmdlciB1c2VkIHZhcmlhYmxlcyBmcm9tIERhdmlkIFBoaWxsaXBzJwogIHNlbGVjdCgpIG92ZXJoYXVsIGZpeC4KCi0gQ3lyaWxsIE9zdGVyd2FsZGVyIHBvc3RlZCBhIGRldGFpbGVkIGFuYWx5c2lzIGFib3V0IGEgYnVnIHRoYXQgb2NjdXJzIHdoZW4KICB1c2luZyBhIGN1c3RvbSBIb3N0OiBoZWFkZXIgYW5kIGN1cmwgZmFpbHMgdG8gc2VuZCBhIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCB0aHVzIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kcyBpdC4gSXQKICB0aGVuIHNlbnQgdHdvIEhvc3Q6IGhlYWRlcnMuIEN5cmlsbCdzIGFuYWx5c2lzIHdhcyBwb3N0ZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTAxLzAwMjIuaHRtbAoKLSBCcnVjZSBNaXRjaGVuZXIgaWRlbnRpZmllZCAoYnVnIHJlcG9ydCAjMTA5OTY0MCkgdGhlIG5ldmVyLWVuZGluZyBTT0NLUzUKICBwcm9ibGVtIHdpdGggdGhlIHZlcnNpb24gYnl0ZSBhbmQgdGhlIGNoZWNrIGZvciBiYWQgdmVyc2lvbnMuIEJydWNlIGhhcyBsb3RzCiAgb2YgY2x1ZXMgb24gdGhpcywgYW5kIGJhc2VkIG9uIGhpcyBzdWdnZXN0aW9uIEkndmUgbm93IHJlbW92ZWQgdGhlIGNoZWNrIG9mCiAgdGhhdCBieXRlIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY29udGFpbiAxIG9yIDUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNSkKLSBQYXZlbCBPcmVob3YgcmVwb3J0ZWQgbWVtb3J5IHByb2JsZW1zIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBpbiBidWcgcmVwb3J0CiAgIzEwOTg4NDMuIEluIHNob3J0LCBhIHNoYXJlZCBETlMgY2FjaGUgd2FzIHNldHVwIGZvciBhIG11bHRpIGhhbmRsZSBhbmQgd2hlbgogIHRoZSBzaGFyZWQgY2FjaGUgd2FzIGRlbGV0ZWQgYmVmb3JlIHRoZSBpbmRpdmlkdWFsIGVhc3kgaGFuZGxlcywgdGhlIGxhdHRlcgogIGNsZWFudXBzIGNhdXNlZCByZWFkL3dyaXRlcyB0byBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCi0gSHpoaWp1biByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgY29kZSwgdGhhdCBsZWFrZWQgdGhlCiAgcmVtb3RlIGNlcnRpZmljYXRlIG5hbWUgd2hlbiBpdCBkaWRuJ3QgbWF0Y2ggdGhlIHVzZWQgaG9zdCBuYW1lLgoKR2lzbGUgKDggSmFudWFyeSAyMDA1KQotIEFkZGVkIE1ha2VmaWxlLldhdGNvbSBmaWxlcyAoc3JjL2xpYikuIFVwZGF0ZWQgTWFrZWZpbGUuZGlzdC4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDUpCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc2NyaXB0J3MgdmFsZ3JpbmQgbG9nIHBhcnNlciB0byBhY3R1YWxseSB3b3JrISBBbHNvIGFkZGVkCiAgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgbG9nIHNjYW5uZXIgZm9yIHNwZWNpZmljIHRlc3QgY2FzZXMuIFRlc3QgY2FzZQogIDUwOSByZXN1bHRzIGluIG51bWVyb3VzIHByb2JsZW1zIGFuZCBsZWFrcyBpbiBPcGVuU1NMIGFuZCBoYXMgdG8gZ2V0IGl0CiAgZGlzYWJsZWQuCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgc2luZ2xlLWJ5dGUgcmVhZCBvdXQgb2YgYm91bmRzIGluIHRlc3QgY2FzZSAzOSBpbiB0aGUgY3VybCB0b29sIGNvZGUKICAoaS5lIG5vdCBpbiB0aGUgbGlicmFyeSkuCgotIEJ1ZyByZXBvcnQgIzEwOTcwMTkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiBkb2luZyAtZCAiZGF0YSIgd2l0aCAtRyBhbmQKICBzZW5kaW5nIGl0IHRvIHR3byBVUkxzIHdpdGgge30uIEFkZGVkIHRlc3QgMTk5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNSkKLSBNYXJ0eSBLdWhydCBhZGp1c3RlZCBhIFZNUyBidWlsZCBzY3JpcHQgc2xpZ2h0bHkKCi0gS2FpIFNvbW1lcmZlbGQgYW5kIEdpc2xlIFZhbmVtIGZpeGVkIGxpYmN1cmwgdG8gYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQgb24KICBXaW4yMDAwLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwNSkKLSBBbGV4IE5lYmxldHQgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMgc2xpZ2h0bHkuCkRhbmllbCAoMjUgRGVjZW1iZXIgMjAwNCkKLSBSZW1vdmVkIHNyYy9jb25maWcuaC5pbiBmcm9tIENWUywgaXQgaXMgbm93IGNvcGllZCBmcm9tIHRoZSAoZ2VuZXJhdGVkKQogIGxpYi9jb25maWcuaC5pbiBpbnN0ZWFkLCBhcyB0aGV5IGNhbiB2ZXJ5IHdlbGwgYmUgdGhlIHNhbWUuIFRoaXMgcmVtb3ZlcyBhCiAgIm1hbnVhbCBoYXNzbGUiLiBZb3UgbWF5IHdhbnQgdG8gcmUtcnVuIGJ1aWxkY29uZiBub3cuCgotIFdlcm5lciBLb2NoIGZpbGVkIERlYmlhbiBidWcgcmVwb3J0ICMyODY3OTQsIG1lbnRpb25pbmcgdGhhdCBjdXJsIGNvbnRhaW5lZAogIG5vbi1mcmVlIChieSBEZWJpYW4ncyB2aWV3KSBzb3VyY2UgY29kZS4gVGhpcyB3YXMgQW5ndXMgTWFja2F5J3MKICBzcmMvZ2V0cGFzcy5jIHNvdXJjZSBjb2RlLiBJIHRyaWVkIHRvIGNvbnRhY3QgaGltIGFib3V0IGl0IHRvIHF1aWNrbHkgc29sdmUKICB0aGlzIGlzc3VlLCBidXQgaGlzIGVtYWlsIGFkZHJlc3NlcyBib3VuY2UgYW5kIEkgZ290IHNvbWUgdGltZSAib3ZlciIgYW5kCiAgcmVpbXBsZW1lbnRlZCB0aGUgZnVuY3Rpb25hbGl0eSBvbmNlIGJyb3VnaHQgYnkgQW5ndXMuIFdlIG5vIGxvbmdlciB1c2UgYW55CiAgb2YgQW5ndXMnIG9yaWdpbmFsIGNvZGUgYW5kIHRoZSBuZXcgZnVuY3Rpb24gaXMgbXVjaCBzaW1wbGVyIChJTU8pLiBJc3N1ZQogIHNvbHZlZC4KCkRhbmllbCAoMjQgRGVjZW1iZXIgMjAwNCkKLSBEYXZpZCBTaGF3IGFkZGVkIC0tcHJvdG9jb2xzIHRvIGN1cmwtY29uZmlnLCBzbyB0aGF0IGl0IG5vdyBsaXN0cyBhbGwKICBwcm90b2NvbHMgbGliY3VybCB3YXMgYnVpbHQgdG8gc3VwcG9ydC4gLS1mZWF0dXJlIG5vIGxvbmdlciBsaXN0cyBkaXNhYmxlZAogIHByb3RvY29scy4KCkRhbmllbCAoMjMgRGVjZW1iZXIgMjAwNCkKLSBEYXZpZCBTaGF3IGZpeGVkIHRoZSBjb25maWd1cmUgLS1kaXNhYmxlLVtwcm90b2NvbF0gdmFyaWFibGVzIHNvIHRoYXQKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgbm93IHdvcmtzIGNvcnJlY3RseSEKCkRhbmllbCAoMjIgRGVjZW1iZXIgMjAwNCkKLSBSdW5lIEtsZXZlbGFuZCBmaXhlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGZvciByZWNlaXZlZCBjb29raWVzIHdpdGggdGhlCiAgKHJhcmUpIHZlcnNpb24gYXR0cmlidXRlIHNldC4KCi0gTWFyY2luIEtvbmlja2kgcHJvdmlkZWQgdHdvIGNvbmZpZ3VyZSBmaXhlcyBhbmQgYSBzb3VyY2UgZml4IHRvIG1ha2UgY3VybAogIGJ1aWxkIG91dC1vZi10aGUtYm94IG9uIEJlT1MuCgpEYW5pZWwgKDIxIERlY2VtYmVyIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDIxNyB0aGF0IHZlcmlmaWVkIENVUkxJTkZPX0hUVFBfQ09OTkVDVENPREUsIGFuZCBJIG1hZGUgdGhlCiAgLXcgb3B0aW9uIHN1cHBvcnQgJ2h0dHBfY29ubmVjdCcgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdmVyaWZ5IQoKLSBGaXhlZCBsaWIvc2VsZWN0LmMgaW5jbHVkZSBvcmRlciB0byBidWlsZCBmaW5lIG9uIEZyZWVCU0QKCi0gRml4ZWQgZmFpbGYoKSdzIHJldXNlIG9mIHRoZSB2YV9saXN0IHZhcmlhYmxlIHRoYXQgY3Jhc2hlZCBvbiBGcmVlQlNELgogIFBvaW50ZWQgb3V0IGJ5IFBldGVyIFBlbnRjaGV2LgoKVmVyc2lvbiA3LjEyLjMgKDIwIERlY2VtYmVyIDIwMDQpCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDQpCi0gSSBpbnZlc3RpZ2F0ZWQgb3VyIFBLQ1MxMiBidWlsZCBwcm9ibGVtIG9uIFNvbGFyaXMgMi43IHdpdGggT3BlblNTTCAwLjkuN2UsCiAgYW5kIGl0IHR1cm5lZCBvdXQgdG8gYmUgdGhlIGZhdWx0IG9mIHRoZSB6bGliIDEuMS40IGhlYWRlcnMgZG9pbmcgYSB0eXBlZGVmCiAgbmFtZWQgJ2ZyZWVfZnVuYycgYW5kIHRoZSBPcGVuU1NMIGhlYWRlcnMgaGF2ZSBhIHByb3RvdHlwZSB0aGF0IHVzZXMKICAnZnJlZV9mdW5jJyBpbiBvbmUgb2YgaXRzIGFyZ3VtZW50cy4gVGhpcyBpcyB3aHkgdGhlIGNvbXBpbGUgZXJyb3JzIG91dC4KCiAgSW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgb3BlbnNzbC9wa2NzMTIuaCBoZWFkZXIgYmVmb3JlIHRoZQogIHpsaWIuaCBoZWFkZXIgYW5kIGl0IGJ1aWxkcyBmaW5lLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciB0aGlzCiAgZmlsZSBhbmQgaXQgdGhlbiBnZXRzIGluY2x1ZGVkIGVhcmx5IGluIGxpYi91cmxkYXRhLmguCgpEYW5pZWwgKDE4IERlY2VtYmVyIDIwMDQpCi0gU2FtdWVsIExpc3RvcGFkIGFkZGVkIHN1cHBvcnQgZm9yIFBLQ1MxMiBmb3JtYXR0ZWQgY2VydGlmaWNhdGVzLgoKLSBTYW11ZWwgTGlzdG9wYWQgZml4ZWQgLUUgdG8gc3VwcG9ydCAiQzovcGF0aCIgKHdpdGggZm9yd2FyZCBzbGFzaCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNCkKLSBHaXNsZSBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSBkaXJlY3RvcnkgcmUtdXNlIGZvciBGVFAuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDIxNSBhbmQgMjE2IHRvIGJldHRlciB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIERpbmFyIGluIGJ1ZyByZXBvcnQgIzEwODYxMjEsIGZvdW5kIGEgZmlsZSBoYW5kbGUgbGVhayB3aGVuIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgKGluY2x1ZGluZyBhIGZpbGUgdXBsb2FkIHBhcnQpIHdhcyBhYm9ydGVkIGJlZm9yZSB0aGUgd2hvbGUgZmlsZQogIHdhcyBzZW50LgoKRGFuaWVsICgxNSBEZWNlbWJlciAyMDA0KQotIFRvbSBMZWUgZm91bmQgb3V0IHRoYXQgZ2xvYmJpbmcgb2Ygc3RyaW5ncyB3aXRoIGJhY2tzbGFzaGVzIGRpZG4ndCB3b3JrIGFzCiAgeW91J2QgZXhwZWN0LiBCYWNrc2xhc2hlcyBhcmUgc3VjaCBhIGNlbnRyYWwgcGFydCBvZiB3aW5kb3dzIGZpbGUgbmFtZXMgdGhhdAogIGZvcmNpbmcgYmFja3NsYXNoZXMgdG8gaGF2ZSB0byBiZSBlc2NhcGVkIHdpdGggYmFja3NsYXNoZXMgaXMgYSBiaXQgdG9vCiAgYXdrd2FyZCB0byB1c2Vycy4gU3RhcnRpbmcgbm93LCB5b3Ugb25seSBuZWVkIHRvIGVzY2FwZSBnbG9iYmluZyBjaGFyYWN0ZXJzCiAgc3VjaCBhcyB0aGUgZml2ZSBsZXR0ZXJzOiAiW117fSwiLiBBZGRlZCB0ZXN0IGNhc2UgMjE0IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBEZWNlbWJlciAyMDA0KQotIEhhcnNoYWwgUHJhZGhhbiBwYXRjaGVkIGEgSFRUUCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gZmxhdzogaWYgdGhlIHVzZXIgbmFtZQogIGFuZC9vciBwYXNzd29yZCB3ZXJlIG1vZGlmaWVkIGJldHdlZW4gdHdvIHJlcXVlc3RzIG9uIGEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24sIHRoZSBzZWNvbmQgcmVxdWVzdCB3ZXJlIHN0aWxsIG1hZGUgd2l0aCB0aGUgZmlyc3Qgc2V0dXAhCgogIEkgYWRkZWQgdGVzdCBjYXNlIDUxOSB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMjAwNCkKLSBHaXNsZSBhZGRlZCBDVVJMSU5GT19TU0xfRU5HSU5FUyB0byBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRvIGFsbG93IGFuIGFwcAogIHRvIGxpc3QgYWxsIGF2YWlsYWJsZSBjcnlwdG8gRU5HSU5FUy4KCi0gR2lzbGUgZml4ZWQgYnVnIHJlcG9ydCAjMTA4MzU0Miwgd2hpY2ggcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcmVzdW1pbmcKICBsYXJnZSBmaWxlICg+NEdCKSBmaWxlOi8vIHRyYW5zZmVycyBvbiB3aW5kb3dzLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDA0KQotIE1hZGUgdGhlIHRlc3Qgc3VpdGUgSFRUUCBzZXJ2ZXIgKHN3cykgY2FwYWJsZSBvZiB1c2luZyBJUHY2LCBhbmQgdGhlbgogIGV4dGVuZGVkIHRoZSB0ZXN0IGVudmlyb25tZW50IHRvIHN1cHBvcnQgdGhhdCBhbmQgYWxzbyBhZGRlZCB0aHJlZSB0ZXN0CiAgY2FzZXMgKDI0MCwgMjQxLCAyNDIpIHRoYXQgcnVuIHRlc3RzIHVzaW5nIElQdjYuIFRlc3QgMjQyIHVzZXMgYSBVUkwgdGhhdAogIGRpZG4ndCB3b3JrIGJlZm9yZSB0aGUgMTAgZGVjIGZpeCBieSBLYWkgU29tbWVyZmVsZC4KCi0gTWFkZSBhIGZhaWxlZCBmaWxlOi8vIHJlc3VtZSBvdXRwdXQgYW4gZXJyb3IgbWVzc2FnZQoKLSBDb3JyZWN0ZWQgdGhlIENVUkxFX0JBRF9ET1dOTE9BRF9SRVNVTUUgZXJyb3IgbWVzc2FnZSBpbiBsaWIvc3RyZXJyb3IuYwoKLSBEYW4gRmFuZHJpY2g6CgogIHNpbXBsaWZpZWQgYW5kIGNvbnNvbGlkYXRlZCB0aGUgU1NMIGNoZWNrcyBpbiBjb25maWd1cmUgYW5kIHRoZSB1c2FnZSBvZiB0aGUKICBkZWZpbmVzIGluIGxpYi9zZXR1cC5oCgogIHByb3ZpZGVkIGEgZmlyc3QgbGliY3VybC5wYy5pbiBmaWxlIGZvciBwa2ctY29uZmlnIChidXQgdGhlIHJlc3VsdCBpcyBub3QKICBpbnN0YWxsZWQgYW55d2hlcmUgYXQgdGhpcyBwb2ludCkKCiAgZXh0ZW5kZWQgdGhlIGNyb3NzIGNvbXBpbGUgc2VjdGlvbiBpbiB0aGUgZG9jcy9JTlNUQUxMIGZpbGUKCkRhbmllbCAoMTAgRGVjZW1iZXIgMjAwNCkKLSBXaGVuIHByb3ZpZGluZyB1c2VyIG5hbWUgaW4gdGhlIFVSTCBhbmQgYSBJUHY2LXN0eWxlIElQLWFkZHJlc3MgKGxpa2UgaW4KICAiZnRwOi8vdXNlckBbOjoxXS90bXAiKSwgdGhlIFVSTCBwYXJzZXIgZGlkbid0IGdldCB0aGUgaG9zdCBleHRyYWN0ZWQKICBwcm9wZXJseS4gIFJlcG9ydGVkIGFuZCBmaXhlZCBieSBLYWkgU29tbWVyZmVsZC4KCkRhbmllbCAoOSBEZWNlbWJlciAyMDA0KQotIFRvbiBWb29uIHByb3ZpZGVkIGEgY29uZmlndXJlIGZpeCB0aGF0IHNob3VsZCBmaXggdGhlIG5vdG9yaW91cyAobW9zdGx5CiAgcmVwb3J0ZWQgb24gU29sYXJpcykgcHJvYmxlbSB3aGVyZSB0aGUgc2l6ZV90IGNoZWNrIGZhaWxzIGR1ZSB0byB0aGUgU1NMCiAgbGlicyBiZWluZyBmb3VuZCBpbiBhIGRpciBub3Qgc2VhcmNoZWQgdGhyb3VnaCBieSB0aGUgcnVuLXRpbWUgbGlua2VyLgogIHBhdGNoLXRyYWNrZXIgZW50cnkgIzEwODE3MDcuCgotIEJyeWFuIEhlbmRlcnNvbiBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0ICMxMDgxNzg4IHRoYXQgdGhlIGN1cmwtY29uZmlnCiAgLS12ZXJudW0gb3V0cHV0IHdhc24ndCB6ZXJvIHByZWZpeGVkIHByb3Blcmx5IChhcyBjbGFpbWVkIGluIGRvY3VtZW50YXRpb24pLgogIFRoaXMgaXMgZml4ZWQgaW4gbWFrZXRneiBub3cuCgpEYW5pZWwgKDggRGVjZW1iZXIgMjAwNCkKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIG1hY2gtTyBmcmFtZXdvcmsgZmlsZXMgZm9yIE1hYyBPUyBYLgoKLSBSZW5lIEJlcm5oYXJkdCBmb3VuZCBhbmQgZml4ZWQgYSBidWZmZXIgb3ZlcnJ1biBpbiB0aGUgTlRMTSBjb2RlLCB3aGVyZQogIGxpYmN1cmwgYWx3YXlzIGFuZCB1bmNvbmRpdGlvbmFsbHkgb3Zlcndyb3RlIGEgc3RhY2stYmFzZWQgYXJyYXkgd2l0aCAzIHplcm8KICBieXRlcy4gVGhpcyBpcyBub3QgYW4gZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93LiBObyBuZWVkIHRvIGdldCBhbGFybWVkLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgc28gdGhhdCB0aGUgZmluYWwgZXJyb3IgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSB2ZXJib3NlIGluZm8gInN0cmVhbSIKICBldmVuIGlmIG5vIGVycm9yYnVmZmVyIGlzIHNldC4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBhZGRlZCB0aGUgLS1kaXNhYmxlLWNvb2tpZXMgb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBidWlsZAogIGxpYmN1cmwgd2l0aG91dCBjb29raWUgc3VwcG9ydC4gVGhpcyBpcyBtYWlubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEKICBtaW5pbWFsaXN0aWMgbGliY3VybCB3aXRoIG5vIGNvb2tpZXMgc3VwcG9ydCBhdCBhbGwuIExpa2UgZm9yIGVtYmVkZGVkCiAgc3lzdGVtcyBvciBzaW1pbGFyLgoKLSBSaWNoYXJkIEF0dGVyZXIgZml4ZWQgbGliY3VybCdzIHdheSBvZiBkZWFsaW5nIHdpdGggdGhlIEVQU1YKICByZXNwb25zZS4gUHJldmlvdXNseSwgbGliY3VybCB3b3VsZCByZS1yZXNvbHZlIHRoZSBob3N0IG5hbWUgd2l0aCB0aGUgbmV3CiAgcG9ydCBudW1iZXIgYW5kIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGF0LCB3aGlsZSBpdCBzaG91bGQgdXNlIHRoZSBJUCBmcm9tCiAgdGhlIGNvbnRyb2wgY2hhbm5lbC4gVGhpcyBidWcgbWFkZSBpdCBoYXJkIHRvIEVQU1YgZnJvbSBhbiBGVFAgc2VydmVyIHdpdGgKICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMhCgpEYW5pZWwgKDMgRGVjZW1iZXIgMjAwNCkKLSBCdWcgcmVwb3J0ICMxMDc4MDY2OiB3aGVuIGEgY2h1bmtlZCB0cmFuc2ZlciB3YXMgcHJlLW1hdHVyZWx5IGNsb3NlZCBleGFjdGx5CiAgYXQgYSBjaHVuayBib3VuZGFyeSBpdCB3YXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IgYW5kIHRodXMgd2VudCB1bm5vdGljZWQuCiAgRml4ZWQgYnkgTWF1cmljZSBCYXJudW0uCgogIEFkZGVkIHRlc3QgY2FzZSAyMDcgdG8gdmVyaWZ5LgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgdGhlIENPTk5FQ1QgbG9vcCB0byBkZWZhdWx0IHRpbWVvdXQgdG8gMzYwMCBzZWNvbmRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjA2IHRoYXQgbWFrZXMgQ09OTkVDVCB3aXRoIERpZ2VzdC4KCiAgRml4ZWQgYSBmbGF3IHRoYXQgcHJlcGVuZGVkICIobmlsKSIgdG8gdGhlIGluaXRpYWwgQ09OTkVDVCBycWV1ZXN0J3MgdXNlci0KICBhZ2VudCBmaWVsZC4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2gncyBmaXggZm9yIGxpYnogMS4xIGFuZCAiZXh0cmEgZmllbGQiIHVzYWdlIGluIGEgZ3ppcCBzdHJlYW0KCi0gRGFuIGFsc28gaGVscGVkIG1lIHdpdGggaW5wdXQgZGF0YSB0byBjcmVhdGUgdGhyZWUgbW9yZSB0ZXN0IGNhc2VzIGZvciB0aGUKICAtLWNvbXByZXNzZWQgb3B0aW9uLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDA0KQotIEkgaW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gZW5hYmxlIGJpbmFyeSBjb250ZW50cyBpbiB0aGUgdGVzdHMgKGJ5IHByb3ZpbmcKICBpdCBiYXNlNjQgZW5jb2RlZCksIGxpa2UgZm9yIHRlc3RpbmcgZGVjb21wcmVzcyBldGMuIEFkZGVkIHRlc3QgMjIwIGFuZCAyMjEKICBmb3IgdGhpcyBwdXJwb3NlLiBUZXN0cyBjYW4gbm93IGFsc28gZGVwZW5kIG9uIGxpYnogdG8gcnVuLgoKLSBBcyByZXBvcnRlZCBieSBSZWlub3V0IHZhbiBTY2hvdXdlbiBpbiBNYW5kcmFrZSdzIGJ1ZyB0cmFja2VyIGJ1ZyAxMjI4NQogIChodHRwOi8vcWEubWFuZHJha2Vzb2Z0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTIyODUpLCB3aGVuIGNvbm5lY3RpbmcgdG8gYW4KICBJUHY2IGhvc3Qgd2l0aCBGVFAsIC0tZGlzYWJsZS1lcHN2IChvciAtLWRpc2FibGUtZXBydCkgZWZmZWN0aXZlbHkgZGlzYWJsZXMKICB0aGUgYWJpbGl0eSB0byB0cmFuc2ZlciBhIGZpbGUuIE5vdywgd2hlbiBjb25uZWN0ZWQgdG8gYW4gRlRQIHNlcnZlciB3aXRoCiAgSVB2NiwgdGhlc2UgRlRQIGNvbW1hbmRzIGNhbid0IGJlIGRpc2FibGVkIGV2ZW4gaWYgYXNrZWQgdG8gd2l0aCB0aGUKICBhdmFpbGFibGUgbGliY3VybCBvcHRpb25zLgoKRGFuaWVsICgyNiBOb3ZlbWJlciAyMDA0KQotIEFzIHJlcG9ydGVkIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg5CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4OSksIGN1cmwgd291bGQgcHJpbnQgYQogIG5ld2xpbmUgdG8gImZpbmlzaCIgdGhlIHByb2dyZXNzIG1ldGVyIGFmdGVyIGVhY2ggcmVkaXJlY3QgYW5kIG5vdCBvbmx5CiAgYWZ0ZXIgYSBjb21wbGV0ZWQgdHJhbnNmZXIuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDQpCi0gRlRQIGltcHJvdmVtZW50czoKCiAgSWYgRVBTViwgRVBSVCBvciBMUFJUIGlzIHRyaWVkIGFuZCBkb2Vzbid0IHdvcmssIGl0IHdpbGwgbm90IGJlIHJldHJpZWQgb24KICB0aGUgc2FtZSBzZXJ2ZXIgYWdhaW4gZXZlbiBpZiBhIGZvbGxvd2luZyByZXF1ZXN0IGlzIG1hZGUgdXNpbmcgYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbi4KCiAgSWYgYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIHRvIGEgc2VydmVyLCByZXF1ZXN0aW5nIGEgZmlsZSBmcm9tIHRoZSBzYW1lCiAgZGlyZWN0b3J5IGFzIHRoZSBwcmV2aW91cyByZXF1ZXN0IG9wZXJhdGVkIG9uLCBsaWJjdXJsIHdpbGwgbm8gbG9uZ2VyIG1ha2UKICB0aGF0IGxvbmcgc2VyaWVzIG9mIENXRCBjb21tYW5kcyBqdXN0IHRvIGVuZCB1cCBvbiB0aGUgc2FtZSBzcG90LiBOb3RlIHRoYXQKICB0aGlzIGlzIG9ubHkgZm9yICpleGFjdGx5KiB0aGUgc2FtZSBkaXIuIFRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGltcHJvdmVtZW50cwogIHRvIG9wdGltaXplIHRoZSBDV0Qtc2VuZGluZyB3aGVuIHRoZSBkaXJzIGFyZSBvbmx5IHNsaWdodGx5IGRpZmZlcmVudC4KCiAgQWRkZWQgdGVzdCAyMTAsIDIxMSBhbmQgMjEyIHRvIHZlcmlmeSB0aGVzZSBjaGFuZ2VzLiBIYWQgdG8gaW1wcm92ZSB0aGUKICB0ZXN0IHNjcmlwdCB0b28gYW5kIGFkZGVkIGEgbmV3IHByaW1pdGl2ZSB0byB0aGUgdGVzdCBmaWxlIGZvcm1hdC4KCkRhbmllbCAoMjQgTm92ZW1iZXIgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzZWxlY3QgcHJvcGVybHkgd2hlbiBydW4KICB3aXRoIE1zeXMvTWluZ3cgb24gV2luZG93cy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwNCkKLSBNYWRlIEhUVFAgUFVUIGFuZCBQT1NUIHJlcXVlc3RzIG5vIGxvbmdlciB1c2UgSEVBRCB3aGVuIGRvaW5nIG11bHRpLXBhc3MKICBhdXRoIG5lZ290aWF0aW9uIChOVExNLCBEaWdlc3QgYW5kIE5lZ290aWF0ZSksIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcmVxdWVzdAogIGtleXdvcmQgInByb3Blcmx5Ii4gRGV0YWlscyBpbiBsaWIvUkVBRE1FLmh0dHBhdXRoLiBUaGlzIGFsc28gaW50cm9kdWNlcwogIENVUkxPUFRfSU9DVExGVU5DVElPTiBhbmQgQ1VSTE9QVF9JT0NUTERBVEEsIHRvIGJlIHVzZWQgYnkgYXBwcyB0aGF0IHVzZSB0aGUKICAiYW55IiBhdXRoIGFsdGVybmF0aXZlIGFzIHRoZW4gbGliY3VybCBtYXkgbmVlZCB0byBzZW5kIHRoZSBQVVQvUE9TVCBkYXRhCiAgbW9yZSB0aGFuIG9uY2UgYW5kIHRodXMgbWF5IG5lZWQgdG8gYXNrIHRoZSBhcHAgdG8gInJld2luZCIgdGhlIHJlYWQgZGF0YQogIHN0cmVhbSB0byBzdGFydC4KCiAgU2VlIGFsc28gdGhlIG5ldyBleGFtcGxlIHVzaW5nIHRoaXM6IGRvY3MvZXhhbXBsZXMvYW55YXV0aHB1dC5jCgotIERhdmlkIFBoaWxsaXBzIGVuaGFuY2VkIHRlc3QgNTE4LiBJIG1hZGUgaXQgZGVwZW5kIG9uIGEgImZlYXR1cmUiIHNvIHRoYXQKICBzeXN0ZW1zIHdpdGhvdXQgZ2V0cmxpbWl0KCkgd29uJ3QgYXR0ZW1wdCB0byB0ZXN0IDUxOC4gY29uZmlndXJlIG5vdyBjaGVja3MKICBmb3IgZ2V0cmxpbWl0KCkgYW5kIHNldHJsaW1pdCgpIGZvciB0aGlzIHRlc3QgY2FzZS4KCkRhbmllbCAoMTggTm92ZW1iZXIgMjAwNCkKLSBEYXZpZCBQaGlsbGlwcyBmaXhlZCBsaWJjdXJsIHRvIG5vdCBjcmFzaCBhbnltb3JlIHdoZW4gbW9yZSB0aGFuIEZEX1NFVFNJWkUKICBmaWxlIGRlc2NyaXB0b3JzIGFyZSBpbiB1c2UuIFRlc3QgY2FzZSA1MTggYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDA0KQotIFRvIHRlc3QgbXkgZml4IGZvciB0aGUgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBidWcsIEkgYWRkZWQgdGltZV9yZWRpcmVjdCBhbmQKICBudW1fcmVkaXJlY3RzIHN1cHBvcnQgdG8gdGhlIC13IHdyaXRlb3V0IG9wdGlvbiBmb3IgdGhlIGNvbW1hbmQgbGluZSB0b29sLgoKLSBXb2pjaWVjaCBad2llZmthIGZvdW5kIG91dCB0aGF0IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgZGlkbid0IHdvcmsgYXMKICBkb2N1bWVudGVkLgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDA0KQotIEdpc2xlIFZhbmVtIG1vZGlnaWVkIHRoZSBNU1ZDIGFuZCBOZXR3YXJlIG1ha2VmaWxlcyB0byBidWlsZCB3aXRob3V0CiAgbGliY3VybC5kZWYKCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY3J5cHRvLWF1dGggb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBhbGxvdwogIGxpYmN1cmwgdG8gYnVpbGQgd2l0aG91dCBEaWdlc3Qgc3VwcG9ydC4gKEkgZmlndXJlIGl0IHNob3VsZCBhbHNvIGV4cGxpY2l0bHkKICBkaXNhYmxlIE5lZ290aWF0ZSBhbmQgTlRMTS4pCgotICAgICAgICAgICAgICAgICAqKiogTW9kaWZpZWQgQmVoYXZpb3VyIEFsZXJ0ICoqKgoKICBTZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyB0byBOVUxMIHdpbGwgbm8gbG9uZ2VyIGRvIGEgR0VULgoKICBTZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyB0byAiIiB3aWxsIHNlbmQgYSB6ZXJvIGJ5dGUgUE9TVCBhbmQgc2V0dGluZwogIENVUkxPUFRfUE9TVEZJRUxEUyB0byBOVUxMIGFuZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gemVybyB3aWxsIGFsc28gbWFrZQogIGEgemVybyBieXRlIFBPU1QuIEFkZGVkIHRlc3QgY2FzZSA1MTUgdG8gdmVyaWZ5IHRoaXMuCgogIFNldHRpbmcgQ1VSTE9QVF9IVFRQUE9TVCB0byBOVUxMIG1ha2VzIGEgemVybyBieXRlIHBvc3QuIEFkZGVkIHRlc3QgY2FzZSA1MTYKICB0byB2ZXJpZnkgdGhpcy4KCiAgQ1VSTE9QVF9QT1NURklFTERTSVpFIG11c3Qgbm93IGJlIHNldCB0byAtMSB0byBzaWduYWwgIndlIGRvbid0IGtub3ciLgogIFNldHRpbmcgaXQgdG8gemVybyBzaW1wbHkgc2F5cyB0aGlzIGlzIGEgemVybyBieXRlIFBPU1QuCgogIFdoZW4gcHJvdmlkaW5nIFBPU1QgZGF0YSB3aXRoIGEgcmVhZCBjYWxsYmFjaywgc2V0dGluZyB0aGUgc2l6ZSB1cCBmcm9udAogIGlzIG5vdyBtYWRlIHdpdGggQ1VSTE9QVF9QT1NURklFTERTSVpFIGFuZCBub3Qgd2l0aCBDVVJMT1BUX0lORklMRVNJWkUuCgpEYW5pZWwgKDExIE5vdmVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIC0tZGlzYWJsZS12ZXJib3NlIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGJ1aWxkcwogIHdpdGhvdXQgdmVyYm9zZSBzdHJpbmdzIGluIHRoZSBjb2RlLCB0byBzYXZlIHNvbWUgMTJLQiBzcGFjZS4gTWFrZXMgc2Vuc2UKICBvbmx5IGZvciBzeXN0ZW1zIHdpdGggdmVyeSBsaXR0bGUgbWVtb3J5IHJlc291cmNlcy4KCi0gSmVmZiBQaGlsbGlwcyBmb3VuZCBvdXQgdGhhdCBhIGRhdGUgc3RyaW5nIHdpdGggYSB5ZWFyIGJleW9uZCAyMDM4IGNvdWxkCiAgY3Jhc2ggdGhlIG5ldyBkYXRlIHBhcnNlciBvbiBzeXN0ZW1zIHdpdGggMzJiaXQgdGltZV90LiBXZSBub3cgY2hlY2sgZm9yCiAgdGhpcyBjYXNlIGFuZCBkZWFsIHdpdGggaXQuCgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDQpCi0gSSBpbnN0YWxsZWQgSGVpbWRhbCBvbiBteSBEZWJpYW4gYm94ICh1c2luZyB0aGUgZGViaWFuIHBhY2thZ2UpIGFuZCBub3RpY2VkCiAgdGhhdCBjb25maWd1cmUgLS13aXRoLWdzc2FwaSBmYWlsZWQgdG8gY3JlYXRlIGEgbmljZSBidWlsZC4gRml4ZWQgbm93LgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFya2VkIGFsbCBleHRlcm5hbCBmdW5jdGlvbiBjYWxscyB3aXRoIENVUkxfRVhURVJOIHNvIHRoYXQgbm93CiAgdGhlIFdpbmRvd3MsIE5ldHdhcmUgYW5kIG90aGVyIGJ1aWxkcyBubyBsb25nZXIgbmVlZCBsaWJjdXJsLmRlZiBvciBzaW1pbGFyCiAgZmlsZXMuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNCkKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrIGZvciB0bGQuaCBpZiBsaWJpZG4gd2FzIGRldGVjdGVkLCBzaW5jZQogIGxpYmlkbiAwLjMuWCBkaWRuJ3QgaGF2ZSBzdWNoIGEgaGVhZGVyIGFuZCB3ZSBkb24ndCB3b3JrIHdpdGggYW55dGhpbmcKICBiZWZvcmUgbGliaWRuIDAuNC4xIGFueXdheSEgU3VzZSA5LjEgYXBwYXJlbnRseSBzaGlwcyB3aXRoIGEgMC4zLlggdmVyc2lvbgogIG9mIGxpYmlkbiB3aGljaCBtYWtlcyB0aGUgY3VybCA3LjEyLjIgYnVpbGQgZmFpbC4gSmVhbi1QaGlsaXBwZQogIEJhcnJldHRlLUxhUGllcnJlIGhlbHBlZCBwb2ludGluZyB0aGlzIG91dC4KCi0gSWFuIEd1bGxpdmVyIHJlcG9ydGVkIGluIGRlYmlhbiBidWcgcmVwb3J0ICMyNzg2OTE6IGlmIGN1cmwgaXMgaW52b2tlZCBpbiBhbgogIGVudmlyb25tZW50IHdoZXJlIHN0ZGVyciBpcyBjbG9zZWQgdGhlIC12IG91dHB1dCB3aWxsIHN0aWxsIGJlIHNlbnQgdG8gZmlsZQogIGRlc2NyaXB0b3IgMiB3aGljaCB0aGVuIG1pZ2h0IGJlIHRoZSBuZXR3b3JrIHNvY2tldCBoYW5kbGUhIE5vdyB3ZSBoYXZlIGEKICB3ZWlyZCBoYWNrIGluc3RlYWQgdGhhdCBhdHRlbXB0cyB0byBtYWtlIHN1cmUgdGhhdCBmaWxlIGRlc2NyaXB0b3IgMiBpcwogIG9wZW5lZCAod2l0aCBhIGNhbGwgdG8gcGlwZSgpKSBiZWZvcmUgbGliY3VybCBpcyBjYWxsZWQgdG8gZG8gdGhlIHRyYW5zZmVyLgogIGNvbmZpZ3VyZSBub3cgY2hlY2tzIGZvciBwaXBlKCkgYW5kIHN5c3RlbXMgd2l0aG91dCBwaXBlIGRvbid0IGdldCB0aGUgd2VpcmQKICBoYWNrIGRvbmUuCgpEYW5pZWwgKDUgTm92ZW1iZXIgMjAwNCkKLSBUaW0gU25lZGRvbiBtYWRlIGxpYmN1cmwgc2VuZCBubyBtb3JlIHRoYW4gNjRLIGluIGEgc2luZ2xlIGZpcnN0IGNodW5rIHdoZW4KICBkb2luZyBhIGh1Z2UgUE9TVCBvbiBWTVMsIGFzIHRoaXMgaXMgYSBzeXN0ZW0gbGltaXRhdGlvbi4gRGVmYXVsdCBvbiBnZW5lcmFsCiAgc3lzdGVtcyBpcyAxMDBLLgoKRGFuaWVsICg0IE5vdmVtYmVyIDIwMDQpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIGl0IGJ1aWxkIG9uIG1pbmd3IGFnYWluYSwgbXkgLS1yZXRyeSBjb2RlIGJyb2tlIHRoZSBidWlsZC4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDA0KQotIEFkZGVkIC0tcmV0cnktbWF4LXRpbWUgdGhhdCBhbGxvd3MgYSBtYXhpbXVtIHRpbWUgdGhhdCBtYXkgbm90IGhhdmUgYmVlbgogIHJlYWNoZWQgZm9yIGEgcmV0cnkgdG8gYmUgbWFkZS4gSWYgbm90IHNldCB0aGVyZSBpcyBubyBtYXhpbXVtIHRpbWUsIG9ubHkKICB0aGUgYW1vdW50IG9mIHJldHJpZXMgc2V0IHdpdGggLS1yZXRyeS4KCi0gUGF1bCBOb2xhbiBwcm92aWRlZCBhIHBhdGNoIHRvIG1ha2UgbGliY3VybCBidWlsZCBuaWNlbHkgb24gV2luZG93cyBDRS4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDA0KQotIFdoZW4gY3Jvc3MtY29tcGlsaW5nLCB0aGUgY29uZmlndXJlIHNjcmlwdCBubyBsb25nZXIgYXR0ZW1wdHMgdG8gdXNlCiAgcGtnLWNvbmZpZyBvbiB0aGUgYnVpbGQgaG9zdCBpbiBvcmRlciB0byBkZXRlY3QgT3BlblNTTCBjb21waWxlciBvcHRpb25zLgoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoOgoKICBBbiBpbXByb3ZlbWVudCB0byB0aGUgZ3ppcCBoYW5kbGluZyBvZiBsaWJjdXJsLiBUaGVyZSB3ZXJlIHR3byBwcm9ibGVtcyB3aXRoCiAgdGhlIG9sZCB2ZXJzaW9uOiBpdCB3YXMgcG9zc2libGUgZm9yIGEgbWFsaWNpb3VzIGd6aXAgZmlsZSB0byBjYXVzZSBsaWJjdXJsCiAgdG8gbGVhayBtZW1vcnksIGFzIGEgYnVmZmVyIHdhcyBtYWxsb2NlZCB0byBob2xkIHRoZSBoZWFkZXIgYW5kIG5ldmVyIGZyZWVkCiAgaWYgdGhlIGhlYWRlciBlbmRlZCB3aXRoIG5vIGZpbGUgY29udGVudHMuICBUaGUgc2Vjb25kIHByb2JsZW0gaXMgdGhhdCB0aGUKICA2NCBLaUIgZGVjb21wcmVzc2lvbiBidWZmZXIgd2FzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIHdoaWNoIGNhdXNlZAogIHVuZXhwZWN0ZWRseSBoaWdoIHN0YWNrIHVzYWdlIGFuZCBvdmVyZmxvd2VkIHRoZSBzdGFjayBvbiBzb21lIHN5c3RlbXMKICAoc29tZW9uZSBjb21wbGFpbmVkIGFib3V0IHRoYXQgaW4gdGhlIG1haWxpbmcgbGlzdCBhYm91dCBhIHllYXIgYWdvKS4KCiAgQm90aCBwcm9ibGVtcyBhcmUgZml4ZWQgYnkgdGhpcyBwYXRjaC4gVGhlIGZpcnN0IG9uZSBpcyBmaXhlZCB3aGVuIGEgcmVjZW50CiAgKDEuMikgdmVyc2lvbiBvZiB6bGliIGlzIHVzZWQsIGFzIGl0IHRha2VzIGNhcmUgb2YgZ3ppcCBoZWFkZXIgcGFyc2luZwogIGl0c2VsZi4gIEEgY2hlY2sgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBkb25lIGF0IHJ1bi10aW1lIGFuZCBsaWJjdXJsIHVzZXMKICB0aGF0IGZlYXR1cmUgaWYgaXQncyBwcmVzZW50LiBJJ3ZlIGNyZWF0ZWQgYSBkZWZpbmUgT0xEX1pMSUJfU1VQUE9SVCB0aGF0CiAgY2FuIGJlIGNvbW1lbnRlZCBvdXQgdG8gc2F2ZSBzb21lIGNvZGUgc3BhY2UgaWYgbGliY3VybCBpcyBndWFyYW50ZWVkIHRvIGJlCiAgdXNpbmcgYSAxLjIgdmVyc2lvbiBvZiB6bGliLgoKICBUaGUgc2Vjb25kIHByb2JsZW0gaXMgc29sdmVkIGJ5IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgdGhlIG1lbW9yeSBidWZmZXIKICBpbnN0ZWFkIG9mIHN0b3JpbmcgaXQgb24gdGhlIHN0YWNrLiBUaGUgYWxsb2NhdGlvbi9mcmVlIGlzIGRvbmUgZm9yIGV2ZXJ5CiAgaW5jb21pbmcgcGFja2V0LCB3aGljaCBpcyBzdWJvcHRpbWFsLCBidXQgc2hvdWxkIGJlIGR3YXJmZWQgYnkgdGhlIGFjdHVhbAogIGRlY29tcHJlc3Npb24gY29tcHV0YXRpb24uCgogIEkndmUgYWxzbyBmYWN0b3JlZCBvdXQgc29tZSBjb21tb24gY29kZSBiZXR3ZWVuIGRlZmxhdGUgYW5kIGd6aXAgdG8gcmVkdWNlCiAgdGhlIGNvZGUgZm9vdHByaW50IHNvbWV3aGF0LiAgSSd2ZSB0ZXN0ZWQgdGhlIGd6aXAgY29kZSBvbiBhIGZldyB0ZXN0IGZpbGVzCiAgYW5kIEkgdHJpZWQgZGVmbGF0ZSB1c2luZyB0aGUgZnJlc2htZWF0Lm5ldCBzZXJ2ZXIsIGFuZCBpdCBhbGwgbG9va3MgT0suIEkKICBkaWRuJ3QgdHJ5IHJ1bm5pbmcgaXQgd2l0aCB2YWxncmluZCwgaG93ZXZlci4KCi0gQWRkZWQgYSAtLXJldHJ5IG9wdGlvbiB0byBjdXJsIHRoYXQgdGFrZXMgYSBudW1lcmljYWwgb3B0aW9uIGZvciB0aGUgbnVtYmVyCiAgb2YgdGltZXMgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZC4gSXQgaXMgcmV0cmllZCBpZiBhIHRyYW5zaWVudCBlcnJvcgogIGlzIGRldGVjdGVkIG9yIGlmIGEgdGltZW91dCBvY2N1cnJlZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCBmaXJzdCB3YWl0IG9uZQogIHNlY29uZCBiZXR3ZWVuIHRoZSByZXRyaWVzIGFuZCB0aGVuIGRvdWJsZSB0aGUgZGVsYXkgdGltZSBiZXR3ZWVuIGVhY2ggcmV0cnkKICB1bnRpbCB0aGUgZGVsYXkgdGltZSBpcyB0ZW4gbWludXRlcyB3aGljaCB0aGVuIHdpbGwgYmUgdGhlIGRlbGF5IHRpbWUKICBiZXR3ZWVuIGFsbCBmb3J0aGNvbWluZyByZXRyaWVzLiBZb3UgY2FuIHNldCBhIHN0YXRpYyBkZWxheSB0aW1lIHdpdGgKICAiLS1yZXRyeS1kZWxheSBbbnVtXSIgd2hlcmUgW251bV0gaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbgogIGVhY2ggcmV0cnkuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNCkKLSBUb21hcyBQb3NwaXNlayBmaWxlZCBidWcgcmVwb3J0ICMxMDUzMjg3IHRoYXQgcHJvdmVkIC1DIC0gYW5kIC0tZmFpbCBvbiBhCiAgZmlsZSB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlbHkgZG93bmxvYWRlZCBjYXVzZWQgYW4gZXJyb3IsIHdoaWxlIGl0CiAgZG9lc24ndCBpZiB5b3UgZG9uJ3QgdXNlIC0tZmFpbCEgSSBhZGRlZCB0ZXN0IGNhc2UgMTk0IHRvIHZlcmlmeSB0aGUgZml4LgogIEdycnIuIENVUkxPUFRfRkFJTE9ORVJST1IgaXMgbm93IGFkZGVkIHRvIHRoZSBsaXN0IHN0dWZmIHRvIHJlbW92ZSBpbgogIGxpYmN1cmwgdjggZHVlIHRvIGFsbCB0aGUga2x1ZGdlcyBuZWVkZWQgdG8gc3VwcG9ydCBpdC4KCi0gTW9odW4gQmlzd2FzIGZvdW5kIG91dCB0aGF0IGZvcm1wb3N0aW5nIGEgemVyby1ieXRlIGZpbGUgZGlkbid0IHdvcmsgdmVyeQogIGdvb2QuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIGl0IHBvc3NpYmxlIHRvIG1ha2UgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlcnMKICB3aXRoIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBiZWluZyB0aGUgc2FtZSBob3N0LiBJdCBjYW4gYmUgdXNlZnVsIGlmCiAgeW91IHdhbnQgdG8gbW92ZSBhIGZpbGUgb24gYSBzZXJ2ZXIgb3Igc2ltaWxhci4KCi0gR3VpbGxhdW1lIEFybHVpc29uIGFkZGVkIENVUkxJTkZPX05VTV9DT05ORUNUUyB0byBhbGxvdyBhbiBhcHAgdG8gZmlndXJlCiAgb3V0IGhvdyBtYW55IG5ldyBjb25uZWN0cyBhIHByZXZpb3VzIHRyYW5zZmVyIHJlcXVpcmVkLgoKICBJIGFkZGVkICV7bnVtX2Nvbm5lY3RzfSB0byB0aGUgY3VybCB0b29sIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTkyIGFuZCAxOTMKICB0byB2ZXJpZnkgdGhlIG5ldyBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDQpCi0gUGV0ZXIgV3VsbGluZ2VyIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBzaG91bGQgY2FsbCBzZXRsb2NhbGUoKSBwcm9wZXJseSB0bwogIGluaXRpYXRlIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBvcGVyYXRpb25zLCB0byBtYWtlIHRoZSBJRE4gc3R1ZmYgd29yawogIGJldHRlci4KClZlcnNpb24gNy4xMi4yICgxOCBPY3RvYmVyIDIwMDQpCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiB3b3JrCiAgZmluZSBldmVuIGZvciB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMuCgotIHJ1bmVrbCBhdCBvcG9pbnQuY29tIGZvdW5kIG91dCAoYW5kIHByb3ZpZGVkIGEgZml4KSB0aGF0IGxpYmN1cmwgbGVha2VkCiAgbWVtb3J5IGZvciBjb29raWVzIHdpdGggdGhlICJtYXgtYWdlIiBmaWVsZCBzZXQuCgpHaXNsZSAoMTYgT2N0b2JlciAyMDA0KQotIElzc3VlIDUwIGluIFRPRE8tUkVMRUFTRTsgQWRkZWQgVHJhaWFuIE5pY29sZXNjdSdzIHBhdGNoZXMgZm9yIHRocmVhZGVkCiAgcmVzb2x2ZXIgb24gV2luZG93cy4gUGx1Z2dlZCBzb21lIHBvdGVudGlhbCBoYW5kbGUgYW5kIG1lbW9yeSBsZWFrcy4KCkRhbmllbCAoMTQgT2N0b2JlciAyMDA0KQotIEVyaWMgVmVyZ25hdWQgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCB0cmVhdCA/LWxldHRlcnMgaW4gdGhlIHVzZXIKICBuYW1lIGFuZCBwYXNzd29yZCBmaWVsZHMgcHJvcGVybHkgaW4gVVJMcywgbGlrZQogIGZ0cDovL3VzP2VyOnBhc3M/d29yZEBzaXRlLmNvbS8uIEFkZGVkIHRlc3QgMTkxIHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDQpCi0gbGliY3VybCBub3cgdXNlcyBTT19OT1NJR1BJUEUgZm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChNYWMgT1MgWCAxMC4yIG9yCiAgbGF0ZXIgaXMgb25lKSB0byBpbmhpYml0IHRoZSBTSUdQSVBFIHNpZ25hbCB3aGVuIHdyaXRpbmcgdG8gYSBzb2NrZXQgd2hpbGUKICB0aGUgcGVlciBkaWVzLiBUaGUgc2FtZSBlZmZlY3QgaXMgcHJvdmlkZSBieSB0aGUgTVNHX05PU0lHTkFMIHBhcmFtZXRlciB0bwogIHNlbmQoKSBvbiBvdGhlciBzeXN0ZW1zLiBBbGFuIFBpbnN0ZWluIHZlcmlmaWVkIHRoZSBmaXguCgpEYW5pZWwgKDEwIE9jdG9iZXIgMjAwNCkKLSBTeXN0ZW1zIHdpdGggNjRiaXQgbG9uZ3Mgbm8gbG9uZ2VyIHVzZSBzdHJ0b2xsKCkgb3Igb3VyIHN0cnRvbGwtIHJlcGxhY2VtZW50CiAgdG8gcGFyc2UgNjQgYml0IG51bWJlcnMuIHN0cnRvbCgpIHdvcmtzIGZpbmUuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIHRvCiAgZGV0ZWN0IGlmIFtjb25zdGFudF1MTCB3b3JrcyBhbmQgaWYgc28sIHVzZSB0aGF0IGluIHRoZSBzdHJ0b2xsIHJlcGxhY2VtZW50CiAgY29kZSB0byB3b3JrIGFyb3VuZCBjb21waWxlciB3YXJuaW5ncyByZXBvcnRlZCBieSBBbmR5IENlZGlsbmlrLgoKR2lzbGUgKDYgT2N0b2JlciAyMDA0KQotIEZvciBVU0VfTElCSUROIGJ1aWxkczogQWRkZWQgVG9wLUxldmVsLURvbWFpbiAoVExEKSBjaGVjayBvZiBob3N0LW5hbWUKICB1c2VkIGluIGZpeF9ob3N0bmFtZSgpLiBDaGVja3MgaWYgY2hhcmFjdGVycyBpbiAnaG9zdC0+bmFtZScgKGluZGlyZWN0bHkKICB2aWEgJ2FjZV9ob3N0bmFtZScpIGFyZSBsZWdhbCBhY2NvcmRpbmcgdG8gdGhlIFRMRCB0YWJsZXMgaW4gbGliaWRuLgoKRGFuaWVsICg2IE9jdG9iZXIgMjAwNCkKLSBDaGloLUNodW5nIENoYW5nIHJlcG9ydGVkIHRoYXQgaWYgeW91IHVzZSBDVVJMT1BUX1JFU1VNRV9GUk9NIGFuZCBlbmFibGVkCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgbGliY3VybCByZXBvcnRlZCBlcnJvciBpZiBhIHJlZGlyZWN0IGhhcHBlbmVkIGV2ZW4KICBpZiB0aGUgbmV3IFVSTCB3b3VsZCBwcm92aWRlIHRoZSByZXN1bWVkIGZpbGUuIFRlc3QgY2FzZSAxODggYWRkZWQgdG8gdmVyaWZ5CiAgdGhlIGZpeCAodG9nZXRoZXIgd2l0aCBleGlzdGluZyB0ZXN0IDk5KS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgY29uZmlndXJlIGZsYXcgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIGJvdGggbnNsIGFuZCBzb2NrZXQKICBsaWJzIHRvIHVzZSBnZXRob3N0YnluYW1lKCkuCgotIFJlbW92ZWQgdGFicyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGxvdHMgb2Ygc291cmNlIGZpbGVzLgoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNCkKLSBNYWRlIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuPVBBVEggdHJ5IHRoZSBnaXZlbiBQQVRIIGJlZm9yZSB0aGUgZGVmYXVsdAogIHBhdGhzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUuCgotIElmIGlkbmFfc3RyZXJyb3IoKSBpcyBwcmVzZW50IGluIGxpYmlkbiwgd2UgY2FuIHVzZSB0aGF0IGluc3RlYWQgb2Ygb3VyCiAgaW50ZXJuYWwgcmVwbGFjZW1lbnQuIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGJ5IFNpbW9uIGluIGxpYmlkbiAwLjUuNiBhbmQKICBpcyBkZXRlY3RlZCBieSBjb25maWd1cmUuCgotIEl0IHNlZW1zIGJhc2VuYW1lKCkgb24gSVJJWCBpcyBpbiB0aGUgbGliZ2VuIGxpYnJhcnkgYW5kIHNpbmNlIHdlIGRvbid0IHVzZQogIHRoYXQsIGNvbmZpZ3VyZSBmaW5kcyBsaWJnZW4uaCBidXQgbm90IGJhc2VuYW1lIGFuZCB0aGVuIHdlIGdldCBhIGNvbXBpbGVyCiAgZXJyb3IgYmVjYXVzZSBvdXIgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBkb2Vzbid0IG1hdGNoIHRoZSBwcm90byBpbgogIGxpYmdlbi5oLiBTdGFydGluZyBub3csIHdlIGRvbid0IGluY2x1ZGUgdGhlIGZpbGUgaWYgYmFzZW5hbWUgd2Fzbid0IGZvdW5kCiAgYXMgd2VsbC4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDQpCi0gQ2hyaXMgZm91bmQgYSByYWNlIGNvbmRpdGlvbiByZXN1bHRpbmcgaW4gQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgYW5kCiAgcG90ZW50aWFsIGNyYXNoLCBpbiB0aGUgd2luZG93cyB0aHJlYWRlZCBuYW1lIHJlc29sdmVyIGNvZGUuCgpEYW5pZWwgKDMgT2N0b2JlciAyMDA0KQotIFJlcGxhY2VkIHRoZSB1c2Ugb2YgaXNzcGFjZSgpIGluIGNvb2tpZS5jIHdpdGggb3VyIG93biB2ZXJzaW9uIGluc3RlYWQgc2luY2UKICB3ZSBoYXZlIG1vc3QgZGF0YSBhcyAnY2hhciAqJyBhbmQgdGhhdCBtYWtlcyB1cyBwYXNzIGluIG5lZ2F0aXZlIHZhbHVlcyBpZgogIHRoZXJlIGlzIDhiaXQgZGF0YSBpbiB0aGUgc3RyaW5nLiBDaGFuZ2luZyB0byB1bnNpZ25lZCBjYXVzZXMgdG9vIG11Y2gKICB3YXJuaW5ncyBvciB0b28gbWFueSByZXF1aXJlZCB0eXBlY2FzdHMgdG8gdGhlIG5vcm1hbCBzdHJpbmcgZnVuY3Rpb25zLgogIEhhcnNoYWwgUHJhZGhhbiBpZGVudGlmaWVkIHRoaXMgcHJvYmxlbS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgY291bGQgcmVhZCBhbHJlYWR5IGZyZWVkCiAgZGF0YSB3aGVuIENVUkxPUFRfVkVSQk9TRSBpcyB1c2VkIGFuZCBhICh2ZXJ5KSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIEl0CiAgaGFwcGVuZWQgd2hlbiB0aGUgZG5zIGNhY2hlIGVudHJ5IGZvciB0aGUgY29ubmVjdGlvbiB3YXMgcHJ1bmVkIHdoaWxlIHRoZQogIGNvbm5lY3Rpb24gd2FzIHN0aWxsIGFsaXZlIGFuZCB0aGVuIGFnYWluIHJlLXVzZWQuIFdlIHdvcmtlZCB0b2dldGhlciBvbgogIHRoaXMgZml4LgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSAobGliaWRuCiAgYmFzZWQpIElETiBjb252ZXJzaW9uIGZhaWxzLiBUaGlzIGlzIHJlYWxseSBkdWUgdG8gYSBtaXNzaW5nIHN1aXRhYmxlCiAgZnVuY3Rpb24gaW4gdGhlIGxpYmlkbiBBUEkgdGhhdCBJIGhvcGUgd2UgY2FuIHJlbW92ZSBvbmNlIGxpYmlkbiBnZXRzIGEKICBmdW5jdGlvbiBsaWtlIHRoaXMuCgpEYW5pZWwgKDEgT2N0b2JlciAyMDA0KQotIEFsZWtzYW5kYXIgTWlsaXZvamV2aWMgcmVwb3J0ZWQgYSBwcm9ibGVtIGluIHRoZSBSZWRoYXQgYnVnemlsbGEgKHNlZQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTM0MTMzKSBhbmQgbm90IHRvCiAgYW55b25lIGludm9sdmVkIGluIHRoZSBjdXJsIHByb2plY3QhIFRoaXMgaGFwcGVucyB3aGVuIHlvdSB0cnkgdG8gY3VybCBhCiAgZmlsZSBmcm9tIGEgcHJvZnRwZCBzaXRlIHVzaW5nIFNTTC4gSXQgc2VlbXMgcHJvZnRwZCBzZW5kcyBhIHNvbWV3aGF0CiAgdW5vcnRob2RveCByZXNwb25zZSBjb2RlICgyMzIgaW5zdGVhZCBvZiAyMzApLiBJIHJlbGF4ZWQgdGhlIHJlc3BvbnNlIGNvZGUKICBjaGVjayB0byBkZWFsIHdpdGggdGhpcyBhbmQgc2ltaWxhciBjYXNlcy4KCi0gQmFzZWQgb24gRmVkb3IgS2FycGVsZXZpdGNoJ3MgZm9ybXBvc3QgcGF0aCBiYXNlbmFtZSBwYXRjaCwgZmlsZSBwYXJ0cyBpbgogIGZvcm1wb3N0cyBubyBsb25nZXIgaW5jbHVkZSB0aGUgcGF0aCBwYXJ0LiBJZiB5b3UgX3JlYWxseV8gd2FudCB0aGVtLCB5b3UKICBtdXN0IHByb3ZpZGUgeW91ciBwcmVmZXJyZWQgZnVsbCBmaWxlIG5hbWUgd2l0aCBDVVJMRk9STV9GSUxFTkFNRS4KCiAgQWRkZWQgZGV0ZWN0aW9uIGZvciBsaWJnZW4uaCBhbmQgYmFzZW5hbWUoKSB0byBjb25maWd1cmUuIE15IGN1c3RvbQogIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBpdCwgbWlnaHQgYmUgYSBiaXQgdG9vCiAgbmFpdmUuLi4KCiAgVXBkYXRlZCA2IHRlc3QgY2FzZXMgdG8gbWFrZSB0aGVtIHdvcmsgd2l0aCB0aGUgc3RyaXBwZWQgcGF0aHMuCgpEYW5pZWwgKDMwIFNlcHRlbWJlciAyMDA0KQotIExhcnJ5IENhbXBiZWxsIGFkZGVkIENVUkxJTkZPX09TX0VSUk5PIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdGhhdCBhbGxvd3MgYW4KICBhcHAgdG8gcmV0cmlldmUgdGhlIGVycm5vIHZhcmlhYmxlIGFmdGVyIGEgKGNvbm5lY3QpIGZhaWx1cmUuIEl0IHdpbGwgbWFrZQogIHNlbnNlIHRvIHByb3ZpZGUgdGhpcyBmb3IgbW9yZSBmYWlsdXJlcyBpbiBhIG1vcmUgZ2VuZXJpYyB3YXksIGJ1dCBsZXQncwogIHN0YXJ0IGxpa2UgdGhpcy4KCi0gR/xudGVyIEtuYXVmIGFuZCBDYXNleSBPJ0Rvbm5lbGwgd29ya2VkIG91dCBhbiBleHRyYSAjaWYgY29uZGl0aW9uIGZvciB0aGUKICBjdXJsL211bHRpLmggaGVhZGVyIHRvIHdvcmsgYmV0dGVyIGluIHdpbnNvY2stdXNpbmcgYXBwcy4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGJ1aWxkY29uZiBydW4gYmV0dGVyIG9uIE1hYyBPUyBYIGJ5CiAgcHJvcGVybHkgdXNpbmcgZ2xpYnRvb2xpemUgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29saXplLiAoVGhpcyBpcyBtYWRlIGlmCiAgZ2xpYnRvb2wgd2FzIGZvdW5kIGFuZCB1c2VkIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbC4pCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHNvIHRoYXQgaXQgZG9lc24ndCBtaXN0YWtpbmdseQogIGVuYWJsZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDA0KQotICJNZWtvbmlrdW0iIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBidWlsdCBjdXJsIHdpdGhvdXQgU1NMIHN1cHBvcnQsIGFsdGhvdWdoCiAgeW91ciBjdXJyZW50IFNTTCBpbnN0YWxsYXRpb24gc3VwcG9ydHMgRW5naW5lLCB0aGUgY29tcGlsZSBmYWlscy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDQpCi0gV2hlbiAtLXdpdGgtc3NsPVBBVEggaXMgdXNlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCwgaXQgbm8gbG9uZ2VyIHVzZXMKICBwa2ctY29uZmlnIHRvIGZpZ3VyZSBvdXQgZXh0cmEgZGV0YWlscy4gVGhhdCBpcyBub3cgb25seSBkb25lIGlmIG5vIFBBVEggaXMKICBpbmNsdWRlZCBvciBpZiBTU0wgaXMgY2hlY2tlZCBmb3IgYnkgZGVmYXVsdCB3aXRob3V0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbi4KCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9TU0xFTkdJTkUgY291bGRuJ3QgZXZlbiBiZSBzZXQgdG8KICBOVUxMIHdoZW4gbm8gZW5naW5lIHdhcyBzdXBwb3J0ZWQuIEl0IGNhbiBub3cuCgpEYW5pZWwgKDIyIFNlcHRlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBmaXhlZCB0aHJlZSB0ZXN0IGNhc2VzIHRvIG5vIGxvbmdlciB1c2UgImxvY2FsaG9zdCIgYnV0IGluc3RlYWQKICB1c2UgIjEyNy4wLjAuMSIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoYXQgbG9jYWxob3N0IHJlc29sdmVzIG5pY2VseS4KCi0gSmVhbi1DbGF1ZGUgQ2hhdXZlIGZpeGVkIGFuIExEQVAgY3Jhc2ggd2hlbiBtb3JlIHRoYW4gb25lIHJlY29yZCB3YXMKICByZXRyaWV2ZWQuCgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDA0KQotIEFuZHJlYXMgUmlla2UgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgd2l0aG91dAogIGEgc2VydmljZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGN1cmxfZWFzeV9wZXJmb3JtKCkgZGlkbid0IHByb3Blcmx5IHByb3ZpZGUKICBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBDVVJMT1BUX0VSUk9SQlVGRkVSIGJ1ZmZlci4KCkRhbmllbCAoMTYgU2VwdGVtYmVyIDIwMDQpCi0gRGFuaWVsIGF0IHRvdWNodHVuZXMgdXNlcyB0aGUgRlRQK1NTTCBzZXJ2ZXIgIkJTREZUUEQtU1NMIGZyb20KICBodHRwOi8vYnNkZnRwZC1zc2wuc2MucnUvIiB3aGljaCBhY2NvcmRpbmdseSBkb2Vzbid0IHByb3Blcmx5IHdvcmsgd2l0aCBjdXJsCiAgd2hlbiAiQVVUSCBTU0wiIGlzIGlzc3VlZCAoYWx0aG91Z2ggdGhlIHNlcnZlciByZXNwb25kcyBmaW5lIGFuZCBldmVyeXRoaW5nKQogIGJ1dCByZXF1aXJlcyB0aGF0IGN1cmwgaXNzdWVzICJBVVRIIFRMUyIgaW5zdGVhZC4gU2VlCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMDk1MTk0NDkzNzYwMyZzdXBwb3J0PXllcwoKICBJbnRyb2R1Y2luZyBDVVJMT1BUX0ZUUFNTTEFVVEggdGhhdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCB3aGljaAogIG9mIHRoZSBBVVRIIHN0cmluZ3MgdG8gYXR0ZW1wdCBmaXJzdC4KCi0gQW5vbnltb3VzIGZpbGVkIGJ1ZyByZXBvcnQgIzEwMjk0Nzggd2hpY2ggaWRlbnRpZmllZCBhIGJ1ZyB3aGVuIHlvdSAxKSB1c2VkCiAgYSBVUkwgd2l0aG91dCBwcm9wZXJseSBzZXBlcmF0aW5nIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpdGggYQogIHNsYXNoLiAyKSB0aGUgVVJMIGhhZCBwYXJhbWV0ZXJzIHRvIHRoZSByaWdodCBvZiBhID8gdGhhdCBjb250YWlucyBhIHNsYXNoCiAgMykgY3VybCB3YXMgdG9sZCB0byBmb2xsb3cgTG9jYXRpb246cyA0KSB0aGUgcmVxdWVzdCBnb3QgYSByZXNwb25zZSB0aGF0CiAgY29udGFpbmVkIGEgTG9jYXRpb246IHRvIHJlZGlyZWN0IHRvICIvZGlyIi4gY3VybCB0aGVuIGFwcGVuZGVkIHRoZSBuZXcgcGF0aAogIG9uIHRoZSB3cm9uZyBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgVVJMLgoKICBUZXN0IGNhc2UgMTg3IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdhcyBmaXhlZCBwcm9wZXJseS4KCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDQpCi0gQWRkZWQgcGFyc2VkYXRlLmMgdGhhdCBjb250YWlucyBhIHJld3JpdGUgb2YgdGhlIGRhdGUgcGFyc2VyIGN1cnJlbnRseQogIHByb3ZpZGVkIGJ5IGdldGRhdGUueS4gVGhlIG5ldyBvbmUgaXMgTVVDSCBzbWFsbGVyIGFuZCB3aWxsIGFsbG93IHVzIHRvIHJ1bgogIGF3YXkgZnJvbSB0aGUgeWFjYy9iaXNvbiBqdW5nbGUuIEl0IGlzIGFsc28gc2xpZ2h0bHkgbGFja2luZyBpbiBmZWF0dXJlcwogIGNvbXBhcmVkIHRvIHRoZSBvbGQgb25lLCBidXQgaXQgc3VwcG9ydHMgcGFyc2luZyBvZiBhbGwgZGF0ZSBmb3JtYXRzIEhUVFAKICBpbnZvbHZlcyAoYW5kIGEgZmFpciBidW5jaCBvZiBvdGhlcnMpLgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwNCkKLSBBcyBmb3VuZCBvdXQgYnkgSm9uYXMgRm9yc21hbiwgY3VybCBkaWRuJ3QgYWxsb3cgLUYgdG8gc2V0IENvbnRlbnQtVHlwZSBvbgogIHRleHQtcGFydHMuIFN0YXJ0aW5nIG5vdywgd2UgY2FuIGRvIC1GICJuYW1lPWRhbmllbDt0eXBlPXRleHQvZXh0cmEiLiBBZGRlZAogIHRlc3QgY2FzZSAxODYgdG8gdmVyaWZ5LgoKLSBCdWcgcmVwb3J0ICMxMDI1OTg2LiBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB3aXRoIGEgY3VzdG9tIEhvc3Q6IGhlYWRlcgogIHJlcGxhY2VtZW50LCBjdXJsIG9ubHkgcmVwbGFjZWQgdGhlIEhvc3Q6IGhlYWRlciBvbiB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIGRpZG4ndCByZXBsYWNlIGl0IG9uIHRoZSBmb2xsb3dpbmcgb25lcy4gVGhpcyByZXN1bHRlZCBpbiByZXF1ZXN0cyB3aXRoCiAgdHdvIEhvc3Q6IGhlYWRlcnMuCgogIE5vdywgY3VybCBjaGVja3MgaWYgdGhlIGxvY2F0aW9uIGlzIG9uIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCB0aGVuIGNvbnRpbnVlcyB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIuIEFuZCB3aGVuIGl0IG1vdmVzIHRvIGFub3RoZXIKICBob3N0LCBpdCBkb2Vzbid0IHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBidXQgaXQgYWxzbyBkb2Vzbid0IG1ha2UgdGhlCiAgc2Vjb25kIEhvc3Q6IGhlYWRlciBnZXQgdXNlZCBpbiB0aGUgcmVxdWVzdC4KCiAgVGhpcyBjaGFuZ2UgaXMgdmVyaWZpZWQgYnkgdGhlIHR3byBuZXcgdGVzdCBjYXNlcyAxODQgYW5kIDE4NS4KCkRhbmllbCAoOCBTZXB0ZW1iZXIgMjAwNCkKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSB0byBiZSBhYmxlIHRvIHVzZSBhbmQgcnVuIHdpdGggY3VzdG9taXplZCBwb3J0CiAgbnVtYmVycy4gVGhpcyB3YXMgYWx3YXlzIGludGVuZGVkIGJ1dCBuZXZlciBiZWZvcmUgcG9zc2libGUuIE5vdyBhIHNpbXBsZQogIGNoYW5nZSBpbiB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNhbiBtYWtlIGFsbCB0ZXN0cyB1c2UgZGlmZmVyZW50IHBvcnRzLgogIFRoZSBkZWZhdWx0IHBvcnRzIGluIHVzZSBmcm9tIG5vdyBvbiBhcmUgODk5MCB0byA4OTkzLgoKRGFuaWVsICgyIFNlcHRlbWJlciAyMDA0KQotIE1pbm9yIG1vZGlmaWNhdGlvbiBvZiBhbiBTU0wtcmVsYXRlZCBlcnJvciBtZXNzYWdlLgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwNCkKLSBEYXZpZCBUYXJlbmRhc2ggZm91bmQgb3V0IHRoYXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgcmV0dXJuZWQKICBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaW5zdGVhZCBvZiBDVVJMTV9PSy4KCkRhbmllbCAoMzAgQXVndXN0IDIwMDQpCi0gTWFrZSAiUHJveHktQ29ubmVjdGlvbjogY2xvc2UiIGNsb3NlIHRoZSBjdXJyZW50IHByb3h5IGNvbm5lY3Rpb24sIGFzIFJvbWFuCiAgS29pZm1hbiBmb3VuZCBvdXQuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA0KQotIEZpeGVkIGEgZ2V0ZGF0ZSBwcm9ibGVtIGJ5IHBvc3QtcmVwbGFjaW5nIHRoZSBnZXRkYXRlLmMgZmlsZSBhZnRlciB0aGUKICBiaXNvbi95YWNjIHByb2Nlc3MgdG8gYWRkIHRoZSBmaXggSGFyc2hhbCBQcmFkaGFuIHN1Z2dlc3RlZC4gVGhlIHByb2JsZW0KICBjYXVzZWQgYSBjcmFzaCBvbiBXaW5kb3dzIHdoZW4gcGFyc2luZyBzb21lIGRhdGVzLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwNCkKLSBSb21hbiBLb2lmbWFuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBzZW5kIEV4cGVjdDogMTAwLWNvbnRpbnVlIG9uIFBPU1RzCiAgZXZlbiB3aGVuIHRvbGQgdG8gdXNlIEhUVFAgMS4wLCB3aGljaCBpcyBub3QgY29ycmVjdC4gVGVzdCBjYXNlIDE4MCBhbmQKICAxODEgdmVyaWZ5IHRoaXMuCgotIEFkZGVkIHRlc3QgY2FzZSAxODIgdG8gdmVyaWZ5IHRoYXQgemVybyBieXRlIHRyYW5zZmVycyBjYWxsIHRoZSBjYWxsYmFjawogIHByb3Blcmx5LgoKRGFuaWVsICgyMCBBdWd1c3QgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSB3cml0ZSBjYWxsYmFjayBnZXQgY2FsbGVkIGV2ZW4gd2hlbiBhIHplcm8KICBieXRlIGZpbGUgaXMgZG93bmxvYWRlZC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDQpCi0gTGluZyBUaGlvIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IElQdjYtZW5hYmxlZCwgaXQgc3RpbGwgZGlkCiAgcmV2ZXJzZSBETlMgbG9va3VwcyB3aGVuIGZlZCB3aXRoIGEgbnVtZXJpY2FsIElQLWFkZHJlc3MgKGxpa2UKICBodHRwOi8vMTI3LjAuMC4xLyksIGFsdGhvdWdoIGl0IGRvZXNuJ3Qgd2hlbiBidWlsdCBJUHY2LWRpc2FibGVkLiBsaWJjdXJsCiAgc2hvdWxkIG5ldmVyIGRvIHJldmVyc2UgbG9va3Vwcy4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDQpCi0gS2pldGlsIEphY29ic2VuIG5vdGljZWQgdGhhdCB3aGVuIHRyYW5zZmVycmluZyBhIGZpbGU6Ly8gVVJMIHBvaW50aW5nIHRvIGFuCiAgZW1wdHkgZmlsZSwgbGliY3VybCB3b3VsZCByZXR1cm4gd2l0aCB0aGUgZmlsZSBzdGlsbCBvcGVuLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGRlZmluZQogIF9USFJFQURfU0FGRSBmb3IgQUlYIHN5c3RlbXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWx0IHJlYWxseSB0aHJlYWQtc2FmZS4KCiAgQWxzbyBhZGRlZCBhIGNoZWNrIGZvciB0aGUgeGxjIGNvbXBpbGVyIG9uIEFJWCwgYW5kIGlmIHRoYXQgaXMgZGV0ZWN0IHdlIHVzZQogIHRoZSAtcXRocmVhZGVkIGNvbXBpbGVyIG9wdGlvbgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwNCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgYSBjdXN0b20gIkFjY2VwdC1FbmNvZGluZzoiIGhlYWRlciBvdmVycmlkZSB0aGUKICBpbnRlcm5hbGx5IHNldCBvbmUgdGhhdCBnZXRzIHNldCB3aXRoIENVUkxPUFRfRU5DT0RJTkcuIFBvaW50ZWQgb3V0IGJ5IEFsZXguCgotIFJvbGFuZCBLcmlrYXZhIGZvdW5kIGFuZCBmaXhlZCBhIGNvb2tpZSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSAodGhlCiAgcGF0aCBtYXRjaGluZyB3YXMgd3JvbmcpLiBJIGFkZGVkIHRlc3QgY2FzZSAxNzkgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvCiAgcmlnaHQuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDA0KQotIENhc2V5IE8nRG9ubmVsbCBmaXhlZCBzb21lIE1TVkMgbWFrZWZpbGUgdGFyZ2V0cyB0byBsaW5rIHByb3Blcmx5LgoKRGFuaWVsICgxMSBBdWd1c3QgMjAwNCkKLSBjb25maWd1cmUgbm93IGRlZmluZXMgX1hPUEVOX1NPVVJDRSB0byA1MDAgb24gc3lzdGVtcyB0aGF0IG5lZWQgaXQgdG8gYnVpbGQKICB3YXJuaW5nLWZyZWUgKHRoZSBvbmx5IGtub3duIG9uZSBzbyBmYXIgaXMgbm9uLWdjYyBidWlsZHMgb24gNjRiaXQgU0dJCiAgSVJJWCkuIChSZXZlcnRlZCB0aGlzIGNoYW5nZSBsYXRlciBhcyBpdCBjYXVzZWQgY29tcGlsZXIgZXJyb3JzLikKCi0gdGhlIEZUUCBjb2RlIG5vdyBpbmNsdWRlcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlCiAgc2VydmVyIGdpdmVzIGJhY2sgYSA1MzAgYWZ0ZXIgdGhlIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBhcyBpdCBpc24ndAogIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGEgYmFkIHVzZXIgbmFtZSBvciBwYXNzd29yZC4KClZlcnNpb24gNy4xMi4xICgxMCBBdWd1c3QgMjAwNCkKCkRhbmllbCAoMTAgQXVndXN0IDIwMDQpCi0gSW4gT3BlblNTTCAwLjkuN2QgYW5kIGVhcmxpZXIsIEFTTjFfU1RSSU5HX3RvX1VURjggZmFpbHMgaWYgdGhlIGlucHV0IGlzCiAgYWxyZWFkeSBVVEYtOCBlbmNvZGVkLiBUaGlzIG1hZGUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsIGlmIHRoZQogIHJlbW90ZSBzZXJ2ZXIgdXNlZCBhIGNlcnRpZmljYXRlIHdpdGggdGhlIG5hbWUgVVRGLTggZW5jb2RlZC4KCiAgV29yay1hcm91bmQgYnJvdWdodCBieSBBbGV4aXMgUy4gTC4gQ2FydmFsaG8uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDQpCi0gSSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3Iga3JiNCB0byB1c2UgLWxjb21fZXJyIGFzIHdlbGwsIGFzIEkgc3RhcnRlZAogIHRvIGdldCBsaW5rIHByb2JsZW1zIHdpdGggaXQgdW5sZXNzIEkgZGlkIHRoYXQgb24gbXkgU29sYXJpcyAyLjcgYm94LiBJCiAgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgSSBzdGFydGVkIHRvIGdldCBwcm9ibGVtcyB3aXRoIHRoaXMgbm93IQoKRGFuaWVsICg1IEF1Z3VzdCAyMDA0KQotIEVucmljbyBTY2hvbHogZml4ZWQgdGhlIEhUVFAtTmVnb3RpYXRlIHNlcnZpY2UgbmFtZSB0byBiZSB1cHBlcmNhc2UgYXMKICByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMDA0MTA1CgpEYW5pZWwgKDQgQXVndXN0IDIwMDQpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0CiAgdXNpbmcgbXVsdGlwbGUgSVAgKGJhZCkgYWRkcmVzc2VzLgoKLSBEeWxhbiBTYWxpc2J1cnkgbWFkZSBsaWJjdXJsIG5vIGxvbmdlciBhY2NlcHQgY29va2llcyBzZXQgdG8gYSBUTEQgb25seSAoaXQKICBwcmV2aW91c2x5IGFsbG93ZWQgdGhhdCBvbiB0aGUgc2V2ZW4gdGhyZWUtbGV0dGVyIGRvbWFpbnMpLgoKRGFuaWVsICgzMSBKdWx5IDIwMDQpCi0gSm9lbCBDaGVuIHJlcG9ydGVkIHRoYXQgdGhlIGRpZ2VzdCBjb2RlIGFzc3VtZWQgcXVvdGVzIGFyb3VuZCB0aGUgY29udGVudHMgYQogIGJpdCB0b28gbXVjaC4KCkRhbmllbCAoMjggSnVseSAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRoZSBob3N0IG5hbWUgdG8gZ2V0IHNldHVwIHByb3Blcmx5IGV2ZW4gd2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkLCB3aGVuIGEgcHJveHkgaXMgaW4gdXNlLiBQcmV2aW91c2x5IHRoZSB3cm9uZyBIb3N0OgogIGhlYWRlciBjb3VsZCBnZXQgc2VudCB3aGVuIHJlLXVzaW5nIGEgcHJveHkgY29ubmVjdGlvbiB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKLSBGaXhlZCBCcmlhbiBBa2lucycgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCBkdXBsaWNhdGUgSG9zdDogaGVhZGVycyBvbiByZS11c2VkCiAgY29ubmVjdGlvbnMuIElmIHlvdSBhdHRlbXB0ZWQgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGluIHRoZSBzZWNvbmQKICByZXF1ZXN0LCB5b3UgZ290IHR3byBzdWNoIGhlYWRlcnMhCgotIHNyYy9NYWtlZmlsZS5hbSBub3cgaW5jbHVkZXMgdGhlIE1ha2VmaWxlLmluYyBmaWxlIHRvIGdldCBpbmZvIGFib3V0IGZpbGVzCgpEYW5pZWwgKDI2IEp1bHkgMjAwNCkKLSBNYWRlICJjdXJsIFtVUkxdIC1vIG5hbWUjMiIgd29yayBhcyBleHBlY3RlZC4gSWYgdGhlcmUncyBubyBnbG9iYmluZyBmb3IgdGhlCiAgIy1udW1iZXIsIGl0IHdpbGwgc2ltcGx5IGJlIHVzZWQgYXMgIzIgaW4gdGhlIGZpbGUgbmFtZS4KCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGVzdGluZyB3aXRoIHZhbGdyaW5kIDIuMS54IGFuZCBhZGRlZCB0d28gbWlzc2luZwogIG5ld2xpbmVzIGluIHRoZSBjb29raWUgaW5mb3JtYXRpb25hbHMuCgpEYW5pZWwgKDI0IEp1bHkgMjAwNCkKLSBJIGZpeGVkIHRoZSBhdXRvYnVpbGRzIHdpdGggYXJlcywgc2luY2UgdGhleSBub3cgbmVlZCB0byBoYXZlIGJ1aWxkY29uZiBydW4KICBpbiB0aGUgYXJlcyBkaXIgYmVmb3JlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bi4KCi0gQWRkZWQgQ2FzZXkgTydEb25uZWxsJ3MgY3VybF9lYXN5X3Jlc2V0KCkgZnVuY3Rpb24uIEl0IGhhcyBhIHByb3RvIGluCiAgY3VybC9jdXJsLmggYnV0IHdlIGhhdmUgbm8gbWFuIHBhZ2UgeWV0LgoKRGFuaWVsICgyMCBKdWx5IDIwMDQpCi0gQWRkZWQgYnVpbGRjb25mIGFuZCBidWlsZGNvbmYuYmF0IHRvIHRoZSByZWxlYXNlIGFyY2hpdmVzLCBzaW5jZSB0aGV5IGFyZQogIGhhbmR5IGZvciByZWJ1aWxkaW5nIGN1cmwgd2hlbiB1c2luZyBhIGRhaWx5IHNuYXBzaG90IChhbmQgbm90IGEgcHVyZSBDVlMKICBjaGVja291dCkuCgpEYW5pZWwgKDE2IEp1bHkgMjAwNCkKLSBBcyBzdWdnZXN0ZWQgYnkgVG9ieSBQZXRlcnNvbiwgbGliY3VybCBub3cgaWdub3JlcyBDb250ZW50LUxlbmd0aCBkYXRhIGlmIHRoZQogIGdpdmVuIHNpemUgaXMgYSBuZWdhdGl2ZSBudW1iZXIuIFRlc3QgY2FzZSAxNzggdmVyaWZpZXMgdGhpcy4KCkRhbmllbCAoMTQgSnVseSAyMDA0KQotIEf8bnRlciBLbmF1ZiBoYXMgbWFkZSB0aGUgTmV0d2FyZSBidWlsZHMgZG8gd2l0aG91dCB0aGUgY29uZmlnLW5ldHdhcmUuaAogIGZpbGVzLCBzbyB0aGV5IGFyZSBub3cgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0IHBhY2thZ2VzLgoKLSBH/G50ZXIgS25hdWYgbWFkZSBjdXJsIGFuZCBsaWJjdXJsIGJ1aWxkIHdpdGggQm9ybGFuZCBhZ2Fpbi4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCB0aGUgY29tbW9uIHRlc3QgNTA1IGZhaWx1cmVzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDYgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgd2luZG93cyB0ZXN0cyBmYWlsZWQgb24gZmlsZTovLyAidXBsb2FkcyIuCgpEYW5pZWwgKDIgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgcmVwb3J0ZWQgYSBjdXJsX3NoYXJlX2NsZWFudXAoKSBjcmFzaCB0aGF0IG9jY3VycyB3aGVuIG5vCiAgbG9jay91bmxvY2sgY2FsbGJhY2tzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBzaGFyZSBpcyBjbGVhbmVkIHVwLgoKRGFuaWVsICgxIEp1bHkgMjAwNCkKLSBXaGVuIHVzaW5nIGN1cmwgLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpLCBubyB0cmFjZSBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudAogIGJ5IGN1cmxfZWFzeV9jbGVhbnVwKCkgd2VyZSBpbmNsdWRlZCBpbiB0aGUgdHJhY2UgZmlsZS4gVGhpcyBtYWRlIHRoZQogIG1lc3NhZ2UgIkNsb3NpbmcgY29ubmVjdGlvbiAjMCIgbmV2ZXIgYXBwZWFyIGluIHRyYWNlIGR1bXBzLgoKRGFuaWVsICgzMCBKdW5lIDIwMDQpCi0gTmllbHMgdmFuIFRvbmdlcmVuIGZvdW5kIHRoYXQgc2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGRvZXNuJ3QgZGlzYWJsZQogIGEgcHJldmlvdXNseSBzZXQgUE9TVCByZXF1ZXN0LCBtYWtpbmcgYSB2ZXJ5IG9kZCByZXF1ZXN0IGdldCBzZW50ICh1bmxlc3MKICB5b3UgZGlzYWJsZWQgdGhlIFBPU1QpIGEgSEVBRCByZXF1ZXN0IHdpdGggYSBQT1NUIHJlcXVlc3QtYm9keS4gSSd2ZSBub3cKICBtYWRlIENVUkxPUFRfTk9CT0RZIGVuZm9yY2UgYSBwcm9wZXIgSEVBRC4gQWRkZWQgdGVzdCBjYXNlIDUxNCBmb3IgdGhpcy4KCkRhbmllbCAoMjkgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBtYWRlIHRoZSB0ZXN0Y3VybC5wbCBzY3JpcHQgY2FwYWJsZSBvZiB1c2luZyBhIGN1c3RvbSBzZXR1cAogIGZpbGUgdG8gZWFzaWVyIHJ1biBtdWx0aXBsZSBhdXRvYnVpbGRzIG9uIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgoKLSBHaXNsZSBmaXhlZCB0aGUgZGpncHAgYnVpbGQgYW5kIGZpeGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gc29tZSBvZiB0aGUKICByZW9yZ2VkIG5hbWUgcmVzb2x2ZWQgY29kZS4KCi0gRml4ZWQgY29kZSB0byBhbGxvdyBjb25uZWN0cyBkb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gYXR0ZW1wdCB0aGUKICBuZXh0IElQIHdoZW4gY29ubmVjdGluZyB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0byBtdWx0aXBsZSBJUHMgYW5kIGEKICBjb25uZWN0IGF0dGVtcHQgZmFpbHMuCgpEYW5pZWwgKDI3IEp1bmUgMjAwNCkKLSBCYXNlZCBvbiBSb2IgU3RhbnplbCdzIGJ1ZyByZXBvcnQgIzk3OTQ4MCwgSSB3cm90ZSBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHBvbGwoKSBjYW4gYmUgdXNlZCB0byB3YWl0IG9uIE5VTEwgYXMgb3RoZXJ3aXNlIHNlbGVjdCgpIHNob3VsZCBiZQogIHVzZWQgdG8gZG8gaXQuIFRoZSBzZWxlY3QoKSB1c2FnZSB3YXMgYWxzbyBmaXhlZCBhY2NvcmRpbmcgdG8gaGlzIHJlcG9ydC4KCiAgTWFjIE9TIFggMTAuMyBzYXlzICJwb2xsKCkgZnVuY3Rpb25hbGl0eSBmb3IgTWFjIE9TIFggaXMgaW1wbGVtZW50ZWQgdmlhIGFuCiAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBzZWxlY3QoKSwgbm90IGluIHRoZSBrZXJuZWwgZGlyZWN0bHkuIEl0IGlzCiAgcmVjb21tZW5kZWQgdGhhdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIE9TIFggMTAuMyBwcmVmZXIgc2VsZWN0KCkgb3ZlcgogIHBvbGwoKS4gQ29uZmlndXJlIHNjcmlwdHMgc2hvdWxkIGxvb2sgZm9yIHRoZSBfUE9MTF9FTVVMX0hfIGRlZmluZSAoaW5zdGVhZAogIG9mIF9QT0xMX0hfIG9yIF9TWVNfUE9MTF9IXykgYW5kIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBwb2xsIGlzIG5vdAogIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwuIgoKICBZZXMsIHdlIGNhbiBwcm9iYWJseSB1c2Ugc2VsZWN0KCkgb24gbW9zdCBwbGF0Zm9ybXMgYnV0IHRvZGF5IEkgcHJlZmVyZWQgdG8KICBsZWF2ZSB0aGUgY29kZSB1bmFsdGVyZWQuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNCkKLSBUaGUgc3RhbmRhcmQgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBvbmx5IGluY2x1ZGVzIHZlcnNpb24gaW5mbyBhYm91dAogIGludm9sdmVkIGxpYnJhcmllcyBhbmQgbm90IGFib3V0IHBhcnRpY3VsYXIgZmVhdHVyZXMuIFRodXMgaXQgd2lsbCBubyBsb25nZXIKICBpbmNsdWRlIGluZm8gYWJvdXQgSVB2NiBub3IgR1NTLiBUaGF0IGluZm8gaXMgb2YgY291cnNlIHN0aWxsIGF2YWlsYWJsZSBpbgogIHRoZSBmZWF0dXJlIGJpdG1hc2sgY3VybF92ZXJzaW9uX2luZm8oKSBvZmZlcnMuCgotIFJlcGxhY2VkIGFsbCBvY2N1cmFuY2VzIG9mIHNwcmludGYoKSB3aXRoIHNucHJpbnRmKCkuIFRoaXMgaXMgbW9zdGx5IGJlY2F1c2UKICBpdCBpcyAiQSBHb29kIFRoaW5nIiByYXRoZXIgdGhhbiBhY3R1YWxseSBmaXhpbmcgYW55IGtub3duIHByb2JsZW0uIFRoaXMKICB3aWxsIGhlbHAgcHJldmVudGluZyBmdXR1cmUgcG9zc2libGUgbWlzdGFrZXMgdG8gY2F1c2UgYnVmZmVyIG92ZXJmbG93cy4KCi0gTWFqb3IgcmVvcmdhbml6YXRpb24gaW4gdGhlIGhvc3QgcmVzb2x2ZSBjb2RlIChhZ2FpbikuIFRoaXMgdGltZSwgSSd2ZQogIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdyBhbHdheXMgdXNlIGEgbGlua2VkIGxpc3Qgb2YgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzCiAgdG8gcmV0dXJuIHJlc29sdmVkIGluZm8gaW4sIG5vIG1hdHRlciB3aGF0IHJlc29sdmVyIG1ldGhvZCBvciBzdXBwb3J0IHRoYXQKICBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLiBJdCBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gd3JpdGUgY29kZSB0aGF0CiAgdXNlcyBvciBkZXBlbmRzIG9uIHJlc29sdmVkIGRhdGEuCgogIEludGVybmFsbHksIHRoaXMgbWVhbnMgYW1vbmdzdCBvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4gc3RvcCBkb2luZyB0aGUgd2VpcmQKICAiaW5jcmVhc2UgYnVmZmVyIHNpemUgdW50aWwgaXQgd29ya3MiIHRyaWNrIHdoZW4gcmVzb2x2aW5nIGhvc3RzIG9uCiAgSVB2NC1vbmx5IHdpdGggZ2V0aG9zdGJ5bmFtZV9yKCksIHdlIHN1cHBvcnQgc29ja3MgZXZlbiBvbiBsaWJjdXJscyBidWlsdAogIHdpdGggSVB2NiBlbmFibGVkIChidXQgb25seSB0byBzb2NrcyBzZXJ2ZXJzIHRoYXQgcmVzb2x2ZSB0byBhbiBJUHY0CiAgYWRkcmVzcykgYW5kIHdlIG5vIGxvbmdlciBkZWVwLWNvcHkgb3IgcmVsb2NhdGUgaG9zdGVudCBzdHJ1Y3RzICh3ZSBjcmVhdGUKICBDdXJsX2FkZHJpbmZvIGNoYWlucyBpbnN0ZWFkKS4KCiAgVGhlIG5ldyAiaG9zdGVudCB0byBDdXJsX2FkZHJpbmZvIiBjb252ZXJ0ZXIgZnVuY3Rpb24gaXMgbmFtZWQgQ3VybF9oZTJhaSgpCiAgYW5kIGlzIHNsaWdodGx5IG5haXZlIGFuZCBzaW1wbGUsIHlldCBJIGJlbGlldmUgaXQgaXMgZnVuY3Rpb25hbCBlbm91Z2ggdG8KICB3b3JrIGZvciBsaWJjdXJsLgoKRGFuaWVsICgyMiBKdW5lIDIwMDQpCi0gRGF2aWQgQ29oZW4gcG9pbnRlZCBvdXQgdGhhdCBSRkMyMTA5IHNheXMgY2xpZW50cyBzaG91bGQgYWxsb3cgY29va2llcyB0bwogIGNvbnRhaW4gbGVhc3QgNDA5NiBieXRlcyB3aGlsZSBsaWJjdXJsIG9ubHkgYWxsb3dlZCAyMDQ3LiBJIHJhaXNlZCB0aGUgbGltaXQKICB0byA0OTk5IG5vdyBhbmQgbWFkZSB0aGUgdXNlZCBidWZmZXIgZ2V0IG1hbGxvYygpZWQgaW5zdGVhZCBvZiBzaW1wbHkKICBhbGxvY2F0ZWQgb24gc3RhY2sgYXMgYmVmb3JlLiBFeHRlbmRlZCB0ZXN0IGNhc2UgNDYgdG8gaW5jbHVkZSBhIGNvb2tpZSB3aXRoCiAgdmVyeSBodWdlIGNvbnRlbnQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBnZXRkYXRlLnkgdG8gcmVtb3ZlIGEgZmV3IHdhcm5pbmdzLiBJIHJlbW92ZWQgdGhlCiAgaWZkZWYnZWQgdGVzdCB3ZSBuZXZlciBldmVyIHVzZSBhbnl3YXkuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBjaGVja3MgdG8gc3VwcG9ydCBhICcqJy1sZXR0ZXIKICBhbnl3aGVyZSBpbiB0aGUgd2lsZGNhcmQgc3RyaW5nLCBzdXBwb3J0IG11bHRpcGxlICcqJy1sZXR0ZXJzIGluIHRoZQogIHdpbGRjYXJkIGFuZCB0byBhbGxvdyB0aGUgJyonLWxldHRlciB0byBtYXRjaCBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGEgZG90LgoKRGFuaWVsICgyMSBKdW5lIDIwMDQpCi0gdGVzdGN1cmwuc2ggaXMgbm93IHJlbW92ZWQgY29tcGxldGVseSwgdGVzdHMvdGVzdGN1cmwucGwgaXMgdGhlIHNjcmlwdCB0bwogIHVzZSB3aGVuIGF1dG9idWlsZGluZyBjdXJsIQoKLSBLamV0aWwgSmFjb2JzZW4gYnJvdWdodCBteSBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90IHByb3Blcmx5CiAgYWJvcnQgYW4gdXBsb2FkIHdpdGggdGhlIHJlYWRmdW5jdGlvbiBjYWxsYmFjaywgc2luY2UgcmV0dXJuaW5nIDAgb3IgLTEgb25seQogIHN0b3BzIHRoZSB1cGxvYWQgYW5kIGxpYmN1cmwgd2lsbCBjb250aW51ZSB3YWl0aW5nIGZvciBkb3dubG9hZGVkIGRhdGEgYW5kCiAgdGhlIHNlcnZlciBvZnRlbiB3YWl0cyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVwbG9hZCBkYXRhIHRvIGFycml2ZS4KCiAgVGh1cywgSSd2ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgZm9yIHJlYWQgY2FsbGJhY2tzIHRvIHJldHVybgogIENVUkxfUkVBREZVTkNfQUJPUlQgdG8gYWJvcnQgYW4gdXBsb2FkIGZyb20gYSByZWFkIGNhbGxiYWNrLiBUaGlzIHdpbGwgc3RvcAogIHRoZSB0cmFuc2ZlciBpbW1lZGlhdGVseSB3aXRoIGEgQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyByZXR1cm4gY29kZS4KCiAgVGVzdCBjYXNlIDUxMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgaXQgd29ya3MuIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3QKICBIVFRQIHNlcnZlciB0b28gdG8gZHVtcCB0aGUgcmVxdWVzdCB0byBhIGZpbGUgZXZlbiB3aGVuIHRoZSBjbGllbnQKICBkaXNjb25uZWN0cyBwcmVtYXR1cmVseS4KCkRhbmllbCAoMTkgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHByb3ZpZGVkIGEgdGVzdCBjYXNlIHdpdGggYSBmYWlsaW5nIGN1cmwgb3BlcmF0aW9uOiB3aGVuIHdlIFBPU1QKICB0byBhIHNpdGUgd2l0aCAtLWRpZ2VzdCAob3Igc2ltaWxhcikgc2V0LCBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIDMwMgogIExvY2F0aW9uOiB0byB0aGUgImF1dGhwcm9iZSIgcmVxdWVzdCwgaXQgd2FzIG5vdCB0cmVhdGVkIGNvcnJlY3RseS4gV2Ugc3RpbGwKICB3aWxsIGJlaGF2ZSBiYWRseSBpZiBGT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkIGZvciB0aGlzIGNhc2UsIGJ1dCBJJ20gbm90CiAgaW4gdGhlIG1vb2QgdG8gZGl2ZSBpbnRvIHRoaXMgcmlnaHQgbm93IGFuZCB3aWxsIGxlYXZlIGl0IGFzLWlzIGZvciBub3cuCiAgVmVyaWZpZWQgbXkgZml4IHdpdGggdGVzdCBjYXNlIDE3Ny4KCkRhbmllbCAoMTggSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBwcm92aWRlcyBtb3JlIGRldGFpbHMgZnJvbSB0aGUgU1NMIGxheWVycyAoaWYgeW91CiAgdXNlIGFuIE9wZW5TU0wgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0KS4gSXQgYWxzbyBpbnRyb2R1Y2VzIHR3byBuZXcgdHlwZXMKICBvZiBkYXRhIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIGRlYnVnIGNhbGxiYWNrOiBDVVJMSU5GT19TU0xfREFUQV9JTiBhbmQKICBDVVJMSU5GT19TU0xfREFUQV9PVVQuCgotIFdpdGggRGF2aWQgQnlyb24ncyB0ZXN0IHNlcnZlciBJIGNvdWxkIHJlcGVhdCBoaXMgcHJvYmxlbSBhbmQgbWFrZSBzdXJlIHRoYXQKICBQT1NUaW5nIG92ZXIgSFRUUFM6Ly8gd2l0aCBOVExNIHdvcmtzIGZpbmUgbm93LiBUaGVyZSB3YXMgYSBnZW5lcmFsIHByb2JsZW0KICB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gd2l0aCBub24tR0VUIG9wZXJhdGlvbnMgd2l0aCBDT05ORUNULgoKRGFuaWVsICgxNiBKdW5lIDIwMDQpCi0gTW9kaWZpZWQgdG8ga2VlcCB0aGUgdXBsb2FkIGJ5dGUgY291bnRlciBpbiBhbiBjdXJsX29mZl90LCBub3QgYW4gaW50IGFzCiAgYmVmb3JlLiAzMmJpdHMgaXMgbm90IGVub3VnaC4gVGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgYnVnIEplYW4tTG91aXMgTGVtYWlyZQogIHJlcG9ydGVkIHRoYXQgbWFrZXMgMkdCIEZUUCB1cGxvYWRzIHRvIHJlcG9ydCBlcnJvciAoInVuYWxpZ25lZCBmaWxlIHNpemVzIikKICB3aGVuIGNvbXBsZXRlZC4KCkRhbmllbCAoMTUgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGF0IEkgZml4ZWQ6IGlmIHlvdSBkaWQgYSBQT1NUIHdpdGgKICBDVVJMQVVUSF9ESUdFU1Qgc2V0IGJ1dCB0aGUgc2VydmVyIGRpZG4ndCByZXF1aXJlIGFueSBhdXRoZW50aWNhdGlvbiwKICBsaWJjdXJsIHdvdWxkIHJlcGVhdGVkbHkgc2VuZCBIRUFEIGxvdHMgb2YgdGltZXMgdW50aWwgaXQgZ2l2ZXMgdXAuIFRoaXMgd2FzCiAgYWN0dWFsbHkgdGhlIGNhc2UgZm9yIGFsbCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9ucy4gQWRkZWQgdGVzdCBjYXNlIDE3NCwKICAxNzUgYW5kIDE3NiB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgSnVuZSAyMDA0KQotIE11bHRpcGFydCBmb3JtcG9zdHMgdXBsb2FkaW5nIGZpbGVzIG5vIGxvbmdlciBpbnNlcnRzIHRoZSBmaWxlcyB0aGVtc2VsdmVzCiAgaW50byB0aGUgaHVnZSBwcmVidWlsdCBjaHVuay4gVGhpcyBlbmFibGVzIGxpYmN1cmwgdG8gZm9ybXBvc3QgZmlsZXMgdGhhdCBpcwogIGxhcmdlciB0aGFuIHRoZSBhbW91bnQgb2Ygc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGUgZmlsZSBnaXZlbiBpcyBwYXNzZWQgb24KICBzdGRpbiwgbGliY3VybCBzdGlsbCB1c2VzIHRoZSBvbGQgbWV0aG9kIG9mIHJlYWRpbmcgdGhlIGZ1bGwgZmlsbCBiZWZvcmUgdGhlCiAgdXBsb2FkIHRha2VzIHBsYWNlLiBUaGlzIGFwcHJvYWNoIHdhcyBzZWxlY3RlZCBpbiBvcmRlciB0byBub3QgYWx0ZXIgdGhlCiAgYmVoYXZpb3IgZm9yIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgYXMgd2hlbiB1c2luZyBzdGRpbiBsaWJjdXJsIGNhbid0IGtub3cKICB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgb24KICBIVFRQIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICgxMyBKdW5lIDIwMDQpCi0gR2lzbGUgZm91bmQgb3V0IHRoYXQgd2UgZGlkIHdpbGRjYXJkIGNlcnQgbmFtZSBjaGVja3Mgd3JvbmcsIHNvIHRoYXQgcGFydHMKICBvZiB0aGUgY2hlY2sgd3JvbmdseSB3YXMgY2FzZSBzZW5zaXRpdmUuCgpEYW5pZWwgKDExIEp1bmUgMjAwNCkKLSBUaW0gU25lZGRvbiBicm91Z2h0IGEgbWlub3IgVk1TIGZpeCB0byBtYWtlIGN1cmwgYnVpbGQgcHJvcGVybHkgb24gaGlzIFZNUwogIG1hY2hpbmUuIEhlIGFsc28gaGFkIHNvbWUgaW50ZXJlc3RpbmcgbGliY3VybCBwYXRjaGVzLi4uIHRoZXkgbWlnaHQgYmUgYWJsZQogIHRvIGRvIGluIGEgc2xpZ2h0bHkgbmljZXIgd2F5LiBEaXNjdXNzaW9ucyBhcmUgaW4gcHJvZ3Jlc3MuCgpEYW5pZWwgKDEwIEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNvZGUgY2xlYW51cHNtIGJldHRlciB2ZXJib3NlIG91dHB1dCBhbmQgYmV0dGVyIGNvbm5lY3QKICB0aW1lb3V0IGhhbmRsaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzLgoKLSBTdGV2ZW4gQmF6eWwgYW5kIFNlc2h1YmFidSBQYXNhbSBwb2ludGVkIG91dCBhIGJ1ZyBvbiB3aW4zMiB3aGVuIGZyZWVpbmcgdGhlCiAgcGF0aCBhZnRlciBhIGZpbGU6Ly8gdHJhbnNmZXIuCgpEYW5pZWwgKDkgSnVuZSAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgJ2NvbmZpZ3VyZSAtLWRpc2FibGUtaHR0cCcgd29yayB0byBidWlsZCBsaWJjdXJsCiAgd2l0aG91dCBIVFRQIHN1cHBvcnQuIEkgYWRkZWQgYSBuZXcgcmV0dXJuIGNvZGUgZm9yIGN1cmxfZm9ybWFkZCgpIGluIGNhc2UKICBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlOiBDVVJMX0ZPUk1BRERfRElTQUJMRUQuCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmaWxlIGluIHRoZSBnZW5lcmF0ZWQKICBjdXJsbGliLmRzcCBmaWxlLCBhbmQgbm93IHBlb3BsZSBidWlsZGluZyB3aXRoIHRoaXMgc2hvdWxkIGdldCBhIGxpYmN1cmwubGliCiAgZmlsZSBnZW5lcmF0ZWQgYXMgaXQgdXNlZCB0byBkbyBiZWZvcmUgd2UgZ2VuZXJhdGVkIHRoaXMgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDQpCi0gTWFydHkgS3VocnQgZml4ZWQgYSBtaW5vciBidWlsZCBwcm9ibGVtIGZvciBWTVMuCgpEYW5pZWwgKDcgSnVuZSAyMDA0KQotIFJldmVydGVkIHRoZSBjb25maWd1cmUgY2hlY2sgZnJvbSB0aGUgNHRoIHNpbmNlIGl0IG9idmlvdXNseSBkaWRuJ3Qgd29yay4KICBSZW1hZGUgaXQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYXQgaG9wZWZ1bGx5IHdvcmtzIGJldHRlci4KCkRhbmllbCAoNCBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBOZXRXYXJlIGFnYWluLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgY2hlY2tzIGZvciBzdHJlcnJvcl9yKCkgbm90IGV4aXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aGVuIGJ1aWx0IGZvciBjcm9zcy1jb21waWxpbmcuCgpEYW5pZWwgKDMgSnVuZSAyMDA0KQotIENocmlzIEdhdWtyb2dlciBwb2ludGVkIG91dCB0aGF0ICdtYWtlIHRlc3QnIGF0dGVtcHRzIHRvIHJ1biB0aGUgdGVzdHMgZXZlbgogIGlmIGN1cmwgaXMgYnVpbHQgY3Jvc3MtY29tcGlsZWQuIEkndmUgbm93IG1hZGUgaXQgb3V0cHV0IGEgc2hvcnQgbWVzc2FnZQogIGluc3RlYWQsIHNheWluZyBpdCBpc24ndCBwb3NzaWJsZSB0byBkby4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgYnJvdWdodCBGVFAgM3JkIHBhcnR5IHRyYW5zZmVyIHN1cHBvcnQgdG8gbGliY3VybC4KICBZb3UgY2FuIG5vdyB1c2UgbGliY3VybCB0byB0cmFuc2ZlciBmaWxlcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgdXNpbmcKICBGVFAuIFRoZXJlIGFyZSBhIGJ1bmNoIG9mIG5ldyBvcHRpb25zIHRvIGNvbnRyb2wgdGhpcyB3aXRoOgogICBDVVJMT1BUX1NPVVJDRV9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1VTRVJQV0QKICAgQ1VSTE9QVF9TT1VSQ0VfUEFUSAogICBDVVJMT1BUX1NPVVJDRV9QT1JUCiAgIENVUkxPUFRfUEFTVl9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1BSRVFVT1RFCiAgIENVUkxPUFRfU09VUkNFX1BPU1RRVU9URQoKICAoVGhleSBzdGlsbCByZW1haW4gdG8gYmUgZG9jdW1lbnRlZCBwcm9wZXJseSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4KICBwYWdlLikKCiAgV2hlbiB1c2luZyB0aGlzLCB0aGUgb3JkaW5hcnkgQ1VSTE9QVF9VUkwgc3BlY2lmaWVzIHRoZSB0YXJnZXQgVVJMLCBhbmQgeW91CiAgc3BlY2lmeSB0aGUgc291cmNlIGRhdGEgd2l0aCB0aGVzZSBhZGRpdGlvbmFsIG9wdGlvbnMuIGZ0cDNyZHBhcnR5LmMgaXMgYQogIG5ldyBleGFtcGxlIHNvdXJjZSBjb2RlIHNob3dpbmcgaG93IHRvIHVzZSB0aGlzLgoKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBwcm94eSB1c2VyIG5hbWUgYW5kCiAgcGFzc3dvcmQgd2hlbiBkb2luZyBwcm94eSBhdXRoZW50aWNhdGlvbiwgaXQgcHJldmlvdXNseSBhbHdheXMgdXNlZCB0aGUgaG9zdAogIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQhCgpEYW5pZWwgKDIgSnVuZSAyMDA0KQotIENVUkxPUFRfVVBMT0FEIGFuZCBDVVJMT1BUX1BVVCBub3cgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgaW50ZXJuYWxseSwgd2hpY2gKICBmaXhlcyBzb21lIG9sZCBjb25mdXNpb25zIG9uIHdoZW4gd2hpY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgYW5kIHdoYXQgdGhlCiAgZGlmZmVyZW5jZXMgYXJlLgoKLSBBcHBsaWVkIEdpc2xlJ3MgZml4ZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgd2l0aCBsY2Mtd2luMzIKClZlcnNpb24gNy4xMi4wICgyIEp1bmUgMjAwNCkKCkRhbmllbCAoMSBKdW5lIDIwMDQpCi0gSSBjbGFyaWZpZWQgdGhlIC0tY3JlYXRlLWRpcnMgb3B0aW9uIHNvbWV3aGF0IGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKLSBSZW5hdWQgRHVoYXV0IGNvcnJlY3RlZCB0aGUgY3VybF91bmVzY2FwZSBtYW4gcGFnZS4KCi0gRGF2aWQgQnlyb24gbW9kaWZpZWQgb25lIG9mIE1hc3NpbWlsaWFubyBaaWNjYXJkaSdzIHJlY2VudCBNU1ZDIG1ha2VmaWxlCiAgY2hhbmdlcyB0byBub3cgYWdhaW4gdXNlIHRoZSBtbSBsaWIgYnkgZGVmYXVsdC4KCkRhbmllbCAoMjYgTWF5IDIwMDQpCi0gTW9odW4gQmlzd2FzIGFkZGVkIHJlbGVhc2UtemxpYiBhbmQgZGVidWctemxpYiB0YXJnZXRzIHRvIHRoZSBNU1ZDIGxpYmN1cmwKICBNYWtlZmlsZQoKLSBEYXZpZCBCeXJvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIGRvaW5nIENPTk5FQ1QsCiAgbGlrZSB3aGVuIGFjY2Vzc2luZyBIVFRQUyBzaXRlcyB3aWh0IGEgcHJveHkuIFRoaXMgcHJvYmFibHkgYnJva2Ugd2hlbiBJCiAgcmV3cm90ZSB0aGUgYXV0aCBzdHVmZiByZWNlbnRseS4KCi0gSSBhZGRlZCBmaWxldXBsb2FkLmMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSwgc2hvd2luZyBob3cgYW4gdXBsb2FkIHRvIGEKICBmaWxlOi8vIFVSTCBpcyBtYWRlLgoKRGFuaWVsICgyNSBNYXkgMjAwNCkKLSBNYXNzaW1pbGlhbm8gWmljY2FyZGkgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMuCgpEYW5pZWwgKDI0IE1heSAyMDA0KQotIGxpYmN1cmwgbm93IHN1cHBvcnRzICJ1cGxvYWRpbmciIHRvIGZpbGU6Ly8gVVJMcy4gVGVzdCAyMDQgYW5kIDIwNSB3ZXJlCiAgYWRkZWQgdG8gdmVyaWZ5LgoKLSBTaW1vbiBKb3NlZnNzb24gYWRkZWQgYSBpZG5fZnJlZSgpIGZ1bmN0aW9uIGluIGxpYmlkbiAwLjQuNSBhcyBhIHJlYWN0aW9uIHRvCiAgR2lzbGUncyBwcmV2aW91cyBtYWlsLiBXZSBub3cgdXNlIHRoaXMgZnVuY3Rpb24sIGFuZCB0aHVzIHdlIHJlcXVpcmUgbGliaWRuCiAgMC40LjUgb3IgbGF0ZXIuIE5vIGVhcmxpZXIgdmVyc2lvbiB3aWxsIGRvLgoKLSBSb2JlcnQgRC4gWW91bmcgcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NPT0tJRUZJTEUgYW5kIENVUkxPUFRfQ09PS0lFIGNvdWxkCiAgbm90IGJlIHVzZWQgYm90aCBpbiBvbmUgcmVxdWVzdC4gRml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSAxNzIgdG8gdmVyaWZ5LgoKRGFuaWVsICgyMSBNYXkgMjAwNCkKLSBXaGlsZSB0YWxraW5nIHRvIGhvc3QgYS5iLmMsIGxpYmN1cmwgZGlkIHdyb25nbHkgbm90IGFjY2VwdCBjb29raWVzIHRoYXQKICB3ZXJlIHNldCB0byB0aGUgZG9tYWluIC5hLmIuYyAodGhhdCBpcyB3aXRoIGEgZG90IHByZWZpeCkuIFRoaXMgaXMgbm93IGZpeGVkCiAgYW5kIHRlc3QgY2FzZSAxNzEgdmVyaWZpZXMgaXQuCgpEYW5pZWwgKDIwIE1heSAyMDA0KQotIEplc3NlIE5vbGxlciByZXBvcnRlZCB0aGF0IHRoZSB1cGxvYWQgc3BlZWQgaW5mbyByZXBvcnRlZCBieSBsaWJjdXJsIHdhcwogIHdyb25nLiBUaGUgc2FtZSB3YXMgdHJ1ZSBmb3IgdGhlIGRvd25sb2FkIHNwZWVkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDE5IE1heSAyMDA0KQotIERhdmlkIEJ5cm9uIGFkZGVkIHRlc3QgY2FzZSAxNzAgLSB0aGlzIHVzZWQgdG8gY3Jhc2ggdGhlIHByZXZpb3VzIHZlcnNpb24gb2YKICBjdXJsLgoKRGFuaWVsICgxNyBNYXkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB0aGF0IGFkZHJlc3NlcyB0d28gZmxhd3MgaW4gdGhlIHBlZXIgY2VydGlmaWNhdGUKICBuYW1lIHZlcmlmaWNhdGlvbjoKICBvIHdoZW4gbXVsdGlwbGUgY29tbW9uIG5hbWVzIGFyZSB1c2VkIChhcyBpbiB0aGUgY3VybCB0ZXN0cyksIHRoZSBsYXN0IG5hbWUKICAgIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgogIG8gYWxsb3cgY29tcGFyaW5nIHdpdGggZW5jb2RlZCB2YWx1ZXMsIGF0IGxlYXN0IHdpdGggQk1QIGFuZCBJU08gbGF0aW4xCiAgICBlbmNvZGVkIFQ2MXN0cmluZ3MuCgotIEFsbCAxOTEgdGVzdCBjYXNlcyBydW4gdGhyb3VnaCB0aGUgdG9ydHVyZSB0ZXN0IE9LISAnbWFrZSB0ZXN0LXRvcnR1cmUnIGlzCiAgbm93IGF2YWlsYWJsZSBpbiB0aGUgcm9vdCBtYWtlZmlsZSAob24gY29uZmlndXJlLWJhc2VkIGVudmlyb25tZW50cykuCgpEYW5pZWwgKDE0IE1heSAyMDA0KQotIFdpdGggYSBzbGlnaHRseSBtb2RpZmllZCBmdHBzZXJ2ZXIucGwgSSd2ZSBub3cgcnVuIGFsbW9zdCBhbGwgdGVzdHMgdGhyb3VnaAogIHdpdGggcnVudGVzdHMucGwgLXQuIFRoaXMgaXMgZ29vZG5lc3MhCgotIFNpbmNlIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBjb250YWN0IHRoZSBDVlMgYWRtaW5zIGZvciBzZXZlcmFsIG1vbnRocywgSSd2ZQogIGRlY2lkZWQgdGhhdCB0aGUgY3VycmVudCBDVlMgaG9zdGluZyB3YXMgbm90IGdvb2QgZW5vdWdoLiBJJ3ZlIG5vdyBtb3ZlZCB0aGUKICBDVlMgcmVwbyBvbmNlIGFnYWluLCBzZWUgUkVBRE1FIGZvciB1cGRhdGVkIGN2cyBjaGVja291dCBpbnN0cnVjdGlvbnMuCgpEYW5pZWwgKDEzIE1heSAyMDA0KQotIHJ1bnRlc3RzLnBsIC10IG5vdyBydW5zIGZpbmUgYWxsIHRoZSB3YXkgdG8gdGVzdCAxMDAuIEkgYmVsaWV2ZSB0ZXN0IGNhc2UKICAxMDAgZmFpbHMgYmVjYXVzZSBvZiBhbiBGVFAgc2VydmVyIHByb2JsZW0uCgpEYW5pZWwgKDEyIE1heSAyMDA0KQotIEdlbmVyYWwgY2xlYW51cHMgYWxsIG92ZXIgdG8gbWFrZSBsaWJjdXJsIHN1cnZpdmUgYW5kIGRvIHdlbGwgd2hlbiBhIG1lbW9yeQogIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gcnVudGVzdHMucGwgLXQgbm93IHdvcmtzIGZpbmUgZm9yIHRoZSBmaXJzdCAyNiB0ZXN0CiAgY2FzZXMuCgpEYW5pZWwgKDExIE1heSAyMDA0KQotIFNlc2h1YmFidSBQYXNhbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBjdXJsX2dsb2JhbF9pbml0X21lbSgpIC0KICBsaWtlIG5vcm1hbCBjdXJsX2dsb2JhbF9pbml0KCkgYnV0IGFsbG93cyB0aGUgYXBwIHRvIHJlcGxhY2UgYWxsIG1lbW9yeQogIGZ1bmN0aW9ucyB3aXRoIGl0cyBvd24gc2V0LiBJIG1vZGlmaWVkIGl0IHNsaWdodGx5LgoKLSBCYXNlZCBvbiBMdWNhIEFsdGVhcycgY29tbWVudHMsIEkgbW9kaWZpZWQgdGhlIGN1cmxsaWIuZHNwIGdlbmVyYXRpb24gY29kZS4KCkRhbmllbCAoMTAgTWF5IDIwMDQpCi0gR2lzbGUgbWFpbGVkIFNpbW9uIEpvc2Vmc3NvbiAob2YgbGliaWRuIGZhbWUpIGFib3V0IHRoZSBiZW5lZml0cyBvZiBhCiAgc2VwYXJhdGUgZnJlZSgpLWZ1bmN0aW9uIGJ5IHRoYXQgbGliIHRvIG1ha2Ugc3VyZSB0aGUgbWVtb3J5IGlzIGZyZWVkIGJ5IHRoZQogIHNhbWUgbWVtb3J5IHN1YnN5c3RlbSB0aGF0IGFsbG9jYXRlZCBpdC4gSGUgcmVzcG9uZGVkIHBvc2l0aXZlbHkgYW5kIHRoaXMKICB3aWxsIGxpa2VseSBjYXVzZSB1cyB0byByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJpZG4gYXMgc29vbiBhcyBTaW1vbgogIHJlbGVhc2VzIG9uZSB3aXRoIHN1Y2ggYSBsaWJpZG5fZnJlZSgpIGZ1bmN0aW9uLgoKLSBKYW1lcyBCdXJzYSBtYWRlIHJ1bnRlc3RzLnBsJ3MgLXQgb3B0aW9uIHdvcmsgZm9yIGFueSBnaXZlbiB0ZXN0IGNhc2UsIGFuZCBJCiAgZWRpdGVkIHRvIGFsbG93IC1nIHRvby4gTm90IGV2ZW4gdGVzdCBjYXNlIDEgd29ya2VkLi4uCgotIEx1Y2EgQWx0ZWEgbWFkZSB0aGUgbmM9IGZpZWxkIG5vdCB1c2UgcXVvdGVzIGluIG91dGdvaW5nIEhUVFAgRGlnZXN0IGhlYWRlcnMuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0IHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbCB0bwogIHJlY29nbml6ZSBvdXIgb3duIHJ1bm5pbmcgSFRUUCBzZXJ2ZXIuCgpEYW5pZWwgKDcgTWF5IDIwMDQpCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IHRvIGNvbmRlciBtYWxsb2MoMCkgYXJlYXMgT0sgdG8KICBmcmVlKCkgYW5kIGhlIG1hZGUgdHdvIGZhaWxlZC1yZXNvbHZlIGVycm9yIG1lc3NhZ2VzIHVzZSB0aGUgbmV3IGRpc3BsYXktCiAgbmFtZSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5LXVzZWQgbmFtZS4KCi0gR2lzbGUgVmFuZW0gdHJpZWQgY3VybCB3aXRoCiAgd3d3LmV0ZG9tZW5lbmF2bmthbm1ha3NpbWFsdGlubmVob2xkZXNla3N0aXRyZWJva3N0YXZlcnNsaWtzb21kZXR0ZS5jb20KICB3aGljaCBjYXVzZWQgcHJvYmxlbXMsIGFuZCBJIGZpeGVkIHRoZSBzaW5nbGUgemVybyBieXRlIGJ1ZmZlciBvdmVyd3JpdGUKICB0aGF0IG9jY3VycmVkIChkdWUgdG8gYSBzdHVwaWQgcHJvdG9jb2wgYnVmZmVyIHNpemUgYW5kIHBhcnNlcikuCgotIE1hZGUgdGhlIGxpYi9jdXJsbGliLmRzcCBmaWxlIGdldCBnZW5lcmF0ZWQgYXV0b21hdGljbHkgd2hlbiBhIGRpc3RyaWJ1dGlvbgogIHBhY2thZ2UgaXMgbWFkZSwgd2l0aCB0aGUgbXN2Y3Byb2ouKiBmaWxlcyBhcyB0ZW1wbGF0ZXMgYW5kIGFsbAogIHdpbjMyLXNvdXJjZXMgYWRkZWQuIEkgdGhpbmsgdGhpcyBjYW4gYmUgbWFkZSB0byB3b3JrIGJldHRlciB0aGFuIHRoZSBhbHdheXMKICBsYWdnaW5nLWJlaGluZCBwcmV2aW91cyBhcHByb2FjaC4gSSdtIG5vdCBzdXJlIHRoaXMgYnVpbGRzIGEgd29ya2luZyBwcm9qZWN0CiAgZmlsZSByaWdodCBub3cgdGhvdWdoIQoKRGFuaWVsICg2IE1heSAyMDA0KQotIE1pY2hhZWwgQmVuZWRpY3QgYnJvdWdodCBhIGZpeCB0aGF0IGZpbGxzIGluIHRoZSBlcnJvcmJ1ZmZlciBwcm9wZXJseSB3aGVuCiAgYXJlcyBmYWlscyB0byByZXNvbHZlIGEgbmFtZSBmb3IgYSBjYXNlIG5vdCBwcmV2aW91c2x5IGRlYWx0IHdpdGggbGlrZSB0aGlzLgoKRGFuaWVsICg1IE1heSAyMDA0KQotIEpvZSBIYWxwaW4gZml4ZWQgdGhlIGFubm95aW5nIHR5cGVjYXN0IHdhcm5pbmcgaW4gbGliL2xkYXAuYwoKLSBHaXNsZSBWYW5lbSBmaXhlczoKICBvIG1lbWRlYnVnIHRvIG5vdCBhY2Nlc3MgTlVMTCBvbiBzZXZlcmFsIHBsYWNlcwogIG8gbGliY3VybC5kZWY7IGN1cmxfZm9ybXBhcnNlIGlzIGdvbmUuCiAgbyBwcm9ncmVzcy5jOyBmaXhlZCB0aGUgcGVyY2VudCB2YWx1ZXMgYmVpbmcgdHJ1bmNlZCB0byAwLgogIG8gaWYyaXAuKjsgY29uc3RpZmllZCB0aGUgJ2ludGVyZmFjZScgYXJndW1lbnQuCgotIFRvciBBcm50c2VuIHJlcG9ydGVkIHRoYXQgbWFueSBvZiBoaXMgYXV0b2J1aWxkcyBmcm96ZSBhbmQgSSBmb3VuZCBhbmQgZml4ZWQKICBhIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSBIVFRQIGF1dGggb3ZlcmhhdWwgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBuZXZlci1lbmRpbmcgaW50ZXJuYWwgcmVxdWVzdC1sb29wIGR1ZSB0byB1bi1pbml0aWFsaXplZCB2YXJpYWJsZXMhCgotIFJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBvbiB2YXJpb3VzIGNvbXBpbGVycy9wbGF0Zm9ybXMuCgpEYW5pZWwgKDQgTWF5IDIwMDQpCi0gY3VybF9mb3JtcGFyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkuIEl0IGhhcyBiZWVuIG1hcmtlZCBhbmQKICBtZW50aW9uZWQgYXMgZGVwcmVjYXRlZCBmb3Igc2V2ZXJhbCB5ZWFycy4KCkRhbmllbCAoMyBNYXkgMjAwNCkKLSBSZXdyaXR0ZW4gSFRUUCBhdXRoZW50aWNhdGlvbiBjb2RlLiBUaGUgcHJldmlvdXMgY29kZSBjb3VsZCBub3QgcHJvcGVybHkKICBkZWFsIHdpdGggdGhlIGFkZGVkIHRlc3QgY2FzZXMgMTY3LCAxNjggYW5kIDE2OS4gSSd2ZSBub3cgcmV3cml0dGVuIHRoZSBjb2RlCiAgdG8gYmV0dGVyIHNlcGFyYXRlIGhvc3QgYW5kIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCBub3QgcmUtdXNlIHRoZSBzYW1lCiAgdmFyaWFibGVzIGFzIG11Y2ggYXMgYmVmb3JlIGFzIGl0IHByb3ZlZCBub24gd29ya2luZyBpbiB0aGUgbW9yZSBpbnZvbHZlZAogIGNhc2VzLiBBbGwgdGhlIGN1cnJlbnQgdGVzdHMgcnVuIE9LIG5vdywgYW5kIHNvIGRvIHRoZSBuZXcgb25lcy4gVGhlIGN1cmwKICB0b29sIGdvdCBhIG5ldyBvcHRpb24gbmFtZWQgLS1wcm94eS1kaWdlc3QgdG8gZW5hYmxlIEhUVFAgRGlnZXN0CiAgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuIEkgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IHN1cHBvcnQgaXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIExEQVAgY29kZSB3b3JrIHdpdGggd2xkYXAzMi5kbGwgYXMgc3VwcGxpZWQgd2l0aAogIFdpbi05OC9NRS8yMDAwL1hQLCBzbyBubyBleHRyYSAuZGxscyBhcmUgcmVxdWlyZWQgd2hlbiBjdXJsL2xpYmN1cmwgaXMgdXNlZAogIG9uIHRoZXNlIFdpbmRvd3MgdmVyc2lvbnMuCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDQpCi0gcnVudGVzdHMucGwgbm93IHNjYW5zIHRoZSB2YWxncmluZCBsb2cgZm9yIHZhbGdyaW5kLWRldGVjdGVkIG1lbW9yeSBsZWFrcwogIGFmdGVyIGVhY2ggdGVzdCBjYXNlIGlmIHZhbGdyaW5kIHdhcyBmb3VuZCBhbmQgdXNlZC4KCi0gSSBtb2RpZmllZCB0aGUgYXBwLWNvZGUgaW4gY3VybCB0byBpbmNsdWRlIHRoZSBuZXcgbGliL2N1cmx4LmggYW5kIG9ubHkKICBhY2Nlc3MgdGhvc2UgZnVuY3Rpb25zIHVzaW5nIHRoZSBjdXJseF8tcHJlZml4IGluIHByZXBhcmF0aW9uIGZvciB0aGUgZnV0dXJlCiAgcmVtb3ZhbCBvZiBzZXZlcmFsIGN1cmxfLWZ1bmN0aW9ucyBmcm9tIHRoZSBwdWJsaWMgbGliY3VybCBBUEkuCgotIEludHJvZHVjZWQgbGliL2N1cmx4LmggYXMgYSBzaW5nbGUgaGVhZGVyIHRvIHByb3ZpZGUgdGhlIGN1cmx4Xy1mdW5jdGlvbnMKICB0byBhcHBzLgoKLSBBZGRlZCBub3RpY2VzIGluIHRoZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2V0ZW52LCBjdXJsX21wcmludGYsIGN1cmxfc3RyZXF1YWwKICBhbmQgY3VybF9zdHJuZXF1YWwgdGhhdCB0aGV5IGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgU1RPUCBVU0lORyBUSEVTRSBGVU5DVElPTlMuCgotIE1paGFpIElvbmVzY3Ugbm90aWNlZCBoZSBjb3VsZG4ndCBkbyBmb3JtcG9zdHMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBmaWxlCiAgbmFtZXMgYW5kIHllcywgSSBicm9rZSB0aGF0IG9uIEFwcmlsIDIzLiBTaWdoLiBJIGZpeGVkIGl0IG5vdyBhbmQgYWRkZWQKICB0ZXN0IGNhc2UgMTY2IHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwb2ludGVkIG91dCBhIG1pc3Rha2UgbGVmdCBmcm9tIHRoZSBEaWdlc3QgcGF0Y2ggb2YgeWVzdGVyZGF5LgoKRGFuaWVsICgyOSBBcHJpbCAyMDA0KQotIE1hZGUgSUROIGRvbWFpbnMgd29yayB3aGVuIHNlbmRpbmcgcmVxdXN0cyBvdmVyIEhUVFAgcHJveHkgYXMgd2VsbC4gQWRkZWQKICB0ZXN0IGNhc2UgMTY1IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIG5ldyBpbnRlcm5hbCBob3N0IG5hbWUgc2V0dXAgd2hlbiByZS11c2luZyBjb25uZWN0aW9ucy4KCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdpdGggYXJlcy1idWlsdCBsaWJjdXJsCiAgY3JlYXRlZCBhIGJhZCBoYW5kbGUgdGhhdCB3b3VsZCBjcmFzaCBpbiB0aGUgZmlyc3QgbmFtZSByZXNvbHZlIGF0dGVtcHQuIFRoaXMKICBpcyBub3cgZml4ZWQgYW5kIHRlc3QgY2FzZSA1MTIgd2FzIGFkZGVkIHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwcm92aWRlZCBhIG1ham9yIEhUVFAgRGlnZXN0IGNvZGUgZml4IGFuZCBjbGVhbnVwLiBXZSBub3cgZm9sbG93CiAgdGhlIERpZ2VzdCBSRkMgYSBsb3QgYmV0dGVyLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBTU0wgY29kZSB1c2UgRVJSX2Vycm9yX3N0cmluZ19uKCkgd2hlcmUgYXBwbGljYWJsZS4KCkRhbmllbCAoMjcgQXByaWwgMjAwNCkKLSBJIHJlbW9kZWxlZCBHaXNsZSdzIElETiBjb2RlIHNsaWdodGx5IGFuZCBub3cgd2UgY29udmVydCBib3RoIHRoZSBob3N0IG5hbWUKICBhbmQgcHJveHkgbmFtZSB0byB0aGUgQUNFIGVuY29kZWQgdmVyc2lvbiB0byB1c2UgaW50ZXJuYWxseSBmb3IgcmVzb2x2ZXMgYW5kCiAgY29va2llcyBldGMuIFRoZXkgYXJlIG5vdyB1c2luZyBvbmUgJ3N0cnVjdCBob3N0bmFtZScgZWFjaCB0aGF0IGtlZXAgYm90aAogIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aGUgcG9zc2libHkgZW5jb2RlZCBuYW1lLiBJRE4gcmVzb2x2ZXMgd29yayBmb3IgbWUKICBub3cgdXNpbmcgSVB2NiwgSVB2NCBhbmQgYXJlcyByZXNvbHZpbmcuIEV2ZW4gY29va2llcyBvbiBJRE4gc2l0ZXMgc2VlbSB0bwogIGRvIHJpZ2h0LiBJIGdvdCBzb21lIGZhaWx1cmVzIGF0IGZpcnN0IHdoZW4gQ0hBUlNFVCB3YXNuJ3Qgc2V0IGF0IGFsbCB3aGljaAogIGNvbmZ1c2VkIGxpYmlkbiBjb21wbGV0ZWx5IGFuZCBpdCBkZWNpZGVkIGJ5IGVuY29kaW5nIG9mIGNob2ljZSB3YXMKICAnQU5TSV9YMy40LTE5NjgnLi4uCgotIG1hZGUgJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtbGliaWRuJyB3b3JrCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRml4ZWQgdGhlIHNyYy9odWdlaGVscC5jIGZpbGUgdG8gaW5jbHVkZSAic2V0dXAuaCIgaW5zdGVhZCBvZiAiY29uZmlnLmgiIHRvCiAgbWFrZSB0aGUgcHJvYmxlbXMgd2l0aCBVU0VfTUFOVUFMIG9uIHdpbmRvd3MgZ28gYXdheS4KCi0gY29uZmlndXJlIC0td2l0aG91dC1zc2wgY291bGQgc3RpbGwgd3JvbmdseSBpbmNsdWRlIHNvbWUgT3BlblNTTCBpbmZvIGluIHRoZQogIE1ha2VmaWxlcyBpZiBwa2ctY29uZmlnIGhhZCBpbmZvIGFib3V0IE9wZW5TU0wuIEJ1ZyAjOTQxNzYyIHJlcG9ydGVkIGJ5CiAgTWFydGluLgoKLSBTaW5jZSB3ZSBjYW4gbm93IGJ1aWxkIGFuZCB1c2UgcXVpdGUgYSBsYXJnZSBzZXQgb2YgM3JkIHBhcnR5IGxpYnJhcmllcywgSQogIGRlY2lkZWQgSSB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBwcm9kdWNlIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHNob3dpbmcgd2hhdAogIGxpYnJhcmllcyBpdCB1c2VzIGFuZCBpZiBub3QsIHdoYXQgb3B0aW9uIHRvIHVzZSB0byBtYWtlIGl0IHVzZSB0aGF0LiBJIGFsc28KICBhZGRlZCBzb21lIG90aGVyIHJhbmRvbSBpbmZvIHRoYXQgaXMgbmljZSBpbiBhICJjb25maWd1cmUgc3VtbWFyeSIgb3V0cHV0LgoKLSBBcHBsaWVkIFRvbW15VGFtJ3MgcGF0Y2ggdGhhdCBub3cgbWFrZSBjdXJsIHdvcmsgd2l0aCB0ZWxuZXQgYW5kIHN0ZGluCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gVGhlIGNoYW5nZXMgZm9yIHRvZGF5IGJlbG93IHdlcmUgbWFkZSBieSBtZSBhbmQgR2lzbGUgVmFuZW0uCgogIFRoZSBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgaG9zdGlwLmMgaGFzIG5vdyB1bmRlcmdvbmUgYSBodWdlIGNsZWFudXAgYW5kCiAgc3BsaXQ6CgogIGhvc3RpcC5jIGV4cGxhaW5lZAogID09PT09PT09PT09PT09PT09PQoKICBUaGUgbWFpbiBDT01QSUxFLVRJTUUgREVGSU5FUyB0byBrZWVwIGluIG1pbmQgd2hlbiByZWFkaW5nIHRoZSBob3N0Ki5jCiAgc291cmNlIGZpbGUgYXJlIHRoZXNlOgoKICBDVVJMUkVTX0lQVjYgLSB0aGlzIGhvc3QgaGFzIGdldGFkZHJpbmZvKCkgYW5kIGZhbWlseSwgYW5kIHRodXMgd2UgdXNlCiAgdGhhdC4gVGhlIGhvc3QgbWF5IG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgSVB2NiwgYnV0IHdlIGRvbid0IHJlYWxseSBoYXZlIHRvCiAgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gSG9zdHMgdGhhdCBhcmVuJ3QgSVB2Ni1lbmFibGVkIGhhdmUgQ1VSTFJFU19JUFY0CiAgZGVmaW5lZC4KCiAgQ1VSTFJFU19BUkVTIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHVzZSBjLWFyZXMgZm9yIGFzeW5jaHJvbm91cwogIG5hbWUgcmVzb2x2ZXMuIEl0IGNhbm5vdCBoYXZlIEVOQUJMRV9JUFY2IGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSwgYXMKICBjLWFyZXMgaGFzIG5vIElQdjYgc3VwcG9ydC4gVGhpcyBjYW4gYmUgV2luZG93cyBvciAqbml4LgoKICBDVVJMUkVTX1RIUkVBREVEIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHJ1biB1bmRlciAobmF0aXZlKQogIFdpbmRvd3MsIGFuZCB0aGVuIHRoZSBuYW1lIHJlc29sdmUgd2lsbCBiZSBkb25lIGluIGEgbmV3IHRocmVhZCwgYW5kIHRoZQogIHN1cHBvcnRlZCBhc3luY2ggQVBJIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGFyZXMtYnVpbGRzLgoKICBJZiBhbnkgb2YgdGhlIHR3byBwcmV2aW91cyBhcmUgZGVmaW5lZCwgQ1VSTFJFU19BU1lOQ0ggaXMgZGVmaW5lZCB0b28uIElmCiAgbGliY3VybCBpcyBub3QgYnVpbHQgdG8gdXNlIGFuIGFzeW5jaHJvbm91cyByZXNvbHZlciwgQ1VSTFJFU19TWU5DSCBpcwogIGRlZmluZWQuCgogIFRoZSBob3N0Ki5jIHNvdXJjZXMgZmlsZXMgYXJlIHNwbGl0IHVwIGxpa2UgdGhpczoKCiAgaG9zdGlwLmMgICAtIG1ldGhvZC1pbmRlcGVuZGVudCByZXNvbHZlciBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCiAgaG9zdGFzeW4uYyAtIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0c3luLmMgIC0gZnVuY3Rpb25zIGZvciBzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdGFyZXMuYyAtIGZ1bmN0aW9ucyBmb3IgYXJlcy11c2luZyBuYW1lIHJlc29sdmVzCiAgaG9zdHRocmUuYyAtIGZ1bmN0aW9ucyBmb3IgdGhyZWFkZWQgbmFtZSByZXNvbHZlcwogIGhvc3RpcDQuYyAgLSBJUHY0IHNwZWNpZmljIGZ1bmN0aW9ucwogIGhvc3RpcDYuYyAgLSBJUHY2IHNwZWNpZmljIGZ1bmN0aW9ucwoKICBUaGUgaG9zdGlwLmggaXMgdGhlIHNpbmdsZSB1bml0ZWQgaGVhZGVyIGZpbGUgZm9yIGFsbCB0aGlzLiBJdCBkZWZpbmVzIHRoZQogIENVUkxSRVNfKiBkZWZpbmVzIGJhc2VkIG9uIHRoZSBjb25maWcqLmggYW5kIHNldHVwLmggZGVmaW5lcy4KCi0gQWRkZWQgZnVuY3Rpb24gaGVhZGVyIGNvbW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gYmV0dGVyCiAgZXhwbGFpbiB0aGUgcHVycG9zZSBvZiB0aGVtIGFsbC4KCi0gY29uZmlndXJlIC0td2l0aC1saWJpZG4gaXMgbm93IHN1cHBvcnRlZC4gSXQgbWFrZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICBjaGVjayBmb3IgbGliaWRuIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHByZWZpeCBwYXRoIGdpdmVuLiBJZiB5b3UKICBzYXkgLS13aXRoLWxpYmlkbj0vdXNyL2xvY2FsLCBpdCB3aWxsIGNoZWNrIGZvciB0aGUgbGliIGluIC91c3IvbG9jYWwvbGliCiAgYW5kIHRoZSBpbmNsdWRlcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgZXRjLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgc3RydWN0IGFnZWQgQ1VSTFZFUlNJT05fVEhJUkQgaW5jbHVkaW5nCiAgbGliaWRuIHZlcnNpb24gaW5mby4gVGhlIHN0cmluZyBjdXJsX3ZlcnNpb24oKSByZXR1cm5zIGFsc28gaW5jbHVkZXMgbGliaWRuCiAgdmVyc2lvbiBpbmZvLCBpZiBhdmFpbGFibGUuCgpWZXJzaW9uIDcuMTEuMiAoMjYgQXByaWwgMjAwNCkKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBFcndpbiBBdXRocmllZCBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsIGRpZG4ndCBkbyByaWdodAogIGlmIHlvdSBhbHJlYWR5IGhhZCBhIHNyYy9odWdlaGVscC5jIHNvdXJjZSBmaWxlIHByZXNlbnQgKHdoaWNoIG1vc3QgcGVvcGxlCiAgZG8gSSBndWVzcykuIEl0IG5vdyB1c2VzIHRoZSBVU0VfTUFOVUFMIGRlZmluZSBwcm9wZXJseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGRvaW5nIChmYWlsaW5nKSBXaW5kb3dzCiAgdGhyZWFkZWQgbmFtZSByZXNvbHZlcy4KCi0gSSBhbHNvIGFkZGVkIHRlc3QgY2FzZSAxNjMganVzdCB0byBtYWtlIHN1cmUgLUYgInZhcj08ZmlsZSIgd29ya3MgZmluZSBhbmQKICBjYW4gcGFzcyBvbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgbmV3bGluZXMsIGNhcnJpYWdlLXJldHVybiBhbmQgdGFicy4KCi0gV2hlbiB3ZSBhZGRlZCB0ZXN0IGNhc2UgMTYyIHdpdGhvdXQgYWRkaW5nIHRoZSBuZWNlc3NhcnkgcmVxdWlyZW1lbnQgZmllbGQKICBpbiB0aGUgdGVzdCBtZXRhIGRhdGEgd2UgY291bGQgc2VlIHRoYXQgY3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgeW91IHVzZWQKICAtLXByb3h5LW50bG0gZXZlbiBpZiB0aGUgdW5kZXJseWluZyBsaWJjdXJsIGl0IHVzZXMgaGFzIG5vIE5UTE0gc3VwcG9ydCEgSQogIG5vdyBtYWRlIGl0IGNoZWNrIHRoaXMgZmlyc3QsIGFuZCBpdCBub3cgZXhpc3RzIHdpdGggYSAidGhlIGluc3RhbGxlZAogIGxpYmN1cmwgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyIgbWVzc2FnZSBpZiBpdCBoYXBwZW5zIGFnYWluLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA0KQotIERhdmlkIEJ5cm9uIGZvdW5kIGFuZCBmaXhlZCBhIHNtYWxsIGJ1ZyB3aXRoIHRoZSAtLWZhaWwgYW5kIGF1dGhlbnRpY2F0aW9uCiAgc3R1ZmYgYWRkZWQgYSBmZXcgd2Vla3MgYWdvLiAgVHVybnMgb3V0IHRoYXQgaWYgeW91IHNwZWNpZnkgLS1wcm94eS1udGxtIGFuZAogIGNvbW11bmljYXRlIHdpdGggYSBwcm94eSB0aGF0IHJlcXVpcmVzIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCB0aGUgcHJveHkKICBwcm9wZXJseSByZXR1cm5zIGEgNDA3LCBidXQgdGhlIGZhaWx1cmUgZGV0ZWN0aW9uIGNvZGUgZG9lc24ndCByZWFsaXplIGl0CiAgc2hvdWxkIGdpdmUgdXAsIHNvIGN1cmwgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwLiBUZXN0IGNhc2UgMTYyIGFkZGVkIHRvCiAgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBhbGxvdyBuZXdsaW5lcyBpbiB0aGUgY29udGVudHMgd2hlbiBkb2luZyAtRiAidmFyPVtjb250ZW50c10iCiAgUm9iZXJ0IE1hcmxvdyByZXBvcnRlZC4KCi0gSWYgYSB0cmFuc2ZlciBpcyBmb3VuZCBvdXQgdG8gYmUgb25seSBwYXJ0aWFsLCBsaWJjdXJsIHdpbGwgbm93IHRyZWF0IHRoYXQKICBhcyBhIHByb2JsZW0gc2VyaW91cyBlbm91Z2ggdG8gc2tpcCB0aGUgZmluYWwgUVVJVCBjb21tYW5kIGJlZm9yZSBjbG9zaW5nCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVG8gYXZvaWQgdGhlIHJpc2sgdGhhdCBpdCB3aWxsICJoYW5nIiB3YWl0aW5nIGZvcgogIHRoZSBRVUlUIHJlc3BvbnNlLiBBZGRlZCB0ZXN0IGNhc2UgMTYxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHRoZSBoZXVyaXN0aWNzIGZvciBkZWFsaW5nIHdpdGggdGhlIHRlc3QgMTYwIHNjZW5hcmlvLiBXaGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQgYW5kIG5vdGhpbmcgYXQgYWxsIGlzIHJlY2VpdmVkIGZyb20gaXQgKGJlY2F1c2UgdGhlCiAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiksIHdlIHdpbGwgbm93IHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEgZnJlc2ggbmV3CiAgY29ubmVjdGlvbi4gVGhlIHByZXZpb3VzIEVDT05OUkVTRVQgc3R1ZmYgZnJvbSBKYW51YXJ5IDMwIHdhcyByZW1vdmVkIGFnYWluCiAgYXMgaXQgZGlkbid0IGRldGVjdCB0aGUgc2l0dWF0aW9uIGdvb2QgZW5vdWdoLgoKRGFuaWVsICgyMCBBcHJpbCAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAxNjAgdG8gdmVyaWZ5IHRoYXQgY3VybCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBpdCBnZXRzIGEKICBjb25uZWN0aW9uIHJlc2V0IHdoZW4gdHJ5aW5nIHRvIHJlLXVzZSBhIGNvbm5lY3Rpb24uIEl0IHNob3VsZCB0aGVuIHNpbXBseQogIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDQpCi0gTm8gbW9yZSA1MTIgYnl0ZSBsaW1pdCBmb3IgaG9zdCBuYW1lIChpbmNsdXNpbmcgbmFtZSArIHBhc3N3b3JkKSBpbiBsaWJjdXJsLgogIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5IGZvciB0aGUgdHlwaWNhbCAoc2hvcnRlciBVUkwpCiAgY2FzZS4KCi0gQ2xlYW5lZCB1cCB0aGUgc291cmNlcyB0byBiZXR0ZXIgdXNlIHRoZSB0ZXJtcyAnaG9zdG5hbWUnIGFuZCAncGF0aCcKICBpbnRlcm5hbGx5IHdoZW4gcmVmZXJyaW5nIHRvIHRoYXQgZGF0YS4gVGhlIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcCB0aGF0IGluZm8KICBpcyBjYWxsZWQgJ25hbWVidWZmZXInIGFuZCAncGF0aGJ1ZmZlcicuIE11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKICB0aGFuIHRoZSBwcmV2aW91cyBtZXNzLgoKRGFuaWVsICgxNSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHJ1bnRlc3RzLnBsIGFnYWluIHRvIHJlbW92ZSBhbGwgbG9nIGZpbGVzIGluIHRoZSBsb2cvIGRpciBiZXR3ZWVuCiAgZWFjaCB0ZXN0LCBhbmQgdGhlbiBtYWRlIC1wIGRpc3BsYXkgYWxsIG5vbi16ZXJvIGJ5dGUgZmlsZXMgaW4gdGhlIGxvZyBkaXIuCiAgSXQgc2hvdWxkIG1ha2UgdGhhdCBkYXRhIG1vcmUgdXNhYmxlIGFuZCBjb250YWluIGxlc3MgcnViYmlzaC4KCi0gZnRwc2VydmVyLnBsIG5vdyBwcm9kdWNlcyBsb2cgZmlsZXMgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgc3dzIG9uZXMgbG9vawogIGFuZCB0aGV5IG5vdyBhbHNvIGNvbnRhaW5zIGEgYml0IG1vcmUgZGV0YWlscyB0byBoZWxwIGRlYnVnZ2luZyBmdHAKICBwcm9ibGVtcy4KCi0gUmVtb3ZlZCB0aGUgZml4ZWQgbWF4aW11bSBhbW91bnQgb2YgZGlyIGxldmVscyB0aGUgRlRQIGNvZGUgc3VwcG9ydGVkLgogIFByZXZpb3VzbHkgd2UgaGFkIGEgZml4ZWQgYXJyYXkgZm9yIDEwMCBsZXZlbHMsIG5vdyB3ZSBzYXZlIHNwYWNlIGluIGVhY2gKICBoYW5kbGUgYnkgYWxsb2NhdGluZyBvbmx5IGZvciBhIGZldyBsZXZlbCBieSBkZWZhdWx0IGFuZCB0aGVuIGVubGFyZ2luZyB0aGF0CiAgaW4gY2FzZSBvZiBuZWVkICh3aXRoIG5vIG1heGltdW0gZGVwdGgpLiBBZGp1c3RlZCB0ZXN0IGNhc2UgMTQyIHRvIHZlcmlmeQogIHRoYXQgMTUwIGRpciBsZXZlbHMgd29yayBmaW5lLiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkKICBmb3IgdGhlIHR5cGljYWwgKG5vdCB2ZXJ5IGRlZXApIGNhc2UuCgpEYW5pZWwgKDE0IEFwcmlsIDIwMDQpCi0gQXNraW5nIGZvciBDVVJMX0lQUkVTT0xWRV9WNiB3aGVuIElQdjYgYWRkcmVzc2VzIGNhbid0IGJlIHJlc29sdmVkIHdpbGwKICBub3cgY2F1c2UgdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gcmV0dXJuIE5VTEwgaW1tZWRpYXRlbHkuIFRoaXMgZmxhdyB3YXMKICBwb2ludGVkIG91dCBieSBHaXNsZSBWYW5lbS4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIC00Ly02IGFjdHVhbGx5IHNldCB0aGUgZGVzaXJlZCBvcHRpb24gdG8gbGliY3VybC4KCi0gcnVudGVzdHMucGwgbm93IGhhcyBhIG5ldyBvcHRpb24gKC1wKSB0aGF0IHdpbGwgZGlzcGxheSAiaW50ZXJlc3RpbmciIGxvZwogIGZpbGVzIHRvIHN0ZG91dCBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZQogIHVzZWQgaW4gdGhlICdmdWxsLXRlc3QnIG1ha2UgdGFyZ2V0IHRoYXQgaXMgdXNlZCBieSB0aGUgYXV0b2J1aWxkIHRlc3RzLCBhcwogIHdlIHRoZW4gZ2V0IGEgbXVjaCBiZXR0ZXIgY2hhbmNlIHRvIHVuZGVyc3RhbmQgKHJlbW90ZSkgdGVzdCBmYWlsdXJlcyBiYXNlZAogIG9uIGF1dG9idWlsZCBsb2dzIGFsb25lLgoKRGFuaWVsICgxMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSB3b3JrIGFnYWluIG9uIFdpbmRvd3MgZXZlbiB3aGVuIGJ1aWx0CiAgd2l0aG91dCBhcmVzLiBCZWZvcmUgdGhpcywgc2VsZWN0KCkgd291bGQgcmV0dXJuIC0xIGR1cmluZyB0aGUgbmFtZSByZXNvbHZlCiAgcGhhc2Ugc2luY2UgY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXR1cm4gYW55IGZkX3NldCBhdCBhbGwgd2hpY2ggd2Fzbid0CiAgYXBwcmVjaWF0ZWQhCgotIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBub3cgZHVwbGljYXRlcyB0aGUgdGNwX25vZGVsYXkgaW5mbyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBwYXRjaCBmb3IgdGhlIE1TVkMgbGliY3VybCBtYWtlZmlsZSBmb3IgYnVpbGRzIHdpdGgKICB6bGliLgoKRGFuaWVsICg5IEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgaW1wcm92ZWQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIENVUkxJTkZPXypfVElNRSwgaXQgY2FuIG5vdwogIGJlIGRvd24gdG8gdXNlYyBpZiB0aGUgc3lzdGVtIHN5cHBvcnRzIGl0LgoKRGFuaWVsICg3IEFwcmlsIDIwMDQpCi0gQSByZXF1ZXN0IHRoYXQgc2VuZHMgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBhbmQgZ2V0cyBub3RoaW5nIGJ1dCBhIHNpbmdsZQogIDEwMCByZXNwb25zZSBiYWNrIHdpbGwgbm93IHJldHVybiBhIENVUkxFX0dPVF9OT1RISU5HLiBUZXN0IDE1OCB2ZXJpZmllcy4KCi0gVGhlIHN0cnRvb2ZmdCgpIG1hY3JvIGlzIG5vdyBuYW1lZCBjdXJseF9zdHJ0b29mZnQoKSB0byB1c2UgdGhlIGN1cmx4XyoKICBhcHByb2FjaCBmdWxseS4KCkRhbmllbCAoNiBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4ZWQgYnVnICM5Mjc5NzkgcmVwb3J0ZWQgYnkgTmF0aGFuIE8nU3VsbGl2YW4uIFRoZSBwcm9ibGVtCiAgbWFkZSBsaWJjdXJsIG9uIFdpbmRvd3MgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaW4gZWFjaCBuYW1lIHJlc29sdmUKICB3aGVuIG5vdCB1c2VkIGFzIGEgRExMLgoKLSBOZXcgYXV0aGVudGljYXRpb24gY29kZSBhZGRlZCwgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aGVuIGRvaW5nIFBPU1Qgb3IgUFVUCiAgd2l0aCBEaWdlc3Qgb3IgTlRMTS4gbGliY3VybCB3aWxsIG5vdyB1c2UgSEVBRCB0byBuZWdvdGlhdGUgdGhlCiAgYXV0aGVudGljYXRpb24gYW5kIHdoZW4gZG9uZSBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgUE9TVC4gUHJldmlvdXNseSBsaWJjdXJsCiAgc2VudCBQT1NUIGltbWVkaWF0ZWx5IGFuZCBleHBlY3RlZCB0aGUgc2VydmVyIHRvIHJlcGx5IGEgZmluYWwgc3RhdHVzIGNvZGUKICB3aXRoIGFuIGVycm9yIGFuZCB0aGVuIGxpYmN1cmwgd291bGQgbm90IHNlbmQgdGhlIHJlcXVlc3QtYm9keSBidXQgaW5zdGVhZAogIHNlbmQgdGhlbiBuZXh0IHJlcXVlc3QgaW4gdGhlIHNlcXVlbmNlLgoKICBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBkdWUgdG8gSUlTNiBiYXJmaW5nIG9uIGxpYmN1cmwgd2hlbiB3ZSBhdHRlbXB0CiAgdG8gUE9TVCB3aXRoIE5UTE0gYXV0aGVudGljYXRpb24uIFRoZSByZWFzb24gZm9yIHRoZSBwcm9ibGVtcyBpcyBmb3VuZCBpbgogIFJGQzI2MTYgc2VjdGlvbiA4LjIuMyByZWdhcmRpbmcgaG93IHNlcnZlcnMgc2hvdWxkIGRlYWwgd2l0aCB0aGUgMTAwCiAgY29udGludWUgcmVxdWVzdC1oZWFkZXI6CgogICAgICAgIElmIGl0IHJlc3BvbmRzIHdpdGggYSBmaW5hbCBzdGF0dXMgY29kZSwgaXQgTUFZIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICAgICBjb25uZWN0aW9uIG9yIGl0IE1BWSBjb250aW51ZSB0byByZWFkIGFuZCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZQogICAgICAgIHJlcXVlc3QuCgogIFByZXZpb3VzIHZlcnNpb25zIG9mIElJUyBjbGVhcmx5IGRpZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiB0aGlzIGNhc2UsCiAgd2hpbGUgdGhpcyBuZXdlciB2ZXJzaW9uIGRlY2lkZWQgaXQgc2hvdWxkICJyZWFkIGFuZCBkaXNjYXJkIi4gVGhhdCB3b3VsZCd2ZQogIGZvcmNlZCB1cyB0byBzZW5kIHRoZSB3aG9sZSBQT1NUIChvciBQVVQpIGRhdGEgb25seSB0byBoYXZlIGl0IGRpc2NhcmRlZCBhbmQKICB0aGVuIGJlIGZvcmNlZCB0byBzZW5kIGl0IGFnYWluLiBUbyBhdm9pZCB0aGF0IGh1Z2UgcGVuYWxpdHksIHdlIHN3aXRjaCB0bwogIHVzaW5nIEhFQUQgdW50aWwgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZW4gc2VuZCB0aGUgUE9TVC4KCiAgVGhlIG9ubHkgYWN0dWFsIGRyYXdiYWNrIEkgY2FuIHRoaW5rIG9mIChleGNlcHQgZm9yIHRoZSBvZGQgc2l0ZXMgdGhhdCBtaWdodAogIHRyZWF0IEhFQUQgZGlmZmVyZW50bHkgdGhhbiB0aGV5IHdvdWxkIHRyZWF0IFBPU1QvUFVUIHdoZW4gZ2l2ZW4gdGhlIHNhbWUKICBVUkwpIGlzIHRoYXQgaWYgeW91IGRvIFBPU1Qgd2l0aCBDVVJMQVVUSF9BTlkgc2V0IGFuZCB0aGUgc2l0ZSByZXF1aXJlcyBOTwogIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIHdpbGwgc3RpbGwgdXNlIGEgSEVBRCBpbiBhIGZpcnN0IHJvdW5kIGFuZCB0aGVuIGRvIGEKICBQT1NULgoKICBJZiB5b3UgZG8gYSBIRUFEIG9yIGEgR0VUIG9uIGEgc2l0ZSB1c2luZyBDVVJMQVVUSF9BTlksIGxpYmN1cmwgd2lsbCBzZW5kCiAgYW4gdW4tYXV0aGVudGljYXRlZCByZXF1ZXN0IGF0IG9uY2UsIHdoaWNoIHRoZW4gaXMgdGhlIG9ubHkgcmVxdWVzdCBpZiB0aGUKICBzaXRlIHJlcXVpcmVzIG5vIGF1dGguCgogIEFsYW4gUGluc3RlaW4gaGVscGVkIG1lIHdvcmsgb3V0IHRoZSBwcm90b2NvbCBkZXRhaWxzIGJ5IGZpZ3VyaW5nIG91dCB3aHkKICBsaWJjdXJsIGZhaWxlZCBhbmQgd2hhdCBJSVM2IGV4cGVjdHMuCgotIFRoZSAtLWxpbWl0LXJhdGUgbG9naWMgd2FzIGNvcnJlY3RlZCBhbmQgbm93IGl0IHdvcmtzIGEgbG90IGJldHRlciBmb3IKICBoaWdoZXIgc3BlZWRzLCBzdWNoIGFzICcxMG0nIG9yIHNpbWlsYXIuIFJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzkzMDI0OS4KCi0gSW50cm9kdWNpbmcgY3VybHhfdHZub3coKSBhbmQgY3VybHhfdHZkaWZmKCkgdXNpbmcgdGhlIG5ldyBjdXJseF8qIGZhc2hpb24uCiAgI2luY2x1ZGUgInRpbWV2YWwuaCIgZnJvbSB0aGUgbGliIGRpciB0byBnZXQgdGhlIHByb3RvcyBldGMuICBOb3RlIHRoYXQKICB0aGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGxpYmN1cmwgQVBJLiBUaGUgY3VybCBhcHAgc2ltcGx5IHVzZXMgdGhlIHNhbWUKICBzb3VyY2UgZmlsZXMgYXMgdGhlIGxpYnJhcnkgZG9lcyBhbmQgdGhlcmVmb3JlIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGVkCiAgYW5kIGxpbmtlZCB3aXRoIGN1cmwgdG9vLCBub3QganVzdCB3aGVuIGNyZWF0aW5nIGxpYmN1cmwuCgotIGxpYi9zdHJlcnJvci5jIG5vIGxvbmdlciB1c2VzIHN5c19uZXJyIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBzaW5jZSBpdAogIGlzbid0IHBvcnRhYmxlIGVub3VnaAoKRGFuaWVsICgyIEFwcmlsIDIwMDQpCi0gSW4gdGhlIGN1cmxfc3RybnF1YWwuMyBtYW4gcGFnZSwgd2Ugbm93IHByZXBlbmQgdGhlIG1hbjMgZGlyIHRvIHRoZSBmaWxlCiAgbmFtZSB0byB3b3JrIGJldHRlci4gQXMgcG9pbnRlZCBvdXQgYnkgUm9iaW4gS2F5LgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBwcm9ibGVtIEkgcmVjZW50bHkgYWRkZWQgaW4gdGhlIHByb2dyZXNzIG1ldGVyIGNvZGUgdGhhdAogIGJyb2tlIHN1YnNlY29uZCByZXNvbHV0aW9uIGZvciBDVVJMSU5GT19UT1RBTF9USU1FLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGEKICBtaXN0YWtlIGluIHRoZSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGZpbmFsIHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICB0aGF0IHdvdWxkIG9mdGVuIHByZXZlbnQgaXQgZnJvbSBhY3R1YWxseSBiZWluZyB1cGRhdGVkIHRoYXQgZmluYWwgdGltZS4KCkRhbmllbCAoMSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIHdlIHVzZSBhcmVzIGZvciBuYW1lCiAgcmVzb2x2ZXMgYW5kIGRlY2lkZXMgdG8gdGltZS1vdXQgYmVmb3JlIGFyZXMgZG9lcyBpdC4gVGhpcyBmaXggdXNlcyB0aGUKICBicmFuZCBuZXcgYXJlc19jYW5jZWwoKSBmdW5jdGlvbiB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBjLWFyZXMgMS4xLjAuCgogIFdoZW4gdG9sZCB0byBlbmFibGUgYXJlcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YKICB0aGUgYXJlc19jYW5jZWwgZnVuY3Rpb24gdG8gYWxlcnQgdXNlcnMgaWYgdGhleSBhdHRlbXB0IHRvIHVzZSBhIHRvbyBvbGQKICBjLWFyZXMgbGlicmFyeS4KCkRhbmllbCAoMzEgTWFyY2ggMjAwNCkKLSBSb3kgU2hhbiBmaXhlZCBhIGZsYXcgdGhhdCBwcmV2ZW50ZWQgYXJlcyBuYW1lIHJlc29sdmUgdGltZW91dHMgdG8gb2NjdXIhCgotIERpcmsgTWFuc2tlIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc29sdmVzIGZhciB0b28KICBlYXN5IHdoZW4gbGliY3VybCB3YXMgYnVpbHQgdG8gdXNlIChjLSlhcmVzIGZvciBuYW1lIHJlc29sdmluZy4KCi0gRnVydGhlciBEaWdlc3QgZml4aW5nIGFuZCBhIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlIDE1MyBub3cgbWFrZXMgbWUgYmVsaWV2ZQogIE1pdHogV2FyaydzIHByb2JsZW1zIGFyZSBmaXhlZC4KCi0gQW5kcmVzIEdhcmNpYSBmaWd1cmVkIG91dCB0aGF0IHRlc3QgY2FzZSA2Mywgd2hpbGUgd29ya2luZywgb25seSBwcm92ZWQgYQogIGZsYXcgaW4gbGliY3VybCdzICdodHRwX3Byb3h5JyBwYXJzZXIgd2hlbiBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaXMKICBwcm92aWRlZC4gVGhlIHVzZXIgbmFtZSB3YXMgbm90IGV4dHJhY3RlZCBwcm9wZXJseSAoYW5kICdodHRwJyB3YXMgYWx3YXlzCiAgdXNlZCBhcyB1c2VyIG5hbWUpLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIG91ciBpb2N0bHNvY2tldCgpIHVzYWdlLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA0KQotIEpvZSBIYWxwaW4gZmFjZWQgcHJvYmxlbXMgd2l0aCB0aGUgZ2V0bmFtZWluZm8oKSBhcmd1bWVudCBhaV9mbGFncyBhbmQgdGhlCiAgcGFydGljdWxhciBiaXQgbmFtZWQgJ05JX1dJVEhTQ09QRUlEJyBvbiBTb2xhcmlzIDkgZm9yIEludGVsLiAgSSd2ZSBub3cKICB3cml0dGVuIGEgY29uZmlndXJlIHRlc3QgdGhhdCBjaGVja3MgZm9yIGEgd29ya2luZyBOSV9XSVRIU0NPUEVJRAogIGltcGxlbWVuYXRpb24uIE5vIGNvZGUgdXNlcyB0aGUgcmVzdWx0IGZyb20gdGhpcyB0ZXN0IHlldCwgaXQgaXMgc3RpbGwKICBleHBlcmltZW50YWwuIEphbWVzIENhcmxzb24gd3JvdGUgaW4gY29tcC51bml4LnNvbGFyaXM6ICJJdCdzIGEgYnVnCiAgKDUwMDY2MjMpIC0tIGl0J3Mgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkbid0IGJlIGluIHRoZSBoZWFkZXIgZmlsZS4iCgotIEkgcHJvdmlkZWQgTWl0eiBXYXJrIHdpdGggYSBmaXJzdCBwYXRjaCBpbiBvcmRlciB0byBmaXggbGliY3VybCdzIHByb2JsZW1zCiAgdG8gcmUtbmVnb3RpYXRlIERpZ2VzdCBhdXRoZW50aWNhdGlvbiAod2hlbiAnc3RhbGU9dHJ1ZScgaXMgaW5jbHVkZWQgaW4gdGhlCiAgcmVzcG9uc2UgaGVhZGVyKS4KCi0gUm95IFNoYW4gZGlzY292ZXJlZCB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UgZGlkbid0IHByb3Blcmx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMgd2hpY2ggY291bGQgbWFrZSBoYW5kbGVzIGdldCBzdHVjayBpbiB0aGF0IHN0YXRlIGFuZCB0aHVzIG5ldmVyIGdldAogIGNvbXBsZXRlZC4gSSd2ZSBwcm9kdWNlZCBhIGZpcnN0IHRlc3QgcGF0Y2ggdGhhdCBhdHRlbXB0cyB0byBjb3JyZWN0IHRoaXMuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcHBsaWVkIHRvIG1ha2UgQ1VSTE9QVF9GQUlMT05FUlJPUiB3b3JrIG5pY2VseQogIGV2ZW4gd2l0aCBhdXRoZW50Y2F0aW9ucyBzdWNoIGFzIE5UTE0gb3IgRGlnZXN0IGVuYWJsZWQuIFRlc3QgY2FzZXMgMTUwLCAxNTEKICBhbmQgMTUyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgZmlsZXMgZm9yIHRoZSBkamdwcC9NUy1ET1MgYnVpbGQuCgotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIHdvcmsgb3V0IGEgZml4IGZvciB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIG1ha2UKICB0aGUgZmlsZTovLyB0ZXN0cyBydW4gZmluZSB3aGVuIHRlc3RlZCB3aXRoIHRoZSBtaW5ndy1idWlsdCB2ZXJzaW9uIG9mIGN1cmwuCgotIEZpeGVkIGFuIGluY2x1ZGUgaXNzdWUgd2l0aCBuZXRpbmV0L3RjcC5oIG9uIEFJWCwgYmFzZWQgb24gaW5wdXQgYnkgVG9yLgogIFRoaXMgYWxzbyByZXF1aXJlZCBhIG1pbm9yIGZpeCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gVGhlIHBvc3RpdDIuYyBzb3VyY2UgZXhhbXBsZSB1c2VkIHRoZSB3cm9uZyBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHBvc3QgZGF0YS4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBJUHY2IHN1cHBvcnQgb24gV2luZG93cyBieSBtYWtpbmcgdGhlIGN1cmwgYnVpbGQgdXNlCiAgdGhlIGNvcnJlY3QgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4KCkRhbmllbCAoMjUgTWFyY2ggMjAwNCkKLSBJdCB0dXJuZWQgb3V0IHRoYXQgQUlYLCBkZXNwaXRlIGhhdmluZyBhICJ0aHJlYWQtc2FmZSBsaWJjIiwgZG9lc24ndCBvZmZlcgogIGFsbCB0cmFkaXRpb25hbCBmdW5jdGlvbnMgdGhyZWFkLXNhZmUuIFRoaXMgVVJMIGlzIGluZm9ybWF0aXZlIG9uIHRoaXMKICBzdWJqZWN0OgoKICAgIGh0dHA6Ly9wdWJsaWJuLmJvdWxkZXIuaWJtLmNvbS9kb2NfbGluay9lbl9VUy9hX2RvY19saWIvYWl4cHJnZ2QvIFwKICAgIGdlbnByb2djL3RocmVhZF9xdWlja19yZWYuaHRtCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHdlIG5vdyBjaGVjayBmb3IgdGhyZWUgKl9yKCkgZnVuY3Rpb25zIG9uIHJlY2VudCBBSVgKICB2ZXJzaW9ucyBhcyB3ZWxsIHRoYXQgdGhlIFVSTCBtZW50aW9ucyBhcmVuJ3QgdGhyZWFkLXNhZmUgaW4gQUlYIDUuMS4KCi0gcmVuYW1lZCBjdXJsX3N0cmVycm9yLltjaF0gdG8gc3RyZXJyb3IuW2NoXQoKLSBKb2UgSGFscGluIGFkZGVkIENVUkxPUFRfVENQX05PREVMQVkgYW5kIC0tdGNwLW5vZGVsYXkgdG8gbWFrZSBpdCBwb3NzaWJsZQogIGZvciB1c2VycyB0byBkaXNhYmxlIHRoZSBOYWdsZSBhbGdvcnRoaW0tdXNhZ2UuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIHNvbWUgaW50ZXJlc3Rpbmcgc3RyZXJyb3JfcigpIGtub3dsZWRnZS4gZ2xpYmMgaGFzIGl0cwogIG93biBBUEkgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBQT1NJWCBvbmUuIERhbmllbCBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIGRldGVjdCB0aGUgdmVyc2lvbiBpbiB1c2UsIGFuZCB0aGUgY29kZSBub3cgdXNlcyB0aGUgbmV3IGRlZmluZXMKICBhY2NvcmRpbmdseS4KCi0gRml4ZWQgc29tZSBidWlsZCBmbGF3cyB3aXRoIHRoZSBuZXcgbGliL2N1cmxfc3RyZXJyb3IuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjQgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeCB0byByZXBsYWNlIHRoZSBiYWQgdXNlIG9mIHN0cmVycm9yKCkuIFRoaXMgaW50cm9kdWNlcwogIEN1cmxfc3RyZXJyb3IoKSB0aGF0IGF0dGVtcHRzIHRvIGJlIHRocmVhZC1zYWZlIF9hbmRfIHdvcmtzIG9uIFdpbmRvd3MgdG9vIQoKLSBUb3IgQXJudHNlbiBzcGVsbC1maXhlZCBsb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzLgoKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3RjdXJsLnBsIHdvcmsgd2l0aCBvbGRlciBwZXJsIDUgdmVyc2lvbnMsIGFuZCBEYW5pZWwKICBtYWRlIGl0IG5vdCB1c2UgY2hkaXIgLi4gdG8gZ28gYmFjaywgYXMgdGhhdCBpc24ndCB2ZXJ5IGdvb2Qgd2hlbiB5b3UndmUKICBzZXR1cCBhIHRlc3RkaXIgY29udGFpbmluZyBzeW1saW5rcy4KCi0gQWRkZWQgYSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyMyBNYXJjaCAyMDA0KQotIEFkZGVkIEdyZWcgSGV3Z2lsbCdzIHRlc3RjdXJsLnBsIHNjcmlwdCB0byBDVlMuIFdlIGhhdmUgbm90IG1vdmVkIG92ZXIgdG8KICB1c2UgdGhpcyBzY3JpcHQgZm9yIHRoZSByZWFsIGRpc3RyaWJ1dGVkIHRlc3RpbmcganVzdCB5ZXQsIGJ1dCBpdCBpcyBvbmx5CiAgYSBtYXR0ZXIgb2YgdGltZS4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IG1ha2VzIGN1cmwgcmVwb3J0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICBpZiAtLWludGVyZmFjZSBmYWlscyBvbiB3aW5kb3dzLgoKLSBUaGUgcmVndWxhciBwcm9ncmVzcyBtZXRlciBpcyBub3cgZml4ZWQgdG8gbmV2ZXIgd3JhcCBkdWUgdG8gbG9uZyBsaW5lcy4gQWxsCiAgZmllbGRzIGFyZSBub3cgc3RhdGljIHNpemVkLiBJZiB0aGUgdGltZSBpbiB0aGUgdGltZSBmaWVsZHMgZ2V0IGEgdGltZSB2YWx1ZQogIHRoYXQgd291bGQgcmVwcmVzZW50IGEgdGltZSB0aGF0IGlzIDEwMCBob3VycyBvciBtb3JlIChpZiBub3QsIGl0IHJlbWFpbnMKICB1c2luZyBhIEhIOk1NOlNTIGRpc3BsYXkpLCBpdCBzd2l0Y2hlcyBmaXJzdCB0byBhICJOTk5kIE5OaCIgZGlzcGxheSAoZm9yCiAgZGF5cyBhbmQgaG91cnMpIGFuZCBpZiB0aGF0IGlzbid0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhICJOTk5kIiBkaXNwbGF5IGlmCiAgaXQgaXMgbW9yZSB0aGFuIDk5OSBkYXlzLgoKICBTZXZlcmFsIG9mIHRoZSBjYWxjdWxhdGlvbnMgd2VyZSBhbHNvIG1vdmVkIHRvIGZpeGVkLXBvaW50IG1hdGggaW5zdGVhZCBvZgogIHVzaW5nIGRvdWJsZXMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDQpCi0gR2xlbiBOYWthbXVyYSBub3RpY2VkIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGRpZG4ndCB3b3JrIGFzIGl0CiAgdXNlZCB0byBkbyBpZiBDVVJMT1BUX05PQk9EWSBpcyBzZXQgVFJVRS4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gcGFja2FnZSBtYWtlZmlsZSBhbmQgUkVBRE1FIHRvIGFkanVzdCB0bwogIG5ldyBjeWd3aW4gcGFja2FnaW5nIGd1aWRlbGluZXMuCgotIEVuYWJsZWQgIk5UIHJlc3BvbnNlcyIgaW4gdGhlIE5UTE0gYXV0aGVudGljYXRpb24uIERvaW5nIHRoaXMgc2ltcGx5IG1lYW5zCiAgdGhhdCB3ZSBwcm92aWRlIGFuIGV4dHJhIGNodW5rIG9mIGRhdGEgaW4gZWFjaCAidHlwZS0zIG1lc3NhZ2UiLiBUaGUgb25seQogIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGl0IHNlZW1zIHRoYXQgdXNpbmcgb25seSB0aGUgIkxhbm1hbmFnZXIgaGFzaCIKICAoYXMgd2UndmUgYmVlbiBkb2luZyB1bnRpbCBub3cpIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTQKICBjaGFyYWN0ZXJzIGFuZCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIHVzZXJzIG91dCB0aGVyZSB3aG8gd2FudCB0byB1c2UKICBsaWJjdXJsIGFuZCBOVExNIHdpdGggc3VjaCBwYXNzd29yZHMhIDstKSBTZXZlbiBOVExNLXJlbGF0ZWQgdGVzdCBjYXNlcyB3ZXJlCiAgdXBkYXRlZCBhY2NvcmRpbmdseS4gTWVudGlvbmVkIGFzIGlzc3VlIDI5IGluIFRPRE8tUkVMRUFTRSwgYnVnIHJlcG9ydAogICM5MTU2MDkKCi0gTW92ZWQgdGhlIGdlbmVyYXRlZCBsaWJjdXJsIHZlcnNpb24gaW5mbyB0byBhIG5ldyBoZWFkZXIgZmlsZSwgbmFtZWQKICBjdXJsL2N1cmx2ZXIuaC4gTm93IGludGVyZXN0ZWQgcGFydGllcyBjYW4gaW5jbHVkZSBPTkxZIHZlcnNpb24gaW5mbywgc2hvdWxkCiAgYW55b25lIHdhbnQgdGhhdCAoYW5kIGl0IHNlZW1zIGF0IGxlYXN0IHNvbWUgd2luZG93cyByZXNvdXJjZSBmaWxlcyB3b3VsZCkuCiAgTWVudGlvbmVkIGFzIGlzc3VlIDI3IGluIFRPRE8tUkVMRUFTRS4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgcm9vdCBNYWtlZmlsZSB0byB1c2UgdGFicyBmb3IgdGhlIG5ldHdhcmUgdGFyZ2V0LiBH/G50ZXIgS25hdWYKICBwb2ludGVkIHRoaXMgb3V0LgoKLSBNYXJ0eSBLdWhydCdzIFZNUyBjbGVhbnVwCgotIFRob21hcyBTY2h3aW5nZSBtYWRlIGJ1aWxkY29uZiByZWNvZ25pemUgQUNMT0NBTF9GTEFHUyB0byBpbnZva2UgYWNsb2NhbAogIHdpdGggcGFydGljdWxhciBwcmUtZGV0ZXJtaW5lZCBvcHRpb25zLgoKVmVyc2lvbiA3LjExLjEgKDE5IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDQpCi0gVG9yIEFybnRzZW4gYnJvdWdodCBzb21lIGluZm8gYWJvdXQgU0dJIElSSVg6CgogIElSSVggc3VwcG9ydHMgMyBkaWZmZXJlbnQgZXhlY3V0YWJsZS9vYmplY3QgZm9ybWF0cywgLTMyLCAtbjMyIGFuZCAtNjQuCiAgLW4zMiBpcyBkZWZhdWx0IDMyLWJpdCBmb3JtYXQsIC0zMiBpcyB0aGUgIm9sZCIgMzItYml0IGZvcm1hdCwgYW5kIC02NCBpcwogIHRoZSA2NC1iaXQgZm9ybWF0LiAgTGlicmFyaWVzIGZvciB0aGUgZGlmZmVyZW50IGZvcm1hdHMgYXJlIGluIGxpYiwgbGliMzIKICBhbmQgbGliNjQgcmVzcGVjdGl2ZWx5LgoKICBXZSd2ZSBub3cgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRhcHQgdG8gdGhpcyB3aGVuIHNjYW5uaW5nIGZvcgogIDNyZCBwYXJ0eSBsaWJzLCBzdWNoIGFzIE9wZW5TU0wuCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDQpCi0gV2F0eiBwb2ludGVkIG91dCBhIGZldyBtaXNzaW5nIGZpbGVzIGluIHRoZSBNU1ZDIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS4KCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcywgY29kZSBhbmQgbWFrZWZpbGVzIHRvIGJ1aWxkIGN1cmwgb24gTm92ZWxsCiAgTmV0V2FyZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNCkKLSBMb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzIHdlcmUgdXBkYXRlZCB0byBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWFuCiAgcGFnZXMgdGhlIHJlY29nbml6ZWQgd2F5IHNvIHRoYXQgdGhleSBhcHBlYXIgYXMgbmljZSBoeXBlcmxpbmtzIGluIHRoZSBIVE1MCiAgdmVyc2lvbnMuCgotIGJ1aWxkY29uZiBub3cgY2hlY2tzIHRoZSBtNCB2ZXJzaW9uIHRvbywgc2luY2UgYXV0b2NvbmYgcmVxdWlyZXMgYSBHTlUgbTQKICB2ZXJzaW9uIHRvIGJ1aWxkIHByb3BlciBjb25maWd1cmUgc2NyaXB0cy4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkVfTEFSR0UsIHRoZSBsYXJnZSBmaWxlIHZlcnNpb24gb2YKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gYWxsb3cgUE9TVHMgbGFyZ2VyIHRoYW4gMkdCLgoKLSBEYXZpZCBCeXJvbiBmaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNhc2UvY3Jhc2guCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDQpCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGRlYWwgd2l0aCByZWNlaXZlZCBzaWduYWxzIGR1cmluZyB0aGUKICBjb25uZWN0LgoKLSBDaGFuZ2VkIHRoZSBPUyBzdHJpbmcgZm9yIHdpbjMyIHRvIGJlY29tZSAiaTM4Ni1wYy13aW4zMiIuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNCkKLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbHMgdG8gdXNlIGN1cmxfc29ja2V0X3QgZm9yIHNvY2tldCB2YXJpYWJsZSB0eXBlLiBUaGlzCiAgc2hvdWxkIGVuYWJsZSB1cyB0byBidWlsZCB3aXRoIGxlc3Mgd2FybmluZ3Mgb24gV2luZG93cywgd2hlcmUgU09DS0VUIGlzCiAgdXNlZCB3aGljaCBpcyBhbiB1bnNpZ25lZCBpbnQsIHdoaWxlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHVzZSBhIG1lcmUgaW50LgoKLSBNb2RpZmllZCBsaWIvY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSBvbiBNU1ZDIGFnYWluLgoKVmVyc2lvbiA3LjExLjEtcHJlMSAoOCBNYXJjaCAyMDA0KQoKRGFuaWVsICg4IE1hcmNoIDIwMDQpCi0gTWlub3IgZml4IHRvIG1ha2UgY3VybCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGlzIG9ubHkgc2V0IGlmIGN1cmxfb2ZmX3QgaXMKICBsYXJnZXIgdGhhbiA0IGJ5dGVzLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSW1wcm92ZWQgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIHNvIGNhbGxlZCBpc3N1ZSAxMi4KCi0gTW9kaWZpZWQgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgYSBsb3QgdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBjaGFuZ2VzIGZvcgogIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24gKGxpa2UgdGVzdCBjYXNlIDg4KS4gQWRkZWQgQW5kculzCiAgR2FyY+1hJ3Mgd2luMzItY2hhbmdlcy4gSW1wcm92ZWQgdGhlIGxvZ2dpbmcuCgotIEZpeGVkIHRoZSBmaWxlOi1yZWxhdGVkIHByb2dyZXNzL2dldGluZm8gc3R1ZmYgYSBiaXQgbW9yZS4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEkgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjoKICBoZWFkZXIgb3Igd2hlbiBkb2luZyBtdWx0aXBsZS1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9ucy4gQSBzdWJzZXF1ZW50IHJlcXVlc3QKICBjb3VsZCBlcnJvbmVvdXNseSByZS11c2UgYSBwcmV2aW91cyBjb25uZWN0aW9uIHRoYXQgd2FzIHNlbnQgd2l0aAogIENvbm5lY3Rpb246IGNsb3NlLiBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQuCgotIEFuZHLpcyBHYXJj7WEgcGF0Y2hlZCBjdXJsIHRvIHByZXZlbnQgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nIHdpdGggbWluZ3csCiAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgYm90aCBXSU4zMiBhbmQgSEFWRV9DT05GSUdfSAogIGRlZmluZWQuCgotIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGZyb20gYSBmaWxlOiBVUkwsIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgb3RoZXIKICB0cmFuc2ZlciBtZXRyaWNzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkuCgotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgInZlcnNpb24gcmVzb3VyY2UiIGZpbGUgdG8gdGhlIGN1cmwgZXhlY3V0YWJsZSBmb3IKICB0aGUgd2luZG93cyBidWlsZHMuCgpEYW5pZWwgKDMgTWFyY2ggMjAwNCkKLSBEYXZpZCBCeXJvbidzIHdvcmsgb24gbWFraW5nIGxpYmN1cmwgb25seSByZXF1aXJlIHdpbnNvY2sgMS4xIG9uIFdpbmRvd3MKICBtYWNoaW5lcy4KCi0gTW9yZSB2YXJpYWJsZSBjbGVhbnVwcyBiYXNlZCBvbiBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgVG9yIEFybnRzZW4ncwogIGF1dG9idWlsZHMgd2l0aCBNSVBTUHJvLgoKLSBKb2UgSGFscGluIGhlbHBlZCB1cyBmaXggc29tZSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBvbiBGcmVlQlNELgoKLSBBcHBsaWVkIFRvbSBCYXRlcycgcGF0Y2ggdG8gYnVpbGQgb24gbnNyLXRhbmRlbS1uc2suCgotIERhbiBGYW5kcmljaCBjb3JyZWN0ZWQgc29tZSBmbGF3cyBpbiB0aGUgY29uZmlndXJlIEdTUyBkZXRlY3Rpb24uCgpEYW5pZWwgKDIgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgbGliY3VybCBjb2RlIHRvIHVzZSBGT1JNQVRfT0ZGX1QgZm9yIHByaW50ZigpIGZvcm1hdHRpbmcKICBjdXJsX29mZl90IHR5cGVzIGludGVybmFsbHkuCgpEYW5pZWwgKDEgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGFzIGEgZmVhdHVyZS1iaXQgaW4gdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkKICByZXNwb25zZSwgdGhhdCBzaWduYWxzIGlmIHRoaXMgbGliY3VybCBzdXBwb3J0cyA+MkdCIGZpbGVzLiBjdXJsIC1WIG5vdwogIG91dHB1dHMgJ0xhcmdlZmlsZScgaW4gdGhlIEZlYXR1cmVzOiBmaWVsZCBpZiB0aGlzIGlzIHRoZSBjYXNlLiBNb3N0IHN5c3RlbXMKICBhcmUgbGlrZWx5IHRvIHN1cHBvcnQgdGhpcy4KCi0gV2Ugb2ZmZXIgYSBDVVJMX0ZPUk1BVF9PRkZfVCBkZWZpbmUgaW4gdGhlIHB1YmxpYyBoZWFkZXIsIHdoaWNoIGNhbiBiZSB1c2VkCiAgdG8gcHJpbnRmKCkgY3VybF9vZmZfdCB2YXJpYWJsZXMuIFdlIGFsc28gbW9kaWZpZWQgdGhlIGxpYmN1cmwgc291cmNlcyB0bwogIHVzZSB0aGlzIGRlZmluZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAlT2QgYXBwcm9hY2ggKGFsdGhvdWdoIEkndmUgbGVmdCB0aGUKICBPLWZsYWcgZnVuY3Rpb25hbCBpbiB0aGUgY29kZSkuIFRoaXMgc2hvdWxkIGFsc28gcHJldmVudCBjb21waWxlcnMgdG8gd2FybgogIG9uIHRoZSBob21lLWdyb3duIG9wdGlvbi4KCi0gRml4ZWQgdGhlIHJlc3VtZS1jaGVjayBjb2RlIHRvIHRlc3QgZm9yIGEgd29ya2luZyByZXN1bWUgYXQgdGhlIGVuZCBvZiB0aGUKICBoZWFkZXJzIGFuZCBub3QgYXQgdGhlIGZpcnN0IGJvZHktYnl0ZS4KCi0gQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gU3RvcCB1c2luZyBpdC4gSWYKICB5b3UgbmVlZCBhIGdsb2JhbCBETlMgY2FjaGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgdXNlIHRoZSBzaGFyZSBpbnRlcmZhY2UgYW5kCiAgeW91J2xsIGdldCBhIGdsb2JhbCBjYWNoZSB0aGF0IHdvcmtzIHRoZSB3YXkgaXQgc2hvdWxkIHdvcmsuIFlvdSBjYW4gZXZlbgogIGhhdmUgYW55IG51bWJlciBvZiBnbG9iYWwgY2FjaGVzLCBhbGwgYXQgeW91ciBjb21tYW5kLiBUaGlzIGlzIG5vdyBhbHNvCiAgbWVudGlvbmVkIGluIHRoZSBkb2NzLgoKLSBNYWRlIHRoZSAqcHJpbnRmIGNvZGUgc3VwcG9ydCB0aGUgei1mbGFnIHRvIGVuYWJsZSBzaXplX3QgcHJpbnRmKCkgaW4gYQogIG1hbm5lciBzaW1pbGFyIHRvIGhvdyBnbGliYyBhbGxvd3MgaXQuIFRvIG1ha2UgcHJpbnRmaW5nIG9mIHRoaXMgd29yayBvbgogIHBsYXRmb3JtcyB3aXRoIDY0Yml0IHNpemVfdCBhbmQgMzJiaXQgaW50cy4gSWYgdGhlcmUgZXZlbiBhcmUgYW55ISA7LSkKCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3UgQ1VSTE9QVF9GUkVTSF9DT05ORUNUIGFuZAogIENVUkxBVVRIX05UTE0gKG9yIENVUkxBVVRIX0FOWSBhbmQgbGliY3VybCB0aGVuIHBpY2tlZCBOVExNKSwgbGliY3VybCB3b3VsZAogIGxvb3Agd2l0aG91dCBzdWNjZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZSBkdWUgdG8gdGhlIG5ldyBjb25uZWN0aW9uIHRoYXQgd2FzCiAgbWFkZSBmb3IgYWxsIHJvdW5kLXRyaXBzIGluIHRoZSBhdXRoZW50aWNhdGlvbi4gTm93LCB0aGUgRlJFU0hfQ09OTkVDVCBpcwogIHJlbWFkZSB0byBvbmx5IG1hdHRlciBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24gbWFkZSB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgYWxsIHRoZSByZXN0IHRoYXQgbWlnaHQgZm9sbG93IGR1ZSB0byBGT0xMT1dMT0NBVElPTiBvciBIVFRQCiAgYXV0aGVudGljYXRpb24gYXJlIG5vdyBpZ25vcmluZyB0aGF0IG9wdGlvbi4KCi0gQWRqdXN0ZWQgdGhlIFFVSVQgY29kZSBzbGlnaHRseSBzaW5jZSBpdCBjb3VsZCBjb3JlLWR1bXAuCgotIENvcnJlY3RlZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gcHJvdmlkZSBhIGNvcnJlY3Qgc2l6ZSB0byB0aGUKICAndmVyaWZpZWRzZXJ2ZXInIHJlcXVlc3QuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDQpCi0gSm9lIEhhbHBpbiBtYWRlIHRoZSBGVFAgY29kZSBzZW5kIFFVSVQgb24gdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBiZWZvcmUKICBkaXNjb25uZWN0aW5nIHRoZSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyB3aGF0IGdvb2QtYmVoYXZpbmcgZnRwIGNsaWVudHMKICBzaG91bGQgZG8uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gdXBkYXRlZCBzZXZlcmFsIGZpbGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE1TVkMgNi4gSGUKICBhbHNvIGFkZGVkIHRoZSAnYnVpbGRjb25mLmJhdCcgdGhhdCB3b3JrcyBsaWtlIHRoZSAnYnVpbGRjb25mICsgY29uZmlndXJlJwogIGNvbWJvIGRvZXMgb24gdW5peGVzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtZW1kZWJ1ZyBzdHVmZiBzdXBwb3J0IGNhbGxvYygpIGFzIHdlbGwuCgotIFRvciBBcm50c2VuIHBvaW50ZWQgb3V0IHRoYXQgdGVzdGN1cmwuc2ggbmVlZGVkIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdGVkCiAgZmlsZXMgaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIHJlLWdlbmVyYXRlZCBpbiBlYWNoIGJ1aWxkLgoKLSBBbmR5IFNlcnBhIGZvdW5kIG91dCB0aGF0IHRoZSBzaGFyZSBpbnRlcmZhY2UgZGlkIG5vdCBlbmpveSBsaWZlIHdoZW4gbm90CiAgaGF2aW5nIHRoZSBsb2NrIGFuZCB1bmxvY2sgY2FsbGJhY2tzIHNldCwgZXZlbiB0aG91Z2ggZG9jdW1lbnRlZCB0byBiZQogIE9LLiBJdCBzdGlsbCBpcyBPSywgYW5kIG5vdyB0aGUgY29kZSB3b24ndCBzZWdmYXVsdCBhbnltb3JlIQoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR3JlZyBIZXdnaWxsIEkgbW9kaWZpZWQgaG93IGxvbmcgbG9uZyBpcyB1c2VkIGluIHRoZQogIG1wcmludGYgY29kZSwgYXMgd2UgY2FuIHVzZSBhIDY0Yml0IHR5cGUgd2l0aCBNU1ZDIHRoYXQgaXMgYSBsb25nIGxvbmcKICBlcXVpdmFsZW50LiBUaGlzIGNvcnJlY3RzIHNvbWUgd2VpcmQgbGFyZ2UgZmlsZSBiZWhhdmlvcnMgb24gd2luZG93cy4KCi0gVG9yIEFybnRzZW4gaGVscGVkIG1lIHdvcmsgb3V0IC0tZW5hYmxlLWRlYnVnIHRvIHdvcmsgYmV0dGVyIHdpdGggZGlmZmVyZW50CiAgdmVyc2lvbnMgb2YgdGhlIGdjYyBhbmQgaWNjIGNvbXBpbGVycy4KCi0gQWRkZWQgQ1VSTE9QVF9TSEFSRSB0byB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA0KQotIEFwcGxpZWQgdGhlIGZpbmFsIHBpZWNlcyBvZiBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgYnJpbmdzIGEgd29ya2luZyBuYW1lCiAgcmVzb2x2ZSB0aW1lb3V0IHRvIHRoZSB3aW5kb3dzIHZlcnNpb25zIG9mIGN1cmwhCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24ncyBmaXggdG8gYWxsb3cgdGhlIHNwZWVkLWxpbWl0IGxvZ2ljIHdvcmsgZXZlbiBpZiB5b3Ugc2V0CiAgbGltaXQtcmF0ZS4gSXQgZG9lcyB3b3JrIG9uIHRoZSBleHBlbnNlIG9mIHRoZSByYXRlIGxpbWl0ZXIuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDQpCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHdpdGggZ2NjIG5vdyBhbHNvIHRyaWVzIHRvIGRldGVjdCB0aGUgaWNjIGNvbXBpbGVyCiAgKHdoaWNoIHNvbWVob3cgZ2V0cyB0cmVhdGVkIGFzIGlmIGl0IGlzIGEgZ2NjKSB0byBzdG9wIHVzaW5nIGFsbCB0aGUgZ2NjCiAgb3B0aW9ucyB3aXRoIGl0LCBhbmQgd2UgYWxzbyBwcm92aWRlIC1pc3lzdGVtIG9wdGlvbnMgZm9yIGVhY2ggZXh0cmEgLUkKICBvcHRpb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIGZpZ3VyZWQgb3V0IChmb3IgT3BlblNTTCwga2VyYmVyb3MsIHpsaWIsCiAgSGVpbWRhbCBldGMpLiBUaGlzIG9mIGNvdXJzZSB0byBwcmV2ZW50IHdhcm5pbmdzIG9uIGhlYWRlcnMgd2UgZG9uJ3QgaGF2ZQogIGNvbnRyb2wgb2YuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDQpCi0gRG91ZyBQb3J0ZXIgbWFkZSBsaWJjdXJsIHVzZSB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhlCiAgZ2V0cHd1aWQgcmVzdWx0cyB3aGVuIGxvb2tpbmcgZm9yIC5uZXRyYyBmaWxlcy4KCi0gSWYgJ2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZycgaXMgdXNlZCB3aXRoIGdjYywgaXQgbm93IGNoZWNrcyB3aGljaCBnY2MKICB2ZXJzaW9uIGl0IGlzIGFuZCB1c2VzIGFzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgYXMgcG9zc2libGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgdmVyc2lvbi4KCi0gQ29kZSB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyBtYWRlIHRvIHVzZQogIHRoZSBjdXJseF8gcHJlZml4LiBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlIGxpa2UgdGhpcyBpcyB0aGUKICBjdXJseF9zdHJ0b2xsKCkgZnVuY3Rpb24uIFRoaXMgaXMgbWFkZSB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBleGlzdGluZyBjb2RlLAogIGJ1dCB3aXRob3V0IHBvbGx1dGluZyB0aGUgbGliY3VybCBBUEkuIEZ1cnRoZXIgZXhwbGFuYXRpb25zIHBvc3RlZCBoZXJlOgoKICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNC0wMi8wMjE1Lmh0bWwKCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBidWlsZGNvbmYgdG8gbm90IHVzZSAid2hpY2giIGFzIEFJWCBhbmQgVHJ1NjQgaGF2ZSB3aGF0IGhhdmUgYmVlbgogIHJlZmVycmVkIHRvIGFzICJob3JyaWJseSBicm9rZW4gJ3doaWNoJyBwcm9ncmFtcyIuCgotIE1hZGUgc3VyZSBkbnMgY2FjaGUgdGltZW91dCBzZXQgdG8gLTEgcmVhbGx5IG1lYW5zIGNhY2hpbmcgZm9yZXZlci4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNCkKLSBNYWRlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGMtYXJlcyB3aXRoIHRoZSBsaWJjdXJsIG1lbWRlYnVnIHN5c3RlbSB0byBiZXR0ZXIKICB0cmFjayBtZW1vcnkuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDQpCi0gV2hlbiB1c2luZyBhcmVzLCB3ZSBub3cgaW5pdGlhbGl6ZSB0aGUgYXJlcyAnY2hhbm5lbCcgaW4gY3VybF9lYXN5X2luaXQoKQogIGFuZCByZS11c2UgdGhhdCBzYW1lIGhhbmRsZSBkdXJpbmcgdGhlIGVudGlyZSBjdXJsIGhhbmRsZSdzIGxpZmUtdGltZS4gSXQKICBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KCi0gRml4ZWQgYSBwcm9ibGVtIHdoZW4gZGlzcGxheWluZyB2ZXJib3NlIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMgYW5kCiAgcmUtdXNlZCBjb25uZWN0aW9ucy4gUHJvYmxlbSByZXBvcnRlZCBhbmQgZml4IHZlcmlmaWVkIGJ5IEdyaWdvcnkgRW50aW4uCgotIEplZmYgTGF3c29uIGZpeGVkIHRoZSB2ZXJzaW9uLWNoZWNrIGluIHRoZSBTT0NLUzUgY29kZS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBhIGNhc2Ugd2hlcmUgYSBob3N0IGNhY2hlIGVudHJ5IHdhcyBub3QgZmxhZ2dlZCBpbi11c2UgcHJvcGVybHkgd2hlbiBhCiAgY2FjaGVkIGVudHJ5IHdhcyB1c2VkLgoKLSBBbmRy6XMgR2FyY+1hJ3MgcGF0Y2ggdGhhdCBjaGVja3MgZm9yIHdpbm1tIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDQpCi0gQmVuIEdyZWVhcidzIFNPX0JJTkRUT0RFVklDRSBwYXRjaCBmb3IgdGhlIGJpbmRpbmcgb2YgdGhlIGxvY2FsIGVuZCB0byBhCiAgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UuCgotIEdyZWcgSGV3Z2lsbCBmb3VuZCBvdXQgdGhhdCB0aGUgdmFyaWFibGUgaG9sZGluZyAnY29udGVudGxlbmd0aCcgd2Fzbid0IGJpZwogIGVub3VnaCB0byBob2xkIGEgbGFyZ2UgZmlsZSEKCi0gVG9yIEFybnRzZW4gZml4ZWQgYSA2NGJpdC1yZWxhdGVkIHByb2JsZW0gaW4gZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhlIGZ0cAogIGRlcGFydG1lbnQsIGFuZCB0aGVyZSB3YXMgYW5vdGhlciBwb3RlbnRpYWwgcHJvYmxlbSBpbiB0aGUgbmFtZSByZXNvbHZlIGNvZGUKICB0b28uCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDQpCi0gUmVtb3ZlZCBhIGZldyB2YXJpYWJsZXMgdGhhdCB3ZXJlIG9ubHkgc2V0IGJ1dCBuZXZlciB1c2VkLCBhcyBzb21lIGNvbXBpbGVycwogIHdhcm4gYWJvdXQgdGhhdCBhbmQgd2UgZG8gbm90IGxpa2UgY29tcGlsZXIgd2FybmluZ3MhCgotIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHN5bWxpbmtzIGluIHRoZSB0ZXN0cy9kYXRhIGRpcmVjdG9yeSBpZiBjdXJsIGlzIGJ1aWx0CiAgb3V0c2lkZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlICdtYWtlIHRlc3QnIGlzIHVzZWQuIFRoaXMgd2FzIGRvbmUKICBieSBwcm92aWRpbmcgYSAic291cmNlIGRpciBwYXRoIiB0byB0aGUgc2NyaXB0cy9zZXJ2ZXJzLgoKLSBOb3csIGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGZpbmQgYW4gbnJvZmYgdG9vbCBvciBhbiBvcHRpb24gdG8gbnJvZmYKICB0byB1c2UgdG8gY29udmVydCBtYW4gcGFnZXMgd2l0aCwgaXQgd2lsbCBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGJ1aWx0LWluCiAgbWFudWFsLgoKLSAnY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwnIGNvbXBsZXRlbHkgZGlzYWJsZXMgdGhlIGJ1aWx0LWluIG1hbnVhbCBmcm9tCiAgdGhlIGN1cmwgY29tbWFuZCB0b29sLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBhIG1pbm9yIHNvdXJjZSBlZGl0LCBhbmQgbm93CiAgaGUgaGFzIG1hbmFnZWQgdG8gZ2V0IG1zeXMvbWluZ3cgdG8gcnVuIGNvbmZpZ3VyZSBhbmQgdGhlbiBidWlsZCEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDA0KQotIFRoZSBkZWZhdWx0IEhUVFAgQWNjZXB0OiBoZWFkZXIgd2FzIG1vZGlmaWVkIHRvIHRoZSBtdWNoIHNpbXBsZXIKICAiQWNjZXB0OiAqLyoiLgoKLSBQIFIgU2NoYWZmbmVyIHVwZGF0ZWQgdGhlIGN1cmwtc3NsIHNwZWMgZmlsZSBmb3IgUlBNcy4KCi0gRG9taW5pY2sgTWVnbGlvIGJyb3VnaHQgbG90cyBvZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2hhcmUgaW50ZXJmYWNlJ3MgbWFuCiAgcGFnZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbWlzc2luZy4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgd29yay1hcm91bmQgYSBidWcgaW4gdGhlCiAgQUlYNSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRhZGRyaW5mbygpLiBUaGlzIG1ha2VzIHRoZSBGVFAgUE9SVCBzdHVmZiB3b3JrIG9uCiAgSVB2Ni1lbmFibGVkIEFJWCBidWlsZHMuCgotIEtlbiBSYXN0YXR0ZXIgcHJvdmlkZWQgcG9ydGFiaWxpdHkgZml4ZXMgZm9yIHRoZSBjdXJsZ3RrLmMgZXhhbXBsZSwgYW5kIG5vdwogIGl0IHJ1bnMgb24gd2luZG93cyB3aXRoIEdUSyBhcyB3ZWxsIQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgZ2V0aG9zdGJ5bmFtZSgpIGZpbmUgd2hlbiBydW4KICB3aXRoIG1pbmd3IG9uIHdpbmRvd3MuCgotIE1vZGlmaWVkIHRoZSBsZGFwIGNvZGUgdG8gdXNlIHByb3BlciBmdW5jdGlvbiBwb2ludGVycyBhbGwgb3ZlciAoaW5zdGVhZCBvZgogIG1peGVkIGRhdGEgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzKSB0byB3b3JrLWFyb3VuZCB0aGUgcGlja3kgTUlQU1BybyBjb21waWxlcgogIHdhcm5pbmdzLgoKLSBBIGN1c3RvbSBIb3N0OiBoZWFkZXIgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBtYWRlIGJ5CiAgZm9sbG93aW5nIGEgbG9jYXRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggVGltIEJha2VyLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGxpYnogcGFydCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgb25seSBzZXQgdGhlIHR3byBsaWJ6LXJlbGF0ZWQKICBkZWZpbmUgSEFWRV9aTElCX0ggYW5kIEhBVkVfTElCWiBpZiBib3RoIHRoZSBsaWIgYW5kIHRoZSBoZWFkZXIgaXMgZm91bmQuCiAgSWYgb25lIGlzIG1pc3NpbmcsIG5vbmUgb2YgdGhlIGRlZmluZXMgaXMgc2V0LgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBNaW5ndyBtYWtlZmlsZXMuCgotIExlbiBLcmF1c2UgcmVwb3J0ZWQgdGhhdCBjdXJsIDcuOS5YIGNvdWxkIGRvIHVwbG9hZGluZyBmcm9tIHN0ZGluIHdpdGhvdXQKICBkb2luZyBjaHVua2VkIGVuY29kaW5nLCB3aGljaCBjdXJyZW50IGN1cmwgY2Fubm90IGRvIGV2ZW4gaWYgeW91IGRpc2FibGUKICB0aGUgdHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZCBoZWFkZXIuIE5vdyBpdCBjYW4gYWdhaW4sIGFuZCB0ZXN0IGNhc2UgOTgKICB2ZXJpZmllcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRvciBBcm50c2VuIGZpeGVkIGEgd2VpcmQgZ2V0YWRkcmluZm8oKSB1c2FnZSBpbiB0aGUgRlRQIGNvZGUsIHByZXZlbnRpbmcKICB0aGUgSVB2Ni1jb2RlIGZvciBQT1JUIHdvcmsgb24gQUlYIDUuMi4gV2Ugbm93IGFsc28gcHJvdmlkZSAoYmV0dGVyKSBlcnJvcgogIG1lc3NhZ2VzIHdoZW4gYmFpbGluZyBvdXQgaW4gdGhlIHRoYXQgZnVuY3Rpb24uCgotIFRvciBBcm50c2VuIG5vdyBwcm92aWRlcyBBSVggYW5kIElSSVggKHVzaW5nIGdjYywgeGxjIGFuZCB0aGUgTUlQU1BybwogIGNvbXBpbGVycykgYXV0b21hdGVkIGJ1aWxkIGxvZ3MgKGh0dHA6Ly9jdXJsLmhheHguc2UvYXV0by8pIGFuZCB3ZSd2ZSBmaXhlZAogIG51bWVyb3VzIG1pbm9yIHF1aXJrcyB0byBtYWtlIGxlc3Mgd2FybmluZ3MgYXBwZWFyLgoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaWxhZCwgd2Ugbm93IHVzZSB0aGUgY3VzdG9tIHRpbWVvdXRzIHdoZW4gd2FpdGluZyBmb3IgYQogIHNlcnZlciB0byBjb25uZWN0IHdoZW4gdXNpbmcgRlRQIFBPUlQuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHdhaXRlZCAxMAogIHNlY29uZHMsIG5vIG1vcmUgbm8gbGVzcy4gV2Ugbm93IGFsc28gY2hhbmdlZCB0aGUgZGVmYXVsdCAoaWYgbm8gdGltZW91dCBpcwogIHNldCkgdG8gd2FpdCA2MCBzZWNvbmRzIGZvciB0aGUgY29ubmVjdCBiZWZvcmUgd2UgZmFpbC4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA0KQotIE1vZGlmaWVkIHRvIGxpbmsgd2l0aCBjLWFyZXMgaW5zdGVhZCBvZiBhcmVzLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDQpCi0gQWRkZWQgYSBjb25maWd1cmUgdGVzdCB0byBjaGVjayBmb3Igd2hpY2ggb3B0aW9uIHRoZSAoZylucm9mZiB0b29sIHdhbnRzCiAgdG8gZXh0cmFjdCBwbGFpbiB0ZXh0IGZyb20gdGhlIG1hbiBwYWdlcy4gVG9yIEFybnRzZW4gdG9sZCB1cyB0aGUgQUlYCiAgdmVyc2lvbiBvZiBHTlUgZ25yb2ZmIGRvZXNuJ3Qgc3VwcG9ydCAtbWFuIQoKLSBBZGRlZCBhbiB1bmRlZiBvZiBhY2NlcHQgaW4gbWVtZGVidWcuaCB0byBtYWtlIGN1cmwgYnVpbGQgd2l0aCAtLWVuYWJsZS1kZWJ1ZwogIG9uIEFJWCA1LjIgd2hpY2ggc2VlbXMgdG8gaGF2ZSBhY2NlcHQgZGVmaW5lZC4gUmVwb3J0ZWQgYnkgVG9yIEFybnRzZW4uCgotIGN1cmxfdmVyc2lvbigpIG5vdyBpbmNsdWRlcyBjLWFyZXMgdmVyc2lvbiBpbmZvLCBhbmQgY3VybF92ZXJzaW9uX2luZm8oKSBub3cKICByZXR1cm5zIGEgc3RydWN0IHdpdGggdmVyc2lvbiBTRUNPTkQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoYXQgaW5mby4KCi0gV2UgYXJlIG5vdyBvZmZpY2lhbGx5IHVzaW5nIGMtYXJlcyBmb3IgYXN5bmNoIG5hbWUgcmVzb2x2ZXMuIGMtYXJlcyBpcyB0aGUKICBuZXcgbGlicmFyeSwgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGFyZXMgYnV0IHdpdGggYW4gZXh0ZW5kZWQgYW5kIHNsaWdodGx5CiAgbW9kaWZpZWQgQVBJLgoKLSBEaXJrIGltcHJvdmVkIHRoZSBhcmVzIHRpbWVvdXQgY29kZSwgYW5kIG5vdyB3ZSBhbHNvIGluY2x1ZGUgdGhlIGFyZXMgZXJyb3IKICBzdHJpbmcgd2hlbiB3ZSBmYWlsIHRvIHJlc29sdmUgYSBuYW1lLgoKLSBBbm90aGVyIHR3ZWFrIHRvIG1ha2UgdGVzdCBjYXNlIDkxIHJ1biBmaW5lLiBOb3cgd2UgaGF2ZSBhbm90aGVyIGJpdCBvbiBhCiAgY29ubmVjdGlvbiB0aGF0IGlzIHNldCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG1hcmtlZCBmb3IgJ3JldHJ5Jy4gVGhhdAogIG1ha2VzIHRoZSBjb25uZWN0aW9uIGdldCBjbG9zZWQgYW5kIHJlLW9wZW5lZCBhbmQgdGhlIEhUVFAtZG9uZSBjb2RlIG11c3QKICBub3QgY29tcGxhaW4gb24gdGhlIGZhY3QgdGhhdCBubyBkYXRhIHdhcyByZWNlaXZlZC4KCi0gQmFzZWQgb24gRGlyayBNYW5za2UncyBwYXRjaCwgSSBtb2RpZmllZCB0aGUgbmFtZSByZXNvbHZpbmcgd2l0aCBhcmVzIHRvCiAgZmVhdHVyZSBhIHRpbWVvdXQgZm9yIHJlYWxseSBzbG93IGxvb2t1cHMuIEl0IG5vdyBkZWZhdWx0cyB0byAzMDAgc2Vjb25kcywKICBidXQgaXMgbm93IGFkanVzdGVkIHRvIHRoZSBDT05ORUNUVElNRU9VVC9USU1PVUUgdGltZW91dHMgaWYgb25lIG9mIHRoZW0KICBpcyBzZXQuCgotIEZpeGVkIHRoZSBpbmNsdXNpb24gb2YgY2EtYnVuZGxlLmggdG8gcmVhbGx5IHVzZSB0aGUgb25lIGluIHRoZSBidWlsZCBkaXIKICBiZWZvcmUgdGhlIG9uZSBpbiB0aGUgc291cmNlIGRpci4gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IGFuZCByZXBvcnRlZC4KCi0gQWRkZWQgdGVzdCBjYXNlIDk3LCBhIHNpbXBsZSBQT1NUIHdpdGggYSBjdXN0b20gQ29udGVudC1UeXBlIGhlYWRlcgogIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uZS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA0KQotIEFkZGVkIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBmaXggdGhlIHRlc3QgOTEgZmFpbHVyZS4gQXMgaGFzIGJlZW4gZmlndXJlZCBvdXQKICBieSBQYXRyaWNrIFNtaXRoLCB0aGUgZXJyb3IgaGFwcGVucyBiZWNhdXNlIHdlIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB0aGUKICBzZXJ2ZXIgaXMganVzdCBhYm91dCB0byBjbG9zZSBhbmQgd2UgZXZlbiBtYW5hZ2UgdG8gc2VuZCBhd2F5IHRoZSByZXF1ZXN0CiAgd2l0aG91dCBzZWVpbmcgYW4gZXJyb3IuIE9uIHRoZSBmaXJzdCByZWFkIGF0dGVtcHQgd2UgZ2V0IGEgRUNPTk5SRVNFVC4KICBTdGFydGluZyBub3csIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHRoaXMgYW5kIGlmIHNvLCB3ZSByZXRyeSB0aGUgcmVxdWVzdCBvbiBhCiAgZnJlc2ggY29ubmVjdGlvbi4KCi0gSSBhZGRlZCB0ZXN0IGNhc2UgNTEwIHdoaWNoIGlzIGEgY3VzdG9tIHByb2dyYW0gdGhhdCBkb2VzIGEgUE9TVCB1c2luZyBhCiAgcmVhZCBjYWxsYmFjaywgd2l0aCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLgoKLSBBZGp1c3RlZCBvbmUgb2YgdGhlIE1QRS9pWCBjaGFuZ2VzIGFzIGl0IG1hZGUgdGVzdCBjYXNlIDUwNCBmYWlsIGFsbCBvdmVyLgoKLSBBZGRlZCAtLXNvY2tzIGFzIGEgcmVjb2duaXplZCBvcHRpb24uIEl0IHdvcmtzIGp1c3QgbGlrZSAtLXByb3h5IGJ1dCBzZXRzIGEKICBTT0NLUzUgcHJveHkgdG8gdXNlLiBTT0NLUzUgc3VwcG9ydCBoYXMgYmVlbiBhdmFpbGFibGUgaW4gbGliY3VybCBmb3IgYQogIHdoaWxlLCBqdXN0IG5vdCBwcm92aWRlZCBieSB0aGUgY3VybCB0b29sLiBUaGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGZvcgogIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA0KQotIFN0YWRsZXIgU3RlcGhhbiBwb2ludGVkIG91dCB0aGF0IHNyYy9odWdlaGVscC5jIGluY2x1ZGVkIGNvbmZpZy5oIHdpdGhvdXQKICBjaGVja2luZyB0aGUgZGVmaW5lIGlmIGl0cyBwcmVzZW50Li4uCgotIEtlbiBIaXJzY2ggcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiB0aGUgTVBFL2lYIG9wZXJhdGluZwogIHN5c3RlbS4KCi0gRGFuIEZhbmRyaWNoIGNvbXBpbGVkIGN1cmwgd2l0aCBsb3RzIG9mIGFnZ3Jlc3NpdmVseSBwZWRhbnRpYyBjb21waWxlcgogIG9wdGlvbnMgYW5kIHRodXMgZm91bmQgYSBmZXcgbWlub3IgZXJyb3JzIGFuZCBkaWQgc29tZSBnZW5lcmFsIGNsZWFudXBzIHRvCiAgYXZvaWQgdGhlbS4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBmbGF3IGluIGFyZXMgdGhhdCBwcmV2ZW50ZWQgaXQgdG8gdXNlIG5vbi1ibG9ja2luZwogIHNvY2tldHMgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNCkKLSBSaWNoYXJkIEJyYW1hbnRlIGZpeGVkIGNodW5rZWQgdHJhbnNmZXItZW5jb2RlZCAidXBsb2FkcyIgdG8gc2VuZCBhIGZpbmFsCiAgQ1JMRiBjb21ibyBwcm9wZXJseS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDA0KQotIE1hZGUgdGhlIHJlc3BvbnNlLWhlYWRlcnMgZHVyaW5nIGEgQ09OTkVDVCByZXF1ZXN0IHRvIGEgcHJveHkgZ2V0IHBhc3NlZCBvbgogIGFzIHJlZ3VsYXIgaGVhZGVycywgc28gdGhleSBhcHBlYXIgd2l0aCAtaS8tSSBvcHRpb25zIGFuZCBzaW1pbGFyLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpc2xlIFZhbmVtLCBJJ3ZlIG1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkKICBwcm9wZXJseSBzd2l0Y2ggdG8gYSBHQi1kaXNwbGF5IHdoZW4gbW9yZSB0aGFuIDk5OTlNQiBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIHBvaW50ZWQgb3V0IGEgY3VybHJjIHBhcnNlciBwcm9ibGVtL2NyYXNoIHdoZW4gYW4gb3B0aW9uIHdpdGggYQogIHJlcXVpcmVkIGRpZG4ndCBoYXZlIG9uZSBhbmQgd2FzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlLgoKLSBNb3JlIFdpbmRvd3MgZml4ZXMgZm9yIGxhcmdlIGZpbGVzLiBXZSBub3cgYnVpbGQgYW5kIGxpbmsgd2l0aAogIC4uL2xpYi9zdHJ0b29mZnQuYyBpbiB0aGUgYXBwIGNvZGUgc2luY2UgQ3VybF9zdHJ0b2xsKCkgaXMgbm90IGEgcHJvdmlkZWQKICBsaWJjdXJsIGZ1bmN0aW9uLi4uIFBlcmhhcHMgd2Ugc2hvdWxkIGNvbnNpZGVyIGEgJ2NvbW1vbicgZGlyIG9yIHNpbWlsYXIKICB3aGVyZSB3ZSBwdXQgc291cmNlIGNvZGUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIHRoZSBjbGllbnQuIE9yIHBlcmhhcHMKICB3ZSdsbCBqdXN0IG1ha2UgdGhpcyBmdW5jdGlvbiBhdmFpbGFibGUgaW4gdGhlIGxpYnJhcnkuLi4KCi0gVmluY2VudCBCcm9ubmVyIGZvdW5kIG91dCB0aGUgc29ja3M1IGNvZGUgY3Jhc2hlZCB3aGVuIG5vIHVzZXJuYW1lIHdhcwogIHNldC4KCi0gVmluY2VudCBCcm9ubmVyIHNwb3R0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgdXNlcm5hbWUvcGFzc3dvcmQgd2hlbiByZS11c2luZwogIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgoKLSBGaXhlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheSBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMl4zMSBieXRlcy4gR2lzbGUKICBWYW5lbSByZXBvcnRlZC4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgc3RydG9sbCgpIGdldCB1c2VkIHdoZW4gY3VybCBpcyBidWlsdCB3aXRoIHRoZSBtaW5ndwogIGNvbXBpbGVyLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY29tcHJlc3NlZCBoZWxwIHRleHQgY29kZSB0byBkaXNwbGF5IHByb3Blcmx5LgoKLSBSZW1vdmVkIHRoZSAnI2RlZmluZSBIdHRwUG9zdCcgZnJvbSB0aGUgcHVibGljIGhlYWRlciBmaWxlLCBhcyBjdXJsX2h0dHBwb3N0CiAgaXMgdGhlIHByb3BlciBuYW1lIGFuZCBpdCBoYXMgYmVlbiBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdy4gRml4ZXMgYW5vdGhlcgogIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKLSBBZGRlZCAnY3VybF9vZmZfdCcgdHlwZWRlZiBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlLCB0byBiZSB1c2VkIHRvIHByb3ZpZGUKICBsYXJnZSBmaWxlIHNpemVzIHRvIHRoZSAqX0xBUkdFIG9wdGlvbnMuIEFkanVzdGVkIHRoZSBjb2RlIGFsbCBvdmVyIHRvIHVzZQogIHRoaXMgdmFyaWFibGUgdHlwZSBpbnN0ZWFkIG9mICdvZmZfdCcuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBsYXJnZQogIGZpbGUgc3VwcG9ydCB3b3JrIG9uIG1vcmUgcGxhdGZvcm1zLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIHRoZQogIHNpemUgb2YgdGhlIGN1cmxfb2ZmX3QgaW5zdGVhZCBvZiB0aGUgcGxhaW4gb2ZmX3QuCgpWZXJzaW9uIDcuMTEuMCAoMjIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDQpCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlIHdpdGggVElNRUNPTkRfIHByZWZpeGVzLiBUaGV5CiAgaGF2ZSBiZWVuIG9ic29sZXRlIHNpbmNlIEFwcmlsIDIybmQgMjAwMiwgYW5kIGlmIHRoaXMgY2F1c2VzIGFueW9uZSBhbnkKICBwcm9ibGVtcyBub3cgaXQgaXMgdmVyeSBlYXN5IHRvIGp1c3QgYWRkIENVUkxfIHRvIHRoZSBuYW1lcy4gVGhpcyBjb3JyZWN0cwogIHRoaXMgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiBjbGVhbmVkIHVwIGhvdyAtLXRyYWNlIHdpdGggbm8gb3B0aW9uIHdhcyB0cmVhdGVkLCBhbmQgYWxzbwogIGFyZ3VtZW50cyBpbiBhIGNvbmZpZyBmaWxlIHdpdGhvdXQgYSByZXF1aXJlZCBwYXJhbWV0ZXIhCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGZldyBpc3N1ZXMgd2hlcmUgY29tcGlsZXJzIHdhcm5lZCBhYm91dCB2YXJpYWJsZXMKICBwb3NzaWJseSBiZWluZyB1c2VkIHVuYXNzaWduZWQuCgotIE1pbm9yIEludGVyaXggYnVpbGQgcHJvYmxlbSBmaXhlZC4KCkRhbmllbCAoMTUgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBzb21lIG5lY2Vzc2FyeSBlc2NhcGluZyBuZWVkZWQgaW4gdGhlCiAgYWNpbmNsdWRlLm00IGZpbGUgd2hlbiBhdXRvbWFrZSAxLjggb3IgbGF0ZXIgaXMgdXNlZC4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA0KQotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgQ3VybF9yZXNvbHYoKSByZXR1cm4gY29kZS4gVGhpcyBleHRlbmRzIHRoZSBmaXgKICBTdGV2ZSBHcmVlbiBwcm92aWRlZCBvbiBkZWNlbWJlciAzLi4uCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNCkKLSBMdWtlIENhbGwgbWFkZSB0aGUgd2luMzIgdmVyc2lvbiBvZiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nIGZ1bmN0aW9uIHN1cHBvcnQKICBiYWNrc3BhY2UuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgaHVnZWhlbHAgc291cmNlIGZpbGUgdG8gY29udGFpbiBib3RoIGEgY29tcHJlc3NlZCBhbmQKICBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IG1vcmUgcGVvcGxlIGVhc2llciBjYW4KICBidWlsZCBjdXJsIHdpdGggdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KCi0gRGllZ28gQ2Fzb3JyYW4gYnJvdWdodCBhbm90aGVyIEFtaWdhT1MgYnVpbGQgcGF0Y2ggZm9yIG5hdGl2ZSBBbWlnYSBidWlsZHMuCgotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgTWFjIE9TIFggZnJhbWV3b3JrIGZpbGVzLgoKLSBCcmlhbiBSIER1ZmZ5IGJyb3VnaHQgYSBzZWN0aW9uIHRvIHRoZSBJTlNUQUxMIGZpbGUgb24gaG93IHRvIGJ1aWxkIGEKICBTU0wtZW5hYmxlZCBjdXJsIHVzaW5nIHRoZSBmcmVlIEJvcmxhbmQgQysrIGNvbXBpbGVyLiBIZSBhbHNvIHVwZGF0ZWQgdGhlCiAgQm9ybGFuZCBsaWIvTWFrZWZpbGUuYjMyLgoKLSBJIGZpeGVkIHRoZSB0ZXN0IGNhc2UgNTA5IHdoaWNoIEkgYnJva2UgeWVzdGVyZGF5LiBOb3cgdGhlIGxpYnRlc3QgYXJlCiAgY29tcGlsZWQgd2l0aCBhbiBpbmNsdWRlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIGxpYnJhcnkncyBzb3VyY2UgZGlyLCBzbwogIHRoYXQgdGhlIGxpYnRlc3RzIGNhbiBpbmNsdWRlIGZpbGVzIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIHdhcyBtYWRlIHRvCiAgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFVTRV9TU0xFQVkgZGVmaW5lIGluIHRoZSBsaWJyYXJ5IHRlc3QgZmlsZXMuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgYnJvdWdodCBjb2RlIHRoYXQgbm93IGFsbG93cyBhIGNhbGxiYWNrIHRvIG1vZGlmaWVkIHRoZSBVUkwKICBldmVuIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgc2ltdWxhdGUgYQogICJmb2xsb3cgbG9jYXRpb24iIHRvIHRoYXQgbmV3IFVSTC4gVGVzdCA1MDkgd2FzIGFkZGVkIHRvIHRlc3QgdGhpcyBmZWF0dXJlLgoKLSBFeHRlbmRlZCB0aGUgdGltZSB3ZSByZXRyeSBzZXJ2ZXJzIGluIHRoZSB0ZXN0IHNjcmlwdCwgYW5kIEkgYWxzbyBtYWRlIGl0CiAgcmV0cnkgdGhlIGh0dHBzIGFuZCBmdHBzIHNlcnZlcnMgYmVmb3JlIHRoZXkgYXJlIGNvbnNpZGVyZWQgYmFkLiBJIGJlbGlldmUKICB0aGUgcHJldmlvdXMgYXBwcm9hY2ggY291bGQgdHVybiBwcm9ibGVtYXRpYyBvbiByZWFsbHkgc2xvdyBob3N0cy4KClZlcnNpb24gNy4xMS4wLXByZTEgKDEyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA0KQotIERvbWluaWNrIE1lZ2xpbyBwb2ludGVkIG91dCBGVFBTIHNob3VsZCB1c2UgZGVmYXVsdCBwb3J0IDk5MCBhY2NvcmRpbmcgdG8KICBJQU5BLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwNCkKLSBGaXhlZCB0aGUgU1BORUdPIGNvbmZpZ3VyZSBjaGVjayB0byBub3QgdXNlIC1SIG9yIG90aGVyIG5vbi1wb3J0YWJsZSBvcHRpb25zCiAgaW4gdGhlIExERkxBR1MuIFJlcG9ydGVkIGJ5IFBpZXJyZSBpbiBidWcgcmVwb3J0ICM4NzI5MzAuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA0KQotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIGZpeCBvbiBvdXIgemxpYiB1c2FnZS4KCi0gRGF2aWQgSiBNZXllcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlIGxhcmdlIGZpbGUgc3VwcG9ydCB0byBsaWJjdXJsIHdhcwogIGFwcGxpZWQuIE5ldyBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgdGhhdCBhY2NlcHQgJ29mZl90JyBhcmd1bWVudHMgYXJlOgoKICBJTkZJTEVTSVpFX0xBUkdFCiAgUkVTVU1FX0ZST01fTEFSR0UKICBNQVhGSUxFU0laRV9MQVJHRQoKRGFuaWVsICg0IEphbnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBEb21pbmljayBNZWdsaW8ncyBjb21tZW50cywgSSBtYWRlIG91ciBwcml2YXRlIHZlcnNpb24gb2YKICBnZXR0aW1lb2ZkYXkoKSBkZWNsYXJlZCBzdGF0aWMuIFRoaXMgd291bGQgb3RoZXJ3aXNlIGNvbGxpZGUgd2l0aCB0aGUgc2FtZQogIGZ1bmN0aW9uIGluIG90aGVyIGxpYnMgKGxpa2UgYXJlcyBmb3IgZXhhbXBsZSkuCgotIEFkZGVkIERvbWluaWNrIE1lZ2xpbydzIGRlc2NyaXB0aW9uIG9uIGhvdyB0byBidWlsZCBsaWJjdXJsIHdpdGggYXJlcwogIG9uIHdpbjMyLgpEYW5pZWwgKDE5IERlY2VtYmVyKQotIENVUkxPUFRfSVBSRVNPTFZFIHdhcyBub3QgcG9zc2libGUgdG8gc2V0LgoKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIHRoZSBkamdwcCBidWlsZCBmaWxlcy4KCkRhbmllbCAoMTggRGVjZW1iZXIpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIGEgcmVkaXJlY3QtcHJvYmxlbSB0aGF0IGhhcHBlbmVkIGlmIGEgc2l0ZSB1c2VkIGEgVVJMCiAgbGlrZSAidXJsLmNvbT92YXI9Y29udGVudCIgKHdpdGhvdXQgYSBwcm9wZXIgc2xhc2gpIGFuZCBmcm9tIHRoYXQgYWRkcmVzcwogIHJlZGlyZWN0ZWQgdGhlIHVzZXItYWdlbnQgdG8gYW4gYWJzb2x1dGUgZGlyZWN0b3J5LgoKLSBEYXZpZCBCeXJvbiBtYWRlIGxpYmN1cmwgYnVpbGQgZmluZSB3aXRoIGJvdGggdGhlIC5ORVQgYW5kIFZDNiB2ZXJzaW9ucyBvZgogIE1TVkMKCkRhbmllbCAoMTYgRGVjZW1iZXIpCi0gVXBkYXRlZCB0ZXN0IDUwNiBzaW5jZSBpdCBzdGFydGVkIHRvIGZhaWwgYWZ0ZXIgdGhlIGNhY2hlIHBydW5lIGNoYW5nZQogIHllc3RlcmRheS4gSSBhbHNvIGNoYW5nZWQgaXQgc2xpZ2h0bHkgdG8gZmVhdHVyZSBhIGNvdW50ZXIgaW4gZWFjaCBkZWJ1ZwogIG91dHB1dCBmb3IgZWFzaWVyIHRyYWNpbmcuCgpEYW5pZWwgKDE1IERlY2VtYmVyKQotIE9sZCBETlMgY2FjaGUgZW50cmllcyBhcmUgbm93IG9ubHkgcHJ1bmVkIGFmdGVyIGN1cmwgaXMgZG9uZSB3aXRoIGEgcmVxdWVzdCwKICBhbmQgbm90IGluIHRoZSBhY3R1YWwgbmFtZSByZXNvbHZlIGNhbGwuCgotIGNvcnJlY3RlZCB0aGUgLS1lbmFibGUtYXJlcyBwYXRjaAoKLSBHaXVzZXBwZSBBdHRhcmRpIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aGluIGxpYmN1cmwgdGhhdCByZS11c2VkCiAgYWxyZWFkeSBmcmVlZCBtZW1vcnkuCgpEYW5pZWwgKDEwIERlY2VtYmVyKQotIEdpc2xlIFZhbmVtIHJlcG9ydGVkIHRoYXQgdGhlIGRpY3Qgc3VwcG9ydCB3YXMgYnJva2VuLiBJIGJyb2tlIGl0IGR1cmluZyBteQogIGZ0cHMtY2hhbmdlcyBvdmVyaGF1bC4gSSd2ZSBub3cgYWRkZWQgYSAnY3VybGFzc2VydCcgZnVuY3Rpb24gdGhhdCBjYW4gYmUKICB1c2VkIHRvIHZlcmlmeSBleHByZXNzaW9ucywgdG8gcHJldmVudCBmdXR1cmUgZXJyb3JzIG9mIHRoZSBzYW1lCiAga2luZC4gVGhleSdyZSBvbmx5IHByZXNlbnQgaW4gZGVidWctYnVpbGRzLgoKLSBEaWVnbyBDYXNvcnJhbiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgcG9zc2libGUgdG8gYnVpbGQgbmF0aXZlbHkgKG5vIG1vcmUKICBuZWVkIGZvciB0aGUgaXhlbXVsIGxpYnJhcnkpIG9uIEFtaWdhT1MuCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGNvbmZpZ3VyZSAtLWVuYWJsZS1hcmVzIHN1cHBvcnQgYSBnaXZlbiBwYXRoIHRvIHRoZQogIGluc3RhbGxlZCBhcmVzIGxpYiwgaW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgaXQgaW4gdGhlIGN1cmwgc291cmNlIHRyZWUuCiAgVGhpcyBhbHNvIGZpeGVkIHRoZSBjdXJsLWNvbmZpZyAtLWxpYnMgb3V0cHV0LgoKLSBFcmljIFMuIFJheW1vbmQgcGF0Y2hlZCBhIHZlcnkgbWlub3IgbWFuIHBhZ2UgZm9ybWF0IGVycm9yIGluCiAgbGliY3VybC1lcnJvcnMuMwoKRGFuaWVsICg4IERlY2VtYmVyKQotIEZpeGVkIHRoZSBmbGF3IHRoYXQgbWFkZSAtbHogYXBwZWFyIHR3aWNlIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZS4KCi0gQWZ0ZXIgY29ycmVzcG9uZGVuY2Ugd2l0aCBHaXNsZSBWYW5lbSwgSSBjaGFuZ2VkIHRoZSAnY29ubmVjdGlvbiBhYm9ydGVkJwogIGVycm9yIHRleHQgd2hlbiB0aGUgRlRQIHJlc3BvbnNlIHJlYWRlciBmYWlsZWQgdG8gbW9yZSBzcGVjaWZpY2x5IGlkZW50aWZ5CiAgd2hhdCB0aGUgcHJvYmxlbSBpcy4KCi0gQmFzZWQgb24gYSBwYXRjaCBmcm9tIERvbWluaWNrIE1lZ2xpbywgY3VybC1jb25maWcgLS1mZWF0dXJlIG5vdyBvdXRwdXRzCiAgJ0FzeW5jaEROUycgYXMgYSBmZWF0dXJlIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXJlcy4gVGhlIGZlYXR1cmUgbmFtZQogIGlzIHRoZSBzYW1lIHRoYXQgJ2N1cmwgLVYnIG91dHB1dHMsIGZvciBzaW1wbGljaXR5LgoKRGFuaWVsICgzIERlY2VtYmVyKQotIE1hcnR5IEt1aHJ0IG1hZGUgdGhlIGJ1aWxkIHVwLXRvLWRhdGUgb24gVk1TLCBhbmQgbW92ZWQgbW9zdCBvZiB0aGUgVk1TLQogIHNwZWNpZmljIHN0dWZmIGluIHRoZSBjbGllbnQgY29kZSB0byBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgoKLSBTdGV2ZSBHcmVlbiBmaXhlZCBhIHJldHVybiBjb2RlIGJ1ZyBpbiBDdXJsX3Jlc29sdigpLCB0aGF0IG1hZGUgdGhlIHNvY2tzNQogIGNvZGUgZmFpbC4KCi0gc3dhbGthdXMgYXQgeWFob28uY29tIHBhdGNoZWQgbGliY3VybCB0byBpZ25vcmUgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMKICB3aGVuIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIGlzIHVzZWQsIGFzIG1hbmRhdGVkIGJ5IFJGQzI2MTYuCgpEYW5pZWwgKDIgRGVjZW1iZXIpCi0gLS1mdHAtcGFzdiB3YXMgYWRkZWQsIHdoaWNoIHNlcnZlcyB0aGUgb25seSBwdXJwb3NlIG9mIG92ZXJyaWRpbmcgYQogIHByZXZpb3VzbHkgc2V0IC0tZnRwcG9ydCBvcHRpb24uIFN0YXJ0aW5nIG5vdywgLS1mdHAtcG9ydCBpcyBhIHJlY29nbml6ZWQKICBhbGlhcyBmb3IgLS1mdHBwb3J0IGZvciBjb25zaXN0ZW5jeS4KCi0gR2l1c2VwcGUgQXR0YXJkaSBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCB1c2UgTVNHX05PU0lHTkFMIHdoZW4gd2UgdXNlCiAgc2VuZCgpIGFuZCByZWN2KCkuIEkgYWRkZWQgY2hlY2tzIGZvciB0aGUgZGVmaW5lIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZAogIGFkanVzdGVkIHRoZSBjb2RlIGFjY29yZGluZ2x5LiBJZiB0aGUgc3ltYm9sIGlzIHByZXNlbnQsIHdlIHdvbid0IGF0dGVtcHQKICB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLgoKRGFuaWVsICgxIERlY2VtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gc2V0IHVwIGEgYnNkZnRwZC1zc2wgc2VydmVyIGZvciBtZSBhbmQgSSBjb3VsZCBtYWtlIGN1cmwKICBydW4gZmluZSBhZ2FpbnN0IGl0cyBGVFBTIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlc2UgRlRQUy1yZWxhdGVkIHRoaW5ncwogIHdvcms6CiAgIG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IEZUUFMKICAgbyBhY3RpdmUgKFBPUlQpIGFuZCBwYXNzaXZlIChQQVNWKQogICBvIHVwbG9hZCBhbmQgZG93bmxvYWQKICAgbyB2ZXJpZmllZCBhZ2FpbnN0IGJzZGZ0cGQtc3NsIGFuZCBSYWlkZW5GVFBECgpEYW5pZWwgKDI3IE5vdmVtYmVyKQotIEphbWVzIENsYW5jeSBtYWRlIHRoZSBCb3JsYW5kIE1ha2VmaWxlcyB1cCB0byBkYXRlLgoKLSBNYXJrdXMgTW9lbGxlciBpbXByb3ZlZCB0aGUgU1BORUdPIGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjUgTm92ZW1iZXIpCi0gRGF2ZSBNYXkgZmlsZWQgYnVnIHJlcG9ydCAjODQ4MzcxLCBpZGVudGlmeWluZyB0aGF0IGlmIHlvdSdkIGRvIFBPU1Qgb3ZlciBhCiAgcHJveHkgdG8gYSBodHRwcyBzZXJ2ZXIsIGxpYmN1cmwgZGlkbid0IFBPU1QgYXQgYWxsLCBpdCBqdXN0IG1hZGUgYSBHRVQhIEl0CiAgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGxpYmN1cmwgd3JvbmdseSBkaWRuJ3QgY29uc2lkZXIgdGhlIGF1dGhlbnRpY2F0aW9uCiAgIm5lZ290aWF0aW9uIHBoYXNlIiB0byBiZSBjb21wbGV0ZSB5ZXQuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDk1IHRvIHZlcmlmeSBteSBmaXggZm9yIHRoaXMuCgpEYW5pZWwgKDI0IE5vdmVtYmVyKQotIFRoYW5rcyB0byBNYXRoaWFzIEF4ZWxzc29uLCBJJ3ZlIGJlZW4gYWJsZSB0byB3b3JrIG9uIEZUUFMgZm9yIGxpYmN1cmwgYW5kIGl0CiAgc2VlbXMgdG8gd29yayBzb21ld2hhdCBmaW5lIG5vdy4KCiAgVGhlIEZUUFMgc3R1ZmYgaXMgYmFzZWQgb24gUkZDMjIyOCBhbmQgdGhlIG11cnJheS1hdXRoLWZ0cC1zc2wgZHJhZnQKICAodmVyc2lvbiAxMikuIFRoZXJlIHNlZW1zIHRvIGV4aXN0IHF1aXRlIGEgZmV3IHNlcnZlcnMgdGhhdCBoYXZlIGltcGxlbWVudGVkCiAgdGhlIHNlcnZlciBzaWRlIG9mIHRoaXMuCgogIFdlIGNhbiBub3cgdXNlIGZ0cHM6Ly8gVVJMcyB0byBleHBsaWNpdGx5IHN3aXRjaCBvbiBTU0wvVFNMIGZvciB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24gYW5kIHRoZSBkYXRhIGNvbm5lY3Rpb24gKGRlYWxpbmcgd2l0aCB0d28gU1NMIGNvbm5lY3Rpb25zIGZvcmNlZAogIG1lIHRvIGNoYW5nZSBhIGxvdCBvZiBzdHVmZiBpbiBsaWJjdXJsKS4KCiAgQWx0ZXJuYXRpdmVseSwgYW5kIHdoYXQgc2VlbXMgdG8gYmUgdGhlIHJlY29tbWVuZGVkIHdheSwgd2UgY2FuIHNldCB0aGUgbmV3CiAgb3B0aW9uIENVUkxPUFRfRlRQX1NTTCB0byBvbmUgb2YgdGhlc2UgdmFsdWVzOgoKICAgICBDVVJMRlRQU1NMX05PUEUsICAgLSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1NMCiAgICAgQ1VSTEZUUFNTTF9UUlkgICAgIC0gdHJ5IHVzaW5nIFNTTCwgcHJvY2VlZCBhbnl3YXkgb3RoZXJ3aXNlCiAgICAgQ1VSTEZUUFNTTF9DT05UUk9MIC0gU1NMIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIG9yIGZhaWwKICAgICBDVVJMRlRQU1NMX0FMTCAgICAgLSBTU0wgZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9yIGZhaWwKCiAgQW55IGZhaWx1cmUgdG8gc2V0IHRoZSBkZXNpcmVkIGxldmVsIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwgd2l0aCB0aGUgZXJyb3IKICBjb2RlIENVUkxFX0ZUUF9TU0xfRkFJTEVELiBUaGlzIG5ldyBvcHRpb24gbWFrZXMgYSAibm9ybWFsIiBmdHA6Ly8gdHJhbnNmZXIKICBhdHRlbXB0IHRvIGJlIG1hZGUgc2VjdXJlbHkuCgogIEkndmUgYmVlbiBhYmxlIHRvIGxvZ2luIGFuZCBnZXQgZmlsZXMgKHBhc3NpdmVseSkgZnJvbSBNYXRoaWFzJyBzZXJ2ZXIgdXNpbmcKICBib3RoIGZ0cHM6Ly8gYW5kIENVUkxPUFRfRlRQX1NTTC4gKEkndmUgbWFkZSAnY3VybCcgdW5kZXJzdGFuZCB0aGUgLS1mdHAtc3NsCiAgb3B0aW9uIHRoYXQgc2V0cyBDVVJMRlRQU1NMX1RSWS4pCgotIEdheiBJcWJhbCBmaXhlZCBhIHJhbmdlIHN0cmluZyBtZW1vcnkgbGVhay4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIFdpbmRvd3MgYnVpbGRzLgoKLSBBZGRlZCB0aGUgbmV3IEZUUFNTTCBkZWZpbmVzIGluIGN1cmwvY3VybC5oCgpEYW5pZWwgKDIwIE5vdmVtYmVyKQotIEpvc2ggS2FwZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzg0NTI0NyBhcyBoZSBmb3VuZCBhbiBlbmRsZXNzIGxvb3Agd2hlbgogIGdldHRpbmcgYSA0MDcgYmFjayBmcm9tIGEgcHJveHkgd2hlbiBubyB1c2VyK3Bhc3N3b3JkIHdhcyBnaXZlbi4gQWRkZWQgdGVzdAogIGNhc2UgOTQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE5IE5vdmVtYmVyKQotIEtldmluIFJvdGggZml4ZWQgYSBwcm9ncmVzcy1iYXIgcHJvYmxlbSBvbiBXaW5kb3dzLgoKLSBXaGlsZSB3b3JraW5nIHdpdGggTmljb2xhcyBDcm9pc2V0J3MgYnVnIHJlcG9ydCAjODQzNzM5LCBJIG5vdGljZWQgdHdvIG1pbm9yCiAgcHJvYmxlbXMgcmVsYXRlZCB0byBmdHAgcGFydGlhbCBkb3dubG9hZHM6IGlmIGEgcGFydGlhbCB0cmFuc2ZlciBpcwogIGRldGVjdGVkLCB3ZSBtdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHdlIGNhbm5vdCBrbm93IGluIHdoYXQgc3RhdGUgaXQgaXMKICBhbnltb3JlLiBUaGlzIGxvb2tzIGxpa2UgYSBQcm9GVFBEIGJ1ZzoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDMtMTEvMDA3OS5odG1sCgpEYW5pZWwgKDE3IE5vdmVtYmVyKQotIE1hY2llaiBXLiBSb3p5Y2tpIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlIGEgY2FjaGUgdmFyaWFibGUgZm9yIHRoZQogIHdyaXRhYmxlIGFyZ3YgdGVzdC4gVGhpcyB3YXksIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJldHRlciAoZm9yCiAgY3Jvc3MtY29tcGlsZXMgZXRjKQoKRGFuaWVsICgxNSBOb3ZlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIGZvdW5kIG91dCBsaWJjdXJsIHNvbWV0aW1lcyBmcmVlZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlCiAgdHdpY2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyEKCkRhbmllbCAoMTQgTm92ZW1iZXIpCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgcmVzb2x2ZSB0aGF0IHdlIGRpZG4ndAogIHByb3Blcmx5IGJhaWwgb3V0IGZyb20sIHdoZW4gdXNpbmcgYXJlcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIpCi0gRGVmYXVsdCBDb250ZW50LVR5cGUgZm9yIHBhcnRzIGluIG11bHRpcGFydCBmb3JtcG9zdHMgaGFzIGNoYW5nZWQgdG8KICAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi4gIFRoaXMgc2VlbXMgbW9yZSBhcHByb3ByaWF0ZSwgYW5kIEkgYmVsaWV2ZQogIG1vemlsbGEgYW5kIHRoZSBsaWtlcyBkbyB0aGlzLiBJbiB0aGUgc2FtZSBhcmVhOiAuaHRtbCBmaWxlcyBub3cgZ2V0CiAgdGV4dC9odG1sIGFzIENvbnRlbnQtVHlwZS4gKFBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzgzOTgwNikKCi0gR2lzbGUgVmFuZW0gY29ycmVjdGVkIHRoZSAtLXByb2dyZXNzLWJhciBvdXRwdXQgYnkgZG9pbmcgYSBmbHVzaCBvZiB0aGUKICBvdXRwdXQsIHdoaWNoIGFwcGFyZW50bHkgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gYXQgbGVhc3Qgd2luZG93cywgYnV0CiAgcG9zc2libHkgb3RoZXIgcGxhdGZvcm1zIHRvby4KCi0gUGV0ZXIgU3lsdmVzdGVyIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBjb25uZWN0IGNvZGUsIHdoaWNoIG1hZGUgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIG9uIGEgSVB2Ni1lbmFibGVkIFNvbGFyaXMgYm94IGRvIGJhZC4gVGVzdCBjYXNlIDUwNCB0byBiZQogIHNwZWNpZmljLiBJJ3ZlIHNwZW50IHNvbWUgdGltZSB0byBjbGVhbi11cCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uCiAgbm93IHRvIHVzZSBsZXNzIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHR3byBkaWZmZXJlbnQgc2VjdGlvbnM6IElQdjYgYW5kCiAgSVB2NC4KCkRhbmllbCAoMTEgTm92ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9ORVRSQ19GSUxFLiBVc2UgdGhpcyB0byB0ZWxsIGxpYmN1cmwgd2hpY2ggZmlsZSB0byB1c2UgaW5zdGVhZAogIG9mIHRyeWluZyB0byBmaW5kIGEgLm5ldHJjIGluIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeS4gVGhlCiAgZXhpc3RpbmcgLm5ldHJjIGZpbGUgZmluZGVyIGlzIHNvbWV3aGF0IG5haXZlIGFuZCBpcyBmYXIgZnJvbSBwZXJmZWN0IG9uCiAgc2V2ZXJhbCBwbGF0Zm9ybXMgdGhhdCBhcmVuJ3QgdW5peC1zdHlsZS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc2V0IHdoZW4KICBDVVJMT1BUX05FVFJDIGlzIHNldCwgdGhlIHByZXZpb3VzIGFwcHJvYWNoIHdpbGwgc3RpbGwgYmUgdXNlZC4KCiAgVGhlIGN1cnJlbnQgLm5ldHJjIGNoZWNrIGNvZGUgbm93IGFsc28gc3VwcG9ydCBsb25nZXIgdGhhbiAyNTYgYnl0ZXMgcGF0aAogIG5hbWVzLgoKRGFuaWVsICgxMCBOb3ZlbWJlcikKLSBLYW5nLUppbiBMZWUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUgc2hvdWxkbid0IGJlCiAgd3JpdHRlbiBpbiB0aGUgc291cmNlIGRpciBpZiBhIGRpZmZlcmVudCBidWlsZCBkaXIgaXMgdXNlZC4KCi0gQWZ0ZXIgU+liYXN0aWVuIFdpbGxlbWlqbnMnIGJ1ZyByZXBvcnQsIHdlIG5vdyBjaGVjayB0aGUgc2VwYXJhdG9ycyBwcm9wZXJseQogIGluIHRoZSAyMjktcmVwbHkgc2VydmVycyByZXNwb25kIG9uIGEgRVBTViBjb21tYW5kIGFuZCBiYWlsIG91dCBiZXR0ZXIgaWYKICB0aGUgcmVwbHkgc3RyaW5nIGlzIG5vdCBSRkMyNDI4LWNvbXBsaWFudC4KCkRhbmllbCAoNyBOb3ZlbWJlcikKLSBCYXNlZCBvbiBHaXNsZSBWYW5lbSdzIHBhdGNoLCBJIG1hZGUgY3VybCB0cnkgaGFyZGVyIHRvIGdldCB0aGUgaG9tZQogIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCBpbiBvcmRlciB0byBmaW5kIHRoZSBkZWZhdWx0IC5jdXJscmMgZmlsZS4KICBXZSdyZSBhbHNvIGNvbnNpZGVyaW5nIG1vdmluZyBvdXQgdGhlIEhPTUUtZGlyIGNvZGUgZnJvbSBsaWJjdXJsLCBhbmQKICBpbnN0ZWFkIGhhdmUgdGhlIGFwcCBwYXNzIGluIHRoZSBwYXRoIHRvIHRoZSAubmV0cmMgZmlsZSAod2hpY2ggaXMgdGhlIG9ubHkKICBsb2dpYyBsZWZ0IGluIGxpYmN1cmwgdGhhdCB1c2VzIHRoZSBIT01FIGRpcikuIFRoZW4gY3VybCBjYW4gdXNlIHRoZSBob21lCiAgZGlyIGZvciB0aGF0IHB1cnBvc2UgdG9vLgoKLSBSYWxwaCBNaXRjaGVsbCdzIHVwZGF0ZWQgdGVzdGN1cmwuc2ggdG8gdGhlIHNjcmlwdCB0byB0YWtlIGFuIGV4aXN0aW5nCiAgZGlyZWN0b3J5IG5hbWUgYW5kIGJ1aWxkL3J1bi90ZXN0IGN1cmwgaW4gdGhlcmUgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXBkYXRlCiAgZnJvbSBDVlMuIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBzY3JpcHQgY2FuIG5vdyBiZSB1c2VkIHRvIHRlc3QgZGFpbHkKICB0YXJiYWxscyBldGMuCgotIEdpc2xlIFZhbmVtIGFkZGVkIGEgInJlc291cmNlIGZpbGUiIHRvIHRoZSBXaW5kb3dzIERMTCBidWlsZHMsIHRvIGNvbnRhaW4KICBpbmZvcm1hdGlvbiBzdWNoIGFzIHZlcnNpb24gbnVtYmVyLCBsaWJyYXJ5IG5hbWUsIGNvcHlyaWdodCBpbmZvIGV0Yy4KCkRhbmllbCAoNiBOb3ZlbWJlcikKLSBjdXJsIGNoZWNrcyBpZiB0aGUgZXhpc3RpbmcgbGliY3VybCBzdXBwb3J0cyB0aGluZ3MgbGlrZSAtLW50bG0sIC0tbmVnb3RpYXRlCiAgYW5kIC0ta3JiNCBhbmQgcmV0dXJucyBlcnJvciBpZiBub3QuCgotIEkgYWRkZWQgdGhyZWUgbmV3IGdsb2JhbCBkZWZpbmVzIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXI6CiAgTElCQ1VSTF9WRVJTSU9OX01BSk9SLCBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgYW5kIExJQkNVUkxfVkVSU0lPTl9QQVRDSC4gVGhleQogIGFyZSB0aGUgdGhyZWUgbnVtYmVycyBpbiB0aGUgbGlicmFyeSdzIHZlcnNpb24gbnVtYmVyLCBzZXBhcmF0ZWQgZm9yIGVhc2llcgogIHVzYWdlLiAnbWFrZXRneicgd2FzIHVwZGF0ZWQgYWNjb3JkaW5nbHkgdG8gZ2VuZXJhdGUgdGhlc2UgbnVtYmVycyBwcm9wZXJseQogIHdoZW4gYnVpbGRpbmcgcmVsZWFzZS1hcmNoaXZlcy4KCi0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXgsIHJlcG9ydGVkIGJ5IGJvdGggTWFydHkgS3VocnQgYW5kIEJlbmphbWluCiAgR2VyYXJkLgoKLSBNYXR0IFZlZW5zdHJhIHByb3ZpZGVkIGJ1aWxkIGZpbGVzIHRvIGJ1aWxkIGxpYmN1cmwgYXMgYSAiZnJhbWV3b3JrIiB1bmRlcgogIE1hYyBPUyBYLiBTZWUgdGhlIGxpYi9saWJjdXJsLmZyYW1ld29yay5tYWtlIGZvciBkZXRhaWxzLgoKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIG9mIFRSVUUgYW5kIEZBTFNFIGZyb20gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBmaWxlLgogIFRoZXkncmUgbm90IGluIG91ciBuYW1lIHNwYWNlIHNvIHdlIHNob3VsZCBub3QgZmlkZGxlIHdpdGggdGhlbS4KCkRhbmllbCAoNSBOb3ZlbWJlcikKLSBSZXBsYWNlZCB0aGUgbWFuIHBhZ2UgdG8gSFRNTCBjb252ZXJ0ZXIgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZTogcm9mZml0LgogIE1ha2VzIG5pY2VyIHdlYiBwYWdlcy4KCkRhbmllbCAoNCBOb3ZlbWJlcikKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHRvIGxldCB0aGVtIGJ1aWxkIGN1cmwgZmluZQogIG9uIFdpbmRvd3MuCgotIEtldmluIFJvdGggY29ycmVjdGVkIHRoZSBjeWd3aW4gcGFja2FnZSBnZW5lcmF0b3IgYW5kIHNwZWxsLWZpeGVkIHRoZQogIGNvbW1lbnQgaW4gdGhlIGNhLWJ1bmRsZS5oIGZpbGUuCgpWZXJzaW9uIDcuMTAuOCAoMSBOb3ZlbWJlciAyMDAzKQoKRGFuaWVsICgzMSBPY3RvYmVyKQotIEFzc3VtZSB0aGF0IE1EVE0gb24gYW4gRlRQIHNlcnZlciByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNpbmcgdGhlIFVUQyB0aW1lCiAgem9uZS4gVGhpcyBjaGFuZ2VzIHRoZSB0aW1lIENVUkxJTkZPX0ZJTEVUSU1FIHJldHVybnMgZm9yIGEgZ2l2ZW4gZmlsZSBvdmVyCiAgRlRQLCBhbmQgd2lsbCBjaGFuZ2UgZXhpc3RpbmcgdXNlcyBvZiBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEl0IHdpbGwgbWFrZQogIHRoZSBmdW5jdGlvbmFsaXR5IG1vcmUgc2ltaWxhciB0byBob3cgdGhlIEhUVFAgb25lIGlzIGFscmVhZHkgd29ya2luZy4KCi0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWNhbCBwYXJhbWV0ZXJzIChzdWNoIGFzIC15LCAtWSwgLUMgZXRjKQogIG5vdyByZXBvcnQgZXJyb3IgYW5kIGV4aXQgaWYgdGhlIHBhcmFtZXRlciBpc24ndCB0cnVseSBhIG51bWJlciBncmVhdGVyIHRoYW4KICBvciBlcXVhbCB0byB6ZXJvLiBUaGlzIGhlbHBzIHVzZXJzIHRvIG5vdGljZSBiYWQgdXNhZ2UgZWFybGllci4gQmVmb3JlLCB3aGVuCiAgYSB1c2VyIGZvcmdvdCBvciBtaXNzZWQgdG8gYWRkIGEgbnVtZXJpY2FsIHBhcmFtZXRlciB0byBhbiBvcHRpb24sIHRoZQogIGNvbW1hbmQgbGluZSBwYXJzZXIgd291bGQgc2ltcGx5ICJlYXQiIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFuZCBpdCB3b3VsZAogIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbi4KCkRhbmllbCAoMzAgT2N0b2JlcikKLSBEYXZpZCBIdWxsIG1hZGUgbGliY3VybCBkZWFsIHdpdGggTk9CT0RZIGFuZCBIRUFERVIgZm9yIGZpbGU6Ly8gdGhlIHNhbWUgd2F5CiAgaXQgYWxyZWFkeSBkb2VzIGZvciBGVFA6IGl0IHByb3ZpZGVzIEhUVFAtbG9va2luZyBoZWFkZXJzIHRoYXQgcHJvdmlkZSBpbmZvCiAgb25seSBhYm91dCB0aGUgZmlsZSwgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zZmVyLiBUaGUgY3VybCB0b29sIHRoZW4KICBsZXRzIC0taGVhZCBkbyB0aGlzLgoKRGFuaWVsICgyOSBPY3RvYmVyKQotIHJ1bnRlc3RzLnBsIG5vdyBjaGVja3MgZm9yIGFuZCB1c2UgdmFsZ3JpbmQgaWYgcHJlc2VudC4gSXQgd2lsbCByZWRpcmVjdCB0aGUKICB2YWxncmluZCByZXN1bHRzIGluIGxvZy92YWxncmluZFtudW1dIGJ1dCBpdCBjdXJyZW50bHkgZG9lc24ndCBzY2FuIHRoYXQKICBmaWxlIGZvciBhbnkgZXJyb3JzIG9yIGFueXRoaW5nLCB0aGF0IGlzIHN0aWxsIG9ubHkgbWFkZSBtYW51YWxseS4KCi0gRGF2aWQgSHVsbCBtYWRlIHRoZSBmaWxlOiBVUkwgcGFyc2VyIGFsc28gYWNjZXB0IHRoZSBzb21ld2hhdCBzbG9wcHkgZmlsZQogIHN5bnRheDogZmlsZTovcGF0aC4gSSBhZGRlZCB0ZXN0IGNhc2UgMjAzIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyOCBPY3RvYmVyKQotIERhbiBDIHRyYWNrZWQgZG93biB5ZXQgYW5vdGhlciB3ZWlyZCBiZWhhdmlvciBpbiB0aGUgZ2xpYmMgZ2V0aG9zdGJ5bmFtZV9yKCkKICBmdW5jdGlvbiBmb3Igc29tZSBzcGVjaWZpYyB2ZXJzaW9ucyAocmVwb3J0ZWQgb24gMi4yLjUgYW5kIDIuMS4xKSwgYW5kCiAgcHJvdmlkZWQgYSBmaXguIE9uIExpbnV4IG1hY2hpbmVzIHdpdGggdGhlc2UgZ2xpYmMgdmVyc2lvbnMsIG5vbi1JUHY2CiAgYnVpbGRzIG9mIGxpYmN1cmwgd291bGQgb2Z0ZW4gZmFpbCB0byByZXNvbHZlIHBlcmZlY3RseSByZXNvbHZhYmxlIGhvc3QKICBuYW1lcy4KCkRhbmllbCAoMjYgT2N0b2JlcikKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX21zbnByaW50ZigpIGNvdWxkIHdyaXRlIHRoZSB0cmFpbGluZwogIHplcm8tYnl0ZSBvdXRzaWRlIGl0cyBnaXZlbiBidWZmZXIgc2l6ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdlbmVyYXRlZAogIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIG92ZXJ3cml0ZSB0aGUgRVJST1JCVUZGRVIKICB3aXRoIG9uZSBieXRlLiBVc2luZyBhIG5vbi1leGlzdGluZyB2ZXJ5IGxvbmcgbG9jYWwgZmlsZTovLyBuYW1lIGlzIG9uZSBjYXNlCiAgdGhhdCBjb3VsZCBtYWtlIHRoaXMgb2NjdXIuCgpEYW5pZWwgKDI0IE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBmaWxlZCBidWcgcmVwb3J0ICM4Mjk4MjcuIEl0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGggLUMgLSBpZgogIHRoZSBmdWxsIGZpbGUgYWxyZWFkeSB3YXMgZG93bmxvYWRlZCBhbmQgdGh1cyB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEKICA0MTYuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHVzZSB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBhbmQgZXhwZWN0CiAgdGhhdCBzaXplIHRvIGdldCB0cmFuc2ZlciwgY2F1c2luZyBhICJoYW5nIiB1bnRpbCB0aGUgc2VydmVyIGNsb3NlZCB0aGUKICBjb25uZWN0aW9uIGFuZCB0aGVuIGFuIGVycm9yIDE4ICgic3RpbGwgTiBieXRlcyBkYXRhIGxlZnQgb2YgdGhlIHRyYW5zZmVyIikuCgogIE5vdyB3ZSBkb24ndCByZXR1cm4gYW55IGVycm9yIGF0IGFsbCwgYnV0IEkgdGhpbmsgbGliY3VybCBzaG91bGQgcGVyaGFwcwogIHJldHVybiBzb21lIGtpbmQgb2YgaW5mbyBzaW5jZSB0aGUgcmVxdWVzdGVkIHJhbmdlIHdhcyBvdXQgb2YgdGhlIHNpemUgb2YKICB0aGUgZG9jdW1lbnQuCgotIEJhc2VkIG9uIERhdmlkIEh1bGwncyBmaXggaW4gYnVnIHJlcG9ydCAjODA0NTk5LCB3ZSBub3cgY2hlY2sgZm9yIHNvbGFyaXMgYW5kCiAgZ2NjIGluIGNvbmZpZ3VyZSBhbmQgc2V0IHRoZSAtbWltcHVyZS10ZXh0IGxpbmsgZmxhZyBmb3IgbGlua2luZyB0aGUgbGliCiAgYmV0dGVyLgoKLSBJJ3ZlIGludHJvZHVjZWQgYSAtdCBvcHRpb24gdG8gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdC4gV2l0aCB0aGF0IG9wdGlvbiBzZXQsCiAgdGhlIHNjcmlwdCBydW5zIHNwZWNpYWwgIm1lbW9yeSB0b3J0dXJlIiB0ZXN0cy4gRm9yIGVhY2ggdGVzdCBjb21tYW5kIGxpbmUKICBpbiB0aGF0IHNlY3Rpb24sIHRoZSBzY3JpcHQgZmlyc3QgcnVucyB0aGUgY29tbWFuZCBsaW5lIGFuZCBjb3VudHMgdGhlIHRvdGFsCiAgYW1vdW50IG9mIGFsbG9jYXRpb25zIG1hZGUuIEl0IHRoZW4gcnVucyB0aGUgZXhhY3Qgc2FtZSBjb21tYW5kIGxpbmUgYWdhaW4sCiAgZm9yY2luZyBhbGxvY2F0aW9uIG51bWJlciBOIHRvIGZhaWwuIEl0IHdpbGwgdHJ5IGV2ZXJ5IE4gZnJvbSAxIHRvIHRoZSB0b3RhbAogIG51bWJlciBvZiBhbW91bnRzIG1hZGUuIEZvciBldmVyeSBpbnZva2UsIGl0IGNoZWNrcyB0aGF0IG5vIG1lbW9yeSB3YXMKICBsZWFrZWQgYXMgdGhhdCB3b3VsZCBpbmRpY2F0ZSBhIGJhZCBjbGVhbnVwIHNvbWV3aGVyZSBpbiB0aGUgY29kZS4KCiAgVGhpcyBpcyBqdXN0IGJlZ2lubmluZyB0byB3b3JrLCBhbmQgSSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBjb3JyZWN0aW9ucyBpbgogIGxpYmN1cmwgY29kZS4gV2hlbiB0aGlzIGNvZGUgd29ya3Mgc29tZXdoYXQgZmluZSwgSSdsbCBtYWtlIHN1cmUgJ21ha2UgdGVzdCcKICBpbiB0aGUgcm9vdCBkaXIgd2lsbCBydW4gdGhlc2UgdGVzdHMgYXMgd2VsbC4KCkRhbmllbCAoMjMgT2N0b2JlcikKLSBHZW9yZyBIb3JuIGZpeGVkIGhvdyB0aGUgQ0EgdmVyaWZpY2F0aW9uIGlzIG1hZGUuIFZlcmlmaWNhdGlvbnMgY2FuIG5vdyBiZQogIG1hZGUgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSB0aGUgcmVzdWx0IG9mIGl0IGNhbiBiZSBpZ25vcmVkLiBUaGlzIGFsc28KICBhZmZlY3RzIHRoZSBjdXJsIHRvb2wgYXMgLWsgY2FuIG5vdyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1jYWNlcnQgb3IKICAtLWNhcGF0aC4KCkRhbmllbCAoMjIgT2N0b2JlcikKLSBHaXNsZSBWYW5lbSBmb3VuZCBvdXQgLS1kaXNhYmxlLWVwcnQgZGlkbid0IHdvcmsgYW5kIHBhdGNoZWQgaXQuCgotIFRlc3QgY2FzZSA5MSB3YXMgbW9kaWZpZWQgYW5kIGNvdWxkIG5vdyByZXBlYXQgdGhlIHByb2JsZW0gS2V2aW4gUm90aCBoYXMKICByZXBvcnRlZCwgYW5kIHRoZSBidWcgd2FzIGZpeGVkLgoKLSBEeWxhbiBFbGxpY290dCBhZGRlZCB2Yy1saWJjdXJsLXNzbC1kbGwgYXMgYSB0YXJnZXQgdG8gdGhlIHJvb3QgbWFrZWZpbGUKICB0byBidWlsZCBhIHN0YXRpYyBsaWJjdXJsIHRoYXQgbGlua3Mgd2l0aCBhIHNoYXJlZCBPcGVuU1NMIHVzaW5nIE1TVkMuCgpEYW5pZWwgKDIxIE9jdG9iZXIpCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndzMyIG1ha2VmaWxlcy4KClZlcnNpb24gNy4xMC44LXByZTUgKDIxIE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTkgT2N0b2JlcikKLSBHZW9yZyBIb3JuIG1hZGUgbGliY3VybCBvdXRwdXQgbW9yZSBpbmZvIG9uIFNTTCBmYWlsdXJlcyB3aGVuIHJlY2VpdmluZwogIGRhdGEuCgpWZXJzaW9uIDcuMTAuOC1wcmU0ICgxOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE3IE9jdG9iZXIpCi0gRG9taW5pY2sgTWVnbGlvIGltcGxlbWVudGVkIENVUkxPUFRfTUFYRklMRVNJWkUgYW5kIC0tbWF4LWZpbGVzaXplLgoKLSBNYWRlIGxpYmN1cmwgc2hvdyB2ZXJib3NlIGluZm8gYWJvdXQgd2hhdCBhdXRoIHR5cGUgYW5kIHVzZXIgbmFtZSB0aGF0IGlzCiAgYmVpbmcgc2VudCBpbiBpdHMgSFRUUCByZXF1ZXN0LWhlYWRlcnMuCgpEYW5pZWwgKDE2IE9jdG9iZXIpCi0gUmVtb3ZlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuIGxpYmN1cmwKICBubyBsb25nZXIgcHJvbXB0IGZvciBwYXNzd29yZHMgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuIFBhc3N3b3JkIHByb21wdGluZwogIHdhcyBpbnN0ZWFkIG1vdmVkIHRvIGN1cmwsIHdoaWNoIG5vdyBwcm9tcHRzIGZvciBwYXNzd29yZCBpZiAtdSBvciAtVSBsYWNrCiAgaXQuIFRoaXMgc29sdmVzIHRoZSBwcm9ibGVtIEtldmluIFJvdGggcmVwb3J0ZWQgd2hlbiBjdXJsIHByb21wdGVkIGZvcgogIHBhc3N3b3JkIHR3aWNlIHdoZW4gZG9pbmcgTlRMTSBhdXRoZW50aWNhdGlvbi4KCi0gSSByZXdyb3RlIHRoZSBTU0wgc3ViamVjdEFsdE5hbWUgY2hlY2sgdG8gYXZvaWQgaGF2aW5nIHRvIHJlbHkgb24gT3BlbkxEQVAtCiAgbGljZW5zZWQgZGVyaXZhdGUgY29kZS4KCkRhbmllbCAoMTUgT2N0b2JlcikKLSBBdm9pZCBkb2luZyBnZXRzb2Nrb3B0KCkgb24gV2luZG93cyB0byB2ZXJpZnkgY29ubmVjdHMuIEl0IHNlZW1zIHRoYXQgdGhpcwogIGhvZ3MgV2luZG93cyBtYWNoaW5lcyB3aGVuIGxpYmN1cmwgaXMgYmVpbmcgdXNlZCBtdWx0aS10aHJlYWRlZCAod2l0aCA+IH41MAogIHRocmVhZHMpLiBBbmRyZXcgRnVsbGVyIGhlbHBlZCB1cyB2ZXJpZnkgYW5kIHRlc3QgdGhpcy4KCkRhbmllbCAoMTQgT2N0b2JlcikKLSBLaW1tbyBLaW5udW5lbiBmaXhlZCBhIGNyYXNoIHdpdGggZHVwaGFuZGxlKCkgd2hlbiBDVVJMREVCVUcgaXMgc2V0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIGxpYmN1cmwgYnVpbGQgYW5kIHdvcmsgd2l0aCBJUHY2IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDEzIE9jdG9iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSByZXBvcnRlZCB5ZXQgYW5vdGhlciBzZWdmYXVsdCB3aXRoIGFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZS4gTWUgZml4ZWQuCgotIERvbWVuaWNvIEFuZHJlb2xpIHJlbW92ZWQgdGhlIGV4dHJhIExERkxBR1MgYXNzaWdubWVudCBpbiBsaWIvTWFrZWZpbGUuYW0KICB0aGF0IHdhcyByZXBvcnRlZCBhYm91dCBpbiB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMjA4Ni4KCiAgRG9tZW5pY28gYWxzbyBmaXhlZCB0d28gbWFrZWZpbGVzIHdoZXJlIHdlIHVzZWQgJ2ducm9mZicgaW5zdGVhZCBvZiB0aGUgbW9yZQogIHBvcnRhYmxlICQoTlJPRkYpLgoKRGFuaWVsICgxMiBPY3RvYmVyKQotIERpcmsgTWFuc2tlIG1hZGUgdGhlIHNoYXJlIGxvY2tpbmcgYXJvdW5kIEROUyBsb29rdXBzIHNsaWdodGx5IGRpZmZlcmVudCB0bwogIGFsbG93IHRoZSBzaGFyZSBzeXN0ZW0ncyBETlMgbG9va3VwcyB0byBydW4gc29tZXdoYXQgbW9yZQogIGluZGVwZW5kZW50L2Zhc3Rlci4KCkRhbmllbCAoOSBPY3RvYmVyKQotIExhY2hsYW4gTydEZWEgZml4ZWQgYSByZXN1bWUgcHJvYmxlbTogIklmIEkgc2V0IENVUkxPUFRfUkVTVU1FX0ZST00sIHBlcmZvcm0KICBhbiBIVFRQIGRvd25sb2FkLCB0aGVuIHJlc2V0IENVUkxPUFRfUkVTVU1FX0ZST00gdG8gMCwgdGhlIG5leHQgZG93bmxvYWQKICBzdGlsbCBoYXMgYSBSYW5nZSBoZWFkZXIgd2l0aCBhIGdhcmJhZ2UgdmFsdWUuIiBidWcgcmVwb3J0ICM4MjA1MDIKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIGluZXRfcHRvbi5jIGZpbGUgYnVpbGQgZmluZSB1c2luZyBNU1ZDLgoKLSBUaGUgJ3N3cycgdGVzdCBzdWl0ZSB3ZWIgc2VydmVyIG5vdyAjaW5jbHVkZSBzZXR1cC5oIGZyb20gdGhlIGxpYiBkaXJlY3RvcnkuCiAgVGhpcyBtYWtlcyBpdCBtb3JlIHBvcnRhYmxlIGVhc2llci4KClZlcnNpb24gNy4xMC44LXByZTMgKDggT2N0b2JlciAyMDAzKQoKRGFuaWVsICg4IE9jdG9iZXIpCi0gRnJhbmsgVGljaGVsZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVzIGhvdyBsaWJjdXJsIGNvbm5lY3RzIHRvIG11bHRpcGxlCiAgYWRkcmVzc2VzLCBpZiBvbmUgb2YgdGhlbSBmYWlscyAoSVB2NCBjb2RlKS4KCkRhbmllbCAoNyBPY3RvYmVyKQotIE5laWwgRHVuYmFyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBjaGVjayBTU0wKICBzdWJqZWN0QWx0TmFtZXMgd2hlbiBtYXRjaGluZyBjZXJ0cy4gVGhpcyBpcyBhcHBhcmVudGx5IGRldGFpbGVkIGluIFJGQzI4MTgKICBhcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uIEkgaGFkIHRvIGFkZCBjb25maWd1cmUgY2hlY2tzIGZvciBpbmV0X3B0b24oKSBhbmQKICBvdXIgb3duIChzdHJpY3RseSBzcGVha2luZywgY29kZSBmcm9tIEJJTkQgd3JpdHRlbiBieSBQYXVsIFZpeGllKSBwcm92aWRlZAogIGNvZGUgZm9yIHRoZSBmdW5jdGlvbiBmb3IgcGxhdGZvcm1zIHRoYXQgbWlzcyBpdC4KCi0gSFRUUCBQT1NUIHVzaW5nIHRoZSByZWFkIGNhbGxiYWNrIGRpZG4ndCB3b3JrLCBhcyBGbG9yaWFuIFNjaG9wcG1hbm4KICByZXBvcnRlZC4KCkRhbmllbCAoNSBPY3RvYmVyKQotIFNoYXJlZCBwcm92aWRlZCBhIGZldyBmaXhlcyB0byBtYWtlIGxpYmN1cmwgYnVpbGQgb24gQmVPUwogIG91dC1vZi10aGUtYm94LiBOZXcgY29kZSBmb3IgQmVPUy1zdHlsZSBub24tYmxvY2tpbmcgc29ja2V0cywgcHJvdmlkZWQgYnkKICBTaGFyZCBhbmQgSmVyZW15IEZyaWVzbmVyLiBNb2RpZmllZCB0aGUgYXV0b2NvbmYgY2hlY2sgZm9yIG5vbi1ibG9ja2luZwogIHNvY2tldHMgdG8gY2hlY2sgZm9yIHRoaXMga2luZCB0b28uCgpEYW5pZWwgKDQgT2N0b2JlcikKLSBWaW5jZW50IEJyb25uZXIgcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3Ugc2V0IENVUkxPUFRfQ09PS0lFIGZvciBhIHRyYW5zZmVyCiAgYW5kIHRoZW4gc2V0IGl0IHRvIE5VTEwgaW4gYSBzdWJzZXF1ZW50IG9uZSwgdGhlIHByZXZpb3VzIGNvb2tpZSB3YXMgc3RpbGwKICBzZW50IG9mZiEKCi0gSm9uIFR1cm5lciBmaXhlZCBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBpdCBmYWlsZWQgb24gYW4gRlRQIHRyYW5zZmVyIGR1ZQogIHRvIGEgYmFkIHBhdGgsIGl0IHdvdWxkIGNhdXNlIHRoZSBuZXh0IHRyYW5zZmVyIHRvIHVzZSBhIGJhZCBwYXRoIGFzIHdlbGwuCgotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIHByb3ZpZGVkIGEgcGF0Y2ggd2l0aCBhIGZpeCBmb3IgbGliY3VybCB3aXRoIGFyZXMsCiAgd2hlbiB3b3JraW5nIG9uIElQLW9ubHkgbmFtZXMgYXMgd2UgdGhlbiBjb3VsZCByZXR1cm4gIndhaXQiIHN0YXR1cyB3aGVuIHRoZQogIG5hbWUgaW4gZmFjdCBhbHJlYWR5IHdhcyByZXNvbHZlZC4gSSBlZGl0ZWQgdGhlIHBhdGNoIHNsaWdodGx5IHRvIG5vdCBleHBvc2UKICBhc3luY2ggZGV0YWlscyB0byBub24tYXJlcyBhd2FyZSBzb3VyY2UgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyKQotIE5laWwgU3ByaW5nIHBvc3RlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMzE4MCwgYW5kIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcKICB0aGUgbmFtZSAnYWNjZXNzJyBpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZSBpcyBub3QgdmVyeSB3aXNlIGFzIHNvbWUgY29tcGlsZXJzCiAgY29tcGxhaW4uCgotIFBldGVyIFN5bHZlc3RlciBwcm92aWRlZCBoaXMgYW5kIEplYW4tUGF1bCBNZXJsaW4ncyBjdXJseC5jIGV4YW1wbGUgc291cmNlCiAgY29kZSB0aGF0IHNob3dzIGhvdyB0aGV5IHVzZSBzc2wgYW5kIGNhbGxiYWNrcy4KCkRhbmllbCAoMiBPY3RvYmVyKQotIEphbWVzIE1hY01pbGxhbidzIHBhdGNoIG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYuMi54LgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIpCi0gTXkgZGF1Z2h0ZXIgd2FzIGJvcm4hCgpEYW5pZWwgKDIzIFNlcHRlbWJlcikKLSBBZGRlZCBzdXBwb3J0IGZvciAtNC8tLWlwdjQgYW5kIC02Ly0taXB2NiB0byBmb3JjZSBuYW1lcyB0byByZXNvbHZlIHRvIHRoYXQKICBwYXJ0aWN1bGFyIElQIHZlcnNpb24uIFRoZXkgb25seSB3b3JrIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgotIGN1cmwgLVYgbm93IG91dHB1dHMgJ1NQTkVHTycgYXMgYSBmZWF0dXJlIGluIGNhc2UgbGliY3VybCB3YXMgYnVpbHQgdG8KICBzdXBwb3J0IHRoYXQuCgpWZXJzaW9uIDcuMTAuOC1wcmUyICgyMiBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoMjIgU2VwdGVtYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYSBzZWdmYXVsdCBpbiBsaWJjdXJsIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIHdpdGggYXJlcyBhbmQgZG9pbmcgcmVwZWF0ZWQgb3BlcmF0aW9ucyBhZ2FpbnN0IGEgbm9uLXJlc29sdmluZyBob3N0IG5hbWUuCgpEYW5pZWwgKDE5IFNlcHRlbWJlcikKLSBBZGRlZCB0aGUgQ1VSTE9QVF9JUFJFU09MVkUgb3B0aW9uLCB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWxlY3QKICB3aGF0IGtpbmQgb2YgSVAgYWRkcmVzc2VzIGhlIHdhbnRzIHRvIHVzZSB3aGVuIHJlc29sdmluZyBob3N0IG5hbWVzLiBUaGlzCiAgaXMgb25seSBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIGhvc3QgbmFtZXMgdGhhdCByZXNvbHZlIGFkZHJlc3NlcyB1c2luZyBtb3JlCiAgdGhhbiBvbmUgdmVyc2lvbiBvZiBJUC4KCi0gQXBwbGllZCBNYXJrdXMgTW9lbGxlcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBTUE5FR08gc3VwcG9ydCBpZiBsaWJjdXJsCiAgaXMgYnVpbHQgd2l0aCB0aGUgRkJvcGVuc3NsIGxpYnJhcmllcy4gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucwogIGluZm8gb24gU1BORUdPIGF2YWlsYWJpbGl0eS4gVGhlIHBhdGNoIGFsc28gbWFkZSB0aGUgR1NTQVBJIHN0dWZmIHdvcmsgZmluZQogIHdpdGggdGhlIE1JVCBHU1MtbGlicmFyeSAodGhlIEhlaW1kYWwgb25lIHN0aWxsIHdvcmtzIHRvbykuCgpEYW5pZWwgKDE2IFNlcHRlbWJlcikKLSBEb2luZyBQVVQgd2l0aCAtLWRpZ2VzdCBmYWlsZWQsIGFzIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzgwNTg1My4KCi0gVXNpbmcgLS1hbnlhdXRoIHRoYXQgcGlja2VkIE5UTE0sIGFuZCB0aGVuIGEgcmVkaXJlY3QgY2xvc2VkIHRoZSBjb25uZWN0aW9uCiAgYW5kIHRvb2sgY3VybCB0byBhIHNlY29uZCBOVExNIHBhZ2UgbWFkZSBjdXJsIGZhaWwuIEJ1ZyByZXBvcnQgIzgwNjMyOAogIGlkZW50aWZpZWQgdGhlIHByb2JsZW0sIHRlc3QgY2FzZSA5MCB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE0IFNlcHRlbWJlcikKLSBjb2RlbWFzdHIgYnJvdWdodCBhIHBhdGNoIGZvciBhcmVzIHRvIG1ha2UgdGhlIFdpbmRvd3MgcG9ydGlvbnMgb2YgaXQgd29yawogIHByb3Blcmx5IG9uIE5UNC4gSSB1cGxvYWRlZCBhIG5ldyBkaWZmIGFuZCB1cGRhdGVkIHRoZSBkb2NzIG9uIHdoZXJlIHRvIGdldAogIGl0IGV0Yy4KCi0gSmVmZiBQb2hsbWV5ZXIgdHJhY2tlZCBkb3duIGEgdmVyeSBoYXJkLXRvLWZpbmQgYnVnIHdoZXJlIHdlIHJlbW92ZWQgYQogIGNhY2hlZCBETlMgZW50cnkgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGluIHVzZSwgd2hpY2ggY2F1c2VkICJyYW5kb20iIG1lbW9yeQogIHRvIGdldCBvdmVyd3JpdHRlbiBhbmQgdGh1cyAicmFuZG9tIiBjcmFzaGVzLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIpCi0gQmFzZWQgb24gYSBidWcgcmVwb3J0IGJ5IERhdmlkIEtpbWRvbiwgSSBtYWRlIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2xlYXIKICBhbGwgcG9zc2libGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4KCi0gQnkgZGVmYXVsdCwgZWFzeSBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSBub3cgc2hhcmUgRE5TIGNhY2hlLgoKLSBUaW0gQmFydGxleSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgR1NTTkVHT1RJQVRFIG9wdGlvbiB3b3JrIGZvcgogIE1pY3Jvc29mdCdzICJOZWdvdGlhdGUiIGF1dGhlbnRpY2F0aW9uIGFzIHdlbGwuCgpEYW5pZWwgKDExIFNlcHRlbWJlcikKLSBBIHplcm8tbGVuZ3RoIHByb3h5IHN0cmluZyBjb25mdXNlZCBGVFAgdHJhbnNmZXJzLgoKLSBCam9ybiBSZWVzZSBmb3VuZCBhIGNhc2Ugd2l0aCBhbiB1bmluaXRpYWxpemVkIHBvaW50ZXIsIG9ubHkgcHJlc2VudCB3aGVuCiAgYnVpbHQgZm9yIGFyZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmUxICg4IFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICg3IFNlcHRlbWJlcikKLSBKdXJpaiBTbWFrb3YgZm91bmQgb3V0IHRoYXQgdGhlIG5vbi1PcGVuU1NMIE1ENSBjb2RlIHdhcyBub3Qgd29ya2luZyBvbgogIEFscGhhIChvciBpYTY0KS4gT25seSB0aGUgT3BlblNTTC12ZXJzaW9uIGRpZC4gSSBtYWRlIGEgZml4IEkgdGhpbmsgY29ycmVjdHMKICB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBTZXB0ZW1iZXIpCi0gS2V2aW4gRmlzayByZXBvcnRlZCB0aGF0IGNvbmZpZ3VyZSAtLWVuYWJsZS10aHJlYWQgZGlkbid0IHdvcmsuIEkgZml4ZWQuCgotIERlLW1hY3JvZmllZCB0aGUgbGliL2hhc2guYyBzb3VyY2UgY29kZSBzb21ld2hhdC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIpCi0gQ1VSTElORk9fSFRUUEFVVEhfQVZBSUwgYW5kIENVUkxJTkZPX1BST1hZQVVUSF9BVkFJTCBhZGRlZCwgQmFzZWQgb24gSm9lcmcKICBNdWVsbGVyLVRvbGsncyBwYXRjaCwKCkVhcmx5ICg0IFNlcHRlbWJlcikKLSBBZGRlZCBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUIC0gYWxsb3dzIHVzZXIgdG8gc2V0IHN0cmljdCB0aW1lb3V0CiAgcmVxdWlyZW1lbnRzIG9uIHRoZSBGVFAgc2VydmVyJ3MgYWJpbGl0eSB0byByZXNwb25kIHRvIGluZGl2aWR1YWwgY29tbWFuZHMKICB3aXRob3V0IHBsYWNpbmcgZ2xvYmFsIHJlcXVpcmVtZW50cyBvbiB0cmFuc2ZlciBvciBjb25uZWN0IHRpbWUuICBGaWxlcwogIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgYnJhbmNoIGluc2lkZSBDdXJsX0dldEZUUFJlc3BvbnNlIHRvIGNoZWNrIGZvcgogICAgICAgIGRhdGEtPnNldC5mdHBfcmVzcG9uc2VfdGltZW91dAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX3Jlc3BvbnNlX3RpbWVvdXQgdG8gc3RydWN0IFVzZXJEZWZpbmVkCgpEYW5pZWwgKDMgU2VwdGVtYmVyKQotIFBldGVyIFBlbnRjaGV2IGZvdW5kIGFuZCBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHRlc3Qgc3VpdGUncyB3ZWIgc2VydmVyCiAgY29kZSwgdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGF0IHRpbWVzLgoKLSBK9nJnIE11ZWxsZXItVG9sayBpbXByb3ZlZCB0aGUgcHJveHkgdXNlcitwYXNzd29yZCBoYW5kbGluZywgZXNwZWNpYWxseQogIHdoZW4gcHJvdmlkaW5nIGEgYmxhbmsgcGFzc3dvcmQuCgpEYW5pZWwgKDIgU2VwdGVtYmVyKQotIEZpeCBmb3IgbWFraW5nIENPTk5FQ1QgdG8gcHJveGllcyBkbyB0aGUgY29ycmVjdCBtYWdpYyB0byBhbGxvdyBOVExNLCBEaWdlc3QKICBhbmQgc2ltaWxhciB0byB3b3JrLgoKRGFuaWVsICgxIFNlcHRlbWJlcikKLSBIZW5yaWsgU3Rvcm5lciBtYWRlIGxpYmN1cmwgd29yayBmaW5lIHdpdGggT3BlbkxEQVAgMi4xLjIyIChjdXJyZW50KS4KCi0gSmVmZiBQb2hsbWV5ZXIgYWRkZWQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSBmb3Igbm9uLXJlc29sdmluZyBob3N0cyB3aGVuCiAgdXNpbmcgYXJlcyBmb3IgbG9va3Vwcy4KCkRhbmllbCAoMjUgQXVndXN0KQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCB0aGF0IGN1cmwgLWsgc3RpbGwgZmFpbGVkIGlmIHRoZSBIVFRQUyBzZXJ2ZXIncyBDTgogIGZpZWxkIHdhc24ndCBvYnRhaW5hYmxlLiBUaGlzIHdhcyBkdWUgdG8gdGhlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgYmVpbmcKICBzZXQgdG8gMSwgYW5kIGxpYmN1cmwgZmFpbGVkIGlmIHRoZSBDTiB3YXMgbWlzc2luZy4gU3RhcnRpbmcgbm93LCBoYXZpbmcgaXQKICBzZXQgdG8gMSB3aWxsIHNpbXBseSBvdXRwdXQgYSB3YXJuaW5nIGlmIG5vIENOIGNvdWxkIGJlIG9idGFpbmVkIChhcyBoYXZpbmcKICBhIG1pc21hdGNoIGlzIE9LKS4KCkRhbmllbCAoMjEgQXVndXN0KQotIFZpbmNlbnQgU2FuZGVycyBwcm92aWRlZCBhIGZpeCBmb3IgbmFtZSByZXNvbHZpbmcgd2hlbiBsaW5rZWQgd2l0aCB1Q2xpYmMuCgpEYW5pZWwgKDIwIEF1Z3VzdCkKLSBHZXJkIHYuIEVnaWR5IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHN0b3JlIHRoZSBGVFAgcmVzcG9uc2UKICBjb2RlIGZyb20gZnRwIHNlcnZlcnMuIFVzaW5nIGN1cmxfZWFzeV9nZXRpbmZvKCkgd2l0aCBDVVJMSU5GT19IVFRQX0NPREUKICByZXR1cm5zIHRoYXQgZGF0YS4gVGhlIG9wdGlvbiBpcyB0aGVyZWZvcmUgbm93IGFsc28ga25vd24gYXMKICBDVVJMSU5GT19SRVNQT05TRV9DT0RFLgoKLSBBbnRvaW5lIENhbGFuZG8gZm91bmQgYSBzZWdmYXVsdCB3aGVuIGRvaW5nIG11bHRpLXBhcnQvZm9ybXBvc3QgdXNpbmcKICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKLSBBbnRvaW5lIENhbGFuZG8gcG9pbnRlZCBvdXQgdGhhdCBjdXJsX211bHRpX2luZm9fcmVhZCgpIGRpZG4ndCBzZXQgdGhlCiAgbXNnc19pbl9xdWV1ZSB0byAwIHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIE5VTEwuCgpEYW5pZWwgKDE5IEF1Z3VzdCkKLSBJIG1hZGUgY3VybCBzdXBwb3J0IG11bHRpcGxlIC1UIG9wdGlvbnMsIGFzIHdlbGwgYXMgLVQgIntmaWxlMSxmaWxlMn0iCiAgc3R5bGUgZ2xvYmJpbmcuIE9uZSAtVCBmb3IgZWFjaCBVUkwgaXMgc3VwcG9ydGVkLgoKLSBKZWZmIFBvaGxtZXllciBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gdXNpbmcgYXJlcy1lbmFibGVkIGxpYmN1cmwgYW5kIHRoZQogIG11bHRpIGludGVyZmFjZSB3aGVuIHRyeWluZyBhIG5vbi1leGlzdGluZyBob3N0IG5hbWUuCgotIE1hZGUgdGhlIGxpYmN1cmwgcHJpbnRmIGNvZGUgc3VwcG9ydCBsb25nIGxvbmdzIGlmIGF2YWlsYWJsZS4KCi0gTG9yZW4gS2lya2J5IHBvaW50ZWQgb3V0IHRoYXQgd2UgZGlkIG5vdCBjbGVhbiB1cCBhbGwgU1NMLWFsbG9jYXRlZCBtZW1vcnkKICBpbiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCgpEYW5pZWwgKDE3IEF1Z3VzdCkKLSBTZXR0aW5nIENVUkxPUFRfV1JJVEVGVU5DVElPTiBvciBDVVJMT1BUX1JFQURGVU5DVElPTiB0byBOVUxMIHdpbGwgbm93IG1ha2UKICB0aGVtIGdldCB0aGUgaW50ZXJuYWwgZGVmYXVsdHMgcmVzdG9yZWQuIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQuIFdlIHNob3VsZCBhaW0gYXQgaGF2aW5nIGFsbCBwb2ludGVyLXJlbGF0ZWQgb3B0aW9ucyBnZXQgcmVzdG9yZWQKICB0byBkZWZhdWx0L3NhZmUgdmFsdWVzIHdoZW4gc2V0IHRvIE5VTEwuCgpWZXJzaW9uIDcuMTAuNyAoMTUgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDE0IEF1Z3VzdCkKLSBJIG1vZGlmaWVkIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0gdG8gcmV0dXJuIGZhaWx1cmUgb24gbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHN1Y2Nlc3NmdWwgb25lcy4gVGhpcyBlbmFibGVzIHVzIHRvIHRlc3QKICBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciBhbmQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0CiAgY3VybC9saWJjdXJsIGJlaGF2ZXMgZ29vZCBpbiB0aG9zZS4KCiAgVGhpcyBtYWRlIG1lIGZpbmQgYW5kIGZpeCBzZXZlcmFsIHNwb3RzIHdoZXJlIHdlIGRpZCBub3QgY2xlYW51cCBwcm9wZXJseQogIHdoZW4gYmFpbGluZyBvdXQgZHVlIHRvIGVycm9ycyAobG93IG1lbW9yeSkuCgotIENvcnJlY3RlZCB0ZXN0IGNhc2UgNzQuIE1hZGUgdXNpbmcgLW8gd2l0aCBiYWQgI1tudW1dIGNvZGVzIGNvbXBsYWluIGFuZAogIGJhaWwgb3V0LiBNYWRlICNbbnVtXSBzdXBwb3J0IG51bWJlcnMgbGFyZ2VyIHRoYW4gOSBhcyB3ZWxsLiBBZGRlZCB0ZXN0CiAgY2FzZSA4NiBmb3IgYSBwcm9wZXIgcmFuZ2UgZ2xvYmJpbmcgdGVzdCBhcyB3ZWxsLgoKVmVyc2lvbiA3LjEwLjctcHJlNCAoMTIgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDEyIEF1Z3VzdCkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgZmxhZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFzeW5jaCBETlMKICBzdXBwb3J0LCBhbmQgdGhpcyBpcyBub3cgYWxzbyBkaXNwbGF5ZWQgd2l0aCAnY3VybCAtVicuCgotIEFkZGVkIGEgZmV3IG5ldyBtYW4gcGFnZXMgdG8gdGhlIGRvY3MvbGliY3VybCBkaXI6IGN1cmxfc2hhcmVfaW5pdCwKICBjdXJsX3NoYXJlX3NldG9wdCwgY3VybF9zaGFyZV9jbGVhbnVwLCBsaWJjdXJsLWVhc3kgYW5kIGxpYmN1cmwtc2hhcmUuCgpEYW5pZWwgKDExIEF1Z3VzdCkKLSBNaWtlIENoZXJlcG92IG1hZGUgdGhlIGxvY2FsIGJpbmRpbmcgY29kZSB3b3JrIGZvciBXaW5kb3dzLCB3aGljaCBtYWtlcwogIHRoZSBvcHRpb24gQ1VSTE9QVF9JTlRFUkZBQ0Ugd29yayBvbiBXaW5kb3dzIGFzIHdlbGwuCgotIFZpbmNlbnQgU2FuZGVycyB1cGRhdGVkIHRoZSBmb3Blbi5jIGV4YW1wbGUgY29kZSBhIGxvdC4KCi0gLS1wcm94eS1udGxtIGlzIG5vdyBzdXBwb3J0ZWQgYnkgdGhlIGN1cmwgdG9vbC4gSXQgZm9yY2VzIHRoZSBwcm94eQogIGF1dGhlbnRpY2F0aW9uIHRvIGJlIG1hZGUgdXNpbmcgTlRMTS4gSXQgZG9lcyBub3QgeWV0IHdvcmsgZm9yIEhUVFBTIG92ZXIKICBwcm94aWVzIChvciBvdGhlciBwcm94eS10dW5uZWxpbmcgb3B0aW9ucykuIFRlc3QgY2FzZSA4MSBhbmQgODIgZG8gc29tZQogIHNpbXBsZSBpbml0aWFsIG50bG0gdGVzdGluZy4KCi0gRm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcmUtdXNlZCBjb25uZWN0aW9ucyB3aXRoCiAgcHJveHktYXV0aGVudGljYXRpb24uCgotIEkgcmVtb3ZlZCAtQCBhbmQgLVogYXMgdmFsaWQgc2hvcnQgb3B0aW9ucy4gVGhleSB3ZXJlIHZlcnkgcmFyZWx5IHVzZWQgKEAKICB3YXNuJ3QgZXZlbiBkb2N1bWVudGVkKS4KCi0gU2VyZ2UgU2VtYXNoa28gaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZQVVUSCwgYW5kIG1ha2UgaXQgd29yayB3aGVuIHNldCB0bwogIENVUkxBVVRIX05UTE0gYW5kL29yIENVUkxBVVRIX0JBU0lDLiBUaGUgUFJPWEFVVEggaXMgc2ltaWxhciB0byBIVFRQQVVUSCwKICBidXQgaXMgZm9yIHRoZSBwcm94eSBjb25uZWN0aW9uIG9ubHksIGFuZCBIVFRQQVVUSCBpcyBmb3IgdGhlIHJlbW90ZSBob3N0LgoKLSBGaXhlZCBsb2FkaW5nIG9mIGNvb2tpZXMgd2l0aCBibGFuayBjb250ZW50cyBmcm9tIGEgY29va2llIGphci4gQWxzbyBtYWRlIHRoZQogIGNvb2tpZSBmdW5jdGlvbnMgaW5mb3JtIG9uIGFkZGVkIGFuZCBza2lwcGVkIGNvb2tpZXMgKGZvciBjb29raWUgZGVidWdnaW5nKS4KClZlcnNpb24gNy4xMC43LXByZTMgKDggQXVndXN0IDIwMDMpCgpEYW5pZWwgKDggQXVndXN0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBmaXggZm9yIGZpbGU6Ly8gVVJMcyB3aXRoIGRyaXZlIGxldHRlcnMgaW5jbHVkZWQuCgotIEkgYWRkZWQgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHRvIHRoZSBjbGllbnQgY29kZSwgd2hpY2ggYWN0aXZhdGVzIEVhcmx5J3MKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiwgYW5kIHdyb3RlIHRlc3QgY2FzZSAxNDcgdG8gdmVyaWZ5CiAgaXQuIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlIGN1cmwuMSBtYW4gcGFnZSB0b28uIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlCiAgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHRvby4KCkRhbmllbCAoNyBBdWd1c3QpCi0gVGVzdCBjYXNlIDYwIGZhaWxlZCBvbiBpYTY0IGFuZCBBTUQgT3B0ZXJvbi4gRml4ZWQgbm93LgoKLSBGaXhlZCBhIHByaW50ZiBwcm9ibGVtIHRoYXQgcmVzdWx0ZWQgaW4gdXJsZ2xvYmJpbmcgYnVncyAoYnVnICMyMDM4MjcgaW4gdGhlCiAgZGViaWFuIGJ1ZyB0cmFja2VyKS4gQWRkZWQgdGVzdCBjYXNlIDc0IHRvIHZlcmlmeSB0aGUgZml4IGFuZCB0byBkaXNjb3ZlciBpZgogIHRoaXMgYnJlYWtzIGluIHRoZSBmdXR1cmUuCgotICJtYWtlIGRpc3RjaGVjayIgd29ya3MgYWdhaW4uCgpWZXJzaW9uIDcuMTAuNy1wcmUyICg2IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg1IEF1Z3VzdCkKLSBEdW5jYW4gV2lsY294IGhlbHBlZCBtZSB2ZXJpZnkgdGhhdCB0aGUgbGF0ZXN0IGluY2FybmF0aW9uIG9mIG15IGFyZXMgcGF0Y2gKICBidWlsZHMgZmluZSBvbiBNYWMgT1MgWCAoc2VlIHRoZSBuZXcgbGliL1JFQURNRS5hcmVzKSBmaWxlIGZvciBhbGwgZGV0YWlscy4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNzgzMTE2IGFuZCBFYXJseSBFaGxpbmdlciBwb3N0ZWQgYQogIGJ1ZyByZXBvcnQgdG8gdGhlIGxpYmN1cmwgbGlzdCwgYm90aCBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCBGVFAKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBob3cgdGhlIGRpciBoaWVyYXJjaHkgd2FzIG5vdCBwcm9wZXJseSByZXNldAogIGJldHdlZW4gZmlsZXMuCgotIERhdmlkIEJ5cm9uJ3MgdGhvdWdodHMgb24gYSBmaXhlZCBNYWtlZmlsZSBpbiB0ZXN0cy8gd2VyZSBhcHBsaWVkLgoKLSBKYW4gU3VuZGluIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBjdXJsIGlnbm9yZWQgYSBjb29raWUgdGhhdCBicm93c2VycyBkb24ndCwKICB3aGljaCB0dXJuZWQgdXAgdG8gYmUgZHVlIHRvIHRoZSBudW1iZXIgb2YgZG90cyBpbiB0aGUgJ2RvbWFpbicuIEkndmUgbm93CiAgbWFkZSBjdXJsIGZvbGxvdyB0aGUgdGhlIG9yaWdpbmFsIG5ldHNjYXBlIGNvb2tpZSBzcGVjIGxlc3Mgc3RyaWN0IG9uIHRoYXQKICBwYXJ0LgoKRGFuaWVsICg0IEF1Z3VzdCkKLSBEaXJrIE1hbnNrZSBhZGRlZCBjb29raWUgc3VwcG9ydCBmb3IgdGhlIGV4cGVyaW1lbnRhbCwgaGlkZGVuIGFuZCBzdGlsbAogIHVuZG9jdW1lbnRlZCBzaGFyZSBmZWF0dXJlIQoKLSBNYXJrIEZsZXRjaGVyIHByb3ZpZGVkIGFuIGV4Y2VsbGVudCBidWcgcmVwb3J0IHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIEZPTExPV0xPQ0FUSU9OIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLCBhcyBsaWJjdXJsIHdvdWxkIG5vdAogIHByb3Blcmx5IGlnbm9yZSB0aGUgYm9keSBjb250ZW50cyBvZiAzWFggcmVzcG9uc2UgdGhhdCBpbmNsdWRlZCB0aGUKICBMb2NhdGlvbjogaGVhZGVyLgoKRWFybHkgKDYgQXVndXN0KQotIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICBUaGlzIG9wdGlvbiB3aWxsIGZvcmNlIHRoZSB0YXJnZXQgZmlsZSdzIHBhdGggdG8gYmUgY3JlYXRlZCBpZiBpdAogICAgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfbWtkLCB3aGljaCBpc3N1ZXMgYSBNS0QgY29tbWFuZAogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9mb3JjZV9jd2QsIHdoaWNoIGF0dGVtcHRzIGEgQ1dELAogICAgICAgICAgYW5kIGRvZXMgYSBNS0QgYW5kIHJldHJpZXMgdGhlIENXRCBpZiB0aGUgb3JpZ2luYWwgQ1dECiAgICAgICAgICBmYWlscwogICAgICAgIE1vZGlmaWVkIGZ0cF9wZXJmb3JtKCkgdG8gY2FsbCBpdHMgY2hhbmdlIGRpcmVjdG9yeSBmdW5jdGlvbgogICAgICAgICAgdGhyb3VnaCBhIHBvaW50ZXIuICBUaGUgcG9pbnRlciBwb2ludHMgdG8gZnRwX2N3ZCBieSBkZWZhdWx0LAogICAgICAgICAgYW5kIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGZ0cF9mb3JjZV9jd2QgSUZGCiAgICAgICAgICBkYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgaXMgbm90IDAuCiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfY3JlYXRlX21pc3NpbmdfZGlycyB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCi0gTWlub3IgQnVnZml4IGZvciBDVVJMT1BUX1RJTUVDT05ESVRJT04gd2l0aCBGVFAgLSBpZiB0aGUgZmlsZSB3YXMgbm90CiAgcHJlc2VudCB0byBkbyB0aGUgdGltZSBjb21wYXJpc29uLCBpdCB3b3VsZCBmYWlsLgogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBsaWIvZnRwLmMKICAgICAgICBJbiBmdHBfcGVyZm9ybSgpLCB0aGUgY2FsbCB0byBmdHBfZ2V0ZmlsZXRpbWUoKSB1c2VkIHRvIGJlIGZvbGxvd2VkCiAgICAgICAgYnkKCSAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICBBbmQgdGhlbiBieSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IGRpZCB0aGUgdGltZSBjb21wYXJpc29uLgogICAgICAgIFRoZSBjb2RlIHRoYXQgZGlkIHRoZSBjb21wYXJpc29uIGhhbmRsZWQgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGV0aW1lCiAgICAgICAgd2FzIG5vdCBhdmFpbGFibGUgKGFzIGluZGljYXRlZCBieSBpbmZvLmZpbGV0aW1lIDwgMCBvciBzZXQudGltZXZhbHVlCiAgICAgICAgPCAwKSwgc28gSSByZXBsYWNlZCB0aGUgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdCB3aXRoIGEgc3dpdGNoKHJlc3VsdCkKICAgICAgICB0aGF0IGFsbG93cyBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZQogICAgICAgIG5vcm1hbCB0aW1lIGNvbXBhcmlzb24uCgpEYW5pZWwgKDMgQXVndXN0KQotIFdoZW4gcHJveHkgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiBhIENPTk5FQ1QgcmVxdWVzdCAoYXMgdXNlZCBmb3IgYWxsIFNTTAogIGNvbm5lY3RzIGFuZCBvdGhlcndpc2UgZW5mb3JjZWQgdHVubmVsLXRocnUtcHJveHkgcmVxdWVzdHMpLCB0aGUgc2FtZQogIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBpcyBhbHNvIHdyb25nbHkgc2VudCB0byB0aGUgcmVtb3RlIGhvc3QuCgogIFRoaXMgaXMgYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5mbyBsZWFrLiBJJ3ZlIGZpeGVkIGl0IG5vdyBhbmQgbWFpbGVkIGEgcGF0Y2gKICBhbmQgd2FybmluZyB0byB0aGUgbWFpbGluZyBsaXN0cy4KCkRhbmllbCAoMSBBdWd1c3QpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIDcuMTAuNiBidWlsZCBjb3JyZWN0bHkgd2l0aCB0aGUKICBjb21wcmVzc2VkIGh1Z2VoZWxwLmMgc291cmNlIGZpbGUuCgpWZXJzaW9uIDcuMTAuNy1wcmUxICgzMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDMwIEp1bHkpCi0gSvZyZyBN/GxsZXItVG9sayB1cGRhdGVkIHRoZSBWQyBtYWtlZmlsZS4KCi0gRGFuaWVsIE5vZ3Vlcm9sIG1hZGUgdGhlIGZ0cCBjb2RlIG91dHB1dCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGluIHNpbWlsYXIKICBzdHlsZSBsaWtlIG90aGVyIGZha2VkIEhUVFAgaGVhZGVycyB3aGVuIE5PQk9EWSBhbmQgSEVBREVSIGFyZSB1c2VkLiBJCiAgdXBkYXRlZCB0d28gY29ycmVzcG9uZGluZyB0ZXN0IGNhc2VzIHRvby4KCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIFZNUyBkdWUgdG8gbXkgaGF2aW5nCiAgY2hhbmdlZCBhIHR5cGUgZnJvbSBsb25nIHRvIHRpbWVfdCwgYW5kIEknbSBub3cgY2hhbmdpbmcgaXQgYmFjayB0byB3b3JrCiAgbW9yZSBwb3J0YWJseS4uLgoKICBIZSBhbHNvIGluZGljYXRlZCB0aGF0IGRpc3RyaWJ1dGluZyB0aGUgc3JjL2h1Z2VoZWxwLmMgaW4gYSBjb21wcmVzc2VkIHN0YXRlCiAgbGlrZSBJIGFjY2lkZW50YWxseSBkaWQgbWF5IG5vdCBiZSB0aGUgc21hcnRlc3QgbW92ZS4uLiBJJ3ZlIG5vdyBmaXhlZCB0aGUKICBkaXN0cmlidXRlIHByb2NlZHVyZSB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIHdoZW4gSQogIG1ha2UgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMjkgSnVseSkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNoYW5nZXMgdG8gdGhlIG1raGVscCBzY3JpcHQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQogIGNvbXByZXNzZWQgaGVscCB0ZXh0IG9uIHNvbWUgcGxhdGZvcm1zLgoKVmVyc2lvbiA3LjEwLjYgKDI4IEp1bHkgMjAwMykKCkRhbmllbCAoMjggSnVseSkKLSBGcmFu529pcyBQb25zIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG9uY2UgYWdhaW4gbWFkZSBjdXJsIGRlYWwgd2l0aCBmdHAgYW5kCiAgImRvdWJsZSBzbGFzaCIgYXMgaW5kaWNhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkuIEluIHRoZSBSRkMxNzM4LWZpeCBvZiBBcHJpbAogIDMwLCB0aGF0IGFiaWxpdHkgd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdCB0aGUgInJpZ2h0IiB3YXkpLiBTbywgc3RhcnRpbmcKICBub3cgd2UgY2FuIGxpc3QgdGhlIHJvb3QgZGlyIG9mIGFuIGZ0cCBzZXJ2ZXIgYm90aCB0aGVzZSB3YXlzOgoKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8lMmYgIGFzIHdlbGwgYXMKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8vCgpEYW5pZWwgKDI0IEp1bHkpCi0gSGVucnkgQmxhbmQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBpbmNsdWRlZCBzeXMvcmVzb3VyY2UuaCB3aXRob3V0IGdvb2QgcmVhc29uCiAgaW4gc2V2ZXJhbCBzb3VyY2UgZmlsZXMuIFdpdGhvdXQgaXQgaW5jbHVkZWQsIFFOWCBidWlsZHMgYmV0dGVyLi4uCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKRGFuaWVsICgyMyBKdWx5KQotIFRyYWN5IEJvZWhyZXIgZXhwZXJpZW5jZWQgRE5TIGNhY2hlIHByb2JsZW1zIGFuZCBkaWQgc29tZSBuaWNlIGRlYnVnZ2luZwogIGFuZCB0cmFja2luZyB3aGljaCBtYWRlIGl0IGVhc3kgZm9yIG1lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0gYW5kIFRyYWN5CiAgY291bGQgdmVyaWZ5IHRoYXQgaXQgZGlkIGN1cmUgdGhlIHByb2JsZW0hIFdoZW4gcmUtdXNpbmcgYSBjb25uZWN0aW9uIHdlCiAgbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCByZS11c2UgdGhlICdjb25uZWN0X2FkZHInIHN0cnVjdC4KCi0gRGFuaWVsIEtvdXJpbCBjb3JyZWN0ZWQgdGhlIEdTUy1OZWdvdGlhdGUgY29kZS4KCi0gSnVhbiBGLiBDb2RhZ25vbmUgcHJvdmlkZWQgZml4ZXMgdG8gYWxsb3cgY3VybCB0byBidWlsZCBmaW5lIG9uIFdpbmRvd3MKICBhZ2Fpbi4KCkRhbmllbCAoMjIgSnVseSkKLSBFZGl0ZWQgdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUgZmlsZSB0byBidWlsZCBvbiBXaW5kb3dzIHByb3Blcmx5LgoKRGFuaWVsICgyMSBKdWx5KQotIE1vdmVkIHRoZSBwcm94eSBjcmVkZW50aWFscyBmcm9tIHRoZSBTZXNzaW9uSGFuZGxlIHN0cnVjdCB0byB0aGUgY29ubmVjdGRhdGEKICBzdHJ1Y3QsIHRvIG1ha2UgbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlcmVudCB1c2VyIG5hbWVzIHdvcmsuCgotIEFkanVzdGVkIHRoZSBOVExNIGNvZGUgdG8gc3VwcG9ydCBwcm94eSBmdW5jdGlvbmFsaXR5LgoKLSBNYWRlIHRoZSBrcmI0IHN0dWZmIGNvbXBpbGUgd2l0aCB0aGUgdXNlcitwYXNzd29yZCBmaWVsZHMgbW92ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmU0ICgyMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDIwIEp1bHkpCi0gRGF2aWQgR2FyZG5lciBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0IDc3MDc1NSB0aGF0IHVzaW5nIHRoZSBGVFAgY29tbWFuZAogIENXRCB3aXRoIGEgYmxhbmsgYXJndW1lbnQgaXMgYSBiYWQgaWRlYSBhbmQgSSBtYWRlIGxpYmN1cmwgc2tpcCBlbXB0eSBwYXRoCiAgc2VnbWVudHMgc3RhcnRpbmcgbm93LgoKRGFuaWVsICgxOCBKdWx5KQotIENyaXMgcG9pbnRlZCBvdXQgdGhhdCBteSBmaXggb24gSnVseSAxNnRoIGRpZG4ndCB3b3JrIGZ1bGx5LiBIaXMgcG9pbnRpbmcKICBvdXQgdGhpcyAoYW5kIGhpcyBwYXRjaCkgYWxzbyBtYWRlIG1lIHJlYWxpemUgdGhhdCB3ZSBoYXZlIGEgdmVyeSBzaW1pbGFyCiAgYnVnIGluIHRoZSBGVFAgY29ubmVjdGlvbiByZS11c2UgY29kZS4gV2UgbXVzdCBzdG9yZSBhIHNlcGFyYXRlIHVzZXIgYW5kCiAgcGFzc3dvcmQgZmllbGQgZm9yIGVhY2ggY29ubmVjdGlvbiB3ZSBrZWVwIChhdCBsZWFzdCBmb3IgRlRQIGFuZCBIVFRQK05UTE0KICBjb25uZWN0aW9ucywgc28gSSBtYWRlIHVzIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5KS4KCi0gU2luY2UgTlRMTSBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2luZ2xlIHJlcXVlc3RzLCBJIGhhZCB0bwogIHJlLWFycmFuZ2UgaG93IHdlIHN0b3JlIHRoZSBOVExNIGRhdGEgYW5kIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3Qgc3VpdGUgdG8KICBmaW5hbGx5IHdvcmsgcHJvcGVybHkgd2l0aCBwZXJzaXN0ZW5jeSB0byBtYWtlIHRoZSBOVExNIHRlc3RzIHJ1biBmaW5lCiAgYWdhaW4uIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gaGF2ZSB0byB1cGRhdGUgbG90cyBvZiBIVFRQIHRlc3QgY2FzZXMuCgpEYW5pZWwgKDE2IEp1bHkpCi0gQ3JpcyBCYWlsaWZmJ3MgYnVnIHJlcG9ydCA3NjgyNzUgcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBCYXNpYyBhdXRoIHdpdGgKICB3cm9uZyB1c2VyK3Bhc3N3b3JkIGNhdXNlZCBhbiBlbmRsZXNzIGxvb3AuIEZpeGVkIG5vdy4gSGUgYWxzbyBmb3VuZCBvdXQgdGhhdAogIHdlIGRpZG4ndCBwcm9wZXJseSBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMgd2l0aCBOVExNLiBGaXhlZCB0b28uCgotIERhbiBXaW5zaGlwIHByb3ZpZGVkIGZpeGVzIGZvciB0aGUgTlRMTSBjb2RlLgoKRGFuaWVsICg1IEp1bHkpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHRoZSBET1MgcG9ydC4KCkRhbmllbCAoNCBKdWx5KQotIFJpY2sgUmljaGFyZHNvbiBwb2ludGVkIG91dCB0aGF0IHVzaW5nIHNldHZidWYoKSB0byBhY2hpZXZlIG5vbi1idWZmZXJpbmcKICBvbiBvdXRwdXQgaXMgbm8tZ29vZCBmb3IgU0NPIFhlbml4IGFuZCBvdGhlciB1bml4ZXMuIFdlIHN3aXRjaGVkIG92ZXIgdG8KICB1c2luZyBwbGFpbiBmZmx1c2goKSBpbnN0ZWFkLgoKLSBEYW4gR3JheXNvbiBwb2ludGVkIG91dCB0aGF0IHdlIHNldCB0aGUgQ1VSTF9DQV9CVU5ETEUgdmFyaWFibGUgd3JvbmdseSBpbgogIHRoZSBjb25maWd1cmUgc2NyaXB0LCBhbmQgSSBoYWQgdG8gY2hhbmdlIHNvbWUgYnVpbGQgc3R1ZmYgdG8gbWFrZSB0aGUgbmV3CiAgd2F5IHdvcmsuCgotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHdhcyBhcHBsaWVkIHRoYXQgaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nOgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgZ2V0cyBjYWxsZWQgd2l0aCB0aGUKICAgT3BlblNTTCdzIHNzbF9jdHggcG9pbnRlciBwYXNzZWQgaW4gYW5kIGFsbG93IGEgY2FsbGJhY2sgdG8gYWN0IG9uIGl0LiBJZgogICBhbnl0aGluZyBidXQgQ1VSTEVfT0sgaXMgcmV0dXJuZWQsIHRoYXQgd2lsbCBhbHNvIGJlIHJldHVybmVkIGJ5IGxpYmN1cmwKICAgYWxsIHRoZSB3YXkgYmFjay4gSWYgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBDVVJMT1BUX1VSTCwgbGliY3VybCB3aWxsCiAgIGRldGVjdCB0aGlzIGFuZCBpbnN0ZWFkIGdvIHVzZSB0aGUgbmV3IFVSTC4KCiAgIENVUkxPUFRfU1NMX0NUWF9EQVRBIGlzIGEgcG9pbnRlciB5b3Ugc2V0IHRvIGdldCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHNldAogICB3aXRoIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTi4KCkRhbmllbCAoMSBKdWx5KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgYSBjbGllbnQgdG8gcXVpdCB0aGUgdGVzdCBzdWl0ZSdzCiAgSFRUUCBzZXJ2ZXIuCgotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBwYXRjaGVkIGEgbGliIGhhbmRsZSBsZWFrIGluIHRoZSBsZGFwIGNvZGUuCgpEYW5pZWwgKDI1IEp1bmUpCi0gTW9yZSBOVExNLWltcHJvdmVtZW50cy4gTGVzcyBjb2RlLiBTbWFsbGVyIHBhY2tldHMgYmFjayBhbmQgZm9ydGguCgpEYW5pZWwgKDIzIEp1bmUpCi0gRXJpYyBHbGFzcyBwcm92aWRlZCB1cyB3aXRoIGEgYmV0dGVyIGRvYyBvbiBOVExNIGRldGFpbHMsIGFuZCBJIGFkZGVkIG1vcmUKICBjb21tZW50cyBhbmQgY2xhcmlmaWVkIHRoZSBjdXJyZW50IGNvZGUgbW9yZS4gVXNpbmcgdGhlIG5ldyBrbm93bGVkZ2UsIHdlCiAgc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgTlRMTSBzdHVmZiB3b3JrIGV2ZW4gYmV0dGVyLgogIEVyaWMncyBvcmlnaW5hbCBVUkw6IGh0dHA6Ly9kYXZlbnBvcnQuc291cmNlZm9yZ2UubmV0L250bG0uaHRtbAogIFZlcnNpb24gc3RvcmVkIGFuZCBwcm92aWRlZCBhdCBjdXJsIHNpdGU6IGh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbAoKLSBGaXhlZCB0aGUgbWlub3IgY29tcGlsZSBwcm9ibGVtcyBwcmUzIGhhZCBpZiBidWlsdCB3aXRob3V0IEdTU0FQSSBhbmQvb3IKICBTU0wuCgpWZXJzaW9uIDcuMTAuNi1wcmUzICgxOSBKdW5lIDIwMDMpCgpEYW5pZWwgKDE5IEp1bmUpCi0gTWFkZSBjdXJsIHVzZSBjdXJsX2ZyZWUoKSBvbiBtZW1vcnkgcmV0dXJuZWQgYnkgY3VybF9nZXRlbnYoKSwgYXMgdGhpcwogIHNob3VsZCB0aGVvcmV0aWNseSBtYWtlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGFuZCBydW4gY3VybCBhbmQgbGliY3VybCB3aXRoCiAgZGlmZmVyZW50IG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZXMgd2l0aCBubyBwcm9ibGVtcy4KCkRhbmllbCAoMTggSnVuZSkKLSBJbXByb3ZlZCB0aGUgbWtoZWxwLnBsIGEgYml0IGZ1cnRoZXIgdG8gbWFrZSBhIG5pY2VyIGh1Z2VoZWxwIHRleHQgYW5kIHRvCiAgaW5jbHVkZSBhIGJldHRlciBjb21tZW50IGluIHRoZSB0b3AgZm9yIHRoZSBnemlwIGNvbXByZXNzZWQgdmVyc2lvbi4KCkRhbmllbCAoMTcgSnVuZSkKLSBDVVJMT1BUX0hUVFBBVVRIIGlzIG5vdyBhIGJpdG1hc2ssIGluIHdoaWNoIHlvdSBzZXQgd2hpY2ggYXV0aGVudGljYXRpb24KICB0eXBlKHMpIHlvdSB3YW50IHRvIHVzZS4gSWYgbW9yZSB0aGFuIG9uZSBpcyBzZXQsIGxpYmN1cmwgd2lsbCB1c2Ugb25lIG9mCiAgdGhlIHNlbGVjdGVkIG9uZSBhbmQgdGhlIG9uZSBpdCBjb25zaWRlcnMgaXMgbW9yZSBzZWN1cmUuIFRlc3QgY2FzZSA2NyBhbmQKICA2OCAoZm9yIE5UTE0pIHdlcmUgZml4ZWQgYW5kIHdlJ3ZlIHJlZHVjZWQgYSByb3VuZC10cmlwIGZvciBzcGVjaWZpYyAtLW50bG0KICBmZXRjaGVzLCBhbmQgdGVzdCBjYXNlIDY5IGFuZCA3MCB3ZXJlIGFkZGVkIGZvciB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uCiAgInBpY2tpbmciLiAtLWFueWF1dGggaXMgdGhlIG5ldyBjb21tYW5kIGxpbmUgdG9vbCBvcHRpb24sIGFuZCBJIGFsc28gYWRkZWQKICAtLWJhc2ljIGZvciBjb21wbGV0ZW5lc3MgKHRoYXQncyB0aGUgZGVmYXVsdCB0eXBlKS4KCi0gRml4ZWQgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byB1c2UgdGhlIGluZm8gcHJvdmlkZWQgYnkgdGhlIG5ldyBjdXJsIC1WCiAgb3V0cHV0LgoKLSAtLWVuYWJsZS1kZWJ1ZyBub3cgc2V0cyB0aGUgQ1VSTERFQlVHIGRlZmluZSBpbnN0ZWFkIG9mIE1BTExPQ0RFQlVHLCBhcyBpdAogIGlzIG1lYW50IHRvIGJlIGEgZ2VuZXJpYyBkZWJ1ZyBjb25kaXRpb25hbC4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBjYW4gbm93IHJldHVybiBDVVJMX1ZFUlNJT05fREVCVUcgYXMgYSBmZWF0dXJlIGJpdCwgdG8KICBpbmRpY2F0ZSB0aGF0IHRoZSBsaWJyYXJ5IHdhcyBidWlsdCB3aXRoIENVUkxERUJVRyBzZXQuCgotIFJhbHBoIE1pdGNoZWxsIGZvdW5kIG91dCB0aGF0IHNvbWUgd2ViIGFwcGxpY2F0aW9ucyB2ZXJ5IGJhZGx5IHVzZXMgd2hpdGUKICBzcGFjZXMgaW4gTG9jYXRpb246IHJlZGlyZWN0cywgYW5kIGFwcGFyZW50bHkgSUUgaXMgYSBicm93c2VyICh0aGUgb25seQogIG9uZT8pIHRoYXQgc3VwcG9ydHMgdGhpcyBhYm9taW5hdGlvbi4gQmFzZWQgb24gUmFscGgncyBwYXRjaCwgSSBhZGRlZCBjb2RlCiAgdGhhdCBub3cgYXR0ZW1wdHMgdG8gcmVwbGFjZSB3aGl0ZSBzcGFjZXMgd2l0aCB0aGUgcHJvcGVyICIlMjAiIG9yICIrIi4KICBUZXN0IGNhc2UgNDAgYW5kIDQyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IG15IGNoYW5nZXMuCgotIGN1cmwgLVYgbm93IGFsc28gb3V0cHV0cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhlIGF2YWlsYWJsZSBsaWJyYXJ5IG9mZmVycyAoaWYKICBhbnkpLgoKLSBUaGUgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBpbmNsdWRlcyAiR1NTIiBpZiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR1NTQVBJCiAgc3VwcG9ydC4KCi0gRGF2aWQgT3JyZWxsIHJlcG9ydGVkIHRoYXQgbGliY3VybCBzdGlsbCBjcmFzaGVkIHdoZW4gc2VuZGluZyBIVUdFIHJlcXVlc3RzCiAgb3ZlciBIVFRQUy4uLiBJIGZpeGVkLgoKVmVyc2lvbiA3LjEwLjYtcHJlMiAoMTYgSnVuZSAyMDAzKQoKRGFuaWVsICgxNiBKdW5lKQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYml0bWFza2VkIGluZm9ybWF0aW9uIHdlYXRoZXIgTlRMTSBhbmQKICBHU1NORUdPVElBVEUgYXJlIHN1cHBvcnRlZCwgc2luY2UgaXQgaXMgZG9vbWVkIHRvIHZhcnkgb24gZGlmZmVyZW50CiAgaW5zdGFsbGF0aW9ucy4KCi0gSSByZW1hZGUgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBNRDUtY29kZSBwcm92aWRlZCBieSBPcGVuU1NMIGlmCiAgdGhhdCBpcyBwcmVzZW50LCBhbmQgb25seSB1c2Ugb3VyIG93biBNRDUtY29kZSBpZiBpdCBpc24ndC4KCkRhbmllbCAoMTMgSnVuZSkKLSBNb3JlIE5UTE0gaGVscCwgZml4ZXMgYW5kIHBhdGNoZXMgZnJvbSBDcmlzIEJhaWxpZmYuCgotIE1hcnR5IEt1aHJ0IGJyb3VnaHQgaW5jbHVkZSBmaXhlcyBmb3IgbWFraW5nIFZNUyBidWlsZHMgd2FybmluZy1mcmVlLgoKRGFuaWVsICgxMiBKdW5lKQotIE5UTE0gYXV0aGVudGljYXRpb24gd29ya3Mgc29tZXdoYXQgYWdhaW5zdCB0aGUgdGVzdCBzZXJ2ZXJzIHByb3ZpZGVkIGJ5CiAgTWF0aGlhcyBBeGVsc3NvbiBhbmQgQ3JpcyBCYWlsaWZmLiBVc2UgYnkgc2V0dGluZyBDVVJMT1BUX0hUVFBBVVRIIHRvCiAgQ1VSTEFVVEhfTlRMTSB0byBsaWJjdXJsLCBvciAtLW50bG0gZm9yIHRoZSBjdXJsIHRvb2wuIFRlc3QgY2FzZSA2NyBhbmQgNjgKICB3ZXJlIGFkZGVkIGZvciB0aGlzLiBOVExNLXN1cHBvcnQgcmVxdWlyZXMgT3BlblNTTC4KCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgcGF0Y2gsIHRoYXQgZ3JhbnRlZCB0aGF0IGd6aXAgYW5kIGxpYnogYXJlIGF2YWlsYWJsZQogIGF0IGJ1aWxkLXRpbWUsIGNvbXByZXNzZXMgdGhlIGh1Z2VoZWxwIHRleHQgaW4gdGhlIGN1cmwgY29tbWFuZCBsaW5lIGFuZAogIHVuY29tcHJlc3NlcyBpdCBhdCByZXF1ZXN0LiBTYXZlcyBzb21lIH42MEsgaW4gdGhlIGZpbmFsIG91dHB1dCBleGVjdXRhYmxlLgoKRGFuaWVsICgxMSBKdW5lKQotIExvbmcgZGF5IG9mIGZpZ2h0aW5nIHRoZSBOVExNIGRlbW9ucy4KCkRhbmllbCAoMTAgSnVuZSkKLSBNb2RpZmllZCBob3cgdG8gc2V0IGF1dGggdHlwZSB0byBsaWJjdXJsLiBOb3cgdXNlIENVUkxPUFRfSFRUUEFVVEggaW5zdGVhZCwKICBhbmQgcGljayBtZXRob2QuIFN1cHBvcnRlZCBvbmVzIGN1cnJlbnRseSBhcmU6CiAgQ1VSTEFVVEhfQkFTSUMgICAgIC0gZGVmYXVsdCBzZWxlY3Rpb24KICBDVVJMQVVUSF9ESUdFU1QgICAgLSBmb3JtZXJseSBDVVJMT1BUX0hUVFBESUdFU1QKICBDVVJMQVVUSF9HU1NORUdPVElBVEUKCi0gRGFuaWVsIEtvdXJpbCBhZGRlZCBIVFRQIEdTUy1OZWdvdGlhdGUgYXV0aGVudGljYXRpb24gc3VwcG9ydCwgYXMgZGVmaW5lZCBpbgogIHRoZSBJRVRGIGRyYWZ0IGRyYWZ0LWJyZXphay1zcG5lZ28taHR0cC0wNC50eHQuIEluIHVzZSBhbHJlYWR5IGJ5IHZhcmlvdXMKICBNaWNyb3NvZnQgd2ViIGFwcGxpY2F0aW9ucy4gLS1uZWdvdGlhdGUgaXMgdGhlIG5ldyBmYW1pbHkgbWVtYmVyLiBUbyB0YWtlCiAgYWR2YW50YWdlIG9mIHRoaXMsIHlvdSBuZWVkIG9uZSBvZiB0aGVzZSBwYWNrYWdlczoKCiAgbyBIZWltZGFsIEtlcmJlcm9zNSAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucGRjLmt0aC5zZS9oZWltZGFsL2hlaW1kYWwuaHRtbAogIG8gR1NTQVBJIGZyb20gR2xvYnVzICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZ2xvYnVzLm9yZy8KICBvIEdTU0FQSSBsaWJyYXJpZXMgZnJvbSBNSVQgS2VyYmVyb3M1ICBodHRwOi8vd2ViLm1pdC5lZHUva2VyYmVyb3Mvd3d3LwoKLSBBIG1pc3NpbmcgZW5kaW5nIGJyYWNrZXQgKCddJykgd2hpbGUgZG9pbmcgVVJMIGdsb2JiaW5nIGNvdWxkIGxlYWQgdG8gYQogIHNlZ2ZhdWx0LiBXaGlsZSBmaXhpbmcgdGhpcywgSSBhbHNvIGludHJvZHVjZWQgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiB0aGUKICBnbG9iYmluZyBjb2RlLiAoQWxsIHRoaXMgaXMgYXBwbGljYXRpb24gY29kZSBvdXRzaWRlIGxpYmN1cmwuKQoKRGFuaWVsICg2IEp1bmUpCi0gRGF2aWQgT3JyZWxsIGZvdW5kIG91dCB0aGF0IHNlbmRpbmcgYSBodWdlIEdFVCByZXF1ZXN0IG92ZXIgSFRUUFMgY291bGQKICBtYWtlIGxpYmN1cmwgZmFpbCBhbmQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCgpEYW5pZWwgKDIgSnVuZSkKLSBSaWNoYXJkIEJyYW1hbnRlIGZvdW5kIG91dCB0aGF0ICJDb250ZW50LUxlbmd0aDogMCIgd2FzIG5vdCBwcm9wZXJseSB1c2VkIGJ5CiAgbGliY3VybCBpZiB0aGUgcmVzcG9uc2UtaGVhZGVycyBpbmRpY2F0ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBiZQogIGNsb3NlZC4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwbGllZCwgdGhhdCBtYWtlcyB0aGUgLS1wcm9ncmVzcy1iYXIgdGFrZSB0aGUKICBsb2NhbCBzaXplIGludG8gYWNjb3VudCB3aGVuIGRvaW5nIHJlc3VtZWQgZG93bmxvYWRzLgoKLSBGZWVkYmFjayBmcm9tIFNlcmdlIFNlbWFzaGtvIG1hZGUgbWUgY2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybmVkIHdoZW4KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIGlzIHJldHVybmVkLgoKLSBBbm9ueW1vdXMgaW4gYnVnIHJlcG9ydCAjNzQ1MTIyIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZwogIFNTTF9DVFhfc2V0X29wdGlvbnMoLi4uIFNTTF9PUF9BTEwpIHRvIHdvcmsgYXJvdW5kIGZsYXdzIGluIGV4aXN0aW5nIFNTTAogIGltcGxlbWVudGF0aW9ucy4KCkRhbmllbCAoMjcgTWF5KQotIEFuZHJlYXMgTGV5IGFuZCBSaWNoIEdyYXkgaGVscGVkIG1lIHBvaW50IG91dCB0aGF0IG5vIHZlcnNpb24gb2YgSFAtVVggaGFzCiAgdGhlIHN5cy9zZWxlY3QuaCBoZWFkZXIgZmlsZSBzbyBpbmNsdWRpbmcgaXQgdW5jb25kaXRpb25hbGx5IGluIGN1cmwvbXVsdGkuaAogIGlzIG5vdCBhIGdvb2QgdGhpbmcuIE5vdyB3ZSBjaGVjayBmb3IgSFBVWCBhbmQgYXZvaWQgdXNpbmcgdGhhdCBoZWFkZXIgb24KICBzdWNoIHN5c3RlbXMuCgotIFJ1ZHkgS29lbnRvIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggY3VybCdzIHJlY2VudCBoYWJpdCBvZiBQT1NUaW5nIGRhdGEgaW4KICB0d28gc2VwYXJhdGUgc2VuZCgpIGNhbGxzLCBmaXJzdCB0aGUgaGVhZGVycyBhbmQgdGhlbiB0aGUgZGF0YS4gSSd2ZSBub3cKICBtYWRlIGEgZml4IHRoYXQgZm9yIHN0YXRpYyBhbmQga25vd24gY29udGVudCB0aGF0IGlzIGxlc3MgdGhhbiAxMDBLIGluIHNpemUsCiAgZXZlcnl0aGluZyBpcyBub3cgc2VudCBpbiBvbmUgc2luZ2xlIHN5c3RlbSBjYWxsIGFnYWluLiBUaGlzIGlzIGFsc28gYmV0dGVyCiAgZm9yIG5ldHdvcmsgcGVyZm9ybWFuY2UgcmVhc29ucy4KCi0gSSBtb2RpZmllZCB0aGUgbWFpbiBtYWtlZmlsZSB0byBub3QgYnVpbGQgdGhlIHRlc3Qgc3VpdGUgYW5kIGEgZmV3IG90aGVyCiAgdW5uZWNlc3NhcnkgdGhpbmdzIGJ5IGRlZmF1bHQuIE5vdywgdGhlIHRlc3Qgc3VpdGUgaXMgYnVpbHQgd2hlbiAnbWFrZSB0ZXN0JwogIGlzIHJ1bi4gIFRoaXMgcmVkdWNlcyBidWlsZCB0aW1lIGZvciB0aG9zZSB3aG8gZG9uJ3QgY2FyZSBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgYW5kIGl0IGFsc28gcmVkdWNlcyBjb25mdXNpb24gZm9yIHBlb3BsZSB1c2luZyBwbGF0Zm9ybXMgd2hlcmUgdGhlCiAgdGVzdCBzdWl0ZSBidWlsZCBmYWlscyEKCkRhbmllbCAoMjYgTWF5KQotIENocmlzIExld2lzIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgI2lmZGVmcyBpbiBjdXJsL211bHRpLmggZm9yIFdpbmRvd3MsCiAgd2hpY2ggaXMgbm93IGNvcnJlY3RlZC4KCi0gSmlzIEpveSBmb3VuZCBhbm90aGVyIGZsYXcgaW4gdGhlIFNPQ0s1IGNvZGUsIGFzIGxpYmN1cmwgdHJlYXRlZCB0aGUgc29ja3M1CiAgcHJveHkgYSBsaXR0bGUgdG9vIG11Y2ggbGlrZSBhcyBpZiBpdCB3YXMgYSBodHRwIHByb3h5LgoKRGFuaWVsICgyMyBNYXkpCi0gUmljYXJkbyBDYWRpbWUgZm91bmQgYSBzb2NrZXQgbGVhayB3aGVuIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2l0aG91dAogIGNvbnRlbnRzLiBUZXN0IGNhc2VzIDE0NCBhbmQgMTQ1IHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFJ1ZHkgS29lbnRvIGZvdW5kIHlldCBhbm90aGVyIHByb2JsZW0gd2hlbiBhIEhUVFAgc2VydmVyIHJldHVybnMgb25seSBhCiAgc2luZ2xlLWxpbmUgb2YgY29udGVudHMgd2l0aG91dCBhbnkgaGVhZGVycyBhdCBhbGwuIGxpYmN1cmwgdGhlbiBmYWlsZWQgdG8KICBjb3VudCB0aGUgZGF0YSwgdGh1cyByZXR1cm5pbmcgZXJyb3IgNTIgIm5vIGNvbnRlbnRzIi4gVGVzdCBjYXNlIDY2IHdhcwogIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbyByaWdodC4KClZlcnNpb24gNy4xMC42LXByZTEgKDIzIE1heSAyMDAzKQoKRGFuaWVsICgyMyBNYXkpCi0gSmlzIGluIGJ1ZyByZXBvcnQgIzc0MTg0MSwgZml4ZWQgYSBidWcgaW4gdGhlIFNPQ0tTNSBwcm94eS11c2luZyBjb2RlLgoKRGFuaWVsICgyMiBNYXkpCi0gRGF2aWQgUmVtYWhsIHNldCB1cCBhIHRlc3Qtc2VydmVyIGZvciBtZSBwcm92aWRpbmcgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLAogIGFuZCBJIHdyb3RlIHRoZSBmaXJzdCB3b3JraW5nIGNvZGUgdGhhdCBzdXBwb3J0IGl0LiBUaGUgdGVzdCBzdWl0ZSB3YXMKICBtb2RpZmllZCBzbGlnaHRseSBhcyB3ZWxsIHRvIHdvcmsgYmV0dGVyIGZvciBpdCBhbmQgLS1kaWdlc3Qgd2FzIGFkZGVkIHRvCiAgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIChhbmQgQ1VSTE9QVF9IVFRQRElHRVNUIHRvIHRoZSBsaWJyYXJ5KS4uLiAgUkZDMjYxNwogIGhhcyBhbGwgdGhlIGdvcnkgZGV0YWlscy4KCkRhbmllbCAoMjEgTWF5KQotIERhdmlkIEJhbGF6aWMgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX3VuZXNjYXBlKCkgZGlkbid0IGNoZWNrIHRoYXQgJS1jb2RlcwogIHdlcmUgY29ycmVjdGx5IGZvbGxvd2VkIGJ5IHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgd2hlbiBpdCB1bmVzY2FwZSBzdHJpbmdzLgogIE5vdywgd2UgZG8gdGhlIGNoZWNrIGFuZCBvbmx5ICVYWCBjb2RlcyBhcmUgdW5lc2NhcGVkIGlmIHRoZSBYIGxldHRlcnMgYXJlCiAgaGV4YWRlY2ltYWxzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgYnVpbGQgd2l0aCBkamdwcCBvbiBET1MuCgotIEdpc2xlIFZhbmVtIGltcHJvdmVkIHRoZSBta2hlbHAucGwgc2NyaXB0IHRvIG1ha2UgYSBuaWNlciBtYW51YWwgdGhhdCBpcwogIHNob3duIHdpdGggY3VybCAtTS4KCkRhbmllbCAoMjAgTWF5KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBtb3JlIGNvbnNlcnZhdGl2ZSwgbm90CiAgZXhwZWN0aW5nIGhfYWxpYXNlcyBvZiB0aGUgaG9zdGVudCBzdHJ1Y3QgdG8gYWx3YXlzIGJlIG5vbi1OVUxMLgoKRGFuaWVsICgxOSBNYXkpCi0gQXMgcmVxdWVzdGVkIGJ5IE1hcnRpbiBNaWNobG1heXIgaW4gRGViaWFuIGJ1ZyByZXBvcnQgIzE5MzYzMCwgbGliY3VybCBub3cKICBzdXBwb3J0cyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEFkZGVkCiAgdGVzdCBjYXNlIDYzIHRvIHZlcmlmeSB0aGlzLgoKVmVyc2lvbiA3LjEwLjUgKDE5IE1heSAyMDAzKQoKRGFuaWVsICgxNSBNYXkpCi0gQ2hhbmdlZCB0aGUgb3JkZXIgZm9yIHRoZSBpbl9hZGRyX3QgdGVzdGluZywgYXMgJ3Vuc2lnbmVkIGxvbmcnIHNlZW1zIHRvIGJlCiAgYSB2ZXJ5IGNvbW1vbiB0eXBlIGluZXRfYWRkcigpIHJldHVybnMuCgpEYW5pZWwgKDE0IE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcHJvdmlkZWQgYSBmaXggdGhhdCBjYWxscyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB3YWl0aW5nCiAgZm9yIEZUUCBjb21tYW5kIHJlc3BvbnNlcyB0YWtlID4xIHNlY29uZC4gSXQnbGwgbWFrZSBhcHBsaWNhdGlvbnMgbW9yZQogICJyZXNwb25zaXZlIiBldmVuIHdoZW4gZGVhbGluZyB3aXRoIHZlcnkgc2xvdyBmdHAgc2VydmVycy4KCkRhbmllbCAoMTIgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgdXBsb2FkcyBoYWQgdHdvIHF1aXJrczoKICAgbyB3aGVuIHVzaW5nIEZUUCBQT1JUIGNvbW1hbmQsIGl0IHVzZWQgYmxvY2tpbmcgc29ja2V0cyEKICAgbyBpdCBjb3VsZCBsb29wIGEgbG9uZyB0aW1lIHdpdGhvdXQgZG9pbmcgcHJvZ3Jlc3MgbWV0ZXIgdXBkYXRlcwogIEJvdGggaXRlbXMgYXJlIGZpeGVkIG5vdy4KCkRhbmllbCAoOSBNYXkpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZWQgQ1VSTE9QVF9FTkNPRElORyB0byBzZWxlY3QgYWxsIHN1cHBvcnRlZCBlbmNvZGluZ3MgaWYKICBzZXQgdG8gIiIuICBUaGlzIGZyZWVzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGhhdmluZyB0byBrbm93IHdoaWNoIGVuY29kaW5ncwogIHRoZSBsaWJyYXJ5IHN1cHBvcnRzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgd2UgaGFkIHRocmVlIHVubmVjZXNzYXJ5IGZpbGVzIGluIENWUyB0aGF0IGlzCiAgZ2VuZXJhdGVkIHdpdGggbGlidG9vbGl6ZSwgc28gdGhleSdyZSBub3cgcmVtb3ZlZCBhbmQgbGlidG9vbGl6ZSBpcyBpbnZva2VkCiAgYWNjb3JkaW5nbHkgaW4gdGhlIGJ1aWxkY29uZiBzY3JpcHQuCgotIEF2ZXJ5IEZheSBmb3VuZCBvdXQgdGhhdCB0aGUgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2F5IG9mIGZpcnN0IGNoZWNraW5nIGlmIHRoZQogIGdpdmVuIG5hbWUgaXMgYSBuZXR3b3JrIGludGVyZmFjZSBnYXZlIGEgcmVhbCBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIExpbnV4LAogIHNvIG5vdyB3ZSBtb3JlIGFwcHJvcHJpYXRlbHkgZmlyc3QgY2hlY2sgaWYgaXQgaXMgYW4gSVAgbnVtYmVyIGFuZCBpZiBzbwogIHdlIGRvbid0IGNoZWNrIGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggdGhhdCBuYW1lLgoKLSBDVVJMT1BUX0ZUUF9VU0VfRVBSVCBhZGRlZC4gU2V0IHRoaXMgdG8gRkFMU0UgdG8gZGlzYWJsZSBsaWJjdXJsJ3MgYXR0ZW1wdHMKICB0byB1c2UgRVBSVCBhbmQgTFBSVCBiZWZvcmUgdGhlIHRyYWRpdGlvbmFsIFBPUlQgY29tbWFuZC4gVGhlIGNvbW1hbmQgbGluZQogIHRvb2wgc2V0cyB0aGlzIG9wdGlvbiB3aXRoICctLWRpc2FibGUtZXBydCcuCgpWZXJzaW9uIDcuMTAuNS1wcmUyICg2IE1heSAyMDAzKQoKRGFuaWVsICg2IE1heSkKLSBLZXZpbiBEZWxhZmllbGQgcmVwb3J0ZWQgYW5vdGhlciBjYXNlIHdoZXJlIHdlIGRpZG4ndCBjb3JyZWN0bHkgY2hlY2sgZm9yCiAgRUFHQUlOIGJ1dCBvbmx5IEVXT1VMREJMT0NLLCB3aGljaCBjYXVzZWQgYmFkbmVzcyBvbiBIUFVYLgoKRGFuaWVsICg0IE1heSkKLSBCZW4gR3JlZWFyIG5vdGljZWQgdGhhdCB0aGUgY2hlY2sgZm9yICd3cml0YWJsZSBhcmd2JyBleGl0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB3aGVuIHJ1biBmb3IgY3Jvc3MtY29tcGlsaW5nLCB3aGljaCB3YXNuJ3QgbmljZS4gTm93IGl0J2xsIGRlZmF1bHQgdG8KICBubyBhbmQgb3V0cHV0IGEgd2FybmluZyBhYm91dCB0aGUgZmFjdCB0aGF0IGl0IHdhcyBub3QgY2hlY2tlZCBmb3IuCgpEYW5pZWwgKDIgTWF5KQotIEFkZGVkIHRlc3QgY2FzZSA2MiBhbmQgZml4ZWQgc29tZSBtb3JlIG9uIHRoZSBjb29raWUgc2VuZGluZyB3aXRoIGEgY3VzdG9tCiAgSG9zdDogaGVhZGVyIHNldC4KCkRhbmllbCAoMSBNYXkpCi0gQW5keSBDZWRpbG5payBmaXhlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncy4KCi0gTWFkZSB0aGUgIlNTTCByZWFkIGVycm9yOiA1IiBlcnJvciBtZXNzYWdlIG1vcmUgdmVyYm9zZSwgYnkgYWRkaW5nIGNvZGUgdGhhdAogIHF1ZXJpZXMgdGhlIE9wZW5TU0wgbGlicmFyeSB0byBmaWxsIGluIHRoZSBlcnJvciBidWZmZXIuCgpEYW5pZWwgKDMwIEFwcikKLSBBZGRlZCBzeXMvc2VsZWN0LmggaW5jbHVkZSBpbiB0aGUgY3VybC9tdWx0aS5oIGZpbGUsIGFmdGVyIGhhdmluZyBiZWVuCiAgcmVtaW5kZWQgYWJvdXQgdGhpcyBieSBSaWNoIEdyYXkuCgotIEkgbWFkZSBlYWNoIHRlc3Qgc2V0IGl0cyBvd24gc2VydmVyIHJlcXVpcmVtZW50cywgdGh1cyBhYmFuZG9uaW5nIHRoZQogIHByZXZpb3VzIHN5c3RlbSB3aGVyZSB0aGUgdGVzdCBudW1iZXIgaW1wbGllZCB3aGF0IHNlcnZlcihzKSB0byB1c2UgZm9yIGEKICBzcGVjaWZpYyB0ZXN0LgoKLSBEYXZpZCBCYWxhemljIG1hZGUgY3VybCBtb3JlIFJGQzE3MzgtY29tcGxpYW50IGZvciBGVFAgVVJMcywgYnkgZml4aW5nIHNvCiAgdGhhdCBsaWJjdXJsIG5vdyB1c2VzIG9uZSBDV0QgY29tbWFuZCBmb3IgZWFjaCBwYXRoIHBhcnQuIEEgYnVuY2ggb2YgdGVzdAogIGNhc2VzIHdlcmUgZml4ZWQgdG8gd29yayBhY2NvcmRpbmdseS4KCi0gQ29va2llIGZpeGVzOgoKICBBLiBTYXZlIGRvbWFpbnMgaW4gamFycyBsaWtlIE1vemlsbGEgZG9lcy4gSXQgbWVhbnMgYWxsIGRvbWFpbnMgc2V0IGluCiAgICAgU2V0LUNvb2tpZTogaGVhZGVycyBhcmUgZG90LXByZWZpeGVkLgogIEIuIFNhdmUgYW5kIHVzZSB0aGUgJ3RhaWxtYXRjaCcgZmllbGQgaW4gdGhlIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGphcnMKICAgICAodGhlIHNlY29uZCBjb2x1bW4pLgogIEMuIFJlamVjdCBjb29raWVzIHVzaW5nIGlsbGVnYWwgZG9tYWlucyBpbiB0aGUgU2V0LUNvb2tpZTogbGluZS4gQ29uY2VybnMKICAgICBib3RoIGRvbWFpbnMgd2l0aCB0b28gZmV3IGRvdHMgb3IgZG9tYWlucyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50bHkKICAgICBvcGVyYXRpbmcgc2VydmVyIGhvc3QncyBkb21haW4uCiAgRC4gU2V0IHRoZSBwYXRoIHBhcnQgYnkgZGVmYXVsdCB0byB0aGUgb25lIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGlmIG5vbmUgd2FzCiAgICAgc2V0IGluIHRoZSBTZXQtQ29va2llIGxpbmUuCgogIFRvIG1ha2UgaXRlbSBDIHJlYWxseSBnb29kLCBJIGFsc28gbWFkZSBsaWJjdXJsIG5vdGljZSBjdXN0b20gSG9zdDogaGVhZGVycwogIGFuZCBleHRyYWN0IHRoZSBob3N0IG5hbWUgc2V0IGluIHRoZXJlIGFuZCB1c2UgdGhhdCBhcyB0aGUgaG9zdCBuYW1lIGZvciB0aGUKICBzaXRlIHdlJ3JlIGdldHRpbmcgdGhlIGNvb2tpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgc2l0ZSdzCiAgSVAtYWRkcmVzcywgYnV0IHN0aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSBhbmQgc2VuZCBpdHMgY29va2llcyBwcm9wZXJseSBpZgogIHlvdSBwcm92aWRlIGEgdmFsaWQgSG9zdDogbmFtZSBmb3IgdGhlIHNpdGUuCgpEYW5pZWwgKDI5IEFwcikKLSBQZXRlciBLb3ZhY3MgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDVVJMSU5GT19DT05ORUNUX1RJTUUgd29yayBmaW5lCiAgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlICh0b28pLgoKVmVyc2lvbiA3LjEwLjUtcHJlMSAoMjMgQXByIDIwMDMpCgpEYW5pZWwgKDIzIEFwcikKLSBVcGdyYWRlZCB0byBsaWJ0b29sIDEuNS4KCkRhbmllbCAoMjIgQXByKQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IGN1cmxfZWFzeV9zZXRvcHQoKSB3aWxsIGFsd2F5cyAod3JvbmdseSkKICByZXR1cm4gQ1VSTEVfT0sgbm8gbWF0dGVyIHdoYXQgaGFwcGVucy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHNvbWUgZ3ppcCBkZWNvbXByZXNzaW9uIGJ1Z3MgYW5kIGZsYXdzLgoKRGFuaWVsICgxNiBBcHIpCi0gRml4ZWQgbWlub3IgdHlwbyBpbiBtYW4gcGFnZSwgcmVwb3J0ZWQgaW4gdGhlIERlYmlhbiBidWcgdHJhY2tlci4KCkRhbmllbCAoMTUgQXByKQotIEZpeGVkIHNvbWUgRlRQIHRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgZmFpbGVkIG9uIG15IFNvbGFyaXMgaG9zdCwgZHVlCiAgdG8gdGhlIGNvbmZpZy5oIG5vdCBiZWluZyBpbmNsdWRlZCBiZWZvcmUgdGhlIHN5c3RlbSBoZWFkZXJzLiBXaGVuIGRvbmUgdGhhdAogIHdheSwgaXQgZGlkIGdldCBhIG1peGVkIHNlbnNlIG9mIGlmIGJpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIG9yIG5vdCBhbmQgdGhlbgogIHN0YXQoKSBhbmQgZnN0YXQoKSAoYXMgdXNlZCBpbiB0ZXN0IGNhc2UgNTA1KSBnb3QgY29uZnVzZWQgYW5kIGZhaWxlZCB0bwogIHJldHVybiBhIHByb3BlciBmaWxlIHNpemUuCgotIEZvcm1wb3N0aW5nIGEgZmlsZSB1c2luZyBhIC5odG1sIHN1ZmZpeCBpcyBub3cgcHJvcGVybHkgc2V0IHRvIENvbnRlbnQtVHlwZTogICAgdGV4dC9odG1sLgoKRGFuaWVsICgxNCBBcHIpCi0gRml4ZWQgdGhlIFNTTCBlcnJvciBoYW5kbGluZyB0byByZXR1cm4gcHJvcGVyIFNTTCBlcnJvciBtZXNzYWdlcyBhZ2FpbiwgdGhleQogIGJyb2tlIGluIDcuMTAuNC4gSSBhbHNvIGF0dGVtcHQgdG8gdHJhY2sgZG93biBDQSBjZXJ0IHByb2JsZW1zIGFuZCB0aGVuCiAgcmV0dXJuIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUuCgotIFRoZSBjdXJsIHRvb2wgbm93IGludGVyY2VwdHMgdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZSBhbmQgZGlzcGxheXMKICBhIGZhaXJseSBiaWcgYW5kIGV4cGxhbmF0b3J5IGVycm9yIG1lc3NhZ2UuIEtldmluIFJvdGggaGVscGVkIG1lIG91dCB3aXRoCiAgdGhlIHdvcmRpbmcuCgpEYW5pZWwgKDExIEFwcikKLSBOaWMgSGluZXMgcHJvdmlkZWQgYSBzZWNvbmQgcGF0Y2ggZm9yIGd6aXAgZGVjb21wcmVzc2lvbiwgYW5kIGZpeGVkIGEgYnVnCiAgd2hlbiBkZWZsYXRlIG9yIGd6aXAgY29udGVudHMgd2VyZSBkb3dubG9hZGVkIHVzaW5nIGNodW5rZWQgZW5jb2RpbmcuCgotIERhbiBGYW5kcmljaCBtYWRlIGxpYmN1cmwgc3VwcG9ydCBhdXRvbWF0aWMgZGVjb21wcmVzc2lvbiBvZiBnemlwIGNvbnRlbnRzCiAgKGFzIGFuIGFkZGl0aW9uIHRvIHRoZSBwcmV2aW91cyBkZWZsYXRlIHN1cHBvcnQpLgoKLSBJIG1hZGUgdGhlIENXRCBjb21tYW5kIGR1cmluZyBGVFAgc2Vzc2lvbiBjb25zaWRlciBhbGwgMnh5IGNvZGVzIHRvIGJlIE9LCiAgcmVzcG9uc2VzLgoKRGFuaWVsICgxMCBBcHIpCi0gVmxhZCBLcnVwaW4gZml4ZWQgYSBVUkwgcGFyc2luZyBpc3N1ZS4gVVJMcyB0aGF0IHdlcmUgbm90IHVzaW5nIGEgc2xhc2gKICBhZnRlciB0aGUgaG9zdCBuYW1lLCBidXQgc3RpbGwgaGFkICI/IiBhbmQgcGFyYW1ldGVycyBhcHBlbmRlZCwgYXMgaW4KICAiaHR0cDovL2hvc3RuYW1lLmNvbT9mb29iYXI9bW9vIiwgd2VyZSBub3QgcHJvcGVybHkgcGFyc2VkIGJ5IGxpYmN1cmwuCgpEYW5pZWwgKDkgQXByKQotIE1hZGUgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdvcmsgZm9yIEZUUCB0cmFuc2ZlcnMsIHVzaW5nIHRoZSBzYW1lIHN5bnRheCBhcwogIGZvciBIVFRQLiBUaGlzIHRoZW4gbWFkZSAteiB3b3JrIGZvciBmdHAgdHJhbnNmZXJzIHRvby4gQWRkZWQgdGVzdCBjYXNlIDEzOQogIGFuZCAxNDAgZm9yIHZlcmlmeWluZyB0aGlzLgoKLSBHZXR0aW5nIHRoZSBmaWxlIGRhdGUgb2YgYW4gZnRwIGZpbGUgdXNlZCB0aGUgd3JvbmcgdGltZSB6b25lIHdoZW4KICBkaXNwbGF5ZWQuIEl0IGlzIHN1cHBvc2VkbHkgYWx3YXlzIEdNVC4gQWRkZWQgdGVzdCBjYXNlIDE0MSBmb3IgdGhpcy4KCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgc3VwcG9ydCBNRFRNLgoKLSBUaGUgZGVmYXVsdCBERUJVR0ZVTkNUSU9OLCBhcyBlbmFibGVkIHdpdGggQ1VSTE9QVF9WRVJCT1NFIG5vdyBvdXRwdXRzCiAgQ1VSTElORk9fSEVBREVSX0lOIGRhdGEgYXMgd2VsbC4gVGhlIG1vc3Qgbm90YWJsZSBlZmZlY3QgZnJvbSB0aGlzIGlzIHRoYXQKICB1c2luZyBjdXJsIC12LCB5b3UgZ2V0IHRvIHNlZSB0aGUgaW5jb21pbmcgImhlYWRlcnMiIGFzIHdlbGwuIFRoaXMgaXMKICBwZXJoYXBzIG1vc3QgdXNlZnVsIHdoZW4gZG9pbmcgZnRwLgoKRGFuaWVsICg4IEFwcikKLSBKYW1lcyBCdXJzYSBmaXhlZCBhIGZsYXcgaW4gdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIGNvZGUsIHdoaWNoIG1pc3NlZAogIHRoZSBmaXJzdCBsZXR0ZXIgaWYgbm8gc3BhY2UgZm9sbG93ZWQgdGhlIGNvbG9uLgoKLSBNYWdudXMgTmlsc3NvbiBwb2ludGVkIG91dCB0aGF0IHNoYXJlLmMgd2FzIG1pc3NpbmcgaW4gdGhlIE1TVkMgcHJvamVjdAogIGZpbGUuCgpEYW5pZWwgKDYgQXByKQotIFJ5YW4gV2VhdmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ0EgY2VydCBidW5kbGUgbm90IGdldCBpbnN0YWxsZWQKICBhbnltb3JlIHdoZW4gJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsJyBoYXMgYmVlbiB1c2VkLgoKRGFuaWVsICg0IEFwcikKLSBNYXJ0aWpuIEJyb2VubGFuZCBmb3VuZCBhbm90aGVyIGNhc2VzIHdoZXJlIGEgc2VydmVyIGFwcGxpY2F0aW9uIGRpZG4ndAogIGxpa2UgdGhlIGJvdW5kYXJ5IHN0cmluZyB1c2VkIGJ5IGN1cmwgd2hlbiBkb2luZyBhIG11bHRpLXBhcnQvZm9ybXBvc3QuIFdlCiAgbW9kaWZpZWQgdGhlIGJvdW5kYXJ5IHN0cmluZyB0byBsb29rIGxpa2UgdGhlIG9uZSBJRSB1c2VzLCBhcyB0aGlzIGlzCiAgcHJvYmFibHkgZ29ubmEgbWFrZSBjdXJsIHdvcmsgd2l0aCBtb3JlIGFwcGxpY2F0aW9ucy4KCkRhbmllbCAoMyBBcHIpCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0aGF0IGEgYnVuY2ggb2YgdGVzdHMgZmFpbHMgb24gY3lnd2luLiBPbmUgc2V0IGZhaWxzCiAgd2hlbiB1c2luZyBwZXJsIDUuOCAoYW5kIHRoZXkgcnVuIGZpbmUgd2l0aCBwZXJsIDUuNiksIGFuZCBhbm90aGVyIHNldAogIGZhaWxlZCBiZWNhdXNlIG9mIGFuIGFydGlmYWN0IGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IEkKICBjb3JyZWN0ZWQuIEl0IHR1cm5lZCBvdXQgdGhlIEZUUCBzZXJ2ZXIgY29kZSB3YXMgc3RpbGwgaGF2aW5nIGEgZmlsZSBvcGVuZWQKICB3aGlsZSB0aGUgbWFpbiB0ZXN0IHNjcmlwdCByZW1vdmVkIGl0IGFuZCBpbnZva2VkIHRoZSBIVFRQIHNlcnZlciB0aGF0CiAgYXR0ZW1wdGVkIHRvIGNyZWF0ZSB0aGUgc2FtZSBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIEZUUCBzZXJ2ZXIga2VwdCBvcGVuLgogIFRoaXMgb3BlcmF0aW9uIHdvcmtzIGZpbmUgb24gdW5peCwgYnV0IG5vdCBvbiBjeWd3aW4uCgpWZXJzaW9uIDcuMTAuNCAoMiBBcHIgMjAwMykKCkRhbmllbCAoMSBBcHIpCi0gQWRkZWQgdGVzdCBjYXNlIDUwNSB0byBleGVyY2lzZSBGVFAgdXBsb2FkIHdpdGggcmVuYW1lIGRvbmUgd2l0aCBsaWJjdXJsLAogIGFuZCBmb3IgdGhhdCBJIGhhZCB0byBleHRlbmQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIGRlYWwgd2l0aCB0aGUKICBSTkZSIGFuZCBSTlRPIGNvbW1hbmRzLgoKRGFuaWVsICgzMSBNYXIpCi0gRXZlbiBtb3JlIFNTTCBjb25maWcgY2hlY2sgbW9kaWZpY2F0aW9ucyBhZnRlciBSaWNoYXJkJ3MgdGVzdGluZy4KClZlcnNpb24gNy4xMC40LXByZTYgKDMxIE1hciAyMDAzKQoKRGFuaWVsICgzMSBNYXIpCi0gTW9yZSBmaXhlcyBmb3IgdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hlIGNoZWNrcyB3aGVuIFNTTCBjb25maWdzIGFyZSBjaGFuZ2VkCiAgYmV0d2VlbiBjb25uZWN0aW9ucy4gQmFzZWQgb24gdGVzdHMgYW5kIHRhbGtzIHdpdGggUmljaGFyZCBCcmFtYW50ZS4KCi0gR3VpbGxhdW1lIENvdHRlbmNlYXUgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFkZGVkIENVUkxPUFRfVU5SRVNUUklDVEVEX0FVVEguCiAgV2hlbiBlbmFibGVkLCBpdCB3aWxsIHByZXZlbnQgbGliY3VybCBmcm9tIGxpbWl0aW5nIHRvIHdoaWNoIGhvc3QgaXQgc2VuZHMKICB1c2VyK3Bhc3N3b3JkIHRvIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4gQnkgZGVmYXVsdCwgbGliY3VybCBvbmx5IHNlbmRzCiAgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIGhvc3QgdXNlZCBpbiB0aGUgZmlyc3QgVVJMLCBidXQgd2l0aCB0aGlzCiAgb3B0aW9uIHNldCBpdCB3aWxsIHNlbmQgdGhlIGF1dGggaW5mbyB0byBhbGwgaG9zdHMgaXQgZm9sbG93cyBsb2NhdGlvbgogIGhlYWRlcnMgdG8uIFRoZSBuZXcgdG9vbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciB0aGlzIGlzIG5hbWVkCiAgIi0tbG9jYXRpb24tdHJ1c3RlZCIuCgotIEZyYW5raWUgRm9uZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIGlmIHlvdSByZS11c2VkIGFuIGVhc3kgaGFuZGxlCiAgd2l0aCBhIHByb3h5LCBhbmQgeW91IGZpcnN0IG1hZGUgYSBodHRwczovLyBjb25uZWN0aW9uIHRvIGEgaG9zdCBhbmQgdGhlbgogIHN3aXRjaGVkIHRvIGEgaHR0cDovLyBvbmUgdG8gdGhlIHNhbWUgaG9zdC4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgcmUtdXNlCiAgdGhlIHNhbWUgY29ubmVjdGlvbiBmb3IgaXQgYW5kIGZhaWwgdG8gZ2V0IHRoZSBzZWNvbmQgVVJMIHByb3Blcmx5CgpEYW5pZWwgKDI5IE1hcikKLSBEYW4gU2hlYXJlcidzIGZpeCB0aGF0IG1ha2VzIGN1cmwgY29tcGxhaW4gaWYgaW52b2tlZCB3aXRoIG5vdGhpbmcgYnV0ICJjdXJsCiAgLU8iIHdhcyBhcHBsaWVkLgoKRGFuaWVsICgyNiBNYXIpCi0gQnJ5YW4gS2VtcCB3YXMgZnJpZW5kbHkgZW5vdWdoIHRvIGxlbmQgbWUgYW4gYWNjb3VudCBvbiBoaXMgUmVkaGF0IDkgYm94IGFuZAogIEkgY291bGQgZml4IHRoZSBjb25maWd1cmUgcHJvYmxlbXMgb24gcmVkaGF0IDguMSBhbmQgOSBpbiBubyB0aW1lIHRoYW5rcyB0bwogIHRoaXMuIFRoYW5rcyBhIGJ1bmNoIEJyeWFuIQoKRGFuaWVsICgyNSBNYXIpCi0gUmVuYW1lZCBjb25maWd1cmUuaW4gdG8gY29uZmlndXJlLmFjCgpWZXJzaW9uIDcuMTAuNC1wcmU1ICgyNSBNYXIgMjAwMykKCkRhbmllbCAoMjUgTWFyKQotIFJpY2hhcmQgQnJhbWFudGUgcHJvdmlkZWQgYSBmaXggZm9yIGEgaGFuZGxlIHJlLXVzZSBwcm9ibGVtIHNlZW4gd2hlbiB5b3UKICBjaGFuZ2Ugb3B0aW9ucyBvbiBhbiBTU0wtZW5hYmxlZCBjb25uZWN0aW9uIGJldHdlZW4gcmVxdWVzdHMuIFByZXZpb3VzbHksCiAgY2hhbmdpbmcgcGVlciB2ZXJpZmljYXRpb24gb3IgaG9zdCB2ZXJpZmljYXRpb24gYW5kIHNpbWlsYXIgdGhpbmdzIHdhcyBub3QKICB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBhIGNvbm5lY3Rpb24gd2VyZSBjaGVja2VkIGZvciByZS11c2UgYW5kIHRodXMKICBlbmFibGluZyBzdHJpY3RlciBjaGVjayBiZXR3ZWVuIHJlcXVlc3RzIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uIG1hZGUgbm8KICBkaWZmZXJlbmNlIGFuZCB0aGUgY29ubmVjdGlvbiB3b3VsZCB0aHVzIGJlIHVzZWQgZXJyb25lb3VzbHkuCgpEYW5pZWwgKDI0IE1hcikKLSBH9nR6IEJhYmluLUViZWxsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGNhLWJ1bmRsZS5jcnQgZmlsZSBjb250YWluZWQgYQogIGNlcnRpZmljYXRlIGZyb20gVHJ1c3RjZW50ZXIgdGhhdCB3YXMgYSBkZW1vIGNlcnRpZmljYXRlIG9ubHkgdGhhdCB3YXMgbmV2ZXIKICBpbnRlbmRlZCB0byBiZSBwYXJ0IG9mIGEgQ0EgYnVuZGxlLgoKRGFuaWVsICgyMSBNYXIpCi0gTGlmZSBpcyBhIG15c3RlcnkuIFdpdGhpbiBhIHRpbWUgcGVyaW9kIG9mIDE3IGhvdXJzLCBUaW0gUG9wZSBhbmQgTWljaGFlbAogIENodXJjaGlsbCBmaWxlZCBvbmUgYnVnIHJlcG9ydCBlYWNoLCBib3RoIGlkZW50aWZ5aW5nIHByb2JsZW1zIHdpdGggYSBzZWNvbmQKICB0cmFuc2ZlciB3aGVuIGRvaW5nIHBlcnNpc3RlbnQgdHJhbnNmZXJzIHJlLXVzaW5nIGEgY29ubmVjdGlvbi4gVGltJ3Mgb25lIGlzCiAgIzcwNjYyNCwgbGFiZWxlZCAiTXVsdGlwbGUgdXBsb2FkcyBwZXIgaGFuZGxlIGZhaWwiIGFuZCBNaWNoYWVsJ3MgIzcwNzAwMwogICJEb2VzIG5vdCBzZW5kIEF1dGhvcml6YXRpb246IGhlYWRlciB3aGVuIHJldXNpbmcgY29ubmVjdGlvbiIuIEkgY291bGQgdHJhY2sKICBib3RoIGRvd24gdG8gdGhlIHNhbWUgcGllY2Ugb2YgbG9naWMgYW5kIGl0IHR1cm5lZCBvdXQgbGliY3VybCB3YXMgbm90IHVzaW5nCiAgbmV3IHNldHRpbmdzIHByb3Blcmx5IHdoZW4gcmUtdXNpbmcgYW4gZXhpc3RpbmcgY29ubmVjdGlvbi4gVGhpcyBjb25jZXJuZWQKICBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcgYW5kIGludm9sdmVkIGV4YWN0bHkgdGhvc2UgcGllY2VzIHRoZXNlIHR3bwogIHJlcG9ydHMgaWRlbnRpZmllZC4gVGhpcyBjb2RlIGhhcyBiZWVuIHRoaXMgZmF1bHR5IHNpbmNlIHRoZSBkYXkgSQogIGludHJvZHVjZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN1cHBvcnQgaW4gbGliY3VybCwgbW9yZSB0aGFuIDIgeWVhcnMgYWdvLgoKRGFuaWVsICgyMCBNYXIgMjAwMykKLSBGaXZlIHllYXIgYW5uaXZlcnNhcnkuIFRvZGF5IGZpdmUgeWVhcnMgYWdvLCB0aGUgZmlyc3QgZXZlciBjdXJsIHJlbGVhc2Ugc2F3CiAgdGhlIGxpZ2h0IG9mIGRheS4KCkRhbmllbCAoMTcgTWFyKQotIEFuZHkgQ2VkaWxuaWsgY29ycmVjdGVkIGZsYXdzIGluIHNvbWUgbGliY3VybCBleGFtcGxlLXVzYWdlIHNvdXJjZXMuCgpEYW5pZWwgKDE2IE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSByZXBvcnRlZCB0aGF0IHRoZSBmaXggZnJvbSBNYXJjaCAybmQgd2FzIGluY29tcGxldGUuCgotIEFkZGVkIGNvZGUgdG8gdGhlIGNvbmZpZ3VyZS5pbiB0byBjaGVjayBmb3Igc2VsZWN0KCkgYXJndW1lbnQgdHlwZXMuIEkndmUKICBub3QgbWFkZSBhbnkgY29kZSB1c2UgdGhlIHJlc3VsdHMganVzdCB5ZXQgdGhvdWdoLgoKRGFuaWVsICgxNSBNYXIpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgdHdvIHBhdGNoZXMgdG8gYnVpbGQgYmV0dGVyIG9uIFdpbmRvd3MuCgotIEFkanVzdGVkIHRoZSB0ZXN0IHN1aXRlIGNvZGUgdG8gYmV0dGVyIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2ZXIocykgcmVxdWlyZWQKICBmb3IgYSBzcGVjaWZpYyB0ZXN0IGlzIHByb3Blcmx5IHN0YXJ0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgaXMgYXR0ZW1wdGVkLgogIE1hbnkgdGVzdHMgbm93IHJ1biBhIGxvdCBmYXN0ZXIgdGhhbiBiZWZvcmUuCgpEYW5pZWwgKDE0IE1hcikKLSBBbm90aGVyIGNvbmZpZ3VyZS5pbiBhZGp1c3RtZW50IG1hZGUgdGhlIGNvbmZpZ3VyZSBkZXRlY3QgZnVuY3Rpb25zIHByb3Blcmx5CiAgb24gSFBVWCBub3cuCgpEYW5pZWwgKDEzIE1hcikKLSBQaGlsaXBwZSBSYW91bHQgZml4ZWQgcHJlNC1jb21waWxlIHF1aXJrcyBmb3IgRnJlZUJTRC4KClZlcnNpb24gNy4xMC40LXByZTQgKDEzIE1hciAyMDAzKQoKRGFuaWVsICgxMyBNYXIpCi0gQWRkZWQgYSBiYWNrdXAtY2hlY2sgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBmb3VuZCBieSBBQ19DSEVDS19GVU5DUygpCiAgYXMgSSBiZWxpZXZlIHNvbWUgY2hlY2tzIG9uIEhQVVggbmVlZCB0aGlzLiBBdCBsZWFzdCBzb21lIG9mIHRoZSBpbmZvIGdpdmVuCiAgdG8gdXMgYnkgUmljayBKb25lcyBzZWVtZWQgdG8gaW5kaWNhdGUgdGhpcy4KCkRhbmllbCAoMTIgTWFyKQotIFRob21hcyBUb25pbm8gZm91bmQgb3V0IHRoYXQgaWYgeW91IHVzZWQgdGhlIGN1cmwgdG9vbCB0byBkbyBQVVQgb3BlcmF0aW9ucwogIGFzIGluICdjdXJsIHd3dy5mb28uY29tL2Rpci8gLVQgZmlsZScgYW5kIHRoZSBmaWxlIG5hbWUgaW5jbHVkZWQgZm9yIGV4YW1wbGUKICBzcGFjZSBvciBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgZG9uJ3QgYmVsb25nIGluIFVSTHMsIGN1cmwgZGlkIG5vdCBwcm9wZXJseQogIFVSTCBlbmNvZGUgdGhlbSBiZWZvcmUgdXNpbmcgdGhlbSBpbiB0aGUgVVJMLgoKLSBBZGRlZCBhbiBvcHRpb24gdG8gY29uZmlndXJlIGNhbGxlZCAtLWVuYWJsZS1saWJnY2MgdGhhdCBzaW1wbHkgYWRkcyAtbGdjYwogIHRvIHRoZSBMSUJTIHZhcmlhYmxlLCBhcyB0aGlzIHNlZW1zIHRvIGJlIGEgY29tbW9uIHByb2JsZW0uCgotIEkgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZS5pbiBmaWxlLCBzbyB0aGF0IHRoZSBoZWFkZXJzIGFyZSBub3cgY2hlY2tlZCBpbiBhbgogIG9yZGVyIG9mICJ2aWFsaXR5Ii4gV2UgbXVzdCBhbHNvIG1ha2Ugc3VyZSB0byB1c2UgdGhlICJkZWZhdWx0IGhlYWRlcnMiCiAgcGFyYW1ldGVyIHRvIEFDX0NIRUNLX0hFQURFUlMoKSBzbyB0aGF0IGhlYWRlcnMgYXJlIGNoZWNrZWQgd2l0aCB0aGUgcHJvcGVyCiAgcHJlcmVxdWlzaXRlcyBpbmNsdWRlZCAoaS5lIGFsbCB0aGUgbWFqb3IgYW5kIGdlbmVyYWxseSBpbXBvcnRhbnQgaGVhZGVyCiAgZmlsZXMgYXJlIGluY2x1ZGVkIHRoZXJlIGJ5IGRlZmF1bHQpLiBUaGlzIG1pZ2h0IGJlIHdoYXQgd2UgbmVlZCBmb3IgdmFyaW91cwogIFN1biwgSFAsIEFJWCBhbmQgVHJ1NjQgc3lzdGVtcyB0byBiZWhhdmUgZ29vZCBhZ2FpbiBvbiB0aGUgaGVhZGVyIGNoZWNrCiAgZnJvbnQuCgotIFJpY2sgSm9uZXMgcG9pbnRlZCBvdXQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3Mgb24gSFAtVVggdGhhdCBJIGFkZHJlc3NlZC4KCi0gSSBtYWRlIHRoZSBjb25maWd1cmUgLS1oZWxwIG91dHB1dCBuaWNlciBieSB1c2luZyBBQ19IRUxQX1NUUklORygpIGEgbG90CiAgbW9yZS4KCkRhbmllbCAoMTEgTWFyKQotIENocmlzdG9waGUgRGVtb3J5IGZpeGVkIHRoZSBzb2NrZXQgc2VuZGluZyBjb2RlIHRvIHdvcmsgYmV0dGVyIG9uIEhQLVVYCiAgd2hlbiBzZW5kaW5nIGRhdGEgdG8gYSBzb2NrZXQgdGhhdCB3b3VsZCBibG9jay4gSXQgdGhlbiByZXR1cm5zIEVBR0FJTiwgbm90CiAgRVdPVUxEQkxPQ0suCgotIFJpY2hhcmQgR29ydG9uIGltcHJvdmVkIHRoZSBzZWVkaW5nIGZ1bmN0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgYSBnb29kCiAgYW5kIHJlbGlhYmxlIHJhbmRvbSBzb3VyY2UuCgotIFJpY2hhcmQgR29ydG9uIGZpeGVkIGEgZmV3IHdhcm5pbmdzIHRoYXQgcG9wcGVkIHVwIHdoZW4geW91IGJ1aWx0IGN1cmwKICB1c2luZyB0aGUgU3VuIGNvbXBpbGVyIG9uIGEgNjRiaXQgU1BBUkMgcGxhdGZvcm0uCgotIE1hcnRpbiBDLiBNYXJ0aW4gZml4ZWQgYSBjYXNlIHdoZXJlIGEgY29ubmVjdCBmYWlsdXJlIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBkaWRuJ3QgcHJvZHVjZSBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIHN0cmluZy4KCkRhbmllbCAoMTAgTWFyKQotIFJldmVydGVkIGx0bWFpbi5zaCBiYWNrIHRvIGxpYnRvb2wgMS40LjIgc3RhdHVzIGFnYWluLCBhcyB0aGUgMS40LjMgdmVyc2lvbgogIGJyb2tlIHRoZSBidWlsZCBvbiBudW1lcm91cyBwbGF0Zm9ybXMuIEl0IHNlZW1zIHRoYXQgbGlidG9vbCAxLjQuMyBwdXRzIHNvbWUKICByZXF1aXJlbWVudHMgb24gd2hhdCB2ZXJzaW9ucyBvZiB0aGUgb3RoZXIgdG9vbHMgKGF1dG9jb25mICsgYXV0b21ha2UpIHRoYXQKICBJIGFtIG5vdCBmYW1pbGlhciB3aXRoIGFuZCB0aHVzIEkgY291bGRuJ3QgZnVsZmlsbCBhdCB0aGlzIHBvaW50LgoKICBZZXMsIHRoaXMgaXMgbW9yZSB0aGFuIG1pbGRseSBmcnVzdHJhdGluZy4KCkRhbmllbCAoNyBNYXIpCi0gUnVuIGxpYnRvb2xpemUgdmVyc2lvbiAxLjQuMy4KClZlcnNpb24gNy4xMC40LXByZTMgKDQgTWFyIDIwMDMpCgpEYW5pZWwgKDMgTWFyKQotIEFkZGVkIHNoYXJlLm9iaiB0byB0aGUgVkM2IGFuZCBCb3JsYW5kIGxpYmN1cmwgbWFrZWZpbGVzLgoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZm91bmQgYW5kIGludmVzdGlnYXRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIG9uIEFJWCwKICBwcmVzdW1hYmx5IG9ubHkgb24gNC4zIG9yIGxhdGVyLiBnZXRob3N0YnluYW1lX3IoKSBpcyBub3QgcmV0dXJuaW5nIGRhdGEKICB0aGF0IGlzIHBvc3NpYmxlIHRvICJrZWVwIiBhbmQgY2FjaGUgdGhlIHdheSBsaWJjdXJsIGRvZXMuIEJ1dCBpbnN0ZWFkIHRoZXNlCiAgdmVyc2lvbnMgb2YgQUlYIHVzZXMgYSBnZXRob3N0YnluYW1lKCkgdGhhdCB3b3JrcyB0aHJlYWQtc2FmZWx5IHdlIGNhbgogIGluc3RlYWQgdXNlIHRoZSBvcmRpbmFyeSBnZXRob3N0YnluYW1lKCkgYW5kIG91ciBwYWNrX2hvc3RlbnQoKSBhcHByb2FjaCB0bwogIGFjaGlldmUgd2hhdCB3ZSB3YW50LiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgYXR0ZW1wdHMgdG8gZGV0ZWN0IEFJWCA0LjMgb3IKICBsYXRlciB0byBhZGp1c3QgZm9yIHRoaXMuCgpEYW5pZWwgKDIgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIGZvdW5kIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDcuMTAuMyB3aGVuIHlvdSBmaXJzdCBkaWQgYQogIFBPU1QgYW5kIHRoZW4gYmFjayB0byBhIEdFVCB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZS4KCkRhbmllbCAoMjggRmViKQotIFJlbW92ZWQgdGhlIHN0cmVxdWFsIGFuZCBzdHJuZXF1YWwgZGVmaW5lcyBmcm9tIGN1cmwvY3VybC5oIGhlYWRlci4gVGhleQogIHdlcmUgbmV2ZXIgbWVhbnQgZm9yIHRoZSBwdWJsaWMgaGVhZGVyIGFueXdheS4gUGhpbGlwcGUgUmFvdWx0IGJyb3VnaHQgaXQKICB1cC4KCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIFJJU0MgT1MgYnVpbGQuCgpEYW5pZWwgKDI3IEZlYikKLSBBdmVyeSBGYXkgcG9pbnRlZCBvdXQgdGhlIHZlcnkgbWlzbGVhZGluZyBjdXJsX211bHRpX2luZm9fcmVhZCBtYW4gcGFnZSwgYW5kCiAgSSB1cGRhdGVkIGl0IHRvIGJlY29tZSBtb3JlIGFjY3VyYXRlLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmb3VuZCBhIHByb2JsZW0gd2l0aCBGVFAgZG93bmxvYWRpbmcgdGhhdCB0dXJuZWQgb3V0IHRvCiAgYmUgaGlzIEZUUCBzZXJ2ZXIgcmV0dXJuaW5nIHNpemUgemVybyAoMCBieXRlcykgd2hlbiBTSVpFIHdhcyB1c2VkIG9uIGEgZmlsZQogIHdoaWxlIGJlaW5nIGluIEJJTkFSWSBtb2RlLiBXZSBub3cgbWFrZSBhIHNlY29uZCBjaGVjayBmb3IgdGhlIGFjdHVhbCBzaXplCiAgYnkgc2Nhbm5pbmcgdGhlIFJFVFIgcmVwbHkgYW55d2F5LCBldmVuIGlmIHRoZSBTSVpFIGNvbW1hbmQgcmV0dXJuZWQgMC4KCkRhbmllbCAoMjYgRmViKQotIEt5bGUgU2FsbGVlIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBoZSB3b3VsZCBkbyBhIHRyYW5zZmVyIHRoYXQgZGlkbid0IHVwZGF0ZQogIHRoZSBwcm9ncmVzcyBtZXRlciBwcm9wZXJseS4gSXQgdHVybmVkIG91dCB0byBiZSBhIGNhc2Ugd2hlcmUgbGliY3VybCB3b3VsZAogIGxvb3AgYSBsaXR0bGUgdG9vIGVhZ2VybHkgaW4gdGhlIHRyYW5zZmVyIGxvb3AsIHdoaWNoIGlzbid0IHJlYWxseSBnb29kIGZvcgogIHRoZSBBUElzLCBlc3BlY2lhbGx5IG5vdCB0aGUgbXVsdGkgQVBJLgoKVmVyc2lvbiA3LjEwLjQtcHJlMiAoMjQgRmViIDIwMDMpCgpEYW5pZWwgKDI0IEZlYikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIGEgdmFsdWUgaGlnaGVyCiAgdGhhbiA1IGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQuCgotIEkgYmVsaWV2ZSBJIGZpeGVkIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW9yIHRoYXQgaGFzIGJlZW4gYnJva2VuCiAgZm9yIGEgd2hpbGUgKEkgdGhpbmsgc2luY2UgbXkgY2hhbmdlIGRhdGVkIERlYyAxMCAyMDAyKS4gV2hlbiB0aGlzIGhlYWRlciBpcwogIHVzZWQsIGxpYmN1cmwgc2hvdWxkIHdhaXQgZm9yIGEgSFRUUCAxMDAgKG9yIHRpbWVvdXQpIGJlZm9yZSBzZW5kaW5nIHRoZQogIHBvc3QvcHV0IGRhdGEuCgpEYW5pZWwgKDE0IEZlYikKLSBNYXR0aGV3IENsYXJrZSBwcm92aWRlZCBzb21lIGluZm8gd2hhdCB0byBtb2RpZnkgdG8gbWFrZSBjdXJsIGJ1aWxkCiAgZmxhd2xlc3NseSBvbiBBSVggMy4yLjUuCgotIE1hcnRpbiBDLiBNYXJ0aW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4KICBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHRyeWluZyB0byBjb25uZWN0IHRvIGEgcG9ydCB3aXRob3V0IGEgbGlzdGVuZXIuCgpEYW5pZWwgKDEzIEZlYikKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgQ3VybF9iYXNlNjRfZW5jb2RlKCkgdG8gZGVhbCB3aXRoIHplcm9lcyBpbiB0aGUKICBkYXRhIHRvIGVuY29kZS4KCkRhbmllbCAoNCBGZWIpCi0gSmVhbi1QaGlsaXBwZSBhZGRlZCB0aGUgZmlyc3QgY29kZSB0aGF0IGVuYWJsZXMgdGhlICdzaGFyZScgc3lzdGVtLiBUaGlzCiAgc2hvdWxkIG5vdyBlbmFibGUgc2hhcmluZyBvZiBETlMgZGF0YSBiZXR3ZWVuIHR3byBjdXJsIGVhc3kgaGFuZGxlcy4KCi0gSW5jb3Jwb3JhdGVkIE5pY28gQmFnZ3VzJyBmaXhlcyB0byBhZ2FpbiBjb21waWxlIGZsYXdsZXNzbHkgb24gVk1TLgoKLSBKYW1lcyBCdXJzYSBjb3JyZWN0ZWQgYSBiYWQgY29tbWVudCBpbiB0aGUgcHVibGljIGluY2x1ZGUgZmlsZSBjdXJsL211bHRpLmgKCi0gUGV0ZXIgRm9ycmV0IHJlcG9ydGVkIG9uZSBvZiB0aG9zZSBlcnJvcjowMDAwMDAwMCBjYXNlcyBpbiBsaWJjdXJsIGFnYWluCiAgd2hlbiBjb25uZWN0aW5nIHRvIGEgSFRUUFMgc2l0ZSwgYW5kIHRoaXMgdGltZSBJIGRpZCBkaXNjb3ZlciBzb21lIG9kZGl0aWVzCiAgaW4gaG93IGN1cmwgcmVwb3J0cyBTU0wgZXJyb3JzIGJhY2suIEl0IGNvdWxkIG1pc3Mgc2hvd2luZyB0aGUgYWN0dWFsIGVycm9yLgoKVmVyc2lvbiA3LjEwLjQtcHJlMSAoMyBGZWIgMjAwMykKCkRhbmllbCAoMyBGZWIpCi0gUmVtb3ZlZCB0aGluZ3MgaW4gdGhlIGRvY3Mgc2F5aW5nIGNhcGF0aCBkb2Vzbid0IHdvcmsgb24gV2luZG93cywgYXMgSnVsaWFuCiAgTm9ibGUgdG9sZCB1cyBpdCB3b3JrcyBmaW5lLgoKRGFuaWVsICgzMSBKYW4pCi0gS2V2aW4gUm90aCBmaXhlZCB0aGUgemxpYiBidWlsZCBzdHVmZiBpbiB0aGUgTWluZ3czMiBtYWtlZmlsZS4KCkRhbmllbCAoMzAgSmFuKQotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgY3VybCBvbiBXaW5kb3dzIGFsd2F5cyBjaGVja2VkIGZvciB0aGUgQ0EgY2VydAogIGJ1bmRsZSB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZSBwYXRoIHNjYW4sIGV2ZW4gdGhvdWdoCiAgLWsvLS1pbnNlY3VyZSB3YXMgdXNlZC4KCi0gSGFtaXNoIE1hY2tlbnppZSBwb2ludGVkIG91dCB0aGF0IGN1cmwgb25seSBkaWQgc3RyaWN0IGhvc3QgbmFtZSB2ZXJpZnlpbmcKICBpZiBjYXBhdGggb3IgY2FpbmZvIHdhcyB1c2VkLiBOb3cgaXQnbGwgYWx3YXlzIGRvIGl0IHVubGVzcyAtayAvIC0taW5zZWN1cmUKICBpcyB1c2VkIQoKLSBQYXZlbCBDZW5layBwb2ludGVkIG91dCB0aGF0IHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiB3YXMgZG9uZSB3cm9uZ2x5CiAgYXMgdGhlIGZ1bGwgc3RyaW5nIHdhcyBub3QgZmV0Y2hlZC4gQWRkZWQgdGVzdCBjYXNlIDU3IHRvIHZlcmlmeSB0aGF0IGN1cmwKICBkb2VzIGl0IHJpZ2h0IG5vdy4KCkRhbmllbCAoMjkgSmFuKQotIEphbWllIFdpbGtpbnNvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGN1cmwgYXR0ZW1wdCB0byBjbGVhciBvdXQKICAic2Vuc2l0aXZlIiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBkb24ndCBhcHBlYXIgaW4gcHMgb3V0cHV0cwogIChvbmx5IG9uIHBsYXRmb3JtcyB0aGF0IGFsbG93IHdyaXRpbmcgdG8gYXJndltdKS4KCi0gSm9obiBNY0dvd2FuIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIGNvdWxkIGJlIGNhbGxlZCB3aXRoIGJhZAogIGFyZ3VtZW50cyBhbmQgdGh1cyBjYXVzZSB0aGUgLS10cmFjZSBvdXRwdXRzIHRvIGdvIHdyb25nLgoKLSBSZW1vdmVkIGFsbCB0aGUgZW1hY3MgbG9jYWwgdmFyaWFibGVzIGZyb20gYWxsIGZpbGVzLiBNYXRzIExpZGVsbCBwcm92aWRlZAogIHRoZSBuZXcgc2FtcGxlLmVtYWNzIGZpbGUgKGZvciBhIHNhbXBsZSBvZiB3aGF0IHRvIGluY2x1ZGUgaW4geW91ciAuZW1hY3MpCiAgYW5kIHRoZSBjdXJsLXN0eWxlLmVsIHRoYXQgc2V0cyBhIGJldHRlciBjLXN0eWxlIGZvciBlZGl0aW5nIGN1cmwgc291cmNlcy4KCi0gRGF2ZSBIYWxiYWtrZW4gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkcyB0aGF0IGNvdWxkIGFjY2lkZW50bHkKICByZXR1cm4gQ1VSTEVfUEFSVElBTF9GSUxFIHdoZW4gY3VybF9lYXN5X3BlcmZvcm0oKSB3YXMgY2FsbGVkIHdpdGggTk9CT0RZCiAgc2V0IFRSVUUuCgpEYW5pZWwgKDI3IEphbikKLSBUaGUgZm9wZW4uYyBleGFtcGxlIHdhcyBmbGF3ZWQgYXMgTmljayBIdW1mcmV5IG5vdGljZWQsIGFuZCBJIGZpeGVkIGl0IHRvCiAgd29yayBhZ2Fpbi4KCkRhbmllbCAoMjQgSmFuKQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrICh0aGUgY29udGVudC10eXBlIHN0cmluZykKICB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuCgpEYW5pZWwgKDIyIEphbiAyMDAzKQotIElhbiBXaWxrZXMgYW5kIExlZ29mZiBWaW5jZW50IGJvdGggaW5kZXBlbmRlbnRseSBwcm92aWRlZCBmaXhlcyBmb3IgbWFraW5nCiAgY3VybC9tdWx0aS5oIHdvcmsgcHJvcGVybHkgd2hlbiBjb21waWxlZCB3aXRoIGEgQysrIGNvbXBpbGVyLgoKRGFuaWVsICgyMCBKYW4gMjAwMykKLSBGaXhlZCAnYnVpbGRjb25mJyB0byBjaGVjayB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVxdWlyZWQgdG9vbHMgYmVmb3JlCiAgdGhleSdyZSBhY3R1YWxseSB1c2VkLgoKLSBXcm90ZSAndGVzdGN1cmwuc2gnLCBhIHNjcmlwdCB0YXJnZXRlZCBmb3IgYXV0b21hdGljIGFuZCBkaXN0cmlidXRlZCBjdXJsCiAgdGVzdHMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCgotIERhdmlkIFRoaWVsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC5uZXRyYyBmaWxlIHdhcyBub3QgYmVpbmcgZGVhbHQgd2l0aAogIHByb3Blcmx5IGFueW1vcmUuIEkgYnJva2UgdGhpcyBpbiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nICJmaXgiLgoKLSBNYXJrdXMgRi5YLkouIE9iZXJodW1lciBwYXRjaGVkIGxpYmN1cmwgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnVmZmVyIG9ubHkKICBvbiBkZW1hbmQgYW5kIHRodXMgd2Ugc2F2ZSAzMktCIGluIGVhY2ggY3VybCBoYW5kbGUgdGhhdCBkb24ndCB1c2UgdGhhdAogIGJ1ZmZlci4gVGhpcyBuZWVkIGFwcGVhcmVkIHdoZW4gc29tZSBwZW9wbGUgc3RhcnRlZCB1c2luZyB0aG91c2FuZHMgb2YKICBzaW11bHRhbmVvdXMgY3VybCBoYW5kbGVzLi4uIDotKQoKRGFuaWVsICgxNiBKYW4gMjAwMykKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIGN1cmwtY29uZmlnIC0tY2ZsYWdzIHdoZW4gdGhlIGluY2x1ZGVkaXIgd2FzIG5vdAogIC91c3IvaW5jbHVkZS4KCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBDVVJMSU5GT19QUklWQVRFIHRvIHByb3Blcmx5IHJldHVybiBOVUxMIGlmIGl0IHdhcwogIHNldCB0byBOVUxMIQoKVmVyc2lvbiA3LjEwLjMgKDE0IEphbiAyMDAzKQoKRGFuaWVsICgxMCBKYW4gMjAwMykKLSBTdGV2ZSBPbGlwaGFudCBwb2ludGVkIG91dCB0aGF0IHRlc3QgY2FzZSAxMDUgZGlkIG5vdCB3b3JrIGFueW1vcmUgYW5kIHRoaXMKICB3YXMgZHVlIHRvIGEgbWlzc2luZyBmaXggZm9yIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcuCgpWZXJzaW9uIDcuMTAuMy1wcmU2ICgxMCBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBCcnlhbiBLZW1wIHBvaW50ZWQgb3V0IHRoYXQgY3VybCAtdSBjb3VsZCBub3QgcHJvdmlkZSBhIGJsYW5rIHBhc3N3b3JkCiAgd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIuIEl0IGNhbiBub3cuIC11IHVzZXJuYW1lOiBtYWtlcyB0aGUgcGFzc3dvcmQKICBlbXB0eSwgd2hpbGUgLXUgdXNlcm5hbWUgbWFrZXMgY3VybCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQuCgotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHJlbWFpbmluZyBjb25uZWN0IHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSBvbgogIGlwdjQgc3lzdGVtcyAoTGludXggb25seT8pLCB0aGF0IEkgZml4ZWQgYW5kIEtqZXRpbCB2ZXJpZmllZCB0aGF0IGl0IGZpeGVkCiAgaGlzIHByb2JsZW1zLgoKLSBtZW1hbmFseXplLnBsIG5vdyByZWFkcyBhIGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBubyBsb25nZXIKICB0YWtlcyB0aGUgZGF0YSBvbiBzdGRpbiBhcyBiZWZvcmUuCgpWZXJzaW9uIDcuMTAuMy1wcmU1ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEZpeGVkIHRlc3RzL21lbWFuYWx5emUucGwgdG8gd29yayB3aXRoIGZpbGUgbmFtZXMgdGhhdCBjb250YWluIGNvbG9ucyAoYXMgb24KICBXaW5kb3dzKS4KCi0gS2pldGlsIEphY29ic2VuIHF1aWNrbHkgcG9pbnRlZCBvdXQgdGhhdCBsaWIvc2hhcmUuaCB3YXMgbWlzc2luZy4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlNCAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBVcGRhdGVkIGxpYi9zaGFyZS5jIHF1aXRlIGEgYml0IHRvIG1hdGNoIHRoZSBkZXNpZ24gZG9jdW1lbnQgYXQKICBodHRwOi8vY3VybC5oYXh4LnNlL2Rldi9zaGFyaW5nLnR4dCBhIGxvdCBtb3JlLgoKICBJJ2xsIHRyeSB0byB1cGRhdGUgdGhlIGRvY3VtZW50IHNvb25pc2guIHNoYXJlLmMgaXMgc3RpbGwgbm90IGFjdHVhbGx5IHVzZWQKICBieSBsaWJjdXJsLCBidXQgdGhlIEFQSSBpcyBzbG93bHkgZ2V0dGluZyB0aGVyZSBhbmQgd2UgY2FuIHN0YXJ0CiAgaW1wbGVtZW50aW5nIGNvZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBzeXN0ZW0uCgpEYW5pZWwgKDggSmFuIDIwMDMpCi0gVXBkYXRlZCBzaGFyZSBzdHVmZiBpbiBjdXJsL2N1cmwuaCwgaW5jbHVkaW5nIGRhdGEgdHlwZXMsIHN0cnVjdHMgYW5kCiAgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gbGliLyB3ZXJlIGFsc28gbW9kaWZpZWQKICBvZiBjb3Vyc2UgdG8gcmVtYWluIGNvbXBpbGFibGUuIEJhc2VkIG9uIGlucHV0IGZyb20gSmVhbi1QaGlsaXBwZSBhbmQgYWxzbwogIHRvIG1ha2UgaXQgbW9yZSBpbiBsaW5lIHdpdGggdGhlIGRlc2lnbiBkb2N1bWVudC4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwYXRjaGVkIGEgdmVyeSB0cml2aWFsIG1lbW9yeSBsZWFrIGluCiAgY3VybF9lc2NhcGUoKSB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwuLi4KCi0gTWF0dGhldyBCbGFpbiBwcm92aWRlZCBmZWVkYmFjayB0byBtYWtlIHRoZSAtLWNyZWF0ZS1kaXJzIHN0dWZmIGJ1aWxkCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIHRlc3RzL2xpYnRlc3QvZmlyc3QuYyBhcyBMZWdvZmYgVmluY2VudCBwb2ludGVkIG91dC4KCkRhbmllbCAoNyBKYW4gMjAwMykKLSBQaGlsaXBwZSBSYW91bHQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIHByb3Blcmx5IHN1cHBvcnQKICB3aWxkY2FyZCBjaGVja3MgZm9yIGNlcnRpZmljYXRlIG5hbWVzLgoKLSBTaW1vbiBMaXUgYWRkZWQgQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUywgdG8gbGV0IGFuIGFwcGxpY2F0aW9uIHNldCBvdGhlcgogIHN0cmluZ3MgcmVjb2duaXplZCBhcyAiSFRUUCAyMDAiIHRvIGFsbG93IGh0dHAtbGlrZSBwcm90b2NvbHMgdG8gZ2V0CiAgZG93bmxvYWRlZCBmaW5lIGJ5IGN1cmwuCgotIE5vdyB1c2luZyBhdXRvY29uZiAyLjU3IGFuZCBhdXRvbWFrZSAxLjcuMgoKLSBEb2luZyAiY3VybCAtSSBmdHA6Ly9kb21haW4vbm9uLWV4aXN0aW5nLWZpbGUiIHN0aWxsIG91dHB1dGVkIGEgZGF0ZSEKICBXYXluZSBIYWlnaCByZXBvcnRlZC4KCi0gVGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IHdyaXR0ZW4gcHJvcGVybHkgd2l0aCBhIG5ld2xpbmUgaW4gdGhlIC0tdHJhY2UKICBmaWxlLgoKRGFuaWVsICg2IEphbiAyMDAzKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHBvc3NpYmxlIGJ1ZzogcHJldmlvdXNseSwgaWYgeW91IGNhbGxlZAogIGN1cmxfZWFzeV9wZXJmb3JtIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGRucyBjYWNoZSwgdGhlIGdsb2JhbCBjYWNoZQogIHdvdWxkbid0IGJlIHVzZWQuIFBvaW50ZWQgb3V0IGJ5IEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUuCgotIE1hdHRoZXcgQmxhaW4ncyBmaXhlZCB0aGUgVkM2IGxpYmN1cmwgbWFrZWZpbGUgdG8gaW5jbHVkZSBiZXR0ZXIgZGVidWcgZGF0YQogIG9uIGRlYnVnIGJ1aWxkcy4KRGFuaWVsICgyNyBEZWMgMjAwMikKLSBQaGlsaXBwZSBSYW91bHQgcmVwb3J0ZWQgYSBidWcgd2l0aCBIVFRQUyBjb25uZWN0aW9ucyB3aGljaCBJIGV2aWRlbnRseQogIGFkZGVkIGluIG15IDE5IGRlYyBmaXguIEkgY29ycmVjdGVkIGl0LgoKRGFuaWVsICgyMCBEZWMpCi0gSWRlYSBmcm9tIHRoZSBEZWJpYW4gbGF0ZXN0IHBhdGNoOiB1c2UgQU1fTUFJTlRBSU5FUl9NT0RFIGluIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gbWFrZSB0aGUgZGVmYXVsdCBtYWtlZmlsZSBsZXNzIGNvbmZ1c2luZyAidG8gdGhlIGNhc3VhbAogIGluc3RhbGxlciIuCgpWZXJzaW9uIDcuMTAuMy1wcmUzICgyMCBEZWMpCgpEYW5pZWwgKDE5IERlYykKLSBNYXR0aGV3IEJsYWluIHBhdGNoZWQgdGhlIEN1cmxfYmFzZTY0X2RlY29kZSgpIGZ1bmN0aW9uLgoKLSBFdmFuIEpvcmRhbiByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM2NTMwMjIgdGhhdCB0aGUgU1NMX3JlYWQoKSB1c2FnZSB3YXMKICB3cm9uZywgYW5kIGl0IGNlcnRhaW5seSB3YXMuIEl0IGNvdWxkIGxlYWQgdG8gY3VybCB1c2luZyB0b28gbXVjaCBDUFUgZHVlIHRvCiAgYSBzdHVwaWQgbG9vcC4KCkRhbmllbCAoMTggRGVjKQotIEFzIHN1Z2dlc3RlZCBieSBNYXJndXMgRnJldWRlbnRoYWwsIENVUkxFX0hUVFBfTk9UX0ZPVU5EIHdhcyByZW5hbWVkIHRvCiAgQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBzaW5jZSBpdCBpcyByZXR1cm5lZCBvbiBhbnkgPj0gNDAwIGNvZGUgd2hlbgogIENVUkxPUFRfRkFJTE9ORVJST1IgaXMgc2V0LgoKRGFuaWVsICgxNyBEZWMpCi0gQnVnIHJlcG9ydGVkICM2NTE0NjQsIHJlcG9ydGVkIGJ5IENocmlzdG9waGVyIFBhbG1lciwgcHJvdmlkZWQgYW4gZXhhbXBsZQogIHNvdXJjZSBjb2RlIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBoYW5nIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYQogIHByb3h5IG9uIGEgbG9jYWxob3N0IHBvcnQgd2hlcmUgbm8gcHJveHkgd2FzIGxpc3RlbmluZy4gVGhpcyBidWcgd2FzIG5vdAogIHJlcGVhdGFibGUgb24gbGliY3VybHMgdGhhdCB3ZXJlIElQdjYtZW5hYmxlZC4KCkRhbmllbCAoMTYgRGVjKQotIENocmlzdG9waGVyIFBhbG1lciBhbHNvIG5vdGljZWQgd2hhdCBWb2p0ZWNoIEphbm90YSBhbHJlYWR5IHdhcwogIGV4cGVyaWVuY2luZzogVGhlIGF0dGVtcHRlZCBuYW1lIHJlc29sdmUgZml4IGZvciBnbGliYyAyLjIuOTMgY2F1c2VkIGxpYmN1cmwKICB0byBjcmFzaCB3aGVuIHVzZWQgb24gc29tZSBvbGRlciBnbGliYyB2ZXJzaW9ucy4gVGhlIHByb2JsZW0gaXMgb2YgY291cnNlCiAgdGhlIHNpbGxpbmVzcyBvZiB0aGUgMi4yLjkzLiBJIGNvbW1pdHRlZCBhIGZpeCB0aGF0IGhvcGVmdWxseSBzaG91bGQgbWFrZQogIHRoZSBiaW5hcnkgcnVuIGZpbmUgb24gZWl0aGVyIG9uZSBvZiB0aGUgdmVyc2lvbnMsIGV2ZW4gdGhvdWdoIHRoZSBzb2x1dGlvbgogIGlzIG5vdCBhcyBuaWNlIGFzIEknZCBsaWtlIGl0IHRvIGJlLgoKRGFuaWVsICgxMyBEZWMpCi0gQnVnIHJlcG9ydCAjNjUxNDYwIGJ5IENocmlzdG9waGVyIFIuIFBhbG1lciBzaG93ZWQgdGhhdCB3aGVuIHVzaW5nIGxpYmN1cmwKICB0byBmb3IgZXhhbXBsZSBnbyBvdmVyIGEgcHJveHkgb24gbG9jYWxob3N0LCBpdCB3b3VsZCBhdHRlbXB0IHRvIGNvbm5lY3QKICB0aHJvdWdoIHRoZSBwcm94eSBUV0lDRS4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTAzIHdpdGggd2hpY2ggSSBtYW5hZ2VkIHRvIHJlcGVhdCB0aGlzIHByb2JsZW0gYW5kIEkKICBmaXhlZCB0aGUgY29kZSB0byBub3QgcmUtYXR0ZW1wdCBhbnkgY29ubmVjdHMgKHdoaWNoIGFsc28gbWFkZSBpdCBhIG5pY2VyCiAgZml4IGZvciB0aGUgIzY1MDk0MSBidWcgbWVudGlvbmVkIGJlbG93KS4KCiAgVGhlIHN3cyBzZXJ2ZXIgd2FzIGV4dGVuZGVkIHRvIGRlYWwgd2l0aCBDT05ORUNUIGluIG9yZGVyIHRvIG1ha2UgdGVzdAogIGNhc2UgNTAzIGRvIGdvb2QuCgotIEV2YW4gSm9yZGFuIHBvc3RlZCBidWcgcmVwb3J0ICM2NTA5ODkgYWJvdXQgYSBtZW1vcnkgbGVhayBpbiB0aGUgcHVibGljIGtleQogIHJldHJpZXZpbmcgY29kZS4gSGUgcHJvdmlkZWQgYSBzdWdnZXN0ZWQgZml4IGFuZCBJIG1lcmVseSBhcHBsaWVkIGl0IQoKLSBCdWcgcmVwb3J0ICM2NTA5NDEsIHBvc3RlZCBieSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGdldHRpbmcgZmlsZTovLyBVUkxzLiBUaGlzIHdhcyBub3cgZml4ZWQgYW5kCiAgdGVzdCBjYXNlIDUwMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDEyIERlYykKLSBUZXN0IGNhc2UgNTAwIGFuZCA1MDEgYXJlIHRoZSBmaXJzdCBldmVyIGxpYmN1cmwgdGVzdCBjYXNlcyB0aGF0IHJ1bi4KCi0gTWFkZSAiY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIiBjdXQgb2ZmIGFsbCAtTyogb3B0aW9ucyB0byB0aGUgY29tcGlsZXIKCi0gRmluYWxseSBmaXhlZCB0aGUgdGVzdCBzdWl0ZSdzIGZ0cCBzZXJ2ZXIgc28gdGhhdCB0ZXN0IGNhc2UgNDAyIGRvZXNuJ3QKICBjYXVzZSB0aGUgZm9sbG93aW5nIHRlc3QgY2FzZSB0byBmYWlsIGFueW1vcmUhCgpEYW5pZWwgKDExIERlYykKLSBDVVJMX01BWF9XUklURV9TSVpFIGlzIG5vdyBkZWNyZWFzZWQgdG8gMTZLQiBzaW5jZSBpdCBtYWtlcyB0aGUgV2luZG93cwogIHZlcnNpb24gcGVyZm9ybSB1cGxvYWRzIG11Y2ggZmFzdGVyISEhIFJCcmFtYW50ZSBkaWQgbG90cyBvZiByZXNlYXJjaCBvbgogIHRoaXMgdG9waWMuCgotIEZpeGVkIHRoZSAjaW5jbHVkZSBpbiBjdXJsL2N1cmwuaCB0byBpbmNsdWRlIHRoZSBvdGhlciBmaWxlcyBvdXRzaWRlIHRoZQogIGV4dGVybiAiQyIgc2NvcGUuCgpEYW5pZWwgKDEwIERlYykKLSBNb3ZlZCBhcm91bmQgYW5kIGFkZGVkIG1vcmUgbG9naWM6CgogIEZpcnN0LCBQT1NUIGRhdGEgaXMgbmV2ZXIgc2VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0IGhlYWRlcnMgaW4gdGhlIGh0dHAuYwogIGNvZGUuIEl0IGlzIGFsd2F5cyBzZW50IHRoZSAibm9ybWFsIiByZWFkIGNhbGxiYWNrIHRoZW4gc2VuZCgpIHdheS4gVGhpcyBub3cKICBlbmFibGVzIGEgcGxhaW4gSFRUUCBQT1NUIHRvIGJlIHNlbnQgY2h1bmtlZCBpZiB3ZSB3YW50IHRvLiBUaGlzIGFsc28KICByZWR1Y2VzIHRoZSByaXNrIG9mIGhhdmluZyB2ZXJ5IGJpZyBQT1NUcyBjYXVzaW5nIHByb2JsZW1zLgoKICBGdXJ0aGVyLCBzZW5kaW5nIG9mZiB0aGUgaW5pdGlhbCBIVFRQIHJlcXVlc3QgaXMgbm90IGRvbmUgdXNpbmcgYSBsb29wCiAgYW55bW9yZS4gSWYgaXQgd2Fzbid0IGFsbCBzZW50IG9mZiBpbiB0aGUgZmlyc3Qgc2VuZCgpLCB0aGUgcmVzdCBvZiB0aGUKICByZXF1ZXN0IGlzIHNlbnQgb2ZmIGluIHRoZSBub3JtYWwgdHJhbnNmZXIgc2VsZWN0KCkgbG9vcC4gVGhpcyBtYWtlcyBzZXZlcmFsCiAgdGhpbmdzIHBvc3NpYmxlLCBidXQgbWFpbmx5IGl0IG1ha2VzIGxpYmN1cmwgYmxvY2sgbGVzcyB3aGVuIHVzZWQgZnJvbSB0aGUKICBtdWx0aSBpbnRlcmZhY2UgYW5kIGl0IGFsc28gcmVkdWNlcyB0aGUgcmlzayBvZiBwcm9ibGVtcyB3aXRoIGlzc3VpbmcgdmVyeQogIGxhcmdlIHJlcXVlc3RzLgoKRGFuaWVsICg5IERlYykKLSBNb3ZlZCB0aGUgcmVhZCBjYWxsYmFjayBwb2ludGVyIGFuZCBkYXRhIHdpdGhpbiB0aGUgc3RydWN0cyB0byBhIG1vcmUKICBzdWl0YWJsZSBwbGFjZS4gVGhpcyBpbiBwcmVwYXJhdGlvbiBmb3IgYSBiZXR0ZXIgSFRUUC1yZXF1ZXN0IHNlbmRpbmcgY29kZQogIHdpdGhvdXQgKGEgc2lsbHkpIGxvb3AuCgotIFRoZSBEb2RkcyBmaXggc2VlbXMgbm90IHRvIHdvcmsuCgotIFZvanRlY2ggSmFub3RhIHRlc3RzIHByb3ZlZCB0aGF0IHRoZSByZXNvbHZlIGZpeCBmcm9tIG9jdCAyMXN0IGlzIG5vdCBnb29kCiAgZW5vdWdoIHNpbmNlIG9idmlvdXNseSBvbGRlciBnbGliY3MgbWlnaHQgcmV0dXJuIEVBR0FJTiB3aXRob3V0IHRoaXMgbWVhbmluZwogIHRoYXQgdGhlIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLgoKLSBbdGhlIG90aGVyIGRheV0gTWFkZSBsaWJjdXJsIGxvb3Agb24gcmVjdigpIGFuZCBzZW5kKCkgbm93IHVudGlsIGRvbmUsIGFuZAogIHRoZW4gZ2V0IGJhY2sgdG8gc2VsZWN0KCkuIFByZXZpb3VzbHkgaXQgd2VudCBiYWNrIHRvIHNlbGVjdCgpIG1vcmUgb2Z0ZW4KICB3aGljaCByZWFsbHkgd2FzIGEgc2xpZ2h0IG92ZXJoZWFkLiBUaGlzIHdhcyBkdWUgdG8gdGhlIHJlcG9ydGVkIHBlcmZvcm1hbmNlCiAgcHJvYmxlbXMgb24gSFRUUCBQVVQgb24gV2luZG93cy4gSSBjb3VsZG4ndCBzZWUgYW55IG5vdGFibGUgZGlmZmVyZW5jZSBvbgogIExpbnV4Li4uCgpWZXJzaW9uIDcuMTAuMy1wcmUyICg0IERlYyAyMDAyKQoKRGFuaWVsICg0IERlYyAyMDAyKQotIExvdHMgb2Ygd29yayB3aXRoIE1hbGNvbG0gRG9kZHMgbWFkZSBtZSBhZGQgYSB0ZW1wb3JhcnkgY29kZSBmaXggdGhhdCBub3cKICBzaG9ydGVucyB0aGUgdGltZW91dCB3YWl0aW5nIGZvciB0aGUgMjI2IG9yIDI1MCBsaW5lIGFmdGVyIGEgY29tcGxldGVkCiAgRlRQIHRyYW5zZmVyLgoKICBJZiBubyBkYXRhIGlzIHJlY2VpdmVkIHdpdGhpbiA2MCBzZWNvbmRzLCB0aGlzIGlzIHRha2VuIGFzIGEgc2lnbiBvZiBhIGRlYWQKICBjb250cm9sIGNvbm5lY3Rpb24gYW5kIHdlIGJhaWwgb3V0LgoKRGFuaWVsICgzIERlYyAyMDAyKQotIFJhbHBoJ3MgYnVnIHJlcG9ydCAjNjQ0ODQxIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHdoaWNoIGN1cmwgcmV0dXJuZWQgYQogIHRpbWVvdXQgZXJyb3IgY29kZSB3aGVuIGluIGZhY3QgdGhlIHByb2JsZW0gd2FzIG5vdCBhIHRpbWVvdXQuIFRoZSBwcm9wZXIKICBlcnJvciBzaG91bGQgbm93IGJlIHByb3BhZ2F0ZWQgYmV0dGVyIHdoZW4gdGhleSdyZSBkZXRlY3RlZCBpbiB0aGUgRlRQCiAgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbi4KCi0gVXBkYXRlZCB0aGUgQm9ybGFuZCBNYWtlZmlsZXMuCgpEYW5pZWwgKDIgRGVjIDIwMDIpCi0gTmljb2xhcyBCZXJsb3F1aW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgLS1jcmVhdGUtZGlycyB0byB0aGUKICBjb21tYW5kIGxpbmUgdG9vbC4gV2hlbiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggLW8sIGl0IGxldHMgY3VybCBjcmVhdGUKICBbbm9uLWV4aXN0aW5nXSBkaXJlY3RvcmllcyB1c2VkIGluIC1vLCBzdWl0YWJseSB1c2VkIHdpdGggIy1jb21iaW5hdGlvbnMKICBzdWNoIGFzOgoKICAgICBjdXJsICJ3d3cuaW1hZ2VzLmNvbS97Zmxvd2VycyxjaXRpZXMscGFya3MsbW91bnRhaW5zfS9waWNfWzEtMTAwXS5qcGcgXAogICAgICAgLW8gImRpcl8jMS9waWMjMi5qcGciIC0tY3JlYXRlLWRpcnMKClZlcnNpb24gNy4xMC4zLXByZTEKCkRhbmllbCAoMjggTm92IDIwMDIpCi0gSSB2aXNpdGVkIExhcnMgTm9yZGdyZW4gYW5kIGhhZCBhIGdvIHdpdGggaGlzIHByb2JsZW0sIHdoaWNoIGxlYWQgbWUgdG8KICBpbXBsZW1lbnQgdGhpcyBmaXguIElmIGxpYmN1cmwgZGV0ZWN0cyB0aGUgYWRkZWQgY3VzdG9tIGhlYWRlcgogICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIsIGl0IHdpbGwgbm93IGVuYWJsZSBhIGNodW5rZWQgdHJhbnNmZXIuCgogIEFsc28sIGNodW5rZWQgdHJhbnNmZXIgZGlkbid0IHF1aXRlIHdvcmsgYmVmb3JlIGJ1dCBzZWVtcyB0byBkbyBzbyBub3cuCgotIEtqZXRpbCBKYWNvYnNlbiBwb2ludGVkIG91dCB0aGF0IC4vY29uZmlndXJlIC0tZGlzYWJsZS1pcHY2IC0td2l0aG91dC16bGliCiAgZGlkbid0IHdvcmsgb24gYW55IHBsYXRmb3JtLi4uCgpEYW5pZWwgKDI2IE5vdiAyMDAyKQotIEZpeGVkIGEgYmFkIGFkZHJpbmZvIGZyZWUgaW4gdGhlIGhvc3RpcC5jIGNvZGUsIGhhcmRseSBleHBvc2VkIGFueXdoZXJlCgotIERhbiBCZWNrZXIgZm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcGVyc2lzdGVudCBjb25ubmVjdGlvbnMKICB1c2luZyBDVVJMT1BUX1VTRVJQV0QuCgpEYW5pZWwgKDIyIE5vdiAyMDAyKQotIEJhc2VkIG9uIFJhbHBoIE1pdGNoZWxsJ3MgZXhjZWxsZW50IGFuYWx5c2lzIEkgZm91bmQgYSBidWcgaW4gdGhlIHRlc3Qgc3VpdGUKICB3ZWIgc2VydmVyIChzd3MpIHdoaWNoIG5vdyBsZXRzIHRlc3QgY2FzZSAzMDYgcnVuIGZpbmUgZXZlbiBpbiBjb21iaW5hdGlvbgogIHdpdGggdGhlIG90aGVyIHRlc3QgY2FzZXMuCgotIEp1YW4gSWduYWNpbyBIZXJ24XMgZm91bmQgYSBjcmFzaCBpbiB0aGUgdmVyYm9zZSBjb25uZWN0IG1lc3NhZ2UgdGhhdCBpcwogIHVzZWQgb24gcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhpcyBidWcgd2FzIGFkZGVkIGluIDcuMTAuMiBkdWUgdG8gdGhlCiAgcmVhcnJhbmdlZCBuYW1lIHJlc29sdmUgY29kZS4KCkRhbmllbCAoMjAgTm92IDIwMDIpCi0gS2pldGlsIEphY29ic2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzOgoKICAgQ1VSTE9QVF9QUklWQVRFIHN0b3JlcyBhIHByaXZhdGUgcG9pbnRlciBpbiB0aGUgY3VybCBoYW5kbGUuCgogICBDVVJMSU5GT19QUklWQVRFIHJldHJpZXZlcyB0aGUgcHJpdmF0ZSBwb2ludGVyIGZyb20gdGhlIGN1cmwgaGFuZGxlLgoKLSBLYXJvbCBQaWV0cnphayBwb2ludGVkIG91dCBob3cgY3VybC1jb25maWcgLS1jZmxhZ3MgZGlkbid0IG91dHB1dCBhIGdvb2QKICBpbmNsdWRlIGRpciBzbyBJJ3ZlIHJlbW92ZWQgdGhhdCBmb3Igbm93LgoKVmVyc2lvbiA3LjEwLjIgKDE4IE5vdiAyMDAyKQoKRGFuaWVsICgxMSBOb3YgMjAwMikKLSBEYXZlIEhhbGJha2tlbiBhZGRlZCBjdXJsX3ZlcnNpb25faW5mbyB0byBsaWIvbGliY3VybC5kZWYgdG8gbWFrZSBsaWJjdXJsCiAgcHJvcGVybHkgYnVpbGQgd2l0aCBNU1ZDIG9uIFdpbmRvd3MuCgpEYW5pZWwgKDggTm92IDIwMDIpCi0gRG9pbmcgSFRUUCBQVVQgd2l0aG91dCBhIHNwZWNpZmllZCBmaWxlIHNpemUgbm93IG1ha2VzIGxpYmN1cmwgdXNlCiAgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQuCgpEYW5pZWwgKDcgTm92IDIwMDIpCi0gQnVnIHJlcG9ydCAjNjM0NjI1IGlkZW50aWZpZWQgaG93IGN1cmwgcmV0dXJuZWQgdGltZW91dCBpbW1lZGlhdGVseSB3aGVuCiAgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCB3YXMgdXNlZCBhbmQgcHJvdmlkZWQgYSBmaXguCgpWZXJzaW9uIDcuMTAuMi1wcmU0ICg2IE5vdiAyMDAyKQoKRGFuaWVsICg1IE5vdiAyMDAyKQotIExlaGVsIEJlcm5hZHQgZm91bmQgb3V0IGFuZCBmaXhlZC4gbGliY3VybCBzZW50IGVycm9yIG1lc3NhZ2UgdG8gdGhlIGRlYnVnCiAgb3V0cHV0IHdoZW4gaXQgc3RvcmVkIHRoZSBlcnJvciBtZXNzYWdlLgoKLSBBdmVyeSBGYXkgZm91bmQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSBETlMgY2FjaGUgKHdoZW4gdGhlIGNhY2hlIHRpbWUgd2FzCiAgc2V0IHRvIDAgd2UgZ290IGEgbWVtb3J5IGxlYWssIGJ1dCB3aGVuIHRoZSBsZWFrIHdhcyBmaXhlZCBoZSBnb3QgYSBjcmFzaAogIHdoZW4gaGUgdXNlZCB0aGUgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2l0aCB0aGF0KSB0aGF0IGhhZCBtZSBkbyBzb21lIHJlYWwKICByZXN0cnVjdHVyaW5nIHNvIHRoYXQgd2Ugbm93IGhhdmUgYSByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgZG5zIGNhY2hlCiAgZW50cmllcyB0byBwcmV2ZW50IGFuIGVudHJ5IHRvIGdldCBmbHVzaGVkIHdoaWxlIHN0aWxsIGFjdHVhbGx5IGluIHVzZS4KCiAgSSBhbHNvIGRldGVjdGVkIHRoYXQgd2UgcHJldmlvdXNseSBkaWRuJ3QgdXBkYXRlIHRoZSB0aW1lIHN0YW1wIHdoZW4gd2UKICBleHRyYWN0ZWQgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgc28gdGhhdCBtdXN0J3ZlIGJlZW4gYSByZWFzb24gZm9yIHNvbWUKICB2ZXJ5IHdlaXJkIGRucyBjYWNoZSBidWdzLgoKVmVyc2lvbiA3LjEwLjItcHJlMwoKRGFuaWVsICgzMSBPY3QgMjAwMikKLSBEb3duZ3JhZGVkIGF1dG9tYWtlIHRvIDEuNi4zIGluIGFuIGF0dGVtcHQgdG8gZml4IGN5Z3dpbiBwcm9ibGVtcy4gKEl0CiAgdHVybmVkIG91dCB0aGlzIGRpZG4ndCBoZWxwIHRob3VnaC4pCgotIERpc2FibGUgdGhlIEROUyBjYWNoZSAoYnkgc2V0dGluZyB0aGUgdGltZW91dCB0byAwKSBtYWRlIGxpYmN1cmwgbGVhawogIG1lbW9yeS4gQXZlcnkgRmF5IGJyb3VnaHQgdGhlIGV4YW1wbGUgY29kZSB0aGF0IHByb3ZlZCB0aGlzLgoKVmVyc2lvbiA3LjEwLjItcHJlMgoKRGFuaWVsICgyOCBPY3QgMjAwMikKLSBVcGdyYWRlZCB0byBhdXRvY29uZiAyLjU0IGFuZCBhdXRvbWFrZSAxLjcgb24gdGhlIHJlbGVhc2UtYnVpbGQgaG9zdC4KCi0gS2V2aW4gUm90aCBtYWRlIHRoZSBjb21tYW5kIGxpbmUgdG9vbCBjaGVjayBmb3IgYSBDVVJMX0NBX0JVTkRMRSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIChpZiAtLWNhY2VydCBpc24ndCB1c2VkKSBhbmQgaWYgbm90IHNldCwgdGhlIFdpbmRvd3MgdmVyc2lvbiB3aWxsCiAgY2hlY2sgZm9yIGEgZmlsZSBuYW1lZCAiY3VybC1jYS1idW5kbGUuY3J0IiBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb3IgdGhlCiAgZGlyZWN0b3J5IHdoZXJlIGN1cmwgaXMgbG9jYXRlZC4gVGhhdCBmaWxlIGlzIHRoZW4gdXNlZCBhcyBDQSByb290IGNlcnQKICBidW5kbGUuCgotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGF0IGN1cmwncyBjb25maWd1cmUgc2NyaXAgZGlkbid0IGdldCByaWdodCBpZiB5b3UKICB1c2VkIGF1dG9jb25mIG5ld2VyIHRoYW4gMi41Mi4gVGhpcyB3YXMgZHVlIHRvIHNvbWUgYmFkbHkgcXVvdGVkIGNvZGUuCgpWZXJzaW9uIDcuMTAuMi1wcmUxCgpEYW5pZWwgKDIzIE9jdCAyMDAyKQotIEVtaWxpYW5vIElkYSBjb25maXJtZWQgdGhhdCB3ZSBub3cgYnVpbGQgcHJvcGVybHkgd2l0aCB0aGUgQm9ybGFuZCBDKysKICBjb21waWxlciB0b28uIFdlIG5lZWRlZCB5ZXQgYW5vdGhlciBmaXggZm9yIHRoZSBJU08gY3BwIGNoZWNrIGluIHRoZSBjdXJsLmgKICBoZWFkZXIgZmlsZS4KCi0gWWV0IGFub3RoZXIgZml4IHdhcyBuZWVkZWQgdG8gZ2V0IHRoZSBIVFRQIGRvd25sb2FkIHdpdGhvdXQgaGVhZGVycyB0byB3b3JrLgogIFRoaXMgdGltZSBpdCB3YXMgbmVlZGVkIGlmIHRoZSBmaXJzdCAiYmVsaWV2ZWQgaGVhZGVyIiB3YXMgcmVhZCBhbGwgaW4gdGhlCiAgZmlyc3QgcmVhZC4gVGVzdCAzMDYgaGFzIG5vdCBydW4gcHJvcGVybHkgc2luY2UgdGhlIDExdGggb2N0b2JlciBmaXguCgpEYW5pZWwgKDIxIE9jdCAyMDAyKQotIFp2aSBIYXInRWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggY3VybCdzIG5hbWUgcmVzb2x2aW5nIG9uIFJlZGhhdCA4CiAgbWFjaGluZXMgKHJ1bm5pbmcgSVB2NiBkaXNhYmxlZCkuIE1hdHMgTGlkZWxsIGxldCBtZSB1c2UgYW4gYWNjb3VudCBvbiBoaXMKICBtYWNoaW5lIGFuZCBJIGNvdWxkIHZlcmlmeSB0aGF0IGdldGhvc3RieW5hbWVfcigpIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmV0dXJuCiAgRUFHQUlOIGluc3RlYWQgb2YgRVJBTkdFIHdoZW4gdGhlIGdpdmVuIGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbC4gVGhpcyBpcwogIGdsaWJjIDIuMi45My4KCi0gQWxiZXJ0IENoaW4gaGVscGVkIG1lIGdldCB0aGUgLW5vLXVuZGVmaW5lZCBvcHRpb24gY29ycmVjdGVkIGluCiAgbGliL01ha2VmaWxlLmFtIHNpbmNlIEN5Z3dpbiBidWlsZHMgd2FudCBpdCB0aGVyZSB3aGlsZSBTb2xhcmlzIGJ1aWxkcyBkb24ndAogIHdhbnQgaXQgcHJlc2VudC4gS2V2aW4gUm90aCBoZWxwZWQgbWUgdHJ5IGl0IG91dCBvbiBjeWd3aW4uCgotIE5pa2l0YSBTY2htaWR0IHByb3ZpZGVkIGEgYnVnIGZpeCBmb3IgYSBGT0xMT1dMT0NBVElPTiBidWcgaW50cm9kdWNlZCB3aGVuCiAgdGhlIC4uLyBzdXBwb3J0IGdvdCBpbiAoNy4xMC4xKS4KCkRhbmllbCAoMTggT2N0IDIwMDIpCi0gRmFicml6aW8gQW1tb2xsbyBwb2ludGVkIG91dCBhIHJlbWFpbmluZyBwcm9ibGVtIHdpdGggRk9MTE9XTE9DQVRJT04gaW4KICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKRGFuaWVsICgxNyBPY3QgMjAwMikKLSBSaWNoYXJkIENvb3BlcidzIGV4cGVyaW1lbnRpbmcgcHJvdmVkIHRoYXQgLWogKENVUkxPUFRfQ09PS0lFU0VTU0lPTikgZGlkbid0CiAgd29yayBxdWl0ZSBhcyBzdXBwb3NlZC4gWW91IG5lZWRlZCB0byBzZXQgaXQgKmJlZm9yZSogeW91IHVzZQogIENVUkxPUFRfQ09PS0lFRklMRSwgYW5kIHdlIGRvbnQnIHdhbnQgdGhhdCBraW5kIG9mIGRlcGVuZGVuY2llcy4KCkRhbmllbCAoMTUgT2N0IDIwMDIpCi0gQW5kculzIEdhcmPtYSBwcm92aWRlZCBjb3JyZWN0aW9ucyBmb3IgZXJyYXRhcyBpbiBmb3VyIGxpYmN1cmwgbWFuIHBhZ2VzLgoKRGFuaWVsICgxMyBPY3QgMjAwMikKLSBTdGFydGluZyBub3csIHdlIGdlbmVyYXRlIGFuZCBpbmNsdWRlIFBERiB2ZXJzaW9ucyBvZiBhbGwgdGhlIGRvY3MgaW4gdGhlCiAgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMTIgT2N0IDIwMDIpCi0gVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IG9uIGEgYmFkIHBvcnQgbnVtYmVyIGNhdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgdG8gbmV2ZXIgcmV0dXJuIGZhaWx1cmUgYW5kIGl0IGFwcGVhcmVkIHRvIGtlZXAgb24gdHJ5aW5nIGZvcmV2ZXIgKGl0IGp1c3QKICBkaWRuJ3QgZG8gYW55dGhpbmcpLgoKRGFuaWVsICgxMSBPY3QgMjAwMikKLSBEb3dubG9hZGluZyBIVFRQIHdpdGhvdXQgaGVhZGVycyBkaWRuJ3Qgd29yayAxMDAlLCBzb21lIG9mIHRoZSBpbml0aWFsIGRhdGEKICBnb3Qgd3JpdHRlbiB0d2ljZS4gS2V2aW4gUm90aCByZXBvcnRlZC4KCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhlICJjb25maWcgZmlsZSIgcGFyc2VyIGluIHRoZSBjbGllbnQgY29kZSBjb3VsZAogIHNlZ2ZhdWx0LCBsaWtlIGlmIERPUyBuZXdsaW5lcyB3ZXJlIHVzZWQuCgpWZXJzaW9uIDcuMTAuMSAoMTEgT2N0IDIwMDIpCgpEYW5pZWwgKDEwIE9jdCAyMDAyKQotIEplZmYgTGF3c29uIGZpeGVkIGEgZmV3IHByb2JsZW1zIHdpdGggY29ubmVjdGlvbiByZS11c2UgdGhhdCByZW1haW5lZCB3aGVuCiAgeW91IHNldCBDVVJMT1BUX1BST1hZIHRvICIiLgoKRGFuaWVsICg5IE9jdCAyMDAyKQotIENyYWlnIERhdmlzb24gZm91bmQgYSB0ZXJyaWJsZSBmbGF3IGFuZCBDcmlzIEJhaWxpZmYgaGVscGVkIG91dCBpbiB0aGUKICBzZWFyY2guIEdldHRpbmcgSFRUUCBkYXRhIGZyb20gc2VydmVycyB3aGVuIHRoZSBoZWFkZXJzIGFyZSBzcGxpdCB1cCBpbgogIG11bHRpcGxlIHJlYWRzLCBjb3VsZCBjYXVzZSBqdW5rIGRhdGEgdG8gZ2V0IGluc2VydGVkIGFtb25nIHRoZSBzYXZlZAogIGhlYWRlcnMuIFRoaXMgb25seSBjb25jZXJucyBIVFRQKFMpIGhlYWRlcnMuCgpEYW5pZWwgKDggT2N0IDIwMDIpCi0gVmluY2VudCBQZW5xdWVyYydoIGdhdmUgdXMgdGhlIGdvb2Qgc3VnZ2VzdGlvbiB0aGF0IHdoZW4gdGhlIEVSUlJPUkJVRkZFUgogIGlzIHNldCBpbnRlcm5hbGx5LCB0aGUgZXJyb3IgdGV4dCBpcyBzZW50IHRvIHRoZSBkZWJ1ZyBmdW5jdGlvbiBhcyB3ZWxsLgoKLSBJIGZpeGVkIHRoZSB0ZWxuZXQgY29kZSB0byB0aW1lb3V0IHByb3Blcmx5IGFzIHRoZSBvcHRpb24gdGVsbHMgaXQgdG8uIE9uCiAgbm9uLXdpbmRvd3MgcGxhdGZvcm1zLgoKRGFuaWVsICg3IE9jdCAyMDAyKQotIEpvaG4gQ3JvdyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwtdGhlLWd1aWRlIHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQogIHRhcmJhbGwhCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdGhhdCBtYWtlIGluc3RhbGwgZGlkbid0IGRvIHJpZ2h0IGlmIGJ1aWxkIG91dHNpZGUKICB0aGUgc291cmNlIHRyZWUgKGNhLWJ1bmRsZSB3aXNlKS4KCi0gRk9MTE9XTE9DQVRJT04gYnVnZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCgpEYW5pZWwgKDQgT2N0IDIwMDIpCi0gS2V2aW4gUm90aCBnb3QgcHJvYmxlbXMgd2l0aCBoaXMgY3lnd2luIGJ1aWxkIHdpdGggLW5vLXVuZGVmaW5lZCB3YXMgbm90CiAgcHJlc2VudCBpbiBsaWIvTWFrZWZpbGUuYW0gc28gSSBwdXQgaXQgYmFjayBpbiB0aGVyZSBhZ2Fpbi4gVGhlIHBvb3Igb25lIHdobwogIG5lZWRzIHRvIHJlbW92ZSBpdCBhZ2FpbiBtdXN0IHdyaXRlIGEgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdGhhdCBuZWVkLgoKLSBSYWxwaCBNaXRjaGVsbCBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIGEgYml0IG5haXZlIGFuZCBkaWRuJ3QgZGVhbCB3aXRoIC4vCiAgb3IgLi4vIHN0dWZmIGluIHRoZSBzdHJpbmcgcGFzc2VkIGJhY2sgaW4gYSBMb2NhdGlvbjogaGVhZGVyIHdoZW4gZm9sbG93aW5nCiAgbG9jYXRpb25zLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgdG8gd29yayBvdXQgYSBiZXR0ZXIgY29uZmlndXJlLmluIGNoZWNrIGZvciB6bGliLCBhbmQKICBib3RoIC0td2l0aG91dC16bGliIGFuZCAtd2l0aC16bGliIHNlZW0gdG8gd29yayByYXRoZXIgd2VsbCByaWdodCBub3cuCgotIFp2aSBIYXInRWwgaW1wcm92aWVkIHRoZSBPcGVuU1NMIEVOR0lORSBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0bwogIGJlY29tZSBtb3JlIGFjY3VyYXRlLgoKRGFuaWVsICgxIE9jdCAyMDAyKQotIERldGxlZiBTY2htaWVyIHBvaW50ZWQgb3V0IHRoZSBsYWNrIG9mIGEgLS13aXRob3V0LWxpYnogb3B0aW9uIHRvIGNvbmZpZ3VyZSwKICBzbyBJIGFkZGVkIG9uZS4KClZlcnNpb24gNy4xMCAoMSBPY3QgMjAwMikKCkRhbmllbCAoMzAgU2VwIDIwMDIpCi0gTW9kaWZpZWQgdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkgcHJvdG8gYW5kIHJldHVybmVkIHN0cnVjdCBvbmNlIGFnYWluLCBhbmQKICB1cGRhdGVkIHRoZSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IHRoZSBwcmUtcmVsZWFzZXMgY3Jhc2hlZCBvbiBuYW1lIGxvb2t1cHMgb24KICBuYW1lcyBzdWNoIGFzICJhOiIgb3IgImJhejoiIChvbiBMaW51eCB2ZXJzaW9ucyBub3QgYmVpbmcgSVB2Ni1lbmFibGVkKSBkdWUKICB0byBzb21lIHdlaXJkIHJldHVybiBjb2RlcyBmcm9tIGdldGhvc3RieW5hbWVfcigpLiBJJ2xsIGJsYW1lIHRoZSBjb21wbGV0ZQogIGxhY2sgb2YgZG9jcyBpbiB0aGF0IGRlcGFydG1lbnQuIENyaXMgcHJvdmlkZWQgYSBmaXgsIHdoaWNoIEkgbW9kaWZpZWQgb25seQogIHNsaWdodGx5LgoKRGFuaWVsICgyNyBTZXAgMjAwMikKLSBBZnRlciBhIHN1Z2dlc3Rpb24gZnJvbSBDaHJpc3RpYW4gS3VyeiB0byBEZWJpYW4gY3VybCBwYWNrYWdlIG1haW50YWluZXIKICBEb21lbmljbyBBbmRyZW9saSwgSSBtYWRlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBwcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlcyBiZXR0ZXIuIE5vdywgYnkgc2V0dGluZyAteCAiIiB5b3UgY2FuIGV4cGxpY2l0bHkgdGVsbCBsaWJjdXJsIHRvCiAgbm90IHVzZSBhIHByb3h5LCBubyBtYXR0ZXIgd2hhbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNheS4KClZlcnNpb24gNy4xMC1wcmU0CgpEYW5pZWwgKDI2IFNlcCAyMDAyKQotIEV4dGVuZGVkIGN1cmxfdmVyc2lvbl9pbmZvKCkgbW9yZSBhbmQgd3JvdGUgYSBtYW4gcGFnZSBmb3IgaXQuCgpEYW5pZWwgKDI1IFNlcCAyMDAyKQotIGxpYmN1cmwgY291bGQgbGVhayBtZW1vcnkgd2hlbiBkb3dubG9hZGluZyBtdWx0aXBsZSBmaWxlcyB1c2luZyBodHRwIHJhbmdlcywKICByZXBvcnRlZCBhbmQgZml4ZWQgYnkgSmVhbi1MdWMgR3VldmVsLgoKLSBXYWx0ZXIgSi4gTWFjayBwcm92aWRlZCBjb2RlIGFuZCBkb2NzIGZvciB0aGUgbmV3IGN1cmxfZnJlZSgpIGZ1bmN0aW9uIHRoYXQKICBzaGFsbCBiZSB1c2VkIHRvIGZyZWUgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGJ5IGxpYmN1cmwgYW5kIHJldHVybmVkIGJhY2sKICB0byB0aGUgYXBwbGljYXRpb24sIGFzIGN1cmxfZXNjYXBlKCkgYW5kIGN1cmxfdW5lc2NhcGUoKSBkby4KCi0gWWFycmFtIFN1bmlsIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZXJlIGEgZmFpbGVkCiAgY29ubmVjdGlvbiBkaWRuJ3QgY2xvc2UgZG93biBwcm9wZXJseSBhbmQgdGh1cyBhIHNlY29uZCB0cmFuc2ZlciB1c2luZyB0aGUKICBzYW1lIGhhbmRsZSBmYWlsZWQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBmbGF3IHRoYXQgbWFkZSAoYW1vbmcgb3RoZXIgdGhpbmdzKSBkaWN0LWZldGNoZXMKICByZXR1cm4gYSByYW5kb20gdmFsdWUuCgpEYW5pZWwgKDI0IFNlcCAyMDAyKQotIFdleiBGdXJsb25nIGJyb3VnaHQgaGlzIGluaXRpYWwgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIGN1cmxfdmVyc2lvbl9pbmZvKCkuCiAgV2UgbWlnaHQgbmVlZCB0byB0d2VhayBpdCBzb21ld2hhdCBiZWZvcmUgcmVsZWFzZS4KCkRhbmllbCAoMjAgU2VwIDIwMDIpCi0gQ3JhaWcgTWFya3dhcmR0IGZpeGVkIGFub3RoZXIgVHJ1NjQgSVAgcmVzb2x2ZSBwcm9ibGVtLgoKRGFuaWVsICgxOSBTZXAgMjAwMikKLSBEb2xibmVmZiBBLlYgYW5kIFNwaXJpZG9ub2ZmIEEuViBtYWRlIHRoZSBmaWxlOi8vIGNvZGUgd29yayB3aXRoIHJlc3VtZXMKICBpbiB0aGUgc2FtZSBzdHlsZSBvdGhlciBjb2RlIGRvZXMuCgotIElsZ3VpeiBMYXR5cG92IGZpeGVkIGEgZmxhdyBpbiB0aGUgY2xpZW50IGNvZGUgd2hlbiBmZXRjaGluZyBtdWx0aXBsZSBVUkxzCiAgYW5kIC1DIC0gd2FzIHVzZWQuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIHBvc2l0aW9uIHdhcyB0aGVuIGFjY2lkZW50YWxseQogIHJldXNlZCBvbiBhbGwgdGhlIG90aGVyIGZpbGVzIHRvby4KCkRhbmllbCAoMTggU2VwIDIwMDIpCi0gVGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZSB3YXMgZ3JlYXRseSBtb2RpZmllZCBhbmQgdGhlIG9wdGlvbnMgaGF2ZQogIG5vdyBiZWVuIGdyb3VwZWQgaW4gbG9naWNhbCBncm91cHMgc28gdGhhdCBpdCBzaG91bGQgYmUgc29tZXdoYXQgZWFzaWVyIHRvCiAgcmVhZCBpdCBhbmQgZmluZCB0aGluZ3MgeW91IHNlYXJjaCBmb3IuCgpEYW5pZWwgKDEzIFNlcCAyMDAyKQotIEtldmluIFJvdGggcGlucG9pbnRlZCBhIHNjYXJ5IGZsYXcgaW4gbGliY3VybCwgd2hlbiB0aGUgSFRUUCBzZXJ2ZXIgZG9lc24ndAogIHNlbmQgYW55IGhlYWRlcnMgYmFjaywgb25seSByYXcgY29udGVudC4gUmlnaHQsIHRoYXQgaXMgYSB2aW9sYXRpb24gb2YgdGhlCiAgc3RhbmRhcmQgYnV0IHN0aWxsIGhhcHBlbnMgYXQgdGltZXMgYW5kIHdlIG5lZWQgdG8gZGVhbCB3aXRoIGl0LiBUZXN0IGNhc2UKICAzMDYgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIGRvIHJpZ2h0IG5vdy4KClZlcnNpb24gNy4xMC1wcmUzCgpEYW5pZWwgKDExIFNlcCAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgZm91bmQgb3V0IHRoYXQgY3VybCBkaWRuJ3Qgc2VuZCBhIGNvcnJlY3QgSFRUUCBIb3N0OiBoZWFkZXIKICB3aGVuIHlvdSBzcGVjaWZpZWQgdGhlIFVSTCB3aXRoIGFuIElQdjYgSVAtYWRkcmVzcy4KCkRhbmllbCAoNCBTZXAgMjAwMikKLSBTdmVuIE5ldWhhdXMgbWFkZSAtLXNpbGVudCBiZWluZyBhY2tub3dsZWRnZWQgZXZlbiB3aGVuIG11bHRpcGxlIFVSTHMKICB3ZXJlIHVzZWQuIEl0IHVzZWQgdG8gb3V0cHV0ICJbMS8yXTogaHR0cDovL2hvc3QvYS5odG1sLmRlIC0tPiBhLmh0bWwuZCIgZXRjCiAgZXZlbiB3aGVuIHRvbGQgdG8gc2h1dCB1cC4KCkRhbmllbCAoMyBTZXAgMjAwMikKLSBVcGRhdGVkIGFsbCBzb3VyY2UgY29kZSBoZWFkZXJzIHRvIHVzZSBNSVQtbGljZW5zZSByZWZlcmVuY2VzIG9ubHksIGFuZAogIHBvaW50IHRvIHRoZSBDT1BZSU5HIGZpbGUgYW5kIHRoZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwKICBVUkwuIEkndmUgY3V0IG91dCBhbGwgcmVmZXJlbmNlcyB0byBNUEwgdGhhdCBJIGNvdWxkIGZpbmQuCgotIENvcmVjdGVkIHRoZSBtYWtlZmlsZXMgdG8gbm90IGFsd2F5cyB1c2UgLWx6IHdoZW4gbGlua2luZwoKVmVyc2lvbiA3LjEwLXByZTIKCkRhbmllbCAoMiBTZXAgMjAwMikKLSBKYW1lcyBHYWxsYWdoZXIgYWRkZWQgQ29udGVudC1FbmNvZGluZyBzdXBwb3J0IHRvIGxpYmN1cmwgc28gbm93IGN1cmwgYW5kCiAgbGliY3VybC11c2luZyBhcHBzIGNhbiByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMgdXNpbmcgdGhlICdkZWZsYXRlJwogIG1ldGhvZC4gU2VlIHRoZSBzcGVjaWFsIGZpbGUgbGliL1JFQURNRS5lbmNvZGluZyBmb3IgZGV0YWlscy4KCiAgY3VybCAtLWNvbXByZXNzZWQgaXMgbm93IHVzZWQgdG8gcmVxdWVzdCBjb21wcmVzc2VkIGNvbnRlbnRzLgoKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgd2lsbCBpbmNsdWRlICdsaWJ6JyBpZiB0aGlzIGZlYXR1cmUgd2FzIGFyb3VuZCB3aGVuCiAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0LgoKRGFuaWVsICgzMCBBdWcgMjAwMikKLSBBcHBsaWVkIGFuIGFub255bW91cyBTT0NLUzUtcHJveHkgcGF0Y2guIE5vdCBwcm9wZXJseSB3b3JraW5nIGluIGFsbAogIHNpdHVhdGlvbnMgdGhvdWdoLCBhcyBhbGwgZ2V0YWRkcmluZm8oKS11c2luZyBsaWJjdXJscyB3aWxsIGZhaWwgb24gdGhpcy4KICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNvbWV3aGF0IG5haXZlIHdheSB0aGUgY3VycmVudCBjb2RlIHRyaWVzIHRvIGV4dHJhY3QKICB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcHJveHkuCgotIEZpeGVkIHVwIHRoZSBTU0wgY2VydCBmaXhlcyBmcm9tIHRoZSBvdGhlciBkYXkgZXZlbiBtb3JlIGFmdGVyIG1vcmUgaW5wdXRzCiAgZnJvbSBDcmlzLiBBZGRlZCB0aHJlZSBuZXcgU1NMIGVycm9yIGNvZGVzIHRvIG1ha2UgdGhlCiAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1Igc2xpZ2h0bHkgbGVzcyBvdmVybG9hZGVkLgoKRGFuaWVsICgyNyBBdWcgMjAwMikKLSBBZnRlciBsb3RzIG9mIHRhbGsgd2l0aCBUb20gWmVydWNoYSwgTmljayBHaW1icm9uZSBhbmQgQ3JpcyBCYWlsaWZmIEkKICBkZWNpZGVkIHRvIHRhbGsgdGhlIGJvbGQgcGF0aCBhbmQgSSBub3cgbWFkZSBsaWJjdXJsIGRvIENBIGNlcnRpZmljYXRlCiAgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFRodXMgbGlicmFyeSB1c2VycyBuZWVkIHRvIGV4cGxpY2l0bHkgdHVybiB0aGlzIG9mZgogIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gc2l0ZXMgd2l0aG91dCBwcm9wZXIgY2hlY2tpbmcuIFdlIGFsc28gaW5zdGFsbCBhCiAgQ0EgY2VydCBidW5kbGUgb24gJ21ha2UgaW5zdGFsbCcgbm93LgoKICBUaGUgY3VybCB0b29sIG5vdyByZXF1aXJlcyB0aGUgLWsvLS1pbnNlY3VyZSBvcHRpb24gaW4gb3JkZXIgdG8gYWxsb3cKICBjb25uZWN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBTU0wgc2l0ZXMgdGhhdCBhcmVuJ3QgcHJvcGVybHkgdmVyaWZpZWQgd2l0aAogIC1jYWZpbGUgb3IgLS1jYXBhdGguCgogIGN1cmwtY29uZmlnIC0tY2EgZGlzcGxheXMgdGhlIGJ1aWx0LWluIHBhdGggdG8gdGhlIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsICgyNiBBdWcgMjAwMikKLSBBbmRyZXcgRnJhbmNpcyBjbGVhbmVkIHVwIHNvbWUgY29kZSB0aGF0IG5vdyBjb21waWxlcyBmaW5lIHdpdGhvdXQgdGhlIG5lZWQKICBmb3IgdWdseSBNU1ZDIHByYWdtYXMuCgotIEtlaXRoIE1hY0RvbmFsZCBmb3VuZCBhIG1pbm9yIGJ1ZyBpbiBzcmMvbWFpbi5jIHRoYXQgbWFkZSBpdCBjbG9zZSBzdGRpbgogIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBmaWxlIGhhbmRsZS4gSXQgc2hvdWxkbid0IGhhdmUgcmVzdWx0ZWQgaW4gbXVjaAogIHRyb3VibGUgYXMgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBjbG9zZSBhbGwgZmlsZSBoYW5kbGVzIG9uIHByb2Nlc3MgZXhpdAogIGFueXdheS4KCkRhbmllbCAoMjIgQXVnIDIwMDIpCi0gTWFya3VzIE9iZXJodW1lciBwcm92aWRlZCBzb21lIGRvY3VtZW50YXRpb24gZm9yIGhpcyBwcmV2aW91c2x5IHByb3ZpZGVkCiAgQ1VSTE9QVF9OT1NJR05BTCBmaXguCgotIFBhdGNoZWQgdGhlIGxpYi9NYWtlZmlsZS5hbSB0byBob3BlZnVsbHkgbm8gbG9uZ2VyIGNvbXBsYWluIG9uIHVuZGVmaW5lZAogIHN5bWJvbHMgdGhhdCBzZWVtZWQgdG8gb2NjdXIgb24gYnVpbGRzIHdpdGggc2hhcmVkIE9wZW5TU0wgbGlicmFyaWVzIG9uCiAgU29sYXJpcyBsYXRlbHkuLi4KCkRhbmllbCAoMjAgQXVnIDIwMDIpCi0gRml4ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gTVNDVisrIGNvbXBpbGVzLiBXZSdyZSBsb29raW5nIGZvciBoZWxwIGhlcmU6CiAgcmVtb3ZlIHRoZSBwcmFnbWFzIGZyb20gbGliL2NvbmZpZy13aW4zMi5oIGFuZCBhZGp1c3QgdGhlIHNvdXJjZXMgd2hlcmUKICB0aGUgd2FybmluZ3Mgb2NjdXIuIEhpZGluZyB0aGVtIHdpdGggcHJhZ21hcyBsaWtlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0CiAgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb21waWxlciB3YXJuaW5ncy4KCkRhbmllbCAoMTMgQXVnIDIwMDIpCi0gVWxyaWNoIFphZG93IG1hZGUgdGhlIGdsb2JhbCBpbmNsdWRlIGZpbGVzIGluIGN1cmwvKiBpbmNsdWRlIHRoZW1zZWx2ZXMKICB1c2luZyAiY3VybC5oIiBpbnN0ZWFkIG9mIDxjdXJsL2N1cmwuaD4gd2hpY2ggdGh1cyBhbGxvd3MgcGVvcGxlIHRvIG1vcmUKICBmcmVlbHkgZGVjaWRlIGhvdyB0byBpbmNsdWRlIGN1cmwgYW5kIGhvdyB0byBzZXR1cCB0aGVpciBpbmNsdWRlIHBhdGhzLgoKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgdGhlIGN1cmxfc2hhcmUqIGludGVyZmFjZSwgc29tZXdoYXQgYXMgZGlzY3Vzc2VkCiAgcHJldmlvdXNseS4KCi0gSvZybiBIYXJ0cm90aCBwb2ludGVkIG91dCB0aGF0IHBvbGwoKSB3YXMgdXNlZCBpbiB0aGUgcHJlMSBzb3VyY2UgY29kZSBhbmQKICBpdCBpc24ndCB2ZXJ5IHBvcnRhYmxlLCBzbyBub3cgSSBjaGVjayBmb3IgaXQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgd29yayBhcm91bmQgaXQuCgpWZXJzaW9uIDcuOS45LXByZTEKCkRhbmllbCAoMTIgQXVnIDIwMDIpCi0gQXBwbGllZCBteSBpbml0aWFsIHRha2Ugb24gbWFraW5nIHRoZSBtdWx0aSBzdHVmZiBtb3JlIGFzeW5jaHJvbm91cy4gQ29ubmVjdHMKICBzaG91bGQgbm93IHJldHVybiBiYWNrIHdpdGhvdXQgImhhbmdpbmciIHVudGlsIGl0IGhhcyBjb25uZWN0ZWQgZm9yIHJlYWwuCiAgVGhpcyBzaG91bGQgYWxzbyBiZSB0aGUgY2FzZSBmb3IgRlRQLVBBU1YgY29ubmVjdHMuCgpEYW5pZWwgKDkgQXVnIDIwMDIpCi0gQXBwbGllZCBNYXJrdXMgRi5YLkouIE9iZXJodW1lcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBDVVJMT1BUX05PU0lHTkFMLAogIHdoaWNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBkb2luZyBhbnl0aGluZyB0aGF0IG1heSBjYXVzZQogIHNpZ25hbHMgdG8gZ2V0IHNlbnQuIFRoaXMgaXMgYmFzaWNseSBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRoYXQKICBub3cgY2FuIHVzZSB0aW1lb3V0cyBwcm9wZXJseSwgd2l0aG91dCByaXNraW5nIGFueSBzaWduYWxzIHRvIGJ1cnN0IGluIGFuZAogIHJ1aW4gdGhlIHBhcnR5LgoKRGFuaWVsICg1IEF1ZyAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgcmVwb3J0ZWQgdGhhdCBSRkMyNzMyLXN0eWxlIGxpdGVyYWwgSVB2NiBhZGRyZXNzZXMgZGlkbid0CiAgd29yay4gV2hlbiBkaWQgdGhhdCBjb2RlIHZhbmlzaD8gQW55d2F5LCBpdCdzIGJhY2sgYWdhaW4gbm93IGFuZCBzZWVtcyB0bwogIHdvcmshCgotIEpvbmF0YW4gTGFuZGVyIGZvdW5kIG91dCB0aGF0IFBPU1RpbmcgYW4gZW1wdHkgc3RyaW5nIGRpZG4ndCB3b3JrIHdpdGggdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wuCgpEYW5pZWwgKDMgQXVnIDIwMDIpCi0gSvZybiBIYXJ0cm90aCBmaXhlZCB0aGUgbGliY3VybC5kZWYgZmlsZSB0byBidWlsZCB0aGUgd2luZG93cyBETEwgd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgZW5hYmxlZC4KCkRhbmllbCAoMSBBdWcgMjAwMikKLSBUaGUgZnRwIFBPUlQgY29tbWFuZCBub3cgdXNlcyBhIGJldHRlciBkZWZhdWx0IElQIGFkZHJlc3MsIGFzIGl0IHdpbGwKICBleHRyYWN0IGFuZCB1c2UgdGhlIGxvY2FsIElQIGFkZHJlc3MgdXNlZCBieSB0aGUgY29udHJvbCBjb25uZWN0aW9uLgoKLSBNb2RpZmllZCB0aGUgI2luY2x1ZGUgbGluZXMgaW4gY3VybC9tdWx0aS5oIHRvIHdvcmsgYmV0dGVyIG9uIG1vcmUKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMxIEp1bCAyMDAyKQotIEF0dGVtcHRlZCBhIGZpeCBmb3IgUmF5IERlR2VubmFybydzIHJlcG9ydGVkIEhQLVVYIGhvc3QgbmFtZSByZXNvbHZlCiAgcHJvYmxlbXMuCgpEYW5pZWwgKDMwIEp1bCAyMDAyKQotIFByaXlhIFJhbWFrcmlzaG5hbiBhbmQgUnlhbiBKb25lcyBjb21waWxlcyBjdXJsL2N1cmwuaCB3aXRoIGEgQysrIGNvbXBpbGVyCiAgYW5kIGRvbid0IGdldCBfX1NURENfXyBkZWZpbmVkLCB3aGljaCByZXF1aXJlZCB1cyB0byBleHRlbmQgdGhlIHByZXByb2Nlc3NvcgogIGNoZWNrIGZvciB0aGUgIyMgb3BlcmF0b3IgdXNhZ2UuCgotIENvcnJlY3QgdGhlIGRlc2NyaXB0aW9uIGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OLCBpZiBzZXQgdG8gTlVMTCB0aGUKICBpbnRlcm5hbCBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgcHV0IGJhY2suCgotIGRhbmZ1enogYXQgbWlsay5jb20gZm91bmQgb3V0IHRoYXQgbGliY3VybCBiYWRseSBhc3N1bWVkIGEgc3BhY2UgYWZ0ZXIKICAnU2V0LUNvb2tpZTonIHNvIGlmIGl0IHdhc24ndCBwcmVzZW50LCBpdCBjYXVzZWQgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUKICBjb29raWUgbmFtZSB0byBmYWxsIG9mZiEKCkRhbmllbCAoMjkgSnVsIDIwMDIpCi0gVGhlIHBhc3N3b3JkIHByb21wdCBhc2tpbmcgZm9yIHVzZXIgcGFzc3dvcmQgdXNlZCBzdGRvdXQgYW5kIG5vdyB1c2VzCiAgc3RkZXJyIGluc3RlYWQgdG8gYmV0dGVyIGFsbG93IHJlZGlyZWN0aW5nLiBJdCBhbHNvIGxlYWtlZCBhIGZvcGVuKCkgZmlsZQogIGhhbmRsZSB0aGF0IGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoMjggSnVsIDIwMDIpCi0gSEFWRV9TRVRWQlVGIHdhcyBsZWZ0IG91dCBmcm9tIHNyYy9tYWluLmMgd2hpY2ggbWFkZSAtTiBub3Qgd29yay4gRm91bmQgb3V0CiAgYnkgTSBULgoKRGFuaWVsICgyNiBKdW4gMjAwMikKLSBHbGVuIE5ha2FtdXJhIHNvbHZlZCBhIGNyYXNoIGluIHRoZSBuYW1lIHJlc29sdmluZyBmdW5jdGlvbiBmb3IgSVAtb25seQogIGFkZHJlc3NlcyBvbiBBbHBoYSBMaW51eCAoYXQgbGVhc3QpLgoKLSBULiBCaGFyYXRoIGNvcnJlY3RlZCB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGludHJvZHVjZWQgaW4gNy45LjguCgpEYW5pZWwgKDIyIEp1biAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcG9pbnRlZCBvdXQgbWFuIHBhZ2UgZXJyb3JzIGluIGN1cmxfZm9ybWFkZC4zLiBJIGZpeGVkLgoKRGFuaWVsICgxOSBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIGN1cmxfZXNjYXBlKCkuIEkgZml4ZWQuIFdlIG5vIGxvbmdlcgogIHRyaWVzIHRvIGdlbmVyYXRlIG5vciBwYXJzZSAnKycgaW4gVVJMcy4gU3BhY2VzIGJlY29tZSAlMjAsIGFuZCBvbmx5ICUtY29kZXMKICBhcmUgdHJhbnNsYXRlZCBieSBjdXJsX3VuZXNjYXBlKCkuCgpEYW5pZWwgKDE1IEp1biAyMDAyKQotIEFkZGVkIC0tbGltaXQtcmF0ZSB0byB0aGUgY3VybCB0b29sLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2V0IGEgbWF4bWltdW0KICB1cHBlciBsaW1pdCB0byBob3cgbXVjaCBiYW5kd2lkdGggdG8gdXNlIGZvciB0cmFuc2ZlcnMuCgotIENVUkxPUFRfQlVGRkVSU0laRSB3YXMgYWRkZWQgdG8gbGliY3VybC4gVGhpcyBzZXRzIGEgcHJlZmVyZWQgc2l6ZSBmb3IgdGhlCiAgcmVjZWl2ZSBidWZmZXIgaW4gbGliY3VybC4gVGhlIG1haW4gcG9pbnQgb2YgdGhpcyB3b3VsZCBiZSB0aGF0IHRoZSB3cml0ZQogIGNhbGxiYWNrIGdldHMgY2FsbGVkIG1vcmUgb2Z0ZW4gYW5kIHdpdGggc21hbGxlciBjaHVua3MuCgpEYW5pZWwgKDE0IEp1biAyMDAyKQotIFlhcnJhbSBTdW5pbCBmb3VuZCBvdXQgdGhhdCB0aGUgU29ja2V0SXNEZWFkKCkgZnVuY3Rpb24gcGVyZm9ybWVkIGEgbG90CiAgZmFzdGVyIG9uIFdpbmRvd3Mgd2hlbiByZW1vdmluZyB0aGUgMSBtaWNyb3NlY29uZCB0aW1lb3V0LgoKLSBIYW5ubyBMLiBLcmFuemhvZmYgZml4ZWQgdGhlIFZDKysgcHJvamVjdCBmaWxlcy4KCi0gVG9tIE1hdHRpc29uIGZvdW5kIG91dCB0aGF0IGZ0cCB0cmFuc2ZlcnMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGEgbGl0dGxlCiAgdG9vIG9mdGVuLgoKLSBNaWtsb3MgTmVtZXRoIHBvc3RlZCBhIFZDKysgbWFrZWZpbGUgZml4IGFuZCBzb21lIElOU1RBTEwgY29tbWVudHMgb24gaG93CiAgdG8gZGlzYWJsZSBzcGVjaWZpYyBwcm90b2NvbHMgd2hlbiBidWlsZGluZyBmb3IgV2luZG93cy4KClZlcnNpb24gNy45LjgKCkRhbmllbCAoMTMgSnVuIDIwMDIpCi0gVGltZSB0byBsZXQgdGhpcyBiYWJ5IGdvLgoKRGFuaWVsICgxMiBKdW4gMjAwMikKLSBDaHJpcyBDb21iZXMgYWRkZWQgdGhyZWUgbmV3IG9wdGlvbnMgZm9yIGN1cmxfZm9ybWFkZCgpOiBDVVJMRk9STV9CVUZGRVIsCiAgQ1VSTEZPUk1fQlVGRkVSUFRSLCBDVVJMRk9STV9CVUZGRVJMRU5HVEguICBUaGV5IGFyZSB1c2VkIHRvIGNyZWF0ZSBhCiAgbXVsdGlwYXJ0IHRoYXQgYXBwZWFycyBhcyBhIHJlZ3VsYXIgZmlsZSB1cGxvYWQsIGJ1dCB0aGUgZGF0YSBpcyBwcm92aWRlZAogIHdpdGggYSBwb2ludGVyIGFuZCBsZW5ndGguCgotIE5pY28gQmFnZ3VzIG1hZGUgdGhlIFZNUyB2ZXJzaW9uIHVzZSBzaWdzZXRqbXAoKSB0b28uCgotIEr2cm4gSGFydHJvdGggZml4ZWQgdGhlIG1pbmd3MzIgYnVpbGQgdXNpbmcgdGhlIG1tIGxpYi4KCi0gQXBwbGllZCBwYXRjaGVzIGJ5IEtyaXMgS2VubmF3YXkgdGhhdCBjb3JyZWN0IGZvcm1hdCBzdHJpbmcgcHJvYmxlbXMgaW4KICBsaWIvZnRwLmMgYW5kIGxpYi9sZGFwLmMuCgpWZXJzaW9uIDcuOS44LXByZTMKCkRhbmllbCAoMTEgSnVuIDIwMDIpCi0gSmFtZXMgQ29uZSBicm91Z2h0IHRoZSBpZGVhIG9mIHVzaW5nIHNpZ3NldGptcCgpIGluIHRoZSBzaWduYWwgaGFuZGxlciB0bwogIG1ha2UgdGhlIHRpbWUtb3V0IG9mIG5hbWUgbG9va3VwcyB0byB3b3JrLCBldmVuIHdoZW4gdGhlIHVuZGVybHlpbmcgbmFtZQogIHJlc29sdmVyIGxpYnJhcnkgdHJhcHMgRUlOVFIuIFRoZSB1c2Ugb2Ygc2lnc2V0am1wKCkgYW5kIHNpZ2xvbmdqbXAoKSBmb3IKICB0aGlzIG1heSBiZSBhIGJpdCBkcmFzdGljLCBhbmQgYWxzbyBub3QgbGlrZWx5IHRvIGV4aXN0IG9uIGFsbCBwbGF0Zm9ybXMuICBJCiAgYWRkZWQgY2FyZWZ1bCBjaGVja2luZyBmb3IgdGhpcyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCwgZXZlbiBjaGVja3MgZm9yIGl0CiAgYmVpbmcgYSBtYWNybyAod2hpY2ggc2VlbXMgdG8gYmUgdGhlIGNhc2UgaW4gZm9yIGV4YW1wbGUgTGludXgpLgoKICBzaWdzZXRqbXAoKSBzZWVtcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24uCgotIE1pa2xvcyBOZW1ldGggYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGxpYmN1cmwgdG8gZ2V0IGJ1aWx0IHdpdGggc3BlY2lmaWMKICBwcm90b2NvbHMgZGlzYWJsZWQuIFRoaXMgaXMgZG9uZSBieSBydW5uaW5nIC4vY29uZmlndXJlCiAgLS1kaXNhYmxlLVtwcm90b2NvbF0uCgotIEZUUCByYW5nZSBkb3dubG9hZHMgY291bGQgbWFrZSBDVVJMRV9GVFBfV1JJVEVfRVJST1IgZ2V0IHJldHVybmVkLiBXZSBub3cKICBtYWtlIHByZWNhdXRpb25zIHRvIG5vdCByZXR1cm4gdGhpcyBmb3IgcmFuZ2UgZG93bmxvYWRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMTM1IHRoYXQgbWFrZXMgYW4gZnRwIHJhbmdlIGRvd25sb2FkLiBIYWQgdG8gdHdlYWsgdGhlCiAgcnVudGVzdHMucGwgc2NyaXB0IGEgYml0IHRvby4KCi0gQnVnIHJlcG9ydCAjNTY2ODM1IGlkZW50aWZpZWQgYSBzdHJsZW4oKSBvbiBhIE5VTEwgcG9pbnRlci4gQWRkZWQgYWRkaXRpb25hbAogIGNoZWNrIHRvIHByZXZlbnQgdGhpcy4KCkRhbmllbCAoMTAgSnVuIDIwMDIpCi0gRm91bmQgYW5kIGNvcnJlY3RlZCBhIGNvbm5lY3QgZmFpbHVyZSBwcm9ibGVtIHRoYXQgZGlkbid0IGNyZWF0ZSBhIGh1bWFuCiAgZXJyb3IgdGV4dC4KCi0gQWRkZWQgY29kZSB0byBjb21waWxlIHdpdGggT3BlblNTTCAwLjkuNy4gQmFzZWQgb24gcGF0Y2ggZnJvbSBKYWNvYiBNZXVzZXIKICBhbmQgY29tbWVudHMgZnJvbSBH9nR6IEJhYmluLUViZWxsLgoKLSBHYXV0YW0gTWFuaSBmb3VuZCBhIHNvY2tldCBkZXNjcmlwdG9yIGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIEZUUCB0cmFuc2ZlcnMKICBmYWlsZWQgYW5kIHlvdSByZWludm9rZWQgY3VybF9lYXN5X3BlcmZvcm0oKS4KCkRhbmllbCAoNSBKdW4gMjAwMikKLSBHdXN0YWYgSHVpIGNvcnJlY3RlZCBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBzbyB0aGF0IGl0IHdvbid0IGNyYXNoIG5vCiAgbWF0dGVyIHdoZW4geW91IGRlY2lkZSB0byByZW1vdmUgdGhlIENVUkwgaGFuZGxlLgoKLSBIQVZFX1JBTkRfU1RBVFVTIHdhcyBhZGRlZCB0byBsaWIvY29uZmlnLXdpbjMyLmggYnkgQW5kcmVhcyBPbHNzb24sIGFzIGl0CiAgbWFrZXMgd2luZG93cyBidWlsZHMgc3RvcCBjb21wbGFpbmluZyBhYm91dCAid2VhayBzZWVkaW5nIiB3aGVuIGl0IGluIGZhY3QKICBpc24ndC4KCi0gQW5vdGhlciA2NGJpdCBhcmNoaXRlY3R1cmUgY3Jhc2ggdGhhdCB3YXMgaW50cm9kdWNlZCBpbiA3LjkuNyB3YXMgbm93CiAgcmVtb3ZlZCwgYXMgYnVnIHJlcG9ydCAjNTY0NTg1IGNsYXJpZmllZC4gVGhpcyBoYXBwZW5lZCBkdWUgdG8gb3VyIGF0dGVtcHRzCiAgdG8gb25seSBhbGxvY2F0ZSBvbmx5IGFzIG11Y2ggbWVtb3J5IGFzIGlzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbmFtZQogIHJlc29sdmluZyAodXNpbmcgcmVhbGxvYykgd2hpY2ggY2FsbGVkIGZvciBhIGZ1bmN0aW9uIHRoYXQgY291bGQgJ21vdmUnIGEKICBob3N0ZW50IHN0cnVjdCBpbiBtZW1vcnkuCgpWZXJzaW9uIDcuOS44LXByZTIKCkRhbmllbCAoMyBKdW4gMjAwMikKLSBULiBCaGFyYXRoIGZpeGVkIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIHRvIHJldHVybiBhIGNvcnJlY3QgdGltZSBhbmQKICBtYWRlIHRoZSBDVVJMSU5GT19SRVFVRVNUX1NJWkUgcmV0dXJuIHRoZSBjb3JyZWN0IHRvdGFsIHJlcXVlc3Qgc2l6ZS4gSGUKICBhbHNvIG1hZGUgdGhlIHdpbjMyIHRpbWVycyB1c2UgaGlnaGVyIHJlc29sdXRpb24gdGhhbiBiZWZvcmUuCgpEYW5pZWwgKDI5IE1heSAyMDAyKQotIFJlbmF1ZCBDaGFpbGxhdCBtYWRlIG1lIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgbGliY3VybCByZXR1cm5lZCBhbiBlcnJvciBpZgogIHlvdSB0cmllZCB0byBnZXQgYW4gZW1wdHkgRlRQIGZpbGUuIFRoaXMgc2VlbWVkIGxpa2UgYSB3cm9uZyB0aGluZyB0byBkbywgc28KICBub3cgaXQgbm8gbG9uZ2VyIGRvZXMgdGhhdCEgSSBqdXN0IGhvcGUgdGhhdCBubyBvbmUgYnVpbHQgYW55dGhpbmcgZmFuY3kKICB1cG9uIHRoaXMgdW5leHBlY3RlZCBiZWhhdmlvci4uLgoKRGFuaWVsICgyOCBNYXkgMjAwMikKLSBDcmlzIEJhaWxpZmYgYnJvdWdodCBDVVJMT1BUX0NBUEFUSCB0aGF0IHdvcmtzIGxpa2UgQ1VSTE9QVF9DQUlORk8gYnV0CiAgc3BlY2lmaWVzIGEgcGF0aCB0byBhIGRpcmVjdG9yeSB3aXRoIGNlcnRpZmljYXRlcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBmaWxlCiAgd2l0aCB0aGVtIGFsbCBjb25jYXRlbmF0ZWQuIC0tY2FwYXRoIHdhcyBhZGRlZCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wKICBmb3IgdGhlIHNhbWUgZnVuY3Rpb24uCgogIFdpbmRvd3MgdXNlcnMgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRoYXQgdGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgc2V0dXAgd2l0aAogIHRoZSBjX3JlaGFzaCB0b29sIG9mIHRoZSBPcGVuU1NMIHBhY2thZ2UsIGFuZCB0aGF0IGNyZWF0ZXMgc3ltbGlua3MgYnkKICBkZWZhdWx0IHRoYXQgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGFjdHVhbCBjb3BpZXMgdG8gd29yayBvbiBXaW5kb3dzLgoKLSBHdXN0YWYgSHVpIHByb3ZpZGVkIG5ldyBjb2RlIHRoYXQgY2hhbmdlcyBob3cgY3VybF9tdWx0aV9pbmZvX3JlYWQoKQogIG1lc3NhZ2VzIGFyZSBzdG9yZWQsIHNvIHRoYXQgdGhleSBkb24ndCBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kIGZvciB0aGUgbXVsdGkKICBoYW5kbGUncyBlbnRpcmUgbGlmZSB0aW1lLiBIZSBhbHNvIG1hZGUgaXQgcmV0dXJuIGZhaWx1cmUgY29kZXMgcHJvcGVybHkKICB3aGljaCBpdCBkaWRuJ3QgZG8gYmVmb3JlLgoKRGFuaWVsICgyNyBNYXkgMjAwMikKLSBHdXN0YWYgSHVpIHBvaW50ZWQgb3V0IHRoYXQgcnVubmluZyBjdXJsX211bHRpX3BlcmZvcm0oKSB3aXRob3V0IGRvaW5nCiAgY3VybF9tdWx0aV9mZHNldCgpIGZpcnN0IHdhcyBub3QgcmVhbGx5IGEgd29ya2luZyBjb21iby4gSSBhZGRlZCBhbiBpbnRlcm5hbAogIGNoZWNrIGZvciB0aGlzIGFuZCBoYXZlIHNvbWUgZXh0cmEgc2VsZWN0KCkgY29kZSB3aXRob3V0IHRpbWVvdXQgdG8gbWFrZSB0aGUKICBsaWJyYXJ5IGludGVybmFscyB3b3JrIGlkZW50aWNhbGx5IG5ldmVydGhlbGVzcy4gV2UgbWlnaHQgbmVlZCB0byBzb21laG93CiAgZWl0aGVyIGRvY3VtZW50IHRoYXQgb25jZSB5b3UndmUgdXNlZCB0aGUgKl9mZHNldCgpIHlvdSBzaG91bGQgcmVtYWluIHVzaW5nCiAgdGhlbSBpbiBzZWxlY3QoKSBvciB5b3Ugc2hvdWxkIGJsYW5rIHRoZW0gc29tZWhvdyBzbyB0aGF0IGxpYmN1cmwgd29uJ3QgZ28KICBjcmF6eS4KClZlcnNpb24gNy45LjgtcHJlMQoKRGFuaWVsICgyMiBNYXkgMjAwMikKLSBKYW1lcyBDb25lIGJyb3VnaHQgYW4gZXhjZWxsZW50IHBhdGNoLCBpbmNsdWRpbmcgc2V2ZXJhbCB0ZXN0cyBhbmQgZG9jcyEKICBDVVJMT1BUX05FVFJDIG5vdyB0YWtlcyBhbiBlbnVtIGFzIGFyZ3VtZW50IGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGJvb2xlYW4uCiAgLS1uZXRyYy1vcHRpb25hbCB3YXMgaW50cm9kdWNlZCBhcyBhbiBhZGRpdGlvbiB0byAtLW5ldHJjIHRvIGFsbG93IHRoZQogIGNvbW1hbmQgbGluZSBjbGllbnQgdG8gdGFrZSB1c2Ugb2YgYWxsIHRoYXQgbmV3IG5ldHJjIHN0dWZmLgoKLSBCdWcgcmVwb3J0ICM1NTg4ODggc2hvd2VkIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHJlLXVzZWQgdGhlIHByZXZpb3VzIGhvc3QKICBuYW1lIHdoZW4gYSBjb25uZWN0aW9uIG92ZXIgYSBwcm94eSB3YXMgcmUtdXNlZCBidXQgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCkRhbmllbCAoMjEgTWF5IDIwMDIpCi0gRWRpbiBLYWRyaWJhc2ljIGhlbHBlZCBtZSBzb3J0IG91dCBhIHByb2JsZW0gdG8gbWFkZSBsaWJjdXJsIGNyYXNoIHdoZW4KICB0cnlpbmcgdG8gSFRUUCBQT1NUIGFuIGVtcHR5IHN0cmluZy4KCi0gQ2xhcmlmaWVkIHRoYXQgSnVlcmdlbiBXaWxrZSBkb25hdGVkIHRoZSBvcmlnaW5hbCB0ZXN0cy9zZXJ2ZXIvc3dzLmMgY29kZS4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGN1cmxfZm9ybWFkZCgpIHJldHVybiBhIHR5cGVkZWYgbmFtZWQKICBDVVJMRk9STWNvZGUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJ2ludCcsIGFuZCB0aGUgdmFyaW91cyByZXR1cm4gY29kZXMgYXJlCiAgbm93IGdsb2JhbGx5IGV4cG9ydGVkLiBJdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGJldHRlciBmaWd1cmUgb3V0IHdoYXQgZ29lcwogIHdyb25nIHdoZW4gY3VybF9mb3JtYWRkKCkgcmV0dXJucyBlcnJvcnMuCgpEYW5pZWwgKDIwIE1heSAyMDAyKQotIFJvbGFuZCBaaW1tZXJtYW5uIHBvaW50ZWQgb3V0IHRoYXQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpCiAgaXMgcHJlZmVyZWQgdG8gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZSgpLgoKRGFuaWVsICgxNyBNYXkgMjAwMikKLSBCdWcgcmVwb3J0ICM1NTY4NjkgcG9pbnRlZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBkaWRuJ3QgY29tcGlsZSBvbiBmcmVlYnNkCiAgYWZ0ZXIgbXkgQUlYIGZpeGVzIHRoZSBvdGhlciB3ZWVrLgoKLSBCdWcgcmVwb3J0ICM1NTY5MzAgcG9pbnRlZCBvdXQgYSBGcmVlQlNEIGNvcmUgZHVtcCBpbnRyb2R1Y2VkIGluIDcuOS43IGluCiAgdGhlIEROUyBzdHJ1Y3QgcmVhbGxvYyBzdHVmZi4gQWN0dWFsbHksIHRoaXMgY3Jhc2ggY291bGQgaGFwcGVuIG9uIGFsbAogIHN5c3RlbXMgdGhhdCBtYWRlIHRoZSBwYWNrX2hvc3RlbnQoKSBmdW5jdGlvbiBnZXQgaW52b2tlZC4KCi0gSSByZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3MgaW4gdGhlIHRlc3Qgc3VpdGUncyBIVFRQIHNlcnZlci4KClZlcnNpb24gNy45LjcKCkRhbmllbCAoMTAgTWF5IDIwMDIpCi0gS2V2aW4gUm90aCBhZGp1c3RlZCB0aGUgLS10cmFjZS1hc2NpaSBvdXRwdXQgc2xpZ2h0bHkuCgotIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBuZWVkZWQgYW4gYWRkaXRpb25hbCBoZWFkZXIKICBmaWxlIGluY2x1ZGVkIGZvciBBSVggYnVpbGRzCgpWZXJzaW9uIDcuOS43LXByZTIKCkRhbmllbCAoNyBNYXkgMjAwMikKLSBVcGRhdGVkIHRoZSBtYW4gcGFnZSB3aXRoIC0tdHJhY2UtYXNjaWkgYW5kIC1qLy0tanVuay1zZXNzaW9uLWNvb2tpZXMuCgotIE1hZGUgLS10cmFjZS1hc2NpaSBkbyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyAtLXRyYWNlIGJ1dCB3aXRob3V0IHRoZSBoZXgKICBwYXJ0IGluIHRoZSBvdXRwdXQuCgotIEFkZGVkIENVUkxPUFRfQ09PS0lFU0VTU0lPTiB0aGF0IHdoZW4gZW5hYmxlZCBtYWtlcyBsaWJjdXJsIGlnbm9yZSBzZXNzaW9uCiAgY29va2llcyByZWFkIGZyb20gYSBmaWxlLiBUaGlzIG9wdGlvbiBpcyBlbmZvcmNlZCBieSB0aGUgY3VybCBjb21tYW5kIGxpbmUKICB0b29sIHVzaW5nIHRoZSBuZXcgLWovLS1qdW5rLXNlc3Npb24tY29va2llcyBvcHRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGgKICBLZXZpbiBSb3RoLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgY3VybCB0byBmdWxseSBlbXVsYXRlIGEgYnJvd3NlcidzCiAgYmVoYXZpb3IsIGV2ZW4gd2hlbiBpdCBjb21lcyB0byAic2Vzc2lvbiBjb29raWVzIi4gU2Vzc2lvbiBjb29raWVzIGFyZQogIGNvb2tpZXMgdGhhdCBhIG5vcm1hbCBicm93c2VyIGRpc2NhcmRzIHdoZW4gdGhlIGJyb3dzZXIgaXMgc2h1dAogIGRvd24uIFRoZXkncmUgaWRlbnRpZmllZCBieSBub3QgaGF2aW5nIGFueSBleHBpcmUgZGF0ZS90aW1lLgoKLSBXaGVuIENVUkxPUFRfREVCVUdEQVRBIHdhcyBzZXQsIGl0IHJ1aW5lZCB0aGUgQ1VSTE9QVF9TVERFUlIgc2V0dGluZyBhbmQKICB0aGlzIHdhcyBkaXNjb3ZlcmVkIHdoZW4gLS10cmFjZSB3YXMgbWFkZSB0byBjcmFzaC4KCi0gVXNpbmcgLXYgYW5kIC0tdHJhY2UgYXQgdGhlIHNhbWUgdGltZSBjb25mdXNlZCBtYXR0ZXJzLiAtdiBpcyBub3cgcHJldHR5CiAgbXVjaCBpZ25vcmVkIHdoZW4gLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpIGlzIHVzZWQuCgotIE1hZGUgLS10cmFjZSAoYW5kIC0tdHJhY2UtYXNjaWkpIHN1cHBvcnQgLSBhcyBmaWxlIG5hbWUgdG8gcGFzcyBvdXRwdXQgdG8KICBzdGRvdXQgaW5zdGVhZC4gSXQgbWFrZXMgaXQgY29uc2lzdGVudCB3aXRoIGhvdyBvdGhlciBvcHRpb25zIHdvcmsuCgpWZXJzaW9uIDcuOS43LXByZTEKCkRhbmllbCAoNiBNYXkgMjAwMikKLSBBZGRlZCBtdWx0aS1wb3N0LmMgdG8gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4gSSBnb3QgdGhlIGJhc2ljIHNvdXJjZSBmb3IKICB0aGlzIGZyb20gR3VzdGFmIEh1aS4KCkRhbmllbCAoMyBNYXkgMjAwMikKLSBDVVJMX01BWF9XUklURV9TSVpFIGlzIG5vdyBhbiBleHBvcnRlZCAjZGVmaW5lIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXIgYW5kCiAgY2FuIGJlIHVzZWQgdG8gZmlndXJlIG91dCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB5b3VyIHdyaXRlIGNhbGxiYWNrIGNhbgogIGdldC4KCi0gQ1VSTE9QVF9SRUFEREFUQSBpcyBub3cgYW4gYWxpYXMgZm9yIENVUkxPUFRfSU5GSUxFIGFuZCBDVVJMT1BUX1dSSVRFREFURSBpcwogIGFuIGFsaWFzIGZvciBDVVJMT1BUX0ZJTEUuIFRoZXNlIHR3byB3ZXJlIGFkZGVkIGZvciBjb25mb3JtaXR5LiBNb3N0IG90aGVyCiAgY2FsbGJhY2sgZnVuY3Rpb24ncyB1c2VyZGF0YSBhcmUgcHJvdmlkZWQgd2l0aCBvcHRpb25zIHVzaW5nIGEgc2ltaWxhciBuYW1lLQogIHNjaGVtZS4KCi0gQWRkZWQgIi0tdHJhY2UgW2ZpbGVdIiB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIEl0IG1ha2VzIGEgdmVyeSBkZXRhaWxlZAogIHRyYWNlIGR1bXAgZ2V0IHN0b3JlZCwgd2l0aCBhIGZ1bGwgcHJvdG9jb2wgZHVtcCB0aGF0IGluY2x1ZGVzIGFsbCByZWNlaXZlZAogIGFuZCB0cmFuc21pdHRlZCBkYXRhLiBUaGlzIGNvdWxkIGJlIGEgdmVyeSBlZmZlY3RpdmUgdG9vbCBmb3IgZGVidWdnaW5nIHdoYXQKICBnb2VzIHdyb25nLiBUaGlzIGR1bXAgaW5jbHVkZXMgZXZlcnkgYnl0ZSB0aGUgd2F5IGl0IGlzIHNlbnQgdG8vcmVjZWl2ZWQKICBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkdW1wIGlzIHRoZSBwbGFpbi10ZXh0IHZlcnNpb24sIHNvIFNTTCB0cmFuc2ZlcnMgd2lsbAogIHN0aWxsIGJlIHJlYWRhYmxlLgoKLSBJIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIHdhcyBub3QgY2FsbGVkIHByb3Blcmx5IGV2ZXJ5d2hlcmUgYXMgd2UKICB3YW50ZWQgaXQgdG8uIEkgZml4ZWQgaXQuCgotIC1EIG5vdyBzdG9yZXMgYWxsIGhlYWRlcnMgdG8gdGhlIHNhbWUgZmlsZSBpZiBtdWx0aXBsZSBVUkxzIGFyZSBnaXZlbiBvbiB0aGUKICBjb21tYW5kIGxpbmUhIEtldmluIFJvdGggbWFkZSBtZSBhd2FyZSBvZiB0aGF0IGl0IGRpZG4ndCBhbHJlYWR5IGRvIHRoaXMhCgotIEd1c3RhZiBIdWkgd3JvdGUgYW4gZXhjZWxsZW50IGZvcm1wb3N0IGV4YW1wbGUgdGhhdCB1c2VkIHRoZSBtdWx0aQogIGludGVyZmFjZS4gIFVuZm9ydHVuYXRlbHksIGl0IGRpZG4ndCB3b3JrIGR1ZSB0byBzZXZlcmFsIGJ1Z3MgaW4gaG93CiAgdHJhbnNmZXJzIHdlcmUgbWFkZSB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgpEYW5pZWwgKDIgTWF5IDIwMDIpCi0gSGFubm8gS3Jhbnpob2ZmIGZvdW5kIG91dCB0aGF0IHdoZW4gZG9pbmcgbXVsdGlwbGUgdHJhbnNmZXJzIG9uIHRoZSBzYW1lCiAgZWFzeSBoYW5kbGUsIHRoZSBwcm9ncmVzcyBtZXRlciB3b3VsZCBzaG93IGEgYmFkICJjdXJyZW50bHkgZG93bmxvYWRlZAogIHZhbHVlIiB3aGVuIHRoZSB0cmFuc2ZlciBzdGFydHMuCgpEYW5pZWwgKDEgTWF5IDIwMDIpCi0gQXBwbGllZCBhbm90aGVyIHBhdGNoIGJ5IEphY2t5IExhbSB0byBtYWtlIHRoZSBuYW1lIHJlc29sdmUgaW5mbyByZWFsbG9jKCkKICBzdHVmZiB3b3JrIHByb3Blcmx5LgoKRGFuaWVsICgyOCBBcHJpbCAyMDAyKQotIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgaXMgbm93IGltcGxlbWVudGVkIQoKRGFuaWVsICgyNyBBcHJpbCAyMDAyKQotIFVwZGF0ZWQgQlVHUywgVE9ETywgRkFRLCBJTlNUQUxMIGFuZCBhZGRlZCBCSU5ESU5HUy4KCi0gSSB0aGluayBJIGZpeGVkIHRoZSBETlMgY2FjaGUgcHJ1bmUgY3JhY2ggSmFja3kgTGFtIGZvdW5kIGFuZCByZXBvcnRlZC4KCi0gSSBjbGVhbmVkIHVwIHRoZSBuYW1lIHByZWZpeCBzdHVmZiBpbiB0aGUgaGFzaCBhbmQgbGxpc3QgbW9kdWxlcy4KCi0gRlRQIHJlc3BvbnNlcyBzaG91bGQgbm93IGJlIGJldHRlciBvbiB0aW1pbmcgb3V0IHByb3Blcmx5LiBUaGUgdGltZW91dCB2YWx1ZQogIGlzIG1heGltdW0gdGltZW91dCBmb3IgdGhlIGVudGlyZSByZXF1ZXN0IG9wZXJhdGlvbiwgYnV0IGJlZm9yZSB0aGlzLCB0aGUKICB0aW1lb3V0IHdhcyB1c2VkIGFzIGEgbWF4aW11bSBhbGxvd2VkIHRpbWUgYmV0d2VlbiB0d28gcmVhZHMuLi4KCkRhbmllbCAoMjYgQXByaWwgMjAwMikKLSBGaXhlZCB0aGUgdGVzdCBzdWl0ZSBodHRwIHNlcnZlciB0byBub3QgdXNlIHNucHJpbnRmKCkgYW55bW9yZSBkdWUgdG8gYmV0dGVyCiAgcG9ydGFiaWxpdHkuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDIpCi0gV2l0aCBTdGVybGluZyBIdWdoZXMnIG5ldyBETlMgcHJ1bmluZywgSmFja3kgTGFtIGFza2VkIGlmIHRoaXMgd291bGRuJ3QKICBjYXVzZSBwcm9ibGVtcyBzaW5jZSB0aGUgcHJ1bmluZyBpcyBvbmx5IGNoZWNraW5nIHRoZSBlbnRyeSB0aW1lLCBhbmQgaXQKICBzdXJlIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvciwgSSd2ZSBub3cgYWRkZWQgYW5kIGNoYW5nZWQgY29kZSBzbyB0aGF0CiAgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gTm93aGVyZSBpbiB0aGUgY29kZSB3aWxsIGJlIHN0b3JlIG5hbWUKICByZXNvbHZlZCBpbmZvcm1hdGlvbiBhcm91bmQgc28gdGhhdCBhIHN1bnNlcXVlbnQgRE5TIGNhY2hlIHBydW5lIHNob3VsZAogIGNhdXNlIGEgcHJvYmxlbS4gVGhpcyBvZiBjb3Vyc2UgY2FsbGVkIGZvciBzb21lIG1pbGQgaW50ZXJuYWwgY2hhbmdlcy4KCkRhbmllbCAoMjMgQXByaWwgMjAwMikKLSBJbXByb3ZlZCB0aGUgJ25vX3Byb3h5JyBjaGVjaywgYXMgdXNpbmcgcG9ydCBudW1iZXJzIGluIHRoZSBVUkwgY29uZnVzZWQgaXQKICBwcmV2aW91c2x5LiBSZXBvcnRlZCBieSBFcndhbiBMZWdyYW5kIGluIGJ1ZyByZXBvcnQgIzU0NzQ4NC4KCi0gVGhlIC0taW50ZXJmYWNlIG9wdGlvbiBub3cgd29ya3MgZXZlbiBvbiBJUHY2IGVuYWJsZWQgYnVpbGRzLiBSZXBvcnRlZCBieQogICd0aG9yJy4KCkRhbmllbCAoMjIgQXByaWwgMjAwMikKLSBUaGUgI2RlZmluZXMgbmFtZXMgc3RhcnRpbmcgd2l0aCBUSU1FQ09ORCBub3cgaGFzIENVUkxfIHByZWZpeGVzLiAoVGhlIG9sZAogIG5hbWVzIGFyZSBzdGlsbCAjZGVmaW5lZCB0b28uKSBQb2ludGVkIG91dCBieSBSb2JlcnQgT2xzb24uCgotIEphY2t5IExhbSBicm91Z2h0IGNvZGUgdGhhdCBsZXRzIHRoZSBuYW1lIHJlc29sdmUgZnVuY3Rpb24gb25seSB1c2UgYXMgbXVjaAogIG1lbW9yeSBhcyBpdCBhY3R1YWxseSBuZWVkcy4gVGhpcyBvbmx5IHdvcmtzIG9uIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMsCiAgYnV0IGlzIHRvdGFsbHkgdHJhbnNwYXJhbnQgdG8gYWxsIHVzZXJzLgoKRGFuaWVsICgxOSBBcHJpbCAyMDAyKQotIEJqb3JuIFJlZXNlIGZpeGVkIHBhY2tfaG9zdGVudCB0byB3b3JrIHByb3Blcmx5IHdpdGggNjQgYml0IHBvaW50ZXJzLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAyKQotIFN0ZXJsaW5nIEh1Z2hlcyBhZGRlZCBjb2RlIHRvIHBydW5lIG9sZCBETlMgY2FjaGUgZW50cmllcywgc2luY2UgSmFja3kgTGFtCiAgZXhwZXJpZW5jZWQgdmVyeSBiaWcgY2FjaGVzLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIHBhdGNoZWQgdGhlIDMwMSByZXNwb25zZSB0byB3b3JrIGFnYWluc3QgdGhlIFJGQyBidXQgbW9yZSBsaWtlCiAgY29tbW9uIGJyb3dzZXJzIGRvLiBJZiBhIFBPU1QgZ2V0IGEgMzAxIGJhY2ssIGl0J2xsIHN3aXRjaCB0byBHRVQgaW4gdGhlCiAgbmV4dCByZXF1ZXN0IChpZiBsb2NhdGlvbi1mb2xsb3dpbmcgaXMgZW5hYmxlZCkuCgpEYW5pZWwgKDE2IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgcG9zdGVkIGEgcGF0Y2ggb3JpZ2luYWxseSB3cml0dGVuIGJ5IEluZ28gV2lsa2VuIHRoYXQgaW50cm9kdWNlZAogIHR3byBuZXcgQ1VSTElORk9fKiB2YWx1ZXM6IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgYW5kCiAgQ1VSTElORk9fUkVESVJFQ1RfQ09VTlQuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDIpCi0gSm9uYXRhbiBMYW5kZXIgcGF0Y2hlZCB0aGUgdmVyYm9zZSB0ZXh0ICdEaXNhYmxlcyBQT1NULCBnb2VzIHdpdGggR0VUJyB0bwogIHJlZmxlY3QgcmVhbGl0eSBiZXR0ZXIsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcmVxdWVzdCBpc24ndCBQT1NUIGFuZCB3aGVuCiAgdGhlIHNlY29uZCBpc24ndCBHRVQuLi4gOi0pCgotIENyYWlnIERhdmlzb24gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGN1cmxfZm9ybWFkZCgpaW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QKICBleGlzdCwgbGliY3VybCBkb2Vzbid0IHJldHVybiBlcnJvci4gTm93LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpbGwgcmV0dXJuCiAgQ1VSTEVfUkVBRF9FUlJPUiBpZiB0aGF0IGlzIHRoZSBjYXNlLiBUZXN0IDQxIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy45LjYKCkRhbmllbCAoMTQgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBzdHJpcCBvZmYgd2hpdGUgc3BhY2VzIGZyb20gdGhlCiAgYmVnaW5uaW5nIG9mIGNvb2tpZSBjb250ZW50cy4KCi0gSGFkIHRvIHBhdGNoIGluY2x1ZGUvY3VybC9jdXJsLmggc2luY2UgTVNWQyBkb2Vzbid0IHNldCB0aGUgX19TVERDX18gZGVmaW5lLgogIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGUgcHJvYmxlbSwgQmpvcm4gUmVlc2UgdGhlIHNvbHV0aW9uLgoKVmVyc2lvbiA3LjkuNi1wcmU1CgpEYW5pZWwgKDEyIEFwcmlsIDIwMDIpCi0gRml4ZWQgdGhlIFRJTUVSX0NPTk5FQ1QgdG8gYmUgbW9yZSBhY2N1cmF0ZSBmb3IgRlRQIHRyYW5zZmVycy4gUHJldmlvdXNseQogIEZUUCB0cmFuc2ZlcnMgZ290IHRoZSAiY29ubmVjdCBkb25lIiB0aW1lIHNldCBhZnRlciB0aGUgaW5pdGlhbCBGVFAgY29tbWFuZHMKICBhbmQgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSBUQ1AvSVAgY29ubmVjdCBhcyBpdCBzaG91bGQuCgogIEkgYWxzbyBtYWRlIHRoZSB0aW1lIHN0YW1wIGdldCBzZXQgZXZlbiBpZiB0aGUgY29ubmVjdCBpdHNlbGYgZmFpbHMsIHdoaWNoCiAgaXQgZGlkbid0IGRvIHByZXZpb3VzbHkuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgcHJvdmlkZWQgaGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcwogIENVUkxPUFRfREVCVUdGVU5DVElPTiBhbmQgQ1VSTE9QVF9ERUJVR0RBVEEuIFRoZXkgYWxsb3cgYSBwcm9ncmFtIHRvIGEgc2V0IGEKICBjYWxsYmFjayB0byByZWNlaXZlIGRlYnVnL2luZm9ybWF0aW9uIGRhdGEuIFRoYXQgaW5jbHVkZXMgaGVhZGVycyBhbmQgZGF0YQogIHRoYXQgaXMgcmVjZWl2ZWQgYW5kIHNlbnQuIENVUkxPUFRfVkVSQk9TRSBzdGlsbCBjb250cm9scyBpdC4KCiAgQnkgZGVmYXVsdCwgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZGVidWdmdW5jdGlvbiB0aGF0IHdpbGwgbWFrZSB0aGluZ3MgbG9vawogIGFuZCB3b3JrIGFzIGJlZm9yZSBpZiBub3QgY2hhbmdlZC4KCkRhbmllbCAoMTAgQXByaWwgMjAwMikKLSBTZWJhc3RpZW4gV2lsbGVtaWpucyBmb3VuZCBvdXQgdGhhdCAteCBkaWRuJ3QgdXNlIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVyIGFzCiAgaXMgZG9jdW1lbnRlZC4gSXQgZG9lcyBub3cuCgotIGxpYmN1cmwtZXJyb3JzLjMgaXMgYSBuZXcgbWFuIHBhZ2UgYXR0ZW1wdGluZyB0byBkb2N1bWVudCBhbGwgbGliY3VybCBlcnJvcgogIGNvZGVzCgotIEFkZGVkIHR3byBuZXcgZXJyb3IgY29kZXMgYW5kIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0d28gb2xkIG9uZXMKICBzbGlnaHRseToKCiAgQ1VSTEVfV1JJVEVfRVJST1IKICAgVGhpcyBlcnJvciB3YXMgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgdGhhdCBvY2N1cmVkIHdoZW4gd3JpdGluZwogICByZWNlaXZlZCBkYXRhIHRvIGEgbG9jYWwgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIHdlIGdldCBwcm9ibGVtcyB3cml0aW5nIGRhdGEKICAgdG8gYSByZW1vdGUgc2VydmVyLiBDVVJMRV9TRU5EX0VSUk9SIGhhcyBub3cgYmVlbiBhZGRlZCBmb3IgdGhlIGxhdHRlcgogICBlcnJvci4KCiAgQ1VSTEVfUkVBRF9FUlJPUgogICBUaGlzIGVycm9yIHdhcyBzaW1pbGFybHkgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgd2hlbiByZWFkaW5nIGEgbG9jYWwKICAgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIGdldHRpbmcgcHJvYmxlbXMgd2hlbiByZWFkaW5nIG5ldHdvcmsgZGF0YS4KICAgQ1VSTEVfUkVDVl9FUlJPUiBoYXMgbm93IGJlZW4gYWRkZWQgZm9yIHRoZSBsYXR0ZXIgZXJyb3IuCgogKFR3byB0ZXN0IGNhc2VzIHdlcmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuKQoKRGFuaWVsICg5IEFwcmlsIDIwMDIpCi0gcnVudGVzdHMucGwgbm93IHNldHMgdGhlIEhPTUUgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgY3VybCwgdG8gcHJldmVudCBhbnkKICBhY3R1YWwgfi8uY3VybHJjIGZpbGUgdG8gZm9vbCB0aGUgdGVzdHMhCgpWZXJzaW9uIDcuOS42LXByZTQKCkRhbmllbCAoOCBBcHJpbCAyMDAyKQotIE1pY2hhZWwgQ3VydGlzIHByb3ZpZGVkIG5ldyBmdW5jdGlvbmFsaXR5IGZvciBjdXJsIG9uIHNvbWUgcGxhdGZvcm1zLiBVc2luZwogIHRoZSAtLWVudmlyb25tZW50IG9wdGlvbiwgY3VybCB3aWxsICpzZXQqIGEgYnVuY2ggb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgdG8gdmFsdWVzLiBUaGUgbmFtZXMgYXJlIHRoZSBzYW1lIG9uZXMgYXMgZm9yIHRoZSAtdy8tLXdyaXRlb3V0IG9wdGlvbi4KCiAgRm9yIG5vdywgdGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBSSVNDIE9TIHZlcnNpb24sIGFzIHRoaXMgZmVhdHVyZSByZWxpZXMgb24KICBib3RoIE9TIHN1cHBvcnQgYW5kIHRoYXQgaXQgbWF0Y2hlcyBPUyBwYXJhZGlnbXMuCgotIEphY2t5IExhbSBwcm92aWRlZCBhIGZpeCBmb3IgZ2V0dGluZyBoZWFkZXJzLW9ubHkgd2hlbiB0aGUgcmVwbHkgaXMgSFRUUC8xLjAKICBhbmQgMzA0LCBJIGVkaXRlZCBpdCBzbGlnaHRseS4KCkRhbmllbCAoNSBBcHJpbCAyMDAyKQotIEFzIHJlcXVlc3RlZCBieSBKYXkgR3JhdmVzLCB0aGUgJy5jdXJscmMnIGZpbGUgKG9yIF9jdXJscmMgYXMgaXQgaXMgY2FsbGVkCiAgd2hlbiB1c2VkIGluIHdpbmRvd3MpLCBpcyBub3cgbG9hZGVkIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBIT01FCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNuJ3Qgc2V0IChvciBpZiBpdCBpcyB0b28gbG9uZykuIEkgYWxzbyBlbmxhcmdlZCB0aGUKICBhcnJheSB1c2VkIHRvIHN0b3JlIHRoZSBmdWxsIGZpbGUgcGF0aCBpbiwgdG8gNTEyIGJ5dGVzLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRvIG1lIHdoeSB0aGUgIjE5IE1hcmNoIiBjaGFuZ2UgcmVnYXJkaW5nIC1HIGFuZCAtSQogIHdhcyBzdHVwaWQgYW5kIHRoZSBjaGFuZ2Ugd2FzIHJldmVydGVkLiBBZGRlZCB0ZXN0IGNhc2UgNDggdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuCgpWZXJzaW9uIDcuOS42LXByZTMKCkRhbmllbCAoNCBBcHJpbCAyMDAyKQotIEpvbmF0YW4gTGFuZGVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwvY3VybC5oIGNvbXBpbGUgbmljZWx5IG9uCiAgcHJlLUlTTyBjb21waWxlcnMsIGxpa2Ugd2hlbiB1c2luZyBnY2MgLXRyYWRpdGlvbmFsLgoKRGFuaWVsICgzIEFwcmlsIDIwMDIpCi0gSmFja3kgTGFtIGlkZW50aWZpZWQgYSBnbGl0Y2ggd2hlbiBnZXR0aW5nIGhlYWRlcnMtb25seSwgd2hlcmUgbGliY3VybCB3b3VsZAogICJoYW5nIiAxIHNlY29uZCBpbiB2YWluIGluIHRoZSBzZWxlY3QoKSBsb29wIGJlZm9yZSByZXR1cm5pbmcgYmFjay4KCi0gVG9yIEFybnRzZW4gYnJvdWdodCBhIHBhdGNoIGZvciBtdWx0aXBhcnQgZm9ybXBvc3RzLiBJdCB0dXJuZWQgb3V0IHRoYXQgdGhlCiAgIkNHSV9MaXRlIFBlcmwgcGFja2FnZSIgbWFrZXMgc29tZSBiYWQgYXNzdW1wdGlvbnMgb24gd2hhdCBsZXR0ZXJzIHRoYXQgbWF5CiAgYmUgdXNlZCBpbiBib3VuZGFyeSBzdHJpbmdzIGFuZCB0aHVzIGN1cmwgY291bGQgY29uZnVzZSBpdCBieSBpbmNsdWRpbmcgJysnCiAgYW5kICcvJy4gV2hpbGUgdGhpcyBpcyBzdGFuZGFyZHMtY29tcGxpYW50LCB3ZSBjaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIHdvcmsKICBzbW9vdGhseSB3aXRoIGV4aXN0aW5nIHNvZnR3YXJlIGJhc2VkIG9uIHRoYXQgcGFja2FnZS4KCkRhbmllbCAoMiBBcHJpbCAyMDAyKQotIEdlcmhhcmQgSGVycmUgZmlsZWQgYnVnIHJlcG9ydCAjNTM2MjM4IHdoZXJlIGhlIHBvaW50ZWQgb3V0IGEgY3Jhc2ggaW4KICB2ZXJib3NlIEZUUCBwYXNzaXZlIHRyYW5zZmVycyBmb3IgQUlYLgoKLSBDbGFyZW5jZSBHYXJkbmVyIHBvaW50ZWQgb3V0IGEgbWlub3IgZmxhdyBpbiBob3cgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkKICB0YWtlIGNhcmUgb2YgYWxsIGVycm9ycyB0aGF0IFNTTF9yZWFkKCkgY291bGQgcmV0dXJuLgoKLSBKYWNreSBMYW0gZml4ZWQgYSBNQUxMT0NERUJVRyBwcm9ibGVtIGluIGxpYi9nZXRpbmZvLmMKCkRhbmllbCAoMjcgTWFyY2ggMjAwMikKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgY29ubmVjdGlvbiByZS11c2UgZnVuY3Rpb24gdGhhdCBkaWRuJ3QKICBjaGVjayBwcm94eSBjb25uZWN0aW9ucyBwcm9wZXJseSBmb3IgImRlYWRuZXNzIiBiZWZvcmUgdGhleSB3ZXJlIHJlLXVzZWQuCgotIFBlZHJvIE5ldmVzIGZvdW5kIG91dCB0aGF0IEhUVFAgUE9TVGluZyB3aXRoIC0tZGF0YS1iaW5hcnkgZGlkIG5vdCBwcm9wZXJseQogIHdvcmsgdW5kZXIgV2luZG93cyBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2Fzbid0IHJlYWQgZnVsbHkgYmluYXJ5IQoKRGFuaWVsICgyNSBNYXJjaCAyMDAyKQotIEphY2t5IExhbSBicm91Z2h0IGEgZml4IHRoYXQgaW1wcm92ZXMgdHJlYXRtZW50IG9mIGNvb2tpZXMgdXNpbmcgaWRlbnRpY2FsCiAgZG9tYWlucyBidXQgd2l0aCBsZWFkaW5nIGRvdHMgcHJvcGVybHkuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDIpCi0gTWlrbG9zIE5lbWV0aCB1cGRhdGVkIHRoZSB3aW5kb3dzIHNlY3Rpb24gb2YgdGhlIGRvY3MvSU5TVEFMTCBmaWxlIGFuZCB0aGUKICB3aW5kb3dzIG1ha2VmaWxlcy4KCi0gSm9uIERpbGxvbiBwcm92aWRlZCB1cyB3aXRoIHNldmVyYWwgZ29vZC1sb29raW5nIGN1cmwgaW1hZ2VzIGZvcgogIHByb21vdGlvbi4gVmlldyB0aGVtIGhlcmUgaHR0cDovL2N1cmwuaGF4eC5zZS9pY29ucy5odG1sCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDIpCi0gUGV0ZXIgVmVyaGFzIGZvdW5kIG91dCB0aGF0IENSTEYgcmVwbGFjZW1lbnQgaW4gdXBsb2FkcyB3YXMgbm90IHdvcmtpbmcuIEkKICBmaXhlZCBpdCwgYW5kIGFkZGVkIHRlc3QgY2FzZSAxMjggdGhhdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gVGhlIGxpc3QgZm9ybWVybHkga25vd24gYXMgY3VybC1tYWluIGlzIG5vdyBuYW1lZCBjdXJsLXVzZXJzIGFuZCBpcyBob3N0ZWQKICBieSBzb3VyY2Vmb3JnZS4gU3VzYmNyaWJlIHRvIHRoZSBuZXcgbGlzdCwgZ2V0IG9mZiB0aGUgb2xkIG9uZS4KClZlcnNpb24gNy45LjYtcHJlMgoKRGFuaWVsICgxOSBNYXJjaCAyMDAyKQotIE1hZGUgLUcgYW5kIC1JIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBjYXVzZSBhbiBlcnJvci4KCi0gTW92ZWQgdGhlIG11bHRpLmggZmlsZSB0byB0aGUgInB1YmxpYyIgaW5jbHVkZSBkaXJlY3RvcnkgYW5kIG1hZGUgaXQgZ2V0CiAgaW5jbHVkZWQgYnkgY3VybC5oIHNvIHRoYXQgbm8gZXh0cmEgaW5jbHVkZSBmaWxlcyB3aWxsIGJlIG5lY2Vzc2FyeSB0byB1c2UKICBpdC4KCiAgQWRkZWQgZG9jcyBhbmQgbWFuIHBhZ2VzIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCiAgQWRkZWQgdGhlIHRocmVlIGV4YW1wbGUgc291cmNlIGNvZGVzIHRvby4KCiAgTmVjZXNzYXJ5IHN0ZXBzIGluIG15IGNhbXBhaWduIHRvIHNuZWFrIGluIHRoZSBtdWx0aSBpbnRlcmZhY2UuLi4gOy0pCgotIFVwZGF0ZWQgdGhlIHllYXIgaW4gYWxsIGNvcHlyaWdodCBub3RpY2VzIGluIGFsbCBDIGFuZCBIIGZpbGVzLgoKRGFuaWVsICgxOCBNYXJjaCAyMDAyKQotIFRvbWFzIFN6ZXBlIGZvdW5kIG91dCB0aGF0IC1kIGFuZCAtRyBkaWRuJ3QgbWl4IGFzIHRoZXkgc2hvdWxkLiBJIGJyb2tlIHRoaXMKICBpbiA3LjkuNS4uLiBBZGRlZCB0ZXN0IGNhc2UgMzIgZm9yIHRoaXMuCgpWZXJzaW9uIDcuOS42LXByZTEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMikKLSBQZXRlciBWZXJoYXMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5zY2FwZSBtYW4gcGFnZXMKICBjb250YWluZWQgZmFjdHVhbCBlcnJvcnMuCgotIEFsYmVydCBDaG95IGZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIHZlcmJvc2Ugb3V0cHV0IHdoZW4gZG9pbmcKICBQQVNWIGZ0cCB0cmFuc2ZlcnMuIEl0IGNvdWxkIG1ha2UgbGliY3VybCBjcmFzaC4KCiAgRGV0YWlscyBpbiBidWcgcmVwb3J0ICM1MzA1NjI6CiAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTEwMDk3NiZhaWQ9NTMwNTYyJmdyb3VwX2lkPTk3NgoKRGFuaWVsICgxNSBNYXJjaCAyMDAyKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaWxlZCBidWcgcmVwb3J0ICM1MzAyMDQgdGhhdCBjbGVhcmx5IHBvaW50ZWQgb3V0CiAgdGhlIFBGX0lORVQgZml4IGZyb20gRmVicnVhcnkgMTkgYXMgYSBub3QtdmVyeS1nb29kIGZpeCBhcyBpdCBicm9rZSBJUHY2CiAgY2FwYWJpbGl0eSEgVGhhdCBwYXRjaCBpcyBub3cgcmV2ZXJ0ZWQuCgogIFRoZSBwcm9ibGVtIHdpdGggc2xvdyBuYW1lIGxvb2t1cHMgd2l0aCBnZXRhZGRyaW5mbygpIG9uIG5vbi1JUHY2IGVuYWJsZWQKICBob3N0cyBhcmUgaW5zdGVhZCBtYWRlIGJ5IGZpcnN0IGNoZWNraW5nIGlmIHRoZSBzdGFjayBpcyBJUHY2LWVuYWJsZWQgYW5kIGlmCiAgbm90LCB0aGUgUEZfSU5FVCBpcyB1c2VkIGFuZCBvdGhlcndpc2Ugd2UgZ28gd2l0aCB0aGUgZnVsbCBQRl9VTlNQRUMuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgdGhhdCB3aGVuIHdlIHJldHVybiBhbiAiZXJyb3IiIGZyb20gYSBXUklURUZVTkNUSU9OCiAgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW4gcGFnZSwgbGliY3VybCBkaWQgbm90IHJldHVybiB0aGUgZG9jdW1lbnRlZCBlcnJvcgogIGNvZGUgKENVUkxFX1dSSVRFX0VSUk9SKSBidXQgd291bGQgaW5zdGVhZCByZXR1cm4gQ1VSTEVfUkVBRF9FUlJPUi4gVGhpcyBpcwogIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDIpCi0gU2V0dGluZyBDVVJMT1BUX1BPU1Qgd2l0aG91dCBzZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyBub3cgcmVhZCB0aGUgUE9TVC0KICBkYXRhIGZyb20gdGhlIGNhbGxiYWNrLgoKLSBUaGUgR09QSEVSIHN1cHBvcnQgc2VlbXMgdG8gYmUgYnJva2VuLiBJIGRvbid0IHRoaW5rIEknbGwgZXZlbiBzdGFydCBmaXhpbmcKICBpdCB1bnRpbCBzb21lb25lIGVsc2UgZmluZHMgb3V0Li4uIDotKQoKRGFuaWVsICgxMyBNYXJjaCAyMDAyKQotIFRyeWluZyAnY3VybCAtSSBmdHAuc3VuZXQuc2UnIG9yIHNpbWlsYXIgZGlkIGEgU0laRSBvbiBhIHNpbGx5ICIobmlsKSIKICBzdHJpbmcuIElmIHN1Y2ggYSBmaWxlIHdvdWxkIGJlIHByZXNlbnQsIGN1cmwgcmV0dXJuZWQgdGhlIHNpemUgb2YgaXQhIE5vdwogIHdlIHByZXZlbnQgdGhpcy4KCi0gQ3VybF9zZW5kZigpIHdhcyBmaXhlZCB0byBkZWFsIHdpdGggc2l0dWF0aW9uIHdoZXJlIEN1cmxfd3JpdGUoKSB3b3VsZCd2ZQogIGJsb2NrZWQgYW5kIHRodXMgcmV0dXJuIC0xLgoKLSBTZXR0aW5nIENVUkxPUFRfUFJPR1JFU1NGVU5DVElPTiB0byBOVUxMIG5vdyByZXN0b3JlcyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24uCgotIEFsbCBDVVJMRk9STV8qIG9wdGlvbnMgY2FuIG5vdyBiZSB1c2VkIGluIGEgQ1VSTEZPUk1fQVJSQVkgZXhjZXB0IHRoZQogIENVUkxGT1JNX0FSUkFZIGl0c2VsZi4gVGhpcyB3YXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGNvdWxkbid0IGV4cGFuZCB0aGUKICBDVVJMRk9STV8qIGxpc3QgcHJvcHJlbHkgYW5kIHVucmVzdHJpY3RlZCB1bnRpbCB0aGlzIHdhcyB0aGUgY2FzZS4gSXQgd2FzCiAgYWxzbyBhIGJpdCBwZWN1bGlhciB0byB1c2VycyB3aHkgc29tZSBvcHRpb25zIGNvdWxkIGJlIHVzZWQgaW4gYW4gYXJyYXkKICB3aGlsZSBvdGhlcnMgY291bGRuJ3QuCgotIFJlbW92ZWQgc29tZSBzaWxseSBDUkxGIGxpbmVzIHRoYXQgaGFkIGFjY2lkZW50YWxseSBzbGlwcGVkIGludG8gc3JjL21haW4uYwogIE5pY28gQmFnZ3VzIHBvaW50ZWQgdGhlbSBvdXQgdG8gbWUuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDIpCi0gQ1VSTEZPUk1fRklMRU5BTUUgd2FzIGFkZGVkLiBUaGlzIGNhbiBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIGZpbGUgdXBsb2FkCiAgcGFydCwgdG8gc2V0IHRoZSAnZmlsZW5hbWUnIGZpZWxkIHRvIGEgY3VzdG9tIHZhbHVlLiBJZiB0aGlzIGlzbid0IHVzZWQsCiAgdGhlIGFjdHVhbGx5IHVzZWQgZmlsZW5hbWUgd2lsbCBiZSBpbmNsdWRlZCBpbnN0ZWFkIChhcyBsaWJjdXJsIGFsd2F5cyBoYXMKICBkb25lKS4gY3VybCB3YXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHksIGFuZCBub3cgLUYgYWNjZXB0cyBhICdmaWxlbmFtZT0nIGZpZWxkCiAgdG9vLCBhbmQgYWxsb3dzIGNvbnN0cnVjdHMgc3VjaCBhczoKCiAgICAtRiAnbmFtZT1AZmlsZW5hbWU7ZmlsZW5hbWU9L2Rldi9udWxsJwoKICBhbmQgdGhpcyBjYW4gYmUgY29tYmluZWQgd2l0aCB0eXBlPSB0b28sIGluIGEgbWFubmVyIHNpbWlsYXIgdG86CgogICAtRiAiZmlsZT1AbG9nL3Rlc3QzOS50eHQ7ZmlsZW5hbWU9ZmFrZXJmaWxlO3R5cGU9bW9vL2Zvb2JhciIKCiAgVGVzdCBjYXNlIDM5IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUaGUgc3RydWN0IGZvcm1lcmx5IGtub3duIGFzIEh0dHBQb3N0IGlzIG5vdyBuYW1lZCBjdXJsX2h0dHBwb3N0IHRvIHByb3Blcmx5CiAgdXNlIHRoZSBjdXJsIG5hbWUgc3BhY2UuIEkgYWRkZWQgYSAjZGVmaW5lIGZvciB0aGUgb2xkIG5hbWUgdG8gbWFrZSBleGlzdGluZwogIHByb2dyYW1zIGNvbXBpbGUgZXZlbiB3aGVuIHRoaXMgbmV3IGluY2x1ZGUgZmlsZSBpcyB1c2VkLgoKRGFuaWVsICg4IE1hcmNoIDIwMDIpCi0gQ2xpZmZvcmQgYWxzbyBkaXNjb3ZlcmVkIHRoYXQgaWYgdGhlIGNsaWVudCBjb2RlIGZhaWxlZCBlYXJseSwgYXMgd2hlbiBkb2luZwogICJjdXJsIC1PIiBvbmx5LCBpdCB3b3VsZCBkbyBmY2xvc2UoTlVMTCkgd2hpY2ggY2F1c2VkIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgb24gc29tZSBzeXN0ZW1zLgoKLSBDbGlmZm9yZCBXb2xmIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIC0tcHJvZ3Jlc3MtYmFyIHdvcmsgYWdhaW4uCgotIEkgY2xvc2VkIGJ1ZyByZXBvcnQgIzUyNzAzMiBieSBtYWtpbmcgc3VyZSB0aGF0IHdlIGFkZCBhIG5ld2xpbmUgYWZ0ZXIgYQogIHRyYW5zZmVyIHdoZW4gLS1wcm9ncmVzcy1iYXIgaGFzIGJlZW4gdXNlZC4gQmVmb3JlLCB3aXRob3V0IHRoZSBuZXdsaW5lLCBpdAogIG1hZGUgdGhlIHN1YnNlcXVlbnQgdGV4dCBjb21lIG91dCB3cm9uZy4KClZlcnNpb24gNy45LjUKCkRhbmllbCAoNyBNYXJjaCAyMDAyKQotIEFkZGVkIGRvY3MvS05PV05fQlVHUyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg2IE1hcmNoIDIwMDIpCi0gS2V2aW4gUm90aCBjb3JyZWN0ZWQgYSBmbGF3IGluIHRoZSBjdXJsIGNsaWVudCBnbG9iYmluZyBjb2RlIHRoYXQgbWFkZSBpdAogIG1lc3MgdXAgYmFja3NsYXNoZXMuIFRoaXMgd2FzIG1vc3Qgbm90YWJsZSBvbiB3aW5kb3dzIChjeWd3aW4pIG1hY2hpbmVzIHdoZW4KICB1c2luZyBmaWxlOi8vLgoKLSBCcmFkIHByb3ZpZGVkIGFub3RoZXIgZml4IGZvciBidWlsZGluZyBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4KCi0gUmFscGggTWl0Y2hlbGwgcGF0Y2hlZCBhd2F5IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIGluIHRlc3RzL3NlcnZlci9zd3MuYwoKRGFuaWVsICg1IE1hcmNoIDIwMDIpCi0gSSBub3RpY2VkIHRoYXQgdGhlIHR5cGVkZWYgaW4gY3VybC5oIGZvciB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgcHJvdG90eXBlIHdhcwogIHdyb25nIGFuZCB0aHVzIGFwcGxpY2F0aW9ucyB0aGF0IHVzZWQgaXQgd291bGQgbm90IGdldCB0aGUgcHJvcGVyIGlucHV0CiAgZGF0YS4gSXQgdXNlZCBzaXplX3Qgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHVzZXMgZG91YmxlcyEKCiAgSSB3aXNoIEkgY291bGQgYmxhbWUgc29tZW9uZSBlbHNlLCBidXQgdGhpcyB3YXMgbXkgZmF1bHQuIEFnYWluLgoKVmVyc2lvbiA3LjkuNS1wcmU2CgpEYW5pZWwgKDQgTWFyY2ggMjAwMikKLSBDdXQgb2ZmIHRoZSBjaGFuZ2VzIGRvbmUgZHVyaW5nIDIwMDEgZnJvbSB0aGlzIGNoYW5nZWxvZyBmaWxlIGFuZCBwdXQgdGhlbQogIGluIGEgc2VwYXJhdGUgZmlsZSAoQ0hBTkdFUy4yMDAxKSwgYXZhaWxhYmxlIGZyb20gQ1ZTIG9mIGNvdXJzZS4KCi0gSSByZW1vdmVkIHRoZSBtdWx0aSBkaXJlY3RvcnkuIFRoZSBleGFtcGxlIHNvdXJjZXMgd2VyZSBtb3ZlZCB0byB0aGUKICBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aGVyZSB0aGV5IGJlbG9uZy4KCi0gV3JvdGUgNyBuZXcgbWFuIHBhZ2VzIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbnMgaW4gdGhlIG5ldyBtdWx0aSBpbnRlcmZhY2UuCiAgVGhleSdyZSBhbGwgc3RpbGwgcHJldHR5IGJhc2ljLCBidXQgd2UgY2FuIHVzZSB0aGVtIGFzIGEgc3RhcnQgYW5kIGFkZCBtb3JlCiAgY29udGVudHMgdG8gdGhlbSB3aGVuIHdlIGZpZ3VyZSBvdXQgd2hhdCB0byB3cml0ZS4gVGhlIGxhcmdlIGFtb3VudCBvZiBtYW4KICBwYWdlcyBmb3IgbGliY3VybCBub3cgcHJlc2VudCBtYWRlIG1lIGRlY2lkZSB0byBwdXQgdGhlbSBpbiBhIG5ldyBzZXBhcmF0ZQogIHN1YmRpcmVjdG9yeSBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIE5hbWVkIGxpYmN1cmwuCgotIEdpdXNlcHBlIENvcmJlbGxpIHByb3ZpZGVkIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIEVQTSBwYWNrYWdlIG1hbmFnZXIsIGl0CiAgZ2V0cyBnZW5lcmF0ZWQgbmljZWx5IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdy4KClZlcnNpb24gNy45LjUtcHJlNQoKRGFuaWVsICgxIE1hcmNoIDIwMDIpCi0gTW92ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IGludG8gdGhlIHRlc3RzLyBkaXIgYW5kIGFkZGVkIGl0IHRvIHRoZQogIHJlbGVhc2UgYXJjaGl2ZXMuIEl0IHdhcyBwcmV2aW91c2x5IG9ubHkgcHJlc2VudCBpbiB0aGUgQ1ZTIHRyZWUuCgotIE1vZGlmaWVkIHRoZSBGZWJydWFyeSAxN3RoIEhvc3Q6IGZpeCwgYXMgYnVnIHJlcG9ydCAjNTIzNzE4IHBvaW50ZWQgb3V0IHRoYXQKICBpdCBjYXVzZWQgY3Jhc2hlcyEKCi0gTmljbyBCYWdndXMgYWRkZWQgbW9yZSBlcnJvciBjb2RlcyB0byB0aGUgVk1TIHN0dWZmLgoKLSBXZXNsZXkgTGF4dG9uIGJyb3VnaHQgdGhlIGNvZGUgdGhhdCBpbnRyb2R1Y2VkIHRoZSBuZXcgQ1VSTE9QVF9QUkVRVU9URQogIG9wdGlvbi4gSXQgaXMganVzdCBhbm90aGVyIEZUUCBxdW90ZSBvcHRpb24gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeQogIGEgbGlzdCBvZiBGVFAgY29tbWFuZHMgdG8gaXNzdWUgKmp1c3QgYmVmb3JlKiB0aGUgdHJhbnNmZXIgY29tbWFuZCAoUkVUUiBvcgogIFNUT1IgZXRjKS4gSXQgaGFzIHR1cm5lZCB1cCBhIGZldyBzeXN0ZW1zIHRoYXQgcmVhbGx5IG5lZWQgdGhpcy4KCiAgVGhlIGN1cmwgY29tbWFuZCBsaW5lIHRvb2wgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBieSBwcmVmaXhpbmcgdGhlCiAgcXVvdGUgY29tbWFuZHMgd2l0aCBhIHBsdXMgKCspIGluIHNpbWlsYXIgc3R5bGUgdGhhdCBwb3N0IHRyYW5zZmVyIHF1b3RlCiAgY29tbWFuZHMgYXJlIHNwZWNpZmllZC4KCiAgVGhpcyBpcyBub3QgeWV0IGRvY3VtZW50ZWQuIFRoZXJlIGlzIG5vIHRlc3QgY2FzZSBmb3IgdGhpcyB5ZXQuCgpEYW5pZWwgKDI4IEZlYnJ1YXJ5IDIwMDIpCi0gUmFscGggTWl0Y2hlbGwgbWFkZSBzb21lIHNlcmlvdXMgZWZmb3J0cyBhbmQgcHV0IGEgbG90IG9mIHN3ZWF0IGluIHNldHRpbmcKICB1cCBzY3JpcHRzIGFuZCB0aGluZ3MgZm9yIG1lIHRvIGJlIGFibGUgdG8gcmVwZWF0IGhpcyBwcm9ibGVtcywgYW5kIEkKICBmaW5hbGx5IGNvdWxkLiAgSSBmb3VuZCBhIHByb2JsZW0gd2l0aCB0aGUgaGVhZGVyIGJ5dGUgY291bnRlciB0aGF0IHdhc24ndAogIGluY3JlYXNlZCBwcm9wZXJseSBhbmQgdGh1cyB3ZSBjb3VsZCByZXR1cm4gQ1VSTEVfR09UX05PVEhJTkcgd2hlbiB3ZSBpbgogIGZhY3QgaGFkIHJlY2VpdmVkIGRhdGEuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDIpCi0gSSBoYWQgdG8gcmV2ZXJ0IHRoZSBub24tc3BhY2UgcGFyc2luZyBjb29raWUgZml4IEkgcG9zdGVkIHRvIHRoZSBtYWlsaW5nCiAgbGlzdC4gRXhwaXJlIGRhdGVzIGRvIGhhdmUgc3BhY2VzIGFuZCBzdGlsbCBuZWVkIHRvIGdldCBwYXJzZWQgcHJvcGVybHkhCiAgSW5zdGVhZCB3ZSBqdXN0IGlnbm9yZSB0cmFpbGluZyB3aGl0ZSBzcGFjZSBhbmQgaXQgc2VlbXMgdG8gd29yay4uLgoKRGFuaWVsICgyNiBGZWJydWFyeSAyMDAyKQotIE1hZGUgdGhlIGNvb2tpZSBwcm9wZXJ0eSAnTWF4LUFnZScgd29yaywganVzdCBzaW5jZSB3ZSBhbHJlYWR5IHRyaWVkIHRvCiAgc3VwcG9ydCBpdCwgaXQgaXMgYmV0dGVyIHRvIGRvIGl0IHJpZ2h0LiBObyBvbmUgdXNlcyB0aGlzIGFueXdheS4KCi0gVGhlIGNvb2tpZSBwYXJzZXIgY291bGQgY3Jhc2ggaWYgYSByZWFsbHkgd2VpcmQgKGlsbGVnYWwpIGNvb2tpZSBsaW5lIHdhcwogIHJlY2VpdmVkLiBJIGFsc28gbWFkZSBpdCBiZXR0ZXIgZGlzY2FyZCByZWFsbHkgb2RkbHkgZm9ybWF0dGVkIGxpbmVzIGJldHRlci4KCiAgTWFkZSB0aGUgY29va2llIGphciBzdG9yZSB0aGUgc2Vjb25kIGZpZWxkIGZyb20gdGhlIGxlZnQgdXNpbmcgdGhlIHN5bnRheAogIHRoYXQgTmV0c2NhcGUgYW5kIE1vemlsbGEgcHJvYmFibHkgbGlrZS4gQ3VybCBpdHNlbGYgaWdub3JlcyBpdC4KCiAgQWRkZWQgdGVzdCBjYXNlIDMxIGZvciB0aGVzZSBjYXNlcy4KCiAgQ2xheSBMb3ZlbGVzcycgZW1haWwgcmVnYXJkaW5nIHNvbWUgY29va2llIGlzc3VlcyBzdGFydGVkIG15IGNsZWFudXAuCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdGhhdCBteSBhdXRvbWFrZSBmaWRkbGVzIGJyb2tlIHRoZSBhYmlsaXR5IHRvIGJ1aWxkCiAgb3V0c2lkZSB0aGUgc291cmNlLXRyZWUgYW5kIEkgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdCB0aGF0IGJyaW5ncwogIHRoaXMgYWJpbGl0eSBiYWNrLgoKVmVyc2lvbiA3LjkuNS1wcmU0CgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDIpCi0gRmlkZGxlZCB3aXRoIHRoZSBhdXRvbWFrZSBmaWxlcyB0byBtYWtlIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIGxpYgogIGRpcmVjdG9yeSBub3QgaGF2ZSAuLi9zcmMgaW4gdGhlIGluY2x1ZGUgcGF0aCwgYW5kIHRoZSBzcmMgc291cmNlcyBzaG91bGRuJ3QKICBoYXZlIC4uL2xpYiEKCi0gQWxsIDc5IHRlc3QgY2FzZXMgcmFuIE9LIHVuZGVyIExpbnV4IGFuZCBTb2xhcmlzIHVzaW5nIHRoZSBuZXcgSFRUUCBzZXJ2ZXIKICBpbiB0aGUgdGVzdCBzdWl0ZS4gVGhlIG5ldyBIVFRQIHNlcnZlciB3YXMgZmlyc3QgZG9uYXRlZCBieSBHZW9yZyBIb3JuIGFuZAogIHN1YnNlcXVlbnRseSBtb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHRlc3Qgc3VpdGUuIEl0IGlzIGN1cnJlbnRseSBzdGlsbCBub3QKICBwb3J0YWJsZSBlbm91Z2ggdG8gcnVuIG9uICJhbGwgb3ZlciIgYnV0IHRoaXMgaXMgYSBzdGFydCBhbmQgSSBjYW4gcnVuIGFsbAogIGN1cmwgdGVzdHMgb24gbXkgbWFjaGluZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHJlcXVpcmVtZW50IGZvciB0aGUgdXBjb21pbmcKICBwdWJsaWMgcmVsZWFzZS4KCi0gVXNpbmcgLWQgYW5kIC1JIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBub3cgcmVwb3J0cyBhbiBlcnJvciwgYXMgaXQgaW1wbGllcwogIHR3byBkaWZmZXJlbnQgSFRUUCByZXF1ZXN0cyB0aGF0IGNhbid0IGJlIG1peGVkLgoKLSBKZWZmcmV5IFBvaGxtZXllciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgLXcvLS13cml0ZS1vdXQgb3B0aW9uCiAgc3VwcG9ydCAle2NvbnRlbnRfdHlwZX0gdG8gZ2V0IHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlY2VudCBkb3dubG9hZC4KCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0aGF0IHByZTIgYW5kIHByZTMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgb24gY3lnd2luLAogIGFuZCB0aGlzIHdhcyBiZWNhdXNlIEkgdXNlZCAjaWZkZWYgSEFWRV9XSU5TT0NLX0ggaW4gbGliL211bHRpLmggdG8gZmlndXJlCiAgb3V0IGlmIHdlIGNvdWxkIGluY2x1ZGUgd2luc29jay5oIHdoaWNoIHR1cm5zIG91dCBub3QgdG8gYmUgYSB3aXNlIGNob2ljZSB0bwogIGRvIG9uIGN5Z3dpbiBzaW5jZSBpdCBoYXMgdGhlIGZpbGUgYnV0IGNhbid0IGluY2x1ZGUgaXQhCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDIpCi0gQWRkZWQgc3JjL2NvbmZpZy12bXMuaCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKLSBGaXhlZCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIGFnYWluLCB0aGUgY2hhbmdlIGZyb20gRmVicnVhcnkgMTggd2Fzbid0CiAgY29tcGxldGUuCgpWZXJzaW9uIDcuOS41LXByZTMKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIGFuZCBBbmRy6XMgR2FyY+1hIGJvdGggZm91bmQgb3V0IHRoYXQgbGliL2NvbmZpZy5oLmluIHdhcyBtaXNzaW5nCiAgaW4gdGhlIHByZS1yZWxlYXNlIGFyY2hpdmUgYW5kIHRodXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkLgoKVmVyc2lvbiA3LjkuNS1wcmUyCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDIpCi0gQW5kculzIEdhcmPtYSBwcm92aWRlZCBhIHNvbHV0aW9uIHRvIGJ1ZyByZXBvcnQgIzUxNTIyOC4gdGhlIHRvdGFsIHRpbWUKICBjb3VudGVyIHdhcyBub3Qgc2V0IGNvcnJlY3RseSB3aGVuIC1JIHdhcyB1c2VkIGR1cmluZyBzb21lIGNvbmRpdGlvbnMgKGFsbAogIGhlYWRlcnMgd2VyZSByZWFkIGluIG9uZSBzaW5nbGUgcmVhZCkuCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIGEgaHVnZSBwYXRjaCB3aXRoIG1pbm9yIHR3ZWFrcyBhbGwgb3ZlciB0byBtYWtlIGN1cmwKICBjb21waWxlIG5pY2VseSBvbiBWTVMuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDIpCi0gUmljayBSaWNoYXJkc29uIGZvdW5kIG91dCB0aGF0IGJ5IHJlcGxhY2luZyBQRl9VTlNQRUMgd2l0aCBQRl9JTkVUIGluIHRoZQogIGdldGFkZHJpbmZvKCkgY2FsbHMsIGhlIGNvdWxkIHNwZWVkIHVwIHNvbWUgbmFtZSByZXNvbHZpbmcgY2FsbHMgd2l0aCBhbgogIG9yZGVyIG9mIG1hZ25pdHVkZXMgb24gaGlzIFJlZGhhdCBMaW51eCA3LjIuCgotIFBoaWxpcCBHbGFkc3RvbmUgZm91bmQgYSBzZWNvbmQgSU5BRERSX05PTkUgcHJvYmxlbSB3aGVyZSB3ZSB1c2VkIGxvbmcKICBpbnRlYWQgb2YgaW5fYWRkcl90IHdoaWNoIGNhdXNlZCA2NGJpdCBwcm9ibGVtb3MuIFdlIHJlYWxseSBzaG91bGRuJ3QgZGVmaW5lCiAgdGhhdCBvbiB0d28gZGlmZmVyZW50IHBsYWNlcy4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwMikKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgcHJvYmxlbSBpbiBob3cgSFRUUCByZXF1ZXN0cyB3ZXJlIHNlbnQgaWYgdGhlCiAgcmVxdWVzdCBjb3VsZG4ndCBiZSBzZW50IGFsbCBhdCBvbmNlLgoKLSBFbWlsIGZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBiYWQgY29ubmVjdGlvbiB0aW1lb3V0IGNvbXBhcmlzb24gdGhhdCBtYWRlIGN1cmwKICB1c2UgdGhlIGxvbmdlc3Qgb2YgY29ubmVjdC10aW1lb3V0IGFuZCB0aW1vdXQgYXMgYSB0aW1lb3V0IHZhbHVlLCBpbnN0ZWFkIG9mCiAgdGhlIHNob3J0ZXN0IGFzIGl0IHdhcyBzdXBwb3NlZCB0byEKCi0gQXJvbiBSb2JlcnRzIHByb3ZpZGVkIHVwZGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgTERBUCBVUkwgc3ludGF4IHRvIGdvIGludG8KICB0aGUgbWFudWFsIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvbGQgcmVmZXJlbmNlcy4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwMikKLSBQaGlsaXAgR2xhZHN0b25lIHBvaW50ZWQgb3V0IHR3byBtaXNzaW5nIGluY2x1ZGUgZmlsZXMgdGhhdCBtYWRlIGN1cmwgY29yZQogIGR1bXAgb24gNjRiaXQgYXJjaGl0ZWN0dXJlcy4gV2UgbmVlZCB0byBwYXkgbW9yZSBhdHRlbnRpb24gb24gdGhlc2UgZGV0YWlscy4KICBJdCBpcyAqbGV0aGFsKiB0byBmb3IgZXhhbXBsZSBmb3JnZXQgdGhlIG1hbGxvYygpIHByb3RvdHlwZSwgYXMgJ2ludCcgaXMKICAzMmJpdCBhbmQgbWFsbG9jKCkgbXVzdCByZXR1cm4gYSA2NGJpdCBwb2ludGVyIG9uIHRoZXNlIHBsYXRmb3Jtcy4KCi0gR2lhc2xhcyBHZW9yZ2lvcyBmaXhlZCBhIHByb2JsZW0gd2l0aCBIb3N0OiBoZWFkZXJzIG9uIHJlcGVhdGVkIHJlcXVlc3RzIG9uCiAgdGhlIHNhbWUgaGFuZGxlIHVzaW5nIGEgcHJveHkuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMikKLSBIYW5ubyBMLiBLcmFuemhvZmYgYWNjdXJhdGVseSBmb3VuZCBvdXQgdGhhdCBkaXNhYmxpbmcgdGhlIEV4cGVjdDogaGVhZGVyCiAgd2hlbiBkb2luZyBtdWx0aXBhcnQgZm9ybXBvc3RzIGRpZG4ndCB3b3JrIHZlcnkgd2VsbC4gSXQgZGlzYWJsZWQgb3RoZXIKICBwYXJ0cyBvZiB0aGUgcmVxdWVzdCBoZWFkZXIgdG9vLCByZXN1bHRpbmcgaW4gYSBicm9rZW4gaGVhZGVyLiBXaGVuIEkgZml4ZWQKICB0aGlzLCBJIGFsc28gbm90aWNlZCB0aGF0IHRoZSBDb250ZW50LVR5cGUgd2Fzbid0IHBvc3NpYmxlIHRvIGRpc2FibGUuIEl0IGlzCiAgbm93LCBldmVuIHRob3VnaCBpdCBwcm9iYWJseSBpcyByZWFsbHkgc3R1cGlkIHRvIHRyeSB0byBkbyB0aGlzIChiZWNhdXNlIG9mCiAgdGhlIGJvdW5kYXJ5IHN0cmluZyB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXIsCiAgdXNlZCBhcyBmb3JtIHBhcnQgc2VwYXJhdG9yLikKCkRhbmllbCAoNyBGZWJydWFyeSAyMDAyKQotIEkgbW92ZWQgdGhlIGNvbmZpZyouaCBmaWxlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeSB0byB0aGUgbGliLyBkaXJlY3RvcnkuCgotIEkndmUgYWRkZWQgdGhlIG5ldyB0ZXN0IHN1aXRlIEhUVFAgc2VydmVyIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSwgSXQgc2VlbXMgdG8KICB3b3JrIHByZXR0eSBnb29kIG5vdywgYnV0IHdlIG11c3QgbWFrZSBpdCBnZXQgdXNlZCBieSB0aGUgdGVzdCBzY3JpcHRzCiAgcHJvcGVybHkgYW5kIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBjb21waWxlcywgYnVpbGRzIGFuZCBydW5zIG9uCiAgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcy4KClZlcnNpb24gNy45LjUtcHJlMQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDIpCi0gTWlrbG9zIE5lbWV0aCBwcm92aWRlZCB1cGRhdGVkIHdpbmRvd3MgbWFrZWZpbGVzIGFuZCBJTlNUQUxMIGRvY3MuCgotIE1yIExhcnJ5IEZhaG5vZSBmb3VuZCBhIHByb2JsZW0gd2l0aCBmb3JtcG9zdHMgYW5kIEkgbWFuYWdlZCB0byB0cmFjayBkb3duCiAgYW5kIHBhdGNoIHRoaXMgYnVnLiBUaGlzIHdhcyBhY3R1YWxseSB0d28gYnVncywgYXMgdGhlIHBvc3RlZCBzaXplIHdhcyBhbHNvCiAgc2FpZCB0byBiZSB0d28gYnl0ZXMgdG9vIGxhcmdlLgoKLSBCcmVudCBCZWFyZHNsZXkgZm91bmQgb3V0IGFuZCBicm91Z2h0IGEgY29ycmVjdGlvbiBmb3IgdGhlCiAgQ1VSTElORk9fQ09OVEVOVF9UWVBFIHBhcnNlciB0aGF0IHdhcyBvZmYgb25lIGJ5dGUuIFRoaXMgd2FzIG15IGZhdWx0LCBJCiAgYWNjaWRlbnRhbHkgYnJva2UgR2lhc2xhcyBHZW9yZ2lvcycgcGF0Y2guCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIGZvdW5kIHlldCBhbm90aGVyIFNTTCBkb3dubG9hZCBwcm9ibGVtLgoKVmVyc2lvbiA3LjkuNAoKLSBubyBjaGFuZ2VzIHNpbmNlIHByZS1yZWxlYXNlCgpWZXJzaW9uIDcuOS40LXByZTIKCkRhbmllbCAoMyBGZWJydWFyeSAyMDAyKQotIEVyaWMgTWVsdmlsbGUgcHJvdmlkZWQgYSBmZXcgc3BlbGxpbmcgY29ycmVjdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDEgRmVicnVhcnkgMjAwMikKLSBBbmRyZWFzIERhbW0gY29ycmVjdGVkIHRoZSB1bmNvbmRpdGlvbmFsIHVzZSBvZiBnbXRpbWUoKSBpbiBnZXRkYXRlLCBpdCBub3cKICB1c2VzIGdtdGltZV9yKCkgb24gYWxsIGhvc3RzIHRoYXQgaGF2ZSBpdC4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAyKQotIEFuIGFub255bW91cyBidWcgcmVwb3J0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBETlMgY2FjaGluZyB3aGljaCBtYWRlIGl0CiAgc29tZXRpbWVzIGFsbG9jYXRlIG9uZSBieXRlIHRvbyBsaXR0bGUgdG8gc3RvcmUgdGhlIGNhY2hlIGVudHJ5IGluLiBUaGlzCiAgaGFwcGVuZWQgd2hlbiB0aGUgcG9ydCBudW1iZXIgc3RhcnRlZCB3aXRoIDEhCgotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbXByb3ZlcyB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY29uZmlndXJlCiAgY2hlY2sgb24gSFAtVVggMTEuMDAuCgpWZXJzaW9uIDcuOS40LXByZTEKCkRhbmllbCAoMzAgSmFudWFyeSAyMDAyKQotIEdlb3JnIEhvcm4gZm91bmQgYW5vdGhlciB3YXkgdGhlIFNTTCByZWFkaW5nIGZhaWxlZCBkdWUgdG8gdGhlIG5vbi1ibG9ja2luZwogIHN0YXRlIG9mIHRoZSBzb2NrZXRzISBJIGZpeGVkLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDIpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyBub3cgc2VuZCB0aGUgZnVsbCByZXF1ZXN0IHByb3Blcmx5LCBpbmNsdWRpbmcgdGhlIENSTEYuCiAgVGhleSB3ZXJlIHByZXZpb3VzbHkgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSBwb3N0IGRhdGEuCgotIFRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGJ1Z2dlZC4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCB0aGF0IHdlIHNlZWQgU1NMIG9uIGV2ZXJ5IGNvbm5lY3QsIHdoaWNoIGlzIGEgdGltZS0KICBjb25zdW1pbmcgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHRvIGRvIG9uY2UuIFdlIHBhdGNoZWQKICBsaWJjdXJsIHRvIG5vdyBvbmx5IHNlZWQgb24gdGhlIGZpcnN0IGNvbm5lY3Qgd2hlbiB1bnNlZWRlZC4gVGhlIHNlZWRlZAogIHN0YXR1cyBpcyBnbG9iYWwgc28gaXQnbGwgbm93IG9ubHkgaGFwcGVuIG9uY2UgZHVyaW5nIGEgcHJvZ3JhbSdzIGxpZmUgdGltZS4KCiAgSWYgdGhlIHJhbmRvbV9maWxlIG9yIGVnZHNvY2tldCBpcyBzZXQsIHRoZSBzZWVkIHdpbGwgYmUgcmUtbWFkZSB0aG91Z2guCgotIEdpYXNsYXMgR2Vvcmdpb3MgaW50cm9kdWNlZCBDVVJMSU5GT19DT05URU5UX1RZUEUgdGhhdCBsZXRzCiAgY3VybF9lYXN5X2dldGluZm8oKSByZWFkIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgcHJldmlvdXMgcmVxdWVzdC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDAyKQotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHdheSB0byBjcmFzaCBjdXJsIGFuZCBhZnRlciBtdWNoIGRlYnVnZ2luZywgaXQKICB0dXJuZWQgb3V0IGl0IHdhcyBhIElQdjQtbGludXggb25seSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy45LjMgcmVsYXRlZCB0bwogIG5hbWUgcmVzb2x2aW5nLgoKLSBBbmRyZWFzIERhbW0gcG9zdGVkIGEgaHVnZSBwYXRjaCB0aGF0IG1hZGUgdGhlIGN1cmxfZ2V0ZGF0ZSgpIGZ1bmN0aW9uIGZ1bGx5CiAgcmVlbnRyYW50IQoKLSBTdGV2ZSBNYXJ4IHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkbid0IG1peCBDVVJMT1BUX0NVU1RPTVJFUVVFU1Qgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUy4gWW91IGNhbiBub3chCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMikKLSBLcmlzaG5lbmR1IE1hanVtZGFyIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGhlYWRlciBsZW5ndGggY291bnRlciB3YXMgbm90IHJlc2V0CiAgYmV0d2VlbiBtdWx0aXBsZSByZXF1ZXN0cyBvbiB0aGUgc2FtZSBoYW5kbGUuCgotIFBlZHJvIE5ldmVzIHJpZ2h0ZnVsbHkgcXVlc3Rpb25lZCB3aHkgY3VybCBhbHdheXMgYXBwZW5kIFxyXG4gdG8gdGhlIGRhdGEKICB0aGF0IGlzIHNlbnQgaW4gSFRUUCBQT1NUIHJlcXVlc3RzLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGJyb2tlIHRoZSB0ZXN0IHN1aXRlCiAgYXMgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgaXMgbGFtZSBlbm91Z2ggbm90IHRvIGRlYWwgd2l0aCB0aGlzLi4uIDotTwoKLSBGb2xsb3dpbmcgTG9jYXRpb246IGhlYWRlcnMgd2hlbiB0aGUgY29ubmVjdGlvbiBkaWRuJ3QgY2xvc2UgZGlkbid0IHdvcmsgYXMKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzdG9wIHJlYWRpbmcuIFRoaXMgcHJvYmxlbSB3YXMgYWRkZWQgaW4gNy45LjMgZHVlIHRvCiAgdGhlIHJlc3RydWN0dXJlZCBpbnRlcm5hbHMuICdGcmFuaycgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB0aGlzLgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCB2ZXJ5IHF1aWNrbHkgc3BvdHRlZCB0aGF0IHdlIHdyb25nbHkgaW5zdGFsbGVkIHRoZSBleGFtcGxlCiAgcHJvZ3JhbXMgdGhhdCB3ZXJlIGJ1aWx0IGluIHRoZSBtdWx0aSBkaXJlY3RvcnksIHdoZW4gJ21ha2UgaW5zdGFsbCcgd2FzCiAgdXNlZC4gOi0vCgpWZXJzaW9uIDcuOS4zCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMikKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIGEgcGVyc2lzdGFuY3kgcHJvYmxlbSB3aGVuIGRvaW5nIEhUVFAgSEVBRCwgdGhhdCBtYWRlCiAgY3VybCAiaGFuZyIgdW50aWwgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUgc2VydmVyLiBUaGlzIHByb2JsZW0gaGFzCiAgYmVlbiBpbnRyb2R1Y2VkIGluIDcuOS4zIGR1ZSB0byBpbnRlcm5hbCByZXdyaXRlcywgdGhpcyB3YXMgbm90IHByZXNlbnQgaW4KICA3LjkuMi4KClZlcnNpb24gNy45LjMtcHJlNAoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDIpCi0gQW50b25pbyBmaWxlZCBidWcgcmVwb3J0ICM1MDU1MTQgYW5kIHByb3ZpZGVkIGEgZml4ISBXaGVuIGRvaW5nIG11bHRpcGFydAogIGZvcm1wb3N0cywgbGliY3VybCB3b3VsZCBpbmNsdWRlIGFuIGVycm9yIHRleHQgaW4gdGhlIGFjdHVhbCBwb3N0IGlmIGEKICBzcGVjaWZpZWQgZmlsZSB3YXNuJ3QgZm91bmQuIFRoaXMgaXMgbm90IGxpYmN1cmwncyBqb2IuIEluc3RlYWQgd2UgYWRkIGFuCiAgZW1wdHkgcGFydC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDAyKQotIFBsYXllZCBhcm91bmQgd2l0aCBzdHJpY3RlciBjb21waWxlciB3YXJuaW5ncyBmb3IgZ2NjICh3aGVuIC4vY29uZmlndXJlCiAgLS1lbmFibGUtZGVidWcgaXMgdXNlZCkgYW5kIGNoYW5nZWQgc29tZSBtaW5vciB0aGluZ3MgdG8gc3RvcCB0aGUgd2FybmluZ3MuCgotIENvbW1lbnRlZCBvdXQgdGhlICdsb25nIGxvbmcnIGFuZCAnbG9uZyBkb3VibGUnIGNoZWNrcyBpbiBjb25maWd1cmUuaW4sIGFzCiAgd2UgZG9uJ3QgY3VycmVudGx5IHVzZSB0aGVtIGFueXdheSBhbmQgdGhlIGNvZGUgaW4gbGliL21wcmludGYuYyB0aGF0IHVzZQogIHRoZW0gY2F1c2VzIHdhcm5pbmdzLgoKLSBTYXVsIEdvb2QgYW5kIGpvbmF0YW4gcG9pbnRlZCBvdXQgTWFjIE9TIFggYnVpbGQgcHJvYmxlbXMgd2l0aCBwcmUzIGFuZCBob3cKICB0byBjb3JyZWN0IHRoZW0uIFR3byBjb21waWxlciB3YXJuaW5ncyB3ZXJlIHJlbW92ZWQgYXMgd2VsbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0d28gbWlub3IgbWluZ3czMiBidWlsZGluZyBwcm9ibGVtcy4KClZlcnNpb24gNy45LjMtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDIpCi0gZG9jcy9saWJjdXJsLXRoZS1ndWlkZSBpcyBhIG5ldyB0dXRvcmlhbCBmb3Igb3VyIGxpYmN1cmwgcHJvZ3JhbW1pbmcKICBmcmllbmRzLgoKLSBSaWNoYXJkIEFyY2hlciBicm91Z2h0IGJhY2sgdGhlIGFiaWxpdHkgdG8gY29tcGlsZSBhbmQgYnVpbGQgd2l0aCBPcGVuU1NMCiAgdmVyc2lvbnMgYmVmb3JlIDAuOS41LgogIFtodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9MTAwOTc2JmFpZD01MDQxNjMmZ3JvdXBfaWQ9OTc2XQoKLSBUaGUgRE5TIGNhY2hlIGNvZGUgZGlkbid0IHRha2UgdGhlIHBvcnQgbnVtYmVyIGludG8gYWNjb3VudCwgd2hpY2ggbWFkZSBpdAogIHdvcmsgcmF0aGVyIGJhZCBvbiBJUHY2LWVuYWJsZWQgaG9zdHMgKGVzcGVjaWFsbHkgd2hlbiBkb2luZyBwYXNzaXZlCiAgRlRQKS4gU3RlcmxpbmcgZml4ZWQgaXQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwMikKLSBHZW9yZyBIb3JuIGNvdWxkIG1ha2UgYSB0cmFuc2ZlciB0aW1lLW91dCB3aXRob3V0IGVycm9yIHRleHQuIEkgZm91bmQgaXQgYW5kCiAgY29ycmVjdGVkIGl0LgoKLSBTU0wgd3JpdGVzIGRpZG4ndCB3b3JrLCB0aGV5IHJldHVybiBhbiB1bmluaXRpYWxpemVkIHZhbHVlIHRoYXQgY2F1c2VkCiAgaGF2b2MgYWxsIG92ZXIuIEdlb3JnIEhvcm4gZXhwZXJpZW5jZWQgdGhpcy4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjdXJsX3ZlcnNpb24oKSBmdW5jdGlvbiB0byB1c2UgdGhlIHByb3BlciBPcGVuU1NMCiAgZnVuY3Rpb24gZm9yIHZlcnNpb24gaW5mb3JtYXRpb24uIFRoaXMgd2F5LCBjdXJsIHdpbGwgcmVwb3J0IHRoZSB2ZXJzaW9uIG9mCiAgdGhlIFNTTCBsaWJyYXJ5IGFjdHVhbGx5IHJ1bm5pbmcgcmlnaHQgbm93LCBub3QgdGhlIG9uZSB0aGF0IGhhZCBpdHMgaGVhZGVycwogIGluc3RhbGxlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LiBNYWlubHkgaW50ZXJzdGluZyB3aGVuIHJ1bm5pbmcgd2l0aCBzaGFyZWQKICBPcGVuU1NMIGxpYnJhcmllcy4KClZlcnNpb24gNy45LjMtcHJlMgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gTW9maWVkIHRoZSBtYWluIHRyYW5zZmVyIGxvb3AgYW5kIHJlbGF0ZWQgc3R1ZmYgdG8gZGVhbCB3aXRoIG5vbi1ibG9ja2luZwogIHNvY2tldHMgaW4gdGhlIHVwbG9hZCBzZWN0aW9uLiBXaGlsZSBkb2luZyB0aGlzLCBJJ3ZlIG5vdyBzZXBhcmF0ZWQgdGhlCiAgY29ubmVjdGlvbiBvcmllbnRlZCBidWZmZXJzIHRvIGhhdmUgb25lIGZvciBkb3dubG9hZHMgYW5kIG9uZSBmb3IgdXBsb2FkcwogIChhcyB0d28gY2FuIGhhcHBlbiBzaW11bHRhbmVvdXNseSkuIEkgYWxzbyBzaHJ1bmsgdGhlIGJ1ZmZlcnMgdG8gMjBLCiAgZWFjaC4gQXMgd2UgaGF2ZSBhIHNjcmF0Y2ggYnVmZmVyIHR3aWNlIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYnVmZmVyLCB3ZQogIGFycml2ZWQgYXQgODBLIGZvciBidWZmZXJzIGNvbXBhcmVkIHdpdGggdGhlIHByZXZpb3VzIDE1MEsuCgotIEFkZGVkIHRoZSAtLWNjIG9wdGlvbiB0byBjdXJsLWNvbmZpZyBjb21tYW5kIGFzIGl0IGVuYWJsZXMgc28gdmVyeSBjb29sCiAgb25lLWxpbmVycy4gSGF2ZSBhIGdvIGEgdGhpcyBvbmUsIGJ1aWxkaW5nIHRoZSBzaW1wbGUuYyBleGFtcGxlOgoKICAgICAgICAkIGBjdXJsLWNvbmZpZyAtLWNjIC0tY2ZsYWdzIC0tbGlic2AgLW8gZXhhbXBsZSBzaW1wbGUuYwoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDIpCi0gSSBtYWRlIGFsbCBzb2NrZXQgcmVhZHMgKHJlY3YpIGhhbmRsZSBFV09VTERCTE9DSy4gSSBob3BlIG5pY2VseS4gTm93IHdlCiAgb25seSBuZWVkIHRvIGFkZHJlc3MgYWxsIHdyaXRlcyAoc2VuZCkgdG9vIGFuZCB0aGVuIEknbSByZWFkeSBmb3IgYW5vdGhlcgogIHByZS1yZWxlYXNlLi4uCgotIFN0b25lZCBFbGlwb3QgcGF0Y2hlZCB0aGUgaW5fYWRkcl90IGNvbmZpZ3VyZSB0ZXN0IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIgb24KICBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoOSBKYW51YXJ5IDIwMDIpCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IGZpbGxpbmcgdXAgY3VybCdzIFNTTCBzZXNzaW9uIGNhY2hlIGNhdXNlZCBhCiAgY3Jhc2ghCgotIFBvc3RlZCB0aGUgY3VybCBxdWVzdGlvbm5haXJlIG9uIHRoZSB3ZWIgc2l0ZS4gSWYgeW91IGhhdmVuJ3QgcG9zdGVkIHlvdXIKICBvcGluaW9ucyB0aGVyZSB5ZXQsIGdvIHRoZXJlIGFuZCBkbyBpdCBub3cgd2hpbGUgaXQgaXMgc3RpbGwgdGhlcmU6CgogICAgICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvcS8KCi0gR2VvcmcgSG9ybiBxdWlja2x5IGZvdW5kIG91dCB0aGF0IHRoZSBTU0wgcmVhZGluZyBubyBsb25nZXIgd29ya2VkIGFzCiAgc3VwcG9zZWQgc2luY2UgdGhlIHN3aXRjaCB0byBub24tYmxvY2tpbmcgc29ja2V0cy4gSSd2ZSBtYWRlIGEgcXVpY2sgcGF0Y2gKICAoZm9yIHJlYWRpbmcgb25seSkgYnV0IHdlIHNob3VsZCBpbXByb3ZlIGl0IGV2ZW4gZnVydGhlci4KClZlcnNpb24gNy45LjMtcHJlMQoKRGFuaWVsICg3IEphbnVhcnkgMjAwMikKLSBJIG1hZGUgdGhlICdib29sJyB0eXBlZGVmIHVzZSBhbiAidW5zaWduZWQgY2hhciIuIEl0IG1ha2VzIGl0IHRoZSBzYW1lIG9uCiAgYWxsIHBsYXRmb3Jtcywgbm8gbWF0dGVyIHdoYXQgdGhlIHBsYXRmb3JtIHRoaW5rcyB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yCiAgY2hhciBpcy4gVGhpcyB3YXMgbm90aWNlZCBzaW5jZSB3ZSBtYWRlIGEgc2lsbHkgY29tcGFyaXNvbiBpbnZvbHZpbmcgc3VjaCBhCiAgYm9vbCB2YXJpYWJsZSwgYW5kIG9ubHkgb25lIGNvbXBpbGVyL3BsYXRmb3JtIGNvbWJpbmF0aW9uIChvbiBEZWJpYW4gTGludXgpCiAgY29tcGxhaW5lZCBhYm91dCBpdCAodGhhdCBoYXBwZW5lZCB0byBoYXZlIGl0cyBjaGFyIHVuc2lnbmVkIGJ5IGRlZmF1bHQpLgoKLSBCdWcgcmVwb3J0ICM0OTUyOTAgaWRlbnRpZmllZCBhIGNvb2tpZSBwYXJzaW5nIHByb2JsZW0gdGhhdCB3YXMgY29ycmVjdGVkLgogIFdoZW4gYSBTZXQtQ29va2llOiBsaW5lIGlzIHJlY2VpdmVkIHdpdGhvdXQgYSB0cmFpbGluZyBzZW1pY29sb24sIGxpYmN1cmwKICBkaWRuJ3QgcmVhZCB0aGUgbGFzdCAibmFtZT12YWx1ZSIgcGFpciBvZiB0aGUgbGluZSwgbGVhZGluZyB0byBjb25mdXNpb25zLi4uCgotIFN0ZXJsaW5nIGNvbW1pdHRlZCBoaXMgdXBkYXRlZCBETlMgY2FjaGUgY29kZS4KCi0gSSB3b3JrZWQgd2l0aCBHZW9yZyBIb3JuIGFuZCBjb21tZW50cyBmcm9tIEf2dHogQmFiaW4tRWJlbGwgYW5kIHN3aXRjaGVkCiAgY3VybCdzIHNvY2tldCBvcGVyYXRpb25zIGNvbXBsZXRlbHkgb3ZlciB0byBub24tYmxvY2tpbmcgZm9yIHRoZSBlbnRpcmUKICBvcGVyYXRpb24gKHByZXZpb3VzbHkgd2UgdXNlZCBub24tYmxvY2tpbmcgb25seSBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2UpLgogIFdlIGhhZCB0byBkbyB0aGlzIHRvIG1ha2UgdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlIHRpbWVvdXQgcHJvcGVybHkgd2l0aG91dAogIHRoZSB1c2Ugb2Ygc2lnbmFscy4gQSBsaXR0bGUgZXh0cmEgY29kZSB0byBkZWFsIHdpdGggdGhpcyB3YXMgYWRkZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBzbGlnaHRseSBvYnNjdXJlIGNvb2tpZSBlbmdpbmUgZmxhdy4KCi0gUGV0ZSBTdSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0IEhUVFAgY29kZSAyMDQgYXMgaXQgc2hvdWxkLgogIDIwNC1yZXBsaWVzIG5ldmVyIHByb3ZpZGVzIGEgcmVzcG9uc2UtYm9keS4gVGhpcyByZXN1bHRlZCBpbiBiYWQgcGVyc2lzdGFudAogIGJlaGF2aW9yIHdoZW4gMjA0IHdhcyByZWNlaXZlZC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDIpCi0gU00gdXBkYXRlZCB0aGUgVkMrKyBsaWJyYXJ5IE1ha2VmaWxlcyBmb3IgdGhlIG5ldyBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAyKQotIEkgZGlzY292ZXJlZCB0aGF0IHdlIHdyb25nbHkgdXNlZCBpbmV0X250b2EoKSAoaW5zdGVhZCBvZiBpbmV0X250b2FfcigpIGluCiAgdHdvIHBsYWNlcyBpbiB0aGUgc291cmNlIGNvZGUpLiBPbmUgaGFwcGVuZWQgd2l0aCBWRVJCT1NFIHNldCBvbiBjb25uZWN0cywKICBhbmQgdGhlIG90aGVyIHdoZW4gVkVSQk9TRSB3YXMgb24gYW5kIGtyYjQgb3ZlciBuYXQgd2FzIHVzZWQuLi4gSSBob25lc3RseQogIGRvbid0IHRoaW5rIGFueW9uZSBoYXMgc3VmZmVyZWQgZnJvbSB0aGVzZSBtaXN0YWtlcy4KCi0gSSByZXBsYWNlZCBhIGxvdCBvZiBzaWxseSBvY2N1cmFuY2VzIG9mIHByaW50ZigpIHRvIGluc3RlYWQgdXNlIHRoZSBtb3JlCiAgYXBwcm9wcmlhdGUgQ3VybF9pbmZvZigpIG9yIEN1cmxfZmFpbGYoKS4gVGhlIGtyYjQgYW5kIHRlbG5ldCBjb2RlIHdlcmUKICBhZmZlY3RlZC4KCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIGZldyBtb3JlIHByb2JsZW1zIHdpdGggNjQtYml0IGFyY2hzICh0aGUgNjQtYml0CiAgc3BhcmMgb24gc29sYXJpcyA4KS4KCi0gQWZ0ZXIgZGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIFJhb3VsIENyaWRsaWcsIEkganVzdCBtYWRlIEZUUAogIHJlc3BvbnNlIGxpbmVzIGdldCBwYXNzZWQgdG8gdGhlIGhlYWRlciBjYWxsYmFjayBpZiBzdWNoIGEgb25lIGlzCiAgcmVnaXN0ZXJlZC4gSXQnbGwgbWFrZSBpdCBwb3NzaWJsZSBmb3IgYW55IGFwcGxpY2F0aW9uIHRvIGdldCBhbGwgdGhlCiAgcmVzcG9uc2VzIGFuIEZUUCBzZXJ2ZXIgc2VuZHMgdG8gbGliY3VybC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDIpCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgYSBmZXcgYnVja2V0cyBvZiBjb2RlLiBOb3csIGxpYmN1cmwgd2lsbAogIGF1dG9tYXRpY2FsbHkgY2FjaGUgRE5TIGxvb2t1cHMgYW5kIHJlLXVzZSB0aGUgcHJldmlvdXMgcmVzdWx0cyBmaXJzdCBpZiBhbnkKICBzdWNoIGlzIGF2YWlsYWJsZS4gSXQgZ3JlYXRseSBpbXByb3ZlcyBzcGVlZCB3aGVuIGRvaW5nIG1hbnkgcmVwZWF0ZWQKICBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGhvc3QuCgotIEFzIHRoZSB0ZXN0IGNhc2UgdXNlcyAtLWluY2x1ZGUgYW5kIHRoZW4gLS1oZWFkLCBJIGhhZCB0byBtb2RpZnkgc3JjL21haW4uYwogIHRvIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgdGhhbiBwcmV2aW91c2x5LiBXaGVuIGRvbmUsIHdlCiAgaGF2ZSAxMDAlIGdvb2QgdGVzdHMgYWdhaW4gaW4gdGhlIG1haW4gYnJhbmNoLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwMikKLSBNYWRlIHRlc3QgY2FzZSAyNSBydW4gYWdhaW4gaW4gdGhlIG11bHRpLWRldiBicmFuY2guIEJ1dCBpdCBzZWVtcyB0aGF0IHRoZQogIGNoYW5nZXMgZG9uZSBvbiBkZWMtMjAgbWFkZSB0ZXN0IGNhc2UgMTA0IGNlYXNlIHRvIHdvcmsgKGluIGJvdGggYnJhbmNoZXMpLgoKLSBQaGlsaXAgR2xhZHN0b25lIHBvaW50ZWQgb3V0IGEgZmV3IHBvcnRhYmlsaXR5IHByb2JsZW1zIGluIHRoZSBzb3VyY2UgY29kZQogIHRoYXQgZGlkbid0IGNvbXBpbGUgb24gNjQtYml0IHNwYXJjcyB1c2luZyBTdW4ncyBuYXRpdmUgY29tcGlsZXIuCkRhbmllbCAoMjAgRGVjZW1iZXIgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBjYXVnaHQgYW4gdW5wbGVhc2VudCAoYnV0IGhhcmQtdG8tZmluZCkgYnVnIHRoYXQgY291bGQgY2F1c2UKICBsaWJjdXJsIHRvIGhhbmcgb24gdHJhbnNmZXJzIG92ZXIgcHJveHksIHdoZW4gdGhlIHByb3h5IHdhcyBzcGVjaWZpZWQgd2l0aAogIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIQoKLSBBZGRlZCBjb2RlIHRvIG1ha2UgZnRwIG9wZXJhdGlvbnMgdHJlYXQgdGhlIE5PX0JPRFkgYW5kIEhFQURFUlMgb3B0aW9ucwogIGJldHRlcjoKCiAgIE5PX0JPRFkgc2V0IFRSVUUgYW5kIEhFQURFUlMgc2V0IFRSVUU6CiAgICBSZXR1cm4gYSBzZXQgb2YgaGVhZGVycyB3aXRoIGZpbGUgaW5mbwoKICAgTk9fQk9EWSBzZXQgRkFMU0UKICAgIFRyYW5zZmVyIGRhdGEgYXMgdXN1YWwsIEhFQURFUlMgaXMgaWdub3JlZAoKICAgTk9fQk9EWSBzZXQgVFJVRSBhbmQgSEVBREVSUyBzZXQgRkFMU0UKICAgIERvbid0IHRyYW5zZmVyIGFueSBkYXRhLCBkb24ndCByZXR1cm4gYW55IGhlYWRlcnMuIEp1c3QgcGVyZm9ybSB0aGUgc2V0CiAgICBvZiBGVFAgY29tbWFuZHMuCgpEYW5pZWwgKDE3IERlY2VtYmVyIDIwMDEpCi0gR/Z0eiBCYWJpbi1FYmVsbCBkb3ZlIGludG8gdGhlIGRhcmsgZHVuZ2VvbnMgb2YgdGhlIE9wZW5TU0wgRU5HSU5FIHN0dWZmIGFuZAogIG1hZGUgbGliY3VybCBzdXBwb3J0IGl0ISBUaGlzIGFsbG93cyBsaWJjdXJsIHRvIGRvIFNTTCBjb25uZWN0aW9ucyB3aXRoIHRoZQogIHByaXZhdGUga2V5IHN0b3JlZCBpbiBleHRlcm5hbCBoYXJkd2FyZS4KCiAgVG8gbWFrZSB0aGlzIGdvb2QsIGhlIGhhZCB0byBhZGQgYSBidW5jaCBvZiBuZXcgbGlicmFyeSBvcHRpb25zIHRoYXQnbGwgYmUKICB1c2VmdWwgdG8gb3RoZXJzIGFzIHdlbGw6CgogICBDVVJMT1BUX1NTTENFUlRUWVBFICBzZXQgU1NMIGNlcnQgdHlwZSAoUEVNL0RFUikKICAgQ1VSTE9QVF9TU0xLRVkgICAgICAgc2V0IFNTTCBwcml2YXRlIGtleSAoZmlsZSkKICAgQ1VSTE9QVF9TU0xLRVlUWVBFOiAgc2V0IFNTTCBrZXkgdHlwZSAoUEVNL0RFUi9FTkcpCiAgIENVUkxPUFRfU1NMS0VZUEFTU1dEOiBzZXQgdGhlIHBhc3NwaHJhc2UgZm9yIHlvdXIgcHJpdmF0ZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1VSTE9QVF9TU0xDRVJUUEFTU1dEIGlzIGFuIGFsaWFzKQogICBDVVJMT1BUX1NTTEVOR0lORTogICBzZXQgdGhlIG5hbWUgb2YgdGhlIGNyeXB0byBlbmdpbmUKICAgICAgICAgICAgICAgICAgICAgICAgKHJldHVybnMgQ1VSTEVfU1NMX0VOR0lORV9OT1RGT1VORCBvbiBlcnJvcikKICAgQ1VSTE9QVF9TU0xFTkdJTkVfREVGQVVMVDogc2V0IHRoZSBkZWZhdWx0IGVuZ2luZQoKICBUaGVyZSBhcmUgdHdvIG5ldyBmYWlsdXJlIGNvZGVzOgoKICAgQ1VSTEVfU1NMX0VOR0lORV9OT1RGT1VORAogICBDVVJMRV9TU0xfRU5HSU5FX1NFVEZBSUxFRAoKRGFuaWVsICgxNCBEZWNlbWJlciAyMDAxKQotIFdlIGhhdmUgImJyYW5jaGVkIiB0aGUgc291cmNlLXRyZWUgYXQgYSBmZXcgcGxhY2VzLiBDaGVja291dCB0aGUgQ1ZTIHNvdXJjZXMKICB3aXRoIHRoZSAnbXVsdGktZGV2JyBsYWJlbCB0byBnZXQgdGhlIGxhdGVzdCBtdWx0aSBpbnRlcmZhY2UgZGV2ZWxvcG1lbnQKICB0cmVlLiBUaGUgaWRlYSBpcyB0byBvbmx5IGJyYW5jaCBhZmZlY3RlZCBmaWxlcyBhbmQgdG8gcmVzdHJpY3QgdGhlIGJyYW5jaAogIHRvIHRoZSB2OCBtdWx0aSBpbnRlcmZhY2UgZGV2ZWxvcG1lbnQgb25seS4KCiAgKk5PVEUqIHRoYXQgaWYgd2UgZ2V0IGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIGV0Yywgd2UgbWlnaHQgbmVlZCB0byBhcHBseQogIHRoZW0gaW4gYm90aCBicmFuY2hlcyEKCiAgVGhlIG11bHRpLWRldiBicmFuY2ggaXMgd2hhdCB3ZSBhcmUgZ29ubmEgdXNlIGFzIG1haW4gYnJhbmNoIGluIHRoZSBmdXR1cmUKICBpZiBpdCB0dXJucyBvdXQgc3VjY2Vzc2Z1bC4gVGh1cywgd2UgbXVzdCBtYWludGFpbiBib3RoIG5vdyBpbiBjYXNlIHdlIG5lZWQKICB0aGVtLiBUaGUgY3VycmVudCBtYWluIGJyYW5jaCB3aWxsIGJlIHVzZWQgaWYgd2Ugd2FudCB0byByZWxlYXNlIGEgNy45LjMgb3IKICBwZXJoYXBzIGEgNy4xMCByZWxlYXNlIGJlZm9yZSB2ZXJzaW9uIDguIFdoaWNoIGlzIHZlcnkgbGlrZWx5LgoKLSBNYXJjdXMgV2Vic3RlciBwcm92aWRlZCBjb2RlIGZvciB0aGUgbmV3IENVUkxGT1JNX0NPTlRFTlRIRUFERVIgb3B0aW9uIGZvcgogIGN1cmxfZm9ybWFkZCgpLCB0aGF0IGxldHMgYW4gYXBwbGljYXRpb24gYWRkIGEgc2V0IG9mIGhlYWRlcnMgZm9yIHRoYXQKICBwYXJ0aWN1bGFyIHBhcnQgaW4gYSBtdWx0aXBhcnQvZm9ybS1wb3N0LiBIZSBhbHNvIHByb3ZpZGVkIGEgc2VjdGlvbiB0byB0aGUKICBtYW4gcGFnZSB0aGF0IGRlc2NyaWJlcyB0aGUgbmV3IG9wdGlvbi4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMSkKLSBCZW4gR3JlZWFyIG1hZGUgbWUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgQ3VybF9mYWlsZigpIHVzYWdlIGludGVybmFsbHkKICB3YXMgYSBiaXQgc2xvcHB5IHdpdGggYWRkaW5nIG5ld2xpbmVzIG9yIG5vdCB0byB0aGUgZXJyb3IgbWVzc2FnZXMuIExldCdzCiAgb25jZSBhbmQgZm9yIGFsbCBzYXkgdGhhdCB0aGV5IGRvIG5vdCBiZWxvbmcgdGhlcmUhCgotIFdoZW4gdXBsb2FkaW5nIGZpbGVzIHdpdGggLVQgdG8gZ2l2ZSBhIGxvY2FsIGZpbGUgbmFtZSwgYW5kIHlvdSBlbmQgdGhlIFVSTAogIHdpdGggYSBzbGFzaCB0byBoYXZlIHRoZSBsb2NhbCBmaWxlIG5hbWUgdXNlZCByZW1vdGUgdG9vLCB3ZSBub3cgbm8gbG9uZ2VyCiAgdXNlIHRoZSBsb2NhbCBkaXJlY3RvcnkgYXMgd2VsbC4gT25seSB0aGUgZmlsZSBwYXJ0IG9mIHRoZSAtVCBmaWxlIG5hbWUKICB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByaWdodCBvZiB0aGUgc2xhc2ggaW4gdGhlIFVSTC4KCkRhbmllbCAoNyBEZWNlbWJlciAyMDAxKQotIE1pY2hhbCBCb25pbm8gcG9pbnRlZCBvdXQgdGhhdCBEaWdpdGFsIFVuaXggZG9lc24ndCBoYXZlIGdtdGltZV9yIHNvIHRoZQogIGxpbmsgZmFpbGVkLiBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBhbmQgY29ycmVjdGVkIHNvdXJjZSBjb2RlLgoKVmVyc2lvbiA3LjkuMgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDEpCi0gSm9uIFRyYXZpcyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCBsaWJjdXJsIGFuZCBDVVJMT1BUX1VQTE9BRCBhbmQgdGhlbgogIG9uIHRoZSBzYW1lIGhhbmRsZSB1c2VkIENVUkxPUFRfSFRUUEdFVCBpdCB3b3VsZCBzdGlsbCBhdHRlbXB0IHRvIHVwbG9hZC4KICBIaXMgc3VnZ2VzdGVkIGZpeCB3YXMgcGVyZmVjdC4KCkRhbmllbCAoNCBEZWNlbWJlciAyMDAxKQotIEluY29ycG9yYXRlZCBtb3JlIG1hY29zIGZpeGVzIGFuZCBhZGRlZCBmb3VyIHNwZWNpZmljIGZpbGVzIGluIGEgbmV3CiAgc3ViZGlyZWN0b3J5IGJlbG93IHNyYy4KCkRhbmllbCAoMyBEZWNlbWJlciAyMDAxKQotIEVyaWMgTGF2aWduZSByZXBvcnRlZCB0d28gcHJvYmxlbXM6CgogIEZpcnN0IG9uZSBpbiB0aGUgY3VybF9zdHJuZXF1YWwoKSBmdW5jdGlvbi4gSSB0aGluayB0aGlzIHByb2JsZW0gaXMgcmF0aGVyCiAgbWFjb3MgOSBzcGVjaWZpYywgYXMgbW9zdCBwbGF0Zm9ybSBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZQogIG9uZSBwcm92aWRlZCBieSBsaWJjdXJsLgoKICBBIHNlY29uZCwgbW9yZSBpbXBvcnRhbnQsIHdhcyBpbiB0aGUgd2F5IHdlIHRha2UgY2FyZSBvZiBGVFAgcmVzcG9uc2VzLiBUaGUKICBjb2RlIHdvdWxkIHJlYWQgYSBsYXJnZSBjaHVuayBvZiBkYXRhIGFuZCBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtcmVzcG9uc2UKICBsaW5lIHdpdGhpbiB0aGF0IGNodW5rLiBXaGVuIGZvdW5kLCBpdCB3b3VsZCBqdXN0IHNraXAgdGhlIHJlc3Qgb2YgdGhlCiAgZGF0YS4gSG93ZXZlciwgd2hlbiB0aGUgbmV0d29yayBjb25uZWN0aW9ucyBhcmUgc3BlY2lhbCwgb3IgcGVyaGFwcyB0aGUKICBzZXJ2ZXIgaXMsIHdlIGNvdWxkIGFjdHVhbGx5IGdldCBtb3JlIHRoYW4gb25lIHJlc3BvbnNlIGluIHRoYXQgY2h1bmsgb2YKICBkYXRhIHNvIHRoYXQgd2hlbiB0aGUgbmV4dCBpbnZva2UgdG8gdGhpcyBmdW5jdGlvbiB3YXMgZG9uZSwgdGhlIHJlc3BvbnNlCiAgaGFkIGFscmVhZHkgYmVlbiByZWFkIGFuZCB0aHJvd24gYXdheS4gTm93LCB3ZSBjYWNoZSB0aGUgZGF0YSBub3QgdXNlZCBpbgogIG9uZSBjYWxsLCBhcyBpdCBjb3VsZCBiZSB1c2VmdWwgaW4gdGhlIHN1YnNlcXVlbnQgY2FsbC4gVGVzdCBjYXNlIDEyNiB3YXMKICBhZGRlZCBhbmQgdGhlIHRlc3QgZnRwIHNlcnZlciBtb2RpZmllZCwgdG8gZXhlcmNpc2UgdGhpcyBwYXJ0aWN1bGFyIGNhc2UuCgpWZXJzaW9uIDcuOS4yLXByZTgKCkRhbmllbCAoMiBEZWNlbWJlciAyMDAxKQotIEJ1ZyByZXBvcnQgIzQ4NzgyNSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiB1c2luZyBhIHByb3h5IGFuZAogIGZvbGxvd2luZyBhIHJlZGlyZWN0aW9uIGZyb20gSFRUUCB0byBIVFRQUy4gbGliY3VybCB0aGVuIHJlLXVzZWQgdGhlIHNhbWUKICBwcm94eSBjb25uZWN0aW9uIGJ1dCB3aXRob3V0IGRvaW5nIGEgcHJvcGVyIEhUVFBTIHJlcXVlc3QuCgotIEZpeGVkIHdpbjMyIGNvbXBpbGluZyBxdWlya3MuCgpWZXJzaW9uIDcuOS4yLXByZTcKCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMSkKLSBEb2N1bWVudGVkIC0tZGlzYWJsZS1lcHN2IGFuZCBDVVJMT1BUX0ZUUF9VU0VfRVBTVi4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMSkKLSBBZGRlZCAtLWRpc2FibGUtZXBzdiBhcyBhbiBvcHRpb24uIFdoZW4gdXNlZCwgY3VybCB3b24ndCBhdHRlbXB0IHRvIHVzZSB0aGUKICBFUFNWIGNvbW1hbmQgd2hlbiBkb2luZyBwYXNzaXZlIEZUUCBkb3dubG9hZHMuIFdyb3RlIGEgdGVzdCBjYXNlIGZvciBpdC4KCi0gRXJpYyBwcm92aWRlZCBhIGZldyBtb3JlIGZpeGVzIGZvciBidWlsZGluZyBvbiBNYWNzLiBIZSBhbHNvIHBvaW50ZWQgb3V0CiAgYSBmbGF3IGluIHRoZSBzaWduYWwgaGFuZGxlciByZXN0b3JhdGlvbiBjb2RlLgoKRGFuaWVsICgyOCBOb3ZlbWJlciAyMDAxKQotIEZpZGRsZWQgd2l0aCBzb21lIFRydTY0IHByb2JsZW1zIHJlcG9ydGVkIGJ5IERpbWl0cmlzIFNhcnJpcy4gVGhleSBhcHBlYXJlZAogIG9ubHkgd2hlbiB1c2luZyBWRVJCT1NFIGZ0cCB0cmFuc2ZlcnMuIERvIHdlIHVzZSBhIHRvbyBzbWFsbCBidWZmZXIgZm9yCiAgZ2V0aG9zdGJ5YWRkcl9yKCksIHdhcyB0aGUgbGFjayBvZiB1c2luZyBpbl9hZGRyX3Qgd3Jvbmcgb3IgaXMgaXQgdGhhdCB0aGUKICBob3N0ZW50IHN0cnVjdCBtdXN0IGJlIGJsYW5rZWQgYmVmb3JlIHVzZT8gV2l0aCBEaW1pdHJpcyBoZWxwIGFuZCB0aGVzZQogIHBhdGNoZXMsIHRoZSBwcm9ibGVtcyBzZWVtIHRvIGJlIGhpc3RvcnkuCgotIENVUkxPUFRfRlRQX1VTRV9FUFNWIHdhcyBhZGRlZCBhbmQgY2FuIGJlIHNldCB0byBGQUxTRSB0byBwcmV2ZW50IGxpYmN1cmwKICBmcm9tIHVzaW5nIHRoZSBFUFNWIGNvbW1hbmQgYmVmb3JlIHRyeWluZyB0aGUgbm9ybWFsIFBBU1YuIEhlaWtraSBLb3JwZWxhCiAgcG9pbnRlZCBvdXQgdGhhdCBzb21lIGZpcmV3YWxscyBhbmQgc2ltaWxhciBkb24ndCBsaWtlIHRoZSBFUFNWIHNvIHdlIG11c3QKICBiZSBhYmxlIHRvIHNodXQgaWYgb2ZmIHRvIHdvcmsgZXZlcnl3aGVyZS4KCi0gSSBhZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgJ2luX2FkZHJfdCcgYW5kIG1hZGUgdGhlIGZ0cCBjb2RlIHVzZSB0aGF0IHRvCiAgcmVjZWl2ZSB0aGUgaW5ldF9hZGRyKCkgcmV0dXJuIGNvZGUgaW4uIFdvcmtzIG9uIFNvbGFyaXMgYW5kIExpbnV4IGF0CiAgbGVhc3QuIFRoZSBMaW51eCBtYW4gcGFnZSBmb3IgaW5ldF9hZGRyKCkgZG9lc24ndCBldmVuIG1lbnRpb24gaW5fYWRkcl90Li4uCgotIEFkanVzdGVkIChhbG1vc3QpIGFsbCBGVFAgdGVzdHMgdG8gdGhlIG5ldyBjb21tYW5kIHNlcXVlbmNlLgoKLSBGVFAgY29tbWFuZCBzZXF1ZW5jZSBjaGFuZ2VzOgoKICBFUFNWIGlzIG5vdyBhbHdheXMgYXR0ZW1wdGVkIGJlZm9yZSBQQVNWLiBJdCBpcyB0aGUgZmluYWwgdG91Y2ggdG8gbWFrZSBJUHY2CiAgcGFzc2l2ZSBGVFAgZG93bmxvYWRzIHRvIHdvcmssIGJ1dCBFUFNWIGlzIG5vdCByZXN0cmljdGVkIHRvIElQdjYgYnV0IHdvcmtzCiAgZmluZSB3aXRoIElQdjQgdG9vIG9uIHRoZSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBpdC4KCiAgU0laRSBpcyBub3cgYWx3YXlzIGlzc3VlZCBiZWZvcmUgUkVUUi4gSXQgbWFrZXMgY3VybCBrbm93IHRoZSBhY3R1YWwKICBkb3dubG9hZCBzaXplIGJlZm9yZSB0aGUgZG93bmxvYWQgdGFrZXMgcGxhY2UsIGFzIGl0IG1ha2VzIGl0IGxlc3MgaW1wb3J0YW50CiAgdG8gZmluZCB0aGUgc2l6ZSBzZW50IGluIFJFVFIgcmVzcG9uc2VzLiBNYW55IHNpdGVzIGRvbid0IGluY2x1ZGUgdGhlIHNpemUKICBpbiB0aGVyZS4KCiAgQm90aCB0aGVzZSBjaGFuZ2VzIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgdGVzdCBzdWl0ZSdzIGZ0cCBzZXJ2ZXIKICBjb2RlLCBhbmQgYWxsIEZUUCB0ZXN0IGNhc2VzIG5lZWQgdG8gYmUgY2hlY2tlZCBhbmQgYWRqdXN0ZWQhCgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gSGFucyBTdGVlZ2VycyBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZWxuZXQgY29kZSByZWFkIGZyb20gc3Rkb3V0LCBub3Qgc3RkaW4KICBhcyBpdCBpcyBzdXBwb3NlZCB0byBkbyEKClZlcnNpb24gNy45LjItcHJlNgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAxKQotIEVyaWMgTGF2aWduZSdzIG1pbm9yIGNoYW5nZXMgdG8gYnVpbGQgb24gTWFjT1MgYmVmb3JlIE9TIFggd2VyZSBhcHBsaWVkLgoKLSBncmVlcCBhdCBtaW5kc3ByaW5nLmNvbSBwcm92aWRlZCBhIG1haW4gaW5kZXguaHRtbCBwYWdlIGZvciBvdXIgcmVsZWFzZQogIGFyY2hpdmUgZG9jcyBkaXJlY3RvcnkuIEl0IGp1c3QgbGlua3MgdG8gYWxsIHRoZSBleGlzdGluZyBIVE1MIGZpbGVzLCBidXQKICBJIHRoaW5rIGl0IG1heSBjb21lIHVzZWZ1bCB0byBwZW9wbGUuCgotIFRoZXJlJ3Mgbm93IHNvbWUgaW5pdGlhbCBjb2RlIHRvIHN1cHBvcnQgdGhlIEVQU1YgRlRQIGNvbW1hbmQuIFRoYXQgc2hvdWxkCiAgYmUgdXNlZCB0byBkbyBwYXNzaXZlIHRyYW5zZmVycyBJUHY2LXN0eWxlLiBUaGUgY29kZSBpcyBzdGlsbCAjaWYgMCdlZCBpbgogIGxpYi9mdHAuYyBhcyBJIGhhdmUgbm8gSVB2NiBmdHAgc2VydmVyIHRvIHRlc3QgdGhpcyB3aXRoLgoKRGFuaWVsICgyNiBOb3ZlbWJlciAyMDAxKQotIFJvYmVydCBTY2hsYWJiYWNoIGhhZCBwcm9ibGVtcyB0byB1bmRlcnN0YW5kIGhvdyB0byBkbyByZXN1bWVkIHRyYW5zZmVycywKICBhbmQgSSBjbGFyaWZpZWQgdGhlIG1hbiBwYWdlIC1DIHNlY3Rpb24gc29tZXdoYXQuCgpWZXJzaW9uIDcuOS4yLXByZTUKCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGhlbHBlZCBtZSBvdXQgdG8gdHJhY2sgZG93biB0aGUgcm9vdHMgb2YgYnVnIHJlcG9ydCAjNDc5NTM3LAogIHdoaWNoIHdhcyBjb25jZXJuaW5nIGN1cmwgcmV0dXJuaW5nIHRoZSB3cm9uZyBlcnJvciBjb2RlIHdoZW4gZmFpbGluZyB0bwogIGNvbm5lY3QuIFRoaXMgZGlkbid0IGhhcHBlbiBvbiBhbGwgc3lzdGVtcywgYW5kIG1vcmUgc3BlY2lmaWNseSBJJ3ZlIHNvIGZhcgogIG9ubHkgc2VlbiB0aGlzIGhhcHBlbiBvbiBJUHY0LW9ubHkgTGludXggaG9zdHMuCgotIEkgYXBwbGllZCB0aGUgZml4ZXMgZm9yIHRoZSB0d28gYnVncyBFcmljIExhdmlnbmUgZm91bmQgd2hlbiBkb2luZyBoaXMgTWFjT1MKICBwb3J0LiBBIG1pc3NpbmcgY29tbWEgaW4gYXJwYV90ZWxuZXQuaCBhbmQgYSBwcmV0dHkgd2lsZCB3cml0ZSBpbiB0aGUgRlRQCiAgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIHdyaXRlIGlzIGhvd2V2ZXIgbGlrZWx5IHRvIG9jY3VyIGluIG91cgogIG93biBidWZmZXIgdW5sZXNzIHZlcnkgYmlnIEZUUCBzZXJ2ZXIgcmVwbGllcyAoPjI1SykgYXJlIHJlYWQuIEkndmUgbmV2ZXIKICBzZWVuIHN1Y2ggYSByZXBseSBldmVyLCBzbyBJIHRoaW5rIHRoaXMgaXMgYSByZWxhdGl2ZWx5IG1pbm9yIHJpc2suCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDEpCi0gTW9vbmVzYW15IHByb3ZpZGVkIGNvZGUgdG8gcHJldmVudCBqdW5rIGZyb20gYmVpbmcgb3V0cHV0IHdoZW4gbGliY3VybAogIHJldHVybnMgYW4gZXJyb3IgY29kZSBidXQgbm8gZXJyb3IgZGVzY3JpcHRpb24gYW5kIHRoYXQgY29ycmVjdHMgaG93IG1ha2UgaXMKICBydW4gaW4gdGhlIE1ha2VmaWxlLmRpc3QgZmlsZSAodGhhdCBhcHBlYXJzIGFzIHJvb3QgTWFrZWZpbGUgaW4gcmVsZWFzZQogIGFyY2hpdmVzKS4KCi0gRXJpYyBMYXZpZ25lIG1haWxlZCBtZSBidWdmaXhlcyBhbmQgcGF0Y2hlcyBmb3IgYnVpbGRpbmcgbGliY3VybCBvbiBNYWNPUwogIChub24tWCkuCgotIEtldmluIFJvdGggbW9kaWZpZWQgdGhlIGN5Z3dpbiBmaWxlcyBvbmNlIGFnYWluLCBub3cgdG8gYnVpbGQgYWdhaW5zdCB0aGUKICBzaGFyZWQgT3BlblNTTCBETExzLgoKVmVyc2lvbiA3LjkuMi1wcmU0CgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDEpCi0gR2VvcmcgSG9ybiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIENVUkxJTkZPX1NUQVJUVFJBTlNGRVJfVElNRSwKICBjb21wbGV0ZSB3aXRoIG1hbiBwYWdlIHVwZGF0ZXMhCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDIwMDEpCi0gTWlrbG9zIE5lbWV0aCBwcm92aWRlZCBkZXRhaWxzIGVub3VnaCB0byB1cGRhdGUgdGhlIEJvcmxhbmQgbWFrZWZpbGUKICBwcm9wZXJseS4KCi0gTGFycyBNIEd1c3RhZnNzb24gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgZnJlZSgpLiBJbiBmYWN0LCBpdCB3YXMgc28gYmFkIEknbQogIGFtYXplZCB3ZSBuZXZlciBzYXcgdGhpcyBiZWZvcmUhCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3lnd2luIE1ha2ZpbGUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDEpCi0gS2xldnRzb3YgVmFkaW0gZml4ZWQgYSBidWcgaW4gaG93IHRpbWUtY29uZGl0aW9uYWxzIHdlcmUgc2VudCB3aGVuIGRvaW5nCiAgSFRUUC4KClZlcnNpb24gNy45LjItcHJlMwoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDAxKQotIFNhbXVlbCBMaXN0b3BhZCBwYXRjaGVkIGF3YXkgdGhlIHByb2JsZW0gd2l0aCBTU0wgd2UgZ290IHdoZW4gc29tZW9uZSBjYWxsCiAgY3VybF9nbG9iYWxfaW5pdCgpID0+IGN1cmxfZ2xvYmFsX2NsZWFudXAoKSA9PiBjdXJsX2dsb2JhbF9pbml0KCkuIFRoZQogIHNlY29uZCBpbml0IHdvdWxkIG5vdCAidGFrZSIgYW5kIFNTTCB3b3VsZCBiZSB1bnVzYWJsZSB3aXRoIGN1cmwgZnJvbSB0aGF0CiAgcG9pbnQuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGZhY3QgdGhhdCBjYWxsaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCB3YXkgaXMKICB3cm9uZy4gY3VybF9nbG9iYWxfaW5pdCgpIHNob3VsZCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGFuZCBub3QgbW9yZS4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMSkKLSBGaXhlZCBzb21lIG1pbm9yIHZhcmlhYmxlIHR5cGUgbWl4dXBzIGluIGZ0cC5jIHRoYXQgY2F1c2VkIGNvbXBpbGVyIHdhcm5pbmdzCiAgb24gSFAtVVggMTEuMDAuCgotIFRoZSBGVFAgZml4IEkgZGlkIHllc3RlcmRheSB1c2VkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdGhhdCBjYXVzZWQKICBzcHVyaW91cyBlcnJvcnMgd2hlbiBkb2luZyBGVFAuCgpWZXJzaW9uIDcuOS4yLXByZTIKCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwMSkKLSBSaWNhcmRvIENhZGltZSBmZWxsIG92ZXIgYSBtdWx0aXBsZS1yZXF1ZXN0cyBwcm9ibGVtIHdoZW4gZmlyc3QgYSBGVFAKICBkaXJlY3RvcnkgZmV0Y2ggZmFpbGVkIGFuZCB0aGVuIGEgc2Vjb25kIHJlcXVlc3QgaXMgbWFkZSBhZnRlciB0aGF0LiBUaGUKICBzZWNvbmQgcmVxdWVzdCBoYXBwZW5lZCB0byBnZXQgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgYmFjayBmcm9tIHRoZQogIHByZXZpb3VzIHJlcXVlc3QsIHdoZW4gaXQgZGlkIGl0cyBpbml0aWFsIENXRCBjb21tYW5kLgoKLSBCam9ybiBSZWVzZSBwb2ludGVkIG91dCB0aGF0IHdlIGNvdWxkIGltcHJvdmUgdGhlIHRpbWUgZGlmZiBmdW5jdGlvbiB0bwogIHByZXZlbnQgdHJ1bmNhdGlvbiBhIGJpdC4KCi0gS2FpLVV3ZSBSb21tZWwgbWFkZSBtZSBhd2FyZSB0aGF0IC1wIChodHRwIHByb3h5IHR1bm5lbCkgc2lsbHkgZW5vdWdoIGRpZG4ndAogIHdvcmsgZm9yIHBsYWluIEhUVFAgcmVxdWVzdHMhIFNvIEkgbWFkZSB0aGF0IHdvcmsuCgpWZXJzaW9uIDcuOS4yLXByZTEKCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwMSkKLSBSZXdyb3RlIHRoZSBDdXJsX0Nvbm5lY3RIVFRQUHJveHlUdW5uZWwoKS4gSXQgc2hvdWxkIG5vdyBub3Qgb25seSB3b3JrIGEgbG90CiAgZmFzdGVyLCBpdCBzaG91bGQgYWxzbyBzdXBwb3J0IHN1Y2ggKCJicm9rZW4iKSBwcm94aWVzIHRoYXQgSm9obiBMYXNrCiAgcHJldmlvdXNseSBoYXZlIHJlcG9ydGVkIHByb2JsZW1zIHdpdGguIEhpcyBwcm94eSBzZW5kcyBhIHRyYWlsaW5nIHplcm8gYnl0ZQogIGFmdGVyIHRoZSBlbmQgb2YgdGhlIChwcm94eS0pIGhlYWRlcnMuIEkndmUgdGVzdGVkIHRoaXMgbXlzZWxmIGFuZCBpdCBzZWVtcwogIHRvIHdvcmsgb24gYSBwcm94eSB0aGUgcHJldmlvdXMgdmVyc2lvbiBhbHNvIHdvcmtlZCB3aXRoLi4uISBUaGlzIHJld3JpdGUgaXMKICBkdWUgdG8gdGhlIHByb2JsZW1zIEpvaG4gTGFzayBwcmV2aW91c2x5IGV4cGVyaWVuY2VkLgoKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIG91dCB3aHkgdGhlICJjdXJyZW50IHNwZWVkIiBtZXRlciBzb21ldGltZXMgc2hvd2VkIDIwNDhLCiAgZm9yIHZlcnkgcXVpY2sgdHJhbnNmZXJzLiBJdCB0dXJuZWQgb3V0IHRoZSAidGltZSBkaWZmIi1mdW5jdGlvbiByZXR1cm5lZCBhCiAgemVybyBtaWxsaXNlY29uZCBkaWZmLiBXZSBub3cgYWx3YXlzIHNheSBpdCBpcyBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQhIEluCiAgcmVhbGl0eSwgdGhlc2UgdGltZXJzIHZlcnkgcmFyZWx5IGhhdmUgdGhhdCBnb29kIHJlc29sdXRpb24gc28gZXZlbiB0aG91Z2gKICB0aGUgdGltZSBkaWZmIHdhcyBsb25nZXIgdGhhbiAxIG1pbGxpc2Vjb25kLCBpdCB3YXMgcmVwb3J0ZWQgYXMgbm8gZGlmZi4KCi0gSSBhbHNvIG1vZGlmaWVkIHRoZSBnZXRpbmZvKCkgYWdhaW4gd2hlbiByZXR1cm5pbmcgdGltZXMsIGFzIFBhdWwgSGFycmluZ3RvbgogIHJlcG9ydHMgdGhhdCA3LjkuMSBvbmx5IHJldHVybnMgdGltZXMgd2l0aCAxIHNlY29uZCBhY2N1cmFjeSwgd2hpY2ggaW5kZWVkCiAgaXMgd3JvbmcuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwMSkKLSBNYXJjdXMgV2Vic3RlciBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQoKSBjb3VsZCByZWFkIG9uZSBieXRlIG91dHNpZGUgYQogIGJ1ZmZlciBib3VuZGFyeSwgd2hpY2ggdGhlbiBvZiBjb3Vyc2UgY291bGQgbGVhZCB0byBhIGNyYXNoLiBNYXJjdXMgYWxzbwogIGdyYWNlZnVsbHkgcHJvdmlkZWQgYSBwYXRjaCBmb3IgdGhpcyB0aGlzLgoKLSBHbGVuIFNjb3R0IHJhbiBjb25maWd1cmUgb24gaGlzIENvYmFsdCBRdWJlIGFuZCBpdCBkaWRuJ3QgZmlndXJlIG91dCB0aGUKICBjb3JyZWN0IHdheSBvZiBjYWxsaW5nIGdldGhvc3RieW5hbWVfcigpIGFuZCB0aHVzIGZhaWxlZCB0byByZXNvbHZlIGhvc3RzLgogIFRoaXMgaXMgdHdvIGVycm9yczogaXQgc2hvdWxkbid0IGNvbnRpbnVlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlmIGl0IGZpbmRzCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgYnV0IGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCwgYW5kIGl0IHNob3VsZCByZWFsbHkKICBmaWd1cmUgb3V0IGhvdyB0byB1c2UgaXQgYXMgaXQgd2FzIHJ1bm5pbmcgTGludXggYW5kIHdlIGtub3cgaG93IHRoYXQKICB3b3Jrcy4uLgoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDEpCi0gZG9jcy9WRVJTSU9OUyBpcyBhIG5ldyBmaWxlIGluIHRoZSBhcmNoaXZlIHRoYXQgZXhwbGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyCiAgc3lzdGVtIHdlIHVzZSBpbiB0aGUgY3VybCBwcm9qZWN0LgoKLSBEaWQgc29tZSBtb3JlIGZpeGVzIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgb25seSBpZ25vcmUgc2lnbmFscyBhcyBsb25nIGFzCiAgaXQgbmVlZHMgdG8sIGFuZCB0aGVuIHJlc3RvcmUgKGlmIGFueSkgcHJldmlvdXMgc2lnbmFsIGhhbmRsZXIgYWdhaW4uCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMSkKLSBFbnJpayBCZXJraGFuIHBvc3RlZCBidWcgcmVwb3J0ICM0Nzg3ODAsIGluIHdoaWNoIGhlIHZlcnkgY29ycmVjdGx5IHBvaW50ZWQKICBvdXQgdHdvIGJhZCB0aW1lb3V0IG1hdHRlcnMgaW4gbGliY3VybDogd2UgZGlkbid0IHJlc3RvcmUgdGhlIHNpZ2FjdGlvbgogIHN0cnVjdCAodGhlIGFsYXJtIGhhbmRsZXIgZm9yIFNJR0FMUk0pIG5vciBkaWQgd2UgcmVzdG9yZSB0aGUgcHJldmlvdXMKICBhbGFybSgpIHRpbWVvdXQgdGhhdCBjb3VsZCd2ZSBiZWVuIHNldCBieSBhICJwYXJlbnQiIHByb2Nlc3Mgb3Igc2ltaWxhci4KCi0gS2V2aW4gUm90aCBtYWRlIHRoZSBjeWd3aW4gYmluYXJ5IGdldCBzdHJpcHBlZCBiZWZvcmUgaW5zdGFsbC4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDAxKQotIERldGxlZiBTY2htaWVyIHJlcG9ydGVkIHRoYXQgY3VybCBkaWRuJ3QgY29tcGlsZSB1c2luZyBTb2xhcmlzIDggd2l0aCB0aGUKICBuYXRpdmUgY2MgY29tcGlsZXIuIEl0IHdhcyBkdWUgdG8gYSBiYWQgZnVuY3Rpb24gcHJvdG90eXBlLiBGaXhlZCBub3cuCiAgVW5mb3J0dW5hdGVseSwgSSBjYW4ndCBlbmFibGUgdGhlIC1Xc3RyaWN0LXByb3RvdHlwZXMgaW4gbXkgZGVidWcgYnVpbGRzCiAgdGhvdWdoLCBhcyBnY2MgdGhlbiBjb21wbGFpbnMgbGlrZSBjcmF6eSBvbiBPcGVuU1NMIGluY2x1ZGUgZmlsZXMuLi4gOi0oCgotIEpvaG4gTGFzayBwcm92aWRlZCBTU0wgb3ZlciBIVFRQIHByb3h5IGZpeGVzLiBUaGV5J2xsIG5lZWQgc29tZSB0d2Vha2luZwogIHRvIHdvcmsgb24gYWxsIHBsYXRmb3Jtcy4KCi0gSm9obiBMYXNrIGFkZGVkIHRoZSAtMS8tLVRMU3YxIG9wdGlvbnMgdGhhdCBmb3JjZXMgU1NMIGludG8gdXNpbmcgVExTCiAgdmVyc2lvbiAxIHdoZW4gc3BlYWtpbmcgSFRUUFMuCgotIEpvaG4gTGFzayBicm91Z2h0IGEgYnJhbmQgbmV3IFZDKysgbWFrZWZpbGUgZm9yIHRoZSBsaWIgZGlyZWN0b3J5LCB0aGF0CiAgd29ya3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIQoKLSBSYW1hbmEgTW9ra2FwYXRpIGJyb3VnaHQgc29tZSBjbGV2ZXIgaW5zaWdodHMgb24gdGhlIExEQVAgZmFpbHVyZXMgKGJ1ZwogIHJlcG9ydCAjNDc1NDA3KSwgYW5kIGhpcyBzdWdnZXN0ZWQgY2hhbmdlcyBhcmUgbm93IGFwcGxpZWQuCgpWZXJzaW9uIDcuOS4xCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwMSkKLSBJJ3ZlIGFkZGVkIGEgbnVtYmVyIG9mIG5ldyB0ZXN0IGNhc2VzIHRoZSBsYXN0IGZldyBkYXlzLiBBIGZldyBvZiB0aGVtIHNpbmNlCiAgSSBnb3QgcmVwb3J0cyB0aGF0IGhpbnRlZCBvbiBwcm9ibGVtcyBvbiB0aW1lb3V0cywgc28gSSBhZGRlZCBmb3VyIHRlc3RzCiAgd2l0aCB0aW1lb3V0cyBmb3IgYWxsIHNvcnRzIG9mIHByb3RvY29scyBhbmQgc3R1ZmYuIEkgYWxzbyBjYW1lIHRvIHRoaW5rIG9mCiAgYSBmZXcgb3RoZXIgZXJyb3Igc2NlbmFyaW9zIHRoYXQgd2UgY3VycmVudGx5IGRpZG4ndCB0ZXN0IHByb3Blcmx5LCBzbyBJCiAgd3JvdGUgdXAgdGVzdHMgZm9yIGEgZmV3IG9mIHRob3NlIHRvby4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAxKQotIFJlcGxhY2VkIHJlYWQoKSBhbmQgd3JpdGUoKSB3aXRoIHJlY3YoKSBhbmQgc2VuZCgpIGZvciBzb2NrZXQgb3BlcmF0aW9ucwogIGV2ZW4gdW5kZXIgbm9ybWFsIHVuaXhlcy4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIHdhcyBhYm9ydGVkIGR1ZSB0byBhIHRpbWVvdXQsIGl0IHdhc24ndCByZWFsbHkgYXdhcmUgb2YKICBob3cgbWFueSBieXRlcyB0aGF0IGhhZCBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgZXJyb3IgdGV4dCBhbHdheXMgc2FpZCAwCiAgYnl0ZXMuIEkgbW9kaWZpZWQgdGhpcyB0byBvdXRwdXQgdGhlIGFjdHVhbGx5IHRyYW5zZmVycmVkIGFtb3VudCEgOi0pCgotIFRoZSBGVFAgZml4ZXMgaW4gcHJlNyBkaWRuJ3QgY29tcGlsZSBvbiBJUHY2IGVuYWJsZWQgaG9zdHMuIERvZXMgbm93LiBJIGFsc28KICBhZGRlZCBtb3JlIGNvbW1lbnRzIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIGZpbGUuCgotIE1pbm9yIHVwZGF0ZXMgdG8gdGhlIEZBUSwgYWRkZWQgYSBicmFuZCBuZXcgc2VjdGlvbiB0byB0aGUgd2ViIHNpdGUgYWJvdXQKICB0aGUgbmFtZSBpc3N1ZSAod2hvIG93bnMgImN1cmwiPyB3aWxsIHNvbWVvbmUgc3VlIHVzPyBldGMgZXRjKToKICBodHRwOi8vY3VybC5oYXh4LnNlL2xlZ2FsL3RoZW5hbWUuaHRtbAoKVmVyc2lvbiA3LjkuMS1wcmU3CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBUaGUgY3VybF9lYXN5X2dldGluZm8oKSB0aW1lcnMgYWNjaWRlbnRhbGx5IGxvc3QgdGhlaXIgc3Vic2Vjb25kIGFjY3VyYWN5IGFzCiAgdGhlIGNhbGN1bGF0aW9ucyB1c2VkIGxvbmdzIGluc3RlYWQgb2YgZG91YmxlcyEgUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLgoKLSBUaGUgU1NMIFNvY2tldElzRGVhZCgpIGNoZWNrcyB3ZXJlbid0IGdvb2QgZW5vdWdoIChhcyBleHBlY3RlZCByZWFsbHkpLCBzbyBJCiAgaGFkIHRvIGFkZCBhIGdlbmVyaWMgaW50ZXJuYWwgdHJ5LWl0LW91dCBzeXN0ZW0uIElmIHRoZSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIGNvbm5lY3Rpb24gc2VlbXMgdG8gZmFpbCwgdGhlbiB3ZSBnbyBiYWNrIGFuZCBnZXQgYSBuZXcgKGZyZXNoKSBjb25uZWN0aW9uCiAgYW5kIHJlLXRyaWVzIHRoZSByZXF1ZXN0IG9uIHRoYXQgaW5zdGVhZC4gSXQga2luZCBvZiBtYWtlcyB0aGUKICBTb2NrZXRJc0RlYWQoKSBjaGVjayBvYnNvbGV0ZSwgYnV0IEkgdGhpbmsgaXQgaXMgYSBxdWlja2VyIHdheSBmb3IgdGhvc2UKICBjYXNlcyB3aGVyZSBpdCBhY3R1YWxseSBkaXNjb3ZlcnMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLgoKLSBXaGVuIGZpeGluZyB0aGUgYWJvdmUsIEkgbm90aWNlZCB0aGF0IHdlIGRpZCBxdWl0ZSBhIGZldyB3cml0ZXMgdG8gc29ja2V0cwogIGluIGxpYmN1cmwgd2hlcmUgd2UgZGlkbid0IGNoZWNrIHRoZSByZXR1cm4gY29kZSAodGhhdCBpdCBhY3R1YWxseSB3b3JrZWQgdG8KICBzZW5kIHRoZSBkYXRhKS4gV2l0aCB0aGUgbmV3ICJhdHRlbXB0ZWQgcmVxdWVzdCIgc3lzdGVtIHdlIG11c3QgZGV0ZWN0IHRob3NlCiAgc2l0dWF0aW9ucyBzbyBJIHdlbnQgb3ZlciBhIGJ1bmNoIG9mIGZ1bmN0aW9ucywgY2hhbmdlZCByZXR1cm4gdHlwZXMgYW5kCiAgYWRkZWQgY2hlY2tzIGZvciB3aGF0IHRoZXkgYWN0dWFsbHkgcmV0dXJuLgoKVmVyc2lvbiA3LjkuMS1wcmU2CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBQYXVsIEhhcnJpbmd0b24gZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGFudCBTU0wgY29ubmVjdGlvbnMuIE9yIHRvIGJlCiAgbW9yZSBleGFjdCwgd2UgZGlkbid0IHByb3Blcmx5IGRldGVjdCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkZWFkIGFuZCB0aGVuCiAgYSBzZWNvbmQgY29ubmVjdGlvbiB3b3VsZCB0cnkgdG8gcmUtdXNlIGl0IHdyb25nbHkuIFRoZSBzb2x1dGlvbiB0byB0aGlzCiAgcHJvYmxlbSBpcyBzdGlsbCBub3QgdmVyeSBjbGVhciBhbmQgSSdtIHdvcmtpbmcgb24gaXQuIE9uZSBPcGVuU1NMIGluc2lkZXIKICBzYWlkIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGlmIHRoZSBTU0wgY29ubmVjdGlvbiBpcyBhbGl2ZSBvciBub3Qgd2l0aG91dAogIGFjdHVhbGx5IHRyeWluZyBhbiBvcGVyYXRpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMSkKLSBJZiBhIGNvb2tpZSB3YXMgcmVhZCBmcm9tIGEgZmlsZSwgaXQgY291bGQgYWNjaWRlbnRhbGx5IHN0cmR1cCgpIGEgTlVMTAogIHBvaW50ZXIuIFBhdWwgSGFycmluZ3RvbiByZXBvcnRlZC4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0KCi0gVGhlIE1BTlVBTCBmaWxlIG5vdyBkb2N1bWVudHMgLXQgY29ycmVjdGx5LiBJIGFsc28gZml4ZWQgdGhlIC1UIGRlc2NyaXB0aW9uCiAgaW4gdGhlIGN1cmwuMSBtYW4gcGFnZS4KCkRhbmllbCAoMjkgT2N0b2JlciAyMDAxKQotIEpvaG4gSmFuc3NlbiBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQgd2FzIG1pc3NpbmcgaW4gdGhlIGxpYmN1cmwuZGVmIGZpbGUKICBhbmQgdGhhdCB0aGUgZG9jcyBzdGF0ZWQgdGhlIHdyb25nIHJldHVybiB0eXBlIGZvciB0aGUgZnVuY3Rpb24uCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBidWcgd2l0aCBtdWx0aXBsZSBmaWxlcyBpbiB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sCiAgdGhhdCBJIHJlbW92ZWQgd2l0aCB0aGlzIHBhdGNoIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvZm9ybWRhdGEuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0uCgotIEtldmluIFJvdGggYnJvdWdodCBhbm90aGVyIHBhdGNoIHRoYXQgbW92ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGZpbGVzIHRvIHRoZQogIHBhY2thZ2VzL1dpbjMyL2N5Z3dpbiBkaXJlY3RvcnkuCgotIEEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBsb2dpYyBtYWRlIHJlcGVhdGVkIHJlcXVlc3RzIHRvIHRoZSBzYW1lIEZUUAogIHNlcnZlciAod2hlbiB1c2luZyBuYW1lK3Bhc3dvcmQgaW4gdGhlIFVSTCkgc29tZXRpbWVzIHVzZSBtb3JlIHRoYW4gb25lCiAgY29ubmVjdGlvbi4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi91cmwuYy5kaWZmP3IxPTEuMTY2JnIyPTEuMTY3XQoKLSBNb29uZXNhbXkgdHJhY2tlZCBkb3duIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbmV3IDcuOS4xIGNvbm5lY3QKICBjb2RlLiBUaGlzIGNvcnJlY3RlZCB0aGUgZXJyb3IgS2V2aW4gUm90aCByZXBvcnRlZCBvbiB0aGUgNy45LjEtcHJlNSByZWxlYXNlCiAgKHRlc3QgMTkpLi4uCiAgW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb25uZWN0LmMuZGlmZj9yMT0xLjEzJnIyPTEuMTRdCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCB0ZXN0Mjggd2hpY2ggdmVyaWZpZXMgdGhhdCAiTG9jYXRpb246Ii1mb2xsb3dpbmcgd29ya3MgZXZlbiBpZiB0aGUKICBjb250ZW50cyBpcyBzZXBhcmF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIHNwYWNlLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDEpCi0gUmFtYW5hIE1va2thcGF0aSBwb2ludGVkIG91dCB0aGF0IExEQVAgdHJhbnNmZXJzIHdvdWxkICdoYW5nJyBhZnRlciB0aGUKICBjb3JyZWN0IGRhdGEgaGFzIGJlZW4gb3V0cHV0LgoKVmVyc2lvbiA3LjkuMS1wcmU1CgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMSkKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvb2tpZSBlbmdpbmUuIFdoZW4gd2UgdXBkYXRlIGEgY29va2llCiAgdGhhdCB3ZSBhbHJlYWR5IGtuZXcgYWJvdXQsIHdlIGxvc3QgYSBjaHVuayBvZiBtZW1vcnkgaW4gdGhlIHByb2dyZXNzLi4uIFRoZQogIGJyYW5kIG5ldyB0ZXN0IGNhc2UgMjcgbm93IHRlc3RzIGZvciB0aGlzIG9jY3VycmVuY2UuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29va2llLmMuZGlmZj9yMT0xLjI0JnIyPTEuMjVdCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMSkKLSBwYWNrX2hvc3RlbnQoKSBkaWRuJ3QgcHJvcGVybHkgYWxpZ24gc29tZSBwb2ludGVycywgc28gYXQgbGVhc3QgU1BBUkMgQ1BVcwogIHdvdWxkIGNvcmUuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvaG9zdGlwLmMuZGlmZj9yMT0xLjM0JnIyPTEuMzVdCgpEYW5pZWwgKDIyIE9jdG9iZXIgMjAwMSkKLSBUb20gQmVub2lzdCByZXBvcnRlZCB0aGF0IHRoaXMgU0dJIElSSVggY29tcGlsZXIgZGlkbid0IGhhbmRsZSBpbmRlbnRlZAogIHByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvIHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZSEKCi0gQXBwbGllZCBLZXZpbiBSb3RoJ3MgcGF0Y2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBjeWd3aW4gcGFja2FnZXMgZnJvbQogIHRoZSBvdXQtb2YtdGhlLWJveCBjdXJsIHJlbGVhc2UgYXJjaGl2ZXMuCgotIEkgZm9yZ290IHRvIG1lbnRpb24gaXQgYmVsb3csIGJ1dCBsaWJjdXJsIG5vdyBjbG9zZXMgY29ubmVjdGlvbnMgdGhhdCByZXBvcnQKICB0cmFuc2ZlciBmYWlsdXJlcy4gVW5jb25kaXRpb25hbGx5LiBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBuaWNlbHkgaW4gdGhlCiAgZnV0dXJlIGlmIHdlIHNldCBhIGZsYWcgb3Igc29tZXRoaW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgZ29vZCB0byBiZQogIHVzZWQgZm9yIHRoZSBlcnJvcnMgdGhhdCBrbm93IHRoYXQgZm9yIGEgZmFjdC4gV2UgaGF2ZSB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIGZvciB0aGUgY2FzZXMgd2hlcmUgd2UgYWJvcnQgZm9yIGV4YW1wbGUgYSBIVFRQIHRyYW5zZmVyIGluIHRoZQogIG1pZGRsZSwgb3Igb3RoZXJ3aXNlIHdlIG1pZ2h0IHJlLXVzZSB0aGF0IGNvbm5lY3Rpb24gbGF0ZXIgd2l0aCBsb3RzIG9mIGRhdGEKICBzdGlsbCBiZWluZyBzZW50IHRvIHVzIG9uIGl0LiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3RyYW5zZmVyLmMuZGlmZj9yMT0xLjYzJnIyPTEuNjRdCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwMSkKLSBDVVJMRV9HT1RfTk9USElORyBpcyBub3cgcmV0dXJuZWQgd2hlbiBhIEhUVFAgc2VydmVyIGRvZXNuJ3QgcmV0dXJuCiAgYW55dGhpbmcsIG5vdCBldmVuIGEgaGVhZGVyLiB0ZXN0IGNhc2UgMzcgd2FzIGFkZGVkIHRvIHRlc3QgZm9yIHRoaXMuCgotIFQuIEJoYXJhdGggbWFkZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgcHJvcGVybHkgY2xvbmUgdGhlIGNvb2tpZSBzdGF0dXMgYXMKICB3ZWxsLgoKVmVyc2lvbiA3LjkuMS1wcmU0CgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwMSkKLSBDVVJMT1BUX0ZBSUxPTkVSUk9SLCBzZXQgd2l0aCAiY3VybCAtLWZhaWwiIG5vIGxvbmdlciByZXR1cm5zIGFuIGVycm9yIGlmCiAgdGhlIEhUVFAgcmV0dXJuIGNvZGUgaXMgYmVsb3cgNDAwLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDEpCi0gVGhlIHRlc3Qgc3VpdGUgbm93IGtpbGxzIGFueSBydW5uaW5nIHRlc3QgaHR0cCBzZXJ2ZXIgd2hlbiB5b3UgcmUtc3RhcnQgdGhlCiAgdGVzdHMuCgotIFdlIGhhZCB0byByZW1vdmUgJ3VzZSBzdHJpY3QnIGZyb20gdHdvIHBlcmwgc2NyaXB0cywgYXMgdGhlIGN5Z3dpbgogIGFkanVzdG1lbnRzIGRpZG4ndCBwbGF5IG5pY2VseSBvdGhlcndpc2UgZm9yIHNvbWUgcmVhc29uLiBBbnkgcGVybCB3aXphcmQKICBvdXQgdGhlcmUgd2hvIGNhbiBwdXQgdGhlIHNjcmljdCBiYWNrIGFuZCBzdGlsbCBtYWtlIGl0IHJ1biBnb29kIG9uIHVuaXggYW5kCiAgY3lnd2luPwoKLSBBIHBvdGVudGlhbCBtZW1vcnkgbGVhayBwb2ludGVkIG91dCB0byB1cyBieSBZYW5pY2sgUGVsbGV0aWVyIHdhcyByZW1vdmVkLgogIEl0IHdvdWxkIG9jY3VyIHdoZW4gYSBodHRwIGZpbGUgdHJhbnNmZXIgZmFpbHMuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjAmcjI9MS42MV0KCi0gVGhlIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtIHNob3VsZCBubyBsb25nZXIgZGlzcGxheSBhbnl0aGluZyB0byBzdGRlcnIKICBpZiB0aGUgY3VybF9tZW1kZWJ1ZygpIGhhc24ndCBiZWVuIHVzZWQgdG8gZXhwbGljaXRseSBzYXkgc28uIFRoaXMgbWFrZXMgaXQKICBlYXNpZXIgdG8gdXNlIHRoZSBtZW1vcnkgZGVidWcgc3lzdGVtIGFuZCBzd2l0Y2ggdGhlIGxvZ2dpbmcgb24vb2ZmLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCBuaWNlciBpbiBjeWd3aW4gZW52aXJvbm1lbnRzLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDEpCi0gQ2xlYW5pbmcgdXAgdGhlIHByb2dyZXNzIG1ldGVyL2luZm8gY29kZS4gVGhlICJjdXJyZW50IHNwZWVkIiBpcyBub3cgbW9yZQogIGFjY3VyYXRlIHRoYW4gYmVmb3JlIGFzIHdlIG5vdyB1c2UgdGhlIHRydWUgdGltZSBzcGVudCBiZXR3ZWVuIHRoZSBtZWFzdXJlcywKICBhbmQgbm90IGp1c3QgImFzc3VtaW5nIiBldmVyeS1zZWNvbmQtdXBkYXRlIGxpa2UgYmVmb3JlLiBUaGUgb3V0cHV0IHNob3VsZAogIG5vdyBhbHNvIGJlIG9mIHRoZSBzYW1lIHdpZHRoIGF0IGFsbCB0aW1lcywgbmV2ZXIgdG8gc2hvdyAiZXh0cmEiIHplcm9lcyBvbgogIHRoZSByaWdodCBlZGdlLgoKLSBBZnRlciB0YWxraW5nIGFib3V0IHBvc3NpYmxlIExvY2F0aW9uOiBidWdzIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgbW9kaWZpZWQKICB0aGUgImFic29sdXRlIFVSTCIgY2hlY2tlciBpbiBsaWIvdHJhbnNmZXIuYyB0byBiZSBtb3JlIHN0cmljdCB3aGVuIGNoZWNraW5nCiAgaWYgdGhlIHJlZGlyZWN0ZWQgVVJMIGlzIGFic29sdXRlLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBwYXRjaGVzIHRoYXQgbWFrZSB0aGUgdGVzdCBzdWl0ZSBydW4gZmluZSBvbiBXaW5kb3dzCiAgMjAwMCBydW5uaW5nIGN5Z3dpbi4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDAxKQotIFNldHRpbmcgdGhlIC1jIG9yIHRoZSBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gbm93IGVuYWJsZXMgdGhlIGNvb2tpZSBwYXJzZXIuCiAgUHJldmlvdXNseSAtYiBvciBDVVJMT1BUX0NPT0tJRUZJTEUgd2FzIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBqYXIgdG8gd29yay4KClZlcnNpb24gNy45LjEtcHJlMwoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCBhIG5ldyBvcHRpb24gdG8gdGhlIGNvbW1hbmQgbGluZSBjbGllbnQ6IC0wLy0taHR0cDEuMC4gSXQgdXNlcyB0aGUgbmV3CiAgbGliY3VybCBvcHRpb24gQ1VSTE9QVF9IVFRQX1ZFUlNJT04gdG8gcmVxdWVzdCB0aGF0IGxpYmN1cmwgdXNlcyBIVFRQIDEuMAogIHJlcXVlc3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiAoMS4xKS4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKICByZWFsbHkgTVVTVCBkbyB0aGF0IGJlY2F1c2Ugb2YgYSBzaWxseSByZW1vdGUgc2VydmVyLgoKLSBSZW5hbWVkIHRoZSAnVGltZUNvbmQnIHR5cGVkZWYgaW4gY3VybC9jdXJsLmggdG8gdXNlIGEgJ2N1cmxfJyBwcmVmaXggYXMKICBhbGwgcHVibGljIGN1cmwtc3ltYm9scyBzaG91bGQuCgotIGxpYmN1cmwgbm93IGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGgncyBjaGFuZ2UgdG8gdGhlIGNvb2tpZS1qYXIgY29tbWVudCAoaW4gdGhlIHN0b3JlZCBmaWxlKSB3YXMKICBhcHBsaWVkLgoKLSBMdWNhcyBBZGFtc2tpJ3MgbWlub3IgYnVnIGluIHRoZSBiaW5kIGVycm9yIGNvZGUgZmFpbGYoKSB3YXMgZml4ZWQuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDAxKQotIE1vb25lc2FteSBmaXhlZCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uIHRvIG5vdCBnaXZlIGNvbXBpbGVyIGVycm9ycwogIG9uIGEgYnVuY2ggb2YgY29tcGlsZXJzLCBkdWUgdG8gdGhlIGFyZ3VtZW50IG5hbWVkICdzb2NrZXQnLgoKLSBNb29uZXNhbXkgYWxzbyBwcm92aWRlZCB1cGRhdGVkIFZDKysgbWFrZWZpbGVzIGFuZCBwcm9qZWN0IGZpbGVzLgoKVmVyc2lvbiA3LjkuMS1wcmUyCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAxKQotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIHRoYXQgbWFrZXMgdGhlIHNjcmlwdCBkZXRlY3QgcHJvcGVyCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgbWV0aG9kIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBhbnkgY29kZSwgb25seSBjb21waWxpbmcKICBpcyBuZWNlc3NhcnkuIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBuZWVkIG9mIGhhdmluZyBhIHJlc29sdmluZyAnbG9jYWxob3N0JwogIG5hbWUuCgotIEZvdW5kIGFuZCByZW1vdmVkIG1lbW9yeSBsZWFrYWdlIChuYW1lIHJlc29sdmUgZGF0YSkgaW4gbGliY3VybCBvbgogIElQdjYtZW5hYmxlZCBob3N0cy4gVGhlc2UgY291bGQgc25lYWsgdGhyb3VnaCBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueQogIHJlc291cmNlIHRyYWNpbmcgb24gdGhlIElQdjYtcmVsYXRlZCBmdW5jdGlvbnMuIFdlIGRvIG5vdy4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gS2VpdGggTWNHdWlnYW4gcGF0Y2hlZCBhd2F5IGEgKG1haW5seSBXaW5kb3dzLSkgcHJvYmxlbSB3aXRoIHRoZSBuYW1lCiAgcmVzb2x2ZXIgZGF0YSBiZWluZyBrZXB0IGluIHRoZSBzdGF0aWMgbWVtb3J5IGFyZWEsIHdoaWNoIGlzIHJlbW92ZWQgd2hlbiBhCiAgdGhyZWFkIGlzIGtpbGxlZC4gVGhlIGN1cmwgaGFuZGxlIGl0c2VsZiB0aG91Z2ggcGVyZmVjdGx5IGhhbmRsZXMgYmVpbmcKICBwYXNzZWQgYmV0d2VlbiB0aHJlYWRzLgoKLSBEaXJrIEVkZGVsYnVldHRlbCByZXBvcnRlZCBhbiBvZGQgYnVnIHRoYXQgdHVybmVkIG91dCB0byBiZSBoaXMgcHJveHkgdGhhdAogIHJlcXVpcmVkIGFuIEF1dGhvcml6YXRpb246IGhlYWRlci4gTm93LCBwcm94aWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmVxdWlyZQogIHRoYXQgaGVhZGVyLCB0aGF0IGlzIGZvciB0cnVlIHNlcnZlcnMuLi4KCi0gSSBhY2NpZGVudGFsbHkgcnVpbmVkIEdlb3JnJ3MgY3VybF9mb3JtYWRkKCkuIFVoLCBiYWQgbWUuIENvcnJlY3RlZCBub3cuCgpWZXJzaW9uIDcuOS4xLXByZTEKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG9uY2UgYWdhaW4gbWFkZSBhbiBlZmZvcnQgYmV5b25kIHRoZSBjYWxsIG9mIGR1dHkgYW5kIG5vdAogIG9ubHkgaW1wcm92ZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uLCBidXQgYWxzbyB0b29rIGNhcmUgb2YgYWRqdXN0aW5nCiAgdGhlIGN1cmwgY29tbWFuZCBsaW5lIGNsaWVudCB0byB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUKICBvYnNvbGV0ZWQgY3VybF9mb3JtcGFyc2UuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAxKQotIE1ham9yIGZpeCBpbiBob3cgbGliY3VybCBkb2VzIFRDUCBjb25uZWN0cy4gSXQgbm93IGRvZXMgbm9uLWJsb2NraW5nCiAgY29ubmVjdHMgdG8gZW5hYmxlIGdvb2QgdGltZW91dHMgd2l0aG91dCBzaWduYWxzLCBhbmQgaXQgbm93IHRyaWVzIGFsbCBJUAogIGFkZHJlc3NlcyBmb3IgYW55IGdpdmVuIGhvc3QgKGlmIGl0IHJlc29sdmVzIG1vcmUgdGhhbiBvbmUgYW5kIHRoZSBmaXJzdAogIG9uZShzKSBkb24ndCBjb25uZWN0KS4gQWRkZWQgYSBuZXcgc291cmNlIGZpbGUgJ2Nvbm5lY3QuYycgdG8gZGVhbCB3aXRoIGFsbAogIHRoZSBUQ1AgY29ubmVjdCBzdHVmZi4KCi0gV2Ugbm93IHN1cHBvcnQgSVB2NC1zdHlsZSBJUC1hZGRyZXNzZXMgaW4gcmZjMjczMi1mb3JtYXQsIHRvIGJldHRlciBzdXBwb3J0CiAgcGVvcGxlIHdyaXRpbmcgc2NyaXB0cyB3aXRob3V0IGtub3dpbmcgd2hhdCBhZGRyZXNzIHRoZXJlIGlzLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMSkKLSBDbGVhbnVwcyBpbiB0aGUgRlRQIHNvdXJjZSBjb2RlLiBEaXZpZGVkIHRoZSBjb2RlIGludG8gZXZlbiBtb3JlIHNtYWxsZXIKICBmdW5jdGlvbnMgYW5kIGdlbmVyYWxseSB0cmllZCB0byBtYWtlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElQdjQgYW5kIElQdjYKICBnZXQgbGVzcyBub3RpY2FibGUgaW4gdGhlIHNvdXJjZXMuCgotIElmIHRoZSByZW1vdGUgZmlsZSB0aW1lIGlzIG5vdCByZWFkYWJsZS9hY2Nlc3NhYmxlL3VuZGVyc3Rvb2QgYnkgbGliY3VybCwKICBsaWJjdXJsIG5vdyByZXR1cm5zIC0xIGluIHRoZSBDVVJMSU5GT19GSUxFVElNRSBkYXRhLCBub3QgMCBhcyBpdCBwcmV2aW91c2x5CiAgZGlkLiBUaGlzIHNob3VsZCBtYWtlIGN1cmwgbm90IHRvdWNoIHRoZSBmaWxlIGRhdGEgdW5sZXNzIHRoZXJlIHdhcyBhIGtub3duCiAgcmVtb3RlIGRhdGUgd2hlbiAtUiBpcyB1c2VkLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwMSkKLSBXb3JraW5nIG9uIGdldHRpbmcgbm9uLWJsb2NraW5nIGNvbm5lY3RzIHdvcmtpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIFdlCiAgd2lsbCBhbHNvIG1ha2UgY3VybCB0cnkgYWxsIElQcyBmb3IgYSBnaXZlbiBob3N0IGlmIHRoZSBmaXJzdCBvbmUgc2hvdWxkCiAgZmFpbC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBhIGNvb2tpZSBleGFtcGxlIHRoYXQgcHJvdmVkIHRoZSBjb29raWUgamFyCiAgZnVuY3Rpb25hbGl0eSB3YXNuJ3Qgd29ya2luZyBwcm9wZXJseS4gSSBhZGRlZCB0ZXN0IGNhc2UgNDYgYW5kIG1hZGUgaXQKICB3b3JrLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMSkKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDEpCi0gRm91bmQgYW5kIHJlbW92ZWQgYSAnc29ja2V0IGxlYWsnIHRoYXQgd291bGQgb2NjdXIgb24gSVB2NiBlbmFibGVkIGhvc3RzCiAgd2hlbiBGVFAgUkVUUiBmYWlsZWQuCgotIE1hZGUgdGhlIEZUUCB1cGxvYWQgdGVzdHMgcnVuIGZpbmUgb24gbWFjaGluZXMgd2l0aCBJUHY2IGVuYWJsZWQuCgpWZXJzaW9uIDcuOS1wcmU4CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAxKQotIFZvanRlY2ggTWluYXJpayBzZXQgdXAgYSBzcGVjaWFsLXB1cnBvc2UgdGVzdCBzZXJ2ZXIgYW5kIHByb3ZpZGVkIG1lIHdpdGgKICB0ZXN0IGNlcnRpZmljYXRlcyBpbiBvcmRlciBmb3IgbWUgdG8gcmVwZWF0IHRoZSBidWcgcmVwb3J0cyAjNDQwMDY4IGFuZAogICM0NDAzNzMuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IGNoZWNrIGFsbCB0aGUgZXJyb3IgY29kZXMgcHJvcGVybHkuIFdlIGRvCiAgbm93LCBhbmQgY29ubmVjdGluZyB3aXRoIGEgdW5hY2NlcHRhYmxlIGNlcnRpZmljYXRlIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwKICB0byBjb25uZWN0IHdpdGggYW4gZXJyb3IgY29kZSByZXR1cm5lZC4KCi0gUmFtYW5hIE1va2thcGF0aSBmb3VuZCBhIGNhc2Ugd2hlbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIGRpZCB3cm9uZy4KICBJIHdyb3RlIGEgdGVzdCBjYXNlIGZvciB0aGlzICg0NSkuCgpWZXJzaW9uIDcuOS1wcmU3CgpEYW5pZWwgKDE3IFNlcHRlbWJlciAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgZml4ZWQgdGVsbmV0IGZvciB3aW4zMi4gSXQgbWFrZXMgbGliY3VybCByZXF1aXJlCiAgd2luc29jayAyLjAuCgpWZXJzaW9uIDcuOS1wcmU2CgotIGxpYnRvb2wgMS40LjIgaXMgbm93IGluIHVzZSEKClZlcnNpb24gNy45LXByZTUKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgYW5vdGhlciAxNCBmdHAgdGVzdHMuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB0aGUgZWFzeS5oIGhlYWRlciBmaWxlLiBJdCBoYXMgbm93IGJlZW4KICB0ZXN0ZWQgYW5kIHByb3ZlZCB0byB3b3JrIGluIGEgcmVhbC13b3JsZCB0ZXN0cyBieSBUIEJoYXJhdGguIFdlIHN0aWxsIG5lZWQKICB0byB3cml0ZSB1cCBzb21lIGRvY3MgZm9yIHRoaXMgZnVuY3Rpb24uCgotIEFkZGVkIGZvdXIgbW9yZSBmdHAgdGVzdHMgdG8gdGhlIHRlc3Qgc3VpdGUuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDAxKQotIENVUkxPUFRfU1NMX0NJUEhFUl9MSVNUIHdhcyBhZGRlZCwgYW5kIHRoZSBjdXJsIHRvb2wgb3B0aW9uIGlzIG5hbWVkCiAgLS1jaXBoZXJzLiBVc2UgdGhlbSB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjaXBoZXJzIHRvIHVzZSBpbiB0aGUgU1NMCiAgY29ubmVjdGlvbi4KCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwncyB3aW5kb3dzIHZlcnNpb24uIEl0IHR1cm5lZCBvdXQKICB0byBiZSB0aGUgbmV3IGR1cGhhbmRsZSgpIHRoYXQgZGlkbid0IHF1aXRlIHdvcmsgeWV0LgoKVmVyc2lvbiA3LjktcHJlNAoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB2ZXJib3NlIG91dHB1dCBmb3IgU1NMIGNvbm5lY3Rpb25zIHRoYXQgb3V0cHV0IHRoZSBzZXJ2ZXIKICBjZXJ0aWZpY2F0ZSdzIHN0YXJ0IGFuZCBleHBpcmUgZGF0ZXMuIEFzIHN1Z2dlc3RlZCBieSBQYXVsIEhhcnJpbmd0b24uCgotIEhlaWtraSBLb3JwZWxhIGZvdW5kIHByb2JsZW1zIGluIHRoZSBwZXJsIGZ0cCBzZXJ2ZXIgdXNlZCBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgd2hlbiBoZSBydW5zIG9uIG9uIE9wZW5CU0Qgd2l0aCBwZXJsIDUuNi4gU29tZSBjaGFuZ2VzIGhhdmUgYmVlbgogIG1hZGUsIGJ1dCBub3RoaW5nIHJlYWxseSBjZXJ0YWluLgoKLSBULiBCaGFyYXRoIGhhcyBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGxpYmN1cmwncyBzdGFjayB1c2FnZSBvbiB3aW5kb3dzCiAgYW5kIHdvcmtzIG9uIHJlZHVjaW5nIGl0LgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIHBlcmwgaW50ZXJmYWNlLiBJdCBzdG9wcGVkIHdvcmtpbmcgc2luY2UgdGhlIGNoYW5nZWQKICBiZWhhdmlvciB3aXRoIFdSSVRFSEVBREVSIGFuZCBOVUxMIHBvaW50ZXJzLgoKLSBUaGUgIm91dHB1dCBjb29raWVzIiBmdW5jdGlvbiBjb3VsZCBkdW1wIGNvcmUgaWYgbm8gY29va2llcyB3ZXJlIGVuYWJsZWQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDEpCi0gU00gcG9pbnRlZCBvdXQgdGhhdCB0aGUgU1NMIGNvZGUgZGlkbid0IGNvbXBpbGUgYW55IGxvbmdlciBpZiBTU0wgd2FzCiAgZGlzYWJsZWQuLi4gQWxzbywgd2UgbmVlZGVkIHRvIGNvcnJlY3QgdGhlICNpbmNsdWRlIGZvciB0aGUgdXRpbWUgc3R1ZmYgb24KICB3aW5kb3dzLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDAxKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBTU0wgc2Vzc2lvbiBjYWNoZSBjb2RlIHRoYXQgbWFkZSBpdAogIHNvbWV0aW1lcyByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIuCgpWZXJzaW9uIDcuOS1wcmUzCgpEYW5pZWwgKDMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdGhlIC1SLy0tcmVtb3RlLXRpbWUgb3B0aW9uLCB0aGF0IHVzZXMgdGhlIHJlbW90ZSBmaWxlJ3MgZGF0ZXN0YW1wIHRvCiAgc2V0IHRoZSBsb2NhbCBmaWxlJ3MgZGF0ZXN0YW1wLiBUaHVzLCB3aGVuIHlvdSBnZXQgYSByZW1vdGUgZmlsZSB5b3VyIGxvY2FsCiAgZmlsZSB3aWxsIGdldCB0aGUgc2FtZSB0aW1lIGFuZCBkYXRlLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4geW91IHVzZQogIC1vIG9yIC1PLgoKLSBJbnN0YWxsZWQgbGlidG9vbCAxLjQuMSwgbGlidG9vbGl6ZWQgYW5kIGV2ZXJ5dGhpbmcuCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9pbnRlZCBvdXQgdGhhdCBJIGRpZCBub3Qgc2hpcCB0aGUgcHJvcGVyIGxpYnRvb2wgc3R1ZmYgaW4KICB0aGUgcHJlLXJlbGVhc2VzLCBldmVuIHRob3VnaCB0aGF0IHdhcyBteSBpbnRlbnRpb24uIGxpYnRvb2xpemUgaGFzIG5vdwogIGJlZW4gcmUtcnVuLgoKLSBIZWlra2kgYWxzbyBwYXRjaGVkIGF3YXkgdGhlIGJhZCB1c2Ugb2YgJ21ha2UgLUMnIGluIHRoZSB0ZXN0IHN1aXRlCiAgbWFrZWZpbGUuIG1ha2UgLUMgaXMgbm90IHZlcnkgcG9ydGFibGUgYW5kIGlzIG5vdyBiYW5uZWQgZnJvbSBoZXJlLgoKVmVyc2lvbiA3LjktcHJlMgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMSkKLSBJIGp1c3QgbWFkZSBhIGh1Z2UgaW50ZXJuYWwgc3RydWN0IHJlaGF1bCwgYW5kIGFsbCB0aGUgYmlnIGludGVybmFsbHkgdXNlZAogIHN0cnVjdHMgaGF2ZSBiZWVuIHJlbmFtZWQsIHJlZGVzaWduZWQgYW5kIHN0dWZmIGhhdmUgYmVlbiBtb3ZlZCBhcm91bmQgYSBiaXQKICB0byBtYWtlIHRoZSBzb3VyY2UgZWFzaWVyIHRvIGZvbGxvdywgbW9yZSBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgdG8gaG9wZWZ1bGx5CiAgZGVjcmVhc2UgZnV0dXJlIGJ1Z3MuIEkgYWxzbyBob3BlIHRoYXQgdGhpcyB3aWxsIG1ha2UgbmV3IGZ1bmN0aW9ucyB0byBnZXQKICBlYXNpZXIgdG8gYWRkLCBhbmQgbWFrZSBpdCBsZXNzIGxpa2VseSB0aGF0IHdlIGhhdmUgYnVncyBsZWZ0IGxpa2UgdGhlIFVSTC0KICBmcmVlIGJ1ZyBmcm9tIEF1Z3VzdCAyMy4KClZlcnNpb24gNy45LXByZTEKCkRhbmllbCAoMjkgQXVndXN0IDIwMDEpCi0gVGhlIG5ldyBjb29raWUgY29kZSBoYXZlIGVuYWJsZWQgdGhlIGJyYW5kIG5ldyAnLWMvLS1jb29raWUtamFyJyBvcHRpb24uIFVzZQogIHRoYXQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHlvdSB3YW50IHRvIGhhdmUgYWxsIGNvb2tpZXMgY3VybAogIGtub3dzIG9mLCBkdW1wZWQgdG8uIEl0J2xsIGJlIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQuCgogIFRoaXMgaXMgaW50ZXJuYWxseSBkb25lIHdpdGggdGhlIG5ldyBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gdG8gbGliY3VybCwKICB3aGljaCBpbiB0dXJuIGR1bXBzIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjdXJsX2Vhc3lfY2xlYW51cCgpIGlzIGludm9rZWQuCiAgVGhlcmUgbWlnaHQgYmUgcmVhc29ucyB0byByZS1jb25zaWRlciBteSBjaG9pY2Ugb2YgcHV0dGluZyBpdCB0aGVyZS4gUGVyaGFwcwogIGl0IGlzIGJldHRlciBwbGFjZWQgdG8gZ2V0IGRvbmUganVzdCBiZWZvcmUgKl9wZXJmb3JtKCkgaXMgZG9uZS4gSXQgaXMgYWxsCiAgb2YgY291cnNlIGRlcGVuZGluZyBvbiBob3cgeW91IGd1eXMgd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLi4uCgotIEFkZGVkIGZ0cHVwbG9hZC5jIGluIHRoZSBzb3VyY2UgZXhhbXBsZXMgc2VjdGlvbiwgYmFzZWQgb24gc291cmNlIGNvZGUgcG9zdGVkCiAgYnkgRXJpY2sgTnV3ZW5kYW0uCgpEYW5pZWwgKDI4IEF1Z3VzdCAyMDAxKQotIE5vdyBydW5uaW5nIGxpYnRvb2wgQ1ZTIGJyYW5jaC0xLTQgdG8gZ2VuZXJhdGUgc3R1ZmYuIFNob3VsZCBmaXggcHJvYmxlbXMKICBvbiBPcGVuQlNEIGFuZCBob3BlZnVsbHkgb24gRnJlZUJTRCBhcyB3ZWxsIQoKLSBHZW9yZyBIdWV0dGVuZWdnZXIgbW9kaWZpZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uYWxpdHkgc2xpZ2h0bHksIGFuZAogIGFkZGVkIHN1cHBvcnQgZm9yIGVycm9yIGNvZGUgNDE3IHdoZW4gZG9pbmcgZm9ybSBwb3N0IGFuZCB1c2luZyB0aGUgRXhwZWN0OgogIGhlYWRlci4gR3JlYXQgd29yayEKCi0gTWFkZSBzb21lIHRlc3RzIHdpdGggY2FjaGVkIFNTTCBzZXNzaW9uIElEcywgYW5kIHRoZXkgc2VlbSB0byB3b3JrLiBUaGVyZQogIHNob3VsZCBiZSBhIHNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50IGluIHRoZSBTU0wgY29ubmVjdGlvbiBwaGFzZSwgYnV0CiAgaW4gbXkgdGlueSB0ZXN0cyBpdCBqdXN0IGlzbid0IHBvc3NpYmxlIHRvIG5vdGljZSBhbnkgZGlmZmVyZW5jZS4gTGlrZSBvdGhlcgogIGNhY2hpbmcgaW4gbGliY3VybCwgeW91IG11c3QgcmV1c2UgdGhlIHNhbWUgaGFuZGxlIGZvciB0aGUgY2FjaGluZyB0byB0YWtlCiAgZWZmZWN0LiBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGlzIGRvbmUgb24gYSBwZXIgaG9zdC1uYW1lIGFuZCBkZXN0aW5hdGlvbgogIHBvcnQgbnVtYmVyIGJhc2lzLgoKICBTZXQgdmVyYm9zZSwgYW5kIHlvdSdsbCBnZXQgaW5mb3JtYXRpb25hbCB0ZXN0cyB3aGVuIGxpYmN1cmwgZGV0ZWN0cyBhbmQKICB1c2VzIGEgcHJldmlvdXMgU1NMIHNlc3Npb24gSUQuCgotIFVwZ3JhZGVkIHRvIGF1dG9tYWtlIDEuNSBvbiBteSBkZXZlbG9wbWVudC9yZWxlYXNlIG1hY2hpbmUuCgpEYW5pZWwgKDI3IEF1Z3VzdCAyMDAxKQotIFNsb3dseSBzdGFydGVkIHdyaXRpbmcgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggcmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncyBvbiB3aW5kb3dzIGFuZCB1cGRhdGVkIHRoZSBNUyBwcm9qZWN0CiAgZmlsZXMuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdHdvIGtpbmRzIG9mIGNvbW1hbmQgbGluZSBjb25zdHJ1Y3RzIHdpdGggdGhlIG5ldyAtRyB0aGF0CiAgY3VybCBkaWRuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGUgd2F5IG9uZSB3b3VsZCBsaWtlLgoKLSBUaW0gQ29zdGVsbG8gcGF0Y2hlZCBhd2F5IGEgdXNlIG9mIHN0cmNhc2VjbXAoKSBpbiB0aGUgU1NMIGNvZGUuIFdlIGhhdmUgb3VyCiAgb3duIHBvcnRhYmxlIHZlcnNpb24gbmFtZWQgc3RyZXF1YWwoKSB0aGF0IHNob3VsZCBiZSB1c2VkIQoKLSBUaW0gYWxzbyBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZS52YzYgZmlsZSB0aGF0IG1hZGUgaXQgbWl4CiAgZGVidWcgb2JqZWN0IG1vZHVsZXMgY2F1c2luZyBjb25mdXNpb25zLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIGFjY3VyYXRlbHkgZm91bmQgYSBsaWJjdXJsIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIGRvaW5nIGEKICBzZWNvbmQgaW52b2tlIG9mIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aCBhIG5ldyBVUkwgd2hlbiB0aGUgcHJldmlvdXMgaW52b2tlCiAgZm9sbG93ZWQgYSBMb2NhdGlvbjogaGVhZGVyLgoKLSBTdGFydGVkIHRoZSBpbXByb3ZlbWVudCB3b3JrIG9uIHRoZSBjb29raWUgZW5naW5lOgogIC0gTm93IGtlZXBzIGNvb2tpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNvb2tpZSBmaWxlCiAgLSBBIHdyaXRlIHRvIHRoZSBwb3NzaWJseSBzdGF0aWMgc3RyaW5nIHdhcyByZW1vdmVkCiAgLSBBZGRlZCBhIGZ1bmN0aW9uIHRoYXQgY2FuIG91dHB1dCBhbGwgY29va2llcwogIC0gTm93IHN1cHBvcnRzIHJlYWRpbmcgbXVsdGlwbGUgY29va2llIGZpbGVzCgotIFN0ZXZlIExob21tZSBjb3JyZWN0ZWQgYSBETEwgbmFtaW5nIGlzc3VlIGluIHRoZSBNU1ZDKysgcHJvamVjdCBmaWxlLgoKLSBTcGxpdCB1cCB0aGUgbW9uc3RlciBmdW5jdGlvbiBpbiBsaWIvZnRwLmMgdG8gdXNlIG1vcmUgc21hbGxpc2ggZnVuY3Rpb25zIHRvCiAgaW5jcmVhc2UgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyJ3MgYmlnIHBhdGNoIHdhcyBhcHBsaWVkLiBOb3cgd2UgaGF2ZToKICBvICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgc3VwcG9ydC4gV2Ugd2lsbCBmcm9tIG5vdyBvbiBzZW5kIHRoYXQgaGVhZGVyIGluCiAgICBhbGwgcmZjMTg2Ny1wb3N0cywgYXMgdGhhdCBtYWtlcyB1cyBhYm9ydCBtdWNoIGZhc3RlciB3aGVuIHRoZSBzZXJ2ZXIKICAgIHJlamVjdHMgb3VyIFBPU1QuIFBvc3Rpbmcgd2l0aG91dCB0aGUgRXhwZWN0OiBoZWFkZXIgaXMgc3RpbGwgcG9zc2libGUgaW4KICAgIHRoZSBzdGFuZGFyZCByZXBsYWNlLWludGVybmFsLWhlYWRlciBzdHlsZS4KICBvIGN1cmxfZm9ybWFkZCgpIGlzIGEgbmV3IGZvcm1wb3N0IGJ1aWxkaW5nIGZ1bmN0aW9uIHRoYXQgaXMgaW50cm9kdWNlZCB0bwogICAgcmVwbGFjZSB0aGUgbm93IGRlcHJlY2F0ZWQgY3VybF9mb3JtcGFyc2UoKSBmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbgogICAgd2lsbCBzdGlsbCBoYW5nIGFyb3VuZCBmb3IgYSB3aGlsZSwgYnV0IHRoZSBjdXJsX2Zvcm1hZGQoKSBpcyB0aGUgbmV3IHdheQogICAgYW5kIGNvcnJlY3Qgd2F5IHRvIGJ1aWxkIGZvcm0gcG9zdHMuCiAgbyBEb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzCgogIFRoZXNlIGNoYW5nZXMgYXJlIHJlYXNvbiBlbm91Z2ggdG8gbmFtZSB0aGUgbmV4dCBjdXJsIHJlbGVhc2UgNy45Li4uCgotIFdlIG5vdyBjb252ZXJ0IG1hbiBwYWdlcyB0byBIVE1MIHBhZ2VzIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlLiBGb3IgdGhlIHBsZWFzdXJlIG9mIGV2ZXJ5b25lIHdpdGhvdXQgbnJvZmYgd2l0aGluIHJlYWNoLgoKLSBBbmRy6XMgR2FyY+1hJ3Mgc3VnZ2VzdGVkIGZsdXNoaW5nIG9mIHRoZSBwcm9ncmVzcyBtZXRlciBvdXRwdXQgc3RyZWFtIHdhcwogIGFkZGVkLiBJdCBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbG9vayBiZXR0ZXIgb24gV2luZG93cy4KCi0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwKICBvbiBtYW55IFJlZCBIYXQgYm94ZXMhCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIFdlIG5lZWQgYW4gdXBkYXRlZCBsaWJ0b29sIHRvIG1ha2UgYSBiZXR0ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIE9wZW5CU0QKICBhcyB3ZWxsIGFzIEZyZWVCU0QKClZlcnNpb24gNy44LjEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gQnJhZCBwb2ludGVkIG91dCB0aGF0IHdlIHNoaXAgdHdvIGV4dHJhIGxpYnRvb2wgZmlsZXMgaW4gdGhlIHRhcmJhbGxzIHRoYXQKICB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byEgUmVtb3ZpbmcgdGhlbSBtYWtlcyB0aGUgZ3otYXJjaGl2ZSBhYm91dCA2MEsKICBzbWFsbGVyIQoKLSBBbGJlcnQgQ2hpbiBicm91Z2h0IGZpeGVzIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc29ja2xlbl90CiAgcHJvcGVybHkgYXMgd2VsbCBhcyBtb3ZpbmcgbG90cyBvZiBvdXIgY3VzdG9tIGF1dG9jb25mIG1hY3JvcyB0bwogIGFjaW5jbHVkZS5tNC4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDEpCi0gTW9vbmVzYW15IGltcHJvdmVkIGhpcyAtRyBmZWF0dXJlIGZvciBob3N0IG5hbWVzIG9ubHkgVVJMcy4uLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMSkKLSBGaW5hbGx5IGNsZWFuZWQgdXAgdGhlIGtlcmJlcm9zIGNvZGUgdG8gdXNlIEN1cmxfIHByZWZpeGVzIG9uIGFsbCBnbG9iYWwKICBzeW1ib2xzIGFuZCB0byBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuCgpWZXJzaW9uIDcuOC4xLXByZTYKCkRhbmllbCAoMTYgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGFkZGVkIHRoZSAtRyBvcHRpb24gdG8gY3VybCwgdGhhdCBjb252ZXJ0cyB0aGUgZGF0YSBzcGVjaWZpZWQKICB3aXRoIC1kIHRvIGEgR0VUIHJlcXVlc3QuIERlZmF1bHQgYWN0aW9uIHdoZW4gdXNpbmcgLWQgaXMgUE9TVC4gV2hlbiAtRyBpcwogIHVzZWQsIHRoZSAtZCBzcGVjaWZpZWQgZGF0YSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBVUkwgd2l0aCBhICc/JwogIHNlcGFyYXRvci4gQXMgc3VnZ2VzdGVkIHByZXZpb3VzbHkgYnkgS2V2aW4gUm90aC4KCi0gY3VybC1jb25maWcgLS1saWJzIHNob3VsZCBub3cgZGlzcGxheSBhbGwgbGlua2VyIG9wdGlvbnMgcmVxdWlyZWQgdG8gbGluawogIHdpdGggbGliY3VybC4gSXQgaW5jbHVkZXMgdGhlIHBhdGggYW5kIG9wdGlvbnMgZm9yIGxpYmN1cmwgaXRzZWxmLgogIGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpc3BsYXlzIHRoZSBjb21waWxlciBvcHRpb24ocykgbmVlZGVkIHRvIGNvbXBpbGUKICBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgbGliY3VybCBmdW5jdGlvbnMuIEJhc2ljYWxseSwgdGhhdCBzZXRzIHRoZSBpbmNsdWRlCiAgcGF0aCBjb3JyZWN0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMSkKLSBBcmthZGl1c3ogTWlza2lld2ljeiBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gaG93IElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzCiAgd2VyZSBwYXJzZWQgYW5kIHVzZWQuIChSRkMyNzMyLWZvcm1hdCkKCi0gQnVnICMxMjczMyBvdmVyIG9uIHBocC5uZXQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gbGliY3VybCB0aGF0IG1hZGUgaXQgY29yZQogIGR1bXAgaWYgeW91IHVzZWQgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBhbnkgZGF0YSB0byBwb3N0IHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMhIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiBOb3QgdXNpbmcgQ1VSTE9QVF9QT1NURklFTERTCiAgbm93IGVxdWFscyBzZXR0aW5nIGl0IHRvIG5vIGRhdGEgYXQgYWxsLgoKLSBSYW1hbmEgTW9ra2FwYXRpIHJlcG9ydGVkIHRoYXQgY3VybCB3aXRoICctdyAle2h0dHBfY29kZX0nIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgd2hlbiB1c2VkIGZvciBtdWx0aXBsZSBVUkxzIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZS4gSW5kZWVkLCB0aGUKICB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IGJldHdlZW4gdGhlIHJlcXVlc3RzLiBUaGlzIGlzIG5vdyBmaXhlZC4KCi0gRGF2aWQgSmFtZXMgZml4ZWQgdGhlIEJvcmxhbmQgbWFrZWZpbGUgc28gdGhhdCBsaWJjdXJsIHN0aWxsIGNvbXBpbGVzIGFuZAogIGJ1aWxkcyB3aXRoIHRoYXQgY29tcGlsZXIuCgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE9vcHMuIEkgcnVpbmVkIE5pY28ncyBzb2NrbGVuX3QgZGVmaW5lIGluIGNvbmZpZy12bXMuaCwgY29ycmVjdGVkIGl0IG5vdy4KCi0gQW4gb2xkZXIgaXRlbSBub3QgbWVudGlvbmVkIGhlcmUgYmVmb3JlOiBDVVJMX0dMT0JBTF9XSU4zMiBpcyBhIGRlZmluZSBmb3IKICB3aW5kb3dzIHVzZXJzIHRvIGN1cmxfZ2xvYmFsX2luaXQoKSwgdGhhdCBtYWtlcyBsaWJjdXJsIGluaXQgdGhlIHdpbnNvY2sKICBzdHVmZi4gSWYgbGliY3VybCBpcyBhbGwgc29ja2V0IHN0dWZmIHlvdSBkbywgdGhlbiBhbGxvd2luZyBpdCB0byBmaWRkbGUKICB3aXRoIHRoaXMgaXMgYSBjb21mb3J0YWJsZSBzaG9ydGN1dCB0byBmYW1lLgoKVmVyc2lvbiA3LjguMS1wcmU1CgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIG1vcmUgZmVlZGJhY2sgZnJvbSBoaXMgVk1TIHBvcnRpbmcgZWZmb3J0cyBhbmQgYSBmZXcKICBtaW5vciBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5LgoKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBzbyB0aGF0IC0tZW5hYmxlLWRlYnVnIHNldHMgbW9yZSBwaWNreSBnY2Mgb3B0aW9ucy4KICBJIHRoZW4gcmVtb3ZlZCBhbG1vc3QgYWxsIHRoZSBuZXcgd2FybmluZ3MgdGhhdCBhcHBlYXJlZCwgYW5kIGJ5IGRvaW5nIHNvIEkKICBjb3JyZWN0ZWQgdGhlIHNpemVfdC10cmVhdGVkLWFzLXNpZ25lZCBwcm9ibGVtIHRoYXQgaGFzIGJlZW4gZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdCBwcmV2aW91c2x5LiBJIGFsc28gcmVtb3ZlZCBhIGJ1bmNoIG9mIHRoZSBqdXN0IHJlY2VudGx5CiAgYWRkZWQgI2lmZGVmIFZNUyBsaW5lcy4KCi0gSSByZW1vdmVkIHRoZSB1c2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIFNTTCBjb2RlLiBJdCB3YXMgb25jZQogIG5lY2Vzc2FyeSBidXQgaGFzbid0IGJlZW4gbmVlZGVkIHNpbmNlIE9wZW5TU0wgMC45LjQuIFRoZSBvbGQgY29kZSBzaG91bGQKICAoaG9wZWZ1bGx5KSBzdGlsbCB3b3JrIGlmIGxpYmN1cmwgaXMgYnVpbHQgYWdhaW5zdCBhbiBhbmNpZW50IHZlcnNpb24gb2YKICBPcGVuU1NMLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwMSkKLSBQZXRlciBUb2RkIHBvc3RlZCBhIHBhdGNoIHRoYXQgbm93IGFsbG93cyBub24tZmlsZSByYzE4Njctc3R5bGUgZm9ybSBwb3N0cwogIHRvIGJlIGxhcmdlciB0aGFuIDRLLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgZml4ZWQgYnVncyBmb3IgYnVpbGRpbmcgZGVidWcgYW5kIFNTTCBsaWIgaW4gVkMgbWFrZWZpbGUKCkRhbmllbCAoOSBBdWd1c3QgMjAwMSkKLSBUaGUgcmVkaXJlY3RlZCBlcnJvciBzdHJlYW0gd2FzIGNsb3NlZCBiZWZvcmUgdGhlIGN1cmxfZWFzeV9jbGVhbnVwKCkgY2FsbAogIHdhcyBtYWRlLCBhbmQgd2hlbiBWRVJCT1NFIHdhcyBlbmFibGVkLCB0aGUgY2xlYW51cCBmdW5jdGlvbiB0cmllZCB0byB1c2UKICB0aGUgc3RyZWFtLiBJdCBjb3VsZCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBBbHNvLCB0aGUgc3RyZWFtIHdhcwogIGNsb3NlZCBldmVuIGlmIHdlIGxvb3BlZCB0byBnZXQgbW9yZSBmaWxlcy4gIENvcnJlY3RzIER1c3RpbiBCb3N3ZWxsJ3MgYnVnCiAgcmVwb3J0ICM0NDE2MTAKCi0gTm93IGdlbmVyYXRlcyB0aGUgcmVsZWFzZSBjb25maWd1cmUgc2NyaXB0IHdpdGggYXV0b2NvbmYgMi41MgoKVmVyc2lvbiA3LjguMS1wcmU0CgpEYW5pZWwgKDggQXVndXN0IDIwMDEpCi0gY3VybCAtRSB1c2VzIGEgY29sb24gdG8gc2VwYXJhdGUgYSBmaWxlIG5hbWUgZnJvbSBhIHBhc3NwaHJhc2UuIFRoaXMgdHVybmVkCiAgb3V0IHJlYWxseSBiYWQgZm9yIHRoZSB3aW5kb3dzIHBlb3BsZSB3aG8gd2FudHMgdG8gaW5jbHVkZSBhIGRyaXZlIGxldHRlciBpbgogIHRoZSBmaWxlIG5hbWUgbGlrZSAiYzpcY2VydC5wZW0iLiBUaGVyZSdzIG5vdyBhIHdpbjMyIHdvcmstYXJvdW5kCiAgaW1wbGVtZW50ZWQgdGhhdCB0cmllcyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBjb2xvbiBzZWVtcyB0byBiZSB1c2VkIGZvcgogIHRoaXMga2luZCBvZiBjb25zdHJ1Y3QuCgotIFBhdHJpY2sgQmloYW4tRmFvdSBpbnRyb2R1Y2VkIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIHdoaWNoIG1ha2VzIGN1cmwKICB2ZXJpZnkgdGhlIHNlcnZlcidzIENOIGZpZWxkIHdoZW4gdGFsa2luZyBodHRwczovLy4gSWYgLS1jYWNlcnQgaXMgbm90IHVzZWQsCiAgYW55IGZhaWx1cmVzIGluIG1hdGNoaW5nIGlzIG9ubHkgZGlzcGxheWVkIGFzIGluZm9ybWF0aW9uICgtdikuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDEpCi0gV3JvdGUgdXAgbmluZSBtb3JlIHRlc3QgY2FzZXMsIG1vcmUgb3IgbGVzcyBjb252ZXJ0ZWQgZnJvbSB0aGUgZm9ybWVyIHRlc3QKICBzdWl0ZS4KCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb3N0ZWQgYSBwYXRjaCB0aGF0IG1ha2VzICdjdXJsLWNvbmZpZyAtLWxpYnMnIGluY2x1ZGUgdGhlCiAgZGlyZWN0b3J5IGluIHdoaWNoIGxpYmN1cmwgaXRzZWxmIGlzIGluc3RhbGxlZCBpbi4gV2hpbGUgdGhpcyB3YXNuJ3QgbXkKICBpbml0aWFsIGludGVudGlvbiB3aXRoIHRoaXMgb3B0aW9uLCBpdCBtYWtlcyBzZW5zZSBhbmQgbWFrZXMgbGlua2luZyB3aXRoCiAgbGliY3VybCBlYXNpZXIuCgotIFN0ZWZhbiBVbHJpY2ggcG9pbnRlZCBvdXQgdG8gdXMgdGhhdCBvdGhlciB0b29scyBhbmQgbGlicmFyaWVzIHRyZWF0IGZpbGU6Ly8KICBVUkxzIHdpdGggb25seSBvbmUgc2xhc2ggYWZ0ZXIgdGhlIGhvc3QgbmFtZSBzbGlnaGx5IGRpZmZlcmVudCB0aGFuIGxpYmN1cmwKICBkb2VzLiBTaW5jZSBhbGwgdGhlIG90aGVycyBzZWVtIHRvIGFncmVlLCB3ZSBiZXR0ZXIgZm9sbG93IHRoZW0uCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIHVzIHdpdGggYSBodWdlIHNldCBvZiBmaXhlcyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQKICBidWlsZCB1bmRlciBPcGVuVk1TLgoKVmVyc2lvbiA3LjguMS1wcmUzCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSm9uYXRoYW4gSHNldSBub3RpY2VkIHRoYXQgeW91IGNvdWxkbid0IGdldCBhIGhlYWRlciBjYWxsYmFjayB1bmxlc3MgeW91CiAgc2V0IENVUkxPUFRfV1JJVEVIRUFERVIgdG8gbm9uLU5VTEwsIGV2ZW4gaWYgeW91IGRpZG4ndCBjYXJlIGFib3V0IHRoYXQKICBkYXRhLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoNSBBdWd1c3QgMjAwMSkKLSBTZXJnaW8gQmFsbGVzdHJlcm8gcHJvdmlkZWQgYSBwYXRjaCBmb3IgcmVhZGluZyByZXNwb25zZXMgZnJvbSBOQ1NBIGh0dHBkCiAgMS41Lnggc2VydmVycywgYXMgdGhleSByZXR1cm4gcmVhbGx5IHNjcmV3ZWQgdXAgcmVzcG9uc2UgaGVhZGVycyB3aGVuIGFza2VkCiAgZm9yIHdpdGggSFRUUCAxLjEuCgotIGN1cmxfZXNjYXBlKCkgbm8gbG9uZ2VyIHRyZWF0cyBhbHJlYWR5IGVuY29kZWQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKICBzdHJpbmcgZXNwZWNpYWxseS4KCkRhbmllbCAoMyBBdWd1c3QgMjAwMSkKLSBJIHJlcGxhY2VkIHRoZSBmb3JtZXIgbGliL2FycGFfdGVsbmV0LmggZmlsZSB3aXRoIG9uZSBJIHdyb3RlIG15c2VsZiwgdG8KICBhdm9pZCB0aGUgQlNEIGFubm91Y2VtZW50IGNsYXVzZSBvZiB0aGUgbGljZW5zZSBpbiB0aGUgZm9ybWVyIGZpbGUuCgotIEFuZHJldyBGcmFuY2lzIHByb3ZpZGVkIGEgbmV3IHZlcnNpb24gb2YgYmFzZTY0LmMgdG8gd29yayBhcm91bmQgdGhlIGxpY2Vuc2UKICBib2lsZXIgcGxhdGUgdGhhdCBjYW1lIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gSSBwYXRjaGVkIGl0LCBidXQgdGhlIGdsb3J5CiAgc2hvdWxkIGdvIHRvIEFuZHJldyBmb3IgaGlzIGhlYWRzIHVwLgoKLSBUb21hc3ogTGFja2kgbm90aWNlZCB0aGF0IHdoZW4geW91IGRvIHJlcGVhdGVkIHRyYW5zZmVycyB3aXRoIGxpYmN1cmwgeW91CiAgY291bGRuJ3QgYWx3YXlzIHJlbGlhYmx5IGNoYW5nZSBIVFRQIHJlcXVlc3QuIFRoaXMgaGFzIG5vdyBiZWVuIGZpeGVkIGFuZCBhCiAgbmV3IGxpYmN1cmwgb3B0aW9uIHdhcyBhZGRlZDogQ1VSTE9QVF9IVFRQR0VULCB0aGF0IGNhbiBmb3JjZSB0aGUgSFRUUAogIHJlcXVlc3RyIChiYWNrKSB0byBHRVQuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcG9pbnRlZCBvdXQgdGhhdCBodHRwc3NlcnZlci5wbCB3YXNuJ3QgaW5jbHVkZWQgaW4KICByZWxlYXNlIGFyY2hpdmVzLiBJdCBzaG91bGQgYmUgbm93LgoKRGFuaWVsICgyIEF1Z3VzdCAyMDAxKQotIEZyYW5rIEtlZW5leSBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXN0YWtlIGZvciBjZXJ0aWZpY2F0ZSBjb252ZXJ0aW9ucy4KCi0gVG9tYXN6IExhY2tpIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgdHJhbnNmZXIgbG9vcCB0aGF0IGNvdWxkIG1ha2UgdGhlCiAgc2VsZWN0KCkgbG9vcCB1c2UgZmFyIHRvbyBtdWNoIENQVS4KCi0gUGF3ZWwgQS4gR2FqZGEgcG9pbnRlZCBvdXQgYW4gb3V0cHV0IG1pc3Rha2UgZG9uZSB3aGVuIHVzaW5nIGxpYmN1cmwncwogIHByb2dyZXNzIGNhbGxiYWNrLgoKRGFuaWVsICgyOSBKdW5lIDIwMDEpCi0gTmF2ZWVuIE5vZWwgbm90aWNlZCB0aGF0IHRoZSBCb3JsYW5kIGxpYnJhcnkgbWFrZWZpbGUgd2Fzbid0IHVwZGF0ZWQuCgotIE5pYyBSb2V0cyBicm91Z2h0IGEgZml4IGZvciB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgU1NMLgoKRGFuaWVsICgyNyBKdW5lIDIwMDEpCi0gTWFkZSB0aGUgRlRQIHRlc3RzIHJ1biBPSyBldmVuIG9uIG1hY2hpbmVzIHJ1bm5pbmcgY3VybCBJUHY2LWVuYWJsZWQuCgotIFRyb3kgRW5nZWwgY29ycmVjdGVkIHNvbWUgUlBNIHBhY2thZ2UgZGV0YWlscy4KClZlcnNpb24gNy44LjEtcHJlMgoKRGFuaWVsICgyNSBKdW5lIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQgd2hlbiBkb3dubG9hZGluZwogIHNldmVyYWwgZmlsZXMgd2l0aCBjdXJsLCBhbmQgdXNpbmcgcmVzdW1lLiBUaGUgZmlyc3QgZmlsZSdzIHJlc3VtZSBpbmRleCB3YXMKICB0aGVuIHVzZWQgZm9yIGFsbCBmaWxlcywgcmVzdWx0aW5nIGluIHdlaXJkIHJlc3VsdHMuLi4KCi0gQW50b24gS2FsbXlrb3YgcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBjdXJsIHdvcmsgd2l0aCBmb3JtIGZpZWxkIG5hbWVzCiAgd2l0aCBzcGFjZXMgbGlrZSB3aGVuIC1GIGlzIHVzZWQuCgpWZXJzaW9uIDcuOC4xLXByZTEKCkRhbmllbCAoMjAgSnVuZSAyMDAxKQotIE1pa2UgQnl0bmFyIHByb3ZpZGVkIGEgZmluZSByZXBvcnQgdGhhdCBwcm92ZWQgdGhhdCB0aGUgLS13aXRoLXNzbCBvcHRpb24KICBmb3IgY29uZmlndXJlIG5lZWRlZCB0d2Vha2luZy4gSXQgbm8gbG9uZ2VyIHNlYXJjaGVzIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzCiAgZm9yIE9wZW5TU0wgbGlicyBvciBkaXJlY3RvcmllcyB3aGVuIGEgc3BlY2lmaWVkIHBhdGggaXMgZ2l2ZW4uCgpEYW5pZWwgKDE5IEp1bmUgMjAwMSkKLSBXaGVuIGFuIEZUUCB0cmFuc2ZlciBpcyBjdXQgb2ZmIGR1cmluZyB0cmFuc2ZlciwgY3VybCBjb3VsZCBwcmVzZW50IGEgdHJ1bHkKICBnYXJiYWdlZCBlcnJvciBtZXNzYWdlIGFuZCBpbiB3b3JzdCBjYXNlIGR1bXAgY29yZS4gVGhhbmtzIHRvIGRldGFpbGVkCiAgcmVwb3J0cyBmcm9tIFNoYXduIFBvdWxzb24gd2UgbmFpbGVkIHRoaXMuCgpEYW5pZWwgKDEyIEp1bmUgMjAwMSkKLSBTYWx2YWRvciBE4XZpbGEgcHJvdmlkZWQgYSBmaXggZm9yIEZUUCByYW5nZSBkb3dubG9hZHMuCgotIEFkZGVkIGEgZmV3IG1vcmUgdGVzdCBjYXNlcyBmcm9tIHRoZSBmb3JtZXIgdGVzdCBzdWl0ZSB0byB0aGUgbmV3IGZpbGUKICBmb3JtYXQuIFdlJ3JlIG5vdyBhdCBhIHRvdGFsIG9mIDI2IHRlc3RzLgoKRGFuaWVsICgxMSBKdW5lIDIwMDEpCi0gbGliY3VybCdzIHZlcnNpb24taW5mbyB3YXMgd3JvbmcsIGFzIG5vdGVkIGJ5IGJvdGggRG9tZW5pY28gQW5kcmVvbGkgYW5kCiAgRGF2aWQgT2Rpbi4KCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gSvZybiBmaXhlZCB0aGUgY3VybF91bmVzY2FwZSBkdXBsaWNhdGUgZW50cnkgaW4gbGliL2xpYmN1cmwuZGVmCgotIEkgbWFkZSBTU0wgY2VydGlmaWNhdGUgZmFpbHVyZSBtZXNzYWdlcyB0byBiZSBtb3JlIGRldGFpbGVkLgoKVmVyc2lvbiA3LjgKCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gU0RhdmlsYSBwcm92aWRlZCBhIHJlc3VtZWQgZG93bmxvYWQgZml4LgoKVmVyc2lvbiA3LjgtcHJlNAoKRGFuaWVsICgxIEp1bmUgMjAwMSkKLSBTdGVybGluZyBwcm92aWRlZCBzb21lIG5ldyBQSFAgZXhhbXBsZXMuCgotIENoYW5nZWQgdGhlIENWUyBoaWVyYXJjaHkgYW5kIHRoZSBvbGRlciBjaGVja291dCBpbnN0cnVjdGlvbiBkb2VzIG5vIGxvbmdlcgogIHdvcmsuIFdlIG1vdmVkIHRoZSBlbnRpcmUgc291cmNlIGNvZGUgaW50byBhIENWUyBtb2R1bGUgbmFtZWQgJ2N1cmwnLgoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBDVVJMT1BUX01VVEUgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSXQgaXMgc3RpbGwgcHJlc2VudCBpbiB0aGUgaW5jbHVkZSBmaWxlCiAgdG8gbm90IGNhdXNlIGNvbXBpbGVyIGVycm9ycyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIGl0LCBidXQgaXQgaXNuJ3QgdXNlZAogIGFueXdoZXJlIGluIHRoZSBsaWJyYXJ5LgoKVmVyc2lvbiA3LjgtcHJlMwoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBPbmNlIGFuZCBmb3IgYWxsIGZpeGVkIHRoZSBfUkVFTlRSQU5UIG1lc3MgZm9yIFNvbGFyaXMgY29tcGlsZXMgdG8gcHJlc2VudAogIGxlc3Mgd2FybmluZ3MuCgotIFN0ZXJsaW5nIEh1Z2hlcyB0aXJlbGVzc2x5IHBvaW50cyBvdXQgYW5kIGNvcnJlY3RzIG15IG1pc3Rha2VzLi4uISBTbywKICBjdXJsX2dsb2JhbF9pbml0KCkgbm93IGxldHMgdGhlIGFyZ3VtZW50IGZsYWdzICpTRVQqIHdoYXQgcGFydHMgdG8KICBpbml0LiBDVVJMX0dMT0JBTF9ERUZBVUxUIG1ha2VzIGEgbmljZSBkZWZhdWx0LCBDVVJMX0dMT0JBTF9BTEwgaW5pdHMgYWxsCiAga25vd24gc3Vic3lzdGVtcyBhbmQgQ1VSTF9HTE9CQUxfTk9ORSBpbml0cyBub3RoaW5nIG1vcmUgdGhhbiBhYnNvbHV0ZWx5CiAgbmVjZXNzYXJ5LiBNYW4gcGFnZSB1cGRhdGVkIGFjY29yZGluZ2x5LgoKLSBGaXhlZCB0aGUgc3RydG9rLmggaW5jbHVkZSBmaWxlIGFzIGl0IHdvdWxkbid0IGNvbXBpbGUgb24gYWxsIHBsYXRmb3JtcyEKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gTWFkZSBsaWJjdXJsIGJ5IGRlZmF1bHQgYWN0IGFzIGlmIENVUkxPUFRfTVVURSBhbmQgQ1VSTE9QVF9OT1BST0dSRVNTIHdlcmUKICBzZXQgVFJVRS4gU2V0IHRoZW0gdG8gRkFMU0UgdG8gbWFrZSBsaWJjdXJsIG1vcmUgdGFsa2F0aXZlLiBUaGUgKl9NVVRFCiAgb3B0aW9uIGlzIHN1YmplY3QgZm9yIGNvbXBsZXRlIHJlbW92YWwuLi4KClZlcnNpb24gNy44LXByZTIKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHdyb3RlIGEgbWFrZWZpbGUgZm9yIGJ1aWxkaW5nIFNvbGFyaXMgcGFja2FnZXMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBicm91Z2h0IGZpeGVzIGZvciAnYnVpbGRjb25mJyAodGhlIGJ1aWxkLWZyb20tQ1ZTIHRvb2wpIGFuZAogIHdlIGRpc2N1c3NlZCBhbmQgYWRkZWQgYSBmZXcgQ1VSTF9HTE9CQUxfKiBmbGFncyBpbiBpbmNsdWRlL2N1cmwuaAoKLSBLamV0aWwgSmFjb2JzZW4gcHJpdmF0ZWx5IGFubm91bmNlZCBoaXMgcHl0aG9uIGludGVyZmFjZSB0byBsaWJjdXJsLAogIGF2YWlsYWJsZSBhdCBodHRwOi8vcHljdXJsLnNvdXJjZWZvcmdlLm5ldC8KCkRhbmllbCAoMjkgTWF5IDIwMDEpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgc3RydG9rKCkgcHJvYmxlbSBpbiBsaWJjdXJsLiBJdCBpcyBub3QgYSB0aHJlYWQtCiAgc2FmZSBmdW5jdGlvbi4gTm93IGNvbmZpZ3VyZSBjaGVja3MgZm9yIGEgdGhyZWFkLXNhZmUgdmVyc2lvbiwgYW5kCiAgbGliL3N0cnRvay5jIG9mZmVycyBvbmUgZm9yIHRoZSBzeXN0ZW1zIHRoYXQgZG9uJ3QgY29tZSB3aXRoIG9uZSBpbmNsdWRlZCEKCi0gTWV0dGd1dCBKYW1hbGxhIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2FzIHdyaXR0ZW4KICB0byBzdGRlcnIgZXZlbiB0aG91Z2ggLS1zdGRlcnIgcmVkaXJlY3Rpb24gd2FzIHVzZWQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSSBtb3ZlZCBvdXQgdGhlIGxpc3Qgb2YgY29udHJpYnV0b3JzIGZyb20gdGhlIGN1cmwuMSBtYW4gcGFnZSBhbmQgbWFkZSBhCiAgc2VwYXJhdGUgZG9jcy9USEFOS1MgZmlsZS4gSXQgbWFrZXMgdGhlIGxpc3QgZWFzaWVyIHRvIGZpbmQsIGFuZCBtYWRlIGl0CiAgZWFzaWVyIGZvciBtZSB0byBtYWtlIGEgc2VwYXJhdGUgd2ViIHBhZ2Ugd2l0aCB0aGF0IHNhbWUgaW5mb3JtYXRpb24uCgogIEkgcmVhbGx5IGRvIHdhbnQgYWxsIHlvdSBndXlzIG1lbnRpb25lZCBpbiB0aGVyZSB0byBmZWVsIHlvdSBnZXQgdGhlIGNyZWRpdAogIHlvdSBkZXNlcnZlLgoKLSBsaWIvZWFzeS5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IGluIHRoZSA3LjgtcHJlMSBkdWUgdG8gYSBzaWxseSBtaXN0YWtlCgpWZXJzaW9uIDcuOC1wcmUxCgpEYW5pZWwgKDI4IE1heSAyMDAxKQotIGN1cmwtY29uZmlnIG5vdyBzdXBwb3J0cyAnLS12ZXJudW0nIHRoYXQgb3V0cHV0cyBhIHBsYWluIGhleGFkZWNpbWFsIHZlcnNpb24KICBvZiB0aGUgbGliY3VybCB2ZXJzaW9uIG51bWJlciAodXNpbmcgOCBiaXRzIGZvciBlYWNoIDMgbnVtYmVycykuIFZlcnNpb24KICA3LjcuNCBhcHBlYXJzIGFzIDA3MDcwNAoKLSBXcm90ZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2xvYmFsX2luaXQgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAuLi4KCi0gVC4gQmhhcmF0aCBicm91Z2h0IG5ld3MgYWJvdXQgdGhlIHVzYWdlIG9mIHRoZSBPcGVuU1NMIGludGVyZmFjZSB0aGF0IHdhcwogIG5vdCBwcmV2aW91c2x5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhbmQgdGh1cyBjYXVzZWQgbGliY3VybCB0byBsZWFrCiAgbWVtb3J5LiAgVGhlIG9ubHkgc29tZXdoYXQgc2FuZSBhcHByb2FjaCB0byBmaXggdGhpcyBkaWxlbW1hLCBpcyBhZGRpbmcgdHdvCiAgdHdvIG5ldyBmdW5jdGlvbnMgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgdGhhdCBzaG91bGQKICBiZSBjYWxsZWQgKk9OQ0UqIGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZyBsaWJjdXJsLiBUaGUgaW5pdCBzaG91bGQgYmUgZG9uZQogIG9ubHkgYXQgc3RhcnR1cCwgbm8gbWF0dGVyIGhvdyBtYW55IHRocmVhZHMgdGhlIGFwcGxpY2F0aW9uIGlzIGdvbm5hIHVzZSwKICBhbmQgdGhlIGNsZWFudXAgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgZmluaXNoZWQgdXNpbmcKICBsaWJjdXJsIGNvbXBsZXRlbHkuCgogICoqKiBVUEdSQURFIE5PVElDRSAqKioKCiAgSWYgeW91IHdyaXRlIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJjdXJsLCB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSB0d28KICBmdW5jdGlvbnMgbWVudGlvbmVkIGFib3ZlICEhIQoKICBJIGNhbid0IHNheSBJIHRoaW5rIHRoaXMgaXMgYSB2ZXJ5IGJlYXV0aWZ1bCBzb2x1dGlvbiwgYnV0IGFzIE9wZW5TU0wKICBpbnNpc3RzIG9uIG1ha2luZyBsb3RzIG9mIHN0dWZmIG9uIGEgImdsb2JhbCIgc2NvcGUsIHdlJ3JlIGZvcmNlZCB0byB3YWxrCiAgdGhlIHBhdGggdGhleSBwb2ludCB1cyB0by4KCi0gTW92aW5nIG1vcmUgdGVzdCBjYXNlcyBpbnRvIHRoZSBuZXcgZmlsZSBmb3JtYXQuCgpWZXJzaW9uIDcuNy40LXByZTMKCkRhbmllbCAoMjMgTWF5IDIwMDEpCi0gSW50cm9kdWNlZCBhIG5ldyBmaWxlIGZvcm1hdCBmb3Igc3RvcmluZyB0ZXN0IGNhc2VzLCBhbmQgdGh1cyBJIGhhZCB0bwogIG1vZGlmeSBhbGwgdGhlIHBlcmwgdGVzdCBzY3JpcHRzIGFuZCBtb3JlIChJIGFkZGVkIGEgbmV3IG9uZSkuIEkgaGF2ZSBub3QKICAicG9ydGVkIiBhbGwgdGhlIG9sZCB0ZXN0IGNhc2VzIHRvIHRoZSBuZXcgZm9ybWF0IHlldCwgYnV0IGl0J2xsIGNvbWUuCgogIFRoZSBtYWluIGFkdmFudGFnZSBvZiB0aGlzIG5ldyBmb3JtYXQgaXMgdGhhdCBhbGwgdGVzdCBkYXRhIGZvciBlYWNoIHRlc3QKICBjYXNlIGlzIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLiBJdCBnaXZlcyBhIGJldHRlciBvdmVydmlldyBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBhbmQgYSBsb3QgbGVzcyBmaWxlcy4KCi0gQW5kculzIEdhcmPtYSBicm91Z2h0IGEgZml4IGZvciB0aGUgbmV0c2NhcGUvbW96aWxsYSBjb29raWUgZmlsZSBwYXJzaW5nCiAgZnVuY3Rpb24sIGFzIGl0IHR1cm5zIG91dCBpdCBkb2Vzbid0IGFsd2F5cyBzdG9yZSB0aGUgcGF0aCEKCkRhbmllbCAoMjIgTWF5IDIwMDEpCi0gQXMgd2FzIHJlcG9ydGVkIGFub255bW91c2x5LCB3aGVuIEZBSUxPTkVSUk9SIHdhcyB1c2VkLCB0aGUgaHR0cGNvZGUgd2FzCiAgbm90IHN0b3JlZCBwcm9wZXJseSBhbmQgdGh1cyB3YXNuJ3QgcG9zc2libHkgdG8gcmVhZCBhZnRlciBhIHRyYW5zZmVyIHdpdGgKICB0aGUgY3VybF9lYXN5X2dldGluZm8oKSBmdW5jdGlvbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJbnN0YWxsZWQgYW5kIG1hZGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgdG9vbCB2ZXJzaW9uczoKICAgIGF1dG9jb25mIDIuNTAKICAgIGxpYnRvb2wgMS40CiAgICBhdXRvbWFrZSAxLjQtcDEKCiAgSSB3b3VsZG4ndCByZWNvbW1lbmQgYW55IGRldmVsb3BlciB0byB0cnkgdG8gZ2VuZXJhdGUgdGhpbmdzIHdpdGggb2xkZXIKICB2ZXJzaW9ucyB0aGFuIHRoZXNlLiBCdWlsZGluZyBmcm9tIENWUyB3aWxsIHByb2JhYmx5IG1vcmUgb3IgbGVzcyByZXF1aXJlCiAgYXQgbGVhc3QgdGhlc2UgdmVyc2lvbnMuCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IGdyZXcgdG8gbW9yZSB0aGFuIGRvdWJsZSBpdHMKICBwcmV2aW91cyBzaXplIQoKICBBcmthZGl1c3ogTWlza2lld2ljeiBoZWxwZWQgbWUgYnkgcG9pbnRpbmcgb3V0IEkgaGFkIHRvIHJlbW92ZSBteQogIGFjaW5jbHVkZS5tNCBmaWxlIGJlZm9yZSBJIGNvdWxkIGdldCBpdCB3b3JraW5nIQoKRGFuaWVsICgyMSBNYXkgMjAwMSkKLSBJIG1hZGUgZnRwczovLyB3b3JrLiBBZGRlZCB0ZXN0IGNhc2UgNDAwIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUsIGFzIHRoZQogIGZpcnN0IGZ0cHM6Ly8gdGVzdCBjYXNlLiBSZXF1aXJlcyBzdHVubmVsLgoKLSBBbHNvIG1hZGUgdGhlIHRlc3QgY2FzZXMgdGhhdCBydW5zIHNzbCB0ZXN0cyBub3QgcnVuIGlmIGxpYmN1cmwgaXNuJ3QgYnVpbHQKICB3aXRoIHNzbCBzdXBwb3J0LgoKRGFuaWVsICgxOSBNYXkgMjAwMSkKLSBNYWRlIHRoZSBjb25maWd1cmUgbm90IGFkZCBhbnkgZXh0cmEgLUwgTERGTEFHUyBvciAtSSBDUFBGTEFHUyB1bmxlc3MgdGhleQogIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFsYmVydCBDaGluJ3MgYW5kIERvbWVuaWNvIEFuZHJlb2xpJ3Mgc3VnZ2VzdGlvbnMKICBoZWxwZWQgb3V0LgoKVmVyc2lvbiA3LjcuNC1wcmUyCgpEYW5pZWwgKDE4IE1heSAyMDAxKQotIE5pY2VyIGNvbmZpZ3VyZS1jaGVjayBmb3IgdGhlIE9wZW5TU0wgaGVhZGVycywgd2hpY2ggdGhlbiBzZXRzIHRoZSBwcm9wZXIKICB2YXJpYWJsZSB0byBoYXZlIGN1cmwtY29uZmlnIGJlIGdvb2QuIChBbGJlcnQgQ2hpbiBwcm92aWRlZCB0aGUgZml4KQoKLSBGb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhlaXcgb3duICdzdHJsY2F0KCknIGxpYmN1cmwgcHJvdmlkZXMgaXRzIG93bi4KICBJdCB3YXMgbm93IHJlbmFtZWQgdG8gcHJldmVudCBjb2xsaWRlcyB3aXRoIG90aGVyIGxpYnMuIChBZnRlciBkaXNjdXNzaW9ucwogIHdpdGggU3RlcmxpbmcgSHVnaGVzIGFuZCB0aGUgaW1wbGljYXRpb25zIHRoaXMgaGFkIG9uIFBIUCBidWlsZHMuKQoKRGFuaWVsICgxNyBNYXkgMjAwMSkKLSBDb2xtIEJ1Y2tsZXkgcG9zdGVkIGEgZGV0YWlsZWQgYnVnIHJlcG9ydCBvbiAodGhlIGRlYmlhbml6ZWQpIDcuNy4zLCB0aGF0CiAgdHVybmVkIG91dCB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgZGViaWFuLWJ1aWx0IDcuNy4zLXBhY2thZ2UgdGhhdAogIGNvbnRhaW5lZCBmaWxlcyBmcm9tIHRoZSA3LjcuMiByZWxlYXNlIQoKLSBJIGFkZGVkIHRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGFnYWluLCBidXQgd2l0aCBhIGZha2UgdmFsdWUsIGp1c3QgdG8KICBtYWtlIHByb2dyYW1zIHRoYXQgdXNlIGl0LCBub3QgZmFpbCB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoaXMgdmVyc2lvbiBvZgogIGxpYmN1cmwuCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIFBhd2VsIEEuIEdhamRhIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgdHJhbnNmZXJzIG9uIHJlLXVzZWQgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKVmVyc2lvbiA3LjcuNC1wcmUxCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaXhlZCBGVFAgUE9SVCBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmwuCgotIEFkZGVkIHRoZSBmaXJzdCBIVFRQUyB0ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDEyIE1heSAyMDAxKQotIEp1a2thIFBpaGwgc3VnZ2VzdGVkIHRoYXQgaWYgKGxpYiljdXJsIGlzIHRvbGQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MKICBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHBlZXIgY2FuJ3QgYmUgdmVyaWZpZWQsIGl0IHNob3VsZCBmYWlsIGFuZCByZXR1cm4gYQogIHByb3BlciBlcnJvciBjb2RlLiBJIGFkZGVkIGEgYnJhbmQgbmV3IGVycm9yIGNvZGUgbmFtZWQKICBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMSBNYXkgMjAwMSkKLSBBcyB3YXMgZGlzY3Vzc2VkIHdpdGggRnJlZGVyaWMgTGVwaWVkIGEgd2hpbGUgYWdvLCBJIG5vdyBtYWRlIGxpYmN1cmwgbm90CiAgcmV0dXJuIGVycm9yIGV2ZW4gdGhvdWdoIG5vIGRhdGEgd2FzIHRyYW5zZmVyZWQgb24gdXBsb2FkL2Rvd25sb2FkIHJlc3VtZQogIHdoZW4gdGhlIG5vIHRyYW5zZmVyIGlzIG5lZWRlZC4gVGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgZXJyb3Igd2FzIHJlbW92ZWQKICBmcm9tIHRoZSBoZWFkZXIgZmlsZSB0byBtYWtlIGFueSBpbXBsZW1lbmF0b3IgdGhhdCB1c2VzIHRoYXQgdG8gYmUgYXdhcmUgb2YKICB0aGUgZmFjdCB0aGF0IGl0IGNhbid0IGJlIHJldHVybmVkIGFueW1vcmUhCgotIEltcHJvdmVkIGdlbmVyYWwgaGVhZGVyLXBhcnNpbmcgdG8gYmV0dGVyIGFsbG93IHdoaXRlIHNwYWNlcyBhbmQgbW9yZS4KCi0gUm9kbmV5IFNpbW1vbnMgcHJvdmVkIHRoZSBmaXggSSBkaWQgeWVzdGVyZGF5IHdhcyBiYWQgYW5kIEkgaGFkIHRvIHBvc3QKICBhbm90aGVyIG9uZS4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IHR3byByZWRpcmVjdCBwcm9ibGVtcyBtb3JlIQoKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQoKRGFuaWVsICg3IE1heSAyMDAxKQotIENvcnJlY3RlZCB0d28gbWlub3IgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRoZSBGSUxFICogdG8gdm9pZCAqIGNvbnZlcnNpb24KICB0aGF0IEkgbWlzc2VkIGF0IHR3byBwbGFjZXMuIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBwYXRjaGVzLiBTYW5kZXIgR2F0ZXMKICBmaWxlZCBhIGJ1ZyByZXBvcnQgb24gdGhpcy4KClZlcnNpb24gNy43LjMKCkRhbmllbCAoNCBNYXkgMjAwMSkKLSBBbGwgY2FsbGJhY2sgZnVuY3Rpb25zIG5vdyB0YWtlICd2b2lkIConIGluc3RlYWQgb2YgJ0ZJTEUgKicuIFRoaXMgaXMgbWFkZQogIHRoaXMgd2F5IHRvIG1ha2UgaXQgbW9yZSBvYnZpb3VzIHRvIHBlb3BsZSB0aGF0IGFueXRoaW5nIGNhbiBiZSBwYXNzZWQgdG8KICB0aGVtIChieSB1c2luZyB0aGUgYXByb3ByaWF0ZSBvcHRpb24pLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFN0ZXJsaW5nCiAgSHVnaGVzLgoKRGFuaWVsICgzIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHRoYXQgbWFkZSBsaWJjdXJsIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB1c2VkIG1peGVkCiAgY2h1bmtlZCBhbmQgbm9uLWNodW5rZWQgdHJhbnNmZXJzLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBiYWQgdHJlYXRtZW50IG9mIDMwNC1yZXBsaWVzLCBhcyB0aGV5IHdvdWxkIG5vdCBiZQogIHRyZWF0ZWQgYXMgY29udGVudC1sZW5ndGggMCByZXBsaWVzIGJ1dCB3b3VsZCBjYXVzZSBhICJoYW5nIiB1bnRpbCB0aGUKICBzZXJ2ZXIgdGltZWQtb3V0IGFuZCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGRvY3MvZXhhbXBsZXMvTWFrZWZpbGUuYW0KCkRhbmllbCAoMjcgQXByaWwgMjAwMSkKLSBVcGRhdGVkIHRoZSBJTlRFUkFMUyBkb2N1bWVudCBhZ2Fpbi4gSXQgd2FzIGxhZ2dpbmcgYSBiaXQuIEkgdGhpbmsgSSBtYWRlIGl0CiAgbW9yZSBlYXN5IHRvIGZvbGxvdyBub3cgYXMgd2VsbC4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBjdXJsIHJlY2VpdmVkCiAgYSAiQ29udGVudC1MZW5ndGg6IDAiIGhlYWRlci4KCi0gR2l1c2VwcGUgRCdBbWJyb3NpbyB3YXMgZmlyc3Qgb3V0IHRvIHJlcG9ydCB0aGF0IFRFTE5FVCBkb2Vzbid0IHdvcmsgaW4gY3VybAogIGNvbXBpbGVkL2J1aWx0IG9uIHdpbjMyLiBJdCBzZWVtcyB0byB3b3JrIGZvciB1bml4ZXMgdGhvdWdoIQoKLSBEYXZlIEhhbWlsdG9uIHJlcG9ydGVkIHdlaXJkIHByb2JsZW1zIHdpdGggQ1VSTC9QSFAgdGhhdCBJIHJlYWxseSBjYW4ndAogIGV4cGxhaW4gYXQgdGhlIG1vbWVudC4gSSdtIGhvcGluZyBvbiBzb21lIGhlbHAgZnJvbSB0aGUgUEhQIGNyZXcuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDEpCi0gSSByZXdyb3RlIHRoZSBGVFAgY29tbWFuZCByZXNwb25zZSBmdW5jdGlvbi4gSSBoYWQgdG8gZG8gaXQgdG8gbWFrZSBmdHBzCiAgd29yaywgYXMgdGhlIE9wZW5TU0wgcmVhZCgpLWZ1bmN0aW9uIGRpZG4ndCB3b3JrIHRoZSBzYW1lIHdheSB0aGUgbm9ybWFsCiAgdW5peCByZWFkKCkgZG9lcywgYnV0IGl0IHdhcyBhbHNvIGEgaHVnZSBwZXJmb3JtYW5jZSBib29zdC4gUHJldmlvdXNseSB0aGUKICBmdW5jdGlvbiByZWFkIG9uZSBieXRlIGF0IGEgdGltZSwgbm93IGl0IHJlYWRzIHZlcnkgbGFyZ2UgY2h1bmtzLCBhbmQgaXQKICBtYWtlcyBhIG5vdGFibGUgc3BlZWQgZGlmZmVyZW5jZS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMSkKLSBDb25uZWN0aW9uIHJlLXVzZSB3aGVuIG5vdCB1c2luZyBhIHByb3h5IGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvcgogIG5vbi1kZWZhdWx0IHBvcnQgbnVtYmVycy4KCkRhbmllbCAoMjQgQXByaWwgMjAwMSkKLSBJJ3ZlIG5vdGljZWQgdGhhdCBGVFBTIGRvZXNuJ3Qgd29yay4gV2UgYXR0ZW1wdCB0byB1c2Ugc3NsIGV2ZW4gZm9yIHRoZQogIGRhdGEgdHJhbnNmZXIsIHdoaWNoIGNhdXNlcyB0aGUgdHJhbnNmZXIgdG8gJ2hhbmcnLi4uIFdlIG5lZWQgdG8gZml4IHRoaXMuCgotIEltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIHVzZSAnc3R1bm5lbCcgdG8gZG8gSFRUUFMgYW5kIEZUUFMgdGVzdGluZyBvbgogIHRoZSBhbHJlZHkgd3JpdHRlbiBwZXJsIHNlcnZlcnMgZWFzaWx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDAxKQotIFRoZSBPcGVuU1NMIHZlcnNpb24gc3RyaW5nIHJlY2VudGx5IG1vZGlmaWVkIGRpZG4ndCB6ZXJvIHRlcm1pbmF0ZSBvbmUKICBvZiB0aGUgZ2VuZXJhdGVkIHN0cmluZ3MgcHJvcGVybHksIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjcmFzaCBvciBzaW1wbHkKICB3ZWlyZCB2ZXJzaW9uIHN0cmluZyBvdXRwdXQhCgpWZXJzaW9uIDcuNy4yCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDEpCi0gUm9zaW1pbGRvIGRhIFNpbHZhIHVwZGF0ZWQgdGhlIE1ha2VmaWxlcyBmb3IgQm9ybGFuZC9XaW5kb3dzLgoKLSBFcmljIFJhdXRtYW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB0aGF0IHdvdWxkCiAgbGVhZCB0byBicm9rZW4gSG9zdDogaGVhZGVycyBpbiB0aGUgc2Vjb25kIEhUVFAgcmVxdWVzdC4KCkRhbmllbCAoMjAgQXByaWwgMjAwMSkKLSBBZGRlZCBtYW4gcGFnZXMgZm9yIHRoZSBjdXJsX3N0cmVxdWFsKCkgYW5kIGN1cmxfbXByaW50ZigpIGZhbWlsaWVzLiBXcm90ZQogIGEgJ2xpYmN1cmwgb3ZlcnZpZXcnIG1hbiBwYWdlLgoKLSBTcGVsbC1maXhlZCBzb21lIGRvY3VtZW50cy4KCi0gUy4gTW9vbmVzYW15IGNvcnJlY3RlZCBtaXN0YWtlcyBpbiB0aGUgbWFuIHBhZ2UuCgotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgY3VybF9zbGlzdHMgb3B0aW9ucyBpbiB0aGUgcGVybCBpbnRlcmZhY2UsIHByZXNlbnQKICBzZXBhcmF0ZWx5IGluIHRoZSBDdXJsOjplYXN5IDEuMS40IHBhY2thZ2UuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZW1vdmVkIHRoZSBkZWNpbWFscyBmcm9tIHRoZSBzaXplIHZhcmlhYmxlcyBpbiB0aGUKICAtLXdyaXRlLW91dCBvdXRwdXQuIFdlIGhhcmRseSBldmVyIGdldCBmcmFjdGlvbiBvZiBieXRlcyEgOi0pCgpWZXJzaW9uIDcuNy4yLXByZTEKCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggZm9yIHRoZSBBQ19TWVNfTEFSR0VGSUxFIG1hY3JvLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAxKQotIElucHV0IGZyb20gTWljaGFlbCBNZWFsbGluZyBtYWRlIG1lIGFkZCAtLWZlYXR1cmUgdG8gY3VybC1jb25maWcuIEl0CiAgZGlzcGxheXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LWluIGluIHRoZSBjdXJyZW50CiAgbGliY3VybC4gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZmVhdHVyZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGFyZTogU1NMLCBLUkI0CiAgYW5kIElQdjYuCgotIEkgY29tbWl0dGVkIENyaXMgYW5kIEdlb3JnJ3MgcGVybCBpbnRlcmZhY2Ugd29yay4gVGhleSd2ZSBnb3QgY2FsbGJhY2tzCiAgd29ya2luZyBhbmQgb3B0aW9ucyB0aGF0IHJlY2VpdmVzIHRob3NlIHNsaXN0IHBvaW50ZXJzLgoKLSBQdW5lZXQgUGF3YWlhIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgZG93bmxvYWRzIHRoYXQgdXNlIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucyBhbmQgSSBtYWRlIGEgcmF0aGVyIGxhcmdlIHdyaXRldXAgdG8gY29ycmVjdCB0aGlzLiBJdCBpcwogIGltcG9ydGFudCB0aGF0IGFsbCBzZXNzaW9uLWRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYW5kIG5vdAogIGluIHRoZSBtYWluIHN0cnVjdCBhcyB0aGlzIHByZXZpb3VzbHkgZGlkLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAxKQotIEZyZWRlcmljIExlcGllZCBmaXhlZCBhIGZ0cCByZXN1bWVkIGRvd25sb2FkIHByb2JsZW0gYW5kIGludHJvZHVjZWQgYSBuZXcKICBlcnJvciBjb2RlIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBhIHJlc3VtZWQgZG93bmxvYWQKICBhY3R1YWxseSBkaWRuJ3QgZG93bmxvYWQgYW55dGhpbmcgc2luY2UgdGhlIHdob2xlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50LgogIFNob3VsZCB0aGlzIHJldHVybiBPSyBpbnN0ZWFkPwoKLSBJIGFkZGVkICdjdXJsLWNvbmZpZy5pbicgdG8gdGhlIHJvb3QgZGlyIGFuZCBjb25maWd1cmUgc2NyaXB0LiBOb3csIGEKICBjdXJsLWNvbmZpZyBzY3JpcHQgaXMgbWFkZSB3aGVuIGN1cmwgaXMgYnVpbHQuIFRoZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8KICBmaWd1cmUgb3V0IGNvbXBpbGUgdGltZSBvcHRpb25zIHVzZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCwgd2hpY2ggaW4gdHVybgogIHNob3VsZCBiZSBvcHRpb25zIFlPVSBzaG91bGQgdXNlIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBsaWJjdXJsLgoKICBUaGlzICotY29uZmlnIHN0eWxlIGlzIG5vdCBhIG5ldyBpZGVhLCBidXQgc29tZXRoaW5nIHRoYXQgaGFzIGJlZW4gdXNlZAogIHN1Y2Nlc3NmdWxseSBpbiBvdGhlciAobGlicmFyeSBiYXNlZCkgcHJvamVjdHMuCgotIFBoaWwgS2FybiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd3JvbmdseSBkaWQgbm90IGFsd2F5cyB1c2UgR01UIHRpbWUgem9uZQogIGZvciB0aGUgSWYtTW9kaWZpZWQtU2luY2Ugc3R5bGUgaGVhZGVycy4KCi0gR2VvcmcgU2Nod2FyeiBwb2ludGVkIG91dCBhbiBleHRyYSBuZWVkZWQgI2luY2x1ZGUgZmlsZSBuZWVkZWQgaW4gc3JjL21haW4uYwogIGZvciBjdXJsIHRvIGJ1aWxkIG9uIFVsdHJpeC4KCkRhbmllbCAoMTEgQXByaWwgMjAwMSkKLSBDcmlzIEJhaWxpZmYgcG9pbnRlZCBvdXQgdHdvIHByb2JsZW1zIHRoYXQgSSBjb3JyZWN0ZWQuIEZpcnN0LCBsaWJjdXJsJ3MgdXNlCiAgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhUVFBfUFJPWFkgaW4gdXBwZXJjYXNlIG1heSBiZWNvbWUgYSBzZWN1cml0eQogIGhhemFyZCB3aGVuIHBlb3BsZSB1c2UgbGliY3VybCBpbiBhIHNlcnZlci9jZ2kgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZXJ2ZXIKICBzZXRzIHRoZSBIVFRQXyotdmFyaWFibGVzIGFjY29yZGluZyB0byBpbmNvbWluZyBoZWFkZXJzIGluIHRoZSBIVFRQCiAgcmVxdWVzdC4gVGh1cywgYSAiUHJveHk6Ii1oZWFkZXIgd291bGQgc2V0IHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUhCgogIFRoZW4sIGludm9raW5nIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aG91dCBoYXZpbmcgYW4gVVJMIHNldCBjYXVzZWQgYSBjcmFzaC4KCi0gUy4gTW9vbmVzYW15IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgY3VybCB1c2Ugbm9uLWJsb2NraW5nIGNvbm5lY3RzIG9uCiAgd2luZG93cyB3aGVuIGNvbm5lY3Rpb24gdGltZW91dCBpcyBzZXQsIGFzIGl0IGFsbG93cyB3aW5kb3dzIHVzZXJzIHRvIHNldAogIHRoYXQgdGltZW91dCEKCi0gSGlyb3Rha2EgTWF0c3V5dWtpIHdyb3RlIGEgUnVieSBpbnRlcmZhY2UgdG8gbGliY3VybCEKCi0gQ3JpcyBCYWlsaWZmLCBGb3JyZXN0IENhaG9vbiBhbmQgR2VvcmcgSG9ybiB3b3JrIG9uIHRoZSBQZXJsIGludGVyZmFjZS4KCi0gSSd2ZSB3cml0dGVuIGEgZmlyc3Qgc2hvdCBhdCBhIEphdmEgaW50ZXJmYWNlIHRvIGxpYmN1cmwuIE1hbnkgdGhhbmtzIHRvCiAgRGFuaWVsIE1hcmVsbCBmb3IgdGlyZWxlc3NseSBhbnN3ZXJpbmcgdG8gYWxsIG15IGJhc2ljIEphdmEgcXVlc3Rpb25zLiBJdAogIHdvcmtzLCBidXQgaXQgaXMgc3RpbGwgdmVyeSBiYXNpYy4KCkRhbmllbCAoMTAgQXByaWwgMjAwMSkKLSBUaGUgcHJvZ3Jlc3MgZGlzcGxheSBjb3VsZCBnZXQgc2lsbHkgd2hlbiBkb2luZyBtdWx0aXBsZSBmaWxlIHRyYW5zZmVycywgYXMKICBpdCB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiB0cmFuc2ZlcnMhCgotIERpc2N1c3Npb25zIHdpdGggQ3JpcyBCYWlsaWZmIHdobyB3cml0ZXMgYSBQZXJsIGludGVyZmFjZSB0byBsaWJjdXJsLCBtYWRlCiAgbWUgYWRkIENVUkxPUFRfSEVBREVSRlVOQ1RJT04uIEl0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHNlcGFyYXRlIGNhbGxiYWNrCiAgZnVuY3Rpb24gZm9yIHdyaXRpbmcgaGVhZGVycy4gUHJldmlvdXNseSB5b3UgY291bGQgb25seSBzZXQgYSBkaWZmZXJlbnQgRklMRQogICogd2hlbiBoZWFkZXJzIGFyZSB3cml0dGVuIGZyb20gd2l0aGluIGxpYmN1cmwuCgpEYW5pZWwgKDcgQXByaWwgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiBjdXJsX2VzY2FwZSgpIGFuZCBwb2ludGVkIG91dCBhIGZsYXcgaW4KICB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZS4KCkRhbmllbCAoNiBBcHJpbCAyMDAxKQotIEFkanVzdGVkIHRoZSB2ZXJzaW9uIGNvZGUgdG8gcHJvcGVybHkgZGlzcGxheSBPcGVuU1NMIDAuOS42YS4gVGhleSBzdXJlCiAgY2hhbmdlIHRoZWlyIHZlcnNpb24gZGVmaW5lIGZvcm1hdCBvZnRlbi4uLgoKLSBjdXJsX2Zvcm1mcmVlKCkgbm93IGFjY2VwdHMgYSBOVUxMIHBvaW50ZXIgd2l0aG91dCBjcmFzaGluZyEKClZlcnNpb24gNy43LjEKCkRhbmllbCAoMyBBcHJpbCAyMDAxKQotIFB1bmVldCBQYXdhaWEgcG9pbnRlZCBvdXQgdHdvIHNlcmlvdXMgcHJvYmxlbXMuIExpYmN1cmwgd291bGQgYXR0ZW1wdCB0bwogIHJlYWQgYmFkIG1lbW9yeSBkdXJpbmcgc2l0dWF0aW9ucyB3aGVuIGFuIChmdHApIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQuCiAgQWxzbywgdGhlIGxpYi9NYWtlZmlsZS52YzYgd2FzIGNvcnJlY3RlZC4KCi0gTW9yZSBpbnZlc3RpZ2F0aW9ucyBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIG1hZGUgbWUgcmVhbGl6ZSB0aGF0CiAgaXQgd2FzIG5vdCBjbGVhbiBlbm91Z2ggdG8gd29yayB0cmFuc3BhcmFudGx5IHdpdGggcGVyc2lzdGVudCBhbmQgbm9uLQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIEkgdGhpbmsgSSd2ZSBmaXhlZCBpdCBub3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDEpCi0gR2VvcmcgSG9ybiBtYWlsZWQgbWUgc29tZSBjb3JyZWN0aW9ucyBmb3IgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UuCgotIEV4cGVyaW1lbnRhbCBmdHBzOi8vIHN1cHBvcnQgYWRkZWQuIEl0IGlzIGJhc2ljYWxseSBGVFAgb3ZlciBTU0wgZm9yIHRoZQogIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQgc3RpbGwgbWFrZXMgYWxsIGRhdGEgdHJhbnNmZXJzIGdvaW5nIG92ZXIgdW5lbmNyeXB0ZWQKICBjb25uZWN0aW9ucy4gUmFpbmVyIFdlaWt1c2F0J3MgZnRwZC1zc2wgc2VydmVyIGhhY2sgc3VwcG9ydHMgdGhpcyBhbmQgSSB1c2VkCiAgdGhhdCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBzZXQgYSBDVVJMT1BUX1RJTUVPVVQgYW5kIHRoZW4gdHJpZWQKICB0byBnZXQgYSBmaWxlIGZyb20gYSBzaXRlIGFuZCBpdCBmYWlscywgdGhlIFNJR0FMUk0gd291bGQgc3RpbGwgYmUgc2VudAogIGFmdGVyIHRoZSB0aW1lb3V0LXRpbWUsIHF1aXRlIGluZXhwZWN0ZWRseSEKCi0gSSBhZGRlZCBhbiBmdHAgdHJhbnNmZXIgZXhhbXBsZSB0byBkb2NzL2V4YW1wbGVzLyBhbmQgSSBhbHNvIHdyb3RlIGEgdGlueQogIGV4YW1wbGUgbWFrZWZpbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0IHdoZW4gYnVpbGRpbmcgb25lIG9mIHRoZQogIGV4YW1wbGVzLgoKVmVyc2lvbiA3LjcuMS1iZXRhMQoKRGFuaWVsICgyNiBNYXJjaCAyMDAxKQotIE1vaGFtZWQgTHJoYXppIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggNy42LjEgYW5kIHBlcnNpc3RlbnQgSFRUUC8xLjAKICBjb25uZWN0aW9ucyAod2hlbiB0aGUgc2VydmVyIHJlcGxpZWQgYSBDb25uZWN0aW9uOiBLZWVwLUFsaXZlKSBhbmQgdGhpcwogIHByb2JsZW0gd2FzIG5vdCBwcm9wZXJseSBkZWFsdCB3aXRoIGluIDcuNyBlaXRoZXIuIEEgcGF0Y2ggd2FzIHBvc3RlZCB0byB0aGUKICBjdXJsLWFuZC1waHAgbWFpbGluZyBsaXN0LgoKRGFuaWVsICgyNCBNYXJjaCAyMDAxKQotIENvbGluIFdhdHNvbiByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gYW5kIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCwKICB3aGljaCB3YXMgYWJvdXQgdGhlIG1hbiBwYWdlIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHF1b3RlICgnKSBpbiBhCiAgd2F5IHRoYXQgZ25yb2ZmIGRvZXNuJ3QgbGlrZS4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMSkKLSBQZXRlciBCcmF5IHJlcG9ydGVkIGNvcnJlY3RseSB0aGF0IHRoZSByb290IG1ha2VmaWxlIHVzZWQgbWFrZSBpbnN0ZWFkIG9mCiAgJChNQUtFKSBmb3IgdGhlIHRlc3QgdGFyZ2V0LgoKLSBDb3JyZWN0ZWQgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UgdG8gdXNlIGN1cmxfZWFzeV9zZXRvcHQoKSBhbmQgbm90CiAgY3VybF9zZXRvcHQoKSB3aGljaCB3YXMgcmVtb3ZlZCBpbiA3LjchCgotIFMuIE1vb25lc2FteSBwcm92aWRlZCB1cGRhdGVzIG9uIHRocmVlIGRvY3VtZW50cyAoTUFOVUFMLCBJTlNUQUxMIGFuZCBGQVEpLgoKLSBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiwgbGliY3VybCB3b3VsZCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIFVSTCBzdHJpbmcKICBpbiBhIHdheSBpdCBzaG91bGRuJ3QuIEFzIHRoZSBwb2ludGVyIGlzIHBhc3NlZC1pbiB0byBsaWJjdXJsIGZyb20gYW4KICBhcHBsaWNhdGlvbiwgd2UgY2FuJ3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdC4gVGhlIHBhcnRpY3VsYXIgYnVnIHJlcG9ydAogIGZyb20gJ25rJyB0aGF0IGJyb3VnaHQgdGhpcyB1cCB3YXMgYmVjYXVzZSBoZSBoYWQgYSByZWFkLW9ubHkgVVJMIHRoYXQgdGhlbgogIGNhdXNlZCBhIGxpYmN1cmwgY3Jhc2ghCgotIE5vIGxvbmdlciByZWFkcyBIRUFEIHJlc3BvbnNlcyBsb25nZXIgdGhhbiB0byB0aGUgbGFzdCBoZWFkZXIuIFByZXZpb3VzbHksCiAgY3VybCB3b3VsZCByZWFkIHRoZSBmdWxsIHJlcGx5IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhICJjbG9zZSIgb25lLgoKLSBsaWJjdXJsIGRpZCByZS11c2UgY29ubmVjdGlvbnMgd2F5IHRvbyBtdWNoLiBEb2luZyAiY3VybAogIGh0dHA6Ly93d3cue21pY3Jvc29mdCxpYm19LmNvbSIgd291bGQgbWFrZSBpdCByZS11c2UgdGhlIGNvbm5lY3Rpb24gd2hpY2gKICBtYWRlIHRoZSBzZWNvbmQgcmVxdWVzdCByZXR1cm4gdmVyeSBvZGQgcmVzdWx0cy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBFZGluIEthZHJpYmFzaWMgbWFkZSBtZSBhd2FyZSB0aGF0IGN1cmwgc2hvdWxkIG5vdCByZS1zZW5kIFBPU1QgcmVxdWVzdHMKICB3aGVuIGZvbGxvd2luZyAzMDItcmVkaXJlY3RzLiBJIG1hZGUgMzAyIHdvcmsgbGlrZSAzMDMgd2hpY2ggbWVhbnMgY3VybCB1c2VzCiAgR0VUIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdChzKS4KCi0gbGliY3VybCBub3cgcmVzZXQgdGhlICJmb2xsb3dlZC1sb2NhdGlvbiIgY291bnRlciBvbiBlYWNoIGludm9rZSBvZgogIGN1cmxfZWFzeV9wZXJmb3JtKCkgYXMgaXQgb3RoZXJ3aXNlIHdvdWxkIHN1bSB1cCBhbGwgcmVkaXJlY3RzIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBjb3VsZCByZWFjaCB0aGUgbWF4cmVkaXJzIGNvdW50ZXIgd3JvbmdseS4KCi0gSmltIERyYXNoIHN1Z2dlc3RlZCBjdXJsX2VzY2FwZSgpIHNob3VsZCBub3QgcmUtZW5jb2RlIHdoYXQgYWxyZWFkeSBsb29rcwogIGxpa2UgYW4gZW5jb2RlZCBzZXF1ZW5jZSBhbmQgSSB0aGluayB0aGF0J3MgYSBmYWlyIHN1Z2dlc3Rpb24uCgpWZXJzaW9uIDcuNwoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBmYWlscyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgZ2V0aG9zdGJ5bmFtZV9yKCkgaXMKICBkZXRlY3RlZCBidXQgaXQgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gaW52b2tlIGl0ICh3aGF0IGFtb3VudCBvZgogIGFyZ3VtZW50cyBpdCBpcyBzdXBwb3NlZCB0byBnZXQpLiBSZXBvcnRzIGZyb20gQW5kculzIEdhcmPtYSBtYWRlIG1lIGF3YXJlCiAgb2YgdGhpcyBuZWVkLgoKLSBUYWxraW5nIHdpdGggSmltIERyYXNoIG1hZGUgbWUgZmluYWxseSBwdXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3VuZXNjYXBlCiAgZnVuY3Rpb25zIGluIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIGFuZCB3cml0ZSBtYW4gcGFnZXMgZm9yIHRoZW0uIFRoZQogIGVzY2FwZSBmdW5jdGlvbiB3YXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgdW5lc2NhcGUgb25lCiAgaGFkLgoKLSBObyBidWcgcmVwb3J0cyBhdCBhbGwgb24gdGhlIGxhdGVzdCBiZXRhcy4gUmVsZWFzZSB0aW1lIGNvbWluZyB1cC4KClZlcnNpb24gNy43LWJldGE1CgpEYW5pZWwgKDE5IE1hcmNoIDIwMDEpCi0gR2VvcmcgT3R0aW5nZXIgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCB1c2luZyAtQyB0b2dldGhlciB3aXRoIC1MIGluIHRoZSBzZW5zZQogIHRoYXQgdGhlIC1DIGluZm8gZ290IGxvc3Qgd2hlbiBpdCB3YXMgcmVkaXJlY3RlZC4gSSBjb3VsZCBub3QgcmVwZWF0IHRoaXMKICBwcm9ibGVtIG9uIHRoZSA3LjcgYnJhbmNoIHdoeSBJIGxlYXZlIHRoaXMgZm9yIHRoZSBtb21lbnQuIFRlc3QgY2FzZSAzOSB3YXMKICBhZGRlZCB0byBkbyBleGFjdGx5IHRoaXMsIGFuZCBpdCBzZWVtcyB0byBkbyByaWdodC4KCi0gQ2hyaXN0aWFuIFJvYm90dG9tIFJlaXMgcmVwb3J0ZWQgaG93IGhpcyA3LjcgYmV0YSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IGRvCiAgZm9ybSBwb3N0cyBhcyBlbGVnYW50bHkgYXMgNy42LjEgZGlkLiBJbmRlZWQsIHRoaXMgd2FzIGEgZmxhdyBpbiB0aGUgaGVhZGVyCiAgZW5naW5lLCBhcyBIVFRQIDEuMSBoYXMgaW50cm9kdWNlZCBhIG5ldyAxMDAgInRyYW5zaWVudCIgcmV0dXJuIGNvZGUgZm9yIFBVVAogIGFuZCBQT1NUIG9wZXJhdGlvbnMgdGhhdCBJIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yLiBTZWN0aW9uIDguMi4zIGluIFJGQzI2MTYKICBoYXMgYWxsIHRoZSBkZXRhaWxzLiBTZWVtcyB0byB3b3JrIG5vdyEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMSkKLSBBZnRlciBoYXZpbmcgZXhwZXJpZW5jZWQgYW5vdGhlciBtYWNoaW5lIGJyZWFrLWRvd24sIHdlJ3JlIGJhY2suCgotIEdlb3JnIEhvcm4ncyBwZXJsIGludGVyZmFjZSBDdXJsOjplYXN5IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgY3VybCByZWxlYXNlCiAgYXJjaGl2ZS4gVGhlIHBlcmwvIGRpcmVjdG9yeSBpcyBub3cgcHJlc2VudC4gUGxlYXNlIGhlbHAgbWUgd2l0aCBkb2NzLAogIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHlvdSB0aGluayBmaXQuCgotIE1hZGUgYSBuZXcgcGhwLyBkaXJlY3RvcnkgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZSBhbmQgbW92ZWQgdGhlIFBIUCBleGFtcGxlcwogIGludG8gYSBzdWJkaXJlY3RvcnkgaW4gdGhlcmUuIE5vdCBtdWNoIFBIUCBpbmZvIHlldCwgYnV0IEkgcGxhbiB0by4gUGxlYXNlCiAgaGVscCBtZSBoZXJlIGFzIHdlbGwhCgotIE1hZGUgbGliY3VybCByZXR1cm4gZXJyb3IgaWYgYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUgb2YgYQogICJjaHVuayIuIEl0IGFjdHVhbGx5IGVuYWJsZXMgbGliY3VybCB0byBkaXNjb3ZlciBwcmVtYXR1cmUgdHJhbnNmZXIgYWJvcnRzCiAgZXZlbiBpZiB0aGUgQ29udGVudC1MZW5ndGg6IHNpemUgaXMgdW5rbm93bi4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMSkKLSBBZGRlZCAtLWNvbm5lY3QtdGltZW91dCB0byBjdXJsLCB3aGljaCBzZXRzIHRoZSBuZXcgQ1VSTE9QVF9DT05ORUNUVElNRU9VVAogIG9wdGlvbiBpbiBsaWJjdXJsLiBJdCBsaW1pdHMgdGhlIHRpbWUgY3VybCBpcyBhbGxvd2VkIHRvIHNwZW5kIGluIHRoZQogIGNvbm5lY3Rpb24gcGhhc2UuIFRoaXMgZGlmZmVycyBmcm9tIC1tLy0tbWF4LXRpbWUgdGhhdCBsaW1pdHMgdGhlIGVudGlyZQogIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLiBSZXF1ZXN0ZWQgYnkgTGFycnkgRmFobm9lIGFuZCBvdGhlcnMuCgogIEkgYWxzbyB1cGRhdGVkIHRoZSBjdXJsLjEgYW5kIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZXMgYW5kIHJlbW92ZWQgdGhlCiAgaXRlbSBmcm9tIHRoZSBUT0RPLgoKVmVyc2lvbiA3LjctYmV0YTQKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBNYWRlIGN1cmwgZ3JvayBJUHY2IHdpdGggSFRUUCBwcm94aWVzIGFuZCBnb3QgZXZlcnl0aGluZyB0byBjb21waWxlIG5pY2VseQogIGFnYWluIHdoZW4gRU5BQkxFX0lQVjYgaXMgc2V0LgoKICBJIG5lZWQgdG8gcmVtYWtlIHRoaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZS4gSSBjYW4ndCB0ZXN0IHRoZSBGVFAgcGFydHMgd2l0aAogIGN1cmwgYnVpbHQgZm9yIElQdjYgYXMgaXQgdXNlcyBhIGRpZmZlcmVudCBzZXQgb2YgRlRQIGNvbW1hbmRzIHRoZW4hCgotIEkgZmVsbCBvbnRvIGEgYnVnIHJlcG9ydCBvbiBwaHAubmV0IChwb3N0ZWQgYnkgTGFycyBUb3JiZW4gV2lsc29uKSB0aGF0IHdhcwogIGEgcmVwb3J0IG1lYW50IGZvciBvdXIgcHJvamVjdC4gQW55d2F5LCBpdCBzYWlkIHRoZSAubmV0cmMgcGFyc2luZyBkaWRuJ3QKICB3b3JrIGFzIHN1cHBvc2VkLCBhbmQgYXMgSSBhZ3JlZWQgd2l0aCBMYXJzLCBJIG1hZGUgdGhlIG5ldHJjIHBhcnNlciB1c2UKICBnZXRwd3VpZCgpIHRvIGZpZ3VyZSBvdXQgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgdHJ5CiAgdGhhdCBuZXRyYy4gSXQgc3RpbGwgdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBmb3IgdGhvc2UgdGhhdCBkb24ndAogIGhhdmUgdGhhdCBmdW5jdGlvbiBvciBpZiB0aGUgdXNlciBkb2Vzbid0IHJldHVybiB2YWxpZCBwd2QgaW5mby4KCi0gRWRpbiBLYWRyaWJhaWMgcG9zdGVkIGEgYnVnIHJlcG9ydCB3aGVyZSBoZSBnb3QgYSBjcmFzaCB3aGVuIGEgZmV0Y2ggd2l0aAogIHVzZXIrcGFzc3dvcmQgaW4gdGhlIFVSTCBmb2xsb3dlZCBhIExvY2F0aW9uOiB0byBhIHNlY29uZCBVUkwgKGFic29sdXRlLAogIHdpdGhvdXQgbmFtZStwYXNzd29yZCkuIFRoaXMgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgYSBsb25nIHdoaWxlIGFuZAogIGNyYXNoZXMgZHVlIHRvIGEgcmVhZCBhdCBhZGRyZXNzIHplcm8uIEZpeGVkIG5vdy4gV3JvdGUgdGVzdCBjYXNlIDM4LCB0aGF0CiAgdGVzdHMgdGhpcy4KCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUncyBodHRwc2VydmVyIHNsaWdodGx5IHRvIGFwcGVuZCBhbGwgY2xpZW50IHJlcXVlc3QKICBkYXRhIHRvIGl0cyBsb2cgZmlsZSBzbyB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBub3cgYmV0dGVyIGNhbiB2ZXJpZnkgYSByYW5nZQogIG9mIHJlcXVlc3RzIGFuZCBub3Qgb25seSB0aGUgbGFzdCBvbmUsIGFzIGl0IGRpZCBwcmV2aW91c2x5LgoKLSBVcGRhdGVkIHRoZSBjdXJsIG1hbiBwYWdlIHdpdGggLS1yYW5kb20tZmlsZSBhbmQgLS1lZ2QtZmlsZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjctYmV0YTMKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBCavZybiBTdGVuYmVyZyBwcm92aWRlZCBzaW1pbGFyIGZpeGVzIGFzIEr2cm4gZGlkIGFuZCBzb21lIGFkZGl0aW9uYWwgcGF0Y2hlcwogIGZvciBub24tU1NMIGNvbXBpbGVzLgoKLSBJIGluY3JlYXNlZCB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgbGliY3VybCBhcyBJJ3ZlIHJlbW92ZWQgdGhlIGxvdyBsZXZlbAogIGZ1bmN0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuIEkgYWxzbyB0b29rIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVuYW1lIHRoZQogIEN1cmxfc3RyZXF1YWwgZnVuY3Rpb24gdG8gY3VybF9zdHJlcXVhbCBhbmQgQ3VybF9zdHJuZXF1YWwgdG8KICBjdXJsX3N0cm5lcXVhbCwgYXMgdGhleSdyZSBwdWJsaWMgbGliY3VybCBmdW5jdGlvbnMgKGV2ZW4gaWYgdGhleSdyZSBzdGlsbAogIHVuZG9jdW1lbnRlZCkuCgogIFRoaXMgd2lsbCBtYWtlIG9sZGVyIHByb2dyYW1zIG5vdCBjYXBhYmxlIG9mIHVzaW5nIHRoZSBuZXcgbGliY3VybCB3aXRoCiAganVzdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuCgotIEr2cm4gSGFydHJvdGggdXBkYXRlZCBzdHVmZiBmb3Igd2luMzIgY29tcGlsZXM6CiAgbyBjb25maWctd2luMzIuaCB3YXMgZml4ZWQgZm9yIHNvY2tsZW5fdAogIG8gbGliL3NzbHVzZS5jIGhhZCBhIGJhZCAjZW5kaWYgcGxhY2VtZW50CiAgbyBsaWIvZmlsZS5jIHdhcyBtYWRlIHRvIGNvbXBpbGUgb24gd2luMzIgYWdhaW4KICBvIGxpYi9NYWtlZmlsZS5tMzIgd2FzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGZpbGVzCiAgbyBsaWIvbGliY3VybC5kZWYgbWF0Y2hlcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc3RhdGUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBJdCBvbmx5IHRvb2sgYW4gaG91ciBvciBzbyBiZWZvcmUgSvZybiBIYXJ0cm90aCBmb3VuZCBhIHByb2JsZW0gaW4gdGhlCiAgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4gR2l2ZW4gaGlzIGZpbmUgZXhhbXBsZS1zaXRlLCBJIGNvdWxkIGVhc2lseSBzcG90CiAgdGhlIHByb2JsZW0gYW5kIHdoZW4gSSByZS1yZWFkIHRoZSBzcGVjICh0aGUgcGFydCBJIGhhdmUgcGFzdGVkIGluIHRoZSB0b3AKICBvZiB0aGUgaHR0cF9jaHVua3MuaCBmaWxlKSwgSSByZWFsaXplZCBJIGhhZCBtYWRlIG15IHN0YXRlLW1hY2hpbmUgc2xpZ2h0bHkKICB3cm9uZyBhbmQgZGlkbid0IGV4cGVjdC9oYW5kbGUgdGhlIHRyYWlsaW5nIENSTEYgdGhhdCBjb21lcyBhZnRlciB0aGUgZGF0YQogIGluIGVhY2ggY2h1bmsgKGFuZCB0aG9zZSBleHRyYSB0d28gYnl0ZXMgc3VyZSBmZWVsIHdhc3RlZCkuCgogIEhhZCB0byBtb2RpZnkgdGVzdCBjYXNlIDM0IHRvIG1hdGNoIHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy43LWJldGEyCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gQWRkZWQgdGhlIHBvbGljeSBzdHVmZiB0byB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBmb3IgdGhlIHR3byBzdXBwb3J0ZWQKICBwb2xpY2llcy4KCi0gSW1wbGVtZW50ZWQgc29tZSBzdXBwb3J0IGZvciB0aGUgQ1VSTE9QVF9DTE9TRVBPTElDWSBvcHRpb24uIFRoZSBwb2xpY2llcwogIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEIGFuZCBDVVJMQ0xPU0VQT0xJQ1lfT0xERVNUIGFyZSBub3cKICBzdXBwb3J0ZWQsIGFuZCB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBwb2xpY3kKICBpcyBjaG9zZW4uCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDEpCi0gQWRkZWQgQ1VSTE9QVF9SQU5ET01fRklMRSBhbmQgQ1VSTE9QVF9FR0RTT0NLRVQgdG8gbGliY3VybCBmb3Igc2VlZGluZyB0aGUKICBTU0wgcmFuZG9tIGVuZ2luZS4gVGhlIHJhbmRvbSBzZWVkaW5nIHN1cHBvcnQgd2FzIGFsc28gYnJvdWdodCB0byB0aGUgY3VybAogIGNsaWVudCB3aXRoIHRoZSBuZXcgb3B0aW9ucyAtLXJhbmRvbS1maWxlIDxmaWxlPiBhbmQgLS1lZ2QtZmlsZSA8ZmlsZT4uIEkKICBuZWVkIHNvbWUgcGVvcGxlIHRvIHJlYWxseSB0ZXN0IHRoaXMgdG8ga25vdyB0aGV5IHdvcmsgYXMgc3VwcG9zZWQuIFJlbWVtYmVyCiAgdGhhdCBsaWJjdXJsIG5vdyBpbmZvcm1zIChpZiB2ZXJib3NlIGlzIG9uKSBpZiB0aGUgcmFuZG9tIHNlZWQgaXMgY29uc2lkZXJlZAogIHdlYWsgKEhUVFBTIGNvbm5lY3Rpb25zKS4KCi0gTWFkZSB0aGUgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBlbmdpbmUgZGV0ZWN0ZWQgYmFkIGZvcm1hdHRlZCBkYXRhIGxlbmd0aAogIGFuZCByZXR1cm4gZXJyb3IgaWYgc28gKHdlIGNhbid0IHBvc3NpYmx5IGV4dHJhY3Qgc2Vuc2libGUgZGF0YSBpZiB0aGlzIGlzCiAgdGhlIGNhc2UpLiBBZGRlZCBhIHRlc3QgY2FzZSB0aGF0IGRldGVjdHMgdGhpcy4gTnVtYmVyIDM2LiBOb3cgdGhlcmUgYXJlIDYwCiAgdGVzdCBjYXNlcy4KCi0gQWRkZWQgNSBuZXcgbGliY3VybCBvcHRpb25zIHRvIGN1cmwvY3VybC5oIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLiBUaGV5J3JlIGFsc28gZG9jdW1lbnRlZCAoZmFpcmx5CiAgdGhvcm91Z2hseSkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4gVGhyZWUgb2YgdGhlbSBhcmUgbm93CiAgaW1wbGVtZW50ZWQsIGFsdGhvdWdoIG5vdCByZWFsbHkgdGVzdGVkIGF0IHRoaXMgcG9pbnQuLi4gQW55d2F5LCB0aGUgbmV3CiAgaW1wbGVtZW50ZWQgb3B0aW9ucyBhcmUgbmFtZWQgQ1VSTE9QVF9NQVhDT05ORUNUUywgQ1VSTE9QVF9GUkVTSF9DT05ORUNULAogIENVUkxPUFRfRk9SQklEX1JFVVNFLiBUaGUgb25lcyBzdGlsbCBsZWZ0IHRvIHdyaXRlIGNvZGUgZm9yIGFyZToKICBDVVJMT1BUX0NMT1NFUE9MSUNZIGFuZCBpdHMgcmVsYXRlZCBvcHRpb24gQ1VSTE9QVF9DTE9TRUZVTkNUSU9OLgoKLSBNYWRlIGN1cmwgKHRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIHRvb2wpIHVzZSB0aGUgbmV3IGxpYmN1cmwgNy43IHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHN1cHBvcnQgYnkgcmUtdXNpbmcgdGhlIHNhbWUgY3VybCBoYW5kbGUgZm9yIGV2ZXJ5IHNwZWNpZmllZCBmaWxlCiAgdHJhbnNmZXIgYW5kIGFmdGVyIHNvbWUgbW9yZSB0ZXN0IGNhc2UgdHdlYWtpbmcgd2UgaGF2ZSAxMDAlIHRlc3QgY2FzZSBPSy4KICBJIG1hZGUgc29tZSB0ZXN0IGNhc2VzIHJldHVybiBIVFRQLzEuMCBub3cgdG8gbWFrZSBzdXJlIHRoYXQgd29ya3MgYXMgd2VsbC4KCi0gSGFkIHRvIGFkZCAnQ29ubmVjdGlvbjogY2xvc2UnIHRvIHRoZSBoZWFkZXJzIG9mIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBzbwogIHRoYXQgY3VybCBiZWhhdmVzICJvbGQtc3R5bGUiIHNpbmNlIHRoZSB0ZXN0IGh0dHAgc2VydmVyIGRvZXNuJ3QgZG8gbXVsdGlwbGUKICBjb25uZWN0aW9ucy4uLiBOb3cgSSBnZXQgMTAwJSB0ZXN0IGNhc2UgT0suCgotIFRoZSBjdXJsLmhheHguc2Ugc2l0ZSwgdGhlIG1haW4gY3VybCBtYWlsaW5nIGxpc3QgYW5kIG15IHBlcnNvbmFsIGVtYWlsIGFyZQogIGFsbCBkZWFkIHRvZGF5IGR1ZSB0byBwb3dlciBibGFja291dCBpbiB0aGUgYXJlYSB3aGVyZSB0aGUgbWFpbiBzZXJ2ZXJzIGFyZQogIGxvY2F0ZWQuIEhvcnJpYmxlLgoKLSBJJ3ZlIG1hZGUgcGVyc2lzdGFuY2Ugd29yayBvdmVyIGEgc3F1aWQgSFRUUCBwcm94eS4gSSBmaW5kIGl0IGRpc3R1cmJpbmcKICB0aGF0IGl0IHVzZXMgaGVhZGVycyB0aGF0IGFyZW4ndCBwcmVzZW50IGluIGFueSBIVFRQIHN0YW5kYXJkIHRob3VnaAogIChQcm94eS1Db25uZWN0aW9uOikgYW5kIHRoYXQgbWFrZXMgbWUgZmVlbCB0aGF0IEknbSBub3cgb24gdGhlIGVkZ2Ugb2Ygd2hhdAogIHRoZSBzdGFuZGFyZCBhY3R1YWxseSBkZWZpbmVzLiBJIG5lZWQgdG8gZ2V0IHRoaXMgY29kZSBleGNlcmNpc2VkIG9uIGEgbG90CiAgb2YgZGlmZmVyZW50IEhUVFAgcHJveGllcyBiZWZvcmUgSSBmZWVsIHNhZmUuCgogIE5vdyBJJ20gZmFjaW5nIHRoZSBwcm9ibGVtIHdpdGggbXkgdGVzdCBzdWl0ZSBzZXJ2ZXJzIChib3RoIEZUUCBhbmQgSFRUUCkKICBub3Qgc3VwcG9ydGluZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBsaWJjdXJsIGlzIGRvaW5nIHRoZW0gbm93LiBJIGhhdmUKICB0byBmaXggdGhlIHRlc3Qgc2VydmVycyB0byBnZXQgYWxsIHRoZSB0ZXN0IGNhc2VzIGRvIE9LLgoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIGRpZCBvdXRwdXQgZXJyb3JzIHRvIHN0ZGVyciBldmVuIGlmCiAgTVVURSBhbmQgTk9QUk9HUkVTUyB3YXMgc2V0LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgYnVnIGFuZCBoYXBwZW5zIGlmCiAgdGhlcmUncyBhbiBlcnJvciBhbmQgbm8gRVJST1JCVUZGRVIgaXMgc2V0LiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpWZXJzaW9uIDcuNy1iZXRhMQoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBpcyBubyBsb25nZXIgYW55IHRyb3VibGUgZm9yIGxpYmN1cmwuIEkndmUKICBhZGRlZCB0d28gc291cmNlIGZpbGVzIGFuZCBJJ3ZlIHJ1biBzb21lIHRlc3QgZG93bmxvYWRzIHRoYXQgbG9vayBmaW5lLgoKLSBIVFRQIEhFQUQgd29ya3MgdG9vLCBldmVuIG9uIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDEpCi0gVGhlIGN1cnJlbnQgNTcgdGVzdCBjYXNlcyBub3cgcGFzcyBPSy4gSXQgd291bGQgc3VnZ2VzdCB0aGF0IGxpYmN1cmwgd29ya3MKICB1c2luZyB0aGUgb2xkLXN0eWxlIHdpdGggb25lIGNvbm5lY3Rpb24gcGVyIGhhbmRsZS4gVGhlIHRlc3Qgc3VpdGUgZG9lc24ndAogIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB5ZXQgc28gdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgZm9yIHRoaXMuCgotIEkgcGF0Y2hlZCB0aGUgdGVsbmV0LmMgaGVhdmlseSB0byBub3QgdXNlIGFueSBnbG9iYWwgdmFyaWFibGVzIGFueW1vcmUuIEl0CiAgc2hvdWxkIG1ha2UgaXQgYSBsb3QgbmljZXIgbGlicmFyeS13aXNlLgoKLSBUaGUgZmlsZTovLyBzdXBwb3J0IHdhcyBtb2RpZmllZCBzbGlnaHRseSB0byB1c2UgdGhlIGludGVybmFsIGNvbm5lY3QtZmlyc3QtCiAgdGhlbi1kbyBhcHByb2FjaC4KCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE1vcmUgYnVncyBlcmFzZWQuCgpWZXJzaW9uIDcuNy1hbHBoYTIKCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE5vdywgdGhlcmUncyBldmVuIGEgYmFzaWMgY2hlY2sgdGhhdCBhIHJlLXVzZWQgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZQogIGJlZm9yZSBpdCBpcyBhc3N1bWVkIHNvLiBBIGZldyBmaXJzdCB0ZXN0cyBoYXZlIHByb3ZlbiB0aGF0IGxpYmN1cmwgd2lsbAogIHRoZW4gcmUtY29ubmVjdCBpbnN0ZWFkIG9mIHJlLXVzZSB0aGUgZGVhZCBjb25uZWN0aW9uIQoKRGFuaWVsICgyIE1hcmNoIDIwMDEpCi0gTm93IHRoZXkgd29yayBpbnRlcm1peGVkIGFzIHdlbGwuIE1ham9yIGNvb2xuZXNzIQoKLSBNb3JlIGZpZGRsaW5nIGFyb3VuZCwgbXkgJ3RpbnknIGNsaWVudCBJIGhhdmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgbm93IGhhcwogIHByb3ZlZCB0byBkb3dubG9hZCBib3RoIEZUUCBhbmQgSFRUUCB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoZXkgZG8KICBub3Qgd29yayBpbnRlcm1peGVkIHlldCB0aG91Z2guCgpEYW5pZWwgKDEgTWFyY2ggMjAwMSkKLSBXaWxmcmVkbyBTYW5jaGV6IHBvaW50ZWQgb3V0IGEgbWlub3Igc3BlbGxpbmcgbWlzdGFrZSBpbiBhIG1hbiBwYWdlIGFuZCB0aGF0CiAgY3VybF9zbGlzdF9hcHBlbmQoKSBzaG91bGQgdGFrZSBhIGNvbnN0IGNoYXIgKiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IGRvZXMKICBub3cuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDEpCi0gVGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc3RhcnQgdG8gbG9vayBnb29kIGZvciBIVFRQLiBPbiBhIHN1YnNlcXVlbnQKICByZXF1ZXN0LCBpdCBzZWVtcyB0aGF0IGxpYmN1cmwgbm93IGNhbiBwaWNrIGFuIGFscmVhZHkgZXhpc3RpbmcgY29ubmVjdGlvbgogIGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgb3IgaXQgb3BlbnMgYSBuZXcgb25lLgoKLSBEb3VnbGFzIFIuIEhvcm5lciBtYWlsZWQgbWUgY29ycmVjdGlvbnMgdG8gdGhlIGN1cmxfZm9ybXBhcnNlKCkgbWFuIHBhZ2UKICB0aGF0IEkgYXBwbGllZC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMSkKLSBBZGRlZCB0aGUgZG9jcy9leGFtcGxlcy93aW4zMnNvY2tldHMuYyBmaWxlIGZvciBvdXIgd2luZG93cyBmcmllbmRzLgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHByb3ZpZGVkIGJyYW5kIG5ldyBURUxORVQgZnVuY3Rpb25hbGl0eSBhbmQKICBpbXByb3ZlbWVudHM6CgogICogTmVnb3RpYXRpb24gaXMgbm93IHBhc3NpdmUuIEN1cmwgZG9lcyBub3QgbmVnb3RpYXRlIHVudGlsIHRoZSBwZWVyIGRvZXMuCiAgKiBQb3NzaWJpbGl0eSB0byBzZXQgbmVnb3RpYXRpb24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLCBjdXJyZW50bHkgb25seQogICAgWERJU1BMT0MsIFRUWVBFIGFuZCBORVdfRU5WSVJPTiAoY2FsbGVkIE5FV19FTlYpLgogICogTm93IHNlbmRzIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZSAtdSBzd2l0Y2ggaXMgdXNlZC4KICAqIFVzZSAtdCB0byBzZXQgdGVsbmV0IG9wdGlvbnMgKExpbnVzIGV2ZW4gdXBkYXRlZCB0aGUgbWFuIHBhZ2UsIGF3ZXNvbWUhKQoKLSBIYXZlbid0IGRvbmUgdGhpcyBiaWcgY2hhbmdlcyB0byBjdXJsIGZvciBhIHdoaWxlLiBNb3ZlZCBhcm91bmQgYSBsb3Qgb2YKICBzdHJ1Y3QgZmllbGRzIGFuZCBzdHVmZiB0byBtYWtlIG11bHRpcGxlIGNvbm5lY3Rpb25zIGdldCBjb25uZWN0aW9uIHNwZWNpZmljCiAgZGF0YSBpbiBzZXBhcmF0ZSBzdHJ1Y3RzIHNvIHRoYXQgdGhleSBjYW4gY28tZXhpc3QgaW4gYSBuaWNlIHdheS4gU2VlIHRoZQogIG1haWxpbmcgbGlzdHMgZm9yIGRpc2N1c3Npb25zIGFyb3VuZCBob3cgdGhpcyBpcyBnb25uYSBiZSBpbXBsZW1lbnRlZC4gRG9jcwogIGFuZCBtb3JlIHdpbGwgZm9sbG93LgoKICBTdHVkaWVkIHRoZSBIVFRQIFJGQyB0byBmaW5kIG91dCBiZXR0ZXIgaG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkCiAgd29yay4gU2VlbXMgY29vbCBlbm91Z2guCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDEpCi0gQm9iIFNjaGFkZXIgYnJvdWdodCBtZSB0d28gZmlsZXMgdGhhdCBoZWxwIHNldCB1cCBhIE1TIFZDKysgbGliY3VybCBwcm9qZWN0CiAgZWFzaWVyLiBIZSBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYW4gdXAtdG8tZGF0ZSBsaWJjdXJsLmRlZiBmaWxlLgoKLSBJIG1vdmVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyBmcm9tIHRoZSBwdWJsaWMgPGN1cmwvY3VybC5oPiBmaWxlIHRvIHRoZQogIGxpYnJhcnkgcHJpdmF0ZSB1cmxkYXRhLmguIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgdXBjb21pbmcgY2hhbmdlcy4gVGhlCiAgbG93IGxldmVsIGludGVyZmFjZSBpcyBubyBsb25nZXIgYmVpbmcgcGxhbm5lZCB0byBiZWNvbWUgcmVhbGl0eS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMSkKLSBDVVJMT1BUX1BPU1QgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuIEp1c3Qgc2V0dGluZyB0aGUgUE9TVCBzdHJpbmcgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyB3aWxsIHN3aXRjaCBvbiB0aGUgSFRUUCBQT1NULiBNb3N0IG90aGVyIHRoaW5ncyBpbgogIGxpYmN1cmwgYWxyZWFkeSB3b3JrcyB0aGlzIHdheSwgaS5lIHRoZXkgcmVxdWlyZSBvbmx5IHRoZSBwYXJhbWV0ZXIgdG8KICBzd2l0Y2ggb24gYSBmZWF0dXJlIHNvIEkgdGhpbmsgdGhpcyB3b3JrcyB3ZWxsIHdpdGggdGhlIHJlc3QuIFNldHRpbmcgYSBOVUxMCiAgc3RyaW5nIHN3aXRjaGVzIG9mZiB0aGUgUE9TVCBhZ2Fpbi4KCi0gRXhjZWxsZW50IHN1Z2dlc3Rpb25zIGZyb20gUmljaCBHcmF5LCBSaWNrIEpvbmVzLCBKb2hhbiBOaWxzc29uIGFuZCBCam9ybgogIFJlZXNlIGhlbHBlZCBtZSBkZWZpbmUgYSB3YXkgaG93IHRvIGluY29ycG9yYXRlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW50bwogIGxpYmN1cmwgaW4gYSB2ZXJ5IHNtb290aCB3YXkuIElmIGRvbmUgcmlnaHQsIG5vIGNoYW5nZSBtYXkgaGF2ZSB0byBiZSBtYWRlCiAgdG8gb2xkZXIgcHJvZ3JhbXMgYW5kIHRoZXkgd2lsbCBqdXN0IHN0YXJ0IHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbgogIGFwcGxpY2FibGUhCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDEpCi0gQ2hhbmdlZCB0aGUgd29yZCAndGltZW91dGVkJyB0byAndGltZWQgb3V0JyBpbiB0d28gZGlmZmVyZW50IGVycm9yIG1lc3NhZ2VzLgogIFN1Z2dlc3RlZCBieSBMYXJyeSBGYWhub2UuCgpWZXJzaW9uIDcuNi4xCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwMSkKLSBGcmFuayBSZWlkIGFuZCBDYWluIEhvcHdvb2QgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kIHJlc2VhcmNoIGFyb3VuZCBhIEhUVFBTCiAgUFVUL3VwbG9hZCBwcm9ibGVtIHdlIHNlZW0gdG8gaGF2ZS4gTm8gc29sdXRpb24gZm91bmQgeWV0LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDEpCi0gQW4gaW50ZXJlc3RpbmcgZGlzY3Vzc2lvbiBpcyBob3cgdG8gc3BlY2lmeSBhbiBlbXB0eSBwYXNzd29yZCB3aXRob3V0IGhhdmluZwogIGN1cmwgYXNrIGZvciBpdCBpbnRlcmFjdGl2ZWx5PyBUaGUgY3VycmVudCBpbXBsbWVudGF0aW9uIHRha2VzIGFuIGVtcHR5CiAgcGFzc3dvcmQgYXMgYSByZXF1ZXN0IGZvciBhIHBhc3N3b3JkIHByb21wdC4gSG93ZXZlciwgSSBzdGlsbCB3YW50IHRvCiAgc3VwcG9ydCBhIGJsYW5rIHVzZXIgZmllbGQuIFRodXMsIHRvZGF5IGlmIHlvdSBlbnRlciAiLXUgOiIgKHdpdGhvdXQgdXNlcgogIGFuZCBwYXNzd29yZCkgY3VybCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLiBUcmlja3kuIEhvdyB3b3VsZCB5b3UKICBzcGVjaWZ5IHlvdSB3YW50IHRoZSBwcm9tcHQgb3RoZXJ3aXNlPwoKLSBNYWRlIHRoZSBuZXRyYyBwYXJzZSByZXN1bHQgcG9zc2libGUgdG8gdXNlIGZvciBvdGhlciBwcm90b2NvbHMgdGhhbiBGVFAgYW5kCiAgSFRUUCAoc3VjaCBhcyB0aGUgdXBjb21pbmcgVEVMTkVUIGZpeGVzKS4KCi0gVGhlIHByZXZpb3VzbHkgbWVudGlvbmVkICJNU1ZDKysgcHJvYmxlbXMiIHR1cm5lZCBvdXQgdG8gYmUgYSBub24taXNzdWUuCgotIEFkZGVkIGEgSFRUUCBmaWxlIHVwbG9hZCBjb2RlIGV4YW1wbGUgaW4gdGhlIGRvY3MvZXhhbXBsZXMvIHNlY3Rpb24gb24KICByZXF1ZXN0LgoKLSBBZGp1c3RlZCB0aGUgRlRQIHJlc3BvbnNlIGZpeCBzbGlnaHRseS4KClZlcnNpb24gNy42LjEtcHJlMwoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZvdW5kIGEgZmxhdyBpbiB0aGUgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbiBmb3IgRlRQIHRoYXQKICBjb3VsZCBtYWtlIGxpYmN1cmwgbm90IGdldCBvdXQgb2YgdGhlIGxvb3AgcHJvcGVybHkgd2hlbiBpdCBzaG91bGQsIGlmCiAgbGliY3VybCBnb3QgLTEgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBzb2NrZXQuCgotIEkgZm91bmQgYSBzaW1pbGFyIG1pc3Rha2UgaW4gaHR0cC5jIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgcmVhZGluZyB0aGUKICByZXN1bHRzIGZyb20gdGhlIHByb3h5IGNvbm5lY3Rpb24uCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVkMgbWFrZWZpbGUgaW4gc3JjLyBuZWVkZWQgdGhlIGxpYnBhdGggc2V0CiAgZm9yIHRoZSBkZWJ1ZyBidWlsZCB0byB3b3JrLgoKLSBEYW5pZWwgR2VocmlnZXIgc3RlcHBlZCBpbiB0byBhc3Npc3Qgd2l0aCB0aGUgVkMrKyBzdHVmZiBSb2JlcnQgV2VhdmVyCiAgYnJvdWdodCB1cCB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gYnJvdWdodCBhIGJpZyBwYXRjaCB0aGF0IGJyaW5ncyBJUHY2LWF3YXJlbmVzcyB0bwogIGEgYnVuY2ggb2YgZGlmZmVyZW50IGFyZWFzIHdpdGhpbiBsaWJjdXJsLgoKLSBSb2JlcnQgV2VhdmVyIHRvbGQgbWUgYWJvdXQgdGhlIHByb2JsZW1zIHRoZSBNUyBWQysrIDYuMCBjb21waWxlciBoYXMgd2l0aAogIHRoZSAnc3RhdGljJyBrZXl3b3JkIG9uIGEgbnVtYmVyIG9mIGxpYmN1cmwgZnVuY3Rpb25zLiBJIG1pZ2h0IG5lZWQgdG8gYWRkIGEKICBwYXRjaCB0aGF0IHJlZGVmaW5lcyBzdGF0aWMgd2hlbiBsaWJjdXJsIGlzIGNvbXBpbGVkIHdpdGggdGhhdCBjb21waWxlci4KICBIb3cgZG8gSSBrbm93IHdoZW4gVkMrKyBjb21waWxlcywgYW55b25lPwoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDEpCi0gY3VybF9nZXRpbmZvKCkgd2FzIGV4dGVuZGVkIHdpdGggdHdvIG5ldyBvcHRpb25zOgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQuIFRoZXkKICByZXR1cm4gdGhlIGZ1bGwgYXNzdW1lZCBjb250ZW50IGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgaW4gdGhlIGdpdmVuCiAgZGlyZWN0aW9uLiBUaGUgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgd2lsbCBiZSB0aGUgQ29udGVudC1MZW5ndGg6CiAgc2l6ZSBvZiBhIEhUVFAgZG93bmxvYWQuIEFkZGVkIGRlc2NyaXB0aW9ucyB0byB0aGUgbWFuIHBhZ2UgYXMgd2VsbC4gVGhpcwogIHdhcyBkb25lIGFmdGVyIGRpc2N1c3Npb25zIHdpdGggQm9iIFNjaGFkZXIuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBwcm92aWRlZCBhbm90aGVyIGZpeCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgdW5kZXIgdGhlIG1vcmUKICByZWNlbnQgY3lnd2luIGluc3RhbGxhdGlvbnMuIEl0IHNlZW1zIHRoZXkndmUgY2hhbmdlZCB0aGUgcHJlc2V0IGRlZmluZXMgdG8KICBub3QgaW5jbHVkZSBXSU4zMiBhbnltb3JlLgoKVmVyc2lvbiA3LjYuMS1wcmUyCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMSkKLSBDdXJsX3JlYWQoKSBhbmQgY3VybF9yZWFkKCkgbm93IHJldHVybiBhIHNzaXplX3QgZm9yIHRoZSBzaXplLCBhcyBpdCBoYWQgdG8KICBiZSBhYmxlIHRvIHJldHVybiAtMS4gVGhlIHRlbG5ldCBzdXBwb3J0IGNyYXNoZWQgZHVlIHRvIHRoaXMgYW5kIHRoZXJlIHdhcyBhCiAgcG9zc2liaWxpdHkgdG8gd2VpcmQgYmVoYXZpb3IgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZAogIGFuZCBpdCB3b3JrcyBmb3IgaGltLgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDEpCi0gU28gdGhlIEhUVFAgUFVUIHJlc3VtZSBmaXggd2Fzbid0IGdvb2QuIFRoZXJlIHNob3VsZCBhcHBlYXJhbnRseSBiZSBhCiAgQ29udGVudC1SYW5nZSBoZWFkZXIgd2hlbiByZXN1bWluZyBhIFBVVC4KCi0gSSBub3RpY2VkIEkgYnJva2UgdGhlIGRvd25sb2FkLWNoZWNrIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHJlc3VtZWQgSFRUUAogIGRvd25sb2FkIGlzIGFjdHVhbGx5IHJlc3VtZWQuIEl0IGdvdCBicm9rZSBiZWNhdXNlIG15IG5ldyAnaHR0cHJlcScgZmllbGQKICBpbiB0aGUgbWFpbiBjdXJsIHN0cnVjdC4gSSBzaG91bGQgZ2V0IHNsYXBwZWQuIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yCiAgdGhpcyBub3csIHNvIEkgd29uJ3QgYmUgYWJsZSB0byBydWluIHRoaXMgYWdhaW4gd2l0aG91dCBub3RpY2luZy4KCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGNvbnRlbnQtbGVuZ3RoIHZlcmlmeWluZyB3aGVuIGRvd25sb2FkaW5nIEhUVFAuCgotIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHRpdGxlIHNheSBpZiB0aGUgdHJhbnNmZXIgaXMgYmVpbmcgdHJhbnNmZXJlZC4gSXQKICBtYWtlcyB0aGUgb3V0cHV0IHNsaWdodGx5IGJldHRlciBmb3IgcmVzdW1lcy4KCi0gV2hlbiBkZWFsaW5nIHdpdGggTG9jYXRpb246IGFuZCBIVFRQIHJldHVybiBjb2RlcywgbGliY3VybCB3aWxsIG5vdCBhdHRlbXB0CiAgdG8gZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjYxNiBiZXR0ZXIuIEl0IG1lYW5zIHRoYXQgd2hlbiBQT1NUaW5nIHRvIGEKICBVUkwgdGhhdCBpcyBiZWluZyBmb2xsb3dpbmcgdG8gYSBzZWNvbmQgcGxhY2UsIHRoZSBzdGFuZGFyZCB3aWxsIGp1ZGdlIG9uCiAgd2hhdCB0byBkby4gQWxsIEhUVFAgY29kZXMgZXhjZXB0IDMwMyBhbmQgMzA1IHdpbGwgY2F1c2UgY3VybCB0byBtYWtlIGEKICBzZWNvbmQgUE9TVCBvcGVyYXRpb24uIDMwMyB3aWxsIG1ha2UgYSBHRVQgYW5kIDMwNSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KCiAgSSBhbHNvIHdyb3RlIHR3byB0ZXN0IGNhc2VzIGZvciB0aGlzIFBPU1QvR0VUL0xvY2F0aW9uIHN0dWZmLgoKVmVyc2lvbiA3LjYKCkRhbmllbCAoMjYgSmFudWFyeSAyMDAxKQotIExvdHMgb2YgbWFpbHMgYmFjayBhbmQgZm9ydGggd2l0aCBCb2IgU2NoYWRlciBmaW5hbGx5IG1hZGUgbWUgYWRkIGEgc21hbGwKICBwaWVjZSBvZiBjb2RlIGluIHRoZSBIVFRQIGVuZ2luZSBzbyB0aGF0IEhUVFAgdXBsb2FkIHJlc3VtZSB3b3Jrcy4gWW91IGNhbgogIG5vdyBkbyBhbiBvcGVyYXRpb24gbGlrZSAnY3VybCAtVCBmaWxlIC1DIDxvZmZzZXQ+IDxVUkw+JyBhbmQgY3VybCB3aWxsIFBVVAogIHRoZSBlbmRpbmcgcGFydCBvZiB0aGUgZmlsZSBzdGFydGluZyBhdCBnaXZlbiBvZmZldCB0byB0aGUgc3BlY2lmaWVkIFVSTC4KClZlcnNpb24gNy42LXByZTQKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAxKQotIEkgdG9vayBob2xkIG9mIFJpY2sgSm9uZXMnIHF1ZXN0aW9uIHdoeSB3ZSBkb24ndCB1c2UgcmVjdigpIGFuZCBzZW5kKCkgZm9yCiAgcmVhZGluZy93cml0aW5nIHRvIHRoZSBzb2NrZXRzIGFuZCBJJ3ZlIG5vdyBtb2RpZmllZCB0aGUgc3JlYWQoKSBhbmQKICBzd3JpdGUoKSBtYWNyb3MgdG8gdXNlIHRoZW0gaW5zdGVhZC4gSWYgbm90aGluZyBlbHNlLCB0aGV5IGNvdWxkIGJlIHRlc3RlZAogIGluIHRoZSBuZXh0IGJldGEtcm91bmQgY29taW5nIHJpZ2h0IHVwLgoKLSBKZWZmIE1vcnJvdyBmb3VuZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNhZ2Ugb2YgU1NMX3JlYWQoKSBhbmQgc3VwcGxpZWQKICBoaXMgcmVzZWFyY2ggcmVzdWx0cyBpbiBob3cgdG8gZml4IHRoaXMuIEl0IHR1cm5zIG91dCB3ZSBoYXZlIHRvIGludm9rZSB0aGUKICBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzIGluIHNvbWUgY2FzZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBTU0xfd3JpdGUoKS4KCiAgSSBtYWRlIHNvbWUgcmF0aGVyIGRyYXN0aWMgY2hhbmdlcyBhbGwgb3ZlciBsaWJjdXJsIHRvIG1ha2UgYWxsIHdyaXRlcyBhbmQKICByZWFkcyBnZXQgZG9uZSBvbiBvbmUgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhpcyByZXBlYXRlZC1hdHRlbXB0cyB0aGluZwogIHdvdWxkIG9ubHkgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBhdCBvbmUgcG9pbnQuCgotIFJpY2sgSm9uZXMgc3BvdHRlZCB0aGF0IHRoZSAndG90YWwgdGltZScgY291bnRlciByZWFsbHkgZGlkbid0IG1lYXN1cmUgdGhlCiAgdG90YWwgdGltZSB2ZXJ5IGFjY3VyYXRlIG9uIHN1YnNlY29uZCBsZXZlbHMuCgotIEpvaGFuIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhlIG5lZWQgdG8gbW9yZSBjbGVhcmx5IHNwZWNpZnkgdGhhdCB0aGUgdGltZW91dAogIHZhbHVlIHlvdSBzZXQgZm9yIGEgZG93bmxvYWQgaXMgZm9yIHRoZSAqZW50aXJlKiBkb3dubG9hZC4gVGhlcmUncyBjdXJyZW50bHkKICBubyBvcHRpb24gYXZhaWxhYmxlIHRoYXQgc2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlIG9ubHkuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBzdWJtaXR0ZWQgYSBzZXJpZXMgb2YgcGF0Y2hlcyByZXF1aXJlZCB0byBnZXQgY3VybCB0byBjb21waWxlCiAgcHJvcGVybHkgd2l0aCBjeWd3aW4uCgotIFJvYmVydCBXZWF2ZXIgcG9zdGVkIGEgZml4IGZvciB0aGUgd2luMzIgc2VjdGlvbiBvZiB0aGUgY3VybF9nZXRlbnYoKSBjb2RlCiAgdGhhdCBjb3JyZWN0ZWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgotIEFkZGVkIGNvbW1lbnRzIGluIGEgZmV3IGZpbGVzIGluIGEgc3VkZGVuIGF0dGVtcHQgdG8gbWFrZSB0aGUgc291cmNlcyBtb3JlCiAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIQoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgc2ltcGxlIElQdjYgZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBtYWRlIHRoZSB2ZXJzaW9uCiAgc3RyaW5nIGFkZCAnaXB2NicgdG8gdGhlIGVuYWJsZSBzZWN0aW9uIGluIHRoYXQgY2FzZS4gRU5BQkxFX0lQVjYgd2lsbCBiZQogIHNldCBpZiBjdXJsIGlzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0IGVuYWJsZWQuCgotIEFkZGVkIGEgcGFyc2VyIGZvciBJUHY2LXN0eWxlIHNwZWNpZmllZCBJUC1hZGRyZXNzZXMgaW4gYSBVUkwuIFRodXMsIHdoZW4KICBJUHY2IGdldHMgZW5hYmxlZCBzb29uLCB3ZSBjYW4gdXNlIFVSTHMgbGlrZSAnWzA6OjFdOjgwJy4uLgoKLSBNYWRlIHRoZSBVUkwgZ2xvYmJpbmcgaW4gdGhlIGNsaWVudCBwb3NzaWJsZSB0byBmYWlsIHNpbGVudGx5IGlmIHRoZXJlJ3MgYW4KICBlcnJvciBpbiB0aGUgZ2xvYmJpbmcuIEl0IG1ha2VzIGl0IGFsbW9zdCBpbnR1aXRpdmUsIHNvIHdoZW4geW91IGRvbid0CiAgZm9sbG93IHRoZSBzeW50YXggcnVsZXMsIGdsb2JiaW5nIGlzIHNpbXBseSBzd2l0Y2hlZCBvZmYgYW5kIHRoZSByYXcgc3RyaW5nCiAgaXMgdXNlZCBpbnN0ZWFkLgoKICBJIHN0aWxsIHRoaW5rIHdlJ2xsIGdldCBwcm9ibGVtcyB3aXRoIElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzIHdoZW4gd2UgKndhbnQqCiAgZ2xvYmJpbmcgb24gcGFydHMgb2YgdGhlIFVSTCBhcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBVUkwgd2lsbCBmb3Igc3VyZQogIHNlcmlvdXNseSBjb25mdXNlIHRoZSBnbG9iYmVyLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwcm9ncmVzcyBtZXRlciBwYXRjaCB0aGF0IG1ha2VzIGl0IGxvb2sgYmV0dGVyIGV2ZW4KICBkdXJpbmcgc2xvdyBzdGFydHMuIFByZXZpb3VzbHkgaXQgbWFkZSBzb21lIHNpbGx5IGFzc3VtcHRpb25zLi4uCgotIEFkZGVkIHR3byBGVFAgdGVzdHMgZm9yIC1RIGFuZCAtUSAtIHN0dWZmIHNpbmNlIGl0IHdhcyBiZWluZyBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0LiBIYWQgdG8gY29ycmVjdCB0aGUgZnRwc2VydmVyLnBsIHRvbyBhcyBpdCBidWdnZWQgc2xpZ2h0bHkuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSBMb2NhdGlvbjogcGFyc2VycyBkZWFsIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaHVzIEkgcmVtb3ZlZCB0aGUgbGFzdAogIGNvZGUgdGhhdCByZXN0cmljdHMgdGhlIGxlbmd0aCBvZiBVUkxzIHRoYXQgY3VybCBzdXBwb3J0cy4KCi0gQWRkZWQgYSAtLWdsb2JvZmYgdGVzdCBjYXNlICgjMjgpIGFuZCBpdCBxdWlja2x5IGlkZW50aWZpZWQgYSBtZW1vcnkgcHJvYmxlbQogIGluIHNyYy9tYWluLmMgdGhhdCBJIHRvb2sgY2FyZSBvZi4KClZlcnNpb24gNy42LXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIHR3byBmb3JtZXIgZmlsZXMgbGliL2Rvd25sb2FkLmMgYW5kIGxpYi9oaWdobGV2ZWwuYyBiZWNvbWUgdGhlIG5ldwogIGxpYi90cmFuc2Zlci5jIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UuIEkgYWxzbyBkaWQgdGhlIHJlbmFtZSBmcm9tIFRyYW5zZmVyKCkKICB0byBDdXJsX1RyYW5zZmVyKCkgaW4gdGhlIG90aGVyIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24KICBpbiB0aGUgc3Bpcml0IG9mIHVzaW5nIEN1cmxfIHByZWZpeCBmb3IgbGlicmFyeS1zY29wZWQgZ2xvYmFsIHN5bWJvbHMuCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwMSkKLSBBZGRlZCAtZy8tLWdsb2JvZmYgdGhhdCBzd2l0Y2hlcyBPRkYgdGhlIFVSTCBnbG9iYmluZyBhbmQgdGh1cyBlbmFibGVzIHt9W10KICBsZXR0ZXJzIHRvIGJlIHBhcnQgb2YgdGhlIFVSTC4gRG8gbm90ZSB0aGF0IFJGQzIzOTYgc2VjdGlvbiAyLjQuMyBleHBsaWNpdGx5CiAgbWVudGlvbiB0aGVzZSBsZXR0ZXJzIHRvIGJlIGVzY2FwZWQuIFRoaXMgd2FzIHBvc3RlZCBhcyBhIGZlYXR1cmUgcmVxdWVzdCBieQogIEpvcmdlIEd1dGllcnJleiBhbmQgYXMgYSBidWcgYnkgVGVycnkuCgotIFNob3J0IG9wdGlvbnMgdG8gY3VybCB0aGF0IHJlcXVpcmVzIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aG91dAogIGhhdmluZyB0aGUgb3B0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIHNwYWNlIHNlcGFyYXRlZC4gLW9maWxlIHdvcmtzIGFzIGdvb2QgYXMKICAtbyBmaWxlLiAtbTIwIGlzIGVxdWFsIHRvIC1tIDIwLiBEbyBub3RlIHRoYXQgdGhpcyBnb2VzIGZvciBzaW5nbGUtbGV0dGVyCiAgb3B0aW9ucyBvbmx5LCB2ZXJib3NlIC0tbG9uZy1zdHlsZSBvcHRpb25zIHN0aWxsIG11c3QgYmUgc2VwYXJhdGVkIHdpdGgKICBzcGFjZSBmcm9tIHRoZWlyIHBhcmFtZXRlcnMuCgpEYW5pZWwgKDggSmFudWFyeSAyMDAxKQotIEZyYW5jaXMgRGFnZW5haXMgcmVwb3J0ZWQgdGhhdCB0aGUgU0NPIGNvbXBpbGVyIHN0aWxsIGZhaWxzIHdoZW4gY29tcGlsaW5nCiAgY3VybCBkdWUgdG8gdGhhdCBnZXRwYXNzX3IoKSBwcm90b3R5cGUuIEkndmUgbm93IHB1dCBpdCBhcm91bmQgI2lmbmRlZgogIEhBVkVfR0VUUEFTU19SIGluIGFuIGF0dGVtcHQgdG8gcGxlYXNlIHRoZSBTQ08gc3lzdGVtcy4KCi0gTWFkZSBzb21lIG1pbm9yIGNvcnJlY3Rpb25zIHRvIGdldCB0aGUgY2xpZW50IHRvIGNsZWFudXAgcHJvcGVybHkgYW5kIEkgbWFkZQogIHRoZSBzZXBhcmF0b3Igd29yayBhZ2FpbiB3aGVuIGdldHRpbmcgbXVsdGlwbGUgZ2xvYmJlZCBVUkxzIHRvIHN0ZG91dC4KCi0gV29ya2VkIHdpdGggTG9pYyBEYWNoYXJ5IHRvIGdldCB0aGUgbWFrZSBkaXN0IGFuZCBtYWtlIGRpc3RjaGVjayB3b3JrCiAgY29ycmVjdGx5LiBUaGUgJ21ha2V0Z3onIHNjcmlwdCBpcyBub3cgdXNpbmcgdGhlIGF1dG9tYWtlIGdlbmVyYXRlZCAnbWFrZQogIGRpc3QnIHdoZW4gY3JlYXRpbmcgcmVsZWFzZSBhcmNoaXZlcy4gTG9pYyBzdWNjZXNzZnVsbHkgbWFkZSAnbWFrZSBycG1zJwogIGF1dG9tYXRpY2FsbHkgYnVpbGQgUlBNcyEKCkxvaWMgRGFjaGFyeSAoNiBKYW51YXJ5IDIwMDEpCi0gQXV0b21hdGVkIGdlbmVyYXRpb24gb2YgcnBtIHBhY2thZ2VzLCBubyBuZWVkIHRvIGJlIHJvb3QuCgotIG1ha2UgZGlzdGNoZWNrIGdlbmVyYXRlcyBhIHByb3BlciBkaXN0cmlidXRpb24gKEVYVFJBX0RJU1QKICBpbiBhbGwgTWFrZWZpbGUuYW0gbW9kaWZpZWQgdG8gbWF0Y2ggRklMRVMpLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMSkKLSBIdWdlIGNsaWVudC1zaWRlIGhhY2s6IG5vdyBtdWx0aXBsZSBVUkxzIGFyZSBzdXBwb3J0ZWQuIEFueSBudW1iZXIgb2YgVVJMcwogIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXknbGwgYWxsIGJlIGRvd25sb2FkZWQuIFRoZXJlCiAgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgLW8gb3IgLU8gZm9yIGVhY2ggVVJMIG9yIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwogIHN0ZG91dC4gVGhpcyBuZWVkcyBtb3JlIHRlc3RpbmcsIHRpbWUgdG8gcmVsZWFzZSBhIDcuNi1wcmUgcGFja2FnZS4KCi0gVGhlIGtyYjQgc3VwcG9ydCB3YXMgYnJva2VuIGluIHRoZSByZWxlYXNlLiBGaXhlZCBub3cuCgotIEh1Z2UgaW50ZXJuYWwgc3ltYm9sIHJlbmFtZSBvcGVyYXRpb24uIEFsbCBub24tc3RhdGljIGJ1dCBzdGlsbCBsaWItaW50ZXJuYWwKICBzeW1ib2xzIHNob3VsZCBub3cgYmUgcHJlZml4ZWQgd2l0aCAnQ3VybF8nIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoIG90aGVyCiAgbGlicy4gQWxsIHB1YmxpYyBzeW1ib2xzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdjdXJsXycgYW5kIHRoZSByZXN0IHNob3VsZAogIGJlIHN0YXRpYyBhbmQgdGh1cyBpbnZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuIEkgdXBkYXRlZCB0aGUgSU5URVJOQUxTCiAgZG9jdW1lbnQgdG8gc2F5IHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy41LjIKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDEpCi0gQXMgS2V2aW4gUCBSb3RoIHN1Z2dlc3RlZCwgSSd2ZSBhZGRlZCB0ZXh0IHRvIHRoZSBtYW4gcGFnZSBmb3IgZXZlcnkgY29tbWFuZAogIGxpbmUgb3B0aW9uIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3Ugc3BlY2lmeSB0aGF0IG9wdGlvbiBtb3JlIHRoYW4KICBvbmNlLiBUaGF0IGhhc24ndCBiZWVuIGV4YWN0bHkgY3J5c3RhbCBjbGVhciBiZWZvcmUuCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcG9zc2libGUgdG8gcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuIEZvcgogIG9kZCByZWFzb25zIEkgY2FuJ3QgYnVpbGQgY3VybCBwcm9wZXJseSBvdXRzaWRlIHRob3VnaC4gSXQgaGFzIHRvIGRvIHdpdGgKICBjdXJsJ3MgZGVwZW5kZW5jaWVzIG9uIGxpYmN1cmwuLi4KCi0gQ3V0IG9mZiBhbGwgb2xkZXIgKGRhdGVkIDE5OTkgYW5kIGVhcmxpZXIpIENIQU5HRVMgZW50cmllcyBmcm9tIHRoaXMgZmlsZS4KICBUaGUgb2xkZXIgcGllY2UgaXMgbmFtZWQgQ0hBTkdFUy4wIGFuZCBpcyBhZGRlZCB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkgaW4KICBjYXNlIGFueW9uZSB3b3VsZCBuZWVkIGl0LgoKLSBJIGFkZGVkIGFub3RoZXIgZmlsZSAnQ1ZTLUlORk8nIHRvIHRoZSBDVlMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CiAgZmlsZXMgaW4gdGhlIENWUyB0aGF0IGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBob3cgdG8gYnVpbGQKICBjdXJsIHdoZW4geW91IGdldCB0aGUgc291cmNlcyBvZmYgQ1ZTLgoKLSBVcGRhdGVkIENPTlRSSUJVVEUgYW5kIEZBUSBkdWUgdG8gdGhlIG5ldyBsaWNlbnNlLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMSkKLSBSZW5hbWVkIFJFQURNRS5saWJjdXJsIHRvIExJQkNVUkwKCi0gQ2hhbmdlZCBoZWFkZXJzIGluIGFsbCBzb3VyY2VzIGZpbGVzIHRvIHRoZSBuZXcgZHVhbCBsaWNlbnNlIGNvbmNlcHQgb2YKICBjdXJsOiB1c2UgdGhlIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2UgKm9yKiBNUEwuIFRoZSBMRUdBTCBmaWxlIHdhcyB1cGRhdGVkCiAgYWNjb3JkaW5nbHkgYW5kIHRoZSBNUEwgMS4xIGFuZCBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlcyBhcmUgbm93IHBhcnQgb2YgdGhlCiAgcmVsZWFzZSBhcmNoaXZlLgpEYW5pZWwgKDMwIERlY2VtYmVyIDIwMDApCi0gTWFkZSBhbGwgRlRQIGNvbW1hbmRzIGdldCBzZW50IHdpdGggdGhlIHRyYWlsaW5nIENSTEYgaW4gb25lIHNpbmdsZSB3cml0ZSgpCiAgYXMgc3BsaXR0aW5nIHRoZW0gdXAgc2VlbXMgdG8gY29uZnVzZSBhdCBsZWFzdCBzb21lIGZpcmV3YWxscyAoRlctMSBiZWluZwogIG9uZSBtYWpvcikuCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDApCi0gQWRkZWQgZmlsZSBkZXNyY2lwdG9yIGFuZCBGSUxFIGhhbmRsZSBsZWFrIGRldGVjdGlvbiB0byB0aGUgbWVtZGVidWcgc3lzdGVtCiAgYW5kIHRodXMgSSBmb3VuZCBhbmQgcmVtb3ZlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrYWdlIGluIHRoZSBmdHAgcGFydHMKICB0aGF0IGhhcHBlbmVkIHdoZW4geW91IGRpZCBQT1JUZWQgZG93bmxvYWRzLgoKLSBBZGRlZCBhbiBpbmNsdWRlIDxzdGRpby5oPiBpbiA8Y3VybC9jdXJsLmg+IHNpbmNlIGl0IHVzZXMgRklMRSAqLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDAwKQotIE11bHRpcGxlIFVSTCBkb3dubG9hZHMgd2l0aCAtTyB3YXMgc3RpbGwgYnVnZ2luZy4gTm90IGFueW1vcmUgSSB0aGluayBvcgogIGhvcGUsIG9yIGF0IGxlYXN0IEkndmUgdHJpZWQuLi4gOi1PCgotIEZyYW5jb2lzIFBldGl0amVhbiBmaXhlZCBhbm90aGVyIC1PIHByb2JsZW0KClZlcnNpb24gNy41LjEKCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMCkKLSBDbGVhbmVkIHVwIGEgZmV3IG9mIHRoZSBtYWtlZmlsZXMgdG8gdXNlIHVuaXgtc3R5bGUgbmV3bGluZXMgb25seS4gQXMgS2V2aW4KICBQIFJvdGggZm91bmQgb3V0LCBhdCBsZWFzdCBvbmUgQ1ZTIGNsaWVudCBiZWhhdmVkIHdyb25nbHkgd2hlbiBpdCBmb3VuZAogIGRpZmZlcmVudCBuZXdsaW5lIGNvbnZlbnRpb25zIHdpdGhpbiB0aGUgc2FtZSBmaWxlLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGNvcnJlY3RlZCB0aGUgTERGTEFHUyB1c2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yCiAgdGhlIFNTTCBzdHVmZi4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDAwKQotIE1hc3NpbW8gU3F1aWxsYWNlIGNvcnJlY3RseSBkZXNjcmliZWQgaG93IGxpYmN1cmwgY291bGQgdXNlIHNlc3Npb24gaWRzIHdoZW4KICBkb2luZyBTU0wgY29ubmVjdGlvbnMuCgotIEphbWVzIEdyaWZmaXRocyBmb3VuZCBvdXQgdGhhdCBjdXJsIHdvdWxkIGNyYXNoIGlmIHRoZSBmaWxlIHlvdSBzcGVjaWZ5IHdpdGgKICAtbyBpcyBzaG9ydGVyIHRoYW4gdGhlIFVSTCEgVGhpcyB0b29rIHNvbWUgaG91cnMgdG8gZnVsbHkgaHVudCBkb3duLCBidXQgaXQKICBpcyBmaXhlZCBub3cuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMCkKLSBKYWVwaWwgS2ltIHNlbnQgdXMgbWFrZWZpbGVzIHRoYXQgYnVpbGQgY3VybCB1c2luZyB0aGUgZnJlZSB3aW5kb3dzIGJvcmxhbmQKICBjb21waWxlci4gVGhlIHJvb3QgbWFrZWZpbGUgbm93IGFjY2VwdHMgJ21ha2UgYm9ybGFuZCcgdG8gYnVpbGQgY3VybCB3aXRoCiAgdGhhdCBjb21waWxlci4KCi0gU3RlZmFuIFJhZG1hbiBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZXN0IG1ha2VmaWxlcyBkaWRuJ3QgdXNlIHRoZSBQRVJMCiAgdmFyaWFibGUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmlndXJlIG91dC4gQWN0dWFsbHksIHlvdSBzdGlsbCBuZWVkCiAgcGVybCBpbiB0aGUgcGF0aCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuIG9rLgoKLSBSaWNoIEdyYXkgZm91bmQgbnVtZXJvdXMgcG9ydGFiaWxpdHkgcHJvYmxlbXM6CiAgKiBUaGUgU0NPIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBvbiB0aGUgZ2V0cGFzc19yKCkgcHJvdG90eXBlIGluIGdldHBhc3MuaAogICAgc2luY2UgdGhlIGN1cmwgb25lIGRpZmZlcmVkIGZyb20gdGhlIFNDTyBvbmUKICAqIFRoZSBIUFVYIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBiZWNhdXNlIG9mIGhvdyBjdXJsIGRpZCB0aGUgc2lnYWN0aW9uCiAgICBzdHVmZiBhbmQgdXNlZCBhIGRlZmluZSBIUFVYIGRvZXNuJ3QgaGF2ZSAob3IgbmVlZCkuCiAgKiBBIGZldyBtb3JlIHByb2JsZW1zIHJlbWFpbiB0byBiZSByZXNlYXJjaGVkLgoKLSBQYXVsIEhhcnJpbmd0b24gZXhwZXJpZW5jZWQgYSBjb3JlIGR1bXAgdXNpbmcgaHR0cHMuIE5vdCBtdWNoIGRldGFpbHMgeWV0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDApCi0gSvZybiBIYXJ0cm90aCBmaXhlZCBhIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBVUkxzIGFuZCAtby8tTy4KClZlcnNpb24gNy41CgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwMCkKLSBDcmFpZyBEYXZpc29uIGdhdmUgdXMgaGlzIHVwZGF0ZXMgb24gdGhlIFZDKysgbWFrZWZpbGVzLCBzbyBub3cgY3VybCBzaG91bGQKICBidWlsZCBmaW5lIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBvbiB3aW5kb3dzIHRvby4KCi0gRml4ZWQgdGhlIGxpYmN1cmwgdmVyc2lvbmluZyBzbyB0aGF0IHdlIGRvbid0IHJ1aW4gb2xkIHByb2dyYW1zIHdoZW4KICByZWxlYXNpbmcgbmV3IHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZXMuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDApCi0gUmVuYW1lZCBkb2NzL1JFQURNRS5jdXJsIHRvIGRvY3MvTUFOVUFMIHRvIGJldHRlciByZWZsZWN0IHdoYXQgdGhlIGRvY3VtZW50CiAgYWN0dWFsbHkgY29udGFpbnMuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDApCi0gSSByZW1vdmVkIGEgYnVuY2ggb2YgJyNpZiAwJyBzZWN0aW9ucyBmcm9tIHRoZSBjb2RlLiBUaGV5IG9ubHkgbWFrZSB0aGluZ3MKICBoYXJkZXIgdG8gZm9sbG93LiBBZnRlciBhbGwsIHdlIGRvIGhhdmUgYWxsIG9sZGVyIHZlcnNpb25zIGluIHRoZSBDVlMuCgpWZXJzaW9uIDcuNS1wcmU1CgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgoKLSBDaHJpcyBGYWhlcnR5IGZpeGVkIGEgZnJlZS10d2ljZSBwcm9ibGVtIGluIGxpYi9maWxlLmMKCi0gSSBmaXhlZCB0aGUgcGVybCBodHRwIHNlcnZlciBwcm9ibGVtIGluIHRoZSB0ZXN0IHN1aXRlLgoKVmVyc2lvbiA3LjQuMiBwcmU0CgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDApCi0gSSd2ZSAoZmluYWxseSkgc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIEl0IGlzIGluIHRoZSBuZXcKICB0ZXN0cy8gZGlyZWN0b3J5LiBJdCByZXF1aXJlcyBzaCBhbmQgcGVybC4gVGhlcmUncyBhIFRDUCBzZXJ2ZXIgaW4gcGVybCBhbmQKICBtb3N0IG9mIHRoZSBvdGhlciBzdHVmZiBydW5uaW5nIGEgcHJldHR5IHNpbXBsZSBzaGVsbCBzY3JpcHQuCgogIEkndmUgb25seSBtYWRlIGZvdXIgdGVzdCBjYXNlcyBzbyBmYXIsIGJ1dCBpdCBwcm92ZXMgdGhlIHN5c3RlbSBjYW4gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgbm90aWNlZCB0aGF0IGN1cmwgZGlkbid0IHNldCBUWVBFIHdoZW4gZG9pbmcgLS1oZWFkIGNoZWNrcwogIGZvciBzaXplcyBvbiBGVFAgc2VydmVycy4gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gcmV0dXJuIGRpZmZlcmVudCBzaXplcwogIGRlcGVuZGluZyBvbiB3aGV0aGVyIEFTQ0lJIG9yIEJJTkFSWSBpcyB1c2VkIQoKLSBMYXVyZW50IFBhcGllciBkZXRlY3RlZCB0aGF0IGlmIHlvdSBhcHBlbmRlZCBhIEZUUCB1cGxvYWQgYW5kIGV2ZXJ5dGhpbmcgd2FzCiAgYWxyZWFkeSB1cGxvYWRlZCwgY3VybCB3b3VsZCBoYW5nLgoKLSBBbmd1cyBNYWNrYXkncyBnZXRwYXNzX3IoKSBpbiBsaWIvZ2V0cGFzcy5jIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUKICBnZXRwYXNzX3IoKSBmdW5jdGlvbiBpdCBzZWVtcyBzb21lIHN5c3RlbXMgYWN0dWFsbHkgaGF2ZS4KCi0gVmVua2F0YXJhbWFuYSBNb2trYXBhdGkgZGV0ZWN0ZWQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIgYW5kIGNvcnJlY3RlZAogIGl0LiAgSWYgdGhlIGNvb2tpZSB3YXMgc2V0IGZvciB0aGUgZnVsbCBob3N0IG5hbWUgKGRvbWFpbj1mdWxsLmhvc3QuY29tKSwKICB0aGUgY29va2llIHdhcyBuZXZlciBzZW50IGJhY2sgYmVjYXVzZSBvZiBhIGZhdWx0eSBsZW5ndGggY29tcGFyaXNvbiBiZXR3ZWVuCiAgdGhlIHNldCBkb21haW4gbGVuZ3RoIGFuZCB0aGUgY3VycmVudCBob3N0IG5hbWUuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCAoT1MvMiBzZWVtcyB0byBuZWVkCiAgaXQpLiBBZGRlZCBhIGNoZWNrIGZvciBSU0FnbHVlL3JzYXJlZiBmb3IgdGhlIGNhc2VzIHdoZXJlIGxpYmNyeXB0byBpcyBmb3VuZAogIGJ1dCBsaWJzc2wgaXNuJ3QuIEkgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIGZpeCB5ZXQgdGhvdWdoLCBhcyBJIGhhdmUgbm8KICBzeXN0ZW0gdGhhdCByZXF1aXJlcyB0aG9zZSBsaWJzIHRvIGJ1aWxkLgoKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDApCi0gV2hlbiBJIGFkZGVkIC0taW50ZXJmYWNlLCB0aGUgbmV3IGVycm9yIGNvZGUgdGhhdCB3YXMgYWRkZWQgd2l0aCBpdCB3YXMKICBpbnNlcnRlZCBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHRodXMgYWxsIGVycm9yIGNvZGVzIGZyb20gMzUgYW5kIHVwd2FyZHMgZ290CiAgaW5jcmVhc2VkIG9uZSBzdGVwLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQsIHdlJ3JlIGJhY2sgYXQgdGhlIHByZXZpb3VzCiAgbnVtYmVycy4gQWxsIG5ldyBleGl0IGNvZGVzIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjaGVjayBmb3Igc2lnbmFsKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc28gdGhhdCBpZiBzaWdhY3Rpb24oKQogIGlzbid0IHByZXNlbnQsIHdlIGNhbiB1c2Ugc2lnbmFsKCkgaW5zdGVhZC4KCi0gSSdtIGhhdmluZyBhIGxpY2Vuc2UgZGlzY3Vzc2lvbiBnb2luZyBvbiBwcml2YXRlbHkuIFRoZSBpc3N1ZSBpcyB5ZXQgYWdhaW4KICBHUEwtbGljZW5zZWQgcHJvZ3JhbXMgdGhhdCBoYXZlIHByb2JsZW1zIHdpdGggTVBMLiBJIGFtIGxlYW5pbmcgdG93YXJkcwogIG1ha2luZyBhIGtpbmQgb2YgZHVhbC1saWNlbnNlIHRoYXQgd2lsbCBzb2x2ZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwuLi4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDAwKQotIEFkZGVkIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5LiBJIGludGVuZCB0byBsZXQgdGhpcyBjb250YWluIHNvbWUgZG9jcyBhbmQKICB0ZW1wbGF0ZXMgb24gaG93IHRvIGdlbmVyYXRlIGN1c3RvbS1mb3JtYXQgcGFja2FnZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLgogIEkndmUgbm93IHJlbW92ZWQgdGhlIFJQTSByZWxhdGVkIGN1cmwuc3BlYyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHJvb3QuCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMCkKLSBULiBCaGFyYXRoIGJyb3VnaHQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGJyaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHRvCiAgY3VybF9lYXN5X2dldGluZm8oKSBhbmQgY3VybF9lYXN5X3NldG9wdCgpLiBOb3cgeW91IGNhbiByZXF1ZXN0IHBlZXIKICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2l0aCB0aGUgKnNldG9wdCgpIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgb3B0aW9uCiAgYW5kIHRoZW4gdXNlIHRoZSBDVVJMT1BUX0NBSU5GTyB0byBzZXQgdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgcmVtb3RlCiAgcGVlciBhZ2FpbnN0LiBBZnRlciBhbiBzdWNoIGFuIG9wZXJhdGlvbiB3aXRoIGEgdmVyaWZpY2F0aW9uIHJlcXVlc3QsIHRoZQogICpfZ2V0aW5mbygpIG9wdGlvbiBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CiAgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBvciBub3QuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgdXMgYSBzcGxlbmRpZCBwYXRjaCB0aGF0IHNvbHZlcyB0aGUgbG9uZy1zdGFuZGluZwogIGFubm95aW5nIHByb2JsZW0gd2l0aCB0aW1lb3V0cyB0aGF0IG1hZGUgY3VybCBleGl0IHdpdGggc2lsbHkgZXhpdCBjb2RlcwogICh3aGljaCBhcyBiZWVuIGNvbW1lbnRlZCBvdXQgbGF0ZWx5KS4gVGhpcyBzb2x1dGlvbiBpcyBzaWdhY3Rpb24oKSBiYXNlZCBhbmQKICBvZiBjb3Vyc2UgdGhlbiBvbmx5IHdvcmtzIGZvciB1bml4ZXMgKGFuZCBvbmx5IHRob3NlIHVuaXhlcyB0aGF0IGFjdHVhbGx5CiAgaGF2ZSB0aGUgc2lnYWN0aW9uKCkgZnVuY3Rpb24pLgoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBmbGF3IG1lbnRpb25lZCBieSBLZXZpbiBSb3RoCiAgdGhhdCBtYWRlIHRoZSBwYXNzd29yZCBnZXQgZWNob2VkIHdoZW4gcHJvbXB0ZWQgZm9yIGludGVyYWN0aXZlbHkuIFRoZQogIGdldHBhc3MoKSBmdW5jdGlvbiAobm93IGtub3duIGFzIG15X2dldHBhc3MoKSkgd2FzIGFsc28gZml4ZWQgdG8gbm90IHVzZSBhbnkKICBzdGF0aWMgYnVmZmVycy4gVGhpcyBhbHNvIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlICJzdGFuZGFyZCIgZ2V0cGFzcygpCiAgZnVuY3Rpb24gZXZlbiBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgaXQsIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlLgoKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwMCkKLSBZZXQgYW5vdGhlciBodHRwIHNlcnZlciBiYXJmZWQgb24gY3VybCdzIHJlcXVlc3QgdGhhdCBpbmNsdWRlIHRoZSBwb3J0CiAgbnVtYmVyIGluIHRoZSBIb3N0OiBoZWFkZXIgYWx3YXlzLiBJIG5vdyBvbmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIGl0CiAgaXNuJ3QgdGhlIGRlZmF1bHQgKDgwIGZvciBIVFRQLCA0NDMgZm9yIEhUVFBTKS4gd3d3LnBlcmwuY29tIHR1cm5lZCBvdXQgdG8KICBydW4gb25lIG9mIHRob3NlIG5hc3R5IHNlcnZlcnMuCgotIFRoZSBQSFA0IG1vZHVsZSBmb3IgY3VybCBoYWQgcHJvYmxlbXMgd2l0aCByZWZlcmVyIHRoYXQgc2VlbXMgdG8gaGF2ZSBiZWVuCiAgY29ycmVjdGVkIGp1c3QgeWVzdGVyZGF5LiAoU3RlcmxpbmcgSHVnaGVzIG9mIHRoZSBQSFAgdGVhbSBjb25maXJtZWQgdGhpcykKCkRhbmllbCAoMTcgT2N0b2JlciAyMDAwKQotIFZsYWRpbWlyIE9ibG9tb3YgcmVwb3J0ZWQgdGhhdCB0aGUgLVkgYW5kIC15IG9wdGlvbnMgZGlkbid0IHdvcmsuIFRoZXkKICBkaWRuJ3Qgd29yayBmb3IgbWUgZWl0aGVyLiBUaGlzIG9uY2UgYWdhaW4gcHJvdmVzIHdlIHNob3VsZCBoYXZlIHRoYXQgdGVzdAogIHN1aXRlLi4uCgotIEkgZmluYWxseSBjaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIGxpYmN1cmwgcmV0dXJucyBpZiB5b3UgdHJ5IGEgaHR0cHM6Ly8KICBVUkwgd2hlbiB0aGUgbGlicmFyeSB3YXNuJ3QgYnVpbGQgd2l0aCBTU0wgZW5hYmxlZC4gSXQgd2lsbCBub3cgcmV0dXJuIHRoaXMKICBlcnJvcjoKICAgICAgICAibGliY3VybCB3YXMgYnVpbHQgd2l0aCBTU0wgZGlzYWJsZWQsIGh0dHBzOiBub3Qgc3VwcG9ydGVkISIKCiAgSSByZWFsbHkgaG9wZSBpdCB3aWxsIG1ha2UgaXQgYSBiaXQgY2xlYXJlciB0byB1c2VycyB3aGVyZSB0aGUgYWN0dWFsCiAgcHJvYmxlbSBsaWVzLgoKVmVyc2lvbiA3LjQuMQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gSSBmb3Jnb3QgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIG1hbGxvYyBkZWJ1ZyBkZWZpbmVzIGZyb20gdGhlIG1ha2VmaWxlcyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUgKG9mIGNvdXJzZSkuCgpWZXJzaW9uIDcuNAoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gVGhlIGJ1ZmZlciBvdmVyZmxvdyBtZW50aW9uZWQgYmVsb3cgd2FzIHBvc3RlZCB0byBidWd0cmFxIG9uIEZyaWRheSAxM3RoLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDApCi0gQ29saW4gUm9iZXJ0IFBoaXBwcyBlbGVnYW50bHkgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93LiBJdCBjb3VsZCBiZSB1c2VkCiAgYnkgYW4gZXZpbCBmdHAgc2VydmVyIHRvIGNyYXNoIGN1cmwuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgb2YgcmVwbGFjaW5nIGEKICBmZXcgb3RoZXIgc3ByaW50ZigpcyBpbnRvIHNucHJpbnRmKClzIGFzIHdlbGwuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMCkKLSBGb3VuZCBzb21lIG1vcmUgbWVtb3J5IGxlYWtzLiBUaGlzIG5ldyBzaW1wbGUgbWVtb3J5IGRlYnVnZ2VyIGhhcyB0dXJuZWQgb3V0CiAgcmVhbGx5IHVzZWZ1bCEKClZlcnNpb24gNy40IHByZTYKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gRmxvcmlhbiBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYm9vbCB0eXBlZGVmIGluIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlCiAgZmlsZSB3YXMgYnJlYWtpbmcgUEhQIDQuMC4zIGNvbXBpbGluZy4gVGhlIGJvb2wgdHlwZWRlZiBpcyBub3QgdXNlZCBpbiB0aGUKICBwdWJsaWMgaW50ZXJmYWNlIGFuZCB3YXMgd3JvbmdseSBpbnNlcnRlZCBpbiB0aGF0IGhlYWRlciBmaWxlLgoKLSBK9nJnIEhhcnRyb3RoIGNvcnJlY3RlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGluIHRoZSBzcmMvdXJsZ2xvYi5jIHN0dWZmLiBJdAogIGRpZG4ndCBoYXJtIGFueW9uZSBzaW5jZSB0aGUgbWVtb3J5IGlzIGZyZWUoKWVkIG9uIGV4aXQgYW55d2F5LgoKLSBDb3JyZWN0ZWQgdGhlIHNyYy9tYWluLmMuIFdlIHVzZSB0aGUgX01QUklOVEZfUkVQTEFDRSAjZGVmaW5lIHRvIHVzZSBvdXIKICBsaWJjdXJsLXByaW50ZigpIGZ1bmN0aW9ucy4gVGhpcyBnaXZlcyB1cyBzbnByaW50ZigpIGV0IGFsIG9uIGFsbAogIHBsYXRmb3Jtcy4gSSBjb252ZXJ0ZWQgdGhlIGFsbG9jYXRlZCB1c2VyYWdlbnQgc3RyaW5nIHRvIG9uZSB0aGF0IHVzZXMgYQogIGxvY2FsIGJ1ZmZlci4KCi0gSSd2ZSBzZXQgYW4gI2lmIDAgc2VjdGlvbiBhcm91bmQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyCiAgZ2VuZXJhdGVkIGluIGxpYi9mb3JtZGF0YS5jLiBUaGlzIHdpbGwgaG9wZWZ1bGx5IG1ha2UgY3VybCBkbyBtb3JlCiAgUEhQLWZyaWVuZGx5IG11bHRpLXBhcnQgcG9zdHMuCgpWZXJzaW9uIDcuNCBwcmU1CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIE5pY28gQmFnZ3VzIGZvdW5kIG91dCB0aGF0IGN1cmwncyBhYmlsaXR5IHRvIGZvcmNlIGEgQVNDSUkgZG93bmxvYWQgd2hlbgogIHVzaW5nIEZUUCB3YXMgbm8gbG9uZ2VyIHdvcmtpbmchIEkgY29ycmVjdGVkIHRoaXMuIFRoaXMgcHJvYmxlbSB3YXMgcHJvYmFibHkKICBpbnRyb2R1Y2VkIHdoZW4gSSByZWRlc2lnbmVkIGxpYmN1cmwgZm9yIHZlcnNpb24gNy4KCi0gR2VvcmcgSG9ybiBwcm92aWRlZCBhIHNvdXJjZSBleGFtcGxlIHRoYXQgcHJvdmVkIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybC4KICBJIGFkZGVkIHNpbXBsZSBtZW1vcnkgZGVidWdnaW5nIGZhY2lsaXRpZXMgYW5kIG5vdyB3ZSBjYW4gbWFrZSBsaWJjdXJsIGxvZwogIGFsbCBtZW1vcnkgZmlkZGxpbmcgZnVuY3Rpb25zLiBBbiBhZGRpdGlvbmFsIHBlcmwgc2NyaXB0IGlzIHVzZWQgdG8gYW5hbHl6ZQogIHRoZSBvdXRwdXQgbG9nZmlsZSBhbmQgdG8gbWF0Y2ggbWFsbG9jKClzIHdpdGggZnJlZSgpcyBldGMuIFRoZSBtZW1vcnkgbGVhawogIEdlb3JnIGZvdW5kIHR1cm5lZCBvdXQgdG8gYmUgdGhlIG1haW4gY29va2llIHN0cnVjdCB0aGF0IGNvb2tpZV9jbGVhbnVwKCkKICBkaWRuJ3QgZnJlZSEgVGhlIHBlcmwgc2NyaXB0IGlzIG5hbWVkIG1lbWFuYWx5emUucGwgYW5kIGl0IGlzIGF2YWlsYWJsZSBpbgogIHRoZSBDVlMgcmVzcG9zaXRvcnksIG5vdCBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGZvdW5kIGEgR2V0SG9zdCgpIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgaXQgbmV2ZXIgYXNzaWduZWQgdGhlCiAgcG9pbnRlciBpbiB0aGUgdGhpcmQgYXJndW1lbnQgcHJvcGVybHkhIFRoaXMgY291bGQgbWFrZSBhIGNyYXNoLCBvciBhdCBiZXN0CiAgYSBtZW1vcnkgbGVhayEKClZlcnNpb24gNy40IHByZTQKCkRhbmllbCAoNiBPY3RvYmVyIDIwMDApCi0gSXMgdGhlIC1GIHBvc3QgZm9sbG93aW5nIHRoZSBSRkMgMTg2NyBzcGVjPyBXZSBoYWQgdGhpcyBkaWN1c3Npb24gb24gdGhlCiAgbWFpbGluZyBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgY3VybCBjYW4ndCBwb3N0IC1GIGZvcm0gcG9zdHMgdG8gYSBQSFAKICByZWNlaXZlci4uLiBJJ3ZlIGJlZW4gaW4gdG91Y2ggd2l0aCB0aGUgUEhQIGRldmVsb3BlcnMgYWJvdXQgdGhpcy4KCi0gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IHRoYXQgdGhlIGxvbmcgb3B0aW9uICctLXByb3h5JyB3YXNuJ3Qgd29ya2luZwogIGFueW1vcmUhIFRoZSBvcHRpb24gcGFyc2VyIGdvdCBjb25mdXNlZCB3aGVuIEkgYWRkZWQgdGhlIC0tcHJveHl0dW5uZWwgZm9yCiAgNy4zLiBUaGlzIHdhcyBpbmRlZWQgYSB2ZXJ5IG9sZCBmbGF3IHRoYXQgaGFzbid0IHR1cm5lZCB1cCB1bnRpbCBub3cuLi4KCi0gSvZybiBIYXJ0cm90aCBwcm92aWRlZCBwYXRjaGVzLCB1cGRhdGVkIG1ha2VmaWxlcyBhbmQgdHdvIG5ldyBmaWxlcyBmb3IgRExMCiAgc3R1ZmYgb24gd2luMzIuIEhlIGFsc28gcG9pbnRlZCBvdXQgdGhhdCBsaWIgc291cmNlIGZpbGVzIHdlcmUgY29tcGlsZWQgd2l0aAogIC1JLi4vc3JjIHdoaWNoIGlzbid0IG9ubHkgd3JvbmcgYnV0IHBsYWluIHN0dXBpZCEKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAgcmVzdW1lLiBDdXJsIHByZXZpb3VzbHkgdXNlZAogIGEgbG9jYWwgdmFyaWFibGUgYmFkbHksIHRoYXQgY291bGQgbGVhZCB0byBjcmFzaGVzLgoKVmVyc2lvbiA3LjQgcHJlMwoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMCkKLSBNb3JlIGRvY3Mgd3JpdHRlbi4gVGhlIGN1cmxfZWFzeV9nZXRpbmZvLjMgbWFuIHBhZ2UgaXMgbm93IHByZXR0eSBhY2N1cmF0ZSwKICBhcyBpcyB0aGUgLXcgc2VjdGlvbiBpbiBjdXJsLjEuIEkgYWRkZWQgdHdvIG9wdGlvbnMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlZCBoZWFkZXJzJyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgSFRUUAogIHJlcXVlc3QuIFQuIEJoYXJhdGggcmVxdWVzdGVkIHRoZW0uCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCgpWZXJzaW9uIDcuNCBwcmUxCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDAwKQotIFJpcHBlZCBvdXQgdGhlIC13IHN0dWZmIGZyb20gdGhlIGxpYnJhcnkgYW5kIHB1dCBpbiB0aGUgY3VybCB0b29sLiBJdCBnZXRzCiAgYWxsIHRoZSByZWxldmFudCBpbmZvIGZyb20gdGhlIGxpYnJhcnkgdXNpbmcgdGhlIG5ldyBjdXJsX2Vhc3lfZ2V0aW5mbygpCiAgZnVuY3Rpb24uCgotIGJyYWQgYXQgb3BlbmJzZC5vcmcgbWFpbGVkIG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgbXkga2VyYmVyb3MgbWlzdGFrZSBhbmQKICByZW1vdmVkIGEgY29tcGlsZXIgd2FybmluZyBmcm9tIGhvc3RpcC5jIHRoYXQgT3BlbkJTRCBwZW9wbGUgZ2V0LgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBPZiBjb3Vyc2UgKEkgc2hvdWxkIHByb2JhYmx5IGdldCBwdW5pc2hlZCBzb21laG93KSBJIGRpZG4ndCBwcm9wZXJseSBjb3JyZWN0CiAgdGhlICNpbmNsdWRlIGxpbmVzIGZvciB0aGUgYmFzZTY0IHN0dWZmIGluIHRoZSBrZXJiZXJvcyBzb3VyY2VzIGluIHRoZSBqdXN0CiAgcmVsZWFzZWQgNy4zIHBhY2thZ2UuIFRoZXkgc3RpbGwgaW5jbHVkZSB0aGUgKl9rcmIuaCBmaWxlcyEgTm93LCB0aGUgZXJyb3IKICBpcyBzb29vIHZlcnkgZWFzeSB0byBzcG90IGFuZCBmaXggc28gSSB3b24ndCBib3RoZXIgd2l0aCBhIHF1aWNrIGJ1ZyBmaXgKICByZWxlYXNlLiBJJ2xsIHBvc3QgYSBwYXRjaCB3aGVuZXZlciBvbmUgaXMgbmVlZGVkIGluc3RlYWQuIEl0J2xsIGJlCiAgYXZhaWxhYmxlIGluIHRoZSBDVlMgaW4gYSBmZXcgbWludXRlcyBhbnl3YXkuCgpWZXJzaW9uIDcuMwoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHRoZSBiYXNlNjRfa3JiLltjaF0gZmlsZXMuIFRoZXkndmUgbm93IHJlcGxhY2VkIHRoZSBmb3JtZXIKICBiYXNlNjQuW2NoXSBmaWxlcy4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBzb21lIGRvY3MuCgotIEkgY2hhbmdlZCB0aGUgT3BlblNTTCBmaXggdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIGFzIHdlbGwuIFRoZSBwb3N0ZWQKICBwYXRjaCB3YXMgb25seSB3b3JraW5nIHdpdGggMC45LjYgYW5kIG5vIG9sZGVyIG9uZXMuCgpWZXJzaW9uIDcuMy1wcmU4CgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAwKQotIEVyZG11dCBQZmVpZmVyIGluZm9ybWVkIHVzIHRoYXQgY3VybCBkaWRuJ3QgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42IGFuZAogIHNob3dlZCB1cyB3aGF0IG5lZWRlZCB0byBnZXQgcGF0Y2hlZCBpbiBvcmRlciB0byBtYWtlIGl0IGJ1aWxkIHByb3Blcmx5CiAgYWdhaW4uCgotIERpcmsgS3J1c2NoZXdza2kgZm91bmQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIuIEkgbWFkZSBhbiBhbHRlcm5hdGl2ZQogIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBEaXJrIGhpbXNlbGYgc3VnZ2VzdGVkLiBUaGUgYnVnIG1hZGUgYSBjb29raWUKICBoZWFkZXIgdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZW1pY29sb24gdG8gbm90IGdldCBwYXJzZWQuCgotIEkndmUgbWFya2VkIC1jIGFuZCAtdCBkZXByZWNhdGVkIG5vdy4gSWYgeW91IHVzZSBhbnkgb2YgdGhlbSwgY3VybCB3aWxsIHRlbGwKICB5b3UgdG8gdXNlICItQyAtIiBvciAiLVQgLSIgaW5zdGVhZC4gSSBkb24ndCB0aGluayBvY2N1cHlpbmcgdHdvIGxldHRlcnMgZm9yCiAgbmVhcmx5IGlkZW50aWNhbCBmdW5jdGlvbnMgaXMgZ29vZCB1c2UuIEFsc28sIC1UIC0ga2luZCBvZiBmb2xsb3dzIHRoZSBjdXJsCiAgdHJhZGl0aW9uIG9mIHVzaW5nIC0gZm9yIHN0ZGluIHdoZXJlIGEgZmlsZSBuYW1lIGlzIGV4cGVjdGVkLgoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGZpbmFsbHkgbWFkZSB0aGUga3JiNCBmdHAgdXBsb2FkCiAgd29yayEKCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zIGNvZGUgaXMgbm90IHF1aXRlIHRocmVhZC1zYWZlIHlldC4gVGhlcmUgYXJlIGEgZmV3IG1vcmUgZ2xvYmFscwogIHRoYXQgbmVlZCB0byBiZSB0YWtlIGNhcmUgb2YuIExldCdzIGdldCB0aGUgdXBsb2FkIHdvcmtpbmcgZmlyc3QhCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDAwKQotIFJpY2hhcmQgUHJlc2NvdHQgc29sdmVkIGFub3RoZXIgbmFtZSBsb29rdXAgYnVmZmVyIHNpemUgcHJvYmxlbS4gSSB0b29rIHRoaXMKICBvcHBvcnR1bml0eSB0byByZXdyaXRlIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24uIFdpdGggdGhlc2UgbGFyZ2UgYnVmZmVyCiAgc2l6ZXMsIEkgdGhpbmsga2VlcGluZyB0aGVtIGFzIGxvY2FsIGFycmF5cyBxdWlja2x5IHR1cm4gdWdseS4gSSBub3cgdXNlCiAgbWFsbG9jKCkgdG8gZ2V0IHRoZSBidWZmZXIgbWVtb3J5LiBUaGFua3MgdG8gdGhpcywgSSBub3cgY2FuIHJlYWxsb2MoKSB0byBhCiAgbGFyZ2UgYnVmZmVyIGluIGNhc2Ugb2YgZGVtYW5kIChlcnJubyA9PSBFUkFOR0UpIGluIGNhc2UgYSBzb2x1dGlvbiBsaWtlCiAgdGhhdCB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJIHN0aWxsIHdhbnQgdG8gYXZvaWQgdGhhdCBraW5kIG9mIG5hc3RpbmVzcy4KCi0gVHJpZWQgdG8gY29tcGlsZSBhbmQgcnVuIGN1cmwgb24gTGludXggZm9yIGFscGhhIGFuZCBGcmVlQlNEIGZvciBhbHBoYS4gV2VudAogIGFzIHNtb290aCBhcyBpdCBjb3VsZC4KCi0gQWRkZWQgYSBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHR3byB0aW55IGV4YW1wbGUgc291cmNlcyB0aGF0IHNob3cgaG93CiAgdG8gdXNlIGxpYmN1cmwuIEkgaG9wZSB1c2VycyB3aWxsIHN1cHBseSBtZSB3aXRoIG1vcmUgdXNlZnVsIGV4YW1wbGVzCiAgZnVydGhlciBvbi4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEr2cm4gSGFydHJvdGggdG8gbm8gbG9uZ2VyIHVzZSB0aGUgd29yZCAnaW50ZWZhY2UnIGluIHRoZQogIGNvbmZpZyBzdHJ1Y3QgaW4gdGhlIHNyYy9tYWluLmMgZmlsZSBzaW5jZSBjZXJ0YWluIGNvbXBpbGVycyBoYXZlIHRoYXQgd29yZAogICJyZXNlcnZlcmVkIi4gIEkgZmlndXJlIHRoYXQgaXMgc29tZSBraW5kIG9mIEMrKyBkZWNlYXNlLgoKLSBVcGRhdGVkIHRoZSBjdXJsLjEgbWFuIHBhZ2Ugd2l0aCAtLWludGVyZmFjZSBhbmQgLS1rcmI0LgoKLSBNb2RpZmllZCB0aGUgYmFzZTY0RW5jb2RlKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIHRoZSBrZXJiZXJvcyBvbmUsIHNvIHRoYXQKICBJIGNvdWxkIHJlbW92ZSB0aGUgdXNlIG9mIHRoYXQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yICp0d28qIGJhc2U2NCBlbmNvZGluZwogIGZ1bmN0aW9ucyEgOy0pCgpWZXJzaW9uIDcuM3ByZTUKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zNC1sYXllciBzb3VyY2UgY29kZSB0aGF0IGlzIG11Y2ggImluZmx1ZW5jZWQiIGJ5IHRoZSBvcmlnaW5hbAogIGtyYjQgc291cmNlIGNvZGUsIHRocm91Z2ggeWFmYyBpbnRvIGN1cmwsIHdhcyB1c2luZyBxdWl0ZSBhIGxvdCBvZiBnbG9iYWwKICB2YXJpYWJsZXMuIGxpYmN1cmwgY2FuJ3Qgd29yayBwcm9wZXJseSB3aXRoIGdsb2JhbHMgbGlrZSB0aGF0IHdoeSBJIGhhZCB0bwogIGNsZWFuIHVwIGFsbW9zdCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbmV3IHNlY3VyaXR5LmMgdG8gbWFrZSB0aGVtIHVzZQogIGNvbm5lY3Rpb24gc3BlY2lmaWMgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbHMuIEkganVzdCBob3BlIEkgZGlkbid0CiAgZGVzdHJveSBhbnl0aGluZyBub3cuLi4gOi0pIGNvbmZpZ3VyZSB1cGRhdGVkLCB2ZXJzaW9uIHN0cmluZyBub3cgcmVmbGVjdHMKICBrcmI0IGJ1aWx0LWluLiBJdCBhbG1vc3Qgd29ya3Mgbm93LiBPbmx5IHVwbG9hZHMgYXJlIHN0aWxsIGJlaW5nIG5hdWdodHkuCgpWZXJzaW9uIDcuM3ByZTMKCkRhbmllbCAoMTggU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBzdXBwbGllZCBhIG1ham9yIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBrcmI0LWZ0cCBzdXBwb3J0IHRvCiAgY3VybC4gTWFydGluIGlzIHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgZnRwIGNsaWVudCBuYW1lZCB5YWZjIGFuZCBoZSBkaWQKICBub3QgaGVzaXRhdGUgdG8gaGVscCB1cyBpbXBsZW1lbnQgdGhpcyB3aGVuIEkgYXNrZWQgaGltLiBNYW55IGFuZCBzaW5jZXJlCiAgdGhhbmtzIHRvIGEgc3BsZW5kaWQgZWZmb3J0LiBJdCBkaWRuJ3QgZXZlbiB0YWtlIG1hbnkgaG91cnMhCgotIFN0ZXBoZW4gS2ljayBzdXBwbGllZCBhIGJpZyBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIC0taW50ZXJmYWNlIGZsYWcgdG8KICB0aGUgY3VybCB0b29sIGFuZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgbGliY3VybC4gSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuCiAgb3V0Z29pbmcgaW50ZXJmYWNlIHRvIHVzZSBmb3IgeW91ciByZXF1ZXN0LiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwKICBwbGF0Zm9ybXMuIFRoaXMgbmVlZHMgdGVzdGluZy4KCi0gUmljaGFyZCBQcmVzY290dCBub3RpY2VkIHRoYXQgY3VybCBvbiBUcnU2NCB1bml4IGNvdWxkIGNvcmUgZHVtcGVkIGlmIHRoZQogIG5hbWUgZGlkbid0IHJlc29sdmUgcHJvcGVybHkuIFRoaXMgd2FzIGR1ZSB0byB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uIG5vdAogIHJldHVybmluZyBhbiBlcnJvciBldmVuIHRob3VnaCBpdCBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMhCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgYWxsIHNvcnRzIG9mIGRvY3VtZW50cyBpbiByZWdhcmRzIHRvIHRoZSBuZXcgcHJveHl0dW5uZWwgc3VwcG9ydC4KClZlcnNpb24gNy4zcHJlMgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBLYWktVXdlIFJvbW1lbCBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGh0dHBwcm94eXR1bm5lbCBzdHVmZiBmb3IgZnRwLgogIEFkanVzdGVkIGl0LiBBZGRlZCBiZXR0ZXIgaW5mbyBtZXNzYWdlIHdoZW4gc2V0dGluZyB1cCB0aGUgdHVubmVsIGFuZCB0aGUKICBwYXN2IG1lc3NhZ2Ugd2hlbiBkb2luZyB0aGUgc2Vjb25kIGNvbm5lY3QuCgpWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCgpEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAwKQotIC1wLy0tcHJveHl0dW5uZWwgd2FzIGFkZGVkIHRvICdjdXJsJy4gSXQgdXNlcyB0aGUgbmV3CiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgbGliY3VybCBvcHRpb24gdGhhdCBhbGxvd3MgImFueSIgcHJvdG9jb2wgdG8gdHVubmVsCiAgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGh0dHAgcHJveHkuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBmdHAuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAwKQotIEpvY2hlbiBTY2hhZXVibGUgZm91bmQgdGhhdCBmaWxlOi8vIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBDb3JyZWN0ZWQgdGhpcwogIGFuZCBtYWlsZWQgdGhlIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDApCi0gSSBjaGFuZ2VkIHRoZSAjZGVmaW5lIFQoKSBpbiBjdXJsLmggc2luY2UgaXQgdHVybmVkIG91dCBpdCB3YXNuJ3QgcmVhbGx5CiAgYSBnb29kIHN5bWJvbCB0byB1c2UgKHdoZW4geW91IGNvbXBpbGVkIFBIUCB3aXRoIGN1cmwgYXMgYSBtb2R1bGUsIHRoYXQKICBkZWZpbmUgY29sbGlkZWQgd2l0aCBzb21lIElNQVAgZGVmaW5lIG9yIHNvbWV0aGluZykuIFRoaXMgd2FzIHBvc3RlZCB0byB0aGUKICBQSFAgYnVnIHRyYWNrZXIuCgotIEkgYWRkZWQgZXh0ZXJuICJDIiBzdHVmZiBpbiB0d28gaGVhZGVyIGZpbGVzIHRvIGJldHRlciBhbGxvdyBsaWJjdXJsIHVzYWdlCiAgaW4gQysrIHNvcmNlcy4gRGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIERhbm55IEhvcnN3ZWxsIGxlYWQgdG8KICB0aGlzLgoKVmVyc2lvbiA3LjIuMQoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0ICphZ2FpbiogYW5kIG5vdyBpdCBzZWVtcyB0bwogIGRldGVjdCBMaW51eCBuYW1lIHJlc29sdmluZyBwcm9wZXJseSEgKGhlYXJkIHRoYXQgYmVmb3JlPykKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIHBvaW50ZWQgb3V0IHRoYXQgZG93bmxvYWRpbmcgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgbGV0dGVyICcrJyBmcm9tIGFuIGZ0cCBzZXJ2ZXIgZGlkbid0IHdvcmsuIEl0IGRpZCB3b3JrIGZyb20gSFRUUCB0aG91Z2ggYW5kCiAgdGhlIHJlYXNvbiB3YXMgbXkgbGFtZSBVUkwgZGVjb2Rlci4KCi0gSSBoYXBwZW5lZCB0byBub3RpY2UgdGhhdCAtSSBkaWRuJ3QgYXQgYWxsIHdvcmsgb24gZnRwIGFueW1vcmUuIEkgY29ycmVjdGVkCiAgdGhhdC4KClZlcnNpb24gNy4yCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDAwKQotIFVuZGVyc3RhbmRpbmcgQUlYIGlzIGEgaGFyZCB0YXNrLiBJIGJlbGlldmUgSSdsbCBuZXZlciBmaWd1cmUgb3V0IHdoeSB0aGV5CiAgc29sdmUgdGhpbmdzIHNvIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHVuaXhlcy4gTm93LCBJJ20gbGVmdCB3aXRoIHRoZQogIEFJWCA0LjMgcnVuLXRpbWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIHN5bWJvbHMgdGhhdCBhY2NvcmRpbmcgdG8gdGhpcwogIGFydGljbGUgKGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vYXJjaGl2ZXMvMy80MDUvMTk5OS85LzAvMjU5MzQyOC8pIGlzIGEKICBsaWJ0b29sIGZsYXcuIEkgdHJpZWQgdGhlIG1lbnRpb25lZCBwYXRjaCwgYWx0aG91Z2ggdGhhdCBzdG9wcyB0aGUgbGlua2luZwogIGNvbXBsZXRlbHkuCgogIFNvLCBpZiBJIHNlbGVjdCB0byBpZ25vcmUgdGhlIGxkIHdhcm5pbmdzIHRoZXJlIGFyZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CiAgZmlsbCB0aGUgc2NyZWVuIHByZXR0eSBiYWQgd2hlbiBjdXJsIGNvbXBpbGVzLiBJdCB0dXJucyBvdXQgdGhhdCBpZiBJIHdhbnQKICB0byAnI2luY2x1ZGUgPGFycGEvaW5ldC5oPicsIEkgY2FuIGdldCB0aWQgb2YgdGhlIHdhcm5pbmdzIGJ5IGluY2x1ZGUgdGhlCiAgZm9sbG93aW5nIHRocmVlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIHRoYXQgb25lOgoKICAgICAgICAjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiAgICAgICAgI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiAgICAgICAgI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KCiAgTm93LCBpcyBpdCByZWFsbHkgc2FuZSB0byBhZGQgdGhvc2UgaW5jbHVkZSBmaWxlcyBiZWZvcmUgYXJwYS9pbmV0LmggaW4gYWxsCiAgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgaXQ/CgogIFRoYW5rcyB0byBBbGJlcnQgQ2hpbi1BLVlvdW5nIGF0IHRoZXdyaXR0ZW53b3JkLmNvbSB3aG8gZ2F2ZSBtZSB0aGUgQUlYCiAgbG9naW4gdG8gdHJ5IGV2ZXJ5dGhpbmcgb24uCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAwKQotIEphbiBTY2htaWR0IHN1cHBsaWVkIHVzIGEgbmV3IFZDNiBtYWtlZmlsZSBmb3IgV2luZG93cyBhcyB0aGUgcHJldmlvdXMgb25lCiAgd2FzIG5vdCB1cCB0byBkYXRlIGJ1dCBsYWNrZWQgc2V2ZXJhbCBvYmplY3QgZmlsZXMuCgotIE1vcmUgd29yayBvbiB0aGUgbmFtaW5nLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHByb3ZpZGVkIGEgY29uZmlndXJlLWNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFzCiAgc29tZSBzeXN0ZW1zIHNlZW0gdG8gbmVlZCB0aGF0IGZvciB0aGVtIHRvIHdvcmsuIEhhZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uCiAgZm9yIHRoZSBjb25maWcuaCBpbmNsdWRlIGZpbGUgaW4gZXZlcnkgLmMgZmlsZSBpbiB0aGUgbGliY3VybCBkaXIuLi4KCi0gQXMgc3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgKGJ5IFRyb3kgRW5nZWwpLCBJIGRpZCB1c2UgYSAtLWRhdGEtYmluYXJ5CiAgb3B0aW9uIGluc3RlYWQgb2YgdGhlIG1lc3N5IHdheSBJJ3ZlIGxlZnQgZGVzY3JpYmVkIGJlbG93LiBJdCBzZWVtcyB0bwogIHdvcmsuIFRoZSBsaWJjdXJsIGZpeCByZW1haW5lZCB0aGUgc2FtZSBhcyB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAwKQotIEJhY2sgb24gdGhlIC1kIHN0cmlwcGluZyBuZXdsaW5lcyB0aGluZy4gVGhlICdwbGFpbiBwb3N0JyB0aGluZyB3YXMgYWRkZWQKICB3aGVuIEkgaGFkIG5vIHRob3VnaHQgb2YgdGhhdCBvbmUgY291bGQgYWN0dWFsbHkgcG9zdCBiaW5hcnkgZGF0YSB3aXRoCiAgaXQuIE5vdywgSSBoYXZlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBncmFjZWZ1bCBtYW5uZXIgYW5kIEkgdGhpbmsKICBJJ3ZlIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5OiAnLWQgQGZpbGU7YmluYXJ5JyB3aWxsIHRodXMgcG9zdCB0aGUKICBmaWxlIGJpbmFyeSwgZXhhY3RseSBhcyBpdHMgY29udGVudHMgYXJlLiBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbmV3CiAgKnNldG9wdCgpIG9wdGlvbiAoQ1VSTE9QVF9QT1NURklFTERTSVpFKSB0byBzZXQgdGhlIHBvc3RmaWVsZCBzaXplLCBzaW5jZQogIGxpYmN1cmwgY2FuJ3Qgc3RybGVuKCkgdGhlIGRhdGEgaW4gdGhlc2UgY2FzZXMuCgotIEFsYmVydCBDaGluLUEtWW91bmcgbWFkZSBzb21lIHZlcnkgc2VyaW91cyBlZmZvcnRzIGFuZCBhbGwgdGhlIG5hbWUKICByZXNvbHZpbmcgcHJvYmxlbXMgc2VlbSB0byBoYXZlIGJlZW4gc29ydGVkIG91dCBub3cgb24gYWxsIHRoZSBwbGF0Zm9ybXMKICB0aGF0IHByZXZpb3VzbHkgc2hvd2VkIHRoZW0uIEknbGwgbWFrZSBhbm90aGVyIHJlbGVhc2Ugbm93IGFueWRheSBiZWNhdXNlIG9mCiAgdGhpcy4KCi0gVGhlIEZBUSB3YXMgbXVjaCBlbmhhbmNlZCB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsaWNlbnNpbmcgaXNzdWVzIHRoYW5rcyB0bwogIEJqb3JuIFJlZXNlLgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBSaWNrIFdlbHlrb2NoeSBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIC1kIHRvIHBvc3QgYW5kIHlvdSB3YW50IHRvCiAga2VlcCB0aGUgbmV3bGluZXMsIGFzIGN1cmwgc3RyaXBzIHRoZW0gb2ZmIGFzIGEgYm9udXMgYmVmb3JlIHBvc3RpbmcuLi4KICBUaGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KClZlcnNpb24gNy4xLjEKCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gR290IG1vcmUgcGVvcGxlIGludm9sdmVkIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBtZXNzLiBDYW9sYW4gTWNOYW1hcmEgc2VudAogIG1lIGNvbmZpZ3VyZS1jb2RlIHRoYXQgdHVybmVkIG91dCB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gbXkgZXhpc3RpbmcgdGVzdHMKICB3aGljaCBvbmx5IG1ha2UgbWUgbW9yZSBzdXJlIEknbSBvbiB0aGUgcmlnaHQgcGF0aC4gSSBjaGFuZ2VkIHRoZSBvcmRlciBvZgogIHRoZSB0ZXN0cyBzbGlnaHRseSwgYXMgaXQgc2VlbXMgdGhhdCBzb21lIGNvbXBpbGVycyBkb24ndCB5ZWxsIGVycm9yIGlmIGEKICBmdW5jdGlvbiBpcyB1c2VkIHdpdGggdG9vIG1hbnkgcGFyYW1ldGVycy4gVGh1cywgdGhlIGZpcnN0IHRlc3RlZCBmdW5jdGlvbgogIHdpbGwgc2VlbSBvay4uLiBMZXQncyBob3BlIG1vcmUgY29tcGlsZXJzIHRoaW5rIG9mIHRvby1mZXcgcGFyYW1ldGVycyBhcyBiYWQKICBtYW5uZXJzLCBhcyB3ZSdyZSBub3cgdHJ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBvcmRlcjsgZmV3ZXIgZmlyc3QuIEkKICBzaG91bGQgYWxzbyBhZGQgdGhhdCBMYXJzIEhlY2tpbmcgbWFpbGVkIG1lIGFuZCB2b2x1bnRlZXJlZCB0byBydW4gdGVzdHMgb24KICBhIGZldyBvZGQgc3lzdGVtcy4gQ29hbGFuIGlzIGtlZXBpbmcgaGlzIHdvcmsgb3ZlciBhdAogIGh0dHA6Ly93d3cuY3NuLnVsLmllL35jYW9sYW4vcHVibGluay9nZXRob3N0YnluYW1lX3IvLiBNaWdodCBiZSBoYW5keSBpbiB0aGUKICBmdXR1cmUgYXMgd2VsbC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDApCi0gSSBub3RpY2VkIEkgaGFkbid0IGluY3JlYXNlZCB0aGUgbmFtZSBsb29rdXAgYnVmZmVyIGluIGxpYi9mdHAuYy4gSSBkb24ndAogIHRoaW5rIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbnRpbnVlZCB0cm91YmxlIHRob3VnaC4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDApCi0gRnJlZCBOb3ogY29ycmVjdGVkIG15IHN0dXBpZCBtaXN0YWtlcyBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgZmx1ZmYuIEl0CiAgc2hvdWxkIGFmZmVjdCBzb21lIEFJWCwgRGlnaXRhbCBVbml4IGFuZCBIUFVYIDEwIHN5c3RlbXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAwKQotIE1hdGhpZXUgTGVnYXJlIGNvbXBpbGVkIGFuZCBidWlsZCA3LjEgd2l0aG91dCBlcnJvcnMgb24gYm90aCBBSVggNC4yIGFzIHdlbGwKICBhcyBBSVggNC4zLiBOb3cgd2h5IGRpZCBwcm9ibGVtcyBvY2N1ciBiZWZvcmU/CgotIEZyZWQgTm96IHJlcG9ydGVkIGEgLXcvLS13cml0ZS1vdXQgYnVnIHRoYXQgY2F1c2VkIGl0IHRvIG1hbGZ1bmN0aW9uIHdoZW4KICB1c2VkIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgVVJMIHJldHJpZXZhbGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBkaXNwbGF5IGdvdAogIHNjcmV3ZWQgdXAhCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDAwKQotIEphc29uIFByaWViZSBhbmQgYW4gYW5vbnltb3VzIGZyaWVuZCBmb3VuZCBzb21lIGhvc3QgbmFtZXMgdGhlIExpbnV4IHZlcnNpb24KICBvZiBjdXJsIGNvdWxkIG5vdCByZXNvbHZlLiBJdCB0dXJuZWQgb3V0IHRoZSBidWZmZXIgdXNlZCB0byByZXRyaWV2ZSB0aGF0CiAgaW5mb3JtYXRpb24gd2FzIHRvbyBzbWFsbC4gRml4ZWQuIE9uZSBjb3VsZCBhcmd1ZSBhYm91dCB0aGUgdXNlZnVsbmVzcyBvZgogIG5vdCBoYXZpbmcgdGhlIHNsaWdodGVzdCB0cmFjZSBvZiBhIG1hbiBwYWdlIGZvciBnZXRob3N0YnluYW1lX3IoKSBvbiBteQogIExpbnV4IFJlZGhhdCBpbnN0YWxsYXRpb24uLi4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDApCi0gQmFsYWppIFMgUmFvIHdhcyBmaXJzdCBpbiBsaW5lIHRvIG5vdGUgdGhlIG1pc3NpbmcgcG9zc2liaWxpdHkgdG8gcmVwbGFjZQogIHRoZSBDb250ZW50LVR5cGU6IGFuZCBDb250ZW50LUxlbmd0aDogaGVhZGVycyB3aGVuIGRvaW5nIC1kIHBvc3RzLiBJIGFkZGVkCiAgdGhlIHBvc3NpYmlsaXR5IGp1c3Qgbm93LiBJdCBzZWVtcyBzb21lIHBlb3BsZSB3YW50cyB0byBkbyBzdGFuZGFyZCBwb3N0cwogIHVzaW5nIGN1c3RvbSBDb250ZW50LVR5cGVzLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDAwKQotIE1pa2UgRG93ZWxsIGNvcnJlY3RseSBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWQgbm90IGFwcHJvdmUgb2YgVVJMcyB3aXRoIG5vCiAgdXNlciBuYW1lIGJ1dCBwYXNzd29yZC4gQXMgaW4gJ2h0dHA6Ly86Zm9vQGhheHguc2UnLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjEKCkRhbmllbCAoNyBBdWd1c3QgMjAwMCkKLSBNeSBBSVggNCBmaXggZG9lcyBub3Qgd29yay4gSSBuZWVkIGhlbHAgZnJvbSBhIEFJWCA0IGhhY2tlci4KCi0gSSBhZGRlZCBteSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBJdCBpcyBhaW1lZCB0byBiZWNvbWUgYSBzb3J0CiAgb2YgdHV0b3JpYWwgb24gaG93IHRvIGRvIEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoNCBBdWd1c3QgMjAwMCkKLSBXb3JraW5nIHdpdGggUmljaCBHcmF5IG9uIGNvbXBpbGluZyBjdXJsIGZvciBsb3RzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiAgTXkgZml4IGZvciBBSVggMy4yIHdhcyBub3QgZ29vZCBlbm91Z2ggYW5kIHdhcyBzbGlnaHRseSBjaGFuZ2VkLCBJIGhhZCB0bwogIG1vdmUgYW4gaW5jbHVkZSBmaWxlIGJlZm9yZSBhbm90aGVyLCBhcyBpcyBub3cgZGVzY3JpYmVkIGluIHRoZSBzb3VyY2UuCgogIEFJWCA0LjIgKDQuWD8pIGhhcyBkaWZmZXJlbnQgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpCiAgZnVuY3Rpb25zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhbmQgdGh1cyB0aGUgY29tcGlsZQogIGJyb2tlIHdpdGggYW4gZXJyb3IuIEkgaGF2ZSBub3cgY2hhbmdlZCB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY2hlY2sgaW4gdGhlCiAgY29uZmlndXJlIGZpbGUgdG8gc3VwcG9ydCBhbGwgdGhyZWUgdmVyc2lvbnMgb2YgYm90aCB0aGVzZSBmdW5jdGlvbnMuIE15CiAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBBSVgtc3R5bGUgaXMgdGhvdWdoIG5vdCB5ZXQgdmVyaWZpZWQgYW5kIEkgbWF5CiAgZ2V0IHByb2JsZW1zIHRvIGZpeCBpdCBpZiBpdCB0dXJucyBvdXQgdG8gYnVnIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KICBhbnkgc3lzdGVtIHVzaW5nIHRoYXQuCgogIEZvciBwcm9ibGVtcyBsaWtlIHRoYXQsIEkgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbGxvdyAtLWRpc2FibGUtdGhyZWFkCiAgdG8gY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBjaGVjayBmb3IgdGhyZWFkc2FmZSB2ZXJzaW9ucyBvZiBhIGZldwogIGZ1bmN0aW9ucyBhbmQgdGh1cyBnbyB3aXRoIHRoZSAiZ29vZCBvbGQgdmVyc2lvbnMiIHRoYXQgdGVuZCB0byB3b3JrCiAgYWx0aG91Z2ggd2lsbCBicmVhayB0aHJlYWQtc2FmZW5lc3MgZm9yIGxpYmN1cmwuIE1vc3QgcGVvcGxlIHdvbid0IHVzZQogIGxpYmN1cmwgZm9yIG90aGVyIHRoaW5ncyB0aGFuIGN1cmwgdGhvdWdoLCBhbmQgY3VybCBkb2Vzbid0IG5lZWQgYQogIHRocmVhZC1zYWZlIGxpYi4KCi0gV29ya2luZyBvbiBteSBiaWcgdHV0b3JpYWwgYWJvdXQgSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIFJpY2ggR3JheSBzcG90dGVkIGEgcHJvYmxlbSBpbiBzcmMvc2V0dXAuaCBjYXVzZWQgYnkgYSAjZGVmaW5lIHN0cmVxdWFsKCkKICB0aGF0IHdhcyBqdXN0IGEgbGVmdC1vdmVyIGZyb20gcGFzc2VkIHRpbWVzLiBUaGUgc3RyZXF1YWwoKSBpcyBub3cgYSB0cnVlCiAgZnVuY3Rpb24gc3VwcGxpZWQgYnkgbGliY3VybCBmb3IgYSBwb3J0YWJsZSBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmlzb24uIEkgYWRkZWQgdGhlIHByb3RvdHlwZXMgaW4gaW5jbHVkZS9jdXJsLmggYW5kIHJlbW92ZWQgdGhlCiAgbm93IG9ic29sZXRlICNkZWZpbmUuCgotIElnb3IgS2hyaXN0b3Bob3JvdiBtYWRlIGEgZml4IHRvIGFsbG93IHJlc3VtZWQgZG93bmxvYWQgZnJvbSBTdW4ncwogIEphdmFXZWJTZXJ2ZXIvMS4xLjEuIEl0IHNlZW1zIHRoYXQgdGhlaXIgc2VydmVyIHNlbmRzIGJhZCBDb250ZW50LVJhbmdlCiAgaGVhZGVycy4KCi0gVGhlIG1ha2VmaWxlcyBmb3JjZWQgYSBzdGF0aWMgbGlicmFyeSBidWlsZCwgd2hpY2ggaXMgYmFkIHNpbmNlIHdlIG5vdyB1c2UKICBsaWJ0b29sIGFuZCB0aHVzIGhhdmUgZXhjZWxsZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQhIEFsYmVydCBDaGluLUEtWW91bmcKICBmb3VuZCBvdXQuCgpWZXJzaW9uIDcuMC4xMWJldGEKCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgaW5zdGFsbCcgZGlkIG5vdCBwcm9wZXJseSBjcmVhdGUKICB0aGUgaGVhZGVyIGluY2x1ZGUgZGlyZWN0b3J5LCB3aHkgaXQgZmFpbGVkIHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBhcwogIGl0IHNob3VsZC4gQXV0b21ha2UgaXNuJ3QgcmVhbGx5IGVxdWlwcGVkIHRvIGRlYWwgd2l0aCBzdWJkaXJlY3RvcmllcwogIHdpdGhvdXQgTWFrZWZpbGVzIGluIGFueSBuaWNlIHdheS4gSSBoYWQgdG8gcnVuIGFoZWFkIGFuZCBhZGQgTWFrZWZpbGVzIGluCiAgYm90aCBpbmNsdWRlIGFuZCBpbmNsdWRlL2N1cmwgYmVmb3JlIEkgbWFuYWdlZCB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKICBtYWtlZmlsZSB0aGF0IHN1Y2NlZWRzIGluIGluc3RhbGwgZXZlcnl0aGluZyBwcm9wZXJseSEKCi0gT2ssIG5vIG1vcmUgImZlYXR1cmVzIiBhZGRlZCBub3cuIExldCdzIGp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUncyBubyBtYWpvcgogIGZsYXdzIGFkZGVkIG5vdy4KCkRhbmllbCAoMzEgSnVseSAyMDAwKQotIEJvdGggSmVmZiBTY2hhc255IGFuZCBLZXRpbCBGcm95biBhc2tlZCBtZSBob3cgdG8gdGVsbCBjdXJsIG5vdCB0byBzZW5kIG9uZQogIG9mIHRob3NlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMuIFRoZXkgZGlkbid0IHNldHRsZSB3aXRoIHRoZSBibGFuawogIG9uZXMgeW91IGNvdWxkIHRlbGwgY3VybCB0byB1c2UuIEkgcmV3cm90ZSB0aGUgaGVhZGVyLXJlcGxhY2Ugc3R1ZmYgYQogIGxpdHRsZS4gTm93LCBpZiB5b3UgcmVwbGFjZSBhbiBpbnRlcm5hbCBoZWFkZXIgd2l0aCB5b3VyIG93biBhbmQgdGhhdCBuZXcKICBvbmUgaXMgYSBibGFuayBoZWFkZXIgeW91IHdpbGwgb25seSByZW1vdmUgdGhlIGludGVybmFsIG9uZSBhbmQgbm90IGdldCBhbnkKICBibGFuay4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGFueSBjYXNlIHdoZW4geW91IHdhbnQgdGhhdCBibGFuayBoZWFkZXIuCgpEYW5pZWwgKDI5IEp1bHkgMjAwMCkKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgbGliIHVzZWQgbG9jYWx0aW1lKCkgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLCBzbyBub3cKICBJIHVzZSBsb2NhbHRpbWVfcigpIGluIHRoZSBzeXN0ZW1zIHRoYXQgaGFzIGl0LgoKLSBJIHdlbnQgdGhyb3VnaCB0aGlzIGVudGlyZSBkb2N1bWVudCBhbmQgcmVtb3ZlZCBhbGwgZW1haWwgYWRkcmVzc2VzIGFuZCBsZWZ0CiAgbmFtZXMgb25seS4gSSd2ZSByZWFsbHkgbWFkZSBhbiBlZmZvcnQgdG8gYWx3YXlzIG5vdGUgd2hvIGJyb3VnaHQgYmUgYnVnCiAgcmVwb3J0cyBvciBmaXhlcywgYnV0IG1vcmUgYW5kIG1vcmUgcGVvcGxlIGFzayBtZSB0byByZW1vdmUgdGhlIGVtYWlsCiAgYWRkcmVzc2VzIHNpbmNlIHRoZXkgYmVjb21lIHZpY3RpbXMgZm9yIHNwYW1zIHRoaXMgd2F5LiBHb3Jkb24gQmVhdG9uIGdvdCBtZQogIHdvcmtpbmcgb24gdGhpcy4KCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIEr2cm4gSGFydHJvdGggZm91bmQgb3V0IHRoYXQgd2hlbiB5b3Ugc3BlY2lmaWVkIGEgSFRUUCBwcm94eSBpbiBhbgogIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB1c2VkIC1MLCBjdXJsIGZhaWxlZCBpbiB0aGUgc2Vjb25kIGZldGNoLiBJCiAgY29ycmVjdGVkIHRoaXMgcHJvYmxlbSBhbmQgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIGxpc3QuIE5vIG5lZWQgZm9yIGFuIGV4dHJhCiAgYmV0YSByZWxlYXNlIGp1c3QgZm9yIHRoaXMuCgpWZXJzaW9uIDcuMC4xMGJldGEKCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIFNvLCBsaWJ0b29sIHJlcGxhY2VkIHR3byBvZiBteSBmaWxlcyB3aXRoIHN5bWJvbGljIGxpbmtzIGFuZCBJIGZvcmdvdCB0byBhZGQKICB0aGUgdHdvIG5ldyBsaWJ0b29sIGZpbGVzIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUgKGFuZCB0aGV5IHdlcmUgYWRkZWQgYXMKICBzeW1saW5rcyBhcyB3ZWxsISkgVGhpcyBvZiBjb3Vyc2UgbGVhZCB0byB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZAogIG9uIDcuMC45Li4uCgpWZXJzaW9uIDcuMC45YmV0YQoKRGFuaWVsICgyNSBKdWx5IDIwMDApCi0gS3Jpc3RpYW4gS/ZobnRvcHAgPGtyaXMgYXQga29laG50b3BwLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybAogIGxpYnRvb2xpZmllZCwganVzdCBhcyB3ZSd2ZSB3YW50ZWQgZm9yIGEgd2hpbGUgbm93LiBIZSBhbHNvIG1hZGUgdGhlCiAgcmVjZW50bHkgYWRkZWQgbWFuIHBhZ2VzIGdldCBpbnN0YWxsZWQgcHJvcGVybHkgb24gJ21ha2UgaW5zdGFsbCcgYW5kIHNvbWUKICBvdGhlciBuaWNlIGNsZWFudXBzLgoKLSBJbiBhIGRpc2N1c3Npb24gd2l0aCBFZXR1IE9qYW5lbiBpdCBzdHJ1Y2sgbWUgdGhhdCBpZiB3ZSB1c2UgY3VybCB0byBnZXQgYQogIHBhZ2UgdXNpbmcgYSBwYXNzd29yZCwgYW5kIHRoYXQgcGFnZSB0aGVuIHNlbmRzIGEgTG9jYXRpb246IHRvIGFub3RoZXIKICBzZXJ2ZXIgdGhhdCBjdXJsIGZvbGxvd3MsIGN1cmwgd2lsbCBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoYXQKICBzZXJ2ZXIgYXMgd2VsbC4KCiAgTm93LCBJJ2xsIG5ldmVyIGJlIGFibGUgdG8gbWFrZSBjdXJsIGRvIExvY2F0aW9uOiBmb2xsb3dpbmcgYWxsIHRoYXQgcGVyZmVjdAogIGFuZCB5b3UncmUgYWxsIHNvb25lciBvciBsYXRlciByZXF1aXJlZCB0byB3cml0ZSBhIHNjcmlwdCB0byBkbyBzZXZlcmFsCiAgZmV0Y2hlcyB3aGVuIHlvdSdyZSBkb2luZyBhZHZhbmNlZCBzdHVmZiwgYnV0IG5vdyBJJ3ZlIG1vZGlmaWVkIGN1cmwgdG8gYXQKICBsZWFzdCAqb25seSogc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLiBXaGljaAogIG1lYW5zIHRoYXQgaWYgZ2V0IGEgcGFnZSBmcm9tIHNlcnZlciBBIHdpdGggYSBwYXNzd29yZCwgdGhhdCBmb3J3YXJkcyBjdXJsCiAgdG8gc2VydmVyIEIsIGN1cmwgd29uJ3QgdXNlIHRoZSBwYXNzd29yZCB0aGVyZS4gSWYgc2VydmVyIEIgdGhlbiBmb3J3YXJkcwogIGN1cmwgYmFjayB0byBzZXJ2ZXIgQSBhZ2FpbiwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgdXNlZCBhZ2Fpbi4KCiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGltcGxlbWVudGF0aW9uLCBhcyBpbiBhIGJyb3dzZXIgY2FzZSBpdCB3b3VsZCBvbmx5IHVzZQogIHRoZSBwYXNzd29yZCBpZiB0aGUgbGVmdC1wcmVmaXggb2YgdGhlIGZpcnN0IHBhdGggaXMgdGhlIHNhbWUuIEkganVzdCB0aGluawogIHRoYXQgdGhpcyBmaXggcHJldmVudHMgYSBzb21ld2hhdCBsdXJreSAic2VjdXJpdHkgaG9sZSIuCgogIEFzIGEgc2lkZS1ub3RlIGluIHRoaXMgc3ViamVjdDogSFRUUCBwYXNzd29yZHMgYXJlIHNlbnQgaW4gY2xlYXJ0ZXh0IGFuZAogIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzYWZlIG9yIHNlY3VyZS4gVXNlIEhUVFBTIGZvciB0aGF0LgoKLSBBcyBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBjb252ZXJ0ZWQgdGhlIEZUUCByZXNwb25zZSByZWFkaW5nCiAgZnVuY3Rpb24gaW50byB1c2luZyBzZWxlY3QoKSB3aGljaCB0aGVuIGFsbG93cyB0aW1lb3V0cyAoZXZlbiB1bmRlciB3aW4zMiEpCiAgaWYgdGhlIGNvbW1hbmQtcmVwbHkgc2Vzc2lvbiBnZXRzIHRvbyBzbG93IG9yIGRpZXMgY29tcGxldGVseS4gSSBtYWRlIGEKICBkZWZhdWx0IHRpbWVvdXQgb24gMzYwMCBzZWNvbmRzIHVubGVzcyBhbnl0aGluZyBlbHNlIGlzIHNwZWNpZmllZCwgc2luY2UgSQogIGRvbid0IHRoaW5rIGFueW9uZSB3YW50cyB0byB3YWl0IG1vcmUgdGhhbiB0aGF0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8KICBnZXQgcmVjZWl2ZWQuLi4KCi0gVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBhdCBnbXgubmV0PiBicm91Z2h0IGEgc2V0IG9mIGZpeGVzIGZvcgogIHRoZSByZmMxODY3IGZvcm0gcG9zdHMuIEhlIGludHJvZHVjZWQgJ25hbWU9PGZpbGUnIHdoaWNoIGJyaW5ncyBhIG1lYW5zIHRvCiAgc3V1cGx5IHZlcnkgbGFyZ2UgdGV4dCBjaHVua3MgcmVhZCBmcm9tIHRoZSBnaXZlbiBmaWxlIG5hbWUuIEl0IGRpZmZlcnMgZnJvbQogICduYW1lPUBmaWxlJyBpbiB0aGUgd2F5IHRoYXQgdGhpcyBsYXR0ZXIgdGhpbmcgaXMgbWFya2VkIGluIHRoZSB1cGxvYWRlZAogIGNvbnRlbnRzIGFzIGEgZmlsZSB1cGxvYWQsIHdoaWxlIHRoZSBmaXJzdCBpcyBqdXN0IHRleHQgKGFzIGluIGEgaW5wdXQgb3IKICB0ZXh0YXJlYSBmaWVsZCkuIFRvcnN0ZW4gYWxzbyBjb3JyZWN0ZWQgYSBidWcgdGhhdCB3b3VsZCBoYXBwZW4gaWYgeW91IHVzZWQKICAlcyBvciBzaW1pbGFyIGluIGEgLUYgZmlsZSBuYW1lLgoKLSBBcyBkaXNjb3ZlcmVkIGJ5IE5pY28gQmFnZ3VzIDxOaWNvLkJhZ2d1cyBhdCBtYWlsLmluZy5ubD4sIHdoZW4gdHJhbnNmZXJyaW5nCiAgZmlsZXMgdG8vZnJvbSBGVFAgdXNpbmcgdHlwZSBBU0NJSSBjdXJsIHNob3VsZCBub3QgZXhwZWN0IHRoZSB0cmFuc2ZlciB0byBiZQogIHRoZSBleGFjdCBzaXplIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYXMgdGhlIGZpbGUgc2l6ZS4gU2luY2UgQVNDSUkgbWF5IHZlcnkKICB3ZWxsIG1lYW4gdGhhdCB0aGUgY29udGVudCBpcyB0cmFuc2xhdGVkIHdoaWxlIHRyYW5zZmVyZWQsIHRoZSBmaW5hbCBzaXplCiAgbWF5IHZlcnkgd2VsbCBkaWZmZXIuIFRoZXJlZm9yLCBjdXJsIG5vdyBpZ25vcmVzIHRoZSBmaWxlIHNpemUgd2hlbiBkb2luZwogIEFTQ0lJIHRyYW5zZmVycyBpbiBGVFAuCgpEYW5pZWwgKDI0IEp1bHkgMjAwMCkKLSBBZGRlZCBDVVJMT1BUX1BST1hZUE9SVCB0byB0aGUgY3VybF9lYXN5X3NldG9wdCgpIGNhbGwgdG8gYWxsb3cgdGhlIHByb3h5CiAgcG9ydCBudW1iZXIgdG8gYmUgc2V0IHNlcGFyYXRlbHkgZnJvbSB0aGUgcHJveHkgaG9zdCBuYW1lLgoKLSBBbmRyZXcgPGFuZHJldyBhdCB1Z2gubmV0LmF1PiBwb2ludGVkIG91dCBhIG5ldHJjIG1hbnVhbCBidWcuCgotIFRoZSBGVFAgdHJhbnNmZXIgY29kZSBub3cgYWNjZXB0cyBhIDI1MC1jb2RlIGFzIHdlbGwgYXMgdGhlIHByZXZpb3VzbHkKICBhY2NlcHRlZCAyMjYsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxlIHRyYW5zZmVyLiBNb2hhbiA8bW5haXIgYXQKICBldmVyZ3JlZW4tZnVuZHMuY29tPiBwb2ludGVkIHRoaXMgb3V0LgoKLSBUaGUgY2hlY2sgZm9yICpib3RoKiBuc2wgYW5kIHNvY2tldCB3YXMgbmV2ZXIgYWRkZWQgaW4gdGhlIHY3IGNvbmZpZ3VyZS5pbgogIHdoZW4gSSBtb3ZlZCB0aGUgbWFpbiBicmFuY2guIEkgcmUtYWRkZWQgdGhhdCBjaGVjayB0byBjb25maWd1cmUuaW4uIFRoaXMgd2FzCiAgZGlzY292ZXJlZCBieSBSaWNoIEdyYXkuCgotIEhvd2FyZCwgQmxhaXNlIDxCbGFpc2UuSG93YXJkIGF0IGZhY3RpdmEuY29tPiBwb2ludGVkIG91dCBhIG1pc3NpbmcgZnJlZSgpIGluCiAgY3VybF9kaXNjb25uZWN0KCkgd2hpY2ggb2YgY291cnNlIG1lYW50IGxpYmN1cmwgYXRlIG1lbW9yeS4KCi0gQnJpYW4gRS4gR2FsbGV3IG5vdGVkIHRoYXQgdGhlIEhUVFAgJ0hvc3Q6JyBoZWFkZXIgY3VybCBzZW50IGRpZCBub3QKICBwcm9wZXJseSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBub24tZGVmYXVsdCBwb3J0cyB3ZXJlIHVzZWQuIFRoaXMgc2hvdWxkCiAgbm93IGhhdmUgYmVlbiBmaXhlZC4KCi0gSFRUUCBjb25uZWN0IGVycm9ycyBub3cgcmV0dXJuIGVycm9ycyBlYXJsaWVyLiBUaGlzIHdhcyBtb3N0IG5vdGFibHkgY2F1c2luZwogIHByb2JsZW1zIHdoZW4gdGhlIEhUVFBTIGNlcnRpZmljYXRlIGhhZCBwcm9ibGVtcyBhbmQgbGF0ZXIgY2F1c2VkIGEgY3Jhc2guCiAgTWFueSB0aGFua3MgdG8gR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGF0IGxldmVsOC5jb20+IGZvciBkaXNjb3ZlcmluZwogIGFuZCBzdWdnZXN0aW5nIGEgZml4Li4uCgpEYW5pZWwgKDIxIEp1bmUgMjAwMCkKLSBBZnRlciBhICJidWcgcmVwb3J0IiBJIHJlY2VpdmVkIHdoZXJlIHRoZSB1c2VyIHdhcyB1c2luZyBib3RoIC1GIGFuZCAtSSBpbiBhCiAgSFRUUCByZXF1ZXN0IChpdCBzZXZlcmx5IGNvbmZ1c2VkIHRoZSBsaWJyYXJ5IEkgc2hvdWxkIGFkZCksIEkgYWRkZWQgc29tZQogIGNoZWNrcyB0byBzcmMvbWFpbi5jIHRoYXQgcHJldmVudHMgc2V0dGluZyBtb3JlIHRoYW4gb25lIEhUVFAgcmVxdWVzdAogIGNvbW1hbmQsIG5vIG1hdHRlciB3aGF0IHRoZSB1c2VyIHdhbnRzISA7LSkKClZlcnNpb24gNy4wLjhiZXRhCgpEYW5pZWwgKDIwIEp1bmUgMjAwMCkKLSBJIGRpZCBhIG1ham9yIHJlcGxhY2UgaW4gbWFueSBmaWxlcyB0byB1c2UgdGhlIG5ldyBjdXJsIGRvbWFpbiBoYXh4LnNlCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLgoKLSBBcyBFZXR1IE9qYW5lbiBzdWdnZXN0ZWQsIEkgZmluYWxseSB0b29rIHRoZSBzdGVwIGFuZCBub3cgbGliY3VybCBubyBsb25nZXIKICBtYWtlcyBhIFBPU1QgYWZ0ZXIgaXQgaGFzIGZvbGxvd2VkIGEgbG9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgUE9TVCBoYXMKICBiZWVuIGRvbmUsIGl0J2xsIHR1cm5lZCBpbnRvIGEgR0VUIGZvciB0aGUgZnVydGhlciByZXF1ZXN0cy4gVGhpcyBpcyBvbmx5CiAgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyAtTC8tLWxvY2F0aW9uICphbmQqIGRvaW5nIGEgUE9TVCBhdCB0aGUgc2FtZSB0aW1lLgoKICBXaGlsZSBtZXNzaW5nIHdpdGggdGhpcywgSSBhZGRlZCBhbm90aGVyIHdlaXJkIGZlYXR1cmUgSSBjYWxsICdhdXRvCiAgcmVmZXJlcicuIElmIHlvdSBhcHBlbmQgJzthdXRvJyB0byB0aGUgcmlnaHQgb2YgYSBnaXZlbiByZWZlcmVyIHN0cmluZyAob3IKICBvbmx5IHVzZSB0aGF0IHN0cmluZyBhcyByZWZlcmVyKSwgbGliY3VybCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZQogIHByZXZpb3VkIFVSTCBhcyByZWZlcmVkIHdoZW4gaXQgZm9sbG93cyBhIExvY2F0aW9uOiBhbmQgZ2V0cyBhIHN1Y2NlZWRpbmcKICBkb2N1bWVudC4KCi0gTXkgaGVybyBSaWNoIEdyYXkgZm91bmQgdGhlIHZlcnkgb2JzY3VyZSBGVFAgYnVnIHRoYXQgaGFwcGVuZWQgdG8gaGltIG9ubHkKICB3aGVuIHBhc3NpbmcgdGhyb3VnaCBhIHBhcnRpY3VsYXIgZmlyZXdhbGwgYW5kIHVzaW5nIHRoZSBQT1JUIGNvbW1hbmQuIEl0CiAgdHVybmVkIG91dCB0aGF0IFBPUlQgd2FzIHRoZSBvbmx5IGNvbW1hbmQgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgdGhhdAogIGRpZG4ndCBzZW5kIGEgcHJvcGVyIFxyXG4gc2VxdWVuY2UgYnV0IGluc3RlYWQgdXNlZCB0aGUgZmF1bHR5IFxuIHdoaWNoIGFzCiAgaXQgc2VlbWVkIGlzIHN1cHBvcnRlZCBieSBtb3N0IG1ham9yIGZ0cCBzZXJ2ZXJzLi4uIDotTwoKVmVyc2lvbiA3LjAuN2JldGEKCkRhbmllbCAoMTYgSnVuZSAyMDAwKQotIEkgaGFkIGF2b2lkZWQgdGhpcyBsb25nIGVub3VnaCBub3csIHNvIEkgbW92ZWQgdGhlIGFsdGVybmF0aXZlIHByb2dyZXNzIGJhcgogIHN0dWZmIGZyb20gdGhlIGxpYiBhbmQgYWRkZWQgaXQgdG8gdGhlIGNsaWVudCBjb2RlLiBUaGlzIGlzIG5vdyB1c2luZyB0aGUKICByZWNlbnRseSBhZGRlZCBwcm9ncmVzcyBjYWxsYmFjayBhbmQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgbXVjaCBsaWtlCiAgYmVmb3JlLiBTaW5jZSBpdCBpcyBvbmx5IG9uZSBwcm9ncmVzcyBiYXIgYW5kIHlvdSBhbmQgZG93bmxvYWQgYW5kIHVwbG9hZCBhdAogIHRoZSBzYW1lIHRpbWUsIHRoaXMgYmFyIHNob3dzIHRoZSBjb21iaW5lZCBwcm9ncmVzcyBvZiBib3RoIGRpcmVjdGlvbnMuIFRoaXMKICBjb2RlIHdhcyBqdXN0IHBvcnRlZCBmcm9tIHRoZSBvbGQgcGxhY2UgdG8gdGhpcywgTGFycyBpcyBzdGlsbCBvdXIgc2F2aW91ciEKICA7LSkgVGhpcyBhbHNvIG1hZGUgdGhlIGRvY3VtZW50YXRpb24gbW9yZSBhY2N1cmF0ZSBzaW5jZSBJIG5ldmVyIHJlbW92ZWQKICB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGRvY3MhIEFsdGhvdWdoIEkgbm93IHJlbW92ZWQgdGhlIENVUkxPUFRfUFJPR1JFU1NNT0RFCiAgZnJvbSB0aGUgbGlicmFyeSBzaW5jZSB0aGUgbGliIGhhcyBvbmx5IG9uZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBhbmQgaXQKICB3aWxsIG5ldmVyIGdldCBhbm90aGVyLiBJdCBpcyBhbHRob3VnaCBsaWtlbHkgdGhhdCB0aGUgaW50ZXJuYWwgb25lIGFsc28KICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjbGllbnQgY29kZSBpbiB0aGUgZnV0dXJlICh3aGVuIEkgaGF2ZSBvdGhlciBtZWFucyBvZgogIGdldHRpbmcgdGhlIHdyaXRlb3V0IGRhdGEgYW5kIG1vdmUgdGhhdCB0b28gdG8gdGhlIGNsaWVudCkuCgotIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gdmVyaWZ5IHRoYXQgc3RhbmRhcmQgcHJvZ3Jlc3MgbWV0ZXIgd29ya3MgYW5kIEkKICBmb3VuZCBvdXQgaXQgZGlkbid0IGdldCBpbml0ZWQgcHJvcGVybHkuIEdycnIuIEkgY29ycmVjdGVkIHRoYXQgYXMgd2VsbC4KCkRhbmllbCAoMTUgSnVuZSAyMDAwKQotIEkgdGhvdWdodCBJJ2QgYmV0dGVyIHZlcmlmeSB0aGF0IHRoZSAtRiBvcHRpb24gc3RpbGwgd29ya3MgaW4gdjcgYW5kIG9mCiAgY291cnNlIGl0IGRpZG4ndC4uLiA6LS8gQW55d2F5LCBJIGhhZCB0aGUgcHJvYmxlbXMgSSBjb3VsZCBkaXNjb3ZlcgogIGNvcnJlY3RlZC4gQWJvdXQgb25lIG1vbnRoIG9mIGJldGEgdGVzdGluZyBhbmQgbm90IGEgc2luZ2xlIHBlcnNvbiBoYXMgdXNlZAogIHRoaXMgZmVhdHVyZSB3aXRoIHY3PwoKLSBCavZybiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLS1wcm9ncmVzcy1iYXIgc3RpbGwgZG9lc24ndCB3b3JrIGluCiAgdjcuIEhtLgoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gVGltIFRhc3NvbmlzIGRpc2NvdmVyZWQgdGhhdCBjdXJsIDcgZGlkbid0IGhhbmRsZSBub3JtYWwgaHR0cCBQT1NUIGFzIGl0CiAgc2hvdWxkLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjAuNmJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHBvaW50ZWQgb3V0IHNldmVyYWwgcHJvYmxlbXMgKHJlbGF0ZWQgdG8gd2luMzIgY29tcGlsaW5nKToKICBsaWIvc3RyZXF1YWwuYyBoYWQgYSBiYWQgI2lmZGVmIGZvciBvbmUgb2YgdGhlIHN0cmluZyBjb21wYXJpc29ucyAod2luMzIpCiAgc3JjL21haW4uYyBoYWQgc2V2ZXJhbCBtaW5vciBwcm9ibGVtcwogIGxpYi9tYWtlZmlsZS5tMzIgaGFkIGdldHBhc3MuW2NvXSB0d2ljZQogIHNyYy9jb25maWctd2luMzIuaCBsYWNrZWQgdGhlIEhBVkVfRkNOVExfSCBkZWZpbmUKICBib3RoIGNvbmZpZy13aW4zMi5oIGZpbGVzIG5vdyBvbmx5IHNldCB0aGUgSEFWRV9VTklTVERfSCBkZWZpbmUgaWYgdGhlCiAgZGVmaW5lIE1JTkdXMzIgaXMgc2V0LCBhbmQgSSBtb2RpZmllZCBzcmMvbWFrZWZpbGUubTMyIGFuZCBsaWIvbWFrZWZpbGUubTMyCiAgdG8gc2V0IGl0LgoKVmVyc2lvbiA3LjAuNWJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEFwcGxpZWQgTHVvbmcgRGluaCBEdW5nJ3MgY29tbWVudHMgYWJvdXQgYSBmZXcgd2luMzIgY29tcGlsZSBwcm9ibGVtcy4KCi0gQXBwbGllZCBCavZybiBTdGVuYmVyZydzIHN1Z2dlc3RlZCBmaXggdGhhdCB0dXJucyB0aGUgd2luMzIgc3Rkb3V0IHRvCiAgYmluYXJ5LiBJdCB3b24ndCBkbyBpdCBpZiB0aGUgLUIgLyAtLXVzZS1hc2NpaSBvcHRpb24gaXMgdXNlZC4gVGhhdCBvcHRpb24KICBpcyBub3cgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgLUIgLy0tZnRwLS1hc2NpaS4gVGhlIGZsYWcgd2FzCiAgYWxyZWFkeSBpbiB1c2UgYmUgdGhlIGxkYXAgYXMgd2VsbCBzbyB0aGUgbmV3IG5hbWUgZml0cyBwcmV0dHkgZ29vZC4gVGhlCiAgbGliY3lybCBDVVJMT1BUX1RSQU5TRkVSVEVYVCB3YXMgYWxzbyBpbnRyb2R1Y2VkIGFzIGFuIGFsaWFzIHRvIHRoZSBub3cKICBvYnNvbGV0ZSBDVVJMT1BUX0ZUUEFTQ0lJLiBDYW4ndCB2ZXJpZnkgdGhpcyBmaXggbXlzZWxmIGFzIEkgaGF2ZSBubyB3aW4zMgogIGNvbXBpbGVyIGFyb3VuZC4KCkRhbmllbCAoMTMgSnVuZSAyMDAwKQotIEx1b25nIERpbmggRHVuZyA8ZHVuZyBhdCBzY2guYm1lLmh1PiBmb3VuZCBhIHByb2JsZW0gaW4gY3VybF9lYXN5X2NsZWFudXAoKQogIHNpbmNlIGl0IGZyZWUoKWVkIHRoZSBtYWluIGN1cmwgc3RydWN0ICp0d2ljZSouIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoOSBKdW5lIDIwMDApCi0gVXBkYXRlZCB0aGUgUkVTT1VSQ0VTIGZpbGUsIGFkZGVkIGEgUkVBRE1FLndpbjMyIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDAwKQotIFNvIEkgZmluYWxseSBhZGRlZCB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgdG8gdGhlICpzZXRvcHQoKSBvcHRpb25zIGFuZCBpdAogIHNob3VsZCB3b3JrIG5vdy4gSSBkb24ndCBoYXZlIHRoZSBlbmVyZ3kgdG8gd3JpdGUgYW55IHRlc3QgcHJvZ3JhbSBmb3IgaXQKICByaWdodCBub3cuCi0gTWFkZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZWRlZnMgcHVibGljIGluIGN1cmwvY3VybC5oIGZvciBjb21mb3J0LiBKdXN0CiAgaW4gY2FzZSBhbnlvbmUgd2FubmEgZmlkZGxlIHdpdGggc3VjaCBwb2ludGVycy4KLSBVcGRhdGVkIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgpWZXJzaW9uIDcuMC40YmV0YQoKRGFuaWVsICgyIEp1bmUgMjAwMCkKLSBJIG5vdGljZWQgdGhhdCB3aGVuIGRvaW5nIExvY2F0aW9uOiBmb2xsb3dpbmcsIHdlIGxvc3QgY3VzdG9tIGhlYWRlcnMgaW4gYWxsCiAgYnV0IHRoZSBmaXJzdCByZXF1ZXN0LgotIFJlbW92ZWQgdGhlICdIdHRwUG9zdCcgc3RydWN0IGFuZCBtb3ZlZCB0aGUgaGVhZGVyIHN0dWZmIHRvIHRoZSBtb3JlIGdlbmVyaWMKICBjdXJsX3NsaXN0LgotIEFkZGVkIHNvbWUgYmV0dGVyIHNsaXN0LWNsZWFudXBzIGluIHNyYy9tYWluLmMKClZlcnNpb24gNy4wLjNiZXRhCgpEYW5pZWwgKDMxIE1heSAyMDAwKQotIFNvIEkgZGlzY292ZXJlZCB0aGF0IEkgcmVsZWFzZWQgdGhlIDcuMC4yYmV0YSB3aXRob3V0IGl0IGJlaW5nIGFibGUgdG8KICBjb21waWxlIHVuZGVyIExpbnV4LiBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkgdHVybmVkIG91dCB0bwogIGZlYXR1cmUgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgc3lzdGVtcyBzbyBJIGhhZCB0byBhZGQKICBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhpcyBhbmQgYWRqdXN0IHRoZSBjb2RlIHNsaWdodGx5LgoKVmVyc2lvbiA3LjAuMmJldGEKCkRhbmllbCAoMjkgTWF5IDIwMDApCi0gQ29ycmVjdGVkIHRoZSBiaXRzLiogYXNzaWdubWVudHMgd2hlbiB1c2luZyBDVVJMT1BUIG9wdGlvbnMgdGhhdCBvbmx5CiAgdG9nZ2xlcyBvbmUgb2YgdGhvc2UgYml0cy4KCi0gQXBwbGllZCB0aGUgaHVnZSBwYXRjaGVzIGZyb20gRGF2aWQgTGVCbGFuYyA8ZGxlYmxhbmMgYXQgcW54LmNvbT4gdGhhdCBhZGQKICB1c2FnZSBvZiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGluIGNhc2UgdGhleSdyZSBhcm91bmQsCiAgc2luY2UgdGhhdCBtYWtlIGxpYmN1cmwgbXVjaCBiZXR0ZXIgdGhyZWFkc2FmZSBpbiBtYW55IHN5c3RlbXMgKHN1Y2ggYXMKICBzb2xhcmlzKS4gSSBhZGRlZCB0aGUgY2hlY2tzIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgogIEkgY2FuJ3QgZXhwbGFpbiB3aHksIGJ1dCB0aGUgaW5ldF9udG9hX3IoKSBmdW5jdGlvbiBkaWQgbm90IGFwcGVhciBpbiBteQogIFNvbGFyaXMgaW5jbHVkZSBmaWxlcywgSSBoYWQgdG8gYWRkIG15IG93biBpbmNsdWRlIGZpbGUgZm9yIHRoaXMgZm9yIG5vdy4KCkRhbmllbCAoMjIgTWF5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIGZpeGVzIHRvIG1ha2UgdGhlIHdpbjMyIHZlcnNpb24gY29tcGlsZSBwcm9wZXJseSBhcwogIHdlbGwgYXMgYSByZW5hbWUgb2YgdGhlICdpbnRlcmZhY2UnIGZpZWxkIGluIHRoZSB1cmxkYXRhIHN0cnVjdCwgYXMgaXQgc2VlbXMKICB0byBiZSByZXNlcnZlZCBpbiBzb21lIGdjYyB2ZXJzaW9ucyEKCi0gUmljaCBHcmF5IHN0cnVjayBiYWNrIHdpdGggeWV0IHNvbWUgcG9ydGFiaWxpdHkgcmVwb3J0cy4gRGF0YSBHZW5lcmFsIERHL1VYCiAgbmVlZGVkIGEgbGl0dGxlIGZpeCBpbiBsaWIvbGRhcC5jIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBSVExEX0dMT0JBTCBkZWZpbmVkLgogIE1vcmUgZml4ZXMgYXJlIGV4cGVjdGVkIGFzIGEgcmVzdWx0IG9mIFJpY2hpZXMgdmVyeSBoZWxwZnVsIHdvcmsuCgpWZXJzaW9uIDcuMC4xYmV0YQoKRGFuaWVsICgyMSBNYXkgMjAwMCkKLSBVcGRhdGVkIGxvdHMgb2YgI2RlZmluZXMsIGVudW1zIGFuZCB2YXJpYWJsZSB0eXBlIG5hbWVzIGluIHRoZSBsaWJyYXJ5LiBObwogIG1vcmUgd2VpcmQgVVJHIG9yIFVSTFRBRyBwcmVmaXhlcy4gQWxsIHR5cGVzIGFuZCBuYW1lcyBzaG91bGQgYmUgY3VybC0KICBwcmVmaXhlZCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMuIFRoZSBGTEFHUy1wYXJhbWV0ZXIgdG8gdGhlIGZvcm1lcgogIGN1cmxfdXJsZ2V0KCkgaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBidW5jaCBvZiBmbGFncyB0byB1c2UgaW4gc2VwYXJhdGUKICBzZXRvcHQgY2FsbHMuIEknbSBzdGlsbCBmb2N1c2luZyBvbiB0aGUgZWFzeS1pbnRlcmZhY2UsIGFzIHRoZSBjdXJsIHRvb2wgaXMKICBub3cgdXNpbmcgdGhhdC4KCi0gQmpvcm4gUmVlc2UgaGFzIHByb3ZpZGVkIG1lIHdpdGggYW4gYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXIgdGhhdCBJIHBsYW4KICB0byB1c2UgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgY3VybCB0byBiZSBhYmxlIHRvIGdyYWNlZnVsbHkgdGltZW91dCBuYW1lCiAgbG9va3Vwcy4KClZlcnNpb24gNy4wYmV0YQoKRGFuaWVsICgxOCBNYXkgMjAwMCkKLSBJbnRyb2R1Y2VkIExJQkNVUkxfVkVSU0lPTl9OVU0gdG8gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYmV0dGVyIGFsbG93CiAgc291cmNlIGNvZGVzIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgbGliIHZlcnNpb24uIFRoaXMgZGVmaW5lIGlzIG5vdyBzZXQgdG8KICBhIGRleGFkZWNpbWFsIG51bWJlciwgd2l0aCA4IGJpdHMgZWFjaCBmb3IgbWFqb3IgbnVtYmVyLCBtaW5vciBudW1iZXIgYW5kCiAgcGF0Y2ggbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgdmVyc2lvbiAxLjIuMyB3b3VsZCBtYWtlIGl0IDB4MDEwMjAzLiBJdCBhbHNvCiAgbWFrZXMgYSBsYXJnZXIgbnVtYmVyIGEgbmV3ZXIgdmVyc2lvbi4KCkRhbmllbCAoMTcgTWF5IDIwMDApCi0gTWFydGluIEthbW1lcmhvZmVyIGNvcnJlY3RseSBwb2ludGVkIG91dCBzZXZlcmFsIGZsYXdzIGluIHRoZSBGVFAgcmFuZ2UKICBvcHRpb24uIEkgY29ycmVjdGVkIHRoZW0uCi0gUmVtb3ZlZCB0aGUgd2luMzIgd2luc29jayBpbml0IGNyYXAgZnJvbSB0aGUgbGliIHRvIHRoZSBzcmMvbWFpbi5jIGZpbGUKICBpbiB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC4gVGhleSBjYW4ndCBiZSBpbiB0aGUgbGliLCBlc3BlY2lhbGx5IG5vdCBmb3IKICBtdWx0aXRocmVhZGVkIHB1cnBvc2VzLgoKRGFuaWVsICgxNiBNYXkgMjAwMCkKLSBSZXdyb3RlIHRoZSBzcmMvbWFpbi5jIHNvdXJjZSB0byB1c2UgdGhlIG5ldyBlYXN5LWludGVyZmFjZSB0byBsaWJjdXJsIDcuCiAgVGhlcmUgaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLCBidXQgdGhlIGZpcnN0IHN0ZXAgaXMgbm93IHRha2VuLgogIDxjdXJsL2Vhc3kuaD4gaXMgdGhlIGluY2x1ZGUgZmlsZSB0byB1c2UuCgpEYW5pZWwgKDE0IE1heSAyMDAwKQotIEZUUCBVUkxzIGFyZSBub3cgdHJlYXRlZCBzbGlnaHRseSBkaWZmZXJlbnQsIG1vcmUgYWNjb3JkaW5nIHRvIFJGQyAxNzM4LgotIEZUUCBzZXNzaW9ucyBhcmUgbm93IHBlcmZvcm1lZCBkaWZmZXJlbnRseSwgd2l0aCBDV0QgY29tbWFuZHMgdG8gY2hhbmdlCiAgZGlyZWN0b3J5IGluc3RlYWQgb2YgUkVUUi9TVE9SL0xJU1Qgd2l0aCB0aGUgZnVsbCBwYXRoLiBEaXNjdXNzaW9ucyB3aXRoCiAgUmljaCBHcmF5IG1hZGUgbWUgbm90aWNlIHRoZXNlIHByb2JsZW1zLgotIEphbm5lIEpvaGFuc3NvbiBkaXNjb3ZlcmVkIGFuZCBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCiAgc3JjL3Vzcmdsb2IuYyBmaWxlLgotIEkgaGFkIHRvIGFkZCBhIGxpYi9zdHJlcXVhbC5jIGZpbGUgZm9yIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyZXMgb24gYWxsIHBsYXRmb3Jtcy4KCkRhbmllbCAoOCBNYXkgMjAwMCk6Ci0gQmVlbiB3b3JraW5nIGxvdHMgb24gdGhlIG5ldyBsaWIuCi0gVG9nZXRoZXIgd2l0aCBSaWNoIEdyYXksIEkndmUgdHJpZWQgdG8gYWRqdXN0IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsKICBiZXR0ZXIgb24gdGhlIE5DUiBNUC1SQVMgVW5peC4KCkRhbmllbCAoMiBNYXkgMjAwMCk6Ci0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgZmV3IHRvbyBtYW55IGluc3RydWN0aW9ucyBpbgogIGNvbmZpZ3VyZS5pbiB0aGF0IGRpZG4ndCBkbyBhbnkgZ29vZC4KCkRhbmllbCAoMjQgQXByaWwgMjAwMCk6Ci0gQWRkZWQgYSBuZXcgcGFyYWdyYXBoIHRvIHRoZSBGQVEgYWJvdXQgd2hhdCB0byBkbyB3aGVuIGNvbmZpZ3VyZSBjYW4ndAogIGZpbmQgT3BlblNTTCBldmVuIHRob3VnaCBpdCBpcyBpbnN0YWxsZWQuIFN1cHBsaWVkIGJ5IEJvYiBBbGxpc29uCgpEYW5pZWwgKDEyIEFwcmlsIDIwMDApOgotIFN0YXJ0ZWQgbWVzc2luZyBhcm91bmQgYmlnLXRpbWUgdG8gY29udmVydCB0aGUgb2xkIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGEKICBiZXR0ZXIgb25lLi4uCgpEYW5pZWwgKDggQXByaWwgMjAwMCk6Ci0gTWFkZSB0aGUgcHJvZ3Jlc3MgYmFyIGxvb2sgYmV0dGVyIGZvciBmaWxlIHNpemVzIGJldHdlZW4gOTk5OSBraWxvYnl0ZXMKICBhbmQgMTAwIG1lZ2FieXRlcy4gVGhleSdyZSBub3cgZGlzcGxheWVkIFhYLlhNLgotIEkgYWxzbyBub3RpY2VkIHRoYXQgZnRwIGZldGNoZXMgdGhyb3VnaCBIVFRQIHByb3hpZXMgZGlkbid0IGFkZCB0aGUgdXNlcgogIGFnZW50IHN0cmluZy4gSXQgZG9lcyBub3cuCi0gSGFiaWJpZSA8aGFiaWJpZSBhdCBNYWlsYW5kTmV3cy5jb20+IHN1cHBsaWVkIGEgcHJldHR5IGdvb2Qgd2F5IHRvIGJ1aWxkIFJQTXMKICBvbiBhIExpbnV4IG1hY2hpbmUuIEl0IHN0aWxsIGEpIHJlcXVpcmVzIG1lIHRvIGJlIHJvb3QgdG8gZG8gaXQsIGIpIGxlYXZlcwogIHRoZSBycG0gcGFja2FnZXMgbGF5aW5nIGF0IHNvbWUgb2RkIHBsYWNlIG9uIG15IGRpc2sgYykgZG9lc24ndCB3b3JrIHRvCiAgYnVpbGQgdGhlIHNzbCB2ZXJzaW9uIG9mIGN1cmwgc2luY2UgSSBkaWRuJ3QgaW5zdGFsbCBvcGVuc3NsIGZyb20gYW4gcnBtCiAgcGFja2FnZSBzbyBub3cgdGhlIHJwbSBjcmFwIHRoaW5rcyBJIGRvbid0IGhhdmUgb3BlbnNzbCBhbmQgcmVmdXNlcyB0byBidWlsZAogIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gc3NsLi4uIERpZCBJIG1lbnRpb24gSSBkb24ndCBnZXQgYWxvbmcgd2l0aCBSUE0/Ci0gT25jZSBhZ2FpbiBJIHJlY2VpdmVkIGEgYnVnIHJlcG9ydCBhYm91dCBhdXRvY29uZiBub3Qgc2V0dGluZyAtTCBwcmlvciB0byAtbAogIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjaGVja2luZyBmb3IgbGlicy4gSW4gdGhpcyBjYXNlIGl0IG1hZGUgdGhlIG5hdGl2ZQogIGNjIGNvbXBpbGVyIG9uIFNvbGFyaXMgNyB0byBmYWlsIHRoZSBPcGVuU1NMIGNoZWNrLiBUaGlzIGhhcyBwcmV2aW91c2x5IGJlZW4KICByZXBvcnRlZCB0byBjYXVzZSBwcm9ibGVtcyBvbiBIUC1VWCBhbmQgaXMgYSBrbm93biBmbGF3IGluIGF1dG9jb25mIDIuMTMuIEl0CiAgaXMgYSBwaXR5IHRoZXJlJ3Mgbm8gbmV3ZXIgcmVsZWFzZSBhcm91bmQuLi4KCkRhbmllbCAoNCBBcHJpbCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIHR3byBmaXhlcyB0aGF0CiAgYXBwZWFyYW50bHkgbWFrZXMgdGhlIE9TLzIgcG9ydCB3b3JrIGJldHRlciB3aXRoIG11bHRpcGxlIFVSTHMuCgpEYW5pZWwgKDIgQXByaWwgMjAwMCk6Ci0gQW5vdGhlciBMb2NhdGlvbjogZml4LiBUaGlzIHRpbWUsIHdoZW4gY3VybCBjb25uZWN0ZWQgdG8gYSBwb3J0IGFuZCB0aGVuCiAgZm9sbG93ZWQgYSBsb2NhdGlvbiB3aXRoIGFuIGFic29sdXRlIFVSTCB0byBhbm90aGVyIHBvcnQsIGl0IG1pc2JlaGF2ZWQuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDApOgotIEguIERhcGhuZSBMdW9uZyBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHdyb25nbHkKICBtZXNzaW5nIHVwIHRoZSBwcm94eSBzdHJpbmcgd2hlbiBmZXRjaGluZyBhIGRvY3VtZW50IHRocm91Z2ggYSBodHRwIHByb3h5LAogIHdoaWNoIHNjcmV3ZWQgdXAgbXVsdGlwbGUgZmV0Y2hlcyBzdWNoIGFzIGluIGxvY2F0aW9uOiBmb2xsb3dpbmdzLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBjb3JyZWN0ZWQgbXkgYmFkbHkgYXBwbGllZCBwYXRjaCBoZQogIGFjdHVhbGx5IGFscmVhZHkgdG9sZCBtZSBhYm91dCEKCi0gSC4gRGFwaG5lIEx1b25nIGJyb3VnaHQgbWUgYSBmaXggdGhhdCBub3cgbWFrZXMgY3VybAogIGlnbm9yZSBzZWxlY3QoKSBlcnJvcnMgaW4gdGhlIGRvd25sb2FkIGlmIGVycm5vIGlzIEVJTlRSLCB3aGljaCB0dXJucyBvdXQgdG8KICBoYXBwZW4gZXZlcnkgbm93IGFuZCB0aGVuIHdoZW4gdXNpbmcgbGliY3VybCBtdWx0aS10aHJlYWRlZC4uLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBjb3VwbGUgb2Ygd2luMzIgZml4ZXMuIEhBVkVfVU5BTUUKICB3YXMgYWNjaWRlbnRhbGx5ICNkZWZpbmVkIGluIGNvbmZpZy13aW4zMi5oLCB3aGljaCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuLgogIFRoZSBIQVZFX1VOSVNURF9IIGlzIG5vdCBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggdGhlIE1ha2VmaWxlLnZjNgogIG1ha2VmaWxlIGZvciBNUyBWQysrLgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBJIHJlbW92ZWQgdGhlIEFDX1BST0dfSU5TVEFMTCBtYWNybyBmcm9tIGNvbmZpZ3VyZS5pbiwgc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgb25lIG9mIHRoZSBBTV8qIG1hY3JvcyBzZWFyY2hlcyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIGFscmVhZHkuIEphbm5lCiAgSm9oYW5zc29uIG1hZGUgbWUgYXdhcmUgb2YgdGhpcy4KClZlcnNpb24gNi41LjIKCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbm9ueW1vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVyc2lvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBwYXRjaCBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYKICBmaWxlLiBXZSBzdGlsbCBuZWVkIHNvbWUgZml4ZXMgZm9yIHRoZSBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBWQysrIGFuZCBtaW5ndzMyIGhhdmUgZGlmZmVyZW50IG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncwogIGV4aXN0ZW5jZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMCk6Ci0gSSBtb2RpZmllZCB0aGUgLUQvLS1kdW1wLWhlYWRlciB3b3JraW5ncyBzbyB0aGF0IGl0IGRvZXNuJ3Qgd3JpdGUgYW55dGhpbmcKICB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0by4gVGhpcyB3YXksIHlvdSBjYW4gYWN0dWFsbHkgdXNlIC1iIGFuZCAtRAogIG9uIHRoZSBzYW1lIGZpbGUgaWYgeW91IHdhbnQgcmVwZWF0ZWQgaW52b2tlcyB0byBzdG9yZSBhbmQgcmVhZCB0aGUgY29va2llcwogIGluIHRoYXQgb25lIHNpbmdsZSBmaWxlLgoKLSBQb2tlZCBhcm91bmQgaW4gbG90cyBvZiB0ZXh0cy4gQWRkZWQgdGhlIEJVR1MgZmlsZSBmb3IgYnVnIHJlcG9ydGluZyBzdHVmZi4KICBBZGRlZCB0aGUgY2xhc3NpYyBIVFRQIFBPU1QgcXVlc3Rpb24gdG8gdGhlIEZBUSwgcmVtb3ZlZCBzb21lICNpZmRlZiBXSU4zMgogIHN0dWZmIGZyb20gdGhlIHNvdXJjZXMgKHRoZXkncmUgY292ZXJlZCBieSB0aGUgY29uZmlnLXdpbjMyLmggbm93KS4KCi0gUGFzY2FsIEdhdWRldHRlIGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybCBhdCBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGgsIENocmlzIDxjYmF5bGlzcyBhdCBjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBhcmVudCB3aGVuIHRoZXkgcmVsZWFzZWQgb3BlbnNzbAogIDAuOS41IHNpbmNlIHRoYXQgYmFyZmVkIG9uIGN1cmwncyBiYWQgYmVoYXZpb3IgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcnJlZCB0aW1lLiBBbmRyZXcgPHRtciBhdCBnY2kubmV0PgogIHN1Z2dlc3RlZCB0aGlzLgoKLSBEYW1pZW4gQWRhbnQgbWFpbGVkIG1lIGhpcyBmaXhlcyBmb3IgbWFraW5nIGN1cmwgY29tcGlsZSBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmaWVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuJ3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIG1hZGUgZ2V0ZGF0ZS55IHdvcmsgZm9yIE1hY09TIFguCgotIFBhdWwgSGFycmluZ3RvbiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYml0IG9mIHNlbmRpbmcgZW1wdHkgY29va2llcyB0bwogIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMCk6CiAtIFJvbiBaYXBwIGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IHBvaW50ZWQgb3V0IGEgY3VybCBidWcgaW4gdGhlIGxvY2F0aW9uOiBhcmVhLAogICBhbHRob3VnaCBJIGRpZCBub3QgZ2V0IGEgcmVwcm9kdWNpYmxlIHdheSB0byBkbyB0aGlzIHdoeSBJIGhhdmUgdG8gd2FpdAogICB3aXRoIGZpeGluZyBhbnl0aGluZy4KCiAtIEJvYiBTY2hhZGVyIHN1Z2dlc3RlZCBJIHNob3VsZCBpbXBsZW1lbnQgcmVzdW1lCiAgIHN1cHBvcnQgZm9yIHRoZSBIVFRQIFBVVCBvcGVyYXRpb24sIGFuZCBhcyBJIHRoaW5rIGl0IGlzIGEgdmFsaWQgc3VnZ2VzdGlvbgogICBJJ2xsIHdvcmsgb24gaXQuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMCk6CiAtIE0gVHJhdmlzIE9iZW5oYXVzIHBvaW50ZWQgb3V0IGEgbWFudWFsIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzCiAgIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHRvIGNvbXBpbGUKICAgY3VybCBvbiBBSVggNC4xLjQgYW5kIGdhdmUgbWUgYSBzb2x1dGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBhbHJlYWR5IGZpeGVkCiAgIGJ5IEr2cm4ncyByZWNlbnQgI2luY2x1ZGUgbW9kaWZpY2F0aW9ucyEKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAwKToKIC0gT3NrYXIgTGlsamVibGFkIHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcsIEkgbWFkZSB0aGUKICAgcHJvZ3Jlc3MgZGVhbCBiZXR0ZXIgd2l0aCBsYXJnZXIgZmlsZXMgYW5kIGFkZGVkIGEgIlRpbWUiIGZpZWxkIHdoaWNoIHNob3dzCiAgIHRoZSB0aW1lIHNwZW50IG9uIHRoZSBkb3dubG9hZCBzbyBmYXIuCiAtIEknbSBub3cgdXNpbmcgdGhlIENWUyByZXBvc2l0b3J5IG9uIHNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggYWxzbyBhbGxvd3Mgd2ViCiAgIGJyb3dzaW5nLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5udS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDAwKToKIC0gUmVudW1iZXJlZCBzb21lIGVudW1zIGluIGN1cmwvY3VybC5oIHNpbmNlIHRhZyBudW1iZXIgMzUgd2FzIHVzZWQgdHdpY2UhCiAtIEFkZGVkICJwb3N0cXVvdGUiIHN1cHBvcnQgdG8gdGhlIGZ0cCBzZWN0aW9uIHRoYXQgZW5hYmxlcyBwb3N0LWZ0cC10cmFuc2ZlcgogICBxdW90ZSBjb21tYW5kcy4KIC0gTm93IG1hZGUgdGhlIC1RLy0tcXVvdGUgcGFyYW1ldGVyIHJlY29nbml6ZSAnLScgYXMgYSBwcmVmaXgsIHdoaWNoIG1lYW5zCiAgIHRoYXQgY29tbWFuZCB3aWxsIGJlIGlzc3VlZCBBRlRFUiBhIHN1Y2Nlc3NmdWwgZnRwIHRyYW5zZmVyLiBUaGlzIGNhbiBvZgogICBjb3Vyc2UgYmUgdXNlZCB0byBkZWxldGUgb3IgcmVuYW1lIGEgZmlsZSBhZnRlciBpdCBoYXMgYmVlbiB1cGxvYWRlZCBvcgogICBkb3dubG9hZGVkLiBVc2UgeW91ciBpbWFnaW5hdGlvbiEgOy0pCiAtIFNpbmNlIEkgZG8gdGhlIG1haW4gZGV2ZWxvcG1lbnQgb24gc29sYXJpcyAyLjYgbm93LCBJIGhhZCB0byBkb3dubG9hZCBhbmQKICAgaW5zdGFsbCBHTlUgZ3JvZmYgdG8gZ2VuZXJhdGUgdGhlIGh1Z2VoZWxwLmMgZmlsZS4gVGhlIHNvbGFyaXMgbnJvZmYgY29yZXMKICAgb24gdGhlIG1hbiBwYWdlISBTbywgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc29sYXJpcyBjb25maWd1cmUgc2NyaXB0IGZpbmQgYQogICBiZXR0ZXIgcmVzdWx0IEkgbWFkZSBnbnJvZmYgZ2V0IGNoZWNrZWQgcHJpb3IgdG8gdGhlIHJlZ3VsYXIgbnJvZmYuCiAtIEFkZGVkIGFsbCB0aGUgY3VybCBleGl0IGNvZGVzIHRvIHRoZSBtYW4gcGFnZS4KIC0gSmltIEdhbGxhZ2hlciBwcm9wZXJseSB0cmFja2VkIGRvd24gYSBidWcgaW4gYXV0b2NvbmYKICAgMi4xMy4gVGhlIEFDX0NIRUNLX0xJQigpIG1hY3JvIHdyb25nZnVsbHkgdXNlcyB0aGUgLWwgZmxhZyBiZWZvcmUgdGhlIC1MCiAgIGZsYWcgdG8gJ2xkJyB3aGljaCBjYXVzZXMgdGhlIEhQLVVYIDEwLjIwIGZsYXZvdXIgdG8gZmFpbCBvbiBhbGwgbGliY2hlY2tzCiAgIGFuZCB0aGVyZWZvcmUgeW91IGNhbid0IG1ha2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBsaWJzIQoKRGFuaWVsICgyOCBEZWNlbWJlciAxOTk5KToKIC0gVGltIFZlcmhvZXZlbiBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IGN1cmwKICAgZG9lc24ndCBzdXBwb3J0IFVSTCBmb3JtYXR0ZWQgZmlsZSBuYW1lcyB3aGVuIGdldHRpbmcgZnRwLiBOb3csIHRoZXJlJ3MgYQogICBwcm9ibGVtIHdpdGggZ2V0dGluZyB2ZXJ5IHdlaXJkIGZpbGUgbmFtZXMgb2ZmIEZUUCBzZXJ2ZXJzLiBSRkMgOTU5IGRlZmluZXMKICAgdGhhdCB0aGUgZmlsZSBuYW1lIHN5bnRheCB0byB1c2Ugc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIHRoZSBuYXRpdmUgT1Mgb2YKICAgdGhlIHNlcnZlci4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgcGVlciBzZXJ2ZXIgc3lzdGVtIHdlIGN1cnJlbnRseSBqdXN0CiAgIHRyYW5zbGF0ZSB0aGUgVVJMIHN5bnRheCBpbnRvIHBsYWluIGxldHRlcnMuIEl0IGlzIHN0aWxsIGJldHRlciBhbmQgd2l0aAogICB0aGUgc29sYXJpcyAyLjYtc3VwcGxpZWQgZnRwIHNlcnZlciBpdCB3b3JrcyB3aXRoIHNwYWNlcyBpbiB0aGUgZmlsZSBuYW1lcy4KCkRhbmllbCAoMjcgRGVjZW1iZXIgMTk5OSk6CiAtIFdoZW4gY3VybCBwYXJzZWQgY29va2llcyBzdHJhaWdodCBvZmYgYSByZW1vdGUgc2l0ZSwgaXQgY29ycnVwdGVkIHRoZSBpbnB1dAogICBkYXRhLCB3aGljaCwgaWYgdGhlIGRvd25sb2FkZWQgaGVhZGVycyB3ZXJlIHN0b3JlZCBtYWRlIHZlcnkgb2RkIGNoYXJhY3RlcnMKICAgaW4gdGhlIHNhdmVkIGRhdGEuIENvcnJlY3RseSBpZGVudGlmaWVkIGFuZCByZXBvcnRlZCBieSBQYXVsIEhhcnJpbmd0b24uCgpEYW5pZWwgKDEzIERlY2VtYmVyIDE5OTkpOgogLSBHZW5lcmFsIGNsZWFudXBzIGluIHRoZSBsaWJyYXJ5IGludGVyZmFjZS4gVGhlcmUgaGFkIGJlZW4gc29tZSBiYWQga2x1ZGdlcwogICBhZGRlZCBkdXJpbmcgdGltZXMgb2Ygc3RyZXNzIGFuZCBJIGRpZCBteSBiZXN0IHRvIGNsZWFuIHRoZW0gb2ZmLiBJdCB3YXMKICAgYm90aCByZWdhcmRpbmcgdGhlIGxpYiBBUEkgYXMgd2VsbCBhcyBpbmNsdWRlIGZpbGUgY29uZnVzaW9ucy4KCkRhbmllbCAoMyBEZWNlbWJlciAxOTk5KToKIC0gQSBzbWFsbCAtLXN0ZGVyciBidWcgd2FzIHJlcG9ydGVkIGJ5IEVldHUgT2phbmVuLi4uCgogLSB3aG8gYWxzbyBicm91Z2h0IHRoZSBzdWdnZXN0aW9uIG9mIGV4dGVuZGluZyB0aGUgLVggZmxhZyB0byBmdHAgbGlzdCBhcwogICB3ZWxsLiBTbywgbm93IGl0IGlzIGFuZCB0aGUgbG9uZyBvcHRpb24gaXMgbm93IC0tcmVxdWVzdCBpbnN0ZWFkLiBJdCBpcwogICBvbmx5IGZvciBmdHAgbGlzdCBmb3Igbm93IChhbmQgdGhlIGZvcm1lciBodHRwIHN0dWZmIHRvbyBvZiBjb3Vyc2UpLgoKTGFycyBKLiBBYXMgKDI0IE5vdmVtYmVyIDE5OTkpOgogLSBQYXRjaGVkIGN1cmwgdG8gY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIgQmVPUy4gRG9lc24ndCB3b3JrIHlldCB0aG91Z2ghCgogLSBDb3JyZWN0ZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzIHRvIGFsbG93IHB1dHRpbmcgb2JqZWN0IGZpbGVzIGluCiAgIGRpZmZlcmVudCBkaXJlY3RvcmllcyB0aGFuIHRoZSBzb3VyY2VzLgoKVmVyc2lvbiA2LjMuMQoKRGFuaWVsICgyMyBOb3ZlbWJlciAxOTk5KToKIC0gSSd2ZSBoYWQgdGhpcyBtYWpvciBkaXNrIGNyYXNoLiBNeSBnb29kIG9sZCB0cnVzdC13b3J0aHkgc291cmNlIGRpc2sgZGllZAogICBhbG9uZyB3aXRoIHRoZSBtYWNoaW5lIHRoYXQgaG9zdGVkIGl0LiBUaGFuayBnb29kbmVzcyBtb3N0IG9mIGFsbCB0aGUKICAgdGhpbmdzIEkndmUgZG9uZSBhcmUgZWl0aGVyIGJhY2tlZCB1cCBlbHNld2hlcmUgb3Igc3RvcmVkIGluIHRoaXMgQ1ZTCiAgIHNlcnZlciEKCiAtIE1pY2hhZWwgUy4gU3RldWVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSAtRiBoYW5kbGluZwogICB0aGF0IG1hZGUgY3VybCBoYW5nIGlmIHlvdSBwb3N0ZWQgYW4gZW1wdHkgdmFyaWFibGUgc3VjaCBhcyAnLUYgbmFtZT0nLiBJdAogICB3YXMgb25lIG9mIHRob3NlIG9sZCBidWdzIHRoYXQgbmV2ZXIgaGF2ZSB3b3JrZWQgcHJvcGVybHkuLi4KCiAtIEphc29uIEJhaWV0dG8gcG9pbnRlZCBvdXQgYSBnZW5lcmFsIGZsYXcgaW4gdGhlIEhUVFAKICAgZG93bmxvYWQuIEN1cmwgZGlkbid0IGNvbXBsYWluIGlmIGl0IHdhcyBwcmVtYXR1cmVseSBhYm9ydGVkIGJlZm9yZSB0aGUKICAgZW50aXJlIGRvd25sb2FkIHdhcyBjb21wbGV0ZWQuIEl0IGRvZXMgbm93LgoKRGFuaWVsICgxOSBOb3ZlbWJlciAxOTk5KToKIC0gQ2hyaXMgTWFsdGJ5IHZlcnkgYWNjdXJhdGVseSBjcml0aWNpemVkIHRoZSBsYWNrIG9mCiAgIHJldHVybiBjb2RlIGNoZWNrcyBvbiB0aGUgZndyaXRlKCkgY2FsbHMuIEkgZGlkIGEgdGhvcm91Z2ggY2hlY2sgZm9yIGFsbAogICBvY2N1cnJlbmNlcyBhbmQgY29ycmVjdGVkIHRoaXMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDE5OTkpOgogLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgLW0vLS1tYXgtdGltZSBvcHRpb24KICAgZG9lc24ndCB3b3JrIGZvciB0aGUgc2xvdyBzeXN0ZW0gY2FsbHMgbGlrZSBnZXRob3N0YnluYW1lKCkuLi4gSSBkb24ndCBoYXZlCiAgIGFueSBnb29kIGZpeCB5ZXQsIGp1c3QgYSBzbGlnaHRseSBsZXNzIGJhZCBvbmUgdGhhdCBtYWtlcyBjdXJsIGV4aXQgaGFyZAogICB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgcG9pbnQgb3V0IGEgcG9zc2libGUgcHJvYmxlbSB0aGF0IG1pZ2h0IGJlIHRoZSByZWFzb24KICAgd2h5IFRob21hcyBIdXJzdCBleHBlcmllbmNlIHByb2JsZW1zIGluIGhpcyBBbWlnYSB2ZXJzaW9uLgoKIERhbmllbCAoMTIgTm92ZW1iZXIgMTk5OSk6CiAtIEkgZm91bmQgYSBjcmFzaCBpbiB0aGUgbmV3IGNvb2tpZSBmaWxlIHBhcnNlci4gSXQgY3Jhc2hlZCB3aGVuIHlvdSBnYXZlCiAgIGEgcGxhaW4gaHR0cCBoZWFkZXIgZmlsZSBhcyBpbnB1dC4uLgoKVmVyc2lvbiA2LjMKCiBEYW5pZWwgKDEwIE5vdmVtYmVyIDE5OTkpOgogLSBJIGtpbmQgb2YgZm91bmQgb3V0IHRoYXQgdGhlIEhUVFAgdGltZS1jb25kaXRpb25hbCBHRVRzICgteikgYXJlbid0IGFsd2F5cwogICByZXNwZWN0ZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgYW5kIHRoZSBkb2N1bWVudCBpcyB0aGVyZWZvcmUgc2VudCBpbiB3aG9sZQogICBhZ2FpbiwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGNvbmRpdGlvbi4gQWZ0ZXIgcmVhZGluZwogICBzZWN0aW9uIDEzLjMuNCBvZiBSRkMgMjYxNiwgSSB0aGluayBJJ20gZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIG5vdyB3aGVuIEkgZG8KICAgbXkgb3duIGNoZWNrIGFzIHdlbGwuIElmIGN1cmwgdGhpbmtzIHRoZSBjb25kaXRpb24gaXNuJ3QgbWV0LCB0aGUgdHJhbnNmZXIKICAgaXMgYWJvcnRlZCBwcmVtYXR1cmVseSAoYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzIGhhdmUgYmVlbiByZWNlaXZlZCkuCgogLSBBZnRlciBjb21tZW50cyBmcm9tIFJvYmVydCBMaW5kZW4gSSBhbHNvIHJld3JvdGUgc29tZSBwYXJ0cyBvZiB0aGUgbWFuIHBhZ2UKICAgdG8gYmV0dGVyIGRlc2NyaWJlIGhvdyB0aGUgLUYgd29ya3MuCgogLSBNaWNoYWVsIEFudGkgcHV0IHVwIGEgbmV3IGN1cmwgZG93bmxvYWQgbWlycm9yIGluCiAgIENoaW5hOiAgaHR0cDovL3d3dy5wc2hvd2luZy5jb20vY3VybC8KCiAtIEkgYWRkZWQgdGhlIGxpc3Qgb2YgZG93bmxvYWQgbWlycm9ycyB0byB0aGUgUkVBRE1FIGZpbGUKCiAtIEkgZGlkIGFkZCBtb3JlIGV4cGxhbmF0aW9ucyB0byB0aGUgbWFuIHBhZ2UKCiBEYW5pZWwgKDggTm92ZW1iZXIgMTk5OSk6CiAtIEkgbWFkZSB0aGUgLWIvLS1jb29raWUgb3B0aW9uIGNhcGFibGUgb2YgcmVhZGluZyBuZXRzY2FwZSBmb3JtYXR0ZWQgY29va2llCiAgIGZpbGVzIGFzIHdlbGwgYXMgbm9ybWFsIGh0dHAtaGVhZGVyIGZpbGVzLiBJdCBzaG91bGQgYmUgYWJsZSB0bwogICB0cmFuc3BhcmVudGx5IGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGZpbGUgaXQgZ290IGFzIGlucHV0LgoKIERhbmllbCAoMjkgT2N0b2JlciAxOTk5KToKIC0gQW5vdGhlciBvbmUgb2YgU2ViYXN0aWFhbiB2YW4gRXJrJ3MgaWRlYXMgKHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGJlZm9yZQogICBidXQgSSBzZWVtIHRvIGhhdmUgZm9yZ290dGVuIHdobyBpdCB3YXMpLCBpcyB0byBhZGQgc3VwcG9ydCBmb3IgcmFuZ2VzIGluCiAgIEZUUCBkb3dubG9hZHMuIEFzIHVzdWFsLCBvbmUgcmVxdWVzdCBpcyBqdXN0IGEgcmVxdWVzdCwgd2hlbiB0aGV5J3JlIHR3bwogICBpdCBpcyBhIGRlbWFuZC4gSSd2ZSBhZGRlZCBzaW1wbGUgc3VwcG9ydCBmb3IgWC1ZIHN0eWxlIGZldGNoZXMuIFggaGFzIHRvCiAgIGJlIHRoZSBsb3dlciBudW1iZXIsIHRob3VnaCB5b3UgbWF5IG9taXQgb25lIG9mIHRoZSBudW1iZXJzLiBVc2UgdGhlIC1yLwogICAtLXJhbmdlIHN3aXRjaCAocHJldmlvdXNseSBIVFRQLW9ubHkpLgoKIC0gU2ViYXN0aWFhbiB2YW4gRXJrIHN1Z2dlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlCiAgIGFibGUgdG8gc2hvdyB0aGUgZmlsZSBzaXplIG9mIGEgc3BlY2lmaWVkIGZpbGUuIEkgdGhpbmsgdGhpcyBpcyBhIHNwbGVuZGlkCiAgIGlkZWEgYW5kIHRoZSAtSSBmbGFnIGlzIG5vdyB3b3JraW5nIGZvciBGVFAuIEl0IGRpc3BsYXlzIHRoZSBmaWxlIHNpemUgaW4KICAgdGhpcyBtYW5uZXI6CiAgICAgICAgQ29udGVudC1MZW5ndGg6IFhYWFgKICAgQXMgaXQgcmVzZW1ibGVzIG5vcm1hbCBoZWFkZXJzLCBhbmQgbGVhdmVzIHVzIHRoZSBvcHBvcnR1bml0eSB0byBhZGQgbW9yZQogICBpbmZvIGluIHRoYXQgZGlzcGxheSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIG1vcmUgaW4gdGhlIGZ1dHVyZSEgSXQgYWxzbwogICBtYWtlcyBzZW5zZSBzaW5jZSBpZiB5b3UgYWNjZXNzIGZ0cCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgeW91J2QgZ2V0IHRoZQogICBmaWxlIHNpemUgdGhlIHNhbWUgd2F5LgoKICAgSSBjaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgUVVPVEUgY29tbWFuZCBleGVjdXRpb25zLiBUaGV5J3JlIG5vdyBleGVjdXRlZAogICBqdXN0IGFmdGVyIHRoZSBsb2dpbiBhbmQgYmVmb3JlIGFueSBvdGhlciBjb21tYW5kLiBJIG1hZGUgdGhpcyB0byBlbmFibGUKICAgcXVvdGUgY29tbWFuZHMgdG8gcnVuIGJlZm9yZSB0aGUgLUkgc3R1ZmYgaXMgZG9uZSB0b28uCgogLSBJIGZvdW5kIG91dCB0aGF0IC1ELy0tZHVtcC1oZWFkZXIgYW5kIC1WLy0tdmVyc2lvbiB3ZXJlbid0IGRvY3VtZW50ZWQgaW4KICAgdGhlIG1hbiBwYWdlLgoKIC0gTWFueSBIVFRQLzEuMSBzZXJ2ZXJzIGRvIG5vdCBzdXBwb3J0IHJhbmdlcy4gRG9uJ3QgYXNrIG1lIHdoeS4gSSBkaWQgYWRkCiAgIHNvbWUgdGV4dCBhYm91dCB0aGlzIGluIHRoZSBtYW4gcGFnZSBmb3IgdGhlIHJhbmdlIG9wdGlvbi4gVGhlIHRocmVhZCBpbgogICB0aGUgbWFpbGluZyBsaXN0IHRoYXQgc3RhcnRlZCB0aGlzIHdhcyBpbml0aWF0ZWQgYnkgTWljaGFlbCBBbnRpLgoKIC0gSSBnZXQgcmVwb3J0cyBhYm91dCBucm9mZiBjcmFzaGVzIG9uIHNvbGFyaXMgMi42KyB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cmwKICAgbWFuIHBhZ2UuIFN3aXRjaCB0byBnbnJvZmYgaW5zdGVhZCwgaXQgaXMgcmVwb3J0ZWQgdG8gd29yayghKS4gQWRhbSBCYXJjbGF5CiAgIHJlcG9ydGVkIGFuZCBicm91Z2h0IHRoZSBzdWdnZXN0aW9uLgoKIC0gSW4gYSBkaWFsb2d1ZSB3aXRoIEpvaGFubmVzIEcuIEtyaXN0aW5zc29uIHdlIGNhbWUKICAgdXAgd2l0aCB0aGUgaWRlYSB0byBsZXQgLUgvLS1oZWFkZXIgc3BlY2lmaWVkIGhlYWRlcnMgcmVwbGFjZSB0aGUKICAgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycywgaWYgeW91IGhhcHBlbmVkIHRvIHNlbGVjdCB0byBhZGQgYSBoZWFkZXIKICAgdGhhdCBjdXJsIG5vcm1hbGx5IHVzZXMgYnkgaXRzZWxmLiBUaGUgYWR2YW50YWdlIHdpdGggdGhpcyBpcyBub3QgZW50aXJlbHkKICAgb2J2aW91cywgYnV0IGluIEpvaGFubmVzJyBjYXNlIGl0IG1lYW5zIHRoYXQgaGUgY2FuIHVzZSBhbm90aGVyIEhvc3Q6IHRoYW4KICAgdGhlIG9uZSBjdXJsIHdvdWxkIHNldC4KCiBEYW5pZWwgKDI3IE9jdG9iZXIgMTk5OSk6CiAtIEpvbmdraSBTdXdhbmRpIGJyb3VnaHQgYSBuaWNlIHBhdGNoIGZvciAoeWV0IGFub3RoZXIpIGNyYXNoIHdoZW4gZm9sbG93aW5nCiAgIGEgbG9jYXRpb246LiBUaGlzIHRpbWUgeW91IGhhZCB0byBmb2xsb3cgYSBodHRwczovLyBzZXJ2ZXIncyByZWRpcmVjdCB0bwogICBnZXQgdGhlIGNvcmUuCgpWZXJzaW9uIDYuMgoKIERhbmllbCAoMjEgT2N0b2JlciAxOTk5KToKIC0gSSB0aGluayBJIG1hbmFnZWQgdG8gcmVtb3ZlIHRoZSBzdXNwaWNpb3VzIChuaWwpIHRoYXQgaGFzIGJlZW4gc2VlbiBqdXN0CiAgIGJlZm9yZSB0aGUgIkhvc3Q6IiBpbiBIVFRQIHJlcXVlc3RzIHdoZW4gLXYgd2FzIHVzZWQuCiAtIEkgZm91bmQgb3V0IHRoYXQgaWYgeW91IGZvbGxvd2VkIGEgbG9jYXRpb246IHdoZW4gdXNpbmcgYSBwcm94eSwgd2l0aG91dAogICBoYXZpbmcgc3BlY2lmaWVkIGh0dHA6Ly8gaW4gdGhlIFVSTCwgdGhlIHByb3RvY29sIHBhcnQgd2FzIGFkZGVkIG9uY2UgYWdhaW4KICAgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgVVJMISAoVGhlIHByb3RvY29sIHBhcnQgaGFzIHRvIGJlIGFkZGVkIHRvIHRoZQogICBVUkwgd2hlbiBnb2luZyB0aHJvdWdoIGEgcHJveHkgc2luY2UgaXQgaGFzIG5vIHByb3RvY29sLWd1ZXNzaW5nIHN5c3RlbQogICBzdWNoIGFzIGN1cmwgaGFzLikKIC0gQmVuamFtaW4gUml0Y2V5IHJlcG9ydGVkIGEgY29yZSBkdW1wIHVuZGVyIHNvbGFyaXMgMi42CiAgIHdpdGggT3BlblNTTCAwLjkuNC4gSXQgdHVybmVkIG91dCB0aGlzIHdhcyBkdWUgdG8gYSBiYWQgZnJlZSgpIGluIG1haW4uYwogICB0aGF0IG9jY3VycmVkIGFmdGVyIHRoZSBkb3dubG9hZCB3YXMgZG9uZSBhbmQgY29tcGxldGVkLgogLSBCZW5qYW1pbiBmb3VuZCBmdHAgZG93bmxvYWRzIHRvIHNob3cgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGRvd25sb2FkIG1ldGVyCiAgIHRvIGdldCB3cml0dGVuIHR3aWNlLCBhbmQgSSByZW1vdmVkIHRoYXQgcHJvYmxlbS4gSXQgd2FzIGludHJvZHVjZWQgd2l0aAogICB0aGUgbXVsdGlwbGUgVVJMIHN1cHBvcnQuCiAtIERhbiBaaXR0ZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCA2LjEgYW5kIGVhcmxpZXIgdmVyc2lvbnMgZGlkbid0CiAgIGhvbm9yIFJGQyAyNjE2IGNoYXB0ZXIgNCBzZWN0aW9uIDIsICJNZXNzYWdlIEhlYWRlcnMiOiAiLi4uRmllbGQgbmFtZXMgYXJlCiAgIGNhc2UtaW5zZW5zaXRpdmUuLi4iICBIVFRQIGhlYWRlciBwYXJzaW5nIGFzc3VtZWQgYSBjZXJ0YWluIGNhc2luZy4gRGFuCiAgIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIHRoaXMsIHdoaWNoIEkgdG9vayB0aGUgbGliZXJ0eQogICBvZiBlZGl0aW5nIHNsaWdodGx5LgogLSBEYW4gWml0dGVyIGFsc28gcHJvdmlkZWQgYSBuaWNlIHBhdGNoIGZvciBjb25maWcuZ3Vlc3MgdG8gYmV0dGVyIHJlY29nbml6ZQogICB0aGUgTWFjIE9TIFgKIC0gRGFuIGFsc28gY29ycmVjdGVkIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlIHRoYXQgY2F1c2VkIGxpbmtpbmcKICAgdG8gZmFpbCBvbiBPUyBYLgoKIERhbmllbCAoMTkgT2N0b2JlciAxOTk5KToKIC0gTGVuIE1hcmluYWNjaW8gY2FtZSB1cCB3aXRoIHNvbWUgcHJvYmxlbXMgd2l0aCBjdXJsLiAgU2luY2UgV2luZG93cyBoYXMgYQogICBjcmlwcGxlZCBzaGVsbCwgaXQgY2FuJ3QgcmVkaXJlY3Qgc3RkZXJyIGFuZCB0aGF0IGNhdXNlcyB0cm91YmxlLiBJIGFkZGVkCiAgIC0tc3RkZXJyIHRvZGF5IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byByZWRpcmVjdCB0aGUgc3RkZXJyIHN0cmVhbSB0byBhCiAgIGZpbGUgb3Igc3Rkb3V0LgoKIERhbmllbCAoMTggT2N0b2JlciAxOTk5KToKIC0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHVuZGVyc3RhbmRzIHRoZSAnLS13aXRob3V0LXNzbCcgZmxhZywgd2hpY2ggbm93CiAgIHRvdGFsbHkgZGlzYWJsZSBTU0wvaHR0cHMgc3VwcG9ydC4gUHJldmlvdXNseSBpdCB3YXNuJ3QgcG9zc2libGUgdG8gZm9yY2UKICAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gbGVhdmUgU1NMIGFsb25lLiBUaGUgcHJldmlvdXMgZnVuY3Rpb25hbGl0eSBoYXMKICAgYmVlbiByZXRhaW5lZC4gVHJveSBFbmdlbCBoZWxwZWQgdGVzdCB0aGlzIG5ldyBvbmUuCgpWZXJzaW9uIDYuMSAoT2N0b2JlciAxNyAxOTk5KQoKIERhbmllbCAoMTcgT2N0b2JlciAxOTk5KToKIC0gSSBpZmRlZidlZCBvciBjb21tZW50ZWQgYWxsIHRoZSB6bGliIHN0dWZmIGluIHRoZSBzb3VyY2VzIGFuZCBjb25maWd1cmUKICAgc2NyaXB0LiBJdCB0dXJuZWQgb3V0IHdlIG5lZWRlZCB0byBtb2NrIG1vcmUgd2l0aCB6bGliIHRoYW4gSSBpbml0aWFsbHkKICAgdGhvdWdodCwgdG8gbWFrZSBpdCBjYXBhYmxlIG9mIGRvd25sb2FkaW5nIGNvbXByZXNzZWQgSFRUUCBkb2N1bWVudHMgYW5kCiAgIHVuY29tcHJlc3MgdGhlbSBvbiB0aGUgZmx5LiBJIGRpZG4ndCBtZWFuIHRoZSB6bGliIHBhcnRzIG9mIGN1cmwgdG8gYmVjb21lCiAgIG1vcmUgdGhhbiBtaW5vciBzbyB0aGlzIG1lYW5zIEkgaGFsdCB0aGUgemxpYiBleHBlZGl0aW9uIGZvciBub3cgYW5kIHdhaXQKICAgdW50aWwgc29tZW9uZSBlaXRoZXIgd3JpdGVzIHRoZSBjb2RlIG9yIHpsaWIgZ2V0cyB1cGRhdGVkIGFuZCBiZXR0ZXIKICAgYWRqdXN0ZWQgZm9yIHRoaXMga2luZCBvZiB1c2FnZS4gIEkgd29uJ3QgZ2V0IGludG8gZGV0YWlscyBoZXJlLCBidXQgYQogICBzaG9ydCBhIHN1bW1hcnkgaXMgc3VpdGFibGU6CiAgIC0gemxpYiBjYW4ndCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRvIHVzZSB6bGliIG9yIGd6aXAKICAgICBkZWNvbXByZXNzaW9uIG1ldGhvZHMuCiAgIC0gemxpYiBpcyB2ZXJ5IG5lYXQgZm9yIHJlYWRpbmcgZ3ppcHBlZCBmaWxlcyBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLAogICAgIGFsdGhvdWdoIG5vdCBhcyBuaWNlIGZvciByZWFkaW5nIGJ1ZmZlci1iYXNlZCBkYXRhIHN1Y2ggYXMgd2Ugd291bGQKICAgICB3YW50IGl0LgogICAtIHRoZXJlIGFyZSBzdGlsbCBzb21lIHByb2JsZW1zIHdpdGggdGhlIHdpbjMyIHZlcnNpb24gd2hlbiByZWFkaW5nIGZyb20KICAgICBhIGZpbGUgZGVzY3JpcHRvciBpZiB0aGF0IGlzIGEgc29ja2V0CgogRGFuaWVsICgxNCBPY3RvYmVyIDE5OTkpOgogLSBNb3ZlZCB0aGUgKGV4dGVybmFsKSBpbmNsdWRlIGZpbGVzIGZvciBsaWJjdXJsIGludG8gYSBzdWJkaXJlY3RvcnkgbmFtZWQKICAgY3VybCBhbmQgYWRqdXN0ZWQgYWxsICNpbmNsdWRlIGxpbmVzIHRvIHVzZSA8Y3VybC9YWFhYPiB0byBtYWludGFpbiBhCiAgIGJldHRlciBuYW1lIHNwYWNlIGFuZCBjb250cm9sIG9mIHRoZSBoZWFkZXJzLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZC4KCiBEYW5pZWwgKDEyIE9jdG9iZXIgMTk5OSk6CiAtIEkgbW9kaWZpZWQgdGhlICdtYWtldGd6JyBzY3JpcHQgdG8gcGVyZm9ybSBhICdtYWtlJyB0b28gYmVmb3JlIGEgcmVsZWFzZQogICBhcmNoaXZlIGlzIHB1dCB0b2dldGhlciBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHRpbWUgc3RhbXBzIGJldHRlciBhbmQKICAgaG9wZWZ1bGx5IGF2b2lkIHRoZSBkb3VibGUgY29uZmlndXJlLXJ1bm5pbmcgdGhhdCB1c2UgdG8gb2NjdXIuCgogRGFuaWVsICgxMSBPY3RvYmVyIDE5OTkpOgogLSBBcHBsaWVkIEr2cm4ncyBwYXRjaGVzIHRoYXQgZml4ZXMgemxpYiBmb3IgbWluZ3czMiBjb21waWxlcyBhcyB3ZWxsIGFzCiAgIHNvbWUgb3RoZXIgbWlzc2luZyB6bGliICNpZmRlZiBhbmQgbW9yZSB0ZXh0IG9uIHRoZSBtdWx0aXBsZSBVUkwgZG9jcyBpbgogICB0aGUgbWFuIHBhZ2UuCgpWZXJzaW9uIDYuMWJldGEKCiBEYW5pZWwgKDYgT2N0b2JlciAxOTk5KToKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgc2VudCBtZSBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgZXhhY3Qgc2FtZSB0aGluZyBhcyBJCiAgIGp1c3QgbWFkZTogdGhlIC1kIHN3aXRjaCBpcyBub3cgY2FwYWJsZSBvZiByZWFkaW5nIHBvc3QgZGF0YSBmcm9tIGEgbmFtZWQKICAgZmlsZSBvciBzdGRpbi4gIFVzZSBpdCBzaW1pbGFybHkgdG8gdGhlIC1GLiBUbyByZWFkIHRoZSBwb3N0IGRhdGEgZnJvbSBhCiAgIGdpdmVuIGZpbGU6CgogICAgICAgIGN1cmwgLWQgQHBhdGgvdG8vZmlsZW5hbWUgd3d3LnBvc3RzaXRlLmNvbQoKICAgb3IgbGV0IGN1cmwgcmVhZCBpdCBvdXQgZnJvbSBzdGRpbjoKCiAgICAgICAgY3VybCAtZCBALSB3d3cucG9zdGl0LmNvbQoKIEr2cm4gSGFydHJvdGggKDMgT2N0b2JlciAxOTk5KToKIC0gQnJvdWdodCBzb21lIG1vcmUgcGF0Y2hlcyBmb3IgbXVsdGlwbGUgVVJMIGZ1bmN0aW9uYWxpdHkuIFRoZSBNSU1FCiAgIHNlcGFyYXRpb24gaWRlYXMgYXJlIGFsbW9zdCBzY3JhcHBlZCBub3csIGFuZCBhIGN1c3RvbSBzZXBhcmF0b3IgaXMgYmVpbmcKICAgdXNlZCBpbnN0ZWFkLiBUaGlzIGlzIHN0aWxsIGNvbXBpbGUtdGltZSAiZmxhZ2dlZCIuCgogRGFuaWVsCiAtIFVwZGF0ZWQgY3VybC4xIHdpdGggbXVsdGlwbGUgVVJMIGluZm8uCgogRGFuaWVsICgzMCBTZXB0ZW1iZXIgMTk5OSk6CiAtIEZlbGl4IHZvbiBMZWl0bmVyIGJyb3VnaHQgb3BlbnNzbC1jaGVjayBmaXhlcyBmb3IgY29uZmlndXJlLmluIHRvIHdvcmsKICAgb3V0LW9mLXRoZS1ib3ggd2hlbiB0aGUgb3BlbnNzbCBmaWxlcyBhcmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gZGVmYXVsdAogICBkaXJzLgoKIERhbmllbCAoMjggU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIGxpYnogZnVuY3Rpb25hbGl0eS4gVGhpcyBzaG91bGQgZW5hYmxlIGRlY29tcHJlc3NpbmcgZ3ppcCwgY29tcHJlc3MKICAgb3IgZGVmbGF0ZSBlbmNvZGluZyBIVFRQIGRvY3VtZW50cy4gSXQgYWxzbyBtYWtlcyBjdXJsIHNlbmQgYW4gYWNjZXB0IHRoYXQKICAgaXQgYWNjZXB0cyB0aGF0IGtpbmQgb2YgZW5jb2RpbmcuIENvbXByZXNzZWQgY29udGVudHMgdXN1YWxseSBzaG9ydGVucwogICBkb3dubG9hZCB0aW1lLiBJICpuZWVkKiBzb21lb25lIHRvIHRlbGwgbWUgYSBzaXRlIHRoYXQgdXNlcyBjb21wcmVzc2VkIEhUVFAKICAgZG9jdW1lbnRzIHNvIHRoYXQgSSBjYW4gdGVzdCB0aGlzIG91dCBwcm9wZXJseS4KCiAtIEFzIGEgcmVzdWx0IG9mIHRoZSBhZGRpbmcgb2YgemxpYiBhd2FyZW5lc3MsIEkgY2hhbmdlZCB0aGUgdmVyc2lvbiBzdHJpbmcKICAgYSBsaXR0bGUuIEkgcGxhbiB0byBhZGQgb3BlbmxkYXAgdmVyc2lvbiByZXBvcnRpbmcgaW4gdGhlcmUgdG9vLgoKIERhbmllbCAoMTcgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgdGhlIC1GIG9wdGlvbiBhbGxvdyBzdGRpbiB3aGVuIHNwZWNpZnlpbmcgZmlsZXMuIEJ5IHVzaW5nICctJyBpbnN0ZWFkCiAgIG9mIGZpbGUgbmFtZSwgdGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gc3RkaW4uCgpWZXJzaW9uIDYuMCAoU2VwdGVtYmVyIDE0IDE5OTkpCgogRGFuaWVsICgxMyBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgLVgvLS1odHRwLXJlcXVlc3QgPHJlcXVlc3Q+IHRvIGVuYWJsZSBhbnkgSFRUUCBjb21tYW5kIHRvIGJlIHNlbnQuCiAgIERvIG5vdCB0aGF0IHlvdXIgc2VydmVyIGhhcyB0byBzdXBwb3J0IHRoZSBleGFjdCBzdHJpbmcgeW91IGVudGVyLiBUaGlzCiAgIHNob3VsZCBwb3NzaWJseSBhIHN0cmluZyBsaWtlIERFTEVURSBvciBUUkFDRS4KCiAtIEFwcGxpZWQgRG91Z2xhcycgbWluZ3czMi1maXhlcyBmb3IgdGhlIG1ha2VmaWxlcy4KCiBEYW5pZWwgKDEwIFNlcHRlbWJlciAxOTk5KQogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBwb2ludGVkIG91dCBhIHByb2JsZW0uIEN1cmwgZGlkbid0IGNoZWNrIHRoZSBGVFAKICAgc2VydmVycyByZXR1cm4gY29kZSBwcm9wZXJseSBhZnRlciB0aGUgLS1xdW90ZSBjb21tYW5kcyB3ZXJlIGlzc3VlZC4gSXQKICAgdG9vayBhbnl0aGluZyBub24gMjAwIGFzIGFuIGVycm9yLCB3aGVuIGFsbCAyWFggY29kZXMgc2hvdWxkIGJlIGFjY2VwdGVkIGFzCiAgIE9LLgoKIC0gU2VuZGluZyBjb29raWVzIHRvIHRoZSBzYW1lIHNpdGUgaW4gbXVsdGlwbGUgbGluZXMgbGlrZSBjdXJsIHVzZWQgdG8gZG8KICAgdHVybmVkIG91dCB0byBiZSBiYWQgYW5kIGJyZWFraW5nIHRoZSBjb29raWUgc3BlY3MuIEN1cmwgbm93IHNlbmRzIGFsbAogICBjb29raWVzIG9uIGEgc2luZ2xlIENvb2tpZTogbGluZS4gQ3VybCBpcyBub3QgeWV0IFJGQyAyMTA5IGNvbXBsaWFudCwgYnV0IEkKICAgZG91YnQgdGhhdCBtYW55IHNlcnZlcnMgZG8gdXNlIHRoYXQgc3ludGF4ICh5ZXQpLgoKIERhbmllbCAoOCBTZXB0ZW1iZXIgMTk5OSkKIC0gSvZybiBoZWxwZWQgbWUgbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIG5pY2VseSB3aXRoIG1pbmd3MzIgdW5kZXIgd2luMzIuCgogRGFuaWVsICg3IFNlcHRlbWJlciAxOTk5KQogLSBGVFAgdXBsb2FkIHRocm91Z2ggcHJveHkgaXMgbm93IHR1cm5lZCBpbnRvIGEgSFRUUCBQVVQuIFJlcXVlc3RlZCBieQogICBTdGVmYW4gS2FudGhhay4KCiAtIEFkZGVkIHRoZSBsZGFwIGZpbGVzIHRvIHRoZSAubTMyIG1ha2VmaWxlLgoKIERhbmllbCAoMyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSBjb29raWUgbWF0Y2hpbmcgd29yayB3aGlsZSB1c2luZyBIVFRQIHByb3h5LgoKIEJqb3JuIFJlZXNlICgzMSBBdWd1c3QgMTk5OSkKIC0gUGFzc2VkIGhpcyBsZGFwOi8vIHBhdGNoLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgb3BlbmxkYXAgc2hhcmVkCiAgIGxpYnJhcnkgdG8gYmUgaW5zdGFsbGVkIGFuZCB0aGF0IExEX0xJQlJBUllfUEFUSCBwb2ludHMgdG8gdGhlCiAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliIHdpbGwgYmUgZm91bmQgd2hlbiBjdXJsIGlzIHJ1biB3aXRoIGEKICAgbGRhcDovLyBVUkwuCgogSvZybiBIYXJ0cm90aCAoMzEgQXVndXN0IDE5OTkpCiAtIE1hZGUgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGludG8gc2luZ2xlIGZpbGVzLgogLSBNYWRlIGZpbGU6Ly8gd29yayBmb3IgV2luMzIuIFRoZSBzYW1lIGNvZGUgaXMgbm93IHVzZWQgZm9yIHVuaXggYXMgd2VsbCBmb3IKICAgcGVyZm9ybWFuY2UgcmVhc29ucy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoMzAgQXVndXN0IDE5OTkpCiAtIFBhdGNoZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGZvciBTU0wgYnVpbGRzLgoKIE1hdHRoZXcgQ2xhcmtlICgzMCBBdWd1c3QgMTk5OSkKIC0gTWFkZSBhIGNvb2wgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyAtLXdpdGgtc3NsIHRvIHNwZWNpZnkgdGhlCiAgIHJvb3QgZGlyIG9mIHRoZSBvcGVuc3NsIGluc3RhbGxhdGlvbiwgYXMgaW4KCiAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vdXNyL3NzbF9oZXJlCgogLSBDb3JyZWN0ZWQgdGhlICdyZWNvbmYnIHNjcmlwdCB0byB3b3JrIGJldHRlciB3aXRoIHNvbWUgc2hlbGxzLgoKIEr2cm4gSGFydHJvdGggKDI2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW4gbGliLyBhbmQgY29ycmVjdGVkIHRoZSBmaWxlLmMgZm9yIHdpbjMyCiAgIGNvbXBpbGVzLgoKVmVyc2lvbiA1LjExCgogRGFuaWVsICgyNSBBdWd1c3QgMTk5OSkKIC0gSm9obiBXZWlzbWlsbGVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSBoZWFkZXItbGluZQogICByZWFsbG9jKCkgc3lzdGVtIGluIGRvd25sb2FkLmMuCgogLSBJIGFkZGVkIGxpYi9maWxlLltjaF0gdG8gb2ZmZXIgYSBmaXJzdCwgc2ltcGxlLCBmaWxlOi8vIHN1cHBvcnQuIEl0CiAgIHByb2JhYmx5IHdvbid0IGRvIG11Y2ggZ29vZCBvbiB3aW4zMiBzeXN0ZW0gYXQgdGhpcyBwb2ludCwgYnV0IEkgc2VlIGl0CiAgIGFzIGEgc3RhcnQuCgogLSBNYWRlIHRoZSByZWxlYXNlIGFyY2hpdmVzIGdldCBhIE1ha2VmaWxlIGluIHRoZSByb290IGRpciwgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gc3RhcnQgdGhlIGNvbXBpbGluZy9idWlsZGluZyBwcm9jZXNzIGVhc2llci4gSSBoYXZlbid0IHJlYWxseQogICBjaGFuZ2VkIGFueSBJTlNUQUxMIHRleHQgeWV0LCBJIHdhbnRlZCB0byBnZXQgc29tZSBmZWVkLWJhY2sgb24gdGhpcwogICBmaXJzdC4KCiBEYW5pZWwgKDE3IEF1Z3VzdCAxOTk5KQogLSBBbm90aGVyIExvY2F0aW9uOiBidWcuIEN1cmwgZGlkbid0IGRvIHByb3BlciByZWxhdGl2ZSBsb2NhdGlvbnMgaWYgdGhlCiAgIG9yaWdpbmFsIFVSTCBoYWQgY2dpLXBhcmFtZXRlcnMgdGhhdCBjb250YWluZWQgYSBzbGFzaC4gTnVzdSdzIHBhZ2UKICAgYWdhaW4uCgogLSBDb3JyZWN0ZWQgdGhlIE5PX1BST1hZIHVzYWdlLiBJdCBpcyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncyB0aGF0IGlmIG9uZSBvZgogICB0aGVtIG1hdGNoZXMgdGhlIHRhaWwgb2YgdGhlIGhvc3QgbmFtZSBpdCBzaG91bGQgY29ubmVjdCB0bywgY3VybCBzaG91bGQKICAgbm90IHVzZSBhIHByb3h5IHRvIGNvbm5lY3QgdGhlcmUuIFBvaW50ZWQgb3V0IHRvIG1lIGJ5IERvdWdsYXMKICAgRS4gV2Vnc2NoZWlkLiAgSSBhbHNvIGNoYW5nZWQgdGhlIFJFQURNRSB0ZXh0IGEgbGl0dGxlIHJlZ2FyZGluZyB0aGlzLgoKIERhbmllbCAoMTYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIGEgbWVtb3J5IGJ1ZyB3aXRoIGh0dHAtc2VydmVycyB0aGF0IHNlbnQgTG9jYXRpb246IHRvIGEgTG9jYXRpb246CiAgIHBhZ2UuIE51c3UncyBwYWdlIHNob3dlZCB0aGlzIHRvby4KCiAtIE1hZGUgY29va2llcyB3b3JrIGEgbG90IGJldHRlci4gU2V0dGluZyB0aGUgc2FtZSBjb29raWUgbmFtZSBzZXZlcmFsIHRpbWVzCiAgIHVzZWQgdG8gYWRkIG1vcmUgY29va2llcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGUgZm9ybWVyIG9uZSB3aGljaCBpdAogICBzaG91bGQndmUuIE51c3UgPG51cyBhdCBpbnRlcmdvcmoucm8+IGJyb3VnaHQgbWUgYW4gVVJMIHRoYXQgbWFkZSB0aGlzCiAgIHBhaW5mdWxseSB2aXNpYmxlLi4uCgogVHJveSAoMTUgQXVndXN0IDE5OTkpCiAtIEJyb3VnaHQgbmV3IC5zcGVjIGZpbGVzIGFzIHdlbGwgYXMgYSBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRoYXQgbGV0cyB0aGUKICAgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGZpbGVzIGJldHRlciwgZXZlbiB3aGVuIHRoZSBpbmNsdWRlCiAgIGZpbGVzIGFyZSBpbiAvdXNyL2luY2x1ZGUvb3BlbnNzbAoKVmVyc2lvbiA1LjEwCgogRGFuaWVsICgxMyBBdWd1c3QgMTk5OSkKIC0gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoKSBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgMC45LjQgdmVyc2lvbiBvZgogICBPcGVuU1NMLiBOb3cgd2h5IGNvdWxkbid0IHRoZXkgc2ltcGx5IGFkZCBhICpuZXcqIGZ1bmN0aW9uIGluc3RlYWQgb2YKICAgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24/IFRoaXMgd2F5LCB3ZSBnZXQKICAgYSBjb21waWxlciB3YXJuaW5nIGlmIGNvbXBpbGluZyB3aXRoIDAuOS40IGJ1dCBub3Qgd2l0aCBlYXJsaWVyLiBTbywgSSBoYWQKICAgdG8gY29tZSB1cCB3aXRoIGEgI2lmIGNvbnN0cnVjdGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4uLgoKIC0gTWFkZSBjdXJsIG91dHB1dCB0aGUgU1NMIHZlcnNpb24gbnVtYmVyIGdldCBkaXNwbGF5ZWQgcHJvcGVybHkgd2l0aCAwLjkuNC4KCiBUcm95ICgxMiBBdWd1c3QgMTk5OSkKIC0gQWRkZWQgTWluZ1czMiAoR0NDLTIuOTUpIHN1cHBvcnQgdW5kZXIgV2luMzIuIFRoZSBJTlNUQUxMIGZpbGUgd2FzIGFsc28KICAgYSBiaXQgcmVhcnJhbmdlZC4KCiBEYW5pZWwgKDEyIEF1Z3VzdCAxOTk5KQogLSBJIGhhZCB0byBjb3B5IGEgZ29vZCA8YXJwYS90ZWxuZXQuaD4gaW5jbHVkZSBmaWxlIGludG8gdGhlIGN1cmwgc291cmNlCiAgIHRyZWUgdG8gZW5hYmxlIHRoZSBzaWxseSB3aW4zMiBzeXN0ZW1zIHRvIGNvbXBpbGUuIFRoZSBkaXN0cmlidXRpb24gcmlnaHRzCiAgIGFsbG93cyB1cyB0byBkbyB0aGF0IGFzIGxvbmcgYXMgdGhlIGZpbGUgcmVtYWlucyB1bm1vZGlmaWVkLgoKIC0gSSBjb3JyZWN0ZWQgYSBmZXcgbWlub3IgdGhpbmdzIHRoYXQgbWFkZSB0aGUgY29tcGlsZXIgY29tcGxhaW4gd2hlbgogICAtV2FsbCAtcGVkYW50aWMgd2FzIHVzZWQuCgogLSBJJ20gbW92aW5nIHRoZSBvZmZpY2lhbCBjdXJsIHdlYiBwYWdlIHRvIGh0dHA6Ly9jdXJsLmhheHgubnUuIEkgdGhpbmsgaXQKICAgd2lsbCBtYWtlIGl0IGVhc2llciB0byByZW1lbWJlciBhcyBpdCBpcyBhIGxvdCBzaG9ydGVyIGFuZCBsZXNzIGNyeXB0aWMuCiAgIFRoZSBvbGQgb25lIHN0aWxsIHdvcmtzIGFuZCBzaG93cyB0aGUgc2FtZSBpbmZvLgoKIERhbmllbCAoMTEgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgbWFpbGVkIG1lIGFub3RoZXIgY29ycmVjdGlvbiBmb3IgTlJPRkYgaW4gdGhlCiAgIGNvbmZpZ3VyZS5pbiB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIGJldHRlciBmb3IgSVJJWCB1c2Vycy4KCiBEYW5pZWwgKDEwIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGhlbHBlZCBtZSB3aXRoIHNvbWUgc3R1cGlkIE1ha2VmaWxlIHRoaW5ncywgYXMgd2VsbCBhcwogICBzb21lIGZpZGRsaW5nIHdpdGggdGhlIGdldGRhdGUuYyBzdHVmZiB0aGF0IGhlIGhhZCBwcm9ibGVtcyB3aXRoIHVuZGVyCiAgIEhQLVVYIHYxMC4gZ2V0ZGF0ZS55IHdpbGwgbm93IGJlIGNvbXBpbGVkIGludG8gZ2V0ZGF0ZS5jIGlmIHRoZSBhcHByb3ByaWF0ZQogICB5YWNjIG9yIGJpc29uIGlzIGZvdW5kIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LiBTaW5jZSB0aGlzIGlzIHNsaWdodGx5IG5ldywKICAgd2UgbmVlZCB0byB0ZXN0IHRoZSBvdXRwdXQgZ2V0ZGF0ZS5jIHdpdGggd2luMzIgc3lzdGVtcyB0byBtYWtlIHN1cmUgaXQKICAgc3RpbGwgY29tcGlsZXMgdGhlcmUuCgogRGFuaWVsICg1IEF1Z3VzdCAxOTk5KQogLSBJJ3ZlIGp1c3Qgc2V0dXAgYSBuZXcgbWFpbGluZyBsaXN0IHdpdGggdGhlIGludGVudGlvbiB0byBrZWVwIGRpc2N1c3Npb25zCiAgIGFyb3VuZCBsaWJjdXJsIGRldmVsb3BtZW50IGluIGl0LiBJIG1haW5seSBleHBlY3QgaXQgdG8gYmUgZm9yIHRob3VnaHRzIGFuZAogICBicmFpbnN0b3JtaW5nIGFyb3VuZCBhICJuZXh0IGdlbmVyYXRpb24iIGxpYnJhcnksIHJhdGhlciB0aGFuIG5pdHBpY2tpbmcKICAgYWJvdXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb3IgZGV0YWlscyBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgoKICAgVG8gam9pbiBvdXIgaGFwcHkgYnVuY2ggb2YgZnV0dXJlLWxvb2tpbmcgZ2Vla3MsIGVudGVyICdzdWJzY3JpYmUKICAgPGFkZHJlc3M+JyBpbiB0aGUgYm9keSBvZiBhIG1haWwgYW5kIHNlbmQgaXQgdG8KICAgbGliY3VybC1yZXF1ZXN0QGxpc3RzZXJ2LmZ0cy5mcm9udGVjLnNlLiAgQ3VybCBidWcgcmVwb3J0cywgdGhlIHVzdWFsIGN1cmwKICAgdGFsayBhbmQgZXZlcnl0aGluZyBlbHNlIHNob3VsZCBzdGlsbCBiZSBrZXB0IGluIHRoaXMgbWFpbGluZyBsaXN0LiBJJ3ZlCiAgIHN0YXJ0ZWQgdG8gYXJjaGl2ZSB0aGlzIG1haWxpbmcgbGlzdCBhbmQgaGF2ZSBwdXQgdGhlIGxpYmN1cmwgd2ViIHBhZ2UgYXQKICAgd3d3LmZ0cy5mcm9udGVjLnNlL35kYXN0L2xpYmN1cmwvLgoKIC0gU3RlZmFuIEthbnRoYWsgY29udGFjdGVkIG1lIHJlZ2FyZGluZyBhIGZldyBwcm9ibGVtcyBpbiB0aGUgY29uZmlndXJlCiAgIHNjcmlwdCB3aGljaCBoZSBkaXNjb3ZlcmVkIHdoZW4gdHJ5aW5nIHRvIG1ha2UgY3VybCBjb21waWxlIGFuZCBidWlsZCB1bmRlcgogICBTaWVtZW5zIFNJTklYLVogVjUuNDJCMjAwNCEKCiAtIE1hcmN1cyBLbGVpbiB2ZXJ5IGFjY3VyYXRlbHkgaW5mb3JtZWQgbWUgdGhhdCBzcmMvdmVyc2lvbi5oIHdhcyBub3QgcHJlc2VudAogICBpbiB0aGUgQ1ZTIHJlcG9zaXRvcnkuIE9oLCBob3cgc2lsbHkuLi4KCiAtIExpbnVzIE5pZWxzZW4gcmV3cm90ZSB0aGUgdGVsbmV0Oi8vIHBhcnQgYW5kIG5vdyBjdXJsIG9mZmVycyBsaW1pdGVkIHRlbG5ldAogICBzdXBwb3J0LiBJZiB5b3UgcnVuIGN1cmwgbGlrZSAnY3VybCB0ZWxuZXQ6Ly9ob3N0JyB5b3UnbGwgZ2V0IGFsbCBvdXRwdXQgb24KICAgdGhlIHNjcmVlbiBhbmQgY3VybCB3aWxsIHJlYWQgaW5wdXQgZnJvbSBzdGRpbi4gWW91J2xsIGJlIGFibGUgdG8gbG9naW4gYW5kCiAgIHJ1biBjb21tYW5kcyBldGMsIGJ1dCBzaW5jZSB0aGUgb3V0cHV0IGlzIGJ1ZmZlcmVkLCBleHBlY3QgdG8gZ2V0IGEgbGl0dGxlCiAgIHdlaXJkIG91dHB1dC4KCiAgIFRoaXMgaXMgc3RpbGwgaW4gaXRzIGluZmFuY3kgYW5kIGl0IG1pZ2h0IGdldCBjaGFuZ2VkLiBXZSBuZWVkIHlvdXIKICAgZmVlZC1iYWNrIGFuZCBpbnB1dCBpbiBob3cgdGhpcyBpcyBiZXN0IGRvbmUuCgogICBXSU4zMiBOT1RFOiBJIGJldCB3ZSdsbCBnZXQgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgY3VycmVudAogICBsaWIvdGVsbmV0LmMgb24gd2luMzIsIGJ1dCBJIHRoaW5rIHdlIGNhbiBzb3J0IHRoZW0gb3V0IGluIHRpbWUuCgogLSBEYXZpZCBTYW5kZXJzb24gcmVwb3J0ZWQgdGhhdCBGT1JDRV9BTExPQ0FfSCBvciBIQVZFX0FMTE9DQV9IIG11c3QgYmUKICAgZGVmaW5lZCBmb3IgZ2V0ZGF0ZS5jIHRvIGNvbXBpbGUgcHJvcGVybHkgb24gSFAtVVggMTEuMC4gSSB1cGRhdGVkIHRoZQogICBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBhbGxvY2EuaCB3aGljaCBzaG91bGQgbWFrZSBpdC4KCiBEYW5pZWwgKDQgQXVndXN0IDE5OTkpCiAtIEkgZmluYWxseSBnb3QgdG8gdW5kZXJzdGFuZCBNYXJjdXMgS2xlaW4ncyBmdHAgZG93bmxvYWQgcmVzdW1lIHByb2JsZW0sCiAgIHdoaWNoIHR1cm5zIG91dCB0byBiZSBkdWUgdG8gZGlmZmVyZW50IG91dHB1dHMgZnJvbSBkaWZmZXJlbnQgZnRwCiAgIHNlcnZlcnMuIEl0IG1ha2VzIGZ0cCBkb3dubG9hZCByZXN1bWluZyBhIGxpdHRsZSB0cmlja2llciwgYnV0IEkndmUgbWFkZQogICBzb21lIG1vZGlmaWNhdGlvbnMgSSByZWFsbHkgYmVsaWV2ZSB3aWxsIHdvcmsgZm9yIG1vc3QgZnRwIHNlcnZlcnMgYW5kIEkgZG8KICAgaG9wZSB5b3UgcmVwb3J0IGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhpcyEKCiAtIEFkZGVkIHRleHQgYWJvdXQgZmlsZSB0cmFuc2ZlciByZXN1bWluZyB0byBSRUFETUUuY3VybC4KCiBEYW5pZWwgKDIgQXVndXN0IDE5OTkpCiAtIEFwcGxpZWQgYSBwcm9ncmVzcy1iYXIgcGF0Y2ggZnJvbSBMYXJzIEouIEFhcy4gSXQgb2ZmZXJzCiAgIGEgbmV3IHN0eWxlZCBwcm9ncmVzcyBiYXIgZW5hYmxlZCB3aXRoIC0jLy0tcHJvZ3Jlc3MtYmFyLgoKIFQuIFlhbWFkYSA8dGFpIGF0IGltYXN5Lm9yLmpwPiAoMzAgSnVseSAxOTk5KQogLSBJdCBicmVha3Mgd2l0aCBzZWdmYXVsdCB3aGVuIDEpIGN1cmwgaXMgdXNpbmcgLm5ldHJjIHRvIG9idGFpbgogICB1c2VybmFtZS9wYXNzd29yZCAob3B0aW9uICctbicpLCBhbmQgMikgaXMgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHRvCiAgIGFub3RoZXIgbG9jYXRpb24gKG9wdGlvbiAnLUwnKS4KCiAgIFRoZXJlIGlzIGEgc21hbGwgYnVnIGluIGxpYi91cmwuYyAoYmxvY2sgc3RhcnRpbmcgZnJvbSBsaW5lIDY0MSksIHdoaWNoCiAgIHRyaWVzIHRvIHRha2Ugb3V0IHVzZXJuYW1lL3Bhc3N3b3JkIGZyb20gdXNlci0gc3VwcGxpZWQgY29tbWFuZC1saW5lCiAgIGFyZ3VtZW50ICgnLXUnIG9wdGlvbikuIFRoaXMgYmxvY2sgaXMgbmV2ZXIgZXhlY3V0ZWQgb24gZmlyc3QgYXR0ZW1wdCBzaW5jZQogICBDT05GX1VTRVJQV0QgYml0IGlzbid0IHNldCBhdCBmaXJzdCwgYnV0IGN1cmwgbGF0ZXIgdHVybnMgaXQgb24gd2hlbiBpdAogICBjaGVja3MgZm9yIENPTkZfTkVUUkMgYml0LiBTbyB3aGVuIGN1cmwgdHJpZXMgdG8gcmVkbyBldmVyeXRoaW5nIGR1ZSB0bwogICByZWRpcmVjdGlvbiwgaXQgc2VnZmF1bHRzIHRyeWluZyB0byBhY2Nlc3MgKmRhdGEtPnVzZXJwd2QuCgpWZXJzaW9uIDUuOS4xCgogRGFuaWVsICgzMCBKdWx5IDE5OTkpCiAtIFN0ZXZlIFdhbGNoIHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhayBpbiB0aGUgZm9ybWRhdGEKICAgZnVuY3Rpb25zLiBJIGFkZGVkIGEgRm9ybUZyZWUoKSBmdW5jdGlvbiB0aGF0IGlzIG5vdyB1c2VkIGFuZCBzdXBwb3NlZCB0bwogICBjb3JyZWN0IHRoaXMgZmxhdy4KCiAtIE1hcmsgV290dG9uIHJlcG9ydGVkOgogICAnY3VybCAtTCBodHRwczovL3d3dy5jd2EuY29tLmF1LycgY29yZSBkdW1wcy4gIEkgbWFuYWdlZCB0byBjdXJlIHRoaXMgYnkKICAgY29ycmVjdGluZyB0aGUgY2xlYW51cCBwcm9jZWR1cmUuIFRoZSBidWcgc2VlbXMgdG8gYmUgZ29uZSB3aXRoIG15IE9wZW5TU0wKICAgMC45LjJiLCBhbHRob3VnaCBzdGlsbCBvY2N1cnMgd2hlbiBJIHJ1biB0aGUgfjEwMCB5ZWFycyBvbGQgU1NMZWF5IDAuOC4wLiBJCiAgIGRvbid0IGtub3cgd2hldGhlciBpdCBpcyBjdXJsIG9yIFNTTGVheSB0aGF0IGlzIHRvIGJsYW1lIGZvciB0aGF0LgoKIC0gTWFyY3VzIEtsZWluOgogICBSZXBvcnRlZCBhbiBGVFAgdXBsb2FkIHJlc3VtZSBidWcgdGhhdCBJIHJlYWxseSBjYW4ndCByZXBlYXQgbm9yIHVuZGVyc3RhbmQuCiAgIEkgbGVhdmUgaXQgaGVyZSBzbyB0aGF0IGl0IHdvbid0IGJlIGZvcmdvdHRlbi4KCiBEYW5pZWwgKDI5IEp1bHkgMTk5OSkKIC0gQ29zdHlhIFNodWx5dXBpbiBzdWdnZXN0ZWQgc3VwcG9ydCBmb3IgbG9uZ2VyIFVSTHMgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgIGFuZCBJIGNvdWxkIG9ubHkgYWdyZWUgYW5kIGZpeCBpdCEKCiAtIExlaWdoIFB1cmRpZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIHVwbG9hZC9QT1NUIGRlcGFydG1lbnQuIEl0IHR1cm5lZCBvdXQKICAgdGhhdCBodHRwLmMgYWNjaWRlbnRhbHkgY2xlYXJlZCB0aGUgcG9pbnRlciBpbnN0ZWFkIG9mIHRoZSBieXRlIGNvdW50ZXIKICAgd2hlbiBzdXBwb3NlZCB0by4KCiAtIENvc3R5YSBTaHVseXVwaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcG9ydCBudW1iZXJzIGFuZCBMb2NhdGlvbjouIElmCiAgIHlvdSBoYWQgYSBzZXJ2ZXIgYXQgYSBub24tc3RhbmRhcmQgcG9ydCB0aGF0IHJlZGlyZWN0ZWQgdG8gYW4gVVJMIHVzaW5nIGEKICAgc3RhbmRhcmQgcG9ydCBudW1iZXIsIGN1cmwgc3RpbGwgdXNlZCB0aGF0IGZpcnN0IHBvcnQgbnVtYmVyLgoKIC0gUmFscGggQmVja21hbm4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYm90aCBDT05GX0ZPTExPV0xPQ0FUSU9OCiAgIGFuZCBDT05GX0ZBSUxPTkVSUk9SIHNpbXVsdGFuZW91c2x5LiBTaW5jZSB0aGUgQ09ORl9GQUlMT05FUlJPUiBleGl0cyBvbgogICB0aGUgMzAyLWNvZGUgdGhhdCB0aGUgZm9sbG93IGxvY2F0aW9uIGhlYWRlciBvdXRwdXRzIGl0IHdpbGwgbmV2ZXIgc2hvdyBhbnkKICAgaHRtbCBvbiBsb2NhdGlvbjogcGFnZXMuIEkgaGF2ZSBub3cgbWFkZSBpdCBsb29rIGZvciA+PTQwMCBjb2RlcyBpZgogICBDT05GX0ZPTExPV0xPQ0FUSU9OIGlzIHNldC4KCiAtICdzdHJ1Y3Qgc2xpc3QnIGlzIG5vdyByZW5hbWVkIHRvICdzdHJ1Y3QgY3VybF9zbGlzdCcgKGFzIHN1Z2dlc3RlZCBieSBSYWxwaAogICBCZWNrbWFubikuCgogLSBKb3NodWEgU3dpbmsgYW5kIFJpY2sgV2VseWtvY2h5IHdlcmUgdGhlIGZpcnN0IHRvIHBvaW50IG91dCB0byBtZSB0aGF0IHRoZQogICBsYXRlc3QgT3BlblNTTCBwYWNrYWdlIG5vdyBoYXZlIG1vdmVkIHRoZSBzdGFuZGFyZCBpbmNsdWRlIHBhdGguIEl0IGlzIG5vdwogICBpbiAvdXNyL2xvY2FsL3NzbC9pbmNsdWRlL29wZW5zc2wgYW5kIEkgaGF2ZSBub3cgbW9kaWZpZWQgdGhlIC0tZW5hYmxlLXNzbAogICBvcHRpb24gZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSB0aGF0IGFzIHRoZSBwcmltYXJ5IHBhdGgsIGFuZCBJCiAgIGxlYXZlIHRoZSBmb3JtZXIgcGF0aCB0b28gdG8gd29yayB3aXRoIG9sZGVyIHBhY2thZ2VzIG9mIE9wZW5TU0wgdG9vLgoKIERhbmllbCAoOSBKdW5lIDE5OTkpCiAtIEkgZmluYWxseSB1bmRlcnN0b29kIHRoZSBJUklYIHByb2JsZW0gYW5kIG5vdyBpdCBzZWVtIHRvIGNvbXBpbGUgb24gaXQhCiAgIEkgYW0gZ29ubmEgcmVtb3ZlIHRob3NlICNkZWZpbmUgc3RyY2FzZWNtcCgpIHRoaW5ncyBvbmNlIGFuZCBmb3IgYWxsIG5vdy4KCiBEYW5pZWwgKDQgSnVuZSAxOTk5KQogLSBJIGFkanVzdGVkIHRoZSBGVFAgcmVwbHkgMjI3IHBhcnNlciB0byBtYWtlIHRoZSBQQVNWIGNvbW1hbmQgd29yayBiZXR0ZXIKICAgd2l0aCBtb3JlIGZ0cCBzZXJ2ZXJzLiBBcHBlYXJhbnRseSB0aGUgUm94ZW4gQ2hhbGxhbmdlciBzZXJ2ZXIgcmVwbGllZAogICBzb21ldGhpbmcgY3VybCA1LjkgY291bGQgZGVhbCB3aXRoISA6LSggUmVwb3J0ZWQgYnkgQXNobGV5IFJlaWQtTW9udGFuYXJvCiAgIGFuZCBNYXJrIEJ1dGxlciBicm91Z2h0IGEgc29sdXRpb24gZm9yIGl0LgoKIERhbmllbCAoMjYgTWF5IDE5OTkpCiAtIFJlYXJyYW5nZWQuIFJFQURNRSBpcyBuZXcsIHRoZSBvbGQgb25lIGlzIG5vdyBSRUFETUUuY3VybCBhbmQgSSBhZGRlZCBhCiAgIFJFQURNRS5saWJjdXJsIHdpdGggdGV4dCBJIGdvdCBmcm9tIFJhbHBoIEJlY2ttYW5uLgoKIC0gSSBhbHNvIHVwZGF0ZWQgdGhlIElOU1RBTEwgdGV4dC4KCiBEYW5pZWwgKDI1IE1heSAxOTk5KQogLSBEYXZpZCBKb25hdGhhbiBMb3dza3kgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCBkaWRuJ3QgcHJvcGVybHkgZGVhbAogICB3aXRoIGZvcm0gcG9zdGluZyB3aGVyZSB0aGUgdmFyaWFibGUgc2hvdWxkbid0IGhhdmUgYW55IGNvbnRlbnQsIGFzIGluIGN1cmwKICAgLUYgImZvcm09IiB3d3cuc2l0ZS5jb20uIEl0IHdhcyBub3cgZml4ZWQuCgpWZXJzaW9uIDUuOSAoTWF5IDIyIDE5OTkpCgogRGFuaWVsICgyMiBNYXkgMTk5OSkKIC0gSSd2ZSBnb3QgYSBidWcgcmVwb3J0IGZyb20gQWFyb24gU2NhcmlzYnJpY2sgaW4gd2hpY2ggaGUgc3RhdGVzIGhlIGhhcyBzb21lCiAgIHByb2JsZW1zIHdpdGggLUwgdW5kZXIgRnJlZUJTRCAzLjAuIEkgaGF2ZSBwcmV2aW91c2x5IGdvdCBhbm90aGVyIGJ1ZwogICByZXBvcnQgZnJvbSBTdGVmYW4gR3JldGhlciB3aGljaCBwb2ludHMgYXQgYW4gZXJyb3Igd2l0aCBzaW1pbGFyIHN5bXB0aG9tcwogICB3aGVuIHVzaW5nIHdpbjMyLiBJIG1hZGUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyB1cmwgc3RyaW5nIGEgYml0IGZhc3RlcgogICBhbmQgZGlmZmVyZW50LCBkb24ndCBrbm93IGlmIGl0IGFjdHVhbGx5IGltcHJvdmVzIGFueXRoaW5nIHRob3VnaC4uLgoKIERhbmllbCAoMjAgTWF5IDE5OTkpCiAtIE1hZGUgdGhlIGNvb2tpZSBwYXJzZXIgZGVhbCB3aXRoIENSTEYgbmV3bGluZXMgdG9vLgoKIERhbmllbCAoMTkgTWF5IDE5OTkpCiAtIERvd25sb2FkKCkgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmYWlsaW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBzcmVhZCgpCiAgIGZ1bmN0aW9uLiBBZGFtIENveW5lIGZvdW5kIHRoZSBwcm9ibGVtIGluIHRoZSB3aW4zMiB2ZXJzaW9uLCBhbmQgVHJveSBFbmdlbAogICBoZWxwZWQgbWUgb3V0IGlzb2xhdGluZyBpdC4KCiBEYW5pZWwgKDE2IE1heSAxOTk5KQogLSBSaWNoYXJkIEFkYW1zIHBvaW50ZWQgb3V0IGEgYnVnIEkgaW50cm9kdWNlZCBpbiA1LjguIC0tZHVtcC1oZWFkZXIgZG9lc24ndAogICB3b3JrIGFueW1vcmUhIDotLyBJIGZpeGVkIGl0IG5vdy4KCiAtIEFmdGVyIGEgc3VnZ2VzdGlvbiBieSBKb3NodWEgU3dpbmsgSSBhZGRlZCAtUyAvIC0tc2hvdy1lcnJvciB0byBmb3JjZSBjdXJsCiAgIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbiBlcnJvciwgZXZlbiBpZiAtcy8tLXNpbGVudCB3YXMKICAgdXNlZC4KCiBEYW5pZWwgKDEwIE1heSAxOTk5KQogLSBJIG1vdmVkIHRoZSBzdHVmZiBjb25jZXJuaW5nIEhUVFAsIERJQ1QgYW5kIFRFTE5FVCBpdCB0aGVpciBvd24gc291cmNlCiAgIGZpbGVzIG5vdy4gSXQgaXMgYSBiZWdpbm5pbmcgb24gbXkgY2xlYW4tdXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtCiAgIGxheWVyIGFsbCB0aG9zZSBwcm90b2NvbHMgYmV0dGVyIHRvIGVuYWJsZSBtb3JlIHRvIGJlIGFkZGVkIGVhc2llciBpbiB0aGUKICAgZnV0dXJlIQoKIC0gTGVvbiBCcmVlZHQgc2VudCBtZSBzb21lIGZpbGVzIEkndmUgbm90IHB1dCBpbnRvIHRoZSBtYWluIGN1cmwKICAgYXJjaGl2ZS4gVGhleSdyZSBmb3IgY3JlYXRpbmcgdGhlIERlYmlhbiBwYWNrYWdlIHRoaW5naWUuIEhlIGFsc28gc2VudCBtZSBhCiAgIGRlYmlhbiBwYWNrYWdlIHRoYXQgSSd2ZSBtYWRlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYXQgdGhlIHdlYiBwYWdlCgogRGFuaWVsICg5IE1heSAxOTk5KQogLSBNYWRlIGl0IGNvbXBpbGUgb24gY3lnd2luIHRvby4KCiBUcm95IEVuZ2VsICg3IE1heSAxOTk5KQogLSBCcm91Z2h0IGEgc2VyaWVzIG9mIHBhdGNoZXMgdG8gYWxsb3cgY3VybCB0byBjb21waWxlIHNtb290aGx5IG9uIE1TVkMrKyA2CiAgIGFnYWluIQoKIERhbmllbCAoNiBNYXkgMTk5OSkKIC0gSSBjaGFuZ2VkIHRoZSAjaWZkZWYgSEFWRV9TVFJGVElNRSBwbGFjZW1lbnQgZm9yIHRoZSAteiBjb2RlIHNvIHRoYXQgaXQKICAgd2lsbCBiZSBlYXNpZXIgdG8gZGlzY292ZXIgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhhdCBmdW5jdGlvbiBhbmQgdGh1cwogICBjYW4ndCB1c2UgLXogc3VjY2Vzc2Z1bGx5LiBNYWRlIHRoZSBzdHJmdGltZSgpIGdldCB1c2VkIGlmIFdJTjMyIGlzIGRlZmluZWQKICAgdG9vLgoKVmVyc2lvbiA1LjgKCiBEYW5pZWwgKDUgTWF5IDE5OTkpCiAtIEkndmUgaGFkIGl0IHdpdGggdGhpcyBhdXRvY29uZi9hdXRvbWFrZSBtZXNzLiBJdCBzZWVtcyB0byB3b3JrIGFsbHJpZ2h0CiAgIGZvciBtb3N0IHBlb3BsZSB3aG8gZG9uJ3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQsIGJ1dCBmb3IgdGhvc2Ugd2hvIGhhdmUKICAgdGhlcmUgYXJlIHByb2JsZW1zIGFsbCBvdmVyLgoKICAgSSd2ZSBnb3QgbGlrZSBmaXZlIGRpZmZlcmVudCBidWcgcmVwb3J0cyBvbiB0aGlzIG9ubHkgdGhlIGxhc3QKICAgd2Vlay4uLiBDbGF1ZGlvIE5ldmVzIGFuZCBGZWRlcmljbyBCaWFuY2hpIGFuZCByb290IDxkdWdnZXJqMDAxIGF0CiAgIGhhd2FpaS5yci5jb20+IGFyZSBzb21lIG9mIHRoZW0gcmVwb3J0aW5nIHRoaXMuCgogICBDdXJyZW50bHksIEkgaGF2ZSBubyByZWFsbHkgZ29vZCBmaXggc2luY2UgSSB3YW50IHRvIHVzZSBhdXRvbWFrZSBteXNlbGYgdG8KICAgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlLmluIGZpbGVzLiBJJ3ZlIGZvdW5kIG91dCB0aGF0IHRoZSBAU0hFTExALXByb2JsZW1zCiAgIGNhbiBvZnRlbiBiZSBmaXhlZCBieSBtYW51YWxseSBpbnZva2luZyAnYXV0b21ha2UnIGluIHRoZSBhcmNoaXZlIHJvb3QKICAgYmVmb3JlIHlvdSBydW4gLi9jb25maWd1cmUuLi4gSSd2ZSBoYWNrZWQgbXkgbWFrZXRneiBzY3JpcHQgbm93IHRvIGZpZGRsZQogICBhIGJpdCB3aXRoIHRoaXMgYW5kIG15IHRlc3RzIHNlZW0gdG8gd29yayBiZXR0ZXIgdGhhbiBiZWZvcmUgYXQgbGVhc3QhCgogRGFuaWVsICg0IE1heSAxOTk5KQogLSBta2hlbHAucGwgaGFzIGJlZW4gZG9pbmcgYmFkbHkgbGF0ZWx5LiBJIGNvcnJlY3RlZCBhIGNhc2UgcHJvYmxlbSBpbgogICB0aGUgcmVnZXhlcy4KCiAtIEkndmUgbm93IHJlbWFkZSB0aGUgLW8gb3B0aW9uIHRvIG5vdCB0b3VjaCB0aGUgZmlsZSB1bmxlc3MgaXQgbmVlZHMgdG8uCiAgIEkgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSAteiBvcHRpb24gcmVhbGx5IGZpbmUsIHNpbmNlIG5vdyB5b3UgY2FuIG1ha2UgYQogICBjdXJsIGZldGNoIGFuZCB1c2UgYSBsb2NhbCBjb3B5J3MgdGltZSB3aGVuIGRvd25sb2FkaW5nIHRvIHRoYXQgZmlsZSwgYXMKICAgaW46CgogICAgICAgIGN1cmwgLXogZHVtcCAtbyBkdW1wIHJlbW90ZS5zaXRlLmNvbS9maWxlLmh0bWwKCiAgIFRoaXMgd2lsbCBvbmx5IGdldCB0aGUgZmlsZSBpZiB0aGUgcmVtb3RlIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbC4KICAgSSdtIGF3YXJlIHRoYXQgdGhpcyBhbHRlcnMgcHJldmlvdXMgYmVoYXZpb3VyIGEgbGl0dGxlLiBTb21lIHNjcmlwdHMgb3V0CiAgIHRoZXJlIG1heSBkZXBlbmQgb24gdGhhdCB0aGUgZmlsZSBpcyBhbHdheXMgdG91Y2hlZC4uLgoKIC0gQ29ycmVjdGVkIGEgYnVnIGluIHRoZSBTU0x2Mi92MyBzZWxlY3Rpb24uCgogLSBGZWxpeCB2b24gTGVpdG5lciByZXF1ZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZSBhYmxlIHRvIHNlbmQKICAgIklmLU1vZGlmaWVkLVNpbmNlIiBoZWFkZXJzLCB3aGljaCBpbmRlZWQgaXMgYSBmYWlyIGlkZWEuICBJIGltcGxlbWVudGVkIGl0CiAgIHJpZ2h0IGF3YXkhIFRyeSAteiA8ZXhwcmVzc2lvbj4gd2hlcmUgZXhwcmVzc2lvbiBpcyBhIGZ1bGwgR05VIGRhdGUKICAgZXhwcmVzc2lvbiBvciBhIGZpbGUgbmFtZSB0byBnZXQgdGhlIGRhdGUgZnJvbSEKCiBTdGVwaGFuIExhZ2VyaG9sbSAoMzAgQXByIDE5OTkpCiAtIFBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHRoZSBzcmMvTWFrZWZpbGUgZm9yIEZyZWVCU0QuIFRoZSBSTSB2YXJpYWJsZQogICBpc24ndCBzZXQgYW5kIGNhdXNlcyB0aGUgbWFrZSB0byBmYWlsLgoKIERhbmllbCAoMjYgQXByaWwgMTk5OSkKIC0gQW0gSSBzaWxseSBvciB3aGF0PyBJcnZpbmcgV29sZmUgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCB0aGUgY3VybCB2ZXJzaW9uCiAgIG51bWJlciB3YXMgbm90IHNldCBwcm9wZXJseS4gSGFzbid0IGJlZW4gc2luY2UgNS42LiBUaGlzIHdhcyBkdWUgdG8gYSBidWcKICAgaW4gbXkgbWFrZXRneiBzY3JpcHQhCgogRGF2aWQgRXJpa3Nzb24gKDI1IEFwciAxOTk5KQogLSBGb3VuZCBhIGJ1ZyBpbiBjb29raWVzLmMgdGhhdCBtYWRlIGl0IGNyYXNoIGF0IHRpbWVzLgoKVmVyc2lvbiA1LjcuMQoKIERvdWcgS2F1Zm1hbiAoMjMgQXByIDE5OTkpCiAtIEJyb3VnaHQgdHdvIHN1bm9zIDQgZml4ZXMuIE9uZSBvZiB0aGVtIGJlaW5nIHRoZSBob3N0aXAuYyBmaXggbWVudGlvbmVkCiAgIGJlbG93IGFuZCB0aGUgb3RoZXIgb25lIGEgY29ycmVjdGlvbiBpbiBpbmNsdWRlL3N0ZGNoZWFkZXJzLmgKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGFib3V0IGNvbXBpbGluZyB3aXRoIHRoZSBVUy12ZXJzaW9uIG9mIG9wZW5zc2wgdG8gdGhlCiAgIElOU1RBTEwgZmlsZS4KCiBEYW5pZWwKIC0gTmV3IG1haWxpbmcgbGlzdCBhZGRyZXNzLiBJbmZvIHVwZGF0ZWQgb24gdGhlIHdlYiBwYWdlIGFzIHdlbGwgYXMgaW4gdGhlCiAgIFJFQURNRSBmaWxlCgogR3JlZyBPbnVmZXIgKDIwIEFwciAxOTk5KQogLSBob3N0aXAuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBTdW5PUyA1LjUuMS4KICAgSXQgbmVlZHMgYW4gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKVmVyc2lvbiA1LjcKCiBEYW5pZWwgKEFwciAyMCAxOTk5KQogLSBEZWNpZGVkIHRvIHVwbG9hZCBhIG5vbi1iZXRhIHZlcnNpb24gcmlnaHQgbm93IQoKIC0gTWFkZSBjdXJsIHN1cHBvcnQgYW55LWxlbmd0aCBIVFRQIGhlYWRlcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgbm93CiAgIHNpbXBseSBlbmxhcmdlZCBldmVyeSB0aW1lIGl0IHR1cm5zIG91dCB0byBiZSB0b28gc21hbGwhCgogLSBBZGRlZCB0aGUgRkFRIGZpbGUgdG8gdGhlIGFyY2hpdmUuIFN0aWxsIGEgYml0IHNtYWxsaXNoLCBidXQgaXQgaXMgYQogICBzdGFydC4KCiBFcmljIFRoZWxpbiAoMTUgQXByIDE5OTkpCiAtIE1hZGUgLUQgYWNjZXB0ICctJyBpbnN0ZWFkIG9mIGZpbGVuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KClZlcnNpb24gNS42LjNiZXRhCgogRGFuaWVsIChBcHIgMTIgMTk5OSkKCiAtIENoYW5nZWQgdHdvICNpZmRlZiBXSU4zMiB0byBiZXR0ZXIgI2lmZGVmIDxlcnJvcmNvZGU+IHdoZW4gY29ubmVjdCgpaW5nCiAgIGluIHVybC5jIGFuZCBmdHAuYy4gTWFrZXMgY3lnd2luMzIgZGVhbCB3aXRoIHRoZW0gYmV0dGVyIHRvby4gV2Ugc2hvdWxkCiAgIHRyeSB0byBnZXQgc29tZSBkZWNlbnQgd2luMzItcmVwbGFjZW1lbnQgdGhlcmUuIEFueW9uZT8KCiAtIFRoZSBvbGQgLTMvLS1jcmxmIG9wdGlvbiBpcyBub3cgT05MWSAtLWNybGYhCgogLSBJIGNoYW5nZWQgdGhlICJTU0wgZml4IiB0byBhIG1vcmUgbGFtZSBvbmUsIGJ1dCB0aGF0IGRvZXNuJ3QgcmVtb3ZlIGFzCiAgIG11Y2ggZnVuY3Rpb25hbGl0eS4gTm93IEkndmUgZW5hYmxlZCB0aGUgbGliIHRvIHNlbGVjdCB3aGF0IFNTTCB2ZXJzaW9uIGl0CiAgIHNob3VsZCB0cnkgZmlyc3QuIEFwcGVhcmFudGx5IHNvbWUgb2xkZXIgU1NMLXNlcnZlcnMgZG9uJ3QgbGlrZSB3aGVuIHlvdQogICB0YWxrIHYzIHdpdGggdGhlbSBzbyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGZvcmNlIGN1cmwgdG8gdGFsayB2MiBmcm9tIHRoZQogICBzdGFydC4gVGhlIGZpeCBkYXRlZCBBcHJpbCA2IGFuZCBwb3N0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBmb3JjZWQgY3VybCB0bwogICB1c2UgdjIgYXQgYWxsIHRpbWVzIHVzaW5nIGEgbW9kZXJuIE9wZW5TU0wgdmVyc2lvbiwgYnV0IHdlIGRvbid0IHJlYWxseQogICB3YW50IHN1Y2ggYSBjcmlwcGxlZCBzb2x1dGlvbi4KCiAtIE1hcmMgQm91Y2hlciBzZW50IG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgYSBtYXRoIGVycm9yIGZvciB0aGUKICAgIkN1cnIuU3BlZWQiIHByb2dyZXNzIG1ldGVyLgoKIC0gRXJpYyBUaGVsaW4gc2VudCBtZSBhIHBhdGNoIHRoYXQgZW5hYmxlcyAnLUsgLScgdG8gcmVhZCBhIGNvbmZpZyBmaWxlIGZyb20KICAgc3RkaW4uCgogLSBJIGZvdW5kIG91dCB3ZSBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUgcHJvcGVybHkgYmVmb3JlIHNvIEkgYWRkZWQgaXQhCgogRGFuaWVsIChBcHIgOSAxOTk5KQogLSBZdSBYaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggZnRwIGRvd25sb2FkIHJlc3VtZS4gIEl0IGRpZG4ndCB3b3JrIGF0CiAgIGFsbCEgOy1PCgogRGFuaWVsIChBcHIgNiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHZlcnNpb24gc3RyaW5nIHBhcnQgZ2VuZXJhdGVkIGZvciB0aGUgU1NMIHZlcnNpb24uCgogLSBJIGZvdW5kIGEgd2F5IHRvIG1ha2Ugc29tZSBvdGhlciBTU0wgcGFnZSB3b3JrIHdpdGggb3BlbnNzbCAwLjkuMSsgdGhhdAogICBwcmV2aW91c2x5IGRpZG4ndCAoc3NsZWF5IDAuOC4wIHdvcmtzIHdpdGggaXQgdGhvdWdoISkuIFRyeWluZyB0byBnZXQKICAgc29tZSByZWFsIGluZm8gZnJvbSB0aGUgT3BlblNTTCBndXlzIHRvIHNlZSBob3cgSSBzaG91bGQgZG8gdG8gYmVoYXZlIHRoZQogICBiZXN0IHdheS4gU1NMZWF5IDAuOC4wIHNob3VsZG4ndCBiZSB0aGF0IG11Y2ggaW4gdXNlIGFueXdheSB0aGVzZSBkYXlzIQoKVmVyc2lvbiA1LjYuMmJldGEKCiBEYW5pZWwgKEFwciA0IDE5OTkpCiAtIEZpbmFsbHkgaGF2ZSBjdXJsIG1vcmUgY29va2llICJhd2FyZSIuIE5vdyByZWFkIGNhcmVmdWxseS4gVGhpcyBpcyBob3cKICAgaXQgd29ya3MuCiAgIFRvIG1ha2UgY3VybCByZWFkIGNvb2tpZXMgZnJvbSBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUsIGluIHBsYWluIGhlYWRlci0KICAgZm9ybWF0IChsaWtlIGZyb20gdGhlIGhlYWRlcnMgb2YgYSBwcmV2aW91cyBmZXRjaCkgaW52b2tlIGN1cmwgd2l0aCB0aGUKICAgLWIgZmxhZyBsaWtlOgoKICAgICAgICBjdXJsIC1iIGZpbGUgaHR0cDovL3NpdGUvZm9vLmh0bWwKCiAgIEN1cmwgd2lsbCB0aGVuIHVzZSBhbGwgY29va2llcyBpdCBmaW5kcyBtYXRjaGluZy4gVGhlIG9sZCBzdHlsZSB0aGF0IHNldHMKICAgYSBzaW5nbGUgY29va2llIHdpdGggLWIgaXMgc3RpbGwgc3VwcG9ydGVkIGFuZCBpcyB1c2VkIGlmIHRoZSBzdHJpbmcKICAgZm9sbG93aW5nIC1iIGluY2x1ZGVzIGEgJz0nIGxldHRlciwgYXMgaW4gIi1iIG5hbWU9ZGFuaWVsIi4KCiAgIFRvIG1ha2UgY3VybCByZWFkIHRoZSBjb29raWVzIHNlbnQgaW4gY29tYmluYXRpb24gd2l0aCBhIGxvY2F0aW9uOiAod2hpY2gKICAgc2l0ZXMgb2Z0ZW4gZG8pIHBvaW50IGN1cmwgdG8gcmVhZCBhIG5vbi1leGlzdGluZyBmaWxlIGF0IGZpcnN0IChpLmUKICAgdG8gc3RhcnQgd2l0aCBubyBleGlzdGluZyBjb29raWVzKSwgbGlrZToKCiAgICAgICAgY3VybCAtYiBub3doZXJlIGh0dHA6Ly9zaXRlL3NldGNvb2tpZWFuZHJlbG9jYXRlLmh0bWwKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGluIHRoZSBUT0RPIGZpbGUgYWJvdXQgdGhlIFNTTCBwcm9ibGVtcyByZWNlbnRseQogICByZXBvcnRlZC4gRXZpZGVudGx5LCBzb21lIGtpbmQgb2YgU1NMLXByb2JsZW0gY3VybCBtYXkgbmVlZCB0byBhZGRyZXNzLgoKIC0gQmV0dGVyICJMb2NhdGlvbjoiIGZvbGxvd2luZy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoVHVlLCAzMCBNYXIgMTk5OSkKIC0gQSBzdWJzZWNvbmQgZGlzcGxheSBwYXRjaC4KCiBEYW5pZWwgKE1hciAxNCAxOTk5KQogLSBJJ3ZlIHNlcGFyYXRlZCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGliY3VybCBhbmQgY3VybCBub3cuIFRvIG1ha2UKICAgdGhpbmdzIGEgbGl0dGxlIGVhc2llciwgSSBkZWNpZGVkIHRvIHN0YXJ0IHRoZSBjdXJsIG51bWJlcmluZyBmcm9tCiAgIDUuNiBhbmQgdGhlIGZvcm1lciB2ZXJzaW9uIG51bWJlciBrbm93biBhcyAiY3VybCIgaXMgbm93IHRoZSBvbmUKICAgc2V0IGZvciBsaWJjdXJsLgoKIC0gUmVtb3ZlZCB0aGUgJ2VuYWJsZS1uby1wYXNzJyBmcm9tIGNvbmZpZ3VyZSwgSSBkb3VidCBhbnlvbmUgd2FudGVkCiAgIHRoYXQuCgogLSBNYWRlIGxvdHMgb2YgdGlueSBhZGp1c3RtZW50cyB0byBjb21waWxlIHNtb290aGx5IHdpdGggY3lnd2luIHVuZGVyCiAgIHdpbjMyLiBJdCdzIGEga2lsbGVyIGZvciBwb3J0aW5nIHRoaXMgdG8gd2luMzIsIGJ5ZSBieWUgVkMrKyEgOy0pCiAgIENvbXBpbGVzIGFuZCBidWlsZHMgb3V0LW9mLXRoZS1ib3ggbm93LiBTZWUgdGhlIG5ldyB3b3JkaW5ncyBpbgogICBJTlNUQUxMIGZvciBkZXRhaWxzLgoKIC0gQmVnaW5uaW5nIGV4cGVyaW1lbnRzIHdpdGggZG93bmxvYWRpbmcgbXVsdGlwbGUgZG9jdW1lbnQgZnJvbSBhIGh0dHAKICAgc2VydmVyIHdoaWxlIHJlbWFpbmluZyBjb25uZWN0ZWQuCgpWZXJzaW9uIDUuNmJldGEKCiBEYW5pZWwgKE1hciAxMyAxOTk5KQogLSBTaW5jZSBJJ3ZlIGNoYW5nZWQgc28gbXVjaCwgSSB0aG91Z2h0IEknZCBqdXN0IGdvIGFoZWFkIGFuZCBpbXBsZW1lbnQgdGhlCiAgIHN1Z2dlc3Rpb24gZnJvbSBEb3VnbGFzIEUuIFdlZ3NjaGVpZC4gLUQgb3IgLS1kdW1wLWhlYWRlciBpcyBub3cgc3RvcmluZwogICBIVFRQIGhlYWRlcnMgc2VwYXJhdGVseSBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogLSBBZGRlZCBuZXcgdGV4dCB0byBJTlNUQUxMIG9uIHdoYXQgdG8gZG8gdG8gYnVpbGQgdGhpcyBvbiB3aW4zMiBub3cuCgogLSBBYWFyZ2guIEkgaGFkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIHByZWZpeCB0aGUgc2hhcmVkICNpbmNsdWRlIGZpbGVzCiAgIGluIHRoZSBzb3VyY2VzIHdpdGggIi4uL2luY2x1ZGUvIiB0byBwbGVhc2UgVkMrKy4uLgoKIERhbmllbCAoTWFyIDEyIDE5OTkpCiAtIFNwbGl0IHRoZSB1cmwuYyBzb3VyY2UgaW50byBtYW55IHRpbnkgc291cmNlcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgIGFuZCBzbWFsbGVyIHNpemUuCgogRGFuaWVsIChNYXIgMTEgMTk5OSkKIC0gU3RhcnRlZCB0byBjaGFuZ2Ugc3R1ZmYgZm9yIGEgbW92ZSB0byBtYWtlIGxpYmN1cmwgYW5kIGEgbW9yZSBzZXBhcmF0ZQogICBjdXJsIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgbGliY3VybC4gTWFkZSB0aGUgbGliY3VybCBzb3VyY2VzIGludG8KICAgdGhlIG5ldyBsaWIgZGlyZWN0b3J5IHdoaWxlIHRoZSBjdXJsIGFwcGxpY2F0aW9uIHdpbGwgcmVtYWluIGluIHNyYyBhcwogICBiZWZvcmUuIE5ldyBtYWtlZmlsZXMsIGFkanVzdGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIHNvLgoKICAgbGliY3VybC5hIGJ1aWx0IHF1aWNrbHkgYW5kIGVhc2lseS4gSSBiZXR0ZXIgbWFrZSBhIGJldHRlciBpbnRlcmZhY2UgdG8KICAgdGhlIGxpYiBmdW5jdGlvbnMgdGhvdWdoLgoKICAgVGhlIG5ldyByb290IGRpciBpbmNsdWRlLyBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBwdWJsaWMgaW5mb3JtYXRpb24KICAgYWJvdXQgdGhlIG5ldyBsaWJjdXJsLiBJdCBpcyBhIGxpdHRsZSB1Z2x5IHNvIGZhciA6LSkKCgogRGFuaWVsIChNYXIgMSAxOTk5KQogLSBUb2RkIEthdWZtYW5uIHNlbnQgbWUgYSBnb29kIGxpbmsgdG8gTmV0c2NhcGUncyBjb29raWUgc3BlYyBhcyB3ZWxsIGFzIHRoZQogICBpbmZvIHRoYXQgUkZDIDIxMDkgc3BlY2lmaWVzIGhvdyB0byB1c2UgdGhlbS4gIFRoZSBsaW5rIGlzIG5vdyBpbiB0aGUKICAgUkVBRE1FIGFuZCB0aGUgUkZDIGluIHRoZSBSRVNPVVJDRVMuCgogRGFuaWVsIChGZWIgMjMgMTk5OSkKIC0gRmluYWxseSBtYWRlIGNvbmZpZ3VyZSBhY2NlcHQgLS13aXRoLXNzbCB0byBsb29rIGZvciBTU0wgbGlicyBhbmQgaW5jbHVkZXMKICAgaW4gdGhlICJzdGFuZGFyZCIgcGxhY2UgL3Vzci9sb2NhbC9zc2wuLi4KCiBEYW5pZWwgKEZlYiAyMiAxOTk5KQogLSBWZXJpZmllZCB0aGF0IGN1cmwgbGlua2VkIGZpbmUgd2l0aCBPcGVuU1NMIDAuOS4xYyB3aGljaCBzZWVtcyB0byBiZQogICB0aGUgbW9zdCByZWNlbnQuCgogSGVucmkgR29tZXogKEZyaSBGZWIgIDUgMTk5OSkKIC0gU2VudCBpbiBhbiB1cGRhdGVkIGN1cmwtc3NsLnNwZWMuIEkgc3RpbGwgbWlzcyB0aGUgc2NyaXB0IHRoYXQgYnVpbGRzIGFuCiAgIFJQTSBhdXRvbWF0aWNhbGx5Li4uCgpWZXJzaW9uIDUuNS4xCgogTWFyayBCdXRsZXIgKDI3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgcHJvYmxlbXMgaW4gRG93bmxvYWQoKS4KCiBEYW5pdGVsIFN0ZW5iZXJnICgyNSBKYW4gMTk5OSkKIC0gSmVyZW1pZSBQZXRpdCBwb2ludGVkIG91dCBhIGZldyBmbGF3cyBpbiB0aGUgc291cmNlIHRoYXQgcHJldmVudGVkIGl0IGZyb20KICAgY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgbmF0aXZlIGNvbXBpbGVyIHVuZGVyIERpZ2l0YWwgVW5peCB2NC4wZC4KClZlcnNpb24gNS41CgogRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMTk5OSkKIC0gQWRkZWQgQmpvcm5zIHNtYWxsIHRleHQgdG8gdGhlIFJFQURNRSBhYm91dCB0aGUgRElDVCBwcm90b2NvbC4KCiBEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAxOTk5KQogLSA8anN3aW5rIGF0IHNvZnRjb20ubmV0PiByZXBvcnRlZCBhYm91dCB0aGUgd2luMzItdmVyc2lvaW46ICJEb2Vzbid0IHVzZQogICBBTExfUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUiLiBUdXJuZWQgb3V0IHRvIGJlIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYy0KICAgYnVmZmVyIG5hdHVyZSBvZiB0aGUgd2luMzIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbHMhCgogQmpvcm4gUmVlc2UgKDEwIEphbiAxOTk5KQogLSBJIGhhdmUgYXR0YWNoZWQgYSBzaW1wbGUgYWRkaXRpb24gZm9yIHRoZSBESUNUIHByb3RvY29sIChSRkMgMjIyOSkuCiAgIEl0IHBlcmZvcm1zIGRpY3Rpb25hcnkgbG9va3Vwcy4gVGhlIG91dHB1dCBzdGlsbCBuZWVkcyB0byBiZSBiZXR0ZXIKICAgZm9ybWF0dGVkLgoKICAgVG8gdGVzdCBpdCB0cnkgKHRoZSBleGFjdCBmb3JtYXQsIGFuZCBtb3JlIGV4YW1wbGVzIGFyZSBkZXNjcmliZWQgaW4KICAgdGhlIFJGQykKCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG8KICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbzo6c291bmRleAoKCiBWaWNlbnRlIEdhcmNpYSAoMTAgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDIwTUIuCgogRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIC10IGFuZCAtVCBoZWxwIHRleHRzLiBUaGV5IGNsYWltZWQgdG8gYmUgRlRQIG9ubHkuCgpWZXJzaW9uIDUuNAoKIERhbmllbCBTdGVuYmVyZwogKDcgSmFuIDE5OTkpCiAtIElydmluZyBXb2xmZSByZXBvcnRlZCB0aGF0IGN1cmwgLXMgZGlkbid0IGFsd2F5cyBzdXByZXNzIHRoZSBwcm9ncmVzcwogICByZXBvcnRpbmcuIEl0IHdhcyB0aGUgZm9ybSBwb3N0IHRoYXQgYXV0b2FtdGljYWxseSBhbHdheXMgc3dpdGNoZWQgaXQgb24KICAgYWdhaW4uIFRoaXMgaXMgbm93IGNvcnJlY3RlZCEKCiAoNCBKYW4gMTk5OSkKIC0gQW5kcmVhcyBLb3N0eXJrYSBzdWdnZXN0ZWQgSSdkIGFkZCBQVVQgYW5kIGhlIGhlbHBlZCBtZSBvdXQgdG8gdGVzdCBpdC4gSWYKICAgeW91IHVzZSAtdCBvciAtVCBub3cgb24gYSBodHRwIG9yIGh0dHBzIHNlcnZlciwgUFVUIHdpbGwgYmUgdXNlZCBmb3IgZmlsZQogICB1cGxvYWQuCgogICBJIHJlbW92ZWQgdGhlIGZvcm1lciB1c2Ugb2YgLVQgd2l0aCBIVFRQLiBJIGRvdWJ0IGFueW9uZSBldmVyIHJlYWxseSB1c2VkCiAgIHRoYXQuCgogKDQgSmFuIDE5OTkpCiAtIEVyaWsgSmFjb2JzZW4gZm91bmQgYSB3aWR0aCBidWcgaW4gdGhlIG1wcmludGYoKSBmdW5jdGlvbi4gIEkgY29ycmVjdGVkIGl0CiAgIG5vdy4KCiAoNCBKYW4gMTk5OSkKIC0gQXMgSm9obiBWLiBDaG93IHBvaW50ZWQgb3V0IHRvIG1lLCBjdXJsIGFjY2VwdGVkIHZlcnkgbGltaXRlZCBVUkwgc2l6ZXMuIEl0CiAgIHNob3VsZCBub3cgYWNjZXB0IHBhdGggcGFydHMgdGhhdCBhcmUgdXAgdG8gYXQgbGVhc3QgNDA5NiBieXRlcy4KCiAtIFNvbWVob3cgSSBzY3Jld2VkIHVwIHdoZW4gYXBwbHlpbmcgdGhlIEFJWCBmaXggZnJvbSBHaWxiZXJ0IFJhbWlyZXosIHNvCiAgIEkgcmVkaWQgdGhhdCBub3cuCgpWZXJzaW9uIDUuM2EgKHdpbjMyIG9ubHkpCgogVHJveSBFbmdlbAogLSBDb3JyZWN0ZWQgYSB3aW4zMiBidWcgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnQuCgpWZXJzaW9uIDUuMwoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDIxIERlYyAxOTk4KQogLSBJIGhhdmUgaW1wbGVtZW50ZWQgdGhlICJxdW90ZSIgZnVuY3Rpb24gb2YgRlRQIGNsaWVudHMuIEl0IGFsbG93cyB5b3UgdG8KICAgc2VuZCBhcmJpdHJhcnkgY29tbWFuZHMgdG8gdGhlIHJlbW90ZSBGVFAgc2VydmVyLiBJIGNob3NlIHRoZSAtUS8tLXF1b3RlCiAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCgogICBZb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBxdW90ZWQgc3RyaW5nLCBhbmQgY3VybCB3aWxsIGFwcGx5IHRoZW0gaW4KICAgb3JkZXIuICBUaGlzIGlzIHdoYXQgSSB1c2UgZm9yIG15IE1WUyB1cGxvYWQ6CgogIGN1cmwgLUIgLS1jcmxmIC1RICJzaXRlIGxyZWNsPTgwIiAtUSAic2l0ZSBibGs9ODAwMCIgLVQgZmlsZSBmdHA6Ly9vczM5MC90ZXN0CgogICBDdXJsIHdpbGwgc2VuZCB0aGUgdHdvIHF1b3RlZCAic2l0ZSIgY29tbWFuZHMgaW4gdGhlIHByb3BlciBvcmRlci4KCiAtIE1hZGUgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBSVguCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMTggRGVjIDE5OTgpCiAtIEJyb3VnaHQgYW4gTVZTIHBhdGNoOiAtMy8tLW12cywgZm9yIGZ0cCB1cGxvYWQgdG8gdGhlIE1WUyBmdHAgc2VydmVyLgoKIFRyb3kgRW5nZWwgKDE3IERlYyAxOTk4KQogLSBCcm91Z2h0IGEgY29ycmVjdGlvbiB0aGF0IGZpeGVzIHRoZSB3aW4zMiBjdXJsIGJ1Zy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQSBidWcsIHBvaW50ZWQgb3V0IHRvIG1lIGJ5IERyIEguIFQuIExldW5nLCBjYXVzZWQgY3VybCB0byBjcmFzaCBvbiB0aGUgLUEKICAgZmxhZyBvbiBjZXJ0YWluIHN5c3RlbXMuIEFjdHVhbGx5LCBhbGwgc3lzdGVtcyBzaG91bGQndmUhCgogLSBBZGRlZCBhIGZldyBkZWZpbmVzIHRvIG1ha2UgZGlyZWN0b3JpZXMvZmlsZSBuYW1lcyBnZXQgYnVpbGQgbmljZXIgKHdpdGggXwogICBpbnN0ZWFkIG9mIC4gYW5kIFwgaW5zdGVhZCBvZiAvIGluIHdpbjMyKS4KCiAtIHN0ZXZlIDxmaXNrIGF0IHBvbGFyLmJvd2RvaW4uZWR1PiByZXBvcnRlZCBhIHdlaXJkIGJ1ZyB0aGF0IG9jY3VyZWQgaWYgdGhlCiAgIGZ0cCBzZXJ2ZXIgcmVzcG9uc2UgbGluZSBoYWQgYSBwYXJlbnRoZXNpcyBvbiB0aGUgbGluZSBiZWZvcmUgdGhlIChzaXplKQogICBpbmZvLiBJIGhvcGUgaXQgd29ya3MgYmV0dGVyIG5vdyEKClZlcnNpb24gNS4yLjEKCiBTdGV2ZW4gRy4gSm9obnNvbiAoRGVjIDE0LCAxOTk4KQogLSBCcm91Z2h0IGEgZml4IHRoYXQgY29ycmVjdGVkIGEgY3Jhc2ggaW4gNS4yIGR1ZSB0byBiYWQgdHJlYXRtZW50IG9mIHRoZQogICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgpWZXJzaW9uIDUuMgoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDE0LCAxOTk4KQogLSBSZXdyb3RlIHRoZSBta2hlbHAgc2NyaXB0IGFuZCBub3csIHRoZSBta2hlbHAucGwgc2NyaXB0IGdlbmVyYXRlcyB0aGUKICAgaHVnZWhlbHAuYyBmaWxlIGZyb20gdGhlIFJFQURNRSAqYW5kKiB0aGUgbWFuIHBhZ2UgZmlsZSBjdXJsLjEuIEJ5IHVzaW5nCiAgIGJvdGggZmlsZXMsIEkgbm8gbG9uZ2VyIG5lZWQgdG8gaGF2ZSBkb3VibGUgaW5mb3JtYXRpb24gaW4gYm90aCB0aGUgbWFuCiAgIHBhZ2UgYW5kIHRoZSBSRUFETUUgYXMgd2VsbC4gU28sIHdpbjMyLXVzZXJzIHdpbGwgb25seSBoYXZlIHRoZSBodWdlaGVscC5jCiAgIGZpbGUgZm9yIGFsbCBpbmZvLCBidXQgdGhlbiwgdGhleSBkb3dubG9hZCB0aGUgcGxhaW4gYmluYXJ5IG1vc3QgdGltZXMKICAgYW55d2F5LgoKIC0gZ2NjMi44LjEgd2l0aCB0aGUgLVdhbGwgZmxhZyBjb21wbGFpbnRzIGEgbG90IG9uIHN1YnNjcmlwdCBoYXMgdHlwZSBgY2hhcicKICAgaWYgSSBkb24ndCBleHBsaWNpdGx5IHR5cGVjYXN0IHRoZSBhcmd1bWVudCB0byBpc2RpZ2l0KCkgb3IgaXNzcGFjZSgpIHRvCiAgIGludC4gU28gSSBkaWQgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGF0IHRvby4KCiAtIEFkZGVkIGNoZWNrcyBmb3IgJ2xvbmcgZG91YmxlJyBhbmQgJ2xvbmcgbG9uZycgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEkKICAgbmVlZCB0aG9zZSBmb3IgdGhlIG1wcmludGYuYyBzb3VyY2UgdG8gY29tcGlsZSB3ZWxsIG9uIG5vbiBsb25nIGxvbmcKICAgY29tZm9ybWluZyBzeXN0ZW1zIQoKVmVyc2lvbiA1LjEgKG5vdCBwdWJsaWNseSByZWxlYXNlZCkKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxMCwgMTk5OCkKIC0gSSBnb3QgYSByZXF1ZXN0IGZvciBhIHByZS1jb21waWxlZCBOVCBBbHBoYSB2ZXJzaW9uLiBBbnlvbmU/CgogLSBBZGRlZCBMeW54L0NFUk4gd3d3IGxpYiBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdXBwb3J0LiBUaGF0IG1lYW5zIGN1cmwKICAgbm93IHJlYWRzIGFuZCB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKCglIVFRQX1BST1hZLCBIVFRQU19QUk9YWSwgRlRQX1BST1hZLCBHT1BIRVJfUFJPWFkKCiAgIFRoZXkgc2hvdWxkIGJlIHNldCBmb3IgcHJvdG9jb2wtc3BlY2lmaWMgcHJveGllcy4gR2VuZXJhbCBwcm94eSBzaG91bGQgYmUKICAgc2V0IHdpdGgKCglBTExfUFJPWFkKCiAgIEFuZCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGhvc3QgbmFtZXMgdGhhdCBzaG91bGRuJ3QgZ28gdGhyb3VnaCBhbnkKICAgcHJveHkgaXMgc2V0IGluIChvbmx5IGFuIGFzdGVyaXNrLCAnKicgbWF0Y2hlcyBhbGwgaG9zdHMpLgoKCU5PX1BST1hZCgogICBUaGUgdXNhZ2Ugb2YgdGhlIC14Ly0tcHJveHkgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAtIFByb3h5IGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGggYSBwcm9jb3RvbDovLyBwcmVmaXguCgogLSBXcm90ZSB0aGUgY3VybC4xIG1hbiBwYWdlLgoKIC0gSW50cm9kdWNlZCBhIHdob2xlIG5ldyBkeW5hbWljIGJ1ZmZlciBzeXN0ZW0gZm9yIGFsbCBzcHJpbnRmKClzLiBJdCBpcwogICBiYXNlZCBvbiB0aGUgKnByaW50ZigpIHBhY2thZ2UgYnkgeW91cnMgdHJ1bHkgYW5kIEJqb3JuIFJlZXNlLiBIb3BlZnVsbHksCiAgIHRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgYnVmZmVyIG92ZXJmbG93IHJpc2tzIGxlZnQgbm93LgoKIC0gQWgsIEkgc2hvdWxkIG1lbnRpb24gSSd2ZSBjb21waWxlZCBhbmQgYnVpbHQgY3VybCBzdWNjZXNzZnVsbHkgdW5kZXIKICAgc29sYXJpcyAyLjYgd2l0aCBnY2Mgbm93LCBnY2MgMi43LjIgd29uJ3Qgd29yayBidXQgMi44LjEgZGlkIG9rLgoKIE9yZW4gVGlyb3NoIChEZWMgMywgMTk5OCkKIC0gQnJvdWdodCB0d28gLnNwZWMgZmlsZXMsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIChMaW51eCkgUmVkaGF0IHN0eWxlIFJQTQogICBwYWNrYWdlcy4gVGhleSdyZSBuYW1lZCBjdXJsLnNwZWMgYW5kIGN1cmwtc3NsLnNwZWMuCgogVHJveSBFbmdlbAogLSBTdXBwbGllZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmb3IgZWFzeSBjb21waWxpbmcgd2l0aCBWQysrIHVuZGVyIFdpbjMyLgoKVmVyc2lvbiA1LjAKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxLCAxOTk4KQogLSBOb3QgYSBzaW5nbGUgYnVnIHJlcG9ydCBpbiBhZ2VzLgogLSBDb3JyZWN0ZWQgZ2V0cGFzcy5jIGFuZCBtYWluLmMgdG8gY29tcGlsZSB3YXJuaW5nIGFuZCBlcnJvciBmcmVlIHdpdGggdGhlCiAgIFdpbjMyIFZDKysgY3JhcC4KClZlcnNpb24gNS4wIGJldGEgMjQKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAyMCwgMTk5OCkKCiBIT1cgVE8gQlVJTEQgQSBSRUxFQVNFIEFSQ0hJVkU6CgogKiBQcmUtcmVxdWlzaXRlIHNvZnR3YXJlOgogICBXaGF0CQkgICAgIFRvIGJ1aWxkIHdoYXQgICAgICAgICAgICAgUmVhZHMgZGF0YSBmcm9tCiAgID09PT0gICAgICAgICAgICAgID09PT09PT09PT09PT0gICAgICAgICAgICAgPT09PT09PT09PT09PT09CiAgIEdOVSBhdXRvbWFrZSAgICAgIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00ICAgY29uZmlndXJlLmluCiAgICAgR05VIG1ha2UoMSkgICAgICAtICIgLQogICAgIEdOVSBnY2MoMSkgICAgICAgLSAiIC0KICAgR05VIGF1dG9jb25mICAgICAgY29uZmlndXJlICAgICAgICAgICAgICAgICBjb25maWd1cmUuaW4KICAgR05VIGF1dG9oZWFkZXIoMikgY29uZmlnLmguaW4JICAgICAgIGNvbmZpZ3VyZS5pbiwgYWNjb25maWcuaAoKICogTWFrZSBzdXJlIGFsbCBmaWxlcyB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBhcmNoaXZlIGFyZSBwdXQgaW4gRklMRVMuCgogKiBSdW4gJy4vbWFrZXRneicgYW5kIGVudGVyIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBuZXcgdG8gYmVjb21lIGFyY2hpdmUuCgogICBtYWtldGd6IGRvZXM6CgogICAtIEVudGVycyB0aGUgbmV3bHkgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBpbiB1cmwuaC4KICAgLSAoSWYgeW91IGRvbid0IGhhdmUgYXV0b21ha2UsIHRoaXMgc2NyaXB0IHdpbGwgd2FybiBhYm91dCB0aGF0LCBidXQgdW5sZXNzCiAgICAgeW91IGhhdmUgY2hhbmdlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMsIHRoYXQgaXMgbm90aGluZyB0byBjYXJlIGFib3V0LikKICAgICBJZiB5b3UgaGF2ZSBpdCwgaXQnbGwgcnVuIGl0LgogICAtIElmIHlvdSBoYXZlIGF1dG9jb25mLCB0aGUgY29uZmlndXJlLmluIHdpbGwgYmUgZWRpdGVkIHRvIGdldCB0aGUgbmV3bHkKICAgICBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGFuZCBhdXRvY29uZiB3aWxsIGJlIHJ1bi4KICAgLSBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBjdXJsLTx2ZXJzaW9uPi4gKEFjdHVhbGx5LCBpdCB1c2VzIHRoZSBiYXNlCiAgICAgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXAgdG8gdGhlIGZpcnN0ICctJy4pCiAgIC0gQ29waWVzIGFsbCBmaWxlcyBtZW50aW9uZWQgaW4gRklMRVMgdG8gdGhlIG5ldyBkaXJlY3RvcnkuIFNhdmluZwogICAgIHBlcm1pc3Npb25zIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlLgogICAtIFVzZXMgdGFyIHRvIGNyZWF0ZSBhbiBhcmNoaXZlIG9mIGl0IGFsbCwgbmFtZWQgY3VybC08dmVyc2lvbj4udGFyLmd6CiAgIC0gZ3ppcHMgdGhlIGFyY2hpdmUKICAgLSBSZW1vdmVzIHRoZSBuZXcgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzLgoKICogV2hlbiBkb25lLCB5b3UgaGF2ZSBhbiBhcmNoaXZlIHN0b3JlZCBpbiB5b3VyIGRpcmVjdG9yeSBuYW1lZAogICBjdXJsLTx2ZXJzaW9uPi50YXIuZ3ouCgogICBEb25lIQoKICAgKDEpIFRoZXkncmUgcmVxdWlyZWQgdG8gbWFrZSBhdXRvbWFrZSBydW4gcHJvcGVybHkuCiAgICgyKSBJdCBpcyBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgdGhlIEdOVSBhdXRvY29uZiBhcmNoaXZlLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDE4LCAxOTk4KQogLSBJIGNoYW5nZWQgdGhlIFRBRy1zeXN0ZW0uIElmIHlvdSBldmVyIHVzZWQgdXJsZ2V0KCkgZnJvbSB0aGlzIHBhY2thZ2UgaW4KICAgYW5vdGhlciBwcm9kdWN0LCB5b3UgbmVlZCB0byByZWNvbXBpbGUgd2l0aCB0aGUgbmV3IGhlYWRlcnMuIEkgZGlkIHRoaXMKICAgbmV3IHN0dWZmIHRvIGJldHRlciBkZWFsIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyBhbmQgc3lzdGVtIHdpdGggZGlmZmVyZW50CiAgIHZhcmlhYmxlIHNpemVzLiBJIHRoaW5rIGl0IG1ha2VzIGl0IGEgbGl0dGxlIG1vcmUgcG9ydGFibGUuIFRoaXMgcHJvdmVzCiAgIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIHByb2JsZW1hdGljIElSSVggY29tcGlsZXIhCiAtIFdpbjMyIGNvbXBpbGVkIHdpdGggYSBzaWxseSBlcnJvci4gQ29ycmVjdGVkIG5vdy4KIC0gQnJpYW4gQ2hhcGxpbiByZXBvcnRlZCB5ZXQgYW5vdGhlciBwcm9ibGVtIGluCiAgIG11bHRpbGluZSBGVFAgcmVzcG9uc2VzLiBJJ3ZlIHRyaWVkIHRvIGNvcnJlY3QgaXQuIEkgbWFpbGVkIGhpbSBhIG5ldwogICB2ZXJzaW9uIGFuZCBJIGhvcGUgaGUgZ2V0cyBiYWNrIHNvb24gd2l0aCBwb3NpdGl2ZSBmZWVkYmFjayEKIC0gSW1wcm92ZWQgdGhlICdtYWtldGd6JyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRyZWUgd2hpY2ggaXQgbWFrZXMKICAgYW4gYXJjaGl2ZSBmcm9tIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIHJlbmFtaW5nIG9mIHRoZSBjdXJyZW50IG9uZS4KIC0gTWFpbGluZyBsaXN0IG9wZW5lZCAoc2VlIFJFQURNRSkuCiAtIE1hZGUgLXYgbW9yZSB2ZXJib3NlIG9uIHRoZSBQQVNWIHNlY3Rpb24gb2YgZnRwIHRyYW5zZmVycy4gTm93IGl0IHRlbGxzCiAgIGhvc3QgbmFtZSBhbmQgSVAgb2YgdGhlIG5ldyBob3N0IChhbmQgcG9ydCBudW1iZXIpLiBJIGFsc28gYWRkZWQgYSBzZWN0aW9uCiAgIGFib3V0IFBPUlQgdnMgUEFTViBpbiB0aGUgUkVBRE1FLgoKVmVyc2lvbiA1LjAgYmV0YSAyMQoKIEFuZ3VzIE1hY2theSAoTm92IDE1LCAxOTk4KQogLSBJbnRyb2R1Y2VkIGF1dG9tYWtlIHN0dWZmLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEzLCAxOTk4KQogLSBKdXN0IG1hZGUgYSBzdWNjZXNzZnVsIEdFVCBvZiBhIGRvY3VtZW50IGZyb20gYW4gU1NMLXNlcnZlciB1c2luZyBteSBvd24KICAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24hIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgdG8gYmUgaW4gUEVNCiAgIGZvcm1hdC4gWW91IGRvIHRoYXQgdGhlIGVhc2llc3Qgd2F5IChhbHRob3VnaCBub3QgKnRoYXQqIGVhc3kpIGJ5CiAgIGRvd25sb2FkaW5nIHRoZSBTU0x5ZWF5IFBLQ1MjMTItcGF0Y2ggYnkgRHIgU3RlcGhlbiBOLiBIZW5zb24gZnJvbSBoaXMgc2l0ZQogICBhdDogaHR0cDovL3d3dy5kcmgtY29uc3VsdGFuY3kuZGVtb24uY28udWsvLiBVc2luZyBoaXMgdG9vbCwgeW91IGNhbgogICBjb252ZXJ0IGFueSBtb2Rlcm4gTmV0c2NhcGUgb3IgKGV2ZW4pIE1TSUUgY2VydGlmaWNhdGUgdG8gUEVNLWZvcm1hdC4gIFVzZQogICBpdCB3aXRoICdjdXJsIC1FIDxjZXJ0aWZpY2F0ZTpwYXNzd29yZD4gaHR0cHM6Ly9zaXRlLmNvbScuICBJZiB0aGlzIGlzbid0IGEKICAgY29vbCBmZWF0dXJlLCB0aGVuIEkgZG9uJ3Qga25vdyB3aGF0IGNvb2wgZmVhdHVyZXMgbG9vayBsaWtlISA7LSkKIC0gV29ya2luZyBzbG93bHkgb24gdGVsbmV0IGNvbm5lY3Rpb25zLiAjZGVmaW5lIFRSWV9URUxORVQgdG8gdHJ5IGl0IG91dC4KICAgKGN1cmwgLXUgdXNlcjpwYXNzd2QgInRlbG5ldDovL2hvc3QuY29tL2NhdCAubG9naW4iIGlzIG9uZSBleGFtcGxlKSBJIGRvCiAgIGhhdmUgcHJvYmxlbSB0byBkZWZpbmUgaG93IGl0IHNob3VsZCB3b3JrLiBUaGUgcHJpbWUgcHVycG9zZSBmb3IgdGhpcyBtdXN0CiAgIGJlIHRvIGdldCAoOGJpdCBjbGVhbikgZmlsZXMgdmlhIHRlbG5ldCwgYW5kIGl0IHJlYWxseSBpc24ndCB0aGF0IGVhc3kgdG8KICAgZ2V0IGZpbGVzIHRoaXMgd2F5LiBTdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBcbiBiZWluZyBjb252ZXJ0ZWQgdG8gXHJcbi4KCiBBbmd1cyBNYWNrYXkgKE5vdiAxMiwgMTk5OCkKIC0gQ29ycmVjdGVkIGFub3RoZXIgYnVnIGluIHRoZSBsb25nIHBhcmFtZXRlciBuYW1lIHBhcnNlci4KIC0gTW9kaWZpZWQgZ2V0cGFzcy5jIChOT1RFOiBzZWUgdGhlIHNwZWNpYWwgbGljZW5zaW5nIGluIHRoZSB0b3Agb2YgdGhhdAogICBzb3VyY2UgZmlsZSkuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTIsIDE5OTgpCiAtIFdlIG1heSBoYXZlIHJlbW92ZWQgdGhlIHNpbGx5IHdhcm5pbmdzIGZyb20gdXJsLmMgd2hlbiBjb21waWxlZCB1bmRlciBJUklYLgogICBUaGFua3MgYWdhaW4gdG8gQmpvcm4gUmVlc2UgYW5kIE1hcnRpbiBTdGFhZWwuCiAtIFdyb3RlIGZvcm1maW5kLnBsIHdoaWNoIGlzIGEgbmV3IHBlcmwgc2NyaXB0IGludGVuZGVkIHRvIGhlbHAgeW91IGZpbmQgb3V0CiAgIGhvdyBhIEZPUk0gc3VibWlzc2lvbiBzaG91bGQgYmUgZG9uZS4gVGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsgdG8gZ2V0CiAgIHJlYWxseSBnb29kLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDExLCAxOTk4KQogLSBNYWRlIHRoZSBIVFRQIGhlYWRlci1jaGVja2VyIGFjY2VwdCB3aGl0ZSBzcGFjZXMgYmVmb3JlIHRoZSBIVFRQLzEuPyBsaW5lLgogICBBcHBlYXJhbnRseSBzb21lIHByb3hpZXMvc2l0ZXMgYWRkIHN1Y2ggYXQgdGltZXMgKG15IHRlc3QgcHJveHkgZGlkIHdoZW4gSQogICBkb3dubG9hZGVkIGEgZ29waGVyIHBhZ2Ugd2l0aCBpdCkhCiAtIE1vdmVkIHRoZSBmb3JtZXIgLWggdG8gLU0gYW5kIG1hZGUgLWggc2hvdyB0aGUgc2hvcnQgaGVscCB0ZXh0IGluc3RlYWQuIEkKICAgaGFkIHRvIGVuYWJsZSBhIGZvcmNlZCBoZWxwIHRleHQgb3B0aW9uLiBOb3cgYW4gZXZlbiBzaG9ydGVyIGhlbHAgdGV4dCB3aWxsCiAgIGJlIHByZXNlbnRlZCB3aGVuIGFuIHVua25vd24gb3B0aW9uIGFuZCBzaW1pbGFyLCBpcyB1c2VkLgogLSBzdGRjaGVhZGVycy5oIGRpZG4ndCB3b3JrIHdpdGggSVJJWCA2LjQgbmF0aXZlIGNjIGNvbXBpbGVyLiBJIGhvcGUgbXkKICAgY2hhbmdlcyBkb24ndCBtYWtlIG90aGVyIHZlcnNpb25zIGdvIG51dHMgaW5zdGVhZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMCwgMTk5OCkKIC0gQWRkZWQgYSB3ZWlyZCBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgdGhlIHNpbGx5IEFJWAogICB3YXJuaW5ncyBhYm91dCBteSAjZGVmaW5lIHN0cmNhc2VjbXAoKSBzdHVmZi4gSSBkbyB0aGF0IGRlZmluZSB0byBwcmV2ZW50CiAgIG1lIGFuZCBvdGhlciBjb250cmlidXRvcnMgdG8gYWNjaWRlbnRhbHkgdXNlIHRoYXQgZnVuY3Rpb24gbmFtZSBpbnN0ZWFkCiAgIG9mIHN0cmVxdWFsKCkuLi4KIC0gSSBidWdmaXhlZCBBbmd1cydzIGdldHBhc3MuYyB2ZXJ5IGxpdHRsZS4KIC0gRml4ZWQgdGhlIHZlcmJvc2UgZmxhZyBuYW1lcyB0byBnZXRvcHQtc3R5bGUsIGkuZSAnY3VybCAtLWxvYycgd2lsbCBiZQogICBzdWZmaWNpZW50IGluc3RlYWQgb2YgLS1sb2NhdGlvbiBhcyAibG9jIiBpcyBhIHVuaXF1ZSBwcmVmaXguIEFsc28sIGFueXRoaW5nCiAgIGFmdGVyIGEgJy0tJyBpcyB0cmVhdGVkIGFzIGFuIFVSTC4gU28gaWYgeW91IGRvIGhhdmUgYSBob3N0IHdpdGggYSB3ZWVlaXJkCiAgIG5hbWUgeW91IGNhbiBkbyAnY3VybCAtLSAtaG9zdC5jb20nLgogLSBBbm90aGVyIGdldG9wdC1hZGp1c3Q7IGN1cmwgbm93IGFjY2VwdHMgZmxhZ3MgYWZ0ZXIgdGhlIFVSTCBvbiB0aGUgY29tbWFuZAogICBsaW5lLiAnY3VybCB3d3cuZm9vLmNvbSAtTycgaXMgcGVyZmVjdGx5IHZhbGlkLgogLSBDb3JyZWN0ZWQgdGhlIC5jdXJscmMgcGFyc2VyIHNvIHRoYXQgc3RydG9rKCkgaXMgbm8gbG9uZ2VyIHVzZWQgYW5kIEkKICAgYmVsaWV2ZSBpdCB3b3JrcyBiZXR0ZXIuIEV2ZW4gVVJMcyBjYW4gYmUgc3BlY2lmaWVkIGluIGl0IG5vdy4KCiBBbmd1cyBNYWNrYXkgKE5vdiA5LCAxOTk4KQogLSBSZXBsYWNlZCBnZXRwYXNzLmMgd2l0aCBhIG5ld2x5IHdyaXR0ZW4gb25lLCBub3QgdW5kZXIgR1BMIGxpY2Vuc2UKIC0gQ2hhbmdlZCBPUyB0byBhICNkZWZpbmUgaW4gY29uZmlnLmggaW5zdGVhZCBvZiBjb21waWxlciBmbGFnCiAtIE1ha2VmaWxlIG5vdyB1c2VzIC1ESEFWRV9DT05GSUdfSAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDksIDE5OTgpCiAtIE9rLCBJIGV4cGFuZGVkIHRoZSB0Z3otdGFyZ2V0IHRvIHVwZGF0ZSB0aGUgdmVyc2lvbiBzdHJpbmcgb24gZWFjaCBvY2NhdGlvbgogICBJIGJ1aWxkIGEgcmVsZWFzZSBhcmNoaXZlIQogLSBJIHJlYWN0ZWQgb24gQW5ndXMgTWFja2F5J3MgaW5pdGlhdGl2ZSBhbmQgcmVtYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2VyIHRvCiAgIGJlIG1vcmUgZ2V0b3B0IGNvbXBsaWFudC4gQ3VybCBub3cgc3VwcG9ydHMgIm1lcmdlZCIgZmxhZ3MgYXMgaW4KCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIGhlbHBlZCBtZSBkZXNpZ24gdGhlIHVzZXIKICAgaW50ZXJmYWNlIGZvciB0aGlzIGJlYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHF1aXRlIHNvbWUgZG9jcywKICAgc2luY2UgaXQgaGFzIHR1cm5lZCBvdXQgbm90IG9ubHkgcXVpdGUgY2FwYWJsZSwgYnV0IGFsc28gY29tcGxpY2F0ZWQhIDotKQogLSBBIG5vdGUgaGVyZSwgc2luY2UgSSd2ZSByZWNlaXZlZCBtYWlsIGFib3V0IGl0LiBTU0xlYXkgdmVyc2lvbnMgcHJpb3IgdG8KICAgMC44IHdpbGwgKm5vdCogd29yayB3aXRoIGN1cmwhCiAtIFdpbCBMYW5nZm9yZCByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBidWcgaW4gbXkgZ2V0ZW52KCJIT01FIikKICAgdXNhZ2UgZm9yIHdpbjMyIHN5c3RlbXMuIEkgaW50cm9kdWNlIGdldGVudi5jIHRvIGJldHRlciBjb3BlIHdpdGgKICAgdGhpcy4gTXIgRW5nZWwgaGVscHMgbWUgd2l0aCB0aGUgZGV0YWlscyBhcm91bmQgdGhhdC4uLgogLSBBIGxpdHRsZSBub3RlIHRvIG15c2VsZiBhbmQgb3RoZXJzLCBJIHNob3VsZCBtYWtlIHRoZSB3aW4zMi1iaW5hcnkgYnVpbHQKICAgd2l0aCBTU0wgc3VwcG9ydC4uLgogLSBSeWFuIE5lbHNvbiBzZW50IG1lIGNvbW1lbnRzIGFib3V0IGJ1aWxkaW5nIGN1cmwKICAgd2l0aCBTU0wgdW5kZXIgRnJlZUJTRC4gU2VlIHRoZSBNYWtlZmlsZSBmb3IgZGV0YWlscy4gVXNpbmcgdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQsIGl0IHNob3VsZCB3b3JrIGJldHRlciBhbmQgYXV0b21hdGljYWxseSBub3cuLi4KIC0gQ2xlYW5lZCB1cCBpbiB0aGUgcG9ydCBudW1iZXIgbWVzcyBpbiB0aGUgc291cmNlLiBObyBsb25nZXIgc3RvcmVzIGFuZCB1c2VzCiAgIHByb3h5IHBvcnQgbnVtYmVyIHNlcGFyYXRlIGZyb20gbm9ybWFsIHBvcnQgbnVtYmVyLgogLSAnY29uZmlndXJlJyBzY3JpcHQgd29ya2luZy4gQ29uZmlybWVkIGNvbXBpbGVzIG9uOgogICAgSG9zdCAgICAgICAgIFNTTCAgQ29tcGlsZXIKICAgIFN1bk9TIDUuNSAgICBubyAgIGdjYwogICAgU3VuT1MgNS41LjEgIHllcyAgZ2NjCiAgICBTdW5PUyA1LjYgICAgbm8gICBjYyAgKHdpdGggZ2NjLCBpdCBoYXMgdGhlICJnY2MgaW5jbHVkZSBmaWxlcyIgcHJvYmxlbSkKICAgIFN1bk9TIDQuMS4zICBubyAgIGdjYyAod2l0aG91dCBBTlNJIEMgaGVhZGVycykKICAgIFN1bk9TIDQuMS4yICBubyAgIGdjYyAobmF0aXZlIGNvbXBpbGVyIGZhaWxlZCkKICAgIExpbnV4IDIuMC4xOCBubyAgIGdjYwogICAgTGludXggMi4wLjMyIHllcyAgZ2NjCiAgICBMaW51eCAyLjAuMzUgbm8gICBnY2MgKHdpdGggZ2xpYmMpCiAgICBJUklYIDYuMiAgICAgbm8gICBnY2MgKGNjIGNvbXBpbGVzIGdlbmVyYXRlIGEgZmV3IHdhcm5pbmdzKQogICAgSVJJWCA2LjQgICAgIG5vICAgY2MgIChnZW5lcmF0ZWQgd2FybmluZ3MgdGhvdWdoKQogICAgV2luMzIgICAgICAgIG5vICAgQm9ybGFuZAogICAgT1NGNC4wCSBubyAgID8KCiAtIE9vb3BzLiBUaGUgNWJldGEgKGFuZCA0LjEwKSB1bmRlciB3aW4zMiBmYWlsZWQgaWYgdGhlIEhPTUUgdmFyaWFibGUgd2Fzbid0CiAgIHNldC4KIC0gV2hlbiB1c2luZyBhIHByb3h5LCBjdXJsIG5vdyBndWVzc2VzIGFuZCB1c2VzIHRoZSBwcm90b2NvbCBwYXJ0IGluIGNhc2VzCiAgIGxpa2U6CgljdXJsIC14IHByb3h5OjgwIHd3dy5zaXRlLmNvbQogICBQcm94aWVzIG5vcm1hbGx5IGdvIG51dHMgdW5sZXNzIGh0dHA6Ly8gaXMgcHJlcGVuZGVkIHRvIHRoZSBob3N0IG5hbWUsIHNvCiAgIGlmIGN1cmwgaXMgdXNlZCBsaWtlIHRoaXMsIGl0IGd1ZXNzZXMgcHJvdG9jb2wgYW5kIGFwcGVuZHMgdGhlIHByb3RvY29sCiAgIHN0cmluZyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcHJveHkuIEl0IGFscmVhZHkgZGlkIHRoaXMgd2hlbiB1c2VkCiAgIHdpdGhvdXQgcHJveHkuCiAtIEJldHRlciBwb3J0IHVzYWdlIHdpdGggU1NMIHRocm91Z2ggcHJveHkgbm93LiBJZiB5b3Ugc3BlY2lmaWVkIGEgZGlmZmVyZW50CiAgIGh0dHBzLXBvcnQgd2hlbiBhY2Nlc3NpbmcgdGhyb3VnaCBhIHByb3h5LCBpdCBkaWRuJ3QgdXNlIHRoYXQgbnVtYmVyCiAgIGNvcnJlY3RseS4gSSBhbHNvIHJld3JvdGUgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIHN0dWZmIHJlYWQgZnJvbSB0aGUKICAgcHJveHkgd2hlbiB5b3Ugd2FubmEgY29ubmVjdCB0aHJvdWdoIGl0IHdpdGggU1NMLgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgd29yayBhcm91bmQgb25lIG9mIHRoZSBjb21waWxlcgogICB3YXJuaW5ncyBvbiBJUklYIG5hdGl2ZSBjYyBjb21waWxlcy4KClZlcnNpb24gNC4xMCAoT2N0IDI2LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEpvaG4gQS4gQnJpc3RvciBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIHN1Z2dlc3RlZCBjdXJsIHdvdWxkIHN1cHBvcnQgY29va2llcy4KICAgSSBhZGRlZCAtYi8tLWNvb2tpZSB0byBlbmFibGUgZnJlZS10ZXh0IGNvb2tpZSBkYXRhIHRvIGJlIHBhc3NlZC4gVGhlcmUncwogICBhbHNvIGEgbGl0dGxlIGJsdXJiIGFib3V0IGdlbmVyYWwgY29va2llIHN0dWZmIGluIHRoZSBSRUFETUUvaGVscCB0ZXh0LgogLSBkbWggPGRtaCBhdCBqZXQuZXM+IHN1Z2dlc3RlZCBIVFRQIHJlc3VtZSBjYXBhYmlsaXRpZXMuIEFsdGhvdWdoIHlvdSBjb3VsZAogICBtYW51YWxseSBnZXQgY3VybCB0byByZXN1bWUgSFRUUCBkb2N1bWVudHMsIEkgbWFkZSB0aGUgLWMgcmVzdW1lIGZsYWcgd29yawogICBmb3IgSFRUUCB0b28gKHVubGVzcyAtciBpcyB1c2VkIHRvbywgd2hpY2ggd291bGQgYmUgdmVyeSBvZGQgYW55d2F5KS4KIC0gQWRkZWQgY2hlY2tsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gSXQgaXMgYSBzdGlsbCBleHBlcmltZW50YWwgcGVybCBzY3JpcHQKICAgdGhhdCBjaGVja3MgYWxsIGxpbmtzIG9mIGEgd2ViIHBhZ2UgYnkgdXNpbmcgY3VybC4KIC0gUmVhcnJhbmdlZCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkgYSBsaXR0bGUuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIGluIHRoZQogICBzcmMvIGRpciBmcm9tIG5vdyBvbiEKIC0gVmVyc2lvbiA0LjkgYW5kIGhlcmVhZnRlciwgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZS4KICAgSSBoYXZlIG5vdyB1cGRhdGVkIHRoZSBMRUdBTCBmaWxlIGV0YyBhbmQgbm93IHRoaXMgaXMgcmVsZWFzZWQgdXNpbmcgdGhlCiAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgdG8gYXZvaWQgdGhlIHBsYWd1ZSBrbm93biBhcyAidGhlIEdQTCB2aXJ1cyIuIFlvdQogICBtdXN0IG1ha2UgdGhlIHNvdXJjZSBhdmFpbGFibGUgaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYW5kL29yIHJlZGlzdHJpYnV0ZQogICBjdXJsLCBidXQgaWYgeW91IGRlY2lkZSB0byB1c2UgY3VybCB3aXRoaW4gc29tZXRoaW5nIGVsc2UgeW91IGRvIG5vdCBuZWVkCiAgIHRvIG9mZmVyIHRoZSB3b3JsZCB0aGUgc291cmNlIHRvIHRoYXQgdG9vLgogLSBDdXJsIGRpZCBub3QgbGlrZSBIVFRQIHNlcnZlcnMgdGhhdCBzZW50IG5vIGhlYWRlcnMgYXQgYWxsIG9uIGEgR0VUCiAgIHJlcXVlc3QuICBJdCBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyMDY4IGJ1dCBhcHBlYXJhbnRseSBzb21lIHNlcnZlcnMgZG8KICAgdGhhdCBhbnl3YXkuICBUaGFua3MgdG8gR29yZG9uIEJlYXRvbiBmb3IgdGhlIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbC4gVGhpcyBtYWtlcwogICBjdXJsIEFUVEVNUFQgdG8gZm9sbG93IHRoZSBMb2NhdGlvbjogcmVkaXJlY3QgaWYgb25lIGlzIHByZXNlbnQgaW4gdGhlIEhUVFAKICAgaGVhZGVycy4gSWYgLWkgb3IgLUkgaXMgdXNlZCB3aXRoIHRoaXMgZmxhZywgeW91IHdpbGwgc2VlIGhlYWRlcnMgZnJvbSBhbGwKICAgc2l0ZXMgdGhlIExvY2F0aW9uOiBwb2ludHMgdG8uIERvIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VydmVyIGNhbiBwb2ludCB0byBhCiAgIHNlY29uZCB0aGF0IHBvaW50cyB0byBhIHRoaXJkIGV0Yy4gSXQgc2VlbXMgdGhlIExvY2F0aW9uOiBwYXJhbWV0ZXIgKHNhaWQKICAgdG8gYmUgYW4gQWJzb2x1dGVVUkkgaW4gUkZDMjA2OCkgaXNuJ3QgYWx3YXlzIGFic29sdXRlLi4gOi0vIEFueXdheSwgSSd2ZQogICBtYWRlIGN1cmwgQVRURU1QVCB0byBkbyB0aGUgYmVzdCBpdCBjYW4gdG8gZGVhbCB3aXRoIHRoZSByZWFsaXR5LgogLSBBZGRlZCBnZXRsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gZ2V0bGlua3MucGwgc2VsZWN0aXZlbHkgZG93bmxvYWRzCiAgIGZpbGVzIHRoYXQgYSB3ZWIgcGFnZSBsaW5rcyB0by4KClZlcnNpb24gNC44LjQKIERhbmllbCBTdGVuYmVyZwogLSBBcyBKdWxpYW4gUm9tZXJvIE5pZXRvIHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIHBvaW50ZWQgb3V0LCB0aGUgd2luMzIgdmVyc2lvbiBvZiA0LjggKGFuZCBwcm9iYWJseSBhbGwKICAgb3RoZXIgdmVyc2lvbnMgZm9yIHdpbjMyKSBkaWRuJ3Qgd29yayB3aXRoIGJpbmFyeSBmaWxlcyBzaW5jZSBJJ20gdG9vIHVzZWQKICAgdG8gdGhlIFVuaXggc3R5bGUgZm9wZW4oKSB3aGVyZSBiaW5hcnkgYW5kIHRleHQgZG9uJ3QgZGlmZmVyLi4uCiAtIFJhbHBoIEJlY2ttYW5uIGJyb3VnaHQgbWUgc29tZSBjaGFuZ2VzIHRoYXQgbGV0cyBjdXJsIGNvbXBpbGUgZXJyb3IgYW5kCiAgIHdhcm5pbmcgZnJlZSB3aXRoIC1XYWxsIC1wZWRhbnRpYyB3aXRoIGcrKy4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvCiAgIGNsZWFuIG9mZiBzb21lIHVudXNlZCB2YXJpYWJsZXMgYW5kIHNpbWlsYXIuCiAtIFJhbHBoIEJlY2ttYW5uIG1hZGUgbWUgYXdhcmUgb2YgYSByZWFsbHkgb2RkIGJ1ZyBub3cgY29ycmVjdGVkLiBXaGVuIGN1cmwKICAgcmVhZCBhIHNldCBvZiBoZWFkZXJzIGZyb20gYSBIVFRQIHNlcnZlciwgZGl2aWRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgcmVhZAogICBhbmQgdGhlIGZpcnN0IHJlYWQgc2hvd2VkIGEgZnVsbCBsaW5lICpleGFjdGx5KiAoaS5lIGVuZGluZyB3aXRoIGEKICAgbmV3bGluZSksIGN1cmwgZGlkIG5vdCBiZWhhdmUgd2VsbC4KClZlcnNpb24gNC44LjMKIERhbmllbCBTdGVuYmVyZwogLSBJIHdhcyB0b28gcXVpY2sgdG8gcmVsZWFzZSA0LjguMiB3aXRoIHRvbyBsaXR0bGUgdGVzdGluZy4gT25lIG9mIHRoZQogICBjaGFuZ2VzIGlzIG5vdyByZXZlcnRlZCBzbGlnaHRseSB0byB0aGUgNC44LjEgd2F5IHNpbmNlIDQuOC4yIGNvdWxkbid0CiAgIHVwbG9hZCBmaWxlcy4gSSBzdGlsbCB0aGluayBib3RoIHByb2JsZW1zIGNvcnJlY3RlZCBpbiA0LjguMiByZW1haW4KICAgY29ycmVjdGVkLiAgUmVwb3J0ZWQgYnkgSnVsaWFuIFJvbWVybyBOaWV0by4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiByZXBvcnRlZCB0d28gRlRQIHByb3RvY29sIGVycm9ycyBjdXJsIGRpZC4gVGhleSdyZSBub3cKICAgY29ycmVjdGVkLiBCb3RoIGFwcGVhcmVkIHdoZW4gZ2V0dGluZyBmaWxlcyBmcm9tIGEgTVMgRlRQIHNlcnZlciEgOi0pCgpWZXJzaW9uIDQuOC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBsYXN0IHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gVGhlCiAgIGZpbmFsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGRpZG4ndCBoYXZlIHRvIGJlIHRoZSBmaW5hbCBzaXplIHRyYW5zZmVyZWQKICAgd2hpY2ggbWFkZSBpdCBzb21ldGltZXMgbG9vayBvZGQuCiAtIFRoYW5rcyB0byBEYXZpZCBMb25nIEkgZ290IHJpZCBvZiBhIHNpbGx5IGJ1ZyB0aGF0IGhhcHBlbmVkIGlmIGEgSFRUUC1wYWdlCiAgIGhhZCBub3RoaW5nIGJ1dCBoZWFkZXIuIEFwcGVhcmFudGx5IFNvbGFyaXMgZGVhbHMgd2l0aCBuZWdhdGl2ZSBzaXplcyBpbgogICBmd3JpdGUoKSBjYWxscyBhIGxvdCBiZXR0ZXIgdGhhbiBMaW51eCBkb2VzLi4uID1CLV0KClZlcnNpb24gNC44IChBdWcgMzEsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ29udGludWUgRlRQIGZpbGUgdHJhbnNmZXIuIC1jIGlzIHRoZSBzd2l0Y2guIE5vdGUgdGhhdCB5b3UgbmVlZCB0bwogICBzcGVjaWZ5IGEgZmlsZSBuYW1lIGlmIHlvdSB3YW5uYSByZXN1bWUgYSBkb3dubG9hZCAoeW91IGNhbid0IHJlc3VtZSBhCiAgIGRvd25sb2FkIHNlbnQgdG8gc3Rkb3V0KS4gUmVzdW1pbmcgdXBsb2FkIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBzZXJ2ZXIKICAgc2luY2UgY3VybCBpcyB0aGVuIHVzaW5nIHRoZSBub24tUkZDOTU5IGNvbW1hbmQgU0laRSB0byBnZXQgdGhlIHNpemUgb2YKICAgdGhlIHRhcmdldCBmaWxlIGJlZm9yZSB1cGxvYWQgYmVnaW5zICh0byBmaWd1cmUgb3V0IHdoaWNoIG9mZnNldCB0bwogICB1c2UpLiBVc2UgLUMgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IHlvdXJzZWxmISAtQyBpcyBoYW5keSBpZiB5b3UncmUgZG9pbmcKICAgdGhlIG91dHB1dCB0byBzb21ldGhpbmcgZWxzZSBidXQgYSBwbGFpbiBmaWxlIG9yIHdoZW4geW91IGp1c3Qgd2FudCB0byBnZXQKICAgdGhlIGVuZCBvZiBhIGZpbGUuCiAtIHJlY3Vyc2l2ZWZ0cGdldC5wbCBub3cgZmVhdHVyZXMgYSBtYXhpbXVtIHJlY3Vyc2l2ZSBsZXZlbCBhcmd1bWVudC4KClZlcnNpb24gNC43CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgc3VwcG9ydCB0byBhYm9ydCBhIGRvd25sb2FkIGlmIHRoZSBzcGVlZCBpcyBiZWxvdyBhIGNlcnRhaW4gYW1vdW50CiAgIChzcGVlZC1saW1pdCkgYnl0ZXMgcGVyIHNlY29uZCBmb3IgYSBjZXJ0YWluIChzcGVlZC10aW1lKSB0aW1lLgogLSBXcm90ZSBhIHBlcmwgc2NyaXB0ICdyZWN1cnNpdmVmdHBnZXQucGwnIHRvIHJlY3Vyc2l2ZWx5IHVzZSBjdXJsIHRvIGdldCBhCiAgIHdob2xlIGZ0cCBkaXJlY3RvcnkgdHJlZS4gSXQgaXMgbWVhbnQgYXMgYW4gZXhhbXBsZSBvZiBob3cgY3VybCBjYW4gYmUKICAgdXNlZC4gIEkgYWdyZWUgaXQgaXNuJ3QgdGhlIHdpc2VzdCB0aGluZyB0byBkbyB0byBtYWtlIGEgc2VwYXJhdGUgbmV3CiAgIGNvbm5lY3Rpb24gZm9yIGVhY2ggZmlsZSBhbmQgZGlyZWN0b3J5IGZvciB0aGlzLgoKVmVyc2lvbiA0LjYKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGZpcnN0IGF0dGVtcHQgdG8gb3B0aW9uYWxseSBwYXJzZSB0aGUgLm5ldHJjIGZpbGUgZm9yIGxvZ2luIHVzZXIKICAgYW5kIHBhc3N3b3JkLiBJZiB1c2VkIHdpdGggaHR0cCwgaXQgZW5hYmxlcyB1c2VyIGF1dGhlbnRpY2F0aW9uLiAtbiBpcwogICB0aGUgbmV3IHN3aXRjaC4KIC0gUmVtb3ZlZCB0aGUgZXh0cmEgbmV3bGluZXMgb24gdGhlIGRlZmF1bHQgdXNlci1hZ2VudCBzdHJpbmcuCiAtIENvcnJlY3RlZCB0aGUgbWlzc2luZyBmdHAgdXBsb2FkIGVycm9yIG1lc3NhZ2VzIHdoZW4gaXQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgIHZlcmJvc2UgZmxhZyBzZXQuIEdhcnkgVy4gU3dlYXJpbmdlbiBmb3VuZCBpdC4KIC0gTm93IHVzaW5nIGFsYXJtKCkgdG8gZW5hYmxlIHNlY29uZC1wcmVjaXNpb24gdGltZW91dCBldmVuIG9uIHRoZSBuYW1lCiAgIHJlc29sdmluZy9jb25uZWN0aW5nIHBoYXNlLiBUaGUgdGltZW91dCBpcyBhbHRob3VnaCByZXNldCBhZnRlciB0aGF0IGZpcnN0CiAgIHNlcXVlbmNlLiAoVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkLikgR2FyeSBXLiBTd2VhcmluZ2VuIHJlcG9ydGVkLgogLSBOb3cgc3BlbGxzICJVbmtub3duIiBwcm9wZXJseSwgYXMgaW4gIlVua25vd24gb3B0aW9uICd6JyIuLi4gOi0pCiAtIEFkZGVkIGJ1ZyByZXBvcnQgZW1haWwgYWRkcmVzcyBpbiB0aGUgUkVBRE1FLgogLSBBZGRlZCBhICJjdXJyZW50IHNwZWVkIiBmaWVsZCB0byB0aGUgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dzIHRoZSBhdmVyYWdlCiAgIHNwZWVkIHRoZSBsYXN0IDUgc2Vjb25kcy4gVGhlIG90aGVyIHNwZWVkIGZpZWxkIHNob3dzIHRoZSBhdmVyYWdlIHNwZWVkIG9mCiAgIHRoZSBlbnRpcmUgdHJhbnNmZXIgc28gZmFyLgoKVmVyc2lvbiA0LjUuMQogTGluYXMgVmVwc3RhcwogLSBTU0wgdGhyb3VnaCBwcm94eSBmaXgKIC0gQWRkZWQgLUEgdG8gYWxsb3cgVXNlci1BZ2VudDogY2hhbmdlcwoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtQSB3b3JrIHdoZW4gU1NMLXRocm91Z2gtcHJveHkuCgpWZXJzaW9uIDQuNQogTGluYXMgVmVwc3RhcwogLSBNb3JlIFNTTCBjb3JyZWN0aW9ucwogLSBJJ3ZlIGFkZGVkIGEgcG9ydCB0byBBSVguCiAtIHJ1bm5pbmcgU1NMIHRocm91Z2ggYSBwcm94eSBjYXVzZXMgYSBjaHVuayBvZiBjb2RlIHRvIGJlIGV4ZWN1dHJlZCB0d2ljZS4KICAgb25lIG9mIHRob3NlIGJsb2NrcyBuZWVkcyB0byBiZSBkZWxldGVkLgoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIC1pIGFuZCAtSSB3b3JrIGFnYWluCgpWZXJzaW9uIDQuNAogTGluYXMgVmVwc3RhcwogLSAteCBjYW4gbm93IGFsc28gc3BlY2lmeSBwcm94eXBvcnQgd2hlbiB1c2VkIGFzIGluICdwcm94eWhvc3Q6cHJveHlwb3J0JwogLSBTU0wgZml4ZXMKClZlcnNpb24gNC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgdG8gY29tcGlsZSB1bmRlciB3aW4zMiAoVmlzdWFsQysrIDUpLiBUaGUgLVAgc3dpdGNoIGRvZXMgbm90CiAgIHN1cHBvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZXMgaW4gd2luMzIuIEkgY291bGRuJ3QgZmlndXJlIG91dCBob3chCgpWZXJzaW9uIDQuMgogTGluYXMgVmVwc3RhcyAvIFNhbXBvIEtlbGxvbWFraQogLSBBZGRlZCBTU0wgLyBTU0xlYXkgc3VwcG9ydCAoaHR0cHM6Ly8pCiAtIEFkZGVkIHRoZSAtVCB1c2FnZSBmb3IgSFRUUCBQT1NULgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgU1NMIGltcGxlbWVudGF0aW9uLgogLSBNYWRlIC1QIGEgbG90IGJldHRlciB0byB1c2Ugb3RoZXIgSVAgYWRkcmVzc2VzLiBJdCBub3cgYWNjZXB0cyBhIGZvbGxvd2luZwogICBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyCiAgICAgICAgaW50ZXJmYWNlIC0gaS5lICJldGgwIiB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSdzIElQIGFkZHJlc3MgeW91CiAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UKICAgICAgICBJUCBhZGRyZXNzIC0gaS5lICIxOTIuMTY4LjEwLjEiIHRvIHNwZWNpZnkgZXhhY3QgSVAgbnVtYmVyCiAgICAgICAgaG9zdCBuYW1lIC0gaS5lICJteS5ob3N0LmRvbWFpbiIgdG8gc3BlY2lmeSBtYWNoaW5lCiAgICAgICAgIi0iICAgICAgIC0gKGFueSBzaW5nbGUtbGV0dGVyIHN0cmluZykgdG8gbWFrZSBpdCBwaWNrIHRoZSBtYWNoaW5lJ3MKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAtIFRoZSBNYWtlZmlsZSBpcyBub3cgcmVhZHkgdG8gY29tcGlsZSBmb3Igc29sYXJpcywgc3Vub3M0IGFuZCBsaW51eCByaWdodAogICBvdXQgb2YgdGhlIGJveC4KIC0gQmV0dGVyIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBzZWVuIHdpdGggJ2N1cmwgLVYnCgpWZXJzaW9uIDQuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBJUCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgYXMgYSByZXBseSB0byBQQVNWIGRvZXMgbm8gbG9uZ2VyCiAgIGhhdmUgdG8gRE5TIHJlc29sdmUuIEluIGZhY3QsIG5vIElQLW51bWJlci1vbmx5IGFkZHJlc3NlcyBoYXZlIHRvIGFueW1vcmUuCiAtIEJpbmRzIGJldHRlciB0byBhdmFpbGFibGUgcG9ydCB3aGVuIC1QIGlzIHVzZWQuCiAtIE5vdyBMSVNUcyAuLyBpbnN0ZWFkIG9mIC8gd2hlbiB1c2VkIGFzIGluIGZ0cDovL2Z0cC5mdW5ldC5maS8uIFRoZSByZWFzb24KICAgZm9yIHRoaXMgaXMgdGhhdCBleGFjdGx5IHRoYXQgc2l0ZSwgZnRwLmZ1bmV0LmZpLCBkb2VzIG5vdCBhbGxvdyBMSVNUIC8KICAgd2hpbGUgTElTVCAuLyBpcyBmaW5lLiBBbnkgb2JqZWN0aW9ucz8KClZlcnNpb24gNCAoMTk5OC0wMy0yMCkKIERhbmllbCBTdGVuYmVyZwogLSBJIHRvb2sgYW5vdGhlciBodWdlIHN0ZXAgYW5kIGNoYW5nZWQgYm90aCB2ZXJzaW9uIG51bWJlciBhbmQgcHJvamVjdCBuYW1lIQogICBUaGUgcmVhc29uIGZvciB0aGUgbmV3IG5hbWUgaXMgdGhhdCB0aGVyZSBhcmUganVzdCBvbmUgdG9vIG1hbnkgcHJvZ3JhbXMKICAgbmFtZWQgdXJsZ2V0IGFscmVhZHkgYW5kIHRoaXMgcHJvZ3JhbSBhbHJlYWR5IGNhbiBhIGxvdCBtb3JlIHRoYW4gbWVyZWx5CiAgIGdldHRpbmcgVVJMcywgYW5kIHRoZSByZWFzb24gZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB0aGF0IEkgZGlkIGFkZCB0aGUKICAgcHJldHR5IGJpZyBjaGFuZ2UgaW4gLVAgYW5kIHNpbmNlIEkgY2hhbmdlZCBuYW1lIEkgd2FudGVkIHRvIHN0YXJ0IHdpdGgKICAgc29tZXRoaW5nIGZyZXNoIQogLSBUaGUgLS1zdHlsZSBmbGFncyBhcmUgd29ya2luZyBiZXR0ZXIgbm93LgogLSBMaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGggRlRQIG9mdGVuIHJlcG9ydGVkIHRoYXQgdGhlIGZpbGUgdHJhbnNmZXIgd2FzCiAgIGluY29tcGxldGUuIFdyb25nIGFzc3VtcHRpb25zIHdlcmUgdG9vIGNvbW1vbiBmb3IgZGlyZWN0b3JpZXMsIHdoeSBubwogICBzaXplIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBjb21wYXJlZCBvbiB0aGVtIGZyb20gbm93IG9uLgogLSBJbXBsZW1lbnRlZCB0aGUgLVAgZmxhZyB0aGF0IGxldCdzIHRoZSBmdHAgY29udHJvbCBpc3N1ZSBhIFBPUlQgY29tbWFuZAogICBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBQQVNWLgogLSAtYSBmb3IgYXBwZW5kaW5nIEZUUCB1cGxvYWRzIHdvcmtzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpWZXJzaW9uIDMuMTIgKDE0IE1hcmNoIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gRW5kLW9mLWhlYWRlciB0cmFja2luZyBzdGlsbCBsYWNrZWQgc3VwcG9ydCBmb3IgXHJcbiBvciBqdXN0IFxuIGF0IHRoZQogICBlbmQgb2YgdGhlIGxhc3QgaGVhZGVyIGxpbmUuCiBTZXJnaW8gQmFycmVzaQogLSBBZGRlZCBQUk9YWSBhdXRoZW50aWNhdGlvbi4KIFJhZmFlbCBTYWd1bGEKIC0gRml4ZWQgc29tZSBsaXR0bGUgYnVncy4KClZlcnNpb24gMy4xMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBoZWFkZXIgcGFyc2luZyB3YXMgc3RpbGwgbm90IGNvcnJlY3Qgc2luY2UgdGhlIDMuMiBtb2RpZmljYXRpb24uLi4KClZlcnNpb24gMy4xMAogRGFuaWVsIFN0ZW5iZXJnCiAtIDMuNyBhbmQgMy45IHdlcmUgc2ltdWx0YW5lb3VzbHkgZGV2ZWxvcGVkIGFuZCBtZXJnZWQgaW50byB0aGlzIHZlcnNpb24uCiAtIEZUUCB1cGxvYWQgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBzaW5jZSAzLjIuCgpWZXJzaW9uIDMuOQogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCB0aGUgIi1lIDx1cmw+IC8gLS1yZWZlcmVyIDx1cmw+IiBvcHRpb24gd2hlcmUgd2UgY2FuIHNwZWNpZnkKICAgdGhlIHJlZmVyZXIgcGFnZS4gT2J2aW91c2x5LCB0aGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIGZvb2wgdGhlCiAgIHNlcnZlciwgYnV0Li4uCgpWZXJzaW9uIDMuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIE5vdyBjaGVja3MgdGhlIGxhc3QgZXJyb3IgY29kZSBzZW50IGZyb20gdGhlIGZ0cCBzZXJ2ZXIgYWZ0ZXIgYSBmaWxlIGhhcwogICBiZWVuIHJlY2VpdmVkIG9yIHVwbG9hZGVkLiBXYXNuJ3QgZG9uZSBwcmV2aW91c2x5LgogLSBXaGVuICd1cmxnZXQgPGhvc3Q+JyBpcyB1c2VkIHdpdGhvdXQgYSAncHJvdG9jb2w6Ly8nIGZpcnN0IGluIHRoZSBob3N0IHBhcnQsCiAgIGl0IG5vdyBjaGVja3MgZm9yIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBmdHAgb3IgZ29waGVyIGFuZCBpZiBpdCBkb2VzLAogICBpdCB1c2VzIHRoYXQgcHJvdG9jb2wgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGh0dHAuCgpWZXJzaW9uIDMuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIFNpbGx5IG1pc3Rha2UgbWFkZSB0aGUgUE9TVCBidWcuIFRoaXMgaGFzIG5vdyBhbHNvIGJlZW4gdGVzdGVkIHRvIHdvcmsgd2l0aAogICBwcm94eS4KClZlcnNpb24gMy41CiBEYW5pZWwgU3RlbmJlcmcKIC0gSGlnaGx5IGluc3BpcmVkIGJ5IFJhZmFlbCBTYWd1bGEncyBjaGFuZ2VzIHRvIHRoZSAzLjEgdGhhdCBhZGRlZCBhbiBhbG1vc3QKICAgZnVuY3Rpb25hbCBQT1NULCBJIGFwcGxpZWQgaGlzIGNoYW5nZXMgaW50byB0aGlzIHZlcnNpb24gYW5kIG1hZGUgdGhlbSB3b3JrLgogICAoSXQgc2VlbXMgUE9TVCByZXF1aXJlcyB0aGUgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LUxlbmd0aCBoZWFkZXJzLikgSXQgaXMKICAgbm93IHVzYWJsZSB3aXRoIHRoZSAtZCBzd2l0Y2guCgpWZXJzaW9uIDMuMyAtIDMuNAogUGFzc2VkIHRvIGF2b2lkIGNvbmZ1c2lvbnMKClZlcnNpb24gMy4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFqb3IgcmV3cml0ZSBvZiB0d28gY3J1Y2lhbCBwYXJ0cyBvZiB0aGlzIGNvZGU6IHVwbG9hZCBhbmQgZG93bmxvYWQuCiAgIFRoZXkgYXJlIGJvdGggbm93IHVzaW5nIGEgc2VsZWN0KCkgc3dpdGNoLCB0aGF0IGFsbG93cyBtdWNoIGJldHRlcgogICBwcm9ncmVzcyBtZXRlciBhbmQgdGltZSBjb250cm9sLgogLSBhbGFybSgpIHVzYWdlIHJlbW92ZWQgY29tcGxldGVseQogLSBGVFAgZ2V0IGNhbiBub3cgbGlzdCBkaXJlY3RvcnkgY29udGVudHMgaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggJy8nLgogICBVcmxnZXQgb24gYSBmdHAtcGF0aCB0aGF0IGRvZXNuJ3QgZW5kIHdpdGggYSBzbGFzaCBtZWFucyB1cmxnZXQgd2lsbAogICBhdHRlbXB0IGdldHRpbmcgaXQgYXMgYSBmaWxlIG5hbWUuCiAtIEZUUCBkaXJlY3RvcnkgdmlldyBzdXBwb3J0cyAtbCBmb3IgImxpc3Qtb25seSIgd2hpY2ggbGlzdHMgdGhlIGZpbGUgbmFtZXMKICAgb25seS4KIC0gQWxsIG9wZXJhdGlvbnMgc3VwcG9ydCAtbSBmb3IgbWF4IHRpbWUgdXNhZ2UgaW4gc2Vjb25kcyBhbGxvd2VkLgogLSBGVFAgdXBsb2FkIG5vdyBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHVwbG9hZGVkIGZpbGUgdG8gYmUgcHJvdmlkZWQsIGFuZAogICB0aHVzIGl0IGNhbiBiZXR0ZXIgY2hlY2sgaXQgYWN0dWFsbHkgdXBsb2FkZWQgdGhlIHdob2xlIGZpbGUuIEl0IGFsc28KICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGZvciB1cGxvYWRzIG11Y2ggYmV0dGVyIQogLSBNYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmYWlsIGluIGNhc2VzIGxpa2UgJ3VybGdldCAtciA5MDAnIHdoaWNoCiAgIHByZXZpb3VzbHkgdHJpZWQgdG8gY29ubmVjdCB0byB0aGUgaG9zdCBuYW1lZCAnOTAwJy4KClZlcnNpb24gMy4xCiBLamVsbCBFcmljc29uCiAtIFBvaW50ZWQgb3V0IGhvdyB0byBjb3JyZWN0IHRoZSAzIHdhcm5pbmdzIGluIHdpbjMyLWNvbXBpbGVzLgoKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIGFsbCBjYWxscyB0byBleGl0KCkuCiAtIE1hZGUgdGhlIHNob3J0IGhlbHAgdGV4dCBnZXQgd3JpdHRlbiB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuCiAtIE1hZGUgdGhpcyBmaWxlIGluc3RlYWQgb2Yga2VlcGluZyB0aGVzZSBjb21tZW50cyBpbiB0aGUgc291cmNlLgogLSBNYWRlIHR3byBjYWxsYmFjayBob29rcywgdGhhdCBlbmFibGUgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gdXNlIHVybGdldCgpCiAgIGVhc2llciBhbmQgdG8gZ3JhYiB0aGUgb3V0cHV0L29mZmVyIHRoZSBpbnB1dCBlYXNpZXIuCiAtIEl0IGlzIGV2aWRlbnQgdGhhdCBXaW4zMi1jb21waWxlcyBhcmUgcGFpbmZ1bC4gSSB3YXRjaGVkIHRoZSBvdXRwdXQgZnJvbQogICB0aGUgQm9ybGFuZCBDKysgdjUgYW5kIGl0IHdhcyBhd2Z1bC4gSnVzdCBpZ25vcmUgYWxsIHRob3NlIHdhcm5pbmdzLgoKVmVyc2lvbiAzLjAKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBGVFAgdXBsb2FkIGNhcGFiaWxpdGllcy4gVGhlIG5hbWUgdXJsZ2V0IGdldHMgYSBiaXQgc2lsbHkgbm93CiAgIHdoZW4gd2UgY2FuIHB1dCB0b28uLi4gPSkKIC0gUmVzdHJ1Y3R1cmVkIHRoZSBzb3VyY2UgcXVpdGUgYSBsb3QuCiAgIENoYW5nZWQgdGhlIHVybGdldCgpIGludGVyZmFjZS4gVGhpcyB3YXksIHdlIHdpbGwgc3Vydml2ZSBjaGFuZ2VzIG11Y2gKICAgYmV0dGVyLiBOZXcgZmVhdHVyZXMgY2FuIGNvbWUgYW5kIG9sZCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHVzIG5lZWRpbmcKICAgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UuIEkndmUgd3JpdHRlbiBhIHNtYWxsIGV4cGxhbmF0aW9uIGluIHVybGdldC5oCiAgIHRoYXQgZXhwbGFpbnMgaXQuCiAtIE5ldyBmbGFncyBpbmNsdWRlIC10LCAtVCwgLU8gYW5kIC1oLiBUaGUgLWggdGV4dCBpcyBnZW5lcmF0ZWQgYnkgdGhlIG5ldwogICBta2hlbHAgc2NyaXB0LgoKVmVyc2lvbiAyLjkKIFJlbWNvIHZhbiBIb29mZgogLSBBZGRlZCBhIGZpeCB0byBtYWtlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQW1pZ2EgdXNpbmcgdGhlIFNBUy9DCiAgIGNvbXBpbGVyLgoKIERhbmllbCBTdGVuYmVyZwogLSBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHRoZSBTVFVQSUQgTm92ZWxsIHdlYiBzZXJ2ZXIgc2VlbXMgdG8gcmVxdWlyZQogICB0aGF0IHRoZSBIb3N0OiBrZXl3b3JkIGlzIHVzZWQsIHNvIHdlbGwgSSB1c2UgaXQgYW5kIEkgKHJlLWludHJvZHVjZSkgdGhlCiAgIHVybGdldCBVc2VyLUFnZW50Oi4gSSBzdGlsbCBoYXZlIHRvIGNoZWNrIHRoYXQgdGhpcyBIb3N0OiB1c2FnZSB3b3JrcyB3aXRoCiAgIHByb3hpZXMuLi4gJ0hvc3Q6JyBpcyByZXF1aXJlZCBmb3IgSFRUUC8xLjEgR0VUIGFjY29yZGluZyB0byBSRkMyMDY4LgoKVmVyc2lvbiAyLjgKIFJhZmFlbCBTYWd1bGEKIC0gc29tZSBsaXR0bGUgbW9kaWZpY2F0aW9ucwoKVmVyc2lvbiAyLjcKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIHRoZSAtbCBvcHRpb24gYW5kIGludHJvZHVjZWQgdGhlIC1mIG9wdGlvbiBpbnN0ZWFkLiBOb3cgSSdsbAogICByZXdyaXRlIHRoZSBmb3JtZXIgLWwga2x1ZGdlIGluIGFuIGV4dGVybmFsIHNjcmlwdCB0aGF0J2xsIHVzZSB1cmxnZXQgdG8KICAgZmV0Y2ggbXVsdGlwYXJ0IGZpbGVzIGxpa2UgdGhhdC4KIC0gJy1mJyBpcyBpbnRyb2R1Y2VkLCBpdCBtZWFucyBGYWlsIHdpdGhvdXQgb3V0cHV0IGluIGNhc2Ugb2YgSFRUUCBzZXJ2ZXIKICAgZXJyb3JzIChyZXR1cm4gY29kZSA+PTQwMCkuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIC1yLCByYW5nZXMuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiBhIGRvY3VtZW50IHlvdQogICB3YW50LCBhbmQgb25seSB0aGF0IHBhcnQgaXMgcmV0dXJuZWQuIE9ubHkgd2l0aCBIVFRQLzEuMS1zZXJ2ZXJzLgogLSBTcGxpdCB1cCB0aGUgc291cmNlIGluIDMgcGFydHMuIE5vdyBhbGwgcHVyZSBVUkwgZnVuY3Rpb25zIGFyZSBpbgogICB1cmxnZXQuYyBhbmQgc3R1ZmYgdGhhdCBkZWFscyB3aXRoIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtIGlzIGluIG1haW4uYy4KIC0gSSB0b29rIGEgZmV3IG1pbnV0ZXMgYW5kIHdyb3RlIGFuIGVtYnJ5byBvZiBhIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4KICAgYSBmZXcgdGhpbmdzLgoKVmVyc2lvbiAyLjYKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtbCAobG9vcCkgdGhpbmcgdXNlIHRoZSBuZXcgQ09ORl9GQUlMT05FUlJPUiB3aGljaCBtYWtlcwogICB1cmxnZXQoKSByZXR1cm4gZXJyb3IgY29kZSBpZiBub24tc3VjY2Vzc2Z1bC4gSXQgYWxzbyB3b24ndCBvdXRwdXQgYW55dGhpbmcKICAgdGhlbi4gTm93IGZpbmFsbHkgcmVtb3ZlZCB0aGUgSFRUUCAxLjAgYW5kIGVycm9yIDQwNCBkZXBlbmRlbmNpZXMuCiAtIEFkZGVkIC1JIHdoaWNoIHVzZXMgdGhlIEhFQUQgcmVxdWVzdCB0byBnZXQgdGhlIGhlYWRlciBvbmx5IGZyb20gYQogICBodHRwLXNlcnZlci4KClZlcnNpb24gMi41CiBSYWZhZWwgU2FndWxhCiAtIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHVzZSBISEg6TU06U1MgaW5zdGVhZCBvZiBvbmx5IHNlY29uZHMuCgpWZXJzaW9uIDIuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHByb2dyZXNzIG1ldGVyLiBJdCBhcHBlYXJzIHdoZW4gZG93bmxvYWRpbmcgPiBCVUZGRVIgU0laRSBhbmQKICAgbXV0ZSBpcyBub3Qgc2VsZWN0ZWQuIEkgZm91bmQgb3V0IHRoYXQgd2hlbiBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBmcm9tCiAgIHJlYWxseSByZWFsbHkgc2xvdyBzaXRlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKICAgZG93bmxvYWQuIERvIG5vdGUgdGhhdCBzb21lIGRvd25sb2FkcyBhcmUgZG9uZSB1bmF3YXJpbmcgb2YgdGhlIHNpemUsIHdoaWNoCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBsZXNzIHRocmlsbGluZyA7KSBJZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gYSB0dHksCiAgIHRoZSBwcm9ncmVzcyBtZXRlciBpcyBzaHV0IG9mZi4KIC0gSW5jcmVhc2VkIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJlYWRpbmcuCiAtIEFkZGVkIGxlbmd0aCBjaGVja3MgaW4gdGhlIHVzZXIrcGFzc3dkIHBhcnNpbmcuCiAtIE1hZGUgaXQgZ3JvayB1c2VyK3Bhc3N3ZCBmb3IgSFRUUCBmZXRjaGVzLiBUaGUgdHJpY2sgaXMgdG8gYmFzZTY0CiAgIGVuY29kZSB0aGUgdXNlcitwYXNzd2QgYW5kIHNlbmQgYW4gZXh0cmEgaGVhZGVyIGxpbmUuIFJlYWQgY2hhcHRlciAxMS4xIGluCiAgIFJGQzIwNjggZm9yIGRldGFpbHMuIEkgYWRkZWQgaXQgdG8gYmUgdXNlZCBqdXN0IGxpa2UgdGhlIGZ0cCBvbmUuICBUbyBnZXQgYQogICBodHRwIGRvY3VtZW50IGZyb20gYSBwbGFjZSB0aGF0IHJlcXVpcmVzIHVzZXIgYW5kIHBhc3N3b3JkLCB1c2UgYW4gVVJMCiAgIGxpa2U6CgogICAgICAgIGh0dHA6Ly91c2VyOnBhc3N3ZEB3d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKICAgSSBhbHNvIGFkZGVkIHRoZSAtdSBmbGFnLCBzaW5jZSBXSEVOIFVTSU5HIEEgUFJPWFkgWU9VIENBTidUIFNQRUNJRlkgVEhFCiAgIFVTRVIgQU5EIFBBU1NXT1JEIFdJVEggSFRUUCBMSUtFIFRIQVQuIFRoZSAtdSBmbGFnIHdvcmtzIGZvciBmdHAgdG9vLCBidXQKICAgbm90IGlmIHVzZWQgd2l0aCBwcm94eS4gVG8gZG8gdGhlIHNhbWUgYXMgdGhlIGFib3ZlIG9uZSwgeW91IGNhbiBpbnZva2U6CgogICAgICAgIHVybGdldCAtdSB1c2VyOnBhc3N3ZCBodHRwOi8vd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKClZlcnNpb24gMi4zCiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkICItbyIgb3B0aW9uIChvdXRwdXQgZmlsZSkKIC0gQWRkZWQgVVJHX0hUVFBfTk9UX0ZPVU5EIHJldHVybiBjb2RlLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFBlcmhhcHMgd2Ugc2hvdWxkIGRldGVjdCBhbGwga2luZHMgb2YgZXJyb3JzIGFuZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhhdAogICBjdXN0b20gc3RyaW5nIGZvciB0aGUgcGFydGljdWxhciA0MDQtZXJyb3IsIHVzZSB0aGUgZXJyb3IgdGV4dCB3ZSBhY3R1YWxseQogICBnZXQgZnJvbSB0aGUgc2VydmVyLiBTZWUgZnVydGhlciBkZXRhaWxzIGluIFJGQzIwNjggKEhUVFAgMS4xCiAgIGRlZmluaXRpb24pLiBUaGUgY3VycmVudCB3YXkgYWxzbyByZWxpZXMgb24gYSBIVFRQLzEuMCByZXBseSwgd2hpY2ggbmV3ZXIKICAgc2VydmVycyBtaWdodCBub3QgZG8uCiAtIExvb3BpbmcgbW9kZSAoIi1sIiBvcHRpb24pLiBJdCdzIGVhc2llciB0byBnZXQgdmFyaW91cyBzcGxpdCBmaWxlcy4KICAgKERhbmllbCdzIG5vdGU6KQogICBVc2UgaXQgbGlrZSAndXJsZ2V0IC1sIDEgaHR0cDovL2Zyb20udGhpcy5zaXRlL2ZpbGUlZC5odG1sJywgd2hpY2ggd2lsbAogICBtYWtlIHVybGdldCB0byBhdHRlbXB0IHRvIGZldGNoIGFsbCBmaWxlcyBuYW1lZCBmaWxlMS5odG1sLCBmaWxlMi5odG1sIGV0YwogICB1bnRpbCBubyBtb3JlIGZpbGVzIGFyZSBmb3VuZC4gVGhpcyBpcyBvbmx5IGEgbW9kaWZpY2F0aW9uIG9mIHRoZQogICBTVEFORF9BTE9ORSBwYXJ0LCBub3RoaW5nIGluIHRoZSB1cmxnZXQoKSBmdW5jdGlvbiB3YXMgbW9kZmlmaWVkIGZvciB0aGlzLgogRGFuaWVsIFN0ZW5iZXJnCiAtIENoYW5nZWQgdGhlIC1oIHRvIGJlIC1pIGluc3RlYWQuIC1oIHNob3VsZCBiZSBwcmVzZXJ2ZWQgdG8gaGVscCB1c2UuCiAtIEJqb3JuIFJlZXNlIGluZGljYXRlZCB0aGF0IEJvcmxhbmQgX21pZ2h0XyB1c2UgJ19XSU4zMicgaW5zdGVhZCBvZiB0aGUKICAgVkMrKyBXSU4zMiBkZWZpbmUgYW5kIHRoZXJlZm9yZSBJIGFkZGVkIGEgbGl0dGxlIGZpeCBmb3IgdGhhdC4KClZlcnNpb24gMi4yCiBKb2hhbiBBbmRlcnNzb24KIC0gVGhlIHVybGdldCBmdW5jdGlvbiBkaWRuJ3Qgc2V0IHRoZSBwYXRoIHRvIHVybCB3aGVuIHVzaW5nIHByb3h5LgogLSBGaXhlZCBidWcgd2l0aCBJTUMgcHJveHkuIE5vdyB1c2luZyAoYWxtb3N0KSBjb21wbGV0ZSBHRVQgY29tbWFuZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSBpdCBjb21waWxlIG9uIFNvbGFyaXMuIEhhZCB0byByZW9yZ2FuaXplIHRoZSBpbmNsdWRlcyBhIGJpdC4KICAgKHNvIFdpbjMyLCBMaW51eCwgU3VuT1MgNCBhbmQgU29sYXJpcyAyIGNvbXBpbGUgZmluZS4pCiAtIE1hZGUgSm9oYW4ncyBrZWVwYWxpdmUga2V5d29yZCBvcHRpb25hbCB3aXRoIHRoZSAtayBmbGFnIChzaW5jZSBpdAogICBtYWtlcyBhIGxvdCBvZiB1cmxnZXRzIHRha2UgYSBsb3QgbG9uZ2VyIHRpbWUpLgogLSBNYWRlIGEgJy1oJyBzd2l0Y2ggaW4gY2FzZSB5b3Ugd2FudCB0aGUgSFRUUC1oZWFkZXIgaW4gdGhlIG91dHB1dC4KClZlcnNpb24gMi4xCiBEYW5pZWwgU3RlbmJlcmcgYW5kIEtqZWxsIEVyaWNzb24KIC0gV2luMzItY29tcGlsYWJsZQogLSBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMKIC0gTXV0ZSBvcHRpb24gKG5vIG91dHB1dCBhdCBhbGwgdG8gc3RkZXJyKQogLSBGdWxsIHJhbmdlIG9mIHJldHVybiBjb2RlcyBmcm9tIHVybGdldCgpLCB3aGljaCBpcyBub3cgd3JpdHRlbiB0byBiZSBhCiAgIGZ1bmN0aW9uIGZvciBlYXN5LXRvLXVzZSBpbiBbb3RoZXJdIHByb2dyYW1zLgogLSBEZWZpbmUgU1RBTkRfQUxPTkUgdG8gY29tcGlsZSB0aGUgc3RhbmQgYWxvbmUgdXJsZ2V0IHByb2dyYW0KIC0gTm93IGNvbXBpbGVzIHdpdGggZ2NjIG9wdGlvbnMgLWFuc2kgLVdhbGwgLXBlZGFudGljIDspCgpWZXJzaW9uIDIuMAogLSBJbnRyb2R1Y2luZyBmdHAgR0VUIHN1cHBvcnQuIFRoZSBGVFAgVVJMIHR5cGUgaXMgcmVjb2duaXplZCBhbmQgdXNlZC4KIC0gUmVuYW1lZCB0aGUgcHJvamVjdCB0byAndXJsZ2V0Jy4KIC0gU3VwcG9ydHMgdGhlIHVzZXIrcGFzc3dkIGluIHRoZSBGVFAgVVJMIChvdGhlcndpc2UgaXQgdHJpZXMgYW5vbnltb3VzCiAgIGxvZ2luIHdpdGggYSB3ZWlyZCBlbWFpbCBhZGRyZXNzIGFzIHBhc3N3b3JkKS4KClZlcnNpb24gMS41CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIHNraXBfaGVhZGVyKCkgY3JhcCBtZXNzZWQgaXQgdXAgYmlnLXRpbWUuIEJ5IHNpbXBseSByZW1vdmluZyB0aGF0CiAgIG9uZSB3ZSBjYW4gYWxsIG9mIGEgc3VkZGVuIGRvd25sb2FkIGFueXRoaW5nIDspCiAtIE5vIGxvbmdlciByZXF1aXJlcyBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkxzLgogLSBJZiB0aGUgZ2l2ZW4gVVJMIGlzbid0IHByZWZpeGVkIHdpdGggJ2h0dHA6Ly8nLCBIVFRQIGlzIGFzc3VtZWQgYW5kCiAgIGdpdmVuIGEgdHJ5IQogLSAndm9pZCBtYWluKCknIGlzIGhpc3RvcnkuCgpWZXJzaW9uIDEuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBnb3BoZXIgc291cmNlIHVzZWQgdGhlIHBwYXRoIHZhcmlhYmxlIGluc3RlYWQgb2YgcGF0aCB3aGljaCBjb3VsZAogICBsZWFkIHRvIGRpc2FzdGVyLgoKVmVyc2lvbiAxLjMKIERhbmllbCBTdGVuYmVyZwogLSBXZWxsLCBJIGFkZGVkIGEgbGFtZSB0ZXh0IGFib3V0IHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IHRoZSBkYXRhLiBJIGFsc28KICAgZm91Z2h0IGFnYWluc3QgSm9oYW4gdG8gcHJldmVudCBoaXMgLWYgb3B0aW9uICh0byBzcGVjaWZ5IGEgZmlsZSBuYW1lCiAgIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBzdGRvdXQpISA9KQogLSBNYWRlIGl0IHdyaXRlICdjb25uZWN0aW9uIHJlZnVzZWQnIGZvciB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdCgpCiAgIHByb2JsZW0uCiAtIFJlbnVtYmVyZWQgdGhlIHZlcnNpb24uIExldCdzIG5vdCBtYWtlIHNpbGx5IDEuMC5YIHZlcnNpb25zLCB0aGlzIGlzCiAgIGEgcGxhaW4gMS4zIGluc3RlYWQuCgpWZXJzaW9uIDEuMgogSm9oYW4gQW5kZXJzc29uCiAtIERpc2NvdmVyZWQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZ2V0dGluZyBiaW5hcnkgZmlsZXMuIHB1dHMoKSBpcwogICBub3cgcmVwbGFjZWQgd2l0aCBmd3JpdGUoKS4gKERhbmllbCdzIG5vdGU6IHRoaXMgYWxzbyBmaXhlZCB0aGUgYnVmZmVyCiAgIG92ZXJ3cml0ZSBwcm9ibGVtIEkgZm91bmQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24uKQoKIFJhZmFlbCBTYWd1bGEKIC0gTGV0ICItcCIgYmVmb3JlICIteCIuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJ1Z2ZpeGVkIHRoZSBwcm94eSB1c2FnZS4gSXQgc2hvdWxkICpOT1QqIHVzZSBub3Igc3RyaXAgdGhlIHBvcnQgbnVtYmVyCiAgIGZyb20gdGhlIFVSTCBidXQgc2ltcGx5IHBhc3MgdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUgcHJveHkuIFRoaXMgYWxzbwogICBtYWRlIHRoZSB1c2VyL3Bhc3N3b3JkIGZpZWxkcyBwb3NzaWJsZSB0byB1c2UgaW4gcHJveHkgW2Z0cC1dIFVSTHMuCiAgIChsaWtlIGluIGZ0cDovL3VzZXI6cGFzc3dvcmRAZnRwLm15LnNpdGU6ODAyMS9SRUFETUUpCgogSm9oYW4gQW5kZXJzc29uCiAtIEltcGxlbWVudGVkIEhUVFAgcHJveHkgc3VwcG9ydC4KIC0gUmVjZWl2ZSBieXRlIGNvdW50ZXIgYWRkZWQuCgogQmpvcm4gUmVlc2UKIC0gSW1wbGVtZW50ZWQgVVJMcyAoYW5kIHNraXBwZWQgdGhlIG9sZCBzeW50YXgpLgogLSBPdXRwdXQgaXMgd3JpdHRlbiB0byBzdGRvdXQsIHNvIHRvIGFjaGlldmUgdGhlIGFib3ZlIGV4YW1wbGUsIGRvOgogICBodHRwZ2V0IGh0dHA6Ly8xNDMuNTQuMTAuNi9pbmZvX2xvZ28uZ2lmID4gdGVzdC5naWYKClZlcnNpb24gMS4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgaXQgc2xpZ2h0bHkgdG8gYWNjZXB0IG5hbWVkIGhvc3RzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFdlCiAgIHdvdWxkbid0IHdhbm5hIHVzZSBJUCBudW1iZXJzIGZvciB0aGUgcmVzdCBvZiBvdXIgbGlmZXMsIHdvdWxkIHdlPwoKVmVyc2lvbiAxLjAKICBSYWZhZWwgU2FndWxhCiAgLSBXcm90ZSB0aGUgaW5pdGlhbCBodHRwZ2V0LCB3aGljaCBzdGFydGVkIGFsbCB0aGlzIQo=