ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMDYuIFRoZSBtb3N0IHJlY2VudCBjaGFuZ2VzIGFyZQphbHdheXMga2VwdCBpbiB0aGUgQ0hBTkdFUyBmaWxlLgoKRGFuaWVsIFMgKDI3IERlYyAyMDA3KQotIERtaXRyeSBLdXJvY2hraW4gbWVudGlvbmVkIGEgZmxhdwogIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMTIvMDI1Mi5odG1sKSBpbiBkZXRlY3RfcHJveHkoKSB3aGljaAogIGZhaWxlZCB0byBzZXQgdGhlIGJpdHMucHJveHkgdmFyaWFibGUgcHJvcGVybHkgd2hlbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogIHRvbGQgbGliY3VybCB0byB1c2UgYSBodHRwIHByb3h5LgoKRGFuaWVsIFMgKDI2IERlYyAyMDA3KQotIEluIGFuIGF0dGVtcHQgdG8gcmVwZWF0IHRoZSBwcm9ibGVtIGluIGJ1ZyByZXBvcnQgIzE4NTA3MzAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg1MDczMCkgSSB3cm90ZSB1cCB0ZXN0IGNhc2UgNTUyLiBUaGUKICB0ZXN0IGlzIGRvaW5nIGEgNzBLIFBPU1Qgd2l0aCBhIHJlYWQgY2FsbGJhY2sgYW5kIGFuIGlvY3RsIGNhbGxiYWNrIG92ZXIgYQogIHByb3h5IHJlcXVpcmluZyBEaWdlc3QgYXV0aC4gVGhlIHRlc3QgY2FzZSBjb2RlIGlzIG1vcmUgb3IgbGVzcyBpZGVudGljYWwgdG8KICB0aGUgdGVzdCByZWNpcGUgY29kZSBwcm92aWRlZCBieSBTcGFjZW4gSmFzc2V0ICh3aG8gc3VibWl0dGVkIHRoZSBidWcKICByZXBvcnQpLgoKRGFuaWVsIFMgKDI1IERlYyAyMDA3KQotIEdhcnkgTWF4d2VsbCBmaWxlZCBidWcgcmVwb3J0ICMxODU2NjI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4NTY2MjgpIGFuZCBwcm92aWRlZCBhIGZpeCBmb3IgdGhlCiAgKHNtYWxsKSBtZW1vcnkgbGVhayBpbiB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlLiBJdCBoYXBwZW5lZCB3aGVuIGEKICBwcmV2aW91cyBlbnRyeSBpbiB0aGUgY2FjaGUgd2FzIHJlLXVzZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDE5IERlYyAyMDA3KQotIEVuc3VyZSB0aGF0IG5yb2ZmIGRvZXNuJ3QgcHV0IGFueXRoaW5nIGJ1dCBBU0NJSSBjaGFyYWN0ZXJzIGludG8gdGhlCiAgLS1tYW51YWwgdGV4dC4KCllhbmcgVHNlICgxOCBEZWMgMjAwNykKLSBNU1ZDIDkuMCAoVlMyMDA4KSBkb2VzIG5vdCBzdXBwb3J0IFdpbmRvd3MgYnVpbGQgdGFyZ2V0cyBwcmlvciB0byBXaW5YUCwKICBhbmQgbWFrZXMgd3JvbmcgYXN1bXB0aW9ucyBvZiBidWlsZCB0YXJnZXQgd2hlbiBpdCBpc24ndCBzcGVjaWZpZWQuIFNvLAogIGlmIG5vIGJ1aWxkIHRhcmdldCBoYXMgYmVlbiBkZWZpbmVkIHdlIHdpbGwgdGFyZ2V0IFdpblhQIHdoZW4gYnVpbGRpbmcKICBjdXJsL2xpYmN1cmwgd2l0aCBNU1ZDIDkuMCAoVlMyMDA4KS4KCi0gKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDctMTIvMDAzOS5odG1sKSByZXBvcnRlZCBhbmQgZml4ZWQKICBhIGZpbGUgdHJ1bmNhdGlvbiBwcm9ibGVtIG9uIFdpbmRvd3MgYnVpbGQgdGFyZ2V0cyB0cmlnZ2VyZWQgd2hlbiByZXRyeWluZwogIGEgZG93bmxvYWQgd2l0aCBjdXJsLgoKRGFuaWVsIFMgKDE3IERlYyAyMDA3KQotIE1hdGV1c3ogTG9za290IHBvaW50ZWQgb3V0IHRoYXQgTVNWQyA5LjAgKFZTMjAwOCkgaGFzIHRoZSBwb2xsZmQgc3RydWN0IGFuZAogIGRlZmluZXMgaW4gd2luc29jazIuaCBzb21laG93IGRpZmZlcmVudGx5IHRoYW4gcHJldmlvdXMgdmVyc2lvbnMgYW5kIHRoYXQKICBjdXJsIDcuMTcuMSB3b3VsZCBmYWlsIHRvIGNvbXBpbGUgb3V0IG9mIHRoZSBib3guCgpEYW5pZWwgUyAoMTMgRGVjIDIwMDcpCi0gRGF2aWQgV3JpZ2h0IGZpbGVkIGJ1ZyByZXBvcnQgIzE4NDk3NjQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg0OTc2NCkgd2l0aCBhbiBpbmNsdWRlZCBmaXguIEhlCiAgaWRlbnRpZmllZCBhIHByb2JsZW0gZm9yIHJlLXVzZWQgY29ubmVjdGlvbnMgdGhhdCBwcmV2aW91c2x5IGhhZCBzZW50CiAgRXhwZWN0OiAxMDAtY29udGludWUgYW5kIGluIHNvbWUgc2l0dWF0aW9ucyB0aGUgc3Vic2VxdWVudCBQT1NUICh0aGF0IGRpZG4ndAogIHVzZSBFeHBlY3Q6KSBzdGlsbCBoYWQgdGhlIGludGVybmFsIGZsYWcgc2V0IGZvciBpdHMgdXNlLiBEYXZpZCdzIGZpeCAodGhhdAogIG1ha2VzIHRoZSBzZXR0aW5nIG9mIHRoZSBmbGFnIGluIGV2ZXJ5IHNpbmdsZSByZXF1ZXN0IHVuY29uZGl0aW9uYWxseSkgaXMKICBmaW5lIGFuZCBpcyBub3cgdXNlZCEKCkRhbmllbCBTICgxMiBEZWMgMjAwNykKLSBHaWxsZXMgQmxhbmMgbWFkZSB0aGUgY3VybCB0b29sIGVuYWJsZSBTT19LRUVQQUxJVkUgZm9yIHRoZSBjb25uZWN0aW9ucyBhbmQKICBhZGRlZCB0aGUgLS1uby1rZWVwLWFsaXZlIG9wdGlvbiB0aGF0IGNhbiBkaXNhYmxlIHRoYXQgb24gZGVtYW5kLgoKRGFuaWVsIFMgKDkgRGVjIDIwMDcpCi0gQW5kcmV3IE1vaXNlIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NDc1MDEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg0NzUwMSkgYW5kIHBvaW50ZWQgb3V0IGEgbWVtY3B5KCkKICB0aGF0IHNob3VsZCBiZSBtZW1tb3ZlKCkgaW4gdGhlIGNvbnZlcnRfbGluZWVuZHMoKSBmdW5jdGlvbi4KCkRhbmllbCBTICg4IERlYyAyMDA3KQotIFJlbmFtZWQgYWxsIGludGVybmFsIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBoYWQgQ3VybF8gcHJlZml4ZXMgdG8gbm8gbG9uZ2VyCiAgaGF2ZSB0aGVtLiBUaGUgQ3VybF8gcHJlZml4IGlzIGV4Y2x1c2l2ZWx5IHVzZWQgZm9yIGxpYnJhcnkgaW50ZXJuYWwgZ2xvYmFsCiAgc3ltYm9scy4gU3RhdGljIGZ1bmN0aW9ucyBjYW4gYmUgbmFtZWQgYW55dGhpbmcsIGV4Y2VwdCBmb3IgdXNpbmcgQ3VybF8gb3IKICBjdXJsXyBwcmVmaXhlcy4gVGhpcyBpcyBmb3IgY29uc2lzdGVuY3kgYW5kIGZvciBlYXNpZXIgbWFpbnRhaW5hbmNlIGFuZAogIG92ZXJ2aWV3LgoKLSBDbGVhbmVkIHVwIGFuZCByZWZvcm1hdHRlZCB0aGUgVE9ETyBkb2N1bWVudCB0byBsb29rIGxpa2UgdGhlIEZBUSBhbmQKICBDT05UUklCVVRFLCB3aGljaCBtYWtlcyBuaWNlciB3ZWIgcGFnZXMKCi0gQWRkZWQgdGVzdCBjYXNlcyA1NDkgYW5kIDU1MCB0aGF0IHRlc3QgQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFLgoKLSBBZGRlZCBrZXl3b3JkcyBvbiBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMKCi0gRml4ZWQgYW4gT09NIHByb2JsZW0gaW4gdGhlIGN1cmwgY29kZSB0aGF0IHdvdWxkIGxlYWQgdG8gZmNsb3NlIG9uIGEgYmFkCiAgaGFuZGxlIGFuZCBjcmFzaAoKRGFuaWVsIFMgKDUgRGVjIDIwMDcpCi0gU3BhY2VuIEphc3NldCByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBkb2luZyBQT1NUICh3aXRoIGRhdGEgcmVhZCB3aXRoIGEKICBjYWxsYmFjaykgb3ZlciBhIHByb3h5IHdoZW4gTlRMTSBpcyB1c2VkIGFzIGF1dGggd2l0aCB0aGUgcHJveHkuIFRoZSBidWcKICBhbHNvIGNvbmNlcm5lZCBEaWdlc3QgYW5kIHdhcyBsaW1pdGVkIHRvIHVzaW5nIGNhbGxiYWNrIG9ubHkuIFNwYWNlbiB3b3JrZWQKICB3aXRoIHVzIHRvIHByb3ZpZGUgYSB1c2VmdWwgcGF0Y2guIEkgYWRkZWQgdGhlIHRlc3QgY2FzZSA1NDcgYW5kIDU0OCB0bwogIHZlcmlmeSB0d28gdmFyaWF0aW9ucyBvZiBQT1NUIG92ZXIgcHJveHkgd2l0aCBOVExNLgoKRGFuaWVsIFMgKDMgRGVjIDIwMDcpCi0gUmF5IFBla293c2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzE4NDIwMjkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTg0MjAyOSkgaW4gd2hpY2ggaGUgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aXRoIFNTTCBzZXNzaW9uIGNhY2hpbmcgdGhhdCBwcmV2ZW50IGl0IGZyb20gd29ya2luZywgYW5kIHByb3ZpZGVkCiAgdGhlIGFzc29jaWF0ZWQgZml4IQoKLSBOb3cgbGliY3VybCAoYnVpbHQgd2l0aCBPcGVuU1NMKSBkb2Vzbid0IHJldHVybiBlcnJvciBhbnltb3JlIGlmIHRoZSByZW1vdGUKICBTU0wtYmFzZWQgc2VydmVyIGRvZXNuJ3QgcHJlc2VudCBhIGNlcnRpZmljYXRlIHdoZW4gdGhlIHJlcXVlc3QgaXMgdG9sZCB0bwogIGlnbm9yZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW55d2F5LgoKLSBNaWNoYWwgTWFyZWsgaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZX1RSQU5TRkVSX01PREUgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sCiAgdGhlIGFwcGVuZGluZyBvZiB0aGUgInR5cGU9IiB0aGluZyBvbiBGVFAgVVJMcyB3aGVuIHRoZXkgYXJlIHBhc3NlZCB0byBhCiAgSFRUUCBwcm94eS4gU29tZSBwcm94aWVzIGp1c3QgZG9uJ3QgbGlrZSB0aGF0IGFwcGVuZGluZyAod2hpY2ggaXMgZG9uZQogIHVuY29uZGl0aW9uYWxseSBpbiA3LjE3LjEpLCBhbmQgc29tZSBwcm94aWVzIHRyZWF0IGJpbmFyeS9hc2NpaSB0cmFuc2ZlcnMKICBiZXR0ZXIgd2l0aCB0aGUgYXBwZW5kaW5nIGRvbmUhCgpEYW5pZWwgUyAoMjkgTm92IDIwMDcpCi0gQSBidWcgcmVwb3J0IG9uIHRoZSBjdXJsLWxpYnJhcnkgbGlzdCBzaG93ZWQgYSBIVFRQIERpZ2VzdCBzZXNzaW9uIGdvaW5nIG9uCiAgd2l0aCBhIDcwMCsgbGV0dGVyIG5vbmNlLiBQcmV2aW91c2x5IGxpYmN1cmwgb25seSBzdXBwb3J0IDEyNyBsZXR0ZXIgb25lcwogIGFuZCBub3cgSSBidW1wZWQgaXQgdG8gMTAyMy4KCi0gRml4ZWQgdGhlIHJlc3VtZWQgRlRQIHVwbG9hZCBsb29wIHRvIG5vdCByZXF1aXJlIHRoYXQgdGhlIHJlYWQgY2FsbGJhY2sKICByZXR1cm5zIGEgZnVsbCBidWZmZXIgb24gZWFjaCBpbnZva2UuCgpEYW5pZWwgUyAoMjUgTm92IDIwMDcpCi0gQWRkZWQgdGVzdCBjYXNlIDEwMTUgdGhhdCB0ZXN0cyAtLWRhdGEtdXJsZW5jb2RlIGluIG11bHRpcGxlIHdheXMKCi0gRml4ZWQgLS1kYXRhLXVybGVuY29kZSBmb3Igd2hlbiBubyBAIG9yID0gYXJlIHVzZWQKCi0gRXh0ZW5kZWQgdGhlIHVzZXItYWdlbnQgYnVmZmVyIGN1cmwgdXNlcywgc2luY2Ugd2UgY2FuIGhpdCB0aGUgMTI4IGJ5dGUKICBib3JkZXIgd2l0aCBwbGVudHkgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIHVzZWQuIExpa2UgbXkgY3VycmVudCBzZXQ6ICJjdXJsCiAgNy4xNy4yLUNWUyAoaTY4Ni1wYy1saW51eC1nbnUpIGxpYmN1cmwvNy4xNy4yLUNWUyBPcGVuU1NMLzAuOS44ZwogIHpsaWIvMS4yLjMuMyBjLWFyZXMvMS41LjItQ1ZTIGxpYmlkbi8xLjEgbGlic3NoMi8wLjE5LjAtQ1ZTIgoKRGFuaWVsIFMgKDI0IE5vdiAyMDA3KQotIEludGVybmFsIHJlYXJyYW5nZW1lbnRzLCBzbyB0aGF0IHRoZSBwcmV2aW91cyBzdHJ1Y3QgSGFuZGxlRGF0YSBpcyBubyBtb3JlLgogIEl0IGlzIG5vdyBrbm93biBhcyBTaW5nbGVSZXF1ZXN0IGFuZCB0aGUgQ3VybF90cmFuc2Zlcl9rZWVwZXIgc3RydWN0IHdpdGhpbgogIHRoYXQgd2FzIHJlbW92ZSBlbnRpcmVseS4gVGhpcyBoYXMgdGhlIHVwc2lkZSB0aGF0IHRoZXJlIGFyZSBsZXNzIGR1cGxpY2F0ZQogIHN0cnVjdCBtZW1iZXJzIHRoYXQgbWFkZSBpdCBoYXJkIHRvIHNlZSBhbmQgcmVtZW1iZXIgd2hhdCBzdHJ1Y3QgdGhhdCB3YXMKICB1c2VkIHRvIHN0b3JlIHdoYXQgZGF0YS4gVGhlIHRyYW5zZmVyX2tlZXBlciB0aGluZyB3YXMgb25jZSBzdG9yZWQgb24gYQogIHBlci1jb25uZWN0aW9uIGJhc2lzIGFuZCB0aGVuIGl0IG1hZGUgc2Vuc2UgdG8gaGF2ZSB0aGUgZHVwbGljYXRlIGluZm8gYnV0CiAgc2luY2UgaXQgd2FzIG1vdmVkIHRvIHRoZSBTZXNzaW9uSGFuZGxlIChpbiA3LjE2LjApIGl0IGp1c3QgYWRkZWQgd2VpcmRuZXNzLgogIFRoZSBTaW5nbGVSZXF1ZXN0IHN0cnVjdCBpcyB1c2VkIGJ5IGRhdGEgdGhhdCBvbmx5IGlzIHZhbGlkIGZvciB0aGlzIHNpbmdsZQogIHJlcXVlc3QuCgpZYW5nIFRzZSAoMjIgTm92IDIwMDcpCi0gUHJvdmlkZSBhIHNvY2tsZW5fdCBkZWZpbml0aW9uIGluIGN1cmwuaCBmb3IgV2luMzIgQVBJIGJ1aWxkIHRhcmdldHMKICB3aGljaCBkb24ndCBoYXZlIG9uZS4KCkRhbmllbCBTICgyMiBOb3YgMjAwNykKLSBBbGVzc2FuZHJvIFZlc2VseSBoZWxwZWQgbWUgaW1wcm92ZSB0aGUgLS1kYXRhLXVybGVuY29kZSdzIHN5bnRheCwgcGFyc2VyCiAgYW5kIGRvY3VtZW50YXRpb24uCgpEYW5pZWwgUyAoMjEgTm92IDIwMDcpCi0gV2hpbGUgaW5zcGVjdGluZyB0aGUgTmVnb3RpYXRlIGNvZGUsIEkgbm90aWNlZCBob3cgdGhlIHByb3h5IGF1dGggd2FzIHVzaW5nCiAgdGhlIHNhbWUgc3RhdGUgc3RydWN0IGFzIHRoZSBob3N0IGF1dGgsIHNvIGJvdGggY291bGQgbmV2ZXIgYmUgdXNlZCBhdCB0aGUKICBzYW1lIHRpbWUhIEkgZml4ZWQgaXQgKHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGVjaykgdG8gdXNlIHR3byBzZXBhcmF0ZQogIHN0cnVjdHMgdG8gYWxsb3cgYXV0aGVudGljYXRpb24gdXNpbmcgTmVnb3RpYXRlIG9uIGhvc3QgYW5kIHByb3h5CiAgc2ltdWx0YW5lb3VzbHkuCgpEYW5pZWwgUyAoMjAgTm92IDIwMDcpCi0gRW1pbCBSb21hbnVzIHBvaW50ZWQgb3V0IGEgYnVnIHRoYXQgbWFkZSBhbiBlYXN5IGhhbmRsZSBnZXQgdGhlIGNvb2tpZQogIGVuZ2luZSBhY3RpdmF0ZWQgd2hlbiBzZXQgdG8gdXNlIGEgc2hhcmUgKGV2ZW4gaWYgdGhlIHNoYXJlIGRvZXNuJ3Qgc2hhcmUKICBjb29raWVzKS4gSSBmaXhlZCBpdC4KCi0gRml4ZWQgYSB2ZXJ5IGxvbmctbGFzdGluZyBtcHJpbnRmKCkgYnVnIHRoYXQgb2NjdXJyZWQgd2hlbiB3ZSBkaWQgIiUuKnMlcyIsCiAgc2luY2UgdGhlIHNlY29uZCAlcyB3b3VsZCB0aGVuIHdyb25nbHkgdXNlZCB0aGUgbnVtZXJpY2FsIHByZWNpc2lvbiBhcmd1bWVudAogIGluc3RlYWQgYW5kIGNyYXNoLgoKLSBJbnRyb2R1Y2VkIC0tZGF0YS11cmxlbmNvZGUgdG8gdGhlIGN1cmwgdG9vbCBmb3IgZWFzaWVyIHVybCBlbmNvZGluZyBvZiB0aGUKICBkYXRhIHNlbnQgaW4gYSBwb3N0LgoKRGFuaWVsIFMgKDE4IE5vdiAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGZpeGVkIFNTTCBjb25uZWN0aW9ucyB3aXRoIE5TUyBkb25lIHdpdGggdGhlIG11bHRpLWludGVyZmFjZQoKRGFuaWVsIFMgKDE3IE5vdiAyMDA3KQotIE1pY2hhbCBNYXJlayBtYWRlIHRoZSB0ZXN0IHN1aXRlIHJlbWVtYmVyIHdoYXQgdGVzdCBzZXJ2ZXJzIHRoYXQgZmFpbCB0bwogIHN0YXJ0IHNvIHRoYXQgc3Vic2VxdWVudCB0cmllcyBhcmUgc2ltcGx5IHNraXBwZWQuCgotIEFuZHJlcyBHYXJjaWEgbWFkZSB0aGUgZXhhbXBsZXMgYnVpbGQgZmluZSBvbiBXaW5kb3dzIChtaW5ndyArIG1zeXMpIHdoZW4KICB0aGUgbGliIHdhcyBidWlsdCBzdGF0aWNseS4KCkRhbmllbCBTICgxNiBOb3YgMjAwNykKLSBBdGVzIEdvcmFsIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGh0dHAuYzphZGRfYnVmZmVyX3NlbmQoKSB3aGVuIGEgZGVidWcKICBjYWxsYmFjayB3YXMgdXNlZCwgYXMgaXQgY291bGQgd3JvbmdseSBwYXNzIG9uIGEgYmFkIHNpemUgZm9yIHRoZSBvdXRnb2luZwogIEhUVFAgaGVhZGVyLiBUaGUgYmFkIHNpemUgd291bGQgYmUgYSB2ZXJ5IGxhcmdlIHZhbHVlIGFzIGl0IHdhcyBhIHdyYXBwZWQKICBzaXplX3QgY29udGVudC4gVGhpcyBoYXBwZW5lZCB3aGVuIHRoZSB3aG9sZSBIVFRQIHJlcXVlc3QgZmFpbGVkIHRvIGdldCBzZW50CiAgaW4gb25lIHNpbmdsZSBzZW5kLiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTExLzAxNjUuaHRtbAoKRGFuaWVsIFMgKDE1IE5vdiAyMDA3KQotIEZpeGVkIHlldCBhbm90aGVyIHJlbWFpbmluZyBwcm9ibGVtIHdpdGggZG9pbmcgU0ZUUCBkaXJlY3RvcnkgbGlzdGluZ3Mgb24gYQogIHJlLXVzZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBNZW50aW9uZWQgYnkgSW1tYW51ZWwgR3JlZ29pcmUgb24gdGhlIG1haWxpbmcKICBsaXN0LgoKLSBNaWNoYWwgTWFyZWsgZml4ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gYmV0dGVyIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVuIHRoZSBIVFRQCiAgaXB2NiBzZXJ2ZXIgY2FuJ3QgcnVuLgoKWWFuZyBUc2UgKDE0IE5vdiAyMDA3KQotIEZpeCBhIHZhcmlhYmxlIHBvdGVudGlhbCB3cmFwcGluZyBpbiBhZGRfYnVmZmVyKCkgd2hlbiB1c2luZyBhYnNvbHV0ZWx5CiAgaHVnZSBzZW5kIGJ1ZmZlciBzaXplcy4KCkRhbmllbCBTICgxMyBOb3YgMjAwNykKLSBGaXhlZCBhIHJlbWFpbmluZyBwcm9ibGVtIHdpdGggZG9pbmcgU0ZUUCBkaXJlY3RvcnkgbGlzdGluZ3Mgb24gYSByZS11c2VkCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBNZW50aW9uZWQgYnkgSW1tYW51ZWwgR3JlZ29pcmUgb24gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCBTICgxMiBOb3YgMjAwNykKLSBCdWcgcmVwb3J0ICMxODMwNjM3IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODMwNjM3KSwgd2hpY2ggd2FzCiAgZm9yd2FyZGVkIGZyb20gdGhlIEdlbnRvbyBidWcgdHJhY2tlciBieSBEYW5pZWwgQmxhY2sgYW5kIHdhcyBvcmlnaW5hbGx5CiAgc3VibWl0dGVkIGJ5IFJvYmluIEpvaG5zb24sIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3b3VsZCBkbyBiYWQgbWVtb3J5CiAgcmVmZXJlbmNlcyB3aGVuIGl0IGZhaWxlZCBhbmQgYmFpbGVkIG91dCBiZWZvcmUgdGhlIGhhbmRsZXIgdGhpbmcgd2FzCiAgc2V0dXAuIE15IGZpeCBpcyBub3QgZG9uZSBsaWtlIHRoZSBwcm92aWRlZCBwYXRjaCBkb2VzIGl0LCBidXQgaW5zdGVhZCBJCiAgbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBuZXZlciBhbnkgY2hhbmNlIGZvciBhIE5VTEwgcG9pbnRlciBpbiB0aGF0IHN0cnVjdAogIG1lbWJlci4KCllhbmcgVHNlICgxMCBOb3YgMjAwNykKLSBWaWtyYW0gU2F4ZW5hIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDctMTEvMDA5Ni5odG1sKSBwb2ludGVkIG91dAogIHRoYXQgdGhlIHBvbGxmZCBzdHJ1Y3Qgd2FzIGJlaW5nIG11bHRpIGRlZmluZWQgd2hlbiB1c2luZyBWUzIwMDguIFRoaXMgaXMKICBub3cgZml4ZWQgaW4gL2N1cmwvbGliL3NlbGVjdC5oCgpEYW5pZWwgUyAoOCBOb3YgMjAwNykKLSBCdWcgcmVwb3J0ICMxODIzNDg3IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODIzNDg3KSBwb2ludGVkCiAgb3V0IHRoYXQgU0ZUUCByZXF1ZXN0cyBkaWRuJ3QgdXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIE5laXRoZXIgZGlkIFNDUAogIG9uZXMuICBJIGdhdmUgdGhlIFNTSCBjb2RlIGEgZ29vZCBiZWF0aW5nIGFuZCBub3cgYm90aCBTQ1AgYW5kIFNGVFAgc2hvdWxkCiAgdXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgZmluZS4gSSBhbHNvIGRpZCBhIGJ1bmNoIG9mIGluZGVudCBjaGFuZ2VzIGFzCiAgd2VsbCBhcyBhIGJ1ZyBmaXggZm9yIHRoZSAia2V5Ym9hcmQgaW50ZXJhY3RpdmUiIGF1dGguCgpEYW4gRiAoNiBOb3YgMjAwNykKLSBJbXByb3ZlZCB0ZWxuZXQgc3VwcG9ydCBieSBkcmFzdGljYWxseSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHdyaXRlCiAgY2FsbGJhY2tzIG5lZWRlZCB0byBwYXNzIGEgYnVmZmVyIHRvIHRoZSB1c2VyLiAgSW5zdGVhZCBvbmUgcGVyIGJ5dGUgaXQKICBpcyBub3cgYXMgbGl0dGxlIGFzIG9uZSBwZXIgc2VnbWVudC4KCllhbmcgVHNlICg2IE5vdiAyMDA3KQotIEJ1ZyByZXBvcnQgIzE4MjQ4OTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE4MjQ4OTQpIHBvaW50ZWQKICBvdXQgYSBwcm9ibGVtIGluIGN1cmwuaCB3aGVuIGJ1aWxkaW5nIEMrKyBhcHBzIHdpdGggTVNWQy4gVG8gZml4IGl0LCB0aGUKICBpbmNsdXNpb24gb2YgaGVhZGVyIGZpbGVzIGluIGN1cmwuaCBpcyBtb3ZlZCBvdXRzaWRlIG9mIHRoZSBDKysgZXh0ZXJuICJDIgogIGxpbmthZ2UgYmxvY2suCgpEYW5pZWwgUyAoMSBOb3YgMjAwNykKLSBUb2J5IFBldGVyc29uIHBhdGNoZWQgYSBtZW1vcnkgcHJvYmxlbSBpbiB0aGUgY29tbWFuZCBsaW5lIHRvb2wgdGhhdAogIGhhcHBlbmVkIHdoZW4gYSB1c2VyIGhhZCBhIGhvbWUgZGlyIGFzIGFuIGVtcHR5IHN0cmluZy4gY3VybCB3b3VsZCB0aGVuIGRvCiAgZnJlZSgpIG9uIGEgd3JvbmcgYXJlYS4KCkRhbiBGICgxIE5vdiAyMDA3KQotIEZpeGVkIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgdG8gbm90IGRpc3BsYXkgbGlieiB3aGVuIGl0IHdhc24ndCB1c2VkCiAgZHVlIHRvIGEgbWlzc2luZyBoZWFkZXIgZmlsZS4KCkRhbiBGICgzMSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIG91dHB1dCBvZiBjdXJsLWNvbmZpZyAtLXByb3RvY29scyB3aGljaCBzaG93ZWQgU0NQIGFuZCBTRlRQCiAgYWx3YXlzLCBleGNlcHQgd2hlbiAtLXdpdGhvdXQtbGlic3NoMiB3YXMgZ2l2ZW4KCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDEzIGFuZCAxMDE0IHRvIGNoZWNrIHRoYXQgY3VybC1jb25maWcgLS1wcm90b2NvbHMgYW5kCiAgY3VybC1jb25maWcgLS1mZWF0dXJlcyBtYXRjaGVzIHRoZSBvdXRwdXQgb2YgY3VybCAtLXZlcnNpb24KCkRhbiBGICgzMCBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgYW4gT09NIHByb2JsZW0gd2l0aCBmaWxlOiBVUkxzCgotIE1vdmVkIEN1cmxfZmlsZV9jb25uZWN0IGludG8gdGhlIHByb3RvY29sIGhhbmRsZXIgc3RydWN0CgpEYW4gRiAoMjkgT2N0b2JlciAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSA1NDYgdG8gY2hlY2sgdGhhdCBzdWJzZXF1ZW50IEZUUCB0cmFuc2ZlcnMgd29yayBhZnRlciBhCiAgZmFpbGVkIG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlCgpEYW5pZWwgUyAoMjkgT2N0b2JlciAyMDA3KQotIEJhc2VkIG9uIG9uZSBvZiB0aG9zZSBidWcgcmVwb3J0cyB0aGF0IGFyZSBpbnRlcmNlcHRlZCBieSBhIGRpc3RybydzIGJ1ZwogIHRyYWNrZXIgKGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MzE2MTkxKSwgSSBub3cgbWFkZQogIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgYW5kIC0tcHJvdG9jb2xzIHNob3cgdGhlIGNvcnJlY3Qgb3V0cHV0IHdoZW4gYnVpbHQKICB3aXRoIE5TUy4KClZlcnNpb24gNy4xNy4xICgyOSBPY3RvYmVyIDIwMDcpCgpEYW4gRiAoMjUgT2N0b2JlciAyMDA3KQotIEFkZGVkIHRoZSAtLXN0YXRpYy1saWJzIG9wdGlvbiB0byBjdXJsLWNvbmZpZwoKRGFuaWVsIFMgKDI1IE9jdG9iZXIgMjAwNykKLSBNYWRlIGxpYmN1cmwgYnVpbHQgd2l0aCBOU1MgcG9zc2libGUgdG8gaWdub3JlIHRoZSBwZWVyIHZlcmlmaWNhdGlvbi4KICBQcmV2aW91c2x5IGl0IHdvdWxkIGZhaWwgaWYgdGhlIGNhIGJ1bmRsZSB3YXNuJ3QgcHJlc2VudCwgZXZlbiBpZiB0aGUgY29kZQogIGlnbm9yZWQgdGhlIHZlcmlmaWNhdGlvbiByZXN1bHRzLgoKUGF0cmljayBNICgyNSBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGVzdCBzZXJ2ZXIgdG8gYWxsb3cgbnVsbCBieXRlcyBpbiBiaW5hcnkgcG9zdHMuCl8gQWRkZWQgdGVzdHMgMzUsIDU0NCAmIDU0NSB0byBjaGVjayBiaW5hcnkgZGF0YSBwb3N0cywgYm90aCBzdGF0aWMgKGluIHBsYWNlKQogIGFuZCBkeW5hbWljIChjb3BpZWQpLgoKRGFuaWVsIFMgKDI1IE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgZml4ZWQgdGhlIHRlc3Qgc2NyaXB0IHRvIGJlIGFibGUgdG8gdXNlIHZhbGdyaW5kIGV2ZW4gd2hlbiB0aGUKICBsaWIgaXMgYnVpbHQgc2hhcmVkIHdpdGggbGlidG9vbC4KCi0gRml4ZWQgYSBmZXcgbWVtb3J5IGxlYWtzIHdoZW4gdGhlIHNhbWUgZWFzeSBoYW5kbGUgaXMgcmUtdXNlZCB0byByZXF1ZXN0CiAgVVJMcyB3aXRoIGRpZmZlcmVudCBwcm90b2NvbHMuIEZUUCBhbmQgVEZUUCByZWxhdGVkIGxlYWtzLiBDYXVnaHQgdGhhbmtzIHRvCiAgRGFuIEYncyBuZXcgdGVzdCBjYXNlcy4KCkRhbiBGICgyNCBPY3RvYmVyIDIwMDcpCi0gRml4ZWQgdGhlIHRlc3QgRlRQIGFuZCBURlRQIHNlcnZlcnMgdG8gc3VwcG9ydCB0aGUgPjEwMDAwIHRlc3QgbnVtYmVyCiAgbm90YXRpb24KCi0gQWRkZWQgdGVzdCBjYXNlcyAyMDAwIHRocm91Z2ggMjAwMyB3aGljaCB0ZXN0IG11bHRpcGxlIHByb3RvY29scyB1c2luZyB0aGUKICBzYW1lIGVhc3kgaGFuZGxlCgotIEZpeGVkIHRoZSBmaWxlY2hlY2s6IG1ha2UgdGFyZ2V0IHRvIHdvcmsgb3V0c2lkZSB0aGUgc291cmNlIHRyZWUKCkRhbmllbCBTICgyNCBPY3RvYmVyIDIwMDcpCi0gVmxhZGltaXIgTGF6YXJlbmtvIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIGRvIHNvbWUgJ210JyBtYWdpYyB3aGVuCiAgYnVpbGRpbmcgd2l0aCBWQzggdG8gZ2V0IHRoZSAibWFuaWZlc3QiIGVtYmVkZGVkIHRvIG1ha2UgZmluZSBzdGFuZC1hbG9uZQogIGJpbmFyaWVzLiBUaGUgbWFrZXRneiBhbmQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZmlsZXMgd2VyZSBhZGp1c3RlZAogIGFjY29yZGluZ2x5LgoKRGFuaWVsIFMgKDIzIE9jdG9iZXIgMjAwNykKLSBCdWcgcmVwb3J0ICMxODEyMTkwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xODEyMTkwKSBwb2ludHMgb3V0CiAgdGhhdCBsaWJjdXJsIHRyaWVkIHRvIHJlLXVzZSBjb25uZWN0aW9ucyBhIGJpdCB0b28gbXVjaCB3aGVuIHVzaW5nIG5vbi1TU0wKICBwcm90b2NvbHMgdHVubmVsZWQgb3ZlciBhIEhUVFAgcHJveHkuCgpEYW5pZWwgUyAoMjIgT2N0b2JlciAyMDA3KQotIE1pY2hhbCBNYXJlayBmb3J3YXJkZWQgdGhlIGJ1ZyByZXBvcnQKICBodHRwczovL2J1Z3ppbGxhLm5vdmVsbC5jb20vc2hvd19idWcuY2dpP2lkPTMzMjkxNyBhYm91dCBhIEhUVFAgcmVkaXJlY3QgdG8KICBGVFAgdGhhdCBjYXVzZWQgbWVtb3J5IGhhdm9jLiBIaXMgd29yayB0b2dldGhlciB3aXRoIG15IGVmZm9ydHMgY3JlYXRlZCB0d28KICBmaXhlczoKCiAgIzEgLSBGVFA6OmZpbGUgd2FzIG1vdmVkIHRvIHN0cnVjdCBmdHBfY29ubiwgYmVjYXVzZSBpcyBoYXMgdG8gYmUgZGVhbHQgd2l0aAogICAgICAgYXQgY29ubmVjdGlvbiBjbGVhbnVwLCBhdCB3aGljaCB0aW1lIHRoZSBzdHJ1Y3QgSGFuZGxlRGF0YSBjb3VsZCBiZQogICAgICAgdXNlZCBieSBhbm90aGVyIGNvbm5lY3Rpb24uCiAgICAgICBBbHNvLCB0aGUgdW51c2VkIGNoYXIgKnVybHBhdGggbWVtYmVyIGlzIHJlbW92ZWQgZnJvbSBzdHJ1Y3QgRlRQLgogCiAgIzIgLSBwcm92aWRlIGEgQ3VybF9yZXNldF9yZXFwcm90bygpIGZ1bmN0aW9uIHRoYXQgZnJlZXMKICAgICAgIGRhdGEtPnJlcWRhdGEucHJvdG8uKiBvbiBjb25uZWN0aW9uIHNldHVwIGlmIG5lZWRlZCAodGhhdCBpcyBpZiB0aGUKICAgICAgIFNlc3Npb25IYW5kbGUgd2FzIHVzZWQgYnkgYSBkaWZmZXJlbnQgY29ubmVjdGlvbikuCgogIEEgbG9uZy10ZXJtIGdvYWwgaXMgb2YgY291cnNlIHRvIHNvbWVob3cgZ2V0IHJpZCBvZiBob3cgdGhlIHJlcWRhdGEgc3RydWN0CiAgaXMgdXNlZCwgYXMgaXQgaXMgdG9vIGVycm9yLXByb25lLgogCi0gQnVnIHJlcG9ydCAjMTgxNTUzMCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTgxNTUzMCkgcG9pbnRzIG91dAogIHRoYXQgc3BlY2lmeWluZyBhIHByb3h5IHdpdGggYSB0cmFpbGluZyBzbGFzaCBkaWRuJ3Qgd29yayAodW5sZXNzIGl0IGFsc28KICBjb250YWluZWQgYSBwb3J0IG51bWJlcikuCgpQYXRyaWNrIE0gKDE1IE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgZHluYW1pYyBDVVJMT1BUX1BPU1RGSUVMRFMgcHJvYmxlbTogdGhpcyBvcHRpb24gaXMgbm93IHN0YXRpYyBhZ2FpbgogIGFuZCBvcHRpb24gQ1VSTE9QVF9DT1BZUE9TVEZJRUxEUyBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IGR5bmFtaWMgbW9kZS4KClBhdHJpY2sgTSAoMTIgT2N0b2JlciAyMDA3KQotIEFkZGVkIHBlci1wcm90b2NvbCBjYWxsYmFjayBzdGF0aWMgdGFibGVzLCByZXBsYWNpbmcgY2FsbGJhY2sgcHRyIHN0b3JhZ2UKICBpbiB0aGUgY29ubmVjdGRhdGEgc3RydWN0dXJlIGJ5IGEgc2luZ2xlIGhhbmRsZXIgdGFibGUgcHRyLgoKRGFuIEYgKDExIE9jdG9iZXIgMjAwNykKLSBGaXhlZCB0aGUgLWwgb3B0aW9uIG9mIHJ1bnRlc3RzLnBsCgotIEFkZGVkIHN1cHBvcnQgZm9yIHNraXBwaW5nIHRlc3RzIGJhc2VkIG9uIGtleSB3b3Jkcy4KCkRhbmllbCBTICg5IE9jdG9iZXIgMjAwNykKLSBNaWNoYWwgTWFyZWsgcmVtb3ZlZCB0aGUgbm8gbG9uZ2VyIGV4aXN0aW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBjdXJsLjEKICBtYW4gcGFnZS4KCkRhbmllbCBTICg3IE9jdG9iZXIgMjAwNykKLSBLbm93biBidWcgIzQ3LCB3aGljaCBjb25mdXNlZCBsaWJjdXJsIGlmIGRvaW5nIE5UTE0gYXV0aCBvdmVyIGEgcHJveHkgd2l0aAogIGEgcmVzcG9uc2UgdGhhdCB3YXMgbGFyZ2VyIHRoYW4gMTZLQiBpcyBub3cgaW1wcm92ZWQgc2xpZ2h0bHkgc28gdGhhdCBub3cKICB0aGUgcmVzdHJpY3Rpb24gYXQgMTZLQiBpcyBmb3IgdGhlIGhlYWRlcnMgb25seSBhbmQgaXQgc2hvdWxkIGJlIGEgcmFyZQogIHNpdHVhdGlvbiB3aGVyZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBleGNlZWQgMTZLQi4gVGh1cywgSSBjb25zaWRlciAjNDcgZml4ZWQKICBhbmQgdGhlIGhlYWRlciBsaW1pdGF0aW9uIGlzIG5vdyBrbm93biBhcyBrbm93biBidWcgIzQ4LgoKRGFuaWVsIFMgKDUgT2N0b2JlciAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciBtYWRlIHRoZSBDVUxST1BUX0NPT0tJRUxJU1Qgb3B0aW9uIHN1cHBvcnQgYSBuZXcgbWFnaWMKICBzdHJpbmc6ICJGTFVTSCIuIFVzaW5nIHRoYXQgd2lsbCBjYXVzZSBsaWJjdXJsIHRvIGZsdXNoIGl0cyBjb29raWVzIHRvIHRoZQogIENVUkxPUFRfQ09PS0lFSkFSIGZpbGUuCgotIFRoZSBuZXcgZmlsZSBkb2NzL2xpYmN1cmwvQUJJIGRlc2NyaWJlcyBob3cgd2UgdmlldyBBQkkgYnJlYWthZ2VzLCBzb25hbWUKICBidW1wcyBhbmQgd2hhdCB0aGUgdmVyc2lvbiBudW1iZXIncyBzaWduaWZpY2FuY2UgdG8gYWxsIHRoYXQgaXMuCgpEYW5pZWwgUyAoNCBPY3RvYmVyIDIwMDcpCi0gSSBlbmFibGVkIHRlc3QgMTAwOSBhbmQgbWFkZSB0aGUgLS1sb2NhbC1wb3J0IHVzZSBhIHdpZGUgcmFuZ2UgdG8gcmVkdWNlIHRoZQogIHJpc2sgb2YgZmFpbHVyZXMuCgotIEtpbSBSaW5uZXdpdHogcmVwb3J0ZWQgdGhhdCAtLWxvY2FsLXBvcnQgZGlkbid0IHdvcmsgd2l0aCBURlRQIHRyYW5zZmVycy4KICBUaGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHRmdHAgY29kZSBhbHdheXMgdW5jb25kaW9uYWxseSBkaWQgYSBiaW5kKCkKICB3aXRob3V0IGNhcmluZyBpZiBvbmUgYWxyZWFkeSBoYWQgYmVlbiBkb25lIGFuZCB0aGVuIGl0IGZhaWxlZC4gSSB3cm90ZSBhCiAgdGVzdCBjYXNlICgxMDA5KSB0byB2ZXJpZnkgdGhpcywgYnV0IGl0IGlzIGEgYml0IGVycm9yLXByb25lIHNpbmNlIGl0IHdpbGwKICBoYXZlIHRvIHBpY2sgYSBmaXhlZCBsb2NhbCBwb3J0IG51bWJlciBhbmQgc2luY2UgdGhlIHRlc3RzIGFyZSBydW4gb24gc28KICBtYW55IGRpZmZlcmVudCBob3N0cyBpbiBkaWZmZXJlbnQgc2l0dWF0aW9ucyBJJ2xsIGFkZCBpdCBpbiBkaXNhYmxlZCBzdGF0ZS4KCllhbmcgVHNlICgzIE9jdG9iZXIgMjAwNykKLSBGaXhlZCBpc3N1ZSByZWxhdGVkIHdpdGggdGhlIHVzZSBvZiBhcmVzX3RpbWVvdXQoKSByZXN1bHQuCgpEYW5pZWwgUyAoMyBPY3RvYmVyIDIwMDcpCi0gQWxleGV5IFBlc3Rlcm5pa292IGludHJvZHVjZWQgQ1VSTE9QVF9PUEVOU09DS0VURlVOQ1RJT04gYW5kCiAgQ1VSTE9QVF9PUEVOU09DS0VUREFUQSB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0bwogIHJlcGxhY2UgdGhlIHNvY2tldCgpIGNhbGwgdXNlZCBieSBsaWJjdXJsLiBJdCBiYXNpY2FsbHkgYWxsb3dzIHRoZSBhcHAgdG8KICBjaGFuZ2UgYWRkcmVzcywgcHJvdG9jb2wgb3Igd2hhdGV2ZXIgb2YgdGhlIHNvY2tldC4KCi0gSSByZW5hbWVkIHRoZSBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBlcnJvciBjb2RlIHRvCiAgQ1VSTEVfUEVFUl9GQUlMRURfVkVSSUZJQ0FUSU9OIChzdGFuZGFyZCBDVVJMX05PX09MRElFUyBzdHlsZSksIGFuZCBtYWRlCiAgdGhpcyByZXR1cm4gY29kZSBnZXQgdXNlZCBieSB0aGUgcHJldmlvdXMgU1NIIE1ENSBmaW5nZXJwcmludCBjaGVjayBpbiBjYXNlCiAgaXQgZmFpbHMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnJvdWdodCBieSBKb2hubnkgTHVvbmcsIGxpYmN1cmwgbm93IG9mZmVycwogIENVUkxPUFRfU1NIX0hPU1RfUFVCTElDX0tFWV9NRDUgYW5kIHRoZSBjdXJsIHRvb2wgLS1ob3N0cHVibWQ1LiBUaGV5IGJvdGgKICBtYWtlIHRoZSBTQ1Agb3IgU0ZUUCBjb25uZWN0aW9uIHZlcmlmeSB0aGUgcmVtb3RlIGhvc3QncyBtZDUgY2hlY2tzdW0gb2YgdGhlCiAgcHVibGljIGtleSBiZWZvcmUgZG9pbmcgYSBjb25uZWN0LCB0byByZWR1Y2UgdGhlIHJpc2sgb2YgYSBtYW4taW4tdGhlLW1pZGRsZQogIGF0dGFjay4KCkRhbmllbCBTICgyIE9jdG9iZXIgMjAwNykKLSBsaWJjdXJsIG5vdyBoYW5kbGVzIGNodW5rZWQtZW5jb2RlZCBDT05ORUNUIHJlc3BvbnNlcwoKRGFuaWVsIFMgKDEgT2N0b2JlciAyMDA3KQotIEFsZXggRmlzaG1hbiByZXBvcnRlZCBhIGN1cmxfZWFzeV9lc2NhcGUoKSBwcm9ibGVtIHRoYXQgd2FzIG1hZGUgdGhlCiAgZnVuY3Rpb24gZG8gd3Jvbmcgb24gYWxsIGlucHV0IGJ5dGVzIHRoYXQgYXJlID49IDB4ODAgKGRlY2ltYWwgMTI4KSBkdWUgdG8gYQogIHNpZ25lZCAvIHVuc2lnbmVkIG1pc3Rha2UgaW4gdGhlIGNvZGUuIEkgZml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSA1NDMgdG8KICB2ZXJpZnkuCgpEYW5pZWwgUyAoMjkgU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgZml4ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCB0cmFuc2ZlcnMgb3ZlciBTRlRQLgoKRGFuaWVsIFMgKDI4IFNlcHRlbWJlciAyMDA3KQotIEFkYXB0ZWQgdGhlIGMtYXJlcyBjb2RlIHRvIHRoZSBBUEkgY2hhbmdlIGMtYXJlcyAxLjUuMCBicmluZ3MgaW4gdGhlCiAgbm90aWZpZXIgY2FsbGJhY2socykuCgpEYW4gRiAoMjYgU2VwdGVtYmVyIDIwMDcpCi0gRW5hYmxlZCBhIGZldyBtb3JlIGdjYyB3YXJuaW5ncyB3aXRoIC0tZW5hYmxlLWRlYnVnLiAgUmVuYW1lZCBhIGZldwogIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3dpbmcgZ2xvYmFsIGRlY2xhcmF0aW9ucy4KCkRhbmllbCBTICgyNiBTZXB0ZW1iZXIgMjAwNykKLSBQaGlsaXAgTGFuZ2RhbGUgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1BPU1QzMDEgb3B0aW9uIGZvcgogIGN1cmxfZWFzeV9zZXRvcHQoKSB0aGF0IGFsdGVycyBob3cgbGliY3VybCBmdW5jdGlvbnMgd2hlbiBmb2xsb3dpbmcKICByZWRpcmVjdHMuIEl0IG1ha2VzIGxpYmN1cmwgb2JleSB0aGUgUkZDMjYxNiB3aGVuIGEgMzAxIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgYWZ0ZXIgYSBub24tR0VUIHJlcXVlc3QgaXMgbWFkZS4gRGVmYXVsdCBsaWJjdXJsIGJlaGF2aW91ciBpcyB0byBjaGFuZ2UKICBtZXRob2QgdG8gR0VUIGluIHRoZSBzdWJzZXF1ZW50IHJlcXVlc3QgKGxpa2UgaXQgZG9lcyBmb3IgcmVzcG9uc2UgY29kZSAzMDIKICAtIGJlY2F1c2UgdGhhdCdzIHdoYXQgbWFueS9tb3N0IGJyb3dzZXJzIGRvKSwgYnV0IHdpdGggdGhpcyBDVVJMT1BUX1BPU1QzMDEKICBvcHRpb24gZW5hYmxlZCBpdCB3aWxsIGRvIHdoYXQgdGhlIHNwZWMgc2F5cyBhbmQgZG8gdGhlIG5leHQgcmVxdWVzdCB1c2luZwogIHRoZSBzYW1lIG1ldGhvZCBhZ2Fpbi4gSS5lIGtlZXAgUE9TVCBhZnRlciAzMDEuIAoKICBUaGUgY3VybCB0b29sIGdvdCB0aGlzIG9wdGlvbiBhcyAtLXBvc3QzMDEKCiAgVGVzdCBjYXNlIDEwMTEgYW5kIDEwMTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkuCgotIE1heCBLYXRzZXYgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgbGliY3VybCBGVFAgcmVxdWVzdCB3aXRoCiAgQ1VSTE9QVF9OT0JPRFkgZW5hYmxlZCBidXQgbm90IENVUkxPUFRfSEVBREVSLCBsaWJjdXJsIHdvdWxkbid0IGRvIFRZUEUKICBiZWZvcmUgaXQgZG9lcyBTSVpFIHdoaWNoIG1ha2VzIGl0IGxlc3MgdXNlZnVsLiBJIHdhbGtlZCBvdmVyIHRoZSBjb2RlIGFuZAogIG1hZGUgaXQgZG8gdGhpcyBwcm9wZXJseSwgYW5kIGFkZGVkIHRlc3QgY2FzZSA1NDIgdG8gdmVyaWZ5IGl0LgoKRGFuaWVsIFMgKDI0IFNlcHRlbWJlciAyMDA3KQotIEltbWFudWVsIEdyZWdvaXJlIGZpeGVkIEtOT1dOX0JVR1MgIzQ0OiAtLWZ0cC1tZXRob2Qgbm9jd2QgZGlkIG5vdCBoYW5kbGUKICBVUkxzIGVuZGluZyB3aXRoIGEgc2xhc2ggcHJvcGVybHkgKGl0IHNob3VsZCBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGF0CiAgZGlyZWN0b3J5KS4gVGVzdCBjYXNlIDM1MSBicm91Z2h0IGJhY2sgYW5kIGFsc28gdGVzdCAxMDEwIHdhcyBhZGRlZC4KCkRhbmllbCBTICgyMSBTZXB0ZW1iZXIgMjAwNykKLSBNYXJrIERhdmllcyBmaXhlZCBOZWdvdGlhdGUgYXV0aGVudGljYXRpb24gb3ZlciBwcm94eSwgYW5kIGFsc28gaW50cm9kdWNlZAogIHRoZSAtLXByb3h5LW5lZ290aWF0ZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIGFsbG93IGEgdXNlciB0byBleHBsaWNpdGx5CiAgc2VsZWN0IGl0LgoKRGFuaWVsIFMgKDE5IFNlcHRlbWJlciAyMDA3KQotIFJvYiBDcml0dGVuZGVuIHByb3ZpZGVkIGFuIE5TUyB1cGRhdGUgd2l0aCB0aGUgZm9sbG93aW5nIGhpZ2hsaWdodHM6CgogIG8gSXQgbG9va3MgZm9yIHRoZSBOU1MgZGF0YWJhc2UgZmlyc3QgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFNTTF9ESVIsCiAgICB0aGVuIGluIC9ldGMvcGtpL25zc2RiLCB0aGVuIGl0IGluaXRpYWxpemVzIHdpdGggbm8gZGF0YWJhc2UgaWYgbmVpdGhlciBvZgogICAgdGhvc2UgZXhpc3QuCgogIG8gSWYgdGhlIE5TUyBQS0NTIzExIGxpYm5zcHNlbS5zbyBkcml2ZXIgaXMgYXZhaWxhYmxlIHRoZW4gUEVNIGZpbGVzIG1heSBiZQogICAgbG9hZGVkLCBpbmNsdWRpbmcgdGhlIGNhLWJ1bmRsZS4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSB0aGVuIG9ubHkKICAgIGNlcnRpZmljYXRlcyBhbHJlYWR5IGluIHRoZSBOU1MgZGF0YWJhc2UgYXJlIHVzZWQuCgogIG8gVHJpZXMgdG8gZGV0ZWN0IHdoZXRoZXIgYSBmaWxlIG9yIG5pY2tuYW1lIGlzIGJlaW5nIHBhc3NlZCBpbiBzbyB0aGUgcmlnaHQKICAgIHRoaW5nIGlzIGRvbmUKCiAgbyBBZGRlZCBhIGJpdCBvZiBjb2RlIHRvIG1ha2UgdGhlIG91dHB1dCBtb3JlIGxpa2UgdGhlIE9wZW5TU0wgbW9kdWxlLAogICAgaW5jbHVkaW5nIGRpc3BsYXlpbmcgdGhlIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIHdoZW4gY29ubmVjdGluZyBpbgogICAgdmVyYm9zZSBtb2RlCgogIG8gSW1wcm92ZWQgaGFuZGxpbmcgb2YgY2VydGlmaWNhdGUgZXJyb3JzIChleHBpcmVkLCB1bnRydXN0ZWQsIGV0YykKCiAgVGhlIGxpYm5zc3BlbS5zbyBQS0NTIzExIG1vZHVsZSBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaW4gRmVkb3JhCiAgOC9yYXdoaWRlLiBXb3JrIHdpbGwgYmUgZG9uZSBzb29uIHRvIHVwc3RyZWFtIGl0LiBUaGUgTlNTIG1vZHVsZSB3aWxsIHdvcmsKICB3aXRoIG9yIHdpdGhvdXQgaXQsIGFsbCB0aGF0IGNoYW5nZXMgaXMgdGhlIHNvdXJjZSBvZiB0aGUgY2VydGlmaWNhdGVzIGFuZAogIGtleXMuCgpEYW5pZWwgUyAoMTggU2VwdGVtYmVyIDIwMDcpCi0gSW1tYW51ZWwgR3JlZ29pcmUgcG9pbnRlZCBvdXQgdGhhdCBwdWJsaWMga2V5IFNTSCBhdXRoIGZhaWxlZCBpZiBubwogIHB1YmxpYy9wcml2YXRlIGtleSB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSB3YXMgbm8gSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwKICBhbmQgdGhlbiBpdCBkaWRuJ3QgY29udGludWUgdG8gdHJ5IHRoZSBvdGhlciBhdXRoIG1ldGhvZHMuIE5vdyBpdCB3aWxsCiAgaW5zdGVhZCB0cnkgdG8gZ2V0IHRoZSBmaWxlcyBpZF9kc2EucHViIGFuZCBpZF9kc2EgZnJvbSB0aGUgY3VycmVudAogIGRpcmVjdG9yeSBpZiBub25lIG9mIHRoZSB0d28gY29uZGl0aW9ucyB3ZXJlIG1ldC4KCkRhbiBGICgxNyBTZXB0ZW1iZXIgMjAwNykKLSBBZGRlZCBob29rcyB0byB0aGUgdGVzdCBzdWl0ZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHRlc3QgYSBjdXJsIHJ1bm5pbmcKICBvbiBhIHJlbW90ZSBob3N0LgoKLSBDaGFuZ2VkIHNvbWUgRlRQIHRlc3RzIHRvIHZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgdGhlIFBPUlQgYW5kIEVQUlQgY29tbWFuZHMKICBzZW50IGJ5IGN1cmwsIGlmIG5vdCB0aGUgYWRkcmVzc2VzIHRoZW1zZWx2ZXMuCgpEYW5pZWwgUyAoMTUgU2VwdGVtYmVyIDIwMDcpCi0gTWljaGFsIE1hcmVrIG1hZGUgbGliY3VybCBhdXRvbWF0aWNhbGx5IGFwcGVuZCAiO3R5cGU9PGF8aT4iIHdoZW4gdXNpbmcgSFRUUAogIHByb3hpZXMgZm9yIEZUUCB1cmxzLgoKLSBH/G50ZXIgS25hdWYgZml4ZWQgTERBUCBidWlsZHMgaW4gdGhlIFdpbmRvd3MgbWFrZWZpbGVzIGFuZCBmaXhlZCBMREFQdjMKICBzdXBwb3J0IG9uIFdpbmRvd3MuCgpEYW4gRiAoMTMgU2VwdGVtYmVyIDIwMDcpCi0gQWRkZWQgTERBUFMsIFNDUCBhbmQgU0ZUUCB0byBjdXJsLWNvbmZpZyAtLXByb3RvY29scy4gUmVtb3ZlZCBhbmQKICBmaXhlZCBzb21lIEFDX1NVQlNUIGNvbmZpZ3VyZSBlbnRyaWVzLgoKVmVyc2lvbiA3LjE3LjAgKDEzIFNlcHRlbWJlciAyMDA3KQoKRGFuaWVsIFMgKDEyIFNlcHRlbWJlciAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3OTI2NDkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3OTI2NDkpIHBvaW50ZWQKICBvdXQgYSBwcm9ibGVtIHdpdGggZG9pbmcgYW4gZW1wdHkgdXBsb2FkIG92ZXIgRlRQIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uLgogIEkgYWRkZWQgdGVzdCBjYXNlIDU0MSB0byByZXByb2R1Y2UgaXQgYW5kIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBJIG5vdGljZWQgd2hpbGUgd3JpdGluZyB0ZXN0IDU0MSB0aGF0IHRoZSBGVFAgY29kZSB3cm9uZ2x5IGRpZCBhIENXRCBvbiB0aGUKICBzZWNvbmQgdHJhbnNmZXIgYXMgaXQgZGlkbid0IHN0b3JlIGFuZCByZW1lbWJlciB0aGUgIiIgcGF0aCBmcm9tIHRoZQogIHByZXZpb3VzIHRyYW5zZmVyIHNvIGl0IHdvdWxkIGluc3RlYWQgQ1dEIHRvIHRoZSBlbnRyeSBwYXRoIGFzIHN0b3JlZC4gVGhpcwogIHdvcmtlZCwgYnV0IGRpZCBhIHN1cGVyZmx1b3VzIGNvbW1hbmQuIFRodXMsIHRlc3QgY2FzZSA1NDEgbm93IGFsc28gdmVyaWZpZXMKICB0aGlzIGZpeC4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDA3IHRvIHRlc3QgcGVybWlzc2lvbiBwcm9ibGVtIHdoZW4gdXBsb2FkaW5nIHdpdGggVEZUUAogICh0byB2YWxpZGF0ZSBidWcgIzE3OTA0MDMpLgoKLSBURlRQIG5vdyByZXBvcnRzIHRoZSAibm90IGRlZmluZWQiIFRGVFAgZXJyb3IgY29kZSAwIGFzIGFuIGVycm9yLAogIG5vdCBzdWNjZXNzLgoKRGFuaWVsIFMgKDUgU2VwdGVtYmVyIDIwMDcpCi0gQ29udGludWVkIHRoZSB3b3JrIG9uIGEgZml4IGZvciAjMTc3OTA1NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KS4gTXkgcHJldmlvdXMgZml4IGZyb20gQXVndXN0CiAgMjQgd2FzIG5vdCBjb21wbGV0ZSAoZWl0aGVyKSBidXQgY291bGQgYWNjaWRlbnRhbGx5ICJmb3JnZXQiIHBhcnRzIG9mIGEKICBzZXJ2ZXIgcmVzcG9uc2Ugd2hpY2ggbGVkIHRvIGZhdWx0eSBzZXJ2ZXIgcmVzcG9uc2UgdGltZS1vdXQgZXJyb3JzLgoKRGFuIEYgKDUgU2VwdGVtYmVyIDIwMDcpCi0gTWluaXggZG9lc24ndCBzdXBwb3J0IGdldHNvY2tvcHQgb24gVURQIHNvY2tldHMgb3Igc2VuZC9yZWN2IG9uIFRDUAogIHNvY2tldHMuCgpEYW4gRiAoMzEgQXVndXN0IDIwMDcpCi0gTWFkZSBzb21lIG9mIHRoZSBlcnJvciBzdHJpbmdzIHJldHVybmVkIGJ5IHRoZSAqc3RyZXJyb3IgZnVuY3Rpb25zIG1vcmUKICBnZW5lcmljLCBhbmQgbW9yZSBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KCi0gUmVuYW1lZCB0aGUgY3VybF9mdHBzc2wgZW51bSB0byBjdXJsX3VzZXNzbCBhbmQgaXRzIGVudW1lcmF0ZWQgY29uc3RhbnRzLAogIGNyZWF0aW5nIG1hY3JvcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKCiAgICBDVVJMRlRQU1NMX05PTkUgPT4gQ1VSTFVTRVNTTF9OT05FCiAgICBDVVJMRlRQU1NMX1RSWSA9PiBDVVJMVVNFU1NMX1RSWQogICAgQ1VSTEZUUFNTTF9DT05UUk9MID0+IENVUkxVU0VTU0xfQ09OVFJPTAogICAgQ1VSTEZUUFNTTF9BTEwgPT4gQ1VSTFVTRVNTTF9BTEwKICAgIENVUkxGVFBTU0xfTEFTVCA9PiBDVVJMVVNFU1NMX0xBU1QKCkRhbiBGICgzMCBBdWd1c3QgMjAwNykKLSBSZW5hbWVkIHNldmVyYWwgbGliY3VybCBlcnJvciBjb2RlcyBhbmQgb3B0aW9ucyB0byBtYWtlIHRoZW0gbW9yZSBnZW5lcmFsCiAgYW5kIGFsbG93IHJldXNlIGJ5IG11bHRpcGxlIHByb3RvY29scy4gU2V2ZXJhbCB1bnVzZWQgZXJyb3IgY29kZXMgd2VyZQogIHJlbW92ZWQuICBJbiBhbGwgY2FzZXMsIG1hY3JvcyB3ZXJlIGFkZGVkIHRvIHByZXNlcnZlIHNvdXJjZSAoYW5kIGJpbmFyeSkKICBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBuYW1lcy4gIFRoZXNlIG1hY3JvcyBhcmUgc3ViamVjdCB0byByZW1vdmFsIGF0CiAgYSBmdXR1cmUgZGF0ZSwgYnV0IHByb2JhYmx5IG5vdCBiZWZvcmUgMjAwOS4gIEFuIGFwcGxpY2F0aW9uIGNhbiBiZQogIHRlc3RlZCB0byBzZWUgaWYgaXQgaXMgdXNpbmcgYW55IG9ic29sZXRlIGNvZGUgYnkgY29tcGlsaW5nIGl0IHdpdGggdGhlCiAgQ1VSTF9OT19PTERJRVMgbWFjcm8gZGVmaW5lZC4KCiAgVGhlIGZvbGxvd2luZyB1bnVzZWQgZXJyb3IgY29kZXMgd2VyZSByZW1vdmVkOgoKICAgIENVUkxFX0JBRF9DQUxMSU5HX09SREVSCiAgICBDVVJMRV9CQURfUEFTU1dPUkRfRU5URVJFRAogICAgQ1VSTEVfRlRQX0NBTlRfUkVDT05ORUNUCiAgICBDVVJMRV9GVFBfQ09VTEROVF9HRVRfU0laRQogICAgQ1VSTEVfRlRQX0NPVUxETlRfU0VUX0FTQ0lJCiAgICBDVVJMRV9GVFBfVVNFUl9QQVNTV09SRF9JTkNPUlJFQ1QKICAgIENVUkxFX0ZUUF9XRUlSRF9VU0VSX1JFUExZCiAgICBDVVJMRV9GVFBfV1JJVEVfRVJST1IKICAgIENVUkxFX0xJQlJBUllfTk9UX0ZPVU5ECiAgICBDVVJMRV9NQUxGT1JNQVRfVVNFUgogICAgQ1VSTEVfT0JTT0xFVEUKICAgIENVUkxFX1NIQVJFX0lOX1VTRQogICAgQ1VSTEVfVVJMX01BTEZPUk1BVF9VU0VSCgogIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgd2VyZSByZW5hbWVkOgoKICAgIENVUkxFX0ZUUF9BQ0NFU1NfREVOSUVEID0+ICAgICAgQ1VSTEVfUkVNT1RFX0FDQ0VTU19ERU5JRUQKICAgIENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9CSU5BUlkgPT4gQ1VSTEVfRlRQX0NPVUxETlRfU0VUX1RZUEUKICAgIENVUkxFX0ZUUF9TU0xfRkFJTEVEID0+ICAgICAgICAgQ1VSTEVfVVNFX1NTTF9GQUlMRUQKICAgIENVUkxFX0ZUUF9RVU9URV9FUlJPUiA9PiAgICAgICAgQ1VSTEVfUVVPVEVfRVJST1IKICAgIENVUkxFX1RGVFBfRElTS0ZVTEwgPT4gICAgICAgICAgQ1VSTEVfUkVNT1RFX0RJU0tfRlVMTAogICAgQ1VSTEVfVEZUUF9FWElTVFMgPT4gICAgICAgICAgICBDVVJMRV9SRU1PVEVfRklMRV9FWElTVFMKICAgIENVUkxFX0hUVFBfUkFOR0VfRVJST1IgPT4gICAgICAgQ1VSTEVfUkFOR0VfRVJST1IgCgogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0QgPT4gQ1VSTE9QVF9LRVlQQVNTV0QgCiAgICBDVVJMT1BUX0ZUUEFQUEVORCA9PiAgICBDVVJMT1BUX0FQUEVORAogICAgQ1VSTE9QVF9GVFBMSVNUT05MWSA9PiAgQ1VSTE9QVF9ESVJMSVNUT05MWQogICAgQ1VSTE9QVF9GVFBfU1NMID0+ICAgICAgQ1VSTE9QVF9VU0VfU1NMCgogIEEgZmV3IG1vcmUgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2Ugd2l0aCB0aGUgbmV4dCBTT05BTUUgYnVtcCBvZiB0aGUKICBsaWJyYXJ5LiAgVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gZG9jcy9UT0RPCgotIERvY3VtZW50ZWQgc29tZSBuZXdlciBlcnJvciBjb2RlcyBpbiBsaWJjdXJsLWVycm9yKDMpCgotIEFkZGVkIG1vcmUgYWNjdXJhdGUgZXJyb3IgY29kZSByZXR1cm5zIGZyb20gU0ZUUCBvcGVyYXRpb25zLiAgQWRkZWQgdGVzdAogIGNhc2UgNjE1IHRvIHRlc3QgYW4gU0ZUUCB1cGxvYWQgZmFpbHVyZS4KCkRhbiBGICgyOCBBdWd1c3QgMjAwNykKLSBTb21lIG1pbm9yIGludGVybmFsIHR5cGUgYW5kIGNvbnN0IGNoYW5nZXMgYmFzZWQgb24gYSBzcGxpbnQgc2Nhbi4KCkRhbmllbCBTICgyNCBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIGxhcmdlIHJlc3BvbnNlcyBmcm9tIHNlcnZlciBjb21tYW5kcywgd2hlbgogIHRoZSBzaW5nbGUgcmVzcG9uc2Ugd2FzIGNvbnNpc3Rpbmcgb2YgbXVsdGlwbGUgbGluZXMgYnV0IG9mIGEgdG90YWwgc2l6ZSBvZgogIDE2S0Igb3IgbW9yZS4gRGFuIEZhbmRyaWNoIGltcHJvdmVkIHRoZSBmdHAgdGVzdCBzY3JpcHQgYW5kIHByb3ZpZGVkIHRlc3QKICBjYXNlIDEwMDYgdG8gcmVwZWF0IHRoZSBwcm9ibGVtLCBhbmQgSSBmaXhlZCB0aGUgY29kZSB0byBtYWtlIHN1cmUgdGhpcyBuZXcKICB0ZXN0IGNhc2UgcnVucyBmaW5lLgoKUGF0cmljayBNICgyMyBBdWd1c3QgMjAwNykKLSBPUy80MDAgcG9ydDogbmV3IGZpbGVzIGxpYi9jb25maWctb3M0MDAuaCBsaWIvc2V0dXAtb3M0MDAuaCBwYWNrYWdlcy9PUzQwMC8qLgogIFNlZSBwYWNrYWdlcy9PUzQwMC9SRUFETUUuT1M0MDAuCgpEYW5pZWwgUyAoMjMgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTc1MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTc1MSkgcG9pbnRlZAogIG91dCB0aGF0IGRvaW5nIGZpcnN0IGEgZmlsZTovLyB1cGxvYWQgYW5kIHRoZW4gYW4gRlRQIHVwbG9hZCBjcmFzaGVkIGxpYmN1cmwKICBvciBhdCBiZXN0IGNhdXNlZCBmdXJpb3VzIHZhbGdyaW5kIGNvbXBsYWludHMuIEZpeGVkIG5vdyEKCkRhbmllbCBTICgyMiBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIHZlcnkgbG9uZyAoPjE2SykgRlRQIHNlcnZlciByZXNwb25zZSBsaW5lcwogIHByb3Blcmx5LiBTdGFydGluZyBub3csIGxpYmN1cmwgd2lsbCBjaG9wIHRoZW0gb2ZmICh0aHVzIHRoZSBjbGllbnQgYXBwIHdpbGwKICBub3QgZ2V0IHRoZSBmdWxsIGxpbmUpIGJ1dCBzdXJ2aXZlIGFuZCBkZWFsIHdpdGggdGhlbSBmaW5lIG90aGVyd2lzZS4gVGVzdAogIGNhc2UgMTAwMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgUyAoMjAgQXVndXN0IDIwMDcpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBDaHJpc3RpYW4gVm9ndCwgdGhlIEZUUCBjb2RlIG5vdyBzZXRzIHRoZSB1cGNvbWluZwogIGRvd25sb2FkIHRyYW5zZmVyIHNpemUgbXVjaCBlYXJsaWVyIHRvIGJlIHBvc3NpYmxlIHRvIGdldCByZWFkIHdpdGgKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGlzIGlzIHZlcnkgbXVjaCBpbiBhCiAgc2ltaWxhciBzcGlyaXQgdG8gdGhlIEhUVFAgc2l6ZSBjaGFuZ2UgZnJvbSBBdWd1c3QgMTEgMjAwNy4KCkRhbmllbCBTICgxOCBBdWd1c3QgMjAwNykKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NzYyMzIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzMikgYWJvdXQgbGliY3VybCBjYWxsaW5nCiAgQ3VybF9jbGllbnRfd3JpdGUoKSwgcGFzc2luZyBvbiBhIGNvbnN0IHN0cmluZyB0aGF0IHRoZSBjYWxsZXIgbWF5IG5vdAogIG1vZGlmeSBhbmQgeWV0IGl0IGRvZXMgKG9uIHNvbWUgcGxhdGZvcm1zKS4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzc2MjM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzYyMzUpIGFib3V0IGZ0cCByZXF1ZXN0cyB3aXRoIE5PQk9EWQogIG9uIGEgZGlyZWN0b3J5IHdvdWxkIGRvIGEgIlNJWkUgKG51bGwpIiByZXF1ZXN0LiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdAogIGNhc2UgMTAwMCB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsIFMgKDE3IEF1Z3VzdCAyMDA3KQotIFNvbmcgTWEgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGN1cmVzIGEgcHJvYmxlbSBsaWJjdXJsIGhhcyB3aGVuIGRvaW5nIHJlc3VtZQogIEhUVFAgUFVUIHVzaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gVGVzdCBjYXNlIDUzMjAgYW5kIDUzMjIgd2VyZSBhbHNvCiAgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsIFMgKDE0IEF1Z3VzdCAyMDA3KQotIEFuZHJldyBXYW5zaW5rIHByb3ZpZGVkIGFuIE5UTE0gYnVnZml4OiBpbiB0aGUgY2FzZSB0aGUgc2VydmVyIHNldHMgdGhlIGZsYWcKICBOVExNRkxBR19ORUdPVElBVEVfVU5JQ09ERSwgd2UgbmVlZCB0byBmaWx0ZXIgaXQgb2ZmIGJlY2F1c2UgbGliY3VybCBkb2Vzbid0CiAgVU5JQ09ERSBlbmNvZGUgdGhlIHN0cmluZ3MgaXQgcGFja3MgaW50byB0aGUgTlRMTSBhdXRoZW50aWNhdGUgcGFja2V0LgoKRGFuaWVsIFMgKDExIEF1Z3VzdCAyMDA3KQotIEFsbGVuIFB1bHNpZmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHNldCB0aGUgZXhwZWN0ZWQgZG93bmxvYWQKICBzaXplIGVhcmxpZXIgd2hlbiBkb2luZyBIVFRQIGRvd25sb2Fkcywgc28gdGhhdCBhcHBsaWNhdGlvbnMgYW5kIHRoZQogIHByb2dyZXNzIG1ldGVyIGV0YyBrbm93IGdldCB0aGUgaW5mbyBlYXJsaWVyIGluIHRoZSBmbG93IHRoYW4gYmVmb3JlLgoKLSBQYXRyaWNrIE1vbm5lcmF0IG1vZGlmaWVkIHRoZSBMREFQIGNvZGUgYW5kIGFwcHJvYWNoIGluIGN1cmwuIFN0YXJ0aW5nIG5vdywKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjaGVja3MgZm9yIG9wZW5sZGFwIGFuZCBmcmllbmRzIGFuZCB3ZSBsaW5rIHdpdGggdGhvc2UKICBsaWJzIGp1c3QgbGlrZSB3ZSBsaW5rIGFsbCBvdGhlciB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMsIGFuZCB3ZSBubyBsb25nZXIKICBkbG9wZW4oKSB0aG9zZSBsaWJyYXJpZXMuIE91ciBwcml2YXRlIGhlYWRlciBmaWxlIGxpYi9sZGFwLmggd2FzIHJlbmFtZWQgdG8KICBsaWIvY3VybF9sZGFwLmggZHVlIHRvIHRoaXMuIEkgc2V0IGEgdGFnIGluIENWUyAoY3VybC03XzE3XzAtcHJlbGRhcGZpeCkKICBqdXN0IGJlZm9yZSB0aGlzIGNvbW1pdCwganVzdCBpbiBjYXNlLgoKRGFuIEYgKDggQXVndXN0IDIwMDcpCi0gU29uZyBNYSBub3RlZCBhIHpsaWIgbWVtb3J5IGxlYWsgaW4gdGhlIGlsbGVnYWwgY29tcHJlc3NlZCBoZWFkZXIKICBjb3VudGVybWVhc3VyZXMgY29kZSBwYXRoLgoKRGFuaWVsIFMgKDQgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBmaXhlZCBjdXJsX2Vhc3lfZXNjYXBlKCkgYW5kIGN1cmx4X3N0cnRvbGwoKSB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHN5c3RlbXMuCgpEYW5pZWwgUyAoMyBBdWd1c3QgMjAwNykKLSBJIGN1dCBvdXQgc3VwcG9ydCBmb3IgbGlic3NoMiB2ZXJzaW9ucyBvbGRlciB0aGFuIDAuMTYgdG8gbWFrZSBvdXIgY29kZSBhCiAgbG90IHNpbXBsZXIsIGFuZCB0byBhdm9pZCBnZXR0aW5nIHRyb3VibGUgd2l0aCB0aGUgTElCU1NIMl9BUElOTyBkZWZpbmUKICB0aGF0IDEpIGRpZG4ndCB3b3JrIHByb3Blcmx5IHNpbmNlIGl0IHdhcyA+MzIgYml0cyBhbmQgMikgaXMgcmVtb3ZlZCBpbgogIGxpYnNzaDIgMC4xNi4uLgoKRGFuaWVsIFMgKDIgQXVndXN0IDIwMDcpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NjYzMjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc2NjMyMCkgcG9pbnRpbmcgb3V0IHRoYXQgdGhlIGxpYmN1cmwKICBjb2RlIGFjY2Vzc2VkIHR3byBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9ucyAoQ1VSTE9QVF9ETlNfQ0FDSEVfVElNRU9VVCBhbmQKICBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFKSBhcyBpbnRzIGV2ZW4gdGhvdWdoIHRoZXkncmUgZG9jdW1lbnRlZCB0byBiZQogIHBhc3NlZCBpbiBhcyBsb25ncywgYW5kIHRoYXQgbWFrZXMgYSBkaWZmZXJlbmNlIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLgoKLSBEbWl0cml5IFNlcmdleWV2IHJlcG9ydGVkIGEgcmVncmVzc2lvbjogcmVzdW1lZCBmaWxlOi8vIHRyYW5zZmVycyBicm9rZQogIGFmdGVyIDcuMTYuMi4gVGhpcyBpcyBtdWNoIGR1ZSB0byB0aGUgZGlmZmVyZW50IHRyZWF0bWVudCBmaWxlOi8vIGdldHMKICBpbnRlcm5hbGx5LCBidXQgbm93IEkgYWRkZWQgdGVzdCAyMzEgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSB0byBoYXBwZW4gYWdhaW4KICB3aXRob3V0IHVzIG5vdGljaW5nIQoKRGFuaWVsIFMgKDEgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBhbmQgSSBtb2RpZmllZCBsaWJjdXJsIHNvIHRoYXQgbm93IGl0ICpjb3BpZXMqIGFsbCBzdHJpbmdzCiAgcGFzc2VkIHRvIGl0IHdpdGggY3VybF9lYXN5X3NldG9wdCgpISBQcmV2aW91c2x5IGl0IGhhcyBhbHdheXMganVzdCByZWZlcmVkCiAgdG8gdGhlIGRhdGEsIGZvcmNpbmcgdGhlIHVzZXIgdG8ga2VlcCB0aGUgZGF0YSBhcm91bmQgdW50aWwgbGliY3VybCBpcyBkb25lCiAgd2l0aCBpdC4gVGhhdCBpcyBub3cgaGlzdG9yeSBhbmQgbGliY3VybCB3aWxsIGluc3RlYWQgY2xvbmUgdGhlIGdpdmVuCiAgc3RyaW5ncyBhbmQga2VlcCBwcml2YXRlIGNvcGllcy4gVGhpcyBpcyBhbHNvIHBhcnQgb2YgUGF0cmljayBNb25uZXJhdCdzCiAgT1MvNDAwIHBvcnQuCgogIER1ZSB0byB0aGlzIGJlaW5nIGEgc29tZXdoYXQgaW50ZXJlc3RpbmcgY2hhbmdlIEFQSSB3aXNlLCBJJ3ZlIGRlY2lkZWQgdG8KICBidW1wIHRoZSB2ZXJzaW9uIG9mIHRoZSB1cGNvbWluZyByZWxlYXNlIHRvIDcuMTcuMC4gT2xkZXIgYXBwbGljYXRpb25zIHdpbGwKICBvZiBjb3Vyc2Ugbm90IG5vdGljZSB0aGlzIGNoYW5nZSBub3IgZG8gdGhleSBoYXZlIHRvIGNhcmUsIGJ1dCBuZXcKICBhcHBsaWNhdGlvbnMgY2FuIGJlIHdyaXR0ZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KCi0gR3JlZyBNb3JzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBQT1NUaW5nIHVzaW5nIEFOWUFVVEggdG8gYSBzZXJ2ZXIKICByZXF1aXJpbmcgTlRMTSwgYW5kIGhlIHByb3ZpZGVkIHRlc3QgY29kZSBhbmQgYSB0ZXN0IHNlcnZlciBhbmQgd2Ugd29ya2VkCiAgb3V0IGEgYnVnIGZpeC4gV2UgZmFpbGVkIHRvIGNvdW50IHNlbnQgYm9keSBkYXRhIGF0IHRpbWVzLCB3aGljaCB0aGVuIGNhdXNlZAogIGludGVybmFsIGNvbmZ1c2lvbnMgd2hlbiBsaWJjdXJsIHRyaWVkIHRvIHNlbmQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgaW4gb3JkZXIKICB0byBtYWludGFpbiB0aGUgc2FtZSBjb25uZWN0aW9uIGFsaXZlLgoKRGFuaWVsIFMgKDMxIEp1bHkgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBwb2ludGVkIG91dCAoYW5kIGZpeGVkKSB0aGF0IHRoZSBub24tYmxvY2tpbmcgY2hlY2sgaW4KICBjb25maWd1cmUgbWFkZSBsaWJjdXJsIHVzZSBibG9ja2luZyBzb2NrZXRzIG9uIEFJWCA0IGFuZCA1LCB3aGlsZSB0aGF0CiAgd2Fzbid0IHRoZSBpbnRlbnRpb24uCgpEYW5pZWwgUyAoMjkgSnVseSAyMDA3KQotIEpheWVzaCBBIFNoYWggZmlsZWQgYnVnIHJlcG9ydCAjMTc1OTU0MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU5NTQyKSBpZGVudGlmeWluZyBhIHJhdGhlciBzZXJpb3VzCiAgcHJvYmxlbSB3aXRoIEZUUFM6IGxpYmN1cmwgY2xvc2VkIHRoZSBkYXRhIGNvbm5lY3Rpb24gc29ja2V0IGFuZCB0aGVuIGxhdGVyCiAgaW4gdGhlIGZsb3cgaXQgd291bGQgY2FsbCB0aGUgU1NMIGxheWVyIHRvIGRvIFNTTCBzaHV0ZG93biB3aGljaCB0aGVuIHdvdWxkCiAgdXNlIGEgc29ja2V0IHRoYXQgaGFkIGFscmVhZHkgYmVlbiBjbG9zZWQgLSBzbyBpZiB0aGUgYXBwbGljYXRpb24gaGFkIG9wZW5lZAogIGEgbmV3IG9uZSBpbiB0aGUgbWVhbiB0aW1lLCBsaWJjdXJsIGNvdWxkIHNlbmQgZ2liYmVyaXNoIHRoYXQgd2F5ISBJIHdvcmtlZAogIHdpdGggR3JlZyBaYXZlcnRuaWsgdG8gcHJvcGVybHkgZGlhZ25vc2UgYW5kIGZpeCB0aGlzLiBUaGUgZml4IGFmZmVjdHMgY29kZQogIGZvciBhbGwgU1NMIGxpYnJhcmllcyB3ZSBzdXBwb3J0LCBidXQgaXQgaGFzIG9ubHkgYmVlbiB0cnVseSB2ZXJpZmllZCB0bwogIHdvcmsgZmluZSBmb3IgdGhlIE9wZW5TU0wgdmVyc2lvbi4gVGhlIG90aGVycyBoYXZlIG9ubHkgYmVlbiBjb2RlIHJldmlld2VkLgoKRGFuaWVsIFMgKDIzIEp1bHkgMjAwNykKLSBJbXBsZW1lbnRlZCB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBzdXBwb3J0IGZvciB0aGUgT1MvNDAwIFNlY3VyZSBTb2NrZXRzIExheWVyIGxpYnJhcnkuCgpEYW4gRiAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIG9ubHkgdGhlIHBhcnRzIG9mIFBhdHJpY2sgTW9ubmVyYXQncyBPUy80MDAgcGF0Y2ggdGhhdCByZW5hbWVkCiAgc29tZSBmZXcgaW50ZXJuYWwgaWRlbnRpZmllcnMgdG8gYXZvaWQgY29uZmxpY3RzLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwgb24KICBvdGhlciBwbGF0Zm9ybXMuCgpEYW5pZWwgUyAoMjIgSnVseSAyMDA3KQotIEhUVFAgRGlnZXN0IGJ1ZyBmaXggYnkgQ2hyaXMgRmxlcmFja2VyczoKCiAgU2NlbmFyaW8KCiAgLSBQZXJmb21pbmcgYSBQT1NUIHJlcXVlc3Qgd2l0aCBib2R5CiAgLSBXaXRoIGF1dGhlbnRpY2F0aW9uIChvbmx5IERpZ2VzdCkKICAtIFJlLXVzaW5nIGEgY29ubmVjdGlvbgoKICBsaWJjdXJsIHdvdWxkIHNlbmQgYSBIVFRQIFBPU1Qgd2l0aCBhbiBBdXRob3JpemF0aW9uIGhlYWRlciBidXQgd2l0aG91dAogIGJvZHkuIE91ciBzZXJ2ZXIgd291bGQgcmV0dXJuIDQwMCBCYWQgUmVxdWVzdCBpbiB0aGF0IGNhc2UgKGJlY2F1c2UKICBhdXRoZW50aWNhdGlvbiBwYXNzZWQsIGJ1dCB0aGUgYm9keSB3YXMgZW1wdHkpLgoKICBDYXVzZQoKICAxKSBodHRwX2RpZ2VzdC5jIC0+IEN1cmxfb3V0cHV0X2RpZ2VzdAogIC0gVXBkYXRlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCAqb25seSogaWYgZC0+bm9uY2UgaXMKICBmaWxsZWQgaW4gKGFuZCBubyBlcnJvcnMpCiAgLSBhdXRocC0+ZG9uZSA9IFRSVUUgaWYgZC0+bm9uY2UgaXMgZmlsbGVkIGluCiAgMikgaHR0cC5jIC0+IEN1cmxfaHR0cAogIC0gKkFsd2F5cyogdXNlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCBpZiBub3QgTlVMTAogIDMpIGh0dHAuYyAtPiBDdXJsX2h0dHAsIEN1cmxfaHR0cF9vdXRwdXRfYXV0aAoKICBTbyB3aGF0IGhhcHBlbnMgaXMgdGhhdCBDdXJsX291dHB1dF9kaWdlc3QgY2Fubm90IHlldCB1cGRhdGUgdGhlCiAgQXV0aG9yaXphdGlvbiBoZWFkZXIgKGFsbG9jcHRyLnVzZXJwd2QpIHdoaWNoIHJlc3VsdHMgaW4gYXV0aGhvc3QtPmRvbmU9MCAtPgogIGF1dGhob3N0LT5tdWx0aT0xIC0+IGNvbm4tPmJpdHMuYXV0aG5lZyA9IFRSVUUuICBUaGUgYm9keSBpcyBub3QKICBhZGRlZC4gKkhvd2V2ZXIqLCBhbGxvY3B0ci51c2VycHdkIGlzIHN0aWxsIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgcmVxdWVzdAoKLSBBZGRlZCB0ZXN0IGNhc2UgMzU0IHRoYXQgbWFrZXMgYSBzaW1wbGUgRlRQIHJldHJpZXZhbCB3aXRob3V0IHBhc3N3b3JkLCB3aGljaAogIHZlcmlmaWVzIHRoZSBidWcgZml4IGluICMxNzU3MzI4LgoKRGFuaWVsIFMgKDIxIEp1bHkgMjAwNykKLSBUbyBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5IGluIEZUUCB0ZXN0IGNhc2VzLCBJJ3ZlIHJlbW92ZWQgdGhlIGVuZm9yY2VkIHN0YXRlcwogIGZyb20gdGhlIHRlc3Qgc2VydmVyIGNvZGUgYXMgdGhleSBzZXJ2ZWQgbm8gcmVhbCBwdXJwb3NlLiBUaGUgdGVzdCBzZXJ2ZXIKICBpcyBoZXJlIHRvIHNlcnZlIGZvciB0aGUgdGVzdCBjYXNlcywgbm90IHRvIGF0dGVtcHQgdG8gZnVuY3Rpb24gYXMgYSByZWFsCiAgc2VydmVyISBXaGlsZSBhdCBpdCwgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMTQxIHRvIGJldHRlciB0ZXN0IGFuZCB2ZXJpZnkKICBjdXJsIC1JIG9uIGEgc2luZ2xlIEZUUCBmaWxlLgoKRGFuaWVsIFMgKDIwIEp1bHkgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGZpeGVkIHRoZSBTRlRQIFBXRCBjb21tYW5kIHRvIHdvcmsuCgotIFJhbGYgUy4gRW5nZWxzY2hhbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTc1NzMyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU3MzI4KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2guIEl0CiAgdHVybnMgb3V0IHdlIGJyb2tlIGxvZ2luIHRvIEZUUCBzZXJ2ZXJzIHRoYXQgZG9uJ3QgcmVxdWlyZSAobm9yIHVuZGVyc3RhbmQpCiAgUEFTUyBhZnRlciB0aGUgVVNFUiBjb21tYW5kLiBUaGUgYnJlYWthZ2Ugd2FzIGRvbmUgYXMgcGFydCBvZiB0aGUga3JiNQogIGNvbW1pdCBzbyBhIGtyYi11c2luZyBwZXJzb24gbmVlZHMgdG8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBub3cKICB3b3JrcyBvciBpZiB3ZSBuZWVkIHRvIGZpeCBpdCAoaW4gYSBkaWZmZXJlbnQgd2F5IG9mIGNvdXJzZSkuCgpEYW4gRiAoMTcgSnVseSAyMDA3KQotIEZpeGVkIHRlc3QgY2FzZXMgNjEzIGFuZCA2MTQgYnkgaW1wcm92aW5nIHRoZSBsb2cgcG9zdHByb2Nlc3NvciB0byBoYW5kbGUKICBhIG5ldyBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXQgdGhhdCBuZXdlciBsaWJzc2gyJ3MgY2FuIHByb3ZpZGUuICBUaGlzCiAgaXMgcHJvYmFibHkgTk9UIHN1ZmZpY2llbnQgdG8gaGFuZGxlIGFsbCBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXRzIHRoYXQKICBzZXJ2ZXIncyBjYW4gcHJvdmlkZSwgYW5kIHNob3VsZCBiZSByZXZpc2l0ZWQuCgpEYW5pZWwgUyAoMTcgSnVseSAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIGEgYnVnIGluIGhvdyBsaWJzc2gyX3Nlc3Npb25fbGFzdF9lcnJvcigpIHdhcyB1c2VkLCBpbgogIHR3byBwbGFjZXMuCgotIEpvZmVsbCBHYWxsYXJkbyBwb3N0ZWQgYSBsaWJjdXJsIGxvZyB1c2luZyBGVFAgdGhhdCBleHBvc2VkIGEgYnVnIHdoaWNoIG1hZGUKICBhIGNvbnRyb2wgY29ubmVjdGlvbiB0aGF0IHdhcyBkZWVtZWQgImRlYWQiIHRvIHlldCBiZSByZS11c2VkIGluIGEgZm9sbG93aW5nCiAgcmVxdWVzdC4KCkRhbmllbCBTICgxMyBKdWx5IDIwMDcpCi0gQ29saW4gSG9nYmVuIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NTAyNzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1MDI3NCkgYW5kIHN1Ym1pdHRlZCBhIHBhdGNoIGZvciB0aGUKICBjYXNlIHdoZXJlIGxpYmN1cmwgZGlkIGEgY29ubmVjdCBhdHRlbXB0IHRvIGEgbm9uLWxpc3RlbmluZyBwb3J0IGFuZCBkaWRuJ3QKICBwcm92aWRlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nIGJhY2suCgotIERhbmllbCBDYXRlciBmaXhlczoKICAxIC0gbWFkZSAnbWFrZSB2YzgnIHdvcmsgb24gd2luZG93cy4KICAyIC0gbWFkZSBsaWJjdXJsIGl0c2VsZiBidWlsdCB3aXRoIENVUkxfTk9fT0xESUVTIGRlZmluZWQgKHdoaWNoIGRvZXNuJ3QKICAgICAgZGVmaW5lIHRoZSBzeW1ib2xzIGZvciBiYWNrd2FyZHMgc291cmNlIGNvbXBhdGliaWxpdHkpCiAgMyAtIHVwZGF0ZWQgbGliY3VybC1lcnJvcnMuMwogIDQgLSBhZGRlZCBDVVJMX0RJU0FCTEVfVEZUUCB0byBkb2NzL0lOU1RBTEwKCkRhbmllbCBTICgxMiBKdWx5IDIwMDcpCi0gTWFkZSB0aGUga3JiNSBjb2RlIGJ1aWxkIHdpdGggSGVpbWRhbCdzIEdTU0FQSSBsaWIuCgpEYW4gRiAoMTIgSnVseSAyMDA3KQotIENvbXBpbGUgbW9zdCBvZiB0aGUgZXhhbXBsZSBhcHBzIGluIGRvY3MvZXhhbXBsZXMgd2hlbiBkb2luZyBhICdtYWtlIGNoZWNrJy4KICBGaXhlZCBzb21lIGNvbXBpbGUgd2FybmluZ3MgYW5kIGVycm9ycyBpbiB0aG9zZSBleGFtcGxlcy4KCi0gUmVtb3ZlZCB0aGUgZXhhbXBsZSBwcm9ncmFtIGZ0cDNyZHBhcnR5LmMgc2luY2UgbGliY3VybCBkb2Vzbid0IHN1cHBvcnQKICAzcmQgcGFydHkgRlRQIHRyYW5zZmVycyBhbnkgbG9uZ2VyLgoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBTaG11bGlrIFJlZ2V2IGZvdW5kIGFuIChhbGJlaXQgcmFyZSkgY2FzZSB3aGVyZSB0aGUgcHJveHkgQ09OTkVDVCBvcGVyYXRpb24KICBjb3VsZCBpbiBmYWN0IGdldCBzdHVjayBpbiBhbiBlbmRsZXNzIGxvb3AuCgotIE1hZGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBzZXQgdG8gMSBhY3RzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbjoKICBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlcmUgaXMgbm8gQ29tbW9uIE5hbWUgZmllbGQgZm91bmQgaW4gdGhlIHJlbW90ZSBjZXJ0LgogIFdlIHNob3VsZCBkZXByZWNhdGUgdGhlIHN1cHBvcnQgZm9yIHRoaXMgc2V0IHRvIDEgYW55d2F5IHNvb24sIHNpbmNlIHRoZQogIGZlYXR1cmUgaXMgcG9pbnRsZXNzIGFuZCBtb3N0IGxpa2VseSBuZXZlciByZWFsbHkgdXNlZCBieSBhbnlvbmUuCgpEYW5pZWwgUyAoMTEgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYSBidWcgd2l0aCB0cmFuc2Zlci1lbmNvZGluZyBza2lwcGluZyBkdXJpbmcgdGhlIDQwNwogIGVycm9yIHBhZ2VzIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbi4KCi0gR2lhbmNhcmxvIEZvcm1pY3VjY2lhIHJlcG9ydGVkIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCBhIGNsb3NlZCBjb25uZWN0aW9uCiAgdG8gYSBwcm94eSBkdXJpbmcgQ09OTkVDVCBhdXRoIG5lZ290aWF0aW9uLgoKRGFuIEYgKDEwIEp1bHkgMjAwNykKLSBGaXhlZCBhIGN1cmwgbWVtb3J5IGxlYWsgcmVwb3J0ZWQgYnkgU29uZyBNYSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbgogIG9mIHRoZSBwYXRjaCBoZSBzdWdnZXN0ZWQuICBBZGRlZCBoaXMgdGVzdCBjYXNlIGFzIHRlc3QyODkgdG8gdmVyaWZ5LgoKLSBGb3JjZSB0aGUgdGltZSB6b25lIHRvIEdNVCBpbiB0aGUgY29va2llIHRlc3RzIGluIGNhc2UgdGhlIHVzZXIgaXMKICB1c2luZyBvbmUgb2YgdGhlIHNvLWNhbGxlZCAncmlnaHQnIHRpbWUgem9uZXMgdGhhdCB0YWtlIGludG8gYWNjb3VudAogIGxlYXAgc2Vjb25kcywgd2hpY2ggY2F1c2VzIHRoZSB0ZXN0cyB0byBmYWlsIChhcyByZXBvcnRlZCBieQogIERhbmllbCBCbGFjayBpbiBidWcgcmVwb3J0ICMxNzQ1OTY0KS4KClZlcnNpb24gNy4xNi40ICgxMCBKdWx5IDIwMDcpCgpEYW5pZWwgUyAoMTAgSnVseSAyMDA3KQotIEtlZXMgQ29vayBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA3MDcxMC5odG1sKSBpbiB3aGljaCBsaWJjdXJsIGZhaWxlZCB0bwogIHByb3Blcmx5IHJlamVjdCBzb21lIG91dGRhdGVkIG9yIG5vdCB5ZXQgdmFsaWQgc2VydmVyIGNlcnRpZmljYXRlcyB3aGVuCiAgYnVpbHQgd2l0aCBHbnVUTFMuIEtlZXMgYWxzbyBwcm92aWRlZCB0aGUgcGF0Y2guCgpKYW1lcyBIICg1IEp1bHkgMjAwNykKLSBHYXZyaWUgUGhpbGlwc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCB3aWxsIHVzZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IKICBtZXNzYWdlIGZvciBhbiBzY3A6Ly8gdXBsb2FkIGZhaWx1cmUuICBJZiBsaWJzc2gyIGhhcyBoaXMgbWF0Y2hpbmcKICBwYXRjaCwgdGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm4gYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQgaW5zdGVhZAogIG9mIGEgbW9yZSBnZW5lcmljIGVycm9yLgoKRGFuaWVsIFMgKDEgSnVseSAyMDA3KQotIFRob21hcyBKLiBNb29yZSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBLZXJiZXJvczUgc3VwcG9ydCBpbgogIGxpYmN1cmwuIFRoaXMgYWxzbyBtYWtlcyB0aGUgb3B0aW9ucyBjaGFuZ2UgbmFtZSB0byAtLWtyYiAoZnJvbSAtLWtyYjQpIGFuZAogIENVUkxPUFRfS1JCTEVWRUwgKGZyb20gQ1VSTE9QVF9LUkI0TEVWRUwpIGJ1dCB0aGUgb2xkIG5hbWVzIGFyZSBzdGlsbCAKCi0gU29uZyBNYSBoZWxwZWQgbWUgdmVyaWZ5IGFuZCBleHRlbmQgYSBmaXggZm9yIGRvaW5nIEZUUCBvdmVyIGEgU09DS1M0LzUKICBwcm94eS4KCkRhbmllbCBTICgyNyBKdW5lIDIwMDcpCi0gSmFtZXMgSG91c2xleTogQWRkIHR3byBuZXcgb3B0aW9ucyBmb3IgdGhlIFNGVFAvU0NQL0ZJTEUgcHJvdG9jb2xzOgogIENVUkxPUFRfTkVXX0ZJTEVfUEVSTVMgYW5kIENVUkxPUFRfTkVXX0RJUkVDVE9SWV9QRVJNUy4gVGhlc2UgY29udHJvbCB0aGUKICBwcmVtaXNzaW9ucyBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNyZWF0ZWQgb24gdGhlIHJlbW90ZQogIHNlcnZlci4gQ1VSTE9QVF9ORVdfRklMRV9QRVJNUyBkZWZhdWx0cyB0byAwNjQ0IGFuZAogIENVUkxPUFRfTkVXX0RJUkVDVE9SWV9QRVJNUyBkZWZhdWx0cyB0byAwNzU1CgotIEkgY29ycmVjdGVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIGFuZCBhcHBsaWVkIGEgcGF0Y2ggZm9yIGl0IGJ5IEphbWVzCiAgQnVyc2EuCgpEYW5pZWwgUyAoMjYgSnVuZSAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgcmUtYXJyYW5nZWQgdGhlIGludGVybmFsIGhhc2ggY29kZSB0byB3b3JrIHdpdGggYSBjdXN0b20KICBoYXNoIGZ1bmN0aW9uIGZvciBkaWZmZXJlbnQgaGFzaGVzLCBhbmQgYWxzbyBleHBhbmRlZCB0aGUgZGVmYXVsdCBzaXplIGZvcgogIHRoZSBzb2NrZXQgaGFzaCB0YWJsZSB1c2VkIGluIG11bHRpIGhhbmRsZXMgdG8gZ3JlYXRseSBlbmhhbmNlIHNwZWVkIHdoZW4KICB2ZXJ5IG1hbnkgY29ubmVjdGlvbnMgYXJlIGFkZGVkIGFuZCB0aGUgc29ja2V0IEFQSSBpcyB1c2VkLgoKLSBKYW1lcyBIb3VzbGV5IG1hZGUgdGhlIENVUkxPUFRfRlRQTElTVE9OTFkgbW9kZSB3b3JrIGZvciBTRlRQIGRpcmVjdG9yeQogIGxpc3RpbmdzIGFzIHdlbGwKCkRhbmllbCBTICgyNSBKdW5lIDIwMDcpCi0gQWRqdXN0ZWQgaG93IGxpYmN1cmwgdHJlYXRzIEhUVFAgMS4xIHJlc3BvbnNlcyB3aXRob3V0IGNvbnRlbnQtbGVudGggb3IKICBjaHVua2VkIGVuY29kaW5nICh0aGF0IGFsc28gbGFja3MgIkNvbm5lY3Rpb246IGNsb3NlIikuIEl0IG5vdyBzaW1wbHkKICBhc3N1bWVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gV0lMTCBiZSBjbG9zZWQgdG8gc2lnbmFsIHRoZSBlbmQsIGFzIHRoYXQgaXMgaG93CiAgUkZDMjYxNiBzZWN0aW9uIDQuNCBwb2ludCAjNSBzYXlzIHdlIHNob3VsZCBiZWhhdmUuCiAgClZlcnNpb24gNy4xNi4zICgyNSBKdW5lIDIwMDcpCgpEYW5pZWwgUyAoMjMgSnVuZSAyMDA3KQotIEFzIHJlcG9ydGVkIGJ5ICJUcm8iIGluIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTYxLmh0bWwgYW5kCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAyMzguaHRtbCwgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgZG8KICBuby1ib2R5IHJlcXVlc3RzIG9uIEZUUCBmaWxlcyBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5LCBvciBhdCBsZWFzdAogIGl0IGRpZG4ndCBwcm92aWRlIHRoZSBpbmZvIGJhY2sgaW4gdGhlIGhlYWRlciBjYWxsYmFjayBwcm9wZXJseSBpbiB0aGUKICBzdWJzZXF1ZW50IHJlcXVlc3RzLgoKRGFuaWVsIFMgKDIxIEp1bmUgMjAwNykKLSBHZXJyaXQgQnJ1Y2ho5HVzZXIgcG9pbnRlZCBvdXQgYSB3YXJuaW5nIHRoYXQgdGhlIEludGVsKFIpIFRocmVhZCBDaGVja2VyCiAgdG9vbCByZXBvcnRzIGFuZCBpdCB3YXMgaW5kZWVkIGEgbGVnaXRpbWF0ZSBvbmUgYW5kIGl0IGlzIG9uZSBmaXhlZC4gSXQgd2FzCiAgYSB1c2Ugb2YgYSBzaGFyZSB3aXRob3V0IGRvaW5nIHRoZSBwcm9wZXIgbG9ja2luZyBmaXJzdC4KICAKRGFuaWVsIFMgKDIwIEp1bmUgMjAwNykKLSBBZGFtIFBpZ2dvdHQgZmlsZWQgYnVnIHJlcG9ydCAjMTc0MDI2MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzQwMjYzKS4gQWRhbSBkaXNjb3ZlcmVkIHRoYXQgd2hlbgogIGdldHRpbmcgYSBsYXJnZSBhbW91bnQgb2YgVVJMcyB3aXRoIGN1cmwsIHRoZXkgd2VyZSBmZXRjaGVkIHNsb3dlciBhbmQKICBzbG93ZXIuLi4gd2hpY2ggdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIHRoZSAtLWxpYmN1cmwgZGF0YSBjb2xsZWN0aW5nIHdoaWNoCiAgd3JvbmdseSBhbHdheXMgd2FzIGVuYWJsZWQsIGJ1dCBubyBsb25nZXIgaXMuLi4KCkRhbmllbCBTICgxOCBKdW5lIDIwMDcpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzM5MTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzkxMDApIHRoYXQgbWVudGlvbmVkIHRoYXQgbGliY3VybAogIGNvdWxkIG5vdCBhY3R1YWxseSBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBnaXZlbiBGVFAKICBzZXJ2ZXIgaWYgdGhlIGxvZ2luIGRpcmVjdG9yeSBpc24ndCByb290LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZAogIHRocmVlIHRlc3QgY2FzZXMgKG9uZSBpcyBkaXNhYmxlZCBmb3Igbm93IHNpbmNlIEkgaWRlbnRpZmllZCBLTk9XTl9CVUdTICM0NCwKICB3ZSBjYW5ub3QgdXNlIC0tZnRwLW1ldGhvZCBub2N3ZCBhbmQgbGlzdCBmdHAgZGlyZWN0b3JpZXMpLgoKRGFuaWVsIFMgKDE0IEp1bmUgMjAwNykKLSBTaG11bGlrIFJlZ2V2OgoKICBJJ3ZlIGVuY291bnRlcmVkIChhbmQgaG9wZWZ1bGx5IGZpeGVkKSBhIHByb2JsZW0gaW52b2x2aW5nIHByb3h5IENPTk5FQ1QKICByZXF1ZXN0cyBhbmQgZWFzeSBoYW5kbGVzIHN0YXRlIG1hbmFnZW1lbnQuIFRoZSBwcm9ibGVtIGlzbid0IHNpbXBsZSB0bwogIHJlcHJvZHVjZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHNvY2tldCBzdGF0ZS4gSXQgb25seSBtYW5pZmVzdHMgaXRzZWxmIHdoZW4KICB3b3JraW5nIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuCgogIEhlcmUgaXMgdGhlIHNjZW5hcmlvOgoKICAxLiBpbiBtdWx0aV9ydW5zaW5nbGUgdGhlIGVhc3kgaGFuZGxlIGlzIGluIHRoZSBDVVJMTV9TVEFURV9XQUlUQ09OTkVDVCBhbmQKICBjYWxscyBDdXJsX3Byb3RvY29sX2Nvbm5lY3QKCiAgMi4gaW4gQ3VybF9wcm94eUNPTk5FQ1QsIGxpbmUgMTI0NywgaWYgdGhlIHNvY2tldCBpc24ndCByZWFkeSB0aGUgZnVuY3Rpb24KICByZXR1cm5zIGFuZCBjb25uLT5iaXRzLnR1bm5lbF9jb25uZWN0aW5nIGlzIFRSVUUKCiAgMy4gd2hlbiB0aGUgY2FsbCB0byBDdXJsX3Byb3RvY29sX2Nvbm5lY3QgcmV0dXJucyB0aGUgcHJvdG9jb2xfY29ubmVjdCBmbGFnCiAgaXMgZmFsc2UgYW5kIHRoZSBlYXN5IHN0YXRlIGlzIGNoYW5nZWQgdG8gQ1VSTE1fU1RBVEVfUFJPVE9DT05ORUNUIHdoaWNoCiAgaXNuJ3QgY29ycmVjdCBpZiBhIHByb3h5IGlzIHVzZWQuICBSYXRoZXIgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVAogIHNob3VsZCBiZSB1c2VkLgoKICBJIGRpc2NvdmVyZWQgdGhpcyB3aGlsZSBwZXJmb3JtaW5nIGFuIEhUVFBTIHJlcXVlc3QgdGhyb3VnaCBhIHByb3h5IChzcXVpZCkKICBvbiBteSBsb2NhbCBuZXR3b3JrLiBUaGUgcHJvYmxlbSBjYXVzZWQgb3BlbnNzbCB0byBmYWlsIGFzIGl0IHJlYWQgdGhlIHByb3h5CiAgcmVzcG9uc2UgdG8gdGhlIENPTk5FQ1QgY2FsbCAoJ0hUVFAvMS4wIEVzdGFibGlzaGVkJykgcmF0aGVyIHRoYW4gdGhlIFNTTAogIGhhbmRzaGFrZSAodGhlIGV4YWN0IG9wZW5zc2wgZXJyb3Igd2FzICd3cm9uZyBzc2wgdmVyc2lvbicgYnV0IHRoaXMgaXNuJ3QKICB2ZXJ5IGltcG9ydGFudCkKCi0gRGF2ZSBWYXNpbGV2c2t5IGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzY4NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczNjg3NSkgYWxtb3N0IHNpbXVsdGFub3Vlc2x5IGFzIERhbgogIEZhbmRyaWNoIG1lbnRpb25lZCBhIHJlbGF0ZWQgYnVpbGQgcHJvYmxlbSBvbiB0aGUgbGliY3VybCBtYWlsaW5nIGxpc3Q6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxMzEuaHRtbC4gQm90aCBwcm9ibGVtcyBoYWQgdGhlIHNhbWUKICByZWFzb246IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgUE9MTCogZGVmaW5lcyBhbmQgdGhlIHBvbGxmZCBzdHJ1Y3QgaW4gdGhlCiAgbGliY3VybCBjb2RlIHdhcyBkZXBlbmRpbmcgb24gSEFWRV9QT0xMIGluc3RlYWQgb2YgSEFWRV9TWVNfUE9MTF9ILgoKRGFuaWVsIFMgKDEzIEp1bmUgMjAwNykKLSBUb20gUmVnbmVyIHByb3ZpZGVkIGEgcGF0Y2ggYW5kIHdvcmtlZCB0b2dldGhlciB3aXRoIEphbWVzIEhvdXNsZXksIHNvIG5vdwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgd29ya3MgZm9yIFNGVFAgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBGVFAKICBvbmVzLgoKLSBSaWNoIFJhdWVuemFobiBmaWxlZCBidWcgcmVwb3J0ICMxNzMzMTE5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzMxMTkpIGFuZCB3ZSBjb2xsYWJvcmF0ZWQgb24gdGhlCiAgZml4LiAgVGhlIHByb2JsZW0gaXMgdGhhdCBmb3IgNjRiaXQgSFBVWCBidWlsZHMsIHNldmVyYWwgc29ja2V0LXJlbGF0ZWQKICBmdW5jdGlvbnMgd291bGQgc3RpbGwgYXNzdW1lIGludCAoMzIgYml0KSBhcmd1bWVudHMgYW5kIG5vdCBzb2NrbGVuX3QgKDY0CiAgYml0KSBvbmVzLgoKRGFuaWVsIFMgKDEyIEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgaGlzIHJldmFtcGVkIFNTSCBjb2RlIHRoYXQgaXMgc3RhdGUtbWFjaGluZSBkcml2ZW4gdG8KICByZWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5vdyB0b3RhbGx5IG5vbi1ibG9ja2luZyBsaWJzc2gyIChpbiBDVlMpLgoKRGFuIEYgKDggSnVuZSAyMDA3KQotIEluY29ycG9yYXRlZCBEYW5pZWwgQmxhY2sncyB0ZXN0NzA2IGFuZCB0ZXN0NzA3IFNPQ0tTIHRlc3QgY2FzZXMuCgotIEZpeGVkIGEgZmV3IHByb2JsZW1zIHdoZW4gc3RhcnRpbmcgdGhlIFNPQ0tTIHNlcnZlci4KCi0gUmV2ZXJ0ZWQgc29tZSByZWNlbnQgY2hhbmdlcyB0byBydW50ZXN0cy5wbCB0aGF0IHdlcmVuJ3QgY29tcGF0aWJsZSB3aXRoCiAgcGVybCA1LjAuCgotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gdGhhdCBpdCBhY3R1YWxseSBraWxscyB0aGUgc3NoIGJlaW5nIHVzZWQgYXMKICB0aGUgU09DS1Mgc2VydmVyLgoKRGFuaWVsIFMgKDYgSnVuZSAyMDA3KQotIC1zLy0tc2lsZW50IGNhbiBub3cgYmUgdXNlZCB0byB0b2dnbGUgb2ZmIHRoZSBzaWxlbmNlIGFnYWluIGlmIHVzZWQgYSBzZWNvbmQKICB0aW1lLgoKRGFuaWVsIFMgKDUgSnVuZSAyMDA3KQotIEFkZGVkIERhbmllbCBCbGFjaydzIHdvcmsgdGhhdCBhZGRzIHRoZSBmaXJzdCBmZXcgU09DS1MgdGVzdCBjYXNlcy4gSSBhbHNvCiAgZml4ZWQgdHdvIG1pbm9yIFNPQ0tTIHByb2JsZW1zIHRvIG1ha2UgdGhlIHRlc3QgY2FzZXMgcnVuIGZpbmUuCgpEYW5pZWwgUyAoMzEgTWF5IDIwMDcpCi0gRmVuZyBUdSBtYWRlIChsaWIpY3VybCBzdXBwb3J0ICJ1cGxvYWQiIHJlc3VtaW5nIHdvcmsgZm9yIGZpbGU6Ly8gVVJMcy4KCkRhbmllbCBTICgzMCBNYXkgMjAwNykKLSBJIG1vZGlmaWVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIHRvIHRyYW5zZmVyIDUwMCBkb3dubG9hZHMgaW4gcGFyYWxsZWwKICB3aXRoIGEgYy1hcmVzIGVuYWJsZWQgYnVpbGQgb25seSB0byBmaW5kIHRoYXQgaXQgY3Jhc2hlZCBtaXNlcmFibHksIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBzb21lIHNlbGVjdCgpaXNtcyBsZWZ0IGluIHRoZSBjb2RlLiBUaGlzIHdhcyBkdWUgdG8gQVBJCiAgcmVzdHJpY3Rpb25zIGluIGMtYXJlcyAxLjMueCwgYnV0IHdpdGggdGhlIHVwY29taW5nIGMtYXJlcyAxLjQuMCB0aGlzIGlzIG5vCiAgbG9uZ2VyIHRoZSBjYXNlIHNvIG5vdyBsaWJjdXJsIHJ1bnMgbXVjaCBiZXR0ZXIgd2l0aCBjLWFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZSB3aXRoID4gMTAyNCBmaWxlIGRlc2NyaXB0b3JzIGluIHVzZS4KCiAgRXh0cmEgbm90ZTogc3RhcnRpbmcgbm93IHdlIHJlcXVpcmUgYy1hcmVzIDEuNC4wIGZvciBhc3luY2hyb25vdXMgbmFtZQogIHJlc29sdmVzLgoKLSBBZGRlZCBDVVJMTU9QVF9NQVhDT05ORUNUUyB3aGljaCBpcyBhIGN1cmxfbXVsdGlfc2V0b3B0KCkgb3B0aW9uIGZvciBzZXR0aW5nCiAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBjYWNoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG11bHRpIGhhbmRsZS4KCkRhbmllbCBTICgyNyBNYXkgMjAwNykKLSBXaGVuIHdvcmtpbmcgd2l0aCBhIHByb2JsZW0gU3RlZmFuIEJlY2tlciBoYWQsIEkgZm91bmQgYW4gb2ZmLWJ5LW9uZSBidWZmZXIKICBvdmVyd3JpdGUgaW4gQ3VybF9zZWxlY3QoKS4gV2hpbGUgZml4aW5nIGl0LCBJIGFsc28gaW1wcm92ZWQgaXRzIHBlcmZvcm1hbmNlCiAgc29tZXdoYXQgYnkgY2hhbmdpbmcgY2FsbG9jIHRvIG1hbGxvYyBhbmQgYnJlYWtpbmcgb3V0IG9mIGEgbG9vcCBlYXJsaWVyCiAgKHdoZW4gcG9zc2libGUpLgoKRGFuaWVsIFMgKDI1IE1heSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGZpeGVkIGJ1ZyAjMTcwNTgwMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1ODAyKSwgd2hpY2ggd2FzIGZpbGVkIGJ5IERhbmllbAogIEJsYWNrIGlkZW50aWZ5aW5nIHNldmVyYWwgRlRQLVNTTCB0ZXN0IGNhc2VzIGZhaWwgd2hlbiB3ZSBidWlsZCBsaWJjdXJsIHdpdGgKICBOU1MgZm9yIFRMUy9TU0wuIExpc3RlZCBhcyAjNDIgaW4gS05PV05fQlVHUy4KCkRhbmllbCBTICgyNCBNYXkgMjAwNykKLSBTb25nIE1hIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MjQwMTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyNDAxNikgbm90aWNpbmcgdGhhdCBkb3dubG9hZGluZwogIGdsb2ItcmFuZ2VzIGZvciBURlRQIHdhcyBicm9rZW4gaW4gQ1ZTLiBGaXhlZCBub3cuCiAgCi0gJ215dHgnIGluIGJ1ZyByZXBvcnQgIzE3MjMxOTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjMxOTQpCiAgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2FybmYoKSBmdW5jdGlvbiBpbiB0aGUgY3VybCB0b29sIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgd2l0aCB0aGUgY2FzZXMgd2hlbiBleGNlc3NpdmVseSBsb25nIHdvcmRzIHdlcmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNob3AKICB1cC4KCkRhbmllbCBTICgyMiBNYXkgMjAwNykKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgdGhlCiAgcGVlcidzIG5hbWUgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGJ1aWx0IGZvciBPcGVuU1NMLiBUaGUgbGVhayBoYXBwZW5zCiAgZm9yIGxpYmN1cmxzIHdpdGggQ1VSTF9ET0VTX0NPTlZFUlNJT05TIGVuYWJsZWQgdGhhdCBmYWlsIHRvIGNvbnZlcnQgdGhlIENOCiAgbmFtZSBmcm9tIFVURjguIEhlIGFsc28gZml4ZWQgYSBsZWFrIHdoZW4gUEtDUyAjMTIgcGFyc2luZyBmYWlsZWQuCgpEYW5pZWwgUyAoMTggTWF5IDIwMDcpCi0gRmVuZyBUdSByZXBvcnRlZCB0aGF0IGN1cmwgLXcgZGlkIHdyb25nIG9uIFRGVFAgdHJhbnNmZXJzIGluIGJ1ZyByZXBvcnQKICAjMTcxNTM5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5NCksIGFuZCB0aGUKICB0cmFuc2Zlci1yZWxhdGVkIGluZm8gInZhcmlhYmxlcyIgd2VyZSBpbmRlZWQgb3ZlcndyaXR0ZW4gd2l0aCB6ZXJvZXMKICB3cm9uZ2x5IGFuZCBoYXZlIG5vdyBiZWVuIGFkanVzdGVkLiBUaGUgdXBsb2FkIHNpemUgc3RpbGwgaXNuJ3QgYWNjdXJhdGUuCgpEYW5pZWwgUyAoMTcgTWF5IDIwMDcpCi0gRmVuZyBUdSBwb2ludGVkIG91dCBhIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IgaW4gdGhlIFRGVFAgY29ubmVjdCB0aW1lb3V0CiAgY29kZSBmb3IgdGltZW91dHMgbGVzcyB0aGFuIGZpdmUgc2Vjb25kcywgYW5kIGFsc28gcHJvdmlkZWQgYSBmaXggZm9yIGl0LgogIEJ1ZyByZXBvcnQgIzE3MTUzOTIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTIpCgpEYW4gRiAoMTYgTWF5IDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBmb3IgY29tcGlsaW5nIHVuZGVyIE1pbml4IDMuMS4zIHVzaW5nIEFDSy4KCkRhbiBGICgxNCBNYXkgMjAwNykKLSBBZGRlZCBTRlRQIGRpcmVjdG9yeSBsaXN0aW5nIHRlc3QgY2FzZSA2MTMuCgotIEFkZGVkIHN1cHBvcnQgZm9yIHF1b3RlIGNvbW1hbmRzIGJlZm9yZSBhIHRyYW5zZmVyIHVzaW5nIFNGVFAgYW5kIHRlc3QKICBjYXNlIDYxNC4KCi0gQ2hhbmdlZCB0aGUgcG9zdC1xdW90ZSBjb21tYW5kcyB0byBvY2N1ciBhZnRlciB0aGUgdHJhbnNmZXJyZWQgZmlsZSBpcwogIGNsb3NlZC4KCi0gQWxsb3cgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24sIGNoZ3JwIHRvIHNldCBhIHZhbHVlIG9mIDAuCgpEYW4gRiAoOSBNYXkgMjAwNykKLSBLcmlzdGlhbiBHdW5zdG9uZSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgb3ZlcndyaXRpbmcgYW4gdXBsb2FkZWQgZmlsZSB3aXRoCiAgc2Z0cCBkaWRuJ3QgdHJ1bmNhdGUgaXQgZmlyc3QsIHdoaWNoIHdvdWxkIGNvcnJ1cHQgdGhlIGZpbGUgaWYgdGhlIG5ldwogIGZpbGUgd2FzIHNob3J0ZXIgdGhhbiB0aGUgb2xkLgoKRGFuIEYgKDggTWF5IDIwMDcpCi0gQWRkZWQgRlRQUyB0ZXN0IGNhc2VzIDQwNiBhbmQgNDA3CgpEYW5pZWwgUyAoOCBNYXkgMjAwNykKLSBDVVJMRV9GVFBfQ09VTEROVF9TVE9SX0ZJTEUgaXMgbm93IGtub3duIGFzIENVUkxFX1VQTE9BRF9GQUlMRUQuIFRoaXMgaXMKICBiZWNhdXNlIEkganVzdCBtYWRlIFNDUCB1cGxvYWRzIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZSBmaWxlIHNpemUgb2YKICB0aGUgdXBsb2FkIGZpbGUgaXNuJ3QgZ2l2ZW4gd2l0aCBDVVJMT1BUX0lORklMRVNJWkUqLiBEb2NzIHVwZGF0ZWQgdG8KICByZWZsZWN0IHRoaXMgbmV3cywgYW5kIGEgZGVmaW5lIGZvciB0aGUgb2xkIG5hbWUgd2FzIGFkZGVkIHRvIHRoZSBwdWJsaWMKICBoZWFkZXIgZmlsZS4KCkRhbmllbCBTICg3IE1heSAyMDA3KQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgYnVnIGluIHRoZSBtdWx0aSBoYW5kbGUgY29kZSB0aGF0IG1hZGUgdGhlIGNvbm5lY3Rpb24KICBjYWNoZSBncm93IGEgYml0IHRvbyBtdWNoLCBiZXlvbmQgdGhlIG5vcm1hbCA0ICogZWFzeV9oYW5kbGVzLgoKRGFuaWVsIFMgKDIgTWF5IDIwMDcpCi0gQW5kZXJzIEd1c3RhZnNzb24gcmVtYXJrZWQgdGhhdCByZXF1aXJpbmcgQ1VSTE9QVF9IVFRQX1ZFUlNJT04gc2V0IHRvIDEuMAogIHdoZW4gQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUyBpcyB1c2VkIHRvIGF2b2lkIHRoZSBwcm9ibGVtIG1lbnRpb25lZCBiZWxvdyBpcwogIG5vdCB2ZXJ5IG5pY2UgaWYgdGhlIGNsaWVudCB3YW50cyB0byBiZSBhYmxlIHRvIHVzZSBfZWl0aGVyXyBhIEhUVFAgMS4xCiAgc2VydmVyIG9yIG9uZSB3aXRoaW4gdGhlIGFsaWFzZXMgbGlzdC4uLiBzbyBzdGFydGluZyBub3csIGxpYmN1cmwgd2lsbAogIHNpbXBseSBjb25zaWRlciAyMDAtYWxpYXMgbWF0Y2hlcyB0aGUgdG8gYmUgSFRUUCAxLjAgY29tcGxpYW50LgoKLSBUb2JpYXMgUnVuZHN0cvZtIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGV5IGV4cGVyaWVuY2VkIHdpdGggeG1tczIgYW5kIHJlY2VudAogIGxpYmN1cmxzLCB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIHRoZSAyNS1ub3YtMjAwNiBjaGFuZ2Ugd2hpY2ggdHJlYXRzIEhUVFAKICByZXNwb25zZXMgd2l0aG91dCBDb250ZW50LUxlbmd0aCBvciBjaHVua2VkIGVuY29kaW5nIGFzIHdpdGhvdXQgYm9kaWVzLiBXZQogIG5vdyBhZGRlZCB0aGUgY29uZGl0aW9uYWwgdGhhdCB0aGUgYWJvdmUgbWVudGlvbmVkIHJlc3BvbnNlIGlzIG9ubHkgd2l0aG91dAogIGJvZHkgaWYgdGhlIHJlc3BvbnNlIGlzIEhUVFAgMS4xLgoKLSBKZWZmIFBvaGxtZXllciBpbXByb3ZlZCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSB0byB1c2UgdGhlCiAgQ1VSTE1PUFRfVElNRVJGVU5DVElPTiBjYWxsYmFjayBvcHRpb24uCgotIFNldCB0aGUgdGltZW91dCBmb3IgZWFzeSBoYW5kbGVzIHRvIGV4cGlyZSByZWFsbHkgc29vbiBhZnRlciBhZGRpdGlvbiBvcgogIHdoZW4gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGlzIHJldHVybmVkIGZyb20gY3VybF9tdWx0aV9zb2NrZXQqL3BlcmZvcm0sCiAgdG8gbWFrZSBhcHBsaWNhdGlvbnMgdXNpbmcgb25seSBjdXJsX211bHRpX3NvY2tldCgpIHRvIHByb3Blcmx5IGZ1bmN0aW9uCiAgd2hlbiBhZGRpbmcgZWFzeSBoYW5kbGVzICJvbiB0aGUgZmx5Ii4gQnVnIHJlcG9ydCBhbmQgdGVzdCBhcHAgcHJvdmlkZWQgYnkKICBNaWNoYWVsIFdhbGxuZXIuCgpEYW4gRiAoMzAgQXByaWwgMjAwNykKLSBJbXByb3ZlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFsbG93IHJ1bm5pbmcgdGVzdCBzZXJ2ZXJzIG9uIG90aGVyIHRoYW4KICB0aGUgZGVmYXVsdCBwb3J0IG51bWJlcnMsIGFsbG93aW5nIG1vcmUgdGhhbiBvbmUgdGVzdCBzdWl0ZSB0byBydW4KICBzaW11bHRhbmVvdXNseSBvbiB0aGUgc2FtZSBob3N0LgoKRGFuaWVsIFMgKDI4IEFwcmlsIDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gZml4ZWQgbGliY3VybCB0byBub3QgaW5pdCBHbnVUTFMgYXMgZWFybHkgYXMgd2UgZGlkIGJlZm9yZSwKICBzaW5jZSBpdCB0aGVuIGluaXRzIGxpYmdjcnlwdCBhbmQgbGliZ2NyeXB0IGlzIGJlaW5nIGV2aWwgYW5kIEVYSVRTIHRoZQogIGFwcGxpY2F0aW9uIGlmIGl0IGZhaWxzIHRvIGdldCBhIGZpbmUgcmFuZG9tIHNlZWQuIFRoYXQncyByZWFsbHkgbm90IGEgbmljZQogIHRoaW5nIHRvIGRvIGJ5IGEgbGlicmFyeS4KCi0gRnJhbmsgSGVtcGVsIGZpeGVkIGEgY3VybF9lYXN5X2R1cGhhbmRsZSgpIGNyYXNoIG9uIGEgaGFuZGxlIHRoYXQgaGFkCiAgYmVlbiByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUsIGFuZCB0aGVuIGZpeGVkIGFub3RoZXIgZmxhdyB0aGF0IHByZXZlbnRlZAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB3b3JrIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IGZpeCAtIHRoZSBoYW5kbGUgd2FzCiAgc3RpbGwgbWFya2VkIGFzIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgUyAoMjYgQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBTQ1AgZG93bmxvYWRzIHdoZW4gdGhlIGRvd25sb2FkZWQgZmlsZQogIHdhcyAxNjM4NSBieXRlcyAoMTZLKzEpIGFuZCBpdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCBwcm9wZXJseSBhbHdheXMgInN1Y2sKICBvdXQiIGFsbCBkYXRhIGZyb20gbGlic3NoMi4gVGhlIGVmZmVjdCBiZWluZyB0aGF0IGxpYmN1cmwgd291bGQgaGFuZyBvbiB0aGUKICBzb2NrZXQgd2FpdGluZyBmb3IgZGF0YSB3aGVuIGxpYnNzaDIgaGFkIGluIGZhY3QgYWxyZWFkeSByZWFkIGl0IGFsbC4uLgoKRGFuIEYgKDI1IEFwcmlsIDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBpbiBydW50ZXN0cy5wbCBmb3IgIiFuIiB0ZXN0IG51bWJlcnMgdG8gZGlzYWJsZSBpbmRpdmlkdWFsCiAgdGVzdHMuICBDaGFuZ2VkIC10IHRvIG9ubHkga2VlcCBsb2cgZmlsZXMgYXJvdW5kIHdoZW4gLWsgaXMgc3BlY2lmaWVkLAogIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHdpdGhvdXQgLXQuCgpEYW5pZWwgUyAoMjUgQXByaWwgMjAwNykKLSBTb25pYSBTdWJyYW1hbmlhbiBicm91Z2h0IG91ciBhdHRlbnRpb24gdG8gYSBwcm9ibGVtIHRoYXQgaGFwcGVucyBpZiB5b3Ugc2V0CiAgdGhlIENVUkxPUFRfUkVTVU1FX0ZST00gb3IgQ1VSTE9QVF9SQU5HRSBvcHRpb25zIGFuZCBhbiBleGlzdGluZyBjb25uZWN0aW9uCiAgaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgaXMgY2xvc2VkIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBvbmUgd2hlbiB5b3UgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkuIEl0IHdvdWxkIHRoZW4gd3JvbmdseSBmcmVlIHJhbmdlLXJlbGF0ZWQgZGF0YSBpbiB0aGUKICBjb25uZWN0aW9uIGNsb3NlIGZ1bnRpb24uCgpZYW5nIFRzZSAoMjUgQXByaWwgMjAwNykKLSBTdGV2ZSBMaXR0bGUgZml4ZWQgY29tcGlsYXRpb24gb24gVk1TIDY0LWJpdCBtb2RlCgpEYW5pZWwgUyAoMjQgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIG1hZGUgdGhlICdtYXN0ZXJfYnVmZmVyJyBnZXQgYWxsb2NhdGVkIGZpcnN0IG9uY2UgaXQgaXMKICBjYW4vd2lsbCBiZSB1c2VkIGFzIGl0IHRoZW4gbWFrZXMgdGhlIGNvbW1vbiBjYXNlcyBzYXZlIDE2S0Igb2YgZGF0YSBmb3IgZWFjaAogIGVhc3kgaGFuZGxlIHRoYXQgaXNuJ3QgdXNlZCBmb3IgcGlwZWxpbmluZy4KCkRhbiBGICgyMyBBcHJpbCAyMDA3KQotIEFkZGVkIDxwb3N0Y2hlY2s+IHN1cHBvcnQgdG8gdGhlIHRlc3QgaGFybmVzcy4KCi0gQWRkZWQgdGVzdHMgNjEwLTYxMiB0byB0ZXN0IG1vcmUgU0ZUUCBwb3N0LXF1b3RlIGNvbW1hbmRzLgoKRGFuaWVsIFMgKDIyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSdzIHdhcm5pbmcgaWYgLXIvLS1yYW5nZSBpcyBnaXZlbiB3aXRoIGEgImJhZCIgcmFuZ2UsIGFsc28gbm90ZWQgaW4KICB0aGUgbWFuIHBhZ2Ugbm93LgoKLSBEYW5pZWwgQmxhY2sgZmlsZWQgYnVnICMxNzA1MTc3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDUxNzcpIHdoZXJlIC0td2l0aG91dC1zc2wKICAtLXdpdGgtZ251dGwgb3V0cHV0cyBhIHdhcm5pbmcgYWJvdXQgU1NMIG5vdCBiZWluZyBlbmFibGVkIGV2ZW4gdGhvdWdoIEdudVRMUwogIHdhcyBmb3VuZCBhbmQgdXNlZC4KCkRhbmllbCBTICgyMSBBcHJpbCAyMDA3KQotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDQ2NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNDY3NSkgaWRlbnRpZnlpbmcgYSBkb3VibGUtZnJlZQogIHByb2JsZW0gaW4gdGhlIFNTTC1kZWFsaW5nIGxheWVyLCB0ZWxsaW5nIEdudVRMUyB0byBmcmVlIE5VTEwgY3JlZGVudGlhbHMgb24KICBjbG9zZWRvd24gYWZ0ZXIgYSBmYWlsdXJlIGFuZCBhIGJhZCAjaWZkZWYgZm9yIE5TUyB3aGVuIGNsb3NpbmcgZG93biBTU0wuCgpZYW5nIFRzZSAoMjAgQXByaWwgMjAwNykKLSBTYXZlIG9uZSBjYWxsIHRvIGN1cmx4X3R2bm93KCksIHdoaWNoIGNhbGxzIGdldHRpbWVvZmRheSgpLCBpbiBlYWNoIG9mCiAgQ3VybF9zb2NrZXRfcmVhZHkoKSwgQ3VybF9wb2xsKCkgYW5kIEN1cmxfc2VsZWN0KCkgd2hlbiB0aGVzZSBhcmUgY2FsbGVkCiAgd2l0aCBhIHplcm8gdGltZW91dCBvciBhIHRpbWVvdXQgdmFsdWUgaW5kaWNhdGluZyBhIGJsb2NraW5nIGNhbGwgc2hvdWxkCiAgYmUgcGVyZm9ybWVkLgoKRGFuaWVsIFMgKDE4IEFwcmlsIDIwMDcpCi0gSmFtZXMgSG91c2xleSBtYWRlIFNGVFAgdXBsb2FkcyB1c2UgbGlic3NoMidzIG5vbi1ibG9ja2luZyBBUEkKCi0gUHJldmVudCB0aGUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgZnJvbSB1cGRhdGluZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlCiAgcGVyIHNlY29uZC4KCkRhbiBGICgxNyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk2LCAyOTcgYW5kIDI5OCB0byB0ZXN0IC0tZnRwLW1ldGhvZCBoYW5kbGluZwoKRGFuaWVsIFMgKDE2IEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsIGFkZGVkIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbigpIHRvIGxpYmN1cmwsIHdoaWNoIGlzIGEKICBmdW5jdGlvbiB0aGF0IGRlcHJlY2F0ZXMgdGhlIGN1cmxfbXVsdGlfc29ja2V0KCkgZnVuY3Rpb24uIFVzaW5nIHRoZSBuZXcKICBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gdGVsbCBsaWJjdXJsIHdoYXQgYWN0aW9uIHRoYXQgd2FzIGZvdW5kIGluIHRoZQogIHNvY2tldCB0aGF0IGl0IHBhc3NlcyBpbi4gVGhpcyBnaXZlcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0IGFzIGl0CiAgYWxsb3dzIGxpYmN1cmwgdG8gYXZvaWQgYSBjYWxsIHRvIHBvbGwoKS9zZWxlY3QoKSBmb3IgZXZlcnkgY2FsbCB0bwogIGN1cmxfbXVsdGlfc29ja2V0KigpLgoKICBJIGFkZGVkIGEgZGVmaW5lIGluIHRoZSBwdWJsaWMgY3VybC9tdWx0aS5oIGhlYWRlciBmaWxlIHRoYXQgd2lsbCBtYWtlIHlvdXIKICBleGlzdGluZyBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5IHVzZSBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpbnN0ZWFkIG9mCiAgY3VybF9tdWx0aV9zb2NrZXQoKSB3aGVuIHlvdSByZWNvbXBpbGUuIEJ1dCBvZiBjb3Vyc2UgeW91J2xsIGdldCBiZXR0ZXIKICBwZXJmb3JtYW5jZSBpZiB5b3UgYWRqdXN0IHlvdXIgY29kZSBtYW51YWxseSBhbmQgYWN0dWFsbHkgcGFzcyBpbiB0aGUKICBjb3JyZWN0IGFjdGlvbiBiaXRtYXNrIHRvIHRoaXMgZnVuY3Rpb24uCgpEYW5pZWwgUyAoMTQgQXByaWwgMjAwNykKLSBKYXkgQXVzdGluIGFkZGVkICJESCBQQVJBTUVURVJTIiB0byB0aGUgc3R1bm5lbC5wZW0gY2VydGlmaWNhdGUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUgdG8gbWFrZSBzdHVubmVsIHJ1biBiZXR0ZXIgaW4gc29tZSAobW9zdD8pIGVudmlyb25tZW50cy4KCkRhbiBGICgxMyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk0IGFuZCAyOTUgdG8gdGVzdCAtLWZ0cC1hY2NvdW50IGhhbmRsaW5nCgotIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dCBvZiBtZW1vcnkgaW4gZnRwLgoKWWFuZyBUc2UgKDEzIEFwcmlsIDIwMDcpCi0gRml4IHRlc3QgY2FzZSA1MzQgd2hpY2ggc3RhcnRlZCB0byBmYWlsIDIwMDctMDQtMTMgZHVlIHRvIHRoZSBleGlzdGFuY2UKICBvZiBhIG5ldyBob3N0IG9uIHRoZSBuZXQgd2l0aCB0aGUgc2FtZSBzaWxseSBkb21haW4gdGhlIHRlc3Qgd2FzIHVzaW5nCiAgZm9yIGEgaG9zdCB3aGljaCB3YXMgc3VwcG9zZWQgbm90IHRvIGV4aXN0LgoKRGFuaWVsIFMgKDEyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBpZjJpcCBjb2RlIGlmIHlvdSBwYXNzIGluIGFuIGludGVyZmFjZQogIG5hbWUgbG9uZ2VyIHRoYW4gdGhlIG5hbWUgZmllbGQgb2YgdGhlIGlmcmVxIHN0cnVjdCAodHlwaWNhbGx5IDYgYnl0ZXMpLCBhcwogIHRoZW4gaXQgd291bGRuJ3QgY2xvc2UgdGhlIHVzZWQgZHVtbXkgc29ja2V0LiBCdWcgIzE2OTg5NzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTY5ODk3NCkKClZlcnNpb24gNy4xNi4yICgxMSBBcHJpbCAyMDA3KQoKWWFuZyBUc2UgKDEwIEFwcmlsIDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgc29tZSBmaXhlcyBmb3IgSFRUUCBwaXBlbGluaW5nCgotIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBpZ25vcmUgLS1lbmFibGUtc3NwaSBvcHRpb24gZm9yIG5vbi1uYXRpdmUgV2luZG93cy4KCkRhbmllbCBTICg5IEFwcmlsIDIwMDcpCi0gTmljayBaaXR6bWFubiBkaWQgc3NoLmMgY2xlYW51cHMKCkRhbmllbCBTICgzIEFwcmlsIDIwMDcpCi0gUm9iIEpvbmVzIGZpeGVkIGJldHRlciAjaWZkZWYnaW5nIGZvciBhIGJ1bmNoIG9mICNpbmNsdWRlIGxpbmVzLgoKRGFuaWVsIFMgKDIgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIG1hZGUgdGhlIENVUkxPUFRfUE9TVFFVT1RFIG9wdGlvbiB3b3JrIGZvciBTRlRQIGFzIHdlbGwuIFRoZQogIGFjY2VwdGVkIGNvbW1hbmRzIGFyZSBhcyBmb2xsb3dzOgoKICBjaGdycCAoZ2lkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIGdyb3VwIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKGdpZCkuIChnaWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBjaG1vZCAocGVybXMpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0bwogICAgKHBlcm1zKS4gKHBlcm1zKSBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgY2htb2QgVW5peAogICAgY29tbWFuZC4KCiAgY2hvd24gKHVpZCkgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSB1c2VyIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKHVpZCkuICh1aWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBsbiAoc291cmNlKSAoZGVzdCkKICAgIENyZWF0ZXMgYSBzeW1ib2xpYyBsaW5rIGF0IChkZXN0KSB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSBsb2NhdGVkIGF0CiAgICAoc291cmNlKS4KCiAgbWtkaXIgKHBhdGgpCiAgICBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBhdCAocGF0aCkuCgogIHJlbmFtZSAoc291cmNlKSAoZGVzdCkKICAgIE1vdmVzIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAoc291cmNlKSB0byAoZGVzdCkuCgogIHJtIChwYXRoKQogICAgRGVsZXRlcyB0aGUgZmlsZSBsb2NhdGVkIGF0IChwYXRoKS4KCiAgcm1kaXIgKHBhdGgpCiAgICBEZWxldGVzIHRoZSBkaXJlY3RvcnkgbG9jYXRlZCBhdCAocGF0aCkuIFRoaXMgY29tbWFuZCB3aWxsIHJhaXNlIGFuIGVycm9yCiAgICBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4KCiAgc3ltbGluayAoc291cmNlKSAoZGVzdCkKICAgIFNhbWUgYXMgbG4uCgpEYW5pZWwgUyAoMSBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBhIGxvdCBmYXN0ZXIgd2hlbiBtYW55CiAgZWFzeSBoYW5kbGVzIGFyZSBhZGRlZCB0byBhIG11bHRpIGhhbmRsZSwgYnkgYXZvaWRpbmcgdGhlIGxvb3Bpbmcgb3ZlciBhbGwKICB0aGUgaGFuZGxlcyB0byBmaW5kIHdoaWNoIG9uZSB0byByZW1vdmUuCgotIE1hdHQgS3JhYWkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYgZmluZSBhZ2Fpbi4KCkRhbmllbCBTICgzMSBNYXJjaCAyMDA3KQotIEZpeGVkIHNldmVyYWwgbWlub3IgaXNzdWVzIGRldGVjdGVkIGJ5IHRoZSBjb3Zlcml0eS5jb20gc2Nhbm5lci4KCi0gIlBpeGVsIiBmaXhlZCBhIHByb2JsZW0gdGhhdCBhcHBlYXJlZCB3aGVuIHlvdSB1c2VkIC1mIHdpdGggdXNlcitwYXNzd29yZAogIGVtYmVkZGVkIGluIHRoZSBVUkwuCgpEYW4gRiAoMjkgTWFyY2ggMjAwNykKLSBEb24ndCB0ZWFyIGRvd24gdGhlIGZ0cCBjb25uZWN0aW9uIGlmIHRoZSBtYXhpbXVtIGZpbGVzaXplIHdhcyBleGNlZWRlZAogIGFuZCBhZGRlZCB0ZXN0cyAyOTAgYW5kIDI5MSB0byBjaGVjay4KCi0gQWRkZWQgZnRwcyB1cGxvYWQgYW5kIFNTTCByZXF1aXJlZCB0ZXN0cyA0MDEgYW5kIDQwMi4KCi0gU2VuZCBhbiBFT0YgbWVzc2FnZSBiZWZvcmUgY2xvc2luZyBhbiBTQ1AgY2hhbm5lbCwgYXMgcmVjb21tZW5kZWQgYnkKICBSRkM0MjU0LiBFbmFibGUgbGlic3NoMiB0cmFjaW5nIHdoZW4gc3NoIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCgpZYW5nIFRzZSAoMjcgTWFyY2ggMjAwNykKLSBJbnRlcm5hbCBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIHJlbmFtZWQgdG8gQ3VybF9zb2NrZXRfcmVhZHkoKQoKICBOZXcgSW50ZXJuYWwgd3JhcHBlciBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIGFyb3VuZCBzZWxlY3QgKDIpLCBpdAogIHVzZXMgcG9sbCgpIHdoZW4gYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUsIHNvIG5vdyBsaWJjdXJsIGNhbiBiZQogIGJ1aWx0IHdpdGhvdXQgc2VsZWN0KCkgc3VwcG9ydCBhdCBhbGwgaWYgYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUuCgpEYW5pZWwgUyAoMjUgTWFyY2ggMjAwNykKLSBEYW5pZWwgSm9obnNvbiBmaXhlZCBtdWx0aSBjb2RlIHRvIHRyYXZlcnNlIHRoZSBlYXN5IGhhbmRsZSBsaXN0IHByb3Blcmx5LgogIEEgbGVmdC1vdmVyIGJ1ZyBmcm9tIHRoZSBGZWJydWFyeSAyMSBmaXguCgpEYW4gRiAoMjMgTWFyY2ggMjAwNykKLSBBZGRlZCAtLXB1YmtleSBvcHRpb24gdG8gY3VybCBhbmQgbWFkZSAtLWtleSBhbHNvIHdvcmsgZm9yIFNDUC9TRlRQLAogIHBsdXMgbWFkZSAtLXBhc3Mgd29yayBvbiBhbiBTU0ggcHJpdmF0ZSBrZXkgYXMgd2VsbC4KCi0gQ2hhbmdlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGF0dGVtcHQgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gc2VydmVycwogIGJlZm9yZSByZXNvcnRpbmcgdG8gdGhlIGtpbGwgLTkgaGFtbWVyLgoKLSBBZGRlZCB0ZXN0IGhhcm5lc3MgaW5mcmFzdHJ1Y3R1cmUgdG8gc3VwcG9ydCBzY3Avc2Z0cCB0ZXN0cywgdXNpbmcKICBPcGVuU1NIIGFzIHRoZSBzZXJ2ZXIuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBzcGVjaWZ5aW5nIGEgcHJveHkgd2l0aCBhIGZpbGU6IFVSTC4KCllhbmcgVHNlICgyMCBNYXJjaCAyMDA3KQotIEZpeGVkOiBXaGVuIGEgc2lnbmFsIHdhcyBjYXVnaHQgYXdhaXRpbmcgZm9yIGFuIGV2ZW50IHVzaW5nIEN1cmxfc2VsZWN0KCkKICBvciBDdXJsX3BvbGwoKSB3aXRoIGEgbm9uLXplcm8gdGltZW91dCBib3RoIGZ1bmN0aW9ucyB3b3VsZCByZXN0YXJ0IHRoZQogIHNwZWNpZmllZCB0aW1lb3V0LiBUaGlzIGNvdWxkIGV2ZW4gbGVhZCB0byB0aGUgZXh0cmVtZSBjYXNlIHRoYXQgaWYgYQogIHNpZ25hbCBhcnJpdmVkIHdpdGggYSBmcmVjdWVuY3kgbG93ZXIgdG8gdGhlIHNwZWNpZmllZCB0aW1lb3V0IG5laXRoZXIKICBmdW5jdGlvbiB3b3VsZCBldmVyIGV4aXQuCgogIEFkZGVkIGV4cGVyaW1lbnRhbCBzeW1ib2wgZGVmaW5pdGlvbiBjaGVjayBDVVJMX0FDS05PV0xFREdFX0VJTlRSIGluCiAgQ3VybF9zZWxlY3QoKSBhbmQgQ3VybF9wb2xsKCkuIFdoZW4gY29tcGlsZWQgd2l0aCBDVVJMX0FDS05PV0xFREdFX0VJTlRSCiAgZGVmaW5lZCBib3RoIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhcyBzb29uIGFzIGEgc2lnbmFsIGlzIGNhdWdodC4gVXNlIGl0CiAgYXQgeW91ciBvd24gcmlzaywgYWxsIGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeSBzaG91bGQgYmUKICByZXZpc2l0ZWQgYW5kIGNoZWNrZWQgYmVmb3JlIGZ1bGx5IHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLgoKWWFuZyBUc2UgKDE5IE1hcmNoIDIwMDcpCi0gQnJ5YW4gSGVuZGVyc29uIGZpeGVkIHRoZSBwcm9ncmVzcyBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBnZXQgY2FsbGVkIG1vcmUKICBmcmVxdWVudGx5IGFsbG93aW5nIHNhbWUgY2FsbGluZyBmcmVjdWVuY3kgZm9yIHRoZSBjbGllbnQgcHJvZ3Jlc3MgY2FsbGJhY2suCiAgCkRhbiBGICgxNSBNYXJjaCAyMDA3KQotIFZhcmlvdXMgbWVtb3J5IGxlYWtzIHBsdWdnZWQgYW5kIE5VTEwgcG9pbnRlciBmaXhlcyBtYWRlIGluIHRoZSBzc2ggY29kZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNykKLSBOaWNrIG1hZGUgdGhlIGN1cmwgdG9vbCBhY2NlcHQgZ2xvYmJpbmcgcmFuZ2VzIHRoYXQgb25seSBpcyBvbmUgbnVtYmVyLCBpLmUKICB5b3UgY2FuIG5vdyB1c2UgWzEtMV0gd2l0aG91dCBjdXJsIGNvbXBsYWluaW5nLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA3KQotIEV5Z2VuZSBSeWFiaW5raW46CgogIFRoZSBwcm9ibGVtIGlzIHRoZSBmb2xsb3dpbmc6IHdoZW4gd2UncmUgY2FsbGluZyBDdXJsX2RvbmUgYW5kIGl0IGRlY2lkZXMgdG8KICBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW5lZCAoJ2xlZnQgaW50YWN0JyksIHRoZW4gdGhlIGNhbGxlciBpcyBub3Qgbm90aWZpZWQKICB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkb25lIHZpYSB0aGUgTlVMTGlmeWluZyBvZiB0aGUgcG9pbnRlciwgc28gc29tZSBlYXN5CiAgaGFuZGxlIGlzIGtlZXBpbmcgdGhlIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uLgoKICBMYXRlciBDb25uZWN0aW9uRXhpc3RzIGNhbiBzZWxlY3Qgc3VjaCBjb25uZWN0aW9uIGZvciByZXVzZSBldmVuIGlmIHdlJ3JlCiAgbm90IHBpcGVsaW5pbmc6IHBpcGVMZW4gaXMgemVybywgc28gdGhlIChwaXBlTGVuID4gMCAmJiAhY2FuUGlwZWxpbmUpIGlzCiAgZmFsc2UgYW5kIHdlIGNhbiByZXVzZSB0aGlzIGNvbm5lY3Rpb24gZm9yIGFub3RoZXIgZWFzeSBoYW5kbGUuIEJ1dCB0aHVzIHRoZQogIGNvbm5lY3Rpb24gd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0d28gZWFzeSBoYW5kbGVzIGlmIHRoZSBoYW5kbGUgdGhhdCB3YW50cwogIHRvIHRha2UgdGhlIG93bmVyc2hpcCBpcyBub3QgdGhlIHNhbWUgYXMgd2FzIG5vdCBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbgogIHdhcyBkb25lIGluIEN1cmxfZG9uZS4gQW5kIHdoZW4gc29tZSBvZiB0aGVzZSBlYXN5IGhhbmRsZXMgd2lsbCBnZXQgdGhlaXIKICBjb25uZWN0aW9uIHJlYWxseSBmcmVlZCB0aGUgYW5vdGhlciBvbmUgd2lsbCBzdGlsbCBrZWVwIHRoZSBwb2ludGVyLgoKICBNeSBmaXggd2FzIHJhdGhlciB0cml2aWFsOiBJIGp1c3QgYWRkZWQgdGhlIE5VTExpZmljYXRpb24gdG8gdGhlICdlbHNlJwogIGJyYW5jaCBpbiB0aGUgQ3VybF9kb25lLiBNeSB0ZXN0cyB3aXRoIEdpdCBhbmQgRWxlY3RyaWNGZW5jZSBzaG93ZWQgbm8KICBwcm9ibGVtcyBib3RoIGZvciBIVFRQIHB1bGxpbmcgYW5kIGNsb25pbmcuIFJlcG9zaXRvcnkgc2l6ZSBpcyBhYm91dCAyNTAgTWIsCiAgc28gaXQgd2FzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBDdXJsJ3Mgd29yay4KCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFkZCBhIG5ldyAiY3J5cHRvIiBmZWF0dXJlIGNoZWNrIGFuZCB1cGRhdGVkIHRoZQogIGFwcHJvcHJpYXRlIHRlc3QgY2FzZSB0byB1c2UgaXQuICBGb3Igbm93LCB0aGlzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdGhlCiAgIlNTTCIgZmVhdHVyZSBiZWNhdXNlIGN1cmwgZG9lc24ndCBsaXN0IGl0IHNlcGFyYXRlbHkuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIGZvciBJUHY2LgoKLSBSb2JlcnQgQS4gTW9uYXQgaW1wcm92ZWQgdGhlIG1ha2V0Z3ogYW5kIFZDNi84IGdlbmVyYXRpbmcgdG8gc2V0IHRoZSBjb3JyZWN0CiAgbWFjaGluZSB0eXBlIHRvby4KCi0gSnVzdGluIEZsZXRjaGVyIGZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHRyeWluZyB0bwogIHVwbG9hZCBhIGZpbGUgaXQgY291bGRuJ3Qgb3Blbi4gQnVnICMxNjc2NTgxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2NzY1ODEpCgpEYW4gRiAoOSBNYXJjaCAyMDA3KQotIFVwZGF0ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBjaGVjayBmb3IgcHJvdG9jb2wgc3VwcG9ydCBiZWZvcmUgcnVubmluZyBlYWNoCiAgdGVzdCwgZml4aW5nIEtOT1dOX0JVR1MgIzExLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBSZWludHJvZHVjZWQgKGFmdGVyIGEgMyB5ZWFyIGhpYXR1cykgYW4gRlRQUyB0ZXN0IGNhc2UgKDQwMCkgaW50byB0aGUgdGVzdAogIGhhcm5lc3MuICBJdCBpcyB2ZXJ5IGxpbWl0ZWQgYXMgaXQgc3VwcG9ydHMgb25seSBmdHBzOi8vIFVSTHMgd2l0aAogIC0tZnRwLXNzbC1jb250cm9sIHNwZWNpZmllZCwgd2hpY2ggaW1wbGljaXRseSBlbmNyeXB0cyB0aGUgY29udHJvbAogIGNoYW5uZWwgYnV0IG5vdCB0aGUgZGF0YSBjaGFubmVscy4gIFRoYXQgYWxsb3dzIHN0dW5uZWwgdG8gYmUgdXNlZCB3aXRoCiAgYW4gdW5tb2RpZmllZCBmdHAgc2VydmVyIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoYXQgdGhlIHRlc3QgaHR0cHMKICBzZXJ2ZXIgaXMgc2V0IHVwLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBIb25vdXIgLS1mdHAtc3NsLWNvbnRyb2wgb24gZnRwczovLyBVUkxzIHRvIGFsbG93IGVuY3J5cHRlZCBjb250cm9sIGFuZAogIHVuZW5jcnlwdGVkIGRhdGEgY29ubmVjdGlvbnMuCgpEYW4gRiAoNiBNYXJjaCAyMDA3KQotIEZpeGVkIGEgY291cGxlIG9mIGltcHJvcGVyIHBvaW50ZXIgdXNlcyBkZXRlY3RlZCBieSB2YWxncmluZCBpbiB0ZXN0CiAgY2FzZXMgMTgxICYgMjE2LgoKRGFuaWVsICgyIE1hcmNoIDIwMDcpCi0gUm9iZXJ0IEEuIE1vbmF0IGFuZCBTaG11bGlrIFJlZ2V2IGhlbHBlZCBvdXQgdG8gZml4IHRoZSBuZXcgKi9NYWtlZmlsZS52YzgKICBtYWtlZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSByZWxlYXNlIGFyY2hpdmVzLCBnZW5lcmF0ZWQgZnJvbQogIHRoZSBNYWtlZmlsZS52YzYgZmlsZXMgYnkgdGhlIG1ha2V0Z3ogc2NyaXB0LiBJIGFsc28gbW9kaWZpZWQgdGhlIHJvb3QKICBNYWtlZmlsZSB0byBoYXZlIGEgVkMgdmFyaWFibGUgdGhhdCBkZWZhdWx0cyB0byB2YzYgYnV0IGNhbiBiZSBvdmVycmlkZGVuIHRvCiAgYWxsb3cgaXQgdG8gYmUgdXNlZCBmb3IgdmM4IGFzIHdlbGwuIExpa2UgdGhpczoKCiAgICBubWFrZSBWQz12YzggdmMKCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNykKLSBIYW5nIEtpbiBMYXUgZm91bmQgYW5kIGZpeGVkOiBXaGVuIEkgdXNlIGxpYmN1cmwgdG8gY29ubmVjdCB0byBhbiBodHRwcwogIHNlcnZlciB0aHJvdWdoIGEgcHJveHkgYW5kIGhhdmUgdGhlIHJlbW90ZSBodHRwcyBzZXJ2ZXIgcG9ydCBzZXQgdXNpbmcgdGhlCiAgQ1VSTE9QVF9QT1JUIG9wdGlvbiwgcHJvdG9jb2wgZ2V0cyByZXNldCB0byBodHRwIGZyb20gaHR0cHMgYWZ0ZXIgdGhlIGZpcnN0CiAgcmVxdWVzdC4KIAogIFVzZXIgZGVmaW5lZCBVUkwgd2FzIG1vZGlmaWVkIGludGVybmFsbHkgYnkgbGliY3VybCBhbmQgc3Vic2VxdWVudCByZXVzZSBvZgogIHRoZSBlYXN5IGhhbmRsZSBtYXkgbGVhZCB0byBjb25uZWN0aW9uIHVzaW5nIGEgZGlmZmVyZW50IHByb3RvY29sIChpZiBub3QKICBvcmlnaW5hbGx5IGh0dHApLgogCiAgSSBmb3VuZCB0aGF0IGxpYmN1cmwgaGFyZGNvZGVkIHRoZSBwcm90b2NvbCB0byAiaHR0cCIgd2hlbiBpdCB0cmllcyB0bwogIHJlZ2VuZXJhdGUgdGhlIFVSTCBpZiBDVVJMT1BUX1BPUlQgaXMgc2V0LiBJIHRyaWVkIHRvIGZpeCB0aGUgcHJvYmxlbSBhcwogIGZvbGxvd3MgYW5kIGl0J3Mgd29ya2luZyBmaW5lIHNvIGZhcgoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA3KQotIEFkYW0gRC4gTW9zcyBtYWRlIHRoZSBIVFRQIENPTk5FQ1QgcHJvY2VkdXJlIGxlc3MgYmxvY2tpbmcgd2hlbiB1c2VkIGZyb20KICB0aGUgbXVsdGkgaW50ZXJmYWNlLiBOb3RlIHRoYXQgaXQgc3RpbGwgZG9lcyBhIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gaW4gYQogIGJsb2NraW5nIG1hbm5lci4KCkRhbmllbCAoMjMgRmVicnVhcnkgMjAwNykKLSBBZGRlZCB3YXJuaW5nIG91dHB1dHMgaWYgdGhlIGNvbW1hbmQgbGluZSB1c2VzIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnMKICAtdiwgLS10cmFjZSBhbmQgLS10cmFjZS1hc2NpaSwgc2luY2UgaXQgY291bGQgcmVhbGx5IGNvbmZ1c2UgdGhlIHVzZXIuCiAgQ2xhcmlmaWVkIHRoaXMgZmFjdCBpbiB0aGUgbWFuIHBhZ2UuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgd29yayBvbiBsaWJjdXJsIG1ha2luZyBwaXBlbGluaW5nIG1vcmUgcm9idXN0IGFuZAogIGZpeGluZyBzb21lIGJ1Z3M6CiAgbyBEb24ndCBtaXggR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGluIGEgcGlwZWxpbmUKICBvIEZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggcmVxdWVzdHMgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgcGlwZWxpbmUKICBvIEZpeGVkIHNldmVyYWwgY3VybCBidWdzIHdpdGggcGlwZWxpbmluZyB3aGVuIHRoZSBzZXJ2ZXIgaXMgcmV0dXJuaW5nCiAgICBjaHVua2VkIGVuY29kaW5nOgogICAgKiBBZGRlZCBzdGF0ZXMgdG8gY2h1bmtlZCBwYXJzaW5nIGZvciBmaW5hbCBDUkxGCiAgICAqIFJld2luZCBidWZmZXIgYWZ0ZXIgcGFyc2luZyBjaHVuayB3aXRoIGRhdGEgcmVtYWluaW5nCiAgICAqIE1vdmVkIGNodW5rZWQgaGVhZGVyIGluaXRpYWxpemluZyB0byBhIHNwb3QganVzdCBiZWZvcmUgcmVjZWl2aW5nCiAgICAgIGhlYWRlcnMKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGNoYW5nZWQgdGhlIENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIHRvIGhhbmRsZQogIGFjdGl2ZSBhbmQgcGFzc2l2ZSBDQ0Mgc2h1dGRvd24gYW5kIGFkZGVkIHRoZSAtLWZ0cC1zc2wtY2NjLW1vZGUgY29tbWFuZAogIGxpbmUgb3B0aW9uLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA3KQotIElhbiBUdXJuZXIgZml4ZWQgdGhlIGxpYmN1cmwubTQgbWFjcm8ncyBzdXBwb3J0IGZvciAtLXdpdGgtbGliY3VybC4KCi0gU2htdWxpayBSZWdldiBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHJlLXVzZWQgSFRUUFMgY29ubmVjdGlvbnMsIGF0IGxlYXN0CiAgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIG1hZGUgcGFzc2l2ZSBGVFAgdHJhbnNmZXJzIHdvcmsgd2l0aCBTT0NLUyAoYm90aCA0IGFuZAogIDUpLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA3KQotIEplZmYgUG9obG1leWVyIGlkZW50aWZpZWQgdHdvIHByb2JsZW1zOiBmaXJzdCBhIHJhdGhlciBvYnNjdXJlIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Rpb24gcmUtdXNlIHRoYXQgY291bGQgbWFrZSBhCiAgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgcnVpbiBhIHBvaW50ZXIgaW4gYW5vdGhlciBoYW5kbGUuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSB3YXMgbGVzcyBvZiBhbiBhY3R1YWwgcHJvYmxlbSBidXQgbW9yZSBvZiBtaW5vciBxdWlyazoKICB0aGUgcmUtdXNpbmcgb2YgY29ubmVjdGlvbnMgd2Fzbid0IHByb3Blcmx5IGNoZWNraW5nIGlmIHRoZSBjb25uZWN0aW9uIHdhcwogIG1hcmtlZCBmb3IgY2xvc3VyZS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNykKLSBEdW5jYW4gTWFjLVZpY2FyIFByZXR0IGFuZCBNaWNoYWwgTWFyZWsgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCByZXNldHRpbmcKICBDVVJMT1BUX1JBTkdFIGJhY2sgdG8gbm8gcmFuZ2Ugb24gYW4gZWFzeSBoYW5kbGUgd2hlbiB1c2luZyBGVFAuCgpEYW4gRiAoMTQgRmVicnVhcnkgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWxpYnMgc28gaXQgZG9lc24ndCBsaXN0IHVubmVjZXNzYXJ5IGxpYnJhcmllcyAoYW5kCiAgdGhlcmVmb3JlIGludHJvZHVjZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMpIHdoZW4gaXQncyBub3QgbmVlZGVkLgogIEFsc28sIGRvbid0IGJvdGhlciBhZGRpbmcgYSBsaWJyYXJ5IHBhdGggb2YgL3Vzci9saWIKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNykKLSBUaGUgZGVmYXVsdCBwYXNzd29yZCBmb3IgYW5vbnltb3VzIEZUUCBjb25uZWN0aW9ucyBpcyBub3cgY2hhbmdlZCB0byBiZQogICJmdHBAZXhhbXBsZS5jb20iLgoKLSBSb2JlcnQgQS4gTW9uYXQgbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBWQzIwMDUgLSBpdCBkb2Vzbid0IGhhdmUKICBnbXRpbWVfcigpIGxpa2UgdGhlIG9sZGVyIFZDIHZlcnNpb25zLiBIZSBhbHNvIG1hZGUgdXNlIG9mIHNvbWUgbWFjaGluZS0KICBzcGVjaWZpYyBkZWZpbmVzIHRvIGRpZmZlcmVudGlhdGUgdGhlICJPUyIgZGVmaW5lLgoKRGFuaWVsICgxMiBGZWJydWFyeSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGFkZGVkIHN1cHBvcnQgZm9yIE5TUyAoTmV0d29yayBTZWN1cml0eSBTZXJ2aWNlKSBmb3IgdGhlCiAgU1NML1RMUyBsYXllci4gaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9wa2kvbnNzLwoKICBUaGlzIGlzIHRoZSBmb3VydGggc3VwcG9ydGVkIGxpYnJhcnkgZm9yIFRMUy9TU0wgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIQoKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIENSTEYgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFyZSBzZW50CiAgdG8gdGhlIGRlYnVnIGNhbGxiYWNrLgoKLSBTaG11bGlrIFJlZ2V2IGFkZGVkIENVUkxPUFRfSFRUUF9DT05URU5UX0RFQ09ESU5HIGFuZAogIENVUkxPUFRfSFRUUF9UUkFOU0ZFUl9ERUNPRElORyB0aGF0IGlmIHNldCB0byB6ZXJvIHdpbGwgZGlzYWJsZSBsaWJjdXJsJ3MKICBpbnRlcm5hbCBkZWNvZGluZyBvZiBjb250ZW50IG9yIHRyYW5zZmVyIGVuY29kZWQgY29udGVudC4gVGhpcyBtYXkgYmUKICBwcmVmZXJhYmxlIGluIGNhc2VzIHdoZXJlIHlvdSB1c2UgbGliY3VybCBmb3IgcHJveHkgcHVycG9zZXMgb3Igc2ltaWxhci4gVGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgZ290IGEgLS1yYXcgb3B0aW9uIHRvIGRpc2FibGUgYm90aCBhdCBvbmNlLgoKLSByZWxlYXNlIHRhcmJhbGxzIG1hZGUgd2l0aCBtYWtldGd6IHdpbGwgZnJvbSBub3cgb24gaGF2ZSBhIExJQkNVUkxfVElNRVNUQU1QCiAgZGVmaW5lIHNldCB0byBob2xkIHRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIG9mIHdoZW4gdGhlIHRhcmJhbGwgd2FzIGJ1aWx0LCBhcwogIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHVzaW5nIHRoZSBVVEMgdGltZSB6b25lLgogIAotIEplZmYgUG9obG1leWVyIGZpeGVkIGEgZmxhdyBpbiBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSB3aGVuIGFkZGluZyBhIGhhbmRsZQogIHRoYXQgaGFzIGFuIGVhc3kgaGFuZGxlIHByZXNlbnQgaW4gdGhlICJjbG9zdXJlIiBsaXN0IHBlbmRpbmcgY2xvc3VyZS4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDA3KQotIFJlZ3VsYXIgZmlsZSBkb3dubG9hZHMgd2lodCBTRlRQIGFuZCBTQ1AgYXJlIG5vdyBkb25lIHVzaW5nIHRoZSBub24tYmxvY2tpbmcKICBBUEkgb2YgbGlic3NoMiwgaWYgdGhlIGxpYnNzaDIgaGVhZGVycyBzZWVtIHRvIHN1cHBvcnQgdGhlbS4gVGhpcyB3aWxsIG1ha2UKICBTQ1AgYW5kIFNGVFAgbXVjaCBtb3JlIHJlc3BvbnNpdmUgYW5kIGJldHRlciBsaWJjdXJsIGNpdGl6ZW5zIHdoZW4gdXNlZCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBldGMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9USU1FT1VUX01TIGFuZAogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMgdGhhdCwgYXMgdGhlaXIgbmFtZXMgc3VnZ2VzdCwgZG8gdGhlIHRpbWVvdXRzIHdpdGgKICBtaWxsaXNlY29uZCByZXNvbHV0aW9uLiBUaGUgb25seSByZXN0cmljdGlvbiB0byB0aGF0IGlzIHRoZSBhbGFybSgpCiAgKHNvbWV0aW1lcykgdXNlZCB0byBhYm9ydCBuYW1lIHJlc29sdmVzIGFzIHRoYXQgdXNlcyBmdWxsIHNlY29uZHMuIEkgZml4ZWQKICB0aGUgRlRQIHJlc3BvbnNlIHRpbWVvdXQgcGFydCBvZiB0aGUgcGF0Y2guCgogIEludGVybmFsbHkgd2Ugbm93IGNvdW50IGFuZCBrZWVwIHRoZSB0aW1lb3V0cyBpbiBtaWxsaXNlY29uZHMgYnV0IGl0IGFsc28KICBtZWFucyB3ZSBtdWx0aXBseSBzZXQgdGltZW91dHMgd2l0aCAxMDAwLiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBubwogIHRpbWVvdXQgY2FuIGJlIHNldCB0byBtb3JlIHRoYW4gMl4zMSBtaWxsaXNlY29uZHMgKG9uIDMyIGJpdCBzeXN0ZW1zKSwgd2hpY2gKICBlcXVhbHMgMjQuODYgZGF5cy4gIFdlIHByb2JhYmx5IGNvdWxkbid0IGJlZm9yZSBlaXRoZXIgc2luY2UgdGhlIGNvZGUgZGlkCiAgKjEwMDAgb24gdGhlIHRpbWVvdXQgdmFsdWVzIG9uIHNldmVyYWwgcGxhY2VzIGFscmVhZHkuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNykKLSBZYW5nIFRzZSBmaXhlZCB0aGUgY29va2llIGV4cGlyeSBkYXRlIGluIHNldmVyYWwgdGVzdCBjYXNlcyB0aGF0IHN0YXJ0ZWQgdG8KICBmYWlsIHNpbmNlIHRoZXkgdXNlZCAiMSBmZWIgMjAwNyIuLi4KCi0gTWFuZnJlZCBTY2h3YXJiIHJlcG9ydGVkIHRoYXQgc29ja3M1IHN1cHBvcnQgd2FzIGJyb2tlbiBhbmQgaGVscCB1cyBwaW5wb2ludAogIHRoZSBwcm9ibGVtLiBUaGUgY29kZSBub3cgdHJpZXMgaGFyZGVyIHRvIHVzZSBodHRwcm94eSBhbmQgcHJveHkgd2hlcmUKICBhcHBwcm9wcmlhdGUsIGFzIG5vdCBhbGwgcHJveGllcyBhcmUgSFRUUC4uLgoKVmVyc2lvbiA3LjE2LjEgKDI5IEphbnVhcnkgMjAwNykKCkRhbmllbCAoMjkgSmFudWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBDT05ORUNUIHdpdGggYSBjdXN0b20gVXNlci1BZ2VudAogIGhlYWRlciwgeW91IGdvdCBfdHdvXyBVc2VyLUFnZW50IGhlYWRlcnMgaW4gdGhlIENPTk5FQ1QgcmVxdWVzdC4uLiEgQWRkZWQKICB0ZXN0IGNhc2UgMjg3IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDcpCi0gY3VybF9lYXN5X3Jlc2V0KCkgbm93IHJlc2V0cyB0aGUgQ0EgYnVuZGxlIHBhdGggY29ycmVjdGx5LgoKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCB0aGUgQ3VybCBjb21tYW5kIGxpbmUgdG9vbCBmb3IgSFRUUCBvbiBub24tQVNDSUkKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwNykKLSBBZGRlZCB0aGUgLS1saWJjdXJsIFtmaWxlXSBvcHRpb24gdG8gY3VybC4gQXBwZW5kIHRoaXMgb3B0aW9uIHRvIGFueQogIG9yZGluYXJ5IGN1cmwgY29tbWFuZCBsaW5lLCBhbmQgeW91IHdpbGwgZ2V0IGEgbGliY3VybC11c2luZyBzb3VyY2UgY29kZQogIHdyaXR0ZW4gdG8gdGhlIGZpbGUgdGhhdCBkb2VzIHRoZSBlcXVpdmFsZW50IG9wZXJhdGlvbiBvZiB3aGF0IHlvdXIgY29tbWFuZAogIGxpbmUgb3BlcmF0aW9uIGRvZXMhCgpEYW4gRiAoMjQgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgZGFuZ2xpbmcgcG9pbnRlciBwcm9ibGVtIHRoYXQgcHJldmVudGVkIHRoZSBodHRwX3Byb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGUgZnJvbSBiZWluZyBwcm9wZXJseSB1c2VkIGluIG1hbnkgY2FzZXMgKGFuZCBjYXVzZWQgdGVzdCBjYXNlIDYzCiAgdG8gZmFpbCkuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBkaWQgTlRMTSBjaGFuZ2VzIG1haW5seSBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtczoKCiAgIzEKICBUaGVyZSdzIGEgY29tcGlsYXRpb24gZXJyb3IgaW4gaHR0cF9udGxtLmMgaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBOT1QKICBkZWZpbmVkLiAgSSBub3RpY2VkIHRoaXMgd2hpbGUgdGVzdGluZyB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLiAgTGluZSA4Njcgb2YKICB0aGUgY3VycmVudCBodHRwX250bG0uYyBpcyBhIGNsb3NpbmcgYnJhY2tldCBmb3IgYW4gaWYvZWxzZSBwYWlyIHRoYXQgb25seQogIGdldHMgY29tcGlsZWQgaW4gaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBkZWZpbmVkLiAgQnV0IHRoaXMgY2xvc2luZyBicmFja2V0CiAgd2Fzbid0IGluIGFuICNpZmRlZiBzbyB0aGUgY29kZSBmYWlscyB0byBjb21waWxlIHVubGVzcyBVU0VfTlRMTTJTRVNTSU9OIHdhcwogIGRlZmluZWQuICBMaW5lcyAxOTggYW5kIDE0MCBvZiBteSBwYXRjaCB3cmFwcyB0aGF0IGNsb3NpbmcgYnJhY2tldCBpbiBhbgogICNpZmRlZiBVU0VfTlRMTTJTRVNTSU9OLgoKICAjMgogIEkgbm90aWNlZCBzZXZlcmFsIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gREVCVUdfTUUgaXMgZGVmaW5lZC4gIEkndmUKICBmaXhlZCB0aGVtIHdpdGggY2FzdGluZy4gIEJ5IHRoZSB3YXksIERFQlVHX01FIHdhcyBhIGh1Z2UgaGVscCBpbgogIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlLgoKICAjMwogIEhvcGVmdWxseSB0aGUgbGFzdCBub24tQVNDSUkgY29udmVyc2lvbiBwYXRjaCBmb3IgbGliY3VybCBpbiBhIHdoaWxlLiAgSQogIGNoYW5nZWQgdGhlICJOVExNU1NQIiBsaXRlcmFsIHRvIGhleCBzaW5jZSB0aGlzIHNpZ25hdHVyZSBtdXN0IGFsd2F5cyBiZSBpbgogIEFTQ0lJLgoKICBDb252ZXJzaW9uIGNvZGUgd2FzIHN0cmF0ZWdpY2FsbHkgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LiAgQW5kIHRoZQogIEN1cmxfYmFzZTY0X2VuY29kZSBjYWxscyB3ZXJlIGNoYW5nZWQgc28gdGhlIGJpbmFyeSAiYmxvYnMiIGh0dHBfbnRsbS5jCiAgY3JlYXRlcyBhcmUgTk9UIHRyYW5zbGF0ZWQgb24gbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbiBGICgyMiBKYW51YXJ5IDIwMDcpCi0gQ29udmVydGVkIChtb3N0IG9mKSB0aGUgdGVzdCBkYXRhIGZpbGVzIGludG8gZ2VudWluZSBYTUwuICBBIGhhbmRmdWwgc3RpbGwKICBhcmUgbm90LCBkdWUgbWFpbmx5IHRvIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIFhNTCBjaGFyYWN0ZXIgZW50aXRpZXMKICAoZS5nLiAmID0+ICZhbXA7ICkuICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gdmFsaWRhdGUgdGVzdCBmaWxlcyB1c2luZwogIHRvb2xzIGxpa2UgeG1sbGludCwgYXMgd2VsbCBhcyB0byBlZGl0IGFuZCB2aWV3IHRoZW0gdXNpbmcgWE1MIHRvb2xzLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDcpCi0gQXJtZWwgQXNzZWxpbiBpbXByb3ZlZCBsaWJjdXJsIHRvIGJlaGF2ZSBhIGxvdCBiZXR0ZXIgd2hlbiBhbiBlYXN5IGhhbmRsZQogIGRvaW5nIGFuIEZUUCB0cmFuc2ZlciBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZQogIGZpeCBhbHNvIGZpeGVkIHRoZSAiYWxpdmUgY291bnRlciIgdG8gYmUgY29ycmVjdCBvbiAicHJlbWF0dXJlIHJlbW92YWwiIGZvcgogIGFsbCBwcm90b2NvbHMuCgpEYW4gRiAoMTYgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsgaW4gdGZ0cCB1cGxvYWRzIGRpc2NvdmVyZWQgYnkgY3VybCdzIG1lbW9yeSBsZWFrCiAgZGV0ZWN0b3IuICBBbHNvIGNoYW5nZWQgdGZ0cCBkb3dubG9hZHMgdG8gVVJMLXVuZXNjYXBlIHRoZSBkb3dubG9hZGVkCiAgZmlsZSBuYW1lLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgcHJvdmlkZWQgbGliY3VybCBjaGFuZ2VzIGZvciBkb2luZyBIVFRQIGNvbW11bmljYXRpb24gb24KICBub24tQVNDSUkgcGxhdGZvcm1zLiBJdCBkb2VzIGFkZCBzb21lIGNvbXBsZXhpdHksIG1vc3Qgbm90YWJseSB3aXRoIG1vcmUKICAjaWZkZWZzLCBidXQgSSB3YW50IHRvIHNlZSB0aGlzIHN1cHBvcnRlZCBhZGRlZCBhbmQgSSBjYW4ndCBzZWUgaG93IHdlIGNhbgogIGFkZCBpdCB3aXRob3V0IHRoZSBleHRyYSBzdHVmZiBhZGRlZC4KCi0gU2V0dGluZyBDVVJMT1BUX0NPT0tJRUxJU1QgdG8gIkFMTCIgd2hlbiBubyBjb29raWVzIGF0IGFsbCB3YXMgcHJlc2VudCwKICBsaWJjdXJsIHdvdWxkIGNyYXNoIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYSBOVUxMIHBvaW50ZXIuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNykKLSBUb2J5IFBldGVyc29uIGZvdW5kIGEgbmFzdHkgYnVnIHRoYXQgcHJldmVudGVkIChsaWIpY3VybCBmcm9tIHByb3Blcmx5CiAgZG93bmxvYWRpbmcgKG1vc3QpIHRoaW5ncyB0aGF0IHdlcmUgbGFyZ2VyIHRoYW4gNEdCIG9uIDMyIGJpdCBzeXN0ZW1zLiAgTWF0dAogIFdpdGhlcnNwb29uIGhlbHBlZCBhcyBuYXJyb3cgZG93biB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBpbnRyb2R1Y2VkIHRoZSAtLWZ0cC1zc2wtY2NjIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KICBjdXJsIHRoYXQgdXNlcyB0aGUgbmV3IENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIGluIGxpYmN1cmwuIElmIGVuYWJsZWQsIGl0CiAgd2lsbCBtYWtlIGxpYmN1cmwgc2h1dGRvd24gU1NML1RMUyBhZnRlciB0aGUgYXV0aGVudGljYXRpb24gaXMgZG9uZSBvbiBhCiAgRlRQLVNTTCBvcGVyYXRpb24uCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IG1hZGUgY2hhbmdlcyB0byBhbGxvdyBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgdG8gd29yayBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA3KQotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgdGhlIGZsYXcgd2hpY2ggbWFkZSBsaWJjdXJsIDcuMTYuMCBhbHdheXMgc3RvcmUKICBkb3dubG9hZGVkIGRhdGEgaW4gdHdvIGJ1ZmZlcnMsIGp1c3QgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggYSBzcGVjaWFsIEhUVFAKICBwaXBlbGluaW5nIGNhc2UuIFRoYXQgaXMgbm93IG9ubHkgYWN0aXZhdGVkIGZvciBwaXBlbGluZWQgdHJhbnNmZXJzLiBJbgogIE1hdHQncyBjYXNlLCBpdCBzaG93ZWQgYXMgYSBjb25zaWRlcmFibGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSwKCkRhbmllbCAoMiBKYW51YXJ5IDIwMDcpCi0gVmljdG9yIFNuZXpoa28gaGVscGVkIHVzIGZpeCBidWcgcmVwb3J0ICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIChrbm93biBidWcgIzM2KSAtLWxpbWl0LXJhdGUKICAoQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRSBhbmQgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSkgYXJlIGJyb2tlbgogIG9uIFdpbmRvd3MgKHNpbmNlIDcuMTYuMCwgYnV0IHRoYXQncyB3aGVuIHRoZXkgd2VyZSBpbnRyb2R1Y2VkIGFzIHByZXZpb3VzCiAgdG8gdGhhdCB0aGUgbGltaXRpbmcgbG9naWMgd2FzIG1hZGUgaW4gdGhlIGFwcGxpY2F0aW9uIG9ubHkgYW5kIG5vdCBpbiB0aGUKICBsaWJyYXJ5KS4gSXQgd2FzIGFjdHVhbGx5IGFsc28gYnJva2VuIG9uIHNlbGVjdCgpLWJhc2VkIHN5c3RlbXMgKGFzIGFwcG9zZWQKICB0byBwb2xsKCkpIGJ1dCB3ZSBoYXZlbid0IGhhZCBhbnkgc3VjaCByZXBvcnRzLiBXZSBub3cgdXNlIHNlbGVjdCgpLCBTbGVlcCgpCiAgb3IgZGVsYXkoKSBwcm9wZXJseSB0byBzbGVlcCBhIHdoaWxlIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55dGhpbmcgaW5wdXQgb3IKICBvdXRwdXQgd2hlbiB0aGUgcmF0ZSBsaW1pdGluZyBpcyBhY3RpdmF0ZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UuCgotIE1vZGlmaWVkIGxpYmN1cmwucGMuaW4gdG8gdXNlIExpYnMucHJpdmF0ZSBmb3IgdGhlIGxpYnMgbGliY3VybCBpdHNlbGYgbmVlZHMKICB0byBnZXQgYnVpbHQgc3RhdGljLiBJdCBoYXMgYmVlbiBtZW50aW9uZWQgYmVmb3JlIGFuZCB3YXMgYWdhaW4gYnJvdWdodCB0bwogIG91ciBhdHRlbnRpb24gYnkgTmF0aGFuYWVsIE5lcm9kZSB3aG8gZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzQwNTIyNgogIChodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDA1MjI2KS4KCkRhbmllbCAoMjkgRGVjZW1iZXIgMjAwNikKLSBNYWtlIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBzZXQgdGhlIG1hZ2ljIG51bWJlciBpbiB0aGUgbmV3IGhhbmRsZS4KCkRhbmllbCAoMjIgRGVjZW1iZXIgMjAwNikKLSBSb2JlcnQgRm9yZW1hbiBwcm92aWRlZCBhIHByaW1lIGV4YW1wbGUgc25pcHBldCBzaG93aW5nIGhvdyBsaWJjdXJsIHdvdWxkCiAgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgYWNrbm93bGVkZ2UgdGhlICdub19wcm94eScgdmFyaWFibGUgcHJvcGVybHkgb25jZSBpdAogIGhhZCB1c2VkIHRoZSBwcm94eSBhbmQgeW91IHJlLXVzZWQgdGhlIHNhbWUgZWFzeSBoYW5kbGUuIEkgbWFkZSBzdXJlIHRoZQogIHByb3h5IG5hbWUgaXMgcHJvcGVybHkgc3RvcmVkIGluIHRoZSBjb25uZWN0IHN0cnVjdCByYXRoZXIgdGhhbiB0aGUKICBzZXNzaW9uaGFuZGxlL2Vhc3kgc3RydWN0LgoKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGJhZCBjYWxsIHRvIGdldHNvY2tuYW1lKCkgdGhhdCB3cm9uZ2x5IHVzZWQgYSBzaXplX3QKICB2YXJpYWJsZSB0byBwb2ludCB0byB3aGVuIGl0IHNob3VsZCBiZSBhIHNvY2tsZW5fdC4KCi0gV2hlbiBzZXR0aW5nIGEgcHJveHkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIChmb3IgZXhhbXBsZSkgcnVubmluZwogICdjdXJsIFtVUkxdJyB3aXRoIGEgVVJMIHdpdGhvdXQgYSBwcm90b2NvbCBwcmVmaXgsIGN1cmwgd291bGQgbm90IHNlbmQgYQogIGNvcnJlY3QgcmVxdWVzdCBhcyBpdCBmYWlsZWQgdG8gYWRkIHRoZSBwcm90b2NvbCBwcmVmaXguCgpEYW5pZWwgKDIxIERlY2VtYmVyIDIwMDYpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyByZXBvcnRlZCBidWcgIzE2MTgzNTkKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYxODM1OSkgYW5kIHN1YnNlcXVlbnRseSBwcm92aWRlZCBhCiAgcGF0Y2ggZm9yIGl0OiB3aGVuIGRvd25sb2FkaW5nIDIgemVybyBieXRlIGZpbGVzIGluIGEgcm93LCBjdXJsIDcuMTYuMAogIGVudGVycyBhbiBpbmZpbml0ZSBsb29wLCB3aGlsZSBjdXJsIDcuMTYuMS0yMDA2MTIxOCBkb2VzIG9uZSBhZGRpdGlvbmFsCiAgdW5uZWNlc3NhcnkgcmVxdWVzdC4KCiAgRml4OiBEdXJpbmcgdGhlICJNYWpvciBvdmVyaGF1bCBpbnRyb2R1Y2luZyBodHRwIHBpcGVsaW5pbmcgc3VwcG9ydCBhbmQKICBzaGFyZWQgY29ubmVjdGlvbiBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZS4iIGNoYW5nZSwgaGVhZGVyYnl0ZWNvdW50CiAgd2FzIG1vdmVkIHRvIGxpdmUgaW4gdGhlIEN1cmxfdHJhbnNmZXJfa2VlcGVyIHN0cnVjdHVyZS4gQnV0IHRoYXQgc3RydWN0dXJlCiAgaXMgcmVzZXQgaW4gdGhlIFRyYW5zZmVyIG1ldGhvZCwgbG9zaW5nIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhZCBhYm91dAogIHRoZSBoZWFkZXIgc2l6ZS4gVGhpcyBwYXRjaCBtb3ZlcyBpdCBiYWNrIHRvIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QuCgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDYpCi0gQnJlbmRhbiBKdXJkIHByb3ZpZGVkIGEgZml4IHRoYXQgbm93IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBnZXR0aW5nIGEgU0lHUElQRQogIGR1cmluZyBjZXJ0YWluIGNvbmRpdGlvbnMgd2hlbiBHbnVUTFMgaXMgdXNlZC4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwNikKLSBBbGV4ZXkgU2ltYWsgZm91bmQgb3V0IHRoYXQgd2hlbiBkb2luZyBGVFAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZAogIHNvbWV0aGluZyB3ZW50IHdyb25nIGxpa2UgaXQgZ290IGEgYmFkIHJlc3BvbnNlIGNvZGUgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsCiAgbGliY3VybCB3b3VsZCBsZWFrIG1lbW9yeS4gQWRkZWQgdGVzdCBjYXNlIDUzOCB0byB2ZXJpZnkgdGhlIGZpeC4KCiAgSSBhbHNvIG5vdGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd291bGQgZ2V0IGNhY2hlZCBpbiB0aGF0IGNhc2UsIHdoaWNoCiAgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlIGl0IGNhbm5vdCBiZSByZS11c2Ugd2hlbiB0aGUgYXV0aGVudGljYXRpb24gaGFzCiAgZmFpbGVkLiBJIGZpeGVkIHRoYXQgaXNzdWUgdG9vIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBhbHNvIHRoYXQgdGhlIHBhdGgKICB3b3VsZCBiZSAicmVtZW1iZXJlZCIgaW4gdmFpbiBmb3IgY2FzZXMgd2hlcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGFib3V0IHRvCiAgZ2V0IGNsb3NlZC4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDA2KQotIFNlYmFzdGllbiBXaWxsZW1pam5zIHJlcG9ydGVkIGJ1ZyAjMTYwMzcxMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjAzNzEyKSB3aGljaCBpcyBhYm91dCBjb25uZWN0aW9ucwogIGdldHRpbmcgY3V0IG9mZiBwcmVtYXR1cmVseSB3aGVuIC0tbGltaXQtcmF0ZSBpcyB1c2VkLiBXaGlsZSBJIGZvdW5kIG5vIHN1Y2gKICBwcm9ibGVtcyBpbiBteSB0ZXN0cyBub3IgaW4gbXkgcmVhZGluZyBvZiB0aGUgY29kZSwgSSBmb3VuZCB0aGF0IHRoZQogIC0tbGltaXQtcmF0ZSBjb2RlIHdhcyBzZXZlcmx5IGZsYXdlZCAoc2luY2UgaXQgd2FzIG1vdmVkIGludG8gdGhlIGxpYiwgc2luY2UKICA3LjE1LjUpIHdoZW4gdXNlZCB3aXRoIHRoZSBlYXN5IGludGVyZmFjZSBhbmQgaXQgZGlkbid0IHdvcmsgYXMgZG9jdW1lbnRlZAogIHNvIEkgcmV3b3JrZWQgaXQgc29tZXdoYXQgYW5kIG5vdyBpdCB3b3JrcyBmb3IgbXkgdGVzdHMuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwNikKLSBTdGVmYW4gS3JhdXNlIHBvaW50ZWQgb3V0IGEgY29tcGlsZXIgd2FybmluZyB3aXRoIGEgcGlja3kgTVNDViBjb21waWxlciB3aGVuCiAgcGFzc2luZyBhIGN1cmxfb2ZmX3QgYXJndW1lbnQgdG8gdGhlIEN1cmxfcmVhZF9yZXdpbmQoKSBmdW5jdGlvbiB3aGljaCB0YWtlcwogIGFuIHNpemVfdCBhcmd1bWVudC4gQ3VybF9yZWFkX3Jld2luZCgpIGFsc28gaGFkIGRlYnVnIGNvZGUgbGVmdCBpbiBpdCBhbmQgaXQKICB3YXMgcHV0IGluIGEgZGlmZmVyZW50IHNvdXJjZSBmaWxlIHdpdGggbm8gZ29vZCByZWFzb24gd2hlbiBvbmx5IHVzZWQgZnJvbQogIG9uZSBzaW5nbGUgc3BvdC4KCi0gU2ggRGlhbyByZXBvcnRlZCB0aGF0IENVUkxPUFRfQ0xPU0VQT0xJQ1kgZG9lc24ndCB3b3JrLCBhbmQgaW5kZWVkLCB0aGVyZSBpcwogIG5vIGNvZGUgcHJlc2VudCBpbiB0aGUgbGlicmFyeSB0aGF0IHJlY2VpdmVzIHRoZSBvcHRpb24uIFNpbmNlIGl0IHdhcyBub3QKICBwb3NzaWJsZSB0byB1c2UsIHdlIGtub3cgdGhhdCBubyBjdXJyZW50IHVzZXJzIGV4aXN0IGFuZCB0aHVzIHdlIHNpbXBseQogIHJlbW92ZWQgaXQgZnJvbSB0aGUgZG9jcyBhbmQgbWFkZSB0aGUgY29kZSBhbHdheXMgdXNlIHRoZSBkZWZhdWx0IHBhdGggb2YKICB0aGUgY29kZS4KCi0gSmFyZWQgTHVuZGVsbCBmaWxlZCBidWcgcmVwb3J0ICMxNjA0OTU2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDQ5NTYpIHdoaWNoIGlkZW50aWZpZWQgc2V0dGluZwogIENVUkxPUFRfTUFYQ09OTkVDVFMgdG8gemVybyBjYXVzZWQgbGliY3VybCB0byBTSUdTRUdWLiBTdGFydGluZyBub3csIGxpYmN1cmwKICB3aWxsIGFsd2F5cyBpbnRlcm5hbGx5IHVzZSBubyBsZXNzIHRoYW4gMSBlbnRyeSBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZS4KCi0gU2ggRGlhbyByZXBvcnRlZCB0aGF0IENVUkxPUFRfRk9SQklEX1JFVVNFIG5vIHdvcmtzLCBhbmQgaW5kZWVkIGl0IGJyb2tlIGluCiAgdGhlIDcuMTYuMCByZWxlYXNlLgoKLSBNYXJ0aW4gU2tpbm5lciBicm91Z2h0IGJhY2sgYnVnIHJlcG9ydCAjMTIzMDExOCB0byBoYXVudCB1cyBvbmNlIGFnYWluLgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KSBjdXJsX2dldGRhdGUoKSBkaWQgbm90IHdvcmsKICBwcm9wZXJseSBmb3IgYWxsIGlucHV0IGRhdGVzIG9uIFdpbmRvd3MuIEl0IHdhcyBtb3N0bHkgc2VlbiBvbiBzb21lIFRaIHRpbWUKICB6b25lcyB1c2luZyBEU1QuIEx1Y2tpbHksIE1hcnRpbiBhbHNvIHByb3ZpZGVkIGEgZml4LgoKLSBBbGV4ZXkgU2ltYWsgZmlsZWQgYnVnIHJlcG9ydCAjMTYwMDQ0NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjAwNDQ3KSBpbiB3aGljaCBoZSBub3RlZCB0aGF0IGFjdGl2ZQogIEZUUCBjb25uZWN0aW9ucyBkb24ndCB3b3JrIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gVGhlIHByb2JsZW0gaXMgaGVyZQogIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZSBzdGF0ZSBtYWNoaW5lIGhhcyBhIHN0YXRlIGR1cmluZyB3aGljaCBpdCBjYW4gd2FpdAogIGZvciB0aGUgZGF0YSBjb25uZWN0aW9uIHRvIGNvbm5lY3QsIGJ1dCB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gaXMgbm90IGRvbmUgaW4KICB0aGUgc2FtZSBzdGVwIGluIHRoZSBzZXF1ZW5jZSBhcyB0aGUgcGFzc2l2ZSBvbmUgaXMgc28gaXQgZG9lc24ndCBxdWl0ZSB3b3JrCiAgZm9yIGFjdGl2ZS4gVGhlIGFjdGl2ZSBGVFAgY29kZSBzdGlsbCB1c2UgYSBibG9ja2luZyBmdW5jdGlvbiB0byBhbGxvdyB0aGUKICByZW1vdGUgc2VydmVyIHRvIGNvbm5lY3QuCgogIFRoZSBmaXggKHdvcmstYXJvdW5kIGlzIGEgYmV0dGVyIHdvcmQpIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gc2V0IHRoZQogIGJvb2xlYW4gcHJlbWF0dXJlbHkgdGhhdCB0aGUgZGF0YSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhhdCB0aGUgIndhaXQKICBmb3IgY29ubmVjdCIgcGhhc2UgZW5kcyBhdCBvbmNlLgoKICBUaGUgcHJvcGVyIGZpeCwgbGVmdCBmb3IgdGhlIGZ1dHVyZSwgaXMgb2YgY291cnNlIHRvIG1ha2UgdGhlIGFjdGl2ZSBGVFAKICBjYXNlIHRvIGFjdCBpbiBhIG5vbi1ibG9ja2luZyB3YXkgdG9vLgoKLSBNYXR0IFdpdGhlcnNwb29uIGZpeGVkIGEgcHJvYmxlbSBjYXNlIHdoZW4gdGhlIENQVSBsb2FkIHdlbnQgdG8gMTAwJSB3aGVuIGEKICBIVFRQIHVwbG9hZCB3YXMgZGlzY29ubmVjdGVkOgoKICAiV2hhdCBhcHBlYXJzIHRvIGJlIGhhcHBlbmluZyBpcyB0aGF0IG15IHN5c3RlbSAoTGludXggMi42LjE3IGFuZCAyLjYuMTMpIGlzCiAgc2V0dGluZyAqb25seSogUE9MTEhVUCBvbiBwb2xsKCkgd2hlbiB0aGUgY29uZGl0aW9ucyBpbiBteSBwcmV2aW91cyBtYWlsCiAgb2NjdXIuIEFzIHlvdSBjYW4gc2VlLCBzZWxlY3QuYzpDdXJsX3NlbGVjdCgpIGRvZXMgbm90IGNoZWNrIGZvciBQT0xMSFVQLiBTbwogIGJhc2ljYWxseSB3aGF0IHdhcyBoYXBwZW5pbmcsIGlzIHBvbGwoKSB3YXMgcmV0dXJuaW5nIGltbWVkaWF0ZWx5ICh3aXRoCiAgUE9MTEhVUCBzZXQpLCBidXQgd2hlbiBDdXJsX3NlbGVjdCgpIGxvb2tlZCBhdCB0aGUgYml0cywgbmVpdGhlciBQT0xMRVJSIG9yCiAgUE9MTE9VVCB3YXMgc2V0LiBUaGlzIHN0aWxsIGNhdXNlZCBDdXJsX3JlYWR3cml0ZSgpIHRvIGJlIGNhbGxlZCwgd2hpY2gKICBxdWlja2x5IHJldHVybmVkLiBUaGVuIHRoZSB0cmFuc2ZlcigpIGxvb3Aga2VwdCBjb250aW51aW5nIGF0IGZ1bGwgc3BlZWQKICBmb3JldmVyLiIKCkRhbmllbCAoMSBEZWNlbWJlciAyMDA2KQotIFRvb24gVmVyd2Flc3QgcmVwb3J0ZWQgdGhhdCB0aGVyZSBhcmUgc2VydmVycyB0aGF0IHNlbmQgdGhlIENvbnRlbnQtUmFuZ2U6CiAgaGVhZGVyIGluIGEgdGhpcmQsIG5vdCBzdXBwcG9ydGVkIGJ5IGxpYmN1cmwsIGZvcm1hdCBhbmQgd2UgYWdyZWVkIHRoYXQgd2UKICBjb3VsZCBtYWtlIHRoZSBwYXJzZXIgbW9yZSBmb3JnaXZpbmcgdG8gYWNjZXB0IGFsbCB0aGUgdGhyZWUgZm91bmQKICB2YXJpYXRpb25zLgoKRGFuaWVsICgyNSBOb3ZlbWJlciAyMDA2KQotIFZlbmthdCBBa2VsbGEgZm91bmQgb3V0IHRoYXQgbGliY3VybCBkaWQgbm90IGxpa2UgSFRUUCByZXNwb25zZXMgdGhhdCBzaW1wbHkKICByZXNwb25kZWQgd2l0aCBhIHNpbmdsZSBzdGF0dXMgbGluZSBhbmQgbm8gaGVhZGVycyBub3IgYm9keS4gU3RhcnRpbmcgbm93LCBhCiAgSFRUUCByZXNwb25zZSBvbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiAoaS5lIG5vdCBzZXQgdG8gYmUgY2xvc2VkIGFmdGVyIHRoZQogIHJlc3BvbnNlIGhhcyBiZWVuIHRha2VuIGNhcmUgb2YpIG11c3QgaGF2ZSBDb250ZW50LUxlbmd0aCBvciBjaHVua2VkCiAgZW5jb2Rpbmcgc2V0LCBvciBsaWJjdXJsIHdpbGwgc2ltcGx5IGFzc3VtZSB0aGF0IHRoZXJlIGlzIG5vIGJvZHkuCgogIFRvIG15IGhvcnJvciBJIGxlYXJuZWQgdGhhdCB3ZSBoYWQgbm8gbGVzcyB0aGFuIDU3KCEpIHRlc3QgY2FzZXMgdGhhdCBkaWQgYmFkCiAgSFRUUCByZXNwb25zZXMgbGlrZSB0aGlzLCBhbmQgZXZlbiB0aGUgdGVzdCBodHRwIHNlcnZlciAoc3dzKSByZXNwb25kZWQgYmFkbHkKICB3aGVuIHF1ZXJpZWQgYnkgdGhlIHRlc3Qgc3lzdGVtIGlmIGl0IGlzIHRoZSB0ZXN0IHN5c3RlbS4gU28gYWx0aG91Z2ggdGhlCiAgYWN0dWFsIGZpeCBmb3IgdGhlIHByb2JsZW0gd2FzIHRpbnksIGdvaW5nIHRocm91Z2ggYWxsIHRoZSBuZXdseSBmYWlsaW5nIHRlc3QKICBjYXNlcyBnb3QgcmVhbGx5IHBhaW5mdWwgYW5kIGJvcmluZy4KCkRhbmllbCAoMjQgTm92ZW1iZXIgMjAwNikKLSBKYW1lcyBIb3VzbGV5IGRpZCBsb3RzIG9mIHdvcmsgYW5kIGludHJvZHVjZWQgU0ZUUCBkb3dubG9hZHMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDYpCi0gUm9uIGluIGJ1ZyAjMTU5NTM0OCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU5NTM0OCkgcG9pbnRlZAogIG91dCBhIHN0YWNrIG92ZXJ3cml0ZSAoYW5kIHRoZSBjb3JyZXNwb25kaW5nIGZpeCkgb24gNjRiaXQgV2luZG93cyB3aGVuCiAgZGVhbGluZyB3aXRoIEhUVFAgY2h1bmtlZCBlbmNvZGluZy4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDA2KQotIE5pciBTb2ZmZXIgdXBkYXRlZCBsaWJjdXJsLmZyYW1ld29yay5tYWtlOgogIG8gZml4IHN5bWxpbmtzLCBzaG91bGQgbGluayB0byBWZXJzaW9ucywgbm90IHRvIC4vVmVyc2lvbnMKICBvIGluZGVudGF0aW9uIGltcHJvdm1lbnRzCgotIERtaXRyaXkgU2VyZ2V5ZXYgZm91bmQgYSBTSUdTRUdWIHdpdGggaGlzIHRlc3QwNC5jIGV4YW1wbGUgcG9zdGVkIG9uIDcgTm92CiAgMjAwNi4gSXQgdHVybmVkIG91dCB3ZSB3cm9uZ2x5IGFzc3VtZWQgdGhhdCB0aGUgY29ubmVjdGlvbiBjYWNoZSB3YXMgcHJlc2VudAogIHdoZW4gdGVhcmluZyBkb3duIGEgY29ubmVjdGlvbi4KCi0gQ2lwcmlhbiBCYWRlc2N1IGZvdW5kIGEgU0lHU0VHViB3aGVuIGRvaW5nIG11bHRpcGxlIFRGVFAgdHJhbnNmZXJzIHVzaW5nIHRoZQogIG11bHRpIGludGVyZmFjZSwgYnV0IEkgY291bGQgYWxzbyByZXBlYXQgaXQgZG9pbmcgbXVsdGlwbGUgc2VxdWVudGlhbCBvbmVzCiAgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UuIFVzaW5nIENpcHJpYW4ncyB0ZXN0IGNhc2UsIEkgY291bGQgZml4IGl0LgoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDYpCi0gQnJhZGZvcmQgQnJ1Y2UgcmVwb3J0ZWQgdGhhdCB3aGVuIHNldHRpbmcgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIHdpdGhvdXQKICBDVVJMT1BUX1ZFUkJPU0Ugc2V0IHRvIG5vbi16ZXJvLCB5b3Ugc3RpbGwgZ290IGEgZmV3IGRlYnVnIG1lc3NhZ2VzIGZyb20gdGhlCiAgU1NMIGhhbmRzaGFrZS4gVGhpcyBpcyBub3cgc3RvcHBlZC4KCkRhbmllbCAoNyBOb3ZlbWJlciAyMDA2KQotIE9sYWYgZml4ZWQgYSBsZWZ0b3ZlciBwcm9ibGVtIHdpdGggdGhlIENPTk5FQ1QgZml4IG9mIGhpcyB0aGF0IHdvdWxkIGxlYXZlIGEKICB3cm9uZyBlcnJvciBtZXNzYWdlIGluIHRoZSBlcnJvciBtZXNzYWdlIGJ1ZmZlci4KCkRhbmllbCAoMyBOb3ZlbWJlciAyMDA2KQotIE9sYWYgU3R1ZWJlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgSSBlZGl0ZWQgc2xpZ2h0bHkuIEl0IGZpeGVzIHRoZSBub3RvcmlvdXMKICBLTk9XTl9CVUdTICMyNSwgd2hpY2ggaGFwcGVucyB3aGVuIGEgcHJveHkgY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoZW4KICBsaWJjdXJsIGhhcyBzZW50IENPTk5FQ1QsIGFzIHBhcnQgb2YgYW4gYXV0aGVudGljYXRpb24gbmVnb3RpYXRpb24uIFN0YXJ0aW5nCiAgbm93LCBsaWJjdXJsIHdpbGwgcmUtY29ubmVjdCBhY2NvcmRpbmdseSBhbmQgY29udGludWUgdGhlIGF1dGhlbnRpY2F0aW9uIGFzCiAgaXQgc2hvdWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDYpCi0gSmFtZXMgSG91c2xleSBicm91Z2h0IHN1cHBvcnQgZm9yIFNDUCB0cmFuc2ZlcnMsIGJhc2VkIG9uIHRoZSBsaWJzc2gyIGxpYnJhcnkKICBmb3IgdGhlIGFjdHVhbCBuZXR3b3JrIHByb3RvY29sIHN0dWZmLgoKICBBZGRlZCB0aGVzZSBuZXcgY3VybF9lYXN5X3NldG9wdCgpIG9wdGlvbnM6CgogICAgQ1VSTE9QVF9TU0hfQVVUSF9UWVBFUwogICAgQ1VSTE9QVF9TU0hfUFVCTElDX0tFWUZJTEUKICAgIENVUkxPUFRfU1NIX1BSSVZBVEVfS0VZRklMRQoKVmVyc2lvbiA3LjE2LjAgKDMwIE9jdG9iZXIgMjAwNikKCkRhbmllbCAoMjUgT2N0b2JlciAyMDA2KQotIEZpeGVkIENVUkxPUFRfRkFJTE9ORVJST1IgdG8gcmV0dXJuIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgZXZlbiBmb3IgdGhlCiAgY2FzZSB3aGVuIDQwMSBvciA0MDcgYXJlIHJldHVybmVkLCAqSUYqIG5vIGF1dGggY3JlZGVudGlhbHMgaGF2ZSBiZWVuIGdpdmVuLgogIFRoZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIG9wdGlvbiBpcyBub3QgcG9zc2libGUgdG8gbWFrZSBmb29sLXByb29mIGZvciA0MDEKICBhbmQgNDA3IGNhc2VzIHdoZW4gYXV0aCBjcmVkZW50aWFscyBpcyBnaXZlbiwgYnV0IHdlJ3ZlIG5vdyBjb3ZlcmVkIHRoaXMKICBzb21ld2hhdCBtb3JlLgoKICBZb3UgbWlnaHQgZ2V0IHNvbWUgYW1vdW50cyBvZiBoZWFkZXJzIHRyYW5zZmVycmVkIGJlZm9yZSB0aGlzIHNpdHVhdGlvbiBpcwogIGRldGVjdGVkLCBsaWtlIGZvciB3aGVuIGEgIjEwMC1jb250aW51ZSIgaXMgcmVjZWl2ZWQgYXMgYSByZXNwb25zZSB0byBhCiAgUE9TVC9QVVQgYW5kIGEgNDAxIG9yIDQwNyBpcyByZWNlaXZlZCBpbW1lZGlhdGVseSBhZnRlcndhcmRzLgoKICBBZGRlZCB0ZXN0IDI4MSB0byB2ZXJpZnkgdGhpcyBjaGFuZ2UuCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwNikKLSBSYXZpIFByYXRhcCBwcm92aWRlZCBhIG1ham9yIHVwZGF0ZSB3aXRoIHBpcGVsaW5pbmcgZml4ZXMuIFdlIGFsc28gbm8gbG9uZ2VyCiAgcmUtdXNlIGNvbm5lY3Rpb25zIChmb3IgcGlwZWxpbmluZykgYmVmb3JlIHRoZSBuYW1lIHJlc29sdmluZyBpcyBkb25lLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDYpCi0gTmlyIFNvZmZlciBtYWRlIHRoZSB0ZXN0cy9saWJ0ZXN0L01ha2VmaWxlLmFtIHVzZSBhIHByb3BlciB2YXJpYWJsZSBmb3IgYWxsCiAgdGhlIHNpbmdsZSB0ZXN0IGFwcGxpY2F0aW9ucycgbGluayBhbmQgZGVwZW5kZW5jZXMsIHNvIHRoYXQgeW91IGVhc2llciBjYW4KICBvdmVycmlkZSB0aG9zZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2hlbiB1c2luZyBtYWtlLgoKLSBBcm1lbCBBc3NlbGluIHNlcGFyYXRlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiBwcm9ibGVtcyBmcm9tIHByb2JsZW1zIHdpdGgKICByZWFkaW5nIHRoZSAobG9jYWwpIENBIGNlcnQgZmlsZSB0byBsZXQgdXNlcnMgZWFzaWVyIHBpbnBvaW50IHRoZSBhY3R1YWwKICBwcm9ibGVtLiBDVVJMRV9TU0xfQ0FDRVJUX0JBREZJTEUgKDc3KSBpcyB0aGUgbmV3IGxpYmN1cmwgZXJyb3IgY29kZS4KCkRhbmllbCAoMTggT2N0b2JlciAyMDA2KQotIFJlbW92ZWQgdGhlICJwcm90b2NvbC1ndWVzc2luZyIgZm9yIFVSTHMgd2l0aCBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggRlRQUwogIG9yIFRFTE5FVCBzaW5jZSB0aGV5IGFyZSBwcmFjdGljYWxseSBub24tZXhpc3RhbnQuIFRoaXMgbGVhdmVzIHVzIHdpdGggb25seQogIHRocmVlIGRpZmZlcmVudCBwcmVmaXhlcyB0aGF0IHdvdWxkIGFzc3VtZSB0aGUgcHJvdG9jb2wgaXMgYW55dGhpbmcgYnV0CiAgSFRUUCwgYW5kIHRoZXkgYXJlIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCAiZnRwLiIsICJkaWN0LiIgb3IgImxkYXAuIi4KCkRhbmllbCAoMTcgT2N0b2JlciAyMDA2KQotIEJ1ZyByZXBvcnQgIzE1NzkxNzEgcG9pbnRlZCBvdXQgY29kZSBmbGF3cyBkZXRlY3RlZCB3aXRoICJwcmVmYXN0IiwgYW5kIHRoZXkKICB3ZXJlIDEgLSBhIHRvbyBzbWFsbCBtZW1vcnkgY2xlYXIgd2l0aCBtZW1zZXQoKSBpbiB0aGUgdGhyZWFkZWQgcmVzb2x2ZXIgYW5kCiAgMiAtIGEgcmFuZ2Ugb2YgcG90ZW50aWFsbHkgYmFkIHVzZXMgb2YgdGhlIGN0eXBlIGZhbWlseSBvZiBpcyooKSBmdW5jdGlvbnMKICBzdWNoIGFzIGlzZGlnaXQoKSwgaXNhbG51bSgpLCBpc3ByaW50KCkgYW5kIG1vcmUuIFRoZSBsYXR0ZXIgbWFkZSBtZSBzd2l0Y2gKICB0byB1c2luZyBvdXIgb3duIHNldCBvZiB0aGVzZSBmdW5jdGlvbnMvbWFjcm9zIHVzaW5nIHVwcGVyY2FzZSBsZXR0ZXJzLCBhbmQKICB3aXRoIHNvbWUgZXh0cmEgc2V0IG9mIGNyYXp5IHR5cGVjYXN0cyB0byBhdm9pZCBtaXN0YWtpbmdseSBwYXNzaW5nIGluCiAgbmVnYXRpdmUgbnVtYmVycyB0byB0aGUgdW5kZXJseWluZyBpcyooKSBmdW5jdGlvbnMuCgotIFdpdGggSmVmZiBQb2hsbWV5ZXIncyBoZWxwLCBJIGZpeGVkIHRoZSBleHBpcmUgdGltZXIgd2hlbiB1c2luZwogIGN1cmxfbXVsdGlfc29ja2V0KCkgZHVyaW5nIG5hbWUgcmVzb2x2ZXMgd2l0aCBjLWFyZXMgYW5kIHRoZSBMT1dfU1BFRUQKICBvcHRpb25zIG5vdyB3b3JrIGZpbmUgd2l0aCBjdXJsX211bHRpX3NvY2tldCgpIGFzIHdlbGwuCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwNikKLSBBZGRlZCBhIGNoZWNrIGluIGNvbmZpZ3VyZSB0aGF0IHNpbXBseSB0cmllcyB0byBydW4gYSBwcm9ncmFtIChub3Qgd2hlbgogIGNyb3NzLWNvbXBpbGluZykgaW4gb3JkZXIgdG8gZGV0ZWN0IHByb2JsZW1zIHdpdGggcnVuLXRpbWUgbGlicmFyaWVzIHRoYXQKICBvdGhlcndpc2Ugd291bGQgb2NjdXIgd2hlbiB0aGUgc2l6ZW9mIHRlc3RzIGZvciBjdXJsX29mZl90IHdvdWxkIHJ1biBhbmQKICB0aHVzIGJlIG11Y2ggbW9yZSBjb25mdXNpbmcgdG8gdXNlcnMuIFRoZSBjaGVjayBvZiBjb3Vyc2Ugc2hvdWxkIHJ1biBhZnRlcgogIGFsbCBsaWItY2hlY2tzIGFyZSBkb25lIGFuZCBiZWZvcmUgYW55IG90aGVyIHRlc3QgaXMgdXNlZCB0aGF0IHdvdWxkIHJ1biBhbgogIGV4ZWN1dGFibGUgYnVpbHQgZm9yIHRlc3RpbmctcHVycG9zZXMuCgpEYW4gRiAoMTMgT2N0b2JlciAyMDA2KQotIFRoZSB0YWdnaW5nIG9mIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBQT1NUIGJvZHkgZGF0YSBzZW50CiAgdG8gdGhlIENVUkxPUFRfREVCVUdGVU5DVElPTiBjYWxsYmFjayBoYXMgYmVlbiBmaXhlZCAoaXQgd2FzIGVycm9uZW91c2x5CiAgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgaGVhZGVyKS4gIEEgbWVzc2FnZSB3YXMgYWxzbyBhZGRlZCB0byB0aGUKICBjb21tYW5kIGxpbmUgdG9vbCB0byBzaG93IHdoZW4gZGF0YSBpcyBiZWluZyBzZW50LCBlbmFibGVkIHdoZW4KICAtLXZlcmJvc2UgaXMgdXNlZC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDA2KQotIFN0YXJ0aW5nIG5vdywgYWRkaW5nIGFuIGVhc3kgaGFuZGxlIHRvIGEgbXVsdGkgc3RhY2sgdGhhdCB3YXMgYWxyZWFkeSBhZGRlZAogIHRvIGEgbXVsdGkgc3RhY2sgd2lsbCBjYXVzZSBDVVJMTV9CQURfRUFTWV9IQU5ETEUgdG8gZ2V0IHJldHVybmVkLgoKLSBKZWZmIFBvaGxtZXllciBoYXMgYmVlbiB3b3JraW5nIHdpdGggdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgc291cmNlIGNvZGUsCiAgYW5kIHdoaWxlIGRvaW5nIHNvIGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHRoZSBjdXJyZW50IHRpbWVvdXQgc3lzdGVtIGZvcgogIHRoZSBzb2NrZXQgQVBJIHJlYWxseSB3YXMgYSBiaXQgYXdrd2FyZCBzaW5jZSBpdCBiZWNvbWUgcXVpdGUgc29tZSB3b3JrIHRvCiAgYmUgc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IHRpbWVvdXQgc2V0LgoKICBKZWZmIHRoZW4gcHJvdmlkZWQgdGhlIG5ldyBDVVJMTU9QVF9USU1FUkZVTkNUSU9OIHRoYXQgaXMgeWV0IGFub3RoZXIKICBjYWxsYmFjayB0aGUgYXBwIGNhbiBzZXQgdG8gZ2V0IHRvIGtub3cgd2hlbiB0aGUgZ2VuZXJhbCB0aW1lb3V0IHRpbWUKICBjaGFuZ2VzIGFuZCB0aHVzIGZvciBhbiBhcHBsaWNhdGlvbiBsaWtlIGhpcGVyZmlmby5jIGl0IG1ha2VzIGV2ZXJ5dGhpbmcgYQogIGxvdCBlYXNpZXIgYW5kIG5pY2VyLiBUaGVyZSdzIGEgQ1VSTE1PUFRfVElNRVJEQVRBIG9wdGlvbiB0b28gb2YgY291cnNlIGluCiAgZ29vZCBvbGQgbGliY3VybCB0cmFkaXRpb24uCgogIEplZmYgaGFzIGFsc28gdXBkYXRlZCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBjb2RlIHRvIHVzZSB0aGlzIG5ld3MuCgpEYW5pZWwgKDkgT2N0b2JlciAyMDA2KQotIEJvZ2RhbiBOaWN1bGEncyBzZWNvbmQgdGVzdCBjYXNlIChwb3N0ZWQgU3VuLCAwOCBPY3QgMjAwNikgY29udmVydGVkIHRvIHRlc3QKICBjYXNlIDUzNSBhbmQgaXQgbm93IHJ1bnMgZmluZS4gQWdhaW4gYSBwcm9ibGVtIHdpdGggdGhlIHBpcGVsaW5pbmcgY29kZSBub3QKICB0YWtpbmcgYWxsIHBvc3NpYmxlIChlcnJvcikgY29uZGl0aW9ucyBpbnRvIGFjY291bnQuCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA2KQotIEJvZ2RhbiBOaWN1bGEncyBoYW5naW5nIHRlc3QgY2FzZSAocG9zdGVkIFdlZCwgMDQgT2N0IDIwMDYpIHdhcyBjb252ZXJ0ZWQgdG8KICB0ZXN0IGNhc2UgNTMzIGFuZCB0aGUgdGVzdCBub3cgcnVucyBmaW5lLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNikKLSBEbWl0cml5IFNlcmdleWV2IHByb3ZpZGVkIGFuIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBjcmFzaGVkIENWUyBsaWJjdXJsCiAgYnV0IHRoYXQgd29ya2VkIG5pY2VseSBpbiA3LjE1LjUuIEkgY29udmVydGVkIGl0IGludG8gdGVzdCBjYXNlIDUzMiBhbmQKICBmaXhlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDYpCi0gUmVtb3ZlZCBhIGZldyBvdGhlciBuby1sb25nZXIgcHJlc2VudCBvcHRpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlLgoKLSBTdXBwb3J0IGZvciBGVFAgdGhpcmQgcGFydHkgdHJhbnNmZXJzIHdhcyByZW1vdmVkLiBIZXJlJ3Mgd2h5OgoKICBvIFRoZSByZWNlbnQgbXVsdGkgaW50ZXJmYWNlIGNoYW5nZXMgYnJva2UgaXQgYW5kIHRoZSBkZXNpZ24gb2YgdGhlIDNyZCBwYXJ0eQogICAgdHJhbnNmZXJzIG1hZGUgaXQgdmVyeSBoYXJkIHRvIGZpeCB0aGUgcHJvYmxlbXMKICBvIEl0IHdhcyBzdGlsbCBibG9ja2luZyBhbmQgdGh1cyBuYXN0eSBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogIG8gSXQgd2FzIGEgbG90IG9mIGV4dHJhIGNvZGUgZm9yIGEgdmVyeSByYXJlbHkgdXNlZCBmZWF0dXJlCiAgbyBJdCBkaWRuJ3QgdXNlIHRoZSBzYW1lIGNvZGUgYXMgZm9yICJwbGFpbiIgRlRQIHRyYW5zZmVycywgc28gaXQgZGlkbid0IHdvcmsKICAgIGZpbmUgZm9yIElQdjYgYW5kIGl0IGRpZG4ndCBwcm9wZXJseSByZS11c2UgY29ubmVjdGlvbnMgYW5kIG1vcmUKICBvIFRoZXJlJ3Mgbm9ib2R5IGFyb3VuZCB3aG8ncyB3aWxsaW5nIHRvIHdvcmsgb24gYW5kIGltcHJvdmUgdGhlIGV4aXN0aW5nCiAgICBjb2RlCgogIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoaXJkIHBhcnR5IHRyYW5zZmVycyBhcmUgYmFubmVkIGZvcmV2ZXIsIG9ubHkgdGhhdAogIHRoZXkgbmVlZCB0byBiZSBkb25lIGJldHRlciBpZiB0aGV5IGFyZSB0byBiZSByZS1hZGRlZCBpbiB0aGUgZnV0dXJlLgoKICBUaGUgQ1VSTE9QVF9TT1VSQ0VfKiBvcHRpb25zIGFyZSByZW1vdmVkIGZyb20gdGhlIGxpYiBhbmQgc28gYXJlIHRoZSAtLTNwKgogIG9wdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIEZvciB0aGlzIHJlYXNvbiwgSSBhbHNvIGJ1bXBlZCB0aGUKICB2ZXJzaW9uIGluZm8gZm9yIHRoZSBsaWIuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDA2KQotIFJlcG9ydGVkIGluICMxNTYxNDcwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTYxNDcwKSwgbGliY3VybAogIHdvdWxkIGNyYXNoIGlmIGEgYmFkIGZ1bmN0aW9uIHNlcXVlbmNlIHdhcyB1c2VkIHdoZW4gc2h1dHRpbmcgZG93biBhZnRlcgogIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKGkuZSB1c2luZyBlYXN5X2NsZWFudXAgYWZ0ZXIgbXVsdGlfY2xlYW51cCkgc28KICBwcmVjYXV0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYW55IG1vcmUgLSB0ZXN0IGNhc2UgNTI5CiAgd2FzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDYpCi0gVGhlIFVSTCBpbiB0aGUgY29va2llIGphciBmaWxlIGlzIG5vdyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBnaXZpbmcgYSA0MDQuCiAgUmVwb3J0ZWQgYnkgVGltb3RoeSBTdG9uZS4gVGhlIG5ldyBVUkwgd2lsbCB0YWtlIHRoZSB2aXNpdG9yIHRvIGEgY3VybCB3ZWIKICBzaXRlIG1pcnJvciB3aXRoIHRoZSBkb2N1bWVudC4KCkRhbmllbCAoMjQgU2VwdGVtYmVyIDIwMDYpCi0gQmVybmFyZCBMZWFrIGZpeGVkIGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpLWxpYnMuCgotIENvcnkgTmVsc29uIG1hZGUgbGliY3VybCB1c2UgdGhlIFdTQVBvbGwoKSBmdW5jdGlvbiBpZiBidWlsdCBmb3IgV2luZG93cwogIFZpc3RhIChfV0lOMzJfV0lOTlQgPj0gMHgwNjAwKQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwNikKLSBNaWtlIFByb3R0cyBhZGRlZCAtLWZ0cC1zc2wtY29udHJvbCB0byBtYWtlIGN1cmwgdXNlIEZUUC1TU0wsIGJ1dCBvbmx5CiAgZW5jcnlwdCB0aGUgY29udHJvbCBjb25uZWN0aW9uIGFuZCB1c2UgdGhlIGRhdGEgY29ubmVjdGlvbiAicGxhaW4iLgoKLSBEbWl0cml5IFNlcmdleWV2IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBTT0NLU1s0NV0gY29kZSB3b3JrIGJldHRlcgogIGFzIGl0IG5vdyB3aWxsIHJlYWQgdGhlIGZ1bGwgZGF0YSBzZW50IGZyb20gc2VydmVycy4gVGhlIFNPQ0tTLXJlbGF0ZWQgY29kZQogIHdhcyBhbHNvIG1vdmVkIHRvIHRoZSBuZXcgbGliL3NvY2tzLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIHRlc3QgY2FzZSA1MzEgaW4gYW4gYXR0ZW1wdCB0byByZXBlYXQgYnVnIHJlcG9ydCAjMTU2MTQ3MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTYxNDcwKSB0aGF0IGlzIHNhaWQgdG8gY3Jhc2ggd2hlbiBhbgogIEZUUCB1cGxvYWQgZmFpbHMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBJdCBkaWQgbm90LCBidXQgSSBtYWRlIGEgZmFpbGVkCiAgdXBsb2FkIHN0aWxsIGFzc3VtZSB0aGUgY29udHJvbCBjb25uZWN0aW9uIHRvIGJlIGZpbmUuCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDA2KQotIEFybWVsIEFzc2VsaW4gZml4ZWQgcHJvYmxlbXMgd2hlbiB5b3UgZ2F2ZSBhIHByb3h5IFVSTCB3aXRoIHVzZXIgbmFtZSBhbmQKICBlbXB0eSBwYXNzd29yZCBvciBubyBwYXNzd29yZCBhdCBhbGwuIFRlc3QgY2FzZSAyNzggYW5kIDI3OSB3ZXJlIGFkZGVkIHRvCiAgdmVyaWZ5LgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIgMjAwNikKLSBBZGRlZCBkb2NzL2V4YW1wbGVzLzEwLWF0LWEtdGltZS5jIGJ5IE1pY2hhZWwgV2FsbG5lcgoKLSBBZGRlZCBkb2NzL2V4YW1wbGVzL2hpcGVyZmlmby5jIGJ5IEplZmYgUG9obG1leWVyCgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDA2KQotIEZpeGVkIG15IGJyZWFrYWdlIGZyb20gZWFybGllciB0b2RheSBzbyB0aGF0IGRvaW5nIGN1cmxfZWFzeV9jbGVhbnVwKCkgb24gYQogIGhhbmRsZSB0aGF0IGlzIHBhcnQgb2YgYSBtdWx0aSBoYW5kbGUgZmlyc3QgcmVtb3ZlcyB0aGUgaGFuZGxlIGZyb20gdGhlCiAgc3RhY2suCgotIEFkZGVkIENVUkxPUFRfU1NMX1NFU1NJT05JRF9DQUNIRSBhbmQgLS1uby1zZXNzaW9uaWQgdG8gZGlzYWJsZSBTU0wKICBzZXNzaW9uLUlEIHJlLXVzZSBvbiBkZW1hbmQgc2luY2UgdGhlcmUgb2J2aW91c2x5IGFyZSBicm9rZW4gc2VydmVycyBvdXQKICB0aGVyZSB0aGF0IG1pc2JlaGF2ZSB3aXRoIHNlc3Npb24tSURzIHVzZWQuCgotIEplZmYgUG9obG1leWVyIHByZXNlbnRlZCBhICptdWx0aV9zb2NrZXQoKS11c2luZyBwcm9ncmFtIHRoYXQgZXhwb3NlZCBhCiAgcHJvYmxlbSB3aXRoIGl0IChTSUdTRUdWLXN0eWxlKS4gSXQgY2xlYXJseSBzaG93ZWQgdGhhdCB0aGUgZXhpc3RpbmcKICBzb2NrZXQtc3RhdGUgYW5kIHN0YXRlLWRpZmZlcmVuY2UgZnVuY3Rpb24gd2Fzbid0IGdvb2QgZW5vdWdoIHNvIEkgcmV3cm90ZQogIGl0IGFuZCBjb3VsZCB0aGVuIHJlLXJ1biBKZWZmJ3MgcHJvZ3JhbSB3aXRob3V0IGFueSBjcmFzaC4gVGhlIHByZXZpb3VzCiAgdmVyc2lvbiBjbGVhcmx5IGNvdWxkIG1pc3MgdG8gdGVsbCB0aGUgYXBwbGljYXRpb24gd2hlbiBhIGhhbmRsZSBjaGFuZ2VkCiAgZnJvbSB1c2luZyBvbmUgc29ja2V0IHRvIHVzaW5nIGFub3RoZXIuCgogIFdoaWxlIEkgd2FzIGF0IGl0IChhcyBJIGNvdWxkIHVzZSB0aGlzIGFzIGEgbWVhbnMgdG8gdHJhY2sgdGhpcyBwcm9ibGVtCiAgZG93biksIEkndmUgbm93IGFkZGVkIGEgJ21hZ2ljJyBudW1iZXIgdG8gdGhlIGVhc3kgaGFuZGxlIHN0cnVjdCB0aGF0IGlzCiAgaW5pdGVkIGF0IGN1cmxfZWFzeV9pbml0KCkgdGltZSBhbmQgY2xlYXJlZCBhdCBjdXJsX2Vhc3lfY2xlYW51cCgpIHRpbWUgdGhhdAogIHdlIGNhbiB1c2UgaW50ZXJuYWxseSB0byBkZXRlY3QgdGhhdCBhbiBlYXN5IGhhbmRsZSBzZWVtcyB0byBiZSBmaW5lLCBvciBhdAogIGxlYXN0IG5vdCBjbG9zZWQgb3IgZnJlZWQgKGZyZWVpbmcgaW4gZGVidWcgYnVpbGRzIGZpbGwgdGhlIGFyZWEgd2l0aCAweDEzCiAgYnl0ZXMgYnV0IGluIG5vcm1hbCBidWlsZHMgd2UgY2FuIG9mIGNvdXJzZSBub3QgYXNzdW1lIGFueSBwYXJ0aWN1bGFyIGRhdGEKICBpbiB0aGUgZnJlZWQgYXJlYXMpLgoKRGFuaWVsICg5IFNlcHRlbWJlciAyMDA2KQotIE1pY2hlbGUgQmluaSBmaXhlZCBob3cgdGhlIGhvc3RuYW1lIGlzIHB1dCBpbiBOVExNIHBhY2thZ2VzLiBBcyBzZXJ2ZXJzCiAgZG9uJ3QgZXhwZWN0IGZ1bGx5IHF1YWxpZmllZCBuYW1lcyB3ZSBuZWVkIHRvIGN1dCB0aGVtIG9mZiBhdCB0aGUgZmlyc3QgZG90LgoKLSBQZXRlciBTeWx2ZXN0ZXIgY2xlYW5lZCB1cCBhbmQgZml4ZWQgdGhlIGdldHNvY2tuYW1lKCkgdXNlcyBpbiBmdHAuYy4gU29tZQogIG9mIHRoZW0gY2FuIGJlIGNvbXBsZXRldGx5IHJlbW92ZWQgdGhvdWdoLi4uCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDYpCi0gUmF2aSBQcmF0YXAgYW5kIEkgaGF2ZSBpbXBsZW1lbnRlZCBIVFRQIFBpcGVsaW5pbmcgc3VwcG9ydC4gRW5hYmxlIGl0IGZvciBhCiAgbXVsdGkgaGFuZGxlIHVzaW5nIENVUkxNT1BUX1BJUEVMSU5JTkcgYW5kIGFsbCBIVFRQIGNvbm5lY3Rpb25zIGRvbmUgb24gdGhhdAogIGhhbmRsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgcGlwZWxpbmVkIGluc3RlYWQgb2YgZG9uZSBpbiBwYXJhbGxlbGwgYXMKICB0aGV5IGFyZSBwZXJmb3JtZWQgb3RoZXJ3aXNlLgoKICBBcyBhIHNpZGUtZWZmZWN0IGZyb20gdGhpcyB3b3JrLCBjb25uZWN0aW9ucyBhcmUgbm93IHNoYXJlZCBiZXR3ZWVuIGFsbCBlYXN5CiAgaGFuZGxlcyB3aXRoaW4gYSBtdWx0aSBoYW5kbGUsIHNvIGlmIHlvdSB1c2UgTiBlYXN5IGhhbmRsZXMgZm9yIHRyYW5zZmVycywKICBlYWNoIG9mIHRoZW0gY2FuIHBpY2sgdXAgYW5kIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkIGJ5CiAgYW55IG9mIHRoZSBoYW5kbGVzLCBiZSBpdCB0aGUgc2FtZSBvciBvbmUgb2YgdGhlIG90aGVycy4KCiAgVGhpcyBzZXBhcmF0aW9uIG9mIHRoZSB0aWdodCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb25uZWN0aW9ucyBhbmQgZWFzeQogIGhhbmRsZXMgaXMgbW9zdCBub3RpY2FibGUgd2hlbiB5b3UgY2xvc2UgZWFzeSBoYW5kbGVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaW4KICBhIG11bHRpIGhhbmRsZSBhbmQgY2hlY2sgYW1vdW50IG9mIHVzZWQgbWVtb3J5IG9yIHdhdGNoIHRoZSBkZWJ1ZyBvdXRwdXQsIGFzCiAgdGhlcmUgYXJlIHRpbWVzIHdoZW4gbGliY3VybCB3aWxsIGtlZXAgdGhlIGVhc3kgaGFuZGxlIGFyb3VuZCBmb3IgYSB3aGlsZQogIGxvbmdlciB0byBiZSBhYmxlIHRvIGNsb3NlIGl0IHByb3Blcmx5LiBMaWtlIGZvciBzZW5kaW5nIFFVSVQgdG8gY2xvc2UgZG93bgogIGFuIEZUUCBjb25uZWN0aW9uLgoKICBUaGlzIGlzIGEgbWFqb3IgY2hhbmdlLgogIApEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDYpCi0gRG1pdHJ5IFJlY2hraW4gKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NTE0MTIpIHByb3ZpZGVkIGEKICBwYXRjaCB0aGF0IHdoaWxlIG5vdCBmaXhpbmcgdGhpbmdzIHZlcnkgbmljZWx5LCBpdCBkb2VzIG1ha2UgdGhlIFNPQ0tTNQogIHByb3h5IGNvbm5lY3Rpb24gc2xpZ2h0bHkgYmV0dGVyIGFzIGl0IG5vdyBhY2tub3dsZWRnZXMgdGhlIHRpbWVvdXQgZm9yCiAgY29ubmVjdGlvbiBhbmQgaXQgbm8gbG9uZ2VyIHNlZ2ZhdWx0cyBpbiB0aGUgY2FzZSB3aGVuIFNPQ0tTIHJlcXVpcmVzCiAgYXV0aGVudGljYXRpb24gYW5kIHlvdSBkaWQgbm90IHNwZWNpZnkgdXNlcm5hbWU6cGFzc3dvcmQuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgZm91bmQgYW5kIGZpeGVkIGEgbXVsdGkgaW50ZXJmYWNlIGZsYXcgd2hlbiB1c2luZyBhc3luY2gKICBuYW1lIHJlc29sdmVzLiBJdCBjb3VsZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIHN0YXRlLgoKR2lzbGUgKDI5IEF1Z3VzdCAyMDA2KQotIEFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIE1TLURPUyBjb21waWxlcnMgKGRlc2lkZXMgZGpncHApLiBBbGwgTVMtRE9TCiAgY29tcGlsZXIgbm93IHVzZXMgdGhlIHNhbWUgY29uZmlnLmRvcyBmaWxlIChyZW5hbWVkIHRvIGNvbmZpZy5oIGJ5CiAgbWFrZSkuIGxpYmN1cmwgbm93IGJ1aWxkcyBmaW5lIHVzaW5nIFdhdGNvbSBhbmQgTWV0YXdhcmUncyBIaWdoLUMKICB1c2luZyB0aGUgV2F0dC0zMiB0Y3AvaXAtc3RhY2suCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxPUFRfU09DS09QVEZVTkNUSU9OIGFuZCBDVVJMT1BUX1NPQ0tPUFREQVRBIHRvCiAgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldCB0aGVpciBvd24gc29ja2V0IG9wdGlvbnMuCgpEYW5pZWwgKDI1IEF1Z3VzdCAyMDA2KQotIEFybWVsIEFzc2VsaW4gcmVwb3J0ZWQgdGhhdCB0aGUgJ3J1bm5pbmdfaGFuZGxlcycgY291bnRlciB3YXNuJ3QgdXBkYXRlZAogIHByb3Blcmx5IGlmIHlvdSByZW1vdmVkIGEgImxpdmUiIGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIHdpdGgKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKS4KCkRhbmllbCAoMjIgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSByZW1haW5pbmcgbWlzdGFrZSBmcm9tIHRoZSBBdWd1c3QgMTkgVFlQRSBjaGFuZ2UuCgotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIEFsbG93U2VydmVyQ29ubmVjdCgpIGluIHRoZSBGVFAKICBjb2RlIHdoZW4gZG9pbmcgcHVyZSBpcHY2IEVQUlQgY29ubmVjdGlvbnMuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA2KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgQXJtZWwgQXNzZWxpbiwgdGhlIEZUUCBjb2RlIG5vIGxvbmdlciByZS1pc3N1ZXMgdGhlIFRZUEUKICBjb21tYW5kIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gdW5sZXNzIGl0IGhhcyB0by4KCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBhIGNyYXNoIGluIHRoZSBGVFAgY29kZSB3aGVuIHVzaW5nIFNJTkdMRUNXRCBtb2RlIGFuZAogIGZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KCi0gQW5kcmV3IEJpZ2dzIHBvaW50ZWQgb3V0IGEgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBmbGF3IHdoZXJlIGxpYmN1cmwgZGlkbid0CiAgc2VuZCB0aGUgd2hvbGUgcmVxdWVzdCBhdCBvbmNlLCBldmVuIHRob3VnaCB0aGUgRXhwZWN0OiBoZWFkZXIgd2FzIGRpc2FibGVkCiAgYnkgdGhlIGFwcGxpY2F0aW9uLiBBbiBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UgaXMgYWxzbyB0aGF0IHNtYWxsICg8IDEwMjQKICBieXRlcykgUE9TVHMgYXJlIG5vdyBhbHdheXMgc2VudCB3aXRob3V0IEV4cGVjdDogaGVhZGVyIHNpbmNlIHdlIGRlZW0gaXQKICBtb3JlIGNvc3RseSB0byBib3RoZXIgYWJvdXQgdGhhdCB0aGFuIHRoZSByaXNrIHRoYXQgd2Ugc2VuZCB0aGUgZGF0YSBpbgogIHZhaW4uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBtYWRlIHRoZSBDVVJMT1BUX1BSRVFVT1RFIG9wdGlvbiB3b3JrIGZpbmUgZXZlbiB3aGVuCiAgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IHRydWUuIFBSRVFVT1RFIGlzIHRoZW4gcnVuIHJvdWdobHkgYXQgdGhlIHNhbWUgcGxhY2UKICBpbiB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhcyBpdCB3b3VsZCBoYXZlIHJ1biBpZiB0aGVyZSB3b3VsZCd2ZSBiZWVuIGEKICB0cmFuc2Zlci4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNikKLSBGaXhlZCBhIGZsYXcgaW4gdGhlICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgdHJlYXRtZW50LiBJZiB5b3UgZGlkIHR3byBQT1NUcwogIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCBhbGxvd2VkIHRoZSBmaXJzdCB0byB1c2UgdGhhdCBoZWFkZXIsIHlvdQogIGNvdWxkIG5vdCBkaXNhYmxlIGl0IGZvciB0aGUgc2Vjb25kIHJlcXVlc3QuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDYpCi0gRG9tZW5pY28gQW5kcmVvbGZvdW5kIGEgcXVpY2sgYnVpbGQgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYmVjYXVzZQogIHNyYy9jb25maWcuaC5pbiB3YXMgbm90IGEgcHJvcGVyIGR1cGxjYXRlIG9mIGxpYi9jb25maWcuaC5pbiB3aGljaCBpdAogIHNob3VsZCd2ZSBiZWVuIGFuZCB0aGlzIHdhcyBkdWUgdG8gdGhlIG1ha2V0Z3ogc2NyaXB0IG5vdCBkb2luZyB0aGUgY3AKICBwcm9wZXJseS4KClZlcnNpb24gNy4xNS41ICg3IEF1Z3VzdCAyMDA2KQoKRGFuaWVsICgyIEF1Z3VzdCAyMDA2KQotIE1hcmsgTGVudGN6bmVyIGZpeGVkIGhvdyBsaWJjdXJsIHdhcyBub3QgcHJvcGVybHkgZG9pbmcgY2h1bmtlZCBlbmNvZGluZwogIGlmIHRoZSBoZWFkZXIgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiB3YXMgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbi4KICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTMxODM4CgpEYW5pZWwgKDEgQXVndXN0IDIwMDYpCi0gTWFjaWVqIEthcnBpdWsgZml4ZWQgYSBjcmFzaCB0aGF0IHdvdWxkIG9jY3VyIGlmIHdlIHBhc3NlZCBDdXJsX3N0cmVycm9yKCkKICBhbiB1bmtub3duIGVycm9yIG51bWJlciBvbiBnbGliYyBzeXN0ZW1zLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzIyODkKCkRhbmllbCAoMzEgSnVseSAyMDA2KQotICpBTEVSVCogY3VybF9tdWx0aV9zb2NrZXQoKSBhbmQgY3VybF9tdWx0aV9zb2NrZXRfYWxsKCkgZ290IG1vZGlmaWVkCiAgcHJvdG90eXBlczogdGhleSBib3RoIG5vdyBwcm92aWRlIHRoZSBudW1iZXIgb2YgcnVubmluZyBoYW5kbGVzIGJhY2sgdG8gdGhlCiAgY2FsbGluZyBmdW5jdGlvbi4gSXQgbWFrZXMgdGhlIGZ1bmN0aW9ucyByZXNlbWJsZSB0aGUgZ29vZCBvbGQKICBjdXJsX211bHRpX3BlcmZvcm0oKSBtb3JlIGFuZCBwcm92aWRlcyBhIG5pY2Ugd2F5IHRvIGtub3cgd2hlbiB0aGUgbXVsdGkKICBoYW5kbGUgZ29lcyBlbXB0eS4KCiAgQUxFUlQyOiBkb24ndCB1c2UgdGhlIGN1cmxfbXVsdGlfc29ja2V0KigpIGZ1bmN0aW9uYWxpdHkgaW4gYW55dGhpbmcKICBwcm9kdWN0aW9uLWxpa2UgdW50aWwgSSBzYXkgaXQncyBzb21ld2hhdCBzZXR0bGVkLCBhcyBJIHN1c3BlY3QgdGhlcmUgbWlnaHQKICBiZSBzb21lIGZ1cnRoZXIgQVBJIGNoYW5nZXMgYmVmb3JlIEknbSBkb25lLi4uCgpEYW5pZWwgKDI4IEp1bHkgMjAwNikKLSBZdmVzIExlamV1bmUgZml4ZWQgc28gdGhhdCByZXBsYWNpbmcgQ29udGVudC1UeXBlOiB3aGVuIGRvaW5nIG11bHRpcGFydAogIGZvcm1wb3N0cyB3b3JrIGV4YWN0bHkgdGhlIHdheSB5b3Ugd2FudCBpdCAoYW5kIHRoZSB3YXkgeW91J2QgYXNzdW1lIGl0CiAgd29ya3MpLgoKRGFuaWVsICgyNyBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgLS1mdHAtc3NsLXJlcWQgd2hpY2ggbWFrZXMgY3VybCAqcmVxdWlyZSogU1NMIGZvciBib3RoCiAgY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9uLCBhcyB0aGUgZXhpc3RpbmcgLS1mdHAtc3NsIG9wdGlvbiBvbmx5IHJlcXVlc3RzCiAgaXQuCgotIFtIaXBlci1yZWxhdGVkIHdvcmtdIEFkZGVkIGEgZnVuY3Rpb24gY2FsbGVkIGN1cmxfbXVsdGlfYXNzaWduKCkgdGhhdCB3aWxsCiAgc2V0IGEgcHJpdmF0ZSBwb2ludGVyIGFkZGVkIHRvIHRoZSBpbnRlcm5hbCBsaWJjdXJsIGhhc2ggdGFibGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgc29ja2V0IHBhc3NlZCBpbiB0byB0aGlzIGZ1bmN0aW9uOgoKICBDVVJMTWNvZGUgY3VybF9tdWx0aV9hc3NpZ24oQ1VSTE0gKm11bHRpX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zb2NrZXRfdCBzb2NrZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNvY2twKTsKCiAgJ3NvY2twJyBiZWluZyBhIGN1c3RvbSBwb2ludGVyIHNldCBieSB0aGUgYXBwbGljYXRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoCiAgdGhpcyBzb2NrZXQuIFRoZSBzb2NrZXQgaGFzIHRvIGJlIGFscmVhZHkgZXhpc3RpbmcgYW5kIGluLXVzZSBieSBsaWJjdXJsLAogIGxpa2UgaGF2aW5nIGFscmVhZHkgY2FsbGVkIHRoZSBjYWxsYmFjayB0ZWxsaW5nIGFib3V0IGl0cyBleGlzdGFuY2UuCgogIFRoZSBzZXQgaGFzaHAgcG9pbnRlciB3aWxsIHRoZW4gYmUgcGFzc2VkIG9uIHRvIHRoZSBjYWxsYmFjayBpbiB1cGNvbWluZwogIGNhbGxzIHdoZW4gdGhpcyBzYW1lIHNvY2tldCBpcyB1c2VkIChpbiB0aGUgYnJhbmQgbmV3ICdzb2NrZXRwJyBhcmd1bWVudCkuCgpEYW5pZWwgKDI2IEp1bHkgMjAwNikKLSBEYW4gTmVsc29uIGFkZGVkIHRoZSBDVVJMT1BUX0ZUUF9BTFRFUk5BVElWRV9UT19VU0VSIGxpYmN1cmwgb3B0aW9uIGFuZCBjdXJsCiAgdG9vbCBvcHRpb24gbmFtZWQgLS1mdHAtYWx0ZXJuYXRpdmUtdG8tdXNlci4gSXQgcHJvdmlkZXMgYSBtZWFuIHRvIHNlbmQgYQogIHBhcnRpY3VsYXIgY29tbWFuZCBpZiB0aGUgbm9ybWFsIFVTRVIvUEFTUyBhcHByb2FjaCBmYWlscy4KCi0gTWljaGFlbCBKZXJyaXMgYWRkZWQgbWFnaWMgdGhhdCBidWlsZHMgbGliL2N1cmxsaWIudmNwcm9qIGF1dG9tYXRpY2FsbHkgZm9yCiAgbmV3ZXIgTVNWQy4KCkRhbmllbCAoMjUgSnVseSAyMDA2KQotIEdlb3JnIEhvcm4gbWFkZSB0aGUgdHJhbnNmZXIgdGltZW91dCBlcnJvciBtZXNzYWdlIGluY2x1ZGUgbW9yZSBkZXRhaWxzLgoKRGFuaWVsICgyMCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBidWlsZCBlcnJvciB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgd2l0aCBIVFRQIGRpc2FibGVkLAogIHByb2JsZW0gYWRkZWQgd2l0aCB0aGUgY3VybF9mb3JtZ2V0KCkgcGF0Y2guCgpEYW5pZWwgKDE3IEp1bHkgMjAwNikKLSBKYXJpIFN1bmRlbGwgZGlkIHNvbWUgZXhjZWxsZW50IHJlc2VhcmNoIGFuZCBidWcgdHJhY2tpbmcsIGZpZ3VyZWQgb3V0IHRoYXQKICB3ZSBkaWQgd3JvbmcgYW5kIHBhdGNoZWQgaXQ6IFdoZW4gbm9kZXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHNwbGF5IHRyZWUsCiAgYW5kIHdlIGRpZG4ndCBwcm9wZXJseSByZW1vdmUgaXQgZnJvbSB0aGUgc3BsYXkgdHJlZSB3aGVuIGFuIGVhc3kgaGFuZGxlIHdhcwogIHJlbW92ZWQgZnJvbSBhIG11bHRpIHN0YWNrIGFuZCB0aHVzIHdlIGNvdWxkIHdyb25nbHkgbGVhdmUgYSBub2RlIGluIHRoZQogIHNwbGF5IHRyZWUgcG9pbnRpbmcgdG8gKGJhZCkgbWVtb3J5LgoKRGFuaWVsICgxNCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBmbGF3IHdoZXJlIHRoZSBDUkxGIGNvdW50ZXIgd2Fzbid0IHByb3Blcmx5IGNsZWFyZWQKICBmb3IgRlRQIEFTQ0lJIHRyYW5zZmVycy4KCkRhbmllbCAoOCBKdWx5IDIwMDYpCi0gQXRlcyBHb3JhbCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwncyBjb29raWUgcGFyc2VyIGRpZCBjYXNlIGluc2Vuc2l0aXZlCiAgc3RyaW5nIGNvbXBhcmlzb25zIG9uIHRoZSBwYXRoIHdoaWNoIGlzIGluY29ycmVjdCBhbmQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0CiAgZml4ZXMgdGhpcy4gSSBlZGl0ZWQgdGVzdCBjYXNlIDggdG8gaW5jbHVkZSBkZXRhaWxzIHRoYXQgdGVzdCBmb3IgdGhpcy4KCi0gSW5nbWFyIFJ1bmdlIHByb3ZpZGVkIGEgc291cmNlIHNuaXBwZXQgdGhhdCBjYXVzZWQgYSBjcmFzaC4gVGhlIHJlYXNvbiBmb3IKICB0aGUgY3Jhc2ggd2FzIHRoYXQgbGliY3VybCBpbnRlcm5hbGx5IHdhcyBhIGJpdCBjb25mdXNlZCBhYm91dCB3aG8gb3duZWQgdGhlCiAgRE5TIGNhY2hlIGF0IGFsbCB0aW1lcyBzbyBpZiB5b3UgY3JlYXRlZCBhbiBlYXN5IGhhbmRsZSB0aGF0IHVzZXMgYSBzaGFyZWQKICBETlMgY2FjaGUgYW5kIGFkZGVkIHRoYXQgdG8gYSBtdWx0aSBoYW5kbGUgaXQgd291bGQgY3Jhc2guIE5vdyB3ZSBrZWVwIG1vcmUKICBjYXJlZnVsIGludGVybmFsIHRyYWNrIG9mIGV4YWN0bHkgd2hhdCBraW5kIG9mIEROUyBjYWNoZSBlYWNoIGVhc3kgaGFuZGxlCiAgdXNlczogTm9uZSwgUHJpdmF0ZSAoYWxsb2NhdGVkIGZvciBhbmQgdXNlZCBvbmx5IGJ5IHRoaXMgc2luZ2xlIGhhbmRsZSksCiAgU2hhcmVkIChwb2ludHMgdG8gYSBjYWNoZSBoZWxkIGJ5IGEgc2hhcmVkIG9iamVjdCksIEdsb2JhbCAocG9pbnRzIHRvIHRoZQogIGdsb2JhbCBjYWNoZSkgb3IgTXVsdGkgKHBvaW50cyB0byB0aGUgY2FjaGUgd2l0aGluIHRoZSBtdWx0aSBoYW5kbGUgdGhhdCBpcwogIGF1dG9tYXRpY2FsbHkgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kgaGFuZGxlcyB0aGF0IGFyZSBhZGRlZCB3aXRoIHByaXZhdGUKICBjYWNoZXMpLgoKRGFuaWVsICg0IEp1bHkgMjAwNikKLSBUb3NoaXl1a2kgTWFlemF3YSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgeW91IGNvdWxkbid0IG92ZXJyaWRlIHRoZQogIFByb3h5LUNvbm5lY3Rpb246IGhlYWRlciB3aGVuIHVzaW5nIGEgcHJveHkgYW5kIG5vdCBkb2luZyBDT05ORUNULgoKRGFuaWVsICgyNCBKdW5lIDIwMDYpCi0gTWljaGFlbCBXYWxsbmVyIGFkZGVkIGN1cmxfZm9ybWdldCgpLCB3aGljaCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZXh0cmFjdAogIChzZXJpYWxpc2UpIGEgcHJldmlvdXNseSBidWlsdCBmb3JtcG9zdCAoYXMgd2l0aCBjdXJsX2Zvcm1hZGQoKSkuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNikKLSBBcnZlIEtudWRzZW4gZm91bmQgYSBmbGF3IGluIGN1cmxfbXVsdGlfZmRzZXQoKSBmb3Igc3lzdGVtcyB3aGVyZQogIGN1cmxfc29ja2V0X3QgaXMgdW5zaWduZWQgKGxpa2UgV2luZG93cykgdGhhdCBjb3VsZCBjYXVzZSBpdCB0byB3cm9uZ2x5CiAgcmV0dXJuIGEgbWF4IGZkIG9mIC0xLgoKRGFuaWVsICgyMCBKdW5lIDIwMDYpCi0gUGV0ZXIgU2lsdmEgaW50cm9kdWNlZCBDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZAogIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UgdGhhdCBsaW1pdCB0aGEgbWF4aW11bSByYXRlIGxpYmN1cmwgaXMgYWxsb3dlZAogIHRvIHNlbmQgb3IgcmVjZWl2ZSBkYXRhLiBUaGlzIGtpbmQgb2YgYWRkcyB0aGUgdGhlIGNvbW1hbmQgbGluZSB0b29sJ3MKICBvcHRpb24gLS1saW1pdC1yYXRlIHRvIHRoZSBsaWJyYXJ5LgoKICBUaGUgcmF0ZSBsaW1pdGluZyBsb2dpYyBpbiB0aGUgY3VybCBhcHAgaXMgbm93IHJlbW92ZWQgYW5kIGlzIGluc3RlYWQKICBwcm92aWRlZCBieSBsaWJjdXJsIGl0c2VsZi4gVHJhbnNmZXIgcmF0ZSBsaW1pdGluZyB3aWxsIG5vdyBhbHNvIHdvcmsgZm9yIC1kCiAgYW5kIC1GLCB3aGljaCBpdCBkaWRuJ3QgYmVmb3JlLgoKRGFuaWVsICgxOSBKdW5lIDIwMDYpCi0gTWFkZSAtSyBvbiBhIGZpbGUgdGhhdCBjb3VsZG4ndCBiZSByZWFkIGNhdXNlIGEgd2FybmluZyB0byBiZSBkaXNwbGF5ZWQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNikKLSBEYW4gRmFuZHJpY2ggaW1wbGVtZW50ZWQgLS1lbmFibGUtaGlkZGVuLXN5bWJvbHMgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUKICAtZnZpc2liaWxpdHk9aGlkZGVuIG9uIGdjYyA+PSA0LjAuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGxpYmN1cmwKICBiaW5hcnkgYW5kIHNwZWVkcyB1cCBkeW5hbWljIGxpbmtpbmcgYnkgaGlkaW5nIGFsbCB0aGUgaW50ZXJuYWwgc3ltYm9scyBmcm9tCiAgdGhlIHN5bWJvbCB0YWJsZS4KClZlcnNpb24gNy4xNS40ICgxMiBKdW5lIDIwMDYpCgpEYW5pZWwgKDggSnVuZSAyMDA2KQotIEJyaWFuIERlc3NlbnQgZml4ZWQgdGhlIGNvZGUgZm9yIGN5Z3dpbiBpbiB0aHJlZSBkaXN0aW5jdCB3YXlzOgoKICBUaGUgZmlyc3QgbW9kaWZpZXMge2xpYixzcmN9L3NldHVwLmggdG8gbm90IGluY2x1ZGUgdGhlIHdpbnNvY2sgaGVhZGVycwogIHVuZGVyIEN5Z3dpbi4gIFRoaXMgZml4ZXMgdGhlIHJlcG9ydGVkIGJ1aWxkIHByb2JsZW0uICBDeWd3aW4gYXR0ZW1wdHMgYXMKICBtdWNoIGFzIHBvc3NpYmxlIHRvIGVtdWxhdGUgYSBwb3NpeCBlbnZpcm9ubWVudCB1bmRlciBXaW5kb3dzLiAgVGhpcyBtZWFucwogIHRoYXQgV0lOMzIgaXMgKm5vdCogI2RlZmluZWQgYW5kICh0byB0aGUgZXh0ZW50IHBvc3NpYmxlKSBldmVyeXRoaW5nIGlzIGRvbmUKICBhcyBpdCB3b3VsZCBiZSBvbiBhICppeCB0eXBlIHN5c3RlbS4gIFRodXMgPHN5cy9zb2NrZXQuaD4gaXMgdGhlIHByb3BlcgogIGluY2x1ZGUsIGFuZCBldmVuIHRob3VnaCB3aW5zb2NrMi5oIGlzIHByZXNlbnQsIGluY2x1ZGluZyBpdCBqdXN0IGludHJvZHVjZXMKICBhIHdob2xlIGJ1bmNoIG9mIGluY29tcGF0aWJsZSBzb2NrZXQgQVBJIHN0dWZmLgoKICBUaGUgc2Vjb25kIGlzIGEgcGF0Y2ggSSd2ZSBpbmNsdWRlZCBpbiB0aGUgQ3lnd2luIGJpbmFyeSBwYWNrYWdlcyBmb3IgYQogIHdoaWxlLiAgSXQgc2tpcHMgdHdvIHVubmVjZXNzYXJ5IGxpYnJhcnkgY2hlY2tzICgtbHdpbm1tIGFuZCAtbGdkaTMyKS4gIFRoZQogIGNoZWNrcyBhcmUgaW5ub2N1b3VzIGFuZCB0aGV5IGRvIHN1Y2NlZWQsIGJ1dCB0aGV5IHBvbGx1dGUgTElCUyB3aXRoCiAgdW5uZWNlc3Nhcnkgc3R1ZmYgd2hpY2ggZ2V0cyByZWNvcmRlZCBhcyBzdWNoIGluIHRoZSBsaWJjdXJsLmxhIGZpbGUsIHdoaWNoCiAgYnJpbmdzIHRoZW0gaW50byB0aGUgYnVpbGQgb2YgYW55IGxpYmN1cmwtZG93bnN0cmVhbS4gIEFzIGZhciBhcyBJIGtub3cKICB0aGVzZSBsaWJzIGFyZSByZWFsbHkgb25seSBuZWNlc3NhcnkgZm9yIG1pbmd3LCBzbyBhbHRlcm5hdGl2ZWx5IHRoZXkgY291bGQKICBiZSBkZXNpZ25lZCB0byBvbmx5IHJ1biBpZiAkaG9zdCBtYXRjaGVzICotKi1taW5ndyogYnV0IEkgdG9vayB0aGUgc2FmZXIKICByb3V0ZSBvZiBza2lwcGluZyB0aGVtIGZvciAqLSotY3lnd2luKi4KCiAgVGhlIHRoaXJkIHBhdGNoIHJlcGxhY2VzIGFsbCB1c2VzIG9mIHRoZSBhbmNpZW50IGFuZCBvYnNvbGV0ZSBfX0NZR1dJTjMyX18KICB3aXRoIF9fQ1lHV0lOX18uIFJlZjogPGh0dHA6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDAzLTA5L21zZzAxNTIwLmh0bWw+LgoKRGFuaWVsICg3IEp1bmUgMjAwNikKLSBNaWthZWwgU2VubmVyaG9sbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgTlRMTTIgc2Vzc2lvbiByZXNwb25zZSBzdXBwb3J0CiAgdG8gbGliY3VybC4gVGhlIDIxIE5UTE0gdGVzdCBjYXNlcyB3ZXJlIGFnYWluIG1vZGlmaWVkIHRvIGNvbXBseS4uLgoKRGFuaWVsICgyNyBNYXkgMjAwNikKLSDTc2NhciBNb3JhbGVzIFZpdvMgdXBkYXRlZCB0aGUgbGliY3VybC5mcmFtZXdvcmsubWFrZSBmaWxlLgoKRGFuaWVsICgyNiBNYXkgMjAwNikKLSBPbGFmIFN0/GJlbiBmaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBEaWdlc3QgYXV0aGVudGljYXRpb24gd2l0aCBtZDUtc2VzcyB0bwogIGZhaWwuIFdoZW4gdXNpbmcgdGhlIG1kNS1zZXNzLCB0aGUgcmVzdWx0IHdhcyBub3QgTWQ1IGVuY29kZWQgYW5kIEJhc2U2NAogIHRyYW5zZm9ybWVkLgoKRGFuaWVsICgyNSBNYXkgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyAiU0VTUyIgdG8gYmUgc2V0IHdpdGgKICBDVVJMT1BUX0NPT0tJRUxJU1QsIHdoaWNoIHRoZW4gbWFrZXMgYWxsIHNlc3Npb24gY29va2llcyBnZXQgY2xlYXJlZC4KCkRhbmllbCAoMjQgTWF5IDIwMDYpCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0IDI3MSBydW4gZmluZSBhZ2FpbiBzaW5jZSB0aGUgVEZUUCBwYXRoIGZpeC4KCkRhbmllbCAoMjMgTWF5IDIwMDYpCi0gTWFydGluIE1pY2hsbWF5ciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzY3OTU0LCBidXQgdGhlIHNhbWUgZXJyb3IgYWxzbwogIHNob3dlZCB1cCBpbiB0aGUgYXV0b2J1aWxkcy4gSXQgc2VlbXMgYSByYXRoZXIgbG9uZy1zaW5jZSBpbnRyb2R1Y2VkIHNoZWxsCiAgc2NyaXB0IGZsYXcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc3VkZGVubHkgd2FzIGRldGVjdGVkIGJ5IHRoZSBiYXNoCiAgdmVyc2lvbiBpbiBEZWJpYW4gVW5zdGFibGUuIEl0IGhhZCBwcmV2aW91c2x5IHBhc3NlZCB1bmRldGVjdGVkIGJ5IGFsbAogIHNoZWxscyB1c2VkIHNvIGZhci4uLgoKLSBEYXZpZCBNY0NyZWVkeSB1cGRhdGVkIGxpYi9jb25maWctdHBmLmgKCkRhbmllbCAoMTEgTWF5IDIwMDYpCi0gRml4ZWQgdGhlIGNvbmZpZ3VyZSdzIGNoZWNrIGZvciBvbGQtc3R5bGUgU1NMZWF5IGhlYWRlcnMgc2luY2UgSSBmZWxsIG92ZXIgYQogIGNhc2Ugd2l0aCBhIGR1cGxpY2F0ZSBmaWxlIG5hbWUgKGEga3JiNCBpbXBsZW1lbnRhdGlvbiB3aXRoIGFuIGVyci5oCiAgZmlsZSkuIEkgY29udmVydGVkIHRoZSBjaGVjayB0byBtYW51YWxseSBtYWtlIHN1cmUgdGhyZWUgb2YgdGhlIGhlYWRlcnMgYXJlCiAgcHJlc2VudCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlbSBmaW5lLgoKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBhIGZpeCBmb3IgQ1VSTElORk9fTEFTVFNPQ0tFVCB0aGF0IGRvZXMgZXh0ZW5kZWQKICBjaGVja3Mgb24gdGhlIHRvLWJlLXJldHVybmVkIHNvY2tldCB0byBtYWtlIHN1cmUgaXQgdHJ1bHkgc2VlbXMgdG8gYmUgYWxpdmUKICBhbmQgd2VsbC4gRm9yIFNTTCBjb25uZWN0aW9uIGl0IChvbmx5KSB1c2VzIE9wZW5TU0wgZnVuY3Rpb25zLgoKRGFuaWVsICgxMCBNYXkgMjAwNikKLSBGaXhlZCBESUNUIGluIHR3byBhc3BlY3RzOgoKICAxIC0gYWxsb3cgcHJvcGVybHkgVVJMLWVzY2FwZWQgd29yZHMsIGxpa2UgdXNpbmcgJTIwIGZvciBzcGFjZXMKCiAgMiAtIHByb3Blcmx5IGVzY2FwZSBjZXJ0YWluIGxldHRlcnMgd2l0aGluIGEgd29yZCB0byBjb21wbHkgdG8gdGhlIFJGQzIyMjkKCkRhbmllbCAoOSBNYXkgMjAwNikKLSBBbmRyZWFzIE50YWZsb3MgcmVwb3J0ZWQgYSBidWcgaW4gbGliY3VybC5tNDogV2hlbiBjb25maWd1cmluZyBteSBHTlUKICBhdXRvdG9vbHMgcHJvamVjdCwgd2hpY2ggb3B0aW9uYWxseSAoZGVmYXVsdD15ZXMpIHVzZXMgbGliY3VybCBvbiBhIHN5c3RlbQogIHdpdGhvdXQgYSAodXNhYmxlKSBsaWJjdXJsIGluc3RhbGxhdGlvbiwgYnV0IG5vdCBzcGVjaWZ5aW5nCiAgYC0td2l0aG91dC1saWJjdXJsJywgY29uZmlndXJlIGRldGVybWluZXMgY29ycmVjdGx5IHRoYXQgbm8gbGliY3VybCBpcwogIGF2YWlsYWJsZSwgaG93ZXZlciwgdGhlIExJQkNVUkwgdmFyaWFibGUgZ2V0cyBleHBhbmRlZCB0byBgTElCQ1VSTCA9IC1sY3VybCcKICBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlcy4KCiAgRGF2aWQgU2hhdyBmaXhlZCB0aGUgZmxhdy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHJlY2VudGx5IGFkZGVkIG5vbi1ibG9ja2luZyBTU0wKICBjb25uZWN0cy4gVGhlIHN0YXRlIG1hY2hpbmUgd2FzIG5vdCByZXNldCBwcm9wZXJseSBzbyB0aGF0IHN1YnNlcXVlbnQKICBjb25uZWN0cyB1c2luZyB0aGUgc2FtZSBoYW5kbGUgd291bGQgZmFpbCwgYW5kIHRoZXJlIHdlcmUgdHdvIG1lbW9yeSBsZWFrcy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4geW91IGFkZGVkIGFuIGVhc3kgaGFuZGxlIHRvIGEKICBtdWx0aSBzdGFjayBhbmQgdGhhdCBlYXN5IGhhbmRsZSBoYWQgYWxyZWFkeSBiZWVuIHVzZWQgdG8gZG8gb25lIG9yIG1vcmUKICBlYXN5IGludGVyZmFjZSB0cmFuc2ZlcnMsIGFzIHRoZW4gdGhlIGNvZGUgdGhyZXcgYXdheSB0aGUgcHJldmlvdXNseSB1c2VkCiAgRE5TIGNhY2hlIHdpdGhvdXQgcHJvcGVybHkgZnJlZWluZyBpdC4KCkRhbmllbCAoOCBNYXkgMjAwNikKLSBEYW4gRmFuZHJpY2ggd2VudCBvdmVyIHRoZSBURlRQIGNvZGUgYW5kIGhlIHBvaW50ZWQgb3V0IGFuZCBmaXhlZCBudW1lcm91cwogIHByb2JsZW1zOgoKICAqIFRoZSByZWNlaXZlZCBmaWxlIGlzIGNvcnJ1cHRlZCB3aGVuIGEgcGFja2V0IGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKICAgICh0aGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtISkKCiAgKiBUcmFuc21pdHRpbmcgYSBmaWxlIGFib3J0cyBpZiBhIGJsb2NrIGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKCiAgKiBEYXRhIGlzIHN0b3JlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlciBmb3IgdXBsb2Fkcywgc28gdXBsb2FkcwogICAgYWx3YXlzIGZhaWwgKEkgZG9uJ3Qgc2VlIGhvdyBpdCBjb3VsZCBoYXZlIGV2ZXIgd29ya2VkLCBidXQgaXQgZGlkIG9uIHg4NgogICAgYXQgbGVhc3QpCgogICogQSBudW1iZXIgb2YgY2FsbHMgYXJlIG1hZGUgdG8gc3RyZXJyb3IgaW5zdGVhZCBvZiBDdXJsX3N0cmVycm9yLCBtYWtpbmcKICAgIHRoZSBjb2RlIG5vdCB0aHJlYWQgc2FmZQoKICAqIFRoZXJlIGFyZSByZWZlcmVuY2VzIHRvIGVycm5vIGluc3RlYWQgb2YgQ3VybF9zb2NrZXJybm8oKSwgY2F1c2luZwogICAgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2VzIG9uIFdpbmRvd3MKCiAgKiBUaGUgZmlsZSBuYW1lIGluY2x1ZGVzIGEgbGVhZGluZyAvIHdoaWNoIHZpb2xhdGVzIFJGQzM2MTcuIERvaW5nIHNvbWV0aGluZwogICAgc2ltaWxhciB0byBmdHAsIHdoZXJlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBob3N0IG5hbWUgbWVhbnMgYW4gYWJzb2x1dGUKICAgIHJlZmVyZW5jZSBzZWVtcyBhIHJlYXNvbmFibGUgZXh0ZW5zaW9uIHRvIGZpeCB0aGlzLgoKICAqIEZhaWx1cmVzIGluIEVCQ0RJQyBjb252ZXJzaW9uIGFyZSBub3QgcHJvcGFnYXRlZCB1cCB0byB0aGUgY2FsbGVyIGJ1dCBhcmUKICAgIHNpbGVudGx5IGlnbm9yZWQKCi0gRml4ZWQga25vd24gYnVnICMyOC4gVGhlIFRGVFAgY29kZSBubyBsb25nZXIgYXNzdW1lcyBhIHBhY2tlZCBzdHJ1Y3QgYW5kCiAgdGh1cyB3b3JrcyByZWxpYWJseSBvbiBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoNSBNYXkgMjAwNikKLSBSb2xhbmQgQmxvbSBmaWxlZCBidWcgcmVwb3J0ICMxNDgxMjE3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODEyMTcpLCB3aXRoIGZvbGxvdy11cHMgYnkgTWljaGVsZQogIEJpbmkgYW5kIERhdmlkIEJ5cm9uLiBsaWJjdXJsIHByZXZpb3VzbHkgd3JvbmdseSB1c2VkIEdldExhc3RFcnJvcigpIG9uCiAgd2luZG93cyB0byBnZXQgZXJyb3IgZGV0YWlscyBhZnRlciBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbiBjYWxscywgd2hlbiBpdAogIHJlYWxseSBzaG91bGQgdXNlIFdTQUdldExhc3RFcnJvcigpIGluc3RlYWQuCgogIFdoZW4gY2hhbmdpbmcgdG8gdGhpcywgdGhlIGZvcm1lciBmdW5jdGlvbiBDdXJsX291cmVycm5vKCkgaXMgbm93IGluc3RlYWQKICBjYWxsZWQgQ3VybF9zb2NrZXJybm8oKSBhcyBpdCBpcyBuZWNlc3NhcnkgdG8gb25seSB1c2UgaXQgdG8gZ2V0IGVycm5vIGZyb20KICBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbnMgYXMgb3RoZXJ3aXNlIGl0IHdvbid0IHdvcmsgYXMgaW50ZW5kZWQgb24gV2luZG93cy4KCkRhbmllbCAoNCBNYXkgMjAwNikKLSBNYXJrIEVpY2hpbiBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMTQ4MDgyMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDgwODIxKSBIZSBmb3VuZCBhbmQgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aXRoIGhvdyBsaWJjdXJsIGRlYWx0IHdpdGggR251VExTIGFuZCBhIGNhc2Ugd2hlcmUgZ251dGxzIHJldHVybmVkCiAgR05VVExTX0VfQUdBSU4gaW5kaWNhdGluZyBpdCB3b3VsZCBibG9jay4gSXQgd291bGQgdGhlbiByZXR1cm4gYW4gdW5leHBlY3RlZAogIHJldHVybiBjb2RlLCBtYWtpbmcgQ3VybF9zc2xfc2VuZCgpIGNvbmZ1c2UgdGhlIHVwcGVyIGxheWVyIC0gY2F1c2luZyByYW5kb20KICAyOCBieXRlcyB0cmFzaCBkYXRhIHRvIGdldCBpbnNlcnRlZCBpbiB0aGUgdHJhbnNmZXJlZCBzdHJlYW0uCgogIFRoZSBwcm9wZXIgZml4IHdhcyB0byBtYWtlIHRoZSBDdXJsX2d0bHNfc2VuZCgpIGZ1bmN0aW9uIHJldHVybiB0aGUgcHJvcGVyCiAgcmV0dXJuIGNvZGVzIHRoYXQgdGhlIGNhbGxlcnMgd291bGQgZXhwZWN0LiBUaGUgQ3VybF9vc3NsX3NlbmQoKSBmdW5jdGlvbgogIGFscmVhZHkgZGlkIHRoaXMuCgpEYW5pZWwgKDIgTWF5IDIwMDYpCi0gQWRkZWQgYSAtLWNoZWNrZm9yIG9wdGlvbiB0byBjdXJsLWNvbmZpZyB0byBhbGxvdyB1c2VycyB0byBlYXNpZXIKICB3cml0ZSBmb3IgZXhhbXBsZSBzaGVsbCBzY3JpcHRzIHRoYXQgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEKICBuZXctZW5vdWdoIGxpYmN1cmwgdmVyc2lvbi4gSWYgLS1jaGVja2ZvciBpcyBnaXZlbiBhIHZlcnNpb24gc3RyaW5nCiAgbmV3ZXIgdGhhbiB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQsIGN1cmwtY29uZmlnIHdpbGwgcmV0dXJuIGEKICBub24temVybyBleGl0IGNvZGUgYW5kIG91dHB1dCBhIHN0cmluZyBhYm91dCB0aGUgdW5mdWxmaWxsZWQKICByZXF1aXJlbWVudC4KCkRhbmllbCAoMjYgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBicm91Z2h0IGluaXRpYWwgbGluZSBlbmQgY29udmVyc2lvbnMgd2hlbiBkb2luZyBGVFAgQVNDSUkKICB0cmFuc2ZlcnMuIFRoZXkgYXJlIGRvbmUgb24gbm9uLXdpbmRvd3Mgc3lzdGVtcyBhbmQgdHJhbnNsYXRlIENSTEYgdG8gTEYuCgogIEkgbW9kaWZpZWQgdGhlIDE1IExJU1QtdXNpbmcgdGVzdCBjYXNlcyBhY2NvcmRpbmdseS4gVGhlIGRvd25zaWRlIGlzIHRoYXQgbm93CiAgd2UnbGwgaGF2ZSBldmVuIG1vcmUgdHJvdWJsZSB0byBnZXQgdGhlIHRlc3RzIHRvIHJ1biBvbiBXaW5kb3dzIHNpbmNlIHRoZXkKICBzaG91bGQgZ2V0IENSTEYgbmV3bGluZXMgbGVmdCBpbnRhY3Qgd2hpY2ggdGhlICpuaXggdmVyc2lvbnMgZG9uJ3QuIEkgZmlndXJlCiAgdGhlIG9ubHkgc2FuZSB0aGluZyB0byBkbyBpcyB0byBhZGQgc29tZSBraW5kIG9mIFtuZXdsaW5lXSBtYWNybyBmb3IgdGhlIHRlc3QKICBjYXNlIGZpbGVzIGFuZCBoYXZlIHRoZW0gZXhwYW5kZWQgdG8gdGhlIHByb3BlciBuYXRpdmUgbGluZSBlbmRpbmcgd2hlbiB0aGUKICB0ZXN0IGNhc2VzIGFyZSBydW4uIFRoaXMgaXMgaG93ZXZlciBsZWZ0IHRvIGltcGxlbWVudC4KCkRhbmllbCAoMjUgQXByaWwgMjAwNikKLSBQYXVsIFF1ZXJuYSBmaXhlZCBsaWJjdXJsIHRvIGJldHRlciBkZWFsIHdpdGggZGVmbGF0ZSBjb250ZW50IGVuY29kaW5nCiAgd2hlbiB0aGUgc3RyZWFtICh3cm9uZ2x5KSBsYWNrcyBhIHByb3BlciB6bGliIGhlYWRlci4gVGhpcyBzZWVtcyB0byBiZSB0aGUKICBjYXNlIG9uIHRvbyBtYW55IGFjdHVhbCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA2KQotIEFsZSBWZXNlbHkgZml4ZWQgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2hlbiB1c2luZyBhIGhvc3RuYW1lLgoKRGFuaWVsICgxOSBBcHJpbCAyMDA2KQotIEJhc2VkIG9uIHByZXZpb3VzIGluZm8gZnJvbSBUb3IgQXJudHNlbiwgSSBtYWRlIGNvbmZpZ3VyZSBkZXRlY3QgdGhlIEludGVsCiAgSUNDIGNvbXBpbGVyIHRvIGFkZCBhIGNvbXBpbGVyIG9wdGlvbiBmb3IgaXQsIGluIG9yZGVyIGZvciBjb25maWd1cmUgdG8KICBwcm9wZXJseSBiZSBhYmxlIHRvIGRldGVjdCBmdW5jdGlvbiBwcm90b3R5cGVzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIGxlc3MgZWFnZXIgdG8gY2xvc2UKICB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdoZW4gdXNpbmcgRlRQLCBmb3IgZXhhbXBsZSB3aGVuIHlvdSByZW1vdmUgYW4gZWFzeQogIGhhbmRsZSBmcm9tIGEgbXVsdGkgc3RhY2suCgotIEFwcGxpZWQgYSBwYXRjaCBieSBBdGVzIEdvcmFsIGFuZCBLYXRpZSBXYW5nIHRoYXQgY29ycmVjdGVkIG15IGJhZCBmaXgKICBhdHRlbXB0IGZyb20gQXByaWwgMTAuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDYpCi0gIzE0NjgzMzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NjgzMzApIHBvaW50ZWQgb3V0IGEgYmFkCiAgdHlwZWNhc3QgaW4gdGhlIGN1cmwgdG9vbCBsZWFkaW5nIHRvIGEgY3Jhc2ggd2l0aCAoNjRiaXQ/KSBWUzIwMDUgKGF0IGxlYXN0KQogIHNpbmNlIHRoZSBzdHJ1Y3QgdGltZXZhbCBmaWVsZCB0dl9zZWMgaXMgYW4gaW50IHdoaWxlIHRpbWVfdCBpcyA2NGJpdC4KCkRhbmllbCAoMTAgQXByaWwgMjAwNikKLSBBdGVzIEdvcmFsIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZpZWQgYm90aCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIGFuZAogIENVUkxPUFRfVElNRU9VVCwgdGhlIF9sb25nZXJfIHRpbWUgd291bGQgd3JvbmdseSBiZSB1c2VkIGZvciB0aGUgU1NMCiAgY29ubmVjdGlvbiB0aW1lLW91dCEKCi0gSSBtZXJnZWQgbXkgaGlwZXIgcGF0Y2ggKGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9oaXBlci8pIGludG8gdGhlIG1haW4KICBzb3VyY2VzLiBTZWUgdGhlIGxpYi9SRUFETUUubXVsdGlfc29ja2V0IGZvciBpbXBsZW1lbnRhdGlvbiBzdG9yeSB3aXRoCiAgZGV0YWlscy4gRG9uJ3QgZXhwZWN0IGl0IHRvIHdvcmsgZnVsbHkgeWV0LiBJIGRvbid0IGludGVuZCB0byBibG93IGFueQogIHdoaXN0bGVzIG9yIHJpbmcgYW55IGJlbGxzIGFib3V0IGl0IHVudGlsIEknbSBtb3JlIGNvbnZpbmNlZCBpdCB3b3JrcyBhdAogIGxlYXN0IHNvbWV3aGF0IHJlbGlhYmx5LgoKRGFuaWVsICg3IEFwcmlsIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkncyBFQkNESUMgYW5kIFRQRiBjaGFuZ2VzLiBUaHJlZSBuZXcgY3VybF9lYXN5X3NldG9wdCgpCiAgb3B0aW9ucyAoY2FsbGJhY2tzKSB3ZXJlIGFkZGVkOgoKICBDT05WX0ZST01fTkVUV09SS19GVU5DVElPTgogIENPTlZfVE9fTkVUV09SS19GVU5DVElPTgogIENPTlZfRlJPTV9VVEY4X0ZVTkNUSU9OCgpEYW5pZWwgKDUgQXByaWwgMjAwNikKLSBNaWNoZWxlIEJpbmkgbW9kaWZpZWQgdGhlIE5UTE0gY29kZSB0byB3b3JrIGZvciBoaXMgIndlaXJkIElJUyBjYXNlIgogIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDYtMDIvMDE1NC5odG1sKSBieSBhZGRpbmcgdGhlIE5UTE0gaGFzaAogIGZ1bmN0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBMTSBvbmUgYW5kIG1ha2luZyBzb21lIG90aGVyIGFkanVzdG1lbnRzIGluIHRoZQogIG9yZGVyIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGRhdGEgYmxvY2sgYXJlIHNlbnQgaW4gdGhlIFR5cGUtMiByZXBseS4KICBJbnNwaXJhdGlvbiBmb3IgdGhpcyB3b3JrIHdhcyB0YWtlbiBmcm9tIHRoZSBGaXJlZm94IE5UTE0gaW1wbGVtZW50YXRpb24uCgogIEkgZWRpdGVkIHRoZSBleGlzdGluZyAyMSghKSBOVExNIHRlc3QgY2FzZXMgdG8gcnVuIGZpbmUgd2l0aCB0aGVzZSBuZXdzLiBEdWUKICB0byB0aGUgZmFjdCB0aGF0IHdlIG5vdyBwcm9wZXJseSBpbmNsdWRlIHRoZSBob3N0IG5hbWUgaW4gdGhlIFR5cGUtMiBtZXNzYWdlCiAgdGhlIHRlc3QgY2FzZXMgbm93IG9ubHkgY29tcGFyZSBwYXJ0cyBvZiB0aGF0IGNodW5rLgoKRGFuaWVsICgyOCBNYXJjaCAyMDA2KQotICMxNDUxOTI5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDUxOTI5KSBkZXRhaWxlZCBhIGJ1ZyB0aGF0CiAgb2NjdXJyZWQgd2hlbiBhc2tpbmcgbGliY3VybCB0byBmb2xsb3cgSFRUUCByZWRpcmVjdHMgYW5kIHRoZSBvcmlnaW5hbCBVUkwKICBoYWQgbW9yZSB0aGFuIG9uZSBxdWVzdGlvbiBtYXJrICg/KS4gQWRkZWQgdGVzdCBjYXNlIDI3NiB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDYpCi0gRGF2aWQgQnlyb24gZm91bmQgYSBwcm9ibGVtIG11bHRpcGxlIC1kIG9wdGlvbnMgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoCiAgLS1lbmFibGUtZGVidWcsIGFzIHRoZW4gY3VybCB1c2VkIGZyZWUoKSBvbiBtZW1vcnkgYWxsb2NhdGVkIGJvdGggd2l0aAogIG5vcm1hbCBtYWxsb2MoKSBhbmQgd2l0aCBsaWJjdXJsLXByb3ZpZGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUgbGF0dGVyIE1VU1QgYmUKICBmcmVlZCB3aXRoIGN1cmxfZnJlZSgpIGluIGRlYnVnIGJ1aWxkcy4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBmaWd1cmVkIG91dCB0aGF0IFRGVFAgd2FzIGJyb2tlbiBvbiBhIGxvdCBvZiBzeXN0ZW1zIHNpbmNlIHdlCiAgY2FsbGVkIGJpbmQoKSB3aXRoIGEgdG9vIGJpZyBhcmd1bWVudCBpbiB0aGUgM3JkIHBhcmFtZXRlciBhbmQgYXQgbGVhc3QKICBUcnU2NCwgQUlYIGFuZCBJUklYIHNlZW0gdG8gYmUgdmVyeSBwaWNreSBhYm91dCBpdC4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCBDVVJMSU5GT19GVFBfRU5UUllfUEFUSC4KCi0gWGF2aWVyIEJvdWNob3V4IG1hZGUgdGhlIFNTTCBjb25uZWN0aW9uIG5vbi1ibG9ja2luZyBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogICh3aGVuIHVzaW5nIE9wZW5TU0wpLgoKLSBUb3IgQXJudHNlbiBmaXhlZCB0aGUgQUlYIFRvb2xib3ggUlBNIHNwZWMKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBsaWJjdXJsIHRvIG5vIGxvbmdlciBpZ25vcmUgQVVUSCBmYWlsdXJlcyBhbmQgbm93IGl0CiAgcmVhY3RzIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgQ1VSTE9QVF9GVFBfU1NMIHNldHRpbmcuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0d28gVEZUUCBwcm9ibGVtczogRml4ZWQgYSBidWcgd2hlcmVieSBhIHJlY2VpdmVkIGZpbGUKICB3aG9zZSBsZW5ndGggd2FzIGEgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzIGNvdWxkIGhhdmUgcmFuZG9tIGdhcmJhZ2UKICBhcHBlbmRlZC4gQWxzbywgc3RvcCBwcm9jZXNzaW5nIFRGVFAgcGFja2V0cyB3aGljaCBhcmUgdG9vIHNob3J0IHRvIGJlCiAgbGVnYWwuCgotIElsamEgdmFuIFNwcnVuZGVsIHJlcG9ydGVkIGEgcG9zc2libGUgY3Jhc2ggaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHVzaW5nCiAgImN1cmwgaG9zdHdpdGhvdXRzbGFzaCAtZCBkYXRhIC1HIgoKVmVyc2lvbiA3LjE1LjMgKDIwIE1hcmNoIDIwMDYpCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDYpCi0gVlVMTkVSQUJJTElUWSByZXBvcnRlZCB0byB1cyBieSBVbGYgSGFybmhhbW1hci4KCiAgbGliY3VybCB1c2VzIHRoZSBnaXZlbiBmaWxlIHBhcnQgb2YgYSBURlRQIFVSTCBpbiBhIG1hbm5lciB0aGF0IGFsbG93cyBhCiAgbWFsaWNpb3VzIHVzZXIgdG8gb3ZlcmZsb3cgYSBoZWFwLWJhc2VkIG1lbW9yeSBidWZmZXIgZHVlIHRvIHRoZSBsYWNrIG9mCiAgYm91bmRhcnkgY2hlY2suCgogIFRoaXMgb3ZlcmZsb3cgaGFwcGVucyBpZiB5b3UgcGFzcyBpbiBhIFVSTCB3aXRoIGEgVEZUUCBwcm90b2NvbCBwcmVmaXgKICAoInRmdHA6Ly8iKSwgdXNpbmcgYSB2YWxpZCBob3N0IGFuZCBhIHBhdGggcGFydCB0aGF0IGlzIGxvbmdlciB0aGFuIDUxMgogIGJ5dGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGlmIGN1cmwvbGliY3VybCBpcyB0b2xkIHRvCiAgZm9sbG93IHJlZGlyZWN0cyBhbmQgYW4gSFRUUCBzZXJ2ZXIgcG9pbnRzIHRoZSBjbGllbnQgdG8gYSB0ZnRwIFVSTCB3aXRoIHRoZQogIGNoYXJhY3RlcmlzdGljcyBkZXNjcmliZWQgYWJvdmUuCgogIFRoZSBDb21tb24gVnVsbmVyYWJpbGl0aWVzIGFuZCBFeHBvc3VyZXMgKENWRSkgcHJvamVjdCBoYXMgYXNzaWduZWQgdGhlIG5hbWUKICBDVkUtMjAwNi0xMDYxIHRvIHRoaXMgaXNzdWUuCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDYpCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBSUE0gc3BlYyBmaWxlIGZvciBBSVggVG9vbGJveCwgdGhhdCBub3cgaXMgaW5jbHVkZWQKICBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkOgoKICBhIGJhZCBTU0wgZXJyb3IgbWVzc2FnZSB3aGVuIE9wZW5TU0wgY2VydGlmaWNhdGVzIGFyZSB2ZXJpZmllZCBmaW5lLgoKICBhIG1pc3NpbmcgcmV0dXJuIGNvZGUgYXNzaWdubWVudCBpbiB0aGUgRlRQIGNvZGUKCkRhbmllbCAoNyBNYXJjaCAyMDA2KQotIE1hcmt1cyBLb2V0dGVyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNTU3MTUgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIG11bHRpLXBhcnQgZm9ybXBvc3RzLiBUaGUgZml4IGZyb20gRmVicnVhcnkKICAyMm5kIGNvdWxkIG1ha2UgdGhlIEN1cmxfZG9uZSgpIGZ1bmN0aW9uIGdldCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCBpdCB3YXMgbm90IGRlc2lnbmVkIGZvciB0aGF0IGFuZCB0aHVzIHRyaWVkIHRvIGNhbGwgZnJlZSgpIG9uCiAgYW4gYWxyZWFkeSBmcmVlZCBtZW1vcnkgYXJlYSEKCi0gUGV0ZXIgSGV1Y2hlcnQgbWFkZSBzdXJlIHRoZSBDVVJMRlRQU1NMX0NPTlRST0wgc2V0dGluZyBmb3IgQ1VSTE9QVF9GVFBfU1NMCiAgaXMgdXNlZCBwcm9wZXJseS4KCkRhbmllbCAoNiBNYXJjaCAyMDA2KQotIExvdHMgb2YgdXNlcnMgb24gV2luZG93cyBoYXZlIHJlcG9ydGVkIGdldHRpbmcgdGhlICJTU0w6IGNvdWxkbid0IHNldAogIGNhbGxiYWNrIiBlcnJvciBtZXNzYWdlIHNvIEkndmUgbm93IG1hZGUgdGhlIHNldHRpbmcgb2YgdGhhdCBjYWxsYmFjayBub3QgYmUKICBhcyBjcml0aWNhbCBhcyBiZWZvcmUuIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGFkZGl0aW9uYWwgbG9nZ2dpbmcvCiAgdHJhY2UgYW55d2F5IHNvIGEgZmFpbHVyZSBqdXN0IG1lYW5zIHNsaWdodGx5IGxlc3MgZGF0YS4gSXQgc2hvdWxkIHN0aWxsIGJlCiAgYWJsZSB0byBwcm9jZWVkIGFuZCBjb25uZWN0IGZpbmUgdG8gdGhlIHNlcnZlci4KCkRhbmllbCAoNCBNYXJjaCAyMDA2KQotIFRob21hcyBLbGF1c25lciBwcm92aWRlZCBhIHBhdGNoIHdyaXR0ZW4gYnkgVG9kZCBWaWVybGluZyBpbiBidWcgcmVwb3J0CiAgIzE0NDI0NzEgdGhhdCBmaXhlcyBhIGJ1aWxkIHByb2JsZW0gb24gSW50ZXJpeC4KCkRhbmllbCAoMiBNYXJjaCAyMDA2KQotIEZUUCB1cGxvYWQgd2l0aG91dCBhIGZpbGUgbmFtZSBwYXJ0IGluIHRoZSBVUkwgbm93IGNhdXNlcwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgdG8gcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQuIFByZXZpb3VzbHkgaXQgYWxsb3dlZCB0aGUKICB1cGxvYWQgYnV0IG5hbWVkIHRoZSBmaWxlICIobmlsKSIgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFRlc3QgY2FzZSA1MjQKICB2ZXJpZmllcy4KCi0gQWRkZWQgYSBjaGVjayBmb3IgZ2V0cHJvdG9ieW5hbWUgaW4gY29uZmlndXJlIHNvIHRoYXQgaXQnbGwgYmUgdXNlZCwgdGhhbmtzCiAgdG8gR2lzbGUgVmFuZW0ncyBjaGFuZ2UgdGhlIG90aGVyIGRheS4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwNikKLSBEYW4gRmFuZHJpY2ggcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcCBpbiBjYXNlIHdlCiAgYXJlIG91dCBvZiBmaWxlIGhhbmRsZXMgdmVyeSBlYXJseSBpbiBjdXJsJ3MgY29kZSB3aGVyZSBpdCBtYWtlcyBzdXJlIHRoYXQKICAwLCAxIGFuZCAyIGFyZW4ndCBnb25uYSBiZSB1c2VkIGJ5IHRoZSBsaWIgZm9yIHRyYW5zZmVycy4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNikKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIHdlcmUgdHdvIFZNUy1zcGVjaWZpYyBmaWxlcyBtaXNzaW5nIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZS4KClZlcnNpb24gNy4xNS4yICgyNyBGZWJydWFyeSAyMDA2KQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA2KQotIExvdHMgb2Ygd29yayBhbmQgYW5hbHlzaXMgYnkgInhieF9fXyIgaW4gYnVnICMxNDMxNzUwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MzE3NTApIGhlbHBlZCBtZSBpZGVudGlmeSBhbmQgZml4IHR3bwogIGRpZmZlcmVudCBidXQgcmVsYXRlZCBidWdzOgoKICAxKSBSZW1vdmluZyBhbiBlYXN5IGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIGJlZm9yZSB0aGUgdHJhbnNmZXIgaXMgZG9uZQogICAgIGNvdWxkIGxlYXZlIGEgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBmb3IgdGhhdCBoYW5kbGUgdGhhdCBpcwogICAgIGluIGEgc3RhdGUgdGhhdCBpc24ndCBzdWl0YWJsZSBmb3IgcmUtdXNlLiBBIHN1YnNlcXVlbnQgcmUtdXNlIGNvdWxkIHRoZW4KICAgICByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIgYW5kIHNlZ2ZhdWx0LgoKICAyKSBXaGVuIGFuIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkIGZyb20gdGhlIG11bHRpIGhhbmRsZSwgdGhlcmUgY291bGQgYmUgYW4KICAgICBvdXRzdGFuZGluZyBjLWFyZXMgRE5TIG5hbWUgcmVzb2x2ZSByZXF1ZXN0LiBXaGVuIHRoZSByZXNwb25zZSBhcnJpdmVkLAogICAgIGl0IGNhdXNlZCBoYXZvYyBzaW5jZSB0aGUgY29ubmVjdGlvbiBzdHJ1Y3QgaXQgImJlbG9uZ2VkIiB0byBjb3VsZCd2ZQogICAgIGJlZW4gZnJlZWQgYWxyZWFkeS4KCiAgTm93IEN1cmxfZG9uZSgpIGlzIGNhbGxlZCB3aGVuIGFuIGVhc3kgaGFuZGxlIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZQogIHByZS1tYXR1cmVseSAodGhhdCBpcywgYmVmb3JlIHRoZSB0cmFuc2ZlciB3YXMgY29tcGx0ZXRlZCkuIEN1cmxfZG9uZSgpIGFsc28KICBtYWtlcyBzdXJlIHRvIGNhbmNlbCBhbGwgKGlmIGFueSkgb3V0c3RhbmRpbmcgYy1hcmVzIHJlcXVlc3RzLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA2KQotIFBldGVyIFN1IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNCBwcm94aWVzLiBFbmFibGUgdGhpcyBieSBzZXR0aW5nIHRoZSBwcm94eQogIHR5cGUgdG8gdGhlIGFscmVhZHkgcHJvdmlkZWQgdHlwZSBDVVJMUFJPWFlfU09DS1M0LgoKICBJIGFkZGVkIGEgLS1zb2NrczQgb3B0aW9uIHRoYXQgd29ya3MgbGlrZSB0aGUgY3VycmVudCAtLXNvY2tzNSBvcHRpb24gYnV0CiAgaW5zdGVhZCB1c2UgdGhlIHNvY2tzNCBwcm90b2NvbC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIGFuIGlzc3VlIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiBhbmQgY29tcHJlc3NlZAogIGNvbnRlbnQgd2hlbiBsaWJjdXJsIGRpZG4ndCBob25vciB0aGUgaW50ZXJuYWwgaWdub3JlYm9keSBmbGFnLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA2KQotIFVsZiBI5HJuaGFtbWFyIGZpeGVkIGEgZm9ybWF0IHN0cmluZyAocHJpbnRmIHN0eWxlKSBwcm9ibGVtIGluIHRoZSBOZWdvdGlhdGUKICBjb2RlLiBJdCBzaG91bGQgaG93ZXZlciBub3QgYmUgdGhlIGNhdXNlIG9mIGFueSB0cm91Ymxlcy4gSGUgYWxzbyBmaXhlZCBhCiAgZmV3IHNpbWlsYXIgcHJvYmxlbXMgaW4gdGhlIEhUVFAgdGVzdCBzZXJ2ZXIgY29kZS4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IHByb3ZpZGVkIGEgZml4IGZvciB0aGUgRE5TIGNhY2hlIHdoZW4gdXNpbmcgc2hvcnQgbGlmZSB0aW1lcywKICBhcyBwcmV2aW91c2x5IGl0IGNvdWxkIGJlIGhvbGRpbmcgb24gdG8gb2xkIGNhY2hlZCBlbnRyaWVzIGxvbmdlciB0aGFuCiAgcmVxdWVzdGVkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA2KQotIEthcmwgTW9lcmRlciBhZGRlZCB0aGUgQ1VSTE9QVF9DT05ORUNUX09OTFkgYW5kIENVUkxJTkZPX0xBU1RTT0NLRVQgb3B0aW9ucwogIHRoYXQgYW4gYXBwIGNhbiB1c2UgdG8gbGV0IGxpYmN1cmwgb25seSBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QgYW5kIHRoZW4KICBleHRyYWN0IHRoZSBzb2NrZXQgZnJvbSBsaWJjdXJsLiBsaWJjdXJsIHdpbGwgdGhlbiBub3QgYXR0ZW1wdCB0byBkbyBhbnkKICB0cmFuc2ZlciBhdCBhbGwgYWZ0ZXIgdGhlIGNvbm5lY3QgaXMgZG9uZS4KCi0gS2VudCBCb29ydHogaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgR251VExTIHRvIHByb3Blcmx5IHNldCBMSUJTCiAgaW5zdGVhZCBvZiBMREZMQUdTLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDYpCi0gUGhpbGlwcGUgVmF1Y2hlciBwcm92aWRlZCBhIGJyaWxsaWFudCBwaWVjZSBvZiB0ZXN0IGNvZGUgdGhhdCBzaG93IGEgcHJvYmxlbQogIHdpdGggcmUtdXNlZCBGVFAgY29ubmVjdGlvbnMuIElmIHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUgc2FtZSBjb25uZWN0aW9uCiAgd2FzIHNldCBub3QgdG8gZmV0Y2ggYSAiYm9keSIsIGxpYmN1cmwgY291bGQgZ2V0IGNvbmZ1c2VkIGFuZCBjb25zaWRlciBpdCBhbgogIGF0dGVtcHQgdG8gdXNlIGEgZGVhZCBjb25uZWN0aW9uIGFuZCB3b3VsZCBnbyBhY3RpbmcgbWlnaHR5IHN0cmFuZ2UuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNikKLSBNYWtlIC0tbGltaXQtcmF0ZSBbbnVtXSBtZWFuIGJ5dGVzLiBJdCB1c2VkIHRvIGJlIHRoYXQgYnV0IGl0IGJyb2tlIGluIG15CiAgY2hhbmdlIGRvbmUgaW4gTm92ZW1iZXIgMjAwNS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA2KQotIEFkZGVkIENVUkxPUFRfTE9DQUxQT1JUIGFuZCBDVVJMT1BUX0xPQ0FMUE9SVFJBTkdFIHRvIGxpYmN1cmwuIFNldCB3aXRoIHRoZQogIGN1cmwgdG9vbCB3aXRoIC0tbG9jYWwtcG9ydC4gUGxhaW4gYW5kIHNpbXBseSBzZXQgdGhlIHJhbmdlIG9mIHBvcnRzIHRvIGJpbmQKICB0aGUgbG9jYWwgZW5kIG9mIGNvbm5lY3Rpb25zIHRvLiBJbXBsZW1lbnRlZCBvbiB0byBwb3B1bGFyIGRlbWFuZC4KCi0gQmFzZWQgb24gYW4gZXJyb3IgcmVwb3J0IGJ5IFBoaWxpcHBlIFZhdWNoZXIsIHdlIG5vIGxvbmdlciBjb3VudCBhIHJldHJpZWQKICBjb25uZWN0aW9uIHNldHVwIGFzIGEgZm9sbG93LXJlZGlyZWN0LiBJdCB0dXJucyBvdXQgMSkgdGhpcyBmYWlscyB3aGVuIGEgRlRQCiAgY29ubmVjdGlvbiBpcyByZS1zZXR1cCBhbmQgMikgaXQgZG9lcyBtYWtlIHRoZSBtYXgtcmVkaXJzIGNvdW50ZXIgYmVoYXZlCiAgd3JvbmcuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwNikKLSBNaWNoYWwgTWFyZWsgcHJvdmlkZWQgYSBwYXRjaCBmb3IgRlRQIHRoYXQgbWFrZXMgbGliY3VybCBjb250aW51ZSB0byB0cnkKICBQQVNWIGV2ZW4gYWZ0ZXIgRVBTViByZXR1cm5lZCBhIHBvc2l0aXZlIHJlc3BvbnNlIGNvZGUsIGlmIGxpYmN1cmwgZmFpbGVkIHRvCiAgY29ubmVjdCB0byB0aGUgcG9ydCBudW1iZXIgdGhlIEVQU1YgcmVzcG9uc2Ugc2FpZC4gT2J2aW91c2x5IHNvbWUgcGVvcGxlIGFyZQogIGdvaW5nIHRocm91Z2ggcHJvdG9jb2wtc2Vuc2l0aXZlIGZpcmV3YWxscyAob3Igc2ltaWxhcikgdGhhdCBkb24ndAogIHVuZGVyc3RhbmQgRVBTViBhbmQgdGhlbiB0aGV5IGRvbid0IGFsbG93IHRoZSBzZWNvbmQgY29ubmVjdGlvbiB1bmxlc3MgUEFTVgogIHdhcyB1c2VkLiBUaGlzIGFsc28gY2FsbGVkIGZvciBhIG1pbm9yIGZpeCBvZiB0ZXN0IGNhc2UgMjM4LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDYpCi0gRHVhbmUgQ2F0aGV5IHdhcyBvbmUgb2Ygb3VyIGZyaWVuZHMgd2hvIHJlcG9ydGVkIHRoYXQgY3VybCAtUCBbSVBdCiAgKENVUkxPUFRfRlRQUE9SVCkgZGlkbid0IHdvcmsgZm9yIGlwdjYtZW5hYmVkIGN1cmxzIGlmIHRoZSBJUCB3YXNuJ3QgYQogICJuYXRpdmUiIElQIHdoaWxlIGl0IHdvcmtzIGZpbmUgZm9yIGlwdjYtZGlzYWJsZWQgYnVpbGRzIQoKICBJbiB0aGUgcHJvY2VzcyBvZiBmaXhpbmcgdGhpcywgSSByZW1vdmVkIHRoZSBzdXBwb3J0IGZvciBMUFJUIHNpbmNlIEkgY2FuJ3QKICB0aGluayBvZiBtYW55IHJlYXNvbnMgdG8ga2VlcCBkb2luZyBpdCBhbmQgYXNraW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QgZGlkbid0CiAgcmV2ZWFsIGFueW9uZSBlbHNlIHRoYXQgY291bGQgZWl0aGVyLiBUaGUgY29kZSB0aGF0IHNlbmRzIEVQUlQgYW5kIFBPUlQgaXMKICBub3cgYWxzbyBhIGxvdCBzaW1wbGVyIHRoYW4gYmVmb3JlIChJTUhPKS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA2KQotIEpvbiBUdXJuZXIgcG9pbnRlZCBvdXQgdGhhdCBkb2luZyAtUCBbaG9zdG5hbWVdIChDVVJMT1BUX0ZUUFBPUlQpIHdpdGggY3VybAogIChidWlsdCBpcHY0LW9ubHkpIGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDYpCi0gQXMgcmVwb3J0ZWQgaW4gYnVnICMxNDA4NzQyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDA4NzQyKSwKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21wbGFpbmVkIGFib3V0IGEgbWlzc2luZyAibWlzc2luZyIgc2NyaXB0IGlmIHlvdSByYW4KICBjb25maWd1cmUgd2l0aGluIGEgcGF0aCB3aG9zZSBuYW1lIGluY2x1ZGVkIG9uZSBvciBtb3JlIHNwYWNlcy4gVGhpcyBpcyBkdWUKICB0byBhIGZsYXcgaW4gYXV0b21ha2UgKDEuOS42IGFuZCBlYXJsaWVyKS4gSSd2ZSBub3cgd29ya2VkIGFyb3VuZCBpdCBieQogIGluY2x1ZGluZyBhbiAib3ZlcmxvYWRlZCIgdmVyc2lvbiBvZiB0aGUgQU1fTUlTU0lOR19IQVNfUlVOIHNjcmlwdCB0aGF0J2xsCiAgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvbmUgYXV0b21ha2Ugc2hpcHMgd2l0aC4gVGhpcyBrbHVkZ2UgbmVlZHMgdG8gYmUKICByZW1vdmVkIG9uY2Ugd2UgZ2V0IGFuIGF1dG9tYWtlIHZlcnNpb24gd2l0aCB0aGlzIHByb2JsZW0gY29ycmVjdGVkLgogIFBvc3NpYmx5IHdlJ2xsIHRoZW4gbmVlZCB0byBjb252ZXJ0IHRoaXMgaW50byBhIGtsdWRnZSBkZXBlbmRpbmcgb24gd2hhdAogIGF1dG9tYWtlIHZlcnNpb24gdGhhdCBpcyB1c2VkIGFuZCB0aGF0IGlzIGdvbm5hIGJlIHBhaW5mdWwgYW5kIEkgZG9uJ3QgZXZlbgogIHdhbnQgdG8gdGhpbmsgYWJvdXQgdGhhdCBub3cuLi4hCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3OiBIZXJlIGlzIHRoZSBsYXRlc3QgbGliY3VybC5tNCBhdXRvY29uZiB0ZXN0cy4gSXQgaXMgdXBkYXRlZCB3aXRoCiAgdGhlIGxhdGVzdCBmZWF0dXJlcyBhbmQgcHJvdG9jb2xzIHRoYXQgbGliY3VybCBzdXBwb3J0cyBhbmQgaGFzIGEgbWlub3IgZml4CiAgdG8gYmV0dGVyIGRlYWwgd2l0aCB0aGUgb2JzY3VyZSBjYXNlIHdoZXJlIHNvbWVvbmUgaGFzIG1vcmUgdGhhbiBvbmUgbGliY3VybAogIGluc3RhbGxlZCBhdCB0aGUgc2FtZSB0aW1lLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDYpCi0gRGF2aWQgU2hhdyBmaW5hbGx5IHJlbW92ZWQgYWxsIHRyYWNlcyBvZiBHb3BoZXIgYW5kIHdlIGFyZSBub3cgb2ZmaWNpYWxseQogIG5vdCBzdXBwb3J0aW5nIGl0LiBJdCBoYXNuJ3QgYmVlbiBmdW5jdGlvbmluZyBmb3IgeWVhcnMgYW55d2F5LCBzbyB0aGlzIGlzCiAganVzdCBmaW5hbGx5IHN0YXRpbmcgd2hhdCBhbHJlYWR5IHdhcyB0cnVlLiBBbmQgYSBjbGVhbnVwIGF0IHRoZSBzYW1lIHRpbWUuCgotIEJyeWFuIEhlbmRlcnNvbiB0dXJuZWQgdGhlICdpbml0aWFsaXplZCcgdmFyaWFibGUgZm9yIGN1cmxfZ2xvYmFsX2luaXQoKQogIGludG8gYSBjb3VudGVyLCBhbmQgdGh1cyB5b3UgY2FuIG5vdyBkbyBtdWx0aXBsZSBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIHlvdQogIGFyZSB0aGVuIHN1cHBvc2VkIHRvIGRvIHRoZSBzYW1lIGFtb3VudCBvZiBjYWxscyB0byBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCiAgQnJ5YW4gaGFzIGFsc28gdXBkYXRlZCB0aGUgZG9jcyBhY2NvcmRpbmdseS4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA2KQotIEFuZHJldyBCZW5oYW0gZml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGNvdWxkIGNhdXNlIHRoZQogIHRlc3Qgc2NyaXB0IHRvIGtpbGwgYWxsIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzIGdyb3VwIQoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDYpCi0gTWljaGFlbCBKYWhuOgoKICBGaXhlZCBGVFBfU0tJUF9QQVNWX0lQIGFuZCBGVFBfVVNFX0VQU1YgdG8gImRvIHJpZ2h0IiB3aGVuIHVzZWQgb24gRlRQIHRocnUKICBIVFRQIHByb3h5LgoKICBGaXhlZCBQUk9YWVRVTk5FTCB0byB3b3JrIGZpbmUgd2hlbiB5b3UgZG8gZnRwIHRocm91Z2ggYSBwcm94eS4gIEl0IHdvdWxkCiAgcHJldmlvdXNseSBvdmVyd3JpdGUgaW50ZXJuYWwgbWVtb3J5IGFuZCBjYXVzZSB1bnByZWRpY3RlZCBiZWhhdmlvdXIhCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNikKLSBJIGRlY2lkZWQgdG8gZG9jdW1lbnQgdGhlICJzZWNyZXQgb3B0aW9uIiBoZXJlIG5vdywgYXMgSSd2ZSByZWNlaXZlZCAqTk8qCiAgZmVlZGJhY2sgYXQgYWxsIG9uIG15IG1haWxpbmcgbGlzdCByZXF1ZXN0cyBmcm9tIE5vdmVtYmVyIDIwMDU6CgogIEknbSBsb29raW5nIGZvciBmZWVkYmFjayBhbmQgY29tbWVudHMuIEkgYWRkZWQgc29tZSBleHBlcmltZW50YWwgY29kZSB0aGUKICBvdGhlciBkYXksIHRoYXQgYWxsb3dzIGEgbGliY3VybCB1c2VyIHRvIHNlbGVjdCB3aGF0IG1ldGhvZCBsaWJjdXJsIHNob3VsZAogIHVzZSB0byByZWFjaCBhIGZpbGUgb24gYSBGVFAoUykgc2VydmVyLgoKICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIENWUyBjb2RlIGFuZCBpbiByZWNlbnQgZGFpbHkgc25hcHNob3RzLgoKICBMZXQgbWUgZXhwbGFpbi4uLgoKICBUaGUgY3VycmVudCBuYW1lIGZvciB0aGUgb3B0aW9uIGlzIENVUkxPUFRfRlRQX0ZJTEVNRVRIT0QgKC0tZnRwLW1ldGhvZCBmb3IKICB0aGUgY29tbWFuZCBsaW5lIHRvb2wpIGFuZCB5b3Ugc2V0IGl0IHRvIGEgbG9uZyAodGhlcmUgYXJlIGN1cnJlbmx5IG5vCiAgZGVmaW5lcyBmb3IgdGhlIGFyZ3VtZW50IHZhbHVlcywganVzdCBwbGFpbiBudW1lcmljYWxzKS4gWW91IGNhbiBzZXQgdGhyZWUKICBkaWZmZXJlbnQgIm1ldGhvZHMiIHRoYXQgZG8gdGhpczoKCiAgMSBtdWx0aWN3ZCAtIGxpa2UgdG9kYXksIGN1cmwgd2lsbCBkbyBhIHNpbmdsZSBDV0Qgb3BlcmF0aW9uIGZvciBlYWNoIHBhdGgKICAgICAgICAgICBwYXJ0IGluIHRoZSBnaXZlbiBVUkwuIEZvciBkZWVwIGhpZXJhcmNoaWVzIHRoaXMgbWVhbnMgdmVyeSBtYW55CiAgICAgICAgICAgY29tbWFuZHMuIFRoaXMgaXMgaG93IFJGQzE3Mzggc2F5cyBpdCBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyB0aGUKICAgICAgICAgICBkZWZhdWx0LgoKICAyIG5vY3dkIC0gbm8gQ1dEIGF0IGFsbCBpcyBkb25lLCBjdXJsIHdpbGwgZG8gU0laRSwgUkVUUiwgU1RPUiBldGMgYW5kIGdpdmUKICAgICAgICAgICBhIGZ1bGwgcGF0aCB0byB0aGUgc2VydmVyLgoKICAzIHNpbmdsZWN3ZCAtIG1ha2Ugb25lIENXRCB3aXRoIHRoZSBmdWxsIHRhcmdldCBkaXJlY3RvcnkgYW5kIHRoZW4gb3BlcmF0ZQogICAgICAgICAgICBvbiB0aGUgZmlsZSAibm9ybWFsbHkiLgoKICAoV2l0aCB0aGUgY29tbWFuZCBsaW5lIHRvb2wgeW91IGRvIC0tZnRwLW1ldGhvZCBbTUVUSE9EXSwgd2hlcmUgW01FVEhPRF0gaXMKICBvbmUgb2YgIm11bHRpY3dkIiwgIm5vY3dkIiBvciAic2luZ2xlY3dkIi4pCgogIFdoYXQgZmVlZGJhY2sgSSdtIGludGVyZXN0ZWQgaW46CgogIDEgLSBEbyB0aGV5IHdvcmsgYXQgYWxsPyBEbyB5b3UgZmluZCBzZXJ2ZXJzIHdoZXJlIG9uZSBvZiB0aGVzZSBkb24ndCB3b3JrPwoKICAyIC0gV2hhdCB3b3VsZCBwcm9wZXIgbmFtZXMgZm9yIHRoZSBvcHRpb24gYW5kIGl0cyBhcmd1bWVudHMgYmUsIGlmIHdlCiAgICAgIGNvbnNpZGVyIHRoaXMgZmVhdHVyZSBnb29kIGVub3VnaCB0byBnZXQgaW5jbHVkZWQgYW5kIGRvY3VtZW50ZWQgaW4KICAgICAgdXBjb21pbmcgcmVsZWFzZXM/CgogIDMgLSBTaG91bGQgd2UgbWFrZSBsaWJjdXJsIGFibGUgdG8gIndhbGsgdGhyb3VnaCIgdGhlc2Ugb3B0aW9ucyBpbiBjYXNlIG9mCiAgICAgIChwYXRoIHJlbGF0ZWQpIGZhaWx1cmVzLCBvciBzaG91bGQgaXQgZmFpbCBhbmQgbGV0IHRoZSB1c2VyIHJlZG8gYW55CiAgICAgIHBvc3NpYmxlIHJldHJpZXM/CgogIChUaGlzIG9wdGlvbiBpcyBub3QgZG9jdW1lbnRlZCBpbiBhbnkgbWFuIHBhZ2UganVzdCB5ZXQgc2luY2UgSSdtIG5vdCBzdXJlCiAgdGhlc2UgbmFtZXMgd2lsbCBiZSB1c2VkIG9yIGlmIHRoZSBmdW5jdGlvbmFsaXR5IHdpbGwgZW5kIHVwIGV4YWN0bHkgbGlrZQogIHRoaXMuICBBbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMgd2UgaGF2ZSBubyB0ZXN0IGNhc2VzIGZvciB0aGVzZSB5ZXQuKQoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDYpCi0gV2hlbiB1c2luZyBhIGJhZCBwYXRoIG92ZXIgRlRQLCBhcyBpbiB3aGVuIGxpYmN1cmwgY291bGRuJ3QgQ1dEIGludG8gYWxsCiAgZ2l2ZW4gc3ViZGlycywgbGliY3VybCB3b3VsZCBzdGlsbCAicmVtZW1iZXIiIHRoZSBmdWxsIHBhdGggYXMgaWYgaXQgaXMgdGhlCiAgY3VycmVudCBkaXJlY3RvcnkgbGliY3VybCBpcyBpbiBzbyB0aGF0IHRoZSBuZXh0IGN1cmxfZWFzeV9wZXJmb3JtKCkgd291bGQKICBnZXQgcmVhbGx5IGNvbmZ1c2VkIGlmIGl0IHRyaWVkIHRoZSBzYW1lIHBhdGggYWdhaW4gLSBhcyBpdCB3b3VsZCBub3QgaXNzdWUKICBhbnkgQ1dEIGNvbW1hbmRzIGF0IGFsbCwgYXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBpbiB0aGUgInByb3BlciIgZGlyLgoKICBTdGFydGluZyBub3csIGEgZmFpbGVkIENXRCBjb21tYW5kIHNldHMgYSBmbGFnIHRoYXQgcHJldmVudHMgdGhlIHBhdGggdG8gYmUKICAicmVtZW1iZXJlZCIgYWZ0ZXIgcmV0dXJuaW5nLgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG4gZml4ZWQgc28gdGhhdCB0aGUgc2Vjb25kIENPTk5FQ1Qgd2hlbiBkb2luZyBGVFAgb3ZlciBhIEhUVFAKICBwcm94eSBhY3R1YWxseSB1c2VkIGEgbmV3IGNvbm5lY3Rpb24gYW5kIG5vdCBzZW50IHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUKICBmaXJzdCBzb2NrZXQhCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA2KQotIEFsZXhhbmRlciBMYXppYyBtYWRlIHRoZSBidWlsZGNvbmYgcnVuIHRoZSBidWlsZGNvbmYgaW4gdGhlIGFyZXMgZGlyIGlmIHRoYXQKICBpcyBwcmVzZW50IGluc3RlYWQgb2YgdHJ5aW5nIHRvIG1pbWljIHRoYXQgc2NyaXB0IGluIGN1cmwncyBidWlsZGNvbmYKICBzY3JpcHQuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA2KQotIEFuZHJlcyBHYXJjaWEgbWFkZSB0aGUgVEZUUCB0ZXN0IHNlcnZlciBidWlsZCB3aXRoIG1pbmd3LgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDUpCi0gSmVhbiBKYWNxdWVzIERyb3VpbiBwb2ludGVkIG91dCB0aGF0IHlvdSBjb3VsZCBvbmx5IGhhdmUgYSB1c2VyIG5hbWUgb3IKICBwYXNzd29yZCBvZiAxMjcgYnl0ZXMgb3IgbGVzcyBlbWJlZGRlZCBpbiBhIFVSTCwgd2hlcmUgYWN0dWFsbHkgdGhlIGNvZGUKICB1c2VzIGEgMjU1IGJ5dGUgYnVmZmVyIGZvciBpdCEgTW9kaWZpZWQgbm93IHRvIHVzZSB0aGUgZnVsbCBidWZmZXIgc2l6ZS4KCkRhbmllbCAoMTIgRGVjZW1iZXIgMjAwNSkKLSBEb3YgTXVyaWsgY29ycmVjdGVkIHRoZSBIVFRQX09OTFkgZGVmaW5lIHRvIGRpc2FibGUgdGhlIFRGVFAgc3VwcG9ydCBwcm9wZXJseQoKVmVyc2lvbiA3LjE1LjEgKDcgRGVjZW1iZXIgMjAwNSkKCkRhbmllbCAoNiBEZWNlbWJlciAyMDA1KQotIEZ1bGwgdGV4dCBoZXJlOiBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvYWR2XzIwMDUxMjA3Lmh0bWwgUG9pbnRlZCBvdXQgYnkKICBTdGVmYW4gRXNzZXIuCgogIFZVTE5FUkFCSUxJVFkKCiAgbGliY3VybCdzIFVSTCBwYXJzZXIgZnVuY3Rpb24gY2FuIG92ZXJmbG93IGEgbWFsbG9jZWQgYnVmZmVyIGluIHR3byB3YXlzLCBpZgogIGdpdmVuIGEgdG9vIGxvbmcgVVJMLgoKICBUaGVzZSBvdmVyZmxvd3MgaGFwcGVuIGlmIHlvdQogCiAgMSAtIHBhc3MgaW4gYSBVUkwgd2l0aCBubyBwcm90b2NvbCAobGlrZSAiaHR0cDovLyIpIHByZWZpeCwgdXNpbmcgbm8gc2xhc2gKICAgICAgYW5kIHRoZSBzdHJpbmcgaXMgMjU2IGJ5dGVzIG9yIGxvbmdlci4gVGhpcyBsZWFkcyB0byBhIHNpbmdsZSB6ZXJvIGJ5dGUKICAgICAgb3ZlcmZsb3cgb2YgdGhlIG1hbGxvY2VkIGJ1ZmZlci4KCiAgMiAtIHBhc3MgaW4gYSBVUkwgd2l0aCBvbmx5IGEgcXVlc3Rpb24gbWFyayBhcyBzZXBhcmF0b3IgKG5vIHNsYXNoKSBiZXR3ZWVuCiAgICAgIHRoZSBob3N0IGFuZCB0aGUgcXVlcnkgcGFydCBvZiB0aGUgVVJMLiBUaGlzIGxlYWRzIHRvIGEgc2luZ2xlIHplcm8gYnl0ZQogICAgICBvdmVyZmxvdyBvZiB0aGUgbWFsbG9jZWQgYnVmZmVyLgoKICBCb3RoIG92ZXJmbG93cyBjYW4gYmUgbWFkZSB3aXRoIHRoZSBzYW1lIGlucHV0IHN0cmluZywgbGVhZGluZyB0byB0d28gc2luZ2xlCiAgemVybyBieXRlIG92ZXJ3cml0ZXMuCgogIFRoZSBhZmZlY3RlZCBmbGF3IGNhbm5vdCBiZSB0cmlnZ2VyZWQgYnkgYSByZWRpcmVjdCwgYnV0IHRoZSBsb25nIFVSTCBtdXN0CiAgYmUgcGFzc2VkIGluICJkaXJlY3RseSIgdG8gbGliY3VybC4gSXQgbWFrZXMgdGhpcyBhICJsb2NhbCIgcHJvYmxlbS4gT2YKICBjb3Vyc2UsIGxvdHMgb2YgcHJvZ3JhbXMgbWF5IHN0aWxsIHBhc3MgaW4gdXNlci1wcm92aWRlZCBVUkxzIHRvIGxpYmN1cmwKICB3aXRob3V0IGRvaW5nIG11Y2ggc3ludGF4IGNoZWNraW5nIG9mIHRoZWlyIG93biwgYWxsb3dpbmcgYSB1c2VyIHRvIGV4cGxvaXQKICB0aGlzIHZ1bG5lcmFiaWxpdHkuCgogIFRoZXJlIGlzIG5vIGtub3duIGV4cGxvaXQgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgoKCkRhbmllbCAoMiBEZWNlbWJlciAyMDA1KQotIEphbWllIE5ld3RvbiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwncyBmaWxlOi8vIGNvZGUgd291bGQgY2xvc2UoKSBhIHplcm8KICBmaWxlIGRlc2NyaXB0b3IgaWYgZ2l2ZW4gYSBub24tZXhpc3RpbmcgZmlsZS4KCkRhbmllbCAoMjQgTm92ZW1iZXIgMjAwNSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYSBzZXQgb2YgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBESkdQUAogIGFnYWluIHVzaW5nIGNvbmZpZ3VyZS4KCi0gWWFuZyBUc2UgcHJvdmlkZWQgYSB3aG9sZSBzZXJpZXMgb2YgcGF0Y2hlcyB0byBjbGVhciB1cCBjb21waWxlciB3YXJuaW5ncyBvbgogIE1TVkMgNi4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMjAwNSkKLSBJIGV4dGVuZGVkIGEgcGF0Y2ggZnJvbSBEYXZpZCBTaGF3IHRvIG1ha2UgbGliY3VybCBfYWx3YXlzXyBwcm92aWRlIGFuIGVycm9yCiAgc3RyaW5nIGluIHRoZSBnaXZlbiBlcnJvciBidWZmZXIgdG8gYWRkcmVzcyB0aGUgZmxhdyBtZW50aW9uIG9uIDIxIHNlcCAyMDA1LgoKRGFuaWVsICgxNiBOb3ZlbWJlciAyMDA1KQotIEFwcGxpZWQgQWxiZXJ0IENoaW4ncyBwYXRjaCB0aGF0IG1ha2VzIHRoZSBsaWJjdXJsLnBjIHBrZ2NvbmZpZyBmaWxlIGdldAogIGluc3RhbGxlZCBvbiAnbWFrZSBpbnN0YWxsJyB0aW1lLgoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDA1KQotIFF1YWdtaXJlIHJlcG9ydGVkIHRoYXQgaGUgbmVlZGVkIHRvIHJhaXNlIGEgTlRMTSBidWZmZXIgZm9yIFNTUEkgdG8gd29yawogIHByb3Blcmx5IGZvciBhIGNhc2UsIGFuZCBzbyB3ZSBkaWQuIFdlIHJhaXNlZCBpdCBldmVuIGZvciBub24tU1NQSSBidWlsZHMKICBidXQgaXQgc2hvdWxkIG5vdCBkbyBhbnkgaGFybS4gaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTM1NjcxNQoKLSBKYW4gS3VuZGVyJ3MgZGViaWFuIGJ1ZyByZXBvcnQKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzM4NjgwIGlkZW50aWZpZWQgYSB3ZWlyZAogIGVycm9yIG1lc3NhZ2UgZm9yIHdoZW4geW91IHRyeSB0byB1cGxvYWQgYSBmaWxlIGFuZCB0aGUgcmVxdWVzdGVkIGRpcmVjdG9yeQogIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHRhcmdldCBzZXJ2ZXIuCgotIFlhbmcgVHNlIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIGxpYi9zc2x1c2UuYyB3aXRoIE9wZW5TU0wgMC45LjggYW5kIGluCiAgbGliL21lbWRlYnVnLmggdGhhdCBzaG93ZWQgdXAgaW4gaGlzIG1zdmMgYnVpbGRzLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDA1KQotIERlYmlhbiBidWcgcmVwb3J0IDMzODY4MSBieSBKYW4gS3VuZGVyOiBtYWtlIGN1cmwgYmV0dGVyIGRldGVjdCBhbmQgcmVwb3J0CiAgYmFkIGxpbWl0LXJhdGUgdW5pdHM6CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMzODY4MSBOb3cgY3VybCB3aWxsIHJldHVybgogIGVycm9yIGlmIGEgYmFkIHVuaXQgaXMgdXNlZC4KCi0gVGhhbmtzIHRvIHRoaXMgbmljZSBzdW1tYXJ5IG9mIHBvbGwoKSBpbXBsZW1lbnRhdGlvbnM6CiAgaHR0cDovL3d3dy5ncmVlbmVuZC5vcmcudWsvcmprLzIwMDEvMDYvcG9sbC5odG1sIGFuZCBmdXJ0aGVyIHRlc3RzIGJ5IEV1Z2VuZQogIEtvdGx5YXJvdiwgd2Ugbm93IGtub3cgdGhhdCBjeWd3aW4ncyBwb2xsIHJldHVybnMgb25seSBQT0xMSFVQIG9uIHJlbW90ZQogIGNvbm5lY3RpbiBjbG9zdXJlIHNvIHdlIGNoZWNrIGZvciB0aGF0IGNhc2UgKHRvbykgYW5kIHJlLWVuYWJsZSBwb2xsIGZvcgogIGN5Z3dpbiBidWlsZHMuCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDUpCi0gRXVnZW5lIEtvdGx5YXJvdiBmb3VuZCBvdXQgdGhhdCBjeWd3aW4ncyBwb2xsKCkgZnVuY3Rpb24gaXNuJ3QgZG9pbmcgdGhpbmdzCiAgcmlnaHQ6IGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMTEvMDA0NS5odG1sIHNvIHdlIG5vdyBkaXNhYmxlCiAgcG9sbCgpIGFuZCB1c2Ugc2VsZWN0KCkgb24gY3lnd2luIHRvbyAod2UgYWxyZWFkeSBkbyB0aGUgc2FtZSBjaG9pY2Ugb24gTWFjCiAgT1MgWCkKCi0gRGltYSBCYXJza3kgcGF0Y2hlZCBwcm9ibGVtICMxMzQ4OTMwOiB0aGUgR251VExTIGNvZGUgY29tcGxldGVseSBpZ25vcmVkCiAgY2xpZW50IGNlcnRpZmljYXRlcyEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzNDg5MzApLgoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDA1KQotIERhdmlkIExhbmcgZml4ZWQgSVB2NiBzdXBwb3J0IGZvciBURlRQIQoKLSBJbnRyb2R1Y2luZyByYW5nZSBzdGVwcGluZyB0byB0aGUgY3VybCBnbG9iYmluZyBzdXBwb3J0LiBOb3cgeW91IGNhbiBzcGVjaWZ5CiAgc3RlcCBjb3VudGVyIGJ5IGFkZGluZyA6W251bV0gd2l0aGluIHRoZSBicmFja2V0cyB3aGVuIHNwZWNpZnlpbmcgYSByYW5nZToKCiAgIFsxLTEwMDoxMF0KICAgW2EtejoyXQoKICBJZiBubyBzdGVwIGNvdW50ZXIgaXMgc2V0LCBpdCBkZWZhdWx0cyB0byAxIGFzIGJlZm9yZToKCiAgIFsxLTEwMF0KICAgW2QtaF0KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA1KQotIFJlbW92ZWQgdGhlIHVzZSBvZiBBSV9DQU5PTk5BTUUgaW4gdGhlIElQdjYtZW5hYmxlZCByZXNvbHZlciBmdW5jdGlvbnMgc2luY2UKICB3ZSByZWFsbHkgaGF2ZSBubyB1c2UgZm9yIHJldmVyc2UgbG9va3VwcyBvZiB0aGUgYWRkcmVzcy4KCiAgSSB0cnVseSBob3BlIHRoZXNlIGFyZSB0aGUgbGFzdCByZXZlcnNlIGxvb2t1cHMgd2UgaGFkIGxpbmdlcmluZyBpbiB0aGUKICBjb2RlIQoKLSBEbWl0cnkgQmFydHNldmljaCBkaXNjb3ZlcmVkIHNvbWUgaXNzdWVzIGluIGNvbXBhdGliaWx0eSBvZiBTU1BJLWVuYWJsZWQKICB2ZXJzaW9uIG9mIGxpYmN1cmwgd2l0aCBkaWZmZXJlbnQgV2luZG93cyB2ZXJzaW9ucy4gQ3VycmVudCB2ZXJzaW9uIG9mCiAgbGliY3VybCBpbXBvcnRzIFNTUEkgZnVuY3Rpb25zIGZyb20gc2VjdXIzMi5kbGwuIEhvd2V2ZXIsIHVuZGVyIFdpbmRvd3MgTlQKICA0LjAgdGhlc2UgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGluIHNlY3VyaXR5LmRsbCwgdW5kZXIgV2luZG93cyA5eCAtIGluCiAgc2VjdXIzMi5kbGwgYW5kIFdpbmRvd3MgMjAwMCBhbmQgWFAgY29udGFpbnMgYm90aCB0aGVzZSBETExzIChzZWN1cml0eS5kbGwKICBqdXN0IGZvcndhcmRzIGNhbGxzIHRvIHNlY3VyMzIuZGxsKS4KCiAgRG1pdHJ5J3MgcGF0Y2ggbG9hZHMgcHJvcGVyIGxpYnJhcnkgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIFdpbmRvd3MKICB2ZXJzaW9uLiBGdW5jdGlvbiBJbml0U2VjdXJpdHlJbnRlcmZhY2UoKSBpcyB1c2VkIHRvIG9idGFpbiBwb2ludGVycyB0byBhbGwKICBvZiBTU1BJIGZ1bmN0aW9uIGluIG9uZSBzdHJ1Y3R1cmUuCgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwNSkKLSBWaWxtb3MgTmViZWhhaiBpbXByb3ZlZCBsaWJjdXJsJ3MgTERBUCBhYmlsaXRpZXM6CgogIFRoZSBMREFQIGNvZGUgaW4gbGliY3VybCBjYW4ndCBoYW5kbGUgTERBUCBzZXJ2ZXJzIG9mIExEQVB2MyBub3IgYmluYXJ5CiAgYXR0cmlidXRlcyBpbiBMREFQIG9iamVjdHMuIFNvLCBJIG1hZGUgYSBxdWljayBwYXRjaCB0byBhZGRyZXNzIHRoZXNlCiAgcHJvYmxlbXMuCgogIFRoZSBzb2x1dGlvbiBpcyBzaW1wbGU6IGlmIHdlIGNvbm5lY3QgdG8gYW4gTERBUCBzZXJ2ZXIsIGZpcnN0IHRyeSBMREFQdjMKICAod2hpY2ggaXMgdGhlIHByZWZlcnJlZCBwcm90b2NvbCBhcyBvZiBub3cpIGFuZCB0aGVuIGZhbGwgYmFjayB0byBMREFQdjIuCiAgSW4gY2FzZSBvZiBiaW5hcnkgYXR0cmlidXRlcywgd2UgZmlyc3QgY29udmVydCB0aGVtIHRvIGJhc2U2NCwganVzdCBsaWtlIHRoZQogIG9wZW5sZGFwIGNsaWVudCBkb2VzLiBJdCB1c2VzIGxkYXBfZ2V0X3ZhbHVlc19sZW4oKSBpbnN0ZWFkIG9mCiAgbGRhcF9nZXRfdmFsdWVzKCkgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSBiaW5hcnkgYXR0cmlidXRlcyBjb3JyZWN0bHkuIEkKICBkZWZpbmVkIHRoZSBuZWNlc3NhcnkgTERBUCBtYWNyb3MgaW4gbGliL2xkYXAuYyB0byBiZSBhYmxlIHRvIGNvbXBpbGUKICBsaWJjdXJsIHdpdGhvdXQgdGhlIHByZXNlbmNlIG9mIGxpYmxkYXAKCkRhbmllbCAoMjcgT2N0b2JlciAyMDA1KQotIE5pcyBKb3JnZW5zZW4gZmlsZWQgYnVnIHJlcG9ydCAjMTMzODY0OAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM4NjQ4KSB3aGljaCByZWFsbHkgaXMgbW9yZSBvZiBhCiAgZmVhdHVyZSByZXF1ZXN0LCBidXQgYW55d2F5LiBJdCBwb2ludGVkIG91dCB0aGF0IC0tbWF4LXJlZGlycyBkaWQgbm90IGFsbG93CiAgaXQgdG8gYmUgc2V0IHRvIDAsIHdoaWNoIHRoZW4gd291bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb24gdGhlIGZpcnN0CiAgTG9jYXRpb246IGZvdW5kLiBCYXNlZCBvbiBOaXMnIHBhdGNoLCBub3cgbGliY3VybCBzdXBwb3J0cyBDVVJMT1BUX01BWFJFRElSUwogIHNldCB0byAwLCBvciAtMSBmb3IgaW5maW5pdHkuIEFkZGVkIHRlc3QgY2FzZSAyNzQgdG8gdmVyaWZ5LgoKLSB0b21taW5rW2F0XXBvc3QucGwgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjMTMzNzcyMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM3NzIzKSB0aGF0IGN1cmwgY291bGQgbm90IHVwbG9hZAogIGJpbmFyeSBkYXRhIGZyb20gc3RkaW4gb24gV2luZG93cyBpZiB0aGUgZGF0YSBjb250YWluZWQgY29udHJvbC1aIChoZXggMWEpCiAgc2luY2UgdGhhdCBpcyB0cmVhdGVkIGFzIGVuZC1vZi1maWxlIHdoZW4gcmVhZCBpbiB0ZXh0IG1vZGUuIEdpc2xlIFZhbmVtCiAgcG9pbnRlZCBvdXQgdGhlIGZpeCwgYW5kIEkgbWFkZSBib3RoIC1UIGFuZCAtLWRhdGEtYmluYXJ5IHRha2UgYWR2YW50YWdlIG9mCiAgaXQuCgotIEpheiBGcmVzaCBwb2ludGVkIG91dCB0aGF0IGlmIHlvdSB1c2VkICItciBbbnVtYmVyXSIgYXMgd2FzIHdyb25nbHkgZGVzY3JpYmVkCiAgaW4gdGhlIG1hbiBwYWdlLCBjdXJsIHdvdWxkIHNlbmQgYW4gaW52YWxpZCBIVFRQIFJhbmdlOiBoZWFkZXIuIFRoZSBjb3JyZWN0CiAgd2F5IHdvdWxkIGJlIHRvIHVzZSAiLXIgW251bWJlcl0tIiBvciBldmVuICItciAtW251bWJlcl0iLiBTdGFydGluZyBub3csCiAgY3VybCB3aWxsIHdhcm4gaWYgdGhpcyBpcyBkaXNjb3ZlcmVkLCBhbmQgYXV0b21hdGljYWxseSBhcHBlbmQgYSBkYXNoIHRvIHRoZQogIHJhbmdlIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGxpYmN1cmwuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNSkKLSBBbW9sIFBhdHRla2FyIHJlcG9ydGVkIGEgYnVnIHdpdGggZ3JlYXQgZGV0YWlsIGFuZCBhIGZpbmUgZXhhbXBsZSBpbiBidWcKICAjMTMyNjMwNiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMyNjMwNikuIFdoZW4gdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW5nIHRvIGEgaG9zdCB3aXRoIG11bHRpcGxlIElQIGFkZHJlc3NlcywgYW5kIG9uZSBvZgogIHRoZSBhZGRyZXNzZXMgZmFpbHMgdG8gY29ubmVjdCAodGhlIHNlcnZlciBtdXN0IGV4aXN0IGFuZCByZXNwb25kLCBqdXN0IG5vdAogIGFjY2VwdCBjb25uZWN0aW9ucykgbGliY3VybCBsZWFrcyBhIHNvY2tldCBkZXNjcmlwdG9yLiBUaGFua3MgdG8gdGhlIGZpbmUKICByZXBvcnQsIEkgY291bGQgZmluZCBhbmQgZml4IHRoaXMuCgpEYW5pZWwgKDIyIE9jdG9iZXIgMjAwNSkKLSBEaW1hIEJhcnNreSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBHbnVUTFMtZW5hYmxlZCBsaWJjdXJsIGluIGJ1ZyByZXBvcnQKICAjMTMzNDMzOCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzNDMzOCkuIFdoZW4gcmVhZGluZyBhbiBTU0wKICBzdHJlYW0gZnJvbSBhIHNlcnZlciBhbmQgdGhlIHNlcnZlciByZXF1ZXN0cyBhICJyZWhhbmRzaGFrZSIsIHRoZSBjdXJyZW50CiAgY29kZSBzaW1wbHkgcmV0dXJucyB0aGlzIGFzIGFuIGVycm9yLiBJIGhhdmUgbm8gZ29vZCB3YXkgdG8gdGVzdCB0aGlzLCBidXQKICBJJ3ZlIGFkZGVkIGEgY3J1ZGUgYXR0ZW1wdCBvZiBkZWFsaW5nIHdpdGggdGhpcyBzaXR1YXRpb24gc2xpZ2h0bHkgYmV0dGVyIC0KICBpdCBtYWtlcyBhIGJsb2NraW5nIGhhbmRzaGFrZSBpZiB0aGlzIGhhcHBlbnMuIERvbmUgbGlrZSB0aGlzIGJlY2F1c2UgZml4aW5nCiAgdGhpcyB0aGUgInByb3BlciIgd2F5ICh0aGF0IHdvdWxkIGhhbmRzaGFrZSBhc3luY2hyb25vdXNseSkgd2lsbCByZXF1aXJlCiAgcXVpdGUgc29tZSB3b3JrIGFuZCBJIHJlYWxseSBuZWVkIGEgZ29vZCB3YXkgdG8gdGVzdCB0aGlzIHRvIGRvIHN1Y2ggYQogIGNoYW5nZS4KCkRhbmllbCAoMjEgT2N0b2JlciAyMDA1KQotICJPZmVyIiByZXBvcnRlZCBhIHByb2JsZW0gd2hlbiBsaWJjdXJsIHJlLXVzZWQgYSBjb25uZWN0aW9uIGFuZCBmYWlsZWQgdG8gZG8KICBpdCwgaXQgY291bGQgdGhlbiBhY2NpZGVudGFsbHkgYWN0dWFsbHkgY3Jhc2guIFByZXN1bWFibHksIHRoaXMgY29uY2VybnMgRlRQCiAgY29ubmVjdGlvbnMuICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzMwMzEwCgotIFRlbXByaW11cyBpbXByb3ZlZCB0aGUgTVNWQyBtYWtlZmlsZSBzbyB0aGF0IHRoZSBzdGF0aWMgZGVidWcgU1NMIGxpYnMgYXJlCiAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGFuZCBub3QgdG8gdGhlIGxpYmN1cmxkLmxpYgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjY2NzYKCi0gQnJhZGZvcmQgQnJ1Y2UgbWFkZSB0aGUgd2luZG93cyByZXNvbHZlciBjb2RlIHByb3Blcmx5IHJldHVybgogIENVUkxFX0NPVUxETlRfUkVTT0xWRV9QUk9YWSBhbmQgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1Qgb24gcmVzb2x2aW5nCiAgZXJyb3JzIChhcyBkb2N1bWVudGVkKS4KCkRhbmllbCAoMjAgT2N0b2JlciAyMDA1KQotIERhdmUgRHJpYmluIG1hZGUgbGliY3VybCB1bmRlcnN0YW5kIGFuZCBoYW5kbGUgY2FzZXMgd2hlbiB0aGUgc2VydmVyCiAgKHdyb25nbHkpIHNlbmRzICp0d28qIFdXVy1BdXRoZW50aWNhdGUgaGVhZGVycyBmb3IgRGlnZXN0LiBXaGlsZSB0aGlzIHNob3VsZAogIG5ldmVyIGhhcHBlbiBpbiBhIHNhbmUgd29ybGQsIGxpYmN1cmwgcHJldmlvdXNseSBnb3QgaW50byBhbiBpbmZpbml0ZSBsb29wCiAgd2hlbiB0aGlzIG9jY3VycmVkLiBEYXZlIGFkZGVkIHRlc3QgMjczIHRvIHZlcmlmeSB0aGlzLgoKLSBUZW1wcmltdXMgaW1wcm92ZWQgdGhlIE1TVkMgbWFrZWZpbGU6ICJtYWtlcyBhIGJ1aWxkIG9wdGlvbiBhdmFpbGFibGUgc28gaWYKICB5b3Ugc2V0IHJ0bGliY2ZnPXN0YXRpYyBmb3IgdGhlIG1ha2UsIHRoZW4gaXQgd291bGQgYnVpbGQgd2l0aCAvTVQuIFRoZQogIGRlZmF1bHQgYmVoYXZpb3VyIGlzIC9NRCAodGhlIG9yaWdpbmFsKS4iCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMyNjY2NQoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDUpCi0gUmV2ZXJ0ZWQgdGhlIExJQkNVUkxfVkVSU0lPTl9OVU0gY2hhbmdlIGZyb20gT2N0b2JlciA2LiBBcyBEYXZlIERyaWJpbgogIHJlcG9ydGVkLCB0aGUgZGVmaW5lIGlzIHVzZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGlzIGFzc3VtZWQgdG8gdXNlCiAgdGhlIDB4WVlYWFpaIGZvcm1hdC4gVGhpcyBtYWRlICJjdXJsLWNvbmZpZyAtLXZlcm51bSIgZmFpbCBpbiB0aGUgNy4xNS4wCiAgcmVsZWFzZSB2ZXJzaW9uLgoKVmVyc2lvbiA3LjE1LjAgKDEzIE9jdG9iZXIgMjAwNSkKCkRhbmllbCAoMTIgT2N0b2JlciAyMDA1KQotIE1pY2hhZWwgU3V0dG9uIG9mIGlERUZFTlNFIHJlcG9ydGVkIGFuZCBJIGZpeGVkIGEgc2VjdXJpdGZ5IGZsYXcgaW4gdGhlIE5UTE0KICBjb2RlIHRoYXQgd291bGQgb3ZlcmZsb3cgYSBidWZmZXIgaWYgZ2l2ZW4gYSB0b28gbG9uZyB1c2VyIG5hbWUgb3IgZG9tYWluCiAgbmFtZS4gVGhpcyB3b3VsZCBoYXBwZW4gaWYgeW91IGVuYWJsZSBOVExNIGF1dGhlbnRpY2F0aW9uIGFuZCBlaXRoZXIKCiAgQSAtIHBhc3MgaW4gYSB1c2VyIG5hbWUgYW5kIGRvbWFpbiBuYW1lIHRvIGxpYmN1cmwgdGhhdCB0b2dldGhlciBhcmUgbG9uZ2VyCiAgICAgIHRoYW4gMTkyIGJ5dGVzCgogIEIgLSBhbGxvdyAobGliKWN1cmwgdG8gZm9sbG93IEhUVFAgInJlZGlyZWN0cyIgKExvY2F0aW9uOiBhbmQgdGhlCiAgICAgIGFwcHJvcHJpYXRlIEhUVFAgMzB4IHJlc3BvbnNlIGNvZGUpIGFuZCB0aGUgbmV3IFVSTCBjb250YWlucyBhIFVSTCB3aXRoCiAgICAgIGEgdXNlciBuYW1lIGFuZCBkb21haW4gbmFtZSB0aGF0IHRvZ2V0aGVyIGFyZSBsb25nZXIgdGhhbiAxOTIgYnl0ZXMKCiAgU2VlIGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9zZWN1cml0eS5odG1sIGZvciBmdXJ0aGVyIGRldGFpbHMgYW5kIHVwZGF0ZXMKCkRhbmllbCAoNSBPY3RvYmVyIDIwMDUpCi0gRGFycnlsIEhvdXNlIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHVzaW5nIC16IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gRlRQLgogIEl0IHR1cm5lZCBvdXQgdGhhdCBpZiB0aGUgZ2l2ZW4gdGltZSBzdGFtcCB3YXMgZXhhY3QgdGhlIHNhbWUgYXMgdGhlIHJlbW90ZQogIHRpbWUgc3RhbXAsIHRoZSBmaWxlIHdvdWxkIHN0aWxsIHdyb25nbHkgYmUgZG93bmxvYWRlZC4gQWRkZWQgdGVzdCBjYXNlIDI3MgogIHRvIHZlcmlmeS4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDUpCi0gRG9tZW5pY28gQW5kcmVvbGkgZml4ZWQgYSBtYW4gcGFnZSBtYWxmb3JtYXQgYW5kIHJlbW92ZWQgb2RkICgweGEwKSBieXRlcwogIGZyb20gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHRoZSBkYXRlIHBhcnNlciBoYWQgd3Jvbmcgb2Zmc2V0IHN0b3JlZCBmb3IKICB0aGUgTUVTVCBhbmQgQ0VTVCB0aW1lIHpvbmVzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNSkKLSBEYXZpZCBZYW4gZmlsZWQgYnVnICMxMjk5MTgxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjk5MTgxKQogIHRoYXQgaWRlbnRpZmllZCBhIHNpbGx5IHByb2JsZW0gd2l0aCBDb250ZW50LVJhbmdlOiBoZWFkZXJzIHdpdGggdGhlICdieXRlcycKICBrZXl3b3JkIHdyaXR0ZW4gaW4gYSBkaWZmZXJlbnQgY2FzZSB0aGFuIGFsbCBsb3dlcmNhc2UhIEl0IHdvdWxkIGNhdXNlIGEKICBzZWdmYXVsdCEKCi0gVEogU2F1bmRlcnMgb2YgdGhlIHByb2Z0cGQgcHJvamVjdCBpZGVudGlmaWVkIGFuZCBwb2ludGVkIG91dCBwcm9ibGVtcyB3aXRoCiAgdGhlIG1vZGlmaWVkIEZUUFMgbmVnb3RpYXRpb24gY2hhbmdlIG9mIEF1Z3VzdCAxOSAyMDA1LiBUaHVzLCB3ZSByZXZlcnQgdGhlCiAgY2hhbmdlIGJhY2sgdG8gcHJlLTcuMTQuMSBzdGF0dXMuCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDA1KQotIEZpeGVkICJjdXQgb2ZmIiBzZW50ZW5jZSBpbiB0aGUgbGliY3VybC10dXRvcmlhbCBtYW4gcGFnZToKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI5MzA1CgotIENsYXJpZmllZCBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSB3aGF0IHRoZSBkZWZhdWx0CiAgQ1VSTE9QVF9XUklURUZVTkNUSU9OIGFuZCBDVVJMT1BUX1dSSVRFREFUQSBtZWFuOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMTEKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHRoYXQgQ1VSTE9QVF9FUlJPUkJVRkZFUgogIHNvbWV0aW1lcyBkb2Vzbid0IGZpbGwgaW4gdGhlIGJ1ZmZlciBldmVuIHRob3VnaCBpdCBpcyBzdXBwb3NlZCB0bzoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI5MzEzCgotIFdoZW4gQ1VSTEVfVVJMX01BTEZPUk1BVCBpcyByZXR1cm5lZCBkdWUgdG8gYSBtaXNzaW5nIFVSTCwgaXQgbm93IGhhcyBhbgogIGVycm9yIHN0cmluZyBzZXQuCgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDA1KQotIERtaXRyeSBCYXJ0c2V2aWNoIG1hZGUgdGhlIFNTUEkgc3VwcG9ydCB3b3JrIG9uIFdpbmRvd3MgOXggYXMgd2VsbC4KCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDUpCi0gQWRkZWQgYSBURlRQIHNlcnZlciB0byB0aGUgdGVzdCBzdWl0ZSBhbmQgbWFkZSB0aGUgdGVzdCBzdWl0ZSBjYXBhYmxlIG9mCiAgdXNpbmcgaXQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDUpCi0gQmVuIE1hZHNlbidzIGRldGFpbGVkIHJlcG9ydHMgdGhhdCBmdW5uaWx5IGVub3VnaCBvbmx5IG9jY3VycmVkIHdpdGggY2VydGFpbgogIGdsaWJjIHZlcnNpb25zIHR1cm5lZCBvdXQgdG8gYmUgY3VybCB1c2luZyBhbiBhbHJlYWR5IGNsb3NlZCBmaWxlIGhhbmRsZQogIGR1cmluZyBjZXJ0YWluIGNvbmRpdGlvbnMgKGxpa2Ugd2hlbiBzYXZpbmcgRlRQIHNlcnZlciAiaGVhZGVycyIpLgoKLSBTY290dCBEYXZpcyBoZWxwZWQgbWUgdHJhY2sgZG93biBhIHByb2JsZW0gaW4gdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgdGhhdCBtYWRlCiAgdGVzdCBjYXNlIDU2IHdyb25nbHkgZmFpbCBhdCB0aW1lcy4gSXQgdHVybmVkIG91dCBpdCB3YXMgZHVlIHRvIHRoZSBzZXJ2ZXIKICBmaW5kaW5nIHRoZSBlbmQgb2YgYSBjaHVua2VkLWVuY29kZWQgUE9TVCB0b28gZWFybHkuCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDUpCi0gTm93IGN1cmwgd2FybnMgaWYgYW4gdW5rbm93biB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSAtdy8tLXdyaXRlb3V0IGFyZ3VtZW50LgoKRGFuaWVsICg0IFNlcHRlbWJlciAyMDA1KQotIEkgYXBwbGllZCBOaWNvbGFzIEZyYW7nb2lzJyBtYW4gcGFnZSBwYXRjaCBoZSBwb3N0ZWQgdG8gdGhlIERlYmlhbiBidWcKICB0cmFja2VyLiBJdCBjb3JyZWN0ZWQgdHdvIGxpbmVzIHRoYXQgc3RhcnRlZCB3aXRoIGFwb3N0cm9waGVzLCB3aGljaCBpc24ndAogIGxlZ2FsIG5yb2ZmIGZvcm1hdC4gaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyNjUxMQoKLSBBZGRlZCAtLWZ0cC1za2lwLXBhc3YtaXAgdG8gdGhlIGNvbW1hbmQgbGluZSB0b29sLCB0aGF0IHNldHMgdGhlIG5ldwogIENVUkxPUFRfRlRQX1NLSVBfUEFTVl9JUCBvcHRpb24uIEl0IG1ha2VzIGxpYmN1cmwgcmUtdXNlIHRoZSBjb250cm9sCiAgY29ubmVjdGlvbidzIElQIGFkZHJlc3Mgd2hlbiBzZXR0aW5nIHVwIHRoZSBkYXRhIGNvbm5lY3Rpb24gaW5zdGVhZCBvZgogIGV4dHJhY3R0aW5nIHRoZSBJUCBhZGRyZXNzIGZyb20gdGhlIFBBU1YgcmVzcG9uc2UuIEl0IGhhcyB0dXJuZWQgb3V0IHRoaXMKICBmZWF0dXJlIGlzIGZyZXF1ZW50bHkgbmVlZGVkIGJ5IHBlb3BsZSB0byBjaXJjdW12ZW50IHNpbGx5IHNlcnZlcnMgYW5kIHNpbGx5CiAgZmlyZXdhbGxzLCBlc3BlY2lhbGx5IHdoZW4gRlRQUyBpcyB1c2VkIGFuZCB0aGUgUEFTViBjb21tYW5kLXJlc3BvbnNlIGlzCiAgc2VudCBlbmNydHlwZWQuCgogIFNwb25zb3JlZCBieSBDVSpBbnN3ZXJzCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDUpCi0gSm9obiBLZWxseSBhZGRlZCBURlRQIHN1cHBvcnQgdG8gbGliY3VybC4gQSBidW5jaCBvZiBuZXcgZXJyb3IgY29kZXMgd2FzCiAgYWRkZWQuIFRPRE86IGFkZCB0aGVtIHRvIGRvY3MuIGFkZCBURlRQIHNlcnZlciB0byB0ZXN0IHN1aXRlLiBhZGQgVEZUUCB0bwogIGxpc3Qgb2YgcHJvdG9jb2xzIHdoZXJlZXZlciB0aG9zZSBhcmUgbWVudGlvbmVkLgoKVmVyc2lvbiA3LjE0LjEgKDEgU2VwdGVtYmVyIDIwMDUpCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDA1KQotIEtldmluIEx1c3NpZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggY3VybGxpYi5kc3AgYW5kIGhvdyB0byBmaXggaXQuCgotIElnb3IgUG9seWFrb3YgZml4ZWQgYSByYXRoZXIgbmFzdHkgcHJvYmxlbSB3aXRoIHRoZSB0aHJlYWRlZCBuYW1lIHJlc29sdmVyCiAgZm9yIFdpbmRvd3MsIHRoYXQgY291bGQgbGVhZCB0byBhbiBBY2Nlc3MgVmlvbGF0aW9uIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZQogIHdhcyB1c2VkIGR1ZSB0byBhbiBpc3N1ZSB3aXRoIGhvdyB0aGUgcmVzb2x2ZXIgdGhyZWFkIHdhcyBhbmQgd2FzIG5vdAogIHRlcm1pbmF0ZWQuCgotIFNpbW9uIEpvc2Vmc3NvbiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBhbGxvd3MgY3VybCB0byBnZXQgYnVpbHQgdG8gdXNlIEdOVSBHU1MKICBpbnN0ZWFkIG9mIE1JVC9IZWltZGFsIGZvciBHU1MgY2FwYWJpbGl0aWVzLgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwNSkKLSBUb2J5IFBldGVyc29uIGFkZGVkIENVUkxPUFRfSUdOT1JFX0NPTlRFTlRfTEVOR1RIIHRvIHRoZSBsaWJyYXJ5LCBhY2Nlc3NpYmxlCiAgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvb2wgd2l0aCAtLWlnbm9yZS1jb250ZW50LWxlbmd0aC4gVGhpcyB3aWxsIG1ha2UgaXQKICBlYXNpZXIgdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBBcGFjaGUgMS54IChhbmQgc2ltaWxhcikgc2VydmVycyB0aGF0IGFyZQogIHN0aWxsIGhhdmluZyBwcm9ibGVtcyBzZXJ2aW5nIGZpbGVzIGxhcmdlciB0aGFuIDIgb3IgNCBHQi4gV2hlbiB0aGlzIG9wdGlvbgogIGlzIGVuYWJsZWQsIGN1cmwgd2lsbCBzaW1wbHkgaGF2ZSB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGNsb3NlIHRoZQogIGNvbm5lY3Rpb24gdG8gc2lnbmFsIGVuZCBvZiB0cmFuc2Zlci4gSSB3cm90ZSB0ZXN0IGNhc2UgMjY5IHRoYXQgcnVucyBhCiAgc2ltcGxlIHRlc3QgdG8gdmVyaWZ5IHRoYXQgdGhpcyB3b3Jrcy4KCi0gKFRyeWluZyBoYXJkIHRvIGV4Y2x1ZGUgZW1vdGlvbnMgbm93LikgdmFsZ3JpbmQgdmVyc2lvbiAzIHN1ZGRlbmx5IHJlbmFtZWQKICB0aGUgLS1sb2dmaWxlIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gLS1sb2ctZmlsZSwgYW5kIHRodXMgdGhlIHRlc3Qgc2NyaXB0CiAgdmFsZ3JpbmQgYXV0b2RldGVjdGlvbiBub3cgaGFzIHlldCBhbm90aGVyIHZlcnNpb24gY2hlY2sgdG8gZG8gYW5kIHRoZW4gaXQKICBhbHRlcnMgdGhlIHZhbGdyaW5kIGNvbW1hbmQgbGluZSBhY2NvcmRpbmdseS4KCi0gRml4ZWQgQ0EgY2VydCB2ZXJpZmljYXRpb24gdXNpbmcgR251VExTIHdpdGggdGhlIGRlZmF1bHQgYnVuZGxlLCB3aGljaAogIHByZXZpb3VzbHkgZmFpbGVkIGR1ZSB0byBHbnVUTFMgbm90IGFsbG93aW5nIHg1MDkgdjEgQ0EgY2VydHMgYnkgZGVmYXVsdC4KICBSYWxwaCBNaXRjaGVsbCByZXBvcnRlZC4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDUpCi0gTm9yYmVydCBOb3ZvdG55IGhhZCBwcm9ibGVtcyB3aXRoIEZUUFMgYW5kIGhlIGhlbHBlZCBtZSB3b3JrIG91dCBhIHBhdGNoCiAgdGhhdCBtYWRlIGN1cmwgcnVuIGZpbmUgaW4gaGlzIGVuZC4gVGhlIGtleSB3YXMgdG8gbWFrZSBzdXJlIHdlIGRvIHRoZQogIFNTTC9UTFMgbmVnb3RpYXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIFRDUCBjb25uZWN0IGlzIGRvbmUgYW5kIG5vdCBhZnRlcgogIGEgZmV3IG90aGVyIGNvbW1hbmRzIGhhdmUgYmVlbiBzZW50IGxpa2Ugd2UgZGlkIHByZXZpb3VzbHkuIEkgZG9uJ3QgY29uc2lkZXIKICB0aGlzIGNoYW5nZSBuZWNlc3NhcnkgdG8gb2JleSB0aGUgc3RhbmRhcmRzLCBJIHRoaW5rIHRoaXMgc2VydmVyIGlzIHBpY2tpZXIKICB0aGFuIHdoYXQgdGhlIHNwZWNzIGFsbG93IGl0IHRvIGJlLCBidXQgSSBjYW4ndCBzZWUgaG93IHRoaXMgbW9kaWZpZWQKICBsaWJjdXJsIGNvZGUgY2FuIGFkZCBhbnkgcHJvYmxlbXMgdG8gdGhvc2Ugd2hvIGFyZSBpbnRlcnByZXRpbmcgdGhlCiAgc3RhbmRhcmRzIG1vcmUgbGliZXJhbGx5LgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwNSkKLSBKZWZmIFBvaGxtZXllciBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgYXNrIGxpYmN1cmwgdG8gbG9hZCBhIGNvb2tpZWZpbGUgKHdpdGgKICBDVVJMT1BUX0NPT0tJRUZJTEUpLCBhZGQgYSBjb29raWUgKHdpdGggQ1VSTE9QVF9DT09LSUVMSVNUKSwgdGVsbCBpdCB0bwogIHdyaXRlIHRoZSByZXN1bHQgdG8gYSBnaXZlbiBjb29raWUgamFyIGFuZCB0aGVuIG5ldmVyIGFjdHVhbGx5IGNhbGwKICBjdXJsX2Vhc3lfcGVyZm9ybSgpIC0gdGhlIGdpdmVuIGZpbGUocykgdG8gcmVhZCB3YXMgbmV2ZXIgcmVhZCBidXQgdGhlCiAgb3V0cHV0IGZpbGUgd2FzIHdyaXR0ZW4gYW5kIHRodXMgaXQgY2F1c2VkIGEgImZ1bm55IiByZXN1bHQuCgotIFdoaWxlIGRvaW5nIHNvbWUgdGVzdHMgZm9yIHRoZSBidWcgYWJvdmUsIEkgbm90aWNlZCB0aGF0IEZpcmVmb3ggZ2VuZXJhdGVzCiAgbGFyZ2UgbnVtYmVycyAoZm9yIHRoZSBleHBpcmUgdGltZSkgaW4gdGhlIGNvb2tpZXMudHh0IGZpbGUgYW5kIGxpYmN1cmwKICBkaWRuJ3QgdHJlYXQgdGhlbSBwcm9wZXJseS4gTm93IGl0IGRvZXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDA1KQotIEFkZGVkIG1vcmUgdmVyYm9zZSAid2FybmluZyIgbWVzc2FnZXMgdG8gdGhlIGN1cmwgY2xpZW50IGZvciBjYXNlcyB3aGVyZSBpdAogIGZhaWxzIHRvIG9wZW4vcmVhZCBmaWxlcyBldGMgdG8gaGVscCB1c2VycyBkaWFnbm9zZSB3aHkgaXQgZG9lc24ndCBkbyB3aGF0CiAgeW91J2QgZXhwZWN0IGl0IHRvLiBDb252ZXJ0ZWQgbG90cyBvZiBvbGQgbWVzc2FnZXMgdG8gdXNlIHRoZSBuZXcgZ2VuZXJpYwogIGZ1bmN0aW9uIEkgd3JvdGUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTMgQXVndXN0IDIwMDUpCi0gSmFtZXMgQnVyc2EgaWRlbnRpZmllZCBhIGxpYmN1cmwgSFRUUCBidWcgYW5kIGEgZ29vZCB3YXkgdG8gcmVwZWF0IGl0LiBJZiBhCiAgc2l0ZSByZXNwb25kcyB3aXRoIGJhZCBIVFRQIHJlc3BvbnNlIHRoYXQgZG9lc24ndCBjb250YWluIGFueSBoZWFkZXIgYXQgYWxsLAogIG9ubHkgYSByZXNwb25zZSBib2R5LCBhbmQgdGhlIHdyaXRlIGNhbGxiYWNrIHJldHVybnMgMCB0byBhYm9ydCB0aGUKICB0cmFuc2ZlciwgaXQgZGlkbid0IGhhdmUgYW55IHJlYWwgZWZmZWN0IGJ1dCB0aGUgd3JpdGUgY2FsbGJhY2sgd291bGQgYmUKICBjYWxsZWQgb25jZSBtb3JlIGFueXdheS4KCkRhbmllbCAoMTIgQXVndXN0IDIwMDUpCi0gQmFzZWQgb24gUmljaGFyZCBDbGF5dG9uJ3MgcmVwb3J0cywgSSBmb3VuZCBvdXQgdGhhdCB1c2luZyBjdXJsIC1kIEBmaWxlbmFtZQogIHdoZW4gJ2ZpbGVuYW1lJyB3YXMgbm90IHBvc3NpYmxlIHRvIGFjY2VzcyBtYWRlIGN1cmwgdXNlIGEgR0VUIHJlcXVlc3QKICBpbnN0ZWFkLgoKLSBUaGUgdGltZSBjb25kaXRpb24gaWxsZWdhbCBzeW50YXggd2FybmluZyBpcyBub3cgaW5oaWJpdGVkIGlmIC1zIGlzIHVzZWQuCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDA1KQotIE1hcmlvIFNjaHJvZWRlciBmb3VuZCBvdXQgdGhhdCBvbmUgb2YgdGhlIGRlYnVnIGNhbGxiYWNrcyBjYWxscyB0aGF0IHJlZ2FyZHMKICBTU0wgZGF0YSB3aXRoIHRoZSBDVVJMSU5GT19URVhUIHR5cGUgY2xhaW1lZCB0aGF0IHRoZSBkYXRhIHdhcyBvbmUgYnl0ZQogIGxhcmdlciB0aGFuIGl0IGFjdHVhbGx5IGlzLCB0aHVzIGZhbHNlbHkgdGVsbGluZyB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUKICB0ZXJtaW5hdGluZyB6ZXJvIHdhcyBwYXJ0IG9mIHRoZSBkYXRhLgoKRGFuaWVsICg5IEF1Z3VzdCAyMDA1KQotIENocmlzdG9waGVyIFIuIFBhbG1lciBmaXhlZCB0aGUgb2Zmc2V0cyB1c2VkIGZvciBkYXRlIHBhcnNpbmdzIHdoZW4gdGhlIHRpbWUKICB6b25lIG5hbWUgb2YgYSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgd2FzIHVzZWQuIEZvciBleGFtcGxlLCBQRFQgdnMgUERTLiBUaGlzCiAgZmxhdyB3YXMgaW50cm9kdWNlZCB3aXRoIHRoZSBuZXcgZGF0ZSBwYXJzZXIgKDExIHNlcCAyMDA0IC0gNy4xMi4yKS4KICBGb3J0dW5hdGVseSwgbm8gd2ViIHNlcnZlciBvciBjb29raWUgc3RyaW5nIGV0YyBzaG91bGQgYmUgdXNpbmcgc3VjaCB0aW1lCiAgem9uZSBuYW1lcyB0aHVzIGxpbWl0aW5nIHRoZSBlZmZlY3Qgb2YgdGhpcyBidWcuCgpEYW5pZWwgKDggQXVndXN0IDIwMDUpCi0gSm9uIEdydWJicyBmaWxlZCBidWcgcmVwb3J0ICMxMjQ5OTYyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyNDk5NjIpIHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCBOVExNIG9uIGEgSFRUUCBwcm94eSBpZiBhbiBGVFAgVVJMIHdhcyBnaXZlbi4gbGliY3VybCBub3cgcHJvcGVybHkKICBzd2l0Y2hlcyB0byBwdXJlIEhUVFAgaW50ZXJuYWxseSB3aGVuIGFuIEhUVFAgcHJveHkgaXMgdXNlZCwgZXZlbiBmb3IgRlRQCiAgVVJMcy4gVGhlIHByb2JsZW0gd291bGQgYWxzbyBvY2N1ciB3aXRoIG90aGVyIG11bHRpLXBhc3MgYXV0aCBtZXRob2RzLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDA1KQotIFdoZW4gY3VybCBpcyBidWlsdCB3aXRoIEdudVRMUywgY3VybC1jb25maWcgZGlkbid0IGluY2x1ZGUgIlNTTCIgd2hlbgogIC0tZmVhdHVyZXMgd2FzIHVzZWQuCgpEYW5pZWwgKDI4IEp1bHkgMjAwNSkKLSBJZiBhbnkgb2YgdGhlIG9wdGlvbnMgQ1VSTE9QVF9IVFRQR0VULCBDVVJMT1BUX1BPU1QgYW5kIENVUkxPUFRfSFRUUFBPU1QgaXMKICBzZXQgdG8gMSwgQ1VSTE9QVF9OT0JPRFkgd2lsbCBub3cgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gMC4KCkRhbmllbCAoMjcgSnVseSAyMDA1KQotIERhbiBGYW5kcmljaCBjaGFuZ2VzIG92ZXIgdGhlIGxhc3Qgd2VlazogZml4ZWQgbnVtZXJvdXMgbWlub3IgY29uZmlndXJlCiAgb3B0aW9uIHBhcnNpbmcgZmxhd3M6IC0td2l0aG91dC1nbnV0bHMsIC0td2l0aG91dC1zcG5lZ28gLS13aXRob3V0LWdzc2FwaQogIGFuZCAtLXdpdGhvdXQta3JiNC4gU3BlbGxmaXhlZCBzZXZlcmFsIGVycm9yIG1lc3NhZ2VzLgoKLSBQZXRlcmlzIEtydW1pbnMgYWRkZWQgQ1VSTE9QVF9DT09LSUVMSVNUIGFuZCBDVVJMSU5GT19DT09LSUVMSVNULCB3aGljaCBpcyBhCiAgc2ltcGxlIGludGVyZmFjZSB0byBleHRyYWN0aW5nIGFuZCBzZXR0aW5nIGNvb2tpZXMgaW4gbGliY3VybCdzIGludGVybmFsCiAgImNvb2tpZSBqYXIiLiBTZWUgdGhlIG5ldyBjb29raWVfaW50ZXJmYWNlLmMgZXhhbXBsZSBjb2RlLgoKRGFuaWVsICgxMyBKdWx5IDIwMDUpCi0gRGllZ28gQ2Fzb3JyYW4gcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBBbWlnYSBhZ2Fpbi4KCkRhbmllbCAoMTIgSnVseSAyMDA1KQotIEFkcmlhbiBTY2h1dXIgYWRkZWQgdHJhaWxlciBzdXBwb3J0IGluIHRoZSBjaHVua2VkIGVuY29kaW5nIHN0cmVhbS4gVGhlCiAgdHJhaWxlciBpcyB0aGVuIHNlbnQgdG8gdGhlIG5vcm1hbCBoZWFkZXIgY2FsbGJhY2svc3RyZWFtLiBJIHdyb3RlIHVwIHRlc3QKICBjYXNlIDI2NiB0byB2ZXJpZnkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIERvIG5vdGUgdGhhdCB0ZXN0IGNhc2UgMzQKICBjb250YWlucyBhIGZsYXdlZCBjaHVua2VkIGVuY29kaW5nIHN0cmVhbSB0aGF0IHN0aWxsIHdvcmtzIHRoZSBzYW1lLgoKRGFuaWVsICg1IEp1bHkgMjAwNSkKLSBHaXNsZSBWYW5lbSBjYW1lIHVwIHdpdGggYSBuaWNlIGxpdHRsZSB3b3JrLWFyb3VuZCBmb3IgYnVnICMxMjMwMTE4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMzAxMTgpLiBJdCBzZWVtcyB0aGUgV2luZG93cyAoTVNWQykKICBsaWJjIHRpbWUgZnVuY3Rpb25zIG1heSByZXR1cm4gZGF0YSBvbmUgaG91ciBvZmYgaWYgVFogaXMgbm90IHNldCBhbmQKICBhdXRvbWF0aWMgRFNUIGFkanVzdG1lbnQgaXMgZW5hYmxlZC4gVGhpcyBtYWRlIGN1cmxfZ2V0ZGF0ZSgpIHJldHVybiB3cm9uZwogIHZhbHVlLCBhbmQgaXQgYWxzbyBjb25jZXJuZWQgaW50ZXJuYWwgY29va2llIGV4cGlyYXRpb25zIGV0Yy4KCkRhbmllbCAoNCBKdWx5IDIwMDUpCi0gQW5kcmV3IEJ1c2huZWxsIHByb3ZpZGVkIGVub3VnaCBpbmZvIGZvciBtZSB0byB0ZWxsIHRoYXQgd2UgYmFkbHkgbmVlZGVkIHRvCiAgZml4IHRoZSBDT05ORUNUIGF1dGhlbnRpY2F0aW9uIGNvZGUgd2l0aCBtdWx0aS1wYXNzIGF1dGggbWV0aG9kcyAoc3VjaCBhcwogIE5UTE0pIGFzIGl0IGRpZG4ndCBwcmV2aW91c2x5IHByb3Blcmx5IGlnbm9yZSByZXNwb25zZS1ib2RpZXMgLSBpbiBmYWN0IGl0CiAgc3RvcHBlZCByZWFkaW5nIGFmdGVyIGFsbCByZXNwb25zZSBoZWFkZXJzIGhhZCBiZWVuIHJlY2VpdmVkLiBUaGlzIGNvdWxkCiAgbGVhZCB0byBsaWJjdXJsIHNlbmRpbmcgdGhlIG5leHQgcmVxdWVzdCBhbmQgcmVhZGluZyB0aGUgYm9keSBmcm9tIHRoZSBmaXJzdAogIHJlcXVlc3QgYXMgcmVzcG9uc2UgdG8gdGhlIHNlY29uZCByZXF1ZXN0LiAoSSBhbHNvIHJlbmFtZWQgdGhlIGZ1bmN0aW9uLAogIHdoaWNoIHdhc24ndCBzdHJpY3RseSBuZWNlc3NhcnkgYnV0Li4uKQoKICBUaGUgYmVzdCBmaXggd291bGQgdG8gb25jZSBhbmQgZm9yIGFsbCBtYWtlIHRoZSBDT05ORUNUIGNvZGUgdXNlIHRoZQogIG9yZGluYXJ5IHJlcXVlc3Qgc2VuZGluZy9yZWNlaXZpbmcgY29kZSwgdHJlYXRpbmcgaXQgYXMgYW55IG9yZGluYXJ5IHJlcXVlc3QKICBpbnN0ZWFkIG9mIHRoZSBzcGVjaWFsLXB1cnBvc2UgZnVuY3Rpb24gd2UgaGF2ZSBub3cuIEl0IHNob3VsZCBtYWtlIGl0CiAgYmV0dGVyIGZvciBtdWx0aS1pbnRlcmZhY2UgdG9vLiBBbmQgcG9zc2libHkgbGVhZCB0byBsZXNzIGNvZGUuLi4KCiAgQWRkZWQgdGVzdCBjYXNlIDI2NSBmb3IgdGhpcy4gSXQgZG9lc24ndCB3b3JrIGFzIGEgX3JlYWxseV8gZ29vZCB0ZXN0IGNhc2UKICBzaW5jZSB0aGUgdGVzdCBwcm94eSBpcyB0b28gc3R1cGlkLCBidXQgdGhlIHRlc3QgY2FzZSBoZWxwcyB3aGVuIHJ1bm5pbmcgdGhlCiAgZGVidWdnZXIgdG8gdmVyaWZ5LgoKRGFuaWVsICgzMCBKdW5lIDIwMDUpCi0gRGFuIEZhbmRyaWNoIGltcHJvdmVkIHRoZSBjb25maWd1cmUgc2NyaXB0J3MgYWJpbGl0eSB0byBmaWd1cmUgb3V0IHdoYXQga2luZAogIG9mIHN0cmVycm9yX3IoKSBBUEkgdGhhdCBpcyB1c2VkIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiBJZiBfX0dMSUJfXyBpcwogIGRlZmluZWQsIGl0IGFzc3VtZXMgdGhlIGdsaWJjIEFQSS4gSWYgbm90LCBpdCBpc3N1ZXMgYSBub3RpY2UgYXMgYmVmb3JlIHRoYXQKICB0aGUgdXNlciBuZWVkcyB0byBtYW51YWxseSBlZGl0IGxpYi9jb25maWcuaCBmb3IgdGhpcy4KCkRhbmllbCAoMjMgSnVuZSAyMDA1KQotIERhdmlkIFNoYXcncyBmaXggdGhhdCB1bmlmaWVzIHByb3h5IHN0cmluZyB0cmVhdG1lbnQgc28gdGhhdCBhIHByb3h5IGdpdmVuCiAgd2l0aCBDVVJMT1BUX1BST1hZIGNhbiB1c2UgYSBodHRwOi8vIHByZWZpeCBhbmQgdXNlciArIHBhc3N3b3JkLiBUaGUgdXNlcgogIGFuZCBwYXNzd29yZCBmaWVsZHMgYXJlIG5vdyBhbHNvIFVSTCBkZWNvZGVkIHByb3Blcmx5LiBUZXN0IGNhc2UgMjY0IGFkZGVkCiAgdG8gdmVyaWZ5LgoKRGFuaWVsICgyMiBKdW5lIDIwMDUpCi0gRGF2aWQgU2hhdyB1cGRhdGVkIGxpYmN1cmwubTQKCkRhbmllbCAoMTQgSnVuZSAyMDA1KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgcG90ZW50aWFsIHRocmVhZCBoYW5kbGUgbGVhay4gQnVnIHJlcG9ydCAjMTIxNjUwMAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjE2NTAwKS4gIENvbW1lbnQgaW4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDYvMDA1OS5odG1sCgpEYW5pZWwgKDEzIEp1bmUgMjAwNSkKLSBNYWRlIGJ1aWxkY29uZiBydW4gbGlidG9vbGl6ZSBpbiB0aGUgYXJlcyBkaXIgdG9vIChpbnNwaXJlZCBieSBUdXBvbmUncwogIHJldmVydGVkIHBhdGNoKS4KCkRhbmllbCAoOSBKdW5lIDIwMDUpCi0gSW5jb3Jwb3JhdGVkIFR1cG9uZSdzIGZpbmR0b29sIGZpeCBpbiBidWlsZGNvbmYgKHNsaWdodGx5IGVkaXRlZCkKCi0gSW5jb3Jwb3JhdGVkIFR1cG9uZSdzIGhlYWQgLW4gZml4IGluIGJ1aWxkY29uZi4KCkRhbmllbCAoOCBKdW5lIDIwMDUpCi0gUmV2ZXJ0ZWQgVHVwb25lJ3MgcGF0Y2ggYWdhaW4sIGl0IGJyb2tlIG51bWVyb3VzIGF1dG9idWlsZHMuIExldCdzIGFwcGx5IGl0CiAgaW4gcGllY2VzLCBvbmUgYnkgb25lIGFuZCBzZWUgd2hhdCB3ZSBuZWVkIHRvIGFkanVzdCB0byB3b3JrIGFsbCBvdmVyLgoKRGFuaWVsICg2IEp1bmUgMjAwNSkKLSBUdXBvbmUgQWxmcmVkbyBmaXhlZCB0aHJlZSBwcm9ibGVtcyBpbiBidWlsZGNvbmY6CgogIDEpIGZpbmR0b29sIGRvZXMgbG9vayBwZXIgdG9vbCBpbiBQQVRIIGFuZCB0aGluayAuL3BlcmwgaXMgdGhlIHBlcmwKICBleGVjdXRhYmxlLCB3aGlsZSBpcyBqdXN0IGEgbG9jYWwgZGlyZWN0b3J5IChJIGhhdmUgLiBpbiB0aGUgUEFUSCkKCiAgMikgSSBnb3Qgc2V2ZXJhbCB3YXJuaW5nIGZvciBoZWFkIC0xIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGhlYWQgLW4gMQogCiAgMykgYXJlcyBkaXJlY3RvcnkgaXMgbWlzc2luZyBzb21lIGZpbGUgKG1pc3NpbmcgaXMgbWlzc2luZyA6LSkgKSBiZWNhdXNlCiAgYXV0b21ha2UgYW5kIGZyaWVuZHMgaXMgbm90IHJ1bi4KCkRhbmllbCAoMyBKdW5lIDIwMDUpCi0gQWRkZWQgZG9jcy9saWJjdXJsL2dldGluZm8tdGltZXMsIGJhc2VkIG9uIGZlZWRiYWNrIGZyb20gJ0VkaSc6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMTE3ODMyNTc5ODI5OSZzdXBwb3J0PXllcwoKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIHlldCBhbm90aGVyIHRleHQgbW9kZSBwYXRjaCBmb3Igc2V2ZXJhbCB0ZXN0IGNhc2VzIHNvCiAgdGhhdCB0aGV5IGRvIHRleHQgY29tcGFyaXNpb25zIGJldHRlciBvbiBXaW5kb3dzIChuZXdsaW5lLXdpc2UpLgoKRGFuaWVsICgxIEp1bmUgMjAwNSkKLSBUaGUgY29uZmlndXJlIGNoZWNrIGZvciBjLWFyZXMgbm93IGFkZHMgdGhlIGNhcmVzIGxpYiBiZWZvcmUgdGhlIG90aGVyIGxpYnMsCiAgdG8gbWFrZSBpdCBidWlsZCBmaW5lIHdpdGggbWluZ3cuIEluc3BpcmVkIGJ5IFR1cG9uZSBBbGZyZWRvJ3MgYnVnIHJlcG9ydAogIGFuZCBwYXRjaDogaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIxMjk0MAoKRGFuaWVsICgzMSBNYXkgMjAwNSkKLSBUb2RkIEt1bGVzemEgcmVwb3J0ZWQgYSBmbGF3IGluIHRoZSBwcm94eSBvcHRpb24sIHNpbmNlIGEgbnVtZXJpY2FsIElQdjYKICBhZGRyZXNzIHdhcyBub3QgcG9zc2libGUgdG8gdXNlLiBJdCBpcyBub3csIGJ1dCByZXF1aXJlcyBpdCB3cml0dGVuCiAgUkZDMjczMi1zdHlsZSwgd2l0aGluIGJyYWNrZXRzIC0gd2hpY2ggaW5jaWRlbnRseSBpcyBob3cgeW91IGVudGVyIG51bWVyaWNhbAogIElQdjYgYWRkcmVzc2VzIGluIFVSTHMuIFRlc3QgY2FzZSAyNjMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgzMCBNYXkgMjAwNSkKLSBFcmljIENvb3BlciByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gd2l0aCBIVFRQIHNlcnZlcnMgdGhhdCByZXNwb25kcyB3aXRoCiAgYmluYXJ5IHplcm9lcyB3aXRoaW4gdGhlIGhlYWRlcnMuIFRoZXkgY29uZnVzZWQgbGliY3VybCB0byBkbyB3cm9uZyBzbyB0aGUKICBkb3dubG9hZGVkIGhlYWRlcnMgYmVjb21lIGluY29tcGxldGUuIFRoZSBmaXggaXMgbm93IHZlcmlmaWVkIHdpdGggdGVzdCBjYXNlCiAgMjYyLiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzEwOTQ4CgpEYW5pZWwgKDI1IE1heSAyMDA1KQotIEZpeGVkIHByb2JsZW1zIHdpdGggdGhlIHRlc3Qgc3VpdGUsIGFuZCBpbiBwYXJ0aWN1bGFyIHRoZSBGVFAgdGVzdCBjYXNlcwogIHNpbmNlIGl0IHByZXZpb3VzbHkgd2FzIGZhaWxpbmcgZXZlcnkgbm93IGFuZCB0aGVuIGluIGEgbm9uc2Vuc2UgbWFubmVyLgoKLSAtLXRyYWNlLXRpbWUgbm93IG91dHB1dHMgdGhlIGZ1bGwgbWljcm9zZWNvbmQsIGFsbCA2IGRpZ2l0cy4KCkRhbmllbCAoMjQgTWF5IDIwMDUpCi0gQW5kcmVzIEdhcmNpYSBwcm92aWRlZCBhIHRleHQgbW9kZSBwYXRjaCBmb3Igc2V2ZXJhbCB0ZXN0IGNhc2VzIHNvIHRoYXQgdGhleQogIGRvIHRleHQgY29tcGFyaXNpb25zIGJldHRlciBvbiBXaW5kb3dzIChuZXdsaW5lLXdpc2UpLgoKLSBBbnkgMnh4IHJlc3BvbnNlIChhbmQgbm90IGp1c3QgMjAwKSBpcyBub3cgY29uc2lkZXJlZCBhIGZpbmUgcmVzcG9uc2UgdG8KICBUWVBFLCBhcyBzb21lIHNlcnZlcnMgb2J2aW91c2x5IHNlbmRzIGEgMjI2IHRoZXJlLiBBZGRlZCB0ZXN0IGNhc2UgMjYxIHRvCiAgdmVyaWZ5LiBCYXNlZCBvbiBhIHF1ZXN0aW9uL3JlcG9ydCBieSBHZW9yZyBXaWNoZXJza2kuCgpEYW5pZWwgKDIwIE1heSAyMDA1KQotIEltcHJvdmVkIHJ1bnRlc3RzLnBsIHRvIGFsbG93IHN0ZG91dCB0ZXN0cyB0byBiZSBtb2RlPXRleHQgYXMgd2VsbCwganVzdAogIGFzIGZpbGUgY29tcGFyaXNvbnMgYWxyZWFkeSBzdXBwb3J0cy4gQWRkZWQgdGhpcyBpbmZvIHRvIHRoZSBGSUxFRk9STUFUCiAgZG9jcy4KCkRhbmllbCAoMTggTWF5IDIwMDUpCi0gSm9obiBNY0dvd2FuIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGJ1ZyByZXBvcnQgIzEyMDQ0MzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIwNDQzNSkgd2l0aCBtYWxmb3JtZWQgVVJMcyBsaWtlCiAgImh0dHA6Ly9zb21laG9zdD9kYXRhIiBhcyBpdCBhZGRlZCBhIHNsYXNoIHRvbyBtdWNoIGluIHRoZSByZXF1ZXN0ICgiR0VUCiAgLz9kYXRhLyIuLi4pLiBBZGRlZCB0ZXN0IGNhc2UgMjYwIHRvIHZlcmlmeS4KCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGZhaWxlZCB0byBkZXRlY3QgdGhlIHByb3BlciBBUEkgYXQKICB0aW1lcywgbGlrZSBvbiBIUC1VWCAxMC4yMC4gVGhlbiBsaWIvc3RyZXJyb3IuYyBiYWRseSBhc3N1bWVkIHRoZSBnbGliYwogIHZlcnNpb24gaWYgdGhlIHBvc2l4IGRlZmluZSB3YXNuJ3Qgc2V0IChzaW5jZSBpdCBfaGFkXyBmb3VuZCBhIHN0cmVycm9yX3IpLgoKRGFuaWVsICgxNiBNYXkgMjAwNSkKLSBUaGUgZ210aW1lX3IoKSBmdW5jdGlvbiBpbiBIUC1VWCAxMC4yMCBpcyBicm9rZW4uIEFib3V0IDEzIHRlc3QgY2FzZXMgZmFpbAogIGR1ZSB0byB0aGlzLiBUaGVyZSdzIG5vdyBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0IGF0dGVtcHRzIHRvIGRldGVjdCB0aGUgYmFkCiAgZnVuY3Rpb24gYW5kIG5vdCB1c2UgaXQgb24gc3VjaCBzeXN0ZW1zLgoKVmVyc2lvbiA3LjE0LjAgKDE2IE1heSAyMDA1KQoKRGFuaWVsICgxMyBNYXkgMjAwNSkKLSBHcmlnb3J5IEVudGluIHJlcG9ydGVkIHRoYXQgY3VybCdzIGNvbmZpZ3VyZSBkZXRlY3RzIGEgZmluZSBwb2xsKCkgZm9yIE1hYwogIE9TIFggMTAuNCAod2hpbGUgMTAuMyBvciBsYXRlciBkZXRlY3RlZCBhICJiYWQiIG9uZSksIGJ1dCB0aGUgZXhlY3V0YWJsZQogIGRvZXNuJ3Qgd29yayBhcyBnb29kIGFzIGlmIGJ1aWx0IHdpdGhvdXQgcG9sbCgpLiBJJ3ZlIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICB0byBhbHdheXMgc2tpcCB0aGUgZmluZS1wb2xsKCkgdGVzdCBvbiBNYWMgT1MgWCAoZGFyd2luKS4KCkRhbmllbCAoMTIgTWF5IDIwMDUpCi0gV2hlbiBkb2luZyBhIHNlY29uZCByZXF1ZXN0IChhZnRlciBhIGRpc2Nvbm5lY3QpIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLAogIG92ZXIgYSBwcm94eSB0aGF0IHVzZXMgTlRMTSBhdXRoZW50aWNhdGlvbiwgbGliY3VybCBmYWlsZWQgdG8gdXNlIE5UTE0gYWdhaW4KICBwcm9wZXJseSAodGhlIGF1dGggbWV0aG9kIHdhcyBhY2NpZGVudGFsbHkgcmVzZXQgdG8gdGhlIHNhbWUgYXMgaGFkIGJlZW4gc2V0CiAgZm9yIGhvc3QgYXV0aCwgd2hpY2ggZGVmYXVsdHMgdG8gQmFzaWMpLiBCdWcgcmVwb3J0ICMxMjAwNjYxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMDA2NjEpIGlkZW50aWZpZWQgdGhlIHRoZSBwcm9ibGVtIGFuZAogIHRoZSBmaXguCgotIElmIC16Ly0tdGltZS1jb25kIGlzIHVzZWQgd2l0aCBhbiBpbnZhbGlkIGRhdGUgc3ludGF4LCB0aGlzIGlzIG5vIGxvbmdlcgogIHNpbGVudGx5IGRpc2NhcmRlZC4gSW5zdGVhZCBhIHByb3BlciB3YXJuaW5nIG1lc3NhZ2UgaXMgZGlwbGF5ZWQgdGhhdAogIGluZm9ybXMgYWJvdXQgaXQuIEJ1dCBpdCBzdGlsbCBjb250aW51ZXMgd2l0aG91dCB0aGUgY29uZGl0aW9uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMiAoMTEgTWF5IDIwMDUpCgpEYW5pZWwgKDExIE1heSAyMDA1KQotIFN0YXJ0aW5nIG5vdywgbGliY3VybCBzZW5kcyBhIGxpdHRsZSBkaWZmZXJlbnQgc2V0IG9mIGhlYWRlcnMgaW4gaXRzIGRlZmF1bHQKICBIVFRQIHJlcXVlc3RzOgogIAogIEEpIE5vcm1hbCBub24tcHJveHkgSFRUUDoKICAgIC0gbm8gbW9yZSAiUHJhZ21hOiBuby1jYWNoZSIgKHRoaXMgb25seSBtYWtlcyBzZW5zZSB0byBwcm94aWVzKQoKICBCKSBOb24tQ09OTkVDVCBIVFRQIHJlcXVlc3Qgb3ZlciBwcm94eToKICAgIC0gIlByYWdtYTogbm8tY2FjaGUiIGlzIHVzZWQgKGxpa2UgYmVmb3JlKQogICAgLSAiUHJveHktQ29ubmVjdGlvbjogS2VlcC1hbGl2ZSIgKGZvciBvbGRlciBzdHlsZSAxLjAtcHJveGllcykKCiAgQykgQ09OTkVDVCBIVFRQIHJlcXVlc3Qgb3ZlciBwcm94eToKICAgIC0gIkhvc3Q6IFtuYW1lXTpbcG9ydF0iCiAgICAtICJQcm94eS1Db25uZWN0aW9uOiBLZWVwLWFsaXZlIgoKICBUaGUgQSkgY2FzZSBpcyBtb3N0bHkgdG8gcmVkdWNlIHRoZSBkZWZhdWx0IGhlYWRlciBzaXplIGFuZCByZW1vdmUgYQogIHBvaW50bGVzcyBoZWFkZXIuCgogIFRoZSBCKSBpcyB0byBhZGRyZXNzIChyYXJlKSBwcm9ibGVtcyB3aXRoIEhUVFAgMS4wIHByb3hpZXMKCiAgVGhlIEMpIGhlYWRlcnMgYXJlIGJvdGggdG8gYWRkcmVzcyAocmFyZSkgcHJvYmxlbXMgd2l0aCBzb21lIHByb3hpZXMuIFRoZQogIGNvZGUgaW4gbGliY3VybCB0aGF0IGRlYWxzIHdpdGggQ09OTkVDVCByZXF1ZXN0cyBuZWVkIGEgcmV3cml0ZSwgYnV0IGl0CiAgZmVlbHMgbGlrZSBhIHRvbyBiaWcgYSBqb2IgZm9yIG1lIHRvIGRvIG5vdy4gRGV0YWlscyBhcmUgYWRkZWQgaW4gdGhlIGNvZGUKICBjb21tZW50cyBmb3Igbm93LgoKICBVcGRhdGVkIGEgbGFyZ2UgYW1vdW50IG9mIHRlc3QgY2FzZXMgdG8gcmVmbGVjdCB0aGUgbmV3cy4KCkRhbmllbCAoMTAgTWF5IDIwMDUpCi0gSGFsZi1iYWtlZCBhdHRlbXB0IHRvIGJhaWwgb3V0IGlmIHNlbGVjdCgpIHJldHVybnMgX29ubHlfIGVycm9yZmRzIHdoZW4gdGhlCiAgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MuIEFuIGF0dGVtcHQgdG8gZml4IEFsbGFuJ3MgcHJvYmxlbS4gU2VlCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTA1LzAwNzMuaHRtbCBhbmQgdGhlIHJlc3Qgb2YgdGhhdCB0aHJlYWQKICBmb3IgZGV0YWlscy4KCiAgSSdtIHN0aWxsIG5vdCBzdXJlIHRoaXMgaXMgdGhlIHJpZ2h0IGZpeCwgYnV0Li4uCgpWZXJzaW9uIDcuMTQuMC1wcmUxICg5IE1heSAyMDA1KQoKRGFuaWVsICgyIE1heSAyMDA1KQotIFNvcnQgb2YgImZpeGVkIiBLTk9XTl9CVUdTICM0OiBjdXJsIG5vdyBidWlsZHMgSVB2NiBlbmFibGVkIG9uIEFJWCA0LjMuIEF0CiAgbGVhc3QgaXQgc2hvdWxkIG5vIGxvbmdlciBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLiBIb3dldmVyLCBpdCBkb2VzIG5vdCBoYXZlCiAgQUlfTlVNRVJJQ0hPU1Qgc28gd2UgY2Fubm90IGdldGFkZHJpbmZvKCkgYW55IG51bWVyaWNhbCBhZGRyZXNzZXMgd2l0aCBpdAogICh3ZSB1c2UgdGhhdCBmb3IgRlRQIFBPUlQvRVBSVCkhIFNvLCBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUgY2hlY2sgdGhhdAogIGNoZWNrcyBpZiB0aGUgZ2V0YWRkcmluZm8oKSBpcyB3b3JraW5nLCB0byB1c2UgQUlfTlVNRVJJQ0hPU1Qgc2luY2UgdGhlbgogIGl0J2xsIGZhaWwgb24gQUlYIDQuMyBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIHdpdGggSVB2NiBzdXBwb3J0CiAgZGlzYWJsZWQuCgotIEFkZGVkIC0tdHJhY2UtdGltZSB0aGF0IHdoZW4gdXNlZCBhZGRzIGEgdGltZSBzdGFtcCB0byBlYWNoIHRyYWNlIGxpbmUgdGhhdAogIC0tdHJhY2UsIC0tdHJhY2UtYXNjaWkgYW5kIC0tdmVyYm9zZSBvdXRwdXQuIEkgYWxzbyBtYWRlIHRoZSAnPicgZGlzcGxheQogIHNlcGFyYXRlIGVhY2ggbGluZSBvbiB0aGUgbGluZWZlZWQgc28gdGhhdCBIVFRQIHJlcXVlc3RzIGV0YyBsb29rIG5pY2VyIGluCiAgdGhlIC12IG91dHB1dC4KCi0gTWFkZSBjdXJsIHJlY29nbml6ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEx5bnggKGFuZCBvdGhlcnM/KSBzdXBwb3J0IGZvcgogIHBvaW50aW5nIG91dCB0aGUgQ0EgY2VydCBwYXRoL2ZpbGU6IFNTTF9DRVJUX0RJUiBhbmQgU1NMX0NFUlRfRklMRS4gSWYKICBDVVJMX0NBX0JVTkRMRSBpcyBub3Qgc2V0LCB0aGV5IGFyZSBjaGVja2VkIGFmdGVyd2FyZHMuCgogIExpa2UgYmVmb3JlOiBvbiB3aW5kb3dzIGlmIG5vbmUgb2YgdGhlc2UgYXJlIHNldCwgaXQgY2hlY2tzIGZvciB0aGUgY2EgY2VydAogIGZpbGUgbGlrZSB0aGlzOgoKICAxLiBhcHBsaWNhdGlvbidzIGRpcmVjdG9yeQogIDIuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAzLiBXaW5kb3dzIFN5c3RlbSBkaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93c1xzeXN0ZW0zMikKICA0LiBXaW5kb3dzIERpcmVjdG9yeSAoZS5nLiBDOlx3aW5kb3dzKQogIDUuIGFsbCBkaXJlY3RvcmllcyBhbG9uZyAlUEFUSCUKCkRhbmllbCAoMSBNYXkgMjAwNSkKLSBUaGUgcnVudGVzdHMucGwgc2NyaXB0IG5vdyBzdGFydHMgdGVzdCBzZXJ2ZXJzIGJ5IGRvaW5nIGZvcmsoKSBhbmQgZXhlYygpCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgYXBwcm9hY2guIFRoaXMgaXMgbGVzcyBjb21wbGljYXRlZCBhbmQgc2hvdWxkCiAgaG9wZWZ1bGx5IGxlYWQgdG8gbGVzcyAibGVha2VkIiBzZXJ2ZXJzIChzZXJ2ZXJzIHRoYXQgYXJlbid0IHN0b3BwZWQKICBwcm9wZXJseSB3aGVuIHRoZSB0ZXN0cyBhcmUgc3RvcHBlZCkuCgotIEFsZXhhbmRlciBaaHVyYXZsZXYgZm91bmQgYSBjYXNlIHdoZW4geW91IGRpZCAiY3VybCAtSSBbVVJMXSIgYW5kIGl0CiAgY29tcGxhaW5lZCBvbiB0aGUgY2h1bmtlZCBlbmNvZGluZywgZXZlbiB0aG91Z2ggYSBIRUFEIHNob3VsZCBuZXZlciByZXR1cm4gYQogIGJvZHkgYW5kIHRodXMgaXQgY2Fubm90IGJlIGEgY2h1bmtlZC1lbmNvZGluZyBwcm9ibGVtIQoKRGFuaWVsICgzMCBBcHJpbCAyMDA1KQotIEFsZXhhbmRlciBaaHVyYXZsZXYgZm91bmQgb3V0IHRoYXQgKGxpYiljdXJsIFNJR1NFR1ZlZCB3aGVuIHVzaW5nCiAgLS1pbnRlcmZhY2Ugb24gYW4gYWRkcmVzcyB0aGF0IGNhbid0IGJlIGJvdW5kLgoKRGFuaWVsICgyOCBBcHJpbCAyMDA1KQotIFdvcmtpbmcgb24gZml4aW5nIHVwIHRlc3QgY2FzZXMgdG8gbWFyayBzZWN0aW9ucyBhcyAnbW9kZT10ZXh0JyBmb3IgdGhpbmdzCiAgdGhhdCBjdXJsIHdyaXRlcyBhcyB0ZXh0IGZpbGVzLCBzaW5jZSB0aGVuIHRoZXkgY2FuIGdldCBkaWZmZXJlbnQgbGluZQogIGVuZGluZ3MgZGVwZW5kaW5nIG9uIE9TLiBBbmRy6XMgR2FyY+1hIGhlbHBzIG1lIHdvcmsgdGhpcyBvdXQuCgogIERpZCBsb3RzIG9mIG90aGVyIG1pbm9yIHR3ZWFrcyBvbiB0aGUgdGVzdCBzY3JpcHRzIHRvIHdvcmsgYmV0dGVyIGFuZCBtb3JlCiAgcmVsaWFibHkgZmluZCB0ZXN0IHNlcnZlcnMgYW5kIGFsc28ga2lsbCB0ZXN0IHNlcnZlcnMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCBob3cgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBraWxsZWQgdGhlIEhUVFAgc2VydmVyCiAgaW5zdGVhZCBvZiB0aGUgSFRUUFMgc2VydmVyIHdoZW4gY2xvc2luZyBpdCBkb3duLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA1KQotIFBhdWwgTW9vcmUgbWFkZSBjdXJsIGNoZWNrIGZvciB0aGUgLmN1cmxyYyBmaWxlIChfY3VybHJjIG9uIHdpbmRvd3MpIG9uIHR3bwogIG1vcmUgcGxhY2VzLiBGaXJzdCwgQ1VSTF9IT01FIGlzIGEgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgaXMgdXNlZAogIGluc3RlYWQgb2YgSE9NRSBpZiBpdCBpcyBzZXQsIHRvIHBvaW50IG91dCB3aGVyZSB0aGUgZGVmYXVsdCBjb25maWcgZmlsZQogIGxpdmVzLiBJZiB0aGVyZSdzIG5vIGNvbmZpZyBmaWxlIGluIHRoZSBkaXIgcG9pbnRlZCBvdXQgYnkgb25lIG9mIHRoZQogIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhlIFdpbmRvd3MgdmVyc2lvbiB3aWxsIGluc3RlYWQgY2hlY2sgdGhlIHNhbWUKICBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgY3VybCBpcyBsb2NhdGVkIGluLgoKRGFuaWVsICgyNiBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uJ3Mgd29yayBvbiBudWtpbmcgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBvbiB4NjQgd2l0aAogIFZTMjAwNS4KCkRhbmllbCAoMjUgQXByaWwgMjAwNSkKLSBGcmVkIE5ldyByZXBvcnRlZCBhIGJ1ZyB3aGVyZSB3ZSB1c2VkIEJhc2ljIGF1dGggYW5kIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKICBpbiAubmV0cmMsIGFuZCB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB0aGUgc3Vic2VxdWVudCByZXF1ZXN0cyBkaWRuJ3QKICBwcm9wZXJseSB1c2UgdGhlIGF1dGggYXMgZm91bmQgaW4gdGhlIG5ldHJjIGZpbGUuIEFkZGVkIHRlc3QgY2FzZSAyNTcgdG8KICB2ZXJpZnkgbXkgZml4LgoKLSBCYXNlZCBvbiBmZWVkYmFjayBmcm9tIENvcnkgTmVsc29uLCBJIGFkZGVkIHNvbWUgcHJlcHJvY2Vzc29yIG1hZ2ljIGluCiAgKi9zZXR1cC5oIGFuZCAqL2NvbmZpZy13aW4zMi5oIHRvIGJ1aWxkIGZpbmUgd2l0aCBWUzIwMDUgb24geDY0LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA1KQotIEFsZXggU3V5a292IG1hZGUgdGhlIGN1cmwgdG9vbCBub3cgYXNzdW1lIHRoYXQgdXBsb2FkcyB1c2luZyBIVFRQOi8vIG9yCiAgSFRUUFM6Ly8gYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBzaG93IG91dHB1dCBhbmQgdGh1cyBtb3RpdmF0ZXMgYSBzd2l0Y2hlZAogIG9mZiBwcm9ncmVzcyBtZXRlciBpZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gdGhlIHRlcm1pbmFsLiBUaGlzIG1ha2VzIEZUUAogIHVwbG9hZHMgd2l0aG91dCAnPicsIC1vIG9yIC1PIHNob3cgdGhlIHByb2dyZXNzIG1ldGVyLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA1KQotIERhdmUgRHJpYmluJ3MgTVNWQyBtYWtlZmlsZSBmaXg6IHNldCBDVVJMX1NUQVRJQ0xJQiB3aGVuIGl0IGJ1aWxkcyBzdGF0aWMKICBsaWJyYXJ5IHZhcmlhbnRzLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIGNvbmZpZ3VyZSB0byBzZXQgdGhlIHByb3BlciBkZWZpbmUgd2hlbiBidWlsZGluZyBzdGF0aWMKICBsaWJjdXJsIG9uIHdpbmRvd3MuCgotIC0tcmV0cnktZGVsYXkgZGlkbid0IHdvcmsuCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDUpCi0gT2xpdmllciByZXBvcnRlZCB0aGF0IGV2ZW4gdGhvdWdoIGhlIHVzZWQgQ1VSTE9QVF9QT1JULCBsaWJjdXJsIGNsZWFybHkKICBzdGlsbCB1c2VkIHRoZSBkZWZhdWx0IHBvcnQuIEhlIHdhcyByaWdodC4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQgdGhlCiAgdGVzdCBjYXNlcyA1MjEsIDUyMiBhbmQgNTIzIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBUb3NoaXl1a2kgTWFlemF3YSByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBQT1NUIHdpdGggYSByZWFkIGNhbGxiYWNrLAogIGxpYmN1cmwgZGlkbid0IHByb3Blcmx5IHNlbmQgYW4gRXhwZWN0OiAxMDAtY29udGludWUgaGVhZGVyLiBJdCBkb2VzIG5vdy4KCi0gSSBjb21taXR0ZWQgYnkgbWlnIGNoYW5nZSBpbiB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdGhhdCBtb3ZlcyBvdXQgYWxsCiAgc29ja2V0L1RDUCBjb2RlIHRvIGEgc2VwYXJhdGUgQyBwcm9ncmFtIG5hbWVkIHNvY2tmaWx0LiBBbmQgYWRkZWQgNCBuZXcKICB0ZXN0IGNhc2VzIGZvciBGVFAgb3ZlciBJUHY2LgoKRGFuaWVsICg4IEFwcmlsIDIwMDUpCi0gQ29yeSBOZWxzb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggYSBIVFRQIHNlcnZlciB0aGF0IHJlc3BvbmRlZCB3aXRoIGEgMzA0CiAgcmVzcG9uc2UgY29udGFpbmluZyBhbiAiaWxsZWdhbCIgQ29udGVudC1MZW5ndGg6IGhlYWRlciwgd2hpY2ggd2FzIG5vdAogIHByb3Blcmx5IGlnbm9yZWQgYnkgbGliY3VybC4gTm93IGl0IGlzLiBUZXN0IGNhc2UgMjQ5IHZlcmlmaWVzLgoKRGFuaWVsICg3IEFwcmlsIDIwMDUpCi0gQWRkZWQgYWJpbGl0eSB0byBidWlsZCBhbmQgcnVuIHdpdGggR251VExTIGFzIGFuIGFsdGVybmF0aXZlIHRvIE9wZW5TU0wgZm9yCiAgdGhlIHNlY3VyZSBsYXllci4gY29uZmlndXJlIC0td2l0aC1nbnV0bHMgZW5hYmxlcyB3aXRoLiBOb3RlIHRoYXQgdGhlCiAgcHJldmlvdXMgT3BlblNTTCBjaGVjayBzdGlsbCBoYXMgcHJlZmVyZW5jZSBhbmQgaWYgaXQgZmlyc3QgZGV0ZWN0cyBPcGVuU1NMLAogIGl0IHdpbGwgbm90IGNoZWNrIGZvciBHbnVUTFMuIFlvdSBtYXkgbmVlZCB0byBleHBsaWN0bHkgZGlhYmxlIE9wZW5TU0wgd2l0aAogIC0td2l0aG91dC1zc2wuCgogIFRoaXMgd29yayBoYXMgYmVlbiBzcG9uc29yZWQgYnkgVGhlIFdyaXR0ZW4gV29yZC4KCkRhbmllbCAoNSBBcHJpbCAyMDA1KQotIENocmlzdG9waGUgTGVncnkgZml4ZWQgdGhlIHBvc3QtdXBsb2FkIGNoZWNrIGZvciBGVFAgdG8gbm90IGNvbXBsYWluIGlmIHRoZQogIHVwbG9hZCB3YXMgc2tpcHBlZCBkdWUgdG8gYSB0aW1lLWNvbmRpdGlvbiBhcyBzZXQgd2l0aAogIENVUkxPUFRfVElNRUNPTkRJVElPTi4gSSBhZGRlZCB0ZXN0IGNhc2UgMjQ3IGFuZCAyNDggdG8gdmVyaWZ5LgoKVmVyc2lvbiA3LjEzLjIgKDUgQXByaWwgMjAwNSkKCkRhbmllbCAoNCBBcHJpbCAyMDA1KQotIE1hcmNlbG8gSnVjaGVtIGZpeGVkIHRoZSBNU1ZDIG1ha2VmaWxlIGZvciBsaWJjdXJsCgotIEdpc2xlIFZhbmVtIGZpeGVkIGEgY3Jhc2ggaW4gbGliY3VybCwgdGhhdCBjb3VsZCBoYXBwZW4gaWYgdGhlIGVhc3kgaGFuZGxlCiAgd2FzIGtpbGxlZCBiZWZvcmUgdGhlIHRocmVhZGluZyByZXNvbHZlciAod2luZG93cyBvbmx5KSBzdGlsbCBoYWRuJ3QKICBjb21wbGV0ZWQuCgotIEhhcmRlZXAgU2luZ2ggcmVwb3J0ZWQgYSBwcm9ibGVtIGRvaW5nIEhUVFAgUE9TVCB3aXRoIERpZ2VzdC4gKEl0IHdhcwogIGFjdHVhbGx5IGFsc28gYWZmZWN0aW5nIE5UTE0gYW5kIE5lZ290aWF0ZS4pIEl0IHR1cm5lZCBvdXQgdGhhdCBpZiB0aGUKICBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggMTAwIENvbnRpbnVlIGJlZm9yZSB0aGUgaW5pdGlhbCA0MDEgcmVzcG9uc2UsIGxpYmN1cmwKICBkaWRuJ3QgdGFrZSBjYXJlIG9mIHRoZSByZXNwb25zZSBwcm9wZXJseS4gVGVzdCBjYXNlIDI0NSBhbmQgMjQ2IGFkZGVkIHRvCiAgdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDUpCi0gQW5kcmVzIEdhcmNpYSBtb2RpZmllZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgbGliZ2RpMzIgYmVmb3JlCiAgbGliY3J5cHRvLCB0byBtYWtlIHRoZSBTU0wgY2hlY2sgd29yayBmaW5lIG9uIG1zeXMvbWluZ3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDUpCi0gVG9tIE1vZXJzIGlkZW50aWZpZWQgYSBmbGF3IHdoZW4geW91IHNlbnQgYSBQT1NUIHdpdGggRGlnZXN0IGF1dGhlbnRpY2F0aW9uLAogIGFzIGluIHRoZSBmaXJzdCByZXF1ZXN0IHdoZW4gY3VybCBzZW5kcyBhIFBPU1Qgd2l0aCBDb250ZW50LUxlbmd0aDogMCwgaXQKICBzdGlsbCBmb3JjaWJseSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGRvaW5nIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGgKICBuZWdvdGlhdGlvbi4KCi0gSmVzcGVyIEplbnNlbiBmb3VuZCBvdXQgdGhhdCBGVFAtU1NMIGRpZG4ndCB3b3JrIHNpbmNlIG15IEZUUAogIHJld3JpdGUuIEZpeGluZyB0aGF0IHdhcyBlYXN5LCBidXQgaXQgYWxzbyByZXZlYWxlZCBhIG11Y2ggd29yc2UgcHJvYmxlbToKICB0aGUgRlRQIHNlcnZlciByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24gZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCByZWFkaW5nCiAgcmVzcG9uc2VzIGluIG11bHRpcGxlIHRpbnkgY2h1bmtzIHByb3Blcmx5ISBJIG1vZGlmaWVkIHRoZSBGVFAgc2VydmVyIHRvCiAgYWxsb3cgaXQgdG8gcHJvZHVjZSBzdWNoIHNwbGl0LXVwIHJlc3BvbnNlcyB0byBtYWtlIHN1cmUgY3VybCBkZWFscyB3aXRoCiAgdGhlbSBhcyBpdCBzaG91bGQuCgotIEJhc2VkIG9uIEF1Z3VzdHVzIFNhdW5kZXJzJyBjb21tZW50cyBhbmQgZmluZGluZ3MsIHRoZSBIVFRQIG91dHB1dCBhdXRoCiAgZnVuY3Rpb24gd2FzIGZpeGVkIHRvIHVzZSB0aGUgcHJvcGVyIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gbXVsdGlwbGUgb25lcwogIGFyZSBhY2NlcHRlZC4gdGVzdCAyMzkgYW5kIHRlc3QgMjQzIHdlcmUgYWRkZWQgdG8gcmVwZWF0IHRoZSBwcm9ibGVtcyBhbmQKICB2ZXJpZnkgdGhlIGZpeGVzLgoKICAtLXByb3h5LWFueWF1dGggd2FzIGFkZGVkIHRvIHRoZSBjdXJsIHRvb2wKCkRhbmllbCAoMTYgTWFyY2ggMjAwNSkKLSBUcnU2NCBhbmQgc29tZSBJUklYIGJveGVzIHNlZW0gdG8gbm90IGxpa2UgdGVzdCAyMzcgYXMgaXQgaXMuIFRoZWlyCiAgaW5ldF9hZGRyKCkgZnVuY3Rpb25zIHNlZW1zIHRvIHVzZSAmMjU1IG9uIGFsbCBudW1lcmljYWxzIGluIGEgaXB2NCBkb3R0ZWQKICBhZGRyZXNzIHdoaWNoIG1ha2VzIGEgZGlmZmVyZW50IGZhaWx1cmUuLi4gTm93IEkndmUgbW9kaWZpZWQgdGhlIGlwdjQKICByZXNvbHZlIGNvZGUgdG8gdXNlIGluZXRfcHRvbigpIGluc3RlYWQgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZXNlIHN5c3RlbXMKICBiZXR0ZXIgZGV0ZWN0IHRoaXMgYXMgYSBiYWQgSVAgYWRkcmVzcyByYXRoZXIgdGhhbiBjcmVhdGluZyBhIHRvYWxseSBib2d1cwogIGFkZHJlc3MgdGhhdCBpcyB0aGVuIHBhc3NlZCBvbiBhbmQgdXNlZC4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNSkKLSBEYW4gRmFuZHJpY2ggbWFkZSB0aGUgY29kZSBwcm9wZXJseSB1c2UgdGhlIHVDbGliYydzIHZlcnNpb24gb2YKICBpbmV0X250b2FfcigpIHdoZW4gYnVpbHQgd2l0aCBpdC4KCi0gQWRkZWQgdGVzdCAyMzcgYW5kIDIzODogdGVzdCBFUFNWIGFuZCBQQVNWIHJlc3BvbnNlIGhhbmRsaW5nIHdoZW4gdGhleSBnZXQKICB3ZWxsLSBmb3JtYXRlZCBkYXRhIGJhY2sgYnV0IHVzaW5nIGlsbGVnYWwgdmFsdWVzLiBJbiAyMzcgUEFTViBnZXRzIGFuIElQCiAgYWRkcmVzcyB0aGF0IGlzIHdheSBiYWQuIEluIDIzOCBFUFNWIGdldHMgYSBwb3J0IHRoYXQgaXMgd2F5IG91dCBvZiByYW5nZS4KCkRhbmllbCAoMTQgTWFyY2ggMjAwNSkKLSBBZGRlZCBhIGZldyBtaXNzaW5nIGZlYXR1cmVzIHRvIHRoZSBjdXJsLWNvbmZpZyAtLWZlYXR1cmVzIGxpc3QKCi0gTW9kaWZpZWQgdGVzdGN1cmwucGwgdG8gbm93IG9mZmVyCiAgMSAtIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBhbGwgaW5mbyBpdCBwcmV2aW91c2x5IG9ubHkgcmVhZCBmcm9tCiAgICAgIGZpbGU6IC0tbmFtZSwgLS1lbWFpbCwgLS1kZXNjIGFuZCAtLWNvbmZpZ3VyZQogIDIgLSAtLW5vY3ZzdXAgbWFrZXMgaXQgbm90IGF0dGVtcHQgdG8gZG8gY3ZzIHVwZGF0ZQogIDMgLSAtLWNyb3NzY29tcGlsZSBpbmZvcm1zIGl0IGFuZCBtYWtlcyBpdCBub3QgYXR0ZW1wdCB0aGluZ3MgaXQgY2FuJ3QgZG8KCi0gRml4ZWQgbnVtZXJvdXMgd2luMzIgY29tcGlsZXIgd2FybmluZ3MuCgotIFJlbW92ZWQgdGhlIGxpYi9zZWN1cml0eS5oIGZpbGUgc2luY2UgaXQgc2hhZG93ZWQgdGhlIG1pbmd3L3dpbjMyIGhlYWRlcgogIHdpdGggdGhlIHNhbWUgbmFtZSB3aGljaCBpcyBuZWVkZWQgZm9yIFNTUEkgYnVpbGRzLiBUaGUgY29udGVudHMgb2YgdGhlCiAgZm9ybWVyIHNlY3VyaXR5LmggaXMgbm93IGkga3JiNC5oCgotIGNvbmZpZ3VyZSAtLWVuYWJsZS1zc3BpIG5vdyBlbmFibGVzIFNTUEkgaW4gdGhlIGJ1aWxkLiBJdCBvbmx5IHdvcmtzIGZvcgogIHdpbmRvd3MgYnVpbGRzIChpbmNsdWRpbmcgY3Jvc3MtY29tcGlsZXMgZm9yIHdpbmRvd3MpLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA1KQotIERhdmlkIEhvdWxkZXIgYWRkZWQgLS1mb3JtLXN0cmluZyB0aGF0IGFkZHMgdGhhdCBzdHJpbmcgdG8gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCBwYXJ0LCB3aXRob3V0IHNwZWNpYWwgY2hhcmFjdGVycyBoYXZpbmcgc3BlY2lhbCBtZWFuaW5ncyBldGMgbGlrZQogIC0tZm9ybSBmZWF0dXJlcy4KCkRhbmllbCAoMTEgTWFyY2ggMjAwNSkKLSBjdXJsX3ZlcnNpb25faW5mbygpIHJldHVybnMgdGhlIGZlYXR1cmUgYml0IENVUkxfVkVSU0lPTl9TU1BJIGlmIGl0IHdhcwogIGJ1aWx0IHdpdGggU1NQSSBzdXBwb3J0LgoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgbWFkZSBpdCBwb3NzaWJsZSB0byBidWlsZCBsaWJjdXJsIHdpdGggdGhlCiAgVVNFX1dJTkRPV1NfU1NQSSBvbiBXaW5kb3dzLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgYmUgYnVpbHQgdG8gdXNlIHRoZQogIG5hdGl2ZSB3YXkgdG8gZG8gTlRMTS4gU1NQSSBhbHNvIGFsbG93cyBsaWJjdXJsIHRvIHBhc3Mgb24gdGhlIGN1cnJlbnQgdXNlcgogIGFuZCBpdHMgcGFzc3dvcmQgaW4gdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNSkKLSBEYW4gRiBpbXByb3ZlZCB0aGUgU1NMIGxpYiBzZXR1cCBpbiBjb25maWd1cmUuCgotIE5vZGFrIFNvZGFrIHJlcG9ydGVkIGEgY3Jhc2ggd2hlbiB1c2luZyBhIFNPQ0tTNCBwcm94eS4KCi0gSmVhbi1NYXJjIFJhbmdlciBwb2ludGVkIG91dCBhbiBlbWJhcmFzc2luZyBkZWJ1ZyBwcmludGYoKSBsZWZ0b3ZlciBpbiB0aGUKICBtdWx0aSBpbnRlcmZhY2UgY29kZS4KCi0gQWRqdXN0ZWQgdGhlIG1hbiBwYWdlIGZvciB0aGUgY3VybF9nZXRkYXRlKCkgcmV0dXJuIHZhbHVlIGZvciBkYXRlcyBhZnRlcgogIHllYXIgMjAzOC4gRm9yIDMyIGJpdCB0aW1lX3QgaXQgcmV0dXJucyAweDdmZmZmZmZmIGJ1dCBmb3IgNjRiaXQgdGltZV90IGl0CiAgcmV0dXJucyBlaXRoZXIgdGhlIGNvcnJlY3QgdmFsdWUgb3IgZXZlbiAtMSBvbiBzb21lIHN5c3RlbXMgdGhhdCBzdGlsbCBzZWVtCiAgdG8gbm90IGRlYWwgd2l0aCB0aGlzIHByb3Blcmx5LiBUb3IgQXJudHNlbiBmb3VuZCBhIDY0Yml0IEFJWCBzeXN0ZW0gZm9yIHVzCiAgdGhhdCBkaWQgdGhlIGxhdHRlci4gR3dlbm9sZSBCZWF1Y2hlc25lJ3MgTWFuZHJha2UgcGF0Y2ggcHV0IHRoZSBsaWdodHMgb24KICB0aGlzIHByb2JsZW0gaW4gdGhlIGZpcnN0IHBsYWNlLgoKRGFuaWVsICg4IE1hcmNoIDIwMDUpCi0gRG9taW5pY2sgTWVnbGlvIHJlcG9ydGVkIHRoYXQgdXNpbmcgQ1VSTE9QVF9GSUxFVElNRSB3aGVuIHRyYW5zZmVycmluZyBhIEZUUAogIGZpbGUgZ290IGEgTGFzdC1Nb2RpZmllZDogaGVhZGVyIHdyaXR0ZW4gdG8gdGhlIGRhdGEgc3RyZWFtLCBjb3JydXB0aW5nIHRoZQogIGFjdHVhbCBkYXRhLiBUaGlzIHdhcyBiZWNhdXNlIHNvbWUgY29uZGl0aW9ucyBmcm9tIHRoZSBwcmV2aW91cyBGVFAgY29kZSB3YXMKICBub3QgcHJvcGVybHkgYnJvdWdodCBpbnRvIHRoZSBuZXcgRlRQIGNvZGUuIEkgZml4ZWQgYW5kIEkgYWRkZWQgdGVzdCBjYXNlCiAgNTIwIHRvIHZlcmlmeS4gKFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIDcuMTMuMSkKCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBjb25maWd1cmUgLS13aXRoLXpsaWIgb3B0aW9uIHRvIGFsd2F5cyBjb25zaWRlciB0aGUKICBnaXZlbiBwYXRoIGJlZm9yZSBhbnkgc3RhbmRhcmQgcGF0aHMuCgpEYW5pZWwgKDYgTWFyY2ggMjAwNSkKLSBSYW5keSBNY011cmNoeSB3YXMgdGhlIGZpcnN0IHRvIHJlcG9ydCB0aGF0IHZhbGdyaW5kLnBtIHdhcyBtaXNzaW5nIGZyb20gdGhlCiAgcmVsZWFzZSBhcmNoaXZlIGFuZCB0aHVzICdtYWtlIHRlc3QnIGZhaWxzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIEhBVkVfRlRSVU5DQVRFIHRvIHNldmVyYWwgY29uZmlnLSouaCBmaWxlcy4KCi0gQWRkZWQgdGVzdCBjYXNlIDIzNSB0aGF0IG1ha2VzIGEgcmVzdW1lZCB1cGxvYWQgb2YgYSBmaWxlIHRoYXQgaXNuJ3QgcHJlc2VudAogIG9uIHRoZSByZW1vdGUgc2lkZS4gVGhpcyB0aGVuIGNvbnZlcnRzIHRoZSBvcGVyYXRpb24gdG8gYW4gb3JkaW5hcnkgU1RPUgogIHVwbG9hZC4gVGhpcyB3YXMgcmVxdWVzdGVkL3BvaW50ZWQgb3V0IGJ5IElnbmFjaW8gVmF6cXVlei1BYnJhbXMuCgogIEl0IGFsc28gcHJvdmVkIChhbmQgSSBmaXhlZCkgYSBidWcgaW4gdGhlIG5ld2x5IHJld3JpdHRlbiBmdHAgY29kZSAoYW5kCiAgcHJlc2VudCBpbiB0aGUgNy4xMy4xIHJlbGVhc2UpIHdoZW4gdHJ5aW5nIHRvIHJlc3VtZSBhbiB1cGxvYWQgYW5kIHRoZQogIHNlcnZlcnMgcmV0dXJucyBhbiBlcnJvciB0byB0aGUgU0laRSBjb21tYW5kLiBsaWJjdXJsIHRoZW4gbG9vcHMgYW5kIHNlbmRzCiAgU0laRSBjb21tYW5kcyBpbmZpbml0ZWx5LgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBTU0wgcHJvYmxlbSBpbnRyb2R1Y2VkIG9uIEZlYnJ1YXJ5IDl0aCB0aGF0IG1hZGUKICBsaWJjdXJsIGF0dGVtcHQgdG8gbG9hZCB0aGUgd2hvbGUgcmFuZG9tIGZpbGUgdG8gc2VlZCB0aGUgUFJORy4gVGhpcyBpcwogIHJlYWxseSBiYWQgc2luY2UgdGhpcyB0dXJucyBvdXQgdG8gYmUgdXNpbmcgL2Rldi91cmFuZG9tIGF0IHRpbWVzLi4uCgpWZXJzaW9uIDcuMTMuMSAoNCBNYXJjaCAyMDA1KQoKRGFuaWVsICg0IE1hcmNoIDIwMDUpCi0gRGF2ZSBEcmliaW4gbWFkZSBpdCBwb3NzaWJsZSB0byBzZXQgQ1VSTE9QVF9DT09LSUVGSUxFIHRvICIiIHRvIGFjdGl2YXRlCiAgdGhlIGNvb2tpZSAiZW5naW5lIiB3aXRob3V0IGhhdmluZyB0byBwcm92aWRlIGFuIGVtcHR5IG9yIG5vbi1leGlzdGluZyBmaWxlLgoKLSBSZW5lIFJlYmUgZml4ZWQgYSAtIyBjcmFzaCB3aGVuIG1vcmUgZGF0YSB0aGFuIGV4cGVjdGVkIHdhcyByZXRyaWV2ZWQuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDUpCi0gTlRMTSBhbmQgZnRwLWtyYjQgYnVmZmVyIG92ZXJmbG93IGZpeGVkLCBhcyByZXBvcnRlZCBoZXJlOgogIGh0dHA6Ly93d3cuc2VjdXJpdHlmb2N1cy5jb20vYXJjaGl2ZS8xLzM5MTA0MiBhbmQgdGhlIENBTiByZXBvcnQgaGVyZToKICBodHRwOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Q0FOLTIwMDUtMDQ5MAoKICBJZiB0aGVzZSBzZWN1cml0eSBndXlzIHdlcmUgc2VyaW91cywgd2UnZCBiZWVuIG5vdGlmaWVkIGluIGFkdmFuY2UgYW5kIHdlCiAgY291bGQndmUgc2F2ZWQgYSBmZXcgb2YgeW91IGEgbGl0dGxlIHN1cnByaXNlLCBidXQgbm93IHdlIHdlcmVuJ3QuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDUpCi0gUmFscGggTWl0Y2hlbGwgcmVwb3J0ZWQgYSBmbGF3IHdoZW4geW91IHVzZWQgYSBwcm94eSB3aXRoIGF1dGgsIGFuZCB5b3UKICByZXF1ZXN0ZWQgZGF0YSBmcm9tIGEgaG9zdCBhbmQgdGhlbiBmb2xsb3dlZCBhIHJlZGlyZWN0IHRvIGFub3RoZXIKICBob3N0LiBsaWJjdXJsIHRoZW4gZGlkbid0IHVzZSB0aGUgcHJveHktYXV0aCBwcm9wZXJseSBpbiB0aGUgc2Vjb25kIHJlcXVlc3QsCiAgZHVlIHRvIHRoZSBob3N0LW9ubHkgY2hlY2sgZm9yIG9yaWdpbmFsIGhvc3QgbmFtZSB3cm9uZ2x5IGJlaW5nIGV4dGVuZGVkIHRvCiAgdGhlIHByb3h5IGF1dGggYXMgd2VsbC4gQWRkZWQgdGVzdCBjYXNlIDIzMyB0byB2ZXJpZnkgdGhlIGZsYXcgYW5kIHRoYXQgdGhlCiAgZml4IHJlbW92ZWQgdGhlIHByb2JsZW0uCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDUpCi0gTWlrZSBEb2JicyByZXBvcnRlZCBhIG1pbmd3IGJ1aWxkIGZhaWx1cmUgZHVlIHRvIHRoZSBsYWNrIG9mCiAgQlVJTERJTkdfTElCQ1VSTCBiZWluZyBkZWZpbmVkIHdoZW4gbGliY3VybCBpcyBidWlsdC4gTm93IHRoaXMgaXMgZGVmaW5lZCBieQogIGNvbmZpZ3VyZSB3aGVuIG1pbmd3IGlzIHVzZWQuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDUpCi0gRGF2aWQgaW4gYnVnIHJlcG9ydCAjMTEyNDU4OCBmb3VuZCBhbmQgZml4ZWQgYSBzb2NrZXQgbGVhayB3aGVuIGxpYmN1cmwKICBkaWRuJ3QgY2xvc2UgdGhlIHNvY2tldCBwcm9wZXJseSB3aGVuIHJldHVybmluZyBlcnJvciBkdWUgdG8gZmFpbGluZwogIGxvY2FsYmluZAoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA1KQotIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBIVFRQLVBPU1RpbmcgdXNpbmcgImFueWF1dGgiCiAgdGhhdCBwaWNrcyBOVExNLiBUaGFua3MgdG8gRGF2aWQgQnlyb24gbGV0dGluZyBtZSB0ZXN0IE5UTE0gYWdhaW5zdCBoaXMKICBzZXJ2ZXJzLCBJIGNvdWxkIHF1aWNrbHkgcmVwZWF0IGFuZCBmaXggdGhlIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgdG8gYmU6CgogIFdoZW4gbGliY3VybCBQT1NUcyB3aXRob3V0IGtub3dpbmcvdXNpbmcgYW4gYXV0aGVudGljYXRpb24gYW5kIGl0IGdldHMgYmFjawogIGEgbGlzdCBvZiB0eXBlcyBmcm9tIHdoaWNoIGl0IHBpY2tzIE5UTE0sIGl0IG5lZWRzIHRvIGVpdGhlciBjb250aW51ZQogIHNlbmRpbmcgaXRzIGRhdGEgaWYgaXQga2VlcHMgdGhlIGNvbm5lY3Rpb24gYWxpdmUsIG9yIG5vdCBzZW5kIHRoZSBkYXRhIGJ1dAogIGNsb3NlIHRoZSBjb25uZWN0aW9uLiBUaGVuIGRvIHRoZSBmaXJzdCBzdGVwIGluIHRoZSBOVExNIGF1dGguIGxpYmN1cmwKICBkaWRuJ3Qgc2VuZCB0aGUgZGF0YSBub3IgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYnV0IHNpbXBseSByZWFkIHRoZQogIHJlc3BvbnNlLWJvZHkgYW5kIHRoZW4gc2VudCB0aGUgZmlyc3QgbmVnb3RpYXRpb24gc3RlcC4gV2hpY2ggdGhlbiBmYWlsZWQKICBtaXNlcmFibHkgb2YgY291cnNlLiBUaGUgZml4ZWQgdmVyc2lvbiBmb3JjZXMgYSBjb25uZWN0aW9uIGlmIHRoZXJlIGlzIG1vcmUKICB0aGFuIDIwMDAgYnl0ZXMgbGVmdCB0byBzZW5kLgoKRGFuaWVsICgxNCBGZWJydWFyeSAyMDA1KQotIFRoZSBjb25maWd1cmUgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCkgc28gaXQKICB3YXMgbmV2ZXIgdXNlZC4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNSkKLSBSZW1vdmVkIGFsbCB1c2VzIG9mIHN0cmZ0aW1lKCkgc2luY2UgaXQgdXNlcyB0aGUgbG9jYWxpc2VkIHZlcnNpb24gb2YgdGhlCiAgd2VlayBkYXkgbmFtZXMgYW5kIG1vbnRoIG5hbWVzIGFuZCBzZXJ2ZXJzIGRvbid0IGxpa2UgdGhhdC4KCkRhbmllbCAoMTAgRmVicnVhcnkgMjAwNSkKLSBOb3cgdGhlIHRlc3Qgc2NyaXB0IGRpc2FibGVzIHZhbGdyaW5kLXRlc3Rpbmcgd2hlbiB0aGUgdGVzdCBzdWl0ZSBydW5zIGlmCiAgbGliY3VybCBpcyBidWlsdCBzaGFyZWQuIE90aGVyd2lzZSB2YWxncmluZCBvbmx5IHRlc3RzIHRoZSBzaGVsbCB0aGF0IHJ1bnMKICB0aGUgd3JhcHBlci1zY3JpcHQgbmFtZWQgJ2N1cmwnIHRoYXQgaXMgYSBmcm9udC1lbmQgdG8gY3VybCBpbiB0aGlzIGNhc2UuCiAgVGhpcyBzaG91bGQgYWxzbyBmaXggdGhlIGh1Z2UgYW1vdW50IG9mIHJlcG9ydHMgb2YgZmFsc2UgcG9zaXRpdmVzIHdoZW4KICB2YWxncmluZCBoYXMgaWRlbnRpZmllZCBsZWFrcyBpbiAoYmEpc2ggYW5kIG5vdCBpbiBjdXJsIGFuZCBwZW9wbGUgcmVwb3J0CiAgdGhhdCBhcyBjdXJsIGJ1Z3MuIEJ1ZyByZXBvcnQgIzExMTY2NzIgaXMgb25lIGV4YW1wbGUuCgogIEFsc28sIHRoZSB2YWxncmluZCByZXBvcnQgcGFyc2VyIGhhcyBiZWVuIGFkYXB0ZWQgdG8gY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUKICBvZiB0aGUgc291cmNlcyBpbiBhIHN0YWNrIHN0cmFjZSBpcyBvbmUgb2YgKGxpYiljdXJsJ3Mgc291cmNlIGZpbGVzIG9yCiAgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGNvbnNpZGVyIHRoZSBwcm9ibGVtIHRvIGNvbmNlcm4gKGxpYiljdXJsLgoKLSBNYXJ0eSBLdWhydCBzdHJlYW1saW5lZCB0aGUgVk1TIGJ1aWxkLgoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDUpCi0gRGF2aWQgQnlyb24gZml4ZWQgaGlzIFNTTCBwcm9ibGVtcywgaW5pdGlhbGx5IG1lbnRpb25lZCBoZXJlOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wMS8wMjQwLmh0bWwuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IHVzZQogIFNTTF9wZW5kaW5nKCkgYXMgd2Ugc2hvdWxkLgoKLSBDb252ZXJ0ZWQgbG90cyBvZiBGVFAgY29kZSB0byBhIHN0YXRlbWFjaGluZSwgc28gdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgZG9lc24ndCBibG9jayB3aGlsZSBjb21tdW5pY2F0aW5nIGNvbW1hbmRzLXJlc3BvbnNlcyB3aXRoIGFuIEZUUCBzZXJ2ZXIuCgogIEkndmUgYWRkZWQgYSBjb21tZW50IGxpa2UgQkxPQ0tJTkcgaW4gdGhlIGNvZGUgb24gYWxsIHNwb3RzIEkgY291bGQgZmluZAogIHdoZXJlIHdlIHN0aWxsIGhhdmUgYmxvY2tpbmcgb3BlcmF0aW9ucy4gV2hlbiB3ZSBjaGFuZ2UgY3VybF9lYXN5X3BlcmZvcm0oKQogIHRvIHVzZSB0aGUgbXVsdGkgaW50ZXJmYWNlLCB3ZSdsbCBhbHNvIGJlIGFibGUgdG8gc2ltcGxpZnkgdGhlIGNvZGUgc2luY2UKICB0aGVyZSB3aWxsIG9ubHkgYmUgb25lICJpbnRlcm5hbCBpbnRlcmZhY2UiLgoKICBXaGlsZSBkb2luZyB0aGlzLCBJJ3ZlIG5vdyBtYWRlIENVUkxFX0ZUUF9BQ0NFU1NfREVOSUVEIHNlcGFyYXRlIGZyb20gdGhlCiAgbmV3IENVUkxFX0xPR0lOX0RFTklFRC4gVGhlIGZpcnN0IG9uZSBpcyBub3cgYWNjZXNzIGRlbmllZCB0byBhIGZ1bmN0aW9uLAogIGxpa2UgY2hhbmdpbmcgZGlyZWN0b3J5IG9yIHJldHJpZXZpbmcgYSBmaWxlLCB3aGlsZSB0aGUgc2Vjb25kIG1lYW5zIHRoYXQgd2UKICB3ZXJlIGRlbmllZCBsb2dpbi4KCiAgVGhlIENWUyB0YWcgJ2JlZm9yZV9mdHBfc3RhdGVtYWNoaW5lJyB3YXMgc2V0IGp1c3QgYmVmb3JlIHRoaXMgd2VudCBpbiwgaW4KICBjYXNlIG9mIGZ1dHVyZSBuZWVkLgoKLSBHaXNsZSBtYWRlIHRoZSBESUNUIGNvZGUgc2VuZCBDUkxGIGFuZCBub3QganVzdCBMRiBhcyB0aGUgc3BlYyBzYXlzIHNvLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDUpCi0gR2lzbGUgZml4ZWQgcHJvYmxlbXMgd2hlbiBsaWJjdXJsIHJ1bnMgb3V0IG9mIG1lbW9yeSwgYW5kIHdvcmtlZCBvbiBtYWtpbmcKICBzdXJlIHRoZSBwcm9wZXIgZXJyb3IgY29kZSBpcyByZXR1cm5lZCBmb3IgdGhvc2Ugb2NjYXRpb25zLgoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDUpCi0gTWFydWtvIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGluZmxhdGUgZGVjb21wcmVzc2luZyBleGFjdGx5IDY0SwogIGNvbnRlbnRzLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDUpCi0gRXJpYyBWZXJnbmF1ZCBmb3VuZCBhIHVzZSBvZiBhbiB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIGluIHRoZSBmdHAgd2hlbiBkb2luZwogIFBPUlQgb24gaXB2Ni1lbmFibGVkIGhvc3RzLgoKLSBEYXZpZCBCeXJvbiBwb2ludGVkIG91dCB3ZSBjb3VsZCB1c2UgQlVGU0laRSB0byByZWFkIGRhdGEgKGluCiAgbGliL3RyYW5zZmVyLmMpIGluc3RlYWQgb2YgdXNpbmcgQlVGU0laRSAtMS4KClZlcnNpb24gNy4xMy4wICgxIEZlYnJ1YXJ5IDIwMDUpCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwNSkKLSBBZGRlZCBMYXJzIE5pbHNzb24ncyBodG1sdGl0bGUuY2MgZXhhbXBsZQoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIHRoZSBETyBvcGVyYXRpb24KICBmYWlsZWQgKGFzIGluIHRlc3QgY2FzZSAyMDUpLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHdhcm5pbmcgZm9yIGZpbGU6Ly8gb3BlcmF0aW9ucy4KCi0gRml4ZWQgYSB2YWxncmluZCByZXBvcnQgaW4gdGhlIHVybCBnbG9iYmluZyBjb2RlIGZvciB0aGUgY3VybCBjb21tYW5kIGxpbmUKICB0b29sLgoKLSBCdWdmaXhlZCB0aGUgcGFyc2VyIHRoYXQgc2NhbnMgdGhlIHZhbGdyaW5kIHJlcG9ydCBvdXRwdXRzIChpbiBydW50ZXN0cy5wbCkuCiAgSSBub3RpY2VkIHRoYXQgaXQgcHJldmlvdXNseSBkaWRuJ3QgZGV0ZWN0IGFuZCByZXBvcnQgdGhlICJDb25kaXRpb25hbCBqdW1wCiAgb3IgbW92ZSBkZXBlbmRzIG9uIHVuaW5pdGlhbGlzZWQgdmFsdWUocykiIGVycm9yLiBXaGVuIEkgZml4ZWQgdGhpcywgSQogIGNhdWdodCBhIGZldyBjdXJsIGJ1Z3Mgd2l0aCBpdC4gQW5kIHRoZW4gSSBoYWQgdG8gc3BlbmQgdGltZSB0byBtYWtlIHRoZQogIHRlc3Qgc3VpdGUgSUdOT1JFIHRoZXNlIGVycm9ycyB3aGVuIE9wZW5TU0wgaXMgdXNlZCBzaW5jZSBpdCBwcm9kdWNlIG1hc3NpdmUKICBhbW91bnRzIG9mIHZhbGdyaW5kIHdhcm5pbmdzIChidXQgb25seSBvZiB0aGUgIkNvbmRpdGlvbmFsLi4uIiBraW5kIGl0CiAgc2VlbXMpLiBTbywgaWYgYSB0ZXN0IHRoYXQgcmVxdWlyZXMgU1NMIGlzIHJ1biwgaXQgaWdub3JlcyB0aGUKICAiQ29uZGl0aW9uYWwuLi4iIGVycm9ycywgYW5kIHlvdSdsbCBnZXQgYSAidmFsZ3JpbmQgUEFSVElBTCIgb3V0cHV0IGluc3RlYWQKICBvZiAidmFsZ3JpbmQgT0siLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDUpCi0gVXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSwgYW5kIGRvaW5nIGEgcmVxdXN0ZWQgYSByZS11c2VkIGNvbm5lY3Rpb24gdGhhdAogIGdldHMgY2xvc2VkIGp1c3QgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudCBmYWlsZWQgYW5kIGRpZCBub3QgcmUtaXNzdWUKICBhIHJlcXVlc3Qgb24gYSBmcmVzaCByZWNvbm5lY3QgbGlrZSB0aGUgZWFzeSBpbnRlcmZhY2UgZGlkLiBOb3cgaXQgZG9lcyEKCi0gRGVmaW5lIENVUkxfTVVMVElFQVNZIHdoZW4gYnVpbGRpbmcgbGliY3VybCAobGliL2Vhc3kuYyB0byBiZSBleGFjdCksIHRvIHVzZQogIG15IG5ldyBjdXJsX2Vhc3lfcGVyZm9ybSgpIHRoYXQgdXNlcyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIHJ1biB0aGUKICByZXF1ZXN0LiBJdCBpcyBhIGdyZWF0IHRlc3RiZWQgZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIEkgYmVsaWV2ZSB3ZQogIHNoYWxsIGRvIGl0IHRoaXMgd2F5IGZvciByZWFsIGluIHRoZSBmdXR1cmUgd2hlbiB3ZSBoYXZlIGEgc3VjY2Vzc29yIHRvCiAgY3VybF9tdWx0aV9mZHNldCgpLiBJJ3ZlIHVzZWQgdGhpcyBhcHByb2FjaCB0byBkZXRlY3QgYW5kIGZpeCBzZXZlcmFsIG9mIHRoZQogIHJlY2VudCBtdWx0aS1pbnRlcmZhY2VzIGlzc3Vlcy4KCi0gQWRqdXN0ZWQgdGhlIEtOT1dOX0JVR1MgIzE3IGZpeCBhIGJpdCBtb3JlIHNpbmNlIHRoZSBGVFAgY29kZSBhbHNvIGRpZCBzb21lCiAgYmFkIGFzc3VtcHRpb25zLgoKLSBtdWx0aSBpbnRlcmZhY2U6IHdoZW4gYSByZXF1ZXN0IGlzIGRlbmllZCBkdWUgdG8gIk1heGltdW0gcmVkaXJlY3RzCiAgZm9sbG93ZWQiIGxpYmN1cmwgbGVha2VkIHRoZSBsYXN0IExvY2F0aW9uOiBVUkwuCgotIENvbm5lY3QgZmFpbHVyZXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyBvZnRlbiByZXR1cm5lZCBhcyAiY29ubmVjdCgpCiAgdGltZWQgb3V0IiBldmVuIHRob3VnaCB0aGUgcmVhc29uIHdhcyBkaWZmZXJlbnQuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNSkKLSBLTk9XTl9CVUdTICMxNyBmaXhlZC4gQSBETlMgY2FjaGUgZW50cnkgbWF5IG5vdCByZW1haW4gbG9ja2VkIGJldHdlZW4gdHdvCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBpbnZva2VzLiBJdCB3YXMgcHJldmlvdXNseSB1bmxvY2tlZCBhdCBkaXNjb25uZWN0LCB3aGljaAogIGNvdWxkIG1lYW4gdGhhdCBpdCByZW1haW5lZCBsb2NrZWQgYmV0d2VlbiBtdWx0aXBsZSB0cmFuc2ZlcnMuIFRoZSBETlMgY2FjaGUKICBtYXkgbm90IGxpdmUgYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbiBjYWNoZSBkb2VzLCBhcyB0aGV5IGFyZSBzZXBhcmF0ZS4KCiAgVG8gZGVhbCB3aXRoIHRoZSBsYWNrIG9mIEROUyAoaG9zdCBhZGRyZXNzKSBkYXRhIGF2YWlsYWJpbGl0eSBpbiByZS11c2VkCiAgY29ubmVjdGlvbnMsIGxpYmN1cmwgbm93IGtlZXBzIGEgY29weSBvZiB0aGUgSVAgYWRyZXNzIGFzIGEgc3RyaW5nLCB0byBiZQogIGFibGUgdG8gc2hvdyBpdCBldmVuIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gdGhlIHNhbWUgY29ubmVjdGlvbi4KCiAgVGhlIHByb2JsZW0gY291bGQgYmUgbWFkZSB0byBhcHBlYXIgd2l0aCB0aGlzIHN0dW50OgoKICAxLiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICAyLiBhZGQgYW4gZWFzeSBoYW5kbGUKICAzLiBmZXRjaCBhIFVSTCB0aGF0IGlzIHBlcnNpc3RlbnQgKGxlYXZlcyB0aGUgY29ubmVjdGlvbiBhbGl2ZSkKICA0LiByZW1vdmUgdGhlIGVhc3kgaGFuZGxlIGZyb20gdGhlIG11bHRpCiAgNS4ga2lsbCB0aGUgbXVsdGkgaGFuZGxlCiAgNi4gY3JlYXRlIGEgbXVsdGkgaGFuZGxlCiAgNy4gYWRkIHRoZSBzYW1lIGVhc3kgaGFuZGxlIHRvIHRoZSBuZXcgbXVsdGkgaGFuZGxlCiAgOC4gZmV0Y2ggYSBVUkwgZnJvbSB0aGUgc2FtZSBzZXJ2ZXIgYXMgYmVmb3JlIChyZS11c2luZyB0aGUgY29ubmVjdGlvbikKCi0gU3RlcGhlbiBNb3JlIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9GVFBQT1JUIGFuZCB0aGUgLVAgb3B0aW9uIGRpZG4ndCB3b3JrCiAgd2hlbiBidWlsdCBpcHY2LWVuYWJsZWQuIEkndmUgbm93IG1hZGUgYSBmaXggZm9yIGl0LiBXcml0aW5nIHRlc3QgY2FzZXMgZm9yCiAgY3VzdG9tIHBvcnQgaG9zdHMgdHVybmVkIHRvbyB0cmlja3kgc28gdW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vbmUuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwNSkKLSBJYW4gRm9yZCBhc2tlZCBhYm91dCBzdXBwb3J0IGZvciB0aGUgRlRQIGNvbW1hbmQgQUNDVCwgYW5kIEkgZGlzY292ZXJlZCBpdAogIGlzIHByZXNlbnQgaW4gUkZDOTU5Li4uIHNvIG5vdyAobGliKWN1cmwgc3VwcG9ydHMgaXQgYXMgd2VsbC4gLS1mdHAtYWNjb3VudAogIGFuZCBDVVJMT1BUX0ZUUF9BQ0NPVU5UIHNldCB0aGUgYWNjb3VudCBzdHJpbmcuIChUaGUgc2VydmVyIG1heSBhc2sgZm9yIGFuCiAgYWNjb3VudCBzdHJpbmcgYWZ0ZXIgUEFTUyBoYXZlIGJlZW4gc2VudCBhd2F5LiBUaGUgY2xpZW50IHJlc3BvbmRzCiAgd2l0aCAiQUNDVCBbYWNjb3VudCBzdHJpbmddIi4pIEFkZGVkIHRlc3QgY2FzZSAyMjggYW5kIDIyOSB0byB2ZXJpZnkgdGhlCiAgZnVuY3Rpb25hbGl0eS4gVXBkYXRlZCB0aGUgdGVzdCBGVFAgc2VydmVyIHRvIHN1cHBvcnQgQUNDVCBzb21ld2hhdC4KCi0gRGF2aWQgU2hhdyBjb250cmlidXRlZCBhIGZhaXJseSBjb21wbGV0ZSBhbmQgZGV0YWlsZWQgYXV0b2NvbmYgdGVzdCB5b3UgY2FuCiAgdXNlIHRvIGRldGVjdCBsaWJjdXJsIGFuZCBzZXR1cCB2YXJpYWJsZXMgZm9yIHRoZSBwcm90b2NvbHMgdGhlIGluc3RhbGxlZAogIGxpYmN1cmwgc3VwcG9ydHM6IGRvY3MvbGliY3VybC9saWJjdXJsLm00CgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNSkKLSBNYWpvciBGVFAgdGhpcmQgcGFydHkgdHJhbnNmZXIgb3ZlcmhhdWwuCgogIFRoZXNlIGZvdXIgb3B0aW9ucyBhcmUgbm93IG9ic29sZXRlOiBDVVJMT1BUX1NPVVJDRV9IT1NULAogIENVUkxPUFRfU09VUkNFX1BBVEgsIENVUkxPUFRfU09VUkNFX1BPUlQgKHRoaXMgb3B0aW9uIGRpZG4ndCB3b3JrIGJlZm9yZSkKICBhbmQgQ1VSTE9QVF9QQVNWX0hPU1QuCgogIFRoZXNlIHR3byBvcHRpb25zIGFyZSBhZGRlZDogQ1VSTE9QVF9TT1VSQ0VfVVJMIGFuZCBDVVJMT1BUX1NPVVJDRV9RVU9URS4KCiAgVGhlIHRhcmdldC1zaWRlIGRpZG4ndCB1c2UgdGhlIHByb3BlciBwYXRoIHdpdGggUkVUUiwgYW5kIHRodXMgdGhpcyBvbmx5CiAgd29ya2VkIGNvcnJlY3RseSBpbiB0aGUgbG9naW4gcGF0aCAoaS5lIHdpdGhvdXQgZG9pbmcgYW55IENXRCkuIFRoZSBzb3VyY2UtCiAgc2lkZSBzdGlsbCB1c2VzIGEgd3JvbmcgcGF0aCwgYnV0IHRoZSBmaXggZm9yIHRoaXMgd2lsbCBuZWVkIHRvIHdhaXQuIFZlcmlmeQogIHRoZSBmbGF3IGJ5IHVzaW5nIGEgc291cmNlIFVSTCB3aXRoIGluY2x1ZGVkICVYWC1jb2Rlcy4KCiAgTWFkZSBDVVJMT1BUX0ZUUFBPUlQgY29udHJvbCB3ZWF0aGVyIHRoZSB0YXJnZXQgb3BlcmF0aW9uIHNob3VsZCB1c2UgUE9SVAogIChvciBub3QpLiBUaGUgb3RoZXIgc2lkZSB0aHVzIHVzZXMgcGFzc2l2ZSAoUEFTVikgbW9kZS4KCiAgVXBkYXRlZCB0aGUgZnRwM3JkcGFydHkuYyBleGFtcGxlIHNvdXJjZSB0byB1c2UgdGhlIHVwZGF0ZWQgb3B0aW9ucy4KCiAgQWRkZWQgc3VwcG9ydCBmb3IgYSBzZWNvbmQgRlRQIHNlcnZlciBpbiB0aGUgdGVzdCBzdWl0ZS4gTmFtZWQuLi4gZnRwMi4KICBBZGRlZCB0ZXN0IGNhc2VzIDIzMCwgMjMxIGFuZCAyMzIgYXMgYSBmZXcgZmlyc3QgYmFzaWMgdGVzdHMgb2YgdmVyeSBzaW1wbGUKICAzcmQgcGFydHkgdHJhbnNmZXJzLgoKICBDaGFuZ2VkIHRoZSBkZWJ1ZyBvdXRwdXQgdG8gaW5jbHVkZSAndGFyZ2V0JyBhbmQgJ3NvdXJjZScgd2hlbiBhIDNyZCBwYXJ0eQogIGlzIGJlaW5nIG1hZGUsIHRvIG1ha2UgaXQgY2xlYXJlciB3aGF0IGNvbW1hbmRzL3Jlc3BvbnNlcyBjYW1lIG9uIHdoYXQKICBjb25uZWN0aW9uLgoKICBBZGRlZCB0aHJlZSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC0tM3AtdXJsLCAtLTNwLXVzZXIgYW5kIC0tM3AtcXVvdGUuCgogIERvY3VtZW50ZWQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCB0aGUgY3VybF9lYXN5X3NldG9wdCBvcHRpb25zIHJlbGF0ZWQKICB0byB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIChUZW1wb3JhcmlseSkgZGlzYWJsZWQgdGhlIGFiaWxpdHkgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gZm9yIHRoZQogIHNvdXJjZSBjb25uZWN0aW9uLiBUaGlzIGlzIGJlY2F1c2UgaXQgbmVlZHMgdG8gZm9yY2UgYSBuZXcgaW4gY2FzZSB0aGUKICBzb3VyY2UgYW5kIHRhcmdldCBpcyB0aGUgc2FtZSBob3N0LCBhbmQgdGhlIGhvc3QgbmFtZSBjaGVjayBpcyB0cmlja2llciBub3cKICB3aGVuIHRoZSBzb3VyY2UgaXMgaWRlbnRpZmllZCB3aXRoIGEgZnVsbCBVUkwgaW5zdGVhZCBvZiBhIHBsYWluIGhvc3QgbmFtZQogIGxpa2UgYmVmb3JlLgoKICBUT0RPIChzaG9ydC10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogcXVvdGUgc3VwcG9ydC4gVGhlIG9wdGlvbnMgYXJlCiAgdGhlcmUsIHdlIG5lZWQgdG8gYWRkIHRlc3QgY2FzZXMgdG8gdmVyaWZ5IHRoZWlyIGZ1bmN0aW9uYWxpdHkuCgogIFRPRE8gKGxvbmctdGVybSkgZm9yIDNyZCBwYXJ0eSB0cmFuc2ZlcnM6IElQdjYgc3VwcG9ydCAoRVBSVCBhbmQgRVBTViBldGMpCiAgYW5kIFNTTC9UU0wgc3VwcG9ydC4KCkRhbmllbCAoMjAgSmFudWFyeSAyMDA1KQotIFBoaWxpcHBlIEhhbWVhdSBmb3VuZCBvdXQgdGhhdCAtUSAiK1tjb21tYW5kXSIgZGlkbid0IHdvcmssIGFsdGhvdWdoIHNvbWUKICBjb2RlIHdhcyB3cml0dGVuIGZvciBpdC4gSSBmaXhlZCBhbmQgYWRkZWQgdGVzdCBjYXNlIDIyNyB0byB2ZXJpZnkgaXQuCiAgVGhlIGN1cmwuMSBtYW4gcGFnZSBkaWRuJ3QgbWVudGlvbiB0aGUgJysnIHNvIEkgYWRkZWQgaXQuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNSkKLSBTdGVwaGFuIEJlcmdtYW5uIG1hZGUgbGliY3VybCByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVCBpZiBhbiBGVFAgVVJMCiAgY29udGFpbnMgJTBhIG9yICUwZCBpbiB0aGUgdXNlciwgcGFzc3dvcmQgb3IgQ1dEIHBhcnRzLiAoQSBmdXR1cmUgZml4IHdvdWxkCiAgaW5jbHVkZSBkb2luZyBpdCBmb3IgJTAwIGFzIHdlbGwgLSBzZWUgS05PV05fQlVHUyBmb3IgZGV0YWlscy4pIFRlc3QgY2FzZQogIDIyNSBhbmQgMjI2IHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoaXMKCi0gU3RlcGhhbiBCZXJnbWFubiBwb2ludGVkIG91dCB0d28gZmxhd3MgaW4gbGliY3VybCBidWlsdCB3aXRoIEhUVFAgZGlzYWJsZWQ6CgogIDEpIHRoZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHN0aWxsIHJlYWQgYW5kIHVzZWQgdG8gc2V0IEhUVFAgcHJveHkKCiAgMikgeW91IGNvdWxkbid0IGRpc2FibGUgaHR0cCBwcm94eSB3aXRoIENVUkxPUFRfUFJPWFkgKHNpbmNlIHRoZSBvcHRpb24gd2FzCiAgICAgZGlzYWJsZWQpLiBUaGlzIGlzIGltcG9ydGFudCBzaW5jZSBhcHBzIG1heSB3YW50IHRvIGRpc2FibGUgSFRUUCBwcm94eQogICAgIHdpdGhvdXQgYWN0dWFsbHkga25vd2luZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB0byBkaXNhYmxlIEhUVFAgb3Igbm90LgoKICBCYXNlZCBvbiBTdGVwaGFuJ3MgcGF0Y2gsIGJvdGggdGhlc2UgaXNzdWVzIHNob3VsZCBub3cgYmUgZml4ZWQuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwNSkKLSBDb2R5IEpvbmVzJyBlbmhhbmNlZCB2ZXJzaW9uIG9mIFNhbXVlbCBE7WF6IEdhcmPtYSdzIE1TVkMgbWFrZWZpbGUgcGF0Y2ggd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDA1KQotIEFsZXggYWthIFdpbmRFYWdsZSBwb2ludGVkIG91dCB0aGF0IHdoZW4gZG9pbmcgImN1cmwgLXYgZGljdGlvbmFyeS5jb20iLCBjdXJsCiAgYXNzdW1lZCB0aGlzIHVzZWQgdGhlIERJQ1QgcHJvdG9jb2wuIFdoaWxlIGd1ZXNzaW5nIHByb3RvY29scyB3aWxsIHJlbWFpbgogIGZ1enp5LCBJJ3ZlIG5vdyBtYWRlIHN1cmUgdGhhdCB0aGUgaG9zdCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggIltwcm90b2NvbF0uIgogIGZvciB0aGVtIHRvIGJlIGEgdmFsaWQgZ3Vlc3NhYmxlIG5hbWUuIEkgYWxzbyByZW1vdmVkICJodHRwcyIgYXMgYSBwcmVmaXgKICB0aGF0IGluZGljYXRlcyBIVFRQUywgc2luY2Ugd2UgaGFyZGx5IGV2ZXIgc2VlIGFueSBob3N0IG5hbWVzIHVzaW5nIHRoYXQuCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNSkKLSBJbnNwaXJlZCBieSBNYXJ0aWpuIEtvc3RlcidzIHBhdGNoIGFuZCBleGFtcGxlIHNvdXJjZSBhdAogIGh0dHA6Ly93d3cuZ3JlZW5oaWxscy5jby51ay9tYWsvZ2VudG9vL2N1cmwtZWludHItYnVnLmMsIEkgbm93IG1hZGUgdGhlCiAgc2VsZWN0KCkgYW5kIHBvbGwoKSBjYWxscyBwcm9wZXJseSBsb29wIGlmIHRoZXkgcmV0dXJuIC0xIGFuZCBlcnJubyBpcwogIEVJTlRSLiBnbGliYyBkb2NzIGZvciB0aGlzIGlzIGZvdW5kIGhlcmU6CiAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmMvbWFudWFsL2h0bWxfbm9kZS9JbnRlcnJ1cHRlZC1QcmltaXRpdmVzLmh0bWwKCiAgVGhpcyBsYXN0IGxpbmsgc2F5cyBCU0QgZG9lc24ndCBoYXZlIHRoaXMgImVmZmVjdCIuIFdpbGwgdGhlcmUgYmUgYSBwcm9ibGVtCiAgaWYgd2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHk/CgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNSkKLSBEYW4gVG9yb3AgY2xlYW5lZCB1cCBhIGZldyBubyBsb25nZXIgdXNlZCB2YXJpYWJsZXMgZnJvbSBEYXZpZCBQaGlsbGlwcycKICBzZWxlY3QoKSBvdmVyaGF1bCBmaXguCgotIEN5cmlsbCBPc3RlcndhbGRlciBwb3N0ZWQgYSBkZXRhaWxlZCBhbmFseXNpcyBhYm91dCBhIGJ1ZyB0aGF0IG9jY3VycyB3aGVuCiAgdXNpbmcgYSBjdXN0b20gSG9zdDogaGVhZGVyIGFuZCBjdXJsIGZhaWxzIHRvIHNlbmQgYSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBhbmQgdGh1cyBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZHMgaXQuIEl0CiAgdGhlbiBzZW50IHR3byBIb3N0OiBoZWFkZXJzLiBDeXJpbGwncyBhbmFseXNpcyB3YXMgcG9zdGVkIGhlcmU6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNS0wMS8wMDIyLmh0bWwKCi0gQnJ1Y2UgTWl0Y2hlbmVyIGlkZW50aWZpZWQgKGJ1ZyByZXBvcnQgIzEwOTk2NDApIHRoZSBuZXZlci1lbmRpbmcgU09DS1M1CiAgcHJvYmxlbSB3aXRoIHRoZSB2ZXJzaW9uIGJ5dGUgYW5kIHRoZSBjaGVjayBmb3IgYmFkIHZlcnNpb25zLiBCcnVjZSBoYXMgbG90cwogIG9mIGNsdWVzIG9uIHRoaXMsIGFuZCBiYXNlZCBvbiBoaXMgc3VnZ2VzdGlvbiBJJ3ZlIG5vdyByZW1vdmVkIHRoZSBjaGVjayBvZgogIHRoYXQgYnl0ZSBzaW5jZSBpdCBzZWVtcyB0byBiZSBhYmxlIHRvIGNvbnRhaW4gMSBvciA1LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDUpCi0gUGF2ZWwgT3JlaG92IHJlcG9ydGVkIG1lbW9yeSBwcm9ibGVtcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgaW4gYnVnIHJlcG9ydAogICMxMDk4ODQzLiBJbiBzaG9ydCwgYSBzaGFyZWQgRE5TIGNhY2hlIHdhcyBzZXR1cCBmb3IgYSBtdWx0aSBoYW5kbGUgYW5kIHdoZW4KICB0aGUgc2hhcmVkIGNhY2hlIHdhcyBkZWxldGVkIGJlZm9yZSB0aGUgaW5kaXZpZHVhbCBlYXN5IGhhbmRsZXMsIHRoZSBsYXR0ZXIKICBjbGVhbnVwcyBjYXVzZWQgcmVhZC93cml0ZXMgdG8gYWxyZWFkeSBmcmVlZCBtZW1vcnkuCgotIEh6aGlqdW4gcmVwb3J0ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgU1NMIGNlcnRpZmljYXRlIGNvZGUsIHRoYXQgbGVha2VkIHRoZQogIHJlbW90ZSBjZXJ0aWZpY2F0ZSBuYW1lIHdoZW4gaXQgZGlkbid0IG1hdGNoIHRoZSB1c2VkIGhvc3QgbmFtZS4KCkdpc2xlICg4IEphbnVhcnkgMjAwNSkKLSBBZGRlZCBNYWtlZmlsZS5XYXRjb20gZmlsZXMgKHNyYy9saWIpLiBVcGRhdGVkIE1ha2VmaWxlLmRpc3QuCgpEYW5pZWwgKDcgSmFudWFyeSAyMDA1KQotIEltcHJvdmVkIHRoZSB0ZXN0IHNjcmlwdCdzIHZhbGdyaW5kIGxvZyBwYXJzZXIgdG8gYWN0dWFsbHkgd29yayEgQWxzbyBhZGRlZAogIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUgdGhlIGxvZyBzY2FubmVyIGZvciBzcGVjaWZpYyB0ZXN0IGNhc2VzLiBUZXN0IGNhc2UKICA1MDkgcmVzdWx0cyBpbiBudW1lcm91cyBwcm9ibGVtcyBhbmQgbGVha3MgaW4gT3BlblNTTCBhbmQgaGFzIHRvIGdldCBpdAogIGRpc2FibGVkLgoKRGFuaWVsICg2IEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIHNpbmdsZS1ieXRlIHJlYWQgb3V0IG9mIGJvdW5kcyBpbiB0ZXN0IGNhc2UgMzkgaW4gdGhlIGN1cmwgdG9vbCBjb2RlCiAgKGkuZSBub3QgaW4gdGhlIGxpYnJhcnkpLgoKLSBCdWcgcmVwb3J0ICMxMDk3MDE5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdoZW4gZG9pbmcgLWQgImRhdGEiIHdpdGggLUcgYW5kCiAgc2VuZGluZyBpdCB0byB0d28gVVJMcyB3aXRoIHt9LiBBZGRlZCB0ZXN0IDE5OSB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDUpCi0gTWFydHkgS3VocnQgYWRqdXN0ZWQgYSBWTVMgYnVpbGQgc2NyaXB0IHNsaWdodGx5CgotIEthaSBTb21tZXJmZWxkIGFuZCBHaXNsZSBWYW5lbSBmaXhlZCBsaWJjdXJsIHRvIGJ1aWxkIHdpdGggSVB2NiBzdXBwb3J0IG9uCiAgV2luMjAwMC4KCkRhbmllbCAoMiBKYW51YXJ5IDIwMDUpCi0gQWxleCBOZWJsZXR0IHVwZGF0ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHNsaWdodGx5LgpEYW5pZWwgKDI1IERlY2VtYmVyIDIwMDQpCi0gUmVtb3ZlZCBzcmMvY29uZmlnLmguaW4gZnJvbSBDVlMsIGl0IGlzIG5vdyBjb3BpZWQgZnJvbSB0aGUgKGdlbmVyYXRlZCkKICBsaWIvY29uZmlnLmguaW4gaW5zdGVhZCwgYXMgdGhleSBjYW4gdmVyeSB3ZWxsIGJlIHRoZSBzYW1lLiBUaGlzIHJlbW92ZXMgYQogICJtYW51YWwgaGFzc2xlIi4gWW91IG1heSB3YW50IHRvIHJlLXJ1biBidWlsZGNvbmYgbm93LgoKLSBXZXJuZXIgS29jaCBmaWxlZCBEZWJpYW4gYnVnIHJlcG9ydCAjMjg2Nzk0LCBtZW50aW9uaW5nIHRoYXQgY3VybCBjb250YWluZWQKICBub24tZnJlZSAoYnkgRGViaWFuJ3Mgdmlldykgc291cmNlIGNvZGUuIFRoaXMgd2FzIEFuZ3VzIE1hY2theSdzCiAgc3JjL2dldHBhc3MuYyBzb3VyY2UgY29kZS4gSSB0cmllZCB0byBjb250YWN0IGhpbSBhYm91dCBpdCB0byBxdWlja2x5IHNvbHZlCiAgdGhpcyBpc3N1ZSwgYnV0IGhpcyBlbWFpbCBhZGRyZXNzZXMgYm91bmNlIGFuZCBJIGdvdCBzb21lIHRpbWUgIm92ZXIiIGFuZAogIHJlaW1wbGVtZW50ZWQgdGhlIGZ1bmN0aW9uYWxpdHkgb25jZSBicm91Z2h0IGJ5IEFuZ3VzLiBXZSBubyBsb25nZXIgdXNlIGFueQogIG9mIEFuZ3VzJyBvcmlnaW5hbCBjb2RlIGFuZCB0aGUgbmV3IGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciAoSU1PKS4gSXNzdWUKICBzb2x2ZWQuCgpEYW5pZWwgKDI0IERlY2VtYmVyIDIwMDQpCi0gRGF2aWQgU2hhdyBhZGRlZCAtLXByb3RvY29scyB0byBjdXJsLWNvbmZpZywgc28gdGhhdCBpdCBub3cgbGlzdHMgYWxsCiAgcHJvdG9jb2xzIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIHN1cHBvcnQuIC0tZmVhdHVyZSBubyBsb25nZXIgbGlzdHMgZGlzYWJsZWQKICBwcm90b2NvbHMuCgpEYW5pZWwgKDIzIERlY2VtYmVyIDIwMDQpCi0gRGF2aWQgU2hhdyBmaXhlZCB0aGUgY29uZmlndXJlIC0tZGlzYWJsZS1bcHJvdG9jb2xdIHZhcmlhYmxlcyBzbyB0aGF0CiAgY3VybC1jb25maWcgLS1mZWF0dXJlIG5vdyB3b3JrcyBjb3JyZWN0bHkhCgpEYW5pZWwgKDIyIERlY2VtYmVyIDIwMDQpCi0gUnVuZSBLbGV2ZWxhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBmb3IgcmVjZWl2ZWQgY29va2llcyB3aXRoIHRoZQogIChyYXJlKSB2ZXJzaW9uIGF0dHJpYnV0ZSBzZXQuCgotIE1hcmNpbiBLb25pY2tpIHByb3ZpZGVkIHR3byBjb25maWd1cmUgZml4ZXMgYW5kIGEgc291cmNlIGZpeCB0byBtYWtlIGN1cmwKICBidWlsZCBvdXQtb2YtdGhlLWJveCBvbiBCZU9TLgoKRGFuaWVsICgyMSBEZWNlbWJlciAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAyMTcgdGhhdCB2ZXJpZmllZCBDVVJMSU5GT19IVFRQX0NPTk5FQ1RDT0RFLCBhbmQgSSBtYWRlIHRoZQogIC13IG9wdGlvbiBzdXBwb3J0ICdodHRwX2Nvbm5lY3QnIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHZlcmlmeSEKCi0gRml4ZWQgbGliL3NlbGVjdC5jIGluY2x1ZGUgb3JkZXIgdG8gYnVpbGQgZmluZSBvbiBGcmVlQlNECgotIEZpeGVkIGZhaWxmKCkncyByZXVzZSBvZiB0aGUgdmFfbGlzdCB2YXJpYWJsZSB0aGF0IGNyYXNoZWQgb24gRnJlZUJTRC4KICBQb2ludGVkIG91dCBieSBQZXRlciBQZW50Y2hldi4KClZlcnNpb24gNy4xMi4zICgyMCBEZWNlbWJlciAyMDA0KQoKRGFuaWVsICgxOSBEZWNlbWJlciAyMDA0KQotIEkgaW52ZXN0aWdhdGVkIG91ciBQS0NTMTIgYnVpbGQgcHJvYmxlbSBvbiBTb2xhcmlzIDIuNyB3aXRoIE9wZW5TU0wgMC45LjdlLAogIGFuZCBpdCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBmYXVsdCBvZiB0aGUgemxpYiAxLjEuNCBoZWFkZXJzIGRvaW5nIGEgdHlwZWRlZgogIG5hbWVkICdmcmVlX2Z1bmMnIGFuZCB0aGUgT3BlblNTTCBoZWFkZXJzIGhhdmUgYSBwcm90b3R5cGUgdGhhdCB1c2VzCiAgJ2ZyZWVfZnVuYycgaW4gb25lIG9mIGl0cyBhcmd1bWVudHMuIFRoaXMgaXMgd2h5IHRoZSBjb21waWxlIGVycm9ycyBvdXQuCgogIEluIG90aGVyIHdvcmRzLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG9wZW5zc2wvcGtjczEyLmggaGVhZGVyIGJlZm9yZSB0aGUKICB6bGliLmggaGVhZGVyIGFuZCBpdCBidWlsZHMgZmluZS4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgdGhpcwogIGZpbGUgYW5kIGl0IHRoZW4gZ2V0cyBpbmNsdWRlZCBlYXJseSBpbiBsaWIvdXJsZGF0YS5oLgoKRGFuaWVsICgxOCBEZWNlbWJlciAyMDA0KQotIFNhbXVlbCBMaXN0b3BhZCBhZGRlZCBzdXBwb3J0IGZvciBQS0NTMTIgZm9ybWF0dGVkIGNlcnRpZmljYXRlcy4KCi0gU2FtdWVsIExpc3RvcGFkIGZpeGVkIC1FIHRvIHN1cHBvcnQgIkM6L3BhdGgiICh3aXRoIGZvcndhcmQgc2xhc2gpIGFzIHdlbGwuCgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgZGlyZWN0b3J5IHJlLXVzZSBmb3IgRlRQLgoKICBJIGFkZGVkIHRlc3QgY2FzZSAyMTUgYW5kIDIxNiB0byBiZXR0ZXIgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBEaW5hciBpbiBidWcgcmVwb3J0ICMxMDg2MTIxLCBmb3VuZCBhIGZpbGUgaGFuZGxlIGxlYWsgd2hlbiBhIG11bHRpcGFydAogIGZvcm1wb3N0IChpbmNsdWRpbmcgYSBmaWxlIHVwbG9hZCBwYXJ0KSB3YXMgYWJvcnRlZCBiZWZvcmUgdGhlIHdob2xlIGZpbGUKICB3YXMgc2VudC4KCkRhbmllbCAoMTUgRGVjZW1iZXIgMjAwNCkKLSBUb20gTGVlIGZvdW5kIG91dCB0aGF0IGdsb2JiaW5nIG9mIHN0cmluZ3Mgd2l0aCBiYWNrc2xhc2hlcyBkaWRuJ3Qgd29yayBhcwogIHlvdSdkIGV4cGVjdC4gQmFja3NsYXNoZXMgYXJlIHN1Y2ggYSBjZW50cmFsIHBhcnQgb2Ygd2luZG93cyBmaWxlIG5hbWVzIHRoYXQKICBmb3JjaW5nIGJhY2tzbGFzaGVzIHRvIGhhdmUgdG8gYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzIGlzIGEgYml0IHRvbwogIGF3a3dhcmQgdG8gdXNlcnMuIFN0YXJ0aW5nIG5vdywgeW91IG9ubHkgbmVlZCB0byBlc2NhcGUgZ2xvYmJpbmcgY2hhcmFjdGVycwogIHN1Y2ggYXMgdGhlIGZpdmUgbGV0dGVyczogIltde30sIi4gQWRkZWQgdGVzdCBjYXNlIDIxNCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgRGVjZW1iZXIgMjAwNCkKLSBIYXJzaGFsIFByYWRoYW4gcGF0Y2hlZCBhIEhUVFAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGZsYXc6IGlmIHRoZSB1c2VyIG5hbWUKICBhbmQvb3IgcGFzc3dvcmQgd2VyZSBtb2RpZmllZCBiZXR3ZWVuIHR3byByZXF1ZXN0cyBvbiBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLCB0aGUgc2Vjb25kIHJlcXVlc3Qgd2VyZSBzdGlsbCBtYWRlIHdpdGggdGhlIGZpcnN0IHNldHVwIQoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDEzIERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgYWRkZWQgQ1VSTElORk9fU1NMX0VOR0lORVMgdG8gY3VybF9lYXN5X2dldGluZm8oKSB0byBhbGxvdyBhbiBhcHAKICB0byBsaXN0IGFsbCBhdmFpbGFibGUgY3J5cHRvIEVOR0lORVMuCgotIEdpc2xlIGZpeGVkIGJ1ZyByZXBvcnQgIzEwODM1NDIsIHdoaWNoIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHJlc3VtaW5nCiAgbGFyZ2UgZmlsZSAoPjRHQikgZmlsZTovLyB0cmFuc2ZlcnMgb24gd2luZG93cy4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwNCkKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlIEhUVFAgc2VydmVyIChzd3MpIGNhcGFibGUgb2YgdXNpbmcgSVB2NiwgYW5kIHRoZW4KICBleHRlbmRlZCB0aGUgdGVzdCBlbnZpcm9ubWVudCB0byBzdXBwb3J0IHRoYXQgYW5kIGFsc28gYWRkZWQgdGhyZWUgdGVzdAogIGNhc2VzICgyNDAsIDI0MSwgMjQyKSB0aGF0IHJ1biB0ZXN0cyB1c2luZyBJUHY2LiBUZXN0IDI0MiB1c2VzIGEgVVJMIHRoYXQKICBkaWRuJ3Qgd29yayBiZWZvcmUgdGhlIDEwIGRlYyBmaXggYnkgS2FpIFNvbW1lcmZlbGQuCgotIE1hZGUgYSBmYWlsZWQgZmlsZTovLyByZXN1bWUgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UKCi0gQ29ycmVjdGVkIHRoZSBDVVJMRV9CQURfRE9XTkxPQURfUkVTVU1FIGVycm9yIG1lc3NhZ2UgaW4gbGliL3N0cmVycm9yLmMKCi0gRGFuIEZhbmRyaWNoOgoKICBzaW1wbGlmaWVkIGFuZCBjb25zb2xpZGF0ZWQgdGhlIFNTTCBjaGVja3MgaW4gY29uZmlndXJlIGFuZCB0aGUgdXNhZ2Ugb2YgdGhlCiAgZGVmaW5lcyBpbiBsaWIvc2V0dXAuaAoKICBwcm92aWRlZCBhIGZpcnN0IGxpYmN1cmwucGMuaW4gZmlsZSBmb3IgcGtnLWNvbmZpZyAoYnV0IHRoZSByZXN1bHQgaXMgbm90CiAgaW5zdGFsbGVkIGFueXdoZXJlIGF0IHRoaXMgcG9pbnQpCgogIGV4dGVuZGVkIHRoZSBjcm9zcyBjb21waWxlIHNlY3Rpb24gaW4gdGhlIGRvY3MvSU5TVEFMTCBmaWxlCgpEYW5pZWwgKDEwIERlY2VtYmVyIDIwMDQpCi0gV2hlbiBwcm92aWRpbmcgdXNlciBuYW1lIGluIHRoZSBVUkwgYW5kIGEgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzIChsaWtlIGluCiAgImZ0cDovL3VzZXJAWzo6MV0vdG1wIiksIHRoZSBVUkwgcGFyc2VyIGRpZG4ndCBnZXQgdGhlIGhvc3QgZXh0cmFjdGVkCiAgcHJvcGVybHkuICBSZXBvcnRlZCBhbmQgZml4ZWQgYnkgS2FpIFNvbW1lcmZlbGQuCgpEYW5pZWwgKDkgRGVjZW1iZXIgMjAwNCkKLSBUb24gVm9vbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBmaXggdGhhdCBzaG91bGQgZml4IHRoZSBub3RvcmlvdXMgKG1vc3RseQogIHJlcG9ydGVkIG9uIFNvbGFyaXMpIHByb2JsZW0gd2hlcmUgdGhlIHNpemVfdCBjaGVjayBmYWlscyBkdWUgdG8gdGhlIFNTTAogIGxpYnMgYmVpbmcgZm91bmQgaW4gYSBkaXIgbm90IHNlYXJjaGVkIHRocm91Z2ggYnkgdGhlIHJ1bi10aW1lIGxpbmtlci4KICBwYXRjaC10cmFja2VyIGVudHJ5ICMxMDgxNzA3LgoKLSBCcnlhbiBIZW5kZXJzb24gcG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCAjMTA4MTc4OCB0aGF0IHRoZSBjdXJsLWNvbmZpZwogIC0tdmVybnVtIG91dHB1dCB3YXNuJ3QgemVybyBwcmVmaXhlZCBwcm9wZXJseSAoYXMgY2xhaW1lZCBpbiBkb2N1bWVudGF0aW9uKS4KICBUaGlzIGlzIGZpeGVkIGluIG1ha2V0Z3ogbm93LgoKRGFuaWVsICg4IERlY2VtYmVyIDIwMDQpCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBtYWNoLU8gZnJhbWV3b3JrIGZpbGVzIGZvciBNYWMgT1MgWC4KCi0gUmVuZSBCZXJuaGFyZHQgZm91bmQgYW5kIGZpeGVkIGEgYnVmZmVyIG92ZXJydW4gaW4gdGhlIE5UTE0gY29kZSwgd2hlcmUKICBsaWJjdXJsIGFsd2F5cyBhbmQgdW5jb25kaXRpb25hbGx5IG92ZXJ3cm90ZSBhIHN0YWNrLWJhc2VkIGFycmF5IHdpdGggMyB6ZXJvCiAgYnl0ZXMuIFRoaXMgaXMgbm90IGFuIGV4cGxvaXRhYmxlIGJ1ZmZlciBvdmVyZmxvdy4gTm8gbmVlZCB0byBnZXQgYWxhcm1lZC4KCkRhbmllbCAoNyBEZWNlbWJlciAyMDA0KQotIEZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgdmVyYm9zZSBpbmZvICJzdHJlYW0iCiAgZXZlbiBpZiBubyBlcnJvcmJ1ZmZlciBpcyBzZXQuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jb29raWVzIG9wdGlvbiB0byBjb25maWd1cmUgdG8gYnVpbGQKICBsaWJjdXJsIHdpdGhvdXQgY29va2llIHN1cHBvcnQuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBidWlsZCBhCiAgbWluaW1hbGlzdGljIGxpYmN1cmwgd2l0aCBubyBjb29raWVzIHN1cHBvcnQgYXQgYWxsLiBMaWtlIGZvciBlbWJlZGRlZAogIHN5c3RlbXMgb3Igc2ltaWxhci4KCi0gUmljaGFyZCBBdHRlcmVyIGZpeGVkIGxpYmN1cmwncyB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZSBFUFNWCiAgcmVzcG9uc2UuIFByZXZpb3VzbHksIGxpYmN1cmwgd291bGQgcmUtcmVzb2x2ZSB0aGUgaG9zdCBuYW1lIHdpdGggdGhlIG5ldwogIHBvcnQgbnVtYmVyIGFuZCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhhdCwgd2hpbGUgaXQgc2hvdWxkIHVzZSB0aGUgSVAgZnJvbQogIHRoZSBjb250cm9sIGNoYW5uZWwuIFRoaXMgYnVnIG1hZGUgaXQgaGFyZCB0byBFUFNWIGZyb20gYW4gRlRQIHNlcnZlciB3aXRoCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzIQoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDQpCi0gQnVnIHJlcG9ydCAjMTA3ODA2Njogd2hlbiBhIGNodW5rZWQgdHJhbnNmZXIgd2FzIHByZS1tYXR1cmVseSBjbG9zZWQgZXhhY3RseQogIGF0IGEgY2h1bmsgYm91bmRhcnkgaXQgd2FzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yIGFuZCB0aHVzIHdlbnQgdW5ub3RpY2VkLgogIEZpeGVkIGJ5IE1hdXJpY2UgQmFybnVtLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjA3IHRvIHZlcmlmeS4KCkRhbmllbCAoMiBEZWNlbWJlciAyMDA0KQotIEZpeGVkIHRoZSBDT05ORUNUIGxvb3AgdG8gZGVmYXVsdCB0aW1lb3V0IHRvIDM2MDAgc2Vjb25kcy4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNiB0aGF0IG1ha2VzIENPTk5FQ1Qgd2l0aCBEaWdlc3QuCgogIEZpeGVkIGEgZmxhdyB0aGF0IHByZXBlbmRlZCAiKG5pbCkiIHRvIHRoZSBpbml0aWFsIENPTk5FQ1QgcnFldWVzdCdzIHVzZXItCiAgYWdlbnQgZmllbGQuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoJ3MgZml4IGZvciBsaWJ6IDEuMSBhbmQgImV4dHJhIGZpZWxkIiB1c2FnZSBpbiBhIGd6aXAgc3RyZWFtCgotIERhbiBhbHNvIGhlbHBlZCBtZSB3aXRoIGlucHV0IGRhdGEgdG8gY3JlYXRlIHRocmVlIG1vcmUgdGVzdCBjYXNlcyBmb3IgdGhlCiAgLS1jb21wcmVzc2VkIG9wdGlvbi4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwNCkKLSBJIGltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIGVuYWJsZSBiaW5hcnkgY29udGVudHMgaW4gdGhlIHRlc3RzIChieSBwcm92aW5nCiAgaXQgYmFzZTY0IGVuY29kZWQpLCBsaWtlIGZvciB0ZXN0aW5nIGRlY29tcHJlc3MgZXRjLiBBZGRlZCB0ZXN0IDIyMCBhbmQgMjIxCiAgZm9yIHRoaXMgcHVycG9zZS4gVGVzdHMgY2FuIG5vdyBhbHNvIGRlcGVuZCBvbiBsaWJ6IHRvIHJ1bi4KCi0gQXMgcmVwb3J0ZWQgYnkgUmVpbm91dCB2YW4gU2Nob3V3ZW4gaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODUKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg1KSwgd2hlbiBjb25uZWN0aW5nIHRvIGFuCiAgSVB2NiBob3N0IHdpdGggRlRQLCAtLWRpc2FibGUtZXBzdiAob3IgLS1kaXNhYmxlLWVwcnQpIGVmZmVjdGl2ZWx5IGRpc2FibGVzCiAgdGhlIGFiaWxpdHkgdG8gdHJhbnNmZXIgYSBmaWxlLiBOb3csIHdoZW4gY29ubmVjdGVkIHRvIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIElQdjYsIHRoZXNlIEZUUCBjb21tYW5kcyBjYW4ndCBiZSBkaXNhYmxlZCBldmVuIGlmIGFza2VkIHRvIHdpdGggdGhlCiAgYXZhaWxhYmxlIGxpYmN1cmwgb3B0aW9ucy4KCkRhbmllbCAoMjYgTm92ZW1iZXIgMjAwNCkKLSBBcyByZXBvcnRlZCBpbiBNYW5kcmFrZSdzIGJ1ZyB0cmFja2VyIGJ1ZyAxMjI4OQogIChodHRwOi8vcWEubWFuZHJha2Vzb2Z0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTIyODkpLCBjdXJsIHdvdWxkIHByaW50IGEKICBuZXdsaW5lIHRvICJmaW5pc2giIHRoZSBwcm9ncmVzcyBtZXRlciBhZnRlciBlYWNoIHJlZGlyZWN0IGFuZCBub3Qgb25seQogIGFmdGVyIGEgY29tcGxldGVkIHRyYW5zZmVyLgoKRGFuaWVsICgyNSBOb3ZlbWJlciAyMDA0KQotIEZUUCBpbXByb3ZlbWVudHM6CgogIElmIEVQU1YsIEVQUlQgb3IgTFBSVCBpcyB0cmllZCBhbmQgZG9lc24ndCB3b3JrLCBpdCB3aWxsIG5vdCBiZSByZXRyaWVkIG9uCiAgdGhlIHNhbWUgc2VydmVyIGFnYWluIGV2ZW4gaWYgYSBmb2xsb3dpbmcgcmVxdWVzdCBpcyBtYWRlIHVzaW5nIGEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24uCgogIElmIGEgc2Vjb25kIHJlcXVlc3QgaXMgbWFkZSB0byBhIHNlcnZlciwgcmVxdWVzdGluZyBhIGZpbGUgZnJvbSB0aGUgc2FtZQogIGRpcmVjdG9yeSBhcyB0aGUgcHJldmlvdXMgcmVxdWVzdCBvcGVyYXRlZCBvbiwgbGliY3VybCB3aWxsIG5vIGxvbmdlciBtYWtlCiAgdGhhdCBsb25nIHNlcmllcyBvZiBDV0QgY29tbWFuZHMganVzdCB0byBlbmQgdXAgb24gdGhlIHNhbWUgc3BvdC4gTm90ZSB0aGF0CiAgdGhpcyBpcyBvbmx5IGZvciAqZXhhY3RseSogdGhlIHNhbWUgZGlyLiBUaGVyZSBpcyBzdGlsbCByb29tIGZvciBpbXByb3ZlbWVudHMKICB0byBvcHRpbWl6ZSB0aGUgQ1dELXNlbmRpbmcgd2hlbiB0aGUgZGlycyBhcmUgb25seSBzbGlnaHRseSBkaWZmZXJlbnQuCgogIEFkZGVkIHRlc3QgMjEwLCAyMTEgYW5kIDIxMiB0byB2ZXJpZnkgdGhlc2UgY2hhbmdlcy4gSGFkIHRvIGltcHJvdmUgdGhlCiAgdGVzdCBzY3JpcHQgdG9vIGFuZCBhZGRlZCBhIG5ldyBwcmltaXRpdmUgdG8gdGhlIHRlc3QgZmlsZSBmb3JtYXQuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDQpCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc2VsZWN0IHByb3Blcmx5IHdoZW4gcnVuCiAgd2l0aCBNc3lzL01pbmd3IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDQpCi0gTWFkZSBIVFRQIFBVVCBhbmQgUE9TVCByZXF1ZXN0cyBubyBsb25nZXIgdXNlIEhFQUQgd2hlbiBkb2luZyBtdWx0aS1wYXNzCiAgYXV0aCBuZWdvdGlhdGlvbiAoTlRMTSwgRGlnZXN0IGFuZCBOZWdvdGlhdGUpLCBidXQgaW5zdGVhZCB1c2UgdGhlIHJlcXVlc3QKICBrZXl3b3JkICJwcm9wZXJseSIuIERldGFpbHMgaW4gbGliL1JFQURNRS5odHRwYXV0aC4gVGhpcyBhbHNvIGludHJvZHVjZXMKICBDVVJMT1BUX0lPQ1RMRlVOQ1RJT04gYW5kIENVUkxPUFRfSU9DVExEQVRBLCB0byBiZSB1c2VkIGJ5IGFwcHMgdGhhdCB1c2UgdGhlCiAgImFueSIgYXV0aCBhbHRlcm5hdGl2ZSBhcyB0aGVuIGxpYmN1cmwgbWF5IG5lZWQgdG8gc2VuZCB0aGUgUFVUL1BPU1QgZGF0YQogIG1vcmUgdGhhbiBvbmNlIGFuZCB0aHVzIG1heSBuZWVkIHRvIGFzayB0aGUgYXBwIHRvICJyZXdpbmQiIHRoZSByZWFkIGRhdGEKICBzdHJlYW0gdG8gc3RhcnQuCgogIFNlZSBhbHNvIHRoZSBuZXcgZXhhbXBsZSB1c2luZyB0aGlzOiBkb2NzL2V4YW1wbGVzL2FueWF1dGhwdXQuYwoKLSBEYXZpZCBQaGlsbGlwcyBlbmhhbmNlZCB0ZXN0IDUxOC4gSSBtYWRlIGl0IGRlcGVuZCBvbiBhICJmZWF0dXJlIiBzbyB0aGF0CiAgc3lzdGVtcyB3aXRob3V0IGdldHJsaW1pdCgpIHdvbid0IGF0dGVtcHQgdG8gdGVzdCA1MTguIGNvbmZpZ3VyZSBub3cgY2hlY2tzCiAgZm9yIGdldHJsaW1pdCgpIGFuZCBzZXRybGltaXQoKSBmb3IgdGhpcyB0ZXN0IGNhc2UuCgpEYW5pZWwgKDE4IE5vdmVtYmVyIDIwMDQpCi0gRGF2aWQgUGhpbGxpcHMgZml4ZWQgbGliY3VybCB0byBub3QgY3Jhc2ggYW55bW9yZSB3aGVuIG1vcmUgdGhhbiBGRF9TRVRTSVpFCiAgZmlsZSBkZXNjcmlwdG9ycyBhcmUgaW4gdXNlLiBUZXN0IGNhc2UgNTE4IGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwNCkKLSBUbyB0ZXN0IG15IGZpeCBmb3IgdGhlIENVUkxJTkZPX1JFRElSRUNUX1RJTUUgYnVnLCBJIGFkZGVkIHRpbWVfcmVkaXJlY3QgYW5kCiAgbnVtX3JlZGlyZWN0cyBzdXBwb3J0IHRvIHRoZSAtdyB3cml0ZW91dCBvcHRpb24gZm9yIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4KCi0gV29qY2llY2ggWndpZWZrYSBmb3VuZCBvdXQgdGhhdCBDVVJMSU5GT19SRURJUkVDVF9USU1FIGRpZG4ndCB3b3JrIGFzCiAgZG9jdW1lbnRlZC4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtb2RpZ2llZCB0aGUgTVNWQyBhbmQgTmV0d2FyZSBtYWtlZmlsZXMgdG8gYnVpbGQgd2l0aG91dAogIGxpYmN1cmwuZGVmCgotIERhbiBGYW5kcmljaCBhZGRlZCB0aGUgLS1kaXNhYmxlLWNyeXB0by1hdXRoIG9wdGlvbiB0byBjb25maWd1cmUgdG8gYWxsb3cKICBsaWJjdXJsIHRvIGJ1aWxkIHdpdGhvdXQgRGlnZXN0IHN1cHBvcnQuIChJIGZpZ3VyZSBpdCBzaG91bGQgYWxzbyBleHBsaWNpdGx5CiAgZGlzYWJsZSBOZWdvdGlhdGUgYW5kIE5UTE0uKQoKLSAgICAgICAgICAgICAgICAgKioqIE1vZGlmaWVkIEJlaGF2aW91ciBBbGVydCAqKioKCiAgU2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gTlVMTCB3aWxsIG5vIGxvbmdlciBkbyBhIEdFVC4KCiAgU2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gIiIgd2lsbCBzZW5kIGEgemVybyBieXRlIFBPU1QgYW5kIHNldHRpbmcKICBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gTlVMTCBhbmQgQ1VSTE9QVF9QT1NURklFTERTSVpFIHRvIHplcm8gd2lsbCBhbHNvIG1ha2UKICBhIHplcm8gYnl0ZSBQT1NULiBBZGRlZCB0ZXN0IGNhc2UgNTE1IHRvIHZlcmlmeSB0aGlzLgoKICBTZXR0aW5nIENVUkxPUFRfSFRUUFBPU1QgdG8gTlVMTCBtYWtlcyBhIHplcm8gYnl0ZSBwb3N0LiBBZGRlZCB0ZXN0IGNhc2UgNTE2CiAgdG8gdmVyaWZ5IHRoaXMuCgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSBtdXN0IG5vdyBiZSBzZXQgdG8gLTEgdG8gc2lnbmFsICJ3ZSBkb24ndCBrbm93Ii4KICBTZXR0aW5nIGl0IHRvIHplcm8gc2ltcGx5IHNheXMgdGhpcyBpcyBhIHplcm8gYnl0ZSBQT1NULgoKICBXaGVuIHByb3ZpZGluZyBQT1NUIGRhdGEgd2l0aCBhIHJlYWQgY2FsbGJhY2ssIHNldHRpbmcgdGhlIHNpemUgdXAgZnJvbnQKICBpcyBub3cgbWFkZSB3aXRoIENVUkxPUFRfUE9TVEZJRUxEU0laRSBhbmQgbm90IHdpdGggQ1VSTE9QVF9JTkZJTEVTSVpFLgoKRGFuaWVsICgxMSBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBhZGRlZCAtLWRpc2FibGUtdmVyYm9zZSB0byB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBidWlsZHMKICB3aXRob3V0IHZlcmJvc2Ugc3RyaW5ncyBpbiB0aGUgY29kZSwgdG8gc2F2ZSBzb21lIDEyS0Igc3BhY2UuIE1ha2VzIHNlbnNlCiAgb25seSBmb3Igc3lzdGVtcyB3aXRoIHZlcnkgbGl0dGxlIG1lbW9yeSByZXNvdXJjZXMuCgotIEplZmYgUGhpbGxpcHMgZm91bmQgb3V0IHRoYXQgYSBkYXRlIHN0cmluZyB3aXRoIGEgeWVhciBiZXlvbmQgMjAzOCBjb3VsZAogIGNyYXNoIHRoZSBuZXcgZGF0ZSBwYXJzZXIgb24gc3lzdGVtcyB3aXRoIDMyYml0IHRpbWVfdC4gV2Ugbm93IGNoZWNrIGZvcgogIHRoaXMgY2FzZSBhbmQgZGVhbCB3aXRoIGl0LgoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDA0KQotIEkgaW5zdGFsbGVkIEhlaW1kYWwgb24gbXkgRGViaWFuIGJveCAodXNpbmcgdGhlIGRlYmlhbiBwYWNrYWdlKSBhbmQgbm90aWNlZAogIHRoYXQgY29uZmlndXJlIC0td2l0aC1nc3NhcGkgZmFpbGVkIHRvIGNyZWF0ZSBhIG5pY2UgYnVpbGQuIEZpeGVkIG5vdy4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDA0KQotIEdpc2xlIFZhbmVtIG1hcmtlZCBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gY2FsbHMgd2l0aCBDVVJMX0VYVEVSTiBzbyB0aGF0IG5vdwogIHRoZSBXaW5kb3dzLCBOZXR3YXJlIGFuZCBvdGhlciBidWlsZHMgbm8gbG9uZ2VyIG5lZWQgbGliY3VybC5kZWYgb3Igc2ltaWxhcgogIGZpbGVzLgoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDQpCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBjaGVjayBmb3IgdGxkLmggaWYgbGliaWRuIHdhcyBkZXRlY3RlZCwgc2luY2UKICBsaWJpZG4gMC4zLlggZGlkbid0IGhhdmUgc3VjaCBhIGhlYWRlciBhbmQgd2UgZG9uJ3Qgd29yayB3aXRoIGFueXRoaW5nCiAgYmVmb3JlIGxpYmlkbiAwLjQuMSBhbnl3YXkhIFN1c2UgOS4xIGFwcGFyZW50bHkgc2hpcHMgd2l0aCBhIDAuMy5YIHZlcnNpb24KICBvZiBsaWJpZG4gd2hpY2ggbWFrZXMgdGhlIGN1cmwgNy4xMi4yIGJ1aWxkIGZhaWwuIEplYW4tUGhpbGlwcGUKICBCYXJyZXR0ZS1MYVBpZXJyZSBoZWxwZWQgcG9pbnRpbmcgdGhpcyBvdXQuCgotIElhbiBHdWxsaXZlciByZXBvcnRlZCBpbiBkZWJpYW4gYnVnIHJlcG9ydCAjMjc4NjkxOiBpZiBjdXJsIGlzIGludm9rZWQgaW4gYW4KICBlbnZpcm9ubWVudCB3aGVyZSBzdGRlcnIgaXMgY2xvc2VkIHRoZSAtdiBvdXRwdXQgd2lsbCBzdGlsbCBiZSBzZW50IHRvIGZpbGUKICBkZXNjcmlwdG9yIDIgd2hpY2ggdGhlbiBtaWdodCBiZSB0aGUgbmV0d29yayBzb2NrZXQgaGFuZGxlISBOb3cgd2UgaGF2ZSBhCiAgd2VpcmQgaGFjayBpbnN0ZWFkIHRoYXQgYXR0ZW1wdHMgdG8gbWFrZSBzdXJlIHRoYXQgZmlsZSBkZXNjcmlwdG9yIDIgaXMKICBvcGVuZWQgKHdpdGggYSBjYWxsIHRvIHBpcGUoKSkgYmVmb3JlIGxpYmN1cmwgaXMgY2FsbGVkIHRvIGRvIHRoZSB0cmFuc2Zlci4KICBjb25maWd1cmUgbm93IGNoZWNrcyBmb3IgcGlwZSgpIGFuZCBzeXN0ZW1zIHdpdGhvdXQgcGlwZSBkb24ndCBnZXQgdGhlIHdlaXJkCiAgaGFjayBkb25lLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDQpCi0gVGltIFNuZWRkb24gbWFkZSBsaWJjdXJsIHNlbmQgbm8gbW9yZSB0aGFuIDY0SyBpbiBhIHNpbmdsZSBmaXJzdCBjaHVuayB3aGVuCiAgZG9pbmcgYSBodWdlIFBPU1Qgb24gVk1TLCBhcyB0aGlzIGlzIGEgc3lzdGVtIGxpbWl0YXRpb24uIERlZmF1bHQgb24gZ2VuZXJhbAogIHN5c3RlbXMgaXMgMTAwSy4KCkRhbmllbCAoNCBOb3ZlbWJlciAyMDA0KQotIEFuZHJlcyBHYXJjaWEgbWFkZSBpdCBidWlsZCBvbiBtaW5ndyBhZ2FpbmEsIG15IC0tcmV0cnkgY29kZSBicm9rZSB0aGUgYnVpbGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNCkKLSBBZGRlZCAtLXJldHJ5LW1heC10aW1lIHRoYXQgYWxsb3dzIGEgbWF4aW11bSB0aW1lIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4KICByZWFjaGVkIGZvciBhIHJldHJ5IHRvIGJlIG1hZGUuIElmIG5vdCBzZXQgdGhlcmUgaXMgbm8gbWF4aW11bSB0aW1lLCBvbmx5CiAgdGhlIGFtb3VudCBvZiByZXRyaWVzIHNldCB3aXRoIC0tcmV0cnkuCgotIFBhdWwgTm9sYW4gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIGxpYmN1cmwgYnVpbGQgbmljZWx5IG9uIFdpbmRvd3MgQ0UuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwNCkKLSBXaGVuIGNyb3NzLWNvbXBpbGluZywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIHVzZQogIHBrZy1jb25maWcgb24gdGhlIGJ1aWxkIGhvc3QgaW4gb3JkZXIgdG8gZGV0ZWN0IE9wZW5TU0wgY29tcGlsZXIgb3B0aW9ucy4KCkRhbmllbCAoMjcgT2N0b2JlciAyMDA0KQotIERhbiBGYW5kcmljaDoKCiAgQW4gaW1wcm92ZW1lbnQgdG8gdGhlIGd6aXAgaGFuZGxpbmcgb2YgbGliY3VybC4gVGhlcmUgd2VyZSB0d28gcHJvYmxlbXMgd2l0aAogIHRoZSBvbGQgdmVyc2lvbjogaXQgd2FzIHBvc3NpYmxlIGZvciBhIG1hbGljaW91cyBnemlwIGZpbGUgdG8gY2F1c2UgbGliY3VybAogIHRvIGxlYWsgbWVtb3J5LCBhcyBhIGJ1ZmZlciB3YXMgbWFsbG9jZWQgdG8gaG9sZCB0aGUgaGVhZGVyIGFuZCBuZXZlciBmcmVlZAogIGlmIHRoZSBoZWFkZXIgZW5kZWQgd2l0aCBubyBmaWxlIGNvbnRlbnRzLiAgVGhlIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgdGhlCiAgNjQgS2lCIGRlY29tcHJlc3Npb24gYnVmZmVyIHdhcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCB3aGljaCBjYXVzZWQKICB1bmV4cGVjdGVkbHkgaGlnaCBzdGFjayB1c2FnZSBhbmQgb3ZlcmZsb3dlZCB0aGUgc3RhY2sgb24gc29tZSBzeXN0ZW1zCiAgKHNvbWVvbmUgY29tcGxhaW5lZCBhYm91dCB0aGF0IGluIHRoZSBtYWlsaW5nIGxpc3QgYWJvdXQgYSB5ZWFyIGFnbykuCgogIEJvdGggcHJvYmxlbXMgYXJlIGZpeGVkIGJ5IHRoaXMgcGF0Y2guIFRoZSBmaXJzdCBvbmUgaXMgZml4ZWQgd2hlbiBhIHJlY2VudAogICgxLjIpIHZlcnNpb24gb2YgemxpYiBpcyB1c2VkLCBhcyBpdCB0YWtlcyBjYXJlIG9mIGd6aXAgaGVhZGVyIHBhcnNpbmcKICBpdHNlbGYuICBBIGNoZWNrIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgZG9uZSBhdCBydW4tdGltZSBhbmQgbGliY3VybCB1c2VzCiAgdGhhdCBmZWF0dXJlIGlmIGl0J3MgcHJlc2VudC4gSSd2ZSBjcmVhdGVkIGEgZGVmaW5lIE9MRF9aTElCX1NVUFBPUlQgdGhhdAogIGNhbiBiZSBjb21tZW50ZWQgb3V0IHRvIHNhdmUgc29tZSBjb2RlIHNwYWNlIGlmIGxpYmN1cmwgaXMgZ3VhcmFudGVlZCB0byBiZQogIHVzaW5nIGEgMS4yIHZlcnNpb24gb2YgemxpYi4KCiAgVGhlIHNlY29uZCBwcm9ibGVtIGlzIHNvbHZlZCBieSBkeW5hbWljYWxseSBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYnVmZmVyCiAgaW5zdGVhZCBvZiBzdG9yaW5nIGl0IG9uIHRoZSBzdGFjay4gVGhlIGFsbG9jYXRpb24vZnJlZSBpcyBkb25lIGZvciBldmVyeQogIGluY29taW5nIHBhY2tldCwgd2hpY2ggaXMgc3Vib3B0aW1hbCwgYnV0IHNob3VsZCBiZSBkd2FyZmVkIGJ5IHRoZSBhY3R1YWwKICBkZWNvbXByZXNzaW9uIGNvbXB1dGF0aW9uLgoKICBJJ3ZlIGFsc28gZmFjdG9yZWQgb3V0IHNvbWUgY29tbW9uIGNvZGUgYmV0d2VlbiBkZWZsYXRlIGFuZCBnemlwIHRvIHJlZHVjZQogIHRoZSBjb2RlIGZvb3RwcmludCBzb21ld2hhdC4gIEkndmUgdGVzdGVkIHRoZSBnemlwIGNvZGUgb24gYSBmZXcgdGVzdCBmaWxlcwogIGFuZCBJIHRyaWVkIGRlZmxhdGUgdXNpbmcgdGhlIGZyZXNobWVhdC5uZXQgc2VydmVyLCBhbmQgaXQgYWxsIGxvb2tzIE9LLiBJCiAgZGlkbid0IHRyeSBydW5uaW5nIGl0IHdpdGggdmFsZ3JpbmQsIGhvd2V2ZXIuCgotIEFkZGVkIGEgLS1yZXRyeSBvcHRpb24gdG8gY3VybCB0aGF0IHRha2VzIGEgbnVtZXJpY2FsIG9wdGlvbiBmb3IgdGhlIG51bWJlcgogIG9mIHRpbWVzIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQuIEl0IGlzIHJldHJpZWQgaWYgYSB0cmFuc2llbnQgZXJyb3IKICBpcyBkZXRlY3RlZCBvciBpZiBhIHRpbWVvdXQgb2NjdXJyZWQuIEJ5IGRlZmF1bHQsIGl0IHdpbGwgZmlyc3Qgd2FpdCBvbmUKICBzZWNvbmQgYmV0d2VlbiB0aGUgcmV0cmllcyBhbmQgdGhlbiBkb3VibGUgdGhlIGRlbGF5IHRpbWUgYmV0d2VlbiBlYWNoIHJldHJ5CiAgdW50aWwgdGhlIGRlbGF5IHRpbWUgaXMgdGVuIG1pbnV0ZXMgd2hpY2ggdGhlbiB3aWxsIGJlIHRoZSBkZWxheSB0aW1lCiAgYmV0d2VlbiBhbGwgZm9ydGhjb21pbmcgcmV0cmllcy4gWW91IGNhbiBzZXQgYSBzdGF0aWMgZGVsYXkgdGltZSB3aXRoCiAgIi0tcmV0cnktZGVsYXkgW251bV0iIHdoZXJlIFtudW1dIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJldHdlZW4KICBlYWNoIHJldHJ5LgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDQpCi0gVG9tYXMgUG9zcGlzZWsgZmlsZWQgYnVnIHJlcG9ydCAjMTA1MzI4NyB0aGF0IHByb3ZlZCAtQyAtIGFuZCAtLWZhaWwgb24gYQogIGZpbGUgdGhhdCB3YXMgYWxyZWFkeSBjb21wbGV0ZWx5IGRvd25sb2FkZWQgY2F1c2VkIGFuIGVycm9yLCB3aGlsZSBpdAogIGRvZXNuJ3QgaWYgeW91IGRvbid0IHVzZSAtLWZhaWwhIEkgYWRkZWQgdGVzdCBjYXNlIDE5NCB0byB2ZXJpZnkgdGhlIGZpeC4KICBHcnJyLiBDVVJMT1BUX0ZBSUxPTkVSUk9SIGlzIG5vdyBhZGRlZCB0byB0aGUgbGlzdCBzdHVmZiB0byByZW1vdmUgaW4KICBsaWJjdXJsIHY4IGR1ZSB0byBhbGwgdGhlIGtsdWRnZXMgbmVlZGVkIHRvIHN1cHBvcnQgaXQuCgotIE1vaHVuIEJpc3dhcyBmb3VuZCBvdXQgdGhhdCBmb3JtcG9zdGluZyBhIHplcm8tYnl0ZSBmaWxlIGRpZG4ndCB3b3JrIHZlcnkKICBnb29kLiBJIGZpeGVkLgoKRGFuaWVsICgxOSBPY3RvYmVyIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSBpdCBwb3NzaWJsZSB0byBtYWtlIEZUUCAzcmQgcGFydHkgdHJhbnNmZXJzCiAgd2l0aCBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmVpbmcgdGhlIHNhbWUgaG9zdC4gSXQgY2FuIGJlIHVzZWZ1bCBpZgogIHlvdSB3YW50IHRvIG1vdmUgYSBmaWxlIG9uIGEgc2VydmVyIG9yIHNpbWlsYXIuCgotIEd1aWxsYXVtZSBBcmx1aXNvbiBhZGRlZCBDVVJMSU5GT19OVU1fQ09OTkVDVFMgdG8gYWxsb3cgYW4gYXBwIHRvIGZpZ3VyZQogIG91dCBob3cgbWFueSBuZXcgY29ubmVjdHMgYSBwcmV2aW91cyB0cmFuc2ZlciByZXF1aXJlZC4KCiAgSSBhZGRlZCAle251bV9jb25uZWN0c30gdG8gdGhlIGN1cmwgdG9vbCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE5MiBhbmQgMTkzCiAgdG8gdmVyaWZ5IHRoZSBuZXcgY29kZS4KCkRhbmllbCAoMTggT2N0b2JlciAyMDA0KQotIFBldGVyIFd1bGxpbmdlciBwb2ludGVkIG91dCB0aGF0IGN1cmwgc2hvdWxkIGNhbGwgc2V0bG9jYWxlKCkgcHJvcGVybHkgdG8KICBpbml0aWF0ZSB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb3BlcmF0aW9ucywgdG8gbWFrZSB0aGUgSUROIHN0dWZmIHdvcmsKICBiZXR0ZXIuCgpWZXJzaW9uIDcuMTIuMiAoMTggT2N0b2JlciAyMDA0KQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSB0aGUgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyBvcHRpb24gd29yawogIGZpbmUgZXZlbiBmb3IgdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKLSBydW5la2wgYXQgb3BvaW50LmNvbSBmb3VuZCBvdXQgKGFuZCBwcm92aWRlZCBhIGZpeCkgdGhhdCBsaWJjdXJsIGxlYWtlZAogIG1lbW9yeSBmb3IgY29va2llcyB3aXRoIHRoZSAibWF4LWFnZSIgZmllbGQgc2V0LgoKR2lzbGUgKDE2IE9jdG9iZXIgMjAwNCkKLSBJc3N1ZSA1MCBpbiBUT0RPLVJFTEVBU0U7IEFkZGVkIFRyYWlhbiBOaWNvbGVzY3UncyBwYXRjaGVzIGZvciB0aHJlYWRlZAogIHJlc29sdmVyIG9uIFdpbmRvd3MuIFBsdWdnZWQgc29tZSBwb3RlbnRpYWwgaGFuZGxlIGFuZCBtZW1vcnkgbGVha3MuCgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNCkKLSBFcmljIFZlcmduYXVkIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgdHJlYXQgPy1sZXR0ZXJzIGluIHRoZSB1c2VyCiAgbmFtZSBhbmQgcGFzc3dvcmQgZmllbGRzIHByb3Blcmx5IGluIFVSTHMsIGxpa2UKICBmdHA6Ly91cz9lcjpwYXNzP3dvcmRAc2l0ZS5jb20vLiBBZGRlZCB0ZXN0IDE5MSB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDA0KQotIGxpYmN1cmwgbm93IHVzZXMgU09fTk9TSUdQSVBFIGZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdCAoTWFjIE9TIFggMTAuMiBvcgogIGxhdGVyIGlzIG9uZSkgdG8gaW5oaWJpdCB0aGUgU0lHUElQRSBzaWduYWwgd2hlbiB3cml0aW5nIHRvIGEgc29ja2V0IHdoaWxlCiAgdGhlIHBlZXIgZGllcy4gVGhlIHNhbWUgZWZmZWN0IGlzIHByb3ZpZGUgYnkgdGhlIE1TR19OT1NJR05BTCBwYXJhbWV0ZXIgdG8KICBzZW5kKCkgb24gb3RoZXIgc3lzdGVtcy4gQWxhbiBQaW5zdGVpbiB2ZXJpZmllZCB0aGUgZml4LgoKRGFuaWVsICgxMCBPY3RvYmVyIDIwMDQpCi0gU3lzdGVtcyB3aXRoIDY0Yml0IGxvbmdzIG5vIGxvbmdlciB1c2Ugc3RydG9sbCgpIG9yIG91ciBzdHJ0b2xsLSByZXBsYWNlbWVudAogIHRvIHBhcnNlIDY0IGJpdCBudW1iZXJzLiBzdHJ0b2woKSB3b3JrcyBmaW5lLiBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayB0bwogIGRldGVjdCBpZiBbY29uc3RhbnRdTEwgd29ya3MgYW5kIGlmIHNvLCB1c2UgdGhhdCBpbiB0aGUgc3RydG9sbCByZXBsYWNlbWVudAogIGNvZGUgdG8gd29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3MgcmVwb3J0ZWQgYnkgQW5keSBDZWRpbG5pay4KCkdpc2xlICg2IE9jdG9iZXIgMjAwNCkKLSBGb3IgVVNFX0xJQklETiBidWlsZHM6IEFkZGVkIFRvcC1MZXZlbC1Eb21haW4gKFRMRCkgY2hlY2sgb2YgaG9zdC1uYW1lCiAgdXNlZCBpbiBmaXhfaG9zdG5hbWUoKS4gQ2hlY2tzIGlmIGNoYXJhY3RlcnMgaW4gJ2hvc3QtPm5hbWUnIChpbmRpcmVjdGx5CiAgdmlhICdhY2VfaG9zdG5hbWUnKSBhcmUgbGVnYWwgYWNjb3JkaW5nIHRvIHRoZSBUTEQgdGFibGVzIGluIGxpYmlkbi4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDQpCi0gQ2hpaC1DaHVuZyBDaGFuZyByZXBvcnRlZCB0aGF0IGlmIHlvdSB1c2UgQ1VSTE9QVF9SRVNVTUVfRlJPTSBhbmQgZW5hYmxlZAogIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIGxpYmN1cmwgcmVwb3J0ZWQgZXJyb3IgaWYgYSByZWRpcmVjdCBoYXBwZW5lZCBldmVuCiAgaWYgdGhlIG5ldyBVUkwgd291bGQgcHJvdmlkZSB0aGUgcmVzdW1lZCBmaWxlLiBUZXN0IGNhc2UgMTg4IGFkZGVkIHRvIHZlcmlmeQogIHRoZSBmaXggKHRvZ2V0aGVyIHdpdGggZXhpc3RpbmcgdGVzdCA5OSkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIGNvbmZpZ3VyZSBmbGF3IGZvciBzeXN0ZW1zIHRoYXQgbmVlZCBib3RoIG5zbCBhbmQgc29ja2V0CiAgbGlicyB0byB1c2UgZ2V0aG9zdGJ5bmFtZSgpLgoKLSBSZW1vdmVkIHRhYnMgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsb3RzIG9mIHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDQpCi0gTWFkZSBjb25maWd1cmUgLS13aXRoLWxpYmlkbj1QQVRIIHRyeSB0aGUgZ2l2ZW4gUEFUSCBiZWZvcmUgdGhlIGRlZmF1bHQKICBwYXRocyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlLgoKLSBJZiBpZG5hX3N0cmVycm9yKCkgaXMgcHJlc2VudCBpbiBsaWJpZG4sIHdlIGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIG91cgogIGludGVybmFsIHJlcGxhY2VtZW50LiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBieSBTaW1vbiBpbiBsaWJpZG4gMC41LjYgYW5kCiAgaXMgZGV0ZWN0ZWQgYnkgY29uZmlndXJlLgoKLSBJdCBzZWVtcyBiYXNlbmFtZSgpIG9uIElSSVggaXMgaW4gdGhlIGxpYmdlbiBsaWJyYXJ5IGFuZCBzaW5jZSB3ZSBkb24ndCB1c2UKICB0aGF0LCBjb25maWd1cmUgZmluZHMgbGliZ2VuLmggYnV0IG5vdCBiYXNlbmFtZSBhbmQgdGhlbiB3ZSBnZXQgYSBjb21waWxlcgogIGVycm9yIGJlY2F1c2Ugb3VyIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZG9lc24ndCBtYXRjaCB0aGUgcHJvdG8gaW4KICBsaWJnZW4uaC4gU3RhcnRpbmcgbm93LCB3ZSBkb24ndCBpbmNsdWRlIHRoZSBmaWxlIGlmIGJhc2VuYW1lIHdhc24ndCBmb3VuZAogIGFzIHdlbGwuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA0KQotIENocmlzIGZvdW5kIGEgcmFjZSBjb25kaXRpb24gcmVzdWx0aW5nIGluIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGFuZAogIHBvdGVudGlhbCBjcmFzaCwgaW4gdGhlIHdpbmRvd3MgdGhyZWFkZWQgbmFtZSByZXNvbHZlciBjb2RlLgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwNCkKLSBSZXBsYWNlZCB0aGUgdXNlIG9mIGlzc3BhY2UoKSBpbiBjb29raWUuYyB3aXRoIG91ciBvd24gdmVyc2lvbiBpbnN0ZWFkIHNpbmNlCiAgd2UgaGF2ZSBtb3N0IGRhdGEgYXMgJ2NoYXIgKicgYW5kIHRoYXQgbWFrZXMgdXMgcGFzcyBpbiBuZWdhdGl2ZSB2YWx1ZXMgaWYKICB0aGVyZSBpcyA4Yml0IGRhdGEgaW4gdGhlIHN0cmluZy4gQ2hhbmdpbmcgdG8gdW5zaWduZWQgY2F1c2VzIHRvbyBtdWNoCiAgd2FybmluZ3Mgb3IgdG9vIG1hbnkgcmVxdWlyZWQgdHlwZWNhc3RzIHRvIHRoZSBub3JtYWwgc3RyaW5nIGZ1bmN0aW9ucy4KICBIYXJzaGFsIFByYWRoYW4gaWRlbnRpZmllZCB0aGlzIHByb2JsZW0uCgpEYW5pZWwgKDIgT2N0b2JlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGNvdWxkIHJlYWQgYWxyZWFkeSBmcmVlZAogIGRhdGEgd2hlbiBDVVJMT1BUX1ZFUkJPU0UgaXMgdXNlZCBhbmQgYSAodmVyeSkgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBJdAogIGhhcHBlbmVkIHdoZW4gdGhlIGRucyBjYWNoZSBlbnRyeSBmb3IgdGhlIGNvbm5lY3Rpb24gd2FzIHBydW5lZCB3aGlsZSB0aGUKICBjb25uZWN0aW9uIHdhcyBzdGlsbCBhbGl2ZSBhbmQgdGhlbiBhZ2FpbiByZS11c2VkLiBXZSB3b3JrZWQgdG9nZXRoZXIgb24KICB0aGlzIGZpeC4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IGRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgKGxpYmlkbgogIGJhc2VkKSBJRE4gY29udmVyc2lvbiBmYWlscy4gVGhpcyBpcyByZWFsbHkgZHVlIHRvIGEgbWlzc2luZyBzdWl0YWJsZQogIGZ1bmN0aW9uIGluIHRoZSBsaWJpZG4gQVBJIHRoYXQgSSBob3BlIHdlIGNhbiByZW1vdmUgb25jZSBsaWJpZG4gZ2V0cyBhCiAgZnVuY3Rpb24gbGlrZSB0aGlzLgoKRGFuaWVsICgxIE9jdG9iZXIgMjAwNCkKLSBBbGVrc2FuZGFyIE1pbGl2b2pldmljIHJlcG9ydGVkIGEgcHJvYmxlbSBpbiB0aGUgUmVkaGF0IGJ1Z3ppbGxhIChzZWUKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzNDEzMykgYW5kIG5vdCB0bwogIGFueW9uZSBpbnZvbHZlZCBpbiB0aGUgY3VybCBwcm9qZWN0ISBUaGlzIGhhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIGN1cmwgYQogIGZpbGUgZnJvbSBhIHByb2Z0cGQgc2l0ZSB1c2luZyBTU0wuIEl0IHNlZW1zIHByb2Z0cGQgc2VuZHMgYSBzb21ld2hhdAogIHVub3J0aG9kb3ggcmVzcG9uc2UgY29kZSAoMjMyIGluc3RlYWQgb2YgMjMwKS4gSSByZWxheGVkIHRoZSByZXNwb25zZSBjb2RlCiAgY2hlY2sgdG8gZGVhbCB3aXRoIHRoaXMgYW5kIHNpbWlsYXIgY2FzZXMuCgotIEJhc2VkIG9uIEZlZG9yIEthcnBlbGV2aXRjaCdzIGZvcm1wb3N0IHBhdGggYmFzZW5hbWUgcGF0Y2gsIGZpbGUgcGFydHMgaW4KICBmb3JtcG9zdHMgbm8gbG9uZ2VyIGluY2x1ZGUgdGhlIHBhdGggcGFydC4gSWYgeW91IF9yZWFsbHlfIHdhbnQgdGhlbSwgeW91CiAgbXVzdCBwcm92aWRlIHlvdXIgcHJlZmVycmVkIGZ1bGwgZmlsZSBuYW1lIHdpdGggQ1VSTEZPUk1fRklMRU5BTUUuCgogIEFkZGVkIGRldGVjdGlvbiBmb3IgbGliZ2VuLmggYW5kIGJhc2VuYW1lKCkgdG8gY29uZmlndXJlLiBNeSBjdXN0b20KICBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQsIG1pZ2h0IGJlIGEgYml0IHRvbwogIG5haXZlLi4uCgogIFVwZGF0ZWQgNiB0ZXN0IGNhc2VzIHRvIG1ha2UgdGhlbSB3b3JrIHdpdGggdGhlIHN0cmlwcGVkIHBhdGhzLgoKRGFuaWVsICgzMCBTZXB0ZW1iZXIgMjAwNCkKLSBMYXJyeSBDYW1wYmVsbCBhZGRlZCBDVVJMSU5GT19PU19FUlJOTyB0byBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRoYXQgYWxsb3dzIGFuCiAgYXBwIHRvIHJldHJpZXZlIHRoZSBlcnJubyB2YXJpYWJsZSBhZnRlciBhIChjb25uZWN0KSBmYWlsdXJlLiBJdCB3aWxsIG1ha2UKICBzZW5zZSB0byBwcm92aWRlIHRoaXMgZm9yIG1vcmUgZmFpbHVyZXMgaW4gYSBtb3JlIGdlbmVyaWMgd2F5LCBidXQgbGV0J3MKICBzdGFydCBsaWtlIHRoaXMuCgotIEf8bnRlciBLbmF1ZiBhbmQgQ2FzZXkgTydEb25uZWxsIHdvcmtlZCBvdXQgYW4gZXh0cmEgI2lmIGNvbmRpdGlvbiBmb3IgdGhlCiAgY3VybC9tdWx0aS5oIGhlYWRlciB0byB3b3JrIGJldHRlciBpbiB3aW5zb2NrLXVzaW5nIGFwcHMuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgbWFkZSBidWlsZGNvbmYgcnVuIGJldHRlciBvbiBNYWMgT1MgWCBieQogIHByb3Blcmx5IHVzaW5nIGdsaWJ0b29saXplIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbGl6ZS4gKFRoaXMgaXMgbWFkZSBpZgogIGdsaWJ0b29sIHdhcyBmb3VuZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2wuKQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCBjdXJsX2Vhc3lfcmVzZXQoKSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWlzdGFraW5nbHkKICBlbmFibGUgdGhlIHByb2dyZXNzIG1ldGVyLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwNCkKLSAiTWVrb25pa3VtIiBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgYnVpbHQgY3VybCB3aXRob3V0IFNTTCBzdXBwb3J0LCBhbHRob3VnaAogIHlvdXIgY3VycmVudCBTU0wgaW5zdGFsbGF0aW9uIHN1cHBvcnRzIEVuZ2luZSwgdGhlIGNvbXBpbGUgZmFpbHMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA0KQotIFdoZW4gLS13aXRoLXNzbD1QQVRIIGlzIHVzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGl0IG5vIGxvbmdlciB1c2VzCiAgcGtnLWNvbmZpZyB0byBmaWd1cmUgb3V0IGV4dHJhIGRldGFpbHMuIFRoYXQgaXMgbm93IG9ubHkgZG9uZSBpZiBubyBQQVRIIGlzCiAgaW5jbHVkZWQgb3IgaWYgU1NMIGlzIGNoZWNrZWQgZm9yIGJ5IGRlZmF1bHQgd2l0aG91dCB0aGUgLS13aXRoLXNzbCBvcHRpb24uCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfU1NMRU5HSU5FIGNvdWxkbid0IGV2ZW4gYmUgc2V0IHRvCiAgTlVMTCB3aGVuIG5vIGVuZ2luZSB3YXMgc3VwcG9ydGVkLiBJdCBjYW4gbm93LgoKRGFuaWVsICgyMiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhyZWUgdGVzdCBjYXNlcyB0byBubyBsb25nZXIgdXNlICJsb2NhbGhvc3QiIGJ1dCBpbnN0ZWFkCiAgdXNlICIxMjcuMC4wLjEiIHRvIGF2b2lkIHJlcXVpcmluZyB0aGF0IGxvY2FsaG9zdCByZXNvbHZlcyBuaWNlbHkuCgotIEplYW4tQ2xhdWRlIENoYXV2ZSBmaXhlZCBhbiBMREFQIGNyYXNoIHdoZW4gbW9yZSB0aGFuIG9uZSByZWNvcmQgd2FzCiAgcmV0cmlldmVkLgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNCkKLSBBbmRyZWFzIFJpZWtlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHdpdGhvdXQKICBhIHNlcnZpY2Ugb24gdGhlIHNwZWNpZmllZCBwb3J0LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIGRpZG4ndCBwcm9wZXJseSBwcm92aWRlCiAgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgQ1VSTE9QVF9FUlJPUkJVRkZFUiBidWZmZXIuCgpEYW5pZWwgKDE2IFNlcHRlbWJlciAyMDA0KQotIERhbmllbCBhdCB0b3VjaHR1bmVzIHVzZXMgdGhlIEZUUCtTU0wgc2VydmVyICJCU0RGVFBELVNTTCBmcm9tCiAgaHR0cDovL2JzZGZ0cGQtc3NsLnNjLnJ1LyIgd2hpY2ggYWNjb3JkaW5nbHkgZG9lc24ndCBwcm9wZXJseSB3b3JrIHdpdGggY3VybAogIHdoZW4gIkFVVEggU1NMIiBpcyBpc3N1ZWQgKGFsdGhvdWdoIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgZmluZSBhbmQgZXZlcnl0aGluZykKICBidXQgcmVxdWlyZXMgdGhhdCBjdXJsIGlzc3VlcyAiQVVUSCBUTFMiIGluc3RlYWQuIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTA5NTE5NDQ5Mzc2MDMmc3VwcG9ydD15ZXMKCiAgSW50cm9kdWNpbmcgQ1VSTE9QVF9GVFBTU0xBVVRIIHRoYXQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzZWxlY3Qgd2hpY2gKICBvZiB0aGUgQVVUSCBzdHJpbmdzIHRvIGF0dGVtcHQgZmlyc3QuCgotIEFub255bW91cyBmaWxlZCBidWcgcmVwb3J0ICMxMDI5NDc4IHdoaWNoIGlkZW50aWZpZWQgYSBidWcgd2hlbiB5b3UgMSkgdXNlZAogIGEgVVJMIHdpdGhvdXQgcHJvcGVybHkgc2VwZXJhdGluZyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcGFyYW1ldGVycyB3aXRoIGEKICBzbGFzaC4gMikgdGhlIFVSTCBoYWQgcGFyYW1ldGVycyB0byB0aGUgcmlnaHQgb2YgYSA/IHRoYXQgY29udGFpbnMgYSBzbGFzaAogIDMpIGN1cmwgd2FzIHRvbGQgdG8gZm9sbG93IExvY2F0aW9uOnMgNCkgdGhlIHJlcXVlc3QgZ290IGEgcmVzcG9uc2UgdGhhdAogIGNvbnRhaW5lZCBhIExvY2F0aW9uOiB0byByZWRpcmVjdCB0byAiL2RpciIuIGN1cmwgdGhlbiBhcHBlbmRlZCB0aGUgbmV3IHBhdGgKICBvbiB0aGUgd3JvbmcgcG9zaXRpb24gb2YgdGhlIG9yaWdpbmFsIFVSTC4KCiAgVGVzdCBjYXNlIDE4NyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyB3YXMgZml4ZWQgcHJvcGVybHkuCgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDA0KQotIEFkZGVkIHBhcnNlZGF0ZS5jIHRoYXQgY29udGFpbnMgYSByZXdyaXRlIG9mIHRoZSBkYXRlIHBhcnNlciBjdXJyZW50bHkKICBwcm92aWRlZCBieSBnZXRkYXRlLnkuIFRoZSBuZXcgb25lIGlzIE1VQ0ggc21hbGxlciBhbmQgd2lsbCBhbGxvdyB1cyB0byBydW4KICBhd2F5IGZyb20gdGhlIHlhY2MvYmlzb24ganVuZ2xlLiBJdCBpcyBhbHNvIHNsaWdodGx5IGxhY2tpbmcgaW4gZmVhdHVyZXMKICBjb21wYXJlZCB0byB0aGUgb2xkIG9uZSwgYnV0IGl0IHN1cHBvcnRzIHBhcnNpbmcgb2YgYWxsIGRhdGUgZm9ybWF0cyBIVFRQCiAgaW52b2x2ZXMgKGFuZCBhIGZhaXIgYnVuY2ggb2Ygb3RoZXJzKS4KCkRhbmllbCAoMTAgU2VwdGVtYmVyIDIwMDQpCi0gQXMgZm91bmQgb3V0IGJ5IEpvbmFzIEZvcnNtYW4sIGN1cmwgZGlkbid0IGFsbG93IC1GIHRvIHNldCBDb250ZW50LVR5cGUgb24KICB0ZXh0LXBhcnRzLiBTdGFydGluZyBub3csIHdlIGNhbiBkbyAtRiAibmFtZT1kYW5pZWw7dHlwZT10ZXh0L2V4dHJhIi4gQWRkZWQKICB0ZXN0IGNhc2UgMTg2IHRvIHZlcmlmeS4KCi0gQnVnIHJlcG9ydCAjMTAyNTk4Ni4gV2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogd2l0aCBhIGN1c3RvbSBIb3N0OiBoZWFkZXIKICByZXBsYWNlbWVudCwgY3VybCBvbmx5IHJlcGxhY2VkIHRoZSBIb3N0OiBoZWFkZXIgb24gdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCBkaWRuJ3QgcmVwbGFjZSBpdCBvbiB0aGUgZm9sbG93aW5nIG9uZXMuIFRoaXMgcmVzdWx0ZWQgaW4gcmVxdWVzdHMgd2l0aAogIHR3byBIb3N0OiBoZWFkZXJzLgoKICBOb3csIGN1cmwgY2hlY2tzIGlmIHRoZSBsb2NhdGlvbiBpcyBvbiB0aGUgc2FtZSBob3N0IGFzIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgdGhlbiBjb250aW51ZXMgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyLiBBbmQgd2hlbiBpdCBtb3ZlcyB0byBhbm90aGVyCiAgaG9zdCwgaXQgZG9lc24ndCByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgYnV0IGl0IGFsc28gZG9lc24ndCBtYWtlIHRoZQogIHNlY29uZCBIb3N0OiBoZWFkZXIgZ2V0IHVzZWQgaW4gdGhlIHJlcXVlc3QuCgogIFRoaXMgY2hhbmdlIGlzIHZlcmlmaWVkIGJ5IHRoZSB0d28gbmV3IHRlc3QgY2FzZXMgMTg0IGFuZCAxODUuCgpEYW5pZWwgKDggU2VwdGVtYmVyIDIwMDQpCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUgdG8gYmUgYWJsZSB0byB1c2UgYW5kIHJ1biB3aXRoIGN1c3RvbWl6ZWQgcG9ydAogIG51bWJlcnMuIFRoaXMgd2FzIGFsd2F5cyBpbnRlbmRlZCBidXQgbmV2ZXIgYmVmb3JlIHBvc3NpYmxlLiBOb3cgYSBzaW1wbGUKICBjaGFuZ2UgaW4gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBjYW4gbWFrZSBhbGwgdGVzdHMgdXNlIGRpZmZlcmVudCBwb3J0cy4KICBUaGUgZGVmYXVsdCBwb3J0cyBpbiB1c2UgZnJvbSBub3cgb24gYXJlIDg5OTAgdG8gODk5My4KCkRhbmllbCAoMiBTZXB0ZW1iZXIgMjAwNCkKLSBNaW5vciBtb2RpZmljYXRpb24gb2YgYW4gU1NMLXJlbGF0ZWQgZXJyb3IgbWVzc2FnZS4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDQpCi0gRGF2aWQgVGFyZW5kYXNoIGZvdW5kIG91dCB0aGF0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHJldHVybmVkCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGluc3RlYWQgb2YgQ1VSTE1fT0suCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDA0KQotIE1ha2UgIlByb3h5LUNvbm5lY3Rpb246IGNsb3NlIiBjbG9zZSB0aGUgY3VycmVudCBwcm94eSBjb25uZWN0aW9uLCBhcyBSb21hbgogIEtvaWZtYW4gZm91bmQgb3V0LgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwNCkKLSBGaXhlZCBhIGdldGRhdGUgcHJvYmxlbSBieSBwb3N0LXJlcGxhY2luZyB0aGUgZ2V0ZGF0ZS5jIGZpbGUgYWZ0ZXIgdGhlCiAgYmlzb24veWFjYyBwcm9jZXNzIHRvIGFkZCB0aGUgZml4IEhhcnNoYWwgUHJhZGhhbiBzdWdnZXN0ZWQuIFRoZSBwcm9ibGVtCiAgY2F1c2VkIGEgY3Jhc2ggb24gV2luZG93cyB3aGVuIHBhcnNpbmcgc29tZSBkYXRlcy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDQpCi0gUm9tYW4gS29pZm1hbiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgc2VuZCBFeHBlY3Q6IDEwMC1jb250aW51ZSBvbiBQT1NUcwogIGV2ZW4gd2hlbiB0b2xkIHRvIHVzZSBIVFRQIDEuMCwgd2hpY2ggaXMgbm90IGNvcnJlY3QuIFRlc3QgY2FzZSAxODAgYW5kCiAgMTgxIHZlcmlmeSB0aGlzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTgyIHRvIHZlcmlmeSB0aGF0IHplcm8gYnl0ZSB0cmFuc2ZlcnMgY2FsbCB0aGUgY2FsbGJhY2sKICBwcm9wZXJseS4KCkRhbmllbCAoMjAgQXVndXN0IDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSB0aGUgd3JpdGUgY2FsbGJhY2sgZ2V0IGNhbGxlZCBldmVuIHdoZW4gYSB6ZXJvCiAgYnl0ZSBmaWxlIGlzIGRvd25sb2FkZWQuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDA0KQotIExpbmcgVGhpbyBwb2ludGVkIG91dCB0aGF0IHdoZW4gbGliY3VybCBpcyBidWlsdCBpcHY2LWVuYWJsZWQsIGl0IHN0aWxsIGRpZAogIHJldmVyc2UgRE5TIGxvb2t1cHMgd2hlbiBmZWQgd2l0aCBhIG51bWVyaWNhbCBJUC1hZGRyZXNzIChsaWtlCiAgaHR0cDovLzEyNy4wLjAuMS8pLCBhbHRob3VnaCBpdCBkb2Vzbid0IHdoZW4gYnVpbHQgaXB2Ni1kaXNhYmxlZC4gbGliY3VybAogIHNob3VsZCBuZXZlciBkbyByZXZlcnNlIGxvb2t1cHMuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA0KQotIEtqZXRpbCBKYWNvYnNlbiBub3RpY2VkIHRoYXQgd2hlbiB0cmFuc2ZlcnJpbmcgYSBmaWxlOi8vIFVSTCBwb2ludGluZyB0byBhbgogIGVtcHR5IGZpbGUsIGxpYmN1cmwgd291bGQgcmV0dXJuIHdpdGggdGhlIGZpbGUgc3RpbGwgb3Blbi4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBuZWVkcyB0byBkZWZpbmUKICBfVEhSRUFEX1NBRkUgZm9yIEFJWCBzeXN0ZW1zIHRvIG1ha2UgbGliY3VybCBidWlsdCByZWFsbHkgdGhyZWFkLXNhZmUuCgogIEFsc28gYWRkZWQgYSBjaGVjayBmb3IgdGhlIHhsYyBjb21waWxlciBvbiBBSVgsIGFuZCBpZiB0aGF0IGlzIGRldGVjdCB3ZSB1c2UKICB0aGUgLXF0aHJlYWRlZCBjb21waWxlciBvcHRpb24KCkRhbmllbCAoMTYgQXVndXN0IDIwMDQpCi0gbGliY3VybCBub3cgYWxsb3dzIGEgY3VzdG9tICJBY2NlcHQtRW5jb2Rpbmc6IiBoZWFkZXIgb3ZlcnJpZGUgdGhlCiAgaW50ZXJuYWxseSBzZXQgb25lIHRoYXQgZ2V0cyBzZXQgd2l0aCBDVVJMT1BUX0VOQ09ESU5HLiBQb2ludGVkIG91dCBieSBBbGV4LgoKLSBSb2xhbmQgS3Jpa2F2YSBmb3VuZCBhbmQgZml4ZWQgYSBjb29raWUgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgKHRoZQogIHBhdGggbWF0Y2hpbmcgd2FzIHdyb25nKS4gSSBhZGRlZCB0ZXN0IGNhc2UgMTc5IHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbwogIHJpZ2h0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNCkKLSBDYXNleSBPJ0Rvbm5lbGwgZml4ZWQgc29tZSBNU1ZDIG1ha2VmaWxlIHRhcmdldHMgdG8gbGluayBwcm9wZXJseS4KCkRhbmllbCAoMTEgQXVndXN0IDIwMDQpCi0gY29uZmlndXJlIG5vdyBkZWZpbmVzIF9YT1BFTl9TT1VSQ0UgdG8gNTAwIG9uIHN5c3RlbXMgdGhhdCBuZWVkIGl0IHRvIGJ1aWxkCiAgd2FybmluZy1mcmVlICh0aGUgb25seSBrbm93biBvbmUgc28gZmFyIGlzIG5vbi1nY2MgYnVpbGRzIG9uIDY0Yml0IFNHSQogIElSSVgpLiAoUmV2ZXJ0ZWQgdGhpcyBjaGFuZ2UgbGF0ZXIgYXMgaXQgY2F1c2VkIGNvbXBpbGVyIGVycm9ycy4pCgotIHRoZSBGVFAgY29kZSBub3cgaW5jbHVkZXMgdGhlIHNlcnZlciByZXNwb25zZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZQogIHNlcnZlciBnaXZlcyBiYWNrIGEgNTMwIGFmdGVyIHRoZSBwYXNzd29yZCBpcyBwcm92aWRlZCwgYXMgaXQgaXNuJ3QKICBuZWNlc3NhcnkgYmVjYXVzZSBvZiBhIGJhZCB1c2VyIG5hbWUgb3IgcGFzc3dvcmQuCgpWZXJzaW9uIDcuMTIuMSAoMTAgQXVndXN0IDIwMDQpCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDA0KQotIEluIE9wZW5TU0wgMC45LjdkIGFuZCBlYXJsaWVyLCBBU04xX1NUUklOR190b19VVEY4IGZhaWxzIGlmIHRoZSBpbnB1dCBpcwogIGFscmVhZHkgVVRGLTggZW5jb2RlZC4gVGhpcyBtYWRlIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbCBpZiB0aGUKICByZW1vdGUgc2VydmVyIHVzZWQgYSBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBuYW1lIFVURi04IGVuY29kZWQuCgogIFdvcmstYXJvdW5kIGJyb3VnaHQgYnkgQWxleGlzIFMuIEwuIENhcnZhbGhvLgoKRGFuaWVsICg5IEF1Z3VzdCAyMDA0KQotIEkgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGtyYjQgdG8gdXNlIC1sY29tX2VyciBhcyB3ZWxsLCBhcyBJIHN0YXJ0ZWQKICB0byBnZXQgbGluayBwcm9ibGVtcyB3aXRoIGl0IHVubGVzcyBJIGRpZCB0aGF0IG9uIG15IFNvbGFyaXMgMi43IGJveC4gSQogIGRvbid0IHVuZGVyc3RhbmQgd2h5IEkgc3RhcnRlZCB0byBnZXQgcHJvYmxlbXMgd2l0aCB0aGlzIG5vdyEKCkRhbmllbCAoNSBBdWd1c3QgMjAwNCkKLSBFbnJpY28gU2Nob2x6IGZpeGVkIHRoZSBIVFRQLU5lZ290aWF0ZSBzZXJ2aWNlIG5hbWUgdG8gYmUgdXBwZXJjYXNlIGFzCiAgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjMTAwNDEwNQoKRGFuaWVsICg0IEF1Z3VzdCAyMDA0KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW5nIHRvIGEgaG9zdAogIHVzaW5nIG11bHRpcGxlIElQIChiYWQpIGFkZHJlc3Nlcy4KCi0gRHlsYW4gU2FsaXNidXJ5IG1hZGUgbGliY3VybCBubyBsb25nZXIgYWNjZXB0IGNvb2tpZXMgc2V0IHRvIGEgVExEIG9ubHkgKGl0CiAgcHJldmlvdXNseSBhbGxvd2VkIHRoYXQgb24gdGhlIHNldmVuIHRocmVlLWxldHRlciBkb21haW5zKS4KCkRhbmllbCAoMzEgSnVseSAyMDA0KQotIEpvZWwgQ2hlbiByZXBvcnRlZCB0aGF0IHRoZSBkaWdlc3QgY29kZSBhc3N1bWVkIHF1b3RlcyBhcm91bmQgdGhlIGNvbnRlbnRzIGEKICBiaXQgdG9vIG11Y2guCgpEYW5pZWwgKDI4IEp1bHkgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0aGUgaG9zdCBuYW1lIHRvIGdldCBzZXR1cCBwcm9wZXJseSBldmVuIHdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCwgd2hlbiBhIHByb3h5IGlzIGluIHVzZS4gUHJldmlvdXNseSB0aGUgd3JvbmcgSG9zdDoKICBoZWFkZXIgY291bGQgZ2V0IHNlbnQgd2hlbiByZS11c2luZyBhIHByb3h5IGNvbm5lY3Rpb24gdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCi0gRml4ZWQgQnJpYW4gQWtpbnMnIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggZHVwbGljYXRlIEhvc3Q6IGhlYWRlcnMgb24gcmUtdXNlZAogIGNvbm5lY3Rpb25zLiBJZiB5b3UgYXR0ZW1wdGVkIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBpbiB0aGUgc2Vjb25kCiAgcmVxdWVzdCwgeW91IGdvdCB0d28gc3VjaCBoZWFkZXJzIQoKLSBzcmMvTWFrZWZpbGUuYW0gbm93IGluY2x1ZGVzIHRoZSBNYWtlZmlsZS5pbmMgZmlsZSB0byBnZXQgaW5mbyBhYm91dCBmaWxlcwoKRGFuaWVsICgyNiBKdWx5IDIwMDQpCi0gTWFkZSAiY3VybCBbVVJMXSAtbyBuYW1lIzIiIHdvcmsgYXMgZXhwZWN0ZWQuIElmIHRoZXJlJ3Mgbm8gZ2xvYmJpbmcgZm9yIHRoZQogICMtbnVtYmVyLCBpdCB3aWxsIHNpbXBseSBiZSB1c2VkIGFzICMyIGluIHRoZSBmaWxlIG5hbWUuCgotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRlc3Rpbmcgd2l0aCB2YWxncmluZCAyLjEueCBhbmQgYWRkZWQgdHdvIG1pc3NpbmcKICBuZXdsaW5lcyBpbiB0aGUgY29va2llIGluZm9ybWF0aW9uYWxzLgoKRGFuaWVsICgyNCBKdWx5IDIwMDQpCi0gSSBmaXhlZCB0aGUgYXV0b2J1aWxkcyB3aXRoIGFyZXMsIHNpbmNlIHRoZXkgbm93IG5lZWQgdG8gaGF2ZSBidWlsZGNvbmYgcnVuCiAgaW4gdGhlIGFyZXMgZGlyIGJlZm9yZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW4uCgotIEFkZGVkIENhc2V5IE8nRG9ubmVsbCdzIGN1cmxfZWFzeV9yZXNldCgpIGZ1bmN0aW9uLiBJdCBoYXMgYSBwcm90byBpbgogIGN1cmwvY3VybC5oIGJ1dCB3ZSBoYXZlIG5vIG1hbiBwYWdlIHlldC4KCkRhbmllbCAoMjAgSnVseSAyMDA0KQotIEFkZGVkIGJ1aWxkY29uZiBhbmQgYnVpbGRjb25mLmJhdCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlcywgc2luY2UgdGhleSBhcmUKICBoYW5keSBmb3IgcmVidWlsZGluZyBjdXJsIHdoZW4gdXNpbmcgYSBkYWlseSBzbmFwc2hvdCAoYW5kIG5vdCBhIHB1cmUgQ1ZTCiAgY2hlY2tvdXQpLgoKRGFuaWVsICgxNiBKdWx5IDIwMDQpCi0gQXMgc3VnZ2VzdGVkIGJ5IFRvYnkgUGV0ZXJzb24sIGxpYmN1cmwgbm93IGlnbm9yZXMgQ29udGVudC1MZW5ndGggZGF0YSBpZiB0aGUKICBnaXZlbiBzaXplIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiBUZXN0IGNhc2UgMTc4IHZlcmlmaWVzIHRoaXMuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNCkKLSBH/G50ZXIgS25hdWYgaGFzIG1hZGUgdGhlIE5ldHdhcmUgYnVpbGRzIGRvIHdpdGhvdXQgdGhlIGNvbmZpZy1uZXR3YXJlLmgKICBmaWxlcywgc28gdGhleSBhcmUgbm93IHJlbW92ZWQgZnJvbSB0aGUgZGlzdCBwYWNrYWdlcy4KCi0gR/xudGVyIEtuYXVmIG1hZGUgY3VybCBhbmQgbGliY3VybCBidWlsZCB3aXRoIEJvcmxhbmQgYWdhaW4uCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgdGhlIGNvbW1vbiB0ZXN0IDUwNSBmYWlsdXJlcyBvbiB3aW5kb3dzLgoKRGFuaWVsICg2IEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIG91dCB3aHkgdGhlIHdpbmRvd3MgdGVzdHMgZmFpbGVkIG9uIGZpbGU6Ly8gInVwbG9hZHMiLgoKRGFuaWVsICgyIEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIHJlcG9ydGVkIGEgY3VybF9zaGFyZV9jbGVhbnVwKCkgY3Jhc2ggdGhhdCBvY2N1cnMgd2hlbiBubwogIGxvY2svdW5sb2NrIGNhbGxiYWNrcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGUgc2hhcmUgaXMgY2xlYW5lZCB1cC4KCkRhbmllbCAoMSBKdWx5IDIwMDQpCi0gV2hlbiB1c2luZyBjdXJsIC0tdHJhY2Ugb3IgLS10cmFjZS1hc2NpaSwgbm8gdHJhY2UgbWVzc2FnZXMgdGhhdCB3ZXJlIHNlbnQKICBieSBjdXJsX2Vhc3lfY2xlYW51cCgpIHdlcmUgaW5jbHVkZWQgaW4gdGhlIHRyYWNlIGZpbGUuIFRoaXMgbWFkZSB0aGUKICBtZXNzYWdlICJDbG9zaW5nIGNvbm5lY3Rpb24gIzAiIG5ldmVyIGFwcGVhciBpbiB0cmFjZSBkdW1wcy4KCkRhbmllbCAoMzAgSnVuZSAyMDA0KQotIE5pZWxzIHZhbiBUb25nZXJlbiBmb3VuZCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gVFJVRSBkb2Vzbid0IGRpc2FibGUKICBhIHByZXZpb3VzbHkgc2V0IFBPU1QgcmVxdWVzdCwgbWFraW5nIGEgdmVyeSBvZGQgcmVxdWVzdCBnZXQgc2VudCAodW5sZXNzCiAgeW91IGRpc2FibGVkIHRoZSBQT1NUKSBhIEhFQUQgcmVxdWVzdCB3aXRoIGEgUE9TVCByZXF1ZXN0LWJvZHkuIEkndmUgbm93CiAgbWFkZSBDVVJMT1BUX05PQk9EWSBlbmZvcmNlIGEgcHJvcGVyIEhFQUQuIEFkZGVkIHRlc3QgY2FzZSA1MTQgZm9yIHRoaXMuCgpEYW5pZWwgKDI5IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgbWFkZSB0aGUgdGVzdGN1cmwucGwgc2NyaXB0IGNhcGFibGUgb2YgdXNpbmcgYSBjdXN0b20gc2V0dXAKICBmaWxlIHRvIGVhc2llciBydW4gbXVsdGlwbGUgYXV0b2J1aWxkcyBvbiB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KCi0gR2lzbGUgZml4ZWQgdGhlIGRqZ3BwIGJ1aWxkIGFuZCBmaXhlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHNvbWUgb2YgdGhlCiAgcmVvcmdlZCBuYW1lIHJlc29sdmVkIGNvZGUuCgotIEZpeGVkIGNvZGUgdG8gYWxsb3cgY29ubmVjdHMgZG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIGF0dGVtcHQgdGhlCiAgbmV4dCBJUCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgSVBzIGFuZCBhCiAgY29ubmVjdCBhdHRlbXB0IGZhaWxzLgoKRGFuaWVsICgyNyBKdW5lIDIwMDQpCi0gQmFzZWQgb24gUm9iIFN0YW56ZWwncyBidWcgcmVwb3J0ICM5Nzk0ODAsIEkgd3JvdGUgYSBjb25maWd1cmUgY2hlY2sgdGhhdAogIGNoZWNrcyBpZiBwb2xsKCkgY2FuIGJlIHVzZWQgdG8gd2FpdCBvbiBOVUxMIGFzIG90aGVyd2lzZSBzZWxlY3QoKSBzaG91bGQgYmUKICB1c2VkIHRvIGRvIGl0LiBUaGUgc2VsZWN0KCkgdXNhZ2Ugd2FzIGFsc28gZml4ZWQgYWNjb3JkaW5nIHRvIGhpcyByZXBvcnQuCgogIE1hYyBPUyBYIDEwLjMgc2F5cyAicG9sbCgpIGZ1bmN0aW9uYWxpdHkgZm9yIE1hYyBPUyBYIGlzIGltcGxlbWVudGVkIHZpYSBhbgogIGVtdWxhdGlvbiBsYXllciBvbiB0b3Agb2Ygc2VsZWN0KCksIG5vdCBpbiB0aGUga2VybmVsIGRpcmVjdGx5LiBJdCBpcwogIHJlY29tbWVuZGVkIHRoYXQgcHJvZ3JhbXMgcnVubmluZyB1bmRlciBPUyBYIDEwLjMgcHJlZmVyIHNlbGVjdCgpIG92ZXIKICBwb2xsKCkuIENvbmZpZ3VyZSBzY3JpcHRzIHNob3VsZCBsb29rIGZvciB0aGUgX1BPTExfRU1VTF9IXyBkZWZpbmUgKGluc3RlYWQKICBvZiBfUE9MTF9IXyBvciBfU1lTX1BPTExfSF8pIGFuZCBhdm9pZCBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgcG9sbCBpcyBub3QKICBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLiIKCiAgWWVzLCB3ZSBjYW4gcHJvYmFibHkgdXNlIHNlbGVjdCgpIG9uIG1vc3QgcGxhdGZvcm1zIGJ1dCB0b2RheSBJIHByZWZlcmVkIHRvCiAgbGVhdmUgdGhlIGNvZGUgdW5hbHRlcmVkLgoKRGFuaWVsICgyNCBKdW5lIDIwMDQpCi0gVGhlIHN0YW5kYXJkIGN1cmxfdmVyc2lvbigpIHN0cmluZyBub3cgb25seSBpbmNsdWRlcyB2ZXJzaW9uIGluZm8gYWJvdXQKICBpbnZvbHZlZCBsaWJyYXJpZXMgYW5kIG5vdCBhYm91dCBwYXJ0aWN1bGFyIGZlYXR1cmVzLiBUaHVzIGl0IHdpbGwgbm8gbG9uZ2VyCiAgaW5jbHVkZSBpbmZvIGFib3V0IGlwdjYgbm9yIEdTUy4gVGhhdCBpbmZvIGlzIG9mIGNvdXJzZSBzdGlsbCBhdmFpbGFibGUgaW4KICB0aGUgZmVhdHVyZSBiaXRtYXNrIGN1cmxfdmVyc2lvbl9pbmZvKCkgb2ZmZXJzLgoKLSBSZXBsYWNlZCBhbGwgb2NjdXJhbmNlcyBvZiBzcHJpbnRmKCkgd2l0aCBzbnByaW50ZigpLiBUaGlzIGlzIG1vc3RseSBiZWNhdXNlCiAgaXQgaXMgIkEgR29vZCBUaGluZyIgcmF0aGVyIHRoYW4gYWN0dWFsbHkgZml4aW5nIGFueSBrbm93biBwcm9ibGVtLiBUaGlzCiAgd2lsbCBoZWxwIHByZXZlbnRpbmcgZnV0dXJlIHBvc3NpYmxlIG1pc3Rha2VzIHRvIGNhdXNlIGJ1ZmZlciBvdmVyZmxvd3MuCgotIE1ham9yIHJlb3JnYW5pemF0aW9uIGluIHRoZSBob3N0IHJlc29sdmUgY29kZSAoYWdhaW4pLiBUaGlzIHRpbWUsIEkndmUKICBtb2RpZmllZCB0aGUgY29kZSB0byBub3cgYWx3YXlzIHVzZSBhIGxpbmtlZCBsaXN0IG9mIEN1cmxfYWRkcmluZm8gc3RydWN0cwogIHRvIHJldHVybiByZXNvbHZlZCBpbmZvIGluLCBubyBtYXR0ZXIgd2hhdCByZXNvbHZlciBtZXRob2Qgb3Igc3VwcG9ydCB0aGF0CiAgaXMgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4gSXQgbWFrZXMgaXQgYSBsb3QgZWFzaWVyIHRvIHdyaXRlIGNvZGUgdGhhdAogIHVzZXMgb3IgZGVwZW5kcyBvbiByZXNvbHZlZCBkYXRhLgoKICBJbnRlcm5hbGx5LCB0aGlzIG1lYW5zIGFtb25nc3Qgb3RoZXIgdGhpbmdzIHRoYXQgd2UgY2FuIHN0b3AgZG9pbmcgdGhlIHdlaXJkCiAgImluY3JlYXNlIGJ1ZmZlciBzaXplIHVudGlsIGl0IHdvcmtzIiB0cmljayB3aGVuIHJlc29sdmluZyBob3N0cyBvbgogIGlwdjQtb25seSB3aXRoIGdldGhvc3RieW5hbWVfcigpLCB3ZSBzdXBwb3J0IHNvY2tzIGV2ZW4gb24gbGliY3VybHMgYnVpbHQKICB3aXRoIGlwdjYgZW5hYmxlZCAoYnV0IG9ubHkgdG8gc29ja3Mgc2VydmVycyB0aGF0IHJlc29sdmUgdG8gYW4gaXB2NAogIGFkZHJlc3MpIGFuZCB3ZSBubyBsb25nZXIgZGVlcC1jb3B5IG9yIHJlbG9jYXRlIGhvc3RlbnQgc3RydWN0cyAod2UgY3JlYXRlCiAgQ3VybF9hZGRyaW5mbyBjaGFpbnMgaW5zdGVhZCkuCgogIFRoZSBuZXcgImhvc3RlbnQgdG8gQ3VybF9hZGRyaW5mbyIgY29udmVydGVyIGZ1bmN0aW9uIGlzIG5hbWVkIEN1cmxfaGUyYWkoKQogIGFuZCBpcyBzbGlnaHRseSBuYWl2ZSBhbmQgc2ltcGxlLCB5ZXQgSSBiZWxpZXZlIGl0IGlzIGZ1bmN0aW9uYWwgZW5vdWdoIHRvCiAgd29yayBmb3IgbGliY3VybC4KCkRhbmllbCAoMjIgSnVuZSAyMDA0KQotIERhdmlkIENvaGVuIHBvaW50ZWQgb3V0IHRoYXQgUkZDMjEwOSBzYXlzIGNsaWVudHMgc2hvdWxkIGFsbG93IGNvb2tpZXMgdG8KICBjb250YWluIGxlYXN0IDQwOTYgYnl0ZXMgd2hpbGUgbGliY3VybCBvbmx5IGFsbG93ZWQgMjA0Ny4gSSByYWlzZWQgdGhlIGxpbWl0CiAgdG8gNDk5OSBub3cgYW5kIG1hZGUgdGhlIHVzZWQgYnVmZmVyIGdldCBtYWxsb2MoKWVkIGluc3RlYWQgb2Ygc2ltcGx5CiAgYWxsb2NhdGVkIG9uIHN0YWNrIGFzIGJlZm9yZS4gRXh0ZW5kZWQgdGVzdCBjYXNlIDQ2IHRvIGluY2x1ZGUgYSBjb29raWUgd2l0aAogIHZlcnkgaHVnZSBjb250ZW50IHRvIHZlcmlmeSB0aGUgZml4LgoKLSBH/G50ZXIgS25hdWYgZml4ZWQgZ2V0ZGF0ZS55IHRvIHJlbW92ZSBhIGZldyB3YXJuaW5ncy4gSSByZW1vdmVkIHRoZQogIGlmZGVmJ2VkIHRlc3Qgd2UgbmV2ZXIgZXZlciB1c2UgYW55d2F5LgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY2VydGlmaWNhdGUgd2lsZGNhcmQgY2hlY2tzIHRvIHN1cHBvcnQgYSAnKictbGV0dGVyCiAgYW55d2hlcmUgaW4gdGhlIHdpbGRjYXJkIHN0cmluZywgc3VwcG9ydCBtdWx0aXBsZSAnKictbGV0dGVycyBpbiB0aGUKICB3aWxkY2FyZCBhbmQgdG8gYWxsb3cgdGhlICcqJy1sZXR0ZXIgdG8gbWF0Y2ggYSBzdHJpbmcgdGhhdCBpbmNsdWRlcyBhIGRvdC4KCkRhbmllbCAoMjEgSnVuZSAyMDA0KQotIHRlc3RjdXJsLnNoIGlzIG5vdyByZW1vdmVkIGNvbXBsZXRlbHksIHRlc3RzL3Rlc3RjdXJsLnBsIGlzIHRoZSBzY3JpcHQgdG8KICB1c2Ugd2hlbiBhdXRvYnVpbGRpbmcgY3VybCEKCi0gS2pldGlsIEphY29ic2VuIGJyb3VnaHQgbXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQgeW91IGNhbm5vdCBwcm9wZXJseQogIGFib3J0IGFuIHVwbG9hZCB3aXRoIHRoZSByZWFkZnVuY3Rpb24gY2FsbGJhY2ssIHNpbmNlIHJldHVybmluZyAwIG9yIC0xIG9ubHkKICBzdG9wcyB0aGUgdXBsb2FkIGFuZCBsaWJjdXJsIHdpbGwgY29udGludWUgd2FpdGluZyBmb3IgZG93bmxvYWRlZCBkYXRhIGFuZAogIHRoZSBzZXJ2ZXIgb2Z0ZW4gd2FpdHMgZm9yIHRoZSByZXN0IG9mIHRoZSB1cGxvYWQgZGF0YSB0byBhcnJpdmUuCgogIFRodXMsIEkndmUgbm93IGFkZGVkIHRoZSBhYmlsaXR5IGZvciByZWFkIGNhbGxiYWNrcyB0byByZXR1cm4KICBDVVJMX1JFQURGVU5DX0FCT1JUIHRvIGFib3J0IGFuIHVwbG9hZCBmcm9tIGEgcmVhZCBjYWxsYmFjay4gVGhpcyB3aWxsIHN0b3AKICB0aGUgdHJhbnNmZXIgaW1tZWRpYXRlbHkgd2l0aCBhIENVUkxFX0FCT1JURURfQllfQ0FMTEJBQ0sgcmV0dXJuIGNvZGUuCgogIFRlc3QgY2FzZSA1MTMgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLiBJIGhhZCB0byBpbXByb3ZlIHRoZSB0ZXN0CiAgSFRUUCBzZXJ2ZXIgdG9vIHRvIGR1bXAgdGhlIHJlcXVlc3QgdG8gYSBmaWxlIGV2ZW4gd2hlbiB0aGUgY2xpZW50CiAgZGlzY29ubmVjdHMgcHJlbWF0dXJlbHkuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyBwcm92aWRlZCBhIHRlc3QgY2FzZSB3aXRoIGEgZmFpbGluZyBjdXJsIG9wZXJhdGlvbjogd2hlbiB3ZSBQT1NUCiAgdG8gYSBzaXRlIHdpdGggLS1kaWdlc3QgKG9yIHNpbWlsYXIpIHNldCwgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSAzMDIKICBMb2NhdGlvbjogdG8gdGhlICJhdXRocHJvYmUiIHJlcXVlc3QsIGl0IHdhcyBub3QgdHJlYXRlZCBjb3JyZWN0bHkuIFdlIHN0aWxsCiAgd2lsbCBiZWhhdmUgYmFkbHkgaWYgRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCBmb3IgdGhpcyBjYXNlLCBidXQgSSdtIG5vdAogIGluIHRoZSBtb29kIHRvIGRpdmUgaW50byB0aGlzIHJpZ2h0IG5vdyBhbmQgd2lsbCBsZWF2ZSBpdCBhcy1pcyBmb3Igbm93LgogIFZlcmlmaWVkIG15IGZpeCB3aXRoIHRlc3QgY2FzZSAxNzcuCgpEYW5pZWwgKDE4IEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgcHJvdmlkZXMgbW9yZSBkZXRhaWxzIGZyb20gdGhlIFNTTCBsYXllcnMgKGlmIHlvdQogIHVzZSBhbiBPcGVuU1NMIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBpdCkuIEl0IGFsc28gaW50cm9kdWNlcyB0d28gbmV3IHR5cGVzCiAgb2YgZGF0YSB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBkZWJ1ZyBjYWxsYmFjazogQ1VSTElORk9fU1NMX0RBVEFfSU4gYW5kCiAgQ1VSTElORk9fU1NMX0RBVEFfT1VULgoKLSBXaXRoIERhdmlkIEJ5cm9uJ3MgdGVzdCBzZXJ2ZXIgSSBjb3VsZCByZXBlYXQgaGlzIHByb2JsZW0gYW5kIG1ha2Ugc3VyZSB0aGF0CiAgUE9TVGluZyBvdmVyIEhUVFBTOi8vIHdpdGggTlRMTSB3b3JrcyBmaW5lIG5vdy4gVGhlcmUgd2FzIGEgZ2VuZXJhbCBwcm9ibGVtCiAgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIHdpdGggbm9uLUdFVCBvcGVyYXRpb25zIHdpdGggQ09OTkVDVC4KCkRhbmllbCAoMTYgSnVuZSAyMDA0KQotIE1vZGlmaWVkIHRvIGtlZXAgdGhlIHVwbG9hZCBieXRlIGNvdW50ZXIgaW4gYW4gY3VybF9vZmZfdCwgbm90IGFuIGludCBhcwogIGJlZm9yZS4gMzJiaXRzIGlzIG5vdCBlbm91Z2guIFRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGJ1ZyBKZWFuLUxvdWlzIExlbWFpcmUKICByZXBvcnRlZCB0aGF0IG1ha2VzIDJHQiBGVFAgdXBsb2FkcyB0byByZXBvcnQgZXJyb3IgKCJ1bmFsaWduZWQgZmlsZSBzaXplcyIpCiAgd2hlbiBjb21wbGV0ZWQuCgpEYW5pZWwgKDE1IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyByZXBvcnRlZCBhIHByb2JsZW0gdGhhdCBJIGZpeGVkOiBpZiB5b3UgZGlkIGEgUE9TVCB3aXRoCiAgQ1VSTEFVVEhfRElHRVNUIHNldCBidXQgdGhlIHNlcnZlciBkaWRuJ3QgcmVxdWlyZSBhbnkgYXV0aGVudGljYXRpb24sCiAgbGliY3VybCB3b3VsZCByZXBlYXRlZGx5IHNlbmQgSEVBRCBsb3RzIG9mIHRpbWVzIHVudGlsIGl0IGdpdmVzIHVwLiBUaGlzIHdhcwogIGFjdHVhbGx5IHRoZSBjYXNlIGZvciBhbGwgbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbnMuIEFkZGVkIHRlc3QgY2FzZSAxNzQsCiAgMTc1IGFuZCAxNzYgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IEp1bmUgMjAwNCkKLSBNdWx0aXBhcnQgZm9ybXBvc3RzIHVwbG9hZGluZyBmaWxlcyBubyBsb25nZXIgaW5zZXJ0cyB0aGUgZmlsZXMgdGhlbXNlbHZlcwogIGludG8gdGhlIGh1Z2UgcHJlYnVpbHQgY2h1bmsuIFRoaXMgZW5hYmxlcyBsaWJjdXJsIHRvIGZvcm1wb3N0IGZpbGVzIHRoYXQgaXMKICBsYXJnZXIgdGhhbiB0aGUgYW1vdW50IG9mIHN5c3RlbSBtZW1vcnkuIFdoZW4gdGhlIGZpbGUgZ2l2ZW4gaXMgcGFzc2VkIG9uCiAgc3RkaW4sIGxpYmN1cmwgc3RpbGwgdXNlcyB0aGUgb2xkIG1ldGhvZCBvZiByZWFkaW5nIHRoZSBmdWxsIGZpbGwgYmVmb3JlIHRoZQogIHVwbG9hZCB0YWtlcyBwbGFjZS4gVGhpcyBhcHByb2FjaCB3YXMgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gbm90IGFsdGVyIHRoZQogIGJlaGF2aW9yIGZvciBleGlzdGluZyBhcHBsaWNhdGlvbnMsIGFzIHdoZW4gdXNpbmcgc3RkaW4gbGliY3VybCBjYW4ndCBrbm93CiAgdGhlIHNpemUgb2YgdGhlIHVwbG9hZCBhbmQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBjYW4gb25seSBiZSB1c2VkIG9uCiAgSFRUUCAxLjEgc2VydmVycy4KCkRhbmllbCAoMTMgSnVuZSAyMDA0KQotIEdpc2xlIGZvdW5kIG91dCB0aGF0IHdlIGRpZCB3aWxkY2FyZCBjZXJ0IG5hbWUgY2hlY2tzIHdyb25nLCBzbyB0aGF0IHBhcnRzCiAgb2YgdGhlIGNoZWNrIHdyb25nbHkgd2FzIGNhc2Ugc2Vuc2l0aXZlLgoKRGFuaWVsICgxMSBKdW5lIDIwMDQpCi0gVGltIFNuZWRkb24gYnJvdWdodCBhIG1pbm9yIFZNUyBmaXggdG8gbWFrZSBjdXJsIGJ1aWxkIHByb3Blcmx5IG9uIGhpcyBWTVMKICBtYWNoaW5lLiBIZSBhbHNvIGhhZCBzb21lIGludGVyZXN0aW5nIGxpYmN1cmwgcGF0Y2hlcy4uLiB0aGV5IG1pZ2h0IGJlIGFibGUKICB0byBkbyBpbiBhIHNsaWdodGx5IG5pY2VyIHdheS4gRGlzY3Vzc2lvbnMgYXJlIGluIHByb2dyZXNzLgoKRGFuaWVsICgxMCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0gYnJvdWdodCBjb2RlIGNsZWFudXBzbSBiZXR0ZXIgdmVyYm9zZSBvdXRwdXQgYW5kIGJldHRlciBjb25uZWN0CiAgdGltZW91dCBoYW5kbGluZyB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0bwogIG11bHRpcGxlIElQIGFkZHJlc3Nlcy4KCi0gU3RldmVuIEJhenlsIGFuZCBTZXNodWJhYnUgUGFzYW0gcG9pbnRlZCBvdXQgYSBidWcgb24gd2luMzIgd2hlbiBmcmVlaW5nIHRoZQogIHBhdGggYWZ0ZXIgYSBmaWxlOi8vIHRyYW5zZmVyLgoKRGFuaWVsICg5IEp1bmUgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlICdjb25maWd1cmUgLS1kaXNhYmxlLWh0dHAnIHdvcmsgdG8gYnVpbGQgbGliY3VybAogIHdpdGhvdXQgSFRUUCBzdXBwb3J0LiBJIGFkZGVkIGEgbmV3IHJldHVybiBjb2RlIGZvciBjdXJsX2Zvcm1hZGQoKSBpbiBjYXNlCiAgbGliY3VybCBpcyBidWlsdCB3aXRoIEhUVFAgZGlzYWJsZTogQ1VSTF9GT1JNQUREX0RJU0FCTEVELgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCBhIG1pc3NpbmcgZmlsZSBpbiB0aGUgZ2VuZXJhdGVkCiAgY3VybGxpYi5kc3AgZmlsZSwgYW5kIG5vdyBwZW9wbGUgYnVpbGRpbmcgd2l0aCB0aGlzIHNob3VsZCBnZXQgYSBsaWJjdXJsLmxpYgogIGZpbGUgZ2VuZXJhdGVkIGFzIGl0IHVzZWQgdG8gZG8gYmVmb3JlIHdlIGdlbmVyYXRlZCB0aGlzIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDA0KQotIE1hcnR5IEt1aHJ0IGZpeGVkIGEgbWlub3IgYnVpbGQgcHJvYmxlbSBmb3IgVk1TLgoKRGFuaWVsICg3IEp1bmUgMjAwNCkKLSBSZXZlcnRlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZyb20gdGhlIDR0aCBzaW5jZSBpdCBvYnZpb3VzbHkgZGlkbid0IHdvcmsuCiAgUmVtYWRlIGl0IGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGF0IGhvcGVmdWxseSB3b3JrcyBiZXR0ZXIuCgpEYW5pZWwgKDQgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTmV0V2FyZSBhZ2Fpbi4KCi0gTWFkZSB0aGUgY29uZmlndXJlIGNoZWNrcyBmb3Igc3RyZXJyb3JfcigpIG5vdCBleGl0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2hlbiBidWlsdCBmb3IgY3Jvc3MtY29tcGlsaW5nLgoKRGFuaWVsICgzIEp1bmUgMjAwNCkKLSBDaHJpcyBHYXVrcm9nZXIgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSB0ZXN0JyBhdHRlbXB0cyB0byBydW4gdGhlIHRlc3RzIGV2ZW4KICBpZiBjdXJsIGlzIGJ1aWx0IGNyb3NzLWNvbXBpbGVkLiBJJ3ZlIG5vdyBtYWRlIGl0IG91dHB1dCBhIHNob3J0IG1lc3NhZ2UKICBpbnN0ZWFkLCBzYXlpbmcgaXQgaXNuJ3QgcG9zc2libGUgdG8gZG8uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IGJyb3VnaHQgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlciBzdXBwb3J0IHRvIGxpYmN1cmwuCiAgWW91IGNhbiBub3cgdXNlIGxpYmN1cmwgdG8gdHJhbnNmZXIgZmlsZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIHVzaW5nCiAgRlRQLiBUaGVyZSBhcmUgYSBidW5jaCBvZiBuZXcgb3B0aW9ucyB0byBjb250cm9sIHRoaXMgd2l0aDoKICAgQ1VSTE9QVF9TT1VSQ0VfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9VU0VSUFdECiAgIENVUkxPUFRfU09VUkNFX1BBVEgKICAgQ1VSTE9QVF9TT1VSQ0VfUE9SVAogICBDVVJMT1BUX1BBU1ZfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9QUkVRVU9URQogICBDVVJMT1BUX1NPVVJDRV9QT1NUUVVPVEUKCiAgKFRoZXkgc3RpbGwgcmVtYWluIHRvIGJlIGRvY3VtZW50ZWQgcHJvcGVybHkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuCiAgcGFnZS4pCgogIFdoZW4gdXNpbmcgdGhpcywgdGhlIG9yZGluYXJ5IENVUkxPUFRfVVJMIHNwZWNpZmllcyB0aGUgdGFyZ2V0IFVSTCwgYW5kIHlvdQogIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIHdpdGggdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zLiBmdHAzcmRwYXJ0eS5jIGlzIGEKICBuZXcgZXhhbXBsZSBzb3VyY2UgY29kZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcy4KCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgcHJveHkgdXNlciBuYW1lIGFuZAogIHBhc3N3b3JkIHdoZW4gZG9pbmcgcHJveHkgYXV0aGVudGljYXRpb24sIGl0IHByZXZpb3VzbHkgYWx3YXlzIHVzZWQgdGhlIGhvc3QKICB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIQoKRGFuaWVsICgyIEp1bmUgMjAwNCkKLSBDVVJMT1BUX1VQTE9BRCBhbmQgQ1VSTE9QVF9QVVQgbm93IGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGludGVybmFsbHksIHdoaWNoCiAgZml4ZXMgc29tZSBvbGQgY29uZnVzaW9ucyBvbiB3aGVuIHdoaWNoIG9mIHRoZXNlIHNob3VsZCBiZSB1c2VkIGFuZCB3aGF0IHRoZQogIGRpZmZlcmVuY2VzIGFyZS4KCi0gQXBwbGllZCBHaXNsZSdzIGZpeGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIHdpdGggbGNjLXdpbjMyCgpWZXJzaW9uIDcuMTIuMCAoMiBKdW5lIDIwMDQpCgpEYW5pZWwgKDEgSnVuZSAyMDA0KQotIEkgY2xhcmlmaWVkIHRoZSAtLWNyZWF0ZS1kaXJzIG9wdGlvbiBzb21ld2hhdCBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCi0gUmVuYXVkIER1aGF1dCBjb3JyZWN0ZWQgdGhlIGN1cmxfdW5lc2NhcGUgbWFuIHBhZ2UuCgotIERhdmlkIEJ5cm9uIG1vZGlmaWVkIG9uZSBvZiBNYXNzaW1pbGlhbm8gWmljY2FyZGkncyByZWNlbnQgTVNWQyBtYWtlZmlsZQogIGNoYW5nZXMgdG8gbm93IGFnYWluIHVzZSB0aGUgbW0gbGliIGJ5IGRlZmF1bHQuCgpEYW5pZWwgKDI2IE1heSAyMDA0KQotIE1vaHVuIEJpc3dhcyBhZGRlZCByZWxlYXNlLXpsaWIgYW5kIGRlYnVnLXpsaWIgdGFyZ2V0cyB0byB0aGUgTVNWQyBsaWJjdXJsCiAgTWFrZWZpbGUKCi0gRGF2aWQgQnlyb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBkb2luZyBDT05ORUNULAogIGxpa2Ugd2hlbiBhY2Nlc3NpbmcgSFRUUFMgc2l0ZXMgd2lodCBhIHByb3h5LiBUaGlzIHByb2JhYmx5IGJyb2tlIHdoZW4gSQogIHJld3JvdGUgdGhlIGF1dGggc3R1ZmYgcmVjZW50bHkuCgotIEkgYWRkZWQgZmlsZXVwbG9hZC5jIGluIHRoZSBleGFtcGxlcyBkaXJlY3RvcnksIHNob3dpbmcgaG93IGFuIHVwbG9hZCB0byBhCiAgZmlsZTovLyBVUkwgaXMgbWFkZS4KCkRhbmllbCAoMjUgTWF5IDIwMDQpCi0gTWFzc2ltaWxpYW5vIFppY2NhcmRpIHVwZGF0ZWQgdGhlIE1TVkMgbWFrZWZpbGVzLgoKRGFuaWVsICgyNCBNYXkgMjAwNCkKLSBsaWJjdXJsIG5vdyBzdXBwb3J0cyAidXBsb2FkaW5nIiB0byBmaWxlOi8vIFVSTHMuIFRlc3QgMjA0IGFuZCAyMDUgd2VyZQogIGFkZGVkIHRvIHZlcmlmeS4KCi0gU2ltb24gSm9zZWZzc29uIGFkZGVkIGEgaWRuX2ZyZWUoKSBmdW5jdGlvbiBpbiBsaWJpZG4gMC40LjUgYXMgYSByZWFjdGlvbiB0bwogIEdpc2xlJ3MgcHJldmlvdXMgbWFpbC4gV2Ugbm93IHVzZSB0aGlzIGZ1bmN0aW9uLCBhbmQgdGh1cyB3ZSByZXF1aXJlIGxpYmlkbgogIDAuNC41IG9yIGxhdGVyLiBObyBlYXJsaWVyIHZlcnNpb24gd2lsbCBkby4KCi0gUm9iZXJ0IEQuIFlvdW5nIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DT09LSUVGSUxFIGFuZCBDVVJMT1BUX0NPT0tJRSBjb3VsZAogIG5vdCBiZSB1c2VkIGJvdGggaW4gb25lIHJlcXVlc3QuIEZpeGVkIGl0IGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTcyIHRvIHZlcmlmeS4KCkRhbmllbCAoMjEgTWF5IDIwMDQpCi0gV2hpbGUgdGFsa2luZyB0byBob3N0IGEuYi5jLCBsaWJjdXJsIGRpZCB3cm9uZ2x5IG5vdCBhY2NlcHQgY29va2llcyB0aGF0CiAgd2VyZSBzZXQgdG8gdGhlIGRvbWFpbiAuYS5iLmMgKHRoYXQgaXMgd2l0aCBhIGRvdCBwcmVmaXgpLiBUaGlzIGlzIG5vdyBmaXhlZAogIGFuZCB0ZXN0IGNhc2UgMTcxIHZlcmlmaWVzIGl0LgoKRGFuaWVsICgyMCBNYXkgMjAwNCkKLSBKZXNzZSBOb2xsZXIgcmVwb3J0ZWQgdGhhdCB0aGUgdXBsb2FkIHNwZWVkIGluZm8gcmVwb3J0ZWQgYnkgbGliY3VybCB3YXMKICB3cm9uZy4gVGhlIHNhbWUgd2FzIHRydWUgZm9yIHRoZSBkb3dubG9hZCBzcGVlZC4gRml4ZWQgbm93LgoKRGFuaWVsICgxOSBNYXkgMjAwNCkKLSBEYXZpZCBCeXJvbiBhZGRlZCB0ZXN0IGNhc2UgMTcwIC0gdGhpcyB1c2VkIHRvIGNyYXNoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mCiAgY3VybC4KCkRhbmllbCAoMTcgTWF5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggdGhhdCBhZGRyZXNzZXMgdHdvIGZsYXdzIGluIHRoZSBwZWVyIGNlcnRpZmljYXRlCiAgbmFtZSB2ZXJpZmljYXRpb246CiAgbyB3aGVuIG11bHRpcGxlIGNvbW1vbiBuYW1lcyBhcmUgdXNlZCAoYXMgaW4gdGhlIGN1cmwgdGVzdHMpLCB0aGUgbGFzdCBuYW1lCiAgICBuZWVkcyB0byBiZSBzZWxlY3RlZC4KICBvIGFsbG93IGNvbXBhcmluZyB3aXRoIGVuY29kZWQgdmFsdWVzLCBhdCBsZWFzdCB3aXRoIEJNUCBhbmQgSVNPIGxhdGluMQogICAgZW5jb2RlZCBUNjFzdHJpbmdzLgoKLSBBbGwgMTkxIHRlc3QgY2FzZXMgcnVuIHRocm91Z2ggdGhlIHRvcnR1cmUgdGVzdCBPSyEgJ21ha2UgdGVzdC10b3J0dXJlJyBpcwogIG5vdyBhdmFpbGFibGUgaW4gdGhlIHJvb3QgbWFrZWZpbGUgKG9uIGNvbmZpZ3VyZS1iYXNlZCBlbnZpcm9ubWVudHMpLgoKRGFuaWVsICgxNCBNYXkgMjAwNCkKLSBXaXRoIGEgc2xpZ2h0bHkgbW9kaWZpZWQgZnRwc2VydmVyLnBsIEkndmUgbm93IHJ1biBhbG1vc3QgYWxsIHRlc3RzIHRocm91Z2gKICB3aXRoIHJ1bnRlc3RzLnBsIC10LiBUaGlzIGlzIGdvb2RuZXNzIQoKLSBTaW5jZSBJIGhhdmUgYmVlbiB1bmFibGUgdG8gY29udGFjdCB0aGUgQ1ZTIGFkbWlucyBmb3Igc2V2ZXJhbCBtb250aHMsIEkndmUKICBkZWNpZGVkIHRoYXQgdGhlIGN1cnJlbnQgQ1ZTIGhvc3Rpbmcgd2FzIG5vdCBnb29kIGVub3VnaC4gSSd2ZSBub3cgbW92ZWQgdGhlCiAgQ1ZTIHJlcG8gb25jZSBhZ2Fpbiwgc2VlIFJFQURNRSBmb3IgdXBkYXRlZCBjdnMgY2hlY2tvdXQgaW5zdHJ1Y3Rpb25zLgoKRGFuaWVsICgxMyBNYXkgMjAwNCkKLSBydW50ZXN0cy5wbCAtdCBub3cgcnVucyBmaW5lIGFsbCB0aGUgd2F5IHRvIHRlc3QgMTAwLiBJIGJlbGlldmUgdGVzdCBjYXNlCiAgMTAwIGZhaWxzIGJlY2F1c2Ugb2YgYW4gRlRQIHNlcnZlciBwcm9ibGVtLgoKRGFuaWVsICgxMiBNYXkgMjAwNCkKLSBHZW5lcmFsIGNsZWFudXBzIGFsbCBvdmVyIHRvIG1ha2UgbGliY3VybCBzdXJ2aXZlIGFuZCBkbyB3ZWxsIHdoZW4gYSBtZW1vcnkKICBmdW5jdGlvbiByZXR1cm5zIE5VTEwuIHJ1bnRlc3RzLnBsIC10IG5vdyB3b3JrcyBmaW5lIGZvciB0aGUgZmlyc3QgMjYgdGVzdAogIGNhc2VzLgoKRGFuaWVsICgxMSBNYXkgMjAwNCkKLSBTZXNodWJhYnUgUGFzYW0gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgY3VybF9nbG9iYWxfaW5pdF9tZW0oKSAtCiAgbGlrZSBub3JtYWwgY3VybF9nbG9iYWxfaW5pdCgpIGJ1dCBhbGxvd3MgdGhlIGFwcCB0byByZXBsYWNlIGFsbCBtZW1vcnkKICBmdW5jdGlvbnMgd2l0aCBpdHMgb3duIHNldC4gSSBtb2RpZmllZCBpdCBzbGlnaHRseS4KCi0gQmFzZWQgb24gTHVjYSBBbHRlYXMnIGNvbW1lbnRzLCBJIG1vZGlmaWVkIHRoZSBjdXJsbGliLmRzcCBnZW5lcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDEwIE1heSAyMDA0KQotIEdpc2xlIG1haWxlZCBTaW1vbiBKb3NlZnNzb24gKG9mIGxpYmlkbiBmYW1lKSBhYm91dCB0aGUgYmVuZWZpdHMgb2YgYQogIHNlcGFyYXRlIGZyZWUoKS1mdW5jdGlvbiBieSB0aGF0IGxpYiB0byBtYWtlIHN1cmUgdGhlIG1lbW9yeSBpcyBmcmVlZCBieSB0aGUKICBzYW1lIG1lbW9yeSBzdWJzeXN0ZW0gdGhhdCBhbGxvY2F0ZWQgaXQuIEhlIHJlc3BvbmRlZCBwb3NpdGl2ZWx5IGFuZCB0aGlzCiAgd2lsbCBsaWtlbHkgY2F1c2UgdXMgdG8gcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgbGliaWRuIGFzIHNvb24gYXMgU2ltb24KICByZWxlYXNlcyBvbmUgd2l0aCBzdWNoIGEgbGliaWRuX2ZyZWUoKSBmdW5jdGlvbi4KCi0gSmFtZXMgQnVyc2EgbWFkZSBydW50ZXN0cy5wbCdzIC10IG9wdGlvbiB3b3JrIGZvciBhbnkgZ2l2ZW4gdGVzdCBjYXNlLCBhbmQgSQogIGVkaXRlZCB0byBhbGxvdyAtZyB0b28uIE5vdCBldmVuIHRlc3QgY2FzZSAxIHdvcmtlZC4uLgoKLSBMdWNhIEFsdGVhIG1hZGUgdGhlIG5jPSBmaWVsZCBub3QgdXNlIHF1b3RlcyBpbiBvdXRnb2luZyBIVFRQIERpZ2VzdCBoZWFkZXJzLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwgdG8KICByZWNvZ25pemUgb3VyIG93biBydW5uaW5nIEhUVFAgc2VydmVyLgoKRGFuaWVsICg3IE1heSAyMDA0KQotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCB0byBjb25kZXIgbWFsbG9jKDApIGFyZWFzIE9LIHRvCiAgZnJlZSgpIGFuZCBoZSBtYWRlIHR3byBmYWlsZWQtcmVzb2x2ZSBlcnJvciBtZXNzYWdlcyB1c2UgdGhlIG5ldyBkaXNwbGF5LQogIG5hbWUgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWxseS11c2VkIG5hbWUuCgotIEdpc2xlIFZhbmVtIHRyaWVkIGN1cmwgd2l0aAogIHd3dy5ldGRvbWVuZW5hdm5rYW5tYWtzaW1hbHRpbm5laG9sZGVzZWtzdGl0cmVib2tzdGF2ZXJzbGlrc29tZGV0dGUuY29tCiAgd2hpY2ggY2F1c2VkIHByb2JsZW1zLCBhbmQgSSBmaXhlZCB0aGUgc2luZ2xlIHplcm8gYnl0ZSBidWZmZXIgb3ZlcndyaXRlCiAgdGhhdCBvY2N1cnJlZCAoZHVlIHRvIGEgc3R1cGlkIHByb3RvY29sIGJ1ZmZlciBzaXplIGFuZCBwYXJzZXIpLgoKLSBNYWRlIHRoZSBsaWIvY3VybGxpYi5kc3AgZmlsZSBnZXQgZ2VuZXJhdGVkIGF1dG9tYXRpY2x5IHdoZW4gYSBkaXN0cmlidXRpb24KICBwYWNrYWdlIGlzIG1hZGUsIHdpdGggdGhlIG1zdmNwcm9qLiogZmlsZXMgYXMgdGVtcGxhdGVzIGFuZCBhbGwKICB3aW4zMi1zb3VyY2VzIGFkZGVkLiBJIHRoaW5rIHRoaXMgY2FuIGJlIG1hZGUgdG8gd29yayBiZXR0ZXIgdGhhbiB0aGUgYWx3YXlzCiAgbGFnZ2luZy1iZWhpbmQgcHJldmlvdXMgYXBwcm9hY2guIEknbSBub3Qgc3VyZSB0aGlzIGJ1aWxkcyBhIHdvcmtpbmcgcHJvamVjdAogIGZpbGUgcmlnaHQgbm93IHRob3VnaCEKCkRhbmllbCAoNiBNYXkgMjAwNCkKLSBNaWNoYWVsIEJlbmVkaWN0IGJyb3VnaHQgYSBmaXggdGhhdCBmaWxscyBpbiB0aGUgZXJyb3JidWZmZXIgcHJvcGVybHkgd2hlbgogIGFyZXMgZmFpbHMgdG8gcmVzb2x2ZSBhIG5hbWUgZm9yIGEgY2FzZSBub3QgcHJldmlvdXNseSBkZWFsdCB3aXRoIGxpa2UgdGhpcy4KCkRhbmllbCAoNSBNYXkgMjAwNCkKLSBKb2UgSGFscGluIGZpeGVkIHRoZSBhbm5veWluZyB0eXBlY2FzdCB3YXJuaW5nIGluIGxpYi9sZGFwLmMKCi0gR2lzbGUgVmFuZW0gZml4ZXM6CiAgbyBtZW1kZWJ1ZyB0byBub3QgYWNjZXNzIE5VTEwgb24gc2V2ZXJhbCBwbGFjZXMKICBvIGxpYmN1cmwuZGVmOyBjdXJsX2Zvcm1wYXJzZSBpcyBnb25lLgogIG8gcHJvZ3Jlc3MuYzsgZml4ZWQgdGhlIHBlcmNlbnQgdmFsdWVzIGJlaW5nIHRydW5jZWQgdG8gMC4KICBvIGlmMmlwLio7IGNvbnN0aWZpZWQgdGhlICdpbnRlcmZhY2UnIGFyZ3VtZW50LgoKLSBUb3IgQXJudHNlbiByZXBvcnRlZCB0aGF0IG1hbnkgb2YgaGlzIGF1dG9idWlsZHMgZnJvemUgYW5kIEkgZm91bmQgYW5kIGZpeGVkCiAgYSBwcm9ibGVtIGludHJvZHVjZWQgd2l0aCB0aGUgSFRUUCBhdXRoIG92ZXJoYXVsIHRoYXQgY291bGQgbGVhZCB0byBhCiAgbmV2ZXItZW5kaW5nIGludGVybmFsIHJlcXVlc3QtbG9vcCBkdWUgdG8gdW4taW5pdGlhbGl6ZWQgdmFyaWFibGVzIQoKLSBSZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3Mgb24gdmFyaW91cyBjb21waWxlcnMvcGxhdGZvcm1zLgoKRGFuaWVsICg0IE1heSAyMDA0KQotIGN1cmxfZm9ybXBhcnNlKCkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5LiBJdCBoYXMgYmVlbiBtYXJrZWQgYW5kCiAgbWVudGlvbmVkIGFzIGRlcHJlY2F0ZWQgZm9yIHNldmVyYWwgeWVhcnMuCgpEYW5pZWwgKDMgTWF5IDIwMDQpCi0gUmV3cml0dGVuIEhUVFAgYXV0aGVudGljYXRpb24gY29kZS4gVGhlIHByZXZpb3VzIGNvZGUgY291bGQgbm90IHByb3Blcmx5CiAgZGVhbCB3aXRoIHRoZSBhZGRlZCB0ZXN0IGNhc2VzIDE2NywgMTY4IGFuZCAxNjkuIEkndmUgbm93IHJld3JpdHRlbiB0aGUgY29kZQogIHRvIGJldHRlciBzZXBhcmF0ZSBob3N0IGFuZCBwcm94eSBhdXRoZW50aWNhdGlvbiBhbmQgbm90IHJlLXVzZSB0aGUgc2FtZQogIHZhcmlhYmxlcyBhcyBtdWNoIGFzIGJlZm9yZSBhcyBpdCBwcm92ZWQgbm9uIHdvcmtpbmcgaW4gdGhlIG1vcmUgaW52b2x2ZWQKICBjYXNlcy4gQWxsIHRoZSBjdXJyZW50IHRlc3RzIHJ1biBPSyBub3csIGFuZCBzbyBkbyB0aGUgbmV3IG9uZXMuIFRoZSBjdXJsCiAgdG9vbCBnb3QgYSBuZXcgb3B0aW9uIG5hbWVkIC0tcHJveHktZGlnZXN0IHRvIGVuYWJsZSBIVFRQIERpZ2VzdAogIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3h5LiBJIGFsc28gbWFkZSB0aGUgbGlicmFyeSBzdXBwb3J0IGl0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBMREFQIGNvZGUgd29yayB3aXRoIHdsZGFwMzIuZGxsIGFzIHN1cHBsaWVkIHdpdGgKICBXaW4tOTgvTUUvMjAwMC9YUCwgc28gbm8gZXh0cmEgLmRsbHMgYXJlIHJlcXVpcmVkIHdoZW4gY3VybC9saWJjdXJsIGlzIHVzZWQKICBvbiB0aGVzZSBXaW5kb3dzIHZlcnNpb25zLgoKRGFuaWVsICgzMCBBcHJpbCAyMDA0KQotIHJ1bnRlc3RzLnBsIG5vdyBzY2FucyB0aGUgdmFsZ3JpbmQgbG9nIGZvciB2YWxncmluZC1kZXRlY3RlZCBtZW1vcnkgbGVha3MKICBhZnRlciBlYWNoIHRlc3QgY2FzZSBpZiB2YWxncmluZCB3YXMgZm91bmQgYW5kIHVzZWQuCgotIEkgbW9kaWZpZWQgdGhlIGFwcC1jb2RlIGluIGN1cmwgdG8gaW5jbHVkZSB0aGUgbmV3IGxpYi9jdXJseC5oIGFuZCBvbmx5CiAgYWNjZXNzIHRob3NlIGZ1bmN0aW9ucyB1c2luZyB0aGUgY3VybHhfLXByZWZpeCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIGZ1dHVyZQogIHJlbW92YWwgb2Ygc2V2ZXJhbCBjdXJsXy1mdW5jdGlvbnMgZnJvbSB0aGUgcHVibGljIGxpYmN1cmwgQVBJLgoKLSBJbnRyb2R1Y2VkIGxpYi9jdXJseC5oIGFzIGEgc2luZ2xlIGhlYWRlciB0byBwcm92aWRlIHRoZSBjdXJseF8tZnVuY3Rpb25zCiAgdG8gYXBwcy4KCi0gQWRkZWQgbm90aWNlcyBpbiB0aGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dldGVudiwgY3VybF9tcHJpbnRmLCBjdXJsX3N0cmVxdWFsCiAgYW5kIGN1cmxfc3RybmVxdWFsIHRoYXQgdGhleSBhcmUgc3ViamVjdCBmb3IgcmVtb3ZhbCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogIFNUT1AgVVNJTkcgVEhFU0UgRlVOQ1RJT05TLgoKLSBNaWhhaSBJb25lc2N1IG5vdGljZWQgaGUgY291bGRuJ3QgZG8gZm9ybXBvc3RzIHdpdGggd2hpdGVzcGFjZSBpbiB0aGUgZmlsZQogIG5hbWVzIGFuZCB5ZXMsIEkgYnJva2UgdGhhdCBvbiBBcHJpbCAyMy4gU2lnaC4gSSBmaXhlZCBpdCBub3cgYW5kIGFkZGVkCiAgdGVzdCBjYXNlIDE2NiB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGxlZnQgZnJvbSB0aGUgRGlnZXN0IHBhdGNoIG9mIHllc3RlcmRheS4KCkRhbmllbCAoMjkgQXByaWwgMjAwNCkKLSBNYWRlIElETiBkb21haW5zIHdvcmsgd2hlbiBzZW5kaW5nIHJlcXVzdHMgb3ZlciBIVFRQIHByb3h5IGFzIHdlbGwuIEFkZGVkCiAgdGVzdCBjYXNlIDE2NSB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBuZXcgaW50ZXJuYWwgaG9zdCBuYW1lIHNldHVwIHdoZW4gcmUtdXNpbmcgY29ubmVjdGlvbnMuCgotIEphbWVzIEJ1cnNhIGZvdW5kIG91dCB0aGF0IGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3aXRoIGFyZXMtYnVpbHQgbGliY3VybAogIGNyZWF0ZWQgYSBiYWQgaGFuZGxlIHRoYXQgd291bGQgY3Jhc2ggaW4gdGhlIGZpcnN0IG5hbWUgcmVzb2x2ZSBhdHRlbXB0LiBUaGlzCiAgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgNTEyIHdhcyBhZGRlZCB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcHJvdmlkZWQgYSBtYWpvciBIVFRQIERpZ2VzdCBjb2RlIGZpeCBhbmQgY2xlYW51cC4gV2Ugbm93IGZvbGxvdwogIHRoZSBEaWdlc3QgUkZDIGEgbG90IGJldHRlci4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgU1NMIGNvZGUgdXNlIEVSUl9lcnJvcl9zdHJpbmdfbigpIHdoZXJlIGFwcGxpY2FibGUuCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDQpCi0gSSByZW1vZGVsZWQgR2lzbGUncyBJRE4gY29kZSBzbGlnaHRseSBhbmQgbm93IHdlIGNvbnZlcnQgYm90aCB0aGUgaG9zdCBuYW1lCiAgYW5kIHByb3h5IG5hbWUgdG8gdGhlIEFDRSBlbmNvZGVkIHZlcnNpb24gdG8gdXNlIGludGVybmFsbHkgZm9yIHJlc29sdmVzIGFuZAogIGNvb2tpZXMgZXRjLiBUaGV5IGFyZSBub3cgdXNpbmcgb25lICdzdHJ1Y3QgaG9zdG5hbWUnIGVhY2ggdGhhdCBrZWVwIGJvdGgKICB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgdGhlIHBvc3NpYmx5IGVuY29kZWQgbmFtZS4gSUROIHJlc29sdmVzIHdvcmsgZm9yIG1lCiAgbm93IHVzaW5nIGlwdjYsIGlwdjQgYW5kIGFyZXMgcmVzb2x2aW5nLiBFdmVuIGNvb2tpZXMgb24gSUROIHNpdGVzIHNlZW0gdG8KICBkbyByaWdodC4gSSBnb3Qgc29tZSBmYWlsdXJlcyBhdCBmaXJzdCB3aGVuIENIQVJTRVQgd2Fzbid0IHNldCBhdCBhbGwgd2hpY2gKICBjb25mdXNlZCBsaWJpZG4gY29tcGxldGVseSBhbmQgaXQgZGVjaWRlZCBieSBlbmNvZGluZyBvZiBjaG9pY2Ugd2FzCiAgJ0FOU0lfWDMuNC0xOTY4Jy4uLgoKLSBtYWRlICdjb25maWd1cmUgLS13aXRob3V0LWxpYmlkbicgd29yawoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEZpeGVkIHRoZSBzcmMvaHVnZWhlbHAuYyBmaWxlIHRvIGluY2x1ZGUgInNldHVwLmgiIGluc3RlYWQgb2YgImNvbmZpZy5oIiB0bwogIG1ha2UgdGhlIHByb2JsZW1zIHdpdGggVVNFX01BTlVBTCBvbiB3aW5kb3dzIGdvIGF3YXkuCgotIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsIGNvdWxkIHN0aWxsIHdyb25nbHkgaW5jbHVkZSBzb21lIE9wZW5TU0wgaW5mbyBpbiB0aGUKICBNYWtlZmlsZXMgaWYgcGtnLWNvbmZpZyBoYWQgaW5mbyBhYm91dCBPcGVuU1NMLiBCdWcgIzk0MTc2MiByZXBvcnRlZCBieQogIE1hcnRpbi4KCi0gU2luY2Ugd2UgY2FuIG5vdyBidWlsZCBhbmQgdXNlIHF1aXRlIGEgbGFyZ2Ugc2V0IG9mIDNyZCBwYXJ0eSBsaWJyYXJpZXMsIEkKICBkZWNpZGVkIEkgd291bGQgbWFrZSBjb25maWd1cmUgcHJvZHVjZSBhIHN1bW1hcnkgYXQgdGhlIGVuZCBzaG93aW5nIHdoYXQKICBsaWJyYXJpZXMgaXQgdXNlcyBhbmQgaWYgbm90LCB3aGF0IG9wdGlvbiB0byB1c2UgdG8gbWFrZSBpdCB1c2UgdGhhdC4gSSBhbHNvCiAgYWRkZWQgc29tZSBvdGhlciByYW5kb20gaW5mbyB0aGF0IGlzIG5pY2UgaW4gYSAiY29uZmlndXJlIHN1bW1hcnkiIG91dHB1dC4KCi0gQXBwbGllZCBUb21teVRhbSdzIHBhdGNoIHRoYXQgbm93IG1ha2UgY3VybCB3b3JrIHdpdGggdGVsbmV0IGFuZCBzdGRpbgogIHByb3Blcmx5IG9uIFdpbmRvd3MuCgotIFRoZSBjaGFuZ2VzIGZvciB0b2RheSBiZWxvdyB3ZXJlIG1hZGUgYnkgbWUgYW5kIEdpc2xlIFZhbmVtLgoKICBUaGUgZmlsZSBwcmV2aW91c2x5IGtub3duIGFzIGhvc3RpcC5jIGhhcyBub3cgdW5kZXJnb25lIGEgaHVnZSBjbGVhbnVwIGFuZAogIHNwbGl0OgoKICBob3N0aXAuYyBleHBsYWluZWQKICA9PT09PT09PT09PT09PT09PT0KCiAgVGhlIG1haW4gQ09NUElMRS1USU1FIERFRklORVMgdG8ga2VlcCBpbiBtaW5kIHdoZW4gcmVhZGluZyB0aGUgaG9zdCouYwogIHNvdXJjZSBmaWxlIGFyZSB0aGVzZToKCiAgQ1VSTFJFU19JUFY2IC0gdGhpcyBob3N0IGhhcyBnZXRhZGRyaW5mbygpIGFuZCBmYW1pbHksIGFuZCB0aHVzIHdlIHVzZQogIHRoYXQuIFRoZSBob3N0IG1heSBub3QgYmUgYWJsZSB0byByZXNvbHZlIElQdjYsIGJ1dCB3ZSBkb24ndCByZWFsbHkgaGF2ZSB0bwogIHRha2UgdGhhdCBpbnRvIGFjY291bnQuIEhvc3RzIHRoYXQgYXJlbid0IElQdjYtZW5hYmxlZCBoYXZlIENVUkxSRVNfSVBWNAogIGRlZmluZWQuCgogIENVUkxSRVNfQVJFUyAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byB1c2UgYy1hcmVzIGZvciBhc3luY2hyb25vdXMKICBuYW1lIHJlc29sdmVzLiBJdCBjYW5ub3QgaGF2ZSBFTkFCTEVfSVBWNiBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUsIGFzCiAgYy1hcmVzIGhhcyBubyBpcHY2IHN1cHBvcnQuIFRoaXMgY2FuIGJlIFdpbmRvd3Mgb3IgKm5peC4KCiAgQ1VSTFJFU19USFJFQURFRCAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byBydW4gdW5kZXIgKG5hdGl2ZSkKICBXaW5kb3dzLCBhbmQgdGhlbiB0aGUgbmFtZSByZXNvbHZlIHdpbGwgYmUgZG9uZSBpbiBhIG5ldyB0aHJlYWQsIGFuZCB0aGUKICBzdXBwb3J0ZWQgYXN5bmNoIEFQSSB3aWxsIGJlIHRoZSBzYW1lIGFzIGZvciBhcmVzLWJ1aWxkcy4KCiAgSWYgYW55IG9mIHRoZSB0d28gcHJldmlvdXMgYXJlIGRlZmluZWQsIENVUkxSRVNfQVNZTkNIIGlzIGRlZmluZWQgdG9vLiBJZgogIGxpYmN1cmwgaXMgbm90IGJ1aWx0IHRvIHVzZSBhbiBhc3luY2hyb25vdXMgcmVzb2x2ZXIsIENVUkxSRVNfU1lOQ0ggaXMKICBkZWZpbmVkLgoKICBUaGUgaG9zdCouYyBzb3VyY2VzIGZpbGVzIGFyZSBzcGxpdCB1cCBsaWtlIHRoaXM6CgogIGhvc3RpcC5jICAgLSBtZXRob2QtaW5kZXBlbmRlbnQgcmVzb2x2ZXIgZnVuY3Rpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucwogIGhvc3Rhc3luLmMgLSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdHN5bi5jICAtIGZ1bmN0aW9ucyBmb3Igc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RhcmVzLmMgLSBmdW5jdGlvbnMgZm9yIGFyZXMtdXNpbmcgbmFtZSByZXNvbHZlcwogIGhvc3R0aHJlLmMgLSBmdW5jdGlvbnMgZm9yIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMKICBob3N0aXA0LmMgIC0gaXB2NC1zcGVjaWZpYyBmdW5jdGlvbnMKICBob3N0aXA2LmMgIC0gaXB2Ni1zcGVjaWZpYyBmdW5jdGlvbnMKCiAgVGhlIGhvc3RpcC5oIGlzIHRoZSBzaW5nbGUgdW5pdGVkIGhlYWRlciBmaWxlIGZvciBhbGwgdGhpcy4gSXQgZGVmaW5lcyB0aGUKICBDVVJMUkVTXyogZGVmaW5lcyBiYXNlZCBvbiB0aGUgY29uZmlnKi5oIGFuZCBzZXR1cC5oIGRlZmluZXMuCgotIEFkZGVkIGZ1bmN0aW9uIGhlYWRlciBjb21tZW50cyB0byBtYW55IGZ1bmN0aW9ucyBpbiBhbiBhdHRlbXB0IHRvIGJldHRlcgogIGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgdGhlbSBhbGwuCgotIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuIGlzIG5vdyBzdXBwb3J0ZWQuIEl0IG1ha2VzIHRoZSBjb25maWd1cmUgc2NyaXB0CiAgY2hlY2sgZm9yIGxpYmlkbiBsaWJzIGFuZCBpbmNsdWRlIGZpbGVzIGluIHRoZSBwcmVmaXggcGF0aCBnaXZlbi4gSWYgeW91CiAgc2F5IC0td2l0aC1saWJpZG49L3Vzci9sb2NhbCwgaXQgd2lsbCBjaGVjayBmb3IgdGhlIGxpYiBpbiAvdXNyL2xvY2FsL2xpYgogIGFuZCB0aGUgaW5jbHVkZXMgaW4gL3Vzci9sb2NhbC9pbmNsdWRlIGV0Yy4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBhIHN0cnVjdCBhZ2VkIENVUkxWRVJTSU9OX1RISVJEIGluY2x1ZGluZwogIGxpYmlkbiB2ZXJzaW9uIGluZm8uIFRoZSBzdHJpbmcgY3VybF92ZXJzaW9uKCkgcmV0dXJucyBhbHNvIGluY2x1ZGVzIGxpYmlkbgogIHZlcnNpb24gaW5mbywgaWYgYXZhaWxhYmxlLgoKVmVyc2lvbiA3LjExLjIgKDI2IEFwcmlsIDIwMDQpCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRXJ3aW4gQXV0aHJpZWQgcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCBkaWRuJ3QgZG8gcmlnaHQKICBpZiB5b3UgYWxyZWFkeSBoYWQgYSBzcmMvaHVnZWhlbHAuYyBzb3VyY2UgZmlsZSBwcmVzZW50ICh3aGljaCBtb3N0IHBlb3BsZQogIGRvIEkgZ3Vlc3MpLiBJdCBub3cgdXNlcyB0aGUgVVNFX01BTlVBTCBkZWZpbmUgcHJvcGVybHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBkb2luZyAoZmFpbGluZykgV2luZG93cwogIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMuCgotIEkgYWxzbyBhZGRlZCB0ZXN0IGNhc2UgMTYzIGp1c3QgdG8gbWFrZSBzdXJlIC1GICJ2YXI9PGZpbGUiIHdvcmtzIGZpbmUgYW5kCiAgY2FuIHBhc3Mgb24gY2hhcmFjdGVycyBzdWNoIGFzIG5ld2xpbmVzLCBjYXJyaWFnZS1yZXR1cm4gYW5kIHRhYnMuCgotIFdoZW4gd2UgYWRkZWQgdGVzdCBjYXNlIDE2MiB3aXRob3V0IGFkZGluZyB0aGUgbmVjZXNzYXJ5IHJlcXVpcmVtZW50IGZpZWxkCiAgaW4gdGhlIHRlc3QgbWV0YSBkYXRhIHdlIGNvdWxkIHNlZSB0aGF0IGN1cmwgZGlkbid0IGNvbXBsYWluIGlmIHlvdSB1c2VkCiAgLS1wcm94eS1udGxtIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgbGliY3VybCBpdCB1c2VzIGhhcyBubyBOVExNIHN1cHBvcnQhIEkKICBub3cgbWFkZSBpdCBjaGVjayB0aGlzIGZpcnN0LCBhbmQgaXQgbm93IGV4aXN0cyB3aXRoIGEgInRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMiIG1lc3NhZ2UgaWYgaXQgaGFwcGVucyBhZ2Fpbi4KCkRhbmllbCAoMjIgQXByaWwgMjAwNCkKLSBEYXZpZCBCeXJvbiBmb3VuZCBhbmQgZml4ZWQgYSBzbWFsbCBidWcgd2l0aCB0aGUgLS1mYWlsIGFuZCBhdXRoZW50aWNhdGlvbgogIHN0dWZmIGFkZGVkIGEgZmV3IHdlZWtzIGFnby4gIFR1cm5zIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZ5IC0tcHJveHktbnRsbSBhbmQKICBjb21tdW5pY2F0ZSB3aXRoIGEgcHJveHkgdGhhdCByZXF1aXJlcyBiYXNpYyBhdXRoZW50aWNhdGlvbiwgdGhlIHByb3h5CiAgcHJvcGVybHkgcmV0dXJucyBhIDQwNywgYnV0IHRoZSBmYWlsdXJlIGRldGVjdGlvbiBjb2RlIGRvZXNuJ3QgcmVhbGl6ZSBpdAogIHNob3VsZCBnaXZlIHVwLCBzbyBjdXJsIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMC4gVGVzdCBjYXNlIDE2MiBhZGRlZCB0bwogIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gYWxsb3cgbmV3bGluZXMgaW4gdGhlIGNvbnRlbnRzIHdoZW4gZG9pbmcgLUYgInZhcj1bY29udGVudHNdIgogIFJvYmVydCBNYXJsb3cgcmVwb3J0ZWQuCgotIElmIGEgdHJhbnNmZXIgaXMgZm91bmQgb3V0IHRvIGJlIG9ubHkgcGFydGlhbCwgbGliY3VybCB3aWxsIG5vdyB0cmVhdCB0aGF0CiAgYXMgYSBwcm9ibGVtIHNlcmlvdXMgZW5vdWdoIHRvIHNraXAgdGhlIGZpbmFsIFFVSVQgY29tbWFuZCBiZWZvcmUgY2xvc2luZwogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uIFRvIGF2b2lkIHRoZSByaXNrIHRoYXQgaXQgd2lsbCAiaGFuZyIgd2FpdGluZyBmb3IKICB0aGUgUVVJVCByZXNwb25zZS4gQWRkZWQgdGVzdCBjYXNlIDE2MSB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMjEgQXByaWwgMjAwNCkKLSBNb2RpZmllZCB0aGUgaGV1cmlzdGljcyBmb3IgZGVhbGluZyB3aXRoIHRoZSB0ZXN0IDE2MCBzY2VuYXJpby4gV2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkIGFuZCBub3RoaW5nIGF0IGFsbCBpcyByZWNlaXZlZCBmcm9tIGl0IChiZWNhdXNlIHRoZQogIHNlcnZlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24pLCB3ZSB3aWxsIG5vdyByZXRyeSB0aGUgcmVxdWVzdCBvbiBhIGZyZXNoIG5ldwogIGNvbm5lY3Rpb24uIFRoZSBwcmV2aW91cyBFQ09OTlJFU0VUIHN0dWZmIGZyb20gSmFudWFyeSAzMCB3YXMgcmVtb3ZlZCBhZ2FpbgogIGFzIGl0IGRpZG4ndCBkZXRlY3QgdGhlIHNpdHVhdGlvbiBnb29kIGVub3VnaC4KCkRhbmllbCAoMjAgQXByaWwgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMTYwIHRvIHZlcmlmeSB0aGF0IGN1cmwgd29ya3MgY29ycmVjdGx5IHdoZW4gaXQgZ2V0cyBhCiAgY29ubmVjdGlvbiByZXNldCB3aGVuIHRyeWluZyB0byByZS11c2UgYSBjb25uZWN0aW9uLiBJdCBzaG91bGQgdGhlbiBzaW1wbHkKICBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kIHRoZSByZXF1ZXN0LgoKRGFuaWVsICgxOSBBcHJpbCAyMDA0KQotIE5vIG1vcmUgNTEyIGJ5dGUgbGltaXQgZm9yIGhvc3QgbmFtZSAoaW5jbHVzaW5nIG5hbWUgKyBwYXNzd29yZCkgaW4gbGliY3VybC4KICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeSBmb3IgdGhlIHR5cGljYWwgKHNob3J0ZXIgVVJMKQogIGNhc2UuCgotIENsZWFuZWQgdXAgdGhlIHNvdXJjZXMgdG8gYmV0dGVyIHVzZSB0aGUgdGVybXMgJ2hvc3RuYW1lJyBhbmQgJ3BhdGgnCiAgaW50ZXJuYWxseSB3aGVuIHJlZmVycmluZyB0byB0aGF0IGRhdGEuIFRoZSBidWZmZXJzIHVzZWQgZm9yIGtlZXAgdGhhdCBpbmZvCiAgaXMgY2FsbGVkICduYW1lYnVmZmVyJyBhbmQgJ3BhdGhidWZmZXInLiBNdWNoIGVhc2llciB0byByZWFkIGFuZCB1bmRlcnN0YW5kCiAgdGhhbiB0aGUgcHJldmlvdXMgbWVzcy4KCkRhbmllbCAoMTUgQXByaWwgMjAwNCkKLSBNb2RpZmllZCBydW50ZXN0cy5wbCBhZ2FpbiB0byByZW1vdmUgYWxsIGxvZyBmaWxlcyBpbiB0aGUgbG9nLyBkaXIgYmV0d2VlbgogIGVhY2ggdGVzdCwgYW5kIHRoZW4gbWFkZSAtcCBkaXNwbGF5IGFsbCBub24temVybyBieXRlIGZpbGVzIGluIHRoZSBsb2cgZGlyLgogIEl0IHNob3VsZCBtYWtlIHRoYXQgZGF0YSBtb3JlIHVzYWJsZSBhbmQgY29udGFpbiBsZXNzIHJ1YmJpc2guCgotIGZ0cHNlcnZlci5wbCBub3cgcHJvZHVjZXMgbG9nIGZpbGVzIG1vcmUgc2ltaWxhciB0byBob3cgdGhlIHN3cyBvbmVzIGxvb2sKICBhbmQgdGhleSBub3cgYWxzbyBjb250YWlucyBhIGJpdCBtb3JlIGRldGFpbHMgdG8gaGVscCBkZWJ1Z2dpbmcgZnRwCiAgcHJvYmxlbXMuCgotIFJlbW92ZWQgdGhlIGZpeGVkIG1heGltdW0gYW1vdW50IG9mIGRpciBsZXZlbHMgdGhlIEZUUCBjb2RlIHN1cHBvcnRlZC4KICBQcmV2aW91c2x5IHdlIGhhZCBhIGZpeGVkIGFycmF5IGZvciAxMDAgbGV2ZWxzLCBub3cgd2Ugc2F2ZSBzcGFjZSBpbiBlYWNoCiAgaGFuZGxlIGJ5IGFsbG9jYXRpbmcgb25seSBmb3IgYSBmZXcgbGV2ZWwgYnkgZGVmYXVsdCBhbmQgdGhlbiBlbmxhcmdpbmcgdGhhdAogIGluIGNhc2Ugb2YgbmVlZCAod2l0aCBubyBtYXhpbXVtIGRlcHRoKS4gQWRqdXN0ZWQgdGVzdCBjYXNlIDE0MiB0byB2ZXJpZnkKICB0aGF0IDE1MCBkaXIgbGV2ZWxzIHdvcmsgZmluZS4gIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5CiAgZm9yIHRoZSB0eXBpY2FsIChub3QgdmVyeSBkZWVwKSBjYXNlLgoKRGFuaWVsICgxNCBBcHJpbCAyMDA0KQotIEFza2luZyBmb3IgQ1VSTF9JUFJFU09MVkVfVjYgd2hlbiBpcHY2IGFkZHJlc3NlcyBjYW4ndCBiZSByZXNvbHZlZCB3aWxsCiAgbm93IGNhdXNlIHRoZSByZXNvbHZlIGZ1bmN0aW9uIHRvIHJldHVybiBOVUxMIGltbWVkaWF0ZWx5LiBUaGlzIGZsYXcgd2FzCiAgcG9pbnRlZCBvdXQgYnkgR2lzbGUgVmFuZW0uCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCAtNC8tNiBhY3R1YWxseSBzZXQgdGhlIGRlc2lyZWQgb3B0aW9uIHRvIGxpYmN1cmwuCgotIHJ1bnRlc3RzLnBsIG5vdyBoYXMgYSBuZXcgb3B0aW9uICgtcCkgdGhhdCB3aWxsIGRpc3BsYXkgImludGVyZXN0aW5nIiBsb2cKICBmaWxlcyB0byBzdGRvdXQgaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4gVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUKICB1c2VkIGluIHRoZSAnZnVsbC10ZXN0JyBtYWtlIHRhcmdldCB0aGF0IGlzIHVzZWQgYnkgdGhlIGF1dG9idWlsZCB0ZXN0cywgYXMKICB3ZSB0aGVuIGdldCBhIG11Y2ggYmV0dGVyIGNoYW5jZSB0byB1bmRlcnN0YW5kIChyZW1vdGUpIHRlc3QgZmFpbHVyZXMgYmFzZWQKICBvbiBhdXRvYnVpbGQgbG9ncyBhbG9uZS4KCkRhbmllbCAoMTMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd29yayBhZ2FpbiBvbiBXaW5kb3dzIGV2ZW4gd2hlbiBidWlsdAogIHdpdGhvdXQgYXJlcy4gQmVmb3JlIHRoaXMsIHNlbGVjdCgpIHdvdWxkIHJldHVybiAtMSBkdXJpbmcgdGhlIG5hbWUgcmVzb2x2ZQogIHBoYXNlIHNpbmNlIGN1cmxfbXVsdGlfZmRzZXQoKSBkaWRuJ3QgcmV0dXJuIGFueSBmZF9zZXQgYXQgYWxsIHdoaWNoIHdhc24ndAogIGFwcHJlY2lhdGVkIQoKLSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgbm93IGR1cGxpY2F0ZXMgdGhlIHRjcF9ub2RlbGF5IGluZm8gYXMgd2VsbC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNCkKLSBBcHBsaWVkIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggZm9yIHRoZSBNU1ZDIGxpYmN1cmwgbWFrZWZpbGUgZm9yIGJ1aWxkcyB3aXRoCiAgemxpYi4KCkRhbmllbCAoOSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGltcHJvdmVkIHRoZSB0aW1lciByZXNvbHV0aW9uIGZvciBDVVJMSU5GT18qX1RJTUUsIGl0IGNhbiBub3cKICBiZSBkb3duIHRvIHVzZWMgaWYgdGhlIHN5c3RlbSBzeXBwb3J0cyBpdC4KCkRhbmllbCAoNyBBcHJpbCAyMDA0KQotIEEgcmVxdWVzdCB0aGF0IHNlbmRzICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgYW5kIGdldHMgbm90aGluZyBidXQgYSBzaW5nbGUKICAxMDAgcmVzcG9uc2UgYmFjayB3aWxsIG5vdyByZXR1cm4gYSBDVVJMRV9HT1RfTk9USElORy4gVGVzdCAxNTggdmVyaWZpZXMuCgotIFRoZSBzdHJ0b29mZnQoKSBtYWNybyBpcyBub3cgbmFtZWQgY3VybHhfc3RydG9vZmZ0KCkgdG8gdXNlIHRoZSBjdXJseF8qCiAgYXBwcm9hY2ggZnVsbHkuCgpEYW5pZWwgKDYgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeGVkIGJ1ZyAjOTI3OTc5IHJlcG9ydGVkIGJ5IE5hdGhhbiBPJ1N1bGxpdmFuLiBUaGUgcHJvYmxlbQogIG1hZGUgbGliY3VybCBvbiBXaW5kb3dzIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGluIGVhY2ggbmFtZSByZXNvbHZlCiAgd2hlbiBub3QgdXNlZCBhcyBhIERMTC4KCi0gTmV3IGF1dGhlbnRpY2F0aW9uIGNvZGUgYWRkZWQsIHBhcnRpY3VsYXJseSBub3RpY2FibGUgd2hlbiBkb2luZyBQT1NUIG9yIFBVVAogIHdpdGggRGlnZXN0IG9yIE5UTE0uIGxpYmN1cmwgd2lsbCBub3cgdXNlIEhFQUQgdG8gbmVnb3RpYXRlIHRoZQogIGF1dGhlbnRpY2F0aW9uIGFuZCB3aGVuIGRvbmUgcGVyZm9ybSB0aGUgcmVxdWVzdGVkIFBPU1QuIFByZXZpb3VzbHkgbGliY3VybAogIHNlbnQgUE9TVCBpbW1lZGlhdGVseSBhbmQgZXhwZWN0ZWQgdGhlIHNlcnZlciB0byByZXBseSBhIGZpbmFsIHN0YXR1cyBjb2RlCiAgd2l0aCBhbiBlcnJvciBhbmQgdGhlbiBsaWJjdXJsIHdvdWxkIG5vdCBzZW5kIHRoZSByZXF1ZXN0LWJvZHkgYnV0IGluc3RlYWQKICBzZW5kIHRoZW4gbmV4dCByZXF1ZXN0IGluIHRoZSBzZXF1ZW5jZS4KCiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgZHVlIHRvIElJUzYgYmFyZmluZyBvbiBsaWJjdXJsIHdoZW4gd2UgYXR0ZW1wdAogIHRvIFBPU1Qgd2l0aCBOVExNIGF1dGhlbnRpY2F0aW9uLiBUaGUgcmVhc29uIGZvciB0aGUgcHJvYmxlbXMgaXMgZm91bmQgaW4KICBSRkMyNjE2IHNlY3Rpb24gOC4yLjMgcmVnYXJkaW5nIGhvdyBzZXJ2ZXJzIHNob3VsZCBkZWFsIHdpdGggdGhlIDEwMAogIGNvbnRpbnVlIHJlcXVlc3QtaGVhZGVyOgoKICAgICAgICBJZiBpdCByZXNwb25kcyB3aXRoIGEgZmluYWwgc3RhdHVzIGNvZGUsIGl0IE1BWSBjbG9zZSB0aGUgdHJhbnNwb3J0CiAgICAgICAgY29ubmVjdGlvbiBvciBpdCBNQVkgY29udGludWUgdG8gcmVhZCBhbmQgZGlzY2FyZCB0aGUgcmVzdCBvZiB0aGUKICAgICAgICByZXF1ZXN0LgoKICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBJSVMgY2xlYXJseSBkaWQgY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW4gdGhpcyBjYXNlLAogIHdoaWxlIHRoaXMgbmV3ZXIgdmVyc2lvbiBkZWNpZGVkIGl0IHNob3VsZCAicmVhZCBhbmQgZGlzY2FyZCIuIFRoYXQgd291bGQndmUKICBmb3JjZWQgdXMgdG8gc2VuZCB0aGUgd2hvbGUgUE9TVCAob3IgUFVUKSBkYXRhIG9ubHkgdG8gaGF2ZSBpdCBkaXNjYXJkZWQgYW5kCiAgdGhlbiBiZSBmb3JjZWQgdG8gc2VuZCBpdCBhZ2Fpbi4gVG8gYXZvaWQgdGhhdCBodWdlIHBlbmFsaXR5LCB3ZSBzd2l0Y2ggdG8KICB1c2luZyBIRUFEIHVudGlsIHdlIGFyZSBhdXRoZW50aWNhdGVkIGFuZCB0aGVuIHNlbmQgdGhlIFBPU1QuCgogIFRoZSBvbmx5IGFjdHVhbCBkcmF3YmFjayBJIGNhbiB0aGluayBvZiAoZXhjZXB0IGZvciB0aGUgb2RkIHNpdGVzIHRoYXQgbWlnaHQKICB0cmVhdCBIRUFEIGRpZmZlcmVudGx5IHRoYW4gdGhleSB3b3VsZCB0cmVhdCBQT1NUL1BVVCB3aGVuIGdpdmVuIHRoZSBzYW1lCiAgVVJMKSBpcyB0aGF0IGlmIHlvdSBkbyBQT1NUIHdpdGggQ1VSTEFVVEhfQU5ZIHNldCBhbmQgdGhlIHNpdGUgcmVxdWlyZXMgTk8KICBhdXRoZW50aWNhdGlvbiwgbGliY3VybCB3aWxsIHN0aWxsIHVzZSBhIEhFQUQgaW4gYSBmaXJzdCByb3VuZCBhbmQgdGhlbiBkbyBhCiAgUE9TVC4KCiAgSWYgeW91IGRvIGEgSEVBRCBvciBhIEdFVCBvbiBhIHNpdGUgdXNpbmcgQ1VSTEFVVEhfQU5ZLCBsaWJjdXJsIHdpbGwgc2VuZAogIGFuIHVuLWF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBhdCBvbmNlLCB3aGljaCB0aGVuIGlzIHRoZSBvbmx5IHJlcXVlc3QgaWYgdGhlCiAgc2l0ZSByZXF1aXJlcyBubyBhdXRoLgoKICBBbGFuIFBpbnN0ZWluIGhlbHBlZCBtZSB3b3JrIG91dCB0aGUgcHJvdG9jb2wgZGV0YWlscyBieSBmaWd1cmluZyBvdXQgd2h5CiAgbGliY3VybCBmYWlsZWQgYW5kIHdoYXQgSUlTNiBleHBlY3RzLgoKLSBUaGUgLS1saW1pdC1yYXRlIGxvZ2ljIHdhcyBjb3JyZWN0ZWQgYW5kIG5vdyBpdCB3b3JrcyBhIGxvdCBiZXR0ZXIgZm9yCiAgaGlnaGVyIHNwZWVkcywgc3VjaCBhcyAnMTBtJyBvciBzaW1pbGFyLiBSZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM5MzAyNDkuCgotIEludHJvZHVjaW5nIGN1cmx4X3R2bm93KCkgYW5kIGN1cmx4X3R2ZGlmZigpIHVzaW5nIHRoZSBuZXcgY3VybHhfKiBmYXNoaW9uLgogICNpbmNsdWRlICJ0aW1ldmFsLmgiIGZyb20gdGhlIGxpYiBkaXIgdG8gZ2V0IHRoZSBwcm90b3MgZXRjLiAgTm90ZSB0aGF0CiAgdGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBsaWJjdXJsIEFQSS4gVGhlIGN1cmwgYXBwIHNpbXBseSB1c2VzIHRoZSBzYW1lCiAgc291cmNlIGZpbGVzIGFzIHRoZSBsaWJyYXJ5IGRvZXMgYW5kIHRoZXJlZm9yZSB0aGUgZmlsZSBuZWVkcyB0byBiZSBjb21waWxlZAogIGFuZCBsaW5rZWQgd2l0aCBjdXJsIHRvbywgbm90IGp1c3Qgd2hlbiBjcmVhdGluZyBsaWJjdXJsLgoKLSBsaWIvc3RyZXJyb3IuYyBubyBsb25nZXIgdXNlcyBzeXNfbmVyciBvbiBub24td2luZG93cyBwbGF0Zm9ybXMgc2luY2UgaXQKICBpc24ndCBwb3J0YWJsZSBlbm91Z2gKCkRhbmllbCAoMiBBcHJpbCAyMDA0KQotIEluIHRoZSBjdXJsX3N0cm5xdWFsLjMgbWFuIHBhZ2UsIHdlIG5vdyBwcmVwZW5kIHRoZSBtYW4zIGRpciB0byB0aGUgZmlsZQogIG5hbWUgdG8gd29yayBiZXR0ZXIuIEFzIHBvaW50ZWQgb3V0IGJ5IFJvYmluIEtheS4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgcHJvYmxlbSBJIHJlY2VudGx5IGFkZGVkIGluIHRoZSBwcm9ncmVzcyBtZXRlciBjb2RlIHRoYXQKICBicm9rZSBzdWJzZWNvbmQgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fVE9UQUxfVElNRS4gSGUgYWxzbyBwb2ludGVkIG91dCBhCiAgbWlzdGFrZSBpbiB0aGUgY29kZSB0aGF0IHByb2R1Y2VzIHRoZSBmaW5hbCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyCiAgdGhhdCB3b3VsZCBvZnRlbiBwcmV2ZW50IGl0IGZyb20gYWN0dWFsbHkgYmVpbmcgdXBkYXRlZCB0aGF0IGZpbmFsIHRpbWUuCgpEYW5pZWwgKDEgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIG1lbW9yeSBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiB3ZSB1c2UgYXJlcyBmb3IgbmFtZQogIHJlc29sdmVzIGFuZCBkZWNpZGVzIHRvIHRpbWUtb3V0IGJlZm9yZSBhcmVzIGRvZXMgaXQuIFRoaXMgZml4IHVzZXMgdGhlCiAgYnJhbmQgbmV3IGFyZXNfY2FuY2VsKCkgZnVuY3Rpb24gd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gYy1hcmVzIDEuMS4wLgoKICBXaGVuIHRvbGQgdG8gZW5hYmxlIGFyZXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHByZXNlbmNlIG9mCiAgdGhlIGFyZXNfY2FuY2VsIGZ1bmN0aW9uIHRvIGFsZXJ0IHVzZXJzIGlmIHRoZXkgYXR0ZW1wdCB0byB1c2UgYSB0b28gb2xkCiAgYy1hcmVzIGxpYnJhcnkuCgpEYW5pZWwgKDMxIE1hcmNoIDIwMDQpCi0gUm95IFNoYW4gZml4ZWQgYSBmbGF3IHRoYXQgcHJldmVudGVkIGFyZXMgbmFtZSByZXNvbHZlIHRpbWVvdXRzIHRvIG9jY3VyIQoKLSBEaXJrIE1hbnNrZSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNvbHZlcyBmYXIgdG9vCiAgZWFzeSB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIHVzZSAoYy0pYXJlcyBmb3IgbmFtZSByZXNvbHZpbmcuCgotIEZ1cnRoZXIgRGlnZXN0IGZpeGluZyBhbmQgYSBzdWNjZXNzZnVsIHRlc3QgY2FzZSAxNTMgbm93IG1ha2VzIG1lIGJlbGlldmUKICBNaXR6IFdhcmsncyBwcm9ibGVtcyBhcmUgZml4ZWQuCgotIEFuZHJlcyBHYXJjaWEgZmlndXJlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgNjMsIHdoaWxlIHdvcmtpbmcsIG9ubHkgcHJvdmVkIGEKICBmbGF3IGluIGxpYmN1cmwncyAnaHR0cF9wcm94eScgcGFyc2VyIHdoZW4gYSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGlzCiAgcHJvdmlkZWQuIFRoZSB1c2VyIG5hbWUgd2FzIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkgKGFuZCAnaHR0cCcgd2FzIGFsd2F5cwogIHVzZWQgYXMgdXNlciBuYW1lKS4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBvdXIgaW9jdGxzb2NrZXQoKSB1c2FnZS4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNCkKLSBKb2UgSGFscGluIGZhY2VkIHByb2JsZW1zIHdpdGggdGhlIGdldG5hbWVpbmZvKCkgYXJndW1lbnQgYWlfZmxhZ3MgYW5kIHRoZQogIHBhcnRpY3VsYXIgYml0IG5hbWVkICdOSV9XSVRIU0NPUEVJRCcgb24gU29sYXJpcyA5IGZvciBJbnRlbC4gIEkndmUgbm93CiAgd3JpdHRlbiBhIGNvbmZpZ3VyZSB0ZXN0IHRoYXQgY2hlY2tzIGZvciBhIHdvcmtpbmcgTklfV0lUSFNDT1BFSUQKICBpbXBsZW1lbmF0aW9uLiBObyBjb2RlIHVzZXMgdGhlIHJlc3VsdCBmcm9tIHRoaXMgdGVzdCB5ZXQsIGl0IGlzIHN0aWxsCiAgZXhwZXJpbWVudGFsLiBKYW1lcyBDYXJsc29uIHdyb3RlIGluIGNvbXAudW5peC5zb2xhcmlzOiAiSXQncyBhIGJ1ZwogICg1MDA2NjIzKSAtLSBpdCdzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZG4ndCBiZSBpbiB0aGUgaGVhZGVyIGZpbGUuIgoKLSBJIHByb3ZpZGVkIE1pdHogV2FyayB3aXRoIGEgZmlyc3QgcGF0Y2ggaW4gb3JkZXIgdG8gZml4IGxpYmN1cmwncyBwcm9ibGVtcwogIHRvIHJlLW5lZ290aWF0ZSBEaWdlc3QgYXV0aGVudGljYXRpb24gKHdoZW4gJ3N0YWxlPXRydWUnIGlzIGluY2x1ZGVkIGluIHRoZQogIHJlc3BvbnNlIGhlYWRlcikuCgotIFJveSBTaGFuIGRpc2NvdmVyZWQgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIGRpZG4ndCBwcm9wZXJseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzIHdoaWNoIGNvdWxkIG1ha2UgaGFuZGxlcyBnZXQgc3R1Y2sgaW4gdGhhdCBzdGF0ZSBhbmQgdGh1cyBuZXZlciBnZXQKICBjb21wbGV0ZWQuIEkndmUgcHJvZHVjZWQgYSBmaXJzdCB0ZXN0IHBhdGNoIHRoYXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGlzLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBwbGllZCB0byBtYWtlIENVUkxPUFRfRkFJTE9ORVJST1Igd29yayBuaWNlbHkKICBldmVuIHdpdGggYXV0aGVudGNhdGlvbnMgc3VjaCBhcyBOVExNIG9yIERpZ2VzdCBlbmFibGVkLiBUZXN0IGNhc2VzIDE1MCwgMTUxCiAgYW5kIDE1MiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIGZpbGVzIGZvciB0aGUgZGpncHAvTVMtRE9TIGJ1aWxkLgoKLSBBbmRy6XMgR2FyY+1hIGhlbHBlZCBtZSB3b3JrIG91dCBhIGZpeCBmb3IgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byBtYWtlCiAgdGhlIGZpbGU6Ly8gdGVzdHMgcnVuIGZpbmUgd2hlbiB0ZXN0ZWQgd2l0aCB0aGUgbWluZ3ctYnVpbHQgdmVyc2lvbiBvZiBjdXJsLgoKLSBGaXhlZCBhbiBpbmNsdWRlIGlzc3VlIHdpdGggbmV0aW5ldC90Y3AuaCBvbiBBSVgsIGJhc2VkIG9uIGlucHV0IGJ5IFRvci4KICBUaGlzIGFsc28gcmVxdWlyZWQgYSBtaW5vciBmaXggb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgotIFRoZSBwb3N0aXQyLmMgc291cmNlIGV4YW1wbGUgdXNlZCB0aGUgd3Jvbmcgc3RydWN0IG5hbWUgZm9yIHRoZSBwb3N0IGRhdGEuCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgaXB2NiBzdXBwb3J0IG9uIHdpbmRvd3MgYnkgbWFraW5nIHRoZSBjdXJsIGJ1aWxkIHRvIHVzZQogIHRoZSBjb3JyZWN0IGdldGFkZHJpbmZvKCkgZnVuY3Rpb24uCgpEYW5pZWwgKDI1IE1hcmNoIDIwMDQpCi0gSXQgdHVybmVkIG91dCB0aGF0IEFJWCwgZGVzcGl0ZSBoYXZpbmcgYSAidGhyZWFkLXNhZmUgbGliYyIsIGRvZXNuJ3Qgb2ZmZXIKICBhbGwgdHJhZGl0aW9uYWwgZnVuY3Rpb25zIHRocmVhZC1zYWZlLiBUaGlzIFVSTCBpcyBpbmZvcm1hdGl2ZSBvbiB0aGlzCiAgc3ViamVjdDoKCiAgICBodHRwOi8vcHVibGlibi5ib3VsZGVyLmlibS5jb20vZG9jX2xpbmsvZW5fVVMvYV9kb2NfbGliL2FpeHByZ2dkLyBcCiAgICBnZW5wcm9nYy90aHJlYWRfcXVpY2tfcmVmLmh0bQoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB3ZSBub3cgY2hlY2sgZm9yIHRocmVlICpfcigpIGZ1bmN0aW9ucyBvbiByZWNlbnQgQUlYCiAgdmVyc2lvbnMgYXMgd2VsbCB0aGF0IHRoZSBVUkwgbWVudGlvbnMgYXJlbid0IHRocmVhZC1zYWZlIGluIEFJWCA1LjEuCgotIHJlbmFtZWQgY3VybF9zdHJlcnJvci5bY2hdIHRvIHN0cmVycm9yLltjaF0KCi0gSm9lIEhhbHBpbiBhZGRlZCBDVVJMT1BUX1RDUF9OT0RFTEFZIGFuZCAtLXRjcC1ub2RlbGF5IHRvIG1ha2UgaXQgcG9zc2libGUKICBmb3IgdXNlcnMgdG8gZGlzYWJsZSB0aGUgTmFnbGUgYWxnb3J0aGltLXVzYWdlLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBzb21lIGludGVyZXN0aW5nIHN0cmVycm9yX3IoKSBrbm93bGVkZ2UuIGdsaWJjIGhhcyBpdHMKICBvd24gQVBJIHdoaWNoIGRpZmZlcnMgZnJvbSB0aGUgUE9TSVggb25lLiBEYW5pZWwgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBkZXRlY3QgdGhlIHZlcnNpb24gaW4gdXNlLCBhbmQgdGhlIGNvZGUgbm93IHVzZXMgdGhlIG5ldyBkZWZpbmVzCiAgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHNvbWUgYnVpbGQgZmxhd3Mgd2l0aCB0aGUgbmV3IGxpYi9jdXJsX3N0cmVycm9yLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXggdG8gcmVwbGFjZSB0aGUgYmFkIHVzZSBvZiBzdHJlcnJvcigpLiBUaGlzIGludHJvZHVjZXMKICBDdXJsX3N0cmVycm9yKCkgdGhhdCBhdHRlbXB0cyB0byBiZSB0aHJlYWQtc2FmZSBfYW5kXyB3b3JrcyBvbiBXaW5kb3dzIHRvbyEKCi0gVG9yIEFybnRzZW4gc3BlbGwtZml4ZWQgbG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcy4KCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0Y3VybC5wbCB3b3JrIHdpdGggb2xkZXIgcGVybCA1IHZlcnNpb25zLCBhbmQgRGFuaWVsCiAgbWFkZSBpdCBub3QgdXNlIGNoZGlyIC4uIHRvIGdvIGJhY2ssIGFzIHRoYXQgaXNuJ3QgdmVyeSBnb29kIHdoZW4geW91J3ZlCiAgc2V0dXAgYSB0ZXN0ZGlyIGNvbnRhaW5pbmcgc3ltbGlua3MuCgotIEFkZGVkIGEgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjMgTWFyY2ggMjAwNCkKLSBBZGRlZCBHcmVnIEhld2dpbGwncyB0ZXN0Y3VybC5wbCBzY3JpcHQgdG8gQ1ZTLiBXZSBoYXZlIG5vdCBtb3ZlZCBvdmVyIHRvCiAgdXNlIHRoaXMgc2NyaXB0IGZvciB0aGUgcmVhbCBkaXN0cmlidXRlZCB0ZXN0aW5nIGp1c3QgeWV0LCBidXQgaXQgaXMgb25seQogIGEgbWF0dGVyIG9mIHRpbWUuCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBtYWtlcyBjdXJsIHJlcG9ydCBhIGJldHRlciBlcnJvciBtZXNzYWdlCiAgaWYgLS1pbnRlcmZhY2UgZmFpbHMgb24gd2luZG93cy4KCi0gVGhlIHJlZ3VsYXIgcHJvZ3Jlc3MgbWV0ZXIgaXMgbm93IGZpeGVkIHRvIG5ldmVyIHdyYXAgZHVlIHRvIGxvbmcgbGluZXMuIEFsbAogIGZpZWxkcyBhcmUgbm93IHN0YXRpYyBzaXplZC4gSWYgdGhlIHRpbWUgaW4gdGhlIHRpbWUgZmllbGRzIGdldCBhIHRpbWUgdmFsdWUKICB0aGF0IHdvdWxkIHJlcHJlc2VudCBhIHRpbWUgdGhhdCBpcyAxMDAgaG91cnMgb3IgbW9yZSAoaWYgbm90LCBpdCByZW1haW5zCiAgdXNpbmcgYSBISDpNTTpTUyBkaXNwbGF5KSwgaXQgc3dpdGNoZXMgZmlyc3QgdG8gYSAiTk5OZCBOTmgiIGRpc3BsYXkgKGZvcgogIGRheXMgYW5kIGhvdXJzKSBhbmQgaWYgdGhhdCBpc24ndCBlbm91Z2ggaXQgc3dpdGNoZXMgdG8gYSAiTk5OZCIgZGlzcGxheSBpZgogIGl0IGlzIG1vcmUgdGhhbiA5OTkgZGF5cy4KCiAgU2V2ZXJhbCBvZiB0aGUgY2FsY3VsYXRpb25zIHdlcmUgYWxzbyBtb3ZlZCB0byBmaXhlZC1wb2ludCBtYXRoIGluc3RlYWQgb2YKICB1c2luZyBkb3VibGVzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDA0KQotIEdsZW4gTmFrYW11cmEgbm90aWNlZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBkaWRuJ3Qgd29yayBhcyBpdAogIHVzZWQgdG8gZG8gaWYgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IFRSVUUuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3lnd2luIHBhY2thZ2UgbWFrZWZpbGUgYW5kIFJFQURNRSB0byBhZGp1c3QgdG8KICBuZXcgY3lnd2luIHBhY2thZ2luZyBndWlkZWxpbmVzLgoKLSBFbmFibGVkICJOVCByZXNwb25zZXMiIGluIHRoZSBOVExNIGF1dGhlbnRpY2F0aW9uLiBEb2luZyB0aGlzIHNpbXBseSBtZWFucwogIHRoYXQgd2UgcHJvdmlkZSBhbiBleHRyYSBjaHVuayBvZiBkYXRhIGluIGVhY2ggInR5cGUtMyBtZXNzYWdlIi4gVGhlIG9ubHkKICByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdCBpdCBzZWVtcyB0aGF0IHVzaW5nIG9ubHkgdGhlICJMYW5tYW5hZ2VyIGhhc2giCiAgKGFzIHdlJ3ZlIGJlZW4gZG9pbmcgdW50aWwgbm93KSBkb2Vzbid0IHN1cHBvcnQgcGFzc3dvcmRzIGxvbmdlciB0aGFuIDE0CiAgY2hhcmFjdGVycyBhbmQgaXQgdHVybnMgb3V0IHRoZXJlIGFyZSB1c2VycyBvdXQgdGhlcmUgd2hvIHdhbnQgdG8gdXNlCiAgbGliY3VybCBhbmQgTlRMTSB3aXRoIHN1Y2ggcGFzc3dvcmRzISA7LSkgU2V2ZW4gTlRMTS1yZWxhdGVkIHRlc3QgY2FzZXMgd2VyZQogIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIE1lbnRpb25lZCBhcyBpc3N1ZSAyOSBpbiBUT0RPLVJFTEVBU0UsIGJ1ZyByZXBvcnQKICAjOTE1NjA5CgotIE1vdmVkIHRoZSBnZW5lcmF0ZWQgbGliY3VybCB2ZXJzaW9uIGluZm8gdG8gYSBuZXcgaGVhZGVyIGZpbGUsIG5hbWVkCiAgY3VybC9jdXJsdmVyLmguIE5vdyBpbnRlcmVzdGVkIHBhcnRpZXMgY2FuIGluY2x1ZGUgT05MWSB2ZXJzaW9uIGluZm8sIHNob3VsZAogIGFueW9uZSB3YW50IHRoYXQgKGFuZCBpdCBzZWVtcyBhdCBsZWFzdCBzb21lIHdpbmRvd3MgcmVzb3VyY2UgZmlsZXMgd291bGQpLgogIE1lbnRpb25lZCBhcyBpc3N1ZSAyNyBpbiBUT0RPLVJFTEVBU0UuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIHJvb3QgTWFrZWZpbGUgdG8gdXNlIHRhYnMgZm9yIHRoZSBuZXR3YXJlIHRhcmdldC4gR/xudGVyIEtuYXVmCiAgcG9pbnRlZCB0aGlzIG91dC4KCi0gTWFydHkgS3VocnQncyBWTVMgY2xlYW51cAoKLSBUaG9tYXMgU2Nod2luZ2UgbWFkZSBidWlsZGNvbmYgcmVjb2duaXplIEFDTE9DQUxfRkxBR1MgdG8gaW52b2tlIGFjbG9jYWwKICB3aXRoIHBhcnRpY3VsYXIgcHJlLWRldGVybWluZWQgb3B0aW9ucy4KClZlcnNpb24gNy4xMS4xICgxOSBNYXJjaCAyMDA0KQoKRGFuaWVsICgxOCBNYXJjaCAyMDA0KQotIFRvciBBcm50c2VuIGJyb3VnaHQgc29tZSBpbmZvIGFib3V0IFNHSSBJUklYOgoKICBJUklYIHN1cHBvcnRzIDMgZGlmZmVyZW50IGV4ZWN1dGFibGUvb2JqZWN0IGZvcm1hdHMsIC0zMiwgLW4zMiBhbmQgLTY0LgogIC1uMzIgaXMgZGVmYXVsdCAzMi1iaXQgZm9ybWF0LCAtMzIgaXMgdGhlICJvbGQiIDMyLWJpdCBmb3JtYXQsIGFuZCAtNjQgaXMKICB0aGUgNjQtYml0IGZvcm1hdC4gIExpYnJhcmllcyBmb3IgdGhlIGRpZmZlcmVudCBmb3JtYXRzIGFyZSBpbiBsaWIsIGxpYjMyCiAgYW5kIGxpYjY0IHJlc3BlY3RpdmVseS4KCiAgV2UndmUgbm93IGFkanVzdGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGFkYXB0IHRvIHRoaXMgd2hlbiBzY2FubmluZyBmb3IKICAzcmQgcGFydHkgbGlicywgc3VjaCBhcyBPcGVuU1NMLgoKRGFuaWVsICgxNyBNYXJjaCAyMDA0KQotIFdhdHogcG9pbnRlZCBvdXQgYSBmZXcgbWlzc2luZyBmaWxlcyBpbiB0aGUgTVNWQyBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUuCgotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMsIGNvZGUgYW5kIG1ha2VmaWxlcyB0byBidWlsZCBjdXJsIG9uIE5vdmVsbAogIE5ldFdhcmUuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDQpCi0gTG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcyB3ZXJlIHVwZGF0ZWQgdG8gY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG1hbgogIHBhZ2VzIHRoZSByZWNvZ25pemVkIHdheSBzbyB0aGF0IHRoZXkgYXBwZWFyIGFzIG5pY2UgaHlwZXJsaW5rcyBpbiB0aGUgSFRNTAogIHZlcnNpb25zLgoKLSBidWlsZGNvbmYgbm93IGNoZWNrcyB0aGUgbTQgdmVyc2lvbiB0b28sIHNpbmNlIGF1dG9jb25mIHJlcXVpcmVzIGEgR05VIG00CiAgdmVyc2lvbiB0byBidWlsZCBwcm9wZXIgY29uZmlndXJlIHNjcmlwdHMuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTE9QVF9QT1NURklFTERTSVpFX0xBUkdFLCB0aGUgbGFyZ2UgZmlsZSB2ZXJzaW9uIG9mCiAgQ1VSTE9QVF9QT1NURklFTERTSVpFIHRvIGFsbG93IFBPU1RzIGxhcmdlciB0aGFuIDJHQi4KCi0gRGF2aWQgQnlyb24gZml4ZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjYXNlL2NyYXNoLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA0KQotIEplZmYgTGF3c29uIGZpeGVkIHRoZSBTU0wgY29ubmVjdGlvbiB0byBkZWFsIHdpdGggcmVjZWl2ZWQgc2lnbmFscyBkdXJpbmcgdGhlCiAgY29ubmVjdC4KCi0gQ2hhbmdlZCB0aGUgT1Mgc3RyaW5nIGZvciB3aW4zMiB0byBiZWNvbWUgImkzODYtcGMtd2luMzIiLgoKRGFuaWVsICg5IE1hcmNoIDIwMDQpCi0gQ2hhbmdlZCB0aGUgaW50ZXJuYWxzIHRvIHVzZSBjdXJsX3NvY2tldF90IGZvciBzb2NrZXQgdmFyaWFibGUgdHlwZS4gVGhpcwogIHNob3VsZCBlbmFibGUgdXMgdG8gYnVpbGQgd2l0aCBsZXNzIHdhcm5pbmdzIG9uIFdpbmRvd3MsIHdoZXJlIFNPQ0tFVCBpcwogIHVzZWQgd2hpY2ggaXMgYW4gdW5zaWduZWQgaW50LCB3aGlsZSBtb3N0IG90aGVyIHBsYXRmb3JtcyB1c2UgYSBtZXJlIGludC4KCi0gTW9kaWZpZWQgbGliL2NvbmZpZy13aW4zMi5oIHRvIGJ1aWxkIGZpbmUgb24gTVNWQyBhZ2Fpbi4KClZlcnNpb24gNy4xMS4xLXByZTEgKDggTWFyY2ggMjAwNCkKCkRhbmllbCAoOCBNYXJjaCAyMDA0KQotIE1pbm9yIGZpeCB0byBtYWtlIGN1cmwgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBpcyBvbmx5IHNldCBpZiBjdXJsX29mZl90IGlzCiAgbGFyZ2VyIHRoYW4gNCBieXRlcy4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEltcHJvdmVkIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24sIHRoZSBzbyBjYWxsZWQgaXNzdWUgMTIuCgotIE1vZGlmaWVkIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGEgbG90IHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgY2hhbmdlcyBmb3IKICBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uIChsaWtlIHRlc3QgY2FzZSA4OCkuIEFkZGVkIEFuZHLpcwogIEdhcmPtYSdzIHdpbjMyLWNoYW5nZXMuIEltcHJvdmVkIHRoZSBsb2dnaW5nLgoKLSBGaXhlZCB0aGUgZmlsZTotcmVsYXRlZCBwcm9ncmVzcy9nZXRpbmZvIHN0dWZmIGEgYml0IG1vcmUuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJIGNvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246CiAgaGVhZGVyIG9yIHdoZW4gZG9pbmcgbXVsdGlwbGUtcmVxdWVzdCBhdXRoZW50aWNhdGlvbnMuIEEgc3Vic2VxdWVudCByZXF1ZXN0CiAgY291bGQgZXJyb25lb3VzbHkgcmUtdXNlIGEgcHJldmlvdXMgY29ubmVjdGlvbiB0aGF0IHdhcyBzZW50IHdpdGgKICBDb25uZWN0aW9uOiBjbG9zZS4gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkLgoKLSBBbmRy6XMgR2FyY+1hIHBhdGNoZWQgY3VybCB0byBwcmV2ZW50IHdhcm5pbmdzIHdoaWxlIGNvbXBpbGluZyB3aXRoIG1pbmd3LAogIG1haW5seSBiZWNhdXNlIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBoYXZlIGJvdGggV0lOMzIgYW5kIEhBVkVfQ09ORklHX0gKICBkZWZpbmVkLgoKLSBXaGVuIHRyYW5zZmVycmluZyBmaWxlcyBmcm9tIGEgZmlsZTogVVJMLCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIG90aGVyCiAgdHJhbnNmZXIgbWV0cmljcyB3ZXJlIG5vdCB1cGRhdGVkIHByb3Blcmx5LgoKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhICJ2ZXJzaW9uIHJlc291cmNlIiBmaWxlIHRvIHRoZSBjdXJsIGV4ZWN1dGFibGUgZm9yCiAgdGhlIHdpbmRvd3MgYnVpbGRzLgoKRGFuaWVsICgzIE1hcmNoIDIwMDQpCi0gRGF2aWQgQnlyb24ncyB3b3JrIG9uIG1ha2luZyBsaWJjdXJsIG9ubHkgcmVxdWlyZSB3aW5zb2NrIDEuMSBvbiBXaW5kb3dzCiAgbWFjaGluZXMuCgotIE1vcmUgdmFyaWFibGUgY2xlYW51cHMgYmFzZWQgb24gY29tcGlsZXIgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IFRvciBBcm50c2VuJ3MKICBhdXRvYnVpbGRzIHdpdGggTUlQU1Byby4KCi0gSm9lIEhhbHBpbiBoZWxwZWQgdXMgZml4IHNvbWUgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3Mgb24gRnJlZUJTRC4KCi0gQXBwbGllZCBUb20gQmF0ZXMnIHBhdGNoIHRvIGJ1aWxkIG9uIG5zci10YW5kZW0tbnNrLgoKLSBEYW4gRmFuZHJpY2ggY29ycmVjdGVkIHNvbWUgZmxhd3MgaW4gdGhlIGNvbmZpZ3VyZSBHU1MgZGV0ZWN0aW9uLgoKRGFuaWVsICgyIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIGxpYmN1cmwgY29kZSB0byB1c2UgRk9STUFUX09GRl9UIGZvciBwcmludGYoKSBmb3JtYXR0aW5nCiAgY3VybF9vZmZfdCB0eXBlcyBpbnRlcm5hbGx5LgoKRGFuaWVsICgxIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBhcyBhIGZlYXR1cmUtYml0IGluIHRoZSBjdXJsX3ZlcnNpb25faW5mbygpCiAgcmVzcG9uc2UsIHRoYXQgc2lnbmFscyBpZiB0aGlzIGxpYmN1cmwgc3VwcG9ydHMgPjJHQiBmaWxlcy4gY3VybCAtViBub3cKICBvdXRwdXRzICdMYXJnZWZpbGUnIGluIHRoZSBGZWF0dXJlczogZmllbGQgaWYgdGhpcyBpcyB0aGUgY2FzZS4gTW9zdCBzeXN0ZW1zCiAgYXJlIGxpa2VseSB0byBzdXBwb3J0IHRoaXMuCgotIFdlIG9mZmVyIGEgQ1VSTF9GT1JNQVRfT0ZGX1QgZGVmaW5lIGluIHRoZSBwdWJsaWMgaGVhZGVyLCB3aGljaCBjYW4gYmUgdXNlZAogIHRvIHByaW50ZigpIGN1cmxfb2ZmX3QgdmFyaWFibGVzLiBXZSBhbHNvIG1vZGlmaWVkIHRoZSBsaWJjdXJsIHNvdXJjZXMgdG8KICB1c2UgdGhpcyBkZWZpbmUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJU9kIGFwcHJvYWNoIChhbHRob3VnaCBJJ3ZlIGxlZnQgdGhlCiAgTy1mbGFnIGZ1bmN0aW9uYWwgaW4gdGhlIGNvZGUpLiBUaGlzIHNob3VsZCBhbHNvIHByZXZlbnQgY29tcGlsZXJzIHRvIHdhcm4KICBvbiB0aGUgaG9tZS1ncm93biBvcHRpb24uCgotIEZpeGVkIHRoZSByZXN1bWUtY2hlY2sgY29kZSB0byB0ZXN0IGZvciBhIHdvcmtpbmcgcmVzdW1lIGF0IHRoZSBlbmQgb2YgdGhlCiAgaGVhZGVycyBhbmQgbm90IGF0IHRoZSBmaXJzdCBib2R5LWJ5dGUuCgotIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUgaXMgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUuIFN0b3AgdXNpbmcgaXQuIElmCiAgeW91IG5lZWQgYSBnbG9iYWwgRE5TIGNhY2hlIGZvciB3aGF0ZXZlciByZWFzb24sIHVzZSB0aGUgc2hhcmUgaW50ZXJmYWNlIGFuZAogIHlvdSdsbCBnZXQgYSBnbG9iYWwgY2FjaGUgdGhhdCB3b3JrcyB0aGUgd2F5IGl0IHNob3VsZCB3b3JrLiBZb3UgY2FuIGV2ZW4KICBoYXZlIGFueSBudW1iZXIgb2YgZ2xvYmFsIGNhY2hlcywgYWxsIGF0IHlvdXIgY29tbWFuZC4gVGhpcyBpcyBub3cgYWxzbwogIG1lbnRpb25lZCBpbiB0aGUgZG9jcy4KCi0gTWFkZSB0aGUgKnByaW50ZiBjb2RlIHN1cHBvcnQgdGhlIHotZmxhZyB0byBlbmFibGUgc2l6ZV90IHByaW50ZigpIGluIGEKICBtYW5uZXIgc2ltaWxhciB0byBob3cgZ2xpYmMgYWxsb3dzIGl0LiBUbyBtYWtlIHByaW50ZmluZyBvZiB0aGlzIHdvcmsgb24KICBwbGF0Zm9ybXMgd2l0aCA2NGJpdCBzaXplX3QgYW5kIDMyYml0IGludHMuIElmIHRoZXJlIGV2ZW4gYXJlIGFueSEgOy0pCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IENVUkxPUFRfRlJFU0hfQ09OTkVDVCBhbmQKICBDVVJMQVVUSF9OVExNIChvciBDVVJMQVVUSF9BTlkgYW5kIGxpYmN1cmwgdGhlbiBwaWNrZWQgTlRMTSksIGxpYmN1cmwgd291bGQKICBsb29wIHdpdGhvdXQgc3VjY2VlZGluZyB0byBhdXRoZW50aWNhdGUgZHVlIHRvIHRoZSBuZXcgY29ubmVjdGlvbiB0aGF0IHdhcwogIG1hZGUgZm9yIGFsbCByb3VuZC10cmlwcyBpbiB0aGUgYXV0aGVudGljYXRpb24uIE5vdywgdGhlIEZSRVNIX0NPTk5FQ1QgaXMKICByZW1hZGUgdG8gb25seSBtYXR0ZXIgZm9yIHRoZSBmaXJzdCBjb25uZWN0aW9uIG1hZGUgd2l0aCBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgYW5kIGFsbCB0aGUgcmVzdCB0aGF0IG1pZ2h0IGZvbGxvdyBkdWUgdG8gRk9MTE9XTE9DQVRJT04gb3IgSFRUUAogIGF1dGhlbnRpY2F0aW9uIGFyZSBub3cgaWdub3JpbmcgdGhhdCBvcHRpb24uCgotIEFkanVzdGVkIHRoZSBRVUlUIGNvZGUgc2xpZ2h0bHkgc2luY2UgaXQgY291bGQgY29yZS1kdW1wLgoKLSBDb3JyZWN0ZWQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIHByb3ZpZGUgYSBjb3JyZWN0IHNpemUgdG8gdGhlCiAgJ3ZlcmlmaWVkc2VydmVyJyByZXF1ZXN0LgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA0KQotIEpvZSBIYWxwaW4gbWFkZSB0aGUgRlRQIGNvZGUgc2VuZCBRVUlUIG9uIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYmVmb3JlCiAgZGlzY29ubmVjdGluZyB0aGUgVENQIGNvbm5lY3Rpb24uIFRoaXMgaXMgd2hhdCBnb29kLWJlaGF2aW5nIGZ0cCBjbGllbnRzCiAgc2hvdWxkIGRvLgoKRGFuaWVsICgyNiBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIHVwZGF0ZWQgc2V2ZXJhbCBmaWxlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBNU1ZDIDYuIEhlCiAgYWxzbyBhZGRlZCB0aGUgJ2J1aWxkY29uZi5iYXQnIHRoYXQgd29ya3MgbGlrZSB0aGUgJ2J1aWxkY29uZiArIGNvbmZpZ3VyZScKICBjb21ibyBkb2VzIG9uIHVuaXhlcy4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbWVtZGVidWcgc3R1ZmYgc3VwcG9ydCBjYWxsb2MoKSBhcyB3ZWxsLgoKLSBUb3IgQXJudHNlbiBwb2ludGVkIG91dCB0aGF0IHRlc3RjdXJsLnNoIG5lZWRlZCB0byByZW1vdmUgdGhlIGdlbmVyYXRlZAogIGZpbGVzIGluIG9yZGVyIHRvIGhhdmUgdGhlbSByZS1nZW5lcmF0ZWQgaW4gZWFjaCBidWlsZC4KCi0gQW5keSBTZXJwYSBmb3VuZCBvdXQgdGhhdCB0aGUgc2hhcmUgaW50ZXJmYWNlIGRpZCBub3QgZW5qb3kgbGlmZSB3aGVuIG5vdAogIGhhdmluZyB0aGUgbG9jayBhbmQgdW5sb2NrIGNhbGxiYWNrcyBzZXQsIGV2ZW4gdGhvdWdoIGRvY3VtZW50ZWQgdG8gYmUKICBPSy4gSXQgc3RpbGwgaXMgT0ssIGFuZCBub3cgdGhlIGNvZGUgd29uJ3Qgc2VnZmF1bHQgYW55bW9yZSEKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdyZWcgSGV3Z2lsbCBJIG1vZGlmaWVkIGhvdyBsb25nIGxvbmcgaXMgdXNlZCBpbiB0aGUKICBtcHJpbnRmIGNvZGUsIGFzIHdlIGNhbiB1c2UgYSA2NGJpdCB0eXBlIHdpdGggTVNWQyB0aGF0IGlzIGEgbG9uZyBsb25nCiAgZXF1aXZhbGVudC4gVGhpcyBjb3JyZWN0cyBzb21lIHdlaXJkIGxhcmdlIGZpbGUgYmVoYXZpb3JzIG9uIHdpbmRvd3MuCgotIFRvciBBcm50c2VuIGhlbHBlZCBtZSB3b3JrIG91dCAtLWVuYWJsZS1kZWJ1ZyB0byB3b3JrIGJldHRlciB3aXRoIGRpZmZlcmVudAogIHZlcnNpb25zIG9mIHRoZSBnY2MgYW5kIGljYyBjb21waWxlcnMuCgotIEFkZGVkIENVUkxPUFRfU0hBUkUgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNCkKLSBBcHBsaWVkIHRoZSBmaW5hbCBwaWVjZXMgb2YgR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IGJyaW5ncyBhIHdvcmtpbmcgbmFtZQogIHJlc29sdmUgdGltZW91dCB0byB0aGUgd2luZG93cyB2ZXJzaW9ucyBvZiBjdXJsIQoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uJ3MgZml4IHRvIGFsbG93IHRoZSBzcGVlZC1saW1pdCBsb2dpYyB3b3JrIGV2ZW4gaWYgeW91IHNldAogIGxpbWl0LXJhdGUuIEl0IGRvZXMgd29yayBvbiB0aGUgZXhwZW5zZSBvZiB0aGUgcmF0ZSBsaW1pdGVyLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA0KQotIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyB3aXRoIGdjYyBub3cgYWxzbyB0cmllcyB0byBkZXRlY3QgdGhlIGljYyBjb21waWxlcgogICh3aGljaCBzb21laG93IGdldHMgdHJlYXRlZCBhcyBpZiBpdCBpcyBhIGdjYykgdG8gc3RvcCB1c2luZyBhbGwgdGhlIGdjYwogIG9wdGlvbnMgd2l0aCBpdCwgYW5kIHdlIGFsc28gcHJvdmlkZSAtaXN5c3RlbSBvcHRpb25zIGZvciBlYWNoIGV4dHJhIC1JCiAgb3B0aW9uIHRoZSBjb25maWd1cmUgc2NyaXB0IGhhcyBmaWd1cmVkIG91dCAoZm9yIE9wZW5TU0wsIGtlcmJlcm9zLCB6bGliLAogIEhlaW1kYWwgZXRjKS4gVGhpcyBvZiBjb3Vyc2UgdG8gcHJldmVudCB3YXJuaW5ncyBvbiBoZWFkZXJzIHdlIGRvbid0IGhhdmUKICBjb250cm9sIG9mLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA0KQotIERvdWcgUG9ydGVyIG1hZGUgbGliY3VybCB1c2UgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHRoZQogIGdldHB3dWlkIHJlc3VsdHMgd2hlbiBsb29raW5nIGZvciAubmV0cmMgZmlsZXMuCgotIElmICdjb25maWd1cmUgLS1lbmFibGUtZGVidWcnIGlzIHVzZWQgd2l0aCBnY2MsIGl0IG5vdyBjaGVja3Mgd2hpY2ggZ2NjCiAgdmVyc2lvbiBpdCBpcyBhbmQgdXNlcyBhcyBwaWNreSBjb21waWxlciBvcHRpb25zIGFzIHBvc3NpYmxlIGZvciB0aGUKICBwYXJ0aWN1bGFyIHZlcnNpb24uCgotIENvZGUgdGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgbWFkZSB0byB1c2UKICB0aGUgY3VybHhfIHByZWZpeC4gVGhlIGZpcnN0IGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBsaWtlIHRoaXMgaXMgdGhlCiAgY3VybHhfc3RydG9sbCgpIGZ1bmN0aW9uLiBUaGlzIGlzIG1hZGUgdG8gYWxsb3cgdGhlIGFwcCB0byB1c2UgZXhpc3RpbmcgY29kZSwKICBidXQgd2l0aG91dCBwb2xsdXRpbmcgdGhlIGxpYmN1cmwgQVBJLiBGdXJ0aGVyIGV4cGxhbmF0aW9ucyBwb3N0ZWQgaGVyZToKCiAgICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDQtMDIvMDIxNS5odG1sCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYnVpbGRjb25mIHRvIG5vdCB1c2UgIndoaWNoIiBhcyBBSVggYW5kIFRydTY0IGhhdmUgd2hhdCBoYXZlIGJlZW4KICByZWZlcnJlZCB0byBhcyAiaG9ycmlibHkgYnJva2VuICd3aGljaCcgcHJvZ3JhbXMiLgoKLSBNYWRlIHN1cmUgZG5zIGNhY2hlIHRpbWVvdXQgc2V0IHRvIC0xIHJlYWxseSBtZWFucyBjYWNoaW5nIGZvcmV2ZXIuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDQpCi0gTWFkZSBpdCBwb3NzaWJseSB0byBidWlsZCBjLWFyZXMgd2l0aCB0aGUgbGliY3VybCBtZW1kZWJ1ZyBzeXN0ZW0gdG8gYmV0dGVyCiAgdHJhY2sgbWVtb3J5LgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA0KQotIFdoZW4gdXNpbmcgYXJlcywgd2Ugbm93IGluaXRpYWxpemUgdGhlIGFyZXMgJ2NoYW5uZWwnIGluIGN1cmxfZWFzeV9pbml0KCkKICBhbmQgcmUtdXNlIHRoYXQgc2FtZSBoYW5kbGUgZHVyaW5nIHRoZSBlbnRpcmUgY3VybCBoYW5kbGUncyBsaWZlLXRpbWUuIEl0CiAgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCgotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIGRpc3BsYXlpbmcgdmVyYm9zZSBmb3IgaXB2Ni1lbmFibGVkIGxpYmN1cmxzIGFuZAogIHJlLXVzZWQgY29ubmVjdGlvbnMuIFByb2JsZW0gcmVwb3J0ZWQgYW5kIGZpeCB2ZXJpZmllZCBieSBHcmlnb3J5IEVudGluLgoKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgdmVyc2lvbi1jaGVjayBpbiB0aGUgU09DS1M1IGNvZGUuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYSBjYXNlIHdoZXJlIGEgaG9zdCBjYWNoZSBlbnRyeSB3YXMgbm90IGZsYWdnZWQgaW4tdXNlIHByb3Blcmx5IHdoZW4gYQogIGNhY2hlZCBlbnRyeSB3YXMgdXNlZC4KCi0gQW5kculzIEdhcmPtYSdzIHBhdGNoIHRoYXQgY2hlY2tzIGZvciB3aW5tbSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA0KQotIEJlbiBHcmVlYXIncyBTT19CSU5EVE9ERVZJQ0UgcGF0Y2ggZm9yIHRoZSBiaW5kaW5nIG9mIHRoZSBsb2NhbCBlbmQgdG8gYQogIHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlLgoKLSBHcmVnIEhld2dpbGwgZm91bmQgb3V0IHRoYXQgdGhlIHZhcmlhYmxlIGhvbGRpbmcgJ2NvbnRlbnRsZW5ndGgnIHdhc24ndCBiaWcKICBlbm91Z2ggdG8gaG9sZCBhIGxhcmdlIGZpbGUhCgotIFRvciBBcm50c2VuIGZpeGVkIGEgNjRiaXQtcmVsYXRlZCBwcm9ibGVtIGluIGRhdGUtcmVsYXRlZCBjb2RlIGluIHRoZSBmdHAKICBkZXBhcnRtZW50LCBhbmQgdGhlcmUgd2FzIGFub3RoZXIgcG90ZW50aWFsIHByb2JsZW0gaW4gdGhlIG5hbWUgcmVzb2x2ZSBjb2RlCiAgdG9vLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA0KQotIFJlbW92ZWQgYSBmZXcgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IHNldCBidXQgbmV2ZXIgdXNlZCwgYXMgc29tZSBjb21waWxlcnMKICB3YXJuIGFib3V0IHRoYXQgYW5kIHdlIGRvIG5vdCBsaWtlIGNvbXBpbGVyIHdhcm5pbmdzIQoKLSBSZW1vdmVkIHRoZSBuZWVkIGZvciBzeW1saW5rcyBpbiB0aGUgdGVzdHMvZGF0YSBkaXJlY3RvcnkgaWYgY3VybCBpcyBidWlsdAogIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZSAnbWFrZSB0ZXN0JyBpcyB1c2VkLiBUaGlzIHdhcyBkb25lCiAgYnkgcHJvdmlkaW5nIGEgInNvdXJjZSBkaXIgcGF0aCIgdG8gdGhlIHNjcmlwdHMvc2VydmVycy4KCi0gTm93LCBpZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBmaW5kIGFuIG5yb2ZmIHRvb2wgb3IgYW4gb3B0aW9uIHRvIG5yb2ZmCiAgdG8gdXNlIHRvIGNvbnZlcnQgbWFuIHBhZ2VzIHdpdGgsIGl0IHdpbGwgY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBidWlsdC1pbgogIG1hbnVhbC4KCi0gJ2NvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsJyBjb21wbGV0ZWx5IGRpc2FibGVzIHRoZSBidWlsdC1pbiBtYW51YWwgZnJvbQogIHRoZSBjdXJsIGNvbW1hbmQgdG9vbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBtaW5vciBzb3VyY2UgZWRpdCwgYW5kIG5vdwogIGhlIGhhcyBtYW5hZ2VkIHRvIGdldCBtc3lzL21pbmd3IHRvIHJ1biBjb25maWd1cmUgYW5kIHRoZW4gYnVpbGQhCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNCkKLSBUaGUgZGVmYXVsdCBIVFRQIEFjY2VwdDogaGVhZGVyIHdhcyBtb2RpZmllZCB0byB0aGUgbXVjaCBzaW1wbGVyCiAgIkFjY2VwdDogKi8qIi4KCi0gUCBSIFNjaGFmZm5lciB1cGRhdGVkIHRoZSBjdXJsLXNzbCBzcGVjIGZpbGUgZm9yIFJQTXMuCgotIERvbWluaWNrIE1lZ2xpbyBicm91Z2h0IGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNoYXJlIGludGVyZmFjZSdzIG1hbgogIHBhZ2VzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG1pc3NpbmcuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHdvcmstYXJvdW5kIGEgYnVnIGluIHRoZQogIEFJWDUgaW1wbGVtZW50YXRpb24gb2YgZ2V0YWRkcmluZm8oKS4gVGhpcyBtYWtlcyB0aGUgRlRQIFBPUlQgc3R1ZmYgd29yayBvbgogIGlwdjYtZW5hYmxlZCBBSVggYnVpbGRzLgoKLSBLZW4gUmFzdGF0dGVyIHByb3ZpZGVkIHBvcnRhYmlsaXR5IGZpeGVzIGZvciB0aGUgY3VybGd0ay5jIGV4YW1wbGUsIGFuZCBub3cKICBpdCBydW5zIG9uIHdpbmRvd3Mgd2l0aCBHVEsgYXMgd2VsbCEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIGdldGhvc3RieW5hbWUoKSBmaW5lIHdoZW4gcnVuCiAgd2l0aCBtaW5ndyBvbiB3aW5kb3dzLgoKLSBNb2RpZmllZCB0aGUgbGRhcCBjb2RlIHRvIHVzZSBwcm9wZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWxsIG92ZXIgKGluc3RlYWQgb2YKICBtaXhlZCBkYXRhIGFuZCBmdW5jdGlvbiBwb2ludGVycykgdG8gd29yay1hcm91bmQgdGhlIHBpY2t5IE1JUFNQcm8gY29tcGlsZXIKICB3YXJuaW5ncy4KCi0gQSBjdXN0b20gSG9zdDogaGVhZGVyIGlzIG9ubHkgY29uc2lkZXJlZCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgbWFkZSBieQogIGZvbGxvd2luZyBhIGxvY2F0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFRpbSBCYWtlci4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA0KQotIFRoZSBsaWJ6IHBhcnQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IG9ubHkgc2V0IHRoZSB0d28gbGliei1yZWxhdGVkCiAgZGVmaW5lIEhBVkVfWkxJQl9IIGFuZCBIQVZFX0xJQlogaWYgYm90aCB0aGUgbGliIGFuZCB0aGUgaGVhZGVyIGlzIGZvdW5kLgogIElmIG9uZSBpcyBtaXNzaW5nLCBub25lIG9mIHRoZSBkZWZpbmVzIGlzIHNldC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgTWluZ3cgbWFrZWZpbGVzLgoKLSBMZW4gS3JhdXNlIHJlcG9ydGVkIHRoYXQgY3VybCA3LjkuWCBjb3VsZCBkbyB1cGxvYWRpbmcgZnJvbSBzdGRpbiB3aXRob3V0CiAgZG9pbmcgY2h1bmtlZCBlbmNvZGluZywgd2hpY2ggY3VycmVudCBjdXJsIGNhbm5vdCBkbyBldmVuIGlmIHlvdSBkaXNhYmxlCiAgdGhlIHRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQgaGVhZGVyLiBOb3cgaXQgY2FuIGFnYWluLCBhbmQgdGVzdCBjYXNlIDk4CiAgdmVyaWZpZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIHdlaXJkIGdldGFkZHJpbmZvKCkgdXNhZ2UgaW4gdGhlIEZUUCBjb2RlLCBwcmV2ZW50aW5nCiAgdGhlIGlwdjYtY29kZSBmb3IgUE9SVCB3b3JrIG9uIEFJWCA1LjIuIFdlIG5vdyBhbHNvIHByb3ZpZGUgKGJldHRlcikgZXJyb3IKICBtZXNzYWdlcyB3aGVuIGJhaWxpbmcgb3V0IGluIHRoZSB0aGF0IGZ1bmN0aW9uLgoKLSBUb3IgQXJudHNlbiBub3cgcHJvdmlkZXMgQUlYIGFuZCBJUklYICh1c2luZyBnY2MsIHhsYyBhbmQgdGhlIE1JUFNQcm8KICBjb21waWxlcnMpIGF1dG9tYXRlZCBidWlsZCBsb2dzIChodHRwOi8vY3VybC5oYXh4LnNlL2F1dG8vKSBhbmQgd2UndmUgZml4ZWQKICBudW1lcm91cyBtaW5vciBxdWlya3MgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIGFwcGVhci4KCkRhbmllbCAoNCBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lsYWQsIHdlIG5vdyB1c2UgdGhlIGN1c3RvbSB0aW1lb3V0cyB3aGVuIHdhaXRpbmcgZm9yIGEKICBzZXJ2ZXIgdG8gY29ubmVjdCB3aGVuIHVzaW5nIEZUUCBQT1JULiBQcmV2aW91c2x5IHdlIGFsd2F5cyB3YWl0ZWQgMTAKICBzZWNvbmRzLCBubyBtb3JlIG5vIGxlc3MuIFdlIG5vdyBhbHNvIGNoYW5nZWQgdGhlIGRlZmF1bHQgKGlmIG5vIHRpbWVvdXQgaXMKICBzZXQpIHRvIHdhaXQgNjAgc2Vjb25kcyBmb3IgdGhlIGNvbm5lY3QgYmVmb3JlIHdlIGZhaWwuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNCkKLSBNb2RpZmllZCB0byBsaW5rIHdpdGggYy1hcmVzIGluc3RlYWQgb2YgYXJlcy4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA0KQotIEFkZGVkIGEgY29uZmlndXJlIHRlc3QgdG8gY2hlY2sgZm9yIHdoaWNoIG9wdGlvbiB0aGUgKGcpbnJvZmYgdG9vbCB3YW50cwogIHRvIGV4dHJhY3QgcGxhaW4gdGV4dCBmcm9tIHRoZSBtYW4gcGFnZXMuIFRvciBBcm50c2VuIHRvbGQgdXMgdGhlIEFJWAogIHZlcnNpb24gb2YgR05VIGducm9mZiBkb2Vzbid0IHN1cHBvcnQgLW1hbiEKCi0gQWRkZWQgYW4gdW5kZWYgb2YgYWNjZXB0IGluIG1lbWRlYnVnLmggdG8gbWFrZSBjdXJsIGJ1aWxkIHdpdGggLS1lbmFibGUtZGVidWcKICBvbiBBSVggNS4yIHdoaWNoIHNlZW1zIHRvIGhhdmUgYWNjZXB0IGRlZmluZWQuIFJlcG9ydGVkIGJ5IFRvciBBcm50c2VuLgoKLSBjdXJsX3ZlcnNpb24oKSBub3cgaW5jbHVkZXMgYy1hcmVzIHZlcnNpb24gaW5mbywgYW5kIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93CiAgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHZlcnNpb24gU0VDT05EIHRoYXQgYWxzbyBpbmNsdWRlcyB0aGF0IGluZm8uCgotIFdlIGFyZSBub3cgb2ZmaWNpYWxseSB1c2luZyBjLWFyZXMgZm9yIGFzeW5jaCBuYW1lIHJlc29sdmVzLiBjLWFyZXMgaXMgdGhlCiAgbmV3IGxpYnJhcnksIGJhc2VkIG9uIHRoZSBleGlzdGluZyBhcmVzIGJ1dCB3aXRoIGFuIGV4dGVuZGVkIGFuZCBzbGlnaHRseQogIG1vZGlmaWVkIEFQSS4KCi0gRGlyayBpbXByb3ZlZCB0aGUgYXJlcyB0aW1lb3V0IGNvZGUsIGFuZCBub3cgd2UgYWxzbyBpbmNsdWRlIHRoZSBhcmVzIGVycm9yCiAgc3RyaW5nIHdoZW4gd2UgZmFpbCB0byByZXNvbHZlIGEgbmFtZS4KCi0gQW5vdGhlciB0d2VhayB0byBtYWtlIHRlc3QgY2FzZSA5MSBydW4gZmluZS4gTm93IHdlIGhhdmUgYW5vdGhlciBiaXQgb24gYQogIGNvbm5lY3Rpb24gdGhhdCBpcyBzZXQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBtYXJrZWQgZm9yICdyZXRyeScuIFRoYXQKICBtYWtlcyB0aGUgY29ubmVjdGlvbiBnZXQgY2xvc2VkIGFuZCByZS1vcGVuZWQgYW5kIHRoZSBIVFRQLWRvbmUgY29kZSBtdXN0CiAgbm90IGNvbXBsYWluIG9uIHRoZSBmYWN0IHRoYXQgbm8gZGF0YSB3YXMgcmVjZWl2ZWQuCgotIEJhc2VkIG9uIERpcmsgTWFuc2tlJ3MgcGF0Y2gsIEkgbW9kaWZpZWQgdGhlIG5hbWUgcmVzb2x2aW5nIHdpdGggYXJlcyB0bwogIGZlYXR1cmUgYSB0aW1lb3V0IGZvciByZWFsbHkgc2xvdyBsb29rdXBzLiBJdCBub3cgZGVmYXVsdHMgdG8gMzAwIHNlY29uZHMsCiAgYnV0IGlzIG5vdyBhZGp1c3RlZCB0byB0aGUgQ09OTkVDVFRJTUVPVVQvVElNT1VFIHRpbWVvdXRzIGlmIG9uZSBvZiB0aGVtCiAgaXMgc2V0LgoKLSBGaXhlZCB0aGUgaW5jbHVzaW9uIG9mIGNhLWJ1bmRsZS5oIHRvIHJlYWxseSB1c2UgdGhlIG9uZSBpbiB0aGUgYnVpbGQgZGlyCiAgYmVmb3JlIHRoZSBvbmUgaW4gdGhlIHNvdXJjZSBkaXIuIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQuCgotIEFkZGVkIHRlc3QgY2FzZSA5NywgYSBzaW1wbGUgUE9TVCB3aXRoIGEgY3VzdG9tIENvbnRlbnQtVHlwZSBoZWFkZXIKICByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvbmUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNCkKLSBBZGRlZCBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gZml4IHRoZSB0ZXN0IDkxIGZhaWx1cmUuIEFzIGhhcyBiZWVuIGZpZ3VyZWQgb3V0CiAgYnkgUGF0cmljayBTbWl0aCwgdGhlIGVycm9yIGhhcHBlbnMgYmVjYXVzZSB3ZSByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgdGhlCiAgc2VydmVyIGlzIGp1c3QgYWJvdXQgdG8gY2xvc2UgYW5kIHdlIGV2ZW4gbWFuYWdlIHRvIHNlbmQgYXdheSB0aGUgcmVxdWVzdAogIHdpdGhvdXQgc2VlaW5nIGFuIGVycm9yLiBPbiB0aGUgZmlyc3QgcmVhZCBhdHRlbXB0IHdlIGdldCBhIEVDT05OUkVTRVQuCiAgU3RhcnRpbmcgbm93LCB3ZSBhdHRlbXB0IHRvIGRldGVjdCB0aGlzIGFuZCBpZiBzbywgd2UgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYQogIGZyZXNoIGNvbm5lY3Rpb24uCgotIEkgYWRkZWQgdGVzdCBjYXNlIDUxMCB3aGljaCBpcyBhIGN1c3RvbSBwcm9ncmFtIHRoYXQgZG9lcyBhIFBPU1QgdXNpbmcgYQogIHJlYWQgY2FsbGJhY2ssIHdpdGggY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4KCi0gQWRqdXN0ZWQgb25lIG9mIHRoZSBNUEUvaVggY2hhbmdlcyBhcyBpdCBtYWRlIHRlc3QgY2FzZSA1MDQgZmFpbCBhbGwgb3Zlci4KCi0gQWRkZWQgLS1zb2NrcyBhcyBhIHJlY29nbml6ZWQgb3B0aW9uLiBJdCB3b3JrcyBqdXN0IGxpa2UgLS1wcm94eSBidXQgc2V0cyBhCiAgU09DS1M1IHByb3h5IHRvIHVzZS4gU09DS1M1IHN1cHBvcnQgaGFzIGJlZW4gYXZhaWxhYmxlIGluIGxpYmN1cmwgZm9yIGEKICB3aGlsZSwganVzdCBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cmwgdG9vbC4gVGhpcyBkb2VzIG5vdCBjdXJyZW50bHkgd29yayBmb3IKICBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNCkKLSBTdGFkbGVyIFN0ZXBoYW4gcG9pbnRlZCBvdXQgdGhhdCBzcmMvaHVnZWhlbHAuYyBpbmNsdWRlZCBjb25maWcuaCB3aXRob3V0CiAgY2hlY2tpbmcgdGhlIGRlZmluZSBpZiBpdHMgcHJlc2VudC4uLgoKLSBLZW4gSGlyc2NoIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gdGhlIE1QRS9pWCBvcGVyYXRpbmcKICBzeXN0ZW0uCgotIERhbiBGYW5kcmljaCBjb21waWxlZCBjdXJsIHdpdGggbG90cyBvZiBhZ2dyZXNzaXZlbHkgcGVkYW50aWMgY29tcGlsZXIKICBvcHRpb25zIGFuZCB0aHVzIGZvdW5kIGEgZmV3IG1pbm9yIGVycm9ycyBhbmQgZGlkIHNvbWUgZ2VuZXJhbCBjbGVhbnVwcyB0bwogIGF2b2lkIHRoZW0uCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgZmxhdyBpbiBhcmVzIHRoYXQgcHJldmVudGVkIGl0IHRvIHVzZSBub24tYmxvY2tpbmcKICBzb2NrZXRzIHByb3Blcmx5LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDQpCi0gUmljaGFyZCBCcmFtYW50ZSBmaXhlZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kZWQgInVwbG9hZHMiIHRvIHNlbmQgYSBmaW5hbAogIENSTEYgY29tYm8gcHJvcGVybHkuCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwNCkKLSBNYWRlIHRoZSByZXNwb25zZS1oZWFkZXJzIGR1cmluZyBhIENPTk5FQ1QgcmVxdWVzdCB0byBhIHByb3h5IGdldCBwYXNzZWQgb24KICBhcyByZWd1bGFyIGhlYWRlcnMsIHNvIHRoZXkgYXBwZWFyIHdpdGggLWkvLUkgb3B0aW9ucyBhbmQgc2ltaWxhci4KCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaXNsZSBWYW5lbSwgSSd2ZSBtYWRlIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5CiAgcHJvcGVybHkgc3dpdGNoIHRvIGEgR0ItZGlzcGxheSB3aGVuIG1vcmUgdGhhbiA5OTk5TUIgaGF2ZSBiZWVuIHRyYW5zZmVyZWQuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBwb2ludGVkIG91dCBhIGN1cmxyYyBwYXJzZXIgcHJvYmxlbS9jcmFzaCB3aGVuIGFuIG9wdGlvbiB3aXRoIGEKICByZXF1aXJlZCBkaWRuJ3QgaGF2ZSBvbmUgYW5kIHdhcyBvbiB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZS4KCi0gTW9yZSBXaW5kb3dzIGZpeGVzIGZvciBsYXJnZSBmaWxlcy4gV2Ugbm93IGJ1aWxkIGFuZCBsaW5rIHdpdGgKICAuLi9saWIvc3RydG9vZmZ0LmMgaW4gdGhlIGFwcCBjb2RlIHNpbmNlIEN1cmxfc3RydG9sbCgpIGlzIG5vdCBhIHByb3ZpZGVkCiAgbGliY3VybCBmdW5jdGlvbi4uLiBQZXJoYXBzIHdlIHNob3VsZCBjb25zaWRlciBhICdjb21tb24nIGRpciBvciBzaW1pbGFyCiAgd2hlcmUgd2UgcHV0IHNvdXJjZSBjb2RlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCB0aGUgY2xpZW50LiBPciBwZXJoYXBzCiAgd2UnbGwganVzdCBtYWtlIHRoaXMgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5Li4uCgotIFZpbmNlbnQgQnJvbm5lciBmb3VuZCBvdXQgdGhlIHNvY2tzNSBjb2RlIGNyYXNoZWQgd2hlbiBubyB1c2VybmFtZSB3YXMKICBzZXQuCgotIFZpbmNlbnQgQnJvbm5lciBzcG90dGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IHVzZXJuYW1lL3Bhc3N3b3JkIHdoZW4gcmUtdXNpbmcKICBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4KCi0gRml4ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDJeMzEgYnl0ZXMuIEdpc2xlCiAgVmFuZW0gcmVwb3J0ZWQuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHN0cnRvbGwoKSBnZXQgdXNlZCB3aGVuIGN1cmwgaXMgYnVpbHQgd2l0aCB0aGUgbWluZ3cKICBjb21waWxlci4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNvbXByZXNzZWQgaGVscCB0ZXh0IGNvZGUgdG8gZGlzcGxheSBwcm9wZXJseS4KCi0gUmVtb3ZlZCB0aGUgJyNkZWZpbmUgSHR0cFBvc3QnIGZyb20gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgYXMgY3VybF9odHRwcG9zdAogIGlzIHRoZSBwcm9wZXIgbmFtZSBhbmQgaXQgaGFzIGJlZW4gZm9yIHF1aXRlIHNvbWUgdGltZSBub3cuIEZpeGVzIGFub3RoZXIKICBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCi0gQWRkZWQgJ2N1cmxfb2ZmX3QnIHR5cGVkZWYgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgdG8gYmUgdXNlZCB0byBwcm92aWRlCiAgbGFyZ2UgZmlsZSBzaXplcyB0byB0aGUgKl9MQVJHRSBvcHRpb25zLiBBZGp1c3RlZCB0aGUgY29kZSBhbGwgb3ZlciB0byB1c2UKICB0aGlzIHZhcmlhYmxlIHR5cGUgaW5zdGVhZCBvZiAnb2ZmX3QnLiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgbGFyZ2UKICBmaWxlIHN1cHBvcnQgd29yayBvbiBtb3JlIHBsYXRmb3Jtcy4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyB0aGUKICBzaXplIG9mIHRoZSBjdXJsX29mZl90IGluc3RlYWQgb2YgdGhlIHBsYWluIG9mZl90LgoKVmVyc2lvbiA3LjExLjAgKDIyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA0KQotIFJlbW92ZWQgdGhlIGRlZmluZXMgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSB3aXRoIFRJTUVDT05EXyBwcmVmaXhlcy4gVGhleQogIGhhdmUgYmVlbiBvYnNvbGV0ZSBzaW5jZSBBcHJpbCAyMm5kIDIwMDIsIGFuZCBpZiB0aGlzIGNhdXNlcyBhbnlvbmUgYW55CiAgcHJvYmxlbXMgbm93IGl0IGlzIHZlcnkgZWFzeSB0byBqdXN0IGFkZCBDVVJMXyB0byB0aGUgbmFtZXMuIFRoaXMgY29ycmVjdHMKICB0aGlzIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gY2xlYW5lZCB1cCBob3cgLS10cmFjZSB3aXRoIG5vIG9wdGlvbiB3YXMgdHJlYXRlZCwgYW5kIGFsc28KICBhcmd1bWVudHMgaW4gYSBjb25maWcgZmlsZSB3aXRob3V0IGEgcmVxdWlyZWQgcGFyYW1ldGVyIQoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBmZXcgaXNzdWVzIHdoZXJlIGNvbXBpbGVycyB3YXJuZWQgYWJvdXQgdmFyaWFibGVzCiAgcG9zc2libHkgYmVpbmcgdXNlZCB1bmFzc2lnbmVkLgoKLSBNaW5vciBJbnRlcml4IGJ1aWxkIHByb2JsZW0gZml4ZWQuCgpEYW5pZWwgKDE1IEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgc29tZSBuZWNlc3NhcnkgZXNjYXBpbmcgbmVlZGVkIGluIHRoZQogIGFjaW5jbHVkZS5tNCBmaWxlIHdoZW4gYXV0b21ha2UgMS44IG9yIGxhdGVyIGlzIHVzZWQuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNCkKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEN1cmxfcmVzb2x2KCkgcmV0dXJuIGNvZGUuIFRoaXMgZXh0ZW5kcyB0aGUgZml4CiAgU3RldmUgR3JlZW4gcHJvdmlkZWQgb24gZGVjZW1iZXIgMy4uLgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDQpCi0gTHVrZSBDYWxsIG1hZGUgdGhlIHdpbjMyIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIHByb21wdGluZyBmdW5jdGlvbiBzdXBwb3J0CiAgYmFja3NwYWNlLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGh1Z2VoZWxwIHNvdXJjZSBmaWxlIHRvIGNvbnRhaW4gYm90aCBhIGNvbXByZXNzZWQgYW5kCiAgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gaW4gdGhlIGRpc3RyaWJ1dGlvbiwgc28gdGhhdCBtb3JlIHBlb3BsZSBlYXNpZXIgY2FuCiAgYnVpbGQgY3VybCB3aXRoIHRoZSBjb21wcmVzc2VkIHZlcnNpb24uCgotIERpZWdvIENhc29ycmFuIGJyb3VnaHQgYW5vdGhlciBBbWlnYU9TIGJ1aWxkIHBhdGNoIGZvciBuYXRpdmUgQW1pZ2EgYnVpbGRzLgoKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIE1hYyBPUyBYIGZyYW1ld29yayBmaWxlcy4KCi0gQnJpYW4gUiBEdWZmeSBicm91Z2h0IGEgc2VjdGlvbiB0byB0aGUgSU5TVEFMTCBmaWxlIG9uIGhvdyB0byBidWlsZCBhCiAgU1NMLWVuYWJsZWQgY3VybCB1c2luZyB0aGUgZnJlZSBCb3JsYW5kIEMrKyBjb21waWxlci4gSGUgYWxzbyB1cGRhdGVkIHRoZQogIEJvcmxhbmQgbGliL01ha2VmaWxlLmIzMi4KCi0gSSBmaXhlZCB0aGUgdGVzdCBjYXNlIDUwOSB3aGljaCBJIGJyb2tlIHllc3RlcmRheS4gTm93IHRoZSBsaWJ0ZXN0IGFyZQogIGNvbXBpbGVkIHdpdGggYW4gaW5jbHVkZSBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSBsaWJyYXJ5J3Mgc291cmNlIGRpciwgc28KICB0aGF0IHRoZSBsaWJ0ZXN0cyBjYW4gaW5jbHVkZSBmaWxlcyBmcm9tIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyB3YXMgbWFkZSB0bwogIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSBVU0VfU1NMRUFZIGRlZmluZSBpbiB0aGUgbGlicmFyeSB0ZXN0IGZpbGVzLgoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIGJyb3VnaHQgY29kZSB0aGF0IG5vdyBhbGxvd3MgYSBjYWxsYmFjayB0byBtb2RpZmllZCB0aGUgVVJMCiAgZXZlbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZCwgYW5kIHRoZW4gbGliY3VybCB3aWxsIHNpbXVsYXRlIGEKICAiZm9sbG93IGxvY2F0aW9uIiB0byB0aGF0IG5ldyBVUkwuIFRlc3QgNTA5IHdhcyBhZGRlZCB0byB0ZXN0IHRoaXMgZmVhdHVyZS4KCi0gRXh0ZW5kZWQgdGhlIHRpbWUgd2UgcmV0cnkgc2VydmVycyBpbiB0aGUgdGVzdCBzY3JpcHQsIGFuZCBJIGFsc28gbWFkZSBpdAogIHJldHJ5IHRoZSBodHRwcyBhbmQgZnRwcyBzZXJ2ZXJzIGJlZm9yZSB0aGV5IGFyZSBjb25zaWRlcmVkIGJhZC4gSSBiZWxpZXZlCiAgdGhlIHByZXZpb3VzIGFwcHJvYWNoIGNvdWxkIHR1cm4gcHJvYmxlbWF0aWMgb24gcmVhbGx5IHNsb3cgaG9zdHMuCgpWZXJzaW9uIDcuMTEuMC1wcmUxICgxMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNCkKLSBEb21pbmljayBNZWdsaW8gcG9pbnRlZCBvdXQgRlRQUyBzaG91bGQgdXNlIGRlZmF1bHQgcG9ydCA5OTAgYWNjb3JkaW5nIHRvCiAgSUFOQS4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDQpCi0gRml4ZWQgdGhlIFNQTkVHTyBjb25maWd1cmUgY2hlY2sgdG8gbm90IHVzZSAtUiBvciBvdGhlciBub24tcG9ydGFibGUgb3B0aW9ucwogIGluIHRoZSBMREZMQUdTLiBSZXBvcnRlZCBieSBQaWVycmUgaW4gYnVnIHJlcG9ydCAjODcyOTMwLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNCkKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBmaXggb24gb3VyIHpsaWIgdXNhZ2UuCgotIERhdmlkIEogTWV5ZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZSBsYXJnZSBmaWxlIHN1cHBvcnQgdG8gbGliY3VybCB3YXMKICBhcHBsaWVkLiBOZXcgY3VybF9lYXN5X3NldG9wdCBvcHRpb25zIHRoYXQgYWNjZXB0ICdvZmZfdCcgYXJndW1lbnRzIGFyZToKCiAgSU5GSUxFU0laRV9MQVJHRQogIFJFU1VNRV9GUk9NX0xBUkdFCiAgTUFYRklMRVNJWkVfTEFSR0UKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDQpCi0gQmFzZWQgb24gRG9taW5pY2sgTWVnbGlvJ3MgY29tbWVudHMsIEkgbWFkZSBvdXIgcHJpdmF0ZSB2ZXJzaW9uIG9mCiAgZ2V0dGltZW9mZGF5KCkgZGVjbGFyZWQgc3RhdGljLiBUaGlzIHdvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggdGhlIHNhbWUKICBmdW5jdGlvbiBpbiBvdGhlciBsaWJzIChsaWtlIGFyZXMgZm9yIGV4YW1wbGUpLgoKLSBBZGRlZCBEb21pbmljayBNZWdsaW8ncyBkZXNjcmlwdGlvbiBvbiBob3cgdG8gYnVpbGQgbGliY3VybCB3aXRoIGFyZXMKICBvbiB3aW4zMi4KRGFuaWVsICgxOSBEZWNlbWJlcikKLSBDVVJMT1BUX0lQUkVTT0xWRSB3YXMgbm90IHBvc3NpYmxlIHRvIHNldC4KCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCB0aGUgZGpncHAgYnVpbGQgZmlsZXMuCgpEYW5pZWwgKDE4IERlY2VtYmVyKQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCBhIHJlZGlyZWN0LXByb2JsZW0gdGhhdCBoYXBwZW5lZCBpZiBhIHNpdGUgdXNlZCBhIFVSTAogIGxpa2UgInVybC5jb20/dmFyPWNvbnRlbnQiICh3aXRob3V0IGEgcHJvcGVyIHNsYXNoKSBhbmQgZnJvbSB0aGF0IGFkZHJlc3MKICByZWRpcmVjdGVkIHRoZSB1c2VyLWFnZW50IHRvIGFuIGFic29sdXRlIGRpcmVjdG9yeS4KCi0gRGF2aWQgQnlyb24gbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBib3RoIHRoZSAuTkVUIGFuZCBWQzYgdmVyc2lvbnMgb2YKICBNU1ZDCgpEYW5pZWwgKDE2IERlY2VtYmVyKQotIFVwZGF0ZWQgdGVzdCA1MDYgc2luY2UgaXQgc3RhcnRlZCB0byBmYWlsIGFmdGVyIHRoZSBjYWNoZSBwcnVuZSBjaGFuZ2UKICB5ZXN0ZXJkYXkuIEkgYWxzbyBjaGFuZ2VkIGl0IHNsaWdodGx5IHRvIGZlYXR1cmUgYSBjb3VudGVyIGluIGVhY2ggZGVidWcKICBvdXRwdXQgZm9yIGVhc2llciB0cmFjaW5nLgoKRGFuaWVsICgxNSBEZWNlbWJlcikKLSBPbGQgRE5TIGNhY2hlIGVudHJpZXMgYXJlIG5vdyBvbmx5IHBydW5lZCBhZnRlciBjdXJsIGlzIGRvbmUgd2l0aCBhIHJlcXVlc3QsCiAgYW5kIG5vdCBpbiB0aGUgYWN0dWFsIG5hbWUgcmVzb2x2ZSBjYWxsLgoKLSBjb3JyZWN0ZWQgdGhlIC0tZW5hYmxlLWFyZXMgcGF0Y2gKCi0gR2l1c2VwcGUgQXR0YXJkaSBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGhpbiBsaWJjdXJsIHRoYXQgcmUtdXNlZAogIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKRGFuaWVsICgxMCBEZWNlbWJlcikKLSBHaXNsZSBWYW5lbSByZXBvcnRlZCB0aGF0IHRoZSBkaWN0IHN1cHBvcnQgd2FzIGJyb2tlbi4gSSBicm9rZSBpdCBkdXJpbmcgbXkKICBmdHBzLWNoYW5nZXMgb3ZlcmhhdWwuIEkndmUgbm93IGFkZGVkIGEgJ2N1cmxhc3NlcnQnIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCiAgdXNlZCB0byB2ZXJpZnkgZXhwcmVzc2lvbnMsIHRvIHByZXZlbnQgZnV0dXJlIGVycm9ycyBvZiB0aGUgc2FtZQogIGtpbmQuIFRoZXkncmUgb25seSBwcmVzZW50IGluIGRlYnVnLWJ1aWxkcy4KCi0gRGllZ28gQ2Fzb3JyYW4gbWFkZSBjdXJsIGFuZCBsaWJjdXJsIHBvc3NpYmxlIHRvIGJ1aWxkIG5hdGl2ZWx5IChubyBtb3JlCiAgbmVlZCBmb3IgdGhlIGl4ZW11bCBsaWJyYXJ5KSBvbiBBbWlnYU9TLgoKLSBEb21pbmljayBNZWdsaW8gbWFkZSBjb25maWd1cmUgLS1lbmFibGUtYXJlcyBzdXBwb3J0IGEgZ2l2ZW4gcGF0aCB0byB0aGUKICBpbnN0YWxsZWQgYXJlcyBsaWIsIGluc3RlYWQgb2YgYWx3YXlzIHVzaW5nIGl0IGluIHRoZSBjdXJsIHNvdXJjZSB0cmVlLgogIFRoaXMgYWxzbyBmaXhlZCB0aGUgY3VybC1jb25maWcgLS1saWJzIG91dHB1dC4KCi0gRXJpYyBTLiBSYXltb25kIHBhdGNoZWQgYSB2ZXJ5IG1pbm9yIG1hbiBwYWdlIGZvcm1hdCBlcnJvciBpbgogIGxpYmN1cmwtZXJyb3JzLjMKCkRhbmllbCAoOCBEZWNlbWJlcikKLSBGaXhlZCB0aGUgZmxhdyB0aGF0IG1hZGUgLWx6IGFwcGVhciB0d2ljZSBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUuCgotIEFmdGVyIGNvcnJlc3BvbmRlbmNlIHdpdGggR2lzbGUgVmFuZW0sIEkgY2hhbmdlZCB0aGUgJ2Nvbm5lY3Rpb24gYWJvcnRlZCcKICBlcnJvciB0ZXh0IHdoZW4gdGhlIEZUUCByZXNwb25zZSByZWFkZXIgZmFpbGVkIHRvIG1vcmUgc3BlY2lmaWNseSBpZGVudGlmeQogIHdoYXQgdGhlIHByb2JsZW0gaXMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBEb21pbmljayBNZWdsaW8sIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgb3V0cHV0cwogICdBc3luY2hETlMnIGFzIGEgZmVhdHVyZSBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFyZXMuIFRoZSBmZWF0dXJlIG5hbWUKICBpcyB0aGUgc2FtZSB0aGF0ICdjdXJsIC1WJyBvdXRwdXRzLCBmb3Igc2ltcGxpY2l0eS4KCkRhbmllbCAoMyBEZWNlbWJlcikKLSBNYXJ0eSBLdWhydCBtYWRlIHRoZSBidWlsZCB1cC10by1kYXRlIG9uIFZNUywgYW5kIG1vdmVkIG1vc3Qgb2YgdGhlIFZNUy0KICBzcGVjaWZpYyBzdHVmZiBpbiB0aGUgY2xpZW50IGNvZGUgdG8gYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZS4KCi0gU3RldmUgR3JlZW4gZml4ZWQgYSByZXR1cm4gY29kZSBidWcgaW4gQ3VybF9yZXNvbHYoKSwgdGhhdCBtYWRlIHRoZSBzb2NrczUKICBjb2RlIGZhaWwuCgotIHN3YWxrYXVzIGF0IHlhaG9vLmNvbSBwYXRjaGVkIGxpYmN1cmwgdG8gaWdub3JlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzCiAgd2hlbiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBpcyB1c2VkLCBhcyBtYW5kYXRlZCBieSBSRkMyNjE2LgoKRGFuaWVsICgyIERlY2VtYmVyKQotIC0tZnRwLXBhc3Ygd2FzIGFkZGVkLCB3aGljaCBzZXJ2ZXMgdGhlIG9ubHkgcHVycG9zZSBvZiBvdmVycmlkaW5nIGEKICBwcmV2aW91c2x5IHNldCAtLWZ0cHBvcnQgb3B0aW9uLiBTdGFydGluZyBub3csIC0tZnRwLXBvcnQgaXMgYSByZWNvZ25pemVkCiAgYWxpYXMgZm9yIC0tZnRwcG9ydCBmb3IgY29uc2lzdGVuY3kuCgotIEdpdXNlcHBlIEF0dGFyZGkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgdXNlIE1TR19OT1NJR05BTCB3aGVuIHdlIHVzZQogIHNlbmQoKSBhbmQgcmVjdigpLiBJIGFkZGVkIGNoZWNrcyBmb3IgdGhlIGRlZmluZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQKICBhZGp1c3RlZCB0aGUgY29kZSBhY2NvcmRpbmdseS4gSWYgdGhlIHN5bWJvbCBpcyBwcmVzZW50LCB3ZSB3b24ndCBhdHRlbXB0CiAgdG8gaWdub3JlIHRoZSBTSUdQSVBFIHNpZ25hbC4KCkRhbmllbCAoMSBEZWNlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIHNldCB1cCBhIGJzZGZ0cGQtc3NsIHNlcnZlciBmb3IgbWUgYW5kIEkgY291bGQgbWFrZSBjdXJsCiAgcnVuIGZpbmUgYWdhaW5zdCBpdHMgRlRQUyBpbXBsZW1lbnRhdGlvbi4gTm93IHRoZXNlIEZUUFMtcmVsYXRlZCB0aGluZ3MKICB3b3JrOgogICBvIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBGVFBTCiAgIG8gYWN0aXZlIChQT1JUKSBhbmQgcGFzc2l2ZSAoUEFTVikKICAgbyB1cGxvYWQgYW5kIGRvd25sb2FkCiAgIG8gdmVyaWZpZWQgYWdhaW5zdCBic2RmdHBkLXNzbCBhbmQgUmFpZGVuRlRQRAoKRGFuaWVsICgyNyBOb3ZlbWJlcikKLSBKYW1lcyBDbGFuY3kgbWFkZSB0aGUgQm9ybGFuZCBNYWtlZmlsZXMgdXAgdG8gZGF0ZS4KCi0gTWFya3VzIE1vZWxsZXIgaW1wcm92ZWQgdGhlIFNQTkVHTyBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDI1IE5vdmVtYmVyKQotIERhdmUgTWF5IGZpbGVkIGJ1ZyByZXBvcnQgIzg0ODM3MSwgaWRlbnRpZnlpbmcgdGhhdCBpZiB5b3UnZCBkbyBQT1NUIG92ZXIgYQogIHByb3h5IHRvIGEgaHR0cHMgc2VydmVyLCBsaWJjdXJsIGRpZG4ndCBQT1NUIGF0IGFsbCwgaXQganVzdCBtYWRlIGEgR0VUISBJdAogIHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBsaWJjdXJsIHdyb25nbHkgZGlkbid0IGNvbnNpZGVyIHRoZSBhdXRoZW50aWNhdGlvbgogICJuZWdvdGlhdGlvbiBwaGFzZSIgdG8gYmUgY29tcGxldGUgeWV0LgoKICBJIGFkZGVkIHRlc3QgY2FzZSA5NSB0byB2ZXJpZnkgbXkgZml4IGZvciB0aGlzLgoKRGFuaWVsICgyNCBOb3ZlbWJlcikKLSBUaGFua3MgdG8gTWF0aGlhcyBBeGVsc3NvbiwgSSd2ZSBiZWVuIGFibGUgdG8gd29yayBvbiBGVFBTIGZvciBsaWJjdXJsIGFuZCBpdAogIHNlZW1zIHRvIHdvcmsgc29tZXdoYXQgZmluZSBub3cuCgogIFRoZSBGVFBTIHN0dWZmIGlzIGJhc2VkIG9uIFJGQzIyMjggYW5kIHRoZSBtdXJyYXktYXV0aC1mdHAtc3NsIGRyYWZ0CiAgKHZlcnNpb24gMTIpLiBUaGVyZSBzZWVtcyB0byBleGlzdCBxdWl0ZSBhIGZldyBzZXJ2ZXJzIHRoYXQgaGF2ZSBpbXBsZW1lbnRlZAogIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGlzLgoKICBXZSBjYW4gbm93IHVzZSBmdHBzOi8vIFVSTHMgdG8gZXhwbGljaXRseSBzd2l0Y2ggb24gU1NML1RTTCBmb3IgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uIGFuZCB0aGUgZGF0YSBjb25uZWN0aW9uIChkZWFsaW5nIHdpdGggdHdvIFNTTCBjb25uZWN0aW9ucyBmb3JjZWQKICBtZSB0byBjaGFuZ2UgYSBsb3Qgb2Ygc3R1ZmYgaW4gbGliY3VybCkuCgogIEFsdGVybmF0aXZlbHksIGFuZCB3aGF0IHNlZW1zIHRvIGJlIHRoZSByZWNvbW1lbmRlZCB3YXksIHdlIGNhbiBzZXQgdGhlIG5ldwogIG9wdGlvbiBDVVJMT1BUX0ZUUF9TU0wgdG8gb25lIG9mIHRoZXNlIHZhbHVlczoKCiAgICAgQ1VSTEZUUFNTTF9OT1BFLCAgIC0gZG8gbm90IGF0dGVtcHQgdG8gdXNlIFNTTAogICAgIENVUkxGVFBTU0xfVFJZICAgICAtIHRyeSB1c2luZyBTU0wsIHByb2NlZWQgYW55d2F5IG90aGVyd2lzZQogICAgIENVUkxGVFBTU0xfQ09OVFJPTCAtIFNTTCBmb3IgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBvciBmYWlsCiAgICAgQ1VSTEZUUFNTTF9BTEwgICAgIC0gU1NMIGZvciBhbGwgY29tbXVuaWNhdGlvbiBvciBmYWlsCgogIEFueSBmYWlsdXJlIHRvIHNldCB0aGUgZGVzaXJlZCBsZXZlbCB3aWxsIG1ha2UgbGliY3VybCBmYWlsIHdpdGggdGhlIGVycm9yCiAgY29kZSBDVVJMRV9GVFBfU1NMX0ZBSUxFRC4gVGhpcyBuZXcgb3B0aW9uIG1ha2VzIGEgIm5vcm1hbCIgZnRwOi8vIHRyYW5zZmVyCiAgYXR0ZW1wdCB0byBiZSBtYWRlIHNlY3VyZWx5LgoKICBJJ3ZlIGJlZW4gYWJsZSB0byBsb2dpbiBhbmQgZ2V0IGZpbGVzIChwYXNzaXZlbHkpIGZyb20gTWF0aGlhcycgc2VydmVyIHVzaW5nCiAgYm90aCBmdHBzOi8vIGFuZCBDVVJMT1BUX0ZUUF9TU0wuIChJJ3ZlIG1hZGUgJ2N1cmwnIHVuZGVyc3RhbmQgdGhlIC0tZnRwLXNzbAogIG9wdGlvbiB0aGF0IHNldHMgQ1VSTEZUUFNTTF9UUlkuKQoKLSBHYXogSXFiYWwgZml4ZWQgYSByYW5nZSBzdHJpbmcgbWVtb3J5IGxlYWsuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBXaW5kb3dzIGJ1aWxkcy4KCi0gQWRkZWQgdGhlIG5ldyBGVFBTU0wgZGVmaW5lcyBpbiBjdXJsL2N1cmwuaAoKRGFuaWVsICgyMCBOb3ZlbWJlcikKLSBKb3NoIEthcGVsbCBmaWxlZCBidWcgcmVwb3J0ICM4NDUyNDcgYXMgaGUgZm91bmQgYW4gZW5kbGVzcyBsb29wIHdoZW4KICBnZXR0aW5nIGEgNDA3IGJhY2sgZnJvbSBhIHByb3h5IHdoZW4gbm8gdXNlcitwYXNzd29yZCB3YXMgZ2l2ZW4uIEFkZGVkIHRlc3QKICBjYXNlIDk0IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxOSBOb3ZlbWJlcikKLSBLZXZpbiBSb3RoIGZpeGVkIGEgcHJvZ3Jlc3MtYmFyIHByb2JsZW0gb24gV2luZG93cy4KCi0gV2hpbGUgd29ya2luZyB3aXRoIE5pY29sYXMgQ3JvaXNldCdzIGJ1ZyByZXBvcnQgIzg0MzczOSwgSSBub3RpY2VkIHR3byBtaW5vcgogIHByb2JsZW1zIHJlbGF0ZWQgdG8gZnRwIHBhcnRpYWwgZG93bmxvYWRzOiBpZiBhIHBhcnRpYWwgdHJhbnNmZXIgaXMKICBkZXRlY3RlZCwgd2UgbXVzdCBjbG9zZSB0aGUgY29ubmVjdGlvbiBhcyB3ZSBjYW5ub3Qga25vdyBpbiB3aGF0IHN0YXRlIGl0IGlzCiAgYW55bW9yZS4gVGhpcyBsb29rcyBsaWtlIGEgUHJvRlRQRCBidWc6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDAzLTExLzAwNzkuaHRtbAoKRGFuaWVsICgxNyBOb3ZlbWJlcikKLSBNYWNpZWogVy4gUm96eWNraSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHVzZSBhIGNhY2hlIHZhcmlhYmxlIGZvciB0aGUKICB3cml0YWJsZSBhcmd2IHRlc3QuIFRoaXMgd2F5LCB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBiZXR0ZXIgKGZvcgogIGNyb3NzLWNvbXBpbGVzIGV0YykKCkRhbmllbCAoMTUgTm92ZW1iZXIpCi0gTWF0aGlhcyBBeGVsc3NvbiBmb3VuZCBvdXQgbGliY3VybCBzb21ldGltZXMgZnJlZWQgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZQogIHR3aWNlLCBsZWFkaW5nIHRvIGNyYXNoZXMhCgpEYW5pZWwgKDE0IE5vdmVtYmVyKQotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIGZvdW5kIGEgY2FzZSB3aXRoIGEgYmFkIHJlc29sdmUgdGhhdCB3ZSBkaWRuJ3QKICBwcm9wZXJseSBiYWlsIG91dCBmcm9tLCB3aGVuIHVzaW5nIGFyZXMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyKQotIERlZmF1bHQgQ29udGVudC1UeXBlIGZvciBwYXJ0cyBpbiBtdWx0aXBhcnQgZm9ybXBvc3RzIGhhcyBjaGFuZ2VkIHRvCiAgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIuICBUaGlzIHNlZW1zIG1vcmUgYXBwcm9wcmlhdGUsIGFuZCBJIGJlbGlldmUKICBtb3ppbGxhIGFuZCB0aGUgbGlrZXMgZG8gdGhpcy4gSW4gdGhlIHNhbWUgYXJlYTogLmh0bWwgZmlsZXMgbm93IGdldAogIHRleHQvaHRtbCBhcyBDb250ZW50LVR5cGUuIChQb2ludGVkIG91dCBpbiBidWcgcmVwb3J0ICM4Mzk4MDYpCgotIEdpc2xlIFZhbmVtIGNvcnJlY3RlZCB0aGUgLS1wcm9ncmVzcy1iYXIgb3V0cHV0IGJ5IGRvaW5nIGEgZmx1c2ggb2YgdGhlCiAgb3V0cHV0LCB3aGljaCBhcHBhcmVudGx5IG1ha2VzIGl0IGxvb2sgYmV0dGVyIG9uIGF0IGxlYXN0IHdpbmRvd3MsIGJ1dAogIHBvc3NpYmx5IG90aGVyIHBsYXRmb3JtcyB0b28uCgotIFBldGVyIFN5bHZlc3RlciBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB0aGUgY29ubmVjdCBjb2RlLCB3aGljaCBtYWRlIHRoZQogIG11bHRpIGludGVyZmFjZSBvbiBhIGlwdjYtZW5hYmxlZCBzb2xhcmlzIGJveCBkbyBiYWQuIFRlc3QgY2FzZSA1MDQgdG8gYmUKICBzcGVjaWZpYy4gSSd2ZSBzcGVudCBzb21lIHRpbWUgdG8gY2xlYW4tdXAgdGhlIEN1cmxfY29ubmVjdGhvc3QoKSBmdW5jdGlvbgogIG5vdyB0byB1c2UgbGVzcyBkdXBsaWNhdGVkIGNvZGUgZm9yIHRoZSB0d28gZGlmZmVyZW50IHNlY3Rpb25zOiBpcHY2IGFuZAogIGlwdjQuCgpEYW5pZWwgKDExIE5vdmVtYmVyKQotIEFkZGVkIENVUkxPUFRfTkVUUkNfRklMRS4gVXNlIHRoaXMgdG8gdGVsbCBsaWJjdXJsIHdoaWNoIGZpbGUgdG8gdXNlIGluc3RlYWQKICBvZiB0cnlpbmcgdG8gZmluZCBhIC5uZXRyYyBpbiB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuIFRoZQogIGV4aXN0aW5nIC5uZXRyYyBmaWxlIGZpbmRlciBpcyBzb21ld2hhdCBuYWl2ZSBhbmQgaXMgZmFyIGZyb20gcGVyZmVjdCBvbgogIHNldmVyYWwgcGxhdGZvcm1zIHRoYXQgYXJlbid0IHVuaXgtc3R5bGUuIElmIHRoaXMgb3B0aW9uIGlzbid0IHNldCB3aGVuCiAgQ1VSTE9QVF9ORVRSQyBpcyBzZXQsIHRoZSBwcmV2aW91cyBhcHByb2FjaCB3aWxsIHN0aWxsIGJlIHVzZWQuCgogIFRoZSBjdXJyZW50IC5uZXRyYyBjaGVjayBjb2RlIG5vdyBhbHNvIHN1cHBvcnQgbG9uZ2VyIHRoYW4gMjU2IGJ5dGVzIHBhdGgKICBuYW1lcy4KCkRhbmllbCAoMTAgTm92ZW1iZXIpCi0gS2FuZy1KaW4gTGVlIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGdlbmVyYXRlZCBjYS1idW5kbGUuaCBmaWxlIHNob3VsZG4ndCBiZQogIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBkaXIgaWYgYSBkaWZmZXJlbnQgYnVpbGQgZGlyIGlzIHVzZWQuCgotIEFmdGVyIFPpYmFzdGllbiBXaWxsZW1pam5zJyBidWcgcmVwb3J0LCB3ZSBub3cgY2hlY2sgdGhlIHNlcGFyYXRvcnMgcHJvcGVybHkKICBpbiB0aGUgMjI5LXJlcGx5IHNlcnZlcnMgcmVzcG9uZCBvbiBhIEVQU1YgY29tbWFuZCBhbmQgYmFpbCBvdXQgYmV0dGVyIGlmCiAgdGhlIHJlcGx5IHN0cmluZyBpcyBub3QgUkZDMjQyOC1jb21wbGlhbnQuCgpEYW5pZWwgKDcgTm92ZW1iZXIpCi0gQmFzZWQgb24gR2lzbGUgVmFuZW0ncyBwYXRjaCwgSSBtYWRlIGN1cmwgdHJ5IGhhcmRlciB0byBnZXQgdGhlIGhvbWUKICBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgdXNlciwgaW4gb3JkZXIgdG8gZmluZCB0aGUgZGVmYXVsdCAuY3VybHJjIGZpbGUuCiAgV2UncmUgYWxzbyBjb25zaWRlcmluZyBtb3Zpbmcgb3V0IHRoZSBIT01FLWRpciBjb2RlIGZyb20gbGliY3VybCwgYW5kCiAgaW5zdGVhZCBoYXZlIHRoZSBhcHAgcGFzcyBpbiB0aGUgcGF0aCB0byB0aGUgLm5ldHJjIGZpbGUgKHdoaWNoIGlzIHRoZSBvbmx5CiAgbG9naWMgbGVmdCBpbiBsaWJjdXJsIHRoYXQgdXNlcyB0aGUgSE9NRSBkaXIpLiBUaGVuIGN1cmwgY2FuIHVzZSB0aGUgaG9tZQogIGRpciBmb3IgdGhhdCBwdXJwb3NlIHRvby4KCi0gUmFscGggTWl0Y2hlbGwncyB1cGRhdGVkIHRlc3RjdXJsLnNoIHRvIHRoZSBzY3JpcHQgdG8gdGFrZSBhbiBleGlzdGluZwogIGRpcmVjdG9yeSBuYW1lIGFuZCBidWlsZC9ydW4vdGVzdCBjdXJsIGluIHRoZXJlIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHVwZGF0ZQogIGZyb20gQ1ZTLiBVc2luZyB0aGlzIGFwcHJvYWNoLCB0aGUgc2NyaXB0IGNhbiBub3cgYmUgdXNlZCB0byB0ZXN0IGRhaWx5CiAgdGFyYmFsbHMgZXRjLgoKLSBHaXNsZSBWYW5lbSBhZGRlZCBhICJyZXNvdXJjZSBmaWxlIiB0byB0aGUgV2luZG93cyBETEwgYnVpbGRzLCB0byBjb250YWluCiAgaW5mb3JtYXRpb24gc3VjaCBhcyB2ZXJzaW9uIG51bWJlciwgbGlicmFyeSBuYW1lLCBjb3B5cmlnaHQgaW5mbyBldGMuCgpEYW5pZWwgKDYgTm92ZW1iZXIpCi0gY3VybCBjaGVja3MgaWYgdGhlIGV4aXN0aW5nIGxpYmN1cmwgc3VwcG9ydHMgdGhpbmdzIGxpa2UgLS1udGxtLCAtLW5lZ290aWF0ZQogIGFuZCAtLWtyYjQgYW5kIHJldHVybnMgZXJyb3IgaWYgbm90LgoKLSBJIGFkZGVkIHRocmVlIG5ldyBnbG9iYWwgZGVmaW5lcyBpbiB0aGUgY3VybC9jdXJsLmggaGVhZGVyOgogIExJQkNVUkxfVkVSU0lPTl9NQUpPUiwgTElCQ1VSTF9WRVJTSU9OX01JTk9SIGFuZCBMSUJDVVJMX1ZFUlNJT05fUEFUQ0guIFRoZXkKICBhcmUgdGhlIHRocmVlIG51bWJlcnMgaW4gdGhlIGxpYnJhcnkncyB2ZXJzaW9uIG51bWJlciwgc2VwYXJhdGVkIGZvciBlYXNpZXIKICB1c2FnZS4gJ21ha2V0Z3onIHdhcyB1cGRhdGVkIGFjY29yZGluZ2x5IHRvIGdlbmVyYXRlIHRoZXNlIG51bWJlcnMgcHJvcGVybHkKICB3aGVuIGJ1aWxkaW5nIHJlbGVhc2UtYXJjaGl2ZXMuCgotIFVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgZml4LCByZXBvcnRlZCBieSBib3RoIE1hcnR5IEt1aHJ0IGFuZCBCZW5qYW1pbgogIEdlcmFyZC4KCi0gTWF0dCBWZWVuc3RyYSBwcm92aWRlZCBidWlsZCBmaWxlcyB0byBidWlsZCBsaWJjdXJsIGFzIGEgImZyYW1ld29yayIgdW5kZXIKICBNYWMgT1MgWC4gU2VlIHRoZSBsaWIvbGliY3VybC5mcmFtZXdvcmsubWFrZSBmb3IgZGV0YWlscy4KCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBvZiBUUlVFIGFuZCBGQUxTRSBmcm9tIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXIgZmlsZS4KICBUaGV5J3JlIG5vdCBpbiBvdXIgbmFtZSBzcGFjZSBzbyB3ZSBzaG91bGQgbm90IGZpZGRsZSB3aXRoIHRoZW0uCgpEYW5pZWwgKDUgTm92ZW1iZXIpCi0gUmVwbGFjZWQgdGhlIG1hbiBwYWdlIHRvIEhUTUwgY29udmVydGVyIHByb2dyYW0gd2l0aCBhIG5ldyBvbmU6IHJvZmZpdC4KICBNYWtlcyBuaWNlciB3ZWIgcGFnZXMuCgpEYW5pZWwgKDQgTm92ZW1iZXIpCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyB0byBsZXQgdGhlbSBidWlsZCBjdXJsIGZpbmUKICBvbiBXaW5kb3dzLgoKLSBLZXZpbiBSb3RoIGNvcnJlY3RlZCB0aGUgY3lnd2luIHBhY2thZ2UgZ2VuZXJhdG9yIGFuZCBzcGVsbC1maXhlZCB0aGUKICBjb21tZW50IGluIHRoZSBjYS1idW5kbGUuaCBmaWxlLgoKVmVyc2lvbiA3LjEwLjggKDEgTm92ZW1iZXIgMjAwMykKCkRhbmllbCAoMzEgT2N0b2JlcikKLSBBc3N1bWUgdGhhdCBNRFRNIG9uIGFuIEZUUCBzZXJ2ZXIgcmV0dXJucyB0aGUgdGltZXN0YW1wIHVzaW5nIHRoZSBVVEMgdGltZQogIHpvbmUuIFRoaXMgY2hhbmdlcyB0aGUgdGltZSBDVVJMSU5GT19GSUxFVElNRSByZXR1cm5zIGZvciBhIGdpdmVuIGZpbGUgb3ZlcgogIEZUUCwgYW5kIHdpbGwgY2hhbmdlIGV4aXN0aW5nIHVzZXMgb2YgQ1VSTE9QVF9USU1FQ09ORElUSU9OLiBJdCB3aWxsIG1ha2UKICB0aGUgZnVuY3Rpb25hbGl0eSBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBIVFRQIG9uZSBpcyBhbHJlYWR5IHdvcmtpbmcuCgotIENvbW1hbmQgbGluZSBvcHRpb25zIHRoYXQgdGFrZSBudW1lcmljYWwgcGFyYW1ldGVycyAoc3VjaCBhcyAteSwgLVksIC1DIGV0YykKICBub3cgcmVwb3J0IGVycm9yIGFuZCBleGl0IGlmIHRoZSBwYXJhbWV0ZXIgaXNuJ3QgdHJ1bHkgYSBudW1iZXIgZ3JlYXRlciB0aGFuCiAgb3IgZXF1YWwgdG8gemVyby4gVGhpcyBoZWxwcyB1c2VycyB0byBub3RpY2UgYmFkIHVzYWdlIGVhcmxpZXIuIEJlZm9yZSwgd2hlbgogIGEgdXNlciBmb3Jnb3Qgb3IgbWlzc2VkIHRvIGFkZCBhIG51bWVyaWNhbCBwYXJhbWV0ZXIgdG8gYW4gb3B0aW9uLCB0aGUKICBjb21tYW5kIGxpbmUgcGFyc2VyIHdvdWxkIHNpbXBseSAiZWF0IiB0aGUgZm9sbG93aW5nIG9wdGlvbiBhbmQgaXQgd291bGQKICBjYXVzZSBncmVhdCBjb25mdXNpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBtYWRlIGxpYmN1cmwgZGVhbCB3aXRoIE5PQk9EWSBhbmQgSEVBREVSIGZvciBmaWxlOi8vIHRoZSBzYW1lIHdheQogIGl0IGFscmVhZHkgZG9lcyBmb3IgRlRQOiBpdCBwcm92aWRlcyBIVFRQLWxvb2tpbmcgaGVhZGVycyB0aGF0IHByb3ZpZGUgaW5mbwogIG9ubHkgYWJvdXQgdGhlIGZpbGUsIHdpdGhvdXQgZG9pbmcgdGhlIGFjdHVhbCB0cmFuc2Zlci4gVGhlIGN1cmwgdG9vbCB0aGVuCiAgbGV0cyAtLWhlYWQgZG8gdGhpcy4KCkRhbmllbCAoMjkgT2N0b2JlcikKLSBydW50ZXN0cy5wbCBub3cgY2hlY2tzIGZvciBhbmQgdXNlIHZhbGdyaW5kIGlmIHByZXNlbnQuIEl0IHdpbGwgcmVkaXJlY3QgdGhlCiAgdmFsZ3JpbmQgcmVzdWx0cyBpbiBsb2cvdmFsZ3JpbmRbbnVtXSBidXQgaXQgY3VycmVudGx5IGRvZXNuJ3Qgc2NhbiB0aGF0CiAgZmlsZSBmb3IgYW55IGVycm9ycyBvciBhbnl0aGluZywgdGhhdCBpcyBzdGlsbCBvbmx5IG1hZGUgbWFudWFsbHkuCgotIERhdmlkIEh1bGwgbWFkZSB0aGUgZmlsZTogVVJMIHBhcnNlciBhbHNvIGFjY2VwdCB0aGUgc29tZXdoYXQgc2xvcHB5IGZpbGUKICBzeW50YXg6IGZpbGU6L3BhdGguIEkgYWRkZWQgdGVzdCBjYXNlIDIwMyB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMjggT2N0b2JlcikKLSBEYW4gQyB0cmFja2VkIGRvd24geWV0IGFub3RoZXIgd2VpcmQgYmVoYXZpb3IgaW4gdGhlIGdsaWJjIGdldGhvc3RieW5hbWVfcigpCiAgZnVuY3Rpb24gZm9yIHNvbWUgc3BlY2lmaWMgdmVyc2lvbnMgKHJlcG9ydGVkIG9uIDIuMi41IGFuZCAyLjEuMSksIGFuZAogIHByb3ZpZGVkIGEgZml4LiBPbiBMaW51eCBtYWNoaW5lcyB3aXRoIHRoZXNlIGdsaWJjIHZlcnNpb25zLCBub24taXB2NgogIGJ1aWxkcyBvZiBsaWJjdXJsIHdvdWxkIG9mdGVuIGZhaWwgdG8gcmVzb2x2ZSBwZXJmZWN0bHkgcmVzb2x2YWJsZSBob3N0CiAgbmFtZXMuCgpEYW5pZWwgKDI2IE9jdG9iZXIpCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9tc25wcmludGYoKSBjb3VsZCB3cml0ZSB0aGUgdHJhaWxpbmcKICB6ZXJvLWJ5dGUgb3V0c2lkZSBpdHMgZ2l2ZW4gYnVmZmVyIHNpemUuIFRoaXMgY291bGQgaGFwcGVuIGlmIHlvdSBnZW5lcmF0ZWQKICBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlIGFzIHRoZW4gbGliY3VybCB3b3VsZCBvdmVyd3JpdGUgdGhlIEVSUk9SQlVGRkVSCiAgd2l0aCBvbmUgYnl0ZS4gVXNpbmcgYSBub24tZXhpc3RpbmcgdmVyeSBsb25nIGxvY2FsIGZpbGU6Ly8gbmFtZSBpcyBvbmUgY2FzZQogIHRoYXQgY291bGQgbWFrZSB0aGlzIG9jY3VyLgoKRGFuaWVsICgyNCBPY3RvYmVyKQotIERhdmlkIEh1bGwgZmlsZWQgYnVnIHJlcG9ydCAjODI5ODI3LiBJdCBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aXRoIC1DIC0gaWYKICB0aGUgZnVsbCBmaWxlIGFscmVhZHkgd2FzIGRvd25sb2FkZWQgYW5kIHRodXMgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhCiAgNDE2LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSB1c2UgdGhlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgYW5kIGV4cGVjdAogIHRoYXQgc2l6ZSB0byBnZXQgdHJhbnNmZXIsIGNhdXNpbmcgYSAiaGFuZyIgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbiBhbmQgdGhlbiBhbiBlcnJvciAxOCAoInN0aWxsIE4gYnl0ZXMgZGF0YSBsZWZ0IG9mIHRoZSB0cmFuc2ZlciIpLgoKICBOb3cgd2UgZG9uJ3QgcmV0dXJuIGFueSBlcnJvciBhdCBhbGwsIGJ1dCBJIHRoaW5rIGxpYmN1cmwgc2hvdWxkIHBlcmhhcHMKICByZXR1cm4gc29tZSBraW5kIG9mIGluZm8gc2luY2UgdGhlIHJlcXVlc3RlZCByYW5nZSB3YXMgb3V0IG9mIHRoZSBzaXplIG9mCiAgdGhlIGRvY3VtZW50LgoKLSBCYXNlZCBvbiBEYXZpZCBIdWxsJ3MgZml4IGluIGJ1ZyByZXBvcnQgIzgwNDU5OSwgd2Ugbm93IGNoZWNrIGZvciBzb2xhcmlzIGFuZAogIGdjYyBpbiBjb25maWd1cmUgYW5kIHNldCB0aGUgLW1pbXB1cmUtdGV4dCBsaW5rIGZsYWcgZm9yIGxpbmtpbmcgdGhlIGxpYgogIGJldHRlci4KCi0gSSd2ZSBpbnRyb2R1Y2VkIGEgLXQgb3B0aW9uIHRvIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQuIFdpdGggdGhhdCBvcHRpb24gc2V0LAogIHRoZSBzY3JpcHQgcnVucyBzcGVjaWFsICJtZW1vcnkgdG9ydHVyZSIgdGVzdHMuIEZvciBlYWNoIHRlc3QgY29tbWFuZCBsaW5lCiAgaW4gdGhhdCBzZWN0aW9uLCB0aGUgc2NyaXB0IGZpcnN0IHJ1bnMgdGhlIGNvbW1hbmQgbGluZSBhbmQgY291bnRzIHRoZSB0b3RhbAogIGFtb3VudCBvZiBhbGxvY2F0aW9ucyBtYWRlLiBJdCB0aGVuIHJ1bnMgdGhlIGV4YWN0IHNhbWUgY29tbWFuZCBsaW5lIGFnYWluLAogIGZvcmNpbmcgYWxsb2NhdGlvbiBudW1iZXIgTiB0byBmYWlsLiBJdCB3aWxsIHRyeSBldmVyeSBOIGZyb20gMSB0byB0aGUgdG90YWwKICBudW1iZXIgb2YgYW1vdW50cyBtYWRlLiBGb3IgZXZlcnkgaW52b2tlLCBpdCBjaGVja3MgdGhhdCBubyBtZW1vcnkgd2FzCiAgbGVha2VkIGFzIHRoYXQgd291bGQgaW5kaWNhdGUgYSBiYWQgY2xlYW51cCBzb21ld2hlcmUgaW4gdGhlIGNvZGUuCgogIFRoaXMgaXMganVzdCBiZWdpbm5pbmcgdG8gd29yaywgYW5kIEkndmUgYWxyZWFkeSBtYWRlIHNvbWUgY29ycmVjdGlvbnMgaW4KICBsaWJjdXJsIGNvZGUuIFdoZW4gdGhpcyBjb2RlIHdvcmtzIHNvbWV3aGF0IGZpbmUsIEknbGwgbWFrZSBzdXJlICdtYWtlIHRlc3QnCiAgaW4gdGhlIHJvb3QgZGlyIHdpbGwgcnVuIHRoZXNlIHRlc3RzIGFzIHdlbGwuCgpEYW5pZWwgKDIzIE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBmaXhlZCBob3cgdGhlIENBIHZlcmlmaWNhdGlvbiBpcyBtYWRlLiBWZXJpZmljYXRpb25zIGNhbiBub3cgYmUKICBtYWRlIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgdGhlIHJlc3VsdCBvZiBpdCBjYW4gYmUgaWdub3JlZC4gVGhpcyBhbHNvCiAgYWZmZWN0cyB0aGUgY3VybCB0b29sIGFzIC1rIGNhbiBub3cgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tY2FjZXJ0IG9yCiAgLS1jYXBhdGguCgpEYW5pZWwgKDIyIE9jdG9iZXIpCi0gR2lzbGUgVmFuZW0gZm91bmQgb3V0IC0tZGlzYWJsZS1lcHJ0IGRpZG4ndCB3b3JrIGFuZCBwYXRjaGVkIGl0LgoKLSBUZXN0IGNhc2UgOTEgd2FzIG1vZGlmaWVkIGFuZCBjb3VsZCBub3cgcmVwZWF0IHRoZSBwcm9ibGVtIEtldmluIFJvdGggaGFzCiAgcmVwb3J0ZWQsIGFuZCB0aGUgYnVnIHdhcyBmaXhlZC4KCi0gRHlsYW4gRWxsaWNvdHQgYWRkZWQgdmMtbGliY3VybC1zc2wtZGxsIGFzIGEgdGFyZ2V0IHRvIHRoZSByb290IG1ha2VmaWxlCiAgdG8gYnVpbGQgYSBzdGF0aWMgbGliY3VybCB0aGF0IGxpbmtzIHdpdGggYSBzaGFyZWQgT3BlblNTTCB1c2luZyBNU1ZDLgoKRGFuaWVsICgyMSBPY3RvYmVyKQotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmU1ICgyMSBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE5IE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBtYWRlIGxpYmN1cmwgb3V0cHV0IG1vcmUgaW5mbyBvbiBTU0wgZmFpbHVyZXMgd2hlbiByZWNlaXZpbmcKICBkYXRhLgoKVmVyc2lvbiA3LjEwLjgtcHJlNCAoMTggT2N0b2JlciAyMDAzKQoKRGFuaWVsICgxNyBPY3RvYmVyKQotIERvbWluaWNrIE1lZ2xpbyBpbXBsZW1lbnRlZCBDVVJMT1BUX01BWEZJTEVTSVpFIGFuZCAtLW1heC1maWxlc2l6ZS4KCi0gTWFkZSBsaWJjdXJsIHNob3cgdmVyYm9zZSBpbmZvIGFib3V0IHdoYXQgYXV0aCB0eXBlIGFuZCB1c2VyIG5hbWUgdGhhdCBpcwogIGJlaW5nIHNlbnQgaW4gaXRzIEhUVFAgcmVxdWVzdC1oZWFkZXJzLgoKRGFuaWVsICgxNiBPY3RvYmVyKQotIFJlbW92ZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLiBsaWJjdXJsCiAgbm8gbG9uZ2VyIHByb21wdCBmb3IgcGFzc3dvcmRzIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBQYXNzd29yZCBwcm9tcHRpbmcKICB3YXMgaW5zdGVhZCBtb3ZlZCB0byBjdXJsLCB3aGljaCBub3cgcHJvbXB0cyBmb3IgcGFzc3dvcmQgaWYgLXUgb3IgLVUgbGFjawogIGl0LiBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSBLZXZpbiBSb3RoIHJlcG9ydGVkIHdoZW4gY3VybCBwcm9tcHRlZCBmb3IKICBwYXNzd29yZCB0d2ljZSB3aGVuIGRvaW5nIE5UTE0gYXV0aGVudGljYXRpb24uCgotIEkgcmV3cm90ZSB0aGUgU1NMIHN1YmplY3RBbHROYW1lIGNoZWNrIHRvIGF2b2lkIGhhdmluZyB0byByZWx5IG9uIE9wZW5MREFQLQogIGxpY2Vuc2VkIGRlcml2YXRlIGNvZGUuCgpEYW5pZWwgKDE1IE9jdG9iZXIpCi0gQXZvaWQgZG9pbmcgZ2V0c29ja29wdCgpIG9uIFdpbmRvd3MgdG8gdmVyaWZ5IGNvbm5lY3RzLiBJdCBzZWVtcyB0aGF0IHRoaXMKICBob2dzIFdpbmRvd3MgbWFjaGluZXMgd2hlbiBsaWJjdXJsIGlzIGJlaW5nIHVzZWQgbXVsdGktdGhyZWFkZWQgKHdpdGggPiB+NTAKICB0aHJlYWRzKS4gQW5kcmV3IEZ1bGxlciBoZWxwZWQgdXMgdmVyaWZ5IGFuZCB0ZXN0IHRoaXMuCgpEYW5pZWwgKDE0IE9jdG9iZXIpCi0gS2ltbW8gS2lubnVuZW4gZml4ZWQgYSBjcmFzaCB3aXRoIGR1cGhhbmRsZSgpIHdoZW4gQ1VSTERFQlVHIGlzIHNldC4KCi0gR2lzbGUgVmFuZW0gbWFkZSBsaWJjdXJsIGJ1aWxkIGFuZCB3b3JrIHdpdGggSVB2NiBvbiBXaW5kb3dzLgoKRGFuaWVsICgxMyBPY3RvYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgcmVwb3J0ZWQgeWV0IGFub3RoZXIgc2VnZmF1bHQgd2l0aCBhcmVzIGFuZCB0aGUgbXVsdGkKICBpbnRlcmZhY2UuIE1lIGZpeGVkLgoKLSBEb21lbmljbyBBbmRyZW9saSByZW1vdmVkIHRoZSBleHRyYSBMREZMQUdTIGFzc2lnbm1lbnQgaW4gbGliL01ha2VmaWxlLmFtCiAgdGhhdCB3YXMgcmVwb3J0ZWQgYWJvdXQgaW4gdGhlIGRlYmlhbiBidWcgcmVwb3J0ICMyMTIwODYuCgogIERvbWVuaWNvIGFsc28gZml4ZWQgdHdvIG1ha2VmaWxlcyB3aGVyZSB3ZSB1c2VkICdnbnJvZmYnIGluc3RlYWQgb2YgdGhlIG1vcmUKICBwb3J0YWJsZSAkKE5ST0ZGKS4KCkRhbmllbCAoMTIgT2N0b2JlcikKLSBEaXJrIE1hbnNrZSBtYWRlIHRoZSBzaGFyZSBsb2NraW5nIGFyb3VuZCBETlMgbG9va3VwcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8KICBhbGxvdyB0aGUgc2hhcmUgc3lzdGVtJ3MgRE5TIGxvb2t1cHMgdG8gcnVuIHNvbWV3aGF0IG1vcmUKICBpbmRlcGVuZGVudC9mYXN0ZXIuCgpEYW5pZWwgKDkgT2N0b2JlcikKLSBMYWNobGFuIE8nRGVhIGZpeGVkIGEgcmVzdW1lIHByb2JsZW06ICJJZiBJIHNldCBDVVJMT1BUX1JFU1VNRV9GUk9NLCBwZXJmb3JtCiAgYW4gSFRUUCBkb3dubG9hZCwgdGhlbiByZXNldCBDVVJMT1BUX1JFU1VNRV9GUk9NIHRvIDAsIHRoZSBuZXh0IGRvd25sb2FkCiAgc3RpbGwgaGFzIGEgUmFuZ2UgaGVhZGVyIHdpdGggYSBnYXJiYWdlIHZhbHVlLiIgYnVnIHJlcG9ydCAjODIwNTAyCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIHRoZSBpbmV0X3B0b24uYyBmaWxlIGJ1aWxkIGZpbmUgdXNpbmcgTVNWQy4KCi0gVGhlICdzd3MnIHRlc3Qgc3VpdGUgd2ViIHNlcnZlciBub3cgI2luY2x1ZGUgc2V0dXAuaCBmcm9tIHRoZSBsaWIgZGlyZWN0b3J5LgogIFRoaXMgbWFrZXMgaXQgbW9yZSBwb3J0YWJsZSBlYXNpZXIuCgpWZXJzaW9uIDcuMTAuOC1wcmUzICg4IE9jdG9iZXIgMjAwMykKCkRhbmllbCAoOCBPY3RvYmVyKQotIEZyYW5rIFRpY2hlbGVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBmaXhlcyBob3cgbGliY3VybCBjb25uZWN0cyB0byBtdWx0aXBsZQogIGFkZHJlc3NlcywgaWYgb25lIG9mIHRoZW0gZmFpbHMgKGlwdjQtY29kZSkuCgpEYW5pZWwgKDcgT2N0b2JlcikKLSBOZWlsIER1bmJhciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgY2hlY2sgU1NMCiAgc3ViamVjdEFsdE5hbWVzIHdoZW4gbWF0Y2hpbmcgY2VydHMuIFRoaXMgaXMgYXBwYXJlbnRseSBkZXRhaWxlZCBpbiBSRkMyODE4CiAgYXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBJIGhhZCB0byBhZGQgY29uZmlndXJlIGNoZWNrcyBmb3IgaW5ldF9wdG9uKCkgYW5kCiAgb3VyIG93biAoc3RyaWN0bHkgc3BlYWtpbmcsIGNvZGUgZnJvbSBCSU5EIHdyaXR0ZW4gYnkgUGF1bCBWaXhpZSkgcHJvdmlkZWQKICBjb2RlIGZvciB0aGUgZnVuY3Rpb24gZm9yIHBsYXRmb3JtcyB0aGF0IG1pc3MgaXQuCgotIEhUVFAgUE9TVCB1c2luZyB0aGUgcmVhZCBjYWxsYmFjayBkaWRuJ3Qgd29yaywgYXMgRmxvcmlhbiBTY2hvcHBtYW5uCiAgcmVwb3J0ZWQuCgpEYW5pZWwgKDUgT2N0b2JlcikKLSBTaGFyZWQgcHJvdmlkZWQgYSBmZXcgZml4ZXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG9uIEJlT1MKICBvdXQtb2YtdGhlLWJveC4gTmV3IGNvZGUgZm9yIEJlT1Mtc3R5bGUgbm9uLWJsb2NraW5nIHNvY2tldHMsIHByb3ZpZGVkIGJ5CiAgU2hhcmQgYW5kIEplcmVteSBGcmllc25lci4gTW9kaWZpZWQgdGhlIGF1dG9jb25mIGNoZWNrIGZvciBub24tYmxvY2tpbmcKICBzb2NrZXRzIHRvIGNoZWNrIGZvciB0aGlzIGtpbmQgdG9vLgoKRGFuaWVsICg0IE9jdG9iZXIpCi0gVmluY2VudCBCcm9ubmVyIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHNldCBDVVJMT1BUX0NPT0tJRSBmb3IgYSB0cmFuc2ZlcgogIGFuZCB0aGVuIHNldCBpdCB0byBOVUxMIGluIGEgc3Vic2VxdWVudCBvbmUsIHRoZSBwcmV2aW91cyBjb29raWUgd2FzIHN0aWxsCiAgc2VudCBvZmYhCgotIEpvbiBUdXJuZXIgZml4ZWQgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gaXQgZmFpbGVkIG9uIGFuIEZUUCB0cmFuc2ZlciBkdWUKICB0byBhIGJhZCBwYXRoLCBpdCB3b3VsZCBjYXVzZSB0aGUgbmV4dCB0cmFuc2ZlciB0byB1c2UgYSBiYWQgcGF0aCBhcyB3ZWxsLgoKLSBTaWRkaGFydGhhIFByYWthc2ggSmFpbiBwcm92aWRlZCBhIHBhdGNoIHdpdGggYSBmaXggZm9yIGxpYmN1cmwgd2l0aCBhcmVzLAogIHdoZW4gd29ya2luZyBvbiBJUC1vbmx5IG5hbWVzIGFzIHdlIHRoZW4gY291bGQgcmV0dXJuICJ3YWl0IiBzdGF0dXMgd2hlbiB0aGUKICBuYW1lIGluIGZhY3QgYWxyZWFkeSB3YXMgcmVzb2x2ZWQuIEkgZWRpdGVkIHRoZSBwYXRjaCBzbGlnaHRseSB0byBub3QgZXhwb3NlCiAgYXN5bmNoIGRldGFpbHMgdG8gbm9uLWFyZXMgYXdhcmUgc291cmNlIGNvZGUuCgpEYW5pZWwgKDMgT2N0b2JlcikKLSBOZWlsIFNwcmluZyBwb3N0ZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICMyMTMxODAsIGFuZCBwb2ludGVkIG91dCB0aGF0IHVzaW5nCiAgdGhlIG5hbWUgJ2FjY2VzcycgaW4gYSBmdW5jdGlvbiBwcm90b3R5cGUgaXMgbm90IHZlcnkgd2lzZSBhcyBzb21lIGNvbXBpbGVycwogIGNvbXBsYWluLgoKLSBQZXRlciBTeWx2ZXN0ZXIgcHJvdmlkZWQgaGlzIGFuZCBKZWFuLVBhdWwgTWVybGluJ3MgY3VybHguYyBleGFtcGxlIHNvdXJjZQogIGNvZGUgdGhhdCBzaG93cyBob3cgdGhleSB1c2Ugc3NsIGFuZCBjYWxsYmFja3MuCgpEYW5pZWwgKDIgT2N0b2JlcikKLSBKYW1lcyBNYWNNaWxsYW4ncyBwYXRjaCBtYWtlcyBjdXJsIGJ1aWxkIG9uIFFOWCA2LjIueC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyKQotIE15IGRhdWdodGVyIHdhcyBib3JuIQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIpCi0gQWRkZWQgc3VwcG9ydCBmb3IgLTQvLS1pcHY0IGFuZCAtNi8tLWlwdjYgdG8gZm9yY2UgbmFtZXMgdG8gcmVzb2x2ZSB0byB0aGF0CiAgcGFydGljdWxhciBJUCB2ZXJzaW9uLiBUaGV5IG9ubHkgd29yayBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKLSBjdXJsIC1WIG5vdyBvdXRwdXRzICdTUE5FR08nIGFzIGEgZmVhdHVyZSBpbiBjYXNlIGxpYmN1cmwgd2FzIGJ1aWx0IHRvCiAgc3VwcG9ydCB0aGF0LgoKVmVyc2lvbiA3LjEwLjgtcHJlMiAoMjIgU2VwdGVtYmVyIDIwMDMpCgpEYW5pZWwgKDIyIFNlcHRlbWJlcikKLSBHaXVzZXBwZSBBdHRhcmRpIGZvdW5kIGEgc2VnZmF1bHQgaW4gbGliY3VybCB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB3aXRoIGFyZXMgYW5kIGRvaW5nIHJlcGVhdGVkIG9wZXJhdGlvbnMgYWdhaW5zdCBhIG5vbi1yZXNvbHZpbmcgaG9zdCBuYW1lLgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIpCi0gQWRkZWQgdGhlIENVUkxPUFRfSVBSRVNPTFZFIG9wdGlvbiwgdGhhdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2VsZWN0CiAgd2hhdCBraW5kIG9mIElQIGFkZHJlc3NlcyBoZSB3YW50cyB0byB1c2Ugd2hlbiByZXNvbHZpbmcgaG9zdCBuYW1lcy4gVGhpcwogIGlzIG9ubHkgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyBob3N0IG5hbWVzIHRoYXQgcmVzb2x2ZSBhZGRyZXNzZXMgdXNpbmcgbW9yZQogIHRoYW4gb25lIHZlcnNpb24gb2YgSVAuCgotIEFwcGxpZWQgTWFya3VzIE1vZWxsZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZXMgU1BORUdPIHN1cHBvcnQgaWYgbGliY3VybAogIGlzIGJ1aWx0IHdpdGggdGhlIEZCb3BlbnNzbCBsaWJyYXJpZXMuIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMKICBpbmZvIG9uIFNQTkVHTyBhdmFpbGFiaWxpdHkuIFRoZSBwYXRjaCBhbHNvIG1hZGUgdGhlIEdTU0FQSSBzdHVmZiB3b3JrIGZpbmUKICB3aXRoIHRoZSBNSVQgR1NTLWxpYnJhcnkgKHRoZSBIZWltZGFsIG9uZSBzdGlsbCB3b3JrcyB0b28pLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIpCi0gRG9pbmcgUFVUIHdpdGggLS1kaWdlc3QgZmFpbGVkLCBhcyByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM4MDU4NTMuCgotIFVzaW5nIC0tYW55YXV0aCB0aGF0IHBpY2tlZCBOVExNLCBhbmQgdGhlbiBhIHJlZGlyZWN0IGNsb3NlZCB0aGUgY29ubmVjdGlvbgogIGFuZCB0b29rIGN1cmwgdG8gYSBzZWNvbmQgTlRMTSBwYWdlIG1hZGUgY3VybCBmYWlsLiBCdWcgcmVwb3J0ICM4MDYzMjgKICBpZGVudGlmaWVkIHRoZSBwcm9ibGVtLCB0ZXN0IGNhc2UgOTAgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxNCBTZXB0ZW1iZXIpCi0gY29kZW1hc3RyIGJyb3VnaHQgYSBwYXRjaCBmb3IgYXJlcyB0byBtYWtlIHRoZSBXaW5kb3dzIHBvcnRpb25zIG9mIGl0IHdvcmsKICBwcm9wZXJseSBvbiBOVDQuIEkgdXBsb2FkZWQgYSBuZXcgZGlmZiBhbmQgdXBkYXRlZCB0aGUgZG9jcyBvbiB3aGVyZSB0byBnZXQKICBpdCBldGMuCgotIEplZmYgUG9obG1leWVyIHRyYWNrZWQgZG93biBhIHZlcnkgaGFyZC10by1maW5kIGJ1ZyB3aGVyZSB3ZSByZW1vdmVkIGEKICBjYWNoZWQgRE5TIGVudHJ5IGV2ZW4gdGhvdWdoIGl0IG1heSBiZSBpbiB1c2UsIHdoaWNoIGNhdXNlZCAicmFuZG9tIiBtZW1vcnkKICB0byBnZXQgb3ZlcndyaXR0ZW4gYW5kIHRodXMgInJhbmRvbSIgY3Jhc2hlcy4KCkRhbmllbCAoMTIgU2VwdGVtYmVyKQotIEJhc2VkIG9uIGEgYnVnIHJlcG9ydCBieSBEYXZpZCBLaW1kb24sIEkgbWFkZSB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNsZWFyCiAgYWxsIHBvc3NpYmxlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgdGhlIHRlc3RzIGFyZSBydW4uCgotIEJ5IGRlZmF1bHQsIGVhc3kgaGFuZGxlcyB3aXRoaW4gYSBtdWx0aSBoYW5kbGUgbm93IHNoYXJlIEROUyBjYWNoZS4KCi0gVGltIEJhcnRsZXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIEdTU05FR09USUFURSBvcHRpb24gd29yayBmb3IKICBNaWNyb3NvZnQncyAiTmVnb3RpYXRlIiBhdXRoZW50aWNhdGlvbiBhcyB3ZWxsLgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIpCi0gQSB6ZXJvLWxlbmd0aCBwcm94eSBzdHJpbmcgY29uZnVzZWQgRlRQIHRyYW5zZmVycy4KCi0gQmpvcm4gUmVlc2UgZm91bmQgYSBjYXNlIHdpdGggYW4gdW5pbml0aWFsaXplZCBwb2ludGVyLCBvbmx5IHByZXNlbnQgd2hlbgogIGJ1aWx0IGZvciBhcmVzLgoKVmVyc2lvbiA3LjEwLjgtcHJlMSAoOCBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoNyBTZXB0ZW1iZXIpCi0gSnVyaWogU21ha292IGZvdW5kIG91dCB0aGF0IHRoZSBub24tT3BlblNTTCBNRDUgY29kZSB3YXMgbm90IHdvcmtpbmcgb24KICBBbHBoYSAob3IgaWE2NCkuIE9ubHkgdGhlIE9wZW5TU0wtdmVyc2lvbiBkaWQuIEkgbWFkZSBhIGZpeCBJIHRoaW5rIGNvcnJlY3RzCiAgdGhlIHByb2JsZW0uIAoKRGFuaWVsICg1IFNlcHRlbWJlcikKLSBLZXZpbiBGaXNrIHJlcG9ydGVkIHRoYXQgY29uZmlndXJlIC0tZW5hYmxlLXRocmVhZCBkaWRuJ3Qgd29yay4gSSBmaXhlZC4KCi0gRGUtbWFjcm9maWVkIHRoZSBsaWIvaGFzaC5jIHNvdXJjZSBjb2RlIHNvbWV3aGF0LgoKRGFuaWVsICg0IFNlcHRlbWJlcikKLSBDVVJMSU5GT19IVFRQQVVUSF9BVkFJTCBhbmQgQ1VSTElORk9fUFJPWFlBVVRIX0FWQUlMIGFkZGVkLCBCYXNlZCBvbiBKb2VyZwogIE11ZWxsZXItVG9saydzIHBhdGNoLAoKRWFybHkgKDQgU2VwdGVtYmVyKQotIEFkZGVkIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQgLSBhbGxvd3MgdXNlciB0byBzZXQgc3RyaWN0IHRpbWVvdXQKICByZXF1aXJlbWVudHMgb24gdGhlIEZUUCBzZXJ2ZXIncyBhYmlsaXR5IHRvIHJlc3BvbmQgdG8gaW5kaXZpZHVhbCBjb21tYW5kcwogIHdpdGhvdXQgcGxhY2luZyBnbG9iYWwgcmVxdWlyZW1lbnRzIG9uIHRyYW5zZmVyIG9yIGNvbm5lY3QgdGltZS4gIEZpbGVzCiAgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBicmFuY2ggaW5zaWRlIEN1cmxfR2V0RlRQUmVzcG9uc2UgdG8gY2hlY2sgZm9yIAogICAgICAgIGRhdGEtPnNldC5mdHBfcmVzcG9uc2VfdGltZW91dAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX3Jlc3BvbnNlX3RpbWVvdXQgdG8gc3RydWN0IFVzZXJEZWZpbmVkCgpEYW5pZWwgKDMgU2VwdGVtYmVyKQotIFBldGVyIFBlbnRjaGV2IGZvdW5kIGFuZCBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHRlc3Qgc3VpdGUncyB3ZWIgc2VydmVyCiAgY29kZSwgdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGF0IHRpbWVzLgoKLSBK9nJnIE11ZWxsZXItVG9sayBpbXByb3ZlZCB0aGUgcHJveHkgdXNlcitwYXNzd29yZCBoYW5kbGluZywgZXNwZWNpYWxseQogIHdoZW4gcHJvdmlkaW5nIGEgYmxhbmsgcGFzc3dvcmQuCgpEYW5pZWwgKDIgU2VwdGVtYmVyKQotIEZpeCBmb3IgbWFraW5nIENPTk5FQ1QgdG8gcHJveGllcyBkbyB0aGUgY29ycmVjdCBtYWdpYyB0byBhbGxvdyBOVExNLCBEaWdlc3QKICBhbmQgc2ltaWxhciB0byB3b3JrLgoKRGFuaWVsICgxIFNlcHRlbWJlcikKLSBIZW5yaWsgU3Rvcm5lciBtYWRlIGxpYmN1cmwgd29yayBmaW5lIHdpdGggT3BlbkxEQVAgMi4xLjIyIChjdXJyZW50KS4KCi0gSmVmZiBQb2hsbWV5ZXIgYWRkZWQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSBmb3Igbm9uLXJlc29sdmluZyBob3N0cyB3aGVuCiAgdXNpbmcgYXJlcyBmb3IgbG9va3Vwcy4KCkRhbmllbCAoMjUgQXVndXN0KQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCB0aGF0IGN1cmwgLWsgc3RpbGwgZmFpbGVkIGlmIHRoZSBIVFRQUyBzZXJ2ZXIncyBDTgogIGZpZWxkIHdhc24ndCBvYnRhaW5hYmxlLiBUaGlzIHdhcyBkdWUgdG8gdGhlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgYmVpbmcKICBzZXQgdG8gMSwgYW5kIGxpYmN1cmwgZmFpbGVkIGlmIHRoZSBDTiB3YXMgbWlzc2luZy4gU3RhcnRpbmcgbm93LCBoYXZpbmcgaXQKICBzZXQgdG8gMSB3aWxsIHNpbXBseSBvdXRwdXQgYSB3YXJuaW5nIGlmIG5vIENOIGNvdWxkIGJlIG9idGFpbmVkIChhcyBoYXZpbmcKICBhIG1pc21hdGNoIGlzIE9LKS4KCkRhbmllbCAoMjEgQXVndXN0KQotIFZpbmNlbnQgU2FuZGVycyBwcm92aWRlZCBhIGZpeCBmb3IgbmFtZSByZXNvbHZpbmcgd2hlbiBsaW5rZWQgd2l0aCB1Q2xpYmMuCgpEYW5pZWwgKDIwIEF1Z3VzdCkKLSBHZXJkIHYuIEVnaWR5IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHN0b3JlIHRoZSBGVFAgcmVzcG9uc2UKICBjb2RlIGZyb20gZnRwIHNlcnZlcnMuIFVzaW5nIGN1cmxfZWFzeV9nZXRpbmZvKCkgd2l0aCBDVVJMSU5GT19IVFRQX0NPREUKICByZXR1cm5zIHRoYXQgZGF0YS4gVGhlIG9wdGlvbiBpcyB0aGVyZWZvcmUgbm93IGFsc28ga25vd24gYXMKICBDVVJMSU5GT19SRVNQT05TRV9DT0RFLgoKLSBBbnRvaW5lIENhbGFuZG8gZm91bmQgYSBzZWdmYXVsdCB3aGVuIGRvaW5nIG11bHRpLXBhcnQvZm9ybXBvc3QgdXNpbmcKICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKLSBBbnRvaW5lIENhbGFuZG8gcG9pbnRlZCBvdXQgdGhhdCBjdXJsX211bHRpX2luZm9fcmVhZCgpIGRpZG4ndCBzZXQgdGhlCiAgbXNnc19pbl9xdWV1ZSB0byAwIHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIE5VTEwuCgpEYW5pZWwgKDE5IEF1Z3VzdCkKLSBJIG1hZGUgY3VybCBzdXBwb3J0IG11bHRpcGxlIC1UIG9wdGlvbnMsIGFzIHdlbGwgYXMgLVQgIntmaWxlMSxmaWxlMn0iCiAgc3R5bGUgZ2xvYmJpbmcuIE9uZSAtVCBmb3IgZWFjaCBVUkwgaXMgc3VwcG9ydGVkLgoKLSBKZWZmIFBvaGxtZXllciBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gdXNpbmcgYXJlcy1lbmFibGVkIGxpYmN1cmwgYW5kIHRoZQogIG11bHRpIGludGVyZmFjZSB3aGVuIHRyeWluZyBhIG5vbi1leGlzdGluZyBob3N0IG5hbWUuCgotIE1hZGUgdGhlIGxpYmN1cmwgcHJpbnRmIGNvZGUgc3VwcG9ydCBsb25nIGxvbmdzIGlmIGF2YWlsYWJsZS4KCi0gTG9yZW4gS2lya2J5IHBvaW50ZWQgb3V0IHRoYXQgd2UgZGlkIG5vdCBjbGVhbiB1cCBhbGwgU1NMLWFsbG9jYXRlZCBtZW1vcnkKICBpbiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCgpEYW5pZWwgKDE3IEF1Z3VzdCkKLSBTZXR0aW5nIENVUkxPUFRfV1JJVEVGVU5DVElPTiBvciBDVVJMT1BUX1JFQURGVU5DVElPTiB0byBOVUxMIHdpbGwgbm93IG1ha2UKICB0aGVtIGdldCB0aGUgaW50ZXJuYWwgZGVmYXVsdHMgcmVzdG9yZWQuIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQuIFdlIHNob3VsZCBhaW0gYXQgaGF2aW5nIGFsbCBwb2ludGVyLXJlbGF0ZWQgb3B0aW9ucyBnZXQgcmVzdG9yZWQKICB0byBkZWZhdWx0L3NhZmUgdmFsdWVzIHdoZW4gc2V0IHRvIE5VTEwuCgpWZXJzaW9uIDcuMTAuNyAoMTUgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDE0IEF1Z3VzdCkKLSBJIG1vZGlmaWVkIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0gdG8gcmV0dXJuIGZhaWx1cmUgb24gbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHN1Y2Nlc3NmdWwgb25lcy4gVGhpcyBlbmFibGVzIHVzIHRvIHRlc3QKICBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciBhbmQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0CiAgY3VybC9saWJjdXJsIGJlaGF2ZXMgZ29vZCBpbiB0aG9zZS4KCiAgVGhpcyBtYWRlIG1lIGZpbmQgYW5kIGZpeCBzZXZlcmFsIHNwb3RzIHdoZXJlIHdlIGRpZCBub3QgY2xlYW51cCBwcm9wZXJseQogIHdoZW4gYmFpbGluZyBvdXQgZHVlIHRvIGVycm9ycyAobG93IG1lbW9yeSkuCgotIENvcnJlY3RlZCB0ZXN0IGNhc2UgNzQuIE1hZGUgdXNpbmcgLW8gd2l0aCBiYWQgI1tudW1dIGNvZGVzIGNvbXBsYWluIGFuZAogIGJhaWwgb3V0LiBNYWRlICNbbnVtXSBzdXBwb3J0IG51bWJlcnMgbGFyZ2VyIHRoYW4gOSBhcyB3ZWxsLiBBZGRlZCB0ZXN0CiAgY2FzZSA4NiBmb3IgYSBwcm9wZXIgcmFuZ2UgZ2xvYmJpbmcgdGVzdCBhcyB3ZWxsLgoKVmVyc2lvbiA3LjEwLjctcHJlNCAoMTIgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDEyIEF1Z3VzdCkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgZmxhZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFzeW5jaCBETlMKICBzdXBwb3J0LCBhbmQgdGhpcyBpcyBub3cgYWxzbyBkaXNwbGF5ZWQgd2l0aCAnY3VybCAtVicuCgotIEFkZGVkIGEgZmV3IG5ldyBtYW4gcGFnZXMgdG8gdGhlIGRvY3MvbGliY3VybCBkaXI6IGN1cmxfc2hhcmVfaW5pdCwKICBjdXJsX3NoYXJlX3NldG9wdCwgY3VybF9zaGFyZV9jbGVhbnVwLCBsaWJjdXJsLWVhc3kgYW5kIGxpYmN1cmwtc2hhcmUuCgpEYW5pZWwgKDExIEF1Z3VzdCkKLSBNaWtlIENoZXJlcG92IG1hZGUgdGhlIGxvY2FsIGJpbmRpbmcgY29kZSB3b3JrIGZvciBXaW5kb3dzLCB3aGljaCBtYWtlcwogIHRoZSBvcHRpb24gQ1VSTE9QVF9JTlRFUkZBQ0Ugd29yayBvbiBXaW5kb3dzIGFzIHdlbGwuCgotIFZpbmNlbnQgU2FuZGVycyB1cGRhdGVkIHRoZSBmb3Blbi5jIGV4YW1wbGUgY29kZSBhIGxvdC4KCi0gLS1wcm94eS1udGxtIGlzIG5vdyBzdXBwb3J0ZWQgYnkgdGhlIGN1cmwgdG9vbC4gSXQgZm9yY2VzIHRoZSBwcm94eQogIGF1dGhlbnRpY2F0aW9uIHRvIGJlIG1hZGUgdXNpbmcgTlRMTS4gSXQgZG9lcyBub3QgeWV0IHdvcmsgZm9yIEhUVFBTIG92ZXIKICBwcm94aWVzIChvciBvdGhlciBwcm94eS10dW5uZWxpbmcgb3B0aW9ucykuIFRlc3QgY2FzZSA4MSBhbmQgODIgZG8gc29tZQogIHNpbXBsZSBpbml0aWFsIG50bG0gdGVzdGluZy4KCi0gRm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcmUtdXNlZCBjb25uZWN0aW9ucyB3aXRoCiAgcHJveHktYXV0aGVudGljYXRpb24uCgotIEkgcmVtb3ZlZCAtQCBhbmQgLVogYXMgdmFsaWQgc2hvcnQgb3B0aW9ucy4gVGhleSB3ZXJlIHZlcnkgcmFyZWx5IHVzZWQgKEAKICB3YXNuJ3QgZXZlbiBkb2N1bWVudGVkKS4KCi0gU2VyZ2UgU2VtYXNoa28gaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZQVVUSCwgYW5kIG1ha2UgaXQgd29yayB3aGVuIHNldCB0bwogIENVUkxBVVRIX05UTE0gYW5kL29yIENVUkxBVVRIX0JBU0lDLiBUaGUgUFJPWEFVVEggaXMgc2ltaWxhciB0byBIVFRQQVVUSCwKICBidXQgaXMgZm9yIHRoZSBwcm94eSBjb25uZWN0aW9uIG9ubHksIGFuZCBIVFRQQVVUSCBpcyBmb3IgdGhlIHJlbW90ZSBob3N0LgoKLSBGaXhlZCBsb2FkaW5nIG9mIGNvb2tpZXMgd2l0aCBibGFuayBjb250ZW50cyBmcm9tIGEgY29va2llIGphci4gQWxzbyBtYWRlIHRoZQogIGNvb2tpZSBmdW5jdGlvbnMgaW5mb3JtIG9uIGFkZGVkIGFuZCBza2lwcGVkIGNvb2tpZXMgKGZvciBjb29raWUgZGVidWdnaW5nKS4KClZlcnNpb24gNy4xMC43LXByZTMgKDggQXVndXN0IDIwMDMpCgpEYW5pZWwgKDggQXVndXN0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBmaXggZm9yIGZpbGU6Ly8gVVJMcyB3aXRoIGRyaXZlIGxldHRlcnMgaW5jbHVkZWQuCgotIEkgYWRkZWQgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHRvIHRoZSBjbGllbnQgY29kZSwgd2hpY2ggYWN0aXZhdGVzIEVhcmx5J3MKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiwgYW5kIHdyb3RlIHRlc3QgY2FzZSAxNDcgdG8gdmVyaWZ5CiAgaXQuIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlIGN1cmwuMSBtYW4gcGFnZSB0b28uIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlCiAgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHRvby4KCkRhbmllbCAoNyBBdWd1c3QpCi0gVGVzdCBjYXNlIDYwIGZhaWxlZCBvbiBpYTY0IGFuZCBBTUQgT3B0ZXJvbi4gRml4ZWQgbm93LgoKLSBGaXhlZCBhIHByaW50ZiBwcm9ibGVtIHRoYXQgcmVzdWx0ZWQgaW4gdXJsZ2xvYmJpbmcgYnVncyAoYnVnICMyMDM4MjcgaW4gdGhlCiAgZGViaWFuIGJ1ZyB0cmFja2VyKS4gQWRkZWQgdGVzdCBjYXNlIDc0IHRvIHZlcmlmeSB0aGUgZml4IGFuZCB0byBkaXNjb3ZlciBpZgogIHRoaXMgYnJlYWtzIGluIHRoZSBmdXR1cmUuCgotICJtYWtlIGRpc3RjaGVjayIgd29ya3MgYWdhaW4uCgpWZXJzaW9uIDcuMTAuNy1wcmUyICg2IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg1IEF1Z3VzdCkKLSBEdW5jYW4gV2lsY294IGhlbHBlZCBtZSB2ZXJpZnkgdGhhdCB0aGUgbGF0ZXN0IGluY2FybmF0aW9uIG9mIG15IGFyZXMgcGF0Y2gKICBidWlsZHMgZmluZSBvbiBNYWMgT1MgWCAoc2VlIHRoZSBuZXcgbGliL1JFQURNRS5hcmVzKSBmaWxlIGZvciBhbGwgZGV0YWlscy4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNzgzMTE2IGFuZCBFYXJseSBFaGxpbmdlciBwb3N0ZWQgYQogIGJ1ZyByZXBvcnQgdG8gdGhlIGxpYmN1cmwgbGlzdCwgYm90aCBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCBGVFAKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBob3cgdGhlIGRpciBoaWVyYXJjaHkgd2FzIG5vdCBwcm9wZXJseSByZXNldAogIGJldHdlZW4gZmlsZXMuCgotIERhdmlkIEJ5cm9uJ3MgdGhvdWdodHMgb24gYSBmaXhlZCBNYWtlZmlsZSBpbiB0ZXN0cy8gd2VyZSBhcHBsaWVkLgoKLSBKYW4gU3VuZGluIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBjdXJsIGlnbm9yZWQgYSBjb29raWUgdGhhdCBicm93c2VycyBkb24ndCwKICB3aGljaCB0dXJuZWQgdXAgdG8gYmUgZHVlIHRvIHRoZSBudW1iZXIgb2YgZG90cyBpbiB0aGUgJ2RvbWFpbicuIEkndmUgbm93CiAgbWFkZSBjdXJsIGZvbGxvdyB0aGUgdGhlIG9yaWdpbmFsIG5ldHNjYXBlIGNvb2tpZSBzcGVjIGxlc3Mgc3RyaWN0IG9uIHRoYXQKICBwYXJ0LgoKRGFuaWVsICg0IEF1Z3VzdCkKLSBEaXJrIE1hbnNrZSBhZGRlZCBjb29raWUgc3VwcG9ydCBmb3IgdGhlIGV4cGVyaW1lbnRhbCwgaGlkZGVuIGFuZCBzdGlsbAogIHVuZG9jdW1lbnRlZCBzaGFyZSBmZWF0dXJlIQoKLSBNYXJrIEZsZXRjaGVyIHByb3ZpZGVkIGFuIGV4Y2VsbGVudCBidWcgcmVwb3J0IHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIEZPTExPV0xPQ0FUSU9OIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLCBhcyBsaWJjdXJsIHdvdWxkIG5vdAogIHByb3Blcmx5IGlnbm9yZSB0aGUgYm9keSBjb250ZW50cyBvZiAzWFggcmVzcG9uc2UgdGhhdCBpbmNsdWRlZCB0aGUKICBMb2NhdGlvbjogaGVhZGVyLgoKRWFybHkgKDYgQXVndXN0KQotIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICBUaGlzIG9wdGlvbiB3aWxsIGZvcmNlIHRoZSB0YXJnZXQgZmlsZSdzIHBhdGggdG8gYmUgY3JlYXRlZCBpZiBpdAogICAgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KIAogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX21rZCwgd2hpY2ggaXNzdWVzIGEgTUtEIGNvbW1hbmQKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfZm9yY2VfY3dkLCB3aGljaCBhdHRlbXB0cyBhIENXRCwKICAgICAgICAgIGFuZCBkb2VzIGEgTUtEIGFuZCByZXRyaWVzIHRoZSBDV0QgaWYgdGhlIG9yaWdpbmFsIENXRAogICAgICAgICAgZmFpbHMKICAgICAgICBNb2RpZmllZCBmdHBfcGVyZm9ybSgpIHRvIGNhbGwgaXRzIGNoYW5nZSBkaXJlY3RvcnkgZnVuY3Rpb24KICAgICAgICAgIHRocm91Z2ggYSBwb2ludGVyLiAgVGhlIHBvaW50ZXIgcG9pbnRzIHRvIGZ0cF9jd2QgYnkgZGVmYXVsdCwKICAgICAgICAgIGFuZCBpcyBtb2RpZmllZCB0byBwb2ludCB0byBmdHBfZm9yY2VfY3dkIElGRgogICAgICAgICAgZGF0YS0+c2V0LmZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIGlzIG5vdCAwLiAgICAgICAgCiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfY3JlYXRlX21pc3NpbmdfZGlycyB0byBzdHJ1Y3QgVXNlckRlZmluZWQKICAgICAgIAotIE1pbm9yIEJ1Z2ZpeCBmb3IgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdpdGggRlRQIC0gaWYgdGhlIGZpbGUgd2FzIG5vdAogIHByZXNlbnQgdG8gZG8gdGhlIHRpbWUgY29tcGFyaXNvbiwgaXQgd291bGQgZmFpbC4KICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgSW4gZnRwX3BlcmZvcm0oKSwgdGhlIGNhbGwgdG8gZnRwX2dldGZpbGV0aW1lKCkgdXNlZCB0byBiZSBmb2xsb3dlZAogICAgICAgIGJ5CgkgIGlmIChyZXN1bHQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgQW5kIHRoZW4gYnkgdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBkaWQgdGhlIHRpbWUgY29tcGFyaXNvbi4KICAgICAgICBUaGUgY29kZSB0aGF0IGRpZCB0aGUgY29tcGFyaXNvbiBoYW5kbGVkIHRoZSBjYXNlIHdoZXJlIHRoZSBmaWxldGltZQogICAgICAgIHdhcyBub3QgYXZhaWxhYmxlIChhcyBpbmRpY2F0ZWQgYnkgaW5mby5maWxldGltZSA8IDAgb3Igc2V0LnRpbWV2YWx1ZSAKICAgICAgICA8IDApLCBzbyBJIHJlcGxhY2VkIHRoZSBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0IHdpdGggYSBzd2l0Y2gocmVzdWx0KQogICAgICAgIHRoYXQgYWxsb3dzIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRSB0byBmYWxsIHRocm91Z2ggdG8gdGhlIAogICAgICAgIG5vcm1hbCB0aW1lIGNvbXBhcmlzb24uCgpEYW5pZWwgKDMgQXVndXN0KQotIFdoZW4gcHJveHkgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiBhIENPTk5FQ1QgcmVxdWVzdCAoYXMgdXNlZCBmb3IgYWxsIFNTTAogIGNvbm5lY3RzIGFuZCBvdGhlcndpc2UgZW5mb3JjZWQgdHVubmVsLXRocnUtcHJveHkgcmVxdWVzdHMpLCB0aGUgc2FtZQogIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBpcyBhbHNvIHdyb25nbHkgc2VudCB0byB0aGUgcmVtb3RlIGhvc3QuCgogIFRoaXMgaXMgYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5mbyBsZWFrLiBJJ3ZlIGZpeGVkIGl0IG5vdyBhbmQgbWFpbGVkIGEgcGF0Y2gKICBhbmQgd2FybmluZyB0byB0aGUgbWFpbGluZyBsaXN0cy4KCkRhbmllbCAoMSBBdWd1c3QpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIDcuMTAuNiBidWlsZCBjb3JyZWN0bHkgd2l0aCB0aGUKICBjb21wcmVzc2VkIGh1Z2VoZWxwLmMgc291cmNlIGZpbGUuCgpWZXJzaW9uIDcuMTAuNy1wcmUxICgzMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDMwIEp1bHkpCi0gSvZyZyBN/GxsZXItVG9sayB1cGRhdGVkIHRoZSBWQyBtYWtlZmlsZS4KCi0gRGFuaWVsIE5vZ3Vlcm9sIG1hZGUgdGhlIGZ0cCBjb2RlIG91dHB1dCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGluIHNpbWlsYXIKICBzdHlsZSBsaWtlIG90aGVyIGZha2VkIEhUVFAgaGVhZGVycyB3aGVuIE5PQk9EWSBhbmQgSEVBREVSIGFyZSB1c2VkLiBJCiAgdXBkYXRlZCB0d28gY29ycmVzcG9uZGluZyB0ZXN0IGNhc2VzIHRvby4KCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIFZNUyBkdWUgdG8gbXkgaGF2aW5nCiAgY2hhbmdlZCBhIHR5cGUgZnJvbSBsb25nIHRvIHRpbWVfdCwgYW5kIEknbSBub3cgY2hhbmdpbmcgaXQgYmFjayB0byB3b3JrCiAgbW9yZSBwb3J0YWJseS4uLgoKICBIZSBhbHNvIGluZGljYXRlZCB0aGF0IGRpc3RyaWJ1dGluZyB0aGUgc3JjL2h1Z2VoZWxwLmMgaW4gYSBjb21wcmVzc2VkIHN0YXRlCiAgbGlrZSBJIGFjY2lkZW50YWxseSBkaWQgbWF5IG5vdCBiZSB0aGUgc21hcnRlc3QgbW92ZS4uLiBJJ3ZlIG5vdyBmaXhlZCB0aGUKICBkaXN0cmlidXRlIHByb2NlZHVyZSB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIHdoZW4gSQogIG1ha2UgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMjkgSnVseSkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNoYW5nZXMgdG8gdGhlIG1raGVscCBzY3JpcHQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQogIGNvbXByZXNzZWQgaGVscCB0ZXh0IG9uIHNvbWUgcGxhdGZvcm1zLgoKVmVyc2lvbiA3LjEwLjYgKDI4IEp1bHkgMjAwMykKCkRhbmllbCAoMjggSnVseSkKLSBGcmFu529pcyBQb25zIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG9uY2UgYWdhaW4gbWFkZSBjdXJsIGRlYWwgd2l0aCBmdHAgYW5kCiAgImRvdWJsZSBzbGFzaCIgYXMgaW5kaWNhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkuIEluIHRoZSBSRkMxNzM4LWZpeCBvZiBBcHJpbAogIDMwLCB0aGF0IGFiaWxpdHkgd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdCB0aGUgInJpZ2h0IiB3YXkpLiBTbywgc3RhcnRpbmcKICBub3cgd2UgY2FuIGxpc3QgdGhlIHJvb3QgZGlyIG9mIGFuIGZ0cCBzZXJ2ZXIgYm90aCB0aGVzZSB3YXlzOgoKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8lMmYgIGFzIHdlbGwgYXMKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8vCgpEYW5pZWwgKDI0IEp1bHkpCi0gSGVucnkgQmxhbmQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBpbmNsdWRlZCBzeXMvcmVzb3VyY2UuaCB3aXRob3V0IGdvb2QgcmVhc29uCiAgaW4gc2V2ZXJhbCBzb3VyY2UgZmlsZXMuIFdpdGhvdXQgaXQgaW5jbHVkZWQsIFFOWCBidWlsZHMgYmV0dGVyLi4uCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKRGFuaWVsICgyMyBKdWx5KQotIFRyYWN5IEJvZWhyZXIgZXhwZXJpZW5jZWQgRE5TIGNhY2hlIHByb2JsZW1zIGFuZCBkaWQgc29tZSBuaWNlIGRlYnVnZ2luZwogIGFuZCB0cmFja2luZyB3aGljaCBtYWRlIGl0IGVhc3kgZm9yIG1lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0gYW5kIFRyYWN5CiAgY291bGQgdmVyaWZ5IHRoYXQgaXQgZGlkIGN1cmUgdGhlIHByb2JsZW0hIFdoZW4gcmUtdXNpbmcgYSBjb25uZWN0aW9uIHdlCiAgbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCByZS11c2UgdGhlICdjb25uZWN0X2FkZHInIHN0cnVjdC4KCi0gRGFuaWVsIEtvdXJpbCBjb3JyZWN0ZWQgdGhlIEdTUy1OZWdvdGlhdGUgY29kZS4KCi0gSnVhbiBGLiBDb2RhZ25vbmUgcHJvdmlkZWQgZml4ZXMgdG8gYWxsb3cgY3VybCB0byBidWlsZCBmaW5lIG9uIFdpbmRvd3MKICBhZ2Fpbi4KCkRhbmllbCAoMjIgSnVseSkKLSBFZGl0ZWQgdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUgZmlsZSB0byBidWlsZCBvbiBXaW5kb3dzIHByb3Blcmx5LgoKRGFuaWVsICgyMSBKdWx5KQotIE1vdmVkIHRoZSBwcm94eSBjcmVkZW50aWFscyBmcm9tIHRoZSBTZXNzaW9uSGFuZGxlIHN0cnVjdCB0byB0aGUgY29ubmVjdGRhdGEKICBzdHJ1Y3QsIHRvIG1ha2UgbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlcmVudCB1c2VyIG5hbWVzIHdvcmsuCgotIEFkanVzdGVkIHRoZSBOVExNIGNvZGUgdG8gc3VwcG9ydCBwcm94eSBmdW5jdGlvbmFsaXR5LgoKLSBNYWRlIHRoZSBrcmI0IHN0dWZmIGNvbXBpbGUgd2l0aCB0aGUgdXNlcitwYXNzd29yZCBmaWVsZHMgbW92ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmU0ICgyMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDIwIEp1bHkpCi0gRGF2aWQgR2FyZG5lciBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0IDc3MDc1NSB0aGF0IHVzaW5nIHRoZSBGVFAgY29tbWFuZAogIENXRCB3aXRoIGEgYmxhbmsgYXJndW1lbnQgaXMgYSBiYWQgaWRlYSBhbmQgSSBtYWRlIGxpYmN1cmwgc2tpcCBlbXB0eSBwYXRoCiAgc2VnbWVudHMgc3RhcnRpbmcgbm93LgoKRGFuaWVsICgxOCBKdWx5KQotIENyaXMgcG9pbnRlZCBvdXQgdGhhdCBteSBmaXggb24gSnVseSAxNnRoIGRpZG4ndCB3b3JrIGZ1bGx5LiBIaXMgcG9pbnRpbmcKICBvdXQgdGhpcyAoYW5kIGhpcyBwYXRjaCkgYWxzbyBtYWRlIG1lIHJlYWxpemUgdGhhdCB3ZSBoYXZlIGEgdmVyeSBzaW1pbGFyCiAgYnVnIGluIHRoZSBGVFAgY29ubmVjdGlvbiByZS11c2UgY29kZS4gV2UgbXVzdCBzdG9yZSBhIHNlcGFyYXRlIHVzZXIgYW5kCiAgcGFzc3dvcmQgZmllbGQgZm9yIGVhY2ggY29ubmVjdGlvbiB3ZSBrZWVwIChhdCBsZWFzdCBmb3IgRlRQIGFuZCBIVFRQK05UTE0KICBjb25uZWN0aW9ucywgc28gSSBtYWRlIHVzIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5KS4KCi0gU2luY2UgTlRMTSBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2luZ2xlIHJlcXVlc3RzLCBJIGhhZCB0bwogIHJlLWFycmFuZ2UgaG93IHdlIHN0b3JlIHRoZSBOVExNIGRhdGEgYW5kIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3Qgc3VpdGUgdG8KICBmaW5hbGx5IHdvcmsgcHJvcGVybHkgd2l0aCBwZXJzaXN0ZW5jeSB0byBtYWtlIHRoZSBOVExNIHRlc3RzIHJ1biBmaW5lCiAgYWdhaW4uIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gaGF2ZSB0byB1cGRhdGUgbG90cyBvZiBIVFRQIHRlc3QgY2FzZXMuCgpEYW5pZWwgKDE2IEp1bHkpCi0gQ3JpcyBCYWlsaWZmJ3MgYnVnIHJlcG9ydCA3NjgyNzUgcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBCYXNpYyBhdXRoIHdpdGgKICB3cm9uZyB1c2VyK3Bhc3N3b3JkIGNhdXNlZCBhbiBlbmRsZXNzIGxvb3AuIEZpeGVkIG5vdy4gSGUgYWxzbyBmb3VuZCBvdXQgdGhhdAogIHdlIGRpZG4ndCBwcm9wZXJseSBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMgd2l0aCBOVExNLiBGaXhlZCB0b28uCgotIERhbiBXaW5zaGlwIHByb3ZpZGVkIGZpeGVzIGZvciB0aGUgTlRMTSBjb2RlLgoKRGFuaWVsICg1IEp1bHkpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHRoZSBET1MgcG9ydC4KCkRhbmllbCAoNCBKdWx5KQotIFJpY2sgUmljaGFyZHNvbiBwb2ludGVkIG91dCB0aGF0IHVzaW5nIHNldHZidWYoKSB0byBhY2hpZXZlIG5vbi1idWZmZXJpbmcKICBvbiBvdXRwdXQgaXMgbm8tZ29vZCBmb3IgU0NPIFhlbml4IGFuZCBvdGhlciB1bml4ZXMuIFdlIHN3aXRjaGVkIG92ZXIgdG8KICB1c2luZyBwbGFpbiBmZmx1c2goKSBpbnN0ZWFkLgoKLSBEYW4gR3JheXNvbiBwb2ludGVkIG91dCB0aGF0IHdlIHNldCB0aGUgQ1VSTF9DQV9CVU5ETEUgdmFyaWFibGUgd3JvbmdseSBpbgogIHRoZSBjb25maWd1cmUgc2NyaXB0LCBhbmQgSSBoYWQgdG8gY2hhbmdlIHNvbWUgYnVpbGQgc3R1ZmYgdG8gbWFrZSB0aGUgbmV3CiAgd2F5IHdvcmsuCgotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHdhcyBhcHBsaWVkIHRoYXQgaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nOgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgZ2V0cyBjYWxsZWQgd2l0aCB0aGUKICAgT3BlblNTTCdzIHNzbF9jdHggcG9pbnRlciBwYXNzZWQgaW4gYW5kIGFsbG93IGEgY2FsbGJhY2sgdG8gYWN0IG9uIGl0LiBJZgogICBhbnl0aGluZyBidXQgQ1VSTEVfT0sgaXMgcmV0dXJuZWQsIHRoYXQgd2lsbCBhbHNvIGJlIHJldHVybmVkIGJ5IGxpYmN1cmwKICAgYWxsIHRoZSB3YXkgYmFjay4gSWYgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBDVVJMT1BUX1VSTCwgbGliY3VybCB3aWxsCiAgIGRldGVjdCB0aGlzIGFuZCBpbnN0ZWFkIGdvIHVzZSB0aGUgbmV3IFVSTC4KCiAgIENVUkxPUFRfU1NMX0NUWF9EQVRBIGlzIGEgcG9pbnRlciB5b3Ugc2V0IHRvIGdldCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHNldAogICB3aXRoIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTi4KCkRhbmllbCAoMSBKdWx5KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgYSBjbGllbnQgdG8gcXVpdCB0aGUgdGVzdCBzdWl0ZSdzCiAgSFRUUCBzZXJ2ZXIuCgotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBwYXRjaGVkIGEgbGliIGhhbmRsZSBsZWFrIGluIHRoZSBsZGFwIGNvZGUuCgpEYW5pZWwgKDI1IEp1bmUpCi0gTW9yZSBOVExNLWltcHJvdmVtZW50cy4gTGVzcyBjb2RlLiBTbWFsbGVyIHBhY2tldHMgYmFjayBhbmQgZm9ydGguCgpEYW5pZWwgKDIzIEp1bmUpCi0gRXJpYyBHbGFzcyBwcm92aWRlZCB1cyB3aXRoIGEgYmV0dGVyIGRvYyBvbiBOVExNIGRldGFpbHMsIGFuZCBJIGFkZGVkIG1vcmUKICBjb21tZW50cyBhbmQgY2xhcmlmaWVkIHRoZSBjdXJyZW50IGNvZGUgbW9yZS4gVXNpbmcgdGhlIG5ldyBrbm93bGVkZ2UsIHdlCiAgc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgTlRMTSBzdHVmZiB3b3JrIGV2ZW4gYmV0dGVyLgogIEVyaWMncyBvcmlnaW5hbCBVUkw6IGh0dHA6Ly9kYXZlbnBvcnQuc291cmNlZm9yZ2UubmV0L250bG0uaHRtbAogIFZlcnNpb24gc3RvcmVkIGFuZCBwcm92aWRlZCBhdCBjdXJsIHNpdGU6IGh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbAoKLSBGaXhlZCB0aGUgbWlub3IgY29tcGlsZSBwcm9ibGVtcyBwcmUzIGhhZCBpZiBidWlsdCB3aXRob3V0IEdTU0FQSSBhbmQvb3IKICBTU0wuCgpWZXJzaW9uIDcuMTAuNi1wcmUzICgxOSBKdW5lIDIwMDMpCgpEYW5pZWwgKDE5IEp1bmUpCi0gTWFkZSBjdXJsIHVzZSBjdXJsX2ZyZWUoKSBvbiBtZW1vcnkgcmV0dXJuZWQgYnkgY3VybF9nZXRlbnYoKSwgYXMgdGhpcwogIHNob3VsZCB0aGVvcmV0aWNseSBtYWtlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGFuZCBydW4gY3VybCBhbmQgbGliY3VybCB3aXRoCiAgZGlmZmVyZW50IG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZXMgd2l0aCBubyBwcm9ibGVtcy4KCkRhbmllbCAoMTggSnVuZSkKLSBJbXByb3ZlZCB0aGUgbWtoZWxwLnBsIGEgYml0IGZ1cnRoZXIgdG8gbWFrZSBhIG5pY2VyIGh1Z2VoZWxwIHRleHQgYW5kIHRvCiAgaW5jbHVkZSBhIGJldHRlciBjb21tZW50IGluIHRoZSB0b3AgZm9yIHRoZSBnemlwIGNvbXByZXNzZWQgdmVyc2lvbi4KCkRhbmllbCAoMTcgSnVuZSkKLSBDVVJMT1BUX0hUVFBBVVRIIGlzIG5vdyBhIGJpdG1hc2ssIGluIHdoaWNoIHlvdSBzZXQgd2hpY2ggYXV0aGVudGljYXRpb24KICB0eXBlKHMpIHlvdSB3YW50IHRvIHVzZS4gSWYgbW9yZSB0aGFuIG9uZSBpcyBzZXQsIGxpYmN1cmwgd2lsbCB1c2Ugb25lIG9mCiAgdGhlIHNlbGVjdGVkIG9uZSBhbmQgdGhlIG9uZSBpdCBjb25zaWRlcnMgaXMgbW9yZSBzZWN1cmUuIFRlc3QgY2FzZSA2NyBhbmQKICA2OCAoZm9yIE5UTE0pIHdlcmUgZml4ZWQgYW5kIHdlJ3ZlIHJlZHVjZWQgYSByb3VuZC10cmlwIGZvciBzcGVjaWZpYyAtLW50bG0KICBmZXRjaGVzLCBhbmQgdGVzdCBjYXNlIDY5IGFuZCA3MCB3ZXJlIGFkZGVkIGZvciB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uCiAgInBpY2tpbmciLiAtLWFueWF1dGggaXMgdGhlIG5ldyBjb21tYW5kIGxpbmUgdG9vbCBvcHRpb24sIGFuZCBJIGFsc28gYWRkZWQKICAtLWJhc2ljIGZvciBjb21wbGV0ZW5lc3MgKHRoYXQncyB0aGUgZGVmYXVsdCB0eXBlKS4KCi0gRml4ZWQgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byB1c2UgdGhlIGluZm8gcHJvdmlkZWQgYnkgdGhlIG5ldyBjdXJsIC1WCiAgb3V0cHV0LgoKLSAtLWVuYWJsZS1kZWJ1ZyBub3cgc2V0cyB0aGUgQ1VSTERFQlVHIGRlZmluZSBpbnN0ZWFkIG9mIE1BTExPQ0RFQlVHLCBhcyBpdAogIGlzIG1lYW50IHRvIGJlIGEgZ2VuZXJpYyBkZWJ1ZyBjb25kaXRpb25hbC4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBjYW4gbm93IHJldHVybiBDVVJMX1ZFUlNJT05fREVCVUcgYXMgYSBmZWF0dXJlIGJpdCwgdG8KICBpbmRpY2F0ZSB0aGF0IHRoZSBsaWJyYXJ5IHdhcyBidWlsdCB3aXRoIENVUkxERUJVRyBzZXQuCgotIFJhbHBoIE1pdGNoZWxsIGZvdW5kIG91dCB0aGF0IHNvbWUgd2ViIGFwcGxpY2F0aW9ucyB2ZXJ5IGJhZGx5IHVzZXMgd2hpdGUKICBzcGFjZXMgaW4gTG9jYXRpb246IHJlZGlyZWN0cywgYW5kIGFwcGFyZW50bHkgSUUgaXMgYSBicm93c2VyICh0aGUgb25seQogIG9uZT8pIHRoYXQgc3VwcG9ydHMgdGhpcyBhYm9taW5hdGlvbi4gQmFzZWQgb24gUmFscGgncyBwYXRjaCwgSSBhZGRlZCBjb2RlCiAgdGhhdCBub3cgYXR0ZW1wdHMgdG8gcmVwbGFjZSB3aGl0ZSBzcGFjZXMgd2l0aCB0aGUgcHJvcGVyICIlMjAiIG9yICIrIi4KICBUZXN0IGNhc2UgNDAgYW5kIDQyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IG15IGNoYW5nZXMuCgotIGN1cmwgLVYgbm93IGFsc28gb3V0cHV0cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhlIGF2YWlsYWJsZSBsaWJyYXJ5IG9mZmVycyAoaWYKICBhbnkpLgoKLSBUaGUgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBpbmNsdWRlcyAiR1NTIiBpZiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR1NTQVBJCiAgc3VwcG9ydC4KCi0gRGF2aWQgT3JyZWxsIHJlcG9ydGVkIHRoYXQgbGliY3VybCBzdGlsbCBjcmFzaGVkIHdoZW4gc2VuZGluZyBIVUdFIHJlcXVlc3RzCiAgb3ZlciBIVFRQUy4uLiBJIGZpeGVkLgoKVmVyc2lvbiA3LjEwLjYtcHJlMiAoMTYgSnVuZSAyMDAzKQoKRGFuaWVsICgxNiBKdW5lKQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYml0bWFza2VkIGluZm9ybWF0aW9uIHdlYXRoZXIgTlRMTSBhbmQKICBHU1NORUdPVElBVEUgYXJlIHN1cHBvcnRlZCwgc2luY2UgaXQgaXMgZG9vbWVkIHRvIHZhcnkgb24gZGlmZmVyZW50CiAgaW5zdGFsbGF0aW9ucy4KCi0gSSByZW1hZGUgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBNRDUtY29kZSBwcm92aWRlZCBieSBPcGVuU1NMIGlmCiAgdGhhdCBpcyBwcmVzZW50LCBhbmQgb25seSB1c2Ugb3VyIG93biBNRDUtY29kZSBpZiBpdCBpc24ndC4KICAKRGFuaWVsICgxMyBKdW5lKQotIE1vcmUgTlRMTSBoZWxwLCBmaXhlcyBhbmQgcGF0Y2hlcyBmcm9tIENyaXMgQmFpbGlmZi4KCi0gTWFydHkgS3VocnQgYnJvdWdodCBpbmNsdWRlIGZpeGVzIGZvciBtYWtpbmcgVk1TIGJ1aWxkcyB3YXJuaW5nLWZyZWUuCgpEYW5pZWwgKDEyIEp1bmUpCi0gTlRMTSBhdXRoZW50aWNhdGlvbiB3b3JrcyBzb21ld2hhdCBhZ2FpbnN0IHRoZSB0ZXN0IHNlcnZlcnMgcHJvdmlkZWQgYnkKICBNYXRoaWFzIEF4ZWxzc29uIGFuZCBDcmlzIEJhaWxpZmYuIFVzZSBieSBzZXR0aW5nIENVUkxPUFRfSFRUUEFVVEggdG8KICBDVVJMQVVUSF9OVExNIHRvIGxpYmN1cmwsIG9yIC0tbnRsbSBmb3IgdGhlIGN1cmwgdG9vbC4gVGVzdCBjYXNlIDY3IGFuZCA2OAogIHdlcmUgYWRkZWQgZm9yIHRoaXMuIE5UTE0tc3VwcG9ydCByZXF1aXJlcyBPcGVuU1NMLgoKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBwYXRjaCwgdGhhdCBncmFudGVkIHRoYXQgZ3ppcCBhbmQgbGlieiBhcmUgYXZhaWxhYmxlCiAgYXQgYnVpbGQtdGltZSwgY29tcHJlc3NlcyB0aGUgaHVnZWhlbHAgdGV4dCBpbiB0aGUgY3VybCBjb21tYW5kIGxpbmUgYW5kCiAgdW5jb21wcmVzc2VzIGl0IGF0IHJlcXVlc3QuIFNhdmVzIHNvbWUgfjYwSyBpbiB0aGUgZmluYWwgb3V0cHV0IGV4ZWN1dGFibGUuCgpEYW5pZWwgKDExIEp1bmUpCi0gTG9uZyBkYXkgb2YgZmlnaHRpbmcgdGhlIE5UTE0gZGVtb25zLgoKRGFuaWVsICgxMCBKdW5lKQotIE1vZGlmaWVkIGhvdyB0byBzZXQgYXV0aCB0eXBlIHRvIGxpYmN1cmwuIE5vdyB1c2UgQ1VSTE9QVF9IVFRQQVVUSCBpbnN0ZWFkLAogIGFuZCBwaWNrIG1ldGhvZC4gU3VwcG9ydGVkIG9uZXMgY3VycmVudGx5IGFyZToKICBDVVJMQVVUSF9CQVNJQyAgICAgLSBkZWZhdWx0IHNlbGVjdGlvbgogIENVUkxBVVRIX0RJR0VTVCAgICAtIGZvcm1lcmx5IENVUkxPUFRfSFRUUERJR0VTVAogIENVUkxBVVRIX0dTU05FR09USUFURQoKLSBEYW5pZWwgS291cmlsIGFkZGVkIEhUVFAgR1NTLU5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0LCBhcyBkZWZpbmVkIGluCiAgdGhlIElFVEYgZHJhZnQgZHJhZnQtYnJlemFrLXNwbmVnby1odHRwLTA0LnR4dC4gSW4gdXNlIGFscmVhZHkgYnkgdmFyaW91cwogIE1pY3Jvc29mdCB3ZWIgYXBwbGljYXRpb25zLiAtLW5lZ290aWF0ZSBpcyB0aGUgbmV3IGZhbWlseSBtZW1iZXIuIFRvIHRha2UKICBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91IG5lZWQgb25lIG9mIHRoZXNlIHBhY2thZ2VzOgoKICBvIEhlaW1kYWwgS2VyYmVyb3M1ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5wZGMua3RoLnNlL2hlaW1kYWwvaGVpbWRhbC5odG1sCiAgbyBHU1NBUEkgZnJvbSBHbG9idXMgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5nbG9idXMub3JnLwogIG8gR1NTQVBJIGxpYnJhcmllcyBmcm9tIE1JVCBLZXJiZXJvczUgIGh0dHA6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy93d3cvCgotIEEgbWlzc2luZyBlbmRpbmcgYnJhY2tldCAoJ10nKSB3aGlsZSBkb2luZyBVUkwgZ2xvYmJpbmcgY291bGQgbGVhZCB0byBhCiAgc2VnZmF1bHQuIFdoaWxlIGZpeGluZyB0aGlzLCBJIGFsc28gaW50cm9kdWNlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIHRoZQogIGdsb2JiaW5nIGNvZGUuIChBbGwgdGhpcyBpcyBhcHBsaWNhdGlvbiBjb2RlIG91dHNpZGUgbGliY3VybC4pCgpEYW5pZWwgKDYgSnVuZSkKLSBEYXZpZCBPcnJlbGwgZm91bmQgb3V0IHRoYXQgc2VuZGluZyBhIGh1Z2UgR0VUIHJlcXVlc3Qgb3ZlciBIVFRQUyBjb3VsZAogIG1ha2UgbGliY3VybCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZS4KCkRhbmllbCAoMiBKdW5lKQotIFJpY2hhcmQgQnJhbWFudGUgZm91bmQgb3V0IHRoYXQgIkNvbnRlbnQtTGVuZ3RoOiAwIiB3YXMgbm90IHByb3Blcmx5IHVzZWQgYnkKICBsaWJjdXJsIGlmIHRoZSByZXNwb25zZS1oZWFkZXJzIGluZGljYXRlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlCiAgY2xvc2VkLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBsaWVkLCB0aGF0IG1ha2VzIHRoZSAtLXByb2dyZXNzLWJhciB0YWtlIHRoZQogIGxvY2FsIHNpemUgaW50byBhY2NvdW50IHdoZW4gZG9pbmcgcmVzdW1lZCBkb3dubG9hZHMuCgotIEZlZWRiYWNrIGZyb20gU2VyZ2UgU2VtYXNoa28gbWFkZSBtZSBjaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgd2hlbgogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgaXMgcmV0dXJuZWQuCgotIEFub255bW91cyBpbiBidWcgcmVwb3J0ICM3NDUxMjIgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nCiAgU1NMX0NUWF9zZXRfb3B0aW9ucyguLi4gU1NMX09QX0FMTCkgdG8gd29yayBhcm91bmQgZmxhd3MgaW4gZXhpc3RpbmcgU1NMCiAgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyNyBNYXkpCi0gQW5kcmVhcyBMZXkgYW5kIFJpY2ggR3JheSBoZWxwZWQgbWUgcG9pbnQgb3V0IHRoYXQgbm8gdmVyc2lvbiBvZiBIUC1VWCBoYXMKICB0aGUgc3lzL3NlbGVjdC5oIGhlYWRlciBmaWxlIHNvIGluY2x1ZGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gY3VybC9tdWx0aS5oCiAgaXMgbm90IGEgZ29vZCB0aGluZy4gTm93IHdlIGNoZWNrIGZvciBIUFVYIGFuZCBhdm9pZCB1c2luZyB0aGF0IGhlYWRlciBvbgogIHN1Y2ggc3lzdGVtcy4KCi0gUnVkeSBLb2VudG8gZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBjdXJsJ3MgcmVjZW50IGhhYml0IG9mIFBPU1RpbmcgZGF0YSBpbgogIHR3byBzZXBhcmF0ZSBzZW5kKCkgY2FsbHMsIGZpcnN0IHRoZSBoZWFkZXJzIGFuZCB0aGVuIHRoZSBkYXRhLiBJJ3ZlIG5vdwogIG1hZGUgYSBmaXggdGhhdCBmb3Igc3RhdGljIGFuZCBrbm93biBjb250ZW50IHRoYXQgaXMgbGVzcyB0aGFuIDEwMEsgaW4gc2l6ZSwKICBldmVyeXRoaW5nIGlzIG5vdyBzZW50IGluIG9uZSBzaW5nbGUgc3lzdGVtIGNhbGwgYWdhaW4uIFRoaXMgaXMgYWxzbyBiZXR0ZXIKICBmb3IgbmV0d29yayBwZXJmb3JtYW5jZSByZWFzb25zLgoKLSBJIG1vZGlmaWVkIHRoZSBtYWluIG1ha2VmaWxlIHRvIG5vdCBidWlsZCB0aGUgdGVzdCBzdWl0ZSBhbmQgYSBmZXcgb3RoZXIKICB1bm5lY2Vzc2FyeSB0aGluZ3MgYnkgZGVmYXVsdC4gTm93LCB0aGUgdGVzdCBzdWl0ZSBpcyBidWlsdCB3aGVuICdtYWtlIHRlc3QnCiAgaXMgcnVuLiAgVGhpcyByZWR1Y2VzIGJ1aWxkIHRpbWUgZm9yIHRob3NlIHdobyBkb24ndCBjYXJlIGZvciB0aGUgdGVzdAogIHN1aXRlLCBhbmQgaXQgYWxzbyByZWR1Y2VzIGNvbmZ1c2lvbiBmb3IgcGVvcGxlIHVzaW5nIHBsYXRmb3JtcyB3aGVyZSB0aGUKICB0ZXN0IHN1aXRlIGJ1aWxkIGZhaWxzIQoKRGFuaWVsICgyNiBNYXkpCi0gQ2hyaXMgTGV3aXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSAjaWZkZWZzIGluIGN1cmwvbXVsdGkuaCBmb3IgV2luZG93cywKICB3aGljaCBpcyBub3cgY29ycmVjdGVkLgoKLSBKaXMgSm95IGZvdW5kIGFub3RoZXIgZmxhdyBpbiB0aGUgU09DSzUgY29kZSwgYXMgbGliY3VybCB0cmVhdGVkIHRoZSBzb2NrczUKICBwcm94eSBhIGxpdHRsZSB0b28gbXVjaCBsaWtlIGFzIGlmIGl0IHdhcyBhIGh0dHAgcHJveHkuCgpEYW5pZWwgKDIzIE1heSkKLSBSaWNhcmRvIENhZGltZSBmb3VuZCBhIHNvY2tldCBsZWFrIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRob3V0CiAgY29udGVudHMuIFRlc3QgY2FzZXMgMTQ0IGFuZCAxNDUgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gUnVkeSBLb2VudG8gZm91bmQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aGVuIGEgSFRUUCBzZXJ2ZXIgcmV0dXJucyBvbmx5IGEKICBzaW5nbGUtbGluZSBvZiBjb250ZW50cyB3aXRob3V0IGFueSBoZWFkZXJzIGF0IGFsbC4gbGliY3VybCB0aGVuIGZhaWxlZCB0bwogIGNvdW50IHRoZSBkYXRhLCB0aHVzIHJldHVybmluZyBlcnJvciA1MiAibm8gY29udGVudHMiLiBUZXN0IGNhc2UgNjYgd2FzCiAgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvIHJpZ2h0LgoKVmVyc2lvbiA3LjEwLjYtcHJlMSAoMjMgTWF5IDIwMDMpCgpEYW5pZWwgKDIzIE1heSkKLSBKaXMgaW4gYnVnIHJlcG9ydCAjNzQxODQxLCBmaXhlZCBhIGJ1ZyBpbiB0aGUgU09DS1M1IHByb3h5LXVzaW5nIGNvZGUuCgpEYW5pZWwgKDIyIE1heSkKLSBEYXZpZCBSZW1haGwgc2V0IHVwIGEgdGVzdC1zZXJ2ZXIgZm9yIG1lIHByb3ZpZGluZyBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYW5kIEkgd3JvdGUgdGhlIGZpcnN0IHdvcmtpbmcgY29kZSB0aGF0IHN1cHBvcnQgaXQuIFRoZSB0ZXN0IHN1aXRlIHdhcwogIG1vZGlmaWVkIHNsaWdodGx5IGFzIHdlbGwgdG8gd29yayBiZXR0ZXIgZm9yIGl0IGFuZCAtLWRpZ2VzdCB3YXMgYWRkZWQgdG8KICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGFuZCBDVVJMT1BUX0hUVFBESUdFU1QgdG8gdGhlIGxpYnJhcnkpLi4uICBSRkMyNjE3CiAgaGFzIGFsbCB0aGUgZ29yeSBkZXRhaWxzLgoKRGFuaWVsICgyMSBNYXkpCi0gRGF2aWQgQmFsYXppYyBwb2ludGVkIG91dCB0aGF0IGN1cmxfdW5lc2NhcGUoKSBkaWRuJ3QgY2hlY2sgdGhhdCAlLWNvZGVzCiAgd2VyZSBjb3JyZWN0bHkgZm9sbG93ZWQgYnkgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyB3aGVuIGl0IHVuZXNjYXBlIHN0cmluZ3MuCiAgTm93LCB3ZSBkbyB0aGUgY2hlY2sgYW5kIG9ubHkgJVhYIGNvZGVzIGFyZSB1bmVzY2FwZWQgaWYgdGhlIFggbGV0dGVycyBhcmUKICBoZXhhZGVjaW1hbHMuCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCBidWlsZCB3aXRoIGRqZ3BwIG9uIERPUy4KCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgdGhlIG1raGVscC5wbCBzY3JpcHQgdG8gbWFrZSBhIG5pY2VyIG1hbnVhbCB0aGF0IGlzCiAgc2hvd24gd2l0aCBjdXJsIC1NLgoKRGFuaWVsICgyMCBNYXkpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIG1vcmUgY29uc2VydmF0aXZlLCBub3QKICBleHBlY3RpbmcgaF9hbGlhc2VzIG9mIHRoZSBob3N0ZW50IHN0cnVjdCB0byBhbHdheXMgYmUgbm9uLU5VTEwuCgpEYW5pZWwgKDE5IE1heSkKLSBBcyByZXF1ZXN0ZWQgYnkgTWFydGluIE1pY2hsbWF5ciBpbiBEZWJpYW4gYnVnIHJlcG9ydCAjMTkzNjMwLCBsaWJjdXJsIG5vdwogIHN1cHBvcnRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy4gQWRkZWQKICB0ZXN0IGNhc2UgNjMgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuMTAuNSAoMTkgTWF5IDIwMDMpCgpEYW5pZWwgKDE1IE1heSkKLSBDaGFuZ2VkIHRoZSBvcmRlciBmb3IgdGhlIGluX2FkZHJfdCB0ZXN0aW5nLCBhcyAndW5zaWduZWQgbG9uZycgc2VlbXMgdG8gYmUKICBhIHZlcnkgY29tbW9uIHR5cGUgaW5ldF9hZGRyKCkgcmV0dXJucy4KCkRhbmllbCAoMTQgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwcm92aWRlZCBhIGZpeCB0aGF0IGNhbGxzIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHdhaXRpbmcKICBmb3IgRlRQIGNvbW1hbmQgcmVzcG9uc2VzIHRha2UgPjEgc2Vjb25kLiBJdCdsbCBtYWtlIGFwcGxpY2F0aW9ucyBtb3JlCiAgInJlc3BvbnNpdmUiIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBzbG93IGZ0cCBzZXJ2ZXJzLgoKRGFuaWVsICgxMiBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB1cGxvYWRzIGhhZCB0d28gcXVpcmtzOgogICBvIHdoZW4gdXNpbmcgRlRQIFBPUlQgY29tbWFuZCwgaXQgdXNlZCBibG9ja2luZyBzb2NrZXRzIQogICBvIGl0IGNvdWxkIGxvb3AgYSBsb25nIHRpbWUgd2l0aG91dCBkb2luZyBwcm9ncmVzcyBtZXRlciB1cGRhdGVzCiAgQm90aCBpdGVtcyBhcmUgZml4ZWQgbm93LgoKRGFuaWVsICg5IE1heSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlZCBDVVJMT1BUX0VOQ09ESU5HIHRvIHNlbGVjdCBhbGwgc3VwcG9ydGVkIGVuY29kaW5ncyBpZgogIHNldCB0byAiIi4gIFRoaXMgZnJlZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gaGF2aW5nIHRvIGtub3cgd2hpY2ggZW5jb2RpbmdzCiAgdGhlIGxpYnJhcnkgc3VwcG9ydHMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCB3ZSBoYWQgdGhyZWUgdW5uZWNlc3NhcnkgZmlsZXMgaW4gQ1ZTIHRoYXQgaXMKICBnZW5lcmF0ZWQgd2l0aCBsaWJ0b29saXplLCBzbyB0aGV5J3JlIG5vdyByZW1vdmVkIGFuZCBsaWJ0b29saXplIGlzIGludm9rZWQKICBhY2NvcmRpbmdseSBpbiB0aGUgYnVpbGRjb25mIHNjcmlwdC4KCi0gQXZlcnkgRmF5IGZvdW5kIG91dCB0aGF0IHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3YXkgb2YgZmlyc3QgY2hlY2tpbmcgaWYgdGhlCiAgZ2l2ZW4gbmFtZSBpcyBhIG5ldHdvcmsgaW50ZXJmYWNlIGdhdmUgYSByZWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gTGludXgsCiAgc28gbm93IHdlIG1vcmUgYXBwcm9wcmlhdGVseSBmaXJzdCBjaGVjayBpZiBpdCBpcyBhbiBJUCBudW1iZXIgYW5kIGlmIHNvCiAgd2UgZG9uJ3QgY2hlY2sgZm9yIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCB0aGF0IG5hbWUuCgotIENVUkxPUFRfRlRQX1VTRV9FUFJUIGFkZGVkLiBTZXQgdGhpcyB0byBGQUxTRSB0byBkaXNhYmxlIGxpYmN1cmwncyBhdHRlbXB0cwogIHRvIHVzZSBFUFJUIGFuZCBMUFJUIGJlZm9yZSB0aGUgdHJhZGl0aW9uYWwgUE9SVCBjb21tYW5kLiBUaGUgY29tbWFuZCBsaW5lCiAgdG9vbCBzZXRzIHRoaXMgb3B0aW9uIHdpdGggJy0tZGlzYWJsZS1lcHJ0Jy4KClZlcnNpb24gNy4xMC41LXByZTIgKDYgTWF5IDIwMDMpCgpEYW5pZWwgKDYgTWF5KQotIEtldmluIERlbGFmaWVsZCByZXBvcnRlZCBhbm90aGVyIGNhc2Ugd2hlcmUgd2UgZGlkbid0IGNvcnJlY3RseSBjaGVjayBmb3IKICBFQUdBSU4gYnV0IG9ubHkgRVdPVUxEQkxPQ0ssIHdoaWNoIGNhdXNlZCBiYWRuZXNzIG9uIEhQVVguCgpEYW5pZWwgKDQgTWF5KQotIEJlbiBHcmVlYXIgbm90aWNlZCB0aGF0IHRoZSBjaGVjayBmb3IgJ3dyaXRhYmxlIGFyZ3YnIGV4aXRlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHdoZW4gcnVuIGZvciBjcm9zcy1jb21waWxpbmcsIHdoaWNoIHdhc24ndCBuaWNlLiBOb3cgaXQnbGwgZGVmYXVsdCB0bwogIG5vIGFuZCBvdXRwdXQgYSB3YXJuaW5nIGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgd2FzIG5vdCBjaGVja2VkIGZvci4KCkRhbmllbCAoMiBNYXkpCi0gQWRkZWQgdGVzdCBjYXNlIDYyIGFuZCBmaXhlZCBzb21lIG1vcmUgb24gdGhlIGNvb2tpZSBzZW5kaW5nIHdpdGggYSBjdXN0b20KICBIb3N0OiBoZWFkZXIgc2V0LgoKRGFuaWVsICgxIE1heSkKLSBBbmR5IENlZGlsbmlrIGZpeGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBNYWRlIHRoZSAiU1NMIHJlYWQgZXJyb3I6IDUiIGVycm9yIG1lc3NhZ2UgbW9yZSB2ZXJib3NlLCBieSBhZGRpbmcgY29kZSB0aGF0CiAgcXVlcmllcyB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGZpbGwgaW4gdGhlIGVycm9yIGJ1ZmZlci4KCkRhbmllbCAoMzAgQXByKQotIEFkZGVkIHN5cy9zZWxlY3QuaCBpbmNsdWRlIGluIHRoZSBjdXJsL211bHRpLmggZmlsZSwgYWZ0ZXIgaGF2aW5nIGJlZW4KICByZW1pbmRlZCBhYm91dCB0aGlzIGJ5IFJpY2ggR3JheS4KCi0gSSBtYWRlIGVhY2ggdGVzdCBzZXQgaXRzIG93biBzZXJ2ZXIgcmVxdWlyZW1lbnRzLCB0aHVzIGFiYW5kb25pbmcgdGhlCiAgcHJldmlvdXMgc3lzdGVtIHdoZXJlIHRoZSB0ZXN0IG51bWJlciBpbXBsaWVkIHdoYXQgc2VydmVyKHMpIHRvIHVzZSBmb3IgYQogIHNwZWNpZmljIHRlc3QuCgotIERhdmlkIEJhbGF6aWMgbWFkZSBjdXJsIG1vcmUgUkZDMTczOC1jb21wbGlhbnQgZm9yIEZUUCBVUkxzLCBieSBmaXhpbmcgc28KICB0aGF0IGxpYmN1cmwgbm93IHVzZXMgb25lIENXRCBjb21tYW5kIGZvciBlYWNoIHBhdGggcGFydC4gQSBidW5jaCBvZiB0ZXN0CiAgY2FzZXMgd2VyZSBmaXhlZCB0byB3b3JrIGFjY29yZGluZ2x5LgoKLSBDb29raWUgZml4ZXM6CgogIEEuIFNhdmUgZG9tYWlucyBpbiBqYXJzIGxpa2UgTW96aWxsYSBkb2VzLiBJdCBtZWFucyBhbGwgZG9tYWlucyBzZXQgaW4KICAgICBTZXQtQ29va2llOiBoZWFkZXJzIGFyZSBkb3QtcHJlZml4ZWQuCiAgQi4gU2F2ZSBhbmQgdXNlIHRoZSAndGFpbG1hdGNoJyBmaWVsZCBpbiB0aGUgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgamFycwogICAgICh0aGUgc2Vjb25kIGNvbHVtbikuCiAgQy4gUmVqZWN0IGNvb2tpZXMgdXNpbmcgaWxsZWdhbCBkb21haW5zIGluIHRoZSBTZXQtQ29va2llOiBsaW5lLiBDb25jZXJucwogICAgIGJvdGggZG9tYWlucyB3aXRoIHRvbyBmZXcgZG90cyBvciBkb21haW5zIHRoYXQgYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseQogICAgIG9wZXJhdGluZyBzZXJ2ZXIgaG9zdCdzIGRvbWFpbi4KICBELiBTZXQgdGhlIHBhdGggcGFydCBieSBkZWZhdWx0IHRvIHRoZSBvbmUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgaWYgbm9uZSB3YXMKICAgICBzZXQgaW4gdGhlIFNldC1Db29raWUgbGluZS4KCiAgVG8gbWFrZSBpdGVtIEMgcmVhbGx5IGdvb2QsIEkgYWxzbyBtYWRlIGxpYmN1cmwgbm90aWNlIGN1c3RvbSBIb3N0OiBoZWFkZXJzCiAgYW5kIGV4dHJhY3QgdGhlIGhvc3QgbmFtZSBzZXQgaW4gdGhlcmUgYW5kIHVzZSB0aGF0IGFzIHRoZSBob3N0IG5hbWUgZm9yIHRoZQogIHNpdGUgd2UncmUgZ2V0dGluZyB0aGUgY29va2llcyBmcm9tLiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBzaXRlJ3MKICBJUC1hZGRyZXNzLCBidXQgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGFuZCBzZW5kIGl0cyBjb29raWVzIHByb3Blcmx5IGlmCiAgeW91IHByb3ZpZGUgYSB2YWxpZCBIb3N0OiBuYW1lIGZvciB0aGUgc2l0ZS4KCkRhbmllbCAoMjkgQXByKQotIFBldGVyIEtvdmFjcyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENVUkxJTkZPX0NPTk5FQ1RfVElNRSB3b3JrIGZpbmUKICB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKHRvbykuCgpWZXJzaW9uIDcuMTAuNS1wcmUxICgyMyBBcHIgMjAwMykKCkRhbmllbCAoMjMgQXByKQotIFVwZ3JhZGVkIHRvIGxpYnRvb2wgMS41LgoKRGFuaWVsICgyMiBBcHIpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3NldG9wdCgpIHdpbGwgYWx3YXlzICh3cm9uZ2x5KQogIHJldHVybiBDVVJMRV9PSyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgc29tZSBnemlwIGRlY29tcHJlc3Npb24gYnVncyBhbmQgZmxhd3MuCgpEYW5pZWwgKDE2IEFwcikKLSBGaXhlZCBtaW5vciB0eXBvIGluIG1hbiBwYWdlLCByZXBvcnRlZCBpbiB0aGUgRGViaWFuIGJ1ZyB0cmFja2VyLgoKRGFuaWVsICgxNSBBcHIpCi0gRml4ZWQgc29tZSBGVFAgdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBmYWlsZWQgb24gbXkgU29sYXJpcyBob3N0LCBkdWUKICB0byB0aGUgY29uZmlnLmggbm90IGJlaW5nIGluY2x1ZGVkIGJlZm9yZSB0aGUgc3lzdGVtIGhlYWRlcnMuIFdoZW4gZG9uZSB0aGF0CiAgd2F5LCBpdCBkaWQgZ2V0IGEgbWl4ZWQgc2Vuc2Ugb2YgaWYgYmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb3Igbm90IGFuZCB0aGVuCiAgc3RhdCgpIGFuZCBmc3RhdCgpIChhcyB1c2VkIGluIHRlc3QgY2FzZSA1MDUpIGdvdCBjb25mdXNlZCBhbmQgZmFpbGVkIHRvCiAgcmV0dXJuIGEgcHJvcGVyIGZpbGUgc2l6ZS4KCi0gRm9ybXBvc3RpbmcgYSBmaWxlIHVzaW5nIGEgLmh0bWwgc3VmZml4IGlzIG5vdyBwcm9wZXJseSBzZXQgdG8gQ29udGVudC1UeXBlOiAgICB0ZXh0L2h0bWwuCgpEYW5pZWwgKDE0IEFwcikKLSBGaXhlZCB0aGUgU1NMIGVycm9yIGhhbmRsaW5nIHRvIHJldHVybiBwcm9wZXIgU1NMIGVycm9yIG1lc3NhZ2VzIGFnYWluLCB0aGV5CiAgYnJva2UgaW4gNy4xMC40LiBJIGFsc28gYXR0ZW1wdCB0byB0cmFjayBkb3duIENBIGNlcnQgcHJvYmxlbXMgYW5kIHRoZW4KICByZXR1cm4gdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZS4KCi0gVGhlIGN1cmwgdG9vbCBub3cgaW50ZXJjZXB0cyB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlIGFuZCBkaXNwbGF5cwogIGEgZmFpcmx5IGJpZyBhbmQgZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZS4gS2V2aW4gUm90aCBoZWxwZWQgbWUgb3V0IHdpdGgKICB0aGUgd29yZGluZy4KCkRhbmllbCAoMTEgQXByKQotIE5pYyBIaW5lcyBwcm92aWRlZCBhIHNlY29uZCBwYXRjaCBmb3IgZ3ppcCBkZWNvbXByZXNzaW9uLCBhbmQgZml4ZWQgYSBidWcKICB3aGVuIGRlZmxhdGUgb3IgZ3ppcCBjb250ZW50cyB3ZXJlIGRvd25sb2FkZWQgdXNpbmcgY2h1bmtlZCBlbmNvZGluZy4KCi0gRGFuIEZhbmRyaWNoIG1hZGUgbGliY3VybCBzdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGd6aXAgY29udGVudHMKICAoYXMgYW4gYWRkaXRpb24gdG8gdGhlIHByZXZpb3VzIGRlZmxhdGUgc3VwcG9ydCkuCgotIEkgbWFkZSB0aGUgQ1dEIGNvbW1hbmQgZHVyaW5nIEZUUCBzZXNzaW9uIGNvbnNpZGVyIGFsbCAyeHkgY29kZXMgdG8gYmUgT0sKICByZXNwb25zZXMuCgpEYW5pZWwgKDEwIEFwcikKLSBWbGFkIEtydXBpbiBmaXhlZCBhIFVSTCBwYXJzaW5nIGlzc3VlLiBVUkxzIHRoYXQgd2VyZSBub3QgdXNpbmcgYSBzbGFzaAogIGFmdGVyIHRoZSBob3N0IG5hbWUsIGJ1dCBzdGlsbCBoYWQgIj8iIGFuZCBwYXJhbWV0ZXJzIGFwcGVuZGVkLCBhcyBpbgogICJodHRwOi8vaG9zdG5hbWUuY29tP2Zvb2Jhcj1tb28iLCB3ZXJlIG5vdCBwcm9wZXJseSBwYXJzZWQgYnkgbGliY3VybC4KCkRhbmllbCAoOSBBcHIpCi0gTWFkZSBDVVJMT1BUX1RJTUVDT05ESVRJT04gd29yayBmb3IgRlRQIHRyYW5zZmVycywgdXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzCiAgZm9yIEhUVFAuIFRoaXMgdGhlbiBtYWRlIC16IHdvcmsgZm9yIGZ0cCB0cmFuc2ZlcnMgdG9vLiBBZGRlZCB0ZXN0IGNhc2UgMTM5CiAgYW5kIDE0MCBmb3IgdmVyaWZ5aW5nIHRoaXMuCgotIEdldHRpbmcgdGhlIGZpbGUgZGF0ZSBvZiBhbiBmdHAgZmlsZSB1c2VkIHRoZSB3cm9uZyB0aW1lIHpvbmUgd2hlbgogIGRpc3BsYXllZC4gSXQgaXMgc3VwcG9zZWRseSBhbHdheXMgR01ULiBBZGRlZCB0ZXN0IGNhc2UgMTQxIGZvciB0aGlzLgoKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciBzdXBwb3J0IE1EVE0uCgotIFRoZSBkZWZhdWx0IERFQlVHRlVOQ1RJT04sIGFzIGVuYWJsZWQgd2l0aCBDVVJMT1BUX1ZFUkJPU0Ugbm93IG91dHB1dHMKICBDVVJMSU5GT19IRUFERVJfSU4gZGF0YSBhcyB3ZWxsLiBUaGUgbW9zdCBub3RhYmxlIGVmZmVjdCBmcm9tIHRoaXMgaXMgdGhhdAogIHVzaW5nIGN1cmwgLXYsIHlvdSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyAiaGVhZGVycyIgYXMgd2VsbC4gVGhpcyBpcwogIHBlcmhhcHMgbW9zdCB1c2VmdWwgd2hlbiBkb2luZyBmdHAuCgpEYW5pZWwgKDggQXByKQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgZmxhdyBpbiB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gY29kZSwgd2hpY2ggbWlzc2VkCiAgdGhlIGZpcnN0IGxldHRlciBpZiBubyBzcGFjZSBmb2xsb3dlZCB0aGUgY29sb24uCgotIE1hZ251cyBOaWxzc29uIHBvaW50ZWQgb3V0IHRoYXQgc2hhcmUuYyB3YXMgbWlzc2luZyBpbiB0aGUgTVNWQyBwcm9qZWN0CiAgZmlsZS4KCkRhbmllbCAoNiBBcHIpCi0gUnlhbiBXZWF2ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDQSBjZXJ0IGJ1bmRsZSBub3QgZ2V0IGluc3RhbGxlZAogIGFueW1vcmUgd2hlbiAnY29uZmlndXJlIC0td2l0aG91dC1zc2wnIGhhcyBiZWVuIHVzZWQuCgpEYW5pZWwgKDQgQXByKQotIE1hcnRpam4gQnJvZW5sYW5kIGZvdW5kIGFub3RoZXIgY2FzZXMgd2hlcmUgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZGlkbid0CiAgbGlrZSB0aGUgYm91bmRhcnkgc3RyaW5nIHVzZWQgYnkgY3VybCB3aGVuIGRvaW5nIGEgbXVsdGktcGFydC9mb3JtcG9zdC4gV2UKICBtb2RpZmllZCB0aGUgYm91bmRhcnkgc3RyaW5nIHRvIGxvb2sgbGlrZSB0aGUgb25lIElFIHVzZXMsIGFzIHRoaXMgaXMKICBwcm9iYWJseSBnb25uYSBtYWtlIGN1cmwgd29yayB3aXRoIG1vcmUgYXBwbGljYXRpb25zLgoKRGFuaWVsICgzIEFwcikKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgYSBidW5jaCBvZiB0ZXN0cyBmYWlscyBvbiBjeWd3aW4uIE9uZSBzZXQgZmFpbHMKICB3aGVuIHVzaW5nIHBlcmwgNS44IChhbmQgdGhleSBydW4gZmluZSB3aXRoIHBlcmwgNS42KSwgYW5kIGFub3RoZXIgc2V0CiAgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gYXJ0aWZhY3QgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgSQogIGNvcnJlY3RlZC4gSXQgdHVybmVkIG91dCB0aGUgRlRQIHNlcnZlciBjb2RlIHdhcyBzdGlsbCBoYXZpbmcgYSBmaWxlIG9wZW5lZAogIHdoaWxlIHRoZSBtYWluIHRlc3Qgc2NyaXB0IHJlbW92ZWQgaXQgYW5kIGludm9rZWQgdGhlIEhUVFAgc2VydmVyIHRoYXQKICBhdHRlbXB0ZWQgdG8gY3JlYXRlIHRoZSBzYW1lIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgRlRQIHNlcnZlciBrZXB0IG9wZW4uCiAgVGhpcyBvcGVyYXRpb24gd29ya3MgZmluZSBvbiB1bml4LCBidXQgbm90IG9uIGN5Z3dpbi4KClZlcnNpb24gNy4xMC40ICgyIEFwciAyMDAzKQoKRGFuaWVsICgxIEFwcikKLSBBZGRlZCB0ZXN0IGNhc2UgNTA1IHRvIGV4ZXJjaXNlIEZUUCB1cGxvYWQgd2l0aCByZW5hbWUgZG9uZSB3aXRoIGxpYmN1cmwsCiAgYW5kIGZvciB0aGF0IEkgaGFkIHRvIGV4dGVuZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gZGVhbCB3aXRoIHRoZQogIFJORlIgYW5kIFJOVE8gY29tbWFuZHMuCgpEYW5pZWwgKDMxIE1hcikKLSBFdmVuIG1vcmUgU1NMIGNvbmZpZyBjaGVjayBtb2RpZmljYXRpb25zIGFmdGVyIFJpY2hhcmQncyB0ZXN0aW5nLgoKVmVyc2lvbiA3LjEwLjQtcHJlNiAoMzEgTWFyIDIwMDMpCgpEYW5pZWwgKDMxIE1hcikKLSBNb3JlIGZpeGVzIGZvciB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgY2hlY2tzIHdoZW4gU1NMIGNvbmZpZ3MgYXJlIGNoYW5nZWQKICBiZXR3ZWVuIGNvbm5lY3Rpb25zLiBCYXNlZCBvbiB0ZXN0cyBhbmQgdGFsa3Mgd2l0aCBSaWNoYXJkIEJyYW1hbnRlLgoKLSBHdWlsbGF1bWUgQ290dGVuY2VhdSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgQ1VSTE9QVF9VTlJFU1RSSUNURURfQVVUSC4KICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgcHJldmVudCBsaWJjdXJsIGZyb20gbGltaXRpbmcgdG8gd2hpY2ggaG9zdCBpdCBzZW5kcwogIHVzZXIrcGFzc3dvcmQgdG8gd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLiBCeSBkZWZhdWx0LCBsaWJjdXJsIG9ubHkgc2VuZHMKICBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgaG9zdCB1c2VkIGluIHRoZSBmaXJzdCBVUkwsIGJ1dCB3aXRoIHRoaXMKICBvcHRpb24gc2V0IGl0IHdpbGwgc2VuZCB0aGUgYXV0aCBpbmZvIHRvIGFsbCBob3N0cyBpdCBmb2xsb3dzIGxvY2F0aW9uCiAgaGVhZGVycyB0by4gVGhlIG5ldyB0b29sIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoaXMgaXMgbmFtZWQKICAiLS1sb2NhdGlvbi10cnVzdGVkIi4KCi0gRnJhbmtpZSBGb25nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgaWYgeW91IHJlLXVzZWQgYW4gZWFzeSBoYW5kbGUKICB3aXRoIGEgcHJveHksIGFuZCB5b3UgZmlyc3QgbWFkZSBhIGh0dHBzOi8vIGNvbm5lY3Rpb24gdG8gYSBob3N0IGFuZCB0aGVuCiAgc3dpdGNoZWQgdG8gYSBodHRwOi8vIG9uZSB0byB0aGUgc2FtZSBob3N0LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSByZS11c2UKICB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBpdCBhbmQgZmFpbCB0byBnZXQgdGhlIHNlY29uZCBVUkwgcHJvcGVybHkKCkRhbmllbCAoMjkgTWFyKQotIERhbiBTaGVhcmVyJ3MgZml4IHRoYXQgbWFrZXMgY3VybCBjb21wbGFpbiBpZiBpbnZva2VkIHdpdGggbm90aGluZyBidXQgImN1cmwKICAtTyIgd2FzIGFwcGxpZWQuCgpEYW5pZWwgKDI2IE1hcikKLSBCcnlhbiBLZW1wIHdhcyBmcmllbmRseSBlbm91Z2ggdG8gbGVuZCBtZSBhbiBhY2NvdW50IG9uIGhpcyBSZWRoYXQgOSBib3ggYW5kCiAgSSBjb3VsZCBmaXggdGhlIGNvbmZpZ3VyZSBwcm9ibGVtcyBvbiByZWRoYXQgOC4xIGFuZCA5IGluIG5vIHRpbWUgdGhhbmtzIHRvCiAgdGhpcy4gVGhhbmtzIGEgYnVuY2ggQnJ5YW4hCgpEYW5pZWwgKDI1IE1hcikKLSBSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMKClZlcnNpb24gNy4xMC40LXByZTUgKDI1IE1hciAyMDAzKQoKRGFuaWVsICgyNSBNYXIpCi0gUmljaGFyZCBCcmFtYW50ZSBwcm92aWRlZCBhIGZpeCBmb3IgYSBoYW5kbGUgcmUtdXNlIHByb2JsZW0gc2VlbiB3aGVuIHlvdQogIGNoYW5nZSBvcHRpb25zIG9uIGFuIFNTTC1lbmFibGVkIGNvbm5lY3Rpb24gYmV0d2VlbiByZXF1ZXN0cy4gUHJldmlvdXNseSwKICBjaGFuZ2luZyBwZWVyIHZlcmlmaWNhdGlvbiBvciBob3N0IHZlcmlmaWNhdGlvbiBhbmQgc2ltaWxhciB0aGluZ3Mgd2FzIG5vdAogIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGEgY29ubmVjdGlvbiB3ZXJlIGNoZWNrZWQgZm9yIHJlLXVzZSBhbmQgdGh1cwogIGVuYWJsaW5nIHN0cmljdGVyIGNoZWNrIGJldHdlZW4gcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gbWFkZSBubwogIGRpZmZlcmVuY2UgYW5kIHRoZSBjb25uZWN0aW9uIHdvdWxkIHRodXMgYmUgdXNlZCBlcnJvbmVvdXNseS4KCkRhbmllbCAoMjQgTWFyKQotIEf2dHogQmFiaW4tRWJlbGwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY2EtYnVuZGxlLmNydCBmaWxlIGNvbnRhaW5lZCBhCiAgY2VydGlmaWNhdGUgZnJvbSBUcnVzdGNlbnRlciB0aGF0IHdhcyBhIGRlbW8gY2VydGlmaWNhdGUgb25seSB0aGF0IHdhcyBuZXZlcgogIGludGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBDQSBidW5kbGUuCgpEYW5pZWwgKDIxIE1hcikKLSBMaWZlIGlzIGEgbXlzdGVyeS4gV2l0aGluIGEgdGltZSBwZXJpb2Qgb2YgMTcgaG91cnMsIFRpbSBQb3BlIGFuZCBNaWNoYWVsCiAgQ2h1cmNoaWxsIGZpbGVkIG9uZSBidWcgcmVwb3J0IGVhY2gsIGJvdGggaWRlbnRpZnlpbmcgcHJvYmxlbXMgd2l0aCBhIHNlY29uZAogIHRyYW5zZmVyIHdoZW4gZG9pbmcgcGVyc2lzdGVudCB0cmFuc2ZlcnMgcmUtdXNpbmcgYSBjb25uZWN0aW9uLiBUaW0ncyBvbmUgaXMKICAjNzA2NjI0LCBsYWJlbGVkICJNdWx0aXBsZSB1cGxvYWRzIHBlciBoYW5kbGUgZmFpbCIgYW5kIE1pY2hhZWwncyAjNzA3MDAzCiAgIkRvZXMgbm90IHNlbmQgQXV0aG9yaXphdGlvbjogaGVhZGVyIHdoZW4gcmV1c2luZyBjb25uZWN0aW9uIi4gSSBjb3VsZCB0cmFjawogIGJvdGggZG93biB0byB0aGUgc2FtZSBwaWVjZSBvZiBsb2dpYyBhbmQgaXQgdHVybmVkIG91dCBsaWJjdXJsIHdhcyBub3QgdXNpbmcKICBuZXcgc2V0dGluZ3MgcHJvcGVybHkgd2hlbiByZS11c2luZyBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBUaGlzIGNvbmNlcm5lZAogIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBhbmQgaW52b2x2ZWQgZXhhY3RseSB0aG9zZSBwaWVjZXMgdGhlc2UgdHdvCiAgcmVwb3J0cyBpZGVudGlmaWVkLiBUaGlzIGNvZGUgaGFzIGJlZW4gdGhpcyBmYXVsdHkgc2luY2UgdGhlIGRheSBJCiAgaW50cm9kdWNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLCBtb3JlIHRoYW4gMiB5ZWFycyBhZ28uCgpEYW5pZWwgKDIwIE1hciAyMDAzKQotIEZpdmUgeWVhciBhbm5pdmVyc2FyeS4gVG9kYXkgZml2ZSB5ZWFycyBhZ28sIHRoZSBmaXJzdCBldmVyIGN1cmwgcmVsZWFzZSBzYXcKICB0aGUgbGlnaHQgb2YgZGF5LgoKRGFuaWVsICgxNyBNYXIpCi0gQW5keSBDZWRpbG5payBjb3JyZWN0ZWQgZmxhd3MgaW4gc29tZSBsaWJjdXJsIGV4YW1wbGUtdXNhZ2Ugc291cmNlcy4KCkRhbmllbCAoMTYgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIHJlcG9ydGVkIHRoYXQgdGhlIGZpeCBmcm9tIE1hcmNoIDJuZCB3YXMgaW5jb21wbGV0ZS4KCi0gQWRkZWQgY29kZSB0byB0aGUgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvciBzZWxlY3QoKSBhcmd1bWVudCB0eXBlcy4gSSd2ZQogIG5vdCBtYWRlIGFueSBjb2RlIHVzZSB0aGUgcmVzdWx0cyBqdXN0IHlldCB0aG91Z2guCgpEYW5pZWwgKDE1IE1hcikKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCB0d28gcGF0Y2hlcyB0byBidWlsZCBiZXR0ZXIgb24gV2luZG93cy4KCi0gQWRqdXN0ZWQgdGhlIHRlc3Qgc3VpdGUgY29kZSB0byBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlcihzKSByZXF1aXJlZAogIGZvciBhIHNwZWNpZmljIHRlc3QgaXMgcHJvcGVybHkgc3RhcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBhdHRlbXB0ZWQuCiAgTWFueSB0ZXN0cyBub3cgcnVuIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMTQgTWFyKQotIEFub3RoZXIgY29uZmlndXJlLmluIGFkanVzdG1lbnQgbWFkZSB0aGUgY29uZmlndXJlIGRldGVjdCBmdW5jdGlvbnMgcHJvcGVybHkKICBvbiBIUFVYIG5vdy4KCkRhbmllbCAoMTMgTWFyKQotIFBoaWxpcHBlIFJhb3VsdCBmaXhlZCBwcmU0LWNvbXBpbGUgcXVpcmtzIGZvciBGcmVlQlNELgoKVmVyc2lvbiA3LjEwLjQtcHJlNCAoMTMgTWFyIDIwMDMpCgpEYW5pZWwgKDEzIE1hcikKLSBBZGRlZCBhIGJhY2t1cC1jaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGZvdW5kIGJ5IEFDX0NIRUNLX0ZVTkNTKCkKICBhcyBJIGJlbGlldmUgc29tZSBjaGVja3Mgb24gSFBVWCBuZWVkIHRoaXMuIEF0IGxlYXN0IHNvbWUgb2YgdGhlIGluZm8gZ2l2ZW4KICB0byB1cyBieSBSaWNrIEpvbmVzIHNlZW1lZCB0byBpbmRpY2F0ZSB0aGlzLgoKRGFuaWVsICgxMiBNYXIpCi0gVGhvbWFzIFRvbmlubyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCB0aGUgY3VybCB0b29sIHRvIGRvIFBVVCBvcGVyYXRpb25zCiAgYXMgaW4gJ2N1cmwgd3d3LmZvby5jb20vZGlyLyAtVCBmaWxlJyBhbmQgdGhlIGZpbGUgbmFtZSBpbmNsdWRlZCBmb3IgZXhhbXBsZQogIHNwYWNlIG9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBiZWxvbmcgaW4gVVJMcywgY3VybCBkaWQgbm90IHByb3Blcmx5CiAgVVJMIGVuY29kZSB0aGVtIGJlZm9yZSB1c2luZyB0aGVtIGluIHRoZSBVUkwuCgotIEFkZGVkIGFuIG9wdGlvbiB0byBjb25maWd1cmUgY2FsbGVkIC0tZW5hYmxlLWxpYmdjYyB0aGF0IHNpbXBseSBhZGRzIC1sZ2NjCiAgdG8gdGhlIExJQlMgdmFyaWFibGUsIGFzIHRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbS4KCi0gSSBtb2RpZmllZCB0aGUgY29uZmlndXJlLmluIGZpbGUsIHNvIHRoYXQgdGhlIGhlYWRlcnMgYXJlIG5vdyBjaGVja2VkIGluIGFuCiAgb3JkZXIgb2YgInZpYWxpdHkiLiBXZSBtdXN0IGFsc28gbWFrZSBzdXJlIHRvIHVzZSB0aGUgImRlZmF1bHQgaGVhZGVycyIKICBwYXJhbWV0ZXIgdG8gQUNfQ0hFQ0tfSEVBREVSUygpIHNvIHRoYXQgaGVhZGVycyBhcmUgY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIKICBwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIChpLmUgYWxsIHRoZSBtYWpvciBhbmQgZ2VuZXJhbGx5IGltcG9ydGFudCBoZWFkZXIKICBmaWxlcyBhcmUgaW5jbHVkZWQgdGhlcmUgYnkgZGVmYXVsdCkuIFRoaXMgbWlnaHQgYmUgd2hhdCB3ZSBuZWVkIGZvciB2YXJpb3VzCiAgU3VuLCBIUCwgQUlYIGFuZCBUcnU2NCBzeXN0ZW1zIHRvIGJlaGF2ZSBnb29kIGFnYWluIG9uIHRoZSBoZWFkZXIgY2hlY2sKICBmcm9udC4KCi0gUmljayBKb25lcyBwb2ludGVkIG91dCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBvbiBIUC1VWCB0aGF0IEkgYWRkcmVzc2VkLgoKLSBJIG1hZGUgdGhlIGNvbmZpZ3VyZSAtLWhlbHAgb3V0cHV0IG5pY2VyIGJ5IHVzaW5nIEFDX0hFTFBfU1RSSU5HKCkgYSBsb3QKICBtb3JlLgoKRGFuaWVsICgxMSBNYXIpCi0gQ2hyaXN0b3BoZSBEZW1vcnkgZml4ZWQgdGhlIHNvY2tldCBzZW5kaW5nIGNvZGUgdG8gd29yayBiZXR0ZXIgb24gSFAtVVgKICB3aGVuIHNlbmRpbmcgZGF0YSB0byBhIHNvY2tldCB0aGF0IHdvdWxkIGJsb2NrLiBJdCB0aGVuIHJldHVybnMgRUFHQUlOLCBub3QKICBFV09VTERCTE9DSy4KCi0gUmljaGFyZCBHb3J0b24gaW1wcm92ZWQgdGhlIHNlZWRpbmcgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBhIGdvb2QKICBhbmQgcmVsaWFibGUgcmFuZG9tIHNvdXJjZS4KCi0gUmljaGFyZCBHb3J0b24gZml4ZWQgYSBmZXcgd2FybmluZ3MgdGhhdCBwb3BwZWQgdXAgd2hlbiB5b3UgYnVpbHQgY3VybAogIHVzaW5nIHRoZSBTdW4gY29tcGlsZXIgb24gYSA2NGJpdCBTUEFSQyBwbGF0Zm9ybS4KCi0gTWFydGluIEMuIE1hcnRpbiBmaXhlZCBhIGNhc2Ugd2hlcmUgYSBjb25uZWN0IGZhaWx1cmUgdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGRpZG4ndCBwcm9kdWNlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nLgoKRGFuaWVsICgxMCBNYXIpCi0gUmV2ZXJ0ZWQgbHRtYWluLnNoIGJhY2sgdG8gbGlidG9vbCAxLjQuMiBzdGF0dXMgYWdhaW4sIGFzIHRoZSAxLjQuMyB2ZXJzaW9uCiAgYnJva2UgdGhlIGJ1aWxkIG9uIG51bWVyb3VzIHBsYXRmb3Jtcy4gSXQgc2VlbXMgdGhhdCBsaWJ0b29sIDEuNC4zIHB1dHMgc29tZQogIHJlcXVpcmVtZW50cyBvbiB3aGF0IHZlcnNpb25zIG9mIHRoZSBvdGhlciB0b29scyAoYXV0b2NvbmYgKyBhdXRvbWFrZSkgdGhhdAogIEkgYW0gbm90IGZhbWlsaWFyIHdpdGggYW5kIHRodXMgSSBjb3VsZG4ndCBmdWxmaWxsIGF0IHRoaXMgcG9pbnQuCgogIFllcywgdGhpcyBpcyBtb3JlIHRoYW4gbWlsZGx5IGZydXN0cmF0aW5nLgoKRGFuaWVsICg3IE1hcikKLSBSdW4gbGlidG9vbGl6ZSB2ZXJzaW9uIDEuNC4zLgoKVmVyc2lvbiA3LjEwLjQtcHJlMyAoNCBNYXIgMjAwMykKCkRhbmllbCAoMyBNYXIpCi0gQWRkZWQgc2hhcmUub2JqIHRvIHRoZSBWQzYgYW5kIEJvcmxhbmQgbGliY3VybCBtYWtlZmlsZXMuCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmb3VuZCBhbmQgaW52ZXN0aWdhdGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgb24gQUlYLAogIHByZXN1bWFibHkgb25seSBvbiA0LjMgb3IgbGF0ZXIuIGdldGhvc3RieW5hbWVfcigpIGlzIG5vdCByZXR1cm5pbmcgZGF0YQogIHRoYXQgaXMgcG9zc2libGUgdG8gImtlZXAiIGFuZCBjYWNoZSB0aGUgd2F5IGxpYmN1cmwgZG9lcy4gQnV0IGluc3RlYWQgdGhlc2UKICB2ZXJzaW9ucyBvZiBBSVggdXNlcyBhIGdldGhvc3RieW5hbWUoKSB0aGF0IHdvcmtzIHRocmVhZC1zYWZlbHkgd2UgY2FuCiAgaW5zdGVhZCB1c2UgdGhlIG9yZGluYXJ5IGdldGhvc3RieW5hbWUoKSBhbmQgb3VyIHBhY2tfaG9zdGVudCgpIGFwcHJvYWNoIHRvCiAgYWNoaWV2ZSB3aGF0IHdlIHdhbnQuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgQUlYIDQuMyBvcgogIGxhdGVyIHRvIGFkanVzdCBmb3IgdGhpcy4KCkRhbmllbCAoMiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgZm91bmQgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy4xMC4zIHdoZW4geW91IGZpcnN0IGRpZCBhCiAgUE9TVCBhbmQgdGhlbiBiYWNrIHRvIGEgR0VUIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLgoKRGFuaWVsICgyOCBGZWIpCi0gUmVtb3ZlZCB0aGUgc3RyZXF1YWwgYW5kIHN0cm5lcXVhbCBkZWZpbmVzIGZyb20gY3VybC9jdXJsLmggaGVhZGVyLiBUaGV5CiAgd2VyZSBuZXZlciBtZWFudCBmb3IgdGhlIHB1YmxpYyBoZWFkZXIgYW55d2F5LiBQaGlsaXBwZSBSYW91bHQgYnJvdWdodCBpdAogIHVwLgoKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgUklTQyBPUyBidWlsZC4KCkRhbmllbCAoMjcgRmViKQotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGUgdmVyeSBtaXNsZWFkaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkIG1hbiBwYWdlLCBhbmQKICBJIHVwZGF0ZWQgaXQgdG8gYmVjb21lIG1vcmUgYWNjdXJhdGUuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZGluZyB0aGF0IHR1cm5lZCBvdXQgdG8KICBiZSBoaXMgRlRQIHNlcnZlciByZXR1cm5pbmcgc2l6ZSB6ZXJvICgwIGJ5dGVzKSB3aGVuIFNJWkUgd2FzIHVzZWQgb24gYSBmaWxlCiAgd2hpbGUgYmVpbmcgaW4gQklOQVJZIG1vZGUuIFdlIG5vdyBtYWtlIGEgc2Vjb25kIGNoZWNrIGZvciB0aGUgYWN0dWFsIHNpemUKICBieSBzY2FubmluZyB0aGUgUkVUUiByZXBseSBhbnl3YXksIGV2ZW4gaWYgdGhlIFNJWkUgY29tbWFuZCByZXR1cm5lZCAwLgoKRGFuaWVsICgyNiBGZWIpCi0gS3lsZSBTYWxsZWUgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGhlIHdvdWxkIGRvIGEgdHJhbnNmZXIgdGhhdCBkaWRuJ3QgdXBkYXRlCiAgdGhlIHByb2dyZXNzIG1ldGVyIHByb3Blcmx5LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgbG9vcCBhIGxpdHRsZSB0b28gZWFnZXJseSBpbiB0aGUgdHJhbnNmZXIgbG9vcCwgd2hpY2ggaXNuJ3QgcmVhbGx5IGdvb2QgZm9yCiAgdGhlIEFQSXMsIGVzcGVjaWFsbHkgbm90IHRoZSBtdWx0aSBBUEkuCgpWZXJzaW9uIDcuMTAuNC1wcmUyICgyNCBGZWIgMjAwMykKCkRhbmllbCAoMjQgRmViKQotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBvdXQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTUFYQ09OTkVDVFMgdG8gYSB2YWx1ZSBoaWdoZXIKICB0aGFuIDUgY291bGQgY2F1c2UgYSBzZWdmYXVsdC4KCi0gSSBiZWxpZXZlIEkgZml4ZWQgdGhlICdFeHBlY3Q6IDEwMC1jb250aW51ZScgYmVoYXZpb3IgdGhhdCBoYXMgYmVlbiBicm9rZW4KICBmb3IgYSB3aGlsZSAoSSB0aGluayBzaW5jZSBteSBjaGFuZ2UgZGF0ZWQgRGVjIDEwIDIwMDIpLiBXaGVuIHRoaXMgaGVhZGVyIGlzCiAgdXNlZCwgbGliY3VybCBzaG91bGQgd2FpdCBmb3IgYSBIVFRQIDEwMCAob3IgdGltZW91dCkgYmVmb3JlIHNlbmRpbmcgdGhlCiAgcG9zdC9wdXQgZGF0YS4KCkRhbmllbCAoMTQgRmViKQotIE1hdHRoZXcgQ2xhcmtlIHByb3ZpZGVkIHNvbWUgaW5mbyB3aGF0IHRvIG1vZGlmeSB0byBtYWtlIGN1cmwgYnVpbGQKICBmbGF3bGVzc2x5IG9uIEFJWCAzLjIuNS4KCi0gTWFydGluIEMuIE1hcnRpbiBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbgogIHJ1bm5pbmcgb24gV2luZG93cyBhbmQgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBwb3J0IHdpdGhvdXQgYSBsaXN0ZW5lci4KCkRhbmllbCAoMTMgRmViKQotIENocmlzdG9waGVyIFIuIFBhbG1lciBmaXhlZCBDdXJsX2Jhc2U2NF9lbmNvZGUoKSB0byBkZWFsIHdpdGggemVyb2VzIGluIHRoZQogIGRhdGEgdG8gZW5jb2RlLgoKRGFuaWVsICg0IEZlYikKLSBKZWFuLVBoaWxpcHBlIGFkZGVkIHRoZSBmaXJzdCBjb2RlIHRoYXQgZW5hYmxlcyB0aGUgJ3NoYXJlJyBzeXN0ZW0uIFRoaXMKICBzaG91bGQgbm93IGVuYWJsZSBzaGFyaW5nIG9mIEROUyBkYXRhIGJldHdlZW4gdHdvIGN1cmwgZWFzeSBoYW5kbGVzLgoKLSBJbmNvcnBvcmF0ZWQgTmljbyBCYWdndXMnIGZpeGVzIHRvIGFnYWluIGNvbXBpbGUgZmxhd2xlc3NseSBvbiBWTVMuCgotIEphbWVzIEJ1cnNhIGNvcnJlY3RlZCBhIGJhZCBjb21tZW50IGluIHRoZSBwdWJsaWMgaW5jbHVkZSBmaWxlIGN1cmwvbXVsdGkuaAoKLSBQZXRlciBGb3JyZXQgcmVwb3J0ZWQgb25lIG9mIHRob3NlIGVycm9yOjAwMDAwMDAwIGNhc2VzIGluIGxpYmN1cmwgYWdhaW4KICB3aGVuIGNvbm5lY3RpbmcgdG8gYSBIVFRQUyBzaXRlLCBhbmQgdGhpcyB0aW1lIEkgZGlkIGRpc2NvdmVyIHNvbWUgb2RkaXRpZXMKICBpbiBob3cgY3VybCByZXBvcnRzIFNTTCBlcnJvcnMgYmFjay4gSXQgY291bGQgbWlzcyBzaG93aW5nIHRoZSBhY3R1YWwgZXJyb3IuCgpWZXJzaW9uIDcuMTAuNC1wcmUxICgzIEZlYiAyMDAzKQoKRGFuaWVsICgzIEZlYikKLSBSZW1vdmVkIHRoaW5ncyBpbiB0aGUgZG9jcyBzYXlpbmcgY2FwYXRoIGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzLCBhcyBKdWxpYW4KICBOb2JsZSB0b2xkIHVzIGl0IHdvcmtzIGZpbmUuCgpEYW5pZWwgKDMxIEphbikKLSBLZXZpbiBSb3RoIGZpeGVkIHRoZSB6bGliIGJ1aWxkIHN0dWZmIGluIHRoZSBNaW5ndzMyIG1ha2VmaWxlLgoKRGFuaWVsICgzMCBKYW4pCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBjdXJsIG9uIFdpbmRvd3MgYWx3YXlzIGNoZWNrZWQgZm9yIHRoZSBDQSBjZXJ0CiAgYnVuZGxlIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlIHBhdGggc2NhbiwgZXZlbiB0aG91Z2gKICAtay8tLWluc2VjdXJlIHdhcyB1c2VkLgoKLSBIYW1pc2ggTWFja2VuemllIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBvbmx5IGRpZCBzdHJpY3QgaG9zdCBuYW1lIHZlcmlmeWluZwogIGlmIGNhcGF0aCBvciBjYWluZm8gd2FzIHVzZWQuIE5vdyBpdCdsbCBhbHdheXMgZG8gaXQgdW5sZXNzIC1rIC8gLS1pbnNlY3VyZQogIGlzIHVzZWQhCgotIFBhdmVsIENlbmVrIHBvaW50ZWQgb3V0IHRoYXQgdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIHdhcyBkb25lIHdyb25nbHkKICBhcyB0aGUgZnVsbCBzdHJpbmcgd2FzIG5vdCBmZXRjaGVkLiBBZGRlZCB0ZXN0IGNhc2UgNTcgdG8gdmVyaWZ5IHRoYXQgY3VybAogIGRvZXMgaXQgcmlnaHQgbm93LgoKRGFuaWVsICgyOSBKYW4pCi0gSmFtaWUgV2lsa2luc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgY3VybCBhdHRlbXB0IHRvIGNsZWFyIG91dAogICJzZW5zaXRpdmUiIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBwcyBvdXRwdXRzCiAgKG9ubHkgb24gcGxhdGZvcm1zIHRoYXQgYWxsb3cgd3JpdGluZyB0byBhcmd2W10pLgoKLSBKb2huIE1jR293YW4gZm91bmQgb3V0IHRoYXQgdGhlIERFQlVHRlVOQ1RJT04gY291bGQgYmUgY2FsbGVkIHdpdGggYmFkCiAgYXJndW1lbnRzIGFuZCB0aHVzIGNhdXNlIHRoZSAtLXRyYWNlIG91dHB1dHMgdG8gZ28gd3JvbmcuCgotIFJlbW92ZWQgYWxsIHRoZSBlbWFjcyBsb2NhbCB2YXJpYWJsZXMgZnJvbSBhbGwgZmlsZXMuIE1hdHMgTGlkZWxsIHByb3ZpZGVkCiAgdGhlIG5ldyBzYW1wbGUuZW1hY3MgZmlsZSAoZm9yIGEgc2FtcGxlIG9mIHdoYXQgdG8gaW5jbHVkZSBpbiB5b3VyIC5lbWFjcykKICBhbmQgdGhlIGN1cmwtc3R5bGUuZWwgdGhhdCBzZXRzIGEgYmV0dGVyIGMtc3R5bGUgZm9yIGVkaXRpbmcgY3VybCBzb3VyY2VzLgoKLSBEYXZlIEhhbGJha2tlbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBGVFAgZG93bmxvYWRzIHRoYXQgY291bGQgYWNjaWRlbnRseQogIHJldHVybiBDVVJMRV9QQVJUSUFMX0ZJTEUgd2hlbiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdhcyBjYWxsZWQgd2l0aCBOT0JPRFkKICBzZXQgVFJVRS4KCkRhbmllbCAoMjcgSmFuKQotIFRoZSBmb3Blbi5jIGV4YW1wbGUgd2FzIGZsYXdlZCBhcyBOaWNrIEh1bWZyZXkgbm90aWNlZCwgYW5kIEkgZml4ZWQgaXQgdG8KICB3b3JrIGFnYWluLgoKRGFuaWVsICgyNCBKYW4pCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgKHRoZSBjb250ZW50LXR5cGUgc3RyaW5nKQogIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4KCkRhbmllbCAoMjIgSmFuIDIwMDMpCi0gSWFuIFdpbGtlcyBhbmQgTGVnb2ZmIFZpbmNlbnQgYm90aCBpbmRlcGVuZGVudGx5IHByb3ZpZGVkIGZpeGVzIGZvciBtYWtpbmcKICBjdXJsL211bHRpLmggd29yayBwcm9wZXJseSB3aGVuIGNvbXBpbGVkIHdpdGggYSBDKysgY29tcGlsZXIuCgpEYW5pZWwgKDIwIEphbiAyMDAzKQotIEZpeGVkICdidWlsZGNvbmYnIHRvIGNoZWNrIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZXF1aXJlZCB0b29scyBiZWZvcmUKICB0aGV5J3JlIGFjdHVhbGx5IHVzZWQuCgotIFdyb3RlICd0ZXN0Y3VybC5zaCcsIGEgc2NyaXB0IHRhcmdldGVkIGZvciBhdXRvbWF0aWMgYW5kIGRpc3RyaWJ1dGVkIGN1cmwKICB0ZXN0cyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KCi0gRGF2aWQgVGhpZWwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLm5ldHJjIGZpbGUgd2FzIG5vdCBiZWluZyBkZWFsdCB3aXRoCiAgcHJvcGVybHkgYW55bW9yZS4gSSBicm9rZSB0aGlzIGluIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgImZpeCIuCgotIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIHBhdGNoZWQgbGliY3VybCB0byBhbGxvY2F0ZSB0aGUgc2NyYXRjaCBidWZmZXIgb25seQogIG9uIGRlbWFuZCBhbmQgdGh1cyB3ZSBzYXZlIDMyS0IgaW4gZWFjaCBjdXJsIGhhbmRsZSB0aGF0IGRvbid0IHVzZSB0aGF0CiAgYnVmZmVyLiBUaGlzIG5lZWQgYXBwZWFyZWQgd2hlbiBzb21lIHBlb3BsZSBzdGFydGVkIHVzaW5nIHRob3VzYW5kcyBvZgogIHNpbXVsdGFuZW91cyBjdXJsIGhhbmRsZXMuLi4gOi0pCgpEYW5pZWwgKDE2IEphbiAyMDAzKQotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgY3VybC1jb25maWcgLS1jZmxhZ3Mgd2hlbiB0aGUgaW5jbHVkZWRpciB3YXMgbm90CiAgL3Vzci9pbmNsdWRlLgoKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIENVUkxJTkZPX1BSSVZBVEUgdG8gcHJvcGVybHkgcmV0dXJuIE5VTEwgaWYgaXQgd2FzCiAgc2V0IHRvIE5VTEwhCgpWZXJzaW9uIDcuMTAuMyAoMTQgSmFuIDIwMDMpCgpEYW5pZWwgKDEwIEphbiAyMDAzKQotIFN0ZXZlIE9saXBoYW50IHBvaW50ZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDEwNSBkaWQgbm90IHdvcmsgYW55bW9yZSBhbmQgdGhpcwogIHdhcyBkdWUgdG8gYSBtaXNzaW5nIGZpeCBmb3IgdGhlIHBhc3N3b3JkIHByb21wdGluZy4KClZlcnNpb24gNy4xMC4zLXByZTYgKDEwIEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEJyeWFuIEtlbXAgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIC11IGNvdWxkIG5vdCBwcm92aWRlIGEgYmxhbmsgcGFzc3dvcmQKICB3aXRob3V0IHByb21wdGluZyB0aGUgdXNlci4gSXQgY2FuIG5vdy4gLXUgdXNlcm5hbWU6IG1ha2VzIHRoZSBwYXNzd29yZAogIGVtcHR5LCB3aGlsZSAtdSB1c2VybmFtZSBtYWtlcyBjdXJsIHByb21wdCB0aGUgdXNlciBmb3IgYSBwYXNzd29yZC4KCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIGEgcmVtYWluaW5nIGNvbm5lY3QgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIG9uCiAgaXB2NCBzeXN0ZW1zIChMaW51eCBvbmx5PyksIHRoYXQgSSBmaXhlZCBhbmQgS2pldGlsIHZlcmlmaWVkIHRoYXQgaXQgZml4ZWQKICBoaXMgcHJvYmxlbXMuCgotIG1lbWFuYWx5emUucGwgbm93IHJlYWRzIGEgZmlsZSBuYW1lIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYW5kIG5vIGxvbmdlcgogIHRha2VzIHRoZSBkYXRhIG9uIHN0ZGluIGFzIGJlZm9yZS4KClZlcnNpb24gNy4xMC4zLXByZTUgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gRml4ZWQgdGVzdHMvbWVtYW5hbHl6ZS5wbCB0byB3b3JrIHdpdGggZmlsZSBuYW1lcyB0aGF0IGNvbnRhaW4gY29sb25zIChhcyBvbgogIFdpbmRvd3MpLgogIAotIEtqZXRpbCBKYWNvYnNlbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRoYXQgbGliL3NoYXJlLmggd2FzIG1pc3NpbmcuLi4KClZlcnNpb24gNy4xMC4zLXByZTQgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gVXBkYXRlZCBsaWIvc2hhcmUuYyBxdWl0ZSBhIGJpdCB0byBtYXRjaCB0aGUgZGVzaWduIGRvY3VtZW50IGF0CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9kZXYvc2hhcmluZy50eHQgYSBsb3QgbW9yZS4KCiAgSSdsbCB0cnkgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCBzb29uaXNoLiBzaGFyZS5jIGlzIHN0aWxsIG5vdCBhY3R1YWxseSB1c2VkCiAgYnkgbGliY3VybCwgYnV0IHRoZSBBUEkgaXMgc2xvd2x5IGdldHRpbmcgdGhlcmUgYW5kIHdlIGNhbiBzdGFydAogIGltcGxlbWVudGluZyBjb2RlIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHRoaXMgc3lzdGVtLgoKRGFuaWVsICg4IEphbiAyMDAzKQotIFVwZGF0ZWQgc2hhcmUgc3R1ZmYgaW4gY3VybC9jdXJsLmgsIGluY2x1ZGluZyBkYXRhIHR5cGVzLCBzdHJ1Y3RzIGFuZAogIGZ1bmN0aW9uIHByb3RvdHlwZXMuIFRoZSBjb3JyZXNwb25kaW5nIGZpbGVzIGluIGxpYi8gd2VyZSBhbHNvIG1vZGlmaWVkCiAgb2YgY291cnNlIHRvIHJlbWFpbiBjb21waWxhYmxlLiBCYXNlZCBvbiBpbnB1dCBmcm9tIEplYW4tUGhpbGlwcGUgYW5kIGFsc28KICB0byBtYWtlIGl0IG1vcmUgaW4gbGluZSB3aXRoIHRoZSBkZXNpZ24gZG9jdW1lbnQuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgcGF0Y2hlZCBhIHZlcnkgdHJpdmlhbCBtZW1vcnkgbGVhayBpbgogIGN1cmxfZXNjYXBlKCkgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiByZWFsbG9jKCkgcmV0dXJucyBOVUxMLi4uCgotIE1hdHRoZXcgQmxhaW4gcHJvdmlkZWQgZmVlZGJhY2sgdG8gbWFrZSB0aGUgLS1jcmVhdGUtZGlycyBzdHVmZiBidWlsZAogIHByb3Blcmx5IG9uIFdpbmRvd3MuCgotIEZpeGVkIHRoZSAjaW5jbHVkZSBpbiB0ZXN0cy9saWJ0ZXN0L2ZpcnN0LmMgYXMgTGVnb2ZmIFZpbmNlbnQgcG9pbnRlZCBvdXQuCgpEYW5pZWwgKDcgSmFuIDIwMDMpCi0gUGhpbGlwcGUgUmFvdWx0IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBwcm9wZXJseSBzdXBwb3J0CiAgd2lsZGNhcmQgY2hlY2tzIGZvciBjZXJ0aWZpY2F0ZSBuYW1lcy4KCi0gU2ltb24gTGl1IGFkZGVkIENVUkxPUFRfSFRUUDIwMEFMSUFTRVMsIHRvIGxldCBhbiBhcHBsaWNhdGlvbiBzZXQgb3RoZXIKICBzdHJpbmdzIHJlY29nbml6ZWQgYXMgIkhUVFAgMjAwIiB0byBhbGxvdyBodHRwLWxpa2UgcHJvdG9jb2xzIHRvIGdldAogIGRvd25sb2FkZWQgZmluZSBieSBjdXJsLgoKLSBOb3cgdXNpbmcgYXV0b2NvbmYgMi41NyBhbmQgYXV0b21ha2UgMS43LjIKCi0gRG9pbmcgImN1cmwgLUkgZnRwOi8vZG9tYWluL25vbi1leGlzdGluZy1maWxlIiBzdGlsbCBvdXRwdXRlZCBhIGRhdGUhCiAgV2F5bmUgSGFpZ2ggcmVwb3J0ZWQuCgotIFRoZSBlcnJvciBtZXNzYWdlIGlzIG5vdyB3cml0dGVuIHByb3Blcmx5IHdpdGggYSBuZXdsaW5lIGluIHRoZSAtLXRyYWNlCiAgZmlsZS4KCkRhbmllbCAoNiBKYW4gMjAwMykKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBwb3NzaWJsZSBidWc6IHByZXZpb3VzbHksIGlmIHlvdSBjYWxsZWQKICBjdXJsX2Vhc3lfcGVyZm9ybSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBkbnMgY2FjaGUsIHRoZSBnbG9iYWwgY2FjaGUKICB3b3VsZG4ndCBiZSB1c2VkLiBQb2ludGVkIG91dCBieSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlLgoKLSBNYXR0aGV3IEJsYWluJ3MgZml4ZWQgdGhlIFZDNiBsaWJjdXJsIG1ha2VmaWxlIHRvIGluY2x1ZGUgYmV0dGVyIGRlYnVnIGRhdGEKICBvbiBkZWJ1ZyBidWlsZHMuCkRhbmllbCAoMjcgRGVjIDIwMDIpCi0gUGhpbGlwcGUgUmFvdWx0IHJlcG9ydGVkIGEgYnVnIHdpdGggSFRUUFMgY29ubmVjdGlvbnMgd2hpY2ggSSBldmlkZW50bHkKICBhZGRlZCBpbiBteSAxOSBkZWMgZml4LiBJIGNvcnJlY3RlZCBpdC4KCkRhbmllbCAoMjAgRGVjKQotIElkZWEgZnJvbSB0aGUgRGViaWFuIGxhdGVzdCBwYXRjaDogdXNlIEFNX01BSU5UQUlORVJfTU9ERSBpbiB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIG1ha2UgdGhlIGRlZmF1bHQgbWFrZWZpbGUgbGVzcyBjb25mdXNpbmcgInRvIHRoZSBjYXN1YWwKICBpbnN0YWxsZXIiLgoKVmVyc2lvbiA3LjEwLjMtcHJlMyAoMjAgRGVjKQoKRGFuaWVsICgxOSBEZWMpCi0gTWF0dGhldyBCbGFpbiBwYXRjaGVkIHRoZSBDdXJsX2Jhc2U2NF9kZWNvZGUoKSBmdW5jdGlvbi4KCi0gRXZhbiBKb3JkYW4gcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjNjUzMDIyIHRoYXQgdGhlIFNTTF9yZWFkKCkgdXNhZ2Ugd2FzCiAgd3JvbmcsIGFuZCBpdCBjZXJ0YWlubHkgd2FzLiBJdCBjb3VsZCBsZWFkIHRvIGN1cmwgdXNpbmcgdG9vIG11Y2ggQ1BVIGR1ZSB0bwogIGEgc3R1cGlkIGxvb3AuCgpEYW5pZWwgKDE4IERlYykKLSBBcyBzdWdnZXN0ZWQgYnkgTWFyZ3VzIEZyZXVkZW50aGFsLCBDVVJMRV9IVFRQX05PVF9GT1VORCB3YXMgcmVuYW1lZCB0bwogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1Igc2luY2UgaXQgaXMgcmV0dXJuZWQgb24gYW55ID49IDQwMCBjb2RlIHdoZW4KICBDVVJMT1BUX0ZBSUxPTkVSUk9SIGlzIHNldC4KCkRhbmllbCAoMTcgRGVjKQotIEJ1ZyByZXBvcnRlZCAjNjUxNDY0LCByZXBvcnRlZCBieSBDaHJpc3RvcGhlciBQYWxtZXIsIHByb3ZpZGVkIGFuIGV4YW1wbGUKICBzb3VyY2UgY29kZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRoYXQgaGFuZyB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIGEKICBwcm94eSBvbiBhIGxvY2FsaG9zdCBwb3J0IHdoZXJlIG5vIHByb3h5IHdhcyBsaXN0ZW5pbmcuIFRoaXMgYnVnIHdhcyBub3QKICByZXBlYXRhYmxlIG9uIGxpYmN1cmxzIHRoYXQgd2VyZSBJUHY2LWVuYWJsZWQuCgpEYW5pZWwgKDE2IERlYykKLSBDaHJpc3RvcGhlciBQYWxtZXIgYWxzbyBub3RpY2VkIHdoYXQgVm9qdGVjaCBKYW5vdGEgYWxyZWFkeSB3YXMKICBleHBlcmllbmNpbmc6IFRoZSBhdHRlbXB0ZWQgbmFtZSByZXNvbHZlIGZpeCBmb3IgZ2xpYmMgMi4yLjkzIGNhdXNlZCBsaWJjdXJsCiAgdG8gY3Jhc2ggd2hlbiB1c2VkIG9uIHNvbWUgb2xkZXIgZ2xpYmMgdmVyc2lvbnMuIFRoZSBwcm9ibGVtIGlzIG9mIGNvdXJzZQogIHRoZSBzaWxsaW5lc3Mgb2YgdGhlIDIuMi45My4gSSBjb21taXR0ZWQgYSBmaXggdGhhdCBob3BlZnVsbHkgc2hvdWxkIG1ha2UKICB0aGUgYmluYXJ5IHJ1biBmaW5lIG9uIGVpdGhlciBvbmUgb2YgdGhlIHZlcnNpb25zLCBldmVuIHRob3VnaCB0aGUgc29sdXRpb24KICBpcyBub3QgYXMgbmljZSBhcyBJJ2QgbGlrZSBpdCB0byBiZS4KCkRhbmllbCAoMTMgRGVjKQotIEJ1ZyByZXBvcnQgIzY1MTQ2MCBieSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgc2hvd2VkIHRoYXQgd2hlbiB1c2luZyBsaWJjdXJsCiAgdG8gZm9yIGV4YW1wbGUgZ28gb3ZlciBhIHByb3h5IG9uIGxvY2FsaG9zdCwgaXQgd291bGQgYXR0ZW1wdCB0byBjb25uZWN0CiAgdGhyb3VnaCB0aGUgcHJveHkgVFdJQ0UuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDUwMyB3aXRoIHdoaWNoIEkgbWFuYWdlZCB0byByZXBlYXQgdGhpcyBwcm9ibGVtIGFuZCBJCiAgZml4ZWQgdGhlIGNvZGUgdG8gbm90IHJlLWF0dGVtcHQgYW55IGNvbm5lY3RzICh3aGljaCBhbHNvIG1hZGUgaXQgYSBuaWNlcgogIGZpeCBmb3IgdGhlICM2NTA5NDEgYnVnIG1lbnRpb25lZCBiZWxvdykuCgogIFRoZSBzd3Mgc2VydmVyIHdhcyBleHRlbmRlZCB0byBkZWFsIHdpdGggQ09OTkVDVCBpbiBvcmRlciB0byBtYWtlIHRlc3QKICBjYXNlIDUwMyBkbyBnb29kLgoKLSBFdmFuIEpvcmRhbiBwb3N0ZWQgYnVnIHJlcG9ydCAjNjUwOTg5IGFib3V0IGEgbWVtb3J5IGxlYWsgaW4gdGhlIHB1YmxpYyBrZXkKICByZXRyaWV2aW5nIGNvZGUuIEhlIHByb3ZpZGVkIGEgc3VnZ2VzdGVkIGZpeCBhbmQgSSBtZXJlbHkgYXBwbGllZCBpdCEKCi0gQnVnIHJlcG9ydCAjNjUwOTQxLCBwb3N0ZWQgYnkgQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBnZXR0aW5nIGZpbGU6Ly8gVVJMcy4gVGhpcyB3YXMgbm93IGZpeGVkIGFuZAogIHRlc3QgY2FzZSA1MDIgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxMiBEZWMpCi0gVGVzdCBjYXNlIDUwMCBhbmQgNTAxIGFyZSB0aGUgZmlyc3QgZXZlciBsaWJjdXJsIHRlc3QgY2FzZXMgdGhhdCBydW4uCgotIE1hZGUgImNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyIgY3V0IG9mZiBhbGwgLU8qIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyCgotIEZpbmFsbHkgZml4ZWQgdGhlIHRlc3Qgc3VpdGUncyBmdHAgc2VydmVyIHNvIHRoYXQgdGVzdCBjYXNlIDQwMiBkb2Vzbid0CiAgY2F1c2UgdGhlIGZvbGxvd2luZyB0ZXN0IGNhc2UgdG8gZmFpbCBhbnltb3JlIQoKRGFuaWVsICgxMSBEZWMpCi0gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBub3cgZGVjcmVhc2VkIHRvIDE2S0Igc2luY2UgaXQgbWFrZXMgdGhlIFdpbmRvd3MKICB2ZXJzaW9uIHBlcmZvcm0gdXBsb2FkcyBtdWNoIGZhc3RlciEhISBSQnJhbWFudGUgZGlkIGxvdHMgb2YgcmVzZWFyY2ggb24KICB0aGlzIHRvcGljLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gY3VybC9jdXJsLmggdG8gaW5jbHVkZSB0aGUgb3RoZXIgZmlsZXMgb3V0c2lkZSB0aGUKICBleHRlcm4gIkMiIHNjb3BlLgoKRGFuaWVsICgxMCBEZWMpCi0gTW92ZWQgYXJvdW5kIGFuZCBhZGRlZCBtb3JlIGxvZ2ljOgoKICBGaXJzdCwgUE9TVCBkYXRhIGlzIG5ldmVyIHNlbnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdCBoZWFkZXJzIGluIHRoZSBodHRwLmMKICBjb2RlLiBJdCBpcyBhbHdheXMgc2VudCB0aGUgIm5vcm1hbCIgcmVhZCBjYWxsYmFjayB0aGVuIHNlbmQoKSB3YXkuIFRoaXMgbm93CiAgZW5hYmxlcyBhIHBsYWluIEhUVFAgUE9TVCB0byBiZSBzZW50IGNodW5rZWQgaWYgd2Ugd2FudCB0by4gVGhpcyBhbHNvCiAgcmVkdWNlcyB0aGUgcmlzayBvZiBoYXZpbmcgdmVyeSBiaWcgUE9TVHMgY2F1c2luZyBwcm9ibGVtcy4KCiAgRnVydGhlciwgc2VuZGluZyBvZmYgdGhlIGluaXRpYWwgSFRUUCByZXF1ZXN0IGlzIG5vdCBkb25lIHVzaW5nIGEgbG9vcAogIGFueW1vcmUuIElmIGl0IHdhc24ndCBhbGwgc2VudCBvZmYgaW4gdGhlIGZpcnN0IHNlbmQoKSwgdGhlIHJlc3Qgb2YgdGhlCiAgcmVxdWVzdCBpcyBzZW50IG9mZiBpbiB0aGUgbm9ybWFsIHRyYW5zZmVyIHNlbGVjdCgpIGxvb3AuIFRoaXMgbWFrZXMgc2V2ZXJhbAogIHRoaW5ncyBwb3NzaWJsZSwgYnV0IG1haW5seSBpdCBtYWtlcyBsaWJjdXJsIGJsb2NrIGxlc3Mgd2hlbiB1c2VkIGZyb20gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGFuZCBpdCBhbHNvIHJlZHVjZXMgdGhlIHJpc2sgb2YgcHJvYmxlbXMgd2l0aCBpc3N1aW5nIHZlcnkKICBsYXJnZSByZXF1ZXN0cy4KCkRhbmllbCAoOSBEZWMpCi0gTW92ZWQgdGhlIHJlYWQgY2FsbGJhY2sgcG9pbnRlciBhbmQgZGF0YSB3aXRoaW4gdGhlIHN0cnVjdHMgdG8gYSBtb3JlCiAgc3VpdGFibGUgcGxhY2UuIFRoaXMgaW4gcHJlcGFyYXRpb24gZm9yIGEgYmV0dGVyIEhUVFAtcmVxdWVzdCBzZW5kaW5nIGNvZGUKICB3aXRob3V0IChhIHNpbGx5KSBsb29wLgoKLSBUaGUgRG9kZHMgZml4IHNlZW1zIG5vdCB0byB3b3JrLgoKLSBWb2p0ZWNoIEphbm90YSB0ZXN0cyBwcm92ZWQgdGhhdCB0aGUgcmVzb2x2ZSBmaXggZnJvbSBvY3QgMjFzdCBpcyBub3QgZ29vZAogIGVub3VnaCBzaW5jZSBvYnZpb3VzbHkgb2xkZXIgZ2xpYmNzIG1pZ2h0IHJldHVybiBFQUdBSU4gd2l0aG91dCB0aGlzIG1lYW5pbmcKICB0aGF0IHRoZSBidWZmZXIgd2FzIHRvbyBzbWFsbC4KCi0gW3RoZSBvdGhlciBkYXldIE1hZGUgbGliY3VybCBsb29wIG9uIHJlY3YoKSBhbmQgc2VuZCgpIG5vdyB1bnRpbCBkb25lLCBhbmQKICB0aGVuIGdldCBiYWNrIHRvIHNlbGVjdCgpLiBQcmV2aW91c2x5IGl0IHdlbnQgYmFjayB0byBzZWxlY3QoKSBtb3JlIG9mdGVuCiAgd2hpY2ggcmVhbGx5IHdhcyBhIHNsaWdodCBvdmVyaGVhZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSByZXBvcnRlZCBwZXJmb3JtYW5jZQogIHByb2JsZW1zIG9uIEhUVFAgUFVUIG9uIFdpbmRvd3MuIEkgY291bGRuJ3Qgc2VlIGFueSBub3RhYmxlIGRpZmZlcmVuY2Ugb24KICBMaW51eC4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlMiAoNCBEZWMgMjAwMikKCkRhbmllbCAoNCBEZWMgMjAwMikKLSBMb3RzIG9mIHdvcmsgd2l0aCBNYWxjb2xtIERvZGRzIG1hZGUgbWUgYWRkIGEgdGVtcG9yYXJ5IGNvZGUgZml4IHRoYXQgbm93CiAgc2hvcnRlbnMgdGhlIHRpbWVvdXQgd2FpdGluZyBmb3IgdGhlIDIyNiBvciAyNTAgbGluZSBhZnRlciBhIGNvbXBsZXRlZAogIEZUUCB0cmFuc2Zlci4KCiAgSWYgbm8gZGF0YSBpcyByZWNlaXZlZCB3aXRoaW4gNjAgc2Vjb25kcywgdGhpcyBpcyB0YWtlbiBhcyBhIHNpZ24gb2YgYSBkZWFkCiAgY29udHJvbCBjb25uZWN0aW9uIGFuZCB3ZSBiYWlsIG91dC4KCkRhbmllbCAoMyBEZWMgMjAwMikKLSBSYWxwaCdzIGJ1ZyByZXBvcnQgIzY0NDg0MSBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB3aGljaCBjdXJsIHJldHVybmVkIGEKICB0aW1lb3V0IGVycm9yIGNvZGUgd2hlbiBpbiBmYWN0IHRoZSBwcm9ibGVtIHdhcyBub3QgYSB0aW1lb3V0LiBUaGUgcHJvcGVyCiAgZXJyb3Igc2hvdWxkIG5vdyBiZSBwcm9wYWdhdGVkIGJldHRlciB3aGVuIHRoZXkncmUgZGV0ZWN0ZWQgaW4gdGhlIEZUUAogIHJlc3BvbnNlIHJlYWRpbmcgZnVuY3Rpb24uCgotIFVwZGF0ZWQgdGhlIEJvcmxhbmQgTWFrZWZpbGVzLgoKRGFuaWVsICgyIERlYyAyMDAyKQotIE5pY29sYXMgQmVybG9xdWluIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIC0tY3JlYXRlLWRpcnMgdG8gdGhlCiAgY29tbWFuZCBsaW5lIHRvb2wuIFdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIC1vLCBpdCBsZXRzIGN1cmwgY3JlYXRlCiAgW25vbi1leGlzdGluZ10gZGlyZWN0b3JpZXMgdXNlZCBpbiAtbywgc3VpdGFibHkgdXNlZCB3aXRoICMtY29tYmluYXRpb25zCiAgc3VjaCBhczoKCiAgICAgY3VybCAid3d3LmltYWdlcy5jb20ve2Zsb3dlcnMsY2l0aWVzLHBhcmtzLG1vdW50YWluc30vcGljX1sxLTEwMF0uanBnIFwKICAgICAgIC1vICJkaXJfIzEvcGljIzIuanBnIiAtLWNyZWF0ZS1kaXJzCgpWZXJzaW9uIDcuMTAuMy1wcmUxCgpEYW5pZWwgKDI4IE5vdiAyMDAyKQotIEkgdmlzaXRlZCBMYXJzIE5vcmRncmVuIGFuZCBoYWQgYSBnbyB3aXRoIGhpcyBwcm9ibGVtLCB3aGljaCBsZWFkIG1lIHRvCiAgaW1wbGVtZW50IHRoaXMgZml4LiBJZiBsaWJjdXJsIGRldGVjdHMgdGhlIGFkZGVkIGN1c3RvbSBoZWFkZXIKICAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiLCBpdCB3aWxsIG5vdyBlbmFibGUgYSBjaHVua2VkIHRyYW5zZmVyLgoKICBBbHNvLCBjaHVua2VkIHRyYW5zZmVyIGRpZG4ndCBxdWl0ZSB3b3JrIGJlZm9yZSBidXQgc2VlbXMgdG8gZG8gc28gbm93LgoKLSBLamV0aWwgSmFjb2JzZW4gcG9pbnRlZCBvdXQgdGhhdCAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtaXB2NiAtLXdpdGhvdXQtemxpYgogIGRpZG4ndCB3b3JrIG9uIGFueSBwbGF0Zm9ybS4uLgoKRGFuaWVsICgyNiBOb3YgMjAwMikKLSBGaXhlZCBhIGJhZCBhZGRyaW5mbyBmcmVlIGluIHRoZSBob3N0aXAuYyBjb2RlLCBoYXJkbHkgZXhwb3NlZCBhbnl3aGVyZQoKLSBEYW4gQmVja2VyIGZvdW5kIGFuZCBmaXhlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIG9uIHBlcnNpc3RlbnQgY29ubm5lY3Rpb25zCiAgdXNpbmcgQ1VSTE9QVF9VU0VSUFdELgoKRGFuaWVsICgyMiBOb3YgMjAwMikKLSBCYXNlZCBvbiBSYWxwaCBNaXRjaGVsbCdzIGV4Y2VsbGVudCBhbmFseXNpcyBJIGZvdW5kIGEgYnVnIGluIHRoZSB0ZXN0IHN1aXRlCiAgd2ViIHNlcnZlciAoc3dzKSB3aGljaCBub3cgbGV0cyB0ZXN0IGNhc2UgMzA2IHJ1biBmaW5lIGV2ZW4gaW4gY29tYmluYXRpb24KICB3aXRoIHRoZSBvdGhlciB0ZXN0IGNhc2VzLgoKLSBKdWFuIElnbmFjaW8gSGVyduFzIGZvdW5kIGEgY3Jhc2ggaW4gdGhlIHZlcmJvc2UgY29ubmVjdCBtZXNzYWdlIHRoYXQgaXMKICB1c2VkIG9uIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoaXMgYnVnIHdhcyBhZGRlZCBpbiA3LjEwLjIgZHVlIHRvIHRoZQogIHJlYXJyYW5nZWQgbmFtZSByZXNvbHZlIGNvZGUuCgpEYW5pZWwgKDIwIE5vdiAyMDAyKQotIEtqZXRpbCBKYWNvYnNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlczoKCiAgIENVUkxPUFRfUFJJVkFURSBzdG9yZXMgYSBwcml2YXRlIHBvaW50ZXIgaW4gdGhlIGN1cmwgaGFuZGxlLgoKICAgQ1VSTElORk9fUFJJVkFURSByZXRyaWV2ZXMgdGhlIHByaXZhdGUgcG9pbnRlciBmcm9tIHRoZSBjdXJsIGhhbmRsZS4KCi0gS2Fyb2wgUGlldHJ6YWsgcG9pbnRlZCBvdXQgaG93IGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpZG4ndCBvdXRwdXQgYSBnb29kCiAgaW5jbHVkZSBkaXIgc28gSSd2ZSByZW1vdmVkIHRoYXQgZm9yIG5vdy4KClZlcnNpb24gNy4xMC4yICgxOCBOb3YgMjAwMikKCkRhbmllbCAoMTEgTm92IDIwMDIpCi0gRGF2ZSBIYWxiYWtrZW4gYWRkZWQgY3VybF92ZXJzaW9uX2luZm8gdG8gbGliL2xpYmN1cmwuZGVmIHRvIG1ha2UgbGliY3VybAogIHByb3Blcmx5IGJ1aWxkIHdpdGggTVNWQyBvbiBXaW5kb3dzLgoKRGFuaWVsICg4IE5vdiAyMDAyKQotIERvaW5nIEhUVFAgUFVUIHdpdGhvdXQgYSBzcGVjaWZpZWQgZmlsZSBzaXplIG5vdyBtYWtlcyBsaWJjdXJsIHVzZQogIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkLgoKRGFuaWVsICg3IE5vdiAyMDAyKQotIEJ1ZyByZXBvcnQgIzYzNDYyNSBpZGVudGlmaWVkIGhvdyBjdXJsIHJldHVybmVkIHRpbWVvdXQgaW1tZWRpYXRlbHkgd2hlbgogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgd2FzIHVzZWQgYW5kIHByb3ZpZGVkIGEgZml4LgoKVmVyc2lvbiA3LjEwLjItcHJlNCAoNiBOb3YgMjAwMikKCkRhbmllbCAoNSBOb3YgMjAwMikKLSBMZWhlbCBCZXJuYWR0IGZvdW5kIG91dCBhbmQgZml4ZWQuIGxpYmN1cmwgc2VudCBlcnJvciBtZXNzYWdlIHRvIHRoZSBkZWJ1ZwogIG91dHB1dCB3aGVuIGl0IHN0b3JlZCB0aGUgZXJyb3IgbWVzc2FnZS4KCi0gQXZlcnkgRmF5IGZvdW5kIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgRE5TIGNhY2hlICh3aGVuIHRoZSBjYWNoZSB0aW1lIHdhcwogIHNldCB0byAwIHdlIGdvdCBhIG1lbW9yeSBsZWFrLCBidXQgd2hlbiB0aGUgbGVhayB3YXMgZml4ZWQgaGUgZ290IGEgY3Jhc2gKICB3aGVuIGhlIHVzZWQgdGhlIENVUkxPUFRfSU5URVJGQUNFIHdpdGggdGhhdCkgdGhhdCBoYWQgbWUgZG8gc29tZSByZWFsCiAgcmVzdHJ1Y3R1cmluZyBzbyB0aGF0IHdlIG5vdyBoYXZlIGEgcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIGRucyBjYWNoZQogIGVudHJpZXMgdG8gcHJldmVudCBhbiBlbnRyeSB0byBnZXQgZmx1c2hlZCB3aGlsZSBzdGlsbCBhY3R1YWxseSBpbiB1c2UuCgogIEkgYWxzbyBkZXRlY3RlZCB0aGF0IHdlIHByZXZpb3VzbHkgZGlkbid0IHVwZGF0ZSB0aGUgdGltZSBzdGFtcCB3aGVuIHdlCiAgZXh0cmFjdGVkIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlIHNvIHRoYXQgbXVzdCd2ZSBiZWVuIGEgcmVhc29uIGZvciBzb21lCiAgdmVyeSB3ZWlyZCBkbnMgY2FjaGUgYnVncy4KClZlcnNpb24gNy4xMC4yLXByZTMKCkRhbmllbCAoMzEgT2N0IDIwMDIpCi0gRG93bmdyYWRlZCBhdXRvbWFrZSB0byAxLjYuMyBpbiBhbiBhdHRlbXB0IHRvIGZpeCBjeWd3aW4gcHJvYmxlbXMuIChJdAogIHR1cm5lZCBvdXQgdGhpcyBkaWRuJ3QgaGVscCB0aG91Z2guKQoKLSBEaXNhYmxlIHRoZSBETlMgY2FjaGUgKGJ5IHNldHRpbmcgdGhlIHRpbWVvdXQgdG8gMCkgbWFkZSBsaWJjdXJsIGxlYWsKICBtZW1vcnkuIEF2ZXJ5IEZheSBicm91Z2h0IHRoZSBleGFtcGxlIGNvZGUgdGhhdCBwcm92ZWQgdGhpcy4KClZlcnNpb24gNy4xMC4yLXByZTIKCkRhbmllbCAoMjggT2N0IDIwMDIpCi0gVXBncmFkZWQgdG8gYXV0b2NvbmYgMi41NCBhbmQgYXV0b21ha2UgMS43IG9uIHRoZSByZWxlYXNlLWJ1aWxkIGhvc3QuCgotIEtldmluIFJvdGggbWFkZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wgY2hlY2sgZm9yIGEgQ1VSTF9DQV9CVU5ETEUgZW52aXJvbm1lbnQKICB2YXJpYWJsZSAoaWYgLS1jYWNlcnQgaXNuJ3QgdXNlZCkgYW5kIGlmIG5vdCBzZXQsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbAogIGNoZWNrIGZvciBhIGZpbGUgbmFtZWQgImN1cmwtY2EtYnVuZGxlLmNydCIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIHRoZQogIGRpcmVjdG9yeSB3aGVyZSBjdXJsIGlzIGxvY2F0ZWQuIFRoYXQgZmlsZSBpcyB0aGVuIHVzZWQgYXMgQ0Egcm9vdCBjZXJ0CiAgYnVuZGxlLgoKLSBBdmVyeSBGYXkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsJ3MgY29uZmlndXJlIHNjcmlwIGRpZG4ndCBnZXQgcmlnaHQgaWYgeW91CiAgdXNlZCBhdXRvY29uZiBuZXdlciB0aGFuIDIuNTIuIFRoaXMgd2FzIGR1ZSB0byBzb21lIGJhZGx5IHF1b3RlZCBjb2RlLgoKVmVyc2lvbiA3LjEwLjItcHJlMQoKRGFuaWVsICgyMyBPY3QgMjAwMikKLSBFbWlsaWFubyBJZGEgY29uZmlybWVkIHRoYXQgd2Ugbm93IGJ1aWxkIHByb3Blcmx5IHdpdGggdGhlIEJvcmxhbmQgQysrCiAgY29tcGlsZXIgdG9vLiBXZSBuZWVkZWQgeWV0IGFub3RoZXIgZml4IGZvciB0aGUgSVNPIGNwcCBjaGVjayBpbiB0aGUgY3VybC5oCiAgaGVhZGVyIGZpbGUuCgotIFlldCBhbm90aGVyIGZpeCB3YXMgbmVlZGVkIHRvIGdldCB0aGUgSFRUUCBkb3dubG9hZCB3aXRob3V0IGhlYWRlcnMgdG8gd29yay4KICBUaGlzIHRpbWUgaXQgd2FzIG5lZWRlZCBpZiB0aGUgZmlyc3QgImJlbGlldmVkIGhlYWRlciIgd2FzIHJlYWQgYWxsIGluIHRoZQogIGZpcnN0IHJlYWQuIFRlc3QgMzA2IGhhcyBub3QgcnVuIHByb3Blcmx5IHNpbmNlIHRoZSAxMXRoIG9jdG9iZXIgZml4LgoKRGFuaWVsICgyMSBPY3QgMjAwMikKLSBadmkgSGFyJ0VsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGN1cmwncyBuYW1lIHJlc29sdmluZyBvbiBSZWRoYXQgOAogIG1hY2hpbmVzIChydW5uaW5nIElQdjYgZGlzYWJsZWQpLiBNYXRzIExpZGVsbCBsZXQgbWUgdXNlIGFuIGFjY291bnQgb24gaGlzCiAgbWFjaGluZSBhbmQgSSBjb3VsZCB2ZXJpZnkgdGhhdCBnZXRob3N0YnluYW1lX3IoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJldHVybgogIEVBR0FJTiBpbnN0ZWFkIG9mIEVSQU5HRSB3aGVuIHRoZSBnaXZlbiBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwuIFRoaXMgaXMKICBnbGliYyAyLjIuOTMuCgotIEFsYmVydCBDaGluIGhlbHBlZCBtZSBnZXQgdGhlIC1uby11bmRlZmluZWQgb3B0aW9uIGNvcnJlY3RlZCBpbgogIGxpYi9NYWtlZmlsZS5hbSBzaW5jZSBDeWd3aW4gYnVpbGRzIHdhbnQgaXQgdGhlcmUgd2hpbGUgU29sYXJpcyBidWlsZHMgZG9uJ3QKICB3YW50IGl0IHByZXNlbnQuIEtldmluIFJvdGggaGVscGVkIG1lIHRyeSBpdCBvdXQgb24gY3lnd2luLgogIAotIE5pa2l0YSBTY2htaWR0IHByb3ZpZGVkIGEgYnVnIGZpeCBmb3IgYSBGT0xMT1dMT0NBVElPTiBidWcgaW50cm9kdWNlZCB3aGVuCiAgdGhlIC4uLyBzdXBwb3J0IGdvdCBpbiAoNy4xMC4xKS4KCkRhbmllbCAoMTggT2N0IDIwMDIpCi0gRmFicml6aW8gQW1tb2xsbyBwb2ludGVkIG91dCBhIHJlbWFpbmluZyBwcm9ibGVtIHdpdGggRk9MTE9XTE9DQVRJT04gaW4KICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKRGFuaWVsICgxNyBPY3QgMjAwMikKLSBSaWNoYXJkIENvb3BlcidzIGV4cGVyaW1lbnRpbmcgcHJvdmVkIHRoYXQgLWogKENVUkxPUFRfQ09PS0lFU0VTU0lPTikgZGlkbid0CiAgd29yayBxdWl0ZSBhcyBzdXBwb3NlZC4gWW91IG5lZWRlZCB0byBzZXQgaXQgKmJlZm9yZSogeW91IHVzZQogIENVUkxPUFRfQ09PS0lFRklMRSwgYW5kIHdlIGRvbnQnIHdhbnQgdGhhdCBraW5kIG9mIGRlcGVuZGVuY2llcy4KCkRhbmllbCAoMTUgT2N0IDIwMDIpCi0gQW5kculzIEdhcmPtYSBwcm92aWRlZCBjb3JyZWN0aW9ucyBmb3IgZXJyYXRhcyBpbiBmb3VyIGxpYmN1cmwgbWFuIHBhZ2VzLgoKRGFuaWVsICgxMyBPY3QgMjAwMikKLSBTdGFydGluZyBub3csIHdlIGdlbmVyYXRlIGFuZCBpbmNsdWRlIFBERiB2ZXJzaW9ucyBvZiBhbGwgdGhlIGRvY3MgaW4gdGhlCiAgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMTIgT2N0IDIwMDIpCi0gVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IG9uIGEgYmFkIHBvcnQgbnVtYmVyIGNhdXNlZCB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgdG8gbmV2ZXIgcmV0dXJuIGZhaWx1cmUgYW5kIGl0IGFwcGVhcmVkIHRvIGtlZXAgb24gdHJ5aW5nIGZvcmV2ZXIgKGl0IGp1c3QKICBkaWRuJ3QgZG8gYW55dGhpbmcpLgoKRGFuaWVsICgxMSBPY3QgMjAwMikKLSBEb3dubG9hZGluZyBIVFRQIHdpdGhvdXQgaGVhZGVycyBkaWRuJ3Qgd29yayAxMDAlLCBzb21lIG9mIHRoZSBpbml0aWFsIGRhdGEKICBnb3Qgd3JpdHRlbiB0d2ljZS4gS2V2aW4gUm90aCByZXBvcnRlZC4KCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhlICJjb25maWcgZmlsZSIgcGFyc2VyIGluIHRoZSBjbGllbnQgY29kZSBjb3VsZAogIHNlZ2ZhdWx0LCBsaWtlIGlmIERPUyBuZXdsaW5lcyB3ZXJlIHVzZWQuCgpWZXJzaW9uIDcuMTAuMSAoMTEgT2N0IDIwMDIpCgpEYW5pZWwgKDEwIE9jdCAyMDAyKQotIEplZmYgTGF3c29uIGZpeGVkIGEgZmV3IHByb2JsZW1zIHdpdGggY29ubmVjdGlvbiByZS11c2UgdGhhdCByZW1haW5lZCB3aGVuCiAgeW91IHNldCBDVVJMT1BUX1BST1hZIHRvICIiLgoKRGFuaWVsICg5IE9jdCAyMDAyKQotIENyYWlnIERhdmlzb24gZm91bmQgYSB0ZXJyaWJsZSBmbGF3IGFuZCBDcmlzIEJhaWxpZmYgaGVscGVkIG91dCBpbiB0aGUKICBzZWFyY2guIEdldHRpbmcgSFRUUCBkYXRhIGZyb20gc2VydmVycyB3aGVuIHRoZSBoZWFkZXJzIGFyZSBzcGxpdCB1cCBpbgogIG11bHRpcGxlIHJlYWRzLCBjb3VsZCBjYXVzZSBqdW5rIGRhdGEgdG8gZ2V0IGluc2VydGVkIGFtb25nIHRoZSBzYXZlZAogIGhlYWRlcnMuIFRoaXMgb25seSBjb25jZXJucyBIVFRQKFMpIGhlYWRlcnMuCgpEYW5pZWwgKDggT2N0IDIwMDIpCi0gVmluY2VudCBQZW5xdWVyYydoIGdhdmUgdXMgdGhlIGdvb2Qgc3VnZ2VzdGlvbiB0aGF0IHdoZW4gdGhlIEVSUlJPUkJVRkZFUgogIGlzIHNldCBpbnRlcm5hbGx5LCB0aGUgZXJyb3IgdGV4dCBpcyBzZW50IHRvIHRoZSBkZWJ1ZyBmdW5jdGlvbiBhcyB3ZWxsLgoKLSBJIGZpeGVkIHRoZSB0ZWxuZXQgY29kZSB0byB0aW1lb3V0IHByb3Blcmx5IGFzIHRoZSBvcHRpb24gdGVsbHMgaXQgdG8uIE9uCiAgbm9uLXdpbmRvd3MgcGxhdGZvcm1zLgoKRGFuaWVsICg3IE9jdCAyMDAyKQotIEpvaG4gQ3JvdyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwtdGhlLWd1aWRlIHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQogIHRhcmJhbGwhCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdGhhdCBtYWtlIGluc3RhbGwgZGlkbid0IGRvIHJpZ2h0IGlmIGJ1aWxkIG91dHNpZGUKICB0aGUgc291cmNlIHRyZWUgKGNhLWJ1bmRsZSB3aXNlKS4KCi0gRk9MTE9XTE9DQVRJT04gYnVnZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCgpEYW5pZWwgKDQgT2N0IDIwMDIpCi0gS2V2aW4gUm90aCBnb3QgcHJvYmxlbXMgd2l0aCBoaXMgY3lnd2luIGJ1aWxkIHdpdGggLW5vLXVuZGVmaW5lZCB3YXMgbm90CiAgcHJlc2VudCBpbiBsaWIvTWFrZWZpbGUuYW0gc28gSSBwdXQgaXQgYmFjayBpbiB0aGVyZSBhZ2Fpbi4gVGhlIHBvb3Igb25lIHdobwogIG5lZWRzIHRvIHJlbW92ZSBpdCBhZ2FpbiBtdXN0IHdyaXRlIGEgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3QgdGhhdCBuZWVkLgoKLSBSYWxwaCBNaXRjaGVsbCBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIGEgYml0IG5haXZlIGFuZCBkaWRuJ3QgZGVhbCB3aXRoIC4vCiAgb3IgLi4vIHN0dWZmIGluIHRoZSBzdHJpbmcgcGFzc2VkIGJhY2sgaW4gYSBMb2NhdGlvbjogaGVhZGVyIHdoZW4gZm9sbG93aW5nCiAgbG9jYXRpb25zLgoKLSBBbGJlcnQgQ2hpbiBoZWxwZWQgbWUgdG8gd29yayBvdXQgYSBiZXR0ZXIgY29uZmlndXJlLmluIGNoZWNrIGZvciB6bGliLCBhbmQKICBib3RoIC0td2l0aG91dC16bGliIGFuZCAtd2l0aC16bGliIHNlZW0gdG8gd29yayByYXRoZXIgd2VsbCByaWdodCBub3cuCgotIFp2aSBIYXInRWwgaW1wcm92aWVkIHRoZSBPcGVuU1NMIEVOR0lORSBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0bwogIGJlY29tZSBtb3JlIGFjY3VyYXRlLgoKRGFuaWVsICgxIE9jdCAyMDAyKQotIERldGxlZiBTY2htaWVyIHBvaW50ZWQgb3V0IHRoZSBsYWNrIG9mIGEgLS13aXRob3V0LWxpYnogb3B0aW9uIHRvIGNvbmZpZ3VyZSwKICBzbyBJIGFkZGVkIG9uZS4KClZlcnNpb24gNy4xMCAoMSBPY3QgMjAwMikKCkRhbmllbCAoMzAgU2VwIDIwMDIpCi0gTW9kaWZpZWQgdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkgcHJvdG8gYW5kIHJldHVybmVkIHN0cnVjdCBvbmNlIGFnYWluLCBhbmQKICB1cGRhdGVkIHRoZSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IHRoZSBwcmUtcmVsZWFzZXMgY3Jhc2hlZCBvbiBuYW1lIGxvb2t1cHMgb24KICBuYW1lcyBzdWNoIGFzICJhOiIgb3IgImJhejoiIChvbiBMaW51eCB2ZXJzaW9ucyBub3QgYmVpbmcgaXB2Ni1lbmFibGVkKSBkdWUKICB0byBzb21lIHdlaXJkIHJldHVybiBjb2RlcyBmcm9tIGdldGhvc3RieW5hbWVfcigpLiBJJ2xsIGJsYW1lIHRoZSBjb21wbGV0ZQogIGxhY2sgb2YgZG9jcyBpbiB0aGF0IGRlcGFydG1lbnQuIENyaXMgcHJvdmlkZWQgYSBmaXgsIHdoaWNoIEkgbW9kaWZpZWQgb25seQogIHNsaWdodGx5LgoKRGFuaWVsICgyNyBTZXAgMjAwMikKLSBBZnRlciBhIHN1Z2dlc3Rpb24gZnJvbSBDaHJpc3RpYW4gS3VyeiB0byBEZWJpYW4gY3VybCBwYWNrYWdlIG1haW50YWluZXIKICBEb21lbmljbyBBbmRyZW9saSwgSSBtYWRlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBwcm94eSBlbnZpcm9ubWVudAogIHZhcmlhYmxlcyBiZXR0ZXIuIE5vdywgYnkgc2V0dGluZyAteCAiIiB5b3UgY2FuIGV4cGxpY2l0bHkgdGVsbCBsaWJjdXJsIHRvCiAgbm90IHVzZSBhIHByb3h5LCBubyBtYXR0ZXIgd2hhbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNheS4KClZlcnNpb24gNy4xMC1wcmU0CgpEYW5pZWwgKDI2IFNlcCAyMDAyKQotIEV4dGVuZGVkIGN1cmxfdmVyc2lvbl9pbmZvKCkgbW9yZSBhbmQgd3JvdGUgYSBtYW4gcGFnZSBmb3IgaXQuCgpEYW5pZWwgKDI1IFNlcCAyMDAyKQotIGxpYmN1cmwgY291bGQgbGVhayBtZW1vcnkgd2hlbiBkb3dubG9hZGluZyBtdWx0aXBsZSBmaWxlcyB1c2luZyBodHRwIHJhbmdlcywKICByZXBvcnRlZCBhbmQgZml4ZWQgYnkgSmVhbi1MdWMgR3VldmVsLgoKLSBXYWx0ZXIgSi4gTWFjayBwcm92aWRlZCBjb2RlIGFuZCBkb2NzIGZvciB0aGUgbmV3IGN1cmxfZnJlZSgpIGZ1bmN0aW9uIHRoYXQKICBzaGFsbCBiZSB1c2VkIHRvIGZyZWUgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGJ5IGxpYmN1cmwgYW5kIHJldHVybmVkIGJhY2sKICB0byB0aGUgYXBwbGljYXRpb24sIGFzIGN1cmxfZXNjYXBlKCkgYW5kIGN1cmxfdW5lc2NhcGUoKSBkby4KCi0gWWFycmFtIFN1bmlsIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZXJlIGEgZmFpbGVkCiAgY29ubmVjdGlvbiBkaWRuJ3QgY2xvc2UgZG93biBwcm9wZXJseSBhbmQgdGh1cyBhIHNlY29uZCB0cmFuc2ZlciB1c2luZyB0aGUKICBzYW1lIGhhbmRsZSBmYWlsZWQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBmbGF3IHRoYXQgbWFkZSAoYW1vbmcgb3RoZXIgdGhpbmdzKSBkaWN0LWZldGNoZXMKICByZXR1cm4gYSByYW5kb20gdmFsdWUuCgpEYW5pZWwgKDI0IFNlcCAyMDAyKQotIFdleiBGdXJsb25nIGJyb3VnaHQgaGlzIGluaXRpYWwgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIGN1cmxfdmVyc2lvbl9pbmZvKCkuCiAgV2UgbWlnaHQgbmVlZCB0byB0d2VhayBpdCBzb21ld2hhdCBiZWZvcmUgcmVsZWFzZS4KCkRhbmllbCAoMjAgU2VwIDIwMDIpCi0gQ3JhaWcgTWFya3dhcmR0IGZpeGVkIGFub3RoZXIgVHJ1NjQgSVAgcmVzb2x2ZSBwcm9ibGVtLgoKRGFuaWVsICgxOSBTZXAgMjAwMikKLSBEb2xibmVmZiBBLlYgYW5kIFNwaXJpZG9ub2ZmIEEuViBtYWRlIHRoZSBmaWxlOi8vIGNvZGUgd29yayB3aXRoIHJlc3VtZXMKICBpbiB0aGUgc2FtZSBzdHlsZSBvdGhlciBjb2RlIGRvZXMuCgotIElsZ3VpeiBMYXR5cG92IGZpeGVkIGEgZmxhdyBpbiB0aGUgY2xpZW50IGNvZGUgd2hlbiBmZXRjaGluZyBtdWx0aXBsZSBVUkxzCiAgYW5kIC1DIC0gd2FzIHVzZWQuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIHBvc2l0aW9uIHdhcyB0aGVuIGFjY2lkZW50YWxseQogIHJldXNlZCBvbiBhbGwgdGhlIG90aGVyIGZpbGVzIHRvby4KCkRhbmllbCAoMTggU2VwIDIwMDIpCi0gVGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZSB3YXMgZ3JlYXRseSBtb2RpZmllZCBhbmQgdGhlIG9wdGlvbnMgaGF2ZQogIG5vdyBiZWVuIGdyb3VwZWQgaW4gbG9naWNhbCBncm91cHMgc28gdGhhdCBpdCBzaG91bGQgYmUgc29tZXdoYXQgZWFzaWVyIHRvCiAgcmVhZCBpdCBhbmQgZmluZCB0aGluZ3MgeW91IHNlYXJjaCBmb3IuCgpEYW5pZWwgKDEzIFNlcCAyMDAyKQotIEtldmluIFJvdGggcGlucG9pbnRlZCBhIHNjYXJ5IGZsYXcgaW4gbGliY3VybCwgd2hlbiB0aGUgSFRUUCBzZXJ2ZXIgZG9lc24ndAogIHNlbmQgYW55IGhlYWRlcnMgYmFjaywgb25seSByYXcgY29udGVudC4gUmlnaHQsIHRoYXQgaXMgYSB2aW9sYXRpb24gb2YgdGhlCiAgc3RhbmRhcmQgYnV0IHN0aWxsIGhhcHBlbnMgYXQgdGltZXMgYW5kIHdlIG5lZWQgdG8gZGVhbCB3aXRoIGl0LiBUZXN0IGNhc2UKICAzMDYgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIGRvIHJpZ2h0IG5vdy4KClZlcnNpb24gNy4xMC1wcmUzCgpEYW5pZWwgKDExIFNlcCAyMDAyKQotIEx1a2FzeiBDemVraWVyZGEgZm91bmQgb3V0IHRoYXQgY3VybCBkaWRuJ3Qgc2VuZCBhIGNvcnJlY3QgSFRUUCBIb3N0OiBoZWFkZXIKICB3aGVuIHlvdSBzcGVjaWZpZWQgdGhlIFVSTCB3aXRoIGFuIElQdjYgSVAtYWRkcmVzcy4KCkRhbmllbCAoNCBTZXAgMjAwMikKLSBTdmVuIE5ldWhhdXMgbWFkZSAtLXNpbGVudCBiZWluZyBhY2tub3dsZWRnZWQgZXZlbiB3aGVuIG11bHRpcGxlIFVSTHMKICB3ZXJlIHVzZWQuIEl0IHVzZWQgdG8gb3V0cHV0ICJbMS8yXTogaHR0cDovL2hvc3QvYS5odG1sLmRlIC0tPiBhLmh0bWwuZCIgZXRjCiAgZXZlbiB3aGVuIHRvbGQgdG8gc2h1dCB1cC4KCkRhbmllbCAoMyBTZXAgMjAwMikKLSBVcGRhdGVkIGFsbCBzb3VyY2UgY29kZSBoZWFkZXJzIHRvIHVzZSBNSVQtbGljZW5zZSByZWZlcmVuY2VzIG9ubHksIGFuZAogIHBvaW50IHRvIHRoZSBDT1BZSU5HIGZpbGUgYW5kIHRoZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwKICBVUkwuIEkndmUgY3V0IG91dCBhbGwgcmVmZXJlbmNlcyB0byBNUEwgdGhhdCBJIGNvdWxkIGZpbmQuCgotIENvcmVjdGVkIHRoZSBtYWtlZmlsZXMgdG8gbm90IGFsd2F5cyB1c2UgLWx6IHdoZW4gbGlua2luZwoKVmVyc2lvbiA3LjEwLXByZTIKCkRhbmllbCAoMiBTZXAgMjAwMikKLSBKYW1lcyBHYWxsYWdoZXIgYWRkZWQgQ29udGVudC1FbmNvZGluZyBzdXBwb3J0IHRvIGxpYmN1cmwgc28gbm93IGN1cmwgYW5kCiAgbGliY3VybC11c2luZyBhcHBzIGNhbiByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMgdXNpbmcgdGhlICdkZWZsYXRlJwogIG1ldGhvZC4gU2VlIHRoZSBzcGVjaWFsIGZpbGUgbGliL1JFQURNRS5lbmNvZGluZyBmb3IgZGV0YWlscy4KCiAgY3VybCAtLWNvbXByZXNzZWQgaXMgbm93IHVzZWQgdG8gcmVxdWVzdCBjb21wcmVzc2VkIGNvbnRlbnRzLgoKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgd2lsbCBpbmNsdWRlICdsaWJ6JyBpZiB0aGlzIGZlYXR1cmUgd2FzIGFyb3VuZCB3aGVuCiAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0LgoKRGFuaWVsICgzMCBBdWcgMjAwMikKLSBBcHBsaWVkIGFuIGFub255bW91cyBTT0NLUzUtcHJveHkgcGF0Y2guIE5vdCBwcm9wZXJseSB3b3JraW5nIGluIGFsbAogIHNpdHVhdGlvbnMgdGhvdWdoLCBhcyBhbGwgZ2V0YWRkcmluZm8oKS11c2luZyBsaWJjdXJscyB3aWxsIGZhaWwgb24gdGhpcy4KICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNvbWV3aGF0IG5haXZlIHdheSB0aGUgY3VycmVudCBjb2RlIHRyaWVzIHRvIGV4dHJhY3QKICB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcHJveHkuCgotIEZpeGVkIHVwIHRoZSBTU0wgY2VydCBmaXhlcyBmcm9tIHRoZSBvdGhlciBkYXkgZXZlbiBtb3JlIGFmdGVyIG1vcmUgaW5wdXRzCiAgZnJvbSBDcmlzLiBBZGRlZCB0aHJlZSBuZXcgU1NMIGVycm9yIGNvZGVzIHRvIG1ha2UgdGhlCiAgQ1VSTEVfU1NMX0NPTk5FQ1RfRVJST1Igc2xpZ2h0bHkgbGVzcyBvdmVybG9hZGVkLgoKRGFuaWVsICgyNyBBdWcgMjAwMikKLSBBZnRlciBsb3RzIG9mIHRhbGsgd2l0aCBUb20gWmVydWNoYSwgTmljayBHaW1icm9uZSBhbmQgQ3JpcyBCYWlsaWZmIEkKICBkZWNpZGVkIHRvIHRhbGsgdGhlIGJvbGQgcGF0aCBhbmQgSSBub3cgbWFkZSBsaWJjdXJsIGRvIENBIGNlcnRpZmljYXRlCiAgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFRodXMgbGlicmFyeSB1c2VycyBuZWVkIHRvIGV4cGxpY2l0bHkgdHVybiB0aGlzIG9mZgogIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gc2l0ZXMgd2l0aG91dCBwcm9wZXIgY2hlY2tpbmcuIFdlIGFsc28gaW5zdGFsbCBhCiAgQ0EgY2VydCBidW5kbGUgb24gJ21ha2UgaW5zdGFsbCcgbm93LgoKICBUaGUgY3VybCB0b29sIG5vdyByZXF1aXJlcyB0aGUgLWsvLS1pbnNlY3VyZSBvcHRpb24gaW4gb3JkZXIgdG8gYWxsb3cKICBjb25uZWN0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiBTU0wgc2l0ZXMgdGhhdCBhcmVuJ3QgcHJvcGVybHkgdmVyaWZpZWQgd2l0aAogIC1jYWZpbGUgb3IgLS1jYXBhdGguCgogIGN1cmwtY29uZmlnIC0tY2EgZGlzcGxheXMgdGhlIGJ1aWx0LWluIHBhdGggdG8gdGhlIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsICgyNiBBdWcgMjAwMikKLSBBbmRyZXcgRnJhbmNpcyBjbGVhbmVkIHVwIHNvbWUgY29kZSB0aGF0IG5vdyBjb21waWxlcyBmaW5lIHdpdGhvdXQgdGhlIG5lZWQKICBmb3IgdWdseSBNU1ZDIHByYWdtYXMuCgotIEtlaXRoIE1hY0RvbmFsZCBmb3VuZCBhIG1pbm9yIGJ1ZyBpbiBzcmMvbWFpbi5jIHRoYXQgbWFkZSBpdCBjbG9zZSBzdGRpbgogIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBmaWxlIGhhbmRsZS4gSXQgc2hvdWxkbid0IGhhdmUgcmVzdWx0ZWQgaW4gbXVjaAogIHRyb3VibGUgYXMgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBjbG9zZSBhbGwgZmlsZSBoYW5kbGVzIG9uIHByb2Nlc3MgZXhpdAogIGFueXdheS4KCkRhbmllbCAoMjIgQXVnIDIwMDIpCi0gTWFya3VzIE9iZXJodW1lciBwcm92aWRlZCBzb21lIGRvY3VtZW50YXRpb24gZm9yIGhpcyBwcmV2aW91c2x5IHByb3ZpZGVkCiAgQ1VSTE9QVF9OT1NJR05BTCBmaXguCgotIFBhdGNoZWQgdGhlIGxpYi9NYWtlZmlsZS5hbSB0byBob3BlZnVsbHkgbm8gbG9uZ2VyIGNvbXBsYWluIG9uIHVuZGVmaW5lZAogIHN5bWJvbHMgdGhhdCBzZWVtZWQgdG8gb2NjdXIgb24gYnVpbGRzIHdpdGggc2hhcmVkIE9wZW5TU0wgbGlicmFyaWVzIG9uCiAgU29sYXJpcyBsYXRlbHkuLi4KCkRhbmllbCAoMjAgQXVnIDIwMDIpCi0gRml4ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gTVNDVisrIGNvbXBpbGVzLiBXZSdyZSBsb29raW5nIGZvciBoZWxwIGhlcmU6CiAgcmVtb3ZlIHRoZSBwcmFnbWFzIGZyb20gbGliL2NvbmZpZy13aW4zMi5oIGFuZCBhZGp1c3QgdGhlIHNvdXJjZXMgd2hlcmUKICB0aGUgd2FybmluZ3Mgb2NjdXIuIEhpZGluZyB0aGVtIHdpdGggcHJhZ21hcyBsaWtlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0CiAgd2F5IG9mIGRlYWxpbmcgd2l0aCBjb21waWxlciB3YXJuaW5ncy4KCkRhbmllbCAoMTMgQXVnIDIwMDIpCi0gVWxyaWNoIFphZG93IG1hZGUgdGhlIGdsb2JhbCBpbmNsdWRlIGZpbGVzIGluIGN1cmwvKiBpbmNsdWRlIHRoZW1zZWx2ZXMKICB1c2luZyAiY3VybC5oIiBpbnN0ZWFkIG9mIDxjdXJsL2N1cmwuaD4gd2hpY2ggdGh1cyBhbGxvd3MgcGVvcGxlIHRvIG1vcmUKICBmcmVlbHkgZGVjaWRlIGhvdyB0byBpbmNsdWRlIGN1cmwgYW5kIGhvdyB0byBzZXR1cCB0aGVpciBpbmNsdWRlIHBhdGhzLgoKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgdGhlIGN1cmxfc2hhcmUqIGludGVyZmFjZSwgc29tZXdoYXQgYXMgZGlzY3Vzc2VkCiAgcHJldmlvdXNseS4KCi0gSvZybiBIYXJ0cm90aCBwb2ludGVkIG91dCB0aGF0IHBvbGwoKSB3YXMgdXNlZCBpbiB0aGUgcHJlMSBzb3VyY2UgY29kZSBhbmQKICBpdCBpc24ndCB2ZXJ5IHBvcnRhYmxlLCBzbyBub3cgSSBjaGVjayBmb3IgaXQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kCiAgd29yayBhcm91bmQgaXQuCgpWZXJzaW9uIDcuOS45LXByZTEKCkRhbmllbCAoMTIgQXVnIDIwMDIpCi0gQXBwbGllZCBteSBpbml0aWFsIHRha2Ugb24gbWFraW5nIHRoZSBtdWx0aSBzdHVmZiBtb3JlIGFzeW5jaHJvbm91cy4gQ29ubmVjdHMKICBzaG91bGQgbm93IHJldHVybiBiYWNrIHdpdGhvdXQgImhhbmdpbmciIHVudGlsIGl0IGhhcyBjb25uZWN0ZWQgZm9yIHJlYWwuCiAgVGhpcyBzaG91bGQgYWxzbyBiZSB0aGUgY2FzZSBmb3IgRlRQLVBBU1YgY29ubmVjdHMuCgpEYW5pZWwgKDkgQXVnIDIwMDIpCi0gQXBwbGllZCBNYXJrdXMgRi5YLkouIE9iZXJodW1lcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBDVVJMT1BUX05PU0lHTkFMLAogIHdoaWNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIGxpYmN1cmwgZnJvbSBkb2luZyBhbnl0aGluZyB0aGF0IG1heSBjYXVzZQogIHNpZ25hbHMgdG8gZ2V0IHNlbnQuIFRoaXMgaXMgYmFzaWNseSBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRoYXQKICBub3cgY2FuIHVzZSB0aW1lb3V0cyBwcm9wZXJseSwgd2l0aG91dCByaXNraW5nIGFueSBzaWduYWxzIHRvIGJ1cnN0IGluIGFuZAogIHJ1aW4gdGhlIHBhcnR5LgogIApEYW5pZWwgKDUgQXVnIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSByZXBvcnRlZCB0aGF0IFJGQzI3MzItc3R5bGUgbGl0ZXJhbCBJUHY2IGFkZHJlc3NlcyBkaWRuJ3QKICB3b3JrLiBXaGVuIGRpZCB0aGF0IGNvZGUgdmFuaXNoPyBBbnl3YXksIGl0J3MgYmFjayBhZ2FpbiBub3cgYW5kIHNlZW1zIHRvCiAgd29yayEKCi0gSm9uYXRhbiBMYW5kZXIgZm91bmQgb3V0IHRoYXQgUE9TVGluZyBhbiBlbXB0eSBzdHJpbmcgZGlkbid0IHdvcmsgd2l0aCB0aGUKICBjb21tYW5kIGxpbmUgdG9vbC4KCkRhbmllbCAoMyBBdWcgMjAwMikKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIHRoZSBsaWJjdXJsLmRlZiBmaWxlIHRvIGJ1aWxkIHRoZSB3aW5kb3dzIERMTCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBlbmFibGVkLgoKRGFuaWVsICgxIEF1ZyAyMDAyKQotIFRoZSBmdHAgUE9SVCBjb21tYW5kIG5vdyB1c2VzIGEgYmV0dGVyIGRlZmF1bHQgSVAgYWRkcmVzcywgYXMgaXQgd2lsbAogIGV4dHJhY3QgYW5kIHVzZSB0aGUgbG9jYWwgSVAgYWRkcmVzcyB1c2VkIGJ5IHRoZSBjb250cm9sIGNvbm5lY3Rpb24uCgotIE1vZGlmaWVkIHRoZSAjaW5jbHVkZSBsaW5lcyBpbiBjdXJsL211bHRpLmggdG8gd29yayBiZXR0ZXIgb24gbW9yZQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMzEgSnVsIDIwMDIpCi0gQXR0ZW1wdGVkIGEgZml4IGZvciBSYXkgRGVHZW5uYXJvJ3MgcmVwb3J0ZWQgSFAtVVggaG9zdCBuYW1lIHJlc29sdmUKICBwcm9ibGVtcy4KCkRhbmllbCAoMzAgSnVsIDIwMDIpCi0gUHJpeWEgUmFtYWtyaXNobmFuIGFuZCBSeWFuIEpvbmVzIGNvbXBpbGVzIGN1cmwvY3VybC5oIHdpdGggYSBDKysgY29tcGlsZXIKICBhbmQgZG9uJ3QgZ2V0IF9fU1REQ19fIGRlZmluZWQsIHdoaWNoIHJlcXVpcmVkIHVzIHRvIGV4dGVuZCB0aGUgcHJlcHJvY2Vzc29yCiAgY2hlY2sgZm9yIHRoZSAjIyBvcGVyYXRvciB1c2FnZS4KCi0gQ29ycmVjdCB0aGUgZGVzY3JpcHRpb24gZm9yIENVUkxPUFRfUEFTU1dERlVOQ1RJT04sIGlmIHNldCB0byBOVUxMIHRoZQogIGludGVybmFsIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSBwdXQgYmFjay4KCi0gZGFuZnV6eiBhdCBtaWxrLmNvbSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGJhZGx5IGFzc3VtZWQgYSBzcGFjZSBhZnRlcgogICdTZXQtQ29va2llOicgc28gaWYgaXQgd2Fzbid0IHByZXNlbnQsIGl0IGNhdXNlZCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZQogIGNvb2tpZSBuYW1lIHRvIGZhbGwgb2ZmIQoKRGFuaWVsICgyOSBKdWwgMjAwMikKLSBUaGUgcGFzc3dvcmQgcHJvbXB0IGFza2luZyBmb3IgdXNlciBwYXNzd29yZCB1c2VkIHN0ZG91dCBhbmQgbm93IHVzZXMKICBzdGRlcnIgaW5zdGVhZCB0byBiZXR0ZXIgYWxsb3cgcmVkaXJlY3RpbmcuIEl0IGFsc28gbGVha2VkIGEgZm9wZW4oKSBmaWxlCiAgaGFuZGxlIHRoYXQgaXMgbm93IGZpeGVkLgoKRGFuaWVsICgyOCBKdWwgMjAwMikKLSBIQVZFX1NFVFZCVUYgd2FzIGxlZnQgb3V0IGZyb20gc3JjL21haW4uYyB3aGljaCBtYWRlIC1OIG5vdCB3b3JrLiBGb3VuZCBvdXQKICBieSBNIFQuCgpEYW5pZWwgKDI2IEp1biAyMDAyKQotIEdsZW4gTmFrYW11cmEgc29sdmVkIGEgY3Jhc2ggaW4gdGhlIG5hbWUgcmVzb2x2aW5nIGZ1bmN0aW9uIGZvciBJUC1vbmx5CiAgYWRkcmVzc2VzIG9uIEFscGhhIExpbnV4IChhdCBsZWFzdCkuCgotIFQuIEJoYXJhdGggY29ycmVjdGVkIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50cm9kdWNlZCBpbiA3LjkuOC4KCkRhbmllbCAoMjIgSnVuIDIwMDIpCi0gQW5kculzIEdhcmPtYSBwb2ludGVkIG91dCBtYW4gcGFnZSBlcnJvcnMgaW4gY3VybF9mb3JtYWRkLjMuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IEp1biAyMDAyKQotIENocmlzIENvbWJlcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gY3VybF9lc2NhcGUoKS4gSSBmaXhlZC4gV2Ugbm8gbG9uZ2VyCiAgdHJpZXMgdG8gZ2VuZXJhdGUgbm9yIHBhcnNlICcrJyBpbiBVUkxzLiBTcGFjZXMgYmVjb21lICUyMCwgYW5kIG9ubHkgJS1jb2RlcwogIGFyZSB0cmFuc2xhdGVkIGJ5IGN1cmxfdW5lc2NhcGUoKS4KCkRhbmllbCAoMTUgSnVuIDIwMDIpCi0gQWRkZWQgLS1saW1pdC1yYXRlIHRvIHRoZSBjdXJsIHRvb2wuIEFsbG93cyB0aGUgdXNlciB0byBzZXQgYSBtYXhtaW11bQogIHVwcGVyIGxpbWl0IHRvIGhvdyBtdWNoIGJhbmR3aWR0aCB0byB1c2UgZm9yIHRyYW5zZmVycy4KCi0gQ1VSTE9QVF9CVUZGRVJTSVpFIHdhcyBhZGRlZCB0byBsaWJjdXJsLiBUaGlzIHNldHMgYSBwcmVmZXJlZCBzaXplIGZvciB0aGUKICByZWNlaXZlIGJ1ZmZlciBpbiBsaWJjdXJsLiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzIHdvdWxkIGJlIHRoYXQgdGhlIHdyaXRlCiAgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgbW9yZSBvZnRlbiBhbmQgd2l0aCBzbWFsbGVyIGNodW5rcy4KCkRhbmllbCAoMTQgSnVuIDIwMDIpCi0gWWFycmFtIFN1bmlsIGZvdW5kIG91dCB0aGF0IHRoZSBTb2NrZXRJc0RlYWQoKSBmdW5jdGlvbiBwZXJmb3JtZWQgYSBsb3QKICBmYXN0ZXIgb24gV2luZG93cyB3aGVuIHJlbW92aW5nIHRoZSAxIG1pY3Jvc2Vjb25kIHRpbWVvdXQuCgotIEhhbm5vIEwuIEtyYW56aG9mZiBmaXhlZCB0aGUgVkMrKyBwcm9qZWN0IGZpbGVzLgoKLSBUb20gTWF0dGlzb24gZm91bmQgb3V0IHRoYXQgZnRwIHRyYW5zZmVycyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYSBsaXR0bGUKICB0b28gb2Z0ZW4uCgotIE1pa2xvcyBOZW1ldGggcG9zdGVkIGEgVkMrKyBtYWtlZmlsZSBmaXggYW5kIHNvbWUgSU5TVEFMTCBjb21tZW50cyBvbiBob3cKICB0byBkaXNhYmxlIHNwZWNpZmljIHByb3RvY29scyB3aGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzLgoKVmVyc2lvbiA3LjkuOAoKRGFuaWVsICgxMyBKdW4gMjAwMikKLSBUaW1lIHRvIGxldCB0aGlzIGJhYnkgZ28uCgpEYW5pZWwgKDEyIEp1biAyMDAyKQotIENocmlzIENvbWJlcyBhZGRlZCB0aHJlZSBuZXcgb3B0aW9ucyBmb3IgY3VybF9mb3JtYWRkKCk6IENVUkxGT1JNX0JVRkZFUiwKICBDVVJMRk9STV9CVUZGRVJQVFIsIENVUkxGT1JNX0JVRkZFUkxFTkdUSC4gIFRoZXkgYXJlIHVzZWQgdG8gY3JlYXRlIGEKICBtdWx0aXBhcnQgdGhhdCBhcHBlYXJzIGFzIGEgcmVndWxhciBmaWxlIHVwbG9hZCwgYnV0IHRoZSBkYXRhIGlzIHByb3ZpZGVkCiAgd2l0aCBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KICAKLSBOaWNvIEJhZ2d1cyBtYWRlIHRoZSBWTVMgdmVyc2lvbiB1c2Ugc2lnc2V0am1wKCkgdG9vLgoKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIHRoZSBtaW5ndzMyIGJ1aWxkIHVzaW5nIHRoZSBtbSBsaWIuCgotIEFwcGxpZWQgcGF0Y2hlcyBieSBLcmlzIEtlbm5hd2F5IHRoYXQgY29ycmVjdCBmb3JtYXQgc3RyaW5nIHByb2JsZW1zIGluCiAgbGliL2Z0cC5jIGFuZCBsaWIvbGRhcC5jLgoKVmVyc2lvbiA3LjkuOC1wcmUzCgpEYW5pZWwgKDExIEp1biAyMDAyKQotIEphbWVzIENvbmUgYnJvdWdodCB0aGUgaWRlYSBvZiB1c2luZyBzaWdzZXRqbXAoKSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgdG8KICBtYWtlIHRoZSB0aW1lLW91dCBvZiBuYW1lIGxvb2t1cHMgdG8gd29yaywgZXZlbiB3aGVuIHRoZSB1bmRlcmx5aW5nIG5hbWUKICByZXNvbHZlciBsaWJyYXJ5IHRyYXBzIEVJTlRSLiBUaGUgdXNlIG9mIHNpZ3NldGptcCgpIGFuZCBzaWdsb25nam1wKCkgZm9yCiAgdGhpcyBtYXkgYmUgYSBiaXQgZHJhc3RpYywgYW5kIGFsc28gbm90IGxpa2VseSB0byBleGlzdCBvbiBhbGwgcGxhdGZvcm1zLiAgSQogIGFkZGVkIGNhcmVmdWwgY2hlY2tpbmcgZm9yIHRoaXMgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGV2ZW4gY2hlY2tzIGZvciBpdAogIGJlaW5nIGEgbWFjcm8gKHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjYXNlIGluIGZvciBleGFtcGxlIExpbnV4KS4KCiAgc2lnc2V0am1wKCkgc2VlbXMgdG8gYmUgbWVudGlvbmVkIGluIHRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uLgoKLSBNaWtsb3MgTmVtZXRoIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBsaWJjdXJsIHRvIGdldCBidWlsdCB3aXRoIHNwZWNpZmljCiAgcHJvdG9jb2xzIGRpc2FibGVkLiBUaGlzIGlzIGRvbmUgYnkgcnVubmluZyAuL2NvbmZpZ3VyZQogIC0tZGlzYWJsZS1bcHJvdG9jb2xdLgoKLSBGVFAgcmFuZ2UgZG93bmxvYWRzIGNvdWxkIG1ha2UgQ1VSTEVfRlRQX1dSSVRFX0VSUk9SIGdldCByZXR1cm5lZC4gV2Ugbm93CiAgbWFrZSBwcmVjYXV0aW9ucyB0byBub3QgcmV0dXJuIHRoaXMgZm9yIHJhbmdlIGRvd25sb2Fkcy4KCiAgQWRkZWQgdGVzdCBjYXNlIDEzNSB0aGF0IG1ha2VzIGFuIGZ0cCByYW5nZSBkb3dubG9hZC4gSGFkIHRvIHR3ZWFrIHRoZQogIHJ1bnRlc3RzLnBsIHNjcmlwdCBhIGJpdCB0b28uCgotIEJ1ZyByZXBvcnQgIzU2NjgzNSBpZGVudGlmaWVkIGEgc3RybGVuKCkgb24gYSBOVUxMIHBvaW50ZXIuIEFkZGVkIGFkZGl0aW9uYWwKICBjaGVjayB0byBwcmV2ZW50IHRoaXMuCgpEYW5pZWwgKDEwIEp1biAyMDAyKQotIEZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBjb25uZWN0IGZhaWx1cmUgcHJvYmxlbSB0aGF0IGRpZG4ndCBjcmVhdGUgYSBodW1hbgogIGVycm9yIHRleHQuCgotIEFkZGVkIGNvZGUgdG8gY29tcGlsZSB3aXRoIE9wZW5TU0wgMC45LjcuIEJhc2VkIG9uIHBhdGNoIGZyb20gSmFjb2IgTWV1c2VyCiAgYW5kIGNvbW1lbnRzIGZyb20gR/Z0eiBCYWJpbi1FYmVsbC4KCi0gR2F1dGFtIE1hbmkgZm91bmQgYSBzb2NrZXQgZGVzY3JpcHRvciBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiBGVFAgdHJhbnNmZXJzCiAgZmFpbGVkIGFuZCB5b3UgcmVpbnZva2VkIGN1cmxfZWFzeV9wZXJmb3JtKCkuCgpEYW5pZWwgKDUgSnVuIDIwMDIpCi0gR3VzdGFmIEh1aSBjb3JyZWN0ZWQgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgc28gdGhhdCBpdCB3b24ndCBjcmFzaCBubwogIG1hdHRlciB3aGVuIHlvdSBkZWNpZGUgdG8gcmVtb3ZlIHRoZSBDVVJMIGhhbmRsZS4KCi0gSEFWRV9SQU5EX1NUQVRVUyB3YXMgYWRkZWQgdG8gbGliL2NvbmZpZy13aW4zMi5oIGJ5IEFuZHJlYXMgT2xzc29uLCBhcyBpdAogIG1ha2VzIHdpbmRvd3MgYnVpbGRzIHN0b3AgY29tcGxhaW5pbmcgYWJvdXQgIndlYWsgc2VlZGluZyIgd2hlbiBpdCBpbiBmYWN0CiAgaXNuJ3QuCgotIEFub3RoZXIgNjRiaXQgYXJjaGl0ZWN0dXJlIGNyYXNoIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy45Ljcgd2FzIG5vdwogIHJlbW92ZWQsIGFzIGJ1ZyByZXBvcnQgIzU2NDU4NSBjbGFyaWZpZWQuIFRoaXMgaGFwcGVuZWQgZHVlIHRvIG91ciBhdHRlbXB0cwogIHRvIG9ubHkgYWxsb2NhdGUgb25seSBhcyBtdWNoIG1lbW9yeSBhcyBpcyBhY3R1YWxseSBuZWVkZWQgZm9yIG5hbWUKICByZXNvbHZpbmcgKHVzaW5nIHJlYWxsb2MpIHdoaWNoIGNhbGxlZCBmb3IgYSBmdW5jdGlvbiB0aGF0IGNvdWxkICdtb3ZlJyBhCiAgaG9zdGVudCBzdHJ1Y3QgaW4gbWVtb3J5LgoKVmVyc2lvbiA3LjkuOC1wcmUyCgpEYW5pZWwgKDMgSnVuIDIwMDIpCi0gVC4gQmhhcmF0aCBmaXhlZCB0aGUgQ1VSTElORk9fUkVESVJFQ1RfVElNRSB0byByZXR1cm4gYSBjb3JyZWN0IHRpbWUgYW5kCiAgbWFkZSB0aGUgQ1VSTElORk9fUkVRVUVTVF9TSVpFIHJldHVybiB0aGUgY29ycmVjdCB0b3RhbCByZXF1ZXN0IHNpemUuIEhlCiAgYWxzbyBtYWRlIHRoZSB3aW4zMiB0aW1lcnMgdXNlIGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgyOSBNYXkgMjAwMikKLSBSZW5hdWQgQ2hhaWxsYXQgbWFkZSBtZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IGxpYmN1cmwgcmV0dXJuZWQgYW4gZXJyb3IgaWYKICB5b3UgdHJpZWQgdG8gZ2V0IGFuIGVtcHR5IEZUUCBmaWxlLiBUaGlzIHNlZW1lZCBsaWtlIGEgd3JvbmcgdGhpbmcgdG8gZG8sIHNvCiAgbm93IGl0IG5vIGxvbmdlciBkb2VzIHRoYXQhIEkganVzdCBob3BlIHRoYXQgbm8gb25lIGJ1aWx0IGFueXRoaW5nIGZhbmN5CiAgdXBvbiB0aGlzIHVuZXhwZWN0ZWQgYmVoYXZpb3IuLi4KCkRhbmllbCAoMjggTWF5IDIwMDIpCi0gQ3JpcyBCYWlsaWZmIGJyb3VnaHQgQ1VSTE9QVF9DQVBBVEggdGhhdCB3b3JrcyBsaWtlIENVUkxPUFRfQ0FJTkZPIGJ1dAogIHNwZWNpZmllcyBhIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2l0aCBjZXJ0aWZpY2F0ZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgZmlsZQogIHdpdGggdGhlbSBhbGwgY29uY2F0ZW5hdGVkLiAtLWNhcGF0aCB3YXMgYWRkZWQgdG8gdGhlIGNvbW1hbmQgbGluZSB0b29sCiAgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLgoKICBXaW5kb3dzIHVzZXJzIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0aGF0IHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHNldHVwIHdpdGgKICB0aGUgY19yZWhhc2ggdG9vbCBvZiB0aGUgT3BlblNTTCBwYWNrYWdlLCBhbmQgdGhhdCBjcmVhdGVzIHN5bWxpbmtzIGJ5CiAgZGVmYXVsdCB0aGF0IG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBhY3R1YWwgY29waWVzIHRvIHdvcmsgb24gV2luZG93cy4KCi0gR3VzdGFmIEh1aSBwcm92aWRlZCBuZXcgY29kZSB0aGF0IGNoYW5nZXMgaG93IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkKICBtZXNzYWdlcyBhcmUgc3RvcmVkLCBzbyB0aGF0IHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBrZXB0IGFyb3VuZCBmb3IgdGhlIG11bHRpCiAgaGFuZGxlJ3MgZW50aXJlIGxpZmUgdGltZS4gSGUgYWxzbyBtYWRlIGl0IHJldHVybiBmYWlsdXJlIGNvZGVzIHByb3Blcmx5CiAgd2hpY2ggaXQgZGlkbid0IGRvIGJlZm9yZS4KCkRhbmllbCAoMjcgTWF5IDIwMDIpCi0gR3VzdGFmIEh1aSBwb2ludGVkIG91dCB0aGF0IHJ1bm5pbmcgY3VybF9tdWx0aV9wZXJmb3JtKCkgd2l0aG91dCBkb2luZwogIGN1cmxfbXVsdGlfZmRzZXQoKSBmaXJzdCB3YXMgbm90IHJlYWxseSBhIHdvcmtpbmcgY29tYm8uIEkgYWRkZWQgYW4gaW50ZXJuYWwKICBjaGVjayBmb3IgdGhpcyBhbmQgaGF2ZSBzb21lIGV4dHJhIHNlbGVjdCgpIGNvZGUgd2l0aG91dCB0aW1lb3V0IHRvIG1ha2UgdGhlCiAgbGlicmFyeSBpbnRlcm5hbHMgd29yayBpZGVudGljYWxseSBuZXZlcnRoZWxlc3MuIFdlIG1pZ2h0IG5lZWQgdG8gc29tZWhvdwogIGVpdGhlciBkb2N1bWVudCB0aGF0IG9uY2UgeW91J3ZlIHVzZWQgdGhlICpfZmRzZXQoKSB5b3Ugc2hvdWxkIHJlbWFpbiB1c2luZwogIHRoZW0gaW4gc2VsZWN0KCkgb3IgeW91IHNob3VsZCBibGFuayB0aGVtIHNvbWVob3cgc28gdGhhdCBsaWJjdXJsIHdvbid0IGdvCiAgY3JhenkuCgpWZXJzaW9uIDcuOS44LXByZTEKCkRhbmllbCAoMjIgTWF5IDIwMDIpCi0gSmFtZXMgQ29uZSBicm91Z2h0IGFuIGV4Y2VsbGVudCBwYXRjaCwgaW5jbHVkaW5nIHNldmVyYWwgdGVzdHMgYW5kIGRvY3MhCiAgQ1VSTE9QVF9ORVRSQyBub3cgdGFrZXMgYW4gZW51bSBhcyBhcmd1bWVudCBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBib29sZWFuLgogIC0tbmV0cmMtb3B0aW9uYWwgd2FzIGludHJvZHVjZWQgYXMgYW4gYWRkaXRpb24gdG8gLS1uZXRyYyB0byBhbGxvdyB0aGUKICBjb21tYW5kIGxpbmUgY2xpZW50IHRvIHRha2UgdXNlIG9mIGFsbCB0aGF0IG5ldyBuZXRyYyBzdHVmZi4KCi0gQnVnIHJlcG9ydCAjNTU4ODg4IHNob3dlZCBhIGNhc2Ugd2hlcmUgbGliY3VybCByZS11c2VkIHRoZSBwcmV2aW91cyBob3N0CiAgbmFtZSB3aGVuIGEgY29ubmVjdGlvbiBvdmVyIGEgcHJveHkgd2FzIHJlLXVzZWQgYnV0IHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgpEYW5pZWwgKDIxIE1heSAyMDAyKQotIEVkaW4gS2FkcmliYXNpYyBoZWxwZWQgbWUgc29ydCBvdXQgYSBwcm9ibGVtIHRvIG1hZGUgbGliY3VybCBjcmFzaCB3aGVuCiAgdHJ5aW5nIHRvIEhUVFAgUE9TVCBhbiBlbXB0eSBzdHJpbmcuCgotIENsYXJpZmllZCB0aGF0IEp1ZXJnZW4gV2lsa2UgZG9uYXRlZCB0aGUgb3JpZ2luYWwgdGVzdHMvc2VydmVyL3N3cy5jIGNvZGUuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgbWFkZSBjdXJsX2Zvcm1hZGQoKSByZXR1cm4gYSB0eXBlZGVmIG5hbWVkCiAgQ1VSTEZPUk1jb2RlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICdpbnQnLCBhbmQgdGhlIHZhcmlvdXMgcmV0dXJuIGNvZGVzIGFyZQogIG5vdyBnbG9iYWxseSBleHBvcnRlZC4gSXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBiZXR0ZXIgZmlndXJlIG91dCB3aGF0IGdvZXMKICB3cm9uZyB3aGVuIGN1cmxfZm9ybWFkZCgpIHJldHVybnMgZXJyb3JzLgoKRGFuaWVsICgyMCBNYXkgMjAwMikKLSBSb2xhbmQgWmltbWVybWFubiBwb2ludGVkIG91dCB0aGF0IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKQogIGlzIHByZWZlcmVkIHRvIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoKS4KCkRhbmllbCAoMTcgTWF5IDIwMDIpCi0gQnVnIHJlcG9ydCAjNTU2ODY5IHBvaW50ZWQgb3V0IHRoYXQgc3JjL3dyaXRlb3V0LmMgZGlkbid0IGNvbXBpbGUgb24gZnJlZWJzZAogIGFmdGVyIG15IEFJWCBmaXhlcyB0aGUgb3RoZXIgd2Vlay4KCi0gQnVnIHJlcG9ydCAjNTU2OTMwIHBvaW50ZWQgb3V0IGEgRnJlZUJTRCBjb3JlIGR1bXAgaW50cm9kdWNlZCBpbiA3LjkuNyBpbgogIHRoZSBETlMgc3RydWN0IHJlYWxsb2Mgc3R1ZmYuIEFjdHVhbGx5LCB0aGlzIGNyYXNoIGNvdWxkIGhhcHBlbiBvbiBhbGwKICBzeXN0ZW1zIHRoYXQgbWFkZSB0aGUgcGFja19ob3N0ZW50KCkgZnVuY3Rpb24gZ2V0IGludm9rZWQuCgotIEkgcmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIGluIHRoZSB0ZXN0IHN1aXRlJ3MgSFRUUCBzZXJ2ZXIuCgpWZXJzaW9uIDcuOS43CgpEYW5pZWwgKDEwIE1heSAyMDAyKQotIEtldmluIFJvdGggYWRqdXN0ZWQgdGhlIC0tdHJhY2UtYXNjaWkgb3V0cHV0IHNsaWdodGx5LgoKLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgb3V0IHRoYXQgc3JjL3dyaXRlb3V0LmMgbmVlZGVkIGFuIGFkZGl0aW9uYWwgaGVhZGVyCiAgZmlsZSBpbmNsdWRlZCBmb3IgQUlYIGJ1aWxkcwoKVmVyc2lvbiA3LjkuNy1wcmUyCgpEYW5pZWwgKDcgTWF5IDIwMDIpCi0gVXBkYXRlZCB0aGUgbWFuIHBhZ2Ugd2l0aCAtLXRyYWNlLWFzY2lpIGFuZCAtai8tLWp1bmstc2Vzc2lvbi1jb29raWVzLgoKLSBNYWRlIC0tdHJhY2UtYXNjaWkgZG8gcHJldHR5IG11Y2ggdGhlIHNhbWUgYXMgLS10cmFjZSBidXQgd2l0aG91dCB0aGUgaGV4CiAgcGFydCBpbiB0aGUgb3V0cHV0LgoKLSBBZGRlZCBDVVJMT1BUX0NPT0tJRVNFU1NJT04gdGhhdCB3aGVuIGVuYWJsZWQgbWFrZXMgbGliY3VybCBpZ25vcmUgc2Vzc2lvbgogIGNvb2tpZXMgcmVhZCBmcm9tIGEgZmlsZS4gVGhpcyBvcHRpb24gaXMgZW5mb3JjZWQgYnkgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbCB1c2luZyB0aGUgbmV3IC1qLy0tanVuay1zZXNzaW9uLWNvb2tpZXMgb3B0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoCiAgS2V2aW4gUm90aC4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIGN1cmwgdG8gZnVsbHkgZW11bGF0ZSBhIGJyb3dzZXIncwogIGJlaGF2aW9yLCBldmVuIHdoZW4gaXQgY29tZXMgdG8gInNlc3Npb24gY29va2llcyIuIFNlc3Npb24gY29va2llcyBhcmUKICBjb29raWVzIHRoYXQgYSBub3JtYWwgYnJvd3NlciBkaXNjYXJkcyB3aGVuIHRoZSBicm93c2VyIGlzIHNodXQKICBkb3duLiBUaGV5J3JlIGlkZW50aWZpZWQgYnkgbm90IGhhdmluZyBhbnkgZXhwaXJlIGRhdGUvdGltZS4KCi0gV2hlbiBDVVJMT1BUX0RFQlVHREFUQSB3YXMgc2V0LCBpdCBydWluZWQgdGhlIENVUkxPUFRfU1RERVJSIHNldHRpbmcgYW5kCiAgdGhpcyB3YXMgZGlzY292ZXJlZCB3aGVuIC0tdHJhY2Ugd2FzIG1hZGUgdG8gY3Jhc2guCgotIFVzaW5nIC12IGFuZCAtLXRyYWNlIGF0IHRoZSBzYW1lIHRpbWUgY29uZnVzZWQgbWF0dGVycy4gLXYgaXMgbm93IHByZXR0eQogIG11Y2ggaWdub3JlZCB3aGVuIC0tdHJhY2Ugb3IgLS10cmFjZS1hc2NpaSBpcyB1c2VkLgoKLSBNYWRlIC0tdHJhY2UgKGFuZCAtLXRyYWNlLWFzY2lpKSBzdXBwb3J0IC0gYXMgZmlsZSBuYW1lIHRvIHBhc3Mgb3V0cHV0IHRvCiAgc3Rkb3V0IGluc3RlYWQuIEl0IG1ha2VzIGl0IGNvbnNpc3RlbnQgd2l0aCBob3cgb3RoZXIgb3B0aW9ucyB3b3JrLgoKVmVyc2lvbiA3LjkuNy1wcmUxCgpEYW5pZWwgKDYgTWF5IDIwMDIpCi0gQWRkZWQgbXVsdGktcG9zdC5jIHRvIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkuIEkgZ290IHRoZSBiYXNpYyBzb3VyY2UgZm9yCiAgdGhpcyBmcm9tIEd1c3RhZiBIdWkuCgpEYW5pZWwgKDMgTWF5IDIwMDIpCi0gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBub3cgYW4gZXhwb3J0ZWQgI2RlZmluZSBpbiB0aGUgY3VybC9jdXJsLmggaGVhZGVyIGFuZAogIGNhbiBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgeW91ciB3cml0ZSBjYWxsYmFjayBjYW4KICBnZXQuCgotIENVUkxPUFRfUkVBRERBVEEgaXMgbm93IGFuIGFsaWFzIGZvciBDVVJMT1BUX0lORklMRSBhbmQgQ1VSTE9QVF9XUklURURBVEUgaXMKICBhbiBhbGlhcyBmb3IgQ1VSTE9QVF9GSUxFLiBUaGVzZSB0d28gd2VyZSBhZGRlZCBmb3IgY29uZm9ybWl0eS4gTW9zdCBvdGhlcgogIGNhbGxiYWNrIGZ1bmN0aW9uJ3MgdXNlcmRhdGEgYXJlIHByb3ZpZGVkIHdpdGggb3B0aW9ucyB1c2luZyBhIHNpbWlsYXIgbmFtZS0KICBzY2hlbWUuCgotIEFkZGVkICItLXRyYWNlIFtmaWxlXSIgdG8gdGhlIGNvbW1hbmQgbGluZSB0b29sLiBJdCBtYWtlcyBhIHZlcnkgZGV0YWlsZWQKICB0cmFjZSBkdW1wIGdldCBzdG9yZWQsIHdpdGggYSBmdWxsIHByb3RvY29sIGR1bXAgdGhhdCBpbmNsdWRlcyBhbGwgcmVjZWl2ZWQKICBhbmQgdHJhbnNtaXR0ZWQgZGF0YS4gVGhpcyBjb3VsZCBiZSBhIHZlcnkgZWZmZWN0aXZlIHRvb2wgZm9yIGRlYnVnZ2luZyB3aGF0CiAgZ29lcyB3cm9uZy4gVGhpcyBkdW1wIGluY2x1ZGVzIGV2ZXJ5IGJ5dGUgdGhlIHdheSBpdCBpcyBzZW50IHRvL3JlY2VpdmVkCiAgZnJvbSB0aGUgc2VydmVyLiBUaGUgZHVtcCBpcyB0aGUgcGxhaW4tdGV4dCB2ZXJzaW9uLCBzbyBTU0wgdHJhbnNmZXJzIHdpbGwKICBzdGlsbCBiZSByZWFkYWJsZS4KCi0gSSBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiB3YXMgbm90IGNhbGxlZCBwcm9wZXJseSBldmVyeXdoZXJlIGFzIHdlCiAgd2FudGVkIGl0IHRvLiBJIGZpeGVkIGl0LgoKLSAtRCBub3cgc3RvcmVzIGFsbCBoZWFkZXJzIHRvIHRoZSBzYW1lIGZpbGUgaWYgbXVsdGlwbGUgVVJMcyBhcmUgZ2l2ZW4gb24gdGhlCiAgY29tbWFuZCBsaW5lISBLZXZpbiBSb3RoIG1hZGUgbWUgYXdhcmUgb2YgdGhhdCBpdCBkaWRuJ3QgYWxyZWFkeSBkbyB0aGlzIQoKLSBHdXN0YWYgSHVpIHdyb3RlIGFuIGV4Y2VsbGVudCBmb3JtcG9zdCBleGFtcGxlIHRoYXQgdXNlZCB0aGUgbXVsdGkKICBpbnRlcmZhY2UuICBVbmZvcnR1bmF0ZWx5LCBpdCBkaWRuJ3Qgd29yayBkdWUgdG8gc2V2ZXJhbCBidWdzIGluIGhvdwogIHRyYW5zZmVycyB3ZXJlIG1hZGUgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKRGFuaWVsICgyIE1heSAyMDAyKQotIEhhbm5vIEtyYW56aG9mZiBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvaW5nIG11bHRpcGxlIHRyYW5zZmVycyBvbiB0aGUgc2FtZQogIGVhc3kgaGFuZGxlLCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd291bGQgc2hvdyBhIGJhZCAiY3VycmVudGx5IGRvd25sb2FkZWQKICB2YWx1ZSIgd2hlbiB0aGUgdHJhbnNmZXIgc3RhcnRzLgoKRGFuaWVsICgxIE1heSAyMDAyKQotIEFwcGxpZWQgYW5vdGhlciBwYXRjaCBieSBKYWNreSBMYW0gdG8gbWFrZSB0aGUgbmFtZSByZXNvbHZlIGluZm8gcmVhbGxvYygpCiAgc3R1ZmYgd29yayBwcm9wZXJseS4KCkRhbmllbCAoMjggQXByaWwgMjAwMikKLSBjdXJsX211bHRpX2luZm9fcmVhZCgpIGlzIG5vdyBpbXBsZW1lbnRlZCEKCkRhbmllbCAoMjcgQXByaWwgMjAwMikKLSBVcGRhdGVkIEJVR1MsIFRPRE8sIEZBUSwgSU5TVEFMTCBhbmQgYWRkZWQgQklORElOR1MuCgotIEkgdGhpbmsgSSBmaXhlZCB0aGUgRE5TIGNhY2hlIHBydW5lIGNyYWNoIEphY2t5IExhbSBmb3VuZCBhbmQgcmVwb3J0ZWQuCgotIEkgY2xlYW5lZCB1cCB0aGUgbmFtZSBwcmVmaXggc3R1ZmYgaW4gdGhlIGhhc2ggYW5kIGxsaXN0IG1vZHVsZXMuCgotIEZUUCByZXNwb25zZXMgc2hvdWxkIG5vdyBiZSBiZXR0ZXIgb24gdGltaW5nIG91dCBwcm9wZXJseS4gVGhlIHRpbWVvdXQgdmFsdWUKICBpcyBtYXhpbXVtIHRpbWVvdXQgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdCBvcGVyYXRpb24sIGJ1dCBiZWZvcmUgdGhpcywgdGhlCiAgdGltZW91dCB3YXMgdXNlZCBhcyBhIG1heGltdW0gYWxsb3dlZCB0aW1lIGJldHdlZW4gdHdvIHJlYWRzLi4uCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDIpCi0gRml4ZWQgdGhlIHRlc3Qgc3VpdGUgaHR0cCBzZXJ2ZXIgdG8gbm90IHVzZSBzbnByaW50ZigpIGFueW1vcmUgZHVlIHRvIGJldHRlcgogIHBvcnRhYmlsaXR5LgoKRGFuaWVsICgyNSBBcHJpbCAyMDAyKQotIFdpdGggU3RlcmxpbmcgSHVnaGVzJyBuZXcgRE5TIHBydW5pbmcsIEphY2t5IExhbSBhc2tlZCBpZiB0aGlzIHdvdWxkbid0CiAgY2F1c2UgcHJvYmxlbXMgc2luY2UgdGhlIHBydW5pbmcgaXMgb25seSBjaGVja2luZyB0aGUgZW50cnkgdGltZSwgYW5kIGl0CiAgc3VyZSBjb3VsZCBjYXVzZSBwcm9ibGVtcy4gVGhlcmVmb3IsIEkndmUgbm93IGFkZGVkIGFuZCBjaGFuZ2VkIGNvZGUgc28gdGhhdAogIHRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uIE5vd2hlcmUgaW4gdGhlIGNvZGUgd2lsbCBiZSBzdG9yZSBuYW1lCiAgcmVzb2x2ZWQgaW5mb3JtYXRpb24gYXJvdW5kIHNvIHRoYXQgYSBzdW5zZXF1ZW50IEROUyBjYWNoZSBwcnVuZSBzaG91bGQKICBjYXVzZSBhIHByb2JsZW0uIFRoaXMgb2YgY291cnNlIGNhbGxlZCBmb3Igc29tZSBtaWxkIGludGVybmFsIGNoYW5nZXMuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDIpCi0gSW1wcm92ZWQgdGhlICdub19wcm94eScgY2hlY2ssIGFzIHVzaW5nIHBvcnQgbnVtYmVycyBpbiB0aGUgVVJMIGNvbmZ1c2VkIGl0CiAgcHJldmlvdXNseS4gUmVwb3J0ZWQgYnkgRXJ3YW4gTGVncmFuZCBpbiBidWcgcmVwb3J0ICM1NDc0ODQuCgotIFRoZSAtLWludGVyZmFjZSBvcHRpb24gbm93IHdvcmtzIGV2ZW4gb24gSVB2NiBlbmFibGVkIGJ1aWxkcy4gUmVwb3J0ZWQgYnkKICAndGhvcicuCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDIpCi0gVGhlICNkZWZpbmVzIG5hbWVzIHN0YXJ0aW5nIHdpdGggVElNRUNPTkQgbm93IGhhcyBDVVJMXyBwcmVmaXhlcy4gKFRoZSBvbGQKICBuYW1lcyBhcmUgc3RpbGwgI2RlZmluZWQgdG9vLikgUG9pbnRlZCBvdXQgYnkgUm9iZXJ0IE9sc29uLgoKLSBKYWNreSBMYW0gYnJvdWdodCBjb2RlIHRoYXQgbGV0cyB0aGUgbmFtZSByZXNvbHZlIGZ1bmN0aW9uIG9ubHkgdXNlIGFzIG11Y2gKICBtZW1vcnkgYXMgaXQgYWN0dWFsbHkgbmVlZHMuIFRoaXMgb25seSB3b3JrcyBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLAogIGJ1dCBpcyB0b3RhbGx5IHRyYW5zcGFyYW50IHRvIGFsbCB1c2Vycy4KCkRhbmllbCAoMTkgQXByaWwgMjAwMikKLSBCam9ybiBSZWVzZSBmaXhlZCBwYWNrX2hvc3RlbnQgdG8gd29yayBwcm9wZXJseSB3aXRoIDY0IGJpdCBwb2ludGVycy4KCkRhbmllbCAoMTggQXByaWwgMjAwMikKLSBTdGVybGluZyBIdWdoZXMgYWRkZWQgY29kZSB0byBwcnVuZSBvbGQgRE5TIGNhY2hlIGVudHJpZXMsIHNpbmNlIEphY2t5IExhbQogIGV4cGVyaWVuY2VkIHZlcnkgYmlnIGNhY2hlcy4KCkRhbmllbCAoMTcgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBwYXRjaGVkIHRoZSAzMDEgcmVzcG9uc2UgdG8gd29yayBhZ2FpbnN0IHRoZSBSRkMgYnV0IG1vcmUgbGlrZQogIGNvbW1vbiBicm93c2VycyBkby4gSWYgYSBQT1NUIGdldCBhIDMwMSBiYWNrLCBpdCdsbCBzd2l0Y2ggdG8gR0VUIGluIHRoZQogIG5leHQgcmVxdWVzdCAoaWYgbG9jYXRpb24tZm9sbG93aW5nIGlzIGVuYWJsZWQpLgoKRGFuaWVsICgxNiBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIHBvc3RlZCBhIHBhdGNoIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBJbmdvIFdpbGtlbiB0aGF0IGludHJvZHVjZWQKICB0d28gbmV3IENVUkxJTkZPXyogdmFsdWVzOiBDVVJMSU5GT19SRURJUkVDVF9USU1FIGFuZAogIENVUkxJTkZPX1JFRElSRUNUX0NPVU5ULgoKRGFuaWVsICgxNSBBcHJpbCAyMDAyKQotIEpvbmF0YW4gTGFuZGVyIHBhdGNoZWQgdGhlIHZlcmJvc2UgdGV4dCAnRGlzYWJsZXMgUE9TVCwgZ29lcyB3aXRoIEdFVCcgdG8KICByZWZsZWN0IHJlYWxpdHkgYmV0dGVyLCBsaWtlIHdoZW4gdGhlIGZpcnN0IHJlcXVlc3QgaXNuJ3QgUE9TVCBhbmQgd2hlbgogIHRoZSBzZWNvbmQgaXNuJ3QgR0VULi4uIDotKQoKLSBDcmFpZyBEYXZpc29uIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBjdXJsX2Zvcm1hZGQoKWluZyBhIGZpbGUgdGhhdCBkb2Vzbid0CiAgZXhpc3QsIGxpYmN1cmwgZG9lc24ndCByZXR1cm4gZXJyb3IuIE5vdywgY3VybF9lYXN5X3BlcmZvcm0oKSB3aWxsIHJldHVybgogIENVUkxFX1JFQURfRVJST1IgaWYgdGhhdCBpcyB0aGUgY2FzZS4gVGVzdCA0MSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuOS42CgpEYW5pZWwgKDE0IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RyaXAgb2ZmIHdoaXRlIHNwYWNlcyBmcm9tIHRoZQogIGJlZ2lubmluZyBvZiBjb29raWUgY29udGVudHMuCgotIEhhZCB0byBwYXRjaCBpbmNsdWRlL2N1cmwvY3VybC5oIHNpbmNlIE1TVkMgZG9lc24ndCBzZXQgdGhlIF9fU1REQ19fIGRlZmluZS4KICBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhlIHByb2JsZW0sIEJqb3JuIFJlZXNlIHRoZSBzb2x1dGlvbi4KClZlcnNpb24gNy45LjYtcHJlNQoKRGFuaWVsICgxMiBBcHJpbCAyMDAyKQotIEZpeGVkIHRoZSBUSU1FUl9DT05ORUNUIHRvIGJlIG1vcmUgYWNjdXJhdGUgZm9yIEZUUCB0cmFuc2ZlcnMuIFByZXZpb3VzbHkKICBGVFAgdHJhbnNmZXJzIGdvdCB0aGUgImNvbm5lY3QgZG9uZSIgdGltZSBzZXQgYWZ0ZXIgdGhlIGluaXRpYWwgRlRQIGNvbW1hbmRzCiAgYW5kIG5vdCBkaXJlY3RseSBhZnRlciB0aGUgVENQL0lQIGNvbm5lY3QgYXMgaXQgc2hvdWxkLgoKICBJIGFsc28gbWFkZSB0aGUgdGltZSBzdGFtcCBnZXQgc2V0IGV2ZW4gaWYgdGhlIGNvbm5lY3QgaXRzZWxmIGZhaWxzLCB3aGljaAogIGl0IGRpZG4ndCBkbyBwcmV2aW91c2x5LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHByb3ZpZGVkIGhpcyBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gYW5kIENVUkxPUFRfREVCVUdEQVRBLiBUaGV5IGFsbG93IGEgcHJvZ3JhbSB0byBhIHNldCBhCiAgY2FsbGJhY2sgdG8gcmVjZWl2ZSBkZWJ1Zy9pbmZvcm1hdGlvbiBkYXRhLiBUaGF0IGluY2x1ZGVzIGhlYWRlcnMgYW5kIGRhdGEKICB0aGF0IGlzIHJlY2VpdmVkIGFuZCBzZW50LiBDVVJMT1BUX1ZFUkJPU0Ugc3RpbGwgY29udHJvbHMgaXQuCgogIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIGFuIGludGVybmFsIGRlYnVnZnVuY3Rpb24gdGhhdCB3aWxsIG1ha2UgdGhpbmdzIGxvb2sKICBhbmQgd29yayBhcyBiZWZvcmUgaWYgbm90IGNoYW5nZWQuCgpEYW5pZWwgKDEwIEFwcmlsIDIwMDIpCi0gU2ViYXN0aWVuIFdpbGxlbWlqbnMgZm91bmQgb3V0IHRoYXQgLXggZGlkbid0IHVzZSB0aGUgZGVmYXVsdCBwb3J0IG51bWJlciBhcwogIGlzIGRvY3VtZW50ZWQuIEl0IGRvZXMgbm93LgoKLSBsaWJjdXJsLWVycm9ycy4zIGlzIGEgbmV3IG1hbiBwYWdlIGF0dGVtcHRpbmcgdG8gZG9jdW1lbnQgYWxsIGxpYmN1cmwgZXJyb3IKICBjb2RlcwoKLSBBZGRlZCB0d28gbmV3IGVycm9yIGNvZGVzIGFuZCBjaGFuZ2VkIHRoZSBiZWhhdmlvdXIgb2YgdHdvIG9sZCBvbmVzCiAgc2xpZ2h0bHk6CgogIENVUkxFX1dSSVRFX0VSUk9SCiAgIFRoaXMgZXJyb3Igd2FzIHJldHVybmVkICpib3RoKiBmb3IgZXJyb3JzIHRoYXQgb2NjdXJlZCB3aGVuIHdyaXRpbmcKICAgcmVjZWl2ZWQgZGF0YSB0byBhIGxvY2FsIGZpbGUsIGFzIHdlbGwgYXMgd2hlbiB3ZSBnZXQgcHJvYmxlbXMgd3JpdGluZyBkYXRhCiAgIHRvIGEgcmVtb3RlIHNlcnZlci4gQ1VSTEVfU0VORF9FUlJPUiBoYXMgbm93IGJlZW4gYWRkZWQgZm9yIHRoZSBsYXR0ZXIKICAgZXJyb3IuCgogIENVUkxFX1JFQURfRVJST1IKICAgVGhpcyBlcnJvciB3YXMgc2ltaWxhcmx5IHJldHVybmVkICpib3RoKiBmb3IgZXJyb3JzIHdoZW4gcmVhZGluZyBhIGxvY2FsCiAgIGZpbGUsIGFzIHdlbGwgYXMgd2hlbiBnZXR0aW5nIHByb2JsZW1zIHdoZW4gcmVhZGluZyBuZXR3b3JrIGRhdGEuCiAgIENVUkxFX1JFQ1ZfRVJST1IgaGFzIG5vdyBiZWVuIGFkZGVkIGZvciB0aGUgbGF0dGVyIGVycm9yLgoKIChUd28gdGVzdCBjYXNlcyB3ZXJlIGFkanVzdGVkIGFjY29yZGluZ2x5LikKCkRhbmllbCAoOSBBcHJpbCAyMDAyKQotIHJ1bnRlc3RzLnBsIG5vdyBzZXRzIHRoZSBIT01FIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIGN1cmwsIHRvIHByZXZlbnQgYW55CiAgYWN0dWFsIH4vLmN1cmxyYyBmaWxlIHRvIGZvb2wgdGhlIHRlc3RzIQoKVmVyc2lvbiA3LjkuNi1wcmU0CgpEYW5pZWwgKDggQXByaWwgMjAwMikKLSBNaWNoYWVsIEN1cnRpcyBwcm92aWRlZCBuZXcgZnVuY3Rpb25hbGl0eSBmb3IgY3VybCBvbiBzb21lIHBsYXRmb3Jtcy4gVXNpbmcKICB0aGUgLS1lbnZpcm9ubWVudCBvcHRpb24sIGN1cmwgd2lsbCAqc2V0KiBhIGJ1bmNoIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcwogIHRvIHZhbHVlcy4gVGhlIG5hbWVzIGFyZSB0aGUgc2FtZSBvbmVzIGFzIGZvciB0aGUgLXcvLS13cml0ZW91dCBvcHRpb24uCgogIEZvciBub3csIHRoaXMgb25seSB3b3JrcyBvbiB0aGUgUklTQyBPUyB2ZXJzaW9uLCBhcyB0aGlzIGZlYXR1cmUgcmVsaWVzIG9uCiAgYm90aCBPUyBzdXBwb3J0IGFuZCB0aGF0IGl0IG1hdGNoZXMgT1MgcGFyYWRpZ21zLgoKLSBKYWNreSBMYW0gcHJvdmlkZWQgYSBmaXggZm9yIGdldHRpbmcgaGVhZGVycy1vbmx5IHdoZW4gdGhlIHJlcGx5IGlzIEhUVFAvMS4wCiAgYW5kIDMwNCwgSSBlZGl0ZWQgaXQgc2xpZ2h0bHkuCgpEYW5pZWwgKDUgQXByaWwgMjAwMikKLSBBcyByZXF1ZXN0ZWQgYnkgSmF5IEdyYXZlcywgdGhlICcuY3VybHJjJyBmaWxlIChvciBfY3VybHJjIGFzIGl0IGlzIGNhbGxlZAogIHdoZW4gdXNlZCBpbiB3aW5kb3dzKSwgaXMgbm93IGxvYWRlZCBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiB0aGUgSE9NRQogIGVudmlyb25tZW50IHZhcmlhYmxlIGlzbid0IHNldCAob3IgaWYgaXQgaXMgdG9vIGxvbmcpLiBJIGFsc28gZW5sYXJnZWQgdGhlCiAgYXJyYXkgdXNlZCB0byBzdG9yZSB0aGUgZnVsbCBmaWxlIHBhdGggaW4sIHRvIDUxMiBieXRlcy4KCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0byBtZSB3aHkgdGhlICIxOSBNYXJjaCIgY2hhbmdlIHJlZ2FyZGluZyAtRyBhbmQgLUkKICB3YXMgc3R1cGlkIGFuZCB0aGUgY2hhbmdlIHdhcyByZXZlcnRlZC4gQWRkZWQgdGVzdCBjYXNlIDQ4IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LgoKVmVyc2lvbiA3LjkuNi1wcmUzCgpEYW5pZWwgKDQgQXByaWwgMjAwMikKLSBKb25hdGFuIExhbmRlciBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyBjdXJsL2N1cmwuaCBjb21waWxlIG5pY2VseSBvbgogIHByZS1JU08gY29tcGlsZXJzLCBsaWtlIHdoZW4gdXNpbmcgZ2NjIC10cmFkaXRpb25hbC4KCkRhbmllbCAoMyBBcHJpbCAyMDAyKQotIEphY2t5IExhbSBpZGVudGlmaWVkIGEgZ2xpdGNoIHdoZW4gZ2V0dGluZyBoZWFkZXJzLW9ubHksIHdoZXJlIGxpYmN1cmwgd291bGQKICAiaGFuZyIgMSBzZWNvbmQgaW4gdmFpbiBpbiB0aGUgc2VsZWN0KCkgbG9vcCBiZWZvcmUgcmV0dXJuaW5nIGJhY2suCgotIFRvciBBcm50c2VuIGJyb3VnaHQgYSBwYXRjaCBmb3IgbXVsdGlwYXJ0IGZvcm1wb3N0cy4gSXQgdHVybmVkIG91dCB0aGF0IHRoZQogICJDR0lfTGl0ZSBQZXJsIHBhY2thZ2UiIG1ha2VzIHNvbWUgYmFkIGFzc3VtcHRpb25zIG9uIHdoYXQgbGV0dGVycyB0aGF0IG1heQogIGJlIHVzZWQgaW4gYm91bmRhcnkgc3RyaW5ncyBhbmQgdGh1cyBjdXJsIGNvdWxkIGNvbmZ1c2UgaXQgYnkgaW5jbHVkaW5nICcrJwogIGFuZCAnLycuIFdoaWxlIHRoaXMgaXMgc3RhbmRhcmRzLWNvbXBsaWFudCwgd2UgY2hhbmdlIHRoZSBiZWhhdmlvciB0byB3b3JrCiAgc21vb3RobHkgd2l0aCBleGlzdGluZyBzb2Z0d2FyZSBiYXNlZCBvbiB0aGF0IHBhY2thZ2UuCgpEYW5pZWwgKDIgQXByaWwgMjAwMikKLSBHZXJoYXJkIEhlcnJlIGZpbGVkIGJ1ZyByZXBvcnQgIzUzNjIzOCB3aGVyZSBoZSBwb2ludGVkIG91dCBhIGNyYXNoIGluCiAgdmVyYm9zZSBGVFAgcGFzc2l2ZSB0cmFuc2ZlcnMgZm9yIEFJWC4KCi0gQ2xhcmVuY2UgR2FyZG5lciBwb2ludGVkIG91dCBhIG1pbm9yIGZsYXcgaW4gaG93IGxpYmN1cmwgZGlkbid0IHByb3Blcmx5CiAgdGFrZSBjYXJlIG9mIGFsbCBlcnJvcnMgdGhhdCBTU0xfcmVhZCgpIGNvdWxkIHJldHVybi4KCi0gSmFja3kgTGFtIGZpeGVkIGEgTUFMTE9DREVCVUcgcHJvYmxlbSBpbiBsaWIvZ2V0aW5mby5jCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDIpCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGZ1bmN0aW9uIHRoYXQgZGlkbid0CiAgY2hlY2sgcHJveHkgY29ubmVjdGlvbnMgcHJvcGVybHkgZm9yICJkZWFkbmVzcyIgYmVmb3JlIHRoZXkgd2VyZSByZS11c2VkLgoKLSBQZWRybyBOZXZlcyBmb3VuZCBvdXQgdGhhdCBIVFRQIFBPU1Rpbmcgd2l0aCAtLWRhdGEtYmluYXJ5IGRpZCBub3QgcHJvcGVybHkKICB3b3JrIHVuZGVyIFdpbmRvd3MgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdhc24ndCByZWFkIGZ1bGx5IGJpbmFyeSEKCkRhbmllbCAoMjUgTWFyY2ggMjAwMikKLSBKYWNreSBMYW0gYnJvdWdodCBhIGZpeCB0aGF0IGltcHJvdmVzIHRyZWF0bWVudCBvZiBjb29raWVzIHVzaW5nIGlkZW50aWNhbAogIGRvbWFpbnMgYnV0IHdpdGggbGVhZGluZyBkb3RzIHByb3Blcmx5LgoKRGFuaWVsICgyMiBNYXJjaCAyMDAyKQotIE1pa2xvcyBOZW1ldGggdXBkYXRlZCB0aGUgd2luZG93cyBzZWN0aW9uIG9mIHRoZSBkb2NzL0lOU1RBTEwgZmlsZSBhbmQgdGhlCiAgd2luZG93cyBtYWtlZmlsZXMuCgotIEpvbiBEaWxsb24gcHJvdmlkZWQgdXMgd2l0aCBzZXZlcmFsIGdvb2QtbG9va2luZyBjdXJsIGltYWdlcyBmb3IKICBwcm9tb3Rpb24uIFZpZXcgdGhlbSBoZXJlIGh0dHA6Ly9jdXJsLmhheHguc2UvaWNvbnMuaHRtbAoKRGFuaWVsICgyMCBNYXJjaCAyMDAyKQotIFBldGVyIFZlcmhhcyBmb3VuZCBvdXQgdGhhdCBDUkxGIHJlcGxhY2VtZW50IGluIHVwbG9hZHMgd2FzIG5vdCB3b3JraW5nLiBJCiAgZml4ZWQgaXQsIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTI4IHRoYXQgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIFRoZSBsaXN0IGZvcm1lcmx5IGtub3duIGFzIGN1cmwtbWFpbiBpcyBub3cgbmFtZWQgY3VybC11c2VycyBhbmQgaXMgaG9zdGVkCiAgYnkgc291cmNlZm9yZ2UuIFN1c2JjcmliZSB0byB0aGUgbmV3IGxpc3QsIGdldCBvZmYgdGhlIG9sZCBvbmUuCgpWZXJzaW9uIDcuOS42LXByZTIKCkRhbmllbCAoMTkgTWFyY2ggMjAwMikKLSBNYWRlIC1HIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgY2F1c2UgYW4gZXJyb3IuCgotIE1vdmVkIHRoZSBtdWx0aS5oIGZpbGUgdG8gdGhlICJwdWJsaWMiIGluY2x1ZGUgZGlyZWN0b3J5IGFuZCBtYWRlIGl0IGdldAogIGluY2x1ZGVkIGJ5IGN1cmwuaCBzbyB0aGF0IG5vIGV4dHJhIGluY2x1ZGUgZmlsZXMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gdXNlCiAgaXQuCgogIEFkZGVkIGRvY3MgYW5kIG1hbiBwYWdlcyBmb3IgdGhlIG11bHRpIGludGVyZmFjZSB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgogIEFkZGVkIHRoZSB0aHJlZSBleGFtcGxlIHNvdXJjZSBjb2RlcyB0b28uCgogIE5lY2Vzc2FyeSBzdGVwcyBpbiBteSBjYW1wYWlnbiB0byBzbmVhayBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlLi4uIDstKQoKLSBVcGRhdGVkIHRoZSB5ZWFyIGluIGFsbCBjb3B5cmlnaHQgbm90aWNlcyBpbiBhbGwgQyBhbmQgSCBmaWxlcy4KCkRhbmllbCAoMTggTWFyY2ggMjAwMikKLSBUb21hcyBTemVwZSBmb3VuZCBvdXQgdGhhdCAtZCBhbmQgLUcgZGlkbid0IG1peCBhcyB0aGV5IHNob3VsZC4gSSBicm9rZSB0aGlzCiAgaW4gNy45LjUuLi4gQWRkZWQgdGVzdCBjYXNlIDMyIGZvciB0aGlzLgoKVmVyc2lvbiA3LjkuNi1wcmUxCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDIpCi0gUGV0ZXIgVmVyaGFzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3Vuc2NhcGUgbWFuIHBhZ2VzCiAgY29udGFpbmVkIGZhY3R1YWwgZXJyb3JzLgoKLSBBbGJlcnQgQ2hveSBmb3VuZCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSB2ZXJib3NlIG91dHB1dCB3aGVuIGRvaW5nCiAgUEFTViBmdHAgdHJhbnNmZXJzLiBJdCBjb3VsZCBtYWtlIGxpYmN1cmwgY3Jhc2guCgogIERldGFpbHMgaW4gYnVnIHJlcG9ydCAjNTMwNTYyOgogIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD0xMDA5NzYmYWlkPTUzMDU2MiZncm91cF9pZD05NzYKCkRhbmllbCAoMTUgTWFyY2ggMjAwMikKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNTMwMjA0IHRoYXQgY2xlYXJseSBwb2ludGVkIG91dAogIHRoZSBQRl9JTkVUIGZpeCBmcm9tIEZlYnJ1YXJ5IDE5IGFzIGEgbm90LXZlcnktZ29vZCBmaXggYXMgaXQgYnJva2UgSVB2NgogIGNhcGFiaWxpdHkhIFRoYXQgcGF0Y2ggaXMgbm93IHJldmVydGVkLgoKICBUaGUgcHJvYmxlbSB3aXRoIHNsb3cgbmFtZSBsb29rdXBzIHdpdGggZ2V0YWRkcmluZm8oKSBvbiBub24tSVB2NiBlbmFibGVkCiAgaG9zdHMgYXJlIGluc3RlYWQgbWFkZSBieSBmaXJzdCBjaGVja2luZyBpZiB0aGUgc3RhY2sgaXMgSVB2Ni1lbmFibGVkIGFuZCBpZgogIG5vdCwgdGhlIFBGX0lORVQgaXMgdXNlZCBhbmQgb3RoZXJ3aXNlIHdlIGdvIHdpdGggdGhlIGZ1bGwgUEZfVU5TUEVDLgoKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiB3ZSByZXR1cm4gYW4gImVycm9yIiBmcm9tIGEgV1JJVEVGVU5DVElPTgogIGFzIGRlc2NyaWJlZCBpbiB0aGUgbWFuIHBhZ2UsIGxpYmN1cmwgZGlkIG5vdCByZXR1cm4gdGhlIGRvY3VtZW50ZWQgZXJyb3IKICBjb2RlIChDVVJMRV9XUklURV9FUlJPUikgYnV0IHdvdWxkIGluc3RlYWQgcmV0dXJuIENVUkxFX1JFQURfRVJST1IuIFRoaXMgaXMKICBub3cgY29ycmVjdGVkLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAyKQotIFNldHRpbmcgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgbm93IHJlYWQgdGhlIFBPU1QtCiAgZGF0YSBmcm9tIHRoZSBjYWxsYmFjay4KCi0gVGhlIEdPUEhFUiBzdXBwb3J0IHNlZW1zIHRvIGJlIGJyb2tlbi4gSSBkb24ndCB0aGluayBJJ2xsIGV2ZW4gc3RhcnQgZml4aW5nCiAgaXQgdW50aWwgc29tZW9uZSBlbHNlIGZpbmRzIG91dC4uLiA6LSkKCkRhbmllbCAoMTMgTWFyY2ggMjAwMikKLSBUcnlpbmcgJ2N1cmwgLUkgZnRwLnN1bmV0LnNlJyBvciBzaW1pbGFyIGRpZCBhIFNJWkUgb24gYSBzaWxseSAiKG5pbCkiCiAgc3RyaW5nLiBJZiBzdWNoIGEgZmlsZSB3b3VsZCBiZSBwcmVzZW50LCBjdXJsIHJldHVybmVkIHRoZSBzaXplIG9mIGl0ISBOb3cKICB3ZSBwcmV2ZW50IHRoaXMuCgotIEN1cmxfc2VuZGYoKSB3YXMgZml4ZWQgdG8gZGVhbCB3aXRoIHNpdHVhdGlvbiB3aGVyZSBDdXJsX3dyaXRlKCkgd291bGQndmUKICBibG9ja2VkIGFuZCB0aHVzIHJldHVybiAtMS4KCi0gU2V0dGluZyBDVVJMT1BUX1BST0dSRVNTRlVOQ1RJT04gdG8gTlVMTCBub3cgcmVzdG9yZXMgdGhlIGludGVybmFsIGZ1bmN0aW9uLgoKLSBBbGwgQ1VSTEZPUk1fKiBvcHRpb25zIGNhbiBub3cgYmUgdXNlZCBpbiBhIENVUkxGT1JNX0FSUkFZIGV4Y2VwdCB0aGUKICBDVVJMRk9STV9BUlJBWSBpdHNlbGYuIFRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBjb3VsZG4ndCBleHBhbmQgdGhlCiAgQ1VSTEZPUk1fKiBsaXN0IHByb3ByZWx5IGFuZCB1bnJlc3RyaWN0ZWQgdW50aWwgdGhpcyB3YXMgdGhlIGNhc2UuIEl0IHdhcwogIGFsc28gYSBiaXQgcGVjdWxpYXIgdG8gdXNlcnMgd2h5IHNvbWUgb3B0aW9ucyBjb3VsZCBiZSB1c2VkIGluIGFuIGFycmF5CiAgd2hpbGUgb3RoZXJzIGNvdWxkbid0LgoKLSBSZW1vdmVkIHNvbWUgc2lsbHkgQ1JMRiBsaW5lcyB0aGF0IGhhZCBhY2NpZGVudGFsbHkgc2xpcHBlZCBpbnRvIHNyYy9tYWluLmMKICBOaWNvIEJhZ2d1cyBwb2ludGVkIHRoZW0gb3V0IHRvIG1lLgoKRGFuaWVsICgxMSBNYXJjaCAyMDAyKQotIENVUkxGT1JNX0ZJTEVOQU1FIHdhcyBhZGRlZC4gVGhpcyBjYW4gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBmaWxlIHVwbG9hZAogIHBhcnQsIHRvIHNldCB0aGUgJ2ZpbGVuYW1lJyBmaWVsZCB0byBhIGN1c3RvbSB2YWx1ZS4gSWYgdGhpcyBpc24ndCB1c2VkLAogIHRoZSBhY3R1YWxseSB1c2VkIGZpbGVuYW1lIHdpbGwgYmUgaW5jbHVkZWQgaW5zdGVhZCAoYXMgbGliY3VybCBhbHdheXMgaGFzCiAgZG9uZSkuIGN1cmwgd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LCBhbmQgbm93IC1GIGFjY2VwdHMgYSAnZmlsZW5hbWU9JyBmaWVsZAogIHRvbywgYW5kIGFsbG93cyBjb25zdHJ1Y3RzIHN1Y2ggYXM6CgogICAgLUYgJ25hbWU9QGZpbGVuYW1lO2ZpbGVuYW1lPS9kZXYvbnVsbCcKCiAgYW5kIHRoaXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdHlwZT0gdG9vLCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvOgoKICAgLUYgImZpbGU9QGxvZy90ZXN0MzkudHh0O2ZpbGVuYW1lPWZha2VyZmlsZTt0eXBlPW1vby9mb29iYXIiCgogIFRlc3QgY2FzZSAzOSB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVGhlIHN0cnVjdCBmb3JtZXJseSBrbm93biBhcyBIdHRwUG9zdCBpcyBub3cgbmFtZWQgY3VybF9odHRwcG9zdCB0byBwcm9wZXJseQogIHVzZSB0aGUgY3VybCBuYW1lIHNwYWNlLiBJIGFkZGVkIGEgI2RlZmluZSBmb3IgdGhlIG9sZCBuYW1lIHRvIG1ha2UgZXhpc3RpbmcKICBwcm9ncmFtcyBjb21waWxlIGV2ZW4gd2hlbiB0aGlzIG5ldyBpbmNsdWRlIGZpbGUgaXMgdXNlZC4KCkRhbmllbCAoOCBNYXJjaCAyMDAyKQotIENsaWZmb3JkIGFsc28gZGlzY292ZXJlZCB0aGF0IGlmIHRoZSBjbGllbnQgY29kZSBmYWlsZWQgZWFybHksIGFzIHdoZW4gZG9pbmcKICAiY3VybCAtTyIgb25seSwgaXQgd291bGQgZG8gZmNsb3NlKE5VTEwpIHdoaWNoIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBmYXVsdAogIG9uIHNvbWUgc3lzdGVtcy4KCi0gQ2xpZmZvcmQgV29sZiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSAtLXByb2dyZXNzLWJhciB3b3JrIGFnYWluLgoKLSBJIGNsb3NlZCBidWcgcmVwb3J0ICM1MjcwMzIgYnkgbWFraW5nIHN1cmUgdGhhdCB3ZSBhZGQgYSBuZXdsaW5lIGFmdGVyIGEKICB0cmFuc2ZlciB3aGVuIC0tcHJvZ3Jlc3MtYmFyIGhhcyBiZWVuIHVzZWQuIEJlZm9yZSwgd2l0aG91dCB0aGUgbmV3bGluZSwgaXQKICBtYWRlIHRoZSBzdWJzZXF1ZW50IHRleHQgY29tZSBvdXQgd3JvbmcuCgpWZXJzaW9uIDcuOS41CgpEYW5pZWwgKDcgTWFyY2ggMjAwMikKLSBBZGRlZCBkb2NzL0tOT1dOX0JVR1MgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoNiBNYXJjaCAyMDAyKQotIEtldmluIFJvdGggY29ycmVjdGVkIGEgZmxhdyBpbiB0aGUgY3VybCBjbGllbnQgZ2xvYmJpbmcgY29kZSB0aGF0IG1hZGUgaXQKICBtZXNzIHVwIGJhY2tzbGFzaGVzLiBUaGlzIHdhcyBtb3N0IG5vdGFibGUgb24gd2luZG93cyAoY3lnd2luKSBtYWNoaW5lcyB3aGVuCiAgdXNpbmcgZmlsZTovLy4KCi0gQnJhZCBwcm92aWRlZCBhbm90aGVyIGZpeCBmb3IgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuCgotIFJhbHBoIE1pdGNoZWxsIHBhdGNoZWQgYXdheSBhIGZldyBjb21waWxlciB3YXJuaW5ncyBpbiB0ZXN0cy9zZXJ2ZXIvc3dzLmMKCkRhbmllbCAoNSBNYXJjaCAyMDAyKQotIEkgbm90aWNlZCB0aGF0IHRoZSB0eXBlZGVmIGluIGN1cmwuaCBmb3IgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHByb3RvdHlwZSB3YXMKICB3cm9uZyBhbmQgdGh1cyBhcHBsaWNhdGlvbnMgdGhhdCB1c2VkIGl0IHdvdWxkIG5vdCBnZXQgdGhlIHByb3BlciBpbnB1dAogIGRhdGEuIEl0IHVzZWQgc2l6ZV90IHdoZXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSB1c2VzIGRvdWJsZXMhCgogIEkgd2lzaCBJIGNvdWxkIGJsYW1lIHNvbWVvbmUgZWxzZSwgYnV0IHRoaXMgd2FzIG15IGZhdWx0LiBBZ2Fpbi4KClZlcnNpb24gNy45LjUtcHJlNgoKRGFuaWVsICg0IE1hcmNoIDIwMDIpCi0gQ3V0IG9mZiB0aGUgY2hhbmdlcyBkb25lIGR1cmluZyAyMDAxIGZyb20gdGhpcyBjaGFuZ2Vsb2cgZmlsZSBhbmQgcHV0IHRoZW0KICBpbiBhIHNlcGFyYXRlIGZpbGUgKENIQU5HRVMuMjAwMSksIGF2YWlsYWJsZSBmcm9tIENWUyBvZiBjb3Vyc2UuCgotIEkgcmVtb3ZlZCB0aGUgbXVsdGkgZGlyZWN0b3J5LiBUaGUgZXhhbXBsZSBzb3VyY2VzIHdlcmUgbW92ZWQgdG8gdGhlCiAgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2hlcmUgdGhleSBiZWxvbmcuCgotIFdyb3RlIDcgbmV3IG1hbiBwYWdlcyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGluIHRoZSBuZXcgbXVsdGkgaW50ZXJmYWNlLgogIFRoZXkncmUgYWxsIHN0aWxsIHByZXR0eSBiYXNpYywgYnV0IHdlIGNhbiB1c2UgdGhlbSBhcyBhIHN0YXJ0IGFuZCBhZGQgbW9yZQogIGNvbnRlbnRzIHRvIHRoZW0gd2hlbiB3ZSBmaWd1cmUgb3V0IHdoYXQgdG8gd3JpdGUuIFRoZSBsYXJnZSBhbW91bnQgb2YgbWFuCiAgcGFnZXMgZm9yIGxpYmN1cmwgbm93IHByZXNlbnQgbWFkZSBtZSBkZWNpZGUgdG8gcHV0IHRoZW0gaW4gYSBuZXcgc2VwYXJhdGUKICBzdWJkaXJlY3RvcnkgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBOYW1lZCBsaWJjdXJsLgoKLSBHaXVzZXBwZSBDb3JiZWxsaSBwcm92aWRlZCBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBFUE0gcGFja2FnZSBtYW5hZ2VyLCBpdAogIGdldHMgZ2VuZXJhdGVkIG5pY2VseSBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cuCgpWZXJzaW9uIDcuOS41LXByZTUKCkRhbmllbCAoMSBNYXJjaCAyMDAyKQotIE1vdmVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCBpbnRvIHRoZSB0ZXN0cy8gZGlyIGFuZCBhZGRlZCBpdCB0byB0aGUKICByZWxlYXNlIGFyY2hpdmVzLiBJdCB3YXMgcHJldmlvdXNseSBvbmx5IHByZXNlbnQgaW4gdGhlIENWUyB0cmVlLgoKLSBNb2RpZmllZCB0aGUgRmVicnVhcnkgMTd0aCBIb3N0OiBmaXgsIGFzIGJ1ZyByZXBvcnQgIzUyMzcxOCBwb2ludGVkIG91dCB0aGF0CiAgaXQgY2F1c2VkIGNyYXNoZXMhCgotIE5pY28gQmFnZ3VzIGFkZGVkIG1vcmUgZXJyb3IgY29kZXMgdG8gdGhlIFZNUyBzdHVmZi4KCi0gV2VzbGV5IExheHRvbiBicm91Z2h0IHRoZSBjb2RlIHRoYXQgaW50cm9kdWNlZCB0aGUgbmV3IENVUkxPUFRfUFJFUVVPVEUKICBvcHRpb24uIEl0IGlzIGp1c3QgYW5vdGhlciBGVFAgcXVvdGUgb3B0aW9uIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKICBhIGxpc3Qgb2YgRlRQIGNvbW1hbmRzIHRvIGlzc3VlICpqdXN0IGJlZm9yZSogdGhlIHRyYW5zZmVyIGNvbW1hbmQgKFJFVFIgb3IKICBTVE9SIGV0YykuIEl0IGhhcyB0dXJuZWQgdXAgYSBmZXcgc3lzdGVtcyB0aGF0IHJlYWxseSBuZWVkIHRoaXMuCgogIFRoZSBjdXJsIGNvbW1hbmQgbGluZSB0b29sIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgYnkgcHJlZml4aW5nIHRoZQogIHF1b3RlIGNvbW1hbmRzIHdpdGggYSBwbHVzICgrKSBpbiBzaW1pbGFyIHN0eWxlIHRoYXQgcG9zdCB0cmFuc2ZlciBxdW90ZQogIGNvbW1hbmRzIGFyZSBzcGVjaWZpZWQuCgogIFRoaXMgaXMgbm90IHlldCBkb2N1bWVudGVkLiBUaGVyZSBpcyBubyB0ZXN0IGNhc2UgZm9yIHRoaXMgeWV0LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDAyKQotIFJhbHBoIE1pdGNoZWxsIG1hZGUgc29tZSBzZXJpb3VzIGVmZm9ydHMgYW5kIHB1dCBhIGxvdCBvZiBzd2VhdCBpbiBzZXR0aW5nCiAgdXAgc2NyaXB0cyBhbmQgdGhpbmdzIGZvciBtZSB0byBiZSBhYmxlIHRvIHJlcGVhdCBoaXMgcHJvYmxlbXMsIGFuZCBJCiAgZmluYWxseSBjb3VsZC4gIEkgZm91bmQgYSBwcm9ibGVtIHdpdGggdGhlIGhlYWRlciBieXRlIGNvdW50ZXIgdGhhdCB3YXNuJ3QKICBpbmNyZWFzZWQgcHJvcGVybHkgYW5kIHRodXMgd2UgY291bGQgcmV0dXJuIENVUkxFX0dPVF9OT1RISU5HIHdoZW4gd2UgaW4KICBmYWN0IGhhZCByZWNlaXZlZCBkYXRhLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDAyKQotIEkgaGFkIHRvIHJldmVydCB0aGUgbm9uLXNwYWNlIHBhcnNpbmcgY29va2llIGZpeCBJIHBvc3RlZCB0byB0aGUgbWFpbGluZwogIGxpc3QuIEV4cGlyZSBkYXRlcyBkbyBoYXZlIHNwYWNlcyBhbmQgc3RpbGwgbmVlZCB0byBnZXQgcGFyc2VkIHByb3Blcmx5IQogIEluc3RlYWQgd2UganVzdCBpZ25vcmUgdHJhaWxpbmcgd2hpdGUgc3BhY2UgYW5kIGl0IHNlZW1zIHRvIHdvcmsuLi4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwMikKLSBNYWRlIHRoZSBjb29raWUgcHJvcGVydHkgJ01heC1BZ2UnIHdvcmssIGp1c3Qgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0bwogIHN1cHBvcnQgaXQsIGl0IGlzIGJldHRlciB0byBkbyBpdCByaWdodC4gTm8gb25lIHVzZXMgdGhpcyBhbnl3YXkuCgotIFRoZSBjb29raWUgcGFyc2VyIGNvdWxkIGNyYXNoIGlmIGEgcmVhbGx5IHdlaXJkIChpbGxlZ2FsKSBjb29raWUgbGluZSB3YXMKICByZWNlaXZlZC4gSSBhbHNvIG1hZGUgaXQgYmV0dGVyIGRpc2NhcmQgcmVhbGx5IG9kZGx5IGZvcm1hdHRlZCBsaW5lcyBiZXR0ZXIuCgogIE1hZGUgdGhlIGNvb2tpZSBqYXIgc3RvcmUgdGhlIHNlY29uZCBmaWVsZCBmcm9tIHRoZSBsZWZ0IHVzaW5nIHRoZSBzeW50YXgKICB0aGF0IE5ldHNjYXBlIGFuZCBNb3ppbGxhIHByb2JhYmx5IGxpa2UuIEN1cmwgaXRzZWxmIGlnbm9yZXMgaXQuCgogIEFkZGVkIHRlc3QgY2FzZSAzMSBmb3IgdGhlc2UgY2FzZXMuCgogIENsYXkgTG92ZWxlc3MnIGVtYWlsIHJlZ2FyZGluZyBzb21lIGNvb2tpZSBpc3N1ZXMgc3RhcnRlZCBteSBjbGVhbnVwLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRoYXQgbXkgYXV0b21ha2UgZmlkZGxlcyBicm9rZSB0aGUgYWJpbGl0eSB0byBidWlsZAogIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlIGFuZCBJIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBicmluZ3MKICB0aGlzIGFiaWxpdHkgYmFjay4KClZlcnNpb24gNy45LjUtcHJlNAoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDAyKQotIEZpZGRsZWQgd2l0aCB0aGUgYXV0b21ha2UgZmlsZXMgdG8gbWFrZSBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBsaWIKICBkaXJlY3Rvcnkgbm90IGhhdmUgLi4vc3JjIGluIHRoZSBpbmNsdWRlIHBhdGgsIGFuZCB0aGUgc3JjIHNvdXJjZXMgc2hvdWxkbid0CiAgaGF2ZSAuLi9saWIhCgotIEFsbCA3OSB0ZXN0IGNhc2VzIHJhbiBPSyB1bmRlciBMaW51eCBhbmQgU29sYXJpcyB1c2luZyB0aGUgbmV3IEhUVFAgc2VydmVyCiAgaW4gdGhlIHRlc3Qgc3VpdGUuIFRoZSBuZXcgSFRUUCBzZXJ2ZXIgd2FzIGZpcnN0IGRvbmF0ZWQgYnkgR2VvcmcgSG9ybiBhbmQKICBzdWJzZXF1ZW50bHkgbW9kaWZpZWQgdG8gd29yayB3aXRoIHRoZSB0ZXN0IHN1aXRlLiBJdCBpcyBjdXJyZW50bHkgc3RpbGwgbm90CiAgcG9ydGFibGUgZW5vdWdoIHRvIHJ1biBvbiAiYWxsIG92ZXIiIGJ1dCB0aGlzIGlzIGEgc3RhcnQgYW5kIEkgY2FuIHJ1biBhbGwKICBjdXJsIHRlc3RzIG9uIG15IG1hY2hpbmVzLiBUaGlzIGlzIGFuIGltcG9ydGFudCByZXF1aXJlbWVudCBmb3IgdGhlIHVwY29taW5nCiAgcHVibGljIHJlbGVhc2UuCgotIFVzaW5nIC1kIGFuZCAtSSBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgbm93IHJlcG9ydHMgYW4gZXJyb3IsIGFzIGl0IGltcGxpZXMKICB0d28gZGlmZmVyZW50IEhUVFAgcmVxdWVzdHMgdGhhdCBjYW4ndCBiZSBtaXhlZC4KCi0gSmVmZnJleSBQb2hsbWV5ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIC13Ly0td3JpdGUtb3V0IG9wdGlvbgogIHN1cHBvcnQgJXtjb250ZW50X3R5cGV9IHRvIGdldCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSByZWNlbnQgZG93bmxvYWQuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBwcmUyIGFuZCBwcmUzIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIGN5Z3dpbiwKICBhbmQgdGhpcyB3YXMgYmVjYXVzZSBJIHVzZWQgI2lmZGVmIEhBVkVfV0lOU09DS19IIGluIGxpYi9tdWx0aS5oIHRvIGZpZ3VyZQogIG91dCBpZiB3ZSBjb3VsZCBpbmNsdWRlIHdpbnNvY2suaCB3aGljaCB0dXJucyBvdXQgbm90IHRvIGJlIGEgd2lzZSBjaG9pY2UgdG8KICBkbyBvbiBjeWd3aW4gc2luY2UgaXQgaGFzIHRoZSBmaWxlIGJ1dCBjYW4ndCBpbmNsdWRlIGl0IQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAyKQotIEFkZGVkIHNyYy9jb25maWctdm1zLmggdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCi0gRml4ZWQgdGhlIGNvbm5lY3Rpb24gdGltZW91dCB2YWx1ZSBhZ2FpbiwgdGhlIGNoYW5nZSBmcm9tIEZlYnJ1YXJ5IDE4IHdhc24ndAogIGNvbXBsZXRlLgoKVmVyc2lvbiA3LjkuNS1wcmUzCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBhbmQgQW5kculzIEdhcmPtYSBib3RoIGZvdW5kIG91dCB0aGF0IGxpYi9jb25maWcuaC5pbiB3YXMgbWlzc2luZwogIGluIHRoZSBwcmUtcmVsZWFzZSBhcmNoaXZlIGFuZCB0aHVzIHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZC4KClZlcnNpb24gNy45LjUtcHJlMgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAyKQotIEFuZHLpcyBHYXJj7WEgcHJvdmlkZWQgYSBzb2x1dGlvbiB0byBidWcgcmVwb3J0ICM1MTUyMjguIHRoZSB0b3RhbCB0aW1lCiAgY291bnRlciB3YXMgbm90IHNldCBjb3JyZWN0bHkgd2hlbiAtSSB3YXMgdXNlZCBkdXJpbmcgc29tZSBjb25kaXRpb25zIChhbGwKICBoZWFkZXJzIHdlcmUgcmVhZCBpbiBvbmUgc2luZ2xlIHJlYWQpLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBhIGh1Z2UgcGF0Y2ggd2l0aCBtaW5vciB0d2Vha3MgYWxsIG92ZXIgdG8gbWFrZSBjdXJsCiAgY29tcGlsZSBuaWNlbHkgb24gVk1TLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDAyKQotIFJpY2sgUmljaGFyZHNvbiBmb3VuZCBvdXQgdGhhdCBieSByZXBsYWNpbmcgUEZfVU5TUEVDIHdpdGggUEZfSU5FVCBpbiB0aGUKICBnZXRhZGRyaW5mbygpIGNhbGxzLCBoZSBjb3VsZCBzcGVlZCB1cCBzb21lIG5hbWUgcmVzb2x2aW5nIGNhbGxzIHdpdGggYW4KICBvcmRlciBvZiBtYWduaXR1ZGVzIG9uIGhpcyBSZWRoYXQgTGludXggNy4yLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgc2Vjb25kIElOQUREUl9OT05FIHByb2JsZW0gd2hlcmUgd2UgdXNlZCBsb25nCiAgaW50ZWFkIG9mIGluX2FkZHJfdCB3aGljaCBjYXVzZWQgNjRiaXQgcHJvYmxlbW9zLiBXZSByZWFsbHkgc2hvdWxkbid0IGRlZmluZQogIHRoYXQgb24gdHdvIGRpZmZlcmVudCBwbGFjZXMuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIHByb2JsZW0gaW4gaG93IEhUVFAgcmVxdWVzdHMgd2VyZSBzZW50IGlmIHRoZQogIHJlcXVlc3QgY291bGRuJ3QgYmUgc2VudCBhbGwgYXQgb25jZS4KCi0gRW1pbCBmb3VuZCBhbmQgY29ycmVjdGVkIGEgYmFkIGNvbm5lY3Rpb24gdGltZW91dCBjb21wYXJpc29uIHRoYXQgbWFkZSBjdXJsCiAgdXNlIHRoZSBsb25nZXN0IG9mIGNvbm5lY3QtdGltZW91dCBhbmQgdGltb3V0IGFzIGEgdGltZW91dCB2YWx1ZSwgaW5zdGVhZCBvZgogIHRoZSBzaG9ydGVzdCBhcyBpdCB3YXMgc3VwcG9zZWQgdG8hCgotIEFyb24gUm9iZXJ0cyBwcm92aWRlZCB1cGRhdGVkIGluZm9ybWF0aW9uIGFib3V0IExEQVAgVVJMIHN5bnRheCB0byBnbyBpbnRvCiAgdGhlIG1hbnVhbCBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgb2xkIHJlZmVyZW5jZXMuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDIpCi0gUGhpbGlwIEdsYWRzdG9uZSBwb2ludGVkIG91dCB0d28gbWlzc2luZyBpbmNsdWRlIGZpbGVzIHRoYXQgbWFkZSBjdXJsIGNvcmUKICBkdW1wIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMuIFdlIG5lZWQgdG8gcGF5IG1vcmUgYXR0ZW50aW9uIG9uIHRoZXNlIGRldGFpbHMuCiAgSXQgaXMgKmxldGhhbCogdG8gZm9yIGV4YW1wbGUgZm9yZ2V0IHRoZSBtYWxsb2MoKSBwcm90b3R5cGUsIGFzICdpbnQnIGlzCiAgMzJiaXQgYW5kIG1hbGxvYygpIG11c3QgcmV0dXJuIGEgNjRiaXQgcG9pbnRlciBvbiB0aGVzZSBwbGF0Zm9ybXMuCgotIEdpYXNsYXMgR2Vvcmdpb3MgZml4ZWQgYSBwcm9ibGVtIHdpdGggSG9zdDogaGVhZGVycyBvbiByZXBlYXRlZCByZXF1ZXN0cyBvbgogIHRoZSBzYW1lIGhhbmRsZSB1c2luZyBhIHByb3h5LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDIpCi0gSGFubm8gTC4gS3Jhbnpob2ZmIGFjY3VyYXRlbHkgZm91bmQgb3V0IHRoYXQgZGlzYWJsaW5nIHRoZSBFeHBlY3Q6IGhlYWRlcgogIHdoZW4gZG9pbmcgbXVsdGlwYXJ0IGZvcm1wb3N0cyBkaWRuJ3Qgd29yayB2ZXJ5IHdlbGwuIEl0IGRpc2FibGVkIG90aGVyCiAgcGFydHMgb2YgdGhlIHJlcXVlc3QgaGVhZGVyIHRvbywgcmVzdWx0aW5nIGluIGEgYnJva2VuIGhlYWRlci4gV2hlbiBJIGZpeGVkCiAgdGhpcywgSSBhbHNvIG5vdGljZWQgdGhhdCB0aGUgQ29udGVudC1UeXBlIHdhc24ndCBwb3NzaWJsZSB0byBkaXNhYmxlLiBJdCBpcwogIG5vdywgZXZlbiB0aG91Z2ggaXQgcHJvYmFibHkgaXMgcmVhbGx5IHN0dXBpZCB0byB0cnkgdG8gZG8gdGhpcyAoYmVjYXVzZSBvZgogIHRoZSBib3VuZGFyeSBzdHJpbmcgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVyLAogIHVzZWQgYXMgZm9ybSBwYXJ0IHNlcGFyYXRvci4pCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMikKLSBJIG1vdmVkIHRoZSBjb25maWcqLmggZmlsZXMgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gdGhlIGxpYi8gZGlyZWN0b3J5LgoKLSBJJ3ZlIGFkZGVkIHRoZSBuZXcgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciB0byB0aGUgQ1ZTIHJlcG9zaXRvcnksIEl0IHNlZW1zIHRvCiAgd29yayBwcmV0dHkgZ29vZCBub3csIGJ1dCB3ZSBtdXN0IG1ha2UgaXQgZ2V0IHVzZWQgYnkgdGhlIHRlc3Qgc2NyaXB0cwogIHByb3Blcmx5IGFuZCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY29tcGlsZXMsIGJ1aWxkcyBhbmQgcnVucyBvbgogIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuCgpWZXJzaW9uIDcuOS41LXByZTEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDAyKQotIE1pa2xvcyBOZW1ldGggcHJvdmlkZWQgdXBkYXRlZCB3aW5kb3dzIG1ha2VmaWxlcyBhbmQgSU5TVEFMTCBkb2NzLgoKLSBNciBMYXJyeSBGYWhub2UgZm91bmQgYSBwcm9ibGVtIHdpdGggZm9ybXBvc3RzIGFuZCBJIG1hbmFnZWQgdG8gdHJhY2sgZG93bgogIGFuZCBwYXRjaCB0aGlzIGJ1Zy4gVGhpcyB3YXMgYWN0dWFsbHkgdHdvIGJ1Z3MsIGFzIHRoZSBwb3N0ZWQgc2l6ZSB3YXMgYWxzbwogIHNhaWQgdG8gYmUgdHdvIGJ5dGVzIHRvbyBsYXJnZS4KCi0gQnJlbnQgQmVhcmRzbGV5IGZvdW5kIG91dCBhbmQgYnJvdWdodCBhIGNvcnJlY3Rpb24gZm9yIHRoZQogIENVUkxJTkZPX0NPTlRFTlRfVFlQRSBwYXJzZXIgdGhhdCB3YXMgb2ZmIG9uZSBieXRlLiBUaGlzIHdhcyBteSBmYXVsdCwgSQogIGFjY2lkZW50YWx5IGJyb2tlIEdpYXNsYXMgR2Vvcmdpb3MnIHBhdGNoLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCBmb3VuZCB5ZXQgYW5vdGhlciBTU0wgZG93bmxvYWQgcHJvYmxlbS4KClZlcnNpb24gNy45LjQKCi0gbm8gY2hhbmdlcyBzaW5jZSBwcmUtcmVsZWFzZQoKVmVyc2lvbiA3LjkuNC1wcmUyCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMikKLSBFcmljIE1lbHZpbGxlIHByb3ZpZGVkIGEgZmV3IHNwZWxsaW5nIGNvcnJlY3Rpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgxIEZlYnJ1YXJ5IDIwMDIpCi0gQW5kcmVhcyBEYW1tIGNvcnJlY3RlZCB0aGUgdW5jb25kaXRpb25hbCB1c2Ugb2YgZ210aW1lKCkgaW4gZ2V0ZGF0ZSwgaXQgbm93CiAgdXNlcyBnbXRpbWVfcigpIG9uIGFsbCBob3N0cyB0aGF0IGhhdmUgaXQuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMikKLSBBbiBhbm9ueW1vdXMgYnVnIHJlcG9ydCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB0aGUgRE5TIGNhY2hpbmcgd2hpY2ggbWFkZSBpdAogIHNvbWV0aW1lcyBhbGxvY2F0ZSBvbmUgYnl0ZSB0b28gbGl0dGxlIHRvIHN0b3JlIHRoZSBjYWNoZSBlbnRyeSBpbi4gVGhpcwogIGhhcHBlbmVkIHdoZW4gdGhlIHBvcnQgbnVtYmVyIHN0YXJ0ZWQgd2l0aCAxIQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW1wcm92ZXMgdGhlIGdldGhvc3RieW5hbWVfcigpIGNvbmZpZ3VyZQogIGNoZWNrIG9uIEhQLVVYIDExLjAwLgoKVmVyc2lvbiA3LjkuNC1wcmUxCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMikKLSBHZW9yZyBIb3JuIGZvdW5kIGFub3RoZXIgd2F5IHRoZSBTU0wgcmVhZGluZyBmYWlsZWQgZHVlIHRvIHRoZSBub24tYmxvY2tpbmcKICBzdGF0ZSBvZiB0aGUgc29ja2V0cyEgSSBmaXhlZC4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAyKQotIE11bHRpcGFydCBmb3JtcG9zdHMgbm93IHNlbmQgdGhlIGZ1bGwgcmVxdWVzdCBwcm9wZXJseSwgaW5jbHVkaW5nIHRoZSBDUkxGLgogIFRoZXkgd2VyZSBwcmV2aW91c2x5IHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgcG9zdCBkYXRhLgoKLSBUaGUgdXBsb2FkIGJ5dGUgY291bnRlciBidWdnZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZWVkIFNTTCBvbiBldmVyeSBjb25uZWN0LCB3aGljaCBpcyBhIHRpbWUtCiAgY29uc3VtaW5nIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIG5lZWRlZCB0byBkbyBvbmNlLiBXZSBwYXRjaGVkCiAgbGliY3VybCB0byBub3cgb25seSBzZWVkIG9uIHRoZSBmaXJzdCBjb25uZWN0IHdoZW4gdW5zZWVkZWQuIFRoZSBzZWVkZWQKICBzdGF0dXMgaXMgZ2xvYmFsIHNvIGl0J2xsIG5vdyBvbmx5IGhhcHBlbiBvbmNlIGR1cmluZyBhIHByb2dyYW0ncyBsaWZlIHRpbWUuCgogIElmIHRoZSByYW5kb21fZmlsZSBvciBlZ2Rzb2NrZXQgaXMgc2V0LCB0aGUgc2VlZCB3aWxsIGJlIHJlLW1hZGUgdGhvdWdoLgoKLSBHaWFzbGFzIEdlb3JnaW9zIGludHJvZHVjZWQgQ1VSTElORk9fQ09OVEVOVF9UWVBFIHRoYXQgbGV0cwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgcmVhZCB0aGUgY29udGVudC10eXBlIGZyb20gdGhlIHByZXZpb3VzIHJlcXVlc3QuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwMikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSB3YXkgdG8gY3Jhc2ggY3VybCBhbmQgYWZ0ZXIgbXVjaCBkZWJ1Z2dpbmcsIGl0CiAgdHVybmVkIG91dCBpdCB3YXMgYSBJUHY0LWxpbnV4IG9ubHkgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDcuOS4zIHJlbGF0ZWQgdG8KICBuYW1lIHJlc29sdmluZy4KCi0gQW5kcmVhcyBEYW1tIHBvc3RlZCBhIGh1Z2UgcGF0Y2ggdGhhdCBtYWRlIHRoZSBjdXJsX2dldGRhdGUoKSBmdW5jdGlvbiBmdWxseQogIHJlZW50cmFudCEKCi0gU3RldmUgTWFyeCBwb2ludGVkIG91dCB0aGF0IHlvdSBjb3VsZG4ndCBtaXggQ1VSTE9QVF9DVVNUT01SRVFVRVNUIHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMuIFlvdSBjYW4gbm93IQoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDIpCi0gS3Jpc2huZW5kdSBNYWp1bWRhciBwb2ludGVkIG91dCB0aGF0IHRoZSBoZWFkZXIgbGVuZ3RoIGNvdW50ZXIgd2FzIG5vdCByZXNldAogIGJldHdlZW4gbXVsdGlwbGUgcmVxdWVzdHMgb24gdGhlIHNhbWUgaGFuZGxlLgoKLSBQZWRybyBOZXZlcyByaWdodGZ1bGx5IHF1ZXN0aW9uZWQgd2h5IGN1cmwgYWx3YXlzIGFwcGVuZCBcclxuIHRvIHRoZSBkYXRhCiAgdGhhdCBpcyBzZW50IGluIEhUVFAgUE9TVCByZXF1ZXN0cy4gVW5mb3J0dW5hdGVseSwgdGhpcyBicm9rZSB0aGUgdGVzdCBzdWl0ZQogIGFzIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGlzIGxhbWUgZW5vdWdoIG5vdCB0byBkZWFsIHdpdGggdGhpcy4uLiA6LU8KCi0gRm9sbG93aW5nIExvY2F0aW9uOiBoZWFkZXJzIHdoZW4gdGhlIGNvbm5lY3Rpb24gZGlkbid0IGNsb3NlIGRpZG4ndCB3b3JrIGFzCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc3RvcCByZWFkaW5nLiBUaGlzIHByb2JsZW0gd2FzIGFkZGVkIGluIDcuOS4zIGR1ZSB0bwogIHRoZSByZXN0cnVjdHVyZWQgaW50ZXJuYWxzLiAnRnJhbmsnIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdGhpcy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAyKQotIEtldmluIFJvdGggdmVyeSBxdWlja2x5IHNwb3R0ZWQgdGhhdCB3ZSB3cm9uZ2x5IGluc3RhbGxlZCB0aGUgZXhhbXBsZQogIHByb2dyYW1zIHRoYXQgd2VyZSBidWlsdCBpbiB0aGUgbXVsdGkgZGlyZWN0b3J5LCB3aGVuICdtYWtlIGluc3RhbGwnIHdhcwogIHVzZWQuIDotLwoKVmVyc2lvbiA3LjkuMwoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDIpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIHBlcnNpc3RhbmN5IHByb2JsZW0gd2hlbiBkb2luZyBIVFRQIEhFQUQsIHRoYXQgbWFkZQogIGN1cmwgImhhbmciIHVudGlsIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBwcm9ibGVtIGhhcwogIGJlZW4gaW50cm9kdWNlZCBpbiA3LjkuMyBkdWUgdG8gaW50ZXJuYWwgcmV3cml0ZXMsIHRoaXMgd2FzIG5vdCBwcmVzZW50IGluCiAgNy45LjIuCgpWZXJzaW9uIDcuOS4zLXByZTQKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAyKQotIEFudG9uaW8gZmlsZWQgYnVnIHJlcG9ydCAjNTA1NTE0IGFuZCBwcm92aWRlZCBhIGZpeCEgV2hlbiBkb2luZyBtdWx0aXBhcnQKICBmb3JtcG9zdHMsIGxpYmN1cmwgd291bGQgaW5jbHVkZSBhbiBlcnJvciB0ZXh0IGluIHRoZSBhY3R1YWwgcG9zdCBpZiBhCiAgc3BlY2lmaWVkIGZpbGUgd2Fzbid0IGZvdW5kLiBUaGlzIGlzIG5vdCBsaWJjdXJsJ3Mgam9iLiBJbnN0ZWFkIHdlIGFkZCBhbgogIGVtcHR5IHBhcnQuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwMikKLSBQbGF5ZWQgYXJvdW5kIHdpdGggc3RyaWN0ZXIgY29tcGlsZXIgd2FybmluZ3MgZm9yIGdjYyAod2hlbiAuL2NvbmZpZ3VyZQogIC0tZW5hYmxlLWRlYnVnIGlzIHVzZWQpIGFuZCBjaGFuZ2VkIHNvbWUgbWlub3IgdGhpbmdzIHRvIHN0b3AgdGhlIHdhcm5pbmdzLgoKLSBDb21tZW50ZWQgb3V0IHRoZSAnbG9uZyBsb25nJyBhbmQgJ2xvbmcgZG91YmxlJyBjaGVja3MgaW4gY29uZmlndXJlLmluLCBhcwogIHdlIGRvbid0IGN1cnJlbnRseSB1c2UgdGhlbSBhbnl3YXkgYW5kIHRoZSBjb2RlIGluIGxpYi9tcHJpbnRmLmMgdGhhdCB1c2UKICB0aGVtIGNhdXNlcyB3YXJuaW5ncy4KCi0gU2F1bCBHb29kIGFuZCBqb25hdGFuIHBvaW50ZWQgb3V0IE1hYyBPUyBYIGJ1aWxkIHByb2JsZW1zIHdpdGggcHJlMyBhbmQgaG93CiAgdG8gY29ycmVjdCB0aGVtLiBUd28gY29tcGlsZXIgd2FybmluZ3Mgd2VyZSByZW1vdmVkIGFzIHdlbGwuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdHdvIG1pbm9yIG1pbmd3MzIgYnVpbGRpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDcuOS4zLXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAyKQotIGRvY3MvbGliY3VybC10aGUtZ3VpZGUgaXMgYSBuZXcgdHV0b3JpYWwgZm9yIG91ciBsaWJjdXJsIHByb2dyYW1taW5nCiAgZnJpZW5kcy4KCi0gUmljaGFyZCBBcmNoZXIgYnJvdWdodCBiYWNrIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHdpdGggT3BlblNTTAogIHZlcnNpb25zIGJlZm9yZSAwLjkuNS4KICBbaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTEwMDk3NiZhaWQ9NTA0MTYzJmdyb3VwX2lkPTk3Nl0KCi0gVGhlIEROUyBjYWNoZSBjb2RlIGRpZG4ndCB0YWtlIHRoZSBwb3J0IG51bWJlciBpbnRvIGFjY291bnQsIHdoaWNoIG1hZGUgaXQKICB3b3JrIHJhdGhlciBiYWQgb24gSVB2Ni1lbmFibGVkIGhvc3RzIChlc3BlY2lhbGx5IHdoZW4gZG9pbmcgcGFzc2l2ZQogIEZUUCkuIFN0ZXJsaW5nIGZpeGVkIGl0LgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gR2VvcmcgSG9ybiBjb3VsZCBtYWtlIGEgdHJhbnNmZXIgdGltZS1vdXQgd2l0aG91dCBlcnJvciB0ZXh0LiBJIGZvdW5kIGl0IGFuZAogIGNvcnJlY3RlZCBpdC4KCi0gU1NMIHdyaXRlcyBkaWRuJ3Qgd29yaywgdGhleSByZXR1cm4gYW4gdW5pbml0aWFsaXplZCB2YWx1ZSB0aGF0IGNhdXNlZAogIGhhdm9jIGFsbCBvdmVyLiBHZW9yZyBIb3JuIGV4cGVyaWVuY2VkIHRoaXMuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3VybF92ZXJzaW9uKCkgZnVuY3Rpb24gdG8gdXNlIHRoZSBwcm9wZXIgT3BlblNTTAogIGZ1bmN0aW9uIGZvciB2ZXJzaW9uIGluZm9ybWF0aW9uLiBUaGlzIHdheSwgY3VybCB3aWxsIHJlcG9ydCB0aGUgdmVyc2lvbiBvZgogIHRoZSBTU0wgbGlicmFyeSBhY3R1YWxseSBydW5uaW5nIHJpZ2h0IG5vdywgbm90IHRoZSBvbmUgdGhhdCBoYWQgaXRzIGhlYWRlcnMKICBpbnN0YWxsZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdC4gTWFpbmx5IGludGVyc3Rpbmcgd2hlbiBydW5uaW5nIHdpdGggc2hhcmVkCiAgT3BlblNTTCBsaWJyYXJpZXMuICAKClZlcnNpb24gNy45LjMtcHJlMgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDIpCi0gTW9maWVkIHRoZSBtYWluIHRyYW5zZmVyIGxvb3AgYW5kIHJlbGF0ZWQgc3R1ZmYgdG8gZGVhbCB3aXRoIG5vbi1ibG9ja2luZwogIHNvY2tldHMgaW4gdGhlIHVwbG9hZCBzZWN0aW9uLiBXaGlsZSBkb2luZyB0aGlzLCBJJ3ZlIG5vdyBzZXBhcmF0ZWQgdGhlCiAgY29ubmVjdGlvbiBvcmllbnRlZCBidWZmZXJzIHRvIGhhdmUgb25lIGZvciBkb3dubG9hZHMgYW5kIG9uZSBmb3IgdXBsb2FkcwogIChhcyB0d28gY2FuIGhhcHBlbiBzaW11bHRhbmVvdXNseSkuIEkgYWxzbyBzaHJ1bmsgdGhlIGJ1ZmZlcnMgdG8gMjBLCiAgZWFjaC4gQXMgd2UgaGF2ZSBhIHNjcmF0Y2ggYnVmZmVyIHR3aWNlIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYnVmZmVyLCB3ZQogIGFycml2ZWQgYXQgODBLIGZvciBidWZmZXJzIGNvbXBhcmVkIHdpdGggdGhlIHByZXZpb3VzIDE1MEsuCgotIEFkZGVkIHRoZSAtLWNjIG9wdGlvbiB0byBjdXJsLWNvbmZpZyBjb21tYW5kIGFzIGl0IGVuYWJsZXMgc28gdmVyeSBjb29sCiAgb25lLWxpbmVycy4gSGF2ZSBhIGdvIGEgdGhpcyBvbmUsIGJ1aWxkaW5nIHRoZSBzaW1wbGUuYyBleGFtcGxlOgoKICAgICAgICAkIGBjdXJsLWNvbmZpZyAtLWNjIC0tY2ZsYWdzIC0tbGlic2AgLW8gZXhhbXBsZSBzaW1wbGUuYwoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDIpCi0gSSBtYWRlIGFsbCBzb2NrZXQgcmVhZHMgKHJlY3YpIGhhbmRsZSBFV09VTERCTE9DSy4gSSBob3BlIG5pY2VseS4gTm93IHdlCiAgb25seSBuZWVkIHRvIGFkZHJlc3MgYWxsIHdyaXRlcyAoc2VuZCkgdG9vIGFuZCB0aGVuIEknbSByZWFkeSBmb3IgYW5vdGhlcgogIHByZS1yZWxlYXNlLi4uCgotIFN0b25lZCBFbGlwb3QgcGF0Y2hlZCB0aGUgaW5fYWRkcl90IGNvbmZpZ3VyZSB0ZXN0IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIgb24KICBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoOSBKYW51YXJ5IDIwMDIpCi0gQ3JpcyBCYWlsaWZmIGZvdW5kIG91dCB0aGF0IGZpbGxpbmcgdXAgY3VybCdzIFNTTCBzZXNzaW9uIGNhY2hlIGNhdXNlZCBhCiAgY3Jhc2ghCgotIFBvc3RlZCB0aGUgY3VybCBxdWVzdGlvbm5haXJlIG9uIHRoZSB3ZWIgc2l0ZS4gSWYgeW91IGhhdmVuJ3QgcG9zdGVkIHlvdXIKICBvcGluaW9ucyB0aGVyZSB5ZXQsIGdvIHRoZXJlIGFuZCBkbyBpdCBub3cgd2hpbGUgaXQgaXMgc3RpbGwgdGhlcmU6CgogICAgICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvcS8KCi0gR2VvcmcgSG9ybiBxdWlja2x5IGZvdW5kIG91dCB0aGF0IHRoZSBTU0wgcmVhZGluZyBubyBsb25nZXIgd29ya2VkIGFzCiAgc3VwcG9zZWQgc2luY2UgdGhlIHN3aXRjaCB0byBub24tYmxvY2tpbmcgc29ja2V0cy4gSSd2ZSBtYWRlIGEgcXVpY2sgcGF0Y2gKICAoZm9yIHJlYWRpbmcgb25seSkgYnV0IHdlIHNob3VsZCBpbXByb3ZlIGl0IGV2ZW4gZnVydGhlci4KClZlcnNpb24gNy45LjMtcHJlMQoKRGFuaWVsICg3IEphbnVhcnkgMjAwMikKLSBJIG1hZGUgdGhlICdib29sJyB0eXBlZGVmIHVzZSBhbiAidW5zaWduZWQgY2hhciIuIEl0IG1ha2VzIGl0IHRoZSBzYW1lIG9uCiAgYWxsIHBsYXRmb3Jtcywgbm8gbWF0dGVyIHdoYXQgdGhlIHBsYXRmb3JtIHRoaW5rcyB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yCiAgY2hhciBpcy4gVGhpcyB3YXMgbm90aWNlZCBzaW5jZSB3ZSBtYWRlIGEgc2lsbHkgY29tcGFyaXNvbiBpbnZvbHZpbmcgc3VjaCBhCiAgYm9vbCB2YXJpYWJsZSwgYW5kIG9ubHkgb25lIGNvbXBpbGVyL3BsYXRmb3JtIGNvbWJpbmF0aW9uIChvbiBEZWJpYW4gTGludXgpCiAgY29tcGxhaW5lZCBhYm91dCBpdCAodGhhdCBoYXBwZW5lZCB0byBoYXZlIGl0cyBjaGFyIHVuc2lnbmVkIGJ5IGRlZmF1bHQpLgoKLSBCdWcgcmVwb3J0ICM0OTUyOTAgaWRlbnRpZmllZCBhIGNvb2tpZSBwYXJzaW5nIHByb2JsZW0gdGhhdCB3YXMgY29ycmVjdGVkLgogIFdoZW4gYSBTZXQtQ29va2llOiBsaW5lIGlzIHJlY2VpdmVkIHdpdGhvdXQgYSB0cmFpbGluZyBzZW1pY29sb24sIGxpYmN1cmwKICBkaWRuJ3QgcmVhZCB0aGUgbGFzdCAibmFtZT12YWx1ZSIgcGFpciBvZiB0aGUgbGluZSwgbGVhZGluZyB0byBjb25mdXNpb25zLi4uCgotIFN0ZXJsaW5nIGNvbW1pdHRlZCBoaXMgdXBkYXRlZCBETlMgY2FjaGUgY29kZS4KCi0gSSB3b3JrZWQgd2l0aCBHZW9yZyBIb3JuIGFuZCBjb21tZW50cyBmcm9tIEf2dHogQmFiaW4tRWJlbGwgYW5kIHN3aXRjaGVkCiAgY3VybCdzIHNvY2tldCBvcGVyYXRpb25zIGNvbXBsZXRlbHkgb3ZlciB0byBub24tYmxvY2tpbmcgZm9yIHRoZSBlbnRpcmUKICBvcGVyYXRpb24gKHByZXZpb3VzbHkgd2UgdXNlZCBub24tYmxvY2tpbmcgb25seSBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2UpLgogIFdlIGhhZCB0byBkbyB0aGlzIHRvIG1ha2UgdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlIHRpbWVvdXQgcHJvcGVybHkgd2l0aG91dAogIHRoZSB1c2Ugb2Ygc2lnbmFscy4gQSBsaXR0bGUgZXh0cmEgY29kZSB0byBkZWFsIHdpdGggdGhpcyB3YXMgYWRkZWQuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBzbGlnaHRseSBvYnNjdXJlIGNvb2tpZSBlbmdpbmUgZmxhdy4KCi0gUGV0ZSBTdSBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0IEhUVFAgY29kZSAyMDQgYXMgaXQgc2hvdWxkLgogIDIwNC1yZXBsaWVzIG5ldmVyIHByb3ZpZGVzIGEgcmVzcG9uc2UtYm9keS4gVGhpcyByZXN1bHRlZCBpbiBiYWQgcGVyc2lzdGFudAogIGJlaGF2aW9yIHdoZW4gMjA0IHdhcyByZWNlaXZlZC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDIpCi0gU00gdXBkYXRlZCB0aGUgVkMrKyBsaWJyYXJ5IE1ha2VmaWxlcyBmb3IgdGhlIG5ldyBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAyKQotIEkgZGlzY292ZXJlZCB0aGF0IHdlIHdyb25nbHkgdXNlZCBpbmV0X250b2EoKSAoaW5zdGVhZCBvZiBpbmV0X250b2FfcigpIGluCiAgdHdvIHBsYWNlcyBpbiB0aGUgc291cmNlIGNvZGUpLiBPbmUgaGFwcGVuZWQgd2l0aCBWRVJCT1NFIHNldCBvbiBjb25uZWN0cywKICBhbmQgdGhlIG90aGVyIHdoZW4gVkVSQk9TRSB3YXMgb24gYW5kIGtyYjQgb3ZlciBuYXQgd2FzIHVzZWQuLi4gSSBob25lc3RseQogIGRvbid0IHRoaW5rIGFueW9uZSBoYXMgc3VmZmVyZWQgZnJvbSB0aGVzZSBtaXN0YWtlcy4KCi0gSSByZXBsYWNlZCBhIGxvdCBvZiBzaWxseSBvY2N1cmFuY2VzIG9mIHByaW50ZigpIHRvIGluc3RlYWQgdXNlIHRoZSBtb3JlCiAgYXBwcm9wcmlhdGUgQ3VybF9pbmZvZigpIG9yIEN1cmxfZmFpbGYoKS4gVGhlIGtyYjQgYW5kIHRlbG5ldCBjb2RlIHdlcmUKICBhZmZlY3RlZC4KCi0gUGhpbGlwIEdsYWRzdG9uZSBmb3VuZCBhIGZldyBtb3JlIHByb2JsZW1zIHdpdGggNjQtYml0IGFyY2hzICh0aGUgNjQtYml0CiAgc3BhcmMgb24gc29sYXJpcyA4KS4KCi0gQWZ0ZXIgZGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIFJhb3VsIENyaWRsaWcsIEkganVzdCBtYWRlIEZUUAogIHJlc3BvbnNlIGxpbmVzIGdldCBwYXNzZWQgdG8gdGhlIGhlYWRlciBjYWxsYmFjayBpZiBzdWNoIGEgb25lIGlzCiAgcmVnaXN0ZXJlZC4gSXQnbGwgbWFrZSBpdCBwb3NzaWJsZSBmb3IgYW55IGFwcGxpY2F0aW9uIHRvIGdldCBhbGwgdGhlCiAgcmVzcG9uc2VzIGFuIEZUUCBzZXJ2ZXIgc2VuZHMgdG8gbGliY3VybC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDIpCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgYSBmZXcgYnVja2V0cyBvZiBjb2RlLiBOb3csIGxpYmN1cmwgd2lsbAogIGF1dG9tYXRpY2FsbHkgY2FjaGUgRE5TIGxvb2t1cHMgYW5kIHJlLXVzZSB0aGUgcHJldmlvdXMgcmVzdWx0cyBmaXJzdCBpZiBhbnkKICBzdWNoIGlzIGF2YWlsYWJsZS4gSXQgZ3JlYXRseSBpbXByb3ZlcyBzcGVlZCB3aGVuIGRvaW5nIG1hbnkgcmVwZWF0ZWQKICBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGhvc3QuCgotIEFzIHRoZSB0ZXN0IGNhc2UgdXNlcyAtLWluY2x1ZGUgYW5kIHRoZW4gLS1oZWFkLCBJIGhhZCB0byBtb2RpZnkgc3JjL21haW4uYwogIHRvIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgdGhhbiBwcmV2aW91c2x5LiBXaGVuIGRvbmUsIHdlCiAgaGF2ZSAxMDAlIGdvb2QgdGVzdHMgYWdhaW4gaW4gdGhlIG1haW4gYnJhbmNoLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwMikKLSBNYWRlIHRlc3QgY2FzZSAyNSBydW4gYWdhaW4gaW4gdGhlIG11bHRpLWRldiBicmFuY2guIEJ1dCBpdCBzZWVtcyB0aGF0IHRoZQogIGNoYW5nZXMgZG9uZSBvbiBkZWMtMjAgbWFkZSB0ZXN0IGNhc2UgMTA0IGNlYXNlIHRvIHdvcmsgKGluIGJvdGggYnJhbmNoZXMpLgoKLSBQaGlsaXAgR2xhZHN0b25lIHBvaW50ZWQgb3V0IGEgZmV3IHBvcnRhYmlsaXR5IHByb2JsZW1zIGluIHRoZSBzb3VyY2UgY29kZQogIHRoYXQgZGlkbid0IGNvbXBpbGUgb24gNjQtYml0IHNwYXJjcyB1c2luZyBTdW4ncyBuYXRpdmUgY29tcGlsZXIuCkRhbmllbCAoMjAgRGVjZW1iZXIgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBjYXVnaHQgYW4gdW5wbGVhc2VudCAoYnV0IGhhcmQtdG8tZmluZCkgYnVnIHRoYXQgY291bGQgY2F1c2UKICBsaWJjdXJsIHRvIGhhbmcgb24gdHJhbnNmZXJzIG92ZXIgcHJveHksIHdoZW4gdGhlIHByb3h5IHdhcyBzcGVjaWZpZWQgd2l0aAogIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIQoKLSBBZGRlZCBjb2RlIHRvIG1ha2UgZnRwIG9wZXJhdGlvbnMgdHJlYXQgdGhlIE5PX0JPRFkgYW5kIEhFQURFUlMgb3B0aW9ucwogIGJldHRlcjoKCiAgIE5PX0JPRFkgc2V0IFRSVUUgYW5kIEhFQURFUlMgc2V0IFRSVUU6CiAgICBSZXR1cm4gYSBzZXQgb2YgaGVhZGVycyB3aXRoIGZpbGUgaW5mbwoKICAgTk9fQk9EWSBzZXQgRkFMU0UKICAgIFRyYW5zZmVyIGRhdGEgYXMgdXN1YWwsIEhFQURFUlMgaXMgaWdub3JlZAoKICAgTk9fQk9EWSBzZXQgVFJVRSBhbmQgSEVBREVSUyBzZXQgRkFMU0UKICAgIERvbid0IHRyYW5zZmVyIGFueSBkYXRhLCBkb24ndCByZXR1cm4gYW55IGhlYWRlcnMuIEp1c3QgcGVyZm9ybSB0aGUgc2V0CiAgICBvZiBGVFAgY29tbWFuZHMuCgpEYW5pZWwgKDE3IERlY2VtYmVyIDIwMDEpCi0gR/Z0eiBCYWJpbi1FYmVsbCBkb3ZlIGludG8gdGhlIGRhcmsgZHVuZ2VvbnMgb2YgdGhlIE9wZW5TU0wgRU5HSU5FIHN0dWZmIGFuZAogIG1hZGUgbGliY3VybCBzdXBwb3J0IGl0ISBUaGlzIGFsbG93cyBsaWJjdXJsIHRvIGRvIFNTTCBjb25uZWN0aW9ucyB3aXRoIHRoZQogIHByaXZhdGUga2V5IHN0b3JlZCBpbiBleHRlcm5hbCBoYXJkd2FyZS4KCiAgVG8gbWFrZSB0aGlzIGdvb2QsIGhlIGhhZCB0byBhZGQgYSBidW5jaCBvZiBuZXcgbGlicmFyeSBvcHRpb25zIHRoYXQnbGwgYmUKICB1c2VmdWwgdG8gb3RoZXJzIGFzIHdlbGw6CgogICBDVVJMT1BUX1NTTENFUlRUWVBFICBzZXQgU1NMIGNlcnQgdHlwZSAoUEVNL0RFUikKICAgQ1VSTE9QVF9TU0xLRVkgICAgICAgc2V0IFNTTCBwcml2YXRlIGtleSAoZmlsZSkKICAgQ1VSTE9QVF9TU0xLRVlUWVBFOiAgc2V0IFNTTCBrZXkgdHlwZSAoUEVNL0RFUi9FTkcpCiAgIENVUkxPUFRfU1NMS0VZUEFTU1dEOiBzZXQgdGhlIHBhc3NwaHJhc2UgZm9yIHlvdXIgcHJpdmF0ZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1VSTE9QVF9TU0xDRVJUUEFTU1dEIGlzIGFuIGFsaWFzKQogICBDVVJMT1BUX1NTTEVOR0lORTogICBzZXQgdGhlIG5hbWUgb2YgdGhlIGNyeXB0byBlbmdpbmUKICAgICAgICAgICAgICAgICAgICAgICAgKHJldHVybnMgQ1VSTEVfU1NMX0VOR0lORV9OT1RGT1VORCBvbiBlcnJvcikKICAgQ1VSTE9QVF9TU0xFTkdJTkVfREVGQVVMVDogc2V0IHRoZSBkZWZhdWx0IGVuZ2luZQoKICBUaGVyZSBhcmUgdHdvIG5ldyBmYWlsdXJlIGNvZGVzOgoKICAgQ1VSTEVfU1NMX0VOR0lORV9OT1RGT1VORAogICBDVVJMRV9TU0xfRU5HSU5FX1NFVEZBSUxFRAoKRGFuaWVsICgxNCBEZWNlbWJlciAyMDAxKQotIFdlIGhhdmUgImJyYW5jaGVkIiB0aGUgc291cmNlLXRyZWUgYXQgYSBmZXcgcGxhY2VzLiBDaGVja291dCB0aGUgQ1ZTIHNvdXJjZXMKICB3aXRoIHRoZSAnbXVsdGktZGV2JyBsYWJlbCB0byBnZXQgdGhlIGxhdGVzdCBtdWx0aSBpbnRlcmZhY2UgZGV2ZWxvcG1lbnQKICB0cmVlLiBUaGUgaWRlYSBpcyB0byBvbmx5IGJyYW5jaCBhZmZlY3RlZCBmaWxlcyBhbmQgdG8gcmVzdHJpY3QgdGhlIGJyYW5jaAogIHRvIHRoZSB2OCBtdWx0aSBpbnRlcmZhY2UgZGV2ZWxvcG1lbnQgb25seS4KCiAgKk5PVEUqIHRoYXQgaWYgd2UgZ2V0IGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzIGV0Yywgd2UgbWlnaHQgbmVlZCB0byBhcHBseQogIHRoZW0gaW4gYm90aCBicmFuY2hlcyEKCiAgVGhlIG11bHRpLWRldiBicmFuY2ggaXMgd2hhdCB3ZSBhcmUgZ29ubmEgdXNlIGFzIG1haW4gYnJhbmNoIGluIHRoZSBmdXR1cmUKICBpZiBpdCB0dXJucyBvdXQgc3VjY2Vzc2Z1bC4gVGh1cywgd2UgbXVzdCBtYWludGFpbiBib3RoIG5vdyBpbiBjYXNlIHdlIG5lZWQKICB0aGVtLiBUaGUgY3VycmVudCBtYWluIGJyYW5jaCB3aWxsIGJlIHVzZWQgaWYgd2Ugd2FudCB0byByZWxlYXNlIGEgNy45LjMgb3IKICBwZXJoYXBzIGEgNy4xMCByZWxlYXNlIGJlZm9yZSB2ZXJzaW9uIDguIFdoaWNoIGlzIHZlcnkgbGlrZWx5LgoKLSBNYXJjdXMgV2Vic3RlciBwcm92aWRlZCBjb2RlIGZvciB0aGUgbmV3IENVUkxGT1JNX0NPTlRFTlRIRUFERVIgb3B0aW9uIGZvcgogIGN1cmxfZm9ybWFkZCgpLCB0aGF0IGxldHMgYW4gYXBwbGljYXRpb24gYWRkIGEgc2V0IG9mIGhlYWRlcnMgZm9yIHRoYXQKICBwYXJ0aWN1bGFyIHBhcnQgaW4gYSBtdWx0aXBhcnQvZm9ybS1wb3N0LiBIZSBhbHNvIHByb3ZpZGVkIGEgc2VjdGlvbiB0byB0aGUKICBtYW4gcGFnZSB0aGF0IGRlc2NyaWJlcyB0aGUgbmV3IG9wdGlvbi4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMSkKLSBCZW4gR3JlZWFyIG1hZGUgbWUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgQ3VybF9mYWlsZigpIHVzYWdlIGludGVybmFsbHkKICB3YXMgYSBiaXQgc2xvcHB5IHdpdGggYWRkaW5nIG5ld2xpbmVzIG9yIG5vdCB0byB0aGUgZXJyb3IgbWVzc2FnZXMuIExldCdzCiAgb25jZSBhbmQgZm9yIGFsbCBzYXkgdGhhdCB0aGV5IGRvIG5vdCBiZWxvbmcgdGhlcmUhCgotIFdoZW4gdXBsb2FkaW5nIGZpbGVzIHdpdGggLVQgdG8gZ2l2ZSBhIGxvY2FsIGZpbGUgbmFtZSwgYW5kIHlvdSBlbmQgdGhlIFVSTAogIHdpdGggYSBzbGFzaCB0byBoYXZlIHRoZSBsb2NhbCBmaWxlIG5hbWUgdXNlZCByZW1vdGUgdG9vLCB3ZSBub3cgbm8gbG9uZ2VyCiAgdXNlIHRoZSBsb2NhbCBkaXJlY3RvcnkgYXMgd2VsbC4gT25seSB0aGUgZmlsZSBwYXJ0IG9mIHRoZSAtVCBmaWxlIG5hbWUKICB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByaWdodCBvZiB0aGUgc2xhc2ggaW4gdGhlIFVSTC4KCkRhbmllbCAoNyBEZWNlbWJlciAyMDAxKQotIE1pY2hhbCBCb25pbm8gcG9pbnRlZCBvdXQgdGhhdCBEaWdpdGFsIFVuaXggZG9lc24ndCBoYXZlIGdtdGltZV9yIHNvIHRoZQogIGxpbmsgZmFpbGVkLiBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBhbmQgY29ycmVjdGVkIHNvdXJjZSBjb2RlLgoKVmVyc2lvbiA3LjkuMgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDEpCi0gSm9uIFRyYXZpcyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCBsaWJjdXJsIGFuZCBDVVJMT1BUX1VQTE9BRCBhbmQgdGhlbgogIG9uIHRoZSBzYW1lIGhhbmRsZSB1c2VkIENVUkxPUFRfSFRUUEdFVCBpdCB3b3VsZCBzdGlsbCBhdHRlbXB0IHRvIHVwbG9hZC4KICBIaXMgc3VnZ2VzdGVkIGZpeCB3YXMgcGVyZmVjdC4KCkRhbmllbCAoNCBEZWNlbWJlciAyMDAxKQotIEluY29ycG9yYXRlZCBtb3JlIG1hY29zIGZpeGVzIGFuZCBhZGRlZCBmb3VyIHNwZWNpZmljIGZpbGVzIGluIGEgbmV3CiAgc3ViZGlyZWN0b3J5IGJlbG93IHNyYy4KCkRhbmllbCAoMyBEZWNlbWJlciAyMDAxKQotIEVyaWMgTGF2aWduZSByZXBvcnRlZCB0d28gcHJvYmxlbXM6CgogIEZpcnN0IG9uZSBpbiB0aGUgY3VybF9zdHJuZXF1YWwoKSBmdW5jdGlvbi4gSSB0aGluayB0aGlzIHByb2JsZW0gaXMgcmF0aGVyCiAgbWFjb3MgOSBzcGVjaWZpYywgYXMgbW9zdCBwbGF0Zm9ybSBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZQogIG9uZSBwcm92aWRlZCBieSBsaWJjdXJsLgoKICBBIHNlY29uZCwgbW9yZSBpbXBvcnRhbnQsIHdhcyBpbiB0aGUgd2F5IHdlIHRha2UgY2FyZSBvZiBGVFAgcmVzcG9uc2VzLiBUaGUKICBjb2RlIHdvdWxkIHJlYWQgYSBsYXJnZSBjaHVuayBvZiBkYXRhIGFuZCBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtcmVzcG9uc2UKICBsaW5lIHdpdGhpbiB0aGF0IGNodW5rLiBXaGVuIGZvdW5kLCBpdCB3b3VsZCBqdXN0IHNraXAgdGhlIHJlc3Qgb2YgdGhlCiAgZGF0YS4gSG93ZXZlciwgd2hlbiB0aGUgbmV0d29yayBjb25uZWN0aW9ucyBhcmUgc3BlY2lhbCwgb3IgcGVyaGFwcyB0aGUKICBzZXJ2ZXIgaXMsIHdlIGNvdWxkIGFjdHVhbGx5IGdldCBtb3JlIHRoYW4gb25lIHJlc3BvbnNlIGluIHRoYXQgY2h1bmsgb2YKICBkYXRhIHNvIHRoYXQgd2hlbiB0aGUgbmV4dCBpbnZva2UgdG8gdGhpcyBmdW5jdGlvbiB3YXMgZG9uZSwgdGhlIHJlc3BvbnNlCiAgaGFkIGFscmVhZHkgYmVlbiByZWFkIGFuZCB0aHJvd24gYXdheS4gTm93LCB3ZSBjYWNoZSB0aGUgZGF0YSBub3QgdXNlZCBpbgogIG9uZSBjYWxsLCBhcyBpdCBjb3VsZCBiZSB1c2VmdWwgaW4gdGhlIHN1YnNlcXVlbnQgY2FsbC4gVGVzdCBjYXNlIDEyNiB3YXMKICBhZGRlZCBhbmQgdGhlIHRlc3QgZnRwIHNlcnZlciBtb2RpZmllZCwgdG8gZXhlcmNpc2UgdGhpcyBwYXJ0aWN1bGFyIGNhc2UuCgpWZXJzaW9uIDcuOS4yLXByZTgKCkRhbmllbCAoMiBEZWNlbWJlciAyMDAxKQotIEJ1ZyByZXBvcnQgIzQ4NzgyNSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiB1c2luZyBhIHByb3h5IGFuZAogIGZvbGxvd2luZyBhIHJlZGlyZWN0aW9uIGZyb20gSFRUUCB0byBIVFRQUy4gbGliY3VybCB0aGVuIHJlLXVzZWQgdGhlIHNhbWUKICBwcm94eSBjb25uZWN0aW9uIGJ1dCB3aXRob3V0IGRvaW5nIGEgcHJvcGVyIEhUVFBTIHJlcXVlc3QuCgotIEZpeGVkIHdpbjMyIGNvbXBpbGluZyBxdWlya3MuCgpWZXJzaW9uIDcuOS4yLXByZTcKCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMSkKLSBEb2N1bWVudGVkIC0tZGlzYWJsZS1lcHN2IGFuZCBDVVJMT1BUX0ZUUF9VU0VfRVBTVi4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMSkKLSBBZGRlZCAtLWRpc2FibGUtZXBzdiBhcyBhbiBvcHRpb24uIFdoZW4gdXNlZCwgY3VybCB3b24ndCBhdHRlbXB0IHRvIHVzZSB0aGUKICBFUFNWIGNvbW1hbmQgd2hlbiBkb2luZyBwYXNzaXZlIEZUUCBkb3dubG9hZHMuIFdyb3RlIGEgdGVzdCBjYXNlIGZvciBpdC4KCi0gRXJpYyBwcm92aWRlZCBhIGZldyBtb3JlIGZpeGVzIGZvciBidWlsZGluZyBvbiBNYWNzLiBIZSBhbHNvIHBvaW50ZWQgb3V0CiAgYSBmbGF3IGluIHRoZSBzaWduYWwgaGFuZGxlciByZXN0b3JhdGlvbiBjb2RlLgoKRGFuaWVsICgyOCBOb3ZlbWJlciAyMDAxKQotIEZpZGRsZWQgd2l0aCBzb21lIFRydTY0IHByb2JsZW1zIHJlcG9ydGVkIGJ5IERpbWl0cmlzIFNhcnJpcy4gVGhleSBhcHBlYXJlZAogIG9ubHkgd2hlbiB1c2luZyBWRVJCT1NFIGZ0cCB0cmFuc2ZlcnMuIERvIHdlIHVzZSBhIHRvbyBzbWFsbCBidWZmZXIgZm9yCiAgZ2V0aG9zdGJ5YWRkcl9yKCksIHdhcyB0aGUgbGFjayBvZiB1c2luZyBpbl9hZGRyX3Qgd3Jvbmcgb3IgaXMgaXQgdGhhdCB0aGUKICBob3N0ZW50IHN0cnVjdCBtdXN0IGJlIGJsYW5rZWQgYmVmb3JlIHVzZT8gV2l0aCBEaW1pdHJpcyBoZWxwIGFuZCB0aGVzZQogIHBhdGNoZXMsIHRoZSBwcm9ibGVtcyBzZWVtIHRvIGJlIGhpc3RvcnkuCgotIENVUkxPUFRfRlRQX1VTRV9FUFNWIHdhcyBhZGRlZCBhbmQgY2FuIGJlIHNldCB0byBGQUxTRSB0byBwcmV2ZW50IGxpYmN1cmwKICBmcm9tIHVzaW5nIHRoZSBFUFNWIGNvbW1hbmQgYmVmb3JlIHRyeWluZyB0aGUgbm9ybWFsIFBBU1YuIEhlaWtraSBLb3JwZWxhCiAgcG9pbnRlZCBvdXQgdGhhdCBzb21lIGZpcmV3YWxscyBhbmQgc2ltaWxhciBkb24ndCBsaWtlIHRoZSBFUFNWIHNvIHdlIG11c3QKICBiZSBhYmxlIHRvIHNodXQgaWYgb2ZmIHRvIHdvcmsgZXZlcnl3aGVyZS4KCi0gSSBhZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgJ2luX2FkZHJfdCcgYW5kIG1hZGUgdGhlIGZ0cCBjb2RlIHVzZSB0aGF0IHRvCiAgcmVjZWl2ZSB0aGUgaW5ldF9hZGRyKCkgcmV0dXJuIGNvZGUgaW4uIFdvcmtzIG9uIFNvbGFyaXMgYW5kIExpbnV4IGF0CiAgbGVhc3QuIFRoZSBMaW51eCBtYW4gcGFnZSBmb3IgaW5ldF9hZGRyKCkgZG9lc24ndCBldmVuIG1lbnRpb24gaW5fYWRkcl90Li4uCgotIEFkanVzdGVkIChhbG1vc3QpIGFsbCBGVFAgdGVzdHMgdG8gdGhlIG5ldyBjb21tYW5kIHNlcXVlbmNlLgoKLSBGVFAgY29tbWFuZCBzZXF1ZW5jZSBjaGFuZ2VzOgoKICBFUFNWIGlzIG5vdyBhbHdheXMgYXR0ZW1wdGVkIGJlZm9yZSBQQVNWLiBJdCBpcyB0aGUgZmluYWwgdG91Y2ggdG8gbWFrZSBJUHY2CiAgcGFzc2l2ZSBGVFAgZG93bmxvYWRzIHRvIHdvcmssIGJ1dCBFUFNWIGlzIG5vdCByZXN0cmljdGVkIHRvIElQdjYgYnV0IHdvcmtzCiAgZmluZSB3aXRoIElQdjQgdG9vIG9uIHRoZSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBpdC4KCiAgU0laRSBpcyBub3cgYWx3YXlzIGlzc3VlZCBiZWZvcmUgUkVUUi4gSXQgbWFrZXMgY3VybCBrbm93IHRoZSBhY3R1YWwKICBkb3dubG9hZCBzaXplIGJlZm9yZSB0aGUgZG93bmxvYWQgdGFrZXMgcGxhY2UsIGFzIGl0IG1ha2VzIGl0IGxlc3MgaW1wb3J0YW50CiAgdG8gZmluZCB0aGUgc2l6ZSBzZW50IGluIFJFVFIgcmVzcG9uc2VzLiBNYW55IHNpdGVzIGRvbid0IGluY2x1ZGUgdGhlIHNpemUKICBpbiB0aGVyZS4KCiAgQm90aCB0aGVzZSBjaGFuZ2VzIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgdGVzdCBzdWl0ZSdzIGZ0cCBzZXJ2ZXIKICBjb2RlLCBhbmQgYWxsIEZUUCB0ZXN0IGNhc2VzIG5lZWQgdG8gYmUgY2hlY2tlZCBhbmQgYWRqdXN0ZWQhCgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gSGFucyBTdGVlZ2VycyBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZWxuZXQgY29kZSByZWFkIGZyb20gc3Rkb3V0LCBub3Qgc3RkaW4KICBhcyBpdCBpcyBzdXBwb3NlZCB0byBkbyEKClZlcnNpb24gNy45LjItcHJlNgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAxKQotIEVyaWMgTGF2aWduZSdzIG1pbm9yIGNoYW5nZXMgdG8gYnVpbGQgb24gTWFjT1MgYmVmb3JlIE9TIFggd2VyZSBhcHBsaWVkLgoKLSBncmVlcCBhdCBtaW5kc3ByaW5nLmNvbSBwcm92aWRlZCBhIG1haW4gaW5kZXguaHRtbCBwYWdlIGZvciBvdXIgcmVsZWFzZQogIGFyY2hpdmUgZG9jcyBkaXJlY3RvcnkuIEl0IGp1c3QgbGlua3MgdG8gYWxsIHRoZSBleGlzdGluZyBIVE1MIGZpbGVzLCBidXQKICBJIHRoaW5rIGl0IG1heSBjb21lIHVzZWZ1bCB0byBwZW9wbGUuCgotIFRoZXJlJ3Mgbm93IHNvbWUgaW5pdGlhbCBjb2RlIHRvIHN1cHBvcnQgdGhlIEVQU1YgRlRQIGNvbW1hbmQuIFRoYXQgc2hvdWxkCiAgYmUgdXNlZCB0byBkbyBwYXNzaXZlIHRyYW5zZmVycyBJUHY2LXN0eWxlLiBUaGUgY29kZSBpcyBzdGlsbCAjaWYgMCdlZCBpbgogIGxpYi9mdHAuYyBhcyBJIGhhdmUgbm8gSVB2NiBmdHAgc2VydmVyIHRvIHRlc3QgdGhpcyB3aXRoLgoKRGFuaWVsICgyNiBOb3ZlbWJlciAyMDAxKQotIFJvYmVydCBTY2hsYWJiYWNoIGhhZCBwcm9ibGVtcyB0byB1bmRlcnN0YW5kIGhvdyB0byBkbyByZXN1bWVkIHRyYW5zZmVycywKICBhbmQgSSBjbGFyaWZpZWQgdGhlIG1hbiBwYWdlIC1DIHNlY3Rpb24gc29tZXdoYXQuCgpWZXJzaW9uIDcuOS4yLXByZTUKCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGhlbHBlZCBtZSBvdXQgdG8gdHJhY2sgZG93biB0aGUgcm9vdHMgb2YgYnVnIHJlcG9ydCAjNDc5NTM3LAogIHdoaWNoIHdhcyBjb25jZXJuaW5nIGN1cmwgcmV0dXJuaW5nIHRoZSB3cm9uZyBlcnJvciBjb2RlIHdoZW4gZmFpbGluZyB0bwogIGNvbm5lY3QuIFRoaXMgZGlkbid0IGhhcHBlbiBvbiBhbGwgc3lzdGVtcywgYW5kIG1vcmUgc3BlY2lmaWNseSBJJ3ZlIHNvIGZhcgogIG9ubHkgc2VlbiB0aGlzIGhhcHBlbiBvbiBJUHY0LW9ubHkgTGludXggaG9zdHMuCgotIEkgYXBwbGllZCB0aGUgZml4ZXMgZm9yIHRoZSB0d28gYnVncyBFcmljIExhdmlnbmUgZm91bmQgd2hlbiBkb2luZyBoaXMgTWFjT1MKICBwb3J0LiBBIG1pc3NpbmcgY29tbWEgaW4gYXJwYV90ZWxuZXQuaCBhbmQgYSBwcmV0dHkgd2lsZCB3cml0ZSBpbiB0aGUgRlRQCiAgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIHdyaXRlIGlzIGhvd2V2ZXIgbGlrZWx5IHRvIG9jY3VyIGluIG91cgogIG93biBidWZmZXIgdW5sZXNzIHZlcnkgYmlnIEZUUCBzZXJ2ZXIgcmVwbGllcyAoPjI1SykgYXJlIHJlYWQuIEkndmUgbmV2ZXIKICBzZWVuIHN1Y2ggYSByZXBseSBldmVyLCBzbyBJIHRoaW5rIHRoaXMgaXMgYSByZWxhdGl2ZWx5IG1pbm9yIHJpc2suCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDEpCi0gTW9vbmVzYW15IHByb3ZpZGVkIGNvZGUgdG8gcHJldmVudCBqdW5rIGZyb20gYmVpbmcgb3V0cHV0IHdoZW4gbGliY3VybAogIHJldHVybnMgYW4gZXJyb3IgY29kZSBidXQgbm8gZXJyb3IgZGVzY3JpcHRpb24gYW5kIHRoYXQgY29ycmVjdHMgaG93IG1ha2UgaXMKICBydW4gaW4gdGhlIE1ha2VmaWxlLmRpc3QgZmlsZSAodGhhdCBhcHBlYXJzIGFzIHJvb3QgTWFrZWZpbGUgaW4gcmVsZWFzZQogIGFyY2hpdmVzKS4KCi0gRXJpYyBMYXZpZ25lIG1haWxlZCBtZSBidWdmaXhlcyBhbmQgcGF0Y2hlcyBmb3IgYnVpbGRpbmcgbGliY3VybCBvbiBNYWNPUwogIChub24tWCkuCgotIEtldmluIFJvdGggbW9kaWZpZWQgdGhlIGN5Z3dpbiBmaWxlcyBvbmNlIGFnYWluLCBub3cgdG8gYnVpbGQgYWdhaW5zdCB0aGUKICBzaGFyZWQgT3BlblNTTCBETExzLgoKVmVyc2lvbiA3LjkuMi1wcmU0CgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDEpCi0gR2VvcmcgSG9ybiBicm91Z2h0IGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VkIENVUkxJTkZPX1NUQVJUVFJBTlNGRVJfVElNRSwKICBjb21wbGV0ZSB3aXRoIG1hbiBwYWdlIHVwZGF0ZXMhCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDIwMDEpCi0gTWlrbG9zIE5lbWV0aCBwcm92aWRlZCBkZXRhaWxzIGVub3VnaCB0byB1cGRhdGUgdGhlIEJvcmxhbmQgbWFrZWZpbGUKICBwcm9wZXJseS4KCi0gTGFycyBNIEd1c3RhZnNzb24gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgZnJlZSgpLiBJbiBmYWN0LCBpdCB3YXMgc28gYmFkIEknbQogIGFtYXplZCB3ZSBuZXZlciBzYXcgdGhpcyBiZWZvcmUhCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3lnd2luIE1ha2ZpbGUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDEpCi0gS2xldnRzb3YgVmFkaW0gZml4ZWQgYSBidWcgaW4gaG93IHRpbWUtY29uZGl0aW9uYWxzIHdlcmUgc2VudCB3aGVuIGRvaW5nCiAgSFRUUC4KClZlcnNpb24gNy45LjItcHJlMwoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDAxKQotIFNhbXVlbCBMaXN0b3BhZCBwYXRjaGVkIGF3YXkgdGhlIHByb2JsZW0gd2l0aCBTU0wgd2UgZ290IHdoZW4gc29tZW9uZSBjYWxsCiAgY3VybF9nbG9iYWxfaW5pdCgpID0+IGN1cmxfZ2xvYmFsX2NsZWFudXAoKSA9PiBjdXJsX2dsb2JhbF9pbml0KCkuIFRoZQogIHNlY29uZCBpbml0IHdvdWxkIG5vdCAidGFrZSIgYW5kIFNTTCB3b3VsZCBiZSB1bnVzYWJsZSB3aXRoIGN1cmwgZnJvbSB0aGF0CiAgcG9pbnQuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGZhY3QgdGhhdCBjYWxsaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCB3YXkgaXMKICB3cm9uZy4gY3VybF9nbG9iYWxfaW5pdCgpIHNob3VsZCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGFuZCBub3QgbW9yZS4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMSkKLSBGaXhlZCBzb21lIG1pbm9yIHZhcmlhYmxlIHR5cGUgbWl4dXBzIGluIGZ0cC5jIHRoYXQgY2F1c2VkIGNvbXBpbGVyIHdhcm5pbmdzCiAgb24gSFAtVVggMTEuMDAuCgotIFRoZSBGVFAgZml4IEkgZGlkIHllc3RlcmRheSB1c2VkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdGhhdCBjYXVzZWQKICBzcHVyaW91cyBlcnJvcnMgd2hlbiBkb2luZyBGVFAuCgpWZXJzaW9uIDcuOS4yLXByZTIKCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwMSkKLSBSaWNhcmRvIENhZGltZSBmZWxsIG92ZXIgYSBtdWx0aXBsZS1yZXF1ZXN0cyBwcm9ibGVtIHdoZW4gZmlyc3QgYSBGVFAKICBkaXJlY3RvcnkgZmV0Y2ggZmFpbGVkIGFuZCB0aGVuIGEgc2Vjb25kIHJlcXVlc3QgaXMgbWFkZSBhZnRlciB0aGF0LiBUaGUKICBzZWNvbmQgcmVxdWVzdCBoYXBwZW5lZCB0byBnZXQgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgYmFjayBmcm9tIHRoZQogIHByZXZpb3VzIHJlcXVlc3QsIHdoZW4gaXQgZGlkIGl0cyBpbml0aWFsIENXRCBjb21tYW5kLgoKLSBCam9ybiBSZWVzZSBwb2ludGVkIG91dCB0aGF0IHdlIGNvdWxkIGltcHJvdmUgdGhlIHRpbWUgZGlmZiBmdW5jdGlvbiB0bwogIHByZXZlbnQgdHJ1bmNhdGlvbiBhIGJpdC4KCi0gS2FpLVV3ZSBSb21tZWwgbWFkZSBtZSBhd2FyZSB0aGF0IC1wIChodHRwIHByb3h5IHR1bm5lbCkgc2lsbHkgZW5vdWdoIGRpZG4ndAogIHdvcmsgZm9yIHBsYWluIEhUVFAgcmVxdWVzdHMhIFNvIEkgbWFkZSB0aGF0IHdvcmsuCgpWZXJzaW9uIDcuOS4yLXByZTEKCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwMSkKLSBSZXdyb3RlIHRoZSBDdXJsX0Nvbm5lY3RIVFRQUHJveHlUdW5uZWwoKS4gSXQgc2hvdWxkIG5vdyBub3Qgb25seSB3b3JrIGEgbG90CiAgZmFzdGVyLCBpdCBzaG91bGQgYWxzbyBzdXBwb3J0IHN1Y2ggKCJicm9rZW4iKSBwcm94aWVzIHRoYXQgSm9obiBMYXNrCiAgcHJldmlvdXNseSBoYXZlIHJlcG9ydGVkIHByb2JsZW1zIHdpdGguIEhpcyBwcm94eSBzZW5kcyBhIHRyYWlsaW5nIHplcm8gYnl0ZQogIGFmdGVyIHRoZSBlbmQgb2YgdGhlIChwcm94eS0pIGhlYWRlcnMuIEkndmUgdGVzdGVkIHRoaXMgbXlzZWxmIGFuZCBpdCBzZWVtcwogIHRvIHdvcmsgb24gYSBwcm94eSB0aGUgcHJldmlvdXMgdmVyc2lvbiBhbHNvIHdvcmtlZCB3aXRoLi4uISBUaGlzIHJld3JpdGUgaXMKICBkdWUgdG8gdGhlIHByb2JsZW1zIEpvaG4gTGFzayBwcmV2aW91c2x5IGV4cGVyaWVuY2VkLgoKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIG91dCB3aHkgdGhlICJjdXJyZW50IHNwZWVkIiBtZXRlciBzb21ldGltZXMgc2hvd2VkIDIwNDhLCiAgZm9yIHZlcnkgcXVpY2sgdHJhbnNmZXJzLiBJdCB0dXJuZWQgb3V0IHRoZSAidGltZSBkaWZmIi1mdW5jdGlvbiByZXR1cm5lZCBhCiAgemVybyBtaWxsaXNlY29uZCBkaWZmLiBXZSBub3cgYWx3YXlzIHNheSBpdCBpcyBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQhIEluCiAgcmVhbGl0eSwgdGhlc2UgdGltZXJzIHZlcnkgcmFyZWx5IGhhdmUgdGhhdCBnb29kIHJlc29sdXRpb24gc28gZXZlbiB0aG91Z2gKICB0aGUgdGltZSBkaWZmIHdhcyBsb25nZXIgdGhhbiAxIG1pbGxpc2Vjb25kLCBpdCB3YXMgcmVwb3J0ZWQgYXMgbm8gZGlmZi4KCi0gSSBhbHNvIG1vZGlmaWVkIHRoZSBnZXRpbmZvKCkgYWdhaW4gd2hlbiByZXR1cm5pbmcgdGltZXMsIGFzIFBhdWwgSGFycmluZ3RvbgogIHJlcG9ydHMgdGhhdCA3LjkuMSBvbmx5IHJldHVybnMgdGltZXMgd2l0aCAxIHNlY29uZCBhY2N1cmFjeSwgd2hpY2ggaW5kZWVkCiAgaXMgd3JvbmcuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwMSkKLSBNYXJjdXMgV2Vic3RlciBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQoKSBjb3VsZCByZWFkIG9uZSBieXRlIG91dHNpZGUgYQogIGJ1ZmZlciBib3VuZGFyeSwgd2hpY2ggdGhlbiBvZiBjb3Vyc2UgY291bGQgbGVhZCB0byBhIGNyYXNoLiBNYXJjdXMgYWxzbwogIGdyYWNlZnVsbHkgcHJvdmlkZWQgYSBwYXRjaCBmb3IgdGhpcyB0aGlzLgoKLSBHbGVuIFNjb3R0IHJhbiBjb25maWd1cmUgb24gaGlzIENvYmFsdCBRdWJlIGFuZCBpdCBkaWRuJ3QgZmlndXJlIG91dCB0aGUKICBjb3JyZWN0IHdheSBvZiBjYWxsaW5nIGdldGhvc3RieW5hbWVfcigpIGFuZCB0aHVzIGZhaWxlZCB0byByZXNvbHZlIGhvc3RzLgogIFRoaXMgaXMgdHdvIGVycm9yczogaXQgc2hvdWxkbid0IGNvbnRpbnVlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlmIGl0IGZpbmRzCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgYnV0IGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCwgYW5kIGl0IHNob3VsZCByZWFsbHkKICBmaWd1cmUgb3V0IGhvdyB0byB1c2UgaXQgYXMgaXQgd2FzIHJ1bm5pbmcgTGludXggYW5kIHdlIGtub3cgaG93IHRoYXQKICB3b3Jrcy4uLgogCkRhbmllbCAoNyBOb3ZlbWJlciAyMDAxKQotIGRvY3MvVkVSU0lPTlMgaXMgYSBuZXcgZmlsZSBpbiB0aGUgYXJjaGl2ZSB0aGF0IGV4cGxhaW5zIHRoZSB2ZXJzaW9uIG51bWJlcgogIHN5c3RlbSB3ZSB1c2UgaW4gdGhlIGN1cmwgcHJvamVjdC4KCi0gRGlkIHNvbWUgbW9yZSBmaXhlcyB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIG9ubHkgaWdub3JlIHNpZ25hbHMgYXMgbG9uZyBhcwogIGl0IG5lZWRzIHRvLCBhbmQgdGhlbiByZXN0b3JlIChpZiBhbnkpIHByZXZpb3VzIHNpZ25hbCBoYW5kbGVyIGFnYWluLgoKRGFuaWVsICg2IE5vdmVtYmVyIDIwMDEpCi0gRW5yaWsgQmVya2hhbiBwb3N0ZWQgYnVnIHJlcG9ydCAjNDc4NzgwLCBpbiB3aGljaCBoZSB2ZXJ5IGNvcnJlY3RseSBwb2ludGVkCiAgb3V0IHR3byBiYWQgdGltZW91dCBtYXR0ZXJzIGluIGxpYmN1cmw6IHdlIGRpZG4ndCByZXN0b3JlIHRoZSBzaWdhY3Rpb24KICBzdHJ1Y3QgKHRoZSBhbGFybSBoYW5kbGVyIGZvciBTSUdBTFJNKSBub3IgZGlkIHdlIHJlc3RvcmUgdGhlIHByZXZpb3VzCiAgYWxhcm0oKSB0aW1lb3V0IHRoYXQgY291bGQndmUgYmVlbiBzZXQgYnkgYSAicGFyZW50IiBwcm9jZXNzIG9yIHNpbWlsYXIuCgotIEtldmluIFJvdGggbWFkZSB0aGUgY3lnd2luIGJpbmFyeSBnZXQgc3RyaXBwZWQgYmVmb3JlIGluc3RhbGwuCgpEYW5pZWwgKDUgTm92ZW1iZXIgMjAwMSkKLSBEZXRsZWYgU2NobWllciByZXBvcnRlZCB0aGF0IGN1cmwgZGlkbid0IGNvbXBpbGUgdXNpbmcgU29sYXJpcyA4IHdpdGggdGhlCiAgbmF0aXZlIGNjIGNvbXBpbGVyLiBJdCB3YXMgZHVlIHRvIGEgYmFkIGZ1bmN0aW9uIHByb3RvdHlwZS4gRml4ZWQgbm93LgogIFVuZm9ydHVuYXRlbHksIEkgY2FuJ3QgZW5hYmxlIHRoZSAtV3N0cmljdC1wcm90b3R5cGVzIGluIG15IGRlYnVnIGJ1aWxkcwogIHRob3VnaCwgYXMgZ2NjIHRoZW4gY29tcGxhaW5zIGxpa2UgY3Jhenkgb24gT3BlblNTTCBpbmNsdWRlIGZpbGVzLi4uIDotKAoKLSBKb2huIExhc2sgcHJvdmlkZWQgU1NMIG92ZXIgSFRUUCBwcm94eSBmaXhlcy4gVGhleSdsbCBuZWVkIHNvbWUgdHdlYWtpbmcKICB0byB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMuCgotIEpvaG4gTGFzayBhZGRlZCB0aGUgLTEvLS1UTFN2MSBvcHRpb25zIHRoYXQgZm9yY2VzIFNTTCBpbnRvIHVzaW5nIFRMUwogIHZlcnNpb24gMSB3aGVuIHNwZWFraW5nIEhUVFBTLgoKLSBKb2huIExhc2sgYnJvdWdodCBhIGJyYW5kIG5ldyBWQysrIG1ha2VmaWxlIGZvciB0aGUgbGliIGRpcmVjdG9yeSwgdGhhdAogIHdvcmtzIGEgbG90IGJldHRlciB0aGFuIHRoZSBwcmV2aW91cyEKCi0gUmFtYW5hIE1va2thcGF0aSBicm91Z2h0IHNvbWUgY2xldmVyIGluc2lnaHRzIG9uIHRoZSBMREFQIGZhaWx1cmVzIChidWcKICByZXBvcnQgIzQ3NTQwNyksIGFuZCBoaXMgc3VnZ2VzdGVkIGNoYW5nZXMgYXJlIG5vdyBhcHBsaWVkLgoKVmVyc2lvbiA3LjkuMQoKRGFuaWVsICg0IE5vdmVtYmVyIDIwMDEpCi0gSSd2ZSBhZGRlZCBhIG51bWJlciBvZiBuZXcgdGVzdCBjYXNlcyB0aGUgbGFzdCBmZXcgZGF5cy4gQSBmZXcgb2YgdGhlbSBzaW5jZQogIEkgZ290IHJlcG9ydHMgdGhhdCBoaW50ZWQgb24gcHJvYmxlbXMgb24gdGltZW91dHMsIHNvIEkgYWRkZWQgZm91ciB0ZXN0cwogIHdpdGggdGltZW91dHMgZm9yIGFsbCBzb3J0cyBvZiBwcm90b2NvbHMgYW5kIHN0dWZmLiBJIGFsc28gY2FtZSB0byB0aGluayBvZgogIGEgZmV3IG90aGVyIGVycm9yIHNjZW5hcmlvcyB0aGF0IHdlIGN1cnJlbnRseSBkaWRuJ3QgdGVzdCBwcm9wZXJseSwgc28gSQogIHdyb3RlIHVwIHRlc3RzIGZvciBhIGZldyBvZiB0aG9zZSB0b28uCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMSkKLSBSZXBsYWNlZCByZWFkKCkgYW5kIHdyaXRlKCkgd2l0aCByZWN2KCkgYW5kIHNlbmQoKSBmb3Igc29ja2V0IG9wZXJhdGlvbnMKICBldmVuIHVuZGVyIG5vcm1hbCB1bml4ZXMuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMSkKLSBXaGVuIGFuIEZUUCB0cmFuc2ZlciB3YXMgYWJvcnRlZCBkdWUgdG8gYSB0aW1lb3V0LCBpdCB3YXNuJ3QgcmVhbGx5IGF3YXJlIG9mCiAgaG93IG1hbnkgYnl0ZXMgdGhhdCBoYWQgYmVlbiB0cmFuc2ZlcnJlZCBhbmQgdGhlIGVycm9yIHRleHQgYWx3YXlzIHNhaWQgMAogIGJ5dGVzLiBJIG1vZGlmaWVkIHRoaXMgdG8gb3V0cHV0IHRoZSBhY3R1YWxseSB0cmFuc2ZlcnJlZCBhbW91bnQhIDotKQoKLSBUaGUgRlRQIGZpeGVzIGluIHByZTcgZGlkbid0IGNvbXBpbGUgb24gSVB2NiBlbmFibGVkIGhvc3RzLiBEb2VzIG5vdy4gSSBhbHNvCiAgYWRkZWQgbW9yZSBjb21tZW50cyBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSBmaWxlLgoKLSBNaW5vciB1cGRhdGVzIHRvIHRoZSBGQVEsIGFkZGVkIGEgYnJhbmQgbmV3IHNlY3Rpb24gdG8gdGhlIHdlYiBzaXRlIGFib3V0CiAgdGhlIG5hbWUgaXNzdWUgKHdobyBvd25zICJjdXJsIj8gd2lsbCBzb21lb25lIHN1ZSB1cz8gZXRjIGV0Yyk6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9sZWdhbC90aGVuYW1lLmh0bWwKClZlcnNpb24gNy45LjEtcHJlNwoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDEpCi0gVGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgdGltZXJzIGFjY2lkZW50YWxseSBsb3N0IHRoZWlyIHN1YnNlY29uZCBhY2N1cmFjeSBhcwogIHRoZSBjYWxjdWxhdGlvbnMgdXNlZCBsb25ncyBpbnN0ZWFkIG9mIGRvdWJsZXMhIFBhdWwgSGFycmluZ3RvbiByZXBvcnRlZC4KCi0gVGhlIFNTTCBTb2NrZXRJc0RlYWQoKSBjaGVja3Mgd2VyZW4ndCBnb29kIGVub3VnaCAoYXMgZXhwZWN0ZWQgcmVhbGx5KSwgc28gSQogIGhhZCB0byBhZGQgYSBnZW5lcmljIGludGVybmFsIHRyeS1pdC1vdXQgc3lzdGVtLiBJZiB0aGUgcmVxdWVzdCBvbiBhIHJlLXVzZWQKICBjb25uZWN0aW9uIHNlZW1zIHRvIGZhaWwsIHRoZW4gd2UgZ28gYmFjayBhbmQgZ2V0IGEgbmV3IChmcmVzaCkgY29ubmVjdGlvbgogIGFuZCByZS10cmllcyB0aGUgcmVxdWVzdCBvbiB0aGF0IGluc3RlYWQuIEl0IGtpbmQgb2YgbWFrZXMgdGhlCiAgU29ja2V0SXNEZWFkKCkgY2hlY2sgb2Jzb2xldGUsIGJ1dCBJIHRoaW5rIGl0IGlzIGEgcXVpY2tlciB3YXkgZm9yIHRob3NlCiAgY2FzZXMgd2hlcmUgaXQgYWN0dWFsbHkgZGlzY292ZXJzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgZGVhZC4KCi0gV2hlbiBmaXhpbmcgdGhlIGFib3ZlLCBJIG5vdGljZWQgdGhhdCB3ZSBkaWQgcXVpdGUgYSBmZXcgd3JpdGVzIHRvIHNvY2tldHMKICBpbiBsaWJjdXJsIHdoZXJlIHdlIGRpZG4ndCBjaGVjayB0aGUgcmV0dXJuIGNvZGUgKHRoYXQgaXQgYWN0dWFsbHkgd29ya2VkIHRvCiAgc2VuZCB0aGUgZGF0YSkuIFdpdGggdGhlIG5ldyAiYXR0ZW1wdGVkIHJlcXVlc3QiIHN5c3RlbSB3ZSBtdXN0IGRldGVjdCB0aG9zZQogIHNpdHVhdGlvbnMgc28gSSB3ZW50IG92ZXIgYSBidW5jaCBvZiBmdW5jdGlvbnMsIGNoYW5nZWQgcmV0dXJuIHR5cGVzIGFuZAogIGFkZGVkIGNoZWNrcyBmb3Igd2hhdCB0aGV5IGFjdHVhbGx5IHJldHVybi4KClZlcnNpb24gNy45LjEtcHJlNgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDEpCi0gUGF1bCBIYXJyaW5ndG9uIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RhbnQgU1NMIGNvbm5lY3Rpb25zLiBPciB0byBiZQogIG1vcmUgZXhhY3QsIHdlIGRpZG4ndCBwcm9wZXJseSBkZXRlY3QgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgZGVhZCBhbmQgdGhlbgogIGEgc2Vjb25kIGNvbm5lY3Rpb24gd291bGQgdHJ5IHRvIHJlLXVzZSBpdCB3cm9uZ2x5LiBUaGUgc29sdXRpb24gdG8gdGhpcwogIHByb2JsZW0gaXMgc3RpbGwgbm90IHZlcnkgY2xlYXIgYW5kIEknbSB3b3JraW5nIG9uIGl0LiBPbmUgT3BlblNTTCBpbnNpZGVyCiAgc2FpZCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBpZiB0aGUgU1NMIGNvbm5lY3Rpb24gaXMgYWxpdmUgb3Igbm90IHdpdGhvdXQKICBhY3R1YWxseSB0cnlpbmcgYW4gb3BlcmF0aW9uLgoKRGFuaWVsICgzMCBPY3RvYmVyIDIwMDEpCi0gSWYgYSBjb29raWUgd2FzIHJlYWQgZnJvbSBhIGZpbGUsIGl0IGNvdWxkIGFjY2lkZW50YWxseSBzdHJkdXAoKSBhIE5VTEwKICBwb2ludGVyLiBQYXVsIEhhcnJpbmd0b24gcmVwb3J0ZWQuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29va2llLmMuZGlmZj9yMT0xLjI1JnIyPTEuMjZdCgotIFRoZSBNQU5VQUwgZmlsZSBub3cgZG9jdW1lbnRzIC10IGNvcnJlY3RseS4gSSBhbHNvIGZpeGVkIHRoZSAtVCBkZXNjcmlwdGlvbgogIGluIHRoZSBjdXJsLjEgbWFuIHBhZ2UuCgpEYW5pZWwgKDI5IE9jdG9iZXIgMjAwMSkKLSBKb2huIEphbnNzZW4gZm91bmQgb3V0IHRoYXQgY3VybF9mb3JtYWRkIHdhcyBtaXNzaW5nIGluIHRoZSBsaWJjdXJsLmRlZiBmaWxlCiAgYW5kIHRoYXQgdGhlIGRvY3Mgc3RhdGVkIHRoZSB3cm9uZyByZXR1cm4gdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLgoKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIGEgYnVnIHdpdGggbXVsdGlwbGUgZmlsZXMgaW4gdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uLAogIHRoYXQgSSByZW1vdmVkIHdpdGggdGhpcyBwYXRjaCBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Zvcm1kYXRhLmMuZGlmZj9yMT0xLjI1JnIyPTEuMjZdLgoKLSBLZXZpbiBSb3RoIGJyb3VnaHQgYW5vdGhlciBwYXRjaCB0aGF0IG1vdmVkIHRoZSBjeWd3aW4gcGFja2FnZSBmaWxlcyB0byB0aGUKICBwYWNrYWdlcy9XaW4zMi9jeWd3aW4gZGlyZWN0b3J5LgoKLSBBIGJ1ZyBpbiB0aGUgY29ubmVjdGlvbiByZS11c2UgbG9naWMgbWFkZSByZXBlYXRlZCByZXF1ZXN0cyB0byB0aGUgc2FtZSBGVFAKICBzZXJ2ZXIgKHdoZW4gdXNpbmcgbmFtZStwYXN3b3JkIGluIHRoZSBVUkwpIHNvbWV0aW1lcyB1c2UgbW9yZSB0aGFuIG9uZQogIGNvbm5lY3Rpb24uIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdXJsLmMuZGlmZj9yMT0xLjE2NiZyMj0xLjE2N10KCi0gTW9vbmVzYW15IHRyYWNrZWQgZG93biBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG5ldyA3LjkuMSBjb25uZWN0CiAgY29kZS4gVGhpcyBjb3JyZWN0ZWQgdGhlIGVycm9yIEtldmluIFJvdGggcmVwb3J0ZWQgb24gdGhlIDcuOS4xLXByZTUgcmVsZWFzZQogICh0ZXN0IDE5KS4uLgogIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29ubmVjdC5jLmRpZmY/cjE9MS4xMyZyMj0xLjE0XQoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDEpCi0gQWRkZWQgdGVzdDI4IHdoaWNoIHZlcmlmaWVzIHRoYXQgIkxvY2F0aW9uOiItZm9sbG93aW5nIHdvcmtzIGV2ZW4gaWYgdGhlCiAgY29udGVudHMgaXMgc2VwYXJhdGVkIHdpdGggbW9yZSB0aGFuIG9uZSBzcGFjZS4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDAxKQotIFJhbWFuYSBNb2trYXBhdGkgcG9pbnRlZCBvdXQgdGhhdCBMREFQIHRyYW5zZmVycyB3b3VsZCAnaGFuZycgYWZ0ZXIgdGhlCiAgY29ycmVjdCBkYXRhIGhhcyBiZWVuIG91dHB1dC4KClZlcnNpb24gNy45LjEtcHJlNQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDEpCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb29raWUgZW5naW5lLiBXaGVuIHdlIHVwZGF0ZSBhIGNvb2tpZQogIHRoYXQgd2UgYWxyZWFkeSBrbmV3IGFib3V0LCB3ZSBsb3N0IGEgY2h1bmsgb2YgbWVtb3J5IGluIHRoZSBwcm9ncmVzcy4uLiBUaGUKICBicmFuZCBuZXcgdGVzdCBjYXNlIDI3IG5vdyB0ZXN0cyBmb3IgdGhpcyBvY2N1cnJlbmNlLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvb2tpZS5jLmRpZmY/cjE9MS4yNCZyMj0xLjI1XQoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDEpCi0gcGFja19ob3N0ZW50KCkgZGlkbid0IHByb3Blcmx5IGFsaWduIHNvbWUgcG9pbnRlcnMsIHNvIGF0IGxlYXN0IFNQQVJDIENQVXMKICB3b3VsZCBjb3JlLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2hvc3RpcC5jLmRpZmY/cjE9MS4zNCZyMj0xLjM1XQoKRGFuaWVsICgyMiBPY3RvYmVyIDIwMDEpCi0gVG9tIEJlbm9pc3QgcmVwb3J0ZWQgdGhhdCB0aGlzIFNHSSBJUklYIGNvbXBpbGVyIGRpZG4ndCBoYW5kbGUgaW5kZW50ZWQKICBwcmVwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLCBzbyB0aGV5J3JlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGUhCgotIEFwcGxpZWQgS2V2aW4gUm90aCdzIHBhdGNoZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgY3lnd2luIHBhY2thZ2VzIGZyb20KICB0aGUgb3V0LW9mLXRoZS1ib3ggY3VybCByZWxlYXNlIGFyY2hpdmVzLgoKLSBJIGZvcmdvdCB0byBtZW50aW9uIGl0IGJlbG93LCBidXQgbGliY3VybCBub3cgY2xvc2VzIGNvbm5lY3Rpb25zIHRoYXQgcmVwb3J0CiAgdHJhbnNmZXIgZmFpbHVyZXMuIFVuY29uZGl0aW9uYWxseS4gVGhpcyBjb3VsZCBiZSBtYWRlIG1vcmUgbmljZWx5IGluIHRoZQogIGZ1dHVyZSBpZiB3ZSBzZXQgYSBmbGFnIG9yIHNvbWV0aGluZyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGdvb2QgdG8gYmUKICB1c2VkIGZvciB0aGUgZXJyb3JzIHRoYXQga25vdyB0aGF0IGZvciBhIGZhY3QuIFdlIGhhdmUgdG8gY2xvc2UgdGhlCiAgY29ubmVjdGlvbiBmb3IgdGhlIGNhc2VzIHdoZXJlIHdlIGFib3J0IGZvciBleGFtcGxlIGEgSFRUUCB0cmFuc2ZlciBpbiB0aGUKICBtaWRkbGUsIG9yIG90aGVyd2lzZSB3ZSBtaWdodCByZS11c2UgdGhhdCBjb25uZWN0aW9uIGxhdGVyIHdpdGggbG90cyBvZiBkYXRhCiAgc3RpbGwgYmVpbmcgc2VudCB0byB1cyBvbiBpdC4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi90cmFuc2Zlci5jLmRpZmY/cjE9MS42MyZyMj0xLjY0XQoKRGFuaWVsICgxOSBPY3RvYmVyIDIwMDEpCi0gQ1VSTEVfR09UX05PVEhJTkcgaXMgbm93IHJldHVybmVkIHdoZW4gYSBIVFRQIHNlcnZlciBkb2Vzbid0IHJldHVybgogIGFueXRoaW5nLCBub3QgZXZlbiBhIGhlYWRlci4gdGVzdCBjYXNlIDM3IHdhcyBhZGRlZCB0byB0ZXN0IGZvciB0aGlzLgoKLSBULiBCaGFyYXRoIG1hZGUgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHByb3Blcmx5IGNsb25lIHRoZSBjb29raWUgc3RhdHVzIGFzCiAgd2VsbC4KClZlcnNpb24gNy45LjEtcHJlNAoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDEpCi0gQ1VSTE9QVF9GQUlMT05FUlJPUiwgc2V0IHdpdGggImN1cmwgLS1mYWlsIiBubyBsb25nZXIgcmV0dXJucyBhbiBlcnJvciBpZgogIHRoZSBIVFRQIHJldHVybiBjb2RlIGlzIGJlbG93IDQwMC4KCkRhbmllbCAoMTcgT2N0b2JlciAyMDAxKQotIFRoZSB0ZXN0IHN1aXRlIG5vdyBraWxscyBhbnkgcnVubmluZyB0ZXN0IGh0dHAgc2VydmVyIHdoZW4geW91IHJlLXN0YXJ0IHRoZQogIHRlc3RzLgoKLSBXZSBoYWQgdG8gcmVtb3ZlICd1c2Ugc3RyaWN0JyBmcm9tIHR3byBwZXJsIHNjcmlwdHMsIGFzIHRoZSBjeWd3aW4KICBhZGp1c3RtZW50cyBkaWRuJ3QgcGxheSBuaWNlbHkgb3RoZXJ3aXNlIGZvciBzb21lIHJlYXNvbi4gQW55IHBlcmwgd2l6YXJkCiAgb3V0IHRoZXJlIHdobyBjYW4gcHV0IHRoZSBzY3JpY3QgYmFjayBhbmQgc3RpbGwgbWFrZSBpdCBydW4gZ29vZCBvbiB1bml4IGFuZAogIGN5Z3dpbj8KCi0gQSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgcG9pbnRlZCBvdXQgdG8gdXMgYnkgWWFuaWNrIFBlbGxldGllciB3YXMgcmVtb3ZlZC4KICBJdCB3b3VsZCBvY2N1ciB3aGVuIGEgaHR0cCBmaWxlIHRyYW5zZmVyIGZhaWxzLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3RyYW5zZmVyLmMuZGlmZj9yMT0xLjYwJnIyPTEuNjFdCgotIFRoZSBtZW1vcnkgZGVidWdnaW5nIHN5c3RlbSBzaG91bGQgbm8gbG9uZ2VyIGRpc3BsYXkgYW55dGhpbmcgdG8gc3RkZXJyCiAgaWYgdGhlIGN1cmxfbWVtZGVidWcoKSBoYXNuJ3QgYmVlbiB1c2VkIHRvIGV4cGxpY2l0bHkgc2F5IHNvLiBUaGlzIG1ha2VzIGl0CiAgZWFzaWVyIHRvIHVzZSB0aGUgbWVtb3J5IGRlYnVnIHN5c3RlbSBhbmQgc3dpdGNoIHRoZSBsb2dnaW5nIG9uL29mZi4KCkRhbmllbCAoMTYgT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGggcHJvdmlkZWQgZml4ZXMgZm9yIGJ1aWxkaW5nIGN1cmwgbmljZXIgaW4gY3lnd2luIGVudmlyb25tZW50cy4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDAxKQotIENsZWFuaW5nIHVwIHRoZSBwcm9ncmVzcyBtZXRlci9pbmZvIGNvZGUuIFRoZSAiY3VycmVudCBzcGVlZCIgaXMgbm93IG1vcmUKICBhY2N1cmF0ZSB0aGFuIGJlZm9yZSBhcyB3ZSBub3cgdXNlIHRoZSB0cnVlIHRpbWUgc3BlbnQgYmV0d2VlbiB0aGUgbWVhc3VyZXMsCiAgYW5kIG5vdCBqdXN0ICJhc3N1bWluZyIgZXZlcnktc2Vjb25kLXVwZGF0ZSBsaWtlIGJlZm9yZS4gVGhlIG91dHB1dCBzaG91bGQKICBub3cgYWxzbyBiZSBvZiB0aGUgc2FtZSB3aWR0aCBhdCBhbGwgdGltZXMsIG5ldmVyIHRvIHNob3cgImV4dHJhIiB6ZXJvZXMgb24KICB0aGUgcmlnaHQgZWRnZS4KCi0gQWZ0ZXIgdGFsa2luZyBhYm91dCBwb3NzaWJsZSBMb2NhdGlvbjogYnVncyBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIG1vZGlmaWVkCiAgdGhlICJhYnNvbHV0ZSBVUkwiIGNoZWNrZXIgaW4gbGliL3RyYW5zZmVyLmMgdG8gYmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZwogIGlmIHRoZSByZWRpcmVjdGVkIFVSTCBpcyBhYnNvbHV0ZS4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGggcHJvdmlkZWQgcGF0Y2hlcyB0aGF0IG1ha2UgdGhlIHRlc3Qgc3VpdGUgcnVuIGZpbmUgb24gV2luZG93cwogIDIwMDAgcnVubmluZyBjeWd3aW4uCgpEYW5pZWwgKDEwIE9jdG9iZXIgMjAwMSkKLSBTZXR0aW5nIHRoZSAtYyBvciB0aGUgQ1VSTE9QVF9DT09LSUVKQVIgb3B0aW9uIG5vdyBlbmFibGVzIHRoZSBjb29raWUgcGFyc2VyLgogIFByZXZpb3VzbHkgLWIgb3IgQ1VSTE9QVF9DT09LSUVGSUxFIHdhcyBhbHNvIHJlcXVpcmVkIGZvciB0aGUgamFyIHRvIHdvcmsuCgpWZXJzaW9uIDcuOS4xLXByZTMKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDEpCi0gQWRkZWQgYSBuZXcgb3B0aW9uIHRvIHRoZSBjb21tYW5kIGxpbmUgY2xpZW50OiAtMC8tLWh0dHAxLjAuIEl0IHVzZXMgdGhlIG5ldwogIGxpYmN1cmwgb3B0aW9uIENVUkxPUFRfSFRUUF9WRVJTSU9OIHRvIHJlcXVlc3QgdGhhdCBsaWJjdXJsIHVzZXMgSFRUUCAxLjAKICByZXF1ZXN0cyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZlcnNpb24gKDEuMSkuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91CiAgcmVhbGx5IE1VU1QgZG8gdGhhdCBiZWNhdXNlIG9mIGEgc2lsbHkgcmVtb3RlIHNlcnZlci4KCi0gUmVuYW1lZCB0aGUgJ1RpbWVDb25kJyB0eXBlZGVmIGluIGN1cmwvY3VybC5oIHRvIHVzZSBhICdjdXJsXycgcHJlZml4IGFzCiAgYWxsIHB1YmxpYyBjdXJsLXN5bWJvbHMgc2hvdWxkLgoKLSBsaWJjdXJsIG5vdyBleHBsaWNpdGx5IGlnbm9yZXMgdGhlIFNJR1BJUEUgc2lnbmFsLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoJ3MgY2hhbmdlIHRvIHRoZSBjb29raWUtamFyIGNvbW1lbnQgKGluIHRoZSBzdG9yZWQgZmlsZSkgd2FzCiAgYXBwbGllZC4KCi0gTHVjYXMgQWRhbXNraSdzIG1pbm9yIGJ1ZyBpbiB0aGUgYmluZCBlcnJvciBjb2RlIGZhaWxmKCkgd2FzIGZpeGVkLgoKRGFuaWVsICg1IE9jdG9iZXIgMjAwMSkKLSBNb29uZXNhbXkgZml4ZWQgdGhlIEN1cmxfY29ubmVjdGhvc3QoKSBmdW5jdGlvbiB0byBub3QgZ2l2ZSBjb21waWxlciBlcnJvcnMKICBvbiBhIGJ1bmNoIG9mIGNvbXBpbGVycywgZHVlIHRvIHRoZSBhcmd1bWVudCBuYW1lZCAnc29ja2V0Jy4KCi0gTW9vbmVzYW15IGFsc28gcHJvdmlkZWQgdXBkYXRlZCBWQysrIG1ha2VmaWxlcyBhbmQgcHJvamVjdCBmaWxlcy4KClZlcnNpb24gNy45LjEtcHJlMgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMSkKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBzY3JpcHQgZGV0ZWN0IHByb3BlcgogIGdldGhvc3RieW5hbWVfcigpIG1ldGhvZCB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgYW55IGNvZGUsIG9ubHkgY29tcGlsaW5nCiAgaXMgbmVjZXNzYXJ5LiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgbmVlZCBvZiBoYXZpbmcgYSByZXNvbHZpbmcgJ2xvY2FsaG9zdCcKICBuYW1lLgoKLSBGb3VuZCBhbmQgcmVtb3ZlZCBtZW1vcnkgbGVha2FnZSAobmFtZSByZXNvbHZlIGRhdGEpIGluIGxpYmN1cmwgb24KICBJUHY2LWVuYWJsZWQgaG9zdHMuIFRoZXNlIGNvdWxkIHNuZWFrIHRocm91Z2ggYmVjYXVzZSB3ZSBkaWRuJ3QgaGF2ZSBhbnkKICByZXNvdXJjZSB0cmFjaW5nIG9uIHRoZSBJUHY2LXJlbGF0ZWQgZnVuY3Rpb25zLiBXZSBkbyBub3cuCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAxKQotIEtlaXRoIE1jR3VpZ2FuIHBhdGNoZWQgYXdheSBhIChtYWlubHkgV2luZG93cy0pIHByb2JsZW0gd2l0aCB0aGUgbmFtZQogIHJlc29sdmVyIGRhdGEgYmVpbmcga2VwdCBpbiB0aGUgc3RhdGljIG1lbW9yeSBhcmVhLCB3aGljaCBpcyByZW1vdmVkIHdoZW4gYQogIHRocmVhZCBpcyBraWxsZWQuIFRoZSBjdXJsIGhhbmRsZSBpdHNlbGYgdGhvdWdoIHBlcmZlY3RseSBoYW5kbGVzIGJlaW5nCiAgcGFzc2VkIGJldHdlZW4gdGhyZWFkcy4KCi0gRGlyayBFZGRlbGJ1ZXR0ZWwgcmVwb3J0ZWQgYW4gb2RkIGJ1ZyB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgaGlzIHByb3h5IHRoYXQKICByZXF1aXJlZCBhbiBBdXRob3JpemF0aW9uOiBoZWFkZXIuIE5vdywgcHJveGllcyBhcmUgbm90IHN1cHBvc2VkIHRvIHJlcXVpcmUKICB0aGF0IGhlYWRlciwgdGhhdCBpcyBmb3IgdHJ1ZSBzZXJ2ZXJzLi4uCgotIEkgYWNjaWRlbnRhbGx5IHJ1aW5lZCBHZW9yZydzIGN1cmxfZm9ybWFkZCgpLiBVaCwgYmFkIG1lLiBDb3JyZWN0ZWQgbm93LgoKVmVyc2lvbiA3LjkuMS1wcmUxCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlciBvbmNlIGFnYWluIG1hZGUgYW4gZWZmb3J0IGJleW9uZCB0aGUgY2FsbCBvZiBkdXR5IGFuZCBub3QKICBvbmx5IGltcHJvdmVkIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbiwgYnV0IGFsc28gdG9vayBjYXJlIG9mIGFkanVzdGluZwogIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBjbGllbnQgdG8gdXNlIHRoaXMgbmV3IGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlCiAgb2Jzb2xldGVkIGN1cmxfZm9ybXBhcnNlLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMSkKLSBNYWpvciBmaXggaW4gaG93IGxpYmN1cmwgZG9lcyBUQ1AgY29ubmVjdHMuIEl0IG5vdyBkb2VzIG5vbi1ibG9ja2luZwogIGNvbm5lY3RzIHRvIGVuYWJsZSBnb29kIHRpbWVvdXRzIHdpdGhvdXQgc2lnbmFscywgYW5kIGl0IG5vdyB0cmllcyBhbGwgSVAKICBhZGRyZXNzZXMgZm9yIGFueSBnaXZlbiBob3N0IChpZiBpdCByZXNvbHZlcyBtb3JlIHRoYW4gb25lIGFuZCB0aGUgZmlyc3QKICBvbmUocykgZG9uJ3QgY29ubmVjdCkuIEFkZGVkIGEgbmV3IHNvdXJjZSBmaWxlICdjb25uZWN0LmMnIHRvIGRlYWwgd2l0aCBhbGwKICB0aGUgVENQIGNvbm5lY3Qgc3R1ZmYuCgotIFdlIG5vdyBzdXBwb3J0IElQdjQtc3R5bGUgSVAtYWRkcmVzc2VzIGluIHJmYzI3MzItZm9ybWF0LCB0byBiZXR0ZXIgc3VwcG9ydAogIHBlb3BsZSB3cml0aW5nIHNjcmlwdHMgd2l0aG91dCBrbm93aW5nIHdoYXQgYWRkcmVzcyB0aGVyZSBpcy4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDEpCi0gQ2xlYW51cHMgaW4gdGhlIEZUUCBzb3VyY2UgY29kZS4gRGl2aWRlZCB0aGUgY29kZSBpbnRvIGV2ZW4gbW9yZSBzbWFsbGVyCiAgZnVuY3Rpb25zIGFuZCBnZW5lcmFsbHkgdHJpZWQgdG8gbWFrZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBJUHY0IGFuZCBJUHY2CiAgZ2V0IGxlc3Mgbm90aWNhYmxlIGluIHRoZSBzb3VyY2VzLgoKLSBJZiB0aGUgcmVtb3RlIGZpbGUgdGltZSBpcyBub3QgcmVhZGFibGUvYWNjZXNzYWJsZS91bmRlcnN0b29kIGJ5IGxpYmN1cmwsCiAgbGliY3VybCBub3cgcmV0dXJucyAtMSBpbiB0aGUgQ1VSTElORk9fRklMRVRJTUUgZGF0YSwgbm90IDAgYXMgaXQgcHJldmlvdXNseQogIGRpZC4gVGhpcyBzaG91bGQgbWFrZSBjdXJsIG5vdCB0b3VjaCB0aGUgZmlsZSBkYXRhIHVubGVzcyB0aGVyZSB3YXMgYSBrbm93bgogIHJlbW90ZSBkYXRlIHdoZW4gLVIgaXMgdXNlZC4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDEpCi0gV29ya2luZyBvbiBnZXR0aW5nIG5vbi1ibG9ja2luZyBjb25uZWN0cyB3b3JraW5nIHBsYXRmb3JtIGluZGVwZW5kZW50LiBXZQogIHdpbGwgYWxzbyBtYWtlIGN1cmwgdHJ5IGFsbCBJUHMgZm9yIGEgZ2l2ZW4gaG9zdCBpZiB0aGUgZmlyc3Qgb25lIHNob3VsZAogIGZhaWwuCgpEYW5pZWwgKDI2IFNlcHRlbWJlciAyMDAxKQotIEtldmluIFJvdGggcHJvdmlkZWQgYSBjb29raWUgZXhhbXBsZSB0aGF0IHByb3ZlZCB0aGUgY29va2llIGphcgogIGZ1bmN0aW9uYWxpdHkgd2Fzbid0IHdvcmtpbmcgcHJvcGVybHkuIEkgYWRkZWQgdGVzdCBjYXNlIDQ2IGFuZCBtYWRlIGl0CiAgd29yay4KCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDEpCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHRoZSBtaW5ndzMyIG1ha2VmaWxlcy4KClZlcnNpb24gNy45CgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAxKQotIEZvdW5kIGFuZCByZW1vdmVkIGEgJ3NvY2tldCBsZWFrJyB0aGF0IHdvdWxkIG9jY3VyIG9uIElQdjYgZW5hYmxlZCBob3N0cwogIHdoZW4gRlRQIFJFVFIgZmFpbGVkLgoKLSBNYWRlIHRoZSBGVFAgdXBsb2FkIHRlc3RzIHJ1biBmaW5lIG9uIG1hY2hpbmVzIHdpdGggSVB2NiBlbmFibGVkLgoKVmVyc2lvbiA3LjktcHJlOAoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMSkKLSBWb2p0ZWNoIE1pbmFyaWsgc2V0IHVwIGEgc3BlY2lhbC1wdXJwb3NlIHRlc3Qgc2VydmVyIGFuZCBwcm92aWRlZCBtZSB3aXRoCiAgdGVzdCBjZXJ0aWZpY2F0ZXMgaW4gb3JkZXIgZm9yIG1lIHRvIHJlcGVhdCB0aGUgYnVnIHJlcG9ydHMgIzQ0MDA2OCBhbmQKICAjNDQwMzczLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCBjaGVjayBhbGwgdGhlIGVycm9yIGNvZGVzIHByb3Blcmx5LiBXZSBkbwogIG5vdywgYW5kIGNvbm5lY3Rpbmcgd2l0aCBhIHVuYWNjZXB0YWJsZSBjZXJ0aWZpY2F0ZSB3aWxsIG1ha2UgbGliY3VybCBmYWlsCiAgdG8gY29ubmVjdCB3aXRoIGFuIGVycm9yIGNvZGUgcmV0dXJuZWQuCgotIFJhbWFuYSBNb2trYXBhdGkgZm91bmQgYSBjYXNlIHdoZW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgY29kZSBkaWQgd3JvbmcuCiAgSSB3cm90ZSBhIHRlc3QgY2FzZSBmb3IgdGhpcyAoNDUpLgoKVmVyc2lvbiA3LjktcHJlNwoKRGFuaWVsICgxNyBTZXB0ZW1iZXIgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGZpeGVkIHRlbG5ldCBmb3Igd2luMzIuIEl0IG1ha2VzIGxpYmN1cmwgcmVxdWlyZQogIHdpbnNvY2sgMi4wLgoKVmVyc2lvbiA3LjktcHJlNgoKLSBsaWJ0b29sIDEuNC4yIGlzIG5vdyBpbiB1c2UhCgpWZXJzaW9uIDcuOS1wcmU1CgpEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGFub3RoZXIgMTQgZnRwIHRlc3RzLgoKRGFuaWVsICgxMyBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgdG8gdGhlIGVhc3kuaCBoZWFkZXIgZmlsZS4gSXQgaGFzIG5vdyBiZWVuCiAgdGVzdGVkIGFuZCBwcm92ZWQgdG8gd29yayBpbiBhIHJlYWwtd29ybGQgdGVzdHMgYnkgVCBCaGFyYXRoLiBXZSBzdGlsbCBuZWVkCiAgdG8gd3JpdGUgdXAgc29tZSBkb2NzIGZvciB0aGlzIGZ1bmN0aW9uLgoKLSBBZGRlZCBmb3VyIG1vcmUgZnRwIHRlc3RzIHRvIHRoZSB0ZXN0IHN1aXRlLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIgMjAwMSkKLSBDVVJMT1BUX1NTTF9DSVBIRVJfTElTVCB3YXMgYWRkZWQsIGFuZCB0aGUgY3VybCB0b29sIG9wdGlvbiBpcyBuYW1lZAogIC0tY2lwaGVycy4gVXNlIHRoZW0gdG8gc3BlY2lmeSBhIGxpc3Qgb2YgY2lwaGVycyB0byB1c2UgaW4gdGhlIFNTTAogIGNvbm5lY3Rpb24uCgotIFQuIEJoYXJhdGggZm91bmQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsJ3Mgd2luZG93cyB2ZXJzaW9uLiBJdCB0dXJuZWQgb3V0CiAgdG8gYmUgdGhlIG5ldyBkdXBoYW5kbGUoKSB0aGF0IGRpZG4ndCBxdWl0ZSB3b3JrIHlldC4KClZlcnNpb24gNy45LXByZTQKCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdmVyYm9zZSBvdXRwdXQgZm9yIFNTTCBjb25uZWN0aW9ucyB0aGF0IG91dHB1dCB0aGUgc2VydmVyCiAgY2VydGlmaWNhdGUncyBzdGFydCBhbmQgZXhwaXJlIGRhdGVzLiBBcyBzdWdnZXN0ZWQgYnkgUGF1bCBIYXJyaW5ndG9uLgoKLSBIZWlra2kgS29ycGVsYSBmb3VuZCBwcm9ibGVtcyBpbiB0aGUgcGVybCBmdHAgc2VydmVyIHVzZWQgZm9yIHRoZSB0ZXN0CiAgc3VpdGUsIHdoZW4gaGUgcnVucyBvbiBvbiBPcGVuQlNEIHdpdGggcGVybCA1LjYuIFNvbWUgY2hhbmdlcyBoYXZlIGJlZW4KICBtYWRlLCBidXQgbm90aGluZyByZWFsbHkgY2VydGFpbi4KCi0gVC4gQmhhcmF0aCBoYXMgZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBsaWJjdXJsJ3Mgc3RhY2sgdXNhZ2Ugb24gd2luZG93cwogIGFuZCB3b3JrcyBvbiByZWR1Y2luZyBpdC4KCkRhbmllbCAoMTAgU2VwdGVtYmVyIDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBwZXJsIGludGVyZmFjZS4gSXQgc3RvcHBlZCB3b3JraW5nIHNpbmNlIHRoZSBjaGFuZ2VkCiAgYmVoYXZpb3Igd2l0aCBXUklURUhFQURFUiBhbmQgTlVMTCBwb2ludGVycy4KCi0gVGhlICJvdXRwdXQgY29va2llcyIgZnVuY3Rpb24gY291bGQgZHVtcCBjb3JlIGlmIG5vIGNvb2tpZXMgd2VyZSBlbmFibGVkLgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDAxKQotIFNNIHBvaW50ZWQgb3V0IHRoYXQgdGhlIFNTTCBjb2RlIGRpZG4ndCBjb21waWxlIGFueSBsb25nZXIgaWYgU1NMIHdhcwogIGRpc2FibGVkLi4uIEFsc28sIHdlIG5lZWRlZCB0byBjb3JyZWN0IHRoZSAjaW5jbHVkZSBmb3IgdGhlIHV0aW1lIHN0dWZmIG9uCiAgd2luZG93cy4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwMSkKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgU1NMIHNlc3Npb24gY2FjaGUgY29kZSB0aGF0IG1hZGUgaXQKICBzb21ldGltZXMgcmVhZCBmcm9tIGEgTlVMTCBwb2ludGVyLgoKVmVyc2lvbiA3LjktcHJlMwoKRGFuaWVsICgzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIHRoZSAtUi8tLXJlbW90ZS10aW1lIG9wdGlvbiwgdGhhdCB1c2VzIHRoZSByZW1vdGUgZmlsZSdzIGRhdGVzdGFtcCB0bwogIHNldCB0aGUgbG9jYWwgZmlsZSdzIGRhdGVzdGFtcC4gVGh1cywgd2hlbiB5b3UgZ2V0IGEgcmVtb3RlIGZpbGUgeW91ciBsb2NhbAogIGZpbGUgd2lsbCBnZXQgdGhlIHNhbWUgdGltZSBhbmQgZGF0ZS4gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3aGVuIHlvdSB1c2UKICAtbyBvciAtTy4KCi0gSW5zdGFsbGVkIGxpYnRvb2wgMS40LjEsIGxpYnRvb2xpemVkIGFuZCBldmVyeXRoaW5nLgoKRGFuaWVsICgxIFNlcHRlbWJlciAyMDAxKQotIEhlaWtraSBLb3JwZWxhIHBvaW50ZWQgb3V0IHRoYXQgSSBkaWQgbm90IHNoaXAgdGhlIHByb3BlciBsaWJ0b29sIHN0dWZmIGluIAogIHRoZSBwcmUtcmVsZWFzZXMsIGV2ZW4gdGhvdWdoIHRoYXQgd2FzIG15IGludGVudGlvbi4gbGlidG9vbGl6ZSBoYXMgbm93CiAgYmVlbiByZS1ydW4uCgotIEhlaWtraSBhbHNvIHBhdGNoZWQgYXdheSB0aGUgYmFkIHVzZSBvZiAnbWFrZSAtQycgaW4gdGhlIHRlc3Qgc3VpdGUKICBtYWtlZmlsZS4gbWFrZSAtQyBpcyBub3QgdmVyeSBwb3J0YWJsZSBhbmQgaXMgbm93IGJhbm5lZCBmcm9tIGhlcmUuCgpWZXJzaW9uIDcuOS1wcmUyCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAxKQotIEkganVzdCBtYWRlIGEgaHVnZSBpbnRlcm5hbCBzdHJ1Y3QgcmVoYXVsLCBhbmQgYWxsIHRoZSBiaWcgaW50ZXJuYWxseSB1c2VkCiAgc3RydWN0cyBoYXZlIGJlZW4gcmVuYW1lZCwgcmVkZXNpZ25lZCBhbmQgc3R1ZmYgaGF2ZSBiZWVuIG1vdmVkIGFyb3VuZCBhIGJpdAogIHRvIG1ha2UgdGhlIHNvdXJjZSBlYXNpZXIgdG8gZm9sbG93LCBtb3JlIGxvZ2ljYWxseSBncm91cGVkIGFuZCB0byBob3BlZnVsbHkKICBkZWNyZWFzZSBmdXR1cmUgYnVncy4gSSBhbHNvIGhvcGUgdGhhdCB0aGlzIHdpbGwgbWFrZSBuZXcgZnVuY3Rpb25zIHRvIGdldAogIGVhc2llciB0byBhZGQsIGFuZCBtYWtlIGl0IGxlc3MgbGlrZWx5IHRoYXQgd2UgaGF2ZSBidWdzIGxlZnQgbGlrZSB0aGUgVVJMLQogIGZyZWUgYnVnIGZyb20gQXVndXN0IDIzLgoKVmVyc2lvbiA3LjktcHJlMQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwMSkKLSBUaGUgbmV3IGNvb2tpZSBjb2RlIGhhdmUgZW5hYmxlZCB0aGUgYnJhbmQgbmV3ICctYy8tLWNvb2tpZS1qYXInIG9wdGlvbi4gVXNlCiAgdGhhdCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgaW4gd2hpY2ggeW91IHdhbnQgdG8gaGF2ZSBhbGwgY29va2llcyBjdXJsCiAga25vd3Mgb2YsIGR1bXBlZCB0by4gSXQnbGwgYmUgd3JpdHRlbiB1c2luZyB0aGUgbmV0c2NhcGUgY29va2llIGZvcm1hdC4KCiAgVGhpcyBpcyBpbnRlcm5hbGx5IGRvbmUgd2l0aCB0aGUgbmV3IENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiB0byBsaWJjdXJsLAogIHdoaWNoIGluIHR1cm4gZHVtcHMgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGN1cmxfZWFzeV9jbGVhbnVwKCkgaXMgaW52b2tlZC4KICBUaGVyZSBtaWdodCBiZSByZWFzb25zIHRvIHJlLWNvbnNpZGVyIG15IGNob2ljZSBvZiBwdXR0aW5nIGl0IHRoZXJlLiBQZXJoYXBzCiAgaXQgaXMgYmV0dGVyIHBsYWNlZCB0byBnZXQgZG9uZSBqdXN0IGJlZm9yZSAqX3BlcmZvcm0oKSBpcyBkb25lLiBJdCBpcyBhbGwKICBvZiBjb3Vyc2UgZGVwZW5kaW5nIG9uIGhvdyB5b3UgZ3V5cyB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUuLi4KCi0gQWRkZWQgZnRwdXBsb2FkLmMgaW4gdGhlIHNvdXJjZSBleGFtcGxlcyBzZWN0aW9uLCBiYXNlZCBvbiBzb3VyY2UgY29kZSBwb3N0ZWQKICBieSBFcmljayBOdXdlbmRhbS4KCkRhbmllbCAoMjggQXVndXN0IDIwMDEpCi0gTm93IHJ1bm5pbmcgbGlidG9vbCBDVlMgYnJhbmNoLTEtNCB0byBnZW5lcmF0ZSBzdHVmZi4gU2hvdWxkIGZpeCBwcm9ibGVtcwogIG9uIE9wZW5CU0QgYW5kIGhvcGVmdWxseSBvbiBGcmVlQlNEIGFzIHdlbGwhCgotIEdlb3JnIEh1ZXR0ZW5lZ2dlciBtb2RpZmllZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb25hbGl0eSBzbGlnaHRseSwgYW5kCiAgYWRkZWQgc3VwcG9ydCBmb3IgZXJyb3IgY29kZSA0MTcgd2hlbiBkb2luZyBmb3JtIHBvc3QgYW5kIHVzaW5nIHRoZSBFeHBlY3Q6CiAgaGVhZGVyLiBHcmVhdCB3b3JrIQoKLSBNYWRlIHNvbWUgdGVzdHMgd2l0aCBjYWNoZWQgU1NMIHNlc3Npb24gSURzLCBhbmQgdGhleSBzZWVtIHRvIHdvcmsuIFRoZXJlCiAgc2hvdWxkIGJlIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQgaW4gdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlLCBidXQKICBpbiBteSB0aW55IHRlc3RzIGl0IGp1c3QgaXNuJ3QgcG9zc2libGUgdG8gbm90aWNlIGFueSBkaWZmZXJlbmNlLiBMaWtlIG90aGVyCiAgY2FjaGluZyBpbiBsaWJjdXJsLCB5b3UgbXVzdCByZXVzZSB0aGUgc2FtZSBoYW5kbGUgZm9yIHRoZSBjYWNoaW5nIHRvIHRha2UKICBlZmZlY3QuIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgaXMgZG9uZSBvbiBhIHBlciBob3N0LW5hbWUgYW5kIGRlc3RpbmF0aW9uCiAgcG9ydCBudW1iZXIgYmFzaXMuCgogIFNldCB2ZXJib3NlLCBhbmQgeW91J2xsIGdldCBpbmZvcm1hdGlvbmFsIHRlc3RzIHdoZW4gbGliY3VybCBkZXRlY3RzIGFuZAogIHVzZXMgYSBwcmV2aW91cyBTU0wgc2Vzc2lvbiBJRC4KCi0gVXBncmFkZWQgdG8gYXV0b21ha2UgMS41IG9uIG15IGRldmVsb3BtZW50L3JlbGVhc2UgbWFjaGluZS4KCkRhbmllbCAoMjcgQXVndXN0IDIwMDEpCi0gU2xvd2x5IHN0YXJ0ZWQgd3JpdGluZyBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGNvZGUKCkRhbmllbCAoMjQgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCByZW1vdmVkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHdpbmRvd3MgYW5kIHVwZGF0ZWQgdGhlIE1TIHByb2plY3QKICBmaWxlcy4KCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0d28ga2luZHMgb2YgY29tbWFuZCBsaW5lIGNvbnN0cnVjdHMgd2l0aCB0aGUgbmV3IC1HIHRoYXQKICBjdXJsIGRpZG4ndCByZWFsbHkgZGVhbCB3aXRoIHRoZSB3YXkgb25lIHdvdWxkIGxpa2UuCgotIFRpbSBDb3N0ZWxsbyBwYXRjaGVkIGF3YXkgYSB1c2Ugb2Ygc3RyY2FzZWNtcCgpIGluIHRoZSBTU0wgY29kZS4gV2UgaGF2ZSBvdXIKICBvd24gcG9ydGFibGUgdmVyc2lvbiBuYW1lZCBzdHJlcXVhbCgpIHRoYXQgc2hvdWxkIGJlIHVzZWQhCgotIFRpbSBhbHNvIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlLnZjNiBmaWxlIHRoYXQgbWFkZSBpdCBtaXgKICBkZWJ1ZyBvYmplY3QgbW9kdWxlcyBjYXVzaW5nIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggYWNjdXJhdGVseSBmb3VuZCBhIGxpYmN1cmwgYnVnIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gZG9pbmcgYQogIHNlY29uZCBpbnZva2Ugb2YgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRoIGEgbmV3IFVSTCB3aGVuIHRoZSBwcmV2aW91cyBpbnZva2UKICBmb2xsb3dlZCBhIExvY2F0aW9uOiBoZWFkZXIuCgotIFN0YXJ0ZWQgdGhlIGltcHJvdmVtZW50IHdvcmsgb24gdGhlIGNvb2tpZSBlbmdpbmU6CiAgLSBOb3cga2VlcHMgY29va2llcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgY29va2llIGZpbGUKICAtIEEgd3JpdGUgdG8gdGhlIHBvc3NpYmx5IHN0YXRpYyBzdHJpbmcgd2FzIHJlbW92ZWQKICAtIEFkZGVkIGEgZnVuY3Rpb24gdGhhdCBjYW4gb3V0cHV0IGFsbCBjb29raWVzCiAgLSBOb3cgc3VwcG9ydHMgcmVhZGluZyBtdWx0aXBsZSBjb29raWUgZmlsZXMKCi0gU3RldmUgTGhvbW1lIGNvcnJlY3RlZCBhIERMTCBuYW1pbmcgaXNzdWUgaW4gdGhlIE1TVkMrKyBwcm9qZWN0IGZpbGUuCgotIFNwbGl0IHVwIHRoZSBtb25zdGVyIGZ1bmN0aW9uIGluIGxpYi9mdHAuYyB0byB1c2UgbW9yZSBzbWFsbGlzaCBmdW5jdGlvbnMgdG8KICBpbmNyZWFzZSByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIncyBiaWcgcGF0Y2ggd2FzIGFwcGxpZWQuIE5vdyB3ZSBoYXZlOgogIG8gIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBzdXBwb3J0LiBXZSB3aWxsIGZyb20gbm93IG9uIHNlbmQgdGhhdCBoZWFkZXIgaW4KICAgIGFsbCByZmMxODY3LXBvc3RzLCBhcyB0aGF0IG1ha2VzIHVzIGFib3J0IG11Y2ggZmFzdGVyIHdoZW4gdGhlIHNlcnZlcgogICAgcmVqZWN0cyBvdXIgUE9TVC4gUG9zdGluZyB3aXRob3V0IHRoZSBFeHBlY3Q6IGhlYWRlciBpcyBzdGlsbCBwb3NzaWJsZSBpbgogICAgdGhlIHN0YW5kYXJkIHJlcGxhY2UtaW50ZXJuYWwtaGVhZGVyIHN0eWxlLgogIG8gY3VybF9mb3JtYWRkKCkgaXMgYSBuZXcgZm9ybXBvc3QgYnVpbGRpbmcgZnVuY3Rpb24gdGhhdCBpcyBpbnRyb2R1Y2VkIHRvCiAgICByZXBsYWNlIHRoZSBub3cgZGVwcmVjYXRlZCBjdXJsX2Zvcm1wYXJzZSgpIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIGZ1bmN0aW9uCiAgICB3aWxsIHN0aWxsIGhhbmcgYXJvdW5kIGZvciBhIHdoaWxlLCBidXQgdGhlIGN1cmxfZm9ybWFkZCgpIGlzIHRoZSBuZXcgd2F5CiAgICBhbmQgY29ycmVjdCB3YXkgdG8gYnVpbGQgZm9ybSBwb3N0cy4KICBvIERvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoZXNlIGNoYW5nZXMKCiAgVGhlc2UgY2hhbmdlcyBhcmUgcmVhc29uIGVub3VnaCB0byBuYW1lIHRoZSBuZXh0IGN1cmwgcmVsZWFzZSA3LjkuLi4KCi0gV2Ugbm93IGNvbnZlcnQgbWFuIHBhZ2VzIHRvIEhUTUwgcGFnZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB0aGUgcmVsZWFzZQogIGFyY2hpdmUuIEZvciB0aGUgcGxlYXN1cmUgb2YgZXZlcnlvbmUgd2l0aG91dCBucm9mZiB3aXRoaW4gcmVhY2guCgotIEFuZHLpcyBHYXJj7WEncyBzdWdnZXN0ZWQgZmx1c2hpbmcgb2YgdGhlIHByb2dyZXNzIG1ldGVyIG91dHB1dCBzdHJlYW0gd2FzCiAgYWRkZWQuIEl0IHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciBsb29rIGJldHRlciBvbiBXaW5kb3dzLgoKLSBUcm95IEVuZ2VsIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbAogIG9uIG1hbnkgUmVkIEhhdCBib3hlcyEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gV2UgbmVlZCBhbiB1cGRhdGVkIGxpYnRvb2wgdG8gbWFrZSBhIGJldHRlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgT3BlbkJTRAogIGFzIHdlbGwgYXMgRnJlZUJTRAoKVmVyc2lvbiA3LjguMQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBCcmFkIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hpcCB0d28gZXh0cmEgbGlidG9vbCBmaWxlcyBpbiB0aGUgdGFyYmFsbHMgdGhhdAogIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvISBSZW1vdmluZyB0aGVtIG1ha2VzIHRoZSBnei1hcmNoaXZlIGFib3V0IDYwSwogIHNtYWxsZXIhCgotIEFsYmVydCBDaGluIGJyb3VnaHQgZml4ZXMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzb2NrbGVuX3QKICBwcm9wZXJseSBhcyB3ZWxsIGFzIG1vdmluZyBsb3RzIG9mIG91ciBjdXN0b20gYXV0b2NvbmYgbWFjcm9zIHRvCiAgYWNpbmNsdWRlLm00LgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwMSkKLSBNb29uZXNhbXkgaW1wcm92ZWQgaGlzIC1HIGZlYXR1cmUgZm9yIGhvc3QgbmFtZXMgb25seSBVUkxzLi4uCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAxKQotIEZpbmFsbHkgY2xlYW5lZCB1cCB0aGUga2VyYmVyb3MgY29kZSB0byB1c2UgQ3VybF8gcHJlZml4ZXMgb24gYWxsIGdsb2JhbAogIHN5bWJvbHMgYW5kIHRvIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4KClZlcnNpb24gNy44LjEtcHJlNgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgYWRkZWQgdGhlIC1HIG9wdGlvbiB0byBjdXJsLCB0aGF0IGNvbnZlcnRzIHRoZSBkYXRhIHNwZWNpZmllZAogIHdpdGggLWQgdG8gYSBHRVQgcmVxdWVzdC4gRGVmYXVsdCBhY3Rpb24gd2hlbiB1c2luZyAtZCBpcyBQT1NULiBXaGVuIC1HIGlzCiAgdXNlZCwgdGhlIC1kIHNwZWNpZmllZCBkYXRhIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIFVSTCB3aXRoIGEgJz8nCiAgc2VwYXJhdG9yLiBBcyBzdWdnZXN0ZWQgcHJldmlvdXNseSBieSBLZXZpbiBSb3RoLgoKLSBjdXJsLWNvbmZpZyAtLWxpYnMgc2hvdWxkIG5vdyBkaXNwbGF5IGFsbCBsaW5rZXIgb3B0aW9ucyByZXF1aXJlZCB0byBsaW5rCiAgd2l0aCBsaWJjdXJsLiBJdCBpbmNsdWRlcyB0aGUgcGF0aCBhbmQgb3B0aW9ucyBmb3IgbGliY3VybCBpdHNlbGYuCiAgY3VybC1jb25maWcgLS1jZmxhZ3MgZGlzcGxheXMgdGhlIGNvbXBpbGVyIG9wdGlvbihzKSBuZWVkZWQgdG8gY29tcGlsZQogIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSBsaWJjdXJsIGZ1bmN0aW9ucy4gQmFzaWNhbGx5LCB0aGF0IHNldHMgdGhlIGluY2x1ZGUKICBwYXRoIGNvcnJlY3QuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAxKQotIEFya2FkaXVzeiBNaXNraWV3aWN6IHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiBob3cgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMKICB3ZXJlIHBhcnNlZCBhbmQgdXNlZC4gKFJGQzI3MzItZm9ybWF0KQoKLSBCdWcgIzEyNzMzIG92ZXIgb24gcGhwLm5ldCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBsaWJjdXJsIHRoYXQgbWFkZSBpdCBjb3JlCiAgZHVtcCBpZiB5b3UgdXNlZCBDVVJMT1BUX1BPU1Qgd2l0aG91dCBzZXR0aW5nIGFueSBkYXRhIHRvIHBvc3Qgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyEgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuIE5vdCB1c2luZyBDVVJMT1BUX1BPU1RGSUVMRFMKICBub3cgZXF1YWxzIHNldHRpbmcgaXQgdG8gbm8gZGF0YSBhdCBhbGwuCgotIFJhbWFuYSBNb2trYXBhdGkgcmVwb3J0ZWQgdGhhdCBjdXJsIHdpdGggJy13ICV7aHR0cF9jb2RlfScgZGlkbid0IHdvcmsKICBwcm9wZXJseSB3aGVuIHVzZWQgZm9yIG11bHRpcGxlIFVSTHMgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lLiBJbmRlZWQsIHRoZQogIHZhcmlhYmxlIHdhcyBub3QgcmVzZXQgYmV0d2VlbiB0aGUgcmVxdWVzdHMuIFRoaXMgaXMgbm93IGZpeGVkLgoKLSBEYXZpZCBKYW1lcyBmaXhlZCB0aGUgQm9ybGFuZCBtYWtlZmlsZSBzbyB0aGF0IGxpYmN1cmwgc3RpbGwgY29tcGlsZXMgYW5kCiAgYnVpbGRzIHdpdGggdGhhdCBjb21waWxlci4KCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gT29wcy4gSSBydWluZWQgTmljbydzIHNvY2tsZW5fdCBkZWZpbmUgaW4gY29uZmlnLXZtcy5oLCBjb3JyZWN0ZWQgaXQgbm93LgoKLSBBbiBvbGRlciBpdGVtIG5vdCBtZW50aW9uZWQgaGVyZSBiZWZvcmU6IENVUkxfR0xPQkFMX1dJTjMyIGlzIGEgZGVmaW5lIGZvcgogIHdpbmRvd3MgdXNlcnMgdG8gY3VybF9nbG9iYWxfaW5pdCgpLCB0aGF0IG1ha2VzIGxpYmN1cmwgaW5pdCB0aGUgd2luc29jawogIHN0dWZmLiBJZiBsaWJjdXJsIGlzIGFsbCBzb2NrZXQgc3R1ZmYgeW91IGRvLCB0aGVuIGFsbG93aW5nIGl0IHRvIGZpZGRsZQogIHdpdGggdGhpcyBpcyBhIGNvbWZvcnRhYmxlIHNob3J0Y3V0IHRvIGZhbWUuCgpWZXJzaW9uIDcuOC4xLXByZTUKCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgbW9yZSBmZWVkYmFjayBmcm9tIGhpcyBWTVMgcG9ydGluZyBlZmZvcnRzIGFuZCBhIGZldwogIG1pbm9yIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnkuCgotIEkgbW9kaWZpZWQgY29uZmlndXJlLmluIHNvIHRoYXQgLS1lbmFibGUtZGVidWcgc2V0cyBtb3JlIHBpY2t5IGdjYyBvcHRpb25zLgogIEkgdGhlbiByZW1vdmVkIGFsbW9zdCBhbGwgdGhlIG5ldyB3YXJuaW5ncyB0aGF0IGFwcGVhcmVkLCBhbmQgYnkgZG9pbmcgc28gSQogIGNvcnJlY3RlZCB0aGUgc2l6ZV90LXRyZWF0ZWQtYXMtc2lnbmVkIHByb2JsZW0gdGhhdCBoYXMgYmVlbiBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0IHByZXZpb3VzbHkuIEkgYWxzbyByZW1vdmVkIGEgYnVuY2ggb2YgdGhlIGp1c3QgcmVjZW50bHkKICBhZGRlZCAjaWZkZWYgVk1TIGxpbmVzLgoKLSBJIHJlbW92ZWQgdGhlIHVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgU1NMIGNvZGUuIEl0IHdhcyBvbmNlCiAgbmVjZXNzYXJ5IGJ1dCBoYXNuJ3QgYmVlbiBuZWVkZWQgc2luY2UgT3BlblNTTCAwLjkuNC4gVGhlIG9sZCBjb2RlIHNob3VsZAogIChob3BlZnVsbHkpIHN0aWxsIHdvcmsgaWYgbGliY3VybCBpcyBidWlsdCBhZ2FpbnN0IGFuIGFuY2llbnQgdmVyc2lvbiBvZgogIE9wZW5TU0wuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDAxKQotIFBldGVyIFRvZGQgcG9zdGVkIGEgcGF0Y2ggdGhhdCBub3cgYWxsb3dzIG5vbi1maWxlIHJjMTg2Ny1zdHlsZSBmb3JtIHBvc3RzCiAgdG8gYmUgbGFyZ2VyIHRoYW4gNEsuCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBmaXhlZCBidWdzIGZvciBidWlsZGluZyBkZWJ1ZyBhbmQgU1NMIGxpYiBpbiBWQyBtYWtlZmlsZQoKRGFuaWVsICg5IEF1Z3VzdCAyMDAxKQotIFRoZSByZWRpcmVjdGVkIGVycm9yIHN0cmVhbSB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY3VybF9lYXN5X2NsZWFudXAoKSBjYWxsCiAgd2FzIG1hZGUsIGFuZCB3aGVuIFZFUkJPU0Ugd2FzIGVuYWJsZWQsIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIHRyaWVkIHRvIHVzZQogIHRoZSBzdHJlYW0uIEl0IGNvdWxkIGxlYWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQuIEFsc28sIHRoZSBzdHJlYW0gd2FzCiAgY2xvc2VkIGV2ZW4gaWYgd2UgbG9vcGVkIHRvIGdldCBtb3JlIGZpbGVzLiAgQ29ycmVjdHMgRHVzdGluIEJvc3dlbGwncyBidWcKICByZXBvcnQgIzQ0MTYxMAoKLSBOb3cgZ2VuZXJhdGVzIHRoZSByZWxlYXNlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCBhdXRvY29uZiAyLjUyCgpWZXJzaW9uIDcuOC4xLXByZTQKCkRhbmllbCAoOCBBdWd1c3QgMjAwMSkKLSBjdXJsIC1FIHVzZXMgYSBjb2xvbiB0byBzZXBhcmF0ZSBhIGZpbGUgbmFtZSBmcm9tIGEgcGFzc3BocmFzZS4gVGhpcyB0dXJuZWQKICBvdXQgcmVhbGx5IGJhZCBmb3IgdGhlIHdpbmRvd3MgcGVvcGxlIHdobyB3YW50cyB0byBpbmNsdWRlIGEgZHJpdmUgbGV0dGVyIGluCiAgdGhlIGZpbGUgbmFtZSBsaWtlICJjOlxjZXJ0LnBlbSIuIFRoZXJlJ3Mgbm93IGEgd2luMzIgd29yay1hcm91bmQKICBpbXBsZW1lbnRlZCB0aGF0IHRyaWVzIHdvcmsgYXJvdW5kIHRoYXQsIHdoZW4gdGhlIGNvbG9uIHNlZW1zIHRvIGJlIHVzZWQgZm9yCiAgdGhpcyBraW5kIG9mIGNvbnN0cnVjdC4KCi0gUGF0cmljayBCaWhhbi1GYW91IGludHJvZHVjZWQgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgd2hpY2ggbWFrZXMgY3VybAogIHZlcmlmeSB0aGUgc2VydmVyJ3MgQ04gZmllbGQgd2hlbiB0YWxraW5nIGh0dHBzOi8vLiBJZiAtLWNhY2VydCBpcyBub3QgdXNlZCwKICBhbnkgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgaXMgb25seSBkaXNwbGF5ZWQgYXMgaW5mb3JtYXRpb24gKC12KS4KCkRhbmllbCAoNyBBdWd1c3QgMjAwMSkKLSBXcm90ZSB1cCBuaW5lIG1vcmUgdGVzdCBjYXNlcywgbW9yZSBvciBsZXNzIGNvbnZlcnRlZCBmcm9tIHRoZSBmb3JtZXIgdGVzdAogIHN1aXRlLgoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEhlaWtraSBLb3JwZWxhIHBvc3RlZCBhIHBhdGNoIHRoYXQgbWFrZXMgJ2N1cmwtY29uZmlnIC0tbGlicycgaW5jbHVkZSB0aGUKICBkaXJlY3RvcnkgaW4gd2hpY2ggbGliY3VybCBpdHNlbGYgaXMgaW5zdGFsbGVkIGluLiBXaGlsZSB0aGlzIHdhc24ndCBteQogIGluaXRpYWwgaW50ZW50aW9uIHdpdGggdGhpcyBvcHRpb24sIGl0IG1ha2VzIHNlbnNlIGFuZCBtYWtlcyBsaW5raW5nIHdpdGgKICBsaWJjdXJsIGVhc2llci4KCi0gU3RlZmFuIFVscmljaCBwb2ludGVkIG91dCB0byB1cyB0aGF0IG90aGVyIHRvb2xzIGFuZCBsaWJyYXJpZXMgdHJlYXQgZmlsZTovLwogIFVSTHMgd2l0aCBvbmx5IG9uZSBzbGFzaCBhZnRlciB0aGUgaG9zdCBuYW1lIHNsaWdobHkgZGlmZmVyZW50IHRoYW4gbGliY3VybAogIGRvZXMuIFNpbmNlIGFsbCB0aGUgb3RoZXJzIHNlZW0gdG8gYWdyZWUsIHdlIGJldHRlciBmb2xsb3cgdGhlbS4KCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgdXMgd2l0aCBhIGh1Z2Ugc2V0IG9mIGZpeGVzIHRvIG1ha2UgY3VybCBjb21waWxlIGFuZAogIGJ1aWxkIHVuZGVyIE9wZW5WTVMuCgpWZXJzaW9uIDcuOC4xLXByZTMKCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBKb25hdGhhbiBIc2V1IG5vdGljZWQgdGhhdCB5b3UgY291bGRuJ3QgZ2V0IGEgaGVhZGVyIGNhbGxiYWNrIHVubGVzcyB5b3UKICBzZXQgQ1VSTE9QVF9XUklURUhFQURFUiB0byBub24tTlVMTCwgZXZlbiBpZiB5b3UgZGlkbid0IGNhcmUgYWJvdXQgdGhhdAogIGRhdGEuIFRoaXMgaXMgbm93IGZpeGVkLgoKRGFuaWVsICg1IEF1Z3VzdCAyMDAxKQotIFNlcmdpbyBCYWxsZXN0cmVybyBwcm92aWRlZCBhIHBhdGNoIGZvciByZWFkaW5nIHJlc3BvbnNlcyBmcm9tIE5DU0EgaHR0cGQKICAxLjUueCBzZXJ2ZXJzLCBhcyB0aGV5IHJldHVybiByZWFsbHkgc2NyZXdlZCB1cCByZXNwb25zZSBoZWFkZXJzIHdoZW4gYXNrZWQKICBmb3Igd2l0aCBIVFRQIDEuMS4KCi0gY3VybF9lc2NhcGUoKSBubyBsb25nZXIgdHJlYXRzIGFscmVhZHkgZW5jb2RlZCBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dAogIHN0cmluZyBlc3BlY2lhbGx5LgoKRGFuaWVsICgzIEF1Z3VzdCAyMDAxKQotIEkgcmVwbGFjZWQgdGhlIGZvcm1lciBsaWIvYXJwYV90ZWxuZXQuaCBmaWxlIHdpdGggb25lIEkgd3JvdGUgbXlzZWxmLCB0bwogIGF2b2lkIHRoZSBCU0QgYW5ub3VjZW1lbnQgY2xhdXNlIG9mIHRoZSBsaWNlbnNlIGluIHRoZSBmb3JtZXIgZmlsZS4KCi0gQW5kcmV3IEZyYW5jaXMgcHJvdmlkZWQgYSBuZXcgdmVyc2lvbiBvZiBiYXNlNjQuYyB0byB3b3JrIGFyb3VuZCB0aGUgbGljZW5zZQogIGJvaWxlciBwbGF0ZSB0aGF0IGNhbWUgd2l0aCB0aGUgcHJldmlvdXMgb25lLiBJIHBhdGNoZWQgaXQsIGJ1dCB0aGUgZ2xvcnkKICBzaG91bGQgZ28gdG8gQW5kcmV3IGZvciBoaXMgaGVhZHMgdXAuCgotIFRvbWFzeiBMYWNraSBub3RpY2VkIHRoYXQgd2hlbiB5b3UgZG8gcmVwZWF0ZWQgdHJhbnNmZXJzIHdpdGggbGliY3VybCB5b3UKICBjb3VsZG4ndCBhbHdheXMgcmVsaWFibHkgY2hhbmdlIEhUVFAgcmVxdWVzdC4gVGhpcyBoYXMgbm93IGJlZW4gZml4ZWQgYW5kIGEKICBuZXcgbGliY3VybCBvcHRpb24gd2FzIGFkZGVkOiBDVVJMT1BUX0hUVFBHRVQsIHRoYXQgY2FuIGZvcmNlIHRoZSBIVFRQCiAgcmVxdWVzdHIgKGJhY2spIHRvIEdFVC4KCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBwb2ludGVkIG91dCB0aGF0IGh0dHBzc2VydmVyLnBsIHdhc24ndCBpbmNsdWRlZCBpbgogIHJlbGVhc2UgYXJjaGl2ZXMuIEl0IHNob3VsZCBiZSBub3cuCgpEYW5pZWwgKDIgQXVndXN0IDIwMDEpCi0gRnJhbmsgS2VlbmV5IHBvaW50ZWQgb3V0IGEgbWFudWFsIG1pc3Rha2UgZm9yIGNlcnRpZmljYXRlIGNvbnZlcnRpb25zLgoKLSBUb21hc3ogTGFja2kgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSB0cmFuc2ZlciBsb29wIHRoYXQgY291bGQgbWFrZSB0aGUKICBzZWxlY3QoKSBsb29wIHVzZSBmYXIgdG9vIG11Y2ggQ1BVLgoKLSBQYXdlbCBBLiBHYWpkYSBwb2ludGVkIG91dCBhbiBvdXRwdXQgbWlzdGFrZSBkb25lIHdoZW4gdXNpbmcgbGliY3VybCdzCiAgcHJvZ3Jlc3MgY2FsbGJhY2suCgpEYW5pZWwgKDI5IEp1bmUgMjAwMSkKLSBOYXZlZW4gTm9lbCBub3RpY2VkIHRoYXQgdGhlIEJvcmxhbmQgbGlicmFyeSBtYWtlZmlsZSB3YXNuJ3QgdXBkYXRlZC4KCi0gTmljIFJvZXRzIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBTU0wuCgpEYW5pZWwgKDI3IEp1bmUgMjAwMSkKLSBNYWRlIHRoZSBGVFAgdGVzdHMgcnVuIE9LIGV2ZW4gb24gbWFjaGluZXMgcnVubmluZyBjdXJsIElQdjYtZW5hYmxlZC4KCi0gVHJveSBFbmdlbCBjb3JyZWN0ZWQgc29tZSBSUE0gcGFja2FnZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjguMS1wcmUyCgpEYW5pZWwgKDI1IEp1bmUgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBjb3JyZWN0bHkgaWRlbnRpZmllZCBhIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvd25sb2FkaW5nCiAgc2V2ZXJhbCBmaWxlcyB3aXRoIGN1cmwsIGFuZCB1c2luZyByZXN1bWUuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIGluZGV4IHdhcwogIHRoZW4gdXNlZCBmb3IgYWxsIGZpbGVzLCByZXN1bHRpbmcgaW4gd2VpcmQgcmVzdWx0cy4uLgoKLSBBbnRvbiBLYWxteWtvdiBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGN1cmwgd29yayB3aXRoIGZvcm0gZmllbGQgbmFtZXMKICB3aXRoIHNwYWNlcyBsaWtlIHdoZW4gLUYgaXMgdXNlZC4KClZlcnNpb24gNy44LjEtcHJlMQoKRGFuaWVsICgyMCBKdW5lIDIwMDEpCi0gTWlrZSBCeXRuYXIgcHJvdmlkZWQgYSBmaW5lIHJlcG9ydCB0aGF0IHByb3ZlZCB0aGF0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbgogIGZvciBjb25maWd1cmUgbmVlZGVkIHR3ZWFraW5nLiBJdCBubyBsb25nZXIgc2VhcmNoZXMgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMKICBmb3IgT3BlblNTTCBsaWJzIG9yIGRpcmVjdG9yaWVzIHdoZW4gYSBzcGVjaWZpZWQgcGF0aCBpcyBnaXZlbi4KCkRhbmllbCAoMTkgSnVuZSAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIGlzIGN1dCBvZmYgZHVyaW5nIHRyYW5zZmVyLCBjdXJsIGNvdWxkIHByZXNlbnQgYSB0cnVseQogIGdhcmJhZ2VkIGVycm9yIG1lc3NhZ2UgYW5kIGluIHdvcnN0IGNhc2UgZHVtcCBjb3JlLiBUaGFua3MgdG8gZGV0YWlsZWQKICByZXBvcnRzIGZyb20gU2hhd24gUG91bHNvbiB3ZSBuYWlsZWQgdGhpcy4KCkRhbmllbCAoMTIgSnVuZSAyMDAxKQotIFNhbHZhZG9yIEThdmlsYSBwcm92aWRlZCBhIGZpeCBmb3IgRlRQIHJhbmdlIGRvd25sb2Fkcy4KCi0gQWRkZWQgYSBmZXcgbW9yZSB0ZXN0IGNhc2VzIGZyb20gdGhlIGZvcm1lciB0ZXN0IHN1aXRlIHRvIHRoZSBuZXcgZmlsZQogIGZvcm1hdC4gV2UncmUgbm93IGF0IGEgdG90YWwgb2YgMjYgdGVzdHMuCgpEYW5pZWwgKDExIEp1bmUgMjAwMSkKLSBsaWJjdXJsJ3MgdmVyc2lvbi1pbmZvIHdhcyB3cm9uZywgYXMgbm90ZWQgYnkgYm90aCBEb21lbmljbyBBbmRyZW9saSBhbmQKICBEYXZpZCBPZGluLgoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBK9nJuIGZpeGVkIHRoZSBjdXJsX3VuZXNjYXBlIGR1cGxpY2F0ZSBlbnRyeSBpbiBsaWIvbGliY3VybC5kZWYKCi0gSSBtYWRlIFNTTCBjZXJ0aWZpY2F0ZSBmYWlsdXJlIG1lc3NhZ2VzIHRvIGJlIG1vcmUgZGV0YWlsZWQuCgpWZXJzaW9uIDcuOAoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBTRGF2aWxhIHByb3ZpZGVkIGEgcmVzdW1lZCBkb3dubG9hZCBmaXguCgpWZXJzaW9uIDcuOC1wcmU0CgpEYW5pZWwgKDEgSnVuZSAyMDAxKQotIFN0ZXJsaW5nIHByb3ZpZGVkIHNvbWUgbmV3IFBIUCBleGFtcGxlcy4KCi0gQ2hhbmdlZCB0aGUgQ1ZTIGhpZXJhcmNoeSBhbmQgdGhlIG9sZGVyIGNoZWNrb3V0IGluc3RydWN0aW9uIGRvZXMgbm8gbG9uZ2VyCiAgd29yay4gV2UgbW92ZWQgdGhlIGVudGlyZSBzb3VyY2UgY29kZSBpbnRvIGEgQ1ZTIG1vZHVsZSBuYW1lZCAnY3VybCcuCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIENVUkxPUFRfTVVURSBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJdCBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUKICB0byBub3QgY2F1c2UgY29tcGlsZXIgZXJyb3JzIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgaXQsIGJ1dCBpdCBpc24ndCB1c2VkCiAgYW55d2hlcmUgaW4gdGhlIGxpYnJhcnkuCgpWZXJzaW9uIDcuOC1wcmUzCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIE9uY2UgYW5kIGZvciBhbGwgZml4ZWQgdGhlIF9SRUVOVFJBTlQgbWVzcyBmb3IgU29sYXJpcyBjb21waWxlcyB0byBwcmVzZW50CiAgbGVzcyB3YXJuaW5ncy4KCi0gU3RlcmxpbmcgSHVnaGVzIHRpcmVsZXNzbHkgcG9pbnRzIG91dCBhbmQgY29ycmVjdHMgbXkgbWlzdGFrZXMuLi4hIFNvLAogIGN1cmxfZ2xvYmFsX2luaXQoKSBub3cgbGV0cyB0aGUgYXJndW1lbnQgZmxhZ3MgKlNFVCogd2hhdCBwYXJ0cyB0bwogIGluaXQuIENVUkxfR0xPQkFMX0RFRkFVTFQgbWFrZXMgYSBuaWNlIGRlZmF1bHQsIENVUkxfR0xPQkFMX0FMTCBpbml0cyBhbGwKICBrbm93biBzdWJzeXN0ZW1zIGFuZCBDVVJMX0dMT0JBTF9OT05FIGluaXRzIG5vdGhpbmcgbW9yZSB0aGFuIGFic29sdXRlbHkKICBuZWNlc3NhcnkuIE1hbiBwYWdlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHRoZSBzdHJ0b2suaCBpbmNsdWRlIGZpbGUgYXMgaXQgd291bGRuJ3QgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zIQoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBNYWRlIGxpYmN1cmwgYnkgZGVmYXVsdCBhY3QgYXMgaWYgQ1VSTE9QVF9NVVRFIGFuZCBDVVJMT1BUX05PUFJPR1JFU1Mgd2VyZQogIHNldCBUUlVFLiBTZXQgdGhlbSB0byBGQUxTRSB0byBtYWtlIGxpYmN1cmwgbW9yZSB0YWxrYXRpdmUuIFRoZSAqX01VVEUKICBvcHRpb24gaXMgc3ViamVjdCBmb3IgY29tcGxldGUgcmVtb3ZhbC4uLgoKVmVyc2lvbiA3LjgtcHJlMgoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgd3JvdGUgYSBtYWtlZmlsZSBmb3IgYnVpbGRpbmcgU29sYXJpcyBwYWNrYWdlcy4KCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgZml4ZXMgZm9yICdidWlsZGNvbmYnICh0aGUgYnVpbGQtZnJvbS1DVlMgdG9vbCkgYW5kCiAgd2UgZGlzY3Vzc2VkIGFuZCBhZGRlZCBhIGZldyBDVVJMX0dMT0JBTF8qIGZsYWdzIGluIGluY2x1ZGUvY3VybC5oCgotIEtqZXRpbCBKYWNvYnNlbiBwcml2YXRlbHkgYW5ub3VuY2VkIGhpcyBweXRob24gaW50ZXJmYWNlIHRvIGxpYmN1cmwsCiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weWN1cmwuc291cmNlZm9yZ2UubmV0LwoKRGFuaWVsICgyOSBNYXkgMjAwMSkKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBzdHJ0b2soKSBwcm9ibGVtIGluIGxpYmN1cmwuIEl0IGlzIG5vdCBhIHRocmVhZC0KICBzYWZlIGZ1bmN0aW9uLiBOb3cgY29uZmlndXJlIGNoZWNrcyBmb3IgYSB0aHJlYWQtc2FmZSB2ZXJzaW9uLCBhbmQKICBsaWIvc3RydG9rLmMgb2ZmZXJzIG9uZSBmb3IgdGhlIHN5c3RlbXMgdGhhdCBkb24ndCBjb21lIHdpdGggb25lIGluY2x1ZGVkIQoKLSBNZXR0Z3V0IEphbWFsbGEgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3YXMgd3JpdHRlbgogIHRvIHN0ZGVyciBldmVuIHRob3VnaCAtLXN0ZGVyciByZWRpcmVjdGlvbiB3YXMgdXNlZC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJIG1vdmVkIG91dCB0aGUgbGlzdCBvZiBjb250cmlidXRvcnMgZnJvbSB0aGUgY3VybC4xIG1hbiBwYWdlIGFuZCBtYWRlIGEKICBzZXBhcmF0ZSBkb2NzL1RIQU5LUyBmaWxlLiBJdCBtYWtlcyB0aGUgbGlzdCBlYXNpZXIgdG8gZmluZCwgYW5kIG1hZGUgaXQKICBlYXNpZXIgZm9yIG1lIHRvIG1ha2UgYSBzZXBhcmF0ZSB3ZWIgcGFnZSB3aXRoIHRoYXQgc2FtZSBpbmZvcm1hdGlvbi4KCiAgSSByZWFsbHkgZG8gd2FudCBhbGwgeW91IGd1eXMgbWVudGlvbmVkIGluIHRoZXJlIHRvIGZlZWwgeW91IGdldCB0aGUgY3JlZGl0CiAgeW91IGRlc2VydmUuCgotIGxpYi9lYXN5LmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgaW4gdGhlIDcuOC1wcmUxIGR1ZSB0byBhIHNpbGx5IG1pc3Rha2UKClZlcnNpb24gNy44LXByZTEKCkRhbmllbCAoMjggTWF5IDIwMDEpCi0gY3VybC1jb25maWcgbm93IHN1cHBvcnRzICctLXZlcm51bScgdGhhdCBvdXRwdXRzIGEgcGxhaW4gaGV4YWRlY2ltYWwgdmVyc2lvbgogIG9mIHRoZSBsaWJjdXJsIHZlcnNpb24gbnVtYmVyICh1c2luZyA4IGJpdHMgZm9yIGVhY2ggMyBudW1iZXJzKS4gVmVyc2lvbgogIDcuNy40IGFwcGVhcnMgYXMgMDcwNzA0CgotIFdyb3RlIG1hbiBwYWdlcyBmb3IgY3VybF9nbG9iYWxfaW5pdCBhbmQgY3VybF9nbG9iYWxfY2xlYW51cC4uLgoKLSBULiBCaGFyYXRoIGJyb3VnaHQgbmV3cyBhYm91dCB0aGUgdXNhZ2Ugb2YgdGhlIE9wZW5TU0wgaW50ZXJmYWNlIHRoYXQgd2FzCiAgbm90IHByZXZpb3VzbHkgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGFuZCB0aHVzIGNhdXNlZCBsaWJjdXJsIHRvIGxlYWsKICBtZW1vcnkuICBUaGUgb25seSBzb21ld2hhdCBzYW5lIGFwcHJvYWNoIHRvIGZpeCB0aGlzIGRpbGVtbWEsIGlzIGFkZGluZyB0d28KICB0d28gbmV3IGZ1bmN0aW9ucyBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAoKSB0aGF0IHNob3VsZAogIGJlIGNhbGxlZCAqT05DRSogYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmN1cmwuIFRoZSBpbml0IHNob3VsZCBiZSBkb25lCiAgb25seSBhdCBzdGFydHVwLCBubyBtYXR0ZXIgaG93IG1hbnkgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMgZ29ubmEgdXNlLAogIGFuZCB0aGUgY2xlYW51cCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCB1c2luZwogIGxpYmN1cmwgY29tcGxldGVseS4KCiAgKioqIFVQR1JBREUgTk9USUNFICoqKgoKICBJZiB5b3Ugd3JpdGUgYXBwbGljYXRpb25zIHVzaW5nIGxpYmN1cmwsIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhlIHR3bwogIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUgISEhCgogIEkgY2FuJ3Qgc2F5IEkgdGhpbmsgdGhpcyBpcyBhIHZlcnkgYmVhdXRpZnVsIHNvbHV0aW9uLCBidXQgYXMgT3BlblNTTAogIGluc2lzdHMgb24gbWFraW5nIGxvdHMgb2Ygc3R1ZmYgb24gYSAiZ2xvYmFsIiBzY29wZSwgd2UncmUgZm9yY2VkIHRvIHdhbGsKICB0aGUgcGF0aCB0aGV5IHBvaW50IHVzIHRvLgoKLSBNb3ZpbmcgbW9yZSB0ZXN0IGNhc2VzIGludG8gdGhlIG5ldyBmaWxlIGZvcm1hdC4KClZlcnNpb24gNy43LjQtcHJlMwoKRGFuaWVsICgyMyBNYXkgMjAwMSkKLSBJbnRyb2R1Y2VkIGEgbmV3IGZpbGUgZm9ybWF0IGZvciBzdG9yaW5nIHRlc3QgY2FzZXMsIGFuZCB0aHVzIEkgaGFkIHRvCiAgbW9kaWZ5IGFsbCB0aGUgcGVybCB0ZXN0IHNjcmlwdHMgYW5kIG1vcmUgKEkgYWRkZWQgYSBuZXcgb25lKS4gSSBoYXZlIG5vdAogICJwb3J0ZWQiIGFsbCB0aGUgb2xkIHRlc3QgY2FzZXMgdG8gdGhlIG5ldyBmb3JtYXQgeWV0LCBidXQgaXQnbGwgY29tZS4KCiAgVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZvcm1hdCBpcyB0aGF0IGFsbCB0ZXN0IGRhdGEgZm9yIGVhY2ggdGVzdAogIGNhc2UgaXMgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuIEl0IGdpdmVzIGEgYmV0dGVyIG92ZXJ2aWV3IGZvciBlYWNoIHRlc3QKICBjYXNlIGFuZCBhIGxvdCBsZXNzIGZpbGVzLgoKLSBBbmRy6XMgR2FyY+1hIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBuZXRzY2FwZS9tb3ppbGxhIGNvb2tpZSBmaWxlIHBhcnNpbmcKICBmdW5jdGlvbiwgYXMgaXQgdHVybnMgb3V0IGl0IGRvZXNuJ3QgYWx3YXlzIHN0b3JlIHRoZSBwYXRoIQoKRGFuaWVsICgyMiBNYXkgMjAwMSkKLSBBcyB3YXMgcmVwb3J0ZWQgYW5vbnltb3VzbHksIHdoZW4gRkFJTE9ORVJST1Igd2FzIHVzZWQsIHRoZSBodHRwY29kZSB3YXMKICBub3Qgc3RvcmVkIHByb3Blcmx5IGFuZCB0aHVzIHdhc24ndCBwb3NzaWJseSB0byByZWFkIGFmdGVyIGEgdHJhbnNmZXIgd2l0aAogIHRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZ1bmN0aW9uLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEluc3RhbGxlZCBhbmQgbWFkZSB1c2Ugb2YgdGhlIGZvbGxvd2luZyB0b29sIHZlcnNpb25zOgogICAgYXV0b2NvbmYgMi41MAogICAgbGlidG9vbCAxLjQKICAgIGF1dG9tYWtlIDEuNC1wMQoKICBJIHdvdWxkbid0IHJlY29tbWVuZCBhbnkgZGV2ZWxvcGVyIHRvIHRyeSB0byBnZW5lcmF0ZSB0aGluZ3Mgd2l0aCBvbGRlcgogIHZlcnNpb25zIHRoYW4gdGhlc2UuIEJ1aWxkaW5nIGZyb20gQ1ZTIHdpbGwgcHJvYmFibHkgbW9yZSBvciBsZXNzIHJlcXVpcmUKICBhdCBsZWFzdCB0aGVzZSB2ZXJzaW9ucy4KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZ3JldyB0byBtb3JlIHRoYW4gZG91YmxlIGl0cwogIHByZXZpb3VzIHNpemUhCgogIEFya2FkaXVzeiBNaXNraWV3aWN6IGhlbHBlZCBtZSBieSBwb2ludGluZyBvdXQgSSBoYWQgdG8gcmVtb3ZlIG15CiAgYWNpbmNsdWRlLm00IGZpbGUgYmVmb3JlIEkgY291bGQgZ2V0IGl0IHdvcmtpbmchCgpEYW5pZWwgKDIxIE1heSAyMDAxKQotIEkgbWFkZSBmdHBzOi8vIHdvcmsuIEFkZGVkIHRlc3QgY2FzZSA0MDAgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgYXMgdGhlCiAgZmlyc3QgZnRwczovLyB0ZXN0IGNhc2UuIFJlcXVpcmVzIHN0dW5uZWwuCgotIEFsc28gbWFkZSB0aGUgdGVzdCBjYXNlcyB0aGF0IHJ1bnMgc3NsIHRlc3RzIG5vdCBydW4gaWYgbGliY3VybCBpc24ndCBidWlsdAogIHdpdGggc3NsIHN1cHBvcnQuCgpEYW5pZWwgKDE5IE1heSAyMDAxKQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBub3QgYWRkIGFueSBleHRyYSAtTCBMREZMQUdTIG9yIC1JIENQUEZMQUdTIHVubGVzcyB0aGV5CiAgYXJlIGFjdHVhbGx5IG5lZWRlZC4gQWxiZXJ0IENoaW4ncyBhbmQgRG9tZW5pY28gQW5kcmVvbGkncyBzdWdnZXN0aW9ucwogIGhlbHBlZCBvdXQuCgpWZXJzaW9uIDcuNy40LXByZTIKCkRhbmllbCAoMTggTWF5IDIwMDEpCi0gTmljZXIgY29uZmlndXJlLWNoZWNrIGZvciB0aGUgT3BlblNTTCBoZWFkZXJzLCB3aGljaCB0aGVuIHNldHMgdGhlIHByb3BlcgogIHZhcmlhYmxlIHRvIGhhdmUgY3VybC1jb25maWcgYmUgZ29vZC4gKEFsYmVydCBDaGluIHByb3ZpZGVkIHRoZSBmaXgpCgotIEZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpdyBvd24gJ3N0cmxjYXQoKScgbGliY3VybCBwcm92aWRlcyBpdHMgb3duLgogIEl0IHdhcyBub3cgcmVuYW1lZCB0byBwcmV2ZW50IGNvbGxpZGVzIHdpdGggb3RoZXIgbGlicy4gKEFmdGVyIGRpc2N1c3Npb25zCiAgd2l0aCBTdGVybGluZyBIdWdoZXMgYW5kIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYWQgb24gUEhQIGJ1aWxkcy4pCgpEYW5pZWwgKDE3IE1heSAyMDAxKQotIENvbG0gQnVja2xleSBwb3N0ZWQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IG9uICh0aGUgZGViaWFuaXplZCkgNy43LjMsIHRoYXQKICB0dXJuZWQgb3V0IHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWJpYW4tYnVpbHQgNy43LjMtcGFja2FnZSB0aGF0CiAgY29udGFpbmVkIGZpbGVzIGZyb20gdGhlIDcuNy4yIHJlbGVhc2UhCgotIEkgYWRkZWQgdGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgYWdhaW4sIGJ1dCB3aXRoIGEgZmFrZSB2YWx1ZSwganVzdCB0bwogIG1ha2UgcHJvZ3JhbXMgdGhhdCB1c2UgaXQsIG5vdCBmYWlsIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgdGhpcyB2ZXJzaW9uIG9mCiAgbGliY3VybC4KCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gUGF3ZWwgQS4gR2FqZGEgZml4ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCB0cmFuc2ZlcnMgb24gcmUtdXNlZCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMuCgpWZXJzaW9uIDcuNy40LXByZTEKCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpeGVkIEZUUCBQT1JUIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybC4KCi0gQWRkZWQgdGhlIGZpcnN0IEhUVFBTIHRlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTIgTWF5IDIwMDEpCi0gSnVra2EgUGlobCBzdWdnZXN0ZWQgdGhhdCBpZiAobGliKWN1cmwgaXMgdG9sZCB0byB2ZXJpZnkgdGhlIHBlZXIncwogIGNlcnRpZmljYXRlIGFuZCB0aGUgcGVlciBjYW4ndCBiZSB2ZXJpZmllZCwgaXQgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBhCiAgcHJvcGVyIGVycm9yIGNvZGUuIEkgYWRkZWQgYSBicmFuZCBuZXcgZXJyb3IgY29kZSBuYW1lZAogIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDExIE1heSAyMDAxKQotIEFzIHdhcyBkaXNjdXNzZWQgd2l0aCBGcmVkZXJpYyBMZXBpZWQgYSB3aGlsZSBhZ28sIEkgbm93IG1hZGUgbGliY3VybCBub3QKICByZXR1cm4gZXJyb3IgZXZlbiB0aG91Z2ggbm8gZGF0YSB3YXMgdHJhbnNmZXJlZCBvbiB1cGxvYWQvZG93bmxvYWQgcmVzdW1lCiAgd2hlbiB0aGUgbm8gdHJhbnNmZXIgaXMgbmVlZGVkLiBUaGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBlcnJvciB3YXMgcmVtb3ZlZAogIGZyb20gdGhlIGhlYWRlciBmaWxlIHRvIG1ha2UgYW55IGltcGxlbWVuYXRvciB0aGF0IHVzZXMgdGhhdCB0byBiZSBhd2FyZSBvZgogIHRoZSBmYWN0IHRoYXQgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgYW55bW9yZSEKCi0gSW1wcm92ZWQgZ2VuZXJhbCBoZWFkZXItcGFyc2luZyB0byBiZXR0ZXIgYWxsb3cgd2hpdGUgc3BhY2VzIGFuZCBtb3JlLgoKLSBSb2RuZXkgU2ltbW9ucyBwcm92ZWQgdGhlIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgd2FzIGJhZCBhbmQgSSBoYWQgdG8gcG9zdAogIGFub3RoZXIgb25lLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgdHdvIHJlZGlyZWN0IHByb2JsZW1zIG1vcmUhCiAgCkRhbmllbCAoMTAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGNvcnJlY3RseSBub3RlZCB0aGF0IHRoZSBzcGFjZS1hZnRlci1oZWFkZXIgcHJvYmxlbSB3aXRoCiAgTG9jYXRpb246IGlzIHByZXNlbnQgb24gc2V2ZXJhbCBvdGhlciBwbGFjZXMgaW4gdGhlIGxpYmN1cmwgc291cmNlcy4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IGEgcHJvYmxlbSBsaWJjdXJsIGhhZCB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICBoZWFkZXJzIHdpdGggYW4gZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uLgoKLSBSb2RuZXkgU2ltbW9ucyBmb3VuZCBvdXQgdGhhdCBtdWx0aXBsZSBGVFAgdHJhbnNmZXJzIGRpZCBub3QgdHJlYXQgcmVsYXRpdmUKICBkaXJlY3RvcmllcyBjb3JyZWN0bHkuCgpEYW5pZWwgKDkgTWF5IDIwMDEpCi0gR2V0dGluZyBhbiBGVFAgZmlsZSB3aXRoIENVUkxPUFRfTk9CT0RZIHNldCAob3IgLUkgZnJvbSB0aGUgY29tbWFuZCBsaW5lKSwKICBtYWtlcyBjdXJsIHVzZSB0aGUgbm9uLXN0YW5kYXJkIGZ0cCBjb21tYW5kICJTSVpFIi4gSWYgaXQgZmFpbGVkLCBsaWJjdXJsCiAgcmV0dXJuZWQgZXJyb3IuIFN0YXJ0aW5nIG5vdywgaXQganVzdCBkb24ndCBvdXRwdXQgdGhlIGZpbGUgc2l6ZSBpbnN0ZWFkLgogIEFub255bW91cyBidWcgcmVwb3J0LgoKLSBzdHVubmVsLnBtIHdhcyBhY2NpZGVudGFsbHkgbGVmdCBvdXQgZnJvbSB0aGUgcmVsZWFzZSBhcmNoaXZlLCBpdCBpcyBub3cKICBhZGRlZCAoc3R1bm5lbCBpcyBuZWVkZWQgdG8gcnVuIHRoZSBodHRwcy10ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSkKICAKRGFuaWVsICg3IE1heSAyMDAxKQotIENvcnJlY3RlZCB0d28gbWlub3IgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRoZSBGSUxFICogdG8gdm9pZCAqIGNvbnZlcnNpb24KICB0aGF0IEkgbWlzc2VkIGF0IHR3byBwbGFjZXMuIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBwYXRjaGVzLiBTYW5kZXIgR2F0ZXMKICBmaWxlZCBhIGJ1ZyByZXBvcnQgb24gdGhpcy4KClZlcnNpb24gNy43LjMKCkRhbmllbCAoNCBNYXkgMjAwMSkKLSBBbGwgY2FsbGJhY2sgZnVuY3Rpb25zIG5vdyB0YWtlICd2b2lkIConIGluc3RlYWQgb2YgJ0ZJTEUgKicuIFRoaXMgaXMgbWFkZQogIHRoaXMgd2F5IHRvIG1ha2UgaXQgbW9yZSBvYnZpb3VzIHRvIHBlb3BsZSB0aGF0IGFueXRoaW5nIGNhbiBiZSBwYXNzZWQgdG8KICB0aGVtIChieSB1c2luZyB0aGUgYXByb3ByaWF0ZSBvcHRpb24pLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFN0ZXJsaW5nCiAgSHVnaGVzLgoKRGFuaWVsICgzIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHRoYXQgbWFkZSBsaWJjdXJsIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB1c2VkIG1peGVkCiAgY2h1bmtlZCBhbmQgbm9uLWNodW5rZWQgdHJhbnNmZXJzLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBiYWQgdHJlYXRtZW50IG9mIDMwNC1yZXBsaWVzLCBhcyB0aGV5IHdvdWxkIG5vdCBiZQogIHRyZWF0ZWQgYXMgY29udGVudC1sZW5ndGggMCByZXBsaWVzIGJ1dCB3b3VsZCBjYXVzZSBhICJoYW5nIiB1bnRpbCB0aGUKICBzZXJ2ZXIgdGltZWQtb3V0IGFuZCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGRvY3MvZXhhbXBsZXMvTWFrZWZpbGUuYW0KCkRhbmllbCAoMjcgQXByaWwgMjAwMSkKLSBVcGRhdGVkIHRoZSBJTlRFUkFMUyBkb2N1bWVudCBhZ2Fpbi4gSXQgd2FzIGxhZ2dpbmcgYSBiaXQuIEkgdGhpbmsgSSBtYWRlIGl0CiAgbW9yZSBlYXN5IHRvIGZvbGxvdyBub3cgYXMgd2VsbC4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBjdXJsIHJlY2VpdmVkCiAgYSAiQ29udGVudC1MZW5ndGg6IDAiIGhlYWRlci4KCi0gR2l1c2VwcGUgRCdBbWJyb3NpbyB3YXMgZmlyc3Qgb3V0IHRvIHJlcG9ydCB0aGF0IFRFTE5FVCBkb2Vzbid0IHdvcmsgaW4gY3VybAogIGNvbXBpbGVkL2J1aWx0IG9uIHdpbjMyLiBJdCBzZWVtcyB0byB3b3JrIGZvciB1bml4ZXMgdGhvdWdoIQoKLSBEYXZlIEhhbWlsdG9uIHJlcG9ydGVkIHdlaXJkIHByb2JsZW1zIHdpdGggQ1VSTC9QSFAgdGhhdCBJIHJlYWxseSBjYW4ndAogIGV4cGxhaW4gYXQgdGhlIG1vbWVudC4gSSdtIGhvcGluZyBvbiBzb21lIGhlbHAgZnJvbSB0aGUgUEhQIGNyZXcuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDEpCi0gSSByZXdyb3RlIHRoZSBGVFAgY29tbWFuZCByZXNwb25zZSBmdW5jdGlvbi4gSSBoYWQgdG8gZG8gaXQgdG8gbWFrZSBmdHBzCiAgd29yaywgYXMgdGhlIE9wZW5TU0wgcmVhZCgpLWZ1bmN0aW9uIGRpZG4ndCB3b3JrIHRoZSBzYW1lIHdheSB0aGUgbm9ybWFsCiAgdW5peCByZWFkKCkgZG9lcywgYnV0IGl0IHdhcyBhbHNvIGEgaHVnZSBwZXJmb3JtYW5jZSBib29zdC4gUHJldmlvdXNseSB0aGUKICBmdW5jdGlvbiByZWFkIG9uZSBieXRlIGF0IGEgdGltZSwgbm93IGl0IHJlYWRzIHZlcnkgbGFyZ2UgY2h1bmtzLCBhbmQgaXQKICBtYWtlcyBhIG5vdGFibGUgc3BlZWQgZGlmZmVyZW5jZS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMSkKLSBDb25uZWN0aW9uIHJlLXVzZSB3aGVuIG5vdCB1c2luZyBhIHByb3h5IGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvcgogIG5vbi1kZWZhdWx0IHBvcnQgbnVtYmVycy4KCkRhbmllbCAoMjQgQXByaWwgMjAwMSkKLSBJJ3ZlIG5vdGljZWQgdGhhdCBGVFBTIGRvZXNuJ3Qgd29yay4gV2UgYXR0ZW1wdCB0byB1c2Ugc3NsIGV2ZW4gZm9yIHRoZQogIGRhdGEgdHJhbnNmZXIsIHdoaWNoIGNhdXNlcyB0aGUgdHJhbnNmZXIgdG8gJ2hhbmcnLi4uIFdlIG5lZWQgdG8gZml4IHRoaXMuCgotIEltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIHVzZSAnc3R1bm5lbCcgdG8gZG8gSFRUUFMgYW5kIEZUUFMgdGVzdGluZyBvbgogIHRoZSBhbHJlZHkgd3JpdHRlbiBwZXJsIHNlcnZlcnMgZWFzaWx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDAxKQotIFRoZSBPcGVuU1NMIHZlcnNpb24gc3RyaW5nIHJlY2VudGx5IG1vZGlmaWVkIGRpZG4ndCB6ZXJvIHRlcm1pbmF0ZSBvbmUKICBvZiB0aGUgZ2VuZXJhdGVkIHN0cmluZ3MgcHJvcGVybHksIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjcmFzaCBvciBzaW1wbHkKICB3ZWlyZCB2ZXJzaW9uIHN0cmluZyBvdXRwdXQhCgpWZXJzaW9uIDcuNy4yCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDEpCi0gUm9zaW1pbGRvIGRhIFNpbHZhIHVwZGF0ZWQgdGhlIE1ha2VmaWxlcyBmb3IgQm9ybGFuZC9XaW5kb3dzLgoKLSBFcmljIFJhdXRtYW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB0aGF0IHdvdWxkCiAgbGVhZCB0byBicm9rZW4gSG9zdDogaGVhZGVycyBpbiB0aGUgc2Vjb25kIEhUVFAgcmVxdWVzdC4KCkRhbmllbCAoMjAgQXByaWwgMjAwMSkKLSBBZGRlZCBtYW4gcGFnZXMgZm9yIHRoZSBjdXJsX3N0cmVxdWFsKCkgYW5kIGN1cmxfbXByaW50ZigpIGZhbWlsaWVzLiBXcm90ZQogIGEgJ2xpYmN1cmwgb3ZlcnZpZXcnIG1hbiBwYWdlLgoKLSBTcGVsbC1maXhlZCBzb21lIGRvY3VtZW50cy4KCi0gUy4gTW9vbmVzYW15IGNvcnJlY3RlZCBtaXN0YWtlcyBpbiB0aGUgbWFuIHBhZ2UuCgotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgY3VybF9zbGlzdHMgb3B0aW9ucyBpbiB0aGUgcGVybCBpbnRlcmZhY2UsIHByZXNlbnQKICBzZXBhcmF0ZWx5IGluIHRoZSBDdXJsOjplYXN5IDEuMS40IHBhY2thZ2UuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZW1vdmVkIHRoZSBkZWNpbWFscyBmcm9tIHRoZSBzaXplIHZhcmlhYmxlcyBpbiB0aGUKICAtLXdyaXRlLW91dCBvdXRwdXQuIFdlIGhhcmRseSBldmVyIGdldCBmcmFjdGlvbiBvZiBieXRlcyEgOi0pCgpWZXJzaW9uIDcuNy4yLXByZTEKCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggZm9yIHRoZSBBQ19TWVNfTEFSR0VGSUxFIG1hY3JvLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAxKQotIElucHV0IGZyb20gTWljaGFlbCBNZWFsbGluZyBtYWRlIG1lIGFkZCAtLWZlYXR1cmUgdG8gY3VybC1jb25maWcuIEl0CiAgZGlzcGxheXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LWluIGluIHRoZSBjdXJyZW50CiAgbGliY3VybC4gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZmVhdHVyZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGFyZTogU1NMLCBLUkI0CiAgYW5kIElQdjYuCgotIEkgY29tbWl0dGVkIENyaXMgYW5kIEdlb3JnJ3MgcGVybCBpbnRlcmZhY2Ugd29yay4gVGhleSd2ZSBnb3QgY2FsbGJhY2tzCiAgd29ya2luZyBhbmQgb3B0aW9ucyB0aGF0IHJlY2VpdmVzIHRob3NlIHNsaXN0IHBvaW50ZXJzLgoKLSBQdW5lZXQgUGF3YWlhIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgZG93bmxvYWRzIHRoYXQgdXNlIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucyBhbmQgSSBtYWRlIGEgcmF0aGVyIGxhcmdlIHdyaXRldXAgdG8gY29ycmVjdCB0aGlzLiBJdCBpcwogIGltcG9ydGFudCB0aGF0IGFsbCBzZXNzaW9uLWRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYW5kIG5vdAogIGluIHRoZSBtYWluIHN0cnVjdCBhcyB0aGlzIHByZXZpb3VzbHkgZGlkLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAxKQotIEZyZWRlcmljIExlcGllZCBmaXhlZCBhIGZ0cCByZXN1bWVkIGRvd25sb2FkIHByb2JsZW0gYW5kIGludHJvZHVjZWQgYSBuZXcKICBlcnJvciBjb2RlIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBhIHJlc3VtZWQgZG93bmxvYWQKICBhY3R1YWxseSBkaWRuJ3QgZG93bmxvYWQgYW55dGhpbmcgc2luY2UgdGhlIHdob2xlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50LgogIFNob3VsZCB0aGlzIHJldHVybiBPSyBpbnN0ZWFkPwoKLSBJIGFkZGVkICdjdXJsLWNvbmZpZy5pbicgdG8gdGhlIHJvb3QgZGlyIGFuZCBjb25maWd1cmUgc2NyaXB0LiBOb3csIGEKICBjdXJsLWNvbmZpZyBzY3JpcHQgaXMgbWFkZSB3aGVuIGN1cmwgaXMgYnVpbHQuIFRoZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8KICBmaWd1cmUgb3V0IGNvbXBpbGUgdGltZSBvcHRpb25zIHVzZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCwgd2hpY2ggaW4gdHVybgogIHNob3VsZCBiZSBvcHRpb25zIFlPVSBzaG91bGQgdXNlIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBsaWJjdXJsLgoKICBUaGlzICotY29uZmlnIHN0eWxlIGlzIG5vdCBhIG5ldyBpZGVhLCBidXQgc29tZXRoaW5nIHRoYXQgaGFzIGJlZW4gdXNlZAogIHN1Y2Nlc3NmdWxseSBpbiBvdGhlciAobGlicmFyeSBiYXNlZCkgcHJvamVjdHMuCgotIFBoaWwgS2FybiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd3JvbmdseSBkaWQgbm90IGFsd2F5cyB1c2UgR01UIHRpbWUgem9uZQogIGZvciB0aGUgSWYtTW9kaWZpZWQtU2luY2Ugc3R5bGUgaGVhZGVycy4KCi0gR2VvcmcgU2Nod2FyeiBwb2ludGVkIG91dCBhbiBleHRyYSBuZWVkZWQgI2luY2x1ZGUgZmlsZSBuZWVkZWQgaW4gc3JjL21haW4uYwogIGZvciBjdXJsIHRvIGJ1aWxkIG9uIFVsdHJpeC4KCkRhbmllbCAoMTEgQXByaWwgMjAwMSkKLSBDcmlzIEJhaWxpZmYgcG9pbnRlZCBvdXQgdHdvIHByb2JsZW1zIHRoYXQgSSBjb3JyZWN0ZWQuIEZpcnN0LCBsaWJjdXJsJ3MgdXNlCiAgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhUVFBfUFJPWFkgaW4gdXBwZXJjYXNlIG1heSBiZWNvbWUgYSBzZWN1cml0eQogIGhhemFyZCB3aGVuIHBlb3BsZSB1c2UgbGliY3VybCBpbiBhIHNlcnZlci9jZ2kgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZXJ2ZXIKICBzZXRzIHRoZSBIVFRQXyotdmFyaWFibGVzIGFjY29yZGluZyB0byBpbmNvbWluZyBoZWFkZXJzIGluIHRoZSBIVFRQCiAgcmVxdWVzdC4gVGh1cywgYSAiUHJveHk6Ii1oZWFkZXIgd291bGQgc2V0IHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUhCgogIFRoZW4sIGludm9raW5nIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aG91dCBoYXZpbmcgYW4gVVJMIHNldCBjYXVzZWQgYSBjcmFzaC4KCi0gUy4gTW9vbmVzYW15IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgY3VybCB1c2Ugbm9uLWJsb2NraW5nIGNvbm5lY3RzIG9uCiAgd2luZG93cyB3aGVuIGNvbm5lY3Rpb24gdGltZW91dCBpcyBzZXQsIGFzIGl0IGFsbG93cyB3aW5kb3dzIHVzZXJzIHRvIHNldAogIHRoYXQgdGltZW91dCEKCi0gSGlyb3Rha2EgTWF0c3V5dWtpIHdyb3RlIGEgUnVieSBpbnRlcmZhY2UgdG8gbGliY3VybCEKCi0gQ3JpcyBCYWlsaWZmLCBGb3JyZXN0IENhaG9vbiBhbmQgR2VvcmcgSG9ybiB3b3JrIG9uIHRoZSBQZXJsIGludGVyZmFjZS4KCi0gSSd2ZSB3cml0dGVuIGEgZmlyc3Qgc2hvdCBhdCBhIEphdmEgaW50ZXJmYWNlIHRvIGxpYmN1cmwuIE1hbnkgdGhhbmtzIHRvCiAgRGFuaWVsIE1hcmVsbCBmb3IgdGlyZWxlc3NseSBhbnN3ZXJpbmcgdG8gYWxsIG15IGJhc2ljIEphdmEgcXVlc3Rpb25zLiBJdAogIHdvcmtzLCBidXQgaXQgaXMgc3RpbGwgdmVyeSBiYXNpYy4KCkRhbmllbCAoMTAgQXByaWwgMjAwMSkKLSBUaGUgcHJvZ3Jlc3MgZGlzcGxheSBjb3VsZCBnZXQgc2lsbHkgd2hlbiBkb2luZyBtdWx0aXBsZSBmaWxlIHRyYW5zZmVycywgYXMKICBpdCB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiB0cmFuc2ZlcnMhCgotIERpc2N1c3Npb25zIHdpdGggQ3JpcyBCYWlsaWZmIHdobyB3cml0ZXMgYSBQZXJsIGludGVyZmFjZSB0byBsaWJjdXJsLCBtYWRlCiAgbWUgYWRkIENVUkxPUFRfSEVBREVSRlVOQ1RJT04uIEl0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHNlcGFyYXRlIGNhbGxiYWNrCiAgZnVuY3Rpb24gZm9yIHdyaXRpbmcgaGVhZGVycy4gUHJldmlvdXNseSB5b3UgY291bGQgb25seSBzZXQgYSBkaWZmZXJlbnQgRklMRQogICogd2hlbiBoZWFkZXJzIGFyZSB3cml0dGVuIGZyb20gd2l0aGluIGxpYmN1cmwuCgpEYW5pZWwgKDcgQXByaWwgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiBjdXJsX2VzY2FwZSgpIGFuZCBwb2ludGVkIG91dCBhIGZsYXcgaW4KICB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZS4KCkRhbmllbCAoNiBBcHJpbCAyMDAxKQotIEFkanVzdGVkIHRoZSB2ZXJzaW9uIGNvZGUgdG8gcHJvcGVybHkgZGlzcGxheSBPcGVuU1NMIDAuOS42YS4gVGhleSBzdXJlCiAgY2hhbmdlIHRoZWlyIHZlcnNpb24gZGVmaW5lIGZvcm1hdCBvZnRlbi4uLgoKLSBjdXJsX2Zvcm1mcmVlKCkgbm93IGFjY2VwdHMgYSBOVUxMIHBvaW50ZXIgd2l0aG91dCBjcmFzaGluZyEKClZlcnNpb24gNy43LjEKCkRhbmllbCAoMyBBcHJpbCAyMDAxKQotIFB1bmVldCBQYXdhaWEgcG9pbnRlZCBvdXQgdHdvIHNlcmlvdXMgcHJvYmxlbXMuIExpYmN1cmwgd291bGQgYXR0ZW1wdCB0bwogIHJlYWQgYmFkIG1lbW9yeSBkdXJpbmcgc2l0dWF0aW9ucyB3aGVuIGFuIChmdHApIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQuCiAgQWxzbywgdGhlIGxpYi9NYWtlZmlsZS52YzYgd2FzIGNvcnJlY3RlZC4KCi0gTW9yZSBpbnZlc3RpZ2F0aW9ucyBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIG1hZGUgbWUgcmVhbGl6ZSB0aGF0CiAgaXQgd2FzIG5vdCBjbGVhbiBlbm91Z2ggdG8gd29yayB0cmFuc3BhcmFudGx5IHdpdGggcGVyc2lzdGVudCBhbmQgbm9uLQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIEkgdGhpbmsgSSd2ZSBmaXhlZCBpdCBub3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDEpCi0gR2VvcmcgSG9ybiBtYWlsZWQgbWUgc29tZSBjb3JyZWN0aW9ucyBmb3IgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UuCgotIEV4cGVyaW1lbnRhbCBmdHBzOi8vIHN1cHBvcnQgYWRkZWQuIEl0IGlzIGJhc2ljYWxseSBGVFAgb3ZlciBTU0wgZm9yIHRoZQogIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQgc3RpbGwgbWFrZXMgYWxsIGRhdGEgdHJhbnNmZXJzIGdvaW5nIG92ZXIgdW5lbmNyeXB0ZWQKICBjb25uZWN0aW9ucy4gUmFpbmVyIFdlaWt1c2F0J3MgZnRwZC1zc2wgc2VydmVyIGhhY2sgc3VwcG9ydHMgdGhpcyBhbmQgSSB1c2VkCiAgdGhhdCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBzZXQgYSBDVVJMT1BUX1RJTUVPVVQgYW5kIHRoZW4gdHJpZWQKICB0byBnZXQgYSBmaWxlIGZyb20gYSBzaXRlIGFuZCBpdCBmYWlscywgdGhlIFNJR0FMUk0gd291bGQgc3RpbGwgYmUgc2VudAogIGFmdGVyIHRoZSB0aW1lb3V0LXRpbWUsIHF1aXRlIGluZXhwZWN0ZWRseSEKCi0gSSBhZGRlZCBhbiBmdHAgdHJhbnNmZXIgZXhhbXBsZSB0byBkb2NzL2V4YW1wbGVzLyBhbmQgSSBhbHNvIHdyb3RlIGEgdGlueQogIGV4YW1wbGUgbWFrZWZpbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0IHdoZW4gYnVpbGRpbmcgb25lIG9mIHRoZQogIGV4YW1wbGVzLgoKVmVyc2lvbiA3LjcuMS1iZXRhMQoKRGFuaWVsICgyNiBNYXJjaCAyMDAxKQotIE1vaGFtZWQgTHJoYXppIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggNy42LjEgYW5kIHBlcnNpc3RlbnQgSFRUUC8xLjAKICBjb25uZWN0aW9ucyAod2hlbiB0aGUgc2VydmVyIHJlcGxpZWQgYSBDb25uZWN0aW9uOiBLZWVwLUFsaXZlKSBhbmQgdGhpcwogIHByb2JsZW0gd2FzIG5vdCBwcm9wZXJseSBkZWFsdCB3aXRoIGluIDcuNyBlaXRoZXIuIEEgcGF0Y2ggd2FzIHBvc3RlZCB0byB0aGUKICBjdXJsLWFuZC1waHAgbWFpbGluZyBsaXN0LgoKRGFuaWVsICgyNCBNYXJjaCAyMDAxKQotIENvbGluIFdhdHNvbiByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gYW5kIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCwKICB3aGljaCB3YXMgYWJvdXQgdGhlIG1hbiBwYWdlIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHF1b3RlICgnKSBpbiBhCiAgd2F5IHRoYXQgZ25yb2ZmIGRvZXNuJ3QgbGlrZS4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMSkKLSBQZXRlciBCcmF5IHJlcG9ydGVkIGNvcnJlY3RseSB0aGF0IHRoZSByb290IG1ha2VmaWxlIHVzZWQgbWFrZSBpbnN0ZWFkIG9mCiAgJChNQUtFKSBmb3IgdGhlIHRlc3QgdGFyZ2V0LgoKLSBDb3JyZWN0ZWQgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UgdG8gdXNlIGN1cmxfZWFzeV9zZXRvcHQoKSBhbmQgbm90CiAgY3VybF9zZXRvcHQoKSB3aGljaCB3YXMgcmVtb3ZlZCBpbiA3LjchCgotIFMuIE1vb25lc2FteSBwcm92aWRlZCB1cGRhdGVzIG9uIHRocmVlIGRvY3VtZW50cyAoTUFOVUFMLCBJTlNUQUxMIGFuZCBGQVEpLgoKLSBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiwgbGliY3VybCB3b3VsZCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIFVSTCBzdHJpbmcKICBpbiBhIHdheSBpdCBzaG91bGRuJ3QuIEFzIHRoZSBwb2ludGVyIGlzIHBhc3NlZC1pbiB0byBsaWJjdXJsIGZyb20gYW4KICBhcHBsaWNhdGlvbiwgd2UgY2FuJ3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdC4gVGhlIHBhcnRpY3VsYXIgYnVnIHJlcG9ydAogIGZyb20gJ25rJyB0aGF0IGJyb3VnaHQgdGhpcyB1cCB3YXMgYmVjYXVzZSBoZSBoYWQgYSByZWFkLW9ubHkgVVJMIHRoYXQgdGhlbgogIGNhdXNlZCBhIGxpYmN1cmwgY3Jhc2ghCgotIE5vIGxvbmdlciByZWFkcyBIRUFEIHJlc3BvbnNlcyBsb25nZXIgdGhhbiB0byB0aGUgbGFzdCBoZWFkZXIuIFByZXZpb3VzbHksCiAgY3VybCB3b3VsZCByZWFkIHRoZSBmdWxsIHJlcGx5IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhICJjbG9zZSIgb25lLgoKLSBsaWJjdXJsIGRpZCByZS11c2UgY29ubmVjdGlvbnMgd2F5IHRvbyBtdWNoLiBEb2luZyAiY3VybAogIGh0dHA6Ly93d3cue21pY3Jvc29mdCxpYm19LmNvbSIgd291bGQgbWFrZSBpdCByZS11c2UgdGhlIGNvbm5lY3Rpb24gd2hpY2gKICBtYWRlIHRoZSBzZWNvbmQgcmVxdWVzdCByZXR1cm4gdmVyeSBvZGQgcmVzdWx0cy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBFZGluIEthZHJpYmFzaWMgbWFkZSBtZSBhd2FyZSB0aGF0IGN1cmwgc2hvdWxkIG5vdCByZS1zZW5kIFBPU1QgcmVxdWVzdHMKICB3aGVuIGZvbGxvd2luZyAzMDItcmVkaXJlY3RzLiBJIG1hZGUgMzAyIHdvcmsgbGlrZSAzMDMgd2hpY2ggbWVhbnMgY3VybCB1c2VzCiAgR0VUIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdChzKS4KCi0gbGliY3VybCBub3cgcmVzZXQgdGhlICJmb2xsb3dlZC1sb2NhdGlvbiIgY291bnRlciBvbiBlYWNoIGludm9rZSBvZgogIGN1cmxfZWFzeV9wZXJmb3JtKCkgYXMgaXQgb3RoZXJ3aXNlIHdvdWxkIHN1bSB1cCBhbGwgcmVkaXJlY3RzIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBjb3VsZCByZWFjaCB0aGUgbWF4cmVkaXJzIGNvdW50ZXIgd3JvbmdseS4KCi0gSmltIERyYXNoIHN1Z2dlc3RlZCBjdXJsX2VzY2FwZSgpIHNob3VsZCBub3QgcmUtZW5jb2RlIHdoYXQgYWxyZWFkeSBsb29rcwogIGxpa2UgYW4gZW5jb2RlZCBzZXF1ZW5jZSBhbmQgSSB0aGluayB0aGF0J3MgYSBmYWlyIHN1Z2dlc3Rpb24uCgpWZXJzaW9uIDcuNwoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBmYWlscyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgZ2V0aG9zdGJ5bmFtZV9yKCkgaXMKICBkZXRlY3RlZCBidXQgaXQgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gaW52b2tlIGl0ICh3aGF0IGFtb3VudCBvZgogIGFyZ3VtZW50cyBpdCBpcyBzdXBwb3NlZCB0byBnZXQpLiBSZXBvcnRzIGZyb20gQW5kculzIEdhcmPtYSBtYWRlIG1lIGF3YXJlCiAgb2YgdGhpcyBuZWVkLgoKLSBUYWxraW5nIHdpdGggSmltIERyYXNoIG1hZGUgbWUgZmluYWxseSBwdXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3VuZXNjYXBlCiAgZnVuY3Rpb25zIGluIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIGFuZCB3cml0ZSBtYW4gcGFnZXMgZm9yIHRoZW0uIFRoZQogIGVzY2FwZSBmdW5jdGlvbiB3YXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgdW5lc2NhcGUgb25lCiAgaGFkLgoKLSBObyBidWcgcmVwb3J0cyBhdCBhbGwgb24gdGhlIGxhdGVzdCBiZXRhcy4gUmVsZWFzZSB0aW1lIGNvbWluZyB1cC4KClZlcnNpb24gNy43LWJldGE1CgpEYW5pZWwgKDE5IE1hcmNoIDIwMDEpCi0gR2VvcmcgT3R0aW5nZXIgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCB1c2luZyAtQyB0b2dldGhlciB3aXRoIC1MIGluIHRoZSBzZW5zZQogIHRoYXQgdGhlIC1DIGluZm8gZ290IGxvc3Qgd2hlbiBpdCB3YXMgcmVkaXJlY3RlZC4gSSBjb3VsZCBub3QgcmVwZWF0IHRoaXMKICBwcm9ibGVtIG9uIHRoZSA3LjcgYnJhbmNoIHdoeSBJIGxlYXZlIHRoaXMgZm9yIHRoZSBtb21lbnQuIFRlc3QgY2FzZSAzOSB3YXMKICBhZGRlZCB0byBkbyBleGFjdGx5IHRoaXMsIGFuZCBpdCBzZWVtcyB0byBkbyByaWdodC4KCi0gQ2hyaXN0aWFuIFJvYm90dG9tIFJlaXMgcmVwb3J0ZWQgaG93IGhpcyA3LjcgYmV0YSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IGRvCiAgZm9ybSBwb3N0cyBhcyBlbGVnYW50bHkgYXMgNy42LjEgZGlkLiBJbmRlZWQsIHRoaXMgd2FzIGEgZmxhdyBpbiB0aGUgaGVhZGVyCiAgZW5naW5lLCBhcyBIVFRQIDEuMSBoYXMgaW50cm9kdWNlZCBhIG5ldyAxMDAgInRyYW5zaWVudCIgcmV0dXJuIGNvZGUgZm9yIFBVVAogIGFuZCBQT1NUIG9wZXJhdGlvbnMgdGhhdCBJIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yLiBTZWN0aW9uIDguMi4zIGluIFJGQzI2MTYKICBoYXMgYWxsIHRoZSBkZXRhaWxzLiBTZWVtcyB0byB3b3JrIG5vdyEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMSkKLSBBZnRlciBoYXZpbmcgZXhwZXJpZW5jZWQgYW5vdGhlciBtYWNoaW5lIGJyZWFrLWRvd24sIHdlJ3JlIGJhY2suCgotIEdlb3JnIEhvcm4ncyBwZXJsIGludGVyZmFjZSBDdXJsOjplYXN5IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgY3VybCByZWxlYXNlCiAgYXJjaGl2ZS4gVGhlIHBlcmwvIGRpcmVjdG9yeSBpcyBub3cgcHJlc2VudC4gUGxlYXNlIGhlbHAgbWUgd2l0aCBkb2NzLAogIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHlvdSB0aGluayBmaXQuCgotIE1hZGUgYSBuZXcgcGhwLyBkaXJlY3RvcnkgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZSBhbmQgbW92ZWQgdGhlIFBIUCBleGFtcGxlcwogIGludG8gYSBzdWJkaXJlY3RvcnkgaW4gdGhlcmUuIE5vdCBtdWNoIFBIUCBpbmZvIHlldCwgYnV0IEkgcGxhbiB0by4gUGxlYXNlCiAgaGVscCBtZSBoZXJlIGFzIHdlbGwhCgotIE1hZGUgbGliY3VybCByZXR1cm4gZXJyb3IgaWYgYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUgb2YgYQogICJjaHVuayIuIEl0IGFjdHVhbGx5IGVuYWJsZXMgbGliY3VybCB0byBkaXNjb3ZlciBwcmVtYXR1cmUgdHJhbnNmZXIgYWJvcnRzCiAgZXZlbiBpZiB0aGUgQ29udGVudC1MZW5ndGg6IHNpemUgaXMgdW5rbm93bi4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMSkKLSBBZGRlZCAtLWNvbm5lY3QtdGltZW91dCB0byBjdXJsLCB3aGljaCBzZXRzIHRoZSBuZXcgQ1VSTE9QVF9DT05ORUNUVElNRU9VVAogIG9wdGlvbiBpbiBsaWJjdXJsLiBJdCBsaW1pdHMgdGhlIHRpbWUgY3VybCBpcyBhbGxvd2VkIHRvIHNwZW5kIGluIHRoZQogIGNvbm5lY3Rpb24gcGhhc2UuIFRoaXMgZGlmZmVycyBmcm9tIC1tLy0tbWF4LXRpbWUgdGhhdCBsaW1pdHMgdGhlIGVudGlyZQogIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLiBSZXF1ZXN0ZWQgYnkgTGFycnkgRmFobm9lIGFuZCBvdGhlcnMuCgogIEkgYWxzbyB1cGRhdGVkIHRoZSBjdXJsLjEgYW5kIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZXMgYW5kIHJlbW92ZWQgdGhlCiAgaXRlbSBmcm9tIHRoZSBUT0RPLgoKVmVyc2lvbiA3LjctYmV0YTQKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBNYWRlIGN1cmwgZ3JvayBJUHY2IHdpdGggSFRUUCBwcm94aWVzIGFuZCBnb3QgZXZlcnl0aGluZyB0byBjb21waWxlIG5pY2VseQogIGFnYWluIHdoZW4gRU5BQkxFX0lQVjYgaXMgc2V0LgoKICBJIG5lZWQgdG8gcmVtYWtlIHRoaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZS4gSSBjYW4ndCB0ZXN0IHRoZSBGVFAgcGFydHMgd2l0aAogIGN1cmwgYnVpbHQgZm9yIElQdjYgYXMgaXQgdXNlcyBhIGRpZmZlcmVudCBzZXQgb2YgRlRQIGNvbW1hbmRzIHRoZW4hCgotIEkgZmVsbCBvbnRvIGEgYnVnIHJlcG9ydCBvbiBwaHAubmV0IChwb3N0ZWQgYnkgTGFycyBUb3JiZW4gV2lsc29uKSB0aGF0IHdhcwogIGEgcmVwb3J0IG1lYW50IGZvciBvdXIgcHJvamVjdC4gQW55d2F5LCBpdCBzYWlkIHRoZSAubmV0cmMgcGFyc2luZyBkaWRuJ3QKICB3b3JrIGFzIHN1cHBvc2VkLCBhbmQgYXMgSSBhZ3JlZWQgd2l0aCBMYXJzLCBJIG1hZGUgdGhlIG5ldHJjIHBhcnNlciB1c2UKICBnZXRwd3VpZCgpIHRvIGZpZ3VyZSBvdXQgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgdHJ5CiAgdGhhdCBuZXRyYy4gSXQgc3RpbGwgdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBmb3IgdGhvc2UgdGhhdCBkb24ndAogIGhhdmUgdGhhdCBmdW5jdGlvbiBvciBpZiB0aGUgdXNlciBkb2Vzbid0IHJldHVybiB2YWxpZCBwd2QgaW5mby4KCi0gRWRpbiBLYWRyaWJhaWMgcG9zdGVkIGEgYnVnIHJlcG9ydCB3aGVyZSBoZSBnb3QgYSBjcmFzaCB3aGVuIGEgZmV0Y2ggd2l0aAogIHVzZXIrcGFzc3dvcmQgaW4gdGhlIFVSTCBmb2xsb3dlZCBhIExvY2F0aW9uOiB0byBhIHNlY29uZCBVUkwgKGFic29sdXRlLAogIHdpdGhvdXQgbmFtZStwYXNzd29yZCkuIFRoaXMgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgYSBsb25nIHdoaWxlIGFuZAogIGNyYXNoZXMgZHVlIHRvIGEgcmVhZCBhdCBhZGRyZXNzIHplcm8uIEZpeGVkIG5vdy4gV3JvdGUgdGVzdCBjYXNlIDM4LCB0aGF0CiAgdGVzdHMgdGhpcy4KCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUncyBodHRwc2VydmVyIHNsaWdodGx5IHRvIGFwcGVuZCBhbGwgY2xpZW50IHJlcXVlc3QKICBkYXRhIHRvIGl0cyBsb2cgZmlsZSBzbyB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBub3cgYmV0dGVyIGNhbiB2ZXJpZnkgYSByYW5nZQogIG9mIHJlcXVlc3RzIGFuZCBub3Qgb25seSB0aGUgbGFzdCBvbmUsIGFzIGl0IGRpZCBwcmV2aW91c2x5LgoKLSBVcGRhdGVkIHRoZSBjdXJsIG1hbiBwYWdlIHdpdGggLS1yYW5kb20tZmlsZSBhbmQgLS1lZ2QtZmlsZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjctYmV0YTMKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBCavZybiBTdGVuYmVyZyBwcm92aWRlZCBzaW1pbGFyIGZpeGVzIGFzIEr2cm4gZGlkIGFuZCBzb21lIGFkZGl0aW9uYWwgcGF0Y2hlcwogIGZvciBub24tU1NMIGNvbXBpbGVzLgoKLSBJIGluY3JlYXNlZCB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgbGliY3VybCBhcyBJJ3ZlIHJlbW92ZWQgdGhlIGxvdyBsZXZlbAogIGZ1bmN0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuIEkgYWxzbyB0b29rIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVuYW1lIHRoZQogIEN1cmxfc3RyZXF1YWwgZnVuY3Rpb24gdG8gY3VybF9zdHJlcXVhbCBhbmQgQ3VybF9zdHJuZXF1YWwgdG8KICBjdXJsX3N0cm5lcXVhbCwgYXMgdGhleSdyZSBwdWJsaWMgbGliY3VybCBmdW5jdGlvbnMgKGV2ZW4gaWYgdGhleSdyZSBzdGlsbAogIHVuZG9jdW1lbnRlZCkuCgogIFRoaXMgd2lsbCBtYWtlIG9sZGVyIHByb2dyYW1zIG5vdCBjYXBhYmxlIG9mIHVzaW5nIHRoZSBuZXcgbGliY3VybCB3aXRoCiAganVzdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuCgotIEr2cm4gSGFydHJvdGggdXBkYXRlZCBzdHVmZiBmb3Igd2luMzIgY29tcGlsZXM6CiAgbyBjb25maWctd2luMzIuaCB3YXMgZml4ZWQgZm9yIHNvY2tsZW5fdAogIG8gbGliL3NzbHVzZS5jIGhhZCBhIGJhZCAjZW5kaWYgcGxhY2VtZW50CiAgbyBsaWIvZmlsZS5jIHdhcyBtYWRlIHRvIGNvbXBpbGUgb24gd2luMzIgYWdhaW4KICBvIGxpYi9NYWtlZmlsZS5tMzIgd2FzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGZpbGVzCiAgbyBsaWIvbGliY3VybC5kZWYgbWF0Y2hlcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc3RhdGUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBJdCBvbmx5IHRvb2sgYW4gaG91ciBvciBzbyBiZWZvcmUgSvZybiBIYXJ0cm90aCBmb3VuZCBhIHByb2JsZW0gaW4gdGhlCiAgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4gR2l2ZW4gaGlzIGZpbmUgZXhhbXBsZS1zaXRlLCBJIGNvdWxkIGVhc2lseSBzcG90CiAgdGhlIHByb2JsZW0gYW5kIHdoZW4gSSByZS1yZWFkIHRoZSBzcGVjICh0aGUgcGFydCBJIGhhdmUgcGFzdGVkIGluIHRoZSB0b3AKICBvZiB0aGUgaHR0cF9jaHVua3MuaCBmaWxlKSwgSSByZWFsaXplZCBJIGhhZCBtYWRlIG15IHN0YXRlLW1hY2hpbmUgc2xpZ2h0bHkKICB3cm9uZyBhbmQgZGlkbid0IGV4cGVjdC9oYW5kbGUgdGhlIHRyYWlsaW5nIENSTEYgdGhhdCBjb21lcyBhZnRlciB0aGUgZGF0YQogIGluIGVhY2ggY2h1bmsgKGFuZCB0aG9zZSBleHRyYSB0d28gYnl0ZXMgc3VyZSBmZWVsIHdhc3RlZCkuCgogIEhhZCB0byBtb2RpZnkgdGVzdCBjYXNlIDM0IHRvIG1hdGNoIHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy43LWJldGEyCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gQWRkZWQgdGhlIHBvbGljeSBzdHVmZiB0byB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBmb3IgdGhlIHR3byBzdXBwb3J0ZWQKICBwb2xpY2llcy4KCi0gSW1wbGVtZW50ZWQgc29tZSBzdXBwb3J0IGZvciB0aGUgQ1VSTE9QVF9DTE9TRVBPTElDWSBvcHRpb24uIFRoZSBwb2xpY2llcwogIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEIGFuZCBDVVJMQ0xPU0VQT0xJQ1lfT0xERVNUIGFyZSBub3cKICBzdXBwb3J0ZWQsIGFuZCB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBwb2xpY3kKICBpcyBjaG9zZW4uCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDEpCi0gQWRkZWQgQ1VSTE9QVF9SQU5ET01fRklMRSBhbmQgQ1VSTE9QVF9FR0RTT0NLRVQgdG8gbGliY3VybCBmb3Igc2VlZGluZyB0aGUKICBTU0wgcmFuZG9tIGVuZ2luZS4gVGhlIHJhbmRvbSBzZWVkaW5nIHN1cHBvcnQgd2FzIGFsc28gYnJvdWdodCB0byB0aGUgY3VybAogIGNsaWVudCB3aXRoIHRoZSBuZXcgb3B0aW9ucyAtLXJhbmRvbS1maWxlIDxmaWxlPiBhbmQgLS1lZ2QtZmlsZSA8ZmlsZT4uIEkKICBuZWVkIHNvbWUgcGVvcGxlIHRvIHJlYWxseSB0ZXN0IHRoaXMgdG8ga25vdyB0aGV5IHdvcmsgYXMgc3VwcG9zZWQuIFJlbWVtYmVyCiAgdGhhdCBsaWJjdXJsIG5vdyBpbmZvcm1zIChpZiB2ZXJib3NlIGlzIG9uKSBpZiB0aGUgcmFuZG9tIHNlZWQgaXMgY29uc2lkZXJlZAogIHdlYWsgKEhUVFBTIGNvbm5lY3Rpb25zKS4KCi0gTWFkZSB0aGUgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBlbmdpbmUgZGV0ZWN0ZWQgYmFkIGZvcm1hdHRlZCBkYXRhIGxlbmd0aAogIGFuZCByZXR1cm4gZXJyb3IgaWYgc28gKHdlIGNhbid0IHBvc3NpYmx5IGV4dHJhY3Qgc2Vuc2libGUgZGF0YSBpZiB0aGlzIGlzCiAgdGhlIGNhc2UpLiBBZGRlZCBhIHRlc3QgY2FzZSB0aGF0IGRldGVjdHMgdGhpcy4gTnVtYmVyIDM2LiBOb3cgdGhlcmUgYXJlIDYwCiAgdGVzdCBjYXNlcy4KCi0gQWRkZWQgNSBuZXcgbGliY3VybCBvcHRpb25zIHRvIGN1cmwvY3VybC5oIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLiBUaGV5J3JlIGFsc28gZG9jdW1lbnRlZCAoZmFpcmx5CiAgdGhvcm91Z2hseSkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4gVGhyZWUgb2YgdGhlbSBhcmUgbm93CiAgaW1wbGVtZW50ZWQsIGFsdGhvdWdoIG5vdCByZWFsbHkgdGVzdGVkIGF0IHRoaXMgcG9pbnQuLi4gQW55d2F5LCB0aGUgbmV3CiAgaW1wbGVtZW50ZWQgb3B0aW9ucyBhcmUgbmFtZWQgQ1VSTE9QVF9NQVhDT05ORUNUUywgQ1VSTE9QVF9GUkVTSF9DT05ORUNULAogIENVUkxPUFRfRk9SQklEX1JFVVNFLiBUaGUgb25lcyBzdGlsbCBsZWZ0IHRvIHdyaXRlIGNvZGUgZm9yIGFyZToKICBDVVJMT1BUX0NMT1NFUE9MSUNZIGFuZCBpdHMgcmVsYXRlZCBvcHRpb24gQ1VSTE9QVF9DTE9TRUZVTkNUSU9OLgoKLSBNYWRlIGN1cmwgKHRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIHRvb2wpIHVzZSB0aGUgbmV3IGxpYmN1cmwgNy43IHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHN1cHBvcnQgYnkgcmUtdXNpbmcgdGhlIHNhbWUgY3VybCBoYW5kbGUgZm9yIGV2ZXJ5IHNwZWNpZmllZCBmaWxlCiAgdHJhbnNmZXIgYW5kIGFmdGVyIHNvbWUgbW9yZSB0ZXN0IGNhc2UgdHdlYWtpbmcgd2UgaGF2ZSAxMDAlIHRlc3QgY2FzZSBPSy4KICBJIG1hZGUgc29tZSB0ZXN0IGNhc2VzIHJldHVybiBIVFRQLzEuMCBub3cgdG8gbWFrZSBzdXJlIHRoYXQgd29ya3MgYXMgd2VsbC4KCi0gSGFkIHRvIGFkZCAnQ29ubmVjdGlvbjogY2xvc2UnIHRvIHRoZSBoZWFkZXJzIG9mIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBzbwogIHRoYXQgY3VybCBiZWhhdmVzICJvbGQtc3R5bGUiIHNpbmNlIHRoZSB0ZXN0IGh0dHAgc2VydmVyIGRvZXNuJ3QgZG8gbXVsdGlwbGUKICBjb25uZWN0aW9ucy4uLiBOb3cgSSBnZXQgMTAwJSB0ZXN0IGNhc2UgT0suCgotIFRoZSBjdXJsLmhheHguc2Ugc2l0ZSwgdGhlIG1haW4gY3VybCBtYWlsaW5nIGxpc3QgYW5kIG15IHBlcnNvbmFsIGVtYWlsIGFyZQogIGFsbCBkZWFkIHRvZGF5IGR1ZSB0byBwb3dlciBibGFja291dCBpbiB0aGUgYXJlYSB3aGVyZSB0aGUgbWFpbiBzZXJ2ZXJzIGFyZQogIGxvY2F0ZWQuIEhvcnJpYmxlLgoKLSBJJ3ZlIG1hZGUgcGVyc2lzdGFuY2Ugd29yayBvdmVyIGEgc3F1aWQgSFRUUCBwcm94eS4gSSBmaW5kIGl0IGRpc3R1cmJpbmcKICB0aGF0IGl0IHVzZXMgaGVhZGVycyB0aGF0IGFyZW4ndCBwcmVzZW50IGluIGFueSBIVFRQIHN0YW5kYXJkIHRob3VnaAogIChQcm94eS1Db25uZWN0aW9uOikgYW5kIHRoYXQgbWFrZXMgbWUgZmVlbCB0aGF0IEknbSBub3cgb24gdGhlIGVkZ2Ugb2Ygd2hhdAogIHRoZSBzdGFuZGFyZCBhY3R1YWxseSBkZWZpbmVzLiBJIG5lZWQgdG8gZ2V0IHRoaXMgY29kZSBleGNlcmNpc2VkIG9uIGEgbG90CiAgb2YgZGlmZmVyZW50IEhUVFAgcHJveGllcyBiZWZvcmUgSSBmZWVsIHNhZmUuCgogIE5vdyBJJ20gZmFjaW5nIHRoZSBwcm9ibGVtIHdpdGggbXkgdGVzdCBzdWl0ZSBzZXJ2ZXJzIChib3RoIEZUUCBhbmQgSFRUUCkKICBub3Qgc3VwcG9ydGluZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBsaWJjdXJsIGlzIGRvaW5nIHRoZW0gbm93LiBJIGhhdmUKICB0byBmaXggdGhlIHRlc3Qgc2VydmVycyB0byBnZXQgYWxsIHRoZSB0ZXN0IGNhc2VzIGRvIE9LLgoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIGRpZCBvdXRwdXQgZXJyb3JzIHRvIHN0ZGVyciBldmVuIGlmCiAgTVVURSBhbmQgTk9QUk9HUkVTUyB3YXMgc2V0LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgYnVnIGFuZCBoYXBwZW5zIGlmCiAgdGhlcmUncyBhbiBlcnJvciBhbmQgbm8gRVJST1JCVUZGRVIgaXMgc2V0LiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpWZXJzaW9uIDcuNy1iZXRhMQoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBpcyBubyBsb25nZXIgYW55IHRyb3VibGUgZm9yIGxpYmN1cmwuIEkndmUKICBhZGRlZCB0d28gc291cmNlIGZpbGVzIGFuZCBJJ3ZlIHJ1biBzb21lIHRlc3QgZG93bmxvYWRzIHRoYXQgbG9vayBmaW5lLgoKLSBIVFRQIEhFQUQgd29ya3MgdG9vLCBldmVuIG9uIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDEpCi0gVGhlIGN1cnJlbnQgNTcgdGVzdCBjYXNlcyBub3cgcGFzcyBPSy4gSXQgd291bGQgc3VnZ2VzdCB0aGF0IGxpYmN1cmwgd29ya3MKICB1c2luZyB0aGUgb2xkLXN0eWxlIHdpdGggb25lIGNvbm5lY3Rpb24gcGVyIGhhbmRsZS4gVGhlIHRlc3Qgc3VpdGUgZG9lc24ndAogIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB5ZXQgc28gdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgZm9yIHRoaXMuCgotIEkgcGF0Y2hlZCB0aGUgdGVsbmV0LmMgaGVhdmlseSB0byBub3QgdXNlIGFueSBnbG9iYWwgdmFyaWFibGVzIGFueW1vcmUuIEl0CiAgc2hvdWxkIG1ha2UgaXQgYSBsb3QgbmljZXIgbGlicmFyeS13aXNlLgoKLSBUaGUgZmlsZTovLyBzdXBwb3J0IHdhcyBtb2RpZmllZCBzbGlnaHRseSB0byB1c2UgdGhlIGludGVybmFsIGNvbm5lY3QtZmlyc3QtCiAgdGhlbi1kbyBhcHByb2FjaC4KCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE1vcmUgYnVncyBlcmFzZWQuCgpWZXJzaW9uIDcuNy1hbHBoYTIKCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE5vdywgdGhlcmUncyBldmVuIGEgYmFzaWMgY2hlY2sgdGhhdCBhIHJlLXVzZWQgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZQogIGJlZm9yZSBpdCBpcyBhc3N1bWVkIHNvLiBBIGZldyBmaXJzdCB0ZXN0cyBoYXZlIHByb3ZlbiB0aGF0IGxpYmN1cmwgd2lsbAogIHRoZW4gcmUtY29ubmVjdCBpbnN0ZWFkIG9mIHJlLXVzZSB0aGUgZGVhZCBjb25uZWN0aW9uIQoKRGFuaWVsICgyIE1hcmNoIDIwMDEpCi0gTm93IHRoZXkgd29yayBpbnRlcm1peGVkIGFzIHdlbGwuIE1ham9yIGNvb2xuZXNzIQoKLSBNb3JlIGZpZGRsaW5nIGFyb3VuZCwgbXkgJ3RpbnknIGNsaWVudCBJIGhhdmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgbm93IGhhcwogIHByb3ZlZCB0byBkb3dubG9hZCBib3RoIEZUUCBhbmQgSFRUUCB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoZXkgZG8KICBub3Qgd29yayBpbnRlcm1peGVkIHlldCB0aG91Z2guCgpEYW5pZWwgKDEgTWFyY2ggMjAwMSkKLSBXaWxmcmVkbyBTYW5jaGV6IHBvaW50ZWQgb3V0IGEgbWlub3Igc3BlbGxpbmcgbWlzdGFrZSBpbiBhIG1hbiBwYWdlIGFuZCB0aGF0CiAgY3VybF9zbGlzdF9hcHBlbmQoKSBzaG91bGQgdGFrZSBhIGNvbnN0IGNoYXIgKiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IGRvZXMKICBub3cuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDEpCi0gVGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc3RhcnQgdG8gbG9vayBnb29kIGZvciBIVFRQLiBPbiBhIHN1YnNlcXVlbnQKICByZXF1ZXN0LCBpdCBzZWVtcyB0aGF0IGxpYmN1cmwgbm93IGNhbiBwaWNrIGFuIGFscmVhZHkgZXhpc3RpbmcgY29ubmVjdGlvbgogIGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgb3IgaXQgb3BlbnMgYSBuZXcgb25lLgoKLSBEb3VnbGFzIFIuIEhvcm5lciBtYWlsZWQgbWUgY29ycmVjdGlvbnMgdG8gdGhlIGN1cmxfZm9ybXBhcnNlKCkgbWFuIHBhZ2UKICB0aGF0IEkgYXBwbGllZC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMSkKLSBBZGRlZCB0aGUgZG9jcy9leGFtcGxlcy93aW4zMnNvY2tldHMuYyBmaWxlIGZvciBvdXIgd2luZG93cyBmcmllbmRzLgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHByb3ZpZGVkIGJyYW5kIG5ldyBURUxORVQgZnVuY3Rpb25hbGl0eSBhbmQKICBpbXByb3ZlbWVudHM6CgogICogTmVnb3RpYXRpb24gaXMgbm93IHBhc3NpdmUuIEN1cmwgZG9lcyBub3QgbmVnb3RpYXRlIHVudGlsIHRoZSBwZWVyIGRvZXMuCiAgKiBQb3NzaWJpbGl0eSB0byBzZXQgbmVnb3RpYXRpb24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLCBjdXJyZW50bHkgb25seQogICAgWERJU1BMT0MsIFRUWVBFIGFuZCBORVdfRU5WSVJPTiAoY2FsbGVkIE5FV19FTlYpLgogICogTm93IHNlbmRzIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZSAtdSBzd2l0Y2ggaXMgdXNlZC4KICAqIFVzZSAtdCB0byBzZXQgdGVsbmV0IG9wdGlvbnMgKExpbnVzIGV2ZW4gdXBkYXRlZCB0aGUgbWFuIHBhZ2UsIGF3ZXNvbWUhKQoKLSBIYXZlbid0IGRvbmUgdGhpcyBiaWcgY2hhbmdlcyB0byBjdXJsIGZvciBhIHdoaWxlLiBNb3ZlZCBhcm91bmQgYSBsb3Qgb2YKICBzdHJ1Y3QgZmllbGRzIGFuZCBzdHVmZiB0byBtYWtlIG11bHRpcGxlIGNvbm5lY3Rpb25zIGdldCBjb25uZWN0aW9uIHNwZWNpZmljCiAgZGF0YSBpbiBzZXBhcmF0ZSBzdHJ1Y3RzIHNvIHRoYXQgdGhleSBjYW4gY28tZXhpc3QgaW4gYSBuaWNlIHdheS4gU2VlIHRoZQogIG1haWxpbmcgbGlzdHMgZm9yIGRpc2N1c3Npb25zIGFyb3VuZCBob3cgdGhpcyBpcyBnb25uYSBiZSBpbXBsZW1lbnRlZC4gRG9jcwogIGFuZCBtb3JlIHdpbGwgZm9sbG93LgoKICBTdHVkaWVkIHRoZSBIVFRQIFJGQyB0byBmaW5kIG91dCBiZXR0ZXIgaG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkCiAgd29yay4gU2VlbXMgY29vbCBlbm91Z2guCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDEpCi0gQm9iIFNjaGFkZXIgYnJvdWdodCBtZSB0d28gZmlsZXMgdGhhdCBoZWxwIHNldCB1cCBhIE1TIFZDKysgbGliY3VybCBwcm9qZWN0CiAgZWFzaWVyLiBIZSBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYW4gdXAtdG8tZGF0ZSBsaWJjdXJsLmRlZiBmaWxlLgoKLSBJIG1vdmVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyBmcm9tIHRoZSBwdWJsaWMgPGN1cmwvY3VybC5oPiBmaWxlIHRvIHRoZQogIGxpYnJhcnkgcHJpdmF0ZSB1cmxkYXRhLmguIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgdXBjb21pbmcgY2hhbmdlcy4gVGhlCiAgbG93IGxldmVsIGludGVyZmFjZSBpcyBubyBsb25nZXIgYmVpbmcgcGxhbm5lZCB0byBiZWNvbWUgcmVhbGl0eS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMSkKLSBDVVJMT1BUX1BPU1QgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuIEp1c3Qgc2V0dGluZyB0aGUgUE9TVCBzdHJpbmcgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyB3aWxsIHN3aXRjaCBvbiB0aGUgSFRUUCBQT1NULiBNb3N0IG90aGVyIHRoaW5ncyBpbgogIGxpYmN1cmwgYWxyZWFkeSB3b3JrcyB0aGlzIHdheSwgaS5lIHRoZXkgcmVxdWlyZSBvbmx5IHRoZSBwYXJhbWV0ZXIgdG8KICBzd2l0Y2ggb24gYSBmZWF0dXJlIHNvIEkgdGhpbmsgdGhpcyB3b3JrcyB3ZWxsIHdpdGggdGhlIHJlc3QuIFNldHRpbmcgYSBOVUxMCiAgc3RyaW5nIHN3aXRjaGVzIG9mZiB0aGUgUE9TVCBhZ2Fpbi4KCi0gRXhjZWxsZW50IHN1Z2dlc3Rpb25zIGZyb20gUmljaCBHcmF5LCBSaWNrIEpvbmVzLCBKb2hhbiBOaWxzc29uIGFuZCBCam9ybgogIFJlZXNlIGhlbHBlZCBtZSBkZWZpbmUgYSB3YXkgaG93IHRvIGluY29ycG9yYXRlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW50bwogIGxpYmN1cmwgaW4gYSB2ZXJ5IHNtb290aCB3YXkuIElmIGRvbmUgcmlnaHQsIG5vIGNoYW5nZSBtYXkgaGF2ZSB0byBiZSBtYWRlCiAgdG8gb2xkZXIgcHJvZ3JhbXMgYW5kIHRoZXkgd2lsbCBqdXN0IHN0YXJ0IHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbgogIGFwcGxpY2FibGUhCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDEpCi0gQ2hhbmdlZCB0aGUgd29yZCAndGltZW91dGVkJyB0byAndGltZWQgb3V0JyBpbiB0d28gZGlmZmVyZW50IGVycm9yIG1lc3NhZ2VzLgogIFN1Z2dlc3RlZCBieSBMYXJyeSBGYWhub2UuCgpWZXJzaW9uIDcuNi4xCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwMSkKLSBGcmFuayBSZWlkIGFuZCBDYWluIEhvcHdvb2QgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kIHJlc2VhcmNoIGFyb3VuZCBhIEhUVFBTCiAgUFVUL3VwbG9hZCBwcm9ibGVtIHdlIHNlZW0gdG8gaGF2ZS4gTm8gc29sdXRpb24gZm91bmQgeWV0LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDEpCi0gQW4gaW50ZXJlc3RpbmcgZGlzY3Vzc2lvbiBpcyBob3cgdG8gc3BlY2lmeSBhbiBlbXB0eSBwYXNzd29yZCB3aXRob3V0IGhhdmluZwogIGN1cmwgYXNrIGZvciBpdCBpbnRlcmFjdGl2ZWx5PyBUaGUgY3VycmVudCBpbXBsbWVudGF0aW9uIHRha2VzIGFuIGVtcHR5CiAgcGFzc3dvcmQgYXMgYSByZXF1ZXN0IGZvciBhIHBhc3N3b3JkIHByb21wdC4gSG93ZXZlciwgSSBzdGlsbCB3YW50IHRvCiAgc3VwcG9ydCBhIGJsYW5rIHVzZXIgZmllbGQuIFRodXMsIHRvZGF5IGlmIHlvdSBlbnRlciAiLXUgOiIgKHdpdGhvdXQgdXNlcgogIGFuZCBwYXNzd29yZCkgY3VybCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLiBUcmlja3kuIEhvdyB3b3VsZCB5b3UKICBzcGVjaWZ5IHlvdSB3YW50IHRoZSBwcm9tcHQgb3RoZXJ3aXNlPwoKLSBNYWRlIHRoZSBuZXRyYyBwYXJzZSByZXN1bHQgcG9zc2libGUgdG8gdXNlIGZvciBvdGhlciBwcm90b2NvbHMgdGhhbiBGVFAgYW5kCiAgSFRUUCAoc3VjaCBhcyB0aGUgdXBjb21pbmcgVEVMTkVUIGZpeGVzKS4KCi0gVGhlIHByZXZpb3VzbHkgbWVudGlvbmVkICJNU1ZDKysgcHJvYmxlbXMiIHR1cm5lZCBvdXQgdG8gYmUgYSBub24taXNzdWUuCgotIEFkZGVkIGEgSFRUUCBmaWxlIHVwbG9hZCBjb2RlIGV4YW1wbGUgaW4gdGhlIGRvY3MvZXhhbXBsZXMvIHNlY3Rpb24gb24KICByZXF1ZXN0LgoKLSBBZGp1c3RlZCB0aGUgRlRQIHJlc3BvbnNlIGZpeCBzbGlnaHRseS4KClZlcnNpb24gNy42LjEtcHJlMwoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZvdW5kIGEgZmxhdyBpbiB0aGUgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbiBmb3IgRlRQIHRoYXQKICBjb3VsZCBtYWtlIGxpYmN1cmwgbm90IGdldCBvdXQgb2YgdGhlIGxvb3AgcHJvcGVybHkgd2hlbiBpdCBzaG91bGQsIGlmCiAgbGliY3VybCBnb3QgLTEgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBzb2NrZXQuCgotIEkgZm91bmQgYSBzaW1pbGFyIG1pc3Rha2UgaW4gaHR0cC5jIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgcmVhZGluZyB0aGUKICByZXN1bHRzIGZyb20gdGhlIHByb3h5IGNvbm5lY3Rpb24uCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVkMgbWFrZWZpbGUgaW4gc3JjLyBuZWVkZWQgdGhlIGxpYnBhdGggc2V0CiAgZm9yIHRoZSBkZWJ1ZyBidWlsZCB0byB3b3JrLgoKLSBEYW5pZWwgR2VocmlnZXIgc3RlcHBlZCBpbiB0byBhc3Npc3Qgd2l0aCB0aGUgVkMrKyBzdHVmZiBSb2JlcnQgV2VhdmVyCiAgYnJvdWdodCB1cCB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gYnJvdWdodCBhIGJpZyBwYXRjaCB0aGF0IGJyaW5ncyBJUHY2LWF3YXJlbmVzcyB0bwogIGEgYnVuY2ggb2YgZGlmZmVyZW50IGFyZWFzIHdpdGhpbiBsaWJjdXJsLgoKLSBSb2JlcnQgV2VhdmVyIHRvbGQgbWUgYWJvdXQgdGhlIHByb2JsZW1zIHRoZSBNUyBWQysrIDYuMCBjb21waWxlciBoYXMgd2l0aAogIHRoZSAnc3RhdGljJyBrZXl3b3JkIG9uIGEgbnVtYmVyIG9mIGxpYmN1cmwgZnVuY3Rpb25zLiBJIG1pZ2h0IG5lZWQgdG8gYWRkIGEKICBwYXRjaCB0aGF0IHJlZGVmaW5lcyBzdGF0aWMgd2hlbiBsaWJjdXJsIGlzIGNvbXBpbGVkIHdpdGggdGhhdCBjb21waWxlci4KICBIb3cgZG8gSSBrbm93IHdoZW4gVkMrKyBjb21waWxlcywgYW55b25lPwoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDEpCi0gY3VybF9nZXRpbmZvKCkgd2FzIGV4dGVuZGVkIHdpdGggdHdvIG5ldyBvcHRpb25zOgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQuIFRoZXkKICByZXR1cm4gdGhlIGZ1bGwgYXNzdW1lZCBjb250ZW50IGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgaW4gdGhlIGdpdmVuCiAgZGlyZWN0aW9uLiBUaGUgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgd2lsbCBiZSB0aGUgQ29udGVudC1MZW5ndGg6CiAgc2l6ZSBvZiBhIEhUVFAgZG93bmxvYWQuIEFkZGVkIGRlc2NyaXB0aW9ucyB0byB0aGUgbWFuIHBhZ2UgYXMgd2VsbC4gVGhpcwogIHdhcyBkb25lIGFmdGVyIGRpc2N1c3Npb25zIHdpdGggQm9iIFNjaGFkZXIuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBwcm92aWRlZCBhbm90aGVyIGZpeCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgdW5kZXIgdGhlIG1vcmUKICByZWNlbnQgY3lnd2luIGluc3RhbGxhdGlvbnMuIEl0IHNlZW1zIHRoZXkndmUgY2hhbmdlZCB0aGUgcHJlc2V0IGRlZmluZXMgdG8KICBub3QgaW5jbHVkZSBXSU4zMiBhbnltb3JlLgoKVmVyc2lvbiA3LjYuMS1wcmUyCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMSkKLSBDdXJsX3JlYWQoKSBhbmQgY3VybF9yZWFkKCkgbm93IHJldHVybiBhIHNzaXplX3QgZm9yIHRoZSBzaXplLCBhcyBpdCBoYWQgdG8KICBiZSBhYmxlIHRvIHJldHVybiAtMS4gVGhlIHRlbG5ldCBzdXBwb3J0IGNyYXNoZWQgZHVlIHRvIHRoaXMgYW5kIHRoZXJlIHdhcyBhCiAgcG9zc2liaWxpdHkgdG8gd2VpcmQgYmVoYXZpb3IgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZCAKICBhbmQgaXQgd29ya3MgZm9yIGhpbS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDAxKQotIFNvIHRoZSBIVFRQIFBVVCByZXN1bWUgZml4IHdhc24ndCBnb29kLiBUaGVyZSBzaG91bGQgYXBwZWFyYW50bHkgYmUgYQogIENvbnRlbnQtUmFuZ2UgaGVhZGVyIHdoZW4gcmVzdW1pbmcgYSBQVVQuCgotIEkgbm90aWNlZCBJIGJyb2tlIHRoZSBkb3dubG9hZC1jaGVjayB0aGF0IHZlcmlmaWVzIHRoYXQgYSByZXN1bWVkIEhUVFAKICBkb3dubG9hZCBpcyBhY3R1YWxseSByZXN1bWVkLiBJdCBnb3QgYnJva2UgYmVjYXVzZSBteSBuZXcgJ2h0dHByZXEnIGZpZWxkCiAgaW4gdGhlIG1haW4gY3VybCBzdHJ1Y3QuIEkgc2hvdWxkIGdldCBzbGFwcGVkLiBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvcgogIHRoaXMgbm93LCBzbyBJIHdvbid0IGJlIGFibGUgdG8gcnVpbiB0aGlzIGFnYWluIHdpdGhvdXQgbm90aWNpbmcuCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBjb250ZW50LWxlbmd0aCB2ZXJpZnlpbmcgd2hlbiBkb3dubG9hZGluZyBIVFRQLgoKLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB0aXRsZSBzYXkgaWYgdGhlIHRyYW5zZmVyIGlzIGJlaW5nIHRyYW5zZmVyZWQuIEl0CiAgbWFrZXMgdGhlIG91dHB1dCBzbGlnaHRseSBiZXR0ZXIgZm9yIHJlc3VtZXMuCgotIFdoZW4gZGVhbGluZyB3aXRoIExvY2F0aW9uOiBhbmQgSFRUUCByZXR1cm4gY29kZXMsIGxpYmN1cmwgd2lsbCBub3QgYXR0ZW1wdAogIHRvIGZvbGxvdyB0aGUgc3Bpcml0IG9mIFJGQzI2MTYgYmV0dGVyLiBJdCBtZWFucyB0aGF0IHdoZW4gUE9TVGluZyB0byBhCiAgVVJMIHRoYXQgaXMgYmVpbmcgZm9sbG93aW5nIHRvIGEgc2Vjb25kIHBsYWNlLCB0aGUgc3RhbmRhcmQgd2lsbCBqdWRnZSBvbgogIHdoYXQgdG8gZG8uIEFsbCBIVFRQIGNvZGVzIGV4Y2VwdCAzMDMgYW5kIDMwNSB3aWxsIGNhdXNlIGN1cmwgdG8gbWFrZSBhCiAgc2Vjb25kIFBPU1Qgb3BlcmF0aW9uLiAzMDMgd2lsbCBtYWtlIGEgR0VUIGFuZCAzMDUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCgogIEkgYWxzbyB3cm90ZSB0d28gdGVzdCBjYXNlcyBmb3IgdGhpcyBQT1NUL0dFVC9Mb2NhdGlvbiBzdHVmZi4KClZlcnNpb24gNy42CgpEYW5pZWwgKDI2IEphbnVhcnkgMjAwMSkKLSBMb3RzIG9mIG1haWxzIGJhY2sgYW5kIGZvcnRoIHdpdGggQm9iIFNjaGFkZXIgZmluYWxseSBtYWRlIG1lIGFkZCBhIHNtYWxsCiAgcGllY2Ugb2YgY29kZSBpbiB0aGUgSFRUUCBlbmdpbmUgc28gdGhhdCBIVFRQIHVwbG9hZCByZXN1bWUgd29ya3MuIFlvdSBjYW4KICBub3cgZG8gYW4gb3BlcmF0aW9uIGxpa2UgJ2N1cmwgLVQgZmlsZSAtQyA8b2Zmc2V0PiA8VVJMPicgYW5kIGN1cmwgd2lsbCBQVVQKICB0aGUgZW5kaW5nIHBhcnQgb2YgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZ2l2ZW4gb2ZmZXQgdG8gdGhlIHNwZWNpZmllZCBVUkwuCgpWZXJzaW9uIDcuNi1wcmU0CgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMSkKLSBJIHRvb2sgaG9sZCBvZiBSaWNrIEpvbmVzJyBxdWVzdGlvbiB3aHkgd2UgZG9uJ3QgdXNlIHJlY3YoKSBhbmQgc2VuZCgpIGZvcgogIHJlYWRpbmcvd3JpdGluZyB0byB0aGUgc29ja2V0cyBhbmQgSSd2ZSBub3cgbW9kaWZpZWQgdGhlIHNyZWFkKCkgYW5kCiAgc3dyaXRlKCkgbWFjcm9zIHRvIHVzZSB0aGVtIGluc3RlYWQuIElmIG5vdGhpbmcgZWxzZSwgdGhleSBjb3VsZCBiZSB0ZXN0ZWQKICBpbiB0aGUgbmV4dCBiZXRhLXJvdW5kIGNvbWluZyByaWdodCB1cC4KCi0gSmVmZiBNb3Jyb3cgZm91bmQgYSBwcm9ibGVtIHdpdGggbGliY3VybCdzIHVzYWdlIG9mIFNTTF9yZWFkKCkgYW5kIHN1cHBsaWVkCiAgaGlzIHJlc2VhcmNoIHJlc3VsdHMgaW4gaG93IHRvIGZpeCB0aGlzLiBJdCB0dXJucyBvdXQgd2UgaGF2ZSB0byBpbnZva2UgdGhlCiAgZnVuY3Rpb24gc2V2ZXJhbCB0aW1lcyBpbiBzb21lIGNhc2VzLiBUaGUgc2FtZSBnb2VzIGZvciB0aGUgU1NMX3dyaXRlKCkuCgogIEkgbWFkZSBzb21lIHJhdGhlciBkcmFzdGljIGNoYW5nZXMgYWxsIG92ZXIgbGliY3VybCB0byBtYWtlIGFsbCB3cml0ZXMgYW5kCiAgcmVhZHMgZ2V0IGRvbmUgb24gb25lIHNpbmdsZSBwbGFjZSBzbyB0aGF0IHRoaXMgcmVwZWF0ZWQtYXR0ZW1wdHMgdGhpbmcKICB3b3VsZCBvbmx5IGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgYXQgb25lIHBvaW50LgoKLSBSaWNrIEpvbmVzIHNwb3R0ZWQgdGhhdCB0aGUgJ3RvdGFsIHRpbWUnIGNvdW50ZXIgcmVhbGx5IGRpZG4ndCBtZWFzdXJlIHRoZQogIHRvdGFsIHRpbWUgdmVyeSBhY2N1cmF0ZSBvbiBzdWJzZWNvbmQgbGV2ZWxzLgoKLSBKb2hhbiBOaWxzc29uIHBvaW50ZWQgb3V0IHRoZSBuZWVkIHRvIG1vcmUgY2xlYXJseSBzcGVjaWZ5IHRoYXQgdGhlIHRpbWVvdXQKICB2YWx1ZSB5b3Ugc2V0IGZvciBhIGRvd25sb2FkIGlzIGZvciB0aGUgKmVudGlyZSogZG93bmxvYWQuIFRoZXJlJ3MgY3VycmVudGx5CiAgbm8gb3B0aW9uIGF2YWlsYWJsZSB0aGF0IHNldHMgYSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSBvbmx5LgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gc3VibWl0dGVkIGEgc2VyaWVzIG9mIHBhdGNoZXMgcmVxdWlyZWQgdG8gZ2V0IGN1cmwgdG8gY29tcGlsZQogIHByb3Blcmx5IHdpdGggY3lnd2luLgoKLSBSb2JlcnQgV2VhdmVyIHBvc3RlZCBhIGZpeCBmb3IgdGhlIHdpbjMyIHNlY3Rpb24gb2YgdGhlIGN1cmxfZ2V0ZW52KCkgY29kZQogIHRoYXQgY29ycmVjdGVkIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLgoKLSBBZGRlZCBjb21tZW50cyBpbiBhIGZldyBmaWxlcyBpbiBhIHN1ZGRlbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHNvdXJjZXMgbW9yZQogIGVhc3kgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZCEKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAxKQotIEFkZGVkIHNpbXBsZSBJUHY2IGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgbWFkZSB0aGUgdmVyc2lvbgogIHN0cmluZyBhZGQgJ2lwdjYnIHRvIHRoZSBlbmFibGUgc2VjdGlvbiBpbiB0aGF0IGNhc2UuIEVOQUJMRV9JUFY2IHdpbGwgYmUKICBzZXQgaWYgY3VybCBpcyBjb21waWxlZCB3aXRoIElQdjYgc3VwcG9ydCBlbmFibGVkLgoKLSBBZGRlZCBhIHBhcnNlciBmb3IgSVB2Ni1zdHlsZSBzcGVjaWZpZWQgSVAtYWRkcmVzc2VzIGluIGEgVVJMLiBUaHVzLCB3aGVuCiAgSVB2NiBnZXRzIGVuYWJsZWQgc29vbiwgd2UgY2FuIHVzZSBVUkxzIGxpa2UgJ1swOjoxXTo4MCcuLi4KCi0gTWFkZSB0aGUgVVJMIGdsb2JiaW5nIGluIHRoZSBjbGllbnQgcG9zc2libGUgdG8gZmFpbCBzaWxlbnRseSBpZiB0aGVyZSdzIGFuCiAgZXJyb3IgaW4gdGhlIGdsb2JiaW5nLiBJdCBtYWtlcyBpdCBhbG1vc3QgaW50dWl0aXZlLCBzbyB3aGVuIHlvdSBkb24ndAogIGZvbGxvdyB0aGUgc3ludGF4IHJ1bGVzLCBnbG9iYmluZyBpcyBzaW1wbHkgc3dpdGNoZWQgb2ZmIGFuZCB0aGUgcmF3IHN0cmluZwogIGlzIHVzZWQgaW5zdGVhZC4KCiAgSSBzdGlsbCB0aGluayB3ZSdsbCBnZXQgcHJvYmxlbXMgd2l0aCBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcyB3aGVuIHdlICp3YW50KgogIGdsb2JiaW5nIG9uIHBhcnRzIG9mIHRoZSBVUkwgYXMgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgVVJMIHdpbGwgZm9yIHN1cmUKICBzZXJpb3VzbHkgY29uZnVzZSB0aGUgZ2xvYmJlci4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcHJvZ3Jlc3MgbWV0ZXIgcGF0Y2ggdGhhdCBtYWtlcyBpdCBsb29rIGJldHRlciBldmVuCiAgZHVyaW5nIHNsb3cgc3RhcnRzLiBQcmV2aW91c2x5IGl0IG1hZGUgc29tZSBzaWxseSBhc3N1bXB0aW9ucy4uLgoKLSBBZGRlZCB0d28gRlRQIHRlc3RzIGZvciAtUSBhbmQgLVEgLSBzdHVmZiBzaW5jZSBpdCB3YXMgYmVpbmcgZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdC4gSGFkIHRvIGNvcnJlY3QgdGhlIGZ0cHNlcnZlci5wbCB0b28gYXMgaXQgYnVnZ2VkIHNsaWdodGx5LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgTG9jYXRpb246IHBhcnNlcnMgZGVhbCB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGh1cyBJIHJlbW92ZWQgdGhlIGxhc3QKICBjb2RlIHRoYXQgcmVzdHJpY3RzIHRoZSBsZW5ndGggb2YgVVJMcyB0aGF0IGN1cmwgc3VwcG9ydHMuCgotIEFkZGVkIGEgLS1nbG9ib2ZmIHRlc3QgY2FzZSAoIzI4KSBhbmQgaXQgcXVpY2tseSBpZGVudGlmaWVkIGEgbWVtb3J5IHByb2JsZW0KICBpbiBzcmMvbWFpbi5jIHRoYXQgSSB0b29rIGNhcmUgb2YuCgpWZXJzaW9uIDcuNi1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSB0d28gZm9ybWVyIGZpbGVzIGxpYi9kb3dubG9hZC5jIGFuZCBsaWIvaGlnaGxldmVsLmMgYmVjb21lIHRoZSBuZXcKICBsaWIvdHJhbnNmZXIuYyB3aGljaCBtYWtlcyBtb3JlIHNlbnNlLiBJIGFsc28gZGlkIHRoZSByZW5hbWUgZnJvbSBUcmFuc2ZlcigpCiAgdG8gQ3VybF9UcmFuc2ZlcigpIGluIHRoZSBvdGhlciBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uCiAgaW4gdGhlIHNwaXJpdCBvZiB1c2luZyBDdXJsXyBwcmVmaXggZm9yIGxpYnJhcnktc2NvcGVkIGdsb2JhbCBzeW1ib2xzLgoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgLWcvLS1nbG9ib2ZmIHRoYXQgc3dpdGNoZXMgT0ZGIHRoZSBVUkwgZ2xvYmJpbmcgYW5kIHRodXMgZW5hYmxlcyB7fVtdCiAgbGV0dGVycyB0byBiZSBwYXJ0IG9mIHRoZSBVUkwuIERvIG5vdGUgdGhhdCBSRkMyMzk2IHNlY3Rpb24gMi40LjMgZXhwbGljaXRseQogIG1lbnRpb24gdGhlc2UgbGV0dGVycyB0byBiZSBlc2NhcGVkLiBUaGlzIHdhcyBwb3N0ZWQgYXMgYSBmZWF0dXJlIHJlcXVlc3QgYnkKICBKb3JnZSBHdXRpZXJyZXogYW5kIGFzIGEgYnVnIGJ5IFRlcnJ5LgoKLSBTaG9ydCBvcHRpb25zIHRvIGN1cmwgdGhhdCByZXF1aXJlcyBwYXJhbWV0ZXJzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGhvdXQKICBoYXZpbmcgdGhlIG9wdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBzcGFjZSBzZXBhcmF0ZWQuIC1vZmlsZSB3b3JrcyBhcyBnb29kIGFzCiAgLW8gZmlsZS4gLW0yMCBpcyBlcXVhbCB0byAtbSAyMC4gRG8gbm90ZSB0aGF0IHRoaXMgZ29lcyBmb3Igc2luZ2xlLWxldHRlcgogIG9wdGlvbnMgb25seSwgdmVyYm9zZSAtLWxvbmctc3R5bGUgb3B0aW9ucyBzdGlsbCBtdXN0IGJlIHNlcGFyYXRlZCB3aXRoCiAgc3BhY2UgZnJvbSB0aGVpciBwYXJhbWV0ZXJzLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwMSkKLSBGcmFuY2lzIERhZ2VuYWlzIHJlcG9ydGVkIHRoYXQgdGhlIFNDTyBjb21waWxlciBzdGlsbCBmYWlscyB3aGVuIGNvbXBpbGluZwogIGN1cmwgZHVlIHRvIHRoYXQgZ2V0cGFzc19yKCkgcHJvdG90eXBlLiBJJ3ZlIG5vdyBwdXQgaXQgYXJvdW5kICNpZm5kZWYKICBIQVZFX0dFVFBBU1NfUiBpbiBhbiBhdHRlbXB0IHRvIHBsZWFzZSB0aGUgU0NPIHN5c3RlbXMuCgotIE1hZGUgc29tZSBtaW5vciBjb3JyZWN0aW9ucyB0byBnZXQgdGhlIGNsaWVudCB0byBjbGVhbnVwIHByb3Blcmx5IGFuZCBJIG1hZGUKICB0aGUgc2VwYXJhdG9yIHdvcmsgYWdhaW4gd2hlbiBnZXR0aW5nIG11bHRpcGxlIGdsb2JiZWQgVVJMcyB0byBzdGRvdXQuCgotIFdvcmtlZCB3aXRoIExvaWMgRGFjaGFyeSB0byBnZXQgdGhlIG1ha2UgZGlzdCBhbmQgbWFrZSBkaXN0Y2hlY2sgd29yawogIGNvcnJlY3RseS4gVGhlICdtYWtldGd6JyBzY3JpcHQgaXMgbm93IHVzaW5nIHRoZSBhdXRvbWFrZSBnZW5lcmF0ZWQgJ21ha2UKICBkaXN0JyB3aGVuIGNyZWF0aW5nIHJlbGVhc2UgYXJjaGl2ZXMuIExvaWMgc3VjY2Vzc2Z1bGx5IG1hZGUgJ21ha2UgcnBtcycKICBhdXRvbWF0aWNhbGx5IGJ1aWxkIFJQTXMhCgpMb2ljIERhY2hhcnkgKDYgSmFudWFyeSAyMDAxKQotIEF1dG9tYXRlZCBnZW5lcmF0aW9uIG9mIHJwbSBwYWNrYWdlcywgbm8gbmVlZCB0byBiZSByb290LgoKLSBtYWtlIGRpc3RjaGVjayBnZW5lcmF0ZXMgYSBwcm9wZXIgZGlzdHJpYnV0aW9uIChFWFRSQV9ESVNUCiAgaW4gYWxsIE1ha2VmaWxlLmFtIG1vZGlmaWVkIHRvIG1hdGNoIEZJTEVTKS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDEpCi0gSHVnZSBjbGllbnQtc2lkZSBoYWNrOiBub3cgbXVsdGlwbGUgVVJMcyBhcmUgc3VwcG9ydGVkLiBBbnkgbnVtYmVyIG9mIFVSTHMKICBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGV5J2xsIGFsbCBiZSBkb3dubG9hZGVkLiBUaGVyZQogIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIC1vIG9yIC1PIGZvciBlYWNoIFVSTCBvciB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8KICBzdGRvdXQuIFRoaXMgbmVlZHMgbW9yZSB0ZXN0aW5nLCB0aW1lIHRvIHJlbGVhc2UgYSA3LjYtcHJlIHBhY2thZ2UuCgotIFRoZSBrcmI0IHN1cHBvcnQgd2FzIGJyb2tlbiBpbiB0aGUgcmVsZWFzZS4gRml4ZWQgbm93LgoKLSBIdWdlIGludGVybmFsIHN5bWJvbCByZW5hbWUgb3BlcmF0aW9uLiBBbGwgbm9uLXN0YXRpYyBidXQgc3RpbGwgbGliLWludGVybmFsCiAgc3ltYm9scyBzaG91bGQgbm93IGJlIHByZWZpeGVkIHdpdGggJ0N1cmxfJyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aCBvdGhlcgogIGxpYnMuIEFsbCBwdWJsaWMgc3ltYm9scyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnY3VybF8nIGFuZCB0aGUgcmVzdCBzaG91bGQKICBiZSBzdGF0aWMgYW5kIHRodXMgaW52aXNpYmxlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBJIHVwZGF0ZWQgdGhlIElOVEVSTkFMUwogIGRvY3VtZW50IHRvIHNheSB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNS4yCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAxKQotIEFzIEtldmluIFAgUm90aCBzdWdnZXN0ZWQsIEkndmUgYWRkZWQgdGV4dCB0byB0aGUgbWFuIHBhZ2UgZm9yIGV2ZXJ5IGNvbW1hbmQKICBsaW5lIG9wdGlvbiBhbmQgd2hhdCBoYXBwZW5zIHdoZW4geW91IHNwZWNpZnkgdGhhdCBvcHRpb24gbW9yZSB0aGFuCiAgb25jZS4gVGhhdCBoYXNuJ3QgYmVlbiBleGFjdGx5IGNyeXN0YWwgY2xlYXIgYmVmb3JlLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHBvc3NpYmxlIHRvIHJ1biBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLiBGb3IKICBvZGQgcmVhc29ucyBJIGNhbid0IGJ1aWxkIGN1cmwgcHJvcGVybHkgb3V0c2lkZSB0aG91Z2guIEl0IGhhcyB0byBkbyB3aXRoCiAgY3VybCdzIGRlcGVuZGVuY2llcyBvbiBsaWJjdXJsLi4uCgotIEN1dCBvZmYgYWxsIG9sZGVyIChkYXRlZCAxOTk5IGFuZCBlYXJsaWVyKSBDSEFOR0VTIGVudHJpZXMgZnJvbSB0aGlzIGZpbGUuCiAgVGhlIG9sZGVyIHBpZWNlIGlzIG5hbWVkIENIQU5HRVMuMCBhbmQgaXMgYWRkZWQgdG8gdGhlIENWUyByZXBvc2l0b3J5IGluCiAgY2FzZSBhbnlvbmUgd291bGQgbmVlZCBpdC4KCi0gSSBhZGRlZCBhbm90aGVyIGZpbGUgJ0NWUy1JTkZPJyB0byB0aGUgQ1ZTLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAogIGZpbGVzIGluIHRoZSBDVlMgdGhhdCBhcmVuJ3QgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgaG93IHRvIGJ1aWxkCiAgY3VybCB3aGVuIHlvdSBnZXQgdGhlIHNvdXJjZXMgb2ZmIENWUy4KCi0gVXBkYXRlZCBDT05UUklCVVRFIGFuZCBGQVEgZHVlIHRvIHRoZSBuZXcgbGljZW5zZS4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDEpCi0gUmVuYW1lZCBSRUFETUUubGliY3VybCB0byBMSUJDVVJMCgotIENoYW5nZWQgaGVhZGVycyBpbiBhbGwgc291cmNlcyBmaWxlcyB0byB0aGUgbmV3IGR1YWwgbGljZW5zZSBjb25jZXB0IG9mCiAgY3VybDogdXNlIHRoZSBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlICpvciogTVBMLiBUaGUgTEVHQUwgZmlsZSB3YXMgdXBkYXRlZAogIGFjY29yZGluZ2x5IGFuZCB0aGUgTVBMIDEuMSBhbmQgTUlUL1ggZGVyaXZhdGUgbGljZW5zZXMgYXJlIG5vdyBwYXJ0IG9mIHRoZQogIHJlbGVhc2UgYXJjaGl2ZS4KRGFuaWVsICgzMCBEZWNlbWJlciAyMDAwKQotIE1hZGUgYWxsIEZUUCBjb21tYW5kcyBnZXQgc2VudCB3aXRoIHRoZSB0cmFpbGluZyBDUkxGIGluIG9uZSBzaW5nbGUgd3JpdGUoKQogIGFzIHNwbGl0dGluZyB0aGVtIHVwIHNlZW1zIHRvIGNvbmZ1c2UgYXQgbGVhc3Qgc29tZSBmaXJld2FsbHMgKEZXLTEgYmVpbmcKICBvbmUgbWFqb3IpLgoKRGFuaWVsICgxOSBEZWNlbWJlciAyMDAwKQotIEFkZGVkIGZpbGUgZGVzcmNpcHRvciBhbmQgRklMRSBoYW5kbGUgbGVhayBkZXRlY3Rpb24gdG8gdGhlIG1lbWRlYnVnIHN5c3RlbQogIGFuZCB0aHVzIEkgZm91bmQgYW5kIHJlbW92ZWQgYSBmaWxlIGRlc2NyaXB0b3IgbGVha2FnZSBpbiB0aGUgZnRwIHBhcnRzCiAgdGhhdCBoYXBwZW5lZCB3aGVuIHlvdSBkaWQgUE9SVGVkIGRvd25sb2Fkcy4KCi0gQWRkZWQgYW4gaW5jbHVkZSA8c3RkaW8uaD4gaW4gPGN1cmwvY3VybC5oPiBzaW5jZSBpdCB1c2VzIEZJTEUgKi4KCkRhbmllbCAoMTIgRGVjZW1iZXIgMjAwMCkKLSBNdWx0aXBsZSBVUkwgZG93bmxvYWRzIHdpdGggLU8gd2FzIHN0aWxsIGJ1Z2dpbmcuIE5vdCBhbnltb3JlIEkgdGhpbmsgb3IKICBob3BlLCBvciBhdCBsZWFzdCBJJ3ZlIHRyaWVkLi4uIDotTwoKLSBGcmFuY29pcyBQZXRpdGplYW4gZml4ZWQgYW5vdGhlciAtTyBwcm9ibGVtCgpWZXJzaW9uIDcuNS4xCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDApCi0gQ2xlYW5lZCB1cCBhIGZldyBvZiB0aGUgbWFrZWZpbGVzIHRvIHVzZSB1bml4LXN0eWxlIG5ld2xpbmVzIG9ubHkuIEFzIEtldmluCiAgUCBSb3RoIGZvdW5kIG91dCwgYXQgbGVhc3Qgb25lIENWUyBjbGllbnQgYmVoYXZlZCB3cm9uZ2x5IHdoZW4gaXQgZm91bmQKICBkaWZmZXJlbnQgbmV3bGluZSBjb252ZW50aW9ucyB3aXRoaW4gdGhlIHNhbWUgZmlsZS4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBjb3JyZWN0ZWQgdGhlIExERkxBR1MgdXNlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvcgogIHRoZSBTU0wgc3R1ZmYuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwMCkKLSBNYXNzaW1vIFNxdWlsbGFjZSBjb3JyZWN0bHkgZGVzY3JpYmVkIGhvdyBsaWJjdXJsIGNvdWxkIHVzZSBzZXNzaW9uIGlkcyB3aGVuCiAgZG9pbmcgU1NMIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBHcmlmZml0aHMgZm91bmQgb3V0IHRoYXQgY3VybCB3b3VsZCBjcmFzaCBpZiB0aGUgZmlsZSB5b3Ugc3BlY2lmeSB3aXRoCiAgLW8gaXMgc2hvcnRlciB0aGFuIHRoZSBVUkwhIFRoaXMgdG9vayBzb21lIGhvdXJzIHRvIGZ1bGx5IGh1bnQgZG93biwgYnV0IGl0CiAgaXMgZml4ZWQgbm93LgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDApCi0gSmFlcGlsIEtpbSBzZW50IHVzIG1ha2VmaWxlcyB0aGF0IGJ1aWxkIGN1cmwgdXNpbmcgdGhlIGZyZWUgd2luZG93cyBib3JsYW5kCiAgY29tcGlsZXIuIFRoZSByb290IG1ha2VmaWxlIG5vdyBhY2NlcHRzICdtYWtlIGJvcmxhbmQnIHRvIGJ1aWxkIGN1cmwgd2l0aAogIHRoYXQgY29tcGlsZXIuCgotIFN0ZWZhbiBSYWRtYW4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgdGVzdCBtYWtlZmlsZXMgZGlkbid0IHVzZSB0aGUgUEVSTAogIHZhcmlhYmxlIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGZpZ3VyZSBvdXQuIEFjdHVhbGx5LCB5b3Ugc3RpbGwgbmVlZAogIHBlcmwgaW4gdGhlIHBhdGggZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIHJ1biBvay4KCi0gUmljaCBHcmF5IGZvdW5kIG51bWVyb3VzIHBvcnRhYmlsaXR5IHByb2JsZW1zOgogICogVGhlIFNDTyBjb21waWxlciBnb3QgYW4gZXJyb3Igb24gdGhlIGdldHBhc3NfcigpIHByb3RvdHlwZSBpbiBnZXRwYXNzLmgKICAgIHNpbmNlIHRoZSBjdXJsIG9uZSBkaWZmZXJlZCBmcm9tIHRoZSBTQ08gb25lCiAgKiBUaGUgSFBVWCBjb21waWxlciBnb3QgYW4gZXJyb3IgYmVjYXVzZSBvZiBob3cgY3VybCBkaWQgdGhlIHNpZ2FjdGlvbgogICAgc3R1ZmYgYW5kIHVzZWQgYSBkZWZpbmUgSFBVWCBkb2Vzbid0IGhhdmUgKG9yIG5lZWQpLgogICogQSBmZXcgbW9yZSBwcm9ibGVtcyByZW1haW4gdG8gYmUgcmVzZWFyY2hlZC4KCi0gUGF1bCBIYXJyaW5ndG9uIGV4cGVyaWVuY2VkIGEgY29yZSBkdW1wIHVzaW5nIGh0dHBzLiBOb3QgbXVjaCBkZXRhaWxzIHlldC4KCkRhbmllbCAoNCBEZWNlbWJlciAyMDAwKQotIEr2cm4gSGFydHJvdGggZml4ZWQgYSBwcm9ibGVtIHdpdGggbXVsdGlwbGUgVVJMcyBhbmQgLW8vLU8uCgpWZXJzaW9uIDcuNQoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDApCi0gQ3JhaWcgRGF2aXNvbiBnYXZlIHVzIGhpcyB1cGRhdGVzIG9uIHRoZSBWQysrIG1ha2VmaWxlcywgc28gbm93IGN1cmwgc2hvdWxkCiAgYnVpbGQgZmluZSB3aXRoIHRoZSBNaWNyb3NvZnQgY29tcGlsZXIgb24gd2luZG93cyB0b28uCgotIEZpeGVkIHRoZSBsaWJjdXJsIHZlcnNpb25pbmcgc28gdGhhdCB3ZSBkb24ndCBydWluIG9sZCBwcm9ncmFtcyB3aGVuCiAgcmVsZWFzaW5nIG5ldyBzaGFyZWQgbGlicmFyeSBpbnRlcmZhY2VzLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAwKQotIFJlbmFtZWQgZG9jcy9SRUFETUUuY3VybCB0byBkb2NzL01BTlVBTCB0byBiZXR0ZXIgcmVmbGVjdCB3aGF0IHRoZSBkb2N1bWVudAogIGFjdHVhbGx5IGNvbnRhaW5zLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAwKQotIEkgcmVtb3ZlZCBhIGJ1bmNoIG9mICcjaWYgMCcgc2VjdGlvbnMgZnJvbSB0aGUgY29kZS4gVGhleSBvbmx5IG1ha2UgdGhpbmdzCiAgaGFyZGVyIHRvIGZvbGxvdy4gQWZ0ZXIgYWxsLCB3ZSBkbyBoYXZlIGFsbCBvbGRlciB2ZXJzaW9ucyBpbiB0aGUgQ1ZTLgoKVmVyc2lvbiA3LjUtcHJlNQoKRGFuaWVsICgyOCBOb3ZlbWJlciAyMDAwKQotIEkgZmlsbGVkIGluIG1vcmUgZXJyb3IgY29kZXMgaW4gdGhlIG1hbiBwYWdlIGVycm9yIGNvZGUgbGlzdCB0aGF0IGhhZCBiZWVuCiAgbGFnZ2luZy4KCi0gSmFtZXMgR3JpZmZpdGhzIG1haWxlZCBtZSBhIGZpbmUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSBDVVJMT1BUX01BWFJFRElSUwogIGxpYmN1cmwgb3B0aW9uLiBXaGVuIHVzZWQsIGl0J2xsIHByZXZlbnQgbG9jYXRpb24gZm9sbG93aW5nIG1vcmUgdGhhbiB0aGUKICBzZXQgbnVtYmVyIG9mIHRpbWVzLiBJdCBpcyB1c2VmdWwgdG8gYnJlYWsgb3V0IG9mIGVuZGxlc3MgcmVkaXJlY3QtbG9vcHMuCgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdHdvIHRlc3QgY2FzZXMgZm9yIGZpbGU6Ly8uCgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdGhlIGxpYmN1cmwgQ1VSTE9QVF9GSUxFVElNRSBzZXRvcHQsIHdoZW4gc2V0IGl0IHRyaWVzIHRvIGdldCB0aGUKICBtb2RpZmllZCB0aW1lIG9mIHRoZSByZW1vdGUgZG9jdW1lbnQuIFRoaXMgaXMgYSBzcGVjaWFsIG9wdGlvbiBzaW5jZSBpdAogIGludm9sdmVzIGFuIGV4dHJhIHNldCBvZiBjb21tYW5kcyBvbiBGVFAgc2VydmVycy4gKFVzaW5nIHRoZSBNRFRNIGNvbW1hbmQKICB3aGljaCBpcyBub3QgaW4gdGhlIFJGQzk1OSkKCiAgY3VybF9lYXN5X2dldGluZm8oKSBnb3QgYSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0ZJTEVUSU1FIHRvIGdldCB0aGUgdGltZQogIGFmdGVyIGEgdHJhbnNmZXIuIEl0J2xsIHJldHVybiBhIHplcm8gaWYgQ1VSTE9QVF9GSUxFVElNRSB3YXNuJ3QgdXNlZCBvciBpZgogIHRoZSB0aW1lIHdhc24ndCBwb3NzaWJsZSB0byBnZXQuCgogIC0taGVhZC8tSSB1c2VkIG9uIGEgRlRQIHNlcnZlciB3aWxsIG5vdyBwcmVzZW50IGEgJ0xhc3QtTW9kaWZpZWQ6JyBoZWFkZXIKICBpZiBjdXJsIGNvdWxkIGdldCB0aGUgdGltZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuCgotIEFkZGVkIHRoZSBvcHRpb24gJy0tY2FjZXJ0IFtmaWxlXScgdG8gY3VybCwgd2hpY2ggYWxsb3dzIGEgc3BlY2lmaWVkIFBFTQogIGZpbGUgdG8gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSB3aGVuIGRvaW5nIEhUVFBTCiAgY29ubmVjdGlvbnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLCByYXRoZXIgcmVjZW50bHkgYnkgSHVsa2EgQm9odXNsYXYgYnV0CiAgb3RoZXJzIGhhdmUgYXNrZWQgZm9yIGl0IGJlZm9yZSBhcyB3ZWxsLgoKRGFuaWVsICgyMSBOb3ZlbWJlciAyMDAwKQotIE51bWVyb3VzIGZpeGVzIHRoZSB0ZXN0IHN1aXRlIGhhcyBicm91Z2h0IGludG8gdGhlIGRheWxpZ2h0OgoKICAgKiBjdXJsX3VuZXNjYXBlKCkgY291bGQgcmV0dXJuIGEgdG9vIGxvbmcgc3RyaW5nCiAgICogb24gZnRwIHRyYW5zZmVyIGZhaWx1cmVzLCB0aGVyZSBjb3VsZCBiZSBtZW1vcnkgbGVha3MKICAgKiBmdHAgQ1dEIGNvdWxkIHVzZSBiYWQgZGlyZWN0b3J5IG5hbWVzCiAgICogbWVtZGVidWcgbm93IHVzZXMgdGhlIG1wcmludGYoKSByb3V0aW5lcyBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5CiAgICogZnJlZShOVUxMKSByZW1vdmVkIHdoZW4gZG9pbmcgcmVzdW1lZCB0cmFuc2ZlcnMKCi0gQWRkZWQgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIGZvciBGVFAuCgotIEdlbmVyYWwgY2xlYW51cHMgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIHdpdGggZ2NjIC1XYWxsIC1wZWRhbnRpYy4KCi0gSSBtYWRlIHRoZSB0ZXN0cy9mdHBzZXJ2ZXIucGwgd29yayB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnRwCiAgb3BlcmF0aW9ucy4gUE9SVCwgUEFTViwgUkVUUiwgU1RPUiwgTElTVCwgU0laRSwgVVNFUiwgUEFTUyBhbGwgd29yayBub3cuIE5vdwogIGFsbCBJIGhhdmUgdG8gZG8gaXMgaW50ZWdyYXRlIHRoZSBmdHAgc2VydmVyIGRvaW5ncyBpbiB0aGUgcnVudGVzdHMucGwKICBzY3JpcHQgc28gdGhhdCBmdHAgdGVzdHMgY2FuIGJlIHJ1biB0aGUgc2FtZSB3YXkgaHR0cCB0ZXN0cyBhbHJlYWR5IHJ1bi4KCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMCkKLSBNYWRlIGxpYmN1cmwgY2FwYWJsZSBvZiBkZWFsaW5nIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaGUgZm9ybWVyIGxpbWl0IG9mCiAgNDA5NiBieXRlcyB3YXMgYSBiaXQgYW5ub3lpbmcgd2hlbiBwZW9wbGUgd2FudGVkIHRvIHVzZSBjdXJsIHRvIHJlYWxseSBtYWtlCiAgbGlmZSB0b3VnaCBvbiBhIHdlYiBzZXJ2ZXIuIE5vdywgdGhlIGNvbW1hbmQgbGluZSBsaW1pdCBpcyB0aGUgbW9zdCBhbm5veWluZwogIGJ1dCB0aGF0IGNhbiBiZSBjaXJjdW12ZW50ZWQgYnkgdXNpbmcgYSBjb25maWcgZmlsZS4KCiAgTk9URTogdGhlcmUgaXMgc3RpbGwgYSA0MDk2LWJ5dGUgbGltaXQgb24gVVJMcyBleHRyYWN0ZWQgZnJvbSBMb2NhdGlvbjoKICBoZWFkZXJzLgoKLSBDb3JyZWN0ZWQgdGhlIHNwZWxsaW5nIG9mICdyZXNvbHZlJyBpbiB0d28gZXJyb3IgbWVzc2FnZXMuCgotIEFsZXhhbmRlciBLb3VyYWtvcyBwb3N0ZWQgYSBidWcgcmVwb3J0IGFuZCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0ISBJdAogIHR1cm5lZCBvdXQgdGhhdCBseW54IGFuZCB3Z2V0IHN1cHBvcnQgbG93ZXJjYXNlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzCiAgd2hlcmUgY3VybCBvbmx5IGxvb2tlZCBmb3IgdGhlIHVwcGVyY2FzZSB2ZXJzaW9ucy4gTm93IGN1cmwgd2lsbCB1c2UgdGhlCiAgbG93ZXJjYXNlIHZlcnNpb25zIGlmIHRoZXkgZXhpc3QsIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCB1c2UgdGhlIHVwcGVyY2FzZQogIHZlcnNpb25zLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDAwKQotIGN1cmxfZm9ybWZyZWUoKSB3YXMgYWRkZWQuIEhvdyBjb21lIG5vIG9uZSBtaXNzZWQgdGhhdCBvbmUgYmVmb3JlPyBJIHJhbiB0aGUKICB0ZXN0IHN1aXRlIHdpdGggdGhlIG1hbGxvYyBkZWJ1ZyBlbmFibGVkIGFuZCBnb3QgbG90cyBvZiAibmljZSIgd2FybmluZ3Mgb24KICBtZW1vcnkgbGVha3MuIFRoZSBtb3N0IHNlcmlvdXMgb25lIHdhcyB0aGlzLiBUaGVyZSB3ZXJlIGFsc28gbGVha3MgaW4gdGhlCiAgY29va2llIGhhbmRsaW5nLCBhbmQgYSBmZXcgZXJyb3JzIHdoZW4gY3VybCBmYWlsZWQgdG8gY29ubmVjdCBhbmQgc2ltaWxhcgogIHRoaW5ncy4gTW9yZSB0ZXN0cyBjYXNlcyB3ZXJlIGFkZGVkIHRvIGNvdmVyIHVwIGFuZCB0byB2ZXJpZnkgdGhhdCB0aGVzZQogIHByb2JsZW1zIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBNdWNobyB1cGRhdGVkIGNvbmZpZyBmaWxlIHBhcnNlciAoSSdtIGRlYWQgdGlyZWQgb2YgYWxsIHRoZSBidWcgcmVwb3J0cyBhbmQKICB3ZWlyZCBiZWhhdmlvdXIgSSBnZXQgb24gdGhlIGZvcm1lciBvbmUpLiBJdCB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSBub3csCiAgYWx0aG91Z2ggSSBkb3VidCBtYW55IHBlb3BsZSB3aWxsIG5vdGljZSB0aGUgZGlmZmVyZW5jZXMuIFRoZSBtYWluCiAgZGlmZmVyZW5jZSBiZWluZyB0aGF0IGlmIHlvdSB1c2Ugb3B0aW9ucyB0aGF0IHJlcXVpcmUgcGFyYW1ldGVycywgdGhleSBtdXN0CiAgYm90aCBiZSBzcGVjaWZpZWQgb24gdGhlIHNhbWUgbGluZS4gV2l0aCB0aGlzIG5ldyBwYXJzZXIsIHlvdSBjYW4gYWxzbwogIHNwZWNpZnkgbG9uZyBvcHRpb25zIHdpdGhvdXQgJy0tJyBhbmQgeW91IG1heSBzZXBhcmF0ZSBvcHRpb25zIGFuZAogIHBhcmFtZXRlcnMgd2l0aCA6IG9yID0uIEl0IG1ha2VzIGEgY29uZmlnIGZpbGUgbGluZSBjb3VsZCBsb29rIGxpa2U6CgogICAgICAgIHVzZXItYWdlbnQgPSAiZm9vYmFyIGFuZCBzb21ldGhpbmciCgogIFBhcmFtZXRlcnMgd2l0aGluIHF1b3RlcyBtYXkgY29udGFpbiBzcGFjZXMuIFdpdGhvdXQgcXVvdGVzLCB0aGV5J3JlCiAgZXhwZWN0ZWQgdG8gYmUgYSBzaW5nbGUgbm9uLXNwYWNlIHdvcmQuCgogIEhhZCB0byBwYXRjaCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNlciBhIGxpdHRsZSB0byBtYWtlIHRoaXMgd29yay4KCi0gQWRkZWQgLS11cmwgYXMgYW4gb3B0aW9uIHRvIGFsbG93IHRoZSBVUkwgdG8gYmUgc3BlY2lmaWVkIHRoaXMgd2F5LiBJdCBtYWtlcwogIHdheSBuaWNlciBjb25maWcgZmlsZXMuIFRoZSBwcmV2aW91cyB3YXkgb2Ygc3BlY2lmeWluZyBVUkxzIGluIHRoZSBjb25maWcKICBmaWxlIGRvZXNuJ3Qgd29yayBhbnltb3JlLgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotIFVzaW5nIGNlcnRhaW4gY2hhcmFjdGVycyBpbiB1c2VybmFtZXMgb3IgcGFzc3dvcmRzIGZvciBIVFRQIGF1dGhlbnRpY2F0aW9uCiAgZmFpbGVkLiBUaGlzIHdhcyBkdWUgdG8gdGhlIG1wcmludGYoKSB0aGF0IGhhZCBhIHNpbGx5IGNoZWNrIGZvciBsZXR0ZXJzLAogIGFuZCBpZiB0aGV5IHdlcmVuJ3QgaXNwcmludCgpIHRoZXkgd2VyZW4ndCBvdXRwdXRlZCAiYXMtaXMiLiBUaGlzIGNhdXNlZAogIHBhc3N3b3JkcyBhbmQgdXNlcm5hbWVzIHVzaW5nICenJyAoZm9yIGV4YW1wbGUpIHRvIGZhaWwuCgpWZXJzaW9uIDcuNC4yCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gJ3Rlc3RzL3J1bnRlc3RzLnBsJyBub3cgc29ydHMgdGhlIHRlc3QgY2FzZXMgcHJvcGVybHkgd2hlbiAnYWxsJyBpcyB1c2VkLgoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDAwKQotIEkgZmVsbCBvdmVyIHRoZSBkcmFmdC1pZXRmLWZ0cGV4dC1tbHN0LTEyLnR4dCBJbnRlcm5ldCBEcmFmdCB0aXRsZWQKICAiRXh0ZW5zaW9ucyB0byBGVFAiIHRoYXQgY29udGFpbnMgYSBkZWZpbmVkIHdheSBob3cgdGhlIGZ0cCBjb21tYW5kIFNJWkUKICBjb3VsZCBiZSBhc3N1bWVkIHRvIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdXNpbmcgIi1DIC0iIGFuZCBGVFAgdXBsb2FkaW5nIGEKICBmaWxlIHRoYXQgaXNuJ3QgcHJzZW50IG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgbWlnaHQgdGhlbiByZXR1cm4gYSA1NTAgYW5kCiAgY3VybCB3aWxsIGZhaWwuIFNob3VsZCBpdCBpbnN0ZWFkIGFzIExhdXJlbnQgUGFwaWVyIHN1Z2dlc3RzLCBzdGFydAogIHVwbG9hZGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgYXMgYSBub3JtYWwgdXBsb2FkPwoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAwKQotIEZpeGVkIGEgY3Jhc2ggd2l0aCB0aGUgZm9sbG93bG9jYXRpb24gY291bnRlci4KCi0gV2hpbGUgd3JpdGluZyB0ZXN0IGNhc2VzIGZvciB0aGUgdGVzdCBzdWl0ZSwgSSBkaXNjb3ZlcmVkIGFuIG9sZCBsaW1pdGF0aW9uCiAgdGhhdCBwcmV2ZW50ZWQgLW8gYW5kIC1UIHRvIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSSByZW1vdmVkIHRoaXMKICBpbW1lZGlhdGVseSBhcyB0aGlzIGhhcyBubyByZWxldmFuY2UgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KICAKLSBDaHJpcyBGYWhlcnR5IGZpeGVkIGEgZnJlZS10d2ljZSBwcm9ibGVtIGluIGxpYi9maWxlLmMKCi0gSSBmaXhlZCB0aGUgcGVybCBodHRwIHNlcnZlciBwcm9ibGVtIGluIHRoZSB0ZXN0IHN1aXRlLgoKVmVyc2lvbiA3LjQuMiBwcmU0CgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDApCi0gSSd2ZSAoZmluYWxseSkgc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIEl0IGlzIGluIHRoZSBuZXcKICB0ZXN0cy8gZGlyZWN0b3J5LiBJdCByZXF1aXJlcyBzaCBhbmQgcGVybC4gVGhlcmUncyBhIFRDUCBzZXJ2ZXIgaW4gcGVybCBhbmQKICBtb3N0IG9mIHRoZSBvdGhlciBzdHVmZiBydW5uaW5nIGEgcHJldHR5IHNpbXBsZSBzaGVsbCBzY3JpcHQuCgogIEkndmUgb25seSBtYWRlIGZvdXIgdGVzdCBjYXNlcyBzbyBmYXIsIGJ1dCBpdCBwcm92ZXMgdGhlIHN5c3RlbSBjYW4gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgbm90aWNlZCB0aGF0IGN1cmwgZGlkbid0IHNldCBUWVBFIHdoZW4gZG9pbmcgLS1oZWFkIGNoZWNrcwogIGZvciBzaXplcyBvbiBGVFAgc2VydmVycy4gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gcmV0dXJuIGRpZmZlcmVudCBzaXplcwogIGRlcGVuZGluZyBvbiB3aGV0aGVyIEFTQ0lJIG9yIEJJTkFSWSBpcyB1c2VkIQoKLSBMYXVyZW50IFBhcGllciBkZXRlY3RlZCB0aGF0IGlmIHlvdSBhcHBlbmRlZCBhIEZUUCB1cGxvYWQgYW5kIGV2ZXJ5dGhpbmcgd2FzCiAgYWxyZWFkeSB1cGxvYWRlZCwgY3VybCB3b3VsZCBoYW5nLgoKLSBBbmd1cyBNYWNrYXkncyBnZXRwYXNzX3IoKSBpbiBsaWIvZ2V0cGFzcy5jIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUKICBnZXRwYXNzX3IoKSBmdW5jdGlvbiBpdCBzZWVtcyBzb21lIHN5c3RlbXMgYWN0dWFsbHkgaGF2ZS4KICAKLSBWZW5rYXRhcmFtYW5hIE1va2thcGF0aSBkZXRlY3RlZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlciBhbmQgY29ycmVjdGVkCiAgaXQuICBJZiB0aGUgY29va2llIHdhcyBzZXQgZm9yIHRoZSBmdWxsIGhvc3QgbmFtZSAoZG9tYWluPWZ1bGwuaG9zdC5jb20pLAogIHRoZSBjb29raWUgd2FzIG5ldmVyIHNlbnQgYmFjayBiZWNhdXNlIG9mIGEgZmF1bHR5IGxlbmd0aCBjb21wYXJpc29uIGJldHdlZW4KICB0aGUgc2V0IGRvbWFpbiBsZW5ndGggYW5kIHRoZSBjdXJyZW50IGhvc3QgbmFtZS4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IChPUy8yIHNlZW1zIHRvIG5lZWQKICBpdCkuIEFkZGVkIGEgY2hlY2sgZm9yIFJTQWdsdWUvcnNhcmVmIGZvciB0aGUgY2FzZXMgd2hlcmUgbGliY3J5cHRvIGlzIGZvdW5kCiAgYnV0IGxpYnNzbCBpc24ndC4gSSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgZml4IHlldCB0aG91Z2gsIGFzIEkgaGF2ZSBubwogIHN5c3RlbSB0aGF0IHJlcXVpcmVzIHRob3NlIGxpYnMgdG8gYnVpbGQuCiAgClZlcnNpb24gNy40LjIgcHJlMwoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDApCi0gUmVtb3ZlZCBwZXJyb3IoKSBvdXRwdXRzIGZyb20gZ2V0cGFzcy5jLiBBbmd1cyBNYWNrYXkgYWxzbyBhZ3JlZWQgdG8gYQogIHNsaWdodGx5IG1vZGlmaWVkIGxpY2Vuc2Ugb2YgdGhlIGdldHBhc3MuYyBmaWxlIGFzIHRoZSBwcm90b3R5cGUgd2FzIGNoYW5nZWQuCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBwb3NzaWJpbGl0eSB0byBzZXQgYSBwYXNzd29yZCBjYWxsYmFjayB0byB1c2UgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4uCiAgVGhleSdyZSBjb250cm9sZWQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkgb2YgY291cnNlLCB0aGUgdGFncyBhcmUKICBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuCgotIFVzZWQgVC4gQmhhcmF0aCdzIHRoaW5raW5nIGFuZCBmaXhlZCB0aGUgdGltZXJzIHRoYXQgc2hvd2VkIHRlcnJpYmx5IHdyb25nCiAgdGltZXMgd2hlbiBsb2NhdGlvbjogaGVhZGVycyB3ZXJlIGZvbGxvd2VkLgoKLSBFbW1hbnVlbCBUeWNob24gZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkbid0IHJlYWxseSBsaWtlIHVzZXIgbmFtZXMgb25seSBpbgogIHRoZSBVUkwuIEkgY29ycmVjdGVkIHRoaXMgYW5kIEkgYWxzbyBmaXhlZCB0aGUgc2luY2UgbG9uZyBsaXZpbmcgcHJvYmxlbQogIHdpdGggVVJMIGVuY29kZWQgdXNlciBuYW1lcyBhbmQgcGFzc3dvcmRzIGluIHRoZSBVUkxzLiBUaGV5IHNob3VsZCB3b3JrIG5vdy4KICAKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDApCi0gV2hlbiBJIGFkZGVkIC0taW50ZXJmYWNlLCB0aGUgbmV3IGVycm9yIGNvZGUgdGhhdCB3YXMgYWRkZWQgd2l0aCBpdCB3YXMKICBpbnNlcnRlZCBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHRodXMgYWxsIGVycm9yIGNvZGVzIGZyb20gMzUgYW5kIHVwd2FyZHMgZ290CiAgaW5jcmVhc2VkIG9uZSBzdGVwLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQsIHdlJ3JlIGJhY2sgYXQgdGhlIHByZXZpb3VzCiAgbnVtYmVycy4gQWxsIG5ldyBleGl0IGNvZGVzIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjaGVjayBmb3Igc2lnbmFsKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc28gdGhhdCBpZiBzaWdhY3Rpb24oKQogIGlzbid0IHByZXNlbnQsIHdlIGNhbiB1c2Ugc2lnbmFsKCkgaW5zdGVhZC4KCi0gSSdtIGhhdmluZyBhIGxpY2Vuc2UgZGlzY3Vzc2lvbiBnb2luZyBvbiBwcml2YXRlbHkuIFRoZSBpc3N1ZSBpcyB5ZXQgYWdhaW4KICBHUEwtbGljZW5zZWQgcHJvZ3JhbXMgdGhhdCBoYXZlIHByb2JsZW1zIHdpdGggTVBMLiBJIGFtIGxlYW5pbmcgdG93YXJkcwogIG1ha2luZyBhIGtpbmQgb2YgZHVhbC1saWNlbnNlIHRoYXQgd2lsbCBzb2x2ZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwuLi4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDAwKQotIEFkZGVkIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5LiBJIGludGVuZCB0byBsZXQgdGhpcyBjb250YWluIHNvbWUgZG9jcyBhbmQKICB0ZW1wbGF0ZXMgb24gaG93IHRvIGdlbmVyYXRlIGN1c3RvbS1mb3JtYXQgcGFja2FnZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLgogIEkndmUgbm93IHJlbW92ZWQgdGhlIFJQTSByZWxhdGVkIGN1cmwuc3BlYyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHJvb3QuCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMCkKLSBULiBCaGFyYXRoIGJyb3VnaHQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGJyaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHRvCiAgY3VybF9lYXN5X2dldGluZm8oKSBhbmQgY3VybF9lYXN5X3NldG9wdCgpLiBOb3cgeW91IGNhbiByZXF1ZXN0IHBlZXIKICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2l0aCB0aGUgKnNldG9wdCgpIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgb3B0aW9uCiAgYW5kIHRoZW4gdXNlIHRoZSBDVVJMT1BUX0NBSU5GTyB0byBzZXQgdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgcmVtb3RlCiAgcGVlciBhZ2FpbnN0LiBBZnRlciBhbiBzdWNoIGFuIG9wZXJhdGlvbiB3aXRoIGEgdmVyaWZpY2F0aW9uIHJlcXVlc3QsIHRoZQogICpfZ2V0aW5mbygpIG9wdGlvbiBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CiAgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBvciBub3QuICAKCkRhbmllbCAoMjcgT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gYnJvdWdodCB1cyBhIHNwbGVuZGlkIHBhdGNoIHRoYXQgc29sdmVzIHRoZSBsb25nLXN0YW5kaW5nCiAgYW5ub3lpbmcgcHJvYmxlbSB3aXRoIHRpbWVvdXRzIHRoYXQgbWFkZSBjdXJsIGV4aXQgd2l0aCBzaWxseSBleGl0IGNvZGVzCiAgKHdoaWNoIGFzIGJlZW4gY29tbWVudGVkIG91dCBsYXRlbHkpLiBUaGlzIHNvbHV0aW9uIGlzIHNpZ2FjdGlvbigpIGJhc2VkIGFuZAogIG9mIGNvdXJzZSB0aGVuIG9ubHkgd29ya3MgZm9yIHVuaXhlcyAoYW5kIG9ubHkgdGhvc2UgdW5peGVzIHRoYXQgYWN0dWFsbHkKICBoYXZlIHRoZSBzaWdhY3Rpb24oKSBmdW5jdGlvbikuCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIGZsYXcgbWVudGlvbmVkIGJ5IEtldmluIFJvdGgKICB0aGF0IG1hZGUgdGhlIHBhc3N3b3JkIGdldCBlY2hvZWQgd2hlbiBwcm9tcHRlZCBmb3IgaW50ZXJhY3RpdmVseS4gVGhlCiAgZ2V0cGFzcygpIGZ1bmN0aW9uIChub3cga25vd24gYXMgbXlfZ2V0cGFzcygpKSB3YXMgYWxzbyBmaXhlZCB0byBub3QgdXNlIGFueQogIHN0YXRpYyBidWZmZXJzLiBUaGlzIGFsc28gbWVhbnMgd2UgY2Fubm90IHVzZSB0aGUgInN0YW5kYXJkIiBnZXRwYXNzKCkKICBmdW5jdGlvbiBldmVuIGZvciB0aG9zZSBzeXN0ZW1zIHRoYXQgaGF2ZSBpdCwgc2luY2UgaXQgaXNuJ3QgdGhyZWFkLXNhZmUuCiAgCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBpZiB5b3UnZCB3cml0ZSBhIGNvbmZpZyBmaWxlIHdpdGggJy12IHVybCcsIHRoZQogIHVybCB3b3VsZCBub3QgYmUgdXNlZCBhcyAiZGVmYXVsdCBVUkwiIGFzIGRvY3VtZW50ZWQsIGFsdGhvdWdoIGlmIHlvdSB3cm90ZQogIGl0ICd1cmwgLXYnIGl0IHdvcmtlZCEgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgbm93LgoKLSBLZXZpbiBSb3RoJ3MgaWRlYSBvZiB1c2luZyBtdWx0aXBsZSAtZCBvcHRpb25zIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSB3YXMKICBqdXN0IGJyaWxsaWFudCwgYW5kIEkgY291bGRuJ3QgcmVhbGx5IHRoaW5rIG9mIGFueSByZWFzb24gd2h5IHdlIHNob3VsZG4ndAogIHN1cHBvcnQgaXQhIFRoZSBhcHBlbmQgZnVuY3Rpb24gYWx3YXlzIGFwcGVuZCAnJicgYW5kIHRoZW4gdGhlIG5ldyAtZAogIGNodW5rLiBUaGlzIGVuYWJsZXMgY29uc3RydWN0cyBsaWtlIHRoZSBmb2xsb3dpbmc6CgogICAgICAgIGN1cmwgLWQgbmFtZT1kYW5pZWwgLWQgYWdlPXVua25vd24gZm9vYmFyc2l0ZS5jb20KCkRhbmllbCAoMjQgT2N0b2JlciAyMDAwKQotIEkgZml4ZWQgdGhlIGxpYi9tZW1kZWJ1Zy5jIHNvdXJjZSBzbyB0aGF0IGl0IGNvbXBpbGVzIG9uIExpbnV4IGFuZCBvdGhlcgogIHN5c3RlbXMuIEl0IHdpbGwgYmUgdXNlZnVsIG9uZSBkYXkgd2hlbiBzb21lb25lIGVsc2UgYnV0IG1lIHdhbnRzIHRvIHJ1biB0aGUKICBtZW1vcnkgZGVidWdnaW5nIHN5c3RlbS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAwKQotIEkgbW9kaWZpZWQgdGhlIG1ha2V0Z3ogYW5kIGNvbmZpZ3VyZSBzY3JpcHRzLCBzbyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2lsbCBmZXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgaW5jbHVkZS9jdXJsL2N1cmwuaCBoZWFkZXIgZmlsZXMsIGFuZAogIHRoZW4gdGhlIG1ha2V0Z3ogZG9lc24ndCBoYXZlIHRvIHJlYnVpbGQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBJIGJ1aWxkCiAgcmVsZWFzZS1hcmNoaXZlcy4KCi0gQmr2cm4gU3RlbmJlcmcgYW5kIExpbnVzIE5pZWxzZW4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgc2lsbHkKICBlbm91Z2ggdG8gbm90IGFsbG93IEAtbGV0dGVycyBpbiBwYXNzd29yZHMgd2hlbiB0aGV5IHdlcmUgc3BlY2lmaWVkIHdpdGggdGhlCiAgLXUgb3IgLVUgZmxhZ3MgKENVUkxPUFRfVVNFUlBXRCBhbmQgQ1VSTE9QVF9QUk9YWVVTRVJQV0QpLiBUaGlzIGFsc28KICBzdWdnZXN0cyB0aGF0IGN1cmwgcHJvYmFibHkgc2hvdWxkIHVybC1kZWNvZGUgdGhlIHBhc3N3b3JkIHBpZWNlIG9mIGFuIFVSTAogIHNvIHRoYXQgeW91IGNvdWxkIHBhc3MgYW4gZW5jb2RlZCBALWxldHRlciB0aGVyZS4uLgogIApEYW5pZWwgKDIwIE9jdG9iZXIgMjAwMCkKLSBZZXQgYW5vdGhlciBodHRwIHNlcnZlciBiYXJmZWQgb24gY3VybCdzIHJlcXVlc3QgdGhhdCBpbmNsdWRlIHRoZSBwb3J0CiAgbnVtYmVyIGluIHRoZSBIb3N0OiBoZWFkZXIgYWx3YXlzLiBJIG5vdyBvbmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIGl0CiAgaXNuJ3QgdGhlIGRlZmF1bHQgKDgwIGZvciBIVFRQLCA0NDMgZm9yIEhUVFBTKS4gd3d3LnBlcmwuY29tIHR1cm5lZCBvdXQgdG8KICBydW4gb25lIG9mIHRob3NlIG5hc3R5IHNlcnZlcnMuCgotIFRoZSBQSFA0IG1vZHVsZSBmb3IgY3VybCBoYWQgcHJvYmxlbXMgd2l0aCByZWZlcmVyIHRoYXQgc2VlbXMgdG8gaGF2ZSBiZWVuCiAgY29ycmVjdGVkIGp1c3QgeWVzdGVyZGF5LiAoU3RlcmxpbmcgSHVnaGVzIG9mIHRoZSBQSFAgdGVhbSBjb25maXJtZWQgdGhpcykKCkRhbmllbCAoMTcgT2N0b2JlciAyMDAwKQotIFZsYWRpbWlyIE9ibG9tb3YgcmVwb3J0ZWQgdGhhdCB0aGUgLVkgYW5kIC15IG9wdGlvbnMgZGlkbid0IHdvcmsuIFRoZXkKICBkaWRuJ3Qgd29yayBmb3IgbWUgZWl0aGVyLiBUaGlzIG9uY2UgYWdhaW4gcHJvdmVzIHdlIHNob3VsZCBoYXZlIHRoYXQgdGVzdAogIHN1aXRlLi4uCiAgCi0gSSBmaW5hbGx5IGNoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgbGliY3VybCByZXR1cm5zIGlmIHlvdSB0cnkgYSBodHRwczovLwogIFVSTCB3aGVuIHRoZSBsaWJyYXJ5IHdhc24ndCBidWlsZCB3aXRoIFNTTCBlbmFibGVkLiBJdCB3aWxsIG5vdyByZXR1cm4gdGhpcwogIGVycm9yOgogICAgICAgICJsaWJjdXJsIHdhcyBidWlsdCB3aXRoIFNTTCBkaXNhYmxlZCwgaHR0cHM6IG5vdCBzdXBwb3J0ZWQhIgoKICBJIHJlYWxseSBob3BlIGl0IHdpbGwgbWFrZSBpdCBhIGJpdCBjbGVhcmVyIHRvIHVzZXJzIHdoZXJlIHRoZSBhY3R1YWwKICBwcm9ibGVtIGxpZXMuCgpWZXJzaW9uIDcuNC4xCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBJIGZvcmdvdCB0byByZW1vdmUgc29tZSBvZiB0aGUgbWFsbG9jIGRlYnVnIGRlZmluZXMgZnJvbSB0aGUgbWFrZWZpbGVzIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZSAob2YgY291cnNlKS4KClZlcnNpb24gNy40CgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBUaGUgYnVmZmVyIG92ZXJmbG93IG1lbnRpb25lZCBiZWxvdyB3YXMgcG9zdGVkIHRvIGJ1Z3RyYXEgb24gRnJpZGF5IDEzdGguCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMCkKLSBDb2xpbiBSb2JlcnQgUGhpcHBzIGVsZWdhbnRseSBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cuIEl0IGNvdWxkIGJlIHVzZWQKICBieSBhbiBldmlsIGZ0cCBzZXJ2ZXIgdG8gY3Jhc2ggY3VybC4gSSB0b29rIHRoZSBvcHBvcnR1bml0eSBvZiByZXBsYWNpbmcgYQogIGZldyBvdGhlciBzcHJpbnRmKClzIGludG8gc25wcmludGYoKXMgYXMgd2VsbC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDAwKQotIEZvdW5kIHNvbWUgbW9yZSBtZW1vcnkgbGVha3MuIFRoaXMgbmV3IHNpbXBsZSBtZW1vcnkgZGVidWdnZXIgaGFzIHR1cm5lZCBvdXQKICByZWFsbHkgdXNlZnVsIQoKVmVyc2lvbiA3LjQgcHJlNgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBGbG9yaWFuIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBib29sIHR5cGVkZWYgaW4gdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUKICBmaWxlIHdhcyBicmVha2luZyBQSFAgNC4wLjMgY29tcGlsaW5nLiBUaGUgYm9vbCB0eXBlZGVmIGlzIG5vdCB1c2VkIGluIHRoZQogIHB1YmxpYyBpbnRlcmZhY2UgYW5kIHdhcyB3cm9uZ2x5IGluc2VydGVkIGluIHRoYXQgaGVhZGVyIGZpbGUuCgotIEr2cmcgSGFydHJvdGggY29ycmVjdGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgaW4gdGhlIHNyYy91cmxnbG9iLmMgc3R1ZmYuIEl0CiAgZGlkbid0IGhhcm0gYW55b25lIHNpbmNlIHRoZSBtZW1vcnkgaXMgZnJlZSgpZWQgb24gZXhpdCBhbnl3YXkuCgotIENvcnJlY3RlZCB0aGUgc3JjL21haW4uYy4gV2UgdXNlIHRoZSBfTVBSSU5URl9SRVBMQUNFICNkZWZpbmUgdG8gdXNlIG91cgogIGxpYmN1cmwtcHJpbnRmKCkgZnVuY3Rpb25zLiBUaGlzIGdpdmVzIHVzIHNucHJpbnRmKCkgZXQgYWwgb24gYWxsCiAgcGxhdGZvcm1zLiBJIGNvbnZlcnRlZCB0aGUgYWxsb2NhdGVkIHVzZXJhZ2VudCBzdHJpbmcgdG8gb25lIHRoYXQgdXNlcyBhCiAgbG9jYWwgYnVmZmVyLgoKLSBJJ3ZlIHNldCBhbiAjaWYgMCBzZWN0aW9uIGFyb3VuZCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKICBnZW5lcmF0ZWQgaW4gbGliL2Zvcm1kYXRhLmMuIFRoaXMgd2lsbCBob3BlZnVsbHkgbWFrZSBjdXJsIGRvIG1vcmUKICBQSFAtZnJpZW5kbHkgbXVsdGktcGFydCBwb3N0cy4KClZlcnNpb24gNy40IHByZTUKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gTmljbyBCYWdndXMgZm91bmQgb3V0IHRoYXQgY3VybCdzIGFiaWxpdHkgdG8gZm9yY2UgYSBBU0NJSSBkb3dubG9hZCB3aGVuCiAgdXNpbmcgRlRQIHdhcyBubyBsb25nZXIgd29ya2luZyEgSSBjb3JyZWN0ZWQgdGhpcy4gVGhpcyBwcm9ibGVtIHdhcyBwcm9iYWJseQogIGludHJvZHVjZWQgd2hlbiBJIHJlZGVzaWduZWQgbGliY3VybCBmb3IgdmVyc2lvbiA3LgoKLSBHZW9yZyBIb3JuIHByb3ZpZGVkIGEgc291cmNlIGV4YW1wbGUgdGhhdCBwcm92ZWQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsLgogIEkgYWRkZWQgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyBhbmQgbm93IHdlIGNhbiBtYWtlIGxpYmN1cmwgbG9nCiAgYWxsIG1lbW9yeSBmaWRkbGluZyBmdW5jdGlvbnMuIEFuIGFkZGl0aW9uYWwgcGVybCBzY3JpcHQgaXMgdXNlZCB0byBhbmFseXplCiAgdGhlIG91dHB1dCBsb2dmaWxlIGFuZCB0byBtYXRjaCBtYWxsb2MoKXMgd2l0aCBmcmVlKClzIGV0Yy4gVGhlIG1lbW9yeSBsZWFrCiAgR2VvcmcgZm91bmQgdHVybmVkIG91dCB0byBiZSB0aGUgbWFpbiBjb29raWUgc3RydWN0IHRoYXQgY29va2llX2NsZWFudXAoKQogIGRpZG4ndCBmcmVlISBUaGUgcGVybCBzY3JpcHQgaXMgbmFtZWQgbWVtYW5hbHl6ZS5wbCBhbmQgaXQgaXMgYXZhaWxhYmxlIGluCiAgdGhlIENWUyByZXNwb3NpdG9yeSwgbm90IGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gZm91bmQgYSBHZXRIb3N0KCkgcHJvYmxlbS4gSXQgdHVybmVkIG91dCBpdCBuZXZlciBhc3NpZ25lZCB0aGUKICBwb2ludGVyIGluIHRoZSB0aGlyZCBhcmd1bWVudCBwcm9wZXJseSEgVGhpcyBjb3VsZCBtYWtlIGEgY3Jhc2gsIG9yIGF0IGJlc3QKICBhIG1lbW9yeSBsZWFrIQoKVmVyc2lvbiA3LjQgcHJlNAoKRGFuaWVsICg2IE9jdG9iZXIgMjAwMCkKLSBJcyB0aGUgLUYgcG9zdCBmb2xsb3dpbmcgdGhlIFJGQyAxODY3IHNwZWM/IFdlIGhhZCB0aGlzIGRpY3Vzc2lvbiBvbiB0aGUKICBtYWlsaW5nIGxpc3Qgc2luY2UgaXQgYXBwZWFycyBjdXJsIGNhbid0IHBvc3QgLUYgZm9ybSBwb3N0cyB0byBhIFBIUAogIHJlY2VpdmVyLi4uIEkndmUgYmVlbiBpbiB0b3VjaCB3aXRoIHRoZSBQSFAgZGV2ZWxvcGVycyBhYm91dCB0aGlzLgoKLSBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgdGhhdCB0aGUgbG9uZyBvcHRpb24gJy0tcHJveHknIHdhc24ndCB3b3JraW5nCiAgYW55bW9yZSEgVGhlIG9wdGlvbiBwYXJzZXIgZ290IGNvbmZ1c2VkIHdoZW4gSSBhZGRlZCB0aGUgLS1wcm94eXR1bm5lbCBmb3IKICA3LjMuIFRoaXMgd2FzIGluZGVlZCBhIHZlcnkgb2xkIGZsYXcgdGhhdCBoYXNuJ3QgdHVybmVkIHVwIHVudGlsIG5vdy4uLgoKLSBK9nJuIEhhcnRyb3RoIHByb3ZpZGVkIHBhdGNoZXMsIHVwZGF0ZWQgbWFrZWZpbGVzIGFuZCB0d28gbmV3IGZpbGVzIGZvciBETEwKICBzdHVmZiBvbiB3aW4zMi4gSGUgYWxzbyBwb2ludGVkIG91dCB0aGF0IGxpYiBzb3VyY2UgZmlsZXMgd2VyZSBjb21waWxlZCB3aXRoCiAgLUkuLi9zcmMgd2hpY2ggaXNuJ3Qgb25seSB3cm9uZyBidXQgcGxhaW4gc3R1cGlkIQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgYSBwcm9ibGVtIHdpdGggSFRUUCByZXN1bWUuIEN1cmwgcHJldmlvdXNseSB1c2VkCiAgYSBsb2NhbCB2YXJpYWJsZSBiYWRseSwgdGhhdCBjb3VsZCBsZWFkIHRvIGNyYXNoZXMuCgpWZXJzaW9uIDcuNCBwcmUzCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAwKQotIE1vcmUgZG9jcyB3cml0dGVuLiBUaGUgY3VybF9lYXN5X2dldGluZm8uMyBtYW4gcGFnZSBpcyBub3cgcHJldHR5IGFjY3VyYXRlLAogIGFzIGlzIHRoZSAtdyBzZWN0aW9uIGluIGN1cmwuMS4gSSBhZGRlZCB0d28gb3B0aW9ucyB0byBlbmFibGUgdGhlIHVzZXIgdG8KICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2VpdmVkIGhlYWRlcnMnIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBIVFRQCiAgcmVxdWVzdC4gVC4gQmhhcmF0aCByZXF1ZXN0ZWQgdGhlbS4KICAKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBDb3JyZWN0ZWQgYSBzZXZlciBmcmVlKCkgYmVmb3JlIHVzZSBpbiB0aGUgbmV3IGFkZF9idWZmZXJfc2VuZCgpISA7LSkKClZlcnNpb24gNy40IHByZTIKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gSmFzb24gUy4gUHJpZWJlIHNlbnQgbWUgcGF0Y2hlcyB0aGF0IGNoYW5nZWQgdGhlIHdheSBjdXJsIGlzc3VlcyBIVFRQCiAgcmVxdWVzdHMuIFRoZSBlbnRpcmUgcmVxdWVzdCBpcyBub3cgaXNzdWVkIGluIG9uZSBzaW5nbGUgc2hvdC4gSXQgZGlkbid0IGRvCiAgdGhpcyBwcmV2aW91c2x5LCBhbmQgaXQgaGFzIHR1cm5lZCBvdXQgdGhhdCBzaW5jZSB0aGUgY29tbW9uIGJyb3dzZXJzIGRvIGl0CiAgdGhpcyB3YXksIHNvbWUgc2l0ZXMgaGF2ZSB0dXJuZWQgb3V0IHRvIHdvcmsgd2l0aCBicm93c2VycyBidXQgbm90IHdpdGgKICBjdXJsISBBbHRob3VnaCB0aGlzIGlzIG5vdCBhIGNsaWVudC1zaWRlIHByb2JsZW0sIHdlIHdhbnQgdG8gYmUgYWJsZSB0bwogIGZ1bGx5IGVtdWxhdGUgYnJvd3NlcnMsIGFuZCB0aHVzIHdlIGhhdmUgbm93IGFkanVzdGVkIHRoZSBuZXR3b3JraW5nIGxheWVyCiAgdG8gc2xpZ2h0bHkgbW9yZSBhcHBlYXIgYXMgYSBicm93c2VyLiBJIGFkanVzdGVkIEphc29uJ3MgcGF0Y2gsIHRoZSBmYXVsdHMKICBhcmUgcHJvYmFibHkgbWluZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDApCi0gQW55b25lIHdobyBldmVyIHVwbG9hZGVkIGRhdGEgd2l0aCBjdXJsIG9uIGEgc2xvdyBsaW5rIGhhcyBub3RpY2VkIHRoYXQgdGhlCiAgcHJvZ2VzcyBtZXRlciBpcyB1cGRhdGVkIHZlcnkgaW5mcmVxdWVudGx5LiBUaGF0IGlzIGR1ZSB0byB0aGUgbGFyZ2UgYnVmZmVyCiAgc2l6ZSBjdXJsIGlzIHVzaW5nLiBJdCByZWFkcyA1MEtiIGFuZCBzZW5kcyBpdCwgdXBkYXRlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICBhbmQgbG9vcHMuIDUwS2IgaXMgdmVyeSBtdWNoIG9uIGEgc2xvdyBsaW5rLCBhbHRob3VnaCBpdCBpcyBwcmV0dHkgbmVhdCB0bwogIHVzZSBvbiBhIGZhc3Qgb25lLgoKICBJJ3ZlIG5vdyBtYWRlIGFuIGFkanVzdG1lbnQgdGhhdCBtYWtlcyBjdXJsIHVzZSBhIDJLYiBidWZmZXIgZm9yIHVwbG9hZHMgdG8KICBzdGFydCB3aXRoLiBJZiBjdXJsJ3MgYXZlcmFnZSB1cGxvYWQgc3BlZWQgaXMgZmFzdGVyIHRoYW4gYnVmZmVyIHNpemUgYnl0ZXMKICBwZXIgc2Vjb25kLCBjdXJsIHdpbGwgaW5jcmVhc2UgdGhlIHVzZWQgYnVmZmVyIHNpemUgdXAgdG8gbWF4IDUwS2IuIEl0CiAgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIHdvcmsgYmV0dGVyLgogIApWZXJzaW9uIDcuNCBwcmUxCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDAwKQotIFJpcHBlZCBvdXQgdGhlIC13IHN0dWZmIGZyb20gdGhlIGxpYnJhcnkgYW5kIHB1dCBpbiB0aGUgY3VybCB0b29sLiBJdCBnZXRzCiAgYWxsIHRoZSByZWxldmFudCBpbmZvIGZyb20gdGhlIGxpYnJhcnkgdXNpbmcgdGhlIG5ldyBjdXJsX2Vhc3lfZ2V0aW5mbygpCiAgZnVuY3Rpb24uCgotIGJyYWQgYXQgb3BlbmJzZC5vcmcgbWFpbGVkIG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgbXkga2VyYmVyb3MgbWlzdGFrZSBhbmQKICByZW1vdmVkIGEgY29tcGlsZXIgd2FybmluZyBmcm9tIGhvc3RpcC5jIHRoYXQgT3BlbkJTRCBwZW9wbGUgZ2V0LgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBPZiBjb3Vyc2UgKEkgc2hvdWxkIHByb2JhYmx5IGdldCBwdW5pc2hlZCBzb21laG93KSBJIGRpZG4ndCBwcm9wZXJseSBjb3JyZWN0CiAgdGhlICNpbmNsdWRlIGxpbmVzIGZvciB0aGUgYmFzZTY0IHN0dWZmIGluIHRoZSBrZXJiZXJvcyBzb3VyY2VzIGluIHRoZSBqdXN0CiAgcmVsZWFzZWQgNy4zIHBhY2thZ2UuIFRoZXkgc3RpbGwgaW5jbHVkZSB0aGUgKl9rcmIuaCBmaWxlcyEgTm93LCB0aGUgZXJyb3IKICBpcyBzb29vIHZlcnkgZWFzeSB0byBzcG90IGFuZCBmaXggc28gSSB3b24ndCBib3RoZXIgd2l0aCBhIHF1aWNrIGJ1ZyBmaXgKICByZWxlYXNlLiBJJ2xsIHBvc3QgYSBwYXRjaCB3aGVuZXZlciBvbmUgaXMgbmVlZGVkIGluc3RlYWQuIEl0J2xsIGJlCiAgYXZhaWxhYmxlIGluIHRoZSBDVlMgaW4gYSBmZXcgbWludXRlcyBhbnl3YXkuCgpWZXJzaW9uIDcuMwoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHRoZSBiYXNlNjRfa3JiLltjaF0gZmlsZXMuIFRoZXkndmUgbm93IHJlcGxhY2VkIHRoZSBmb3JtZXIKICBiYXNlNjQuW2NoXSBmaWxlcy4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBzb21lIGRvY3MuCgotIEkgY2hhbmdlZCB0aGUgT3BlblNTTCBmaXggdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIGFzIHdlbGwuIFRoZSBwb3N0ZWQKICBwYXRjaCB3YXMgb25seSB3b3JraW5nIHdpdGggMC45LjYgYW5kIG5vIG9sZGVyIG9uZXMuCiAgClZlcnNpb24gNy4zLXByZTgKCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDApCi0gRXJkbXV0IFBmZWlmZXIgaW5mb3JtZWQgdXMgdGhhdCBjdXJsIGRpZG4ndCBidWlsZCB3aXRoIE9wZW5TU0wgMC45LjYgYW5kCiAgc2hvd2VkIHVzIHdoYXQgbmVlZGVkIHRvIGdldCBwYXRjaGVkIGluIG9yZGVyIHRvIG1ha2UgaXQgYnVpbGQgcHJvcGVybHkKICBhZ2Fpbi4KCi0gRGlyayBLcnVzY2hld3NraSBmb3VuZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlci4gSSBtYWRlIGFuIGFsdGVybmF0aXZlCiAgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIERpcmsgaGltc2VsZiBzdWdnZXN0ZWQuIFRoZSBidWcgbWFkZSBhIGNvb2tpZQogIGhlYWRlciB0aGF0IGRpZG4ndCBlbmQgd2l0aCBhIHRyYWlsaW5nIHNlbWljb2xvbiB0byBub3QgZ2V0IHBhcnNlZC4KCi0gSSd2ZSBtYXJrZWQgLWMgYW5kIC10IGRlcHJlY2F0ZWQgbm93LiBJZiB5b3UgdXNlIGFueSBvZiB0aGVtLCBjdXJsIHdpbGwgdGVsbAogIHlvdSB0byB1c2UgIi1DIC0iIG9yICItVCAtIiBpbnN0ZWFkLiBJIGRvbid0IHRoaW5rIG9jY3VweWluZyB0d28gbGV0dGVycyBmb3IKICBuZWFybHkgaWRlbnRpY2FsIGZ1bmN0aW9ucyBpcyBnb29kIHVzZS4gQWxzbywgLVQgLSBraW5kIG9mIGZvbGxvd3MgdGhlIGN1cmwKICB0cmFkaXRpb24gb2YgdXNpbmcgLSBmb3Igc3RkaW4gd2hlcmUgYSBmaWxlIG5hbWUgaXMgZXhwZWN0ZWQuCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgZmluYWxseSBtYWRlIHRoZSBrcmI0IGZ0cCB1cGxvYWQKICB3b3JrIQoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3MgY29kZSBpcyBub3QgcXVpdGUgdGhyZWFkLXNhZmUgeWV0LiBUaGVyZSBhcmUgYSBmZXcgbW9yZSBnbG9iYWxzCiAgdGhhdCBuZWVkIHRvIGJlIHRha2UgY2FyZSBvZi4gTGV0J3MgZ2V0IHRoZSB1cGxvYWQgd29ya2luZyBmaXJzdCEKCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDApCi0gUmljaGFyZCBQcmVzY290dCBzb2x2ZWQgYW5vdGhlciBuYW1lIGxvb2t1cCBidWZmZXIgc2l6ZSBwcm9ibGVtLiBJIHRvb2sgdGhpcwogIG9wcG9ydHVuaXR5IHRvIHJld3JpdGUgdGhlIEdldEhvc3QoKSBmdW5jdGlvbi4gV2l0aCB0aGVzZSBsYXJnZSBidWZmZXIKICBzaXplcywgSSB0aGluayBrZWVwaW5nIHRoZW0gYXMgbG9jYWwgYXJyYXlzIHF1aWNrbHkgdHVybiB1Z2x5LiBJIG5vdyB1c2UKICBtYWxsb2MoKSB0byBnZXQgdGhlIGJ1ZmZlciBtZW1vcnkuIFRoYW5rcyB0byB0aGlzLCBJIG5vdyBjYW4gcmVhbGxvYygpIHRvIGEKICBsYXJnZSBidWZmZXIgaW4gY2FzZSBvZiBkZW1hbmQgKGVycm5vID09IEVSQU5HRSkgaW4gY2FzZSBhIHNvbHV0aW9uIGxpa2UKICB0aGF0IHdvdWxkIGJlY29tZSBuZWNlc3NhcnkuIEkgc3RpbGwgd2FudCB0byBhdm9pZCB0aGF0IGtpbmQgb2YgbmFzdGluZXNzLgoKLSBUcmllZCB0byBjb21waWxlIGFuZCBydW4gY3VybCBvbiBMaW51eCBmb3IgYWxwaGEgYW5kIEZyZWVCU0QgZm9yIGFscGhhLiBXZW50CiAgYXMgc21vb3RoIGFzIGl0IGNvdWxkLgoKLSBBZGRlZCBhIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdpdGggdHdvIHRpbnkgZXhhbXBsZSBzb3VyY2VzIHRoYXQgc2hvdyBob3cKICB0byB1c2UgbGliY3VybC4gSSBob3BlIHVzZXJzIHdpbGwgc3VwcGx5IG1lIHdpdGggbW9yZSB1c2VmdWwgZXhhbXBsZXMKICBmdXJ0aGVyIG9uLgoKLSBBcHBsaWVkIGEgcGF0Y2ggYnkgSvZybiBIYXJ0cm90aCB0byBubyBsb25nZXIgdXNlIHRoZSB3b3JkICdpbnRlZmFjZScgaW4gdGhlCiAgY29uZmlnIHN0cnVjdCBpbiB0aGUgc3JjL21haW4uYyBmaWxlIHNpbmNlIGNlcnRhaW4gY29tcGlsZXJzIGhhdmUgdGhhdCB3b3JkCiAgInJlc2VydmVyZWQiLiAgSSBmaWd1cmUgdGhhdCBpcyBzb21lIGtpbmQgb2YgQysrIGRlY2Vhc2UuCgotIFVwZGF0ZWQgdGhlIGN1cmwuMSBtYW4gcGFnZSB3aXRoIC0taW50ZXJmYWNlIGFuZCAtLWtyYjQuCgotIE1vZGlmaWVkIHRoZSBiYXNlNjRFbmNvZGUoKSBmdW5jdGlvbiB0byB3b3JrIGxpa2UgdGhlIGtlcmJlcm9zIG9uZSwgc28gdGhhdAogIEkgY291bGQgcmVtb3ZlIHRoZSB1c2Ugb2YgdGhhdC4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgKnR3byogYmFzZTY0IGVuY29kaW5nCiAgZnVuY3Rpb25zISA7LSkKClZlcnNpb24gNy4zcHJlNQoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3M0LWxheWVyIHNvdXJjZSBjb2RlIHRoYXQgaXMgbXVjaCAiaW5mbHVlbmNlZCIgYnkgdGhlIG9yaWdpbmFsCiAga3JiNCBzb3VyY2UgY29kZSwgdGhyb3VnaCB5YWZjIGludG8gY3VybCwgd2FzIHVzaW5nIHF1aXRlIGEgbG90IG9mIGdsb2JhbAogIHZhcmlhYmxlcy4gbGliY3VybCBjYW4ndCB3b3JrIHByb3Blcmx5IHdpdGggZ2xvYmFscyBsaWtlIHRoYXQgd2h5IEkgaGFkIHRvCiAgY2xlYW4gdXAgYWxtb3N0IGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBuZXcgc2VjdXJpdHkuYyB0byBtYWtlIHRoZW0gdXNlCiAgY29ubmVjdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgZ2xvYmFscy4gSSBqdXN0IGhvcGUgSSBkaWRuJ3QKICBkZXN0cm95IGFueXRoaW5nIG5vdy4uLiA6LSkgY29uZmlndXJlIHVwZGF0ZWQsIHZlcnNpb24gc3RyaW5nIG5vdyByZWZsZWN0cwogIGtyYjQgYnVpbHQtaW4uIEl0IGFsbW9zdCB3b3JrcyBub3cuIE9ubHkgdXBsb2FkcyBhcmUgc3RpbGwgYmVpbmcgbmF1Z2h0eS4KClZlcnNpb24gNy4zcHJlMwoKRGFuaWVsICgxOCBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHN1cHBsaWVkIGEgbWFqb3IgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGtyYjQtZnRwIHN1cHBvcnQgdG8KICBjdXJsLiBNYXJ0aW4gaXMgdGhlIHByaW1hcnkgYXV0aG9yIG9mIHRoZSBmdHAgY2xpZW50IG5hbWVkIHlhZmMgYW5kIGhlIGRpZAogIG5vdCBoZXNpdGF0ZSB0byBoZWxwIHVzIGltcGxlbWVudCB0aGlzIHdoZW4gSSBhc2tlZCBoaW0uIE1hbnkgYW5kIHNpbmNlcmUKICB0aGFua3MgdG8gYSBzcGxlbmRpZCBlZmZvcnQuIEl0IGRpZG4ndCBldmVuIHRha2UgbWFueSBob3VycyEKCi0gU3RlcGhlbiBLaWNrIHN1cHBsaWVkIGEgYmlnIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgLS1pbnRlcmZhY2UgZmxhZyB0bwogIHRoZSBjdXJsIHRvb2wgYW5kIENVUkxPUFRfSU5URVJGQUNFIGZvciBsaWJjdXJsLiBJdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KICBvdXRnb2luZyBpbnRlcmZhY2UgdG8gdXNlIGZvciB5b3VyIHJlcXVlc3QuIFRoaXMgbWF5IG5vdCB3b3JrIG9uIGFsbAogIHBsYXRmb3Jtcy4gVGhpcyBuZWVkcyB0ZXN0aW5nLgoKLSBSaWNoYXJkIFByZXNjb3R0IG5vdGljZWQgdGhhdCBjdXJsIG9uIFRydTY0IHVuaXggY291bGQgY29yZSBkdW1wZWQgaWYgdGhlCiAgbmFtZSBkaWRuJ3QgcmVzb2x2ZSBwcm9wZXJseS4gVGhpcyB3YXMgZHVlIHRvIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24gbm90CiAgcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gdGhvdWdoIGl0IGZhaWxlZCBvbiBzb21lIHBsYXRmb3JtcyEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBhbGwgc29ydHMgb2YgZG9jdW1lbnRzIGluIHJlZ2FyZHMgdG8gdGhlIG5ldyBwcm94eXR1bm5lbCBzdXBwb3J0LgoKVmVyc2lvbiA3LjNwcmUyCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIEthaS1Vd2UgUm9tbWVsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgaHR0cHByb3h5dHVubmVsIHN0dWZmIGZvciBmdHAuCiAgQWRqdXN0ZWQgaXQuIEFkZGVkIGJldHRlciBpbmZvIG1lc3NhZ2Ugd2hlbiBzZXR0aW5nIHVwIHRoZSB0dW5uZWwgYW5kIHRoZQogIHBhc3YgbWVzc2FnZSB3aGVuIGRvaW5nIHRoZSBzZWNvbmQgY29ubmVjdC4KICAKVmVyc2lvbiA3LjNwcmUxCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIGxpYmN1cmwgbm93IGFsbG93cyAiaHR0cHByb3h5dHVubmVsIiB0byBhbiBhcmJpdHJhcnkgaG9zdCBhbmQgcG9ydCBuYW1lLiBUaGUKICBzZWNvbmQgY29ubmVjdGlvbiBvbiBmdHAgbmVlZGVkIHRoYXQuCgotIFRoZUFydE9mSFRUUFNjcmlwdGluZyB3YXMgY29ycmVjdGVkIGFsbCBvdmVyLiBJIGJvdGggdHlwZSBhbmQgc3BlbGwgcmVhbGx5CiAgYmFkIGF0IHRpbWVzIQogIApEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAwKQotIC1wLy0tcHJveHl0dW5uZWwgd2FzIGFkZGVkIHRvICdjdXJsJy4gSXQgdXNlcyB0aGUgbmV3CiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgbGliY3VybCBvcHRpb24gdGhhdCBhbGxvd3MgImFueSIgcHJvdG9jb2wgdG8gdHVubmVsCiAgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGh0dHAgcHJveHkuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBmdHAuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAwKQotIEpvY2hlbiBTY2hhZXVibGUgZm91bmQgdGhhdCBmaWxlOi8vIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBDb3JyZWN0ZWQgdGhpcwogIGFuZCBtYWlsZWQgdGhlIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDApCi0gSSBjaGFuZ2VkIHRoZSAjZGVmaW5lIFQoKSBpbiBjdXJsLmggc2luY2UgaXQgdHVybmVkIG91dCBpdCB3YXNuJ3QgcmVhbGx5CiAgYSBnb29kIHN5bWJvbCB0byB1c2UgKHdoZW4geW91IGNvbXBpbGVkIFBIUCB3aXRoIGN1cmwgYXMgYSBtb2R1bGUsIHRoYXQKICBkZWZpbmUgY29sbGlkZWQgd2l0aCBzb21lIElNQVAgZGVmaW5lIG9yIHNvbWV0aGluZykuIFRoaXMgd2FzIHBvc3RlZCB0byB0aGUKICBQSFAgYnVnIHRyYWNrZXIuCgotIEkgYWRkZWQgZXh0ZXJuICJDIiBzdHVmZiBpbiB0d28gaGVhZGVyIGZpbGVzIHRvIGJldHRlciBhbGxvdyBsaWJjdXJsIHVzYWdlCiAgaW4gQysrIHNvcmNlcy4gRGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIERhbm55IEhvcnN3ZWxsIGxlYWQgdG8KICB0aGlzLgoKVmVyc2lvbiA3LjIuMQoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0ICphZ2FpbiogYW5kIG5vdyBpdCBzZWVtcyB0bwogIGRldGVjdCBMaW51eCBuYW1lIHJlc29sdmluZyBwcm9wZXJseSEgKGhlYXJkIHRoYXQgYmVmb3JlPykKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIHBvaW50ZWQgb3V0IHRoYXQgZG93bmxvYWRpbmcgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgbGV0dGVyICcrJyBmcm9tIGFuIGZ0cCBzZXJ2ZXIgZGlkbid0IHdvcmsuIEl0IGRpZCB3b3JrIGZyb20gSFRUUCB0aG91Z2ggYW5kCiAgdGhlIHJlYXNvbiB3YXMgbXkgbGFtZSBVUkwgZGVjb2Rlci4KCi0gSSBoYXBwZW5lZCB0byBub3RpY2UgdGhhdCAtSSBkaWRuJ3QgYXQgYWxsIHdvcmsgb24gZnRwIGFueW1vcmUuIEkgY29ycmVjdGVkCiAgdGhhdC4KClZlcnNpb24gNy4yCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDAwKQotIFVuZGVyc3RhbmRpbmcgQUlYIGlzIGEgaGFyZCB0YXNrLiBJIGJlbGlldmUgSSdsbCBuZXZlciBmaWd1cmUgb3V0IHdoeSB0aGV5CiAgc29sdmUgdGhpbmdzIHNvIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHVuaXhlcy4gTm93LCBJJ20gbGVmdCB3aXRoIHRoZQogIEFJWCA0LjMgcnVuLXRpbWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIHN5bWJvbHMgdGhhdCBhY2NvcmRpbmcgdG8gdGhpcwogIGFydGljbGUgKGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vYXJjaGl2ZXMvMy80MDUvMTk5OS85LzAvMjU5MzQyOC8pIGlzIGEKICBsaWJ0b29sIGZsYXcuIEkgdHJpZWQgdGhlIG1lbnRpb25lZCBwYXRjaCwgYWx0aG91Z2ggdGhhdCBzdG9wcyB0aGUgbGlua2luZwogIGNvbXBsZXRlbHkuCgogIFNvLCBpZiBJIHNlbGVjdCB0byBpZ25vcmUgdGhlIGxkIHdhcm5pbmdzIHRoZXJlIGFyZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CiAgZmlsbCB0aGUgc2NyZWVuIHByZXR0eSBiYWQgd2hlbiBjdXJsIGNvbXBpbGVzLiBJdCB0dXJucyBvdXQgdGhhdCBpZiBJIHdhbnQKICB0byAnI2luY2x1ZGUgPGFycGEvaW5ldC5oPicsIEkgY2FuIGdldCB0aWQgb2YgdGhlIHdhcm5pbmdzIGJ5IGluY2x1ZGUgdGhlCiAgZm9sbG93aW5nIHRocmVlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIHRoYXQgb25lOgoKICAgICAgICAjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiAgICAgICAgI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiAgICAgICAgI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KCiAgTm93LCBpcyBpdCByZWFsbHkgc2FuZSB0byBhZGQgdGhvc2UgaW5jbHVkZSBmaWxlcyBiZWZvcmUgYXJwYS9pbmV0LmggaW4gYWxsCiAgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgaXQ/CgogIFRoYW5rcyB0byBBbGJlcnQgQ2hpbi1BLVlvdW5nIGF0IHRoZXdyaXR0ZW53b3JkLmNvbSB3aG8gZ2F2ZSBtZSB0aGUgQUlYCiAgbG9naW4gdG8gdHJ5IGV2ZXJ5dGhpbmcgb24uCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAwKQotIEphbiBTY2htaWR0IHN1cHBsaWVkIHVzIGEgbmV3IFZDNiBtYWtlZmlsZSBmb3IgV2luZG93cyBhcyB0aGUgcHJldmlvdXMgb25lCiAgd2FzIG5vdCB1cCB0byBkYXRlIGJ1dCBsYWNrZWQgc2V2ZXJhbCBvYmplY3QgZmlsZXMuCgotIE1vcmUgd29yayBvbiB0aGUgbmFtaW5nLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHByb3ZpZGVkIGEgY29uZmlndXJlLWNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFzCiAgc29tZSBzeXN0ZW1zIHNlZW0gdG8gbmVlZCB0aGF0IGZvciB0aGVtIHRvIHdvcmsuIEhhZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uCiAgZm9yIHRoZSBjb25maWcuaCBpbmNsdWRlIGZpbGUgaW4gZXZlcnkgLmMgZmlsZSBpbiB0aGUgbGliY3VybCBkaXIuLi4KCi0gQXMgc3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgKGJ5IFRyb3kgRW5nZWwpLCBJIGRpZCB1c2UgYSAtLWRhdGEtYmluYXJ5CiAgb3B0aW9uIGluc3RlYWQgb2YgdGhlIG1lc3N5IHdheSBJJ3ZlIGxlZnQgZGVzY3JpYmVkIGJlbG93LiBJdCBzZWVtcyB0bwogIHdvcmsuIFRoZSBsaWJjdXJsIGZpeCByZW1haW5lZCB0aGUgc2FtZSBhcyB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAwKQotIEJhY2sgb24gdGhlIC1kIHN0cmlwcGluZyBuZXdsaW5lcyB0aGluZy4gVGhlICdwbGFpbiBwb3N0JyB0aGluZyB3YXMgYWRkZWQKICB3aGVuIEkgaGFkIG5vIHRob3VnaHQgb2YgdGhhdCBvbmUgY291bGQgYWN0dWFsbHkgcG9zdCBiaW5hcnkgZGF0YSB3aXRoCiAgaXQuIE5vdywgSSBoYXZlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBncmFjZWZ1bCBtYW5uZXIgYW5kIEkgdGhpbmsKICBJJ3ZlIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5OiAnLWQgQGZpbGU7YmluYXJ5JyB3aWxsIHRodXMgcG9zdCB0aGUKICBmaWxlIGJpbmFyeSwgZXhhY3RseSBhcyBpdHMgY29udGVudHMgYXJlLiBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbmV3CiAgKnNldG9wdCgpIG9wdGlvbiAoQ1VSTE9QVF9QT1NURklFTERTSVpFKSB0byBzZXQgdGhlIHBvc3RmaWVsZCBzaXplLCBzaW5jZQogIGxpYmN1cmwgY2FuJ3Qgc3RybGVuKCkgdGhlIGRhdGEgaW4gdGhlc2UgY2FzZXMuCgotIEFsYmVydCBDaGluLUEtWW91bmcgbWFkZSBzb21lIHZlcnkgc2VyaW91cyBlZmZvcnRzIGFuZCBhbGwgdGhlIG5hbWUKICByZXNvbHZpbmcgcHJvYmxlbXMgc2VlbSB0byBoYXZlIGJlZW4gc29ydGVkIG91dCBub3cgb24gYWxsIHRoZSBwbGF0Zm9ybXMKICB0aGF0IHByZXZpb3VzbHkgc2hvd2VkIHRoZW0uIEknbGwgbWFrZSBhbm90aGVyIHJlbGVhc2Ugbm93IGFueWRheSBiZWNhdXNlIG9mCiAgdGhpcy4KCi0gVGhlIEZBUSB3YXMgbXVjaCBlbmhhbmNlZCB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsaWNlbnNpbmcgaXNzdWVzIHRoYW5rcyB0bwogIEJqb3JuIFJlZXNlLgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBSaWNrIFdlbHlrb2NoeSBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIC1kIHRvIHBvc3QgYW5kIHlvdSB3YW50IHRvCiAga2VlcCB0aGUgbmV3bGluZXMsIGFzIGN1cmwgc3RyaXBzIHRoZW0gb2ZmIGFzIGEgYm9udXMgYmVmb3JlIHBvc3RpbmcuLi4KICBUaGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KClZlcnNpb24gNy4xLjEKCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gR290IG1vcmUgcGVvcGxlIGludm9sdmVkIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBtZXNzLiBDYW9sYW4gTWNOYW1hcmEgc2VudAogIG1lIGNvbmZpZ3VyZS1jb2RlIHRoYXQgdHVybmVkIG91dCB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gbXkgZXhpc3RpbmcgdGVzdHMKICB3aGljaCBvbmx5IG1ha2UgbWUgbW9yZSBzdXJlIEknbSBvbiB0aGUgcmlnaHQgcGF0aC4gSSBjaGFuZ2VkIHRoZSBvcmRlciBvZgogIHRoZSB0ZXN0cyBzbGlnaHRseSwgYXMgaXQgc2VlbXMgdGhhdCBzb21lIGNvbXBpbGVycyBkb24ndCB5ZWxsIGVycm9yIGlmIGEKICBmdW5jdGlvbiBpcyB1c2VkIHdpdGggdG9vIG1hbnkgcGFyYW1ldGVycy4gVGh1cywgdGhlIGZpcnN0IHRlc3RlZCBmdW5jdGlvbgogIHdpbGwgc2VlbSBvay4uLiBMZXQncyBob3BlIG1vcmUgY29tcGlsZXJzIHRoaW5rIG9mIHRvby1mZXcgcGFyYW1ldGVycyBhcyBiYWQKICBtYW5uZXJzLCBhcyB3ZSdyZSBub3cgdHJ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBvcmRlcjsgZmV3ZXIgZmlyc3QuIEkKICBzaG91bGQgYWxzbyBhZGQgdGhhdCBMYXJzIEhlY2tpbmcgbWFpbGVkIG1lIGFuZCB2b2x1bnRlZXJlZCB0byBydW4gdGVzdHMgb24KICBhIGZldyBvZGQgc3lzdGVtcy4gQ29hbGFuIGlzIGtlZXBpbmcgaGlzIHdvcmsgb3ZlciBhdAogIGh0dHA6Ly93d3cuY3NuLnVsLmllL35jYW9sYW4vcHVibGluay9nZXRob3N0YnluYW1lX3IvLiBNaWdodCBiZSBoYW5keSBpbiB0aGUKICBmdXR1cmUgYXMgd2VsbC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDApCi0gSSBub3RpY2VkIEkgaGFkbid0IGluY3JlYXNlZCB0aGUgbmFtZSBsb29rdXAgYnVmZmVyIGluIGxpYi9mdHAuYy4gSSBkb24ndAogIHRoaW5rIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbnRpbnVlZCB0cm91YmxlIHRob3VnaC4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDApCi0gRnJlZCBOb3ogY29ycmVjdGVkIG15IHN0dXBpZCBtaXN0YWtlcyBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgZmx1ZmYuIEl0CiAgc2hvdWxkIGFmZmVjdCBzb21lIEFJWCwgRGlnaXRhbCBVbml4IGFuZCBIUFVYIDEwIHN5c3RlbXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAwKQotIE1hdGhpZXUgTGVnYXJlIGNvbXBpbGVkIGFuZCBidWlsZCA3LjEgd2l0aG91dCBlcnJvcnMgb24gYm90aCBBSVggNC4yIGFzIHdlbGwKICBhcyBBSVggNC4zLiBOb3cgd2h5IGRpZCBwcm9ibGVtcyBvY2N1ciBiZWZvcmU/CgotIEZyZWQgTm96IHJlcG9ydGVkIGEgLXcvLS13cml0ZS1vdXQgYnVnIHRoYXQgY2F1c2VkIGl0IHRvIG1hbGZ1bmN0aW9uIHdoZW4KICB1c2VkIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgVVJMIHJldHJpZXZhbGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBkaXNwbGF5IGdvdAogIHNjcmV3ZWQgdXAhCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDAwKQotIEphc29uIFByaWViZSBhbmQgYW4gYW5vbnltb3VzIGZyaWVuZCBmb3VuZCBzb21lIGhvc3QgbmFtZXMgdGhlIExpbnV4IHZlcnNpb24KICBvZiBjdXJsIGNvdWxkIG5vdCByZXNvbHZlLiBJdCB0dXJuZWQgb3V0IHRoZSBidWZmZXIgdXNlZCB0byByZXRyaWV2ZSB0aGF0CiAgaW5mb3JtYXRpb24gd2FzIHRvbyBzbWFsbC4gRml4ZWQuIE9uZSBjb3VsZCBhcmd1ZSBhYm91dCB0aGUgdXNlZnVsbmVzcyBvZgogIG5vdCBoYXZpbmcgdGhlIHNsaWdodGVzdCB0cmFjZSBvZiBhIG1hbiBwYWdlIGZvciBnZXRob3N0YnluYW1lX3IoKSBvbiBteQogIExpbnV4IFJlZGhhdCBpbnN0YWxsYXRpb24uLi4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDApCi0gQmFsYWppIFMgUmFvIHdhcyBmaXJzdCBpbiBsaW5lIHRvIG5vdGUgdGhlIG1pc3NpbmcgcG9zc2liaWxpdHkgdG8gcmVwbGFjZQogIHRoZSBDb250ZW50LVR5cGU6IGFuZCBDb250ZW50LUxlbmd0aDogaGVhZGVycyB3aGVuIGRvaW5nIC1kIHBvc3RzLiBJIGFkZGVkCiAgdGhlIHBvc3NpYmlsaXR5IGp1c3Qgbm93LiBJdCBzZWVtcyBzb21lIHBlb3BsZSB3YW50cyB0byBkbyBzdGFuZGFyZCBwb3N0cwogIHVzaW5nIGN1c3RvbSBDb250ZW50LVR5cGVzLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDAwKQotIE1pa2UgRG93ZWxsIGNvcnJlY3RseSBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWQgbm90IGFwcHJvdmUgb2YgVVJMcyB3aXRoIG5vCiAgdXNlciBuYW1lIGJ1dCBwYXNzd29yZC4gQXMgaW4gJ2h0dHA6Ly86Zm9vQGhheHguc2UnLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjEKCkRhbmllbCAoNyBBdWd1c3QgMjAwMCkKLSBNeSBBSVggNCBmaXggZG9lcyBub3Qgd29yay4gSSBuZWVkIGhlbHAgZnJvbSBhIEFJWCA0IGhhY2tlci4KCi0gSSBhZGRlZCBteSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBJdCBpcyBhaW1lZCB0byBiZWNvbWUgYSBzb3J0CiAgb2YgdHV0b3JpYWwgb24gaG93IHRvIGRvIEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoNCBBdWd1c3QgMjAwMCkKLSBXb3JraW5nIHdpdGggUmljaCBHcmF5IG9uIGNvbXBpbGluZyBjdXJsIGZvciBsb3RzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiAgTXkgZml4IGZvciBBSVggMy4yIHdhcyBub3QgZ29vZCBlbm91Z2ggYW5kIHdhcyBzbGlnaHRseSBjaGFuZ2VkLCBJIGhhZCB0bwogIG1vdmUgYW4gaW5jbHVkZSBmaWxlIGJlZm9yZSBhbm90aGVyLCBhcyBpcyBub3cgZGVzY3JpYmVkIGluIHRoZSBzb3VyY2UuCgogIEFJWCA0LjIgKDQuWD8pIGhhcyBkaWZmZXJlbnQgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpCiAgZnVuY3Rpb25zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhbmQgdGh1cyB0aGUgY29tcGlsZQogIGJyb2tlIHdpdGggYW4gZXJyb3IuIEkgaGF2ZSBub3cgY2hhbmdlZCB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY2hlY2sgaW4gdGhlCiAgY29uZmlndXJlIGZpbGUgdG8gc3VwcG9ydCBhbGwgdGhyZWUgdmVyc2lvbnMgb2YgYm90aCB0aGVzZSBmdW5jdGlvbnMuIE15CiAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBBSVgtc3R5bGUgaXMgdGhvdWdoIG5vdCB5ZXQgdmVyaWZpZWQgYW5kIEkgbWF5CiAgZ2V0IHByb2JsZW1zIHRvIGZpeCBpdCBpZiBpdCB0dXJucyBvdXQgdG8gYnVnIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KICBhbnkgc3lzdGVtIHVzaW5nIHRoYXQuCgogIEZvciBwcm9ibGVtcyBsaWtlIHRoYXQsIEkgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbGxvdyAtLWRpc2FibGUtdGhyZWFkCiAgdG8gY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBjaGVjayBmb3IgdGhyZWFkc2FmZSB2ZXJzaW9ucyBvZiBhIGZldwogIGZ1bmN0aW9ucyBhbmQgdGh1cyBnbyB3aXRoIHRoZSAiZ29vZCBvbGQgdmVyc2lvbnMiIHRoYXQgdGVuZCB0byB3b3JrCiAgYWx0aG91Z2ggd2lsbCBicmVhayB0aHJlYWQtc2FmZW5lc3MgZm9yIGxpYmN1cmwuIE1vc3QgcGVvcGxlIHdvbid0IHVzZQogIGxpYmN1cmwgZm9yIG90aGVyIHRoaW5ncyB0aGFuIGN1cmwgdGhvdWdoLCBhbmQgY3VybCBkb2Vzbid0IG5lZWQgYQogIHRocmVhZC1zYWZlIGxpYi4KCi0gV29ya2luZyBvbiBteSBiaWcgdHV0b3JpYWwgYWJvdXQgSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIFJpY2ggR3JheSBzcG90dGVkIGEgcHJvYmxlbSBpbiBzcmMvc2V0dXAuaCBjYXVzZWQgYnkgYSAjZGVmaW5lIHN0cmVxdWFsKCkKICB0aGF0IHdhcyBqdXN0IGEgbGVmdC1vdmVyIGZyb20gcGFzc2VkIHRpbWVzLiBUaGUgc3RyZXF1YWwoKSBpcyBub3cgYSB0cnVlCiAgZnVuY3Rpb24gc3VwcGxpZWQgYnkgbGliY3VybCBmb3IgYSBwb3J0YWJsZSBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmlzb24uIEkgYWRkZWQgdGhlIHByb3RvdHlwZXMgaW4gaW5jbHVkZS9jdXJsLmggYW5kIHJlbW92ZWQgdGhlCiAgbm93IG9ic29sZXRlICNkZWZpbmUuCgotIElnb3IgS2hyaXN0b3Bob3JvdiBtYWRlIGEgZml4IHRvIGFsbG93IHJlc3VtZWQgZG93bmxvYWQgZnJvbSBTdW4ncwogIEphdmFXZWJTZXJ2ZXIvMS4xLjEuIEl0IHNlZW1zIHRoYXQgdGhlaXIgc2VydmVyIHNlbmRzIGJhZCBDb250ZW50LVJhbmdlCiAgaGVhZGVycy4KCi0gVGhlIG1ha2VmaWxlcyBmb3JjZWQgYSBzdGF0aWMgbGlicmFyeSBidWlsZCwgd2hpY2ggaXMgYmFkIHNpbmNlIHdlIG5vdyB1c2UKICBsaWJ0b29sIGFuZCB0aHVzIGhhdmUgZXhjZWxsZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQhIEFsYmVydCBDaGluLUEtWW91bmcKICBmb3VuZCBvdXQuCgpWZXJzaW9uIDcuMC4xMWJldGEKCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgaW5zdGFsbCcgZGlkIG5vdCBwcm9wZXJseSBjcmVhdGUKICB0aGUgaGVhZGVyIGluY2x1ZGUgZGlyZWN0b3J5LCB3aHkgaXQgZmFpbGVkIHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBhcwogIGl0IHNob3VsZC4gQXV0b21ha2UgaXNuJ3QgcmVhbGx5IGVxdWlwcGVkIHRvIGRlYWwgd2l0aCBzdWJkaXJlY3RvcmllcwogIHdpdGhvdXQgTWFrZWZpbGVzIGluIGFueSBuaWNlIHdheS4gSSBoYWQgdG8gcnVuIGFoZWFkIGFuZCBhZGQgTWFrZWZpbGVzIGluCiAgYm90aCBpbmNsdWRlIGFuZCBpbmNsdWRlL2N1cmwgYmVmb3JlIEkgbWFuYWdlZCB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKICBtYWtlZmlsZSB0aGF0IHN1Y2NlZWRzIGluIGluc3RhbGwgZXZlcnl0aGluZyBwcm9wZXJseSEKCi0gT2ssIG5vIG1vcmUgImZlYXR1cmVzIiBhZGRlZCBub3cuIExldCdzIGp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUncyBubyBtYWpvcgogIGZsYXdzIGFkZGVkIG5vdy4KCkRhbmllbCAoMzEgSnVseSAyMDAwKQotIEJvdGggSmVmZiBTY2hhc255IGFuZCBLZXRpbCBGcm95biBhc2tlZCBtZSBob3cgdG8gdGVsbCBjdXJsIG5vdCB0byBzZW5kIG9uZQogIG9mIHRob3NlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMuIFRoZXkgZGlkbid0IHNldHRsZSB3aXRoIHRoZSBibGFuawogIG9uZXMgeW91IGNvdWxkIHRlbGwgY3VybCB0byB1c2UuIEkgcmV3cm90ZSB0aGUgaGVhZGVyLXJlcGxhY2Ugc3R1ZmYgYQogIGxpdHRsZS4gTm93LCBpZiB5b3UgcmVwbGFjZSBhbiBpbnRlcm5hbCBoZWFkZXIgd2l0aCB5b3VyIG93biBhbmQgdGhhdCBuZXcKICBvbmUgaXMgYSBibGFuayBoZWFkZXIgeW91IHdpbGwgb25seSByZW1vdmUgdGhlIGludGVybmFsIG9uZSBhbmQgbm90IGdldCBhbnkKICBibGFuay4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGFueSBjYXNlIHdoZW4geW91IHdhbnQgdGhhdCBibGFuayBoZWFkZXIuCgpEYW5pZWwgKDI5IEp1bHkgMjAwMCkKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgbGliIHVzZWQgbG9jYWx0aW1lKCkgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLCBzbyBub3cKICBJIHVzZSBsb2NhbHRpbWVfcigpIGluIHRoZSBzeXN0ZW1zIHRoYXQgaGFzIGl0LgoKLSBJIHdlbnQgdGhyb3VnaCB0aGlzIGVudGlyZSBkb2N1bWVudCBhbmQgcmVtb3ZlZCBhbGwgZW1haWwgYWRkcmVzc2VzIGFuZCBsZWZ0CiAgbmFtZXMgb25seS4gSSd2ZSByZWFsbHkgbWFkZSBhbiBlZmZvcnQgdG8gYWx3YXlzIG5vdGUgd2hvIGJyb3VnaHQgYmUgYnVnCiAgcmVwb3J0cyBvciBmaXhlcywgYnV0IG1vcmUgYW5kIG1vcmUgcGVvcGxlIGFzayBtZSB0byByZW1vdmUgdGhlIGVtYWlsCiAgYWRkcmVzc2VzIHNpbmNlIHRoZXkgYmVjb21lIHZpY3RpbXMgZm9yIHNwYW1zIHRoaXMgd2F5LiBHb3Jkb24gQmVhdG9uIGdvdCBtZQogIHdvcmtpbmcgb24gdGhpcy4KCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIEr2cm4gSGFydHJvdGggZm91bmQgb3V0IHRoYXQgd2hlbiB5b3Ugc3BlY2lmaWVkIGEgSFRUUCBwcm94eSBpbiBhbgogIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB1c2VkIC1MLCBjdXJsIGZhaWxlZCBpbiB0aGUgc2Vjb25kIGZldGNoLiBJCiAgY29ycmVjdGVkIHRoaXMgcHJvYmxlbSBhbmQgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIGxpc3QuIE5vIG5lZWQgZm9yIGFuIGV4dHJhCiAgYmV0YSByZWxlYXNlIGp1c3QgZm9yIHRoaXMuCgpWZXJzaW9uIDcuMC4xMGJldGEKCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIFNvLCBsaWJ0b29sIHJlcGxhY2VkIHR3byBvZiBteSBmaWxlcyB3aXRoIHN5bWJvbGljIGxpbmtzIGFuZCBJIGZvcmdvdCB0byBhZGQKICB0aGUgdHdvIG5ldyBsaWJ0b29sIGZpbGVzIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUgKGFuZCB0aGV5IHdlcmUgYWRkZWQgYXMKICBzeW1saW5rcyBhcyB3ZWxsISkgVGhpcyBvZiBjb3Vyc2UgbGVhZCB0byB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZAogIG9uIDcuMC45Li4uCgpWZXJzaW9uIDcuMC45YmV0YQoKRGFuaWVsICgyNSBKdWx5IDIwMDApCi0gS3Jpc3RpYW4gS/ZobnRvcHAgPGtyaXMgYXQga29laG50b3BwLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybAogIGxpYnRvb2xpZmllZCwganVzdCBhcyB3ZSd2ZSB3YW50ZWQgZm9yIGEgd2hpbGUgbm93LiBIZSBhbHNvIG1hZGUgdGhlCiAgcmVjZW50bHkgYWRkZWQgbWFuIHBhZ2VzIGdldCBpbnN0YWxsZWQgcHJvcGVybHkgb24gJ21ha2UgaW5zdGFsbCcgYW5kIHNvbWUKICBvdGhlciBuaWNlIGNsZWFudXBzLgoKLSBJbiBhIGRpc2N1c3Npb24gd2l0aCBFZXR1IE9qYW5lbiBpdCBzdHJ1Y2sgbWUgdGhhdCBpZiB3ZSB1c2UgY3VybCB0byBnZXQgYQogIHBhZ2UgdXNpbmcgYSBwYXNzd29yZCwgYW5kIHRoYXQgcGFnZSB0aGVuIHNlbmRzIGEgTG9jYXRpb246IHRvIGFub3RoZXIKICBzZXJ2ZXIgdGhhdCBjdXJsIGZvbGxvd3MsIGN1cmwgd2lsbCBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoYXQKICBzZXJ2ZXIgYXMgd2VsbC4KCiAgTm93LCBJJ2xsIG5ldmVyIGJlIGFibGUgdG8gbWFrZSBjdXJsIGRvIExvY2F0aW9uOiBmb2xsb3dpbmcgYWxsIHRoYXQgcGVyZmVjdAogIGFuZCB5b3UncmUgYWxsIHNvb25lciBvciBsYXRlciByZXF1aXJlZCB0byB3cml0ZSBhIHNjcmlwdCB0byBkbyBzZXZlcmFsCiAgZmV0Y2hlcyB3aGVuIHlvdSdyZSBkb2luZyBhZHZhbmNlZCBzdHVmZiwgYnV0IG5vdyBJJ3ZlIG1vZGlmaWVkIGN1cmwgdG8gYXQKICBsZWFzdCAqb25seSogc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLiBXaGljaAogIG1lYW5zIHRoYXQgaWYgZ2V0IGEgcGFnZSBmcm9tIHNlcnZlciBBIHdpdGggYSBwYXNzd29yZCwgdGhhdCBmb3J3YXJkcyBjdXJsCiAgdG8gc2VydmVyIEIsIGN1cmwgd29uJ3QgdXNlIHRoZSBwYXNzd29yZCB0aGVyZS4gSWYgc2VydmVyIEIgdGhlbiBmb3J3YXJkcwogIGN1cmwgYmFjayB0byBzZXJ2ZXIgQSBhZ2FpbiwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgdXNlZCBhZ2Fpbi4KCiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGltcGxlbWVudGF0aW9uLCBhcyBpbiBhIGJyb3dzZXIgY2FzZSBpdCB3b3VsZCBvbmx5IHVzZQogIHRoZSBwYXNzd29yZCBpZiB0aGUgbGVmdC1wcmVmaXggb2YgdGhlIGZpcnN0IHBhdGggaXMgdGhlIHNhbWUuIEkganVzdCB0aGluawogIHRoYXQgdGhpcyBmaXggcHJldmVudHMgYSBzb21ld2hhdCBsdXJreSAic2VjdXJpdHkgaG9sZSIuCgogIEFzIGEgc2lkZS1ub3RlIGluIHRoaXMgc3ViamVjdDogSFRUUCBwYXNzd29yZHMgYXJlIHNlbnQgaW4gY2xlYXJ0ZXh0IGFuZAogIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzYWZlIG9yIHNlY3VyZS4gVXNlIEhUVFBTIGZvciB0aGF0LgoKLSBBcyBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBjb252ZXJ0ZWQgdGhlIEZUUCByZXNwb25zZSByZWFkaW5nCiAgZnVuY3Rpb24gaW50byB1c2luZyBzZWxlY3QoKSB3aGljaCB0aGVuIGFsbG93cyB0aW1lb3V0cyAoZXZlbiB1bmRlciB3aW4zMiEpCiAgaWYgdGhlIGNvbW1hbmQtcmVwbHkgc2Vzc2lvbiBnZXRzIHRvbyBzbG93IG9yIGRpZXMgY29tcGxldGVseS4gSSBtYWRlIGEKICBkZWZhdWx0IHRpbWVvdXQgb24gMzYwMCBzZWNvbmRzIHVubGVzcyBhbnl0aGluZyBlbHNlIGlzIHNwZWNpZmllZCwgc2luY2UgSQogIGRvbid0IHRoaW5rIGFueW9uZSB3YW50cyB0byB3YWl0IG1vcmUgdGhhbiB0aGF0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8KICBnZXQgcmVjZWl2ZWQuLi4KCi0gVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBhdCBnbXgubmV0PiBicm91Z2h0IGEgc2V0IG9mIGZpeGVzIGZvcgogIHRoZSByZmMxODY3IGZvcm0gcG9zdHMuIEhlIGludHJvZHVjZWQgJ25hbWU9PGZpbGUnIHdoaWNoIGJyaW5ncyBhIG1lYW5zIHRvCiAgc3V1cGx5IHZlcnkgbGFyZ2UgdGV4dCBjaHVua3MgcmVhZCBmcm9tIHRoZSBnaXZlbiBmaWxlIG5hbWUuIEl0IGRpZmZlcnMgZnJvbQogICduYW1lPUBmaWxlJyBpbiB0aGUgd2F5IHRoYXQgdGhpcyBsYXR0ZXIgdGhpbmcgaXMgbWFya2VkIGluIHRoZSB1cGxvYWRlZAogIGNvbnRlbnRzIGFzIGEgZmlsZSB1cGxvYWQsIHdoaWxlIHRoZSBmaXJzdCBpcyBqdXN0IHRleHQgKGFzIGluIGEgaW5wdXQgb3IKICB0ZXh0YXJlYSBmaWVsZCkuIFRvcnN0ZW4gYWxzbyBjb3JyZWN0ZWQgYSBidWcgdGhhdCB3b3VsZCBoYXBwZW4gaWYgeW91IHVzZWQKICAlcyBvciBzaW1pbGFyIGluIGEgLUYgZmlsZSBuYW1lLgoKLSBBcyBkaXNjb3ZlcmVkIGJ5IE5pY28gQmFnZ3VzIDxOaWNvLkJhZ2d1cyBhdCBtYWlsLmluZy5ubD4sIHdoZW4gdHJhbnNmZXJyaW5nCiAgZmlsZXMgdG8vZnJvbSBGVFAgdXNpbmcgdHlwZSBBU0NJSSBjdXJsIHNob3VsZCBub3QgZXhwZWN0IHRoZSB0cmFuc2ZlciB0byBiZQogIHRoZSBleGFjdCBzaXplIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYXMgdGhlIGZpbGUgc2l6ZS4gU2luY2UgQVNDSUkgbWF5IHZlcnkKICB3ZWxsIG1lYW4gdGhhdCB0aGUgY29udGVudCBpcyB0cmFuc2xhdGVkIHdoaWxlIHRyYW5zZmVyZWQsIHRoZSBmaW5hbCBzaXplCiAgbWF5IHZlcnkgd2VsbCBkaWZmZXIuIFRoZXJlZm9yLCBjdXJsIG5vdyBpZ25vcmVzIHRoZSBmaWxlIHNpemUgd2hlbiBkb2luZwogIEFTQ0lJIHRyYW5zZmVycyBpbiBGVFAuCgpEYW5pZWwgKDI0IEp1bHkgMjAwMCkKLSBBZGRlZCBDVVJMT1BUX1BST1hZUE9SVCB0byB0aGUgY3VybF9lYXN5X3NldG9wdCgpIGNhbGwgdG8gYWxsb3cgdGhlIHByb3h5CiAgcG9ydCBudW1iZXIgdG8gYmUgc2V0IHNlcGFyYXRlbHkgZnJvbSB0aGUgcHJveHkgaG9zdCBuYW1lLgoKLSBBbmRyZXcgPGFuZHJldyBhdCB1Z2gubmV0LmF1PiBwb2ludGVkIG91dCBhIG5ldHJjIG1hbnVhbCBidWcuCgotIFRoZSBGVFAgdHJhbnNmZXIgY29kZSBub3cgYWNjZXB0cyBhIDI1MC1jb2RlIGFzIHdlbGwgYXMgdGhlIHByZXZpb3VzbHkKICBhY2NlcHRlZCAyMjYsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxlIHRyYW5zZmVyLiBNb2hhbiA8bW5haXIgYXQKICBldmVyZ3JlZW4tZnVuZHMuY29tPiBwb2ludGVkIHRoaXMgb3V0LgoKLSBUaGUgY2hlY2sgZm9yICpib3RoKiBuc2wgYW5kIHNvY2tldCB3YXMgbmV2ZXIgYWRkZWQgaW4gdGhlIHY3IGNvbmZpZ3VyZS5pbgogIHdoZW4gSSBtb3ZlZCB0aGUgbWFpbiBicmFuY2guIEkgcmUtYWRkZWQgdGhhdCBjaGVjayB0byBjb25maWd1cmUuaW4uIFRoaXMgd2FzCiAgZGlzY292ZXJlZCBieSBSaWNoIEdyYXkuCgotIEhvd2FyZCwgQmxhaXNlIDxCbGFpc2UuSG93YXJkIGF0IGZhY3RpdmEuY29tPiBwb2ludGVkIG91dCBhIG1pc3NpbmcgZnJlZSgpIGluCiAgY3VybF9kaXNjb25uZWN0KCkgd2hpY2ggb2YgY291cnNlIG1lYW50IGxpYmN1cmwgYXRlIG1lbW9yeS4KCi0gQnJpYW4gRS4gR2FsbGV3IG5vdGVkIHRoYXQgdGhlIEhUVFAgJ0hvc3Q6JyBoZWFkZXIgY3VybCBzZW50IGRpZCBub3QKICBwcm9wZXJseSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBub24tZGVmYXVsdCBwb3J0cyB3ZXJlIHVzZWQuIFRoaXMgc2hvdWxkCiAgbm93IGhhdmUgYmVlbiBmaXhlZC4KCi0gSFRUUCBjb25uZWN0IGVycm9ycyBub3cgcmV0dXJuIGVycm9ycyBlYXJsaWVyLiBUaGlzIHdhcyBtb3N0IG5vdGFibHkgY2F1c2luZwogIHByb2JsZW1zIHdoZW4gdGhlIEhUVFBTIGNlcnRpZmljYXRlIGhhZCBwcm9ibGVtcyBhbmQgbGF0ZXIgY2F1c2VkIGEgY3Jhc2guCiAgTWFueSB0aGFua3MgdG8gR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGF0IGxldmVsOC5jb20+IGZvciBkaXNjb3ZlcmluZwogIGFuZCBzdWdnZXN0aW5nIGEgZml4Li4uCgpEYW5pZWwgKDIxIEp1bmUgMjAwMCkKLSBBZnRlciBhICJidWcgcmVwb3J0IiBJIHJlY2VpdmVkIHdoZXJlIHRoZSB1c2VyIHdhcyB1c2luZyBib3RoIC1GIGFuZCAtSSBpbiBhCiAgSFRUUCByZXF1ZXN0IChpdCBzZXZlcmx5IGNvbmZ1c2VkIHRoZSBsaWJyYXJ5IEkgc2hvdWxkIGFkZCksIEkgYWRkZWQgc29tZQogIGNoZWNrcyB0byBzcmMvbWFpbi5jIHRoYXQgcHJldmVudHMgc2V0dGluZyBtb3JlIHRoYW4gb25lIEhUVFAgcmVxdWVzdAogIGNvbW1hbmQsIG5vIG1hdHRlciB3aGF0IHRoZSB1c2VyIHdhbnRzISA7LSkKClZlcnNpb24gNy4wLjhiZXRhCgpEYW5pZWwgKDIwIEp1bmUgMjAwMCkKLSBJIGRpZCBhIG1ham9yIHJlcGxhY2UgaW4gbWFueSBmaWxlcyB0byB1c2UgdGhlIG5ldyBjdXJsIGRvbWFpbiBoYXh4LnNlCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLgoKLSBBcyBFZXR1IE9qYW5lbiBzdWdnZXN0ZWQsIEkgZmluYWxseSB0b29rIHRoZSBzdGVwIGFuZCBub3cgbGliY3VybCBubyBsb25nZXIKICBtYWtlcyBhIFBPU1QgYWZ0ZXIgaXQgaGFzIGZvbGxvd2VkIGEgbG9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgUE9TVCBoYXMKICBiZWVuIGRvbmUsIGl0J2xsIHR1cm5lZCBpbnRvIGEgR0VUIGZvciB0aGUgZnVydGhlciByZXF1ZXN0cy4gVGhpcyBpcyBvbmx5CiAgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyAtTC8tLWxvY2F0aW9uICphbmQqIGRvaW5nIGEgUE9TVCBhdCB0aGUgc2FtZSB0aW1lLgoKICBXaGlsZSBtZXNzaW5nIHdpdGggdGhpcywgSSBhZGRlZCBhbm90aGVyIHdlaXJkIGZlYXR1cmUgSSBjYWxsICdhdXRvCiAgcmVmZXJlcicuIElmIHlvdSBhcHBlbmQgJzthdXRvJyB0byB0aGUgcmlnaHQgb2YgYSBnaXZlbiByZWZlcmVyIHN0cmluZyAob3IKICBvbmx5IHVzZSB0aGF0IHN0cmluZyBhcyByZWZlcmVyKSwgbGliY3VybCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZQogIHByZXZpb3VkIFVSTCBhcyByZWZlcmVkIHdoZW4gaXQgZm9sbG93cyBhIExvY2F0aW9uOiBhbmQgZ2V0cyBhIHN1Y2NlZWRpbmcKICBkb2N1bWVudC4KCi0gTXkgaGVybyBSaWNoIEdyYXkgZm91bmQgdGhlIHZlcnkgb2JzY3VyZSBGVFAgYnVnIHRoYXQgaGFwcGVuZWQgdG8gaGltIG9ubHkKICB3aGVuIHBhc3NpbmcgdGhyb3VnaCBhIHBhcnRpY3VsYXIgZmlyZXdhbGwgYW5kIHVzaW5nIHRoZSBQT1JUIGNvbW1hbmQuIEl0CiAgdHVybmVkIG91dCB0aGF0IFBPUlQgd2FzIHRoZSBvbmx5IGNvbW1hbmQgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgdGhhdAogIGRpZG4ndCBzZW5kIGEgcHJvcGVyIFxyXG4gc2VxdWVuY2UgYnV0IGluc3RlYWQgdXNlZCB0aGUgZmF1bHR5IFxuIHdoaWNoIGFzCiAgaXQgc2VlbWVkIGlzIHN1cHBvcnRlZCBieSBtb3N0IG1ham9yIGZ0cCBzZXJ2ZXJzLi4uIDotTwoKVmVyc2lvbiA3LjAuN2JldGEKCkRhbmllbCAoMTYgSnVuZSAyMDAwKQotIEkgaGFkIGF2b2lkZWQgdGhpcyBsb25nIGVub3VnaCBub3csIHNvIEkgbW92ZWQgdGhlIGFsdGVybmF0aXZlIHByb2dyZXNzIGJhcgogIHN0dWZmIGZyb20gdGhlIGxpYiBhbmQgYWRkZWQgaXQgdG8gdGhlIGNsaWVudCBjb2RlLiBUaGlzIGlzIG5vdyB1c2luZyB0aGUKICByZWNlbnRseSBhZGRlZCBwcm9ncmVzcyBjYWxsYmFjayBhbmQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgbXVjaCBsaWtlCiAgYmVmb3JlLiBTaW5jZSBpdCBpcyBvbmx5IG9uZSBwcm9ncmVzcyBiYXIgYW5kIHlvdSBhbmQgZG93bmxvYWQgYW5kIHVwbG9hZCBhdAogIHRoZSBzYW1lIHRpbWUsIHRoaXMgYmFyIHNob3dzIHRoZSBjb21iaW5lZCBwcm9ncmVzcyBvZiBib3RoIGRpcmVjdGlvbnMuIFRoaXMKICBjb2RlIHdhcyBqdXN0IHBvcnRlZCBmcm9tIHRoZSBvbGQgcGxhY2UgdG8gdGhpcywgTGFycyBpcyBzdGlsbCBvdXIgc2F2aW91ciEKICA7LSkgVGhpcyBhbHNvIG1hZGUgdGhlIGRvY3VtZW50YXRpb24gbW9yZSBhY2N1cmF0ZSBzaW5jZSBJIG5ldmVyIHJlbW92ZWQKICB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGRvY3MhIEFsdGhvdWdoIEkgbm93IHJlbW92ZWQgdGhlIENVUkxPUFRfUFJPR1JFU1NNT0RFCiAgZnJvbSB0aGUgbGlicmFyeSBzaW5jZSB0aGUgbGliIGhhcyBvbmx5IG9uZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBhbmQgaXQKICB3aWxsIG5ldmVyIGdldCBhbm90aGVyLiBJdCBpcyBhbHRob3VnaCBsaWtlbHkgdGhhdCB0aGUgaW50ZXJuYWwgb25lIGFsc28KICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjbGllbnQgY29kZSBpbiB0aGUgZnV0dXJlICh3aGVuIEkgaGF2ZSBvdGhlciBtZWFucyBvZgogIGdldHRpbmcgdGhlIHdyaXRlb3V0IGRhdGEgYW5kIG1vdmUgdGhhdCB0b28gdG8gdGhlIGNsaWVudCkuCgotIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gdmVyaWZ5IHRoYXQgc3RhbmRhcmQgcHJvZ3Jlc3MgbWV0ZXIgd29ya3MgYW5kIEkKICBmb3VuZCBvdXQgaXQgZGlkbid0IGdldCBpbml0ZWQgcHJvcGVybHkuIEdycnIuIEkgY29ycmVjdGVkIHRoYXQgYXMgd2VsbC4KCkRhbmllbCAoMTUgSnVuZSAyMDAwKQotIEkgdGhvdWdodCBJJ2QgYmV0dGVyIHZlcmlmeSB0aGF0IHRoZSAtRiBvcHRpb24gc3RpbGwgd29ya3MgaW4gdjcgYW5kIG9mCiAgY291cnNlIGl0IGRpZG4ndC4uLiA6LS8gQW55d2F5LCBJIGhhZCB0aGUgcHJvYmxlbXMgSSBjb3VsZCBkaXNjb3ZlcgogIGNvcnJlY3RlZC4gQWJvdXQgb25lIG1vbnRoIG9mIGJldGEgdGVzdGluZyBhbmQgbm90IGEgc2luZ2xlIHBlcnNvbiBoYXMgdXNlZAogIHRoaXMgZmVhdHVyZSB3aXRoIHY3PwoKLSBCavZybiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLS1wcm9ncmVzcy1iYXIgc3RpbGwgZG9lc24ndCB3b3JrIGluCiAgdjcuIEhtLgoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gVGltIFRhc3NvbmlzIGRpc2NvdmVyZWQgdGhhdCBjdXJsIDcgZGlkbid0IGhhbmRsZSBub3JtYWwgaHR0cCBQT1NUIGFzIGl0CiAgc2hvdWxkLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjAuNmJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHBvaW50ZWQgb3V0IHNldmVyYWwgcHJvYmxlbXMgKHJlbGF0ZWQgdG8gd2luMzIgY29tcGlsaW5nKToKICBsaWIvc3RyZXF1YWwuYyBoYWQgYSBiYWQgI2lmZGVmIGZvciBvbmUgb2YgdGhlIHN0cmluZyBjb21wYXJpc29ucyAod2luMzIpCiAgc3JjL21haW4uYyBoYWQgc2V2ZXJhbCBtaW5vciBwcm9ibGVtcwogIGxpYi9tYWtlZmlsZS5tMzIgaGFkIGdldHBhc3MuW2NvXSB0d2ljZQogIHNyYy9jb25maWctd2luMzIuaCBsYWNrZWQgdGhlIEhBVkVfRkNOVExfSCBkZWZpbmUKICBib3RoIGNvbmZpZy13aW4zMi5oIGZpbGVzIG5vdyBvbmx5IHNldCB0aGUgSEFWRV9VTklTVERfSCBkZWZpbmUgaWYgdGhlCiAgZGVmaW5lIE1JTkdXMzIgaXMgc2V0LCBhbmQgSSBtb2RpZmllZCBzcmMvbWFrZWZpbGUubTMyIGFuZCBsaWIvbWFrZWZpbGUubTMyCiAgdG8gc2V0IGl0LgoKVmVyc2lvbiA3LjAuNWJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEFwcGxpZWQgTHVvbmcgRGluaCBEdW5nJ3MgY29tbWVudHMgYWJvdXQgYSBmZXcgd2luMzIgY29tcGlsZSBwcm9ibGVtcy4KCi0gQXBwbGllZCBCavZybiBTdGVuYmVyZydzIHN1Z2dlc3RlZCBmaXggdGhhdCB0dXJucyB0aGUgd2luMzIgc3Rkb3V0IHRvCiAgYmluYXJ5LiBJdCB3b24ndCBkbyBpdCBpZiB0aGUgLUIgLyAtLXVzZS1hc2NpaSBvcHRpb24gaXMgdXNlZC4gVGhhdCBvcHRpb24KICBpcyBub3cgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgLUIgLy0tZnRwLS1hc2NpaS4gVGhlIGZsYWcgd2FzCiAgYWxyZWFkeSBpbiB1c2UgYmUgdGhlIGxkYXAgYXMgd2VsbCBzbyB0aGUgbmV3IG5hbWUgZml0cyBwcmV0dHkgZ29vZC4gVGhlCiAgbGliY3lybCBDVVJMT1BUX1RSQU5TRkVSVEVYVCB3YXMgYWxzbyBpbnRyb2R1Y2VkIGFzIGFuIGFsaWFzIHRvIHRoZSBub3cKICBvYnNvbGV0ZSBDVVJMT1BUX0ZUUEFTQ0lJLiBDYW4ndCB2ZXJpZnkgdGhpcyBmaXggbXlzZWxmIGFzIEkgaGF2ZSBubyB3aW4zMgogIGNvbXBpbGVyIGFyb3VuZC4KCkRhbmllbCAoMTMgSnVuZSAyMDAwKQotIEx1b25nIERpbmggRHVuZyA8ZHVuZyBhdCBzY2guYm1lLmh1PiBmb3VuZCBhIHByb2JsZW0gaW4gY3VybF9lYXN5X2NsZWFudXAoKQogIHNpbmNlIGl0IGZyZWUoKWVkIHRoZSBtYWluIGN1cmwgc3RydWN0ICp0d2ljZSouIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoOSBKdW5lIDIwMDApCi0gVXBkYXRlZCB0aGUgUkVTT1VSQ0VTIGZpbGUsIGFkZGVkIGEgUkVBRE1FLndpbjMyIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDAwKQotIFNvIEkgZmluYWxseSBhZGRlZCB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgdG8gdGhlICpzZXRvcHQoKSBvcHRpb25zIGFuZCBpdAogIHNob3VsZCB3b3JrIG5vdy4gSSBkb24ndCBoYXZlIHRoZSBlbmVyZ3kgdG8gd3JpdGUgYW55IHRlc3QgcHJvZ3JhbSBmb3IgaXQKICByaWdodCBub3cuCi0gTWFkZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZWRlZnMgcHVibGljIGluIGN1cmwvY3VybC5oIGZvciBjb21mb3J0LiBKdXN0CiAgaW4gY2FzZSBhbnlvbmUgd2FubmEgZmlkZGxlIHdpdGggc3VjaCBwb2ludGVycy4KLSBVcGRhdGVkIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgpWZXJzaW9uIDcuMC40YmV0YQoKRGFuaWVsICgyIEp1bmUgMjAwMCkKLSBJIG5vdGljZWQgdGhhdCB3aGVuIGRvaW5nIExvY2F0aW9uOiBmb2xsb3dpbmcsIHdlIGxvc3QgY3VzdG9tIGhlYWRlcnMgaW4gYWxsCiAgYnV0IHRoZSBmaXJzdCByZXF1ZXN0LgotIFJlbW92ZWQgdGhlICdIdHRwUG9zdCcgc3RydWN0IGFuZCBtb3ZlZCB0aGUgaGVhZGVyIHN0dWZmIHRvIHRoZSBtb3JlIGdlbmVyaWMKICBjdXJsX3NsaXN0LgotIEFkZGVkIHNvbWUgYmV0dGVyIHNsaXN0LWNsZWFudXBzIGluIHNyYy9tYWluLmMKClZlcnNpb24gNy4wLjNiZXRhCgpEYW5pZWwgKDMxIE1heSAyMDAwKQotIFNvIEkgZGlzY292ZXJlZCB0aGF0IEkgcmVsZWFzZWQgdGhlIDcuMC4yYmV0YSB3aXRob3V0IGl0IGJlaW5nIGFibGUgdG8KICBjb21waWxlIHVuZGVyIExpbnV4LiBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkgdHVybmVkIG91dCB0bwogIGZlYXR1cmUgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgc3lzdGVtcyBzbyBJIGhhZCB0byBhZGQKICBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhpcyBhbmQgYWRqdXN0IHRoZSBjb2RlIHNsaWdodGx5LgoKVmVyc2lvbiA3LjAuMmJldGEKCkRhbmllbCAoMjkgTWF5IDIwMDApCi0gQ29ycmVjdGVkIHRoZSBiaXRzLiogYXNzaWdubWVudHMgd2hlbiB1c2luZyBDVVJMT1BUIG9wdGlvbnMgdGhhdCBvbmx5CiAgdG9nZ2xlcyBvbmUgb2YgdGhvc2UgYml0cy4KCi0gQXBwbGllZCB0aGUgaHVnZSBwYXRjaGVzIGZyb20gRGF2aWQgTGVCbGFuYyA8ZGxlYmxhbmMgYXQgcW54LmNvbT4gdGhhdCBhZGQKICB1c2FnZSBvZiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGluIGNhc2UgdGhleSdyZSBhcm91bmQsCiAgc2luY2UgdGhhdCBtYWtlIGxpYmN1cmwgbXVjaCBiZXR0ZXIgdGhyZWFkc2FmZSBpbiBtYW55IHN5c3RlbXMgKHN1Y2ggYXMKICBzb2xhcmlzKS4gSSBhZGRlZCB0aGUgY2hlY2tzIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgogIEkgY2FuJ3QgZXhwbGFpbiB3aHksIGJ1dCB0aGUgaW5ldF9udG9hX3IoKSBmdW5jdGlvbiBkaWQgbm90IGFwcGVhciBpbiBteQogIFNvbGFyaXMgaW5jbHVkZSBmaWxlcywgSSBoYWQgdG8gYWRkIG15IG93biBpbmNsdWRlIGZpbGUgZm9yIHRoaXMgZm9yIG5vdy4KCkRhbmllbCAoMjIgTWF5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIGZpeGVzIHRvIG1ha2UgdGhlIHdpbjMyIHZlcnNpb24gY29tcGlsZSBwcm9wZXJseSBhcwogIHdlbGwgYXMgYSByZW5hbWUgb2YgdGhlICdpbnRlcmZhY2UnIGZpZWxkIGluIHRoZSB1cmxkYXRhIHN0cnVjdCwgYXMgaXQgc2VlbXMKICB0byBiZSByZXNlcnZlZCBpbiBzb21lIGdjYyB2ZXJzaW9ucyEKCi0gUmljaCBHcmF5IHN0cnVjayBiYWNrIHdpdGggeWV0IHNvbWUgcG9ydGFiaWxpdHkgcmVwb3J0cy4gRGF0YSBHZW5lcmFsIERHL1VYCiAgbmVlZGVkIGEgbGl0dGxlIGZpeCBpbiBsaWIvbGRhcC5jIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBSVExEX0dMT0JBTCBkZWZpbmVkLgogIE1vcmUgZml4ZXMgYXJlIGV4cGVjdGVkIGFzIGEgcmVzdWx0IG9mIFJpY2hpZXMgdmVyeSBoZWxwZnVsIHdvcmsuCgpWZXJzaW9uIDcuMC4xYmV0YQoKRGFuaWVsICgyMSBNYXkgMjAwMCkKLSBVcGRhdGVkIGxvdHMgb2YgI2RlZmluZXMsIGVudW1zIGFuZCB2YXJpYWJsZSB0eXBlIG5hbWVzIGluIHRoZSBsaWJyYXJ5LiBObwogIG1vcmUgd2VpcmQgVVJHIG9yIFVSTFRBRyBwcmVmaXhlcy4gQWxsIHR5cGVzIGFuZCBuYW1lcyBzaG91bGQgYmUgY3VybC0KICBwcmVmaXhlZCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMuIFRoZSBGTEFHUy1wYXJhbWV0ZXIgdG8gdGhlIGZvcm1lcgogIGN1cmxfdXJsZ2V0KCkgaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBidW5jaCBvZiBmbGFncyB0byB1c2UgaW4gc2VwYXJhdGUKICBzZXRvcHQgY2FsbHMuIEknbSBzdGlsbCBmb2N1c2luZyBvbiB0aGUgZWFzeS1pbnRlcmZhY2UsIGFzIHRoZSBjdXJsIHRvb2wgaXMKICBub3cgdXNpbmcgdGhhdC4KCi0gQmpvcm4gUmVlc2UgaGFzIHByb3ZpZGVkIG1lIHdpdGggYW4gYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXIgdGhhdCBJIHBsYW4KICB0byB1c2UgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgY3VybCB0byBiZSBhYmxlIHRvIGdyYWNlZnVsbHkgdGltZW91dCBuYW1lCiAgbG9va3Vwcy4KClZlcnNpb24gNy4wYmV0YQoKRGFuaWVsICgxOCBNYXkgMjAwMCkKLSBJbnRyb2R1Y2VkIExJQkNVUkxfVkVSU0lPTl9OVU0gdG8gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYmV0dGVyIGFsbG93CiAgc291cmNlIGNvZGVzIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgbGliIHZlcnNpb24uIFRoaXMgZGVmaW5lIGlzIG5vdyBzZXQgdG8KICBhIGRleGFkZWNpbWFsIG51bWJlciwgd2l0aCA4IGJpdHMgZWFjaCBmb3IgbWFqb3IgbnVtYmVyLCBtaW5vciBudW1iZXIgYW5kCiAgcGF0Y2ggbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgdmVyc2lvbiAxLjIuMyB3b3VsZCBtYWtlIGl0IDB4MDEwMjAzLiBJdCBhbHNvCiAgbWFrZXMgYSBsYXJnZXIgbnVtYmVyIGEgbmV3ZXIgdmVyc2lvbi4KCkRhbmllbCAoMTcgTWF5IDIwMDApCi0gTWFydGluIEthbW1lcmhvZmVyIGNvcnJlY3RseSBwb2ludGVkIG91dCBzZXZlcmFsIGZsYXdzIGluIHRoZSBGVFAgcmFuZ2UKICBvcHRpb24uIEkgY29ycmVjdGVkIHRoZW0uCi0gUmVtb3ZlZCB0aGUgd2luMzIgd2luc29jayBpbml0IGNyYXAgZnJvbSB0aGUgbGliIHRvIHRoZSBzcmMvbWFpbi5jIGZpbGUKICBpbiB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC4gVGhleSBjYW4ndCBiZSBpbiB0aGUgbGliLCBlc3BlY2lhbGx5IG5vdCBmb3IKICBtdWx0aXRocmVhZGVkIHB1cnBvc2VzLgoKRGFuaWVsICgxNiBNYXkgMjAwMCkKLSBSZXdyb3RlIHRoZSBzcmMvbWFpbi5jIHNvdXJjZSB0byB1c2UgdGhlIG5ldyBlYXN5LWludGVyZmFjZSB0byBsaWJjdXJsIDcuCiAgVGhlcmUgaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLCBidXQgdGhlIGZpcnN0IHN0ZXAgaXMgbm93IHRha2VuLgogIDxjdXJsL2Vhc3kuaD4gaXMgdGhlIGluY2x1ZGUgZmlsZSB0byB1c2UuCgpEYW5pZWwgKDE0IE1heSAyMDAwKQotIEZUUCBVUkxzIGFyZSBub3cgdHJlYXRlZCBzbGlnaHRseSBkaWZmZXJlbnQsIG1vcmUgYWNjb3JkaW5nIHRvIFJGQyAxNzM4LgotIEZUUCBzZXNzaW9ucyBhcmUgbm93IHBlcmZvcm1lZCBkaWZmZXJlbnRseSwgd2l0aCBDV0QgY29tbWFuZHMgdG8gY2hhbmdlCiAgZGlyZWN0b3J5IGluc3RlYWQgb2YgUkVUUi9TVE9SL0xJU1Qgd2l0aCB0aGUgZnVsbCBwYXRoLiBEaXNjdXNzaW9ucyB3aXRoCiAgUmljaCBHcmF5IG1hZGUgbWUgbm90aWNlIHRoZXNlIHByb2JsZW1zLgotIEphbm5lIEpvaGFuc3NvbiBkaXNjb3ZlcmVkIGFuZCBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCiAgc3JjL3Vzcmdsb2IuYyBmaWxlLgotIEkgaGFkIHRvIGFkZCBhIGxpYi9zdHJlcXVhbC5jIGZpbGUgZm9yIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyZXMgb24gYWxsIHBsYXRmb3Jtcy4KCkRhbmllbCAoOCBNYXkgMjAwMCk6Ci0gQmVlbiB3b3JraW5nIGxvdHMgb24gdGhlIG5ldyBsaWIuCi0gVG9nZXRoZXIgd2l0aCBSaWNoIEdyYXksIEkndmUgdHJpZWQgdG8gYWRqdXN0IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsKICBiZXR0ZXIgb24gdGhlIE5DUiBNUC1SQVMgVW5peC4KCkRhbmllbCAoMiBNYXkgMjAwMCk6Ci0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgZmV3IHRvbyBtYW55IGluc3RydWN0aW9ucyBpbgogIGNvbmZpZ3VyZS5pbiB0aGF0IGRpZG4ndCBkbyBhbnkgZ29vZC4KCkRhbmllbCAoMjQgQXByaWwgMjAwMCk6Ci0gQWRkZWQgYSBuZXcgcGFyYWdyYXBoIHRvIHRoZSBGQVEgYWJvdXQgd2hhdCB0byBkbyB3aGVuIGNvbmZpZ3VyZSBjYW4ndAogIGZpbmQgT3BlblNTTCBldmVuIHRob3VnaCBpdCBpcyBpbnN0YWxsZWQuIFN1cHBsaWVkIGJ5IEJvYiBBbGxpc29uCgpEYW5pZWwgKDEyIEFwcmlsIDIwMDApOgotIFN0YXJ0ZWQgbWVzc2luZyBhcm91bmQgYmlnLXRpbWUgdG8gY29udmVydCB0aGUgb2xkIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGEKICBiZXR0ZXIgb25lLi4uCgpEYW5pZWwgKDggQXByaWwgMjAwMCk6Ci0gTWFkZSB0aGUgcHJvZ3Jlc3MgYmFyIGxvb2sgYmV0dGVyIGZvciBmaWxlIHNpemVzIGJldHdlZW4gOTk5OSBraWxvYnl0ZXMKICBhbmQgMTAwIG1lZ2FieXRlcy4gVGhleSdyZSBub3cgZGlzcGxheWVkIFhYLlhNLgotIEkgYWxzbyBub3RpY2VkIHRoYXQgZnRwIGZldGNoZXMgdGhyb3VnaCBIVFRQIHByb3hpZXMgZGlkbid0IGFkZCB0aGUgdXNlcgogIGFnZW50IHN0cmluZy4gSXQgZG9lcyBub3cuCi0gSGFiaWJpZSA8aGFiaWJpZSBhdCBNYWlsYW5kTmV3cy5jb20+IHN1cHBsaWVkIGEgcHJldHR5IGdvb2Qgd2F5IHRvIGJ1aWxkIFJQTXMKICBvbiBhIExpbnV4IG1hY2hpbmUuIEl0IHN0aWxsIGEpIHJlcXVpcmVzIG1lIHRvIGJlIHJvb3QgdG8gZG8gaXQsIGIpIGxlYXZlcwogIHRoZSBycG0gcGFja2FnZXMgbGF5aW5nIGF0IHNvbWUgb2RkIHBsYWNlIG9uIG15IGRpc2sgYykgZG9lc24ndCB3b3JrIHRvCiAgYnVpbGQgdGhlIHNzbCB2ZXJzaW9uIG9mIGN1cmwgc2luY2UgSSBkaWRuJ3QgaW5zdGFsbCBvcGVuc3NsIGZyb20gYW4gcnBtCiAgcGFja2FnZSBzbyBub3cgdGhlIHJwbSBjcmFwIHRoaW5rcyBJIGRvbid0IGhhdmUgb3BlbnNzbCBhbmQgcmVmdXNlcyB0byBidWlsZAogIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gc3NsLi4uIERpZCBJIG1lbnRpb24gSSBkb24ndCBnZXQgYWxvbmcgd2l0aCBSUE0/Ci0gT25jZSBhZ2FpbiBJIHJlY2VpdmVkIGEgYnVnIHJlcG9ydCBhYm91dCBhdXRvY29uZiBub3Qgc2V0dGluZyAtTCBwcmlvciB0byAtbAogIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjaGVja2luZyBmb3IgbGlicy4gSW4gdGhpcyBjYXNlIGl0IG1hZGUgdGhlIG5hdGl2ZQogIGNjIGNvbXBpbGVyIG9uIFNvbGFyaXMgNyB0byBmYWlsIHRoZSBPcGVuU1NMIGNoZWNrLiBUaGlzIGhhcyBwcmV2aW91c2x5IGJlZW4KICByZXBvcnRlZCB0byBjYXVzZSBwcm9ibGVtcyBvbiBIUC1VWCBhbmQgaXMgYSBrbm93biBmbGF3IGluIGF1dG9jb25mIDIuMTMuIEl0CiAgaXMgYSBwaXR5IHRoZXJlJ3Mgbm8gbmV3ZXIgcmVsZWFzZSBhcm91bmQuLi4KCkRhbmllbCAoNCBBcHJpbCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIHR3byBmaXhlcyB0aGF0CiAgYXBwZWFyYW50bHkgbWFrZXMgdGhlIE9TLzIgcG9ydCB3b3JrIGJldHRlciB3aXRoIG11bHRpcGxlIFVSTHMuCgpEYW5pZWwgKDIgQXByaWwgMjAwMCk6Ci0gQW5vdGhlciBMb2NhdGlvbjogZml4LiBUaGlzIHRpbWUsIHdoZW4gY3VybCBjb25uZWN0ZWQgdG8gYSBwb3J0IGFuZCB0aGVuCiAgZm9sbG93ZWQgYSBsb2NhdGlvbiB3aXRoIGFuIGFic29sdXRlIFVSTCB0byBhbm90aGVyIHBvcnQsIGl0IG1pc2JlaGF2ZWQuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDApOgotIEguIERhcGhuZSBMdW9uZyBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHdyb25nbHkKICBtZXNzaW5nIHVwIHRoZSBwcm94eSBzdHJpbmcgd2hlbiBmZXRjaGluZyBhIGRvY3VtZW50IHRocm91Z2ggYSBodHRwIHByb3h5LAogIHdoaWNoIHNjcmV3ZWQgdXAgbXVsdGlwbGUgZmV0Y2hlcyBzdWNoIGFzIGluIGxvY2F0aW9uOiBmb2xsb3dpbmdzLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBjb3JyZWN0ZWQgbXkgYmFkbHkgYXBwbGllZCBwYXRjaCBoZQogIGFjdHVhbGx5IGFscmVhZHkgdG9sZCBtZSBhYm91dCEKCi0gSC4gRGFwaG5lIEx1b25nIGJyb3VnaHQgbWUgYSBmaXggdGhhdCBub3cgbWFrZXMgY3VybAogIGlnbm9yZSBzZWxlY3QoKSBlcnJvcnMgaW4gdGhlIGRvd25sb2FkIGlmIGVycm5vIGlzIEVJTlRSLCB3aGljaCB0dXJucyBvdXQgdG8KICBoYXBwZW4gZXZlcnkgbm93IGFuZCB0aGVuIHdoZW4gdXNpbmcgbGliY3VybCBtdWx0aS10aHJlYWRlZC4uLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBjb3VwbGUgb2Ygd2luMzIgZml4ZXMuIEhBVkVfVU5BTUUKICB3YXMgYWNjaWRlbnRhbGx5ICNkZWZpbmVkIGluIGNvbmZpZy13aW4zMi5oLCB3aGljaCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuLgogIFRoZSBIQVZFX1VOSVNURF9IIGlzIG5vdCBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggdGhlIE1ha2VmaWxlLnZjNgogIG1ha2VmaWxlIGZvciBNUyBWQysrLgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBJIHJlbW92ZWQgdGhlIEFDX1BST0dfSU5TVEFMTCBtYWNybyBmcm9tIGNvbmZpZ3VyZS5pbiwgc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgb25lIG9mIHRoZSBBTV8qIG1hY3JvcyBzZWFyY2hlcyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIGFscmVhZHkuIEphbm5lCiAgSm9oYW5zc29uIG1hZGUgbWUgYXdhcmUgb2YgdGhpcy4KClZlcnNpb24gNi41LjIKCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbm9ueW1vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVyc2lvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBwYXRjaCBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYKICBmaWxlLiBXZSBzdGlsbCBuZWVkIHNvbWUgZml4ZXMgZm9yIHRoZSBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBWQysrIGFuZCBtaW5ndzMyIGhhdmUgZGlmZmVyZW50IG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncwogIGV4aXN0ZW5jZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMCk6Ci0gSSBtb2RpZmllZCB0aGUgLUQvLS1kdW1wLWhlYWRlciB3b3JraW5ncyBzbyB0aGF0IGl0IGRvZXNuJ3Qgd3JpdGUgYW55dGhpbmcKICB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0by4gVGhpcyB3YXksIHlvdSBjYW4gYWN0dWFsbHkgdXNlIC1iIGFuZCAtRAogIG9uIHRoZSBzYW1lIGZpbGUgaWYgeW91IHdhbnQgcmVwZWF0ZWQgaW52b2tlcyB0byBzdG9yZSBhbmQgcmVhZCB0aGUgY29va2llcwogIGluIHRoYXQgb25lIHNpbmdsZSBmaWxlLgoKLSBQb2tlZCBhcm91bmQgaW4gbG90cyBvZiB0ZXh0cy4gQWRkZWQgdGhlIEJVR1MgZmlsZSBmb3IgYnVnIHJlcG9ydGluZyBzdHVmZi4KICBBZGRlZCB0aGUgY2xhc3NpYyBIVFRQIFBPU1QgcXVlc3Rpb24gdG8gdGhlIEZBUSwgcmVtb3ZlZCBzb21lICNpZmRlZiBXSU4zMgogIHN0dWZmIGZyb20gdGhlIHNvdXJjZXMgKHRoZXkncmUgY292ZXJlZCBieSB0aGUgY29uZmlnLXdpbjMyLmggbm93KS4KCi0gUGFzY2FsIEdhdWRldHRlIGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybCBhdCBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGgsIENocmlzIDxjYmF5bGlzcyBhdCBjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBhcmVudCB3aGVuIHRoZXkgcmVsZWFzZWQgb3BlbnNzbAogIDAuOS41IHNpbmNlIHRoYXQgYmFyZmVkIG9uIGN1cmwncyBiYWQgYmVoYXZpb3IgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcnJlZCB0aW1lLiBBbmRyZXcgPHRtciBhdCBnY2kubmV0PgogIHN1Z2dlc3RlZCB0aGlzLgoKLSBEYW1pZW4gQWRhbnQgbWFpbGVkIG1lIGhpcyBmaXhlcyBmb3IgbWFraW5nIGN1cmwgY29tcGlsZSBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmaWVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuJ3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIG1hZGUgZ2V0ZGF0ZS55IHdvcmsgZm9yIE1hY09TIFguCgotIFBhdWwgSGFycmluZ3RvbiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYml0IG9mIHNlbmRpbmcgZW1wdHkgY29va2llcyB0bwogIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMCk6CiAtIFJvbiBaYXBwIGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IHBvaW50ZWQgb3V0IGEgY3VybCBidWcgaW4gdGhlIGxvY2F0aW9uOiBhcmVhLAogICBhbHRob3VnaCBJIGRpZCBub3QgZ2V0IGEgcmVwcm9kdWNpYmxlIHdheSB0byBkbyB0aGlzIHdoeSBJIGhhdmUgdG8gd2FpdAogICB3aXRoIGZpeGluZyBhbnl0aGluZy4KCiAtIEJvYiBTY2hhZGVyIHN1Z2dlc3RlZCBJIHNob3VsZCBpbXBsZW1lbnQgcmVzdW1lCiAgIHN1cHBvcnQgZm9yIHRoZSBIVFRQIFBVVCBvcGVyYXRpb24sIGFuZCBhcyBJIHRoaW5rIGl0IGlzIGEgdmFsaWQgc3VnZ2VzdGlvbgogICBJJ2xsIHdvcmsgb24gaXQuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMCk6CiAtIE0gVHJhdmlzIE9iZW5oYXVzIHBvaW50ZWQgb3V0IGEgbWFudWFsIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzCiAgIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHRvIGNvbXBpbGUKICAgY3VybCBvbiBBSVggNC4xLjQgYW5kIGdhdmUgbWUgYSBzb2x1dGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBhbHJlYWR5IGZpeGVkCiAgIGJ5IEr2cm4ncyByZWNlbnQgI2luY2x1ZGUgbW9kaWZpY2F0aW9ucyEKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAwKToKIC0gT3NrYXIgTGlsamVibGFkIHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcsIEkgbWFkZSB0aGUKICAgcHJvZ3Jlc3MgZGVhbCBiZXR0ZXIgd2l0aCBsYXJnZXIgZmlsZXMgYW5kIGFkZGVkIGEgIlRpbWUiIGZpZWxkIHdoaWNoIHNob3dzCiAgIHRoZSB0aW1lIHNwZW50IG9uIHRoZSBkb3dubG9hZCBzbyBmYXIuCiAtIEknbSBub3cgdXNpbmcgdGhlIENWUyByZXBvc2l0b3J5IG9uIHNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggYWxzbyBhbGxvd3Mgd2ViCiAgIGJyb3dzaW5nLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5udS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDAwKToKIC0gUmVudW1iZXJlZCBzb21lIGVudW1zIGluIGN1cmwvY3VybC5oIHNpbmNlIHRhZyBudW1iZXIgMzUgd2FzIHVzZWQgdHdpY2UhCiAtIEFkZGVkICJwb3N0cXVvdGUiIHN1cHBvcnQgdG8gdGhlIGZ0cCBzZWN0aW9uIHRoYXQgZW5hYmxlcyBwb3N0LWZ0cC10cmFuc2ZlcgogICBxdW90ZSBjb21tYW5kcy4KIC0gTm93IG1hZGUgdGhlIC1RLy0tcXVvdGUgcGFyYW1ldGVyIHJlY29nbml6ZSAnLScgYXMgYSBwcmVmaXgsIHdoaWNoIG1lYW5zCiAgIHRoYXQgY29tbWFuZCB3aWxsIGJlIGlzc3VlZCBBRlRFUiBhIHN1Y2Nlc3NmdWwgZnRwIHRyYW5zZmVyLiBUaGlzIGNhbiBvZgogICBjb3Vyc2UgYmUgdXNlZCB0byBkZWxldGUgb3IgcmVuYW1lIGEgZmlsZSBhZnRlciBpdCBoYXMgYmVlbiB1cGxvYWRlZCBvcgogICBkb3dubG9hZGVkLiBVc2UgeW91ciBpbWFnaW5hdGlvbiEgOy0pCiAtIFNpbmNlIEkgZG8gdGhlIG1haW4gZGV2ZWxvcG1lbnQgb24gc29sYXJpcyAyLjYgbm93LCBJIGhhZCB0byBkb3dubG9hZCBhbmQKICAgaW5zdGFsbCBHTlUgZ3JvZmYgdG8gZ2VuZXJhdGUgdGhlIGh1Z2VoZWxwLmMgZmlsZS4gVGhlIHNvbGFyaXMgbnJvZmYgY29yZXMKICAgb24gdGhlIG1hbiBwYWdlISBTbywgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc29sYXJpcyBjb25maWd1cmUgc2NyaXB0IGZpbmQgYQogICBiZXR0ZXIgcmVzdWx0IEkgbWFkZSBnbnJvZmYgZ2V0IGNoZWNrZWQgcHJpb3IgdG8gdGhlIHJlZ3VsYXIgbnJvZmYuCiAtIEFkZGVkIGFsbCB0aGUgY3VybCBleGl0IGNvZGVzIHRvIHRoZSBtYW4gcGFnZS4KIC0gSmltIEdhbGxhZ2hlciBwcm9wZXJseSB0cmFja2VkIGRvd24gYSBidWcgaW4gYXV0b2NvbmYKICAgMi4xMy4gVGhlIEFDX0NIRUNLX0xJQigpIG1hY3JvIHdyb25nZnVsbHkgdXNlcyB0aGUgLWwgZmxhZyBiZWZvcmUgdGhlIC1MCiAgIGZsYWcgdG8gJ2xkJyB3aGljaCBjYXVzZXMgdGhlIEhQLVVYIDEwLjIwIGZsYXZvdXIgdG8gZmFpbCBvbiBhbGwgbGliY2hlY2tzCiAgIGFuZCB0aGVyZWZvcmUgeW91IGNhbid0IG1ha2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBsaWJzIQoKRGFuaWVsICgyOCBEZWNlbWJlciAxOTk5KToKIC0gVGltIFZlcmhvZXZlbiBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IGN1cmwKICAgZG9lc24ndCBzdXBwb3J0IFVSTCBmb3JtYXR0ZWQgZmlsZSBuYW1lcyB3aGVuIGdldHRpbmcgZnRwLiBOb3csIHRoZXJlJ3MgYQogICBwcm9ibGVtIHdpdGggZ2V0dGluZyB2ZXJ5IHdlaXJkIGZpbGUgbmFtZXMgb2ZmIEZUUCBzZXJ2ZXJzLiBSRkMgOTU5IGRlZmluZXMKICAgdGhhdCB0aGUgZmlsZSBuYW1lIHN5bnRheCB0byB1c2Ugc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIHRoZSBuYXRpdmUgT1Mgb2YKICAgdGhlIHNlcnZlci4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgcGVlciBzZXJ2ZXIgc3lzdGVtIHdlIGN1cnJlbnRseSBqdXN0CiAgIHRyYW5zbGF0ZSB0aGUgVVJMIHN5bnRheCBpbnRvIHBsYWluIGxldHRlcnMuIEl0IGlzIHN0aWxsIGJldHRlciBhbmQgd2l0aAogICB0aGUgc29sYXJpcyAyLjYtc3VwcGxpZWQgZnRwIHNlcnZlciBpdCB3b3JrcyB3aXRoIHNwYWNlcyBpbiB0aGUgZmlsZSBuYW1lcy4KCkRhbmllbCAoMjcgRGVjZW1iZXIgMTk5OSk6CiAtIFdoZW4gY3VybCBwYXJzZWQgY29va2llcyBzdHJhaWdodCBvZmYgYSByZW1vdGUgc2l0ZSwgaXQgY29ycnVwdGVkIHRoZSBpbnB1dAogICBkYXRhLCB3aGljaCwgaWYgdGhlIGRvd25sb2FkZWQgaGVhZGVycyB3ZXJlIHN0b3JlZCBtYWRlIHZlcnkgb2RkIGNoYXJhY3RlcnMKICAgaW4gdGhlIHNhdmVkIGRhdGEuIENvcnJlY3RseSBpZGVudGlmaWVkIGFuZCByZXBvcnRlZCBieSBQYXVsIEhhcnJpbmd0b24uCgpEYW5pZWwgKDEzIERlY2VtYmVyIDE5OTkpOgogLSBHZW5lcmFsIGNsZWFudXBzIGluIHRoZSBsaWJyYXJ5IGludGVyZmFjZS4gVGhlcmUgaGFkIGJlZW4gc29tZSBiYWQga2x1ZGdlcwogICBhZGRlZCBkdXJpbmcgdGltZXMgb2Ygc3RyZXNzIGFuZCBJIGRpZCBteSBiZXN0IHRvIGNsZWFuIHRoZW0gb2ZmLiBJdCB3YXMKICAgYm90aCByZWdhcmRpbmcgdGhlIGxpYiBBUEkgYXMgd2VsbCBhcyBpbmNsdWRlIGZpbGUgY29uZnVzaW9ucy4KCkRhbmllbCAoMyBEZWNlbWJlciAxOTk5KToKIC0gQSBzbWFsbCAtLXN0ZGVyciBidWcgd2FzIHJlcG9ydGVkIGJ5IEVldHUgT2phbmVuLi4uCgogLSB3aG8gYWxzbyBicm91Z2h0IHRoZSBzdWdnZXN0aW9uIG9mIGV4dGVuZGluZyB0aGUgLVggZmxhZyB0byBmdHAgbGlzdCBhcwogICB3ZWxsLiBTbywgbm93IGl0IGlzIGFuZCB0aGUgbG9uZyBvcHRpb24gaXMgbm93IC0tcmVxdWVzdCBpbnN0ZWFkLiBJdCBpcwogICBvbmx5IGZvciBmdHAgbGlzdCBmb3Igbm93IChhbmQgdGhlIGZvcm1lciBodHRwIHN0dWZmIHRvbyBvZiBjb3Vyc2UpLgoKTGFycyBKLiBBYXMgKDI0IE5vdmVtYmVyIDE5OTkpOgogLSBQYXRjaGVkIGN1cmwgdG8gY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIgQmVPUy4gRG9lc24ndCB3b3JrIHlldCB0aG91Z2ghCgogLSBDb3JyZWN0ZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzIHRvIGFsbG93IHB1dHRpbmcgb2JqZWN0IGZpbGVzIGluCiAgIGRpZmZlcmVudCBkaXJlY3RvcmllcyB0aGFuIHRoZSBzb3VyY2VzLgoKVmVyc2lvbiA2LjMuMQoKRGFuaWVsICgyMyBOb3ZlbWJlciAxOTk5KToKIC0gSSd2ZSBoYWQgdGhpcyBtYWpvciBkaXNrIGNyYXNoLiBNeSBnb29kIG9sZCB0cnVzdC13b3J0aHkgc291cmNlIGRpc2sgZGllZAogICBhbG9uZyB3aXRoIHRoZSBtYWNoaW5lIHRoYXQgaG9zdGVkIGl0LiBUaGFuayBnb29kbmVzcyBtb3N0IG9mIGFsbCB0aGUKICAgdGhpbmdzIEkndmUgZG9uZSBhcmUgZWl0aGVyIGJhY2tlZCB1cCBlbHNld2hlcmUgb3Igc3RvcmVkIGluIHRoaXMgQ1ZTCiAgIHNlcnZlciEKCiAtIE1pY2hhZWwgUy4gU3RldWVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSAtRiBoYW5kbGluZwogICB0aGF0IG1hZGUgY3VybCBoYW5nIGlmIHlvdSBwb3N0ZWQgYW4gZW1wdHkgdmFyaWFibGUgc3VjaCBhcyAnLUYgbmFtZT0nLiBJdAogICB3YXMgb25lIG9mIHRob3NlIG9sZCBidWdzIHRoYXQgbmV2ZXIgaGF2ZSB3b3JrZWQgcHJvcGVybHkuLi4KCiAtIEphc29uIEJhaWV0dG8gcG9pbnRlZCBvdXQgYSBnZW5lcmFsIGZsYXcgaW4gdGhlIEhUVFAKICAgZG93bmxvYWQuIEN1cmwgZGlkbid0IGNvbXBsYWluIGlmIGl0IHdhcyBwcmVtYXR1cmVseSBhYm9ydGVkIGJlZm9yZSB0aGUKICAgZW50aXJlIGRvd25sb2FkIHdhcyBjb21wbGV0ZWQuIEl0IGRvZXMgbm93LgoKRGFuaWVsICgxOSBOb3ZlbWJlciAxOTk5KToKIC0gQ2hyaXMgTWFsdGJ5IHZlcnkgYWNjdXJhdGVseSBjcml0aWNpemVkIHRoZSBsYWNrIG9mCiAgIHJldHVybiBjb2RlIGNoZWNrcyBvbiB0aGUgZndyaXRlKCkgY2FsbHMuIEkgZGlkIGEgdGhvcm91Z2ggY2hlY2sgZm9yIGFsbAogICBvY2N1cnJlbmNlcyBhbmQgY29ycmVjdGVkIHRoaXMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDE5OTkpOgogLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgLW0vLS1tYXgtdGltZSBvcHRpb24KICAgZG9lc24ndCB3b3JrIGZvciB0aGUgc2xvdyBzeXN0ZW0gY2FsbHMgbGlrZSBnZXRob3N0YnluYW1lKCkuLi4gSSBkb24ndCBoYXZlCiAgIGFueSBnb29kIGZpeCB5ZXQsIGp1c3QgYSBzbGlnaHRseSBsZXNzIGJhZCBvbmUgdGhhdCBtYWtlcyBjdXJsIGV4aXQgaGFyZAogICB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgcG9pbnQgb3V0IGEgcG9zc2libGUgcHJvYmxlbSB0aGF0IG1pZ2h0IGJlIHRoZSByZWFzb24KICAgd2h5IFRob21hcyBIdXJzdCBleHBlcmllbmNlIHByb2JsZW1zIGluIGhpcyBBbWlnYSB2ZXJzaW9uLgoKIERhbmllbCAoMTIgTm92ZW1iZXIgMTk5OSk6CiAtIEkgZm91bmQgYSBjcmFzaCBpbiB0aGUgbmV3IGNvb2tpZSBmaWxlIHBhcnNlci4gSXQgY3Jhc2hlZCB3aGVuIHlvdSBnYXZlCiAgIGEgcGxhaW4gaHR0cCBoZWFkZXIgZmlsZSBhcyBpbnB1dC4uLgoKVmVyc2lvbiA2LjMKCiBEYW5pZWwgKDEwIE5vdmVtYmVyIDE5OTkpOgogLSBJIGtpbmQgb2YgZm91bmQgb3V0IHRoYXQgdGhlIEhUVFAgdGltZS1jb25kaXRpb25hbCBHRVRzICgteikgYXJlbid0IGFsd2F5cwogICByZXNwZWN0ZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgYW5kIHRoZSBkb2N1bWVudCBpcyB0aGVyZWZvcmUgc2VudCBpbiB3aG9sZQogICBhZ2FpbiwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGNvbmRpdGlvbi4gQWZ0ZXIgcmVhZGluZwogICBzZWN0aW9uIDEzLjMuNCBvZiBSRkMgMjYxNiwgSSB0aGluayBJJ20gZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIG5vdyB3aGVuIEkgZG8KICAgbXkgb3duIGNoZWNrIGFzIHdlbGwuIElmIGN1cmwgdGhpbmtzIHRoZSBjb25kaXRpb24gaXNuJ3QgbWV0LCB0aGUgdHJhbnNmZXIKICAgaXMgYWJvcnRlZCBwcmVtYXR1cmVseSAoYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzIGhhdmUgYmVlbiByZWNlaXZlZCkuCgogLSBBZnRlciBjb21tZW50cyBmcm9tIFJvYmVydCBMaW5kZW4gSSBhbHNvIHJld3JvdGUgc29tZSBwYXJ0cyBvZiB0aGUgbWFuIHBhZ2UKICAgdG8gYmV0dGVyIGRlc2NyaWJlIGhvdyB0aGUgLUYgd29ya3MuCgogLSBNaWNoYWVsIEFudGkgcHV0IHVwIGEgbmV3IGN1cmwgZG93bmxvYWQgbWlycm9yIGluCiAgIENoaW5hOiAgaHR0cDovL3d3dy5wc2hvd2luZy5jb20vY3VybC8KCiAtIEkgYWRkZWQgdGhlIGxpc3Qgb2YgZG93bmxvYWQgbWlycm9ycyB0byB0aGUgUkVBRE1FIGZpbGUKCiAtIEkgZGlkIGFkZCBtb3JlIGV4cGxhbmF0aW9ucyB0byB0aGUgbWFuIHBhZ2UKCiBEYW5pZWwgKDggTm92ZW1iZXIgMTk5OSk6CiAtIEkgbWFkZSB0aGUgLWIvLS1jb29raWUgb3B0aW9uIGNhcGFibGUgb2YgcmVhZGluZyBuZXRzY2FwZSBmb3JtYXR0ZWQgY29va2llCiAgIGZpbGVzIGFzIHdlbGwgYXMgbm9ybWFsIGh0dHAtaGVhZGVyIGZpbGVzLiBJdCBzaG91bGQgYmUgYWJsZSB0bwogICB0cmFuc3BhcmVudGx5IGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGZpbGUgaXQgZ290IGFzIGlucHV0LgoKIERhbmllbCAoMjkgT2N0b2JlciAxOTk5KToKIC0gQW5vdGhlciBvbmUgb2YgU2ViYXN0aWFhbiB2YW4gRXJrJ3MgaWRlYXMgKHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGJlZm9yZQogICBidXQgSSBzZWVtIHRvIGhhdmUgZm9yZ290dGVuIHdobyBpdCB3YXMpLCBpcyB0byBhZGQgc3VwcG9ydCBmb3IgcmFuZ2VzIGluCiAgIEZUUCBkb3dubG9hZHMuIEFzIHVzdWFsLCBvbmUgcmVxdWVzdCBpcyBqdXN0IGEgcmVxdWVzdCwgd2hlbiB0aGV5J3JlIHR3bwogICBpdCBpcyBhIGRlbWFuZC4gSSd2ZSBhZGRlZCBzaW1wbGUgc3VwcG9ydCBmb3IgWC1ZIHN0eWxlIGZldGNoZXMuIFggaGFzIHRvCiAgIGJlIHRoZSBsb3dlciBudW1iZXIsIHRob3VnaCB5b3UgbWF5IG9taXQgb25lIG9mIHRoZSBudW1iZXJzLiBVc2UgdGhlIC1yLwogICAtLXJhbmdlIHN3aXRjaCAocHJldmlvdXNseSBIVFRQLW9ubHkpLgoKIC0gU2ViYXN0aWFhbiB2YW4gRXJrIHN1Z2dlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlCiAgIGFibGUgdG8gc2hvdyB0aGUgZmlsZSBzaXplIG9mIGEgc3BlY2lmaWVkIGZpbGUuIEkgdGhpbmsgdGhpcyBpcyBhIHNwbGVuZGlkCiAgIGlkZWEgYW5kIHRoZSAtSSBmbGFnIGlzIG5vdyB3b3JraW5nIGZvciBGVFAuIEl0IGRpc3BsYXlzIHRoZSBmaWxlIHNpemUgaW4KICAgdGhpcyBtYW5uZXI6CiAgICAgICAgQ29udGVudC1MZW5ndGg6IFhYWFgKICAgQXMgaXQgcmVzZW1ibGVzIG5vcm1hbCBoZWFkZXJzLCBhbmQgbGVhdmVzIHVzIHRoZSBvcHBvcnR1bml0eSB0byBhZGQgbW9yZQogICBpbmZvIGluIHRoYXQgZGlzcGxheSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIG1vcmUgaW4gdGhlIGZ1dHVyZSEgSXQgYWxzbwogICBtYWtlcyBzZW5zZSBzaW5jZSBpZiB5b3UgYWNjZXNzIGZ0cCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgeW91J2QgZ2V0IHRoZQogICBmaWxlIHNpemUgdGhlIHNhbWUgd2F5LgoKICAgSSBjaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgUVVPVEUgY29tbWFuZCBleGVjdXRpb25zLiBUaGV5J3JlIG5vdyBleGVjdXRlZAogICBqdXN0IGFmdGVyIHRoZSBsb2dpbiBhbmQgYmVmb3JlIGFueSBvdGhlciBjb21tYW5kLiBJIG1hZGUgdGhpcyB0byBlbmFibGUKICAgcXVvdGUgY29tbWFuZHMgdG8gcnVuIGJlZm9yZSB0aGUgLUkgc3R1ZmYgaXMgZG9uZSB0b28uCgogLSBJIGZvdW5kIG91dCB0aGF0IC1ELy0tZHVtcC1oZWFkZXIgYW5kIC1WLy0tdmVyc2lvbiB3ZXJlbid0IGRvY3VtZW50ZWQgaW4KICAgdGhlIG1hbiBwYWdlLgoKIC0gTWFueSBIVFRQLzEuMSBzZXJ2ZXJzIGRvIG5vdCBzdXBwb3J0IHJhbmdlcy4gRG9uJ3QgYXNrIG1lIHdoeS4gSSBkaWQgYWRkCiAgIHNvbWUgdGV4dCBhYm91dCB0aGlzIGluIHRoZSBtYW4gcGFnZSBmb3IgdGhlIHJhbmdlIG9wdGlvbi4gVGhlIHRocmVhZCBpbgogICB0aGUgbWFpbGluZyBsaXN0IHRoYXQgc3RhcnRlZCB0aGlzIHdhcyBpbml0aWF0ZWQgYnkgTWljaGFlbCBBbnRpLgoKIC0gSSBnZXQgcmVwb3J0cyBhYm91dCBucm9mZiBjcmFzaGVzIG9uIHNvbGFyaXMgMi42KyB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cmwKICAgbWFuIHBhZ2UuIFN3aXRjaCB0byBnbnJvZmYgaW5zdGVhZCwgaXQgaXMgcmVwb3J0ZWQgdG8gd29yayghKS4gQWRhbSBCYXJjbGF5CiAgIHJlcG9ydGVkIGFuZCBicm91Z2h0IHRoZSBzdWdnZXN0aW9uLgoKIC0gSW4gYSBkaWFsb2d1ZSB3aXRoIEpvaGFubmVzIEcuIEtyaXN0aW5zc29uIHdlIGNhbWUKICAgdXAgd2l0aCB0aGUgaWRlYSB0byBsZXQgLUgvLS1oZWFkZXIgc3BlY2lmaWVkIGhlYWRlcnMgcmVwbGFjZSB0aGUKICAgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycywgaWYgeW91IGhhcHBlbmVkIHRvIHNlbGVjdCB0byBhZGQgYSBoZWFkZXIKICAgdGhhdCBjdXJsIG5vcm1hbGx5IHVzZXMgYnkgaXRzZWxmLiBUaGUgYWR2YW50YWdlIHdpdGggdGhpcyBpcyBub3QgZW50aXJlbHkKICAgb2J2aW91cywgYnV0IGluIEpvaGFubmVzJyBjYXNlIGl0IG1lYW5zIHRoYXQgaGUgY2FuIHVzZSBhbm90aGVyIEhvc3Q6IHRoYW4KICAgdGhlIG9uZSBjdXJsIHdvdWxkIHNldC4KCiBEYW5pZWwgKDI3IE9jdG9iZXIgMTk5OSk6CiAtIEpvbmdraSBTdXdhbmRpIGJyb3VnaHQgYSBuaWNlIHBhdGNoIGZvciAoeWV0IGFub3RoZXIpIGNyYXNoIHdoZW4gZm9sbG93aW5nCiAgIGEgbG9jYXRpb246LiBUaGlzIHRpbWUgeW91IGhhZCB0byBmb2xsb3cgYSBodHRwczovLyBzZXJ2ZXIncyByZWRpcmVjdCB0bwogICBnZXQgdGhlIGNvcmUuCgpWZXJzaW9uIDYuMgoKIERhbmllbCAoMjEgT2N0b2JlciAxOTk5KToKIC0gSSB0aGluayBJIG1hbmFnZWQgdG8gcmVtb3ZlIHRoZSBzdXNwaWNpb3VzIChuaWwpIHRoYXQgaGFzIGJlZW4gc2VlbiBqdXN0CiAgIGJlZm9yZSB0aGUgIkhvc3Q6IiBpbiBIVFRQIHJlcXVlc3RzIHdoZW4gLXYgd2FzIHVzZWQuCiAtIEkgZm91bmQgb3V0IHRoYXQgaWYgeW91IGZvbGxvd2VkIGEgbG9jYXRpb246IHdoZW4gdXNpbmcgYSBwcm94eSwgd2l0aG91dAogICBoYXZpbmcgc3BlY2lmaWVkIGh0dHA6Ly8gaW4gdGhlIFVSTCwgdGhlIHByb3RvY29sIHBhcnQgd2FzIGFkZGVkIG9uY2UgYWdhaW4KICAgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgVVJMISAoVGhlIHByb3RvY29sIHBhcnQgaGFzIHRvIGJlIGFkZGVkIHRvIHRoZQogICBVUkwgd2hlbiBnb2luZyB0aHJvdWdoIGEgcHJveHkgc2luY2UgaXQgaGFzIG5vIHByb3RvY29sLWd1ZXNzaW5nIHN5c3RlbQogICBzdWNoIGFzIGN1cmwgaGFzLikKIC0gQmVuamFtaW4gUml0Y2V5IHJlcG9ydGVkIGEgY29yZSBkdW1wIHVuZGVyIHNvbGFyaXMgMi42CiAgIHdpdGggT3BlblNTTCAwLjkuNC4gSXQgdHVybmVkIG91dCB0aGlzIHdhcyBkdWUgdG8gYSBiYWQgZnJlZSgpIGluIG1haW4uYwogICB0aGF0IG9jY3VycmVkIGFmdGVyIHRoZSBkb3dubG9hZCB3YXMgZG9uZSBhbmQgY29tcGxldGVkLgogLSBCZW5qYW1pbiBmb3VuZCBmdHAgZG93bmxvYWRzIHRvIHNob3cgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGRvd25sb2FkIG1ldGVyCiAgIHRvIGdldCB3cml0dGVuIHR3aWNlLCBhbmQgSSByZW1vdmVkIHRoYXQgcHJvYmxlbS4gSXQgd2FzIGludHJvZHVjZWQgd2l0aAogICB0aGUgbXVsdGlwbGUgVVJMIHN1cHBvcnQuCiAtIERhbiBaaXR0ZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCA2LjEgYW5kIGVhcmxpZXIgdmVyc2lvbnMgZGlkbid0CiAgIGhvbm9yIFJGQyAyNjE2IGNoYXB0ZXIgNCBzZWN0aW9uIDIsICJNZXNzYWdlIEhlYWRlcnMiOiAiLi4uRmllbGQgbmFtZXMgYXJlCiAgIGNhc2UtaW5zZW5zaXRpdmUuLi4iICBIVFRQIGhlYWRlciBwYXJzaW5nIGFzc3VtZWQgYSBjZXJ0YWluIGNhc2luZy4gRGFuCiAgIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIHRoaXMsIHdoaWNoIEkgdG9vayB0aGUgbGliZXJ0eQogICBvZiBlZGl0aW5nIHNsaWdodGx5LgogLSBEYW4gWml0dGVyIGFsc28gcHJvdmlkZWQgYSBuaWNlIHBhdGNoIGZvciBjb25maWcuZ3Vlc3MgdG8gYmV0dGVyIHJlY29nbml6ZQogICB0aGUgTWFjIE9TIFgKIC0gRGFuIGFsc28gY29ycmVjdGVkIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlIHRoYXQgY2F1c2VkIGxpbmtpbmcKICAgdG8gZmFpbCBvbiBPUyBYLgoKIERhbmllbCAoMTkgT2N0b2JlciAxOTk5KToKIC0gTGVuIE1hcmluYWNjaW8gY2FtZSB1cCB3aXRoIHNvbWUgcHJvYmxlbXMgd2l0aCBjdXJsLiAgU2luY2UgV2luZG93cyBoYXMgYQogICBjcmlwcGxlZCBzaGVsbCwgaXQgY2FuJ3QgcmVkaXJlY3Qgc3RkZXJyIGFuZCB0aGF0IGNhdXNlcyB0cm91YmxlLiBJIGFkZGVkCiAgIC0tc3RkZXJyIHRvZGF5IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byByZWRpcmVjdCB0aGUgc3RkZXJyIHN0cmVhbSB0byBhCiAgIGZpbGUgb3Igc3Rkb3V0LgoKIERhbmllbCAoMTggT2N0b2JlciAxOTk5KToKIC0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHVuZGVyc3RhbmRzIHRoZSAnLS13aXRob3V0LXNzbCcgZmxhZywgd2hpY2ggbm93CiAgIHRvdGFsbHkgZGlzYWJsZSBTU0wvaHR0cHMgc3VwcG9ydC4gUHJldmlvdXNseSBpdCB3YXNuJ3QgcG9zc2libGUgdG8gZm9yY2UKICAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gbGVhdmUgU1NMIGFsb25lLiBUaGUgcHJldmlvdXMgZnVuY3Rpb25hbGl0eSBoYXMKICAgYmVlbiByZXRhaW5lZC4gVHJveSBFbmdlbCBoZWxwZWQgdGVzdCB0aGlzIG5ldyBvbmUuCgpWZXJzaW9uIDYuMSAoT2N0b2JlciAxNyAxOTk5KQoKIERhbmllbCAoMTcgT2N0b2JlciAxOTk5KToKIC0gSSBpZmRlZidlZCBvciBjb21tZW50ZWQgYWxsIHRoZSB6bGliIHN0dWZmIGluIHRoZSBzb3VyY2VzIGFuZCBjb25maWd1cmUKICAgc2NyaXB0LiBJdCB0dXJuZWQgb3V0IHdlIG5lZWRlZCB0byBtb2NrIG1vcmUgd2l0aCB6bGliIHRoYW4gSSBpbml0aWFsbHkKICAgdGhvdWdodCwgdG8gbWFrZSBpdCBjYXBhYmxlIG9mIGRvd25sb2FkaW5nIGNvbXByZXNzZWQgSFRUUCBkb2N1bWVudHMgYW5kCiAgIHVuY29tcHJlc3MgdGhlbSBvbiB0aGUgZmx5LiBJIGRpZG4ndCBtZWFuIHRoZSB6bGliIHBhcnRzIG9mIGN1cmwgdG8gYmVjb21lCiAgIG1vcmUgdGhhbiBtaW5vciBzbyB0aGlzIG1lYW5zIEkgaGFsdCB0aGUgemxpYiBleHBlZGl0aW9uIGZvciBub3cgYW5kIHdhaXQKICAgdW50aWwgc29tZW9uZSBlaXRoZXIgd3JpdGVzIHRoZSBjb2RlIG9yIHpsaWIgZ2V0cyB1cGRhdGVkIGFuZCBiZXR0ZXIKICAgYWRqdXN0ZWQgZm9yIHRoaXMga2luZCBvZiB1c2FnZS4gIEkgd29uJ3QgZ2V0IGludG8gZGV0YWlscyBoZXJlLCBidXQgYQogICBzaG9ydCBhIHN1bW1hcnkgaXMgc3VpdGFibGU6CiAgIC0gemxpYiBjYW4ndCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRvIHVzZSB6bGliIG9yIGd6aXAKICAgICBkZWNvbXByZXNzaW9uIG1ldGhvZHMuCiAgIC0gemxpYiBpcyB2ZXJ5IG5lYXQgZm9yIHJlYWRpbmcgZ3ppcHBlZCBmaWxlcyBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLAogICAgIGFsdGhvdWdoIG5vdCBhcyBuaWNlIGZvciByZWFkaW5nIGJ1ZmZlci1iYXNlZCBkYXRhIHN1Y2ggYXMgd2Ugd291bGQKICAgICB3YW50IGl0LgogICAtIHRoZXJlIGFyZSBzdGlsbCBzb21lIHByb2JsZW1zIHdpdGggdGhlIHdpbjMyIHZlcnNpb24gd2hlbiByZWFkaW5nIGZyb20KICAgICBhIGZpbGUgZGVzY3JpcHRvciBpZiB0aGF0IGlzIGEgc29ja2V0CgogRGFuaWVsICgxNCBPY3RvYmVyIDE5OTkpOgogLSBNb3ZlZCB0aGUgKGV4dGVybmFsKSBpbmNsdWRlIGZpbGVzIGZvciBsaWJjdXJsIGludG8gYSBzdWJkaXJlY3RvcnkgbmFtZWQKICAgY3VybCBhbmQgYWRqdXN0ZWQgYWxsICNpbmNsdWRlIGxpbmVzIHRvIHVzZSA8Y3VybC9YWFhYPiB0byBtYWludGFpbiBhCiAgIGJldHRlciBuYW1lIHNwYWNlIGFuZCBjb250cm9sIG9mIHRoZSBoZWFkZXJzLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZC4KCiBEYW5pZWwgKDEyIE9jdG9iZXIgMTk5OSk6CiAtIEkgbW9kaWZpZWQgdGhlICdtYWtldGd6JyBzY3JpcHQgdG8gcGVyZm9ybSBhICdtYWtlJyB0b28gYmVmb3JlIGEgcmVsZWFzZQogICBhcmNoaXZlIGlzIHB1dCB0b2dldGhlciBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHRpbWUgc3RhbXBzIGJldHRlciBhbmQKICAgaG9wZWZ1bGx5IGF2b2lkIHRoZSBkb3VibGUgY29uZmlndXJlLXJ1bm5pbmcgdGhhdCB1c2UgdG8gb2NjdXIuCgogRGFuaWVsICgxMSBPY3RvYmVyIDE5OTkpOgogLSBBcHBsaWVkIEr2cm4ncyBwYXRjaGVzIHRoYXQgZml4ZXMgemxpYiBmb3IgbWluZ3czMiBjb21waWxlcyBhcyB3ZWxsIGFzCiAgIHNvbWUgb3RoZXIgbWlzc2luZyB6bGliICNpZmRlZiBhbmQgbW9yZSB0ZXh0IG9uIHRoZSBtdWx0aXBsZSBVUkwgZG9jcyBpbgogICB0aGUgbWFuIHBhZ2UuCgpWZXJzaW9uIDYuMWJldGEKCiBEYW5pZWwgKDYgT2N0b2JlciAxOTk5KToKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgc2VudCBtZSBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgZXhhY3Qgc2FtZSB0aGluZyBhcyBJCiAgIGp1c3QgbWFkZTogdGhlIC1kIHN3aXRjaCBpcyBub3cgY2FwYWJsZSBvZiByZWFkaW5nIHBvc3QgZGF0YSBmcm9tIGEgbmFtZWQKICAgZmlsZSBvciBzdGRpbi4gIFVzZSBpdCBzaW1pbGFybHkgdG8gdGhlIC1GLiBUbyByZWFkIHRoZSBwb3N0IGRhdGEgZnJvbSBhCiAgIGdpdmVuIGZpbGU6CgogICAgICAgIGN1cmwgLWQgQHBhdGgvdG8vZmlsZW5hbWUgd3d3LnBvc3RzaXRlLmNvbQoKICAgb3IgbGV0IGN1cmwgcmVhZCBpdCBvdXQgZnJvbSBzdGRpbjoKCiAgICAgICAgY3VybCAtZCBALSB3d3cucG9zdGl0LmNvbQoKIEr2cm4gSGFydHJvdGggKDMgT2N0b2JlciAxOTk5KToKIC0gQnJvdWdodCBzb21lIG1vcmUgcGF0Y2hlcyBmb3IgbXVsdGlwbGUgVVJMIGZ1bmN0aW9uYWxpdHkuIFRoZSBNSU1FCiAgIHNlcGFyYXRpb24gaWRlYXMgYXJlIGFsbW9zdCBzY3JhcHBlZCBub3csIGFuZCBhIGN1c3RvbSBzZXBhcmF0b3IgaXMgYmVpbmcKICAgdXNlZCBpbnN0ZWFkLiBUaGlzIGlzIHN0aWxsIGNvbXBpbGUtdGltZSAiZmxhZ2dlZCIuCgogRGFuaWVsCiAtIFVwZGF0ZWQgY3VybC4xIHdpdGggbXVsdGlwbGUgVVJMIGluZm8uCgogRGFuaWVsICgzMCBTZXB0ZW1iZXIgMTk5OSk6CiAtIEZlbGl4IHZvbiBMZWl0bmVyIGJyb3VnaHQgb3BlbnNzbC1jaGVjayBmaXhlcyBmb3IgY29uZmlndXJlLmluIHRvIHdvcmsKICAgb3V0LW9mLXRoZS1ib3ggd2hlbiB0aGUgb3BlbnNzbCBmaWxlcyBhcmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gZGVmYXVsdAogICBkaXJzLgoKIERhbmllbCAoMjggU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIGxpYnogZnVuY3Rpb25hbGl0eS4gVGhpcyBzaG91bGQgZW5hYmxlIGRlY29tcHJlc3NpbmcgZ3ppcCwgY29tcHJlc3MKICAgb3IgZGVmbGF0ZSBlbmNvZGluZyBIVFRQIGRvY3VtZW50cy4gSXQgYWxzbyBtYWtlcyBjdXJsIHNlbmQgYW4gYWNjZXB0IHRoYXQKICAgaXQgYWNjZXB0cyB0aGF0IGtpbmQgb2YgZW5jb2RpbmcuIENvbXByZXNzZWQgY29udGVudHMgdXN1YWxseSBzaG9ydGVucwogICBkb3dubG9hZCB0aW1lLiBJICpuZWVkKiBzb21lb25lIHRvIHRlbGwgbWUgYSBzaXRlIHRoYXQgdXNlcyBjb21wcmVzc2VkIEhUVFAKICAgZG9jdW1lbnRzIHNvIHRoYXQgSSBjYW4gdGVzdCB0aGlzIG91dCBwcm9wZXJseS4KCiAtIEFzIGEgcmVzdWx0IG9mIHRoZSBhZGRpbmcgb2YgemxpYiBhd2FyZW5lc3MsIEkgY2hhbmdlZCB0aGUgdmVyc2lvbiBzdHJpbmcKICAgYSBsaXR0bGUuIEkgcGxhbiB0byBhZGQgb3BlbmxkYXAgdmVyc2lvbiByZXBvcnRpbmcgaW4gdGhlcmUgdG9vLgoKIERhbmllbCAoMTcgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgdGhlIC1GIG9wdGlvbiBhbGxvdyBzdGRpbiB3aGVuIHNwZWNpZnlpbmcgZmlsZXMuIEJ5IHVzaW5nICctJyBpbnN0ZWFkCiAgIG9mIGZpbGUgbmFtZSwgdGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gc3RkaW4uCgpWZXJzaW9uIDYuMCAoU2VwdGVtYmVyIDE0IDE5OTkpCgogRGFuaWVsICgxMyBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgLVgvLS1odHRwLXJlcXVlc3QgPHJlcXVlc3Q+IHRvIGVuYWJsZSBhbnkgSFRUUCBjb21tYW5kIHRvIGJlIHNlbnQuCiAgIERvIG5vdCB0aGF0IHlvdXIgc2VydmVyIGhhcyB0byBzdXBwb3J0IHRoZSBleGFjdCBzdHJpbmcgeW91IGVudGVyLiBUaGlzCiAgIHNob3VsZCBwb3NzaWJseSBhIHN0cmluZyBsaWtlIERFTEVURSBvciBUUkFDRS4KCiAtIEFwcGxpZWQgRG91Z2xhcycgbWluZ3czMi1maXhlcyBmb3IgdGhlIG1ha2VmaWxlcy4KCiBEYW5pZWwgKDEwIFNlcHRlbWJlciAxOTk5KQogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBwb2ludGVkIG91dCBhIHByb2JsZW0uIEN1cmwgZGlkbid0IGNoZWNrIHRoZSBGVFAKICAgc2VydmVycyByZXR1cm4gY29kZSBwcm9wZXJseSBhZnRlciB0aGUgLS1xdW90ZSBjb21tYW5kcyB3ZXJlIGlzc3VlZC4gSXQKICAgdG9vayBhbnl0aGluZyBub24gMjAwIGFzIGFuIGVycm9yLCB3aGVuIGFsbCAyWFggY29kZXMgc2hvdWxkIGJlIGFjY2VwdGVkIGFzCiAgIE9LLgoKIC0gU2VuZGluZyBjb29raWVzIHRvIHRoZSBzYW1lIHNpdGUgaW4gbXVsdGlwbGUgbGluZXMgbGlrZSBjdXJsIHVzZWQgdG8gZG8KICAgdHVybmVkIG91dCB0byBiZSBiYWQgYW5kIGJyZWFraW5nIHRoZSBjb29raWUgc3BlY3MuIEN1cmwgbm93IHNlbmRzIGFsbAogICBjb29raWVzIG9uIGEgc2luZ2xlIENvb2tpZTogbGluZS4gQ3VybCBpcyBub3QgeWV0IFJGQyAyMTA5IGNvbXBsaWFudCwgYnV0IEkKICAgZG91YnQgdGhhdCBtYW55IHNlcnZlcnMgZG8gdXNlIHRoYXQgc3ludGF4ICh5ZXQpLgoKIERhbmllbCAoOCBTZXB0ZW1iZXIgMTk5OSkKIC0gSvZybiBoZWxwZWQgbWUgbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIG5pY2VseSB3aXRoIG1pbmd3MzIgdW5kZXIgd2luMzIuCgogRGFuaWVsICg3IFNlcHRlbWJlciAxOTk5KQogLSBGVFAgdXBsb2FkIHRocm91Z2ggcHJveHkgaXMgbm93IHR1cm5lZCBpbnRvIGEgSFRUUCBQVVQuIFJlcXVlc3RlZCBieQogICBTdGVmYW4gS2FudGhhay4KCiAtIEFkZGVkIHRoZSBsZGFwIGZpbGVzIHRvIHRoZSAubTMyIG1ha2VmaWxlLgoKIERhbmllbCAoMyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSBjb29raWUgbWF0Y2hpbmcgd29yayB3aGlsZSB1c2luZyBIVFRQIHByb3h5LgoKIEJqb3JuIFJlZXNlICgzMSBBdWd1c3QgMTk5OSkKIC0gUGFzc2VkIGhpcyBsZGFwOi8vIHBhdGNoLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgb3BlbmxkYXAgc2hhcmVkCiAgIGxpYnJhcnkgdG8gYmUgaW5zdGFsbGVkIGFuZCB0aGF0IExEX0xJQlJBUllfUEFUSCBwb2ludHMgdG8gdGhlCiAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliIHdpbGwgYmUgZm91bmQgd2hlbiBjdXJsIGlzIHJ1biB3aXRoIGEKICAgbGRhcDovLyBVUkwuCgogSvZybiBIYXJ0cm90aCAoMzEgQXVndXN0IDE5OTkpCiAtIE1hZGUgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGludG8gc2luZ2xlIGZpbGVzLgogLSBNYWRlIGZpbGU6Ly8gd29yayBmb3IgV2luMzIuIFRoZSBzYW1lIGNvZGUgaXMgbm93IHVzZWQgZm9yIHVuaXggYXMgd2VsbCBmb3IKICAgcGVyZm9ybWFuY2UgcmVhc29ucy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoMzAgQXVndXN0IDE5OTkpCiAtIFBhdGNoZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGZvciBTU0wgYnVpbGRzLgoKIE1hdHRoZXcgQ2xhcmtlICgzMCBBdWd1c3QgMTk5OSkKIC0gTWFkZSBhIGNvb2wgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyAtLXdpdGgtc3NsIHRvIHNwZWNpZnkgdGhlCiAgIHJvb3QgZGlyIG9mIHRoZSBvcGVuc3NsIGluc3RhbGxhdGlvbiwgYXMgaW4KCiAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vdXNyL3NzbF9oZXJlCgogLSBDb3JyZWN0ZWQgdGhlICdyZWNvbmYnIHNjcmlwdCB0byB3b3JrIGJldHRlciB3aXRoIHNvbWUgc2hlbGxzLgoKIEr2cm4gSGFydHJvdGggKDI2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW4gbGliLyBhbmQgY29ycmVjdGVkIHRoZSBmaWxlLmMgZm9yIHdpbjMyCiAgIGNvbXBpbGVzLgoKVmVyc2lvbiA1LjExCgogRGFuaWVsICgyNSBBdWd1c3QgMTk5OSkKIC0gSm9obiBXZWlzbWlsbGVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSBoZWFkZXItbGluZQogICByZWFsbG9jKCkgc3lzdGVtIGluIGRvd25sb2FkLmMuCgogLSBJIGFkZGVkIGxpYi9maWxlLltjaF0gdG8gb2ZmZXIgYSBmaXJzdCwgc2ltcGxlLCBmaWxlOi8vIHN1cHBvcnQuIEl0CiAgIHByb2JhYmx5IHdvbid0IGRvIG11Y2ggZ29vZCBvbiB3aW4zMiBzeXN0ZW0gYXQgdGhpcyBwb2ludCwgYnV0IEkgc2VlIGl0CiAgIGFzIGEgc3RhcnQuCgogLSBNYWRlIHRoZSByZWxlYXNlIGFyY2hpdmVzIGdldCBhIE1ha2VmaWxlIGluIHRoZSByb290IGRpciwgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gc3RhcnQgdGhlIGNvbXBpbGluZy9idWlsZGluZyBwcm9jZXNzIGVhc2llci4gSSBoYXZlbid0IHJlYWxseQogICBjaGFuZ2VkIGFueSBJTlNUQUxMIHRleHQgeWV0LCBJIHdhbnRlZCB0byBnZXQgc29tZSBmZWVkLWJhY2sgb24gdGhpcwogICBmaXJzdC4KCiBEYW5pZWwgKDE3IEF1Z3VzdCAxOTk5KQogLSBBbm90aGVyIExvY2F0aW9uOiBidWcuIEN1cmwgZGlkbid0IGRvIHByb3BlciByZWxhdGl2ZSBsb2NhdGlvbnMgaWYgdGhlCiAgIG9yaWdpbmFsIFVSTCBoYWQgY2dpLXBhcmFtZXRlcnMgdGhhdCBjb250YWluZWQgYSBzbGFzaC4gTnVzdSdzIHBhZ2UKICAgYWdhaW4uCgogLSBDb3JyZWN0ZWQgdGhlIE5PX1BST1hZIHVzYWdlLiBJdCBpcyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncyB0aGF0IGlmIG9uZSBvZgogICB0aGVtIG1hdGNoZXMgdGhlIHRhaWwgb2YgdGhlIGhvc3QgbmFtZSBpdCBzaG91bGQgY29ubmVjdCB0bywgY3VybCBzaG91bGQKICAgbm90IHVzZSBhIHByb3h5IHRvIGNvbm5lY3QgdGhlcmUuIFBvaW50ZWQgb3V0IHRvIG1lIGJ5IERvdWdsYXMKICAgRS4gV2Vnc2NoZWlkLiAgSSBhbHNvIGNoYW5nZWQgdGhlIFJFQURNRSB0ZXh0IGEgbGl0dGxlIHJlZ2FyZGluZyB0aGlzLgoKIERhbmllbCAoMTYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIGEgbWVtb3J5IGJ1ZyB3aXRoIGh0dHAtc2VydmVycyB0aGF0IHNlbnQgTG9jYXRpb246IHRvIGEgTG9jYXRpb246CiAgIHBhZ2UuIE51c3UncyBwYWdlIHNob3dlZCB0aGlzIHRvby4KCiAtIE1hZGUgY29va2llcyB3b3JrIGEgbG90IGJldHRlci4gU2V0dGluZyB0aGUgc2FtZSBjb29raWUgbmFtZSBzZXZlcmFsIHRpbWVzCiAgIHVzZWQgdG8gYWRkIG1vcmUgY29va2llcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGUgZm9ybWVyIG9uZSB3aGljaCBpdAogICBzaG91bGQndmUuIE51c3UgPG51cyBhdCBpbnRlcmdvcmoucm8+IGJyb3VnaHQgbWUgYW4gVVJMIHRoYXQgbWFkZSB0aGlzCiAgIHBhaW5mdWxseSB2aXNpYmxlLi4uCgogVHJveSAoMTUgQXVndXN0IDE5OTkpCiAtIEJyb3VnaHQgbmV3IC5zcGVjIGZpbGVzIGFzIHdlbGwgYXMgYSBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRoYXQgbGV0cyB0aGUKICAgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGZpbGVzIGJldHRlciwgZXZlbiB3aGVuIHRoZSBpbmNsdWRlCiAgIGZpbGVzIGFyZSBpbiAvdXNyL2luY2x1ZGUvb3BlbnNzbAoKVmVyc2lvbiA1LjEwCgogRGFuaWVsICgxMyBBdWd1c3QgMTk5OSkKIC0gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoKSBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgMC45LjQgdmVyc2lvbiBvZgogICBPcGVuU1NMLiBOb3cgd2h5IGNvdWxkbid0IHRoZXkgc2ltcGx5IGFkZCBhICpuZXcqIGZ1bmN0aW9uIGluc3RlYWQgb2YKICAgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24/IFRoaXMgd2F5LCB3ZSBnZXQKICAgYSBjb21waWxlciB3YXJuaW5nIGlmIGNvbXBpbGluZyB3aXRoIDAuOS40IGJ1dCBub3Qgd2l0aCBlYXJsaWVyLiBTbywgSSBoYWQKICAgdG8gY29tZSB1cCB3aXRoIGEgI2lmIGNvbnN0cnVjdGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4uLgoKIC0gTWFkZSBjdXJsIG91dHB1dCB0aGUgU1NMIHZlcnNpb24gbnVtYmVyIGdldCBkaXNwbGF5ZWQgcHJvcGVybHkgd2l0aCAwLjkuNC4KCiBUcm95ICgxMiBBdWd1c3QgMTk5OSkKIC0gQWRkZWQgTWluZ1czMiAoR0NDLTIuOTUpIHN1cHBvcnQgdW5kZXIgV2luMzIuIFRoZSBJTlNUQUxMIGZpbGUgd2FzIGFsc28KICAgYSBiaXQgcmVhcnJhbmdlZC4KIAogRGFuaWVsICgxMiBBdWd1c3QgMTk5OSkKIC0gSSBoYWQgdG8gY29weSBhIGdvb2QgPGFycGEvdGVsbmV0Lmg+IGluY2x1ZGUgZmlsZSBpbnRvIHRoZSBjdXJsIHNvdXJjZQogICB0cmVlIHRvIGVuYWJsZSB0aGUgc2lsbHkgd2luMzIgc3lzdGVtcyB0byBjb21waWxlLiBUaGUgZGlzdHJpYnV0aW9uIHJpZ2h0cwogICBhbGxvd3MgdXMgdG8gZG8gdGhhdCBhcyBsb25nIGFzIHRoZSBmaWxlIHJlbWFpbnMgdW5tb2RpZmllZC4KCiAtIEkgY29ycmVjdGVkIGEgZmV3IG1pbm9yIHRoaW5ncyB0aGF0IG1hZGUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4KICAgLVdhbGwgLXBlZGFudGljIHdhcyB1c2VkLgoKIC0gSSdtIG1vdmluZyB0aGUgb2ZmaWNpYWwgY3VybCB3ZWIgcGFnZSB0byBodHRwOi8vY3VybC5oYXh4Lm51LiBJIHRoaW5rIGl0CiAgIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gcmVtZW1iZXIgYXMgaXQgaXMgYSBsb3Qgc2hvcnRlciBhbmQgbGVzcyBjcnlwdGljLgogICBUaGUgb2xkIG9uZSBzdGlsbCB3b3JrcyBhbmQgc2hvd3MgdGhlIHNhbWUgaW5mby4KCiBEYW5pZWwgKDExIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1haWxlZCBtZSBhbm90aGVyIGNvcnJlY3Rpb24gZm9yIE5ST0ZGIGluIHRoZQogICBjb25maWd1cmUuaW4gdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIElSSVggdXNlcnMuCgogRGFuaWVsICgxMCBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBoZWxwZWQgbWUgd2l0aCBzb21lIHN0dXBpZCBNYWtlZmlsZSB0aGluZ3MsIGFzIHdlbGwgYXMKICAgc29tZSBmaWRkbGluZyB3aXRoIHRoZSBnZXRkYXRlLmMgc3R1ZmYgdGhhdCBoZSBoYWQgcHJvYmxlbXMgd2l0aCB1bmRlcgogICBIUC1VWCB2MTAuIGdldGRhdGUueSB3aWxsIG5vdyBiZSBjb21waWxlZCBpbnRvIGdldGRhdGUuYyBpZiB0aGUgYXBwcm9wcmlhdGUKICAgeWFjYyBvciBiaXNvbiBpcyBmb3VuZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4gU2luY2UgdGhpcyBpcyBzbGlnaHRseSBuZXcsCiAgIHdlIG5lZWQgdG8gdGVzdCB0aGUgb3V0cHV0IGdldGRhdGUuYyB3aXRoIHdpbjMyIHN5c3RlbXMgdG8gbWFrZSBzdXJlIGl0CiAgIHN0aWxsIGNvbXBpbGVzIHRoZXJlLgoKIERhbmllbCAoNSBBdWd1c3QgMTk5OSkKIC0gSSd2ZSBqdXN0IHNldHVwIGEgbmV3IG1haWxpbmcgbGlzdCB3aXRoIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBkaXNjdXNzaW9ucwogICBhcm91bmQgbGliY3VybCBkZXZlbG9wbWVudCBpbiBpdC4gSSBtYWlubHkgZXhwZWN0IGl0IHRvIGJlIGZvciB0aG91Z2h0cyBhbmQKICAgYnJhaW5zdG9ybWluZyBhcm91bmQgYSAibmV4dCBnZW5lcmF0aW9uIiBsaWJyYXJ5LCByYXRoZXIgdGhhbiBuaXRwaWNraW5nCiAgIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9yIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KCiAgIFRvIGpvaW4gb3VyIGhhcHB5IGJ1bmNoIG9mIGZ1dHVyZS1sb29raW5nIGdlZWtzLCBlbnRlciAnc3Vic2NyaWJlCiAgIDxhZGRyZXNzPicgaW4gdGhlIGJvZHkgb2YgYSBtYWlsIGFuZCBzZW5kIGl0IHRvCiAgIGxpYmN1cmwtcmVxdWVzdEBsaXN0c2Vydi5mdHMuZnJvbnRlYy5zZS4gIEN1cmwgYnVnIHJlcG9ydHMsIHRoZSB1c3VhbCBjdXJsCiAgIHRhbGsgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgYmUga2VwdCBpbiB0aGlzIG1haWxpbmcgbGlzdC4gSSd2ZQogICBzdGFydGVkIHRvIGFyY2hpdmUgdGhpcyBtYWlsaW5nIGxpc3QgYW5kIGhhdmUgcHV0IHRoZSBsaWJjdXJsIHdlYiBwYWdlIGF0CiAgIHd3dy5mdHMuZnJvbnRlYy5zZS9+ZGFzdC9saWJjdXJsLy4KCiAtIFN0ZWZhbiBLYW50aGFrIGNvbnRhY3RlZCBtZSByZWdhcmRpbmcgYSBmZXcgcHJvYmxlbXMgaW4gdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQgd2hpY2ggaGUgZGlzY292ZXJlZCB3aGVuIHRyeWluZyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIKICAgU2llbWVucyBTSU5JWC1aIFY1LjQyQjIwMDQhCgogLSBNYXJjdXMgS2xlaW4gdmVyeSBhY2N1cmF0ZWx5IGluZm9ybWVkIG1lIHRoYXQgc3JjL3ZlcnNpb24uaCB3YXMgbm90IHByZXNlbnQKICAgaW4gdGhlIENWUyByZXBvc2l0b3J5LiBPaCwgaG93IHNpbGx5Li4uCgogLSBMaW51cyBOaWVsc2VuIHJld3JvdGUgdGhlIHRlbG5ldDovLyBwYXJ0IGFuZCBub3cgY3VybCBvZmZlcnMgbGltaXRlZCB0ZWxuZXQKICAgc3VwcG9ydC4gSWYgeW91IHJ1biBjdXJsIGxpa2UgJ2N1cmwgdGVsbmV0Oi8vaG9zdCcgeW91J2xsIGdldCBhbGwgb3V0cHV0IG9uCiAgIHRoZSBzY3JlZW4gYW5kIGN1cmwgd2lsbCByZWFkIGlucHV0IGZyb20gc3RkaW4uIFlvdSdsbCBiZSBhYmxlIHRvIGxvZ2luIGFuZAogICBydW4gY29tbWFuZHMgZXRjLCBidXQgc2luY2UgdGhlIG91dHB1dCBpcyBidWZmZXJlZCwgZXhwZWN0IHRvIGdldCBhIGxpdHRsZQogICB3ZWlyZCBvdXRwdXQuCgogICBUaGlzIGlzIHN0aWxsIGluIGl0cyBpbmZhbmN5IGFuZCBpdCBtaWdodCBnZXQgY2hhbmdlZC4gV2UgbmVlZCB5b3VyCiAgIGZlZWQtYmFjayBhbmQgaW5wdXQgaW4gaG93IHRoaXMgaXMgYmVzdCBkb25lLgoKICAgV0lOMzIgTk9URTogSSBiZXQgd2UnbGwgZ2V0IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIGN1cnJlbnQKICAgbGliL3RlbG5ldC5jIG9uIHdpbjMyLCBidXQgSSB0aGluayB3ZSBjYW4gc29ydCB0aGVtIG91dCBpbiB0aW1lLgoKIC0gRGF2aWQgU2FuZGVyc29uIHJlcG9ydGVkIHRoYXQgRk9SQ0VfQUxMT0NBX0ggb3IgSEFWRV9BTExPQ0FfSCBtdXN0IGJlCiAgIGRlZmluZWQgZm9yIGdldGRhdGUuYyB0byBjb21waWxlIHByb3Blcmx5IG9uIEhQLVVYIDExLjAuIEkgdXBkYXRlZCB0aGUKICAgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgYWxsb2NhLmggd2hpY2ggc2hvdWxkIG1ha2UgaXQuCgogRGFuaWVsICg0IEF1Z3VzdCAxOTk5KQogLSBJIGZpbmFsbHkgZ290IHRvIHVuZGVyc3RhbmQgTWFyY3VzIEtsZWluJ3MgZnRwIGRvd25sb2FkIHJlc3VtZSBwcm9ibGVtLAogICB3aGljaCB0dXJucyBvdXQgdG8gYmUgZHVlIHRvIGRpZmZlcmVudCBvdXRwdXRzIGZyb20gZGlmZmVyZW50IGZ0cAogICBzZXJ2ZXJzLiBJdCBtYWtlcyBmdHAgZG93bmxvYWQgcmVzdW1pbmcgYSBsaXR0bGUgdHJpY2tpZXIsIGJ1dCBJJ3ZlIG1hZGUKICAgc29tZSBtb2RpZmljYXRpb25zIEkgcmVhbGx5IGJlbGlldmUgd2lsbCB3b3JrIGZvciBtb3N0IGZ0cCBzZXJ2ZXJzIGFuZCBJIGRvCiAgIGhvcGUgeW91IHJlcG9ydCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoaXMhCgogLSBBZGRlZCB0ZXh0IGFib3V0IGZpbGUgdHJhbnNmZXIgcmVzdW1pbmcgdG8gUkVBRE1FLmN1cmwuCgogRGFuaWVsICgyIEF1Z3VzdCAxOTk5KQogLSBBcHBsaWVkIGEgcHJvZ3Jlc3MtYmFyIHBhdGNoIGZyb20gTGFycyBKLiBBYXMuIEl0IG9mZmVycwogICBhIG5ldyBzdHlsZWQgcHJvZ3Jlc3MgYmFyIGVuYWJsZWQgd2l0aCAtIy8tLXByb2dyZXNzLWJhci4gCgogVC4gWWFtYWRhIDx0YWkgYXQgaW1hc3kub3IuanA+ICgzMCBKdWx5IDE5OTkpCiAtIEl0IGJyZWFrcyB3aXRoIHNlZ2ZhdWx0IHdoZW4gMSkgY3VybCBpcyB1c2luZyAubmV0cmMgdG8gb2J0YWluCiAgIHVzZXJuYW1lL3Bhc3N3b3JkIChvcHRpb24gJy1uJyksIGFuZCAyKSBpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQgdG8KICAgYW5vdGhlciBsb2NhdGlvbiAob3B0aW9uICctTCcpLgoKICAgVGhlcmUgaXMgYSBzbWFsbCBidWcgaW4gbGliL3VybC5jIChibG9jayBzdGFydGluZyBmcm9tIGxpbmUgNjQxKSwgd2hpY2gKICAgdHJpZXMgdG8gdGFrZSBvdXQgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB1c2VyLSBzdXBwbGllZCBjb21tYW5kLWxpbmUKICAgYXJndW1lbnQgKCctdScgb3B0aW9uKS4gVGhpcyBibG9jayBpcyBuZXZlciBleGVjdXRlZCBvbiBmaXJzdCBhdHRlbXB0IHNpbmNlCiAgIENPTkZfVVNFUlBXRCBiaXQgaXNuJ3Qgc2V0IGF0IGZpcnN0LCBidXQgY3VybCBsYXRlciB0dXJucyBpdCBvbiB3aGVuIGl0CiAgIGNoZWNrcyBmb3IgQ09ORl9ORVRSQyBiaXQuIFNvIHdoZW4gY3VybCB0cmllcyB0byByZWRvIGV2ZXJ5dGhpbmcgZHVlIHRvCiAgIHJlZGlyZWN0aW9uLCBpdCBzZWdmYXVsdHMgdHJ5aW5nIHRvIGFjY2VzcyAqZGF0YS0+dXNlcnB3ZC4KClZlcnNpb24gNS45LjEKCiBEYW5pZWwgKDMwIEp1bHkgMTk5OSkKIC0gU3RldmUgV2FsY2ggcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrIGluIHRoZSBmb3JtZGF0YQogICBmdW5jdGlvbnMuIEkgYWRkZWQgYSBGb3JtRnJlZSgpIGZ1bmN0aW9uIHRoYXQgaXMgbm93IHVzZWQgYW5kIHN1cHBvc2VkIHRvCiAgIGNvcnJlY3QgdGhpcyBmbGF3LgoKIC0gTWFyayBXb3R0b24gcmVwb3J0ZWQ6CiAgICdjdXJsIC1MIGh0dHBzOi8vd3d3LmN3YS5jb20uYXUvJyBjb3JlIGR1bXBzLiAgSSBtYW5hZ2VkIHRvIGN1cmUgdGhpcyBieQogICBjb3JyZWN0aW5nIHRoZSBjbGVhbnVwIHByb2NlZHVyZS4gVGhlIGJ1ZyBzZWVtcyB0byBiZSBnb25lIHdpdGggbXkgT3BlblNTTAogICAwLjkuMmIsIGFsdGhvdWdoIHN0aWxsIG9jY3VycyB3aGVuIEkgcnVuIHRoZSB+MTAwIHllYXJzIG9sZCBTU0xlYXkgMC44LjAuIEkKICAgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGN1cmwgb3IgU1NMZWF5IHRoYXQgaXMgdG8gYmxhbWUgZm9yIHRoYXQuCgogLSBNYXJjdXMgS2xlaW46CiAgIFJlcG9ydGVkIGFuIEZUUCB1cGxvYWQgcmVzdW1lIGJ1ZyB0aGF0IEkgcmVhbGx5IGNhbid0IHJlcGVhdCBub3IgdW5kZXJzdGFuZC4KICAgSSBsZWF2ZSBpdCBoZXJlIHNvIHRoYXQgaXQgd29uJ3QgYmUgZm9yZ290dGVuLgoKIERhbmllbCAoMjkgSnVseSAxOTk5KQogLSBDb3N0eWEgU2h1bHl1cGluIHN1Z2dlc3RlZCBzdXBwb3J0IGZvciBsb25nZXIgVVJMcyB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICAgYW5kIEkgY291bGQgb25seSBhZ3JlZSBhbmQgZml4IGl0IQoKIC0gTGVpZ2ggUHVyZGllIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgdXBsb2FkL1BPU1QgZGVwYXJ0bWVudC4gSXQgdHVybmVkIG91dAogICB0aGF0IGh0dHAuYyBhY2NpZGVudGFseSBjbGVhcmVkIHRoZSBwb2ludGVyIGluc3RlYWQgb2YgdGhlIGJ5dGUgY291bnRlcgogICB3aGVuIHN1cHBvc2VkIHRvLgoKIC0gQ29zdHlhIFNodWx5dXBpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwb3J0IG51bWJlcnMgYW5kIExvY2F0aW9uOi4gSWYKICAgeW91IGhhZCBhIHNlcnZlciBhdCBhIG5vbi1zdGFuZGFyZCBwb3J0IHRoYXQgcmVkaXJlY3RlZCB0byBhbiBVUkwgdXNpbmcgYQogICBzdGFuZGFyZCBwb3J0IG51bWJlciwgY3VybCBzdGlsbCB1c2VkIHRoYXQgZmlyc3QgcG9ydCBudW1iZXIuCgogLSBSYWxwaCBCZWNrbWFubiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB1c2luZyBib3RoIENPTkZfRk9MTE9XTE9DQVRJT04KICAgYW5kIENPTkZfRkFJTE9ORVJST1Igc2ltdWx0YW5lb3VzbHkuIFNpbmNlIHRoZSBDT05GX0ZBSUxPTkVSUk9SIGV4aXRzIG9uCiAgIHRoZSAzMDItY29kZSB0aGF0IHRoZSBmb2xsb3cgbG9jYXRpb24gaGVhZGVyIG91dHB1dHMgaXQgd2lsbCBuZXZlciBzaG93IGFueQogICBodG1sIG9uIGxvY2F0aW9uOiBwYWdlcy4gSSBoYXZlIG5vdyBtYWRlIGl0IGxvb2sgZm9yID49NDAwIGNvZGVzIGlmCiAgIENPTkZfRk9MTE9XTE9DQVRJT04gaXMgc2V0LgoKIC0gJ3N0cnVjdCBzbGlzdCcgaXMgbm93IHJlbmFtZWQgdG8gJ3N0cnVjdCBjdXJsX3NsaXN0JyAoYXMgc3VnZ2VzdGVkIGJ5IFJhbHBoCiAgIEJlY2ttYW5uKS4KCiAtIEpvc2h1YSBTd2luayBhbmQgUmljayBXZWx5a29jaHkgd2VyZSB0aGUgZmlyc3QgdG8gcG9pbnQgb3V0IHRvIG1lIHRoYXQgdGhlCiAgIGxhdGVzdCBPcGVuU1NMIHBhY2thZ2Ugbm93IGhhdmUgbW92ZWQgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aC4gSXQgaXMgbm93CiAgIGluIC91c3IvbG9jYWwvc3NsL2luY2x1ZGUvb3BlbnNzbCBhbmQgSSBoYXZlIG5vdyBtb2RpZmllZCB0aGUgLS1lbmFibGUtc3NsCiAgIG9wdGlvbiBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdXNlIHRoYXQgYXMgdGhlIHByaW1hcnkgcGF0aCwgYW5kIEkKICAgbGVhdmUgdGhlIGZvcm1lciBwYXRoIHRvbyB0byB3b3JrIHdpdGggb2xkZXIgcGFja2FnZXMgb2YgT3BlblNTTCB0b28uCgogRGFuaWVsICg5IEp1bmUgMTk5OSkKIC0gSSBmaW5hbGx5IHVuZGVyc3Rvb2QgdGhlIElSSVggcHJvYmxlbSBhbmQgbm93IGl0IHNlZW0gdG8gY29tcGlsZSBvbiBpdCEKICAgSSBhbSBnb25uYSByZW1vdmUgdGhvc2UgI2RlZmluZSBzdHJjYXNlY21wKCkgdGhpbmdzIG9uY2UgYW5kIGZvciBhbGwgbm93LgoKIERhbmllbCAoNCBKdW5lIDE5OTkpCiAtIEkgYWRqdXN0ZWQgdGhlIEZUUCByZXBseSAyMjcgcGFyc2VyIHRvIG1ha2UgdGhlIFBBU1YgY29tbWFuZCB3b3JrIGJldHRlcgogICB3aXRoIG1vcmUgZnRwIHNlcnZlcnMuIEFwcGVhcmFudGx5IHRoZSBSb3hlbiBDaGFsbGFuZ2VyIHNlcnZlciByZXBsaWVkCiAgIHNvbWV0aGluZyBjdXJsIDUuOSBjb3VsZCBkZWFsIHdpdGghIDotKCBSZXBvcnRlZCBieSBBc2hsZXkgUmVpZC1Nb250YW5hcm8KICAgYW5kIE1hcmsgQnV0bGVyIGJyb3VnaHQgYSBzb2x1dGlvbiBmb3IgaXQuCgogRGFuaWVsICgyNiBNYXkgMTk5OSkKIC0gUmVhcnJhbmdlZC4gUkVBRE1FIGlzIG5ldywgdGhlIG9sZCBvbmUgaXMgbm93IFJFQURNRS5jdXJsIGFuZCBJIGFkZGVkIGEKICAgUkVBRE1FLmxpYmN1cmwgd2l0aCB0ZXh0IEkgZ290IGZyb20gUmFscGggQmVja21hbm4uCgogLSBJIGFsc28gdXBkYXRlZCB0aGUgSU5TVEFMTCB0ZXh0LgoKIERhbmllbCAoMjUgTWF5IDE5OTkpCiAtIERhdmlkIEpvbmF0aGFuIExvd3NreSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgIHdpdGggZm9ybSBwb3N0aW5nIHdoZXJlIHRoZSB2YXJpYWJsZSBzaG91bGRuJ3QgaGF2ZSBhbnkgY29udGVudCwgYXMgaW4gY3VybAogICAtRiAiZm9ybT0iIHd3dy5zaXRlLmNvbS4gSXQgd2FzIG5vdyBmaXhlZC4KClZlcnNpb24gNS45IChNYXkgMjIgMTk5OSkKCiBEYW5pZWwgKDIyIE1heSAxOTk5KQogLSBJJ3ZlIGdvdCBhIGJ1ZyByZXBvcnQgZnJvbSBBYXJvbiBTY2FyaXNicmljayBpbiB3aGljaCBoZSBzdGF0ZXMgaGUgaGFzIHNvbWUKICAgcHJvYmxlbXMgd2l0aCAtTCB1bmRlciBGcmVlQlNEIDMuMC4gSSBoYXZlIHByZXZpb3VzbHkgZ290IGFub3RoZXIgYnVnCiAgIHJlcG9ydCBmcm9tIFN0ZWZhbiBHcmV0aGVyIHdoaWNoIHBvaW50cyBhdCBhbiBlcnJvciB3aXRoIHNpbWlsYXIgc3ltcHRob21zCiAgIHdoZW4gdXNpbmcgd2luMzIuIEkgbWFkZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3IHVybCBzdHJpbmcgYSBiaXQgZmFzdGVyCiAgIGFuZCBkaWZmZXJlbnQsIGRvbid0IGtub3cgaWYgaXQgYWN0dWFsbHkgaW1wcm92ZXMgYW55dGhpbmcgdGhvdWdoLi4uCgogRGFuaWVsICgyMCBNYXkgMTk5OSkKIC0gTWFkZSB0aGUgY29va2llIHBhcnNlciBkZWFsIHdpdGggQ1JMRiBuZXdsaW5lcyB0b28uCgogRGFuaWVsICgxOSBNYXkgMTk5OSkKIC0gRG93bmxvYWQoKSBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIGZhaWxpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlIHNyZWFkKCkKICAgZnVuY3Rpb24uIEFkYW0gQ295bmUgZm91bmQgdGhlIHByb2JsZW0gaW4gdGhlIHdpbjMyIHZlcnNpb24sIGFuZCBUcm95IEVuZ2VsCiAgIGhlbHBlZCBtZSBvdXQgaXNvbGF0aW5nIGl0LgoKIERhbmllbCAoMTYgTWF5IDE5OTkpCiAtIFJpY2hhcmQgQWRhbXMgcG9pbnRlZCBvdXQgYSBidWcgSSBpbnRyb2R1Y2VkIGluIDUuOC4gLS1kdW1wLWhlYWRlciBkb2Vzbid0CiAgIHdvcmsgYW55bW9yZSEgOi0vIEkgZml4ZWQgaXQgbm93LgoKIC0gQWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEpvc2h1YSBTd2luayBJIGFkZGVkIC1TIC8gLS1zaG93LWVycm9yIHRvIGZvcmNlIGN1cmwKICAgdG8gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGFuIGVycm9yLCBldmVuIGlmIC1zLy0tc2lsZW50IHdhcwogICB1c2VkLgoKIERhbmllbCAoMTAgTWF5IDE5OTkpCiAtIEkgbW92ZWQgdGhlIHN0dWZmIGNvbmNlcm5pbmcgSFRUUCwgRElDVCBhbmQgVEVMTkVUIGl0IHRoZWlyIG93biBzb3VyY2UKICAgZmlsZXMgbm93LiBJdCBpcyBhIGJlZ2lubmluZyBvbiBteSBjbGVhbi11cCBvZiB0aGUgc291cmNlcyB0byBtYWtlIHRoZW0KICAgbGF5ZXIgYWxsIHRob3NlIHByb3RvY29scyBiZXR0ZXIgdG8gZW5hYmxlIG1vcmUgdG8gYmUgYWRkZWQgZWFzaWVyIGluIHRoZQogICBmdXR1cmUhCgogLSBMZW9uIEJyZWVkdCBzZW50IG1lIHNvbWUgZmlsZXMgSSd2ZSBub3QgcHV0IGludG8gdGhlIG1haW4gY3VybAogICBhcmNoaXZlLiBUaGV5J3JlIGZvciBjcmVhdGluZyB0aGUgRGViaWFuIHBhY2thZ2UgdGhpbmdpZS4gSGUgYWxzbyBzZW50IG1lIGEKICAgZGViaWFuIHBhY2thZ2UgdGhhdCBJJ3ZlIG1hZGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhdCB0aGUgd2ViIHBhZ2UKCiBEYW5pZWwgKDkgTWF5IDE5OTkpCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBjeWd3aW4gdG9vLgoKIFRyb3kgRW5nZWwgKDcgTWF5IDE5OTkpCiAtIEJyb3VnaHQgYSBzZXJpZXMgb2YgcGF0Y2hlcyB0byBhbGxvdyBjdXJsIHRvIGNvbXBpbGUgc21vb3RobHkgb24gTVNWQysrIDYKICAgYWdhaW4hCgogRGFuaWVsICg2IE1heSAxOTk5KQogLSBJIGNoYW5nZWQgdGhlICNpZmRlZiBIQVZFX1NUUkZUSU1FIHBsYWNlbWVudCBmb3IgdGhlIC16IGNvZGUgc28gdGhhdCBpdAogICB3aWxsIGJlIGVhc2llciB0byBkaXNjb3ZlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGF0IGZ1bmN0aW9uIGFuZCB0aHVzCiAgIGNhbid0IHVzZSAteiBzdWNjZXNzZnVsbHkuIE1hZGUgdGhlIHN0cmZ0aW1lKCkgZ2V0IHVzZWQgaWYgV0lOMzIgaXMgZGVmaW5lZAogICB0b28uCgpWZXJzaW9uIDUuOAoKIERhbmllbCAoNSBNYXkgMTk5OSkKIC0gSSd2ZSBoYWQgaXQgd2l0aCB0aGlzIGF1dG9jb25mL2F1dG9tYWtlIG1lc3MuIEl0IHNlZW1zIHRvIHdvcmsgYWxscmlnaHQKICAgZm9yIG1vc3QgcGVvcGxlIHdobyBkb24ndCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCwgYnV0IGZvciB0aG9zZSB3aG8gaGF2ZQogICB0aGVyZSBhcmUgcHJvYmxlbXMgYWxsIG92ZXIuCgogICBJJ3ZlIGdvdCBsaWtlIGZpdmUgZGlmZmVyZW50IGJ1ZyByZXBvcnRzIG9uIHRoaXMgb25seSB0aGUgbGFzdAogICB3ZWVrLi4uIENsYXVkaW8gTmV2ZXMgYW5kIEZlZGVyaWNvIEJpYW5jaGkgYW5kIHJvb3QgPGR1Z2dlcmowMDEgYXQKICAgaGF3YWlpLnJyLmNvbT4gYXJlIHNvbWUgb2YgdGhlbSByZXBvcnRpbmcgdGhpcy4KCiAgIEN1cnJlbnRseSwgSSBoYXZlIG5vIHJlYWxseSBnb29kIGZpeCBzaW5jZSBJIHdhbnQgdG8gdXNlIGF1dG9tYWtlIG15c2VsZiB0bwogICBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuaW4gZmlsZXMuIEkndmUgZm91bmQgb3V0IHRoYXQgdGhlIEBTSEVMTEAtcHJvYmxlbXMKICAgY2FuIG9mdGVuIGJlIGZpeGVkIGJ5IG1hbnVhbGx5IGludm9raW5nICdhdXRvbWFrZScgaW4gdGhlIGFyY2hpdmUgcm9vdAogICBiZWZvcmUgeW91IHJ1biAuL2NvbmZpZ3VyZS4uLiBJJ3ZlIGhhY2tlZCBteSBtYWtldGd6IHNjcmlwdCBub3cgdG8gZmlkZGxlCiAgIGEgYml0IHdpdGggdGhpcyBhbmQgbXkgdGVzdHMgc2VlbSB0byB3b3JrIGJldHRlciB0aGFuIGJlZm9yZSBhdCBsZWFzdCEKCiBEYW5pZWwgKDQgTWF5IDE5OTkpCiAtIG1raGVscC5wbCBoYXMgYmVlbiBkb2luZyBiYWRseSBsYXRlbHkuIEkgY29ycmVjdGVkIGEgY2FzZSBwcm9ibGVtIGluCiAgIHRoZSByZWdleGVzLgoKIC0gSSd2ZSBub3cgcmVtYWRlIHRoZSAtbyBvcHRpb24gdG8gbm90IHRvdWNoIHRoZSBmaWxlIHVubGVzcyBpdCBuZWVkcyB0by4KICAgSSBoYWQgdG8gZG8gdGhpcyB0byBtYWtlIC16IG9wdGlvbiByZWFsbHkgZmluZSwgc2luY2Ugbm93IHlvdSBjYW4gbWFrZSBhCiAgIGN1cmwgZmV0Y2ggYW5kIHVzZSBhIGxvY2FsIGNvcHkncyB0aW1lIHdoZW4gZG93bmxvYWRpbmcgdG8gdGhhdCBmaWxlLCBhcwogICBpbjoKCiAgICAgICAgY3VybCAteiBkdW1wIC1vIGR1bXAgcmVtb3RlLnNpdGUuY29tL2ZpbGUuaHRtbAoKICAgVGhpcyB3aWxsIG9ubHkgZ2V0IHRoZSBmaWxlIGlmIHRoZSByZW1vdGUgb25lIGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsLgogICBJJ20gYXdhcmUgdGhhdCB0aGlzIGFsdGVycyBwcmV2aW91cyBiZWhhdmlvdXIgYSBsaXR0bGUuIFNvbWUgc2NyaXB0cyBvdXQKICAgdGhlcmUgbWF5IGRlcGVuZCBvbiB0aGF0IHRoZSBmaWxlIGlzIGFsd2F5cyB0b3VjaGVkLi4uCgogLSBDb3JyZWN0ZWQgYSBidWcgaW4gdGhlIFNTTHYyL3YzIHNlbGVjdGlvbi4KCiAtIEZlbGl4IHZvbiBMZWl0bmVyIHJlcXVlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlIGFibGUgdG8gc2VuZAogICAiSWYtTW9kaWZpZWQtU2luY2UiIGhlYWRlcnMsIHdoaWNoIGluZGVlZCBpcyBhIGZhaXIgaWRlYS4gIEkgaW1wbGVtZW50ZWQgaXQKICAgcmlnaHQgYXdheSEgVHJ5IC16IDxleHByZXNzaW9uPiB3aGVyZSBleHByZXNzaW9uIGlzIGEgZnVsbCBHTlUgZGF0ZQogICBleHByZXNzaW9uIG9yIGEgZmlsZSBuYW1lIHRvIGdldCB0aGUgZGF0ZSBmcm9tIQoKIFN0ZXBoYW4gTGFnZXJob2xtICgzMCBBcHIgMTk5OSkKIC0gUG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggdGhlIHNyYy9NYWtlZmlsZSBmb3IgRnJlZUJTRC4gVGhlIFJNIHZhcmlhYmxlCiAgIGlzbid0IHNldCBhbmQgY2F1c2VzIHRoZSBtYWtlIHRvIGZhaWwuCgogRGFuaWVsICgyNiBBcHJpbCAxOTk5KQogLSBBbSBJIHNpbGx5IG9yIHdoYXQ/IElydmluZyBXb2xmZSBwb2ludGVkIG91dCB0byBtZSB0aGF0IHRoZSBjdXJsIHZlcnNpb24KICAgbnVtYmVyIHdhcyBub3Qgc2V0IHByb3Blcmx5LiBIYXNuJ3QgYmVlbiBzaW5jZSA1LjYuIFRoaXMgd2FzIGR1ZSB0byBhIGJ1ZwogICBpbiBteSBtYWtldGd6IHNjcmlwdCEKCiBEYXZpZCBFcmlrc3NvbiAoMjUgQXByIDE5OTkpCiAtIEZvdW5kIGEgYnVnIGluIGNvb2tpZXMuYyB0aGF0IG1hZGUgaXQgY3Jhc2ggYXQgdGltZXMuCgpWZXJzaW9uIDUuNy4xCgogRG91ZyBLYXVmbWFuICgyMyBBcHIgMTk5OSkKIC0gQnJvdWdodCB0d28gc3Vub3MgNCBmaXhlcy4gT25lIG9mIHRoZW0gYmVpbmcgdGhlIGhvc3RpcC5jIGZpeCBtZW50aW9uZWQKICAgYmVsb3cgYW5kIHRoZSBvdGhlciBvbmUgYSBjb3JyZWN0aW9uIGluIGluY2x1ZGUvc3RkY2hlYWRlcnMuaAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggYWJvdXQgY29tcGlsaW5nIHdpdGggdGhlIFVTLXZlcnNpb24gb2Ygb3BlbnNzbCB0byB0aGUKICAgSU5TVEFMTCBmaWxlLgoKIERhbmllbAogLSBOZXcgbWFpbGluZyBsaXN0IGFkZHJlc3MuIEluZm8gdXBkYXRlZCBvbiB0aGUgd2ViIHBhZ2UgYXMgd2VsbCBhcyBpbiB0aGUKICAgUkVBRE1FIGZpbGUKCiBHcmVnIE9udWZlciAoMjAgQXByIDE5OTkpCiAtIGhvc3RpcC5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIFN1bk9TIDUuNS4xLgogICBJdCBuZWVkcyBhbiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgpWZXJzaW9uIDUuNwoKIERhbmllbCAoQXByIDIwIDE5OTkpCiAtIERlY2lkZWQgdG8gdXBsb2FkIGEgbm9uLWJldGEgdmVyc2lvbiByaWdodCBub3chCgogLSBNYWRlIGN1cmwgc3VwcG9ydCBhbnktbGVuZ3RoIEhUVFAgaGVhZGVycy4gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBub3cKICAgc2ltcGx5IGVubGFyZ2VkIGV2ZXJ5IHRpbWUgaXQgdHVybnMgb3V0IHRvIGJlIHRvbyBzbWFsbCEKCiAtIEFkZGVkIHRoZSBGQVEgZmlsZSB0byB0aGUgYXJjaGl2ZS4gU3RpbGwgYSBiaXQgc21hbGxpc2gsIGJ1dCBpdCBpcyBhCiAgIHN0YXJ0LgoKIEVyaWMgVGhlbGluICgxNSBBcHIgMTk5OSkKIC0gTWFkZSAtRCBhY2NlcHQgJy0nIGluc3RlYWQgb2YgZmlsZW5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgoKVmVyc2lvbiA1LjYuM2JldGEKCiBEYW5pZWwgKEFwciAxMiAxOTk5KQoKIC0gQ2hhbmdlZCB0d28gI2lmZGVmIFdJTjMyIHRvIGJldHRlciAjaWZkZWYgPGVycm9yY29kZT4gd2hlbiBjb25uZWN0KClpbmcKICAgaW4gdXJsLmMgYW5kIGZ0cC5jLiBNYWtlcyBjeWd3aW4zMiBkZWFsIHdpdGggdGhlbSBiZXR0ZXIgdG9vLiBXZSBzaG91bGQKICAgdHJ5IHRvIGdldCBzb21lIGRlY2VudCB3aW4zMi1yZXBsYWNlbWVudCB0aGVyZS4gQW55b25lPwoKIC0gVGhlIG9sZCAtMy8tLWNybGYgb3B0aW9uIGlzIG5vdyBPTkxZIC0tY3JsZiEKCiAtIEkgY2hhbmdlZCB0aGUgIlNTTCBmaXgiIHRvIGEgbW9yZSBsYW1lIG9uZSwgYnV0IHRoYXQgZG9lc24ndCByZW1vdmUgYXMKICAgbXVjaCBmdW5jdGlvbmFsaXR5LiBOb3cgSSd2ZSBlbmFibGVkIHRoZSBsaWIgdG8gc2VsZWN0IHdoYXQgU1NMIHZlcnNpb24gaXQKICAgc2hvdWxkIHRyeSBmaXJzdC4gQXBwZWFyYW50bHkgc29tZSBvbGRlciBTU0wtc2VydmVycyBkb24ndCBsaWtlIHdoZW4geW91CiAgIHRhbGsgdjMgd2l0aCB0aGVtIHNvIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gZm9yY2UgY3VybCB0byB0YWxrIHYyIGZyb20gdGhlCiAgIHN0YXJ0LiBUaGUgZml4IGRhdGVkIEFwcmlsIDYgYW5kIHBvc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGZvcmNlZCBjdXJsIHRvCiAgIHVzZSB2MiBhdCBhbGwgdGltZXMgdXNpbmcgYSBtb2Rlcm4gT3BlblNTTCB2ZXJzaW9uLCBidXQgd2UgZG9uJ3QgcmVhbGx5CiAgIHdhbnQgc3VjaCBhIGNyaXBwbGVkIHNvbHV0aW9uLgogCiAtIE1hcmMgQm91Y2hlciBzZW50IG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgYSBtYXRoIGVycm9yIGZvciB0aGUKICAgIkN1cnIuU3BlZWQiIHByb2dyZXNzIG1ldGVyLgoKIC0gRXJpYyBUaGVsaW4gc2VudCBtZSBhIHBhdGNoIHRoYXQgZW5hYmxlcyAnLUsgLScgdG8gcmVhZCBhIGNvbmZpZyBmaWxlIGZyb20KICAgc3RkaW4uCgogLSBJIGZvdW5kIG91dCB3ZSBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUgcHJvcGVybHkgYmVmb3JlIHNvIEkgYWRkZWQgaXQhCgogRGFuaWVsIChBcHIgOSAxOTk5KQogLSBZdSBYaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggZnRwIGRvd25sb2FkIHJlc3VtZS4gIEl0IGRpZG4ndCB3b3JrIGF0CiAgIGFsbCEgOy1PCgogRGFuaWVsIChBcHIgNiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHZlcnNpb24gc3RyaW5nIHBhcnQgZ2VuZXJhdGVkIGZvciB0aGUgU1NMIHZlcnNpb24uCgogLSBJIGZvdW5kIGEgd2F5IHRvIG1ha2Ugc29tZSBvdGhlciBTU0wgcGFnZSB3b3JrIHdpdGggb3BlbnNzbCAwLjkuMSsgdGhhdAogICBwcmV2aW91c2x5IGRpZG4ndCAoc3NsZWF5IDAuOC4wIHdvcmtzIHdpdGggaXQgdGhvdWdoISkuIFRyeWluZyB0byBnZXQKICAgc29tZSByZWFsIGluZm8gZnJvbSB0aGUgT3BlblNTTCBndXlzIHRvIHNlZSBob3cgSSBzaG91bGQgZG8gdG8gYmVoYXZlIHRoZQogICBiZXN0IHdheS4gU1NMZWF5IDAuOC4wIHNob3VsZG4ndCBiZSB0aGF0IG11Y2ggaW4gdXNlIGFueXdheSB0aGVzZSBkYXlzIQoKVmVyc2lvbiA1LjYuMmJldGEKCiBEYW5pZWwgKEFwciA0IDE5OTkpCiAtIEZpbmFsbHkgaGF2ZSBjdXJsIG1vcmUgY29va2llICJhd2FyZSIuIE5vdyByZWFkIGNhcmVmdWxseS4gVGhpcyBpcyBob3cKICAgaXQgd29ya3MuCiAgIFRvIG1ha2UgY3VybCByZWFkIGNvb2tpZXMgZnJvbSBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUsIGluIHBsYWluIGhlYWRlci0KICAgZm9ybWF0IChsaWtlIGZyb20gdGhlIGhlYWRlcnMgb2YgYSBwcmV2aW91cyBmZXRjaCkgaW52b2tlIGN1cmwgd2l0aCB0aGUKICAgLWIgZmxhZyBsaWtlOgoKICAgICAgICBjdXJsIC1iIGZpbGUgaHR0cDovL3NpdGUvZm9vLmh0bWwKCiAgIEN1cmwgd2lsbCB0aGVuIHVzZSBhbGwgY29va2llcyBpdCBmaW5kcyBtYXRjaGluZy4gVGhlIG9sZCBzdHlsZSB0aGF0IHNldHMKICAgYSBzaW5nbGUgY29va2llIHdpdGggLWIgaXMgc3RpbGwgc3VwcG9ydGVkIGFuZCBpcyB1c2VkIGlmIHRoZSBzdHJpbmcKICAgZm9sbG93aW5nIC1iIGluY2x1ZGVzIGEgJz0nIGxldHRlciwgYXMgaW4gIi1iIG5hbWU9ZGFuaWVsIi4KCiAgIFRvIG1ha2UgY3VybCByZWFkIHRoZSBjb29raWVzIHNlbnQgaW4gY29tYmluYXRpb24gd2l0aCBhIGxvY2F0aW9uOiAod2hpY2gKICAgc2l0ZXMgb2Z0ZW4gZG8pIHBvaW50IGN1cmwgdG8gcmVhZCBhIG5vbi1leGlzdGluZyBmaWxlIGF0IGZpcnN0IChpLmUKICAgdG8gc3RhcnQgd2l0aCBubyBleGlzdGluZyBjb29raWVzKSwgbGlrZToKCiAgICAgICAgY3VybCAtYiBub3doZXJlIGh0dHA6Ly9zaXRlL3NldGNvb2tpZWFuZHJlbG9jYXRlLmh0bWwKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGluIHRoZSBUT0RPIGZpbGUgYWJvdXQgdGhlIFNTTCBwcm9ibGVtcyByZWNlbnRseQogICByZXBvcnRlZC4gRXZpZGVudGx5LCBzb21lIGtpbmQgb2YgU1NMLXByb2JsZW0gY3VybCBtYXkgbmVlZCB0byBhZGRyZXNzLgoKIC0gQmV0dGVyICJMb2NhdGlvbjoiIGZvbGxvd2luZy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoVHVlLCAzMCBNYXIgMTk5OSkKIC0gQSBzdWJzZWNvbmQgZGlzcGxheSBwYXRjaC4KCiBEYW5pZWwgKE1hciAxNCAxOTk5KQogLSBJJ3ZlIHNlcGFyYXRlZCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGliY3VybCBhbmQgY3VybCBub3cuIFRvIG1ha2UKICAgdGhpbmdzIGEgbGl0dGxlIGVhc2llciwgSSBkZWNpZGVkIHRvIHN0YXJ0IHRoZSBjdXJsIG51bWJlcmluZyBmcm9tCiAgIDUuNiBhbmQgdGhlIGZvcm1lciB2ZXJzaW9uIG51bWJlciBrbm93biBhcyAiY3VybCIgaXMgbm93IHRoZSBvbmUKICAgc2V0IGZvciBsaWJjdXJsLgoKIC0gUmVtb3ZlZCB0aGUgJ2VuYWJsZS1uby1wYXNzJyBmcm9tIGNvbmZpZ3VyZSwgSSBkb3VidCBhbnlvbmUgd2FudGVkCiAgIHRoYXQuCgogLSBNYWRlIGxvdHMgb2YgdGlueSBhZGp1c3RtZW50cyB0byBjb21waWxlIHNtb290aGx5IHdpdGggY3lnd2luIHVuZGVyCiAgIHdpbjMyLiBJdCdzIGEga2lsbGVyIGZvciBwb3J0aW5nIHRoaXMgdG8gd2luMzIsIGJ5ZSBieWUgVkMrKyEgOy0pCiAgIENvbXBpbGVzIGFuZCBidWlsZHMgb3V0LW9mLXRoZS1ib3ggbm93LiBTZWUgdGhlIG5ldyB3b3JkaW5ncyBpbgogICBJTlNUQUxMIGZvciBkZXRhaWxzLgoKIC0gQmVnaW5uaW5nIGV4cGVyaW1lbnRzIHdpdGggZG93bmxvYWRpbmcgbXVsdGlwbGUgZG9jdW1lbnQgZnJvbSBhIGh0dHAKICAgc2VydmVyIHdoaWxlIHJlbWFpbmluZyBjb25uZWN0ZWQuCgpWZXJzaW9uIDUuNmJldGEKCiBEYW5pZWwgKE1hciAxMyAxOTk5KQogLSBTaW5jZSBJJ3ZlIGNoYW5nZWQgc28gbXVjaCwgSSB0aG91Z2h0IEknZCBqdXN0IGdvIGFoZWFkIGFuZCBpbXBsZW1lbnQgdGhlCiAgIHN1Z2dlc3Rpb24gZnJvbSBEb3VnbGFzIEUuIFdlZ3NjaGVpZC4gLUQgb3IgLS1kdW1wLWhlYWRlciBpcyBub3cgc3RvcmluZwogICBIVFRQIGhlYWRlcnMgc2VwYXJhdGVseSBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogLSBBZGRlZCBuZXcgdGV4dCB0byBJTlNUQUxMIG9uIHdoYXQgdG8gZG8gdG8gYnVpbGQgdGhpcyBvbiB3aW4zMiBub3cuCgogLSBBYWFyZ2guIEkgaGFkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIHByZWZpeCB0aGUgc2hhcmVkICNpbmNsdWRlIGZpbGVzCiAgIGluIHRoZSBzb3VyY2VzIHdpdGggIi4uL2luY2x1ZGUvIiB0byBwbGVhc2UgVkMrKy4uLgoKIERhbmllbCAoTWFyIDEyIDE5OTkpCiAtIFNwbGl0IHRoZSB1cmwuYyBzb3VyY2UgaW50byBtYW55IHRpbnkgc291cmNlcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgIGFuZCBzbWFsbGVyIHNpemUuCgogRGFuaWVsIChNYXIgMTEgMTk5OSkKIC0gU3RhcnRlZCB0byBjaGFuZ2Ugc3R1ZmYgZm9yIGEgbW92ZSB0byBtYWtlIGxpYmN1cmwgYW5kIGEgbW9yZSBzZXBhcmF0ZQogICBjdXJsIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgbGliY3VybC4gTWFkZSB0aGUgbGliY3VybCBzb3VyY2VzIGludG8KICAgdGhlIG5ldyBsaWIgZGlyZWN0b3J5IHdoaWxlIHRoZSBjdXJsIGFwcGxpY2F0aW9uIHdpbGwgcmVtYWluIGluIHNyYyBhcwogICBiZWZvcmUuIE5ldyBtYWtlZmlsZXMsIGFkanVzdGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIHNvLgoKICAgbGliY3VybC5hIGJ1aWx0IHF1aWNrbHkgYW5kIGVhc2lseS4gSSBiZXR0ZXIgbWFrZSBhIGJldHRlciBpbnRlcmZhY2UgdG8KICAgdGhlIGxpYiBmdW5jdGlvbnMgdGhvdWdoLgoKICAgVGhlIG5ldyByb290IGRpciBpbmNsdWRlLyBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBwdWJsaWMgaW5mb3JtYXRpb24KICAgYWJvdXQgdGhlIG5ldyBsaWJjdXJsLiBJdCBpcyBhIGxpdHRsZSB1Z2x5IHNvIGZhciA6LSkKCgogRGFuaWVsIChNYXIgMSAxOTk5KQogLSBUb2RkIEthdWZtYW5uIHNlbnQgbWUgYSBnb29kIGxpbmsgdG8gTmV0c2NhcGUncyBjb29raWUgc3BlYyBhcyB3ZWxsIGFzIHRoZQogICBpbmZvIHRoYXQgUkZDIDIxMDkgc3BlY2lmaWVzIGhvdyB0byB1c2UgdGhlbS4gIFRoZSBsaW5rIGlzIG5vdyBpbiB0aGUKICAgUkVBRE1FIGFuZCB0aGUgUkZDIGluIHRoZSBSRVNPVVJDRVMuCgogRGFuaWVsIChGZWIgMjMgMTk5OSkKIC0gRmluYWxseSBtYWRlIGNvbmZpZ3VyZSBhY2NlcHQgLS13aXRoLXNzbCB0byBsb29rIGZvciBTU0wgbGlicyBhbmQgaW5jbHVkZXMKICAgaW4gdGhlICJzdGFuZGFyZCIgcGxhY2UgL3Vzci9sb2NhbC9zc2wuLi4KCiBEYW5pZWwgKEZlYiAyMiAxOTk5KQogLSBWZXJpZmllZCB0aGF0IGN1cmwgbGlua2VkIGZpbmUgd2l0aCBPcGVuU1NMIDAuOS4xYyB3aGljaCBzZWVtcyB0byBiZQogICB0aGUgbW9zdCByZWNlbnQuCgogSGVucmkgR29tZXogKEZyaSBGZWIgIDUgMTk5OSkKIC0gU2VudCBpbiBhbiB1cGRhdGVkIGN1cmwtc3NsLnNwZWMuIEkgc3RpbGwgbWlzcyB0aGUgc2NyaXB0IHRoYXQgYnVpbGRzIGFuCiAgIFJQTSBhdXRvbWF0aWNhbGx5Li4uCgpWZXJzaW9uIDUuNS4xCgogTWFyayBCdXRsZXIgKDI3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgcHJvYmxlbXMgaW4gRG93bmxvYWQoKS4KCiBEYW5pdGVsIFN0ZW5iZXJnICgyNSBKYW4gMTk5OSkKIC0gSmVyZW1pZSBQZXRpdCBwb2ludGVkIG91dCBhIGZldyBmbGF3cyBpbiB0aGUgc291cmNlIHRoYXQgcHJldmVudGVkIGl0IGZyb20KICAgY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgbmF0aXZlIGNvbXBpbGVyIHVuZGVyIERpZ2l0YWwgVW5peCB2NC4wZC4KClZlcnNpb24gNS41CgogRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMTk5OSkKIC0gQWRkZWQgQmpvcm5zIHNtYWxsIHRleHQgdG8gdGhlIFJFQURNRSBhYm91dCB0aGUgRElDVCBwcm90b2NvbC4KCiBEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAxOTk5KQogLSA8anN3aW5rIGF0IHNvZnRjb20ubmV0PiByZXBvcnRlZCBhYm91dCB0aGUgd2luMzItdmVyc2lvaW46ICJEb2Vzbid0IHVzZQogICBBTExfUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUiLiBUdXJuZWQgb3V0IHRvIGJlIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYy0KICAgYnVmZmVyIG5hdHVyZSBvZiB0aGUgd2luMzIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbHMhCgogQmpvcm4gUmVlc2UgKDEwIEphbiAxOTk5KQogLSBJIGhhdmUgYXR0YWNoZWQgYSBzaW1wbGUgYWRkaXRpb24gZm9yIHRoZSBESUNUIHByb3RvY29sIChSRkMgMjIyOSkuCiAgIEl0IHBlcmZvcm1zIGRpY3Rpb25hcnkgbG9va3Vwcy4gVGhlIG91dHB1dCBzdGlsbCBuZWVkcyB0byBiZSBiZXR0ZXIKICAgZm9ybWF0dGVkLgoKICAgVG8gdGVzdCBpdCB0cnkgKHRoZSBleGFjdCBmb3JtYXQsIGFuZCBtb3JlIGV4YW1wbGVzIGFyZSBkZXNjcmliZWQgaW4KICAgdGhlIFJGQykKCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG8KICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbzo6c291bmRleAoKCiBWaWNlbnRlIEdhcmNpYSAoMTAgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDIwTUIuCgogRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIC10IGFuZCAtVCBoZWxwIHRleHRzLiBUaGV5IGNsYWltZWQgdG8gYmUgRlRQIG9ubHkuCgpWZXJzaW9uIDUuNAoKIERhbmllbCBTdGVuYmVyZwogKDcgSmFuIDE5OTkpCiAtIElydmluZyBXb2xmZSByZXBvcnRlZCB0aGF0IGN1cmwgLXMgZGlkbid0IGFsd2F5cyBzdXByZXNzIHRoZSBwcm9ncmVzcwogICByZXBvcnRpbmcuIEl0IHdhcyB0aGUgZm9ybSBwb3N0IHRoYXQgYXV0b2FtdGljYWxseSBhbHdheXMgc3dpdGNoZWQgaXQgb24KICAgYWdhaW4uIFRoaXMgaXMgbm93IGNvcnJlY3RlZCEKCiAoNCBKYW4gMTk5OSkKIC0gQW5kcmVhcyBLb3N0eXJrYSBzdWdnZXN0ZWQgSSdkIGFkZCBQVVQgYW5kIGhlIGhlbHBlZCBtZSBvdXQgdG8gdGVzdCBpdC4gSWYKICAgeW91IHVzZSAtdCBvciAtVCBub3cgb24gYSBodHRwIG9yIGh0dHBzIHNlcnZlciwgUFVUIHdpbGwgYmUgdXNlZCBmb3IgZmlsZQogICB1cGxvYWQuCgogICBJIHJlbW92ZWQgdGhlIGZvcm1lciB1c2Ugb2YgLVQgd2l0aCBIVFRQLiBJIGRvdWJ0IGFueW9uZSBldmVyIHJlYWxseSB1c2VkCiAgIHRoYXQuCgogKDQgSmFuIDE5OTkpCiAtIEVyaWsgSmFjb2JzZW4gZm91bmQgYSB3aWR0aCBidWcgaW4gdGhlIG1wcmludGYoKSBmdW5jdGlvbi4gIEkgY29ycmVjdGVkIGl0CiAgIG5vdy4KCiAoNCBKYW4gMTk5OSkKIC0gQXMgSm9obiBWLiBDaG93IHBvaW50ZWQgb3V0IHRvIG1lLCBjdXJsIGFjY2VwdGVkIHZlcnkgbGltaXRlZCBVUkwgc2l6ZXMuIEl0CiAgIHNob3VsZCBub3cgYWNjZXB0IHBhdGggcGFydHMgdGhhdCBhcmUgdXAgdG8gYXQgbGVhc3QgNDA5NiBieXRlcy4KCiAtIFNvbWVob3cgSSBzY3Jld2VkIHVwIHdoZW4gYXBwbHlpbmcgdGhlIEFJWCBmaXggZnJvbSBHaWxiZXJ0IFJhbWlyZXosIHNvCiAgIEkgcmVkaWQgdGhhdCBub3cuCgpWZXJzaW9uIDUuM2EgKHdpbjMyIG9ubHkpCgogVHJveSBFbmdlbAogLSBDb3JyZWN0ZWQgYSB3aW4zMiBidWcgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnQuCgpWZXJzaW9uIDUuMwoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDIxIERlYyAxOTk4KQogLSBJIGhhdmUgaW1wbGVtZW50ZWQgdGhlICJxdW90ZSIgZnVuY3Rpb24gb2YgRlRQIGNsaWVudHMuIEl0IGFsbG93cyB5b3UgdG8KICAgc2VuZCBhcmJpdHJhcnkgY29tbWFuZHMgdG8gdGhlIHJlbW90ZSBGVFAgc2VydmVyLiBJIGNob3NlIHRoZSAtUS8tLXF1b3RlCiAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCgogICBZb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBxdW90ZWQgc3RyaW5nLCBhbmQgY3VybCB3aWxsIGFwcGx5IHRoZW0gaW4KICAgb3JkZXIuICBUaGlzIGlzIHdoYXQgSSB1c2UgZm9yIG15IE1WUyB1cGxvYWQ6CgogIGN1cmwgLUIgLS1jcmxmIC1RICJzaXRlIGxyZWNsPTgwIiAtUSAic2l0ZSBibGs9ODAwMCIgLVQgZmlsZSBmdHA6Ly9vczM5MC90ZXN0CgogICBDdXJsIHdpbGwgc2VuZCB0aGUgdHdvIHF1b3RlZCAic2l0ZSIgY29tbWFuZHMgaW4gdGhlIHByb3BlciBvcmRlci4KCiAtIE1hZGUgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBSVguCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMTggRGVjIDE5OTgpCiAtIEJyb3VnaHQgYW4gTVZTIHBhdGNoOiAtMy8tLW12cywgZm9yIGZ0cCB1cGxvYWQgdG8gdGhlIE1WUyBmdHAgc2VydmVyLgoKIFRyb3kgRW5nZWwgKDE3IERlYyAxOTk4KQogLSBCcm91Z2h0IGEgY29ycmVjdGlvbiB0aGF0IGZpeGVzIHRoZSB3aW4zMiBjdXJsIGJ1Zy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQSBidWcsIHBvaW50ZWQgb3V0IHRvIG1lIGJ5IERyIEguIFQuIExldW5nLCBjYXVzZWQgY3VybCB0byBjcmFzaCBvbiB0aGUgLUEKICAgZmxhZyBvbiBjZXJ0YWluIHN5c3RlbXMuIEFjdHVhbGx5LCBhbGwgc3lzdGVtcyBzaG91bGQndmUhCgogLSBBZGRlZCBhIGZldyBkZWZpbmVzIHRvIG1ha2UgZGlyZWN0b3JpZXMvZmlsZSBuYW1lcyBnZXQgYnVpbGQgbmljZXIgKHdpdGggXwogICBpbnN0ZWFkIG9mIC4gYW5kIFwgaW5zdGVhZCBvZiAvIGluIHdpbjMyKS4KCiAtIHN0ZXZlIDxmaXNrIGF0IHBvbGFyLmJvd2RvaW4uZWR1PiByZXBvcnRlZCBhIHdlaXJkIGJ1ZyB0aGF0IG9jY3VyZWQgaWYgdGhlCiAgIGZ0cCBzZXJ2ZXIgcmVzcG9uc2UgbGluZSBoYWQgYSBwYXJlbnRoZXNpcyBvbiB0aGUgbGluZSBiZWZvcmUgdGhlIChzaXplKQogICBpbmZvLiBJIGhvcGUgaXQgd29ya3MgYmV0dGVyIG5vdyEKClZlcnNpb24gNS4yLjEKCiBTdGV2ZW4gRy4gSm9obnNvbiAoRGVjIDE0LCAxOTk4KQogLSBCcm91Z2h0IGEgZml4IHRoYXQgY29ycmVjdGVkIGEgY3Jhc2ggaW4gNS4yIGR1ZSB0byBiYWQgdHJlYXRtZW50IG9mIHRoZQogICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgpWZXJzaW9uIDUuMgoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDE0LCAxOTk4KQogLSBSZXdyb3RlIHRoZSBta2hlbHAgc2NyaXB0IGFuZCBub3csIHRoZSBta2hlbHAucGwgc2NyaXB0IGdlbmVyYXRlcyB0aGUKICAgaHVnZWhlbHAuYyBmaWxlIGZyb20gdGhlIFJFQURNRSAqYW5kKiB0aGUgbWFuIHBhZ2UgZmlsZSBjdXJsLjEuIEJ5IHVzaW5nCiAgIGJvdGggZmlsZXMsIEkgbm8gbG9uZ2VyIG5lZWQgdG8gaGF2ZSBkb3VibGUgaW5mb3JtYXRpb24gaW4gYm90aCB0aGUgbWFuCiAgIHBhZ2UgYW5kIHRoZSBSRUFETUUgYXMgd2VsbC4gU28sIHdpbjMyLXVzZXJzIHdpbGwgb25seSBoYXZlIHRoZSBodWdlaGVscC5jCiAgIGZpbGUgZm9yIGFsbCBpbmZvLCBidXQgdGhlbiwgdGhleSBkb3dubG9hZCB0aGUgcGxhaW4gYmluYXJ5IG1vc3QgdGltZXMKICAgYW55d2F5LgoKIC0gZ2NjMi44LjEgd2l0aCB0aGUgLVdhbGwgZmxhZyBjb21wbGFpbnRzIGEgbG90IG9uIHN1YnNjcmlwdCBoYXMgdHlwZSBgY2hhcicKICAgaWYgSSBkb24ndCBleHBsaWNpdGx5IHR5cGVjYXN0IHRoZSBhcmd1bWVudCB0byBpc2RpZ2l0KCkgb3IgaXNzcGFjZSgpIHRvCiAgIGludC4gU28gSSBkaWQgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGF0IHRvby4KCiAtIEFkZGVkIGNoZWNrcyBmb3IgJ2xvbmcgZG91YmxlJyBhbmQgJ2xvbmcgbG9uZycgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEkKICAgbmVlZCB0aG9zZSBmb3IgdGhlIG1wcmludGYuYyBzb3VyY2UgdG8gY29tcGlsZSB3ZWxsIG9uIG5vbiBsb25nIGxvbmcKICAgY29tZm9ybWluZyBzeXN0ZW1zIQoKVmVyc2lvbiA1LjEgKG5vdCBwdWJsaWNseSByZWxlYXNlZCkKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxMCwgMTk5OCkKIC0gSSBnb3QgYSByZXF1ZXN0IGZvciBhIHByZS1jb21waWxlZCBOVCBBbHBoYSB2ZXJzaW9uLiBBbnlvbmU/CgogLSBBZGRlZCBMeW54L0NFUk4gd3d3IGxpYiBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdXBwb3J0LiBUaGF0IG1lYW5zIGN1cmwKICAgbm93IHJlYWRzIGFuZCB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKCglIVFRQX1BST1hZLCBIVFRQU19QUk9YWSwgRlRQX1BST1hZLCBHT1BIRVJfUFJPWFkKCiAgIFRoZXkgc2hvdWxkIGJlIHNldCBmb3IgcHJvdG9jb2wtc3BlY2lmaWMgcHJveGllcy4gR2VuZXJhbCBwcm94eSBzaG91bGQgYmUKICAgc2V0IHdpdGgKCQoJQUxMX1BST1hZCgogICBBbmQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBob3N0IG5hbWVzIHRoYXQgc2hvdWxkbid0IGdvIHRocm91Z2ggYW55CiAgIHByb3h5IGlzIHNldCBpbiAob25seSBhbiBhc3RlcmlzaywgJyonIG1hdGNoZXMgYWxsIGhvc3RzKS4KCglOT19QUk9YWQoKICAgVGhlIHVzYWdlIG9mIHRoZSAteC8tLXByb3h5IGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogLSBQcm94eSBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRoIGEgcHJvY290b2w6Ly8gcHJlZml4LgoKIC0gV3JvdGUgdGhlIGN1cmwuMSBtYW4gcGFnZS4KCiAtIEludHJvZHVjZWQgYSB3aG9sZSBuZXcgZHluYW1pYyBidWZmZXIgc3lzdGVtIGZvciBhbGwgc3ByaW50Zigpcy4gSXQgaXMKICAgYmFzZWQgb24gdGhlICpwcmludGYoKSBwYWNrYWdlIGJ5IHlvdXJzIHRydWx5IGFuZCBCam9ybiBSZWVzZS4gSG9wZWZ1bGx5LAogICB0aGVyZSBhcmVuJ3QgdGhhdCBtYW55IGJ1ZmZlciBvdmVyZmxvdyByaXNrcyBsZWZ0IG5vdy4KCiAtIEFoLCBJIHNob3VsZCBtZW50aW9uIEkndmUgY29tcGlsZWQgYW5kIGJ1aWx0IGN1cmwgc3VjY2Vzc2Z1bGx5IHVuZGVyCiAgIHNvbGFyaXMgMi42IHdpdGggZ2NjIG5vdywgZ2NjIDIuNy4yIHdvbid0IHdvcmsgYnV0IDIuOC4xIGRpZCBvay4KCiBPcmVuIFRpcm9zaCAoRGVjIDMsIDE5OTgpCiAtIEJyb3VnaHQgdHdvIC5zcGVjIGZpbGVzLCB0byB1c2Ugd2hlbiBjcmVhdGluZyAoTGludXgpIFJlZGhhdCBzdHlsZSBSUE0KICAgcGFja2FnZXMuIFRoZXkncmUgbmFtZWQgY3VybC5zcGVjIGFuZCBjdXJsLXNzbC5zcGVjLgoKIFRyb3kgRW5nZWwKIC0gU3VwcGxpZWQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZm9yIGVhc3kgY29tcGlsaW5nIHdpdGggVkMrKyB1bmRlciBXaW4zMi4KClZlcnNpb24gNS4wCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMSwgMTk5OCkKIC0gTm90IGEgc2luZ2xlIGJ1ZyByZXBvcnQgaW4gYWdlcy4KIC0gQ29ycmVjdGVkIGdldHBhc3MuYyBhbmQgbWFpbi5jIHRvIGNvbXBpbGUgd2FybmluZyBhbmQgZXJyb3IgZnJlZSB3aXRoIHRoZQogICBXaW4zMiBWQysrIGNyYXAuCgpWZXJzaW9uIDUuMCBiZXRhIDI0CgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMjAsIDE5OTgpCgogSE9XIFRPIEJVSUxEIEEgUkVMRUFTRSBBUkNISVZFOgoKICogUHJlLXJlcXVpc2l0ZSBzb2Z0d2FyZToKICAgV2hhdAkJICAgICBUbyBidWlsZCB3aGF0ICAgICAgICAgICAgIFJlYWRzIGRhdGEgZnJvbQogICA9PT09ICAgICAgICAgICAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgID09PT09PT09PT09PT09PQogICBHTlUgYXV0b21ha2UgICAgICBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCAgIGNvbmZpZ3VyZS5pbgogICAgIEdOVSBtYWtlKDEpICAgICAgLSAiIC0KICAgICBHTlUgZ2NjKDEpICAgICAgIC0gIiAtCiAgIEdOVSBhdXRvY29uZiAgICAgIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgY29uZmlndXJlLmluCiAgIEdOVSBhdXRvaGVhZGVyKDIpIGNvbmZpZy5oLmluCSAgICAgICBjb25maWd1cmUuaW4sIGFjY29uZmlnLmgKCiAqIE1ha2Ugc3VyZSBhbGwgZmlsZXMgdGhhdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgYXJjaGl2ZSBhcmUgcHV0IGluIEZJTEVTLgoKICogUnVuICcuL21ha2V0Z3onIGFuZCBlbnRlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbmV3IHRvIGJlY29tZSBhcmNoaXZlLgoKICAgbWFrZXRneiBkb2VzOgoKICAgLSBFbnRlcnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgaW4gdXJsLmguCiAgIC0gKElmIHlvdSBkb24ndCBoYXZlIGF1dG9tYWtlLCB0aGlzIHNjcmlwdCB3aWxsIHdhcm4gYWJvdXQgdGhhdCwgYnV0IHVubGVzcwogICAgIHlvdSBoYXZlIGNoYW5nZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzLCB0aGF0IGlzIG5vdGhpbmcgdG8gY2FyZSBhYm91dC4pCiAgICAgSWYgeW91IGhhdmUgaXQsIGl0J2xsIHJ1biBpdC4KICAgLSBJZiB5b3UgaGF2ZSBhdXRvY29uZiwgdGhlIGNvbmZpZ3VyZS5pbiB3aWxsIGJlIGVkaXRlZCB0byBnZXQgdGhlIG5ld2x5CiAgICAgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBhbmQgYXV0b2NvbmYgd2lsbCBiZSBydW4uCiAgIC0gQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgY3VybC08dmVyc2lvbj4uIChBY3R1YWxseSwgaXQgdXNlcyB0aGUgYmFzZQogICAgIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVwIHRvIHRoZSBmaXJzdCAnLScuKQogICAtIENvcGllcyBhbGwgZmlsZXMgbWVudGlvbmVkIGluIEZJTEVTIHRvIHRoZSBuZXcgZGlyZWN0b3J5LiBTYXZpbmcKICAgICBwZXJtaXNzaW9ucyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KICAgLSBVc2VzIHRhciB0byBjcmVhdGUgYW4gYXJjaGl2ZSBvZiBpdCBhbGwsIG5hbWVkIGN1cmwtPHZlcnNpb24+LnRhci5negogICAtIGd6aXBzIHRoZSBhcmNoaXZlCiAgIC0gUmVtb3ZlcyB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50cy4KCiAqIFdoZW4gZG9uZSwgeW91IGhhdmUgYW4gYXJjaGl2ZSBzdG9yZWQgaW4geW91ciBkaXJlY3RvcnkgbmFtZWQKICAgY3VybC08dmVyc2lvbj4udGFyLmd6LgoKICAgRG9uZSEKCiAgICgxKSBUaGV5J3JlIHJlcXVpcmVkIHRvIG1ha2UgYXV0b21ha2UgcnVuIHByb3Blcmx5LgogICAoMikgSXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBHTlUgYXV0b2NvbmYgYXJjaGl2ZS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxOCwgMTk5OCkKIC0gSSBjaGFuZ2VkIHRoZSBUQUctc3lzdGVtLiBJZiB5b3UgZXZlciB1c2VkIHVybGdldCgpIGZyb20gdGhpcyBwYWNrYWdlIGluCiAgIGFub3RoZXIgcHJvZHVjdCwgeW91IG5lZWQgdG8gcmVjb21waWxlIHdpdGggdGhlIG5ldyBoZWFkZXJzLiBJIGRpZCB0aGlzCiAgIG5ldyBzdHVmZiB0byBiZXR0ZXIgZGVhbCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgYW5kIHN5c3RlbSB3aXRoIGRpZmZlcmVudAogICB2YXJpYWJsZSBzaXplcy4gSSB0aGluayBpdCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHBvcnRhYmxlLiBUaGlzIHByb3ZlcwogICB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBwcm9ibGVtYXRpYyBJUklYIGNvbXBpbGVyIQogLSBXaW4zMiBjb21waWxlZCB3aXRoIGEgc2lsbHkgZXJyb3IuIENvcnJlY3RlZCBub3cuCiAtIEJyaWFuIENoYXBsaW4gcmVwb3J0ZWQgeWV0IGFub3RoZXIgcHJvYmxlbSBpbgogICBtdWx0aWxpbmUgRlRQIHJlc3BvbnNlcy4gSSd2ZSB0cmllZCB0byBjb3JyZWN0IGl0LiBJIG1haWxlZCBoaW0gYSBuZXcKICAgdmVyc2lvbiBhbmQgSSBob3BlIGhlIGdldHMgYmFjayBzb29uIHdpdGggcG9zaXRpdmUgZmVlZGJhY2shCiAtIEltcHJvdmVkIHRoZSAnbWFrZXRneicgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0cmVlIHdoaWNoIGl0IG1ha2VzCiAgIGFuIGFyY2hpdmUgZnJvbSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyByZW5hbWluZyBvZiB0aGUgY3VycmVudCBvbmUuCiAtIE1haWxpbmcgbGlzdCBvcGVuZWQgKHNlZSBSRUFETUUpLgogLSBNYWRlIC12IG1vcmUgdmVyYm9zZSBvbiB0aGUgUEFTViBzZWN0aW9uIG9mIGZ0cCB0cmFuc2ZlcnMuIE5vdyBpdCB0ZWxscwogICBob3N0IG5hbWUgYW5kIElQIG9mIHRoZSBuZXcgaG9zdCAoYW5kIHBvcnQgbnVtYmVyKS4gSSBhbHNvIGFkZGVkIGEgc2VjdGlvbgogICBhYm91dCBQT1JUIHZzIFBBU1YgaW4gdGhlIFJFQURNRS4KClZlcnNpb24gNS4wIGJldGEgMjEKCiBBbmd1cyBNYWNrYXkgKE5vdiAxNSwgMTk5OCkKIC0gSW50cm9kdWNlZCBhdXRvbWFrZSBzdHVmZi4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMywgMTk5OCkKIC0gSnVzdCBtYWRlIGEgc3VjY2Vzc2Z1bCBHRVQgb2YgYSBkb2N1bWVudCBmcm9tIGFuIFNTTC1zZXJ2ZXIgdXNpbmcgbXkgb3duCiAgIHByaXZhdGUgY2VydGlmaWNhdGUgZm9yIGF1dGhlbnRpY2F0aW9uISBUaGUgY2VydGlmaWNhdGUgaGFzIHRvIGJlIGluIFBFTQogICBmb3JtYXQuIFlvdSBkbyB0aGF0IHRoZSBlYXNpZXN0IHdheSAoYWx0aG91Z2ggbm90ICp0aGF0KiBlYXN5KSBieQogICBkb3dubG9hZGluZyB0aGUgU1NMeWVheSBQS0NTIzEyLXBhdGNoIGJ5IERyIFN0ZXBoZW4gTi4gSGVuc29uIGZyb20gaGlzIHNpdGUKICAgYXQ6IGh0dHA6Ly93d3cuZHJoLWNvbnN1bHRhbmN5LmRlbW9uLmNvLnVrLy4gVXNpbmcgaGlzIHRvb2wsIHlvdSBjYW4KICAgY29udmVydCBhbnkgbW9kZXJuIE5ldHNjYXBlIG9yIChldmVuKSBNU0lFIGNlcnRpZmljYXRlIHRvIFBFTS1mb3JtYXQuICBVc2UKICAgaXQgd2l0aCAnY3VybCAtRSA8Y2VydGlmaWNhdGU6cGFzc3dvcmQ+IGh0dHBzOi8vc2l0ZS5jb20nLiAgSWYgdGhpcyBpc24ndCBhCiAgIGNvb2wgZmVhdHVyZSwgdGhlbiBJIGRvbid0IGtub3cgd2hhdCBjb29sIGZlYXR1cmVzIGxvb2sgbGlrZSEgOy0pCiAtIFdvcmtpbmcgc2xvd2x5IG9uIHRlbG5ldCBjb25uZWN0aW9ucy4gI2RlZmluZSBUUllfVEVMTkVUIHRvIHRyeSBpdCBvdXQuCiAgIChjdXJsIC11IHVzZXI6cGFzc3dkICJ0ZWxuZXQ6Ly9ob3N0LmNvbS9jYXQgLmxvZ2luIiBpcyBvbmUgZXhhbXBsZSkgSSBkbwogICBoYXZlIHByb2JsZW0gdG8gZGVmaW5lIGhvdyBpdCBzaG91bGQgd29yay4gVGhlIHByaW1lIHB1cnBvc2UgZm9yIHRoaXMgbXVzdAogICBiZSB0byBnZXQgKDhiaXQgY2xlYW4pIGZpbGVzIHZpYSB0ZWxuZXQsIGFuZCBpdCByZWFsbHkgaXNuJ3QgdGhhdCBlYXN5IHRvCiAgIGdldCBmaWxlcyB0aGlzIHdheS4gU3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggXG4gYmVpbmcgY29udmVydGVkIHRvIFxyXG4uCgogQW5ndXMgTWFja2F5IChOb3YgMTIsIDE5OTgpCiAtIENvcnJlY3RlZCBhbm90aGVyIGJ1ZyBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIgbmFtZSBwYXJzZXIuCiAtIE1vZGlmaWVkIGdldHBhc3MuYyAoTk9URTogc2VlIHRoZSBzcGVjaWFsIGxpY2Vuc2luZyBpbiB0aGUgdG9wIG9mIHRoYXQKICAgc291cmNlIGZpbGUpLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEyLCAxOTk4KQogLSBXZSBtYXkgaGF2ZSByZW1vdmVkIHRoZSBzaWxseSB3YXJuaW5ncyBmcm9tIHVybC5jIHdoZW4gY29tcGlsZWQgdW5kZXIgSVJJWC4KICAgVGhhbmtzIGFnYWluIHRvIEJqb3JuIFJlZXNlIGFuZCBNYXJ0aW4gU3RhYWVsLgogLSBXcm90ZSBmb3JtZmluZC5wbCB3aGljaCBpcyBhIG5ldyBwZXJsIHNjcmlwdCBpbnRlbmRlZCB0byBoZWxwIHlvdSBmaW5kIG91dAogICBob3cgYSBGT1JNIHN1Ym1pc3Npb24gc2hvdWxkIGJlIGRvbmUuIFRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGdldAogICByZWFsbHkgZ29vZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMSwgMTk5OCkKIC0gTWFkZSB0aGUgSFRUUCBoZWFkZXItY2hlY2tlciBhY2NlcHQgd2hpdGUgc3BhY2VzIGJlZm9yZSB0aGUgSFRUUC8xLj8gbGluZS4KICAgQXBwZWFyYW50bHkgc29tZSBwcm94aWVzL3NpdGVzIGFkZCBzdWNoIGF0IHRpbWVzIChteSB0ZXN0IHByb3h5IGRpZCB3aGVuIEkKICAgZG93bmxvYWRlZCBhIGdvcGhlciBwYWdlIHdpdGggaXQpIQogLSBNb3ZlZCB0aGUgZm9ybWVyIC1oIHRvIC1NIGFuZCBtYWRlIC1oIHNob3cgdGhlIHNob3J0IGhlbHAgdGV4dCBpbnN0ZWFkLiBJCiAgIGhhZCB0byBlbmFibGUgYSBmb3JjZWQgaGVscCB0ZXh0IG9wdGlvbi4gTm93IGFuIGV2ZW4gc2hvcnRlciBoZWxwIHRleHQgd2lsbAogICBiZSBwcmVzZW50ZWQgd2hlbiBhbiB1bmtub3duIG9wdGlvbiBhbmQgc2ltaWxhciwgaXMgdXNlZC4KIC0gc3RkY2hlYWRlcnMuaCBkaWRuJ3Qgd29yayB3aXRoIElSSVggNi40IG5hdGl2ZSBjYyBjb21waWxlci4gSSBob3BlIG15CiAgIGNoYW5nZXMgZG9uJ3QgbWFrZSBvdGhlciB2ZXJzaW9ucyBnbyBudXRzIGluc3RlYWQuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTAsIDE5OTgpCiAtIEFkZGVkIGEgd2VpcmQgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIHRoZSBzaWxseSBBSVgKICAgd2FybmluZ3MgYWJvdXQgbXkgI2RlZmluZSBzdHJjYXNlY21wKCkgc3R1ZmYuIEkgZG8gdGhhdCBkZWZpbmUgdG8gcHJldmVudAogICBtZSBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHRvIGFjY2lkZW50YWx5IHVzZSB0aGF0IGZ1bmN0aW9uIG5hbWUgaW5zdGVhZAogICBvZiBzdHJlcXVhbCgpLi4uCiAtIEkgYnVnZml4ZWQgQW5ndXMncyBnZXRwYXNzLmMgdmVyeSBsaXR0bGUuCiAtIEZpeGVkIHRoZSB2ZXJib3NlIGZsYWcgbmFtZXMgdG8gZ2V0b3B0LXN0eWxlLCBpLmUgJ2N1cmwgLS1sb2MnIHdpbGwgYmUKICAgc3VmZmljaWVudCBpbnN0ZWFkIG9mIC0tbG9jYXRpb24gYXMgImxvYyIgaXMgYSB1bmlxdWUgcHJlZml4LiBBbHNvLCBhbnl0aGluZwogICBhZnRlciBhICctLScgaXMgdHJlYXRlZCBhcyBhbiBVUkwuIFNvIGlmIHlvdSBkbyBoYXZlIGEgaG9zdCB3aXRoIGEgd2VlZWlyZAogICBuYW1lIHlvdSBjYW4gZG8gJ2N1cmwgLS0gLWhvc3QuY29tJy4KIC0gQW5vdGhlciBnZXRvcHQtYWRqdXN0OyBjdXJsIG5vdyBhY2NlcHRzIGZsYWdzIGFmdGVyIHRoZSBVUkwgb24gdGhlIGNvbW1hbmQKICAgbGluZS4gJ2N1cmwgd3d3LmZvby5jb20gLU8nIGlzIHBlcmZlY3RseSB2YWxpZC4KIC0gQ29ycmVjdGVkIHRoZSAuY3VybHJjIHBhcnNlciBzbyB0aGF0IHN0cnRvaygpIGlzIG5vIGxvbmdlciB1c2VkIGFuZCBJCiAgIGJlbGlldmUgaXQgd29ya3MgYmV0dGVyLiBFdmVuIFVSTHMgY2FuIGJlIHNwZWNpZmllZCBpbiBpdCBub3cuCgogQW5ndXMgTWFja2F5IChOb3YgOSwgMTk5OCkKIC0gUmVwbGFjZWQgZ2V0cGFzcy5jIHdpdGggYSBuZXdseSB3cml0dGVuIG9uZSwgbm90IHVuZGVyIEdQTCBsaWNlbnNlCiAtIENoYW5nZWQgT1MgdG8gYSAjZGVmaW5lIGluIGNvbmZpZy5oIGluc3RlYWQgb2YgY29tcGlsZXIgZmxhZwogLSBNYWtlZmlsZSBub3cgdXNlcyAtREhBVkVfQ09ORklHX0gKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiA5LCAxOTk4KQogLSBPaywgSSBleHBhbmRlZCB0aGUgdGd6LXRhcmdldCB0byB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5nIG9uIGVhY2ggb2NjYXRpb24KICAgSSBidWlsZCBhIHJlbGVhc2UgYXJjaGl2ZSEKIC0gSSByZWFjdGVkIG9uIEFuZ3VzIE1hY2theSdzIGluaXRpYXRpdmUgYW5kIHJlbWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNlciB0bwogICBiZSBtb3JlIGdldG9wdCBjb21wbGlhbnQuIEN1cmwgbm93IHN1cHBvcnRzICJtZXJnZWQiIGZsYWdzIGFzIGluIAoJY3VybCAtbHN2IGZ0cC5zaXRlLmNvbQogICBEbyBub3RlIHRoYXQgSSBoYWQgdG8gbW92ZSB0aHJlZSBzaG9ydC1uYW1lcyBvZiB0aGUgb3B0aW9ucy4gUGFyYW1ldGVycwogICB0aGF0IG5lZWRzIGFuIGFkZGl0aW9uYWwgc3RyaW5nIHN1Y2ggYXMgLXggbXVzdCBiZSBzdGFuZC1hbG9uZSBvciB0aGUKICAgbGFzdCBpbiBhIG1lcmdlZCBzZXF1ZW5jZToKCWN1cmwgLWxzeCBteS1wcm94eSBmdHAuc2l0ZS5jb20KICAgaXMgb2ssIGJ1dCB1c2luZyB0aGUgZmxhZ3MgaW4gYSBkaWZmZXJlbnQgb3JkZXIgbGlrZSAnLWx4cycgd291bGQgY2F1c2UKICAgdW5leHBlY3RlZCByZXN1bHRzIChhcyB0aGUgJ3MnIG9wdGlvbiB3b3VsZCBiZSBza2lwcGVkKS4KIC0gSSd2ZSBjaGFuZ2VkIHRoZSBoZWFkZXJzIGluIGFsbCBmaWxlcyB0aGF0IGFyZSBzdWJqZWN0IHRvIHRoZSBNb3pQTAogICBsaWNlbnNlLCBhcyB0aGV5IGFyZSBzdXBwb3NlZCB0byBsb29rIGxpa2Ugd2hlbiBjb25mb3JtaW5nLgogLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IG1ha2UgdGhlIGNvbmZpZy5oLiBUaGUgZm9ybWVyIGNvbmZpZy5oIGlzIG5vdwogICBzZXR1cC5oLgogLSBUaGUgUkVTT1VSQ0VTIGFuZCBUT0RPIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KCiBBbmd1cyBNYWNrYXkgKE5vdiA1LCAxOTk4KQogLSBGaXhlZCBnZXRwYXNzLmMgYW5kIHZhcmlvdXMgY29uZmlndXJlIHN0dWZmCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMywgMTk5OCkKIC0gVXNlIC1ILy0taGVhZGVyIGZvciBjdXN0b20gSFRUUC1oZWFkZXJzLiBMZXRzIHlvdSBwYXNzIG9uIHlvdXIgb3duCiAgIHNwZWNpZmllZCBoZWFkZXJzIHRvIHRoZSByZW1vdGUgc2VydmVyLiBJIHdvdWxkbid0IHJlY29tbWVuZCB0cnlpbmcgdG8gdXNlCiAgIGEgaGVhZGVyIHdpdGggYSBkZWZpbmVkIHVzYWdlIGFjY29yZGluZyB0byBzdGFuZGFyZHMuIFVzZSB0aGlzIGZsYWcgb25jZQogICBmb3IgZXZlcnkgY3VzdG9tIGhlYWRlciB5b3Ugd2FudCB0byBhZGQuCiAtIFVzZSAtQi8tLWZ0cC1hc2NpaSB0byBmb3JjZSBmdHAgdG8gdXNlIEFTQ0lJIG1vZGUgd2hlbiB0cmFuc2ZlcmluZyBmaWxlcy4KIC0gQ29ycmVjdGVkIHRoZSAnZ2V0bGlua3MucGwnIHNjcmlwdCwgSSBhY2NpZGVudGFsbHkgbGVmdCBteSBzaWxseSBwcm94eQogICB1c2FnZSBpbiB0aGVyZSEgU2luY2UgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgLmN1cmxyYyBmaWxlLCBpdCBpcyBlYXNpZXIgdG8KICAgd3JpdGUgc2NyaXB0cyB0aGF0IHVzZSBjdXJsIHNpbmNlIHByb3hpZXMgYW5kIHN0dWZmIHNob3VsZCBiZSBpbiB0aGUKICAgLmN1cmxyYyBmaWxlIGFueXdheS4KIC0gSW50cm9kdWNpbmcgdGhlIG5ldyAtRiBmbGFnIGZvciBIVFRQIFBPU1QuIEl0IHN1cHBvcnRzIG11bHRpcGFydC9mb3JtLWRhdGEKICAgd2hpY2ggbWVhbnMgaXQgaXMgZ29ubmEgYmUgcG9zc2libGUgdG8gdXBsb2FkIGZpbGVzIGV0YyB0aHJvdWdoIEhUVFAgUE9TVC4KICAgU2hpcmF6IEthbmdhIGFza2VkIGZvciB0aGUgZmVhdHVyZSBhbmQgbXkgYnJvdGhlciwKICAgQmr2cm4gU3RlbmJlcmcgaGVscGVkIG1lIGRlc2lnbiB0aGUgdXNlcgogICBpbnRlcmZhY2UgZm9yIHRoaXMgYmVhc3QuICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgcXVpdGUgc29tZSBkb2NzLAogICBzaW5jZSBpdCBoYXMgdHVybmVkIG91dCBub3Qgb25seSBxdWl0ZSBjYXBhYmxlLCBidXQgYWxzbyBjb21wbGljYXRlZCEgOi0pCiAtIEEgbm90ZSBoZXJlLCBzaW5jZSBJJ3ZlIHJlY2VpdmVkIG1haWwgYWJvdXQgaXQuIFNTTGVheSB2ZXJzaW9ucyBwcmlvciB0bwogICAwLjggd2lsbCAqbm90KiB3b3JrIHdpdGggY3VybCEKIC0gV2lsIExhbmdmb3JkIHJlcG9ydGVkIGEgYnVnIHRoYXQgb2NjdXJyZWQgc2luY2UgY3VybAogICBkaWQgbm90IHByb3Blcmx5IHVzZSBDUkxGIHdoZW4gaXNzdWluZyBmdHAgY29tbWFuZHMuIEkgZml4ZWQgaXQuCiAtIFJlYXJyYW5nZWQgdGhlIG9yZGVyIGNvbmZpZyBmaWxlcyBhcmUgcmVhZC4gLmN1cmxyYyBpcyBub3cgKmFsd2F5cyogcmVhZAogICBmaXJzdCBhbmQgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgZmxhZ3MuIC1LIGNvbmZpZyBmaWxlcyB0aGVuIGFjdCBhcwogICBhZGRpdGlvbmFsIGNvbmZpZyBpdGVtcy4KIC0gVXNlIC1xIEFTIFRIRSBGSVJTVCBPUFRJT04gc3BlY2lmaWVkIHRvIHByZXZlbnQgLmN1cmxyYyBmcm9tIGJlaW5nIHJlYWQuCiAtIFlvdSBjYW4gbm93IGRpc2FibGUgYSBwcm94eSBieSB1c2luZyAteCAiIi4gVXNlZnVsIGlmIHRoZSAuY3VybHJjIGZpbGUKICAgc3BlY2lmaWVzIGEgcHJveHkgYW5kIHlvdSB3YW5uYSBmZXRjaCBzb21ldGhpbmcgd2l0aG91dCBnb2luZyB0aHJvdWdoCiAgIHRoYXQuCiAtIEknbSB0aGlua2luZyBvZiBkcm9wcGluZyB0aGUgLXAgc3VwcG9ydC4gSXRzIHJlYWxseSBub3QgdXNlZnVsIHNpbmNlIHBvcnRzCiAgIGNvdWxkIChhbmQgc2hvdWxkPykgYmUgc3BlY2lmaWVkIGFzIDo8cG9ydD4gYXBwZW5kZWQgb24gdGhlIGhvc3QgbmFtZQogICBpbnN0ZWFkLCBib3RoIGluIFVSTHMgYW5kIHRvIHByb3h5IGhvc3QgbmFtZXMuCiAtIE1hcnRpbiBTdGFhZWwgcmVwb3J0cyBjdXJsIC1MIGJ1Z3MgdW5kZXIgV2luZG93cyBOVAogICAodGVzdCB3aXRoIFVSTCBodHRwOi8vY29tZS50by9zY3NkZSkuIFRoaXMgYnVnIGlzIG5vdCBwcmVzZW50IGluIHRoaXMKICAgdmVyc2lvbiBhbnltb3JlLgogLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgd2VpcmQgRlRQIFVSTCB0eXBlPSB0aGluZy4gWW91IGNhbiBkb3dubG9hZCBhIGZpbGUKICAgdXNpbmcgQVNDSUkgdHJhbnNmZXIgYnkgYXBwZW5kaW5nICI7dHlwZT1BIiB0byB0aGUgcmlnaHQgb2YgaXQuIE90aGVyCiAgIGF2YWlsYWJsZSB0eXBlcyBhcmUgdHlwZT1EIGZvciBkaXItbGlzdCAoTkxTVCkgYW5kIHR5cGU9SSBmb3IgYmluYXJ5CiAgIHRyYW5zZmVyLiBJIGNhbid0IHNheSBJJ3ZlIGV2ZXIgc2VlbiBhbnlvbmUgdXNlIHRoaXMga2luZCBvZiBVUkwgdGhvdWdoIQogICA6LSkKIC0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIGJ1ZyBpbiBteSBnZXRlbnYoIkhPTUUiKQogICB1c2FnZSBmb3Igd2luMzIgc3lzdGVtcy4gSSBpbnRyb2R1Y2UgZ2V0ZW52LmMgdG8gYmV0dGVyIGNvcGUgd2l0aAogICB0aGlzLiBNciBFbmdlbCBoZWxwcyBtZSB3aXRoIHRoZSBkZXRhaWxzIGFyb3VuZCB0aGF0Li4uCiAtIEEgbGl0dGxlIG5vdGUgdG8gbXlzZWxmIGFuZCBvdGhlcnMsIEkgc2hvdWxkIG1ha2UgdGhlIHdpbjMyLWJpbmFyeSBidWlsdAogICB3aXRoIFNTTCBzdXBwb3J0Li4uCiAtIFJ5YW4gTmVsc29uIHNlbnQgbWUgY29tbWVudHMgYWJvdXQgYnVpbGRpbmcgY3VybAogICB3aXRoIFNTTCB1bmRlciBGcmVlQlNELiBTZWUgdGhlIE1ha2VmaWxlIGZvciBkZXRhaWxzLiBVc2luZyB0aGUgY29uZmlndXJlCiAgIHNjcmlwdCwgaXQgc2hvdWxkIHdvcmsgYmV0dGVyIGFuZCBhdXRvbWF0aWNhbGx5IG5vdy4uLgogLSBDbGVhbmVkIHVwIGluIHRoZSBwb3J0IG51bWJlciBtZXNzIGluIHRoZSBzb3VyY2UuIE5vIGxvbmdlciBzdG9yZXMgYW5kIHVzZXMKICAgcHJveHkgcG9ydCBudW1iZXIgc2VwYXJhdGUgZnJvbSBub3JtYWwgcG9ydCBudW1iZXIuCiAtICdjb25maWd1cmUnIHNjcmlwdCB3b3JraW5nLiBDb25maXJtZWQgY29tcGlsZXMgb246CiAgICBIb3N0ICAgICAgICAgU1NMICBDb21waWxlcgogICAgU3VuT1MgNS41ICAgIG5vICAgZ2NjCiAgICBTdW5PUyA1LjUuMSAgeWVzICBnY2MKICAgIFN1bk9TIDUuNiAgICBubyAgIGNjICAod2l0aCBnY2MsIGl0IGhhcyB0aGUgImdjYyBpbmNsdWRlIGZpbGVzIiBwcm9ibGVtKQogICAgU3VuT1MgNC4xLjMgIG5vICAgZ2NjICh3aXRob3V0IEFOU0kgQyBoZWFkZXJzKQogICAgU3VuT1MgNC4xLjIgIG5vICAgZ2NjIChuYXRpdmUgY29tcGlsZXIgZmFpbGVkKQogICAgTGludXggMi4wLjE4IG5vICAgZ2NjCiAgICBMaW51eCAyLjAuMzIgeWVzICBnY2MKICAgIExpbnV4IDIuMC4zNSBubyAgIGdjYyAod2l0aCBnbGliYykKICAgIElSSVggNi4yICAgICBubyAgIGdjYyAoY2MgY29tcGlsZXMgZ2VuZXJhdGUgYSBmZXcgd2FybmluZ3MpCiAgICBJUklYIDYuNCAgICAgbm8gICBjYyAgKGdlbmVyYXRlZCB3YXJuaW5ncyB0aG91Z2gpCiAgICBXaW4zMiAgICAgICAgbm8gICBCb3JsYW5kCiAgICBPU0Y0LjAJIG5vICAgPwoKIC0gT29vcHMuIFRoZSA1YmV0YSAoYW5kIDQuMTApIHVuZGVyIHdpbjMyIGZhaWxlZCBpZiB0aGUgSE9NRSB2YXJpYWJsZSB3YXNuJ3QKICAgc2V0LgogLSBXaGVuIHVzaW5nIGEgcHJveHksIGN1cmwgbm93IGd1ZXNzZXMgYW5kIHVzZXMgdGhlIHByb3RvY29sIHBhcnQgaW4gY2FzZXMKICAgbGlrZToKCWN1cmwgLXggcHJveHk6ODAgd3d3LnNpdGUuY29tCiAgIFByb3hpZXMgbm9ybWFsbHkgZ28gbnV0cyB1bmxlc3MgaHR0cDovLyBpcyBwcmVwZW5kZWQgdG8gdGhlIGhvc3QgbmFtZSwgc28KICAgaWYgY3VybCBpcyB1c2VkIGxpa2UgdGhpcywgaXQgZ3Vlc3NlcyBwcm90b2NvbCBhbmQgYXBwZW5kcyB0aGUgcHJvdG9jb2wKICAgc3RyaW5nIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBwcm94eS4gSXQgYWxyZWFkeSBkaWQgdGhpcyB3aGVuIHVzZWQKICAgd2l0aG91dCBwcm94eS4KIC0gQmV0dGVyIHBvcnQgdXNhZ2Ugd2l0aCBTU0wgdGhyb3VnaCBwcm94eSBub3cuIElmIHlvdSBzcGVjaWZpZWQgYSBkaWZmZXJlbnQKICAgaHR0cHMtcG9ydCB3aGVuIGFjY2Vzc2luZyB0aHJvdWdoIGEgcHJveHksIGl0IGRpZG4ndCB1c2UgdGhhdCBudW1iZXIKICAgY29ycmVjdGx5LiBJIGFsc28gcmV3cm90ZSB0aGUgY29kZSB0aGF0IHBhcnNlcyB0aGUgc3R1ZmYgcmVhZCBmcm9tIHRoZQogICBwcm94eSB3aGVuIHlvdSB3YW5uYSBjb25uZWN0IHRocm91Z2ggaXQgd2l0aCBTU0wuCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSB3b3JrIGFyb3VuZCBvbmUgb2YgdGhlIGNvbXBpbGVyCiAgIHdhcm5pbmdzIG9uIElSSVggbmF0aXZlIGNjIGNvbXBpbGVzLgoKVmVyc2lvbiA0LjEwIChPY3QgMjYsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gSm9obiBBLiBCcmlzdG9yIHN1Z2dlc3RlZCBhIGNvbmZpZyBmaWxlIHN3aXRjaCwKICAgYW5kIHNpbmNlIEkndmUgYmVlbiBoYXZpbmcgdGhhdCBpZGVhIGtpbmQgb2YgaW4gdGhlIGJhY2tncm91bmQgZm9yIGEgbG9uZwogICB0aW1lIEkgcmV3cm90ZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZnVuY3Rpb24gYSBsaXR0bGUgYW5kIG5vdyBJIGludHJvZHVjZQogICB0aGUgLUsvLS1jb25maWcgZmxhZy4gSSBhbHNvIG1hZGUgY3VybCAqYWx3YXlzKiAodW5sZXNzIC1LIGlzIHVzZWQpIHRyeSB0bwogICBsb2FkIHRoZSAuY3VybHJjIGZpbGUgZm9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLiBUaGUgc3ludGF4IGZvciB0aGUKICAgY29uZmlnIGZpbGUgaXMgdGhlIHN0YW5kYXJkIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHlsZS4gRGV0YWlscyBpbiAnY3VybAogICAtaCcgb3IgdGhlIFJFQURNRS4KIC0gSSByZW1vdmVkIHRoZSAtayBvcHRpb24uIEtlZXAtYWxpdmUgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIGFueW9uZSB3b3VsZAogICB3YW50IHRvIGVuYWJsZSB3aXRoIGN1cmwgYW55d2F5LgogLSBNYXJ0aW4gU3RhYWVsIGhlbHBlZCBtZSBhZGQgdGhlICdpcml4JyB0YXJnZXQuIE5vdwogICAibWFrZSBpcml4IiBzaG91bGQgYnVpbGQgY3VybCBzdWNjZXNzZnVsbHkgb24gbm9uLWdjYyBTR0kgbWFjaGluZXMuCiAtIFNpbmdsZSBzd2l0Y2hlcyBub3cgdG9nZ2xlIGJlaGF2aW91cnMuIEkuZSBpZiB5b3UgdXNlIC12IC12IHRoZSBzZWNvbmQKICAgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB2ZXJib3NlIG1vZGUgdGhlIGZpcnN0IG9uZSBlbmFibGVkLiBUaGlzIGlzIHNvIHRoYXQKICAgeW91IGNhbiBkaXNhYmxlIGEgZGVmYXVsdCBzZXR0aW5nIGEgLmN1cmxyYyBmaWxlIGVuYWJsZXMgZXRjLgoKVmVyc2lvbiA0LjkgKE9jdCA3LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hcnRpbiBTdGFhZWwgc3VnZ2VzdGVkIGN1cmwgd291bGQgc3VwcG9ydCBjb29raWVzLgogICBJIGFkZGVkIC1iLy0tY29va2llIHRvIGVuYWJsZSBmcmVlLXRleHQgY29va2llIGRhdGEgdG8gYmUgcGFzc2VkLiBUaGVyZSdzCiAgIGFsc28gYSBsaXR0bGUgYmx1cmIgYWJvdXQgZ2VuZXJhbCBjb29raWUgc3R1ZmYgaW4gdGhlIFJFQURNRS9oZWxwIHRleHQuCiAtIGRtaCA8ZG1oIGF0IGpldC5lcz4gc3VnZ2VzdGVkIEhUVFAgcmVzdW1lIGNhcGFiaWxpdGllcy4gQWx0aG91Z2ggeW91IGNvdWxkCiAgIG1hbnVhbGx5IGdldCBjdXJsIHRvIHJlc3VtZSBIVFRQIGRvY3VtZW50cywgSSBtYWRlIHRoZSAtYyByZXN1bWUgZmxhZyB3b3JrCiAgIGZvciBIVFRQIHRvbyAodW5sZXNzIC1yIGlzIHVzZWQgdG9vLCB3aGljaCB3b3VsZCBiZSB2ZXJ5IG9kZCBhbnl3YXkpLgogLSBBZGRlZCBjaGVja2xpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBJdCBpcyBhIHN0aWxsIGV4cGVyaW1lbnRhbCBwZXJsIHNjcmlwdAogICB0aGF0IGNoZWNrcyBhbGwgbGlua3Mgb2YgYSB3ZWIgcGFnZSBieSB1c2luZyBjdXJsLgogLSBSZWFycmFuZ2VkIHRoZSBhcmNoaXZlIGhpZXJhcmNoeSBhIGxpdHRsZS4gQnVpbGQgdGhlIGV4ZWN1dGFibGUgaW4gdGhlCiAgIHNyYy8gZGlyIGZyb20gbm93IG9uIQogLSBWZXJzaW9uIDQuOSBhbmQgaGVyZWFmdGVyLCBpcyBubyBsb25nZXIgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBsaWNlbnNlLgogICBJIGhhdmUgbm93IHVwZGF0ZWQgdGhlIExFR0FMIGZpbGUgZXRjIGFuZCBub3cgdGhpcyBpcyByZWxlYXNlZCB1c2luZyB0aGUKICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSB0byBhdm9pZCB0aGUgcGxhZ3VlIGtub3duIGFzICJ0aGUgR1BMIHZpcnVzIi4gWW91CiAgIG11c3QgbWFrZSB0aGUgc291cmNlIGF2YWlsYWJsZSBpZiB5b3UgZGVjaWRlIHRvIGNoYW5nZSBhbmQvb3IgcmVkaXN0cmlidXRlCiAgIGN1cmwsIGJ1dCBpZiB5b3UgZGVjaWRlIHRvIHVzZSBjdXJsIHdpdGhpbiBzb21ldGhpbmcgZWxzZSB5b3UgZG8gbm90IG5lZWQKICAgdG8gb2ZmZXIgdGhlIHdvcmxkIHRoZSBzb3VyY2UgdG8gdGhhdCB0b28uCiAtIEN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgc2VydmVycyB0aGF0IHNlbnQgbm8gaGVhZGVycyBhdCBhbGwgb24gYSBHRVQKICAgcmVxdWVzdC4gIEl0IGlzIGEgdmlvbGF0aW9uIG9mIFJGQzIwNjggYnV0IGFwcGVhcmFudGx5IHNvbWUgc2VydmVycyBkbwogICB0aGF0IGFueXdheS4gIFRoYW5rcyB0byBHb3Jkb24gQmVhdG9uIGZvciB0aGUgcmVwb3J0IQogLSAtTC8tLWxvY2F0aW9uIHdhcyBhZGRlZCBhZnRlciBhIHN1Z2dlc3Rpb24gZnJvbSBNYXJ0aW4gU3RhYWVsLiBUaGlzIG1ha2VzCiAgIGN1cmwgQVRURU1QVCB0byBmb2xsb3cgdGhlIExvY2F0aW9uOiByZWRpcmVjdCBpZiBvbmUgaXMgcHJlc2VudCBpbiB0aGUgSFRUUAogICBoZWFkZXJzLiBJZiAtaSBvciAtSSBpcyB1c2VkIHdpdGggdGhpcyBmbGFnLCB5b3Ugd2lsbCBzZWUgaGVhZGVycyBmcm9tIGFsbAogICBzaXRlcyB0aGUgTG9jYXRpb246IHBvaW50cyB0by4gRG8gbm90ZSB0aGF0IHRoZSBmaXJzdCBzZXJ2ZXIgY2FuIHBvaW50IHRvIGEKICAgc2Vjb25kIHRoYXQgcG9pbnRzIHRvIGEgdGhpcmQgZXRjLiBJdCBzZWVtcyB0aGUgTG9jYXRpb246IHBhcmFtZXRlciAoc2FpZAogICB0byBiZSBhbiBBYnNvbHV0ZVVSSSBpbiBSRkMyMDY4KSBpc24ndCBhbHdheXMgYWJzb2x1dGUuLiA6LS8gQW55d2F5LCBJJ3ZlCiAgIG1hZGUgY3VybCBBVFRFTVBUIHRvIGRvIHRoZSBiZXN0IGl0IGNhbiB0byBkZWFsIHdpdGggdGhlIHJlYWxpdHkuCiAtIEFkZGVkIGdldGxpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBnZXRsaW5rcy5wbCBzZWxlY3RpdmVseSBkb3dubG9hZHMKICAgZmlsZXMgdGhhdCBhIHdlYiBwYWdlIGxpbmtzIHRvLgoKVmVyc2lvbiA0LjguNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFzIEp1bGlhbiBSb21lcm8gTmlldG8gcmVwb3J0ZWQsIGN1cmwgcmVwb3J0ZWQgd3JvbmcgdmVyc2lvbiBudW1iZXIuCiAtIEFzIFRlZW11IFlsaS1FbHNpbGEgcG9pbnRlZCBvdXQsIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIDQuOCAoYW5kIHByb2JhYmx5IGFsbAogICBvdGhlciB2ZXJzaW9ucyBmb3Igd2luMzIpIGRpZG4ndCB3b3JrIHdpdGggYmluYXJ5IGZpbGVzIHNpbmNlIEknbSB0b28gdXNlZAogICB0byB0aGUgVU5JWCBzdHlsZSBmb3BlbigpIHdoZXJlIGJpbmFyeSBhbmQgdGV4dCBkb24ndCBkaWZmZXIuLi4KIC0gUmFscGggQmVja21hbm4gYnJvdWdodCBtZSBzb21lIGNoYW5nZXMgdGhhdCBsZXRzIGN1cmwgY29tcGlsZSBlcnJvciBhbmQKICAgd2FybmluZyBmcmVlIHdpdGggLVdhbGwgLXBlZGFudGljIHdpdGggZysrLiBJIGFsc28gdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8KICAgY2xlYW4gb2ZmIHNvbWUgdW51c2VkIHZhcmlhYmxlcyBhbmQgc2ltaWxhci4KIC0gUmFscGggQmVja21hbm4gbWFkZSBtZSBhd2FyZSBvZiBhIHJlYWxseSBvZGQgYnVnIG5vdyBjb3JyZWN0ZWQuIFdoZW4gY3VybAogICByZWFkIGEgc2V0IG9mIGhlYWRlcnMgZnJvbSBhIEhUVFAgc2VydmVyLCBkaXZpZGVkIGludG8gbW9yZSB0aGFuIG9uZSByZWFkCiAgIGFuZCB0aGUgZmlyc3QgcmVhZCBzaG93ZWQgYSBmdWxsIGxpbmUgKmV4YWN0bHkqIChpLmUgZW5kaW5nIHdpdGggYQogICBuZXdsaW5lKSwgY3VybCBkaWQgbm90IGJlaGF2ZSB3ZWxsLgoKVmVyc2lvbiA0LjguMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEkgd2FzIHRvbyBxdWljayB0byByZWxlYXNlIDQuOC4yIHdpdGggdG9vIGxpdHRsZSB0ZXN0aW5nLiBPbmUgb2YgdGhlCiAgIGNoYW5nZXMgaXMgbm93IHJldmVydGVkIHNsaWdodGx5IHRvIHRoZSA0LjguMSB3YXkgc2luY2UgNC44LjIgY291bGRuJ3QKICAgdXBsb2FkIGZpbGVzLiBJIHN0aWxsIHRoaW5rIGJvdGggcHJvYmxlbXMgY29ycmVjdGVkIGluIDQuOC4yIHJlbWFpbgogICBjb3JyZWN0ZWQuICBSZXBvcnRlZCBieSBKdWxpYW4gUm9tZXJvIE5pZXRvLgoKVmVyc2lvbiA0LjguMgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlcm5oYXJkIElzZWxib3JuIHJlcG9ydGVkIHR3byBGVFAgcHJvdG9jb2wgZXJyb3JzIGN1cmwgZGlkLiBUaGV5J3JlIG5vdwogICBjb3JyZWN0ZWQuIEJvdGggYXBwZWFyZWQgd2hlbiBnZXR0aW5nIGZpbGVzIGZyb20gYSBNUyBGVFAgc2VydmVyISA6LSkKClZlcnNpb24gNC44LjEKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGxhc3QgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHRoZSB0cmFuc2ZlciBpcyBkb25lLiBUaGUKICAgZmluYWwgb3V0cHV0IG9uIHRoZSBzY3JlZW4gZGlkbid0IGhhdmUgdG8gYmUgdGhlIGZpbmFsIHNpemUgdHJhbnNmZXJlZAogICB3aGljaCBtYWRlIGl0IHNvbWV0aW1lcyBsb29rIG9kZC4KIC0gVGhhbmtzIHRvIERhdmlkIExvbmcgSSBnb3QgcmlkIG9mIGEgc2lsbHkgYnVnIHRoYXQgaGFwcGVuZWQgaWYgYSBIVFRQLXBhZ2UKICAgaGFkIG5vdGhpbmcgYnV0IGhlYWRlci4gQXBwZWFyYW50bHkgU29sYXJpcyBkZWFscyB3aXRoIG5lZ2F0aXZlIHNpemVzIGluCiAgIGZ3cml0ZSgpIGNhbGxzIGEgbG90IGJldHRlciB0aGFuIExpbnV4IGRvZXMuLi4gPUItXQoKVmVyc2lvbiA0LjggKEF1ZyAzMSwgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBDb250aW51ZSBGVFAgZmlsZSB0cmFuc2Zlci4gLWMgaXMgdGhlIHN3aXRjaC4gTm90ZSB0aGF0IHlvdSBuZWVkIHRvCiAgIHNwZWNpZnkgYSBmaWxlIG5hbWUgaWYgeW91IHdhbm5hIHJlc3VtZSBhIGRvd25sb2FkICh5b3UgY2FuJ3QgcmVzdW1lIGEKICAgZG93bmxvYWQgc2VudCB0byBzdGRvdXQpLiBSZXN1bWluZyB1cGxvYWQgbWF5IGJlIGxpbWl0ZWQgYnkgdGhlIHNlcnZlcgogICBzaW5jZSBjdXJsIGlzIHRoZW4gdXNpbmcgdGhlIG5vbi1SRkM5NTkgY29tbWFuZCBTSVpFIHRvIGdldCB0aGUgc2l6ZSBvZgogICB0aGUgdGFyZ2V0IGZpbGUgYmVmb3JlIHVwbG9hZCBiZWdpbnMgKHRvIGZpZ3VyZSBvdXQgd2hpY2ggb2Zmc2V0IHRvCiAgIHVzZSkuIFVzZSAtQyB0byBzcGVjaWZ5IHRoZSBvZmZzZXQgeW91cnNlbGYhIC1DIGlzIGhhbmR5IGlmIHlvdSdyZSBkb2luZwogICB0aGUgb3V0cHV0IHRvIHNvbWV0aGluZyBlbHNlIGJ1dCBhIHBsYWluIGZpbGUgb3Igd2hlbiB5b3UganVzdCB3YW50IHRvIGdldAogICB0aGUgZW5kIG9mIGEgZmlsZS4KIC0gcmVjdXJzaXZlZnRwZ2V0LnBsIG5vdyBmZWF0dXJlcyBhIG1heGltdW0gcmVjdXJzaXZlIGxldmVsIGFyZ3VtZW50LgoKVmVyc2lvbiA0LjcKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBzdXBwb3J0IHRvIGFib3J0IGEgZG93bmxvYWQgaWYgdGhlIHNwZWVkIGlzIGJlbG93IGEgY2VydGFpbiBhbW91bnQKICAgKHNwZWVkLWxpbWl0KSBieXRlcyBwZXIgc2Vjb25kIGZvciBhIGNlcnRhaW4gKHNwZWVkLXRpbWUpIHRpbWUuCiAtIFdyb3RlIGEgcGVybCBzY3JpcHQgJ3JlY3Vyc2l2ZWZ0cGdldC5wbCcgdG8gcmVjdXJzaXZlbHkgdXNlIGN1cmwgdG8gZ2V0IGEKICAgd2hvbGUgZnRwIGRpcmVjdG9yeSB0cmVlLiBJdCBpcyBtZWFudCBhcyBhbiBleGFtcGxlIG9mIGhvdyBjdXJsIGNhbiBiZQogICB1c2VkLiAgSSBhZ3JlZSBpdCBpc24ndCB0aGUgd2lzZXN0IHRoaW5nIHRvIGRvIHRvIG1ha2UgYSBzZXBhcmF0ZSBuZXcKICAgY29ubmVjdGlvbiBmb3IgZWFjaCBmaWxlIGFuZCBkaXJlY3RvcnkgZm9yIHRoaXMuCgpWZXJzaW9uIDQuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgZmlyc3QgYXR0ZW1wdCB0byBvcHRpb25hbGx5IHBhcnNlIHRoZSAubmV0cmMgZmlsZSBmb3IgbG9naW4gdXNlcgogICBhbmQgcGFzc3dvcmQuIElmIHVzZWQgd2l0aCBodHRwLCBpdCBlbmFibGVzIHVzZXIgYXV0aGVudGljYXRpb24uIC1uIGlzCiAgIHRoZSBuZXcgc3dpdGNoLgogLSBSZW1vdmVkIHRoZSBleHRyYSBuZXdsaW5lcyBvbiB0aGUgZGVmYXVsdCB1c2VyLWFnZW50IHN0cmluZy4KIC0gQ29ycmVjdGVkIHRoZSBtaXNzaW5nIGZ0cCB1cGxvYWQgZXJyb3IgbWVzc2FnZXMgd2hlbiBpdCBmYWlsZWQgd2l0aG91dCB0aGUKICAgdmVyYm9zZSBmbGFnIHNldC4gR2FyeSBXLiBTd2VhcmluZ2VuIGZvdW5kIGl0LgogLSBOb3cgdXNpbmcgYWxhcm0oKSB0byBlbmFibGUgc2Vjb25kLXByZWNpc2lvbiB0aW1lb3V0IGV2ZW4gb24gdGhlIG5hbWUKICAgcmVzb2x2aW5nL2Nvbm5lY3RpbmcgcGhhc2UuIFRoZSB0aW1lb3V0IGlzIGFsdGhvdWdoIHJlc2V0IGFmdGVyIHRoYXQgZmlyc3QKICAgc2VxdWVuY2UuIChUaGlzIHNob3VsZCBiZSBjb3JyZWN0ZWQuKSBHYXJ5IFcuIFN3ZWFyaW5nZW4gcmVwb3J0ZWQuCiAtIE5vdyBzcGVsbHMgIlVua25vd24iIHByb3Blcmx5LCBhcyBpbiAiVW5rbm93biBvcHRpb24gJ3onIi4uLiA6LSkKIC0gQWRkZWQgYnVnIHJlcG9ydCBlbWFpbCBhZGRyZXNzIGluIHRoZSBSRUFETUUuCiAtIEFkZGVkIGEgImN1cnJlbnQgc3BlZWQiIGZpZWxkIHRvIHRoZSBwcm9ncmVzcyBtZXRlci4gSXQgc2hvd3MgdGhlIGF2ZXJhZ2UKICAgc3BlZWQgdGhlIGxhc3QgNSBzZWNvbmRzLiBUaGUgb3RoZXIgc3BlZWQgZmllbGQgc2hvd3MgdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YKICAgdGhlIGVudGlyZSB0cmFuc2ZlciBzbyBmYXIuCgpWZXJzaW9uIDQuNS4xCiBMaW5hcyBWZXBzdGFzCiAtIFNTTCB0aHJvdWdoIHByb3h5IGZpeAogLSBBZGRlZCAtQSB0byBhbGxvdyBVc2VyLUFnZW50OiBjaGFuZ2VzCgogRGFuaWVsIFN0ZW5iZXJnIAogLSBNYWRlIHRoZSAtQSB3b3JrIHdoZW4gU1NMLXRocm91Z2gtcHJveHkuCgpWZXJzaW9uIDQuNQogTGluYXMgVmVwc3RhcwogLSBNb3JlIFNTTCBjb3JyZWN0aW9ucwogLSBJJ3ZlIGFkZGVkIGEgcG9ydCB0byBBSVguCiAtIHJ1bm5pbmcgU1NMIHRocm91Z2ggYSBwcm94eSBjYXVzZXMgYSBjaHVuayBvZiBjb2RlIHRvIGJlIGV4ZWN1dHJlZCB0d2ljZS4KICAgb25lIG9mIHRob3NlIGJsb2NrcyBuZWVkcyB0byBiZSBkZWxldGVkLgoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIC1pIGFuZCAtSSB3b3JrIGFnYWluCgpWZXJzaW9uIDQuNAogTGluYXMgVmVwc3RhcwogLSAteCBjYW4gbm93IGFsc28gc3BlY2lmeSBwcm94eXBvcnQgd2hlbiB1c2VkIGFzIGluICdwcm94eWhvc3Q6cHJveHlwb3J0JwogLSBTU0wgZml4ZXMKClZlcnNpb24gNC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgdG8gY29tcGlsZSB1bmRlciB3aW4zMiAoVmlzdWFsQysrIDUpLiBUaGUgLVAgc3dpdGNoIGRvZXMgbm90CiAgIHN1cHBvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZXMgaW4gd2luMzIuIEkgY291bGRuJ3QgZmlndXJlIG91dCBob3chCgpWZXJzaW9uIDQuMgogTGluYXMgVmVwc3RhcyAvIFNhbXBvIEtlbGxvbWFraQogLSBBZGRlZCBTU0wgLyBTU0xlYXkgc3VwcG9ydCAoaHR0cHM6Ly8pCiAtIEFkZGVkIHRoZSAtVCB1c2FnZSBmb3IgSFRUUCBQT1NULgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgU1NMIGltcGxlbWVudGF0aW9uLgogLSBNYWRlIC1QIGEgbG90IGJldHRlciB0byB1c2Ugb3RoZXIgSVAgYWRkcmVzc2VzLiBJdCBub3cgYWNjZXB0cyBhIGZvbGxvd2luZwogICBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyCiAgICAgICAgaW50ZXJmYWNlIC0gaS5lICJldGgwIiB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSdzIElQIGFkZHJlc3MgeW91CiAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UKICAgICAgICBJUCBhZGRyZXNzIC0gaS5lICIxOTIuMTY4LjEwLjEiIHRvIHNwZWNpZnkgZXhhY3QgSVAgbnVtYmVyCiAgICAgICAgaG9zdCBuYW1lIC0gaS5lICJteS5ob3N0LmRvbWFpbiIgdG8gc3BlY2lmeSBtYWNoaW5lCiAgICAgICAgIi0iICAgICAgIC0gKGFueSBzaW5nbGUtbGV0dGVyIHN0cmluZykgdG8gbWFrZSBpdCBwaWNrIHRoZSBtYWNoaW5lJ3MKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAtIFRoZSBNYWtlZmlsZSBpcyBub3cgcmVhZHkgdG8gY29tcGlsZSBmb3Igc29sYXJpcywgc3Vub3M0IGFuZCBsaW51eCByaWdodAogICBvdXQgb2YgdGhlIGJveC4KIC0gQmV0dGVyIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBzZWVuIHdpdGggJ2N1cmwgLVYnCgpWZXJzaW9uIDQuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBJUCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgYXMgYSByZXBseSB0byBQQVNWIGRvZXMgbm8gbG9uZ2VyCiAgIGhhdmUgdG8gRE5TIHJlc29sdmUuIEluIGZhY3QsIG5vIElQLW51bWJlci1vbmx5IGFkZHJlc3NlcyBoYXZlIHRvIGFueW1vcmUuCiAtIEJpbmRzIGJldHRlciB0byBhdmFpbGFibGUgcG9ydCB3aGVuIC1QIGlzIHVzZWQuCiAtIE5vdyBMSVNUcyAuLyBpbnN0ZWFkIG9mIC8gd2hlbiB1c2VkIGFzIGluIGZ0cDovL2Z0cC5mdW5ldC5maS8uIFRoZSByZWFzb24KICAgZm9yIHRoaXMgaXMgdGhhdCBleGFjdGx5IHRoYXQgc2l0ZSwgZnRwLmZ1bmV0LmZpLCBkb2VzIG5vdCBhbGxvdyBMSVNUIC8KICAgd2hpbGUgTElTVCAuLyBpcyBmaW5lLiBBbnkgb2JqZWN0aW9ucz8KClZlcnNpb24gNCAoMTk5OC0wMy0yMCkKIERhbmllbCBTdGVuYmVyZwogLSBJIHRvb2sgYW5vdGhlciBodWdlIHN0ZXAgYW5kIGNoYW5nZWQgYm90aCB2ZXJzaW9uIG51bWJlciBhbmQgcHJvamVjdCBuYW1lIQogICBUaGUgcmVhc29uIGZvciB0aGUgbmV3IG5hbWUgaXMgdGhhdCB0aGVyZSBhcmUganVzdCBvbmUgdG9vIG1hbnkgcHJvZ3JhbXMKICAgbmFtZWQgdXJsZ2V0IGFscmVhZHkgYW5kIHRoaXMgcHJvZ3JhbSBhbHJlYWR5IGNhbiBhIGxvdCBtb3JlIHRoYW4gbWVyZWx5CiAgIGdldHRpbmcgVVJMcywgYW5kIHRoZSByZWFzb24gZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB0aGF0IEkgZGlkIGFkZCB0aGUKICAgcHJldHR5IGJpZyBjaGFuZ2UgaW4gLVAgYW5kIHNpbmNlIEkgY2hhbmdlZCBuYW1lIEkgd2FudGVkIHRvIHN0YXJ0IHdpdGgKICAgc29tZXRoaW5nIGZyZXNoIQogLSBUaGUgLS1zdHlsZSBmbGFncyBhcmUgd29ya2luZyBiZXR0ZXIgbm93LgogLSBMaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGggRlRQIG9mdGVuIHJlcG9ydGVkIHRoYXQgdGhlIGZpbGUgdHJhbnNmZXIgd2FzCiAgIGluY29tcGxldGUuIFdyb25nIGFzc3VtcHRpb25zIHdlcmUgdG9vIGNvbW1vbiBmb3IgZGlyZWN0b3JpZXMsIHdoeSBubwogICBzaXplIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBjb21wYXJlZCBvbiB0aGVtIGZyb20gbm93IG9uLgogLSBJbXBsZW1lbnRlZCB0aGUgLVAgZmxhZyB0aGF0IGxldCdzIHRoZSBmdHAgY29udHJvbCBpc3N1ZSBhIFBPUlQgY29tbWFuZAogICBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBQQVNWLgogLSAtYSBmb3IgYXBwZW5kaW5nIEZUUCB1cGxvYWRzIHdvcmtzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpWZXJzaW9uIDMuMTIgKDE0IE1hcmNoIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gRW5kLW9mLWhlYWRlciB0cmFja2luZyBzdGlsbCBsYWNrZWQgc3VwcG9ydCBmb3IgXHJcbiBvciBqdXN0IFxuIGF0IHRoZQogICBlbmQgb2YgdGhlIGxhc3QgaGVhZGVyIGxpbmUuCiBTZXJnaW8gQmFycmVzaQogLSBBZGRlZCBQUk9YWSBhdXRoZW50aWNhdGlvbi4KIFJhZmFlbCBTYWd1bGEKIC0gRml4ZWQgc29tZSBsaXR0bGUgYnVncy4KClZlcnNpb24gMy4xMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBoZWFkZXIgcGFyc2luZyB3YXMgc3RpbGwgbm90IGNvcnJlY3Qgc2luY2UgdGhlIDMuMiBtb2RpZmljYXRpb24uLi4KClZlcnNpb24gMy4xMAogRGFuaWVsIFN0ZW5iZXJnCiAtIDMuNyBhbmQgMy45IHdlcmUgc2ltdWx0YW5lb3VzbHkgZGV2ZWxvcGVkIGFuZCBtZXJnZWQgaW50byB0aGlzIHZlcnNpb24uCiAtIEZUUCB1cGxvYWQgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBzaW5jZSAzLjIuCgpWZXJzaW9uIDMuOQogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCB0aGUgIi1lIDx1cmw+IC8gLS1yZWZlcmVyIDx1cmw+IiBvcHRpb24gd2hlcmUgd2UgY2FuIHNwZWNpZnkKICAgdGhlIHJlZmVyZXIgcGFnZS4gT2J2aW91c2x5LCB0aGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIGZvb2wgdGhlCiAgIHNlcnZlciwgYnV0Li4uCgpWZXJzaW9uIDMuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIE5vdyBjaGVja3MgdGhlIGxhc3QgZXJyb3IgY29kZSBzZW50IGZyb20gdGhlIGZ0cCBzZXJ2ZXIgYWZ0ZXIgYSBmaWxlIGhhcwogICBiZWVuIHJlY2VpdmVkIG9yIHVwbG9hZGVkLiBXYXNuJ3QgZG9uZSBwcmV2aW91c2x5LgogLSBXaGVuICd1cmxnZXQgPGhvc3Q+JyBpcyB1c2VkIHdpdGhvdXQgYSAncHJvdG9jb2w6Ly8nIGZpcnN0IGluIHRoZSBob3N0IHBhcnQsCiAgIGl0IG5vdyBjaGVja3MgZm9yIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBmdHAgb3IgZ29waGVyIGFuZCBpZiBpdCBkb2VzLAogICBpdCB1c2VzIHRoYXQgcHJvdG9jb2wgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGh0dHAuCgpWZXJzaW9uIDMuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIFNpbGx5IG1pc3Rha2UgbWFkZSB0aGUgUE9TVCBidWcuIFRoaXMgaGFzIG5vdyBhbHNvIGJlZW4gdGVzdGVkIHRvIHdvcmsgd2l0aAogICBwcm94eS4KClZlcnNpb24gMy41CiBEYW5pZWwgU3RlbmJlcmcKIC0gSGlnaGx5IGluc3BpcmVkIGJ5IFJhZmFlbCBTYWd1bGEncyBjaGFuZ2VzIHRvIHRoZSAzLjEgdGhhdCBhZGRlZCBhbiBhbG1vc3QKICAgZnVuY3Rpb25hbCBQT1NULCBJIGFwcGxpZWQgaGlzIGNoYW5nZXMgaW50byB0aGlzIHZlcnNpb24gYW5kIG1hZGUgdGhlbSB3b3JrLgogICAoSXQgc2VlbXMgUE9TVCByZXF1aXJlcyB0aGUgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LUxlbmd0aCBoZWFkZXJzLikgSXQgaXMKICAgbm93IHVzYWJsZSB3aXRoIHRoZSAtZCBzd2l0Y2guCgpWZXJzaW9uIDMuMyAtIDMuNAogUGFzc2VkIHRvIGF2b2lkIGNvbmZ1c2lvbnMKClZlcnNpb24gMy4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFqb3IgcmV3cml0ZSBvZiB0d28gY3J1Y2lhbCBwYXJ0cyBvZiB0aGlzIGNvZGU6IHVwbG9hZCBhbmQgZG93bmxvYWQuCiAgIFRoZXkgYXJlIGJvdGggbm93IHVzaW5nIGEgc2VsZWN0KCkgc3dpdGNoLCB0aGF0IGFsbG93cyBtdWNoIGJldHRlcgogICBwcm9ncmVzcyBtZXRlciBhbmQgdGltZSBjb250cm9sLiAKIC0gYWxhcm0oKSB1c2FnZSByZW1vdmVkIGNvbXBsZXRlbHkKIC0gRlRQIGdldCBjYW4gbm93IGxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhIHNsYXNoICcvJy4KICAgVXJsZ2V0IG9uIGEgZnRwLXBhdGggdGhhdCBkb2Vzbid0IGVuZCB3aXRoIGEgc2xhc2ggbWVhbnMgdXJsZ2V0IHdpbGwKICAgYXR0ZW1wdCBnZXR0aW5nIGl0IGFzIGEgZmlsZSBuYW1lLgogLSBGVFAgZGlyZWN0b3J5IHZpZXcgc3VwcG9ydHMgLWwgZm9yICJsaXN0LW9ubHkiIHdoaWNoIGxpc3RzIHRoZSBmaWxlIG5hbWVzCiAgIG9ubHkuCiAtIEFsbCBvcGVyYXRpb25zIHN1cHBvcnQgLW0gZm9yIG1heCB0aW1lIHVzYWdlIGluIHNlY29uZHMgYWxsb3dlZC4KIC0gRlRQIHVwbG9hZCBub3cgYWxsb3dzIHRoZSBzaXplIG9mIHRoZSB1cGxvYWRlZCBmaWxlIHRvIGJlIHByb3ZpZGVkLCBhbmQKICAgdGh1cyBpdCBjYW4gYmV0dGVyIGNoZWNrIGl0IGFjdHVhbGx5IHVwbG9hZGVkIHRoZSB3aG9sZSBmaWxlLiBJdCBhbHNvCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgdXBsb2FkcyBtdWNoIGJldHRlciEKIC0gTWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZmFpbCBpbiBjYXNlcyBsaWtlICd1cmxnZXQgLXIgOTAwJyB3aGljaAogICBwcmV2aW91c2x5IHRyaWVkIHRvIGNvbm5lY3QgdG8gdGhlIGhvc3QgbmFtZWQgJzkwMCcuCgpWZXJzaW9uIDMuMQogS2plbGwgRXJpY3NvbgogLSBQb2ludGVkIG91dCBob3cgdG8gY29ycmVjdCB0aGUgMyB3YXJuaW5ncyBpbiB3aW4zMi1jb21waWxlcy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCBhbGwgY2FsbHMgdG8gZXhpdCgpLgogLSBNYWRlIHRoZSBzaG9ydCBoZWxwIHRleHQgZ2V0IHdyaXR0ZW4gdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLgogLSBNYWRlIHRoaXMgZmlsZSBpbnN0ZWFkIG9mIGtlZXBpbmcgdGhlc2UgY29tbWVudHMgaW4gdGhlIHNvdXJjZS4KIC0gTWFkZSB0d28gY2FsbGJhY2sgaG9va3MsIHRoYXQgZW5hYmxlIGV4dGVybmFsIHByb2dyYW1zIHRvIHVzZSB1cmxnZXQoKQogICBlYXNpZXIgYW5kIHRvIGdyYWIgdGhlIG91dHB1dC9vZmZlciB0aGUgaW5wdXQgZWFzaWVyLgogLSBJdCBpcyBldmlkZW50IHRoYXQgV2luMzItY29tcGlsZXMgYXJlIHBhaW5mdWwuIEkgd2F0Y2hlZCB0aGUgb3V0cHV0IGZyb20KICAgdGhlIEJvcmxhbmQgQysrIHY1IGFuZCBpdCB3YXMgYXdmdWwuIEp1c3QgaWdub3JlIGFsbCB0aG9zZSB3YXJuaW5ncy4KClZlcnNpb24gMy4wCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgRlRQIHVwbG9hZCBjYXBhYmlsaXRpZXMuIFRoZSBuYW1lIHVybGdldCBnZXRzIGEgYml0IHNpbGx5IG5vdwogICB3aGVuIHdlIGNhbiBwdXQgdG9vLi4uID0pCiAtIFJlc3RydWN0dXJlZCB0aGUgc291cmNlIHF1aXRlIGEgbG90LgogICBDaGFuZ2VkIHRoZSB1cmxnZXQoKSBpbnRlcmZhY2UuIFRoaXMgd2F5LCB3ZSB3aWxsIHN1cnZpdmUgY2hhbmdlcyBtdWNoCiAgIGJldHRlci4gTmV3IGZlYXR1cmVzIGNhbiBjb21lIGFuZCBvbGQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCB1cyBuZWVkaW5nCiAgIHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlLiBJJ3ZlIHdyaXR0ZW4gYSBzbWFsbCBleHBsYW5hdGlvbiBpbiB1cmxnZXQuaAogICB0aGF0IGV4cGxhaW5zIGl0LgogLSBOZXcgZmxhZ3MgaW5jbHVkZSAtdCwgLVQsIC1PIGFuZCAtaC4gVGhlIC1oIHRleHQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBuZXcKICAgbWtoZWxwIHNjcmlwdC4KClZlcnNpb24gMi45CiBSZW1jbyB2YW4gSG9vZmYKIC0gQWRkZWQgYSBmaXggdG8gbWFrZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFtaWdhIHVzaW5nIHRoZSBTQVMvQwogICBjb21waWxlci4KICAKIERhbmllbCBTdGVuYmVyZwogLSBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHRoZSBTVFVQSUQgTm92ZWxsIHdlYiBzZXJ2ZXIgc2VlbXMgdG8gcmVxdWlyZQogICB0aGF0IHRoZSBIb3N0OiBrZXl3b3JkIGlzIHVzZWQsIHNvIHdlbGwgSSB1c2UgaXQgYW5kIEkgKHJlLWludHJvZHVjZSkgdGhlCiAgIHVybGdldCBVc2VyLUFnZW50Oi4gSSBzdGlsbCBoYXZlIHRvIGNoZWNrIHRoYXQgdGhpcyBIb3N0OiB1c2FnZSB3b3JrcyB3aXRoCiAgIHByb3hpZXMuLi4gJ0hvc3Q6JyBpcyByZXF1aXJlZCBmb3IgSFRUUC8xLjEgR0VUIGFjY29yZGluZyB0byBSRkMyMDY4LgoKVmVyc2lvbiAyLjgKIFJhZmFlbCBTYWd1bGEKIC0gc29tZSBsaXR0bGUgbW9kaWZpY2F0aW9ucwoKVmVyc2lvbiAyLjcKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIHRoZSAtbCBvcHRpb24gYW5kIGludHJvZHVjZWQgdGhlIC1mIG9wdGlvbiBpbnN0ZWFkLiBOb3cgSSdsbAogICByZXdyaXRlIHRoZSBmb3JtZXIgLWwga2x1ZGdlIGluIGFuIGV4dGVybmFsIHNjcmlwdCB0aGF0J2xsIHVzZSB1cmxnZXQgdG8KICAgZmV0Y2ggbXVsdGlwYXJ0IGZpbGVzIGxpa2UgdGhhdC4KIC0gJy1mJyBpcyBpbnRyb2R1Y2VkLCBpdCBtZWFucyBGYWlsIHdpdGhvdXQgb3V0cHV0IGluIGNhc2Ugb2YgSFRUUCBzZXJ2ZXIKICAgZXJyb3JzIChyZXR1cm4gY29kZSA+PTMwMCkuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIC1yLCByYW5nZXMuIFNwZWNpZnkgd2hpY2ggcGFydCBvZiBhIGRvY3VtZW50IHlvdSAKICAgd2FudCwgYW5kIG9ubHkgdGhhdCBwYXJ0IGlzIHJldHVybmVkLiBPbmx5IHdpdGggSFRUUC8xLjEtc2VydmVycy4KIC0gU3BsaXQgdXAgdGhlIHNvdXJjZSBpbiAzIHBhcnRzLiBOb3cgYWxsIHB1cmUgVVJMIGZ1bmN0aW9ucyBhcmUgaW4KICAgdXJsZ2V0LmMgYW5kIHN0dWZmIHRoYXQgZGVhbHMgd2l0aCB0aGUgc3RhbmQtYWxvbmUgcHJvZ3JhbSBpcyBpbiBtYWluLmMuCiAtIEkgdG9vayBhIGZldyBtaW51dGVzIGFuZCB3cm90ZSBhbiBlbWJyeW8gb2YgYSBSRUFETUUgZmlsZSB0byBleHBsYWluCiAgIGEgZmV3IHRoaW5ncy4KClZlcnNpb24gMi42CiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSB0aGUgLWwgKGxvb3ApIHRoaW5nIHVzZSB0aGUgbmV3IENPTkZfRkFJTE9ORVJST1Igd2hpY2ggbWFrZXMKICAgdXJsZ2V0KCkgcmV0dXJuIGVycm9yIGNvZGUgaWYgbm9uLXN1Y2Nlc3NmdWwuIEl0IGFsc28gd29uJ3Qgb3V0cHV0IGFueXRoaW5nCiAgIHRoZW4uIE5vdyBmaW5hbGx5IHJlbW92ZWQgdGhlIEhUVFAgMS4wIGFuZCBlcnJvciA0MDQgZGVwZW5kZW5jaWVzLgogLSBBZGRlZCAtSSB3aGljaCB1c2VzIHRoZSBIRUFEIHJlcXVlc3QgdG8gZ2V0IHRoZSBoZWFkZXIgb25seSBmcm9tIGEKICAgaHR0cC1zZXJ2ZXIuCgpWZXJzaW9uIDIuNQogUmFmYWVsIFNhZ3VsYQogLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB1c2UgSEhIOk1NOlNTIGluc3RlYWQgb2Ygb25seSBzZWNvbmRzLgoKVmVyc2lvbiAyLjQKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBwcm9ncmVzcyBtZXRlci4gSXQgYXBwZWFycyB3aGVuIGRvd25sb2FkaW5nID4gQlVGRkVSIFNJWkUgYW5kCiAgIG11dGUgaXMgbm90IHNlbGVjdGVkLiBJIGZvdW5kIG91dCB0aGF0IHdoZW4gZG93bmxvYWRpbmcgbGFyZ2UgZmlsZXMgZnJvbQogICByZWFsbHkgcmVhbGx5IHNsb3cgc2l0ZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBrbm93IHRoZSBzdGF0dXMgb2YgdGhlCiAgIGRvd25sb2FkLiBEbyBub3RlIHRoYXQgc29tZSBkb3dubG9hZHMgYXJlIGRvbmUgdW5hd2FyaW5nIG9mIHRoZSBzaXplLCB3aGljaAogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbGVzcyB0aHJpbGxpbmcgOykgSWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIGEgdHR5LAogICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgaXMgc2h1dCBvZmYuCiAtIEluY3JlYXNlZCBidWZmZXIgc2l6ZSB1c2VkIGZvciByZWFkaW5nLgogLSBBZGRlZCBsZW5ndGggY2hlY2tzIGluIHRoZSB1c2VyK3Bhc3N3ZCBwYXJzaW5nLgogLSBNYWRlIGl0IGdyb2sgdXNlcitwYXNzd2QgZm9yIEhUVFAgZmV0Y2hlcy4gVGhlIHRyaWNrIGlzIHRvIGJhc2U2NAogICBlbmNvZGUgdGhlIHVzZXIrcGFzc3dkIGFuZCBzZW5kIGFuIGV4dHJhIGhlYWRlciBsaW5lLiBSZWFkIGNoYXB0ZXIgMTEuMSBpbgogICBSRkMyMDY4IGZvciBkZXRhaWxzLiBJIGFkZGVkIGl0IHRvIGJlIHVzZWQganVzdCBsaWtlIHRoZSBmdHAgb25lLiAgVG8gZ2V0IGEKICAgaHR0cCBkb2N1bWVudCBmcm9tIGEgcGxhY2UgdGhhdCByZXF1aXJlcyB1c2VyIGFuZCBwYXNzd29yZCwgdXNlIGFuIFVSTAogICBsaWtlOgoKICAgICAgICBodHRwOi8vdXNlcjpwYXNzd2RAd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKCiAgIEkgYWxzbyBhZGRlZCB0aGUgLXUgZmxhZywgc2luY2UgV0hFTiBVU0lORyBBIFBST1hZIFlPVSBDQU4nVCBTUEVDSUZZIFRIRQogICBVU0VSIEFORCBQQVNTV09SRCBXSVRIIEhUVFAgTElLRSBUSEFULiBUaGUgLXUgZmxhZyB3b3JrcyBmb3IgZnRwIHRvbywgYnV0CiAgIG5vdCBpZiB1c2VkIHdpdGggcHJveHkuIFRvIGRvIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSBvbmUsIHlvdSBjYW4gaW52b2tlOgoKICAgICAgICB1cmxnZXQgLXUgdXNlcjpwYXNzd2QgaHR0cDovL3d3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgpWZXJzaW9uIDIuMwogUmFmYWVsIFNhZ3VsYQogLSBBZGRlZCAiLW8iIG9wdGlvbiAob3V0cHV0IGZpbGUpCiAtIEFkZGVkIFVSR19IVFRQX05PVF9GT1VORCByZXR1cm4gY29kZS4KICAgKERhbmllbCdzIG5vdGU6KQogICBQZXJoYXBzIHdlIHNob3VsZCBkZXRlY3QgYWxsIGtpbmRzIG9mIGVycm9ycyBhbmQgaW5zdGVhZCBvZiB3cml0aW5nIHRoYXQKICAgY3VzdG9tIHN0cmluZyBmb3IgdGhlIHBhcnRpY3VsYXIgNDA0LWVycm9yLCB1c2UgdGhlIGVycm9yIHRleHQgd2UgYWN0dWFsbHkKICAgZ2V0IGZyb20gdGhlIHNlcnZlci4gU2VlIGZ1cnRoZXIgZGV0YWlscyBpbiBSRkMyMDY4IChIVFRQIDEuMQogICBkZWZpbml0aW9uKS4gVGhlIGN1cnJlbnQgd2F5IGFsc28gcmVsaWVzIG9uIGEgSFRUUC8xLjAgcmVwbHksIHdoaWNoIG5ld2VyCiAgIHNlcnZlcnMgbWlnaHQgbm90IGRvLgogLSBMb29waW5nIG1vZGUgKCItbCIgb3B0aW9uKS4gSXQncyBlYXNpZXIgdG8gZ2V0IHZhcmlvdXMgc3BsaXQgZmlsZXMuCiAgIChEYW5pZWwncyBub3RlOikKICAgVXNlIGl0IGxpa2UgJ3VybGdldCAtbCAxIGh0dHA6Ly9mcm9tLnRoaXMuc2l0ZS9maWxlJWQuaHRtbCcsIHdoaWNoIHdpbGwKICAgbWFrZSB1cmxnZXQgdG8gYXR0ZW1wdCB0byBmZXRjaCBhbGwgZmlsZXMgbmFtZWQgZmlsZTEuaHRtbCwgZmlsZTIuaHRtbCBldGMKICAgdW50aWwgbm8gbW9yZSBmaWxlcyBhcmUgZm91bmQuIFRoaXMgaXMgb25seSBhIG1vZGlmaWNhdGlvbiBvZiB0aGUKICAgU1RBTkRfQUxPTkUgcGFydCwgbm90aGluZyBpbiB0aGUgdXJsZ2V0KCkgZnVuY3Rpb24gd2FzIG1vZGZpZmllZCBmb3IgdGhpcy4KIERhbmllbCBTdGVuYmVyZwogLSBDaGFuZ2VkIHRoZSAtaCB0byBiZSAtaSBpbnN0ZWFkLiAtaCBzaG91bGQgYmUgcHJlc2VydmVkIHRvIGhlbHAgdXNlLgogLSBCam9ybiBSZWVzZSBpbmRpY2F0ZWQgdGhhdCBCb3JsYW5kIF9taWdodF8gdXNlICdfV0lOMzInIGluc3RlYWQgb2YgdGhlCiAgIFZDKysgV0lOMzIgZGVmaW5lIGFuZCB0aGVyZWZvcmUgSSBhZGRlZCBhIGxpdHRsZSBmaXggZm9yIHRoYXQuCgpWZXJzaW9uIDIuMgogSm9oYW4gQW5kZXJzc29uCiAtIFRoZSB1cmxnZXQgZnVuY3Rpb24gZGlkbid0IHNldCB0aGUgcGF0aCB0byB1cmwgd2hlbiB1c2luZyBwcm94eS4KIC0gRml4ZWQgYnVnIHdpdGggSU1DIHByb3h5LiBOb3cgdXNpbmcgKGFsbW9zdCkgY29tcGxldGUgR0VUIGNvbW1hbmQuCiAgCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSBpdCBjb21waWxlIG9uIFNvbGFyaXMuIEhhZCB0byByZW9yZ2FuaXplIHRoZSBpbmNsdWRlcyBhIGJpdC4KICAgKHNvIFdpbjMyLCBMaW51eCwgU3VuT1MgNCBhbmQgU29sYXJpcyAyIGNvbXBpbGUgZmluZS4pCiAtIE1hZGUgSm9oYW4ncyBrZWVwYWxpdmUga2V5d29yZCBvcHRpb25hbCB3aXRoIHRoZSAtayBmbGFnIChzaW5jZSBpdAogICBtYWtlcyBhIGxvdCBvZiB1cmxnZXRzIHRha2UgYSBsb3QgbG9uZ2VyIHRpbWUpLgogLSBNYWRlIGEgJy1oJyBzd2l0Y2ggaW4gY2FzZSB5b3Ugd2FudCB0aGUgSFRUUC1oZWFkZXIgaW4gdGhlIG91dHB1dC4KClZlcnNpb24gMi4xCiBEYW5pZWwgU3RlbmJlcmcgYW5kIEtqZWxsIEVyaWNzb24KIC0gV2luMzItY29tcGlsYWJsZQogLSBObyBtb3JlIGdsb2JhbCB2YXJpYWJsZXMKIC0gTXV0ZSBvcHRpb24gKG5vIG91dHB1dCBhdCBhbGwgdG8gc3RkZXJyKQogLSBGdWxsIHJhbmdlIG9mIHJldHVybiBjb2RlcyBmcm9tIHVybGdldCgpLCB3aGljaCBpcyBub3cgd3JpdHRlbiB0byBiZSBhCiAgIGZ1bmN0aW9uIGZvciBlYXN5LXRvLXVzZSBpbiBbb3RoZXJdIHByb2dyYW1zLgogLSBEZWZpbmUgU1RBTkRfQUxPTkUgdG8gY29tcGlsZSB0aGUgc3RhbmQgYWxvbmUgdXJsZ2V0IHByb2dyYW0KIC0gTm93IGNvbXBpbGVzIHdpdGggZ2NjIG9wdGlvbnMgLWFuc2kgLVdhbGwgLXBlZGFudGljIDspCgpWZXJzaW9uIDIuMAogLSBJbnRyb2R1Y2luZyBmdHAgR0VUIHN1cHBvcnQuIFRoZSBGVFAgVVJMIHR5cGUgaXMgcmVjb2duaXplZCBhbmQgdXNlZC4KIC0gUmVuYW1lZCB0aGUgcHJvamVjdCB0byAndXJsZ2V0Jy4KIC0gU3VwcG9ydHMgdGhlIHVzZXIrcGFzc3dkIGluIHRoZSBGVFAgVVJMIChvdGhlcndpc2UgaXQgdHJpZXMgYW5vbnltb3VzCiAgIGxvZ2luIHdpdGggYSB3ZWlyZCBlbWFpbCBhZGRyZXNzIGFzIHBhc3N3b3JkKS4KClZlcnNpb24gMS41CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIHNraXBfaGVhZGVyKCkgY3JhcCBtZXNzZWQgaXQgdXAgYmlnLXRpbWUuIEJ5IHNpbXBseSByZW1vdmluZyB0aGF0CiAgIG9uZSB3ZSBjYW4gYWxsIG9mIGEgc3VkZGVuIGRvd25sb2FkIGFueXRoaW5nIDspCiAtIE5vIGxvbmdlciByZXF1aXJlcyBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkxzLgogLSBJZiB0aGUgZ2l2ZW4gVVJMIGlzbid0IHByZWZpeGVkIHdpdGggJ2h0dHA6Ly8nLCBIVFRQIGlzIGFzc3VtZWQgYW5kCiAgIGdpdmVuIGEgdHJ5IQogLSAndm9pZCBtYWluKCknIGlzIGhpc3RvcnkuCgpWZXJzaW9uIDEuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBnb3BoZXIgc291cmNlIHVzZWQgdGhlIHBwYXRoIHZhcmlhYmxlIGluc3RlYWQgb2YgcGF0aCB3aGljaCBjb3VsZAogICBsZWFkIHRvIGRpc2FzdGVyLgoKVmVyc2lvbiAxLjMKIERhbmllbCBTdGVuYmVyZwogLSBXZWxsLCBJIGFkZGVkIGEgbGFtZSB0ZXh0IGFib3V0IHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IHRoZSBkYXRhLiBJIGFsc28KICAgZm91Z2h0IGFnYWluc3QgSm9oYW4gdG8gcHJldmVudCBoaXMgLWYgb3B0aW9uICh0byBzcGVjaWZ5IGEgZmlsZSBuYW1lCiAgIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBzdGRvdXQpISA9KQogLSBNYWRlIGl0IHdyaXRlICdjb25uZWN0aW9uIHJlZnVzZWQnIGZvciB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdCgpCiAgIHByb2JsZW0uCiAtIFJlbnVtYmVyZWQgdGhlIHZlcnNpb24uIExldCdzIG5vdCBtYWtlIHNpbGx5IDEuMC5YIHZlcnNpb25zLCB0aGlzIGlzCiAgIGEgcGxhaW4gMS4zIGluc3RlYWQuCgpWZXJzaW9uIDEuMgogSm9oYW4gQW5kZXJzc29uCiAtIERpc2NvdmVyZWQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZ2V0dGluZyBiaW5hcnkgZmlsZXMuIHB1dHMoKSBpcwogICBub3cgcmVwbGFjZWQgd2l0aCBmd3JpdGUoKS4gKERhbmllbCdzIG5vdGU6IHRoaXMgYWxzbyBmaXhlZCB0aGUgYnVmZmVyCiAgIG92ZXJ3cml0ZSBwcm9ibGVtIEkgZm91bmQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24uKQoKIFJhZmFlbCBTYWd1bGEKIC0gTGV0ICItcCIgYmVmb3JlICIteCIuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJ1Z2ZpeGVkIHRoZSBwcm94eSB1c2FnZS4gSXQgc2hvdWxkICpOT1QqIHVzZSBub3Igc3RyaXAgdGhlIHBvcnQgbnVtYmVyCiAgIGZyb20gdGhlIFVSTCBidXQgc2ltcGx5IHBhc3MgdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUgcHJveHkuIFRoaXMgYWxzbwogICBtYWRlIHRoZSB1c2VyL3Bhc3N3b3JkIGZpZWxkcyBwb3NzaWJsZSB0byB1c2UgaW4gcHJveHkgW2Z0cC1dIFVSTHMuCiAgIChsaWtlIGluIGZ0cDovL3VzZXI6cGFzc3dvcmRAZnRwLm15LnNpdGU6ODAyMS9SRUFETUUpCgogSm9oYW4gQW5kZXJzc29uCiAtIEltcGxlbWVudGVkIEhUVFAgcHJveHkgc3VwcG9ydC4KIC0gUmVjZWl2ZSBieXRlIGNvdW50ZXIgYWRkZWQuCgogQmpvcm4gUmVlc2UKIC0gSW1wbGVtZW50ZWQgVVJMcyAoYW5kIHNraXBwZWQgdGhlIG9sZCBzeW50YXgpLgogLSBPdXRwdXQgaXMgd3JpdHRlbiB0byBzdGRvdXQsIHNvIHRvIGFjaGlldmUgdGhlIGFib3ZlIGV4YW1wbGUsIGRvOgogICBodHRwZ2V0IGh0dHA6Ly8xNDMuNTQuMTAuNi9pbmZvX2xvZ28uZ2lmID4gdGVzdC5naWYKClZlcnNpb24gMS4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgaXQgc2xpZ2h0bHkgdG8gYWNjZXB0IG5hbWVkIGhvc3RzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFdlCiAgIHdvdWxkbid0IHdhbm5hIHVzZSBJUCBudW1iZXJzIGZvciB0aGUgcmVzdCBvZiBvdXIgbGlmZXMsIHdvdWxkIHdlPwoKVmVyc2lvbiAxLjAKICBSYWZhZWwgU2FndWxhCiAgLSBXcm90ZSB0aGUgaW5pdGlhbCBodHRwZ2V0LCB3aGljaCBzdGFydGVkIGFsbCB0aGlzIQo=