ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKKiBPY3RvYmVyIDIgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBhcmVzX3N0cmVycm9yKCkgc2VnZmF1bHRlZCBpZiB0aGUgaW5wdXQgZXJyb3IgbnVtYmVyIHdhcyBvdXQgb2YgdGhlIGN1cnJlbnRseQogIHN1cHBvcnRlZCByYW5nZS4KCi0gWWFuZyBUc2U6IEF2b2lkIGEgc2VnZmF1bHQgd2hlbiBnZW5lcmF0aW5nIGEgRE5TICJUcmFuc2FjdGlvbiBJRCIgaW4KICBpbnRlcm5hbCBmdW5jdGlvbiBpbml0X2lkX2tleSgpIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucy4KCiogU2VwdGVtYmVyIDI4IDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gQnVtcGVkIHZlcnNpb24gdG8gMS41LjAgZm9yIG5leHQgcmVsZWFzZSBhbmQgc29uYW1lIGJ1bXBlZCB0byAyIGR1ZSB0byBBQkkKICBhbmQgQVBJIGNoYW5nZXMgaW4gdGhlIHByb2dyZXNzIGNhbGxiYWNrIChhbmQgcG9zc2libHkgbW9yZSBjb21pbmcgdXAgZnJvbQogIFN0ZWluYXIpCgoqIFNlcHRlbWJlciAyOCAyMDA3IChTdGVpbmFyIEguIEd1bmRlcnNvbikKCi0gRG9uJ3Qgc2tpcCBhIHNlcnZlciBpZiBpdCdzIHRoZSBvbmx5IG9uZS4gKEJ1Z2ZpeCBmcm9tIHRoZSBHb29nbGUgdHJlZS4pCgotIE1hZGUgdGhlIHF1ZXJ5IGNhbGxiYWNrcyByZWNlaXZlIHRoZSBudW1iZXIgb2YgdGltZW91dHMgdGhhdCBoYXBwZW5lZCBkdXJpbmcKICB0aGUgZXhlY3V0aW9uIG9mIGEgcXVlcnksIGFuZCB1cGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuIChQYXRjaCBmcm9tCiAgdGhlIEdvb2dsZSB0cmVlLikKCi0gU3VwcG9ydCBhIGZldyBtb3JlIHNvY2tldCBvcHRpb25zOiBBUkVTX09QVF9TT0NLX1NOREJVRiBhbmQKICBBUkVTX09QVF9TT0NLX1JDVkJVRgoKLSBBbHdheXMgcmVnaXN0ZXIgZm9yIFRDUCBldmVudHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcXVlcmllcywgYXMKICB0aGUgb3RoZXIgc2lkZSBjb3VsZCBhbHdheXMgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIHdoaWNoIGlzIGEgdmFsaWQgZXZlbnQKICB3aGljaCBzaG91bGQgYmUgcmVzcG9uZGVkIHRvLgoKKiBTZXB0ZW1iZXIgMjIgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBTdGVpbmFyIEguIEd1bmRlcnNvbiBmaXhlZDogQ29ycmVjdGx5IGNsZWFyIHNvY2tldHMgZnJvbSB0aGUgZmRfc2V0IG9uIGluCiAgc2V2ZXJhbCBmdW5jdGlvbnMgKHdyaXRlX3RjcF9kYXRhLCByZWFkX3RjcF9kYXRhLCByZWFkX3VkcF9wYWNrZXRzKSBzbyB0aGF0CiAgaWYgaXQgZmFpbHMgYW5kIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHRoZSBmb2xsb3dpbmcgY29kZSBkb2Vzbid0IHRyeSB0byB1c2UKICB0aGUgZmlsZSBkZXNjcmlwdG9yLgoKLSBTdGVpbmFyIEguIEd1bmRlcnNvbiBtb2RpZmllZCBjLWFyZXMgdG8gbm93IGFsc28gZG8gdG8gRE5TIHJldHJpZXMgZXZlbiB3aGVuCiAgVENQIGlzIHVzZWQgc2luY2UgdGhlcmUgYXJlIHNldmVyYWwgZWRnZSBjYXNlcyB3aGVyZSBpdCBzdGlsbCBtYWtlcyBzZW5zZS4KCi0gQnJhZCBIb3VzZSBwcm92aWRlZCBhIGZpeCBmb3IgYXJlc19zYXZlX29wdGlvbnMoKToKCiAgQXBwYXJlbnRseSBJIG92ZXJsb29rZWQgc29tZXRoaW5nIHdpdGggdGhlIGFyZXNfc2F2ZV9vcHRpb25zKCkgd2hlcmUgaXQKICB3b3VsZCB0cnkgdG8gZG8gYSBtYWxsb2MoMCkgd2hlbiBubyBvcHRpb25zIG9mIHRoYXQgdHlwZSBuZWVkZWQgdG8gYmUgc2F2ZWQuCiAgT24gbW9zdCBwbGF0Zm9ybXMsIHRoaXMgd2FzIGZpbmUgYmVjYXVzZSBtYWxsb2MoMCkgZG9lc24ndCBhY3R1YWxseSByZXR1cm4KICBOVUxMLCBidXQgb24gQUlYIGl0IGRvZXMsIHNvIGFyZXNfc2F2ZV9vcHRpb25zIHdvdWxkIHJldHVybiBBUkVTX0VOT01FTS4KCiogSnVseSAxNCAyMDA3IChEYW5pZWwgU3RlbmJlcmcpCgotIFZsYWQgRGludWxlc2N1IGZpeGVkIHR3byBvdXRzdGFuZGluZyB2YWxncmluZCByZXBvcnRzOgogCiAgMS4gSW4gYXJlc19xdWVyeS5jICwgaW4gZmluZF9xdWVyeV9ieV9pZCB3ZSBjb21wYXJlIHEtPnFpZCAod2hpY2ggaXMgYSBzaG9ydAogIGludCB2YXJpYWJsZSkgd2l0aCBxaWQsIHdoaWNoIGlzIGRlY2xhcmVkIGFzIGFuIGludCB2YXJpYWJsZS4gIE1vcmVvdmVyLAogIEROU19IRUFERVJfU0VUX1FJRCBpcyB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgcWlkLCBidXQgRE5TX0hFQURFUl9TRVRfUUlECiAgc2V0cyBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgcWlkLiBJIHRoaW5rIHRoYXQgcWlkIHNob3VsZCBiZSBkZWNsYXJlZCBhcwogICJ1bnNpZ25lZCBzaG9ydCIgaW4gdGhpcyBmdW5jdGlvbi4KCiAgMi4gVGhlIHNhbWUgcHJvYmxlbSBvY2N1cnMgaW4gYXJlc19wcm9jZXNzLmMsIHByb2Nlc3NfYW5zd2VyKCkgLiAgcXVlcnktPnFpZAogIChhbiB1bnNpZ25lZCBzaG9ydCBpbnRlZ2VyIHZhcmlhYmxlKSBpcyBjb21wYXJlZCB3aXRoIGlkLCB3aGljaCBpcyBhbgogIGludGVnZXIgdmFyaWFibGUuIE1vcmVvdmVyLCBpZCBpcyBpbml0aWFsaXplZCBmcm9tIEROU19IRUFERVJfUUlEIHdoaWNoIHNldHMKICBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgaWQuIEkgdGhpbmsgdGhhdCB0aGUgaWQgdmFyaWFibGUgc2hvdWxkIGJlCiAgZGVjbGFyZWQgYXMgInVuc2lnbmVkIHNob3J0IiBpbiB0aGlzIGZ1bmN0aW9uLgoKICBFdmVuIGFmdGVyIGRlY2xhcmluZyB0aGVzZSB2YXJpYWJsZXMgYXMgInVuc2lnbmVkIHNob3J0IiwgdGhlIHZhbGdyaW5kCiAgZXJyb3JzIGFyZSBzdGlsbCB0aGVyZS4gV2hpY2ggYnJpbmdzIHVzIHRvIHRoZSB0aGlyZCBwcm9ibGVtLgoKICAzLiBUaGUgdGhpcmQgcHJvYmxlbSBpcyB0aGF0IFZhbGdyaW5kIGFzc3VtZXMgdGhhdCBxdWVyeS0+cWlkIGlzIG5vdAogIGluaXRpYWxpc2VkIGNvcnJlY3RseS4gQW5kIGl0IGRvZXMgdGhhdCBiZWNhdXNlIHF1ZXJ5LT5xaWQgaXMgc2V0IGZyb20KICBETlNfSEVBREVSX1FJRChxYnVmKTsgVmFsZ3JpbmQgc2F5cyB0aGF0IHFidWYgaGFzIHVuaXRpYWxpc2VkIGJ5dGVzLiBBbmQKICBxYnVmIGhhcyB1bmluaXRpYWxpc2VkIGJ5dGVzIGJlY2F1c2Ugb2YgY2hhbm5lbC0+bmV4dF9pZCAuIEFuZCBuZXh0X2lkIGlzCiAgc2V0IGJ5IGFyZXNfaW5pdC5jOmFyZXNfX2dlbmVyYXRlX25ld19pZCgpIC4gSSBmb3VuZCB0aGF0IHB1dHRpbmcgc2hvcnQgcj0wCiAgaW4gdGhpcyBmdW5jdGlvbiAoaW5zdGVhZCBvZiBzaG9ydCByKSBtYWtlcyBhbGwgVmFsZ3JpbmQgd2FybmluZ3MgZ28gYXdheS4KICBJIGhhdmUgc3R1ZGllZCBhcmVzX19yYzQoKSB0b28sIGFuZCB0aGlzIGlzIHRoZSBvZmZlbmRpbmcgbGluZToKCiAgICAgICAgYnVmZmVyX3B0cltjb3VudGVyXSBePSBzdGF0ZVt4b3JJbmRleF07ICAgKGFyZXNfcXVlcnkuYzo2MikKCiAgVGhpcyBpcyB3aGF0IHRyaWdnZXJzIFZhbGdyaW5kLi4gYnVmZmVyX3B0ciBpcyB1bml0aWFsaXNlZCBpbiB0aGlzIGZ1bmN0aW9uLAogIGFuZCBieSBhcHBseWluZyBePSBvbiBpdCwgaXQgcmVtYWlucyB1bml0aWFsaXNlZC4KClZlcnNpb24gMS40LjAgKEp1bmUgOCwgMjAwNykKCiogSnVuZSA0IDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gSmFtZXMgQnVyc2EgcmVwb3J0ZWQgYSBtYWpvciBtZW1vcnkgcHJvYmxlbSB3aGVuIHJlc29sdmluZyBtdWx0aS1JUCBuYW1lcwogIGFuZCBJIGZvdW5kIGFuZCBmaXhlZCB0aGUgcHJvYmxlbS4gSXQgd2FzIGFkZGVkIGJ5IEFzaGlzaCBTaGFybWEncyBwYXRjaAogIHR3byBkYXlzIGFnby4KCiAgV2hlbiBJIHRoZW4gdHJpZWQgdG8gdmVyaWZ5IG11bHRpcGxlIGVudHJpZXMgaW4gL2V0Yy9ob3N0cyBhZnRlciBteSBmaXgsIEkKICBnb3QgYW5vdGhlciBzZWdmYXVsdCBhbmQgZGVjaWRlZCB0aGlzIGNvZGUgd2FzIG5vdCByaXBlIGZvciBpbmNsdXNpb24gYW5kIEkKICByZXZlcnRlZCB0aGUgcGF0Y2guCgoqIEp1bmUgMiAyMDA3CgotIEJyYWQgU3BlbmNlciBmb3VuZCBhbmQgZml4ZWQgdGhyZWUgZmxhd3MgaW4gdGhlIGNvZGUsIGZvdW5kIHdpdGggdGhlIG5ldwogIGdjYyA0LjIuMCB3YXJuaW5nOiAtV2FkZHJlc3MKCi0gQnJhZCBIb3VzZSBmaXhlZCBWUzIwMDUgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRpbWVfdCBiZWluZyA2NGJpdC4KICBIZSBhbHNvIG1hZGUgcmVjZW50IE1pY3Jvc29mdCBjb21waWxlcnMgdXNlIF9zdHJkdXAoKSBpbnN0ZWFkIG9mIHN0cmR1cCgpLgoKLSBCcmFkIEhvdXNlJ3MgbWFuIHBhZ2VzIGZvciBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpCiAgd2VyZSBhZGRlZC4KCi0gQXNoaXNoIFNoYXJtYSBwcm92aWRlZCBhIHBhdGNoIGZvciBzdXBwb3J0aW5nIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlCiAgL2V0Yy9ob3N0cyBmaWxlLiBQYXRjaCBlZGl0ZWQgZm9yIGNvZGluZyBzdHlsZSBhbmQgZnVuY3Rpb25hbGl0eSBieSBtZQogIChEYW5pZWwpLgoKKiBNYXkgMzAgMjAwNwoKLSBTaG11bGlrIFJlZ2V2IGJyb3VnaHQgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHRyYW5zYWN0aW9uIElEczoKCiAgVGhlIGMtYXJlcyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHVzZXMgYSBETlMgIlRyYW5zYWN0aW9uIElEIiBmaWVsZCB0aGF0IGlzCiAgc2VlZGVkIHdpdGggYSBwc2V1ZG8gcmFuZG9tIG51bWJlciAoYmFzZWQgb24gZ2V0dGltZW9mZGF5KSB3aGljaCBpcwogIGluY3JlbWVudGVkICgrKykgYmV0d2VlbiBjb25zZWN1dGl2ZSBjYWxscyBhbmQgaXMgdGhlcmVmb3JlIHJhdGhlcgogIHByZWRpY3RhYmxlLiBJbiBnZW5lcmFsLCBwcmVkaWN0YWJpbGl0eSBvZiBETlMgVHJhbnNhY3Rpb24gSUQgaXMgYSB3ZWxsCiAga25vd24gc2VjdXJpdHkgcHJvYmxlbSAoZS5nLgogIGh0dHA6Ly9iYWsuc3BjLm9yZy9kbXMvYXJjaGl2ZS9kbnNfaWRfYXR0YWNrLnR4dCkgYW5kIG1ha2VzIGEgYy1hcmVzIGJhc2VkCiAgaW1wbGVtZW50YXRpb24gdnVsbmVyYWJsZSB0byBETlMgcG9pc29uaW5nLiBDcmVkaXQgZ29lcyB0byBBbWl0IEtsZWluCiAgKFRydXN0ZWVyKSBmb3IgaWRlbnRpZnlpbmcgdGhpcyBwcm9ibGVtLgoKICBUaGUgcGF0Y2ggSSB3cm90ZSBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYSBtb3JlIHNlY3VyZSB3YXkgb2YKICBnZW5lcmF0aW5nIHVuaXF1ZSBJRHMuIEl0IHN0YXJ0cyBieSBvYnRhaW5pbmcgYSBrZXkgd2l0aCByZWFzb25hYmxlIGVudHJvcHkKICB3aGljaCBpcyB1c2VkIHdpdGggYW4gUkM0IHN0cmVhbSB0byBnZW5lcmF0ZSB0aGUgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlCiAgdHJhbnNhY3Rpb24gSURzLgoKICBOb3RlIHRoYXQgdGhlIGtleSBnZW5lcmF0aW9uIGNvZGUgKGluIGFyZXNfaW5pdDpyYW5kb21pemVfa2V5KSBoYXMgdHdvCiAgdmVyc2lvbnMsIHRoZSBXaW5kb3dzIHNwZWNpZmljIG9uZSB1c2VzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2FmZSBmdW5jdGlvbgogIHByb3ZpZGVkIChidXQgdW5kb2N1bWVudGVkIDopIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIChkZXNjcmliZWQgYXQKICBodHRwOi8vYmxvZ3MubXNkbi5jb20vbWljaGFlbF9ob3dhcmQvYXJjaGl2ZS8yMDA1LzAxLzE0LzM1MzM3OS5hc3B4KS4gIFRoZQogIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgbmFpdmUgYW5kIHVzZXMgdGhlIHN0YW5kYXJkICdyYW5kJwogIGZ1bmN0aW9uLiBTdXJlbHkgYSBiZXR0ZXIgd2F5IHRvIGdlbmVyYXRlIHJhbmRvbSBrZXlzIGV4aXN0cyBmb3Igb3RoZXIKICBwbGF0Zm9ybXMuCgogIFRoZSBwYXRjaCBjYW4gYmUgdGVzdGVkIGJ5IHVzaW5nIHRoZSBhZGlnIHV0aWxpdHkgYW5kIHVzaW5nIHRoZSAnLXMnIG9wdGlvbi4KCi0gQnJhZCBIb3VzZSBhZGRlZCBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpIHRoYXQgY2FuIGJlCiAgdXNlZCB0byBrZWVwIG9wdGlvbnMgZm9yIGxhdGVyIHJlLXVzYWwgd2hlbiBhcmVzX2luaXRfb3B0aW9ucygpIGlzIHVzZWQuCiAgCiAgUHJvYmxlbTogQ2FsbGluZyBhcmVzX2luaXQoKSBmb3IgZWFjaCBsb29rdXAgY2FuIGJlIHVubmVjZXNzYXJpbHkgcmVzb3VyY2UKICAgICAgICAgaW50ZW5zaXZlLiAgT24gd2luZG93cywgaXQgbXVzdCBMb2FkTGlicmFyeSgpIG9yIHNlYXJjaCB0aGUgcmVnaXN0cnkKICAgICAgICAgb24gZWFjaCBjYWxsIHRvIGFyZXNfaW5pdCgpLiAgT24gdW5peCwgaXQgbXVzdCByZWFkIGFuZCBwYXJzZQogICAgICAgICBtdWx0aXBsZSBmaWxlcyB0byBvYnRhaW4gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgSW4KICAgICAgICAgYSBzaW5nbGUtdGhyZWFkZWQgZW52aXJvbm1lbnQsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gb25seQogICAgICAgICBhcmVzX2luaXQoKSBvbmNlLCBidXQgaW4gYSBoZWF2aWx5IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LCBpdCBpcwogICAgICAgICB1bmRlc2lyYWJsZSB0byBhcmVzX2luaXQoKSBhbmQgYXJlc19kZXN0cm95KCkgZm9yIGVhY2ggdGhyZWFkIGNyZWF0ZWQKICAgICAgICAgYW5kIHRyYWNrIHRoYXQuCgogIFNvbHV0aW9uOiBDcmVhdGUgYXJlc19zYXZlX29wdGlvbnMoKSBhbmQgYXJlc19kZXN0cm95X29wdGlvbnMoKSBmdW5jdGlvbnMgdG8KICAgICAgICAgcmV0cmlldmUgYW5kIGZyZWUgb3B0aW9ucyBvYnRhaW5lZCBmcm9tIGFuIGluaXRpYWxpemVkIGNoYW5uZWwuICBUaGUKICAgICAgICAgb3B0aW9ucyBwb3B1bGF0ZWQgY2FuIGJlIHVzZWQgdG8gcGFzcyBiYWNrIGludG8gYXJlc19pbml0X29wdGlvbnMoKSwKICAgICAgICAgaXQgc2hvdWxkIHBvcHVsYXRlIGFsbCBuZWVkZWQgZmllbGRzIGFuZCBub3QgcmV0cmlldmUgYW55IGluZm9ybWF0aW9uCiAgICAgICAgIGZyb20gdGhlIHN5c3RlbS4gIFByb2JhYmx5IHdpc2UgdG8gZGVzdHJveSB0aGUgY2FjaGUgZXZlcnkgbWludXRlIG9yCiAgICAgICAgIHNvIHRvIHByZXZlbnQgdGhlIGRhdGEgZnJvbSBiZWNvbWluZyBzdGFsZS4KCi0gRGFuaWVsIFMgYWRkZWQgYXJlc19wcm9jZXNzX2ZkKCkgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGFzayBmb3IgcHJvY2Vzc2luZwogIG9uIHNwZWNpZmljIHNvY2tldHMgYW5kIHRodXMgYXZvaWRpbmcgc2VsZWN0KCkgYW5kIGFzc29jaWF0ZWQKICBmdW5jdGlvbnMvbWFjcm9zLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgdXBjb21pbmcgbGliY3VybCByZWxlYXNlcwogIGZvciB0aGlzIHZlcnkgcmVhc29uLiBJdCBhbHNvIG1hZGUgbWUgZXhwb3J0IHRoZSBhcmVzX3NvY2tldF90IHR5cGUgaW4gdGhlCiAgcHVibGljIGFyZXMuaCBoZWFkZXIgZmlsZSwgc2luY2UgYXJlc19wcm9jZXNzX2ZkKCkgdXNlcyB0aGF0IHR5cGUgZm9yIHR3byBvZgogIHRoZSBhcmd1bWVudHMuCgoqIE1heSAyNSAyMDA3CgotIFJhdmkgUHJhdGFwIGZpeGVkIGEgZmxhdyBpbiB0aGUgaW5pdF9ieV9yZXNvbHZfY29uZigpIGZ1bmN0aW9uIGZvciB3aW5kb3dzCiAgdGhhdCBjb3VsZCBjYXVzZSBpdCB0byByZXR1cm4gYSBiYWQgcmV0dXJuIGNvZGUuCgoqIEFwcmlsIDE2IDIwMDcKCi0gWWFuZyBUc2U6IFByb3ZpZGUgYXJlc19nZXRvcHQoKSBjb21tYW5kLWxpbmUgcGFyc2VyIGZ1bmN0aW9uIGFzIGEgc291cmNlCiAgY29kZSBoZWxwZXIgZnVuY3Rpb24sIG5vdCBiZWxvbmdpbmcgdG8gdGhlIGFjdHVhbCBjLWFyZXMgbGlicmFyeS4KCiogRmVicnVhcnkgMTkgMjAwNwoKLSBWbGFkIERpbnVsZXNjdSBhZGRlZCBhcmVzX3BhcnNlX25zX3JlcGx5KCkuCgoqIEZlYnJ1YXJ5IDEzIDIwMDcKCi0gWWFuZyBUc2U6IEZpeCBmYWlsdXJlIHRvIGdldCB0aGUgc2VhcmNoIHNlcXVlbmNlIG9mIC9ldGMvaG9zdHMgYW5kCiAgRE5TIGZyb20gL2V0Yy9uc3N3aXRjaC5jb25mLCAvZXRjL2hvc3QuY29uZiBvciAvZXRjL3N2Yy5jb25mIHdoZW4KICAvZXRjL3Jlc29sdi5jb25mIGRpZCBub3QgZXhpc3Qgb3Igd2FzIHVuYWJsZSB0byByZWFkIGl0LgoKKiBOb3ZlbWJlciAyMiAyMDA2CgotIEluc3RhbGwgYXJlc19kbnMuaCB0b28KCi0gTWljaGFlbCBXYWxsbmVyIGZpeGVkIHRoaXMgcHJvYmxlbTogV2hlbiBJIHNldCBkb21haW5zIGluIHRoZSBvcHRpb25zCiAgc3RydWN0LCBhbmQgdGhlcmUgYXJlIGRvbWFpbi9zZWFyY2ggZW50cmllcyBpbiAvZXRjL3Jlc29sdi5jb25mLCB0aGUgZG9tYWlucwogIG9mIHRoZSBvcHRpb25zIHN0cnVjdCB3aWxsIGJlIG92ZXJyaWRkZW4uCgoqIE5vdmVtYmVyIDYgMjAwNgoKLSBZYW5nIFRzZSByZW1vdmVkIGEgY291cGxlIG9mIHBvdGVudGlhbCB6ZXJvIHNpemUgbWVtb3J5IGFsbG9jYXRpb25zLgoKLSBBbmRyZWFzIFJpZWtlIGZpeGVkIHRoZSBsaW5lIGVuZGluZ3MgaW4gdGhlIGFyZXNsaWIuZHNwIGZpbGUgdGhhdCBJIChEYW5pZWwpCiAgYnJva2UgaW4gdGhlIDEuMy4yIHJlbGVhc2UuIFdlIHNob3VsZCBzd2l0Y2ggdG8gYSBzeXN0ZW0gd2hlcmUgdGhhdCBmaWxlIGlzCiAgYXV0by1nZW5lcmF0ZWQuIFdlIGNvdWxkIHJpcCBzb21lIGNvZGUgZm9yIHRoYXQgZnJvbSBjdXJsLi4uCgpWZXJzaW9uIDEuMy4yIChOb3ZlbWJlciAzLCAyMDA2KQoKKiBPY3RvYmVyIDEyIDIwMDYKCi0gUHJldmVudCBhcmVzX2dldHNvY2soKSB0byBvdmVyZmxvdyBpZiBtb3JlIHRoYW4gMTYgc29ja2V0cyBhcmUgdXNlZC4KCiogU2VwdGVtYmVyIDExIDIwMDYKCi0gR3VpbGhlcm1lIEJhbGVuYSBWZXJzaWFuaTogSSBub3RlZCBhIHN0cmFuZ2UgQlVHIGluIFdpbjMyIHBvcnQKICAoYXJlc19pbml0LmMvZ2V0X2lwaGxwYXBpX2Ruc19pbmZvKCkgZnVuY3Rpb24pOiB3aGVuIEkgZGlzYWJsZSB0aGUgbmV0d29yawogIGJ5IGhhbmQgb3IgZGlzY29ubmVjdCB0aGUgbmV0d29yayBjYWJsZSBpbiBXaW5kb3dzIDIwMDAgb3IgV2luZG93cyBYUCwgbXkKICBhcHBsaWNhdGlvbiBnZXRzIDEyNy4wLjAuMSBhcyB0aGUgb25seSBuYW1lIHNlcnZlci4gVGhlIHByb2JsZW0gY29tZXMgZnJvbQogICdHZXROZXR3b3JrUGFyYW1zJyBmdW5jdGlvbiwgdGhhdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgIiIgYXMgdGhlIG9ubHkKICBuYW1lIHNlcnZlciBpbiB0aGF0IGNhc2UuIE1vcmVvdmVyLCB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZgogIGluZXRfYWRkcigpIHJldHVybnMgSU5BRERSX0xPT1BCQUNLIGluc3RlYWQgb2YgSU5BRERSX05PTkUuCgoqIEF1Z3VzdCAyOSAyMDA2CgotIEJyYWQgU3BlbmNlciBkaWQKCiAgbyBtYWRlIGFyZXNfdmVyc2lvbi5oIHVzZSBleHRlcm4gIkMiIGZvciBjKysgY29tcGlsZXJzCiAgbyBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBhcmVzX2dldG5hbWVpbmZvLmMKICBvIGZpeGVkIGEgYnVmZmVyIHBvc2l0aW9uIGluaXQgZm9yIFRDUCByZWFkcwoKKiBBdWd1c3QgMyAyMDA2CgotIFJhdmkgUHJhdGFwIGZpeGVkIGFyZXNfZ2V0c29jaygpIHRvIGFjdHVhbGx5IHJldHVybiB0aGUgcHJvcGVyIGJpdG1hcCBhbmQKICBub3QgYWx3YXlzIHplcm8hCgpWZXJzaW9uIDEuMy4xIChKdW5lIDI0LCAyMDA2KQoKKiBKdWx5IDIzLCAyMDA2CgotIEdpc2xlIFZhbmVtIGFkZGVkIGdldG9wdCgpIHRvIHRoZSBhaG9zdCBwcm9ncmFtLiBDdXJyZW50bHkgYWNjZXB0cwogIG9ubHkgWy10IHthfGFhYWF9XSB0byBzcGVjaWZ5IGFkZHJlc3MgZmFtaWx5IGluIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpLgoKKiBKdW5lIDE5LCAyMDA2CgotICh3YWhlcm4pIFJlbW92ZWQgImJpZyBlbmRpYW4iIEROUyBzZWN0aW9uIGFuZCBSUiBkYXRhIGludGVnZXIgcGFyc2VyCiAgbWFjcm9zIGZyb20gYXJlc19kbnMuaCwgd2hpY2ggYnJlYWsgYy1hcmVzIG9uIG15IFNwYXJjNjQuIEJpdC13aXNlCiAgb3BlcmF0aW9ucyBpbiBDIG9wZXJhdGUgb24gbG9naWNhbCB2YWx1ZXMuIEFuZCBpbiBhbnkgZXZlbnQgdGhlIG9jdGV0cyBhcmUKICBhbHJlYWR5IGluIGJpZy1lbmRpYW4gKGFrYSBuZXR3b3JrKSBieXRlIG9yZGVyIHNvIHRoZXkncmUgYmVpbmcgcmV2ZXJzZWQKICAodGh1cyB0aGUgc291cmNlIG9mIHRoZSBicmVha2FnZSkuCgoqIEp1bmUgMTgsIDIwMDYKCi0gV2lsbGlhbSBBaGVybiBoYW5kbGVzIEVBR0FJTi9FV09VTERCTE9DSyBlcnJvcnMgaW4gbW9zdCBvZiB0aGUgSS9PIGNhbGxzCiAgZnJvbSBhcmVhX3Byb2Nlc3MuYy4KCiAgVE9ETzogSGFuZGxlIG9uZSBsYXN0IEVBR0FJTiBmb3IgYSBVRFAgc29ja2V0IHNlbmQoMikgaW4KICBhcmVzX19zZW5kX3F1ZXJ5KCkuCgoqIE1heSAxMCwgMjAwNgoKLSBCcmFtIE1hdHRoeXMgYnJvdWdodCBteSBhdHRlbnRpb24gdG8gYSBsaWJ0b29sIHBlY3VsaWFyaXR5IHdoZXJlIGRldGVjdGluZwogIHRoaW5ncyBzdWNoIGFzIEMrKyBjb21waWxlciBhY3R1YWxseSBpcyBhIGJhZCB0aGluZyBhbmQgc2luY2Ugd2UgZG9uJ3QgbmVlZAogIHRoYXQgZGV0ZWN0aW9uIEkgYWRkZWQgYSB3b3JrLWFyb3VuZCwgbXVjaCBpbnNwaXJlZCBieSBhIHByZXZpb3VzIHBhdGNoIGJ5CiAgUGFvbG8gQm9uemluaS4gVGhpcyBhbHNvIHNob3J0ZW5zIHRoZSBjb25maWd1cmUgc2NyaXB0IHF1aXRlIGEgbG90LgoKKiBNYXkgMywgMjAwNgoKLSBOaWNrIE1hdGhld3NvbiBhZGRlZCB0aGUgQVJFU19PUFRfU09DS19TVEFURV9DQiBvcHRpb24gdGhhdCB3aGVuIHNldCBtYWtlcwogIGMtYXJlcyBjYWxsIGEgY2FsbGJhY2sgb24gc29ja2V0IHN0YXRlIGNoYW5nZXMuIEEgYmV0dGVyIHdheSB0aGFuIHRoZQogIGFyZXNfZ2V0c29jaygpIHRvIGdldCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgc29ja2V0IHN0YXRlLgoKKiBKYW51YXJ5IDksIDIwMDYKCi0gQWxleGFuZGVyIExhemljIGltcHJvdmVkIHRoZSBnZXRzZXJ2Ynlwb3J0X3IoKSBjb25maWd1cmUgY2hlY2suCgoqIEphbnVhcnkgNiwgMjAwNgoKLSBBbGV4YW5kZXIgTGF6aWMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYnVpbGRjb25mIHNob3VsZCB1c2UgdGhlIEFDTE9DQUxfRkxBR1MKICB2YXJpYWJsZSBmb3IgZWFzaWVyIGNvbnRyb2xsaW5nIHdoYXQgaXQgZG9lcyBhbmQgaG93IGl0IHJ1bnMuCgoqIEphbnVhcnkgNSwgMjAwNgoKLSBKYW1lcyBCdXJzYSBmaXhlZCBjLWFyZXMgdG8gZmluZCB0aGUgaG9zdHMgZmlsZSBvbiBSSVNDIE9TLCBhbmQgbWFkZSBpdAogIGJ1aWxkIHdpdGggbmV3ZXIgZ2NjIHZlcnNpb25zIHRoYXQgbm8gbG9uZ2VyIGRlZmluZXMgInJpc2NvcyIuCgoqIERlY2VtYmVyIDIyCgotIERhbmllbCBTdGVuYmVyZyBhZGRlZCBhcmVzX2dldHNvY2soKSB0aGF0IGV4dHJhY3RzIHRoZSBzZXQgb2Ygc29ja2V0cyB0bwogIHdhaXQgZm9yIGFjdGlvbiBvbi4gU2ltaWxhciB0byBhcmVzX2ZkcygpIGJ1dCBub3QgcmVzdHJpY3RlZCB0byB1c2luZwogIHNlbGVjdCgpIGZvciB0aGUgd2FpdGluZy4KCiogTm92ZW1iZXIgMjUKCi0gWWFuZyBUc2UgZml4ZWQgc29tZSBzZW5kKCkgLyByZWN2KCkgY29tcGlsZXIgd2FybmluZ3MKCiogU2VwdGVtYmVyIDE4CgotIEFkZGVkIGNvbnN0YW50cyB0aGF0IHdpbGwgYmUgdXNlZCBieSBhcmVzX2dldGFkZHJpbmZvCgotIE1hZGUgYXJlc19nZXRuYW1laW5mbyB1c2UgdGhlIHJlZW50cmFudCBnZXRzZXJ2Ynlwb3J0IChnZXRzZXJ2Ynlwb3J0X3IpIGlmIGl0CiAgaXMgYXZhaWxhYmxlIHRvIGVuc3VyZSBpdCB3b3JrcyBwcm9wZXJseSBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LgoKKiBTZXB0ZW1iZXIgMTAKCi0gY29uZmlndXJlIGZpeCBmb3IgZGV0ZWN0aW5nIGEgbWVtYmVyIGluIHRoZSBzb2NrYWRkcl9pbjYgc3RydWN0IHdoaWNoIGZhaWxlZAogIG9uIGlwdjYtZW5hYmxlZCBIUC1VWCAxMS4wMAoKVmVyc2lvbiAxLjMuMCAoQXVndXN0IDI5LCAyMDA1KQoKKiBBdWd1c3QgMjEKCi0gQWxmcmVkbyBUdXBvbmUgcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBXaW5kb3dzIGNvZGUgaW4gZ2V0X2lwaGxwYXBpX2Ruc19pbmZvKCkKICB3aGVuIGdldHRpbmcgdGhlIEROUyBzZXJ2ZXIgZXRjLgoKKiBKdW5lIDE5CgotIEFkZGVkIHNvbWUgY2hlY2tzIGZvciB0aGUgYWRkcmluZm8gc3RydWN0dXJlLgoKKiBKdW5lIDIKCi0gV2lsbGlhbSBBaGVybjoKCiAgTWFrZSBVRFAgc29ja2V0cyBub24tYmxvY2tpbmcuIEkndmUgY29uZmlybWVkIHRoYXQgYXQgbGVhc3Qgb24gTGludXggMi40IGEKICByZWFkIGV2ZW50IGNhbiBjb21lIGJhY2sgZnJvbSBwb2xsKCkgb24gYSB2YWxpZCBTT0NLX0RHUkFNIHNvY2tldCBidXQKICByZWN2KDIpIHdpbGwgc3RpbGwgYmxvY2suIFRoaXMgcGF0Y2ggZG9lc24ndCBpZ25vcmUgRUFHQUlOIGluCiAgcmVhZF91ZHBfcGFja2V0cygpLCB0aG91Z2ggbWF5YmUgaXQgc2hvdWxkLiAoVGhpcyBwYXRjaCB3YXMgZWRpdGVkIGJ5IERhbmllbAogIFN0ZW5iZXJnIGFuZCBhIG5ldyBjb25maWd1cmUgdGVzdCB3YXMgYWRkZWQgKGltcG9ydGVkIGZyb20gY3VybCdzIGNvbmZpZ3VyZSkKICB0byBwcm9wZXJseSBkZXRlY3Qgd2hhdCBub24tYmxvY2tpbmcgc29ja2V0IGFwcHJvYWNoIHRvIHVzZS4pCgogIEknbSBub3QgcXVpdGUgc3VyZSBob3cgdGhpcyB3YXMgaGFwcGVuaW5nLCBidXQgSSd2ZSBiZWVuIHNlZWluZyBQVFIgcXVlcmllcwogIHdoaWNoIHNlZW0gdG8gcmV0dXJuIGVtcHR5IHJlc3BvbnNlcy4gQXQgbGVhc3QsIHRoZXkgd2VyZSBlbXB0eSB3aGVuIGNhbGxpbmcKICBhcmVzX2V4cGFuZF9uYW1lKCkgb24gdGhlIHJlY29yZC4gSGVyZSdzIGEgcGF0Y2ggd2hpY2ggZ3VhcmFudGVlcyB0bwogIE5VTC10ZXJtaW5hdGUgdGhlIGV4cGFuZGVkIG5hbWUuIFRoZSBvbGQgYmVoYXZpb3IgZmFpbGVkIHRvIE5VTC10ZXJtaW5hdGUgaWYKICBsZW4gd2FzIDAsIGFuZCB0aGlzIHdhcyBjYXVzaW5nIHN0cmxlbigpIHRvIHJ1biBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgogIGFmdGVyIGNhbGxpbmcgYXJlc19leHBhbmRfbmFtZSgpIGFuZCBnZXR0aW5nIEFSRVNfU1VDQ0VTUyBhcyB0aGUgcmV0dXJuCiAgdmFsdWUuIElmIHEgaXMgbm90IGdyZWF0ZXIgdGhhbiAqcyB0aGVuIGl0J3MgZXF1YWwgYW5kICpzIGlzIGFsd2F5cwogIGFsbG9jYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBieXRlLgoKKiBNYXkgMTYKCi0gQWRkZWQgYXJlc19nZXRuYW1laW5mbyB3aGljaCBtaW1pY3MgdGhlIGdldG5hbWVpbmZvIEFQSSAoYW5vdGhlciBmZWF0dXJlCiAgdGhhdCBjb3VsZCB1c2UgdGVzdGluZykuCgoqIE1heSAxNAoKLSBBZGRlZCBhbiBpbmV0X250b3AgZnVuY3Rpb24gZnJvbSBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaXQuCgoqIEFwcmlsIDkKCi0gTWFkZSBzb3J0bGlzdCBzdXBwb3J0IElQdjYgKHRoaXMgY2FuIHByb2JhYmx5IHVzZSBzb21lIHRlc3RpbmcpLgoKLSBNYWRlIHNvcnRsaXN0IHN1cHBvcnQgQ0lEUiBtYXRjaGluZyBmb3IgSVB2NC4KCiogQXByaWwgOAoKLSBBZGRlZCBwcmVsaW1pbmFyeSBJUHY2IHN1cHBvcnQgdG8gYXJlc19nZXRob3N0YnluYW1lLiBDdXJyZW50bHksIHNvcnRsaXN0CiAgZG9lcyBub3Qgd29yayB3aXRoIElQdjYuIEFsc28gcHJvdmlkZWQgYW4gaW1wbGVtZW50YXRpb24gb2YgYml0bmNtcCBmcm9tCiAgQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwbHkgdGhpcyBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gYWRkCiAgSVB2NiBzdXBwb3J0IHRvIHNvcnRsaXN0LgoKLSBNYWRlIGFyZXNfZ2V0aG9zdGJ5YWRkciBzdXBwb3J0IElQdjYgYnkgc3BlY2lmeWluZyBBRl9JTkVUNiBhcyB0aGUgZmFtaWx5LgogIFRoZSBmdW5jdGlvbiBjYW4gbG9va3VwIElQdjYgYWRkcmVzc2VzIGJvdGggZnJvbSBmaWxlcyAoL2V0Yy9ob3N0cykgYW5kCiAgRE5TIGxvb2t1cHMuCgoqIEFwcmlsIDcKCi0gVHVwb25lIEFsZnJlZG8gZml4ZWQgaW5jbHVkZXMgb2YgYXJwYS9uYW1lc2VyX2NvbXBhdC5oIHRvIGJ1aWxkIGZpbmUgb24gTWFjCiAgT1MgWC4KCiogQXByaWwgNQoKLSBEb21pbmljayBNZWdsaW86IFByb3ZpZGVkIGltcGxlbWVudGF0aW9ucyBvZiBpbmV0X25ldF9wdG9uIGFuZCBpbmV0X3B0b24KICBmcm9tIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3QgaW5jbHVkZSB0aGVzZSBmdW5jdGlvbnMuCgoqIE1hcmNoIDExLCAyMDA1CgotIERvbWluaWNrIE1lZ2xpbyBhZGRlZCBhcmVzX3BhcnNlX2FhYWFfcmVwbHkuYyBhbmQgZGlkIHZhcmlvdXMKICBhZGp1c3RtZW50cy4gVGhlIGZpcnN0IGxpdHRsZSBzdGVwcyB0b3dhcmRzIElQdjYgc3VwcG9ydCEKCiogTm92ZW1iZXIgNwoKLSBGaXhlZCB0aGUgVkMgcHJvamVjdCBhbmQgbWFrZWZpbGUgdG8gdXNlIGFyZXNfY2FuY2VsIGFuZCBhcmVzX3ZlcnNpb24KCiogT2N0b2JlciAyNAoKLSBUaGUgcmVsZWFzZWQgYXJlc192ZXJzaW9uLmggZnJvbSAxLjIuMSBzYXlzIDEuMi4wIGR1ZSB0byBhIG1ha2V0Z3ogZmxhdy4KICBUaGlzIGlzIG5vdyBmaXhlZC4KClZlcnNpb24gMS4yLjEgKE9jdG9iZXIgMjAsIDIwMDQpCgoqIFNlcHRlbWJlciAyOQoKLSBIZW5yaWsgU3RvZXJuZXIgZml4OiBnb3QgYSByZXBvcnQgdGhhdCBUcnU2NCBVbml4ICh0aGUgdW5peCBmcm9tIERpZ2l0YWwKICB3aGVuIHRoZXkgbWFkZSBBbHBoYSdzKSB1c2VzIC9ldGMvc3ZjLmNvbmYgZm9yIHRoZSBwdXJwb3NlIGZpeGVkIGJlbG93IGZvcgogIG90aGVyIE9TZXMuIEhlIG1hZGUgYy1hcmVzIGNoZWNrIGZvciBhbmQgdW5kZXJzdGFuZCBpdCBpZiBwcmVzZW50LgoKLSBOb3cgYy1hcmVzIHdpbGwgdXNlIGxvY2FsIGhvc3QgbmFtZSBsb29rdXAgX2JlZm9yZV8gRE5TIHJlc29sdmluZyBieSBkZWZhdWx0CiAgaWYgbm90aGluZyBlbHNlIGlzIHRvbGQuCgoqIFNlcHRlbWJlciAyNgoKLSBIZW5yaWsgU3RvZXJuZXI6IGZvdW5kIG91dCB0aGF0IGMtYXJlcyBkb2VzIG5vdCBsb29rIGF0IHRoZSAvZXRjL2hvc3QuY29uZgogIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCB0byBzZWFyY2ggL2V0Yy9ob3N0cyBhbmQgRE5TLiAgU28gb24KICBzeXN0ZW1zIHdoZXJlIHRoaXMgb3JkZXIgaXMgZGVmaW5lZCBieSAvZXRjL2hvc3QuY29uZiBpbnN0ZWFkIG9mIGEgImxvb2t1cCIKICBlbnRyeSBpbiAvZXRjL3Jlc29sdi5jb25mLCBjLWFyZXMgd2lsbCBhbHdheXMgZGVmYXVsdCB0byBsb29raW5nIGluIEROUwogIGZpcnN0LCBhbmQgL2V0Yy9ob3N0cyBzZWNvbmQuCgogIGMtYXJlcyBub3cgbG9va3MgYXQKCiAgMSkgcmVzb2x2LmNvbmYgKGZvciB0aGUgImxvb2t1cCIgbGluZSk7CiAgMikgbnNzd2l0Y2guZm9uIChmb3IgdGhlICJob3N0czoiIGxpbmUpOwogIDMpIGhvc3QuY29uZiAoZm9yIHRoZSAib3JkZXIiIGxpbmUpLgoKICBGaXJzdCBtYXRjaCB3aW5zLgoKLSBEb21pbmljayBNZWdsaW8gcGF0Y2hlZDogQy1hcmVzIG9uIFdpbmRvd3MgYXNzdW1lZCB0aGF0IHRoZSBIT1NUUyBmaWxlIGlzCiAgbG9jYXRlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbi4gSXQgYXNzdW1lZAogIEM6XFdpbmRvd3NcU3lzdGVtMzJcRHJpdmVyc1xFdGMuIFRoaXMgaXMgYSBwb29yIGFzc3VtcHRpb24gdG8gbWFrZS4gSW4gZmFjdCwKICB0aGUgbG9jYXRpb24gb2YgdGhlIEhPU1RTIGZpbGUgY2FuIGJlIGNoYW5nZWQgdmlhIGEgcmVnaXN0cnkgc2V0dGluZy4KCiAgVGhlcmUgaXMgYSBrZXkgY2FsbGVkIERhdGFiYXNlUGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIEhPU1RTCiAgZmlsZToKICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdGVjaG5ldC9pdHNvbHV0aW9ucy9uZXR3b3JrL2RlcGxveS9kZXBvdmcvdGNwaXAyay5tc3B4CgogIFRoZSBwYXRjaCB3aWxsIG1ha2UgYy1hcmVzIGNvcnJlY3RseSBjb25zdWx0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGxvY2F0aW9uCiAgb2YgdGhpcyBmaWxlLgoKKiBBdWd1c3QgMjkKCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIE1TVkMgYnVpbGQgZmlsZXMuCgoqIEF1Z3VzdCAyMAoKLSBHaXNsZSBWYW5lbSBtYWRlIGMtYXJlcyBidWlsZCBhbmQgd29yayB3aXRoIGhpcyBXYXR0LTMyIFRDUC9JUCBzdGFjay4KCiogQXVndXN0IDEzCgotIEhhcnNoYWwgUHJhZGhhbiBtYWRlIGEgbWlub3Igc3ludGF4IGNoYW5nZSBpbiBhcmVzX2luaXQuYyB0byBtYWtlIGl0IGJ1aWxkCiAgZmluZSB3aXRoIE1TVkMgNy4xCgoqIEp1bHkgMjQKCi0gTWFkZSB0aGUgbGliIGdldCBidWlsdCBzdGF0aWMgb25seSBpZiAtLWVuYWJsZS1kZWJ1ZyBpcyB1c2VkLgoKLSBHaXNsZSBWYW5lbSBmaXhlZDoKCiAgQmFzaWNhbGx5IGluIGxvb3BzIGxpa2UgaGFuZGxlX2Vycm9ycygpLCAncXVlcnktPm5leHQnIHdhcyBhc3NpZ25lZCBhIGxvY2FsCiAgdmFyaWFibGUgYW5kIHRoZW4gcXVlcnkgd2FzIHJlZmVyZW5jZWQgYWZ0ZXIgdGhlIG1lbW9yeSB3YXMgZnJlZWQgYnkKICBuZXh0X3NlcnZlcigpLiBJJ3ZlIGNoYW5nZWQgdGhhdCBzbyBuZXh0X3NlcnZlcigpIGFuZCBlbmRfcXVlcnkoKSByZXR1cm5zCiAgdGhlIG5leHQgcXVlcnkuIFNvIGNhbGxlcnMgc2hvdWxkIHVzZSB0aGlzIHJldC12YWx1ZS4KCiAgVGhlIG5leHQgcHJvYmxlbSB3YXMgdGhhdCAnc2VydmVyLT50Y3BfYnVmZmVyX3BvcycgaGFkIGEgcmFuZG9tIHZhbHVlIGF0CiAgZW50cnkgdG8gMXN0IHJlY3YoKSAobHVja2lseSBjYXVzaW5nIFdpbnNvY2sgdG8gcmV0dXJuIEVOT0JVRlMpLgoKICBJJ3ZlIGFsc28gYWRkZWQgYSBhcmVzX3dyaXRldigpIGZvciBXaW5kb3dzIHRvIHN0cmVhbWxpbmUgdGhlIGNvZGUgYSBiaXQKICBtb3JlLgoKKiBKdWx5IDIwCi0gRml4ZWQgYSBmZXcgdmFyaWFibGUgcmV0dXJuIHR5cGVzIGZvciBzb21lIHN5c3RlbSBjYWxscy4gTWFkZSBjb25maWd1cmUKICBjaGVjayBmb3Igc3NpemVfdCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGF0IHdoZW4gcmVjZWl2aW5nIHRoZSBzZW5kKCkKICBlcnJvciBjb2RlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgc3lzdGVtcy4KCi0gTWFkZSBjb25maWd1cmUgY3JlYXRlIGNvbmZpZy5oLCBhbmQgYWxsIHNvdXJjZSBmaWxlcyBub3cgaW5jbHVkZSBzZXR1cC5oIHRoYXQKICBtaWdodCBpbmNsdWRlIHRoZSBwcm9wZXIgY29uZmlnLmggKG9yIGEgaGFuZGljcmFmdGVkIGFsdGVybmF0aXZlKS4KCi0gU3dpdGNoZWQgdG8gJ2FyZXNfc29ja2V0X3QnIHR5cGUgZm9yIHNvY2tldHMgaW4gYXJlcywgc2luY2UgV2luZG93cyBkb24ndAogIHVzZSAnaW50JyBmb3IgdGhhdC4KCi0gYXV0b21ha2UtaWZpZWQgYW5kIGxpYm9vbC1pZmllZCBjLWFyZXMuIE5vdyBpdCBidWlsZHMgbGliY2FyZXMgYXMgYSBzaGFyZWQKICBsaWIgb24gbW9zdCBwbGF0Zm9ybXMgaWYgd2FudGVkLiAoVGhpcyBibG9hdGVkIHRoZSBzaXplIG9mIHRoZSByZWxlYXNlCiAgYXJjaGl2ZSB3aXRoIGFub3RoZXIgMjAwSyEpCgotIE1ha2VmaWxlLmFtIG5vdyB1c2VzIE1ha2VmaWxlLmluYyBmb3IgdGhlIGMgc291cmNlcywgaCBoZWFkZXJzIGFuZCBtYW4KICBwYWdlcywgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIG90aGVyIG1ha2VmaWxlcyB0byB1c2UgdGhlIGV4YWN0IHNhbWUgc2V0IG9mCiAgZmlsZXMuCgotIEFkanVzdGVkICdtYWtldGd6JyB0byB1c2UgdGhlIG5ldyBhdXRvbWFrZSBtYWdpYyB3aGVuIGJ1aWxkaW5nIGRpc3RyaWJ1dGlvbgogIGFyY2hpdmVzLgoKLSBBbnlvbmUgZGVzaXJlcyBIVE1MIGFuZC9vciBQREYgdmVyc2lvbnMgb2YgdGhlIG1hbiBwYWdlcyBpbiB0aGUgcmVsZWFzZQogIGFyY2hpdmVzPwoKKiBKdWx5IDMKLSBH/G50ZXIgS25hdWYgbWFkZSBjLWFyZXMgYnVpbGQgYW5kIHJ1biBvbiBOb3ZlbGwgTmV0d2FyZS4KCiogSnVseSAxCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgTWFrZWZpbGUuZGogdG8gYnVpbGQgd2l0aCBkamdwcCwgYWRkZWQgYSBmZXcgbW9yZSBkamdwcAogIGZpeGVzIGFuZCBtYWRlIGFyZXMgbm90IHVzZSAnZXJybm8nIHRvIHByb3ZpZGUgZnVydGhlciBpbmZvIG9uIFdpbmRvd3MuCgoqIEp1bmUgMzAKLSBHaXNsZSBWYW5lbSBtYWRlIGl0IGJ1aWxkIHdpdGggZGpncHAgYW5kIHJ1biBmaW5lIHdpdGggdGhlIFdhdHQtMzIgc3RhY2suCgoqIEp1bmUgMTAKLSBHaXNsZSBWYW5lbSdzIGluaXQgcGF0Y2ggZm9yIFdpbmRvd3M6CgogIFRoZSBpbml0X2J5X3Jlc29sdl9jb25mKCkgZnVuY3Rpb24gZmV0Y2hlcyB0aGUgRE5TLXNlcnZlcihzKQogIGZyb20gYSBzZXJpZXMgb2YgcmVnaXN0cnkgYnJhbmNoZXMuCgogIFRoaXMgY2FuIGJlIHdyb25nIGluIHRoZSBjYXNlIHdoZXJlIERIQ1AgaGFzIGFzc2lnbmVkIG5hbWVzZXJ2ZXJzLCBidXQgdGhlCiAgdXNlciBoYXMgb3ZlcnJpZGRlbiB0aGVzZSBzZXJ2ZXJzIHdpdGggb3RoZXIgcHJlZmVyZWQgc2V0dGluZ3MuIFRoZW4gaXQncwogIHdyb25nIHRvIHVzZSB0aGUgREhDUE5BTUVTRVJWRVIgc2V0dGluZyBpbiByZWdpc3RyeS4KCiAgSW4gdGhlIGNhc2Ugb2Ygbm8gZ2xvYmFsIERIQ1AtYXNzaWduZWQgb3IgZml4ZWQgc2VydmVycywgYnV0IEROUyBzZXJ2ZXIocykKICBwZXIgYWRhcHRlciwgb25lIGhhcyB0byBxdWVyeSB0aGUgYWRhcHRlciBicmFuY2hlcy4gIEJ1dCBob3cgY2FuIGMtYXJlcyBrbm93CiAgd2hpY2ggYWRhcHRlciBpcyB2YWxpZCBmb3IgdXNlPyBBRkFJQ1MgaXQgY2FuJ3QuIFRoZXJlIGNvdWxkIGJlIG9uZSBhZGFwdGVyCiAgdGhhdCBpcyBkb3duIChlLmcuIGEgVlBOIGFkYXB0ZXIpLgoKICBTbyBpdCdzIGJldHRlciB0byBsZWF2ZSB0aGlzIHRvIHRoZSBJUCBIZWxwZXIgQVBJIChpcGhsYXBpKSBhdmFpbGFibGUgaW4KICBXaW4tOTgvMjAwMCBhbmQgbGF0ZXIuIE15IHBhdGNoIGZhbGxzLWJhY2sgdG8gdGhlIG9sZCB3YXkgaWYgbm90IGF2YWlsYWJsZS4KCiogSnVuZSA4Ci0gSmFtZXMgQnVyc2EgZml4ZWQgYW4gaW5pdCBpc3N1ZSBmb3IgUklTQyBPUy4KCiogTWF5IDExCi0gTmljbyBTdGFwcGVuYmVsdCByZXBvcnRlZCB0aGF0IHdoZW4gcHJvY2Vzc2luZyBkb21haW4gYW5kIHNlYXJjaCBsaW5lcyBpbgogIHRoZSByZXNvbHYuY29uZiBmaWxlLCB0aGUgZmlyc3QgZW50cnkgZW5jb3VudGVyZWQgaXMgcHJvY2Vzc2VkIGFuZCB1c2VkIGFzCiAgdGhlIHNlYXJjaCBsaXN0LiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCBwYWdlcyBmb3IgYm90aCBMaW51eCwgU29sYXJpcyBhbmQKICBUcnU2NCwgdGhlIGxhc3QgZW50cnkgb2YgZWl0aGVyIGEgZG9tYWluIG9yIGEgc2VhcmNoIGZpZWxkIGlzIHVzZWQuCgogIFRoaXMgaXMgbm93IGFkanVzdGVkIGluIHRoZSBjb2RlCgpWZXJzaW9uIDEuMi4wIChBcHJpbCAxMywgMjAwNCkKCiogQXByaWwgMiwgMjAwNAotIFVwZGF0ZWQgdmFyaW91cyBtYW4gcGFnZXMgdG8gbG9vayBuaWNlciB3aGVuIGNvbnZlcnRlZCB0byBIVE1MIG9uIHRoZSB3ZWIKICBzaXRlLgoKKiBBcHJpbCAxLCAyMDA0Ci0gRGlyayBNYW5za2UgcHJvdmlkZWQgYSBuZXcgZnVuY3Rpb24gdGhhdCBpcyBub3cgbmFtZWQgYXJlc19jYW5jZWwoKS4gSXQgaXMKICB1c2VkIHRvIGNhbmNlbC9jbGVhbnVwIGEgcmVzb2x2ZS9yZXF1ZXN0IG1hZGUgdXNpbmcgYXJlcyBmdW5jdGlvbnMgb24gdGhlCiAgZ2l2ZW4gYXJlcyBjaGFubmVsLiBJdCBkb2VzIG5vdCBkZXN0cm95L2tpbGwgdGhlIGFyZXMgY2hhbm5lbCBpdHNlbGYuCgotIERvbWluaWNrIE1lZ2xpbyBjbGVhbmVkIHVwIHRoZSBmb3JtYXR0aW5nIGluIHNldmVyYWwgbWFuIHBhZ2VzLgoKKiBNYXJjaCAzMCwgMjAwNAotIERvbWluaWNrIE1lZ2xpbydzIG5ldyBhcmVzX2V4cGFuZF9zdHJpbmcuIEEgaGVscGVyIGZ1bmN0aW9uIHdoZW4gZGVjb2RpbmcKICBpbmNvbWluZyBETlMgcGFja2FnZXMuCgotIERhbmllbCBTdGVuYmVyZyBtb2RpZmllZCB0aGUgTWFrZWZpbGUuaW4gdG8gdXNlIGEgZm9yIGxvb3AgZm9yIHRoZSBtYW4gcGFnZQogIGluc3RhbGxhdGlvbiB0byBpbXByb3ZlIG92ZXJ2aWV3IGFuZCBtYWtlIGl0IGVhc2llciB0byBhZGQgbWFuIHBhZ2VzLgoKVmVyc2lvbiAxLjEuMCAoTWFyY2ggMTEsIDIwMDQpCgoqIE1hcmNoIDksIDIwMDQKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBidWlsZCBvbiBXaW5kb3dzLgoKKiBGZWJydWFyeSAyNSwgMjAwNAotIERhbiBGYW5kcmljaCBmb3VuZCBhIGZsYXcgaW4gdGhlIEZlYiAyMiBmaXguCgotIEFkZGVkIGJldHRlciBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgbG9naWMgKHRha2VuIGZyb20gdGhlIGN1cmwgY29uZmlndXJlCiAgc2NyaXB0KS4gQWRkZWQgYWNpbmNsdWRlLm00IHRvIHRoZSB0YXJiYWxsLgoKKiBGZWJydWFyeSAyMywgMjAwNAotIFJlbW92ZWQgYXJlc19mcmVlX2Vycm1lbSgpLCB0aGUgZnVuY3Rpb24sIHRoZSBmaWxlIGFuZCB0aGUgbWFuIHBhZ2UuIEl0IHdhcwogIG5vdCB1c2VkIGFuZCBpdCBkaWQgbm90aGluZy4KCi0gRml4ZWQgYSBsb3Qgb2YgY29kZSB0aGF0IHdhc24ndCAiNjRiaXQgY2xlYW4iIGFuZCB0aHVzIGNhdXNlZCBhIGxvdCBvZgogIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHBpY2t5IGNvbXBpbGVycy4KCiogRmVicnVhcnkgMjIsIDIwMDQKLSBEb21pbmljayBNZWdsaW8gbWFkZSBhcmVzIGluaXQgc3VwcG9ydCBtdWx0aXBsZSBuYW1lIHNlcnZlcnMgaW4gdGhlCiAgTmFtZVNlcnZlciBrZXkgb24gV2luZG93cy4KCiogRmVicnVhcnkgMTYsIDIwMDQKLSBNb2RpZmllZCBhcmVzX3ByaXZhdGUuaCB0byBpbmNsdWRlIGxpYmN1cmwncyBtZW1vcnkgZGVidWcgaGVhZGVyIGlmCiAgQ1VSTERFQlVHIGlzIHNldC4gVGhpcyBtYWtlcyBhbGwgdGhlIGFyZXMtZnVuY3Rpb25zIHN1cGVydmlzZWQgcHJvcGVybHkgYnkKICB0aGUgY3VybCB0ZXN0IHN1aXRlLiBUaGlzIGFsc28gZm9yY2VkIG1lIHRvIGFkZCBpbmNsdXNpb24gb2YgdGhlCiAgYXJlc19wcml2YXRlLmggaGVhZGVyIGluIGEgZmV3IG1vcmUgZmlsZXMgdGhhdCBhcmUgdXNpbmcgc29tZSBraW5kIG9mCiAgbWVtb3J5LXJlbGF0ZWQgcmVzb3VyY2VzLgoKLSBNYWRlIHRoZSBtYWtlZmlsZSBvbmx5IGJ1aWxkIGFob3N0IGFuZCBhZGlnIGlmICdtYWtlIGRlbW9zJyBpcyB1c2VkLgoKKiBGZWJydWFyeSAxMCwgMjAwNAotIERpcmsgTWFuc2tlIG1hZGUgYXJlc192ZXJzaW9uLmggaW5zdGFsbGVkIHdpdGggJ21ha2UgaW5zdGFsbCcKCiogRmVicnVhcnkgNCwgMjAwNAotIGFyZXNfZnJlZV9lcnJtZW0oKSBpcyBzdWJqZWN0IGZvciByZW1vdmFsLCBpdCBpcyBzaW1wbHkgcHJlc2VudCBmb3IgZnV0dXJlCiAgcHVycG9zZXMsIGFuZCBzaW5jZSB3ZSByZW1vdmVkIHRoZSBleHRyYSBwYXJhbWV0ZXIgaW4gc3RyZXJyb3IoKSBpdCB3b24ndAogIGJlIHVzZWQgYnkgYy1hcmVzIQotIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyBub3cgZW5hYmxlcyBwaWNreSBjb21waWxlciBvcHRpb25zIGlmIGdjYyBpcyB1c2VkCi0gZml4ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyAtLWVuYWJsZS1kZWJ1ZyBzaG93ZWQgYW5kIEpvZXJnIE11ZWxsZXItVG9sawogIHJlcG9ydGVkCgpWZXJzaW9uIDEuMC4wIChGZWJydWFyeSAzLCAyMDA0KQoKKiBGZWJydWFyeSAzLCAyMDA0Ci0gbm93IHdlIHByb2R1Y2UgdGhlIGxpYmNhcmVzLmEgbGlicmFyeSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBsaWJhcmVzLmEKICBzaW5jZSB3ZSBhcmUgbm8gbG9uZ2VyIGNvbXBhdGlibGUKCiogRmVicnVhcnkgMiwgMjAwNAoKLSBhcmVzX3N0cmVycm9yKCkgaGFzIG9uZSBhcmd1bWVudCBsZXNzLiBUaGlzIGlzIHRoZSBmaXJzdCBvZmZpY2lhbAogIG1vZGlmaWNhdGlvbiBvZiB0aGUgZXhpc3RpbmcgcHJvdmlkZWQgYXJlcyBBUEkuCgoqIEphbnVhcnkgMjksIDIwMDQKCi0gRGlyayBNYW5za2UgZml4ZWQgaG93IHRoZSBzb2NrZXQgaXMgc2V0IG5vbi1ibG9ja2luZy4KCiogSmFudWFyeSA0LCAyMDA0CgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIHRoZSBwcml2YXRlIGdldHRpbWVvZmRheSgpIGJlY29tZSBhcmVzX2dldHRpbWVvZmRheSgpCiAgaW5zdGVhZCBpbiBvcmRlciB0byBub3QgcG9sbHV0ZSB0aGUgbmFtZSBzcGFjZSBhbmQgcmlzayBjb2xsaWRpbmcgd2l0aAogIG90aGVyIGxpYnJhcmllcycgdmVyc2lvbnMgb2YgdGhpcyBmdW5jdGlvbi4KCiogT2N0b2JlciAyNCwgMjAwMy4gRGFuaWVsIFN0ZW5iZXJnCgogIEFkZGVkIGFyZXNfdmVyc2lvbigpLgoKVmVyc2lvbiAxLjAtcHJlMSAoOCBPY3RvYmVyIDIwMDMpCgotIEphbWVzIEJ1cnNhIG1hZGUgaXQgcnVuIG9uIFJJU0MgT1MKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgaXQgcnVuIGZpbmUgb24gTlQ0CgotIER1bmNhbiBXaWxjb3ggbWFkZSBpdCB3b3JrIGZpbmUgb24gTWFjIE9TIFgKCi0gRGFuaWVsIFN0ZW5iZXJnIGFkanVzdGVkIHRoZSB3aW5kb3dzIHBvcnQKCi0gbGlyZW4gYXQgdml2aXNpbW8uY29tIG1hZGUgdGhlIGluaXRpYWwgd2luZG93cyBwb3J0CgoqIEltcG9ydGVkIHRoZSBzb3VyY2VzIGZyb20gYXJlcyAxLjEuMQo=