ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlbG9nCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDQpCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwcGxpZWQgdG8gbWFrZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIHdvcmsgbmljZWx5CiAgZXZlbiB3aXRoIGF1dGhlbnRjYXRpb25zIHN1Y2ggYXMgTlRMTSBvciBEaWdlc3QgZW5hYmxlZC4gVGVzdCBjYXNlcyAxNTAsIDE1MQogIGFuZCAxNTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCBmaWxlcyBmb3IgdGhlIGRqZ3BwL01TLURPUyBidWlsZC4KCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgd29yayBvdXQgYSBmaXggZm9yIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gbWFrZQogIHRoZSBmaWxlOi8vIHRlc3RzIHJ1biBmaW5lIHdoZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3LWJ1aWx0IHZlcnNpb24gb2YgY3VybC4KCi0gRml4ZWQgYW4gaW5jbHVkZSBpc3N1ZSB3aXRoIG5ldGluZXQvdGNwLmggb24gQUlYLCBiYXNlZCBvbiBpbnB1dCBieSBUb3IuCiAgVGhpcyBhbHNvIHJlcXVpcmVkIGEgbWlub3IgZml4IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBUaGUgcG9zdGl0Mi5jIHNvdXJjZSBleGFtcGxlIHVzZWQgdGhlIHdyb25nIHN0cnVjdCBuYW1lIGZvciB0aGUgcG9zdCBkYXRhLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGlwdjYgc3VwcG9ydCBvbiB3aW5kb3dzIGJ5IG1ha2luZyB0aGUgY3VybCBidWlsZCB0byB1c2UKICB0aGUgY29ycmVjdCBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLgoKRGFuaWVsICgyNSBNYXJjaCAyMDA0KQotIEl0IHR1cm5lZCBvdXQgdGhhdCBBSVgsIGRlc3BpdGUgaGF2aW5nIGEgInRocmVhZC1zYWZlIGxpYmMiLCBkb2Vzbid0IG9mZmVyCiAgYWxsIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucyB0aHJlYWQtc2FmZS4gVGhpcyBVUkwgaXMgaW5mb3JtYXRpdmUgb24gdGhpcwogIHN1YmplY3Q6CgogICAgaHR0cDovL3B1YmxpYm4uYm91bGRlci5pYm0uY29tL2RvY19saW5rL2VuX1VTL2FfZG9jX2xpYi9haXhwcmdnZC8gXAogICAgZ2VucHJvZ2MvdGhyZWFkX3F1aWNrX3JlZi5odG0KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgd2Ugbm93IGNoZWNrIGZvciB0aHJlZSAqX3IoKSBmdW5jdGlvbnMgb24gcmVjZW50IEFJWAogIHZlcnNpb25zIGFzIHdlbGwgdGhhdCB0aGUgVVJMIG1lbnRpb25zIGFyZW4ndCB0aHJlYWQtc2FmZSBpbiBBSVggNS4xLgoKLSByZW5hbWVkIGN1cmxfc3RyZXJyb3IuW2NoXSB0byBzdHJlcnJvci5bY2hdCgotIEpvZSBIYWxwaW4gYWRkZWQgQ1VSTE9QVF9UQ1BfTk9ERUxBWSBhbmQgLS10Y3Atbm9kZWxheSB0byBtYWtlIGl0IHBvc3NpYmxlCiAgZm9yIHVzZXJzIHRvIGRpc2FibGUgdGhlIE5hZ2xlIGFsZ29ydGhpbS11c2FnZS4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgc29tZSBpbnRlcmVzdGluZyBzdHJlcnJvcl9yKCkga25vd2xlZGdlLiBnbGliYyBoYXMgaXRzCiAgb3duIEFQSSB3aGljaCBkaWZmZXJzIGZyb20gdGhlIFBPU0lYIG9uZS4gRGFuaWVsIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gZGV0ZWN0IHRoZSB2ZXJzaW9uIGluIHVzZSwgYW5kIHRoZSBjb2RlIG5vdyB1c2VzIHRoZSBuZXcgZGVmaW5lcwogIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBzb21lIGJ1aWxkIGZsYXdzIHdpdGggdGhlIG5ldyBsaWIvY3VybF9zdHJlcnJvci5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyNCBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4IHRvIHJlcGxhY2UgdGhlIGJhZCB1c2Ugb2Ygc3RyZXJyb3IoKS4gVGhpcyBpbnRyb2R1Y2VzCiAgQ3VybF9zdHJlcnJvcigpIHRoYXQgYXR0ZW1wdHMgdG8gYmUgdGhyZWFkLXNhZmUgX2FuZF8gd29ya3Mgb24gV2luZG93cyB0b28hCgotIFRvciBBcm50c2VuIHNwZWxsLWZpeGVkIGxvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMuCgotIFRvciBBcm50c2VuIG1hZGUgdGVzdGN1cmwucGwgd29yayB3aXRoIG9sZGVyIHBlcmwgNSB2ZXJzaW9ucywgYW5kIERhbmllbAogIG1hZGUgaXQgbm90IHVzZSBjaGRpciAuLiB0byBnbyBiYWNrLCBhcyB0aGF0IGlzbid0IHZlcnkgZ29vZCB3aGVuIHlvdSd2ZQogIHNldHVwIGEgdGVzdGRpciBjb250YWluaW5nIHN5bWxpbmtzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDQpCi0gQWRkZWQgR3JlZyBIZXdnaWxsJ3MgdGVzdGN1cmwucGwgc2NyaXB0IHRvIENWUy4gV2UgaGF2ZSBub3QgbW92ZWQgb3ZlciB0bwogIHVzZSB0aGlzIHNjcmlwdCBmb3IgdGhlIHJlYWwgZGlzdHJpYnV0ZWQgdGVzdGluZyBqdXN0IHlldCwgYnV0IGl0IGlzIG9ubHkKICBhIG1hdHRlciBvZiB0aW1lLgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgbWFrZXMgY3VybCByZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogIGlmIC0taW50ZXJmYWNlIGZhaWxzIG9uIHdpbmRvd3MuCgotIFRoZSByZWd1bGFyIHByb2dyZXNzIG1ldGVyIGlzIG5vdyBmaXhlZCB0byBuZXZlciB3cmFwIGR1ZSB0byBsb25nIGxpbmVzLiBBbGwKICBmaWVsZHMgYXJlIG5vdyBzdGF0aWMgc2l6ZWQuIElmIHRoZSB0aW1lIGluIHRoZSB0aW1lIGZpZWxkcyBnZXQgYSB0aW1lIHZhbHVlCiAgdGhhdCB3b3VsZCByZXByZXNlbnQgYSB0aW1lIHRoYXQgaXMgMTAwIGhvdXJzIG9yIG1vcmUgKGlmIG5vdCwgaXQgcmVtYWlucwogIHVzaW5nIGEgSEg6TU06U1MgZGlzcGxheSksIGl0IHN3aXRjaGVzIGZpcnN0IHRvIGEgIk5OTmQgTk5oIiBkaXNwbGF5IChmb3IKICBkYXlzIGFuZCBob3VycykgYW5kIGlmIHRoYXQgaXNuJ3QgZW5vdWdoIGl0IHN3aXRjaGVzIHRvIGEgIk5OTmQiIGRpc3BsYXkgaWYKICBpdCBpcyBtb3JlIHRoYW4gOTk5IGRheXMuCgogIFNldmVyYWwgb2YgdGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGFsc28gbW92ZWQgdG8gZml4ZWQtcG9pbnQgbWF0aCBpbnN0ZWFkIG9mCiAgdXNpbmcgZG91Ymxlcy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwNCkKLSBHbGVuIE5ha2FtdXJhIG5vdGljZWQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgZGlkbid0IHdvcmsgYXMgaXQKICB1c2VkIHRvIGRvIGlmIENVUkxPUFRfTk9CT0RZIGlzIHNldCBUUlVFLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIG1ha2VmaWxlIGFuZCBSRUFETUUgdG8gYWRqdXN0IHRvCiAgbmV3IGN5Z3dpbiBwYWNrYWdpbmcgZ3VpZGVsaW5lcy4KCi0gRW5hYmxlZCAiTlQgcmVzcG9uc2VzIiBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4gRG9pbmcgdGhpcyBzaW1wbHkgbWVhbnMKICB0aGF0IHdlIHByb3ZpZGUgYW4gZXh0cmEgY2h1bmsgb2YgZGF0YSBpbiBlYWNoICJ0eXBlLTMgbWVzc2FnZSIuIFRoZSBvbmx5CiAgcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXQgaXQgc2VlbXMgdGhhdCB1c2luZyBvbmx5IHRoZSAiTGFubWFuYWdlciBoYXNoIgogIChhcyB3ZSd2ZSBiZWVuIGRvaW5nIHVudGlsIG5vdykgZG9lc24ndCBzdXBwb3J0IHBhc3N3b3JkcyBsb25nZXIgdGhhbiAxNAogIGNoYXJhY3RlcnMgYW5kIGl0IHR1cm5zIG91dCB0aGVyZSBhcmUgdXNlcnMgb3V0IHRoZXJlIHdobyB3YW50IHRvIHVzZQogIGxpYmN1cmwgYW5kIE5UTE0gd2l0aCBzdWNoIHBhc3N3b3JkcyEgOy0pIFNldmVuIE5UTE0tcmVsYXRlZCB0ZXN0IGNhc2VzIHdlcmUKICB1cGRhdGVkIGFjY29yZGluZ2x5LiBNZW50aW9uZWQgYXMgaXNzdWUgMjkgaW4gVE9ETy1SRUxFQVNFLCBidWcgcmVwb3J0CiAgIzkxNTYwOQoKLSBNb3ZlZCB0aGUgZ2VuZXJhdGVkIGxpYmN1cmwgdmVyc2lvbiBpbmZvIHRvIGEgbmV3IGhlYWRlciBmaWxlLCBuYW1lZAogIGN1cmwvY3VybHZlci5oLiBOb3cgaW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiBpbmNsdWRlIE9OTFkgdmVyc2lvbiBpbmZvLCBzaG91bGQKICBhbnlvbmUgd2FudCB0aGF0IChhbmQgaXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB3aW5kb3dzIHJlc291cmNlIGZpbGVzIHdvdWxkKS4KICBNZW50aW9uZWQgYXMgaXNzdWUgMjcgaW4gVE9ETy1SRUxFQVNFLgoKRGFuaWVsICgyMSBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSByb290IE1ha2VmaWxlIHRvIHVzZSB0YWJzIGZvciB0aGUgbmV0d2FyZSB0YXJnZXQuIEf8bnRlciBLbmF1ZgogIHBvaW50ZWQgdGhpcyBvdXQuCgotIE1hcnR5IEt1aHJ0J3MgVk1TIGNsZWFudXAKCi0gVGhvbWFzIFNjaHdpbmdlIG1hZGUgYnVpbGRjb25mIHJlY29nbml6ZSBBQ0xPQ0FMX0ZMQUdTIHRvIGludm9rZSBhY2xvY2FsCiAgd2l0aCBwYXJ0aWN1bGFyIHByZS1kZXRlcm1pbmVkIG9wdGlvbnMuCgpWZXJzaW9uIDcuMTEuMSAoMTkgTWFyY2ggMjAwNCkKCkRhbmllbCAoMTggTWFyY2ggMjAwNCkKLSBUb3IgQXJudHNlbiBicm91Z2h0IHNvbWUgaW5mbyBhYm91dCBTR0kgSVJJWDoKCiAgSVJJWCBzdXBwb3J0cyAzIGRpZmZlcmVudCBleGVjdXRhYmxlL29iamVjdCBmb3JtYXRzLCAtMzIsIC1uMzIgYW5kIC02NC4KICAtbjMyIGlzIGRlZmF1bHQgMzItYml0IGZvcm1hdCwgLTMyIGlzIHRoZSAib2xkIiAzMi1iaXQgZm9ybWF0LCBhbmQgLTY0IGlzCiAgdGhlIDY0LWJpdCBmb3JtYXQuICBMaWJyYXJpZXMgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyBhcmUgaW4gbGliLCBsaWIzMgogIGFuZCBsaWI2NCByZXNwZWN0aXZlbHkuCgogIFdlJ3ZlIG5vdyBhZGp1c3RlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhZGFwdCB0byB0aGlzIHdoZW4gc2Nhbm5pbmcgZm9yCiAgM3JkIHBhcnR5IGxpYnMsIHN1Y2ggYXMgT3BlblNTTC4KCkRhbmllbCAoMTcgTWFyY2ggMjAwNCkKLSBXYXR6IHBvaW50ZWQgb3V0IGEgZmV3IG1pc3NpbmcgZmlsZXMgaW4gdGhlIE1TVkMgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlLgoKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzLCBjb2RlIGFuZCBtYWtlZmlsZXMgdG8gYnVpbGQgY3VybCBvbiBOb3ZlbGwKICBOZXRXYXJlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA0KQotIExvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMgd2VyZSB1cGRhdGVkIHRvIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBtYW4KICBwYWdlcyB0aGUgcmVjb2duaXplZCB3YXkgc28gdGhhdCB0aGV5IGFwcGVhciBhcyBuaWNlIGh5cGVybGlua3MgaW4gdGhlIEhUTUwKICB2ZXJzaW9ucy4KCi0gYnVpbGRjb25mIG5vdyBjaGVja3MgdGhlIG00IHZlcnNpb24gdG9vLCBzaW5jZSBhdXRvY29uZiByZXF1aXJlcyBhIEdOVSBtNAogIHZlcnNpb24gdG8gYnVpbGQgcHJvcGVyIGNvbmZpZ3VyZSBzY3JpcHRzLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxPUFRfUE9TVEZJRUxEU0laRV9MQVJHRSwgdGhlIGxhcmdlIGZpbGUgdmVyc2lvbiBvZgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byBhbGxvdyBQT1NUcyBsYXJnZXIgdGhhbiAyR0IuCgotIERhdmlkIEJ5cm9uIGZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FzZS9jcmFzaC4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNCkKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgU1NMIGNvbm5lY3Rpb24gdG8gZGVhbCB3aXRoIHJlY2VpdmVkIHNpZ25hbHMgZHVyaW5nIHRoZQogIGNvbm5lY3QuCgotIENoYW5nZWQgdGhlIE9TIHN0cmluZyBmb3Igd2luMzIgdG8gYmVjb21lICJpMzg2LXBjLXdpbjMyIi4KCkRhbmllbCAoOSBNYXJjaCAyMDA0KQotIENoYW5nZWQgdGhlIGludGVybmFscyB0byB1c2UgY3VybF9zb2NrZXRfdCBmb3Igc29ja2V0IHZhcmlhYmxlIHR5cGUuIFRoaXMKICBzaG91bGQgZW5hYmxlIHVzIHRvIGJ1aWxkIHdpdGggbGVzcyB3YXJuaW5ncyBvbiBXaW5kb3dzLCB3aGVyZSBTT0NLRVQgaXMKICB1c2VkIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludCwgd2hpbGUgbW9zdCBvdGhlciBwbGF0Zm9ybXMgdXNlIGEgbWVyZSBpbnQuCgotIE1vZGlmaWVkIGxpYi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIG9uIE1TVkMgYWdhaW4uCgpWZXJzaW9uIDcuMTEuMS1wcmUxICg4IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDggTWFyY2ggMjAwNCkKLSBNaW5vciBmaXggdG8gbWFrZSBjdXJsIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgaXMgb25seSBzZXQgaWYgY3VybF9vZmZfdCBpcwogIGxhcmdlciB0aGFuIDQgYnl0ZXMuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJbXByb3ZlZCBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgc28gY2FsbGVkIGlzc3VlIDEyLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBIVFRQIHNlcnZlciBhIGxvdCB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIGNoYW5nZXMgZm9yCiAgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiAobGlrZSB0ZXN0IGNhc2UgODgpLiBBZGRlZCBBbmRy6XMKICBHYXJj7WEncyB3aW4zMi1jaGFuZ2VzLiBJbXByb3ZlZCB0aGUgbG9nZ2luZy4KCi0gRml4ZWQgdGhlIGZpbGU6LXJlbGF0ZWQgcHJvZ3Jlc3MvZ2V0aW5mbyBzdHVmZiBhIGJpdCBtb3JlLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSSBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOgogIGhlYWRlciBvciB3aGVuIGRvaW5nIG11bHRpcGxlLXJlcXVlc3QgYXV0aGVudGljYXRpb25zLiBBIHN1YnNlcXVlbnQgcmVxdWVzdAogIGNvdWxkIGVycm9uZW91c2x5IHJlLXVzZSBhIHByZXZpb3VzIGNvbm5lY3Rpb24gdGhhdCB3YXMgc2VudCB3aXRoCiAgQ29ubmVjdGlvbjogY2xvc2UuIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZC4KCi0gQW5kculzIEdhcmPtYSBwYXRjaGVkIGN1cmwgdG8gcHJldmVudCB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcgd2l0aCBtaW5ndywKICBtYWlubHkgYmVjYXVzZSBpdCBpcyBub3cgcG9zc2libGUgdG8gaGF2ZSBib3RoIFdJTjMyIGFuZCBIQVZFX0NPTkZJR19ICiAgZGVmaW5lZC4KCi0gV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgZnJvbSBhIGZpbGU6IFVSTCwgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBvdGhlcgogIHRyYW5zZmVyIG1ldHJpY3Mgd2VyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4KCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSAidmVyc2lvbiByZXNvdXJjZSIgZmlsZSB0byB0aGUgY3VybCBleGVjdXRhYmxlIGZvcgogIHRoZSB3aW5kb3dzIGJ1aWxkcy4KCkRhbmllbCAoMyBNYXJjaCAyMDA0KQotIERhdmlkIEJ5cm9uJ3Mgd29yayBvbiBtYWtpbmcgbGliY3VybCBvbmx5IHJlcXVpcmUgd2luc29jayAxLjEgb24gV2luZG93cwogIG1hY2hpbmVzLgoKLSBNb3JlIHZhcmlhYmxlIGNsZWFudXBzIGJhc2VkIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBUb3IgQXJudHNlbidzCiAgYXV0b2J1aWxkcyB3aXRoIE1JUFNQcm8uCgotIEpvZSBIYWxwaW4gaGVscGVkIHVzIGZpeCBzb21lIHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIG9uIEZyZWVCU0QuCgotIEFwcGxpZWQgVG9tIEJhdGVzJyBwYXRjaCB0byBidWlsZCBvbiBuc3ItdGFuZGVtLW5zay4KCi0gRGFuIEZhbmRyaWNoIGNvcnJlY3RlZCBzb21lIGZsYXdzIGluIHRoZSBjb25maWd1cmUgR1NTIGRldGVjdGlvbi4KCkRhbmllbCAoMiBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSBsaWJjdXJsIGNvZGUgdG8gdXNlIEZPUk1BVF9PRkZfVCBmb3IgcHJpbnRmKCkgZm9ybWF0dGluZwogIGN1cmxfb2ZmX3QgdHlwZXMgaW50ZXJuYWxseS4KCkRhbmllbCAoMSBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgYXMgYSBmZWF0dXJlLWJpdCBpbiB0aGUgY3VybF92ZXJzaW9uX2luZm8oKQogIHJlc3BvbnNlLCB0aGF0IHNpZ25hbHMgaWYgdGhpcyBsaWJjdXJsIHN1cHBvcnRzID4yR0IgZmlsZXMuIGN1cmwgLVYgbm93CiAgb3V0cHV0cyAnTGFyZ2VmaWxlJyBpbiB0aGUgRmVhdHVyZXM6IGZpZWxkIGlmIHRoaXMgaXMgdGhlIGNhc2UuIE1vc3Qgc3lzdGVtcwogIGFyZSBsaWtlbHkgdG8gc3VwcG9ydCB0aGlzLgoKLSBXZSBvZmZlciBhIENVUkxfRk9STUFUX09GRl9UIGRlZmluZSBpbiB0aGUgcHVibGljIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQKICB0byBwcmludGYoKSBjdXJsX29mZl90IHZhcmlhYmxlcy4gV2UgYWxzbyBtb2RpZmllZCB0aGUgbGliY3VybCBzb3VyY2VzIHRvCiAgdXNlIHRoaXMgZGVmaW5lIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICVPZCBhcHByb2FjaCAoYWx0aG91Z2ggSSd2ZSBsZWZ0IHRoZQogIE8tZmxhZyBmdW5jdGlvbmFsIGluIHRoZSBjb2RlKS4gVGhpcyBzaG91bGQgYWxzbyBwcmV2ZW50IGNvbXBpbGVycyB0byB3YXJuCiAgb24gdGhlIGhvbWUtZ3Jvd24gb3B0aW9uLgoKLSBGaXhlZCB0aGUgcmVzdW1lLWNoZWNrIGNvZGUgdG8gdGVzdCBmb3IgYSB3b3JraW5nIHJlc3VtZSBhdCB0aGUgZW5kIG9mIHRoZQogIGhlYWRlcnMgYW5kIG5vdCBhdCB0aGUgZmlyc3QgYm9keS1ieXRlLgoKLSBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiBTdG9wIHVzaW5nIGl0LiBJZgogIHlvdSBuZWVkIGEgZ2xvYmFsIEROUyBjYWNoZSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB1c2UgdGhlIHNoYXJlIGludGVyZmFjZSBhbmQKICB5b3UnbGwgZ2V0IGEgZ2xvYmFsIGNhY2hlIHRoYXQgd29ya3MgdGhlIHdheSBpdCBzaG91bGQgd29yay4gWW91IGNhbiBldmVuCiAgaGF2ZSBhbnkgbnVtYmVyIG9mIGdsb2JhbCBjYWNoZXMsIGFsbCBhdCB5b3VyIGNvbW1hbmQuIFRoaXMgaXMgbm93IGFsc28KICBtZW50aW9uZWQgaW4gdGhlIGRvY3MuCgotIE1hZGUgdGhlICpwcmludGYgY29kZSBzdXBwb3J0IHRoZSB6LWZsYWcgdG8gZW5hYmxlIHNpemVfdCBwcmludGYoKSBpbiBhCiAgbWFubmVyIHNpbWlsYXIgdG8gaG93IGdsaWJjIGFsbG93cyBpdC4gVG8gbWFrZSBwcmludGZpbmcgb2YgdGhpcyB3b3JrIG9uCiAgcGxhdGZvcm1zIHdpdGggNjRiaXQgc2l6ZV90IGFuZCAzMmJpdCBpbnRzLiBJZiB0aGVyZSBldmVuIGFyZSBhbnkhIDstKQoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QgYW5kCiAgQ1VSTEFVVEhfTlRMTSAob3IgQ1VSTEFVVEhfQU5ZIGFuZCBsaWJjdXJsIHRoZW4gcGlja2VkIE5UTE0pLCBsaWJjdXJsIHdvdWxkCiAgbG9vcCB3aXRob3V0IHN1Y2NlZWRpbmcgdG8gYXV0aGVudGljYXRlIGR1ZSB0byB0aGUgbmV3IGNvbm5lY3Rpb24gdGhhdCB3YXMKICBtYWRlIGZvciBhbGwgcm91bmQtdHJpcHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLiBOb3csIHRoZSBGUkVTSF9DT05ORUNUIGlzCiAgcmVtYWRlIHRvIG9ubHkgbWF0dGVyIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYWRlIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBtaWdodCBmb2xsb3cgZHVlIHRvIEZPTExPV0xPQ0FUSU9OIG9yIEhUVFAKICBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGlnbm9yaW5nIHRoYXQgb3B0aW9uLgoKLSBBZGp1c3RlZCB0aGUgUVVJVCBjb2RlIHNsaWdodGx5IHNpbmNlIGl0IGNvdWxkIGNvcmUtZHVtcC4KCi0gQ29ycmVjdGVkIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBwcm92aWRlIGEgY29ycmVjdCBzaXplIHRvIHRoZQogICd2ZXJpZmllZHNlcnZlcicgcmVxdWVzdC4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNCkKLSBKb2UgSGFscGluIG1hZGUgdGhlIEZUUCBjb2RlIHNlbmQgUVVJVCBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGJlZm9yZQogIGRpc2Nvbm5lY3RpbmcgdGhlIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIHdoYXQgZ29vZC1iZWhhdmluZyBmdHAgY2xpZW50cwogIHNob3VsZCBkby4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiB1cGRhdGVkIHNldmVyYWwgZmlsZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTVNWQyA2LiBIZQogIGFsc28gYWRkZWQgdGhlICdidWlsZGNvbmYuYmF0JyB0aGF0IHdvcmtzIGxpa2UgdGhlICdidWlsZGNvbmYgKyBjb25maWd1cmUnCiAgY29tYm8gZG9lcyBvbiB1bml4ZXMuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG1lbWRlYnVnIHN0dWZmIHN1cHBvcnQgY2FsbG9jKCkgYXMgd2VsbC4KCi0gVG9yIEFybnRzZW4gcG9pbnRlZCBvdXQgdGhhdCB0ZXN0Y3VybC5zaCBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKICBmaWxlcyBpbiBvcmRlciB0byBoYXZlIHRoZW0gcmUtZ2VuZXJhdGVkIGluIGVhY2ggYnVpbGQuCgotIEFuZHkgU2VycGEgZm91bmQgb3V0IHRoYXQgdGhlIHNoYXJlIGludGVyZmFjZSBkaWQgbm90IGVuam95IGxpZmUgd2hlbiBub3QKICBoYXZpbmcgdGhlIGxvY2sgYW5kIHVubG9jayBjYWxsYmFja3Mgc2V0LCBldmVuIHRob3VnaCBkb2N1bWVudGVkIHRvIGJlCiAgT0suIEl0IHN0aWxsIGlzIE9LLCBhbmQgbm93IHRoZSBjb2RlIHdvbid0IHNlZ2ZhdWx0IGFueW1vcmUhCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHcmVnIEhld2dpbGwgSSBtb2RpZmllZCBob3cgbG9uZyBsb25nIGlzIHVzZWQgaW4gdGhlCiAgbXByaW50ZiBjb2RlLCBhcyB3ZSBjYW4gdXNlIGEgNjRiaXQgdHlwZSB3aXRoIE1TVkMgdGhhdCBpcyBhIGxvbmcgbG9uZwogIGVxdWl2YWxlbnQuIFRoaXMgY29ycmVjdHMgc29tZSB3ZWlyZCBsYXJnZSBmaWxlIGJlaGF2aW9ycyBvbiB3aW5kb3dzLgoKLSBUb3IgQXJudHNlbiBoZWxwZWQgbWUgd29yayBvdXQgLS1lbmFibGUtZGVidWcgdG8gd29yayBiZXR0ZXIgd2l0aCBkaWZmZXJlbnQKICB2ZXJzaW9ucyBvZiB0aGUgZ2NjIGFuZCBpY2MgY29tcGlsZXJzLgoKLSBBZGRlZCBDVVJMT1BUX1NIQVJFIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDQpCi0gQXBwbGllZCB0aGUgZmluYWwgcGllY2VzIG9mIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBicmluZ3MgYSB3b3JraW5nIG5hbWUKICByZXNvbHZlIHRpbWVvdXQgdG8gdGhlIHdpbmRvd3MgdmVyc2lvbnMgb2YgY3VybCEKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbidzIGZpeCB0byBhbGxvdyB0aGUgc3BlZWQtbGltaXQgbG9naWMgd29yayBldmVuIGlmIHlvdSBzZXQKICBsaW1pdC1yYXRlLiBJdCBkb2VzIHdvcmsgb24gdGhlIGV4cGVuc2Ugb2YgdGhlIHJhdGUgbGltaXRlci4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNCkKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgd2l0aCBnY2Mgbm93IGFsc28gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpY2MgY29tcGlsZXIKICAod2hpY2ggc29tZWhvdyBnZXRzIHRyZWF0ZWQgYXMgaWYgaXQgaXMgYSBnY2MpIHRvIHN0b3AgdXNpbmcgYWxsIHRoZSBnY2MKICBvcHRpb25zIHdpdGggaXQsIGFuZCB3ZSBhbHNvIHByb3ZpZGUgLWlzeXN0ZW0gb3B0aW9ucyBmb3IgZWFjaCBleHRyYSAtSQogIG9wdGlvbiB0aGUgY29uZmlndXJlIHNjcmlwdCBoYXMgZmlndXJlZCBvdXQgKGZvciBPcGVuU1NMLCBrZXJiZXJvcywgemxpYiwKICBIZWltZGFsIGV0YykuIFRoaXMgb2YgY291cnNlIHRvIHByZXZlbnQgd2FybmluZ3Mgb24gaGVhZGVycyB3ZSBkb24ndCBoYXZlCiAgY29udHJvbCBvZi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNCkKLSBEb3VnIFBvcnRlciBtYWRlIGxpYmN1cmwgdXNlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSB0aGUKICBnZXRwd3VpZCByZXN1bHRzIHdoZW4gbG9va2luZyBmb3IgLm5ldHJjIGZpbGVzLgoKLSBJZiAnY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnJyBpcyB1c2VkIHdpdGggZ2NjLCBpdCBub3cgY2hlY2tzIHdoaWNoIGdjYwogIHZlcnNpb24gaXQgaXMgYW5kIHVzZXMgYXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBhcyBwb3NzaWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciB2ZXJzaW9uLgoKLSBDb2RlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCBpbiB0aGUgY3VybCBhcHAgaXMgbm93IG1hZGUgdG8gdXNlCiAgdGhlIGN1cmx4XyBwcmVmaXguIFRoZSBmaXJzdCBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUgbGlrZSB0aGlzIGlzIHRoZQogIGN1cmx4X3N0cnRvbGwoKSBmdW5jdGlvbi4gVGhpcyBpcyBtYWRlIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGV4aXN0aW5nIGNvZGUsCiAgYnV0IHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBsaWJjdXJsIEFQSS4gRnVydGhlciBleHBsYW5hdGlvbnMgcG9zdGVkIGhlcmU6CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA0LTAyLzAyMTUuaHRtbAoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGJ1aWxkY29uZiB0byBub3QgdXNlICJ3aGljaCIgYXMgQUlYIGFuZCBUcnU2NCBoYXZlIHdoYXQgaGF2ZSBiZWVuCiAgcmVmZXJyZWQgdG8gYXMgImhvcnJpYmx5IGJyb2tlbiAnd2hpY2gnIHByb2dyYW1zIi4KCi0gTWFkZSBzdXJlIGRucyBjYWNoZSB0aW1lb3V0IHNldCB0byAtMSByZWFsbHkgbWVhbnMgY2FjaGluZyBmb3JldmVyLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA0KQotIE1hZGUgaXQgcG9zc2libHkgdG8gYnVpbGQgYy1hcmVzIHdpdGggdGhlIGxpYmN1cmwgbWVtZGVidWcgc3lzdGVtIHRvIGJldHRlcgogIHRyYWNrIG1lbW9yeS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNCkKLSBXaGVuIHVzaW5nIGFyZXMsIHdlIG5vdyBpbml0aWFsaXplIHRoZSBhcmVzICdjaGFubmVsJyBpbiBjdXJsX2Vhc3lfaW5pdCgpCiAgYW5kIHJlLXVzZSB0aGF0IHNhbWUgaGFuZGxlIGR1cmluZyB0aGUgZW50aXJlIGN1cmwgaGFuZGxlJ3MgbGlmZS10aW1lLiBJdAogIGltcHJvdmVzIHBlcmZvcm1hbmNlLgoKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiBkaXNwbGF5aW5nIHZlcmJvc2UgZm9yIGlwdjYtZW5hYmxlZCBsaWJjdXJscyBhbmQKICByZS11c2VkIGNvbm5lY3Rpb25zLiBQcm9ibGVtIHJlcG9ydGVkIGFuZCBmaXggdmVyaWZpZWQgYnkgR3JpZ29yeSBFbnRpbi4KCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIHZlcnNpb24tY2hlY2sgaW4gdGhlIFNPQ0tTNSBjb2RlLgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGEgY2FzZSB3aGVyZSBhIGhvc3QgY2FjaGUgZW50cnkgd2FzIG5vdCBmbGFnZ2VkIGluLXVzZSBwcm9wZXJseSB3aGVuIGEKICBjYWNoZWQgZW50cnkgd2FzIHVzZWQuCgotIEFuZHLpcyBHYXJj7WEncyBwYXRjaCB0aGF0IGNoZWNrcyBmb3Igd2lubW0gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNCkKLSBCZW4gR3JlZWFyJ3MgU09fQklORFRPREVWSUNFIHBhdGNoIGZvciB0aGUgYmluZGluZyBvZiB0aGUgbG9jYWwgZW5kIHRvIGEKICBzcGVjaWZpYyBuZXR3b3JrIGludGVyZmFjZS4KCi0gR3JlZyBIZXdnaWxsIGZvdW5kIG91dCB0aGF0IHRoZSB2YXJpYWJsZSBob2xkaW5nICdjb250ZW50bGVuZ3RoJyB3YXNuJ3QgYmlnCiAgZW5vdWdoIHRvIGhvbGQgYSBsYXJnZSBmaWxlIQoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIDY0Yml0LXJlbGF0ZWQgcHJvYmxlbSBpbiBkYXRlLXJlbGF0ZWQgY29kZSBpbiB0aGUgZnRwCiAgZGVwYXJ0bWVudCwgYW5kIHRoZXJlIHdhcyBhbm90aGVyIHBvdGVudGlhbCBwcm9ibGVtIGluIHRoZSBuYW1lIHJlc29sdmUgY29kZQogIHRvby4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNCkKLSBSZW1vdmVkIGEgZmV3IHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSBzZXQgYnV0IG5ldmVyIHVzZWQsIGFzIHNvbWUgY29tcGlsZXJzCiAgd2FybiBhYm91dCB0aGF0IGFuZCB3ZSBkbyBub3QgbGlrZSBjb21waWxlciB3YXJuaW5ncyEKCi0gUmVtb3ZlZCB0aGUgbmVlZCBmb3Igc3ltbGlua3MgaW4gdGhlIHRlc3RzL2RhdGEgZGlyZWN0b3J5IGlmIGN1cmwgaXMgYnVpbHQKICBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgJ21ha2UgdGVzdCcgaXMgdXNlZC4gVGhpcyB3YXMgZG9uZQogIGJ5IHByb3ZpZGluZyBhICJzb3VyY2UgZGlyIHBhdGgiIHRvIHRoZSBzY3JpcHRzL3NlcnZlcnMuCgotIE5vdywgaWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZmluZCBhbiBucm9mZiB0b29sIG9yIGFuIG9wdGlvbiB0byBucm9mZgogIHRvIHVzZSB0byBjb252ZXJ0IG1hbiBwYWdlcyB3aXRoLCBpdCB3aWxsIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgYnVpbHQtaW4KICBtYW51YWwuCgotICdjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCcgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgYnVpbHQtaW4gbWFudWFsIGZyb20KICB0aGUgY3VybCBjb21tYW5kIHRvb2wuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgbWlub3Igc291cmNlIGVkaXQsIGFuZCBub3cKICBoZSBoYXMgbWFuYWdlZCB0byBnZXQgbXN5cy9taW5ndyB0byBydW4gY29uZmlndXJlIGFuZCB0aGVuIGJ1aWxkIQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGRlZmF1bHQgSFRUUCBBY2NlcHQ6IGhlYWRlciB3YXMgbW9kaWZpZWQgdG8gdGhlIG11Y2ggc2ltcGxlcgogICJBY2NlcHQ6ICovKiIuCgotIFAgUiBTY2hhZmZuZXIgdXBkYXRlZCB0aGUgY3VybC1zc2wgc3BlYyBmaWxlIGZvciBSUE1zLgoKLSBEb21pbmljayBNZWdsaW8gYnJvdWdodCBsb3RzIG9mIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzaGFyZSBpbnRlcmZhY2UncyBtYW4KICBwYWdlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBtaXNzaW5nLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCB3b3JrLWFyb3VuZCBhIGJ1ZyBpbiB0aGUKICBBSVg1IGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvKCkuIFRoaXMgbWFrZXMgdGhlIEZUUCBQT1JUIHN0dWZmIHdvcmsgb24KICBpcHY2LWVuYWJsZWQgQUlYIGJ1aWxkcy4KCi0gS2VuIFJhc3RhdHRlciBwcm92aWRlZCBwb3J0YWJpbGl0eSBmaXhlcyBmb3IgdGhlIGN1cmxndGsuYyBleGFtcGxlLCBhbmQgbm93CiAgaXQgcnVucyBvbiB3aW5kb3dzIHdpdGggR1RLIGFzIHdlbGwhCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBnZXRob3N0YnluYW1lKCkgZmluZSB3aGVuIHJ1bgogIHdpdGggbWluZ3cgb24gd2luZG93cy4KCi0gTW9kaWZpZWQgdGhlIGxkYXAgY29kZSB0byB1c2UgcHJvcGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFsbCBvdmVyIChpbnN0ZWFkIG9mCiAgbWl4ZWQgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRvIHdvcmstYXJvdW5kIHRoZSBwaWNreSBNSVBTUHJvIGNvbXBpbGVyCiAgd2FybmluZ3MuCgotIEEgY3VzdG9tIEhvc3Q6IGhlYWRlciBpcyBvbmx5IGNvbnNpZGVyZWQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IG1hZGUgYnkKICBmb2xsb3dpbmcgYSBsb2NhdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBUaW0gQmFrZXIuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNCkKLSBUaGUgbGlieiBwYXJ0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBvbmx5IHNldCB0aGUgdHdvIGxpYnotcmVsYXRlZAogIGRlZmluZSBIQVZFX1pMSUJfSCBhbmQgSEFWRV9MSUJaIGlmIGJvdGggdGhlIGxpYiBhbmQgdGhlIGhlYWRlciBpcyBmb3VuZC4KICBJZiBvbmUgaXMgbWlzc2luZywgbm9uZSBvZiB0aGUgZGVmaW5lcyBpcyBzZXQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIE1pbmd3IG1ha2VmaWxlcy4KCi0gTGVuIEtyYXVzZSByZXBvcnRlZCB0aGF0IGN1cmwgNy45LlggY291bGQgZG8gdXBsb2FkaW5nIGZyb20gc3RkaW4gd2l0aG91dAogIGRvaW5nIGNodW5rZWQgZW5jb2RpbmcsIHdoaWNoIGN1cnJlbnQgY3VybCBjYW5ub3QgZG8gZXZlbiBpZiB5b3UgZGlzYWJsZQogIHRoZSB0cmFuc2Zlci1lbmNvZGluZyBjaHVua2VkIGhlYWRlci4gTm93IGl0IGNhbiBhZ2FpbiwgYW5kIHRlc3QgY2FzZSA5OAogIHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgYSB3ZWlyZCBnZXRhZGRyaW5mbygpIHVzYWdlIGluIHRoZSBGVFAgY29kZSwgcHJldmVudGluZwogIHRoZSBpcHY2LWNvZGUgZm9yIFBPUlQgd29yayBvbiBBSVggNS4yLiBXZSBub3cgYWxzbyBwcm92aWRlIChiZXR0ZXIpIGVycm9yCiAgbWVzc2FnZXMgd2hlbiBiYWlsaW5nIG91dCBpbiB0aGUgdGhhdCBmdW5jdGlvbi4KCi0gVG9yIEFybnRzZW4gbm93IHByb3ZpZGVzIEFJWCBhbmQgSVJJWCAodXNpbmcgZ2NjLCB4bGMgYW5kIHRoZSBNSVBTUHJvCiAgY29tcGlsZXJzKSBhdXRvbWF0ZWQgYnVpbGQgbG9ncyAoaHR0cDovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCgpEYW5pZWwgKDE5IERlY2VtYmVyKQotIENVUkxPUFRfSVBSRVNPTFZFIHdhcyBub3QgcG9zc2libGUgdG8gc2V0LgoKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIHRoZSBkamdwcCBidWlsZCBmaWxlcy4KCkRhbmllbCAoMTggRGVjZW1iZXIpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIGEgcmVkaXJlY3QtcHJvYmxlbSB0aGF0IGhhcHBlbmVkIGlmIGEgc2l0ZSB1c2VkIGEgVVJMCiAgbGlrZSAidXJsLmNvbT92YXI9Y29udGVudCIgKHdpdGhvdXQgYSBwcm9wZXIgc2xhc2gpIGFuZCBmcm9tIHRoYXQgYWRkcmVzcwogIHJlZGlyZWN0ZWQgdGhlIHVzZXItYWdlbnQgdG8gYW4gYWJzb2x1dGUgZGlyZWN0b3J5LgoKLSBEYXZpZCBCeXJvbiBtYWRlIGxpYmN1cmwgYnVpbGQgZmluZSB3aXRoIGJvdGggdGhlIC5ORVQgYW5kIFZDNiB2ZXJzaW9ucyBvZgogIE1TVkMKCkRhbmllbCAoMTYgRGVjZW1iZXIpCi0gVXBkYXRlZCB0ZXN0IDUwNiBzaW5jZSBpdCBzdGFydGVkIHRvIGZhaWwgYWZ0ZXIgdGhlIGNhY2hlIHBydW5lIGNoYW5nZQogIHllc3RlcmRheS4gSSBhbHNvIGNoYW5nZWQgaXQgc2xpZ2h0bHkgdG8gZmVhdHVyZSBhIGNvdW50ZXIgaW4gZWFjaCBkZWJ1ZwogIG91dHB1dCBmb3IgZWFzaWVyIHRyYWNpbmcuCgpEYW5pZWwgKDE1IERlY2VtYmVyKQotIE9sZCBETlMgY2FjaGUgZW50cmllcyBhcmUgbm93IG9ubHkgcHJ1bmVkIGFmdGVyIGN1cmwgaXMgZG9uZSB3aXRoIGEgcmVxdWVzdCwKICBhbmQgbm90IGluIHRoZSBhY3R1YWwgbmFtZSByZXNvbHZlIGNhbGwuCgotIGNvcnJlY3RlZCB0aGUgLS1lbmFibGUtYXJlcyBwYXRjaAoKLSBHaXVzZXBwZSBBdHRhcmRpIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aGluIGxpYmN1cmwgdGhhdCByZS11c2VkCiAgYWxyZWFkeSBmcmVlZCBtZW1vcnkuCgpEYW5pZWwgKDEwIERlY2VtYmVyKQotIEdpc2xlIFZhbmVtIHJlcG9ydGVkIHRoYXQgdGhlIGRpY3Qgc3VwcG9ydCB3YXMgYnJva2VuLiBJIGJyb2tlIGl0IGR1cmluZyBteQogIGZ0cHMtY2hhbmdlcyBvdmVyaGF1bC4gSSd2ZSBub3cgYWRkZWQgYSAnY3VybGFzc2VydCcgZnVuY3Rpb24gdGhhdCBjYW4gYmUKICB1c2VkIHRvIHZlcmlmeSBleHByZXNzaW9ucywgdG8gcHJldmVudCBmdXR1cmUgZXJyb3JzIG9mIHRoZSBzYW1lCiAga2luZC4gVGhleSdyZSBvbmx5IHByZXNlbnQgaW4gZGVidWctYnVpbGRzLgoKLSBEaWVnbyBDYXNvcnJhbiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgcG9zc2libGUgdG8gYnVpbGQgbmF0aXZlbHkgKG5vIG1vcmUKICBuZWVkIGZvciB0aGUgaXhlbXVsIGxpYnJhcnkpIG9uIEFtaWdhT1MuCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGNvbmZpZ3VyZSAtLWVuYWJsZS1hcmVzIHN1cHBvcnQgYSBnaXZlbiBwYXRoIHRvIHRoZQogIGluc3RhbGxlZCBhcmVzIGxpYiwgaW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgaXQgaW4gdGhlIGN1cmwgc291cmNlIHRyZWUuCiAgVGhpcyBhbHNvIGZpeGVkIHRoZSBjdXJsLWNvbmZpZyAtLWxpYnMgb3V0cHV0LgoKLSBFcmljIFMuIFJheW1vbmQgcGF0Y2hlZCBhIHZlcnkgbWlub3IgbWFuIHBhZ2UgZm9ybWF0IGVycm9yIGluCiAgbGliY3VybC1lcnJvcnMuMwoKRGFuaWVsICg4IERlY2VtYmVyKQotIEZpeGVkIHRoZSBmbGF3IHRoYXQgbWFkZSAtbHogYXBwZWFyIHR3aWNlIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZS4KCi0gQWZ0ZXIgY29ycmVzcG9uZGVuY2Ugd2l0aCBHaXNsZSBWYW5lbSwgSSBjaGFuZ2VkIHRoZSAnY29ubmVjdGlvbiBhYm9ydGVkJwogIGVycm9yIHRleHQgd2hlbiB0aGUgRlRQIHJlc3BvbnNlIHJlYWRlciBmYWlsZWQgdG8gbW9yZSBzcGVjaWZpY2x5IGlkZW50aWZ5CiAgd2hhdCB0aGUgcHJvYmxlbSBpcy4KCi0gQmFzZWQgb24gYSBwYXRjaCBmcm9tIERvbWluaWNrIE1lZ2xpbywgY3VybC1jb25maWcgLS1mZWF0dXJlIG5vdyBvdXRwdXRzCiAgJ0FzeW5jaEROUycgYXMgYSBmZWF0dXJlIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXJlcy4gVGhlIGZlYXR1cmUgbmFtZQogIGlzIHRoZSBzYW1lIHRoYXQgJ2N1cmwgLVYnIG91dHB1dHMsIGZvciBzaW1wbGljaXR5LgoKRGFuaWVsICgzIERlY2VtYmVyKQotIE1hcnR5IEt1aHJ0IG1hZGUgdGhlIGJ1aWxkIHVwLXRvLWRhdGUgb24gVk1TLCBhbmQgbW92ZWQgbW9zdCBvZiB0aGUgVk1TLQogIHNwZWNpZmljIHN0dWZmIGluIHRoZSBjbGllbnQgY29kZSB0byBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgoKLSBTdGV2ZSBHcmVlbiBmaXhlZCBhIHJldHVybiBjb2RlIGJ1ZyBpbiBDdXJsX3Jlc29sdigpLCB0aGF0IG1hZGUgdGhlIHNvY2tzNQogIGNvZGUgZmFpbC4KCi0gc3dhbGthdXMgYXQgeWFob28uY29tIHBhdGNoZWQgbGliY3VybCB0byBpZ25vcmUgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMKICB3aGVuIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIGlzIHVzZWQsIGFzIG1hbmRhdGVkIGJ5IFJGQzI2MTYuCgpEYW5pZWwgKDIgRGVjZW1iZXIpCi0gLS1mdHAtcGFzdiB3YXMgYWRkZWQsIHdoaWNoIHNlcnZlcyB0aGUgb25seSBwdXJwb3NlIG9mIG92ZXJyaWRpbmcgYQogIHByZXZpb3VzbHkgc2V0IC0tZnRwcG9ydCBvcHRpb24uIFN0YXJ0aW5nIG5vdywgLS1mdHAtcG9ydCBpcyBhIHJlY29nbml6ZWQKICBhbGlhcyBmb3IgLS1mdHBwb3J0IGZvciBjb25zaXN0ZW5jeS4KCi0gR2l1c2VwcGUgQXR0YXJkaSBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCB1c2UgTVNHX05PU0lHTkFMIHdoZW4gd2UgdXNlCiAgc2VuZCgpIGFuZCByZWN2KCkuIEkgYWRkZWQgY2hlY2tzIGZvciB0aGUgZGVmaW5lIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZAogIGFkanVzdGVkIHRoZSBjb2RlIGFjY29yZGluZ2x5LiBJZiB0aGUgc3ltYm9sIGlzIHByZXNlbnQsIHdlIHdvbid0IGF0dGVtcHQKICB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLgoKRGFuaWVsICgxIERlY2VtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gc2V0IHVwIGEgYnNkZnRwZC1zc2wgc2VydmVyIGZvciBtZSBhbmQgSSBjb3VsZCBtYWtlIGN1cmwKICBydW4gZmluZSBhZ2FpbnN0IGl0cyBGVFBTIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlc2UgRlRQUy1yZWxhdGVkIHRoaW5ncwogIHdvcms6CiAgIG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IEZUUFMKICAgbyBhY3RpdmUgKFBPUlQpIGFuZCBwYXNzaXZlIChQQVNWKQogICBvIHVwbG9hZCBhbmQgZG93bmxvYWQKICAgbyB2ZXJpZmllZCBhZ2FpbnN0IGJzZGZ0cGQtc3NsIGFuZCBSYWlkZW5GVFBECgpEYW5pZWwgKDI3IE5vdmVtYmVyKQotIEphbWVzIENsYW5jeSBtYWRlIHRoZSBCb3JsYW5kIE1ha2VmaWxlcyB1cCB0byBkYXRlLgoKLSBNYXJrdXMgTW9lbGxlciBpbXByb3ZlZCB0aGUgU1BORUdPIGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjUgTm92ZW1iZXIpCi0gRGF2ZSBNYXkgZmlsZWQgYnVnIHJlcG9ydCAjODQ4MzcxLCBpZGVudGlmeWluZyB0aGF0IGlmIHlvdSdkIGRvIFBPU1Qgb3ZlciBhCiAgcHJveHkgdG8gYSBodHRwcyBzZXJ2ZXIsIGxpYmN1cmwgZGlkbid0IFBPU1QgYXQgYWxsLCBpdCBqdXN0IG1hZGUgYSBHRVQhIEl0CiAgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGxpYmN1cmwgd3JvbmdseSBkaWRuJ3QgY29uc2lkZXIgdGhlIGF1dGhlbnRpY2F0aW9uCiAgIm5lZ290aWF0aW9uIHBoYXNlIiB0byBiZSBjb21wbGV0ZSB5ZXQuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDk1IHRvIHZlcmlmeSBteSBmaXggZm9yIHRoaXMuCgpEYW5pZWwgKDI0IE5vdmVtYmVyKQotIFRoYW5rcyB0byBNYXRoaWFzIEF4ZWxzc29uLCBJJ3ZlIGJlZW4gYWJsZSB0byB3b3JrIG9uIEZUUFMgZm9yIGxpYmN1cmwgYW5kIGl0CiAgc2VlbXMgdG8gd29yayBzb21ld2hhdCBmaW5lIG5vdy4KCiAgVGhlIEZUUFMgc3R1ZmYgaXMgYmFzZWQgb24gUkZDMjIyOCBhbmQgdGhlIG11cnJheS1hdXRoLWZ0cC1zc2wgZHJhZnQKICAodmVyc2lvbiAxMikuIFRoZXJlIHNlZW1zIHRvIGV4aXN0IHF1aXRlIGEgZmV3IHNlcnZlcnMgdGhhdCBoYXZlIGltcGxlbWVudGVkCiAgdGhlIHNlcnZlciBzaWRlIG9mIHRoaXMuCgogIFdlIGNhbiBub3cgdXNlIGZ0cHM6Ly8gVVJMcyB0byBleHBsaWNpdGx5IHN3aXRjaCBvbiBTU0wvVFNMIGZvciB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24gYW5kIHRoZSBkYXRhIGNvbm5lY3Rpb24gKGRlYWxpbmcgd2l0aCB0d28gU1NMIGNvbm5lY3Rpb25zIGZvcmNlZAogIG1lIHRvIGNoYW5nZSBhIGxvdCBvZiBzdHVmZiBpbiBsaWJjdXJsKS4KCiAgQWx0ZXJuYXRpdmVseSwgYW5kIHdoYXQgc2VlbXMgdG8gYmUgdGhlIHJlY29tbWVuZGVkIHdheSwgd2UgY2FuIHNldCB0aGUgbmV3CiAgb3B0aW9uIENVUkxPUFRfRlRQX1NTTCB0byBvbmUgb2YgdGhlc2UgdmFsdWVzOgoKICAgICBDVVJMRlRQU1NMX05PUEUsICAgLSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1NMCiAgICAgQ1VSTEZUUFNTTF9UUlkgICAgIC0gdHJ5IHVzaW5nIFNTTCwgcHJvY2VlZCBhbnl3YXkgb3RoZXJ3aXNlCiAgICAgQ1VSTEZUUFNTTF9DT05UUk9MIC0gU1NMIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIG9yIGZhaWwKICAgICBDVVJMRlRQU1NMX0FMTCAgICAgLSBTU0wgZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9yIGZhaWwKCiAgQW55IGZhaWx1cmUgdG8gc2V0IHRoZSBkZXNpcmVkIGxldmVsIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwgd2l0aCB0aGUgZXJyb3IKICBjb2RlIENVUkxFX0ZUUF9TU0xfRkFJTEVELiBUaGlzIG5ldyBvcHRpb24gbWFrZXMgYSAibm9ybWFsIiBmdHA6Ly8gdHJhbnNmZXIKICBhdHRlbXB0IHRvIGJlIG1hZGUgc2VjdXJlbHkuCgogIEkndmUgYmVlbiBhYmxlIHRvIGxvZ2luIGFuZCBnZXQgZmlsZXMgKHBhc3NpdmVseSkgZnJvbSBNYXRoaWFzJyBzZXJ2ZXIgdXNpbmcKICBib3RoIGZ0cHM6Ly8gYW5kIENVUkxPUFRfRlRQX1NTTC4gKEkndmUgbWFkZSAnY3VybCcgdW5kZXJzdGFuZCB0aGUgLS1mdHAtc3NsCiAgb3B0aW9uIHRoYXQgc2V0cyBDVVJMRlRQU1NMX1RSWS4pCgotIEdheiBJcWJhbCBmaXhlZCBhIHJhbmdlIHN0cmluZyBtZW1vcnkgbGVhay4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIFdpbmRvd3MgYnVpbGRzLgoKLSBBZGRlZCB0aGUgbmV3IEZUUFNTTCBkZWZpbmVzIGluIGN1cmwvY3VybC5oCgpEYW5pZWwgKDIwIE5vdmVtYmVyKQotIEpvc2ggS2FwZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzg0NTI0NyBhcyBoZSBmb3VuZCBhbiBlbmRsZXNzIGxvb3Agd2hlbgogIGdldHRpbmcgYSA0MDcgYmFjayBmcm9tIGEgcHJveHkgd2hlbiBubyB1c2VyK3Bhc3N3b3JkIHdhcyBnaXZlbi4gQWRkZWQgdGVzdAogIGNhc2UgOTQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE5IE5vdmVtYmVyKQotIEtldmluIFJvdGggZml4ZWQgYSBwcm9ncmVzcy1iYXIgcHJvYmxlbSBvbiBXaW5kb3dzLgoKLSBXaGlsZSB3b3JraW5nIHdpdGggTmljb2xhcyBDcm9pc2V0J3MgYnVnIHJlcG9ydCAjODQzNzM5LCBJIG5vdGljZWQgdHdvIG1pbm9yCiAgcHJvYmxlbXMgcmVsYXRlZCB0byBmdHAgcGFydGlhbCBkb3dubG9hZHM6IGlmIGEgcGFydGlhbCB0cmFuc2ZlciBpcwogIGRldGVjdGVkLCB3ZSBtdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHdlIGNhbm5vdCBrbm93IGluIHdoYXQgc3RhdGUgaXQgaXMKICBhbnltb3JlLiBUaGlzIGxvb2tzIGxpa2UgYSBQcm9GVFBEIGJ1ZzoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDMtMTEvMDA3OS5odG1sCgpEYW5pZWwgKDE3IE5vdmVtYmVyKQotIE1hY2llaiBXLiBSb3p5Y2tpIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlIGEgY2FjaGUgdmFyaWFibGUgZm9yIHRoZQogIHdyaXRhYmxlIGFyZ3YgdGVzdC4gVGhpcyB3YXksIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJldHRlciAoZm9yCiAgY3Jvc3MtY29tcGlsZXMgZXRjKQoKRGFuaWVsICgxNSBOb3ZlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIGZvdW5kIG91dCBsaWJjdXJsIHNvbWV0aW1lcyBmcmVlZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlCiAgdHdpY2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyEKCkRhbmllbCAoMTQgTm92ZW1iZXIpCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgcmVzb2x2ZSB0aGF0IHdlIGRpZG4ndAogIHByb3Blcmx5IGJhaWwgb3V0IGZyb20sIHdoZW4gdXNpbmcgYXJlcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIpCi0gRGVmYXVsdCBDb250ZW50LVR5cGUgZm9yIHBhcnRzIGluIG11bHRpcGFydCBmb3JtcG9zdHMgaGFzIGNoYW5nZWQgdG8KICAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi4gIFRoaXMgc2VlbXMgbW9yZSBhcHByb3ByaWF0ZSwgYW5kIEkgYmVsaWV2ZQogIG1vemlsbGEgYW5kIHRoZSBsaWtlcyBkbyB0aGlzLiBJbiB0aGUgc2FtZSBhcmVhOiAuaHRtbCBmaWxlcyBub3cgZ2V0CiAgdGV4dC9odG1sIGFzIENvbnRlbnQtVHlwZS4gKFBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzgzOTgwNikKCi0gR2lzbGUgVmFuZW0gY29ycmVjdGVkIHRoZSAtLXByb2dyZXNzLWJhciBvdXRwdXQgYnkgZG9pbmcgYSBmbHVzaCBvZiB0aGUKICBvdXRwdXQsIHdoaWNoIGFwcGFyZW50bHkgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gYXQgbGVhc3Qgd2luZG93cywgYnV0CiAgcG9zc2libHkgb3RoZXIgcGxhdGZvcm1zIHRvby4KCi0gUGV0ZXIgU3lsdmVzdGVyIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBjb25uZWN0IGNvZGUsIHdoaWNoIG1hZGUgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIG9uIGEgaXB2Ni1lbmFibGVkIHNvbGFyaXMgYm94IGRvIGJhZC4gVGVzdCBjYXNlIDUwNCB0byBiZQogIHNwZWNpZmljLiBJJ3ZlIHNwZW50IHNvbWUgdGltZSB0byBjbGVhbi11cCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uCiAgbm93IHRvIHVzZSBsZXNzIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHR3byBkaWZmZXJlbnQgc2VjdGlvbnM6IGlwdjYgYW5kCiAgaXB2NC4KCkRhbmllbCAoMTEgTm92ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9ORVRSQ19GSUxFLiBVc2UgdGhpcyB0byB0ZWxsIGxpYmN1cmwgd2hpY2ggZmlsZSB0byB1c2UgaW5zdGVhZAogIG9mIHRyeWluZyB0byBmaW5kIGEgLm5ldHJjIGluIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeS4gVGhlCiAgZXhpc3RpbmcgLm5ldHJjIGZpbGUgZmluZGVyIGlzIHNvbWV3aGF0IG5haXZlIGFuZCBpcyBmYXIgZnJvbSBwZXJmZWN0IG9uCiAgc2V2ZXJhbCBwbGF0Zm9ybXMgdGhhdCBhcmVuJ3QgdW5peC1zdHlsZS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc2V0IHdoZW4KICBDVVJMT1BUX05FVFJDIGlzIHNldCwgdGhlIHByZXZpb3VzIGFwcHJvYWNoIHdpbGwgc3RpbGwgYmUgdXNlZC4KCiAgVGhlIGN1cnJlbnQgLm5ldHJjIGNoZWNrIGNvZGUgbm93IGFsc28gc3VwcG9ydCBsb25nZXIgdGhhbiAyNTYgYnl0ZXMgcGF0aAogIG5hbWVzLgoKRGFuaWVsICgxMCBOb3ZlbWJlcikKLSBLYW5nLUppbiBMZWUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUgc2hvdWxkbid0IGJlCiAgd3JpdHRlbiBpbiB0aGUgc291cmNlIGRpciBpZiBhIGRpZmZlcmVudCBidWlsZCBkaXIgaXMgdXNlZC4KCi0gQWZ0ZXIgU+liYXN0aWVuIFdpbGxlbWlqbnMnIGJ1ZyByZXBvcnQsIHdlIG5vdyBjaGVjayB0aGUgc2VwYXJhdG9ycyBwcm9wZXJseQogIGluIHRoZSAyMjktcmVwbHkgc2VydmVycyByZXNwb25kIG9uIGEgRVBTViBjb21tYW5kIGFuZCBiYWlsIG91dCBiZXR0ZXIgaWYKICB0aGUgcmVwbHkgc3RyaW5nIGlzIG5vdCBSRkMyNDI4LWNvbXBsaWFudC4KCkRhbmllbCAoNyBOb3ZlbWJlcikKLSBCYXNlZCBvbiBHaXNsZSBWYW5lbSdzIHBhdGNoLCBJIG1hZGUgY3VybCB0cnkgaGFyZGVyIHRvIGdldCB0aGUgaG9tZQogIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCBpbiBvcmRlciB0byBmaW5kIHRoZSBkZWZhdWx0IC5jdXJscmMgZmlsZS4KICBXZSdyZSBhbHNvIGNvbnNpZGVyaW5nIG1vdmluZyBvdXQgdGhlIEhPTUUtZGlyIGNvZGUgZnJvbSBsaWJjdXJsLCBhbmQKICBpbnN0ZWFkIGhhdmUgdGhlIGFwcCBwYXNzIGluIHRoZSBwYXRoIHRvIHRoZSAubmV0cmMgZmlsZSAod2hpY2ggaXMgdGhlIG9ubHkKICBsb2dpYyBsZWZ0IGluIGxpYmN1cmwgdGhhdCB1c2VzIHRoZSBIT01FIGRpcikuIFRoZW4gY3VybCBjYW4gdXNlIHRoZSBob21lCiAgZGlyIGZvciB0aGF0IHB1cnBvc2UgdG9vLgoKLSBSYWxwaCBNaXRjaGVsbCdzIHVwZGF0ZWQgdGVzdGN1cmwuc2ggdG8gdGhlIHNjcmlwdCB0byB0YWtlIGFuIGV4aXN0aW5nCiAgZGlyZWN0b3J5IG5hbWUgYW5kIGJ1aWxkL3J1bi90ZXN0IGN1cmwgaW4gdGhlcmUgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXBkYXRlCiAgZnJvbSBDVlMuIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBzY3JpcHQgY2FuIG5vdyBiZSB1c2VkIHRvIHRlc3QgZGFpbHkKICB0YXJiYWxscyBldGMuCgotIEdpc2xlIFZhbmVtIGFkZGVkIGEgInJlc291cmNlIGZpbGUiIHRvIHRoZSBXaW5kb3dzIERMTCBidWlsZHMsIHRvIGNvbnRhaW4KICBpbmZvcm1hdGlvbiBzdWNoIGFzIHZlcnNpb24gbnVtYmVyLCBsaWJyYXJ5IG5hbWUsIGNvcHlyaWdodCBpbmZvIGV0Yy4KCkRhbmllbCAoNiBOb3ZlbWJlcikKLSBjdXJsIGNoZWNrcyBpZiB0aGUgZXhpc3RpbmcgbGliY3VybCBzdXBwb3J0cyB0aGluZ3MgbGlrZSAtLW50bG0sIC0tbmVnb3RpYXRlCiAgYW5kIC0ta3JiNCBhbmQgcmV0dXJucyBlcnJvciBpZiBub3QuCgotIEkgYWRkZWQgdGhyZWUgbmV3IGdsb2JhbCBkZWZpbmVzIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXI6CiAgTElCQ1VSTF9WRVJTSU9OX01BSk9SLCBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgYW5kIExJQkNVUkxfVkVSU0lPTl9QQVRDSC4gVGhleQogIGFyZSB0aGUgdGhyZWUgbnVtYmVycyBpbiB0aGUgbGlicmFyeSdzIHZlcnNpb24gbnVtYmVyLCBzZXBhcmF0ZWQgZm9yIGVhc2llcgogIHVzYWdlLiAnbWFrZXRneicgd2FzIHVwZGF0ZWQgYWNjb3JkaW5nbHkgdG8gZ2VuZXJhdGUgdGhlc2UgbnVtYmVycyBwcm9wZXJseQogIHdoZW4gYnVpbGRpbmcgcmVsZWFzZS1hcmNoaXZlcy4KCi0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXgsIHJlcG9ydGVkIGJ5IGJvdGggTWFydHkgS3VocnQgYW5kIEJlbmphbWluCiAgR2VyYXJkLgoKLSBNYXR0IFZlZW5zdHJhIHByb3ZpZGVkIGJ1aWxkIGZpbGVzIHRvIGJ1aWxkIGxpYmN1cmwgYXMgYSAiZnJhbWV3b3JrIiB1bmRlcgogIE1hYyBPUyBYLiBTZWUgdGhlIGxpYi9saWJjdXJsLmZyYW1ld29yay5tYWtlIGZvciBkZXRhaWxzLgoKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIG9mIFRSVUUgYW5kIEZBTFNFIGZyb20gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBmaWxlLgogIFRoZXkncmUgbm90IGluIG91ciBuYW1lIHNwYWNlIHNvIHdlIHNob3VsZCBub3QgZmlkZGxlIHdpdGggdGhlbS4KCkRhbmllbCAoNSBOb3ZlbWJlcikKLSBSZXBsYWNlZCB0aGUgbWFuIHBhZ2UgdG8gSFRNTCBjb252ZXJ0ZXIgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZTogcm9mZml0LgogIE1ha2VzIG5pY2VyIHdlYiBwYWdlcy4KCkRhbmllbCAoNCBOb3ZlbWJlcikKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHRvIGxldCB0aGVtIGJ1aWxkIGN1cmwgZmluZQogIG9uIFdpbmRvd3MuCgotIEtldmluIFJvdGggY29ycmVjdGVkIHRoZSBjeWd3aW4gcGFja2FnZSBnZW5lcmF0b3IgYW5kIHNwZWxsLWZpeGVkIHRoZQogIGNvbW1lbnQgaW4gdGhlIGNhLWJ1bmRsZS5oIGZpbGUuCgpWZXJzaW9uIDcuMTAuOCAoMSBOb3ZlbWJlciAyMDAzKQoKRGFuaWVsICgzMSBPY3RvYmVyKQotIEFzc3VtZSB0aGF0IE1EVE0gb24gYW4gRlRQIHNlcnZlciByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNpbmcgdGhlIFVUQyB0aW1lCiAgem9uZS4gVGhpcyBjaGFuZ2VzIHRoZSB0aW1lIENVUkxJTkZPX0ZJTEVUSU1FIHJldHVybnMgZm9yIGEgZ2l2ZW4gZmlsZSBvdmVyCiAgRlRQLCBhbmQgd2lsbCBjaGFuZ2UgZXhpc3RpbmcgdXNlcyBvZiBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEl0IHdpbGwgbWFrZQogIHRoZSBmdW5jdGlvbmFsaXR5IG1vcmUgc2ltaWxhciB0byBob3cgdGhlIEhUVFAgb25lIGlzIGFscmVhZHkgd29ya2luZy4KCi0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWNhbCBwYXJhbWV0ZXJzIChzdWNoIGFzIC15LCAtWSwgLUMgZXRjKQogIG5vdyByZXBvcnQgZXJyb3IgYW5kIGV4aXQgaWYgdGhlIHBhcmFtZXRlciBpc24ndCB0cnVseSBhIG51bWJlciBncmVhdGVyIHRoYW4KICBvciBlcXVhbCB0byB6ZXJvLiBUaGlzIGhlbHBzIHVzZXJzIHRvIG5vdGljZSBiYWQgdXNhZ2UgZWFybGllci4gQmVmb3JlLCB3aGVuCiAgYSB1c2VyIGZvcmdvdCBvciBtaXNzZWQgdG8gYWRkIGEgbnVtZXJpY2FsIHBhcmFtZXRlciB0byBhbiBvcHRpb24sIHRoZQogIGNvbW1hbmQgbGluZSBwYXJzZXIgd291bGQgc2ltcGx5ICJlYXQiIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFuZCBpdCB3b3VsZAogIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbi4KCkRhbmllbCAoMzAgT2N0b2JlcikKLSBEYXZpZCBIdWxsIG1hZGUgbGliY3VybCBkZWFsIHdpdGggTk9CT0RZIGFuZCBIRUFERVIgZm9yIGZpbGU6Ly8gdGhlIHNhbWUgd2F5CiAgaXQgYWxyZWFkeSBkb2VzIGZvciBGVFA6IGl0IHByb3ZpZGVzIEhUVFAtbG9va2luZyBoZWFkZXJzIHRoYXQgcHJvdmlkZSBpbmZvCiAgb25seSBhYm91dCB0aGUgZmlsZSwgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zZmVyLiBUaGUgY3VybCB0b29sIHRoZW4KICBsZXRzIC0taGVhZCBkbyB0aGlzLgoKRGFuaWVsICgyOSBPY3RvYmVyKQotIHJ1bnRlc3RzLnBsIG5vdyBjaGVja3MgZm9yIGFuZCB1c2UgdmFsZ3JpbmQgaWYgcHJlc2VudC4gSXQgd2lsbCByZWRpcmVjdCB0aGUKICB2YWxncmluZCByZXN1bHRzIGluIGxvZy92YWxncmluZFtudW1dIGJ1dCBpdCBjdXJyZW50bHkgZG9lc24ndCBzY2FuIHRoYXQKICBmaWxlIGZvciBhbnkgZXJyb3JzIG9yIGFueXRoaW5nLCB0aGF0IGlzIHN0aWxsIG9ubHkgbWFkZSBtYW51YWxseS4KCi0gRGF2aWQgSHVsbCBtYWRlIHRoZSBmaWxlOiBVUkwgcGFyc2VyIGFsc28gYWNjZXB0IHRoZSBzb21ld2hhdCBzbG9wcHkgZmlsZQogIHN5bnRheDogZmlsZTovcGF0aC4gSSBhZGRlZCB0ZXN0IGNhc2UgMjAzIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyOCBPY3RvYmVyKQotIERhbiBDIHRyYWNrZWQgZG93biB5ZXQgYW5vdGhlciB3ZWlyZCBiZWhhdmlvciBpbiB0aGUgZ2xpYmMgZ2V0aG9zdGJ5bmFtZV9yKCkKICBmdW5jdGlvbiBmb3Igc29tZSBzcGVjaWZpYyB2ZXJzaW9ucyAocmVwb3J0ZWQgb24gMi4yLjUgYW5kIDIuMS4xKSwgYW5kCiAgcHJvdmlkZWQgYSBmaXguIE9uIExpbnV4IG1hY2hpbmVzIHdpdGggdGhlc2UgZ2xpYmMgdmVyc2lvbnMsIG5vbi1pcHY2CiAgYnVpbGRzIG9mIGxpYmN1cmwgd291bGQgb2Z0ZW4gZmFpbCB0byByZXNvbHZlIHBlcmZlY3RseSByZXNvbHZhYmxlIGhvc3QKICBuYW1lcy4KCkRhbmllbCAoMjYgT2N0b2JlcikKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX21zbnByaW50ZigpIGNvdWxkIHdyaXRlIHRoZSB0cmFpbGluZwogIHplcm8tYnl0ZSBvdXRzaWRlIGl0cyBnaXZlbiBidWZmZXIgc2l6ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdlbmVyYXRlZAogIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIG92ZXJ3cml0ZSB0aGUgRVJST1JCVUZGRVIKICB3aXRoIG9uZSBieXRlLiBVc2luZyBhIG5vbi1leGlzdGluZyB2ZXJ5IGxvbmcgbG9jYWwgZmlsZTovLyBuYW1lIGlzIG9uZSBjYXNlCiAgdGhhdCBjb3VsZCBtYWtlIHRoaXMgb2NjdXIuCgpEYW5pZWwgKDI0IE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBmaWxlZCBidWcgcmVwb3J0ICM4Mjk4MjcuIEl0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGggLUMgLSBpZgogIHRoZSBmdWxsIGZpbGUgYWxyZWFkeSB3YXMgZG93bmxvYWRlZCBhbmQgdGh1cyB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEKICA0MTYuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHVzZSB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBhbmQgZXhwZWN0CiAgdGhhdCBzaXplIHRvIGdldCB0cmFuc2ZlciwgY2F1c2luZyBhICJoYW5nIiB1bnRpbCB0aGUgc2VydmVyIGNsb3NlZCB0aGUKICBjb25uZWN0aW9uIGFuZCB0aGVuIGFuIGVycm9yIDE4ICgic3RpbGwgTiBieXRlcyBkYXRhIGxlZnQgb2YgdGhlIHRyYW5zZmVyIikuCgogIE5vdyB3ZSBkb24ndCByZXR1cm4gYW55IGVycm9yIGF0IGFsbCwgYnV0IEkgdGhpbmsgbGliY3VybCBzaG91bGQgcGVyaGFwcwogIHJldHVybiBzb21lIGtpbmQgb2YgaW5mbyBzaW5jZSB0aGUgcmVxdWVzdGVkIHJhbmdlIHdhcyBvdXQgb2YgdGhlIHNpemUgb2YKICB0aGUgZG9jdW1lbnQuCgotIEJhc2VkIG9uIERhdmlkIEh1bGwncyBmaXggaW4gYnVnIHJlcG9ydCAjODA0NTk5LCB3ZSBub3cgY2hlY2sgZm9yIHNvbGFyaXMgYW5kCiAgZ2NjIGluIGNvbmZpZ3VyZSBhbmQgc2V0IHRoZSAtbWltcHVyZS10ZXh0IGxpbmsgZmxhZyBmb3IgbGlua2luZyB0aGUgbGliCiAgYmV0dGVyLgoKLSBJJ3ZlIGludHJvZHVjZWQgYSAtdCBvcHRpb24gdG8gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdC4gV2l0aCB0aGF0IG9wdGlvbiBzZXQsCiAgdGhlIHNjcmlwdCBydW5zIHNwZWNpYWwgIm1lbW9yeSB0b3J0dXJlIiB0ZXN0cy4gRm9yIGVhY2ggdGVzdCBjb21tYW5kIGxpbmUKICBpbiB0aGF0IHNlY3Rpb24sIHRoZSBzY3JpcHQgZmlyc3QgcnVucyB0aGUgY29tbWFuZCBsaW5lIGFuZCBjb3VudHMgdGhlIHRvdGFsCiAgYW1vdW50IG9mIGFsbG9jYXRpb25zIG1hZGUuIEl0IHRoZW4gcnVucyB0aGUgZXhhY3Qgc2FtZSBjb21tYW5kIGxpbmUgYWdhaW4sCiAgZm9yY2luZyBhbGxvY2F0aW9uIG51bWJlciBOIHRvIGZhaWwuIEl0IHdpbGwgdHJ5IGV2ZXJ5IE4gZnJvbSAxIHRvIHRoZSB0b3RhbAogIG51bWJlciBvZiBhbW91bnRzIG1hZGUuIEZvciBldmVyeSBpbnZva2UsIGl0IGNoZWNrcyB0aGF0IG5vIG1lbW9yeSB3YXMKICBsZWFrZWQgYXMgdGhhdCB3b3VsZCBpbmRpY2F0ZSBhIGJhZCBjbGVhbnVwIHNvbWV3aGVyZSBpbiB0aGUgY29kZS4KCiAgVGhpcyBpcyBqdXN0IGJlZ2lubmluZyB0byB3b3JrLCBhbmQgSSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBjb3JyZWN0aW9ucyBpbgogIGxpYmN1cmwgY29kZS4gV2hlbiB0aGlzIGNvZGUgd29ya3Mgc29tZXdoYXQgZmluZSwgSSdsbCBtYWtlIHN1cmUgJ21ha2UgdGVzdCcKICBpbiB0aGUgcm9vdCBkaXIgd2lsbCBydW4gdGhlc2UgdGVzdHMgYXMgd2VsbC4KCkRhbmllbCAoMjMgT2N0b2JlcikKLSBHZW9yZyBIb3JuIGZpeGVkIGhvdyB0aGUgQ0EgdmVyaWZpY2F0aW9uIGlzIG1hZGUuIFZlcmlmaWNhdGlvbnMgY2FuIG5vdyBiZQogIG1hZGUgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSB0aGUgcmVzdWx0IG9mIGl0IGNhbiBiZSBpZ25vcmVkLiBUaGlzIGFsc28KICBhZmZlY3RzIHRoZSBjdXJsIHRvb2wgYXMgLWsgY2FuIG5vdyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1jYWNlcnQgb3IKICAtLWNhcGF0aC4KCkRhbmllbCAoMjIgT2N0b2JlcikKLSBHaXNsZSBWYW5lbSBmb3VuZCBvdXQgLS1kaXNhYmxlLWVwcnQgZGlkbid0IHdvcmsgYW5kIHBhdGNoZWQgaXQuCgotIFRlc3QgY2FzZSA5MSB3YXMgbW9kaWZpZWQgYW5kIGNvdWxkIG5vdyByZXBlYXQgdGhlIHByb2JsZW0gS2V2aW4gUm90aCBoYXMKICByZXBvcnRlZCwgYW5kIHRoZSBidWcgd2FzIGZpeGVkLgoKLSBEeWxhbiBFbGxpY290dCBhZGRlZCB2Yy1saWJjdXJsLXNzbC1kbGwgYXMgYSB0YXJnZXQgdG8gdGhlIHJvb3QgbWFrZWZpbGUKICB0byBidWlsZCBhIHN0YXRpYyBsaWJjdXJsIHRoYXQgbGlua3Mgd2l0aCBhIHNoYXJlZCBPcGVuU1NMIHVzaW5nIE1TVkMuCgpEYW5pZWwgKDIxIE9jdG9iZXIpCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndzMyIG1ha2VmaWxlcy4KClZlcnNpb24gNy4xMC44LXByZTUgKDIxIE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTkgT2N0b2JlcikKLSBHZW9yZyBIb3JuIG1hZGUgbGliY3VybCBvdXRwdXQgbW9yZSBpbmZvIG9uIFNTTCBmYWlsdXJlcyB3aGVuIHJlY2VpdmluZwogIGRhdGEuCgpWZXJzaW9uIDcuMTAuOC1wcmU0ICgxOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE3IE9jdG9iZXIpCi0gRG9taW5pY2sgTWVnbGlvIGltcGxlbWVudGVkIENVUkxPUFRfTUFYRklMRVNJWkUgYW5kIC0tbWF4LWZpbGVzaXplLgoKLSBNYWRlIGxpYmN1cmwgc2hvdyB2ZXJib3NlIGluZm8gYWJvdXQgd2hhdCBhdXRoIHR5cGUgYW5kIHVzZXIgbmFtZSB0aGF0IGlzCiAgYmVpbmcgc2VudCBpbiBpdHMgSFRUUCByZXF1ZXN0LWhlYWRlcnMuCgpEYW5pZWwgKDE2IE9jdG9iZXIpCi0gUmVtb3ZlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuIGxpYmN1cmwKICBubyBsb25nZXIgcHJvbXB0IGZvciBwYXNzd29yZHMgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuIFBhc3N3b3JkIHByb21wdGluZwogIHdhcyBpbnN0ZWFkIG1vdmVkIHRvIGN1cmwsIHdoaWNoIG5vdyBwcm9tcHRzIGZvciBwYXNzd29yZCBpZiAtdSBvciAtVSBsYWNrCiAgaXQuIFRoaXMgc29sdmVzIHRoZSBwcm9ibGVtIEtldmluIFJvdGggcmVwb3J0ZWQgd2hlbiBjdXJsIHByb21wdGVkIGZvcgogIHBhc3N3b3JkIHR3aWNlIHdoZW4gZG9pbmcgTlRMTSBhdXRoZW50aWNhdGlvbi4KCi0gSSByZXdyb3RlIHRoZSBTU0wgc3ViamVjdEFsdE5hbWUgY2hlY2sgdG8gYXZvaWQgaGF2aW5nIHRvIHJlbHkgb24gT3BlbkxEQVAtCiAgbGljZW5zZWQgZGVyaXZhdGUgY29kZS4KCkRhbmllbCAoMTUgT2N0b2JlcikKLSBBdm9pZCBkb2luZyBnZXRzb2Nrb3B0KCkgb24gV2luZG93cyB0byB2ZXJpZnkgY29ubmVjdHMuIEl0IHNlZW1zIHRoYXQgdGhpcwogIGhvZ3MgV2luZG93cyBtYWNoaW5lcyB3aGVuIGxpYmN1cmwgaXMgYmVpbmcgdXNlZCBtdWx0aS10aHJlYWRlZCAod2l0aCA+IH41MAogIHRocmVhZHMpLiBBbmRyZXcgRnVsbGVyIGhlbHBlZCB1cyB2ZXJpZnkgYW5kIHRlc3QgdGhpcy4KCkRhbmllbCAoMTQgT2N0b2JlcikKLSBLaW1tbyBLaW5udW5lbiBmaXhlZCBhIGNyYXNoIHdpdGggZHVwaGFuZGxlKCkgd2hlbiBDVVJMREVCVUcgaXMgc2V0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIGxpYmN1cmwgYnVpbGQgYW5kIHdvcmsgd2l0aCBJUHY2IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDEzIE9jdG9iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSByZXBvcnRlZCB5ZXQgYW5vdGhlciBzZWdmYXVsdCB3aXRoIGFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZS4gTWUgZml4ZWQuCgotIERvbWVuaWNvIEFuZHJlb2xpIHJlbW92ZWQgdGhlIGV4dHJhIExERkxBR1MgYXNzaWdubWVudCBpbiBsaWIvTWFrZWZpbGUuYW0KICB0aGF0IHdhcyByZXBvcnRlZCBhYm91dCBpbiB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMjA4Ni4KCiAgRG9tZW5pY28gYWxzbyBmaXhlZCB0d28gbWFrZWZpbGVzIHdoZXJlIHdlIHVzZWQgJ2ducm9mZicgaW5zdGVhZCBvZiB0aGUgbW9yZQogIHBvcnRhYmxlICQoTlJPRkYpLgoKRGFuaWVsICgxMiBPY3RvYmVyKQotIERpcmsgTWFuc2tlIG1hZGUgdGhlIHNoYXJlIGxvY2tpbmcgYXJvdW5kIEROUyBsb29rdXBzIHNsaWdodGx5IGRpZmZlcmVudCB0bwogIGFsbG93IHRoZSBzaGFyZSBzeXN0ZW0ncyBETlMgbG9va3VwcyB0byBydW4gc29tZXdoYXQgbW9yZQogIGluZGVwZW5kZW50L2Zhc3Rlci4KCkRhbmllbCAoOSBPY3RvYmVyKQotIExhY2hsYW4gTydEZWEgZml4ZWQgYSByZXN1bWUgcHJvYmxlbTogIklmIEkgc2V0IENVUkxPUFRfUkVTVU1FX0ZST00sIHBlcmZvcm0KICBhbiBIVFRQIGRvd25sb2FkLCB0aGVuIHJlc2V0IENVUkxPUFRfUkVTVU1FX0ZST00gdG8gMCwgdGhlIG5leHQgZG93bmxvYWQKICBzdGlsbCBoYXMgYSBSYW5nZSBoZWFkZXIgd2l0aCBhIGdhcmJhZ2UgdmFsdWUuIiBidWcgcmVwb3J0ICM4MjA1MDIKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIGluZXRfcHRvbi5jIGZpbGUgYnVpbGQgZmluZSB1c2luZyBNU1ZDLgoKLSBUaGUgJ3N3cycgdGVzdCBzdWl0ZSB3ZWIgc2VydmVyIG5vdyAjaW5jbHVkZSBzZXR1cC5oIGZyb20gdGhlIGxpYiBkaXJlY3RvcnkuCiAgVGhpcyBtYWtlcyBpdCBtb3JlIHBvcnRhYmxlIGVhc2llci4KClZlcnNpb24gNy4xMC44LXByZTMgKDggT2N0b2JlciAyMDAzKQoKRGFuaWVsICg4IE9jdG9iZXIpCi0gRnJhbmsgVGljaGVsZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVzIGhvdyBsaWJjdXJsIGNvbm5lY3RzIHRvIG11bHRpcGxlCiAgYWRkcmVzc2VzLCBpZiBvbmUgb2YgdGhlbSBmYWlscyAoaXB2NC1jb2RlKS4KCkRhbmllbCAoNyBPY3RvYmVyKQotIE5laWwgRHVuYmFyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBjaGVjayBTU0wKICBzdWJqZWN0QWx0TmFtZXMgd2hlbiBtYXRjaGluZyBjZXJ0cy4gVGhpcyBpcyBhcHBhcmVudGx5IGRldGFpbGVkIGluIFJGQzI4MTgKICBhcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uIEkgaGFkIHRvIGFkZCBjb25maWd1cmUgY2hlY2tzIGZvciBpbmV0X3B0b24oKSBhbmQKICBvdXIgb3duIChzdHJpY3RseSBzcGVha2luZywgY29kZSBmcm9tIEJJTkQgd3JpdHRlbiBieSBQYXVsIFZpeGllKSBwcm92aWRlZAogIGNvZGUgZm9yIHRoZSBmdW5jdGlvbiBmb3IgcGxhdGZvcm1zIHRoYXQgbWlzcyBpdC4KCi0gSFRUUCBQT1NUIHVzaW5nIHRoZSByZWFkIGNhbGxiYWNrIGRpZG4ndCB3b3JrLCBhcyBGbG9yaWFuIFNjaG9wcG1hbm4KICByZXBvcnRlZC4KCkRhbmllbCAoNSBPY3RvYmVyKQotIFNoYXJlZCBwcm92aWRlZCBhIGZldyBmaXhlcyB0byBtYWtlIGxpYmN1cmwgYnVpbGQgb24gQmVPUwogIG91dC1vZi10aGUtYm94LiBOZXcgY29kZSBmb3IgQmVPUy1zdHlsZSBub24tYmxvY2tpbmcgc29ja2V0cywgcHJvdmlkZWQgYnkKICBTaGFyZCBhbmQgSmVyZW15IEZyaWVzbmVyLiBNb2RpZmllZCB0aGUgYXV0b2NvbmYgY2hlY2sgZm9yIG5vbi1ibG9ja2luZwogIHNvY2tldHMgdG8gY2hlY2sgZm9yIHRoaXMga2luZCB0b28uCgpEYW5pZWwgKDQgT2N0b2JlcikKLSBWaW5jZW50IEJyb25uZXIgcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3Ugc2V0IENVUkxPUFRfQ09PS0lFIGZvciBhIHRyYW5zZmVyCiAgYW5kIHRoZW4gc2V0IGl0IHRvIE5VTEwgaW4gYSBzdWJzZXF1ZW50IG9uZSwgdGhlIHByZXZpb3VzIGNvb2tpZSB3YXMgc3RpbGwKICBzZW50IG9mZiEKCi0gSm9uIFR1cm5lciBmaXhlZCBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBpdCBmYWlsZWQgb24gYW4gRlRQIHRyYW5zZmVyIGR1ZQogIHRvIGEgYmFkIHBhdGgsIGl0IHdvdWxkIGNhdXNlIHRoZSBuZXh0IHRyYW5zZmVyIHRvIHVzZSBhIGJhZCBwYXRoIGFzIHdlbGwuCgotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIHByb3ZpZGVkIGEgcGF0Y2ggd2l0aCBhIGZpeCBmb3IgbGliY3VybCB3aXRoIGFyZXMsCiAgd2hlbiB3b3JraW5nIG9uIElQLW9ubHkgbmFtZXMgYXMgd2UgdGhlbiBjb3VsZCByZXR1cm4gIndhaXQiIHN0YXR1cyB3aGVuIHRoZQogIG5hbWUgaW4gZmFjdCBhbHJlYWR5IHdhcyByZXNvbHZlZC4gSSBlZGl0ZWQgdGhlIHBhdGNoIHNsaWdodGx5IHRvIG5vdCBleHBvc2UKICBhc3luY2ggZGV0YWlscyB0byBub24tYXJlcyBhd2FyZSBzb3VyY2UgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyKQotIE5laWwgU3ByaW5nIHBvc3RlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMzE4MCwgYW5kIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcKICB0aGUgbmFtZSAnYWNjZXNzJyBpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZSBpcyBub3QgdmVyeSB3aXNlIGFzIHNvbWUgY29tcGlsZXJzCiAgY29tcGxhaW4uCgotIFBldGVyIFN5bHZlc3RlciBwcm92aWRlZCBoaXMgYW5kIEplYW4tUGF1bCBNZXJsaW4ncyBjdXJseC5jIGV4YW1wbGUgc291cmNlCiAgY29kZSB0aGF0IHNob3dzIGhvdyB0aGV5IHVzZSBzc2wgYW5kIGNhbGxiYWNrcy4KCkRhbmllbCAoMiBPY3RvYmVyKQotIEphbWVzIE1hY01pbGxhbidzIHBhdGNoIG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYuMi54LgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIpCi0gTXkgZGF1Z2h0ZXIgd2FzIGJvcm4hCgpEYW5pZWwgKDIzIFNlcHRlbWJlcikKLSBBZGRlZCBzdXBwb3J0IGZvciAtNC8tLWlwdjQgYW5kIC02Ly0taXB2NiB0byBmb3JjZSBuYW1lcyB0byByZXNvbHZlIHRvIHRoYXQKICBwYXJ0aWN1bGFyIElQIHZlcnNpb24uIFRoZXkgb25seSB3b3JrIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgotIGN1cmwgLVYgbm93IG91dHB1dHMgJ1NQTkVHTycgYXMgYSBmZWF0dXJlIGluIGNhc2UgbGliY3VybCB3YXMgYnVpbHQgdG8KICBzdXBwb3J0IHRoYXQuCgpWZXJzaW9uIDcuMTAuOC1wcmUyICgyMiBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoMjIgU2VwdGVtYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYSBzZWdmYXVsdCBpbiBsaWJjdXJsIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIHdpdGggYXJlcyBhbmQgZG9pbmcgcmVwZWF0ZWQgb3BlcmF0aW9ucyBhZ2FpbnN0IGEgbm9uLXJlc29sdmluZyBob3N0IG5hbWUuCgpEYW5pZWwgKDE5IFNlcHRlbWJlcikKLSBBZGRlZCB0aGUgQ1VSTE9QVF9JUFJFU09MVkUgb3B0aW9uLCB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWxlY3QKICB3aGF0IGtpbmQgb2YgSVAgYWRkcmVzc2VzIGhlIHdhbnRzIHRvIHVzZSB3aGVuIHJlc29sdmluZyBob3N0IG5hbWVzLiBUaGlzCiAgaXMgb25seSBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIGhvc3QgbmFtZXMgdGhhdCByZXNvbHZlIGFkZHJlc3NlcyB1c2luZyBtb3JlCiAgdGhhbiBvbmUgdmVyc2lvbiBvZiBJUC4KCi0gQXBwbGllZCBNYXJrdXMgTW9lbGxlcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBTUE5FR08gc3VwcG9ydCBpZiBsaWJjdXJsCiAgaXMgYnVpbHQgd2l0aCB0aGUgRkJvcGVuc3NsIGxpYnJhcmllcy4gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucwogIGluZm8gb24gU1BORUdPIGF2YWlsYWJpbGl0eS4gVGhlIHBhdGNoIGFsc28gbWFkZSB0aGUgR1NTQVBJIHN0dWZmIHdvcmsgZmluZQogIHdpdGggdGhlIE1JVCBHU1MtbGlicmFyeSAodGhlIEhlaW1kYWwgb25lIHN0aWxsIHdvcmtzIHRvbykuCgpEYW5pZWwgKDE2IFNlcHRlbWJlcikKLSBEb2luZyBQVVQgd2l0aCAtLWRpZ2VzdCBmYWlsZWQsIGFzIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzgwNTg1My4KCi0gVXNpbmcgLS1hbnlhdXRoIHRoYXQgcGlja2VkIE5UTE0sIGFuZCB0aGVuIGEgcmVkaXJlY3QgY2xvc2VkIHRoZSBjb25uZWN0aW9uCiAgYW5kIHRvb2sgY3VybCB0byBhIHNlY29uZCBOVExNIHBhZ2UgbWFkZSBjdXJsIGZhaWwuIEJ1ZyByZXBvcnQgIzgwNjMyOAogIGlkZW50aWZpZWQgdGhlIHByb2JsZW0sIHRlc3QgY2FzZSA5MCB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE0IFNlcHRlbWJlcikKLSBjb2RlbWFzdHIgYnJvdWdodCBhIHBhdGNoIGZvciBhcmVzIHRvIG1ha2UgdGhlIFdpbmRvd3MgcG9ydGlvbnMgb2YgaXQgd29yawogIHByb3Blcmx5IG9uIE5UNC4gSSB1cGxvYWRlZCBhIG5ldyBkaWZmIGFuZCB1cGRhdGVkIHRoZSBkb2NzIG9uIHdoZXJlIHRvIGdldAogIGl0IGV0Yy4KCi0gSmVmZiBQb2hsbWV5ZXIgdHJhY2tlZCBkb3duIGEgdmVyeSBoYXJkLXRvLWZpbmQgYnVnIHdoZXJlIHdlIHJlbW92ZWQgYQogIGNhY2hlZCBETlMgZW50cnkgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGluIHVzZSwgd2hpY2ggY2F1c2VkICJyYW5kb20iIG1lbW9yeQogIHRvIGdldCBvdmVyd3JpdHRlbiBhbmQgdGh1cyAicmFuZG9tIiBjcmFzaGVzLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIpCi0gQmFzZWQgb24gYSBidWcgcmVwb3J0IGJ5IERhdmlkIEtpbWRvbiwgSSBtYWRlIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2xlYXIKICBhbGwgcG9zc2libGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4KCi0gQnkgZGVmYXVsdCwgZWFzeSBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSBub3cgc2hhcmUgRE5TIGNhY2hlLgoKLSBUaW0gQmFydGxleSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgR1NTTkVHT1RJQVRFIG9wdGlvbiB3b3JrIGZvcgogIE1pY3Jvc29mdCdzICJOZWdvdGlhdGUiIGF1dGhlbnRpY2F0aW9uIGFzIHdlbGwuCgpEYW5pZWwgKDExIFNlcHRlbWJlcikKLSBBIHplcm8tbGVuZ3RoIHByb3h5IHN0cmluZyBjb25mdXNlZCBGVFAgdHJhbnNmZXJzLgoKLSBCam9ybiBSZWVzZSBmb3VuZCBhIGNhc2Ugd2l0aCBhbiB1bmluaXRpYWxpemVkIHBvaW50ZXIsIG9ubHkgcHJlc2VudCB3aGVuCiAgYnVpbHQgZm9yIGFyZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmUxICg4IFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICg3IFNlcHRlbWJlcikKLSBKdXJpaiBTbWFrb3YgZm91bmQgb3V0IHRoYXQgdGhlIG5vbi1PcGVuU1NMIE1ENSBjb2RlIHdhcyBub3Qgd29ya2luZyBvbgogIEFscGhhIChvciBpYTY0KS4gT25seSB0aGUgT3BlblNTTC12ZXJzaW9uIGRpZC4gSSBtYWRlIGEgZml4IEkgdGhpbmsgY29ycmVjdHMKICB0aGUgcHJvYmxlbS4gCgpEYW5pZWwgKDUgU2VwdGVtYmVyKQotIEtldmluIEZpc2sgcmVwb3J0ZWQgdGhhdCBjb25maWd1cmUgLS1lbmFibGUtdGhyZWFkIGRpZG4ndCB3b3JrLiBJIGZpeGVkLgoKLSBEZS1tYWNyb2ZpZWQgdGhlIGxpYi9oYXNoLmMgc291cmNlIGNvZGUgc29tZXdoYXQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyKQotIENVUkxJTkZPX0hUVFBBVVRIX0FWQUlMIGFuZCBDVVJMSU5GT19QUk9YWUFVVEhfQVZBSUwgYWRkZWQsIEJhc2VkIG9uIEpvZXJnCiAgTXVlbGxlci1Ub2xrJ3MgcGF0Y2gsCgpFYXJseSAoNCBTZXB0ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVCAtIGFsbG93cyB1c2VyIHRvIHNldCBzdHJpY3QgdGltZW91dAogIHJlcXVpcmVtZW50cyBvbiB0aGUgRlRQIHNlcnZlcidzIGFiaWxpdHkgdG8gcmVzcG9uZCB0byBpbmRpdmlkdWFsIGNvbW1hbmRzCiAgd2l0aG91dCBwbGFjaW5nIGdsb2JhbCByZXF1aXJlbWVudHMgb24gdHJhbnNmZXIgb3IgY29ubmVjdCB0aW1lLiAgRmlsZXMKICBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGJyYW5jaCBpbnNpZGUgQ3VybF9HZXRGVFBSZXNwb25zZSB0byBjaGVjayBmb3IgCiAgICAgICAgZGF0YS0+c2V0LmZ0cF9yZXNwb25zZV90aW1lb3V0CiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfcmVzcG9uc2VfdGltZW91dCB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCkRhbmllbCAoMyBTZXB0ZW1iZXIpCi0gUGV0ZXIgUGVudGNoZXYgZm91bmQgYW5kIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgdGVzdCBzdWl0ZSdzIHdlYiBzZXJ2ZXIKICBjb2RlLCB0aGF0IG1hZGUgaXQgc2VnZmF1bHQgYXQgdGltZXMuCgotIEr2cmcgTXVlbGxlci1Ub2xrIGltcHJvdmVkIHRoZSBwcm94eSB1c2VyK3Bhc3N3b3JkIGhhbmRsaW5nLCBlc3BlY2lhbGx5CiAgd2hlbiBwcm92aWRpbmcgYSBibGFuayBwYXNzd29yZC4KCkRhbmllbCAoMiBTZXB0ZW1iZXIpCi0gRml4IGZvciBtYWtpbmcgQ09OTkVDVCB0byBwcm94aWVzIGRvIHRoZSBjb3JyZWN0IG1hZ2ljIHRvIGFsbG93IE5UTE0sIERpZ2VzdAogIGFuZCBzaW1pbGFyIHRvIHdvcmsuCgpEYW5pZWwgKDEgU2VwdGVtYmVyKQotIEhlbnJpayBTdG9ybmVyIG1hZGUgbGliY3VybCB3b3JrIGZpbmUgd2l0aCBPcGVuTERBUCAyLjEuMjIgKGN1cnJlbnQpLgoKLSBKZWZmIFBvaGxtZXllciBhZGRlZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIGZvciBub24tcmVzb2x2aW5nIGhvc3RzIHdoZW4KICB1c2luZyBhcmVzIGZvciBsb29rdXBzLgoKRGFuaWVsICgyNSBBdWd1c3QpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIHRoYXQgY3VybCAtayBzdGlsbCBmYWlsZWQgaWYgdGhlIEhUVFBTIHNlcnZlcidzIENOCiAgZmllbGQgd2Fzbid0IG9idGFpbmFibGUuIFRoaXMgd2FzIGR1ZSB0byB0aGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBiZWluZwogIHNldCB0byAxLCBhbmQgbGliY3VybCBmYWlsZWQgaWYgdGhlIENOIHdhcyBtaXNzaW5nLiBTdGFydGluZyBub3csIGhhdmluZyBpdAogIHNldCB0byAxIHdpbGwgc2ltcGx5IG91dHB1dCBhIHdhcm5pbmcgaWYgbm8gQ04gY291bGQgYmUgb2J0YWluZWQgKGFzIGhhdmluZwogIGEgbWlzbWF0Y2ggaXMgT0spLgoKRGFuaWVsICgyMSBBdWd1c3QpCi0gVmluY2VudCBTYW5kZXJzIHByb3ZpZGVkIGEgZml4IGZvciBuYW1lIHJlc29sdmluZyB3aGVuIGxpbmtlZCB3aXRoIHVDbGliYy4KCkRhbmllbCAoMjAgQXVndXN0KQotIEdlcmQgdi4gRWdpZHkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RvcmUgdGhlIEZUUCByZXNwb25zZQogIGNvZGUgZnJvbSBmdHAgc2VydmVycy4gVXNpbmcgY3VybF9lYXN5X2dldGluZm8oKSB3aXRoIENVUkxJTkZPX0hUVFBfQ09ERQogIHJldHVybnMgdGhhdCBkYXRhLiBUaGUgb3B0aW9uIGlzIHRoZXJlZm9yZSBub3cgYWxzbyBrbm93biBhcwogIENVUkxJTkZPX1JFU1BPTlNFX0NPREUuCgotIEFudG9pbmUgQ2FsYW5kbyBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gZG9pbmcgbXVsdGktcGFydC9mb3JtcG9zdCB1c2luZwogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgotIEFudG9pbmUgQ2FsYW5kbyBwb2ludGVkIG91dCB0aGF0IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgZGlkbid0IHNldCB0aGUKICBtc2dzX2luX3F1ZXVlIHRvIDAgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgTlVMTC4KCkRhbmllbCAoMTkgQXVndXN0KQotIEkgbWFkZSBjdXJsIHN1cHBvcnQgbXVsdGlwbGUgLVQgb3B0aW9ucywgYXMgd2VsbCBhcyAtVCAie2ZpbGUxLGZpbGUyfSIKICBzdHlsZSBnbG9iYmluZy4gT25lIC1UIGZvciBlYWNoIFVSTCBpcyBzdXBwb3J0ZWQuCgotIEplZmYgUG9obG1leWVyIGZvdW5kIGEgc2VnZmF1bHQgd2hlbiB1c2luZyBhcmVzLWVuYWJsZWQgbGliY3VybCBhbmQgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIHdoZW4gdHJ5aW5nIGEgbm9uLWV4aXN0aW5nIGhvc3QgbmFtZS4KCi0gTWFkZSB0aGUgbGliY3VybCBwcmludGYgY29kZSBzdXBwb3J0IGxvbmcgbG9uZ3MgaWYgYXZhaWxhYmxlLgoKLSBMb3JlbiBLaXJrYnkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBkaWQgbm90IGNsZWFuIHVwIGFsbCBTU0wtYWxsb2NhdGVkIG1lbW9yeQogIGluIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KCkRhbmllbCAoMTcgQXVndXN0KQotIFNldHRpbmcgQ1VSTE9QVF9XUklURUZVTkNUSU9OIG9yIENVUkxPUFRfUkVBREZVTkNUSU9OIHRvIE5VTEwgd2lsbCBub3cgbWFrZQogIHRoZW0gZ2V0IHRoZSBpbnRlcm5hbCBkZWZhdWx0cyByZXN0b3JlZC4gUHJldmlvdXNseSB0aGlzIGNvdWxkIGNhdXNlIGEKICBzZWdmYXVsdC4gV2Ugc2hvdWxkIGFpbSBhdCBoYXZpbmcgYWxsIHBvaW50ZXItcmVsYXRlZCBvcHRpb25zIGdldCByZXN0b3JlZAogIHRvIGRlZmF1bHQvc2FmZSB2YWx1ZXMgd2hlbiBzZXQgdG8gTlVMTC4KClZlcnNpb24gNy4xMC43ICgxNSBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTQgQXVndXN0KQotIEkgbW9kaWZpZWQgdGhlIG1lbWRlYnVnIHN5c3RlbSB0byByZXR1cm4gZmFpbHVyZSBvbiBtZW1vcnkgYWxsb2NhdGlvbgogIGZ1bmN0aW9ucyBhZnRlciBhIHNldCBhbW91bnQgb2Ygc3VjY2Vzc2Z1bCBvbmVzLiBUaGlzIGVuYWJsZXMgdXMgdG8gdGVzdAogIG91dC1vZi1tZW1vcnkgc2l0dWF0aW9ucyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyIGFuZCB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQKICBjdXJsL2xpYmN1cmwgYmVoYXZlcyBnb29kIGluIHRob3NlLgoKICBUaGlzIG1hZGUgbWUgZmluZCBhbmQgZml4IHNldmVyYWwgc3BvdHMgd2hlcmUgd2UgZGlkIG5vdCBjbGVhbnVwIHByb3Blcmx5CiAgd2hlbiBiYWlsaW5nIG91dCBkdWUgdG8gZXJyb3JzIChsb3cgbWVtb3J5KS4KCi0gQ29ycmVjdGVkIHRlc3QgY2FzZSA3NC4gTWFkZSB1c2luZyAtbyB3aXRoIGJhZCAjW251bV0gY29kZXMgY29tcGxhaW4gYW5kCiAgYmFpbCBvdXQuIE1hZGUgI1tudW1dIHN1cHBvcnQgbnVtYmVycyBsYXJnZXIgdGhhbiA5IGFzIHdlbGwuIEFkZGVkIHRlc3QKICBjYXNlIDg2IGZvciBhIHByb3BlciByYW5nZSBnbG9iYmluZyB0ZXN0IGFzIHdlbGwuCgpWZXJzaW9uIDcuMTAuNy1wcmU0ICgxMiBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTIgQXVndXN0KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBmbGFnIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXN5bmNoIEROUwogIHN1cHBvcnQsIGFuZCB0aGlzIGlzIG5vdyBhbHNvIGRpc3BsYXllZCB3aXRoICdjdXJsIC1WJy4KCi0gQWRkZWQgYSBmZXcgbmV3IG1hbiBwYWdlcyB0byB0aGUgZG9jcy9saWJjdXJsIGRpcjogY3VybF9zaGFyZV9pbml0LAogIGN1cmxfc2hhcmVfc2V0b3B0LCBjdXJsX3NoYXJlX2NsZWFudXAsIGxpYmN1cmwtZWFzeSBhbmQgbGliY3VybC1zaGFyZS4KCkRhbmllbCAoMTEgQXVndXN0KQotIE1pa2UgQ2hlcmVwb3YgbWFkZSB0aGUgbG9jYWwgYmluZGluZyBjb2RlIHdvcmsgZm9yIFdpbmRvd3MsIHdoaWNoIG1ha2VzCiAgdGhlIG9wdGlvbiBDVVJMT1BUX0lOVEVSRkFDRSB3b3JrIG9uIFdpbmRvd3MgYXMgd2VsbC4KCi0gVmluY2VudCBTYW5kZXJzIHVwZGF0ZWQgdGhlIGZvcGVuLmMgZXhhbXBsZSBjb2RlIGEgbG90LgoKLSAtLXByb3h5LW50bG0gaXMgbm93IHN1cHBvcnRlZCBieSB0aGUgY3VybCB0b29sLiBJdCBmb3JjZXMgdGhlIHByb3h5CiAgYXV0aGVudGljYXRpb24gdG8gYmUgbWFkZSB1c2luZyBOVExNLiBJdCBkb2VzIG5vdCB5ZXQgd29yayBmb3IgSFRUUFMgb3ZlcgogIHByb3hpZXMgKG9yIG90aGVyIHByb3h5LXR1bm5lbGluZyBvcHRpb25zKS4gVGVzdCBjYXNlIDgxIGFuZCA4MiBkbyBzb21lCiAgc2ltcGxlIGluaXRpYWwgbnRsbSB0ZXN0aW5nLgoKLSBGb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHdpdGgKICBwcm94eS1hdXRoZW50aWNhdGlvbi4KCi0gSSByZW1vdmVkIC1AIGFuZCAtWiBhcyB2YWxpZCBzaG9ydCBvcHRpb25zLiBUaGV5IHdlcmUgdmVyeSByYXJlbHkgdXNlZCAoQAogIHdhc24ndCBldmVuIGRvY3VtZW50ZWQpLgoKLSBTZXJnZSBTZW1hc2hrbyBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlBVVRILCBhbmQgbWFrZSBpdCB3b3JrIHdoZW4gc2V0IHRvCiAgQ1VSTEFVVEhfTlRMTSBhbmQvb3IgQ1VSTEFVVEhfQkFTSUMuIFRoZSBQUk9YQVVUSCBpcyBzaW1pbGFyIHRvIEhUVFBBVVRILAogIGJ1dCBpcyBmb3IgdGhlIHByb3h5IGNvbm5lY3Rpb24gb25seSwgYW5kIEhUVFBBVVRIIGlzIGZvciB0aGUgcmVtb3RlIGhvc3QuCgotIEZpeGVkIGxvYWRpbmcgb2YgY29va2llcyB3aXRoIGJsYW5rIGNvbnRlbnRzIGZyb20gYSBjb29raWUgamFyLiBBbHNvIG1hZGUgdGhlCiAgY29va2llIGZ1bmN0aW9ucyBpbmZvcm0gb24gYWRkZWQgYW5kIHNraXBwZWQgY29va2llcyAoZm9yIGNvb2tpZSBkZWJ1Z2dpbmcpLgoKVmVyc2lvbiA3LjEwLjctcHJlMyAoOCBBdWd1c3QgMjAwMykKCkRhbmllbCAoOCBBdWd1c3QpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIGZpeCBmb3IgZmlsZTovLyBVUkxzIHdpdGggZHJpdmUgbGV0dGVycyBpbmNsdWRlZC4KCi0gSSBhZGRlZCB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgdG8gdGhlIGNsaWVudCBjb2RlLCB3aGljaCBhY3RpdmF0ZXMgRWFybHkncwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uLCBhbmQgd3JvdGUgdGVzdCBjYXNlIDE0NyB0byB2ZXJpZnkKICBpdC4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUgY3VybC4xIG1hbiBwYWdlIHRvby4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUKICBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UgdG9vLgoKRGFuaWVsICg3IEF1Z3VzdCkKLSBUZXN0IGNhc2UgNjAgZmFpbGVkIG9uIGlhNjQgYW5kIEFNRCBPcHRlcm9uLiBGaXhlZCBub3cuCgotIEZpeGVkIGEgcHJpbnRmIHByb2JsZW0gdGhhdCByZXN1bHRlZCBpbiB1cmxnbG9iYmluZyBidWdzIChidWcgIzIwMzgyNyBpbiB0aGUKICBkZWJpYW4gYnVnIHRyYWNrZXIpLiBBZGRlZCB0ZXN0IGNhc2UgNzQgdG8gdmVyaWZ5IHRoZSBmaXggYW5kIHRvIGRpc2NvdmVyIGlmCiAgdGhpcyBicmVha3MgaW4gdGhlIGZ1dHVyZS4KCi0gIm1ha2UgZGlzdGNoZWNrIiB3b3JrcyBhZ2Fpbi4KClZlcnNpb24gNy4xMC43LXByZTIgKDYgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDUgQXVndXN0KQotIER1bmNhbiBXaWxjb3ggaGVscGVkIG1lIHZlcmlmeSB0aGF0IHRoZSBsYXRlc3QgaW5jYXJuYXRpb24gb2YgbXkgYXJlcyBwYXRjaAogIGJ1aWxkcyBmaW5lIG9uIE1hYyBPUyBYIChzZWUgdGhlIG5ldyBsaWIvUkVBRE1FLmFyZXMpIGZpbGUgZm9yIGFsbCBkZXRhaWxzLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmaWxlZCBidWcgcmVwb3J0ICM3ODMxMTYgYW5kIEVhcmx5IEVobGluZ2VyIHBvc3RlZCBhCiAgYnVnIHJlcG9ydCB0byB0aGUgbGliY3VybCBsaXN0LCBib3RoIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoIEZUUAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGhvdyB0aGUgZGlyIGhpZXJhcmNoeSB3YXMgbm90IHByb3Blcmx5IHJlc2V0CiAgYmV0d2VlbiBmaWxlcy4KCi0gRGF2aWQgQnlyb24ncyB0aG91Z2h0cyBvbiBhIGZpeGVkIE1ha2VmaWxlIGluIHRlc3RzLyB3ZXJlIGFwcGxpZWQuCgotIEphbiBTdW5kaW4gcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGN1cmwgaWdub3JlZCBhIGNvb2tpZSB0aGF0IGJyb3dzZXJzIGRvbid0LAogIHdoaWNoIHR1cm5lZCB1cCB0byBiZSBkdWUgdG8gdGhlIG51bWJlciBvZiBkb3RzIGluIHRoZSAnZG9tYWluJy4gSSd2ZSBub3cKICBtYWRlIGN1cmwgZm9sbG93IHRoZSB0aGUgb3JpZ2luYWwgbmV0c2NhcGUgY29va2llIHNwZWMgbGVzcyBzdHJpY3Qgb24gdGhhdAogIHBhcnQuCgpEYW5pZWwgKDQgQXVndXN0KQotIERpcmsgTWFuc2tlIGFkZGVkIGNvb2tpZSBzdXBwb3J0IGZvciB0aGUgZXhwZXJpbWVudGFsLCBoaWRkZW4gYW5kIHN0aWxsCiAgdW5kb2N1bWVudGVkIHNoYXJlIGZlYXR1cmUhCgotIE1hcmsgRmxldGNoZXIgcHJvdmlkZWQgYW4gZXhjZWxsZW50IGJ1ZyByZXBvcnQgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggRk9MTE9XTE9DQVRJT04gYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcsIGFzIGxpYmN1cmwgd291bGQgbm90CiAgcHJvcGVybHkgaWdub3JlIHRoZSBib2R5IGNvbnRlbnRzIG9mIDNYWCByZXNwb25zZSB0aGF0IGluY2x1ZGVkIHRoZQogIExvY2F0aW9uOiBoZWFkZXIuCgpFYXJseSAoNiBBdWd1c3QpCi0gQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIFRoaXMgb3B0aW9uIHdpbGwgZm9yY2UgdGhlIHRhcmdldCBmaWxlJ3MgcGF0aCB0byBiZSBjcmVhdGVkIGlmIGl0CiAgICBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSByZW1vdGUgc3lzdGVtLgogCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfbWtkLCB3aGljaCBpc3N1ZXMgYSBNS0QgY29tbWFuZAogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9mb3JjZV9jd2QsIHdoaWNoIGF0dGVtcHRzIGEgQ1dELAogICAgICAgICAgYW5kIGRvZXMgYSBNS0QgYW5kIHJldHJpZXMgdGhlIENXRCBpZiB0aGUgb3JpZ2luYWwgQ1dECiAgICAgICAgICBmYWlscwogICAgICAgIE1vZGlmaWVkIGZ0cF9wZXJmb3JtKCkgdG8gY2FsbCBpdHMgY2hhbmdlIGRpcmVjdG9yeSBmdW5jdGlvbgogICAgICAgICAgdGhyb3VnaCBhIHBvaW50ZXIuICBUaGUgcG9pbnRlciBwb2ludHMgdG8gZnRwX2N3ZCBieSBkZWZhdWx0LAogICAgICAgICAgYW5kIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGZ0cF9mb3JjZV9jd2QgSUZGCiAgICAgICAgICBkYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgaXMgbm90IDAuICAgICAgICAKICAgIC0gbGliL3VybC5jCiAgICAgICAgTW9kaWZpZWQgQ3VybF9zZXRvcHQgdG8gcmVjb2duaXplIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL3VybGRhdGEuaAogICAgICAgIEFkZGVkIGZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIHRvIHN0cnVjdCBVc2VyRGVmaW5lZAogICAgICAgCi0gTWlub3IgQnVnZml4IGZvciBDVVJMT1BUX1RJTUVDT05ESVRJT04gd2l0aCBGVFAgLSBpZiB0aGUgZmlsZSB3YXMgbm90CiAgcHJlc2VudCB0byBkbyB0aGUgdGltZSBjb21wYXJpc29uLCBpdCB3b3VsZCBmYWlsLgogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBsaWIvZnRwLmMKICAgICAgICBJbiBmdHBfcGVyZm9ybSgpLCB0aGUgY2FsbCB0byBmdHBfZ2V0ZmlsZXRpbWUoKSB1c2VkIHRvIGJlIGZvbGxvd2VkCiAgICAgICAgYnkKCSAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICBBbmQgdGhlbiBieSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IGRpZCB0aGUgdGltZSBjb21wYXJpc29uLgogICAgICAgIFRoZSBjb2RlIHRoYXQgZGlkIHRoZSBjb21wYXJpc29uIGhhbmRsZWQgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGV0aW1lCiAgICAgICAgd2FzIG5vdCBhdmFpbGFibGUgKGFzIGluZGljYXRlZCBieSBpbmZvLmZpbGV0aW1lIDwgMCBvciBzZXQudGltZXZhbHVlIAogICAgICAgIDwgMCksIHNvIEkgcmVwbGFjZWQgdGhlIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQgd2l0aCBhIHN3aXRjaChyZXN1bHQpCiAgICAgICAgdGhhdCBhbGxvd3MgQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFIHRvIGZhbGwgdGhyb3VnaCB0byB0aGUgCiAgICAgICAgbm9ybWFsIHRpbWUgY29tcGFyaXNvbi4KCkRhbmllbCAoMyBBdWd1c3QpCi0gV2hlbiBwcm94eSBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIGluIGEgQ09OTkVDVCByZXF1ZXN0IChhcyB1c2VkIGZvciBhbGwgU1NMCiAgY29ubmVjdHMgYW5kIG90aGVyd2lzZSBlbmZvcmNlZCB0dW5uZWwtdGhydS1wcm94eSByZXF1ZXN0cyksIHRoZSBzYW1lCiAgYXV0aGVudGljYXRpb24gaGVhZGVyIGlzIGFsc28gd3JvbmdseSBzZW50IHRvIHRoZSByZW1vdGUgaG9zdC4KCiAgVGhpcyBpcyBhIHJhdGhlciBzaWduaWZpY2FudCBpbmZvIGxlYWsuIEkndmUgZml4ZWQgaXQgbm93IGFuZCBtYWlsZWQgYSBwYXRjaAogIGFuZCB3YXJuaW5nIHRvIHRoZSBtYWlsaW5nIGxpc3RzLgoKRGFuaWVsICgxIEF1Z3VzdCkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRvIG1ha2UgNy4xMC42IGJ1aWxkIGNvcnJlY3RseSB3aXRoIHRoZQogIGNvbXByZXNzZWQgaHVnZWhlbHAuYyBzb3VyY2UgZmlsZS4KClZlcnNpb24gNy4xMC43LXByZTEgKDMxIEp1bHkgMjAwMykKCkRhbmllbCAoMzAgSnVseSkKLSBK9nJnIE38bGxlci1Ub2xrIHVwZGF0ZWQgdGhlIFZDIG1ha2VmaWxlLgoKLSBEYW5pZWwgTm9ndWVyb2wgbWFkZSB0aGUgZnRwIGNvZGUgb3V0cHV0ICJBY2NlcHQtUmFuZ2VzOiBieXRlcyIgaW4gc2ltaWxhcgogIHN0eWxlIGxpa2Ugb3RoZXIgZmFrZWQgSFRUUCBoZWFkZXJzIHdoZW4gTk9CT0RZIGFuZCBIRUFERVIgYXJlIHVzZWQuIEkKICB1cGRhdGVkIHR3byBjb3JyZXNwb25kaW5nIHRlc3QgY2FzZXMgdG9vLgoKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gb24gVk1TIGR1ZSB0byBteSBoYXZpbmcKICBjaGFuZ2VkIGEgdHlwZSBmcm9tIGxvbmcgdG8gdGltZV90LCBhbmQgSSdtIG5vdyBjaGFuZ2luZyBpdCBiYWNrIHRvIHdvcmsKICBtb3JlIHBvcnRhYmx5Li4uCgogIEhlIGFsc28gaW5kaWNhdGVkIHRoYXQgZGlzdHJpYnV0aW5nIHRoZSBzcmMvaHVnZWhlbHAuYyBpbiBhIGNvbXByZXNzZWQgc3RhdGUKICBsaWtlIEkgYWNjaWRlbnRhbGx5IGRpZCBtYXkgbm90IGJlIHRoZSBzbWFydGVzdCBtb3ZlLi4uIEkndmUgbm93IGZpeGVkIHRoZQogIGRpc3RyaWJ1dGUgcHJvY2VkdXJlIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gd2hlbiBJCiAgbWFrZSByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgyOSBKdWx5KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY2hhbmdlcyB0byB0aGUgbWtoZWxwIHNjcmlwdCBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlCiAgY29tcHJlc3NlZCBoZWxwIHRleHQgb24gc29tZSBwbGF0Zm9ybXMuCgpWZXJzaW9uIDcuMTAuNiAoMjggSnVseSAyMDAzKQoKRGFuaWVsICgyOCBKdWx5KQotIEZyYW7nb2lzIFBvbnMgYnJvdWdodCBhIHBhdGNoIHRoYXQgb25jZSBhZ2FpbiBtYWRlIGN1cmwgZGVhbCB3aXRoIGZ0cCBhbmQKICAiZG91YmxlIHNsYXNoIiBhcyBpbmRpY2F0aW5nIHRoZSByb290IGRpcmVjdG9yeS4gSW4gdGhlIFJGQzE3MzgtZml4IG9mIEFwcmlsCiAgMzAsIHRoYXQgYWJpbGl0eSB3YXMgcmVtb3ZlZCAoc2luY2UgaXQgaXMgbm90IHRoZSAicmlnaHQiIHdheSkuIFNvLCBzdGFydGluZwogIG5vdyB3ZSBjYW4gbGlzdCB0aGUgcm9vdCBkaXIgb2YgYW4gZnRwIHNlcnZlciBib3RoIHRoZXNlIHdheXM6CgogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLyUyZiAgYXMgd2VsbCBhcwogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLy8KCkRhbmllbCAoMjQgSnVseSkKLSBIZW5yeSBCbGFuZCBwb2ludGVkIG91dCB0aGF0IHdlIGluY2x1ZGVkIHN5cy9yZXNvdXJjZS5oIHdpdGhvdXQgZ29vZCByZWFzb24KICBpbiBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gV2l0aG91dCBpdCBpbmNsdWRlZCwgUU5YIGJ1aWxkcyBiZXR0ZXIuLi4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgpEYW5pZWwgKDIzIEp1bHkpCi0gVHJhY3kgQm9laHJlciBleHBlcmllbmNlZCBETlMgY2FjaGUgcHJvYmxlbXMgYW5kIGRpZCBzb21lIG5pY2UgZGVidWdnaW5nCiAgYW5kIHRyYWNraW5nIHdoaWNoIG1hZGUgaXQgZWFzeSBmb3IgbWUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbSBhbmQgVHJhY3kKICBjb3VsZCB2ZXJpZnkgdGhhdCBpdCBkaWQgY3VyZSB0aGUgcHJvYmxlbSEgV2hlbiByZS11c2luZyBhIGNvbm5lY3Rpb24gd2UKICBub3cgbWFrZSBzdXJlIHdlIGRvbid0IHJlLXVzZSB0aGUgJ2Nvbm5lY3RfYWRkcicgc3RydWN0LgoKLSBEYW5pZWwgS291cmlsIGNvcnJlY3RlZCB0aGUgR1NTLU5lZ290aWF0ZSBjb2RlLgoKLSBKdWFuIEYuIENvZGFnbm9uZSBwcm92aWRlZCBmaXhlcyB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIGZpbmUgb24gV2luZG93cwogIGFnYWluLgoKRGFuaWVsICgyMiBKdWx5KQotIEVkaXRlZCB0aGUgY3VybC9jdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJ1aWxkIG9uIFdpbmRvd3MgcHJvcGVybHkuCgpEYW5pZWwgKDIxIEp1bHkpCi0gTW92ZWQgdGhlIHByb3h5IGNyZWRlbnRpYWxzIGZyb20gdGhlIFNlc3Npb25IYW5kbGUgc3RydWN0IHRvIHRoZSBjb25uZWN0ZGF0YQogIHN0cnVjdCwgdG8gbWFrZSBtdWx0aXBsZSBwcm94eSBjb25uZWN0aW9ucyB3aXRoIGRpZmZlcmVyZW50IHVzZXIgbmFtZXMgd29yay4KCi0gQWRqdXN0ZWQgdGhlIE5UTE0gY29kZSB0byBzdXBwb3J0IHByb3h5IGZ1bmN0aW9uYWxpdHkuCgotIE1hZGUgdGhlIGtyYjQgc3R1ZmYgY29tcGlsZSB3aXRoIHRoZSB1c2VyK3Bhc3N3b3JkIGZpZWxkcyBtb3ZlZC4KClZlcnNpb24gNy4xMC42LXByZTQgKDIxIEp1bHkgMjAwMykKCkRhbmllbCAoMjAgSnVseSkKLSBEYXZpZCBHYXJkbmVyIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgNzcwNzU1IHRoYXQgdXNpbmcgdGhlIEZUUCBjb21tYW5kCiAgQ1dEIHdpdGggYSBibGFuayBhcmd1bWVudCBpcyBhIGJhZCBpZGVhIGFuZCBJIG1hZGUgbGliY3VybCBza2lwIGVtcHR5IHBhdGgKICBzZWdtZW50cyBzdGFydGluZyBub3cuCgpEYW5pZWwgKDE4IEp1bHkpCi0gQ3JpcyBwb2ludGVkIG91dCB0aGF0IG15IGZpeCBvbiBKdWx5IDE2dGggZGlkbid0IHdvcmsgZnVsbHkuIEhpcyBwb2ludGluZwogIG91dCB0aGlzIChhbmQgaGlzIHBhdGNoKSBhbHNvIG1hZGUgbWUgcmVhbGl6ZSB0aGF0IHdlIGhhdmUgYSB2ZXJ5IHNpbWlsYXIKICBidWcgaW4gdGhlIEZUUCBjb25uZWN0aW9uIHJlLXVzZSBjb2RlLiBXZSBtdXN0IHN0b3JlIGEgc2VwYXJhdGUgdXNlciBhbmQKICBwYXNzd29yZCBmaWVsZCBmb3IgZWFjaCBjb25uZWN0aW9uIHdlIGtlZXAgKGF0IGxlYXN0IGZvciBGVFAgYW5kIEhUVFArTlRMTQogIGNvbm5lY3Rpb25zLCBzbyBJIG1hZGUgdXMgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkpLgoKLSBTaW5jZSBOVExNIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiBzaW5nbGUgcmVxdWVzdHMsIEkgaGFkIHRvCiAgcmUtYXJyYW5nZSBob3cgd2Ugc3RvcmUgdGhlIE5UTE0gZGF0YSBhbmQgSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdCBzdWl0ZSB0bwogIGZpbmFsbHkgd29yayBwcm9wZXJseSB3aXRoIHBlcnNpc3RlbmN5IHRvIG1ha2UgdGhlIE5UTE0gdGVzdHMgcnVuIGZpbmUKICBhZ2Fpbi4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBoYXZlIHRvIHVwZGF0ZSBsb3RzIG9mIEhUVFAgdGVzdCBjYXNlcy4KCkRhbmllbCAoMTYgSnVseSkKLSBDcmlzIEJhaWxpZmYncyBidWcgcmVwb3J0IDc2ODI3NSBwb2ludGVkIG91dCB0aGF0IHVzaW5nIEJhc2ljIGF1dGggd2l0aAogIHdyb25nIHVzZXIrcGFzc3dvcmQgY2F1c2VkIGFuIGVuZGxlc3MgbG9vcC4gRml4ZWQgbm93LiBIZSBhbHNvIGZvdW5kIG91dCB0aGF0CiAgd2UgZGlkbid0IHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucyB3aXRoIE5UTE0uIEZpeGVkIHRvby4KCi0gRGFuIFdpbnNoaXAgcHJvdmlkZWQgZml4ZXMgZm9yIHRoZSBOVExNIGNvZGUuCgpEYW5pZWwgKDUgSnVseSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYWRkaXRpb25hbCBmaXhlcyBmb3IgdGhlIERPUyBwb3J0LgoKRGFuaWVsICg0IEp1bHkpCi0gUmljayBSaWNoYXJkc29uIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgc2V0dmJ1ZigpIHRvIGFjaGlldmUgbm9uLWJ1ZmZlcmluZwogIG9uIG91dHB1dCBpcyBuby1nb29kIGZvciBTQ08gWGVuaXggYW5kIG90aGVyIHVuaXhlcy4gV2Ugc3dpdGNoZWQgb3ZlciB0bwogIHVzaW5nIHBsYWluIGZmbHVzaCgpIGluc3RlYWQuCgotIERhbiBHcmF5c29uIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2V0IHRoZSBDVVJMX0NBX0JVTkRMRSB2YXJpYWJsZSB3cm9uZ2x5IGluCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGFuZCBJIGhhZCB0byBjaGFuZ2Ugc29tZSBidWlsZCBzdHVmZiB0byBtYWtlIHRoZSBuZXcKICB3YXkgd29yay4KCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggd2FzIGFwcGxpZWQgdGhhdCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CgogICBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gdG8gc2V0IGEgY2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCB3aXRoIHRoZQogICBPcGVuU1NMJ3Mgc3NsX2N0eCBwb2ludGVyIHBhc3NlZCBpbiBhbmQgYWxsb3cgYSBjYWxsYmFjayB0byBhY3Qgb24gaXQuIElmCiAgIGFueXRoaW5nIGJ1dCBDVVJMRV9PSyBpcyByZXR1cm5lZCwgdGhhdCB3aWxsIGFsc28gYmUgcmV0dXJuZWQgYnkgbGliY3VybAogICBhbGwgdGhlIHdheSBiYWNrLiBJZiB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIENVUkxPUFRfVVJMLCBsaWJjdXJsIHdpbGwKICAgZGV0ZWN0IHRoaXMgYW5kIGluc3RlYWQgZ28gdXNlIHRoZSBuZXcgVVJMLgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0RBVEEgaXMgYSBwb2ludGVyIHlvdSBzZXQgdG8gZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgc2V0CiAgIHdpdGggQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OLgoKRGFuaWVsICgxIEp1bHkpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyBhIGNsaWVudCB0byBxdWl0IHRoZSB0ZXN0IHN1aXRlJ3MKICBIVFRQIHNlcnZlci4KCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIHBhdGNoZWQgYSBsaWIgaGFuZGxlIGxlYWsgaW4gdGhlIGxkYXAgY29kZS4KCkRhbmllbCAoMjUgSnVuZSkKLSBNb3JlIE5UTE0taW1wcm92ZW1lbnRzLiBMZXNzIGNvZGUuIFNtYWxsZXIgcGFja2V0cyBiYWNrIGFuZCBmb3J0aC4KCkRhbmllbCAoMjMgSnVuZSkKLSBFcmljIEdsYXNzIHByb3ZpZGVkIHVzIHdpdGggYSBiZXR0ZXIgZG9jIG9uIE5UTE0gZGV0YWlscywgYW5kIEkgYWRkZWQgbW9yZQogIGNvbW1lbnRzIGFuZCBjbGFyaWZpZWQgdGhlIGN1cnJlbnQgY29kZSBtb3JlLiBVc2luZyB0aGUgbmV3IGtub3dsZWRnZSwgd2UKICBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBOVExNIHN0dWZmIHdvcmsgZXZlbiBiZXR0ZXIuCiAgRXJpYydzIG9yaWdpbmFsIFVSTDogaHR0cDovL2RhdmVucG9ydC5zb3VyY2Vmb3JnZS5uZXQvbnRsbS5odG1sCiAgVmVyc2lvbiBzdG9yZWQgYW5kIHByb3ZpZGVkIGF0IGN1cmwgc2l0ZTogaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sCgotIEZpeGVkIHRoZSBtaW5vciBjb21waWxlIHByb2JsZW1zIHByZTMgaGFkIGlmIGJ1aWx0IHdpdGhvdXQgR1NTQVBJIGFuZC9vcgogIFNTTC4KClZlcnNpb24gNy4xMC42LXByZTMgKDE5IEp1bmUgMjAwMykKCkRhbmllbCAoMTkgSnVuZSkKLSBNYWRlIGN1cmwgdXNlIGN1cmxfZnJlZSgpIG9uIG1lbW9yeSByZXR1cm5lZCBieSBjdXJsX2dldGVudigpLCBhcyB0aGlzCiAgc2hvdWxkIHRoZW9yZXRpY2x5IG1ha2UgaXQgcG9zc2libHkgdG8gYnVpbGQgYW5kIHJ1biBjdXJsIGFuZCBsaWJjdXJsIHdpdGgKICBkaWZmZXJlbnQgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lcyB3aXRoIG5vIHByb2JsZW1zLgoKRGFuaWVsICgxOCBKdW5lKQotIEltcHJvdmVkIHRoZSBta2hlbHAucGwgYSBiaXQgZnVydGhlciB0byBtYWtlIGEgbmljZXIgaHVnZWhlbHAgdGV4dCBhbmQgdG8KICBpbmNsdWRlIGEgYmV0dGVyIGNvbW1lbnQgaW4gdGhlIHRvcCBmb3IgdGhlIGd6aXAgY29tcHJlc3NlZCB2ZXJzaW9uLgoKRGFuaWVsICgxNyBKdW5lKQotIENVUkxPUFRfSFRUUEFVVEggaXMgbm93IGEgYml0bWFzaywgaW4gd2hpY2ggeW91IHNldCB3aGljaCBhdXRoZW50aWNhdGlvbgogIHR5cGUocykgeW91IHdhbnQgdG8gdXNlLiBJZiBtb3JlIHRoYW4gb25lIGlzIHNldCwgbGliY3VybCB3aWxsIHVzZSBvbmUgb2YKICB0aGUgc2VsZWN0ZWQgb25lIGFuZCB0aGUgb25lIGl0IGNvbnNpZGVycyBpcyBtb3JlIHNlY3VyZS4gVGVzdCBjYXNlIDY3IGFuZAogIDY4IChmb3IgTlRMTSkgd2VyZSBmaXhlZCBhbmQgd2UndmUgcmVkdWNlZCBhIHJvdW5kLXRyaXAgZm9yIHNwZWNpZmljIC0tbnRsbQogIGZldGNoZXMsIGFuZCB0ZXN0IGNhc2UgNjkgYW5kIDcwIHdlcmUgYWRkZWQgZm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24KICAicGlja2luZyIuIC0tYW55YXV0aCBpcyB0aGUgbmV3IGNvbW1hbmQgbGluZSB0b29sIG9wdGlvbiwgYW5kIEkgYWxzbyBhZGRlZAogIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAodGhhdCdzIHRoZSBkZWZhdWx0IHR5cGUpLgoKLSBGaXhlZCB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIHVzZSB0aGUgaW5mbyBwcm92aWRlZCBieSB0aGUgbmV3IGN1cmwgLVYKICBvdXRwdXQuCgotIC0tZW5hYmxlLWRlYnVnIG5vdyBzZXRzIHRoZSBDVVJMREVCVUcgZGVmaW5lIGluc3RlYWQgb2YgTUFMTE9DREVCVUcsIGFzIGl0CiAgaXMgbWVhbnQgdG8gYmUgYSBnZW5lcmljIGRlYnVnIGNvbmRpdGlvbmFsLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIGNhbiBub3cgcmV0dXJuIENVUkxfVkVSU0lPTl9ERUJVRyBhcyBhIGZlYXR1cmUgYml0LCB0bwogIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IHdpdGggQ1VSTERFQlVHIHNldC4KCi0gUmFscGggTWl0Y2hlbGwgZm91bmQgb3V0IHRoYXQgc29tZSB3ZWIgYXBwbGljYXRpb25zIHZlcnkgYmFkbHkgdXNlcyB3aGl0ZQogIHNwYWNlcyBpbiBMb2NhdGlvbjogcmVkaXJlY3RzLCBhbmQgYXBwYXJlbnRseSBJRSBpcyBhIGJyb3dzZXIgKHRoZSBvbmx5CiAgb25lPykgdGhhdCBzdXBwb3J0cyB0aGlzIGFib21pbmF0aW9uLiBCYXNlZCBvbiBSYWxwaCdzIHBhdGNoLCBJIGFkZGVkIGNvZGUKICB0aGF0IG5vdyBhdHRlbXB0cyB0byByZXBsYWNlIHdoaXRlIHNwYWNlcyB3aXRoIHRoZSBwcm9wZXIgIiUyMCIgb3IgIisiLgogIFRlc3QgY2FzZSA0MCBhbmQgNDIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgbXkgY2hhbmdlcy4KCi0gY3VybCAtViBub3cgYWxzbyBvdXRwdXRzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGUgYXZhaWxhYmxlIGxpYnJhcnkgb2ZmZXJzIChpZgogIGFueSkuCgotIFRoZSBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IGluY2x1ZGVzICJHU1MiIGlmIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHU1NBUEkKICBzdXBwb3J0LgoKLSBEYXZpZCBPcnJlbGwgcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIHN0aWxsIGNyYXNoZWQgd2hlbiBzZW5kaW5nIEhVR0UgcmVxdWVzdHMKICBvdmVyIEhUVFBTLi4uIEkgZml4ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmUyICgxNiBKdW5lIDIwMDMpCgpEYW5pZWwgKDE2IEp1bmUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBiaXRtYXNrZWQgaW5mb3JtYXRpb24gd2VhdGhlciBOVExNIGFuZAogIEdTU05FR09USUFURSBhcmUgc3VwcG9ydGVkLCBzaW5jZSBpdCBpcyBkb29tZWQgdG8gdmFyeSBvbiBkaWZmZXJlbnQKICBpbnN0YWxsYXRpb25zLgoKLSBJIHJlbWFkZSB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIE1ENS1jb2RlIHByb3ZpZGVkIGJ5IE9wZW5TU0wgaWYKICB0aGF0IGlzIHByZXNlbnQsIGFuZCBvbmx5IHVzZSBvdXIgb3duIE1ENS1jb2RlIGlmIGl0IGlzbid0LgogIApEYW5pZWwgKDEzIEp1bmUpCi0gTW9yZSBOVExNIGhlbHAsIGZpeGVzIGFuZCBwYXRjaGVzIGZyb20gQ3JpcyBCYWlsaWZmLgoKLSBNYXJ0eSBLdWhydCBicm91Z2h0IGluY2x1ZGUgZml4ZXMgZm9yIG1ha2luZyBWTVMgYnVpbGRzIHdhcm5pbmctZnJlZS4KCkRhbmllbCAoMTIgSnVuZSkKLSBOVExNIGF1dGhlbnRpY2F0aW9uIHdvcmtzIHNvbWV3aGF0IGFnYWluc3QgdGhlIHRlc3Qgc2VydmVycyBwcm92aWRlZCBieQogIE1hdGhpYXMgQXhlbHNzb24gYW5kIENyaXMgQmFpbGlmZi4gVXNlIGJ5IHNldHRpbmcgQ1VSTE9QVF9IVFRQQVVUSCB0bwogIENVUkxBVVRIX05UTE0gdG8gbGliY3VybCwgb3IgLS1udGxtIGZvciB0aGUgY3VybCB0b29sLiBUZXN0IGNhc2UgNjcgYW5kIDY4CiAgd2VyZSBhZGRlZCBmb3IgdGhpcy4gTlRMTS1zdXBwb3J0IHJlcXVpcmVzIE9wZW5TU0wuCgotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIHBhdGNoLCB0aGF0IGdyYW50ZWQgdGhhdCBnemlwIGFuZCBsaWJ6IGFyZSBhdmFpbGFibGUKICBhdCBidWlsZC10aW1lLCBjb21wcmVzc2VzIHRoZSBodWdlaGVscCB0ZXh0IGluIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBhbmQKICB1bmNvbXByZXNzZXMgaXQgYXQgcmVxdWVzdC4gU2F2ZXMgc29tZSB+NjBLIGluIHRoZSBmaW5hbCBvdXRwdXQgZXhlY3V0YWJsZS4KCkRhbmllbCAoMTEgSnVuZSkKLSBMb25nIGRheSBvZiBmaWdodGluZyB0aGUgTlRMTSBkZW1vbnMuCgpEYW5pZWwgKDEwIEp1bmUpCi0gTW9kaWZpZWQgaG93IHRvIHNldCBhdXRoIHR5cGUgdG8gbGliY3VybC4gTm93IHVzZSBDVVJMT1BUX0hUVFBBVVRIIGluc3RlYWQsCiAgYW5kIHBpY2sgbWV0aG9kLiBTdXBwb3J0ZWQgb25lcyBjdXJyZW50bHkgYXJlOgogIENVUkxBVVRIX0JBU0lDICAgICAtIGRlZmF1bHQgc2VsZWN0aW9uCiAgQ1VSTEFVVEhfRElHRVNUICAgIC0gZm9ybWVybHkgQ1VSTE9QVF9IVFRQRElHRVNUCiAgQ1VSTEFVVEhfR1NTTkVHT1RJQVRFCgotIERhbmllbCBLb3VyaWwgYWRkZWQgSFRUUCBHU1MtTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsIGFzIGRlZmluZWQgaW4KICB0aGUgSUVURiBkcmFmdCBkcmFmdC1icmV6YWstc3BuZWdvLWh0dHAtMDQudHh0LiBJbiB1c2UgYWxyZWFkeSBieSB2YXJpb3VzCiAgTWljcm9zb2Z0IHdlYiBhcHBsaWNhdGlvbnMuIC0tbmVnb3RpYXRlIGlzIHRoZSBuZXcgZmFtaWx5IG1lbWJlci4gVG8gdGFrZQogIGFkdmFudGFnZSBvZiB0aGlzLCB5b3UgbmVlZCBvbmUgb2YgdGhlc2UgcGFja2FnZXM6CgogIG8gSGVpbWRhbCBLZXJiZXJvczUgICAgICAgICAgICAgICBodHRwOi8vd3d3LnBkYy5rdGguc2UvaGVpbWRhbC9oZWltZGFsLmh0bWwKICBvIEdTU0FQSSBmcm9tIEdsb2J1cyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lmdsb2J1cy5vcmcvCiAgbyBHU1NBUEkgbGlicmFyaWVzIGZyb20gTUlUIEtlcmJlcm9zNSAgaHR0cDovL3dlYi5taXQuZWR1L2tlcmJlcm9zL3d3dy8KCi0gQSBtaXNzaW5nIGVuZGluZyBicmFja2V0ICgnXScpIHdoaWxlIGRvaW5nIFVSTCBnbG9iYmluZyBjb3VsZCBsZWFkIHRvIGEKICBzZWdmYXVsdC4gV2hpbGUgZml4aW5nIHRoaXMsIEkgYWxzbyBpbnRyb2R1Y2VkIGJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gdGhlCiAgZ2xvYmJpbmcgY29kZS4gKEFsbCB0aGlzIGlzIGFwcGxpY2F0aW9uIGNvZGUgb3V0c2lkZSBsaWJjdXJsLikKCkRhbmllbCAoNiBKdW5lKQotIERhdmlkIE9ycmVsbCBmb3VuZCBvdXQgdGhhdCBzZW5kaW5nIGEgaHVnZSBHRVQgcmVxdWVzdCBvdmVyIEhUVFBTIGNvdWxkCiAgbWFrZSBsaWJjdXJsIGZhaWwgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlLgoKRGFuaWVsICgyIEp1bmUpCi0gUmljaGFyZCBCcmFtYW50ZSBmb3VuZCBvdXQgdGhhdCAiQ29udGVudC1MZW5ndGg6IDAiIHdhcyBub3QgcHJvcGVybHkgdXNlZCBieQogIGxpYmN1cmwgaWYgdGhlIHJlc3BvbnNlLWhlYWRlcnMgaW5kaWNhdGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd291bGQgYmUKICBjbG9zZWQuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcGxpZWQsIHRoYXQgbWFrZXMgdGhlIC0tcHJvZ3Jlc3MtYmFyIHRha2UgdGhlCiAgbG9jYWwgc2l6ZSBpbnRvIGFjY291bnQgd2hlbiBkb2luZyByZXN1bWVkIGRvd25sb2Fkcy4KCi0gRmVlZGJhY2sgZnJvbSBTZXJnZSBTZW1hc2hrbyBtYWRlIG1lIGNoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCB3aGVuCiAgQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBpcyByZXR1cm5lZC4KCi0gQW5vbnltb3VzIGluIGJ1ZyByZXBvcnQgIzc0NTEyMiBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcKICBTU0xfQ1RYX3NldF9vcHRpb25zKC4uLiBTU0xfT1BfQUxMKSB0byB3b3JrIGFyb3VuZCBmbGF3cyBpbiBleGlzdGluZyBTU0wKICBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDI3IE1heSkKLSBBbmRyZWFzIExleSBhbmQgUmljaCBHcmF5IGhlbHBlZCBtZSBwb2ludCBvdXQgdGhhdCBubyB2ZXJzaW9uIG9mIEhQLVVYIGhhcwogIHRoZSBzeXMvc2VsZWN0LmggaGVhZGVyIGZpbGUgc28gaW5jbHVkaW5nIGl0IHVuY29uZGl0aW9uYWxseSBpbiBjdXJsL211bHRpLmgKICBpcyBub3QgYSBnb29kIHRoaW5nLiBOb3cgd2UgY2hlY2sgZm9yIEhQVVggYW5kIGF2b2lkIHVzaW5nIHRoYXQgaGVhZGVyIG9uCiAgc3VjaCBzeXN0ZW1zLgoKLSBSdWR5IEtvZW50byBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGN1cmwncyByZWNlbnQgaGFiaXQgb2YgUE9TVGluZyBkYXRhIGluCiAgdHdvIHNlcGFyYXRlIHNlbmQoKSBjYWxscywgZmlyc3QgdGhlIGhlYWRlcnMgYW5kIHRoZW4gdGhlIGRhdGEuIEkndmUgbm93CiAgbWFkZSBhIGZpeCB0aGF0IGZvciBzdGF0aWMgYW5kIGtub3duIGNvbnRlbnQgdGhhdCBpcyBsZXNzIHRoYW4gMTAwSyBpbiBzaXplLAogIGV2ZXJ5dGhpbmcgaXMgbm93IHNlbnQgaW4gb25lIHNpbmdsZSBzeXN0ZW0gY2FsbCBhZ2Fpbi4gVGhpcyBpcyBhbHNvIGJldHRlcgogIGZvciBuZXR3b3JrIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgotIEkgbW9kaWZpZWQgdGhlIG1haW4gbWFrZWZpbGUgdG8gbm90IGJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGFuZCBhIGZldyBvdGhlcgogIHVubmVjZXNzYXJ5IHRoaW5ncyBieSBkZWZhdWx0LiBOb3csIHRoZSB0ZXN0IHN1aXRlIGlzIGJ1aWx0IHdoZW4gJ21ha2UgdGVzdCcKICBpcyBydW4uICBUaGlzIHJlZHVjZXMgYnVpbGQgdGltZSBmb3IgdGhvc2Ugd2hvIGRvbid0IGNhcmUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUsIGFuZCBpdCBhbHNvIHJlZHVjZXMgY29uZnVzaW9uIGZvciBwZW9wbGUgdXNpbmcgcGxhdGZvcm1zIHdoZXJlIHRoZQogIHRlc3Qgc3VpdGUgYnVpbGQgZmFpbHMhCgpEYW5pZWwgKDI2IE1heSkKLSBDaHJpcyBMZXdpcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlICNpZmRlZnMgaW4gY3VybC9tdWx0aS5oIGZvciBXaW5kb3dzLAogIHdoaWNoIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEppcyBKb3kgZm91bmQgYW5vdGhlciBmbGF3IGluIHRoZSBTT0NLNSBjb2RlLCBhcyBsaWJjdXJsIHRyZWF0ZWQgdGhlIHNvY2tzNQogIHByb3h5IGEgbGl0dGxlIHRvbyBtdWNoIGxpa2UgYXMgaWYgaXQgd2FzIGEgaHR0cCBwcm94eS4KCkRhbmllbCAoMjMgTWF5KQotIFJpY2FyZG8gQ2FkaW1lIGZvdW5kIGEgc29ja2V0IGxlYWsgd2hlbiBsaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGhvdXQKICBjb250ZW50cy4gVGVzdCBjYXNlcyAxNDQgYW5kIDE0NSB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBSdWR5IEtvZW50byBmb3VuZCB5ZXQgYW5vdGhlciBwcm9ibGVtIHdoZW4gYSBIVFRQIHNlcnZlciByZXR1cm5zIG9ubHkgYQogIHNpbmdsZS1saW5lIG9mIGNvbnRlbnRzIHdpdGhvdXQgYW55IGhlYWRlcnMgYXQgYWxsLiBsaWJjdXJsIHRoZW4gZmFpbGVkIHRvCiAgY291bnQgdGhlIGRhdGEsIHRodXMgcmV0dXJuaW5nIGVycm9yIDUyICJubyBjb250ZW50cyIuIFRlc3QgY2FzZSA2NiB3YXMKICBhZGRlZCB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8gcmlnaHQuCgpWZXJzaW9uIDcuMTAuNi1wcmUxICgyMyBNYXkgMjAwMykKCkRhbmllbCAoMjMgTWF5KQotIEppcyBpbiBidWcgcmVwb3J0ICM3NDE4NDEsIGZpeGVkIGEgYnVnIGluIHRoZSBTT0NLUzUgcHJveHktdXNpbmcgY29kZS4KCkRhbmllbCAoMjIgTWF5KQotIERhdmlkIFJlbWFobCBzZXQgdXAgYSB0ZXN0LXNlcnZlciBmb3IgbWUgcHJvdmlkaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhbmQgSSB3cm90ZSB0aGUgZmlyc3Qgd29ya2luZyBjb2RlIHRoYXQgc3VwcG9ydCBpdC4gVGhlIHRlc3Qgc3VpdGUgd2FzCiAgbW9kaWZpZWQgc2xpZ2h0bHkgYXMgd2VsbCB0byB3b3JrIGJldHRlciBmb3IgaXQgYW5kIC0tZGlnZXN0IHdhcyBhZGRlZCB0bwogIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAoYW5kIENVUkxPUFRfSFRUUERJR0VTVCB0byB0aGUgbGlicmFyeSkuLi4gIFJGQzI2MTcKICBoYXMgYWxsIHRoZSBnb3J5IGRldGFpbHMuCgpEYW5pZWwgKDIxIE1heSkKLSBEYXZpZCBCYWxhemljIHBvaW50ZWQgb3V0IHRoYXQgY3VybF91bmVzY2FwZSgpIGRpZG4ndCBjaGVjayB0aGF0ICUtY29kZXMKICB3ZXJlIGNvcnJlY3RseSBmb2xsb3dlZCBieSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIHdoZW4gaXQgdW5lc2NhcGUgc3RyaW5ncy4KICBOb3csIHdlIGRvIHRoZSBjaGVjayBhbmQgb25seSAlWFggY29kZXMgYXJlIHVuZXNjYXBlZCBpZiB0aGUgWCBsZXR0ZXJzIGFyZQogIGhleGFkZWNpbWFscy4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIGJ1aWxkIHdpdGggZGpncHAgb24gRE9TLgoKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCB0aGUgbWtoZWxwLnBsIHNjcmlwdCB0byBtYWtlIGEgbmljZXIgbWFudWFsIHRoYXQgaXMKICBzaG93biB3aXRoIGN1cmwgLU0uCgpEYW5pZWwgKDIwIE1heSkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwgbW9yZSBjb25zZXJ2YXRpdmUsIG5vdAogIGV4cGVjdGluZyBoX2FsaWFzZXMgb2YgdGhlIGhvc3RlbnQgc3RydWN0IHRvIGFsd2F5cyBiZSBub24tTlVMTC4KCkRhbmllbCAoMTkgTWF5KQotIEFzIHJlcXVlc3RlZCBieSBNYXJ0aW4gTWljaGxtYXlyIGluIERlYmlhbiBidWcgcmVwb3J0ICMxOTM2MzAsIGxpYmN1cmwgbm93CiAgc3VwcG9ydHMgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBBZGRlZAogIHRlc3QgY2FzZSA2MyB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy4xMC41ICgxOSBNYXkgMjAwMykKCkRhbmllbCAoMTUgTWF5KQotIENoYW5nZWQgdGhlIG9yZGVyIGZvciB0aGUgaW5fYWRkcl90IHRlc3RpbmcsIGFzICd1bnNpZ25lZCBsb25nJyBzZWVtcyB0byBiZQogIGEgdmVyeSBjb21tb24gdHlwZSBpbmV0X2FkZHIoKSByZXR1cm5zLgoKRGFuaWVsICgxNCBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHByb3ZpZGVkIGEgZml4IHRoYXQgY2FsbHMgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gd2FpdGluZwogIGZvciBGVFAgY29tbWFuZCByZXNwb25zZXMgdGFrZSA+MSBzZWNvbmQuIEl0J2xsIG1ha2UgYXBwbGljYXRpb25zIG1vcmUKICAicmVzcG9uc2l2ZSIgZXZlbiB3aGVuIGRlYWxpbmcgd2l0aCB2ZXJ5IHNsb3cgZnRwIHNlcnZlcnMuCgpEYW5pZWwgKDEyIE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHVwbG9hZHMgaGFkIHR3byBxdWlya3M6CiAgIG8gd2hlbiB1c2luZyBGVFAgUE9SVCBjb21tYW5kLCBpdCB1c2VkIGJsb2NraW5nIHNvY2tldHMhCiAgIG8gaXQgY291bGQgbG9vcCBhIGxvbmcgdGltZSB3aXRob3V0IGRvaW5nIHByb2dyZXNzIG1ldGVyIHVwZGF0ZXMKICBCb3RoIGl0ZW1zIGFyZSBmaXhlZCBub3cuCgpEYW5pZWwgKDkgTWF5KQotIERhbiBGYW5kcmljaCBjaGFuZ2VkIENVUkxPUFRfRU5DT0RJTkcgdG8gc2VsZWN0IGFsbCBzdXBwb3J0ZWQgZW5jb2RpbmdzIGlmCiAgc2V0IHRvICIiLiAgVGhpcyBmcmVlcyB0aGUgYXBwbGljYXRpb24gZnJvbSBoYXZpbmcgdG8ga25vdyB3aGljaCBlbmNvZGluZ3MKICB0aGUgbGlicmFyeSBzdXBwb3J0cy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IHdlIGhhZCB0aHJlZSB1bm5lY2Vzc2FyeSBmaWxlcyBpbiBDVlMgdGhhdCBpcwogIGdlbmVyYXRlZCB3aXRoIGxpYnRvb2xpemUsIHNvIHRoZXkncmUgbm93IHJlbW92ZWQgYW5kIGxpYnRvb2xpemUgaXMgaW52b2tlZAogIGFjY29yZGluZ2x5IGluIHRoZSBidWlsZGNvbmYgc2NyaXB0LgoKLSBBdmVyeSBGYXkgZm91bmQgb3V0IHRoYXQgdGhlIENVUkxPUFRfSU5URVJGQUNFIHdheSBvZiBmaXJzdCBjaGVja2luZyBpZiB0aGUKICBnaXZlbiBuYW1lIGlzIGEgbmV0d29yayBpbnRlcmZhY2UgZ2F2ZSBhIHJlYWwgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiBMaW51eCwKICBzbyBub3cgd2UgbW9yZSBhcHByb3ByaWF0ZWx5IGZpcnN0IGNoZWNrIGlmIGl0IGlzIGFuIElQIG51bWJlciBhbmQgaWYgc28KICB3ZSBkb24ndCBjaGVjayBmb3IgYSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIHRoYXQgbmFtZS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQUlQgYWRkZWQuIFNldCB0aGlzIHRvIEZBTFNFIHRvIGRpc2FibGUgbGliY3VybCdzIGF0dGVtcHRzCiAgdG8gdXNlIEVQUlQgYW5kIExQUlQgYmVmb3JlIHRoZSB0cmFkaXRpb25hbCBQT1JUIGNvbW1hbmQuIFRoZSBjb21tYW5kIGxpbmUKICB0b29sIHNldHMgdGhpcyBvcHRpb24gd2l0aCAnLS1kaXNhYmxlLWVwcnQnLgoKVmVyc2lvbiA3LjEwLjUtcHJlMiAoNiBNYXkgMjAwMykKCkRhbmllbCAoNiBNYXkpCi0gS2V2aW4gRGVsYWZpZWxkIHJlcG9ydGVkIGFub3RoZXIgY2FzZSB3aGVyZSB3ZSBkaWRuJ3QgY29ycmVjdGx5IGNoZWNrIGZvcgogIEVBR0FJTiBidXQgb25seSBFV09VTERCTE9DSywgd2hpY2ggY2F1c2VkIGJhZG5lc3Mgb24gSFBVWC4KCkRhbmllbCAoNCBNYXkpCi0gQmVuIEdyZWVhciBub3RpY2VkIHRoYXQgdGhlIGNoZWNrIGZvciAnd3JpdGFibGUgYXJndicgZXhpdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgd2hlbiBydW4gZm9yIGNyb3NzLWNvbXBpbGluZywgd2hpY2ggd2Fzbid0IG5pY2UuIE5vdyBpdCdsbCBkZWZhdWx0IHRvCiAgbm8gYW5kIG91dHB1dCBhIHdhcm5pbmcgYWJvdXQgdGhlIGZhY3QgdGhhdCBpdCB3YXMgbm90IGNoZWNrZWQgZm9yLgoKRGFuaWVsICgyIE1heSkKLSBBZGRlZCB0ZXN0IGNhc2UgNjIgYW5kIGZpeGVkIHNvbWUgbW9yZSBvbiB0aGUgY29va2llIHNlbmRpbmcgd2l0aCBhIGN1c3RvbQogIEhvc3Q6IGhlYWRlciBzZXQuCgpEYW5pZWwgKDEgTWF5KQotIEFuZHkgQ2VkaWxuaWsgZml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCgotIE1hZGUgdGhlICJTU0wgcmVhZCBlcnJvcjogNSIgZXJyb3IgbWVzc2FnZSBtb3JlIHZlcmJvc2UsIGJ5IGFkZGluZyBjb2RlIHRoYXQKICBxdWVyaWVzIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gZmlsbCBpbiB0aGUgZXJyb3IgYnVmZmVyLgoKRGFuaWVsICgzMCBBcHIpCi0gQWRkZWQgc3lzL3NlbGVjdC5oIGluY2x1ZGUgaW4gdGhlIGN1cmwvbXVsdGkuaCBmaWxlLCBhZnRlciBoYXZpbmcgYmVlbgogIHJlbWluZGVkIGFib3V0IHRoaXMgYnkgUmljaCBHcmF5LgoKLSBJIG1hZGUgZWFjaCB0ZXN0IHNldCBpdHMgb3duIHNlcnZlciByZXF1aXJlbWVudHMsIHRodXMgYWJhbmRvbmluZyB0aGUKICBwcmV2aW91cyBzeXN0ZW0gd2hlcmUgdGhlIHRlc3QgbnVtYmVyIGltcGxpZWQgd2hhdCBzZXJ2ZXIocykgdG8gdXNlIGZvciBhCiAgc3BlY2lmaWMgdGVzdC4KCi0gRGF2aWQgQmFsYXppYyBtYWRlIGN1cmwgbW9yZSBSRkMxNzM4LWNvbXBsaWFudCBmb3IgRlRQIFVSTHMsIGJ5IGZpeGluZyBzbwogIHRoYXQgbGliY3VybCBub3cgdXNlcyBvbmUgQ1dEIGNvbW1hbmQgZm9yIGVhY2ggcGF0aCBwYXJ0LiBBIGJ1bmNoIG9mIHRlc3QKICBjYXNlcyB3ZXJlIGZpeGVkIHRvIHdvcmsgYWNjb3JkaW5nbHkuCgotIENvb2tpZSBmaXhlczoKCiAgQS4gU2F2ZSBkb21haW5zIGluIGphcnMgbGlrZSBNb3ppbGxhIGRvZXMuIEl0IG1lYW5zIGFsbCBkb21haW5zIHNldCBpbgogICAgIFNldC1Db29raWU6IGhlYWRlcnMgYXJlIGRvdC1wcmVmaXhlZC4KICBCLiBTYXZlIGFuZCB1c2UgdGhlICd0YWlsbWF0Y2gnIGZpZWxkIGluIHRoZSBNb3ppbGxhL05ldHNjYXBlIGNvb2tpZSBqYXJzCiAgICAgKHRoZSBzZWNvbmQgY29sdW1uKS4KICBDLiBSZWplY3QgY29va2llcyB1c2luZyBpbGxlZ2FsIGRvbWFpbnMgaW4gdGhlIFNldC1Db29raWU6IGxpbmUuIENvbmNlcm5zCiAgICAgYm90aCBkb21haW5zIHdpdGggdG9vIGZldyBkb3RzIG9yIGRvbWFpbnMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgY3VycmVudGx5CiAgICAgb3BlcmF0aW5nIHNlcnZlciBob3N0J3MgZG9tYWluLgogIEQuIFNldCB0aGUgcGF0aCBwYXJ0IGJ5IGRlZmF1bHQgdG8gdGhlIG9uZSB1c2VkIGluIHRoZSByZXF1ZXN0LCBpZiBub25lIHdhcwogICAgIHNldCBpbiB0aGUgU2V0LUNvb2tpZSBsaW5lLgoKICBUbyBtYWtlIGl0ZW0gQyByZWFsbHkgZ29vZCwgSSBhbHNvIG1hZGUgbGliY3VybCBub3RpY2UgY3VzdG9tIEhvc3Q6IGhlYWRlcnMKICBhbmQgZXh0cmFjdCB0aGUgaG9zdCBuYW1lIHNldCBpbiB0aGVyZSBhbmQgdXNlIHRoYXQgYXMgdGhlIGhvc3QgbmFtZSBmb3IgdGhlCiAgc2l0ZSB3ZSdyZSBnZXR0aW5nIHRoZSBjb29raWVzIGZyb20uIFRoaXMgYWxsb3dzIHVzZXIgdG8gc3BlY2lmeSBhIHNpdGUncwogIElQLWFkZHJlc3MsIGJ1dCBzdGlsbCBiZSBhYmxlIHRvIHJlY2VpdmUgYW5kIHNlbmQgaXRzIGNvb2tpZXMgcHJvcGVybHkgaWYKICB5b3UgcHJvdmlkZSBhIHZhbGlkIEhvc3Q6IG5hbWUgZm9yIHRoZSBzaXRlLgoKRGFuaWVsICgyOSBBcHIpCi0gUGV0ZXIgS292YWNzIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ1VSTElORk9fQ09OTkVDVF9USU1FIHdvcmsgZmluZQogIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAodG9vKS4KClZlcnNpb24gNy4xMC41LXByZTEgKDIzIEFwciAyMDAzKQoKRGFuaWVsICgyMyBBcHIpCi0gVXBncmFkZWQgdG8gbGlidG9vbCAxLjUuCgpEYW5pZWwgKDIyIEFwcikKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX2Vhc3lfc2V0b3B0KCkgd2lsbCBhbHdheXMgKHdyb25nbHkpCiAgcmV0dXJuIENVUkxFX09LIG5vIG1hdHRlciB3aGF0IGhhcHBlbnMuCgotIERhbiBGYW5kcmljaCBmaXhlZCBzb21lIGd6aXAgZGVjb21wcmVzc2lvbiBidWdzIGFuZCBmbGF3cy4KCkRhbmllbCAoMTYgQXByKQotIEZpeGVkIG1pbm9yIHR5cG8gaW4gbWFuIHBhZ2UsIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gYnVnIHRyYWNrZXIuCgpEYW5pZWwgKDE1IEFwcikKLSBGaXhlZCBzb21lIEZUUCB0ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGZhaWxlZCBvbiBteSBTb2xhcmlzIGhvc3QsIGR1ZQogIHRvIHRoZSBjb25maWcuaCBub3QgYmVpbmcgaW5jbHVkZWQgYmVmb3JlIHRoZSBzeXN0ZW0gaGVhZGVycy4gV2hlbiBkb25lIHRoYXQKICB3YXksIGl0IGRpZCBnZXQgYSBtaXhlZCBzZW5zZSBvZiBpZiBiaWcgZmlsZXMgYXJlIHN1cHBvcnRlZCBvciBub3QgYW5kIHRoZW4KICBzdGF0KCkgYW5kIGZzdGF0KCkgKGFzIHVzZWQgaW4gdGVzdCBjYXNlIDUwNSkgZ290IGNvbmZ1c2VkIGFuZCBmYWlsZWQgdG8KICByZXR1cm4gYSBwcm9wZXIgZmlsZSBzaXplLgoKLSBGb3JtcG9zdGluZyBhIGZpbGUgdXNpbmcgYSAuaHRtbCBzdWZmaXggaXMgbm93IHByb3Blcmx5IHNldCB0byBDb250ZW50LVR5cGU6ICAgIHRleHQvaHRtbC4KCkRhbmllbCAoMTQgQXByKQotIEZpeGVkIHRoZSBTU0wgZXJyb3IgaGFuZGxpbmcgdG8gcmV0dXJuIHByb3BlciBTU0wgZXJyb3IgbWVzc2FnZXMgYWdhaW4sIHRoZXkKICBicm9rZSBpbiA3LjEwLjQuIEkgYWxzbyBhdHRlbXB0IHRvIHRyYWNrIGRvd24gQ0EgY2VydCBwcm9ibGVtcyBhbmQgdGhlbgogIHJldHVybiB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlLgoKLSBUaGUgY3VybCB0b29sIG5vdyBpbnRlcmNlcHRzIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUgYW5kIGRpc3BsYXlzCiAgYSBmYWlybHkgYmlnIGFuZCBleHBsYW5hdG9yeSBlcnJvciBtZXNzYWdlLiBLZXZpbiBSb3RoIGhlbHBlZCBtZSBvdXQgd2l0aAogIHRoZSB3b3JkaW5nLgoKRGFuaWVsICgxMSBBcHIpCi0gTmljIEhpbmVzIHByb3ZpZGVkIGEgc2Vjb25kIHBhdGNoIGZvciBnemlwIGRlY29tcHJlc3Npb24sIGFuZCBmaXhlZCBhIGJ1ZwogIHdoZW4gZGVmbGF0ZSBvciBnemlwIGNvbnRlbnRzIHdlcmUgZG93bmxvYWRlZCB1c2luZyBjaHVua2VkIGVuY29kaW5nLgoKLSBEYW4gRmFuZHJpY2ggbWFkZSBsaWJjdXJsIHN1cHBvcnQgYXV0b21hdGljIGRlY29tcHJlc3Npb24gb2YgZ3ppcCBjb250ZW50cwogIChhcyBhbiBhZGRpdGlvbiB0byB0aGUgcHJldmlvdXMgZGVmbGF0ZSBzdXBwb3J0KS4KCi0gSSBtYWRlIHRoZSBDV0QgY29tbWFuZCBkdXJpbmcgRlRQIHNlc3Npb24gY29uc2lkZXIgYWxsIDJ4eSBjb2RlcyB0byBiZSBPSwogIHJlc3BvbnNlcy4KCkRhbmllbCAoMTAgQXByKQotIFZsYWQgS3J1cGluIGZpeGVkIGEgVVJMIHBhcnNpbmcgaXNzdWUuIFVSTHMgdGhhdCB3ZXJlIG5vdCB1c2luZyBhIHNsYXNoCiAgYWZ0ZXIgdGhlIGhvc3QgbmFtZSwgYnV0IHN0aWxsIGhhZCAiPyIgYW5kIHBhcmFtZXRlcnMgYXBwZW5kZWQsIGFzIGluCiAgImh0dHA6Ly9ob3N0bmFtZS5jb20/Zm9vYmFyPW1vbyIsIHdlcmUgbm90IHByb3Blcmx5IHBhcnNlZCBieSBsaWJjdXJsLgoKRGFuaWVsICg5IEFwcikKLSBNYWRlIENVUkxPUFRfVElNRUNPTkRJVElPTiB3b3JrIGZvciBGVFAgdHJhbnNmZXJzLCB1c2luZyB0aGUgc2FtZSBzeW50YXggYXMKICBmb3IgSFRUUC4gVGhpcyB0aGVuIG1hZGUgLXogd29yayBmb3IgZnRwIHRyYW5zZmVycyB0b28uIEFkZGVkIHRlc3QgY2FzZSAxMzkKICBhbmQgMTQwIGZvciB2ZXJpZnlpbmcgdGhpcy4KCi0gR2V0dGluZyB0aGUgZmlsZSBkYXRlIG9mIGFuIGZ0cCBmaWxlIHVzZWQgdGhlIHdyb25nIHRpbWUgem9uZSB3aGVuCiAgZGlzcGxheWVkLiBJdCBpcyBzdXBwb3NlZGx5IGFsd2F5cyBHTVQuIEFkZGVkIHRlc3QgY2FzZSAxNDEgZm9yIHRoaXMuCgotIE1hZGUgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHN1cHBvcnQgTURUTS4KCi0gVGhlIGRlZmF1bHQgREVCVUdGVU5DVElPTiwgYXMgZW5hYmxlZCB3aXRoIENVUkxPUFRfVkVSQk9TRSBub3cgb3V0cHV0cwogIENVUkxJTkZPX0hFQURFUl9JTiBkYXRhIGFzIHdlbGwuIFRoZSBtb3N0IG5vdGFibGUgZWZmZWN0IGZyb20gdGhpcyBpcyB0aGF0CiAgdXNpbmcgY3VybCAtdiwgeW91IGdldCB0byBzZWUgdGhlIGluY29taW5nICJoZWFkZXJzIiBhcyB3ZWxsLiBUaGlzIGlzCiAgcGVyaGFwcyBtb3N0IHVzZWZ1bCB3aGVuIGRvaW5nIGZ0cC4KCkRhbmllbCAoOCBBcHIpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBmbGF3IGluIHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiBjb2RlLCB3aGljaCBtaXNzZWQKICB0aGUgZmlyc3QgbGV0dGVyIGlmIG5vIHNwYWNlIGZvbGxvd2VkIHRoZSBjb2xvbi4KCi0gTWFnbnVzIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhhdCBzaGFyZS5jIHdhcyBtaXNzaW5nIGluIHRoZSBNU1ZDIHByb2plY3QKICBmaWxlLgoKRGFuaWVsICg2IEFwcikKLSBSeWFuIFdlYXZlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENBIGNlcnQgYnVuZGxlIG5vdCBnZXQgaW5zdGFsbGVkCiAgYW55bW9yZSB3aGVuICdjb25maWd1cmUgLS13aXRob3V0LXNzbCcgaGFzIGJlZW4gdXNlZC4KCkRhbmllbCAoNCBBcHIpCi0gTWFydGlqbiBCcm9lbmxhbmQgZm91bmQgYW5vdGhlciBjYXNlcyB3aGVyZSBhIHNlcnZlciBhcHBsaWNhdGlvbiBkaWRuJ3QKICBsaWtlIHRoZSBib3VuZGFyeSBzdHJpbmcgdXNlZCBieSBjdXJsIHdoZW4gZG9pbmcgYSBtdWx0aS1wYXJ0L2Zvcm1wb3N0LiBXZQogIG1vZGlmaWVkIHRoZSBib3VuZGFyeSBzdHJpbmcgdG8gbG9vayBsaWtlIHRoZSBvbmUgSUUgdXNlcywgYXMgdGhpcyBpcwogIHByb2JhYmx5IGdvbm5hIG1ha2UgY3VybCB3b3JrIHdpdGggbW9yZSBhcHBsaWNhdGlvbnMuCgpEYW5pZWwgKDMgQXByKQotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBhIGJ1bmNoIG9mIHRlc3RzIGZhaWxzIG9uIGN5Z3dpbi4gT25lIHNldCBmYWlscwogIHdoZW4gdXNpbmcgcGVybCA1LjggKGFuZCB0aGV5IHJ1biBmaW5lIHdpdGggcGVybCA1LjYpLCBhbmQgYW5vdGhlciBzZXQKICBmYWlsZWQgYmVjYXVzZSBvZiBhbiBhcnRpZmFjdCBpbiB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdGhhdCBJCiAgY29ycmVjdGVkLiBJdCB0dXJuZWQgb3V0IHRoZSBGVFAgc2VydmVyIGNvZGUgd2FzIHN0aWxsIGhhdmluZyBhIGZpbGUgb3BlbmVkCiAgd2hpbGUgdGhlIG1haW4gdGVzdCBzY3JpcHQgcmVtb3ZlZCBpdCBhbmQgaW52b2tlZCB0aGUgSFRUUCBzZXJ2ZXIgdGhhdAogIGF0dGVtcHRlZCB0byBjcmVhdGUgdGhlIHNhbWUgZmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSBGVFAgc2VydmVyIGtlcHQgb3Blbi4KICBUaGlzIG9wZXJhdGlvbiB3b3JrcyBmaW5lIG9uIHVuaXgsIGJ1dCBub3Qgb24gY3lnd2luLgoKVmVyc2lvbiA3LjEwLjQgKDIgQXByIDIwMDMpCgpEYW5pZWwgKDEgQXByKQotIEFkZGVkIHRlc3QgY2FzZSA1MDUgdG8gZXhlcmNpc2UgRlRQIHVwbG9hZCB3aXRoIHJlbmFtZSBkb25lIHdpdGggbGliY3VybCwKICBhbmQgZm9yIHRoYXQgSSBoYWQgdG8gZXh0ZW5kIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBkZWFsIHdpdGggdGhlCiAgUk5GUiBhbmQgUk5UTyBjb21tYW5kcy4KCkRhbmllbCAoMzEgTWFyKQotIEV2ZW4gbW9yZSBTU0wgY29uZmlnIGNoZWNrIG1vZGlmaWNhdGlvbnMgYWZ0ZXIgUmljaGFyZCdzIHRlc3RpbmcuCgpWZXJzaW9uIDcuMTAuNC1wcmU2ICgzMSBNYXIgMjAwMykKCkRhbmllbCAoMzEgTWFyKQotIE1vcmUgZml4ZXMgZm9yIHRoZSBTU0wgc2Vzc2lvbiBJRCBjYWNoZSBjaGVja3Mgd2hlbiBTU0wgY29uZmlncyBhcmUgY2hhbmdlZAogIGJldHdlZW4gY29ubmVjdGlvbnMuIEJhc2VkIG9uIHRlc3RzIGFuZCB0YWxrcyB3aXRoIFJpY2hhcmQgQnJhbWFudGUuCgotIEd1aWxsYXVtZSBDb3R0ZW5jZWF1IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBDVVJMT1BUX1VOUkVTVFJJQ1RFRF9BVVRILgogIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBwcmV2ZW50IGxpYmN1cmwgZnJvbSBsaW1pdGluZyB0byB3aGljaCBob3N0IGl0IHNlbmRzCiAgdXNlcitwYXNzd29yZCB0byB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuIEJ5IGRlZmF1bHQsIGxpYmN1cmwgb25seSBzZW5kcwogIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBob3N0IHVzZWQgaW4gdGhlIGZpcnN0IFVSTCwgYnV0IHdpdGggdGhpcwogIG9wdGlvbiBzZXQgaXQgd2lsbCBzZW5kIHRoZSBhdXRoIGluZm8gdG8gYWxsIGhvc3RzIGl0IGZvbGxvd3MgbG9jYXRpb24KICBoZWFkZXJzIHRvLiBUaGUgbmV3IHRvb2wgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgdGhpcyBpcyBuYW1lZAogICItLWxvY2F0aW9uLXRydXN0ZWQiLgoKLSBGcmFua2llIEZvbmcgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBpZiB5b3UgcmUtdXNlZCBhbiBlYXN5IGhhbmRsZQogIHdpdGggYSBwcm94eSwgYW5kIHlvdSBmaXJzdCBtYWRlIGEgaHR0cHM6Ly8gY29ubmVjdGlvbiB0byBhIGhvc3QgYW5kIHRoZW4KICBzd2l0Y2hlZCB0byBhIGh0dHA6Ly8gb25lIHRvIHRoZSBzYW1lIGhvc3QuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHJlLXVzZQogIHRoZSBzYW1lIGNvbm5lY3Rpb24gZm9yIGl0IGFuZCBmYWlsIHRvIGdldCB0aGUgc2Vjb25kIFVSTCBwcm9wZXJseQoKRGFuaWVsICgyOSBNYXIpCi0gRGFuIFNoZWFyZXIncyBmaXggdGhhdCBtYWtlcyBjdXJsIGNvbXBsYWluIGlmIGludm9rZWQgd2l0aCBub3RoaW5nIGJ1dCAiY3VybAogIC1PIiB3YXMgYXBwbGllZC4KCkRhbmllbCAoMjYgTWFyKQotIEJyeWFuIEtlbXAgd2FzIGZyaWVuZGx5IGVub3VnaCB0byBsZW5kIG1lIGFuIGFjY291bnQgb24gaGlzIFJlZGhhdCA5IGJveCBhbmQKICBJIGNvdWxkIGZpeCB0aGUgY29uZmlndXJlIHByb2JsZW1zIG9uIHJlZGhhdCA4LjEgYW5kIDkgaW4gbm8gdGltZSB0aGFua3MgdG8KICB0aGlzLiBUaGFua3MgYSBidW5jaCBCcnlhbiEKCkRhbmllbCAoMjUgTWFyKQotIFJlbmFtZWQgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYwoKVmVyc2lvbiA3LjEwLjQtcHJlNSAoMjUgTWFyIDIwMDMpCgpEYW5pZWwgKDI1IE1hcikKLSBSaWNoYXJkIEJyYW1hbnRlIHByb3ZpZGVkIGEgZml4IGZvciBhIGhhbmRsZSByZS11c2UgcHJvYmxlbSBzZWVuIHdoZW4geW91CiAgY2hhbmdlIG9wdGlvbnMgb24gYW4gU1NMLWVuYWJsZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcXVlc3RzLiBQcmV2aW91c2x5LAogIGNoYW5naW5nIHBlZXIgdmVyaWZpY2F0aW9uIG9yIGhvc3QgdmVyaWZpY2F0aW9uIGFuZCBzaW1pbGFyIHRoaW5ncyB3YXMgbm90CiAgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gYSBjb25uZWN0aW9uIHdlcmUgY2hlY2tlZCBmb3IgcmUtdXNlIGFuZCB0aHVzCiAgZW5hYmxpbmcgc3RyaWN0ZXIgY2hlY2sgYmV0d2VlbiByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiBtYWRlIG5vCiAgZGlmZmVyZW5jZSBhbmQgdGhlIGNvbm5lY3Rpb24gd291bGQgdGh1cyBiZSB1c2VkIGVycm9uZW91c2x5LgoKRGFuaWVsICgyNCBNYXIpCi0gR/Z0eiBCYWJpbi1FYmVsbCBwb2ludGVkIG91dCB0aGF0IHRoZSBjYS1idW5kbGUuY3J0IGZpbGUgY29udGFpbmVkIGEKICBjZXJ0aWZpY2F0ZSBmcm9tIFRydXN0Y2VudGVyIHRoYXQgd2FzIGEgZGVtbyBjZXJ0aWZpY2F0ZSBvbmx5IHRoYXQgd2FzIG5ldmVyCiAgaW50ZW5kZWQgdG8gYmUgcGFydCBvZiBhIENBIGJ1bmRsZS4KCkRhbmllbCAoMjEgTWFyKQotIExpZmUgaXMgYSBteXN0ZXJ5LiBXaXRoaW4gYSB0aW1lIHBlcmlvZCBvZiAxNyBob3VycywgVGltIFBvcGUgYW5kIE1pY2hhZWwKICBDaHVyY2hpbGwgZmlsZWQgb25lIGJ1ZyByZXBvcnQgZWFjaCwgYm90aCBpZGVudGlmeWluZyBwcm9ibGVtcyB3aXRoIGEgc2Vjb25kCiAgdHJhbnNmZXIgd2hlbiBkb2luZyBwZXJzaXN0ZW50IHRyYW5zZmVycyByZS11c2luZyBhIGNvbm5lY3Rpb24uIFRpbSdzIG9uZSBpcwogICM3MDY2MjQsIGxhYmVsZWQgIk11bHRpcGxlIHVwbG9hZHMgcGVyIGhhbmRsZSBmYWlsIiBhbmQgTWljaGFlbCdzICM3MDcwMDMKICAiRG9lcyBub3Qgc2VuZCBBdXRob3JpemF0aW9uOiBoZWFkZXIgd2hlbiByZXVzaW5nIGNvbm5lY3Rpb24iLiBJIGNvdWxkIHRyYWNrCiAgYm90aCBkb3duIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGxvZ2ljIGFuZCBpdCB0dXJuZWQgb3V0IGxpYmN1cmwgd2FzIG5vdCB1c2luZwogIG5ldyBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIHJlLXVzaW5nIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uIFRoaXMgY29uY2VybmVkCiAgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIGFuZCBpbnZvbHZlZCBleGFjdGx5IHRob3NlIHBpZWNlcyB0aGVzZSB0d28KICByZXBvcnRzIGlkZW50aWZpZWQuIFRoaXMgY29kZSBoYXMgYmVlbiB0aGlzIGZhdWx0eSBzaW5jZSB0aGUgZGF5IEkKICBpbnRyb2R1Y2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwsIG1vcmUgdGhhbiAyIHllYXJzIGFnby4KCkRhbmllbCAoMjAgTWFyIDIwMDMpCi0gRml2ZSB5ZWFyIGFubml2ZXJzYXJ5LiBUb2RheSBmaXZlIHllYXJzIGFnbywgdGhlIGZpcnN0IGV2ZXIgY3VybCByZWxlYXNlIHNhdwogIHRoZSBsaWdodCBvZiBkYXkuCgpEYW5pZWwgKDE3IE1hcikKLSBBbmR5IENlZGlsbmlrIGNvcnJlY3RlZCBmbGF3cyBpbiBzb21lIGxpYmN1cmwgZXhhbXBsZS11c2FnZSBzb3VyY2VzLgoKRGFuaWVsICgxNiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgcmVwb3J0ZWQgdGhhdCB0aGUgZml4IGZyb20gTWFyY2ggMm5kIHdhcyBpbmNvbXBsZXRlLgoKLSBBZGRlZCBjb2RlIHRvIHRoZSBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yIHNlbGVjdCgpIGFyZ3VtZW50IHR5cGVzLiBJJ3ZlCiAgbm90IG1hZGUgYW55IGNvZGUgdXNlIHRoZSByZXN1bHRzIGp1c3QgeWV0IHRob3VnaC4KCkRhbmllbCAoMTUgTWFyKQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIHR3byBwYXRjaGVzIHRvIGJ1aWxkIGJldHRlciBvbiBXaW5kb3dzLgoKLSBBZGp1c3RlZCB0aGUgdGVzdCBzdWl0ZSBjb2RlIHRvIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyKHMpIHJlcXVpcmVkCiAgZm9yIGEgc3BlY2lmaWMgdGVzdCBpcyBwcm9wZXJseSBzdGFydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIGF0dGVtcHRlZC4KICBNYW55IHRlc3RzIG5vdyBydW4gYSBsb3QgZmFzdGVyIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgxNCBNYXIpCi0gQW5vdGhlciBjb25maWd1cmUuaW4gYWRqdXN0bWVudCBtYWRlIHRoZSBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBwcm9wZXJseQogIG9uIEhQVVggbm93LgoKRGFuaWVsICgxMyBNYXIpCi0gUGhpbGlwcGUgUmFvdWx0IGZpeGVkIHByZTQtY29tcGlsZSBxdWlya3MgZm9yIEZyZWVCU0QuCgpWZXJzaW9uIDcuMTAuNC1wcmU0ICgxMyBNYXIgMjAwMykKCkRhbmllbCAoMTMgTWFyKQotIEFkZGVkIGEgYmFja3VwLWNoZWNrIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgYnkgQUNfQ0hFQ0tfRlVOQ1MoKQogIGFzIEkgYmVsaWV2ZSBzb21lIGNoZWNrcyBvbiBIUFVYIG5lZWQgdGhpcy4gQXQgbGVhc3Qgc29tZSBvZiB0aGUgaW5mbyBnaXZlbgogIHRvIHVzIGJ5IFJpY2sgSm9uZXMgc2VlbWVkIHRvIGluZGljYXRlIHRoaXMuCgpEYW5pZWwgKDEyIE1hcikKLSBUaG9tYXMgVG9uaW5vIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIHRoZSBjdXJsIHRvb2wgdG8gZG8gUFVUIG9wZXJhdGlvbnMKICBhcyBpbiAnY3VybCB3d3cuZm9vLmNvbS9kaXIvIC1UIGZpbGUnIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVkIGZvciBleGFtcGxlCiAgc3BhY2Ugb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGRvbid0IGJlbG9uZyBpbiBVUkxzLCBjdXJsIGRpZCBub3QgcHJvcGVybHkKICBVUkwgZW5jb2RlIHRoZW0gYmVmb3JlIHVzaW5nIHRoZW0gaW4gdGhlIFVSTC4KCi0gQWRkZWQgYW4gb3B0aW9uIHRvIGNvbmZpZ3VyZSBjYWxsZWQgLS1lbmFibGUtbGliZ2NjIHRoYXQgc2ltcGx5IGFkZHMgLWxnY2MKICB0byB0aGUgTElCUyB2YXJpYWJsZSwgYXMgdGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtLgoKLSBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUuaW4gZmlsZSwgc28gdGhhdCB0aGUgaGVhZGVycyBhcmUgbm93IGNoZWNrZWQgaW4gYW4KICBvcmRlciBvZiAidmlhbGl0eSIuIFdlIG11c3QgYWxzbyBtYWtlIHN1cmUgdG8gdXNlIHRoZSAiZGVmYXVsdCBoZWFkZXJzIgogIHBhcmFtZXRlciB0byBBQ19DSEVDS19IRUFERVJTKCkgc28gdGhhdCBoZWFkZXJzIGFyZSBjaGVja2VkIHdpdGggdGhlIHByb3BlcgogIHByZXJlcXVpc2l0ZXMgaW5jbHVkZWQgKGkuZSBhbGwgdGhlIG1ham9yIGFuZCBnZW5lcmFsbHkgaW1wb3J0YW50IGhlYWRlcgogIGZpbGVzIGFyZSBpbmNsdWRlZCB0aGVyZSBieSBkZWZhdWx0KS4gVGhpcyBtaWdodCBiZSB3aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMKICBTdW4sIEhQLCBBSVggYW5kIFRydTY0IHN5c3RlbXMgdG8gYmVoYXZlIGdvb2QgYWdhaW4gb24gdGhlIGhlYWRlciBjaGVjawogIGZyb250LgoKLSBSaWNrIEpvbmVzIHBvaW50ZWQgb3V0IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIG9uIEhQLVVYIHRoYXQgSSBhZGRyZXNzZWQuCgotIEkgbWFkZSB0aGUgY29uZmlndXJlIC0taGVscCBvdXRwdXQgbmljZXIgYnkgdXNpbmcgQUNfSEVMUF9TVFJJTkcoKSBhIGxvdAogIG1vcmUuCgpEYW5pZWwgKDExIE1hcikKLSBDaHJpc3RvcGhlIERlbW9yeSBmaXhlZCB0aGUgc29ja2V0IHNlbmRpbmcgY29kZSB0byB3b3JrIGJldHRlciBvbiBIUC1VWAogIHdoZW4gc2VuZGluZyBkYXRhIHRvIGEgc29ja2V0IHRoYXQgd291bGQgYmxvY2suIEl0IHRoZW4gcmV0dXJucyBFQUdBSU4sIG5vdAogIEVXT1VMREJMT0NLLgoKLSBSaWNoYXJkIEdvcnRvbiBpbXByb3ZlZCB0aGUgc2VlZGluZyBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgZ29vZAogIGFuZCByZWxpYWJsZSByYW5kb20gc291cmNlLgoKLSBSaWNoYXJkIEdvcnRvbiBmaXhlZCBhIGZldyB3YXJuaW5ncyB0aGF0IHBvcHBlZCB1cCB3aGVuIHlvdSBidWlsdCBjdXJsCiAgdXNpbmcgdGhlIFN1biBjb21waWxlciBvbiBhIDY0Yml0IFNQQVJDIHBsYXRmb3JtLgoKLSBNYXJ0aW4gQy4gTWFydGluIGZpeGVkIGEgY2FzZSB3aGVyZSBhIGNvbm5lY3QgZmFpbHVyZSB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgZGlkbid0IHByb2R1Y2UgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcuCgpEYW5pZWwgKDEwIE1hcikKLSBSZXZlcnRlZCBsdG1haW4uc2ggYmFjayB0byBsaWJ0b29sIDEuNC4yIHN0YXR1cyBhZ2FpbiwgYXMgdGhlIDEuNC4zIHZlcnNpb24KICBicm9rZSB0aGUgYnVpbGQgb24gbnVtZXJvdXMgcGxhdGZvcm1zLiBJdCBzZWVtcyB0aGF0IGxpYnRvb2wgMS40LjMgcHV0cyBzb21lCiAgcmVxdWlyZW1lbnRzIG9uIHdoYXQgdmVyc2lvbnMgb2YgdGhlIG90aGVyIHRvb2xzIChhdXRvY29uZiArIGF1dG9tYWtlKSB0aGF0CiAgSSBhbSBub3QgZmFtaWxpYXIgd2l0aCBhbmQgdGh1cyBJIGNvdWxkbid0IGZ1bGZpbGwgYXQgdGhpcyBwb2ludC4KCiAgWWVzLCB0aGlzIGlzIG1vcmUgdGhhbiBtaWxkbHkgZnJ1c3RyYXRpbmcuCgpEYW5pZWwgKDcgTWFyKQotIFJ1biBsaWJ0b29saXplIHZlcnNpb24gMS40LjMuCgpWZXJzaW9uIDcuMTAuNC1wcmUzICg0IE1hciAyMDAzKQoKRGFuaWVsICgzIE1hcikKLSBBZGRlZCBzaGFyZS5vYmogdG8gdGhlIFZDNiBhbmQgQm9ybGFuZCBsaWJjdXJsIG1ha2VmaWxlcy4KCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZvdW5kIGFuZCBpbnZlc3RpZ2F0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBvbiBBSVgsCiAgcHJlc3VtYWJseSBvbmx5IG9uIDQuMyBvciBsYXRlci4gZ2V0aG9zdGJ5bmFtZV9yKCkgaXMgbm90IHJldHVybmluZyBkYXRhCiAgdGhhdCBpcyBwb3NzaWJsZSB0byAia2VlcCIgYW5kIGNhY2hlIHRoZSB3YXkgbGliY3VybCBkb2VzLiBCdXQgaW5zdGVhZCB0aGVzZQogIHZlcnNpb25zIG9mIEFJWCB1c2VzIGEgZ2V0aG9zdGJ5bmFtZSgpIHRoYXQgd29ya3MgdGhyZWFkLXNhZmVseSB3ZSBjYW4KICBpbnN0ZWFkIHVzZSB0aGUgb3JkaW5hcnkgZ2V0aG9zdGJ5bmFtZSgpIGFuZCBvdXIgcGFja19ob3N0ZW50KCkgYXBwcm9hY2ggdG8KICBhY2hpZXZlIHdoYXQgd2Ugd2FudC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGF0dGVtcHRzIHRvIGRldGVjdCBBSVggNC4zIG9yCiAgbGF0ZXIgdG8gYWRqdXN0IGZvciB0aGlzLgoKRGFuaWVsICgyIE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSBmb3VuZCBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjEwLjMgd2hlbiB5b3UgZmlyc3QgZGlkIGEKICBQT1NUIGFuZCB0aGVuIGJhY2sgdG8gYSBHRVQgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUuCgpEYW5pZWwgKDI4IEZlYikKLSBSZW1vdmVkIHRoZSBzdHJlcXVhbCBhbmQgc3RybmVxdWFsIGRlZmluZXMgZnJvbSBjdXJsL2N1cmwuaCBoZWFkZXIuIFRoZXkKICB3ZXJlIG5ldmVyIG1lYW50IGZvciB0aGUgcHVibGljIGhlYWRlciBhbnl3YXkuIFBoaWxpcHBlIFJhb3VsdCBicm91Z2h0IGl0CiAgdXAuCgotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBSSVNDIE9TIGJ1aWxkLgoKRGFuaWVsICgyNyBGZWIpCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoZSB2ZXJ5IG1pc2xlYWRpbmcgY3VybF9tdWx0aV9pbmZvX3JlYWQgbWFuIHBhZ2UsIGFuZAogIEkgdXBkYXRlZCBpdCB0byBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkaW5nIHRoYXQgdHVybmVkIG91dCB0bwogIGJlIGhpcyBGVFAgc2VydmVyIHJldHVybmluZyBzaXplIHplcm8gKDAgYnl0ZXMpIHdoZW4gU0laRSB3YXMgdXNlZCBvbiBhIGZpbGUKICB3aGlsZSBiZWluZyBpbiBCSU5BUlkgbW9kZS4gV2Ugbm93IG1ha2UgYSBzZWNvbmQgY2hlY2sgZm9yIHRoZSBhY3R1YWwgc2l6ZQogIGJ5IHNjYW5uaW5nIHRoZSBSRVRSIHJlcGx5IGFueXdheSwgZXZlbiBpZiB0aGUgU0laRSBjb21tYW5kIHJldHVybmVkIDAuCgpEYW5pZWwgKDI2IEZlYikKLSBLeWxlIFNhbGxlZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgaGUgd291bGQgZG8gYSB0cmFuc2ZlciB0aGF0IGRpZG4ndCB1cGRhdGUKICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcHJvcGVybHkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBjYXNlIHdoZXJlIGxpYmN1cmwgd291bGQKICBsb29wIGEgbGl0dGxlIHRvbyBlYWdlcmx5IGluIHRoZSB0cmFuc2ZlciBsb29wLCB3aGljaCBpc24ndCByZWFsbHkgZ29vZCBmb3IKICB0aGUgQVBJcywgZXNwZWNpYWxseSBub3QgdGhlIG11bHRpIEFQSS4KClZlcnNpb24gNy4xMC40LXByZTIgKDI0IEZlYiAyMDAzKQoKRGFuaWVsICgyNCBGZWIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byBhIHZhbHVlIGhpZ2hlcgogIHRoYW4gNSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0LgoKLSBJIGJlbGlldmUgSSBmaXhlZCB0aGUgJ0V4cGVjdDogMTAwLWNvbnRpbnVlJyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIGJyb2tlbgogIGZvciBhIHdoaWxlIChJIHRoaW5rIHNpbmNlIG15IGNoYW5nZSBkYXRlZCBEZWMgMTAgMjAwMikuIFdoZW4gdGhpcyBoZWFkZXIgaXMKICB1c2VkLCBsaWJjdXJsIHNob3VsZCB3YWl0IGZvciBhIEhUVFAgMTAwIChvciB0aW1lb3V0KSBiZWZvcmUgc2VuZGluZyB0aGUKICBwb3N0L3B1dCBkYXRhLgoKRGFuaWVsICgxNCBGZWIpCi0gTWF0dGhldyBDbGFya2UgcHJvdmlkZWQgc29tZSBpbmZvIHdoYXQgdG8gbW9kaWZ5IHRvIG1ha2UgY3VybCBidWlsZAogIGZsYXdsZXNzbHkgb24gQUlYIDMuMi41LgoKLSBNYXJ0aW4gQy4gTWFydGluIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVuCiAgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHBvcnQgd2l0aG91dCBhIGxpc3RlbmVyLgoKRGFuaWVsICgxMyBGZWIpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIEN1cmxfYmFzZTY0X2VuY29kZSgpIHRvIGRlYWwgd2l0aCB6ZXJvZXMgaW4gdGhlCiAgZGF0YSB0byBlbmNvZGUuCgpEYW5pZWwgKDQgRmViKQotIEplYW4tUGhpbGlwcGUgYWRkZWQgdGhlIGZpcnN0IGNvZGUgdGhhdCBlbmFibGVzIHRoZSAnc2hhcmUnIHN5c3RlbS4gVGhpcwogIHNob3VsZCBub3cgZW5hYmxlIHNoYXJpbmcgb2YgRE5TIGRhdGEgYmV0d2VlbiB0d28gY3VybCBlYXN5IGhhbmRsZXMuCgotIEluY29ycG9yYXRlZCBOaWNvIEJhZ2d1cycgZml4ZXMgdG8gYWdhaW4gY29tcGlsZSBmbGF3bGVzc2x5IG9uIFZNUy4KCi0gSmFtZXMgQnVyc2EgY29ycmVjdGVkIGEgYmFkIGNvbW1lbnQgaW4gdGhlIHB1YmxpYyBpbmNsdWRlIGZpbGUgY3VybC9tdWx0aS5oCgotIFBldGVyIEZvcnJldCByZXBvcnRlZCBvbmUgb2YgdGhvc2UgZXJyb3I6MDAwMDAwMDAgY2FzZXMgaW4gbGliY3VybCBhZ2FpbgogIHdoZW4gY29ubmVjdGluZyB0byBhIEhUVFBTIHNpdGUsIGFuZCB0aGlzIHRpbWUgSSBkaWQgZGlzY292ZXIgc29tZSBvZGRpdGllcwogIGluIGhvdyBjdXJsIHJlcG9ydHMgU1NMIGVycm9ycyBiYWNrLiBJdCBjb3VsZCBtaXNzIHNob3dpbmcgdGhlIGFjdHVhbCBlcnJvci4KClZlcnNpb24gNy4xMC40LXByZTEgKDMgRmViIDIwMDMpCgpEYW5pZWwgKDMgRmViKQotIFJlbW92ZWQgdGhpbmdzIGluIHRoZSBkb2NzIHNheWluZyBjYXBhdGggZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MsIGFzIEp1bGlhbgogIE5vYmxlIHRvbGQgdXMgaXQgd29ya3MgZmluZS4KCkRhbmllbCAoMzEgSmFuKQotIEtldmluIFJvdGggZml4ZWQgdGhlIHpsaWIgYnVpbGQgc3R1ZmYgaW4gdGhlIE1pbmd3MzIgbWFrZWZpbGUuCgpEYW5pZWwgKDMwIEphbikKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGN1cmwgb24gV2luZG93cyBhbHdheXMgY2hlY2tlZCBmb3IgdGhlIENBIGNlcnQKICBidW5kbGUgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgcGF0aCBzY2FuLCBldmVuIHRob3VnaAogIC1rLy0taW5zZWN1cmUgd2FzIHVzZWQuCgotIEhhbWlzaCBNYWNrZW56aWUgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIG9ubHkgZGlkIHN0cmljdCBob3N0IG5hbWUgdmVyaWZ5aW5nCiAgaWYgY2FwYXRoIG9yIGNhaW5mbyB3YXMgdXNlZC4gTm93IGl0J2xsIGFsd2F5cyBkbyBpdCB1bmxlc3MgLWsgLyAtLWluc2VjdXJlCiAgaXMgdXNlZCEKCi0gUGF2ZWwgQ2VuZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gd2FzIGRvbmUgd3JvbmdseQogIGFzIHRoZSBmdWxsIHN0cmluZyB3YXMgbm90IGZldGNoZWQuIEFkZGVkIHRlc3QgY2FzZSA1NyB0byB2ZXJpZnkgdGhhdCBjdXJsCiAgZG9lcyBpdCByaWdodCBub3cuCgpEYW5pZWwgKDI5IEphbikKLSBKYW1pZSBXaWxraW5zb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBjdXJsIGF0dGVtcHQgdG8gY2xlYXIgb3V0CiAgInNlbnNpdGl2ZSIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIHBzIG91dHB1dHMKICAob25seSBvbiBwbGF0Zm9ybXMgdGhhdCBhbGxvdyB3cml0aW5nIHRvIGFyZ3ZbXSkuCgotIEpvaG4gTWNHb3dhbiBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBiYWQKICBhcmd1bWVudHMgYW5kIHRodXMgY2F1c2UgdGhlIC0tdHJhY2Ugb3V0cHV0cyB0byBnbyB3cm9uZy4KCi0gUmVtb3ZlZCBhbGwgdGhlIGVtYWNzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIGFsbCBmaWxlcy4gTWF0cyBMaWRlbGwgcHJvdmlkZWQKICB0aGUgbmV3IHNhbXBsZS5lbWFjcyBmaWxlIChmb3IgYSBzYW1wbGUgb2Ygd2hhdCB0byBpbmNsdWRlIGluIHlvdXIgLmVtYWNzKQogIGFuZCB0aGUgY3VybC1zdHlsZS5lbCB0aGF0IHNldHMgYSBiZXR0ZXIgYy1zdHlsZSBmb3IgZWRpdGluZyBjdXJsIHNvdXJjZXMuCgotIERhdmUgSGFsYmFra2VuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZHMgdGhhdCBjb3VsZCBhY2NpZGVudGx5CiAgcmV0dXJuIENVUkxFX1BBUlRJQUxfRklMRSB3aGVuIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2FzIGNhbGxlZCB3aXRoIE5PQk9EWQogIHNldCBUUlVFLgoKRGFuaWVsICgyNyBKYW4pCi0gVGhlIGZvcGVuLmMgZXhhbXBsZSB3YXMgZmxhd2VkIGFzIE5pY2sgSHVtZnJleSBub3RpY2VkLCBhbmQgSSBmaXhlZCBpdCB0bwogIHdvcmsgYWdhaW4uCgpEYW5pZWwgKDI0IEphbikKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayAodGhlIGNvbnRlbnQtdHlwZSBzdHJpbmcpCiAgd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLgoKRGFuaWVsICgyMiBKYW4gMjAwMykKLSBJYW4gV2lsa2VzIGFuZCBMZWdvZmYgVmluY2VudCBib3RoIGluZGVwZW5kZW50bHkgcHJvdmlkZWQgZml4ZXMgZm9yIG1ha2luZwogIGN1cmwvbXVsdGkuaCB3b3JrIHByb3Blcmx5IHdoZW4gY29tcGlsZWQgd2l0aCBhIEMrKyBjb21waWxlci4KCkRhbmllbCAoMjAgSmFuIDIwMDMpCi0gRml4ZWQgJ2J1aWxkY29uZicgdG8gY2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlcXVpcmVkIHRvb2xzIGJlZm9yZQogIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KCi0gV3JvdGUgJ3Rlc3RjdXJsLnNoJywgYSBzY3JpcHQgdGFyZ2V0ZWQgZm9yIGF1dG9tYXRpYyBhbmQgZGlzdHJpYnV0ZWQgY3VybAogIHRlc3RzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgoKLSBEYXZpZCBUaGllbCBwb2ludGVkIG91dCB0aGF0IHRoZSAubmV0cmMgZmlsZSB3YXMgbm90IGJlaW5nIGRlYWx0IHdpdGgKICBwcm9wZXJseSBhbnltb3JlLiBJIGJyb2tlIHRoaXMgaW4gdGhlIHBhc3N3b3JkIHByb21wdGluZyAiZml4Ii4KCi0gTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgcGF0Y2hlZCBsaWJjdXJsIHRvIGFsbG9jYXRlIHRoZSBzY3JhdGNoIGJ1ZmZlciBvbmx5CiAgb24gZGVtYW5kIGFuZCB0aHVzIHdlIHNhdmUgMzJLQiBpbiBlYWNoIGN1cmwgaGFuZGxlIHRoYXQgZG9uJ3QgdXNlIHRoYXQKICBidWZmZXIuIFRoaXMgbmVlZCBhcHBlYXJlZCB3aGVuIHNvbWUgcGVvcGxlIHN0YXJ0ZWQgdXNpbmcgdGhvdXNhbmRzIG9mCiAgc2ltdWx0YW5lb3VzIGN1cmwgaGFuZGxlcy4uLiA6LSkKCkRhbmllbCAoMTYgSmFuIDIwMDMpCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBjdXJsLWNvbmZpZyAtLWNmbGFncyB3aGVuIHRoZSBpbmNsdWRlZGlyIHdhcyBub3QKICAvdXNyL2luY2x1ZGUuCgotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgQ1VSTElORk9fUFJJVkFURSB0byBwcm9wZXJseSByZXR1cm4gTlVMTCBpZiBpdCB3YXMKICBzZXQgdG8gTlVMTCEKClZlcnNpb24gNy4xMC4zICgxNCBKYW4gMjAwMykKCkRhbmllbCAoMTAgSmFuIDIwMDMpCi0gU3RldmUgT2xpcGhhbnQgcG9pbnRlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgMTA1IGRpZCBub3Qgd29yayBhbnltb3JlIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBhIG1pc3NpbmcgZml4IGZvciB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nLgoKVmVyc2lvbiA3LjEwLjMtcHJlNiAoMTAgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gQnJ5YW4gS2VtcCBwb2ludGVkIG91dCB0aGF0IGN1cmwgLXUgY291bGQgbm90IHByb3ZpZGUgYSBibGFuayBwYXNzd29yZAogIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyLiBJdCBjYW4gbm93LiAtdSB1c2VybmFtZTogbWFrZXMgdGhlIHBhc3N3b3JkCiAgZW1wdHksIHdoaWxlIC11IHVzZXJuYW1lIG1ha2VzIGN1cmwgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgoKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSByZW1haW5pbmcgY29ubmVjdCBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb24KICBpcHY0IHN5c3RlbXMgKExpbnV4IG9ubHk/KSwgdGhhdCBJIGZpeGVkIGFuZCBLamV0aWwgdmVyaWZpZWQgdGhhdCBpdCBmaXhlZAogIGhpcyBwcm9ibGVtcy4KCi0gbWVtYW5hbHl6ZS5wbCBub3cgcmVhZHMgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgbm8gbG9uZ2VyCiAgdGFrZXMgdGhlIGRhdGEgb24gc3RkaW4gYXMgYmVmb3JlLgoKVmVyc2lvbiA3LjEwLjMtcHJlNSAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBGaXhlZCB0ZXN0cy9tZW1hbmFseXplLnBsIHRvIHdvcmsgd2l0aCBmaWxlIG5hbWVzIHRoYXQgY29udGFpbiBjb2xvbnMgKGFzIG9uCiAgV2luZG93cykuCiAgCi0gS2pldGlsIEphY29ic2VuIHF1aWNrbHkgcG9pbnRlZCBvdXQgdGhhdCBsaWIvc2hhcmUuaCB3YXMgbWlzc2luZy4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlNCAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBVcGRhdGVkIGxpYi9zaGFyZS5jIHF1aXRlIGEgYml0IHRvIG1hdGNoIHRoZSBkZXNpZ24gZG9jdW1lbnQgYXQKICBodHRwOi8vY3VybC5oYXh4LnNlL2Rldi9zaGFyaW5nLnR4dCBhIGxvdCBtb3JlLgoKICBJJ2xsIHRyeSB0byB1cGRhdGUgdGhlIGRvY3VtZW50IHNvb25pc2guIHNoYXJlLmMgaXMgc3RpbGwgbm90IGFjdHVhbGx5IHVzZWQKICBieSBsaWJjdXJsLCBidXQgdGhlIEFQSSBpcyBzbG93bHkgZ2V0dGluZyB0aGVyZSBhbmQgd2UgY2FuIHN0YXJ0CiAgaW1wbGVtZW50aW5nIGNvZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBzeXN0ZW0uCgpEYW5pZWwgKDggSmFuIDIwMDMpCi0gVXBkYXRlZCBzaGFyZSBzdHVmZiBpbiBjdXJsL2N1cmwuaCwgaW5jbHVkaW5nIGRhdGEgdHlwZXMsIHN0cnVjdHMgYW5kCiAgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gbGliLyB3ZXJlIGFsc28gbW9kaWZpZWQKICBvZiBjb3Vyc2UgdG8gcmVtYWluIGNvbXBpbGFibGUuIEJhc2VkIG9uIGlucHV0IGZyb20gSmVhbi1QaGlsaXBwZSBhbmQgYWxzbwogIHRvIG1ha2UgaXQgbW9yZSBpbiBsaW5lIHdpdGggdGhlIGRlc2lnbiBkb2N1bWVudC4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwYXRjaGVkIGEgdmVyeSB0cml2aWFsIG1lbW9yeSBsZWFrIGluCiAgY3VybF9lc2NhcGUoKSB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwuLi4KCi0gTWF0dGhldyBCbGFpbiBwcm92aWRlZCBmZWVkYmFjayB0byBtYWtlIHRoZSAtLWNyZWF0ZS1kaXJzIHN0dWZmIGJ1aWxkCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIHRlc3RzL2xpYnRlc3QvZmlyc3QuYyBhcyBMZWdvZmYgVmluY2VudCBwb2ludGVkIG91dC4KCkRhbmllbCAoNyBKYW4gMjAwMykKLSBQaGlsaXBwZSBSYW91bHQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIHByb3Blcmx5IHN1cHBvcnQKICB3aWxkY2FyZCBjaGVja3MgZm9yIGNlcnRpZmljYXRlIG5hbWVzLgoKLSBTaW1vbiBMaXUgYWRkZWQgQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUywgdG8gbGV0IGFuIGFwcGxpY2F0aW9uIHNldCBvdGhlcgogIHN0cmluZ3MgcmVjb2duaXplZCBhcyAiSFRUUCAyMDAiIHRvIGFsbG93IGh0dHAtbGlrZSBwcm90b2NvbHMgdG8gZ2V0CiAgZG93bmxvYWRlZCBmaW5lIGJ5IGN1cmwuCgotIE5vdyB1c2luZyBhdXRvY29uZiAyLjU3IGFuZCBhdXRvbWFrZSAxLjcuMgoKLSBEb2luZyAiY3VybCAtSSBmdHA6Ly9kb21haW4vbm9uLWV4aXN0aW5nLWZpbGUiIHN0aWxsIG91dHB1dGVkIGEgZGF0ZSEKICBXYXluZSBIYWlnaCByZXBvcnRlZC4KCi0gVGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IHdyaXR0ZW4gcHJvcGVybHkgd2l0aCBhIG5ld2xpbmUgaW4gdGhlIC0tdHJhY2UKICBmaWxlLgoKRGFuaWVsICg2IEphbiAyMDAzKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHBvc3NpYmxlIGJ1ZzogcHJldmlvdXNseSwgaWYgeW91IGNhbGxlZAogIGN1cmxfZWFzeV9wZXJmb3JtIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGRucyBjYWNoZSwgdGhlIGdsb2JhbCBjYWNoZQogIHdvdWxkbid0IGJlIHVzZWQuIFBvaW50ZWQgb3V0IGJ5IEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUuCgotIE1hdHRoZXcgQmxhaW4ncyBmaXhlZCB0aGUgVkM2IGxpYmN1cmwgbWFrZWZpbGUgdG8gaW5jbHVkZSBiZXR0ZXIgZGVidWcgZGF0YQogIG9uIGRlYnVnIGJ1aWxkcy4K