MC40NyAtIFRodXJzIERlYyA4IDIwMDUKCi0gU0VDVVJJVFk6IGZpeCBmb3IgYnVmZmVyIGFsbG9jYXRpb24gZXJyb3IgaW4gc2VydmVyIGNvZGUsIGNvdWxkIHBvdGVudGlhbGx5CiAgYWxsb3cgYXV0aGVudGljYXRlZCB1c2VycyB0byBnYWluIGVsZXZhdGVkIHByaXZpbGVnZXMuIEFsbCBtdWx0aS11c2VyIHN5c3RlbXMKICBydW5uaW5nIHRoZSBzZXJ2ZXIgc2hvdWxkIHVwZ3JhZGUgKG9yIGFwcGx5IHRoZSBwYXRjaCBhdmFpbGFibGUgb24gdGhlCiAgRHJvcGJlYXIgd2VicGFnZSkuCgotIEZpeCBjaGFubmVsIGhhbmRsaW5nIGNvZGUgc28gdGhhdCByZWRpcmVjdGluZyB0byAvZGV2L251bGwgZG9lc24ndCB1c2UKICAxMDAlIENQVS4KCi0gVHVybiBvbiB6bGliIGNvbXByZXNzaW9uIGZvciBkYmNsaWVudC4KCi0gU2V0ICJsb3cgZGVsYXkiIFRPUyBiaXQsIGNhbiBzaWduaWZpY2FudGx5IGltcHJvdmUgaW50ZXJhY3Rpdml0eQogIG92ZXIgc29tZSBsaW5rcy4KCi0gQWRkZWQgY2xpZW50IGtleWJvYXJkLWludGVyYWN0aXZlIG1vZGUgc3VwcG9ydCwgYWxsb3dzIG9wZXJhdGlvbiB3aXRoCiAgbmV3ZXIgT3BlblNTSCBzZXJ2ZXJzIGluIGRlZmF1bHQgY29uZmlnLgoKLSBMb2cgd2hlbiBwdWJrZXkgYXV0aCBmYWlscyBiZWNhdXNlIG9mIGJhZCB+Ly5zc2gvYXV0aG9yaXplZF9rZXlzIHBlcm1pc3Npb25zCgotIEltcHJvdmUgbG9nZ2luZyBvZiBhc3NlcnRpb25zCgotIEFkZGVkIGFlcy0yNTYgY2lwaGVyIGFuZCBzaGExLTk2IGhtYWMuCgotIEZpeCB0d29maXNoIHNvIHRoYXQgaXQgYWN0dWFsbHkgd29ya3MuCgotIEltcHJvdmUgUEFNIHByb21wdCBjb21wYXJpc29uLgoKLSBBZGRlZCAtZyAoZGJjbGllbnQpIGFuZCAtYSAoZHJvcGJlYXIgc2VydmVyKSBvcHRpb25zIHRvIGFsbG93CiAgY29ubmVjdGlvbnMgdG8gbGlzdGVuaW5nIGZvcndhcmRlZCBwb3J0cyBmcm9tIHJlbW90ZSBtYWNoaW5lcy4KCi0gVmFyaW91cyBvdGhlciBtaW5vciBmaXhlcwoKLSBDb21waWxlIGZpeGVzIGZvciBnbGliYyAyLjEgKHNzX2ZhbWlseSB2cyBfX3NzX2ZhbWlseSkgYW5kIE5ldEJTRAogIChuZXRpbmV0L2luX3N5c3RtLmggbmVlZHMgdG8gYmUgaW5jbHVkZWQpLgoKMC40NiAtIFNhdCBKdWx5IDkgMjAwNQoKLSBGaXggbG9uZy1zdGFuZGluZyBidWcgd2hpY2ggY2F1c2VkIGNvbm5lY3Rpb25zIHRvIGJlIGNsb3NlZCBpZiBhbiBzc2gtYWdlbnQKICBzb2NrZXQgd2FzIG5vIGxvbmdlciBhdmFpbGFibGUKCi0gUHJpbnQgYSB3YXJuaW5nIGlmIHdlIHNlZW0gdG8gYmUgYmxvY2tpbmcgb24gL2Rldi9yYW5kb20gCiAgKHN1Z2dlc3RlZCBieSBQYXVsIEZveCkKCi0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBEU1MgY29kZSAodGhhbmtzIHRvIEJvcmlzIEJlcmV6b3Zza3kgZm9yIHRoZSBwYXRjaCkKCi0gZGJjbGllbnQgLUwgbm8gbG9uZ2VyIHNlZ2ZhdWx0cywgYWxsb2NhdGUgY29ycmVjdCBidWZmZXIgc2l6ZSAodGhhbmtzCiAgdG8gRGF2aWQgQ29vayBmb3IgcmVwb3J0aW5nIGl0LCBhbmQgQ2hyaXN0b3BoZXIgRmF5bG9yIGZvciBpbmRlcGVuZGVudGx5CiAgc2VuZGluZyBpbiBhIHBhdGNoKQoKLSBBZGRlZCBSU0EgYmxpbmRpbmcgdG8gc2lnbmluZyBjb2RlIChzdWdnZXN0ZWQgYnkgRGFuIEthbWluc2t5KQoKLSBSZWFycmFuZ2VkIGJpZ251bSByZWFkaW5nL3JhbmRvbSBnZW5lcmF0aW9uIGNvZGUKCi0gUmVzZXQgdGhlIG5vbi1ibG9ja2luZyBzdGF0dXMgb24gc3RkZXJyIGFuZCBzdGRvdXQgYXMgd2VsbCBhcyBzdGRpbiwKICBmaXhlcyBhIHByb2JsZW0gd2hlcmUgdGhlIHNoZWxsIHJ1bm5pbmcgZGJjbGllbnQgd2lsbCBleGl0ICh0aGFua3MgdG8gCiAgQnJlbnQgUm9tYW4gZm9yIHJlcG9ydGluZyBpdCkKCi0gRml4IHNvIHRoYXQgYWxsIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZCBzbyB0aGUgY2hpbGQgc2hlbGwgZG9lc24ndAogIGluaGVyaXQgZGVzY3JpcHRvcnMgKHRoYW5rcyB0byBMaW5kZW4gTWF5IGZvciB0aGUgcGF0Y2gpCgotIENoYW5nZSBzaWdua2V5LmMgdG8gYXZvaWQgZ2NjIDQgZ2VuZXJhdGluZyBpbmNvcnJlY3QgY29kZQoKLSBBZnRlciBib3RoIHNpZGVzIG9mIGEgZmlsZSBkZXNjcmlwdG9yIGhhdmUgYmVlbiBzaHV0ZG93bigpLCBjbG9zZSgpCiAgaXQgdG8gYXZvaWQgbGVha2luZyBkZXNjcmlwdG9ycyAodGhhbmtzIHRvIEFyaSBIeXR0aW5lbiBmb3IgYSBwYXRjaCkKCi0gVXBkYXRlIHRvIExpYlRvbUNyeXB0IDEuMDUgYW5kIExpYlRvbU1hdGggMC4zNQoKMC40NSAtIE1vbiBNYXJjaCA3IDIwMDUKCi0gTWFrZWZpbGUgbm8gbG9uZ2VyIGFwcGVuZHMgJ3N0YXRpYycgdG8gc3RhdGljYWxseSBsaW5rZWQgYmluYXJpZXMKCi0gQWRkIG9wdGlvbmFsIFNTSF9BU0tQQVNTIHN1cHBvcnQgdG8gdGhlIGNsaWVudAoKLSBSZXNwZWN0IEhPU1RfTE9PS1VQIG9wdGlvbgoKLSBGaXggYWNjaWRlbnRhbGx5IHJlbW92ZWQgInJldHVybjsiIHN0YXRlbWVudCB3aGljaCB3YXMgcmVtb3ZlZCBpbiAwLjQ0CiAgKGNhdXNpbmcgY2xpZW50cyB3aGljaCBzZW50IGFuIGVtcHR5IHRlcm1pbmFsLW1vZGVzIHN0cmluZyB0byBmYWlsIHRvCiAgY29ubmVjdCAtIGluY2x1ZGluZyBwc3NoLCBzc2guY29tLCBkYW5nZXIgaGlwdG9wKS4gKHBhdGNoZXMKICBpbmRlcGVuZGVudGx5IGZyb20gUGF1bCBGb3gsIERhdmlkIEhvcndpdHQgYW5kIFN2ZW4tT2xhIFR1ZWNrZSkKCi0gUmVhZCAieS9uIiByZXNwb25zZSBmb3IgZmluZ2VycHJpbnRzIGZyb20gL2Rldi90dHkgZGlyZWN0bHkgc28gdGhhdCBkYmNsaWVudAogIHdpbGwgd29yayB3aXRoIHNjcC4KCjAuNDQgLSBNb24gSmFuIDMgMjAwNQoKLSBTRUNVUklUWTogRml4IGZvciBQQU0gYXV0aCBzbyB0aGF0IHVzZXJuYW1lcyBhcmUgbG9nZ2VkIGFuZCBjb252ZXJzYXRpb24KICBmdW5jdGlvbiByZXNwb25zZXMgYXJlIGFsbG9jYXRlZCBjb3JyZWN0bHkgLSBhbGwgMC40NHRlc3Q0IHVzZXJzIHdpdGggUEFNCiAgY29tcGlsZWQgaW4gKG5vdCBkZWZhdWx0KSBhcmUgYWR2aXNlZCB0byB1cGdyYWRlLgoKLSBGaXggY2FsbHMgdG8gZ2V0bmFtZWluZm8oKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNvbGFyaXMKCi0gUHJpc3RpbmUgY29tcGlsYXRpb24gd29ya3MgKHJ1biAnY29uZmlndXJlJyBmcm9tIGEgZnJlc2ggZGlyIGFuZCBtYWtlIGl0CiAgdGhlcmUpCgotIEZpeGVzIGZvciBjb21waWxpbmcgd2l0aCBtb3N0IG9wdGlvbnMgZGlzYWJsZWQuCgotIFVwZ3JhZGVkIHRvIExpYlRvbUNyeXB0IDAuOTkgYW5kIExpYlRvbU1hdGggMC4zMgoKLSBNYWtlIHN1cmUgdGhhdCB6ZXJvaW5nIG91dCBvZiB2YWx1ZXMgaW4gTFRNIGFuZCBMVEMgd29uJ3QgZ2V0IG9wdGltaXNlZCBhd2F5CgotIFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9ucyBmcm9tIGxvZ2lucmVjLmMKCi0gL2Rldi9yYW5kb20gaXMgbm93IHRoZSBkZWZhdWx0IGVudHJvcHkgc291cmNlIHJhdGhlciB0aGFuIC9kZXYvdXJhbmRvbQoKLSBMb2dnaW5nIG9mIElQcyBpbiBhdXRoIHN1Y2Nlc3MvZmFpbHVyZSBtZXNzYWdlcyBmb3IgaW1wcm92ZWQgZ3JlcHBhYmlsaXR5CgotIEZpeCBkYmNsaWVudCBzbyB0aGF0ICJzY3AgLWkga2V5ZmlsZSIgd29ya3MuIChJdCBjYW4gaGFuZGxlICItaWtleWZpbGUKICBwcm9wZXJseSkKCi0gQXZvaWQgYSByYWNlIGluIHNlcnZlciBzaGVsbC1oYW5kbGluZyBjb2RlIHdoaWNoIHByZXZlbnRzIHRoZSBleGl0LWNvZGUKICBmcm9tIGJlaW5nIHJldHVybmVkIHRvIHRoZSBjbGllbnQgaW4gc29tZSBjaXJjdW1zdGFuY2VzLgoKLSBNYWtlZmlsZSBtb2RpZmllZCBzbyB0aGF0IGluc3RhbGwgdGFyZ2V0IHdvcmtzIGNvcnJlY3RseSAoZG9lc24ndCB0cnkKICB0byBpbnN0YWxsICJhbGwiIGJpbmFyeSkgLSBwYXRjaCBmcm9tIEp1ZXJnZW4gRGF1YmVydAoKLSBWYXJpb3VzIG1pbm9yIGZpeGVzIGFuZCBjb21waWxlIHdhcm5pbmdzLgoKMC40NHRlc3Q0IC0gVHVlIFNlcHQgMTQgMjAwNCAyMToxNTo1NCArMDgwMAoKLSBGaXggaW5ldGQgbW9kZSBzbyBpdCBhY3R1YWxseSBsb2FkcyB0aGUgaG9zdGtleXMgKG9vcHMpCgotIENoYW5nZWQgRFJPUEJFQVJfREVGUE9SVCBwcm9wZXJseSBldmVyeXdoZXJlCgotIEZpeCBhIHNtYWxsIG1lbW9yeSBsZWFrIGluIHRoZSBhdXRoIGNvZGUKCi0gV0NPUkVEVU1QIGlzIG9ubHkgdXNlZCBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgaXQgKGllIG5vdCBjeWd3aW4gb3IgQUlYKQoKLSBDaGVjayAoYW5kIGZhaWwgZm9yKSBjYXNlcyB3aGVuIHdlIGNhbid0IG5lZ290aWF0ZSBhbGdvcml0aG1zIHdpdGggdGhlCiAgcmVtb3RlIHNpZGUgc3VjY2Vzc2Z1bGx5IChyYXRoZXIgdGhhbiBib21iaW5nIG91dCB1bmdyYWNlZnVsbHkpCgotIEhhbmRsZSBhdXRob3JpemVkX2tleXMgZmlsZXMgd2l0aG91dCBhIHRlcm1pbmF0aW5nIG5ld2xpbmUKCi0gRmlkZGxlIHRoZSBjaGFubmVsIHJlY2VpdmUgd2luZG93IHNpemUgZm9yIHBvc3NpYmx5IGJldHRlciBwZXJmb3JtYW5jZQoKLSBBZGRlZCBpbiB0aGUgUEFNIGF1dGhlbnRpY2F0aW9uIGNvZGUgKGZpbmFsbHkhIHRoYW5rcyB0byBNYXJ0aW4gQ2FybHNzb24pCgowLjQ0dGVzdDMgLSBGcmkgQXVnIDI3IDIyOjIwOjU0ICswODAwCgotIEZpeGVkIGEgYnVuY2ggb2Ygd2FybmluZ3MuCgotIHNjcCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBwYXNzZWQgYSB1c2VybmFtZSAoZml4IGZvciB0aGUgZGJjbGllbnQgcHJvZ3JhbQogIGl0c2VsZiBhcyB3ZWxsLCAiLWxtYXR0IiB3b3JrcyBhcyB3ZWxsIGFzICItbCBtYXR0IikuCgotIFJlbW92ZSB1bnJlcXVpcmVkIGRlYmlhbiBmaWxlcwoKLSBFeGl0IHdpdGggdGhlIHJlbW90ZSBwcm9jZXNzJ3MgcmV0dXJuIGNvZGUgZm9yIGRiY2xpZW50CgotIERpc3BsYXkgc3RkZXJyIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlciBpbiB0aGUgY2xpZW50CgotIEFkZCBjaXJjdWxhciBidWZmZXJpbmcgdG8gdGhlIGNoYW5uZWwgY29kZS4gVGhpcyBzaG91bGQgZHJhbWF0aWNhbGx5IHJlZHVjZQogIHRoZSBhbW91bnQgb2YgYmFja3RyYWZmaWMgc2VudCBpbiByZXNwb25zZSB0byB0cmFmZmljIGluY29taW5nIHRvIHRoZQogIERyb3BiZWFyIGVuZCAtIGltcHJvdmVzIGhpZ2gtbGF0ZW5jeSBwZXJmb3JtYW5jZSAoaWUgZGlhbHVwKS4KCi0gVmFyaW91cyBvdGhlciByZWxhdGVkIGNoYW5uZWwtaGFuZGxpbmcgZml4dXBzLgoKLSBBbGxvdyBsZWFkaW5nIGxpbmVzIGluIHRoZSBiYW5uZXIgd2hlbiBjb25uZWN0aW5nIHRvIHNlcnZlcnMKCi0gRml4ZWQgcHJpbnRpbmcgb3V0IGVycm9ycyBvbnRvIHRoZSBuZXR3b3JrIHNvY2tldCB3aXRoIHN0ZGVyciAoZm9yIGluZXRkCiAgbW9kZSB3aGVuIHVzaW5nIHhpbmV0ZCkKCi0gUmVtb3ZlIG9ic2VsZXRlIGRvY3VtZW50YXRpb24KCi0gRml4IGEgbnVsbC1wb2ludGVyIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBmcmVlIG5vbi1leGlzdGFudCBsaXN0ZW5lcnMKICBhdCBjbGVhbnVwLgoKLSBERUJVR19UUkFDRSBub3cgb25seSB3b3JrcyBpZiB5b3UgYWRkICItdiIgdG8gdGhlIHByb2dyYW0gY29tbWFuZGxpbmUKCi0gRG9uJ3QgbGVhdmUgc3RkaW4gbm9uLWJsb2NraW5nIG9uIGV4aXQgLSB0aGlzIGNhdXNlZCB0aGUgcGFyZW50IHNoZWxsCiAgb2YgZGJjbGllbnQgdG8gY2xvc2Ugd2hlbiBkYmNsaWVudCBleGl0ZWQsIGZvciBzb21lIHNoZWxscyBpbiBCdXN5Qm94CgotIFNlcnZlciBjb25uZWN0aW9ucyBubyBsb25nZXIgdGltZW91dCBhZnRlciA1IG1pbnV0ZXMKCi0gRml4ZWQgc3R1cGlkIERTUyBob3N0a2V5IHR5cG8gKHNlcnZlciBjb3VsZG4ndCBsb2FkIGhvc3Qga2V5cykKCjAuNDR0ZXN0MiAtIFR1ZXMgQXVnIDE3IDIwMDQgMTc6NDM6NTQgKzA4MDAKCi0gRml4IHVwIGRyb3BiZWFybXVsdGkgdGFyZ2V0cyBpbiB0aGUgTWFrZWZpbGUgLSBzeW1saW5rcyBhcmUgbm93IGNyZWF0ZWQKCi0gQ29tcGlsZSBmYWtlLXJmYzI1NTMgZXZlbiB3aXRoIGRyb3BiZWFyY29udmVydC9kcm9wYmVhcmtleSAtIHRoaXMgCiAgYWxsb3dzIHRoZW0gdG8gd29yayBvbiBwbGF0Zm9ybXMgd2l0aG91dCBhIG5hdGl2ZSBnZXRhZGRyaW5mbygpCgotIENyZWF0ZSB+Ly5zc2gva25vd25faG9zdHMgcHJvcGVybHkgaWYgaXQgZG9lc24ndCBleGlzdAoKLSBGaXggYmFzZW5hbWUoKSBmdW5jdGlvbiBwcm90b3R5cGUKCi0gQmFja3BvcnQgc29tZSBsb2NhbCBjaGFuZ2VzIChtb3JlICNpZmRlZnMgZm9yIHRlcm1jb2Rlcy5jLCBhIGZpeCBmb3IgbWlzc2luZwogIGRlZmluZXMgb24gQUlYKS4KCi0gTGV0IGRiY2xpZW50IGJlIHJ1biBhcyAic3NoIgoKLSBJbml0aWFsaXNlIG1wX2ludHMgYnkgZGVmYXVsdAoKMC40NHRlc3QxIC0gU3VuIEF1ZyAxNiAyMDA1IDE3OjQzOjU0ICswODAwCgotIFRFU1RJTkcgUkVMRUFTRSAtIHRoaXMgaXMgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIHRoZSBjbGllbnQgY29kZWJhc2UsCiAgc28gdGhlcmUgYXJlIHN1cmUgdG8gYmUgYnVncyB0byBiZSBmb3VuZC4gSW4gYWRkaXRpb24sIGlmIHlvdSdyZSBqdXN0IHVzaW5nCiAgdGhlIHNlcnZlciBwb3J0aW9uLCB0aGUgZmluYWwgYmluYXJ5IHNpemUgcHJvYmFibHkgd2lsbCBpbmNyZWFzZSAtIEknbGwKICBiZSB0cnlpbmcgdG8gZ2V0IGl0IGJhY2sgZG93biBpbiBmdXR1cmUgcmVsZWFzZXMuCgotIERyb3BiZWFyIGNsaWVudCBhZGRlZCAtIGxvdHMgb2YgY2hhbmdlcyB0byB0aGUgc2VydmVyIGNvZGUgYXMgd2VsbCB0byAKICBnZW5lcmFsaXNlIHRoaW5ncwoKLSBJUHY2IHN1cHBvcnQgYWRkZWQgZm9yIGNsaWVudCwgc2VydmVyLCBhbmQgZm9yd2FyZGluZwoKLSBOZXcgbWFrZWZpbGUgd2l0aCBtb3JlIGdlbmVyaWMgc3VwcG9ydCBmb3IgbXVsdGlwbGUtcHJvZ3JhbSBiaW5hcmllcwoKMC40MyAtIEZyaSBKdWwgMTYgMjAwNCAxNzo0NDo1NCArMDgwMAoKLSBTRUNVUklUWTogRG9uJ3QgdHJ5IHRvIGZyZWUoKSB1bmluaXRpYWxpc2VkIHZhcmlhYmxlcyBpbiBEU1MgdmVyaWZpY2F0aW9uCiAgY29kZS4gVGhhbmtzIHRvIEFybmUgQmVybmluIGZvciBwb2ludGluZyBvdXQgdGhpcyBidWcuIFRoaXMgaXMgcG9zc2libHkKICBleHBsb2l0YWJsZSwgYWxsIHVzZXJzIHdpdGggRFNTIGFuZCBwdWJrZXktYXV0aCBjb21waWxlZCBpbiBhcmUgYWR2aXNlZCB0bwogIHVwZ3JhZGUuCgotIENsZWFuIHVwIGFnZW50IGZvcndhcmRpbmcgc29ja2V0IGZpbGVzIGNvcnJlY3RseSwgcGF0Y2ggZnJvbSBHZXJyaXQgUGFwZS4KCi0gRG9uJ3QgZ28gaW50byBhbiBpbmZpbml0ZSBsb29wIHdoZW4gcG9ydGZvcndhcmRpbmcgdG8gc2VydmVycyB3aGljaCBkb24ndAogIHNlbmQgYW55IGluaXRpYWwgZGF0YS9iYW5uZXIuIFBhdGNoIGZyb20gTmlrb2xhIFZsYWRvdgoKLSBGaXggZm9yIG5ldHdvcmsgdnMuIGhvc3QgYnl0ZSBvcmRlciBpbiBsb2dnaW5nIHJlbW90ZSBUQ1AgcG9ydHMsIGFsc28KICBmcm9tIEdlcnJpdCBQYXBlLgoKLSBJbml0aWFsaXNlIG1hbnkgcG9pbnRlcnMgdG8gTlVMTCwgZm9yIGdlbmVyYWwgc2FmZXR5LiBBbHNvIGNoZWNrZWQgY2xlYW51cAogIGNvZGUgZm9yIG1wX2ludHMgKHJlbGF0ZWQgdG8gc2VjdXJpdHkgaXNzdWVzIGFib3ZlKS4KCjAuNDIgLSBXZWQgSnVuIDE2IDIwMDQgMTI6NDQ6NTQgKzA4MDAKCi0gVXBkYXRlZCB0byBHZXJyaXQgUGFwZSdzIG9mZmljaWFsIERlYmlhbiBzdWJkaXJlY3RvcnkKCi0gRml4ZWQgYmFkIGNoZWNrIHdoZW4gb3BlbmluZyAvZGV2L3VyYW5kb20gLSB0aGFua3MgdG8gRGFubnkgU3VuZy4KCi0gQWRkZWQgLWkgaW5ldGQgbW9kZSBmbGFnLCBhbmQgYXNzb2NpYXRlZCBvcHRpb25zIGluIG9wdGlvbnMuaCAuIERyb3BiZWFyCiAgY2FuIGJlIGNvbXBpbGVkIHdpdGggZWl0aGVyIG5vcm1hbCBtb2RlLCBpbmV0ZCwgb3IgYm90aCBtb2Rlcy4gVGhhbmtzCiAgdG8gR2Vycml0IFBhcGUgZm9yIGJhc2ljIHBhdGNoIGFuZCBtb3RpdmF0aW9uLgoKLSBVc2UgPGRpcmVudC5oPiByYXRoZXIgdGhhbiA8c3lzL2Rpci5oPiBmb3IgUE9TSVggY29tcGxpYW5jZS4gVGhhbmtzIHRvIEJpbGwKICBTb21tZXJmaWVsZC4KCi0gRml4ZWQgYSBUQ1AgZm9yd2FyZGluZyAoY2xpZW50LWxvY2FsLCAtTCBzdHlsZSkgYnVnIHdoaWNoIGNhdXNlZCB0aGUgd2hvbGUKICBzZXNzaW9uIHRvIGNsb3NlIGlmIHRoZSBUQ1AgY29ubmVjdGlvbiBmYWlsZWQuIFRoYW5rcyB0byBBbmRyZXcgQnJhdW5kIGZvcgogIHJlcG9ydGluZyBpdCBhbmQgaGVscGluZyB0cmFjayBpdCBkb3duLgoKLSBSZS1lbmFibGUgc2lncGlwZSBmb3IgY2hpbGQgcHJvY2Vzc2VzLiBUaGFua3MgdG8gR2Vycml0IFBhcGUgZm9yIHNvbWUKICBzdWdnZXN0aW9ucywgYW5kIEJTRCBtYW5wYWdlcyBmb3IgYSBjbGVhcmVyIGV4cGxhbmF0aW9uIG9mIHRoZSBiZWhhdmlvdXIuCgotIEFkZGVkIG1hbnBhZ2VzLCB0aGFua3MgdG8gR2Vycml0IFBhcGUuCgotIENoYW5nZWQgbGljZW5zZSB0ZXh0IGZvciBMaWJUb21DcnlwdCBhbmQgTGliVG9tTWF0aC4KCi0gQWRkZWQgc3RyaXAtc3RhdGljIHRhcmdldAoKLSBGaXhlZCBhIGJ1ZyBpbiBhZ2VudC1mb3J3YXJkaW5nIGNsZWFudXAgaGFuZGxlciAtIHdvdWxkIHNlZ2ZhdWx0CiAgKGRlcmVmZXJlbmNpbmcgYSBudWxsIHBvaW50ZXIpIGlmIGFnZW50IGZvcndhcmRpbmcgaGFkIGZhaWxlZC4KCi0gRml4IGJlaGF2aW91ciBvZiBhdXRob3JpemVkX2tleXMgcGFyc2luZywgc28gbGFyZ2VyICg+MTAyNCBiaXQpIERTQSBrZXlzIHdpbGwKICB3b3JrLiBUaGFua3MgdG8gRHIuIE1hcmt1cyBXYWxkZWNrIGZvciB0aGUgcmVwb3J0LiAKCi0gRml4ZWQgbG9jYWwgcG9ydCBmb3J3YXJkaW5nIGNvZGUgc28gdGhhdCB0aGUgIi1qIiBvcHRpb24gd2lsbCBtYWtlIGZvcndhcmRpbmcKICBhdHRlbXB0cyBmYWlsIG1vcmUgZ3JhY2VmdWxseS4KCi0gQWxsb3cgcmVwZWF0ZWQgcmVxdWVzdHMgaW4gYSBzaW5nbGUgc2Vzc2lvbiBpZiBwcmV2aW91cyBvbmVzIGZhaWwgLSB0aGlzIGZpeGVzICBQdVRUWSBhbmQgc29tZSBvdGhlciBTQ1AgY2xpZW50cywgd2hpY2ggdHJ5IFNGVFAsIHRoZW4gZmFsbC1iYWNrIHRvIFNDUCBpZiBpdAogIGlzbid0IGF2YWlsYWJsZS4gVGhhbmtzIHRvIFN0aXJsaW5nIFdlc3RydXAgZm9yIHRoZSByZXBvcnQuCgotIFVwZGF0ZWQgdG8gTGliVG9tQ3J5cHQgMC45NiBhbmQgTGliVG9tTWF0aCAwLjMwLiBUaGUgQUVTIGNvZGUgbm93IHVzZXMKICBzbWFsbGVyIG5vbi1wcmVjb21wdXRlZCB0YWJsZXMgaWYgRFJPUEJFQVJfU01BTExfQ09ERSBpcyBkZWZpbmVkIGluCiAgb3B0aW9ucy5oLCBsZWFkaW5nIHRvIGEgc2lnbmlmaWNhbnQgcmVkdWN0aW9uIGluIHRoZSBiaW5hcnkgc2l6ZS4KCjAuNDEgLSBNb24gSmFuIDE5IDIwMDQgMjI6NDA6MTkgKzA4MDAKCi0gRml4IGluIGNvbmZpZ3VyZSBzbyB0aGF0IGNyb3NzLWNvbXBpbGluZyB3b3JrcywgdGhhbmtzIHRvIG51bWVyb3VzIHBlb3BsZSBmb3IKICByZXBvcnRpbmcgYW5kIHRlc3RpbmcKCi0gVGVybWluYWwgbW9kZSBwYXJzaW5nIG5vdyBoYW5kbGVzIGVtcHR5IHRlcm1pbmFsIG1vZGUgc3RyaW5ncyAoc2VudCBieQogIFdpbmRvd3Mgc3NoLmNvbSBjbGllbnRzKSwgdGhhbmtzIHRvIFJpY2FyZG8gRGVyYmVzIGZvciB0aGUgcmVwb3J0CgotIEhhbmRsaW5nIGlzIGltcHJvdmVkIGZvciB1c2VycyB3aXRoIG5vIHNoZWxsIHNwZWNpZmllZCBpbiAvZXRjL3Bhc3N3ZCwKICB0aGFua3MgYWdhaW4gdG8gUmljYXJkbyBEZXJiZXMKCi0gRml4IGZvciBjb21waWxpbmcgd2l0aCAtLWRpc2FibGUtc3lzbG9nLCB0aGFua3MgdG8gZ29yZG9uZmgKCi0gVmFyaW91cyBtaW5vciBmaXhlcyBhbGxvdyBzY3AgdG8gd29yayB3aXRoIGlyaXgsIHRoYW5rcyB0byBQYXVsIE1hcmluY2V1IGZvcgogIGZpeGluZyBpdCB1cAoKLSBVc2UgPHN0cm9wdHMuaD4gbm90IDxzeXMvc3Ryb3B0cy5oPiwgc2luY2UgdGhlIGZvcm1lciBzZWVtcyBtb3JlIGNvbW1vbgoKMC40MCAtIFR1ZSBKYW4gMTMgMjAwNCAyMTowNToxOSArMDgwMAoKLSBSZW1vdGUgVENQIGZvcndhcmRpbmcgKC1SKSBzdHlsZSBpbXBsZW1lbnRlZAoKLSBMb2NhbCBhbmQgcmVtb3RlIFRDUCBmb3J3YXJkaW5nIGNhbiBlYWNoIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgKC1rIGFuZCAtagogIHN3aXRjaGVzKQoKLSBGaXggZm9yIHByb2JsZW1zIGRldGVjdGluZyBvcGVucHR5KCkgd2l0aCB1Q2xpYmMgLSBtYW55IHRoYW5rcyB0byB2YXJpb3VzCiAgcGVvcGxlIGZvciByZXBvcnRpbmcgYW5kIHRlc3RpbmcgZml4ZXMsIGluY2x1ZGluZyAoaW4gcmFuZG9tIG9yZGVyKSBDcmlzdGlhbgogIElvbmVzY3UtSWRib2hybiwgSmFtZXMgRXdpbmcsIFN0ZXZlIERvdmVyLCBUaG9tYXMgTHVuZHF1aXN0IGFuZCBGcmVkZXJpYwogIExhdmVybmhlCgotIEltcHJvdmVkIHBvcnRhYmlsaXR5IGZvciBJUklYLCB0aGFua3MgdG8gUGF1bCBNYXJpbmNldQoKLSBBSVggYW5kIEhQVVggcG9ydGFiaWxpdHkgZml4ZXMsIHRoYW5rcyB0byBEYXJyZW4gVHVja2VyIGZvciBwYXRjaGVzCgotIHBybmdkIHNob3VsZCBub3cgd29yayBjb3JyZWN0bHksIHRoYW5rcyB0byBEYXJyZW4gVHVja2VyIGZvciB0aGUgcGF0Y2gKCi0gc2NwIGNvbXBpbGF0aW9uIG9uIHN5c3RlbXMgd2l0aG91dCBzdHJsY3B5KCkgaXMgZml4ZWQsIHRoYW5rcyB0byBQZXRlcgogIEphbm5lc2VuIGFuZCBEYXZpZCBNdXNlIGZvciByZXBvcnRpbmcgaXQgKGluZGVwZW5kZW50bHkgYW5kIHNpbXVsdGFuZW91c2x5IDopCgotIE1lcmdlZCBpbiBuZXcgTGliVG9tQ3J5cHQgMC45MiBhbmQgTGliVG9tTWF0aCAwLjI4CgowLjM5IC0gVHVlIERlYyAxNiAyMDAzIDE1OjE5OjE5ICswODAwCgotIEJldHRlciBjaGVja2luZyBvZiBrZXkgbGVuZ3RocyBhbmQgcGFyYW1ldGVycyBmb3IgRFNTIGFuZCBSU0EgYXV0aAoKLSBQcmludCBmaW5nZXJwcmludCBvZiBrZXlzIHVzZWQgZm9yIHB1YmtleSBhdXRoCgotIE1vcmUgY29uc2lzdGVudCBsb2dnaW5nIG9mIHVzZXJuYW1lcyBhbmQgSVBzCgotIEFkZGVkIG9wdGlvbiB0byBkaXNhYmxlIHBhc3N3b3JkIGF1dGggKG9yIGp1c3QgZm9yIHJvb3QpIGF0IHJ1bnRpbWUKCi0gQXZvaWQgaW5jbHVkaW5nIGJpZ251bSBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZ2l2ZSBtdWNoIHNwZWVkIGJlbmVmaXQgYnV0CiAgdGFrZSB1cCBiaW5hcnkgc2l6ZQoKLSBBZGRlZCBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiBPcGVuU1NIJ3Mgc2NwIGJpbmFyeQoKLSBBZGRlZCBhZGRpdGlvbmFsIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGZvciBJcml4LCB0aGFua3MgdG8gUGF1bCBNYXJpbmNldQoKLSBEb24ndCBjaGVjayBmb3IgdW51c2VkIGxpYnJhcmllcyBpbiBjb25maWd1cmUgc2NyaXB0CgotIFJlbW92ZWQgdHJhaWxpbmcgY29tbWEgaW4gYWxnb3JpdGhtIGxpc3RzICh0aGFua3MgdG8gTWlobmVhIFN0b2VuZXNjdSkKCi0gRml4ZWQgdXAgY2hhbm5lbCBjbG9zZSBoYW5kbGluZywgYWx3YXlzIHNlbmQgY2xvc2UgcGFja2V0IGluIHJlc3BvbnNlCiAgKGFsc28gdGhhbmtzIHRvIE1paG5lYSBTdG9lbmVzY3UpCgotIFZhcmlvdXMgbWFrZWZpbGUgaW1wcm92ZW1lbnRzIGZvciBjcm9zcy1jb21waWxpbmcsIHRoYW5rcyB0byBGcmllZHJpY2gKICBMb2JlbnN0b2NrIGFuZCBNaWhuZWEgU3RvZW5lc2N1CgotIFVzZSBkYWVtb24oKSBmdW5jdGlvbiBpZiBhdmFpbGFibGUgKG9yIG91ciBvd24gY29weSkgcmF0aGVyIHRoYW4gc2VwYXJhdGUKICBjb2RlICh0aGFua3MgdG8gRnLpZOlyaWMgTGF2ZXJuaGUgZm9yIHRoZSByZXBvcnQgYW5kIGRlYnVnZ2luZywgYW5kIEJlcm5hcmQKICBCbGFja2hhbSBmb3IgaGlzIHN1Z2dlc3Rpb24gb24gd2hhdCB0byBsb29rIGF0KQoKLSBGaXhlZCB1cCBzdXBwb3J0IGZvciBmaXJzdF9rZXhfcGFja2V0X2ZvbGxvd3MsIHJlcXVpcmVkIHRvIHRhbGsgdG8gc3NoLmNvbQogIGNsaWVudHMuIFRoYW5rcyB0byBNYXJpYW4gU3RhZ2FyZXNjdSBmb3IgdGhlIGJ1ZyByZXBvcnQuCgotIEF2b2lkIHVzaW5nIE1BWFBBVEhMRU4sIHBvaW50ZXIgZnJvbSBJYW4gTW9ycmlzCgotIEltcHJvdmVkIGlucHV0IHNhbml0eSBjaGVja2luZwoKMC4zOCAtIFNhdCBPY3QgMTEgMjAwMyAxNjoyODoxMyArMDgwMAoKLSBEZWZhdWx0IGhvc3RrZXkgcGF0aCBjaGFuZ2VkIHRvIC9ldGMvZHJvcGJlYXIvZHJvcGJlYXJfe3JzYSxkc3N9X2hvc3Rfa2V5CiAgcmF0aGVyIHRoYW4gL2V0Yy9kcm9wYmVhcl97cnNhLGRzc31faG9zdF9rZXkKCi0gQWRkZWQgU01BTEwgYW5kIE1VTFRJIHRleHQgZmlsZXMgd2hpY2ggaGF2ZSBpbmZvIG9uIGNvbXBpbGluZyBmb3IgbXVsdGlwbGUKICBiaW5hcmllcyBvciBzbWFsbCBiaW5hcmllcwoKLSBBbGxvdyBmb3IgY29tbWFuZGxpbmUgZGVmaW5pdGlvbiBvZiBzb21lIG9wdGlvbnMuaCBzZXR0aW5ncwogICh3aXRob3V0IHdhcm5pbmdzKQoKLSBCZSBtb3JlIGNhcmVmdWwgaGFuZGxpbmcgRUlOVFIKCi0gTW9yZSBmaXhlcyBmb3IgY2hhbm5lbCBjbG9zaW5nCgotIEFkZGVkIG11bHRpLWJpbmFyeSBzdXBwb3J0CgotIEltcHJvdmVkIGxvZ2dpbmcgb2YgSVBzLCBub3cgZ2V0IGxvZ2dlZCBpbiBhbGwgY2FzZXMKCi0gRG9uJ3QgY2hldyBjcHUgd2hlbiB3YWl0aW5nIGZvciB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHN0cmluZywgYWxzbwogIG1ha2Ugc3VyZSB0aGF0IHdlIGtpY2sgb2ZmIHBlb3BsZSBpZiB0aGV5IGRvbid0IGF1dGggd2l0aGluIDUgbWludXRlcy4KCi0gVmFyaW91cyBzbWFsbCBmaXhlcywgd2FybmluZ3MgZXRjCgotIERpc3BsYXkgTU9URCBpZiByZXF1ZXN0ZWQgLSBzdWdnZXN0ZWQgYnkKICBUcmVudCBMbG95ZCA8bGF0aGlhdCBhdCBzaXhsYWJzLm9yZz4gYW5kCiAgWmFjaCBXaGl0ZSA8endoaXRlIGF0IGRhcmtzdGFyLmZyb3Aub3JnPgoKLSBzZnRwIHN1cHBvcnQgd29ya3MgKHJlbGllcyBvbiBPcGVuU1NIIHNmdHAgYmluYXJ5IG9yIHNpbWlsYXIpCgotIEFkZGVkIC0tZGlzYWJsZS1zaGFkb3cgb3B0aW9uIChyZXF1ZXN0ZWQgYnkgdGhlIGZsb3BweWZ3IGd1eXMpCgowLjM3IC0gV2VkIFNlcHQgMjQgMjAwMyAxOTo0MjoxMiArMDgwMAoKLSBWYXJpb3VzIHBvcnRhYmlsaXR5IGZpeGVzLCBmaXhlcyBmb3IgU29sYXJpcyA5LCBUcnU2NCA1LjEsIE1hYyBPUyBYIDEwLjIsCiAgQUlYLCBCU0RzCgotIFVwZGF0ZWQgTGliVG9tTWF0aCB0byAwLjI3IGFuZCBMaWJUb21DcnlwdCB0byAwLjkwCgotIFJlbmFtZWQgdXRpbC57YyxofSB0byBkYnV0aWwue2MsaH0gdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc3lzdGVtIHV0aWwuaAoKLSBBZGRlZCBzb21lIHNtYWxsIGNoYW5nZXMgc28gaXQnbGwgd29yayB3aXRoIEFJWCAocGx1cyBMaW51eCBBZmZpbml0eSkuCiAgVGhhbmtzIHRvIFNoaWcgZm9yIHRoZW0uCgotIEltcHJvdmVkIHRoZSBjbG9zaW5nIG1lc3NhZ2VzLCBzbyBhIGNsZWFuIGV4aXQgaXMgIkV4aXRlZCBub3JtYWxseSIKCi0gQWRkZWQgc29tZSBtb3JlIHJvYnVzdCBpbnRlZ2VyL3NpemUgY2hlY2tpbmcgaW4gYnVmZmVyLmMgYXMgYSBiYWNrc3RvcCBmb3IKICBpbnRlZ2VyIG92ZXJmbG93cwoKLSBYMTEgZm9yd2FyZGluZyBmaXhlZCBmb3IgT1NYLCBwYXRoIGZvciB4YXV0aCBjaGFuZ2VkIHRvIC91c3IvWDExUjYvYmluL3hhdXRoCgotIENoYW5uZWwgY29kZSBoYW5kbGVzIGNsb3NpbmcgbW9yZSBuaWNlbHksIGRvZXNuJ3Qgc2l0IHdhaXRpbmcgZm9yIGFuIGV4dHJhCiAga2V5c3Ryb2tlIG9uIEJTRC9PU1ggcGxhdGZvcm1zLCBhbmQgZGF0YSBpcyBmbHVzaGVkIGZ1bGx5IGJlZm9yZSBjbG9zaW5nCiAgY2hpbGQgcHJvY2Vzc2VzICh0aGFua3MgdG8gCiAgQ3Jpc3RpYW4gSW9uZXNjdS1JZGJvaHJuIDxjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gYXQgYXhpcy5jb20+IGZvcgogIHBvaW50aW5nIHRoYXQgb3V0KS4KCi0gQ2hhbmdlZCAiRElTQUJMRV9UQ1BGV0QiIHRvICJFTkFCTEVfVENQRldEIiAoYW5kIGZvciB4MTEvYXV0aCkgc28KICAiZGlzYWJsZSBESVNBQkxFX1RDUFdEIiBpc24ndCBzbyBjb25mdXNpbmcuCgotIEZpeCBhdXRob3JpemVkX2tleXMgaGFuZGxpbmcgKGRvbid0IGNyYXNoIG9uIHRvby1sb25nIGtleXMsIGFuZAogIHVzZSBmZ2V0YyBub3QgZ2V0YyB0byBhdm9pZCBzdHJhbmdlIG1hY3JvLXJlbGF0ZWQgaXNzdWVzKSwgdGhhbmtzIHRvCiAgQ3Jpc3RpYW4gSW9uZXNjdS1JZGJvaHJuIDxjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gYXQgYXhpcy5jb20+IAogIGFuZCBTdGV2ZSBSb2RnZXJzIDxod3N0YXIgYXQgY294Lm5ldD4gZm9yIHJlcG9ydGluZyBhbmQgdGVzdGluZy4KCi0gRml4ZXMgdG8gdGhlIFJFQURNRSB3aXRoIHJlZ2FyZCB0byB1Q2xpYmMgc3lzdGVtcywgdGhhbmtzIHRvIAogIENyaXN0aWFuIElvbmVzY3UtSWRib2hybiA8Y3Jpc3RpYW4uaW9uZXNjdS1pZGJvaHJuIGF0IGF4aXMuY29tPiwKICBhcyB3ZWxsIGFzIGdlbmVyYWwgaW1wcm92ZW1lbnRzIHRvIGRvY3VtZW50YXRpb24gKHNwbGl0IFJFQURNRS9JTlNUQUxMKQoKLSBGaXhlZCB1cCBzb21lIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggZHJvcGJlYXJjb252ZXJ0L2Ryb3BiZWFya2V5IGlmCiAgRFNTIG9yIFJTQSB3ZXJlIGRpc2FibGVkLCByZXBvcnRlZCBieSBQYXRyaWsgS2FybHNzb24gPHBhdHJpayBhdCBjcXVyZS5uZXQ+CgotIEZpeCBkb3VibGUtZnJlZSBidWcgZm9yIGhvc3RrZXlzLCByZXBvcnRlZCBieQogIFZpbmNlbnQgU2FuZGVycyA8dmluY2UgYXQga3lsbGlra2kub3JnPgoKLSBGaXggdXAgbWlzc2luZyBcbnMgZnJvbSBkcm9wYmVhcmNvbnZlcnQgaGVscCBtZXNzYWdlLAogIHRoYW5rcyB0byBNb3JkeSBPdml0cyA8bW92aXRzIGF0IGJsb29tYmVyZy5jb20+IGZvciB0aGUgcGF0Y2gKCjAuMzYgLSBUdWUgQXVndXN0IDE5IDIwMDMgMTI6MTY6MjMgKzA4MDAKCi0gRml4IHVuaW5pdGlhbGlzZWQgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIERTUyBzaWduaW5nIGNvZGUKICAodGhhbmtzIHRvIE1hdHRoZXcgRnJhbnogPG1kZnJhbnogYXQgaW8uY29tPiBmb3IgcmVwb3J0aW5nLCBhbmQgdGhlIGF1dGhvcnMKICBvZiBWYWxncmluZCBmb3IgbWFraW5nIGl0IGVhc3kgdG8gdHJhY2sgZG93bikKLSBGaXggcmVtb3RlIHZlcnNpb24tc3RyaW5nIHBhcnNpbmcgZXJyb3IKICAodGhhbmtzIHRvIEJlcm5hcmQgQmxhY2toYW0gPGJlcm5hcmQgYXQgYmxhY2toYW0uY29tLmF1PiBmb3Igbm90aWNpbmcpCi0gSW1wcm92ZWQgaG9zdC1hbGdvcml0aG0tbWF0Y2hpbmcgYWxnb3JpdGhtIGluIGFsZ28uYwotIERlY3JlYXNlZCBNQVhfU1RSSU5HX0xFTiB0byBhIG1vcmUgcmVhbGlzdGljIHZhbHVlCi0gRml4IGluY29ycmVjdCB2ZXJzaW9uICgwLjM0KSBpbiB0aGlzIENIQU5HRVMgZmlsZSBmb3IgdGhlIHByZXZpb3VzIHJlbGVhc2UuCgowLjM1IC0gU3VuIEF1Z3VzdCAxNyAyMDAzIDA1OjM3OjQ3ICswODAwCgotIEZpeCBmb3IgcmVtb3RlbHkgZXhwbG9pdGFibGUgZm9ybWF0IHN0cmluZyBidWZmZXIgb3ZlcmZsb3cuCiAgKHRoYW5rcyB0byBKb2VsIEVyaWtzc29uIDxqZSBhdCBiaXRudXguY29tPikKCjAuMzQgLSBGcmkgQXVndXN0IDE1IDIwMDMgMTU6MTA6MDAgKzA4MDAKCi0gTWFkZSBzeXNsb2cgb3B0aW9uYWwsIGJvdGggYXQgY29tcGlsZSB0aW1lIGFuZCBhcyBhIGNvbXBpbGUgb3B0aW9uCiAgKHN1Z2dlc3RlZCBieSBMYXVyZW50IEJlcmNvdCA8c2thIGF0IHNrYXJuZXQub3JnPikKLSBGaXh1cCBmb3IgYmFkIGJhc2U2NCBwYXJzaW5nIGluIGF1dGhvcml6ZWRfa2V5cwogIChub3RpY2VkIGJ5IERhdnlkIE1hZGVsZXkgPGRhdnlkIGF0IHpkbGNvbXB1dGluZy5jb20+KQotIEFkZGVkIGluaXRpYWwgdGNwIGZvcndhcmRpbmcgY29kZSwgb25seSAtTCAobG9jYWwpIGF0IHRoaXMgc3RhZ2UKLSBJbXByb3ZlZCAibWFrZSBpbnN0YWxsIiB3aXRoIERFU1RESVIgYW5kIGNoYW5naW5nIG93bmVyc2hpcCBzZXBlcmF0ZWx5LAogIGRvbid0IGNoZWNrIGZvciBzZXRwZ3JwIG9uIExpbnV4IGZvciBjcm9zc2NvbXBpbGluZy4KICAoZnJvbSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbiBhdCBjb2RlcG9ldC5vcmc+KQotIE1vcmUgY29tbWVudGluZywgZml4IG1pbm9yIGNvbXBpbGUgd2FybmluZ3MsIG1ha2UgcmV0dXJuIHZhbHVlcyBtb3JlCiAgY29uc2lzdGVudCBldGMKLSBWYXJpb3VzIHNpZ25lZG5lc3MgZml4ZXMKLSBDYW4gbGlzdGVuIG9uIG11bHRpcGxlIHBvcnRzCi0gYWRkZWQgb3B0aW9uIHRvIGRpc2FibGUgb3BlbnB0eSB3aXRoIGNvbmZpZ3VyZSBzY3JpcHQsCiAgKGZyb20gSy4tUC4gS2lyY2hk9nJmZXIgPGthcGVrYSBhdCBlcG9zdC5kZT4pCi0gVmFyaW91cyBjbGVhbnVwcyB0byBiaWdudW0gY29kZQogICh0aGFua3MgdG8gVG9tIFN0IERlbmlzIDx0b21zdGRlbmlzIGF0IGlhaHUuY2E+KQotIEZpeCBjb21waWxlIGVycm9yIHdoZW4gZGlzYWJsaW5nIFJTQQogIChmcm9tIE1hcmMgS2xlaW5lLUJ1ZGRlIDxrbGVpbmUtYnVkZGUgYXQgZ214LmRlPikKLSBPdGhlciBjbGVhbnVwcywgc3BsaXR0aW5nIGxhcmdlIGZ1bmN0aW9ucyBmb3IgcGFja2V0IGFuZCBrZXggaGFuZGxpbmcgZXRjCgowLjMzIC0gU3VuIEp1bmUgMjIgMjAwMyAyMjoyNDoxMiArMDgwMAoKLSBGaXhlZCBzb21lIGludmFsaWQgYXNzZXJ0aW9ucyBpbiB0aGUgY2hhbm5lbCBjb2RlLCBmaXhpbmcgdGhlIHNlcnZlciBkeWluZwogIHdoZW4gZm9yd2FyZGluZyBYMTEgY29ubmVjdGlvbnMuCi0gQWRkIGRyb3BiZWFyY29udmVydCB0byBjb252ZXJ0IHRvL2Zyb20gT3BlblNTSCBob3N0IGtleXMgYW5kIERyb3BiZWFyIGtleXMKLSBSU0Ega2V5cyBub3cga2VlcCBwIGFuZCBxIHBhcmFtZXRlcnMgZm9yIGNvbXBhdGliaWxpdHkgLS0gb2xkIERyb3BiZWFyIGtleXMKICBzdGlsbCB3b3JrLCBidXQgY2FuJ3QgYmUgY29udmVydGVkIHRvIE9wZW5TU0ggZXRjLgotIERlYmlhbiBwYWNrYWdpbmcgZGlyZWN0b3J5IGFkZGVkLCB0aGFua3MgdG8gCiAgR3JhaGFtZSAoZ3JhaGFtZSBhdCBhbmdyeWdvYXRzLm5ldCkKLSAnaW5zdGFsbCcgdGFyZ2V0IGFkZGVkIHRvIHRoZSBtYWtlZmlsZQotIGdlbmVyYWwgdGlkeWluZywgaW1wcm92ZSBjb25zaXN0ZW5jeSBvZiBmdW5jdGlvbnMgZXRjCi0gSWYgUlNBIG9yIERTUyBob3N0a2V5cyBkb24ndCBleGlzdCwgdGhhdCBhbGdvcml0aG0gd29uJ3QgYmUgdXNlZC4KLSBJbXByb3ZlZCBSU0EgYW5kIERTUyBrZXkgZ2VuZXJhdGlvbiwgbW9yZSBlZmZpY2llbnQgYW5kIGZpeGVkIHNvbWUgbWlub3IgYnVncwogICh0aGFua3MgdG8gVG9tIFN0IERlbmlzIGZvciB0aGUgYWR2aWNlKQotIE1lcmdlZCBuZXcgdmVyc2lvbnMgb2YgTGliVG9tQ3J5cHQgKDAuODYpIGFuZCBMaWJUb21NYXRoICgwLjIxKQoKMC4zMiAtIFNhdCBNYXkgMjQgMjAwMyAxMjo0NDoxMSArMDgwMAoKLSBEb24ndCBjb21waWxlIHVudXNlZCBjb2RlIGZyb20gbGlidG9tY3J5cHQgKHRlc3QgdmVjdG9ycyBldGMpCi0gVXBkYXRlZCB0byBsaWJ0b21tYXRoIDAuMTcgYW5kIGxpYnRvbWNyeXB0IDAuODMuIE5ldyBsaWJ0b21tYXRoIHJlc3VsdHMKICBpbiBzbWFsbGVyIGJpbmFyeSBzaXplLCBkdWUgdG8gbm90IGxpbmtpbmcgdW5yZXF1aXJlZCBjb2RlCi0gWDExIGZvcndhcmRpbmcgYWRkZWQKLSBBZ2VudCBmb3J3YXJkaW5nIGFkZGVkIChmb3IgT3BlblNTSC5jb20gc3NoIGNsaWVudC9hZ2VudCkKLSBGaXggaW5jb3JyZWN0IGJ1ZmZlciBmcmVlaW5nIHdoZW4gYmFubmVycyBhcmUgdXNlZAotIEhvc3RuYW1lIHJlc29sdXRpb24gd29ya3MKLSBWYXJpb3VzIG1pbm9yIGJ1Z2ZpeGVzL2NvZGUgc2l6ZSBpbXByb3ZlbWVudHMgZXRjCgowLjMxIC0gRnJpIE1heSA5IDIwMDMgMTc6NTc6MTYgKzA4MDAKCi0gSW1wcm92ZWQgc3lzbG9nIG1lc3NhZ2VzIC0gSVAgbG9nZ2luZyBldGMKLSBTdHJpcCBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSBsb2cgbWVzc2FnZXMgKHNwZWNpZmllZCB1c2VybmFtZSBjdXJyZW50bHkpCi0gTG9naW4gcmVjb3JkaW5nICh1dG1wL3d0bXApIHN1cHBvcnQsIHNvIGxhc3Qvdy93aG8gd29yayAtIHRha2VuIGZyb20gT3BlblNTSAotIFNoZWxsIGlzIHN0YXJ0ZWQgYXMgYSBwcm9wZXIgbG9naW4gc2hlbGwsIHNvIC9ldGMvcHJvZmlsZSBldGMgaXMgc291cmNlZAotIFB0eXMgd29yayBvbiBTb2xhcmlzICgyLjggeDg2IHRlc3RlZCkgbm93Ci0gRml4ZWQgYnVnIGluIHNwZWNpZnlpbmcgdGhlIHJzYSBob3N0a2V5Ci0gRml4ZWQgYnVnIGluIGNvbXByZXNzaW9uIGNvZGUsIGNvdWxkIHRyaWdnZXIgaWYgY29tcHJlc3Npb24gcmVzdWx0ZWQgaW4KICBsYXJnZXIgb3V0cHV0IHRoYW4gaW5wdXQgKHVuY29tbW9uIGJ1dCBwb3NzaWJsZSkuCgowLjMwIC0gVGh1IEFwciAxNyAyMDAzIDE4OjQ2OjE1ICswODAwCgotIFNFQ1VSSVRZOiBidWZmZXIuYyBoYWQgYmFkIGNoZWNraW5nIGZvciBidWZmZXIgaW5jcmVtZW50IGxlbmd0aCAtIGZpeGVkCi0gY2hhbm5lbCBjb2RlIG5vdyBjbG9zZXMgcHJvcGVybHkgb24gRU9GIC0gc2NwIHByb2Nlc3NlcyBkb24ndCBoYW5nIGFyb3VuZAotIHN5c2xvZyBzdXBwb3J0IGFkZGVkIC0gaW1wcm92ZWQgYXV0aC9sb2dpbi9mYWlsdXJlIG1lc3NhZ2VzCi0gZ2VuZXJhbCBjb2RlIHRpZHlpbmcsIG1hZGUgcmV0dXJuIGNvZGVzIG1vcmUgY29uc2lzdGVudAotIE1ha2VmaWxlIGZpeGVkIGZvciBkZXBlbmRlbmNpZXMgYW5kIG1ha2VzIGxpYnRvbWNyeXB0IGFzIHdlbGwKLSBJbXBsZW1lbnRlZCBzZW5kaW5nIFNTSF9NU0dfVU5JTVBMRU1FTlRFRCA6KQoKMC4yOSAtIFdlZCBBcHIgOSAyMDAzCgotIEZpeGVkIGEgc3R1cGlkIGJ1ZyBpbiAwLjI4IHJlbGVhc2UsICduZXdzdHIgPSBzdHJkdXAob2xkc3RyKScsCiAgbm90ICduZXdzdHI9b2xkc3RyJwoKMC4yOCAtIFN1biBBcHIgNiAyMDAzCgotIEluaXRpYWwgcHVibGljIHJlbGVhc2UKCkRldmVsb3BtZW50IHdhcyBzdGFydGVkIGluIE9jdG9iZXIgMjAwMgo=