Rm9yIHNvbWUgdGltZSwgdGhlIG1vZF9wZXJsIFRvRG8gd2FzIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCBuZXZlciB3YXMKdXBkYXRlZC4gIE1lYW53aGlsZSwgRG91ZyBtYWludGFpbmVkIGhpcyBvd24gY2hlY2tsaXN0IG9mIHRoaW5ncyB0b2RvLApkaWRuJ3Qgc2VlbSB0byBtYWtlIG11Y2ggc2Vuc2UuICBUaGlzIGZpbGUgaXMgbm93IERvdWcncyBtZXNzeSBsaXR0bGUKY2hlY2tsaXN0LCBub3RlcyB0aGF0IG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgdG8geW91LCBvciB5b3UgbWlnaHQKbWlzdW5kZXJzdGFuZC4gIEknbGwgdHJ5IHRvIGNoYW5nZSB0aGluZ3Mgc28geW91IGNhbiB1bmRlcnN0YW5kLCB5b3UKY2FuIGhlbHAgYnkgYXNraW5nIGFib3V0IGFuIGl0ZW0gbGlzdGVkIG9mIGludGVyZXN0IG9yIHN1cHBseSBhIG5ldwpvbmUgdG8gYmUgYWRkZWQuICAKT3IsIEkgbWlnaHQganVzdCBhZGQ6CgotIG1ha2UgdGhlIFRvRG8gZmlsZSB1bmRlcnN0YW5kYWJsZSAKCnRvIHRoZSBUb0RvIGZpbGUgYW5kIG5ldmVyIHJlbW92ZSBpdCA7LSkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTSE9SVCBURVJNIFNUVUZGICh0aGlzIHNlY3Rpb24gc2hvdWxkIGFsd2F5cyBiZSBlbXB0eSBpbiBhIHJlbGVhc2UgdmVyc2lvbiEpCiAgICAgICAgICAgICAgICAgKHdlbGwsIGNsb3NlIHRvIGl0IGFueWhvdykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIEdlcmFsZCdzIHJlcG9ydCBvZiBFbWJwZXJsL3N1Yi1yZXF1ZXN0L3ByaW50IGJyZWFrYWdlCgotIHBlcmwtc3RhdHVzP21vZF9wZXJsX2hvb2tzIGJyb2tlbiB1bmRlciB3aW4zMj8KCi0gcmFuZCgpIGJyb2tlbiB1bmRlciB3aW4zMiEKICAgICAgICAgICBKZWZmIEJha2VyIDxqZWZmQGdvZHppbGxhLnRhbXUuZWR1PgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkRPQ1VNRU5UQVRJT04gKGFyZWFzIHRoYXQgKnJlYWxseSogbmVlZCBzb21lIG1vcmUgb3IgZG9uJ3QgaGF2ZSBhbnkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBtaXNjOgogICsgRE9ORQogICsgU1VJRCBhY2Nlc3MgaHR0cDovL3d3dy5jb3VydGVzYW4uY29tL3N1ZG8vCiAgKyAkRU5We1BBVEh9L1BlcmxTZXRFbnYgYW5kIFBlcmxUYWludENoZWNrCiAgKyBJTy5zbyBhbmQgLVhsaW5rZXIgLUUgIlNhbHZhZG9yIEZhbmRp8W8iIDxmYW5kaW5vQHVzYS5uZXQ+CgotIFBlcmxSdW46OmhhbmRsZXIgaW4gY2dpX3RvX21vZF9wZXJsLnBvZAoKLSBIVFRQIEhlYWRlcnMhISEhCgotIEFwYWNoZTo6ZXhpdC9jaGlsZF90ZXJtaW5hdGUKCi0gcHVzaF9oYW5kbGVycy9zZXRfaGFuZGxlcnMKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpLTk9XTiBCVUdTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICRyIGNhbm5vdCB1c2UgbWFueSBhcGkgbWV0aG9kcyBkdXJpbmcgQ2hpbGRJbml0L0NoaWxkRXhpdCAtPiBTRUdWCgotIGJ5dGVzX3NlbnQgYXJlIG5vdCBsb2dnZWQgaWYgaGVhZGVyIGRvbid0IGdvIHRocm91Z2ggc2VuZF9odHRwX2hlYWRlcigpLCAKICBlLmcgQ0dJLT5oZWFkZXIoLW5waCA9PiAxLCAuLi4pCiAgICAgICAgICAgICAgRXJpYyBDaG9sZXQgPGNob2xldEBsb2dpbHVuZS5jb20+CgotIFNJR0FMUk0vZmxvY2ssIExpbmNvbG4gU3RlaW4gPGxzdGVpbkBjc2hsLm9yZz4KIEkgb2Z0ZW4gdXNlIHRoaXMgdHlwZSBvZiBjb2RlIHRvIGhhbmRsZSBwb3NzaWJseSBibG9ja2VkIGZsb2NrcygpOgoKICAgICAgICBsb2NhbCgkdGltZWRfb3V0KSA9IDA7CiAgICAgICAgbG9jYWwoJFNJR3tBTFJNfSkgPSBzdWIgeyAkdGltZWRfb3V0Kys7IGRpZSAidGltZWQgb3V0IjsgfQogICAgICAgIGFsYXJtKDUpOwogICAgICAgIGV2YWwgewogICAgICAgICAgICAgICAgZmxvY2soRkgsTE9DS19FWCk7CiAgICAgICAgfQogICAgICAgIGFsYXJtKDApOwogICAgICAgIGlmICgkdGltZWRfb3V0KSB7CiAgICAgICAgICAgcHJpbnQgIldlIHRpbWVkIG91dC4gIFNvcnJ5LiI7CiAgICAgICAgfQoKIFRoaXMgaGFzIGJlZW4gd29ya2luZyBpbiBzdGFuZGFsb25lIENHSSBzY3JpcHRzLCBidXQgbm8gbG9uZ2VyIHdvcmtzCiBpbiBtb2RfcGVybC4gIFRoZSBzaWduYWwgaGFuZGxlciBnZXRzIGNhbGxlZCwgYnV0IHRoZW4gdGhlIGZsb2NrKCkKIGNhbGwgc2VlbXMgdG8gYmUgcmVzdGFydGVkLiBJdCBuZXZlciBleGl0IHRoZSBldmFsLiAgU28gdGhpcyBpcyBubyBiaWcgCiBkZWFsLCBJIGp1c3QgcmVwbGFjZSB0aGUgYmxvY2tpbmcgZmxvY2soKSB3aXRoIGEgcG9sbC4KCi0gZmluZCBhIHdheSB0byBwcmV2ZW50ICJodHRwZCBzcGlubmluZyIgKGJ1ZyBpbiBQZXJsLCBub3QgbW9kX3BlcmwpCgotIGxpbmthZ2UgcHJvYmxlbSB3LyBtb2RfYXV0aF9kYm0gKC1sZGJtKQogQ29uZmlnLnBtIE5ldzogbGlicz0nLWxzb2NrZXQgLWxuc2wgLWxkbCAtbG0gLWxjIC1sY3J5cHQgLWxkYicKIFdhczogICAgICAgICAgIGxpYnM9Jy1sc29ja2V0IC1sbnNsIC1sZGIgLWxkbCAtbG0gLWxjIC1sY3J5cHQnCiBTdW5PUyBtYWlsaG9zdC5jbWMubmV0IDUuNSBHZW5lcmljXzEwMzA5My0xNyBzdW40bSBzcGFyYyBzdW40bQogICAgICAgICAgICAgYnJpYW4gbW9vcmUgPGJlbUBjbWMubmV0PgoKLSBzb21ldGltZXMgdy8gPFBlcmw+IHdlIGdldDogW3dhcm5pbmddIFBlcmxTZXRWYXItPm5lbHRzID0gMTExMTk5MiwgZS5nLjoKICAkVXNlciA9ICJ3d3ciOwogICRTZXJ2ZXJUeXBlID0gInN0YW5kYWxvbmUiOwogIEBTY3JpcHRBbGlhcyA9IFsoJy9jZ2ktYmluJywnL3RoZS9wYXRoJyldOwogIEBBbGlhcyA9IFsoJy93ZWIvJywnL3Vzci9ob21lL3dlYicpXTsKCi0gcGVybF9jb25maWcgc2hvdWxkIG5vdCBhdl9zaGlmdCBBUlJBWSByZWZzIGZyb20KICAlQXBhY2hlOjpSZWFkQ29uZmlnOjoKCi0gZGllIGFuZCBBVVRPTE9BRGVkIERFU1RST1kgPT0gZW1wdHkgJEAgKFBlcmwgb3IgbW9kX3BlcmwgYnVnPykKCgotIEV4dFV0aWxzOjpFbWJlZC9FeHRVdGlsczo6TGlibGlzdCBjbGFzaCBzb21ldGltZSB3LwogIFBFUkxfU1RBVElDX0VYVFMsIGxpa2Ugc286IAogVW5yZWNvZ25pemVkIGFyZ3VtZW50IGluIExJQlMgaWdub3JlZDoKICcvb3B0L29yYWNsZS9wcm9kdWN0LzcuMy4zL2xpYi9saWJjbGllbnQuYScgCgogTm90ZSAocHJvYmFibHkgaGFybWxlc3MpOiBObyBsaWJyYXJ5IGZvdW5kIGZvciAtbDpsaWJjbWEuc2wKCiAtV2wsLUUgLVdsLC1CLGRlZmVycmVkIC1ML3Vzci9sb2NhbC9saWIKIC9ob21lL3dlYi9wZXJsNS9saWIvc2l0ZV9wZXJsL3BvcnRhYmxlL2F1dG8vREJEL09yYWNsZS9PcmFjbGUuYSAKIC9ob21lLyAgZXRjIGV0YyAuLi4KICAgICAgICAgICBtYXJrIHJvc3Ryb24gPHVzZW55MDM2QElNQVRJT04uQ09NPgogICAgICAgICAgIEJyaWFuIFNsZXNpbnNreSA8YnNsZXNpbnNAYmVzdC5jb20+CgotIEZyb206IGJyaWFuIG1vb3JlIDxiZW1AQ01DLk5FVD4KICBBcyBBcGFjaGV3ZWVrIHJlcG9ydGVkIGEgY291cGxlIHdlZWtzIGFnbywgJ3NvbWUnIG1vZHVsZXMgb24gU29sYXJpcyBoYXZlCiAgcHJvYmxlbXMgd2l0aCB0aGUgbXV0ZXggbG9ja2luZyBtZXRob2QgdXNlZCBieSAxLjNiNS4gIE9uZSBvZiB3aGljaCBpcwogIG1vZF9wZXJsLiAgVG8gbWFrZSBpdCB3b3JrIEkgaGFkIHRvIC1EVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIG9yCiAgdGhlIHNlcnZlciB3b3VsZCBuZXZlciBhbnN3ZXIgYSByZXF1ZXN0LgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpORVcgU1RVRkYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQXBhY2hlOjpyZWFkX2NsaWVudF9ibG9jayBzaG91bGQgdXNlIHNhZmVtYWxsb2Mvc2FmZWZyZWUsIHJhdGhlcgogIHRoYW4gcGFsbG9jLCBzbyBtZW1vcnkgaXMgcmVsZWFzZWQgYWZ0ZXIgZWFjaCByZWFkKCksIHJhdGhlciB0aGFuIGF0CiAgdGhlIGVuZCBvZiBhIHJlcXVlc3QuICAoZS5nLiBzbyBmaWxlIHVwbG9hZHMgZG9uJ3QgY2F1c2UgdG9vIG11Y2ggZ3Jvd3RoKQoKLS0tIEFwYWNoZS54cwkxOTk4LzA2LzA1IDAyOjA4OjE3CTEuMzAKKysrIEFwYWNoZS54cwkxOTk4LzA2LzEyIDE0OjE4OjIyCkBAIC05MTEsMTEgKzkxMSwxMiBAQAogICAgIGxvbmcgbnJkID0gMDsKIAogICAgIFBQQ09ERToKLSAgICBidWZmZXIgPSAoY2hhciopcGFsbG9jKHItPnBvb2wsIGJ1ZnNpeik7CisgICAgYnVmZmVyID0gKGNoYXIqKXNhZmVtYWxsb2MoYnVmc2l6KTsKICAgICBQRVJMX1JFQURfRlJPTV9DTElFTlQ7CiAgICAgaWYgKCBucmQgPiAwICkgewogCVhQVVNIcyhzdl8ybW9ydGFsKG5ld1NWaXYoKGxvbmcpbnJkKSkpOwogCXN2X3NldHB2bigoU1YqKVNUKDEpLCBidWZmZXIsIG5yZCk7CisgICAgICAgc2FmZWZyZWUoYnVmZmVyKTsKIAlTdlRBSU5URURfb24oKFNWKilTVCgxKSk7CiAgICAgfSAKICAgICBlbHNlIHsKCi0gbW9kX3BlcmwgQyBjb2RlIHN5bWJvbHMsIHNob3VsZCBsb29rIGF0IGNsZWFuaW5nIHVwIG5hbWVzIHdpdGggYQogIGNvbW1vbiBwcmVmaXgsIGUuZy4gbXBfLCBtb2RfcGVybF8sIG1wZXJsXyA/CiAgYWxzbyBzdGF0aWMtaXplIHRob3NlIGZ1bmN0aW9ucyB3ZSBjYW4gCgotIHJlbW92ZSBBcGFjaGU6OlN5bWJvbDo6dW5kZWYgY3J1ZnQsIG5vdyB0aGF0IHRoZSBtYW5kYXRvcnkgY29uc3Qgc3ViCiAgcmVkZWZpbmVkIHdhcm5pbmcgaXMgZG93bmdyYWRlZCBpbiA1LjAwNF8wNS10b2JlCgotIHBlcmxfY2xlYXJfZW52KCkgc2hvdWxkIHNraXAgdGhvc2UgZm91bmQgaW4gUGVybFBhc3NFbnY/CgotIEZpbGU6OmNvcHkoJGZpbGUsKlNURE9VVCkgZG9lc24ndCB3b3JrIChwcF9zeXN3cml0ZSBuZWVkcyB0aWUgc3VwcG9ydCkKCUJpbGwgQ29mZm1hbiA8Y29mZm1hbkB2YWx1ZS5uZXQ+CgotIG9wdGlvbiB0byBzZXQgdWlkL2dpZCBiZWZvcmUgcnVubmluZyBhbnkgUGVybCBjb2RlIChjb3B5LW4tcGFzdGUKICBmcm9tIGh0dHBfbWFpbi5jKSAKCURvdWcgQmFnbGV5IDxkb3VnQGRlamFuZXdzLmNvbT4KCi0gQXBhY2hlOjpVUkkgaW50ZXJmYWNlIHRvIHVyaV9jb21wb25lbnRzIHN0cnVjdHVyZQogCi0gcHJvdmlkZSBuYW1lc3BhY2UgcHJvdGVjdGlvbiB3aGVuICd1c2UgRm9vJyBtaWdodCBiZSB0d28gZGlmZmVyZW50IG1vZHVsZXMKICBpLmUuIHJlLXZpc2l0IEFwYWNoZTo6U2FmZQoKLSBtb3ZlIGF3YXkgZnJvbSByZWFkX2NsaWVudF9ibG9jayB0byB7c2V0dXAsc2hvdWxkLGdldH1fY2xpZW50X2Jsb2NrCiAgc2VlIEFwYWNoZS5wbS9BcGFjaGU6Om5ld19yZWFkCgotIFBlcmxPcHRpb25zIGRpcmVjdGl2ZT8KICAgICAgICAgICBKYXNvbiBSaWVkeSA8ZWpyQGNpc2UudWZsLmVkdT4KCi0gc29tZSBtb2RfcGVybElPIHR5cGUgbWV0aG9kcyBmb3IgeHMgbW9kdWxlcz8gKGUuZy4gQXBhY2hlOjpQZWVrKQoKLSBtZXRob2QgdG8gZmV0Y2ggY3VycmVudCB2YWx1ZSBvZiA8TG9jYXRpb24gLi4uPj8KICAgICAgICAgICAgICAiU2ltb24gTWF0dGhld3MiIDxzYW1AcGVyaXRhcy5jb20+CgotIG1ha2UgJ1BlcmxTZXRWYXIgJEZvbyB2YWx1ZScgd29yayBsaWtlICdsb2NhbCAkRm9vID0gdmFsdWUnIAogIGZvciB0aGUgZ2l2ZW4gbG9jYXRpb24KCi0gUGVybEluaXRIYW5kbGVyIC0gYWxpYXMgdG8gZmlyc3QgYXZhaWxhYmxlCiAgUGVybENsZWFudXBIYW5kbGVyIC0gcmVnaXN0ZXJfY2xlYW51cAoKLSA8UGVybD4gaW4gLmh0YWNjZXNzIChjb3VsZCBhbHNvIGNhbGwga25vd24gYnVnKQoKLSBwcm92aWRlIG5hbWVzcGFjZSBwcm90ZWN0aW9uIGZvciBtb2RfaW5jbHVkZSAjcGVybCdzCgotIGNoYW5nZSBjb25maWd1cmF0aW9uIGR1cmluZyBydW50aW1lPwoKLSBoYXZlIGxvZ19lcnJvci9sb2dfcmVhc29uIGdpdmUgZmlsZS9saW5lIGluZm8gb2YgY2FsbGVyCgotICdtYWtlIGh0bWwnPwoKLSAkQXBhY2hlOjpTZXJ2ZXJTdGFydGluZyBpbiA8UGVybD4KCi0gc29tZXRoaW5nIHdpdGggZXhlYygpPwoKLSBBcGFjaGUtPmh0dHBfbWVzc2FnZSg1MDEpOyAjcmMgY29kZSByZXR1cm5zIGEgc3RyaW5nCgotIFBlcmxGcmVzaFJlc3RhcnQsIHJlc3RhcnRzIG9uIHN0YXJ0dXAsIHNob3VsZCB3ZSBzdG9wIHRoYXQ/CgotIHNwZWNpYWwgdHJlYXRtZW50IGZvciBucGgtIHNjcmlwdHM/CgotIGZpeCBUaHJlYWQtPm5ldyA9PSBsaW51eDwtU0lHVVNSMS0+QXBhY2hlIHNpZ25hbCBjbGFzaAoKLSB3aW4zMjoKICArIGludGVncmF0ZSB3aXRoIFBlcmwgNS4wMDUncyB0aHJlYWRpbmcKICArIG1vZF9pbmNsdWRlICNwZXJsIHN1cHBvcnQKICArIGFiaWxpdHkgdG8gbm1ha2Ugdy9vIGdvaW5nIGludG8gVkMrKwogICsgYWJpbGl0eSB0byBkaXNhYmxlIFBlcmwqSGFuZGxlciBjYWxsYmFjayBob29rcwogICsgbG9vayBhdCBwcm92aWRpbmcgQVNQIChBY3RpdmUgU2VydmVyIFBsdWdpbikgc3VwcG9ydCBmb3IgTlQgdXNlcnMKICArIGdldCByaWQgb2YgZHVwIGJldHdlZW4gdC9jb25mL2h0dHBkLmNvbmYtZGlzdC9odHRwZC5jb25mLXdpbjMyCgotIEBBUkdWIG1hZ2ljLCB0aWUgdG8gcXVlcnkgc3RyaW5nCgotIG92ZXJsb2FkICVFTlYgbWFnaWM6CiAgKyBjYWxsIHN1YnByb2Nlc3NfZW52IHdoZW4gYSB2YWx1ZSBpcyBzZXQgCiAgICAgICAgICAgICAgRG91ZyBCYWdsZXkgPGRvdWdAZGVqYW5ld3MuY29tPgogICsgc28gaXQncyBub3Qgc2V0dXAgdW5sZXNzIGFza2VkIGZvcgoKLSAic2F2ZSBzdGFjayIgbWVjaGFuaXNtIHNvIHdlIGNhbiBnbyBiYWNrIHRvIGNhY2hpbmcgQ1YgbG9va3VwcwoKLSBjbGVhbnVwIE1ha2VmaWxlLlBMISEhCgotIGxvb3NlIGR1cCBjb2RlIGluIEFwYWNoZTo6UmVnaXN0cnksIHVzZSBBcGFjaGU6OlBlcmxSdW4gZnVuY3Rpb25zCgotIGltcHJvdmUgdGhlICJzdGFja2VkIGhhbmRsZXJzIiBpbXBsZW1lbnRhdGlvbiwgaW5jbHVkaW5nOgogICsgY29uZmlnIG1lcmdpbmcgb2YgQVYqJ3MKCiAgKyBhbGxvdyBwdXNoX2hhbmRsZXJzIHRvIGhhdmUgYW4gYWRkaXRpb25hbCBhcmd1bWVudCwgYW4gYXJyYXkgcmVmLAogICAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgYXMgYXJndW1lbnRzLCBlLmcuCiAgICAkci0+cHVzaF9oYW5kbGVycygiUGVybEhhbmRsZXIiLCBcJnNvbWVfc3ViLCBbJ29uZScsICd0d28nLCAnZXRjJ10pOwoKLSBhbGxvdyBQZXJsKkhhbmRsZXIncyB0byBoYXZlIGFyZ3VtZW50cyBpbiBjb25maWcgZmlsZXMsIGUuZy46CgogIChjYWxscyAmRm9vUGFja2FnZTo6aGFuZGxlcigkciwgIk9uZSIsICJUd28iLCAiVGhyZWUiKTsKCi0gYWxsb3cgPFBlcmw+PC9QZXJsPiBjb25maWd1cmF0aW9uIHNlY3Rpb25zIHRvIGhhdmUgcmVhZCBhY2Nlc3MgdG8gaW50ZXJuYWwKICBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgKHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgdGllIGEgJW5hbWVzcGFjZTo6KSAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpLTk9XTiBNT0RVTEUgQlVHUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gY2FuJ3QgbXVsdGlwbGUgQXBhY2hlOjpJbmNsdWRlLT52aXJ0dWFsIGluIGEgc2luZ2xlIHJlcXVlc3QKCi0gKHRoZSBidWcgaW4gQXBhY2hlOjpmb3JrIGlzIHRoYXQgd2Ugc2hvdWxkbid0IG5lZWQgdGhlIGRhbW4gdGhpbmcpCiAgQXBhY2hlOjpmb3JrIGlzIGFuIHVnbHkgd29yayBhcm91bmQgZm9yIHdoYXQgbG9va3MgbGlrZSBtaWdodCBiZQogIGZpeGVkIGluIDEuM2I2OgoKICAqKSBBZnRlciBhIFNJR0hVUCB0aGUgbGlzdGVuaW5nIHNvY2tldHMgaW4gdGhlIHBhcmVudCB3ZXJlbid0CiAgICAgcHJvcGVybHkgbWFya2VkIGZvciBjbG9zdXJlIG9uIGZvcmsoKS4KICAgICBbSvxyZ2VuIEtlaWwgPGprQHRvb2xzLmRlPl0gUFIjMjAwMAoKICBJZiBhbnlvbmUgY2FuIGNvbmZpcm0sIHBsZWFzZSBsZXQgbWUga25vdyEKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpORVcgTU9EVUxFIFNUVUZGCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBpbnRlZ3JhdGUgQXBhY2hlOjpMb2cKCi0gc2hvdWxkIEFwYWNoZTo6UmVnaXN0cnkgdXNlIGZpbGVuYW1lIGluc3RlYWQgb2Ygdmhvc3RfbmFtZSt1cmk/CiAgICAgICAgICAgICAgQmVuIExhdXJpZSA8YmVuQGFsZ3JvdXAuY28udWs+CgotIEFwYWNoZTo6VXRpbDogZnVuY3Rpb25zIGZyb20gYXBhY2hlJ3MgdXRpbCouYyBmaWxlcwoKLSBhcGFjaGUucG06IHVzZSBhcGFjaGUgJzEuM2IzJzsKCi0gaGF2ZSBBcGFjaGU6OlN0YXR1cyBodW50IGZvciBBVVRPTE9BRGluZyAKCi0gQXBhY2hlOjpTYXdBbXBlcnNhbmQKCi0gQXBhY2hlOjpTdGF0dXMgc2hvdWxkIGxpc3QgbnVtYmVyIG9mIHRoaW5ncwoKLSBBcGFjaGU6OkNvbnN0YW50J3MgaW1wb3J0IHNob3VsZCBjb21waWxlIHRoZSBjb25zdGFudCBzdWIKCi0gQXBhY2hlOjpEUHJvZiBhcyBhIEZpeHVwCgotIEFwYWNoZTo6SW5jbHVkZS0+dmlydHVhbCBzaG91bGQgdXBkYXRlICVFTlY/CgotIEFwYWNoZS0+cmVxdWVzdCB2cy4gJF9bMF0KCi0gQXBhY2hlOjpSZWdpc3RyeSBzaG91bGQgaG9ub3IgX19FTkRfXyBhbmQgX19EQVRBX18sCiAgYnV0IGhvdyB0byBnZXQgaXQgcmlnaHQ/CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ0xFQU5VUFMgLSAiaWYgaXQgYWluJ3QgYnJva2UsIGRvbid0IG11Y2sgd2l0aCBpdCIsIGJ1dCB3ZSBzaG91bGQgdGlkeQogICAgICAgICAgICB0aGVzZSB0aGluZ3MgYXQgc29tZSBwb2ludAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCg==