UmV2aXNpb24gaGlzdG9yeSBmb3IgbGliYXByZXEtMQoKPW92ZXIgNAoKPWl0ZW0gMS4zNCAKCgoKPWl0ZW0gMS4zMyAtIERlY2VtYmVyIDE1LCAyMDA0CgpNYWNPU1ggZG9jcyB0d2Vha3MgW0RhdmlkIFdoZWVsZXIgPGRhdmlkIGtpbmV0aWNvZGUuY29tPl0KCmZpeCBNYWtlZmlsZS5QTCB0byBwcm9wZXJseSBza2lwIHRoZSB0ZXN0IHN1aXRlIGlmIEEtVCByZXF1aXJlbWVudHMKd2VyZW4ndCBzYXRpc2ZpZWQgW1N0YXNdCgpyZXF1aXJlIEFwYWNoZTo6VGVzdCAxLjEzIHRvIHJ1biBwZXJsIHRlc3RzIChuZWVkKCkgd2FzIGFkZGVkIGF0IHRoYXQKdmVyc2lvbikgW1N0YXNdCgpGaXggYHN0ckVRJyByZWRlZmluZWQgd2FybmluZ3MgaW4gdGhlIHBlcmwgYnVpbGQgW1N0YXNdCgpVcGdyYWRlIGxpY2Vuc2UgdG8gdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLiBbZGF2aWR3LCBqb2VzXQoKPWl0ZW0gMS4zMgoKRml4IG1mZCdzIENvbnRlbnQtVHlwZSBwYXJzZXIgdG8gZGVhbCB3aXRoIE9wZXJhIDcuMidzIGV4dHJhIGF0dHJpYnV0ZXMuCkZvciBkZXRhaWxzIHNlZQoKICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFwcmVxLWRldiZtPTEwNjYwNjA1MjcwMDQwNyZ3PTIKCkJ1ZyBmaXJzdCByZXBvcnRlZCBieSBTdmVuIEdlaXNsZXIgW2pvZXNdLgoKPWl0ZW0gMS4zMSAtIG9uZ29pbmcKCmFkZGVkIGEgcHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpdGhyZWFkcyBzdXBwb3J0LiBBdCB0aGUgc2FtZQp0aW1lIGl0IHNob3VsZCByZXNvbHZlIHRoZSBwcm9ibGVtIHdpdGggcGVybCA1LjguMiB1bmRlciB0aHJlYWRlZAphcHBsaWNhdGlvbnMsIHNpbmNlIGl0IG5vIGxvbmdlciByZWxpZXMgb24gdGhlIGltcGxpY2l0IGNvbnRleHQgYW5kCnBhc3NlcyBhVEhYIGFyb3VuZC4gW1N0YXNdCgo9aXRlbSAxLjMwIC0gU2VwdGVtYmVyIDI3LCAyMDAzCgpsaWJhcHJlcS0xLjMgaXMgcmVsZWFzZWQuCgo9aXRlbSAxLjI1IC0gQXVndXN0IDIzLCAyMDAzCgpNaWNoYWVsIEcuIFNjaHdlcm4ncyAicGxheSBpdCBzYWZlIiBwYXRjaCB0byBjL01ha2VmaWxlLlBMCihhcHBsaWVkIHBhdGNoIHN1Ym1pdHRlZCBieSBTdGV2ZSBIYXkpLiBTZWUgCgogIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9cGVybDUtcG9ydGVycyZtPTEwNTk4MTY0OTIwMTM4MCZ3PTIKICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFwcmVxLWRldiZtPTEwNjE0NjI4NzMyMzcwNSZ3PTIKCmZvciBkZXRhaWxzLiBbam9lc10KCj1pdGVtIDEuMjQgLSBBdWd1c3QgMjMsIDIwMDMKCkFwcGxpZWQgU3RldmUgSGF5J3MgUmVxdWVzdC5wbSBkb2MgcGF0Y2ggZXhwbGFpbmluZyB0aGUgdGVtcG5hbSgpCmRlcGVuZGVuY2UgZm9yIEM8QXBhY2hlOjpSZXF1ZXN0OjpuZXcoKT4ncyBURU1QX0RJUiBvcHRpb24uIFtqb2VzXQoKPWl0ZW0gMS4yMyAtIEp1bHkgMTAsIDIwMDMKCkFwcGxpZWQgR3JhaGFtIENsYXJrJ3MgcGF0Y2ggdG8gY2xlYW51cCBhcGFjaGVfcmVxdWVzdC5oIG1hY3Jvcy4KQWRkZWQgbWlzc2luZyBkb2MgY3JlZGl0cyBmb3IgU3RldmUgSGF5IGluIFJlcXVlc3QucG0uIFtqb2VzXQoKPWl0ZW0gMS4yMiAtIEp1bHkgNSwgMjAwMwoKT3BlbiB1cGxvYWRlZCBmaWxlcyB3aXRoIGJpbmFyeSBtb2RlIChyZWxldmFudCBmb3IgUGVybCA+IDUuNyksCnNvIGFzIHRvIGJlIGFibGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHNpemVzIG9uIHN5c3RlbXMgd2hlcmUgc3VjaAphIG1vZGUgbWFrZXMgYSBkaWZmZXJlbmNlLiBUaGFua3MgdG8gU3RldmUgSGF5IGZvciBmaXJzdCBwb2ludGluZwpvdXQgdGhpcyBwcm9ibGVtLiBbcmFuZHlrXQoKPWl0ZW0gMS4yMSAtIEp1bmUgMjUsIDIwMDMKCkZpeCBtZW1vcnkgYWNjZXNzIHByb2JsZW0gd2l0aCBURU1QX0RJUiAtIHNlZQpodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFwcmVxLWRldiZtPTEwNTY0NzA1ODUxNzg0MiZ3PTIKVGhhbmtzIHRvIEpheSBCdWZmaW5ndG9uIGZvciB0aGUgc3BvdC4gIFtqb2VzXQoKPWl0ZW0gMS4yIC0gSnVuZSAxOSwgMjAwMwoKbGliYXByZXEtMS4yIHJlbGVhc2VkLgoKPWl0ZW0gMS4xNiAtIEp1bmUgMTksIDIwMDMKClVwZGF0ZWQgSU5TVEFMTCAmIFJFQURNRSBkb2N1bWVudHMgdG8gZXhwbGFpbiBob3cgdG8gY29uZmlndXJlIHRoZSB0ZXN0cy4KQXBhY2hlOjpUZXN0IHYxLjAzIGlzIG5vdyBhIHByZXJlcXVpc2l0ZSBmb3IgbGliYXByZXEuCgo9aXRlbSAxLjE1IC0gSnVuZSAxMywgMjAwMwoKRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFNGSU8gaXMgd2l0aGRyYXduLgoKPWl0ZW0gMS4xNCAtIEFwcmlsIDMwLCAyMDAzCgpBZGQgZG9jdW1lbnRhdGlvbiBmb3Igc3ViY2xhc3NpbmcgQXBhY2hlOjpSZXF1ZXN0LiBbU3RldmUgSGF5XQoKPWl0ZW0gMS4xMyAtIEFwcmlsIDE4LCAyMDAzCgpTeW5jIHRlc3Qgc3VpdGUgdXJpcyB3aXRoIGxhdGVzdCBBcGFjaGU6OlRlc3QgW1N0YXNdCgpQYXRjaCBtZmQgcGFyc2VyJ3MgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgdG8gZG8gY2FzZS1pbnNlbnNpdGl2ZQptYXRjaGVzIG9uICJuYW1lIiAmICJmaWxlbmFtZSIga2V5d29yZHMuICBUaGlzIGZlYXR1cmUgYWxsb3dzIHVwbG9hZHMKZnJvbSBOb2tpYSBTZXJpZXMgNjAgcGhvbmVzIHRvIHdvcmsgYXMgZXhwZWN0ZWQuIFtPc2thcmkgJ09ra28nIE9qYWxhXQoKUGF0Y2ggUmVxdWVzdC54cyB0byByZXZlcnQgdG8gdXNpbmcgcHJlLTEuMSAkdXBsb2FkLT5maCBjb2RlIGZvcgpwcmUtNS44IHBlcmxzLiAgVGhpcyBwYXRjaCBtYXkgZ2V0IGJhY2tlZCBvdXQgcHJpb3IgdG8gMS4yJ3MgcmVsZWFzZSwKdW5sZXNzIGl0IGlzIGtub3duIHRvIHJlc29sdmUgcHJvYmxlbXMgKHpvbWJpZXM/KSByZXBvcnRlZCB0byBvY2N1ciAKd2l0aCBsaWJhcHJlcS0xLjEgdXBsb2FkcyBhbmQgcHJlLTUuOCBwZXJscy4gW0pvZV0KCj1pdGVtIDEuMTIgLSBGZWJydWFyeSAyNywgMjAwMwoKZG8gYSBiZXR0ZXIgbW9kX3BlcmwgdmVyc2lvbiBjaGVja2luZywgaW5jbHVkaW5nIHRoZSB0ZXN0IGZvciBtb2RfcGVybAoyLjAuIFtTdGFzXQoKQXBwbGllZCBJS0VCRSBUb21vaGlybydzIHBhdGNoIGZvciBoYW5kbGluZyAldVhYWFggc3RyaW5ncy4KCj1pdGVtIDEuMTEgLSBGZWJydWFyeSAyNywgMjAwMwoKQWRkIHJlcS0+bmFyZ3MgdG8gQyBBUEkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBxdWVyeSBzdHJpbmcgYW5kIApyZXF1ZXN0IGJvZHkgcGFyYW1zLgoKPWl0ZW0gMS4wNSAtIEphbnVhcnkgNSwgMjAwMwoKSW5jbHVkZSBwYXRjaCBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGZvciBPUyBYIFtEYXZpZCBXaGVlbGVyXS4KVGVtcG9yYXJpbHkgcmV2ZXJ0IHRlc3Qgc3VpdGUgdG8gQXBhY2hlOjp0ZXN0LiBbSm9lIFNjaGFlZmVyXQpVcGRhdGUgUmVxdWVzdC54cyB0byBhdm9pZCBzZWdmYXVsdHMgY2F1c2VkIGJ5IGVtcHR5IGZpbGUgdXBsb2Fkcwp2aWEgYW4gdXBsb2FkX2hvb2suIFRoZSB1cGxvYWRfaG9vayBpc24ndCBjYWxsZWQgaW4gdGhpcyBjYXNlLAp3aGljaCB0cmlnZ2VyZWQgYSBzZWdmYXVsdCBpbiAkdXBsb2FkLT5maCBbU3ZlbiBHZWlzbGVyXS4KCj1pdGVtIDEuMDQgLSBOb3ZlbWJlciA1LCAyMDAyCgpSZXBsYWNlIGF1dG9nZW5lcmF0ZWQgZmlsZXMgd2l0aCBCVUlMRC5zaCBzY3JpcHQuIApUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgT1MgWCBzdXBwb3J0IHZpYSBsaWJ0b29sICYgZnJpZW5kcy4gCltKb2UgU2NoYWVmZXJdCgo9aXRlbSAxLjAyIC0gTm92ZW1iZXIgMywgMjAwMgoKQWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgaXNzdWVzIHdpdGggJ1wwJyBieXRlcyAoZW5jb2RlZCkgaW4gCmNvb2tpZSBzdHJpbmdzLiBbSXNzYWMgR29sZHN0YW5kXQoKPWl0ZW0gMS4wMQoKYWRkIGEgYmFzaWMgdGVzdCBzdWl0ZSBbU3RhcyBCZWttYW5dCgo9aXRlbSAxLjAgLSBGZWJydWFyeSAyMSwgMjAwMgoKdXBkYXRlIHRvIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQoKd29yayBhcm91bmQgYnVnIGluIE1vemlsbGEgMC45LjcsIHdoaWNoIGZhaWxzIHRvIHNlbmQgYSByZXF1aXJlZApDUkxGIHdpdGggZWFjaCBlbXB0eSBmaWxlIGZpZWxkLiBbSm9lIFNjaGFlZmVyIDxqb2VAc3Vuc3RhcnN5cy5jb20+XQoKaWdub3JlIGVtcHR5IGNvb2tpZSBhdHRyaWJ1dGVzOyByZXBsYWNlIGFwX2dldHdvcmQgY2FsbHMgd2l0aAphcF9nZXR3b3JkX251bGxzIGZvciBwYXJzaW5nICImIiBzZXBhcmF0b3IuIGJyaW5ncyB0aGUgYmVoYXZpb3Igb2YKQXBhY2hlOjpDb29raWUgY2xvc2VyIHRvIHRoYXQgb2YgQ0dJOjpDb29raWUsIGFuZCBob3BlZnVsbHkgaW1wcm92ZXMKdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEMgaW50ZXJmYWNlIGFzIHdlbGwuIFtNYXVyaWNlIEF1YnJleV0KCm1ha2UgYXBhY2hlX2Nvb2tpZS5oIGMrKyBjb21wYXRpYmxlIFtTaW1vbiBUYW3hcyA8c2ltb250QHdlc3RlbC5odT5dCgo9aXRlbSAwLjMzIC0gSnVuZSAxNywgMjAwMQoKJHItPnVwbG9hZCBjYW4gYmUgc2V0IHRvIGFub3RoZXIgQXBhY2hlOjpVcGxvYWQgaW5zdGFuY2UgW2RvdWdtXQpiYXNlZCBvbiBwYXRjaCBmcm9tIERhdmUgTGFNYWNjaGlhIDxkbWxAdG9wcGVkLXdpdGgtbWVhdC5jb20+Cgo9aXRlbSAwLjMyIC0gQXByaWwgNCwgMjAwMQoKZml4ICRyLT5wYXJhbSgga2V5ID0+IFsgMC4uOSBdICksIGNvbnZlcnQgdG8gWFMuIFtKb2UgU2NoYWVmZXIgPGpvZUBzdW5zdGFyc3lzLmNvbT5dClRoYW5rcyB0byBKb2R5IEJpZ2dzIDxqb2R5QGNvZGVncm9rLmNvbT4gZm9yIHRoZSBzcG90IGFuZCBzdWdnZXN0ZWQgZml4LgoKcmVxLT51cGxvYWRfaG9vaywgcmVxLT5ob29rX2RhdGEgYWRkZWQuIFtEYXZpZCBXZWx0b24gPGRhdmlkd0Bpbm5vbWluYXRlLml0Pl0KCnVwbG9hZC0+dGVtcG5hbWUsIHJlcS0+dGVtcF9kaXI7ICR1cGxvYWQtPmxpbmsoKSwgJHVwbG9hZC0+dGVtcG5hbWUoKQphZGRlZC4gW0pvZSBTY2hhZWZlciA8am9lQHN1bnN0YXJzeXMuY29tPl0KCmhhbmRsZSBjb29raWVzIGNvbnRhaW5pbmcgIiYiLCAiPSIgaW4gZGF0YS4gW0pvZSBTY2hhZWZlciA8am9lQHN1bnN0YXJzeXMuY29tPl0KCiRyLT5wYXJtcyBjYW4gYmUgc2V0IHRvIGFub3RoZXIgQXBhY2hlOjpUYWJsZSBpbnN0YW5jZSBbZG91Z21dCgpmaXggY29tcGlsZSBlcnJvcnMgd2hlbiBQZXJsSU8gaXMgdXNlZApbZG91Z20sIFJhbmR5IEtvYmVzIDxyYW5keUB0aGVvcnl4NS51d2lubmlwZWcuY2E+XQoKZml4IHN1YmNsYXNzaW5nIG1lY2hhbmlzbSBzbyB0aGUgdGhlIHZhbHVlIG9mIGFuIGByJyBvciBgX3InIGtleSBjYW4KYmUgYSBoYXNoIHJlZiBbZG91Z21dCgpmaXggd2luMzIgYnVpbGQgKHJlcXVpcmVzIG1vZF9wZXJsIGxhdGVyIHRoYW4gMS4yNF8wMSkKW1JhbmR5IEtvYmVzIDxyYW5keUB0aGVvcnl4NS51d2lubmlwZWcuY2E+XQoKSGFuZGxlIGNvb2tpZXMgd2l0aCBuYW1lcyBidXQgbm8gdmFsdWUgW0RhdmlkIFdlbHRvbiA8ZGF2aWR3QHByb3NhLml0Pl0KCkFJWCBjb21waWxlIGZpeGVzIFtKZW5zLVV3ZSBNYWdlciA8anVtQGhlbGlvcy5kZT5dCgo9aXRlbSAwLjMxXzAzIC0gRGVjZW1iZXIgMjMsIDIwMDAKCkFwYWNoZTo6UmVxdWVzdC0+aW5zdGFuY2UgW01hdHQgU2VyZ2VhbnQgPG1hdHRAc2VyZ2VhbnQub3JnPl0KCj1pdGVtIDAuMzFfMDIgLSBEZWNlbWJlciAxNywgMjAwMAoKYXV0b2NvbmYgc3VwcG9ydApbVG9tIFZhdWdoYW4gPHR2YXVnaGFuQGF2ZW50YWlsLmNvbT5dCgphbHNvIHBhcnNlIHItPmFyZ3MgaWYgY29udGVudC10eXBlIGlzIG11bHRpcGFydApbVmlsbGUgU2t5dHTkIDx2aWxsZUBvZmZpY2UucG9wc3lzdGVtcy5jb20+XQoKZGVhbCBwcm9wZXJseSB3aXRoIEFwYWNoZTo6Q29va2llLT5uZXcoa2V5ID0+IHVuZGVmKSAKdGhhbmtzIHRvIE1hdHQgU2VyZ2VhbnQgZm9yIHRoZSBzcG90CgpmaXggcGFyc2luZyBvZiBDb250ZW50LXR5cGUgaGVhZGVyIHRvIGRlYWwgd2l0aCBjaGFyc2V0cwpbQXJ0ZW0gQ2h1cHJpbmEgPHJhbkByYW4ucHAucnU+XQoKZml4IG5hc3R5IGJ1ZyB3aGVuIGNvbm5lY3Rpb24gaXMgYnJva2VuIGR1cmluZyBmaWxlIHVwbG9hZAp0aGFua3MgdG8gSmVmZiBCYWtlciBmb3IgdGhlIHNwb3QKCm11bHRpcGFydF9idWZmZXIuW2NoXSByZW5hbWVkIHRvIGFwYWNoZV9tdWx0aXBhcnRfYnVmZmVyLltjaF0KCj1pdGVtIDAuMzFfMDEgLSBEZWNlbWJlciA0LCAyMDAwCgprZWVwIHJldXNpbmcgc2FtZSBidWZmZXIgd2hlbiBoYW5kbGluZyBmaWxlIHVwbG9hZHMgdG8gcHJldmVudCBvdmVyemVhbG91cwptZW1vcnkgYWxsb2NhdGlvbiBbWWVhc2FoIFBlbGwsIEppbSBXaW5zdGVhZCA8amltd0BhcGFjaGUub3JnPl0KCmhhbmRsZSBpbnRlcm5ldCBleHBsb3JlciBmb3IgdGhlIG1hY2ludG9zaCBidWcgdGhhdCBzZW5kcyBjb3JydXB0IG1pbWUKYm91bmRhcmllcyB3aGVuIGltYWdlIHN1Ym1pdCBidXR0b25zIGFyZSB1c2VkIGluIG11bHRpcGFydC9mb3JtLWRhdGEgZm9ybXMKW1llYXNhaCBQZWxsXQoKZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaW4gQXBhY2hlUmVxdWVzdF9wYXJzZV91cmxlbmNvZGVkIFtZZWFzYWggUGVsbF0KCj1pdGVtIDAuMzEgLSBKdWx5IDIsIDE5OTkKCkNHSS5wbSAyLjUzJ3MgcGF0aC9kb21haW4gZGVmYXVsdHMgd2lsbCBiZSB1c2VkIHdpdGggLURERUZJTkU9Q0dJXzI1MwoKQXBhY2hlOjpDb29raWUtPm5ldygkciktPnBhcnNlIHdpbGwgcHJvcGVybHkgcmV0dXJuICgpIGluc3RlYWQgb2YKdW5kZWYgd2hlbiB0aGVyZSBpcyBubyBjb29raWUgaGVhZGVyLCB0aGFua3MgdG8gTmljayBUb25raW4gZm9yCnRoZSBzcG90Cgo9aXRlbSAwLjMwXzA0IC0gTWF5IDEzLCAxOTk5IAoKcGFzcyBBcGFjaGU6Oi9BcGFjaGU6OlN1YlJlcXVlc3Q6OiBvYmplY3QgdG8gc3ZfbWFnaWMsIHNvIGl0IGRvZXMgbm90CmdvIG91dCBvZiBzY29wZSB1bnRpbCB0aGUgQXBhY2hlOjpSZXF1ZXN0IG9iamVjdCBkb2VzCgo9aXRlbSAwLjMwXzAzIC0gTWF5IDUsIDE5OTkKCndoZW4gYXR0YWNoaW5nIHJlcXVlc3RfcmVjKiB0byBBcGFjaGU6OlJlcXVlc3Qgb2JqZWN0LCBkb250IGxldCBQZXJsIGNvcHkgaXQKCj1pdGVtIDAuMzBfMDIgLSBBcHJpbCAzMCwgMTk5OQoKYWx3YXlzIHBhcnNlIHRoZSBxdWVyeSBzdHJpbmcgKGlmIHByZXNlbnQpLCBpbmNsdWRpbmcgUE9TVCByZXF1ZXN0cwoKZml4ZWQgYW5vdGhlciBidWcgcmVsYXRlZCB0byBwYXRoX2luZm8KCmZpeGVkIEFwYWNoZTo6Q29va2llLT5wYXRoIGJ1ZyBzcG90dGVkIGJ5IEplZmZyZXkgVy4gQmFrZXIKIAo9aXRlbSAwLjMwXzAxIC0gSmFudWFyeSwgMjcgLSAxOTk5CgphZGRlZCBBcGFjaGVSZXF1ZXN0X3NjcmlwdF9uYW1lIChyLT51cmkgbWludXMgci0+cGF0aF9pbmZvKQoKYWRkZWQgZWcvYy90ZXN0YXByZXEvTWFrZWZpbGUuYXB4cwoKQyBzb3VyY2VzICouW2NoXSBtb3ZlZCB0byBpdHMgb3duIGMvIGRpcmVjdG9yeSAoZS5nLiBmb3IgZWFzeSBjdnMgaW1wb3J0KQoKZml4ZWQgYnVnIGluIEFwYWNoZVJlcXVlc3RfcGFyc2VfdXJsZW5jb2RlZCAocG9zc2libGUgY29yZSBkdW1wIG9uIEdFVCByZXF1ZXN0KQoKYWxsb3cgYDsnIFVSSSBhdHRyaWJ1dGUgZGVsaW1pdGVyIGFzIHBlciBIVE1MIDQuMCBzcGVjCgphbGxvdyBzdWItY2xhc3NpbmcgdmlhIF9yL3Iga2V5IG1lY2hhbmlzbQoKZG9uJ3QgdXNlICRWRVJTSU9OIHZhcmlhYmxlIG5hbWUgaW4gTWFrZWZpbGUuUEwKcGFyYW0oKSBub3cgdXNlcyBzZXQoKSBpbnN0ZWFkIG9mIGFkZCgpIApbQW5kcmVhcyBKLiBLb2VuaWcgPGFuZHJlYXMua29lbmlnQGFuaW1hLmRlPl0KCj1pdGVtIDAuMjBfMDEgLSBKYW51YXJ5IDYsIDE5OTkKCkFwYWNoZTo6bGliYXByZXEgZm9yIGNvbXBpbGVyICsgbGlua2VyIGZsYWdzCgphZGRlZCBkb2N1bWVudGF0aW9uCgpub3cgYnVpbGQgYW5kIGluc3RhbGwgbGliYXByZXEuYSBhbmQgaGVhZGVyIGZpbGVzCgptb3ZlIGNvb2tpZSBmdW5jdGlvbnMgdG8gbmV3IGFwYWNoZV9jb29raWUuYyBhbmQgQXBhY2hlOjpDb29raWUgbW9kdWxlcwoKbmV3IEFwYWNoZTo6VXBsb2FkIGNsYXNzCgphZGRlZCBwYXJhbSgpIG1ldGhvZAoKd2UgYXJlIG5vdyBhIHN1YmNsYXNzIG9mIEFwYWNoZSAocmVxdWlyZXMgMS4xNl8wMispCgphZGhlcmUgdG8gQXBhY2hlIGNvZGUgc3R5bGUgZ3VpZGUKCmFkZCBsb2dpYyB0byBwYXJzZSBHRVQgcmVxdWVzdHMgW0xhcnJ5IEZvYXJkIDxsYXJyeUBjcC5uZXQ+XQoKZml4IGFwYWNoZV9yZXF1ZXN0Lmggbm90IHRvIHVzZSBtb2RfcGVybC5oIGFuZCBkZWFsIHcvIGcrKwpbTGFycnkgRm9hcmQgPGxhcnJ5QGNwLm5ldD5dCgo9aXRlbSAwLjAxIC0gT2N0b2JlciAyMywgMTk5OAoKb3JpZ2luYWwgdmVyc2lvbiBbRG91ZyBNYWNFYWNoZXJuIDxkb3VnbUBjcC5uZXQ+XQpiYXNpYyBmcmFtZXdvcmsgZm9yIHBhcnNpbmcgSFRUUCBjb29raWVzIGFuZCBQT1NUIGRhdGEgb2YgdHlwZXM6CmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCwgbXVsdGlwYXJ0L2Zvcm0tZGF0YQoKPWJhY2sK