XGRvY3VtZW50Y2xhc3N7bWFudWFsfQpcdXNlcGFja2FnZVtUMV17Zm9udGVuY30KCiUgVGhpbmdzIHRvIGRvOgolIEFkZCBhIHNlY3Rpb24gb24gZmlsZSBJL08KJSBXcml0ZSBhIGNoYXB0ZXIgZW50aXRsZWQgYGBTb21lIFVzZWZ1bCBNb2R1bGVzJycKJSAgLS1yZSwgbWF0aCtjbWF0aAolIFNob3VsZCByZWFsbHkgbW92ZSB0aGUgUHl0aG9uIHN0YXJ0dXAgZmlsZSBpbmZvIHRvIGFuIGFwcGVuZGl4CgpcdGl0bGV7UHl0aG9uIFR1dG9yaWFsfQoKXGlucHV0e2JvaWxlcnBsYXRlfQoKXG1ha2VpbmRleAoKXGJlZ2lue2RvY3VtZW50fQoKXG1ha2V0aXRsZQoKXGlmaHRtbApcY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KXGZpCgpcaW5wdXR7Y29weXJpZ2h0fQoKXGJlZ2lue2Fic3RyYWN0fQoKXG5vaW5kZW50ClB5dGhvbiBpcyBhbiBlYXN5IHRvIGxlYXJuLCBwb3dlcmZ1bCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIEl0IGhhcwplZmZpY2llbnQgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgYW5kIGEgc2ltcGxlIGJ1dCBlZmZlY3RpdmUKYXBwcm9hY2ggdG8gb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLiAgUHl0aG9uJ3MgZWxlZ2FudCBzeW50YXggYW5kCmR5bmFtaWMgdHlwaW5nLCB0b2dldGhlciB3aXRoIGl0cyBpbnRlcnByZXRlZCBuYXR1cmUsIG1ha2UgaXQgYW4gaWRlYWwgCmxhbmd1YWdlIGZvciBzY3JpcHRpbmcgYW5kIHJhcGlkIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGluIG1hbnkgYXJlYXMgCm9uIG1vc3QgcGxhdGZvcm1zLgoKVGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgdGhlIGV4dGVuc2l2ZSBzdGFuZGFyZCBsaWJyYXJ5IGFyZSBmcmVlbHkKYXZhaWxhYmxlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBmb3IgYWxsIG1ham9yIHBsYXRmb3JtcyBmcm9tIHRoZQpQeXRob24gV2ViIHNpdGUsIFx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL30sIGFuZCBjYW4gYmUgZnJlZWx5CmRpc3RyaWJ1dGVkLiAgVGhlIHNhbWUgc2l0ZSBhbHNvIGNvbnRhaW5zIGRpc3RyaWJ1dGlvbnMgb2YgYW5kCnBvaW50ZXJzIHRvIG1hbnkgZnJlZSB0aGlyZCBwYXJ0eSBQeXRob24gbW9kdWxlcywgcHJvZ3JhbXMgYW5kIHRvb2xzLAphbmQgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uLgoKVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBlYXNpbHkgZXh0ZW5kZWQgd2l0aCBuZXcgZnVuY3Rpb25zIGFuZCBkYXRhCnR5cGVzIGltcGxlbWVudGVkIGluIEMgb3IgXENwcHt9IChvciBvdGhlciBsYW5ndWFnZXMgY2FsbGFibGUgZnJvbSBDKS4KUHl0aG9uIGlzIGFsc28gc3VpdGFibGUgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIGZvciBjdXN0b21pemFibGUKYXBwbGljYXRpb25zLgoKVGhpcyB0dXRvcmlhbCBpbnRyb2R1Y2VzIHRoZSByZWFkZXIgaW5mb3JtYWxseSB0byB0aGUgYmFzaWMgY29uY2VwdHMKYW5kIGZlYXR1cmVzIG9mIHRoZSBQeXRob24gbGFuZ3VhZ2UgYW5kIHN5c3RlbS4gIEl0IGhlbHBzIHRvIGhhdmUgYQpQeXRob24gaW50ZXJwcmV0ZXIgaGFuZHkgZm9yIGhhbmRzLW9uIGV4cGVyaWVuY2UsIGJ1dCBhbGwgZXhhbXBsZXMgYXJlCnNlbGYtY29udGFpbmVkLCBzbyB0aGUgdHV0b3JpYWwgY2FuIGJlIHJlYWQgb2ZmLWxpbmUgYXMgd2VsbC4KCkZvciBhIGRlc2NyaXB0aW9uIG9mIHN0YW5kYXJkIG9iamVjdHMgYW5kIG1vZHVsZXMsIHNlZSB0aGUKXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZG9jdW1lbnQuICBUaGUKXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbiBSZWZlcmVuY2UgTWFudWFsfSBnaXZlcyBhIG1vcmUKZm9ybWFsIGRlZmluaXRpb24gb2YgdGhlIGxhbmd1YWdlLiAgVG8gd3JpdGUgZXh0ZW5zaW9ucyBpbiBDIG9yClxDcHAsIHJlYWQgXGNpdGV0aXRsZVsuLi9leHQvZXh0Lmh0bWxde0V4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZQpQeXRob24gSW50ZXJwcmV0ZXJ9IGFuZCBcY2l0ZXRpdGxlWy4uL2FwaS9hcGkuaHRtbF17UHl0aG9uL0MgQVBJClJlZmVyZW5jZX0uICBUaGVyZSBhcmUgYWxzbyBzZXZlcmFsIGJvb2tzIGNvdmVyaW5nIFB5dGhvbiBpbiBkZXB0aC4KClRoaXMgdHV0b3JpYWwgZG9lcyBub3QgYXR0ZW1wdCB0byBiZSBjb21wcmVoZW5zaXZlIGFuZCBjb3ZlciBldmVyeQpzaW5nbGUgZmVhdHVyZSwgb3IgZXZlbiBldmVyeSBjb21tb25seSB1c2VkIGZlYXR1cmUuICBJbnN0ZWFkLCBpdAppbnRyb2R1Y2VzIG1hbnkgb2YgUHl0aG9uJ3MgbW9zdCBub3Rld29ydGh5IGZlYXR1cmVzLCBhbmQgd2lsbCBnaXZlCnlvdSBhIGdvb2QgaWRlYSBvZiB0aGUgbGFuZ3VhZ2UncyBmbGF2b3IgYW5kIHN0eWxlLiAgQWZ0ZXIgcmVhZGluZyBpdCwKeW91IHdpbGwgYmUgYWJsZSB0byByZWFkIGFuZCB3cml0ZSBQeXRob24gbW9kdWxlcyBhbmQgcHJvZ3JhbXMsIGFuZAp5b3Ugd2lsbCBiZSByZWFkeSB0byBsZWFybiBtb3JlIGFib3V0IHRoZSB2YXJpb3VzIFB5dGhvbiBsaWJyYXJ5Cm1vZHVsZXMgZGVzY3JpYmVkIGluIHRoZSBcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkKUmVmZXJlbmNlfS4KClxlbmR7YWJzdHJhY3R9CgpcdGFibGVvZmNvbnRlbnRzCgoKXGNoYXB0ZXJ7V2hldHRpbmcgWW91ciBBcHBldGl0ZSBcbGFiZWx7aW50cm99fQoKSWYgeW91IGV2ZXIgd3JvdGUgYSBsYXJnZSBzaGVsbCBzY3JpcHQsIHlvdSBwcm9iYWJseSBrbm93IHRoaXMKZmVlbGluZzogeW91J2QgbG92ZSB0byBhZGQgeWV0IGFub3RoZXIgZmVhdHVyZSwgYnV0IGl0J3MgYWxyZWFkeSBzbwpzbG93LCBhbmQgc28gYmlnLCBhbmQgc28gY29tcGxpY2F0ZWQ7IG9yIHRoZSBmZWF0dXJlIGludm9sdmVzIGEgc3lzdGVtCmNhbGwgb3Igb3RoZXIgZnVuY3Rpb24gdGhhdCBpcyBvbmx5IGFjY2Vzc2libGUgZnJvbSBDIFxsZG90cyBVc3VhbGx5CnRoZSBwcm9ibGVtIGF0IGhhbmQgaXNuJ3Qgc2VyaW91cyBlbm91Z2ggdG8gd2FycmFudCByZXdyaXRpbmcgdGhlCnNjcmlwdCBpbiBDOyBwZXJoYXBzIHRoZSBwcm9ibGVtIHJlcXVpcmVzIHZhcmlhYmxlLWxlbmd0aCBzdHJpbmdzIG9yCm90aGVyIGRhdGEgdHlwZXMgKGxpa2Ugc29ydGVkIGxpc3RzIG9mIGZpbGUgbmFtZXMpIHRoYXQgYXJlIGVhc3kgaW4KdGhlIHNoZWxsIGJ1dCBsb3RzIG9mIHdvcmsgdG8gaW1wbGVtZW50IGluIEMsIG9yIHBlcmhhcHMgeW91J3JlIG5vdApzdWZmaWNpZW50bHkgZmFtaWxpYXIgd2l0aCBDLgoKQW5vdGhlciBzaXR1YXRpb246IHBlcmhhcHMgeW91IGhhdmUgdG8gd29yayB3aXRoIHNldmVyYWwgQyBsaWJyYXJpZXMsCmFuZCB0aGUgdXN1YWwgQyB3cml0ZS9jb21waWxlL3Rlc3QvcmUtY29tcGlsZSBjeWNsZSBpcyB0b28gc2xvdy4gIFlvdQpuZWVkIHRvIGRldmVsb3Agc29mdHdhcmUgbW9yZSBxdWlja2x5LiAgUG9zc2libHkgcGVyaGFwcyB5b3UndmUKd3JpdHRlbiBhIHByb2dyYW0gdGhhdCBjb3VsZCB1c2UgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLCBhbmQgeW91IGRvbid0CndhbnQgdG8gZGVzaWduIGEgbGFuZ3VhZ2UsIHdyaXRlIGFuZCBkZWJ1ZyBhbiBpbnRlcnByZXRlciBmb3IgaXQsIHRoZW4KdGllIGl0IGludG8geW91ciBhcHBsaWNhdGlvbi4KCkluIHN1Y2ggY2FzZXMsIFB5dGhvbiBtYXkgYmUganVzdCB0aGUgbGFuZ3VhZ2UgZm9yIHlvdS4gIFB5dGhvbiBpcwpzaW1wbGUgdG8gdXNlLCBidXQgaXQgaXMgYSByZWFsIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvZmZlcmluZyBtdWNoCm1vcmUgc3RydWN0dXJlIGFuZCBzdXBwb3J0IGZvciBsYXJnZSBwcm9ncmFtcyB0aGFuIHRoZSBzaGVsbCBoYXMuICBPbgp0aGUgb3RoZXIgaGFuZCwgaXQgYWxzbyBvZmZlcnMgbXVjaCBtb3JlIGVycm9yIGNoZWNraW5nIHRoYW4gQywgYW5kLApiZWluZyBhIFxlbXBoe3ZlcnktaGlnaC1sZXZlbCBsYW5ndWFnZX0sIGl0IGhhcyBoaWdoLWxldmVsIGRhdGEgdHlwZXMKYnVpbHQgaW4sIHN1Y2ggYXMgZmxleGlibGUgYXJyYXlzIGFuZCBkaWN0aW9uYXJpZXMgdGhhdCB3b3VsZCBjb3N0IHlvdQpkYXlzIHRvIGltcGxlbWVudCBlZmZpY2llbnRseSBpbiBDLiAgQmVjYXVzZSBvZiBpdHMgbW9yZSBnZW5lcmFsIGRhdGEKdHlwZXMgUHl0aG9uIGlzIGFwcGxpY2FibGUgdG8gYSBtdWNoIGxhcmdlciBwcm9ibGVtIGRvbWFpbiB0aGFuClxlbXBoe0F3a30gb3IgZXZlbiBcZW1waHtQZXJsfSwgeWV0IG1hbnkgdGhpbmdzIGFyZSBhdCBsZWFzdCBhcyBlYXN5CmluIFB5dGhvbiBhcyBpbiB0aG9zZSBsYW5ndWFnZXMuCgpQeXRob24gYWxsb3dzIHlvdSB0byBzcGxpdCB1cCB5b3VyIHByb2dyYW0gaW4gbW9kdWxlcyB0aGF0IGNhbiBiZQpyZXVzZWQgaW4gb3RoZXIgUHl0aG9uIHByb2dyYW1zLiAgSXQgY29tZXMgd2l0aCBhIGxhcmdlIGNvbGxlY3Rpb24gb2YKc3RhbmRhcmQgbW9kdWxlcyB0aGF0IHlvdSBjYW4gdXNlIGFzIHRoZSBiYXNpcyBvZiB5b3VyIHByb2dyYW1zIC0tLSBvcgphcyBleGFtcGxlcyB0byBzdGFydCBsZWFybmluZyB0byBwcm9ncmFtIGluIFB5dGhvbi4gIFRoZXJlIGFyZSBhbHNvCmJ1aWx0LWluIG1vZHVsZXMgdGhhdCBwcm92aWRlIHRoaW5ncyBsaWtlIGZpbGUgSS9PLCBzeXN0ZW0gY2FsbHMsCnNvY2tldHMsIGFuZCBldmVuIGludGVyZmFjZXMgdG8gZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHRvb2xraXRzIGxpa2UgVGsuICAKClB5dGhvbiBpcyBhbiBpbnRlcnByZXRlZCBsYW5ndWFnZSwgd2hpY2ggY2FuIHNhdmUgeW91IGNvbnNpZGVyYWJsZSB0aW1lCmR1cmluZyBwcm9ncmFtIGRldmVsb3BtZW50IGJlY2F1c2Ugbm8gY29tcGlsYXRpb24gYW5kIGxpbmtpbmcgaXMKbmVjZXNzYXJ5LiAgVGhlIGludGVycHJldGVyIGNhbiBiZSB1c2VkIGludGVyYWN0aXZlbHksIHdoaWNoIG1ha2VzIGl0CmVhc3kgdG8gZXhwZXJpbWVudCB3aXRoIGZlYXR1cmVzIG9mIHRoZSBsYW5ndWFnZSwgdG8gd3JpdGUgdGhyb3ctYXdheQpwcm9ncmFtcywgb3IgdG8gdGVzdCBmdW5jdGlvbnMgZHVyaW5nIGJvdHRvbS11cCBwcm9ncmFtIGRldmVsb3BtZW50LgpJdCBpcyBhbHNvIGEgaGFuZHkgZGVzayBjYWxjdWxhdG9yLgoKUHl0aG9uIGFsbG93cyB3cml0aW5nIHZlcnkgY29tcGFjdCBhbmQgcmVhZGFibGUgcHJvZ3JhbXMuICBQcm9ncmFtcwp3cml0dGVuIGluIFB5dGhvbiBhcmUgdHlwaWNhbGx5IG11Y2ggc2hvcnRlciB0aGFuIGVxdWl2YWxlbnQgQyBvcgpcQ3Bwe30gcHJvZ3JhbXMsIGZvciBzZXZlcmFsIHJlYXNvbnM6ClxiZWdpbntpdGVtaXplfQpcaXRlbQp0aGUgaGlnaC1sZXZlbCBkYXRhIHR5cGVzIGFsbG93IHlvdSB0byBleHByZXNzIGNvbXBsZXggb3BlcmF0aW9ucyBpbiBhCnNpbmdsZSBzdGF0ZW1lbnQ7ClxpdGVtCnN0YXRlbWVudCBncm91cGluZyBpcyBkb25lIGJ5IGluZGVudGF0aW9uIGluc3RlYWQgb2YgYmVnaW5uaW5nIGFuZCBlbmRpbmcKYnJhY2tldHM7ClxpdGVtCm5vIHZhcmlhYmxlIG9yIGFyZ3VtZW50IGRlY2xhcmF0aW9ucyBhcmUgbmVjZXNzYXJ5LgpcZW5ke2l0ZW1pemV9CgpQeXRob24gaXMgXGVtcGh7ZXh0ZW5zaWJsZX06IGlmIHlvdSBrbm93IGhvdyB0byBwcm9ncmFtIGluIEMgaXQgaXMgZWFzeQp0byBhZGQgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbW9kdWxlIHRvIHRoZSBpbnRlcnByZXRlciwgZWl0aGVyIHRvCnBlcmZvcm0gY3JpdGljYWwgb3BlcmF0aW9ucyBhdCBtYXhpbXVtIHNwZWVkLCBvciB0byBsaW5rIFB5dGhvbgpwcm9ncmFtcyB0byBsaWJyYXJpZXMgdGhhdCBtYXkgb25seSBiZSBhdmFpbGFibGUgaW4gYmluYXJ5IGZvcm0gKHN1Y2gKYXMgYSB2ZW5kb3Itc3BlY2lmaWMgZ3JhcGhpY3MgbGlicmFyeSkuICBPbmNlIHlvdSBhcmUgcmVhbGx5IGhvb2tlZCwKeW91IGNhbiBsaW5rIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaW50byBhbiBhcHBsaWNhdGlvbiB3cml0dGVuIGluIEMKYW5kIHVzZSBpdCBhcyBhbiBleHRlbnNpb24gb3IgY29tbWFuZCBsYW5ndWFnZSBmb3IgdGhhdCBhcHBsaWNhdGlvbi4KCkJ5IHRoZSB3YXksIHRoZSBsYW5ndWFnZSBpcyBuYW1lZCBhZnRlciB0aGUgQkJDIHNob3cgYGBNb250eSBQeXRob24ncwpGbHlpbmcgQ2lyY3VzJycgYW5kIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggbmFzdHkgcmVwdGlsZXMuICBNYWtpbmcKcmVmZXJlbmNlcyB0byBNb250eSBQeXRob24gc2tpdHMgaW4gZG9jdW1lbnRhdGlvbiBpcyBub3Qgb25seSBhbGxvd2VkLAppdCBpcyBlbmNvdXJhZ2VkIQoKJVxzZWN0aW9ue1doZXJlIEZyb20gSGVyZSBcbGFiZWx7d2hlcmV9fQoKTm93IHRoYXQgeW91IGFyZSBhbGwgZXhjaXRlZCBhYm91dCBQeXRob24sIHlvdSdsbCB3YW50IHRvIGV4YW1pbmUgaXQKaW4gc29tZSBtb3JlIGRldGFpbC4gIFNpbmNlIHRoZSBiZXN0IHdheSB0byBsZWFybiBhIGxhbmd1YWdlIGlzCnVzaW5nIGl0LCB5b3UgYXJlIGludml0ZWQgaGVyZSB0byBkbyBzby4KCkluIHRoZSBuZXh0IGNoYXB0ZXIsIHRoZSBtZWNoYW5pY3Mgb2YgdXNpbmcgdGhlIGludGVycHJldGVyIGFyZQpleHBsYWluZWQuICBUaGlzIGlzIHJhdGhlciBtdW5kYW5lIGluZm9ybWF0aW9uLCBidXQgZXNzZW50aWFsIGZvcgp0cnlpbmcgb3V0IHRoZSBleGFtcGxlcyBzaG93biBsYXRlci4KClRoZSByZXN0IG9mIHRoZSB0dXRvcmlhbCBpbnRyb2R1Y2VzIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIFB5dGhvbgpsYW5ndWFnZSBhbmQgc3lzdGVtIHRocm91Z2ggZXhhbXBsZXMsIGJlZ2lubmluZyB3aXRoIHNpbXBsZQpleHByZXNzaW9ucywgc3RhdGVtZW50cyBhbmQgZGF0YSB0eXBlcywgdGhyb3VnaCBmdW5jdGlvbnMgYW5kIG1vZHVsZXMsCmFuZCBmaW5hbGx5IHRvdWNoaW5nIHVwb24gYWR2YW5jZWQgY29uY2VwdHMgbGlrZSBleGNlcHRpb25zCmFuZCB1c2VyLWRlZmluZWQgY2xhc3Nlcy4KClxjaGFwdGVye1VzaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIgXGxhYmVse3VzaW5nfX0KClxzZWN0aW9ue0ludm9raW5nIHRoZSBJbnRlcnByZXRlciBcbGFiZWx7aW52b2tpbmd9fQoKVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcwpcZmlsZXsvdXNyL2xvY2FsL2Jpbi9weXRob259IG9uIHRob3NlIG1hY2hpbmVzIHdoZXJlIGl0IGlzIGF2YWlsYWJsZTsKcHV0dGluZyBcZmlsZXsvdXNyL2xvY2FsL2Jpbn0gaW4geW91ciBcVU5JWHt9IHNoZWxsJ3Mgc2VhcmNoIHBhdGgKbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQgaXQgYnkgdHlwaW5nIHRoZSBjb21tYW5kCgpcYmVnaW57dmVyYmF0aW19CnB5dGhvbgpcZW5ke3ZlcmJhdGltfQoKdG8gdGhlIHNoZWxsLiAgU2luY2UgdGhlIGNob2ljZSBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbnRlcnByZXRlcgpsaXZlcyBpcyBhbiBpbnN0YWxsYXRpb24gb3B0aW9uLCBvdGhlciBwbGFjZXMgYXJlIHBvc3NpYmxlOyBjaGVjayB3aXRoCnlvdXIgbG9jYWwgUHl0aG9uIGd1cnUgb3Igc3lzdGVtIGFkbWluaXN0cmF0b3IuICAoRS5nLiwKXGZpbGV7L3Vzci9sb2NhbC9weXRob259IGlzIGEgcG9wdWxhciBhbHRlcm5hdGl2ZSBsb2NhdGlvbi4pCgpUeXBpbmcgYW4gZW5kLW9mLWZpbGUgY2hhcmFjdGVyIChca2Jke0NvbnRyb2wtRH0gb24gXFVOSVgsClxrYmR7Q29udHJvbC1afSBvbiBXaW5kb3dzKSBhdCB0aGUgcHJpbWFyeSBwcm9tcHQgY2F1c2VzIHRoZQppbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQgc3RhdHVzLiAgSWYgdGhhdCBkb2Vzbid0IHdvcmssCnlvdSBjYW4gZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6ClxzYW1we2ltcG9ydCBzeXM7IHN5cy5leGl0KCl9LgoKVGhlIGludGVycHJldGVyJ3MgbGluZS1lZGl0aW5nIGZlYXR1cmVzIHVzdWFsbHkgYXJlbid0IHZlcnkKc29waGlzdGljYXRlZC4gIE9uIFxVTklYLCB3aG9ldmVyIGluc3RhbGxlZCB0aGUgaW50ZXJwcmV0ZXIgbWF5IGhhdmUKZW5hYmxlZCBzdXBwb3J0IGZvciB0aGUgR05VIHJlYWRsaW5lIGxpYnJhcnksIHdoaWNoIGFkZHMgbW9yZQplbGFib3JhdGUgaW50ZXJhY3RpdmUgZWRpdGluZyBhbmQgaGlzdG9yeSBmZWF0dXJlcy4gUGVyaGFwcyB0aGUKcXVpY2tlc3QgY2hlY2sgdG8gc2VlIHdoZXRoZXIgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXMgc3VwcG9ydGVkIGlzCnR5cGluZyBDb250cm9sLVAgdG8gdGhlIGZpcnN0IFB5dGhvbiBwcm9tcHQgeW91IGdldC4gIElmIGl0IGJlZXBzLCB5b3UKaGF2ZSBjb21tYW5kIGxpbmUgZWRpdGluZzsgc2VlIEFwcGVuZGl4IFxyZWZ7aW50ZXJhY3Rpbmd9IGZvciBhbgppbnRyb2R1Y3Rpb24gdG8gdGhlIGtleXMuICBJZiBub3RoaW5nIGFwcGVhcnMgdG8gaGFwcGVuLCBvciBpZgpcY29kZXtcXlB9IGlzIGVjaG9lZCwgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXNuJ3QgYXZhaWxhYmxlOyB5b3UnbGwKb25seSBiZSBhYmxlIHRvIHVzZSBiYWNrc3BhY2UgdG8gcmVtb3ZlIGNoYXJhY3RlcnMgZnJvbSB0aGUgY3VycmVudApsaW5lLgoKVGhlIGludGVycHJldGVyIG9wZXJhdGVzIHNvbWV3aGF0IGxpa2UgdGhlIFxVTklYe30gc2hlbGw6IHdoZW4gY2FsbGVkCndpdGggc3RhbmRhcmQgaW5wdXQgY29ubmVjdGVkIHRvIGEgdHR5IGRldmljZSwgaXQgcmVhZHMgYW5kIGV4ZWN1dGVzCmNvbW1hbmRzIGludGVyYWN0aXZlbHk7IHdoZW4gY2FsbGVkIHdpdGggYSBmaWxlIG5hbWUgYXJndW1lbnQgb3Igd2l0aAphIGZpbGUgYXMgc3RhbmRhcmQgaW5wdXQsIGl0IHJlYWRzIGFuZCBleGVjdXRlcyBhIFxlbXBoe3NjcmlwdH0gZnJvbQp0aGF0IGZpbGUuIAoKQSBzZWNvbmQgd2F5IG9mIHN0YXJ0aW5nIHRoZSBpbnRlcnByZXRlciBpcwpcc2FtcHtccHJvZ3JhbXtweXRob259IFxwcm9ncmFtb3B0ey1jfSBcdmFye2NvbW1hbmR9IFthcmddIC4uLn0sIHdoaWNoCmV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnQocykgaW4gXHZhcntjb21tYW5kfSwgYW5hbG9nb3VzIHRvIHRoZSBzaGVsbCdzClxwcm9ncmFtb3B0ey1jfSBvcHRpb24uICBTaW5jZSBQeXRob24gc3RhdGVtZW50cyBvZnRlbiBjb250YWluIHNwYWNlcwpvciBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNwZWNpYWwgdG8gdGhlIHNoZWxsLCBpdCBpcyBiZXN0IHRvIHF1b3RlIApcdmFye2NvbW1hbmR9IGluIGl0cyBlbnRpcmV0eSB3aXRoIGRvdWJsZSBxdW90ZXMuCgpOb3RlIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gXHNhbXB7cHl0aG9uIGZpbGV9IGFuZApcc2FtcHtweXRob24gPGZpbGV9LiAgSW4gdGhlIGxhdHRlciBjYXNlLCBpbnB1dCByZXF1ZXN0cyBmcm9tIHRoZQpwcm9ncmFtLCBzdWNoIGFzIGNhbGxzIHRvIFxmdW5jdGlvbntpbnB1dCgpfSBhbmQgXGZ1bmN0aW9ue3Jhd19pbnB1dCgpfSwgYXJlCnNhdGlzZmllZCBmcm9tIFxlbXBoe2ZpbGV9LiAgU2luY2UgdGhpcyBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZAp1bnRpbCB0aGUgZW5kIGJ5IHRoZSBwYXJzZXIgYmVmb3JlIHRoZSBwcm9ncmFtIHN0YXJ0cyBleGVjdXRpbmcsIHRoZQpwcm9ncmFtIHdpbGwgZW5jb3VudGVyIGVuZC1vZi1maWxlIGltbWVkaWF0ZWx5LiAgSW4gdGhlIGZvcm1lciBjYXNlCih3aGljaCBpcyB1c3VhbGx5IHdoYXQgeW91IHdhbnQpIHRoZXkgYXJlIHNhdGlzZmllZCBmcm9tIHdoYXRldmVyIGZpbGUKb3IgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byBzdGFuZGFyZCBpbnB1dCBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyLgoKV2hlbiBhIHNjcmlwdCBmaWxlIGlzIHVzZWQsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBydW4KdGhlIHNjcmlwdCBhbmQgZW50ZXIgaW50ZXJhY3RpdmUgbW9kZSBhZnRlcndhcmRzLiAgVGhpcyBjYW4gYmUgZG9uZSBieQpwYXNzaW5nIFxwcm9ncmFtb3B0ey1pfSBiZWZvcmUgdGhlIHNjcmlwdC4gIChUaGlzIGRvZXMgbm90IHdvcmsgaWYgdGhlCnNjcmlwdCBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQsIGZvciB0aGUgc2FtZSByZWFzb24gYXMgZXhwbGFpbmVkCmluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguKQoKXHN1YnNlY3Rpb257QXJndW1lbnQgUGFzc2luZyBcbGFiZWx7YXJnUGFzc2luZ319CgpXaGVuIGtub3duIHRvIHRoZSBpbnRlcnByZXRlciwgdGhlIHNjcmlwdCBuYW1lIGFuZCBhZGRpdGlvbmFsCmFyZ3VtZW50cyB0aGVyZWFmdGVyIGFyZSBwYXNzZWQgdG8gdGhlIHNjcmlwdCBpbiB0aGUgdmFyaWFibGUKXGNvZGV7c3lzLmFyZ3Z9LCB3aGljaCBpcyBhIGxpc3Qgb2Ygc3RyaW5ncy4gIEl0cyBsZW5ndGggaXMgYXQgbGVhc3QKb25lOyB3aGVuIG5vIHNjcmlwdCBhbmQgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgXGNvZGV7c3lzLmFyZ3ZbMF19IGlzCmFuIGVtcHR5IHN0cmluZy4gIFdoZW4gdGhlIHNjcmlwdCBuYW1lIGlzIGdpdmVuIGFzIFxjb2RleyctJ30gKG1lYW5pbmcgCnN0YW5kYXJkIGlucHV0KSwgXGNvZGV7c3lzLmFyZ3ZbMF19IGlzIHNldCB0byBcY29kZXsnLSd9LiAgV2hlbgpccHJvZ3JhbW9wdHstY30gXHZhcntjb21tYW5kfSBpcyB1c2VkLCBcY29kZXtzeXMuYXJndlswXX0gaXMgc2V0IHRvClxjb2RleyctYyd9LiAgT3B0aW9ucyBmb3VuZCBhZnRlciBccHJvZ3JhbW9wdHstY30gXHZhcntjb21tYW5kfSBhcmUKbm90IGNvbnN1bWVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIncyBvcHRpb24gcHJvY2Vzc2luZyBidXQgbGVmdCBpbgpcY29kZXtzeXMuYXJndn0gZm9yIHRoZSBjb21tYW5kIHRvIGhhbmRsZS4KClxzdWJzZWN0aW9ue0ludGVyYWN0aXZlIE1vZGUgXGxhYmVse2ludGVyYWN0aXZlfX0KCldoZW4gY29tbWFuZHMgYXJlIHJlYWQgZnJvbSBhIHR0eSwgdGhlIGludGVycHJldGVyIGlzIHNhaWQgdG8gYmUgaW4KXGVtcGh7aW50ZXJhY3RpdmUgbW9kZX0uICBJbiB0aGlzIG1vZGUgaXQgcHJvbXB0cyBmb3IgdGhlIG5leHQgY29tbWFuZAp3aXRoIHRoZSBcZW1waHtwcmltYXJ5IHByb21wdH0sIHVzdWFsbHkgdGhyZWUgZ3JlYXRlci10aGFuIHNpZ25zCihcc2FtcHs+XGNvZGV7Pn0+fn0pOyBmb3IgY29udGludWF0aW9uIGxpbmVzIGl0IHByb21wdHMgd2l0aCB0aGUKXGVtcGh7c2Vjb25kYXJ5IHByb21wdH0sIGJ5IGRlZmF1bHQgdGhyZWUgZG90cyAoXHNhbXB7Li4ufn0pLgpUaGUgaW50ZXJwcmV0ZXIgcHJpbnRzIGEgd2VsY29tZSBtZXNzYWdlIHN0YXRpbmcgaXRzIHZlcnNpb24gbnVtYmVyCmFuZCBhIGNvcHlyaWdodCBub3RpY2UgYmVmb3JlIHByaW50aW5nIHRoZSBmaXJzdCBwcm9tcHQ6CgpcYmVnaW57dmVyYmF0aW19CnB5dGhvbgpQeXRob24gMS41LjJiMiAoIzEsIEZlYiAyOCAxOTk5LCAwMDowMjowNikgIFtHQ0MgMi44LjFdIG9uIHN1bm9zNQpDb3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCj4+PgpcZW5ke3ZlcmJhdGltfQoKQ29udGludWF0aW9uIGxpbmVzIGFyZSBuZWVkZWQgd2hlbiBlbnRlcmluZyBhIG11bHRpLWxpbmUgY29uc3RydWN0LgpBcyBhbiBleGFtcGxlLCB0YWtlIGEgbG9vayBhdCB0aGlzIFxrZXl3b3Jke2lmfSBzdGF0ZW1lbnQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB0aGVfd29ybGRfaXNfZmxhdCA9IDEKPj4+IGlmIHRoZV93b3JsZF9pc19mbGF0OgouLi4gICAgIHByaW50ICJCZSBjYXJlZnVsIG5vdCB0byBmYWxsIG9mZiEiCi4uLiAKQmUgY2FyZWZ1bCBub3QgdG8gZmFsbCBvZmYhClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257VGhlIEludGVycHJldGVyIGFuZCBJdHMgRW52aXJvbm1lbnQgXGxhYmVse2ludGVycH19Cgpcc3Vic2VjdGlvbntFcnJvciBIYW5kbGluZyBcbGFiZWx7ZXJyb3J9fQoKV2hlbiBhbiBlcnJvciBvY2N1cnMsIHRoZSBpbnRlcnByZXRlciBwcmludHMgYW4gZXJyb3IKbWVzc2FnZSBhbmQgYSBzdGFjayB0cmFjZS4gIEluIGludGVyYWN0aXZlIG1vZGUsIGl0IHRoZW4gcmV0dXJucyB0bwp0aGUgcHJpbWFyeSBwcm9tcHQ7IHdoZW4gaW5wdXQgY2FtZSBmcm9tIGEgZmlsZSwgaXQgZXhpdHMgd2l0aCBhCm5vbnplcm8gZXhpdCBzdGF0dXMgYWZ0ZXIgcHJpbnRpbmcKdGhlIHN0YWNrIHRyYWNlLiAgKEV4Y2VwdGlvbnMgaGFuZGxlZCBieSBhbiBca2V5d29yZHtleGNlcHR9IGNsYXVzZSBpbiBhClxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGFyZSBub3QgZXJyb3JzIGluIHRoaXMgY29udGV4dC4pICBTb21lIGVycm9ycyBhcmUKdW5jb25kaXRpb25hbGx5IGZhdGFsIGFuZCBjYXVzZSBhbiBleGl0IHdpdGggYSBub256ZXJvIGV4aXQ7IHRoaXMKYXBwbGllcyB0byBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgYW5kIHNvbWUgY2FzZXMgb2YgcnVubmluZyBvdXQgb2YKbWVtb3J5LiAgQWxsIGVycm9yIG1lc3NhZ2VzIGFyZSB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW07Cm5vcm1hbCBvdXRwdXQgZnJvbSB0aGUgZXhlY3V0ZWQgY29tbWFuZHMgaXMgd3JpdHRlbiB0byBzdGFuZGFyZApvdXRwdXQuCgpUeXBpbmcgdGhlIGludGVycnVwdCBjaGFyYWN0ZXIgKHVzdWFsbHkgQ29udHJvbC1DIG9yIERFTCkgdG8gdGhlCnByaW1hcnkgb3Igc2Vjb25kYXJ5IHByb21wdCBjYW5jZWxzIHRoZSBpbnB1dCBhbmQgcmV0dXJucyB0byB0aGUKcHJpbWFyeSBwcm9tcHQuXGZvb3Rub3RlewogICAgICAgIEEgcHJvYmxlbSB3aXRoIHRoZSBHTlUgUmVhZGxpbmUgcGFja2FnZSBtYXkgcHJldmVudCB0aGlzLgp9ClR5cGluZyBhbiBpbnRlcnJ1cHQgd2hpbGUgYSBjb21tYW5kIGlzIGV4ZWN1dGluZyByYWlzZXMgdGhlClxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGV4Y2VwdGlvbiwgd2hpY2ggbWF5IGJlIGhhbmRsZWQgYnkgYQpca2V5d29yZHt0cnl9IHN0YXRlbWVudC4KClxzdWJzZWN0aW9ue0V4ZWN1dGFibGUgUHl0aG9uIFNjcmlwdHMgXGxhYmVse3NjcmlwdHN9fQoKT24gQlNEJ2lzaCBcVU5JWHt9IHN5c3RlbXMsIFB5dGhvbiBzY3JpcHRzIGNhbiBiZSBtYWRlIGRpcmVjdGx5CmV4ZWN1dGFibGUsIGxpa2Ugc2hlbGwgc2NyaXB0cywgYnkgcHV0dGluZyB0aGUgbGluZQoKXGJlZ2lue3ZlcmJhdGltfQojISAvdXNyL2Jpbi9lbnYgcHl0aG9uClxlbmR7dmVyYmF0aW19CgooYXNzdW1pbmcgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgb24gdGhlIHVzZXIncyBcZW52dmFye1BBVEh9KSBhdCB0aGUKYmVnaW5uaW5nIG9mIHRoZSBzY3JpcHQgYW5kIGdpdmluZyB0aGUgZmlsZSBhbiBleGVjdXRhYmxlIG1vZGUuICBUaGUKXHNhbXB7XCMhfSBtdXN0IGJlIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiB0aGUgZmlsZS4gIE9uIHNvbWUKcGxhdGZvcm1zLCB0aGlzIGZpcnN0IGxpbmUgbXVzdCBlbmQgd2l0aCBhIFxVTklYLXN0eWxlIGxpbmUgZW5kaW5nCihcY2hhcmFjdGVye1xlIG59KSwgbm90IGEgTWFjIE9TIChcY2hhcmFjdGVye1xlIHJ9KSBvciBXaW5kb3dzCihcY2hhcmFjdGVye1xlIHJcZSBufSkgbGluZSBlbmRpbmcuICBOb3RlIHRoYXQKdGhlIGhhc2gsIG9yIHBvdW5kLCBjaGFyYWN0ZXIsIFxjaGFyYWN0ZXJ7XCN9LCBpcyB1c2VkIHRvIHN0YXJ0IGEKY29tbWVudCBpbiBQeXRob24uCgpUaGUgc2NyaXB0IGNhbiBiZSBnaXZlbiBhIGV4ZWN1dGFibGUgbW9kZSwgb3IgcGVybWlzc2lvbiwgdXNpbmcgdGhlClxwcm9ncmFte2NobW9kfSBjb21tYW5kOgoKXGJlZ2lue3ZlcmJhdGltfQokIGNobW9kICt4IG15c2NyaXB0LnB5ClxlbmR7dmVyYmF0aW19ICUgJCA8LS0gYm93IHRvIGZvbnQtbG9jawoKClxzdWJzZWN0aW9ue1NvdXJjZSBDb2RlIEVuY29kaW5nfQoKSXQgaXMgcG9zc2libGUgdG8gdXNlIGVuY29kaW5ncyBkaWZmZXJlbnQgdGhhbiBcQVNDSUl7fSBpbiBQeXRob24gc291cmNlCmZpbGVzLiBUaGUgYmVzdCB3YXkgdG8gZG8gaXQgaXMgdG8gcHV0IG9uZSBtb3JlIHNwZWNpYWwgY29tbWVudCBsaW5lCnJpZ2h0IGFmdGVyIHRoZSBcY29kZXtcIyF9IGxpbmUgdG8gZGVmaW5lIHRoZSBzb3VyY2UgZmlsZSBlbmNvZGluZzoKClxiZWdpbnt2ZXJiYXRpbX0KIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLSAKXGVuZHt2ZXJiYXRpbX0KCldpdGggdGhhdCBkZWNsYXJhdGlvbiwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBmaWxlIHdpbGwgYmUgdHJlYXRlZCBhcwp7fVxjb2Rle2lzby04ODU5LTF9LCBhbmQgaXQgd2lsbCBiZQpwb3NzaWJsZSB0byBkaXJlY3RseSB3cml0ZSBVbmljb2RlIHN0cmluZyBsaXRlcmFscyBpbiB0aGUgc2VsZWN0ZWQKZW5jb2RpbmcuICBUaGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MgY2FuIGJlIGZvdW5kIGluIHRoZQpcY2l0ZXRpdGxlWy4uL2xpYi9saWIuaHRtbF17UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSwgaW4gdGhlIHNlY3Rpb24Kb24gXHVsaW5re1xtb2R1bGV7Y29kZWNzfX17Li4vbGliL21vZHVsZS1jb2RlY3MuaHRtbH0uCgpJZiB5b3VyIGVkaXRvciBzdXBwb3J0cyBzYXZpbmcgZmlsZXMgYXMgXGNvZGV7VVRGLTh9IHdpdGggYSBVVEYtOApcZW1waHtieXRlIG9yZGVyIG1hcmt9IChha2EgQk9NKSwgeW91IGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIGFuCmVuY29kaW5nIGRlY2xhcmF0aW9uLiBJRExFIHN1cHBvcnRzIHRoaXMgY2FwYWJpbGl0eSBpZgpcY29kZXtPcHRpb25zL0dlbmVyYWwvRGVmYXVsdCBTb3VyY2UgRW5jb2RpbmcvVVRGLTh9IGlzIHNldC4gTm90aWNlCnRoYXQgdGhpcyBzaWduYXR1cmUgaXMgbm90IHVuZGVyc3Rvb2QgaW4gb2xkZXIgUHl0aG9uIHJlbGVhc2VzICgyLjIKYW5kIGVhcmxpZXIpLCBhbmQgYWxzbyBub3QgdW5kZXJzdG9vZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBmb3IKXGNvZGV7XCMhfSBmaWxlcy4KCkJ5IHVzaW5nIFVURi04IChlaXRoZXIgdGhyb3VnaCB0aGUgc2lnbmF0dXJlIG9yIGFuIGVuY29kaW5nCmRlY2xhcmF0aW9uKSwgY2hhcmFjdGVycyBvZiBtb3N0IGxhbmd1YWdlcyBpbiB0aGUgd29ybGQgY2FuIGJlIHVzZWQKc2ltdWx0YW5lb3VzbHkgaW4gc3RyaW5nIGxpdGVyYWxzIGFuZCBjb21tZW50cy4gVXNpbmcgbm9uLVxBU0NJSQpjaGFyYWN0ZXJzIGluIGlkZW50aWZpZXJzIGlzIG5vdCBzdXBwb3J0ZWQuIFRvIGRpc3BsYXkgYWxsIHRoZXNlCmNoYXJhY3RlcnMgcHJvcGVybHksIHlvdXIgZWRpdG9yIG11c3QgcmVjb2duaXplIHRoYXQgdGhlIGZpbGUgaXMKVVRGLTgsIGFuZCBpdCBtdXN0IHVzZSBhIGZvbnQgdGhhdCBzdXBwb3J0cyBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlCmZpbGUuCgpcc3Vic2VjdGlvbntUaGUgSW50ZXJhY3RpdmUgU3RhcnR1cCBGaWxlIFxsYWJlbHtzdGFydHVwfX0KCiUgWFhYIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGR1bXBlZCBpbiBhbiBhcHBlbmRpeCwgc2luY2UgbW9zdCBwZW9wbGUKJSBkb24ndCB1c2UgUHl0aG9uIGludGVyYWN0aXZlbHkgaW4gbm9uLXRyaXZpYWwgd2F5cy4KCldoZW4geW91IHVzZSBQeXRob24gaW50ZXJhY3RpdmVseSwgaXQgaXMgZnJlcXVlbnRseSBoYW5keSB0byBoYXZlIHNvbWUKc3RhbmRhcmQgY29tbWFuZHMgZXhlY3V0ZWQgZXZlcnkgdGltZSB0aGUgaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZC4gIFlvdQpjYW4gZG8gdGhpcyBieSBzZXR0aW5nIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkClxlbnZ2YXJ7UFlUSE9OU1RBUlRVUH0gdG8gdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgeW91ciBzdGFydC11cApjb21tYW5kcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgXGZpbGV7LnByb2ZpbGV9IGZlYXR1cmUgb2YgdGhlClxVTklYe30gc2hlbGxzLgoKVGhpcyBmaWxlIGlzIG9ubHkgcmVhZCBpbiBpbnRlcmFjdGl2ZSBzZXNzaW9ucywgbm90IHdoZW4gUHl0aG9uIHJlYWRzCmNvbW1hbmRzIGZyb20gYSBzY3JpcHQsIGFuZCBub3Qgd2hlbiBcZmlsZXsvZGV2L3R0eX0gaXMgZ2l2ZW4gYXMgdGhlCmV4cGxpY2l0IHNvdXJjZSBvZiBjb21tYW5kcyAod2hpY2ggb3RoZXJ3aXNlIGJlaGF2ZXMgbGlrZSBhbgppbnRlcmFjdGl2ZSBzZXNzaW9uKS4gIEl0IGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG5hbWVzcGFjZSB3aGVyZQppbnRlcmFjdGl2ZSBjb21tYW5kcyBhcmUgZXhlY3V0ZWQsIHNvIHRoYXQgb2JqZWN0cyB0aGF0IGl0IGRlZmluZXMgb3IKaW1wb3J0cyBjYW4gYmUgdXNlZCB3aXRob3V0IHF1YWxpZmljYXRpb24gaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24uCllvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIHByb21wdHMgXGNvZGV7c3lzLnBzMX0gYW5kIFxjb2Rle3N5cy5wczJ9IGluCnRoaXMgZmlsZS4KCklmIHlvdSB3YW50IHRvIHJlYWQgYW4gYWRkaXRpb25hbCBzdGFydC11cCBmaWxlIGZyb20gdGhlIGN1cnJlbnQKZGlyZWN0b3J5LCB5b3UgY2FuIHByb2dyYW0gdGhpcyBpbiB0aGUgZ2xvYmFsIHN0YXJ0LXVwIGZpbGUgdXNpbmcgY29kZQpsaWtlIFxzYW1we2lmIG9zLnBhdGguaXNmaWxlKCcucHl0aG9ucmMucHknKToKZXhlY2ZpbGUoJy5weXRob25yYy5weScpfS4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgc3RhcnR1cCBmaWxlIGluIGEKc2NyaXB0LCB5b3UgbXVzdCBkbyB0aGlzIGV4cGxpY2l0bHkgaW4gdGhlIHNjcmlwdDoKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IG9zCmZpbGVuYW1lID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlNUQVJUVVAnKQppZiBmaWxlbmFtZSBhbmQgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgZXhlY2ZpbGUoZmlsZW5hbWUpClxlbmR7dmVyYmF0aW19CgoKXGNoYXB0ZXJ7QW4gSW5mb3JtYWwgSW50cm9kdWN0aW9uIHRvIFB5dGhvbiBcbGFiZWx7aW5mb3JtYWx9fQoKSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgaW5wdXQgYW5kIG91dHB1dCBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUKcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBwcm9tcHRzIChcc2FtcHs+XGNvZGV7Pn0+fn0gYW5kIFxzYW1wey4uLn59KTogdG8gcmVwZWF0CnRoZSBleGFtcGxlLCB5b3UgbXVzdCB0eXBlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHByb21wdCwgd2hlbiB0aGUKcHJvbXB0IGFwcGVhcnM7IGxpbmVzIHRoYXQgZG8gbm90IGJlZ2luIHdpdGggYSBwcm9tcHQgYXJlIG91dHB1dCBmcm9tCnRoZSBpbnRlcnByZXRlci4gJQolXGZvb3Rub3RlewolICAgICAgICBJJ2QgcHJlZmVyIHRvIHVzZSBkaWZmZXJlbnQgZm9udHMgdG8gZGlzdGluZ3Vpc2ggaW5wdXQKJSAgICAgICAgZnJvbSBvdXRwdXQsIGJ1dCB0aGUgYW1vdW50IG9mIExhVGVYIGhhY2tpbmcgdGhhdCB3b3VsZCByZXF1aXJlCiUgICAgICAgIGlzIGN1cnJlbnRseSBiZXlvbmQgbXkgYWJpbGl0eS4KJX0KTm90ZSB0aGF0IGEgc2Vjb25kYXJ5IHByb21wdCBvbiBhIGxpbmUgYnkgaXRzZWxmIGluIGFuIGV4YW1wbGUgbWVhbnMKeW91IG11c3QgdHlwZSBhIGJsYW5rIGxpbmU7IHRoaXMgaXMgdXNlZCB0byBlbmQgYSBtdWx0aS1saW5lIGNvbW1hbmQuCgpNYW55IG9mIHRoZSBleGFtcGxlcyBpbiB0aGlzIG1hbnVhbCwgZXZlbiB0aG9zZSBlbnRlcmVkIGF0IHRoZQppbnRlcmFjdGl2ZSBwcm9tcHQsIGluY2x1ZGUgY29tbWVudHMuICBDb21tZW50cyBpbiBQeXRob24gc3RhcnQgd2l0aAp0aGUgaGFzaCBjaGFyYWN0ZXIsIFxjaGFyYWN0ZXJ7XCN9LCBhbmQgZXh0ZW5kIHRvIHRoZSBlbmQgb2YgdGhlCnBoeXNpY2FsIGxpbmUuICBBIGNvbW1lbnQgbWF5IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG9yCmZvbGxvd2luZyB3aGl0ZXNwYWNlIG9yIGNvZGUsIGJ1dCBub3Qgd2l0aGluIGEgc3RyaW5nIGxpdGVyYWwuICBBIGhhc2ggCmNoYXJhY3RlciB3aXRoaW4gYSBzdHJpbmcgbGl0ZXJhbCBpcyBqdXN0IGEgaGFzaCBjaGFyYWN0ZXIuCgpTb21lIGV4YW1wbGVzOgoKXGJlZ2lue3ZlcmJhdGltfQojIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1lbnQKU1BBTSA9IDEgICAgICAgICAgICAgICAgICMgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLiBhbmQgbm93IGEgdGhpcmQhClNUUklORyA9ICIjIFRoaXMgaXMgbm90IGEgY29tbWVudC4iClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257VXNpbmcgUHl0aG9uIGFzIGEgQ2FsY3VsYXRvciBcbGFiZWx7Y2FsY3VsYXRvcn19CgpMZXQncyB0cnkgc29tZSBzaW1wbGUgUHl0aG9uIGNvbW1hbmRzLiAgU3RhcnQgdGhlIGludGVycHJldGVyIGFuZCB3YWl0CmZvciB0aGUgcHJpbWFyeSBwcm9tcHQsIFxzYW1wez5cY29kZXs+fT5+fS4gIChJdCBzaG91bGRuJ3QgdGFrZSBsb25nLikKClxzdWJzZWN0aW9ue051bWJlcnMgXGxhYmVse251bWJlcnN9fQoKVGhlIGludGVycHJldGVyIGFjdHMgYXMgYSBzaW1wbGUgY2FsY3VsYXRvcjogeW91IGNhbiB0eXBlIGFuCmV4cHJlc3Npb24gYXQgaXQgYW5kIGl0IHdpbGwgd3JpdGUgdGhlIHZhbHVlLiAgRXhwcmVzc2lvbiBzeW50YXggaXMKc3RyYWlnaHRmb3J3YXJkOiB0aGUgb3BlcmF0b3JzIFxjb2Rleyt9LCBcY29kZXstfSwgXGNvZGV7Kn0gYW5kClxjb2Rley99IHdvcmsganVzdCBsaWtlIGluIG1vc3Qgb3RoZXIgbGFuZ3VhZ2VzIChmb3IgZXhhbXBsZSwgUGFzY2FsCm9yIEMpOyBwYXJlbnRoZXNlcyBjYW4gYmUgdXNlZCBmb3IgZ3JvdXBpbmcuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDIrMgo0Cj4+PiAjIFRoaXMgaXMgYSBjb21tZW50Ci4uLiAyKzIKNAo+Pj4gMisyICAjIGFuZCBhIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSBhcyBjb2RlCjQKPj4+ICg1MC01KjYpLzQKNQo+Pj4gIyBJbnRlZ2VyIGRpdmlzaW9uIHJldHVybnMgdGhlIGZsb29yOgouLi4gNy8zCjIKPj4+IDcvLTMKLTMKXGVuZHt2ZXJiYXRpbX0KCkxpa2UgaW4gQywgdGhlIGVxdWFsIHNpZ24gKFxjaGFyYWN0ZXJ7PX0pIGlzIHVzZWQgdG8gYXNzaWduIGEgdmFsdWUgdG8gYQp2YXJpYWJsZS4gIFRoZSB2YWx1ZSBvZiBhbiBhc3NpZ25tZW50IGlzIG5vdCB3cml0dGVuOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd2lkdGggPSAyMAo+Pj4gaGVpZ2h0ID0gNSo5Cj4+PiB3aWR0aCAqIGhlaWdodAo5MDAKXGVuZHt2ZXJiYXRpbX0KCkEgdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIHNldmVyYWwgdmFyaWFibGVzIHNpbXVsdGFuZW91c2x5OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4geCA9IHkgPSB6ID0gMCAgIyBaZXJvIHgsIHkgYW5kIHoKPj4+IHgKMAo+Pj4geQowCj4+PiB6CjAKXGVuZHt2ZXJiYXRpbX0KClRoZXJlIGlzIGZ1bGwgc3VwcG9ydCBmb3IgZmxvYXRpbmcgcG9pbnQ7IG9wZXJhdG9ycyB3aXRoIG1peGVkIHR5cGUKb3BlcmFuZHMgY29udmVydCB0aGUgaW50ZWdlciBvcGVyYW5kIHRvIGZsb2F0aW5nIHBvaW50OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gMyAqIDMuNzUgLyAxLjUKNy41Cj4+PiA3LjAgLyAyCjMuNQpcZW5ke3ZlcmJhdGltfQoKQ29tcGxleCBudW1iZXJzIGFyZSBhbHNvIHN1cHBvcnRlZDsgaW1hZ2luYXJ5IG51bWJlcnMgYXJlIHdyaXR0ZW4gd2l0aAphIHN1ZmZpeCBvZiBcc2FtcHtqfSBvciBcc2FtcHtKfS4gIENvbXBsZXggbnVtYmVycyB3aXRoIGEgbm9uemVybwpyZWFsIGNvbXBvbmVudCBhcmUgd3JpdHRlbiBhcyBcc2FtcHsoXHZhcntyZWFsfStcdmFye2ltYWd9ail9LCBvciBjYW4KYmUgY3JlYXRlZCB3aXRoIHRoZSBcc2FtcHtjb21wbGV4KFx2YXJ7cmVhbH0sIFx2YXJ7aW1hZ30pfSBmdW5jdGlvbi4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDFqICogMUoKKC0xKzBqKQo+Pj4gMWogKiBjb21wbGV4KDAsMSkKKC0xKzBqKQo+Pj4gMysxaiozCigzKzNqKQo+Pj4gKDMrMWopKjMKKDkrM2opCj4+PiAoMSsyaikvKDErMWopCigxLjUrMC41aikKXGVuZHt2ZXJiYXRpbX0KCkNvbXBsZXggbnVtYmVycyBhcmUgYWx3YXlzIHJlcHJlc2VudGVkIGFzIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXJzLAp0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQuICBUbyBleHRyYWN0IHRoZXNlIHBhcnRzIGZyb20gYSBjb21wbGV4Cm51bWJlciBcdmFye3p9LCB1c2UgXGNvZGV7XHZhcnt6fS5yZWFsfSBhbmQgXGNvZGV7XHZhcnt6fS5pbWFnfS4gIAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYT0xLjUrMC41ago+Pj4gYS5yZWFsCjEuNQo+Pj4gYS5pbWFnCjAuNQpcZW5ke3ZlcmJhdGltfQoKVGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRvIGZsb2F0aW5nIHBvaW50IGFuZCBpbnRlZ2VyCihcZnVuY3Rpb257ZmxvYXQoKX0sIFxmdW5jdGlvbntpbnQoKX0gYW5kIFxmdW5jdGlvbntsb25nKCl9KSBkb24ndAp3b3JrIGZvciBjb21wbGV4IG51bWJlcnMgLS0tIHRoZXJlIGlzIG5vIG9uZSBjb3JyZWN0IHdheSB0byBjb252ZXJ0IGEKY29tcGxleCBudW1iZXIgdG8gYSByZWFsIG51bWJlci4gIFVzZSBcY29kZXthYnMoXHZhcnt6fSl9IHRvIGdldCBpdHMKbWFnbml0dWRlIChhcyBhIGZsb2F0KSBvciBcY29kZXt6LnJlYWx9IHRvIGdldCBpdHMgcmVhbCBwYXJ0LgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYT0zLjArNC4wago+Pj4gZmxvYXQoYSkKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KVHlwZUVycm9yOiBjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXQ7IHVzZSBhYnMoeikKPj4+IGEucmVhbAozLjAKPj4+IGEuaW1hZwo0LjAKPj4+IGFicyhhKSAgIyBzcXJ0KGEucmVhbCoqMiArIGEuaW1hZyoqMikKNS4wCj4+PgpcZW5ke3ZlcmJhdGltfQoKSW4gaW50ZXJhY3RpdmUgbW9kZSwgdGhlIGxhc3QgcHJpbnRlZCBleHByZXNzaW9uIGlzIGFzc2lnbmVkIHRvIHRoZQp2YXJpYWJsZSBcY29kZXtffS4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHlvdSBhcmUgdXNpbmcgUHl0aG9uIGFzIGEKZGVzayBjYWxjdWxhdG9yLCBpdCBpcyBzb21ld2hhdCBlYXNpZXIgdG8gY29udGludWUgY2FsY3VsYXRpb25zLCBmb3IKZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRheCA9IDEyLjUgLyAxMDAKPj4+IHByaWNlID0gMTAwLjUwCj4+PiBwcmljZSAqIHRheAoxMi41NjI1Cj4+PiBwcmljZSArIF8KMTEzLjA2MjUKPj4+IHJvdW5kKF8sIDIpCjExMy4wNgo+Pj4KXGVuZHt2ZXJiYXRpbX0KClRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVhZC1vbmx5IGJ5IHRoZSB1c2VyLiAgRG9uJ3QKZXhwbGljaXRseSBhc3NpZ24gYSB2YWx1ZSB0byBpdCAtLS0geW91IHdvdWxkIGNyZWF0ZSBhbiBpbmRlcGVuZGVudApsb2NhbCB2YXJpYWJsZSB3aXRoIHRoZSBzYW1lIG5hbWUgbWFza2luZyB0aGUgYnVpbHQtaW4gdmFyaWFibGUgd2l0aAppdHMgbWFnaWMgYmVoYXZpb3IuCgpcc3Vic2VjdGlvbntTdHJpbmdzIFxsYWJlbHtzdHJpbmdzfX0KCkJlc2lkZXMgbnVtYmVycywgUHl0aG9uIGNhbiBhbHNvIG1hbmlwdWxhdGUgc3RyaW5ncywgd2hpY2ggY2FuIGJlCmV4cHJlc3NlZCBpbiBzZXZlcmFsIHdheXMuICBUaGV5IGNhbiBiZSBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIG9yCmRvdWJsZSBxdW90ZXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAnc3BhbSBlZ2dzJwonc3BhbSBlZ2dzJwo+Pj4gJ2RvZXNuXCd0JwoiZG9lc24ndCIKPj4+ICJkb2Vzbid0IgoiZG9lc24ndCIKPj4+ICciWWVzLCIgaGUgc2FpZC4nCiciWWVzLCIgaGUgc2FpZC4nCj4+PiAiXCJZZXMsXCIgaGUgc2FpZC4iCiciWWVzLCIgaGUgc2FpZC4nCj4+PiAnIklzblwndCwiIHNoZSBzYWlkLicKJyJJc25cJ3QsIiBzaGUgc2FpZC4nClxlbmR7dmVyYmF0aW19CgpTdHJpbmcgbGl0ZXJhbHMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgaW4gc2V2ZXJhbCB3YXlzLiAgQ29udGludWF0aW9uCmxpbmVzIGNhbiBiZSB1c2VkLCB3aXRoIGEgYmFja3NsYXNoIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZQppbmRpY2F0aW5nIHRoYXQgdGhlIG5leHQgbGluZSBpcyBhIGxvZ2ljYWwgY29udGludWF0aW9uIG9mIHRoZSBsaW5lOgoKXGJlZ2lue3ZlcmJhdGltfQpoZWxsbyA9ICJUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmdcblwKc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IGp1c3QgYXMgeW91IHdvdWxkIGRvIGluIEMuXG5cCiAgICBOb3RlIHRoYXQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGlzXAogc2lnbmlmaWNhbnQuIgoKcHJpbnQgaGVsbG8KXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBuZXdsaW5lcyB3b3VsZCBzdGlsbCBuZWVkIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcgdXNpbmcKXGNvZGV7XGUgbn07IHRoZSBuZXdsaW5lIGZvbGxvd2luZyB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIGlzCmRpc2NhcmRlZC4gIFRoaXMgZXhhbXBsZSB3b3VsZCBwcmludCB0aGUgZm9sbG93aW5nOgoKXGJlZ2lue3ZlcmJhdGltfQpUaGlzIGlzIGEgcmF0aGVyIGxvbmcgc3RyaW5nIGNvbnRhaW5pbmcKc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0IGp1c3QgYXMgeW91IHdvdWxkIGRvIGluIEMuCiAgICBOb3RlIHRoYXQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGlzIHNpZ25pZmljYW50LgpcZW5ke3ZlcmJhdGltfQoKSWYgd2UgbWFrZSB0aGUgc3RyaW5nIGxpdGVyYWwgYSBgYHJhdycnIHN0cmluZywgaG93ZXZlciwgdGhlClxjb2Rle1xlIG59IHNlcXVlbmNlcyBhcmUgbm90IGNvbnZlcnRlZCB0byBuZXdsaW5lcywgYnV0IHRoZSBiYWNrc2xhc2gKYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgYW5kIHRoZSBuZXdsaW5lIGNoYXJhY3RlciBpbiB0aGUgc291cmNlLCBhcmUKYm90aCBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGFzIGRhdGEuICBUaHVzLCB0aGUgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KaGVsbG8gPSByIlRoaXMgaXMgYSByYXRoZXIgbG9uZyBzdHJpbmcgY29udGFpbmluZ1xuXApzZXZlcmFsIGxpbmVzIG9mIHRleHQgbXVjaCBhcyB5b3Ugd291bGQgZG8gaW4gQy4iCgpwcmludCBoZWxsbwpcZW5ke3ZlcmJhdGltfQoKd291bGQgcHJpbnQ6CgpcYmVnaW57dmVyYmF0aW19ClRoaXMgaXMgYSByYXRoZXIgbG9uZyBzdHJpbmcgY29udGFpbmluZ1xuXApzZXZlcmFsIGxpbmVzIG9mIHRleHQgbXVjaCBhcyB5b3Ugd291bGQgZG8gaW4gQy4KXGVuZHt2ZXJiYXRpbX0KCk9yLCBzdHJpbmdzIGNhbiBiZSBzdXJyb3VuZGVkIGluIGEgcGFpciBvZiBtYXRjaGluZyB0cmlwbGUtcXVvdGVzOgpcY29kZXsiIiJ9IG9yIFxjb2RleydcY29kZXsnfSd9LiAgRW5kIG9mIGxpbmVzIGRvIG5vdCBuZWVkIHRvIGJlIGVzY2FwZWQKd2hlbiB1c2luZyB0cmlwbGUtcXVvdGVzLCBidXQgdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcuCgpcYmVnaW57dmVyYmF0aW19CnByaW50ICIiIgpVc2FnZTogdGhpbmd5IFtPUFRJT05TXSAKICAgICAtaCAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlCiAgICAgLUggaG9zdG5hbWUgICAgICAgICAgICAgICBIb3N0bmFtZSB0byBjb25uZWN0IHRvCiIiIgpcZW5ke3ZlcmJhdGltfQoKcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CgpcYmVnaW57dmVyYmF0aW19ClVzYWdlOiB0aGluZ3kgW09QVElPTlNdIAogICAgIC1oICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2UKICAgICAtSCBob3N0bmFtZSAgICAgICAgICAgICAgIEhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KXGVuZHt2ZXJiYXRpbX0KClRoZSBpbnRlcnByZXRlciBwcmludHMgdGhlIHJlc3VsdCBvZiBzdHJpbmcgb3BlcmF0aW9ucyBpbiB0aGUgc2FtZSB3YXkKYXMgdGhleSBhcmUgdHlwZWQgZm9yIGlucHV0OiBpbnNpZGUgcXVvdGVzLCBhbmQgd2l0aCBxdW90ZXMgYW5kIG90aGVyCmZ1bm55IGNoYXJhY3RlcnMgZXNjYXBlZCBieSBiYWNrc2xhc2hlcywgdG8gc2hvdyB0aGUgcHJlY2lzZQp2YWx1ZS4gIFRoZSBzdHJpbmcgaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCmEgc2luZ2xlIHF1b3RlIGFuZCBubyBkb3VibGUgcXVvdGVzLCBlbHNlIGl0J3MgZW5jbG9zZWQgaW4gc2luZ2xlCnF1b3Rlcy4gIChUaGUgXGtleXdvcmR7cHJpbnR9IHN0YXRlbWVudCwgZGVzY3JpYmVkIGxhdGVyLCBjYW4gYmUgdXNlZAp0byB3cml0ZSBzdHJpbmdzIHdpdGhvdXQgcXVvdGVzIG9yIGVzY2FwZXMuKQoKU3RyaW5ncyBjYW4gYmUgY29uY2F0ZW5hdGVkIChnbHVlZCB0b2dldGhlcikgd2l0aCB0aGUKXGNvZGV7K30gb3BlcmF0b3IsIGFuZCByZXBlYXRlZCB3aXRoIFxjb2Rleyp9OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd29yZCA9ICdIZWxwJyArICdBJwo+Pj4gd29yZAonSGVscEEnCj4+PiAnPCcgKyB3b3JkKjUgKyAnPicKJzxIZWxwQUhlbHBBSGVscEFIZWxwQUhlbHBBPicKXGVuZHt2ZXJiYXRpbX0KClR3byBzdHJpbmcgbGl0ZXJhbHMgbmV4dCB0byBlYWNoIG90aGVyIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZDsKdGhlIGZpcnN0IGxpbmUgYWJvdmUgY291bGQgYWxzbyBoYXZlIGJlZW4gd3JpdHRlbiBcc2FtcHt3b3JkID0gJ0hlbHAnCidBJ307IHRoaXMgb25seSB3b3JrcyB3aXRoIHR3byBsaXRlcmFscywgbm90IHdpdGggYXJiaXRyYXJ5IHN0cmluZwpleHByZXNzaW9uczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+ICdzdHInICdpbmcnICAgICAgICAgICAgICAgICAgICMgIDwtICBUaGlzIGlzIG9rCidzdHJpbmcnCj4+PiAnc3RyJy5zdHJpcCgpICsgJ2luZycgICAjICA8LSAgVGhpcyBpcyBvawonc3RyaW5nJwo+Pj4gJ3N0cicuc3RyaXAoKSAnaW5nJyAgICAgIyAgPC0gIFRoaXMgaXMgaW52YWxpZAogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgICdzdHInLnN0cmlwKCkgJ2luZycKICAgICAgICAgICAgICAgICAgICAgIF4KU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4ClxlbmR7dmVyYmF0aW19CgpTdHJpbmdzIGNhbiBiZSBzdWJzY3JpcHRlZCAoaW5kZXhlZCk7IGxpa2UgaW4gQywgdGhlIGZpcnN0IGNoYXJhY3RlcgpvZiBhIHN0cmluZyBoYXMgc3Vic2NyaXB0IChpbmRleCkgMC4gIFRoZXJlIGlzIG5vIHNlcGFyYXRlIGNoYXJhY3Rlcgp0eXBlOyBhIGNoYXJhY3RlciBpcyBzaW1wbHkgYSBzdHJpbmcgb2Ygc2l6ZSBvbmUuICBMaWtlIGluIEljb24sCnN1YnN0cmluZ3MgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZSBcZW1waHtzbGljZSBub3RhdGlvbn06IHR3byBpbmRpY2VzCnNlcGFyYXRlZCBieSBhIGNvbG9uLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd29yZFs0XQonQScKPj4+IHdvcmRbMDoyXQonSGUnCj4+PiB3b3JkWzI6NF0KJ2xwJwpcZW5ke3ZlcmJhdGltfQoKU2xpY2UgaW5kaWNlcyBoYXZlIHVzZWZ1bCBkZWZhdWx0czsgYW4gb21pdHRlZCBmaXJzdCBpbmRleCBkZWZhdWx0cyB0bwp6ZXJvLCBhbiBvbWl0dGVkIHNlY29uZCBpbmRleCBkZWZhdWx0cyB0byB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIGJlaW5nCnNsaWNlZC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbOjJdICAgICMgVGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzCidIZScKPj4+IHdvcmRbMjpdICAgICMgQWxsIGJ1dCB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMKJ2xwQScKXGVuZHt2ZXJiYXRpbX0KClVubGlrZSBhIEMgc3RyaW5nLCBQeXRob24gc3RyaW5ncyBjYW5ub3QgYmUgY2hhbmdlZC4gIEFzc2lnbmluZyB0byBhbiAKaW5kZXhlZCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIHJlc3VsdHMgaW4gYW4gZXJyb3I6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3b3JkWzBdID0gJ3gnClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClR5cGVFcnJvcjogb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKPj4+IHdvcmRbOjFdID0gJ1NwbGF0JwpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpUeXBlRXJyb3I6IG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgYXNzaWdubWVudApcZW5ke3ZlcmJhdGltfQoKSG93ZXZlciwgY3JlYXRpbmcgYSBuZXcgc3RyaW5nIHdpdGggdGhlIGNvbWJpbmVkIGNvbnRlbnQgaXMgZWFzeSBhbmQKZWZmaWNpZW50OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gJ3gnICsgd29yZFsxOl0KJ3hlbHBBJwo+Pj4gJ1NwbGF0JyArIHdvcmRbNF0KJ1NwbGF0QScKXGVuZHt2ZXJiYXRpbX0KCkhlcmUncyBhIHVzZWZ1bCBpbnZhcmlhbnQgb2Ygc2xpY2Ugb3BlcmF0aW9uczoKXGNvZGV7c1s6aV0gKyBzW2k6XX0gZXF1YWxzIFxjb2Rle3N9LgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd29yZFs6Ml0gKyB3b3JkWzI6XQonSGVscEEnCj4+PiB3b3JkWzozXSArIHdvcmRbMzpdCidIZWxwQScKXGVuZHt2ZXJiYXRpbX0KCkRlZ2VuZXJhdGUgc2xpY2UgaW5kaWNlcyBhcmUgaGFuZGxlZCBncmFjZWZ1bGx5OiBhbiBpbmRleCB0aGF0IGlzIHRvbwpsYXJnZSBpcyByZXBsYWNlZCBieSB0aGUgc3RyaW5nIHNpemUsIGFuIHVwcGVyIGJvdW5kIHNtYWxsZXIgdGhhbiB0aGUKbG93ZXIgYm91bmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3b3JkWzE6MTAwXQonZWxwQScKPj4+IHdvcmRbMTA6XQonJwo+Pj4gd29yZFsyOjFdCicnClxlbmR7dmVyYmF0aW19CgpJbmRpY2VzIG1heSBiZSBuZWdhdGl2ZSBudW1iZXJzLCB0byBzdGFydCBjb3VudGluZyBmcm9tIHRoZSByaWdodC4KRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3b3JkWy0xXSAgICAgIyBUaGUgbGFzdCBjaGFyYWN0ZXIKJ0EnCj4+PiB3b3JkWy0yXSAgICAgIyBUaGUgbGFzdC1idXQtb25lIGNoYXJhY3RlcgoncCcKPj4+IHdvcmRbLTI6XSAgICAjIFRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzCidwQScKPj4+IHdvcmRbOi0yXSAgICAjIEFsbCBidXQgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMKJ0hlbCcKXGVuZHt2ZXJiYXRpbX0KCkJ1dCBub3RlIHRoYXQgLTAgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIDAsIHNvIGl0IGRvZXMgbm90IGNvdW50IGZyb20KdGhlIHJpZ2h0IQoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gd29yZFstMF0gICAgICMgKHNpbmNlIC0wIGVxdWFscyAwKQonSCcKXGVuZHt2ZXJiYXRpbX0KCk91dC1vZi1yYW5nZSBuZWdhdGl2ZSBzbGljZSBpbmRpY2VzIGFyZSB0cnVuY2F0ZWQsIGJ1dCBkb24ndCB0cnkgdGhpcwpmb3Igc2luZ2xlLWVsZW1lbnQgKG5vbi1zbGljZSkgaW5kaWNlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdvcmRbLTEwMDpdCidIZWxwQScKPj4+IHdvcmRbLTEwXSAgICAjIGVycm9yClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CkluZGV4RXJyb3I6IHN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UKXGVuZHt2ZXJiYXRpbX0KClRoZSBiZXN0IHdheSB0byByZW1lbWJlciBob3cgc2xpY2VzIHdvcmsgaXMgdG8gdGhpbmsgb2YgdGhlIGluZGljZXMgYXMKcG9pbnRpbmcgXGVtcGh7YmV0d2Vlbn0gY2hhcmFjdGVycywgd2l0aCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBmaXJzdApjaGFyYWN0ZXIgbnVtYmVyZWQgMC4gIFRoZW4gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGEKc3RyaW5nIG9mIFx2YXJ7bn0gY2hhcmFjdGVycyBoYXMgaW5kZXggXHZhcntufSwgZm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CiArLS0tKy0tLSstLS0rLS0tKy0tLSsgCiB8IEggfCBlIHwgbCB8IHAgfCBBIHwKICstLS0rLS0tKy0tLSstLS0rLS0tKyAKIDAgICAxICAgMiAgIDMgICA0ICAgNSAKLTUgIC00ICAtMyAgLTIgIC0xClxlbmR7dmVyYmF0aW19CgpUaGUgZmlyc3Qgcm93IG9mIG51bWJlcnMgZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbmRpY2VzIDAuLi41IGluCnRoZSBzdHJpbmc7IHRoZSBzZWNvbmQgcm93IGdpdmVzIHRoZSBjb3JyZXNwb25kaW5nIG5lZ2F0aXZlIGluZGljZXMuClRoZSBzbGljZSBmcm9tIFx2YXJ7aX0gdG8gXHZhcntqfSBjb25zaXN0cyBvZiBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuCnRoZSBlZGdlcyBsYWJlbGVkIFx2YXJ7aX0gYW5kIFx2YXJ7an0sIHJlc3BlY3RpdmVseS4KCkZvciBub24tbmVnYXRpdmUgaW5kaWNlcywgdGhlIGxlbmd0aCBvZiBhIHNsaWNlIGlzIHRoZSBkaWZmZXJlbmNlIG9mCnRoZSBpbmRpY2VzLCBpZiBib3RoIGFyZSB3aXRoaW4gYm91bmRzLiAgRm9yIGV4YW1wbGUsIHRoZSBsZW5ndGggb2YKXGNvZGV7d29yZFsxOjNdfSBpcyAyLgoKVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcyA9ICdzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzJwo+Pj4gbGVuKHMpCjM0ClxlbmR7dmVyYmF0aW19CgoKXGJlZ2lue3NlZWFsc299CiAgXHNlZXRpdGxlWy4uL2xpYi90eXBlc3NlcS5odG1sXXtTZXF1ZW5jZSBUeXBlc30lCiAgICAgICAgICAge1N0cmluZ3MsIGFuZCB0aGUgVW5pY29kZSBzdHJpbmdzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dAogICAgICAgICAgICBzZWN0aW9uLCBhcmUgZXhhbXBsZXMgb2YgXGVtcGh7c2VxdWVuY2UgdHlwZXN9LCBhbmQKICAgICAgICAgICAgc3VwcG9ydCB0aGUgY29tbW9uIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHN1Y2ggdHlwZXMufQogIFxzZWV0aXRsZVsuLi9saWIvc3RyaW5nLW1ldGhvZHMuaHRtbF17U3RyaW5nIE1ldGhvZHN9JQogICAgICAgICAgIHtCb3RoIHN0cmluZ3MgYW5kIFVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IGEgbGFyZ2UgbnVtYmVyIG9mCiAgICAgICAgICAgIG1ldGhvZHMgZm9yIGJhc2ljIHRyYW5zZm9ybWF0aW9ucyBhbmQgc2VhcmNoaW5nLn0KICBcc2VldGl0bGVbLi4vbGliL3R5cGVzc2VxLXN0cmluZ3MuaHRtbF17U3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9uc30lCiAgICAgICAgICAge1RoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgaW52b2tlZCB3aGVuIHN0cmluZ3MgYW5kIFVuaWNvZGUKICAgICAgICAgICAgc3RyaW5ncyBhcmUgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGUgXGNvZGV7XCV9IG9wZXJhdG9yIGFyZQogICAgICAgICAgICBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaGVyZS59ClxlbmR7c2VlYWxzb30KCgpcc3Vic2VjdGlvbntVbmljb2RlIFN0cmluZ3MgXGxhYmVse3VuaWNvZGVTdHJpbmdzfX0KXHNlY3Rpb25hdXRob3J7TWFyYy1BbmRyZSBMZW1idXJnfXttYWxAbGVtYnVyZy5jb219CgpTdGFydGluZyB3aXRoIFB5dGhvbiAyLjAgYSBuZXcgZGF0YSB0eXBlIGZvciBzdG9yaW5nIHRleHQgZGF0YSBpcwphdmFpbGFibGUgdG8gdGhlIHByb2dyYW1tZXI6IHRoZSBVbmljb2RlIG9iamVjdC4gSXQgY2FuIGJlIHVzZWQgdG8Kc3RvcmUgYW5kIG1hbmlwdWxhdGUgVW5pY29kZSBkYXRhIChzZWUgXHVybHtodHRwOi8vd3d3LnVuaWNvZGUub3JnL30pCmFuZCBpbnRlZ3JhdGVzIHdlbGwgd2l0aCB0aGUgZXhpc3Rpbmcgc3RyaW5nIG9iamVjdHMgcHJvdmlkaW5nCmF1dG8tY29udmVyc2lvbnMgd2hlcmUgbmVjZXNzYXJ5LgoKVW5pY29kZSBoYXMgdGhlIGFkdmFudGFnZSBvZiBwcm92aWRpbmcgb25lIG9yZGluYWwgZm9yIGV2ZXJ5IGNoYXJhY3RlcgppbiBldmVyeSBzY3JpcHQgdXNlZCBpbiBtb2Rlcm4gYW5kIGFuY2llbnQgdGV4dHMuIFByZXZpb3VzbHksIHRoZXJlCndlcmUgb25seSAyNTYgcG9zc2libGUgb3JkaW5hbHMgZm9yIHNjcmlwdCBjaGFyYWN0ZXJzIGFuZCB0ZXh0cyB3ZXJlCnR5cGljYWxseSBib3VuZCB0byBhIGNvZGUgcGFnZSB3aGljaCBtYXBwZWQgdGhlIG9yZGluYWxzIHRvIHNjcmlwdApjaGFyYWN0ZXJzLiBUaGlzIGxlYWQgdG8gdmVyeSBtdWNoIGNvbmZ1c2lvbiBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdAp0byBpbnRlcm5hdGlvbmFsaXphdGlvbiAodXN1YWxseSB3cml0dGVuIGFzIFxzYW1we2kxOG59IC0tLQpcY2hhcmFjdGVye2l9ICsgMTggY2hhcmFjdGVycyArIFxjaGFyYWN0ZXJ7bn0pIG9mIHNvZnR3YXJlLiAgVW5pY29kZQpzb2x2ZXMgdGhlc2UgcHJvYmxlbXMgYnkgZGVmaW5pbmcgb25lIGNvZGUgcGFnZSBmb3IgYWxsIHNjcmlwdHMuCgpDcmVhdGluZyBVbmljb2RlIHN0cmluZ3MgaW4gUHl0aG9uIGlzIGp1c3QgYXMgc2ltcGxlIGFzIGNyZWF0aW5nCm5vcm1hbCBzdHJpbmdzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdSdIZWxsbyBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnClxlbmR7dmVyYmF0aW19CgpUaGUgc21hbGwgXGNoYXJhY3Rlcnt1fSBpbiBmcm9udCBvZiB0aGUgcXVvdGUgaW5kaWNhdGVzIHRoYXQgYW4KVW5pY29kZSBzdHJpbmcgaXMgc3VwcG9zZWQgdG8gYmUgY3JlYXRlZC4gSWYgeW91IHdhbnQgdG8gaW5jbHVkZQpzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgeW91IGNhbiBkbyBzbyBieSB1c2luZyB0aGUgUHl0aG9uClxlbXBoe1VuaWNvZGUtRXNjYXBlfSBlbmNvZGluZy4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHUnSGVsbG9cdTAwMjBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnClxlbmR7dmVyYmF0aW19CgpUaGUgZXNjYXBlIHNlcXVlbmNlIFxjb2Rle1xlIHUwMDIwfSBpbmRpY2F0ZXMgdG8gaW5zZXJ0IHRoZSBVbmljb2RlCmNoYXJhY3RlciB3aXRoIHRoZSBvcmRpbmFsIHZhbHVlIDB4MDAyMCAodGhlIHNwYWNlIGNoYXJhY3RlcikgYXQgdGhlCmdpdmVuIHBvc2l0aW9uLgoKT3RoZXIgY2hhcmFjdGVycyBhcmUgaW50ZXJwcmV0ZWQgYnkgdXNpbmcgdGhlaXIgcmVzcGVjdGl2ZSBvcmRpbmFsCnZhbHVlcyBkaXJlY3RseSBhcyBVbmljb2RlIG9yZGluYWxzLiAgSWYgeW91IGhhdmUgbGl0ZXJhbCBzdHJpbmdzCmluIHRoZSBzdGFuZGFyZCBMYXRpbi0xIGVuY29kaW5nIHRoYXQgaXMgdXNlZCBpbiBtYW55IFdlc3Rlcm4gY291bnRyaWVzLAp5b3Ugd2lsbCBmaW5kIGl0IGNvbnZlbmllbnQgdGhhdCB0aGUgbG93ZXIgMjU2IGNoYXJhY3RlcnMKb2YgVW5pY29kZSBhcmUgdGhlIHNhbWUgYXMgdGhlIDI1NiBjaGFyYWN0ZXJzIG9mIExhdGluLTEuCgpGb3IgZXhwZXJ0cywgdGhlcmUgaXMgYWxzbyBhIHJhdyBtb2RlIGp1c3QgbGlrZSB0aGUgb25lIGZvciBub3JtYWwKc3RyaW5ncy4gWW91IGhhdmUgdG8gcHJlZml4IHRoZSBvcGVuaW5nIHF1b3RlIHdpdGggJ3VyJyB0byBoYXZlClB5dGhvbiB1c2UgdGhlIFxlbXBoe1Jhdy1Vbmljb2RlLUVzY2FwZX0gZW5jb2RpbmcuIEl0IHdpbGwgb25seSBhcHBseQp0aGUgYWJvdmUgXGNvZGV7XGUgdVhYWFh9IGNvbnZlcnNpb24gaWYgdGhlcmUgaXMgYW4gdW5ldmVuIG51bWJlciBvZgpiYWNrc2xhc2hlcyBpbiBmcm9udCBvZiB0aGUgc21hbGwgJ3UnLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdXInSGVsbG9cdTAwMjBXb3JsZCAhJwp1J0hlbGxvIFdvcmxkICEnCj4+PiB1cidIZWxsb1xcdTAwMjBXb3JsZCAhJwp1J0hlbGxvXFxcXHUwMDIwV29ybGQgIScKXGVuZHt2ZXJiYXRpbX0KClRoZSByYXcgbW9kZSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHlvdSBoYXZlIHRvIGVudGVyIGxvdHMgb2YKYmFja3NsYXNoZXMsIGFzIGNhbiBiZSBuZWNlc3NhcnkgaW4gcmVndWxhciBleHByZXNzaW9ucy4KCkFwYXJ0IGZyb20gdGhlc2Ugc3RhbmRhcmQgZW5jb2RpbmdzLCBQeXRob24gcHJvdmlkZXMgYSB3aG9sZSBzZXQgb2YKb3RoZXIgd2F5cyBvZiBjcmVhdGluZyBVbmljb2RlIHN0cmluZ3Mgb24gdGhlIGJhc2lzIG9mIGEga25vd24KZW5jb2RpbmcuIAoKVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbnt1bmljb2RlKCl9XGJpZnVuY2luZGV4e3VuaWNvZGV9IHByb3ZpZGVzCmFjY2VzcyB0byBhbGwgcmVnaXN0ZXJlZCBVbmljb2RlIGNvZGVjcyAoQ09kZXJzIGFuZCBERUNvZGVycykuIFNvbWUgb2YKdGhlIG1vcmUgd2VsbCBrbm93biBlbmNvZGluZ3Mgd2hpY2ggdGhlc2UgY29kZWNzIGNhbiBjb252ZXJ0IGFyZQpcZW1waHtMYXRpbi0xfSwgXGVtcGh7QVNDSUl9LCBcZW1waHtVVEYtOH0sIGFuZCBcZW1waHtVVEYtMTZ9LgpUaGUgbGF0dGVyIHR3byBhcmUgdmFyaWFibGUtbGVuZ3RoIGVuY29kaW5ncyB0aGF0IHN0b3JlIGVhY2ggVW5pY29kZQpjaGFyYWN0ZXIgaW4gb25lIG9yIG1vcmUgYnl0ZXMuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCm5vcm1hbGx5IHNldCB0byBcQVNDSUksIHdoaWNoIHBhc3NlcyB0aHJvdWdoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCjAgdG8gMTI3IGFuZCByZWplY3RzIGFueSBvdGhlciBjaGFyYWN0ZXJzIHdpdGggYW4gZXJyb3IuCldoZW4gYSBVbmljb2RlIHN0cmluZyBpcyBwcmludGVkLCB3cml0dGVuIHRvIGEgZmlsZSwgb3IgY29udmVydGVkCndpdGggXGZ1bmN0aW9ue3N0cigpfSwgY29udmVyc2lvbiB0YWtlcyBwbGFjZSB1c2luZyB0aGlzIGRlZmF1bHQgZW5jb2RpbmcuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB1ImFiYyIKdSdhYmMnCj4+PiBzdHIodSJhYmMiKQonYWJjJwo+Pj4gdSLk9vwiCnUnXHhlNFx4ZjZceGZjJwo+Pj4gc3RyKHUi5Pb8IikKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KVW5pY29kZUVuY29kZUVycm9yOiAnYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDAtMjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KQpcZW5ke3ZlcmJhdGltfQoKVG8gY29udmVydCBhIFVuaWNvZGUgc3RyaW5nIGludG8gYW4gOC1iaXQgc3RyaW5nIHVzaW5nIGEgc3BlY2lmaWMKZW5jb2RpbmcsIFVuaWNvZGUgb2JqZWN0cyBwcm92aWRlIGFuIFxmdW5jdGlvbntlbmNvZGUoKX0gbWV0aG9kCnRoYXQgdGFrZXMgb25lIGFyZ3VtZW50LCB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcuICBMb3dlcmNhc2UgbmFtZXMKZm9yIGVuY29kaW5ncyBhcmUgcHJlZmVycmVkLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdSLk9vwiLmVuY29kZSgndXRmLTgnKQonXHhjM1x4YTRceGMzXHhiNlx4YzNceGJjJwpcZW5ke3ZlcmJhdGltfQoKSWYgeW91IGhhdmUgZGF0YSBpbiBhIHNwZWNpZmljIGVuY29kaW5nIGFuZCB3YW50IHRvIHByb2R1Y2UgYQpjb3JyZXNwb25kaW5nIFVuaWNvZGUgc3RyaW5nIGZyb20gaXQsIHlvdSBjYW4gdXNlIHRoZQpcZnVuY3Rpb257dW5pY29kZSgpfSBmdW5jdGlvbiB3aXRoIHRoZSBlbmNvZGluZyBuYW1lIGFzIHRoZSBzZWNvbmQKYXJndW1lbnQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB1bmljb2RlKCdceGMzXHhhNFx4YzNceGI2XHhjM1x4YmMnLCAndXRmLTgnKQp1J1x4ZTRceGY2XHhmYycKXGVuZHt2ZXJiYXRpbX0KClxzdWJzZWN0aW9ue0xpc3RzIFxsYWJlbHtsaXN0c319CgpQeXRob24ga25vd3MgYSBudW1iZXIgb2YgXGVtcGh7Y29tcG91bmR9IGRhdGEgdHlwZXMsIHVzZWQgdG8gZ3JvdXAKdG9nZXRoZXIgb3RoZXIgdmFsdWVzLiAgVGhlIG1vc3QgdmVyc2F0aWxlIGlzIHRoZSBcZW1waHtsaXN0fSwgd2hpY2gKY2FuIGJlIHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKGl0ZW1zKSBiZXR3ZWVuCnNxdWFyZSBicmFja2V0cy4gIExpc3QgaXRlbXMgbmVlZCBub3QgYWxsIGhhdmUgdGhlIHNhbWUgdHlwZS4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEgPSBbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KPj4+IGEKWydzcGFtJywgJ2VnZ3MnLCAxMDAsIDEyMzRdClxlbmR7dmVyYmF0aW19CgpMaWtlIHN0cmluZyBpbmRpY2VzLCBsaXN0IGluZGljZXMgc3RhcnQgYXQgMCwgYW5kIGxpc3RzIGNhbiBiZSBzbGljZWQsCmNvbmNhdGVuYXRlZCBhbmQgc28gb246CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhWzBdCidzcGFtJwo+Pj4gYVszXQoxMjM0Cj4+PiBhWy0yXQoxMDAKPj4+IGFbMTotMV0KWydlZ2dzJywgMTAwXQo+Pj4gYVs6Ml0gKyBbJ2JhY29uJywgMioyXQpbJ3NwYW0nLCAnZWdncycsICdiYWNvbicsIDRdCj4+PiAzKmFbOjNdICsgWydCb2UhJ10KWydzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdzcGFtJywgJ2VnZ3MnLCAxMDAsICdCb2UhJ10KXGVuZHt2ZXJiYXRpbX0KClVubGlrZSBzdHJpbmdzLCB3aGljaCBhcmUgXGVtcGh7aW1tdXRhYmxlfSwgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlCmluZGl2aWR1YWwgZWxlbWVudHMgb2YgYSBsaXN0OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYQpbJ3NwYW0nLCAnZWdncycsIDEwMCwgMTIzNF0KPj4+IGFbMl0gPSBhWzJdICsgMjMKPj4+IGEKWydzcGFtJywgJ2VnZ3MnLCAxMjMsIDEyMzRdClxlbmR7dmVyYmF0aW19CgpBc3NpZ25tZW50IHRvIHNsaWNlcyBpcyBhbHNvIHBvc3NpYmxlLCBhbmQgdGhpcyBjYW4gZXZlbiBjaGFuZ2UgdGhlIHNpemUKb2YgdGhlIGxpc3Q6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAjIFJlcGxhY2Ugc29tZSBpdGVtczoKLi4uIGFbMDoyXSA9IFsxLCAxMl0KPj4+IGEKWzEsIDEyLCAxMjMsIDEyMzRdCj4+PiAjIFJlbW92ZSBzb21lOgouLi4gYVswOjJdID0gW10KPj4+IGEKWzEyMywgMTIzNF0KPj4+ICMgSW5zZXJ0IHNvbWU6Ci4uLiBhWzE6MV0gPSBbJ2JsZXRjaCcsICd4eXp6eSddCj4+PiBhClsxMjMsICdibGV0Y2gnLCAneHl6enknLCAxMjM0XQo+Pj4gYVs6MF0gPSBhICAgICAjIEluc2VydCAoYSBjb3B5IG9mKSBpdHNlbGYgYXQgdGhlIGJlZ2lubmluZwo+Pj4gYQpbMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNCwgMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KXGVuZHt2ZXJiYXRpbX0KClRoZSBidWlsdC1pbiBmdW5jdGlvbiBcZnVuY3Rpb257bGVuKCl9IGFsc28gYXBwbGllcyB0byBsaXN0czoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGxlbihhKQo4ClxlbmR7dmVyYmF0aW19CgpJdCBpcyBwb3NzaWJsZSB0byBuZXN0IGxpc3RzIChjcmVhdGUgbGlzdHMgY29udGFpbmluZyBvdGhlciBsaXN0cyksCmZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcSA9IFsyLCAzXQo+Pj4gcCA9IFsxLCBxLCA0XQo+Pj4gbGVuKHApCjMKPj4+IHBbMV0KWzIsIDNdCj4+PiBwWzFdWzBdCjIKPj4+IHBbMV0uYXBwZW5kKCd4dHJhJykgICAgICMgU2VlIHNlY3Rpb24gNS4xCj4+PiBwClsxLCBbMiwgMywgJ3h0cmEnXSwgNF0KPj4+IHEKWzIsIDMsICd4dHJhJ10KXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpbiB0aGUgbGFzdCBleGFtcGxlLCBcY29kZXtwWzFdfSBhbmQgXGNvZGV7cX0gcmVhbGx5IHJlZmVyIHRvCnRoZSBzYW1lIG9iamVjdCEgIFdlJ2xsIGNvbWUgYmFjayB0byBcZW1waHtvYmplY3Qgc2VtYW50aWNzfSBsYXRlci4KClxzZWN0aW9ue0ZpcnN0IFN0ZXBzIFRvd2FyZHMgUHJvZ3JhbW1pbmcgXGxhYmVse2ZpcnN0U3RlcHN9fQoKT2YgY291cnNlLCB3ZSBjYW4gdXNlIFB5dGhvbiBmb3IgbW9yZSBjb21wbGljYXRlZCB0YXNrcyB0aGFuIGFkZGluZwp0d28gYW5kIHR3byB0b2dldGhlci4gIEZvciBpbnN0YW5jZSwgd2UgY2FuIHdyaXRlIGFuIGluaXRpYWwKc3ViLXNlcXVlbmNlIG9mIHRoZSBcZW1waHtGaWJvbmFjY2l9IHNlcmllcyBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gIyBGaWJvbmFjY2kgc2VyaWVzOgouLi4gIyB0aGUgc3VtIG9mIHR3byBlbGVtZW50cyBkZWZpbmVzIHRoZSBuZXh0Ci4uLiBhLCBiID0gMCwgMQo+Pj4gd2hpbGUgYiA8IDEwOgouLi4gICAgICAgcHJpbnQgYgouLi4gICAgICAgYSwgYiA9IGIsIGErYgouLi4gCjEKMQoyCjMKNQo4ClxlbmR7dmVyYmF0aW19CgpUaGlzIGV4YW1wbGUgaW50cm9kdWNlcyBzZXZlcmFsIG5ldyBmZWF0dXJlcy4KClxiZWdpbntpdGVtaXplfQoKXGl0ZW0KVGhlIGZpcnN0IGxpbmUgY29udGFpbnMgYSBcZW1waHttdWx0aXBsZSBhc3NpZ25tZW50fTogdGhlIHZhcmlhYmxlcwpcY29kZXthfSBhbmQgXGNvZGV7Yn0gc2ltdWx0YW5lb3VzbHkgZ2V0IHRoZSBuZXcgdmFsdWVzIDAgYW5kIDEuICBPbiB0aGUKbGFzdCBsaW5lIHRoaXMgaXMgdXNlZCBhZ2FpbiwgZGVtb25zdHJhdGluZyB0aGF0IHRoZSBleHByZXNzaW9ucyBvbgp0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBhbGwgZXZhbHVhdGVkIGZpcnN0IGJlZm9yZSBhbnkgb2YgdGhlCmFzc2lnbm1lbnRzIHRha2UgcGxhY2UuICBUaGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgCmZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0LgoKXGl0ZW0KVGhlIFxrZXl3b3Jke3doaWxlfSBsb29wIGV4ZWN1dGVzIGFzIGxvbmcgYXMgdGhlIGNvbmRpdGlvbiAoaGVyZToKXGNvZGV7YiA8IDEwfSkgcmVtYWlucyB0cnVlLiAgSW4gUHl0aG9uLCBsaWtlIGluIEMsIGFueSBub24temVybwppbnRlZ2VyIHZhbHVlIGlzIHRydWU7IHplcm8gaXMgZmFsc2UuICBUaGUgY29uZGl0aW9uIG1heSBhbHNvIGJlIGEKc3RyaW5nIG9yIGxpc3QgdmFsdWUsIGluIGZhY3QgYW55IHNlcXVlbmNlOyBhbnl0aGluZyB3aXRoIGEgbm9uLXplcm8KbGVuZ3RoIGlzIHRydWUsIGVtcHR5IHNlcXVlbmNlcyBhcmUgZmFsc2UuICBUaGUgdGVzdCB1c2VkIGluIHRoZQpleGFtcGxlIGlzIGEgc2ltcGxlIGNvbXBhcmlzb24uICBUaGUgc3RhbmRhcmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlCndyaXR0ZW4gdGhlIHNhbWUgYXMgaW4gQzogXGNvZGV7PH0gKGxlc3MgdGhhbiksIFxjb2Rlez59IChncmVhdGVyIHRoYW4pLApcY29kZXs9PX0gKGVxdWFsIHRvKSwgXGNvZGV7PD19IChsZXNzIHRoYW4gb3IgZXF1YWwgdG8pLApcY29kZXs+PX0gKGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bykgYW5kIFxjb2RleyE9fSAobm90IGVxdWFsIHRvKS4KClxpdGVtClRoZSBcZW1waHtib2R5fSBvZiB0aGUgbG9vcCBpcyBcZW1waHtpbmRlbnRlZH06IGluZGVudGF0aW9uIGlzIFB5dGhvbidzCndheSBvZiBncm91cGluZyBzdGF0ZW1lbnRzLiAgUHl0aG9uIGRvZXMgbm90ICh5ZXQhKSBwcm92aWRlIGFuCmludGVsbGlnZW50IGlucHV0IGxpbmUgZWRpdGluZyBmYWNpbGl0eSwgc28geW91IGhhdmUgdG8gdHlwZSBhIHRhYiBvcgpzcGFjZShzKSBmb3IgZWFjaCBpbmRlbnRlZCBsaW5lLiAgSW4gcHJhY3RpY2UgeW91IHdpbGwgcHJlcGFyZSBtb3JlCmNvbXBsaWNhdGVkIGlucHV0IGZvciBQeXRob24gd2l0aCBhIHRleHQgZWRpdG9yOyBtb3N0IHRleHQgZWRpdG9ycyBoYXZlCmFuIGF1dG8taW5kZW50IGZhY2lsaXR5LiAgV2hlbiBhIGNvbXBvdW5kIHN0YXRlbWVudCBpcyBlbnRlcmVkCmludGVyYWN0aXZlbHksIGl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIHRvIGluZGljYXRlCmNvbXBsZXRpb24gKHNpbmNlIHRoZSBwYXJzZXIgY2Fubm90IGd1ZXNzIHdoZW4geW91IGhhdmUgdHlwZWQgdGhlIGxhc3QKbGluZSkuICBOb3RlIHRoYXQgZWFjaCBsaW5lIHdpdGhpbiBhIGJhc2ljIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYnkKdGhlIHNhbWUgYW1vdW50LgoKXGl0ZW0KVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQgd3JpdGVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbihzKSBpdCBpcwpnaXZlbi4gIEl0IGRpZmZlcnMgZnJvbSBqdXN0IHdyaXRpbmcgdGhlIGV4cHJlc3Npb24geW91IHdhbnQgdG8gd3JpdGUKKGFzIHdlIGRpZCBlYXJsaWVyIGluIHRoZSBjYWxjdWxhdG9yIGV4YW1wbGVzKSBpbiB0aGUgd2F5IGl0IGhhbmRsZXMKbXVsdGlwbGUgZXhwcmVzc2lvbnMgYW5kIHN0cmluZ3MuICBTdHJpbmdzIGFyZSBwcmludGVkIHdpdGhvdXQgcXVvdGVzLAphbmQgYSBzcGFjZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIGl0ZW1zLCBzbyB5b3UgY2FuIGZvcm1hdCB0aGluZ3MgbmljZWx5LApsaWtlIHRoaXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpID0gMjU2KjI1Ngo+Pj4gcHJpbnQgJ1RoZSB2YWx1ZSBvZiBpIGlzJywgaQpUaGUgdmFsdWUgb2YgaSBpcyA2NTUzNgpcZW5ke3ZlcmJhdGltfQoKQSB0cmFpbGluZyBjb21tYSBhdm9pZHMgdGhlIG5ld2xpbmUgYWZ0ZXIgdGhlIG91dHB1dDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEsIGIgPSAwLCAxCj4+PiB3aGlsZSBiIDwgMTAwMDoKLi4uICAgICBwcmludCBiLAouLi4gICAgIGEsIGIgPSBiLCBhK2IKLi4uIAoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NyA2MTAgOTg3ClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgdGhlIGludGVycHJldGVyIGluc2VydHMgYSBuZXdsaW5lIGJlZm9yZSBpdCBwcmludHMgdGhlIG5leHQKcHJvbXB0IGlmIHRoZSBsYXN0IGxpbmUgd2FzIG5vdCBjb21wbGV0ZWQuCgpcZW5ke2l0ZW1pemV9CgoKXGNoYXB0ZXJ7TW9yZSBDb250cm9sIEZsb3cgVG9vbHMgXGxhYmVse21vcmVDb250cm9sfX0KCkJlc2lkZXMgdGhlIFxrZXl3b3Jke3doaWxlfSBzdGF0ZW1lbnQganVzdCBpbnRyb2R1Y2VkLCBQeXRob24ga25vd3MKdGhlIHVzdWFsIGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzIGtub3duIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLCB3aXRoCnNvbWUgdHdpc3RzLgoKXHNlY3Rpb257XGtleXdvcmR7aWZ9IFN0YXRlbWVudHMgXGxhYmVse2lmfX0KClBlcmhhcHMgdGhlIG1vc3Qgd2VsbC1rbm93biBzdGF0ZW1lbnQgdHlwZSBpcyB0aGUKXGtleXdvcmR7aWZ9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4geCA9IGludChyYXdfaW5wdXQoIlBsZWFzZSBlbnRlciBhbiBpbnRlZ2VyOiAiKSkKPj4+IGlmIHggPCAwOgouLi4gICAgICB4ID0gMAouLi4gICAgICBwcmludCAnTmVnYXRpdmUgY2hhbmdlZCB0byB6ZXJvJwouLi4gZWxpZiB4ID09IDA6Ci4uLiAgICAgIHByaW50ICdaZXJvJwouLi4gZWxpZiB4ID09IDE6Ci4uLiAgICAgIHByaW50ICdTaW5nbGUnCi4uLiBlbHNlOgouLi4gICAgICBwcmludCAnTW9yZScKLi4uIApcZW5ke3ZlcmJhdGltfQoKVGhlcmUgY2FuIGJlIHplcm8gb3IgbW9yZSBca2V5d29yZHtlbGlmfSBwYXJ0cywgYW5kIHRoZQpca2V5d29yZHtlbHNlfSBwYXJ0IGlzIG9wdGlvbmFsLiAgVGhlIGtleXdvcmQgYFxrZXl3b3Jke2VsaWZ9JyBpcwpzaG9ydCBmb3IgYGVsc2UgaWYnLCBhbmQgaXMgdXNlZnVsIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBpbmRlbnRhdGlvbi4gIEFuIApca2V5d29yZHtpZn0gXGxkb3RzXCBca2V5d29yZHtlbGlmfSBcbGRvdHNcIFxrZXl3b3Jke2VsaWZ9IFxsZG90c1wgc2VxdWVuY2UKJSAgICBXZWlyZCBzcGFjaW5ncyBoYXBwZW4gaGVyZSBpZiB0aGUgd3JhcHBpbmcgb2YgdGhlIHNvdXJjZSB0ZXh0CiUgICAgZ2V0cyBjaGFuZ2VkIGluIHRoZSB3cm9uZyB3YXkuCmlzIGEgc3Vic3RpdHV0ZSBmb3IgdGhlIFxrZXl3b3Jke3N3aXRjaH0gb3IKXGtleXdvcmR7Y2FzZX0gc3RhdGVtZW50cyBmb3VuZCBpbiBvdGhlciBsYW5ndWFnZXMuCgoKXHNlY3Rpb257XGtleXdvcmR7Zm9yfSBTdGF0ZW1lbnRzIFxsYWJlbHtmb3J9fQoKVGhlIFxrZXl3b3Jke2Zvcn1cc3RpbmRleHtmb3J9IHN0YXRlbWVudCBpbiBQeXRob24gZGlmZmVycyBhIGJpdCBmcm9tCndoYXQgeW91IG1heSBiZSB1c2VkIHRvIGluIEMgb3IgUGFzY2FsLiAgUmF0aGVyIHRoYW4gYWx3YXlzCml0ZXJhdGluZyBvdmVyIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24gb2YgbnVtYmVycyAobGlrZSBpbiBQYXNjYWwpLApvciBnaXZpbmcgdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gZGVmaW5lIGJvdGggdGhlIGl0ZXJhdGlvbiBzdGVwIGFuZApoYWx0aW5nIGNvbmRpdGlvbiAoYXMgQyksIFB5dGhvbidzClxrZXl3b3Jke2Zvcn1cc3RpbmRleHtmb3J9IHN0YXRlbWVudCBpdGVyYXRlcyBvdmVyIHRoZSBpdGVtcyBvZiBhbnkKc2VxdWVuY2UgKGEgbGlzdCBvciBhIHN0cmluZyksIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluCnRoZSBzZXF1ZW5jZS4gIEZvciBleGFtcGxlIChubyBwdW4gaW50ZW5kZWQpOgolIE9uZSBzdWdnZXN0aW9uIHdhcyB0byBnaXZlIGEgcmVhbCBDIGV4YW1wbGUgaGVyZSwgYnV0IHRoYXQgbWF5IG9ubHkKJSBzZXJ2ZSB0byBjb25mdXNlIG5vbi1DIHByb2dyYW1tZXJzLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gIyBNZWFzdXJlIHNvbWUgc3RyaW5nczoKLi4uIGEgPSBbJ2NhdCcsICd3aW5kb3cnLCAnZGVmZW5lc3RyYXRlJ10KPj4+IGZvciB4IGluIGE6Ci4uLiAgICAgcHJpbnQgeCwgbGVuKHgpCi4uLiAKY2F0IDMKd2luZG93IDYKZGVmZW5lc3RyYXRlIDEyClxlbmR7dmVyYmF0aW19CgpJdCBpcyBub3Qgc2FmZSB0byBtb2RpZnkgdGhlIHNlcXVlbmNlIGJlaW5nIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIGxvb3AKKHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzLCBzdWNoIGFzIGxpc3RzKS4gIElmCnlvdSBuZWVkIHRvIG1vZGlmeSB0aGUgbGlzdCB5b3UgYXJlIGl0ZXJhdGluZyBvdmVyIChmb3IgZXhhbXBsZSwgdG8KZHVwbGljYXRlIHNlbGVjdGVkIGl0ZW1zKSB5b3UgbXVzdCBpdGVyYXRlIG92ZXIgYSBjb3B5LiAgVGhlIHNsaWNlCm5vdGF0aW9uIG1ha2VzIHRoaXMgcGFydGljdWxhcmx5IGNvbnZlbmllbnQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmb3IgeCBpbiBhWzpdOiAjIG1ha2UgYSBzbGljZSBjb3B5IG9mIHRoZSBlbnRpcmUgbGlzdAouLi4gICAgaWYgbGVuKHgpID4gNjogYS5pbnNlcnQoMCwgeCkKLi4uIAo+Pj4gYQpbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257VGhlIFxmdW5jdGlvbntyYW5nZSgpfSBGdW5jdGlvbiBcbGFiZWx7cmFuZ2V9fQoKSWYgeW91IGRvIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIGEgc2VxdWVuY2Ugb2YgbnVtYmVycywgdGhlIGJ1aWx0LWluCmZ1bmN0aW9uIFxmdW5jdGlvbntyYW5nZSgpfSBjb21lcyBpbiBoYW5keS4gIEl0IGdlbmVyYXRlcyBsaXN0cwpjb250YWluaW5nIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcmFuZ2UoMTApClswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQpcZW5ke3ZlcmJhdGltfQoKVGhlIGdpdmVuIGVuZCBwb2ludCBpcyBuZXZlciBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgbGlzdDsKXGNvZGV7cmFuZ2UoMTApfSBnZW5lcmF0ZXMgYSBsaXN0IG9mIDEwIHZhbHVlcywgZXhhY3RseSB0aGUgbGVnYWwKaW5kaWNlcyBmb3IgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvZiBsZW5ndGggMTAuICBJdCBpcyBwb3NzaWJsZSB0byBsZXQKdGhlIHJhbmdlIHN0YXJ0IGF0IGFub3RoZXIgbnVtYmVyLCBvciB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGluY3JlbWVudAooZXZlbiBuZWdhdGl2ZTsgc29tZXRpbWVzIHRoaXMgaXMgY2FsbGVkIHRoZSBgc3RlcCcpOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcmFuZ2UoNSwgMTApCls1LCA2LCA3LCA4LCA5XQo+Pj4gcmFuZ2UoMCwgMTAsIDMpClswLCAzLCA2LCA5XQo+Pj4gcmFuZ2UoLTEwLCAtMTAwLCAtMzApClstMTAsIC00MCwgLTcwXQpcZW5ke3ZlcmJhdGltfQoKVG8gaXRlcmF0ZSBvdmVyIHRoZSBpbmRpY2VzIG9mIGEgc2VxdWVuY2UsIGNvbWJpbmUKXGZ1bmN0aW9ue3JhbmdlKCl9IGFuZCBcZnVuY3Rpb257bGVuKCl9IGFzIGZvbGxvd3M6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhID0gWydNYXJ5JywgJ2hhZCcsICdhJywgJ2xpdHRsZScsICdsYW1iJ10KPj4+IGZvciBpIGluIHJhbmdlKGxlbihhKSk6Ci4uLiAgICAgcHJpbnQgaSwgYVtpXQouLi4gCjAgTWFyeQoxIGhhZAoyIGEKMyBsaXR0bGUKNCBsYW1iClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257XGtleXdvcmR7YnJlYWt9IGFuZCBca2V5d29yZHtjb250aW51ZX0gU3RhdGVtZW50cywgYW5kCiAgICAgICAgIFxrZXl3b3Jke2Vsc2V9IENsYXVzZXMgb24gTG9vcHMKICAgICAgICAgXGxhYmVse2JyZWFrfX0KClRoZSBca2V5d29yZHticmVha30gc3RhdGVtZW50LCBsaWtlIGluIEMsIGJyZWFrcyBvdXQgb2YgdGhlIHNtYWxsZXN0CmVuY2xvc2luZyBca2V5d29yZHtmb3J9IG9yIFxrZXl3b3Jke3doaWxlfSBsb29wLgoKVGhlIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQsIGFsc28gYm9ycm93ZWQgZnJvbSBDLCBjb250aW51ZXMKd2l0aCB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuCgpMb29wIHN0YXRlbWVudHMgbWF5IGhhdmUgYW4gXGNvZGV7ZWxzZX0gY2xhdXNlOyBpdCBpcyBleGVjdXRlZCB3aGVuCnRoZSBsb29wIHRlcm1pbmF0ZXMgdGhyb3VnaCBleGhhdXN0aW9uIG9mIHRoZSBsaXN0ICh3aXRoClxrZXl3b3Jke2Zvcn0pIG9yIHdoZW4gdGhlIGNvbmRpdGlvbiBiZWNvbWVzIGZhbHNlICh3aXRoClxrZXl3b3Jke3doaWxlfSksIGJ1dCBub3Qgd2hlbiB0aGUgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5IGEKXGtleXdvcmR7YnJlYWt9IHN0YXRlbWVudC4gIFRoaXMgaXMgZXhlbXBsaWZpZWQgYnkgdGhlIGZvbGxvd2luZyBsb29wLAp3aGljaCBzZWFyY2hlcyBmb3IgcHJpbWUgbnVtYmVyczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZvciBuIGluIHJhbmdlKDIsIDEwKToKLi4uICAgICBmb3IgeCBpbiByYW5nZSgyLCBuKToKLi4uICAgICAgICAgaWYgbiAlIHggPT0gMDoKLi4uICAgICAgICAgICAgIHByaW50IG4sICdlcXVhbHMnLCB4LCAnKicsIG4veAouLi4gICAgICAgICAgICAgYnJlYWsKLi4uICAgICBlbHNlOgouLi4gICAgICAgICAjIGxvb3AgZmVsbCB0aHJvdWdoIHdpdGhvdXQgZmluZGluZyBhIGZhY3RvcgouLi4gICAgICAgICBwcmludCBuLCAnaXMgYSBwcmltZSBudW1iZXInCi4uLiAKMiBpcyBhIHByaW1lIG51bWJlcgozIGlzIGEgcHJpbWUgbnVtYmVyCjQgZXF1YWxzIDIgKiAyCjUgaXMgYSBwcmltZSBudW1iZXIKNiBlcXVhbHMgMiAqIDMKNyBpcyBhIHByaW1lIG51bWJlcgo4IGVxdWFscyAyICogNAo5IGVxdWFscyAzICogMwpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue1xrZXl3b3Jke3Bhc3N9IFN0YXRlbWVudHMgXGxhYmVse3Bhc3N9fQoKVGhlIFxrZXl3b3Jke3Bhc3N9IHN0YXRlbWVudCBkb2VzIG5vdGhpbmcuCkl0IGNhbiBiZSB1c2VkIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseSBidXQgdGhlCnByb2dyYW0gcmVxdWlyZXMgbm8gYWN0aW9uLgpGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdoaWxlIFRydWU6Ci4uLiAgICAgICBwYXNzICMgQnVzeS13YWl0IGZvciBrZXlib2FyZCBpbnRlcnJ1cHQKLi4uIApcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0RlZmluaW5nIEZ1bmN0aW9ucyBcbGFiZWx7ZnVuY3Rpb25zfX0KCldlIGNhbiBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdyaXRlcyB0aGUgRmlib25hY2NpIHNlcmllcyB0byBhbgphcmJpdHJhcnkgYm91bmRhcnk6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgZmliKG4pOiAgICAjIHdyaXRlIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgouLi4gICAgICIiIlByaW50IGEgRmlib25hY2NpIHNlcmllcyB1cCB0byBuLiIiIgouLi4gICAgIGEsIGIgPSAwLCAxCi4uLiAgICAgd2hpbGUgYiA8IG46Ci4uLiAgICAgICAgIHByaW50IGIsCi4uLiAgICAgICAgIGEsIGIgPSBiLCBhK2IKLi4uIAo+Pj4gIyBOb3cgY2FsbCB0aGUgZnVuY3Rpb24gd2UganVzdCBkZWZpbmVkOgouLi4gZmliKDIwMDApCjEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3IDYxMCA5ODcgMTU5NwpcZW5ke3ZlcmJhdGltfQoKVGhlIGtleXdvcmQgXGtleXdvcmR7ZGVmfSBpbnRyb2R1Y2VzIGEgZnVuY3Rpb24gXGVtcGh7ZGVmaW5pdGlvbn0uICBJdAptdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgcGFyZW50aGVzaXplZCBsaXN0IG9mCmZvcm1hbCBwYXJhbWV0ZXJzLiAgVGhlIHN0YXRlbWVudHMgdGhhdCBmb3JtIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbgpzdGFydCBhdCB0aGUgbmV4dCBsaW5lLCBhbmQgbXVzdCBiZSBpbmRlbnRlZC4gIFRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YKdGhlIGZ1bmN0aW9uIGJvZHkgY2FuIG9wdGlvbmFsbHkgYmUgYSBzdHJpbmcgbGl0ZXJhbDsgdGhpcyBzdHJpbmcKbGl0ZXJhbCBpcyB0aGUgZnVuY3Rpb24ncyBcaW5kZXh7ZG9jdW1lbnRhdGlvbiBzdHJpbmdzfWRvY3VtZW50YXRpb24Kc3RyaW5nLCBvciBcZGZue2RvY3N0cmluZ30uXGluZGV4e2RvY3N0cmluZ3N9XGluZGV4e3N0cmluZ3MsIGRvY3VtZW50YXRpb259CgpUaGVyZSBhcmUgdG9vbHMgd2hpY2ggdXNlIGRvY3N0cmluZ3MgdG8gYXV0b21hdGljYWxseSBwcm9kdWNlIG9ubGluZQpvciBwcmludGVkIGRvY3VtZW50YXRpb24sIG9yIHRvIGxldCB0aGUgdXNlciBpbnRlcmFjdGl2ZWx5IGJyb3dzZQp0aHJvdWdoIGNvZGU7IGl0J3MgZ29vZCBwcmFjdGljZSB0byBpbmNsdWRlIGRvY3N0cmluZ3MgaW4gY29kZSB0aGF0CnlvdSB3cml0ZSwgc28gdHJ5IHRvIG1ha2UgYSBoYWJpdCBvZiBpdC4KClRoZSBcZW1waHtleGVjdXRpb259IG9mIGEgZnVuY3Rpb24gaW50cm9kdWNlcyBhIG5ldyBzeW1ib2wgdGFibGUgdXNlZApmb3IgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb24uICBNb3JlIHByZWNpc2VseSwgYWxsIHZhcmlhYmxlCmFzc2lnbm1lbnRzIGluIGEgZnVuY3Rpb24gc3RvcmUgdGhlIHZhbHVlIGluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGU7CndoZXJlYXMgdmFyaWFibGUgcmVmZXJlbmNlcyBmaXJzdCBsb29rIGluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUsIHRoZW4KaW4gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUsIGFuZCB0aGVuIGluIHRoZSB0YWJsZSBvZiBidWlsdC1pbiBuYW1lcy4KVGh1cywgIGdsb2JhbCB2YXJpYWJsZXMgY2Fubm90IGJlIGRpcmVjdGx5IGFzc2lnbmVkIGEgdmFsdWUgd2l0aGluIGEKZnVuY3Rpb24gKHVubGVzcyBuYW1lZCBpbiBhIFxrZXl3b3Jke2dsb2JhbH0gc3RhdGVtZW50KSwgYWx0aG91Z2gKdGhleSBtYXkgYmUgcmVmZXJlbmNlZC4KClRoZSBhY3R1YWwgcGFyYW1ldGVycyAoYXJndW1lbnRzKSB0byBhIGZ1bmN0aW9uIGNhbGwgYXJlIGludHJvZHVjZWQgaW4KdGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHdoZW4gaXQgaXMgY2FsbGVkOyB0aHVzLAphcmd1bWVudHMgYXJlIHBhc3NlZCB1c2luZyBcZW1waHtjYWxsIGJ5IHZhbHVlfSAod2hlcmUgdGhlClxlbXBoe3ZhbHVlfSBpcyBhbHdheXMgYW4gb2JqZWN0IFxlbXBoe3JlZmVyZW5jZX0sIG5vdCB0aGUgdmFsdWUgb2YKdGhlIG9iamVjdCkuXGZvb3Rub3RlewogICAgICAgICBBY3R1YWxseSwgXGVtcGh7Y2FsbCBieSBvYmplY3QgcmVmZXJlbmNlfSB3b3VsZCBiZSBhIGJldHRlcgogICAgICAgICBkZXNjcmlwdGlvbiwgc2luY2UgaWYgYSBtdXRhYmxlIG9iamVjdCBpcyBwYXNzZWQsIHRoZSBjYWxsZXIKICAgICAgICAgd2lsbCBzZWUgYW55IGNoYW5nZXMgdGhlIGNhbGxlZSBtYWtlcyB0byBpdCAoaXRlbXMKICAgICAgICAgaW5zZXJ0ZWQgaW50byBhIGxpc3QpLgp9IFdoZW4gYSBmdW5jdGlvbiBjYWxscyBhbm90aGVyIGZ1bmN0aW9uLCBhIG5ldyBsb2NhbCBzeW1ib2wgdGFibGUgaXMKY3JlYXRlZCBmb3IgdGhhdCBjYWxsLgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGludHJvZHVjZXMgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQKc3ltYm9sIHRhYmxlLiAgVGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBuYW1lCmhhcyBhIHR5cGUgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoZSBpbnRlcnByZXRlciBhcyBhIHVzZXItZGVmaW5lZApmdW5jdGlvbi4gIFRoaXMgdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSB3aGljaCBjYW4gdGhlbgphbHNvIGJlIHVzZWQgYXMgYSBmdW5jdGlvbi4gIFRoaXMgc2VydmVzIGFzIGEgZ2VuZXJhbCByZW5hbWluZwptZWNoYW5pc206CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmaWIKPGZ1bmN0aW9uIG9iamVjdCBhdCAxMDA0MmVkMD4KPj4+IGYgPSBmaWIKPj4+IGYoMTAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OQpcZW5ke3ZlcmJhdGltfQoKWW91IG1pZ2h0IG9iamVjdCB0aGF0IFxjb2Rle2ZpYn0gaXMgbm90IGEgZnVuY3Rpb24gYnV0IGEgcHJvY2VkdXJlLiAgSW4KUHl0aG9uLCBsaWtlIGluIEMsIHByb2NlZHVyZXMgYXJlIGp1c3QgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgcmV0dXJuIGEKdmFsdWUuICBJbiBmYWN0LCB0ZWNobmljYWxseSBzcGVha2luZywgcHJvY2VkdXJlcyBkbyByZXR1cm4gYSB2YWx1ZSwKYWxiZWl0IGEgcmF0aGVyIGJvcmluZyBvbmUuICBUaGlzIHZhbHVlIGlzIGNhbGxlZCBcY29kZXtOb25lfSAoaXQncyBhCmJ1aWx0LWluIG5hbWUpLiAgV3JpdGluZyB0aGUgdmFsdWUgXGNvZGV7Tm9uZX0gaXMgbm9ybWFsbHkgc3VwcHJlc3NlZCBieQp0aGUgaW50ZXJwcmV0ZXIgaWYgaXQgd291bGQgYmUgdGhlIG9ubHkgdmFsdWUgd3JpdHRlbi4gIFlvdSBjYW4gc2VlIGl0CmlmIHlvdSByZWFsbHkgd2FudCB0bzoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHByaW50IGZpYigwKQpOb25lClxlbmR7dmVyYmF0aW19CgpJdCBpcyBzaW1wbGUgdG8gd3JpdGUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHRoZSBudW1iZXJzIG9mCnRoZSBGaWJvbmFjY2kgc2VyaWVzLCBpbnN0ZWFkIG9mIHByaW50aW5nIGl0OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGZpYjIobik6ICMgcmV0dXJuIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbgouLi4gICAgICIiIlJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgRmlib25hY2NpIHNlcmllcyB1cCB0byBuLiIiIgouLi4gICAgIHJlc3VsdCA9IFtdCi4uLiAgICAgYSwgYiA9IDAsIDEKLi4uICAgICB3aGlsZSBiIDwgbjoKLi4uICAgICAgICAgcmVzdWx0LmFwcGVuZChiKSAgICAjIHNlZSBiZWxvdwouLi4gICAgICAgICBhLCBiID0gYiwgYStiCi4uLiAgICAgcmV0dXJuIHJlc3VsdAouLi4gCj4+PiBmMTAwID0gZmliMigxMDApICAgICMgY2FsbCBpdAo+Pj4gZjEwMCAgICAgICAgICAgICAgICAjIHdyaXRlIHRoZSByZXN1bHQKWzEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1LCA4OV0KXGVuZHt2ZXJiYXRpbX0KClRoaXMgZXhhbXBsZSwgYXMgdXN1YWwsIGRlbW9uc3RyYXRlcyBzb21lIG5ldyBQeXRob24gZmVhdHVyZXM6CgpcYmVnaW57aXRlbWl6ZX0KClxpdGVtClRoZSBca2V5d29yZHtyZXR1cm59IHN0YXRlbWVudCByZXR1cm5zIHdpdGggYSB2YWx1ZSBmcm9tIGEgZnVuY3Rpb24uClxrZXl3b3Jke3JldHVybn0gd2l0aG91dCBhbiBleHByZXNzaW9uIGFyZ3VtZW50IHJldHVybnMgXGNvZGV7Tm9uZX0uCkZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUgYWxzbyByZXR1cm5zIFxjb2Rle05vbmV9LgoKXGl0ZW0KVGhlIHN0YXRlbWVudCBcY29kZXtyZXN1bHQuYXBwZW5kKGIpfSBjYWxscyBhIFxlbXBoe21ldGhvZH0gb2YgdGhlIGxpc3QKb2JqZWN0IFxjb2Rle3Jlc3VsdH0uICBBIG1ldGhvZCBpcyBhIGZ1bmN0aW9uIHRoYXQgYGJlbG9uZ3MnIHRvIGFuCm9iamVjdCBhbmQgaXMgbmFtZWQgXGNvZGV7b2JqLm1ldGhvZG5hbWV9LCB3aGVyZSBcY29kZXtvYmp9IGlzIHNvbWUKb2JqZWN0ICh0aGlzIG1heSBiZSBhbiBleHByZXNzaW9uKSwgYW5kIFxjb2Rle21ldGhvZG5hbWV9IGlzIHRoZSBuYW1lCm9mIGEgbWV0aG9kIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgb2JqZWN0J3MgdHlwZS4gIERpZmZlcmVudCB0eXBlcwpkZWZpbmUgZGlmZmVyZW50IG1ldGhvZHMuICBNZXRob2RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSB0aGUKc2FtZSBuYW1lIHdpdGhvdXQgY2F1c2luZyBhbWJpZ3VpdHkuICAoSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHlvdXIKb3duIG9iamVjdCB0eXBlcyBhbmQgbWV0aG9kcywgdXNpbmcgXGVtcGh7Y2xhc3Nlc30sIGFzIGRpc2N1c3NlZCBsYXRlcgppbiB0aGlzIHR1dG9yaWFsLikKVGhlIG1ldGhvZCBcbWV0aG9ke2FwcGVuZCgpfSBzaG93biBpbiB0aGUgZXhhbXBsZSwgaXMgZGVmaW5lZCBmb3IKbGlzdCBvYmplY3RzOyBpdCBhZGRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIEluIHRoaXMKZXhhbXBsZSBpdCBpcyBlcXVpdmFsZW50IHRvIFxzYW1we3Jlc3VsdCA9IHJlc3VsdCArIFtiXX0sIGJ1dCBtb3JlCmVmZmljaWVudC4KClxlbmR7aXRlbWl6ZX0KClxzZWN0aW9ue01vcmUgb24gRGVmaW5pbmcgRnVuY3Rpb25zIFxsYWJlbHtkZWZpbmluZ319CgpJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgphcmd1bWVudHMuICBUaGVyZSBhcmUgdGhyZWUgZm9ybXMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZC4KClxzdWJzZWN0aW9ue0RlZmF1bHQgQXJndW1lbnQgVmFsdWVzIFxsYWJlbHtkZWZhdWx0QXJnc319CgpUaGUgbW9zdCB1c2VmdWwgZm9ybSBpcyB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZSBmb3Igb25lIG9yIG1vcmUKYXJndW1lbnRzLiAgVGhpcyBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggZmV3ZXIKYXJndW1lbnRzIHRoYW4gaXQgaXMgZGVmaW5lZAoKXGJlZ2lue3ZlcmJhdGltfQpkZWYgYXNrX29rKHByb21wdCwgcmV0cmllcz00LCBjb21wbGFpbnQ9J1llcyBvciBubywgcGxlYXNlIScpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBvayA9IHJhd19pbnB1dChwcm9tcHQpCiAgICAgICAgaWYgb2sgaW4gKCd5JywgJ3llJywgJ3llcycpOiByZXR1cm4gVHJ1ZQogICAgICAgIGlmIG9rIGluICgnbicsICdubycsICdub3AnLCAnbm9wZScpOiByZXR1cm4gRmFsc2UKICAgICAgICByZXRyaWVzID0gcmV0cmllcyAtIDEKICAgICAgICBpZiByZXRyaWVzIDwgMDogcmFpc2UgSU9FcnJvciwgJ3JlZnVzZW5payB1c2VyJwogICAgICAgIHByaW50IGNvbXBsYWludApcZW5ke3ZlcmJhdGltfQoKVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGVpdGhlciBsaWtlIHRoaXM6Clxjb2Rle2Fza19vaygnRG8geW91IHJlYWxseSB3YW50IHRvIHF1aXQ/Jyl9IG9yIGxpa2UgdGhpczoKXGNvZGV7YXNrX29rKCdPSyB0byBvdmVyd3JpdGUgdGhlIGZpbGU/JywgMil9LgoKVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBldmFsdWF0ZWQgYXQgdGhlIHBvaW50IG9mIGZ1bmN0aW9uIGRlZmluaXRpb24KaW4gdGhlIFxlbXBoe2RlZmluaW5nfSBzY29wZSwgc28gdGhhdAoKXGJlZ2lue3ZlcmJhdGltfQppID0gNQoKZGVmIGYoYXJnPWkpOgogICAgcHJpbnQgYXJnCgppID0gNgpmKCkKXGVuZHt2ZXJiYXRpbX0KCndpbGwgcHJpbnQgXGNvZGV7NX0uCgpcc3Ryb25ne0ltcG9ydGFudCB3YXJuaW5nOn0gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UuClRoaXMgbWFrZXMgYSBkaWZmZXJlbmNlIHdoZW4gdGhlIGRlZmF1bHQgaXMgYSBtdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEKbGlzdCwgZGljdGlvbmFyeSwgb3IgaW5zdGFuY2VzIG9mIG1vc3QgY2xhc3Nlcy4gIEZvciBleGFtcGxlLCB0aGUKZm9sbG93aW5nIGZ1bmN0aW9uIGFjY3VtdWxhdGVzIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0IG9uCnN1YnNlcXVlbnQgY2FsbHM6CgpcYmVnaW57dmVyYmF0aW19CmRlZiBmKGEsIEw9W10pOgogICAgTC5hcHBlbmQoYSkKICAgIHJldHVybiBMCgpwcmludCBmKDEpCnByaW50IGYoMikKcHJpbnQgZigzKQpcZW5ke3ZlcmJhdGltfQoKVGhpcyB3aWxsIHByaW50CgpcYmVnaW57dmVyYmF0aW19ClsxXQpbMSwgMl0KWzEsIDIsIDNdClxlbmR7dmVyYmF0aW19CgpJZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZGVmYXVsdCB0byBiZSBzaGFyZWQgYmV0d2VlbiBzdWJzZXF1ZW50IGNhbGxzLAp5b3UgY2FuIHdyaXRlIHRoZSBmdW5jdGlvbiBsaWtlIHRoaXMgaW5zdGVhZDoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGYoYSwgTD1Ob25lKToKICAgIGlmIEwgaXMgTm9uZToKICAgICAgICBMID0gW10KICAgIEwuYXBwZW5kKGEpCiAgICByZXR1cm4gTApcZW5ke3ZlcmJhdGltfQoKXHN1YnNlY3Rpb257S2V5d29yZCBBcmd1bWVudHMgXGxhYmVse2tleXdvcmRBcmdzfX0KCkZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjYWxsZWQgdXNpbmcKa2V5d29yZCBhcmd1bWVudHMgb2YgdGhlIGZvcm0gXHNhbXB7XHZhcntrZXl3b3JkfSA9IFx2YXJ7dmFsdWV9fS4gIEZvcgppbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIHBhcnJvdCh2b2x0YWdlLCBzdGF0ZT0nYSBzdGlmZicsIGFjdGlvbj0ndm9vbScsIHR5cGU9J05vcndlZ2lhbiBCbHVlJyk6CiAgICBwcmludCAiLS0gVGhpcyBwYXJyb3Qgd291bGRuJ3QiLCBhY3Rpb24sCiAgICBwcmludCAiaWYgeW91IHB1dCIsIHZvbHRhZ2UsICJWb2x0cyB0aHJvdWdoIGl0LiIKICAgIHByaW50ICItLSBMb3ZlbHkgcGx1bWFnZSwgdGhlIiwgdHlwZQogICAgcHJpbnQgIi0tIEl0J3MiLCBzdGF0ZSwgIiEiClxlbmR7dmVyYmF0aW19Cgpjb3VsZCBiZSBjYWxsZWQgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKClxiZWdpbnt2ZXJiYXRpbX0KcGFycm90KDEwMDApCnBhcnJvdChhY3Rpb24gPSAnVk9PT09PTScsIHZvbHRhZ2UgPSAxMDAwMDAwKQpwYXJyb3QoJ2EgdGhvdXNhbmQnLCBzdGF0ZSA9ICdwdXNoaW5nIHVwIHRoZSBkYWlzaWVzJykKcGFycm90KCdhIG1pbGxpb24nLCAnYmVyZWZ0IG9mIGxpZmUnLCAnanVtcCcpClxlbmR7dmVyYmF0aW19CgpidXQgdGhlIGZvbGxvd2luZyBjYWxscyB3b3VsZCBhbGwgYmUgaW52YWxpZDoKClxiZWdpbnt2ZXJiYXRpbX0KcGFycm90KCkgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmcKcGFycm90KHZvbHRhZ2U9NS4wLCAnZGVhZCcpICAjIG5vbi1rZXl3b3JkIGFyZ3VtZW50IGZvbGxvd2luZyBrZXl3b3JkCnBhcnJvdCgxMTAsIHZvbHRhZ2U9MjIwKSAgICAgIyBkdXBsaWNhdGUgdmFsdWUgZm9yIGFyZ3VtZW50CnBhcnJvdChhY3Rvcj0nSm9obiBDbGVlc2UnKSAgIyB1bmtub3duIGtleXdvcmQKXGVuZHt2ZXJiYXRpbX0KCkluIGdlbmVyYWwsIGFuIGFyZ3VtZW50IGxpc3QgbXVzdCBoYXZlIGFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cwpmb2xsb3dlZCBieSBhbnkga2V5d29yZCBhcmd1bWVudHMsIHdoZXJlIHRoZSBrZXl3b3JkcyBtdXN0IGJlIGNob3Nlbgpmcm9tIHRoZSBmb3JtYWwgcGFyYW1ldGVyIG5hbWVzLiAgSXQncyBub3QgaW1wb3J0YW50IHdoZXRoZXIgYSBmb3JtYWwKcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUgb3Igbm90LiAgTm8gYXJndW1lbnQgbWF5IHJlY2VpdmUgYQp2YWx1ZSBtb3JlIHRoYW4gb25jZSAtLS0gZm9ybWFsIHBhcmFtZXRlciBuYW1lcyBjb3JyZXNwb25kaW5nIHRvCnBvc2l0aW9uYWwgYXJndW1lbnRzIGNhbm5vdCBiZSB1c2VkIGFzIGtleXdvcmRzIGluIHRoZSBzYW1lIGNhbGxzLgpIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IGZhaWxzIGR1ZSB0byB0aGlzIHJlc3RyaWN0aW9uOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGZ1bmN0aW9uKGEpOgouLi4gICAgIHBhc3MKLi4uIAo+Pj4gZnVuY3Rpb24oMCwgYT0wKQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpUeXBlRXJyb3I6IGZ1bmN0aW9uKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYScKXGVuZHt2ZXJiYXRpbX0KCldoZW4gYSBmaW5hbCBmb3JtYWwgcGFyYW1ldGVyIG9mIHRoZSBmb3JtIFxjb2RleyoqXHZhcntuYW1lfX0gaXMKcHJlc2VudCwgaXQgcmVjZWl2ZXMgYSBcdWxpbmt7ZGljdGlvbmFyeX17Li4vbGliL3R5cGVzbWFwcGluZy5odG1sfSBjb250YWluaW5nIGFsbCBrZXl3b3JkIGFyZ3VtZW50cwp3aG9zZSBrZXl3b3JkIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIGZvcm1hbCBwYXJhbWV0ZXIuICBUaGlzIG1heSBiZQpjb21iaW5lZCB3aXRoIGEgZm9ybWFsIHBhcmFtZXRlciBvZiB0aGUgZm9ybQpcY29kZXsqXHZhcntuYW1lfX0gKGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzdWJzZWN0aW9uKSB3aGljaCByZWNlaXZlcyBhCnR1cGxlIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGJleW9uZCB0aGUgZm9ybWFsIHBhcmFtZXRlcgpsaXN0LiAgKFxjb2RleypcdmFye25hbWV9fSBtdXN0IG9jY3VyIGJlZm9yZSBcY29kZXsqKlx2YXJ7bmFtZX19LikKRm9yIGV4YW1wbGUsIGlmIHdlIGRlZmluZSBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGNoZWVzZXNob3Aoa2luZCwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CiAgICBwcmludCAiLS0gRG8geW91IGhhdmUgYW55Iiwga2luZCwgJz8nCiAgICBwcmludCAiLS0gSSdtIHNvcnJ5LCB3ZSdyZSBhbGwgb3V0IG9mIiwga2luZAogICAgZm9yIGFyZyBpbiBhcmd1bWVudHM6IHByaW50IGFyZwogICAgcHJpbnQgJy0nKjQwCiAgICBrZXlzID0ga2V5d29yZHMua2V5cygpCiAgICBrZXlzLnNvcnQoKQogICAgZm9yIGt3IGluIGtleXM6IHByaW50IGt3LCAnOicsIGtleXdvcmRzW2t3XQpcZW5ke3ZlcmJhdGltfQoKSXQgY291bGQgYmUgY2FsbGVkIGxpa2UgdGhpczoKClxiZWdpbnt2ZXJiYXRpbX0KY2hlZXNlc2hvcCgnTGltYnVyZ2VyJywgIkl0J3MgdmVyeSBydW5ueSwgc2lyLiIsCiAgICAgICAgICAgIkl0J3MgcmVhbGx5IHZlcnksIFZFUlkgcnVubnksIHNpci4iLAogICAgICAgICAgIGNsaWVudD0nSm9obiBDbGVlc2UnLAogICAgICAgICAgIHNob3BrZWVwZXI9J01pY2hhZWwgUGFsaW4nLAogICAgICAgICAgIHNrZXRjaD0nQ2hlZXNlIFNob3AgU2tldGNoJykKXGVuZHt2ZXJiYXRpbX0KCmFuZCBvZiBjb3Vyc2UgaXQgd291bGQgcHJpbnQ6CgpcYmVnaW57dmVyYmF0aW19Ci0tIERvIHlvdSBoYXZlIGFueSBMaW1idXJnZXIgPwotLSBJJ20gc29ycnksIHdlJ3JlIGFsbCBvdXQgb2YgTGltYnVyZ2VyCkl0J3MgdmVyeSBydW5ueSwgc2lyLgpJdCdzIHJlYWxseSB2ZXJ5LCBWRVJZIHJ1bm55LCBzaXIuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xpZW50IDogSm9obiBDbGVlc2UKc2hvcGtlZXBlciA6IE1pY2hhZWwgUGFsaW4Kc2tldGNoIDogQ2hlZXNlIFNob3AgU2tldGNoClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgdGhlIFxtZXRob2R7c29ydCgpfSBtZXRob2Qgb2YgdGhlIGxpc3Qgb2Yga2V5d29yZCBhcmd1bWVudApuYW1lcyBpcyBjYWxsZWQgYmVmb3JlIHByaW50aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgXGNvZGV7a2V5d29yZHN9CmRpY3Rpb25hcnk7IGlmIHRoaXMgaXMgbm90IGRvbmUsIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZQpwcmludGVkIGlzIHVuZGVmaW5lZC4KCgpcc3Vic2VjdGlvbntBcmJpdHJhcnkgQXJndW1lbnQgTGlzdHMgXGxhYmVse2FyYml0cmFyeUFyZ3N9fQoKRmluYWxseSwgdGhlIGxlYXN0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb24gaXMgdG8gc3BlY2lmeSB0aGF0IGEKZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlc2UKYXJndW1lbnRzIHdpbGwgYmUgd3JhcHBlZCB1cCBpbiBhIHR1cGxlLiAgQmVmb3JlIHRoZSB2YXJpYWJsZSBudW1iZXIKb2YgYXJndW1lbnRzLCB6ZXJvIG9yIG1vcmUgbm9ybWFsIGFyZ3VtZW50cyBtYXkgb2NjdXIuCgpcYmVnaW57dmVyYmF0aW19CmRlZiBmcHJpbnRmKGZpbGUsIGZvcm1hdCwgKmFyZ3MpOgogICAgZmlsZS53cml0ZShmb3JtYXQgJSBhcmdzKQpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue1VucGFja2luZyBBcmd1bWVudCBMaXN0cyBcbGFiZWx7dW5wYWNraW5nLWFyZ3VtZW50c319CgpUaGUgcmV2ZXJzZSBzaXR1YXRpb24gb2NjdXJzIHdoZW4gdGhlIGFyZ3VtZW50cyBhcmUgYWxyZWFkeSBpbiBhIGxpc3QKb3IgdHVwbGUgYnV0IG5lZWQgdG8gYmUgdW5wYWNrZWQgZm9yIGEgZnVuY3Rpb24gY2FsbCByZXF1aXJpbmcgc2VwYXJhdGUKcG9zaXRpb25hbCBhcmd1bWVudHMuICBGb3IgaW5zdGFuY2UsIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257cmFuZ2UoKX0KZnVuY3Rpb24gZXhwZWN0cyBzZXBhcmF0ZSBcdmFye3N0YXJ0fSBhbmQgXHZhcntzdG9wfSBhcmd1bWVudHMuICBJZiB0aGV5CmFyZSBub3QgYXZhaWxhYmxlIHNlcGFyYXRlbHksIHdyaXRlIHRoZSBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIApcY29kZXsqfS1vcGVyYXRvciB0byB1bnBhY2sgdGhlIGFyZ3VtZW50cyBvdXQgb2YgYSBsaXN0IG9yIHR1cGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcmFuZ2UoMywgNikgICAgICAgICAgICAgIyBub3JtYWwgY2FsbCB3aXRoIHNlcGFyYXRlIGFyZ3VtZW50cwpbMywgNCwgNV0KPj4+IGFyZ3MgPSBbMywgNl0KPj4+IHJhbmdlKCphcmdzKSAgICAgICAgICAgICMgY2FsbCB3aXRoIGFyZ3VtZW50cyB1bnBhY2tlZCBmcm9tIGEgbGlzdApbMywgNCwgNV0KXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic2VjdGlvbntMYW1iZGEgRm9ybXMgXGxhYmVse2xhbWJkYX19CgpCeSBwb3B1bGFyIGRlbWFuZCwgYSBmZXcgZmVhdHVyZXMgY29tbW9ubHkgZm91bmQgaW4gZnVuY3Rpb25hbApwcm9ncmFtbWluZyBsYW5ndWFnZXMgYW5kIExpc3AgaGF2ZSBiZWVuIGFkZGVkIHRvIFB5dGhvbi4gIFdpdGggdGhlClxrZXl3b3Jke2xhbWJkYX0ga2V5d29yZCwgc21hbGwgYW5vbnltb3VzIGZ1bmN0aW9ucyBjYW4gYmUgY3JlYXRlZC4KSGVyZSdzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzdW0gb2YgaXRzIHR3byBhcmd1bWVudHM6ClxzYW1we2xhbWJkYSBhLCBiOiBhK2J9LiAgTGFtYmRhIGZvcm1zIGNhbiBiZSB1c2VkIHdoZXJldmVyIGZ1bmN0aW9uCm9iamVjdHMgYXJlIHJlcXVpcmVkLiAgVGhleSBhcmUgc3ludGFjdGljYWxseSByZXN0cmljdGVkIHRvIGEgc2luZ2xlCmV4cHJlc3Npb24uICBTZW1hbnRpY2FsbHksIHRoZXkgYXJlIGp1c3Qgc3ludGFjdGljIHN1Z2FyIGZvciBhIG5vcm1hbApmdW5jdGlvbiBkZWZpbml0aW9uLiAgTGlrZSBuZXN0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGxhbWJkYSBmb3JtcwpjYW4gcmVmZXJlbmNlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb250YWluaW5nIHNjb3BlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIG1ha2VfaW5jcmVtZW50b3Iobik6Ci4uLiAgICAgcmV0dXJuIGxhbWJkYSB4OiB4ICsgbgouLi4KPj4+IGYgPSBtYWtlX2luY3JlbWVudG9yKDQyKQo+Pj4gZigwKQo0Mgo+Pj4gZigxKQo0MwpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue0RvY3VtZW50YXRpb24gU3RyaW5ncyBcbGFiZWx7ZG9jc3RyaW5nc319CgpUaGVyZSBhcmUgZW1lcmdpbmcgY29udmVudGlvbnMgYWJvdXQgdGhlIGNvbnRlbnQgYW5kIGZvcm1hdHRpbmcgb2YKZG9jdW1lbnRhdGlvbiBzdHJpbmdzLgpcaW5kZXh7ZG9jc3RyaW5nc31caW5kZXh7ZG9jdW1lbnRhdGlvbiBzdHJpbmdzfQpcaW5kZXh7c3RyaW5ncywgZG9jdW1lbnRhdGlvbn0KClRoZSBmaXJzdCBsaW5lIHNob3VsZCBhbHdheXMgYmUgYSBzaG9ydCwgY29uY2lzZSBzdW1tYXJ5IG9mIHRoZQpvYmplY3QncyBwdXJwb3NlLiAgRm9yIGJyZXZpdHksIGl0IHNob3VsZCBub3QgZXhwbGljaXRseSBzdGF0ZSB0aGUKb2JqZWN0J3MgbmFtZSBvciB0eXBlLCBzaW5jZSB0aGVzZSBhcmUgYXZhaWxhYmxlIGJ5IG90aGVyIG1lYW5zCihleGNlcHQgaWYgdGhlIG5hbWUgaGFwcGVucyB0byBiZSBhIHZlcmIgZGVzY3JpYmluZyBhIGZ1bmN0aW9uJ3MKb3BlcmF0aW9uKS4gIFRoaXMgbGluZSBzaG91bGQgYmVnaW4gd2l0aCBhIGNhcGl0YWwgbGV0dGVyIGFuZCBlbmQgd2l0aAphIHBlcmlvZC4KCklmIHRoZXJlIGFyZSBtb3JlIGxpbmVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZywgdGhlIHNlY29uZCBsaW5lCnNob3VsZCBiZSBibGFuaywgdmlzdWFsbHkgc2VwYXJhdGluZyB0aGUgc3VtbWFyeSBmcm9tIHRoZSByZXN0IG9mIHRoZQpkZXNjcmlwdGlvbi4gIFRoZSBmb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIG9uZSBvciBtb3JlIHBhcmFncmFwaHMKZGVzY3JpYmluZyB0aGUgb2JqZWN0J3MgY2FsbGluZyBjb252ZW50aW9ucywgaXRzIHNpZGUgZWZmZWN0cywgZXRjLgoKVGhlIFB5dGhvbiBwYXJzZXIgZG9lcyBub3Qgc3RyaXAgaW5kZW50YXRpb24gZnJvbSBtdWx0aS1saW5lIHN0cmluZwpsaXRlcmFscyBpbiBQeXRob24sIHNvIHRvb2xzIHRoYXQgcHJvY2VzcyBkb2N1bWVudGF0aW9uIGhhdmUgdG8gc3RyaXAKaW5kZW50YXRpb24gaWYgZGVzaXJlZC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb24uClRoZSBmaXJzdCBub24tYmxhbmsgbGluZSBcZW1waHthZnRlcn0gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0cmluZwpkZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YgaW5kZW50YXRpb24gZm9yIHRoZSBlbnRpcmUgZG9jdW1lbnRhdGlvbgpzdHJpbmcuICAoV2UgY2FuJ3QgdXNlIHRoZSBmaXJzdCBsaW5lIHNpbmNlIGl0IGlzIGdlbmVyYWxseSBhZGphY2VudAp0byB0aGUgc3RyaW5nJ3Mgb3BlbmluZyBxdW90ZXMgc28gaXRzIGluZGVudGF0aW9uIGlzIG5vdCBhcHBhcmVudCBpbgp0aGUgc3RyaW5nIGxpdGVyYWwuKSAgV2hpdGVzcGFjZSBgYGVxdWl2YWxlbnQnJyB0byB0aGlzIGluZGVudGF0aW9uIGlzCnRoZW4gc3RyaXBwZWQgZnJvbSB0aGUgc3RhcnQgb2YgYWxsIGxpbmVzIG9mIHRoZSBzdHJpbmcuICBMaW5lcyB0aGF0CmFyZSBpbmRlbnRlZCBsZXNzIHNob3VsZCBub3Qgb2NjdXIsIGJ1dCBpZiB0aGV5IG9jY3VyIGFsbCB0aGVpcgpsZWFkaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLiAgRXF1aXZhbGVuY2Ugb2Ygd2hpdGVzcGFjZQpzaG91bGQgYmUgdGVzdGVkIGFmdGVyIGV4cGFuc2lvbiBvZiB0YWJzICh0byA4IHNwYWNlcywgbm9ybWFsbHkpLgoKSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGktbGluZSBkb2NzdHJpbmc6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgbXlfZnVuY3Rpb24oKToKLi4uICAgICAiIiJEbyBub3RoaW5nLCBidXQgZG9jdW1lbnQgaXQuCi4uLiAKLi4uICAgICBObywgcmVhbGx5LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nLgouLi4gICAgICIiIgouLi4gICAgIHBhc3MKLi4uIAo+Pj4gcHJpbnQgbXlfZnVuY3Rpb24uX19kb2NfXwpEbyBub3RoaW5nLCBidXQgZG9jdW1lbnQgaXQuCgogICAgTm8sIHJlYWxseSwgaXQgZG9lc24ndCBkbyBhbnl0aGluZy4KICAgIApcZW5ke3ZlcmJhdGltfQoKCgpcY2hhcHRlcntEYXRhIFN0cnVjdHVyZXMgXGxhYmVse3N0cnVjdHVyZXN9fQoKVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBzb21lIHRoaW5ncyB5b3UndmUgbGVhcm5lZCBhYm91dCBhbHJlYWR5IGluCm1vcmUgZGV0YWlsLCBhbmQgYWRkcyBzb21lIG5ldyB0aGluZ3MgYXMgd2VsbC4KCgpcc2VjdGlvbntNb3JlIG9uIExpc3RzIFxsYWJlbHttb3JlTGlzdHN9fQoKVGhlIGxpc3QgZGF0YSB0eXBlIGhhcyBzb21lIG1vcmUgbWV0aG9kcy4gIEhlcmUgYXJlIGFsbCBvZiB0aGUgbWV0aG9kcwpvZiBsaXN0IG9iamVjdHM6CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17YXBwZW5kfXt4fQpBZGQgYW4gaXRlbSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0OwplcXVpdmFsZW50IHRvIFxjb2Rle2FbbGVuKGEpOl0gPSBbXHZhcnt4fV19LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17ZXh0ZW5kfXtMfQpFeHRlbmQgdGhlIGxpc3QgYnkgYXBwZW5kaW5nIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGdpdmVuIGxpc3Q7CmVxdWl2YWxlbnQgdG8gXGNvZGV7YVtsZW4oYSk6XSA9IFx2YXJ7TH19LgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17aW5zZXJ0fXtpLCB4fQpJbnNlcnQgYW4gaXRlbSBhdCBhIGdpdmVuIHBvc2l0aW9uLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBpbmRleApvZiB0aGUgZWxlbWVudCBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0LCBzbyBcY29kZXthLmluc2VydCgwLCBcdmFye3h9KX0KaW5zZXJ0cyBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QsIGFuZCBcY29kZXthLmluc2VydChsZW4oYSksIFx2YXJ7eH0pfQppcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EuYXBwZW5kKFx2YXJ7eH0pfS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde3JlbW92ZX17eH0KUmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3Qgd2hvc2UgdmFsdWUgaXMgXHZhcnt4fS4KSXQgaXMgYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY31bbGlzdF17cG9wfXtcb3B0aW9uYWx7aX19ClJlbW92ZSB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGxpc3QsIGFuZCByZXR1cm4gaXQuICBJZgpubyBpbmRleCBpcyBzcGVjaWZpZWQsIFxjb2Rle2EucG9wKCl9IHJldHVybnMgdGhlIGxhc3QgaXRlbSBpbiB0aGUKbGlzdC4gIFRoZSBpdGVtIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiAgKFRoZSBzcXVhcmUgYnJhY2tldHMKYXJvdW5kIHRoZSBcdmFye2l9IGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGRlbm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIKaXMgb3B0aW9uYWwsIG5vdCB0aGF0IHlvdSBzaG91bGQgdHlwZSBzcXVhcmUgYnJhY2tldHMgYXQgdGhhdApwb3NpdGlvbi4gIFlvdSB3aWxsIHNlZSB0aGlzIG5vdGF0aW9uIGZyZXF1ZW50bHkgaW4gdGhlClxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LikKXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde2luZGV4fXt4fQpSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG9mIHRoZSBmaXJzdCBpdGVtIHdob3NlIHZhbHVlIGlzIFx2YXJ7eH0uCkl0IGlzIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaXRlbS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde2NvdW50fXt4fQpSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBcdmFye3h9IGFwcGVhcnMgaW4gdGhlIGxpc3QuClxlbmR7bWV0aG9kZGVzY30KClxiZWdpbnttZXRob2RkZXNjfVtsaXN0XXtzb3J0fXt9ClNvcnQgdGhlIGl0ZW1zIG9mIHRoZSBsaXN0LCBpbiBwbGFjZS4KXGVuZHttZXRob2RkZXNjfQoKXGJlZ2lue21ldGhvZGRlc2N9W2xpc3Rde3JldmVyc2V9e30KUmV2ZXJzZSB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QsIGluIHBsYWNlLgpcZW5ke21ldGhvZGRlc2N9CgpBbiBleGFtcGxlIHRoYXQgdXNlcyBtb3N0IG9mIHRoZSBsaXN0IG1ldGhvZHM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBhID0gWzY2LjYsIDMzMywgMzMzLCAxLCAxMjM0LjVdCj4+PiBwcmludCBhLmNvdW50KDMzMyksIGEuY291bnQoNjYuNiksIGEuY291bnQoJ3gnKQoyIDEgMAo+Pj4gYS5pbnNlcnQoMiwgLTEpCj4+PiBhLmFwcGVuZCgzMzMpCj4+PiBhCls2Ni42LCAzMzMsIC0xLCAzMzMsIDEsIDEyMzQuNSwgMzMzXQo+Pj4gYS5pbmRleCgzMzMpCjEKPj4+IGEucmVtb3ZlKDMzMykKPj4+IGEKWzY2LjYsIC0xLCAzMzMsIDEsIDEyMzQuNSwgMzMzXQo+Pj4gYS5yZXZlcnNlKCkKPj4+IGEKWzMzMywgMTIzNC41LCAxLCAzMzMsIC0xLCA2Ni42XQo+Pj4gYS5zb3J0KCkKPj4+IGEKWy0xLCAxLCA2Ni42LCAzMzMsIDMzMywgMTIzNC41XQpcZW5ke3ZlcmJhdGltfQoKClxzdWJzZWN0aW9ue1VzaW5nIExpc3RzIGFzIFN0YWNrcyBcbGFiZWx7bGlzdHMtYXMtc3RhY2tzfX0KXHNlY3Rpb25hdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAbGZ3Lm9yZ30KClRoZSBsaXN0IG1ldGhvZHMgbWFrZSBpdCB2ZXJ5IGVhc3kgdG8gdXNlIGEgbGlzdCBhcyBhIHN0YWNrLCB3aGVyZSB0aGUKbGFzdCBlbGVtZW50IGFkZGVkIGlzIHRoZSBmaXJzdCBlbGVtZW50IHJldHJpZXZlZCAoYGBsYXN0LWluLApmaXJzdC1vdXQnJykuICBUbyBhZGQgYW4gaXRlbSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjaywgdXNlClxtZXRob2R7YXBwZW5kKCl9LiAgVG8gcmV0cmlldmUgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCB1c2UKXG1ldGhvZHtwb3AoKX0gd2l0aG91dCBhbiBleHBsaWNpdCBpbmRleC4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gc3RhY2sgPSBbMywgNCwgNV0KPj4+IHN0YWNrLmFwcGVuZCg2KQo+Pj4gc3RhY2suYXBwZW5kKDcpCj4+PiBzdGFjawpbMywgNCwgNSwgNiwgN10KPj4+IHN0YWNrLnBvcCgpCjcKPj4+IHN0YWNrClszLCA0LCA1LCA2XQo+Pj4gc3RhY2sucG9wKCkKNgo+Pj4gc3RhY2sucG9wKCkKNQo+Pj4gc3RhY2sKWzMsIDRdClxlbmR7dmVyYmF0aW19CgoKXHN1YnNlY3Rpb257VXNpbmcgTGlzdHMgYXMgUXVldWVzIFxsYWJlbHtsaXN0cy1hcy1xdWV1ZXN9fQpcc2VjdGlvbmF1dGhvcntLYS1QaW5nIFllZX17cGluZ0BsZncub3JnfQoKWW91IGNhbiBhbHNvIHVzZSBhIGxpc3QgY29udmVuaWVudGx5IGFzIGEgcXVldWUsIHdoZXJlIHRoZSBmaXJzdAplbGVtZW50IGFkZGVkIGlzIHRoZSBmaXJzdCBlbGVtZW50IHJldHJpZXZlZCAoYGBmaXJzdC1pbiwKZmlyc3Qtb3V0JycpLiAgVG8gYWRkIGFuIGl0ZW0gdG8gdGhlIGJhY2sgb2YgdGhlIHF1ZXVlLCB1c2UKXG1ldGhvZHthcHBlbmQoKX0uICBUbyByZXRyaWV2ZSBhbiBpdGVtIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSwKdXNlIFxtZXRob2R7cG9wKCl9IHdpdGggXGNvZGV7MH0gYXMgdGhlIGluZGV4LiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBxdWV1ZSA9IFsiRXJpYyIsICJKb2huIiwgIk1pY2hhZWwiXQo+Pj4gcXVldWUuYXBwZW5kKCJUZXJyeSIpICAgICAgICAgICAjIFRlcnJ5IGFycml2ZXMKPj4+IHF1ZXVlLmFwcGVuZCgiR3JhaGFtIikgICAgICAgICAgIyBHcmFoYW0gYXJyaXZlcwo+Pj4gcXVldWUucG9wKDApCidFcmljJwo+Pj4gcXVldWUucG9wKDApCidKb2huJwo+Pj4gcXVldWUKWydNaWNoYWVsJywgJ1RlcnJ5JywgJ0dyYWhhbSddClxlbmR7dmVyYmF0aW19CgoKXHN1YnNlY3Rpb257RnVuY3Rpb25hbCBQcm9ncmFtbWluZyBUb29scyBcbGFiZWx7ZnVuY3Rpb25hbH19CgpUaGVyZSBhcmUgdGhyZWUgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgYXJlIHZlcnkgdXNlZnVsIHdoZW4gdXNlZCB3aXRoCmxpc3RzOiBcZnVuY3Rpb257ZmlsdGVyKCl9LCBcZnVuY3Rpb257bWFwKCl9LCBhbmQgXGZ1bmN0aW9ue3JlZHVjZSgpfS4KClxzYW1we2ZpbHRlcihcdmFye2Z1bmN0aW9ufSwgXHZhcntzZXF1ZW5jZX0pfSByZXR1cm5zIGEgc2VxdWVuY2UgKG9mCnRoZSBzYW1lIHR5cGUsIGlmIHBvc3NpYmxlKSBjb25zaXN0aW5nIG9mIHRob3NlIGl0ZW1zIGZyb20gdGhlCnNlcXVlbmNlIGZvciB3aGljaCBcY29kZXtcdmFye2Z1bmN0aW9ufShcdmFye2l0ZW19KX0gaXMgdHJ1ZS4gIEZvcgpleGFtcGxlLCB0byBjb21wdXRlIHNvbWUgcHJpbWVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGYoeCk6IHJldHVybiB4ICUgMiAhPSAwIGFuZCB4ICUgMyAhPSAwCi4uLgo+Pj4gZmlsdGVyKGYsIHJhbmdlKDIsIDI1KSkKWzUsIDcsIDExLCAxMywgMTcsIDE5LCAyM10KXGVuZHt2ZXJiYXRpbX0KClxzYW1we21hcChcdmFye2Z1bmN0aW9ufSwgXHZhcntzZXF1ZW5jZX0pfSBjYWxscwpcY29kZXtcdmFye2Z1bmN0aW9ufShcdmFye2l0ZW19KX0gZm9yIGVhY2ggb2YgdGhlIHNlcXVlbmNlJ3MgaXRlbXMgYW5kCnJldHVybnMgYSBsaXN0IG9mIHRoZSByZXR1cm4gdmFsdWVzLiAgRm9yIGV4YW1wbGUsIHRvIGNvbXB1dGUgc29tZQpjdWJlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGRlZiBjdWJlKHgpOiByZXR1cm4geCp4KngKLi4uCj4+PiBtYXAoY3ViZSwgcmFuZ2UoMSwgMTEpKQpbMSwgOCwgMjcsIDY0LCAxMjUsIDIxNiwgMzQzLCA1MTIsIDcyOSwgMTAwMF0KXGVuZHt2ZXJiYXRpbX0KCk1vcmUgdGhhbiBvbmUgc2VxdWVuY2UgbWF5IGJlIHBhc3NlZDsgdGhlIGZ1bmN0aW9uIG11c3QgdGhlbiBoYXZlIGFzCm1hbnkgYXJndW1lbnRzIGFzIHRoZXJlIGFyZSBzZXF1ZW5jZXMgYW5kIGlzIGNhbGxlZCB3aXRoIHRoZQpjb3JyZXNwb25kaW5nIGl0ZW0gZnJvbSBlYWNoIHNlcXVlbmNlIChvciBcY29kZXtOb25lfSBpZiBzb21lIHNlcXVlbmNlCmlzIHNob3J0ZXIgdGhhbiBhbm90aGVyKS4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gc2VxID0gcmFuZ2UoOCkKPj4+IGRlZiBhZGQoeCwgeSk6IHJldHVybiB4K3kKLi4uCj4+PiBtYXAoYWRkLCBzZXEsIHNlcSkKWzAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTRdClxlbmR7dmVyYmF0aW19Cgpcc2FtcHtyZWR1Y2UoXHZhcntmdW5jfSwgXHZhcntzZXF1ZW5jZX0pfSByZXR1cm5zIGEgc2luZ2xlIHZhbHVlCmNvbnN0cnVjdGVkIGJ5IGNhbGxpbmcgdGhlIGJpbmFyeSBmdW5jdGlvbiBcdmFye2Z1bmN9IG9uIHRoZSBmaXJzdCB0d28KaXRlbXMgb2YgdGhlIHNlcXVlbmNlLCB0aGVuIG9uIHRoZSByZXN1bHQgYW5kIHRoZSBuZXh0IGl0ZW0sIGFuZCBzbwpvbi4gIEZvciBleGFtcGxlLCB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgMSB0aHJvdWdoIDEwOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIGFkZCh4LHkpOiByZXR1cm4geCt5Ci4uLgo+Pj4gcmVkdWNlKGFkZCwgcmFuZ2UoMSwgMTEpKQo1NQpcZW5ke3ZlcmJhdGltfQoKSWYgdGhlcmUncyBvbmx5IG9uZSBpdGVtIGluIHRoZSBzZXF1ZW5jZSwgaXRzIHZhbHVlIGlzIHJldHVybmVkOyBpZgp0aGUgc2VxdWVuY2UgaXMgZW1wdHksIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuCgpBIHRoaXJkIGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0aW5nIHZhbHVlLiAgSW4gdGhpcwpjYXNlIHRoZSBzdGFydGluZyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgYW4gZW1wdHkgc2VxdWVuY2UsIGFuZCB0aGUKZnVuY3Rpb24gaXMgZmlyc3QgYXBwbGllZCB0byB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIHRoZSBmaXJzdCBzZXF1ZW5jZQppdGVtLCB0aGVuIHRvIHRoZSByZXN1bHQgYW5kIHRoZSBuZXh0IGl0ZW0sIGFuZCBzbyBvbi4gIEZvciBleGFtcGxlLAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIHN1bShzZXEpOgouLi4gICAgIGRlZiBhZGQoeCx5KTogcmV0dXJuIHgreQouLi4gICAgIHJldHVybiByZWR1Y2UoYWRkLCBzZXEsIDApCi4uLiAKPj4+IHN1bShyYW5nZSgxLCAxMSkpCjU1Cj4+PiBzdW0oW10pCjAKXGVuZHt2ZXJiYXRpbX0KCkRvbid0IHVzZSB0aGlzIGV4YW1wbGUncyBkZWZpbml0aW9uIG9mIFxmdW5jdGlvbntzdW0oKX06IHNpbmNlIHN1bW1pbmcKbnVtYmVycyBpcyBzdWNoIGEgY29tbW9uIG5lZWQsIGEgYnVpbHQtaW4gZnVuY3Rpb24KXGNvZGV7c3VtKFx2YXJ7c2VxdWVuY2V9KX0gaXMgYWxyZWFkeSBwcm92aWRlZCwgYW5kIHdvcmtzIGV4YWN0bHkgbGlrZQp0aGlzLgpcdmVyc2lvbmFkZGVkezIuM30KClxzdWJzZWN0aW9ue0xpc3QgQ29tcHJlaGVuc2lvbnN9CgpMaXN0IGNvbXByZWhlbnNpb25zIHByb3ZpZGUgYSBjb25jaXNlIHdheSB0byBjcmVhdGUgbGlzdHMgd2l0aG91dCByZXNvcnRpbmcKdG8gdXNlIG9mIFxmdW5jdGlvbnttYXAoKX0sIFxmdW5jdGlvbntmaWx0ZXIoKX0gYW5kL29yIFxrZXl3b3Jke2xhbWJkYX0uClRoZSByZXN1bHRpbmcgbGlzdCBkZWZpbml0aW9uIHRlbmRzIG9mdGVuIHRvIGJlIGNsZWFyZXIgdGhhbiBsaXN0cyBidWlsdAp1c2luZyB0aG9zZSBjb25zdHJ1Y3RzLiAgRWFjaCBsaXN0IGNvbXByZWhlbnNpb24gY29uc2lzdHMgb2YgYW4gZXhwcmVzc2lvbgpmb2xsb3dlZCBieSBhIFxrZXl3b3Jke2Zvcn0gY2xhdXNlLCB0aGVuIHplcm8gb3IgbW9yZSBca2V5d29yZHtmb3J9IG9yClxrZXl3b3Jke2lmfSBjbGF1c2VzLiAgVGhlIHJlc3VsdCB3aWxsIGJlIGEgbGlzdCByZXN1bHRpbmcgZnJvbSBldmFsdWF0aW5nCnRoZSBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZSBca2V5d29yZHtmb3J9IGFuZCBca2V5d29yZHtpZn0gY2xhdXNlcwp3aGljaCBmb2xsb3cgaXQuICBJZiB0aGUgZXhwcmVzc2lvbiB3b3VsZCBldmFsdWF0ZSB0byBhIHR1cGxlLCBpdCBtdXN0IGJlCnBhcmVudGhlc2l6ZWQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmcmVzaGZydWl0ID0gWycgIGJhbmFuYScsICcgIGxvZ2FuYmVycnkgJywgJ3Bhc3Npb24gZnJ1aXQgICddCj4+PiBbd2VhcG9uLnN0cmlwKCkgZm9yIHdlYXBvbiBpbiBmcmVzaGZydWl0XQpbJ2JhbmFuYScsICdsb2dhbmJlcnJ5JywgJ3Bhc3Npb24gZnJ1aXQnXQo+Pj4gdmVjID0gWzIsIDQsIDZdCj4+PiBbMyp4IGZvciB4IGluIHZlY10KWzYsIDEyLCAxOF0KPj4+IFszKnggZm9yIHggaW4gdmVjIGlmIHggPiAzXQpbMTIsIDE4XQo+Pj4gWzMqeCBmb3IgeCBpbiB2ZWMgaWYgeCA8IDJdCltdCj4+PiBbW3gseCoqMl0gZm9yIHggaW4gdmVjXQpbWzIsIDRdLCBbNCwgMTZdLCBbNiwgMzZdXQo+Pj4gW3gsIHgqKjIgZm9yIHggaW4gdmVjXQkjIGVycm9yIC0gcGFyZW5zIHJlcXVpcmVkIGZvciB0dXBsZXMKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CiAgICBbeCwgeCoqMiBmb3IgeCBpbiB2ZWNdCiAgICAgICAgICAgICAgIF4KU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4Cj4+PiBbKHgsIHgqKjIpIGZvciB4IGluIHZlY10KWygyLCA0KSwgKDQsIDE2KSwgKDYsIDM2KV0KPj4+IHZlYzEgPSBbMiwgNCwgNl0KPj4+IHZlYzIgPSBbNCwgMywgLTldCj4+PiBbeCp5IGZvciB4IGluIHZlYzEgZm9yIHkgaW4gdmVjMl0KWzgsIDYsIC0xOCwgMTYsIDEyLCAtMzYsIDI0LCAxOCwgLTU0XQo+Pj4gW3greSBmb3IgeCBpbiB2ZWMxIGZvciB5IGluIHZlYzJdCls2LCA1LCAtNywgOCwgNywgLTUsIDEwLCA5LCAtM10KPj4+IFt2ZWMxW2ldKnZlYzJbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKHZlYzEpKV0KWzgsIDEyLCAtNTRdClxlbmR7dmVyYmF0aW19CgpMaXN0IGNvbXByZWhlbnNpb25zIGFyZSBtdWNoIG1vcmUgZmxleGlibGUgdGhhbiBcZnVuY3Rpb257bWFwKCl9IGFuZCBjYW4gYmUKYXBwbGllZCB0byBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGFuZCB0byBuZXN0ZWQgZnVuY3Rpb25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gW3N0cihyb3VuZCgzNTUvMTEzLjAsIGkpKSBmb3IgaSBpbiByYW5nZSgxLDYpXQpbJzMuMScsICczLjE0JywgJzMuMTQyJywgJzMuMTQxNicsICczLjE0MTU5J10KXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntUaGUgXGtleXdvcmR7ZGVsfSBzdGF0ZW1lbnQgXGxhYmVse2RlbH19CgpUaGVyZSBpcyBhIHdheSB0byByZW1vdmUgYW4gaXRlbSBmcm9tIGEgbGlzdCBnaXZlbiBpdHMgaW5kZXggaW5zdGVhZApvZiBpdHMgdmFsdWU6IHRoZSBca2V5d29yZHtkZWx9IHN0YXRlbWVudC4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZCB0bwpyZW1vdmUgc2xpY2VzIGZyb20gYSBsaXN0ICh3aGljaCB3ZSBkaWQgZWFybGllciBieSBhc3NpZ25tZW50IG9mIGFuCmVtcHR5IGxpc3QgdG8gdGhlIHNsaWNlKS4gIEZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gYSA9IFstMSwgMSwgNjYuNiwgMzMzLCAzMzMsIDEyMzQuNV0KPj4+IGRlbCBhWzBdCj4+PiBhClsxLCA2Ni42LCAzMzMsIDMzMywgMTIzNC41XQo+Pj4gZGVsIGFbMjo0XQo+Pj4gYQpbMSwgNjYuNiwgMTIzNC41XQpcZW5ke3ZlcmJhdGltfQoKXGtleXdvcmR7ZGVsfSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlbGV0ZSBlbnRpcmUgdmFyaWFibGVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVsIGEKXGVuZHt2ZXJiYXRpbX0KClJlZmVyZW5jaW5nIHRoZSBuYW1lIFxjb2Rle2F9IGhlcmVhZnRlciBpcyBhbiBlcnJvciAoYXQgbGVhc3QgdW50aWwKYW5vdGhlciB2YWx1ZSBpcyBhc3NpZ25lZCB0byBpdCkuICBXZSdsbCBmaW5kIG90aGVyIHVzZXMgZm9yClxrZXl3b3Jke2RlbH0gbGF0ZXIuCgoKXHNlY3Rpb257VHVwbGVzIGFuZCBTZXF1ZW5jZXMgXGxhYmVse3R1cGxlc319CgpXZSBzYXcgdGhhdCBsaXN0cyBhbmQgc3RyaW5ncyBoYXZlIG1hbnkgY29tbW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMKaW5kZXhpbmcgYW5kIHNsaWNpbmcgb3BlcmF0aW9ucy4gIFRoZXkgYXJlIHR3byBleGFtcGxlcyBvZgpcdWxpbmt7XGVtcGh7c2VxdWVuY2V9IGRhdGEgdHlwZXN9ey4uL2xpYi90eXBlc3NlcS5odG1sfS4gIFNpbmNlClB5dGhvbiBpcyBhbiBldm9sdmluZyBsYW5ndWFnZSwgb3RoZXIgc2VxdWVuY2UgZGF0YSB0eXBlcyBtYXkgYmUKYWRkZWQuICBUaGVyZSBpcyBhbHNvIGFub3RoZXIgc3RhbmRhcmQgc2VxdWVuY2UgZGF0YSB0eXBlOiB0aGUKXGVtcGh7dHVwbGV9LgoKQSB0dXBsZSBjb25zaXN0cyBvZiBhIG51bWJlciBvZiB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgZm9yCmluc3RhbmNlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdCA9IDEyMzQ1LCA1NDMyMSwgJ2hlbGxvIScKPj4+IHRbMF0KMTIzNDUKPj4+IHQKKDEyMzQ1LCA1NDMyMSwgJ2hlbGxvIScpCj4+PiAjIFR1cGxlcyBtYXkgYmUgbmVzdGVkOgouLi4gdSA9IHQsICgxLCAyLCAzLCA0LCA1KQo+Pj4gdQooKDEyMzQ1LCA1NDMyMSwgJ2hlbGxvIScpLCAoMSwgMiwgMywgNCwgNSkpClxlbmR7dmVyYmF0aW19CgpBcyB5b3Ugc2VlLCBvbiBvdXRwdXQgdHVwbGVzIGFyZSBhbHdheSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcywgc28KdGhhdCBuZXN0ZWQgdHVwbGVzIGFyZSBpbnRlcnByZXRlZCBjb3JyZWN0bHk7IHRoZXkgbWF5IGJlIGlucHV0IHdpdGgKb3Igd2l0aG91dCBzdXJyb3VuZGluZyBwYXJlbnRoZXNlcywgYWx0aG91Z2ggb2Z0ZW4gcGFyZW50aGVzZXMgYXJlCm5lY2Vzc2FyeSBhbnl3YXkgKGlmIHRoZSB0dXBsZSBpcyBwYXJ0IG9mIGEgbGFyZ2VyIGV4cHJlc3Npb24pLgoKVHVwbGVzIGhhdmUgbWFueSB1c2VzLiAgRm9yIGV4YW1wbGU6ICh4LCB5KSBjb29yZGluYXRlIHBhaXJzLCBlbXBsb3llZQpyZWNvcmRzIGZyb20gYSBkYXRhYmFzZSwgZXRjLiAgVHVwbGVzLCBsaWtlIHN0cmluZ3MsIGFyZSBpbW11dGFibGU6IGl0CmlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdG8gdGhlIGluZGl2aWR1YWwgaXRlbXMgb2YgYSB0dXBsZSAoeW91IGNhbgpzaW11bGF0ZSBtdWNoIG9mIHRoZSBzYW1lIGVmZmVjdCB3aXRoIHNsaWNpbmcgYW5kIGNvbmNhdGVuYXRpb24sCnRob3VnaCkuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSB0dXBsZXMgd2hpY2ggY29udGFpbiBtdXRhYmxlCm9iamVjdHMsIHN1Y2ggYXMgbGlzdHMuCgpBIHNwZWNpYWwgcHJvYmxlbSBpcyB0aGUgY29uc3RydWN0aW9uIG9mIHR1cGxlcyBjb250YWluaW5nIDAgb3IgMQppdGVtczogdGhlIHN5bnRheCBoYXMgc29tZSBleHRyYSBxdWlya3MgdG8gYWNjb21tb2RhdGUgdGhlc2UuICBFbXB0eQp0dXBsZXMgYXJlIGNvbnN0cnVjdGVkIGJ5IGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXM7IGEgdHVwbGUgd2l0aApvbmUgaXRlbSBpcyBjb25zdHJ1Y3RlZCBieSBmb2xsb3dpbmcgYSB2YWx1ZSB3aXRoIGEgY29tbWEKKGl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGVuY2xvc2UgYSBzaW5nbGUgdmFsdWUgaW4gcGFyZW50aGVzZXMpLgpVZ2x5LCBidXQgZWZmZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBlbXB0eSA9ICgpCj4+PiBzaW5nbGV0b24gPSAnaGVsbG8nLCAgICAjIDwtLSBub3RlIHRyYWlsaW5nIGNvbW1hCj4+PiBsZW4oZW1wdHkpCjAKPj4+IGxlbihzaW5nbGV0b24pCjEKPj4+IHNpbmdsZXRvbgooJ2hlbGxvJywpClxlbmR7dmVyYmF0aW19CgpUaGUgc3RhdGVtZW50IFxjb2Rle3QgPSAxMjM0NSwgNTQzMjEsICdoZWxsbyEnfSBpcyBhbiBleGFtcGxlIG9mClxlbXBoe3R1cGxlIHBhY2tpbmd9OiB0aGUgdmFsdWVzIFxjb2RlezEyMzQ1fSwgXGNvZGV7NTQzMjF9IGFuZApcY29kZXsnaGVsbG8hJ30gYXJlIHBhY2tlZCB0b2dldGhlciBpbiBhIHR1cGxlLiAgVGhlIHJldmVyc2Ugb3BlcmF0aW9uCmlzIGFsc28gcG9zc2libGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiB4LCB5LCB6ID0gdApcZW5ke3ZlcmJhdGltfQoKVGhpcyBpcyBjYWxsZWQsIGFwcHJvcHJpYXRlbHkgZW5vdWdoLCBcZW1waHtzZXF1ZW5jZSB1bnBhY2tpbmd9LgpTZXF1ZW5jZSB1bnBhY2tpbmcgcmVxdWlyZXMgdGhhdCB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgb24gdGhlIGxlZnQKaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UuICBOb3RlCnRoYXQgbXVsdGlwbGUgYXNzaWdubWVudCBpcyByZWFsbHkganVzdCBhIGNvbWJpbmF0aW9uIG9mIHR1cGxlIHBhY2tpbmcKYW5kIHNlcXVlbmNlIHVucGFja2luZyEKClRoZXJlIGlzIGEgc21hbGwgYml0IG9mIGFzeW1tZXRyeSBoZXJlOiAgcGFja2luZyBtdWx0aXBsZSB2YWx1ZXMKYWx3YXlzIGNyZWF0ZXMgYSB0dXBsZSwgYW5kIHVucGFja2luZyB3b3JrcyBmb3IgYW55IHNlcXVlbmNlLgoKJSBYWFggQWRkIGEgYml0IG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHVwbGVzIGFuZCBsaXN0cy4KCgpcc2VjdGlvbntTZXRzIFxsYWJlbHtzZXRzfX0KClB5dGhvbiBhbHNvIGluY2x1ZGVzIGEgZGF0YSB0eXBlIGZvciBcZW1waHtzZXRzfS4gIEEgc2V0IGlzIGFuIHVub3JkZXJlZApjb2xsZWN0aW9uIHdpdGggbm8gZHVwbGljYXRlIGVsZW1lbnRzLiAgQmFzaWMgdXNlcyBpbmNsdWRlIG1lbWJlcnNoaXAKdGVzdGluZyBhbmQgZWxpbWluYXRpbmcgZHVwbGljYXRlIGVudHJpZXMuICBTZXQgb2JqZWN0cyBhbHNvIHN1cHBvcnQKbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgbGlrZSB1bmlvbiwgaW50ZXJzZWN0aW9uLCBkaWZmZXJlbmNlLCBhbmQKc3ltbWV0cmljIGRpZmZlcmVuY2UuCgpIZXJlIGlzIGEgYnJpZWYgZGVtb25zdHJhdGlvbjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGJhc2tldCA9IFsnYXBwbGUnLCAnb3JhbmdlJywgJ2FwcGxlJywgJ3BlYXInLCAnb3JhbmdlJywgJ2JhbmFuYSddCj4+PiBmcnVpdHMgPSBzZXQoYmFza2V0KSAgICAgICAgICAgICAgICMgY3JlYXRlIGEgc2V0IHdpdGhvdXQgZHVwbGljYXRlcwo+Pj4gZnJ1aXRzCnNldChbJ29yYW5nZScsICdwZWFyJywgJ2FwcGxlJywgJ2JhbmFuYSddKQo+Pj4gJ29yYW5nZScgaW4gZnJ1aXRzICAgICAgICAgICAgICAgICAjIGZhc3QgbWVtYmVyc2hpcCB0ZXN0aW5nClRydWUKPj4+ICdjcmFiZ3Jhc3MnIGluIGZydWl0cwpGYWxzZQoKPj4+ICMgRGVtb25zdHJhdGUgc2V0IG9wZXJhdGlvbnMgb24gdW5pcXVlIGxldHRlcnMgZnJvbSB0d28gd29yZHMKLi4uCj4+PiBhID0gc2V0KCdhYnJhY2FkYWJyYScpCj4+PiBiID0gc2V0KCdhbGFjYXphbScpCj4+PiBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5pcXVlIGxldHRlcnMgaW4gYQpzZXQoWydhJywgJ3InLCAnYicsICdjJywgJ2QnXSkKPj4+IGEgLSBiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZXR0ZXJzIGluIGEgYnV0IG5vdCBpbiBiCnNldChbJ3InLCAnZCcsICdiJ10pCj4+PiBhIHwgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV0dGVycyBpbiBlaXRoZXIgYSBvciBiCnNldChbJ2EnLCAnYycsICdyJywgJ2QnLCAnYicsICdtJywgJ3onLCAnbCddKQo+Pj4gYSAmIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldHRlcnMgaW4gYm90aCBhIGFuZCBiCnNldChbJ2EnLCAnYyddKQo+Pj4gYSBeIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldHRlcnMgaW4gYSBvciBiIGJ1dCBub3QgYm90aApzZXQoWydyJywgJ2QnLCAnYicsICdtJywgJ3onLCAnbCddKQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0RpY3Rpb25hcmllcyBcbGFiZWx7ZGljdGlvbmFyaWVzfX0KCkFub3RoZXIgdXNlZnVsIGRhdGEgdHlwZSBidWlsdCBpbnRvIFB5dGhvbiBpcyB0aGUKXHVsaW5re1xlbXBoe2RpY3Rpb25hcnl9fXsuLi9saWIvdHlwZXNtYXBwaW5nLmh0bWx9LgpEaWN0aW9uYXJpZXMgYXJlIHNvbWV0aW1lcyBmb3VuZCBpbiBvdGhlciBsYW5ndWFnZXMgYXMgYGBhc3NvY2lhdGl2ZQptZW1vcmllcycnIG9yIGBgYXNzb2NpYXRpdmUgYXJyYXlzJycuICBVbmxpa2Ugc2VxdWVuY2VzLCB3aGljaCBhcmUKaW5kZXhlZCBieSBhIHJhbmdlIG9mIG51bWJlcnMsIGRpY3Rpb25hcmllcyBhcmUgaW5kZXhlZCBieSBcZW1waHtrZXlzfSwKd2hpY2ggY2FuIGJlIGFueSBpbW11dGFibGUgdHlwZTsgc3RyaW5ncyBhbmQgbnVtYmVycyBjYW4gYWx3YXlzIGJlCmtleXMuICBUdXBsZXMgY2FuIGJlIHVzZWQgYXMga2V5cyBpZiB0aGV5IGNvbnRhaW4gb25seSBzdHJpbmdzLApudW1iZXJzLCBvciB0dXBsZXM7IGlmIGEgdHVwbGUgY29udGFpbnMgYW55IG11dGFibGUgb2JqZWN0IGVpdGhlcgpkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBpdCBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleS4gIFlvdSBjYW4ndCB1c2UKbGlzdHMgYXMga2V5cywgc2luY2UgbGlzdHMgY2FuIGJlIG1vZGlmaWVkIGluIHBsYWNlIHVzaW5nIHRoZWlyClxtZXRob2R7YXBwZW5kKCl9IGFuZCBcbWV0aG9ke2V4dGVuZCgpfSBtZXRob2RzLCBhcyB3ZWxsIGFzIHNsaWNlIGFuZAppbmRleGVkIGFzc2lnbm1lbnRzLgoKSXQgaXMgYmVzdCB0byB0aGluayBvZiBhIGRpY3Rpb25hcnkgYXMgYW4gdW5vcmRlcmVkIHNldCBvZgpcZW1waHtrZXk6IHZhbHVlfSBwYWlycywgd2l0aCB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUga2V5cyBhcmUgdW5pcXVlCih3aXRoaW4gb25lIGRpY3Rpb25hcnkpLgpBIHBhaXIgb2YgYnJhY2VzIGNyZWF0ZXMgYW4gZW1wdHkgZGljdGlvbmFyeTogXGNvZGV7XHtcfX0uClBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgd2l0aGluIHRoZQpicmFjZXMgYWRkcyBpbml0aWFsIGtleTp2YWx1ZSBwYWlycyB0byB0aGUgZGljdGlvbmFyeTsgdGhpcyBpcyBhbHNvIHRoZQp3YXkgZGljdGlvbmFyaWVzIGFyZSB3cml0dGVuIG9uIG91dHB1dC4KClRoZSBtYWluIG9wZXJhdGlvbnMgb24gYSBkaWN0aW9uYXJ5IGFyZSBzdG9yaW5nIGEgdmFsdWUgd2l0aCBzb21lIGtleQphbmQgZXh0cmFjdGluZyB0aGUgdmFsdWUgZ2l2ZW4gdGhlIGtleS4gIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVsZXRlCmEga2V5OnZhbHVlIHBhaXIKd2l0aCBcY29kZXtkZWx9LgpJZiB5b3Ugc3RvcmUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IGluIHVzZSwgdGhlIG9sZCB2YWx1ZQphc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkgaXMgZm9yZ290dGVuLiAgSXQgaXMgYW4gZXJyb3IgdG8gZXh0cmFjdCBhCnZhbHVlIHVzaW5nIGEgbm9uLWV4aXN0ZW50IGtleS4KClRoZSBcbWV0aG9ke2tleXMoKX0gbWV0aG9kIG9mIGEgZGljdGlvbmFyeSBvYmplY3QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsCnRoZSBrZXlzIHVzZWQgaW4gdGhlIGRpY3Rpb25hcnksIGluIHJhbmRvbSBvcmRlciAoaWYgeW91IHdhbnQgaXQKc29ydGVkLCBqdXN0IGFwcGx5IHRoZSBcbWV0aG9ke3NvcnQoKX0gbWV0aG9kIHRvIHRoZSBsaXN0IG9mIGtleXMpLiAgVG8KY2hlY2sgd2hldGhlciBhIHNpbmdsZSBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIHVzZSB0aGUKXG1ldGhvZHtoYXNfa2V5KCl9IG1ldGhvZCBvZiB0aGUgZGljdGlvbmFyeS4KCkhlcmUgaXMgYSBzbWFsbCBleGFtcGxlIHVzaW5nIGEgZGljdGlvbmFyeToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRlbCA9IHsnamFjayc6IDQwOTgsICdzYXBlJzogNDEzOX0KPj4+IHRlbFsnZ3VpZG8nXSA9IDQxMjcKPj4+IHRlbAp7J3NhcGUnOiA0MTM5LCAnZ3VpZG8nOiA0MTI3LCAnamFjayc6IDQwOTh9Cj4+PiB0ZWxbJ2phY2snXQo0MDk4Cj4+PiBkZWwgdGVsWydzYXBlJ10KPj4+IHRlbFsnaXJ2J10gPSA0MTI3Cj4+PiB0ZWwKeydndWlkbyc6IDQxMjcsICdpcnYnOiA0MTI3LCAnamFjayc6IDQwOTh9Cj4+PiB0ZWwua2V5cygpClsnZ3VpZG8nLCAnaXJ2JywgJ2phY2snXQo+Pj4gdGVsLmhhc19rZXkoJ2d1aWRvJykKVHJ1ZQpcZW5ke3ZlcmJhdGltfQoKVGhlIFxmdW5jdGlvbntkaWN0KCl9IGNvbnN0cnVjdG9yIGJ1aWxkcyBkaWN0aW9uYXJpZXMgZGlyZWN0bHkgZnJvbQpsaXN0cyBvZiBrZXktdmFsdWUgcGFpcnMgc3RvcmVkIGFzIHR1cGxlcy4gIFdoZW4gdGhlIHBhaXJzIGZvcm0gYQpwYXR0ZXJuLCBsaXN0IGNvbXByZWhlbnNpb25zIGNhbiBjb21wYWN0bHkgc3BlY2lmeSB0aGUga2V5LXZhbHVlIGxpc3QuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkaWN0KFsoJ3NhcGUnLCA0MTM5KSwgKCdndWlkbycsIDQxMjcpLCAoJ2phY2snLCA0MDk4KV0pCnsnc2FwZSc6IDQxMzksICdqYWNrJzogNDA5OCwgJ2d1aWRvJzogNDEyN30KPj4+IGRpY3QoWyh4LCB4KioyKSBmb3IgeCBpbiB2ZWNdKSAgICAgIyB1c2UgYSBsaXN0IGNvbXByZWhlbnNpb24KezI6IDQsIDQ6IDE2LCA2OiAzNn0KXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntMb29waW5nIFRlY2huaXF1ZXMgXGxhYmVse2xvb3BpZGlvbXN9fQoKV2hlbiBsb29waW5nIHRocm91Z2ggZGljdGlvbmFyaWVzLCB0aGUga2V5IGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlIGNhbgpiZSByZXRyaWV2ZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyB0aGUgXG1ldGhvZHtpdGVyaXRlbXMoKX0gbWV0aG9kLgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4ga25pZ2h0cyA9IHsnZ2FsbGFoYWQnOiAndGhlIHB1cmUnLCAncm9iaW4nOiAndGhlIGJyYXZlJ30KPj4+IGZvciBrLCB2IGluIGtuaWdodHMuaXRlcml0ZW1zKCk6Ci4uLiAgICAgcHJpbnQgaywgdgouLi4KZ2FsbGFoYWQgdGhlIHB1cmUKcm9iaW4gdGhlIGJyYXZlClxlbmR7dmVyYmF0aW19CiAKV2hlbiBsb29waW5nIHRocm91Z2ggYSBzZXF1ZW5jZSwgdGhlIHBvc2l0aW9uIGluZGV4IGFuZCBjb3JyZXNwb25kaW5nCnZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyB0aGUKXGZ1bmN0aW9ue2VudW1lcmF0ZSgpfSBmdW5jdGlvbi4KClxiZWdpbnt2ZXJiYXRpbX0gCj4+PiBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoWyd0aWMnLCAndGFjJywgJ3RvZSddKToKLi4uICAgICBwcmludCBpLCB2Ci4uLgowIHRpYwoxIHRhYwoyIHRvZQpcZW5ke3ZlcmJhdGltfQoKVG8gbG9vcCBvdmVyIHR3byBvciBtb3JlIHNlcXVlbmNlcyBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgZW50cmllcwpjYW4gYmUgcGFpcmVkIHdpdGggdGhlIFxmdW5jdGlvbnt6aXAoKX0gZnVuY3Rpb24uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBxdWVzdGlvbnMgPSBbJ25hbWUnLCAncXVlc3QnLCAnZmF2b3JpdGUgY29sb3InXQo+Pj4gYW5zd2VycyA9IFsnbGFuY2Vsb3QnLCAndGhlIGhvbHkgZ3JhaWwnLCAnYmx1ZSddCj4+PiBmb3IgcSwgYSBpbiB6aXAocXVlc3Rpb25zLCBhbnN3ZXJzKToKLi4uICAgICBwcmludCAnV2hhdCBpcyB5b3VyICVzPyAgSXQgaXMgJXMuJyAlIChxLCBhKQouLi4JCldoYXQgaXMgeW91ciBuYW1lPyAgSXQgaXMgbGFuY2Vsb3QuCldoYXQgaXMgeW91ciBxdWVzdD8gIEl0IGlzIHRoZSBob2x5IGdyYWlsLgpXaGF0IGlzIHlvdXIgZmF2b3JpdGUgY29sb3I/ICBJdCBpcyBibHVlLgpcZW5ke3ZlcmJhdGltfQoKVG8gbG9vcCBvdmVyIGEgc2VxdWVuY2UgaW4gcmV2ZXJzZSwgZmlyc3Qgc3BlY2lmeSB0aGUgc2VxdWVuY2UKaW4gYSBmb3J3YXJkIGRpcmVjdGlvbiBhbmQgdGhlbiBjYWxsIHRoZSBcZnVuY3Rpb257cmV2ZXJzZWQoKX0KZnVuY3Rpb24uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoMSwxMCwyKSk6Ci4uLiAgICAgcHJpbnQgaQouLi4KOQo3CjUKMwoxClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257TW9yZSBvbiBDb25kaXRpb25zIFxsYWJlbHtjb25kaXRpb25zfX0KClRoZSBjb25kaXRpb25zIHVzZWQgaW4gXGNvZGV7d2hpbGV9IGFuZCBcY29kZXtpZn0gc3RhdGVtZW50cyBhYm92ZSBjYW4KY29udGFpbiBvdGhlciBvcGVyYXRvcnMgYmVzaWRlcyBjb21wYXJpc29ucy4KClRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBcY29kZXtpbn0gYW5kIFxjb2Rle25vdCBpbn0gY2hlY2sgd2hldGhlciBhIHZhbHVlCm9jY3VycyAoZG9lcyBub3Qgb2NjdXIpIGluIGEgc2VxdWVuY2UuICBUaGUgb3BlcmF0b3JzIFxjb2Rle2lzfSBhbmQKXGNvZGV7aXMgbm90fSBjb21wYXJlIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIHJlYWxseSB0aGUgc2FtZSBvYmplY3Q7IHRoaXMKb25seSBtYXR0ZXJzIGZvciBtdXRhYmxlIG9iamVjdHMgbGlrZSBsaXN0cy4gIEFsbCBjb21wYXJpc29uIG9wZXJhdG9ycwpoYXZlIHRoZSBzYW1lIHByaW9yaXR5LCB3aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYWxsIG51bWVyaWNhbApvcGVyYXRvcnMuCgpDb21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZC4gIEZvciBleGFtcGxlLCBcY29kZXthIDwgYiA9PSBjfSB0ZXN0cwp3aGV0aGVyIFxjb2Rle2F9IGlzIGxlc3MgdGhhbiBcY29kZXtifSBhbmQgbW9yZW92ZXIgXGNvZGV7Yn0gZXF1YWxzClxjb2Rle2N9LgoKQ29tcGFyaXNvbnMgbWF5IGJlIGNvbWJpbmVkIGJ5IHRoZSBCb29sZWFuIG9wZXJhdG9ycyBcY29kZXthbmR9IGFuZApcY29kZXtvcn0sIGFuZCB0aGUgb3V0Y29tZSBvZiBhIGNvbXBhcmlzb24gKG9yIG9mIGFueSBvdGhlciBCb29sZWFuCmV4cHJlc3Npb24pIG1heSBiZSBuZWdhdGVkIHdpdGggXGNvZGV7bm90fS4gIFRoZXNlIGFsbCBoYXZlIGxvd2VyCnByaW9yaXRpZXMgdGhhbiBjb21wYXJpc29uIG9wZXJhdG9ycyBhZ2FpbjsgYmV0d2VlbiB0aGVtLCBcY29kZXtub3R9IGhhcwp0aGUgaGlnaGVzdCBwcmlvcml0eSwgYW5kIFxjb2Rle29yfSB0aGUgbG93ZXN0LCBzbyB0aGF0Clxjb2Rle0EgYW5kIG5vdCBCIG9yIEN9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KEEgYW5kIChub3QgQikpIG9yIEN9LiAgT2YKY291cnNlLCBwYXJlbnRoZXNlcyBjYW4gYmUgdXNlZCB0byBleHByZXNzIHRoZSBkZXNpcmVkIGNvbXBvc2l0aW9uLgoKVGhlIEJvb2xlYW4gb3BlcmF0b3JzIFxjb2Rle2FuZH0gYW5kIFxjb2Rle29yfSBhcmUgc28tY2FsbGVkClxlbXBoe3Nob3J0LWNpcmN1aXR9IG9wZXJhdG9yczogdGhlaXIgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZnJvbQpsZWZ0IHRvIHJpZ2h0LCBhbmQgZXZhbHVhdGlvbiBzdG9wcyBhcyBzb29uIGFzIHRoZSBvdXRjb21lIGlzCmRldGVybWluZWQuICBGb3IgZXhhbXBsZSwgaWYgXGNvZGV7QX0gYW5kIFxjb2Rle0N9IGFyZSB0cnVlIGJ1dApcY29kZXtCfSBpcyBmYWxzZSwgXGNvZGV7QSBhbmQgQiBhbmQgQ30gZG9lcyBub3QgZXZhbHVhdGUgdGhlCmV4cHJlc3Npb24gXGNvZGV7Q30uICBJbiBnZW5lcmFsLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc2hvcnQtY2lyY3VpdApvcGVyYXRvciwgd2hlbiB1c2VkIGFzIGEgZ2VuZXJhbCB2YWx1ZSBhbmQgbm90IGFzIGEgQm9vbGVhbiwgaXMgdGhlCmxhc3QgZXZhbHVhdGVkIGFyZ3VtZW50LgoKSXQgaXMgcG9zc2libGUgdG8gYXNzaWduIHRoZSByZXN1bHQgb2YgYSBjb21wYXJpc29uIG9yIG90aGVyIEJvb2xlYW4KZXhwcmVzc2lvbiB0byBhIHZhcmlhYmxlLiAgRm9yIGV4YW1wbGUsCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBzdHJpbmcxLCBzdHJpbmcyLCBzdHJpbmczID0gJycsICdUcm9uZGhlaW0nLCAnSGFtbWVyIERhbmNlJwo+Pj4gbm9uX251bGwgPSBzdHJpbmcxIG9yIHN0cmluZzIgb3Igc3RyaW5nMwo+Pj4gbm9uX251bGwKJ1Ryb25kaGVpbScKXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpbiBQeXRob24sIHVubGlrZSBDLCBhc3NpZ25tZW50IGNhbm5vdCBvY2N1ciBpbnNpZGUgZXhwcmVzc2lvbnMuCkMgcHJvZ3JhbW1lcnMgbWF5IGdydW1ibGUgYWJvdXQgdGhpcywgYnV0IGl0IGF2b2lkcyBhIGNvbW1vbiBjbGFzcyBvZgpwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiBDIHByb2dyYW1zOiB0eXBpbmcgXGNvZGV7PX0gaW4gYW4gZXhwcmVzc2lvbiB3aGVuClxjb2Rlez09fSB3YXMgaW50ZW5kZWQuCgoKXHNlY3Rpb257Q29tcGFyaW5nIFNlcXVlbmNlcyBhbmQgT3RoZXIgVHlwZXMgXGxhYmVse2NvbXBhcmluZ319CgpTZXF1ZW5jZSBvYmplY3RzIG1heSBiZSBjb21wYXJlZCB0byBvdGhlciBvYmplY3RzIHdpdGggdGhlIHNhbWUKc2VxdWVuY2UgdHlwZS4gIFRoZSBjb21wYXJpc29uIHVzZXMgXGVtcGh7bGV4aWNvZ3JhcGhpY2FsfSBvcmRlcmluZzoKZmlyc3QgdGhlIGZpcnN0IHR3byBpdGVtcyBhcmUgY29tcGFyZWQsIGFuZCBpZiB0aGV5IGRpZmZlciB0aGlzCmRldGVybWluZXMgdGhlIG91dGNvbWUgb2YgdGhlIGNvbXBhcmlzb247IGlmIHRoZXkgYXJlIGVxdWFsLCB0aGUgbmV4dAp0d28gaXRlbXMgYXJlIGNvbXBhcmVkLCBhbmQgc28gb24sIHVudGlsIGVpdGhlciBzZXF1ZW5jZSBpcyBleGhhdXN0ZWQuCklmIHR3byBpdGVtcyB0byBiZSBjb21wYXJlZCBhcmUgdGhlbXNlbHZlcyBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwKdGhlIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIGlzIGNhcnJpZWQgb3V0IHJlY3Vyc2l2ZWx5LiAgSWYgYWxsCml0ZW1zIG9mIHR3byBzZXF1ZW5jZXMgY29tcGFyZSBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgY29uc2lkZXJlZAplcXVhbC4gIElmIG9uZSBzZXF1ZW5jZSBpcyBhbiBpbml0aWFsIHN1Yi1zZXF1ZW5jZSBvZiB0aGUgb3RoZXIsIHRoZQpzaG9ydGVyIHNlcXVlbmNlIGlzIHRoZSBzbWFsbGVyIChsZXNzZXIpIG9uZS4gIExleGljb2dyYXBoaWNhbApvcmRlcmluZyBmb3Igc3RyaW5ncyB1c2VzIHRoZSBcQVNDSUl7fSBvcmRlcmluZyBmb3IgaW5kaXZpZHVhbApjaGFyYWN0ZXJzLiAgU29tZSBleGFtcGxlcyBvZiBjb21wYXJpc29ucyBiZXR3ZWVuIHNlcXVlbmNlcyB3aXRoIHRoZQpzYW1lIHR5cGVzOgoKXGJlZ2lue3ZlcmJhdGltfQooMSwgMiwgMykgICAgICAgICAgICAgIDwgKDEsIDIsIDQpClsxLCAyLCAzXSAgICAgICAgICAgICAgPCBbMSwgMiwgNF0KJ0FCQycgPCAnQycgPCAnUGFzY2FsJyA8ICdQeXRob24nCigxLCAyLCAzLCA0KSAgICAgICAgICAgPCAoMSwgMiwgNCkKKDEsIDIpICAgICAgICAgICAgICAgICA8ICgxLCAyLCAtMSkKKDEsIDIsIDMpICAgICAgICAgICAgID09ICgxLjAsIDIuMCwgMy4wKQooMSwgMiwgKCdhYScsICdhYicpKSAgIDwgKDEsIDIsICgnYWJjJywgJ2EnKSwgNCkKXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBjb21wYXJpbmcgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgaXMgbGVnYWwuICBUaGUgb3V0Y29tZQppcyBkZXRlcm1pbmlzdGljIGJ1dCBhcmJpdHJhcnk6IHRoZSB0eXBlcyBhcmUgb3JkZXJlZCBieSB0aGVpciBuYW1lLgpUaHVzLCBhIGxpc3QgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBhIHN0cmluZywgYSBzdHJpbmcgaXMgYWx3YXlzCnNtYWxsZXIgdGhhbiBhIHR1cGxlLCBldGMuICBNaXhlZCBudW1lcmljIHR5cGVzIGFyZSBjb21wYXJlZCBhY2NvcmRpbmcKdG8gdGhlaXIgbnVtZXJpYyB2YWx1ZSwgc28gMCBlcXVhbHMgMC4wLCBldGMuXGZvb3Rub3RlewogICAgICAgIFRoZSBydWxlcyBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIHNob3VsZAogICAgICAgIG5vdCBiZSByZWxpZWQgdXBvbjsgdGhleSBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24gb2YKICAgICAgICB0aGUgbGFuZ3VhZ2UuCn0KCgpcY2hhcHRlcntNb2R1bGVzIFxsYWJlbHttb2R1bGVzfX0KCklmIHlvdSBxdWl0IGZyb20gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgZW50ZXIgaXQgYWdhaW4sIHRoZQpkZWZpbml0aW9ucyB5b3UgaGF2ZSBtYWRlIChmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcykgYXJlIGxvc3QuClRoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBzb21ld2hhdCBsb25nZXIgcHJvZ3JhbSwgeW91IGFyZQpiZXR0ZXIgb2ZmIHVzaW5nIGEgdGV4dCBlZGl0b3IgdG8gcHJlcGFyZSB0aGUgaW5wdXQgZm9yIHRoZSBpbnRlcnByZXRlcgphbmQgcnVubmluZyBpdCB3aXRoIHRoYXQgZmlsZSBhcyBpbnB1dCBpbnN0ZWFkLiAgVGhpcyBpcyBrbm93biBhcyBjcmVhdGluZyBhClxlbXBoe3NjcmlwdH0uICBBcyB5b3VyIHByb2dyYW0gZ2V0cyBsb25nZXIsIHlvdSBtYXkgd2FudCB0byBzcGxpdCBpdAppbnRvIHNldmVyYWwgZmlsZXMgZm9yIGVhc2llciBtYWludGVuYW5jZS4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHVzZSBhCmhhbmR5IGZ1bmN0aW9uIHRoYXQgeW91J3ZlIHdyaXR0ZW4gaW4gc2V2ZXJhbCBwcm9ncmFtcyB3aXRob3V0IGNvcHlpbmcKaXRzIGRlZmluaXRpb24gaW50byBlYWNoIHByb2dyYW0uCgpUbyBzdXBwb3J0IHRoaXMsIFB5dGhvbiBoYXMgYSB3YXkgdG8gcHV0IGRlZmluaXRpb25zIGluIGEgZmlsZSBhbmQgdXNlCnRoZW0gaW4gYSBzY3JpcHQgb3IgaW4gYW4gaW50ZXJhY3RpdmUgaW5zdGFuY2Ugb2YgdGhlIGludGVycHJldGVyLgpTdWNoIGEgZmlsZSBpcyBjYWxsZWQgYSBcZW1waHttb2R1bGV9OyBkZWZpbml0aW9ucyBmcm9tIGEgbW9kdWxlIGNhbiBiZQpcZW1waHtpbXBvcnRlZH0gaW50byBvdGhlciBtb2R1bGVzIG9yIGludG8gdGhlIFxlbXBoe21haW59IG1vZHVsZSAodGhlCmNvbGxlY3Rpb24gb2YgdmFyaWFibGVzIHRoYXQgeW91IGhhdmUgYWNjZXNzIHRvIGluIGEgc2NyaXB0CmV4ZWN1dGVkIGF0IHRoZSB0b3AgbGV2ZWwKYW5kIGluIGNhbGN1bGF0b3IgbW9kZSkuCgpBIG1vZHVsZSBpcyBhIGZpbGUgY29udGFpbmluZyBQeXRob24gZGVmaW5pdGlvbnMgYW5kIHN0YXRlbWVudHMuICBUaGUKZmlsZSBuYW1lIGlzIHRoZSBtb2R1bGUgbmFtZSB3aXRoIHRoZSBzdWZmaXggXGZpbGV7LnB5fSBhcHBlbmRlZC4gIFdpdGhpbgphIG1vZHVsZSwgdGhlIG1vZHVsZSdzIG5hbWUgKGFzIGEgc3RyaW5nKSBpcyBhdmFpbGFibGUgYXMgdGhlIHZhbHVlIG9mCnRoZSBnbG9iYWwgdmFyaWFibGUgXGNvZGV7X19uYW1lX199LiAgRm9yIGluc3RhbmNlLCB1c2UgeW91ciBmYXZvcml0ZSB0ZXh0CmVkaXRvciB0byBjcmVhdGUgYSBmaWxlIGNhbGxlZCBcZmlsZXtmaWJvLnB5fSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgoKXGJlZ2lue3ZlcmJhdGltfQojIEZpYm9uYWNjaSBudW1iZXJzIG1vZHVsZQoKZGVmIGZpYihuKTogICAgIyB3cml0ZSBGaWJvbmFjY2kgc2VyaWVzIHVwIHRvIG4KICAgIGEsIGIgPSAwLCAxCiAgICB3aGlsZSBiIDwgbjoKICAgICAgICBwcmludCBiLAogICAgICAgIGEsIGIgPSBiLCBhK2IKCmRlZiBmaWIyKG4pOiAjIHJldHVybiBGaWJvbmFjY2kgc2VyaWVzIHVwIHRvIG4KICAgIHJlc3VsdCA9IFtdCiAgICBhLCBiID0gMCwgMQogICAgd2hpbGUgYiA8IG46CiAgICAgICAgcmVzdWx0LmFwcGVuZChiKQogICAgICAgIGEsIGIgPSBiLCBhK2IKICAgIHJldHVybiByZXN1bHQKXGVuZHt2ZXJiYXRpbX0KCk5vdyBlbnRlciB0aGUgUHl0aG9uIGludGVycHJldGVyIGFuZCBpbXBvcnQgdGhpcyBtb2R1bGUgd2l0aCB0aGUKZm9sbG93aW5nIGNvbW1hbmQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgZmlibwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBkb2VzIG5vdCBlbnRlciB0aGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIFxjb2Rle2ZpYm99IApkaXJlY3RseSBpbiB0aGUgY3VycmVudCBzeW1ib2wgdGFibGU7IGl0IG9ubHkgZW50ZXJzIHRoZSBtb2R1bGUgbmFtZQpcY29kZXtmaWJvfSB0aGVyZS4KVXNpbmcgdGhlIG1vZHVsZSBuYW1lIHlvdSBjYW4gYWNjZXNzIHRoZSBmdW5jdGlvbnM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmaWJvLmZpYigxMDAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NyA2MTAgOTg3Cj4+PiBmaWJvLmZpYjIoMTAwKQpbMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5XQo+Pj4gZmliby5fX25hbWVfXwonZmlibycKXGVuZHt2ZXJiYXRpbX0KCklmIHlvdSBpbnRlbmQgdG8gdXNlIGEgZnVuY3Rpb24gb2Z0ZW4geW91IGNhbiBhc3NpZ24gaXQgdG8gYSBsb2NhbCBuYW1lOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZmliID0gZmliby5maWIKPj4+IGZpYig1MDApCjEgMSAyIDMgNSA4IDEzIDIxIDM0IDU1IDg5IDE0NCAyMzMgMzc3ClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257TW9yZSBvbiBNb2R1bGVzIFxsYWJlbHttb3JlTW9kdWxlc319CgpBIG1vZHVsZSBjYW4gY29udGFpbiBleGVjdXRhYmxlIHN0YXRlbWVudHMgYXMgd2VsbCBhcyBmdW5jdGlvbgpkZWZpbml0aW9ucy4KVGhlc2Ugc3RhdGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlLgpUaGV5IGFyZSBleGVjdXRlZCBvbmx5IHRoZQpcZW1waHtmaXJzdH0gdGltZSB0aGUgbW9kdWxlIGlzIGltcG9ydGVkIHNvbWV3aGVyZS5cZm9vdG5vdGV7CiAgICAgICAgSW4gZmFjdCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhcmUgYWxzbyBgc3RhdGVtZW50cycgdGhhdCBhcmUKICAgICAgICBgZXhlY3V0ZWQnOyB0aGUgZXhlY3V0aW9uIGVudGVycyB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUKICAgICAgICBtb2R1bGUncyBnbG9iYWwgc3ltYm9sIHRhYmxlLgp9CgpFYWNoIG1vZHVsZSBoYXMgaXRzIG93biBwcml2YXRlIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgdXNlZCBhcyB0aGUKZ2xvYmFsIHN5bWJvbCB0YWJsZSBieSBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZS4KVGh1cywgdGhlIGF1dGhvciBvZiBhIG1vZHVsZSBjYW4gdXNlIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIG1vZHVsZQp3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGFjY2lkZW50YWwgY2xhc2hlcyB3aXRoIGEgdXNlcidzIGdsb2JhbAp2YXJpYWJsZXMuCk9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgeW91IGNhbiB0b3VjaCBhCm1vZHVsZSdzIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZSBub3RhdGlvbiB1c2VkIHRvIHJlZmVyIHRvIGl0cwpmdW5jdGlvbnMsClxjb2Rle21vZG5hbWUuaXRlbW5hbWV9LgoKTW9kdWxlcyBjYW4gaW1wb3J0IG90aGVyIG1vZHVsZXMuICBJdCBpcyBjdXN0b21hcnkgYnV0IG5vdCByZXF1aXJlZCB0bwpwbGFjZSBhbGwgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBtb2R1bGUgKG9yCnNjcmlwdCwgZm9yIHRoYXQgbWF0dGVyKS4gIFRoZSBpbXBvcnRlZCBtb2R1bGUgbmFtZXMgYXJlIHBsYWNlZCBpbiB0aGUKaW1wb3J0aW5nIG1vZHVsZSdzIGdsb2JhbCBzeW1ib2wgdGFibGUuCgpUaGVyZSBpcyBhIHZhcmlhbnQgb2YgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50IHRoYXQgaW1wb3J0cwpuYW1lcyBmcm9tIGEgbW9kdWxlIGRpcmVjdGx5IGludG8gdGhlIGltcG9ydGluZyBtb2R1bGUncyBzeW1ib2wKdGFibGUuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyb20gZmlibyBpbXBvcnQgZmliLCBmaWIyCj4+PiBmaWIoNTAwKQoxIDEgMiAzIDUgOCAxMyAyMSAzNCA1NSA4OSAxNDQgMjMzIDM3NwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBkb2VzIG5vdCBpbnRyb2R1Y2UgdGhlIG1vZHVsZSBuYW1lIGZyb20gd2hpY2ggdGhlIGltcG9ydHMgYXJlIHRha2VuCmluIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUgKHNvIGluIHRoZSBleGFtcGxlLCBcY29kZXtmaWJvfSBpcyBub3QKZGVmaW5lZCkuCgpUaGVyZSBpcyBldmVuIGEgdmFyaWFudCB0byBpbXBvcnQgYWxsIG5hbWVzIHRoYXQgYSBtb2R1bGUgZGVmaW5lczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGZyb20gZmlibyBpbXBvcnQgKgo+Pj4gZmliKDUwMCkKMSAxIDIgMyA1IDggMTMgMjEgMzQgNTUgODkgMTQ0IDIzMyAzNzcKXGVuZHt2ZXJiYXRpbX0KClRoaXMgaW1wb3J0cyBhbGwgbmFtZXMgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUKKFxjb2Rle199KS4KCgpcc3Vic2VjdGlvbntUaGUgTW9kdWxlIFNlYXJjaCBQYXRoIFxsYWJlbHtzZWFyY2hQYXRofX0KClxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0KV2hlbiBhIG1vZHVsZSBuYW1lZCBcbW9kdWxle3NwYW19IGlzIGltcG9ydGVkLCB0aGUgaW50ZXJwcmV0ZXIgc2VhcmNoZXMKZm9yIGEgZmlsZSBuYW1lZCBcZmlsZXtzcGFtLnB5fSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksCmFuZCB0aGVuIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieQp0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgXGVudnZhcntQWVRIT05QQVRIfS4gIFRoaXMgaGFzIHRoZSBzYW1lIHN5bnRheCBhcwp0aGUgc2hlbGwgdmFyaWFibGUgXGVudnZhcntQQVRIfSwgdGhhdCBpcywgYSBsaXN0IG9mCmRpcmVjdG9yeSBuYW1lcy4gIFdoZW4gXGVudnZhcntQWVRIT05QQVRIfSBpcyBub3Qgc2V0LCBvciB3aGVuIHRoZSBmaWxlCmlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgaW4gYW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudApkZWZhdWx0IHBhdGg7IG9uIFxVTklYLCB0aGlzIGlzIHVzdWFsbHkgXGZpbGV7LjovdXNyL2xvY2FsL2xpYi9weXRob259LgoKQWN0dWFsbHksIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGdpdmVuIGJ5IHRoZSAKdmFyaWFibGUgXGNvZGV7c3lzLnBhdGh9IHdoaWNoIGlzIGluaXRpYWxpemVkIGZyb20gdGhlIGRpcmVjdG9yeSAKY29udGFpbmluZyB0aGUgaW5wdXQgc2NyaXB0IChvciB0aGUgY3VycmVudCBkaXJlY3RvcnkpLApcZW52dmFye1BZVEhPTlBBVEh9IGFuZCB0aGUgaW5zdGFsbGF0aW9uLWRlcGVuZGVudCBkZWZhdWx0LiAgVGhpcyBhbGxvd3MKUHl0aG9uIHByb2dyYW1zIHRoYXQga25vdyB3aGF0IHRoZXkncmUgZG9pbmcgdG8gbW9kaWZ5IG9yIHJlcGxhY2UgdGhlIAptb2R1bGUgc2VhcmNoIHBhdGguICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCnNjcmlwdCBiZWluZyBydW4gaXMgb24gdGhlIHNlYXJjaCBwYXRoLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUKc2NyaXB0IG5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBzdGFuZGFyZCBtb2R1bGUsIG9yIFB5dGhvbiB3aWxsCmF0dGVtcHQgdG8gbG9hZCB0aGUgc2NyaXB0IGFzIGEgbW9kdWxlIHdoZW4gdGhhdCBtb2R1bGUgaXMgaW1wb3J0ZWQuClRoaXMgd2lsbCBnZW5lcmFsbHkgYmUgYW4gZXJyb3IuICBTZWUgc2VjdGlvbn5ccmVme3N0YW5kYXJkTW9kdWxlc30sCmBgU3RhbmRhcmQgTW9kdWxlcywnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCgpcc3Vic2VjdGlvbntgYENvbXBpbGVkJycgUHl0aG9uIGZpbGVzfQoKQXMgYW4gaW1wb3J0YW50IHNwZWVkLXVwIG9mIHRoZSBzdGFydC11cCB0aW1lIGZvciBzaG9ydCBwcm9ncmFtcyB0aGF0CnVzZSBhIGxvdCBvZiBzdGFuZGFyZCBtb2R1bGVzLCBpZiBhIGZpbGUgY2FsbGVkIFxmaWxle3NwYW0ucHljfSBleGlzdHMKaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSBcZmlsZXtzcGFtLnB5fSBpcyBmb3VuZCwgdGhpcyBpcyBhc3N1bWVkIHRvCmNvbnRhaW4gYW4gYWxyZWFkeS1gYGJ5dGUtY29tcGlsZWQnJyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgXG1vZHVsZXtzcGFtfS4KVGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSB2ZXJzaW9uIG9mIFxmaWxle3NwYW0ucHl9IHVzZWQgdG8gY3JlYXRlClxmaWxle3NwYW0ucHljfSBpcyByZWNvcmRlZCBpbiBcZmlsZXtzcGFtLnB5Y30sIGFuZCB0aGUKXGZpbGV7LnB5Y30gZmlsZSBpcyBpZ25vcmVkIGlmIHRoZXNlIGRvbid0IG1hdGNoLgoKTm9ybWFsbHksIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHRvIGNyZWF0ZSB0aGUKXGZpbGV7c3BhbS5weWN9IGZpbGUuICBXaGVuZXZlciBcZmlsZXtzcGFtLnB5fSBpcyBzdWNjZXNzZnVsbHkKY29tcGlsZWQsIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB3cml0ZSB0aGUgY29tcGlsZWQgdmVyc2lvbiB0bwpcZmlsZXtzcGFtLnB5Y30uICBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhpcyBhdHRlbXB0IGZhaWxzOyBpZiBmb3IgYW55CnJlYXNvbiB0aGUgZmlsZSBpcyBub3Qgd3JpdHRlbiBjb21wbGV0ZWx5LCB0aGUgcmVzdWx0aW5nClxmaWxle3NwYW0ucHljfSBmaWxlIHdpbGwgYmUgcmVjb2duaXplZCBhcyBpbnZhbGlkIGFuZCB0aHVzIGlnbm9yZWQKbGF0ZXIuICBUaGUgY29udGVudHMgb2YgdGhlIFxmaWxle3NwYW0ucHljfSBmaWxlIGFyZSBwbGF0Zm9ybQppbmRlcGVuZGVudCwgc28gYSBQeXRob24gbW9kdWxlIGRpcmVjdG9yeSBjYW4gYmUgc2hhcmVkIGJ5IG1hY2hpbmVzIG9mCmRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgoKU29tZSB0aXBzIGZvciBleHBlcnRzOgoKXGJlZ2lue2l0ZW1pemV9CgpcaXRlbQpXaGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBccHJvZ3JhbW9wdHstT30gZmxhZywKb3B0aW1pemVkIGNvZGUgaXMgZ2VuZXJhdGVkIGFuZCBzdG9yZWQgaW4gXGZpbGV7LnB5b30gZmlsZXMuICBUaGUKb3B0aW1pemVyIGN1cnJlbnRseSBkb2Vzbid0IGhlbHAgbXVjaDsgaXQgb25seSByZW1vdmVzClxrZXl3b3Jke2Fzc2VydH0gc3RhdGVtZW50cy4gIFdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQsIFxlbXBoe2FsbH0KYnl0ZWNvZGUgaXMgb3B0aW1pemVkOyBcY29kZXsucHljfSBmaWxlcyBhcmUgaWdub3JlZCBhbmQgXGNvZGV7LnB5fQpmaWxlcyBhcmUgY29tcGlsZWQgdG8gb3B0aW1pemVkIGJ5dGVjb2RlLgoKXGl0ZW0KUGFzc2luZyB0d28gXHByb2dyYW1vcHR7LU99IGZsYWdzIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKFxwcm9ncmFtb3B0ey1PT30pIHdpbGwgY2F1c2UgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIHRvIHBlcmZvcm0Kb3B0aW1pemF0aW9ucyB0aGF0IGNvdWxkIGluIHNvbWUgcmFyZSBjYXNlcyByZXN1bHQgaW4gbWFsZnVuY3Rpb25pbmcKcHJvZ3JhbXMuICBDdXJyZW50bHkgb25seSBcY29kZXtfX2RvY19ffSBzdHJpbmdzIGFyZSByZW1vdmVkIGZyb20gdGhlCmJ5dGVjb2RlLCByZXN1bHRpbmcgaW4gbW9yZSBjb21wYWN0IFxmaWxley5weW99IGZpbGVzLiAgU2luY2Ugc29tZQpwcm9ncmFtcyBtYXkgcmVseSBvbiBoYXZpbmcgdGhlc2UgYXZhaWxhYmxlLCB5b3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMKb3B0aW9uIGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKXGl0ZW0KQSBwcm9ncmFtIGRvZXNuJ3QgcnVuIGFueSBmYXN0ZXIgd2hlbiBpdCBpcyByZWFkIGZyb20gYSBcZmlsZXsucHljfSBvcgpcZmlsZXsucHlvfSBmaWxlIHRoYW4gd2hlbiBpdCBpcyByZWFkIGZyb20gYSBcZmlsZXsucHl9IGZpbGU7IHRoZSBvbmx5CnRoaW5nIHRoYXQncyBmYXN0ZXIgYWJvdXQgXGZpbGV7LnB5Y30gb3IgXGZpbGV7LnB5b30gZmlsZXMgaXMgdGhlCnNwZWVkIHdpdGggd2hpY2ggdGhleSBhcmUgbG9hZGVkLgoKXGl0ZW0KV2hlbiBhIHNjcmlwdCBpcyBydW4gYnkgZ2l2aW5nIGl0cyBuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZQpieXRlY29kZSBmb3IgdGhlIHNjcmlwdCBpcyBuZXZlciB3cml0dGVuIHRvIGEgXGZpbGV7LnB5Y30gb3IKXGZpbGV7LnB5b30gZmlsZS4gIFRodXMsIHRoZSBzdGFydHVwIHRpbWUgb2YgYSBzY3JpcHQgbWF5IGJlIHJlZHVjZWQKYnkgbW92aW5nIG1vc3Qgb2YgaXRzIGNvZGUgdG8gYSBtb2R1bGUgYW5kIGhhdmluZyBhIHNtYWxsIGJvb3RzdHJhcApzY3JpcHQgdGhhdCBpbXBvcnRzIHRoYXQgbW9kdWxlLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBuYW1lIGEKXGZpbGV7LnB5Y30gb3IgXGZpbGV7LnB5b30gZmlsZSBkaXJlY3RseSBvbiB0aGUgY29tbWFuZCBsaW5lLgoKXGl0ZW0KSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIGZpbGUgY2FsbGVkIFxmaWxle3NwYW0ucHljfSAob3IKXGZpbGV7c3BhbS5weW99IHdoZW4gXHByb2dyYW1vcHR7LU99IGlzIHVzZWQpIHdpdGhvdXQgYSBmaWxlClxmaWxle3NwYW0ucHl9IGZvciB0aGUgc2FtZSBtb2R1bGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc3RyaWJ1dGUgYQpsaWJyYXJ5IG9mIFB5dGhvbiBjb2RlIGluIGEgZm9ybSB0aGF0IGlzIG1vZGVyYXRlbHkgaGFyZCB0byByZXZlcnNlCmVuZ2luZWVyLgoKXGl0ZW0KVGhlIG1vZHVsZSBcdWxpbmt7XG1vZHVsZXtjb21waWxlYWxsfX17Li4vbGliL21vZHVsZS1jb21waWxlYWxsLmh0bWx9JQp7fSBccmVmc3Rtb2RpbmRleHtjb21waWxlYWxsfSBjYW4gY3JlYXRlIFxmaWxley5weWN9IGZpbGVzIChvcgpcZmlsZXsucHlvfSBmaWxlcyB3aGVuIFxwcm9ncmFtb3B0ey1PfSBpcyB1c2VkKSBmb3IgYWxsIG1vZHVsZXMgaW4gYQpkaXJlY3RvcnkuCgpcZW5ke2l0ZW1pemV9CgoKXHNlY3Rpb257U3RhbmRhcmQgTW9kdWxlcyBcbGFiZWx7c3RhbmRhcmRNb2R1bGVzfX0KClB5dGhvbiBjb21lcyB3aXRoIGEgbGlicmFyeSBvZiBzdGFuZGFyZCBtb2R1bGVzLCBkZXNjcmliZWQgaW4gYSBzZXBhcmF0ZQpkb2N1bWVudCwgdGhlIFxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9CihgYExpYnJhcnkgUmVmZXJlbmNlJycgaGVyZWFmdGVyKS4gIFNvbWUgbW9kdWxlcyBhcmUgYnVpbHQgaW50byB0aGUKaW50ZXJwcmV0ZXI7IHRoZXNlIHByb3ZpZGUgYWNjZXNzIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YKdGhlIGNvcmUgb2YgdGhlIGxhbmd1YWdlIGJ1dCBhcmUgbmV2ZXJ0aGVsZXNzIGJ1aWx0IGluLCBlaXRoZXIgZm9yCmVmZmljaWVuY3kgb3IgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gb3BlcmF0aW5nIHN5c3RlbSBwcmltaXRpdmVzIHN1Y2ggYXMKc3lzdGVtIGNhbGxzLiAgVGhlIHNldCBvZiBzdWNoIG1vZHVsZXMgaXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aGljaAphbHNvIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0gIEZvciBleGFtcGxlLAp0aGUgXG1vZHVsZXthbW9lYmF9IG1vZHVsZSBpcyBvbmx5IHByb3ZpZGVkIG9uIHN5c3RlbXMgdGhhdCBzb21laG93CnN1cHBvcnQgQW1vZWJhIHByaW1pdGl2ZXMuICBPbmUgcGFydGljdWxhciBtb2R1bGUgZGVzZXJ2ZXMgc29tZQphdHRlbnRpb246IFx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9JQpccmVmc3Rtb2RpbmRleHtzeXN9LCB3aGljaCBpcyBidWlsdCBpbnRvIGV2ZXJ5IApQeXRob24gaW50ZXJwcmV0ZXIuICBUaGUgdmFyaWFibGVzIFxjb2Rle3N5cy5wczF9IGFuZApcY29kZXtzeXMucHMyfSBkZWZpbmUgdGhlIHN0cmluZ3MgdXNlZCBhcyBwcmltYXJ5IGFuZCBzZWNvbmRhcnkKcHJvbXB0czoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBzeXMKPj4+IHN5cy5wczEKJz4+PiAnCj4+PiBzeXMucHMyCicuLi4gJwo+Pj4gc3lzLnBzMSA9ICdDPiAnCkM+IHByaW50ICdZdWNrIScKWXVjayEKQz4KClxlbmR7dmVyYmF0aW19CgpUaGVzZSB0d28gdmFyaWFibGVzIGFyZSBvbmx5IGRlZmluZWQgaWYgdGhlIGludGVycHJldGVyIGlzIGluCmludGVyYWN0aXZlIG1vZGUuCgpUaGUgdmFyaWFibGUgXGNvZGV7c3lzLnBhdGh9IGlzIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZQppbnRlcnByZXRlcidzIHNlYXJjaCBwYXRoIGZvciBtb2R1bGVzLiBJdCBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQKcGF0aCB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcZW52dmFye1BZVEhPTlBBVEh9LCBvciBmcm9tCmEgYnVpbHQtaW4gZGVmYXVsdCBpZiBcZW52dmFye1BZVEhPTlBBVEh9IGlzIG5vdCBzZXQuICBZb3UgY2FuIG1vZGlmeQppdCB1c2luZyBzdGFuZGFyZCBsaXN0IG9wZXJhdGlvbnM6IAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IHN5cwo+Pj4gc3lzLnBhdGguYXBwZW5kKCcvdWZzL2d1aWRvL2xpYi9weXRob24nKQpcZW5ke3ZlcmJhdGltfQoKXHNlY3Rpb257VGhlIFxmdW5jdGlvbntkaXIoKX0gRnVuY3Rpb24gXGxhYmVse2Rpcn19CgpUaGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue2RpcigpfSBpcyB1c2VkIHRvIGZpbmQgb3V0IHdoaWNoIG5hbWVzCmEgbW9kdWxlIGRlZmluZXMuICBJdCByZXR1cm5zIGEgc29ydGVkIGxpc3Qgb2Ygc3RyaW5nczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBmaWJvLCBzeXMKPj4+IGRpcihmaWJvKQpbJ19fbmFtZV9fJywgJ2ZpYicsICdmaWIyJ10KPj4+IGRpcihzeXMpClsnX19kaXNwbGF5aG9va19fJywgJ19fZG9jX18nLCAnX19leGNlcHRob29rX18nLCAnX19uYW1lX18nLCAnX19zdGRlcnJfXycsCiAnX19zdGRpbl9fJywgJ19fc3Rkb3V0X18nLCAnX2dldGZyYW1lJywgJ2FwaV92ZXJzaW9uJywgJ2FyZ3YnLCAKICdidWlsdGluX21vZHVsZV9uYW1lcycsICdieXRlb3JkZXInLCAnY2FsbHN0YXRzJywgJ2NvcHlyaWdodCcsCiAnZGlzcGxheWhvb2snLCAnZXhjX2NsZWFyJywgJ2V4Y19pbmZvJywgJ2V4Y190eXBlJywgJ2V4Y2VwdGhvb2snLAogJ2V4ZWNfcHJlZml4JywgJ2V4ZWN1dGFibGUnLCAnZXhpdCcsICdnZXRkZWZhdWx0ZW5jb2RpbmcnLCAnZ2V0ZGxvcGVuZmxhZ3MnLAogJ2dldHJlY3Vyc2lvbmxpbWl0JywgJ2dldHJlZmNvdW50JywgJ2hleHZlcnNpb24nLCAnbWF4aW50JywgJ21heHVuaWNvZGUnLAogJ21ldGFfcGF0aCcsICdtb2R1bGVzJywgJ3BhdGgnLCAncGF0aF9ob29rcycsICdwYXRoX2ltcG9ydGVyX2NhY2hlJywKICdwbGF0Zm9ybScsICdwcmVmaXgnLCAncHMxJywgJ3BzMicsICdzZXRjaGVja2ludGVydmFsJywgJ3NldGRsb3BlbmZsYWdzJywKICdzZXRwcm9maWxlJywgJ3NldHJlY3Vyc2lvbmxpbWl0JywgJ3NldHRyYWNlJywgJ3N0ZGVycicsICdzdGRpbicsICdzdGRvdXQnLAogJ3ZlcnNpb24nLCAndmVyc2lvbl9pbmZvJywgJ3dhcm5vcHRpb25zJ10KXGVuZHt2ZXJiYXRpbX0KCldpdGhvdXQgYXJndW1lbnRzLCBcZnVuY3Rpb257ZGlyKCl9IGxpc3RzIHRoZSBuYW1lcyB5b3UgaGF2ZSBkZWZpbmVkCmN1cnJlbnRseToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGEgPSBbMSwgMiwgMywgNCwgNV0KPj4+IGltcG9ydCBmaWJvLCBzeXMKPj4+IGZpYiA9IGZpYm8uZmliCj4+PiBkaXIoKQpbJ19fbmFtZV9fJywgJ2EnLCAnZmliJywgJ2ZpYm8nLCAnc3lzJ10KXGVuZHt2ZXJiYXRpbX0KCk5vdGUgdGhhdCBpdCBsaXN0cyBhbGwgdHlwZXMgb2YgbmFtZXM6IHZhcmlhYmxlcywgbW9kdWxlcywgZnVuY3Rpb25zLCBldGMuCgpcZnVuY3Rpb257ZGlyKCl9IGRvZXMgbm90IGxpc3QgdGhlIG5hbWVzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQKdmFyaWFibGVzLiAgSWYgeW91IHdhbnQgYSBsaXN0IG9mIHRob3NlLCB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZQpzdGFuZGFyZCBtb2R1bGUgXG1vZHVsZXtfX2J1aWx0aW5fX31ccmVmYmltb2RpbmRleHtfX2J1aWx0aW5fX306CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgX19idWlsdGluX18KPj4+IGRpcihfX2J1aWx0aW5fXykKWydBcml0aG1ldGljRXJyb3InLCAnQXNzZXJ0aW9uRXJyb3InLCAnQXR0cmlidXRlRXJyb3InLAogJ0RlcHJlY2F0aW9uV2FybmluZycsICdFT0ZFcnJvcicsICdFbGxpcHNpcycsICdFbnZpcm9ubWVudEVycm9yJywKICdFeGNlcHRpb24nLCAnRmFsc2UnLCAnRmxvYXRpbmdQb2ludEVycm9yJywgJ0lPRXJyb3InLCAnSW1wb3J0RXJyb3InLAogJ0luZGVudGF0aW9uRXJyb3InLCAnSW5kZXhFcnJvcicsICdLZXlFcnJvcicsICdLZXlib2FyZEludGVycnVwdCcsCiAnTG9va3VwRXJyb3InLCAnTWVtb3J5RXJyb3InLCAnTmFtZUVycm9yJywgJ05vbmUnLCAnTm90SW1wbGVtZW50ZWQnLAogJ05vdEltcGxlbWVudGVkRXJyb3InLCAnT1NFcnJvcicsICdPdmVyZmxvd0Vycm9yJywgJ092ZXJmbG93V2FybmluZycsCiAnUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZycsICdSZWZlcmVuY2VFcnJvcicsCiAnUnVudGltZUVycm9yJywgJ1J1bnRpbWVXYXJuaW5nJywgJ1N0YW5kYXJkRXJyb3InLCAnU3RvcEl0ZXJhdGlvbicsCiAnU3ludGF4RXJyb3InLCAnU3ludGF4V2FybmluZycsICdTeXN0ZW1FcnJvcicsICdTeXN0ZW1FeGl0JywgJ1RhYkVycm9yJywKICdUcnVlJywgJ1R5cGVFcnJvcicsICdVbmJvdW5kTG9jYWxFcnJvcicsICdVbmljb2RlRXJyb3InLCAnVXNlcldhcm5pbmcnLAogJ1ZhbHVlRXJyb3InLCAnV2FybmluZycsICdaZXJvRGl2aXNpb25FcnJvcicsICdfX2RlYnVnX18nLCAnX19kb2NfXycsCiAnX19pbXBvcnRfXycsICdfX25hbWVfXycsICdhYnMnLCAnYXBwbHknLCAnYm9vbCcsICdidWZmZXInLAogJ2NhbGxhYmxlJywgJ2NocicsICdjbGFzc21ldGhvZCcsICdjbXAnLCAnY29lcmNlJywgJ2NvbXBpbGUnLCAnY29tcGxleCcsCiAnY29weXJpZ2h0JywgJ2NyZWRpdHMnLCAnZGVsYXR0cicsICdkaWN0JywgJ2RpcicsICdkaXZtb2QnLAogJ2VudW1lcmF0ZScsICdldmFsJywgJ2V4ZWNmaWxlJywgJ2V4aXQnLCAnZmlsZScsICdmaWx0ZXInLCAnZmxvYXQnLAogJ2dldGF0dHInLCAnZ2xvYmFscycsICdoYXNhdHRyJywgJ2hhc2gnLCAnaGVscCcsICdoZXgnLCAnaWQnLAogJ2lucHV0JywgJ2ludCcsICdpbnRlcm4nLCAnaXNpbnN0YW5jZScsICdpc3N1YmNsYXNzJywgJ2l0ZXInLAogJ2xlbicsICdsaWNlbnNlJywgJ2xpc3QnLCAnbG9jYWxzJywgJ2xvbmcnLCAnbWFwJywgJ21heCcsICdtaW4nLAogJ29iamVjdCcsICdvY3QnLCAnb3BlbicsICdvcmQnLCAncG93JywgJ3Byb3BlcnR5JywgJ3F1aXQnLAogJ3JhbmdlJywgJ3Jhd19pbnB1dCcsICdyZWR1Y2UnLCAncmVsb2FkJywgJ3JlcHInLCAncm91bmQnLAogJ3NldGF0dHInLCAnc2xpY2UnLCAnc3RhdGljbWV0aG9kJywgJ3N0cicsICdzdHJpbmcnLCAnc3VtJywgJ3N1cGVyJywKICd0dXBsZScsICd0eXBlJywgJ3VuaWNocicsICd1bmljb2RlJywgJ3ZhcnMnLCAneHJhbmdlJywgJ3ppcCddClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257UGFja2FnZXMgXGxhYmVse3BhY2thZ2VzfX0KClBhY2thZ2VzIGFyZSBhIHdheSBvZiBzdHJ1Y3R1cmluZyBQeXRob24ncyBtb2R1bGUgbmFtZXNwYWNlCmJ5IHVzaW5nIGBgZG90dGVkIG1vZHVsZSBuYW1lcycnLiAgRm9yIGV4YW1wbGUsIHRoZSBtb2R1bGUgbmFtZQpcbW9kdWxle0EuQn0gZGVzaWduYXRlcyBhIHN1Ym1vZHVsZSBuYW1lZCBcc2FtcHtCfSBpbiBhIHBhY2thZ2UgbmFtZWQKXHNhbXB7QX0uICBKdXN0IGxpa2UgdGhlIHVzZSBvZiBtb2R1bGVzIHNhdmVzIHRoZSBhdXRob3JzIG9mIGRpZmZlcmVudAptb2R1bGVzIGZyb20gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGVhY2ggb3RoZXIncyBnbG9iYWwgdmFyaWFibGUgbmFtZXMsCnRoZSB1c2Ugb2YgZG90dGVkIG1vZHVsZSBuYW1lcyBzYXZlcyB0aGUgYXV0aG9ycyBvZiBtdWx0aS1tb2R1bGUKcGFja2FnZXMgbGlrZSBOdW1QeSBvciB0aGUgUHl0aG9uIEltYWdpbmcgTGlicmFyeSBmcm9tIGhhdmluZyB0byB3b3JyeQphYm91dCBlYWNoIG90aGVyJ3MgbW9kdWxlIG5hbWVzLgoKU3VwcG9zZSB5b3Ugd2FudCB0byBkZXNpZ24gYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgKGEgYGBwYWNrYWdlJycpIGZvcgp0aGUgdW5pZm9ybSBoYW5kbGluZyBvZiBzb3VuZCBmaWxlcyBhbmQgc291bmQgZGF0YS4gIFRoZXJlIGFyZSBtYW55CmRpZmZlcmVudCBzb3VuZCBmaWxlIGZvcm1hdHMgKHVzdWFsbHkgcmVjb2duaXplZCBieSB0aGVpciBleHRlbnNpb24sCmZvciBleGFtcGxlOiBcZmlsZXsud2F2fSwgXGZpbGV7LmFpZmZ9LCBcZmlsZXsuYXV9KSwgc28geW91IG1heSBuZWVkCnRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gYSBncm93aW5nIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IgdGhlCmNvbnZlcnNpb24gYmV0d2VlbiB0aGUgdmFyaW91cyBmaWxlIGZvcm1hdHMuICBUaGVyZSBhcmUgYWxzbyBtYW55CmRpZmZlcmVudCBvcGVyYXRpb25zIHlvdSBtaWdodCB3YW50IHRvIHBlcmZvcm0gb24gc291bmQgZGF0YSAoc3VjaCBhcwptaXhpbmcsIGFkZGluZyBlY2hvLCBhcHBseWluZyBhbiBlcXVhbGl6ZXIgZnVuY3Rpb24sIGNyZWF0aW5nIGFuCmFydGlmaWNpYWwgc3RlcmVvIGVmZmVjdCksIHNvIGluIGFkZGl0aW9uIHlvdSB3aWxsIGJlIHdyaXRpbmcgYQpuZXZlci1lbmRpbmcgc3RyZWFtIG9mIG1vZHVsZXMgdG8gcGVyZm9ybSB0aGVzZSBvcGVyYXRpb25zLiAgSGVyZSdzIGEKcG9zc2libGUgc3RydWN0dXJlIGZvciB5b3VyIHBhY2thZ2UgKGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhCmhpZXJhcmNoaWNhbCBmaWxlc3lzdGVtKToKClxiZWdpbnt2ZXJiYXRpbX0KU291bmQvICAgICAgICAgICAgICAgICAgICAgICAgICBUb3AtbGV2ZWwgcGFja2FnZQogICAgICBfX2luaXRfXy5weSAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIHNvdW5kIHBhY2thZ2UKICAgICAgRm9ybWF0cy8gICAgICAgICAgICAgICAgICBTdWJwYWNrYWdlIGZvciBmaWxlIGZvcm1hdCBjb252ZXJzaW9ucwogICAgICAgICAgICAgIF9faW5pdF9fLnB5CiAgICAgICAgICAgICAgd2F2cmVhZC5weQogICAgICAgICAgICAgIHdhdndyaXRlLnB5CiAgICAgICAgICAgICAgYWlmZnJlYWQucHkKICAgICAgICAgICAgICBhaWZmd3JpdGUucHkKICAgICAgICAgICAgICBhdXJlYWQucHkKICAgICAgICAgICAgICBhdXdyaXRlLnB5CiAgICAgICAgICAgICAgLi4uCiAgICAgIEVmZmVjdHMvICAgICAgICAgICAgICAgICAgU3VicGFja2FnZSBmb3Igc291bmQgZWZmZWN0cwogICAgICAgICAgICAgIF9faW5pdF9fLnB5CiAgICAgICAgICAgICAgZWNoby5weQogICAgICAgICAgICAgIHN1cnJvdW5kLnB5CiAgICAgICAgICAgICAgcmV2ZXJzZS5weQogICAgICAgICAgICAgIC4uLgogICAgICBGaWx0ZXJzLyAgICAgICAgICAgICAgICAgIFN1YnBhY2thZ2UgZm9yIGZpbHRlcnMKICAgICAgICAgICAgICBfX2luaXRfXy5weQogICAgICAgICAgICAgIGVxdWFsaXplci5weQogICAgICAgICAgICAgIHZvY29kZXIucHkKICAgICAgICAgICAgICBrYXJhb2tlLnB5CiAgICAgICAgICAgICAgLi4uClxlbmR7dmVyYmF0aW19CgpXaGVuIGltcG9ydGluZyB0aGUgcGFja2FnZSwgUHl0aG9uIHNlYXJjaGVzIHRocm91Z2ggdGhlIGRpcmVjdG9yaWVzCm9uIFxjb2Rle3N5cy5wYXRofSBsb29raW5nIGZvciB0aGUgcGFja2FnZSBzdWJkaXJlY3RvcnkuCgpUaGUgXGZpbGV7X19pbml0X18ucHl9IGZpbGVzIGFyZSByZXF1aXJlZCB0byBtYWtlIFB5dGhvbiB0cmVhdCB0aGUKZGlyZWN0b3JpZXMgYXMgY29udGFpbmluZyBwYWNrYWdlczsgdGhpcyBpcyBkb25lIHRvIHByZXZlbnQKZGlyZWN0b3JpZXMgd2l0aCBhIGNvbW1vbiBuYW1lLCBzdWNoIGFzIFxzYW1we3N0cmluZ30sIGZyb20KdW5pbnRlbnRpb25hbGx5IGhpZGluZyB2YWxpZCBtb2R1bGVzIHRoYXQgb2NjdXIgbGF0ZXIgb24gdGhlIG1vZHVsZQpzZWFyY2ggcGF0aC4gSW4gdGhlIHNpbXBsZXN0IGNhc2UsIFxmaWxle19faW5pdF9fLnB5fSBjYW4ganVzdCBiZSBhbgplbXB0eSBmaWxlLCBidXQgaXQgY2FuIGFsc28gZXhlY3V0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUKcGFja2FnZSBvciBzZXQgdGhlIFxjb2Rle19fYWxsX199IHZhcmlhYmxlLCBkZXNjcmliZWQgbGF0ZXIuCgpVc2VycyBvZiB0aGUgcGFja2FnZSBjYW4gaW1wb3J0IGluZGl2aWR1YWwgbW9kdWxlcyBmcm9tIHRoZQpwYWNrYWdlLCBmb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IFNvdW5kLkVmZmVjdHMuZWNobwpcZW5ke3ZlcmJhdGltfQoKVGhpcyBsb2FkcyB0aGUgc3VibW9kdWxlIFxtb2R1bGV7U291bmQuRWZmZWN0cy5lY2hvfS4gIEl0IG11c3QgYmUgcmVmZXJlbmNlZAp3aXRoIGl0cyBmdWxsIG5hbWUuCgpcYmVnaW57dmVyYmF0aW19ClNvdW5kLkVmZmVjdHMuZWNoby5lY2hvZmlsdGVyKGlucHV0LCBvdXRwdXQsIGRlbGF5PTAuNywgYXR0ZW49NCkKXGVuZHt2ZXJiYXRpbX0KCkFuIGFsdGVybmF0aXZlIHdheSBvZiBpbXBvcnRpbmcgdGhlIHN1Ym1vZHVsZSBpczoKClxiZWdpbnt2ZXJiYXRpbX0KZnJvbSBTb3VuZC5FZmZlY3RzIGltcG9ydCBlY2hvClxlbmR7dmVyYmF0aW19CgpUaGlzIGFsc28gbG9hZHMgdGhlIHN1Ym1vZHVsZSBcbW9kdWxle2VjaG99LCBhbmQgbWFrZXMgaXQgYXZhaWxhYmxlIHdpdGhvdXQKaXRzIHBhY2thZ2UgcHJlZml4LCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQplY2hvLmVjaG9maWx0ZXIoaW5wdXQsIG91dHB1dCwgZGVsYXk9MC43LCBhdHRlbj00KQpcZW5ke3ZlcmJhdGltfQoKWWV0IGFub3RoZXIgdmFyaWF0aW9uIGlzIHRvIGltcG9ydCB0aGUgZGVzaXJlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBkaXJlY3RseToKClxiZWdpbnt2ZXJiYXRpbX0KZnJvbSBTb3VuZC5FZmZlY3RzLmVjaG8gaW1wb3J0IGVjaG9maWx0ZXIKXGVuZHt2ZXJiYXRpbX0KCkFnYWluLCB0aGlzIGxvYWRzIHRoZSBzdWJtb2R1bGUgXG1vZHVsZXtlY2hvfSwgYnV0IHRoaXMgbWFrZXMgaXRzIGZ1bmN0aW9uClxmdW5jdGlvbntlY2hvZmlsdGVyKCl9IGRpcmVjdGx5IGF2YWlsYWJsZToKClxiZWdpbnt2ZXJiYXRpbX0KZWNob2ZpbHRlcihpbnB1dCwgb3V0cHV0LCBkZWxheT0wLjcsIGF0dGVuPTQpClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgd2hlbiB1c2luZyBcY29kZXtmcm9tIFx2YXJ7cGFja2FnZX0gaW1wb3J0IFx2YXJ7aXRlbX19LCB0aGUKaXRlbSBjYW4gYmUgZWl0aGVyIGEgc3VibW9kdWxlIChvciBzdWJwYWNrYWdlKSBvZiB0aGUgcGFja2FnZSwgb3Igc29tZSAKb3RoZXIgbmFtZSBkZWZpbmVkIGluIHRoZSBwYWNrYWdlLCBsaWtlIGEgZnVuY3Rpb24sIGNsYXNzIG9yCnZhcmlhYmxlLiAgVGhlIFxjb2Rle2ltcG9ydH0gc3RhdGVtZW50IGZpcnN0IHRlc3RzIHdoZXRoZXIgdGhlIGl0ZW0gaXMKZGVmaW5lZCBpbiB0aGUgcGFja2FnZTsgaWYgbm90LCBpdCBhc3N1bWVzIGl0IGlzIGEgbW9kdWxlIGFuZCBhdHRlbXB0cwp0byBsb2FkIGl0LiAgSWYgaXQgZmFpbHMgdG8gZmluZCBpdCwgYW4KXGV4Y2VwdGlvbntJbXBvcnRFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZC4KCkNvbnRyYXJpbHksIHdoZW4gdXNpbmcgc3ludGF4IGxpa2UgXGNvZGV7aW1wb3J0Clx2YXJ7aXRlbS5zdWJpdGVtLnN1YnN1Yml0ZW19fSwgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgbXVzdCBiZQphIHBhY2thZ2U7IHRoZSBsYXN0IGl0ZW0gY2FuIGJlIGEgbW9kdWxlIG9yIGEgcGFja2FnZSBidXQgY2FuJ3QgYmUgYQpjbGFzcyBvciBmdW5jdGlvbiBvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBwcmV2aW91cyBpdGVtLgoKXHN1YnNlY3Rpb257SW1wb3J0aW5nICogRnJvbSBhIFBhY2thZ2UgXGxhYmVse3BrZy1pbXBvcnQtc3Rhcn19CiVUaGUgXGNvZGV7X19hbGxfX30gQXR0cmlidXRlCgpOb3cgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgd3JpdGVzIFxjb2Rle2Zyb20gU291bmQuRWZmZWN0cyBpbXBvcnQKKn0/ICBJZGVhbGx5LCBvbmUgd291bGQgaG9wZSB0aGF0IHRoaXMgc29tZWhvdyBnb2VzIG91dCB0byB0aGUKZmlsZXN5c3RlbSwgZmluZHMgd2hpY2ggc3VibW9kdWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgcGFja2FnZSwgYW5kCmltcG9ydHMgdGhlbSBhbGwuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCB3b3JrIHZlcnkKd2VsbCBvbiBNYWMgYW5kIFdpbmRvd3MgcGxhdGZvcm1zLCB3aGVyZSB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdAphbHdheXMgaGF2ZSBhY2N1cmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FzZSBvZiBhIGZpbGVuYW1lISAgT24KdGhlc2UgcGxhdGZvcm1zLCB0aGVyZSBpcyBubyBndWFyYW50ZWVkIHdheSB0byBrbm93IHdoZXRoZXIgYSBmaWxlClxmaWxle0VDSE8uUFl9IHNob3VsZCBiZSBpbXBvcnRlZCBhcyBhIG1vZHVsZSBcbW9kdWxle2VjaG99LApcbW9kdWxle0VjaG99IG9yIFxtb2R1bGV7RUNIT30uICAoRm9yIGV4YW1wbGUsIFdpbmRvd3MgOTUgaGFzIHRoZQphbm5veWluZyBwcmFjdGljZSBvZiBzaG93aW5nIGFsbCBmaWxlIG5hbWVzIHdpdGggYSBjYXBpdGFsaXplZCBmaXJzdApsZXR0ZXIuKSAgVGhlIERPUyA4KzMgZmlsZW5hbWUgcmVzdHJpY3Rpb24gYWRkcyBhbm90aGVyIGludGVyZXN0aW5nCnByb2JsZW0gZm9yIGxvbmcgbW9kdWxlIG5hbWVzLgoKVGhlIG9ubHkgc29sdXRpb24gaXMgZm9yIHRoZSBwYWNrYWdlIGF1dGhvciB0byBwcm92aWRlIGFuIGV4cGxpY2l0CmluZGV4IG9mIHRoZSBwYWNrYWdlLiAgVGhlIGltcG9ydCBzdGF0ZW1lbnQgdXNlcyB0aGUgZm9sbG93aW5nCmNvbnZlbnRpb246IGlmIGEgcGFja2FnZSdzIFxmaWxle19faW5pdF9fLnB5fSBjb2RlIGRlZmluZXMgYSBsaXN0Cm5hbWVkIFxjb2Rle19fYWxsX199LCBpdCBpcyB0YWtlbiB0byBiZSB0aGUgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdGhhdApzaG91bGQgYmUgaW1wb3J0ZWQgd2hlbiBcY29kZXtmcm9tIFx2YXJ7cGFja2FnZX0gaW1wb3J0ICp9IGlzCmVuY291bnRlcmVkLiAgSXQgaXMgdXAgdG8gdGhlIHBhY2thZ2UgYXV0aG9yIHRvIGtlZXAgdGhpcyBsaXN0CnVwLXRvLWRhdGUgd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGlzIHJlbGVhc2VkLiAgUGFja2FnZQphdXRob3JzIG1heSBhbHNvIGRlY2lkZSBub3QgdG8gc3VwcG9ydCBpdCwgaWYgdGhleSBkb24ndCBzZWUgYSB1c2UgZm9yCmltcG9ydGluZyAqIGZyb20gdGhlaXIgcGFja2FnZS4gIEZvciBleGFtcGxlLCB0aGUgZmlsZQpcZmlsZXtTb3VuZHMvRWZmZWN0cy9fX2luaXRfXy5weX0gY291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvZGU6CgpcYmVnaW57dmVyYmF0aW19Cl9fYWxsX18gPSBbImVjaG8iLCAic3Vycm91bmQiLCAicmV2ZXJzZSJdClxlbmR7dmVyYmF0aW19CgpUaGlzIHdvdWxkIG1lYW4gdGhhdCBcY29kZXtmcm9tIFNvdW5kLkVmZmVjdHMgaW1wb3J0ICp9IHdvdWxkCmltcG9ydCB0aGUgdGhyZWUgbmFtZWQgc3VibW9kdWxlcyBvZiB0aGUgXG1vZHVsZXtTb3VuZH0gcGFja2FnZS4KCklmIFxjb2Rle19fYWxsX199IGlzIG5vdCBkZWZpbmVkLCB0aGUgc3RhdGVtZW50IFxjb2Rle2Zyb20gU291bmQuRWZmZWN0cwppbXBvcnQgKn0gZG9lcyBcZW1waHtub3R9IGltcG9ydCBhbGwgc3VibW9kdWxlcyBmcm9tIHRoZSBwYWNrYWdlClxtb2R1bGV7U291bmQuRWZmZWN0c30gaW50byB0aGUgY3VycmVudCBuYW1lc3BhY2U7IGl0IG9ubHkgZW5zdXJlcyB0aGF0IHRoZQpwYWNrYWdlIFxtb2R1bGV7U291bmQuRWZmZWN0c30gaGFzIGJlZW4gaW1wb3J0ZWQgKHBvc3NpYmx5IHJ1bm5pbmcgaXRzCmluaXRpYWxpemF0aW9uIGNvZGUsIFxmaWxle19faW5pdF9fLnB5fSkgYW5kIHRoZW4gaW1wb3J0cyB3aGF0ZXZlciBuYW1lcyBhcmUKZGVmaW5lZCBpbiB0aGUgcGFja2FnZS4gIFRoaXMgaW5jbHVkZXMgYW55IG5hbWVzIGRlZmluZWQgKGFuZApzdWJtb2R1bGVzIGV4cGxpY2l0bHkgbG9hZGVkKSBieSBcZmlsZXtfX2luaXRfXy5weX0uICBJdCBhbHNvIGluY2x1ZGVzIGFueQpzdWJtb2R1bGVzIG9mIHRoZSBwYWNrYWdlIHRoYXQgd2VyZSBleHBsaWNpdGx5IGxvYWRlZCBieSBwcmV2aW91cwppbXBvcnQgc3RhdGVtZW50cy4gIENvbnNpZGVyIHRoaXMgY29kZToKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IFNvdW5kLkVmZmVjdHMuZWNobwppbXBvcnQgU291bmQuRWZmZWN0cy5zdXJyb3VuZApmcm9tIFNvdW5kLkVmZmVjdHMgaW1wb3J0ICoKXGVuZHt2ZXJiYXRpbX0KCkluIHRoaXMgZXhhbXBsZSwgdGhlIGVjaG8gYW5kIHN1cnJvdW5kIG1vZHVsZXMgYXJlIGltcG9ydGVkIGluIHRoZQpjdXJyZW50IG5hbWVzcGFjZSBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlClxtb2R1bGV7U291bmQuRWZmZWN0c30gcGFja2FnZSB3aGVuIHRoZSBcY29kZXtmcm9tLi4uaW1wb3J0fSBzdGF0ZW1lbnQKaXMgZXhlY3V0ZWQuICAoVGhpcyBhbHNvIHdvcmtzIHdoZW4gXGNvZGV7X19hbGxfX30gaXMgZGVmaW5lZC4pCgpOb3RlIHRoYXQgaW4gZ2VuZXJhbCB0aGUgcHJhY3RpY2Ugb2YgaW1wb3J0aW5nIFxjb2Rleyp9IGZyb20gYSBtb2R1bGUgb3IKcGFja2FnZSBpcyBmcm93bmVkIHVwb24sIHNpbmNlIGl0IG9mdGVuIGNhdXNlcyBwb29ybHkgcmVhZGFibGUgY29kZS4KSG93ZXZlciwgaXQgaXMgb2theSB0byB1c2UgaXQgdG8gc2F2ZSB0eXBpbmcgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMsCmFuZCBjZXJ0YWluIG1vZHVsZXMgYXJlIGRlc2lnbmVkIHRvIGV4cG9ydCBvbmx5IG5hbWVzIHRoYXQgZm9sbG93CmNlcnRhaW4gcGF0dGVybnMuCgpSZW1lbWJlciwgdGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHVzaW5nIFxjb2Rle2Zyb20gUGFja2FnZQppbXBvcnQgc3BlY2lmaWNfc3VibW9kdWxlfSEgIEluIGZhY3QsIHRoaXMgaXMgdGhlCnJlY29tbWVuZGVkIG5vdGF0aW9uIHVubGVzcyB0aGUgaW1wb3J0aW5nIG1vZHVsZSBuZWVkcyB0byB1c2UKc3VibW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgZnJvbSBkaWZmZXJlbnQgcGFja2FnZXMuCgoKXHN1YnNlY3Rpb257SW50cmEtcGFja2FnZSBSZWZlcmVuY2VzfQoKVGhlIHN1Ym1vZHVsZXMgb2Z0ZW4gbmVlZCB0byByZWZlciB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIHRoZQpcbW9kdWxle3N1cnJvdW5kfSBtb2R1bGUgbWlnaHQgdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZS4gIEluIGZhY3QsCnN1Y2ggcmVmZXJlbmNlcwphcmUgc28gY29tbW9uIHRoYXQgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50IGZpcnN0IGxvb2tzIGluIHRoZQpjb250YWluaW5nIHBhY2thZ2UgYmVmb3JlIGxvb2tpbmcgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZSBzZWFyY2ggcGF0aC4KVGh1cywgdGhlIHN1cnJvdW5kIG1vZHVsZSBjYW4gc2ltcGx5IHVzZSBcY29kZXtpbXBvcnQgZWNob30gb3IKXGNvZGV7ZnJvbSBlY2hvIGltcG9ydCBlY2hvZmlsdGVyfS4gIElmIHRoZSBpbXBvcnRlZCBtb2R1bGUgaXMgbm90CmZvdW5kIGluIHRoZSBjdXJyZW50IHBhY2thZ2UgKHRoZSBwYWNrYWdlIG9mIHdoaWNoIHRoZSBjdXJyZW50IG1vZHVsZQppcyBhIHN1Ym1vZHVsZSksIHRoZSBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudCBsb29rcyBmb3IgYSB0b3AtbGV2ZWwKbW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCgpXaGVuIHBhY2thZ2VzIGFyZSBzdHJ1Y3R1cmVkIGludG8gc3VicGFja2FnZXMgKGFzIHdpdGggdGhlClxtb2R1bGV7U291bmR9IHBhY2thZ2UgaW4gdGhlIGV4YW1wbGUpLCB0aGVyZSdzIG5vIHNob3J0Y3V0IHRvIHJlZmVyCnRvIHN1Ym1vZHVsZXMgb2Ygc2libGluZyBwYWNrYWdlcyAtIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHN1YnBhY2thZ2UKbXVzdCBiZSB1c2VkLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBtb2R1bGUKXG1vZHVsZXtTb3VuZC5GaWx0ZXJzLnZvY29kZXJ9IG5lZWRzIHRvIHVzZSB0aGUgXG1vZHVsZXtlY2hvfSBtb2R1bGUKaW4gdGhlIFxtb2R1bGV7U291bmQuRWZmZWN0c30gcGFja2FnZSwgaXQgY2FuIHVzZSBcY29kZXtmcm9tClNvdW5kLkVmZmVjdHMgaW1wb3J0IGVjaG99LgoKXHN1YnNlY3Rpb257UGFja2FnZXMgaW4gTXVsdGlwbGUgRGlyZWN0b3JpZXN9CgpQYWNrYWdlcyBzdXBwb3J0IG9uZSBtb3JlIHNwZWNpYWwgYXR0cmlidXRlLCBcbWVtYmVye19fcGF0aF9ffS4gIFRoaXMKaXMgaW5pdGlhbGl6ZWQgdG8gYmUgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQpob2xkaW5nIHRoZSBwYWNrYWdlJ3MgXGZpbGV7X19pbml0X18ucHl9IGJlZm9yZSB0aGUgY29kZSBpbiB0aGF0IGZpbGUKaXMgZXhlY3V0ZWQuICBUaGlzIHZhcmlhYmxlIGNhbiBiZSBtb2RpZmllZDsgZG9pbmcgc28gYWZmZWN0cyBmdXR1cmUKc2VhcmNoZXMgZm9yIG1vZHVsZXMgYW5kIHN1YnBhY2thZ2VzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZS4KCldoaWxlIHRoaXMgZmVhdHVyZSBpcyBub3Qgb2Z0ZW4gbmVlZGVkLCBpdCBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlCnNldCBvZiBtb2R1bGVzIGZvdW5kIGluIGEgcGFja2FnZS4KCgoKXGNoYXB0ZXJ7SW5wdXQgYW5kIE91dHB1dCBcbGFiZWx7aW99fQoKVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwcmVzZW50IHRoZSBvdXRwdXQgb2YgYSBwcm9ncmFtOyBkYXRhIGNhbiBiZQpwcmludGVkIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybSwgb3Igd3JpdHRlbiB0byBhIGZpbGUgZm9yIGZ1dHVyZSB1c2UuClRoaXMgY2hhcHRlciB3aWxsIGRpc2N1c3Mgc29tZSBvZiB0aGUgcG9zc2liaWxpdGllcy4KCgpcc2VjdGlvbntGYW5jaWVyIE91dHB1dCBGb3JtYXR0aW5nIFxsYWJlbHtmb3JtYXR0aW5nfX0KClNvIGZhciB3ZSd2ZSBlbmNvdW50ZXJlZCB0d28gd2F5cyBvZiB3cml0aW5nIHZhbHVlczogXGVtcGh7ZXhwcmVzc2lvbgpzdGF0ZW1lbnRzfSBhbmQgdGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQuICAoQSB0aGlyZCB3YXkgaXMgdXNpbmcKdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIG9mIGZpbGUgb2JqZWN0czsgdGhlIHN0YW5kYXJkIG91dHB1dCBmaWxlCmNhbiBiZSByZWZlcmVuY2VkIGFzIFxjb2Rle3N5cy5zdGRvdXR9LiAgU2VlIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSBmb3IKbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLikKCk9mdGVuIHlvdSdsbCB3YW50IG1vcmUgY29udHJvbCBvdmVyIHRoZSBmb3JtYXR0aW5nIG9mIHlvdXIgb3V0cHV0IHRoYW4Kc2ltcGx5IHByaW50aW5nIHNwYWNlLXNlcGFyYXRlZCB2YWx1ZXMuICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZm9ybWF0CnlvdXIgb3V0cHV0OyB0aGUgZmlyc3Qgd2F5IGlzIHRvIGRvIGFsbCB0aGUgc3RyaW5nIGhhbmRsaW5nIHlvdXJzZWxmOwp1c2luZyBzdHJpbmcgc2xpY2luZyBhbmQgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIHlvdSBjYW4gY3JlYXRlIGFueQpsYXktb3V0IHlvdSBjYW4gaW1hZ2luZS4gIFRoZSBzdGFuZGFyZCBtb2R1bGUKXG1vZHVsZXtzdHJpbmd9XHJlZnN0bW9kaW5kZXh7c3RyaW5nfSBjb250YWlucyBzb21lIHVzZWZ1bCBvcGVyYXRpb25zCmZvciBwYWRkaW5nIHN0cmluZ3MgdG8gYSBnaXZlbiBjb2x1bW4gd2lkdGg7IHRoZXNlIHdpbGwgYmUgZGlzY3Vzc2VkCnNob3J0bHkuICBUaGUgc2Vjb25kIHdheSBpcyB0byB1c2UgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciB3aXRoIGEKc3RyaW5nIGFzIHRoZSBsZWZ0IGFyZ3VtZW50LiAgVGhlIFxjb2Rle1wlfSBvcGVyYXRvciBpbnRlcnByZXRzIHRoZQpsZWZ0IGFyZ3VtZW50IG11Y2ggbGlrZSBhIFxjZnVuY3Rpb257c3ByaW50ZigpfS1zdHlsZSBmb3JtYXQKc3RyaW5nIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nCnJlc3VsdGluZyBmcm9tIHRoaXMgZm9ybWF0dGluZyBvcGVyYXRpb24uCgpPbmUgcXVlc3Rpb24gcmVtYWlucywgb2YgY291cnNlOiBob3cgZG8geW91IGNvbnZlcnQgdmFsdWVzIHRvIHN0cmluZ3M/Ckx1Y2tpbHksIFB5dGhvbiBoYXMgd2F5cyB0byBjb252ZXJ0IGFueSB2YWx1ZSB0byBhIHN0cmluZzogcGFzcyBpdCB0bwp0aGUgXGZ1bmN0aW9ue3JlcHIoKX0gIG9yIFxmdW5jdGlvbntzdHIoKX0gZnVuY3Rpb25zLiAgUmV2ZXJzZSBxdW90ZXMKKFxjb2Rle2BgfSkgYXJlIGVxdWl2YWxlbnQgdG8gXGZ1bmN0aW9ue3JlcHIoKX0sIGJ1dCB0aGVpciB1c2UgaXMKZGlzY291cmFnZWQuCgpUaGUgXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbiBpcyBtZWFudCB0byByZXR1cm4gcmVwcmVzZW50YXRpb25zIG9mCnZhbHVlcyB3aGljaCBhcmUgZmFpcmx5IGh1bWFuLXJlYWRhYmxlLCB3aGlsZSBcZnVuY3Rpb257cmVwcigpfSBpcwptZWFudCB0byBnZW5lcmF0ZSByZXByZXNlbnRhdGlvbnMgd2hpY2ggY2FuIGJlIHJlYWQgYnkgdGhlIGludGVycHJldGVyCihvciB3aWxsIGZvcmNlIGEgXGV4Y2VwdGlvbntTeW50YXhFcnJvcn0gaWYgdGhlcmUgaXMgbm90IGVxdWl2YWxlbnQKc3ludGF4KS4gIEZvciBvYmplY3RzIHdoaWNoIGRvbid0IGhhdmUgYSBwYXJ0aWN1bGFyIHJlcHJlc2VudGF0aW9uIGZvcgpodW1hbiBjb25zdW1wdGlvbiwgXGZ1bmN0aW9ue3N0cigpfSB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcwpcZnVuY3Rpb257cmVwcigpfS4gIE1hbnkgdmFsdWVzLCBzdWNoIGFzIG51bWJlcnMgb3Igc3RydWN0dXJlcyBsaWtlCmxpc3RzIGFuZCBkaWN0aW9uYXJpZXMsIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gdXNpbmcgZWl0aGVyCmZ1bmN0aW9uLiAgU3RyaW5ncyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgaW4gcGFydGljdWxhciwgaGF2ZSB0d28KZGlzdGluY3QgcmVwcmVzZW50YXRpb25zLgoKU29tZSBleGFtcGxlczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHMgPSAnSGVsbG8sIHdvcmxkLicKPj4+IHN0cihzKQonSGVsbG8sIHdvcmxkLicKPj4+IHJlcHIocykKIidIZWxsbywgd29ybGQuJyIKPj4+IHN0cigwLjEpCicwLjEnCj4+PiByZXByKDAuMSkKJzAuMTAwMDAwMDAwMDAwMDAwMDEnCj4+PiB4ID0gMTAgKiAzLjI1Cj4+PiB5ID0gMjAwICogMjAwCj4+PiBzID0gJ1RoZSB2YWx1ZSBvZiB4IGlzICcgKyByZXByKHgpICsgJywgYW5kIHkgaXMgJyArIHJlcHIoeSkgKyAnLi4uJwo+Pj4gcHJpbnQgcwpUaGUgdmFsdWUgb2YgeCBpcyAzMi41LCBhbmQgeSBpcyA0MDAwMC4uLgo+Pj4gIyBUaGUgcmVwcigpIG9mIGEgc3RyaW5nIGFkZHMgc3RyaW5nIHF1b3RlcyBhbmQgYmFja3NsYXNoZXM6Ci4uLiBoZWxsbyA9ICdoZWxsbywgd29ybGRcbicKPj4+IGhlbGxvcyA9IHJlcHIoaGVsbG8pCj4+PiBwcmludCBoZWxsb3MKJ2hlbGxvLCB3b3JsZFxuJwo+Pj4gIyBUaGUgYXJndW1lbnQgdG8gcmVwcigpIG1heSBiZSBhbnkgUHl0aG9uIG9iamVjdDoKLi4uIHJlcHIoKHgsIHksICgnc3BhbScsICdlZ2dzJykpKQoiKDMyLjUsIDQwMDAwLCAoJ3NwYW0nLCAnZWdncycpKSIKPj4+ICMgcmV2ZXJzZSBxdW90ZXMgYXJlIGNvbnZlbmllbnQgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnM6Ci4uLiBgeCwgeSwgKCdzcGFtJywgJ2VnZ3MnKWAKIigzMi41LCA0MDAwMCwgKCdzcGFtJywgJ2VnZ3MnKSkiClxlbmR7dmVyYmF0aW19CgpIZXJlIGFyZSB0d28gd2F5cyB0byB3cml0ZSBhIHRhYmxlIG9mIHNxdWFyZXMgYW5kIGN1YmVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZm9yIHggaW4gcmFuZ2UoMSwgMTEpOgouLi4gICAgIHByaW50IHJlcHIoeCkucmp1c3QoMiksIHJlcHIoeCp4KS5yanVzdCgzKSwKLi4uICAgICAjIE5vdGUgdHJhaWxpbmcgY29tbWEgb24gcHJldmlvdXMgbGluZQouLi4gICAgIHByaW50IHJlcHIoeCp4KngpLnJqdXN0KDQpCi4uLgogMSAgIDEgICAgMQogMiAgIDQgICAgOAogMyAgIDkgICAyNwogNCAgMTYgICA2NAogNSAgMjUgIDEyNQogNiAgMzYgIDIxNgogNyAgNDkgIDM0MwogOCAgNjQgIDUxMgogOSAgODEgIDcyOQoxMCAxMDAgMTAwMAo+Pj4gZm9yIHggaW4gcmFuZ2UoMSwxMSk6Ci4uLiAgICAgcHJpbnQgJyUyZCAlM2QgJTRkJyAlICh4LCB4KngsIHgqeCp4KQouLi4gCiAxICAgMSAgICAxCiAyICAgNCAgICA4CiAzICAgOSAgIDI3CiA0ICAxNiAgIDY0CiA1ICAyNSAgMTI1CiA2ICAzNiAgMjE2CiA3ICA0OSAgMzQzCiA4ICA2NCAgNTEyCiA5ICA4MSAgNzI5CjEwIDEwMCAxMDAwClxlbmR7dmVyYmF0aW19CgooTm90ZSB0aGF0IG9uZSBzcGFjZSBiZXR3ZWVuIGVhY2ggY29sdW1uIHdhcyBhZGRlZCBieSB0aGUgd2F5ClxrZXl3b3Jke3ByaW50fSB3b3JrczogaXQgYWx3YXlzIGFkZHMgc3BhY2VzIGJldHdlZW4gaXRzIGFyZ3VtZW50cy4pCgpUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBcbWV0aG9ke3JqdXN0KCl9IG1ldGhvZCBvZiBzdHJpbmcgb2JqZWN0cywKd2hpY2ggcmlnaHQtanVzdGlmaWVzIGEgc3RyaW5nIGluIGEgZmllbGQgb2YgYSBnaXZlbiB3aWR0aCBieSBwYWRkaW5nCml0IHdpdGggc3BhY2VzIG9uIHRoZSBsZWZ0LiAgVGhlcmUgYXJlIHNpbWlsYXIgbWV0aG9kcwpcbWV0aG9ke2xqdXN0KCl9IGFuZCBcbWV0aG9ke2NlbnRlcigpfS4gIFRoZXNlCm1ldGhvZHMgZG8gbm90IHdyaXRlIGFueXRoaW5nLCB0aGV5IGp1c3QgcmV0dXJuIGEgbmV3IHN0cmluZy4gIElmCnRoZSBpbnB1dCBzdHJpbmcgaXMgdG9vIGxvbmcsIHRoZXkgZG9uJ3QgdHJ1bmNhdGUgaXQsIGJ1dCByZXR1cm4gaXQKdW5jaGFuZ2VkOyB0aGlzIHdpbGwgbWVzcyB1cCB5b3VyIGNvbHVtbiBsYXktb3V0IGJ1dCB0aGF0J3MgdXN1YWxseQpiZXR0ZXIgdGhhbiB0aGUgYWx0ZXJuYXRpdmUsIHdoaWNoIHdvdWxkIGJlIGx5aW5nIGFib3V0IGEgdmFsdWUuICAoSWYKeW91IHJlYWxseSB3YW50IHRydW5jYXRpb24geW91IGNhbiBhbHdheXMgYWRkIGEgc2xpY2Ugb3BlcmF0aW9uLCBhcyBpbgpcc2FtcHt4LmxqdXN0KH5uKVs6bl19LikKClRoZXJlIGlzIGFub3RoZXIgbWV0aG9kLCBcbWV0aG9ke3pmaWxsKCl9LCB3aGljaCBwYWRzIGEKbnVtZXJpYyBzdHJpbmcgb24gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEl0IHVuZGVyc3RhbmRzIGFib3V0IHBsdXMgYW5kCm1pbnVzIHNpZ25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gJzEyJy56ZmlsbCg1KQonMDAwMTInCj4+PiAnLTMuMTQnLnpmaWxsKDcpCictMDAzLjE0Jwo+Pj4gJzMuMTQxNTkyNjUzNTknLnpmaWxsKDUpCiczLjE0MTU5MjY1MzU5JwpcZW5ke3ZlcmJhdGltfQoKVXNpbmcgdGhlIFxjb2Rle1wlfSBvcGVyYXRvciBsb29rcyBsaWtlIHRoaXM6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgbWF0aAo+Pj4gcHJpbnQgJ1RoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5ICU1LjNmLicgJSBtYXRoLnBpClRoZSB2YWx1ZSBvZiBQSSBpcyBhcHByb3hpbWF0ZWx5IDMuMTQyLgpcZW5ke3ZlcmJhdGltfQoKSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmb3JtYXQgaW4gdGhlIHN0cmluZywgeW91IG5lZWQgdG8gcGFzcyBhCnR1cGxlIGFzIHJpZ2h0IG9wZXJhbmQsIGFzIGluIHRoaXMgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRhYmxlID0geydTam9lcmQnOiA0MTI3LCAnSmFjayc6IDQwOTgsICdEY2FiJzogNzY3OH0KPj4+IGZvciBuYW1lLCBwaG9uZSBpbiB0YWJsZS5pdGVtcygpOgouLi4gICAgIHByaW50ICclLTEwcyA9PT4gJTEwZCcgJSAobmFtZSwgcGhvbmUpCi4uLiAKSmFjayAgICAgICA9PT4gICAgICAgNDA5OApEY2FiICAgICAgID09PiAgICAgICA3Njc4ClNqb2VyZCAgICAgPT0+ICAgICAgIDQxMjcKXGVuZHt2ZXJiYXRpbX0KCk1vc3QgZm9ybWF0cyB3b3JrIGV4YWN0bHkgYXMgaW4gQyBhbmQgcmVxdWlyZSB0aGF0IHlvdSBwYXNzIHRoZSBwcm9wZXIKdHlwZTsgaG93ZXZlciwgaWYgeW91IGRvbid0IHlvdSBnZXQgYW4gZXhjZXB0aW9uLCBub3QgYSBjb3JlIGR1bXAuClRoZSBcY29kZXtcJXN9IGZvcm1hdCBpcyBtb3JlIHJlbGF4ZWQ6IGlmIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzCm5vdCBhIHN0cmluZyBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlClxmdW5jdGlvbntzdHIoKX0gYnVpbHQtaW4gZnVuY3Rpb24uICBVc2luZyBcY29kZXsqfSB0byBwYXNzIHRoZSB3aWR0aApvciBwcmVjaXNpb24gaW4gYXMgYSBzZXBhcmF0ZSAoaW50ZWdlcikgYXJndW1lbnQgaXMgc3VwcG9ydGVkLiAgVGhlCkMgZm9ybWF0cyBcY29kZXtcJW59IGFuZCBcY29kZXtcJXB9IGFyZSBub3Qgc3VwcG9ydGVkLgoKSWYgeW91IGhhdmUgYSByZWFsbHkgbG9uZyBmb3JtYXQgc3RyaW5nIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gc3BsaXQKdXAsIGl0IHdvdWxkIGJlIG5pY2UgaWYgeW91IGNvdWxkIHJlZmVyZW5jZSB0aGUgdmFyaWFibGVzIHRvIGJlCmZvcm1hdHRlZCBieSBuYW1lIGluc3RlYWQgb2YgYnkgcG9zaXRpb24uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHVzaW5nCmZvcm0gXGNvZGV7XCUobmFtZSlmb3JtYXR9LCBhcyBzaG93biBoZXJlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdGFibGUgPSB7J1Nqb2VyZCc6IDQxMjcsICdKYWNrJzogNDA5OCwgJ0RjYWInOiA4NjM3Njc4fQo+Pj4gcHJpbnQgJ0phY2s6ICUoSmFjaylkOyBTam9lcmQ6ICUoU2pvZXJkKWQ7IERjYWI6ICUoRGNhYilkJyAlIHRhYmxlCkphY2s6IDQwOTg7IFNqb2VyZDogNDEyNzsgRGNhYjogODYzNzY3OApcZW5ke3ZlcmJhdGltfQoKVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG5ldyBidWlsdC1pbgpcZnVuY3Rpb257dmFycygpfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwKbG9jYWwgdmFyaWFibGVzLgoKXHNlY3Rpb257UmVhZGluZyBhbmQgV3JpdGluZyBGaWxlcyBcbGFiZWx7ZmlsZXN9fQoKJSBPcGVuaW5nIGZpbGVzIApcZnVuY3Rpb257b3BlbigpfVxiaWZ1bmNpbmRleHtvcGVufSByZXR1cm5zIGEgZmlsZQpvYmplY3Rcb2JpbmRleHtmaWxlfSwgYW5kIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB3aXRoIHR3byBhcmd1bWVudHM6ClxzYW1we29wZW4oXHZhcntmaWxlbmFtZX0sIFx2YXJ7bW9kZX0pfS4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGY9b3BlbignL3RtcC93b3JrZmlsZScsICd3JykKPj4+IHByaW50IGYKPG9wZW4gZmlsZSAnL3RtcC93b3JrZmlsZScsIG1vZGUgJ3cnIGF0IDgwYTA5NjA+ClxlbmR7dmVyYmF0aW19CgpUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWUuICBUaGUgc2Vjb25kCmFyZ3VtZW50IGlzIGFub3RoZXIgc3RyaW5nIGNvbnRhaW5pbmcgYSBmZXcgY2hhcmFjdGVycyBkZXNjcmliaW5nIHRoZQp3YXkgaW4gd2hpY2ggdGhlIGZpbGUgd2lsbCBiZSB1c2VkLiAgXHZhcnttb2RlfSBjYW4gYmUgXGNvZGV7J3InfSB3aGVuCnRoZSBmaWxlIHdpbGwgb25seSBiZSByZWFkLCBcY29kZXsndyd9IGZvciBvbmx5IHdyaXRpbmcgKGFuIGV4aXN0aW5nCmZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgZXJhc2VkKSwgYW5kIFxjb2RleydhJ30gb3BlbnMgdGhlIGZpbGUKZm9yIGFwcGVuZGluZzsgYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCnRoZSBlbmQuICBcY29kZXsncisnfSBvcGVucyB0aGUgZmlsZSBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgpUaGUgXHZhcnttb2RlfSBhcmd1bWVudCBpcyBvcHRpb25hbDsgXGNvZGV7J3InfSB3aWxsIGJlIGFzc3VtZWQgaWYKaXQncyBvbWl0dGVkLgoKT24gV2luZG93cyBhbmQgdGhlIE1hY2ludG9zaCwgXGNvZGV7J2InfSBhcHBlbmRlZCB0byB0aGUKbW9kZSBvcGVucyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgc28gdGhlcmUgYXJlIGFsc28gbW9kZXMgbGlrZQpcY29kZXsncmInfSwgXGNvZGV7J3diJ30sIGFuZCBcY29kZXsncitiJ30uICBXaW5kb3dzIG1ha2VzIGEKZGlzdGluY3Rpb24gYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgZmlsZXM7IHRoZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzCmluIHRleHQgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgYWx0ZXJlZCBzbGlnaHRseSB3aGVuIGRhdGEgaXMgcmVhZCBvcgp3cml0dGVuLiAgVGhpcyBiZWhpbmQtdGhlLXNjZW5lcyBtb2RpZmljYXRpb24gdG8gZmlsZSBkYXRhIGlzIGZpbmUgZm9yClxBU0NJSXt9IHRleHQgZmlsZXMsIGJ1dCBpdCdsbCBjb3JydXB0IGJpbmFyeSBkYXRhIGxpa2UgdGhhdCBpbiBKUEVHcyBvcgpcZmlsZXsuRVhFfSBmaWxlcy4gIEJlIHZlcnkgY2FyZWZ1bCB0byB1c2UgYmluYXJ5IG1vZGUgd2hlbiByZWFkaW5nIGFuZAp3cml0aW5nIHN1Y2ggZmlsZXMuICAoTm90ZSB0aGF0IHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiB0ZXh0IG1vZGUgb24KdGhlIE1hY2ludG9zaCBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIEMgbGlicmFyeSBiZWluZyB1c2VkLikKClxzdWJzZWN0aW9ue01ldGhvZHMgb2YgRmlsZSBPYmplY3RzIFxsYWJlbHtmaWxlTWV0aG9kc319CgpUaGUgcmVzdCBvZiB0aGUgZXhhbXBsZXMgaW4gdGhpcyBzZWN0aW9uIHdpbGwgYXNzdW1lIHRoYXQgYSBmaWxlCm9iamVjdCBjYWxsZWQgXGNvZGV7Zn0gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLgoKVG8gcmVhZCBhIGZpbGUncyBjb250ZW50cywgY2FsbCBcY29kZXtmLnJlYWQoXHZhcntzaXplfSl9LCB3aGljaCByZWFkcwpzb21lIHF1YW50aXR5IG9mIGRhdGEgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuICBcdmFye3NpemV9IGlzIGFuCm9wdGlvbmFsIG51bWVyaWMgYXJndW1lbnQuICBXaGVuIFx2YXJ7c2l6ZX0gaXMgb21pdHRlZCBvciBuZWdhdGl2ZSwKdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZSB3aWxsIGJlIHJlYWQgYW5kIHJldHVybmVkOyBpdCdzIHlvdXIKcHJvYmxlbSBpZiB0aGUgZmlsZSBpcyB0d2ljZSBhcyBsYXJnZSBhcyB5b3VyIG1hY2hpbmUncyBtZW1vcnkuCk90aGVyd2lzZSwgYXQgbW9zdCBcdmFye3NpemV9IGJ5dGVzIGFyZSByZWFkIGFuZCByZXR1cm5lZC4gIElmIHRoZSBlbmQKb2YgdGhlIGZpbGUgaGFzIGJlZW4gcmVhY2hlZCwgXGNvZGV7Zi5yZWFkKCl9IHdpbGwgcmV0dXJuIGFuIGVtcHR5CnN0cmluZyAoXGNvZGUgeyIifSkuClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGYucmVhZCgpCidUaGlzIGlzIHRoZSBlbnRpcmUgZmlsZS5cbicKPj4+IGYucmVhZCgpCicnClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnJlYWRsaW5lKCl9IHJlYWRzIGEgc2luZ2xlIGxpbmUgZnJvbSB0aGUgZmlsZTsgYSBuZXdsaW5lCmNoYXJhY3RlciAoXGNvZGV7XGUgbn0pIGlzIGxlZnQgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBhbmQgaXMgb25seQpvbWl0dGVkIG9uIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZpbGUgaWYgdGhlIGZpbGUgZG9lc24ndCBlbmQgaW4gYQpuZXdsaW5lLiAgVGhpcyBtYWtlcyB0aGUgcmV0dXJuIHZhbHVlIHVuYW1iaWd1b3VzOyBpZgpcY29kZXtmLnJlYWRsaW5lKCl9IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcwpiZWVuIHJlYWNoZWQsIHdoaWxlIGEgYmxhbmsgbGluZSBpcyByZXByZXNlbnRlZCBieSBcY29kZXsnXGUgbid9LCBhCnN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzaW5nbGUgbmV3bGluZS4gIAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZi5yZWFkbGluZSgpCidUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlLlxuJwo+Pj4gZi5yZWFkbGluZSgpCidTZWNvbmQgbGluZSBvZiB0aGUgZmlsZVxuJwo+Pj4gZi5yZWFkbGluZSgpCicnClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnJlYWRsaW5lcygpfSByZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGFsbCB0aGUgbGluZXMgb2YgZGF0YQppbiB0aGUgZmlsZS4gIElmIGdpdmVuIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBcdmFye3NpemVoaW50fSwgaXQgcmVhZHMKdGhhdCBtYW55IGJ5dGVzIGZyb20gdGhlIGZpbGUgYW5kIGVub3VnaCBtb3JlIHRvIGNvbXBsZXRlIGEgbGluZSwgYW5kCnJldHVybnMgdGhlIGxpbmVzIGZyb20gdGhhdC4gIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBhbGxvdyBlZmZpY2llbnQKcmVhZGluZyBvZiBhIGxhcmdlIGZpbGUgYnkgbGluZXMsIGJ1dCB3aXRob3V0IGhhdmluZyB0byBsb2FkIHRoZQplbnRpcmUgZmlsZSBpbiBtZW1vcnkuICBPbmx5IGNvbXBsZXRlIGxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmLnJlYWRsaW5lcygpClsnVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZmlsZS5cbicsICdTZWNvbmQgbGluZSBvZiB0aGUgZmlsZVxuJ10KXGVuZHt2ZXJiYXRpbX0KClxjb2Rle2Yud3JpdGUoXHZhcntzdHJpbmd9KX0gd3JpdGVzIHRoZSBjb250ZW50cyBvZiBcdmFye3N0cmluZ30gdG8KdGhlIGZpbGUsIHJldHVybmluZyBcY29kZXtOb25lfS4gIAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZi53cml0ZSgnVGhpcyBpcyBhIHRlc3RcbicpClxlbmR7dmVyYmF0aW19CgpcY29kZXtmLnRlbGwoKX0gcmV0dXJucyBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgZmlsZSBvYmplY3QncyBjdXJyZW50CnBvc2l0aW9uIGluIHRoZSBmaWxlLCBtZWFzdXJlZCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCmZpbGUuICBUbyBjaGFuZ2UgdGhlIGZpbGUgb2JqZWN0J3MgcG9zaXRpb24sIHVzZQpcc2FtcHtmLnNlZWsoXHZhcntvZmZzZXR9LCBcdmFye2Zyb21fd2hhdH0pfS4gIFRoZSBwb3NpdGlvbiBpcwpjb21wdXRlZCBmcm9tIGFkZGluZyBcdmFye29mZnNldH0gdG8gYSByZWZlcmVuY2UgcG9pbnQ7IHRoZSByZWZlcmVuY2UKcG9pbnQgaXMgc2VsZWN0ZWQgYnkgdGhlIFx2YXJ7ZnJvbV93aGF0fSBhcmd1bWVudC4gIEEKXHZhcntmcm9tX3doYXR9IHZhbHVlIG9mIDAgbWVhc3VyZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCAxCnVzZXMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiwgYW5kIDIgdXNlcyB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIHRoZQpyZWZlcmVuY2UgcG9pbnQuICBcdmFye2Zyb21fd2hhdH0gY2FuIGJlIG9taXR0ZWQgYW5kIGRlZmF1bHRzIHRvIDAsCnVzaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYXMgdGhlIHJlZmVyZW5jZSBwb2ludC4KClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGY9b3BlbignL3RtcC93b3JrZmlsZScsICdyKycpCj4+PiBmLndyaXRlKCcwMTIzNDU2Nzg5YWJjZGVmJykKPj4+IGYuc2Vlayg1KSAgICAgIyBHbyB0byB0aGUgNnRoIGJ5dGUgaW4gdGhlIGZpbGUKPj4+IGYucmVhZCgxKSAgICAgICAgCic1Jwo+Pj4gZi5zZWVrKC0zLCAyKSAjIEdvIHRvIHRoZSAzcmQgYnl0ZSBiZWZvcmUgdGhlIGVuZAo+Pj4gZi5yZWFkKDEpCidkJwpcZW5ke3ZlcmJhdGltfQoKV2hlbiB5b3UncmUgZG9uZSB3aXRoIGEgZmlsZSwgY2FsbCBcY29kZXtmLmNsb3NlKCl9IHRvIGNsb3NlIGl0IGFuZApmcmVlIHVwIGFueSBzeXN0ZW0gcmVzb3VyY2VzIHRha2VuIHVwIGJ5IHRoZSBvcGVuIGZpbGUuICBBZnRlciBjYWxsaW5nClxjb2Rle2YuY2xvc2UoKX0sIGF0dGVtcHRzIHRvIHVzZSB0aGUgZmlsZSBvYmplY3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBmLmNsb3NlKCkKPj4+IGYucmVhZCgpClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/ClZhbHVlRXJyb3I6IEkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUKXGVuZHt2ZXJiYXRpbX0KCkZpbGUgb2JqZWN0cyBoYXZlIHNvbWUgYWRkaXRpb25hbCBtZXRob2RzLCBzdWNoIGFzClxtZXRob2R7aXNhdHR5KCl9IGFuZCBcbWV0aG9ke3RydW5jYXRlKCl9IHdoaWNoIGFyZSBsZXNzIGZyZXF1ZW50bHkKdXNlZDsgY29uc3VsdCB0aGUgTGlicmFyeSBSZWZlcmVuY2UgZm9yIGEgY29tcGxldGUgZ3VpZGUgdG8gZmlsZQpvYmplY3RzLgoKXHN1YnNlY3Rpb257VGhlIFxtb2R1bGV7cGlja2xlfSBNb2R1bGUgXGxhYmVse3BpY2tsZX19ClxyZWZzdG1vZGluZGV4e3BpY2tsZX0KClN0cmluZ3MgY2FuIGVhc2lseSBiZSB3cml0dGVuIHRvIGFuZCByZWFkIGZyb20gYSBmaWxlLiBOdW1iZXJzIHRha2UgYQpiaXQgbW9yZSBlZmZvcnQsIHNpbmNlIHRoZSBcbWV0aG9ke3JlYWQoKX0gbWV0aG9kIG9ubHkgcmV0dXJucwpzdHJpbmdzLCB3aGljaCB3aWxsIGhhdmUgdG8gYmUgcGFzc2VkIHRvIGEgZnVuY3Rpb24gbGlrZQpcZnVuY3Rpb257aW50KCl9LCB3aGljaCB0YWtlcyBhIHN0cmluZyBsaWtlIFxjb2RleycxMjMnfSBhbmQKcmV0dXJucyBpdHMgbnVtZXJpYyB2YWx1ZSAxMjMuICBIb3dldmVyLCB3aGVuIHlvdSB3YW50IHRvIHNhdmUgbW9yZQpjb21wbGV4IGRhdGEgdHlwZXMgbGlrZSBsaXN0cywgZGljdGlvbmFyaWVzLCBvciBjbGFzcyBpbnN0YW5jZXMsCnRoaW5ncyBnZXQgYSBsb3QgbW9yZSBjb21wbGljYXRlZC4KClJhdGhlciB0aGFuIGhhdmUgdXNlcnMgYmUgY29uc3RhbnRseSB3cml0aW5nIGFuZCBkZWJ1Z2dpbmcgY29kZSB0bwpzYXZlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMsIFB5dGhvbiBwcm92aWRlcyBhIHN0YW5kYXJkIG1vZHVsZSBjYWxsZWQKXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0uICBUaGlzIGlzIGFuCmFtYXppbmcgbW9kdWxlIHRoYXQgY2FuIHRha2UgYWxtb3N0CmFueSBQeXRob24gb2JqZWN0IChldmVuIHNvbWUgZm9ybXMgb2YgUHl0aG9uIGNvZGUhKSwgYW5kIGNvbnZlcnQgaXQgdG8KYSBzdHJpbmcgcmVwcmVzZW50YXRpb247IHRoaXMgcHJvY2VzcyBpcyBjYWxsZWQgXGRmbntwaWNrbGluZ30uICAKUmVjb25zdHJ1Y3RpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgY2FsbGVkClxkZm57dW5waWNrbGluZ30uICBCZXR3ZWVuIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLCB0aGUgc3RyaW5nCnJlcHJlc2VudGluZyB0aGUgb2JqZWN0IG1heSBoYXZlIGJlZW4gc3RvcmVkIGluIGEgZmlsZSBvciBkYXRhLCBvcgpzZW50IG92ZXIgYSBuZXR3b3JrIGNvbm5lY3Rpb24gdG8gc29tZSBkaXN0YW50IG1hY2hpbmUuCgpJZiB5b3UgaGF2ZSBhbiBvYmplY3QgXGNvZGV7eH0sIGFuZCBhIGZpbGUgb2JqZWN0IFxjb2Rle2Z9IHRoYXQncyBiZWVuCm9wZW5lZCBmb3Igd3JpdGluZywgdGhlIHNpbXBsZXN0IHdheSB0byBwaWNrbGUgdGhlIG9iamVjdCB0YWtlcyBvbmx5Cm9uZSBsaW5lIG9mIGNvZGU6CgpcYmVnaW57dmVyYmF0aW19CnBpY2tsZS5kdW1wKHgsIGYpClxlbmR7dmVyYmF0aW19CgpUbyB1bnBpY2tsZSB0aGUgb2JqZWN0IGFnYWluLCBpZiBcY29kZXtmfSBpcyBhIGZpbGUgb2JqZWN0IHdoaWNoIGhhcwpiZWVuIG9wZW5lZCBmb3IgcmVhZGluZzoKClxiZWdpbnt2ZXJiYXRpbX0KeCA9IHBpY2tsZS5sb2FkKGYpClxlbmR7dmVyYmF0aW19CgooVGhlcmUgYXJlIG90aGVyIHZhcmlhbnRzIG9mIHRoaXMsIHVzZWQgd2hlbiBwaWNrbGluZyBtYW55IG9iamVjdHMgb3IKd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgcGlja2xlZCBkYXRhIHRvIGEgZmlsZTsgY29uc3VsdCB0aGUKY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IKXHVsaW5re1xtb2R1bGV7cGlja2xlfX17Li4vbGliL21vZHVsZS1waWNrbGUuaHRtbH0gaW4gdGhlClxjaXRldGl0bGVbLi4vbGliL117UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfS4pCgpcdWxpbmt7XG1vZHVsZXtwaWNrbGV9fXsuLi9saWIvbW9kdWxlLXBpY2tsZS5odG1sfSBpcyB0aGUgc3RhbmRhcmQgd2F5CnRvIG1ha2UgUHl0aG9uIG9iamVjdHMgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQgcmV1c2VkIGJ5IG90aGVyCnByb2dyYW1zIG9yIGJ5IGEgZnV0dXJlIGludm9jYXRpb24gb2YgdGhlIHNhbWUgcHJvZ3JhbTsgdGhlIHRlY2huaWNhbAp0ZXJtIGZvciB0aGlzIGlzIGEgXGRmbntwZXJzaXN0ZW50fSBvYmplY3QuICBCZWNhdXNlClx1bGlua3tcbW9kdWxle3BpY2tsZX19ey4uL2xpYi9tb2R1bGUtcGlja2xlLmh0bWx9IGlzIHNvIHdpZGVseSB1c2VkLAptYW55IGF1dGhvcnMgd2hvIHdyaXRlIFB5dGhvbiBleHRlbnNpb25zIHRha2UgY2FyZSB0byBlbnN1cmUgdGhhdCBuZXcKZGF0YSB0eXBlcyBzdWNoIGFzIG1hdHJpY2VzIGNhbiBiZSBwcm9wZXJseSBwaWNrbGVkIGFuZCB1bnBpY2tsZWQuCgoKClxjaGFwdGVye0Vycm9ycyBhbmQgRXhjZXB0aW9ucyBcbGFiZWx7ZXJyb3JzfX0KClVudGlsIG5vdyBlcnJvciBtZXNzYWdlcyBoYXZlbid0IGJlZW4gbW9yZSB0aGFuIG1lbnRpb25lZCwgYnV0IGlmIHlvdQpoYXZlIHRyaWVkIG91dCB0aGUgZXhhbXBsZXMgeW91IGhhdmUgcHJvYmFibHkgc2VlbiBzb21lLiAgVGhlcmUgYXJlCihhdCBsZWFzdCkgdHdvIGRpc3Rpbmd1aXNoYWJsZSBraW5kcyBvZiBlcnJvcnM6ClxlbXBoe3N5bnRheCBlcnJvcnN9IGFuZCBcZW1waHtleGNlcHRpb25zfS4KClxzZWN0aW9ue1N5bnRheCBFcnJvcnMgXGxhYmVse3N5bnRheEVycm9yc319CgpTeW50YXggZXJyb3JzLCBhbHNvIGtub3duIGFzIHBhcnNpbmcgZXJyb3JzLCBhcmUgcGVyaGFwcyB0aGUgbW9zdCBjb21tb24Ka2luZCBvZiBjb21wbGFpbnQgeW91IGdldCB3aGlsZSB5b3UgYXJlIHN0aWxsIGxlYXJuaW5nIFB5dGhvbjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHdoaWxlIFRydWUgcHJpbnQgJ0hlbGxvIHdvcmxkJwogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgIHdoaWxlIFRydWUgcHJpbnQgJ0hlbGxvIHdvcmxkJwogICAgICAgICAgICAgICAgICAgXgpTeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKXGVuZHt2ZXJiYXRpbX0KClRoZSBwYXJzZXIgcmVwZWF0cyB0aGUgb2ZmZW5kaW5nIGxpbmUgYW5kIGRpc3BsYXlzIGEgbGl0dGxlIGBhcnJvdycKcG9pbnRpbmcgYXQgdGhlIGVhcmxpZXN0IHBvaW50IGluIHRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciB3YXMKZGV0ZWN0ZWQuICBUaGUgZXJyb3IgaXMgY2F1c2VkIGJ5IChvciBhdCBsZWFzdCBkZXRlY3RlZCBhdCkgdGhlIHRva2VuClxlbXBoe3ByZWNlZGluZ30gdGhlIGFycm93OiBpbiB0aGUgZXhhbXBsZSwgdGhlIGVycm9yIGlzIGRldGVjdGVkIGF0CnRoZSBrZXl3b3JkIFxrZXl3b3Jke3ByaW50fSwgc2luY2UgYSBjb2xvbiAoXGNoYXJhY3Rlcns6fSkgaXMgbWlzc2luZwpiZWZvcmUgaXQuICBGaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBwcmludGVkIHNvIHlvdSBrbm93IHdoZXJlIHRvCmxvb2sgaW4gY2FzZSB0aGUgaW5wdXQgY2FtZSBmcm9tIGEgc2NyaXB0LgoKXHNlY3Rpb257RXhjZXB0aW9ucyBcbGFiZWx7ZXhjZXB0aW9uc319CgpFdmVuIGlmIGEgc3RhdGVtZW50IG9yIGV4cHJlc3Npb24gaXMgc3ludGFjdGljYWxseSBjb3JyZWN0LCBpdCBtYXkKY2F1c2UgYW4gZXJyb3Igd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZXhlY3V0ZSBpdC4KRXJyb3JzIGRldGVjdGVkIGR1cmluZyBleGVjdXRpb24gYXJlIGNhbGxlZCBcZW1waHtleGNlcHRpb25zfSBhbmQgYXJlCm5vdCB1bmNvbmRpdGlvbmFsbHkgZmF0YWw6IHlvdSB3aWxsIHNvb24gbGVhcm4gaG93IHRvIGhhbmRsZSB0aGVtIGluClB5dGhvbiBwcm9ncmFtcy4gIE1vc3QgZXhjZXB0aW9ucyBhcmUgbm90IGhhbmRsZWQgYnkgcHJvZ3JhbXMsCmhvd2V2ZXIsIGFuZCByZXN1bHQgaW4gZXJyb3IgbWVzc2FnZXMgYXMgc2hvd24gaGVyZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDEwICogKDEvMCkKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KPj4+IDQgKyBzcGFtKjMKVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KTmFtZUVycm9yOiBuYW1lICdzcGFtJyBpcyBub3QgZGVmaW5lZAo+Pj4gJzInICsgMgpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpUeXBlRXJyb3I6IGNhbm5vdCBjb25jYXRlbmF0ZSAnc3RyJyBhbmQgJ2ludCcgb2JqZWN0cwpcZW5ke3ZlcmJhdGltfQoKVGhlIGxhc3QgbGluZSBvZiB0aGUgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgd2hhdCBoYXBwZW5lZC4KRXhjZXB0aW9ucyBjb21lIGluIGRpZmZlcmVudCB0eXBlcywgYW5kIHRoZSB0eXBlIGlzIHByaW50ZWQgYXMgcGFydCBvZgp0aGUgbWVzc2FnZTogdGhlIHR5cGVzIGluIHRoZSBleGFtcGxlIGFyZQpcZXhjZXB0aW9ue1plcm9EaXZpc2lvbkVycm9yfSwgXGV4Y2VwdGlvbntOYW1lRXJyb3J9IGFuZApcZXhjZXB0aW9ue1R5cGVFcnJvcn0uClRoZSBzdHJpbmcgcHJpbnRlZCBhcyB0aGUgZXhjZXB0aW9uIHR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluCm5hbWUgZm9yIHRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZC4gIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGJ1aWx0LWluCmV4Y2VwdGlvbnMsIGJ1dCBuZWVkIG5vdCBiZSB0cnVlIGZvciB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyAoYWx0aG91Z2gKaXQgaXMgYSB1c2VmdWwgY29udmVudGlvbikuClN0YW5kYXJkIGV4Y2VwdGlvbiBuYW1lcyBhcmUgYnVpbHQtaW4gaWRlbnRpZmllcnMgKG5vdCByZXNlcnZlZAprZXl3b3JkcykuCgpUaGUgcmVzdCBvZiB0aGUgbGluZSBpcyBhIGRldGFpbCB3aG9zZSBpbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uIHRoZQpleGNlcHRpb24gdHlwZTsgaXRzIG1lYW5pbmcgaXMgZGVwZW5kZW50IG9uIHRoZSBleGNlcHRpb24gdHlwZS4KClRoZSBwcmVjZWRpbmcgcGFydCBvZiB0aGUgZXJyb3IgbWVzc2FnZSBzaG93cyB0aGUgY29udGV4dCB3aGVyZSB0aGUKZXhjZXB0aW9uIGhhcHBlbmVkLCBpbiB0aGUgZm9ybSBvZiBhIHN0YWNrIGJhY2t0cmFjZS4KSW4gZ2VuZXJhbCBpdCBjb250YWlucyBhIHN0YWNrIGJhY2t0cmFjZSBsaXN0aW5nIHNvdXJjZSBsaW5lczsgaG93ZXZlciwKaXQgd2lsbCBub3QgZGlzcGxheSBsaW5lcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuCgpUaGUgXGNpdGV0aXRsZVsuLi9saWIvbW9kdWxlLWV4Y2VwdGlvbnMuaHRtbF17UHl0aG9uIExpYnJhcnkKUmVmZXJlbmNlfSBsaXN0cyB0aGUgYnVpbHQtaW4gZXhjZXB0aW9ucyBhbmQgdGhlaXIgbWVhbmluZ3MuCgoKXHNlY3Rpb257SGFuZGxpbmcgRXhjZXB0aW9ucyBcbGFiZWx7aGFuZGxpbmd9fQoKSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgcHJvZ3JhbXMgdGhhdCBoYW5kbGUgc2VsZWN0ZWQgZXhjZXB0aW9ucy4KTG9vayBhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdoaWNoIGFza3MgdGhlIHVzZXIgZm9yIGlucHV0IHVudGlsIGEKdmFsaWQgaW50ZWdlciBoYXMgYmVlbiBlbnRlcmVkLCBidXQgYWxsb3dzIHRoZSB1c2VyIHRvIGludGVycnVwdCB0aGUKcHJvZ3JhbSAodXNpbmcgXGtiZHtDb250cm9sLUN9IG9yIHdoYXRldmVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtCnN1cHBvcnRzKTsgbm90ZSB0aGF0IGEgdXNlci1nZW5lcmF0ZWQgaW50ZXJydXB0aW9uIGlzIHNpZ25hbGxlZCBieQpyYWlzaW5nIHRoZSBcZXhjZXB0aW9ue0tleWJvYXJkSW50ZXJydXB0fSBleGNlcHRpb24uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiB3aGlsZSBUcnVlOgouLi4gICAgIHRyeToKLi4uICAgICAgICAgeCA9IGludChyYXdfaW5wdXQoIlBsZWFzZSBlbnRlciBhIG51bWJlcjogIikpCi4uLiAgICAgICAgIGJyZWFrCi4uLiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci4uLiAgICAgICAgIHByaW50ICJPb3BzISBUaGF0IHdhcyBubyB2YWxpZCBudW1iZXIuICBUcnkgYWdhaW4uLi4iCi4uLiAgICAgClxlbmR7dmVyYmF0aW19CgpUaGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgd29ya3MgYXMgZm9sbG93cy4KClxiZWdpbntpdGVtaXplfQpcaXRlbQpGaXJzdCwgdGhlIFxlbXBoe3RyeSBjbGF1c2V9ICh0aGUgc3RhdGVtZW50KHMpIGJldHdlZW4gdGhlClxrZXl3b3Jke3RyeX0gYW5kIFxrZXl3b3Jke2V4Y2VwdH0ga2V5d29yZHMpIGlzIGV4ZWN1dGVkLgoKXGl0ZW0KSWYgbm8gZXhjZXB0aW9uIG9jY3VycywgdGhlIFxlbXBoe2V4Y2VwdFwgY2xhdXNlfSBpcyBza2lwcGVkIGFuZApleGVjdXRpb24gb2YgdGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGlzIGZpbmlzaGVkLgoKXGl0ZW0KSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSB0cnkgY2xhdXNlLCB0aGUgcmVzdCBvZgp0aGUgY2xhdXNlIGlzIHNraXBwZWQuICBUaGVuIGlmIGl0cyB0eXBlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBuYW1lZAphZnRlciB0aGUgXGtleXdvcmR7ZXhjZXB0fSBrZXl3b3JkLCB0aGUgcmVzdCBvZiB0aGUgdHJ5IGNsYXVzZSBpcwpza2lwcGVkLCB0aGUgZXhjZXB0IGNsYXVzZSBpcyBleGVjdXRlZCwgYW5kIHRoZW4gZXhlY3V0aW9uIGNvbnRpbnVlcwphZnRlciB0aGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQuCgpcaXRlbQpJZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBleGNlcHRpb24gbmFtZWQgaW4gdGhlCmV4Y2VwdCBjbGF1c2UsIGl0IGlzIHBhc3NlZCBvbiB0byBvdXRlciBca2V5d29yZHt0cnl9IHN0YXRlbWVudHM7IGlmCm5vIGhhbmRsZXIgaXMgZm91bmQsIGl0IGlzIGFuIFxlbXBoe3VuaGFuZGxlZCBleGNlcHRpb259IGFuZCBleGVjdXRpb24Kc3RvcHMgd2l0aCBhIG1lc3NhZ2UgYXMgc2hvd24gYWJvdmUuCgpcZW5ke2l0ZW1pemV9CgpBIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgZXhjZXB0IGNsYXVzZSwgdG8Kc3BlY2lmeSBoYW5kbGVycyBmb3IgZGlmZmVyZW50IGV4Y2VwdGlvbnMuICBBdCBtb3N0IG9uZSBoYW5kbGVyIHdpbGwKYmUgZXhlY3V0ZWQuICBIYW5kbGVycyBvbmx5IGhhbmRsZSBleGNlcHRpb25zIHRoYXQgb2NjdXIgaW4gdGhlCmNvcnJlc3BvbmRpbmcgdHJ5IGNsYXVzZSwgbm90IGluIG90aGVyIGhhbmRsZXJzIG9mIHRoZSBzYW1lClxrZXl3b3Jke3RyeX0gc3RhdGVtZW50LiAgQW4gZXhjZXB0IGNsYXVzZSBtYXkgbmFtZSBtdWx0aXBsZSBleGNlcHRpb25zCmFzIGEgcGFyZW50aGVzaXplZCBsaXN0LCBmb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KLi4uIGV4Y2VwdCAoUnVudGltZUVycm9yLCBUeXBlRXJyb3IsIE5hbWVFcnJvcik6Ci4uLiAgICAgcGFzcwpcZW5ke3ZlcmJhdGltfQoKVGhlIGxhc3QgZXhjZXB0IGNsYXVzZSBtYXkgb21pdCB0aGUgZXhjZXB0aW9uIG5hbWUocyksIHRvIHNlcnZlIGFzIGEKd2lsZGNhcmQuICBVc2UgdGhpcyB3aXRoIGV4dHJlbWUgY2F1dGlvbiwgc2luY2UgaXQgaXMgZWFzeSB0byBtYXNrIGEKcmVhbCBwcm9ncmFtbWluZyBlcnJvciBpbiB0aGlzIHdheSEgIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcHJpbnQgYW4KZXJyb3IgbWVzc2FnZSBhbmQgdGhlbiByZS1yYWlzZSB0aGUgZXhjZXB0aW9uIChhbGxvd2luZyBhIGNhbGxlciB0bwpoYW5kbGUgdGhlIGV4Y2VwdGlvbiBhcyB3ZWxsKToKClxiZWdpbnt2ZXJiYXRpbX0KaW1wb3J0IHN5cwoKdHJ5OgogICAgZiA9IG9wZW4oJ215ZmlsZS50eHQnKQogICAgcyA9IGYucmVhZGxpbmUoKQogICAgaSA9IGludChzLnN0cmlwKCkpCmV4Y2VwdCBJT0Vycm9yLCAoZXJybm8sIHN0cmVycm9yKToKICAgIHByaW50ICJJL08gZXJyb3IoJXMpOiAlcyIgJSAoZXJybm8sIHN0cmVycm9yKQpleGNlcHQgVmFsdWVFcnJvcjoKICAgIHByaW50ICJDb3VsZCBub3QgY29udmVydCBkYXRhIHRvIGFuIGludGVnZXIuIgpleGNlcHQ6CiAgICBwcmludCAiVW5leHBlY3RlZCBlcnJvcjoiLCBzeXMuZXhjX2luZm8oKVswXQogICAgcmFpc2UKXGVuZHt2ZXJiYXRpbX0KClRoZSBca2V5d29yZHt0cnl9IFxsZG90c1wgXGtleXdvcmR7ZXhjZXB0fSBzdGF0ZW1lbnQgaGFzIGFuIG9wdGlvbmFsClxlbXBoe2Vsc2UgY2xhdXNlfSwgd2hpY2gsIHdoZW4gcHJlc2VudCwgbXVzdCBmb2xsb3cgYWxsIGV4Y2VwdApjbGF1c2VzLiAgSXQgaXMgdXNlZnVsIGZvciBjb2RlIHRoYXQgbXVzdCBiZSBleGVjdXRlZCBpZiB0aGUgdHJ5CmNsYXVzZSBkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24uICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06CiAgICB0cnk6CiAgICAgICAgZiA9IG9wZW4oYXJnLCAncicpCiAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICBwcmludCAnY2Fubm90IG9wZW4nLCBhcmcKICAgIGVsc2U6CiAgICAgICAgcHJpbnQgYXJnLCAnaGFzJywgbGVuKGYucmVhZGxpbmVzKCkpLCAnbGluZXMnCiAgICAgICAgZi5jbG9zZSgpClxlbmR7dmVyYmF0aW19CgpUaGUgdXNlIG9mIHRoZSBca2V5d29yZHtlbHNlfSBjbGF1c2UgaXMgYmV0dGVyIHRoYW4gYWRkaW5nIGFkZGl0aW9uYWwKY29kZSB0byB0aGUgXGtleXdvcmR7dHJ5fSBjbGF1c2UgYmVjYXVzZSBpdCBhdm9pZHMgYWNjaWRlbnRhbGx5CmNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB0aGF0IHdhc24ndCByYWlzZWQgYnkgdGhlIGNvZGUgYmVpbmcgcHJvdGVjdGVkCmJ5IHRoZSBca2V5d29yZHt0cnl9IFxsZG90c1wgXGtleXdvcmR7ZXhjZXB0fSBzdGF0ZW1lbnQuCgoKV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBpdCBtYXkgaGF2ZSBhbiBhc3NvY2lhdGVkIHZhbHVlLCBhbHNvIGtub3duIGFzCnRoZSBleGNlcHRpb24ncyBcZW1waHthcmd1bWVudH0uClRoZSBwcmVzZW5jZSBhbmQgdHlwZSBvZiB0aGUgYXJndW1lbnQgZGVwZW5kIG9uIHRoZSBleGNlcHRpb24gdHlwZS4KClRoZSBleGNlcHQgY2xhdXNlIG1heSBzcGVjaWZ5IGEgdmFyaWFibGUgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBuYW1lIChvciBsaXN0KS4KVGhlIHZhcmlhYmxlIGlzIGJvdW5kIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSB3aXRoIHRoZSBhcmd1bWVudHMgc3RvcmVkCmluIFxjb2Rle2luc3RhbmNlLmFyZ3N9LiAgRm9yIGNvbnZlbmllbmNlLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlCmRlZmluZXMgXG1ldGhvZHtfX2dldGl0ZW1fX30gYW5kIFxtZXRob2R7X19zdHJfX30gc28gdGhlIGFyZ3VtZW50cyBjYW4KYmUgYWNjZXNzZWQgb3IgcHJpbnRlZCBkaXJlY3RseSB3aXRob3V0IGhhdmluZyB0byByZWZlcmVuY2UgXGNvZGV7LmFyZ3N9LgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdHJ5OgouLi4gICAgcmFpc2UgRXhjZXB0aW9uKCdzcGFtJywgJ2VnZ3MnKQouLi4gZXhjZXB0IEV4Y2VwdGlvbiwgaW5zdDoKLi4uICAgIHByaW50IHR5cGUoaW5zdCkgICAgICMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZQouLi4gICAgcHJpbnQgaW5zdC5hcmdzICAgICAgIyBhcmd1bWVudHMgc3RvcmVkIGluIC5hcmdzCi4uLiAgICBwcmludCBpbnN0ICAgICAgICAgICAjIF9fc3RyX18gYWxsb3dzIGFyZ3MgdG8gcHJpbnRlZCBkaXJlY3RseQouLi4gICAgeCwgeSA9IGluc3QgICAgICAgICAgIyBfX2dldGl0ZW1fXyBhbGxvd3MgYXJncyB0byBiZSB1bnBhY2tlZCBkaXJlY3RseQouLi4gICAgcHJpbnQgJ3ggPScsIHgKLi4uICAgIHByaW50ICd5ID0nLCB5Ci4uLgo8dHlwZSAnaW5zdGFuY2UnPgooJ3NwYW0nLCAnZWdncycpCignc3BhbScsICdlZ2dzJykKeCA9IHNwYW0KeSA9IGVnZ3MKXGVuZHt2ZXJiYXRpbX0KCklmIGFuIGV4Y2VwdGlvbiBoYXMgYW4gYXJndW1lbnQsIGl0IGlzIHByaW50ZWQgYXMgdGhlIGxhc3QgcGFydAooYGRldGFpbCcpIG9mIHRoZSBtZXNzYWdlIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9ucy4KCkV4Y2VwdGlvbiBoYW5kbGVycyBkb24ndCBqdXN0IGhhbmRsZSBleGNlcHRpb25zIGlmIHRoZXkgb2NjdXIKaW1tZWRpYXRlbHkgaW4gdGhlIHRyeSBjbGF1c2UsIGJ1dCBhbHNvIGlmIHRoZXkgb2NjdXIgaW5zaWRlIGZ1bmN0aW9ucwp0aGF0IGFyZSBjYWxsZWQgKGV2ZW4gaW5kaXJlY3RseSkgaW4gdGhlIHRyeSBjbGF1c2UuCkZvciBleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZGVmIHRoaXNfZmFpbHMoKToKLi4uICAgICB4ID0gMS8wCi4uLiAKPj4+IHRyeToKLi4uICAgICB0aGlzX2ZhaWxzKCkKLi4uIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciwgZGV0YWlsOgouLi4gICAgIHByaW50ICdIYW5kbGluZyBydW4tdGltZSBlcnJvcjonLCBkZXRhaWwKLi4uIApIYW5kbGluZyBydW4tdGltZSBlcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8KXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntSYWlzaW5nIEV4Y2VwdGlvbnMgXGxhYmVse3JhaXNpbmd9fQoKVGhlIFxrZXl3b3Jke3JhaXNlfSBzdGF0ZW1lbnQgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIGZvcmNlIGEKc3BlY2lmaWVkIGV4Y2VwdGlvbiB0byBvY2N1ci4KRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiByYWlzZSBOYW1lRXJyb3IsICdIaVRoZXJlJwpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpOYW1lRXJyb3I6IEhpVGhlcmUKXGVuZHt2ZXJiYXRpbX0KClRoZSBmaXJzdCBhcmd1bWVudCB0byBca2V5d29yZHtyYWlzZX0gbmFtZXMgdGhlIGV4Y2VwdGlvbiB0byBiZQpyYWlzZWQuICBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uJ3MKYXJndW1lbnQuCgpJZiB5b3UgbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCBidXQgZG9uJ3QKaW50ZW5kIHRvIGhhbmRsZSBpdCwgYSBzaW1wbGVyIGZvcm0gb2YgdGhlIFxrZXl3b3Jke3JhaXNlfSBzdGF0ZW1lbnQKYWxsb3dzIHlvdSB0byByZS1yYWlzZSB0aGUgZXhjZXB0aW9uOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gdHJ5OgouLi4gICAgIHJhaXNlIE5hbWVFcnJvciwgJ0hpVGhlcmUnCi4uLiBleGNlcHQgTmFtZUVycm9yOgouLi4gICAgIHByaW50ICdBbiBleGNlcHRpb24gZmxldyBieSEnCi4uLiAgICAgcmFpc2UKLi4uCkFuIGV4Y2VwdGlvbiBmbGV3IGJ5IQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPwpOYW1lRXJyb3I6IEhpVGhlcmUKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntVc2VyLWRlZmluZWQgRXhjZXB0aW9ucyBcbGFiZWx7dXNlckV4Y2VwdGlvbnN9fQoKUHJvZ3JhbXMgbWF5IG5hbWUgdGhlaXIgb3duIGV4Y2VwdGlvbnMgYnkgY3JlYXRpbmcgYSBuZXcgZXhjZXB0aW9uCmNsYXNzLiAgRXhjZXB0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGJlIGRlcml2ZWQgZnJvbSB0aGUKXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gIEZvcgpleGFtcGxlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gY2xhc3MgTXlFcnJvcihFeGNlcHRpb24pOgouLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6Ci4uLiAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQouLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOgouLi4gICAgICAgICByZXR1cm4gcmVwcihzZWxmLnZhbHVlKQouLi4gCj4+PiB0cnk6Ci4uLiAgICAgcmFpc2UgTXlFcnJvcigyKjIpCi4uLiBleGNlcHQgTXlFcnJvciwgZToKLi4uICAgICBwcmludCAnTXkgZXhjZXB0aW9uIG9jY3VycmVkLCB2YWx1ZTonLCBlLnZhbHVlCi4uLiAKTXkgZXhjZXB0aW9uIG9jY3VycmVkLCB2YWx1ZTogNAo+Pj4gcmFpc2UgTXlFcnJvciwgJ29vcHMhJwpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwpfX21haW5fXy5NeUVycm9yOiAnb29wcyEnClxlbmR7dmVyYmF0aW19CgpFeGNlcHRpb24gY2xhc3NlcyBjYW4gYmUgZGVmaW5lZCB3aGljaCBkbyBhbnl0aGluZyBhbnkgb3RoZXIgY2xhc3MgY2FuCmRvLCBidXQgYXJlIHVzdWFsbHkga2VwdCBzaW1wbGUsIG9mdGVuIG9ubHkgb2ZmZXJpbmcgYSBudW1iZXIgb2YKYXR0cmlidXRlcyB0aGF0IGFsbG93IGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0byBiZSBleHRyYWN0ZWQgYnkKaGFuZGxlcnMgZm9yIHRoZSBleGNlcHRpb24uICBXaGVuIGNyZWF0aW5nIGEgbW9kdWxlIHdoaWNoIGNhbiByYWlzZQpzZXZlcmFsIGRpc3RpbmN0IGVycm9ycywgYSBjb21tb24gcHJhY3RpY2UgaXMgdG8gY3JlYXRlIGEgYmFzZSBjbGFzcwpmb3IgZXhjZXB0aW9ucyBkZWZpbmVkIGJ5IHRoYXQgbW9kdWxlLCBhbmQgc3ViY2xhc3MgdGhhdCB0byBjcmVhdGUKc3BlY2lmaWMgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGRpZmZlcmVudCBlcnJvciBjb25kaXRpb25zOgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIiIiQmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucyBpbiB0aGlzIG1vZHVsZS4iIiIKICAgIHBhc3MKCmNsYXNzIElucHV0RXJyb3IoRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIHJhaXNlZCBmb3IgZXJyb3JzIGluIHRoZSBpbnB1dC4KCiAgICBBdHRyaWJ1dGVzOgogICAgICAgIGV4cHJlc3Npb24gLS0gaW5wdXQgZXhwcmVzc2lvbiBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQKICAgICAgICBtZXNzYWdlIC0tIGV4cGxhbmF0aW9uIG9mIHRoZSBlcnJvcgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHJlc3Npb24sIG1lc3NhZ2UpOgogICAgICAgIHNlbGYuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24KICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCgpjbGFzcyBUcmFuc2l0aW9uRXJyb3IoRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYW4gb3BlcmF0aW9uIGF0dGVtcHRzIGEgc3RhdGUgdHJhbnNpdGlvbiB0aGF0J3Mgbm90CiAgICBhbGxvd2VkLgoKICAgIEF0dHJpYnV0ZXM6CiAgICAgICAgcHJldmlvdXMgLS0gc3RhdGUgYXQgYmVnaW5uaW5nIG9mIHRyYW5zaXRpb24KICAgICAgICBuZXh0IC0tIGF0dGVtcHRlZCBuZXcgc3RhdGUKICAgICAgICBtZXNzYWdlIC0tIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGUgc3BlY2lmaWMgdHJhbnNpdGlvbiBpcyBub3QgYWxsb3dlZAogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByZXZpb3VzLCBuZXh0LCBtZXNzYWdlKToKICAgICAgICBzZWxmLnByZXZpb3VzID0gcHJldmlvdXMKICAgICAgICBzZWxmLm5leHQgPSBuZXh0CiAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQpcZW5ke3ZlcmJhdGltfQoKTW9zdCBleGNlcHRpb25zIGFyZSBkZWZpbmVkIHdpdGggbmFtZXMgdGhhdCBlbmQgaW4gYGBFcnJvciwnJyBzaW1pbGFyCnRvIHRoZSBuYW1pbmcgb2YgdGhlIHN0YW5kYXJkIGV4Y2VwdGlvbnMuCgpNYW55IHN0YW5kYXJkIG1vZHVsZXMgZGVmaW5lIHRoZWlyIG93biBleGNlcHRpb25zIHRvIHJlcG9ydCBlcnJvcnMKdGhhdCBtYXkgb2NjdXIgaW4gZnVuY3Rpb25zIHRoZXkgZGVmaW5lLiAgTW9yZSBpbmZvcm1hdGlvbiBvbiBjbGFzc2VzCmlzIHByZXNlbnRlZCBpbiBjaGFwdGVyIFxyZWZ7Y2xhc3Nlc30sIGBgQ2xhc3Nlcy4nJwoKClxzZWN0aW9ue0RlZmluaW5nIENsZWFuLXVwIEFjdGlvbnMgXGxhYmVse2NsZWFudXB9fQoKVGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGhhcyBhbm90aGVyIG9wdGlvbmFsIGNsYXVzZSB3aGljaCBpcwppbnRlbmRlZCB0byBkZWZpbmUgY2xlYW4tdXAgYWN0aW9ucyB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgdW5kZXIgYWxsCmNpcmN1bXN0YW5jZXMuICBGb3IgZXhhbXBsZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHRyeToKLi4uICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAouLi4gZmluYWxseToKLi4uICAgICBwcmludCAnR29vZGJ5ZSwgd29ybGQhJwouLi4gCkdvb2RieWUsIHdvcmxkIQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPwpLZXlib2FyZEludGVycnVwdApcZW5ke3ZlcmJhdGltfQoKQSBcZW1waHtmaW5hbGx5IGNsYXVzZX0gaXMgZXhlY3V0ZWQgd2hldGhlciBvciBub3QgYW4gZXhjZXB0aW9uIGhhcwpvY2N1cnJlZCBpbiB0aGUgdHJ5IGNsYXVzZS4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCwgaXQgaXMKcmUtcmFpc2VkIGFmdGVyIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZC4gIFRoZSBmaW5hbGx5IGNsYXVzZSBpcwphbHNvIGV4ZWN1dGVkIGBgb24gdGhlIHdheSBvdXQnJyB3aGVuIHRoZSBca2V5d29yZHt0cnl9IHN0YXRlbWVudCBpcwpsZWZ0IHZpYSBhIFxrZXl3b3Jke2JyZWFrfSBvciBca2V5d29yZHtyZXR1cm59IHN0YXRlbWVudC4KClRoZSBjb2RlIGluIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyB1c2VmdWwgZm9yIHJlbGVhc2luZyBleHRlcm5hbApyZXNvdXJjZXMgKHN1Y2ggYXMgZmlsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyksIHJlZ2FyZGxlc3Mgb2YKd2hldGhlciBvciBub3QgdGhlIHVzZSBvZiB0aGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWwuCgpBIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IG11c3QgZWl0aGVyIGhhdmUgb25lIG9yIG1vcmUgZXhjZXB0IGNsYXVzZXMKb3Igb25lIGZpbmFsbHkgY2xhdXNlLCBidXQgbm90IGJvdGguCgoKXGNoYXB0ZXJ7Q2xhc3NlcyBcbGFiZWx7Y2xhc3Nlc319CgpQeXRob24ncyBjbGFzcyBtZWNoYW5pc20gYWRkcyBjbGFzc2VzIHRvIHRoZSBsYW5ndWFnZSB3aXRoIGEgbWluaW11bQpvZiBuZXcgc3ludGF4IGFuZCBzZW1hbnRpY3MuICBJdCBpcyBhIG1peHR1cmUgb2YgdGhlIGNsYXNzIG1lY2hhbmlzbXMKZm91bmQgaW4gXENwcHt9IGFuZCBNb2R1bGEtMy4gIEFzIGlzIHRydWUgZm9yIG1vZHVsZXMsIGNsYXNzZXMgaW4gUHl0aG9uCmRvIG5vdCBwdXQgYW4gYWJzb2x1dGUgYmFycmllciBiZXR3ZWVuIGRlZmluaXRpb24gYW5kIHVzZXIsIGJ1dCByYXRoZXIKcmVseSBvbiB0aGUgcG9saXRlbmVzcyBvZiB0aGUgdXNlciBub3QgdG8gYGBicmVhayBpbnRvIHRoZQpkZWZpbml0aW9uLicnICBUaGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgY2xhc3NlcyBhcmUgcmV0YWluZWQKd2l0aCBmdWxsIHBvd2VyLCBob3dldmVyOiB0aGUgY2xhc3MgaW5oZXJpdGFuY2UgbWVjaGFuaXNtIGFsbG93cwptdWx0aXBsZSBiYXNlIGNsYXNzZXMsIGEgZGVyaXZlZCBjbGFzcyBjYW4gb3ZlcnJpZGUgYW55IG1ldGhvZHMgb2YgaXRzCmJhc2UgY2xhc3Mgb3IgY2xhc3NlcywgYSBtZXRob2QgY2FuIGNhbGwgdGhlIG1ldGhvZCBvZiBhIGJhc2UgY2xhc3Mgd2l0aCB0aGUKc2FtZSBuYW1lLiAgT2JqZWN0cyBjYW4gY29udGFpbiBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHByaXZhdGUgZGF0YS4KCkluIFxDcHB7fSB0ZXJtaW5vbG9neSwgYWxsIGNsYXNzIG1lbWJlcnMgKGluY2x1ZGluZyB0aGUgZGF0YSBtZW1iZXJzKSBhcmUKXGVtcGh7cHVibGljfSwgYW5kIGFsbCBtZW1iZXIgZnVuY3Rpb25zIGFyZSBcZW1waHt2aXJ0dWFsfS4gIFRoZXJlIGFyZQpubyBzcGVjaWFsIGNvbnN0cnVjdG9ycyBvciBkZXN0cnVjdG9ycy4gIEFzIGluIE1vZHVsYS0zLCB0aGVyZSBhcmUgbm8Kc2hvcnRoYW5kcyBmb3IgcmVmZXJlbmNpbmcgdGhlIG9iamVjdCdzIG1lbWJlcnMgZnJvbSBpdHMgbWV0aG9kczogdGhlCm1ldGhvZCBmdW5jdGlvbiBpcyBkZWNsYXJlZCB3aXRoIGFuIGV4cGxpY2l0IGZpcnN0IGFyZ3VtZW50CnJlcHJlc2VudGluZyB0aGUgb2JqZWN0LCB3aGljaCBpcyBwcm92aWRlZCBpbXBsaWNpdGx5IGJ5IHRoZSBjYWxsLiAgQXMKaW4gU21hbGx0YWxrLCBjbGFzc2VzIHRoZW1zZWx2ZXMgYXJlIG9iamVjdHMsIGFsYmVpdCBpbiB0aGUgd2lkZXIKc2Vuc2Ugb2YgdGhlIHdvcmQ6IGluIFB5dGhvbiwgYWxsIGRhdGEgdHlwZXMgYXJlIG9iamVjdHMuICBUaGlzCnByb3ZpZGVzIHNlbWFudGljcyBmb3IgaW1wb3J0aW5nIGFuZCByZW5hbWluZy4gIFVubGlrZSAKXENwcHt9IGFuZCBNb2R1bGEtMywgYnVpbHQtaW4gdHlwZXMgY2FuIGJlIHVzZWQgYXMgYmFzZSBjbGFzc2VzIGZvcgpleHRlbnNpb24gYnkgdGhlIHVzZXIuICBBbHNvLCBsaWtlIGluIFxDcHB7fSBidXQgdW5saWtlIGluIE1vZHVsYS0zLCBtb3N0CmJ1aWx0LWluIG9wZXJhdG9ycyB3aXRoIHNwZWNpYWwgc3ludGF4IChhcml0aG1ldGljIG9wZXJhdG9ycywKc3Vic2NyaXB0aW5nIGV0Yy4pIGNhbiBiZSByZWRlZmluZWQgZm9yIGNsYXNzIGluc3RhbmNlcy4KClxzZWN0aW9ue0EgV29yZCBBYm91dCBUZXJtaW5vbG9neSBcbGFiZWx7dGVybWlub2xvZ3l9fQoKTGFja2luZyB1bml2ZXJzYWxseSBhY2NlcHRlZCB0ZXJtaW5vbG9neSB0byB0YWxrIGFib3V0IGNsYXNzZXMsIEkgd2lsbAptYWtlIG9jY2FzaW9uYWwgdXNlIG9mIFNtYWxsdGFsayBhbmQgXENwcHt9IHRlcm1zLiAgKEkgd291bGQgdXNlIE1vZHVsYS0zCnRlcm1zLCBzaW5jZSBpdHMgb2JqZWN0LW9yaWVudGVkIHNlbWFudGljcyBhcmUgY2xvc2VyIHRvIHRob3NlIG9mClB5dGhvbiB0aGFuIFxDcHAsIGJ1dCBJIGV4cGVjdCB0aGF0IGZldyByZWFkZXJzIGhhdmUgaGVhcmQgb2YgaXQuKQoKSSBhbHNvIGhhdmUgdG8gd2FybiB5b3UgdGhhdCB0aGVyZSdzIGEgdGVybWlub2xvZ2ljYWwgcGl0ZmFsbCBmb3IKb2JqZWN0LW9yaWVudGVkIHJlYWRlcnM6IHRoZSB3b3JkIGBgb2JqZWN0JycgaW4gUHl0aG9uIGRvZXMgbm90Cm5lY2Vzc2FyaWx5IG1lYW4gYSBjbGFzcyBpbnN0YW5jZS4gIExpa2UgXENwcHt9IGFuZCBNb2R1bGEtMywgYW5kCnVubGlrZSBTbWFsbHRhbGssIG5vdCBhbGwgdHlwZXMgaW4gUHl0aG9uIGFyZSBjbGFzc2VzOiB0aGUgYmFzaWMKYnVpbHQtaW4gdHlwZXMgbGlrZSBpbnRlZ2VycyBhbmQgbGlzdHMgYXJlIG5vdCwgYW5kIGV2ZW4gc29tZXdoYXQgbW9yZQpleG90aWMgdHlwZXMgbGlrZSBmaWxlcyBhcmVuJ3QuICBIb3dldmVyLCBcZW1waHthbGx9IFB5dGhvbiB0eXBlcwpzaGFyZSBhIGxpdHRsZSBiaXQgb2YgY29tbW9uIHNlbWFudGljcyB0aGF0IGlzIGJlc3QgZGVzY3JpYmVkIGJ5IHVzaW5nCnRoZSB3b3JkIG9iamVjdC4KCk9iamVjdHMgaGF2ZSBpbmRpdmlkdWFsaXR5LCBhbmQgbXVsdGlwbGUgbmFtZXMgKGluIG11bHRpcGxlIHNjb3BlcykKY2FuIGJlIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdC4gIFRoaXMgaXMga25vd24gYXMgYWxpYXNpbmcgaW4gb3RoZXIKbGFuZ3VhZ2VzLiAgVGhpcyBpcyB1c3VhbGx5IG5vdCBhcHByZWNpYXRlZCBvbiBhIGZpcnN0IGdsYW5jZSBhdApQeXRob24sIGFuZCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgd2hlbiBkZWFsaW5nIHdpdGggaW1tdXRhYmxlIGJhc2ljCnR5cGVzIChudW1iZXJzLCBzdHJpbmdzLCB0dXBsZXMpLiAgSG93ZXZlciwgYWxpYXNpbmcgaGFzIGFuCihpbnRlbmRlZCEpIGVmZmVjdCBvbiB0aGUgc2VtYW50aWNzIG9mIFB5dGhvbiBjb2RlIGludm9sdmluZyBtdXRhYmxlCm9iamVjdHMgc3VjaCBhcyBsaXN0cywgZGljdGlvbmFyaWVzLCBhbmQgbW9zdCB0eXBlcyByZXByZXNlbnRpbmcKZW50aXRpZXMgb3V0c2lkZSB0aGUgcHJvZ3JhbSAoZmlsZXMsIHdpbmRvd3MsIGV0Yy4pLiAgVGhpcyBpcyB1c3VhbGx5CnVzZWQgdG8gdGhlIGJlbmVmaXQgb2YgdGhlIHByb2dyYW0sIHNpbmNlIGFsaWFzZXMgYmVoYXZlIGxpa2UgcG9pbnRlcnMKaW4gc29tZSByZXNwZWN0cy4gIEZvciBleGFtcGxlLCBwYXNzaW5nIGFuIG9iamVjdCBpcyBjaGVhcCBzaW5jZSBvbmx5CmEgcG9pbnRlciBpcyBwYXNzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uOyBhbmQgaWYgYSBmdW5jdGlvbiBtb2RpZmllcwphbiBvYmplY3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LCB0aGUgY2FsbGVyIHdpbGwgc2VlIHRoZSBjaGFuZ2UgLS0tIHRoaXMKZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdHdvIGRpZmZlcmVudCBhcmd1bWVudCBwYXNzaW5nIG1lY2hhbmlzbXMgYXMgaW4KUGFzY2FsLgoKClxzZWN0aW9ue1B5dGhvbiBTY29wZXMgYW5kIE5hbWUgU3BhY2VzIFxsYWJlbHtzY29wZXN9fQoKQmVmb3JlIGludHJvZHVjaW5nIGNsYXNzZXMsIEkgZmlyc3QgaGF2ZSB0byB0ZWxsIHlvdSBzb21ldGhpbmcgYWJvdXQKUHl0aG9uJ3Mgc2NvcGUgcnVsZXMuICBDbGFzcyBkZWZpbml0aW9ucyBwbGF5IHNvbWUgbmVhdCB0cmlja3Mgd2l0aApuYW1lc3BhY2VzLCBhbmQgeW91IG5lZWQgdG8ga25vdyBob3cgc2NvcGVzIGFuZCBuYW1lc3BhY2VzIHdvcmsgdG8KZnVsbHkgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uICBJbmNpZGVudGFsbHksIGtub3dsZWRnZSBhYm91dCB0aGlzCnN1YmplY3QgaXMgdXNlZnVsIGZvciBhbnkgYWR2YW5jZWQgUHl0aG9uIHByb2dyYW1tZXIuCgpMZXQncyBiZWdpbiB3aXRoIHNvbWUgZGVmaW5pdGlvbnMuCgpBIFxlbXBoe25hbWVzcGFjZX0gaXMgYSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gb2JqZWN0cy4gIE1vc3QKbmFtZXNwYWNlcyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIFB5dGhvbiBkaWN0aW9uYXJpZXMsIGJ1dAp0aGF0J3Mgbm9ybWFsbHkgbm90IG5vdGljZWFibGUgaW4gYW55IHdheSAoZXhjZXB0IGZvciBwZXJmb3JtYW5jZSksCmFuZCBpdCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuICBFeGFtcGxlcyBvZiBuYW1lc3BhY2VzIGFyZTogdGhlIHNldApvZiBidWlsdC1pbiBuYW1lcyAoZnVuY3Rpb25zIHN1Y2ggYXMgXGZ1bmN0aW9ue2FicygpfSwgYW5kIGJ1aWx0LWluCmV4Y2VwdGlvbiBuYW1lcyk7IHRoZSBnbG9iYWwgbmFtZXMgaW4gYSBtb2R1bGU7IGFuZCB0aGUgbG9jYWwgbmFtZXMgaW4KYSBmdW5jdGlvbiBpbnZvY2F0aW9uLiAgSW4gYSBzZW5zZSB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0CmFsc28gZm9ybSBhIG5hbWVzcGFjZS4gIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8ga25vdyBhYm91dCBuYW1lc3BhY2VzCmlzIHRoYXQgdGhlcmUgaXMgYWJzb2x1dGVseSBubyByZWxhdGlvbiBiZXR3ZWVuIG5hbWVzIGluIGRpZmZlcmVudApuYW1lc3BhY2VzOyBmb3IgaW5zdGFuY2UsIHR3byBkaWZmZXJlbnQgbW9kdWxlcyBtYXkgYm90aCBkZWZpbmUgYQpmdW5jdGlvbiBgYG1heGltaXplJycgd2l0aG91dCBjb25mdXNpb24gLS0tIHVzZXJzIG9mIHRoZSBtb2R1bGVzIG11c3QKcHJlZml4IGl0IHdpdGggdGhlIG1vZHVsZSBuYW1lLgoKQnkgdGhlIHdheSwgSSB1c2UgdGhlIHdvcmQgXGVtcGh7YXR0cmlidXRlfSBmb3IgYW55IG5hbWUgZm9sbG93aW5nIGEKZG90IC0tLSBmb3IgZXhhbXBsZSwgaW4gdGhlIGV4cHJlc3Npb24gXGNvZGV7ei5yZWFsfSwgXGNvZGV7cmVhbH0gaXMKYW4gYXR0cmlidXRlIG9mIHRoZSBvYmplY3QgXGNvZGV7en0uICBTdHJpY3RseSBzcGVha2luZywgcmVmZXJlbmNlcyB0bwpuYW1lcyBpbiBtb2R1bGVzIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlczogaW4gdGhlIGV4cHJlc3Npb24KXGNvZGV7bW9kbmFtZS5mdW5jbmFtZX0sIFxjb2Rle21vZG5hbWV9IGlzIGEgbW9kdWxlIG9iamVjdCBhbmQKXGNvZGV7ZnVuY25hbWV9IGlzIGFuIGF0dHJpYnV0ZSBvZiBpdC4gIEluIHRoaXMgY2FzZSB0aGVyZSBoYXBwZW5zIHRvCmJlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgYmV0d2VlbiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcyBhbmQgdGhlCmdsb2JhbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBtb2R1bGU6IHRoZXkgc2hhcmUgdGhlIHNhbWUgbmFtZXNwYWNlIQpcZm9vdG5vdGV7CiAgICAgICAgRXhjZXB0IGZvciBvbmUgdGhpbmcuICBNb2R1bGUgb2JqZWN0cyBoYXZlIGEgc2VjcmV0IHJlYWQtb25seQogICAgICAgIGF0dHJpYnV0ZSBjYWxsZWQgXG1lbWJlcntfX2RpY3RfX30gd2hpY2ggcmV0dXJucyB0aGUgZGljdGlvbmFyeQogICAgICAgIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBtb2R1bGUncyBuYW1lc3BhY2U7IHRoZSBuYW1lCiAgICAgICAgXG1lbWJlcntfX2RpY3RfX30gaXMgYW4gYXR0cmlidXRlIGJ1dCBub3QgYSBnbG9iYWwgbmFtZS4KICAgICAgICBPYnZpb3VzbHksIHVzaW5nIHRoaXMgdmlvbGF0ZXMgdGhlIGFic3RyYWN0aW9uIG9mIG5hbWVzcGFjZQogICAgICAgIGltcGxlbWVudGF0aW9uLCBhbmQgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gdGhpbmdzIGxpa2UKICAgICAgICBwb3N0LW1vcnRlbSBkZWJ1Z2dlcnMuCn0KCkF0dHJpYnV0ZXMgbWF5IGJlIHJlYWQtb25seSBvciB3cml0YWJsZS4gIEluIHRoZSBsYXR0ZXIgY2FzZSwKYXNzaWdubWVudCB0byBhdHRyaWJ1dGVzIGlzIHBvc3NpYmxlLiAgTW9kdWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRhYmxlOgp5b3UgY2FuIHdyaXRlIFxzYW1we21vZG5hbWUudGhlX2Fuc3dlciA9IDQyfS4gIFdyaXRhYmxlIGF0dHJpYnV0ZXMgbWF5CmFsc28gYmUgZGVsZXRlZCB3aXRoIHRoZSBca2V5d29yZHtkZWx9IHN0YXRlbWVudC4gIEZvciBleGFtcGxlLApcc2FtcHtkZWwgbW9kbmFtZS50aGVfYW5zd2VyfSB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlClxtZW1iZXJ7dGhlX2Fuc3dlcn0gZnJvbSB0aGUgb2JqZWN0IG5hbWVkIGJ5IFxjb2Rle21vZG5hbWV9LgoKTmFtZSBzcGFjZXMgYXJlIGNyZWF0ZWQgYXQgZGlmZmVyZW50IG1vbWVudHMgYW5kIGhhdmUgZGlmZmVyZW50CmxpZmV0aW1lcy4gIFRoZSBuYW1lc3BhY2UgY29udGFpbmluZyB0aGUgYnVpbHQtaW4gbmFtZXMgaXMgY3JlYXRlZAp3aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RhcnRzIHVwLCBhbmQgaXMgbmV2ZXIgZGVsZXRlZC4gIFRoZQpnbG9iYWwgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBjcmVhdGVkIHdoZW4gdGhlIG1vZHVsZSBkZWZpbml0aW9uCmlzIHJlYWQgaW47IG5vcm1hbGx5LCBtb2R1bGUgbmFtZXNwYWNlcyBhbHNvIGxhc3QgdW50aWwgdGhlCmludGVycHJldGVyIHF1aXRzLiAgVGhlIHN0YXRlbWVudHMgZXhlY3V0ZWQgYnkgdGhlIHRvcC1sZXZlbAppbnZvY2F0aW9uIG9mIHRoZSBpbnRlcnByZXRlciwgZWl0aGVyIHJlYWQgZnJvbSBhIHNjcmlwdCBmaWxlIG9yCmludGVyYWN0aXZlbHksIGFyZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBtb2R1bGUgY2FsbGVkClxtb2R1bGV7X19tYWluX199LCBzbyB0aGV5IGhhdmUgdGhlaXIgb3duIGdsb2JhbCBuYW1lc3BhY2UuICAoVGhlCmJ1aWx0LWluIG5hbWVzIGFjdHVhbGx5IGFsc28gbGl2ZSBpbiBhIG1vZHVsZTsgdGhpcyBpcyBjYWxsZWQKXG1vZHVsZXtfX2J1aWx0aW5fX30uKQoKVGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgYSBmdW5jdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzCmNhbGxlZCwgYW5kIGRlbGV0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyBvciByYWlzZXMgYW4gZXhjZXB0aW9uCnRoYXQgaXMgbm90IGhhbmRsZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4gIChBY3R1YWxseSwgZm9yZ2V0dGluZyB3b3VsZApiZSBhIGJldHRlciB3YXkgdG8gZGVzY3JpYmUgd2hhdCBhY3R1YWxseSBoYXBwZW5zLikgIE9mIGNvdXJzZSwKcmVjdXJzaXZlIGludm9jYXRpb25zIGVhY2ggaGF2ZSB0aGVpciBvd24gbG9jYWwgbmFtZXNwYWNlLgoKQSBcZW1waHtzY29wZX0gaXMgYSB0ZXh0dWFsIHJlZ2lvbiBvZiBhIFB5dGhvbiBwcm9ncmFtIHdoZXJlIGEKbmFtZXNwYWNlIGlzIGRpcmVjdGx5IGFjY2Vzc2libGUuICBgYERpcmVjdGx5IGFjY2Vzc2libGUnJyBoZXJlIG1lYW5zCnRoYXQgYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgbmFtZSBhdHRlbXB0cyB0byBmaW5kIHRoZSBuYW1lIGluCnRoZSBuYW1lc3BhY2UuCgpBbHRob3VnaCBzY29wZXMgYXJlIGRldGVybWluZWQgc3RhdGljYWxseSwgdGhleSBhcmUgdXNlZCBkeW5hbWljYWxseS4KQXQgYW55IHRpbWUgZHVyaW5nIGV4ZWN1dGlvbiwgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlIG5lc3RlZCBzY29wZXMgd2hvc2UKbmFtZXNwYWNlcyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZTogdGhlIGlubmVybW9zdCBzY29wZSwgd2hpY2ggaXMgc2VhcmNoZWQKZmlyc3QsIGNvbnRhaW5zIHRoZSBsb2NhbCBuYW1lczsgdGhlIG5hbWVzcGFjZXMgb2YgYW55IGVuY2xvc2luZwpmdW5jdGlvbnMsIHdoaWNoIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZTsKdGhlIG1pZGRsZSBzY29wZSwgc2VhcmNoZWQgbmV4dCwgY29udGFpbnMgdGhlIGN1cnJlbnQgbW9kdWxlJ3MgZ2xvYmFsIG5hbWVzOwphbmQgdGhlIG91dGVybW9zdCBzY29wZSAoc2VhcmNoZWQgbGFzdCkgaXMgdGhlIG5hbWVzcGFjZSBjb250YWluaW5nIGJ1aWx0LWluCm5hbWVzLgoKSWYgYSBuYW1lIGlzIGRlY2xhcmVkIGdsb2JhbCwgdGhlbiBhbGwgcmVmZXJlbmNlcyBhbmQgYXNzaWdubWVudHMgZ28KZGlyZWN0bHkgdG8gdGhlIG1pZGRsZSBzY29wZSBjb250YWluaW5nIHRoZSBtb2R1bGUncyBnbG9iYWwgbmFtZXMuCk90aGVyd2lzZSwgYWxsIHZhcmlhYmxlcyBmb3VuZCBvdXRzaWRlIG9mIHRoZSBpbm5lcm1vc3Qgc2NvcGUgYXJlIHJlYWQtb25seS4KClVzdWFsbHksIHRoZSBsb2NhbCBzY29wZSByZWZlcmVuY2VzIHRoZSBsb2NhbCBuYW1lcyBvZiB0aGUgKHRleHR1YWxseSkKY3VycmVudCBmdW5jdGlvbi4gIE91dHNpZGUgb2YgZnVuY3Rpb25zLCB0aGUgbG9jYWwgc2NvcGUgcmVmZXJlbmNlcwp0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGdsb2JhbCBzY29wZTogdGhlIG1vZHVsZSdzIG5hbWVzcGFjZS4KQ2xhc3MgZGVmaW5pdGlvbnMgcGxhY2UgeWV0IGFub3RoZXIgbmFtZXNwYWNlIGluIHRoZSBsb2NhbCBzY29wZS4KCkl0IGlzIGltcG9ydGFudCB0byByZWFsaXplIHRoYXQgc2NvcGVzIGFyZSBkZXRlcm1pbmVkIHRleHR1YWxseTogdGhlCmdsb2JhbCBzY29wZSBvZiBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBtb2R1bGUgaXMgdGhhdCBtb2R1bGUncwpuYW1lc3BhY2UsIG5vIG1hdHRlciBmcm9tIHdoZXJlIG9yIGJ5IHdoYXQgYWxpYXMgdGhlIGZ1bmN0aW9uIGlzCmNhbGxlZC4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYWN0dWFsIHNlYXJjaCBmb3IgbmFtZXMgaXMgZG9uZQpkeW5hbWljYWxseSwgYXQgcnVuIHRpbWUgLS0tIGhvd2V2ZXIsIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIGlzCmV2b2x2aW5nIHRvd2FyZHMgc3RhdGljIG5hbWUgcmVzb2x1dGlvbiwgYXQgYGBjb21waWxlJycgdGltZSwgc28gZG9uJ3QKcmVseSBvbiBkeW5hbWljIG5hbWUgcmVzb2x1dGlvbiEgIChJbiBmYWN0LCBsb2NhbCB2YXJpYWJsZXMgYXJlCmFscmVhZHkgZGV0ZXJtaW5lZCBzdGF0aWNhbGx5LikKCkEgc3BlY2lhbCBxdWlyayBvZiBQeXRob24gaXMgdGhhdCBhc3NpZ25tZW50cyBhbHdheXMgZ28gaW50byB0aGUKaW5uZXJtb3N0IHNjb3BlLiAgQXNzaWdubWVudHMgZG8gbm90IGNvcHkgZGF0YSAtLS0gdGhleSBqdXN0CmJpbmQgbmFtZXMgdG8gb2JqZWN0cy4gIFRoZSBzYW1lIGlzIHRydWUgZm9yIGRlbGV0aW9uczogdGhlIHN0YXRlbWVudApcc2FtcHtkZWwgeH0gcmVtb3ZlcyB0aGUgYmluZGluZyBvZiBcY29kZXt4fSBmcm9tIHRoZSBuYW1lc3BhY2UKcmVmZXJlbmNlZCBieSB0aGUgbG9jYWwgc2NvcGUuICBJbiBmYWN0LCBhbGwgb3BlcmF0aW9ucyB0aGF0IGludHJvZHVjZQpuZXcgbmFtZXMgdXNlIHRoZSBsb2NhbCBzY29wZTogaW4gcGFydGljdWxhciwgaW1wb3J0IHN0YXRlbWVudHMgYW5kCmZ1bmN0aW9uIGRlZmluaXRpb25zIGJpbmQgdGhlIG1vZHVsZSBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBsb2NhbApzY29wZS4gIChUaGUgXGtleXdvcmR7Z2xvYmFsfSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdApwYXJ0aWN1bGFyIHZhcmlhYmxlcyBsaXZlIGluIHRoZSBnbG9iYWwgc2NvcGUuKQoKClxzZWN0aW9ue0EgRmlyc3QgTG9vayBhdCBDbGFzc2VzIFxsYWJlbHtmaXJzdENsYXNzZXN9fQoKQ2xhc3NlcyBpbnRyb2R1Y2UgYSBsaXR0bGUgYml0IG9mIG5ldyBzeW50YXgsIHRocmVlIG5ldyBvYmplY3QgdHlwZXMsCmFuZCBzb21lIG5ldyBzZW1hbnRpY3MuCgoKXHN1YnNlY3Rpb257Q2xhc3MgRGVmaW5pdGlvbiBTeW50YXggXGxhYmVse2NsYXNzRGVmaW5pdGlvbn19CgpUaGUgc2ltcGxlc3QgZm9ybSBvZiBjbGFzcyBkZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpczoKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgQ2xhc3NOYW1lOgogICAgPHN0YXRlbWVudC0xPgogICAgLgogICAgLgogICAgLgogICAgPHN0YXRlbWVudC1OPgpcZW5ke3ZlcmJhdGltfQoKQ2xhc3MgZGVmaW5pdGlvbnMsIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKFxrZXl3b3Jke2RlZn0gc3RhdGVtZW50cykgbXVzdCBiZSBleGVjdXRlZCBiZWZvcmUgdGhleSBoYXZlIGFueQplZmZlY3QuICAoWW91IGNvdWxkIGNvbmNlaXZhYmx5IHBsYWNlIGEgY2xhc3MgZGVmaW5pdGlvbiBpbiBhIGJyYW5jaApvZiBhbiBca2V5d29yZHtpZn0gc3RhdGVtZW50LCBvciBpbnNpZGUgYSBmdW5jdGlvbi4pCgpJbiBwcmFjdGljZSwgdGhlIHN0YXRlbWVudHMgaW5zaWRlIGEgY2xhc3MgZGVmaW5pdGlvbiB3aWxsIHVzdWFsbHkgYmUKZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGJ1dCBvdGhlciBzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLCBhbmQgc29tZXRpbWVzCnVzZWZ1bCAtLS0gd2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgbGF0ZXIuICBUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMKaW5zaWRlIGEgY2xhc3Mgbm9ybWFsbHkgaGF2ZSBhIHBlY3VsaWFyIGZvcm0gb2YgYXJndW1lbnQgbGlzdCwKZGljdGF0ZWQgYnkgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIG1ldGhvZHMgLS0tIGFnYWluLCB0aGlzIGlzCmV4cGxhaW5lZCBsYXRlci4KCldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGVudGVyZWQsIGEgbmV3IG5hbWVzcGFjZSBpcyBjcmVhdGVkLCBhbmQKdXNlZCBhcyB0aGUgbG9jYWwgc2NvcGUgLS0tIHRodXMsIGFsbCBhc3NpZ25tZW50cyB0byBsb2NhbCB2YXJpYWJsZXMKZ28gaW50byB0aGlzIG5ldyBuYW1lc3BhY2UuICBJbiBwYXJ0aWN1bGFyLCBmdW5jdGlvbiBkZWZpbml0aW9ucyBiaW5kCnRoZSBuYW1lIG9mIHRoZSBuZXcgZnVuY3Rpb24gaGVyZS4KCldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGxlZnQgbm9ybWFsbHkgKHZpYSB0aGUgZW5kKSwgYSBcZW1waHtjbGFzcwpvYmplY3R9IGlzIGNyZWF0ZWQuICBUaGlzIGlzIGJhc2ljYWxseSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBjb250ZW50cwpvZiB0aGUgbmFtZXNwYWNlIGNyZWF0ZWQgYnkgdGhlIGNsYXNzIGRlZmluaXRpb247IHdlJ2xsIGxlYXJuIG1vcmUKYWJvdXQgY2xhc3Mgb2JqZWN0cyBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgVGhlIG9yaWdpbmFsIGxvY2FsIHNjb3BlCih0aGUgb25lIGluIGVmZmVjdCBqdXN0IGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbnMgd2FzIGVudGVyZWQpIGlzCnJlaW5zdGF0ZWQsIGFuZCB0aGUgY2xhc3Mgb2JqZWN0IGlzIGJvdW5kIGhlcmUgdG8gdGhlIGNsYXNzIG5hbWUgZ2l2ZW4KaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gaGVhZGVyIChcY2xhc3N7Q2xhc3NOYW1lfSBpbiB0aGUgZXhhbXBsZSkuCgoKXHN1YnNlY3Rpb257Q2xhc3MgT2JqZWN0cyBcbGFiZWx7Y2xhc3NPYmplY3RzfX0KCkNsYXNzIG9iamVjdHMgc3VwcG9ydCB0d28ga2luZHMgb2Ygb3BlcmF0aW9uczogYXR0cmlidXRlIHJlZmVyZW5jZXMKYW5kIGluc3RhbnRpYXRpb24uCgpcZW1waHtBdHRyaWJ1dGUgcmVmZXJlbmNlc30gdXNlIHRoZSBzdGFuZGFyZCBzeW50YXggdXNlZCBmb3IgYWxsCmF0dHJpYnV0ZSByZWZlcmVuY2VzIGluIFB5dGhvbjogXGNvZGV7b2JqLm5hbWV9LiAgVmFsaWQgYXR0cmlidXRlCm5hbWVzIGFyZSBhbGwgdGhlIG5hbWVzIHRoYXQgd2VyZSBpbiB0aGUgY2xhc3MncyBuYW1lc3BhY2Ugd2hlbiB0aGUKY2xhc3Mgb2JqZWN0IHdhcyBjcmVhdGVkLiAgU28sIGlmIHRoZSBjbGFzcyBkZWZpbml0aW9uIGxvb2tlZCBsaWtlCnRoaXM6CgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIE15Q2xhc3M6CiAgICAiQSBzaW1wbGUgZXhhbXBsZSBjbGFzcyIKICAgIGkgPSAxMjM0NQogICAgZGVmIGYoc2VsZik6CiAgICAgICAgcmV0dXJuICdoZWxsbyB3b3JsZCcKXGVuZHt2ZXJiYXRpbX0KCnRoZW4gXGNvZGV7TXlDbGFzcy5pfSBhbmQgXGNvZGV7TXlDbGFzcy5mfSBhcmUgdmFsaWQgYXR0cmlidXRlCnJlZmVyZW5jZXMsIHJldHVybmluZyBhbiBpbnRlZ2VyIGFuZCBhIG1ldGhvZCBvYmplY3QsIHJlc3BlY3RpdmVseS4KQ2xhc3MgYXR0cmlidXRlcyBjYW4gYWxzbyBiZSBhc3NpZ25lZCB0bywgc28geW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlCm9mIFxjb2Rle015Q2xhc3MuaX0gYnkgYXNzaWdubWVudC4gIFxtZW1iZXJ7X19kb2NfX30gaXMgYWxzbyBhIHZhbGlkCmF0dHJpYnV0ZSwgcmV0dXJuaW5nIHRoZSBkb2NzdHJpbmcgYmVsb25naW5nIHRvIHRoZSBjbGFzczogXGNvZGV7IkEKc2ltcGxlIGV4YW1wbGUgY2xhc3MifS4gCgpDbGFzcyBcZW1waHtpbnN0YW50aWF0aW9ufSB1c2VzIGZ1bmN0aW9uIG5vdGF0aW9uLiAgSnVzdCBwcmV0ZW5kIHRoYXQKdGhlIGNsYXNzIG9iamVjdCBpcyBhIHBhcmFtZXRlcmxlc3MgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3Cmluc3RhbmNlIG9mIHRoZSBjbGFzcy4gIEZvciBleGFtcGxlIChhc3N1bWluZyB0aGUgYWJvdmUgY2xhc3MpOgoKXGJlZ2lue3ZlcmJhdGltfQp4ID0gTXlDbGFzcygpClxlbmR7dmVyYmF0aW19CgpjcmVhdGVzIGEgbmV3IFxlbXBoe2luc3RhbmNlfSBvZiB0aGUgY2xhc3MgYW5kIGFzc2lnbnMgdGhpcyBvYmplY3QgdG8KdGhlIGxvY2FsIHZhcmlhYmxlIFxjb2Rle3h9LgoKVGhlIGluc3RhbnRpYXRpb24gb3BlcmF0aW9uIChgYGNhbGxpbmcnJyBhIGNsYXNzIG9iamVjdCkgY3JlYXRlcyBhbgplbXB0eSBvYmplY3QuICBNYW55IGNsYXNzZXMgbGlrZSB0byBjcmVhdGUgb2JqZWN0cyBpbiBhIGtub3duIGluaXRpYWwKc3RhdGUuICBUaGVyZWZvcmUgYSBjbGFzcyBtYXkgZGVmaW5lIGEgc3BlY2lhbCBtZXRob2QgbmFtZWQKXG1ldGhvZHtfX2luaXRfXygpfSwgbGlrZSB0aGlzOgoKXGJlZ2lue3ZlcmJhdGltfQogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZGF0YSA9IFtdClxlbmR7dmVyYmF0aW19CgpXaGVuIGEgY2xhc3MgZGVmaW5lcyBhbiBcbWV0aG9ke19faW5pdF9fKCl9IG1ldGhvZCwgY2xhc3MKaW5zdGFudGlhdGlvbiBhdXRvbWF0aWNhbGx5IGludm9rZXMgXG1ldGhvZHtfX2luaXRfXygpfSBmb3IgdGhlCm5ld2x5LWNyZWF0ZWQgY2xhc3MgaW5zdGFuY2UuICBTbyBpbiB0aGlzIGV4YW1wbGUsIGEgbmV3LCBpbml0aWFsaXplZAppbnN0YW5jZSBjYW4gYmUgb2J0YWluZWQgYnk6CgpcYmVnaW57dmVyYmF0aW19CnggPSBNeUNsYXNzKCkKXGVuZHt2ZXJiYXRpbX0KCk9mIGNvdXJzZSwgdGhlIFxtZXRob2R7X19pbml0X18oKX0gbWV0aG9kIG1heSBoYXZlIGFyZ3VtZW50cyBmb3IKZ3JlYXRlciBmbGV4aWJpbGl0eS4gIEluIHRoYXQgY2FzZSwgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSBjbGFzcwppbnN0YW50aWF0aW9uIG9wZXJhdG9yIGFyZSBwYXNzZWQgb24gdG8gXG1ldGhvZHtfX2luaXRfXygpfS4gIEZvcgpleGFtcGxlLAoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gY2xhc3MgQ29tcGxleDoKLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhbHBhcnQsIGltYWdwYXJ0KToKLi4uICAgICAgICAgc2VsZi5yID0gcmVhbHBhcnQKLi4uICAgICAgICAgc2VsZi5pID0gaW1hZ3BhcnQKLi4uIAo+Pj4geCA9IENvbXBsZXgoMy4wLCAtNC41KQo+Pj4geC5yLCB4LmkKKDMuMCwgLTQuNSkKXGVuZHt2ZXJiYXRpbX0KCgpcc3Vic2VjdGlvbntJbnN0YW5jZSBPYmplY3RzIFxsYWJlbHtpbnN0YW5jZU9iamVjdHN9fQoKTm93IHdoYXQgY2FuIHdlIGRvIHdpdGggaW5zdGFuY2Ugb2JqZWN0cz8gIFRoZSBvbmx5IG9wZXJhdGlvbnMKdW5kZXJzdG9vZCBieSBpbnN0YW5jZSBvYmplY3RzIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcy4gIFRoZXJlIGFyZQp0d28ga2luZHMgb2YgdmFsaWQgYXR0cmlidXRlIG5hbWVzLgoKVGhlIGZpcnN0IEknbGwgY2FsbCBcZW1waHtkYXRhIGF0dHJpYnV0ZXN9LiAgVGhlc2UgY29ycmVzcG9uZCB0bwpgYGluc3RhbmNlIHZhcmlhYmxlcycnIGluIFNtYWxsdGFsaywgYW5kIHRvIGBgZGF0YSBtZW1iZXJzJycgaW4KXENwcC4gIERhdGEgYXR0cmlidXRlcyBuZWVkIG5vdCBiZSBkZWNsYXJlZDsgbGlrZSBsb2NhbCB2YXJpYWJsZXMsCnRoZXkgc3ByaW5nIGludG8gZXhpc3RlbmNlIHdoZW4gdGhleSBhcmUgZmlyc3QgYXNzaWduZWQgdG8uICBGb3IKZXhhbXBsZSwgaWYgXGNvZGV7eH0gaXMgdGhlIGluc3RhbmNlIG9mIFxjbGFzc3tNeUNsYXNzfSBjcmVhdGVkIGFib3ZlLAp0aGUgZm9sbG93aW5nIHBpZWNlIG9mIGNvZGUgd2lsbCBwcmludCB0aGUgdmFsdWUgXGNvZGV7MTZ9LCB3aXRob3V0CmxlYXZpbmcgYSB0cmFjZToKClxiZWdpbnt2ZXJiYXRpbX0KeC5jb3VudGVyID0gMQp3aGlsZSB4LmNvdW50ZXIgPCAxMDoKICAgIHguY291bnRlciA9IHguY291bnRlciAqIDIKcHJpbnQgeC5jb3VudGVyCmRlbCB4LmNvdW50ZXIKXGVuZHt2ZXJiYXRpbX0KClRoZSBzZWNvbmQga2luZCBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcyB1bmRlcnN0b29kIGJ5IGluc3RhbmNlIG9iamVjdHMKYXJlIFxlbXBoe21ldGhvZHN9LiAgQSBtZXRob2QgaXMgYSBmdW5jdGlvbiB0aGF0IGBgYmVsb25ncyB0bycnIGFuCm9iamVjdC4gIChJbiBQeXRob24sIHRoZSB0ZXJtIG1ldGhvZCBpcyBub3QgdW5pcXVlIHRvIGNsYXNzIGluc3RhbmNlczoKb3RoZXIgb2JqZWN0IHR5cGVzIGNhbiBoYXZlIG1ldGhvZHMgYXMgd2VsbC4gIEZvciBleGFtcGxlLCBsaXN0IG9iamVjdHMgaGF2ZQptZXRob2RzIGNhbGxlZCBhcHBlbmQsIGluc2VydCwgcmVtb3ZlLCBzb3J0LCBhbmQgc28gb24uICBIb3dldmVyLApiZWxvdywgd2UnbGwgdXNlIHRoZSB0ZXJtIG1ldGhvZCBleGNsdXNpdmVseSB0byBtZWFuIG1ldGhvZHMgb2YgY2xhc3MKaW5zdGFuY2Ugb2JqZWN0cywgdW5sZXNzIGV4cGxpY2l0bHkgc3RhdGVkIG90aGVyd2lzZS4pCgpWYWxpZCBtZXRob2QgbmFtZXMgb2YgYW4gaW5zdGFuY2Ugb2JqZWN0IGRlcGVuZCBvbiBpdHMgY2xhc3MuICBCeQpkZWZpbml0aW9uLCBhbGwgYXR0cmlidXRlcyBvZiBhIGNsYXNzIHRoYXQgYXJlICh1c2VyLWRlZmluZWQpIGZ1bmN0aW9uIApvYmplY3RzIGRlZmluZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb2YgaXRzIGluc3RhbmNlcy4gIFNvIGluIG91cgpleGFtcGxlLCBcY29kZXt4LmZ9IGlzIGEgdmFsaWQgbWV0aG9kIHJlZmVyZW5jZSwgc2luY2UKXGNvZGV7TXlDbGFzcy5mfSBpcyBhIGZ1bmN0aW9uLCBidXQgXGNvZGV7eC5pfSBpcyBub3QsIHNpbmNlClxjb2Rle015Q2xhc3MuaX0gaXMgbm90LiAgQnV0IFxjb2Rle3guZn0gaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzClxjb2Rle015Q2xhc3MuZn0gLS0tIGl0IGlzIGEgXG9iaW5kZXh7bWV0aG9kfVxlbXBoe21ldGhvZCBvYmplY3R9LCBub3QKYSBmdW5jdGlvbiBvYmplY3QuCgoKXHN1YnNlY3Rpb257TWV0aG9kIE9iamVjdHMgXGxhYmVse21ldGhvZE9iamVjdHN9fQoKVXN1YWxseSwgYSBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5OgoKXGJlZ2lue3ZlcmJhdGltfQp4LmYoKQpcZW5ke3ZlcmJhdGltfQoKSW4gb3VyIGV4YW1wbGUsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyBcY29kZXsnaGVsbG8gd29ybGQnfS4KSG93ZXZlciwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIGEgbWV0aG9kIHJpZ2h0IGF3YXk6Clxjb2Rle3guZn0gaXMgYSBtZXRob2Qgb2JqZWN0LCBhbmQgY2FuIGJlIHN0b3JlZCBhd2F5IGFuZCBjYWxsZWQgYXQgYQpsYXRlciB0aW1lLiAgRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CnhmID0geC5mCndoaWxlIFRydWU6CiAgICBwcmludCB4ZigpClxlbmR7dmVyYmF0aW19Cgp3aWxsIGNvbnRpbnVlIHRvIHByaW50IFxzYW1we2hlbGxvIHdvcmxkfSB1bnRpbCB0aGUgZW5kIG9mIHRpbWUuCgpXaGF0IGV4YWN0bHkgaGFwcGVucyB3aGVuIGEgbWV0aG9kIGlzIGNhbGxlZD8gIFlvdSBtYXkgaGF2ZSBub3RpY2VkCnRoYXQgXGNvZGV7eC5mKCl9IHdhcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCBhYm92ZSwgZXZlbiB0aG91Z2gKdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIFxtZXRob2R7Zn0gc3BlY2lmaWVkIGFuIGFyZ3VtZW50LiAgV2hhdApoYXBwZW5lZCB0byB0aGUgYXJndW1lbnQ/ICBTdXJlbHkgUHl0aG9uIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBhCmZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQgaXMgY2FsbGVkIHdpdGhvdXQgYW55IC0tLSBldmVuIGlmCnRoZSBhcmd1bWVudCBpc24ndCBhY3R1YWxseSB1c2VkLi4uCgpBY3R1YWxseSwgeW91IG1heSBoYXZlIGd1ZXNzZWQgdGhlIGFuc3dlcjogdGhlIHNwZWNpYWwgdGhpbmcgYWJvdXQKbWV0aG9kcyBpcyB0aGF0IHRoZSBvYmplY3QgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUKZnVuY3Rpb24uICBJbiBvdXIgZXhhbXBsZSwgdGhlIGNhbGwgXGNvZGV7eC5mKCl9IGlzIGV4YWN0bHkgZXF1aXZhbGVudAp0byBcY29kZXtNeUNsYXNzLmYoeCl9LiAgSW4gZ2VuZXJhbCwgY2FsbGluZyBhIG1ldGhvZCB3aXRoIGEgbGlzdCBvZgpcdmFye259IGFyZ3VtZW50cyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24Kd2l0aCBhbiBhcmd1bWVudCBsaXN0IHRoYXQgaXMgY3JlYXRlZCBieSBpbnNlcnRpbmcgdGhlIG1ldGhvZCdzIG9iamVjdApiZWZvcmUgdGhlIGZpcnN0IGFyZ3VtZW50LgoKSWYgeW91IHN0aWxsIGRvbid0IHVuZGVyc3RhbmQgaG93IG1ldGhvZHMgd29yaywgYSBsb29rIGF0IHRoZQppbXBsZW1lbnRhdGlvbiBjYW4gcGVyaGFwcyBjbGFyaWZ5IG1hdHRlcnMuICBXaGVuIGFuIGluc3RhbmNlCmF0dHJpYnV0ZSBpcyByZWZlcmVuY2VkIHRoYXQgaXNuJ3QgYSBkYXRhIGF0dHJpYnV0ZSwgaXRzIGNsYXNzIGlzCnNlYXJjaGVkLiAgSWYgdGhlIG5hbWUgZGVub3RlcyBhIHZhbGlkIGNsYXNzIGF0dHJpYnV0ZSB0aGF0IGlzIGEKZnVuY3Rpb24gb2JqZWN0LCBhIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSBwYWNraW5nIChwb2ludGVycyB0bykKdGhlIGluc3RhbmNlIG9iamVjdCBhbmQgdGhlIGZ1bmN0aW9uIG9iamVjdCBqdXN0IGZvdW5kIHRvZ2V0aGVyIGluIGFuCmFic3RyYWN0IG9iamVjdDogdGhpcyBpcyB0aGUgbWV0aG9kIG9iamVjdC4gIFdoZW4gdGhlIG1ldGhvZCBvYmplY3QgaXMKY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCwgaXQgaXMgdW5wYWNrZWQgYWdhaW4sIGEgbmV3IGFyZ3VtZW50Cmxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgaW5zdGFuY2Ugb2JqZWN0IGFuZCB0aGUgb3JpZ2luYWwgYXJndW1lbnQKbGlzdCwgYW5kIHRoZSBmdW5jdGlvbiBvYmplY3QgaXMgY2FsbGVkIHdpdGggdGhpcyBuZXcgYXJndW1lbnQgbGlzdC4KCgpcc2VjdGlvbntSYW5kb20gUmVtYXJrcyBcbGFiZWx7cmVtYXJrc319CgolIFtUaGVzZSBzaG91bGQgcGVyaGFwcyBiZSBwbGFjZWQgbW9yZSBjYXJlZnVsbHkuLi5dCgoKRGF0YSBhdHRyaWJ1dGVzIG92ZXJyaWRlIG1ldGhvZCBhdHRyaWJ1dGVzIHdpdGggdGhlIHNhbWUgbmFtZTsgdG8KYXZvaWQgYWNjaWRlbnRhbCBuYW1lIGNvbmZsaWN0cywgd2hpY2ggbWF5IGNhdXNlIGhhcmQtdG8tZmluZCBidWdzIGluCmxhcmdlIHByb2dyYW1zLCBpdCBpcyB3aXNlIHRvIHVzZSBzb21lIGtpbmQgb2YgY29udmVudGlvbiB0aGF0Cm1pbmltaXplcyB0aGUgY2hhbmNlIG9mIGNvbmZsaWN0cy4gIFBvc3NpYmxlIGNvbnZlbnRpb25zIGluY2x1ZGUKY2FwaXRhbGl6aW5nIG1ldGhvZCBuYW1lcywgcHJlZml4aW5nIGRhdGEgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBzbWFsbAp1bmlxdWUgc3RyaW5nIChwZXJoYXBzIGp1c3QgYW4gdW5kZXJzY29yZSksIG9yIHVzaW5nIHZlcmJzIGZvciBtZXRob2RzCmFuZCBub3VucyBmb3IgZGF0YSBhdHRyaWJ1dGVzLgoKCkRhdGEgYXR0cmlidXRlcyBtYXkgYmUgcmVmZXJlbmNlZCBieSBtZXRob2RzIGFzIHdlbGwgYXMgYnkgb3JkaW5hcnkKdXNlcnMgKGBgY2xpZW50cycnKSBvZiBhbiBvYmplY3QuICBJbiBvdGhlciB3b3JkcywgY2xhc3NlcyBhcmUgbm90CnVzYWJsZSB0byBpbXBsZW1lbnQgcHVyZSBhYnN0cmFjdCBkYXRhIHR5cGVzLiAgSW4gZmFjdCwgbm90aGluZyBpbgpQeXRob24gbWFrZXMgaXQgcG9zc2libGUgdG8gZW5mb3JjZSBkYXRhIGhpZGluZyAtLS0gaXQgaXMgYWxsIGJhc2VkCnVwb24gY29udmVudGlvbi4gIChPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiwKd3JpdHRlbiBpbiBDLCBjYW4gY29tcGxldGVseSBoaWRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGNvbnRyb2wKYWNjZXNzIHRvIGFuIG9iamVjdCBpZiBuZWNlc3Nhcnk7IHRoaXMgY2FuIGJlIHVzZWQgYnkgZXh0ZW5zaW9ucyB0bwpQeXRob24gd3JpdHRlbiBpbiBDLikKCgpDbGllbnRzIHNob3VsZCB1c2UgZGF0YSBhdHRyaWJ1dGVzIHdpdGggY2FyZSAtLS0gY2xpZW50cyBtYXkgbWVzcyB1cAppbnZhcmlhbnRzIG1haW50YWluZWQgYnkgdGhlIG1ldGhvZHMgYnkgc3RhbXBpbmcgb24gdGhlaXIgZGF0YQphdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IGNsaWVudHMgbWF5IGFkZCBkYXRhIGF0dHJpYnV0ZXMgb2YgdGhlaXIgb3duIHRvCmFuIGluc3RhbmNlIG9iamVjdCB3aXRob3V0IGFmZmVjdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIG1ldGhvZHMsIGFzCmxvbmcgYXMgbmFtZSBjb25mbGljdHMgYXJlIGF2b2lkZWQgLS0tIGFnYWluLCBhIG5hbWluZyBjb252ZW50aW9uIGNhbgpzYXZlIGEgbG90IG9mIGhlYWRhY2hlcyBoZXJlLgoKClRoZXJlIGlzIG5vIHNob3J0aGFuZCBmb3IgcmVmZXJlbmNpbmcgZGF0YSBhdHRyaWJ1dGVzIChvciBvdGhlcgptZXRob2RzISkgZnJvbSB3aXRoaW4gbWV0aG9kcy4gIEkgZmluZCB0aGF0IHRoaXMgYWN0dWFsbHkgaW5jcmVhc2VzCnRoZSByZWFkYWJpbGl0eSBvZiBtZXRob2RzOiB0aGVyZSBpcyBubyBjaGFuY2Ugb2YgY29uZnVzaW5nIGxvY2FsCnZhcmlhYmxlcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzIHdoZW4gZ2xhbmNpbmcgdGhyb3VnaCBhIG1ldGhvZC4KCgpDb252ZW50aW9uYWxseSwgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIG1ldGhvZHMgaXMgb2Z0ZW4gY2FsbGVkClxjb2Rle3NlbGZ9LiAgVGhpcyBpcyBub3RoaW5nIG1vcmUgdGhhbiBhIGNvbnZlbnRpb246IHRoZSBuYW1lClxjb2Rle3NlbGZ9IGhhcyBhYnNvbHV0ZWx5IG5vIHNwZWNpYWwgbWVhbmluZyB0byBQeXRob24uICAoTm90ZSwKaG93ZXZlciwgdGhhdCBieSBub3QgZm9sbG93aW5nIHRoZSBjb252ZW50aW9uIHlvdXIgY29kZSBtYXkgYmUgbGVzcwpyZWFkYWJsZSBieSBvdGhlciBQeXRob24gcHJvZ3JhbW1lcnMsIGFuZCBpdCBpcyBhbHNvIGNvbmNlaXZhYmxlIHRoYXQKYSBcZW1waHtjbGFzcyBicm93c2VyfSBwcm9ncmFtIGJlIHdyaXR0ZW4gd2hpY2ggcmVsaWVzIHVwb24gc3VjaCBhCmNvbnZlbnRpb24uKQoKCkFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBhIGNsYXNzIGF0dHJpYnV0ZSBkZWZpbmVzIGEgbWV0aG9kIGZvcgppbnN0YW5jZXMgb2YgdGhhdCBjbGFzcy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdGhhdCB0aGUgZnVuY3Rpb24KZGVmaW5pdGlvbiBpcyB0ZXh0dWFsbHkgZW5jbG9zZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb246IGFzc2lnbmluZyBhCmZ1bmN0aW9uIG9iamVjdCB0byBhIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBjbGFzcyBpcyBhbHNvIG9rLiAgRm9yCmV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CiMgRnVuY3Rpb24gZGVmaW5lZCBvdXRzaWRlIHRoZSBjbGFzcwpkZWYgZjEoc2VsZiwgeCwgeSk6CiAgICByZXR1cm4gbWluKHgsIHgreSkKCmNsYXNzIEM6CiAgICBmID0gZjEKICAgIGRlZiBnKHNlbGYpOgogICAgICAgIHJldHVybiAnaGVsbG8gd29ybGQnCiAgICBoID0gZwpcZW5ke3ZlcmJhdGltfQoKTm93IFxjb2Rle2Z9LCBcY29kZXtnfSBhbmQgXGNvZGV7aH0gYXJlIGFsbCBhdHRyaWJ1dGVzIG9mIGNsYXNzClxjbGFzc3tDfSB0aGF0IHJlZmVyIHRvIGZ1bmN0aW9uIG9iamVjdHMsIGFuZCBjb25zZXF1ZW50bHkgdGhleSBhcmUgYWxsCm1ldGhvZHMgb2YgaW5zdGFuY2VzIG9mIFxjbGFzc3tDfSAtLS0gXGNvZGV7aH0gYmVpbmcgZXhhY3RseSBlcXVpdmFsZW50CnRvIFxjb2Rle2d9LiAgTm90ZSB0aGF0IHRoaXMgcHJhY3RpY2UgdXN1YWxseSBvbmx5IHNlcnZlcyB0byBjb25mdXNlCnRoZSByZWFkZXIgb2YgYSBwcm9ncmFtLgoKCk1ldGhvZHMgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBieSB1c2luZyBtZXRob2QgYXR0cmlidXRlcyBvZiB0aGUKXGNvZGV7c2VsZn0gYXJndW1lbnQ6CgpcYmVnaW57dmVyYmF0aW19CmNsYXNzIEJhZzoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmRhdGEgPSBbXQogICAgZGVmIGFkZChzZWxmLCB4KToKICAgICAgICBzZWxmLmRhdGEuYXBwZW5kKHgpCiAgICBkZWYgYWRkdHdpY2Uoc2VsZiwgeCk6CiAgICAgICAgc2VsZi5hZGQoeCkKICAgICAgICBzZWxmLmFkZCh4KQpcZW5ke3ZlcmJhdGltfQoKTWV0aG9kcyBtYXkgcmVmZXJlbmNlIGdsb2JhbCBuYW1lcyBpbiB0aGUgc2FtZSB3YXkgYXMgb3JkaW5hcnkKZnVuY3Rpb25zLiAgVGhlIGdsb2JhbCBzY29wZSBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgaXMgdGhlIG1vZHVsZQpjb250YWluaW5nIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKFRoZSBjbGFzcyBpdHNlbGYgaXMgbmV2ZXIgdXNlZCBhcyBhCmdsb2JhbCBzY29wZSEpICBXaGlsZSBvbmUgcmFyZWx5IGVuY291bnRlcnMgYSBnb29kIHJlYXNvbiBmb3IgdXNpbmcKZ2xvYmFsIGRhdGEgaW4gYSBtZXRob2QsIHRoZXJlIGFyZSBtYW55IGxlZ2l0aW1hdGUgdXNlcyBvZiB0aGUgZ2xvYmFsCnNjb3BlOiBmb3Igb25lIHRoaW5nLCBmdW5jdGlvbnMgYW5kIG1vZHVsZXMgaW1wb3J0ZWQgaW50byB0aGUgZ2xvYmFsCnNjb3BlIGNhbiBiZSB1c2VkIGJ5IG1ldGhvZHMsIGFzIHdlbGwgYXMgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRlZmluZWQKaW4gaXQuICBVc3VhbGx5LCB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgbWV0aG9kIGlzIGl0c2VsZiBkZWZpbmVkIGluCnRoaXMgZ2xvYmFsIHNjb3BlLCBhbmQgaW4gdGhlIG5leHQgc2VjdGlvbiB3ZSdsbCBmaW5kIHNvbWUgZ29vZApyZWFzb25zIHdoeSBhIG1ldGhvZCB3b3VsZCB3YW50IHRvIHJlZmVyZW5jZSBpdHMgb3duIGNsYXNzIQoKClxzZWN0aW9ue0luaGVyaXRhbmNlIFxsYWJlbHtpbmhlcml0YW5jZX19CgpPZiBjb3Vyc2UsIGEgbGFuZ3VhZ2UgZmVhdHVyZSB3b3VsZCBub3QgYmUgd29ydGh5IG9mIHRoZSBuYW1lIGBgY2xhc3MnJwp3aXRob3V0IHN1cHBvcnRpbmcgaW5oZXJpdGFuY2UuICBUaGUgc3ludGF4IGZvciBhIGRlcml2ZWQgY2xhc3MKZGVmaW5pdGlvbiBsb29rcyBhcyBmb2xsb3dzOgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBEZXJpdmVkQ2xhc3NOYW1lKEJhc2VDbGFzc05hbWUpOgogICAgPHN0YXRlbWVudC0xPgogICAgLgogICAgLgogICAgLgogICAgPHN0YXRlbWVudC1OPgpcZW5ke3ZlcmJhdGltfQoKVGhlIG5hbWUgXGNsYXNze0Jhc2VDbGFzc05hbWV9IG11c3QgYmUgZGVmaW5lZCBpbiBhIHNjb3BlIGNvbnRhaW5pbmcKdGhlIGRlcml2ZWQgY2xhc3MgZGVmaW5pdGlvbi4gIEluc3RlYWQgb2YgYSBiYXNlIGNsYXNzIG5hbWUsIGFuCmV4cHJlc3Npb24gaXMgYWxzbyBhbGxvd2VkLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgYmFzZSBjbGFzcyBpcwpkZWZpbmVkIGluIGFub3RoZXIgbW9kdWxlLAoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBEZXJpdmVkQ2xhc3NOYW1lKG1vZG5hbWUuQmFzZUNsYXNzTmFtZSk6ClxlbmR7dmVyYmF0aW19CgpFeGVjdXRpb24gb2YgYSBkZXJpdmVkIGNsYXNzIGRlZmluaXRpb24gcHJvY2VlZHMgdGhlIHNhbWUgYXMgZm9yIGEKYmFzZSBjbGFzcy4gIFdoZW4gdGhlIGNsYXNzIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgdGhlIGJhc2UgY2xhc3MgaXMKcmVtZW1iZXJlZC4gIFRoaXMgaXMgdXNlZCBmb3IgcmVzb2x2aW5nIGF0dHJpYnV0ZSByZWZlcmVuY2VzOiBpZiBhCnJlcXVlc3RlZCBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIGluIHRoZSBjbGFzcywgaXQgaXMgc2VhcmNoZWQgaW4gdGhlCmJhc2UgY2xhc3MuICBUaGlzIHJ1bGUgaXMgYXBwbGllZCByZWN1cnNpdmVseSBpZiB0aGUgYmFzZSBjbGFzcyBpdHNlbGYKaXMgZGVyaXZlZCBmcm9tIHNvbWUgb3RoZXIgY2xhc3MuCgpUaGVyZSdzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBpbnN0YW50aWF0aW9uIG9mIGRlcml2ZWQgY2xhc3NlczoKXGNvZGV7RGVyaXZlZENsYXNzTmFtZSgpfSBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcy4gIE1ldGhvZApyZWZlcmVuY2VzIGFyZSByZXNvbHZlZCBhcyBmb2xsb3dzOiB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBhdHRyaWJ1dGUKaXMgc2VhcmNoZWQsIGRlc2NlbmRpbmcgZG93biB0aGUgY2hhaW4gb2YgYmFzZSBjbGFzc2VzIGlmIG5lY2Vzc2FyeSwKYW5kIHRoZSBtZXRob2QgcmVmZXJlbmNlIGlzIHZhbGlkIGlmIHRoaXMgeWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LgoKRGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZSBtZXRob2RzIG9mIHRoZWlyIGJhc2UgY2xhc3Nlcy4gIEJlY2F1c2UKbWV0aG9kcyBoYXZlIG5vIHNwZWNpYWwgcHJpdmlsZWdlcyB3aGVuIGNhbGxpbmcgb3RoZXIgbWV0aG9kcyBvZiB0aGUKc2FtZSBvYmplY3QsIGEgbWV0aG9kIG9mIGEgYmFzZSBjbGFzcyB0aGF0IGNhbGxzIGFub3RoZXIgbWV0aG9kCmRlZmluZWQgaW4gdGhlIHNhbWUgYmFzZSBjbGFzcywgbWF5IGluIGZhY3QgZW5kIHVwIGNhbGxpbmcgYSBtZXRob2Qgb2YKYSBkZXJpdmVkIGNsYXNzIHRoYXQgb3ZlcnJpZGVzIGl0LiAgKEZvciBcQ3Bwe30gcHJvZ3JhbW1lcnM6IGFsbCBtZXRob2RzCmluIFB5dGhvbiBhcmUgZWZmZWN0aXZlbHkgXGtleXdvcmR7dmlydHVhbH0uKQoKQW4gb3ZlcnJpZGluZyBtZXRob2QgaW4gYSBkZXJpdmVkIGNsYXNzIG1heSBpbiBmYWN0IHdhbnQgdG8gZXh0ZW5kCnJhdGhlciB0aGFuIHNpbXBseSByZXBsYWNlIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLgpUaGVyZSBpcyBhIHNpbXBsZSB3YXkgdG8gY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgZGlyZWN0bHk6IGp1c3QKY2FsbCBcc2FtcHtCYXNlQ2xhc3NOYW1lLm1ldGhvZG5hbWUoc2VsZiwgYXJndW1lbnRzKX0uICBUaGlzIGlzCm9jY2FzaW9uYWxseSB1c2VmdWwgdG8gY2xpZW50cyBhcyB3ZWxsLiAgKE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3MgaWYKdGhlIGJhc2UgY2xhc3MgaXMgZGVmaW5lZCBvciBpbXBvcnRlZCBkaXJlY3RseSBpbiB0aGUgZ2xvYmFsIHNjb3BlLikKCgpcc3Vic2VjdGlvbntNdWx0aXBsZSBJbmhlcml0YW5jZSBcbGFiZWx7bXVsdGlwbGV9fQoKUHl0aG9uIHN1cHBvcnRzIGEgbGltaXRlZCBmb3JtIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlIGFzIHdlbGwuICBBCmNsYXNzIGRlZmluaXRpb24gd2l0aCBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgbG9va3MgYXMgZm9sbG93czoKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgRGVyaXZlZENsYXNzTmFtZShCYXNlMSwgQmFzZTIsIEJhc2UzKToKICAgIDxzdGF0ZW1lbnQtMT4KICAgIC4KICAgIC4KICAgIC4KICAgIDxzdGF0ZW1lbnQtTj4KXGVuZHt2ZXJiYXRpbX0KClRoZSBvbmx5IHJ1bGUgbmVjZXNzYXJ5IHRvIGV4cGxhaW4gdGhlIHNlbWFudGljcyBpcyB0aGUgcmVzb2x1dGlvbgpydWxlIHVzZWQgZm9yIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2VzLiAgVGhpcyBpcyBkZXB0aC1maXJzdCwKbGVmdC10by1yaWdodC4gIFRodXMsIGlmIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgaW4KXGNsYXNze0Rlcml2ZWRDbGFzc05hbWV9LCBpdCBpcyBzZWFyY2hlZCBpbiBcY2xhc3N7QmFzZTF9LCB0aGVuCihyZWN1cnNpdmVseSkgaW4gdGhlIGJhc2UgY2xhc3NlcyBvZiBcY2xhc3N7QmFzZTF9LCBhbmQgb25seSBpZiBpdCBpcwpub3QgZm91bmQgdGhlcmUsIGl0IGlzIHNlYXJjaGVkIGluIFxjbGFzc3tCYXNlMn0sIGFuZCBzbyBvbi4KCihUbyBzb21lIHBlb3BsZSBicmVhZHRoIGZpcnN0IC0tLSBzZWFyY2hpbmcgXGNsYXNze0Jhc2UyfSBhbmQKXGNsYXNze0Jhc2UzfSBiZWZvcmUgdGhlIGJhc2UgY2xhc3NlcyBvZiBcY2xhc3N7QmFzZTF9IC0tLSBsb29rcyBtb3JlCm5hdHVyYWwuICBIb3dldmVyLCB0aGlzIHdvdWxkIHJlcXVpcmUgeW91IHRvIGtub3cgd2hldGhlciBhIHBhcnRpY3VsYXIKYXR0cmlidXRlIG9mIFxjbGFzc3tCYXNlMX0gaXMgYWN0dWFsbHkgZGVmaW5lZCBpbiBcY2xhc3N7QmFzZTF9IG9yIGluCm9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIGJlZm9yZSB5b3UgY2FuIGZpZ3VyZSBvdXQgdGhlIGNvbnNlcXVlbmNlcyBvZgphIG5hbWUgY29uZmxpY3Qgd2l0aCBhbiBhdHRyaWJ1dGUgb2YgXGNsYXNze0Jhc2UyfS4gIFRoZSBkZXB0aC1maXJzdApydWxlIG1ha2VzIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4gZGlyZWN0IGFuZCBpbmhlcml0ZWQgYXR0cmlidXRlcyBvZgpcY2xhc3N7QmFzZTF9LikKCkl0IGlzIGNsZWFyIHRoYXQgaW5kaXNjcmltaW5hdGUgdXNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIGEKbWFpbnRlbmFuY2UgbmlnaHRtYXJlLCBnaXZlbiB0aGUgcmVsaWFuY2UgaW4gUHl0aG9uIG9uIGNvbnZlbnRpb25zIHRvCmF2b2lkIGFjY2lkZW50YWwgbmFtZSBjb25mbGljdHMuICBBIHdlbGwta25vd24gcHJvYmxlbSB3aXRoIG11bHRpcGxlCmluaGVyaXRhbmNlIGlzIGEgY2xhc3MgZGVyaXZlZCBmcm9tIHR3byBjbGFzc2VzIHRoYXQgaGFwcGVuIHRvIGhhdmUgYQpjb21tb24gYmFzZSBjbGFzcy4gIFdoaWxlIGl0IGlzIGVhc3kgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5zCmluIHRoaXMgY2FzZSAodGhlIGluc3RhbmNlIHdpbGwgaGF2ZSBhIHNpbmdsZSBjb3B5IG9mIGBgaW5zdGFuY2UKdmFyaWFibGVzJycgb3IgZGF0YSBhdHRyaWJ1dGVzIHVzZWQgYnkgdGhlIGNvbW1vbiBiYXNlIGNsYXNzKSwgaXQgaXMKbm90IGNsZWFyIHRoYXQgdGhlc2Ugc2VtYW50aWNzIGFyZSBpbiBhbnkgd2F5IHVzZWZ1bC4KCgpcc2VjdGlvbntQcml2YXRlIFZhcmlhYmxlcyBcbGFiZWx7cHJpdmF0ZX19CgpUaGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGNsYXNzLXByaXZhdGUKaWRlbnRpZmllcnMuICBBbnkgaWRlbnRpZmllciBvZiB0aGUgZm9ybSBcY29kZXtfX3NwYW19IChhdCBsZWFzdCB0d28KbGVhZGluZyB1bmRlcnNjb3JlcywgYXQgbW9zdCBvbmUgdHJhaWxpbmcgdW5kZXJzY29yZSkgaXMgbm93IHRleHR1YWxseQpyZXBsYWNlZCB3aXRoIFxjb2Rle19jbGFzc25hbWVfX3NwYW19LCB3aGVyZSBcY29kZXtjbGFzc25hbWV9IGlzIHRoZQpjdXJyZW50IGNsYXNzIG5hbWUgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmUocykgc3RyaXBwZWQuICBUaGlzIG1hbmdsaW5nCmlzIGRvbmUgd2l0aG91dCByZWdhcmQgb2YgdGhlIHN5bnRhY3RpYyBwb3NpdGlvbiBvZiB0aGUgaWRlbnRpZmllciwgc28KaXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGNsYXNzLXByaXZhdGUgaW5zdGFuY2UgYW5kIGNsYXNzIHZhcmlhYmxlcywKbWV0aG9kcywgYXMgd2VsbCBhcyBnbG9iYWxzLCBhbmQgZXZlbiB0byBzdG9yZSBpbnN0YW5jZSB2YXJpYWJsZXMKcHJpdmF0ZSB0byB0aGlzIGNsYXNzIG9uIGluc3RhbmNlcyBvZiBcZW1waHtvdGhlcn0gY2xhc3Nlcy4gIFRydW5jYXRpb24KbWF5IG9jY3VyIHdoZW4gdGhlIG1hbmdsZWQgbmFtZSB3b3VsZCBiZSBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycy4KT3V0c2lkZSBjbGFzc2VzLCBvciB3aGVuIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9mIG9ubHkgdW5kZXJzY29yZXMsCm5vIG1hbmdsaW5nIG9jY3Vycy4KCk5hbWUgbWFuZ2xpbmcgaXMgaW50ZW5kZWQgdG8gZ2l2ZSBjbGFzc2VzIGFuIGVhc3kgd2F5IHRvIGRlZmluZQpgYHByaXZhdGUnJyBpbnN0YW5jZSB2YXJpYWJsZXMgYW5kIG1ldGhvZHMsIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5CmFib3V0IGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IGRlcml2ZWQgY2xhc3Nlcywgb3IgbXVja2luZyB3aXRoCmluc3RhbmNlIHZhcmlhYmxlcyBieSBjb2RlIG91dHNpZGUgdGhlIGNsYXNzLiAgTm90ZSB0aGF0IHRoZSBtYW5nbGluZwpydWxlcyBhcmUgZGVzaWduZWQgbW9zdGx5IHRvIGF2b2lkIGFjY2lkZW50czsgaXQgc3RpbGwgaXMgcG9zc2libGUgZm9yCmEgZGV0ZXJtaW5lZCBzb3VsIHRvIGFjY2VzcyBvciBtb2RpZnkgYSB2YXJpYWJsZSB0aGF0IGlzIGNvbnNpZGVyZWQKcHJpdmF0ZS4gIFRoaXMgY2FuIGV2ZW4gYmUgdXNlZnVsIGluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcywgc3VjaCBhcyBpbgp0aGUgZGVidWdnZXIsIGFuZCB0aGF0J3Mgb25lIHJlYXNvbiB3aHkgdGhpcyBsb29waG9sZSBpcyBub3QgY2xvc2VkLgooQnVnbGV0OiBkZXJpdmF0aW9uIG9mIGEgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBiYXNlIGNsYXNzCm1ha2VzIHVzZSBvZiBwcml2YXRlIHZhcmlhYmxlcyBvZiB0aGUgYmFzZSBjbGFzcyBwb3NzaWJsZS4pCgpOb3RpY2UgdGhhdCBjb2RlIHBhc3NlZCB0byBcY29kZXtleGVjfSwgXGNvZGV7ZXZhbCgpfSBvcgpcY29kZXtldmFsZmlsZSgpfSBkb2VzIG5vdCBjb25zaWRlciB0aGUgY2xhc3NuYW1lIG9mIHRoZSBpbnZva2luZyAKY2xhc3MgdG8gYmUgdGhlIGN1cnJlbnQgY2xhc3M7IHRoaXMgaXMgc2ltaWxhciB0byB0aGUgZWZmZWN0IG9mIHRoZSAKXGNvZGV7Z2xvYmFsfSBzdGF0ZW1lbnQsIHRoZSBlZmZlY3Qgb2Ygd2hpY2ggaXMgbGlrZXdpc2UgcmVzdHJpY3RlZCB0byAKY29kZSB0aGF0IGlzIGJ5dGUtY29tcGlsZWQgdG9nZXRoZXIuICBUaGUgc2FtZSByZXN0cmljdGlvbiBhcHBsaWVzIHRvClxjb2Rle2dldGF0dHIoKX0sIFxjb2Rle3NldGF0dHIoKX0gYW5kIFxjb2Rle2RlbGF0dHIoKX0sIGFzIHdlbGwgYXMKd2hlbiByZWZlcmVuY2luZyBcY29kZXtfX2RpY3RfX30gZGlyZWN0bHkuCgoKXHNlY3Rpb257T2RkcyBhbmQgRW5kcyBcbGFiZWx7b2Rkc319CgpTb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYSBkYXRhIHR5cGUgc2ltaWxhciB0byB0aGUgUGFzY2FsCmBgcmVjb3JkJycgb3IgQyBgYHN0cnVjdCcnLCBidW5kbGluZyB0b2dldGhlciBhIGNvdXBsZSBvZiBuYW1lZCBkYXRhCml0ZW1zLiAgQW4gZW1wdHkgY2xhc3MgZGVmaW5pdGlvbiB3aWxsIGRvIG5pY2VseToKClxiZWdpbnt2ZXJiYXRpbX0KY2xhc3MgRW1wbG95ZWU6CiAgICBwYXNzCgpqb2huID0gRW1wbG95ZWUoKSAjIENyZWF0ZSBhbiBlbXB0eSBlbXBsb3llZSByZWNvcmQKCiMgRmlsbCB0aGUgZmllbGRzIG9mIHRoZSByZWNvcmQKam9obi5uYW1lID0gJ0pvaG4gRG9lJwpqb2huLmRlcHQgPSAnY29tcHV0ZXIgbGFiJwpqb2huLnNhbGFyeSA9IDEwMDAKXGVuZHt2ZXJiYXRpbX0KCkEgcGllY2Ugb2YgUHl0aG9uIGNvZGUgdGhhdCBleHBlY3RzIGEgcGFydGljdWxhciBhYnN0cmFjdCBkYXRhIHR5cGUKY2FuIG9mdGVuIGJlIHBhc3NlZCBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgdGhlIG1ldGhvZHMgb2YgdGhhdCBkYXRhCnR5cGUgaW5zdGVhZC4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGhhdmUgYSBmdW5jdGlvbiB0aGF0IGZvcm1hdHMgc29tZQpkYXRhIGZyb20gYSBmaWxlIG9iamVjdCwgeW91IGNhbiBkZWZpbmUgYSBjbGFzcyB3aXRoIG1ldGhvZHMKXG1ldGhvZHtyZWFkKCl9IGFuZCBcbWV0aG9ke3JlYWRsaW5lKCl9IHRoYXQgZ2V0cyB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nCmJ1ZmZlciBpbnN0ZWFkLCBhbmQgcGFzcyBpdCBhcyBhbiBhcmd1bWVudC4lICAoVW5mb3J0dW5hdGVseSwgdGhpcwoldGVjaG5pcXVlIGhhcyBpdHMgbGltaXRhdGlvbnM6IGEgY2xhc3MgY2FuJ3QgZGVmaW5lIG9wZXJhdGlvbnMgdGhhdAolYXJlIGFjY2Vzc2VkIGJ5IHNwZWNpYWwgc3ludGF4IHN1Y2ggYXMgc2VxdWVuY2Ugc3Vic2NyaXB0aW5nIG9yCiVhcml0aG1ldGljIG9wZXJhdG9ycywgYW5kIGFzc2lnbmluZyBzdWNoIGEgYGBwc2V1ZG8tZmlsZScnIHRvCiVcY29kZXtzeXMuc3RkaW59IHdpbGwgbm90IGNhdXNlIHRoZSBpbnRlcnByZXRlciB0byByZWFkIGZ1cnRoZXIgaW5wdXQKJWZyb20gaXQuKQoKCkluc3RhbmNlIG1ldGhvZCBvYmplY3RzIGhhdmUgYXR0cmlidXRlcywgdG9vOiBcY29kZXttLmltX3NlbGZ9IGlzIHRoZQpvYmplY3Qgb2Ygd2hpY2ggdGhlIG1ldGhvZCBpcyBhbiBpbnN0YW5jZSwgYW5kIFxjb2Rle20uaW1fZnVuY30gaXMgdGhlCmZ1bmN0aW9uIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QuCgoKXHNlY3Rpb257RXhjZXB0aW9ucyBBcmUgQ2xhc3NlcyBUb29cbGFiZWx7ZXhjZXB0aW9uQ2xhc3Nlc319CgpVc2VyLWRlZmluZWQgZXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzc2VzIGFzIHdlbGwuICBVc2luZyB0aGlzCm1lY2hhbmlzbSBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgZXh0ZW5zaWJsZSBoaWVyYXJjaGllcyBvZiBleGNlcHRpb25zLgoKVGhlcmUgYXJlIHR3byBuZXcgdmFsaWQgKHNlbWFudGljKSBmb3JtcyBmb3IgdGhlIHJhaXNlIHN0YXRlbWVudDoKClxiZWdpbnt2ZXJiYXRpbX0KcmFpc2UgQ2xhc3MsIGluc3RhbmNlCgpyYWlzZSBpbnN0YW5jZQpcZW5ke3ZlcmJhdGltfQoKSW4gdGhlIGZpcnN0IGZvcm0sIFxjb2Rle2luc3RhbmNlfSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mClxjbGFzc3tDbGFzc30gb3Igb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQuICBUaGUgc2Vjb25kIGZvcm0gaXMgYQpzaG9ydGhhbmQgZm9yOgoKXGJlZ2lue3ZlcmJhdGltfQpyYWlzZSBpbnN0YW5jZS5fX2NsYXNzX18sIGluc3RhbmNlClxlbmR7dmVyYmF0aW19CgpBIGNsYXNzIGluIGFuIGV4Y2VwdCBjbGF1c2UgaXMgY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgc2FtZQpjbGFzcyBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZiAoYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZCAtLS0gYW4KZXhjZXB0IGNsYXVzZSBsaXN0aW5nIGEgZGVyaXZlZCBjbGFzcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGEgYmFzZQpjbGFzcykuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgQiwgQywgRCBpbiB0aGF0Cm9yZGVyOgoKXGJlZ2lue3ZlcmJhdGltfQpjbGFzcyBCOgogICAgcGFzcwpjbGFzcyBDKEIpOgogICAgcGFzcwpjbGFzcyBEKEMpOgogICAgcGFzcwoKZm9yIGMgaW4gW0IsIEMsIERdOgogICAgdHJ5OgogICAgICAgIHJhaXNlIGMoKQogICAgZXhjZXB0IEQ6CiAgICAgICAgcHJpbnQgIkQiCiAgICBleGNlcHQgQzoKICAgICAgICBwcmludCAiQyIKICAgIGV4Y2VwdCBCOgogICAgICAgIHByaW50ICJCIgpcZW5ke3ZlcmJhdGltfQoKTm90ZSB0aGF0IGlmIHRoZSBleGNlcHQgY2xhdXNlcyB3ZXJlIHJldmVyc2VkICh3aXRoClxzYW1we2V4Y2VwdCBCfSBmaXJzdCksIGl0IHdvdWxkIGhhdmUgcHJpbnRlZCBCLCBCLCBCIC0tLSB0aGUgZmlyc3QKbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyB0cmlnZ2VyZWQuCgpXaGVuIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBmb3IgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiB3aGljaCBpcyBhCmNsYXNzLCB0aGUgY2xhc3MgbmFtZSBpcyBwcmludGVkLCB0aGVuIGEgY29sb24gYW5kIGEgc3BhY2UsIGFuZApmaW5hbGx5IHRoZSBpbnN0YW5jZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uClxmdW5jdGlvbntzdHIoKX0uCgoKXHNlY3Rpb257SXRlcmF0b3JzXGxhYmVse2l0ZXJhdG9yc319CgpCeSBub3csIHlvdSd2ZSBwcm9iYWJseSBub3RpY2VkIHRoYXQgbW9zdCBjb250YWluZXIgb2JqZWN0cyBjYW4gbG9vcGVkIG92ZXIKdXNpbmcgYSBcY29kZXtmb3J9IHN0YXRlbWVudDoKClxiZWdpbnt2ZXJiYXRpbX0KZm9yIGVsZW1lbnQgaW4gWzEsIDIsIDNdOgogICAgcHJpbnQgZWxlbWVudApmb3IgZWxlbWVudCBpbiAoMSwgMiwgMyk6CiAgICBwcmludCBlbGVtZW50CmZvciBrZXkgaW4geydvbmUnOjEsICd0d28nOjJ9OgogICAgcHJpbnQga2V5CmZvciBjaGFyIGluICIxMjMiOgogICAgcHJpbnQgY2hhcgpmb3IgbGluZSBpbiBvcGVuKCJteWZpbGUudHh0Iik6CiAgICBwcmludCBsaW5lClxlbmR7dmVyYmF0aW19CgpUaGlzIHN0eWxlIG9mIGFjY2VzcyBpcyBjbGVhciwgY29uY2lzZSwgYW5kIGNvbnZlbmllbnQuICBUaGUgdXNlIG9mIGl0ZXJhdG9ycwpwZXJ2YWRlcyBhbmQgdW5pZmllcyBQeXRob24uICBCZWhpbmQgdGhlIHNjZW5lcywgdGhlIFxjb2Rle2Zvcn0gc3RhdGVtZW50IGNhbGxzClxmdW5jdGlvbntpdGVyKCl9IG9uIHRoZSBjb250YWluZXIgb2JqZWN0LiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgbWV0aG9kIFxtZXRob2R7bmV4dCgpfSB3aGljaCBhY2Nlc3NlcyBlbGVtZW50cyBpbiB0aGUKY29udGFpbmVyIG9uZSBhdCBhIHRpbWUuICBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzLCBcbWV0aG9ke25leHQoKX0KcmFpc2VzIGEgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhlIFxjb2Rle2Zvcn0gbG9vcAp0byB0ZXJtaW5hdGUuICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IGl0IGFsbCB3b3JrczoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHMgPSAnYWJjJwo+Pj4gaXQgPSBpdGVyKHMpCj4+PiBpdAo8aXRlcmF0b3Igb2JqZWN0IGF0IDB4MDBBMURCNTA+Cj4+PiBpdC5uZXh0KCkKJ2EnCj4+PiBpdC5uZXh0KCkKJ2InCj4+PiBpdC5uZXh0KCkKJ2MnCj4+PiBpdC5uZXh0KCkKClRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICI8cHlzaGVsbCM2PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQogICAgaXQubmV4dCgpClN0b3BJdGVyYXRpb24KXGVuZHt2ZXJiYXRpbX0KCkhhdmluZyBzZWVuIHRoZSBtZWNoYW5pY3MgYmVoaW5kIHRoZSBpdGVyYXRvciBwcm90b2NvbCwgaXQgaXMgZWFzeSB0byBhZGQKaXRlcmF0b3IgYmVoYXZpb3IgdG8geW91ciBjbGFzc2VzLiAgRGVmaW5lIGEgXG1ldGhvZHtfX2l0ZXJfXygpfSBtZXRob2QKd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIFxtZXRob2R7bmV4dCgpfSBtZXRob2QuICBJZiB0aGUgY2xhc3MgZGVmaW5lcwpcbWV0aG9ke25leHQoKX0sIHRoZW4gXG1ldGhvZHtfX2l0ZXJfXygpfSBjYW4ganVzdCByZXR1cm4gXGNvZGV7c2VsZn06CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBjbGFzcyBSZXZlcnNlOgogICAgIkl0ZXJhdG9yIGZvciBsb29waW5nIG92ZXIgYSBzZXF1ZW5jZSBiYWNrd2FyZHMiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuaW5kZXggPSBsZW4oZGF0YSkKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgc2VsZi5pbmRleCA9IHNlbGYuaW5kZXggLSAxCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtzZWxmLmluZGV4XQoKPj4+IGZvciBjaGFyIGluIFJldmVyc2UoJ3NwYW0nKToKCXByaW50IGNoYXIKCm0KYQpwCnMKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntHZW5lcmF0b3JzXGxhYmVse2dlbmVyYXRvcnN9fQoKR2VuZXJhdG9ycyBhcmUgYSBzaW1wbGUgYW5kIHBvd2VyZnVsIHRvb2wgZm9yIGNyZWF0aW5nIGl0ZXJhdG9ycy4gIFRoZXkgYXJlCndyaXR0ZW4gbGlrZSByZWd1bGFyIGZ1bmN0aW9ucyBidXQgdXNlIHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50IHdoZW5ldmVyCnRoZXkgd2FudCB0byByZXR1cm4gZGF0YS4gIEVhY2ggdGltZSB0aGUgXG1ldGhvZHtuZXh0KCl9IGlzIGNhbGxlZCwgdGhlCmdlbmVyYXRvciByZXN1bWVzIHdoZXJlIGl0IGxlZnQtb2ZmIChpdCByZW1lbWJlcnMgYWxsIHRoZSBkYXRhIHZhbHVlcyBhbmQKd2hpY2ggc3RhdGVtZW50IHdhcyBsYXN0IGV4ZWN1dGVkKS4gIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBnZW5lcmF0b3JzIGNhbgpiZSB0cml2aWFsbHkgZWFzeSB0byBjcmVhdGU6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBkZWYgcmV2ZXJzZShkYXRhKToKICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKGRhdGEpLTEsIC0xLCAtMSk6CiAgICAgICAgICAgIHlpZWxkIGRhdGFbaW5kZXhdCgkJCj4+PiBmb3IgY2hhciBpbiByZXZlcnNlKCdnb2xmJyk6CiAgICAgICAgcHJpbnQgY2hhcgoKZgpsCm8KZwkKXGVuZHt2ZXJiYXRpbX0KCkFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgd2l0aCBnZW5lcmF0b3JzIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCBjbGFzcyBiYXNlZAppdGVyYXRvcnMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiAgV2hhdCBtYWtlcyBnZW5lcmF0b3JzIHNvCmNvbXBhY3QgaXMgdGhhdCB0aGUgXG1ldGhvZHtfX2l0ZXJfXygpfSBhbmQgXG1ldGhvZHtuZXh0KCl9IG1ldGhvZHMgYXJlCmNyZWF0ZWQgYXV0b21hdGljYWxseS4KCkFub3RoZXIga2V5IGZlYXR1cmUgaXMgdGhhdCB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBleGVjdXRpb24gc3RhdGUKYXJlIGF1dG9tYXRpY2FsbHkgc2F2ZWQgYmV0d2VlbiBjYWxscy4gIFRoaXMgbWFkZSB0aGUgZnVuY3Rpb24gZWFzaWVyIHRvIHdyaXRlCmFuZCBtdWNoIG1vcmUgY2xlYXIgdGhhbiBhbiBhcHByb2FjaCB1c2luZyBjbGFzcyB2YXJpYWJsZXMgbGlrZQpcY29kZXtzZWxmLmluZGV4fSBhbmQgXGNvZGV7c2VsZi5kYXRhfS4KCkluIGFkZGl0aW9uIHRvIGF1dG9tYXRpYyBtZXRob2QgY3JlYXRpb24gYW5kIHNhdmluZyBwcm9ncmFtIHN0YXRlLCB3aGVuCmdlbmVyYXRvcnMgdGVybWluYXRlLCB0aGV5IGF1dG9tYXRpY2FsbHkgcmFpc2UgXGV4Y2VwdGlvbntTdG9wSXRlcmF0aW9ufS4KSW4gY29tYmluYXRpb24sIHRoZXNlIGZlYXR1cmVzIG1ha2UgaXQgZWFzeSB0byBjcmVhdGUgaXRlcmF0b3JzIHdpdGggbm8KbW9yZSBlZmZvcnQgdGhhbiB3cml0aW5nIGEgcmVndWxhciBmdW5jdGlvbi4KCgoKXGNoYXB0ZXJ7QnJpZWYgVG91ciBvZiB0aGUgU3RhbmRhcmQgTGlicmFyeSBcbGFiZWx7YnJpZWZUb3VyfX0KCgpcc2VjdGlvbntPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZVxsYWJlbHtvcy1pbnRlcmZhY2V9fQoKVGhlIFx1bGlua3tcbW9kdWxle29zfX17Li4vbGliL21vZHVsZS1vcy5odG1sfQptb2R1bGUgcHJvdmlkZXMgZG96ZW5zIG9mIGZ1bmN0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUKb3BlcmF0aW5nIHN5c3RlbToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBvcwo+Pj4gb3Muc3lzdGVtKCdjb3B5IC9kYXRhL215ZGF0YS5maWwgL2JhY2t1cC9teWRhdGEuZmlsJykKMAo+Pj4gb3MuZ2V0Y3dkKCkgICAgICAjIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQonQzpcXFB5dGhvbjI0Jwo+Pj4gb3MuY2hkaXIoJy9zZXJ2ZXIvYWNjZXNzbG9ncycpClxlbmR7dmVyYmF0aW19CgpCZSBzdXJlIHRvIHVzZSB0aGUgXHNhbXB7aW1wb3J0IG9zfSBzdHlsZSBpbnN0ZWFkIG9mClxzYW1we2Zyb20gb3MgaW1wb3J0ICp9LiAgVGhpcyB3aWxsIGtlZXAgXGZ1bmN0aW9ue29zLm9wZW4oKX0gZnJvbQpzaGFkb3dpbmcgdGhlIGJ1aWx0aW4gXGZ1bmN0aW9ue29wZW4oKX0gZnVuY3Rpb24gd2hpY2ggb3BlcmF0ZXMgbXVjaApkaWZmZXJlbnRseS4KClRoZSBidWlsdGluIFxmdW5jdGlvbntkaXIoKX0gYW5kIFxmdW5jdGlvbntoZWxwKCl9IGZ1bmN0aW9ucyBhcmUgdXNlZnVsCmFzIGludGVyYWN0aXZlIGFpZHMgZm9yIHdvcmtpbmcgd2l0aCBsYXJnZSBtb2R1bGVzIGxpa2UgXG1vZHVsZXtvc306CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgb3MKPj4+IGRpcihvcykKPHJldHVybnMgYSBsaXN0IG9mIGFsbCBtb2R1bGUgZnVuY3Rpb25zPgo+Pj4gaGVscChvcykKPHJldHVybnMgYW4gZXh0ZW5zaXZlIG1hbnVhbCBwYWdlIGNyZWF0ZWQgZnJvbSB0aGUgbW9kdWxlJ3MgZG9jc3RyaW5ncz4KXGVuZHt2ZXJiYXRpbX0KCkZvciBkYWlseSBmaWxlIGFuZCBkaXJlY3RvcnkgbWFuYWdlbWVudCB0YXNrcywgdGhlIApcdWxpbmt7XG1vZHVsZXtzaHV0aWx9fXsuLi9saWIvbW9kdWxlLXNodXRpbC5odG1sfQptb2R1bGUgcHJvdmlkZXMgYSBoaWdoZXIgbGV2ZWwgaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWVyIHRvIHVzZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBzaHV0aWwKPj4+IHNodXRpbC5jb3B5ZmlsZSgnZGF0YS5kYicsICdhcmNoaXZlLmRiJykKPj4+IHNodXRpbC5tb3ZlKCcvYnVpbGQvZXhlY3V0YWJsZXMnLCAnaW5zdGFsbGRpcicpClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257RmlsZSBXaWxkY2FyZHNcbGFiZWx7ZmlsZS13aWxkY2FyZHN9fQoKVGhlIFx1bGlua3tcbW9kdWxle2dsb2J9fXsuLi9saWIvbW9kdWxlLWdsb2IuaHRtbH0KbW9kdWxlIHByb3ZpZGVzIGEgZnVuY3Rpb24gZm9yIG1ha2luZyBmaWxlIGxpc3RzIGZyb20gZGlyZWN0b3J5CndpbGRjYXJkIHNlYXJjaGVzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IGdsb2IKPj4+IGdsb2IuZ2xvYignKi5weScpClsncHJpbWVzLnB5JywgJ3JhbmRvbS5weScsICdxdW90ZS5weSddClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257Q29tbWFuZCBMaW5lIEFyZ3VtZW50c1xsYWJlbHtjb21tYW5kLWxpbmUtYXJndW1lbnRzfX0KCkNvbW1vbiB1dGlsaXR5IHNjcmlwdHMgb2Z0ZW4gaW52b2tlIHByb2Nlc3NpbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KVGhlc2UgYXJndW1lbnRzIGFyZSBzdG9yZWQgaW4gdGhlClx1bGlua3tcbW9kdWxle3N5c319ey4uL2xpYi9tb2R1bGUtc3lzLmh0bWx9XCBtb2R1bGUncyBcdmFye2FyZ3Z9CmF0dHJpYnV0ZSBhcyBhIGxpc3QuICBGb3IgaW5zdGFuY2UgdGhlIGZvbGxvd2luZyBvdXRwdXQgcmVzdWx0cyBmcm9tCnJ1bm5pbmcgXHNhbXB7cHl0aG9uIGRlbW8ucHkgb25lIHR3byB0aHJlZX0gYXQgdGhlIGNvbW1hbmQgbGluZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IGltcG9ydCBzeXMKPj4+IHByaW50IHN5cy5hcmd2ClsnZGVtby5weScsICdvbmUnLCAndHdvJywgJ3RocmVlJ10KXGVuZHt2ZXJiYXRpbX0KClRoZSBcdWxpbmt7XG1vZHVsZXtnZXRvcHR9fXsuLi9saWIvbW9kdWxlLWdldG9wdC5odG1sfQptb2R1bGUgcHJvY2Vzc2VzIFx2YXJ7c3lzLmFyZ3Z9IHVzaW5nIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgXFVOSVh7fQpcZnVuY3Rpb257Z2V0b3B0KCl9IGZ1bmN0aW9uLiAgTW9yZSBwb3dlcmZ1bCBhbmQgZmxleGlibGUgY29tbWFuZCBsaW5lCnByb2Nlc3NpbmcgaXMgcHJvdmlkZWQgYnkgdGhlClx1bGlua3tcbW9kdWxle29wdHBhcnNlfX17Li4vbGliL21vZHVsZS1vcHRwYXJzZS5odG1sfSBtb2R1bGUuCgoKXHNlY3Rpb257RXJyb3IgT3V0cHV0IFJlZGlyZWN0aW9uIGFuZCBQcm9ncmFtIFRlcm1pbmF0aW9uXGxhYmVse3N0ZGVycn19CgpUaGUgXHVsaW5re1xtb2R1bGV7c3lzfX17Li4vbGliL21vZHVsZS1zeXMuaHRtbH0KbW9kdWxlIGFsc28gaGFzIGF0dHJpYnV0ZXMgZm9yIFx2YXJ7c3RkaW59LCBcdmFye3N0ZG91dH0sIGFuZApcdmFye3N0ZGVycn0uICBUaGUgbGF0dGVyIGlzIHVzZWZ1bCBmb3IgZW1pdHRpbmcgd2FybmluZ3MgYW5kIGVycm9yCm1lc3NhZ2VzIHRvIG1ha2UgdGhlbSB2aXNpYmxlIGV2ZW4gd2hlbiBcdmFye3N0ZG91dH0gaGFzIGJlZW4gcmVkaXJlY3RlZDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHN5cy5zdGRlcnIud3JpdGUoJ1dhcm5pbmcsIGxvZyBmaWxlIG5vdCBmb3VuZCBzdGFydGluZyBhIG5ldyBvbmUnKQpXYXJuaW5nLCBsb2cgZmlsZSBub3QgZm91bmQgc3RhcnRpbmcgYSBuZXcgb25lClxlbmR7dmVyYmF0aW19CgpUaGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHRlcm1pbmF0ZSBhIHNjcmlwdCBpcyB0byB1c2UgXHNhbXB7c3lzLmV4aXQoKX0uCgoKXHNlY3Rpb257U3RyaW5nIFBhdHRlcm4gTWF0Y2hpbmdcbGFiZWx7c3RyaW5nLXBhdHRlcm4tbWF0Y2hpbmd9fQoKVGhlIFx1bGlua3tcbW9kdWxle3JlfX17Li4vbGliL21vZHVsZS1yZS5odG1sfQptb2R1bGUgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIHRvb2xzIGZvciBhZHZhbmNlZCBzdHJpbmcgcHJvY2Vzc2luZy4KV2hlbiBvbmx5IHNpbXBsZSBjYXBhYmlsaXRpZXMgYXJlIG5lZWRlZCwgc3RyaW5nIG1ldGhvZHMgYXJlIHByZWZlcnJlZApiZWNhdXNlIHRoZXkgYXJlIGVhc2llciB0byByZWFkIGFuZCBkZWJ1Zy4gIEhvd2V2ZXIsIGZvciBtb3JlCnNvcGhpc3RpY2F0ZWQgYXBwbGljYXRpb25zLCByZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBwcm92aWRlIHN1Y2NpbmN0LApvcHRpbWl6ZWQgc29sdXRpb25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IHJlCj4+PiByZS5maW5kYWxsKHInXGJmW2Etel0qJywgJ3doaWNoIGZvb3Qgb3IgaGFuZCBmZWxsIGZhc3Rlc3QnKQpbJ2Zvb3QnLCAnZmVsbCcsICdmYXN0ZXN0J10KPj4+IHJlLnN1YihyJyhcYlthLXpdKykgXDEnLCByJ1wxJywgJ2NhdCBpbiB0aGUgdGhlIGhhdCcpCidjYXQgaW4gdGhlIGhhdCcKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntNYXRoZW1hdGljc1xsYWJlbHttYXRoZW1hdGljc319CgpUaGUgXHVsaW5re1xtb2R1bGV7bWF0aH19ey4uL2xpYi9tb2R1bGUtbWF0aC5odG1sfSBtb2R1bGUgZ2l2ZXMKYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEMgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50IG1hdGg6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgbWF0aAo+Pj4gbWF0aC5jb3MobWF0aC5waSAvIDQuMCkKMC43MDcxMDY3ODExODY1NDc1Nwo+Pj4gbWF0aC5sb2coMTAyNCwgMikKMTAuMApcZW5ke3ZlcmJhdGltfQoKVGhlIFx1bGlua3tcbW9kdWxle3JhbmRvbX19ey4uL2xpYi9tb2R1bGUtcmFuZG9tLmh0bWx9Cm1vZHVsZSBwcm92aWRlcyB0b29scyBmb3IgbWFraW5nIHJhbmRvbSBzZWxlY3Rpb25zOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gaW1wb3J0IHJhbmRvbQo+Pj4gcmFuZG9tLmNob2ljZShbJ2FwcGxlJywgJ3BlYXInLCAnYmFuYW5hJ10pCidhcHBsZScKPj4+IHJhbmRvbS5zYW1wbGUoeHJhbmdlKDEwMCksIDEwKSAgICMgc2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudApbMzAsIDgzLCAxNiwgNCwgOCwgODEsIDQxLCA1MCwgMTgsIDMzXQo+Pj4gcmFuZG9tLnJhbmRvbSgpICAgICMgcmFuZG9tIGZsb2F0CjAuMTc5NzA5ODc2OTM3MDYxODYKPj4+IHJhbmRvbS5yYW5kcmFuZ2UoNikgICAgIyByYW5kb20gaW50ZWdlciBjaG9zZW4gZnJvbSByYW5nZSg2KQo0ICAgClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257SW50ZXJuZXQgQWNjZXNzXGxhYmVse2ludGVybmV0LWFjY2Vzc319CgpUaGVyZSBhcmUgYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgYWNjZXNzaW5nIHRoZSBpbnRlcm5ldCBhbmQgcHJvY2Vzc2luZwppbnRlcm5ldCBwcm90b2NvbHMuIFR3byBvZiB0aGUgc2ltcGxlc3QgYXJlClx1bGlua3tcbW9kdWxle3VybGxpYjJ9fXsuLi9saWIvbW9kdWxlLXVybGxpYjIuaHRtbH0KZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIHVybHMgYW5kClx1bGlua3tcbW9kdWxle3NtdHBsaWJ9fXsuLi9saWIvbW9kdWxlLXNtdHBsaWIuaHRtbH0gCmZvciBzZW5kaW5nIG1haWw6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgdXJsbGliMgo+Pj4gZm9yIGxpbmUgaW4gdXJsbGliMi51cmxvcGVuKCdodHRwOi8vdHljaG8udXNuby5uYXZ5Lm1pbC9jZ2ktYmluL3RpbWVyLnBsJyk6Ci4uLiBpZiAnRVNUJyBpbiBsaW5lOiAgICAgICMgbG9vayBmb3IgRWFzdGVybiBTdGFuZGFyZCBUaW1lCi4uLiAgICAgcHJpbnQgbGluZQogICAgCjxCUj5Ob3YuIDI1LCAwOTo0MzozMiBQTSBFU1QKCj4+PiBpbXBvcnQgc210cGxpYgo+Pj4gc2VydmVyID0gc210cGxpYi5TTVRQKCdsb2NhbGhvc3QnKQo+Pj4gc2VydmVyLnNlbmRtYWlsKCdzb290aHNheWVyQHRtcC5vcmcnLCAnamNlYXNhckB0bXAub3JnJywKIiIiVG86IGpjZWFzYXJAdG1wLm9yZwpGcm9tOiBzb290aHNheWVyQHRtcC5vcmcKCkJld2FyZSB0aGUgSWRlcyBvZiBNYXJjaC4KIiIiKQo+Pj4gc2VydmVyLnF1aXQoKQpcZW5ke3ZlcmJhdGltfQoKClxzZWN0aW9ue0RhdGVzIGFuZCBUaW1lc1xsYWJlbHtkYXRlcy1hbmQtdGltZXN9fQoKVGhlIFx1bGlua3tcbW9kdWxle2RhdGV0aW1lfX17Li4vbGliL21vZHVsZS1kYXRldGltZS5odG1sfSBtb2R1bGUKc3VwcGxpZXMgY2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIGRhdGVzIGFuZCB0aW1lcyBpbiBib3RoIHNpbXBsZQphbmQgY29tcGxleCB3YXlzLiBXaGlsZSBkYXRlIGFuZCB0aW1lIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkLCB0aGUKZm9jdXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIG9uIGVmZmljaWVudCBtZW1iZXIgZXh0cmFjdGlvbiBmb3IKb3V0cHV0IGZvcm1hdHRpbmcgYW5kIG1hbmlwdWxhdGlvbi4gIFRoZSBtb2R1bGUgYWxzbyBzdXBwb3J0cyBvYmplY3RzCnRoYXQgYXJlIHRpbWUgem9uZSBhd2FyZS4KClxiZWdpbnt2ZXJiYXRpbX0KIyBkYXRlcyBhcmUgZWFzaWx5IGNvbnN0cnVjdGVkIGFuZCBmb3JtYXR0ZWQKPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUKPj4+IG5vdyA9IGRhdGUudG9kYXkoKQo+Pj4gbm93CmRhdGV0aW1lLmRhdGUoMjAwMywgMTIsIDIpCj4+PiBub3cuc3RyZnRpbWUoIiVtLSVkLSV5IG9yICVkJWIgJVkgaXMgYSAlQSBvbiB0aGUgJWQgZGF5IG9mICVCIikKJzEyLTAyLTAzIG9yIDAyRGVjIDIwMDMgaXMgYSBUdWVzZGF5IG9uIHRoZSAwMiBkYXkgb2YgRGVjZW1iZXInCgojIGRhdGVzIHN1cHBvcnQgY2FsZW5kYXIgYXJpdGhtZXRpYwo+Pj4gYmlydGhkYXkgPSBkYXRlKDE5NjQsIDcsIDMxKQo+Pj4gYWdlID0gbm93IC0gYmlydGhkYXkKPj4+IGFnZS5kYXlzCjE0MzY4ClxlbmR7dmVyYmF0aW19CgoKXHNlY3Rpb257RGF0YSBDb21wcmVzc2lvblxsYWJlbHtkYXRhLWNvbXByZXNzaW9ufX0KCkNvbW1vbiBkYXRhIGFyY2hpdmluZyBhbmQgY29tcHJlc3Npb24gZm9ybWF0cyBhcmUgZGlyZWN0bHkgc3VwcG9ydGVkCmJ5IG1vZHVsZXMgaW5jbHVkaW5nOgpcdWxpbmt7XG1vZHVsZXt6bGlifX17Li4vbGliL21vZHVsZS16bGliLmh0bWx9LApcdWxpbmt7XG1vZHVsZXtnemlwfX17Li4vbGliL21vZHVsZS1nemlwLmh0bWx9LApcdWxpbmt7XG1vZHVsZXtiejJ9fXsuLi9saWIvbW9kdWxlLWJ6Mi5odG1sfSwKXHVsaW5re1xtb2R1bGV7emlwZmlsZX19ey4uL2xpYi9tb2R1bGUtemlwZmlsZS5odG1sfSwgYW5kClx1bGlua3tcbW9kdWxle3RhcmZpbGV9fXsuLi9saWIvbW9kdWxlLXRhcmZpbGUuaHRtbH0uCgpcYmVnaW57dmVyYmF0aW19Cj4+PiBpbXBvcnQgemxpYgo+Pj4gcyA9ICd3aXRjaCB3aGljaCBoYXMgd2hpY2ggd2l0Y2hlcyB3cmlzdCB3YXRjaCcKPj4+IGxlbihzKQo0MQo+Pj4gdCA9IHpsaWIuY29tcHJlc3MocykKPj4+IGxlbih0KQozNwo+Pj4gemxpYi5kZWNvbXByZXNzKHQpCid3aXRjaCB3aGljaCBoYXMgd2hpY2ggd2l0Y2hlcyB3cmlzdCB3YXRjaCcKPj4+IHpsaWIuY3JjMzIodCkKLTE0MzgwODUwMzEKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntQZXJmb3JtYW5jZSBNZWFzdXJlbWVudFxsYWJlbHtwZXJmb3JtYW5jZS1tZWFzdXJlbWVudH19CgpTb21lIFB5dGhvbiB1c2VycyBkZXZlbG9wIGEgZGVlcCBpbnRlcmVzdCBpbiBrbm93aW5nIHRoZSByZWxhdGl2ZQpwZXJmb3JtYW5jZSBiZXR3ZWVuIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIHRoZSBzYW1lIHByb2JsZW0uClB5dGhvbiBwcm92aWRlcyBhIG1lYXN1cmVtZW50IHRvb2wgdGhhdCBhbnN3ZXJzIHRob3NlIHF1ZXN0aW9ucwppbW1lZGlhdGVseS4KCkZvciBleGFtcGxlLCBpdCBtYXkgYmUgdGVtcHRpbmcgdG8gdXNlIHRoZSB0dXBsZSBwYWNraW5nIGFuZCB1bnBhY2tpbmcKZmVhdHVyZSBpbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25hbCBhcHByb2FjaCB0byBzd2FwcGluZyBhcmd1bWVudHMuClRoZSBcdWxpbmt7XG1vZHVsZXt0aW1laXR9fXsuLi9saWIvbW9kdWxlLXRpbWVpdC5odG1sfSBtb2R1bGUKcXVpY2tseSBkZW1vbnN0cmF0ZXMgdGhhdCB0aGUgdHJhZGl0aW9uYWwgYXBwcm9hY2ggaXMgZmFzdGVyOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gZnJvbSB0aW1laXQgaW1wb3J0IFRpbWVyCj4+PiBUaW1lcigndD1hOyBhPWI7IGI9dCcsICdhPTE7IGI9MicpLnRpbWVpdCgpCjAuNjA4NjQ5MTU2MDM2ODA5MjUKPj4+IFRpbWVyKCdhLGIgPSBiLGEnLCAnYT0xOyBiPTInKS50aW1laXQoKQowLjg2MjUxOTQ4NTc0Mzk3NzMKXGVuZHt2ZXJiYXRpbX0KCkluIGNvbnRyYXN0IHRvIFxtb2R1bGV7dGltZWl0fSdzIGZpbmUgbGV2ZWwgb2YgZ3JhbnVsYXJpdHksIHRoZQpcdWxpbmt7XG1vZHVsZXtwcm9maWxlfX17Li4vbGliL21vZHVsZS1wcm9maWxlLmh0bWx9IGFuZCBcbW9kdWxle3BzdGF0c30KbW9kdWxlcyBwcm92aWRlIHRvb2xzIGZvciBpZGVudGlmeWluZyB0aW1lIGNyaXRpY2FsIHNlY3Rpb25zIGluIGxhcmdlcgpibG9ja3Mgb2YgY29kZS4KCgpcc2VjdGlvbntRdWFsaXR5IENvbnRyb2xcbGFiZWx7cXVhbGl0eS1jb250cm9sfX0KCk9uZSBhcHByb2FjaCBmb3IgZGV2ZWxvcGluZyBoaWdoIHF1YWxpdHkgc29mdHdhcmUgaXMgdG8gd3JpdGUgdGVzdHMgZm9yCmVhY2ggZnVuY3Rpb24gYXMgaXQgaXMgZGV2ZWxvcGVkIGFuZCB0byBydW4gdGhvc2UgdGVzdHMgZnJlcXVlbnRseSBkdXJpbmcKdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCgpUaGUgXHVsaW5re1xtb2R1bGV7ZG9jdGVzdH19ey4uL2xpYi9tb2R1bGUtZG9jdGVzdC5odG1sfSBtb2R1bGUgcHJvdmlkZXMKYSB0b29sIGZvciBzY2FubmluZyBhIG1vZHVsZSBhbmQgdmFsaWRhdGluZyB0ZXN0cyBlbWJlZGRlZCBpbiBhIHByb2dyYW0ncwpkb2NzdHJpbmdzLiAgVGVzdCBjb25zdHJ1Y3Rpb24gaXMgYXMgc2ltcGxlIGFzIGN1dHRpbmctYW5kLXBhc3RpbmcgYQp0eXBpY2FsIGNhbGwgYWxvbmcgd2l0aCBpdHMgcmVzdWx0cyBpbnRvIHRoZSBkb2NzdHJpbmcuICBUaGlzIGltcHJvdmVzCnRoZSBkb2N1bWVudGF0aW9uIGJ5IHByb3ZpZGluZyB0aGUgdXNlciB3aXRoIGFuIGV4YW1wbGUgYW5kIGl0IGFsbG93cyB0aGUKZG9jdGVzdCBtb2R1bGUgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIHJlbWFpbnMgdHJ1ZSB0byB0aGUgZG9jdW1lbnRhdGlvbjoKClxiZWdpbnt2ZXJiYXRpbX0KZGVmIGF2ZXJhZ2UodmFsdWVzKToKICAgICIiIkNvbXB1dGVzIHRoZSBhcml0aG1ldGljIG1lYW4gb2YgYSBsaXN0IG9mIG51bWJlcnMuCgogICAgPj4+IHByaW50IGF2ZXJhZ2UoWzIwLCAzMCwgNzBdKQogICAgNDAuMAogICAgIiIiCiAgICByZXR1cm4gc3VtKHZhbHVlcywgMC4wKSAvIGxlbih2YWx1ZXMpCgppbXBvcnQgZG9jdGVzdApkb2N0ZXN0LnRlc3Rtb2QoKSAgICMgYXV0b21hdGljYWxseSB2YWxpZGF0ZSB0aGUgZW1iZWRkZWQgdGVzdHMKXGVuZHt2ZXJiYXRpbX0KClRoZSBcdWxpbmt7XG1vZHVsZXt1bml0dGVzdH19ey4uL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbH0gbW9kdWxlIGlzIG5vdAphcyBlZmZvcnRsZXNzIGFzIHRoZSBcbW9kdWxle2RvY3Rlc3R9IG1vZHVsZSwgYnV0IGl0IGFsbG93cyBhIG1vcmUKY29tcHJlaGVuc2l2ZSBzZXQgb2YgdGVzdHMgdG8gYmUgbWFpbnRhaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGU6CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCB1bml0dGVzdAoKY2xhc3MgVGVzdFN0YXRpc3RpY2FsRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF9hdmVyYWdlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXZlcmFnZShbMjAsIDMwLCA3MF0pLCA0MC4wKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoYXZlcmFnZShbMSwgNSwgN10pLCAxKSwgNC4zKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBhdmVyYWdlLCBbXSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGF2ZXJhZ2UsIDIwLCAzMCwgNzApCgp1bml0dGVzdC5tYWluKCkgIyBDYWxsaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSBpbnZva2VzIGFsbCB0ZXN0cwpcZW5ke3ZlcmJhdGltfQoKXHNlY3Rpb257QmF0dGVyaWVzIEluY2x1ZGVkXGxhYmVse2JhdHRlcmllcy1pbmNsdWRlZH19CgpQeXRob24gaGFzIGEgYGBiYXR0ZXJpZXMgaW5jbHVkZWQnJyBwaGlsb3NvcGh5LiAgVGhpcyBpcyBiZXN0IHNlZW4KdGhyb3VnaCB0aGUgc29waGlzdGljYXRlZCBhbmQgcm9idXN0IGNhcGFiaWxpdGllcyBvZiBpdHMgbGFyZ2VyCnBhY2thZ2VzLiBGb3IgZXhhbXBsZToKCiogVGhlIFx1bGlua3tcbW9kdWxle3htbHJwY2xpYn19ey4uL2xpYi9tb2R1bGUteG1scnBjbGliLmh0bWx9IGFuZApcdWxpbmt7XG1vZHVsZXtTaW1wbGVYTUxSUENTZXJ2ZXJ9fXsuLi9saWIvbW9kdWxlLVNpbXBsZVhNTFJQQ1NlcnZlci5odG1sfQptb2R1bGVzIG1ha2UgaW1wbGVtZW50aW5nIHJlbW90ZSBwcm9jZWR1cmUgY2FsbHMgaW50byBhbiBhbG1vc3QgdHJpdmlhbAp0YXNrLiAgRGVzcGl0ZSB0aGUgbmFtZXMsIG5vIGRpcmVjdCBrbm93bGVkZ2Ugb3IgaGFuZGxpbmcgb2YgWE1MIGlzIG5lZWRlZC4KCiogVGhlIFx1bGlua3tcbW9kdWxle2VtYWlsfX17Li4vbGliL21vZHVsZS1lbWFpbC5odG1sfQpwYWNrYWdlIGlzIGEgbGlicmFyeSBmb3IgbWFuYWdpbmcgZW1haWwgbWVzc2FnZXMsCmluY2x1ZGluZyBNSU1FIGFuZCBvdGhlciBSRkMgMjgyMi1iYXNlZCBtZXNzYWdlIGRvY3VtZW50cy4gIFVubGlrZQpcbW9kdWxle3NtdHBsaWJ9IGFuZCBcbW9kdWxle3BvcGxpYn0gd2hpY2ggYWN0dWFsbHkgc2VuZCBhbmQgcmVjZWl2ZQptZXNzYWdlcywgdGhlIGVtYWlsIHBhY2thZ2UgaGFzIGEgY29tcGxldGUgdG9vbHNldCBmb3IgYnVpbGRpbmcgb3IKZGVjb2RpbmcgY29tcGxleCBtZXNzYWdlIHN0cnVjdHVyZXMgKGluY2x1ZGluZyBhdHRhY2htZW50cykKYW5kIGZvciBpbXBsZW1lbnRpbmcgaW50ZXJuZXQgZW5jb2RpbmcgYW5kIGhlYWRlciBwcm90b2NvbHMuCgoqIFRoZSBcdWxpbmt7XG1vZHVsZXt4bWwuZG9tfX17Li4vbGliL21vZHVsZS14bWwuZG9tLmh0bWx9IGFuZApcdWxpbmt7XG1vZHVsZXt4bWwuc2F4fX17Li4vbGliL21vZHVsZS14bWwuc2F4Lmh0bWx9IHBhY2thZ2VzIHByb3ZpZGUKcm9idXN0IHN1cHBvcnQgZm9yIHBhcnNpbmcgdGhpcyBwb3B1bGFyIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0LiAgTGlrZXdpc2UsCnRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIHN1cHBvcnRzIGRpcmVjdCByZWFkcyBhbmQgd3JpdGVzIGluIGEgY29tbW9uCmRhdGFiYXNlIGZvcm1hdC4gIFRvZ2V0aGVyLCB0aGVzZSBtb2R1bGVzIGFuZCBwYWNrYWdlcyBncmVhdGx5IHNpbXBsaWZ5CmRhdGEgaW50ZXJjaGFuZ2UgYmV0d2VlbiBweXRob24gYXBwbGljYXRpb25zIGFuZCBvdGhlciB0b29scy4KCiogSW50ZXJuYXRpb25hbGl6YXRpb24gaXMgc3VwcG9ydGVkIGJ5IGEgbnVtYmVyIG9mIG1vZHVsZXMgaW5jbHVkaW5nClx1bGlua3tcbW9kdWxle2dldHRleHR9fXsuLi9saWIvbW9kdWxlLWdldHRleHQuaHRtbH0sClx1bGlua3tcbW9kdWxle2xvY2FsZX19ey4uL2xpYi9tb2R1bGUtbG9jYWxlLmh0bWx9LCBhbmQgdGhlClx1bGlua3tcbW9kdWxle2NvZGVjc319ey4uL2xpYi9tb2R1bGUtY29kZWNzLmh0bWx9IHBhY2thZ2UuCgoKClxjaGFwdGVye1doYXQgTm93PyBcbGFiZWx7d2hhdE5vd319CgpSZWFkaW5nIHRoaXMgdHV0b3JpYWwgaGFzIHByb2JhYmx5IHJlaW5mb3JjZWQgeW91ciBpbnRlcmVzdCBpbiB1c2luZwpQeXRob24gLS0tIHlvdSBzaG91bGQgYmUgZWFnZXIgdG8gYXBwbHkgUHl0aG9uIHRvIHNvbHZlIHlvdXIKcmVhbC13b3JsZCBwcm9ibGVtcy4gIE5vdyB3aGF0IHNob3VsZCB5b3UgZG8/CgpZb3Ugc2hvdWxkIHJlYWQsIG9yIGF0IGxlYXN0IHBhZ2UgdGhyb3VnaCwgdGhlClxjaXRldGl0bGVbLi4vbGliL2xpYi5odG1sXXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LAp3aGljaCBnaXZlcyBjb21wbGV0ZSAodGhvdWdoIHRlcnNlKSByZWZlcmVuY2UgbWF0ZXJpYWwgYWJvdXQgdHlwZXMsCmZ1bmN0aW9ucywgYW5kIG1vZHVsZXMgdGhhdCBjYW4gc2F2ZSB5b3UgYSBsb3Qgb2YgdGltZSB3aGVuIHdyaXRpbmcKUHl0aG9uIHByb2dyYW1zLiAgVGhlIHN0YW5kYXJkIFB5dGhvbiBkaXN0cmlidXRpb24gaW5jbHVkZXMgYQpcZW1waHtsb3R9IG9mIGNvZGUgaW4gYm90aCBDIGFuZCBQeXRob247IHRoZXJlIGFyZSBtb2R1bGVzIHRvIHJlYWQKXFVOSVh7fSBtYWlsYm94ZXMsIHJldHJpZXZlIGRvY3VtZW50cyB2aWEgSFRUUCwgZ2VuZXJhdGUgcmFuZG9tCm51bWJlcnMsIHBhcnNlIGNvbW1hbmQtbGluZSBvcHRpb25zLCB3cml0ZSBDR0kgcHJvZ3JhbXMsIGNvbXByZXNzCmRhdGEsIGFuZCBhIGxvdCBtb3JlOyBza2ltbWluZyB0aHJvdWdoIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZSB3aWxsIGdpdmUKeW91IGFuIGlkZWEgb2Ygd2hhdCdzIGF2YWlsYWJsZS4KClRoZSBtYWpvciBQeXRob24gV2ViIHNpdGUgaXMgXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvfTsgaXQgY29udGFpbnMKY29kZSwgZG9jdW1lbnRhdGlvbiwgYW5kIHBvaW50ZXJzIHRvIFB5dGhvbi1yZWxhdGVkIHBhZ2VzIGFyb3VuZCB0aGUKV2ViLiAgVGhpcyBXZWIgc2l0ZSBpcyBtaXJyb3JlZCBpbiB2YXJpb3VzIHBsYWNlcyBhcm91bmQgdGhlCndvcmxkLCBzdWNoIGFzIEV1cm9wZSwgSmFwYW4sIGFuZCBBdXN0cmFsaWE7IGEgbWlycm9yIG1heSBiZSBmYXN0ZXIKdGhhbiB0aGUgbWFpbiBzaXRlLCBkZXBlbmRpbmcgb24geW91ciBnZW9ncmFwaGljYWwgbG9jYXRpb24uICBBIG1vcmUKaW5mb3JtYWwgc2l0ZSBpcyBcdXJse2h0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L30sIHdoaWNoIGNvbnRhaW5zIGEKYnVuY2ggb2YgUHl0aG9uLXJlbGF0ZWQgcGVyc29uYWwgaG9tZSBwYWdlczsgbWFueSBwZW9wbGUgaGF2ZQpkb3dubG9hZGFibGUgc29mdHdhcmUgdGhlcmUuIE1hbnkgbW9yZSB1c2VyLWNyZWF0ZWQgUHl0aG9uIG1vZHVsZXMKY2FuIGJlIGZvdW5kIGluIHRoZSBcdWxpbmt7UHl0aG9uIFBhY2thZ2UKSW5kZXh9e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpfSAoUHlQSSkuCgpGb3IgUHl0aG9uLXJlbGF0ZWQgcXVlc3Rpb25zIGFuZCBwcm9ibGVtIHJlcG9ydHMsIHlvdSBjYW4gcG9zdCB0byB0aGUKbmV3c2dyb3VwIFxuZXdzZ3JvdXB7Y29tcC5sYW5nLnB5dGhvbn0sIG9yIHNlbmQgdGhlbSB0byB0aGUgbWFpbGluZwpsaXN0IGF0IFxlbWFpbHtweXRob24tbGlzdEBweXRob24ub3JnfS4gIFRoZSBuZXdzZ3JvdXAgYW5kIG1haWxpbmcgbGlzdAphcmUgZ2F0ZXdheWVkLCBzbyBtZXNzYWdlcyBwb3N0ZWQgdG8gb25lIHdpbGwgYXV0b21hdGljYWxseSBiZQpmb3J3YXJkZWQgdG8gdGhlIG90aGVyLiAgVGhlcmUgYXJlIGFyb3VuZCAxMjAgcG9zdGluZ3MgYSBkYXkgKHdpdGggcGVha3MKdXAgdG8gc2V2ZXJhbCBodW5kcmVkKSwKJSBQb3N0aW5ncyBmaWd1cmUgYmFzZWQgb24gYXZlcmFnZSBvZiBsYXN0IHNpeCBtb250aHMgYWN0aXZpdHkgYXMKJSByZXBvcnRlZCBieSB3d3cuZWdyb3Vwcy5jb207IEphbi4gMjAwMCAtIEp1bmUgMjAwMDogMjEyNzIgbXNncyAvIDE4MgolIGRheXMgPSAxMTYuOSBtc2dzIC8gZGF5IGFuZCBzdGVhZGlseSBpbmNyZWFzaW5nLgphc2tpbmcgKGFuZCBhbnN3ZXJpbmcpIHF1ZXN0aW9ucywgc3VnZ2VzdGluZyBuZXcgZmVhdHVyZXMsIGFuZAphbm5vdW5jaW5nIG5ldyBtb2R1bGVzLiAgQmVmb3JlIHBvc3RpbmcsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIGxpc3Qgb2YKXHVsaW5re0ZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zfXtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS99IChhbHNvIGNhbGxlZCB0aGUgRkFRKSwgb3IgbG9vayBmb3IgaXQgaW4gdGhlClxmaWxle01pc2MvfSBkaXJlY3Rvcnkgb2YgdGhlIFB5dGhvbiBzb3VyY2UgZGlzdHJpYnV0aW9uLiAgTWFpbGluZwpsaXN0IGFyY2hpdmVzIGFyZSBhdmFpbGFibGUgYXQgXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGlwZXJtYWlsL30uClRoZSBGQVEgYW5zd2VycyBtYW55IG9mIHRoZSBxdWVzdGlvbnMgdGhhdCBjb21lIHVwIGFnYWluIGFuZCBhZ2FpbiwKYW5kIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlIHNvbHV0aW9uIGZvciB5b3VyIHByb2JsZW0uCgoKXGFwcGVuZGl4CgpcY2hhcHRlcntJbnRlcmFjdGl2ZSBJbnB1dCBFZGl0aW5nIGFuZCBIaXN0b3J5IFN1YnN0aXR1dGlvblxsYWJlbHtpbnRlcmFjdGluZ319CgpTb21lIHZlcnNpb25zIG9mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgc3VwcG9ydCBlZGl0aW5nIG9mIHRoZSBjdXJyZW50CmlucHV0IGxpbmUgYW5kIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLCBzaW1pbGFyIHRvIGZhY2lsaXRpZXMgZm91bmQgaW4KdGhlIEtvcm4gc2hlbGwgYW5kIHRoZSBHTlUgQmFzaCBzaGVsbC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlClxlbXBoe0dOVSBSZWFkbGluZX0gbGlicmFyeSwgd2hpY2ggc3VwcG9ydHMgRW1hY3Mtc3R5bGUgYW5kIHZpLXN0eWxlCmVkaXRpbmcuICBUaGlzIGxpYnJhcnkgaGFzIGl0cyBvd24gZG9jdW1lbnRhdGlvbiB3aGljaCBJIHdvbid0CmR1cGxpY2F0ZSBoZXJlOyBob3dldmVyLCB0aGUgYmFzaWNzIGFyZSBlYXNpbHkgZXhwbGFpbmVkLiAgVGhlCmludGVyYWN0aXZlIGVkaXRpbmcgYW5kIGhpc3RvcnkgZGVzY3JpYmVkIGhlcmUgYXJlIG9wdGlvbmFsbHkKYXZhaWxhYmxlIGluIHRoZSBcVU5JWHt9IGFuZCBDeWdXaW4gdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKVGhpcyBjaGFwdGVyIGRvZXMgXGVtcGh7bm90fSBkb2N1bWVudCB0aGUgZWRpdGluZyBmYWNpbGl0aWVzIG9mIE1hcmsKSGFtbW9uZCdzIFB5dGhvbldpbiBwYWNrYWdlIG9yIHRoZSBUay1iYXNlZCBlbnZpcm9ubWVudCwgSURMRSwKZGlzdHJpYnV0ZWQgd2l0aCBQeXRob24uICBUaGUgY29tbWFuZCBsaW5lIGhpc3RvcnkgcmVjYWxsIHdoaWNoCm9wZXJhdGVzIHdpdGhpbiBET1MgYm94ZXMgb24gTlQgYW5kIHNvbWUgb3RoZXIgRE9TIGFuZCBXaW5kb3dzIGZsYXZvcnMgCmlzIHlldCBhbm90aGVyIGJlYXN0LgoKXHNlY3Rpb257TGluZSBFZGl0aW5nIFxsYWJlbHtsaW5lRWRpdGluZ319CgpJZiBzdXBwb3J0ZWQsIGlucHV0IGxpbmUgZWRpdGluZyBpcyBhY3RpdmUgd2hlbmV2ZXIgdGhlIGludGVycHJldGVyCnByaW50cyBhIHByaW1hcnkgb3Igc2Vjb25kYXJ5IHByb21wdC4gIFRoZSBjdXJyZW50IGxpbmUgY2FuIGJlIGVkaXRlZAp1c2luZyB0aGUgY29udmVudGlvbmFsIEVtYWNzIGNvbnRyb2wgY2hhcmFjdGVycy4gIFRoZSBtb3N0IGltcG9ydGFudApvZiB0aGVzZSBhcmU6IFxrYmR7Qy1BfSAoQ29udHJvbC1BKSBtb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcKb2YgdGhlIGxpbmUsIFxrYmR7Qy1FfSB0byB0aGUgZW5kLCBca2Jke0MtQn0gbW92ZXMgaXQgb25lIHBvc2l0aW9uIHRvCnRoZSBsZWZ0LCBca2Jke0MtRn0gdG8gdGhlIHJpZ2h0LiAgQmFja3NwYWNlIGVyYXNlcyB0aGUgY2hhcmFjdGVyIHRvCnRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IsIFxrYmR7Qy1EfSB0aGUgY2hhcmFjdGVyIHRvIGl0cyByaWdodC4KXGtiZHtDLUt9IGtpbGxzIChlcmFzZXMpIHRoZSByZXN0IG9mIHRoZSBsaW5lIHRvIHRoZSByaWdodCBvZiB0aGUKY3Vyc29yLCBca2Jke0MtWX0geWFua3MgYmFjayB0aGUgbGFzdCBraWxsZWQgc3RyaW5nLgpca2Jke0MtdW5kZXJzY29yZX0gdW5kb2VzIHRoZSBsYXN0IGNoYW5nZSB5b3UgbWFkZTsgaXQgY2FuIGJlIHJlcGVhdGVkCmZvciBjdW11bGF0aXZlIGVmZmVjdC4KClxzZWN0aW9ue0hpc3RvcnkgU3Vic3RpdHV0aW9uIFxsYWJlbHtoaXN0b3J5fX0KCkhpc3Rvcnkgc3Vic3RpdHV0aW9uIHdvcmtzIGFzIGZvbGxvd3MuICBBbGwgbm9uLWVtcHR5IGlucHV0IGxpbmVzCmlzc3VlZCBhcmUgc2F2ZWQgaW4gYSBoaXN0b3J5IGJ1ZmZlciwgYW5kIHdoZW4gYSBuZXcgcHJvbXB0IGlzIGdpdmVuCnlvdSBhcmUgcG9zaXRpb25lZCBvbiBhIG5ldyBsaW5lIGF0IHRoZSBib3R0b20gb2YgdGhpcyBidWZmZXIuClxrYmR7Qy1QfSBtb3ZlcyBvbmUgbGluZSB1cCAoYmFjaykgaW4gdGhlIGhpc3RvcnkgYnVmZmVyLApca2Jke0MtTn0gbW92ZXMgb25lIGRvd24uICBBbnkgbGluZSBpbiB0aGUgaGlzdG9yeSBidWZmZXIgY2FuIGJlCmVkaXRlZDsgYW4gYXN0ZXJpc2sgYXBwZWFycyBpbiBmcm9udCBvZiB0aGUgcHJvbXB0IHRvIG1hcmsgYSBsaW5lIGFzCm1vZGlmaWVkLiAgUHJlc3NpbmcgdGhlIFxrYmR7UmV0dXJufSBrZXkgcGFzc2VzIHRoZSBjdXJyZW50IGxpbmUgdG8KdGhlIGludGVycHJldGVyLiAgXGtiZHtDLVJ9IHN0YXJ0cyBhbiBpbmNyZW1lbnRhbCByZXZlcnNlIHNlYXJjaDsKXGtiZHtDLVN9IHN0YXJ0cyBhIGZvcndhcmQgc2VhcmNoLgoKXHNlY3Rpb257S2V5IEJpbmRpbmdzIFxsYWJlbHtrZXlCaW5kaW5nc319CgpUaGUga2V5IGJpbmRpbmdzIGFuZCBzb21lIG90aGVyIHBhcmFtZXRlcnMgb2YgdGhlIFJlYWRsaW5lIGxpYnJhcnkgY2FuCmJlIGN1c3RvbWl6ZWQgYnkgcGxhY2luZyBjb21tYW5kcyBpbiBhbiBpbml0aWFsaXphdGlvbiBmaWxlIGNhbGxlZApcZmlsZXtcfnt9Ly5pbnB1dHJjfS4gIEtleSBiaW5kaW5ncyBoYXZlIHRoZSBmb3JtCgpcYmVnaW57dmVyYmF0aW19CmtleS1uYW1lOiBmdW5jdGlvbi1uYW1lClxlbmR7dmVyYmF0aW19CgpvcgoKXGJlZ2lue3ZlcmJhdGltfQoic3RyaW5nIjogZnVuY3Rpb24tbmFtZQpcZW5ke3ZlcmJhdGltfQoKYW5kIG9wdGlvbnMgY2FuIGJlIHNldCB3aXRoCgpcYmVnaW57dmVyYmF0aW19CnNldCBvcHRpb24tbmFtZSB2YWx1ZQpcZW5ke3ZlcmJhdGltfQoKRm9yIGV4YW1wbGU6CgpcYmVnaW57dmVyYmF0aW19CiMgSSBwcmVmZXIgdmktc3R5bGUgZWRpdGluZzoKc2V0IGVkaXRpbmctbW9kZSB2aQoKIyBFZGl0IHVzaW5nIGEgc2luZ2xlIGxpbmU6CnNldCBob3Jpem9udGFsLXNjcm9sbC1tb2RlIE9uCgojIFJlYmluZCBzb21lIGtleXM6Ck1ldGEtaDogYmFja3dhcmQta2lsbC13b3JkCiJcQy11IjogdW5pdmVyc2FsLWFyZ3VtZW50CiJcQy14XEMtciI6IHJlLXJlYWQtaW5pdC1maWxlClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgdGhlIGRlZmF1bHQgYmluZGluZyBmb3IgXGtiZHtUYWJ9IGluIFB5dGhvbiBpcyB0byBpbnNlcnQgYQpca2Jke1RhYn0gY2hhcmFjdGVyIGluc3RlYWQgb2YgUmVhZGxpbmUncyBkZWZhdWx0IGZpbGVuYW1lIGNvbXBsZXRpb24KZnVuY3Rpb24uICBJZiB5b3UgaW5zaXN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgcHV0dGluZwoKXGJlZ2lue3ZlcmJhdGltfQpUYWI6IGNvbXBsZXRlClxlbmR7dmVyYmF0aW19CgppbiB5b3VyIFxmaWxle1x+e30vLmlucHV0cmN9LiAgKE9mIGNvdXJzZSwgdGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8KdHlwZSBpbmRlbnRlZCBjb250aW51YXRpb24gbGluZXMgaWYgeW91J3JlIGFjY3VzdG9tZWQgdG8gdXNpbmcKXGtiZHtUYWJ9IGZvciB0aGF0IHB1cnBvc2UuKQoKQXV0b21hdGljIGNvbXBsZXRpb24gb2YgdmFyaWFibGUgYW5kIG1vZHVsZSBuYW1lcyBpcyBvcHRpb25hbGx5CmF2YWlsYWJsZS4gIFRvIGVuYWJsZSBpdCBpbiB0aGUgaW50ZXJwcmV0ZXIncyBpbnRlcmFjdGl2ZSBtb2RlLCBhZGQKdGhlIGZvbGxvd2luZyB0byB5b3VyIHN0YXJ0dXAgZmlsZTpcZm9vdG5vdGV7CiAgUHl0aG9uIHdpbGwgZXhlY3V0ZSB0aGUgY29udGVudHMgb2YgYSBmaWxlIGlkZW50aWZpZWQgYnkgdGhlCiAgXGVudnZhcntQWVRIT05TVEFSVFVQfSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHlvdSBzdGFydCBhbgogIGludGVyYWN0aXZlIGludGVycHJldGVyLn0KXHJlZnN0bW9kaW5kZXh7cmxjb21wbGV0ZXJ9XHJlZmJpbW9kaW5kZXh7cmVhZGxpbmV9CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCBybGNvbXBsZXRlciwgcmVhZGxpbmUKcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoJ3RhYjogY29tcGxldGUnKQpcZW5ke3ZlcmJhdGltfQoKVGhpcyBiaW5kcyB0aGUgXGtiZHtUYWJ9IGtleSB0byB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgc28gaGl0dGluZwp0aGUgXGtiZHtUYWJ9IGtleSB0d2ljZSBzdWdnZXN0cyBjb21wbGV0aW9uczsgaXQgbG9va3MgYXQgUHl0aG9uCnN0YXRlbWVudCBuYW1lcywgdGhlIGN1cnJlbnQgbG9jYWwgdmFyaWFibGVzLCBhbmQgdGhlIGF2YWlsYWJsZSBtb2R1bGUKbmFtZXMuICBGb3IgZG90dGVkIGV4cHJlc3Npb25zIHN1Y2ggYXMgXGNvZGV7c3RyaW5nLmF9LCBpdCB3aWxsCmV2YWx1YXRlIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBmaW5hbCBcY2hhcmFjdGVyey59IGFuZCB0aGVuCnN1Z2dlc3QgY29tcGxldGlvbnMgZnJvbSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIE5vdGUKdGhhdCB0aGlzIG1heSBleGVjdXRlIGFwcGxpY2F0aW9uLWRlZmluZWQgY29kZSBpZiBhbiBvYmplY3Qgd2l0aCBhClxtZXRob2R7X19nZXRhdHRyX18oKX0gbWV0aG9kIGlzIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uCgpBIG1vcmUgY2FwYWJsZSBzdGFydHVwIGZpbGUgbWlnaHQgbG9vayBsaWtlIHRoaXMgZXhhbXBsZS4gIE5vdGUgdGhhdAp0aGlzIGRlbGV0ZXMgdGhlIG5hbWVzIGl0IGNyZWF0ZXMgb25jZSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkOyB0aGlzCmlzIGRvbmUgc2luY2UgdGhlIHN0YXJ0dXAgZmlsZSBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMKdGhlIGludGVyYWN0aXZlIGNvbW1hbmRzLCBhbmQgcmVtb3ZpbmcgdGhlIG5hbWVzIGF2b2lkcyBjcmVhdGluZyBzaWRlCmVmZmVjdHMgaW4gdGhlIGludGVyYWN0aXZlIGVudmlyb25tZW50cy4gIFlvdSBtYXkgZmluZCBpdCBjb252ZW5pZW50CnRvIGtlZXAgc29tZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlcywgc3VjaCBhcwpcdWxpbmt7XG1vZHVsZXtvc319ey4uL2xpYi9tb2R1bGUtb3MuaHRtbH0sIHdoaWNoIHR1cm4Kb3V0IHRvIGJlIG5lZWRlZCBpbiBtb3N0IHNlc3Npb25zIHdpdGggdGhlIGludGVycHJldGVyLgoKXGJlZ2lue3ZlcmJhdGltfQojIEFkZCBhdXRvLWNvbXBsZXRpb24gYW5kIGEgc3RvcmVkIGhpc3RvcnkgZmlsZSBvZiBjb21tYW5kcyB0byB5b3VyIFB5dGhvbgojIGludGVyYWN0aXZlIGludGVycHJldGVyLiBSZXF1aXJlcyBQeXRob24gMi4wKywgcmVhZGxpbmUuIEF1dG9jb21wbGV0ZSBpcwojIGJvdW5kIHRvIHRoZSBFc2Mga2V5IGJ5IGRlZmF1bHQgKHlvdSBjYW4gY2hhbmdlIGl0IC0gc2VlIHJlYWRsaW5lIGRvY3MpLgojCiMgU3RvcmUgdGhlIGZpbGUgaW4gfi8ucHlzdGFydHVwLCBhbmQgc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50CiMgdG8gaXQ6ICAiZXhwb3J0IFBZVEhPTlNUQVJUVVA9L21heC9ob21lL2l0YW1hci8ucHlzdGFydHVwIiBpbiBiYXNoLgojCiMgTm90ZSB0aGF0IFBZVEhPTlNUQVJUVVAgZG9lcyAqbm90KiBleHBhbmQgIn4iLCBzbyB5b3UgaGF2ZSB0byBwdXQgaW4gdGhlCiMgZnVsbCBwYXRoIHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkuCgppbXBvcnQgYXRleGl0CmltcG9ydCBvcwppbXBvcnQgcmVhZGxpbmUKaW1wb3J0IHJsY29tcGxldGVyCgpoaXN0b3J5UGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ucHloaXN0b3J5IikKCmRlZiBzYXZlX2hpc3RvcnkoaGlzdG9yeVBhdGg9aGlzdG9yeVBhdGgpOgogICAgaW1wb3J0IHJlYWRsaW5lCiAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoaGlzdG9yeVBhdGgpCgppZiBvcy5wYXRoLmV4aXN0cyhoaXN0b3J5UGF0aCk6CiAgICByZWFkbGluZS5yZWFkX2hpc3RvcnlfZmlsZShoaXN0b3J5UGF0aCkKCmF0ZXhpdC5yZWdpc3RlcihzYXZlX2hpc3RvcnkpCmRlbCBvcywgYXRleGl0LCByZWFkbGluZSwgcmxjb21wbGV0ZXIsIHNhdmVfaGlzdG9yeSwgaGlzdG9yeVBhdGgKXGVuZHt2ZXJiYXRpbX0KCgpcc2VjdGlvbntDb21tZW50YXJ5IFxsYWJlbHtjb21tZW50YXJ5fX0KClRoaXMgZmFjaWxpdHkgaXMgYW4gZW5vcm1vdXMgc3RlcCBmb3J3YXJkIGNvbXBhcmVkIHRvIGVhcmxpZXIgdmVyc2lvbnMKb2YgdGhlIGludGVycHJldGVyOyBob3dldmVyLCBzb21lIHdpc2hlcyBhcmUgbGVmdDogSXQgd291bGQgYmUgbmljZSBpZgp0aGUgcHJvcGVyIGluZGVudGF0aW9uIHdlcmUgc3VnZ2VzdGVkIG9uIGNvbnRpbnVhdGlvbiBsaW5lcyAodGhlCnBhcnNlciBrbm93cyBpZiBhbiBpbmRlbnQgdG9rZW4gaXMgcmVxdWlyZWQgbmV4dCkuICBUaGUgY29tcGxldGlvbgptZWNoYW5pc20gbWlnaHQgdXNlIHRoZSBpbnRlcnByZXRlcidzIHN5bWJvbCB0YWJsZS4gIEEgY29tbWFuZCB0bwpjaGVjayAob3IgZXZlbiBzdWdnZXN0KSBtYXRjaGluZyBwYXJlbnRoZXNlcywgcXVvdGVzLCBldGMuLCB3b3VsZCBhbHNvCmJlIHVzZWZ1bC4KCgpcY2hhcHRlcntGbG9hdGluZyBQb2ludCBBcml0aG1ldGljOiAgSXNzdWVzIGFuZCBMaW1pdGF0aW9uc1xsYWJlbHtmcC1pc3N1ZXN9fQpcc2VjdGlvbmF1dGhvcntUaW0gUGV0ZXJzfXt0aW1fb25lQGVtYWlsLm1zbi5jb219CgpGbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBjb21wdXRlciBoYXJkd2FyZSBhcwpiYXNlIDIgKGJpbmFyeSkgZnJhY3Rpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSBkZWNpbWFsIGZyYWN0aW9uCgpcYmVnaW57dmVyYmF0aW19CjAuMTI1ClxlbmR7dmVyYmF0aW19CgpoYXMgdmFsdWUgMS8xMCArIDIvMTAwICsgNS8xMDAwLCBhbmQgaW4gdGhlIHNhbWUgd2F5IHRoZSBiaW5hcnkgZnJhY3Rpb24KClxiZWdpbnt2ZXJiYXRpbX0KMC4wMDEKXGVuZHt2ZXJiYXRpbX0KCmhhcyB2YWx1ZSAwLzIgKyAwLzQgKyAxLzguICBUaGVzZSB0d28gZnJhY3Rpb25zIGhhdmUgaWRlbnRpY2FsIHZhbHVlcywKdGhlIG9ubHkgcmVhbCBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgdGhlIGZpcnN0IGlzIHdyaXR0ZW4gaW4gYmFzZSAxMApmcmFjdGlvbmFsIG5vdGF0aW9uLCBhbmQgdGhlIHNlY29uZCBpbiBiYXNlIDIuCgpVbmZvcnR1bmF0ZWx5LCBtb3N0IGRlY2ltYWwgZnJhY3Rpb25zIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzCmJpbmFyeSBmcmFjdGlvbnMuICBBIGNvbnNlcXVlbmNlIGlzIHRoYXQsIGluIGdlbmVyYWwsIHRoZSBkZWNpbWFsCmZsb2F0aW5nLXBvaW50IG51bWJlcnMgeW91IGVudGVyIGFyZSBvbmx5IGFwcHJveGltYXRlZCBieSB0aGUgYmluYXJ5CmZsb2F0aW5nLXBvaW50IG51bWJlcnMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSBtYWNoaW5lLgoKVGhlIHByb2JsZW0gaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYXQgZmlyc3QgaW4gYmFzZSAxMC4gIENvbnNpZGVyIHRoZQpmcmFjdGlvbiAxLzMuICBZb3UgY2FuIGFwcHJveGltYXRlIHRoYXQgYXMgYSBiYXNlIDEwIGZyYWN0aW9uOgoKXGJlZ2lue3ZlcmJhdGltfQowLjMKXGVuZHt2ZXJiYXRpbX0KCm9yLCBiZXR0ZXIsCgpcYmVnaW57dmVyYmF0aW19CjAuMzMKXGVuZHt2ZXJiYXRpbX0KCm9yLCBiZXR0ZXIsCgpcYmVnaW57dmVyYmF0aW19CjAuMzMzClxlbmR7dmVyYmF0aW19CgphbmQgc28gb24uICBObyBtYXR0ZXIgaG93IG1hbnkgZGlnaXRzIHlvdSdyZSB3aWxsaW5nIHRvIHdyaXRlIGRvd24sIHRoZQpyZXN1bHQgd2lsbCBuZXZlciBiZSBleGFjdGx5IDEvMywgYnV0IHdpbGwgYmUgYW4gaW5jcmVhc2luZ2x5IGJldHRlcgphcHByb3hpbWF0aW9uIHRvIDEvMy4KCkluIHRoZSBzYW1lIHdheSwgbm8gbWF0dGVyIGhvdyBtYW55IGJhc2UgMiBkaWdpdHMgeW91J3JlIHdpbGxpbmcgdG8KdXNlLCB0aGUgZGVjaW1hbCB2YWx1ZSAwLjEgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBiYXNlIDIKZnJhY3Rpb24uICBJbiBiYXNlIDIsIDEvMTAgaXMgdGhlIGluZmluaXRlbHkgcmVwZWF0aW5nIGZyYWN0aW9uCgpcYmVnaW57dmVyYmF0aW19CjAuMDAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMS4uLgpcZW5ke3ZlcmJhdGltfQoKU3RvcCBhdCBhbnkgZmluaXRlIG51bWJlciBvZiBiaXRzLCBhbmQgeW91IGdldCBhbiBhcHByb3hpbWF0aW9uLiAgVGhpcwppcyB3aHkgeW91IHNlZSB0aGluZ3MgbGlrZToKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDAuMQowLjEwMDAwMDAwMDAwMDAwMDAxClxlbmR7dmVyYmF0aW19CgpPbiBtb3N0IG1hY2hpbmVzIHRvZGF5LCB0aGF0IGlzIHdoYXQgeW91J2xsIHNlZSBpZiB5b3UgZW50ZXIgMC4xIGF0CmEgUHl0aG9uIHByb21wdC4gIFlvdSBtYXkgbm90LCB0aG91Z2gsIGJlY2F1c2UgdGhlIG51bWJlciBvZiBiaXRzCnVzZWQgYnkgdGhlIGhhcmR3YXJlIHRvIHN0b3JlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBjYW4gdmFyeSBhY3Jvc3MKbWFjaGluZXMsIGFuZCBQeXRob24gb25seSBwcmludHMgYSBkZWNpbWFsIGFwcHJveGltYXRpb24gdG8gdGhlIHRydWUKZGVjaW1hbCB2YWx1ZSBvZiB0aGUgYmluYXJ5IGFwcHJveGltYXRpb24gc3RvcmVkIGJ5IHRoZSBtYWNoaW5lLiAgT24KbW9zdCBtYWNoaW5lcywgaWYgUHl0aG9uIHdlcmUgdG8gcHJpbnQgdGhlIHRydWUgZGVjaW1hbCB2YWx1ZSBvZgp0aGUgYmluYXJ5IGFwcHJveGltYXRpb24gc3RvcmVkIGZvciAwLjEsIGl0IHdvdWxkIGhhdmUgdG8gZGlzcGxheQoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gMC4xCjAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNQpcZW5ke3ZlcmJhdGltfQoKaW5zdGVhZCEgIFRoZSBQeXRob24gcHJvbXB0IChpbXBsaWNpdGx5KSB1c2VzIHRoZSBidWlsdGluClxmdW5jdGlvbntyZXByKCl9IGZ1bmN0aW9uIHRvIG9idGFpbiBhIHN0cmluZyB2ZXJzaW9uIG9mIGV2ZXJ5dGhpbmcgaXQKZGlzcGxheXMuICBGb3IgZmxvYXRzLCBcY29kZXtyZXByKFx2YXJ7ZmxvYXR9KX0gcm91bmRzIHRoZSB0cnVlCmRlY2ltYWwgdmFsdWUgdG8gMTcgc2lnbmlmaWNhbnQgZGlnaXRzLCBnaXZpbmcKClxiZWdpbnt2ZXJiYXRpbX0KMC4xMDAwMDAwMDAwMDAwMDAwMQpcZW5ke3ZlcmJhdGltfQoKXGNvZGV7cmVwcihcdmFye2Zsb2F0fSl9IHByb2R1Y2VzIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBiZWNhdXNlIGl0CnR1cm5zIG91dCB0aGF0J3MgZW5vdWdoIChvbiBtb3N0IG1hY2hpbmVzKSBzbyB0aGF0Clxjb2Rle2V2YWwocmVwcihcdmFye3h9KSkgPT0gXHZhcnt4fX0gZXhhY3RseSBmb3IgYWxsIGZpbml0ZSBmbG9hdHMKXHZhcnt4fSwgYnV0IHJvdW5kaW5nIHRvIDE2IGRpZ2l0cyBpcyBub3QgZW5vdWdoIHRvIG1ha2UgdGhhdCB0cnVlLgoKTm90ZSB0aGF0IHRoaXMgaXMgaW4gdGhlIHZlcnkgbmF0dXJlIG9mIGJpbmFyeSBmbG9hdGluZy1wb2ludDogdGhpcyBpcwpub3QgYSBidWcgaW4gUHl0aG9uLCBpdCBpcyBub3QgYSBidWcgaW4geW91ciBjb2RlIGVpdGhlciwgYW5kIHlvdSdsbApzZWUgdGhlIHNhbWUga2luZCBvZiB0aGluZyBpbiBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCB5b3VyCmhhcmR3YXJlJ3MgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyAoYWx0aG91Z2ggc29tZSBsYW5ndWFnZXMgbWF5Cm5vdCBcZW1waHtkaXNwbGF5fSB0aGUgZGlmZmVyZW5jZSBieSBkZWZhdWx0LCBvciBpbiBhbGwgb3V0cHV0IG1vZGVzKS4KClB5dGhvbidzIGJ1aWx0aW4gXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbiBwcm9kdWNlcyBvbmx5IDEyCnNpZ25pZmljYW50IGRpZ2l0cywgYW5kIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhhdCBpbnN0ZWFkLiAgSXQncwp1bnVzdWFsIGZvciBcY29kZXtldmFsKHN0cihcdmFye3h9KSl9IHRvIHJlcHJvZHVjZSBcdmFye3h9LCBidXQgdGhlCm91dHB1dCBtYXkgYmUgbW9yZSBwbGVhc2FudCB0byBsb29rIGF0OgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcHJpbnQgc3RyKDAuMSkKMC4xClxlbmR7dmVyYmF0aW19CgpJdCdzIGltcG9ydGFudCB0byByZWFsaXplIHRoYXQgdGhpcyBpcywgaW4gYSByZWFsIHNlbnNlLCBhbiBpbGx1c2lvbjoKdGhlIHZhbHVlIGluIHRoZSBtYWNoaW5lIGlzIG5vdCBleGFjdGx5IDEvMTAsIHlvdSdyZSBzaW1wbHkgcm91bmRpbmcKdGhlIFxlbXBoe2Rpc3BsYXl9IG9mIHRoZSB0cnVlIG1hY2hpbmUgdmFsdWUuCgpPdGhlciBzdXJwcmlzZXMgZm9sbG93IGZyb20gdGhpcyBvbmUuICBGb3IgZXhhbXBsZSwgYWZ0ZXIgc2VlaW5nCgpcYmVnaW57dmVyYmF0aW19Cj4+PiAwLjEKMC4xMDAwMDAwMDAwMDAwMDAwMQpcZW5ke3ZlcmJhdGltfQoKeW91IG1heSBiZSB0ZW1wdGVkIHRvIHVzZSB0aGUgXGZ1bmN0aW9ue3JvdW5kKCl9IGZ1bmN0aW9uIHRvIGNob3AgaXQKYmFjayB0byB0aGUgc2luZ2xlIGRpZ2l0IHlvdSBleHBlY3QuICBCdXQgdGhhdCBtYWtlcyBubyBkaWZmZXJlbmNlOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcm91bmQoMC4xLCAxKQowLjEwMDAwMDAwMDAwMDAwMDAxClxlbmR7dmVyYmF0aW19CgpUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBiaW5hcnkgZmxvYXRpbmctcG9pbnQgdmFsdWUgc3RvcmVkIGZvciAiMC4xIgp3YXMgYWxyZWFkeSB0aGUgYmVzdCBwb3NzaWJsZSBiaW5hcnkgYXBwcm94aW1hdGlvbiB0byAxLzEwLCBzbyB0cnlpbmcKdG8gcm91bmQgaXQgYWdhaW4gY2FuJ3QgbWFrZSBpdCBiZXR0ZXI6ICBpdCB3YXMgYWxyZWFkeSBhcyBnb29kIGFzIGl0CmdldHMuCgpBbm90aGVyIGNvbnNlcXVlbmNlIGlzIHRoYXQgc2luY2UgMC4xIGlzIG5vdCBleGFjdGx5IDEvMTAsIGFkZGluZyAwLjEKdG8gaXRzZWxmIDEwIHRpbWVzIG1heSBub3QgeWllbGQgZXhhY3RseSAxLjAsIGVpdGhlcjoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IHN1bSA9IDAuMAo+Pj4gZm9yIGkgaW4gcmFuZ2UoMTApOgouLi4gICAgIHN1bSArPSAwLjEKLi4uCj4+PiBzdW0KMC45OTk5OTk5OTk5OTk5OTk4OQpcZW5ke3ZlcmJhdGltfQoKQmluYXJ5IGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgaG9sZHMgbWFueSBzdXJwcmlzZXMgbGlrZSB0aGlzLiAgVGhlCnByb2JsZW0gd2l0aCAiMC4xIiBpcyBleHBsYWluZWQgaW4gcHJlY2lzZSBkZXRhaWwgYmVsb3csIGluIHRoZQoiUmVwcmVzZW50YXRpb24gRXJyb3IiIHNlY3Rpb24uICBTZWUKXGNpdGV0aXRsZVtodHRwOi8vd3d3LmxhaGV5LmNvbS9mbG9hdC5odG1de1RoZSBQZXJpbHMgb2YgRmxvYXRpbmcKUG9pbnR9IGZvciBhIG1vcmUgY29tcGxldGUgYWNjb3VudCBvZiBvdGhlciBjb21tb24gc3VycHJpc2VzLgoKQXMgdGhhdCBzYXlzIG5lYXIgdGhlIGVuZCwgYGB0aGVyZSBhcmUgbm8gZWFzeSBhbnN3ZXJzLicnICBTdGlsbCwKZG9uJ3QgYmUgdW5kdWx5IHdhcnkgb2YgZmxvYXRpbmctcG9pbnQhICBUaGUgZXJyb3JzIGluIFB5dGhvbiBmbG9hdApvcGVyYXRpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUsIGFuZCBvbiBtb3N0Cm1hY2hpbmVzIGFyZSBvbiB0aGUgb3JkZXIgb2Ygbm8gbW9yZSB0aGFuIDEgcGFydCBpbiAyKio1MyBwZXIKb3BlcmF0aW9uLiAgVGhhdCdzIG1vcmUgdGhhbiBhZGVxdWF0ZSBmb3IgbW9zdCB0YXNrcywgYnV0IHlvdSBkbyBuZWVkCnRvIGtlZXAgaW4gbWluZCB0aGF0IGl0J3Mgbm90IGRlY2ltYWwgYXJpdGhtZXRpYywgYW5kIHRoYXQgZXZlcnkgZmxvYXQKb3BlcmF0aW9uIGNhbiBzdWZmZXIgYSBuZXcgcm91bmRpbmcgZXJyb3IuCgpXaGlsZSBwYXRob2xvZ2ljYWwgY2FzZXMgZG8gZXhpc3QsIGZvciBtb3N0IGNhc3VhbCB1c2Ugb2YKZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyB5b3UnbGwgc2VlIHRoZSByZXN1bHQgeW91IGV4cGVjdCBpbiB0aGUgZW5kCmlmIHlvdSBzaW1wbHkgcm91bmQgdGhlIGRpc3BsYXkgb2YgeW91ciBmaW5hbCByZXN1bHRzIHRvIHRoZSBudW1iZXIgb2YKZGVjaW1hbCBkaWdpdHMgeW91IGV4cGVjdC4gIFxmdW5jdGlvbntzdHIoKX0gdXN1YWxseSBzdWZmaWNlcywgYW5kIGZvcgpmaW5lciBjb250cm9sIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBQeXRob25zJ3MgXGNvZGV7XCV9IGZvcm1hdApvcGVyYXRvcjogdGhlIFxjb2Rle1wlZ30sIFxjb2Rle1wlZn0gYW5kIFxjb2Rle1wlZX0gZm9ybWF0IGNvZGVzCnN1cHBseSBmbGV4aWJsZSBhbmQgZWFzeSB3YXlzIHRvIHJvdW5kIGZsb2F0IHJlc3VsdHMgZm9yIGRpc3BsYXkuCgoKXHNlY3Rpb257UmVwcmVzZW50YXRpb24gRXJyb3IKICAgICAgICAgXGxhYmVse2ZwLWVycm9yfX0KClRoaXMgc2VjdGlvbiBleHBsYWlucyB0aGUgYGAwLjEnJyBleGFtcGxlIGluIGRldGFpbCwgYW5kIHNob3dzIGhvdwp5b3UgY2FuIHBlcmZvcm0gYW4gZXhhY3QgYW5hbHlzaXMgb2YgY2FzZXMgbGlrZSB0aGlzIHlvdXJzZWxmLiAgQmFzaWMKZmFtaWxpYXJpdHkgd2l0aCBiaW5hcnkgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZC4KClxkZm57UmVwcmVzZW50YXRpb24gZXJyb3J9IHJlZmVycyB0byB0aGF0IHNvbWUgKG1vc3QsIGFjdHVhbGx5KQpkZWNpbWFsIGZyYWN0aW9ucyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBiaW5hcnkgKGJhc2UgMikKZnJhY3Rpb25zLiAgVGhpcyBpcyB0aGUgY2hpZWYgcmVhc29uIHdoeSBQeXRob24gKG9yIFBlcmwsIEMsIFxDcHAsCkphdmEsIEZvcnRyYW4sIGFuZCBtYW55IG90aGVycykgb2Z0ZW4gd29uJ3QgZGlzcGxheSB0aGUgZXhhY3QgZGVjaW1hbApudW1iZXIgeW91IGV4cGVjdDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IDAuMQowLjEwMDAwMDAwMDAwMDAwMDAxClxlbmR7dmVyYmF0aW19CgpXaHkgaXMgdGhhdD8gIDEvMTAgaXMgbm90IGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIGJpbmFyeSBmcmFjdGlvbi4KQWxtb3N0IGFsbCBtYWNoaW5lcyB0b2RheSAoTm92ZW1iZXIgMjAwMCkgdXNlIElFRUUtNzU0IGZsb2F0aW5nIHBvaW50CmFyaXRobWV0aWMsIGFuZCBhbG1vc3QgYWxsIHBsYXRmb3JtcyBtYXAgUHl0aG9uIGZsb2F0cyB0byBJRUVFLTc1NAoiZG91YmxlIHByZWNpc2lvbiIuICA3NTQgZG91YmxlcyBjb250YWluIDUzIGJpdHMgb2YgcHJlY2lzaW9uLCBzbyBvbgppbnB1dCB0aGUgY29tcHV0ZXIgc3RyaXZlcyB0byBjb252ZXJ0IDAuMSB0byB0aGUgY2xvc2VzdCBmcmFjdGlvbiBpdCBjYW4Kb2YgdGhlIGZvcm0gXHZhcntKfS8yKipcdmFye059IHdoZXJlIFx2YXJ7Sn0gaXMgYW4gaW50ZWdlciBjb250YWluaW5nCmV4YWN0bHkgNTMgYml0cy4gIFJld3JpdGluZwoKXGJlZ2lue3ZlcmJhdGltfQogMSAvIDEwIH49IEogLyAoMioqTikKXGVuZHt2ZXJiYXRpbX0KCmFzCgpcYmVnaW57dmVyYmF0aW19Ckogfj0gMioqTiAvIDEwClxlbmR7dmVyYmF0aW19CgphbmQgcmVjYWxsaW5nIHRoYXQgXHZhcntKfSBoYXMgZXhhY3RseSA1MyBiaXRzIChpcyBcY29kZXs+PSAyKio1Mn0gYnV0Clxjb2RlezwgMioqNTN9KSwgdGhlIGJlc3QgdmFsdWUgZm9yIFx2YXJ7Tn0gaXMgNTY6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiAyTCoqNTIKNDUwMzU5OTYyNzM3MDQ5NkwKPj4+IDJMKio1Mwo5MDA3MTk5MjU0NzQwOTkyTAo+Pj4gMkwqKjU2LzEwCjcyMDU3NTk0MDM3OTI3OTNMClxlbmR7dmVyYmF0aW19CgpUaGF0IGlzLCA1NiBpcyB0aGUgb25seSB2YWx1ZSBmb3IgXHZhcntOfSB0aGF0IGxlYXZlcyBcdmFye0p9IHdpdGgKZXhhY3RseSA1MyBiaXRzLiAgVGhlIGJlc3QgcG9zc2libGUgdmFsdWUgZm9yIFx2YXJ7Sn0gaXMgdGhlbiB0aGF0CnF1b3RpZW50IHJvdW5kZWQ6CgpcYmVnaW57dmVyYmF0aW19Cj4+PiBxLCByID0gZGl2bW9kKDJMKio1NiwgMTApCj4+PiByCjZMClxlbmR7dmVyYmF0aW19CgpTaW5jZSB0aGUgcmVtYWluZGVyIGlzIG1vcmUgdGhhbiBoYWxmIG9mIDEwLCB0aGUgYmVzdCBhcHByb3hpbWF0aW9uIGlzCm9idGFpbmVkIGJ5IHJvdW5kaW5nIHVwOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gcSsxCjcyMDU3NTk0MDM3OTI3OTRMClxlbmR7dmVyYmF0aW19CgpUaGVyZWZvcmUgdGhlIGJlc3QgcG9zc2libGUgYXBwcm94aW1hdGlvbiB0byAxLzEwIGluIDc1NCBkb3VibGUKcHJlY2lzaW9uIGlzIHRoYXQgb3ZlciAyKio1Niwgb3IKClxiZWdpbnt2ZXJiYXRpbX0KNzIwNTc1OTQwMzc5Mjc5NCAvIDcyMDU3NTk0MDM3OTI3OTM2ClxlbmR7dmVyYmF0aW19CgpOb3RlIHRoYXQgc2luY2Ugd2Ugcm91bmRlZCB1cCwgdGhpcyBpcyBhY3R1YWxseSBhIGxpdHRsZSBiaXQgbGFyZ2VyIHRoYW4KMS8xMDsgaWYgd2UgaGFkIG5vdCByb3VuZGVkIHVwLCB0aGUgcXVvdGllbnQgd291bGQgaGF2ZSBiZWVuIGEgbGl0dGxlCmJpdCBzbWFsbGVyIHRoYW4gMS8xMC4gIEJ1dCBpbiBubyBjYXNlIGNhbiBpdCBiZSBcZW1waHtleGFjdGx5fSAxLzEwIQoKU28gdGhlIGNvbXB1dGVyIG5ldmVyIGBgc2VlcycnIDEvMTA6ICB3aGF0IGl0IHNlZXMgaXMgdGhlIGV4YWN0CmZyYWN0aW9uIGdpdmVuIGFib3ZlLCB0aGUgYmVzdCA3NTQgZG91YmxlIGFwcHJveGltYXRpb24gaXQgY2FuIGdldDoKClxiZWdpbnt2ZXJiYXRpbX0KPj4+IC4xICogMkwqKjU2CjcyMDU3NTk0MDM3OTI3OTQuMApcZW5ke3ZlcmJhdGltfQoKSWYgd2UgbXVsdGlwbHkgdGhhdCBmcmFjdGlvbiBieSAxMCoqMzAsIHdlIGNhbiBzZWUgdGhlICh0cnVuY2F0ZWQpCnZhbHVlIG9mIGl0cyAzMCBtb3N0IHNpZ25pZmljYW50IGRlY2ltYWwgZGlnaXRzOgoKXGJlZ2lue3ZlcmJhdGltfQo+Pj4gNzIwNTc1OTQwMzc5Mjc5NEwgKiAxMEwqKjMwIC8gMkwqKjU2CjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNUwKXGVuZHt2ZXJiYXRpbX0KCm1lYW5pbmcgdGhhdCB0aGUgZXhhY3QgbnVtYmVyIHN0b3JlZCBpbiB0aGUgY29tcHV0ZXIgaXMgYXBwcm94aW1hdGVseQplcXVhbCB0byB0aGUgZGVjaW1hbCB2YWx1ZSAwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNS4gIFJvdW5kaW5nCnRoYXQgdG8gMTcgc2lnbmlmaWNhbnQgZGlnaXRzIGdpdmVzIHRoZSAwLjEwMDAwMDAwMDAwMDAwMDAxIHRoYXQgUHl0aG9uCmRpc3BsYXlzICh3ZWxsLCB3aWxsIGRpc3BsYXkgb24gYW55IDc1NC1jb25mb3JtaW5nIHBsYXRmb3JtIHRoYXQgZG9lcwpiZXN0LXBvc3NpYmxlIGlucHV0IGFuZCBvdXRwdXQgY29udmVyc2lvbnMgaW4gaXRzIEMgbGlicmFyeSAtLS0geW91cnMgbWF5Cm5vdCEpLgoKXGNoYXB0ZXJ7SGlzdG9yeSBhbmQgTGljZW5zZX0KXGlucHV0e2xpY2Vuc2V9CgpcaW5wdXR7Z2xvc3Nhcnl9CgpcaW5wdXR7dHV0LmluZH0KClxlbmR7ZG9jdW1lbnR9Cg==