CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGkgYW5kIDAuOS44aiAgWzA3IEphbiAyMDA5XQoKICAqKSBQcm9wZXJseSBjaGVjayBFVlBfVmVyaWZ5RmluYWwoKSBhbmQgc2ltaWxhciByZXR1cm4gdmFsdWVzCiAgICAgKENWRS0yMDA4LTUwNzcpLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXIsIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBQcm9wZXJseSBjaGVjayBFVlBfVmVyaWZ5RmluYWwoKSBhbmQgc2ltaWxhciByZXR1cm4gdmFsdWVzCiAgICAgKENWRS0yMDA4LTUwNzcpLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXIsIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBFbmFibGUgVExTIGV4dGVuc2lvbnMgYnkgZGVmYXVsdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgdGhlIENISUwgZW5naW5lIHRvIGJlIGxvYWRlZCwgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMKICAgICBtdWx0aXRocmVhZGVkIG9yIG5vdC4gKFRoaXMgZG9lcyBub3QgcmVsZWFzZSB0aGUgZGV2ZWxvcGVyIGZyb20gdGhlCiAgICAgb2JsaWdhdGlvbiB0byBzZXQgdXAgdGhlIGR5bmFtaWMgbG9ja2luZyBjYWxsYmFja3MuKQogICAgIFtTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+XQoKICAqKSBVc2UgY29ycmVjdCBleGl0IGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gZGdzdCBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb247IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgUm9sYW5kIERpcmxld2FuZ2VyXQoKICAqKSBUd2VhayBDb25maWd1cmUgc28gdGhhdCB5b3UgbmVlZCB0byBzYXkgImV4cGVyaW1lbnRhbC1qcGFrZSIgdG8gZW5hYmxlCiAgICAgSlBBS0UsIGFuZCBuZWVkIHRvIHVzZSAtRE9QRU5TU0xfRVhQRVJJTUVOVEFMX0pQQUtFIGluIGFwcGxpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgZXhwZXJpbWVudGFsIEpQQUtFIHN1cHBvcnQsIGluY2x1ZGluZyBkZW1vIGF1dGhlbnRpY2F0aW9uIGluCiAgICAgc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTZXQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdjNfYWRkcl9jYW5vbml6ZSgpLgogICAgIFtSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgWE1QUCBTVEFSVFRMUyBpbiBzX2NsaWVudC4KICAgICBbUGhpbGlwIFBhZXBzIDxwaGlsaXBAZnJlZWJzZC5vcmc+XQoKICAqKSBDaGFuZ2UgdGhlIHNlcnZlci1zaWRlIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyBiZWhhdmlvcgogICAgIHRvIGVuc3VyZSB0aGF0IGV2ZW4gd2l0aCB0aGlzIG9wdGlvbiwgb25seSBjaXBoZXJzdWl0ZXMgaW4gdGhlCiAgICAgc2VydmVyJ3MgcHJlZmVyZW5jZSBsaXN0IHdpbGwgYmUgYWNjZXB0ZWQuICAoTm90ZSB0aGF0IHRoZSBvcHRpb24KICAgICBhcHBsaWVzIG9ubHkgd2hlbiByZXN1bWluZyBhIHNlc3Npb24sIHNvIHRoZSBlYXJsaWVyIGJlaGF2aW9yIHdhcwogICAgIGp1c3QgYWJvdXQgdGhlIGFsZ29yaXRobSBjaG9pY2UgZm9yIHN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44aCBhbmQgMC45LjhpICBbMTUgU2VwIDIwMDhdCgogICopIEZpeCBhIHN0YXRlIHRyYW5zaXRpdGlvbiBpbiBzM19zcnZyLmMgYW5kIGQxX3NydnIuYwogICAgICh3YXMgdXNpbmcgU1NMM19TVF9DV19DTE5UX0hFTExPX0IsIHNob3VsZCBiZSAuLi5fU1RfU1dfU1JWUl8uLi4pLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndV0KCiAgKikgVGhlIGZpeCBpbiAwLjkuOGMgdGhhdCBzdXBwb3NlZGx5IGdvdCByaWQgb2YgdW5zYWZlCiAgICAgZG91YmxlLWNoZWNrZWQgbG9ja2luZyB3YXMgaW5jb21wbGV0ZSBmb3IgUlNBIGJsaW5kaW5nLAogICAgIGFkZHJlc3NpbmcganVzdCBvbmUgbGF5ZXIgb2Ygd2hhdCB0dXJucyBvdXQgdG8gaGF2ZSBiZWVuCiAgICAgZG91Ymx5IHVuc2FmZSB0cmlwbGUtY2hlY2tlZCBsb2NraW5nLgoKICAgICBTbyBub3cgZml4IHRoaXMgZm9yIHJlYWwgYnkgcmV0aXJpbmcgdGhlIE1PTlRfSEVMUEVSIG1hY3JvCiAgICAgaW4gY3J5cHRvL3JzYS9yc2FfZWF5LmMuCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWFyaXVzIFNjaGlsZGVyXQoKICAqKSBWYXJpb3VzIHByZWNhdXRpb25hcnkgbWVhc3VyZXM6CgogICAgIC0gQXZvaWQgc2l6ZV90IGludGVnZXIgb3ZlcmZsb3cgaW4gSEFTSF9VUERBVEUgKG1kMzJfY29tbW9uLmgpLgoKICAgICAtIEF2b2lkIGEgYnVmZmVyIG92ZXJmbG93IGluIGQyaV9TU0xfU0VTU0lPTigpIChzc2xfYXNuMS5jKS4KICAgICAgIChOQjogVGhpcyB3b3VsZCByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgc2VjcmV0IHNlc3Npb24gdGlja2V0IGtleQogICAgICAgdG8gZXhwbG9pdCwgaW4gd2hpY2ggY2FzZSB5b3UnZCBiZSBTT0wgZWl0aGVyIHdheS4pCgogICAgIC0gQ2hhbmdlIGJuX25pc3QuYyBzbyB0aGF0IGl0IHdpbGwgcHJvcGVybHkgaGFuZGxlIGlucHV0IEJJR05VTXMKICAgICAgIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlLgoKICAgICAtIEVuZm9yY2UgdGhlICdudW0nIGNoZWNrIGluIEJOX2RpdigpIChibl9kaXYuYykgZm9yIG5vbi1CTl9ERUJVRwogICAgICAgYnVpbGRzLgoKICAgICBbTmVlbCBNZWh0YSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyBlbmdpbmVzIHRvIGJlICJzb2Z0IGxvYWRlZCIgLSBpLmUuIG9wdGlvbmFsbHkgZG9uJ3QgZGllIGlmCiAgICAgdGhlIGxvYWQgZmFpbHMuIFVzZWZ1bCBmb3IgZGlzdHJvcy4KICAgICBbQmVuIExhdXJpZSBhbmQgdGhlIEZyZWVCU0QgdGVhbV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIExvY2FsIE1hY2hpbmUgS2V5c2V0IGF0dHJpYnV0ZSBpbiBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBCTl9HRjJtX21vZF9hcnIoKSB0b3AtYml0IGNsZWFudXAgY29kZS4KICAgICBbSHVhbmcgWWluZ10KCiAgKikgRXhwYW5kIEVOR0lORSB0byBzdXBwb3J0IGVuZ2luZSBzdXBwbGllZCBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGZ1bmN0aW9ucy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgTG9naWNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBDcnlwdG9BUEkgRU5HSU5FIHRvIHN1cHBvcnQgdXNlIG9mIFJTQSBhbmQgRFNBIGtleXMgaGVsZCBpbiBXaW5kb3dzCiAgICAga2V5c3RvcmVzLiBTdXBwb3J0IGZvciBTU0wvVExTIGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b28uCiAgICAgTm90IGNvbXBpbGVkIHVubGVzcyBlbmFibGUtY2FwaWVuZyBzcGVjaWZpZWQgdG8gQ29uZmlndXJlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBMb2dpY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBYNTA5X0FUVFJJQlVURSBjcmVhdGlvbjogZG9udCBzZXQgYXR0cmlidXRlIHVzaW5nCiAgICAgQVNOMV9UWVBFX3NldDEgaWYgTUJTVFJJTkcgZmxhZyBzZXQuIFRoaXMgYnVnIHdvdWxkIGNyYXNoIGNlcnRhaW4KICAgICBhdHRyaWJ1dGUgY3JlYXRpb24gcm91dGluZXMgc3VjaCBhcyBjZXJ0aWZjYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzEyCiAgICAgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhnIGFuZCAwLjkuOGggIFsyOCBNYXkgMjAwOF0KCiAgKikgRml4IGZsYXcgaWYgJ1NlcnZlciBLZXkgZXhjaGFuZ2UgbWVzc2FnZScgaXMgb21pdHRlZCBmcm9tIGEgVExTCiAgICAgaGFuZHNoYWtlIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjaWxlbnQgY3Jhc2ggYXMgZm91bmQgdXNpbmcgdGhlCiAgICAgQ29kZW5vbWljb24gVExTIHRlc3Qgc3VpdGUgKENWRS0yMDA4LTE2NzIpIAogICAgIFtTdGV2ZSBIZW5zb24sIE1hcmsgQ294XQoKICAqKSBGaXggZG91YmxlIGZyZWUgaW4gVExTIHNlcnZlciBuYW1lIGV4dGVuc2lvbnMgd2hpY2ggY291bGQgbGVhZCB0bwogICAgIGEgcmVtb3RlIGNyYXNoIGZvdW5kIGJ5IENvZGVub21pY29uIFRMUyB0ZXN0IHN1aXRlIChDVkUtMjAwOC0wODkxKSAKICAgICBbSm9lIE9ydG9uXQoKICAqKSBDbGVhciBlcnJvciBxdWV1ZSBpbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCkKCiAgICAgQ2xlYXIgdGhlIGVycm9yIHF1ZXVlIHRvIGVuc3VyZSB0aGF0IGVycm9yIGVudHJpZXMgbGVmdCBmcm9tCiAgICAgb2xkZXIgZnVuY3Rpb24gY2FsbHMgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBjb3JyZWN0IG9wZXJhdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZSwgRXJpayBkZSBDYXN0cm8gTG9wb10KCiAgKikgUmVtb3ZlIHJvb3QgQ0EgY2VydGlmaWNhdGVzIG9mIGNvbW1lcmNpYWwgQ0FzOgoKICAgICBUaGUgT3BlblNTTCBwcm9qZWN0IGRvZXMgbm90IHJlY29tbWVuZCBhbnkgc3BlY2lmaWMgQ0EgYW5kIGRvZXMgbm90CiAgICAgaGF2ZSBhbnkgcG9saWN5IHdpdGggcmVzcGVjdCB0byBpbmNsdWRpbmcgb3IgZXhjbHVkaW5nIGFueSBDQS4KICAgICBUaGVyZWZvcmUgaXQgZG9lcyBub3QgbWFrZSBhbnkgc2Vuc2UgdG8gc2hpcCBhbiBhcmJpdHJhcnkgc2VsZWN0aW9uCiAgICAgb2Ygcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgT3BlblNTTCBzb2Z0d2FyZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUlNBIE9BRVAgcGF0Y2hlcyB0byBmaXggdHdvIHNlcGFyYXRlIGludmFsaWQgbWVtb3J5IHJlYWRzLgogICAgIFRoZSBmaXJzdCBvbmUgaW52b2x2ZXMgaW5wdXRzIHdoZW4gJ2x6ZXJvJyBpcyBncmVhdGVyIHRoYW4KICAgICAnU0hBX0RJR0VTVF9MRU5HVEgnIChpdCB3b3VsZCByZWFkIGFib3V0IFNIQV9ESUdFU1RfTEVOR1RIIGJ5dGVzCiAgICAgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgZnJvbSkuIFRoZSBzZWNvbmQgb25lIGludm9sdmVzIGlucHV0cyB3aGVyZQogICAgIHRoZSAnZGInIHNlY3Rpb24gY29udGFpbnMgbm90aGluZyBidXQgemVyb2VzICh0aGVyZSBpcyBhIG9uZS1ieXRlCiAgICAgaW52YWxpZCByZWFkIGFmdGVyIHRoZSBlbmQgb2YgJ2RiJykuCiAgICAgW0l2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT5dCgogICopIFBhcnRpYWwgYmFja3BvcnQgZnJvbSAwLjkuOS1kZXY6CgogICAgIEludHJvZHVjZSBibl9tdWxfbW9udCAoZGVkaWNhdGVkIE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24KICAgICBwcm9jZWR1cmUpIGFzIGEgY2FuZGlkYXRlIGZvciBCSUdOVU0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgogICAgIFdoaWxlIDAuOS45LWRldiB1c2VzIGFzc2VtYmxlciBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzLCBvbmx5CiAgICAgeDg2XzY0IGlzIGF2YWlsYWJsZSBieSBkZWZhdWx0IGhlcmUgaW4gdGhlIDAuOS44IGJyYW5jaCwgYW5kCiAgICAgMzItYml0IHg4NiBpcyBhdmFpbGFibGUgdGhyb3VnaCBhIGNvbXBpbGUtdGltZSBzZXR0aW5nLgoKICAgICBUbyB0cnkgdGhlIDMyLWJpdCB4ODYgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLCB1c2UgQ29uZmlndXJlCiAgICAgb3B0aW9uICJlbmFibGUtbW9udGFzbSIgKHdoaWNoIGV4aXN0cyBvbmx5IGZvciB0aGlzIGJhY2twb3J0KS4KCiAgICAgQXMgImVuYWJsZS1tb250YXNtIiBmb3IgMzItYml0IHg4NiBkaXNjbGFpbXMgY29kZSBzdGFiaWxpdHkKICAgICBhbnl3YXksIGluIHRoaXMgY29uc3RlbGxhdGlvbiB3ZSBhY3RpdmF0ZSBhZGRpdGlvbmFsIGNvZGUKICAgICBiYWNrcG9ydGVkIGZyb20gMC45LjktZGV2IGZvciBmdXJ0aGVyIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywKICAgICBuYW1lbHkgQk5fZnJvbV9tb250Z29tZXJ5X3dvcmQuICAoVG8gZW5hYmxlIHRoaXMgb3RoZXJ3aXNlLAogICAgIGUuZy4geDg2XzY0LCB0cnkgIi1ETU9OVF9GUk9NX1dPUkRfX19OT05fREVGQVVMVF8wXzlfOF9CVUlMRCIuKQoKICAgICBbQW5keSBQb2x5YWtvdiAoYmFja3BvcnQgcGFydGlhbGx5IGJ5IEJvZG8gTW9lbGxlcildCgogICopIEFkZCBUTFMgc2Vzc2lvbiB0aWNrZXQgY2FsbGJhY2suIFRoaXMgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNldAogICAgIFRMUyB0aWNrZXQgY2lwaGVyIGFuZCBITUFDIGtleXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBoYXJkY29kZWQgZml4ZWQKICAgICB2YWx1ZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBrZXkgcm9sbG92ZXIgZm9yIGV4YW1wbGUgd2hlcmUgc2V2ZXJhbCBrZXkKICAgICBzZXRzIG1heSBleGlzdCB3aXRoIGRpZmZlcmVudCBuYW1lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXZlcnNlIEVOR0lORS1pbnRlcm5hbCBsb2dpYyBmb3IgY2FjaGluZyBkZWZhdWx0IEVOR0lORSBoYW5kbGVzLgogICAgIFRoaXMgd2FzIGJyb2tlbiB1bnRpbCBub3cgaW4gMC45LjggcmVsZWFzZXMsIHN1Y2ggdGhhdCB0aGUgb25seSB3YXkKICAgICBhIHJlZ2lzdGVyZWQgRU5HSU5FIGNvdWxkIGJlIHVzZWQgKGFzc3VtaW5nIGl0IGluaXRpYWxpc2VzCiAgICAgc3VjY2Vzc2Z1bGx5IG9uIHRoZSBob3N0KSB3YXMgdG8gZXhwbGljaXRseSBzZXQgaXQgYXMgdGhlIGRlZmF1bHQKICAgICBmb3IgdGhlIHJlbGV2YW50IGFsZ29yaXRobXMuIFRoaXMgaXMgaW4gY29udHJhZGljdGlvbiB3aXRoIDAuOS43CiAgICAgYmVoYXZpb3VyIGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4gV2l0aCB0aGlzIGZpeCwgd2hlbiBhbiBFTkdJTkUgaXMKICAgICByZWdpc3RlcmVkIGludG8gYSBnaXZlbiBhbGdvcml0aG0ncyB0YWJsZSBvZiBpbXBsZW1lbnRhdGlvbnMsIHRoZQogICAgICd1cHRvZGF0ZScgZmxhZyBpcyByZXNldCBzbyB0aGF0IGF1dG8tZGlzY292ZXJ5IHdpbGwgYmUgdXNlZCBuZXh0CiAgICAgdGltZSBhIG5ldyBjb250ZXh0IGZvciB0aGF0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZWxlY3QgYW4KICAgICBpbXBsZW1lbnRhdGlvbi4KICAgICBbSWFuIExpc3RlciAodHdlYWtlZCBieSBHZW9mZiBUaG9ycGUpXQoKICAqKSBCYWNrcG9ydCBvZiBDTVMgY29kZSB0byBPcGVuU1NMIDAuOS44LiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgMC45LjkKICAgICBpbXBsZW1lbnRpb24gaW4gdGhlIGZvbGxvd2luZyB3YXlzOgoKICAgICBMYWNrIG9mIEVWUF9QS0VZX0FTTjFfTUVUSE9EIG1lYW5zIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUKICAgICBoYXJkIGNvZGVkLgoKICAgICBMYWNrIG9mIEJFUiBzdHJlYW1pbmcgc3VwcG9ydCBtZWFucyBvbmUgcGFzcyBzdHJlYW1pbmcgcHJvY2Vzc2luZyBpcwogICAgIG9ubHkgc3VwcG9ydGVkIGlmIGRhdGEgaXMgZGV0YWNoZWQ6IHNldHRpbmcgdGhlIHN0cmVhbWluZyBmbGFnIGlzCiAgICAgaWdub3JlZCBmb3IgZW1iZWRkZWQgY29udGVudC4KCiAgICAgQ01TIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQKICAgICB3aXRoIHRoZSBlbmFibGUtY21zIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSB0aGUgR01QIGVuZ2luZSBnbHVlIHRvIGRvIGRpcmVjdCBjb3BpZXMgYmV0d2VlbiBCSUdOVU0gYW5kCiAgICAgbXB6X3Qgd2hlbiBvcGVuc3NsIGFuZCBHTVAgdXNlIHRoZSBzYW1lIGxpbWIgc2l6ZS4gT3RoZXJ3aXNlIHRoZQogICAgIGV4aXN0aW5nICJjb252ZXJzaW9uIHZpYSBhIHRleHQgc3RyaW5nIGV4cG9ydCIgdHJpY2sgaXMgc3RpbGwgdXNlZC4KICAgICBbUGF1bCBTaGVlciA8cGF1bHNoZWVyQGdtYWlsLmNvbT5dCgogICopIFpsaWIgY29tcHJlc3Npb24gQklPLiBUaGlzIGlzIGEgZmlsdGVyIEJJTyB3aGljaCBjb21wcmVzc2VkIGFuZAogICAgIHVuY29tcHJlc3NlcyBhbnkgZGF0YSBwYXNzZWQgdGhyb3VnaCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTX3dyYXBfa2V5KCkgYW5kIEFFU191bndyYXBfa2V5KCkgZnVuY3Rpb25zIHRvIGltcGxlbWVudAogICAgIFJGQzMzOTQgY29tcGF0aWJsZSBBRVMga2V5IHdyYXBwaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgQVNOMSBzdHJ1Y3R1cmVzLiBBU04xX1NUUklOR19zZXQwKCk6CiAgICAgc2V0cyBzdHJpbmcgZGF0YSB3aXRob3V0IGNvcHlpbmcuIFg1MDlfQUxHT1Jfc2V0MCgpIGFuZAogICAgIFg1MDlfQUxHT1JfZ2V0MCgpOiBzZXQgYW5kIHJldHJpZXZlIFg1MDlfQUxHT1IgKEFsZ29yaXRobUlkZW50aWZpZXIpCiAgICAgZGF0YS4gQXR0cmlidXRlIGZ1bmN0aW9uIFg1MDlhdF9nZXQwX2RhdGFfYnlfT0JKKCk6IHJldHJpZXZlcyBkYXRhCiAgICAgZnJvbSBhbiBYNTA5X0FUVFJJQlVURSBzdHJ1Y3R1cmUgb3B0aW9uYWxseSBjaGVja2luZyBpdCBvY2N1cnMgb25seQogICAgIG9uY2UuIEFTTjFfVFlQRV9zZXQxKCk6IHNldCBhbmQgQVNOMV9UWVBFIHN0cnVjdHVyZSBjb3B5aW5nIHN1cHBsaWVkCiAgICAgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQk4gZmxhZyBoYW5kbGluZyBpbiBSU0FfZWF5X21vZF9leHAoKSBhbmQgQk5fTU9OVF9DVFhfc2V0KCkKICAgICB0byBnZXQgdGhlIGV4cGVjdGVkIEJOX0ZMR19DT05TVFRJTUUgYmVoYXZpb3IuCiAgICAgW0JvZG8gTW9lbGxlciAoR29vZ2xlKV0KICAKICAqKSBOZXR3YXJlIHN1cHBvcnQ6CgogICAgIC0gZml4ZWQgd3JvbmcgdXNhZ2Ugb2YgaW9jdGxzb2NrZXQoKSB3aGVuIGJ1aWxkIGZvciBMSUJDIEJTRCBzb2NrZXRzCiAgICAgLSBmaXhlZCBkb190ZXN0cy5wbCB0byBydW4gdGhlIHRlc3Qgc3VpdGUgd2l0aCBDTElCIGJ1aWxkcyB0b28gKENMSUJfT1BUKQogICAgIC0gYWRkZWQgc29tZSBtb3JlIHRlc3RzIHRvIGRvX3Rlc3RzLnBsCiAgICAgLSBmaXhlZCBSdW5uaW5nUHJvY2VzcyB1c2FnZSBzbyB0aGF0IGl0IHdvcmtzIHdpdGggbmV3ZXIgTElCQyBOREtzIHRvbwogICAgIC0gcmVtb3ZlZCB1c2FnZSBvZiBCTl9MTE9ORyBmb3IgQ0xJQiBidWlsZHMgdG8gYXZvaWQgcnVudGltZSBkZXBlbmRlbmN5CiAgICAgLSBhZGRlZCBuZXcgQ29uZmlndXJlIHRhcmdldHMgbmV0d2FyZS1jbGliLWJzZHNvY2ssIG5ldHdhcmUtY2xpYi1nY2MsCiAgICAgICBuZXR3YXJlLWNsaWItYnNkc29jay1nY2MsIG5ldHdhcmUtbGliYy1ic2Rzb2NrLWdjYwogICAgIC0gdmFyaW91cyBjaGFuZ2VzIHRvIG5ldHdhcmUucGwgdG8gZW5hYmxlIGdjYy1jcm9zcyBidWlsZHMgb24gV2luMzIKICAgICAgIHBsYXRmb3JtCiAgICAgLSBjaGFuZ2VkIGNyeXB0by9iaW8vYl9zb2NrLmMgdG8gd29yayB3aXRoIG1hY3JvIGZ1bmN0aW9ucyAoQ0xJQiBCU0QpCiAgICAgLSB2YXJpb3VzIGNoYW5nZXMgdG8gZml4IG1pc3NpbmcgcHJvdG90eXBlIHdhcm5pbmdzCiAgICAgLSBmaXhlZCB4ODZuYXNtLnBsIHRvIGNyZWF0ZSBjb3JyZWN0IGFzbSBmaWxlcyBmb3IgTkFTTSBDT0ZGIG91dHB1dAogICAgIC0gYWRkZWQgQUVTLCBXSElSTFBPT0wgYW5kIENQVUlEIGFzc2VtYmxlciBjb2RlIHRvIGJ1aWxkIGZpbGVzCiAgICAgLSBhZGRlZCBtaXNzaW5nIEFFUyBhc3NlbWJsZXIgbWFrZSBydWxlcyB0byBtazFtZi5wbAogICAgIC0gZml4ZWQgb3JkZXIgb2YgaW5jbHVkZXMgaW4gYXBwcy9vY3NwLmMgc28gdGhhdCBlX29zLmggc2V0dGluZ3MgYXBwbHkKICAgICBbR3VlbnRlciBLbmF1ZiA8ZWZsYXNoQGdteC5uZXQ+XQoKICAqKSBJbXBsZW1lbnQgY2VydGlmaWNhdGUgc3RhdHVzIHJlcXVlc3QgVExTIGV4dGVuc2lvbiBkZWZpbmVkIGluIFJGQzM1NDYuCiAgICAgQSBjbGllbnQgY2FuIHNldCB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBhbmQgcmVjZWl2ZSB0aGUgZW5jb2RlZAogICAgIE9DU1AgcmVzcG9uc2UgdmlhIGEgY2FsbGJhY2suIEEgc2VydmVyIGNhbiBxdWVyeSB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycwogICAgIGFuZCBzZXQgdGhlIGVuY29kZWQgT0NTUCByZXNwb25zZSBpbiB0aGUgY2FsbGJhY2suIEFkZCBzaW1wbGlmaWVkIGV4YW1wbGVzCiAgICAgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZiBhbmQgMC45LjhnICBbMTkgT2N0IDIwMDddCgogICopIEZpeCB2YXJpb3VzIGJ1Z3M6CiAgICAgKyBCaW5hcnkgaW5jb21wYXRpYmlsaXR5IG9mIHNzbF9jdHhfc3Qgc3RydWN0dXJlCiAgICAgKyBEVExTIGludGVyb3BlcmF0aW9uIHdpdGggbm9uLWNvbXBsaWFudCBzZXJ2ZXJzCiAgICAgKyBEb24ndCBjYWxsIGdldF9zZXNzaW9uX2NiKCkgd2l0aG91dCBwcm9wb3NlZCBzZXNzaW9uCiAgICAgKyBGaXggaWE2NCBhc3NlbWJsZXIgY29kZQogICAgIFtBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZSBhbmQgMC45LjhmICBbMTEgT2N0IDIwMDddCgogICopIERUTFMgSGFuZHNoYWtlIG92ZXJoYXVsLiBUaGVyZSB3ZXJlIGxvbmdzdGFuZGluZyBpc3N1ZXMgd2l0aAogICAgIE9wZW5TU0wgRFRMUyBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2VyZSBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICBSRkMgNDM0NyBjb21wbGlhbnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggT3BlblNTTCBzZXJ2ZXIuCiAgICAgVW5mb3J0dW5hdGVseSBqdXN0IGZpeGluZyB0aGVzZSBpbmNvbXBhdGliaWxpdGllcyB3b3VsZCAiY3V0IG9mZiIKICAgICBwcmUtMC45LjhmIGNsaWVudHMuIFRvIGFsbG93IGZvciBoYXNzbGUgZnJlZSB1cGdyYWRlIHBvc3QtMC45LjhlCiAgICAgc2VydmVyIGtlZXBzIHRvbGVyYXRpbmcgbm9uIFJGQyBjb21wbGlhbnQgc3ludGF4LiBUaGUgb3Bwb3NpdGUgaXMKICAgICBub3QgdHJ1ZSwgMC45LjhmIGNsaWVudCBjYW4gbm90IGNvbW11bmljYXRlIHdpdGggZWFybGllciBzZXJ2ZXIuCiAgICAgVGhpcyB1cGRhdGUgZXZlbiBhZGRyZXNzZXMgQ1ZFLTIwMDctNDk5NS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQ2hhbmdlcyB0byBhdm9pZCBuZWVkIGZvciBmdW5jdGlvbiBjYXN0cyBpbiBPcGVuU1NMOiBzb21lIGNvbXBpbGVycwogICAgIChnY2MgNC4yIGFuZCBsYXRlcikgcmVqZWN0IHRoZWlyIHVzZS4KICAgICBbS3VydCBSb2Vja3ggPGt1cnRAcm9lY2t4LmJlPiwgUGV0ZXIgSGFydGxleSA8cGRoQHV0dGVyLmNoYW9zLm9yZy51az4sCiAgICAgIFN0ZXZlIEhlbnNvbl0KICAKICAqKSBBZGQgUkZDNDUwNyBzdXBwb3J0IHRvIE9wZW5TU0wuIFRoaXMgaW5jbHVkZXMgdGhlIGNvcnJlY3Rpb25zIGluCiAgICAgUkZDNDUwN2Jpcy4gVGhlIGVuY3J5cHRlZCB0aWNrZXQgZm9ybWF0IGlzIGFuIGVuY3J5cHRlZCBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlLCB0aGF0IHdheSBuZXcgc2Vzc2lvbiBmZWF0dXJlcyBhcmUgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnRlZC4KCiAgICAgSWYgYSBjbGllbnQgYXBwbGljYXRpb24gY2FjaGVzIHNlc3Npb24gaW4gYW4gU1NMX1NFU1NJT04gc3RydWN0dXJlCiAgICAgc3VwcG9ydCBpcyB0cmFuc3BhcmVudCBiZWNhdXNlIHRpY2tldHMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTi4KICAgICAKICAgICBUaGUgU1NMX0NUWCBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMga2V5cyBmb3IgdGlja2V0CiAgICAgcHJvdGVjdGlvbiBpbiBzZXJ2ZXJzIHNvIGFnYWluIHN1cHBvcnQgc2hvdWxkIGJlIHBvc3NpYmxlCiAgICAgd2l0aCBubyBhcHBsaWNhdGlvbiBtb2RpZmljYXRpb24uCgogICAgIElmIGEgY2xpZW50IG9yIHNlcnZlciB3aXNoZXMgdG8gZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgdGhlbiB0aGUgb3B0aW9uCiAgICAgU1NMX09QX05PX1RJQ0tFVCBjYW4gYmUgc2V0LgoKICAgICBBZGQgYSBUTFMgZXh0ZW5zaW9uIGRlYnVnZ2luZyBjYWxsYmFjayB0byBhbGxvdyB0aGUgY29udGVudHMgb2YgYW55IGNsaWVudAogICAgIG9yIHNlcnZlciBleHRlbnNpb25zIHRvIGJlIGV4YW1pbmVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgVExTIGV4dGVuc2lvbnMsIHNwZWNpZmljYWxseSBmb3IgdGhlIHNlcnZlcl9uYW1lCiAgICAgZXh0ZW5zaW9uIHNvIGZhci4gIFRoZSBTU0xfU0VTU0lPTiwgU1NMX0NUWCwgYW5kIFNTTCBkYXRhIHN0cnVjdHVyZXMgbm93CiAgICAgaGF2ZSBuZXcgbWVtYmVycyBmb3IgYSBob3N0IG5hbWUuICBUaGUgU1NMIGRhdGEgc3RydWN0dXJlIGhhcyBhbgogICAgIGFkZGl0aW9uYWwgbWVtYmVyIFNTTF9DVFggKmluaXRpYWxfY3R4IHNvIHRoYXQgbmV3IHNlc3Npb25zIGNhbiBiZQogICAgIHN0b3JlZCBpbiB0aGF0IGNvbnRleHQgdG8gYWxsb3cgZm9yIHNlc3Npb24gcmVzdW1wdGlvbiwgZXZlbiBhZnRlciB0aGUKICAgICBTU0wgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBuZXcgU1NMX0NUWCBpbiByZWFjdGlvbiB0byBhIGNsaWVudCdzCiAgICAgc2VydmVyX25hbWUgZXh0ZW5zaW9uLgoKICAgICBOZXcgZnVuY3Rpb25zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWUoKQogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWVfdHlwZSgpCiAgICAgICAgIFNTTF9zZXRfU1NMX0NUWCgpCgogICAgIE5ldyBDVFJMIGNvZGVzIGFuZCBtYWNyb3MgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9DQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRSAgICAgICAgICAgLSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQoKICAgICBvcGVuc3NsIHNfY2xpZW50IGhhcyBhIG5ldyAnLXNlcnZlcm5hbWUgLi4uJyBvcHRpb24uCgogICAgIG9wZW5zc2wgc19zZXJ2ZXIgaGFzIG5ldyBvcHRpb25zICctc2VydmVybmFtZV9ob3N0IC4uLicsICctY2VydDIgLi4uJywKICAgICAnLWtleTIgLi4uJywgJy1zZXJ2ZXJuYW1lX2ZhdGFsJyAoc3ViamVjdCB0byBjaGFuZ2UpLiAgVGhpcyBhbGxvd3MKICAgICB0ZXN0aW5nIHRoZSBIb3N0TmFtZSBleHRlbnNpb24gZm9yIGEgc3BlY2lmaWMgc2luZ2xlIGhvc3QgbmFtZSAoJy1jZXJ0JwogICAgIGFuZCAnLWtleScgcmVtYWluIGZhbGxiYWNrcyBmb3IgaGFuZHNoYWtlcyB3aXRob3V0IEhvc3ROYW1lCiAgICAgbmVnb3RpYXRpb24pLiAgSWYgdGhlIHVucmVjb2duaW56ZWRfbmFtZSBhbGVydCBoYXMgdG8gYmUgc2VudCwgdGhpcyBieQogICAgIGRlZmF1bHQgaXMgYSB3YXJuaW5nOyBpdCBiZWNvbWVzIGZhdGFsIHdpdGggdGhlICctc2VydmVybmFtZV9mYXRhbCcKICAgICBvcHRpb24uCgogICAgIFtQZXRlciBTeWx2ZXN0ZXIsICBSZW15IEFsbGFpcywgQ2hyaXN0b3BoZSBSZW5vdSwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTIGFuZCBTU0UyIGFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgdG8gVkMrKyBidWlsZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNaXRpZ2F0ZSBhdHRhY2sgb24gZmluYWwgc3VidHJhY3Rpb24gaW4gTW9udGdvbWVyeSByZWR1Y3Rpb24uCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEZpeCBjcnlwdG8vZWMvZWNfbXVsdC5jIHRvIHdvcmsgcHJvcGVybHkgd2l0aCBzY2FsYXJzIG9mIHZhbHVlIDAKICAgICAod2hpY2ggcHJldmlvdXNseSBjYXVzZWQgYW4gaW50ZXJuYWwgZXJyb3IpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNxdWVlemUgYW5vdGhlciAxMCUgb3V0IG9mIElHRSBtb2RlIHdoZW4gaW4gIT0gb3V0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBRVMgSUdFIG1vZGUgc3BlZWR1cC4KICAgICBbRGVhbiBHYXVkZXQgKEdvb2dsZSldCgogICopIEFkZCB0aGUgS29yZWFuIHN5bW1ldHJpYyAxMjgtYml0IGNpcGhlciBTRUVEIChzZWUKICAgICBodHRwOi8vd3d3Lmtpc2Eub3Iua3Iva2lzYS9zZWVkL2pzcC9zZWVkX2VuZy5qc3ApIGFuZAogICAgIGFkZCBTRUVEIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTYyOgoKICAgICAgICBUTFNfUlNBX1dJVEhfU0VFRF9DQkNfU0hBICAgICAgPSAgIlNFRUQtU0hBIgogICAgICAgIFRMU19ESEVfRFNTX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiREhFLURTUy1TRUVELVNIQSIKICAgICAgICBUTFNfREhFX1JTQV9XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkRIRS1SU0EtU0VFRC1TSEEiCiAgICAgICAgVExTX0RIX2Fub25fV0lUSF9TRUVEX0NCQ19TSEEgID0gICJBREgtU0VFRC1TSEEiCgogICAgIFRvIG1pbmltaXplIGNoYW5nZXMgYmV0d2VlbiBwYXRjaGxldmVscyBpbiB0aGUgT3BlblNTTCAwLjkuOAogICAgIHNlcmllcywgU0VFRCByZW1haW5zIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gdW5sZXNzIE9wZW5TU0wKICAgICBpcyBjb25maWd1cmVkIHdpdGggJ2VuYWJsZS1zZWVkJy4KICAgICBbS0lTQSwgQm9kbyBNb2VsbGVyXQoKICAqKSBNaXRpZ2F0ZSBicmFuY2ggcHJlZGljdGlvbiBhdHRhY2tzLCB3aGljaCBjYW4gYmUgcHJhY3RpY2FsIGlmIGEKICAgICBzaW5nbGUgcHJvY2Vzc29yIGlzIHNoYXJlZCwgYWxsb3dpbmcgYSBzcHkgcHJvY2VzcyB0byBleHRyYWN0CiAgICAgaW5mb3JtYXRpb24uICBGb3IgZGV0YWlsZWQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiwgc2VlCiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDA3LzAzOSAoTy4gQWNpaWNtZXosIFMuIEd1ZXJvbiwKICAgICBKLi1QLiBTZWlmZXJ0LCAiTmV3IEJyYW5jaCBQcmVkaWN0aW9uIFZ1bG5lcmFiaWxpdGllcyBpbiBPcGVuU1NMCiAgICAgYW5kIE5lY2Vzc2FyeSBTb2Z0d2FyZSBDb3VudGVybWVhc3VyZXMiKS4gIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UKICAgICBhcmUgbmV3IHZlcnNpb25zIEJOX2Rpdl9ub19icmFuY2goKSBhbmQKICAgICBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goKSBvZiBCTl9kaXYoKSBhbmQgQk5fbW9kX2ludmVyc2UoKSwKICAgICByZXNwZWN0aXZlbHksIHdoaWNoIGFyZSBzbG93ZXIsIGJ1dCBhdm9pZCB0aGUgc2VjdXJpdHktcmVsZXZhbnQKICAgICBjb25kaXRpb25hbCBicmFuY2hlcy4gIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBCTl9kaXYoKQogICAgIGFuZCBCTl9tb2RfaW52ZXJzZSgpIGlmIHRoZSBmbGFnIEJOX0ZMR19DT05TVFRJTUUgaXMgc2V0IGZvciBvbmUKICAgICBvZiB0aGUgaW5wdXQgQklHTlVNcy4gIEFsc28sIEJOX2lzX2JpdF9zZXQoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvCiAgICAgcmVtb3ZlIGEgY29uZGl0aW9uYWwgYnJhbmNoLgoKICAgICBCTl9GTEdfQ09OU1RUSU1FIGlzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIHByZXZpb3VzCiAgICAgQk5fRkxHX0VYUF9DT05TVFRJTUUgZmxhZywgc2luY2UgaXQgbm93IGFmZmVjdHMgbW9yZSB0aGFuIGp1c3QKICAgICBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLiAgKFNpbmNlIE9wZW5TU0wgMC45LjdoLCBzZXR0aW5nIHRoaXMgZmxhZwogICAgIGluIHRoZSBleHBvbmVudCBjYXVzZXMgQk5fbW9kX2V4cF9tb250KCkgdG8gdXNlIHRoZSBhbHRlcm5hdGl2ZQogICAgIGltcGxlbWVudGF0aW9uIGluIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKS4pICBUaGUgb2xkIG5hbWUKICAgICByZW1haW5zIGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgU2ltaWxhcnksIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUgaXMgcmVwbGFjZWQgYnkgYSBtb3JlIGdlbmVyYWwKICAgICBSU0FfRkxBR19OT19DT05TVFRJTUUgZmxhZyBzaW5jZSB0aGUgUlNBIGltcGxlbWVudGF0aW9uIG5vdyB1c2VzCiAgICAgY29uc3RhbnQtdGltZSBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vcmUgdGhhbiBqdXN0IGV4cG9uZW50aWF0aW9uLgogICAgIEhlcmUgdG9vIHRoZSBvbGQgbmFtZSBpcyBrZXB0IGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgQk5fQkxJTkRJTkdfbmV3KCkgd2lsbCBub3cgdXNlIEJOX2R1cCgpIGZvciB0aGUgbW9kdWx1cyBzbyB0aGF0CiAgICAgdGhlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSBnZXRzIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlCiAgICAgbW9kdWx1cy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgIkJJR05VTSAqbSIgYXJndW1lbnQgdG8KICAgICBCTl9CTElORElOR19uZXcoKSBhbmQgdG8gQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKCkgbm93CiAgICAgZXNzZW50aWFsbHkgYmVjb21lcyAiY29uc3QgQklHTlVNICptIiwgYWx0aG91Z2ggd2UgY2FuJ3QgYWN0dWFsbHkKICAgICBjaGFuZ2UgdGhpcyBpbiB0aGUgaGVhZGVyIGZpbGUgYmVmb3JlIDAuOS45LiAgSXQgYWxsb3dzCiAgICAgUlNBX3NldHVwX2JsaW5kaW5nKCkgdG8gdXNlIEJOX3dpdGhfZmxhZ3MoKSBvbiB0aGUgbW9kdWx1cyB0bwogICAgIGVuYWJsZSBCTl9GTEdfQ09OU1RUSU1FLgoKICAgICBbTWF0dGhldyBEIFdvb2QgKEludGVsIENvcnApXQoKICAqKSBJbiB0aGUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIGJlIHN0cmljdCBhYm91dCBzZXNzaW9uIElECiAgICAgY29udGV4dCBtYXRjaGluZyAod2hpY2ggbWF0dGVycyBpZiBhbiBhcHBsaWNhdGlvbiB1c2VzIGEgc2luZ2xlCiAgICAgZXh0ZXJuYWwgY2FjaGUgZm9yIGRpZmZlcmVudCBwdXJwb3NlcykuICBQcmV2aW91c2x5LAogICAgIG91dC1vZi1jb250ZXh0IHJldXNlIHdhcyBmb3JiaWRkZW4gb25seSBpZiBTU0xfVkVSSUZZX1BFRVIgd2FzCiAgICAgc2V0LiAgVGhpcyBkaWQgZW5zdXJlIHN0cmljdCBjbGllbnQgdmVyaWZpY2F0aW9uLCBidXQgbWVhbnQgdGhhdCwKICAgICB3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBhIHNpbmdsZSBleHRlcm5hbCBjYWNoZSBmb3IgcXVpdGUKICAgICBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzLCBjbGllbnRzIGNvdWxkIGNpcmN1bXZlbnQgY2lwaGVyc3VpdGUKICAgICByZXN0cmljdGlvbnMgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBJRCBjb250ZXh0IGJ5IHN0YXJ0aW5nIGEgc2Vzc2lvbgogICAgIGluIGEgZGlmZmVyZW50IGNvbnRleHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAiIWVOVUxMIiBpbiBTU0xfREVGQVVMVF9DSVBIRVJfTElTVCB0byBtYWtlIHN1cmUgdGhhdAogICAgIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHN1Y2ggYXMgIkRFRkFVTFQ6UlNBIiBjYW5ub3QgZW5hYmxlCiAgICAgYXV0aGVudGljYXRpb24tb25seSBjaXBoZXJzdWl0ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRoZSBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZml4IENWRS0yMDA2LTM3Mzggd2hpY2ggd2FzCiAgICAgbm90IGNvbXBsZXRlIGFuZCBjb3VsZCBsZWFkIHRvIGEgcG9zc2libGUgc2luZ2xlIGJ5dGUgb3ZlcmZsb3cKICAgICAoQ1ZFLTIwMDctNTEzNSkgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZCBhbmQgMC45LjhlICBbMjMgRmViIDIwMDddCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IChhbmQgc2ltaWxhcmx5IENhbWVsbGlhMTI4IGFuZAogICAgIENhbWVsbGlhMjU2KSBzaGFyZSBhIHNpbmdsZSBtYXNrIGJpdCBpbiB0aGUgbG9naWMgb2YKICAgICBzc2wvc3NsX2NpcGguYywgdGhlIGNvZGUgZm9yIG1hc2tpbmcgb3V0IGRpc2FibGVkIGNpcGhlcnMgbmVlZHMgYQogICAgIGtsdWRnZSB0byB3b3JrIHByb3Blcmx5IGlmIEFFUzEyOCBpcyBhdmFpbGFibGUgYW5kIEFFUzI1NiBpc24ndAogICAgIChvciBpZiBDYW1lbGxpYTEyOCBpcyBhdmFpbGFibGUgYW5kIENhbWVsbGlhMjU2IGlzbid0KS4KICAgICBbVmljdG9yIER1Y2hvdm5pXQoKICAqKSBGaXggdGhlIEJJVCBTVFJJTkcgZW5jb2RpbmcgZ2VuZXJhdGVkIGJ5IGNyeXB0by9lYy9lY19hc24xLmMKICAgICAod2l0aGluIGkyZF9FQ1ByaXZhdGVLZXksIGkyZF9FQ1BLUGFyYW1ldGVycywgaTJkX0VDUGFyYW1ldGVycyk6CiAgICAgV2hlbiBhIHBvaW50IG9yIGEgc2VlZCBpcyBlbmNvZGVkIGluIGEgQklUIFNUUklORywgd2UgbmVlZCB0bwogICAgIHByZXZlbnQgdGhlIHJlbW92YWwgb2YgdHJhaWxpbmcgemVybyBiaXRzIHRvIGdldCB0aGUgcHJvcGVyIERFUgogICAgIGVuY29kaW5nLiAgKEJ5IGRlZmF1bHQsIGNyeXB0by9hc24xL2FfYml0c3RyLmMgYXNzdW1lcyB0aGUgY2FzZQogICAgIG9mIGEgTmFtZWRCaXRMaXN0LCBmb3Igd2hpY2ggdHJhaWxpbmcgMCBiaXRzIG5lZWQgdG8gYmUgcmVtb3ZlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSGF2ZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0b2xlcmF0ZSAibWlzbWF0Y2hlZCIgcmVjb3JkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiB3aGlsZSByZWNlaXZpbmcgQ2xpZW50SGVsbG8gZXZlbiBpZiB0aGUKICAgICBDbGllbnRIZWxsbyBpcyBmcmFnbWVudGVkLiAgKFRoZSBzZXJ2ZXIgY2FuJ3QgaW5zaXN0IG9uIHRoZQogICAgIHBhcnRpY3VsYXIgcHJvdG9jb2wgdmVyc2lvbiBpdCBoYXMgY2hvc2VuIGJlZm9yZSB0aGUgU2VydmVySGVsbG8KICAgICBtZXNzYWdlIGhhcyBpbmZvcm1lZCB0aGUgY2xpZW50IGFib3V0IGhpcyBjaG9pY2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSRkMgMzc3OSBzdXBwb3J0LgogICAgIFtSb2IgQXVzdGVpbiBmb3IgQVJJTiwgQmVuIExhdXJpZV0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBJbXByb3ZlIGhlYWRlciBmaWxlIGZ1bmN0aW9uIG5hbWUgcGFyc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBleHRlbmQgU01UUCBhbmQgSU1BUCBwcm90b2NvbCBlbXVsYXRpb24gaW4gc19jbGllbnQgdG8gdXNlIEVITE8KICAgICBvciBDQVBBQklMSVRZIGhhbmRzaGFrZSBhcyByZXF1aXJlZCBieSBSRkNzLgogICAgIFtHb2V0eiBCYWJpbi1FYmVsbF0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhjIGFuZCAwLjkuOGQgIFsyOCBTZXAgMjAwNl0KCiAgKikgSW50cm9kdWNlIGxpbWl0cyB0byBwcmV2ZW50IG1hbGljaW91cyBrZXlzIGJlaW5nIGFibGUgdG8KICAgICBjYXVzZSBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5NDApCiAgICAgW1N0ZXZlIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQVNOLjEgcGFyc2luZyBvZiBjZXJ0YWluIGludmFsaWQgc3RydWN0dXJlcyB0aGF0IGNhbiByZXN1bHQKICAgICBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5MzcpICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93IGluIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmdW5jdGlvbi4gCiAgICAgKENWRS0yMDA2LTM3MzgpIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEZpeCBTU0wgY2xpZW50IGNvZGUgd2hpY2ggY291bGQgY3Jhc2ggaWYgY29ubmVjdGluZyB0byBhCiAgICAgbWFsaWNpb3VzIFNTTHYyIHNlcnZlci4gIChDVkUtMjAwNi00MzQzKQogICAgIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIFNpbmNlIDAuOS44YiwgY2lwaGVyc3VpdGUgc3RyaW5ncyBuYW1pbmcgZXhwbGljaXQgY2lwaGVyc3VpdGVzCiAgICAgbWF0Y2ggb25seSB0aG9zZS4gIEJlZm9yZSB0aGF0LCAiQUVTMjU2LVNIQSIgd291bGQgYmUgaW50ZXJwcmV0ZWQKICAgICBhcyBhIHBhdHRlcm4gYW5kIG1hdGNoICJBRVMxMjgtU0hBIiB0b28gKHNpbmNlIEFFUzEyOC1TSEEgZ290CiAgICAgdGhlIHNhbWUgc3RyZW5ndGggY2xhc3NpZmljYXRpb24gaW4gMC45LjdoKSBhcyB3ZSBjdXJyZW50bHkgb25seQogICAgIGhhdmUgYSBzaW5nbGUgQUVTIGJpdCBpbiB0aGUgY2lwaGVyc3VpdGUgZGVzY3JpcHRpb24gYml0bWFwLgogICAgIFRoYXQgY2hhbmdlLCBob3dldmVyLCBhbHNvIGFwcGxpZWQgdG8gY2lwaGVyc3VpdGUgc3RyaW5ncyBzdWNoIGFzCiAgICAgIlJDNC1NRDUiIHRoYXQgaW50ZW50aW9uYWxseSBtYXRjaGVkIG11bHRpcGxlIGNpcGhlcnN1aXRlcyAtLQogICAgIG5hbWVseSwgU1NMIDIuMCBjaXBoZXJzdWl0ZXMgaW4gYWRkaXRpb24gdG8gdGhlIG1vcmUgY29tbW9uIG9uZXMKICAgICBmcm9tIFNTTCAzLjAvVExTIDEuMC4KCiAgICAgU28gd2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIGFnYWluOiBOYW1pbmcgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlLCBhbmQgYW55IG90aGVyIHNpbWlsYXIKICAgICBjaXBoZXJzdWl0ZSAoc2FtZSBiaXRtYXApIGZyb20gKm90aGVyKiBwcm90b2NvbCB2ZXJzaW9ucy4KICAgICBUaHVzLCAiUkM0LU1ENSIgYWdhaW4gd2lsbCBwcm9wZXJseSBzZWxlY3QgYm90aCB0aGUgU1NMIDIuMAogICAgIGNpcGhlcnN1aXRlIGFuZCB0aGUgU1NMIDMuMC9UTFMgMS4wIGNpcGhlcnN1aXRlLgoKICAgICBTaW5jZSBTU0wgMi4wIGRvZXMgbm90IGhhdmUgYW55IGNpcGhlcnN1aXRlcyBmb3Igd2hpY2ggdGhlCiAgICAgMTI4LzI1NiBiaXQgZGlzdGluY3Rpb24gd291bGQgYmUgcmVsZXZhbnQsIHRoaXMgd29ya3MgZm9yIG5vdy4KICAgICBUaGUgcHJvcGVyIGZpeCB3aWxsIGJlIHRvIHVzZSBkaWZmZXJlbnQgYml0cyBmb3IgQUVTMTI4IGFuZAogICAgIEFFUzI1Niwgd2hpY2ggd291bGQgaGF2ZSBhdm9pZGVkIHRoZSBwcm9ibGVtcyBmcm9tIHRoZSBiZWdpbm5pbmc7CiAgICAgaG93ZXZlciwgYml0cyBhcmUgc2NhcmNlLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGluIGEgbmV3IHJlbGVhc2UKICAgICAobm90IGp1c3QgYSBwYXRjaGxldmVsKSB3aGVuIHdlIGNhbiBjaGFuZ2UgdGhlIFNTTF9DSVBIRVIKICAgICBkZWZpbml0aW9uIHRvIHNwbGl0IHRoZSBzaW5nbGUgJ3Vuc2lnbmVkIGxvbmcgbWFzaycgYml0bWFwIGludG8KICAgICBtdWx0aXBsZSB2YWx1ZXMgdG8gZXh0ZW5kIHRoZSBhdmFpbGFibGUgc3BhY2UuCgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YiBhbmQgMC45LjhjICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEFkZCBBRVMgSUdFIGFuZCBiaUlHRSBtb2Rlcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IHJhbmRvbW5lc3MgZW50cm9weSBnYXRoZXJpbmcgdG8gdXNlIHBvbGwoKSB3aGVuCiAgICAgcG9zc2libGUgaW5zdGVhZCBvZiBzZWxlY3QoKSwgc2luY2UgdGhlIGxhdHRlciBoYXMgc29tZQogICAgIHVuZGVzaXJhYmxlIGxpbWl0YXRpb25zLgogICAgIFtEYXJyeWwgTWlsZXMgdmlhIFJpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlICJFQ0NkcmFmdCIgY2lwaGVyc3VpdGVzIG1vcmUgdGhvcm91Z2hseS4gIE5vdyBzcGVjaWFsCiAgICAgdHJlYXRtZW50IGluIHNzbC9zc2xfY2lwaC5zIG1ha2VzIHN1cmUgdGhhdCB0aGVzZSBjaXBoZXJzdWl0ZXMKICAgICBjYW5ub3QgYmUgaW1wbGljaXRseSBhY3RpdmF0ZWQgYXMgcGFydCBvZiwgZS5nLiwgdGhlICJBRVMiIGFsaWFzLgogICAgIEhvd2V2ZXIsIHBsZWFzZSB1cGdyYWRlIHRvIE9wZW5TU0wgMC45LjlbLWRldl0gZm9yCiAgICAgbm9uLWV4cGVyaW1lbnRhbCB1c2Ugb2YgdGhlIEVDQyBjaXBoZXJzdWl0ZXMgdG8gZ2V0IFRMUyBleHRlbnNpb24KICAgICBzdXBwb3J0LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgY3VydmUgYW5kIHBvaW50IGZvcm1hdCBuZWdvdGlhdGlvbgogICAgIHRvIGF2b2lkIHBvdGVudGlhbCBoYW5kc2hha2UgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZhdGUgdGhlIHJlbWFpbmluZyBjaXBoZXJzdWl0ZXMgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDEudHh0LiAgVGhlc2UgYXJlIGp1c3QgYXMKICAgICB1bm9mZmljaWFsLCBhbmQgdGhlIElEIGhhcyBsb25nIGV4cGlyZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFJTQSBibGluZGluZyBIZWlzZW5idWcgKHByb2JsZW1zIHNvbWV0aW1lcyBvY2N1cmVkIG9uCiAgICAgZHVhbC1jb3JlIG1hY2hpbmVzKSBhbmQgb3RoZXIgcG90ZW50aWFsIHRocmVhZC1zYWZldHkgaXNzdWVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgc3ltbWV0cmljIGNpcGhlciBDYW1lbGxpYSAoMTI4LWJpdCwgMTkyLWJpdCwgMjU2LWJpdCBrZXkKICAgICB2ZXJzaW9ucyksIHdoaWNoIGlzIG5vdyBhdmFpbGFibGUgZm9yIHJveWFsdHktZnJlZSB1c2UKICAgICAoc2VlIGh0dHA6Ly9pbmZvLmlzbC5udHQuY28uanAvY3J5cHQvZW5nL2luZm8vY2hpdGVraS5odG1sKS4KICAgICBBbHNvLCBhZGQgQ2FtZWxsaWEgVExTIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTMyLgoKICAgICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIGJldHdlZW4gcGF0Y2hsZXZlbHMgaW4gdGhlIE9wZW5TU0wgMC45LjgKICAgICBzZXJpZXMsIENhbWVsbGlhIHJlbWFpbnMgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiB1bmxlc3MgT3BlblNTTAogICAgIGlzIGNvbmZpZ3VyZWQgd2l0aCAnZW5hYmxlLWNhbWVsbGlhJy4KICAgICBbTlRUXQoKICAqKSBEaXNhYmxlIHRoZSBwYWRkaW5nIGJ1ZyBjaGVjayB3aGVuIGNvbXByZXNzaW9uIGlzIGluIHVzZS4gVGhlIHBhZGRpbmcKICAgICBidWcgY2hlY2sgYXNzdW1lcyB0aGUgZmlyc3QgcGFja2V0IGlzIG9mIGV2ZW4gbGVuZ3RoLCB0aGlzIGlzIG5vdAogICAgIG5lY2Vzc2FyaWx5IHRydWUgaWYgY29tcHJlc3NzaW9uIGlzIGVuYWJsZWQgYW5kIGNhbiByZXN1bHQgaW4gZmFsc2UKICAgICBwb3NpdGl2ZXMgY2F1c2luZyBoYW5kc2hha2UgZmFpbHVyZS4gVGhlIGFjdHVhbCBidWcgdGVzdCBpcyBhbmNpZW50CiAgICAgY29kZSBzbyBpdCBpcyBob3BlZCB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGVpdGhlciBoYXZlIGZpeGVkIGl0IGJ5CiAgICAgbm93IG9yIGFueSB3aGljaCBzdGlsbCBoYXZlIHRoZSBidWcgZG8gbm90IHN1cHBvcnQgY29tcHJlc3Npb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhhIGFuZCAwLjkuOGIgIFswNCBNYXkgMjAwNl0KCiAgKikgV2hlbiBhcHBseWluZyBhIGNpcGhlciBydWxlIGNoZWNrIHRvIHNlZSBpZiBzdHJpbmcgbWF0Y2ggaXMgYW4gZXhwbGljaXQKICAgICBjaXBoZXIgc3VpdGUgYW5kIG9ubHkgbWF0Y2ggdGhhdCBvbmUgY2lwaGVyIHN1aXRlIGlmIGl0IGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExpbmsgaW4gbWFuaWZlc3RzIGZvciBWQysrIGlmIG5lZWRlZC4KICAgICBbQXVzdGluIFppZWdsZXIgPGhhbG9zdGF0dWVAZ21haWwuY29tPl0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgd2l0aCBwcm9wb3NlZCBjaGFuZ2VzIChidXQgd2l0aG91dAogICAgIFRMUyBleHRlbnNpb25zLCB3aGljaCBhcmUgc3VwcG9ydGVkIHN0YXJ0aW5nIHdpdGggdGhlIDAuOS45CiAgICAgYnJhbmNoLCBub3QgaW4gdGhlIE9wZW5TU0wgMC45LjggYnJhbmNoKS4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9DSVBIRVJfQ1RYX25ldygpIGFuZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKCkgdG8gc3VwcG9ydAogICAgIG9wYXF1ZSBFVlBfQ0lQSEVSX0NUWCBoYW5kbGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHpsaWIgY29tcHJlc3Npb24gY29kZS4gV2Ugbm93IG9ubHkgdXNlCiAgICAgInpsaWIxLmRsbCIgYW5kIHVzZSB0aGUgZGVmYXVsdCBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbiBvbiBXaW4zMgogICAgIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmRzIG1lbnRpb25lZCBoZXJlOgogICAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQvRExMX0ZBUS50eHQKICAgICBTdGF0aWMgemxpYiBsaW5raW5nIG5vdyB3b3JrcyBvbiBXaW5kb3dzIGFuZCB0aGUgbmV3IC0td2l0aC16bGliLWluY2x1ZGUKICAgICAtLXdpdGgtemxpYi1saWIgb3B0aW9ucyB0byBDb25maWd1cmUgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBsb2NhdGlvbgogICAgIG9mIHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJ5LiBHcmFjZWZ1bGx5IGhhbmRsZSBjYXNlIHdoZXJlIHpsaWIgbGlicmFyeQogICAgIGNhbid0IGJlIGxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXZlcmFsIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlIE9JRCBnZW5lcmF0aW9uIGNvZGUuIFRoZSBvbGQgY29kZQogICAgIHNvbWV0aW1lcyBhbGxvd2VkIGludmFsaWQgT0lEcyAoMS5YIGZvciBYID49IDQwIGZvciBleGFtcGxlKSwgY291bGRuJ3QKICAgICBoYW5kbGUgbnVtYmVycyBsYXJnZXIgdGhhbiBVTE9OR19NQVgsIHRydW5jYXRlZCBwcmludGluZyBhbmQgaGFkIGEKICAgICBub24gc3RhbmRhcmQgT0JKX29iajJ0eHQoKSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIG9mIGVuZ2luZXMgdW5kZXIgZW5naW5lLyBhcyBzaGFyZWQgbGlicmFyaWVzCiAgICAgdW5kZXIgVkMrKyBidWlsZCBzeXN0ZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29ycmVjdGVkIHRoZSBudW1lcm91cyBidWdzIGluIHRoZSBXaW4zMiBwYXRoIHNwbGl0dGVyIGluIERTTy4KICAgICBIb3BlZnVsbHksIHdlIHdpbGwgbm90IHNlZSBhbnkgZmFsc2UgY29tYmluYXRpb24gb2YgcGF0aHMgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjggYW5kIDAuOS44YSAgWzExIE9jdCAyMDA1XQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcKICAgICAocGFydCBvZiBTU0xfT1BfQUxMKS4gIFRoaXMgb3B0aW9uIHVzZWQgdG8gZGlzYWJsZSB0aGUKICAgICBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIHByb3RvY29sLXZlcnNpb24KICAgICByb2xsYmFjayBpbiB0aGUgU1NMIDIuMCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGEgYmFkCiAgICAgaWRlYS4gIChDVkUtMjAwNS0yOTY5KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFl1dGFrYSBPaXdhIChSZXNlYXJjaCBDZW50ZXIKICAgICBmb3IgSW5mb3JtYXRpb24gU2VjdXJpdHksIE5hdGlvbmFsIEluc3RpdHV0ZSBvZiBBZHZhbmNlZCBJbmR1c3RyaWFsCiAgICAgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBbQUlTVF0sIEphcGFuKV0KCiAgKikgQWRkIHR3byBmdW5jdGlvbiB0byBjbGVhciBhbmQgcmV0dXJuIHRoZSB2ZXJpZnkgcGFyYW1ldGVyIGZsYWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEtlZXAgY2lwaGVybGlzdHMgc29ydGVkIGluIHRoZSBzb3VyY2UgaW5zdGVhZCBvZiBzb3J0aW5nIHRoZW0gYXQKICAgICBydW50aW1lLCB0aHVzIHJlbW92aW5nIHRoZSBuZWVkIGZvciBhIGxvY2suCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBdm9pZCBzb21lIHNtYWxsIHN1Ymdyb3VwIGF0dGFja3MgaW4gRGlmZmllLUhlbGxtYW4uCiAgICAgW05pY2sgTWF0aGV3c29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgZnVuY3Rpb25zIGZvciB3ZWxsLWtub3duIHByaW1lcy4KICAgICBbTmljayBNYXRoZXdzb25dCgogICopIEV4dGVuZGVkIFdpbmRvd3MgQ0Ugc3VwcG9ydC4KICAgICBbU2F0b3NoaSBOYWthbXVyYSBhbmQgQW5keSBQb2x5YWtvdl0KCiAgKikgSW5pdGlhbGl6ZSBTU0xfTUVUSE9EIHN0cnVjdHVyZXMgYXQgY29tcGlsZSB0aW1lIGluc3RlYWQgb2YgZHVyaW5nCiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUEtDUzdfZGVjcnlwdCgpIHdvcmsgZXZlbiBpZiBubyBjZXJ0aWZpY2F0ZSBpcyBzdXBwbGllZCBieQogICAgIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBlYWNoIGVuY3J5cHRlZCBrZXkgaW4gdHVybi4gQWRkIHN1cHBvcnQgdG8KICAgICBzbWltZSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aCBhbmQgMC45LjggIFswNSBKdWwgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aSBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgQWRkIGxpYmNyeXB0by5wYyBhbmQgbGlic3NsLnBjIGZvciB0aG9zZSB3aG8gZmVlbCB0aGV5IG5lZWQgdGhlbS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgQ0Euc2ggYW5kIENBLnBsIHNvIHRoZXkgZG9uJ3QgYnVuZGxlIHRoZSBDU1IgYW5kIHRoZSBwcml2YXRlCiAgICAga2V5IGludG8gdGhlIHNhbWUgZmlsZSBhbnkgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBXaW42NCwgYm90aCBJQTY0IGFuZCBBTUQ2NC94NjQgZmxhdm9ycy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC11dGY4IGNvbW1hbmQgbGluZSBhbmQgY29uZmlnIGZpbGUgb3B0aW9uIHRvICdjYScuCiAgICAgW1N0ZWZhbiA8c3RmQHVkb21hLm9yZ10KCiAgKikgUmVtb3ZlZCB0aGUgbWFjcm8gZGVzX2NyeXB0KCksIGFzIGl0IHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggc29tZQogICAgIGxpYnJhcmllcy4gIFVzZSBERVNfY3J5cHQoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb3JyZWN0IG5hbWluZyBvZiB0aGUgJ2NoaWwnIGFuZCAnNDc1OGNjYScgRU5HSU5Fcy4gVGhpcwogICAgIGludm9sdmVzIHJlbmFtaW5nIHRoZSBzb3VyY2UgYW5kIGdlbmVyYXRlZCBzaGFyZWQtbGlicyBmb3IKICAgICBib3RoLiBUaGUgZW5naW5lcyB3aWxsIGFjY2VwdCB0aGUgY29ycmVjdGVkIG9yIGxlZ2FjeSBpZHMKICAgICAoJ25jaXBoZXInIGFuZCAnNDc1OF9jY2EnIHJlc3BlY3RpdmVseSkgd2hlbiBiaW5kaW5nLiBOQiwKICAgICB0aGlzIG9ubHkgYXBwbGllcyB3aGVuIGJ1aWxkaW5nICdzaGFyZWQnLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYXR0cmlidXRlIGZ1bmN0aW9ucyB0byBFVlBfUEtFWSBzdHJ1Y3R1cmUuIE1vZGlmeQogICAgIFBLQ1MxMl9jcmVhdGUoKSB0byByZWNvZ25pemUgYSBDU1AgbmFtZSBhdHRyaWJ1dGUgYW5kCiAgICAgdXNlIGl0LiBNYWtlIC1DU1Agb3B0aW9uIHdvcmsgYWdhaW4gaW4gcGtjczEyIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBibiBibGluZGluZyBjb2RlOgogICAgIC0gYXV0b21hdGljIHJlLWNyZWF0aW9uIG9mIHRoZSBCTl9CTElORElORyBwYXJhbWV0ZXJzIGFmdGVyCiAgICAgICBhIGZpeGVkIG51bWJlciBvZiB1c2VzIChjdXJyZW50bHkgMzIpCiAgICAgLSBhZGQgbmV3IGZ1bmN0aW9uIGZvciBwYXJhbWV0ZXIgY3JlYXRpb24KICAgICAtIGludHJvZHVjZSBmbGFncyB0byBjb250cm9sIHRoZSB1cGRhdGUgYmVoYXZpb3VyIG9mIHRoZQogICAgICAgQk5fQkxJTkRJTkcgcGFyYW1ldGVycwogICAgIC0gaGlkZSBCTl9CTElORElORyBzdHJ1Y3R1cmUKICAgICBBZGQgYSBzZWNvbmQgQk5fQkxJTkRJTkcgc2xvdCB0byB0aGUgUlNBIHN0cnVjdHVyZSB0byBpbXByb3ZlCiAgICAgcGVyZm9ybWFuY2Ugd2hlbiBhIHNpbmdsZSBSU0Egb2JqZWN0IGlzIHNoYXJlZCBhbW9uZyBzZXZlcmFsCiAgICAgdGhyZWFkcy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciBEVExTLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndSA8bmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIERFUiBlbmNvZGVkIHByaXZhdGUga2V5cyAoU1NMX0ZJTEVUWVBFX0FTTjEpCiAgICAgdG8gU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKCkgYW5kIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlKCkKICAgICBbV2FsdGVyIEdvdWxldF0KCiAgKikgUmVtb3ZlIGJ1Z2d5IGFuZCBpbmNvbXBsZXRldCBESCBjZXJ0IHN1cHBvcnQgZnJvbQogICAgIHNzbC9zc2xfcnNhLmMgYW5kIHNzbC9zM19ib3RoLmMKICAgICBbTmlscyBMYXJzY2hdCgogICopIFVzZSBTSEEtMSBpbnN0ZWFkIG9mIE1ENSBhcyB0aGUgZGVmYXVsdCBkaWdlc3QgYWxnb3JpdGhtIGZvcgogICAgIHRoZSBhcHBzL29wZW5zc2wgYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQ29tcGlsZSBjbGVhbiB3aXRoICItV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV2Vycm9yIi4gQ3VycmVudGx5CiAgICAgREVCVUdfU0FGRVNUQUNLIG11c3QgYWxzbyBiZSBzZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSAuL0NvbmZpZ3VyZSBzbyB0aGF0IGNlcnRhaW4gYWxnb3JpdGhtcyBjYW4gYmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgICBUaGUgbmV3IGNvdW50ZXJwaWVjZSB0byAibm8teHh4IiBpcyAiZW5hYmxlLXh4eCIuCgogICAgIFRoZSBwYXRlbnRlZCBSQzUgYW5kIE1EQzIgYWxnb3JpdGhtcyB3aWxsIG5vdyBiZSBkaXNhYmxlZCB1bmxlc3MKICAgICAiZW5hYmxlLXJjNSIgYW5kICJlbmFibGUtbWRjMiIsIHJlc3BlY3RpdmVseSwgYXJlIHNwZWNpZmllZC4KCiAgICAgKElERUEgcmVtYWlucyBlbmFibGVkIGRlc3BpdGUgYmVpbmcgcGF0ZW50ZWQuICBUaGlzIGlzIGJlY2F1c2UgSURFQQogICAgIGlzIGZyZXF1ZW50bHkgcmVxdWlyZWQgZm9yIGludGVyb3BlcmFiaWxpdHksIGFuZCB0aGVyZSBpcyBubyBsaWNlbnNlCiAgICAgZmVlIGZvciBub24tY29tbWVyY2lhbCB1c2UuICBBcyBiZWZvcmUsICJuby1pZGVhIiBjYW4gYmUgdXNlZCB0bwogICAgIGF2b2lkIHRoaXMgYWxnb3JpdGhtLikKCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHByb2Nlc3Npbmcgb2YgcHJveHkgY2VydGlmaWNhdGVzIChzZWUgUkZDIDM4MjApLiAgVGhpcyB3b3JrIHdhcwogICAgIHNwb25zb3JlZCBieSBLVEggKFRoZSBSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSBpbiBTdG9ja2hvbG0pIGFuZAogICAgIEVHRUUgKEVuYWJsaW5nIEdyaWRzIGZvciBFLXNjaWVuY2UgaW4gRXVyb3BlKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSQzQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMvaW1wbGVtZW50YXRpb25zLCBzdWNoCiAgICAgYXMgSW50ZWwgUDQsIElBLTY0IGFuZCBBTUQ2NC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IHV0aWxpdHkgZXh0cmFjdC1zZWN0aW9uLnBsLiBUaGlzIGNhbiBiZSB1c2VkIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBzZWN0aW9uIG51bWJlciBpbiBhIHBvZCBmaWxlIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyZWF0IGVhY2ggZmlsZSBhcwogICAgIGEgc2VwYXJhdGUgY2FzZSBpbiBNYWtlZmlsZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBhZGRpbmcgdHdvIGxpbmVzIHRvIHRoZQogICAgIHBvZCBmaWxlOgoKICAgICA9Zm9yIGNvbW1lbnQgb3BlbnNzbF9zZWN0aW9uOlhYWAoKICAgICBUaGUgYmxhbmsgbGluZSBpcyBtYW5kYXRvcnkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhcmd1bWVudHMgLWNlcnRmb3JtLCAta2V5Zm9ybSBhbmQgLXBhc3MgZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIHRvIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdCBrZXkgYW5kIGNlcnRpZmljYXRlIGZpbGVzIGFuZCBwYXNzcGhyYXNlCiAgICAgc291cmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3RydWN0dXJlIFg1MDlfVkVSSUZZX1BBUkFNIHdoaWNoIGNvbWJpbmVzIGN1cnJlbnQgdmVyaWZ5IHBhcmFtZXRlcnMsCiAgICAgdXBkYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcyBhbmQgYWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuCgogICAgIEFkZCBuZXcgcG9saWN5IHJlbGF0ZWQgdmVyaWZ5IHBhcmFtZXRlcnMsIGluY2x1ZGUgcG9saWN5IGNoZWNraW5nIGluIAogICAgIHN0YW5kYXJkIHZlcmlmeSBjb2RlLiBFbmhhbmNlICdzbWltZScgYXBwbGljYXRpb24gd2l0aCBleHRyYSBwYXJhbWV0ZXJzCiAgICAgdG8gc3VwcG9ydCBwb2xpY3kgY2hlY2tpbmcgYW5kIHByaW50IG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZW5naW5lIHRvIHN1cHBvcnQgVklBIFBhZExvY2sgQUNFIGV4dGVuc2lvbnMgaW4gdGhlIFZJQSBDMwogICAgIE5laGVtaWFoIHByb2Nlc3NvcnMuIFRoZXNlIGV4dGVuc2lvbnMgc3VwcG9ydCBBRVMgZW5jcnlwdGlvbiBpbiBoYXJkd2FyZQogICAgIGFzIHdlbGwgYXMgUk5HICh0aG91Z2ggUk5HIHN1cHBvcnQgaXMgY3VycmVudGx5IGRpc2FibGVkKS4KICAgICBbTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6Piwgd2l0aCBoZWxwIGZyb20gQW5keSBQb2x5YWtvdl0KCiAgKikgRGVwcmVjYXRlIEJOX1tnZXR8c2V0XV9wYXJhbXMoKSBmdW5jdGlvbnMgKHRoZXkgd2VyZSBpZ25vcmVkIGludGVybmFsbHkpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBGSVBTIDE4MC0yIGFsZ29yaXRobXMsIFNIQS0yMjQvLTI1Ni8tMzg0Ly01MTIgYXJlIGltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292IGFuZCBhIG51bWJlciBvZiBvdGhlciBwZW9wbGVdCgogICopIEltcHJvdmVkIFBvd2VyUEMgcGxhdGZvcm0gc3VwcG9ydC4gTW9zdCBub3RhYmx5IEJJR05VTSBhc3NlbWJsZXIKICAgICBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBJQk0uCiAgICAgW1N1cmVzaCBDaGFyaSwgUGV0ZXIgV2FsdGVuYmVyZywgQW5keSBQb2x5YWtvdl0KCiAgKikgVGhlIG5ldyAnUlNBX2dlbmVyYXRlX2tleV9leCcgZnVuY3Rpb24gbm93IHRha2VzIGEgQklHTlVNIGZvciB0aGUgcHVibGljCiAgICAgZXhwb25lbnQgcmF0aGVyIHRoYW4gJ3Vuc2lnbmVkIGxvbmcnLiBUaGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIHRvCiAgICAgdGhlIG5ldyAncnNhX2tleWdlbicgZWxlbWVudCBvZiB0aGUgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW0plbHRlIEphbnNlbiwgR2VvZmYgVGhvcnBlXQoKICAqKSBGdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgbm93CiAgICAgbW92ZWQgZnJvbSBDQS5wbCB0byB0aGUgJ2NhJyB1dGlsaXR5IHdpdGggYSBuZXcgb3B0aW9uIC1jcmVhdGVfc2VyaWFsLgoKICAgICAoQmVmb3JlIE9wZW5TU0wgMC45LjdlLCBDQS5wbCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbAogICAgIG51bWJlciBmaWxlIHRvIDEsIHdoaWNoIGlzIGJvdW5kIHRvIGNhdXNlIHByb2JsZW1zLiAgVG8gYXZvaWQKICAgICB0aGUgcHJvYmxlbXMgd2hpbGUgcmVzcGVjdGluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IDAuOS43CiAgICAgcGF0Y2hsZXZlbHMsIDAuOS43ZSAgZW1wbG95ZWQgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluCiAgICAgQ0EucGwgZm9yIHNlcmlhbCBudW1iZXIgaW5pdGlhbGl6YXRpb24uICBXaXRoIHRoZSBuZXcgcmVsZWFzZSAwLjkuOCwKICAgICB3ZSBjYW4gZml4IHRoZSBwcm9ibGVtIGRpcmVjdGx5IGluIHRoZSAnY2EnIHV0aWxpdHkuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZHVjZWQgaGVhZGVyIGludGVyZGVwZW5jaWVzIGJ5IGRlY2xhcmluZyBtb3JlIG9wYXF1ZSBvYmplY3RzIGluCiAgICAgb3NzbF90eXAuaC4gQXMgYSBjb25zZXF1ZW5jZSwgaW5jbHVkaW5nIHNvbWUgaGVhZGVycyAoZWcuIGVuZ2luZS5oKSB3aWxsCiAgICAgZ2l2ZSBmZXdlciByZWN1cnNpdmUgaW5jbHVkZXMsIHdoaWNoIGNvdWxkIGJyZWFrIGxhenkgc291cmNlIGNvZGUgLSBzbwogICAgIHRoaXMgY2hhbmdlIGlzIGNvdmVyZWQgYnkgdGhlIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBzeW1ib2wuIEFzIGFsd2F5cywKICAgICBkZXZlbG9wZXJzIHNob3VsZCBkZWZpbmUgdGhpcyBzeW1ib2wgd2hlbiBidWlsZGluZyBhbmQgdXNpbmcgb3BlbnNzbCB0bwogICAgIGVuc3VyZSB0aGV5IHRyYWNrIHRoZSByZWNvbW1lbmRlZCBiZWhhdmlvdXIsIGludGVyZmFjZXMsIFtldGNdLCBidXQKICAgICBiYWNrd2FyZHMtY29tcGF0aWJsZSBiZWhhdmlvdXIgcHJldmFpbHMgd2hlbiB0aGlzIGlzbid0IGRlZmluZWQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoKSB3aGljaCBwcmludHMgb3V0IHBvbGljeSBub2Rlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEVWUCBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9yYW5kX2tleSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5LgogICAgIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBrZXkgb2YgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aCBiYXNlZCBvbiB0aGUgCiAgICAgY2lwaGVyIGNvbnRleHQuIFRoZSBFVlBfQ0lQSEVSIGNhbiBwcm92aWRlIGl0cyBvd24gcmFuZG9tIGtleSBnZW5lcmF0aW9uCiAgICAgcm91dGluZSB0byBzdXBwb3J0IGtleXMgb2YgYSBzcGVjaWZpYyBmb3JtLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGRlcyBhbmQgCiAgICAgM2RlcyByb3V0aW5lcyB0byBnZW5lcmF0ZSBhIGtleSBvZiB0aGUgY29ycmVjdCBwYXJpdHkuIFVwZGF0ZSBTL01JTUUKICAgICBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGFuZCBoZW5jZSBnZW5lcmF0ZSBjb3JyZWN0IHBhcml0eSBERVMga2V5cy4KICAgICBBZGQgRVZQX0NIRUNLX0RFU19LRVkgI2RlZmluZSB0byByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgCiAgICAgdmFsaWQgKHdlYWsgb3IgaW5jb3JyZWN0IHBhcml0eSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbG9jYWwgc2V0IG9mIENSTHMgdGhhdCBjYW4gYmUgdXNlZCBieSBYNTA5X3ZlcmlmeV9jZXJ0KCkgYXMgd2VsbAogICAgIGFzIGxvb2tpbmcgdGhlbSB1cC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdmVyaWZpZWQgc3RydWN0dXJlIG1heSBjb250YWluCiAgICAgQ1JMcywgZm9yIGV4YW1wbGUgUEtDUyM3IHNpZ25lZERhdGEuIE1vZGlmeSBQS0NTN192ZXJpZnkoKSB0byB1c2UgYW55IENSTHMKICAgICBwcmVzZW50IHVubGVzcyB0aGUgbmV3IFBLQ1M3X05PX0NSTCBmbGFnIGlzIGFzc2VydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIG9pZCBjb25maWd1cmF0aW9uIG1vZHVsZS4gSXQgbm93IGFkZGl0aW9uYWxseSBhY2NlcHRzIHRoZQogICAgIHN5bnRheDoKCiAgICAgc2hvcnROYW1lID0gc29tZSBsb25nIG5hbWUsIDEuMi4zLjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudGVkIHRoZSBCTl9DVFggaW1wbGVtZW50YXRpb24uIFRoZXJlIGlzIG5vdyBubyBtb3JlIHN0YXRpYwogICAgIGxpbWl0YXRpb24gb24gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgaXQgY2FuIGhhbmRsZSBub3IgdGhlIGRlcHRoIG9mIHRoZQogICAgICJzdGFjayIgaGFuZGxpbmcgZm9yIEJOX0NUWF9zdGFydCgpL0JOX0NUWF9lbmQoKSBwYWlycy4gVGhlIHN0YWNrCiAgICAgaW5mb3JtYXRpb24gY2FuIG5vdyBleHBhbmQgYXMgcmVxdWlyZWQsIGFuZCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzaW5nbGUKICAgICBzdGF0aWMgYXJyYXkgb2YgYmlnbnVtcywgQk5fQ1RYIG5vdyB1c2VzIGEgbGlua2VkLWxpc3Qgb2Ygc3VjaCBhcnJheXMKICAgICBhbGxvd2luZyBpdCB0byBleHBhbmQgb24gZGVtYW5kIHdoaWxzdCBtYWludGFpbmluZyB0aGUgdXNlZnVsbmVzcyBvZgogICAgIEJOX0NUWCdzICJidW5kbGluZyIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgbWlzc2luZyBCTl9DVFggcGFyYW1ldGVyIHRvIHRoZSAncnNhX21vZF9leHAnIGNhbGxiYWNrIGluIFJTQV9NRVRIT0QKICAgICB0byBhbGxvdyBhbGwgUlNBIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgQk5fQ1RYLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIHBvbGljeSBldmFsdWF0aW9uIGFuZCBjaGVja2luZy4gVGhpcwogICAgIGlzIGluaXRpYWxseSBpbnRlbmRlZCB0byBwYXNzIHRoZSB0ZXN0cyBvdXRsaW5lZCBpbiAiQ29uZm9ybWFuY2UgVGVzdGluZwogICAgIG9mIFJlbHlpbmcgUGFydHkgQ2xpZW50IENlcnRpZmljYXRlIFBhdGggUHJvY2Vzc2luZyBMb2dpYyIgdjEuMDcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgYm5fZHVwX2V4cGFuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGl0IHdhcyBpbnRyb2R1Y2VkIGluIDAuOS43IGFuZAogICAgIHJlbWFpbmVkIHVudXNlZCBhbmQgbm90IHRoYXQgdXNlZnVsLiBBIHZhcmlldHkgb2Ygb3RoZXIgbGl0dGxlIGJpZ251bQogICAgIHR3ZWFrcyBhbmQgZml4ZXMgaGF2ZSBhbHNvIGJlZW4gbWFkZSBjb250aW51aW5nIG9uIGZyb20gdGhlIGF1ZGl0IChzZWUKICAgICBiZWxvdykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ29uc3RpZnkgYWxsIG9yIGFsbW9zdCBhbGwgZDJpLCBjMmksIHMyaSBhbmQgcjJpIGZ1bmN0aW9ucywgYWxvbmcgd2l0aAogICAgIGFzc29jaWF0ZWQgQVNOMSwgRVZQIGFuZCBTU0wgZnVuY3Rpb25zIGFuZCBvbGQgQVNOMSBtYWNyb3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQk5femVybygpIG9ubHkgbmVlZHMgdG8gc2V0ICd0b3AnIGFuZCAnbmVnJyB0byB6ZXJvIGZvciBjb3JyZWN0IHJlc3VsdHMsCiAgICAgYW5kIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuIFNvIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdXNlIG9mCiAgICAgQk5fc2V0X3dvcmQoKSAod2hpY2ggY2FuIGZhaWwgZHVlIHRvIG5lZWRsZXNzIGV4cGFuc2lvbikgaXMgbm93IGRlcHJlY2F0ZWQ7CiAgICAgaWYgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIGRlZmluZWQsIEJOX3plcm8oKSBpcyBhIHZvaWQgbWFjcm8uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQk5fQ1RYX2dldCgpIHNob3VsZCByZXR1cm4gemVyby12YWx1ZWQgYmlnbnVtcywgcHJvdmlkaW5nIHRoZSBzYW1lCiAgICAgaW5pdGlhbGlzZWQgdmFsdWUgYXMgQk5fbmV3KCkuCiAgICAgW0dlb2ZmIFRob3JwZSwgc3VnZ2VzdGVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgZm9yIGluaGliaXRBbnlQb2xpY3kgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFuIGF1ZGl0IG9mIHRoZSBCSUdOVU0gY29kZSBpcyB1bmRlcndheSwgZm9yIHdoaWNoIGRlYnVnZ2luZyBjb2RlIGlzCiAgICAgZW5hYmxlZCB3aGVuIEJOX0RFQlVHIGlzIGRlZmluZWQuIFRoaXMgbWFrZXMgc3RyaWN0ZXIgZW5mb3JjZW1lbnRzIG9uIHdoYXQKICAgICBpcyBjb25zaWRlcmVkIHZhbGlkIHdoZW4gcHJvY2Vzc2luZyBCSUdOVU1zLCBhbmQgY2F1c2VzIGV4ZWN1dGlvbiB0bwogICAgIGFzc2VydCgpIHdoZW4gYSBwcm9ibGVtIGlzIGRpc2NvdmVyZWQuIElmIEJOX0RFQlVHX1JBTkQgaXMgZGVmaW5lZCwKICAgICBmdXJ0aGVyIHN0ZXBzIGFyZSB0YWtlbiB0byBkZWxpYmVyYXRlbHkgcG9sbHV0ZSB1bnVzZWQgZGF0YSBpbiBCSUdOVU0KICAgICBzdHJ1Y3R1cmVzIHRvIHRyeSBhbmQgZXhwb3NlIGZhdWx0eSBjb2RlIGZ1cnRoZXIgb24uIEZvciBub3csIG9wZW5zc2wgd2lsbAogICAgIChpbiBpdHMgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbikgY29udGludWUgdG8gdG9sZXJhdGUgdGhlIGluY29uc2lzdGVudAogICAgIGZvcm1zIHRoYXQgaXQgaGFzIHRvbGVyYXRlZCBpbiB0aGUgcGFzdCwgYnV0IGF1dGhvcnMgYW5kIHBhY2thZ2VycyBzaG91bGQKICAgICBjb25zaWRlciB0cnlpbmcgb3BlbnNzbCBhbmQgdGhlaXIgb3duIGFwcGxpY2F0aW9ucyB3aGVuIGNvbXBpbGVkIHdpdGgKICAgICB0aGVzZSBkZWJ1Z2dpbmcgc3ltYm9scyBkZWZpbmVkLiBJdCB3aWxsIGhlbHAgaGlnaGxpZ2h0IHBvdGVudGlhbCBidWdzIGluCiAgICAgdGhlaXIgb3duIGNvZGUsIGFuZCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UgZm9yIE9wZW5TU0wgaXRzZWxmLiBBdAogICAgIHNvbWUgcG9pbnQsIHRoZXNlIHRpZ2h0ZXIgcnVsZXMgd2lsbCBiZWNvbWUgb3BlbnNzbCdzIGRlZmF1bHQgdG8gaW1wcm92ZQogICAgIG1haW50YWluYWJpbGl0eSwgdGhvdWdoIHRoZSBhc3NlcnQoKXMgYW5kIG90aGVyIG92ZXJoZWFkcyB3aWxsIHJlbWFpbiBvbmx5CiAgICAgaW4gZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLiBTZWUgYm4uaCBmb3IgbW9yZSBkZXRhaWxzLgogICAgIFtHZW9mZiBUaG9ycGUsIE5pbHMgTGFyc2NoLCBVbGYgTfZsbGVyXQoKICAqKSBCTl9DVFhfaW5pdCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFzIEJOX0NUWCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlCiAgICAgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCB0aHJvdWdoIEJOX0NUWF9uZXcoKSAod2hpY2ggaW1wbGljaXRseQogICAgIGluaXRpYWxpc2VzIGl0KS4gVGhlIHByZXNlbmNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBtYWRlIGl0IHBvc3NpYmxlCiAgICAgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHN0cnVjdHVyZSAoYW5kIGNhdXNlIG1lbW9yeSBsZWFrcykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQmVjYXVzZSBvZiB0aGUgY2FsbGJhY2stYmFzZWQgYXBwcm9hY2ggZm9yIGltcGxlbWVudGluZyBMSEFTSCBhcyBhCiAgICAgdGVtcGxhdGUgdHlwZSwgbGhfaW5zZXJ0KCkgYWRkcyBvcGFxdWUgb2JqZWN0cyB0byBoYXNoLXRhYmxlcyBhbmQKICAgICBsaF9kb2FsbCgpIG9yIGxoX2RvYWxsX2FyZygpIGFyZSB0eXBpY2FsbHkgdXNlZCB3aXRoIGEgZGVzdHJ1Y3RvciBjYWxsYmFjawogICAgIHRvIGNsZWFuIHVwIHRob3NlIGNvcnJlc3BvbmRpbmcgb2JqZWN0cyBiZWZvcmUgZGVzdHJveWluZyB0aGUgaGFzaCB0YWJsZQogICAgIChhbmQgbG9zaW5nIHRoZSBvYmplY3QgcG9pbnRlcnMpLiBTbyBzb21lIG92ZXItemVhbG91cyBjb25zdGlmaWNhdGlvbnMgaW4KICAgICBMSEFTSCBoYXZlIGJlZW4gcmVsYXhlZCBzbyB0aGF0IGxoX2luc2VydCgpIGRvZXMgbm90IHRha2UgKG5vciBzdG9yZSkgdGhlCiAgICAgb2JqZWN0cyBhcyAiY29uc3QiIGFuZCB0aGUgbGhfZG9hbGxbX2FyZ10gY2FsbGJhY2sgd3JhcHBlcnMgYXJlIG5vdAogICAgIHByb3RvdHlwZWQgdG8gaGF2ZSAiY29uc3QiIHJlc3RyaWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBvaW50ZXJzIHRoZXkgYXJlCiAgICAgZ2l2ZW4gKGFuZCBzbyBhcmVuJ3QgcmVxdWlyZWQgdG8gY2FzdCB0aGVtIGF3YXkgYW55IG1vcmUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSB0bWRpZmYuaCBBUEkgd2FzIHNvIHVnbHkgYW5kIG1pbmltYWwgdGhhdCBvdXIgb3duIHRpbWluZyB1dGlsaXR5CiAgICAgKHNwZWVkKSBwcmVmZXJzIHRvIHVzZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLiBUaGUgdHdvIGltcGxlbWVudGF0aW9ucwogICAgIGhhdmVuJ3QgYmVlbiBjb25zb2xpZGF0ZWQgYXMgeWV0ICh2b2x1bnRlZXJzPykgYnV0IHRoZSB0bWRpZmYgQVBJIGhhcyBoYWQKICAgICBpdHMgb2JqZWN0IHR5cGUgcHJvcGVybHkgZXhwb3NlZCAoTVNfVE0pIGluc3RlYWQgb2YgY2FzdGluZyB0by9mcm9tICJjaGFyCiAgICAgKiIuIFRoaXMgbWF5IHN0aWxsIGNoYW5nZSB5ZXQgaWYgc29tZW9uZSByZWFsaXNlcyBNU19UTSBhbmQgIm1zX3RpbWVfKioqIgogICAgIGFyZW4ndCBuZWNlc3NhcmlseSB0aGUgZ3JlYXRlc3Qgbm9tZW5jbGF0dXJlcyAtIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIHVzZWQKICAgICBpbnRlcm5hbGx5IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBzbyBJJ3ZlIHVzZWQgdGhhdCBmb3Igbm93LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVuc3VyZSB0aGF0IGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGRvIG5vdCBnZXQgY29tcGlsZWQgd2hlbgogICAgIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLiBTb21lICJvcGVuc3NsIiBzdWJjb21tYW5kcyBhbmQgYSBmZXcgb2YKICAgICB0aGUgc2VsZi10ZXN0cyB3ZXJlIHN0aWxsIHVzaW5nIGRlcHJlY2F0ZWQga2V5LWdlbmVyYXRpb24gZnVuY3Rpb25zIHNvCiAgICAgdGhlc2UgaGF2ZSBiZWVuIHVwZGF0ZWQgYWxzby4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBSZW9yZ2FuaXNlIFBLQ1MjNyBjb2RlIHRvIHNlcGFyYXRlIHRoZSBkaWdlc3QgbG9jYXRpb24gZnVuY3Rpb25hbGl0eQogICAgIGludG8gUEtDUzdfZmluZF9kaWdlc3QoKSwgZGlnZXN0IGFkZHRpb24gaW50byBQS0NTN19iaW9fYWRkX2RpZ2VzdCgpLgogICAgIE5ldyBmdW5jdGlvbiBQS0NTN19zZXRfZGlnZXN0KCkgdG8gc2V0IHRoZSBkaWdlc3QgdHlwZSBmb3IgUEtDUyM3CiAgICAgZGlnZXN0ZWREYXRhIHR5cGUuIEFkZCBhZGRpdGlvbmFsIGNvZGUgdG8gY29ycmVjdGx5IGdlbmVyYXRlIHRoZQogICAgIGRpZ2VzdGVkRGF0YSB0eXBlIGFuZCBhZGQgc3VwcG9ydCBmb3IgdGhpcyB0eXBlIGluIFBLQ1M3IGluaXRpYWxpemF0aW9uCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBQS0NTN19zZXQwX3R5cGVfb3RoZXIoKSB0aGlzIGluaXRpYWxpemVzIGEgUEtDUzcgCiAgICAgc3RydWN0dXJlIG9mIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcHJpbWUgZ2VuZXJhdGlvbiBsb29wIGluIGNyeXB0by9ibi9ibl9wcmltZS5wbCBieSBtYWtpbmcKICAgICBzdXJlIHRoZSBsb29wIGRvZXMgY29ycmVjdGx5IHN0b3AgYW5kIGJyZWFraW5nICgiZGl2aXNpb24gYnkgemVybyIpCiAgICAgbW9kdWx1cyBvcGVyYXRpb25zIGFyZSBub3QgcGVyZm9ybWVkLiBUaGUgKHByZS1nZW5lcmF0ZWQpIHByaW1lCiAgICAgdGFibGUgY3J5cHRvL2JuL2JuX3ByaW1lLmggd2FzIGFscmVhZHkgY29ycmVjdCwgYnV0IGl0IGNvdWxkIG5vdCBiZQogICAgIHJlLWdlbmVyYXRlZCBvbiBzb21lIHBsYXRmb3JtcyBiZWNhdXNlIG9mIHRoZSAiZGl2aXNpb24gYnkgemVybyIKICAgICBzaXR1YXRpb24gaW4gdGhlIHNjcmlwdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0wMy50eHQ6IHRoZSBLREYxIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHdpdGgKICAgICBTSEEtMSBub3cgaXMgb25seSB1c2VkIGZvciAic21hbGwiIGN1cnZlcyAod2hlcmUgdGhlCiAgICAgcmVwcmVzZW50YXRpb24gb2YgYSBmaWVsZCBlbGVtZW50IHRha2VzIHVwIHRvIDI0IGJ5dGVzKTsgZm9yCiAgICAgbGFyZ2VyIGN1cnZlcywgdGhlIGZpZWxkIGVsZW1lbnQgcmVzdWx0aW5nIGZyb20gRUNESCBpcyBkaXJlY3RseQogICAgIHVzZWQgYXMgcHJlbWFzdGVyIHNlY3JldC4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBjb2RlIGZvciBrUCtsUSB0aW1pbmdzIHRvIGNyeXB0by9lYy9lY3Rlc3QuYywgYW5kIGFkZCBTRUMyCiAgICAgY3VydmUgc2VjcDE2MHIxIHRvIHRoZSB0ZXN0cy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gbG9hZCBzeW1ib2xzIGdsb2JhbGx5IHdpdGggRFNPLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbi1lYmVsbEB0cnVzdGNlbnRlci5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgRVJSX3NldF9tYXJrKCkgYW5kIEVSUl9wb3BfdG9fbWFyaygpIGZvciBiZXR0ZXIKICAgICBjb250cm9sIG9mIHRoZSBlcnJvciBzdGFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU1RPUkUgaW4gRU5HSU5FLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgU1RPUkUgdHlwZS4gIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbW1vbiBpbnRlcmZhY2UKICAgICB0byBjZXJ0aWZpY2F0ZSBhbmQga2V5IHN0b3JlcywgYmUgdGhleSBzaW1wbGUgZmlsZS1iYXNlZCBzdG9yZXMsIG9yCiAgICAgSFNNLXR5cGUgc3RvcmUsIG9yIExEQVAgc3RvcmVzLCBvci4uLgogICAgIE5PVEU6IFRoZSBjb2RlIGlzIGN1cnJlbnRseSBVTlRFU1RFRCBhbmQgaXNuJ3QgcmVhbGx5IHVzZWQgYW55d2hlcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUgY2FsbGVkIE9QRU5TU0xfSVRFTS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICBwYXNzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYW55IGZ1bmN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBhIHdheQogICAgIGZvciBhIGZ1bmN0aW9uIHRvIHBhc3MgZGF0YSBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgQlVGX3N0cm5kdXAoKSBhbmQgQlVGX21lbWR1cCgpLiAgQlVGX3N0cm5kdXAoKQogICAgIHdvcmtzIGxpa2UgQlVGX3N0cmR1cCgpIGJ1dCBjYW4gYmUgdXNlZCB0byBkdXBsaWNhdGUgYSBwb3J0aW9uIG9mCiAgICAgYSBzdHJpbmcuICBUaGUgY29weSBnZXRzIE5VTC10ZXJtaW5hdGVkLiAgQlVGX21lbWR1cCgpIGR1cGxpY2F0ZXMKICAgICBhIG1lbW9yeSBhcmVhLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb24gc2tfZmluZF9leCgpIHdoaWNoIHdvcmtzIGxpa2Ugc2tfZmluZCgpLCBidXQgd2lsbAogICAgIHJldHVybiBhbiBpbmRleCB0byBhbiBlbGVtZW50IGV2ZW4gaWYgYW4gZXhhY3QgbWF0Y2ggY291bGRuJ3QgYmUKICAgICBmb3VuZC4gIFRoZSBpbmRleCBpcyBndWFyYW50ZWVkIHRvIHBvaW50IGF0IHRoZSBlbGVtZW50IHdoZXJlIHRoZQogICAgIHNlYXJjaGVkLWZvciBrZXkgd291bGQgYmUgaW5zZXJ0ZWQgdG8gcHJlc2VydmUgc29ydGluZyBvcmRlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIE9CSl9ic2VhcmNoX2V4KCkgd2hpY2ggd29ya3MgbGlrZSBPQkpfYnNlYXJjaCgpIGJ1dAogICAgIHRha2VzIGFuIGV4dHJhIGZsYWdzIGFyZ3VtZW50IGZvciBvcHRpb25hbCBmdW5jdGlvbmFsaXR5LiAgQ3VycmVudGx5LAogICAgIHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGRlZmluZWQ6CgoJT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIG9yIHplcm8KCW51bWJlci4KCglPQkpfQlNFQVJDSF9GSVJTVF9WQUxVRV9PTl9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiAgVGhpcyBpcyB1c2VmdWwKCWlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGVsZW1lbnQgd2hlcmUgdGhlIGNvbXBhcmluZyBmdW5jdGlvbgoJcmV0dXJucyB6ZXJvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyB3aXRoICdvcGVuc3NsIGNhJwogICAgIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYmVjb21lcyBwYXJ0IG9mIHRoZQogICAgIENBIGRhdGFiYXNlIGFuZCB1c2VzIHRoZSBzYW1lIG1lY2hhbmlzbXMgZm9yIHNlcmlhbCBudW1iZXIgZ2VuZXJhdGlvbgogICAgIGFzIGFsbCBvdGhlciBjZXJ0aWZpY2F0ZSBzaWduaW5nLiAgVGhlIG5ldyBmbGFnICctc2VsZnNpZ24nIGVuYWJsZXMKICAgICB0aGlzIGZ1bmN0aW9uYWxpdHkuICBBZGFwdCBDQS5zaCBhbmQgQ0EucGwuaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgdGhlIHB1YmxpYyBrZXkgb2YgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYWdhaW5zdCBhIGdpdmVuIHByaXZhdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IGEgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGNhbiBiZSBzaWduZWQgYnkgdGhhdCBrZXkgKHNlbGYtc2lnbmluZykuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZQogICAgIHN1YmplY3QgaW4gdGhlIENBIGluZGV4IGZpbGUuICBUaGlzIGlzIGRvbmUgb25seSBpZiB0aGUga2V5d29yZAogICAgICd1bmlxdWVfc3ViamVjdCcgaXMgc2V0IHRvICdubycgaW4gdGhlIG1haW4gQ0Egc2VjdGlvbiAoZGVmYXVsdAogICAgIGlmICdDQV9kZWZhdWx0Jykgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSB2YWx1ZSBpcyBzYXZlZAogICAgIHdpdGggdGhlIGRhdGFiYXNlIGl0c2VsZiBpbiBhIHNlcGFyYXRlIGluZGV4IGF0dHJpYnV0ZSBmaWxlLAogICAgIG5hbWVkIGxpa2UgdGhlIGluZGV4IGZpbGUgd2l0aCAnLmF0dHInIGFwcGVuZGVkIHRvIHRoZSBuYW1lLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEdlbmVyYXRlIG11dGkgdmFsdWVkIEFWQXMgdXNpbmcgJysnIG5vdGF0aW9uIGluIGNvbmZpZyBmaWxlcyBmb3IKICAgICByZXEgYW5kIGRpck5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgbmFtZUNvbnN0cmFpbnRzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBwb2xpY3lDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5TWFwcGluZ3MgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBEU0FfTUVUSE9EIGltcGxlbWVudGF0aW9uIG9ubHkgdXNlcyBpdHMKICAgICBkc2FfbW9kX2V4cCgpIGFuZC9vciBibl9tb2RfZXhwKCkgaGFuZGxlcnMgaWYgdGhleSBhcmUgbm9uLU5VTEwsCiAgICAgYW5kIGNoYW5nZSBpdHMgb3duIGhhbmRsZXJzIHRvIGJlIE5VTEwgc28gYXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgaW5kaXJlY3Rpb24uIFRoaXMgbGV0cyBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgZmFsbGJhY2sgdG8gdGhlCiAgICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtb3JlIGVhc2lseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTdXBwb3J0IGZvciBkaXJlY3RvcnlOYW1lIGluIEdlbmVyYWxOYW1lIHJlbGF0ZWQgZXh0ZW5zaW9ucwogICAgIGluIGNvbmZpZyBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGxpbmsgYXBwbGljYXRpb25zIHVzaW5nIE1ha2VmaWxlLnNoYXJlZC4KICAgICBNYWtlIHRoYXQgcG9zc2libGUgZXZlbiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzIQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXNzIHByb2Nlc3NpbmcgZm9yIFMvTUlNRSBzaWduaW5nLiBUaGlzIG5vdwogICAgIG1lYW5zIHRoYXQgUy9NSU1FIHNpZ25pbmcgY2FuIGJlIGRvbmUgZnJvbSBhIHBpcGUsIGluIGFkZGl0aW9uCiAgICAgY2xlYXJ0ZXh0IHNpZ25pbmcgKG11bHRpcGFydC9zaWduZWQgdHlwZSkgaXMgZWZmZWN0aXZlbHkgc3RyZWFtaW5nCiAgICAgYW5kIHRoZSBzaWduZWQgZGF0YSBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsbCBoZWxkIGluIG1lbW9yeS4KCiAgICAgVGhpcyBpcyBkb25lIHdpdGggYSBuZXcgZmxhZyBQS0NTN19TVFJFQU0uIFdoZW4gdGhpcyBmbGFnIGlzIHNldAogICAgIFBLQ1M3X3NpZ24oKSBvbmx5IGluaXRpYWxpemVzIHRoZSBQS0NTNyBzdHJ1Y3R1cmUgYW5kIHRoZSBhY3R1YWwgc2lnbmluZwogICAgIGlzIGRvbmUgYWZ0ZXIgdGhlIGRhdGEgaXMgb3V0cHV0IChhbmQgZGlnZXN0cyBjYWxjdWxhdGVkKSBpbgogICAgIFNNSU1FX3dyaXRlX1BLQ1M3KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bGwgc3VwcG9ydCBmb3IgLXJwYXRoLy1SLCBib3RoIGluIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgYXBwbGljYXRpb25zLCBhdCBsZWFzdCBvbiB0aGUgcGxhdGZvcm1zIHdoZXJlIGl0J3Mga25vd24gaG93CiAgICAgdG8gZG8gaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY3J5cHRvL2VjL2VjX211bHQuYywgaW1wbGVtZW50IGZhc3QgcG9pbnQgbXVsdGlwbGljYXRpb24gd2l0aAogICAgIHByZWNvbXB1dGF0aW9uLCBiYXNlZCBvbiB3TkFGIHNwbGl0dGluZzogRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB3aWxsIG5vdyBjb21wdXRlIGEgdGFibGUgb2YgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IgdGhhdAogICAgIG1ha2VzIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgRUNfUE9JTlRzX211bCgpIG9yIEVDX1BPSU5UX211bCgpCiAgICAgZmFzdGVyIChub3RhYmx5IGluIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHBvaW50IG11bHRpcGxpY2F0aW9uLAogICAgIHNjYWxhciAqIGdlbmVyYXRvcikuCiAgICAgW05pbHMgTGFyc2NoLCBCb2RvIE1vZWxsZXJdCgogICopIElQdjYgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucy4gVGhlIHZhcmlvdXMgZXh0ZW5zaW9ucwogICAgIHdoaWNoIHVzZSB0aGUgSVA6YS5iLmMuZCBjYW4gbm93IHRha2UgSVB2NiBhZGRyZXNzZXMgdXNpbmcgdGhlCiAgICAgZm9ybWF0cyBvZiBSRkMxODg0IDIuMiAuIElQdjYgYWRkcmVzc2VzIGFyZSBub3cgYWxzbyBkaXNwbGF5ZWQKICAgICBjb3JyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgYW4gRU5HSU5FIHRoYXQgaW1wbGVtZW50cyBSU0EgYnkgcGVyZm9ybWluZyBwcml2YXRlIGtleQogICAgIGV4cG9uZW50aWF0aW9ucyB3aXRoIHRoZSBHTVAgbGlicmFyeS4gVGhlIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tCiAgICAgR01QJ3MgbXB6X3QgZm9ybWF0IGFyZW4ndCBvcHRpbWlzZWQgbm9yIGFyZSBhbnkgbW9udGdvbWVyeSBmb3JtcwogICAgIGNhY2hlZCwgYW5kIG9uIHg4NiBpdCBhcHBlYXJzIE9wZW5TU0wncyBvd24gcGVyZm9ybWFuY2UgaGFzIGNhdWdodCB1cC4KICAgICBIb3dldmVyIHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgb3RoZXIgYXJjaGl0ZWN0dXJlcyB3aGVyZSBHTVAgY291bGQKICAgICBwcm92aWRlIGEgYm9vc3QuIFRoaXMgRU5HSU5FIGlzIG5vdCBidWlsdCBpbiBieSBkZWZhdWx0LCBidXQgaXQgY2FuIGJlCiAgICAgc3BlY2lmaWVkIGF0IENvbmZpZ3VyZSB0aW1lIGFuZCBzaG91bGQgYmUgYWNjb21wYW5pZWQgYnkgdGhlIG5lY2Vzc2FyeQogICAgIGxpbmtlciBhZGRpdGlvbnMsIGVnOwogICAgICAgICAuL2NvbmZpZyAtRE9QRU5TU0xfVVNFX0dNUCAtbGdtcAogICAgIFtHZW9mZiBUaG9ycGVdCgogICopICJvcGVuc3NsIGVuZ2luZSIgd2lsbCBub3QgZGlzcGxheSBFTkdJTkUvRFNPIGxvYWQgZmFpbHVyZSBlcnJvcnMgd2hlbgogICAgIHRlc3RpbmcgYXZhaWxhYmlsaXR5IG9mIGVuZ2luZXMgd2l0aCAiLXQiIC0gdGhlIG9sZCBiZWhhdmlvdXIgaXMKICAgICBwcm9kdWNlZCBieSBpbmNyZWFzaW5nIHRoZSBmZWF0dXJlJ3MgdmVyYm9zaXR5IHdpdGggIi10dCIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgRUNEU0Egcm91dGluZXM6IHVuZGVyIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB1bmluaXRpYWxpemVkIEJOIG9iamVjdHMKICAgICBjb3VsZCBiZSBmcmVlZC4gU29sdXRpb246IG1ha2Ugc3VyZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgZWFybHkKICAgICBlbm91Z2guIChSZXBvcnRlZCBhbmQgZml4IHN1cHBsaWVkIGJ5IE5pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+CiAgICAgdmlhIFBSIzQ1OSkKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgS2V5LWdlbmVyYXRpb24gY2FuIG5vdyBiZSBpbXBsZW1lbnRlZCBpbiBSU0FfTUVUSE9ELCBEU0FfTUVUSE9ECiAgICAgYW5kIERIX01FVEhPRCAoZWcuIGJ5IEVOR0lORSBpbXBsZW1lbnRhdGlvbnMpIHRvIG92ZXJyaWRlIHRoZSBub3JtYWwKICAgICBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbnMuIEZvciBEU0EgYW5kIERILCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBjYW4KICAgICBhbHNvIGJlIG92ZXJyaWRlbiBieSBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSAicHJvZ3Jlc3MiIG1lY2hhbmlzbSB1c2VkIGluIGtleS1nZW5lcmF0aW9uIGFuZAogICAgIHByaW1hbGl0eSB0ZXN0aW5nIHRvIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSBuZXcgQk5fR0VOQ0IgcG9pbnRlciBpbgogICAgIHBsYWNlIG9mIGNhbGxiYWNrL2FyZ3VtZW50IHBhaXJzLiBUaGUgbmV3IEFQSSBmdW5jdGlvbnMgaGF2ZSAiX2V4IgogICAgIHBvc3RmaXhlcyBhbmQgdGhlIG9sZGVyIGZ1bmN0aW9ucyBhcmUgcmVpbXBsZW1lbnRlZCBhcyB3cmFwcGVycyBmb3IKICAgICB0aGUgbmV3IG9uZXMuIFRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sIGNhbiBiZSB1c2VkIHRvIGhpZGUKICAgICBkZWNsYXJhdGlvbnMgb2YgdGhlIG9sZCBmdW5jdGlvbnMgdG8gaGVscCAoZ3JhY2VmdWwpIGF0dGVtcHRzIHRvCiAgICAgbWlncmF0ZSB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gQWxzbywgdGhlIG5ldyBrZXktZ2VuZXJhdGlvbiBBUEkKICAgICBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIGNhbGxlci1zdXBwbGllZCBrZXktc3RydWN0dXJlIGFuZCByZXR1cm4KICAgICBzdWNjZXNzL2ZhaWx1cmUgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEga2V5IG9yIE5VTEwgLSB0aGlzIGlzIHRvCiAgICAgaGVscCBtYWtlICJrZXlnZW4iIGFub3RoZXIgbWVtYmVyIGZ1bmN0aW9uIG9mIFJTQV9NRVRIT0QgZXRjLgoKICAgICBFeGFtcGxlIGZvciB1c2luZyB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZToKCiAgICAgICAgICBpbnQgKCpteV9jYWxsYmFjaykoaW50IGEsIGludCBiLCBCTl9HRU5DQiAqY2IpID0gLi4uOwogICAgICAgICAgdm9pZCAqbXlfYXJnID0gLi4uOwogICAgICAgICAgQk5fR0VOQ0IgbXlfY2I7CgogICAgICAgICAgQk5fR0VOQ0Jfc2V0KCZteV9jYiwgbXlfY2FsbGJhY2ssIG15X2FyZyk7CgogICAgICAgICAgcmV0dXJuIEJOX2lzX3ByaW1lX2V4KHNvbWVfYmlnbnVtLCBCTl9wcmltZV9jaGVja3MsIE5VTEwsICZjYik7CiAgICAgICAgICAvKiBGb3IgdGhlIG1lYW5pbmcgb2YgYSwgYiBpbiBjYWxscyB0byBteV9jYWxsYmFjaygpLCBzZWUgdGhlCiAgICAgICAgICAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBjYWxsYmFjay4KICAgICAgICAgICAqIGNiIHdpbGwgcG9pbnQgdG8gbXlfY2I7IG15X2FyZyBjYW4gYmUgcmV0cmlldmVkIGFzIGNiLT5hcmcuCiAgICAgICAgICAgKiBteV9jYWxsYmFjayBzaG91bGQgcmV0dXJuIDEgaWYgaXQgd2FudHMgQk5faXNfcHJpbWVfZXgoKQogICAgICAgICAgICogdG8gY29udGludWUsIG9yIDAgdG8gc3RvcC4KICAgICAgICAgICAqLwoKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgdGhlIFpMSUIgY29tcHJlc3Npb24gbWV0aG9kIHRvIGJlIHN0YXRlZnVsLCBhbmQgbWFrZSBpdAogICAgIGF2YWlsYWJsZSB0byBUTFMgd2l0aCB0aGUgbnVtYmVyIGRlZmluZWQgaW4gCiAgICAgZHJhZnQtaWV0Zi10bHMtY29tcHJlc3Npb24tMDQudHh0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgQVNOLjEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBDZXJ0aWZpY2F0ZVBhaXIsIHdoaWNoCiAgICAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIChhY2NvcmRpbmcgdG8gWC41MDlfNHRoRWRpdGlvbkRyYWZ0VjYucGRmKToKCiAgICAgQ2VydGlmaWNhdGVQYWlyIDo6PSBTRVFVRU5DRSB7CiAgICAgICAgZm9yd2FyZAkJWzBdCUNlcnRpZmljYXRlIE9QVElPTkFMLAogICAgICAgIHJldmVyc2UJCVsxXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICAtLSBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhaXIgc2hhbGwgYmUgcHJlc2VudCAtLSB9CgogICAgIEFsc28gaW1wbGVtZW50IHRoZSBQRU0gZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGNlcnRpZmljYXRlCiAgICAgcGFpcnMsIGFuZCBkZWZpbmVkIHRoZSBQRU0gdGFnIGFzICJDRVJUSUZJQ0FURSBQQUlSIi4KCiAgICAgVGhpcyBuZWVkZWQgdG8gYmUgZGVmaW5lZCwgbW9zdGx5IGZvciB0aGUgc2FrZSBvZiB0aGUgTERBUAogICAgIGF0dHJpYnV0ZSBjcm9zc0NlcnRpZmljYXRlUGFpciwgYnV0IG1heSBwcm92ZSB1c2VmdWwgZWxzZXdoZXJlIGFzCiAgICAgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGluaGliaXQgc3ltbGlua2luZyBvZiBzaGFyZWQgbGlicmFyaWVzIGluCiAgICAgTWFrZWZpbGUuc2hhcmVkLCBmb3IgQ3lnd2luJ3Mgc2FrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFeHRlbmQgdGhlIEJJR05VTSBBUEkgYnkgY3JlYXRpbmcgYSBmdW5jdGlvbiAKICAgICAgICAgIHZvaWQgQk5fc2V0X25lZ2F0aXZlKEJJR05VTSAqYSwgaW50IG5lZyk7CiAgICAgYW5kIGEgbWFjcm8gdGhhdCBiZWhhdmUgbGlrZQogICAgICAgICAgaW50ICBCTl9pc19uZWdhdGl2ZShjb25zdCBCSUdOVU0gKmEpOwoKICAgICB0byBhdm9pZCB0aGUgbmVlZCB0byBhY2Nlc3MgJ2EtPm5lZycgZGlyZWN0bHkgaW4gYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgSW1wbGVtZW50IGZhc3QgbW9kdWxhciByZWR1Y3Rpb24gZm9yIHBzZXVkby1NZXJzZW5uZSBwcmltZXMKICAgICB1c2VkIGluIE5JU1QgY3VydmVzIChjcnlwdG8vYm4vYm5fbmlzdC5jLCBjcnlwdG8vZWMvZWNwX25pc3QuYykuCiAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCgpIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMKICAgICBpZiBhcHBsaWNhYmxlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIG5ldyBsb2NrIHR5cGUgKENSWVBUT19MT0NLX0JOKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIEVOR0lORSBmcmFtZXdvcmsgdG8gYXV0b21hdGljYWxseSBsb2FkIGVuZ2luZXMKICAgICBkeW5hbWljYWxseSBmcm9tIHNwZWNpZmljIGRpcmVjdG9yaWVzIHVubGVzcyB0aGV5IGNvdWxkIGJlCiAgICAgZm91bmQgdG8gYWxyZWFkeSBiZSBidWlsdCBpbiBvciBsb2FkZWQuICBNb3ZlIGFsbCB0aGUKICAgICBjdXJyZW50IGVuZ2luZXMgZXhjZXB0IGZvciB0aGUgY3J5cHRvZGV2IG9uZSB0byBhIG5ldwogICAgIGRpcmVjdG9yeSBlbmdpbmVzLy4KICAgICBUaGUgZW5naW5lcyBpbiBlbmdpbmVzLyBhcmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyBpZgogICAgIHRoZSAic2hhcmVkIiBvcHRpb25zIHdhcyBnaXZlbiB0byAuL0NvbmZpZ3VyZSBvciAuL2NvbmZpZy4KICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGluc2VydGVkIGluIGxpYmNyeXB0by5hLgogICAgIC91c3IvbG9jYWwvc3NsL2VuZ2luZXMgaXMgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBkeW5hbWljCiAgICAgZW5naW5lcywgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRlbiBhdCBjb25maWd1cmUgdGltZSB0aHJvdWdoCiAgICAgdGhlIHVzdWFsIHVzZSBvZiAtLXByZWZpeCBhbmQvb3IgLS1vcGVuc3NsZGlyLCBhbmQgYXQgcnVuCiAgICAgdGltZSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX0VOR0lORVMuCiAgICAgW0dlb2ZmIFRob3JwZSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgTWFrZWZpbGUuc2hhcmVkLCBhIGhlbHBlciBtYWtlZmlsZSB0byBidWlsZCBzaGFyZWQKICAgICBsaWJyYXJpZXMuICBBZGRhcHQgTWFrZWZpbGUub3JnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB2ZXJzaW9uIGluZm8gdG8gV2luMzIgRExMcy4KICAgICBbUGV0ZXIgJ0x1bmEnIFJ1bmVzdGlnIiA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQWRkIG5ldyAnbWVkaXVtIGxldmVsJyBQS0NTIzEyIEFQSS4gQ2VydGlmaWNhdGVzIGFuZCBrZXlzCiAgICAgY2FuIGJlIGFkZGVkIHVzaW5nIHRoaXMgQVBJIHRvIGNyZWF0ZWQgYXJiaXRyYXJ5IFBLQ1MjMTIKICAgICBmaWxlcyB3aGlsZSBhdm9pZGluZyB0aGUgbG93IGxldmVsIEFQSS4KCiAgICAgTmV3IG9wdGlvbnMgdG8gUEtDUzEyX2NyZWF0ZSgpLCBrZXkgb3IgY2VydCBjYW4gYmUgTlVMTCBhbmQKICAgICB3aWxsIHRoZW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gVGhlIGVuY3J5cHRpb24KICAgICBhbGdvcml0aG0gTklEcyBjYW4gYmUgc2V0IHRvIC0xIGZvciBubyBlbmNyeXB0aW9uLCB0aGUgbWFjCiAgICAgaXRlcmF0aW9uIGNvdW50IGNhbiBiZSBzZXQgdG8gMCB0byBvbWl0IHRoZSBtYWMuCgogICAgIEVuaGFuY2UgcGtjczEyIHV0aWxpdHkgYnkgbWFraW5nIHRoZSAtbm9rZXlzIGFuZCAtbm9jZXJ0cwogICAgIG9wdGlvbnMgd29yayB3aGVuIGNyZWF0aW5nIGEgUEtDUyMxMiBmaWxlLiBOZXcgb3B0aW9uIC1ub21hYwogICAgIHRvIG9taXQgdGhlIG1hYywgTk9ORSBjYW4gYmUgc2V0IGZvciBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAgICBOZXcgY29kZSBpcyBtb2RpZmllZCB0byB1c2UgdGhlIGVuaGFuY2VkIFBLQ1MxMl9jcmVhdGUoKQogICAgIGluc3RlYWQgb2YgdGhlIGxvdyBsZXZlbCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgZW5jb2RlciB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCiAgICAgZW5jb2RpbmcuIFRoaXMgY2FuIG91dHB1dCBzZXF1ZW5jZXMgdGFncyBhbmQgb2N0ZXQgc3RyaW5ncyBpbgogICAgIHRoaXMgZm9ybS4gTW9kaWZ5IHBrN19hc24xLmMgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aAogICAgIGVuY29kaW5nLiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbmVlZHMgYWRkaXRpb25hbCBjb2RlIHRvCiAgICAgYmUgdXNlZnVsLCBzdWNoIGFzIGFuIEFTTjEgYmlvIGFuZCBzb21lIGVuaGFuY2VkIHN0cmVhbWluZwogICAgIFBLQ1MjNyBjb2RlLgoKICAgICBFeHRlbmQgdGVtcGxhdGUgZW5jb2RlIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCB0YWdnaW5nIGlzIHBhc3NlZAogICAgIGRvd24gdG8gdGhlIHRlbXBsYXRlIGVuY29kZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0ICdvcGVuc3NsIHJlcScgZmFpbCBpZiBhbiBhcmd1bWVudCB0byAnLW5ld2tleScgaXMgbm90CiAgICAgcmVjb2duaXplZCBpbnN0ZWFkIG9mIHVzaW5nIFJTQSBhcyBhIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0LgogICAgIEFzIHRoZXNlIGFyZSBub3Qgb2ZmaWNpYWwsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiAiQUxMIjsKICAgICB0aGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZSBncm91cCBhbGlhcyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlbS4KICAgICBbVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGVuZ2luZSBzdXBwb3J0LgogICAgIFtOaWxzIEd1cmEgYW5kIERvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RoLy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIExldCBCTl9yYW5kX3JhbmdlKCkgYWJvcnQgd2l0aCBhbiBlcnJvciBhZnRlciAxMDAgaXRlcmF0aW9ucwogICAgIHdpdGhvdXQgc3VjY2VzcyAod2hpY2ggaW5kaWNhdGVzIGEgYnJva2VuIFBSTkcpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2Rfc3FydCgpIHNvIHRoYXQgaXQgdmVyaWZpZXMgdGhhdCB0aGUgaW5wdXQgdmFsdWUKICAgICBpcyByZWFsbHkgdGhlIHNxdWFyZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKFByZXZpb3VzbHksCiAgICAgQk5fbW9kX3NxcnQgd291bGQgc2hvdyBHSUdPIGJlaGF2aW91ci4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBvdmVyIGJpbmFyeSBmaWVsZHMgZnJvbSBYOS42MiwgU0VDRywKICAgICBhbmQgV0FQL1dUTFM7IGFkZCBPSURzIHRoYXQgd2VyZSBzdGlsbCBtaXNzaW5nLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgRXh0ZW5kIHRoZSBFQyBsaWJyYXJ5IGZvciBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzCiAgICAgKG5ldyBmaWxlcyBlYzJfc21wbC5jLCBlYzJfc21wdC5jLCBlYzJfbXVsdC5jIGluIGNyeXB0by9lYy8pLgogICAgIE5ldyBFQ19NRVRIT0Q6CgogICAgICAgICAgRUNfR0YybV9zaW1wbGVfbWV0aG9kCgogICAgIE5ldyBBUEkgZnVuY3Rpb25zOgoKICAgICAgICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtCgogICAgIFBvaW50IGNvbXByZXNzaW9uIGZvciBiaW5hcnkgZmllbGRzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yCiAgICAgcGF0ZW50IHJlYXNvbnMgKGNvbXBpbGUgd2l0aCBPUEVOU1NMX0VDX0JJTl9QVF9DT01QIGRlZmluZWQgdG8KICAgICBlbmFibGUgaXQpLgoKICAgICBBcyBiaW5hcnkgcG9seW5vbWlhbHMgYXJlIHJlcHJlc2VudGVkIGFzIEJJR05VTXMsIHZhcmlvdXMgbWVtYmVycwogICAgIG9mIHRoZSBFQ19HUk9VUCBhbmQgRUNfUE9JTlQgZGF0YSBzdHJ1Y3R1cmVzIGNhbiBiZSBzaGFyZWQKICAgICBiZXR3ZWVuIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHByaW1lIGZpZWxkcyBhbmQgYmluYXJ5IGZpZWxkczsKICAgICB0aGUgYWJvdmUgLi4uX0dGMm0gZnVuY3Rpb25zIChleGNlcHQgZm9yIEVYX0dST1VQX25ld19jdXJ2ZV9HRjJtKQogICAgIGFyZSBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gdGhlaXIgLi4uX0dGcCBjb3VudGVycGFydHMuCiAgICAgKEZvciBzaW1wbGljaXR5LCB0aGUgJy4uLl9HRnAnIHByZWZpeCBoYXMgYmVlbiBkcm9wcGVkIGZyb20KICAgICB2YXJpb3VzIGludGVybmFsIG1ldGhvZCBuYW1lcy4pCgogICAgIEFuIGludGVybmFsICdmaWVsZF9kaXYnIG1ldGhvZCAoc2ltaWxhciB0byAnZmllbGRfbXVsJyBhbmQKICAgICAnZmllbGRfc3FyJykgaGFzIGJlZW4gYWRkZWQ7IHRoaXMgaXMgdXNlZCBvbmx5IGZvciBiaW5hcnkgZmllbGRzLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgT3B0aW9uYWxseSBkaXNwYXRjaCBFQ19QT0lOVF9tdWwoKSwgRUNfUE9JTlRfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB0aHJvdWdoIG1ldGhvZHMgKCdtdWwnLCAncHJlY29tcHV0ZV9tdWx0JykuCgogICAgIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyAobm93IGludGVybmFsbHkgY2FsbGVkICdlY193TkFGX211bCcKICAgICBhbmQgJ2VjX3dOQUZfcHJlY29tcHV0ZWRfbXVsdCcpIHJlbWFpbiB0aGUgZGVmYXVsdCBpZiB0aGVzZQogICAgIG1ldGhvZHMgYXJlIHVuZGVmaW5lZC4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbiBFQ19HUk9VUF9nZXRfZGVncmVlLCB3aGljaCBpcyBkZWZpbmVkIHRocm91Z2gKICAgICBFQ19NRVRIT0QuICBGb3IgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzLCB0aGlzIHJldHVybnMgdGhlIGJpdAogICAgIGxlbmd0aCBvZiB0aGUgbW9kdWx1cy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbnMgRUNfR1JPVVBfZHVwLCBFQ19QT0lOVF9kdXAuCiAgICAgKFRoZXNlIHNpbXBseSBjYWxsIC4uLl9uZXcgIGFuZCAuLi5fY29weSkuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYyBzb2Z0d2FyZSBpbiBjcnlwdG8vYm4vYm5fZ2YybS5jLgogICAgIFBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zICh3aGVyZSB0aGUgc2lnbiBiaXQgaXMgbm90CiAgICAgdXNlZCkgaW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgW21hY3Jvc106ICAKCiAgICAgICAgICBCTl9HRjJtX2FkZAogICAgICAgICAgQk5fR0YybV9zdWIgICAgICAgICAgICAgWz0gQk5fR0YybV9hZGRdCiAgICAgICAgICBCTl9HRjJtX21vZCAgICAgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2RfbXVsICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX211bF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXIgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FyX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2ludgogICAgICAgICAgQk5fR0YybV9tb2RfZXhwICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2V4cF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJ0ICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FydF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnJdCiAgICAgICAgICBCTl9HRjJtX2NtcCAgICAgICAgICAgICBbPSBCTl91Y21wXQoKICAgICAoTm90ZSB0aGF0IG9ubHkgdGhlICdtb2QnIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgZm9yIGZpZWxkcyBHRigyXm0pLgogICAgIEJOX0dGMm1fYWRkKCkgaXMgbWlzbm9tZXIsIGJ1dCB0aGlzIGlzIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeS4pCgogICAgIEZvciBzb21lIGZ1bmN0aW9ucywgYW4gdGhlIGlycmVkdWNpYmxlIHBvbHlub21pYWwgZGVmaW5pbmcgYQogICAgIGZpZWxkIGNhbiBiZSBnaXZlbiBhcyBhbiAndW5zaWduZWQgaW50W10nIHdpdGggc3RyaWN0bHkKICAgICBkZWNyZWFzaW5nIGVsZW1lbnRzIGdpdmluZyB0aGUgaW5kaWNlcyBvZiB0aG9zZSBiaXRzIHRoYXQgYXJlIHNldDsKICAgICBpLmUuLCBwW10gcmVwcmVzZW50cyB0aGUgcG9seW5vbWlhbAogICAgICAgICAgZih0KSA9IHRecFswXSArIHRecFsxXSArIC4uLiArIHRecFtrXQogICAgIHdoZXJlCiAgICAgICAgICBwWzBdID4gcFsxXSA+IC4uLiA+IHBba10gPSAwLgogICAgIFRoaXMgYXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX21vZF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX211bF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3Nxcl9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX2ludl9hcnIgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9pbnZdCiAgICAgICAgICBCTl9HRjJtX21vZF9kaXZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfZGl2XQogICAgICAgICAgQk5fR0YybV9tb2RfZXhwX2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIENvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIGJudGVzdC5jIGhhcyBhZGRpdGlvbmFsIHRlc3RzIGZvciBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljLgoKICAgICBUd28gaW1wbGVtZW50YXRpb25zIGZvciBCTl9HRjJtX21vZF9kaXYoKSBhcmUgYXZhaWxhYmxlLgogICAgIFRoZSBkZWZhdWx0IGFsZ29yaXRobSBzaW1wbHkgdXNlcyBCTl9HRjJtX21vZF9pbnYoKSBhbmQKICAgICBCTl9HRjJtX21vZF9tdWwoKS4gIFRoZSBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gaXMgY29tcGlsZWQgaW4gb25seQogICAgIGlmIE9QRU5TU0xfU1VOX0dGMk1fRElWIGlzIGRlZmluZWQgKHBhdGVudCBwZW5kaW5nOyByZWFkIHRoZQogICAgIGNvcHlyaWdodCBub3RpY2UgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYyBiZWZvcmUgZW5hYmxpbmcgaXQpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9ESVNBQkxFRCcgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNvbWUKICAgICBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUtdGltZS4KICAgICBbRG91Z2xhcyBTdGViaWxhIDxkb3VnbGFzLnN0ZWJpbGFAc3VuLmNvbT5dCgogICopIENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciBvZiAnb3BlbnNzbCBhc24xcGFyc2UnIHNvIHRoYXQgbW9yZQogICAgIGluZm9ybWF0aW9uIGlzIHZpc2libGUgd2hlbiB2aWV3aW5nLCBlLmcuLCBhIGNlcnRpZmljYXRlOgoKICAgICBNb2RpZnkgYXNuMV9wYXJzZTIgKGNyeXB0by9hc24xL2FzbjFfcGFyLmMpIHNvIHRoYXQgaW4gbm9uLSdkdW1wJwogICAgIG1vZGUgdGhlIGNvbnRlbnQgb2Ygbm9uLXByaW50YWJsZSBPQ1RFVCBTVFJJTkdzIGlzIG91dHB1dCBpbiBhCiAgICAgc3R5bGUgc2ltaWxhciB0byBJTlRFR0VScywgYnV0IHdpdGggJ1tIRVggRFVNUF0nIHByZXBlbmRlZCB0bwogICAgIGF2b2lkIHRoZSBhcHBlYXJhbmNlIG9mIGEgcHJpbnRhYmxlIHN0cmluZy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCAnYXNuMV9mbGFnJyBhbmQgJ2FzbjFfZm9ybScgbWVtYmVyIHRvIEVDX0dST1VQIHdpdGggYWNjZXNzCiAgICAgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9hc24xX2ZsYWcoKQogICAgICAgICAgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCkKICAgICBUaGVzZSBjb250cm9sIEFTTjEgZW5jb2RpbmcgZGV0YWlsczoKICAgICAtIEN1cnZlcyAoaS5lLiwgZ3JvdXBzKSBhcmUgZW5jb2RlZCBleHBsaWNpdGx5IHVubGVzcyBhc24xX2ZsYWcKICAgICAgIGhhcyBiZWVuIHNldCB0byBPUEVOU1NMX0VDX05BTUVEX0NVUlZFLgogICAgIC0gUG9pbnRzIGFyZSBlbmNvZGVkIGluIHVuY29tcHJlc3NlZCBmb3JtIGJ5IGRlZmF1bHQ7IG9wdGlvbnMgZm9yCiAgICAgICBhc24xX2ZvciBhcmUgYXMgZm9yIHBvaW50Mm9jdCwgbmFtZWx5CiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRAoKICAgICBBbHNvIGFkZCAnc2VlZCcgYW5kICdzZWVkX2xlbicgbWVtYmVycyB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X3NlZWQoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0MF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9zZWVkX2xlbigpCiAgICAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIEFTTjEgcHVycG9zZXMgKHNvIGZhcikuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2ZpZWxkX3R5cGUnIG1lbWJlciB0byBFQ19NRVRIT0QsIHdoaWNoIGhvbGRzIHRoZSBOSUQKICAgICBvZiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgdHlwZSBPSUQuICBUaGUgbmV3IGZ1bmN0aW9uCiAgICAgRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKCkgcmV0dXJucyB0aGlzIHZhbHVlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIGZ1bmN0aW9ucyAKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmJuKCkKICAgICAgICAgIEVDX1BPSU5UX2JuMnBvaW50KCkKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmhleCgpCiAgICAgICAgICBFQ19QT0lOVF9oZXgycG9pbnQoKQogICAgIHByb3ZpZGluZyB1c2VmdWwgaW50ZXJmYWNlcyB0byBFQ19QT0lOVF9wb2ludDJvY3QoKSBhbmQKICAgICBFQ19QT0lOVF9vY3QycG9pbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIENoYW5nZSBpbnRlcm5hbHMgb2YgdGhlIEVDIGxpYnJhcnkgc28gdGhhdCB0aGUgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9nZW5lcmF0b3IoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X29yZGVyKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9jb2ZhY3RvcigpCiAgICAgYXJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGluIGNyeXB0by9lYy9lY19saWIuYyBhbmQgbm90IGRpc3BhdGNoZWQKICAgICB0byBtZXRob2RzLCB3aGljaCB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gd2hlbgogICAgIGFkZGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgY3VydmVzLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB3aXRoIGlucHV0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IGNvbXB1dGVfd05BRiAoY3J5cHRvL2VjL2VjX211bHQuYykgd2l0aG91dCBCSUdOVU0KICAgICBhcml0aG1ldGljLCBhbmQgc3VjaCB0aGF0IG1vZGlmaWVkIHdOQUZzIGFyZSBnZW5lcmF0ZWQKICAgICAod2hpY2ggYXZvaWQgbGVuZ3RoIGV4cGFuc2lvbiBpbiBtYW55IGNhc2VzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKSAoZGVmaW5lZCB2aWEKICAgICBFQ19NRVRIT0QpIHRoYXQgdmVyaWZpZXMgdGhhdCB0aGUgY3VydmUgZGlzY3JpbWluYW50IGlzIG5vbi16ZXJvLgoKICAgICBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVjaygpIHRoYXQgbWFrZXMgc29tZSBzYW5pdHkgdGVzdHMKICAgICBvbiBhIEVDX0dST1VQLCBpdHMgZ2VuZXJhdG9yIGFuZCBvcmRlci4gIFRoaXMgaW5jbHVkZXMKICAgICBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBFQ0RTQSBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RzYS8uCgogICAgIEFkZCBhcHBsaWNhdGlvbnMgJ29wZW5zc2wgZWNwYXJhbScgYW5kICdvcGVuc3NsIGVjZHNhJwogICAgICh0aGVzZSBhcmUgYmFzZWQgb24gJ29wZW5zc2wgZHNhcGFyYW0nIGFuZCAnb3BlbnNzbCBkc2EnKS4KCiAgICAgRUNEU0Egc3VwcG9ydCBpcyBhbHNvIGluY2x1ZGVkIGluIHZhcmlvdXMgb3RoZXIgZmlsZXMgYWNyb3NzIHRoZQogICAgIGxpYnJhcnkuICBNb3N0IG5vdGFibHksCiAgICAgLSAnb3BlbnNzbCByZXEnIG5vdyBoYXMgYSAnLW5ld2tleSBlY2RzYTpmaWxlJyBvcHRpb247CiAgICAgLSBFVlBfUEtDUzgyUEtFWSAoY3J5cHRvL2V2cC9ldnBfcGtleS5jKSBub3cgY2FuIGhhbmRsZSBFQ0RTQTsKICAgICAtIFg1MDlfUFVCS0VZX2dldCAoY3J5cHRvL2FzbjEveF9wdWJrZXkuYykgYW5kCiAgICAgICBkMmlfUHVibGljS2V5IChjcnlwdG8vYXNuMS9kMmlfcHUuYykgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG1ha2UKICAgICAgIHRoZW0gc3VpdGFibGUgZm9yIEVDRFNBIHdoZXJlIGRvbWFpbiBwYXJhbWV0ZXJzIG11c3QgYmUKICAgICAgIGV4dHJhY3RlZCBiZWZvcmUgdGhlIHNwZWNpZmljIHB1YmxpYyBrZXk7CiAgICAgLSBFQ0RTQSBlbmdpbmUgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEluY2x1ZGUgc29tZSBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMsIGFuZCBhZGQgT0lEcyBmcm9tIFg5LjYyLAogICAgIFNFQ0csIGFuZCBXQVAvV1RMUy4gIEVhY2ggY3VydmUgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG5ldwogICAgIGZ1bmN0aW9uCiAgICAgICAgICBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSgpLAogICAgIGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbmFtZWQgY3VydmVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCiAgICAgICAgICBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoKS4KICAgICBBbHNvIGFkZCBhICdjdXJ2ZV9uYW1lJyBtZW1iZXIgdG8gRUNfR1JPVVAgb2JqZWN0cywgd2hpY2ggY2FuIGJlCiAgICAgYWNjZXNzZWQgdmlhCiAgICAgICAgIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKCkKICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoKQogICAgIFtOaWxzIExhcnNjaCA8bGFyc2NoQHRydXN0Y2VudGVyLmRlLCBCb2RvIE1vZWxsZXJdCiAKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43bSBhbmQgMC45LjduICBbeHggWFhYIHh4eHhdCgogICopIEluIHRoZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgYmUgc3RyaWN0IGFib3V0IHNlc3Npb24gSUQKICAgICBjb250ZXh0IG1hdGNoaW5nICh3aGljaCBtYXR0ZXJzIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgYSBzaW5nbGUKICAgICBleHRlcm5hbCBjYWNoZSBmb3IgZGlmZmVyZW50IHB1cnBvc2VzKS4gIFByZXZpb3VzbHksCiAgICAgb3V0LW9mLWNvbnRleHQgcmV1c2Ugd2FzIGZvcmJpZGRlbiBvbmx5IGlmIFNTTF9WRVJJRllfUEVFUiB3YXMKICAgICBzZXQuICBUaGlzIGRpZCBlbnN1cmUgc3RyaWN0IGNsaWVudCB2ZXJpZmljYXRpb24sIGJ1dCBtZWFudCB0aGF0LAogICAgIHdpdGggYXBwbGljYXRpb25zIHVzaW5nIGEgc2luZ2xlIGV4dGVybmFsIGNhY2hlIGZvciBxdWl0ZQogICAgIGRpZmZlcmVudCByZXF1aXJlbWVudHMsIGNsaWVudHMgY291bGQgY2lyY3VtdmVudCBjaXBoZXJzdWl0ZQogICAgIHJlc3RyaWN0aW9ucyBmb3IgYSBnaXZlbiBzZXNzaW9uIElEIGNvbnRleHQgYnkgc3RhcnRpbmcgYSBzZXNzaW9uCiAgICAgaW4gYSBkaWZmZXJlbnQgY29udGV4dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2wgYW5kIDAuOS43bSAgWzIzIEZlYiAyMDA3XQoKICAqKSBDbGVhbnNlIFBFTSBidWZmZXJzIGJlZm9yZSBmcmVlaW5nIHRoZW0gc2luY2UgdGhleSBtYXkgY29udGFpbiAKICAgICBzZW5zaXRpdmUgZGF0YS4KICAgICBbQmVuamFtaW4gQmVubmV0dCA8YmVuQHBzYy5lZHU+XQoKICAqKSBJbmNsdWRlICIhZU5VTEwiIGluIFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUIHRvIG1ha2Ugc3VyZSB0aGF0CiAgICAgYSBjaXBoZXJzdWl0ZSBzdHJpbmcgc3VjaCBhcyAiREVGQVVMVDpSU0EiIGNhbm5vdCBlbmFibGUKICAgICBhdXRoZW50aWNhdGlvbi1vbmx5IGNpcGhlcnN1aXRlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTaW5jZSBBRVMxMjggYW5kIEFFUzI1NiBzaGFyZSBhIHNpbmdsZSBtYXNrIGJpdCBpbiB0aGUgbG9naWMgb2YKICAgICBzc2wvc3NsX2NpcGguYywgdGhlIGNvZGUgZm9yIG1hc2tpbmcgb3V0IGRpc2FibGVkIGNpcGhlcnMgbmVlZHMgYQogICAgIGtsdWRnZSB0byB3b3JrIHByb3Blcmx5IGlmIEFFUzEyOCBpcyBhdmFpbGFibGUgYW5kIEFFUzI1NiBpc24ndC4KICAgICBbVmljdG9yIER1Y2hvdm5pXQoKICAqKSBFeHBhbmQgc2VjdXJpdHkgYm91bmRhcnkgdG8gbWF0Y2ggMS4xLjEgbW9kdWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSByZWR1bmRhbnQgZmVhdHVyZXM6IGhhc2ggZmlsZSBzb3VyY2UsIGVkaXRpbmcgb2YgdGVzdCB2ZWN0b3JzCiAgICAgbW9kaWZ5IGZpcHNsZCB0byB1c2UgZXh0ZXJuYWwgZmlwc19wcmVtYWluLmMgc2lnbmF0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBwZXJsIHNjcmlwdCBta2ZpcHNzY3IucGwgdG8gY3JlYXRlIHNoZWxsIHNjcmlwdHMgb3IgYmF0Y2ggZmlsZXMgdG8KICAgICBydW4gYWxnb3JpdGhtIHRlc3QgcHJvZ3JhbXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBhbGdvcml0aG0gdGVzdCBwcm9ncmFtcyBtb3JlIHRvbGVyYW50IG9mIHdoaXRlc3BhY2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGF2ZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0b2xlcmF0ZSAibWlzbWF0Y2hlZCIgcmVjb3JkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiB3aGlsZSByZWNlaXZpbmcgQ2xpZW50SGVsbG8gZXZlbiBpZiB0aGUKICAgICBDbGllbnRIZWxsbyBpcyBmcmFnbWVudGVkLiAgKFRoZSBzZXJ2ZXIgY2FuJ3QgaW5zaXN0IG9uIHRoZQogICAgIHBhcnRpY3VsYXIgcHJvdG9jb2wgdmVyc2lvbiBpdCBoYXMgY2hvc2VuIGJlZm9yZSB0aGUgU2VydmVySGVsbG8KICAgICBtZXNzYWdlIGhhcyBpbmZvcm1lZCB0aGUgY2xpZW50IGFib3V0IGhpcyBjaG9pY2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIExvYWQgZXJyb3IgY29kZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbnN0ZWFkIG9mIHVzaW5nIGEKICAgICBzdGF0aWMgdmFyaWFibGUuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgY2xlYW5seSB1bmxvYWRlZCBhbmQgcmVsb2FkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdrIGFuZCAwLjkuN2wgIFsyOCBTZXAgMjAwNl0KCiAgKikgSW50cm9kdWNlIGxpbWl0cyB0byBwcmV2ZW50IG1hbGljaW91cyBrZXlzIGJlaW5nIGFibGUgdG8KICAgICBjYXVzZSBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5NDApCiAgICAgW1N0ZXZlIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQVNOLjEgcGFyc2luZyBvZiBjZXJ0YWluIGludmFsaWQgc3RydWN0dXJlcyB0aGF0IGNhbiByZXN1bHQKICAgICBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5MzcpICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93IGluIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmdW5jdGlvbi4gCiAgICAgKENWRS0yMDA2LTM3MzgpIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEZpeCBTU0wgY2xpZW50IGNvZGUgd2hpY2ggY291bGQgY3Jhc2ggaWYgY29ubmVjdGluZyB0byBhCiAgICAgbWFsaWNpb3VzIFNTTHYyIHNlcnZlci4gIChDVkUtMjAwNi00MzQzKQogICAgIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIENoYW5nZSBjaXBoZXJzdWl0ZSBzdHJpbmcgcHJvY2Vzc2luZyBzbyB0aGF0IGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyc3VpdGUgc2VsZWN0cyB0aGlzIG9uZSBjaXBoZXJzdWl0ZSAoc28gdGhhdCAiQUVTMjU2LVNIQSIKICAgICB3aWxsIG5vIGxvbmdlciBpbmNsdWRlICJBRVMxMjgtU0hBIiksIGFuZCBhbnkgb3RoZXIgc2ltaWxhcgogICAgIGNpcGhlcnN1aXRlIChzYW1lIGJpdG1hcCkgZnJvbSAqb3RoZXIqIHByb3RvY29sIHZlcnNpb25zIChzbyB0aGF0CiAgICAgIlJDNC1NRDUiIHdpbGwgc3RpbGwgaW5jbHVkZSBib3RoIHRoZSBTU0wgMi4wIGNpcGhlcnN1aXRlIGFuZCB0aGUKICAgICBTU0wgMy4wL1RMUyAxLjAgY2lwaGVyc3VpdGUpLiAgVGhpcyBpcyBhIGJhY2twb3J0IGNvbWJpbmluZwogICAgIGNoYW5nZXMgZnJvbSAwLjkuOGIgYW5kIDAuOS44ZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ogYW5kIDAuOS43ayAgWzA1IFNlcCAyMDA2XQoKICAqKSBBdm9pZCBQS0NTICMxIHYxLjUgc2lnbmF0dXJlIGF0dGFjayBkaXNjb3ZlcmVkIGJ5IERhbmllbCBCbGVpY2hlbmJhY2hlcgogICAgIChDVkUtMjAwNi00MzM5KSAgW0JlbiBMYXVyaWUgYW5kIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBDaGFuZ2UgdGhlIFVuaXggcmFuZG9tbmVzcyBlbnRyb3B5IGdhdGhlcmluZyB0byB1c2UgcG9sbCgpIHdoZW4KICAgICBwb3NzaWJsZSBpbnN0ZWFkIG9mIHNlbGVjdCgpLCBzaW5jZSB0aGUgbGF0dGVyIGhhcyBzb21lCiAgICAgdW5kZXNpcmFibGUgbGltaXRhdGlvbnMuCiAgICAgW0RhcnJ5bCBNaWxlcyB2aWEgUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgcm9ndWUgY2lwaGVyc3VpdGVzOgoKICAgICAgLSBTU0x2MiAweDA4IDB4MDAgMHg4MCAoIlJDNC02NC1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MSAoIkVYUDEwMjQtUkMyLUNCQy1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MCAoIkVYUDEwMjQtUkM0LU1ENSIpCgogICAgIFRoZSBsYXR0ZXIgdHdvIHdlcmUgcHVycG9ydGVkbHkgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMFswMV0udHh0LCBidXQgZG8gbm90IHJlYWxseQogICAgIGFwcGVhciB0aGVyZS4KCiAgICAgQWxzbyBkZWFjdGl2ZSB0aGUgcmVtYWluaW5nIGNpcGhlcnN1aXRlcyBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMS50eHQuICBUaGVzZSBhcmUganVzdCBhcwogICAgIHVub2ZmaWNpYWwsIGFuZCB0aGUgSUQgaGFzIGxvbmcgZXhwaXJlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggUlNBIGJsaW5kaW5nIEhlaXNlbmJ1ZyAocHJvYmxlbXMgc29tZXRpbWVzIG9jY3VyZWQgb24KICAgICBkdWFsLWNvcmUgbWFjaGluZXMpIGFuZCBvdGhlciBwb3RlbnRpYWwgdGhyZWFkLXNhZmV0eSBpc3N1ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdpIGFuZCAwLjkuN2ogIFswNCBNYXkgMjAwNl0KCiAgKikgQWRhcHQgZmlwc2xkIGFuZCB0aGUgYnVpbGQgc3lzdGVtIHRvIGxpbmsgYWdhaW5zdCB0aGUgdmFsaWRhdGVkIEZJUFMKICAgICBtb2R1bGUgaW4gRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIGZvciBWQysrIDIwMDUgYnVpbGQgdW5kZXIgV2luZG93cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IFdpbmRvd3MgYnVpbGQgdGFyZ2V0IFZDLTMyLUdNQUtFIGZvciBWQysrLiBUaGlzIHVzZXMgR05VIG1ha2UgCiAgICAgZnJvbSBhIFdpbmRvd3MgYmFzaCBzaGVsbCBzdWNoIGFzIE1TWVMuIEl0IGlzIGF1dG9kZXRlY3RlZCBmcm9tIHRoZQogICAgICJjb25maWciIHNjcmlwdCB3aGVuIHJ1biBmcm9tIGEgVkMrKyBlbnZpcm9ubWVudC4gTW9kaWZ5IHN0YW5kYXJkIFZDKysKICAgICBidWlsZCB0byB1c2UgZmlwc2NhbmlzdGVyLm8gZnJvbSB0aGUgR05VIG1ha2UgYnVpbGQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aCBhbmQgMC45LjdpICBbMTQgT2N0IDIwMDVdCgogICopIFdyYXBwZWQgdGhlIGRlZmluaXRpb24gb2YgRVZQX01BWF9NRF9TSVpFIGluIGEgI2lmZGVmIE9QRU5TU0xfRklQUy4KICAgICBUaGUgdmFsdWUgbm93IGRpZmZlcnMgZGVwZW5kaW5nIG9uIGlmIHlvdSBidWlsZCBmb3IgRklQUyBvciBub3QuCiAgICAgQkVXQVJFISAgQSBwcm9ncmFtIGxpbmtlZCB3aXRoIGEgc2hhcmVkIEZJUFNlZCBsaWJjcnlwdG8gY2FuJ3QgYmUKICAgICBzYWZlbHkgcnVuIHdpdGggYSBub24tRklQU2VkIGxpYmNyeXB0bywgYXMgaXQgbWF5IGNyYXNoIGJlY2F1c2Ugb2YKICAgICB0aGUgZGlmZmVyZW5jZSBpbmR1Y2VkIGJ5IHRoaXMgY2hhbmdlLgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2cgYW5kIDAuOS43aCAgWzExIE9jdCAyMDA1XQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcKICAgICAocGFydCBvZiBTU0xfT1BfQUxMKS4gIFRoaXMgb3B0aW9uIHVzZWQgdG8gZGlzYWJsZSB0aGUKICAgICBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIHByb3RvY29sLXZlcnNpb24KICAgICByb2xsYmFjayBpbiB0aGUgU1NMIDIuMCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGEgYmFkCiAgICAgaWRlYS4gIChDVkUtMjAwNS0yOTY5KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFl1dGFrYSBPaXdhIChSZXNlYXJjaCBDZW50ZXIKICAgICBmb3IgSW5mb3JtYXRpb24gU2VjdXJpdHksIE5hdGlvbmFsIEluc3RpdHV0ZSBvZiBBZHZhbmNlZCBJbmR1c3RyaWFsCiAgICAgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBbQUlTVF0sIEphcGFuKV0KCiAgKikgTWluaW1hbCBzdXBwb3J0IGZvciBYOS4zMSBzaWduYXR1cmVzIGFuZCBQU1MgcGFkZGluZyBtb2Rlcy4gVGhpcyBpcwogICAgIG1haW5seSBmb3IgRklQUyBjb21wbGlhbmNlIGFuZCBub3QgZnVsbHkgaW50ZWdyYXRlZCBhdCB0aGlzIHN0YWdlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBEU0Egc2lnbmluZywgdW5sZXNzIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUgaXMgc2V0LCBwZXJmb3JtCiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIHVzaW5nIGEgZml4ZWQtbGVuZ3RoIGV4cG9uZW50LiAgKE90aGVyd2lzZSwKICAgICB0aGUgaW5mb3JtYXRpb24gbGVha2VkIHRocm91Z2ggdGltaW5nIGNvdWxkIGV4cG9zZSB0aGUgc2VjcmV0IGtleQogICAgIGFmdGVyIG1hbnkgc2lnbmF0dXJlczsgY2YuIEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrIG9uIERTQSB3aXRoCiAgICAgYmlhc2VkIGsuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgYSBuZXcgZml4ZWQtd2luZG93IG1vZF9leHAgaW1wbGVtZW50YXRpb24gdGhlIGRlZmF1bHQgZm9yCiAgICAgUlNBLCBEU0EsIGFuZCBESCBwcml2YXRlLWtleSBvcGVyYXRpb25zIHNvIHRoYXQgdGhlIHNlcXVlbmNlIG9mCiAgICAgc3F1YXJlcyBhbmQgbXVsdGlwbGllcyBhbmQgdGhlIG1lbW9yeSBhY2Nlc3MgcGF0dGVybiBhcmUKICAgICBpbmRlcGVuZGVudCBvZiB0aGUgcGFydGljdWxhciBzZWNyZXQga2V5LiAgVGhpcyB3aWxsIG1pdGlnYXRlCiAgICAgY2FjaGUtdGltaW5nIGFuZCBwb3RlbnRpYWwgcmVsYXRlZCBhdHRhY2tzLgoKICAgICBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKCkgaXMgdGhlIG5ldyBleHBvbmVudGlhdGlvbiBpbXBsZW1lbnRhdGlvbiwKICAgICBhbmQgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVzZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgaWYgdGhlIG5ldyBmbGFnCiAgICAgQk5fRkxHX0VYUF9DT05TVFRJTUUgaXMgc2V0IGZvciB0aGUgZXhwb25lbnQuICBSU0EsIERTQSwgYW5kIERICiAgICAgd2lsbCB1c2UgdGhpcyBCTiBmbGFnIGZvciBwcml2YXRlIGV4cG9uZW50cyB1bmxlc3MgdGhlIGZsYWcKICAgICBSU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FLCBEU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FLCBvcgogICAgIERIX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgcmVzcGVjdGl2ZWx5LCBpcyBzZXQuCgogICAgIFtNYXR0aGV3IEQgV29vZCAoSW50ZWwgQ29ycCksIHdpdGggc29tZSBjaGFuZ2VzIGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIFNTTHYyM19tZXRob2QoKSBhbmQKICAgICBTU0x2MjNfY2xpZW50X21ldGhvZCgpIHNvIHRoYXQgaXMgdXNlcyB0aGUgU1NMIDMuMC9UTFMgMS4wCiAgICAgQ2xpZW50IEhlbGxvIG1lc3NhZ2UgZm9ybWF0IGlmIHRoZSBTU0xfT1BfTk9fU1NMdjIgb3B0aW9uIGlzIHNldC4KICAgICAoUHJldmlvdXNseSwgdGhlIFNTTCAyLjAgYmFja3dhcmRzIGNvbXBhdGlibGUgQ2xpZW50IEhlbGxvCiAgICAgbWVzc2FnZSBmb3JtYXQgd291bGQgYmUgdXNlZCBldmVuIHdpdGggU1NMX09QX05PX1NTTHYyLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc21pbWUtdHlwZSBNSU1FIHBhcmFtZXRlciBpbiBTL01JTUUgbWVzc2FnZXMgd2hpY2ggc29tZQogICAgIGNsaWVudHMgbmVlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgpIHRvIHNldCBtb250Z29tZXJ5IHBhcmFtZXRlcnMgaW4KICAgICBhIHRocmVhZHNhZmUgbWFubmVyLiBNb2RpZnkgcnNhIGNvZGUgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgYWRkIGNhbGxzCiAgICAgdG8gZHNhIGFuZCBkaCBjb2RlICh3aGljaCBoYWQgcmFjZSBjb25kaXRpb25zIGJlZm9yZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jbHVkZSB0aGUgZml4ZWQgZXJyb3IgbGlicmFyeSBjb2RlIGluIHRoZSBDIGVycm9yIGZpbGUgZGVmaW5pdGlvbnMKICAgICBpbnN0ZWFkIG9mIGZpeGluZyB0aGVtIHVwIGF0IHJ1bnRpbWUuIFRoaXMga2VlcHMgdGhlIGVycm9yIGNvZGUKICAgICBzdHJ1Y3R1cmVzIGNvbnN0YW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZiBhbmQgMC45LjdnICBbMTEgQXByIDIwMDVdCgogIFtOQjogT3BlblNTTCAwLjkuN2ggYW5kIGxhdGVyIDAuOS43IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuOC5dCgogICopIEZpeGVzIGZvciBuZXdlciBrZXJiZXJvcyBoZWFkZXJzLiBOQjogdGhlIGNhc3RzIGFyZSBuZWVkZWQgYmVjYXVzZQogICAgIHRoZSAnbGVuZ3RoJyBmaWVsZCBpcyBzaWduZWQgb24gb25lIHZlcnNpb24gYW5kIHVuc2lnbmVkIG9uIGFub3RoZXIKICAgICB3aXRoIG5vICg/KSBvYnZpb3VzIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlLCB3aXRob3V0IHRoZXNlIFZDKysKICAgICBjb21wbGFpbnMuIEFsc28gdGhlICJkZWZpbml0aW9uIiBvZiBGQVIgKGJsYW5rKSBpcyBubyBsb25nZXIgaW5jbHVkZWQKICAgICBub3IgaXMgdGhlIGVycm9yIEVOT01FTS4gS1JCNV9QUklWQVRFIGhhcyB0byBiZSBzZXQgdG8gMSB0byBwaWNrIHVwCiAgICAgc29tZSBuZWVkZWQgZGVmaW5pdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVW5kbyBDeWd3aW4gY2hhbmdlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBwcm94eSBjZXJ0aWZpY2F0ZXMgYWNjb3JkaW5nIHRvIFJGQyAzODIwLgogICAgIEJlY2F1c2UgdGhleSBtYXkgYmUgYSBzZWN1cml0eSB0aHJlYWQgdG8gdW5hd2FyZSBhcHBsaWNhdGlvbnMsCiAgICAgdGhleSBtdXN0IGJlIGV4cGxpY2l0ZWx5IGFsbG93ZWQgaW4gcnVuLXRpbWUuICBTZWUKICAgICBkb2NzL0hPV1RPL3Byb3h5X2NlcnRpZmljYXRlcy50eHQgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdlIGFuZCAwLjkuN2YgIFsyMiBNYXIgMjAwNV0KCiAgKikgVXNlIChTU0xfUkFORE9NX1ZBTFVFIC0gNCkgYnl0ZXMgb2YgcHNldWRvIHJhbmRvbSBkYXRhIHdoZW4gZ2VuZXJhdGluZwogICAgIHNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMuIFByZXZpb3VzbHkKICAgICAoU1NMX1JBTkRPTV9WQUxVRSAtIHNpemVvZih0aW1lX3QpKSB3b3VsZCBiZSB1c2VkIHdoaWNoIHdvdWxkIHJlc3VsdCBpbgogICAgIGxlc3MgcmFuZG9tIGRhdGEgd2hlbiBzaXplb2YodGltZV90KSA+IDQgKHNvbWUgNjQgYml0IHBsYXRmb3JtcykuCgogICAgIFRoaXMgY2hhbmdlIGhhcyBuZWdsaWdpYmxlIHNlY3VyaXR5IGltcGFjdCBiZWNhdXNlOgoKICAgICAxLiBTZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzIHN0aWxsIGhhdmUgMjQgYnl0ZXMgb2YgcHNldWRvIHJhbmRvbQogICAgICAgIGRhdGEuCgogICAgIDIuIFNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMgYXJlIHNlbnQgaW4gdGhlIGNsZWFyIGluIHRoZSBpbml0aWFsCiAgICAgICAgaGFuZHNoYWtlLgoKICAgICAzLiBUaGUgbWFzdGVyIHNlY3JldCBpcyBkZXJpdmVkIHVzaW5nIHRoZSBwcmVtYXN0ZXIgc2VjcmV0ICg0OCBieXRlcyBpbgogICAgICAgIHNpemUgZm9yIHN0YXRpYyBSU0EgY2lwaGVyc3VpdGVzKSBhcyB3ZWxsIGFzIGNsaWVudCBzZXJ2ZXIgYW5kIHJhbmRvbQogICAgICAgIHZhbHVlcy4KCiAgICAgVGhlIE9wZW5TU0wgdGVhbSB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBVSyBOSVNDQyBmb3IgYnJpbmdpbmcgdGhpcyBpc3N1ZQogICAgIHRvIG91ciBhdHRlbnRpb24uIAoKICAgICBbU3RlcGhlbiBIZW5zb24sIHJlcG9ydGVkIGJ5IFVLIE5JU0NDXQoKICAqKSBVc2UgV2luZG93cyByYW5kb21uZXNzIGNvbGxlY3Rpb24gb24gQ3lnd2luLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggaGFuZyBpbiBFR0QvUFJOR0QgcXVlcnkgd2hlbiBjb21tdW5pY2F0aW9uIHNvY2tldCBpcyBjbG9zZWQKICAgICBwcmVtYXR1cmVseSBieSBFR0QvUFJOR0QuCiAgICAgW0RhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4gdmlhIEx1dHogSuRuaWNrZSwgcmVzb2x2ZXMgIzEwMTRdCgogICopIFByb21wdCBmb3IgcGFzcyBwaHJhc2VzIHdoZW4gYXBwcm9wcmlhdGUgZm9yIFBLQ1MxMiBpbnB1dCBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmFjay1wb3J0IG9mIHNlbGVjdGVkIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmcm9tIGRldmVsb3BtZW50CiAgICAgYnJhbmNoLCBhcyB3ZWxsIGFzIGltcHJvdmVkIHN1cHBvcnQgZm9yIFBvd2VyUEMgcGxhdGZvcm1zLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgbG90cyBvZiBjaGVja3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIGVycm9yIGNvZGVzIHRvIGluZGljYXRlCiAgICAgZmFpbHVyZSBhbmQgZnJlZWluZyB1cCBtZW1vcnkgaWYgYSBmYWlsdXJlIG9jY3Vycy4KICAgICBbTmF1dGljdXMgTmV0d29ya3MgU1NMIFRlYW0gPG9wZW5zc2xAbmF1dGljdXNuZXQuY29tPiwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC1wYXNzaW4gYXJndW1lbnQgdG8gZGdzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJmb3JtIHNvbWUgY2hhcmFjdGVyIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVudCB0eXBlcyBpbiBYNTA5X05BTUVfY21wOgogICAgIHRoaXMgaXMgbmVlZGVkIGZvciBzb21lIGNlcnRpZmljYXRlcyB0aGF0IHJlZW5jb2RlIEROcyBpbnRvIFVURjhTdHJpbmdzCiAgICAgKGluIHZpb2xhdGlvbiBvZiBSRkMzMjgwKSBhbmQgY2FuJ3Qgb3Igd29udCBpc3N1ZSBuYW1lIHJvbGxvdmVyCiAgICAgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYW4gZXhwbGljaXQgY2hlY2sgZHVyaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gdG8gc2VlIHRoYXQKICAgICB0aGUgQ0Egc2V0dGluZyBpbiBlYWNoIGNlcnRpZmljYXRlIG9uIHRoZSBjaGFpbiBpcyBjb3JyZWN0LiAgQXMgYQogICAgIHNpZGUgZWZmZWN0IGFsd2F5cyBkbyB0aGUgZm9sbG93aW5nIGJhc2ljIGNoZWNrcyBvbiBleHRlbnNpb25zLAogICAgIG5vdCBqdXN0IHdoZW4gdGhlcmUncyBhbiBhc3NvY2lhdGVkIHB1cnBvc2UgdG8gdGhlIGNoZWNrOgoKICAgICAgLSBpZiB0aGVyZSBpcyBhbiB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9uICh1bmxlc3MgdGhlIHVzZXIKICAgICAgICBoYXMgY2hvc2VuIHRvIGlnbm9yZSB0aGlzIGZhdWx0KQogICAgICAtIGlmIHRoZSBwYXRoIGxlbmd0aCBoYXMgYmVlbiBleGNlZWRlZCAoaWYgb25lIGlzIHNldCBhdCBhbGwpCiAgICAgIC0gdGhhdCBjZXJ0YWluIGV4dGVuc2lvbnMgZml0IHRoZSBhc3NvY2lhdGVkIHB1cnBvc2UgKGlmIG9uZSBoYXMKICAgICAgICBiZWVuIGdpdmVuKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZCBhbmQgMC45LjdlICBbMjUgT2N0IDIwMDRdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBDUkxzIGFyZSBjaGVja2VkIGluIGEgbXVsdGkgdGhyZWFkZWQgCiAgICAgZW52aXJvbm1lbnQuIFRoaXMgd291bGQgaGFwcGVuIGR1ZSB0byB0aGUgcmVvcmRlcmluZyBvZiB0aGUgcmV2b2tlZAogICAgIGVudHJpZXMgZHVyaW5nIHNpZ25hdHVyZSBjaGVja2luZyBhbmQgc2VyaWFsIG51bWJlciBsb29rdXAuIE5vdyB0aGUKICAgICBlbmNvZGluZyBpcyBjYWNoZWQgYW5kIHRoZSBzZXJpYWwgbnVtYmVyIHNvcnQgcGVyZm9ybWVkIHVuZGVyIGEgbG9jay4KICAgICBBZGQgbmV3IFNUQUNLIGZ1bmN0aW9uIHNrX2lzX3NvcnRlZCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBEZWx0YSBDUkwgdG8gdGhlIGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gczNfcGt0LmMgc28gYWxlcnRzIGFyZSBzZW50IHByb3Blcmx5LgogICAgIFtEYXZpZCBIb2xtZXMgPGQuaG9sbWVzQGY1LmNvbT5dCgogICopIFJlZHVjZSB0aGUgY2hhbmNlcyBvZiBkdXBsaWNhdGUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXJzIChpbgogICAgIHZpb2xhdGlvbiBvZiBSRkMzMjgwKSB1c2luZyB0aGUgT3BlblNTTCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiB1dGlsaXRpZXMuCiAgICAgVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgcmFuZG9tIDY0IGJpdCB2YWx1ZSBmb3IgdGhlIGluaXRpYWwgc2VyaWFsCiAgICAgbnVtYmVyIHdoZW4gYSBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgY3JlYXRlZCBvciB3aGVuIGEgc2VsZiBzaWduZWQKICAgICBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHVzaW5nICdvcGVuc3NsIHJlcSAteDUwOScuIFRoZSBpbml0aWFsIHNlcmlhbAogICAgIG51bWJlciBmaWxlIGlzIGNyZWF0ZWQgdXNpbmcgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluIENBLnBsCiAgICAgcmF0aGVyIHRoYW4gYmVpbmcgaW5pdGlhbGl6ZWQgdG8gMS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2MgYW5kIDAuOS43ZCAgWzE3IE1hciAyMDA0XQoKICAqKSBGaXggbnVsbC1wb2ludGVyIGFzc2lnbm1lbnQgaW4gZG9fY2hhbmdlX2NpcGhlcl9zcGVjKCkgcmV2ZWFsZWQgICAgICAgICAgIAogICAgIGJ5IHVzaW5nIHRoZSBDb2Rlbm9taWNvbiBUTFMgVGVzdCBUb29sIChDVkUtMjAwNC0wMDc5KSAgICAgICAgICAgICAgICAgICAgCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXSAgIAoKICAqKSBGaXggZmxhdyBpbiBTU0wvVExTIGhhbmRzaGFraW5nIHdoZW4gdXNpbmcgS2VyYmVyb3MgY2lwaGVyc3VpdGVzCiAgICAgKENWRS0yMDA0LTAxMTIpCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXSAgIAoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBzYW1lCiAgICAgc3ViamVjdCBpbiB0aGUgQ0EgaW5kZXggZmlsZS4gIFRoaXMgaXMgZG9uZSBvbmx5IGlmIHRoZSBrZXl3b3JkCiAgICAgJ3VuaXF1ZV9zdWJqZWN0JyBpcyBzZXQgdG8gJ25vJyBpbiB0aGUgbWFpbiBDQSBzZWN0aW9uIChkZWZhdWx0CiAgICAgaWYgJ0NBX2RlZmF1bHQnKSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIHZhbHVlIGlzIHNhdmVkCiAgICAgd2l0aCB0aGUgZGF0YWJhc2UgaXRzZWxmIGluIGEgc2VwYXJhdGUgaW5kZXggYXR0cmlidXRlIGZpbGUsCiAgICAgbmFtZWQgbGlrZSB0aGUgaW5kZXggZmlsZSB3aXRoICcuYXR0cicgYXBwZW5kZWQgdG8gdGhlIG5hbWUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgWDUwOSB2ZXJpZnkgZml4ZXMuIERpc2FibGUgYnJva2VuIGNlcnRpZmljYXRlIHdvcmthcm91bmRzIHdoZW4gCiAgICAgWDUwOV9WX0ZMQUdTX1g1MDlfU1RSSUNUIGlzIHNldC4gQ2hlY2sgQ1JMIGlzc3VlciBoYXMgY1JMU2lnbiBzZXQgaWYKICAgICBrZXlVc2FnZSBleHRlbnNpb24gcHJlc2VudC4gRG9uJ3QgYWNjZXB0IENSTHMgd2l0aCB1bmhhbmRsZWQgY3JpdGljYWwKICAgICBleHRlbnNpb25zOiBzaW5jZSB2ZXJpZnkgY3VycmVudGx5IGRvZXNuJ3QgcHJvY2VzcyBDUkwgZXh0ZW5zaW9ucyB0aGlzCiAgICAgcmVqZWN0cyBhIENSTCB3aXRoICphbnkqIGNyaXRpY2FsIGV4dGVuc2lvbnMuIEFkZCBuZXcgdmVyaWZ5IGVycm9yIGNvZGVzCiAgICAgZm9yIHRoZXNlIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gY3JlYXRpbmcgYW4gT0NTUCBub25jZSB1c2UgYW4gT0NURVQgU1RSSU5HIGluc2lkZSB0aGUgZXh0blZhbHVlLgogICAgIEEgY2xhcmlmaWNhdGlvbiBvZiBSRkMyNTYwIHdpbGwgcmVxdWlyZSB0aGUgdXNlIG9mIE9DVEVUIFNUUklOR3MgYW5kIAogICAgIHNvbWUgaW1wbGVtZW50YXRpb25zIGNhbm5vdCBoYW5kbGUgdGhlIGN1cnJlbnQgcmF3IGZvcm1hdC4gU2luY2UgT3BlblNTTAogICAgIGNvcGllcyBhbmQgY29tcGFyZXMgT0NTUCBub25jZXMgYXMgb3BhcXVlIGJsb2JzIHdpdGhvdXQgYW55IGF0dGVtcHQgYXQKICAgICBwYXJzaW5nIHRoZW0gdGhpcyBzaG91bGQgbm90IGNyZWF0ZSBhbnkgY29tcGF0aWJpbGl0eSBpc3N1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG1kIGZsYWcgRVZQX01EX0NUWF9GTEFHX1JFVVNFIHRoaXMgYWxsb3dzIG1kX2RhdGEgdG8gYmUgcmV1c2VkIHdoZW4KICAgICBjYWxsaW5nIEVWUF9NRF9DVFhfY29weV9leCgpIHRvIGF2b2lkIGNhbGxpbmcgT1BFTlNTTF9tYWxsb2MoKS4gV2l0aG91dAogICAgIHRoaXMgSE1BQyAoYW5kIG90aGVyKSBvcGVyYXRpb25zIGFyZSBzZXZlcmFsIHRpbWVzIHNsb3dlciB0aGFuIE9wZW5TU0wKICAgICA8IDAuOS43LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByaW50IG91dCBHZW5lcmFsaXplZFRpbWUgYW5kIFVUQ1RpbWUgaW4gQVNOMV9TVFJJTkdfcHJpbnRfZXgoKS4KICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcj5dCgogICopIFVzZSB0aGUgY29ycmVjdCBjb250ZW50IHdoZW4gc2lnbmluZyB0eXBlICJvdGhlciIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdiIGFuZCAwLjkuN2MgIFszMCBTZXAgMjAwM10KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZXZlYWxlZCBieSBydW5uaW5nIHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIG91dCBvZiBib3VuZHMgcmVhZHMgaW4gdGhlIEFTTjEgY29kZSB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgaW52YWxpZCB0YWdzIChDVkUtMjAwMy0wNTQzIGFuZCBDVkUtMjAwMy0wNTQ0KS4KICAgICAKICAgICBGcmVlIHVwIEFTTjFfVFlQRSBjb3JyZWN0bHkgaWYgQU5ZIHR5cGUgaXMgaW52YWxpZCAoQ1ZFLTIwMDMtMDU0NSkuCgogICAgIElmIHZlcmlmeSBjYWxsYmFjayBpZ25vcmVzIGludmFsaWQgcHVibGljIGtleSBlcnJvcnMgZG9uJ3QgdHJ5IHRvIGNoZWNrCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIHdpdGggdGhlIE5VTEwgcHVibGljIGtleS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1pZ25vcmVfZXJyIG9wdGlvbiBpbiBvY3NwIGFwcGxpY2F0aW9uIHRvIHN0b3AgdGhlIHNlcnZlcgogICAgIGV4aXRpbmcgb24gdGhlIGZpcnN0IGVycm9yIGluIGEgcmVxdWVzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2FjY2VwdCgpIChzc2wvczNfc3J2ci5jKSBvbmx5IGFjY2VwdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIG9uZTogYXMgc3RhdGVkIGluIFRMUyAxLjAgYW5kIFNTTCAzLjAKICAgICBzcGVjaWZpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKSAoc3NsL3MzX3NydnIuYyksIHRvbGVyYXRlIGFkZGl0aW9uYWwKICAgICBleHRyYSBkYXRhIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBvbmx5IGZvciBUTFMgMS4wCiAgICAgYnV0IGFsc28gZm9yIFNTTCAzLjAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hdHRoaWFzIExvZXBmZV0KCiAgKikgQ2hhbmdlIFg1MDlfY2VydGlmaWNhdGVfdHlwZSgpIHRvIG1hcmsgdGhlIGtleSBhcyBleHBvcnRlZC9leHBvcnRhYmxlCiAgICAgd2hlbiBpdCdzIDUxMiAqYml0cyogbG9uZywgbm90IDUxMiBieXRlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgQUVTX2NiY19lbmNyeXB0KCkgc28gaXQgb3V0cHV0cyBleGFjdCBtdWx0aXBsZSBvZgogICAgIGJsb2NrcyBkdXJpbmcgZW5jcnlwdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIGJhc2U2NCBCSU8gYW5kIG5vbiBibG9ja2luZyBJL08uIE9uIHdyaXRlIAogICAgIGZsdXNoZXMgd2VyZSBub3QgaGFuZGxlZCBwcm9wZXJseSBpZiB0aGUgQklPIHJldHJpZWQuIE9uIHJlYWQKICAgICBkYXRhIHdhcyBub3QgYmVpbmcgYnVmZmVyZWQgcHJvcGVybHkgYW5kIGhhZCB2YXJpb3VzIGxvZ2ljIGJ1Z3MuCiAgICAgVGhpcyBhbHNvIGFmZmVjdHMgYmxvY2tpbmcgSS9PIHdoZW4gdGhlIGRhdGEgYmVpbmcgZGVjb2RlZCBpcyBhCiAgICAgY2VydGFpbiBzaXplLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgUy9NSU1FIGJ1Z2ZpeGVzIGFuZCBjb21wYXRpYmlsaXR5IGNoYW5nZXM6CiAgICAgb3V0cHV0IGNvcnJlY3QgYXBwbGljYXRpb24vcGtjczcgTUlNRSB0eXBlIGlmCiAgICAgUEtDUzdfTk9PTERNSU1FVFlQRSBpcyBzZXQuIFRvbGVyYXRlIHNvbWUgYnJva2VuIHNpZ25hdHVyZXMuCiAgICAgT3V0cHV0IENSK0xGIGZvciBFT0wgaWYgUEtDUzdfQ1JMRkVPTCBpcyBzZXQgKHRoaXMgbWFrZXMgb3BlbmluZwogICAgIG9mIGZpbGVzIGFzIC5lbWwgd29yaykuIENvcnJlY3RseSBoYW5kbGUgdmVyeSBsb25nIGxpbmVzIGluIE1JTUUKICAgICBwYXJzZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdhIGFuZCAwLjkuN2IgIFsxMCBBcHIgMjAwM10KCiAgKikgQ291bnRlcm1lYXN1cmUgYWdhaW5zdCB0aGUgS2xpbWEtUG9rb3JueS1Sb3NhIGV4dGVuc2lvbiBvZgogICAgIEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgcGFkZGluZzogdHJlYXQKICAgICBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIG1pc21hdGNoIGxpa2UgYSBkZWNyeXB0aW9uIGVycm9yCiAgICAgaW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSAoc3NsL3MzX3NydnIuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBvbiBSU0EgYmxpbmRpbmcgYnkgZGVmYXVsdCBpbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgIHRvIGF2b2lkIGEgdGltaW5nIGF0dGFjay4gQXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCBpdCBjYW4gY2FsbAogICAgIFJTQV9ibGluZGluZ19vZmYoKSBvciB1c2UgdGhlIG5ldyBmbGFnIFJTQV9GTEFHX05PX0JMSU5ESU5HLgogICAgIFRoZXkgd291bGQgYmUgaWxsLWFkdmlzZWQgdG8gZG8gc28gaW4gbW9zdCBjYXNlcy4KICAgICBbQmVuIExhdXJpZSwgU3RldmUgSGVuc29uLCBHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFJTQSBibGluZGluZyBjb2RlIHNvIHRoYXQgaXQgd29ya3Mgd2hlbiB0aGUgUFJORyBpcyBub3QKICAgICBzZWVkZWQgKGluIHRoaXMgY2FzZSwgdGhlIHNlY3JldCBSU0EgZXhwb25lbnQgaXMgYWJ1c2VkIGFzCiAgICAgYW4gdW5wcmVkaWN0YWJsZSBzZWVkIC0tIGlmIGl0IGlzIG5vdCB1bnByZWRpY3RhYmxlLCB0aGVyZQogICAgIGlzIG5vIHBvaW50IGluIGJsaW5kaW5nIGFueXdheSkuICBNYWtlIFJTQSBibGluZGluZyB0aHJlYWQtc2FmZQogICAgIGJ5IHJlbWVtYmVyaW5nIHRoZSBjcmVhdG9yJ3MgdGhyZWFkIElEIGluIHJzYS0+YmxpbmRpbmcgYW5kCiAgICAgaGF2aW5nIGFsbCBvdGhlciB0aHJlYWRzIHVzZSBsb2NhbCBvbmUtdGltZSBibGluZGluZyBmYWN0b3JzCiAgICAgKHRoaXMgcmVxdWlyZXMgbW9yZSBjb21wdXRhdGlvbiB0aGFuIHNoYXJpbmcgcnNhLT5ibGluZGluZywgYnV0CiAgICAgYXZvaWRzIGV4Y2Vzc2l2ZSBsb2NraW5nOyBhbmQgaWYgYW4gUlNBIG9iamVjdCBpcyBub3Qgc2hhcmVkCiAgICAgYmV0d2VlbiB0aHJlYWRzLCBibGluZGluZyB3aWxsIHN0aWxsIGJlIHZlcnkgZmFzdCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4ZWQgYSB0eXBvIGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIEVOR0lORV9zZXRfZGVmYXVsdCgpIHRvIHNldCBhbgogICAgIEVOR0lORSBhcyBkZWZhdWx0cyBmb3IgYWxsIHN1cHBvcnRlZCBhbGdvcml0aG1zIGlycmVzcGVjdGl2ZSBvZgogICAgIHRoZSAnZmxhZ3MnIHBhcmFtZXRlci4gJ2ZsYWdzJyBpcyBub3cgaG9ub3VyZWQsIHNvIGFwcGxpY2F0aW9ucwogICAgIHNob3VsZCBtYWtlIHN1cmUgdGhleSBhcmUgcGFzc2luZyBpdCBjb3JyZWN0bHkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGFyZ2V0ICJtaW5ndyIgbm93IGFsbG93cyBuYXRpdmUgV2luZG93cyBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbgogICAgIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aXRoIHRoZSBNaW5HVyBjb21waWxlci4KICAgICBbVWxmIE1vZWxsZXJdIAoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNyBhbmQgMC45LjdhICBbMTkgRmViIDIwMDNdCgogICopIEluIHNzbDNfZ2V0X3JlY29yZCAoc3NsL3MzX3BrdC5jKSwgbWluaW1pemUgaW5mb3JtYXRpb24gbGVha2VkCiAgICAgdmlhIHRpbWluZyBieSBwZXJmb3JtaW5nIGEgTUFDIGNvbXB1dGF0aW9uIGV2ZW4gaWYgaW5jb3JycmVjdAogICAgIGJsb2NrIGNpcGhlciBwYWRkaW5nIGhhcyBiZWVuIGZvdW5kLiAgVGhpcyBpcyBhIGNvdW50ZXJtZWFzdXJlCiAgICAgYWdhaW5zdCBhY3RpdmUgYXR0YWNrcyB3aGVyZSB0aGUgYXR0YWNrZXIgaGFzIHRvIGRpc3Rpbmd1aXNoCiAgICAgYmV0d2VlbiBiYWQgcGFkZGluZyBhbmQgYSBNQUMgdmVyaWZpY2F0aW9uIGVycm9yLiAoQ1ZFLTIwMDMtMDA3OCkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCcmljZSBDYW52ZWwgKEVQRkwpLAogICAgIEFsYWluIEhpbHRnZW4gKFVCUyksIFNlcmdlIFZhdWRlbmF5IChFUEZMKSwgYW5kCiAgICAgTWFydGluIFZ1YWdub3V4IChFUEZMLCBJbGlvbildCgogICopIE1ha2UgdGhlIG5vLWVyciBvcHRpb24gd29yayBhcyBpbnRlbmRlZC4gIFRoZSBpbnRlbnRpb24gd2l0aCBuby1lcnIKICAgICBpcyBub3QgdG8gaGF2ZSB0aGUgd2hvbGUgZXJyb3Igc3RhY2sgaGFuZGxpbmcgcm91dGluZXMgcmVtb3ZlZCBmcm9tCiAgICAgbGliY3J5cHRvLCBpdCdzIG9ubHkgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQKICAgICByZWFzb24gdGV4dHMsIHRoZXJlYnkgcmVtb3Zpbmcgc29tZSBvZiB0aGUgZm9vdHByaW50IHRoYXQgbWF5IG5vdAogICAgIGJlIGludGVyZXN0aW5nIGlmIHRob3NlIGVycm9ycyBhcmVuJ3QgZGlzcGxheWVkIGFueXdheS4KCiAgICAgTk9URTogaXQncyBzdGlsbCBwb3NzaWJsZSBmb3IgYW55IGFwcGxpY2F0aW9uIG9yIG1vZHVsZSB0byBoYXZlIGl0J3MKICAgICBvd24gc2V0IG9mIGVycm9yIHRleHRzIGluc2VydGVkLiAgVGhlIHJvdXRpbmVzIGFyZSB0aGVyZSwganVzdCBub3QKICAgICB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuby1lcnIgaXMgZ2l2ZW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0Qgb24gSUE2NC4KICAgICBbZGlyay5tZXllckBkaW5vZXguc3ViLm9yZyB2aWEgUmljaGFyZCBMZXZpdHRlLCByZXNvbHZlcyAjNDU0XQoKICAqKSBBZGp1c3QgREVTX2NiY19ja3N1bSgpIHNvIGl0IHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIE1JVAogICAgIEtlcmJlcm9zIGZ1bmN0aW9uIG1pdF9kZXNfY2JjX2Nrc3VtKCkuICBCZWZvcmUgdGhpcyBjaGFuZ2UsCiAgICAgdGhlIHZhbHVlIHJldHVybmVkIGJ5IERFU19jYmNfY2tzdW0oKSB3YXMgbGlrZSB0aGUgb25lIGZyb20KICAgICBtaXRfZGVzX2NiY19ja3N1bSgpLCBleGNlcHQgdGhlIGJ5dGVzIHdlcmUgc3dhcHBlZC4KICAgICBbS2V2aW4gR3JlYW5leSA8S2V2aW4uR3JlYW5leUBocC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBTU0wgY2hhaW4gYnVpbGRpbmcuCiAgICAgQmVmb3JlIHRoaXMgYSByYXRoZXIgcHJpbWl0aXZlIGNoYWluIGJ1aWxkIHdhcyBhbHdheXMgcGVyZm9ybWVkIGluCiAgICAgc3NsM19vdXRwdXRfY2VydF9jaGFpbigpOiBhbiBhcHBsaWNhdGlvbiBoYWQgbm8gd2F5IHRvIHNlbmQgdGhlIAogICAgIGNvcnJlY3QgY2hhaW4gaWYgdGhlIGF1dG9tYXRpYyBvcGVyYXRpb24gcHJvZHVjZWQgYW4gaW5jb3JyZWN0IHJlc3VsdC4KCiAgICAgTm93IHRoZSBjaGFpbiBidWlsZGVyIGlzIGRpc2FibGVkIGlmIGVpdGhlcjoKCiAgICAgMS4gRXh0cmEgY2VydGlmaWNhdGVzIGFyZSBhZGRlZCB2aWEgU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpLgoKICAgICAyLiBUaGUgbW9kZSBmbGFnIFNTTF9NT0RFX05PX0FVVE9fQ0hBSU4gaXMgc2V0LgoKICAgICBUaGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIGlzIHRoYXQgYW4gYXBwbGljYXRpb24gd291bGQgbm90IHdhbnQgdGhlCiAgICAgYXV0byBjaGFpbiBidWlsZGluZyB0byB0YWtlIHBsYWNlIGlmIGV4dHJhIGNoYWluIGNlcnRpZmljYXRlcyBhcmUKICAgICBwcmVzZW50IGFuZCBpdCBtaWdodCBhbHNvIHdhbnQgYSBtZWFucyBvZiBzZW5kaW5nIG5vIGFkZGl0aW9uYWwKICAgICBjZXJ0aWZpY2F0ZXMgKGZvciBleGFtcGxlIHRoZSBjaGFpbiBoYXMgdHdvIGNlcnRpZmljYXRlcyBhbmQgdGhlCiAgICAgcm9vdCBpcyBvbWl0dGVkKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGJ1aWxkIHdpdGhvdXQgdGhlIEVOR0lORSBmcmFtZXdvcmsuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVW5kZXIgV2luMzIgZ210aW1lKCkgY2FuIHJldHVybiBOVUxMOiBjaGVjayByZXR1cm4gdmFsdWUgaW4KICAgICBPUEVOU1NMX2dtdGltZSgpLiBBZGQgZXJyb3IgY29kZSBmb3IgY2FzZSB3aGVyZSBnbXRpbWUoKSBmYWlscy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEU0Egcm91dGluZXM6IHVuZGVyIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB1bmluaXRpYWxpemVkIEJOIG9iamVjdHMKICAgICBjb3VsZCBiZSBmcmVlZC4gU29sdXRpb246IG1ha2Ugc3VyZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgZWFybHkKICAgICBlbm91Z2guIChSZXBvcnRlZCBhbmQgZml4IHN1cHBsaWVkIGJ5IEl2YW4gRCBOZXN0bGVyb2RlIDxuZXN0bGVyQE1JVC5FRFU+LAogICAgIE5pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+IHZpYSBQUiM0NTkpCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFub3RoZXIgZml4IGZvciBTU0x2MiBzZXNzaW9uIElEIGhhbmRsaW5nOiB0aGUgc2Vzc2lvbiBJRCB3YXMgaW5jb3JyZWN0bHkKICAgICBjaGVja2VkIG9uIHJlY29ubmVjdCBvbiB0aGUgY2xpZW50IHNpZGUsIHRoZXJlZm9yZSBzZXNzaW9uIHJlc3VtcHRpb24KICAgICBjb3VsZCBzdGlsbCBmYWlsIHdpdGggYSAic3NsIHNlc3Npb24gaWQgaXMgZGlmZmVyZW50IiBlcnJvci4gVGhpcwogICAgIGJlaGF2aW91ciBpcyBtYXNrZWQgd2hlbiBTU0xfT1BfQUxMIGlzIHVzZWQgZHVlIHRvCiAgICAgU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyBiZWluZyBzZXQuCiAgICAgQmVoYXZpb3VyIG9ic2VydmVkIGJ5IENyaXNwaW4gRmxvd2VyZGF5IDxjcmlzcGluQGZsb3dlcmRheS5jeD4gYXMKICAgICBmb2xsb3d1cCB0byBQUiAjMzc3LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJQS0zMiBhc3NlbWJsZXIgc3VwcG9ydCBlbmhhbmNlbWVudHM6IHVuaWZpZWQgRUxGIHRhcmdldHMsIHN1cHBvcnQKICAgICBmb3IgU0NPL0NhbGRlcmEgcGxhdGZvcm1zLCBmaXggZm9yIEN5Z3dpbiBzaGFyZWQgYnVpbGQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIG9uIHNwYXJjNjQuICBBcyBhIGNvbnNlcXVlbmNlLCBzdXBwb3J0IGZvcgogICAgIEZyZWVCU0Qgb24gbm9uLXg4NiBwcm9jZXNzb3JzIGlzIHNlcGFyYXRlIGZyb20geDg2IHByb2Nlc3NvcnMgb24KICAgICB0aGUgY29uZmlnIHNjcmlwdCwgbXVjaCBsaWtlIHRoZSBOZXRCU0Qgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlICYgS3JpcyBLZW5uYXdheSA8a3Jpc0BvYnNlY3VyaXR5Lm9yZz5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aCBhbmQgMC45LjcgIFszMSBEZWMgMjAwMl0KCiAgW05COiBPcGVuU1NMIDAuOS42aSBhbmQgbGF0ZXIgMC45LjYgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS43Ll0KCiAgKikgRml4IHNlc3Npb24gSUQgaGFuZGxpbmcgaW4gU1NMdjIgY2xpZW50IGNvZGU6IHRoZSBTRVJWRVIgRklOSVNIRUQKICAgICBjb2RlICgwNikgd2FzIHRha2VuIGFzIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUgc2Vzc2lvbiBJRCBhbmQgdGhlIGxhc3QKICAgICBvY3RldCB3YXMgaWdub3JlZCBjb25zZXF1ZW50bHkuIEFzIGEgcmVzdWx0IFNTTHYyIGNsaWVudCBzaWRlIHNlc3Npb24KICAgICBjYWNoaW5nIGNvdWxkIG5vdCBoYXZlIHdvcmtlZCBkdWUgdG8gdGhlIHNlc3Npb24gSUQgbWlzbWF0Y2ggYmV0d2VlbgogICAgIGNsaWVudCBhbmQgc2VydmVyLgogICAgIEJlaGF2aW91ciBvYnNlcnZlZCBieSBDcmlzcGluIEZsb3dlcmRheSA8Y3Jpc3BpbkBmbG93ZXJkYXkuY3g+IGFzCiAgICAgUFIgIzM3Ny4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBkZWNsYXJhdGlvbiBvZiBuZWVkZWQgS2VyYmVyb3MgbGlicmFyaWVzIHRvIHVzZSBFWF9MSUJTCiAgICAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbCAoYW5kIGJhZGx5IHN1cHBvcnRlZCkgTElCS1JCNS4gIExJQktSQjUgaXMKICAgICByZW1vdmVkIGVudGlyZWx5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBod19uY2lwaGVyLmMgZW5naW5lIHJlcXVpcmVzIGR5bmFtaWMgbG9ja3MuICBVbmZvcnR1bmF0ZWx5LCBpdAogICAgIHNlZW1zIHRoYXQgaW4gc3BpdGUgb2YgZXhpc3RpbmcgZm9yIG1vcmUgdGhhbiBhIHllYXIsIG1hbnkgYXBwbGljYXRpb24KICAgICBhdXRob3IgaGF2ZSBkb25lIG5vdGhpbmcgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNhbGxiYWNrcywgd2hpY2gKICAgICBtZWFucyB0aGF0IHRoaXMgcGFydGljdWxhciBlbmdpbmUgd2lsbCBub3Qgd29yayBwcm9wZXJseSBhbnl3aGVyZS4KICAgICBUaGlzIGlzIGEgdmVyeSB1bmZvcnR1bmF0ZSBzaXR1YXRpb24gd2hpY2ggZm9yY2VzIHVzLCBpbiB0aGUgbmFtZQogICAgIG9mIHVzYWJpbGl0eSwgdG8gZ2l2ZSB0aGUgaHdfbmNpcGhlci5jIGEgc3RhdGljIGxvY2ssIHdoaWNoIGlzIHBhcnQKICAgICBvZiBsaWJjcnlwdG8uCiAgICAgTk9URTogVGhpcyBpcyBmb3IgdGhlIDAuOS43IHNlcmllcyBPTkxZLiAgVGhpcyBoYWNrIHdpbGwgbmV2ZXIKICAgICBhcHBlYXIgaW4gMC45Ljggb3IgbGF0ZXIuICBXZSBFWFBFQ1QgYXBwbGljYXRpb24gYXV0aG9ycyB0byBoYXZlCiAgICAgZGVhbHQgcHJvcGVybHkgd2l0aCB0aGlzIHdoZW4gMC45LjggaXMgcmVsZWFzZWQgKHVubGVzcyB3ZSBhY3R1YWxseQogICAgIG1ha2Ugc3VjaCBjaGFuZ2VzIGluIHRoZSBsaWJjcnlwdG8gbG9ja2luZyBjb2RlIHRoYXQgY2hhbmdlcyB3aWxsCiAgICAgaGF2ZSB0byBiZSBtYWRlIGFueXdheSkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gYXNuMV9kMmlfcmVhZF9iaW8oKSByZXBlYXRlZGx5IGNhbGwgQklPX3JlYWQoKSB1bnRpbCBhbGwgY29udGVudAogICAgIG9jdGV0cyBoYXZlIGJlZW4gcmVhZCwgRU9GIG9yIGFuIGVycm9yIG9jY3Vycy4gV2l0aG91dCB0aGlzIGNoYW5nZQogICAgIHNvbWUgdHJ1bmNhdGVkIEFTTjEgc3RydWN0dXJlcyB3aWxsIG5vdCBwcm9kdWNlIGFuIGVycm9yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgSGVpbWRhbCBzdXBwb3J0LCBzaW5jZSBpdCBoYXNuJ3QgYmVlbiBmdWxseSBpbXBsZW1lbnRlZC4KICAgICBTdGlsbCBnaXZlIHRoZSBwb3NzaWJpbGl0eSB0byBmb3JjZSB0aGUgdXNlIG9mIEhlaW1kYWwsIGJ1dCB3aXRoCiAgICAgd2FybmluZ3MgYW5kIGEgcmVxdWVzdCB0aGF0IHBhdGNoZXMgZ2V0IHNlbnQgdG8gb3BlbnNzbC1kZXYuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBWQy1DRSB0YXJnZXQsIGludHJvZHVjZSB0aGUgV0lOQ0Ugc3lzbmFtZSwgYW5kIGFkZAogICAgIElOU1RBTEwuV0NFIGFuZCBhcHByb3ByaWF0ZSBjb25kaXRpb25hbHMgdG8gbWFrZSBpdCBidWlsZC4KICAgICBbU3RldmVuIFJlZGRpZSA8c21yQGVzc2VtZXIuY29tLmF1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgdGhlIERMTCBuYW1lcyBmb3IgQ3lnd2luIHRvIGN5Z2NyeXB0by14Lnkuei5kbGwgYW5kCiAgICAgY3lnc3NsLXgueS56LmRsbCwgd2hlcmUgeCwgeSBhbmQgeiBhcmUgdGhlIG1ham9yLCBtaW5vciBhbmQKICAgICBlZGl0IG51bWJlcnMgb2YgdGhlIHZlcnNpb24uCiAgICAgW0NvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEludHJvZHVjZSBzYWZlIHN0cmluZyBjb3B5IGFuZCBjYXRlbmF0aW9uIGZ1bmN0aW9ucwogICAgIChCVUZfc3RybGNweSgpIGFuZCBCVUZfc3RybGNhdCgpKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpIGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEF2b2lkIHVzaW5nIGZpeGVkLXNpemUgYnVmZmVycyBmb3Igb25lLWxpbmUgRE5zLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCVUZfTUVNX2dyb3dfY2xlYW4oKSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsZWFrYWdlIHdoZW4KICAgICByZXNpemluZyBidWZmZXJzIGNvbnRhaW5pbmcgc2VjcmV0cywgYW5kIHVzZSB3aGVyZSBhcHByb3ByaWF0ZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZCBzaXplIGJ1ZmZlcnMgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbi4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGZvciB2YXJpb3VzIENBIGZpbGVzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFVzZSBzaXplb2YgaW4gcHJlZmVyZW5jZSB0byBtYWdpYyBudW1iZXJzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIGZpbGVuYW1lIHRydW5jYXRpb24gaW4gY2VydCByZXF1ZXN0cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgYXNzZXJ0aW9ucyB0byBjaGVjayBmb3IgKHN1cHBvc2VkbHkgaW1wb3NzaWJsZSkgYnVmZmVyCiAgICAgb3ZlcmZsb3dzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIERvbid0IGNhY2hlIHRydW5jYXRlZCBETlMgZW50cmllcyBpbiB0aGUgbG9jYWwgY2FjaGUgKHRoaXMgY291bGQKICAgICBwb3RlbnRpYWxseSBsZWFkIHRvIGEgc3Bvb2ZpbmcgYXR0YWNrKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggdmFyaW91cyBidWZmZXJzIHRvIGJlIGxhcmdlIGVub3VnaCBmb3IgaGV4L2RlY2ltYWwKICAgICByZXByZXNlbnRhdGlvbnMgaW4gYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYW5uZXIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIENSWVBUT19yZWFsbG9jX2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIEJJT19pbmRlbnQoKSB0byBhdm9pZCBtdWNoIHNsaWdodGx5IHdvcnJ5aW5nIGNvZGUgdG8gZG8KICAgICBpbmRlbnRzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENvbnZlcnQgc3ByaW50ZigpL0JJT19wdXRzKCkgdG8gQklPX3ByaW50ZigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIGJ1ZmZlcl9nZXRzKCkgY291bGQgdGVybWluYXRlIHdpdGggdGhlIGJ1ZmZlciBvbmx5IGhhbGYKICAgICBmdWxsLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgYXNzZXJ0aW9ucyB0byBwcmV2ZW50IHVzZXItc3VwcGxpZWQgY3J5cHRvIGZ1bmN0aW9ucyBmcm9tCiAgICAgb3ZlcmZsb3dpbmcgaW50ZXJuYWwgYnVmZmVycyBieSBoYXZpbmcgbGFyZ2UgYmxvY2sgc2l6ZXMsIGV0Yy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBOZXcgT1BFTlNTTF9hc3NlcnQoKSBtYWNybyAoc2ltaWxhciB0byBhc3NlcnQoKSwgYnV0IGVuYWJsZWQKICAgICB1bmNvbmRpdGlvbmFsbHkpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgY29weSBvZiBrZXkgaW4gUkM0LgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIGJ1ZmZlcnMgZm9yIElWIGluIHBlbS5oLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEZpeCBvZmYtYnktb25lIGVycm9yIGluIEVHRCBwYXRoLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIElmIFJBTkRGSUxFIHBhdGggaXMgdG9vIGxvbmcsIGlnbm9yZSBpbnN0ZWFkIG9mIHRydW5jYXRpbmcuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgaW5jb3JyZWN0bHkgc2l6ZWQgWC41MDkgc3RydWN0dXJlCiAgICAgQ0JDUGFyYW1ldGVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBmdW5jdGlvbiBrbnVtYmVyKCkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgZGFuZ2Vyb3VzIHN0cnVjdHVyZSwgS1NTTF9FUlIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgUHJvdGVjdCBhZ2FpbnN0IG92ZXJsb25nIHNlc3Npb24gSUQgY29udGV4dCBsZW5ndGggaW4gYW4gZW5jb2RlZAogICAgIHNlc3Npb24gb2JqZWN0LiBTaW5jZSB0aGVzZSBhcmUgbG9jYWwsIHRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlCiAgICAgZXhwbG9pdGFibGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ2hhbmdlIGZyb20gc2VjdXJpdHkgcGF0Y2ggKHNlZSAwLjkuNmUgYmVsb3cpIHRoYXQgZGlkIG5vdCBhZmZlY3QKICAgICB0aGUgMC45LjYgcmVsZWFzZSBzZXJpZXM6CgogICAgIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMyBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBtYXN0ZXIga2V5IGluIEtlcmJlcm9zLWVuYWJsZWQgdmVyc2lvbnMuCiAgICAgKENWRS0yMDAyLTA2NTcpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ2hhbmdlIHRoZSBTU0wga2VyYjUgY29kZXMgdG8gbWF0Y2ggUkZDIDI3MTIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSAtbmFtZW9wdCB3b3JrIGZ1bGx5IGZvciByZXEgYW5kIGFkZCAtcmVxb3B0IHN3aXRjaC4KICAgICBbTWljaGFlbCBCZWxsIDxtaWNoYWVsLmJlbGxAcnouaHUtYmVybGluLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBUaGUgImJsb2NrIHNpemUiIGZvciBibG9jayBjaXBoZXJzIGluIENGQiBhbmQgT0ZCIG1vZGUgc2hvdWxkIGJlIDEuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgWW5ndmUgTnlzYWV0ZXIgUGV0dGVyc2VuIDx5bmd2ZUBvcGVyYS5jb20+XQoKICAqKSBNYWtlIHN1cmUgdGVzdHMgY2FuIGJlIHBlcmZvcm1lZCBldmVuIGlmIHRoZSBjb3JyZXNwb25kaW5nIGFsZ29yaXRobXMKICAgICBoYXZlIGJlZW4gcmVtb3ZlZCBlbnRpcmVseS4gIFRoaXMgd2FzIGFsc28gdGhlIGxhc3Qgc3RlcCB0byBtYWtlCiAgICAgT3BlblNTTCBjb21waWxhYmxlIHdpdGggREpHUFAgdW5kZXIgYWxsIHJlYXNvbmFibGUgY29uZGl0aW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBEb3VnIEthdWZtYW4gPGRrYXVmbWFuQHJhaHVsLm5ldD5dCgogICopIEFkZCBjaXBoZXIgc2VsZWN0aW9uIHJ1bGVzIENPTVBMRU1FTlRPRkFMTCBhbmQgQ09NUExFTUVOVE9GREVGQVVMVAogICAgIHRvIGFsbG93IHZlcnNpb24gaW5kZXBlbmRlbnQgZGlzYWJsaW5nIG9mIG5vcm1hbGx5IHVuc2VsZWN0ZWQgY2lwaGVycywKICAgICB3aGljaCBtYXkgYmUgYWN0aXZhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygc2VsZWN0aW5nIGEgc2luZ2xlIGNpcGhlci4KCiAgICAgKEUuZy4sIGNpcGhlciBsaXN0IHN0cmluZyAiUlNBIiBlbmFibGVzIGNpcGhlcnN1aXRlcyB0aGF0IGFyZSBsZWZ0CiAgICAgb3V0IG9mICJBTEwiIGJlY2F1c2UgdGhleSBkbyBub3QgcHJvdmlkZSBzeW1tZXRyaWMgZW5jcnlwdGlvbi4KICAgICAiUlNBOiFDT01QTEVNRU1FTlRPRkFMTCIgYXZvaWRzIHRoZXNlIHVuc2FmZSBjaXBoZXJzdWl0ZXMuKQogICAgIFtMdXR6IEphZW5pY2tlLCBCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhcHByb3ByaWF0ZSBzdXBwb3J0IGZvciBzZXBhcmF0ZSBwbGF0Zm9ybS1kZXBlbmRlbnQgYnVpbGQKICAgICBkaXJlY3Rvcmllcy4gIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gbWFrZSBhIHBsYXRmb3JtLWRlcGVuZGVudAogICAgIGJ1aWxkIGRpcmVjdG9yeSBpcyB0aGUgZm9sbG93aW5nICh0ZXN0ZWQgb24gTGludXgpLCBtYXliZSB3aXRoCiAgICAgc29tZSBsb2NhbCB0d2Vha3M6CgoJIyBQbGFjZSB5b3Vyc2VsZiBvdXRzaWRlIG9mIHRoZSBPcGVuU1NMIHNvdXJjZSB0cmVlLiAgSW4KCSMgdGhpcyBleGFtcGxlLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgT1BFTlNTTF9TT1VSQ0UKCSMgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBhYnNvbHV0ZSBPcGVuU1NMIHNvdXJjZSBkaXJlY3RvcnkuCglta2RpciAtcCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCWNkIG9ianRyZWUvImB1bmFtZSAtc2AtYHVuYW1lIC1yYC1gdW5hbWUgLW1gIgoJKGNkICRPUEVOU1NMX1NPVVJDRTsgZmluZCAuIC10eXBlIGYpIHwgd2hpbGUgcmVhZCBGOyBkbwoJCW1rZGlyIC1wIGBkaXJuYW1lICRGYAoJCWxuIC1zICRPUEVOU1NMX1NPVVJDRS8kRiAkRgoJZG9uZQoKICAgICBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUgbm90IHRvIGRpc3R1cmIgdGhlIHNvdXJjZSB0cmVlLCBhICJtYWtlIGNsZWFuIgogICAgIGlzIGEgZ29vZCB0aGluZy4gIElmIGl0IGlzbid0IHN1Y2Nlc3NmdWxsLCBkb24ndCB3b3JyeSBhYm91dCBpdCwKICAgICBpdCBwcm9iYWJseSBtZWFucyB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB2ZXJ5IGNsZWFuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2Ugc3VyZSBhbnkgRU5HSU5FIGNvbnRyb2wgY29tbWFuZHMgbWFrZSBsb2NhbCBjb3BpZXMgb2Ygc3RyaW5nCiAgICAgcG9pbnRlcnMgcGFzc2VkIHRvIHRoZW0gd2hlbmV2ZXIgbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgaXMgcG9zc2libGUKICAgICB0aGUgY2FsbGVyIG1heSBoYXZlIG92ZXJ3cml0dGVuIChvciBkZWFsbG9jYXRlZCkgdGhlIG9yaWdpbmFsIHN0cmluZwogICAgIGRhdGEgd2hlbiBhIGxhdGVyIEVOR0lORSBvcGVyYXRpb24gdHJpZXMgdG8gdXNlIHRoZSBzdG9yZWQgdmFsdWVzLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbmViZWxsQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgSW1wcm92ZSBkaWFnbm9zdGljcyBpbiBmaWxlIHJlYWRpbmcgYW5kIGNvbW1hbmQtbGluZSBkaWdlc3RzLgogICAgIFtCZW4gTGF1cmllIGFpZGVkIGFuZCBhYmV0dGVkIGJ5IFNvbGFyIERlc2lnbmVyIDxzb2xhckBvcGVud2FsbC5jb20+XQoKICAqKSBBZGQgQUVTIG1vZGVzIENGQiBhbmQgT0ZCIHRvIHRoZSBvYmplY3QgZGF0YWJhc2UuICBDb3JyZWN0IGFuCiAgICAgZXJyb3IgaW4gQUVTLUNGQiBkZWNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJlbW92ZSBtb3N0IGNhbGxzIHRvIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKSBpbiBldnBfZW5jLmMsIHRoaXMgCiAgICAgYWxsb3dzIGV4aXN0aW5nIEVWUF9DSVBIRVJfQ1RYIHN0cnVjdHVyZXMgdG8gYmUgcmV1c2VkIGFmdGVyCiAgICAgY2FsbGluZyBFVlBfKkZpbmFsKCkuIFRoaXMgYmVoYXZpb3VyIGlzIHVzZWQgYnkgZW5jcnlwdGlvbgogICAgIEJJT3MgYW5kIHNvbWUgYXBwbGljYXRpb25zLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdAogICAgIGFwcGxpY2F0aW9ucyBtdXN0IGV4cGxpY2l0bHkgY2xlYW4gdXAgY2lwaGVyIGNvbnRleHRzIHdpdGgKICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgb3IgdGhleSB3aWxsIGxlYWsgbWVtb3J5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoZWNrIHRoZSB2YWx1ZXMgb2YgZG5hIGFuZCBkbmIgaW4gYm5fbXVsX3JlY3Vyc2l2ZSBiZWZvcmUgY2FsbGluZwogICAgIGJuX211bF9jb21iYSAoYSBub24gemVybyB2YWx1ZSBtZWFucyB0aGUgYSBvciBiIGFycmF5cyBkbyBub3QgY29udGFpbgogICAgIG4yIGVsZW1lbnRzKSBhbmQgZmFsbGJhY2sgdG8gYm5fbXVsX25vcm1hbCBpZiBlaXRoZXIgaXMgbm90IHplcm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGVzY2FwaW5nIG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHdoZW4gdXNpbmcgdGhlIC1zdWJqIG9wdGlvbgogICAgIG9mIHRoZSAib3BlbnNzbCByZXEiIGNvbW1hbmQgbGluZSB0b29sLiAoUm9iZXJ0IEpvb3AgPGpvb3BAZm9rdXMuZ21kLmRlPikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBvYmplY3QgZGVmaW5pdGlvbnMgY29tcGxpYW50IHRvIExEQVAgKFJGQzIyNTYpOiBTTiBpcyB0aGUgc2hvcnQKICAgICBmb3JtIGZvciAic3VybmFtZSIsIHNlcmlhbE51bWJlciBoYXMgbm8gc2hvcnQgZm9ybS4KICAgICBVc2UgIm1haWwiIGFzIHRoZSBzaG9ydCBuYW1lIGZvciAicmZjODIyTWFpbGJveCIgYWNjb3JkaW5nIHRvIFJGQzI3OTg7CiAgICAgdGhlcmVmb3JlIHJlbW92ZSAibWFpbCIgc2hvcnQgbmFtZSBmb3IgImludGVybmV0IDciLgogICAgIFRoZSBPSUQgZm9yIHVuaXF1ZSBpZGVudGlmaWVycyBpbiBYNTA5IGNlcnRpZmljYXRlcyBpcwogICAgIHg1MDBVbmlxdWVJZGVudGlmaWVyLCBub3QgdW5pcXVlSWRlbnRpZmllci4KICAgICBTb21lIG1vcmUgT0lEIGFkZGl0aW9ucy4gKE1pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbiAiaW5pdCIgY29tbWFuZCB0byB0aGUgRU5HSU5FIGNvbmZpZyBtb2R1bGUgYW5kIGF1dG8gaW5pdGlhbGl6ZQogICAgIEVOR0lORXMuIFdpdGhvdXQgYW55ICJpbml0IiBjb21tYW5kIHRoZSBFTkdJTkUgd2lsbCBiZSBpbml0aWFsaXplZCAKICAgICBhZnRlciBhbGwgY3RybCBjb21tYW5kcyBoYXZlIGJlZW4gZXhlY3V0ZWQgb24gaXQuIElmIGluaXQ9MSB0aGUgCiAgICAgRU5HSU5FIGlzIGluaXRhaWxpemVkIGF0IHRoYXQgcG9pbnQgKGN0cmxzIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBydW4KICAgICBvbiB0aGUgdW5pbml0aWFsaXplZCBFTkdJTkUgYW5kIGFmdGVyIG9uIHRoZSBpbml0aWFsaXplZCBvbmUpLiBJZgogICAgIGluaXQ9MCB0aGVuIHRoZSBFTkdJTkUgd2lsbCBub3QgYmUgaW5pYXRpYWxpemVkIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlICdhcHBfdmVyaWZ5X2NhbGxiYWNrJyBpbnRlcmZhY2Ugc28gdGhhdCB0aGUgdXNlci1kZWZpbmVkCiAgICAgYXJndW1lbnQgaXMgYWN0dWFsbHkgcGFzc2VkIHRvIHRoZSBjYWxsYmFjazogSW4gdGhlCiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soKSBwcm90b3R5cGUsIHRoZSBjYWxsYmFjawogICAgIGRlY2xhcmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQogICAgICAgICAgaW50ICgqY2IpKCkKICAgICBpbnRvCiAgICAgICAgICBpbnQgKCpjYikoWDUwOV9TVE9SRV9DVFggKix2b2lkICopOwogICAgIGluIHNzbF92ZXJpZnlfY2VydF9jaGFpbiAoc3NsL3NzbF9jZXJ0LmMpLCB0aGUgY2FsbAogICAgICAgICAgaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCkKICAgICBoYXMgYmVlbiBjaGFuZ2VkIGludG8KICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgsIHMtPmN0eC0+YXBwX3ZlcmlmeV9hcmcpLgoKICAgICBUbyB1cGRhdGUgYXBwbGljYXRpb25zIHVzaW5nIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCksCiAgICAgYSBkdW1teSBhcmd1bWVudCBjYW4gYmUgYWRkZWQgdG8gdGhlaXIgY2FsbGJhY2sgZnVuY3Rpb25zLgogICAgIFtELiBLLiBTbWV0dGVycyA8c21ldHRlcnNAcGFyYy54ZXJveC5jb20+XQoKICAqKSBBZGRlZCB0aGUgJzQ3NThjY2EnIEVOR0lORSB0byBzdXBwb3J0IElCTSA0NzU4IGNhcmRzLgogICAgIFtNYXVyaWNlIEdpdHRlbnMgPG1hdXJpY2VAZ2l0dGVucy5ubD4sIHRvdWNodXBzIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGFuZCBPUEVOU1NMX0xPQURfQ09ORiBkZWZpbmUgd2hpY2ggd2lsbCBjYXVzZQogICAgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgdG8gbG9hZCB0aGUgb3BlbnNzbC5jbmYgY29uZmlnIGZpbGUuCiAgICAgVGhpcyBhbGxvd3Mgb2xkZXIgYXBwbGljYXRpb25zIHRvIHRyYW5zcGFyZW50bHkgc3VwcG9ydCBjZXJ0YWluCiAgICAgT3BlblNTTCBmZWF0dXJlczogc3VjaCBhcyBjcnlwdG8gYWNjZWxlcmF0aW9uIGFuZCBkeW5hbWljIEVOR0lORSBsb2FkaW5nLgogICAgIFR3byBuZXcgZnVuY3Rpb25zIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZigpIHdoaWNoIHdpbGwgbmV2ZXIKICAgICBsb2FkIHRoZSBjb25maWcgZmlsZSBhbmQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZigpIHdoaWNoIHdpbGwKICAgICBhbHdheXMgbG9hZCBpdCBoYXZlIGFsc28gYmVlbiBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIE9GQiwgQ0ZCIGFuZCBDVFIgKGFsbCB3aXRoIDEyOCBiaXQgZmVlZGJhY2spIHRvIEFFUy4KICAgICBBZGp1c3QgTklEcyBhbmQgRVZQIGxheWVyLgogICAgIFtTdGVwaGVuIFNwcnVuayA8c3RlcGhlbkBzcHJ1bmsub3JnPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25maWcgbW9kdWxlcyBzdXBwb3J0IGluIG9wZW5zc2wgdXRpbGl0eS4KCiAgICAgTW9zdCBjb21tYW5kcyBub3cgbG9hZCBtb2R1bGVzIGZyb20gdGhlIGNvbmZpZyBmaWxlLAogICAgIHRob3VnaCBpbiBhIGZldyAoc3VjaCBhcyB2ZXJzaW9uKSB0aGlzIGlzbid0IGRvbmUgCiAgICAgYmVjYXVzZSBpdCBjb3VsZG4ndCBiZSB1c2VkIGZvciBhbnl0aGluZy4KCiAgICAgSW4gdGhlIGNhc2Ugb2YgY2EgYW5kIHJlcSB0aGUgY29uZmlnIGZpbGUgdXNlZCBpcwogICAgIHRoZSBzYW1lIGFzIHRoZSB1dGlsaXR5IGl0c2VsZjogdGhhdCBpcyB0aGUgLWNvbmZpZwogICAgIGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbgogICAgIGFsdGVybmF0aXZlIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBkZWZhdWx0IGJlaGF2aW91ciBmcm9tIE9QRU5TU0xfY29uZmlnKCkuIElmIGFwcG5hbWUgaXMgTlVMTAogICAgIHVzZSAib3BlbnNzbF9jb25mIiBpZiBmaWxlbmFtZSBpcyBOVUxMIHVzZSBkZWZhdWx0IG9wZW5zc2wgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFuIGFyZ3VtZW50IHRvIE9QRU5TU0xfY29uZmlnKCkgdG8gYWxsb3cgdGhlIHVzZSBvZiBhbiBhbHRlcm5hdGl2ZQogICAgIGNvbmZpZyBzZWN0aW9uIG5hbWUuIEFkZCBhIG5ldyBmbGFnIHRvIHRvbGVyYXRlIGEgbWlzc2luZyBjb25maWcgZmlsZQogICAgIGFuZCBtb3ZlIGNvZGUgdG8gQ09ORl9tb2R1bGVzX2xvYWRfZmlsZSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkIEVuY3J5cHRpb24KICAgICBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgVGhlIHN1cHBvcnQgd2FzIGNvcGllZCBmcm9tIDAuOS42YyBbZW5naW5lXSBhbmQgYWRhcHRlZC9jb3JyZWN0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtBRVAgSW5jLiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBCYWx0aW1vcmUKICAgICBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIENISUwgZW5naW5lIGZvcmstc2FmZSAoYXMgZGVmaW5lZCBieSBuQ2lwaGVyKSBhbmQgYWN0dWFsbHkKICAgICBtYWtlIHRoZSBuZXdlciBFTkdJTkUgZnJhbWV3b3JrIGNvbW1hbmRzIGZvciB0aGUgQ0hJTCBlbmdpbmUgd29yay4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcHJvZHVjZSBzaGFyZWQgbGlicmFyaWVzIG9uIFJlbGlhbnRVTklYLgogICAgIFtSb2JlcnQgRGFobGVtIDxSb2JlcnQuRGFobGVtQGZmbTIuc2llbWVucy5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBkZWJ1Zy1saW51eC1wcHJvLgogICAgIE1ha2UgJ29wZW5zc2wgcnNhJyB1c2UgdGhlIGdlbmVyYWwga2V5IGxvYWRpbmcgcm91dGluZXMKICAgICBpbXBsZW1lbnRlZCBpbiBhcHBzLmMsIGFuZCBtYWtlIHRob3NlIHJvdXRpbmVzIGFibGUgdG8KICAgICBoYW5kbGUgdGhlIGtleSBmb3JtYXQgRk9STUFUX05FVFNDQVBFIGFuZCB0aGUgdmFyaWFudAogICAgIEZPUk1BVF9JSVNTR0MuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICopIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAta2V5Zm9ybSB0byByc2F1dGwsIGFuZCBkb2N1bWVudCAtZW5naW5lLgogICAgIFtSaWNoYXJkIExldml0dGUsIGluc3BpcmVkIGJ5IFRvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPl0KCiAgKikgQ2hhbmdlIEJJT19uZXdfZmlsZSAoY3J5cHRvL2Jpby9ic3NfZmlsZS5jKSB0byB1c2UgbmV3CiAgICAgQklPX1JfTk9fU1VDSF9GSUxFIGVycm9yIGNvZGUgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMKICAgICBFUlJfUl9TWVNfTElCIGVycm9yIGNvZGUgaWYgZm9wZW4oKSBmYWlscyB3aXRoIEVOT0VOVC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbnMKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3IKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEuCiAgICAgVGhlc2UgYXJlIHNpbWlsYXIgdG8KICAgICAgICAgIEVSUl9wZWVrX2Vycm9yCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEsCiAgICAgYnV0IHJlcG9ydCBvbiB0aGUgbGF0ZXN0IGVycm9yIHJlY29yZGVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUKICAgICBzdGlsbCBpbiB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JlbiBMYXVyaWUsIEJvZG8gTW9lbGxlcl0KICAgICAgICAKICAqKSBkZWZhdWx0X2FsZ29yaXRobXMgb3B0aW9uIGluIEVOR0lORSBjb25maWcgbW9kdWxlLiBUaGlzIGFsbG93cyB0aGluZ3MKICAgICBsaWtlOgogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IEFMTAogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IFJTQSwgRFNBLCBSQU5ELCBDSVBIRVJTLCBESUdFU1RTCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbG1pbmFyeSBFTkdJTkUgY29uZmlnIG1vZHVsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXhwZXJpbWVudGFsIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEFFUyBjb2RlIHRvIGZvbGxvdyB0aGUgc2FtZSBuYW1lIHN0cnVjdHVyZSBhcyBhbGwgb3RoZXIKICAgICBzeW1tZXRyaWMgY2lwaGVycywgYW5kIGJlaGF2ZSB0aGUgc2FtZSB3YXkuICBNb3ZlIGV2ZXJ5dGhpbmcgdG8KICAgICB0aGUgZGlyZWN0b3J5IGNyeXB0by9hZXMsIHRoZXJlYnkgb2Jzb2xldGluZyBjcnlwdG8vcmlqbmRhZWwuCiAgICAgW1N0ZXBoZW4gU3BydW5rIDxzdGVwaGVuQHNwcnVuay5vcmc+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFNFQ1VSSVRZOiByZW1vdmUgdW5zYWZlIHNldGptcC9zaWduYWwgaW50ZXJhY3Rpb24gZnJvbSB1aV9vcGVuc3NsLmMuCiAgICAgW0JlbiBMYXVyaWUgYW5kIFRoZW8gZGUgUmFhZHRdCgogICopIEFkZCBvcHRpb24gdG8gb3V0cHV0IHB1YmxpYyBrZXlzIGluIHJlcSBjb21tYW5kLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIFVzZSB3TkFGcyBpbiBFQ19QT0lOVHNfbXVsKCkgZm9yIGltcHJvdmVkIGVmZmljaWVuY3kKICAgICAodXAgdG8gYWJvdXQgMTAlIGJldHRlciB0aGFuIGJlZm9yZSBmb3IgUC0xOTIgYW5kIFAtMjI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zL21hY3JvcwoKICAgICAgICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhjdHgsIGNiKQogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjdHgsIGFyZykKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrKHNzbCwgY2IpCiAgICAgICAgICBTU0xfc2V0X21zZ19jYWxsYmFja19hcmcoc3NsLCBhcmcpCgogICAgIHRvIHJlcXVlc3QgY2FsbGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uCgogICAgICAgICAgdm9pZCBjYihpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykKCiAgICAgd2hlbmV2ZXIgYSBwcm90b2NvbCBtZXNzYWdlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICAod3JpdGVfcCA9PSAwKSBvciBzZW50ICh3cml0ZV9wID09IDEpLiAgSGVyZSAndmVyc2lvbicgaXMgdGhlCiAgICAgcHJvdG9jb2wgdmVyc2lvbiAgYWNjb3JkaW5nIHRvIHdoaWNoIHRoZSBTU0wgbGlicmFyeSBpbnRlcnByZXRzCiAgICAgdGhlIGN1cnJlbnQgcHJvdG9jb2wgbWVzc2FnZSAoU1NMMl9WRVJTSU9OLCBTU0wzX1ZFUlNJT04sIG9yCiAgICAgVExTMV9WRVJTSU9OKS4gICdjb250ZW50X3R5cGUnIGlzIDAgaW4gdGhlIGNhc2Ugb2YgU1NMIDIuMCwgb3IKICAgICB0aGUgY29udGVudCB0eXBlIGFzIGRlZmluZWQgaW4gdGhlIFNTTCAzLjAvVExTIDEuMCBwcm90b2NvbAogICAgIHNwZWNpZmljYXRpb24gKGNoYW5nZV9jaXBoZXJfc3BlYygyMCksIGFsZXJ0KDIxKSwgaGFuZHNoYWtlKDIyKSkuCiAgICAgJ2J1ZicgYW5kICdsZW4nIHBvaW50IHRvIHRoZSBhY3R1YWwgbWVzc2FnZSwgJ3NzbCcgdG8gdGhlCiAgICAgU1NMIG9iamVjdCwgYW5kICdhcmcnIGlzIHRoZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHZhbHVlIHNldCBieQogICAgIFNTTFtfQ1RYXV9zZXRfbXNnX2NhbGxiYWNrX2FyZygpLgoKICAgICAnb3BlbnNzbCBzX2NsaWVudCcgYW5kICdvcGVuc3NsIHNfc2VydmVyJyBoYXZlIG5ldyAnLW1zZycgb3B0aW9ucwogICAgIHRvIGVuYWJsZSBhIGNhbGxiYWNrIHRoYXQgZGlzcGxheXMgYWxsIHByb3RvY29sIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBzbyBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdCBhcwogICAgIHNvb24gYXMgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIGxpYnJhcnkgaXMgZmluaXNoZWQsIGFuZCB0aGVyZWJ5IGdldAogICAgIG9wZW5zc2wgYW5kIHRoZSB0ZXN0IHByb2dyYW1zIGxpbmtlZCBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4KICAgICBUaGlzIHN0aWxsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBrZXl3b3JkICJzaGFyZCIgaGFzIGJlZW4gZ2l2ZW4gdG8KICAgICB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHRzLgoKICAgICBOT1RFOiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGlzIHN0aWxsIGFuIGV4cGVyaW1lbnRhbCB0aGluZywgYW5kCiAgICAgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgc3RpbGwgbm90IGd1YXJhbnRlZWQuCiAgICAgWyJNYWNpZWogVy4gUm96eWNraSIgPG1hY3JvQGRzMi5wZy5nZGEucGw+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBTdWJqZWN0IEluZm9ybWF0aW9uIEFjY2VzcyBleHRlbnNpb24uCiAgICAgW1BldGVyIFN5bHZlc3RlciA8UGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnI+XQoKICAqKSBNYWtlIEJVRl9NRU1fZ3JvdygpIGJlaGF2aW91ciBtb3JlIGNvbnNpc3RlbnQ6IEluaXRpYWxpc2UgdG8gemVybwogICAgIGFkZGl0aW9uYWwgYnl0ZXMgd2hlbiBuZXcgbWVtb3J5IGhhZCB0byBiZSBhbGxvY2F0ZWQsIG5vdCBqdXN0CiAgICAgd2hlbiByZXVzaW5nIGFuIGV4aXN0aW5nIGJ1ZmZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgY29tbWFuZCBsaW5lIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbiAndXRmOCcgZm9yIHRoZSByZXEgY29tbWFuZC4KICAgICBUaGlzIGFsbG93cyBmaWVsZCB2YWx1ZXMgdG8gYmUgc3BlY2lmaWVkIGFzIFVURjggc3RyaW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLW11bHRpIGFuZCAtbXIgb3B0aW9ucyB0byAib3BlbnNzbCBzcGVlZCIgLSBnaXZpbmcgbXVsdGlwbGUgcGFyYWxsZWwKICAgICBydW5zIGZvciB0aGUgZm9ybWVyIGFuZCBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIGxhdHRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkICctbm9lbWFpbEROJyBvcHRpb24gdG8gJ29wZW5zc2wgY2EnLiAgVGhpcyBwcmV2ZW50cyBpbmNsdXNpb24KICAgICBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIEROIChpLmUuLCBpdCB3aWxsIGdvIGludG8gYSBjZXJ0aWZpY2F0ZQogICAgIGV4dGVuc2lvbiBvbmx5KS4gIFRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiAnZW1haWxfaW5fZG4gPSBubycKICAgICBoYXMgdGhlIHNhbWUgZWZmZWN0LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIENoYW5nZSBhbGwgZnVuY3Rpb25zIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCBkZXNfIHRvIGJlIHN0YXJ0aW5nCiAgICAgd2l0aCBERVNfIGluc3RlYWQuICBBZGQgd3JhcHBlcnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGxpYmRlcywKICAgICBidXQgYXJlIG5hbWVkIF9vc3NsX29sZF9kZXNfKi4gIEZpbmFsbHksIGFkZCBtYWNyb3MgdGhhdCBtYXAgdGhlCiAgICAgZGVzXyogc3ltYm9scyB0byB0aGUgY29ycmVzcG9uZGluZyBfb3NzbF9vbGRfZGVzXyogaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgSWYgT3BlblNTTCAwLjkuNmMgY29tcGF0aWJpbGl0eSBpcwogICAgIGRlc2lyZWQsIHRoZSBkZXNfKiBzeW1ib2xzIHdpbGwgYmUgbWFwcGVkIHRvIERFU18qLCB3aXRoIG9uZQogICAgIGV4Y2VwdGlvbi4KCiAgICAgU2luY2Ugd2UgcHJvdmlkZSB0d28gY29tcGF0aWJpbGl0eSBtYXBwaW5ncywgdGhlIHVzZXIgbmVlZHMgdG8KICAgICBkZWZpbmUgdGhlIG1hY3JvIE9QRU5TU0xfREVTX0xJQkRFU19DT01QQVRJQklMSVRZIGlmIGxpYmRlcwogICAgIGNvbXBhdGliaWxpdHkgaXMgZGVzaXJlZC4gIFRoZSBkZWZhdWx0IChpLmUuLCB3aGVuIHRoYXQgbWFjcm8KICAgICBpc24ndCBkZWZpbmVkKSBpcyBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5LgoKICAgICBUaGVyZSBhcmUgYWxzbyBtYWNyb3MgdGhhdCBlbmFibGUgYW5kIGRpc2FibGUgdGhlIHN1cHBvcnQgb2Ygb2xkCiAgICAgZGVzIGZ1bmN0aW9ucyBhbHRvZ2V0aGVyLiAgVGhvc2UgYXJlIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAogICAgIGFuZCBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JULiAgSWYgbm9uZSBvciBib3RoIG9mIHRob3NlCiAgICAgYXJlIGRlZmluZWQsIHRoZSBkZWZhdWx0IHdpbGwgYXBwbHk6IHRvIHN1cHBvcnQgdGhlIG9sZCBkZXMgcm91dGluZXMuCgogICAgIEluIGVpdGhlciBjYXNlLCBvbmUgbXVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzLmggdG8gZ2V0IHRoZSBjb3JyZWN0CiAgICAgZGVmaW5pdGlvbnMuICBEbyBub3QgdHJ5IHRvIGp1c3QgaW5jbHVkZSBvcGVuc3NsL2Rlc19vbGQuaCwgdGhhdAogICAgIHdvbid0IHdvcmsuCgogICAgIE5PVEU6IFRoaXMgaXMgYSBtYWpvciBicmVhayBvZiBhbiBvbGQgQVBJIGludG8gYSBuZXcgb25lLiAgU29mdHdhcmUKICAgICBhdXRob3JzIGFyZSBlbmNvdXJhZ2VkIHRvIHN3aXRjaCB0byB0aGUgREVTXyBzdHlsZSBmdW5jdGlvbnMuICBTb21lCiAgICAgdGltZSBpbiB0aGUgZnV0dXJlLCBkZXNfb2xkLmggYW5kIHRoZSBsaWJkZXMgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGRpc2FibGUgKGkuZS4gT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVCB3aWxsIGJlIHRoZQogICAgIGRlZmF1bHQpLCBhbmQgdGhlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGVzdCBmb3IgY2VydGlmaWNhdGVzIHdoaWNoIGNvbnRhaW4gdW5zdXBwb3J0ZWQgY3JpdGljYWwgZXh0ZW5zaW9ucy4KICAgICBJZiBzdWNoIGEgY2VydGlmaWNhdGUgaXMgZm91bmQgZHVyaW5nIGEgdmVyaWZ5IG9wZXJhdGlvbiBpdCBpcyAKICAgICByZWplY3RlZCBieSBkZWZhdWx0OiB0aGlzIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBlaXRoZXIKICAgICBoYW5kbGluZyB0aGUgbmV3IGVycm9yIFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0VYVEVOU0lPTiBvcgogICAgIGJ5IHNldHRpbmcgdGhlIHZlcmlmeSBmbGFnIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTC4gQSBuZXcgZnVuY3Rpb24KICAgICBYNTA5X3N1cHBvcnRlZF9leHRlbnNpb24oKSBoYXMgYWxzbyBiZWVuIGFkZGVkIHdoaWNoIHJldHVybnMgMSBpZiBhCiAgICAgcGFydGljdWxhciBleHRlbnNpb24gaXMgc3VwcG9ydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIEVWUCBjaXBoZXIgZnVuY3Rpb25zIGluIHNpbWlsYXIgd2F5IHRvIGRpZ2VzdHMKICAgICB0byByZXRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQX0RpZ2VzdEluaXQoKSBhbmQgRVZQX0RpZ2VzdEZpbmFsKCkgdG8gcmV0YWluCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuIEluIHBhcnRpY3VsYXIgdGhlICdjdHgnIHBhcmFtZXRlciBkb2VzCiAgICAgbm90IGhhdmUgdG8gYmUgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBjYWxsIHRvIEVWUF9EaWdlc3RJbml0KCkgYW5kCiAgICAgaXQgaXMgdGlkaWVkIHVwIGFmdGVyIGEgY2FsbCB0byBFVlBfRGlnZXN0RmluYWwoKS4gTmV3IGZ1bmN0aW9uCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgd2hpY2ggZG9lcyBub3QgdGlkeSB1cCB0aGUgY3R4LiBTaW1pbGFybHkgZnVuY3Rpb24KICAgICBFVlBfTURfQ1RYX2NvcHkoKSBjaGFuZ2VkIHRvIG5vdCByZXF1aXJlIHRoZSBkZXN0aW5hdGlvbiB0byBiZQogICAgIGluaXRpYWxpemVkIHZhbGlkIGFuZCBuZXcgZnVuY3Rpb24gRVZQX01EX0NUWF9jb3B5X2V4KCkgYWRkZWQgd2hpY2gKICAgICByZXF1aXJlcyB0aGUgZGVzdGluYXRpb24gdG8gYmUgdmFsaWQuCgogICAgIE1vZGlmeSBhbGwgdGhlIE9wZW5TU0wgZGlnZXN0IGNhbGxzIHRvIHVzZSBFVlBfRGlnZXN0SW5pdF9leCgpLAogICAgIEVWUF9EaWdlc3RGaW5hbF9leCgpIGFuZCBFVlBfTURfQ1RYX2NvcHlfZXgoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2Ugc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgYW5kIHRoZSBmdW5jdGlvbnMgdXNpbmcgaXQKICAgICBzbyB0aGF0IGNvbXBsZXRlICdIYW5kc2hha2UnIHByb3RvY29sIHN0cnVjdHVyZXMgYXJlIGtlcHQgaW4gbWVtb3J5CiAgICAgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyAnbXNnX3R5cGUnIGFuZCAnbGVuZ3RoJyB3aXRoICdib2R5JyBkYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIGZvciBXaW4zMi4KICAgICBbTWFzc2ltbyBTYW50aW4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFqb3IgcmVzdHJ1Y3R1cmluZyB0byB0aGUgdW5kZXJseWluZyBFTkdJTkUgY29kZS4gVGhpcyBpbmNsdWRlcwogICAgIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQsIHNlcGFyYXRpb24gb2YgcHVyZSAiRU5HSU5FIiBtYW5pcHVsYXRpb24KICAgICAoaW5pdGlhbGlzYXRpb24sIGV0YykgZnJvbSBmdW5jdGlvbmFsaXR5IGRlYWxpbmcgd2l0aCBpbXBsZW1lbnRhdGlvbnMKICAgICBvZiBzcGVjaWZpYyBjcnlwdG8gaXRlcmZhY2VzLiBUaGlzIGNoYW5nZSBhbHNvIGludHJvZHVjZXMgaW50ZWdyYXRlZAogICAgIHN1cHBvcnQgZm9yIHN5bW1ldHJpYyBjaXBoZXJzIGFuZCBkaWdlc3QgaW1wbGVtZW50YXRpb25zIC0gc28gRU5HSU5FcwogICAgIGNhbiBub3cgYWNjZWxlcmF0ZSB0aGVzZSBieSBwcm92aWRpbmcgRVZQX0NJUEhFUiBhbmQgRVZQX01ECiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZWlyIG93bi4gVGhpcyBpcyBkZXRhaWxlZCBpbiBjcnlwdG8vZW5naW5lL1JFQURNRQogICAgIGFzIGl0IGNvdWxkbid0IGJlIGFkZXF1YXRlbHkgZGVzY3JpYmVkIGhlcmUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldwogICAgIEFQSSBjaGFuZ2VzIHdvcnRoIG5vdGluZyAtIHNvbWUgUlNBLCBEU0EsIERILCBhbmQgUkFORCBmdW5jdGlvbnMgdGhhdAogICAgIHdlcmUgY2hhbmdlZCBpbiB0aGUgb3JpZ2luYWwgaW50cm9kdWN0aW9uIG9mIEVOR0lORSBjb2RlIGhhdmUgbm93CiAgICAgcmV2ZXJ0ZWQgYmFjayAtIHRoZSBob29raW5nIGZyb20gdGhpcyBjb2RlIHRvIEVOR0lORSBpcyBub3cgYSBnb29kCiAgICAgZGVhbCBtb3JlIHBhc3NpdmUgYW5kIGF0IHJ1bi10aW1lLCBvcGVyYXRpb25zIGRlYWwgZGlyZWN0bHkgd2l0aAogICAgIFJTQV9NRVRIT0RzLCBEU0FfTUVUSE9EcyAoZXRjKSBhcyB0aGV5IGRpZCBiZWZvcmUsIHJhdGhlciB0aGFuCiAgICAgZGVyZWZlcmVuY2luZyB0aHJvdWdoIGFuIEVOR0lORSBwb2ludGVyIGFueSBtb3JlLiBBbHNvLCB0aGUgRU5HSU5FCiAgICAgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBCTl9NT0RfRVhQW19DUlRdIGhhbmRsZXJzIGhhdmUgYmVlbiByZW1vdmVkIC0KICAgICB0aGV5IHdlcmUgbm90IGJlaW5nIHVzZWQgYnkgdGhlIGZyYW1ld29yayBhcyB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEKICAgICBCSUdOVU1fTUVUSE9EIGFuZCB0aGV5IGNvdWxkIG5vdCBiZSBnZW5lcmFsaXNlZCB0byB0aGUgbmV3CiAgICAgJ0VOR0lORV9UQUJMRScgbWVjaGFuaXNtIHRoYXQgdW5kZXJsaWVzIHRoZSBuZXcgY29kZS4gU2ltaWxhcmx5LAogICAgIEVOR0lORV9jcHkoKSBoYXMgYmVlbiByZW1vdmVkIGFzIGl0IGNhbm5vdCBiZSBjb25zaXN0ZW50bHkgZGVmaW5lZCBpbgogICAgIHRoZSBuZXcgY29kZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2soKSB0byBhbGxvdyBmcmFjdGlvbmFsIHNlY29uZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG1rZGVmLnBsIHRvIHNvcnQgc3ltYm9scyB0aGF0IGdldCB0aGUgc2FtZSBlbnRyeSBudW1iZXIsCiAgICAgYW5kIG1ha2Ugc3VyZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIEVSUl9sb2FkXyoKICAgICBiZWNvbWUgcGFydCBvZiBsaWJlYXkubnVtIGFzIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkuICBUaGlzIHJldHVybnMgdHJ1ZSBvbmNlCiAgICAgcmVuZWdvdGlhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQgKGVpdGhlciBTU0xfcmVuZWdvdGlhdGUoKSBjYWxsCiAgICAgb3IgSGVsbG9SZXF1ZXN0L0NsaWVudEhlbGxvIHJlY2V2ZWl2ZWQgZnJvbSB0aGUgcGVlcikgYW5kIGJlY29tZXMKICAgICBmYWxzZSBvbmNlIGEgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAoRm9yIHNlcnZlcnMsIFNTTF9yZW5lZ290aWF0ZSgpIGZvbGxvd2VkIGJ5IFNTTF9kb19oYW5kc2hha2UoKQogICAgIHNlbmRzIGEgSGVsbG9SZXF1ZXN0LCBidXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgYSBoYW5kc2hha2UgdGFrZXMKICAgICBwbGFjZS4gIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkgaXMgdXNlZnVsIGZvciBjaGVja2luZyBpZiB0aGUKICAgICBjbGllbnQgaGFzIGZvbGxvd2VkIHRoZSByZXF1ZXN0LikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgU1NMIG9wdGlvbiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04uCiAgICAgQnkgZGVmYXVsdCwgY2xpZW50cyBtYXkgcmVxdWVzdCBzZXNzaW9uIHJlc3VtcHRpb24gZXZlbiBkdXJpbmcKICAgICByZW5lZ290aWF0aW9uIChpZiBzZXNzaW9uIElEIGNvbnRleHRzIHBlcm1pdCk7IHdpdGggdGhpcyBvcHRpb24sCiAgICAgc2Vzc2lvbiByZXN1bXB0aW9uIGlzIHBvc3NpYmxlIG9ubHkgaW4gdGhlIGZpcnN0IGhhbmRzaGFrZS4KCiAgICAgU1NMX09QX0FMTCBpcyBub3cgMHgwMDAwMEZGRkwgaW5zdGVhZCBvZiAweDAwMEZGRkZGTC4gIFRoaXMgbWFrZXMKICAgICBtb3JlIGJpdHMgYXZhaWxhYmxlIGZvciBvcHRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mCiAgICAgU1NMX09QX0FMTCAoc3VjaCBhcyBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzb21lIGRlbW9zIGZvciBjZXJ0aWZpY2F0ZSBhbmQgY2VydGlmaWNhdGUgcmVxdWVzdCBjcmVhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1heGltdW0gY2VydGlmaWNhdGUgY2hhaW4gc2l6ZSBhY2NlcHRlZCBmcm9tIHRoZSBwZWVyIGFwcGxpY2F0aW9uCiAgICAgc2V0dGFibGUgKFNTTCpfZ2V0L3NldF9tYXhfY2VydF9saXN0KCkpLCBhcyBwcm9wb3NlZCBieQogICAgICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBmb3IgVW5peHdhcmUtNwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYSAiZGVzdHJveSIgaGFuZGxlciB0byBFTkdJTkVzIHRoYXQgYWxsb3dzIHN0cnVjdHVyYWwgY2xlYW51cCB0bwogICAgIGJlIGRvbmUgcHJpb3IgdG8gZGVzdHJ1Y3Rpb24uIFVzZSB0aGlzIHRvIHVubG9hZCBlcnJvciBzdHJpbmdzIGZyb20KICAgICBFTkdJTkVzIHRoYXQgbG9hZCB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gTkI6IFRoaXMgYWRkcyB0d28gbmV3IEFQSQogICAgIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIgdGhpcyBkZXN0cm95IGhhbmRsZXIgaW4gYW4gRU5HSU5FLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFsdGVyIGFsbCBleGlzdGluZyBFTkdJTkUgaW1wbGVtZW50YXRpb25zIChleGNlcHQgIm9wZW5zc2wiIGFuZAogICAgICJvcGVuYnNkIikgdG8gZHluYW1pY2FsbHkgaW5zdGFudGlhdGUgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIFRoaXMKICAgICBtYWtlcyB0aGVtIG1vcmUgZmxleGlibGUgdG8gYmUgYnVpbHQgYm90aCBhcyBzdGF0aWNhbGx5LWxpbmtlZCBFTkdJTkVzCiAgICAgYW5kIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMgbG9hZGFibGUgdmlhIHRoZSAiZHluYW1pYyIgRU5HSU5FLgogICAgIEFsc28sIGFkZCBzdHViIGNvZGUgdG8gZWFjaCB0aGF0IG1ha2VzIGJ1aWxkaW5nIHRoZW0gYXMgc2VsZi1jb250YWluZWQKICAgICBzaGFyZWQtbGlicmFyaWVzIGVhc2llciAoc2VlIFJFQURNRS5FTkdJTkUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhICJkeW5hbWljIiBFTkdJTkUgdGhhdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgYmluZGluZyBFTkdJTkUKICAgICBpbXBsZW1lbnRhdGlvbnMgaW50byBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZCBpbgogICAgIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMuIFRoZSAiZHluYW1pYyIgRU5HSU5FIGV4cG9zZXMgY29udHJvbAogICAgIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoYXQgc2hhcmVkLWxpYnJhcnkgdG8gbG9hZCBhbmQKICAgICB0byBjb250cm9sIGFzcGVjdHMgb2YgdGhlIHdheSBpdCBpcyBoYW5kbGVkLiBBbHNvLCBtYWRlIGFuIHVwZGF0ZSB0bwogICAgIHRoZSBSRUFETUUuRU5HSU5FIGZpbGUgdGhhdCBicmluZ3MgaXRzIGluZm9ybWF0aW9uIHVwLXRvLWRhdGUgYW5kCiAgICAgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhbmQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSAiZHluYW1pYyIgRU5HSU5FCiAgICAgKGllLiBob3cgdG8gdXNlIGl0LCBob3cgdG8gYnVpbGQgImR5bmFtaWMiLWxvYWRhYmxlIEVOR0lORXMsIGV0YykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byB1bmxvYWQgcmFuZ2VzIG9mIEVSUiBzdHJpbmdzIHdpdGggYSBuZXcKICAgICAiRVJSX3VubG9hZF9zdHJpbmdzIiBmdW5jdGlvbi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb3B5KCkgZnVuY3Rpb24gdG8gRVZQX01ELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIEVWUF9NRCByb3V0aW5lcyB0YWtlIGEgY29udGV4dCBwb2ludGVyIGluc3RlYWQgb2YganVzdCB0aGUKICAgICBtZF9kYXRhIHZvaWQgcG9pbnRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGZsYWdzIHRvIEVWUF9NRCBhbmQgRVZQX01EX0NUWC4gRVZQX01EX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMKICAgICB0aGF0IHRoZSBkaWdlc3QgY2FuIG9ubHkgcHJvY2VzcyBhIHNpbmdsZSBjaHVuayBvZiBkYXRhCiAgICAgKHR5cGljYWxseSBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5IGEgcGllY2Ugb2YKICAgICBoYXJkd2FyZSkuIEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UIGluZGljYXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbgogICAgIGlzIG9ubHkgZ29pbmcgdG8gcHJvdmlkZSBhIHNpbmdsZSBjaHVuayBvZiBkYXRhLCBhbmQgaGVuY2UgdGhlCiAgICAgZnJhbWV3b3JrIG5lZWRuJ3QgYWNjdW11bGF0ZSB0aGUgZGF0YSBmb3Igb25lc2hvdCBkcml2ZXJzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBcyB3aXRoICJFUlIiLCBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgImV4X2RhdGEiCiAgICAgZnVuY3Rpb25zLiBUaGlzIGNoYW5nZSBhbHNvIGFsdGVycyB0aGUgc3RvcmFnZSBhbmQgbWFuYWdlbWVudCBvZiBnbG9iYWwKICAgICBleF9kYXRhIHN0YXRlIC0gaXQncyBub3cgYWxsIGluc2lkZSBleF9kYXRhLmMgYW5kIGFsbCAiY2xhc3MiIGNvZGUgKGVnLgogICAgIFJTQSwgQklPLCBTU0xfQ1RYLCBldGMpIG5vIGxvbmdlciBzdG9yZXMgaXRzIG93biBTVEFDS1MgYW5kIHBlci1jbGFzcwogICAgIGluZGV4IGNvdW50ZXJzLiBUaGUgQVBJIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGlzIHN0YXRlIGhhdmUgYmVlbiBjaGFuZ2VkCiAgICAgdG8gdGFrZSBhICJjbGFzc19pbmRleCIgcmF0aGVyIHRoYW4gcG9pbnRlcnMgdG8gdGhlIGNsYXNzJ3MgbG9jYWwgU1RBQ0sKICAgICBhbmQgY291bnRlciwgYW5kIHRoZXJlIGlzIG5vdyBhbiBBUEkgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgY3JlYXRlIG5ldwogICAgIGNsYXNzZXMuIFRoaXMgY2VudHJhbGlzYXRpb24gYWxsb3dzIHVzIHRvIChhKSBwbHVnIGEgbG90IG9mIHRoZQogICAgIHRocmVhZC1zYWZldHkgcHJvYmxlbXMgdGhhdCBleGlzdGVkLCBhbmQgKGIpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNsZWFuCiAgICAgdXAgYWxsIGFsbG9jYXRlZCBzdGF0ZSB1c2luZyAiQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSIuIFcuci50LiAoYikKICAgICBzdWNoIGRhdGEgd291bGQgcHJldmlvdXNseSBoYXZlIGFsd2F5cyBsZWFrZWQgaW4gYXBwbGljYXRpb24gY29kZSBhbmQKICAgICB3b3JrYXJvdW5kcyB3ZXJlIGluIHBsYWNlIHRvIG1ha2UgdGhlIG1lbW9yeSBkZWJ1Z2dpbmcgdHVybiBhIGJsaW5kIGV5ZQogICAgIHRvIGl0LiBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBzdGlsbAogICAgIGxlYWsgYXMgYmVmb3JlLCBidXQgdGhlaXIgbWVtb3J5IGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBhbm5vdW5jZSBpdCBub3cKICAgICByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IHNsaWRlLgoKICAgICBCZXNpZGVzIHRoZSBhZGRpdGlvbiBvZiBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpLCBhbm90aGVyIEFQSSBjaGFuZ2UKICAgICBpbmR1Y2VkIGJ5IHRoZSAiZXhfZGF0YSIgb3ZlcmhhdWwgaXMgdGhhdCBYNTA5X1NUT1JFX0NUWF9pbml0KCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgIkVSUiIgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGUKICAgICBnbG9iYWwgc3RhdGUgKDIgTEhBU0ggdGFibGVzIGFuZCAyIGxvY2tzKSBpcyBvbmx5IHVzZWQgYnkgdGhlICJkZWZhdWx0IgogICAgIGltcGxlbWVudGF0aW9uLiBUaGlzIGNoYW5nZSBhbHNvIGFkZHMgdHdvIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIKICAgICB0aGUgaW1wbGVtZW50YXRpb24gcHJpb3IgdG8gaXQgYmVpbmcgYXV0b21hdGljYWxseSBzZXQgdGhlIGZpcnN0IHRpbWUKICAgICBhbnkgb3RoZXIgRVJSIGZ1bmN0aW9uIHRha2VzIHBsYWNlLiBJZS4gYW4gYXBwbGljYXRpb24gY2FuIGNhbGwgImdldCIsCiAgICAgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbW9kdWxlIGl0IGhhcyBqdXN0IGxvYWRlZCwgYW5kIHRoYXQgbW9kdWxlCiAgICAgY2FuIGNhbGwgaXRzIG93biAic2V0IiBmdW5jdGlvbiB1c2luZyB0aGF0IHZhbHVlLiBUaGlzIG1lYW5zIHRoZQogICAgIG1vZHVsZSdzICJFUlIiIG9wZXJhdGlvbnMgd2lsbCB1c2UgKGFuZCBtb2RpZnkpIHRoZSBlcnJvciBzdGF0ZSBpbiB0aGUKICAgICBhcHBsaWNhdGlvbiBhbmQgbm90IGluIGl0cyBvd24gc3RhdGljYWxseSBsaW5rZWQgY29weSBvZiBPcGVuU1NMIGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgR2l2ZSBESCwgRFNBLCBhbmQgUlNBIHR5cGVzIHRoZWlyIG93biAiKipfdXBfcmVmKCkiIGZ1bmN0aW9uIHRvIGluY3JlbWVudAogICAgIHJlZmVyZW5jZSBjb3VudHMuIFRoaXMgcGVyZm9ybXMgbm9ybWFsIFJFRl9QUklOVC9SRUZfQ0hFQ0sgbWFjcm9zIG9uCiAgICAgdGhlIG9wZXJhdGlvbiwgYW5kIHByb3ZpZGVzIGEgbW9yZSBlbmNhcHN1bGF0ZWQgd2F5IGZvciBleHRlcm5hbCBjb2RlCiAgICAgKGNyeXB0by9ldnAvIGFuZCBzc2wvKSB0byBkbyB0aGlzLiBBbHNvIGNoYW5nZWQgdGhlIGV2cCBhbmQgc3NsIGNvZGUKICAgICB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIHJhdGhlciB0aGFuIG1hbnVhbGx5IGluY3JlbWVudGluZyB0aGUgY291bnRzLgoKICAgICBBbHNvIHJlbmFtZSAiRFNPX3VwKCkiIGZ1bmN0aW9uIHRvIG1vcmUgZGVzY3JpcHRpdmUgIkRTT191cF9yZWYoKSIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIEVWUCB0ZXN0IHByb2dyYW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzeW1tZXRyaWMgY2lwaGVyIHN1cHBvcnQgdG8gRU5HSU5FLiBFeHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBDUkwgZnVuY3Rpb25zOiBYNTA5X0NSTF9zZXRfdmVyc2lvbigpLCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoKQogICAgIFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKCksIFg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKCksIFg1MDlfQ1JMX3NvcnQoKSwKICAgICBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcigpLCBhbmQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZSgpLgogICAgIFRoZXNlIGFsbG93IGEgQ1JMIHRvIGJlIGJ1aWx0IHdpdGhvdXQgaGF2aW5nIHRvIGFjY2VzcyBYNTA5X0NSTCBmaWVsZHMKICAgICBkaXJlY3RseS4gTW9kaWZ5ICdjYScgYXBwbGljYXRpb24gdG8gdXNlIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRyBvdXQgb2YgdGhlIFNTTF9PUF9BTEwgbGlzdCBvZiByZWNvbW1lbmRlZAogICAgIGJ1ZyB3b3JrYXJvdW5kcy4gUm9sbGJhY2sgYXR0YWNrIGRldGVjdGlvbiBpcyBhIHNlY3VyaXR5IGZlYXR1cmUuCiAgICAgVGhlIHByb2JsZW0gd2lsbCBvbmx5IGFyaXNlIG9uIE9wZW5TU0wgc2VydmVycyB3aGVuIFRMU3YxIGlzIG5vdAogICAgIGF2YWlsYWJsZSAoc3NsdjNfc2VydmVyX21ldGhvZCgpIG9yIFNTTF9PUF9OT19UTFN2MSkuCiAgICAgU29mdHdhcmUgYXV0aG9ycyBub3Qgd2FudGluZyB0byBzdXBwb3J0IFRMU3YxIHdpbGwgaGF2ZSBzcGVjaWFsIHJlYXNvbnMKICAgICBmb3IgdGhlaXIgY2hvaWNlIGFuZCBjYW4gZXhwbGljaXRseSBlbmFibGUgdGhpcyBvcHRpb24uCiAgICAgW0JvZG8gTW9lbGxlciwgTHV0eiBKYWVuaWNrZV0KCiAgKikgUmF0aW9uYWxpc2UgRVZQIHNvIGl0IGNhbiBiZSBleHRlbmRlZDogZG9uJ3QgaW5jbHVkZSBhIHVuaW9uIG9mCiAgICAgY2lwaGVyL2RpZ2VzdCBzdHJ1Y3R1cmVzLCBhZGQgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyBmb3IgRVZQX01EX0NUWAogICAgIChzaW1pbGFyIHRvIHRob3NlIGV4aXN0aW5nIGZvciBFVlBfQ0lQSEVSX0NUWCkuCiAgICAgVXNhZ2UgZXhhbXBsZToKCiAgICAgICAgIEVWUF9NRF9DVFggbWQ7CgogICAgICAgICBFVlBfTURfQ1RYX2luaXQoJm1kKTsgICAgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KICAgICAgICAgRVZQX0RpZ2VzdEluaXQoJm1kLCBFVlBfc2hhMSgpKTsKICAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGluLCBsZW4pOwogICAgICAgICBFVlBfRGlnZXN0RmluYWwoJm1kLCBvdXQsIE5VTEwpOwogICAgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kKTsgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREVTIGtleSBzY2hlZHVsZSBjb25mb3JtIHRvIHRoZSB1c3VhbCBzY2hlbWUsIGFzIHdlbGwgYXMKICAgICBjb3JyZWN0aW5nIGl0cyBzdHJ1Y3R1cmUuIFRoaXMgbWVhbnMgdGhhdCBjYWxscyB0byBERVMgZnVuY3Rpb25zCiAgICAgbm93IGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBkZXNfa2V5X3NjaGVkdWxlIGluc3RlYWQgb2YgYQogICAgIHBsYWluIGRlc19rZXlfc2NoZWR1bGUgKHdoaWNoIHdhcyBhY3R1YWxseSBhbHdheXMgYSBwb2ludGVyCiAgICAgYW55d2F5KTogRS5nLiwKCiAgICAgICAgIGRlc19rZXlfc2NoZWR1bGUga3M7CgoJIGRlc19zZXRfa2V5X2NoZWNrZWQoLi4uLCAma3MpOwoJIGRlc19uY2JjX2VuY3J5cHQoLi4uLCAma3MsIC4uLik7CgogICAgIChOb3RlIHRoYXQgYSBsYXRlciBjaGFuZ2UgcmVuYW1lcyAnZGVzXy4uLicgaW50byAnREVTXy4uLicuKQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQ6IHRoZSB1c2Ugb2Ygc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMKICAgICBQRU0gY2F1c2VzIGxhcmdlIGFtb3VudHMgb2YgdW51c2VkIGZ1bmN0aW9ucyB0byBiZSBsaW5rZWQgaW4gZHVlIHRvCiAgICAgcG9vciBvcmdhbmlzYXRpb24uIEZvciBleGFtcGxlIHBlbV9hbGwuYyBjb250YWlucyBldmVyeSBQRU0gZnVuY3Rpb24KICAgICB3aGljaCBoYXMgYSBrbm9jayBvbiBlZmZlY3Qgb2YgbGlua2luZyBpbiBsYXJnZSBhbW91bnRzIG9mICh1bnVzZWQpCiAgICAgQVNOMSBjb2RlLiBHcm91cGluZyB0b2dldGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBhbmQgc3BsaXR0aW5nIHVucmVsYXRlZAogICAgIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFudXAgb2YgRVZQIG1hY3Jvcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIGhpc3RvcmljYWwgcmVmZXJlbmNlcyB0byB7TklELFNOLExOfV9kZXNfZWRlIGFuZCBlZGUzIHRvIGFkZCB0aGUKICAgICBjb3JyZWN0IF9lY2Igc3VmZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgaW5pdGlhbCBPQ1NQIHJlc3BvbmRlciBzdXBwb3J0IHRvIG9jc3AgYXBwbGljYXRpb24uIFRoZQogICAgIHJldm9jYXRpb24gaW5mb3JtYXRpb24gaXMgaGFuZGxlZCB1c2luZyB0aGUgdGV4dCBiYXNlZCBpbmRleAogICAgIHVzZSBieSB0aGUgY2EgYXBwbGljYXRpb24uIFRoZSByZXNwb25kZXIgY2FuIGVpdGhlciBoYW5kbGUKICAgICByZXF1ZXN0cyBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgc3VwcGxpZWQgaW4gZmlsZXMgKGZvciBleGFtcGxlCiAgICAgdmlhIGEgQ0dJIHNjcmlwdCkgb3IgdXNpbmcgYW4gaW50ZXJuYWwgbWluaW1hbCBzZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyB0byBnZXQgemxpYiBjb21wcmVzc2lvbiBmb3IgVExTLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZXMgdG8gS2VyYmVyb3MgU1NMIGZvciBSRkMgMjcxMiBjb21wbGlhbmNlOgogICAgIDEuICBJbXBsZW1lbnRlZCByZWFsIEtlcmJlcm9zV3JhcHBlciwgaW5zdGVhZCBvZiBqdXN0IHVzaW5nCiAgICAgICAgIEtSQjUgQVBfUkVRIG1lc3NhZ2UuICBbVGhhbmtzIHRvIFNpbW9uIFdpbGtpbnNvbiA8c3h3QHN4dy5vcmcudWs+XQogICAgIDIuICBJbXBsZW1lbnRlZCBvcHRpb25hbCBhdXRoZW50aWNhdG9yIGZpZWxkIG9mIEtlcmJlcm9zV3JhcHBlci4KCiAgICAgQWRkZWQgb3BlbnNzbC1zdHlsZSBBU04uMSBtYWNyb3MgZm9yIEtlcmJlcm9zIHRpY2tldCwgYXBfcmVxLAogICAgIGFuZCBhdXRoZW50aWNhdG9yIHN0cnVjdHM7IHNlZSBjcnlwdG8va3JiNS8uCgogICAgIEdlbmVyYWxpemVkIEtlcmJlcm9zIGNhbGxzIHRvIHN1cHBvcnQgbXVsdGlwbGUgS2VyYmVyb3MgbGlicmFyaWVzLgogICAgIFtWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+CiAgICAgIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENhdXNlICdvcGVuc3NsIHNwZWVkJyB0byB1c2UgZnVsbHkgaGFyZC1jb2RlZCBEU0Ega2V5cyBhcyBpdAogICAgIGFscmVhZHkgZG9lcyB3aXRoIFJTQS4gdGVzdGRzYS5oIG5vdyBoYXMgJ3ByaXZfa2V5L3B1Yl9rZXknCiAgICAgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBrZXkgc2l6ZXMgcmF0aGVyIHRoYW4gaGF2aW5nIGp1c3QKICAgICBwYXJhbWV0ZXJzIChhbmQgJ3NwZWVkJyBnZW5lcmF0aW5nIGtleXMgZWFjaCB0aW1lKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTcGVlZCB1cCBFVlAgcm91dGluZXMuCiAgICAgQmVmb3JlOgplbmNyeXB0CnR5cGUgICAgICAgICAgICAgIDggYnl0ZXMgICAgIDY0IGJ5dGVzICAgIDI1NiBieXRlcyAgIDEwMjQgYnl0ZXMgICA4MTkyIGJ5dGVzCmRlcy1jYmMgICAgICAgICAgIDQ0MDguODVrICAgICA1NTYwLjUxayAgICAgNTc3OC40NmsgICAgIDU4NjIuMjBrICAgICA1ODI1LjE2awpkZXMtY2JjICAgICAgICAgICA0Mzg5LjU1ayAgICAgNTU3MS4xN2sgICAgIDU3OTIuMjNrICAgICA1ODQ2LjkxayAgICAgNTgzMi4xMWsKZGVzLWNiYyAgICAgICAgICAgNDM5NC4zMmsgICAgIDU1NzUuOTJrICAgICA1ODA3LjQ0ayAgICAgNTg0OC4zN2sgICAgIDU4NDEuMzBrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzQ4Mi42NmsgICAgIDUwNjkuNDlrICAgICA1NDk2LjM5ayAgICAgNTYxNC4xNmsgICAgIDU2MzkuMjhrCmRlcy1jYmMgICAgICAgICAgIDM0ODAuNzRrICAgICA1MDY4Ljc2ayAgICAgNTUxMC4zNGsgICAgIDU2MDkuODdrICAgICA1NjM1LjUyawpkZXMtY2JjICAgICAgICAgICAzNDgzLjcyayAgICAgNTA2Ny42MmsgICAgIDU1MDQuNjBrICAgICA1NzA4LjAxayAgICAgNTcyNC44MGsKICAgICBBZnRlcjoKZW5jcnlwdApkZXMtY2JjICAgICAgICAgICA0NjYwLjE2ayAgICAgNTY1MC4xOWsgICAgIDU4MDcuMTlrICAgICA1ODI3LjEzayAgICAgNTc4My4zMmsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNjI0Ljk2ayAgICAgNTI1OC4yMWsgICAgIDU1MzAuOTFrICAgICA1NjI0LjMwayAgICAgNTYyOC4yNmsKICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkZWQgdGhlIE9TMi1FTVggdGFyZ2V0LgogICAgIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1PiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIGFwcHMgdG8gdXNlIE5DT05GIHJvdXRpbmVzIGluc3RlYWQgb2YgdGhlIG9sZCBDT05GLiBOZXcgZnVuY3Rpb25zCiAgICAgdG8gc3VwcG9ydCBOQ09ORiByb3V0aW5lcyBpbiBleHRlbnNpb24gY29kZS4gTmV3IGZ1bmN0aW9uIENPTkZfc2V0X25jb25mKCkKICAgICB0byBhbGxvdyBmdW5jdGlvbnMgd2hpY2ggdGFrZSBhbiBOQ09ORiB0byBhbHNvIGhhbmRsZSB0aGUgb2xkIExIQVNICiAgICAgc3RydWN0dXJlOiB0aGlzIG1lYW5zIHRoYXQgdGhlIG9sZCBDT05GIGNvbXBhdGlibGUgcm91dGluZXMgY2FuIGJlCiAgICAgcmV0YWluZWQgKGluIHBhcnRpY3VsYXIgd3J0IGV4dGVuc2lvbnMpIHdpdGhvdXQgaGF2aW5nIHRvIGR1cGxpY2F0ZSB0aGUKICAgICBjb2RlLiBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZF9leHRfbmNvbmZfc2sgdG8gYWRkIGV4dGVuc2lvbnMgdG8gYSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyBmb3IgaW5uZXIgY29udHJvbAogICAgIGFuZCB3aXRoIHBvc3NpYmlsaXRpZXMgdG8gaGF2ZSB5ZXMvbm8ga2luZCBvZiBwcm9tcHRzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBhbGwgY2FsbHMgdG8gbG93IGxldmVsIGRpZ2VzdCByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSBhbmQKICAgICBhcHBsaWNhdGlvbnMgdG8gdXNlIEVWUC4gQWRkIG1pc3NpbmcgY2FsbHMgdG8gSE1BQ19jbGVhbnVwKCkgYW5kCiAgICAgZG9uJ3QgYXNzdW1lIEhNQUNfQ1RYIGNhbiBiZSBjb3BpZWQgdXNpbmcgbWVtY3B5KCkuCiAgICAgW1ZlcmRvbiBXYWxrZXIgPFZXYWxrZXJAbm92ZWxsLmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjb250cm9sIGVuZ2luZXMgdGhyb3VnaCBjb250cm9sIG5hbWVzIGJ1dCB3aXRoCiAgICAgYXJiaXRyYXJ5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIGp1c3QgYSBzdHJpbmcuCiAgICAgQ2hhbmdlIHRoZSBrZXkgbG9hZGVycyB0byB0YWtlIGEgVUlfTUVUSE9EIGluc3RlYWQgb2YgYSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHBvaW50ZXIuICBOT1RFOiB0aGlzIGJyZWFrcyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKICAgICB2ZXJzaW9ucyBvZiBPcGVuU1NMIFtlbmdpbmVdLgogICAgIEFkYXB0IHRoZSBuQ2lwaGVyIGNvZGUgZm9yIHRoZXNlIG5ldyBjb25kaXRpb25zIGFuZCBhZGQgYSBjYXJkIGluc2VydGlvbgogICAgIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIHRvIGJldHRlciBzdXBwb3J0CiAgICAgZGlhbG9nIGJveCBpbnRlcmZhY2VzLCBhcHBsaWNhdGlvbi1kZWZpbmVkIHByb21wdHMsIHRoZSBwb3NzaWJpbGl0eQogICAgIHRvIHVzZSBkZWZhdWx0cyAoZm9yIGV4YW1wbGUgZGVmYXVsdCBwYXNzd29yZHMgZnJvbSBzb21ld2hlcmUgZWxzZSkKICAgICBhbmQgaW50ZXJydXB0cy9jYW5jZWxsYXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRpZHkgdXAgUEtDUyMxMiBhdHRyaWJ1dGUgaGFuZGxpbmcuIEFkZCBzdXBwb3J0IGZvciB0aGUgQ1NQIG5hbWUKICAgICBhdHRyaWJ1dGUgaW4gUEtDUyMxMiBmaWxlcywgYWRkIG5ldyAtQ1NQIG9wdGlvbiB0byBwa2NzMTIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBtZW1vcnkgbGVhayBpbiAnc2tfZHVwKCknIGluIHRoZSBjYXNlIHJlYWxsb2NhdGlvbiBmYWlscy4gKEFsc28KICAgICB0aWR5IHVwIHNvbWUgdW5uZWNlc3NhcmlseSB3ZWlyZCBjb2RlIGluICdza19uZXcoKScpLgogICAgIFtHZW9mZiwgcmVwb3J0ZWQgYnkgRGllZ28gVGFydGFyYSA8ZHRhcnRhcmFAbm92YW1lbnMuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBrZXkgbG9hZGluZyByb3V0aW5lcyBmb3IgRU5HSU5FcyB0byB1c2UgdGhlIHNhbWUga2luZAogICAgIGNhbGxiYWNrIChwZW1fcGFzc3dvcmRfY2IpIGFzIGFsbCBvdGhlciByb3V0aW5lcyB0aGF0IG5lZWQgdGhpcwogICAgIGtpbmQgb2YgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5jcmVhc2UgRU5UUk9QWV9ORUVERUQgdG8gMzIgYnl0ZXMsIGFzIFJpam5kYWVsIGNhbiBvcGVyYXRlIHdpdGgKICAgICAyNTYgYml0ICg9MzIgYnl0ZSkga2V5cy4gT2YgY291cnNlIHNlZWRpbmcgd2l0aCBtb3JlIGVudHJvcHkgYnl0ZXMKICAgICB0aGFuIHRoaXMgbWluaW11bSB2YWx1ZSBpcyByZWNvbW1lbmRlZC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTmV3IHJhbmRvbSBzZWVkZXIgZm9yIE9wZW5WTVMsIHVzaW5nIHRoZSBzeXN0ZW0gcHJvY2VzcyBzdGF0aXN0aWNzCiAgICAgdGhhdCBhcmUgZWFzaWx5IHJlYWNoYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBXaW5kb3dzIGFwcGFyZW50bHkgY2FuJ3QgdHJhbnNwYXJlbnRseSBoYW5kbGUgZ2xvYmFsCiAgICAgdmFyaWFibGVzIGRlZmluZWQgaW4gRExMcy4gSW5pdGlhbGlzYXRpb25zIHN1Y2ggYXM6CgogICAgICAgIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSAmQVNOMV9JTlRFR0VSX2l0OwoKICAgICB3b250IGNvbXBpbGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8KICAgICBkZWNsYXJlIHRoZWlyIG93biBBU04xIG1vZHVsZXMuIFRoaXMgd2FzIGZpeGVkIGJ5IGFkZGluZyB0aGUgb3B0aW9uCiAgICAgRVhQT1JUX1ZBUl9BU19GTiB0byBhbGwgV2luMzIgcGxhdGZvcm1zLCBhbHRob3VnaCB0aGlzIGlzbid0IHN0cmljdGx5CiAgICAgbmVlZGVkIGZvciBzdGF0aWMgbGlicmFyaWVzIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgWDUwOV9QVVJQT1NFX3NldCgpIGFuZCBYNTA5X1RSVVNUX3NldCgpIHRvIGhhbmRsZQogICAgIHNldHRpbmcgb2YgcHVycG9zZSBhbmQgdHJ1c3QgZmllbGRzLiBOZXcgWDUwOV9TVE9SRSB0cnVzdCBhbmQKICAgICBwdXJwb3NlIGZ1bmN0aW9ucyBhbmQgdGlkeSB1cCBzZXR0aW5nIGluIG90aGVyIFNTTCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvcGllcyBvZiBYNTA5X1NUT1JFX0NUWCBmaWVsZHMgYW5kIGNhbGxiYWNrcyB0byBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGVzZSBhcmUgaW5oZXJpdGVkIGJ5IFg1MDlfU1RPUkVfQ1RYIHdoZW4gaXQgaXMgCiAgICAgaW5pdGlhbGlzZWQuIFRoaXMgYWxsb3dzIHZhcmlvdXMgZGVmYXVsdHMgdG8gYmUgc2V0IGluIHRoZQogICAgIFg1MDlfU1RPUkUgc3RydWN0dXJlIChzdWNoIGFzIGZsYWdzIGZvciBDUkwgY2hlY2tpbmcgYW5kIGN1c3RvbQogICAgIHB1cnBvc2Ugb3IgdHJ1c3Qgc2V0dGluZ3MpIGZvciBmdW5jdGlvbnMgd2hpY2ggb25seSB1c2UgWDUwOV9TVE9SRV9DVFgKICAgICBpbnRlcm5hbGx5IHN1Y2ggYXMgUy9NSU1FLgoKICAgICBNb2RpZnkgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KCkgc28gaXQgb25seSBzZXRzIHB1cnBvc2VzIGFuZAogICAgIHRydXN0IHNldHRpbmdzIGlmIHRoZXkgYXJlIG5vdCBzZXQgaW4gWDUwOV9TVE9SRS4gVGhpcyBhbGxvd3MgWDUwOV9TVE9SRQogICAgIHB1cnBvc2VzIGFuZCB0cnVzdCAoaW4gUy9NSU1FIGZvciBleGFtcGxlKSB0byBvdmVycmlkZSBhbnkgc2V0IGJ5IGRlZmF1bHQuCgogICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgQ1JMIGNoZWNraW5nIHRvIHNtaW1lLCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBDUkwgYmFzZWQgcmV2b2NhdGlvbiBjaGVja2luZy4gSWYgdGhlIENSTCBjaGVja2luZyBmbGFnKHMpCiAgICAgYXJlIHNldCB0aGVuIHRoZSBDUkwgaXMgbG9va2VkIHVwIGluIHRoZSBYNTA5X1NUT1JFIHN0cnVjdHVyZSBhbmQKICAgICBpdHMgdmFsaWRpdHkgYW5kIHNpZ25hdHVyZSBjaGVja2VkLCB0aGVuIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZAogICAgIGluIHRoZSBDUkwgdGhlIHZlcmlmeSBmYWlscyB3aXRoIGEgcmV2b2tlZCBlcnJvci4KCiAgICAgVmFyaW91cyBuZXcgQ1JMIHJlbGF0ZWQgY2FsbGJhY2tzIGFkZGVkIHRvIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KCiAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYWRkZWQgdG8gJ3ZlcmlmeScgYXBwbGljYXRpb24gdG8gc3VwcG9ydCB0aGlzLgoKICAgICBUaGlzIG5lZWRzIHNvbWUgYWRkaXRpb25hbCB3b3JrLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gaGFuZGxlIG11bHRpcGxlCiAgICAgQ1JMcyB3aXRoIGRpZmZlcmVudCB0aW1lcywgZXh0ZW5zaW9uIGJhc2VkIGxvb2t1cCAocmF0aGVyIHRoYW4ganVzdAogICAgIGJ5IHN1YmplY3QgbmFtZSkgYW5kIHVsdGltYXRlbHkgbW9yZSBjb21wbGV0ZSBWMiBDUkwgZXh0ZW5zaW9uCiAgICAgaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSBBUEkgKGNyeXB0by91aS8pLiAgVGhpcyBpcyBkZXNpZ25lZAogICAgIHRvIHJlcGxhY2UgdGhpbmdzIGxpa2UgZGVzX3JlYWRfcGFzc3dvcmQgYW5kIGZyaWVuZHMgKGJhY2t3YXJkCiAgICAgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgdXNpbmcgdGhpcyBuZXcgQVBJIGFyZSBwcm92aWRlZCkuCiAgICAgVGhlIHB1cnBvc2UgaXMgdG8gcmVtb3ZlIHByb21wdGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgREVTIGNvZGUKICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBmb3IgcHJvbXB0aW5nIHRocm91Z2ggZGlhbG9nIGJveGVzIGluCiAgICAgYSB3aW5kb3cgc3lzdGVtIGFuZCB0aGUgbGlrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgImV4X2RhdGEiIHN1cHBvcnQgdG8gRU5HSU5FIHNvIGltcGxlbWVudGF0aW9ucyBjYW4gYWRkIHN0YXRlIGF0IGEKICAgICBwZXItc3RydWN0dXJlIGxldmVsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzdG9yZSBpdCBnbG9iYWxseS4KICAgICBbR2VvZmZdCgogICopIE1ha2UgaXQgcG9zc2libGUgZm9yIEVOR0lORSBzdHJ1Y3R1cmVzIHRvIGJlIGNvcGllZCB3aGVuIHJldHJpZXZlZCBieQogICAgIEVOR0lORV9ieV9pZCgpIGlmIHRoZSBFTkdJTkUgc3BlY2lmaWVzIGEgbmV3IGZsYWc6IEVOR0lORV9GTEFHU19CWV9JRF9DT1BZLgogICAgIFRoaXMgY2F1c2VzIHRoZSAib3JpZ2luYWwiIEVOR0lORSBzdHJ1Y3R1cmUgdG8gYWN0IGxpa2UgYSB0ZW1wbGF0ZSwKICAgICBhbmFsb2dvdXMgdG8gdGhlIFJTQSB2cy4gUlNBX01FVEhPRCB0eXBlIG9mIHNlcGFyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcwogICAgIG9wZXJhdGlvbmFsIHN0YXRlIGNhbiBiZSBsb2NhbGlzZWQgdG8gZWFjaCBFTkdJTkUgc3RydWN0dXJlLCBkZXNwaXRlIHRoZQogICAgIGZhY3QgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgIm1ldGhvZHMiLiBOZXcgRU5HSU5FIHN0cnVjdHVyZXMgcmV0dXJuZWQgaW4KICAgICB0aGlzIGNhc2UgaGF2ZSBubyBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNpbmdsZQogICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlLiBUaGlzIG1hdGNoZXMgdGhlIHNpbmdsZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSByZXR1cm5lZAogICAgIGJ5IEVOR0lORV9ieV9pZCgpIG5vcm1hbGx5LCB3aGVuIGl0IGlzIGluY3JlbWVudGVkIG9uIHRoZSBwcmUtZXhpc3RpbmcKICAgICBFTkdJTkUgc3RydWN0dXJlLgogICAgIFtHZW9mZl0KCiAgKikgRml4IEFTTjEgZGVjb2RlciB3aGVuIGRlY29kaW5nIHR5cGUgQU5ZIGFuZCBWX0FTTjFfT1RIRVI6IHNpbmNlIHRoaXMKICAgICBuZWVkcyB0byBtYXRjaCBhbnkgb3RoZXIgdHlwZSBhdCBhbGwgd2UgbmVlZCB0byBtYW51YWxseSBjbGVhciB0aGUKICAgICB0YWcgY2FjaGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgIm9wZW5zc2wgZW5naW5lIiB1dGlsaXR5IHRvIGluY2x1ZGU7CiAgICAgLSB2ZXJib3NpdHkgbGV2ZWxzICgnLXYnLCAnLXZ2JywgYW5kICctdnZ2JykgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uCiAgICAgICBhYm91dCBhbiBFTkdJTkUncyBhdmFpbGFibGUgY29udHJvbCBjb21tYW5kcy4KICAgICAtIGV4ZWN1dGluZyBjb250cm9sIGNvbW1hbmRzIGZyb20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1c2luZyB0aGUKICAgICAgICctcHJlJyBhbmQgJy1wb3N0JyBzd2l0Y2hlcy4gJy1wb3N0JyBpcyBvbmx5IHVzZWQgaWYgJy10JyBpcwogICAgICAgc3BlY2lmaWVkIGFuZCB0aGUgRU5HSU5FIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZC4gVGhlIHN5bnRheCBmb3IKICAgICAgIHRoZSBpbmRpdmlkdWFsIGNvbW1hbmRzIGFyZSBjb2xvbi1zZXBhcmF0ZWQsIGZvciBleGFtcGxlOwoJIG9wZW5zc2wgZW5naW5lIGNoaWwgLXByZSBGT1JLX0NIRUNLOjAgLXByZSBTT19QQVRIOi9saWIvdGVzdC5zbwogICAgIFtHZW9mZl0KCiAgKikgTmV3IGR5bmFtaWMgY29udHJvbCBjb21tYW5kIHN1cHBvcnQgZm9yIEVOR0lORXMuIEVOR0lORXMgY2FuIG5vdwogICAgIGRlY2xhcmUgdGhlaXIgb3duIGNvbW1hbmRzIChudW1iZXJzKSwgbmFtZXMgKHN0cmluZ3MpLCBkZXNjcmlwdGlvbnMsCiAgICAgYW5kIGlucHV0IHR5cGVzIGZvciBydW4tdGltZSBkaXNjb3ZlcnkgYnkgY2FsbGluZyBhcHBsaWNhdGlvbnMuIEEKICAgICBzdWJzZXQgb2YgdGhlc2UgY29tbWFuZHMgYXJlIGltcGxpY2l0bHkgY2xhc3NlZCBhcyAiZXhlY3V0YWJsZSIKICAgICBkZXBlbmRpbmcgb24gdGhlaXIgaW5wdXQgdHlwZSwgYW5kIG9ubHkgdGhlc2UgY2FuIGJlIGludm9rZWQgdGhyb3VnaAogICAgIHRoZSBuZXcgc3RyaW5nLWJhc2VkIEFQSSBmdW5jdGlvbiBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCkuIChFZy4gdGhpcwogICAgIGNhbiBiZSBiYXNlZCBvbiB1c2VyIGlucHV0LCBjb25maWcgZmlsZXMsIGV0YykuIFRoZSBkaXN0aW5jdGlvbiBpcwogICAgIHRoYXQgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGNhbm5vdCByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiBhIGJvb2xlYW4KICAgICByZXN1bHQgYW5kIGNhbiBvbmx5IHN1cHBvcnQgbnVtZXJpYyBvciBzdHJpbmcgaW5wdXQsIHdoZXJlYXMgc29tZQogICAgIGRpc2NvdmVyYWJsZSBjb21tYW5kcyBtYXkgb25seSBiZSBmb3IgZGlyZWN0IHVzZSB0aHJvdWdoCiAgICAgRU5HSU5FX2N0cmwoKSwgZWcuIHN1cHBvcnRpbmcgdGhlIGV4Y2hhbmdlIG9mIGJpbmFyeSBkYXRhLCBmdW5jdGlvbgogICAgIHBvaW50ZXJzLCBvciBvdGhlciBjdXN0b20gdXNlcy4gVGhlICJleGVjdXRhYmxlIiBjb21tYW5kcyBhcmUgdG8KICAgICBzdXBwb3J0IHBhcmFtZXRlcmlzYXRpb25zIG9mIEVOR0lORSBiZWhhdmlvdXIgdGhhdCBjYW4gYmUKICAgICB1bmFtYmlndW91c2x5IGRlZmluZWQgYnkgRU5HSU5FcyBhbmQgdXNlZCBjb25zaXN0ZW50bHkgYWNyb3NzIGFueQogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb24uIENvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGwgdGhlCiAgICAgZXhpc3RpbmcgaGFyZHdhcmUtc3VwcG9ydGluZyBFTkdJTkVzLCBub3RpY2VhYmx5ICJTT19QQVRIIiB0byBhbGxvdwogICAgIGNvbnRyb2wgb3ZlciBzaGFyZWQtbGlicmFyeSBwYXRocyB3aXRob3V0IHNvdXJjZSBjb2RlIGFsdGVyYXRpb25zLgogICAgIFtHZW9mZl0KCiAgKikgQ2hhbmdlZCBhbGwgRU5HSU5FIGltcGxlbWVudGF0aW9ucyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGVpcgogICAgIEVOR0lORXMgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIHRoZW0gc3RhdGljYWxseS4gQXBhcnQgZnJvbSB0aGlzIGJlaW5nCiAgICAgbmVjZXNzYXJ5IHdpdGggdGhlIHJlbW92YWwgb2YgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkaXN0aW5jdGlvbiwKICAgICB0aGlzIGFsc28gYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbnMgdG8gY29tcGlsZSB3aXRob3V0IHVzaW5nIHRoZQogICAgIGludGVybmFsIGVuZ2luZV9pbnQuaCBoZWFkZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBNaW5vciBhZGp1c3RtZW50IHRvICJyYW5kIiBjb2RlLiBSQU5EX2dldF9yYW5kX21ldGhvZCgpIG5vdyByZXR1cm5zIGEKICAgICAnY29uc3QnIHZhbHVlLiBBbnkgY29kZSB0aGF0IHNob3VsZCBiZSBhYmxlIHRvIG1vZGlmeSBhIFJBTkRfTUVUSE9ECiAgICAgc2hvdWxkIGFscmVhZHkgaGF2ZSBub24tY29uc3QgcG9pbnRlcnMgdG8gaXQgKGllLiB0aGV5IHNob3VsZCBvbmx5CiAgICAgbW9kaWZ5IHRoZWlyIG93biBvbmVzKS4KICAgICBbR2VvZmZdCgogICopIE1hZGUgYSB2YXJpZXR5IG9mIGxpdHRsZSB0d2Vha3MgdG8gdGhlIEVOR0lORSBjb2RlLgogICAgIC0gImF0YWxsYSIgYW5kICJ1YnNlYyIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbSBoZWFkZXIgZmlsZXMKICAgICAgIHRvIEMgY29kZS4gIm51cm9uIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBwbGFjZWQgaW4gdmFyaWFibGVzCiAgICAgICByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIC0gYWxsb3dpbmcgcGFyYW1ldGVyaXNhdGlvbiBvZiB0aGVzZSB2YWx1ZXMKICAgICAgIGxhdGVyIG9uIHZpYSBjdHJsKCkgY29tbWFuZHMuCiAgICAgLSBSZW1vdmVkIHVudXNlZCAiI2lmIDAiJ2QgY29kZS4KICAgICAtIEZpeGVkIGVuZ2luZSBsaXN0IGl0ZXJhdGlvbiBjb2RlIHNvIGl0IHVzZXMgRU5HSU5FX2ZyZWUoKSB0byByZWxlYXNlCiAgICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZXMuCiAgICAgLSBDb25zdGlmaWVkIHRoZSBSQU5EX01FVEhPRCBlbGVtZW50IG9mIEVOR0lORSBzdHJ1Y3R1cmVzLgogICAgIC0gQ29uc3RpZmllZCB2YXJpb3VzIGdldC9zZXQgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlIGFuZCBhZGRlZAogICAgICAgbWlzc2luZyBmdW5jdGlvbnMgKGluY2x1ZGluZyBhIGNhdGNoLWFsbCBFTkdJTkVfY3B5IHRoYXQgZHVwbGljYXRlcwogICAgICAgYWxsIEVOR0lORSB2YWx1ZXMgb250byBhIG5ldyBFTkdJTkUgZXhjZXB0IHJlZmVyZW5jZSBjb3VudHMvc3RhdGUpLgogICAgIC0gUmVtb3ZlZCBOVUxMIHBhcmFtZXRlciBjaGVja3MgaW4gZ2V0L3NldCBmdW5jdGlvbnMuIFNldHRpbmcgYSBtZXRob2QKICAgICAgIG9yIGZ1bmN0aW9uIHRvIE5VTEwgaXMgYSB3YXkgb2YgY2FuY2VsbGluZyBvdXQgYSBwcmV2aW91c2x5IHNldAogICAgICAgdmFsdWUuICBQYXNzaW5nIGEgTlVMTCBFTkdJTkUgcGFyYW1ldGVyIGlzIGp1c3QgcGxhaW4gc3R1cGlkIGFueXdheQogICAgICAgYW5kIGRvZXNuJ3QganVzdGlmeSB0aGUgZXh0cmEgZXJyb3Igc3ltYm9scyBhbmQgY29kZS4KICAgICAtIERlcHJlY2F0ZSB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRlZmluZSBhbmQgbW92ZSB0aGUgYXJlYSBmb3IKICAgICAgIGZsYWdzIGZyb20gZW5naW5lX2ludC5oIHRvIGVuZ2luZS5oLgogICAgIC0gQ2hhbmdlZCBwcm90b3R5cGVzIGZvciBFTkdJTkUgaGFuZGxlciBmdW5jdGlvbnMgKGluaXQoKSwgZmluaXNoKCksCiAgICAgICBjdHJsKCksIGtleS1sb2FkIGZ1bmN0aW9ucywgZXRjKSB0byB0YWtlIGFuIChFTkdJTkUqKSBwYXJhbWV0ZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBJbXBsZW1lbnQgYmluYXJ5IGludmVyc2lvbiBhbGdvcml0aG0gZm9yIEJOX21vZF9pbnZlcnNlIGluIGFkZGl0aW9uCiAgICAgdG8gdGhlIGFsZ29yaXRobSB1c2luZyBsb25nIGRpdmlzaW9uLiAgVGhlIGJpbmFyeSBhbGdvcml0aG0gY2FuIGJlCiAgICAgdXNlZCBvbmx5IGlmIHRoZSBtb2R1bHVzIGlzIG9kZC4gIE9uIDMyLWJpdCBzeXN0ZW1zLCBpdCBpcyBmYXN0ZXIKICAgICBvbmx5IGZvciByZWxhdGl2ZWx5IHNtYWxsIG1vZHVsaSAocm91Z2hseSAyMC0zMCUgZm9yIDEyOC1iaXQgbW9kdWxpLAogICAgIHJvdWdobHkgNS0xNSUgZm9yIDI1Ni1iaXQgbW9kdWxpKSwgc28gd2UgdXNlIGl0IG9ubHkgZm9yIG1vZHVsaQogICAgIHVwIHRvIDQ1MCBiaXRzLiAgSW4gNjQtYml0IGVudmlyb25tZW50cywgdGhlIGJpbmFyeSBhbGdvcml0aG0KICAgICBhcHBlYXJzIHRvIGJlIGFkdmFudGFnZW91cyBmb3IgbXVjaCBsb25nZXIgbW9kdWxpOyBoZXJlIHdlIHVzZSBpdAogICAgIGZvciBtb2R1bGkgdXAgdG8gMjA0OCBiaXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgQ0hPSUNFIGZpZWxkIHNldHRpbmcgaW4gQVNOMV9pdGVtX2V4X2QyaSgpLiBUaGUgb2xkIGNvZGUKICAgICBjb3VsZCBub3Qgc3VwcG9ydCB0aGUgY29tYmluZSBmbGFnIGluIGNob2ljZSBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJ2NvcHlfZXh0ZW5zaW9ucycgb3B0aW9uIHRvIHRoZSAnY2EnIHV0aWxpdHkuIFRoaXMgY29waWVzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdCB0byB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgJ2NlcnRvcHQnIGFuZCAnbmFtZW9wdCcgb3B0aW9ucyB0byBiZSBzZXBhcmF0ZWQKICAgICBieSBjb21tYXMuIEFkZCAnbmFtb3B0JyBhbmQgJ2NlcnRvcHQnIG9wdGlvbnMgdG8gdGhlICdjYScgY29uZmlnCiAgICAgZmlsZTogdGhpcyBhbGxvd3MgdGhlIGRpc3BsYXkgb2YgdGhlIGNlcnRpZmljYXRlIGFib3V0IHRvIGJlCiAgICAgc2lnbmVkIHRvIGJlIGN1c3RvbWlzZWQsIHRvIGFsbG93IGNlcnRhaW4gZmllbGRzIHRvIGJlIGluY2x1ZGVkCiAgICAgb3IgZXhjbHVkZWQgYW5kIGV4dGVuc2lvbiBkZXRhaWxzLiBUaGUgb2xkIHN5c3RlbSBkaWRuJ3QgZGlzcGxheQogICAgIG11bHRpY2hhcmFjdGVyIHN0cmluZ3MgcHJvcGVybHksIG9taXR0ZWQgZmllbGRzIG5vdCBpbiB0aGUgcG9saWN5CiAgICAgYW5kIGNvdWxkbid0IGRpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIHN1Y2ggYXMgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBFQ19QT0lOVHNfbXVsIGZvciBtdWx0aXBsZSBzY2FsYXIgbXVsdGlwbGljYXRpb24KICAgICBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsbGlwdGljIGN1cnZlIHBvaW50cwogICAgICAgICAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXSwKICAgICBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgZ2VuZXJhdG9yIGRlZmluZWQgZm9yIHRoZSBFQ19HUk9VUDoKICAgICAgICAgIHNjYWxhcipnZW5lcmF0b3IgKyAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXS4KCiAgICAgRUNfUE9JTlRfbXVsIGlzIGEgc2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSB0eXBpY2FsIGNhc2UKICAgICB0aGF0IHRoZSBwb2ludCBsaXN0IGhhcyBqdXN0IG9uZSBpdGVtIChiZXNpZGVzIHRoZSBvcHRpb25hbAogICAgIGdlbmVyYXRvcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRmlyc3QgRUNfTUVUSE9EcyBmb3IgY3VydmVzIG92ZXIgR0YocCk6CgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kKCkgdXNlcyB0aGUgYmFzaWMgQk5fbW9kX211bCBhbmQgQk5fbW9kX3NxcgogICAgIG9wZXJhdGlvbnMgYW5kIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kIGZ1bmN0aW9ucyB0aGF0IGNhbiBhbHNvCiAgICAgb3BlcmF0ZSB3aXRoIGZhc3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgbW9kdWxhciBhcml0aG1ldGljLiAgICAgCgogICAgIEVDX0dGcF9tb250X21ldGhvZCgpIHJldXNlcyBtb3N0IGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QsIGJ1dCB1c2VzIE1vbnRnb21lcnkgYXJpdGhtZXRpYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnQgYWRkaXRpb24gYW5kIHBvaW50IGRvdWJsaW5nCiAgICAgaW1wbGVtZW50YXRpb24gZGlyZWN0bHkgZGVyaXZlZCBmcm9tIHNvdXJjZSBjb2RlIHByb3ZpZGVkIGJ5CiAgICAgTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT5dCgogICopIEZyYW1ld29yayBmb3IgZWxsaXB0aWMgY3VydmVzIChjcnlwdG8vZWMvZWMuaCwgY3J5cHRvL2VjL2VjX2xjbC5oLAogICAgIGNyeXB0by9lYy9lY19saWIuYyk6CgogICAgIEN1cnZlcyBhcmUgRUNfR1JPVVAgb2JqZWN0cyAod2l0aCBhbiBvcHRpb25hbCBncm91cCBnZW5lcmF0b3IpCiAgICAgYmFzZWQgb24gRUNfTUVUSE9EcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgoKICAgICBQb2ludHMgYXJlIEVDX1BPSU5UIG9iamVjdHMgYmFzZWQgb24gRUNfR1JPVVAgb2JqZWN0cy4KCiAgICAgTW9zdCBvZiB0aGUgZnJhbWV3b3JrIHdvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGN1cnZlcyBvdmVyIGFyYml0cmFyeQogICAgIGZpbml0ZSBmaWVsZHMsIGJ1dCBhcyB0aGVyZSBhcmUgbm8gb2J2aW91cyB0eXBlcyBmb3IgZmllbGRzIG90aGVyCiAgICAgdGhhbiBHRihwKSwgc29tZSBmdW5jdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhhdCBmb3Igbm93LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgLUhUVFAgb3B0aW9uIHRvIHNfc2VydmVyLiAgSXQgaXMgc2ltaWxhciB0byAtV1dXLCBidXQgcmVxdWlyZXMKICAgICB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zIGEgY29tcGxldGUgSFRUUCByZXNwb25zZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGVjIGRpcmVjdG9yeSB0byBta2RlZi5wbCBhbmQgbWtmaWxlcy5wbC4gSW4gbWtkZWYucGwKICAgICBjaGFuZ2UgdGhlIGRlZiBhbmQgbnVtIGZpbGUgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIgZnJvbSAiJS00MHNYWFgiCiAgICAgdG8gIiUtMzlzIFhYWCIuIFRoZSBsYXR0ZXIgd2lsbCBhbHdheXMgZ3VhcmFudGVlIGEgc3BhY2UgYWZ0ZXIgdGhlCiAgICAgZmllbGQgd2hpbGUgdGhlIGZvcm1lciB3aWxsIGNhdXNlIHRoZW0gdG8gcnVuIHRvZ2V0aGVyIGlmIHRoZSBmaWVsZAogICAgIGlzIDQwIG9mIG1vcmUgY2hhcmFjdGVycyBsb25nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IHRoZSBjaXBoZXIgYW5kIGRpZ2VzdCAnbWV0aG9kJyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKICAgICBhbmQgbW9kaWZ5IHJlbGF0ZWQgZnVuY3Rpb25zIHRvIHRha2UgY29uc3RhbnQgRVZQX01EIGFuZCBFVlBfQ0lQSEVSCiAgICAgcG9pbnRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGlkZSBCTl9DVFggc3RydWN0dXJlIGRldGFpbHMgaW4gYm5fbGNsLmggaW5zdGVhZCBvZiBwdWJsaXNoaW5nIHRoZW0KICAgICBpbiA8b3BlbnNzbC9ibi5oPi4gIEFsc28gZnVydGhlciBpbmNyZWFzZSBCTl9DVFhfTlVNIHRvIDMyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vZGlmeSBFVlBfRGlnZXN0KigpIHJvdXRpbmVzIHNvIHRoZXkgbm93IHJldHVybiB2YWx1ZXMuIEFsdGhvdWdoIHRoZQogICAgIGludGVybmFsIHNvZnR3YXJlIHJvdXRpbmVzIGNhbiBuZXZlciBmYWlsIGFkZGl0aW9uYWwgaGFyZHdhcmUgdmVyc2lvbnMKICAgICBtaWdodC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCBjcnlwdG8vZXJyL2Vyci5oIGFuZCBjaGFuZ2Ugc29tZSBlcnJvciBjb2RlcyB0byBhdm9pZCBjb25mbGljdHM6CgogICAgIFByZXZpb3VzbHkgRVJSX1JfRkFUQUwgd2FzIHRvbyBzbWFsbCBhbmQgY29pbmNpZGVkIHdpdGggRVJSX0xJQl9QS0NTNwogICAgICg9IEVSUl9SX1BLQ1M3X0xJQik7IGl0IGlzIG5vdyA2NCBpbnN0ZWFkIG9mIDMyLgoKICAgICBBU04xIGVycm9yIGNvZGVzCiAgICAgICAgICBFUlJfUl9ORVNURURfQVNOMV9FUlJPUgogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfUl9NSVNTSU5HX0FTTjFfRU9TCiAgICAgd2VyZSA0IC4uIDksIGNvbmZsaWN0aW5nIHdpdGgKICAgICAgICAgIEVSUl9MSUJfUlNBICg9IEVSUl9SX1JTQV9MSUIpCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9MSUJfUEVNICg9IEVSUl9SX1BFTV9MSUIpLgogICAgIFRoZXkgYXJlIG5vdyA1OCAuLiA2MyAoaS5lLiwganVzdCBiZWxvdyBFUlJfUl9GQVRBTCkuCgogICAgIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfSU5URVJOQUxfRVJST1InLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IG92ZXJ1c2UgbG9ja3MgaW4gY3J5cHRvL2Vyci9lcnIuYzogRm9yIGRhdGEgcmV0cmlldmFsLCBDUllQVE9fcl9sb2NrCiAgICAgc3VmZmljZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wdGlvbiAnLXN1YmogYXJnJyBmb3IgJ29wZW5zc2wgcmVxJyBhbmQgJ29wZW5zc2wgY2EnLiAgVGhpcwogICAgIHNldHMgdGhlIHN1YmplY3QgbmFtZSBmb3IgYSBuZXcgcmVxdWVzdCBvciBzdXBlcnNlZGVzIHRoZQogICAgIHN1YmplY3QgbmFtZSBpbiBhIGdpdmVuIHJlcXVlc3QuIEZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkIGFyZQogICAgICAgICAgJ0NOPVNvbWUgTmFtZSwgT1U9bXlPVSwgQz1JVCcKICAgICBhbmQKICAgICAgICAgICdDTj1Tb21lIE5hbWUvT1U9bXlPVS9DPUlUJy4KCiAgICAgQWRkIG9wdGlvbnMgJy1iYXRjaCcgYW5kICctdmVyYm9zZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAaGFja21hc3RlcnMubmV0Pl0KCiAgKikgSW50cm9kdWNlIHRoZSBwb3NzaWJpbGl0eSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyB0aHJvdWdoCiAgICAgZnVuY3Rpb25zIG9uIHBsYXRmb3JtIHdlcmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBoYW5kbGUgZXhwb3J0aW5nCiAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiBzaGFyZWQgbGlicmFyaWVzLiAgVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwKICAgICBvbmUgbXVzdCBjb25maWd1cmUgd2l0aCAiRVhQT1JUX1ZBUl9BU19GTiIgb3IgZGVmaW5lZCB0aGUgQyBtYWNybwogICAgICJPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04iIGluIGNyeXB0by9vcGVuc3NsY29uZi5oICh0aGUgbGF0dGVyCiAgICAgaXMgbm9ybWFsbHkgZG9uZSBieSBDb25maWd1cmUgb3Igc29tZXRoaW5nIHNpbWlsYXIpLgoKICAgICBUbyBpbXBsZW1lbnQgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm8gT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMCiAgICAgaW4gdGhlIHNvdXJjZSBmaWxlIChmb28uYykgbGlrZSB0aGlzOgoKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsZm9vKT0xOwoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGRvdWJsZSxiYXIpOwoKICAgICBUbyBkZWNsYXJlIGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvcyBPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMCiAgICAgYW5kIE9QRU5TU0xfR0xPQkFMX1JFRiBpbiB0aGUgaGVhZGVyIGZpbGUgKGZvby5oKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsZm9vKTsKCSNkZWZpbmUgZm9vIE9QRU5TU0xfR0xPQkFMX1JFRihmb28pCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGRvdWJsZSxiYXIpOwoJI2RlZmluZSBiYXIgT1BFTlNTTF9HTE9CQUxfUkVGKGJhcikKCiAgICAgVGhlICNkZWZpbmVzIGFyZSB2ZXJ5IGltcG9ydGFudCwgYW5kIHRoZXJlZm9yZSBzbyBpcyBpbmNsdWRpbmcgdGhlCiAgICAgaGVhZGVyIGZpbGUgZXZlcnl3aGVyZSB3aGVyZSB0aGUgZGVmaW5lZCBnbG9iYWxzIGFyZSB1c2VkLgoKICAgICBUaGUgbWFjcm8gT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIGFsc28gYWZmZWN0cyB0aGUgZGVmaW5pdGlvbgogICAgIG9mIEFTTi4xIGl0ZW1zLCBidXQgdGhhdCBzdHJ1Y3R1cmUgaXMgYSBiaXQgZGlmZmVyZW50LgoKICAgICBUaGUgbGFyZ2VzdCBjaGFuZ2UgaXMgaW4gdXRpbC9ta2RlZi5wbCB3aGljaCBoYXMgYmVlbiBlbmhhbmNlZCB3aXRoCiAgICAgYmV0dGVyIGFuZCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBsb2dpYyB0byBjaG9vc2Ugd2hpY2ggc3ltYm9scyBzaG91bGQKICAgICBnbyBpbnRvIHRoZSBXaW5kb3dzIC5kZWYgZmlsZXMgYXMgd2VsbCBhcyBhIG51bWJlciBvZiBmaXhlcyBhbmQgY29kZQogICAgIGNsZWFudXAgKGFtb25nIG90aGVycywgYWxnb3JpdGhtIGtleXdvcmRzIGFyZSBub3cgc29ydGVkCiAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gYXZvaWQgY29uc3RhbnQgcmV3cml0ZXMpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIEJOX2RpdigpIGtlZXAgYSBjb3B5IG9mIHRoZSBzaWduIG9mICdudW0nIGJlZm9yZSB3cml0aW5nIHRoZQogICAgIHJlc3VsdCB0byAncm0nIGJlY2F1c2UgaWYgcm09PW51bSB0aGUgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgIGFuZCBwcm9kdWNlIHRoZSB3cm9uZyByZXN1bHQgaWYgJ251bScgaXMgbmVnYXRpdmU6IHRoaXMgY2F1c2VkCiAgICAgcHJvYmxlbXMgd2l0aCBCTl9tb2QoKSBhbmQgQk5fbm5tb2QoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBPQ1NQX3JlcXVlc3RfdmVyaWZ5KCkuIFRoaXMgY2hlY2tzIHRoZSBzaWduYXR1cmUgb24gYW4KICAgICBPQ1NQIHJlcXVlc3QgYW5kIHZlcmlmaWVzIHRoZSBzaWduZXIgY2VydGlmaWNhdGUuIFRoZSBzaWduZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyBqdXN0IGNoZWNrZWQgZm9yIGEgZ2VuZXJpYyBwdXJwb3NlIGFuZCBPQ1NQIHJlcXVlc3QKICAgICB0cnVzdCBzZXR0aW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0NTUF9jaGVja192YWxpZGl0eSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBPQ1NQCiAgICAgcmVzcG9uc2VzLiBPQ1NQIHJlc3BvbnNlcyBhcmUgcHJlcGFyZWQgaW4gcmVhbCB0aW1lIGFuZCBtYXkgb25seQogICAgIGJlIGEgZmV3IHNlY29uZHMgb2xkLiBTaW1wbHkgY2hlY2tpbmcgdGhhdCB0aGUgY3VycmVudCB0aW1lIGxpZXMKICAgICBiZXR3ZWVuIHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgbWF4IHJlamVjdCBvdGhlcndpc2UgdmFsaWQgcmVzcG9uc2VzCiAgICAgY2F1c2VkIGJ5IGVpdGhlciBPQ1NQIHJlc3BvbmRlciBvciBjbGllbnQgY2xvY2sgaW5hY2N1cmFjeS4gSW5zdGVhZAogICAgIHdlIGFsbG93IHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgdG8gZmFsbCB3aXRoaW4gYSBjZXJ0YWluIHBlcmlvZCBvZgogICAgIHRoZSBjdXJyZW50IHRpbWUuIFRoZSBhZ2Ugb2YgdGhlIHJlc3BvbnNlIGNhbiBhbHNvIG9wdGlvbmFsbHkgYmUKICAgICBjaGVja2VkLiBUd28gbmV3IG9wdGlvbnMgLXZhbGlkaXR5X3BlcmlvZCBhbmQgLXN0YXR1c19hZ2UgYWRkZWQgdG8KICAgICBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2lnbmF0dXJlIG9yIHB1YmxpYyBrZXkgYWxnb3JpdGhtIGlzIHVucmVjb2duaXplZCBwcmludCBvdXQgaXRzCiAgICAgT0lEIHJhdGhlciB0aGF0IGp1c3QgVU5LTk9XTi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgT0NTUF9jZXJ0X3RvX2lkKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHN1YmplY3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUF9jZXJ0X2lkX25ldygpIGEgTlVMTCBzZXJpYWxOdW1iZXIuIFRoaXMgYWxsb3dzIGEgcGFydGlhbCBjZXJ0aWZpY2F0ZQogICAgIElEIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBpc3N1ZXIgY2VydGlmaWNhdGUgYWxvbmUgd2hpY2ggY2FuIHRoZW4gYmUKICAgICBwYXNzZWQgdG8gT0NTUF9pZF9pc3N1ZXJfY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNvbXBpbGF0aW9uIG9wdGlvbiBBU04xX0lURU1fRlVOQ1RJT05TLiBUaGlzIGNhdXNlcyB0aGUgbmV3CiAgICAgQVNOMSBtb2R1bGVzIHRvIGV4cG9ydCBmdW5jdGlvbnMgcmV0dXJuaW5nIEFTTjFfSVRFTSBwb2ludGVycwogICAgIGluc3RlYWQgb2YgdGhlIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIHRoZW1zZWx2ZXMuIFRoaXMgYWRkcyBzZXZlcmFsCiAgICAgbmV3IG1hY3JvcyB3aGljaCBhbGxvdyB0aGUgdW5kZXJseWluZyBBU04xIGZ1bmN0aW9uL3N0cnVjdHVyZSB0bwogICAgIGJlIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkuIEFzIGEgcmVzdWx0IGNvZGUgc2hvdWxkIG5vdCB1c2UgQVNOMV9JVEVNCiAgICAgcmVmZXJlbmNlcyBkaXJlY3RseSAoc3VjaCBhcyAmWDUwOV9pdCkgYnV0IGluc3RlYWQgdXNlIHRoZSByZWxldmFudAogICAgIG1hY3JvcyAoc3VjaCBhcyBBU04xX0lURU1fcnB0cihYNTA5KSkuIFRoaXMgb3B0aW9uIGlzIHRvIGFsbG93CiAgICAgdXNlIG9mIHRoZSBuZXcgQVNOMSBjb2RlIG9uIHBsYXRmb3JtcyB3aGVyZSBleHBvcnRpbmcgc3RydWN0dXJlcwogICAgIGlzIHByb2JsZW1hdGljYWwgKGZvciBleGFtcGxlIGluIHNoYXJlZCBsaWJyYXJpZXMpIGJ1dCBleHBvcnRpbmcKICAgICBmdW5jdGlvbnMgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgaXMgbm90LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIFNTTC9UTFMgc2Vzc2lvbiBJRHMuCiAgICAgVGhlc2UgY2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIGVpdGhlciBpbiBhbiBTU0xfQ1RYIG9yIHBlciBTU0wuCiAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCwgaWYgdGhleSB3aXNoLAogICAgIHRoZSBhcmJpdHJhcnkgdmFsdWVzIGNob3NlbiBmb3IgdXNlIGFzIHNlc3Npb24gSURzLCBwYXJ0aWN1bGFybHkgYXMgaXQKICAgICBjYW4gYmUgdXNlZnVsIGZvciBzZXNzaW9uIGNhY2hpbmcgaW4gbXVsdGlwbGUtc2VydmVyIGVudmlyb25tZW50cy4gQQogICAgIGNvbW1hbmQtbGluZSBzd2l0Y2ggZm9yIHRlc3RpbmcgdGhpcyAoYW5kIGFueSBjbGllbnQgY29kZSB0aGF0IHdpc2hlcwogICAgIHRvIHVzZSBzdWNoIGEgZmVhdHVyZSkgaGFzIGJlZW4gYWRkZWQgdG8gInNfc2VydmVyIi4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBNb2RpZnkgbWtkZWYucGwgdG8gcmVjb2duaXNlIGFuZCBwYXJzZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCiAgICAgb2YgdGhlIGZvcm0gJyNpZiBkZWZpbmVkKC4uLikgfHwgZGVmaW5lZCguLi4pIHx8IC4uLicgYW5kCiAgICAgJyNpZiAhZGVmaW5lZCguLi4pICYmICFkZWZpbmVkKC4uLikgJiYgLi4uJy4gIFRoaXMgYWxzbyBhdm9pZHMKICAgICB0aGUgZ3Jvd2luZyBudW1iZXIgb2Ygc3BlY2lhbCBjYXNlcyBpdCB3YXMgcHJldmlvdXNseSBoYW5kbGluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGFsbCBjb25maWd1cmF0aW9uIG1hY3JvcyBhdmFpbGFibGUgZm9yIGFwcGxpY2F0aW9uIGJ5IG1ha2luZwogICAgIHN1cmUgdGhleSBhcmUgYXZhaWxhYmxlIGluIG9wZW5zc2xjb25mLmgsIGJ5IGdpdmluZyB0aGVtIG5hbWVzIHN0YXJ0aW5nCiAgICAgd2l0aCAiT1BFTlNTTF8iIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzIGFuZCBieSBtYWtpbmcKICAgICBzdXJlIGVfb3MyLmggd2lsbCBjb3ZlciBhbGwgcGxhdGZvcm0tc3BlY2lmaWMgY2FzZXMgdG9nZXRoZXIgd2l0aAogICAgIG9wZW5zc2xjb25mLmguCiAgICAgQWRkaXRpb25hbGx5LCBpdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGNvbmZpZ3VyYXRpb24vcGxhdGZvcm0tCiAgICAgc3BlY2lmaWMgbmFtZXMgKGNhbGxlZCAic3lzdGVtIGlkZW50aXRpZXMiKS4gIEluIHRoZSBDIGNvZGUsIHRoZXNlCiAgICAgYXJlIHByZWZpeGVkIHdpdGggIk9QRU5TU0xfU1lTTkFNRV8iLiAgZV9vczIuaCB3aWxsIGNyZWF0ZSBhbm90aGVyCiAgICAgbWFjcm8gd2l0aCB0aGUgbmFtZSBiZWdpbm5pbmcgd2l0aCAiT1BFTlNTTF9TWVNfIiwgd2hpY2ggaXMgZGV0ZXJtaW5lZAogICAgIGZyb20gIk9QRU5TU0xfU1lTTkFNRV8qIiBvciBjb21waWxlci1zcGVjaWZpYyBtYWNyb3MgZGVwZW5kaW5nIG9uCiAgICAgd2hhdCBpcyBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IG9wdGlvbiAtc2V0X3NlcmlhbCB0byAncmVxJyBhbmQgJ3g1MDknIHRoaXMgYWxsb3dzIHRoZSBzZXJpYWwKICAgICBudW1iZXIgdG8gdXNlIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBQcmV2aW91c2x5IHNlbGYKICAgICBzaWduZWQgY2VydGlmaWNhdGVzIHdlcmUgaGFyZCBjb2RlZCB3aXRoIHNlcmlhbCBudW1iZXIgMCBhbmQgdGhlIAogICAgIENBIG9wdGlvbnMgb2YgJ3g1MDknIGhhZCB0byB1c2UgYSBzZXJpYWwgbnVtYmVyIGluIGEgZmlsZSB3aGljaCB3YXMKICAgICBhdXRvIGluY3JlbWVudGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvICdjYScgdXRpbGl0eSB0byBzdXBwb3J0IFYyIENSTCBlbnRyeSBleHRlbnNpb25zLgogICAgIEN1cnJlbnRseSBDUkwgcmVhc29uLCBpbnZhbGlkaXR5IGRhdGUgYW5kIGhvbGQgaW5zdHJ1Y3Rpb24gYXJlCiAgICAgc3VwcG9ydGVkLiBBZGQgbmV3IENSTCBleHRlbnNpb25zIHRvIFYzIGNvZGUgYW5kIHNvbWUgbmV3IG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCkgdGhpcyBpcyB1c2VkIHRvCiAgICAgZGlzYWJsZSBzdGFuZGFyZCBibG9jayBwYWRkaW5nIChha2EgUEtDUyM1IHBhZGRpbmcpIGluIHRoZSBFVlAKICAgICBBUEksIHdoaWNoIHdhcyBwcmV2aW91c2x5IG1hbmRhdG9yeS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIGlzCiAgICAgbm90IHBhZGRlZCBpbiBhbnkgd2F5IGFuZCBzbyB0aGUgdG90YWwgbGVuZ3RoIG11Y2ggYmUgYSBtdWx0aXBsZQogICAgIG9mIHRoZSBibG9jayBzaXplLCBvdGhlcndpc2UgYW4gZXJyb3Igb2NjdXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgKGluY29tcGxldGUpIE9DU1AgU1NMIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfcGFyc2VfdXJsKCkuIFRoaXMgc3BsaXRzIHVwIGEgVVJMIGludG8gaXRzIGhvc3QsCiAgICAgcG9ydCBhbmQgcGF0aCBjb21wb25lbnRzOiBwcmltYXJpbHkgdG8gcGFyc2UgT0NTUCBVUkxzLiBOZXcgLXVybAogICAgIG9wdGlvbiB0byBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG5vbmNlIGJlaGF2aW9yLiBUaGUgcmV0dXJuIHZhbHVlIG9mIE9DU1BfY2hlY2tfbm9uY2UoKSBub3cgCiAgICAgcmVmbGVjdHMgdGhlIHZhcmlvdXMgY2hlY2tzIHBlcmZvcm1lZC4gQXBwbGljYXRpb25zIGNhbiBkZWNpZGUKICAgICB3aGV0aGVyIHRvIHRvbGVyYXRlIGNlcnRhaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGFuIGFic2VudCBub25jZQogICAgIGluIGEgcmVzcG9uc2Ugd2hlbiBvbmUgd2FzIHByZXNlbnQgaW4gYSByZXF1ZXN0OiB0aGUgb2NzcCBhcHBsaWNhdGlvbgogICAgIGp1c3QgcHJpbnRzIG91dCBhIHdhcm5pbmcuIE5ldyBmdW5jdGlvbiBPQ1NQX2FkZDFfYmFzaWNfbm9uY2UoKQogICAgIHRoaXMgaXMgdG8gYWxsb3cgcmVzcG9uZGVycyB0byBpbmNsdWRlIGEgbm9uY2UgaW4gYSByZXNwb25zZSBldmVuIGlmCiAgICAgdGhlIHJlcXVlc3QgaXMgbm9uY2UtbGVzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIHN0ZGluIGJ1ZmZlcmluZyBpbiBsb2FkX2NlcnQgKGFwcHMvYXBwcy5jKSBzbyB0aGF0IG5vIGNlcnRzIGFyZQogICAgIHNraXBwZWQgd2hlbiB1c2luZyBvcGVuc3NsIHg1MDkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgaW5wdXQgZmlsZSwKICAgICBlLmcuICIob3BlbnNzbCB4NTA5IC1vdXQgY2VydDE7IG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQyKSA8Y2VydHMiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoKSBhbmQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0X3N0cmluZygpCiAgICAgc2V0IHN0cmluZyB0eXBlOiB0byBoYW5kbGUgc2V0dGluZyBBU04xX1RJTUUgc3RydWN0dXJlcy4gRml4IGNhCiAgICAgdXRpbGl0eSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSByZXZvY2F0aW9uIGRhdGUgb2YgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3ZlcnJpZGUKICAgICB0aGUgY2xpZW50cyBwcmVmZXJyZWQgY2lwaGVyc3VpdGVzIGFuZCByYXRoZXIgdXNlIGl0cyBvd24gcHJlZmVyZW5jZXMuCiAgICAgU2hvdWxkIGhlbHAgdG8gd29yayBhcm91bmQgTSQgU0dDIChTZXJ2ZXIgR2F0ZWQgQ3J5cHRvZ3JhcGh5KSBidWcgaW4KICAgICBJbnRlcm5ldCBFeHBsb3JlciBieSBlbnN1cmluZyB1bmNoYW5nZWQgaGFzaCBtZXRob2QgZHVyaW5nIHN0ZXB1cC4KICAgICAoQWxzbyByZXBsYWNlcyB0aGUgYnJva2VuL2RlYWN0aXZhdGVkIFNTTF9PUF9OT05fRVhQT1JUX0ZJUlNUIG9wdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2UgbWtkZWYucGwgcmVjb2duaXNlIGFsbCBERUNMQVJFX0FTTjEgbWFjcm9zLCBjaGFuZ2UgcmlqbmRhZWwKICAgICB0byBhZXMgYW5kIGFkZCBhIG5ldyAnZXhpc3QnIG9wdGlvbiB0byBwcmludCBvdXQgc3ltYm9scyB0aGF0IGRvbid0CiAgICAgYXBwZWFyIHRvIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBvY3NwIHV0aWxpdHkgdG8gYWxsb3cgZmxhZ3MgdG8gYmUgc2V0IGFuZAogICAgIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgb3B0aW9uIC1WQWZpbGUgdG8gJ29wZW5zc2wgb2NzcCcsIHNvIHRoZSB1c2VyIGNhbiBnaXZlIHRoZQogICAgIE9DU1AgY2xpZW50IGEgbnVtYmVyIG9mIGNlcnRpZmljYXRlIHRvIG9ubHkgdmVyaWZ5IHRoZSByZXNwb25zZQogICAgIHNpZ25hdHVyZSBhZ2FpbnN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFVwZGF0ZSBSaWpuZGFlbCBjb2RlIHRvIHZlcnNpb24gMy4wIGFuZCBjaGFuZ2UgRVZQIEFFUyBjaXBoZXJzIHRvCiAgICAgaGFuZGxlIHRoZSBuZXcgQVBJLiBDdXJyZW50bHkgb25seSBFQ0IsIENCQyBtb2RlcyBzdXBwb3J0ZWQuIEFkZCBuZXcKICAgICBBRVMgT0lEcy4KCiAgICAgQWRkIFRMUyBBRVMgY2lwaGVyc3VpdGVzIGFzIGRlc2NyaWJlZCBpbiBSRkMzMjY4LCAiQWR2YW5jZWQKICAgICBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIENpcGhlcnN1aXRlcyBmb3IgVHJhbnNwb3J0IExheWVyCiAgICAgU2VjdXJpdHkgKFRMUykiLiAgKEluIGJldGEgdmVyc2lvbnMgb2YgT3BlblNTTCAwLjkuNywgdGhlc2Ugd2VyZQogICAgIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdlcmUgbm90IHBhcnQgb2YgdGhlICJBTEwiIGNpcGhlcnN1aXRlCiAgICAgYWxpYXMgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHlldCBvZmZpY2lhbDsgdGhleSBjb3VsZCBiZQogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHNwZWNpZnlpbmcgdGhlICJBRVNkcmFmdCIgY2lwaGVyc3VpdGUKICAgICBncm91cCBhbGlhcy4gIEluIHRoZSBmaW5hbCByZWxlYXNlIG9mIE9wZW5TU0wgMC45LjcsIHRoZSBncm91cAogICAgIGFsaWFzIGlzIGNhbGxlZCAiQUVTIiBhbmQgaXMgcGFydCBvZiAiQUxMIi4pCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlICBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfY29weV9ub25jZSgpIHRvIGNvcHkgbm9uY2UgdmFsdWUgKGlmIHByZXNlbnQpIGZyb20KICAgICByZXF1ZXN0IHRvIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBmb3IgT0NTUCByZXNwb25kZXJzLiBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KCksCiAgICAgT0NTUF9yZXF1ZXN0X29uZXJlcV9nZXQwKCksIE9DU1Bfb25lcmVxX2dldDBfaWQoKSBhbmQgT0NTUF9pZF9nZXQwX2luZm8oKQogICAgIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QuIE9DU1BfcmVzcG9uc2VfY3JlYXRlKCkKICAgICBjcmVhdGVzIGEgcmVzcG9uc2UgYW5kIG9wdGlvbmFsbHkgYWRkcyBhIGJhc2ljIHJlc3BvbnNlIHN0cnVjdHVyZS4KICAgICBPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKCkgYWRkcyBhIGNvbXBsZXRlIHNpbmdsZSByZXNwb25zZSB0byBhIGJhc2ljCiAgICAgcmVzcG9uc2UgYW5kIHJldHVybnMgdGhlIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmUganVzdCBhZGRlZCAodG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIGluY2x1ZGVkIGZvciBleGFtcGxlKS4gT0NTUF9iYXNpY19hZGQxX2NlcnQoKSBhZGRzIGEKICAgICBjZXJ0aWZpY2F0ZSB0byBhIGJhc2ljIHJlc3BvbnNlIGFuZCBPQ1NQX2Jhc2ljX3NpZ24oKSBzaWducyBhIGJhc2ljCiAgICAgcmVzcG9uc2Ugd2l0aCB2YXJpb3VzIGZsYWdzLiBOZXcgaGVscGVyIGZ1bmN0aW9ucyBBU04xX1RJTUVfY2hlY2soKQogICAgIChjaGVja3MgdmFsaWRpdHkgb2YgQVNOMV9USU1FIHN0cnVjdHVyZSkgYW5kIEFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoKQogICAgIChjb252ZXJ0cyBBU04xX1RJTUUgdG8gR2VuZXJhbGl6ZWRUaW1lKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIG5ldyBmdW5jdGlvbnMuIEVWUF9EaWdlc3QoKSBjb21iaW5lcyBFVlBfRGlnZXN0e0luaXQsVXBkYXRlLEZpbmFsfSgpCiAgICAgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBYNTA5X2dldDBfcHVia2V5X2JpdHN0cigpIGV4dHJhY3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgc3RydWN0dXJlIGZyb20gYSBjZXJ0aWZpY2F0ZS4gWDUwOV9wdWJrZXlfZGlnZXN0KCkgZGlnZXN0cyB0aGUgcHVibGljX2tleQogICAgIGNvbnRlbnRzOiB0aGlzIGlzIHVzZWQgaW4gdmFyaW91cyBrZXkgaWRlbnRpZmllcnMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc2tfc29ydCgpIHRvbGVyYXRlIGEgTlVMTCBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB2ZXJpZnkgZmxhZyBPQ1NQX1RSVVNUT1RIRVIuIFdoZW4gc2V0IHRoZSAib3RoZXIiIGNlcnRpZmljYXRlcwogICAgIHBhc3NlZCBieSB0aGUgZnVuY3Rpb24gYXJlIHRydXN0ZWQgaW1wbGljaXRseS4gSWYgYW55IG9mIHRoZW0gc2lnbmVkIHRoZQogICAgIHJlc3BvbnNlIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZCBhbmQgaXMgbm90IHZlcmlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBLQ1M3X3NldF90eXBlKCkgaW5pdGlhbGlzZSBjb250ZW50X3R5cGUgaW4gUEtDUzdfRU5DX0NPTlRFTlQKICAgICB0byBkYXRhLiBUaGlzIHdhcyBwcmV2aW91c2x5IHBhcnQgb2YgdGhlIFBLQ1M3IEFTTjEgY29kZS4gVGhpcwogICAgIHdhcyBjYXVzaW5nIHByb2JsZW1zIHdpdGggT3BlblNTTCBjcmVhdGVkIFBLQ1MjMTIgYW5kIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEFkZCBDUllQVE9fcHVzaF9pbmZvKCkgYW5kIENSWVBUT19wb3BfaW5mbygpIGNhbGxzIHRvIG5ldyBBU04xCiAgICAgcm91dGluZXM6IHdpdGhvdXQgdGhlc2UgdHJhY2luZyBtZW1vcnkgbGVha3MgaXMgdmVyeSBwYWluZnVsLgogICAgIEZpeCBsZWFrcyBpbiBQS0NTMTIgYW5kIFBLQ1M3IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgWDUwOV90aW1lX2FkaigpIGNvcGUgd2l0aCB0aGUgbmV3IGJlaGF2aW91ciBvZiBBU04xX1RJTUVfbmV3KCkuCiAgICAgUHJldmlvdXNseSBpdCBpbml0aWFsaXNlZCB0aGUgJ3R5cGUnIGFyZ3VtZW50IHRvIFZfQVNOMV9VVENUSU1FIHdoaWNoCiAgICAgZWZmZWN0aXZlbHkgbWVhbnQgR2VuZXJhbGl6ZWRUaW1lIHdvdWxkIG5ldmVyIGJlIHVzZWQuIE5vdyBpdAogICAgIGlzIGluaXRpYWxpc2VkIHRvIC0xIGJ1dCBYNTA5X3RpbWVfYWRqKCkgbm93IGhhcyB0byBjaGVjayB0aGUgdmFsdWUKICAgICBhbmQgdXNlIEFTTjFfVElNRV9zZXQoKSBpZiB0aGUgdmFsdWUgaXMgbm90IFZfQVNOMV9VVENUSU1FIG9yCiAgICAgVl9BU04xX0dFTkVSQUxJWkVEVElNRSwgd2l0aG91dCB0aGlzIGl0IGFsd2F5cyB1c2VzIEdlbmVyYWxpemVkVGltZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBGaXhlcyB0byBCTl90b19BU04xX0lOVEVHRVIgd2hlbiBibiBpcyB6ZXJvLiBUaGlzIHdvdWxkIHByZXZpb3VzbHkKICAgICByZXN1bHQgaW4gYSB6ZXJvIGxlbmd0aCBpbiB0aGUgQVNOMV9JTlRFR0VSIHN0cnVjdHVyZSB3aGljaCB3YXMKICAgICBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hlbiBkMmlfQVNOMV9JTlRFR0VSKCkgd2FzIHVzZWQKICAgICBhbmQgd291bGQgY2F1c2UgQVNOMV9JTlRFR0VSX2NtcCgpIHRvIGZhaWwuIEVuaGFuY2UgczJpX0FTTjFfSU5URUdFUigpCiAgICAgdG8gY29wZSB3aXRoIGhleCBhbmQgbmVnYXRpdmUgaW50ZWdlcnMuIEZpeCBidWcgaW4gaTJhX0FTTjFfSU5URUdFUigpCiAgICAgd2hlcmUgaXQgZGlkIG5vdCBwcmludCBvdXQgYSBtaW51cyBmb3IgbmVnYXRpdmUgQVNOMV9JTlRFR0VSLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdW1tYXJ5IHByaW50b3V0IHRvIG9jc3AgdXRpbGl0eS4gVGhlIHZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoCiAgICAgY29udmVydCBzdGF0dXMgdmFsdWVzIHRvIHN0cmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQgdG86CiAgICAgT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKCksIE9DU1BfY2VydF9zdGF0dXNfc3RyKCkgYW5kCiAgICAgT0NTUF9jcmxfcmVhc29uX3N0cigpIGFuZCBhcmUgbm8gbG9uZ2VyIHN0YXRpYy4gTmV3IG9wdGlvbnMKICAgICB0byB2ZXJpZnkgbm9uY2UgdmFsdWVzIGFuZCB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbi4gT0NTUCByZXNwb25zZQogICAgIHByaW50b3V0IGZvcm1hdCBjbGVhbmVkIHVwLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhZGRpdGlvbmFsIE9DU1AgY2VydGlmaWNhdGUgY2hlY2tzLiBUaGVzZSBhcmUgdGhvc2Ugc3BlY2lmaWVkCiAgICAgaW4gUkZDMjU2MC4gVGhpcyBjb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgY2hlY2tzOiB0aGUgQ0Egb2YgdGhlCiAgICAgY2VydGlmaWNhdGUgYmVpbmcgY2hlY2tlZCBtdXN0IGVpdGhlciBiZSB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUKICAgICBvciB0aGUgaXNzdWVyIG9mIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZQogICAgIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiB0aGUgT0NTUCBzaWduaW5nIGV4dGVuZGVkIGtleQogICAgIHVzYWdlLiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCBieSBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSBPQ1NQCiAgICAgc2lnbmVyIG9yIHRoZSBPQ1NQIHNpZ25lciBDQSB0byB0aGUgaXNzdWVyTmFtZUhhc2ggYW5kIGlzc3VlcktleUhhc2gKICAgICBpbiB0aGUgT0NTUF9DRVJUSUQgc3RydWN0dXJlcyBvZiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBPQ1NQIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZGRlZCB0byBPQ1NQX2Jhc2ljX3ZlcmlmeSgpCiAgICAgYW5kIHJlbGF0ZWQgcm91dGluZXMuIFRoaXMgdXNlcyB0aGUgc3RhbmRhcmQgT3BlblNTTCBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSByb3V0aW5lcyB0byBwZXJmb3JtIGluaXRpYWwgY2hlY2tzIChqdXN0IENBIHZhbGlkaXR5KSBhbmQKICAgICB0byBvYnRhaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluLiBUaGVuIGFkZGl0aW9uYWwgY2hlY2tzIHdpbGwgYmUKICAgICBwZXJmb3JtZWQgb24gdGhlIGNoYWluLiBDdXJyZW50bHkgdGhlIHJvb3QgQ0EgaXMgY2hlY2tlZCB0byBzZWUKICAgICBpZiBpdCBpcyBleHBsaWNpdGx5IHRydXN0ZWQgZm9yIE9DU1Agc2lnbmluZy4gVGhpcyBpcyB1c2VkIHRvIHNldAogICAgIGEgcm9vdCBDQSBhcyBhIGdsb2JhbCBzaWduaW5nIHJvb3Q6IHRoYXQgaXMgYW55IGNlcnRpZmljYXRlIHRoYXQKICAgICBjaGFpbnMgdG8gdGhhdCBDQSBpcyBhbiBhY2NlcHRhYmxlIE9DU1Agc2lnbmluZyBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJy1leHRmaWxlIC4uLicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJyBmb3IgcmVhZGluZyBYLjUwOXYzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgc2VwYXJhdGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEFzIHdoZW4gcmVhZGluZyBleHRlbnNpb25zIGZyb20gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHRoZSAnLWV4dGVuc2lvbnMgLi4uJyBvcHRpb24gbWF5IGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlCiAgICAgc2VjdGlvbiB0byB1c2UuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB1dGlsaXR5LiBBbGxvd3MgT0NTUCByZXF1ZXN0cyB0byBiZSBnZW5lcmF0ZWQgb3IKICAgICByZWFkLiBUaGUgcmVxdWVzdCBjYW4gYmUgc2VudCB0byBhIHJlc3BvbmRlciBhbmQgdGhlIG91dHB1dAogICAgIHBhcnNlZCwgb3V0cHV0ZWQgb3IgcHJpbnRlZCBpbiB0ZXh0IGZvcm0uIE5vdCBjb21wbGV0ZSB5ZXQ6CiAgICAgc3RpbGwgbmVlZHMgdG8gY2hlY2sgdGhlIE9DU1AgcmVzcG9uc2UgdmFsaWRpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN1YmNvbW1hbmRzIGZvciAnb3BlbnNzbCBjYSc6CiAgICAgJ29wZW5zc2wgY2EgLXN0YXR1cyA8c2VyaWFsPicgcHJpbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGNlcnQgd2l0aAogICAgIHRoZSBnaXZlbiBzZXJpYWwgbnVtYmVyIChhY2NvcmRpbmcgdG8gdGhlIGluZGV4IGZpbGUpLgogICAgICdvcGVuc3NsIGNhIC11cGRhdGVkYicgdXBkYXRlcyB0aGUgZXhwaXJ5IHN0YXR1cyBvZiBjZXJ0aWZpY2F0ZXMKICAgICBpbiB0aGUgaW5kZXggZmlsZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyAnLW5ld3JlcS1ub2RlcycgY29tbWFuZCBvcHRpb24gdG8gQ0EucGwuICBUaGlzIGlzIGxpa2UKICAgICAnLW5ld3JlcScsIGJ1dCBjYWxscyAnb3BlbnNzbCByZXEnIHdpdGggdGhlICctbm9kZXMnIG9wdGlvbgogICAgIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBrZXkgaXMgbm90IGVuY3J5cHRlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHTlUgSHVyZC4KICAgICBbSm9uYXRoYW4gQmFydGxldHQgPGpvaG5ueWJAd29sZnJhbS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluaXRpYWwgY29kZSB0byBpbXBsZW1lbnQgT0NTUCBiYXNpYyByZXNwb25zZSB2ZXJpZnkuIFRoaXMKICAgICBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gQ3VycmVudGx5IGp1c3QgZmluZHMgdGhlIHNpZ25lcidzCiAgICAgY2VydGlmaWNhdGUgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTU0xlYXlfdmVyc2lvbiBjb2RlIFNTTEVBWV9ESVIgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlZC1pbgogICAgIHZhbHVlIG9mIE9QRU5TU0xESVIuICBUaGlzIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG5ldyAnLWQnIG9wdGlvbgogICAgIHRvICdvcGVuc3NsIHZlcnNpb24nLCBhbmQgaXMgYWxzbyBpbmNsdWRlZCBpbiAnb3BlbnNzbCB2ZXJzaW9uIC1hJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvd2luZyBkZWZpbmluZyBtZW1vcnkgYWxsb2NhdGlvbiBjYWxsYmFja3MgdGhhdCB3aWxsIGJlIGdpdmVuCiAgICAgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cwogICAgIChhIGNvbnN0IGNoYXIqIGFuZCBhbiBpbnQpLiAgVGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgcmVtYWlucywgYXMKICAgICB3ZWxsIGFzIHRoZSBvcmlnaW5hbCBwb3NzaWJpbGl0eSB0byBqdXN0IHJlcGxhY2UgbWFsbG9jKCksCiAgICAgcmVhbGxvYygpIGFuZCBmcmVlKCkgYnkgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGtub3cgYWJvdXQgdGhlc2UKICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIFRvIHJlZ2lzdGVyIGFuZCBmaW5kIG91dCB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGZvciBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucywgdGhlIGZvbGxvd2luZwogICAgIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQ6CgoJQ1JZUFRPX3NldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCiAgICAgVGhlc2Ugd29yayB0aGUgc2FtZSB3YXkgYXMgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIGFuZCBmcmllbmRzLgogICAgIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2Z1bmN0aW9ucyBub3cgd3JpdGVzIDAgd2hlcmUgc3VjaCBhbgogICAgIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBTaW1pbGFybHksIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2V4X2Z1bmN0aW9ucyB3cml0ZXMgMCB3aGVyZQogICAgIGEgY29udmVudGlvbmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBCb2RvIE1vZWxsZXJdCgogICopIEZpbmlzaCBvZmYgcmVtb3ZpbmcgdGhlIHJlbWFpbmluZyBMSEFTSCBmdW5jdGlvbiBwb2ludGVyIGNhc3RzLgogICAgIFRoZXJlIHNob3VsZCBubyBsb25nZXIgYmUgYW55IHByb3RvdHlwZS1jYXN0aW5nIHJlcXVpcmVkIHdoZW4gdXNpbmcKICAgICB0aGUgTEhBU0ggYWJzdHJhY3Rpb24sIGFuZCBhbnkgY2FzdHMgdGhhdCByZW1haW4gYXJlICJidWdzIi4gU2VlCiAgICAgdGhlIGNhbGxiYWNrIHR5cGVzIGFuZCBtYWNyb3MgYXQgdGhlIGhlYWQgb2YgbGhhc2guaCBmb3IgZGV0YWlscwogICAgIChhbmQgIk9CSl9jbGVhbnVwIiBpbiBjcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMgYXMgYW4gZXhhbXBsZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF1dG9tYXRpYyBxdWVyeSBvZiBFR0Qgc29ja2V0cyBpbiBSQU5EX3BvbGwoKSBmb3IgdGhlIHVuaXggdmFyaWFudC4KICAgICBJZiAvZGV2L1t1XXJhbmRvbSBkZXZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGRvIG5vdCByZXR1cm4gZW5vdWdoCiAgICAgZW50cm9weSwgRUdEIHN0eWxlIHNvY2tldHMgKHNlcnZlZCBieSBFR0Qgb3IgUFJOR0QpIHdpbGwgYXV0b21hdGljYWxseQogICAgIGJlIHF1ZXJpZWQuCiAgICAgVGhlIGxvY2F0aW9ucyAvdmFyL3J1bi9lZ2QtcG9vbCwgL2Rldi9lZ2QtcG9vbCwgL2V0Yy9lZ2QtcG9vbCwgYW5kCiAgICAgL2V0Yy9lbnRyb3B5IHdpbGwgYmUgcXVlcmllZCBvbmNlIGVhY2ggaW4gdGhpcyBzZXF1ZW5jZSwgcXVlcmluZyBzdG9wcwogICAgIHdoZW4gZW5vdWdoIGVudHJvcHkgd2FzIGNvbGxlY3RlZCB3aXRob3V0IHF1ZXJ5aW5nIG1vcmUgc29ja2V0cy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IFJBTkRfcG9sbCgpIHZhcmlhbnQgdG8gYmUgYWJsZSB0byBwb2xsIHNldmVyYWwKICAgICByYW5kb20gZGV2aWNlcywgYXMgc3BlY2lmaWVkIGJ5IERFVlJBTkRPTSwgdW50aWwgYSBzdWZmaWNpZW50IGFtb3VudAogICAgIG9mIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgIFdlIHNwZW5kIGF0IG1vc3QgMTAgbXMgb24gZWFjaCBmaWxlCiAgICAgKHNlbGVjdCB0aW1lb3V0KSBhbmQgcmVhZCBpbiBub24tYmxvY2tpbmcgbW9kZS4gIERFVlJBTkRPTSBub3cKICAgICBkZWZhdWx0cyB0byB0aGUgbGlzdCAiL2Rldi91cmFuZG9tIiwgIi9kZXYvcmFuZG9tIiwgIi9kZXYvc3JhbmRvbSIKICAgICAocHJldmlvdXNseSBpdCB3YXMganVzdCB0aGUgc3RyaW5nICIvZGV2L3VyYW5kb20iKSwgc28gb24gdHlwaWNhbAogICAgIHBsYXRmb3JtcyB0aGUgMTAgbXMgZGVsYXkgd2lsbCBuZXZlciBvY2N1ci4KICAgICBBbHNvIHNlcGFyYXRlIG91dCB0aGUgVW5peCB2YXJpYW50IHRvIGl0cyBvd24gZmlsZSwgcmFuZF91bml4LmMuCiAgICAgRm9yIFZNUywgdGhlcmUncyBhIGN1cnJlbnRseS1lbXB0eSByYW5kX3Ztcy5jLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1vdmUgT0NTUCBjbGllbnQgcmVsYXRlZCByb3V0aW5lcyB0byBvY3NwX2NsLmMuIFRoZXNlCiAgICAgcHJvdmlkZSB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhbiBhcHBsaWNhdGlvbiBuZWVkaW5nCiAgICAgdG8gaXNzdWUgYSByZXF1ZXN0IHRvIGFuIE9DU1AgcmVzcG9uZGVyIGFuZCBhbmFseXNlIHRoZQogICAgIHJlc3BvbnNlIHdpbGwgdHlwaWNhbGx5IG5lZWQ6IGFzIG9wcG9zZWQgdG8gdGhvc2Ugd2hpY2ggYW4KICAgICBPQ1NQIHJlc3BvbmRlciBpdHNlbGYgd291bGQgbmVlZCB3aGljaCB3aWxsIGJlIGFkZGVkIGxhdGVyLgoKICAgICBPQ1NQX3JlcXVlc3Rfc2lnbigpIHNpZ25zIGFuIE9DU1AgcmVxdWVzdCB3aXRoIGFuIEFQSSBzaW1pbGFyCiAgICAgdG8gUEtDUzdfc2lnbigpLiBPQ1NQX3Jlc3BvbnNlX3N0YXR1cygpIHJldHVybnMgc3RhdHVzIG9mIE9DU1AKICAgICByZXNwb25zZS4gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKCkgZXh0cmFjdHMgYmFzaWMgcmVzcG9uc2UKICAgICBmcm9tIHJlc3BvbnNlLiBPQ1NQX3Jlc3BfZmluZF9zdGF0dXMoKTogZmluZHMgYW5kIGV4dHJhY3RzIHN0YXR1cwogICAgIGluZm9ybWF0aW9uIGZyb20gYW4gT0NTUF9DRVJUSUQgc3RydWN0dXJlICh3aGljaCB3aWxsIGJlIGNyZWF0ZWQKICAgICB3aGVuIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBidWlsdCkuIFRoZXNlIGFyZSBidWlsdCBmcm9tIGxvd2VyCiAgICAgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHdvcmsgb24gT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZXMgYnV0CiAgICAgd29udCBub3JtYWxseSBiZSB1c2VkIHVubGVzcyB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIGV4YW1pbmUKICAgICBleHRlbnNpb25zIGluIHRoZSBPQ1NQIHJlc3BvbnNlIGZvciBleGFtcGxlLgoKICAgICBSZXBsYWNlIG5vbmNlIHJvdXRpbmVzIHdpdGggYSBwYWlyIG9mIGZ1bmN0aW9ucy4KICAgICBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZSgpIGFkZHMgYSBub25jZSB2YWx1ZSBhbmQgb3B0aW9uYWxseQogICAgIGdlbmVyYXRlcyBhIHJhbmRvbSB2YWx1ZS4gT0NTUF9jaGVja19ub25jZSgpIGNoZWNrcyB0aGUKICAgICB2YWxpZGl0eSBvZiB0aGUgbm9uY2UgaW4gYW4gT0NTUCByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgZnVuY3Rpb24gT0NTUF9yZXF1ZXN0X2FkZCgpIHRvIE9DU1BfcmVxdWVzdF9hZGQwX2lkKCkuCiAgICAgVGhpcyBkb2Vzbid0IGNvcHkgdGhlIHN1cHBsaWVkIE9DU1BfQ0VSVElEIGFuZCBhdm9pZHMgdGhlCiAgICAgbmVlZCB0byBmcmVlIHVwIHRoZSBuZXdseSBjcmVhdGVkIGlkLiBDaGFuZ2UgcmV0dXJuIHR5cGUKICAgICB0byBPQ1NQX09ORVJFUSB0byByZXR1cm4gdGhlIGludGVybmFsIE9DU1BfT05FUkVRIHN0cnVjdHVyZS4KICAgICBUaGlzIGNhbiB0aGVuIGJlIHVzZWQgdG8gYWRkIGV4dGVuc2lvbnMgdG8gdGhlIHJlcXVlc3QuCiAgICAgRGVsZXRlZCBPQ1NQX3JlcXVlc3RfbmV3KCksIHNpbmNlIG1vc3Qgb2YgaXRzIGZ1bmN0aW9uYWxpdHkKICAgICBpcyBub3cgaW4gT0NTUF9SRVFVRVNUX25ldygpIChhbmQgdGhlIGNhc2UgaW5zZW5zaXRpdmUgbmFtZQogICAgIGNsYXNoKSBhcGFydCBmcm9tIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgcmVxdWVzdCBuYW1lIHdoaWNoCiAgICAgd2lsbCBiZSBhZGRlZCBlbHNld2hlcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIE9DU1AgQVBJLiBSZW1vdmUgb2Jzb2xldGUgZXh0ZW5zaW9ucyBhcmd1bWVudCBmcm9tCiAgICAgdmFyaW91cyBmdW5jdGlvbnMuIEV4dGVuc2lvbnMgYXJlIG5vdyBoYW5kbGVkIHVzaW5nIHRoZSBuZXcKICAgICBPQ1NQIGV4dGVuc2lvbiBjb2RlLiBOZXcgc2ltcGxlIE9DU1AgSFRUUCBmdW5jdGlvbiB3aGljaCAKICAgICBjYW4gYmUgdXNlZCB0byBzZW5kIHJlcXVlc3RzIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzcgKFMvTUlNRSkgY29kZSB0byB3b3JrIHdpdGggbmV3IEFTTjEuIFR3byBuZXcKICAgICBBU04xX0lURU0gc3RydWN0dXJlcyBoZWxwIHdpdGggc2lnbiBhbmQgdmVyaWZ5LiBQS0NTN19BVFRSX1NJR04KICAgICB1c2VzIHRoZSBzcGVjaWFsIHJlb3JkZXIgdmVyc2lvbiBvZiBTRVQgT0YgdG8gc29ydCB0aGUgYXR0cmlidXRlcwogICAgIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2ggdGhlIGVuY29kZWQgb3JkZXIuIFRoaXMgcmVzb2x2ZXMgYSBsb25nCiAgICAgc3RhbmRpbmcgcHJvYmxlbTogYSB2ZXJpZnkgb24gYSBQS0NTNyBzdHJ1Y3R1cmUganVzdCBhZnRlciBzaWduaW5nCiAgICAgaXQgdXNlZCB0byBmYWlsIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBvcmRlciBkaWQgbm90IG1hdGNoIHRoZQogICAgIGVuY29kZWQgb3JkZXIuIFBLQ1M3X0FUVFJfVkVSSUZZIGRvZXMgbm90IHJlb3JkZXIgdGhlIGF0dHJpYnV0ZXM6CiAgICAgaXQgdXNlcyB0aGUgcmVjZWl2ZWQgb3JkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuCiAgICAgc29mdHdhcmUgdGhhdCBkb2VzIG5vdCBvcmRlciBTRVQgT0YuIFRoaXMgaXMgaGFuZGxlZCBieSBlbmNvZGluZwogICAgIGFzIGEgU0VRVUVOQ0UgT0YgYnV0IHVzaW5nIGltcGxpY2l0IHRhZ2dpbmcgKHdpdGggVU5JVkVSU0FMIGNsYXNzKQogICAgIHRvIHByb2R1Y2UgdGhlIHJlcXVpcmVkIFNFVCBPRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIG1rMW1mLnBsIGdlbmVyYXRlIHRoZSBtYWNyb3MgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTyBhbmQKICAgICBPUEVOU1NMX0JVSUxEX1NITElCU1NMIGFuZCB1c2UgdGhlbSBhcHByb3ByaWF0ZWx5IGluIHRoZSBoZWFkZXIKICAgICBmaWxlcyB0byBnZXQgY29ycmVjdCBkZWNsYXJhdGlvbnMgb2YgdGhlIEFTTi4xIGl0ZW0gdmFyaWFibGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgb2YgUEtDUyMxMiBjb2RlIHRvIHVzZSBuZXcgQVNOMSBmdW5jdGlvbmFsaXR5LiBSZXBsYWNlIG1hbnkKICAgICBQS0NTIzEyIG1hY3JvcyB3aXRoIHJlYWwgZnVuY3Rpb25zLiBGaXggdHdvIHVucmVsYXRlZCBBU04xIGJ1Z3M6CiAgICAgYXNuMV9jaGVja190bGVuKCkgd291bGQgc29tZXRpbWVzIGF0dGVtcHQgdG8gdXNlICdjdHgnIHdoZW4gaXQgd2FzCiAgICAgTlVMTCBhbmQgQVNOMV9UWVBFIHdhcyBub3QgZGVyZWZlcmVuY2VkIHByb3Blcmx5IGluIGFzbjFfZXhfYzJpKCkuCiAgICAgTmV3IEFTTjEgbWFjcm86IERFQ0xBUkVfQVNOMV9JVEVNKCkgd2hpY2gganVzdCBkZWNsYXJlcyB0aGUgcmVsZXZhbnQKICAgICBBU04xX0lURU0gYW5kIG5vIHdyYXBwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgb3IgQVNOMV9pdGVtX2QyaV9mcCgpIGFuZCBBU04xX2l0ZW1fZDJpX2JpbygpLiBUaGVzZQogICAgIHJlcGxhY2UgdGhlIG9sZCBmdW5jdGlvbiBwb2ludGVyIGJhc2VkIEkvTyByb3V0aW5lcy4gQ2hhbmdlIG1vc3Qgb2YKICAgICB0aGUgKl9kMmlfYmlvKCkgYW5kICpfZDJpX2ZwKCkgZnVuY3Rpb25zIHRvIHVzZSB0aGVzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIG1rZGVmLnBsIHRvIGJlIG1vcmUgYWNjZXB0aW5nIGFib3V0IHNwYWNpbmcgaW4gQyBwcmVwcm9jZXNzb3IKICAgICBsaW5lcywgcmVjb2duaWNlIG1vcmUgImFsZ29yaXRobXMiIHRoYXQgY2FuIGJlIGRlc2VsZWN0ZWQsIGFuZCBtYWtlCiAgICAgaXQgY29tcGxhaW4gYWJvdXQgYWxnb3JpdGhtIGRlc2VsZWN0aW9uIHRoYXQgaXNuJ3QgcmVjb2duaXNlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMgdG8gaGFuZGxlIGR1cCwgc2lnbiwgdmVyaWZ5LCBkaWdlc3QsIHBhY2sgYW5kCiAgICAgdW5wYWNrIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNLiBNb2RpZnkgZXhpc3Rpbmcgd3JhcHBlcnMKICAgICB0byB1c2UgbmV3IGZ1bmN0aW9ucy4gQWRkIE5PX0FTTjFfT0xEIHdoaWNoIGNhbiBiZSBzZXQgdG8gcmVtb3ZlCiAgICAgc29tZSBvbGQgc3R5bGUgQVNOMSBmdW5jdGlvbnM6IHRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9sZAogICAgIGNvZGUgd2lsbCBzdGlsbCB3b3JrIHdoZW4gdGhlc2UgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHRlbnNpb24gZnVuY3Rpb25zIGZvciBPQ1NQIHN0cnVjdHVyZXMsIHRoZXNlIGZvbGxvdyB0aGUKICAgICBzYW1lIGNvbnZlbnRpb25zIGFzIGNlcnRpZmljYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZDFfaTJkKCkuIFRoaXMgYXV0b21hdGljYWxseSBlbmNvZGVzIGFuZAogICAgIGFkZHMgYW4gZXh0ZW5zaW9uLiBJdHMgYmVoYXZpb3VyIGNhbiBiZSBjdXN0b21pc2VkIHdpdGggdmFyaW91cwogICAgIGZsYWdzIHRvIGFwcGVuZCwgcmVwbGFjZSBvciBkZWxldGUuIFZhcmlvdXMgd3JhcHBlcnMgYWRkZWQgZm9yCiAgICAgY2VydGlmY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIGF2b2lkIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgQVNOMSBwcmludCByb3V0aW5lIHdoZW4KICAgICBhbiBleHRlbnNpb24gY2Fubm90IGJlIHBhcnNlZC4gQ29ycmVjdCBhIHR5cG8gaW4gdGhlCiAgICAgT0NTUF9TRVJWSUNFTE9DIGV4dGVuc2lvbi4gVGlkeSB1cCBwcmludCBPQ1NQIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1rZGVmLnBsIHBhcnNlIHNvbWUgb2YgdGhlIEFTTjEgbWFjcm9zIGFuZCBhZGQgYXByb3ByaWF0ZQogICAgIGVudHJpZXMgZm9yIHZhcmlhYmxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25hbGl0eSB0byBhcHBzL29wZW5zc2wuYyBmb3IgZGV0ZWN0aW5nIGxvY2tpbmcKICAgICBwcm9ibGVtczogQXMgdGhlIHByb2dyYW0gaXMgc2luZ2xlLXRocmVhZGVkLCBhbGwgd2UgaGF2ZQogICAgIHRvIGRvIGlzIHJlZ2lzdGVyIGEgbG9ja2luZyBjYWxsYmFjayB1c2luZyBhbiBhcnJheSBmb3IKICAgICBzdG9yaW5nIHdoaWNoIGxvY2tzIGFyZSBjdXJyZW50bHkgaGVsZCBieSB0aGUgcHJvZ3JhbS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgYSBsb2NrIGFyb3VuZCB0aGUgY2FsbCB0byBDUllQVE9fZ2V0X2V4X25ld19pbmRleCgpIGluCiAgICAgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfaWR4KCksIHdoaWNoIGlzIHVzZWQgaW4KICAgICBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKSBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lCiAgICAgZHVyaW5nIFRMUy9TU0wgaGFuZHNoYWtlcyBzbyB0aGF0IHRocmVhZC1zYWZldHkgaXMgZXNzZW50aWFsLgogICAgIFVuZm9ydHVuYXRlbHksIHRoZSBleF9kYXRhIGRlc2lnbiBpcyBub3QgYXQgYWxsIHN1aXRlZAogICAgIGZvciBtdWx0aS10aHJlYWRlZCB1c2UsIHNvIGl0IHByb2JhYmx5IHNob3VsZCBiZSBhYm9saXNoZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgQnJvYWRjb20gInVic2VjIiBFTkdJTkUgdG8gT3BlblNTTC4KICAgICBbQnJvYWRjb20sIHR3ZWFrZWQgYW5kIGludGVncmF0ZWQgYnkgR2VvZmYgVGhvcnBlXQoKICAqKSBNb3ZlIGNvbW1vbiBleHRlbnNpb24gcHJpbnRpbmcgY29kZSB0byBuZXcgZnVuY3Rpb24KICAgICBYNTA5VjNfcHJpbnRfZXh0ZW5zaW9ucygpLiBSZW9yZ2FuaXNlIE9DU1AgcHJpbnQgcm91dGluZXMgYW5kCiAgICAgaW1wbGVtZW50IHNvbWUgbmVlZGVkIE9DU1AgQVNOMSBmdW5jdGlvbnMuIEFkZCBPQ1NQIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfc2lnbmF0dXJlX3ByaW50KCkgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIGluIHNvbWUKICAgICBwcmludCByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBzcGVjaWFsIG1lYW5pbmcgd2hlbiBTRVQgT0YgYW5kIFNFUVVFTkNFIE9GIGZsYWdzIGFyZSBib3RoCiAgICAgc2V0ICh0aGlzIHdhcyB0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgU0VUIE9GIHByZXZpb3VzbHkpLiBUaGlzCiAgICAgaXMgdXNlZCB0byByZW9yZGVyIHRoZSBTVEFDSyByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSB0byBtYXRjaCB0aGUKICAgICBlbmNvZGluZy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZ2V0IHJvdW5kIGEgcHJvYmxlbSB3aGVyZSBhIFBLQ1M3CiAgICAgc3RydWN0dXJlIHdoaWNoIHdhcyBzaWduZWQgY291bGQgbm90IGJlIHZlcmlmaWVkIGJlY2F1c2UgdGhlIFNUQUNLCiAgICAgb3JkZXIgZGlkIG5vdCByZWZsZWN0IHRoZSBlbmNvZGVkIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlaW1wbGVtZW50IHRoZSBPQ1NQIEFTTjEgbW9kdWxlIHVzaW5nIHRoZSBuZXcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgdGhlIFg1MDlWMyBjb2RlIHRvIHBlcm1pdCB0aGUgdXNlIG9mIGFuIEFTTjFfSVRFTSBzdHJ1Y3R1cmUKICAgICBmb3IgaXRzIEFTTjEgb3BlcmF0aW9ucy4gVGhlIG9sZCBzdHlsZSBmdW5jdGlvbiBwb2ludGVycyBzdGlsbCBleGlzdAogICAgIGZvciBub3cgYnV0IHRoZXkgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2UgaW4gcmVwbGFjZW1lbnQgQVNOMSBjb2RlIGZyb20gdGhlIEFTTjEgYnJhbmNoLiBUaGlzIGFsbW9zdAogICAgIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIG9sZCBBU04xIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIHRhYmxlIGRyaXZlbgogICAgIGVuY29kZXIgYW5kIGRlY29kZXIgd2hpY2ggaW50ZXJwcmV0cyBhbiBBU04xX0lURU0gc3RydWN0dXJlIGRlc2NyaWJpbmcKICAgICB0aGUgQVNOMSBtb2R1bGUuIENvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXhpc3RpbmcgQVNOMSBBUEkgKGkyZCxkMmkpIGlzCiAgICAgbGFyZ2VseSBtYWludGFpbmVkLiBBbG1vc3QgYWxsIG9mIHRoZSBvbGQgYXNuMV9tYWMuaCBtYWNybyBiYXNlZCBBU04xCiAgICAgaGFzIGFsc28gYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBCTl9tb2RfZXhwX3JlY3Agc28gdGhhdCBuZWdhdGl2ZSBtb2R1bGkgYXJlIHRvbGVyYXRlZAogICAgICh0aGUgc2lnbiBpcyBpZ25vcmVkKS4gIFNpbWlsYXJseSwgaWdub3JlIHRoZSBzaWduIGluIEJOX01PTlRfQ1RYX3NldAogICAgIHNvIHRoYXQgQk5fbW9kX2V4cF9tb250IGFuZCBCTl9tb2RfZXhwX21vbnRfd29yZCB3b3JrCiAgICAgZm9yIG5lZ2F0aXZlIG1vZHVsaS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fdWFkZCBhbmQgQk5fdXN1YjogQWx3YXlzIHJldHVybiBub24tbmVnYXRpdmUgcmVzdWx0cyBpbnN0ZWFkCiAgICAgb2Ygbm90IHRvdWNoaW5nIHRoZSByZXN1bHQncyBzaWduIGJpdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9kaXYgYnVnZml4OiBJZiB0aGUgcmVzdWx0IGlzIDAsIHRoZSBzaWduIChyZXMtPm5lZykgbXVzdCBub3QgYmUKICAgICBzZXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlZCB0aGUgTEhBU0ggY29kZSB0byB1c2UgcHJvdG90eXBlcyBmb3IgY2FsbGJhY2tzLCBhbmQgY3JlYXRlZAogICAgIG1hY3JvcyB0byBkZWNsYXJlIGFuZCBpbXBsZW1lbnQgdGhpbiAob3B0aW9uYWxseSBzdGF0aWMpIGZ1bmN0aW9ucwogICAgIHRoYXQgcHJvdmlkZSB0eXBlLXNhZmV0eSBhbmQgYXZvaWQgZnVuY3Rpb24gcG9pbnRlciBjYXN0aW5nIGZvciB0aGUKICAgICB0eXBlLXNwZWNpZmljIGNhbGxiYWNrcy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBLZXJiZXJvcyBDaXBoZXIgU3VpdGVzIHRvIGJlIHVzZWQgd2l0aCBUTFMsIGFzIHdyaXR0ZW4gaW4KICAgICBSRkMgMjcxMi4KICAgICBbVmVlcnMgU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4sCiAgICAgIEplZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT4sIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFJlZm9ybWF0IHRoZSBGQVEgc28gdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgY2FuIGJlIGRpdmlkZWQKICAgICBpbiBzZWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN1YmplY3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgemxpYiBjb21wcmVzc2lvbiBjb2RlIGxvYWQgWkxJQi5ETEwgZHluYW1pY2FsbHkgdW5kZXIKICAgICBXaW5kb3dzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2Rfc3FydCBmb3IgY29tcHV0aW5nIHNxdWFyZSByb290cyBtb2R1bG8gYSBwcmltZQogICAgICh1c2luZyB0aGUgcHJvYmFiaWxpc3RpYyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gdW5sZXNzCiAgICAgcCA9PSAzIChtb2QgNCkgIG9yICBwID09IDUgKG1vZCA4KSwgIHdoaWNoIGFyZSBjYXNlcyB0aGF0IGNhbgogICAgIGJlIGhhbmRsZWQgZGV0ZXJtaW5pc3RpY2FsbHkpLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIEJOX21vZF9pbnZlcnNlIGZhc3RlciBieSBleHBsaWNpdGx5IGhhbmRsaW5nIHNtYWxsIHF1b3RpZW50cwogICAgIGluIHRoZSBFdWNsaWQgbG9vcC4gKFNwZWVkIGdhaW4gYWJvdXQgMjAlIGZvciBzbWFsbCBtb2R1bGkgWzI1NiBvcgogICAgIDUxMiBiaXRzXSwgYWJvdXQgMzAlIGZvciBsYXJnZXIgb25lcyBbMTAyNCBvciAyMDQ4IGJpdHNdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fa3JvbmVja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9nY2Qgc28gdGhhdCBpdCB3b3JrcyBvbiBuZWdhdGl2ZSBpbnB1dHM7IHRoZSByZXN1bHQgaXMKICAgICBwb3NpdGl2ZSB1bmxlc3MgYm90aCBwYXJhbWV0ZXJzIGFyZSB6ZXJvLgogICAgIFByZXZpb3VzbHkgc29tZXRoaW5nIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gaW5maW5pdGUgbG9vcCB3YXMKICAgICBwb3NzaWJsZSBiZWNhdXNlIG51bWJlcnMgY291bGQgYmUgZ3Jvd2luZyBpbnN0ZWFkIG9mIHNocmlua2luZwogICAgIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFdWNsaWQncyBhbGdvcml0aG0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2lzX3dvcmQoKSBhbmQgQk5faXNfb25lKCkgbWFjcm9zIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQogICAgIHNpZ24gb2YgdGhlIG51bWJlciBpbiBxdWVzdGlvbi4KCiAgICAgRml4IEJOX2lzX3dvcmQoYSx3KSB0byB3b3JrIGNvcnJlY3RseSBmb3IgdyA9PSAwLgoKICAgICBUaGUgb2xkIEJOX2lzX3dvcmQoYSx3KSBtYWNybyBpcyBub3cgY2FsbGVkIEJOX2Fic19pc193b3JkKGEsdykKICAgICBiZWNhdXNlIGl0cyB0ZXN0IGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiAnYScgZXF1YWxzICd3Jy4KICAgICBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZG9lcyAqbm90KiBoYW5kbGUgdyA9PSAwIHJlbGlhYmx5OwogICAgIGl0IGV4aXN0cyBtb3N0bHkgZm9yIHVzZSBpbiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEJOX2lzX3plcm8oKSwKICAgICBCTl9pc19vbmUoKSwgYW5kIEJOX2lzX3dvcmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fc3dhcC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgQk5fbm5tb2QgaW5zdGVhZCBvZiBCTl9tb2QgaW4gY3J5cHRvL2JuL2JuX2V4cC5jIHNvIHRoYXQKICAgICB0aGUgZXhwb25lbnRpYXRpb24gZnVuY3Rpb25zIGFyZSBtb3JlIGxpa2VseSB0byBwcm9kdWNlIHJlYXNvbmFibGUKICAgICByZXN1bHRzIG9uIG5lZ2F0aXZlIGlucHV0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX211bCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZS4KICAgICBQcmV2aW91c2x5LCBpdCBjb3VsZCBiZSBuZWdhdGl2ZSBpZiBvbmUgb2YgdGhlIGZhY3RvcnMgd2FzIG5lZ2F0aXZlOwogICAgIEkgZG9uJ3QgdGhpbmsgYW55b25lIHJlYWxseSB3YW50ZWQgdGhhdCBiZWhhdmlvdXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBCTl9tb2RfLi4uIGZ1bmN0aW9ucyBpbnRvIG5ldyBmaWxlIGNyeXB0by9ibi9ibl9tb2QuYwogICAgIChleGNlcHQgZm9yIGV4cG9uZW50aWF0aW9uLCB3aGljaCBzdGF5cyBpbiBjcnlwdG8vYm4vYm5fZXhwLmMsCiAgICAgYW5kIEJOX21vZF9tdWxfcmVjaXByb2NhbCwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX3JlY3AuYykKICAgICBhbmQgYWRkIG5ldyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fbm5tb2QKICAgICAgICAgIEJOX21vZF9zcXIKICAgICAgICAgIEJOX21vZF9hZGQKICAgICAgICAgIEJOX21vZF9hZGRfcXVpY2sKICAgICAgICAgIEJOX21vZF9zdWIKICAgICAgICAgIEJOX21vZF9zdWJfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQxCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MV9xdWljawogICAgICAgICAgQk5fbW9kX2xzaGlmdAogICAgICAgICAgQk5fbW9kX2xzaGlmdF9xdWljawoKICAgICBUaGVzZSBmdW5jdGlvbnMgYWx3YXlzIGdlbmVyYXRlIG5vbi1uZWdhdGl2ZSByZXN1bHRzLgoKICAgICBCTl9ubm1vZCBvdGhlcndpc2UgaXMgbGlrZSBCTl9tb2QgKGlmIEJOX21vZCBjb21wdXRlcyBhIHJlbWFpbmRlciAgcgogICAgIHN1Y2ggdGhhdCAgfG18IDwgciA8IDAsICBCTl9ubm1vZCB3aWxsIG91dHB1dCAgcmVtICsgfG18ICBpbnN0ZWFkKS4KCiAgICAgQk5fbW9kX1hYWF9xdWljayhyLCBhLCBbYixdIG0pIGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgYXMKICAgICBCTl9tb2RfWFhYKHIsIGEsIFtiLF0gbSwgY3R4KSwgYnV0IHJlcXVpcmVzIHRoYXQgIGEgIFthbmQgIGJdCiAgICAgYmUgcmVkdWNlZCBtb2R1bG8gIG0uCiAgICAgW0xlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+LCBCb2RvIE1vZWxsZXJdCgojaWYgMAogICAgIFRoZSBmb2xsb3dpbmcgZW50cnkgYWNjaWRlbnRpbHkgYXBwZWFyZWQgaW4gdGhlIENIQU5HRVMgZmlsZQogICAgIGRpc3RyaWJ1dGVkIHdpdGggT3BlblNTTCAwLjkuNy4gIFRoZSBtb2RpZmljYXRpb25zIGRlc2NyaWJlZCBpbgogICAgIGl0IGRvICpub3QqIGFwcGx5IHRvIE9wZW5TU0wgMC45LjcuCgogICopIFJlbW92ZSBhIGZldyBjYWxscyB0byBibl93ZXhwYW5kKCkgaW4gQk5fc3FyKCkgKHRoZSBvbmUgaW4gdGhlcmUKICAgICB3YXMgYWN0dWFsbHkgbmV2ZXIgbmVlZGVkKSBhbmQgaW4gQk5fbXVsKCkuICBUaGUgcmVtb3ZhbCBpbiBCTl9tdWwoKQogICAgIHJlcXVpcmVkIGEgc21hbGwgY2hhbmdlIGluIGJuX211bF9wYXJ0X3JlY3Vyc2l2ZSgpIGFuZCB0aGUgYWRkaXRpb24KICAgICBvZiB0aGUgZnVuY3Rpb25zIGJuX2NtcF9wYXJ0X3dvcmRzKCksIGJuX3N1Yl9wYXJ0X3dvcmRzKCkgYW5kCiAgICAgYm5fYWRkX3BhcnRfd29yZHMoKSwgd2hpY2ggZG8gdGhlIHNhbWUgdGhpbmcgYXMgYm5fY21wX3dvcmRzKCksCiAgICAgYm5fc3ViX3dvcmRzKCkgYW5kIGJuX2FkZF93b3JkcygpIGV4Y2VwdCB0aGV5IHRha2UgYXJyYXlzIHdpdGgKICAgICBkaWZmZXJpbmcgc2l6ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KI2VuZGlmCgogICopIEluICdvcGVuc3NsIHBhc3N3ZCcsIHZlcmlmeSBwYXNzd29yZHMgcmVhZCBmcm9tIHRoZSB0ZXJtaW5hbAogICAgIHVubGVzcyB0aGUgJy1zYWx0JyBvcHRpb24gaXMgdXNlZCAod2hpY2ggdXN1YWxseSBtZWFucyB0aGF0CiAgICAgdmVyaWZpY2F0aW9uIHdvdWxkIGp1c3Qgd2FzdGUgdXNlcidzIHRpbWUgc2luY2UgdGhlIHJlc3VsdGluZwogICAgIGhhc2ggaXMgZ29pbmcgdG8gYmUgY29tcGFyZWQgd2l0aCBzb21lIGdpdmVuIHBhc3N3b3JkIGhhc2gpCiAgICAgb3IgdGhlIG5ldyAnLW5vdmVyaWZ5JyBvcHRpb24gaXMgdXNlZC4KCiAgICAgVGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgaXQgZG9lcyBub3QgYWZmZWN0CiAgICAgbm9uLWludGVyYWN0aXZlIHVzZSBvZiAnb3BlbnNzbCBwYXNzd2QnIChwYXNzd29yZHMgb24gdGhlIGNvbW1hbmQKICAgICBsaW5lLCAnLXN0ZGluJyBvcHRpb24sICctaW4gLi4uJyBvcHRpb24pIGFuZCB0aHVzIHNob3VsZCBub3QKICAgICBjYXVzZSBhbnkgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIFJTQXJlZiwgc2luY2UgdGhlcmUncyBubyBtb3JlIG5lZWQgZm9yIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgRFNPIGxvYWQgYWxvbmcgYSBwYXRoIGdpdmVuIHRocm91Z2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAoU0hMSUJfUEFUSCkgd2l0aCBzaGxfbG9hZCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBFTkdJTkUgY29kZSBhcyBhIHJlc3VsdCBvZiBCSUdOVU0gY29uc3RpZmljYXRpb24uCiAgICAgQWxzbyBjb25zdGlmeSB0aGUgUlNBIGNvZGUgYW5kIG1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaXQuICBJbiBhCiAgICAgZmV3IHBsYWNlcywgbW9zdCBub3RhYmxlIGluIHRoZSBkZXB0aCBvZiB0aGUgQVNOLjEgY29kZSwgdWdseQogICAgIGNhc3RzIGJhY2sgdG8gbm9uLWNvbnN0IHdlcmUgcmVxdWlyZWQgKHRvIGJlIHNvbHZlZCBhdCBhIGxhdGVyCiAgICAgdGltZSkKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHNvIHRoZSBvcGVuc3NsIGFwcGxpY2F0aW9uIGhhcyBhbGwgZW5naW5lcyBsb2FkZWQgYnkgZGVmYXVsdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25zdGlmeSB0aGUgQklHTlVNIHJvdXRpbmVzIGEgbGl0dGxlIG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKCUVOR0lORV9sb2FkX2Nzd2lmdCgpCglFTkdJTkVfbG9hZF9jaGlsKCkKCUVOR0lORV9sb2FkX2F0YWxsYSgpCglFTkdJTkVfbG9hZF9udXJvbigpCglFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKQoKICAgICBUaGF0IHdheSwgYW4gYXBwbGljYXRpb24gY2FuIGl0c2VsZiBjaG9vc2UgaWYgZXh0ZXJuYWwgZW5naW5lcyB0aGF0CiAgICAgYXJlIGJ1aWx0LWluIGluIE9wZW5TU0wgc2hhbGwgZXZlciBiZSB1c2VkIG9yIG5vdC4gIFRoZSBiZW5lZml0IGlzCiAgICAgdGhhdCBhcHBsaWNhdGlvbnMgd29uJ3QgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBsaWJkbCBvciBvdGhlciBkc28KICAgICBsaWJyYXJpZXMgdW5sZXNzIGl0J3MgcmVhbGx5IG5lZWRlZC4KCiAgICAgQ2hhbmdlZCAnb3BlbnNzbCBlbmdpbmUnIHRvIGxvYWQgYWxsIGVuZ2luZXMgb24gZGVtYW5kLgogICAgIENoYW5nZWQgdGhlIGVuZ2luZSBoZWFkZXIgZmlsZXMgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uIG9mIHNvbWUKICAgICBkZWNsYXJhdGlvbnMgKHRoZXkgZGlmZmVyZWQhKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSAnb3BlbnNzbCBlbmdpbmUnIGNhbiBub3cgbGlzdCBjYXBhYmlsaXRpZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiAnb3BlbnNzbCBlbmdpbmUnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldmVyIGNhbGwgbG9hZF9kaF9wYXJhbShOVUxMKSBpbiBzX3NlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgZW5naW5lIGFwcGxpY2F0aW9uLiAgSXQgY2FuIGN1cnJlbnRseSBsaXN0IGVuZ2luZXMgYnkgbmFtZSBhbmQKICAgICBpZGVudGl0eSwgYW5kIHRlc3QgaWYgdGhleSBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEltcHJvdmUgUlBNIHNwZWNpZmljYXRpb24gZmlsZSBieSBmb3JjaW5nIHN5bWJvbGljIGxpbmtpbmcgYW5kIG1ha2luZwogICAgIHN1cmUgdGhlIGluc3RhbGxlZCBkb2N1bWVudGF0aW9uIGlzIGFsc28gb3duZWQgYnkgcm9vdC5yb290LgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+XQoKICAqKSBHaXZlIHRoZSBPcGVuU1NMIGFwcGxpY2F0aW9ucyBtb3JlIHBvc3NpYmlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YKICAgICBrZXlzIChwdWJsaWMgYXMgd2VsbCBhcyBwcml2YXRlKSBoYW5kbGVkIGJ5IGVuZ2luZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE9DU1AgY29kZSB0aGF0IGNvbWVzIGZyb20gQ2VydENvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBWTVMgc3VwcG9ydCBmb3IgdGhlIFJpam5kYWVsIGNvZGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgdW50ZXN0ZWQgc3VwcG9ydCBmb3IgTnVyb24gY3J5cHRvIGFjY2VsZXJhdG9yLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgY3J5cHRvZ3JhcGhpYyBkZXZpY2VzLiAgVGhpcyBjb2RlIHdhcwogICAgIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBhcyB0aGUgImVuZ2luZSIgYnJhbmNoLgogICAgIFtHZW9mZiBUaG9ycGUsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3b3JrIHRoZSBmaWxlbmFtZS10cmFuc2xhdGlvbiBpbiB0aGUgRFNPIGNvZGUuIEl0IGlzIG5vdyBwb3NzaWJsZSB0bwogICAgIGhhdmUgZmFyIGdyZWF0ZXIgY29udHJvbCBvdmVyIGhvdyBhICJuYW1lIiBpcyB0dXJuZWQgaW50byBhIGZpbGVuYW1lCiAgICAgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgYW5kIGFueSBvZGRpdGllcyBhYm91dCB0aGUKICAgICBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkgZmlsZW5hbWVzIG9uIGVhY2ggc3lzdGVtLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFN1cHBvcnQgdGhyZWFkcyBvbiBGcmVlQlNELWVsZiBpbiBDb25maWd1cmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBTSEExIGFzc2VtYmx5IHByb2JsZW0gd2l0aCBNQVNNOiBpdCBwcm9kdWNlcwogICAgIHdhcm5pbmdzIGFib3V0IGNvcnJ1cHQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2hlbiBhc3NlbWJsaW5nCiAgICAgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoaXMgaXMgY2F1c2VkIGJ5IHRoZSBvdmVybGFwcGluZwogICAgIG9mIHR3byBzZWN0aW9ucy4KICAgICBbQmVybmQgTWF0dGhlcyA8bWFpbmJ1Z0BjZWxvY29tLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBOQ09ORiBjaGFuZ2VzLgogICAgIE5DT05GX2dldF9udW1iZXIoKSBoYXMgbm8gZXJyb3IgY2hlY2tpbmcgYXQgYWxsLiAgQXMgYSByZXBsYWNlbWVudCwKICAgICBOQ09ORl9nZXRfbnVtYmVyX2UoKSBpcyBkZWZpbmVkIChfZSBmb3IgImVycm9yIGNoZWNraW5nIikgYW5kIGlzCiAgICAgcHJvbW90ZWQgc3Ryb25nbHkuICBUaGUgb2xkIE5DT05GX2dldF9udW1iZXIgaXMga2VwdCBhcm91bmQgZm9yCiAgICAgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgICAgTWFrZSBpdCBwb3NzaWJsZSBmb3IgbWV0aG9kcyB0byBsb2FkIGZyb20gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBCSU8sCiAgICAgYnkgcHJvdmlkaW5nIGEgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGlzIGdpdmVuIGEgbmFtZSBpbnN0ZWFkIG9mIGEgQklPLgogICAgIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhbgogICAgIExEQVAgc2VydmVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3Igbm9uIGJsb2NraW5nIGFjY2VwdCBCSU9zLiBBZGRlZCBuZXcgSS9PIHNwZWNpYWwgcmVhc29uCiAgICAgQklPX1JSX0FDQ0VQVCB0byBjb3ZlciB0aGlzIGNhc2UuIFByZXZpb3VzbHkgdXNlIG9mIGFjY2VwdCBCSU9zCiAgICAgd2l0aCBub24gYmxvY2tpbmcgSS9PIHdhcyBub3QgcG9zc2libGUgYmVjYXVzZSBubyByZXRyeSBjb2RlIHdhcwogICAgIGltcGxlbWVudGVkLiBBbHNvIGFkZGVkIG5ldyBTU0wgY29kZSBTU0xfV0FOVF9BQ0NFUFQgdG8gY292ZXIKICAgICB0aGlzIGNhc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgdGhlIGJlZ2lubmluZ3Mgb2YgUmlqbmRhZWwgc3VwcG9ydC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBidWcgaW4gRGlyZWN0b3J5U3RyaW5nIG1hc2sgc2V0dGluZy4gQWRkIHN1cHBvcnQgZm9yCiAgICAgWDUwOV9OQU1FX3ByaW50X2V4KCkgaW4gJ3JlcScgYW5kIFg1MDlfcHJpbnRfZXgoKSBmdW5jdGlvbgogICAgIHRvIGFsbG93IGNlcnRpZmljYXRlIHByaW50aW5nIHRvIG1vcmUgY29udHJvbGxhYmxlLCBhZGRpdGlvbmFsCiAgICAgJ2NlcnRvcHQnIG9wdGlvbiB0byAneDUwOScgdG8gYWxsb3cgbmV3IHByaW50aW5nIG9wdGlvbnMgdG8gYmUKICAgICBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gb2xkIEVBWSBNRDUgaGFjayBmcm9tIGVfb3MuaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmwgYW5kIDAuOS42bSAgWzE3IE1hciAyMDA0XQoKICAqKSBGaXggbnVsbC1wb2ludGVyIGFzc2lnbm1lbnQgaW4gZG9fY2hhbmdlX2NpcGhlcl9zcGVjKCkgcmV2ZWFsZWQKICAgICBieSB1c2luZyB0aGUgQ29kZW5vbWljb24gVExTIFRlc3QgVG9vbCAoQ1ZFLTIwMDQtMDA3OSkKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ayBhbmQgMC45LjZsICBbMDQgTm92IDIwMDNdCgogICopIEZpeCBhZGRpdGlvbmFsIGJ1ZyByZXZlYWxlZCBieSB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBidWcgdHJpZ2dlcmluZyBsYXJnZSByZWN1cnNpb24gd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGNlcnRhaW4gQVNOLjEgdGFncyAoQ1ZFLTIwMDMtMDg1MSkKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmogYW5kIDAuOS42ayAgWzMwIFNlcCAyMDAzXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJldmVhbGVkIGJ5IHJ1bm5pbmcgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3Agb3V0IG9mIGJvdW5kcyByZWFkcyBpbiB0aGUgQVNOMSBjb2RlIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBpbnZhbGlkIHRhZ3MgKENWRS0yMDAzLTA1NDMgYW5kIENWRS0yMDAzLTA1NDQpLgogICAgIAogICAgIElmIHZlcmlmeSBjYWxsYmFjayBpZ25vcmVzIGludmFsaWQgcHVibGljIGtleSBlcnJvcnMgZG9uJ3QgdHJ5IHRvIGNoZWNrCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIHdpdGggdGhlIE5VTEwgcHVibGljIGtleS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19hY2NlcHQoKSAoc3NsL3MzX3NydnIuYykgb25seSBhY2NlcHQgYSBjbGllbnQgY2VydGlmaWNhdGUKICAgICBpZiB0aGUgc2VydmVyIHJlcXVlc3RlZCBvbmU6IGFzIHN0YXRlZCBpbiBUTFMgMS4wIGFuZCBTU0wgMy4wCiAgICAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkgKHNzbC9zM19zcnZyLmMpLCB0b2xlcmF0ZSBhZGRpdGlvbmFsCiAgICAgZXh0cmEgZGF0YSBhZnRlciB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyBub3Qgb25seSBmb3IgVExTIDEuMAogICAgIGJ1dCBhbHNvIGZvciBTU0wgMy4wIChhcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXR0aGlhcyBMb2VwZmVdCgogICopIENoYW5nZSBYNTA5X2NlcnRpZmljYXRlX3R5cGUoKSB0byBtYXJrIHRoZSBrZXkgYXMgZXhwb3J0ZWQvZXhwb3J0YWJsZQogICAgIHdoZW4gaXQncyA1MTIgKmJpdHMqIGxvbmcsIG5vdCA1MTIgYnl0ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZpIGFuZCAwLjkuNmogIFsxMCBBcHIgMjAwM10KCiAgKikgQ291bnRlcm1lYXN1cmUgYWdhaW5zdCB0aGUgS2xpbWEtUG9rb3JueS1Sb3NhIGV4dGVuc2lvbiBvZgogICAgIEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgcGFkZGluZzogdHJlYXQKICAgICBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIG1pc21hdGNoIGxpa2UgYSBkZWNyeXB0aW9uIGVycm9yCiAgICAgaW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSAoc3NsL3MzX3NydnIuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBvbiBSU0EgYmxpbmRpbmcgYnkgZGVmYXVsdCBpbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgIHRvIGF2b2lkIGEgdGltaW5nIGF0dGFjay4gQXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCBpdCBjYW4gY2FsbAogICAgIFJTQV9ibGluZGluZ19vZmYoKSBvciB1c2UgdGhlIG5ldyBmbGFnIFJTQV9GTEFHX05PX0JMSU5ESU5HLgogICAgIFRoZXkgd291bGQgYmUgaWxsLWFkdmlzZWQgdG8gZG8gc28gaW4gbW9zdCBjYXNlcy4KICAgICBbQmVuIExhdXJpZSwgU3RldmUgSGVuc29uLCBHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFJTQSBibGluZGluZyBjb2RlIHNvIHRoYXQgaXQgd29ya3Mgd2hlbiB0aGUgUFJORyBpcyBub3QKICAgICBzZWVkZWQgKGluIHRoaXMgY2FzZSwgdGhlIHNlY3JldCBSU0EgZXhwb25lbnQgaXMgYWJ1c2VkIGFzCiAgICAgYW4gdW5wcmVkaWN0YWJsZSBzZWVkIC0tIGlmIGl0IGlzIG5vdCB1bnByZWRpY3RhYmxlLCB0aGVyZQogICAgIGlzIG5vIHBvaW50IGluIGJsaW5kaW5nIGFueXdheSkuICBNYWtlIFJTQSBibGluZGluZyB0aHJlYWQtc2FmZQogICAgIGJ5IHJlbWVtYmVyaW5nIHRoZSBjcmVhdG9yJ3MgdGhyZWFkIElEIGluIHJzYS0+YmxpbmRpbmcgYW5kCiAgICAgaGF2aW5nIGFsbCBvdGhlciB0aHJlYWRzIHVzZSBsb2NhbCBvbmUtdGltZSBibGluZGluZyBmYWN0b3JzCiAgICAgKHRoaXMgcmVxdWlyZXMgbW9yZSBjb21wdXRhdGlvbiB0aGFuIHNoYXJpbmcgcnNhLT5ibGluZGluZywgYnV0CiAgICAgYXZvaWRzIGV4Y2Vzc2l2ZSBsb2NraW5nOyBhbmQgaWYgYW4gUlNBIG9iamVjdCBpcyBub3Qgc2hhcmVkCiAgICAgYmV0d2VlbiB0aHJlYWRzLCBibGluZGluZyB3aWxsIHN0aWxsIGJlIHZlcnkgZmFzdCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZoIGFuZCAwLjkuNmkgIFsxOSBGZWIgMjAwM10KCiAgKikgSW4gc3NsM19nZXRfcmVjb3JkIChzc2wvczNfcGt0LmMpLCBtaW5pbWl6ZSBpbmZvcm1hdGlvbiBsZWFrZWQKICAgICB2aWEgdGltaW5nIGJ5IHBlcmZvcm1pbmcgYSBNQUMgY29tcHV0YXRpb24gZXZlbiBpZiBpbmNvcnJyZWN0CiAgICAgYmxvY2sgY2lwaGVyIHBhZGRpbmcgaGFzIGJlZW4gZm91bmQuICBUaGlzIGlzIGEgY291bnRlcm1lYXN1cmUKICAgICBhZ2FpbnN0IGFjdGl2ZSBhdHRhY2tzIHdoZXJlIHRoZSBhdHRhY2tlciBoYXMgdG8gZGlzdGluZ3Vpc2gKICAgICBiZXR3ZWVuIGJhZCBwYWRkaW5nIGFuZCBhIE1BQyB2ZXJpZmljYXRpb24gZXJyb3IuIChDVkUtMjAwMy0wMDc4KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJyaWNlIENhbnZlbCAoRVBGTCksCiAgICAgQWxhaW4gSGlsdGdlbiAoVUJTKSwgU2VyZ2UgVmF1ZGVuYXkgKEVQRkwpLCBhbmQKICAgICBNYXJ0aW4gVnVhZ25vdXggKEVQRkwsIElsaW9uKV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZnIGFuZCAwLjkuNmggIFs1IERlYyAyMDAyXQoKICAqKSBOZXcgZnVuY3Rpb24gT1BFTlNTTF9jbGVhbnNlKCksIHdoaWNoIGlzIHVzZWQgdG8gY2xlYW5zZSBhIHNlY3Rpb24gb2YKICAgICBtZW1vcnkgZnJvbSBpdCdzIGNvbnRlbnRzLiAgVGhpcyBpcyBkb25lIHdpdGggYSBjb3VudGVyIHRoYXQgd2lsbAogICAgIHBsYWNlIGFsdGVybmF0aW5nIHZhbHVlcyBpbiBlYWNoIGJ5dGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNvbHZlCiAgICAgdHdvIGlzc3VlczogMSkgdGhlIHJlbW92YWwgb2YgY2FsbHMgdG8gbWVtc2V0KCkgYnkgaGlnaGx5IG9wdGltaXppbmcKICAgICBjb21waWxlcnMsIGFuZCAyKSBjbGVhbnNpbmcgd2l0aCBvdGhlciB2YWx1ZXMgdGhhbiAwLCBzaW5jZSB0aG9zZSBjYW4KICAgICBiZSByZWFkIHRocm91Z2ggb24gY2VydGFpbiBtZWRpYSwgZm9yIGV4YW1wbGUgYSBzd2FwIHNwYWNlIG9uIGRpc2suCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQnVnZml4OiBjbGllbnQgc2lkZSBzZXNzaW9uIGNhY2hpbmcgZGlkIG5vdCB3b3JrIHdpdGggZXh0ZXJuYWwgY2FjaGluZywKICAgICBiZWNhdXNlIHRoZSBzZXNzaW9uLT5jaXBoZXIgc2V0dGluZyB3YXMgbm90IHJlc3RvcmVkIHdoZW4gcmVsb2FkaW5nCiAgICAgZnJvbSB0aGUgZXh0ZXJuYWwgY2FjaGUuIFRoaXMgcHJvYmxlbSB3YXMgbWFza2VkLCB3aGVuCiAgICAgU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHIChwYXJ0IG9mIFNTTF9PUF9BTEwpIHdhcyBzZXQuCiAgICAgKEZvdW5kIGJ5IFN0ZXZlIEhhc2xhbSA8c3RldmVAYXJhcW5pZC5kZHRzLm5ldD4uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggY2xpZW50X2NlcnRpZmljYXRlIChzc2wvczJfY2xudC5jKTogVGhlIHBlcm1pc3NpYmxlIHRvdGFsCiAgICAgbGVuZ3RoIG9mIHRoZSBSRVFVRVNULUNFUlRJRklDQVRFIG1lc3NhZ2UgaXMgMTggLi4gMzQsIG5vdCAxNyAuLiAzMy4KICAgICBbWmVldiBMaWViZXIgPHplZXYtbEB5YWhvby5jb20+XQoKICAqKSBVbmRvIGFuIHVuZG9jdW1lbnRlZCBjaGFuZ2UgaW50cm9kdWNlZCBpbiAwLjkuNmUgd2hpY2ggY2F1c2VkCiAgICAgcmVwZWF0ZWQgY2FsbHMgdG8gT3BlblNTTF9hZGRfYWxsX2NpcGhlcnMoKSBhbmQgCiAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKSB0byBiZSBpZ25vcmVkLCBldmVuIGFmdGVyIGNhbGxpbmcKICAgICBFVlBfY2xlYW51cCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHJlYWRlciB0byBkZWFsIHdpdGggbGFzdCBsaW5lIG5vdAogICAgIGJlaW5nIHByb3Blcmx5IHRlcm1pbmF0ZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIFg1MDlfTkFNRV9jbXAoKSBzbyBpdCBhcHBsaWVzIHRoZSBzcGVjaWFsIHJ1bGVzIG9uIGhhbmRsaW5nCiAgICAgRE4gdmFsdWVzIHRoYXQgYXJlIG9mIHR5cGUgUHJpbnRhYmxlU3RyaW5nLCBhcyB3ZWxsIGFzIFJETnMgb2YgdHlwZQogICAgIGVtYWlsQWRkcmVzcyB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSB0eXBlIGlhNVN0cmluZy4KICAgICBbc3RlZmFua0B2YWxpY2VydC5jb20gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGEgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUgZmxhZyB0byB0YWtlIG92ZXIgaGFsZgogICAgIHRoZSBqb2IgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQIHdhcyBpbmNvbnNpc3RlbnRseQogICAgIGRvaW5nLCBkZWZpbmUgYSBuZXcgZmxhZyAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUwpIHRvIGJlCiAgICAgdGhlIGJpdHdpc2UtT1Igb2YgdGhlIHR3byBmb3IgdXNlIGJ5IHRoZSBtYWpvcml0eSBvZiBhcHBsaWNhdGlvbnMKICAgICB3YW50aW5nIHRoaXMgYmVoYXZpb3VyLCBhbmQgdXBkYXRlIHRoZSBkb2NzLiBUaGUgZG9jdW1lbnRlZAogICAgIGJlaGF2aW91ciBhbmQgYWN0dWFsIGJlaGF2aW91ciB3ZXJlIGluY29uc2lzdGVudCBhbmQgaGFkIGJlZW4KICAgICBjaGFuZ2luZyBhbnl3YXksIHNvIHRoaXMgaXMgbW9yZSBhIGJ1Zy1maXggdGhhbiBhIGJlaGF2aW91cmFsCiAgICAgY2hhbmdlLgogICAgIFtHZW9mZiBUaG9ycGUsIGRpYWdub3NlZCBieSBOYWRhdiBIYXInRWxdCgogICopIERvbid0IGltcG9zZSBhIDE2LWJ5dGUgbGVuZ3RoIG1pbmltdW0gb24gc2Vzc2lvbiBJRHMgaW4gc3NsL3MzX2NsbnQuYwogICAgICh0aGUgU1NMIDMuMCBhbmQgVExTIDEuMCBzcGVjaWZpY2F0aW9ucyBhbGxvdyBhbnkgbGVuZ3RoIHVwIHRvIDMyIGJ5dGVzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggaW5pdGlhbGl6YXRpb24gY29kZSByYWNlIGNvbmRpdGlvbnMgaW4KICAgICAgICBTU0x2MjNfbWV0aG9kKCksICBTU0x2MjNfY2xpZW50X21ldGhvZCgpLCAgIFNTTHYyM19zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgU1NMdjJfbWV0aG9kKCksICAgU1NMdjJfY2xpZW50X21ldGhvZCgpLCAgICBTU0x2Ml9zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgU1NMdjNfbWV0aG9kKCksICAgU1NMdjNfY2xpZW50X21ldGhvZCgpLCAgICBTU0x2M19zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgVExTdjFfbWV0aG9kKCksICAgVExTdjFfY2xpZW50X21ldGhvZCgpLCAgICBUTFN2MV9zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgc3NsMl9nZXRfY2lwaGVyX2J5X2NoYXIoKSwKICAgICAgICBzc2wzX2dldF9jaXBoZXJfYnlfY2hhcigpLgogICAgIFtQYXRyaWNrIE1jQ29ybWljayA8cGF0cmlja0B0ZWxsbWUuY29tPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZW9yZGVyIGNsZWFudXAgc2VxdWVuY2UgaW4gU1NMX0NUWF9mcmVlKCk6IG9ubHkgcmVtb3ZlIHRoZSBleF9kYXRhIGFmdGVyCiAgICAgdGhlIGNhY2hlZCBzZXNzaW9ucyBhcmUgZmx1c2hlZCwgYXMgdGhlIHJlbW92ZV9jYigpIG1pZ2h0IHVzZSBleF9kYXRhCiAgICAgY29udGVudHMuIEJ1ZyBmb3VuZCBieSBTYW0gVmFyc2hhdmNoaWsgPG1yc2FtQGNvdXJpZXItbXRhLmNvbT4KICAgICAoc2VlIFtvcGVuc3NsLm9yZyAjMjEyXSkuCiAgICAgW0dlb2ZmIFRob3JwZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHR5cG8gaW4gT0JKX3R4dDJvYmogd2hpY2ggaW5jb3JyZWN0bHkgcGFzc2VkIHRoZSBjb250ZW50CiAgICAgbGVuZ3RoLCBpbnN0ZWFkIG9mIHRoZSBlbmNvZGluZyBsZW5ndGggdG8gZDJpX0FTTjFfT0JKRUNULgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZiBhbmQgMC45LjZnICBbOSBBdWcgMjAwMl0KCiAgKikgW0luIDAuOS42Zy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IGNyeXB0by9lbmdpbmUvdmVuZG9yX2RlZm5zL2Nzd2lmdC5oIGZvciBXSU4zMiAodXNlICdfc3RkY2FsbCcpLgogICAgIFtMeW5uIEdhemlzIDxsZ2F6aXNAcmFpbmJvdy5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmUgYW5kIDAuOS42ZiAgWzggQXVnIDIwMDJdCgogICopIEZpeCBBU04xIGNoZWNrcy4gQ2hlY2sgZm9yIG92ZXJmbG93IGJ5IGNvbXBhcmluZyB3aXRoIExPTkdfTUFYCiAgICAgYW5kIGdldCBmaXggdGhlIGhlYWRlciBsZW5ndGggY2FsY3VsYXRpb24uCiAgICAgW0Zsb3JpYW4gV2VpbWVyIDxXZWltZXJAQ0VSVC5VbmktU3R1dHRnYXJ0LkRFPiwKCUFsb24gS2FudG9yIDxhbG9ua0BjaGVja3BvaW50LmNvbT4gKGFuZCBvdGhlcnMpLAoJU3RldmUgSGVuc29uXQoKICAqKSBVc2UgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgJ2Fzc2VydGlvbnMnIGluIGJ1ZmZlcgogICAgIG92ZXJmbG93IGNoZWNrcyBhZGRlZCBpbiAwLjkuNmUuICBUaGlzIHByZXZlbnRzIERvUyAodGhlCiAgICAgYXNzZXJ0aW9ucyBjb3VsZCBjYWxsIGFib3J0KCkpLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+LCBCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZCBhbmQgMC45LjZlICBbMzAgSnVsIDIwMDJdCgogICopIEFkZCB2YXJpb3VzIHNhbml0eSBjaGVja3MgdG8gYXNuMV9nZXRfbGVuZ3RoKCkgdG8gcmVqZWN0CiAgICAgdGhlIEFTTjEgbGVuZ3RoIGJ5dGVzIGlmIHRoZXkgZXhjZWVkIHNpemVvZihsb25nKSwgd2lsbCBhcHBlYXIKICAgICBuZWdhdGl2ZSBvciB0aGUgY29udGVudCBsZW5ndGggZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZQogICAgIHN1cHBsaWVkIGJ1ZmZlci4KICAgICBbU3RldmUgSGVuc29uLCBBZGkgU3RhdiA8c3RhdkBtZXJjdXJ5LmNvLmlsPiwgSmFtZXMgWW9uYW4gPGppbUBudGxwLmNvbT5dCgogICopIEZpeCBjaXBoZXIgc2VsZWN0aW9uIHJvdXRpbmVzOiBjaXBoZXJzIHdpdGhvdXQgZW5jcnlwdGlvbiBoYWQgbm8gZmxhZ3MKICAgICBmb3IgdGhlIGNpcGhlciBzdHJlbmd0aCBzZXQgYW5kIHdoZXJlIHRoZXJlZm9yZSBub3QgaGFuZGxlZCBjb3JyZWN0bHkKICAgICBieSB0aGUgc2VsZWN0aW9uIHJvdXRpbmVzIChQUiAjMTMwKS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IEVWUF9kc2Ffc2hhIG1hY3JvLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgTmV3IG9wdGlvbgogICAgICAgICAgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUwogICAgIGZvciBkaXNhYmxpbmcgdGhlIFNTTCAzLjAvVExTIDEuMCBDQkMgdnVsbmVyYWJpbGl0eSBjb3VudGVybWVhc3VyZQogICAgIHRoYXQgd2FzIGFkZGVkIGluIE9wZW5TU0wgMC45LjZkLgoKICAgICBBcyB0aGUgY291bnRlcm1lYXN1cmUgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBzb21lCiAgICAgYnJva2VuIFNTTCBpbXBsZW1lbnRhdGlvbnMsIHRoZSBuZXcgb3B0aW9uIGlzIHBhcnQgb2YgU1NMX09QX0FMTC4KICAgICBTU0xfT1BfQUxMIGlzIHVzdWFsbHkgZW1wbG95ZWQgd2hlbiBjb21wYXRpYmlsaXR5IHdpdGggd2VpcmQgU1NMCiAgICAgaW1wbGVtZW50YXRpb25zIGlzIGRlc2lyZWQgKGUuZy4gJy1idWdzJyBvcHRpb24gdG8gJ3NfY2xpZW50JyBhbmQKICAgICAnc19zZXJ2ZXInKSwgc28gdGhlIG5ldyBvcHRpb24gaXMgYXV0b21hdGljYWxseSBzZXQgaW4gbWFueQogICAgIGFwcGxpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2VzIGluIHNlY3VyaXR5IHBhdGNoOgoKICAgICBDaGFuZ2VzIG1hcmtlZCAiKENIQVRTKSIgd2VyZSBzcG9uc29yZWQgYnkgdGhlIERlZmVuc2UgQWR2YW5jZWQKICAgICBSZXNlYXJjaCBQcm9qZWN0cyBBZ2VuY3kgKERBUlBBKSBhbmQgQWlyIEZvcmNlIFJlc2VhcmNoIExhYm9yYXRvcnksCiAgICAgQWlyIEZvcmNlIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIKICAgICBGMzA2MDItMDEtMi0wNTM3LgoKICAqKSBBZGQgdmFyaW91cyBzYW5pdHkgY2hlY2tzIHRvIGFzbjFfZ2V0X2xlbmd0aCgpIHRvIHJlamVjdAogICAgIHRoZSBBU04xIGxlbmd0aCBieXRlcyBpZiB0aGV5IGV4Y2VlZCBzaXplb2YobG9uZyksIHdpbGwgYXBwZWFyCiAgICAgbmVnYXRpdmUgb3IgdGhlIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUKICAgICBzdXBwbGllZCBidWZmZXIuIChDVkUtMjAwMi0wNjU5KQogICAgIFtTdGV2ZSBIZW5zb24sIEFkaSBTdGF2IDxzdGF2QG1lcmN1cnkuY28uaWw+LCBKYW1lcyBZb25hbiA8amltQG50bHAuY29tPl0KCiAgKikgQXNzZXJ0aW9ucyBmb3IgdmFyaW91cyBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cywgbm90IGtub3duIHRvCiAgICAgaGFwcGVuIGluIHByYWN0aWNlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFZhcmlvdXMgdGVtcG9yYXJ5IGJ1ZmZlcnMgdG8gaG9sZCBBU0NJSSB2ZXJzaW9ucyBvZiBpbnRlZ2VycyB3ZXJlCiAgICAgdG9vIHNtYWxsIGZvciA2NCBiaXQgcGxhdGZvcm1zLiAoQ1ZFLTIwMDItMDY1NSkKICAgICBbTWF0dGhldyBCeW5nLU1hZGRpY2sgPG1ibUBhbGRpZ2l0YWwuY28udWs+IGFuZCBCZW4gTGF1cmllIChDSEFUUyk+CgogICopIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMyBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBzZXNzaW9uIElEIHRvIGEgY2xpZW50LiAoQ1ZFLTIwMDItMDY1NikKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDIgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgY2xpZW50IG1hc3RlciBrZXkuIChDVkUtMjAwMi0wNjU2KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YyBhbmQgMC45LjZkICBbOSBNYXkgMjAwMl0KCiAgKikgRml4IGNyeXB0by9hc24xL2Ffc2lnbi5jIHNvIHRoYXQgJ3BhcmFtZXRlcnMnIGlzIG9taXR0ZWQgKG5vdAogICAgIGVuY29kZWQgYXMgTlVMTCkgd2l0aCBpZC1kc2Etd2l0aC1zaGExLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCb2RvIE1vZWxsZXJdCgogICopIENoZWNrIHZhcmlvdXMgWDUwOV8uLi4oKSByZXR1cm4gdmFsdWVzIGluIGFwcHMvcmVxLmMuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBGaXggQkFTRTY0IGRlY29kZSAoRVZQX0RlY29kZVVwZGF0ZSkgZm9yIGRhdGEgd2l0aCBDUi9MRiBlbmRlZCBsaW5lczoKICAgICBhbiBlbmQtb2YtZmlsZSBjb25kaXRpb24gd291bGQgZXJyb25vdXNseSBiZSBmbGFnZ2VkLCB3aGVuIHRoZSBDUkxGCiAgICAgd2FzIGp1c3QgYXQgdGhlIGVuZCBvZiBhIHByb2Nlc3NlZCBibG9jay4gVGhlIGJ1ZyB3YXMgZGlzY292ZXJlZCB3aGVuCiAgICAgcHJvY2Vzc2luZyBkYXRhIHRocm91Z2ggYSBidWZmZXJpbmcgbWVtb3J5IEJJTyBoYW5kaW5nIHRoZSBkYXRhIHRvIGEKICAgICBCQVNFNjQtZGVjb2RpbmcgQklPLiBCdWcgZnVuZCBhbmQgcGF0Y2ggc3VibWl0dGVkIGJ5IFBhdmVsIFRzZWtvdgogICAgIDxwdHNla292QHN5bnRyZXguY29tPiBhbmQgTmVkZWxjaG8gU3RhbmV2LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbXBsZW1lbnQgYSBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IGEgdnVsbmVyYWJpbGl0eSByZWNlbnRseSBmb3VuZAogICAgIGluIENCQyBjaXBoZXJzdWl0ZXMgaW4gU1NMIDMuMC9UTFMgMS4wOiBTZW5kIGFuIGVtcHR5IGZyYWdtZW50CiAgICAgYmVmb3JlIGFwcGxpY2F0aW9uIGRhdGEgY2h1bmtzIHRvIGF2b2lkIHRoZSB1c2Ugb2Yga25vd24gSVZzCiAgICAgd2l0aCBkYXRhIHBvdGVudGlhbGx5IGNob3NlbiBieSB0aGUgYXR0YWNrZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGxlbmd0aCBjaGVja3MgaW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVExTL1NTTCBsaWJyYXJ5IGJ1Z2ZpeDogdXNlIHMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhIGRpZmZlcmVudGx5CiAgICAgdG8gcHJldmVudCBzc2wzX3JlYWRfaW50ZXJuYWwoKSBmcm9tIGluY29ycmVjdGx5IGFzc3VtaW5nIHRoYXQKICAgICBzc2wzX3JlYWRfYnl0ZXMoKSBmb3VuZCBhcHBsaWNhdGlvbiBkYXRhIHdoaWxlIGhhbmRzaGFrZQogICAgIHByb2Nlc3Npbmcgd2FzIGVuYWJsZWQgd2hlbiBpbiBmYWN0IHMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhIHdhcwogICAgIG1lcmVseSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBvYmplY3QgZGVmaW5pdGlvbnMgZm9yIFByaXZhdGUgYW5kIEVudGVycHJpc2U6IHRoZXkgd2VyZSBub3QKICAgICByZWNvZ25pemVkIGluIHRoZWlyIHNob3J0bmFtZSAoPWxvd2VyY2FzZSkgcmVwcmVzZW50YXRpb24uIEV4dGVuZAogICAgIG9ial9kYXQucGwgdG8gaXNzdWUgYW4gZXJyb3Igd2hlbiB1c2luZyB1bmRlZmluZWQga2V5d29yZHMgaW5zdGVhZAogICAgIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBwcm9ibGVtIChTdmVubmluZyBTb3JlbnNlbgogICAgIDxzc3NAc3NzLmRuc2FsaWFzLm5ldD4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggREhfZ2VuZXJhdGVfcGFyYW1ldGVycygpIHNvIHRoYXQgaXQgd29ya3MgZm9yICdub24tc3RhbmRhcmQnCiAgICAgZ2VuZXJhdG9ycywgaS5lLiBnZW5lcmF0b3JzIG90aGVyIHRoYW4gMiBhbmQgNS4gIChQcmV2aW91c2x5LCB0aGUKICAgICBjb2RlIGRpZCBub3QgcHJvcGVybHkgaW5pdGlhbGlzZSB0aGUgJ2FkZCcgYW5kICdyZW0nIHZhbHVlcyB0bwogICAgIEJOX2dlbmVyYXRlX3ByaW1lKCkuKQoKICAgICBJbiB0aGUgbmV3IGdlbmVyYWwgY2FzZSwgd2UgZG8gbm90IGluc2lzdCB0aGF0ICdnZW5lcmF0b3InIGlzCiAgICAgYWN0dWFsbHkgYSBwcmltaXRpdmUgcm9vdDogVGhpcyByZXF1aXJlbWVudCBpcyByYXRoZXIgcG9pbnRsZXNzOwogICAgIGEgZ2VuZXJhdG9yIG9mIHRoZSBvcmRlci1xIHN1Ymdyb3VwIGlzIGp1c3QgYXMgZ29vZCwgaWYgbm90CiAgICAgYmV0dGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCiAKICAqKSBNYXAgbmV3IFg1MDkgdmVyaWZpY2F0aW9uIGVycm9ycyB0byBhbGVydHMuIERpc2NvdmVyZWQgYW5kIHN1Ym1pdHRlZCBieQogICAgIFRvbSBXdSA8dG9tQGFyY290LmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBzc2wzX3BlbmRpbmcoKSAoc3NsL3MzX2xpYi5jKSB0byBwcmV2ZW50IFNTTF9wZW5kaW5nKCkgZnJvbQogICAgIHJldHVybmluZyBub24temVybyBiZWZvcmUgdGhlIGRhdGEgaGFzIGJlZW4gY29tcGxldGVseSByZWNlaXZlZAogICAgIHdoZW4gdXNpbmcgbm9uLWJsb2NraW5nIEkvTy4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEpvaG4gSHVnaGVzXQoKICAqKSBTb21lIG9mIHRoZSBjaXBoZXJzIG1pc3NlZCB0aGUgc3RyZW5ndGggZW50cnkgKFNTTF9MT1cgZXRjKS4KICAgICBbQmVuIExhdXJpZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGJ1ZyBpbiBTU0xfY2xlYXIoKTogYmFkIHNlc3Npb25zIHdlcmUgbm90IHJlbW92ZWQgKGZvdW5kIGJ5CiAgICAgWW9yYW0gWmFoYXZpIDxZb3JhbVpAZ2lsaWFuLmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgaW5mb3JtYXRpb24gYWJvdXQgQ3lnV2luIDEuMyBhbmQgb24sIGFuZCBwcmVzZXJ2ZSBwcm9wZXIKICAgICBjb25maWd1cmF0aW9uIGZvciB0aGUgdmVyc2lvbnMgYmVmb3JlIHRoYXQuCiAgICAgW0NvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgcmVtb3ZhbCBmcm9tIHNlc3Npb24gY2FjaGUgKFNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oKSkgbW9yZSByb2J1c3Q6CiAgICAgY2hlY2sgd2hldGhlciB3ZSBkZWFsIHdpdGggYSBjb3B5IG9mIGEgc2Vzc2lvbiBhbmQgZG8gbm90IGRlbGV0ZSBmcm9tCiAgICAgdGhlIGNhY2hlIGluIHRoaXMgY2FzZS4gUHJvYmxlbSByZXBvcnRlZCBieSAiSXpoYXIgU2hvc2hhbmkgTGV2aSIKICAgICA8aXpoYXJAY2hlY2twb2ludC5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBEbyBub3Qgc3RvcmUgc2Vzc2lvbiBkYXRhIGludG8gdGhlIGludGVybmFsIHNlc3Npb24gY2FjaGUsIGlmIGl0CiAgICAgaXMgbmV2ZXIgaW50ZW5kZWQgdG8gYmUgbG9va2VkIHVwIChTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVAKICAgICBmbGFnIGlzIHNldCkuIFByb3Bvc2VkIGJ5IEFzbGFtIDxhc2xhbUBmdW5rLmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEhhdmUgQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoKSByZWFsbHkgY2xlYXIgYSBiaXQgd2hlbiB0aGUgcmVxdWVzdGVkCiAgICAgdmFsdWUgaXMgMC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBbSW4gMC45LjZkLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggYSBjcmFzaGJ1ZyBhbmQgYSBsb2dpYyBidWcgaW4gaHdjcmhrX2xvYWRfcHVia2V5KCkuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdGFyZ2V0IGxpbnV4LXMzOTB4LgogICAgIFtOZWFsZSBGZXJndXNvbiA8TmVhbGUuRmVyZ3Vzb25AU29mdHdhcmVBRy1VU0EuY29tPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgZWFybGllciBidWdmaXggZm9yIHRoZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DIGNhc2Ugb2YKICAgICBzc2wzX2FjY2VwdCAoc3NsL3MzX3NydnIuYykgaW5jb3JyZWN0bHkgdXNlZCBhIGxvY2FsIGZsYWcKICAgICB2YXJpYWJsZSBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgYSBDbGllbnRIZWxsbyBtZXNzYWdlIGhhcyBiZWVuCiAgICAgcmVjZWl2ZWQuICBBcyB0aGUgZmxhZyB2YWx1ZSB3aWxsIGJlIGxvc3QgYmV0d2VlbiBtdWx0aXBsZQogICAgIGludm9jYXRpb25zIG9mIHNzbDNfYWNjZXB0IHdoZW4gdXNpbmcgbm9uLWJsb2NraW5nIEkvTywgdGhlCiAgICAgZnVuY3Rpb24gbWF5IG5vdCBiZSBhd2FyZSB0aGF0IGEgaGFuZHNoYWtlIGhhcyBhY3R1YWxseSB0YWtlbgogICAgIHBsYWNlLCB0aHVzIHByZXZlbnRpbmcgYSBuZXcgc2Vzc2lvbiBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZQogICAgIHNlc3Npb24gY2FjaGUuCgogICAgIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2Ugbm93IHNldCBzLT5uZXdfc2Vzc2lvbiB0byAyIGluc3RlYWQgb2YKICAgICB1c2luZyBhIGxvY2FsIHZhcmlhYmxlLgogICAgIFtMdXR6IEphZW5pY2tlLCBCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogUmV0dXJuIC0xIGZyb20gc3NsM19nZXRfc2VydmVyX2RvbmUgKHNzbDMvczNfY2xudC5jKQogICAgIGlmIHRoZSBTU0xfUl9MRU5HVEhfTUlTTUFUQ0ggZXJyb3IgaXMgZGV0ZWN0ZWQuCiAgICAgW0dlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3NoYXJlZF9sZGZsYWcnIGNvbHVtbiBpbiBDb25maWd1cmUgcGxhdGZvcm0gdGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IEVWUF9DSVBIRVJfbW9kZSBtYWNyby4KICAgICBbIkRhbiBTLiBDYW1wZXIiIDxkYW5AYnRpLm5ldD5dCgogICopIEZpeCBzc2wzX3JlYWRfYnl0ZXMgKHNzbC9zM19wa3QuYyk6IFRvIGlnbm9yZSBtZXNzYWdlcyBvZiB1bmtub3duCiAgICAgdHlwZSwgd2UgbXVzdCB0aHJvdyB0aGVtIGF3YXkgYnkgc2V0dGluZyByci0+bGVuZ3RoIHRvIDAuCiAgICAgW0QgUCBDaGFuZyA8ZHBjQHF1YWx5cy5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmIgYW5kIDAuOS42YyAgWzIxIGRlYyAyMDAxXQoKICAqKSBGaXggQk5fcmFuZF9yYW5nZSBidWcgcG9pbnRlZCBvdXQgYnkgRG9taW5pa3VzIFNjaGVya2wKICAgICA8RG9taW5pa3VzLlNjaGVya2xAYmlvZGF0YS5jb20+LiAgKFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbgogICAgIHdvcmtlZCBpbmNvcnJlY3RseSBmb3IgdGhvc2UgY2FzZXMgd2hlcmUgIHJhbmdlID0gMTAuLi5fMiAgYW5kCiAgICAgMypyYW5nZSAgaXMgdHdvIGJpdHMgbG9uZ2VyIHRoYW4gIHJhbmdlLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPbmx5IGFkZCBzaWduaW5nIHRpbWUgdG8gUEtDUzcgc3RydWN0dXJlcyBpZiBpdCBpcyBub3QgYWxyZWFkeQogICAgIHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGNyeXB0by9vYmplY3RzL29iamVjdHMuaDogImxkLWNlIiBzaG91bGQgYmUgImlkLWNlIiwKICAgICBPQkpfbGRfY2Ugc2hvdWxkIGJlIE9CSl9pZF9jZS4KICAgICBBbHNvIHNvbWUgaXAtcGRhIE9JRHMgaW4gY3J5cHRvL29iamVjdHMvb2JqZWN0cy50eHQgd2VyZQogICAgIGluY29ycmVjdCAoY2YuIFJGQyAzMDM5KS4KICAgICBbTWF0dCBDb29wZXIsIEZyZWRlcmljIEdpdWRpY2VsbGksIEJvZG8gTW9lbGxlcl0KCiAgKikgUmVsZWFzZSBDUllQVE9fTE9DS19EWU5MT0NLIHdoZW4gQ1JZUFRPX2Rlc3Ryb3lfZHlubG9ja2lkKCkKICAgICByZXR1cm5zIGVhcmx5IGJlY2F1c2UgaXQgaGFzIG5vdGhpbmcgdG8gZG8uCiAgICAgW0FuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IG11dGV4IGNhbGxiYWNrIHJldHVybiB2YWx1ZXMgaW4gY3J5cHRvL2VuZ2luZS9od19uY2lwaGVyLmMuCiAgICAgW0FuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIENyeXB0b2dyYXBoaWMgQXBwbGlhbmNlJ3Mga2V5c2VydmVyIHRlY2hub2xvZ3kuCiAgICAgKFVzZSBlbmdpbmUgJ2tleWNsaWVudCcpCiAgICAgW0NyeXB0b2dyYXBoaWMgQXBwbGlhbmNlcyBhbmQgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBPUy8zOTAgVW5peC4gIFRoZSBDIGNvbXBpbGVyICdjODknCiAgICAgaXMgY2FsbGVkIHZpYSB0b29scy9jODkuc2ggYmVjYXVzZSBhcmd1bWVudHMgaGF2ZSB0byBiZQogICAgIHJlYXJyYW5nZWQgKGFsbCAnLUwnIG9wdGlvbnMgbXVzdCBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCBvYmplY3QKICAgICBtb2R1bGVzKS4KICAgICBbUmljaGFyZCBTaGFwaXJvIDxyc2hhcGlyb0BhYmluaXRpby5jb20+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgQnJvYWRjb20gY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzLCBiYWNrcG9ydGVkCiAgICAgZnJvbSAwLjkuNy4KICAgICBbQnJvYWRjb20sIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4sIE1hcmsgQ294XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgU3VyZVdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gCiAgICAgQmFsdGltb3JlIFRlY2hub2xvZ2llcy4gIChVc2UgZW5naW5lICdzdXJld2FyZScpCiAgICAgW0JhbHRpbW9yZSBUZWNobm9sb2dpZXMgYW5kIE1hcmsgQ294XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQWNjZWxlcmF0ZWQKICAgICBFbmNyeXB0aW9uIFByb2Nlc3NpbmcsIHd3dy5hZXAuaWUuICAoVXNlIGVuZ2luZSAnYWVwJykKICAgICBbQUVQIEluYy4gYW5kIE1hcmsgQ294XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBnY2Mgb24gVW5peFdhcmUuCiAgICAgW0dhcnkgQmVuc29uIDxnYmVuc29uQHJlZGhhdC5jb20+XQoKICAqKSBDaGFuZ2Ugc3NsL3MyX2NsbnQuYyBhbmQgc3NsL3MyX3NydnIuYyBzbyB0aGF0IHJlY2VpdmVkIGhhbmRzaGFrZQogICAgIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gYSBzaW5nbGUgcGllY2UgKGZpeGVkLWxlbmd0aCBwYXJ0IGFuZAogICAgIHZhcmlhYmxlLWxlbmd0aCBwYXJ0IGNvbWJpbmVkKSBhbmQgZml4IHZhcmlvdXMgYnVncyBmb3VuZCBvbiB0aGUgd2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgY2FjaGluZyBpbiBCSU9fZ2V0aG9zdGJ5bmFtZSgpLCBkaXJlY3RseSB1c2UgZ2V0aG9zdGJ5bmFtZSgpCiAgICAgaW5zdGVhZC4gIEJJT19nZXRob3N0YnluYW1lKCkgZG9lcyBub3Qga25vdyB3aGF0IHRpbWVvdXRzIGFyZQogICAgIGFwcHJvcHJpYXRlLCBzbyBlbnRyaWVzIHdvdWxkIHN0YXkgaW4gY2FjaGUgZXZlbiB3aGVuIHRoZXkgaGF2ZQogICAgIGJlY29tZSBpbnZhbGlkLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgUmljaCBTYWx6IDxyc2FsekB6b2xlcmEuY29tPgoKICAqKSBDaGFuZ2Ugc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MyM19zcnZyLmMpIGJlaGF2aW91ciB3aGVuCiAgICAgZmFjZWQgd2l0aCBhIHBhdGhvbG9naWNhbGx5IHNtYWxsIENsaWVudEhlbGxvIGZyYWdtZW50IHRoYXQgZG9lcwogICAgIG5vdCBjb250YWluIGNsaWVudF92ZXJzaW9uOiBJbnN0ZWFkIG9mIGFib3J0aW5nIHdpdGggYW4gZXJyb3IsCiAgICAgc2ltcGx5IGNob29zZSB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcHJvdG9jb2wgdmVyc2lvbiAoaS5lLiwKICAgICBUTFMgMS4wIHVubGVzcyBpdCBpcyBkaXNhYmxlZCkuICBJbiBwcmFjdGljZSwgQ2xpZW50SGVsbG8KICAgICBtZXNzYWdlcyBhcmUgbmV2ZXIgc2VudCBsaWtlIHRoaXMsIGJ1dCB0aGlzIGNoYW5nZSBnaXZlcyB1cwogICAgIHN0cmljdGx5IGNvcnJlY3QgYmVoYXZpb3VyIGF0IGxlYXN0IGZvciBUTFMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFNTTCBoYW5kc2hha2UgZnVuY3Rpb25zIGFuZCBTU0xfY2xlYXIoKSBzdWNoIHRoYXQgU1NMX2NsZWFyKCkKICAgICBuZXZlciByZXNldHMgcy0+bWV0aG9kIHRvIHMtPmN0eC0+bWV0aG9kIHdoZW4gY2FsbGVkIGZyb20gd2l0aGluCiAgICAgb25lIG9mIHRoZSBTU0wgaGFuZHNoYWtlIGZ1bmN0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE5pa28gQmFyaWNdCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MzX3NydnIuYyksIGdlbmVyYXRlIGEgZmF0YWwgYWxlcnQKICAgICAoc2VudCB1c2luZyB0aGUgY2xpZW50J3MgdmVyc2lvbiBudW1iZXIpIGlmIGNsaWVudF92ZXJzaW9uIGlzCiAgICAgc21hbGxlciB0aGFuIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHVzZS4gIEFsc28gY2hhbmdlCiAgICAgc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MyM19zcnZyLmMpIHRvIHNlbGVjdCBUTFMgMS4wIGlmCiAgICAgdGhlIGNsaWVudCBkZW1hbmRlZCBTU0wgMy4wIGJ1dCBvbmx5IFRMUyAxLjAgaXMgZW5hYmxlZDsgdGhlbgogICAgIHRoZSBjbGllbnQgd2lsbCBhdCBsZWFzdCBzZWUgdGhhdCBhbGVydC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgdG8gaGFuZGxlIG1lc3NhZ2UgZnJhZ21lbnRhdGlvbgogICAgIGNvcnJlY3RseS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBpbmZpbml0ZSBsb29wIGluIHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIGlmIGEKICAgICBjbGllbnQgcmVjZWl2ZXMgSGVsbG9SZXF1ZXN0IHdoaWxlIGluIGEgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IGJ1ZyBub3RpY2VkIGJ5IEFuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgQnVnZml4IGluIHNzbDNfYWNjZXB0IChzc2wvczNfc3J2ci5jKTogQ2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DCiAgICAgc2hvdWxkIGVuZCBpbiAnYnJlYWsnLCBub3QgJ2dvdG8gZW5kJyB3aGljaCBjaXJjdW1lbnRzIHZhcmlvdXMKICAgICBjbGVhbnVwcyBkb25lIGluIHN0YXRlIFNTTF9TVF9PSy4gICBCdXQgc2Vzc2lvbiByZWxhdGVkIHN0dWZmCiAgICAgbXVzdCBiZSBkaXNhYmxlZCBmb3IgU1NMX1NUX09LIGluIHRoZSBjYXNlIHRoYXQgd2UganVzdCBzZW50IGEKICAgICBIZWxsb1JlcXVlc3QuCgogICAgIEFsc28gYXZvaWQgc29tZSBvdmVyaGVhZCBieSBub3QgY2FsbGluZyBzc2xfaW5pdF93YmlvX2J1ZmZlcigpCiAgICAgYmVmb3JlIGp1c3Qgc2VuZGluZyBhIEhlbGxvUmVxdWVzdC4KICAgICBbQm9kbyBNb2VsbGVyLCBFcmljIFJlc2NvcmxhIDxla3JAcnRmbS5jb20+XQoKICAqKSBGaXggc3NsL3MzX2VuYy5jLCBzc2wvdDFfZW5jLmMgYW5kIHNzbC9zM19wa3QuYyBzbyB0aGF0IHdlIGRvbid0CiAgICAgcmV2ZWFsIHdoZXRoZXIgaWxsZWdhbCBibG9jayBjaXBoZXIgcGFkZGluZyB3YXMgZm91bmQgb3IgYSBNQUMKICAgICB2ZXJpZmljYXRpb24gZXJyb3Igb2NjdXJlZC4gIChOZWl0aGVyIFNTTGVycigpIGNvZGVzIG5vciBhbGVydHMKICAgICBhcmUgZGlyZWN0bHkgdmlzaWJsZSB0byBwb3RlbnRpYWwgYXR0YWNrZXJzLCBidXQgdGhlIGluZm9ybWF0aW9uCiAgICAgbWF5IGxlYWsgdmlhIGxvZ2ZpbGVzLikKCiAgICAgU2ltaWxhciBjaGFuZ2VzIGFyZSBub3QgcmVxdWlyZWQgZm9yIHRoZSBTU0wgMi4wIGltcGxlbWVudGF0aW9uCiAgICAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaXMgc2VudCBpbiBjbGVhciBmb3IgU1NMIDIuMCwKICAgICBhbmQgdGhlIGV4dHJhIGJ5dGVzIGFyZSBqdXN0IGlnbm9yZWQuICBIb3dldmVyIHNzbC9zMl9wa3QuYwogICAgIGZhaWxlZCB0byB2ZXJpZnkgdGhhdCB0aGUgcHVycG9ydGVkIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIGluCiAgICAgdGhlIGxlZ2FsIHJhbmdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPcGVuVU5JWC04IHN1cHBvcnQgaW5jbHVkaW5nIHNoYXJlZCBsaWJyYXJpZXMKICAgICAoQm95ZCBMeW5uIEdlcmJlciA8Z2VyYmVyYkB6ZW5lei5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wcm92ZSBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKCkgY2hlY2sgYWdhaW4gdG8gYXZvaWQKICAgICAnd3Jpc3R3YXRjaCBhdHRhY2snIHVzaW5nIGh1Z2UgZW5jb2RpbmcgcGFyYW1ldGVycyAoY2YuCiAgICAgSmFtZXMgSC4gTWFuZ2VyJ3MgQ1JZUFRPIDIwMDEgcGFwZXIpLiAgTm90ZSB0aGF0IHRoZQogICAgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcgY2FzZSBvZiBSU0FfcHJpdmF0ZV9kZWNyeXB0KCkgZG9lcyBub3QgdXNlCiAgICAgZW5jb2RpbmcgcGFyYW1ldGVycyBhbmQgaGVuY2Ugd2FzIG5vdCB2dWxuZXJhYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJOX3NxcigpIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHJlcG9ydGVkIGJ5IEppbSBFbGxpcyA8amltLmVsbGlzQGNhdml1bS5jb20+XQoKICAqKSBSYWJpbi1NaWxsZXIgdGVzdCBhbmFseXNlcyBhc3N1bWUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHdpdG5lc3NlcywKICAgICBzbyB1c2UgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSBpbnN0ZWFkIG9mIHVzaW5nIEJOX3BzZXVkb19yYW5kKCkKICAgICBmb2xsb3dlZCBieSBtb2R1bGFyIHJlZHVjdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyOyBwb2ludGVkIG91dCBieSBBZGFtIFlvdW5nIDxBWW91bmcxQE5DU1VTLkpOSi5DT00+XQoKICAqKSBBZGQgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSB3aXRoIG9idmlvdXMgZnVuY3Rpb25hbGl0eTogQk5fcmFuZF9yYW5nZSgpCiAgICAgZXF1aXZhbGVudCBiYXNlZCBvbiBCTl9wc2V1ZG9fcmFuZCgpIGluc3RlYWQgb2YgQk5fcmFuZCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIHMzX3NydnIuYzogYWxsb3cgc2VuZGluZyBvZiBsYXJnZSBjbGllbnQgY2VydGlmaWNhdGUgbGlzdHMgKD4gMTYga0IpLgogICAgIFRoaXMgZnVuY3Rpb24gd2FzIGJyb2tlbiwgYXMgdGhlIGNoZWNrIGZvciBhIG5ldyBjbGllbnQgaGVsbG8gbWVzc2FnZQogICAgIHRvIGhhbmRsZSBTR0MgZGlkIG5vdCBhbGxvdyB0aGVzZSBsYXJnZSBtZXNzYWdlcy4KICAgICAoVHJhY2tlZCBkb3duIGJ5ICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGFsZXJ0IGRlc2NyaXB0aW9ucyBmb3IgVExTdjEgdG8gU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nW19sb25nXSgpLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnZ3kgYmVoYXZpb3VyIG9mIEJJT19nZXRfbnVtX3JlbmVnb3RpYXRlcygpIGFuZCBCSU9fY3RybCgpCiAgICAgZm9yIEJJT19DX0dFVF9XUklURV9CVUZfU0laRSAoIlN0ZXBoZW4gSGludG9uIiA8c2hpbnRvbkBuZXRvcGlhLmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBSZXdvcmsgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFRydTY0IFVuaXguCiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gcGFydCBtYWtlcyB1c2Ugb2YgbW9kZXJuIGNvbXBpbGVyIGZlYXR1cmVzIGFuZAogICAgIHN0aWxsIHJldGFpbnMgb2xkIGNvbXBpbGVyIGJlaGF2aW9yIGZvciB0aG9zZSB0aGF0IHJ1biBvbGRlciB2ZXJzaW9ucwogICAgIG9mIHRoZSBPUy4gIFRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHBhcnQgaW5jbHVkZXMgYSB2YXJpYW50IHRoYXQKICAgICB1c2VzIHRoZSBSUEFUSCBmZWF0dXJlLCBhbmQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHNwZWNpYWwKICAgICBjb25maWd1cmF0aW9uIHRhcmdldCAiYWxwaGEtY2MtcnBhdGgiLCB3aGljaCB3aWxsIG5ldmVyIGJlIHNlbGVjdGVkCiAgICAgYXV0b21hdGljYWxseS4KICAgICBbVGltIE1vb25leSA8bW9vbmV5QGRvZ2JlcnQuY2MubmRzdS5Ob0Rhay5lZHU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluIHNzbDNfZ2V0X2tleV9leGNoYW5nZSAoc3NsL3MzX2NsbnQuYyksIGNhbGwgc3NsM19nZXRfbWVzc2FnZSgpCiAgICAgd2l0aCB0aGUgc2FtZSBtZXNzYWdlIHNpemUgYXMgaW4gc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCgpLgogICAgIE90aGVyd2lzZSwgaWYgbm8gU2VydmVyS2V5RXhjaGFuZ2UgbWVzc2FnZSBvY2N1cnMsIENlcnRpZmljYXRlUmVxdWVzdAogICAgIG1lc3NhZ2VzIG1pZ2h0IGluYWR2ZXJ0ZW50bHkgYmUgcmVqZWN0IGFzIHRvbyBsb25nLgogICAgIFtQZXRyIExhbXBhIDxsYW1wYUBmZWUudnV0YnIuY3o+XQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBJQS02NCBVbml4IHBsYXRmb3JtcyAod2VsbCwgTGludXggYW5kIEhQLVVYKS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9kaWZpZWQgU1NMIGxpYnJhcnkgc3VjaCB0aGF0IHRoZSB2ZXJpZnlfY2FsbGJhY2sgdGhhdCBoYXMgYmVlbiBzZXQKICAgICBzcGVjaWZpY2x5IGZvciBhbiBTU0wgb2JqZWN0IHdpdGggU1NMX3NldF92ZXJpZnkoKSBpcyBhY3R1YWxseSBiZWluZwogICAgIHVzZWQuIEJlZm9yZSB0aGUgY2hhbmdlLCBhIHZlcmlmeV9jYWxsYmFjayBzZXQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdhcwogICAgIGlnbm9yZWQgYW5kIHRoZSB2ZXJpZnlfY2FsbGJhY2soKSBzZXQgaW4gdGhlIFNTTF9DVFggYXQgdGhlIHRpbWUgb2YKICAgICB0aGUgY2FsbCB3YXMgdXNlZC4gTmV3IGZ1bmN0aW9uIFg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoKSBpbnRyb2R1Y2VkCiAgICAgdG8gYWxsb3cgdGhlIG5lY2Vzc2FyeSBzZXR0aW5ncy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgaW4gY3J5cHRvL2RzYS9kc2FfbGliLmMgYW5kIGNyeXB0by9kaC9kaF9saWIuYwogICAgIGV4cGxpY2l0bHkgdG8gTlVMTCwgYXMgYXQgbGVhc3Qgb24gU29sYXJpcyA4IHRoaXMgc2VlbXMgbm90IGFsd2F5cyB0byBiZQogICAgIGRvbmUgYXV0b21hdGljYWxseSAoaW4gY29udHJhZGljdGlvbiB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBDCiAgICAgc3RhbmRhcmQpLiBUaGlzIG1hZGUgcHJvYmxlbXMgd2hlbiB1c2VkIGZyb20gT3BlblNTSC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW4gT3BlblNTTCAwLjkuNmEgYW5kIDAuOS42YiwgY3J5cHRvL2RoL2RoX2tleS5jIGlnbm9yZWQKICAgICBkaC0+bGVuZ3RoIGFuZCBhbHdheXMgdXNlZAoKICAgICAgICAgIEJOX3JhbmRfcmFuZ2UocHJpdl9rZXksIGRoLT5wKS4KCiAgICAgQk5fcmFuZF9yYW5nZSgpIGlzIG5vdCBuZWNlc3NhcnkgZm9yIERpZmZpZS1IZWxsbWFuLCBhbmQgdGhpcwogICAgIHNwZWNpZmljIHJhbmdlIG1ha2VzIERpZmZpZS1IZWxsbWFuIHVubmVjZXNzYXJpbHkgaW5lZmZpY2llbnQgaWYKICAgICBkaC0+bGVuZ3RoIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGlzIG11Y2ggc21hbGxlciB0aGFuIHRoZQogICAgIGxlbmd0aCBvZiBkaC0+cC4gIFdlIGNvdWxkIHVzZSBCTl9yYW5kX3JhbmdlKCkgaWYgdGhlIG9yZGVyIG9mCiAgICAgdGhlIHN1Ymdyb3VwIHdhcyBzdG9yZWQgaW4gdGhlIERIIHN0cnVjdHVyZSwgYnV0IHdlIG9ubHkgaGF2ZQogICAgIGRoLT5sZW5ndGguCgogICAgIFNvIHN3aXRjaCBiYWNrIHRvCgogICAgICAgICAgQk5fcmFuZChwcml2X2tleSwgbCwgLi4uKQoKICAgICB3aGVyZSAnbCcgaXMgZGgtPmxlbmd0aCBpZiB0aGlzIGlzIGRlZmluZWQsIG9yIEJOX251bV9iaXRzKGRoLT5wKS0xCiAgICAgb3RoZXJ3aXNlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluCgogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZW5jcnlwdAogICAgICAgICAgUlNBX2VheV9wcml2YXRlX2RlY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9lbmNyeXB0IChzaWduaW5nKQogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZGVjcnlwdCAoc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCiAgICAgKGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBSU0FfcHVibGljX2VuY3J5cHQsCiAgICAgUlNBX3ByaXZhdGVfZGVjcnlwdCwgUlNBX3ByaXZhdGVfZW5jcnlwdCwgUlNBX3B1YmxpY19kZWNyeXB0KSwKICAgICBhbHdheXMgcmVqZWN0IG51bWJlcnMgPj0gbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHVzZSBhIG5ldyBzaG9ydC10aW1lIGxvY2sgQ1JZUFRPX0xPQ0tfUkFORDIKICAgICB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJy4gIFRoaXMgaXMgbmVjZXNzYXJ5IG9uCiAgICAgc3lzdGVtcyB3aGVyZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJyAoYW4gJ3Vuc2lnbmVkIGxvbmcnCiAgICAgdmFyaWFibGUpIGlzIG5vdCBhdG9taWMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCBzZXQgJ2xvY2tpbmdfdGhyZWFkJyB0byBjdXJyZW50IHRocmVhZCdzIElECiAgICAgKmJlZm9yZSogc2V0dGluZyB0aGUgJ2NyeXB0b19sb2NrX3JhbmQnIGZsYWcuICBUaGUgcHJldmlvdXMgY29kZSBoYWQKICAgICBhIHJhY2UgY29uZGl0aW9uIGlmIDAgaXMgYSB2YWxpZCB0aHJlYWQgSUQuCiAgICAgW1RyYXZpcyBWaXRlayA8dml0ZWtAcm9ndWV3YXZlLmNvbT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIHVuZGVyIElyaXguCiAgICAgW0FsYmVydCBDaGluLUEtWW91bmcgPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT5dCgogICopIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBidWlsZCBvbiBMaW51eCBvbiBib3RoIGJpZy1lbmRpYW4gYW5kCiAgICAgbGl0dGxlLWVuZGlhbiBNSVBTLgogICAgIFtSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+XQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEhQLVVYLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YSBhbmQgMC45LjZiICBbOSBKdWwgMjAwMV0KCiAgKikgQ2hhbmdlIHNzbGVheV9yYW5kX2J5dGVzIChjcnlwdG8vcmFuZC9tZF9yYW5kLmMpCiAgICAgdG8gYXZvaWQgYSBTU0xlYXkvT3BlblNTTCBQUk5HIHdlYWtuZXNzIHBvaW50ZWQgb3V0IGJ5CiAgICAgTWFya2t1LUp1aGFuaSBPLiBTYWFyaW5lbiA8bWFya2t1LWp1aGFuaS5zYWFyaW5lbkBub2tpYS5jb20+OgogICAgIFBSTkcgc3RhdGUgcmVjb3Zlcnkgd2FzIHBvc3NpYmxlIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YKICAgICBvbmUgUFJORyByZXF1ZXN0IGFwcHJvcHJpYXRlbHkgc2l6ZWQgdG8gZ2FpbiBrbm93bGVkZ2Ugb24KICAgICAnbWQnIGZvbGxvd2VkIGJ5IGVub3VnaCBjb25zZWN1dGl2ZSAxLWJ5dGUgUFJORyByZXF1ZXN0cwogICAgIHRvIHRyYXZlcnNlIGFsbCBvZiAnc3RhdGUnLgoKICAgICAxLiBXaGVuIHVwZGF0aW5nICdtZF9sb2NhbCcgKHRoZSBjdXJyZW50IHRocmVhZCdzIGNvcHkgb2YgJ21kJykKICAgICAgICBkdXJpbmcgUFJORyBvdXRwdXQgZ2VuZXJhdGlvbiwgaGFzaCBhbGwgb2YgdGhlIHByZXZpb3VzCiAgICAgICAgJ21kX2xvY2FsJyB2YWx1ZSwgbm90IGp1c3QgdGhlIGhhbGYgdXNlZCBmb3IgUFJORyBvdXRwdXQuCgogICAgIDIuIE1ha2UgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tICdzdGF0ZScgaW5jbHVkZWQgaW50byB0aGUgaGFzaAogICAgICAgIGluZGVwZW5kZW50IGZyb20gdGhlIG51bWJlciBvZiBQUk5HIGJ5dGVzIHJlcXVlc3RlZC4KCiAgICAgVGhlIGZpcnN0IG1lYXN1cmUgYWxvbmUgd291bGQgYmUgc3VmZmljaWVudCB0byBhdm9pZAogICAgIE1hcmtrdS1KdWhhbmkncyBhdHRhY2suICAoQWN0dWFsbHkgaXQgaGFkIG5ldmVyIG9jY3VycmVkCiAgICAgdG8gbWUgdGhhdCB0aGUgaGFsZiBvZiAnbWRfbG9jYWwnIHVzZWQgZm9yIGNoYWluaW5nIHdhcyB0aGUKICAgICBoYWxmIGZyb20gd2hpY2ggUFJORyBvdXRwdXQgYnl0ZXMgd2VyZSB0YWtlbiAtLSBJIGhhZCBhbHdheXMKICAgICBhc3N1bWVkIHRoYXQgdGhlIHNlY3JldCBoYWxmIHdvdWxkIGJlIHVzZWQuKSAgVGhlIHNlY29uZAogICAgIG1lYXN1cmUgbWFrZXMgc3VyZSB0aGF0IGFkZGl0aW9uYWwgZGF0YSBmcm9tICdzdGF0ZScgaXMgbmV2ZXIKICAgICBtaXhlZCBpbnRvICdtZF9sb2NhbCcgaW4gc21hbGwgcG9ydGlvbnM7IHRoaXMgaGV1cmlzdGljYWxseQogICAgIGZ1cnRoZXIgc3RyZW5ndGhlbnMgdGhlIFBSTkcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGNyeXB0by9ibi9hc20vbWlwczMucy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgV2hlbiBvbmx5IHRoZSBrZXkgaXMgZ2l2ZW4gdG8gImVuYyIsIHRoZSBJViBpcyB1bmRlZmluZWQuIFByaW50IG91dAogICAgIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gWDUwOV9OQU1FIGlzIGVtcHR5IGluIFg1MDkgcHJpbnRpbmcgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gZHNhX2RvX3ZlcmlmeSAoY3J5cHRvL2RzYS9kc2Ffb3NzbC5jKSwgdmVyaWZ5IHRoYXQgciBhbmQgcyBhcmUKICAgICBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIHEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgY2hhbmdlICpwb2ludGVyIGluIENSWVBUT19hZGRfbG9jaygpIGlzIGFkZF9sb2NrX2NhbGxiYWNrIGlzCiAgICAgdXNlZDogaXQgaXNuJ3QgdGhyZWFkIHNhZmUgYW5kIHRoZSBhZGRfbG9ja19jYWxsYmFjayBzaG91bGQgaGFuZGxlCiAgICAgdGhhdCBpdHNlbGYuCiAgICAgW1BhdWwgUm9zZSA8UGF1bC5Sb3NlQGJyaWRnZS5jb20+XQoKICAqKSBWZXJpZnkgdGhhdCBpbmNvbWluZyBkYXRhIG9iZXlzIHRoZSBibG9jayBzaXplIGluCiAgICAgc3NsM19lbmMgKHNzbC9zM19lbmMuYykgYW5kIHRsczFfZW5jIChzc2wvdDFfZW5jLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBPQUVQIGNoZWNrLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgVGhlIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNQogICAgIFJTQSBlbmNyeXB0aW9uIHdhcyBhY2NpZGVudGFsbHkgcmVtb3ZlZCBpbiBzM19zcnZyLmMgaW4gT3BlblNTTCAwLjkuNQogICAgIHdoZW4gZml4aW5nIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSAnY2xpZW50CiAgICAgaGVsbG8nIG1lc3NhZ2VzLiAgKE5vdGUgdGhhdCB0aGUgYXR0YWNrIGlzIGltcHJhY3RpY2FsIGFnYWluc3QKICAgICBTU0wgMy4wIGFuZCBUTFMgMS4wIGFueXdheSBiZWNhdXNlIGxlbmd0aCBhbmQgdmVyc2lvbiBjaGVja2luZwogICAgIG1lYW5zIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIGd1ZXNzaW5nIGEgdmFsaWQgY2lwaGVydGV4dCBpcwogICAgIGFyb3VuZCAyXi00MDsgc2VlIHNlY3Rpb24gNSBpbiBCbGVpY2hlbmJhY2hlcidzIENSWVBUTyAnOTgKICAgICBwYXBlci4pCgogICAgIEJlZm9yZSAwLjkuNSwgdGhlIGNvdW50ZXJtZWFzdXJlIChoaWRlIHRoZSBlcnJvciBieSBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gJ2RlY3J5cHRpb24gcmVzdWx0JykgZGlkIG5vdCB3b3JrIHByb3Blcmx5IGJlY2F1c2UKICAgICBFUlJfY2xlYXJfZXJyb3IoKSB3YXMgbWlzc2luZywgbWVhbmluZyB0aGF0IFNTTF9nZXRfZXJyb3IoKSB3b3VsZAogICAgIGRldGVjdCB0aGUgc3VwcG9zZWRseSBpZ25vcmVkIGVycm9yLgoKICAgICBCb3RoIHByb2JsZW1zIGFyZSBub3cgZml4ZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL2Jpby9iZl9idWZmLmMsIGluY3JlYXNlIERFRkFVTFRfQlVGRkVSX1NJWkUgdG8gNDA5NgogICAgIChwcmV2aW91c2x5IGl0IHdhcyAxMDI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGNvbXBhdGliaWxpdHkgbW9kZSB0cnVzdCBzZXR0aW5nczogaWdub3JlIHRydXN0IHNldHRpbmdzCiAgICAgdW5sZXNzIHNvbWUgdmFsaWQgdHJ1c3Qgb3IgcmVqZWN0IHNldHRpbmdzIGFyZSBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYmxvd2Zpc2ggRVZQOiBpdHMgYSB2YXJpYWJsZSBsZW5ndGggY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmVsYXRlZCB0byBEU0EgUy9NSU1FIHZlcmlmaWNhdGlvbi4gSGFuZGxlIG1pc3NpbmcKICAgICBwYXJhbWV0ZXJzIGluIERTQSBwdWJsaWMga2V5IHN0cnVjdHVyZXMgYW5kIHJldHVybiBhbiBlcnJvciBpbiB0aGUKICAgICBEU0Egcm91dGluZXMgaWYgcGFyYW1ldGVycyBhcmUgYWJzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHZlcnNpb25zIHVwIHRvIDAuOS42LCBSQU5EX2ZpbGVfbmFtZSgpIHJlc29ydGVkIHRvIGZpbGUgIi5ybmQiCiAgICAgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5laXRoZXIgJFJBTkRGSUxFIG5vciAkSE9NRSB3YXMgc2V0LgogICAgIFJBTkRfZmlsZV9uYW1lKCkgaW4gMC45LjZhIHJldHVybmVkIE5VTEwgaW4gdGhpcyBjYXNlLiAgVGhpcyBoYXMKICAgICBjYXVzZWQgc29tZSBjb25mdXNpb24gdG8gV2luZG93cyB1c2VycyB3aG8gaGF2ZW4ndCBkZWZpbmVkICRIT01FLgogICAgIFRodXMgUkFORF9maWxlX25hbWUoKSBpcyBjaGFuZ2VkIGFnYWluOiBlX29zLmggY2FuIGRlZmluZSBhCiAgICAgREVGQVVMVF9IT01FLCB3aGljaCB3aWxsIGJlIHVzZWQgaWYgJEhPTUUgaXMgbm90IHNldC4KICAgICBGb3IgV2luZG93cywgd2UgdXNlICJDOiI7IG9uIG90aGVyIHBsYXRmb3Jtcywgd2Ugc3RpbGwgcmVxdWlyZQogICAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAgKikgTW92ZSAnaWYgKCFpbml0aWFsaXplZCkgUkFORF9wb2xsKCknIGludG8gcmVnaW9ucyBwcm90ZWN0ZWQgYnkKICAgICBDUllQVE9fTE9DS19SQU5ELiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgYXZvaWRzCiAgICAgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgY2FsbCBSQU5EX3BvbGwoKSBjb25jdXJyZW50bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCByZXBsYWNlICdhZGRfZG9fbm90X2xvY2snIGZsYWcgYnkgYQogICAgIGNvbWJpbmF0aW9uIG9mIGEgZmxhZyBhbmQgYSB0aHJlYWQgSUQgdmFyaWFibGUuCiAgICAgT3RoZXJ3aXNlIHdoaWxlIG9uZSB0aHJlYWQgaXMgaW4gc3NsZWF5X3JhbmRfYnl0ZXMgKHdoaWNoIHNldHMgdGhlCiAgICAgZmxhZyksICpvdGhlciogdGhyZWFkcyBjYW4gZW50ZXIgc3NsZWF5X2FkZF9ieXRlcyB3aXRob3V0IG9iZXlpbmcKICAgICB0aGUgQ1JZUFRPX0xPQ0tfUkFORCBsb2NrIChhbmQgbWF5IGV2ZW4gaWxsZWdhbGx5IHJlbGVhc2UgdGhlIGxvY2sKICAgICB0aGF0IHRoZXkgZG8gbm90IGhvbGQgYWZ0ZXIgdGhlIGZpcnN0IHRocmVhZCB1bnNldHMgYWRkX2RvX25vdF9sb2NrKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmN0ZXN0IGFnYWluOiAnLXgnIGV4cHJlc3Npb25zIGFyZSBub3QgYXZhaWxhYmxlIGluIGFsbAogICAgIHZlcnNpb25zIG9mICd0ZXN0Jy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNiBhbmQgMC45LjZhICBbNSBBcHIgMjAwMV0KCiAgKikgRml4IGEgY291cGxlIG9mIG1lbW9yeSBsZWFrcyBpbiBQS0NTN19kYXRhRGVjb2RlKCkKICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBIZXl1biBaaGVuZyA8aHpoZW5nQGF0ZHNwcmludC5jb20+XQoKICAqKSBDaGFuZ2UgQ29uZmlndXJlIGFuZCBNYWtlZmlsZXMgdG8gcHJvdmlkZSBFWEVfRVhULCB3aGljaCB3aWxsIGNvbnRhaW4KICAgICB0aGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuICBBbHNvLCBtYWtlIHRoZSBwZXJsCiAgICAgc2NyaXB0cyB0aGF0IHVzZSBzeW1saW5rKCkgdG8gdGVzdCBpZiBpdCByZWFsbHkgZXhpc3RzIGFuZCB1c2UgImNwIgogICAgIGlmIGl0IGRvZXNuJ3QuICBBbGwgdGhpcyBtYWRlIE9wZW5TU0wgY29tcGlsYWJsZSBhbmQgaW5zdGFsbGFibGUgaW4KICAgICBDeWdXaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBhc24xX0dldFNlcXVlbmNlKCkgZm9yIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGRhdGEuCiAgICAgSWYgU0VRVUVOQ0UgaXMgbGVuZ3RoIGlzIGluZGVmaW5pdGUganVzdCBzZXQgYy0+c2xlbiB0byB0aGUgdG90YWwKICAgICBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgc2hpZ2VARnJlZUJTRC5vcmddCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgQ2hhbmdlIGJjdGVzdCB0byBhdm9pZCBoZXJlLWRvY3VtZW50cyBpbnNpZGUgY29tbWFuZCBzdWJzdGl0dXRpb24KICAgICAod29ya2Fyb3VuZCBmb3IgRnJlZUJTRCAvYmluL3NoIGJ1ZykuCiAgICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBVbHRyaXgsIGF2b2lkIHNoZWxsIGZ1bmN0aW9ucyAoaW50cm9kdWNlZAogICAgIGluIHRoZSBiY3Rlc3QgdmVyc2lvbiB0aGF0IHNlYXJjaGVzIGFsb25nICRQQVRIKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW5hbWUgJ2Rlc19lbmNyeXB0JyB0byAnZGVzX2VuY3J5cHQxJy4gIFRoaXMgYXZvaWRzIHRoZSBjbGFzaGVzCiAgICAgd2l0aCBkZXNfZW5jcnlwdCgpIGRlZmluZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgbGlrZSBTb2xhcmlzCiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoZWNrIHRoZSByZXN1bHQgb2YgUlNBLUNSVCAoc2VlIEQuIEJvbmVoLCBSLiBEZU1pbGxvLCBSLiBMaXB0b246CiAgICAgT24gdGhlIEltcG9ydGFuY2Ugb2YgRWxpbWluYXRpbmcgRXJyb3JzIGluIENyeXB0b2dyYXBoaWMKICAgICBDb21wdXRhdGlvbnMsIEouIENyeXB0b2xvZ3kgMTQgKDIwMDEpIDIsIDEwMS0xMTksCiAgICAgaHR0cDovL3RoZW9yeS5zdGFuZm9yZC5lZHUvfmRhYm8vcGFwZXJzL2ZhdWx0cy5wcy5neikuCiAgICAgW1VsZiBNb2VsbGVyXQogIAogICopIE1JUFMgYXNzZW1ibGVyIEJJR05VTSBkaXZpc2lvbiBidWcgZml4LiAKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgRGlzYWJsZWQgaW5jb3JyZWN0IEFscGhhIGFzc2VtYmxlciBjb2RlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBQS0NTIzcgZGVjb2RlIHJvdXRpbmVzIHNvIHRoZXkgY29ycmVjdGx5IHVwZGF0ZSB0aGUgbGVuZ3RoCiAgICAgYWZ0ZXIgcmVhZGluZyBhbiBFT0MgZm9yIHRoZSBFWFBMSUNJVCB0YWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBGaXggYnVnIGluIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gcm91dGluZXMuIFRoaXMgd2FzIHRyaWdnZXJlZAogICAgIGlmIGEgM0RFUyBrZXkgd2FzIGdlbmVyYXRlZCB3aXRoIGEgMCBpbml0aWFsIGJ5dGUuIEluY2x1ZGUKICAgICBQS0NTMTJfQlJPS0VOX0tFWUdFTiBjb21waWxhdGlvbiBvcHRpb24gdG8gcmV0YWluIHRoZSBvbGQKICAgICAoYnV0IGJyb2tlbikgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgYmN0ZXN0IHRvIHNlYXJjaCBmb3IgYSB3b3JraW5nIGJjIGFsb25nICRQQVRIIGFuZCBwcmludAogICAgIGl0IHdoZW4gZm91bmQuCiAgICAgW1RpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBlcnIuYzogZnJlZSBlcnJfZGF0YSBzdHJpbmcgaWYgbmVjZXNzYXJ5OwogICAgIGRvbid0IHdyaXRlIHRvIHRoZSB3cm9uZyBpbmRleCBpbiBFUlJfc2V0X2Vycm9yX2RhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IHNzbDIzX3BlZWsgKGFuYWxvZ291cyB0byBzc2wyM19yZWFkKSwgd2hpY2ggcHJldmlvdXNseQogICAgIGRpZCBub3QgZXhpc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwbGFjZSByZHRzYyB3aXRoIF9lbWl0IHN0YXRlbWVudHMgZm9yIFZDKysgdmVyc2lvbiA1LgogICAgIFtKZXJlbXkgQ29vcGVyIDxqZXJlbXlAYmF5bW9vLm9yZz5dCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcmV1c2UgU1NMdjIgc2Vzc2lvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY29weV9lbWFpbCgpIGNoZWNrIGZvciA+PSAwIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgogICAgIFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKCkgc2luY2UgMCBpcyBhIHZhbGlkIGluZGV4LgogICAgIFtTdGV2ZSBIZW5zb24gcmVwb3J0ZWQgYnkgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAb3BlbnNjYS5vcmc+XQoKICAqKSBBdm9pZCBjb3JlZHVtcCB3aXRoIHVuc3VwcG9ydGVkIG9yIGludmFsaWQgcHVibGljIGtleXMgYnkgY2hlY2tpbmcgaWYKICAgICBYNTA5X2dldF9wdWJrZXkoKSBmYWlscyBpbiBQS0NTN192ZXJpZnkoKS4gRml4IG1lbW9yeSBsZWFrIHdoZW4KICAgICBQS0NTN192ZXJpZnkoKSBmYWlscyB3aXRoIG5vbiBkZXRhY2hlZCBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERvbid0IHVzZSBnZXRlbnYgaW4gbGlicmFyeSBmdW5jdGlvbnMgd2hlbiBydW4gYXMgc2V0dWlkL3NldGdpZC4KICAgICBOZXcgZnVuY3Rpb24gT1BFTlNTTF9pc3NldHVnaWQoKS4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSAoY3J5cHRvL21lbV9kYmcuYykKICAgICBkdWUgdG8gaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG11bHRpLXRocmVhZGluZzoKCiAgICAgMS4gRml4IHRpbWluZyBnbGl0Y2ggaW4gdGhlIE1lbUNoZWNrX29mZigpIHBvcnRpb24gb2YgQ1JZUFRPX21lbV9jdHJsKCkuCgogICAgIDIuIEZpeCBsb2dpY2FsIGdsaXRjaCBpbiBpc19NZW1DaGVja19vbigpIGFrYSBDUllQVE9faXNfbWVtX2NoZWNrX29uKCkuCgogICAgIDMuIENvdW50IGhvdyBtYW55IHRpbWVzIE1lbUNoZWNrX29mZigpIGhhcyBiZWVuIGNhbGxlZCBzbyB0aGF0CiAgICAgICAgbmVzdGVkIHVzZSBjYW4gYmUgdHJlYXRlZCBjb3JyZWN0bHkuICBUaGlzIGFsc28gYXZvaWRzIAogICAgICAgIGluYmFuZC1zaWduYWxsaW5nIGluIHRoZSBwcmV2aW91cyBjb2RlICh3aGljaCByZWxpZWQgb24gdGhlCiAgICAgICAgYXNzdW1wdGlvbiB0aGF0IHRocmVhZCBJRCAwIGlzIGltcG9zc2libGUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAiLXJhbmQiIG9wdGlvbiBhbHNvIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IENQVSBkZXRlY3Rpb24gb24gSXJpeCA2LnguCiAgICAgW0t1cnQgSG9ja2VuYnVyeSA8a2hvY2tlbmJAc3RldmVucy10ZWNoLmVkdT4gYW5kCiAgICAgICJCcnVjZSBXLiBGb3JzYmVyZyIgPGJydWNlLmZvcnNiZXJnQGJhZXN5c3RlbXMuY29tPl0KCiAgKikgRml4IFg1MDlfTkFNRSBidWcgd2hpY2ggcHJvZHVjZWQgaW5jb3JyZWN0IGVuY29kaW5nIGlmIFg1MDlfTkFNRQogICAgIHdhcyBlbXB0eS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFVzZSB0aGUgY2FjaGVkIGVuY29kaW5nIG9mIGFuIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KICAgICBjb3B5aW5nIGl0LiBUaGlzIGlzIGFwcGFyZW50bHkgdGhlIHJlYXNvbiBmb3IgdGhlIGxpYnNhZmUgImVycm9ycyIKICAgICBidXQgdGhlIGNvZGUgaXMgYWN0dWFsbHkgY29ycmVjdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uIEJOX3JhbmRfcmFuZ2UoKSwgYW5kIGZpeCBEU0Ffc2lnbl9zZXR1cCgpIHRvIHByZXZlbnQKICAgICBCbGVpY2hlbmJhY2hlcidzIERTQSBhdHRhY2suCiAgICAgRXh0ZW5kIEJOX1twc2V1ZG9fXXJhbmQ6IEFzIGJlZm9yZSwgdG9wPTEgZm9yY2VzIHRoZSBoaWdoZXN0IHR3byBiaXRzCiAgICAgdG8gYmUgc2V0IGFuZCB0b3A9MCBmb3JjZXMgdGhlIGhpZ2hlc3QgYml0IHRvIGJlIHNldDsgdG9wPS0xIGlzIG5ldwogICAgIGFuZCBsZWF2ZXMgdGhlIGhpZ2hlc3QgYml0IHJhbmRvbS4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgSW4gdGhlIE5DT05GXy4uLi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgZm9yIENPTkZfLi4uIHF1ZXJpZXMKICAgICAoY3J5cHRvL2NvbmYvY29uZl9saWIuYyksIGlmIHRoZSBpbnB1dCBMSEFTSCBpcyBOVUxMLCBhdm9pZCB1c2luZwogICAgIGEgdGVtcG9yYXJ5IENPTkYgc3RydWN0dXJlIHdpdGggdGhlIGRhdGEgY29tcG9uZW50IHNldCB0byBOVUxMCiAgICAgKHdoaWNoIGdpdmVzIHNlZ21lbnRhdGlvbiBmYXVsdHMgaW4gbGhfcmV0cmlldmUpLgogICAgIEluc3RlYWQsIHVzZSBOVUxMIGZvciB0aGUgQ09ORiBwb2ludGVyIGluIENPTkZfZ2V0X3N0cmluZyBhbmQKICAgICBDT05GX2dldF9udW1iZXIgKHdoaWNoIG1heSB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzKSBhbmQgZGlyZWN0bHkKICAgICByZXR1cm4gTlVMTCBmcm9tIENPTkZfZ2V0X3NlY3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBmb3IgRUJDRElDLgogICAgIFtVbGYgTW9lbGxlcl0KCiAgKikgVG9sZXJhdGUgbm9uUmVwdWRpYXRpb24gYXMgYmVpbmcgdmFsaWQgZm9yIFMvTUlNRSBzaWduaW5nIGFuZCBjZXJ0U2lnbgogICAgIGtleVVzYWdlIGlmIGJhc2ljQ29uc3RyYWludHMgYWJzZW50IGZvciBhIENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgU01JTUVfd3JpdGVfUEtDUzcoKSB3cml0ZSBtYWlsIGhlYWRlciB2YWx1ZXMgd2l0aCBhIGZvcm1hdCB0aGF0CiAgICAgaXMgbW9yZSBnZW5lcmFsbHkgYWNjZXB0ZWQgKG5vIHNwYWNlcyBiZWZvcmUgdGhlIHNlbWljb2xvbiksIHNpbmNlCiAgICAgc29tZSBwcm9ncmFtcyBjYW4ndCBwYXJzZSB0aG9zZSB2YWx1ZXMgcHJvcGVybHkgb3RoZXJ3aXNlLiAgQWxzbyBtYWtlCiAgICAgc3VyZSBCSU8ncyB0aGF0IGJyZWFrIGxpbmVzIGFmdGVyIGVhY2ggd3JpdGUgZG8gbm90IGNyZWF0ZSBpbnZhbGlkCiAgICAgaGVhZGVycy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHRoZSBDUkwgZW5jb2Rpbmcgcm91dGluZXMgd29yayB3aXRoIGVtcHR5IFNFUVVFTkNFIE9GLiBUaGUKICAgICBtYWNyb3MgcHJldmlvdXNseSB1c2VkIHdvdWxkIG5vdCBlbmNvZGUgYW4gZW1wdHkgU0VRVUVOQ0UgT0YKICAgICBhbmQgYnJlYWsgdGhlIHNpZ25hdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFplcm8gdGhlIHByZW1hc3RlciBzZWNyZXQgYWZ0ZXIgZGVyaXZpbmcgdGhlIG1hc3RlciBzZWNyZXQgaW4KICAgICBESCBjaXBoZXJzdWl0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgRVZQX2FkZF9kaWdlc3RfYWxpYXMgcmVnaXN0cmF0aW9ucyAoYXMgZm91bmQgaW4KICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpKSB0byBTU0xfbGlicmFyeV9pbml0KCkKICAgICBha2EgT3BlblNTTF9hZGRfc3NsX2FsZ29yaXRobXMoKS4gIFRoaXMgcHJvdmlkZXMgaW1wcm92ZWQKICAgICBjb21wYXRpYmlsaXR5IHdpdGggcGVlcnMgdXNpbmcgWC41MDkgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB1bmNvbnZlbnRpb25hbCBBbGdvcml0aG1JZGVudGlmaWVyIE9JRHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBJcml4IHdpdGggTk9fQVNNLgogICAgIFsiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIC4vY29uZmlnIHNjcmlwdCBmaXhlcy4KICAgICBbVWxmIE1vZWxsZXIsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4ICdvcGVuc3NsIHBhc3N3ZCAtMScuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFBLQ1MxMl9rZXlfZ2VuX2FzYygpIHNvIGl0IGNhbiBjb3BlIHdpdGggbm9uIG51bGwKICAgICB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hvc2UgbGVuZ3RoIGlzIHBhc3NlZCBpbiB0aGUgcGFzc2xlbgogICAgIHBhcmFtZXRlciwgZm9yIGV4YW1wbGUgZnJvbSBQRU0gY2FsbGJhY2tzLiBUaGlzIHdhcyBkb25lCiAgICAgYnkgYWRkaW5nIGFuIGV4dHJhIGxlbmd0aCBwYXJhbWV0ZXIgdG8gYXNjMnVuaSgpLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IDxvZGRpc3NleUBzYW1zdW5nLmNvLmtyPl0KCiAgKikgRml4IEMgY29kZSBnZW5lcmF0ZWQgYnkgJ29wZW5zc2wgZHNhcGFyYW0gLUMnOiBJZiBhIEJOX2JpbjJibgogICAgIGNhbGwgZmFpbGVkLCBmcmVlIHRoZSBEU0Egc3RydWN0dXJlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCB0byB1bmkyYXNjKCkgdG8gY29wZSB3aXRoIHplcm8gbGVuZ3RoIFVuaWNvZGUgc3RyaW5ncy4KICAgICBUaGVzZSBhcmUgcHJlc2VudCBpbiBzb21lIFBLQ1MjMTIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jcmVhc2UgczItPndidWYgYWxsb2NhdGlvbiBieSBvbmUgYnl0ZSBpbiBzc2wyX25ldyAoc3NsL3MyX2xpYi5jKS4KICAgICBPdGhlcndpc2UgZG9fc3NsX3dyaXRlIChzc2wvczJfcGt0LmMpIHdpbGwgd3JpdGUgYmV5b25kIGJ1ZmZlciBsaW1pdHMKICAgICB3aGVuIHdyaXRpbmcgYSAzMjc2NyBieXRlIHJlY29yZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEVyaWMgRGF5IDxlZGF5QGNvbmNlbnRyaWMubmV0Pl0KCiAgKikgSW4gUlNBX2VheV9wdWJsaWNfe2VuLGVkfWNyeXB0IGFuZCBSU0FfZWF5X21vZF9leHAgKHJzYV9lYXkuYyksCiAgICAgb2J0YWluIGxvY2sgQ1JZUFRPX0xPQ0tfUlNBIGJlZm9yZSBzZXR0aW5nIHJzYS0+X21ldGhvZF9tb2Rfe24scCxxfS4KCiAgICAgKFJTQSBvYmplY3RzIGhhdmUgYSByZWZlcmVuY2UgY291bnQgYWNjZXNzIHRvIHdoaWNoIGlzIHByb3RlY3RlZAogICAgIGJ5IENSWVBUT19MT0NLX1JTQSBbc2VlIHJzYV9saWIuYywgczNfc3J2ci5jLCBzc2xfY2VydC5jLCBzc2xfcnNhLmNdLAogICAgIHNvIHRoZXkgYXJlIG1lYW50IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuKQogICAgIFtCb2RvIE1vZWxsZXIsIEdlb2ZmIFRob3JwZTsgb3JpZ2luYWwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgIlJlZGRpZSwgU3RldmVuIiA8U3RldmVuLlJlZGRpZUBjYS5jb20+XQoKICAqKSBGaXggYSBkZWFkbG9jayBpbiBDUllQVE9fbWVtX2xlYWtzKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGJldHRlciB0ZXN0IHBhdHRlcm5zIGluIGJudGVzdC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgcmFuZF93aW4uYyBmaXggZm9yIEJvcmxhbmQgQy4KICAgICBbVWxmIE32bGxlcl0KIAogICopIEJOX3JzaGlmdCBidWdmaXggZm9yIG4gPT0gMC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSAnYmN0ZXN0JyBzY3JpcHQgdGhhdCBjaGVja3MgZm9yIHNvbWUga25vd24gJ2JjJyBidWdzCiAgICAgc28gdGhhdCAnbWFrZSB0ZXN0JyBkb2VzIG5vdCBhYm9ydCBqdXN0IGJlY2F1c2UgJ2JjJyBpcyBicm9rZW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3RvcmUgdmVyaWZ5X3Jlc3VsdCB3aXRoaW4gU1NMX1NFU1NJT04gYWxzbyBmb3IgY2xpZW50IHNpZGUgdG8KICAgICBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaG9sZS4gKFJlLXVzZWQgc2Vzc2lvbnMgb24gdGhlIGNsaWVudCBzaWRlCiAgICAgYWx3YXlzIHJlc3VsdGVkIGluIHZlcmlmeV9yZXN1bHQ9PVg1MDlfVl9PSywgbm90IHVzaW5nIHRoZSBvcmlnaW5hbAogICAgIHJlc3VsdCBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBzc2wzX3BlbmRpbmc6IElmIHRoZSByZWNvcmQgaW4gcy0+czMtPnJyZWMgaXMgbm90IG9mIHR5cGUKICAgICBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEsIHJldHVybiAwLgogICAgIFNpbWlsYXJseSwgY2hhbmdlIHNzbDJfcGVuZGluZyB0byByZXR1cm4gMCBpZiBTU0xfaW5faW5pdChzKSBpcyB0cnVlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0xfcGVlazoKICAgICBCb3RoIHNzbDJfcGVlayBhbmQgc3NsM19wZWVrLCB3aGljaCB3ZXJlIHRvdGFsbHkgYnJva2VuIGluIGVhcmxpZXIKICAgICByZWxlYXNlcywgaGF2ZSBiZWVuIHJlLWltcGxlbWVudGVkIGJ5IHJlbmFtaW5nIHRoZSBwcmV2aW91cwogICAgIGltcGxlbWVudGF0aW9ucyBvZiBzc2wyX3JlYWQgYW5kIHNzbDNfcmVhZCB0byBzc2wyX3JlYWRfaW50ZXJuYWwKICAgICBhbmQgc3NsM19yZWFkX2ludGVybmFsLCByZXNwZWN0aXZlbHksIGFuZCBhZGRpbmcgJ3BlZWsnIHBhcmFtZXRlcnMKICAgICB0byB0aGVtLiAgVGhlIG5ldyBzc2xbMjNdX3tyZWFkLHBlZWt9IGZ1bmN0aW9ucyBhcmUgY2FsbHMgdG8KICAgICBzc2xbMjNdX3JlYWRfaW50ZXJuYWwgd2l0aCB0aGUgJ3BlZWsnIGZsYWcgc2V0IGFwcHJvcHJpYXRlbHkuCiAgICAgQSAncGVlaycgcGFyYW1ldGVyIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gc3NsM19yZWFkX2J5dGVzLCB3aGljaAogICAgIGRvZXMgdGhlIGFjdHVhbCB3b3JrIGZvciBzc2wzX3JlYWRfaW50ZXJuYWwuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbGlzZSAiZXhfZGF0YSIgbWVtYmVyIG9mIFJTQS9EU0EvREggc3RydWN0dXJlcyBwcmlvciB0byBjYWxsaW5nCiAgICAgdGhlIG1ldGhvZC1zcGVjaWZpYyAiaW5pdCgpIiBoYW5kbGVyLiBBbHNvIGNsZWFuIHVwIGV4X2RhdGEgYWZ0ZXIKICAgICBjYWxsaW5nIHRoZSBtZXRob2Qtc3BlY2lmaWMgImZpbmlzaCgpIiBoYW5kbGVyLiBQcmV2aW91c2x5LCB0aGlzIHdhcwogICAgIGhhcHBlbmluZyB0aGUgb3RoZXIgd2F5IHJvdW5kLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEluY3JlYXNlIEJOX0NUWF9OVU0gKHRoZSBudW1iZXIgb2YgQklHTlVNcyBpbiBhIEJOX0NUWCkgdG8gMTYuCiAgICAgVGhlIHByZXZpb3VzIHZhbHVlLCAxMiwgd2FzIG5vdCBhbHdheXMgc3VmZmljaWVudCBmb3IgQk5fbW9kX2V4cCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2Ugc3VyZSB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgZ2V0IHRoZSBpbnRlcm5hbCBuYW1lIGVuZ2luZSB3aXRoCiAgICAgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgYW5kIG5vdCBqdXN0IDAuICBUaGlzIHNob3VsZCBtYXJrIHRoZQogICAgIHNoYXJlZCBsaWJyYXJpZXMgYXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuICBPZiBjb3Vyc2UsIHRoaXMgc2hvdWxkCiAgICAgYmUgY2hhbmdlZCBhZ2FpbiB3aGVuIHdlIGNhbiBndWFyYW50ZWUgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IHR5cG8gaW4gZ2V0X2NlcnRfYnlfc3ViamVjdCgpIGluIGJ5X2Rpci5jCiAgICAgW0plYW4tTWFyYyBEZXNwZXJyaWVyIDxqZWFuLW1hcmMuZGVzcGVycmllckBjZXJ0cGx1cy5jb20+XQoKICAqKSBSZXdvcmsgdGhlIHN5c3RlbSB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzOgoKICAgICAtIE1ha2Ugbm90ZSBvZiB0aGUgZXhwZWN0ZWQgZXh0ZW5zaW9uIGZvciB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQKICAgICAgIGlmIHRoZXJlIGlzIGEgbmVlZCBmb3Igc3ltYm9saWMgbGlua3MgZnJvbSBmb3IgZXhhbXBsZSBsaWJjcnlwdG8uc28uMAogICAgICAgdG8gbGliY3J5cHRvLnNvLjAuOS43LiAgVGhlcmUgaXMgZXh0ZW5kZWQgaW5mbyBpbiBDb25maWd1cmUgZm9yCiAgICAgICB0aGF0LgoKICAgICAtIE1ha2UgYXMgZmV3IHJlYnVpbGRzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFzIHBvc3NpYmxlLgoKICAgICAtIFN0aWxsIGF2b2lkIGxpbmtpbmcgdGhlIE9wZW5TU0wgcHJvZ3JhbXMgd2l0aCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KCiAgICAgLSBXaGVuIGluc3RhbGxpbmcsIGluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc2VwYXJhdGVseSBmcm9tIHRoZQogICAgICAgc3RhdGljIG9uZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQgbWFjcm8gdG8gYWN0dWFsbHkgdXNlIGl0cyBhcmd1bWVudC4KCiAgICAgQ29weSBTU0xfQ1RYJ3MgcmVhZF9haGVhZCBmbGFnIHRvIFNTTCBvYmplY3QgZGlyZWN0bHkgaW4gU1NMX25ldwogICAgIGFuZCBub3QgaW4gU1NMX2NsZWFyIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhbHNvIHVzZWQgYnkgdGhlCiAgICAgYWNjZXB0L2Nvbm5lY3QgZnVuY3Rpb25zOyBwcmV2aW91c2x5LCB0aGUgc2V0dGluZ3MgbWFkZSBieQogICAgIFNTTF9zZXRfcmVhZF9haGVhZCB3b3VsZCBiZSBsb3N0IGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW1zIHJlcG9ydGVkIGJ5IEFuZGVycyBHZXJ0eiA8Z2VydHpAZXBhY3Quc2U+XSAgICAgCgogICopIENvcnJlY3QgdXRpbC9ta2RlZi5wbCB0byBiZSBzZWxlY3RpdmUgYWJvdXQgZGlzYWJsZWQgYWxnb3JpdGhtcy4KICAgICBQcmV2aW91c2x5LCBpdCB3b3VsZCBjcmVhdGUgZW50cmllcyBmb3IgZGlzYWJsZWVkIGFsZ29yaXRobXMgbm8KICAgICBtYXR0ZXIgd2hhdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBzZXZlcmFsIG5ldyBtYW51YWwgcGFnZXMgZm9yIFNTTF8qIGZ1bmN0aW9uLgogICAgIFtMdXR6IEphZW5pY2tlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNWEgYW5kIDAuOS42ICBbMjQgU2VwIDIwMDBdCgogICopIEluIHNzbDIzX2dldF9jbGllbnRfaGVsbG8sIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBmYWNlZAogICAgIHdpdGggYW4gaW5pdGlhbCBTU0wgMy4wL1RMUyByZWNvcmQgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGFpbiB0aGUKICAgICBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UsIGkuZS4gY2xpZW50X3ZlcnNpb24uCiAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcGF0aG9sb2dpYyBjYXNlIHRoYXQgcHJvYmFibHkgaGFzIG5ldmVyIGhhcHBlbmVkCiAgICAgaW4gcmVhbCBsaWZlLikgIFRoZSBwcmV2aW91cyBhcHByb2FjaCB3YXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGZyb20gdGhlIHJlY29yZCBoZWFkZXIgYXMgYSBzdWJzdGl0dXRlOyBidXQgb3VyIHByb3RvY29sIGNob2ljZQogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoYXQgb25lIGJlY2F1c2UgaXQgaXMgbm90IGF1dGhlbnRpY2F0ZWQKICAgICBieSB0aGUgRmluaXNoZWQgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9yZSByb2J1c3QgcmFuZG9tbmVzcyBnYXRoZXJpbmcgZnVuY3Rpb25zIGZvciBXaW5kb3dzLgogICAgIFtKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+XQoKICAqKSBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIGlmIHRoZSBmbGFnIFg1MDlfVl9GTEFHX0lTU1VFUl9DSEVDSyBpcwogICAgIG5vdCBzZXQgdGhlbiB3ZSBkb24ndCBzZXR1cCB0aGUgZXJyb3IgY29kZSBmb3IgaXNzdWVyIGNoZWNrIGVycm9ycwogICAgIHRvIGF2b2lkIHBvc3NpYmx5IG92ZXJ3cml0aW5nIG90aGVyIGVycm9ycyB3aGljaCB0aGUgY2FsbGJhY2sgZG9lcwogICAgIGhhbmRsZS4gSWYgYW4gYXBwbGljYXRpb24gZG9lcyBzZXQgdGhlIGZsYWcgdGhlbiB3ZSBhc3N1bWUgaXQga25vd3MKICAgICB3aGF0IGl0IGlzIGRvaW5nIGFuZCBjYW4gaGFuZGxlIHRoZSBuZXcgaW5mb3JtYXRpb25hbCBjb2RlcwogICAgIGFwcHJvcHJpYXRlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBhIG5hc3R5IGJ1ZyBpbiBBU04xX1RZUEUgaGFuZGxpbmcuIEFTTjFfVFlQRSBpcyB1c2VkIGZvcgogICAgIGEgZ2VuZXJhbCAiQU5ZIiB0eXBlLCBhcyBzdWNoIGl0IHNob3VsZCBiZSBhYmxlIHRvIGRlY29kZSBhbnl0aGluZwogICAgIGluY2x1ZGluZyB0YWdnZWQgdHlwZXMuIEhvd2V2ZXIgaXQgZGlkbid0IGNoZWNrIHRoZSBjbGFzcyBzbyBpdCB3b3VsZAogICAgIHdyb25nbHkgaW50ZXJwcmV0IHRhZ2dlZCB0eXBlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgdW5pdmVyc2FsCiAgICAgY291bnRlcnBhcnQgYW5kIHVua25vd24gdHlwZXMgd2VyZSBqdXN0IHJlamVjdGVkLiBDaGFuZ2VkIHNvIHRoYXQgdGhlCiAgICAgdGFnZ2VkIGFuZCB1bmtub3duIHR5cGVzIGFyZSBoYW5kbGVkIGluIHRoZSBzYW1lIHdheSBhcyBhIFNFUVVFTkNFOgogICAgIHRoYXQgaXMgdGhlIGVuY29kaW5nIGlzIHN0b3JlZCBpbnRhY3QuIFRoZXJlIGlzIGFsc28gYSBuZXcgdHlwZQogICAgICJWX0FTTjFfT1RIRVIiIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgY2xhc3MgaXMgbm90IHVuaXZlcnNhbCwgaW4gdGhpcwogICAgIGNhc2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGFjdHVhbCB0eXBlIGlzIHNvIHdlIGp1c3QgbHVtcCB0aGVtIGFsbAogICAgIHRvZ2V0aGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE9uIFZNUywgc3Rkb3V0IG1heSB2ZXJ5IHdlbGwgbGVhZCB0byBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIHRvCiAgICAgaW4gYSByZWNvcmQtb3JpZW50ZWQgZmFzaGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBldmVyeSB3cml0ZSgpIHdpbGwKICAgICB3cml0ZSBhIHNlcGFyYXRlIHJlY29yZCwgd2hpY2ggd2lsbCBiZSByZWFkIHNlcGFyYXRlbHkgYnkgdGhlCiAgICAgcHJvZ3JhbXMgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4gIFRoaXMgY2FuIGJlIHZlcnkgY29uZnVzaW5nLgoKICAgICBUaGUgc29sdXRpb24gaXMgdG8gcHV0IGEgQklPIGZpbHRlciBpbiB0aGUgd2F5IHRoYXQgd2lsbCBidWZmZXIKICAgICB0ZXh0IHVudGlsIGEgbGluZWZlZWQgaXMgcmVhY2hlZCwgYW5kIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBhCiAgICAgbGluZSBhdCBhIHRpbWUsIHNvIGV2ZXJ5IHJlY29yZCB3cml0dGVuIHdpbGwgYmUgYW4gYWN0dWFsIGxpbmUsCiAgICAgbm90IGNodW5rcyBvZiBsaW5lcyBhbmQgbm90ICh1c3VhbGx5IGRvZXNuJ3QgaGFwcGVuLCBidXQgSSd2ZQogICAgIHNlZW4gaXQgb25jZSkgc2V2ZXJhbCBsaW5lcyBpbiBvbmUgcmVjb3JkLiAgQklPX2ZfbGluZWJ1ZmZlcigpIGlzCiAgICAgdGhlIGFuc3dlci4KCiAgICAgQ3VycmVudGx5LCBpdCdzIGEgVk1TLW9ubHkgbWV0aG9kLCBiZWNhdXNlIHRoYXQncyB3aGVyZSBpdCBoYXMKICAgICBiZWVuIHRlc3RlZCB3ZWxsIGVub3VnaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgJ29wdGltaXplZCcgc3F1YXJpbmcgdmFyaWFudCBpbiBCTl9tb2RfbXVsX21vbnRnb21lcnksCiAgICAgaXQgY2FuIHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cy4KICAgICAoTm90ZTogVGhlIGJ1Z2d5IHZhcmlhbnQgd2FzIG5vdCBlbmFibGVkIGluIE9wZW5TU0wgMC45LjVhLAogICAgIGJ1dCBpdCB3YXMgaW4gMC45LjYtYmV0YVsxMl0uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgdGhlIGNoZWNrIGZvciBjb250ZW50IGJlaW5nIHByZXNlbnQgd2hlbiB2ZXJpZnlpbmcgZGV0YWNoZWQKICAgICBzaWduYXR1cmVzIGluIHBrN19zbWltZS5jLiBTb21lIHZlcnNpb25zIG9mIE5ldHNjYXBlICh3cm9uZ2x5KQogICAgIGluY2x1ZGUgemVybyBsZW5ndGggY29udGVudCB3aGVuIHNpZ25pbmcgbWVzc2FnZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEJJT19zaHV0ZG93bl93ciBtYWNybywgd2hpY2ggaW52b2tlcyB0aGUgQklPX0NfU0hVVERPV05fV1IKICAgICBCSU9fY3RybCAoZm9yIEJJTyBwYWlycykuCiAgICAgW0JvZG8gTfZsbGVyXQoKICAqKSBBZGQgRFNPIG1ldGhvZCBmb3IgVk1TLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJ1ZyBmaXg6IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gY291bGQgcHJvZHVjZSByZXN1bHRzIHdpdGggdGhlCiAgICAgd3Jvbmcgc2lnbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFJQTSBzcGVjaWZpY2F0aW9uIG9wZW5zc2wuc3BlYyBhbmQgbW9kaWZ5IGl0IHRvIGJ1aWxkIHRocmVlCiAgICAgcGFja2FnZXMuICBUaGUgZGVmYXVsdCBwYWNrYWdlIGNvbnRhaW5zIGFwcGxpY2F0aW9ucywgYXBwbGljYXRpb24KICAgICBkb2N1bWVudGF0aW9uIGFuZCBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgZGV2ZWwgcGFja2FnZSBjb250YWlucwogICAgIGluY2x1ZGUgZmlsZXMsIHN0YXRpYyBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24uICBUaGUKICAgICBkb2MgcGFja2FnZSBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlIGRvYyBkaXJlY3RvcnkuICBUaGUgb3JpZ2luYWwKICAgICBvcGVuc3NsLnNwZWMgd2FzIHByb3ZpZGVkIGJ5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KICAgICAKICAqKSBBZGQgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcyBmb3IgbWFueSBTU0wgcm91dGluZXMuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBTb255IE5ld3MgNC4KICAgICBbTkFLQUpJIEhpcm95dWtpIDxuYWthamlAdHV0cnAudHV0LmFjLmpwPl0KCiAgKikgRG9uJ3Qgc2V0IHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIG9uZSB3aGVuIGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSBudW1iZXIgPCBxIGluIHRoZSBEU0EgbGlicmFyeS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IFNTTCBBUEkgbW9kZSAnU1NMX01PREVfQVVUT19SRVRSWScuICBUaGlzIGRpc2FibGVzIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHRoYXQgU1NMX3JlYWQgbWF5IHJlc3VsdCBpbiBTU0xfRVJST1JfV0FOVF9SRUFEIChldmVuIGlmCiAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIGJsb2NraW5nKSBpZiBhIGhhbmRzaGFrZSB0b29rIHBsYWNlLgogICAgIChUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIHNfY2xpZW50CiAgICAgYW5kIHNfc2VydmVyIHRoYXQgdXNlIHNlbGVjdCgpIHRvIGRldGVybWluZSB3aGVuIHRvIHVzZSBTU0xfcmVhZDsKICAgICBidXQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGtub3cgaW4gYWR2YW5jZSB3aGVuIHRvIGV4cGVjdCBkYXRhLCBpdAogICAgIGp1c3QgbWFrZXMgdGhpbmdzIG1vcmUgY29tcGxpY2F0ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSQU5EX2VnZF9ieXRlcygpLCB3aGljaCBnaXZlcyBjb250cm9sIG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAgZnJvbSBFR0QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGZldyBtb3JlIEVCQ0RJQyBjb25kaXRpb25hbHMgdGhhdCBtYWtlIGByZXEnIGFuZCBgeDUwOScKICAgICB3b3JrIGJldHRlciBvbiBzdWNoIHN5c3RlbXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBBZGQgdHdvIGRlbW8gcHJvZ3JhbXMgZm9yIFBLQ1MxMl9wYXJzZSgpIGFuZCBQS0NTMTJfY3JlYXRlKCkuCiAgICAgVXBkYXRlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IGNvcGllcyB0aGUgZnJpZW5kbHlOYW1lIGFuZCB0aGUKICAgICBrZXlpZCB0byB0aGUgY2VydGlmaWNhdGVzIGF1eCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gUEtDUzdfdmVyaWZ5KCkgd2hpY2ggY2F1c2VkIGFuIGluZmluaXRlIGxvb3AKICAgICBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBzaWduYXR1cmUuCiAgICAgW1N2ZW4gVXN6cGVsa2F0IDxzdUBjZWxvY29tLmRlPl0KCiAgKikgTWFqb3IgY2hhbmdlIGluIHV0aWwvbWtkZWYucGwgdG8gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbgogICAgIGFib3V0IGVhY2ggc3ltYm9sLCBhcyB3ZWxsIGFzIHByZXNlbnRpZyB2YXJpYWJsZXMgYXMgd2VsbAogICAgIGFzIGZ1bmN0aW9ucy4gIFRoaXMgY2hhbmdlIG1lYW5zIHRoYXQgdGhlcmUncyBuIG1vcmUgbmVlZAogICAgIHRvIHJlYnVpbGQgdGhlIC5udW0gZmlsZXMgd2hlbiBzb21lIGFsZ29yaXRobXMgYXJlIGV4Y2x1ZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFsbG93IHRoZSB2ZXJpZnkgdGltZSB0byBiZSBzZXQgYnkgYW4gYXBwbGljYXRpb24sCiAgICAgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAKICAqKSBQaGFzZSAyIHZlcmlmeSBjb2RlIHJlb3JnYW5pc2F0aW9uLiBUaGUgY2VydGlmaWNhdGUKICAgICB2ZXJpZnkgY29kZSBub3cgbG9va3MgdXAgYW4gaXNzdWVyIGNlcnRpZmljYXRlIGJ5IGEKICAgICBudW1iZXIgb2YgY3JpdGVyaWE6IHN1YmplY3QgbmFtZSwgYXV0aG9yaXR5IGtleSBpZAogICAgIGFuZCBrZXkgdXNhZ2UuIEl0IGFsc28gdmVyaWZpZXMgc2VsZiBzaWduZWQgY2VydGlmaWNhdGVzCiAgICAgYnkgdGhlIHNhbWUgY3JpdGVyaWEuIFRoZSBtYWluIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMKICAgICBYNTA5X2NoZWNrX2lzc3VlZCgpIHdoaWNoIHBlcmZvcm1zIHRoZXNlIGNoZWNrcy4KIAogICAgIExvdCBvZiBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcwogICAgIHdpdGhvdXQgY29tcGxldGVseSByZXdyaXRpbmcgdGhlIGxvb2t1cCBjb2RlLgogCiAgICAgQXV0aG9yaXR5IGFuZCBzdWJqZWN0IGtleSBpZGVudGlmaWVyIGFyZSBub3cgY2FjaGVkLgogCiAgICAgVGhlIExIQVNIICdjZXJ0cycgaXMgWDUwOV9TVE9SRSBoYXMgbm93IGJlZW4gcmVwbGFjZWQKICAgICBieSBhIFNUQUNLX09GKFg1MDlfT0JKRUNUKS4gVGhpcyBpcyBtYWlubHkgYmVjYXVzZSBhbgogICAgIExIQVNIIGNhbid0IHN0b3JlIG9yIHJldHJpZXZlIG11bHRpcGxlIG9iamVjdHMgd2l0aAogICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUuCgogICAgIEFzIGEgcmVzdWx0IHZhcmlvdXMgZnVuY3Rpb25zICh3aGljaCB3ZXJlIGFsbCBpbnRlcm5hbAogICAgIHVzZSBvbmx5KSBoYXZlIGNoYW5nZWQgdG8gaGFuZGxlIHRoZSBuZXcgWDUwOV9TVE9SRQogICAgIHN0cnVjdHVyZS4gVGhpcyB3aWxsIGJyZWFrIGFueXRoaW5nIHRoYXQgbWVzc2VkIHJvdW5kCiAgICAgd2l0aCBYNTA5X1NUT1JFIGludGVybmFsbHkuCiAKICAgICBUaGUgZnVuY3Rpb25zIFg1MDlfU1RPUkVfYWRkX2NlcnQoKSBub3cgY2hlY2tzIGZvciBhbgogICAgIGV4YWN0IG1hdGNoLCByYXRoZXIgdGhhbiBqdXN0IHN1YmplY3QgbmFtZS4KIAogICAgIFRoZSBYNTA5X1NUT1JFIEFQSSBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgdGhlIHJldHJpZXZhbAogICAgIG9mIG11bHRpcGxlIGNlcnRpZmljYXRlcyBtYXRjaGluZyBhIGdpdmVuIGNyaXRlcmlhLCBob3dldmVyCiAgICAgdGhpcyBjYW4gYmUgd29ya2VkIHJvdW5kIGJ5IHBlcmZvcm1pbmcgYSBsb29rdXAgZmlyc3QKICAgICAod2hpY2ggd2lsbCBmaWxsIHRoZSBjYWNoZSB3aXRoIGNhbmRpZGF0ZSBjZXJ0aWZpY2F0ZXMpCiAgICAgYW5kIHRoZW4gZXhhbWluaW5nIHRoZSBjYWNoZSBmb3IgbWF0Y2hlcy4gVGhpcyBpcyBwcm9iYWJseQogICAgIHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRob3V0IHRocm93aW5nIG91dCBYNTA5X0xPT0tVUAogICAgIGVudGlyZWx5IChtYXliZSBsYXRlci4uLikuCiAKICAgICBUaGUgWDUwOV9WRVJJRllfQ1RYIHN0cnVjdHVyZSBoYXMgYmVlbiBlbmhhbmNlZCBjb25zaWRlcmFibHkuCiAKICAgICBBbGwgY2VydGlmaWNhdGUgbG9va3VwIG9wZXJhdGlvbnMgbm93IGdvIHZpYSBhIGdldF9pc3N1ZXIoKQogICAgIGNhbGxiYWNrLiBBbHRob3VnaCB0aGlzIGN1cnJlbnRseSB1c2VzIGFuIFg1MDlfU1RPUkUgaXQKICAgICBjYW4gYmUgcmVwbGFjZWQgYnkgY3VzdG9tIGxvb2t1cHMuIFRoaXMgaXMgYSBzaW1wbGUgd2F5CiAgICAgdG8gYnlwYXNzIHRoZSBYNTA5X1NUT1JFIGhhY2tlcnkgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcwogICAgIHdvcmsgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBtb3JlIGVmZmljaWVudCB0ZWNobmlxdWVzCiAgICAgaW4gZnV0dXJlLiBBIHZlcnkgc2ltcGxlIHZlcnNpb24gd2hpY2ggdXNlcyBhIHNpbXBsZQogICAgIFNUQUNLIGZvciBpdHMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBzdG9yZSBpcyBhbHNvIHByb3ZpZGVkCiAgICAgdXNpbmcgWDUwOV9TVE9SRV9DVFhfdHJ1c3RlZF9zdGFjaygpLgogCiAgICAgVGhlIHZlcmlmeV9jYigpIGFuZCB2ZXJpZnkoKSBjYWxsYmFja3Mgbm93IGhhdmUgZXF1aXZhbGVudHMKICAgICBpbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlLgogCiAgICAgWDUwOV9TVE9SRV9DVFggYWxzbyBoYXMgYSAnZmxhZ3MnIGZpZWxkIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgdG8gY3VzdG9taXNlIHRoZSB2ZXJpZnkgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCiAKICAqKSBBZGQgbmV3IFBLQ1MjNyBzaWduaW5nIG9wdGlvbiBQS0NTN19OT1NNSU1FQ0FQIHdoaWNoIAogICAgIGV4Y2x1ZGVzIFMvTUlNRSBjYXBhYmlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBhIGNlcnRpZmljYXRlIHJlcXVlc3QgaXMgcmVhZCBpbiBrZWVwIGEgY29weSBvZiB0aGUKICAgICBvcmlnaW5hbCBlbmNvZGluZyBvZiB0aGUgc2lnbmVkIGRhdGEgYW5kIHVzZSBpdCB3aGVuIG91dHB1dGluZwogICAgIGFnYWluLiBTaWduYXR1cmVzIHRoZW4gdXNlIHRoZSBvcmlnaW5hbCBlbmNvZGluZyByYXRoZXIgdGhhbgogICAgIGEgZGVjb2RlZCwgZW5jb2RlZCB2ZXJzaW9uIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBpZiB0aGUKICAgICByZXF1ZXN0IGlzIGltcHJvcGVybHkgZW5jb2RlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBCSU9fcHV0cyBpbXBsZW1lbnRhdGlvbnMsIGNhbGwKICAgICBidWZmZXJfd3JpdGUoYiwgLi4uKSBkaXJlY3RseSBpbiBidWZmZXJfcHV0cyBpbnN0ZWFkIG9mIGNhbGxpbmcKICAgICBCSU9fd3JpdGUoYiwgLi4uKS4KCiAgICAgSW4gQklPX3B1dHMsIGluY3JlbWVudCBiLT5udW1fd3JpdGUgYXMgaW4gQklPX3dyaXRlLgogICAgIFtQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcl0KCiAgKikgRml4IEJOX211bF93b3JkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgd29yZCBpcyAwLiAoV2UgaGF2ZSB0byB1c2UKICAgICBCTl96ZXJvLCB3ZSBtYXkgbm90IHJldHVybiBhIEJJR05VTSB3aXRoIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2YKICAgICB3b3JkcyBzZXQgdG8gemVyby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgY2FsbGluZyBhYm9ydCgpIGZyb20gd2l0aGluIHRoZSBsaWJyYXJ5IHdoZW4gcHJvYmxlbXMgYXJlCiAgICAgZGV0ZWN0ZWQsIGV4Y2VwdCBpZiBwcmVwcm9jZXNzb3Igc3ltYm9scyBoYXZlIGJlZW4gZGVmaW5lZAogICAgIChzdWNoIGFzIFJFRl9DSEVDSywgQk5fREVCVUcgZXRjLikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wZW5zc2wgYXBwbGljYXRpb24gJ3JzYXV0bCcuIFRoaXMgdXRpbGl0eSBjYW4gYmUKICAgICB1c2VkIGZvciBsb3cgbGV2ZWwgUlNBIG9wZXJhdGlvbnMuIERFUiBwdWJsaWMga2V5CiAgICAgQklPL2ZwIHJvdXRpbmVzIGFsc28gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBlbnRyeSBhbmQgcGF0Y2hlcyBmb3IgY29tcGlsaW5nIG9uIFFOWCA0LgogICAgIFtBbmRyZWFzIFNjaG5laWRlciA8YW5kcmVhc0BkczMuZXRlY2guZmgtaGFtYnVyZy5kZT5dCgogICopIEEgZGVtbyBzdGF0ZS1tYWNoaW5lIGltcGxlbWVudGF0aW9uIHdhcyBzcG9uc29yZWQgYnkKICAgICBOdXJvbiAoaHR0cDovL3d3dy5udXJvbi5jb20vKSBhbmQgaXMgbm93IGF2YWlsYWJsZSBpbgogICAgIGRlbW9zL3N0YXRlX21hY2hpbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBvcHRpb25zIGFkZGVkIHRvIHRoZSAnZGdzdCcgdXRpbGl0eSBmb3Igc2lnbmF0dXJlCiAgICAgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVucmVjb2duaXplZCBQS0NTIzcgY29udGVudCB0eXBlcyBhcmUgbm93IGhhbmRsZWQgdmlhIGEKICAgICBjYXRjaCBhbGwgQVNOMV9UWVBFIHN0cnVjdHVyZS4gVGhpcyBhbGxvd3MgdW5zdXBwb3J0ZWQKICAgICB0eXBlcyB0byBiZSBzdG9yZWQgYXMgYSAiYmxvYiIgYW5kIGFuIGFwcGxpY2F0aW9uIGNhbgogICAgIGVuY29kZSBhbmQgZGVjb2RlIGl0IG1hbnVhbGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIHNpZ25lZC91bnNpZ25lZCBpc3N1ZXMgdG8gbWFrZSBhX3N0cmV4LmMKICAgICBjb21waWxlIHVuZGVyIFZDKysuCiAgICAgW09zY2FyIEphY29ic3NvbiA8b3NjYXIuamFjb2Jzc29uQGNlbG9jb20uY29tPl0KCiAgKikgQVNOMSBmaXhlcy4gaTJkX0FTTjFfT0JKRUNUIHdhcyBub3QgcmV0dXJuaW5nIHRoZSBjb3JyZWN0CiAgICAgbGVuZ3RoIGlmIHBhc3NlZCBhIGJ1ZmZlci4gQVNOMV9JTlRFR0VSX3RvX0JOIGZhaWxlZAogICAgIGlmIHBhc3NlZCBhIE5VTEwgQk4gYW5kIGl0cyBhcmd1bWVudCB3YXMgbmVnYXRpdmUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgU3ZlbiBIZWliZXJnIDxzdmVuQHRhcnR1LmN5YmVyLmVlPl0KCiAgKikgTW9kaWZpY2F0aW9uIHRvIFBLQ1MjNyBlbmNvZGluZyByb3V0aW5lcyB0byBvdXRwdXQgZGVmaW5pdGUKICAgICBsZW5ndGggZW5jb2RpbmcuIFNpbmNlIGN1cnJlbnRseSB0aGUgd2hvbGUgc3RydWN0dXJlcyBhcmUgaW4KICAgICBtZW1vcnkgdGhlcmUncyBub3QgcmVhbCBwb2ludCBpbiB1c2luZyBpbmRlZmluaXRlIGxlbmd0aCAKICAgICBjb25zdHJ1Y3RlZCBlbmNvZGluZy4gSG93ZXZlciBpZiBPcGVuU1NMIGlzIGNvbXBpbGVkIHdpdGgKICAgICB0aGUgZmxhZyBQS0NTN19JTkRFRklOSVRFX0VOQ09ESU5HIHRoZSBvbGQgZm9ybSBpcyB1c2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIEJJT192cHJpbnRmKCkgYW5kIEJJT192c25wcmludGYoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBtb3JlIHByZWZpeGVzIHRvIHBhcnNlIGZvciBpbiB0aGUgdGhlIHN0cmluZ3Mgd3JpdHRlbgogICAgIHRocm91Z2ggYSBsb2dnaW5nIGJpbywgdG8gY292ZXIgYWxsIHRoZSBsZXZlbHMgdGhhdCBhcmUgYXZhaWxhYmxlCiAgICAgdGhyb3VnaCBzeXNsb2cuICBUaGUgcHJlZml4ZXMgYXJlIG5vdzoKCglQQU5JQywgRU1FUkcsIEVNUgk9PglMT0dfRU1FUkcKCUFMRVJULCBBTFIJCT0+CUxPR19BTEVSVAoJQ1JJVCwgQ1JJCQk9PglMT0dfQ1JJVAoJRVJST1IsIEVSUgkJPT4JTE9HX0VSUgoJV0FSTklORywgV0FSTiwgV0FSCT0+CUxPR19XQVJOSU5HCglOT1RJQ0UsIE5PVEUsIE5PVAk9PglMT0dfTk9USUNFCglJTkZPLCBJTkYJCT0+CUxPR19JTkZPCglERUJVRywgREJHCQk9PglMT0dfREVCVUcKCiAgICAgYW5kIGFzIGJlZm9yZSwgaWYgbm9uZSBvZiB0aG9zZSBwcmVmaXhlcyBhcmUgcHJlc2VudCBhdCB0aGUKICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgTE9HX0VSUiBpcyBjaG9zZW4uCgogICAgIE9uIFdpbjMyLCB0aGUgTE9HXyogbGV2ZWxzIGFyZSBtYXBwZWQgYWNjb3JkaW5nIHRvIHRoaXM6CgoJTE9HX0VNRVJHLCBMT0dfQUxFUlQsIExPR19DUklULCBMT0dfRVJSCT0+IEVWRU5UTE9HX0VSUk9SX1RZUEUKCUxPR19XQVJOSU5HCQkJCT0+IEVWRU5UTE9HX1dBUk5JTkdfVFlQRQoJTE9HX05PVElDRSwgTE9HX0lORk8sIExPR19ERUJVRwkJPT4gRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRQoKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWRlIGl0IHBvc3NpYmxlIHRvIHJlY29uZmlndXJlIHdpdGgganVzdCB0aGUgY29uZmlndXJhdGlvbgogICAgIGFyZ3VtZW50ICJyZWNvbmYiIG9yICJyZWNvbmZpZ3VyZSIuICBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIGFyZSBzdG9yZWQgaW4gTWFrZWZpbGUuc3NsIGluIHRoZSB2YXJpYWJsZSBDT05GSUdVUkVfQVJHUywKICAgICBhbmQgYXJlIHJldHJpZXZlZCBmcm9tIHRoZXJlIHdoZW4gcmVjb25maWd1cmluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNRDQgaW1wbGVtZW50ZWQuCiAgICAgW0Fzc2FyIFdlc3Rlcmx1bmQgPGFzc2FyQHNpY3Muc2U+LCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgYXJndW1lbnRzIC1DQWZpbGUgYW5kIC1DQXBhdGggdG8gdGhlIHBrY3MxMiB1dGlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBvYmpfZGF0LnBsIHNjcmlwdCB3YXMgbWVzc2luZyB1cCB0aGUgc29ydGluZyBvZiBvYmplY3QKICAgICBuYW1lcy4gVGhlIHJlYXNvbiB3YXMgdGhhdCBpdCBjb21wYXJlZCB0aGUgcXVvdGVkIHZlcnNpb24KICAgICBvZiBzdHJpbmdzIGFzIGEgcmVzdWx0ICJPQ1NQIiA+ICJPQ1NQIFNpZ25pbmciIGJlY2F1c2UKICAgICAiID4gU1BBQ0UuIENoYW5nZWQgc2NyaXB0IHRvIHN0b3JlIHVucXVvdGVkIHZlcnNpb25zIG9mCiAgICAgbmFtZXMgYW5kIGFkZCBxdW90ZXMgb24gb3V0cHV0LiBJdCB3YXMgYWxzbyBvbWl0dGluZyBzb21lCiAgICAgbmFtZXMgZnJvbSB0aGUgbG9va3VwIHRhYmxlIGlmIHRoZXkgd2VyZSBnaXZlbiBhIGRlZmF1bHQKICAgICB2YWx1ZSAodGhhdCBpcyBpZiBTTiBpcyBtaXNzaW5nIGl0IGlzIGdpdmVuIHRoZSBzYW1lCiAgICAgdmFsdWUgYXMgTE4gYW5kIHZpY2UgdmVyc2EpLCB0aGVzZSBhcmUgbm93IGFkZGVkIG9uIHRoZQogICAgIGdyb3VuZHMgdGhhdCBpZiBhbiBvYmplY3QgaGFzIGEgbmFtZSB3ZSBzaG91bGQgYmUgYWJsZSB0bwogICAgIGxvb2sgaXQgdXAuIEZpbmFsbHkgYWRkZWQgd2FybmluZyBvdXRwdXQgd2hlbiBkdXBsaWNhdGUKICAgICBzaG9ydCBvciBsb25nIG5hbWVzIGFyZSBmb3VuZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIG5lZWRlZCBmb3IgVGFuZGVtIE5TSy4KICAgICBbU2NvdHQgVXJvZmYgPHNjb3R0QHh5cHJvLmNvbT5dCgogICopIEZpeCBTU0wgMi4wIHJvbGxiYWNrIGNoZWNraW5nOiBEdWUgdG8gYW4gb2ZmLWJ5LW9uZSBlcnJvciBpbgogICAgIFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMygpLCBzcGVjaWFsIHBhZGRpbmcgd2FzIG5ldmVyIGRldGVjdGVkCiAgICAgYW5kIHRodXMgdGhlIFNTTCAzLjAvVExTIDEuMCBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IHByb3RvY29sCiAgICAgdmVyc2lvbiByb2xsYmFjayBhdHRhY2tzIHdhcyBub3QgZWZmZWN0aXZlLgoKICAgICBJbiBzMjNfY2xudC5jLCBkb24ndCB1c2Ugc3BlY2lhbCByb2xsYmFjay1hdHRhY2sgZGV0ZWN0aW9uIHBhZGRpbmcKICAgICAoUlNBX1NTTFYyM19QQURESU5HKSBpZiBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlCiAgICAgY2xpZW50OyBzaW1pbGFybHksIGluIHMyM19zcnZyLmMsIGRvbid0IGRvIHRoZSByb2xsYmFjayBjaGVjayBpZgogICAgIFNTTCAyLjAgaXMgdGhlIG9ubHkgcHJvdG9jb2wgZW5hYmxlZCBpbiB0aGUgc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gZ2V0IGhleGR1bXBzIG9mIHVucHJpbnRhYmxlIGRhdGEgd2l0aCAnb3BlbnNzbAogICAgIGFzbjFwYXJzZScuICBCeSBpbXBsaWNhdGlvbiwgdGhlIGZ1bmN0aW9ucyBBU04xX3BhcnNlX2R1bXAoKSBhbmQKICAgICBCSU9fZHVtcF9pbmRlbnQoKSBhcmUgYWRkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBBU04xX1NUUklOR19wcmludF9leCgpIGFuZCBYNTA5X05BTUVfcHJpbnRfZXgoKQogICAgIHRoZXNlIHByaW50IG91dCBzdHJpbmdzIGFuZCBuYW1lIHN0cnVjdHVyZXMgYmFzZWQgb24gdmFyaW91cwogICAgIGZsYWdzIGluY2x1ZGluZyBSRkMyMjUzIHN1cHBvcnQgYW5kIHByb3BlciBoYW5kbGluZyBvZgogICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLiBBZGRlZCBvcHRpb25zIHRvIHRoZSAneDUwOScgdXRpbGl0eSAKICAgICB0byBhbGxvdyB0aGUgdmFyaW91cyBmbGFncyB0byBiZSBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byB1c2UgQVNOMV9USU1FIGluc3RlYWQgb2YgQVNOMV9VVENUSU1FLgogICAgIEFsc28gY2hhbmdlIHRoZSBmdW5jdGlvbnMgWDUwOV9jbXBfY3VycmVudF90aW1lKCkgYW5kCiAgICAgWDUwOV9nbXRpbWVfYWRqKCkgd29yayB3aXRoIGFuIEFTTjFfVElNRSBzdHJ1Y3R1cmUsCiAgICAgdGhpcyB3aWxsIGVuYWJsZSBjZXJ0aWZpY2F0ZXMgdXNpbmcgR2VuZXJhbGl6ZWRUaW1lIGluIHZhbGlkaXR5CiAgICAgZGF0ZXMgdG8gYmUgY2hlY2tlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBORUdfUFVCS0VZX0JVRyBjb2RlICh3aGljaCB0b2xlcmF0ZXMgaW52YWxpZAogICAgIG5lZ2F0aXZlIHB1YmxpYyBrZXkgZW5jb2RpbmdzKSBvbiBieSBkZWZhdWx0LAogICAgIE5PX05FR19QVUJLRVlfQlVHIGNhbiBiZSBzZXQgdG8gZGlzYWJsZSBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gYzJpX0FTTjFfT0JKRUNUKCkgd2hpY2ggYWN0cyBvbiBBU04xX09CSkVDVAogICAgIGNvbnRlbnQgb2N0ZXRzLiBBbiBpMmNfQVNOMV9PQkpFQ1QgaXMgdW5uZWNlc3NhcnkgYmVjYXVzZQogICAgIHRoZSBlbmNvZGluZyBjYW4gYmUgdHJpdmlhbGx5IG9idGFpbmVkIGZyb20gdGhlIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBjcnlwdG8vZXJyLmMgbG9ja2luZyBidWdmaXg6IFVzZSB3cml0ZSBsb2NrcyAoQ1JZUFRPX3dfW3VuXWxvY2spLAogICAgIG5vdCByZWFkIGxvY2tzIChDUllQVE9fcl9bdW5dbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQSBmaXJzdCBhdHRlbXB0IGF0IGNyZWF0aW5nIG9mZmljaWFsIHN1cHBvcnQgZm9yIHNoYXJlZAogICAgIGxpYnJhcmllcyB0aHJvdWdoIGNvbmZpZ3VyYXRpb24uICBJJ3ZlIGtlcHQgaXQgc28gdGhlCiAgICAgZGVmYXVsdCBpcyBzdGF0aWMgbGlicmFyaWVzIG9ubHksIGFuZCB0aGUgT3BlblNTTCBwcm9ncmFtcwogICAgIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQgZm9yIG5vdywgYnV0IHRoZXJlIGFyZQogICAgIHByZXBhcmF0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIGluIHBsYWNlLgogICAgIFRoaXMgaGFzIGJlZW4gdGVzdGVkIG9uIExpbnV4IGFuZCBUcnU2NC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSYW5kb21uZXNzIHBvbGxpbmcgZnVuY3Rpb24gZm9yIFdpbjl4LCBhcyBkZXNjcmliZWQgaW46CiAgICAgUGV0ZXIgR3V0bWFubiwgU29mdHdhcmUgR2VuZXJhdGlvbiBvZiBQcmFjdGljYWxseSBTdHJvbmcKICAgICBSYW5kb20gTnVtYmVycy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHNvIFBSTkcgaXMgc2VlZGVkIGluIHJlcSBpZiB1c2luZyBhbiBhbHJlYWR5IGV4aXN0aW5nCiAgICAgRFNBIGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9ucyB0byBzbWltZSBhcHBsaWNhdGlvbi4gLWluZm9ybSBhbmQgLW91dGZvcm0KICAgICBhbGxvdyBhbHRlcm5hdGl2ZSBmb3JtYXRzIGZvciB0aGUgUy9NSU1FIG1lc3NhZ2UgaW5jbHVkaW5nCiAgICAgUEVNIGFuZCBERVIuIFRoZSAtY29udGVudCBvcHRpb24gYWxsb3dzIHRoZSBjb250ZW50IHRvIGJlCiAgICAgc3BlY2lmaWVkIHNlcGFyYXRlbHkuIFRoaXMgc2hvdWxkIGFsbG93IHRoaW5ncyBsaWtlIE5ldHNjYXBlCiAgICAgZm9ybSBzaWduaW5nIG91dHB1dCBlYXNpZXIgdG8gdmVyaWZ5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgQVNOMSBlbmNvZGluZyBvZiB0YWdzIHVzaW5nIHRoZSAnbG9uZyBmb3JtJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMsIGkyY18qIGFuZCBjMmlfKiBmb3IgSU5URUdFUiBhbmQgQklUCiAgICAgU1RSSU5HIHR5cGVzLiBUaGVzZSBjb252ZXJ0IGNvbnRlbnQgb2N0ZXRzIHRvIGFuZCBmcm9tIHRoZQogICAgIHVuZGVybHlpbmcgdHlwZS4gVGhlIGFjdHVhbCB0YWcgYW5kIGxlbmd0aCBvY3RldHMgYXJlCiAgICAgYWxyZWFkeSBhc3N1bWVkIHRvIGhhdmUgYmVlbiByZWFkIGluIGFuZCBjaGVja2VkLiBUaGVzZQogICAgIGFyZSBuZWVkZWQgYmVjYXVzZSBhbGwgb3RoZXIgc3RyaW5nIHR5cGVzIGhhdmUgdmlydHVhbGx5CiAgICAgaWRlbnRpY2FsIGhhbmRsaW5nIGFwYXJ0IGZyb20gdGhlIHRhZy4gQnkgaGF2aW5nIHZlcnNpb25zCiAgICAgb2YgdGhlIEFTTjEgZnVuY3Rpb25zIHRoYXQganVzdCBvcGVyYXRlIG9uIGNvbnRlbnQgb2N0ZXRzCiAgICAgSU1QTElDSVQgdGFnZ2luZyBjYW4gYmUgaGFuZGxlZCBwcm9wZXJseS4gSXQgYWxzbyBhbGxvd3MKICAgICB0aGUgQVNOMV9FTlVNRVJBVEVEIGNvZGUgdG8gYmUgY3V0IGRvd24gYmVjYXVzZSBBU04xX0VOVU1FUkFURUQKICAgICBhbmQgQVNOMV9JTlRFR0VSIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdGFnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgaGFuZGxpbmcgb2YgT0lEIG9iamVjdHMgYXMgZm9sbG93czoKCiAgICAgLSBOZXcgb2JqZWN0IGlkZW50aWZpZXJzIGFyZSBpbnNlcnRlZCBpbiBvYmplY3RzLnR4dCwgZm9sbG93aW5nCiAgICAgICB0aGUgc3ludGF4IGdpdmVuIGluIG9iamVjdHMuUkVBRE1FLgogICAgIC0gb2JqZWN0cy5wbCBpcyB1c2VkIHRvIHByb2Nlc3Mgb2JqX21hYy5udW0gYW5kIGNyZWF0ZSBhIG5ldwogICAgICAgb2JqX21hYy5oLgogICAgIC0gb2JqX2RhdC5wbCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvYmpfZGF0LmgsIHVzaW5nIHRoZSBkYXRhIGluCiAgICAgICBvYmpfbWFjLmguCgogICAgIFRoaXMgaXMgY3VycmVudGx5IGtpbmQgb2YgYSBoYWNrLCBhbmQgdGhlIHBlcmwgY29kZSBpbiBvYmplY3RzLnBsCiAgICAgaXNuJ3QgdmVyeSBlbGVnYW50LCBidXQgaXQgd29ya3MgYXMgSSBpbnRlbmRlZC4gIFRoZSBzaW1wbGVzdCB3YXkKICAgICB0byBjaGVjayB0aGF0IGl0IHdvcmtlZCBjb3JyZWN0bHkgaXMgdG8gbG9vayBpbiBvYmpfZGF0LmggYW5kCiAgICAgY2hlY2sgdGhlIGFycmF5IG5pZF9vYmpzIGFuZCBtYWtlIHN1cmUgdGhlIG9iamVjdHMgaGF2ZW4ndCBtb3ZlZAogICAgIGFyb3VuZCAodGhpcyBpcyBpbXBvcnRhbnQhKS4gIEFkZGl0aW9ucyBhcmUgT0ssIGFzIHdlbGwgYXMKICAgICBjb25zaXN0ZW50IG5hbWUgY2hhbmdlcy4gCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIEJTRC1zdHlsZSBNRDUtYmFzZWQgcGFzc3dvcmRzIHRvICdvcGVuc3NsIHBhc3N3ZCcgKG9wdGlvbiAnLTEnKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRpdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlciAnLXJhbmQgZmlsZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBUaGUgZ2l2ZW4gZmlsZSBhZGRzIHRvIHdoYXRldmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VlZGVkIGludG8gdGhlCiAgICAgcmFuZG9tIHBvb2wgdGhyb3VnaCB0aGUgUkFOREZJTEUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiBvcgogICAgIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciB0aGUgZGVmYXVsdCByYW5kb20gc3RhdGUgZmlsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBta3N0YWNrLnBsIG5vdyBzb3J0cyBlYWNoIG1hY3JvIGdyb3VwIGludG8gbGV4aWNhbCBvcmRlci4KICAgICBQcmV2aW91c2x5IHRoZSBvdXRwdXQgb3JkZXIgZGVwZW5kZWQgb24gdGhlIG9yZGVyIHRoZSBmaWxlcwogICAgIGFwcGVhcmVkIGluIHRoZSBkaXJlY3RvcnksIHJlc3VsdGluZyBpbiBuZWVkbGVzcyByZXdyaXRpbmcKICAgICBvZiBzYWZlc3RhY2suaCAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGF0Y2hlcyB0byBtYWtlIE9wZW5TU0wgY29tcGlsZSB1bmRlciBXaW4zMiBhZ2Fpbi4gTW9zdGx5CiAgICAgd29yayBhcm91bmRzIGZvciB0aGUgVkMrKyBwcm9ibGVtIHRoYXQgaXQgdHJlYXRzIGZ1bmMoKSBhcwogICAgIGZ1bmModm9pZCkuIEFsc28gc3RyaXBwZWQgb3V0IHRoZSBwYXJ0cyBvZiBta2RlZi5wbCB0aGF0CiAgICAgYWRkZWQgZXh0cmEgdHlwZXNhZmUgZnVuY3Rpb25zOiB0aGVzZSBubyBsb25nZXIgZXhpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzYXRpb24gb2YgdGhlIHN0YWNrIGNvZGUuIFRoZSBtYWNyb3MgYXJlIG5vdyBhbGwgCiAgICAgY29sbGVjdGVkIGluIHNhZmVzdGFjay5oIC4gRWFjaCBtYWNybyBpcyBkZWZpbmVkIGluIHRlcm1zIG9mCiAgICAgYSAic3RhY2sgbWFjcm8iIG9mIHRoZSBmb3JtIFNLTV88bmFtZT4odHlwZSwgYSwgYikuIFRoZSAKICAgICBERUJVR19TQUZFU1RBQ0sgaXMgbm93IGhhbmRsZWQgaW4gdGVybXMgb2YgZnVuY3Rpb24gY2FzdHMsCiAgICAgdGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiByZXRhaW5pbmcgdHlwZSBzYWZldHkgd2l0aG91dCB0aGUKICAgICB1c2Ugb2YgYWRkaXRpb25hbCBmdW5jdGlvbnMuIElmIERFQlVHX1NBRkVTVEFDSyBpcyBub3QgZGVmaW5lZAogICAgIHRoZW4gdGhlIG5vbiB0eXBlc2FmZSBtYWNyb3MgYXJlIHVzZWQgaW5zdGVhZC4gQWxzbyBtb2RpZmllZCB0aGUKICAgICBta3N0YWNrLnBsIHNjcmlwdCB0byBoYW5kbGUgdGhlIG5ldyBmb3JtLiBOZWVkcyB0ZXN0aW5nIHRvIHNlZQogICAgIGlmIHdoaWNoIChpZiBhbnkpIGNvbXBpbGVycyBpdCBjaG9rZXMgYW5kIG1heWJlIG1ha2UgREVCVUdfU0FGRVNUQUNLCiAgICAgdGhlIGRlZmF1bHQgaWYgbm8gbWFqb3IgcHJvYmxlbXMuIFNpbWlsYXIgYmVoYXZpb3VyIGZvciBBU04xX1NFVF9PRgogICAgIGFuZCBQS0NTMTJfU1RBQ0tfT0YuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBzb21lIHZlcnNpb25zIG9mIElJUyB1c2UgdGhlICdORVQnIGZvcm0gb2YgcHJpdmF0ZSBrZXkgdGhlCiAgICAga2V5IGRlcml2YXRpb24gYWxnb3JpdGhtIGlzIGRpZmZlcmVudC4gTm9ybWFsbHkgTUQ1KHBhc3N3b3JkKSBpcwogICAgIHVzZWQgYXMgYSAxMjggYml0IFJDNCBrZXkuIEluIHRoZSBtb2RpZmllZCBjYXNlCiAgICAgTUQ1KE1ENShwYXNzd29yZCkgKyAiU0dDS0VZU0FMVCIpICBpcyB1c2VkIGluc3RlZC4gQWRkZWQgc29tZQogICAgIG5ldyBmdW5jdGlvbnMgaTJkX1JTQV9ORVQoKSwgZDJpX1JTQV9ORVQoKSBldGMgd2hpY2ggYXJlIHRoZSBzYW1lCiAgICAgYXMgdGhlIG9sZCBOZXRzY2FwZV9SU0EgZnVuY3Rpb25zIGV4Y2VwdCB0aGV5IGhhdmUgYW4gYWRkaXRpb25hbAogICAgICdzZ2NrZXknIHBhcmFtZXRlciB3aGljaCB1c2VzIHRoZSBtb2RpZmllZCBhbGdvcml0aG0uIEFsc28gYWRkZWQKICAgICBhbiAtc2dja2V5IGNvbW1hbmQgbGluZSBvcHRpb24gdG8gdGhlIHJzYSB1dGlsaXR5LiBUaGFua3MgdG8gCiAgICAgQWRyaWFuIFBlY2sgPGJlcnRpZUBuY2lwaGVyLmNvbT4gZm9yIHBvc3RpbmcgZGV0YWlscyBvZiB0aGUgbW9kaWZpZWQKICAgICBhbGdvcml0aG0gdG8gb3BlbnNzbC1kZXYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGV2cF9sb2NhbC5oIG1hY3JvcyB3ZXJlIHVzaW5nICdjLiMja25hbWUnIHdoaWNoIHJlc3VsdGVkIGluCiAgICAgaW52YWxpZCBleHBhbnNpb24gb24gc29tZSBzeXN0ZW1zIChTQ08gNS4wLjUgZm9yIGV4YW1wbGUpLgogICAgIENvcnJlY3RlZCB0byAnYy5rbmFtZScuCiAgICAgW1BoaWxsaXAgUG9yY2ggPHJvb3RAdGhlcG9yY2guY29tPl0KCiAgKikgTmV3IFg1MDlfZ2V0MV9lbWFpbCgpIGFuZCBYNTA5X1JFUV9nZXQxX2VtYWlsKCkgZnVuY3Rpb25zIHRoYXQgcmV0dXJuCiAgICAgYSBTVEFDSyBvZiBlbWFpbCBhZGRyZXNzZXMgZnJvbSBhIGNlcnRpZmljYXRlIG9yIHJlcXVlc3QsIHRoZXNlIGxvb2sKICAgICBpbiB0aGUgc3ViamVjdCBuYW1lIGFuZCB0aGUgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lIGV4dGVuc2lvbnMgYW5kIAogICAgIG9taXQgYW55IGR1cGxpY2F0ZSBhZGRyZXNzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmUtaW1wbGVtZW50IEJOX21vZF9leHAyX21vbnQgdXNpbmcgaW5kZXBlbmRlbnQgKGFuZCBsYXJnZXIpIHdpbmRvd3MuCiAgICAgVGhpcyBtYWtlcyBEU0EgdmVyaWZpY2F0aW9uIGFib3V0IDIgJSBmYXN0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jcmVhc2UgbWF4aW11bSB3aW5kb3cgc2l6ZSBpbiBCTl9tb2RfZXhwXy4uLiB0byA2IGJpdHMgaW5zdGVhZCBvZiA1CiAgICAgKG1lYW5pbmcgdGhhdCBub3cgMl41IHZhbHVlcyB3aWxsIGJlIHByZWNvbXB1dGVkLCB3aGljaCBpcyBvbmx5IDQgS0IKICAgICBwbHVzIG92ZXJoZWFkIGZvciAxMDI0IGJpdCBtb2R1bGkpLgogICAgIFRoaXMgbWFrZXMgZXhwb25lbnRpYXRpb25zIGFib3V0IDAuNSAlIGZhc3RlciBmb3IgMTAyNCBiaXQKICAgICBleHBvbmVudHMgKGFzIG1lYXN1cmVkIGJ5ICJvcGVuc3NsIHNwZWVkIHJzYTIwNDgiKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW5hbWUgbWVtb3J5IGhhbmRsaW5nIG1hY3JvcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlcgogICAgIHNvZnR3YXJlOgogICAgICAgICAgTWFsbG9jICAgICAgICAgPT4gIE9QRU5TU0xfbWFsbG9jCiAgICAgICAgICBNYWxsb2NfbG9ja2VkICA9PiAgT1BFTlNTTF9tYWxsb2NfbG9ja2VkCiAgICAgICAgICBSZWFsbG9jICAgICAgICA9PiAgT1BFTlNTTF9yZWFsbG9jCiAgICAgICAgICBGcmVlICAgICAgICAgICA9PiAgT1BFTlNTTF9mcmVlCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX21vZF9leHBfbW9udF93b3JkIGZvciBzbWFsbCBiYXNlcyAocm91Z2hseSAxNSUKICAgICBmYXN0ZXIgdGhhbiBCTl9tb2RfZXhwX21vbnQsIGkuZS4gNyUgZm9yIGEgZnVsbCBESCBleGNoYW5nZSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ3lnV2luMzIgc3VwcG9ydC4KICAgICBbSm9obiBKYXJ2aWUgPGpqYXJ2aWVAbmV3c2d1eS5jb20+XQoKICAqKSBUaGUgdHlwZS1zYWZlIHN0YWNrIGNvZGUgaGFzIGJlZW4gcmVqaWdnZWQuIEl0IGlzIG5vdyBvbmx5IGNvbXBpbGVkCiAgICAgaW4gd2hlbiBPcGVuU1NMIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgREVCVUdfU0FGRVNUQUNLIG9wdGlvbiBhbmQKICAgICBieSBkZWZhdWx0IGFsbCB0eXBlLXNwZWNpZmljIHN0YWNrIGZ1bmN0aW9ucyBhcmUgIiNkZWZpbmUiZCBiYWNrIHRvCiAgICAgc3RhbmRhcmQgc3RhY2sgZnVuY3Rpb25zLiBUaGlzIHJlc3VsdHMgaW4gbW9yZSBzdHJlYW1saW5lZCBvdXRwdXQKICAgICBidXQgcmV0YWlucyB0aGUgdHlwZS1zYWZldHkgY2hlY2tpbmcgcG9zc2liaWxpdGllcyBvZiB0aGUgb3JpZ2luYWwKICAgICBhcHByb2FjaC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUaGUgU1RBQ0sgY29kZSBoYXMgYmVlbiBjbGVhbmVkIHVwLCBhbmQgY2VydGFpbiB0eXBlIGRlY2xhcmF0aW9ucwogICAgIHRoYXQgZGlkbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgaGF2ZSBiZWVuIGJyb3VnaHQgaW4gbGluZS4gVGhpcyBoYXMKICAgICBhbHNvIGludm9sdmVkIGEgY2xlYW51cCBvZiBzb3J0cyBpbiBzYWZlc3RhY2suaCB0byBtb3JlIGNvcnJlY3RseQogICAgIG1hcCB0eXBlLXNhZmUgc3RhY2sgZnVuY3Rpb25zIG9udG8gdGhlaXIgcGxhaW4gc3RhY2sgY291bnRlcnBhcnRzLgogICAgIFRoaXMgd29yayBoYXMgYWxzbyByZXN1bHRlZCBpbiBhIHZhcmlldHkgb2YgImNvbnN0ImlmaWNhdGlvbnMgb2YKICAgICBsb3RzIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5ICJfY21wIiBvcGVyYXRpb25zIHdoaWNoIHNob3VsZCBub3JtYWxseQogICAgIGJlIHByb3RvdHlwZWQgd2l0aCAiY29uc3QiIHBhcmFtZXRlcnMgYW55d2F5LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFdoZW4gZ2VuZXJhdGluZyBieXRlcyBmb3IgdGhlIGZpcnN0IHRpbWUgaW4gbWRfcmFuZC5jLCAnc3RpciB0aGUgcG9vbCcKICAgICBieSBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyAod2l0aCB6ZXJvIGVudHJvcHkgY291bnQpLgogICAgIChUaGUgUFJORyBzdGF0ZSBjb25zaXN0cyBvZiB0d28gcGFydHMsIHRoZSBsYXJnZSBwb29sICdzdGF0ZScgYW5kICdtZCcsCiAgICAgd2hlcmUgYWxsIG9mICdtZCcgaXMgdXNlZCBlYWNoIHRpbWUgdGhlIFBSTkcgaXMgdXNlZCwgYnV0ICdzdGF0ZScKICAgICBpcyB1c2VkIG9ubHkgaW5kZXhlZCBieSBhIGN5Y2xpYyBjb3VudGVyLiBBcyBlbnRyb3B5IG1heSBub3QgYmUKICAgICB3ZWxsIGRpc3RyaWJ1dGVkIGZyb20gdGhlIGJlZ2lubmluZywgJ21kJyBpcyBpbXBvcnRhbnQgYXMgYQogICAgIGNoYWluaW5nIHZhcmlhYmxlLiBIb3dldmVyLCB0aGUgb3V0cHV0IGZ1bmN0aW9uIGNoYWlucyBvbmx5IGhhbGYKICAgICBvZiAnbWQnLCBpLmUuIDgwIGJpdHMuICBzc2xlYXlfcmFuZF9hZGQsIG9uIHRoZSBvdGhlciBoYW5kLCBjaGFpbnMKICAgICBhbGwgb2YgJ21kJywgYW5kIHNlZWRpbmcgd2l0aCBTVEFURV9TSVpFIGR1bW15IGJ5dGVzIHdpbGwgcmVzdWx0CiAgICAgaW4gYWxsIG9mICdzdGF0ZScgYmVpbmcgcmV3cml0dGVuLCB3aXRoIHRoZSBuZXcgdmFsdWVzIGRlcGVuZGluZwogICAgIG9uIHZpcnR1YWxseSBhbGwgb2YgJ21kJy4gIFRoaXMgb3ZlcmNvbWVzIHRoZSA4MCBiaXQgbGltaXRhdGlvbi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gc3NsL3MyX2NsbnQuYyBhbmQgc3NsL3MzX2NsbnQuYywgY2FsbCBFUlJfY2xlYXJfZXJyb3IoKSB3aGVuCiAgICAgdGhlIGhhbmRzaGFrZSBpcyBjb250aW51ZWQgYWZ0ZXIgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCk7CiAgICAgb3RoZXJ3aXNlLCBpZiBTU0xfVkVSSUZZX05PTkUgaXMgc2V0LCByZW1haW5pbmcgZXJyb3IgY29kZXMKICAgICBjYW4gbGVhZCB0byAndW5leHBsYWluYWJsZScgY29ubmVjdGlvbiBhYm9ydHMgbGF0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSB0cmFja2VkIGRvd24gYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFqb3IgRVZQIEFQSSBjaXBoZXIgcmV2aXNpb24uCiAgICAgQWRkIGhvb2tzIGZvciBleHRyYSBFVlAgZmVhdHVyZXMuIFRoaXMgYWxsb3dzIHZhcmlvdXMgY2lwaGVyCiAgICAgcGFyYW1ldGVycyB0byBiZSBzZXQgaW4gdGhlIEVWUCBpbnRlcmZhY2UuIFN1cHBvcnQgYWRkZWQgZm9yIHZhcmlhYmxlCiAgICAga2V5IGxlbmd0aCBjaXBoZXJzIHZpYSB0aGUgRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoKSBmdW5jdGlvbiBhbmQKICAgICBzZXR0aW5nIG9mIFJDMiBhbmQgUkM1IHBhcmFtZXRlcnMuCgogICAgIE1vZGlmeSBFVlBfT3BlbkluaXQoKSBhbmQgRVZQX1NlYWxJbml0KCkgdG8gY29wZSB3aXRoIHZhcmlhYmxlIGtleSBsZW5ndGgKICAgICBjaXBoZXJzLgoKICAgICBSZW1vdmUgbG90cyBvZiBkdXBsaWNhdGVkIGNvZGUgZnJvbSB0aGUgRVZQIGxpYnJhcnkuIEZvciBleGFtcGxlICpldmVyeSoKICAgICBjaXBoZXIgaW5pdCgpIGZ1bmN0aW9uIGhhbmRsZXMgdGhlICdpdicgaW4gdGhlIHNhbWUgd2F5IGFjY29yZGluZyB0byB0aGUKICAgICBjaXBoZXIgbW9kZS4gVGhleSBhbHNvIGFsbCBkbyBub3RoaW5nIGlmIHRoZSAna2V5JyBwYXJhbWV0ZXIgaXMgTlVMTCBhbmQKICAgICBmb3IgQ0ZCIGFuZCBPRkIgbW9kZXMgdGhleSB6ZXJvIGN0eC0+bnVtLgoKICAgICBOZXcgZnVuY3Rpb25hbGl0eSBhbGxvd3MgcmVtb3ZhbCBvZiBTL01JTUUgY29kZSBSQzIgaGFjay4KCiAgICAgTW9zdCBvZiB0aGUgcm91dGluZXMgaGF2ZSB0aGUgc2FtZSBmb3JtIGFuZCBzbyBjYW4gYmUgZGVjbGFyZWQgaW4gdGVybXMKICAgICBvZiBtYWNyb3MuCgogICAgIEJ5IHNoaWZ0aW5nIHRoaXMgdG8gdGhlIHRvcCBsZXZlbCBFVlBfQ2lwaGVySW5pdCgpIGl0IGNhbiBiZSByZW1vdmVkIGZyb20KICAgICBhbGwgaW5kaXZpZHVhbCBjaXBoZXJzLiBJZiB0aGUgY2lwaGVyIHdhbnRzIHRvIGhhbmRsZSBJVnMgb3Iga2V5cwogICAgIGRpZmZlcmVudGx5IGl0IGNhbiBzZXQgdGhlIEVWUF9DSVBIX0NVU1RPTV9JViBvciBFVlBfQ0lQSF9BTFdBWVNfQ0FMTF9JTklUCiAgICAgZmxhZ3MuCgogICAgIENoYW5nZSBsb3RzIG9mIGZ1bmN0aW9ucyBsaWtlIEVWUF9FbmNyeXB0VXBkYXRlKCkgdG8gbm93IHJldHVybiBhCiAgICAgdmFsdWU6IGFsdGhvdWdoIHNvZnR3YXJlIHZlcnNpb25zIG9mIHRoZSBhbGdvcml0aG1zIGNhbm5vdCBmYWlsCiAgICAgYW55IGluc3RhbGxlZCBoYXJkd2FyZSB2ZXJzaW9ucyBjYW4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHOiBJbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBpZgogICAgIHRoaXMgb3B0aW9uIGlzIHNldCwgdG9sZXJhdGUgYnJva2VuIGNsaWVudHMgdGhhdCBzZW5kIHRoZSBuZWdvdGlhdGVkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW5zdGVhZCBvZiB0aGUgcmVxdWVzdGVkIHByb3RvY29sIHZlcnNpb24KICAgICBudW1iZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2FsbCBkaF90bXBfY2IgKHNldCBieSAuLi5fVE1QX0RIX0NCKSB3aXRoIGNvcnJlY3QgJ2lzX2V4cG9ydCcgZmxhZzsKICAgICBpLmUuIG5vbi16ZXJvIGZvciBleHBvcnQgY2lwaGVyc3VpdGVzLCB6ZXJvIG90aGVyd2lzZS4KICAgICBQcmV2aW91cyB2ZXJzaW9ucyBoYWQgdGhpcyBmbGFnIGludmVydGVkLCBpbmNvbnNpc3RlbnQgd2l0aAogICAgIHJzYV90bXBfY2IgKC4uLl9UTVBfUlNBX0NCKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFtaXQgQ2hvcHJhXQoKICAqKSBBZGQgbWlzc2luZyBEU0EgbGlicmFyeSB0ZXh0IHN0cmluZy4gV29yayBhcm91bmQgZm9yIHNvbWUgSUlTCiAgICAga2V5IGZpbGVzIHdpdGggaW52YWxpZCBTRVFVRU5DRSBlbmNvZGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBkb2N1bWVudCAoZG9jL3N0YW5kYXJkcy50eHQpIHRoYXQgbGlzdCBhbGwga2luZHMgb2Ygc3RhbmRhcmRzCiAgICAgYW5kIHNvIG9uIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIE9wZW5TU0wuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRW5oYW5jZSBjX3JlaGFzaCBzY3JpcHQuIE9sZCB2ZXJzaW9uIHdvdWxkIG1pc2hhbmRsZSBjZXJ0aWZpY2F0ZXMKICAgICB3aXRoIHRoZSBzYW1lIHN1YmplY3QgbmFtZSBoYXNoIGFuZCB3b3VsZG4ndCBoYW5kbGUgQ1JMcyBhdCBhbGwuCiAgICAgQWRkZWQgLWZpbmdlcnByaW50IG9wdGlvbiB0byBjcmwgdXRpbGl0eSwgdG8gc3VwcG9ydCBuZXcgY19yZWhhc2gKICAgICBmZWF0dXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbGltaW5hdGUgbm9uLUFOU0kgZGVjbGFyYXRpb25zIGluIGNyeXB0by5oIGFuZCBzdGFjay5oLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggZm9yIFNTTCBzZXJ2ZXIgcHVycG9zZSBjaGVja2luZy4gU2VydmVyIGNoZWNraW5nIHdhcwogICAgIHJlamVjdGluZyBjZXJ0aWZpY2F0ZXMgd2hpY2ggaGFkIGV4dGVuZGVkIGtleSB1c2FnZSBwcmVzZW50CiAgICAgYnV0IG5vIHNzbCBjbGllbnQgcHVycG9zZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBSZW5lIEdyb3NzZXIgPGdyb3NzZXJAaGlzb2x1dGlvbnMuY29tPl0KCiAgKikgTWFrZSBQS0NTIzEyIGNvZGUgd29yayB3aXRoIG5vIHBhc3N3b3JkLiBUaGUgUEtDUyMxMiBzcGVjCiAgICAgaXMgYSBsaXR0bGUgdW5jbGVhciBhYm91dCBob3cgYSBibGFuayBwYXNzd29yZCBpcyBoYW5kbGVkLgogICAgIFNpbmNlIHRoZSBwYXNzd29yZCBpbiBlbmNvZGVkIGFzIGEgQk1QU3RyaW5nIHdpdGggdGVybWluYXRpbmcKICAgICBkb3VibGUgTlVMTCBhIHplcm8gbGVuZ3RoIHBhc3N3b3JkIHdvdWxkIGVuZCB1cCBhcyBqdXN0IHRoZQogICAgIGRvdWJsZSBOVUxMLiBIb3dldmVyIG5vIHBhc3N3b3JkIGF0IGFsbCBpcyBkaWZmZXJlbnQgYW5kIGlzCiAgICAgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgUEtDUyMxMiBrZXkgZ2VuZXJhdGlvbiBjb2RlLiBOUwogICAgIHRyZWF0cyBhIGJsYW5rIHBhc3N3b3JkIGFzIHplcm8gbGVuZ3RoLiBNU0lFIHRyZWF0cyBpdCBhcyBubwogICAgIHBhc3N3b3JkIG9uIGV4cG9ydDogYnV0IGl0IHdpbGwgdHJ5IGJvdGggb24gaW1wb3J0LiBXZSBub3cgZG8KICAgICB0aGUgc2FtZTogUEtDUzEyX3BhcnNlKCkgdHJpZXMgemVybyBsZW5ndGggYW5kIG5vIHBhc3N3b3JkIGlmCiAgICAgdGhlIHBhc3N3b3JkIGlzIHNldCB0byAiIiBvciBOVUxMIChOVUxMIGlzIG5vdyBhIHZhbGlkIHBhc3N3b3JkOgogICAgIGl0IHdhc24ndCBiZWZvcmUpIGFzIGRvZXMgdGhlIHBrY3MxMiBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWdmaXhlcyBpbiBhcHBzL3g1MDkuYzogQXZvaWQgYSBtZW1vcnkgbGVhazsgYW5kIGRvbid0IHVzZQogICAgIHBlcnJvciB3aGVuIFBFTV9yZWFkX2Jpb19YNTA5X1JFUSBmYWlscywgdGhlIGVycm9yIG1lc3NhZ2UgbXVzdAogICAgIGJlIG9idGFpbmVkIGZyb20gdGhlIGVycm9yIHF1ZXVlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkICd0aHJlYWRfaGFzaCcgbWVtb3J5IGxlYWsgaW4gY3J5cHRvL2Vyci9lcnIuYyBieSBmcmVlaW5nCiAgICAgaXQgaW4gRVJSX3JlbW92ZV9zdGF0ZSBpZiBhcHByb3ByaWF0ZSwgYW5kIGNoYW5nZSBFUlJfZ2V0X3N0YXRlCiAgICAgYWNjb3JkaW5nbHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zICh0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCiAgICAgdGhyZWFkX2hhc2ggaXMgbm8gbG9uZ2VyIGNvbnN0YW50IG9uY2Ugc2V0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggZm9yIGxpbnV4LWVsZiBtYWtlZmlsZS5vbmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB3aWxsIG5vdyBjYXVzZSBhIGRlZmF1bHQKICAgICBSU0FfTUVUSE9EIHRvIGJlIGNob3NlbiBpZiBvbmUgZG9lc24ndCBleGlzdCBhbHJlYWR5LgogICAgIFByZXZpb3VzbHkgdGhpcyB3YXMgb25seSBzZXQgZHVyaW5nIGEgY2FsbCB0byBSU0FfbmV3KCkKICAgICBvciBSU0FfbmV3X21ldGhvZChOVUxMKSBtZWFuaW5nIGl0IHdhcyBwb3NzaWJsZSBmb3IKICAgICBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgdG8gcmV0dXJuIE5VTEwuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkZWQgbmF0aXZlIG5hbWUgdHJhbnNsYXRpb24gdG8gdGhlIGV4aXN0aW5nIERTTyBjb2RlCiAgICAgdGhhdCB3aWxsIGNvbnZlcnQgKGlmIHRoZSBmbGFnIHRvIGRvIHNvIGlzIHNldCkgZmlsZW5hbWVzCiAgICAgdGhhdCBhcmUgc3VmZmljaWVudGx5IHNtYWxsIGFuZCBoYXZlIG5vIHBhdGggaW5mb3JtYXRpb24KICAgICBpbnRvIGEgY2Fub25pY2FsIG5hdGl2ZSBmb3JtLiBFZy4gImJsYWgiIGNvbnZlcnRlZCB0bwogICAgICJsaWJibGFoLnNvIiBvciAiYmxhaC5kbGwiIGV0Yy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBOZXcgZnVuY3Rpb24gRVJSX2Vycm9yX3N0cmluZ19uKGUsIGJ1ZiwgbGVuKSB3aGljaCBpcyBsaWtlCiAgICAgRVJSX2Vycm9yX3N0cmluZyhlLCBidWYpLCBidXQgd3JpdGVzIGF0IG1vc3QgJ2xlbicgYnl0ZXMKICAgICBpbmNsdWRpbmcgdGhlIDAgdGVybWluYXRvci4gIEZvciBFUlJfZXJyb3Jfc3RyaW5nX24sICdidWYnCiAgICAgbWF5IG5vdCBiZSBOVUxMLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+LCBCb2RvIE1vZWxsZXJdCgogICopIENPTkYgbGlicmFyeSByZXdvcmtlZCB0byBiZWNvbWUgbW9yZSBnZW5lcmFsLiAgQSBuZXcgQ09ORgogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkZXIgImNsYXNzIiBpcyBpbXBsZW1lbnRlZCBhcyB3ZWxsIGFzIGEKICAgICBuZXcgZnVuY3Rpb25zIChOQ09ORl8qLCBmb3IgIk5ldyBDT05GIikgdG8gaGFuZGxlIGl0LiAgVGhlIG5vdwogICAgIG9sZCBDT05GXyogZnVuY3Rpb25zIGFyZSBzdGlsbCB0aGVyZSwgYnV0IGFyZSByZWltcGxlbWVudGVkIHRvCiAgICAgd29yayBpbiB0ZXJtcyBvZiB0aGUgbmV3IGZ1bmN0aW9ucy4gIEFsc28sIGEgc2V0IG9mIGZ1bmN0aW9ucwogICAgIHRvIGhhbmRsZSB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGlzCiAgICAgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQogICAgIHJlYWRlciAiY2xhc3NlcyIgKEkgY2FuIGRlZmluaXRlbHkgc2VlIHNvbWV0aGluZyByZWFkaW5nIGEKICAgICBjb25maWd1cmF0aW9uIGZpbGUgaW4gWE1MIGZvcm1hdCwgZm9yIGV4YW1wbGUpLCBjYWxsZWQgX0NPTkZfKiwKICAgICBvciAidGhlIGNvbmZpZ3VyYXRpb24gc3RvcmFnZSBBUEkiLi4uCgogICAgIFRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIHJlYWRpbmcgZnVuY3Rpb25zIGFyZToKCiAgICAgICAgTkNPTkZfbmV3LCBOQ09ORl9mcmVlLCBOQ09ORl9sb2FkLCBOQ09ORl9sb2FkX2ZwLCBOQ09ORl9sb2FkX2JpbywKICAgICAgICBOQ09ORl9nZXRfc2VjdGlvbiwgTkNPTkZfZ2V0X3N0cmluZywgTkNPTkZfZ2V0X251bWJyZQoKICAgICAgICBOQ09ORl9kZWZhdWx0LCBOQ09ORl9XSU4zMgoKICAgICAgICBOQ09ORl9kdW1wX2ZwLCBOQ09ORl9kdW1wX2JpbwoKICAgICBOQ09ORl9kZWZhdWx0IGFuZCBOQ09ORl9XSU4zMiBhcmUgbWV0aG9kIChvciAiY2xhc3MiKSBjaG9vc2VycywKICAgICBOQ09ORl9uZXcgY3JlYXRlcyBhIG5ldyBDT05GIG9iamVjdC4gIFRoaXMgd29ya3MgaW4gdGhlIHNhbWUgd2F5CiAgICAgYXMgb3RoZXIgaW50ZXJmYWNlcyBpbiBPcGVuU1NMLCBsaWtlIHRoZSBCSU8gaW50ZXJmYWNlLgogICAgIE5DT05GX2R1bXBfKiBkdW1wIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsCiAgICAgd2hpY2ggaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuICBBbGwgb3RoZXIgZnVuY3Rpb25zIHRha2UgdGhlIHNhbWUKICAgICBhcmd1bWVudHMgYXMgdGhlIG9sZCBDT05GXyogZnVuY3Rpb25zIHd0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQogICAgIGZpcnN0IHRoYXQgbXVzdCBiZSBhIGBDT05GIConIGluc3RlYWQgb2YgYSBgTEhBU0ggKicuCgogICAgIFRvIG1ha2UgaXQgZWFzZXIgdG8gdXNlIHRoZSBuZXcgY2xhc3NlcyB3aXRoIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucywKICAgICB0aGUgZnVuY3Rpb24gQ09ORl9zZXRfZGVmYXVsdF9tZXRob2QgaXMgcHJvdmlkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkICctdGxzMScgb3B0aW9uIHRvICdvcGVuc3NsIGNpcGhlcnMnLCB3aGljaCB3YXMgYWxyZWFkeQogICAgIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidXQgaGFkIG5vdCBiZWVuIGltcGxlbWVudGVkLgogICAgIChUaGlzIG9wdGlvbiBpcyBub3QgeWV0IHJlYWxseSB1c2VmdWwgYmVjYXVzZSBldmVuIHRoZSBhZGRpdGlvbmFsCiAgICAgZXhwZXJpbWVudGFsIFRMUyAxLjAgY2lwaGVycyBhcmUgY3VycmVudGx5IHRyZWF0ZWQgYXMgU1NMIDMuMCBjaXBoZXJzLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsIERTTyBjb2RlIGFkZGVkIGludG8gbGliY3J5cHRvIGZvciBsZXR0aW5nIE9wZW5TU0wgKGFuZAogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb25zKSBsb2FkIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGJpbmQgdG8KICAgICB0aGVtIGluIGEgcG9ydGFibGUgd2F5LgogICAgIFtHZW9mZiBUaG9ycGUsIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIFJpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjUgYW5kIDAuOS41YSAgWzEgQXByIDIwMDBdCgogICopIE1ha2Ugc3VyZSBfbHJvdGwgYW5kIF9scm90ciBhcmUgb25seSB1c2VkIHdpdGggTVNWQy4KCiAgKikgVXNlIGxvY2sgQ1JZUFRPX0xPQ0tfUkFORCBjb3JyZWN0bHkgaW4gc3NsZWF5X3JhbmRfc3RhdHVzCiAgICAgKHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFJBTkRfc3RhdHVzKS4KCiAgKikgUmVuYW1lIG9wZW5zc2wgeDUwOSBvcHRpb24gJy1jcmxleHQnLCB3aGljaCB3YXMgYWRkZWQgaW4gMC45LjUsCiAgICAgdG8gJy1jbHJleHQnICg9IGNsZWFyIGV4dGVuc2lvbnMpLCBhcyBpbnRlbmRlZCBhbmQgZG9jdW1lbnRlZC4KICAgICBbQm9kbyBNb2VsbGVyOyBpbmNvbnNpc3RlbmN5IHBvaW50ZWQgb3V0IGJ5IE1pY2hhZWwgQXR0aWxpCiAgICAgPGF0dGlsaUBhbWF4by5jb20+XQoKICAqKSBGaXggZm9yIEhNQUMuIEl0IHdhc24ndCB6ZXJvaW5nIHRoZSByZXN0IG9mIHRoZSBibG9jayBpZiB0aGUga2V5IGxlbmd0aAogICAgIHdhcyBsYXJnZXIgdGhhbiB0aGUgTUQgYmxvY2sgc2l6ZS4gICAgICAKICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBZb3N0IFdpbGxpYW0gPFlvc3RXQHRjZS5jb20+XQoKICAqKSBNb2Rlcm5pc2UgUEtDUzEyX3BhcnNlKCkgc28gaXQgdXNlcyBTVEFDS19PRihYNTA5KSBmb3IgaXRzIGNhIGFyZ3VtZW50CiAgICAgZml4IGEgbGVhayB3aGVuIHRoZSBjYSBhcmd1bWVudCB3YXMgcGFzc2VkIGFzIE5VTEwuIFN0b3AgWDUwOV9QVUJLRVlfc2V0KCkKICAgICB1c2luZyB0aGUgcGFzc2VkIGtleTogaWYgdGhlIHBhc3NlZCBrZXkgd2FzIGEgcHJpdmF0ZSBrZXkgdGhlIHJlc3VsdAogICAgIG9mIFg1MDlfcHJpbnQoKSwgZm9yIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHByaW50IG91dCBhbGwgdGhlIHByaXZhdGUga2V5CiAgICAgY29tcG9uZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBkZXNfcXVhZF9ja3N1bSgpIGJ5dGUgb3JkZXIgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlciwgdXNpbmcgdGhlIHByb2JsZW0gZGVzY3JpcHRpb24gaW4ga3JiNC0wLjkuNywgd2hlcmUKICAgICAgdGhlIHNvbHV0aW9uIGlzIGF0dHJpYnV0ZWQgdG8gRGVycmljayBKIEJyYXNoZWFyIDxzaGFkb3dAREVNRU5USUEuT1JHPl0KCiAgKikgRml4IHNvIFZfQVNOMV9BUFBfQ0hPT1NFIHdvcmtzIGFnYWluOiBob3dldmVyIGl0cyB1c2UgaXMgc3Ryb25nbHkKICAgICBkaXNjb3VyYWdlZC4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBCcmlhbiBLb3J2ZXIgPGJyaWFua0Bjcy5zdGFuZm9yZC5lZHU+XQoKICAqKSBGb3IgZWFzaWx5IHRlc3RpbmcgaW4gc2hlbGwgc2NyaXB0cyB3aGV0aGVyIHNvbWUgY29tbWFuZAogICAgICdvcGVuc3NsIFhYWCcgZXhpc3RzLCB0aGUgbmV3IHBzZXVkby1jb21tYW5kICdvcGVuc3NsIG5vLVhYWCcKICAgICByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAgaWZmIG5vIGNvbW1hbmQgb2YgdGhlIGdpdmVuIG5hbWUgaXMgYXZhaWxhYmxlLgogICAgICduby1YWFgnIGlzIHByaW50ZWQgaW4gdGhpcyBjYXNlLCAnWFhYJyBvdGhlcndpc2UuICBJbiBib3RoIGNhc2VzLAogICAgIHRoZSBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIG5vdGhpbmcgaXMgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGFsd2F5cyBpZ25vcmVkLgoKICAgICBTaW5jZSBmb3IgZWFjaCBjaXBoZXIgdGhlcmUgaXMgYSBjb21tYW5kIG9mIHRoZSBzYW1lIG5hbWUsCiAgICAgdGhlICduby1jaXBoZXInIGNvbXBpbGF0aW9uIHN3aXRjaGVzIGNhbiBiZSB0ZXN0ZWQgdGhpcyB3YXkuCgogICAgICgnb3BlbnNzbCBuby1YWFgnIGlzIG5vdCBhYmxlIHRvIGRldGVjdCBwc2V1ZG8tY29tbWFuZHMgc3VjaAogICAgIGFzICdxdWl0JywgJ2xpc3QtWFhYLWNvbW1hbmRzJywgb3IgJ25vLVhYWCcgaXRzZWxmLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVcGRhdGUgdGVzdCBzdWl0ZSBzbyB0aGF0ICdtYWtlIHRlc3QnIHN1Y2NlZWRzIGluICduby1yc2EnIGNvbmZpZ3VyYXRpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRm9yIFNTTF9bQ1RYX11zZXRfdG1wX2RoLCBkb24ndCBjcmVhdGUgYSBESCBrZXkgaWYgU1NMX09QX1NJTkdMRV9ESF9VU0UKICAgICBpcyBzZXQ7IGl0IHdpbGwgYmUgdGhyb3duIGF3YXkgYW55d2F5IGJlY2F1c2UgZWFjaCBoYW5kc2hha2UgY3JlYXRlcwogICAgIGl0cyBvd24ga2V5LgogICAgIHNzbF9jZXJ0X2R1cCwgd2hpY2ggaXMgdXNlZCBieSBTU0xfbmV3LCBub3cgY29waWVzIERIIGtleXMgaW4gYWRkaXRpb24KICAgICB0byBwYXJhbWV0ZXJzIC0tIGluIHByZXZpb3VzIHZlcnNpb25zIChzaW5jZSBPcGVuU1NMIDAuOS4zKSB0aGUKICAgICAnZGVmYXVsdCBrZXknIGZyb20gU1NMX0NUWF9zZXRfdG1wX2RoIHdvdWxkIGFsd2F5cyBiZSBsb3N0LCBtZWFuaW5pbmcKICAgICB5b3UgZWZmZWN0aXZseSBnb3QgU1NMX09QX1NJTkdMRV9ESF9VU0Ugd2hlbiB1c2luZyB0aGlzIG1hY3JvLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBzX2NsaWVudCBvcHRpb24gLWlnbl9lb2Y6IEVPRiBhdCBzdGRpbiBpcyBpZ25vcmVkLCBhbmQKICAgICAnUScgYW5kICdSJyBsb3NlIHRoZWlyIHNwZWNpYWwgbWVhbmluZ3MgKHF1aXQvcmVuZWdvdGlhdGUpLgogICAgIFRoaXMgaXMgcGFydCBvZiB3aGF0IC1xdWlldCBkb2VzOyB1bmxpa2UgLXF1aWV0LCAtaWduX2VvZgogICAgIGRvZXMgbm90IHN1cHByZXNzIGFueSBvdXRwdXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGNvbXBhdGliaWxpdHkgb3B0aW9ucyB0byB0aGUgcHVycG9zZSBhbmQgdHJ1c3QgY29kZS4gVGhlCiAgICAgcHVycG9zZSBYNTA5X1BVUlBPU0VfQU5ZIGlzICJhbnkgcHVycG9zZSIgd2hpY2ggYXV0b21hdGljYWxseQogICAgIGFjY2VwdHMgYSBjZXJ0aWZpY2F0ZSBvciBDQSwgdGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciwKICAgICB3aXRoIGFsbCB0aGUgYXNzb2NpYXRlZCBzZWN1cml0eSBpc3N1ZXMuCgogICAgIFg1MDlfVFJVU1RfQ09NUEFUIGlzIHRoZSBvbGQgdHJ1c3QgYmVoYXZpb3VyOiBvbmx5IGFuZAogICAgIGF1dG9tYXRpY2FsbHkgdHJ1c3Qgc2VsZiBzaWduZWQgcm9vdHMgaW4gY2VydGlmaWNhdGUgc3RvcmUuIEEKICAgICBuZXcgdHJ1c3Qgc2V0dGluZyBYNTA5X1RSVVNUX0RFRkFVTFQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQKICAgICBhIHB1cnBvc2UgaGFzIG5vIGFzc29jaWF0ZWQgdHJ1c3Qgc2V0dGluZyBhbmQgaXQgc2hvdWxkIGluc3RlYWQKICAgICB1c2UgdGhlIHZhbHVlIGluIHRoZSBkZWZhdWx0IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzggRFNBIHByaXZhdGUga2V5IGNvZGUgc28gaXQgZGVjb2RlcyBrZXlzIGFnYWluCiAgICAgYW5kIGZpeCBhIG1lbW9yeSBsZWFrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHV0aWwvbWtlcnIucGwgKHdoaWNoIGltcGxlbWVudHMgJ21ha2UgZXJyb3JzJyksIHByZXNlcnZlCiAgICAgcmVhc29uIHN0cmluZ3MgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgLmMgZmlsZSwgYXMKICAgICB0aGUgZGVmYXVsdCB0byBoYXZlIG9ubHkgZG93bmNhc2UgbGV0dGVycyAoYW5kIGRpZ2l0cykgaW4KICAgICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCByZWFzb25zIGNvZGVzIGlzIG5vdCBhbHdheXMgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gRVJSX2xvYWRfRVJSX3N0cmluZ3MoKSwgYnVpbGQgYW4gRVJSX0xJQl9TWVMgZXJyb3IgcmVhc29uIHRhYmxlCiAgICAgdXNpbmcgc3RyZXJyb3IuICBQcmV2aW91c2x5LCBFUlJfcmVhc29uX2Vycm9yX3N0cmluZygpIHJldHVybmVkCiAgICAgbGlicmFyeSBuYW1lcyBhcyByZWFzb24gc3RyaW5ncyBmb3IgU1lTZXJyOyBidXQgU1lTZXJyIGlzIGEgc3BlY2lhbAogICAgIGNhc2Ugd2hlcmUgc21hbGwgbnVtYmVycyBhcmUgZXJybm8gdmFsdWVzLCBub3QgbGlicmFyeSBudW1iZXJzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAnLWRzYXBhcmFtJyBvcHRpb24gdG8gJ29wZW5zc2wgZGhwYXJhbScgYXBwbGljYXRpb24uICBUaGlzCiAgICAgY29udmVydHMgRFNBIHBhcmFtZXRlcnMgaW50byBESCBwYXJhbWV0ZXJzLiAoV2hlbiBjcmVhdGluZyBwYXJhbWV0ZXJzLAogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGlzIHVzZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgJ2xlbmd0aCcgKHJlY29tbWVuZGVkIGV4cG9uZW50IGxlbmd0aCkgaW4gQyBjb2RlIGdlbmVyYXRlZAogICAgIGJ5ICdvcGVuc3NsIGRocGFyYW0gLUMnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2V0X2xhYmVsIGluIHBlcmxhc20gd2FzIGFscmVhZHkgYmVpbmcgdXNlZAogICAgIHNvIGNvdWxkbid0IGJlIHVzZWQgYXMgYSAiZmlsZSBzY29wZSIgZmxhZy4gTW92ZWQgdG8gdGhpcmQgYXJndW1lbnQKICAgICB3aGljaCB3YXMgZnJlZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBQRU1fQVNOMV93cml0ZV9iaW8gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLCB1c2UgUkFORF9wc2V1ZG9fYnl0ZXMKICAgICBpbnN0ZWFkIG9mIFJBTkRfYnl0ZXMgZm9yIGVuY3J5cHRpb24gSVZzIGFuZCBzYWx0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlIFJBTkRfc3RhdHVzKCkgaW50byBSQU5EX01FVEhPRCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZwogICAgIGl0IG9ubHkgZm9yIG1kX3JhbmQuYyAgT3RoZXJ3aXNlIHJlcGxhY2luZyB0aGUgUFJORyBieSBjYWxsaW5nCiAgICAgUkFORF9zZXRfcmFuZF9tZXRob2Qgd291bGQgYmUgaW1wb3NzaWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBsZXQgRFNBX2dlbmVyYXRlX2tleSgpIGVudGVyIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlIHJhbmRvbQogICAgIG51bWJlciBnZW5lcmF0aW9uIGZhaWxzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAncmFuZCcgYXBwbGljYXRpb24gZm9yIGNyZWF0aW5nIHBzZXVkby1yYW5kb20gb3V0cHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBmb3IgTGludXgvSUE2NAogICAgIFtSb2xmIEhhYmVycmVja2VyIDxyb2xmQHN1c2UuZGU+XQoKICAqKSBBc3NlbWJsZXIgbW9kdWxlIHN1cHBvcnQgZm9yIE1pbmd3MzIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIEhQVVggKGluIHNobGliLykuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+IGFuZCBBbm9ueW1vdXNdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFNvbGFyaXMgZ2NjLgogICAgIFtMdXR6IEJlaG5rZSA8YmVobmtlQHRydXN0Y2VudGVyLmRlPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjQgYW5kIDAuOS41ICBbMjggRmViIDIwMDBdCgogICopIFBLQ1M3X2VuY3J5cHQoKSB3YXMgYWRkaW5nIHRleHQgTUlNRSBoZWFkZXJzIHR3aWNlIGJlY2F1c2UgdGhleQogICAgIHdlcmUgYWRkZWQgbWFudWFsbHkgYW5kIGJ5IFNNSU1FX2NybGZfY29weSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGJudGVzdC5jIGRvbid0IGNhbGwgQk5fcmFuZCB3aXRoIHplcm8gYml0cyBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBBbmRyZXcgVy4gR3JheSA8YWdyYXlAaWNvbnNpbmMuY29tPl0KCiAgKikgQk5fbXVsIGJ1Z2ZpeDogSW4gYm5fbXVsX3BhcnRfcmVjdXJzaW9uKCkgb25seSB0aGUgYT5hW25dICYmIGI+YltuXQogICAgIGNhc2Ugd2FzIGltcGxlbWVudGVkLiBUaGlzIGNhdXNlZCBCTl9kaXZfcmVjcCgpIHRvIGZhaWwgb2NjYXNpb25hbGx5LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBzZXRfbGFiZWwoKSBpbiB0aGUgcGVybAogICAgIGFzc2VtYmx5IGxhbmd1YWdlIGJ1aWxkZXIuIElmIHRoaXMgYXJndW1lbnQgZXhpc3RzIGFuZCBpcyBzZXQKICAgICB0byAxIGl0IHNpZ25hbHMgdGhhdCB0aGUgYXNzZW1ibGVyIHNob3VsZCB1c2UgYSBzeW1ib2wgd2hvc2UgCiAgICAgc2NvcGUgaXMgdGhlIGVudGlyZSBmaWxlLCBub3QganVzdCB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhpcwogICAgIGlzIG5lZWRlZCB3aXRoIE1BU00gd2hpY2ggdXNlcyB0aGUgZm9ybWF0IGxhYmVsOjogZm9yIHRoaXMgc2NvcGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgUGV0ZXIgUnVuZXN0aWcgPHBldGVyQHJ1bmVzdGlnLmNvbT5dCgogICopIENoYW5nZSB0aGUgQVNOMSB0eXBlcyBzbyB0aGV5IGFyZSB0eXBlZGVmcyBieSBkZWZhdWx0LiBCZWZvcmUKICAgICBhbG1vc3QgYWxsIHR5cGVzIHdlcmUgI2RlZmluZSdkIHRvIEFTTjFfU1RSSU5HIHdoaWNoIHdhcyBjYXVzaW5nCiAgICAgU1RBQ0tfT0YoKSBwcm9ibGVtczogeW91IGNvdWxkbid0IGRlY2xhcmUgU1RBQ0tfT0YoQVNOMV9VVEY4U1RSSU5HKQogICAgIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBuYW1lcyBvZiBuZXcgZnVuY3Rpb25zIHRvIHRoZSBuZXcgZ2V0MS9nZXQwIG5hbWluZwogICAgIGNvbnZlbnRpb246IEFmdGVyICdnZXQxJywgdGhlIGNhbGxlciBvd25zIGEgcmVmZXJlbmNlIGNvdW50CiAgICAgYW5kIGhhcyB0byBjYWxsIC4uLl9mcmVlOyAnZ2V0MCcgcmV0dXJucyBhIHBvaW50ZXIgdG8gc29tZQogICAgIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgaW5jcmVtZW50aW5nIHJlZmVyZW5jZSBjb3VudGVycy4KICAgICAoU29tZSBvZiB0aGUgZXhpc3RpbmcgJ2dldCcgZnVuY3Rpb25zIGluY3JlbWVudCBhIHJlZmVyZW5jZQogICAgIGNvdW50ZXIsIHNvbWUgZG9uJ3QuKQogICAgIFNpbWlsYXJseSwgJ3NldDEnIGFuZCAnYWRkMScgZnVuY3Rpb25zIGluY3JlYXNlIHJlZmVyZW5jZQogICAgIGNvdW50ZXJzIG9yIGR1cGxpY2F0ZSBvYmplY3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgb2YgdGVtcCBSU0Ega2V5IGdlbmVyYXRpb24gZmFpbHVyZToKICAgICB0aGUgY29kZSB1c2VkIHRvIGFzc3VtZSBpdCBhbHdheXMgd29ya2VkIGFuZCBjcmFzaGVkIG9uIGZhaWx1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBwcm9ibGVtIGluIEJJT19wcmludGYoKS4KICAgICBbVWxmIE32bGxlciwgdXNpbmcgcHVibGljIGRvbWFpbiBjb2RlIGJ5IFBhdHJpY2sgUG93ZWxsOyBwcm9ibGVtCiAgICAgIHBvaW50ZWQgb3V0IGJ5IERhdmlkIFNhY2VyZG90ZSA8ZGFzMzNAY29ybmVsbC5lZHU+XQoKICAqKSBTdXBwb3J0IEVHRCA8aHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLz4uICBOZXcgZnVuY3Rpb25zCiAgICAgUkFORF9lZ2QoKSBhbmQgUkFORF9zdGF0dXMoKS4gIEluIHRoZSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24sCiAgICAgdGhlIEVHRCBzb2NrZXQgY2FuIGJlIHNwZWNpZmllZCBsaWtlIGEgc2VlZCBmaWxlIHVzaW5nIFJBTkRGSUxFCiAgICAgb3IgLXJhbmQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFsbG93IHRoZSBzdHJpbmcgQ0VSVElGSUNBVEUgdG8gYmUgdG9sZXJhdGVkIGluIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFNvbWUgQ0FzIChlLmcuIFZlcmlzaWduKSBkaXN0cmlidXRlIGNlcnRpZmljYXRlcyBpbiB0aGlzIGZvcm0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHRoZSBTU0xfQUxMT1dfQURIIGNvbXBpbGUgb3B0aW9uIGFuZCBzZXQgdGhlIGRlZmF1bHQgY2lwaGVyCiAgICAgbGlzdCB0byBleGNsdWRlIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCBubyBzcGVjaWFsIGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIGlzIG5lZWRlZCB0byB1c2UgYW5vbnltb3VzIERIOiBpdCBqdXN0IG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZQogICAgIGNpcGhlciBsaXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgRVZQX01EX0NUWF90eXBlIG1hY3JvIHNvIGl0cyBtZWFuaW5nIGNvbnNpc3RlbnQgd2l0aAogICAgIEVWUF9NRF90eXBlLiBUaGUgb2xkIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIGEgbmV3IG1hY3JvIGNhbGxlZAogICAgIEVWUF9NRF9tZCgpLiBDaGFuZ2UgY29kZSB0aGF0IHVzZXMgaXQgYW5kIHVwZGF0ZSBkb2NzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC4uLl9jdHJsIGZ1bmN0aW9ucyBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIC4uLl9jYWxsYmFja19jdHJsIGZ1bmN0aW9ucwogICAgIHdoZXJlIHRoZSAndm9pZCAqJyBhcmd1bWVudCBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXJndW1lbnQuCiAgICAgUHJldmlvdXNseSAndm9pZCAqJyB3YXMgYWJ1c2VkIHRvIHBvaW50IHRvIGZ1bmN0aW9ucywgd2hpY2ggd29ya3Mgb24KICAgICBtYW55IHBsYXRmb3JtcywgYnV0IGlzIG5vdCBjb3JyZWN0LiAgQXMgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c3VhbGx5CiAgICAgY2FsbGVkIGJ5IG1hY3JvcyBkZWZpbmVkIGluIE9wZW5TU0wgaGVhZGVyIGZpbGVzLCBtb3N0IHNvdXJjZSBjb2RlCiAgICAgc2hvdWxkIHdvcmsgd2l0aG91dCBjaGFuZ2VzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+ICh3aGljaCBpcyBjcmVhdGVkIGJ5IENvbmZpZ3VyZSkgbm93IGNvbnRhaW5zCiAgICAgc2VjdGlvbnMgd2l0aCBpbmZvcm1hdGlvbiBvbiAtRC4uLiBjb21waWxlciBzd2l0Y2hlcyB1c2VkIGZvcgogICAgIGNvbXBpbGluZyB0aGUgbGlicmFyeSBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gc2VlIHRoZW0uICBUbyBlbmFibGUKICAgICBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGEgcHJlLXByb2Nlc3NvciBzeW1ib2wgT1BFTlNTTF8uLi5fREVGSU5FUwogICAgIG11c3QgYmUgZGVmaW5lZC4gIEUuZy4sCiAgICAgICAgI2RlZmluZSBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCiAgICAgICAgI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KICAgICBkZWZpbmVzIGFsbCBwZXJ0aW5lbnQgTk9fPGFsZ28+IHN5bWJvbHMsIHN1Y2ggYXMgTk9fSURFQSwgTk9fUlNBLCBldGMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgVWxmIGFuZCBCb2RvIE32bGxlcl0KCiAgKikgQnVnZml4OiBUb2xlcmF0ZSBmcmFnbWVudGF0aW9uIGFuZCBpbnRlcmxlYXZpbmcgaW4gdGhlIFNTTCAzL1RMUwogICAgIHJlY29yZCBsYXllci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlICdvdGhlcicgdHlwZSBpbiBjZXJ0aWZpY2F0ZSBhdXggaW5mbyB0byBhIFNUQUNLX09GCiAgICAgWDUwOV9BTEdPUi4gQWx0aG91Z2ggbm90IGFuIEFsZ29yaXRobUlkZW50aWZpZXIgYXMgc3VjaCBpdCBoYXMKICAgICB0aGUgcmVxdWlyZWQgQVNOMSBmb3JtYXQ6IGFyYml0cmFyeSB0eXBlcyBkZXRlcm1pbmVkIGJ5IGFuIE9JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBQRU1fd3JpdGVfWDUwOV9SRVFfTkVXKCkgZnVuY3Rpb25zIGFuZCBhIGNvbW1hbmQgbGluZQogICAgIGFyZ3VtZW50IHRvICdyZXEnLiBUaGlzIGlzIG5vdCBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyBuZXdlciBvcgogICAgIGJldHRlciB0aGFuIG90aGVycyBpdCBqdXN0IHVzZXMgdGhlIHdvcmsgJ05FVycgaW4gdGhlIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBoZWFkZXIgbGluZXMuIFNvbWUgc29mdHdhcmUgbmVlZHMgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXNlIHBhc3N3b3JkIGNvbW1hbmQgbGluZSBhcmd1bWVudHM6IG5vdyBwYXNzd29yZHMgY2FuIGJlCiAgICAgb2J0YWluZWQgZnJvbSB2YXJpb3VzIHNvdXJjZXMuIERlbGV0ZSB0aGUgUEVNX2NiIGZ1bmN0aW9uIGFuZCBtYWtlCiAgICAgaXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyOiBpLmUuIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMIGFuZCB0aGUKICAgICB1c3JkYXRhIGFyZ3VtZW50IGlzIG5vdCBOVUxMIGludGVycHJldCBpdCBhcyBhIG51bGwgdGVybWluYXRlZCBwYXNzCiAgICAgcGhyYXNlLiBJZiB1c3JkYXRhIGFuZCB0aGUgY2FsbGJhY2sgYXJlIE5VTEwgdGhlbiB0aGUgcGFzcyBwaHJhc2UKICAgICBpcyBwcm9tcHRlZCBmb3IgYXMgdXN1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBDb21wYXEgQXRhbGxhIGNyeXB0byBhY2NlbGVyYXRvci4gSWYgaXQgaXMgaW5zdGFsbGVkLAogICAgIHRoZSBzdXBwb3J0IGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZC4gVGhlIHJlc3VsdGluZyBiaW5hcmllcyB3aWxsCiAgICAgYXV0b2RldGVjdCB0aGUgY2FyZCBhbmQgdXNlIGl0IGlmIHByZXNlbnQuCiAgICAgW0JlbiBMYXVyaWUgYW5kIENvbXBhcSBJbmMuXQoKICAqKSBXb3JrIGFyb3VuZCBmb3IgTmV0c2NhcGUgaGFuZyBidWcuIFRoaXMgc2VuZHMgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFuZCBzZXJ2ZXIgZG9uZSBpbiBvbmUgcmVjb3JkLiBTaW5jZSB0aGlzIGlzIHBlcmZlY3RseSBsZWdhbCBpbiB0aGUKICAgICBTU0wvVExTIHByb3RvY29sIGl0IGlzbid0IGEgImJ1ZyIgb3B0aW9uIGFuZCBpcyBvbiBieSBkZWZhdWx0LiBTZWUKICAgICB0aGUgYnVncy9TU0x2MyBlbnRyeSBmb3IgbW9yZSBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhQLVVYIHR1bmUtdXA6IG5ldyB1bmlmaWVkIGNvbmZpZ3MsIEhQIEMgY29tcGlsZXIgYnVnIHdvcmthcm91bmQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtcmFuZCBhcmd1bWVudCB0byBzbWltZSBhbmQgcGtjczEyIGFwcGxpY2F0aW9ucyBhbmQgcmVhZC93cml0ZQogICAgIG9mIHNlZWQgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJ3Bhc3N3ZCcgdG9vbCBmb3IgY3J5cHQoMykgYW5kIGFwcjEgcGFzc3dvcmQgaGFzaGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBjb21tYW5kIGxpbmUgcGFzc3dvcmQgb3B0aW9ucyB0byB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXZfcmVjcCgpIGZvciBudW1lcmF0b3JzIHdpdGggYW4gZXZlbiBudW1iZXIgb2YKICAgICBiaXRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNb3JlIHRlc3RzIGluIGJudGVzdC5jLCBhbmQgY2hhbmdlZCB0ZXN0X2JuIG91dHB1dC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgLi9jb25maWcgcmVjb2duaXplcyBNYWNPUyBYIG5vdy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2KCkgd2hlbiB0aGUgZmlyc3Qgd29yZHMgb2YgbnVtIGFuZCBkaXZzb3IgYXJlCiAgICAgZXF1YWwgKGl0IGdhdmUgd3JvbmcgcmVzdWx0cyBpZiAocmVtPShuMS1xKmQwKSZCTl9NQVNLMikgPCBkMCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB2YXJpb3VzIGJyb2tlbiBQS0NTIzggZm9ybWF0cywgYW5kIGNvbW1hbmQgbGluZQogICAgIG9wdGlvbnMgdG8gcHJvZHVjZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgQk5fQ1RYX3N0YXJ0KCksIEJOX0NUWF9nZXQoKSBhbmQgQlRfQ1RYX2VuZCgpIHRvCiAgICAgZ2V0IHRlbXBvcmFyeSBCSUdOVU1zIGZyb20gYSBCTl9DVFguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvcnJlY3QgcmV0dXJuIHZhbHVlcyBpbiBCTl9tb2RfZXhwX21vbnQoKSBhbmQgQk5fbW9kX2V4cDJfbW9udCgpCiAgICAgZm9yIHAgPT0gMC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBTU0xlYXlfYWRkX2FsbF8qKCkgZnVuY3Rpb25zIHRvIE9wZW5TU0xfYWRkX2FsbF8qKCkgYW5kCiAgICAgaW5jbHVkZSBhICNkZWZpbmUgZnJvbSB0aGUgb2xkIG5hbWUgdG8gdGhlIG5ldy4gVGhlIG9yaWdpbmFsIGludGVudAogICAgIHdhcyB0aGF0IHN0YXRpY2FsbHkgbGlua2VkIGJpbmFyaWVzIGNvdWxkIGZvciBleGFtcGxlIGp1c3QgY2FsbAogICAgIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB0byBqdXN0IGFkZCBjaXBoZXJzIHRvIHRoZSB0YWJsZSBhbmQgbm90CiAgICAgbGluayB3aXRoIGRpZ2VzdHMuIFRoaXMgbmV2ZXIgd29ya2VkIGJlY2F5c2UgU1NMZWF5X2FkZF9hbGxfZGlnZXN0cygpCiAgICAgYW5kIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB3ZXJlIGluIHRoZSBzYW1lIHNvdXJjZSBmaWxlIHNvIGNhbGxpbmcKICAgICBvbmUgd291bGQgbGluayB3aXRoIHRoZSBvdGhlci4gVGhleSBhcmUgbm93IGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgLW5vdGV4dCBvcHRpb24gdG8gJ2NhJyBhbmQgYSAtcHVia2V5IG9wdGlvbiB0byAnc3BrYWMnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBhIGxlc3MgdW51c3VhbCBmb3JtIG9mIHRoZSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QgKGl0IHVzZWQKICAgICBhIGJpbmFyeSBhbGdvcml0aG0gZm9yIGV4cG9uZW50aWF0aW9uIGludGVncmF0ZWQgaW50byB0aGUgTWlsbGVyLVJhYmluCiAgICAgbG9vcCwgb3VyIHN0YW5kYXJkIG1vZGV4cCBhbGdvcml0aG1zIGFyZSBmYXN0ZXIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgZm9yIHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCBjb21wbGV0ZWQuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPl0KCiAgKikgU291cmNlIGNvZGUgY2xlYW51cHM6IHVzZSBjb25zdCB3aGVyZSBhcHByb3ByaWF0ZSwgZWxpbWluYXRlIGNhc3RzLAogICAgIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICogaW4gbGhhc2guCiAgICAgW1VsZiBN9mxsZXJdIAoKICAqKSBCdWdmaXg6IHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlIHdhcyBub3QgcmVzdGFydGFibGUKICAgICAodGhlIHN0YXRlIHdhcyBub3QgY2hhbmdlZCB0byBTU0wzX1NUX1NXX0tFWV9FWENIX0IsIGFuZCBiZWNhdXNlIG9mCiAgICAgdGhpcyB0aGUgc2VydmVyIGNvdWxkIG92ZXJ3cml0ZSBlcGhlbWVyYWwga2V5cyB0aGF0IHRoZSBjbGllbnQKICAgICBoYXMgYWxyZWFkeSBzZWVuKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIERTQV9pc19wcmltZSBpbnRvIGEgbWFjcm8gdGhhdCBjYWxscyBCTl9pc19wcmltZSwKICAgICB1c2luZyA1MCBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdC4KCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgbm93IHVzZXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgKHdpdGggNTAKICAgICBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhcyByZXF1aXJlZCBieSB0aGUgYXBwZW5kaXgKICAgICB0byBGSVBTIFBVQiAxODZbLTFdKSBpbnN0ZWFkIG9mIERTQV9pc19wcmltZS4KICAgICBBcyBCTl9pc19wcmltZV9mYXN0dGVzdCBpbmNsdWRlcyB0cmlhbCBkaXZpc2lvbiwgRFNBIHBhcmFtZXRlcgogICAgIGdlbmVyYXRpb24gYmVjb21lcyBtdWNoIGZhc3Rlci4KCiAgICAgVGhpcyBpbXBsaWVzIGEgY2hhbmdlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGluIERTQV9pc19wcmltZQogICAgIGFuZCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlCiAgICAgZm9yIGVhY2ggcG9zaXRpdmUgd2l0bmVzcyBpbiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QsIG5vdCBqdXN0CiAgICAgb2NjYXNpb25hbGx5IGluIHRoZSBpbm5lciBsb29wOyBhbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlCiAgICAgY2FsbGJhY2sgZnVuY3Rpb24gbm93IHByb3ZpZGUgYW4gaXRlcmF0aW9uIGNvdW50IGZvciB0aGUgb3V0ZXIKICAgICBsb29wIHJhdGhlciB0aGFuIGZvciB0aGUgY3VycmVudCBpbnZvY2F0aW9uIG9mIHRoZSBpbm5lciBsb29wLgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGFkZGl0aW9uYWxseSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sKICAgICBmdW5jdGlvbiB3aXRoIGFuICdpdGVyYXRpb24gY291bnQnIG9mIC0xLCBtZWFuaW5nIHRoYXQgYQogICAgIGNhbmRpZGF0ZSBoYXMgcGFzc2VkIHRoZSB0cmlhbCBkaXZpc2lvbiB0ZXN0ICh3aGVuIHEgaXMgZ2VuZXJhdGVkIAogICAgIGZyb20gYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgc2VlZCwgdHJpYWwgZGl2aXNpb24gaXMgc2tpcHBlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IHRoYXQgb3B0aW9uYWxseSBkb2VzIHRyaWFsCiAgICAgZGl2aXNpb24gYmVmb3JlIHN0YXJ0aW5nIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhbmQgaGFzCiAgICAgYW4gYWRkaXRpb25hbCBCTl9DVFggKiBhcmd1bWVudCAod2hlcmVhcyBCTl9pc19wcmltZSBhbHdheXMKICAgICBoYXMgdG8gYWxsb2NhdGUgYXQgbGVhc3Qgb25lIEJOX0NUWCkuCiAgICAgJ2NhbGxiYWNrKDEsIC0xLCBjYl9hcmcpJyBpcyBjYWxsZWQgd2hlbiBhIG51bWJlciBoYXMgcGFzc2VkIHRoZQogICAgIHRyaWFsIGRpdmlzaW9uIHN0YWdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgYnVnIGluIENSTCBlbmNvZGluZy4gVGhlIHZhbGlkaXR5IGRhdGVzIHdlcmVuJ3QgYmVpbmcgaGFuZGxlZAogICAgIGFzIEFTTjFfVElNRS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXBrY3MxMiBvcHRpb24gdG8gQ0EucGwgc2NyaXB0IHRvIHdyaXRlIG91dCBhIFBLQ1MjMTIgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fcHNldWRvX3JhbmQoKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQk5fbW9kX211bF9tb250Z29tZXJ5KCk6IHJlcGxhY2UgdGhlIGJyb2tlbiAoYW5kIHVucmVhZGFibGUpCiAgICAgYmlnbnVtIHZlcnNpb24gb2YgQk5fZnJvbV9tb250Z29tZXJ5KCkgd2l0aCB0aGUgd29ya2luZyBjb2RlIGZyb20KICAgICBTU0xlYXkgMC45LjAgKHRoZSB3b3JkIGJhc2VkIHZlcnNpb24gaXMgZmFzdGVyIGFueXdheSksIGFuZCBjbGVhbiB1cAogICAgIHRoZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBzMl9jbG50LmMgKGZ1bmN0aW9uIGdldF9zZXJ2ZXJfaGVsbG8pIHRoYXQKICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIFNTTF9TRVNTSU9OIGRhdGEgc3RydWN0dXJlIGluCiAgICAgU1NMMiBjbGllbnRzIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHJldHVybiB2YWx1ZSBvZiBSQU5EX2xvYWRfZmlsZSgpIG5vIGxvbmdlciBjb3VudHMgYnl0ZXMgb2J0YWluZWQKICAgICBieSBzdGF0KCkuICBSQU5EX2xvYWRfZmlsZSguLi4sIC0xKSBpcyBuZXcgYW5kIHVzZXMgdGhlIGNvbXBsZXRlIGZpbGUKICAgICB0byBzZWVkIHRoZSBQUk5HIChwcmV2aW91c2x5IGFuIGV4cGxpY2l0IGJ5dGUgY291bnQgd2FzIHJlcXVpcmVkKS4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIENsZWFuIHVwIENSWVBUT19FWF9EQVRBIGZ1bmN0aW9ucywgc29tZSBvZiB0aGVzZSBkaWRuJ3QgaGF2ZSBwcm90b3R5cGVzCiAgICAgdXNlZCAoY2hhciAqKSBpbnN0ZWFkIG9mICh2b2lkICopIGFuZCBoYWQgY2FzdHMgYWxsIG92ZXIgdGhlIHBsYWNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgQk5fZ2VuZXJhdGVfcHJpbWUoKSByZXR1cm4gTlVMTCBvbiBlcnJvciBpZiByZXQhPU5VTEwuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFJldGFpbiBzb3VyY2UgY29kZSBjb21wYXRpYmlsaXR5IGZvciBCTl9wcmltZV9jaGVja3MgbWFjcm86CiAgICAgQk5faXNfcHJpbWUoLi4uLCBCTl9wcmltZV9jaGVja3MsIC4uLikgbm93IHVzZXMKICAgICBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YKICAgICBSYWJpbi1NaWxsZXIgaXRlcmF0aW9ucy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRGlmZmllLUhlbGxtYW4gdXNlcyAic2FmZSIgcHJpbWVzOiBESF9jaGVjaygpIHJldHVybiBjb2RlIHJlbmFtZWQgdG8KICAgICBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FLgogICAgIChDaGVjayBpZiB0aGlzIGlzIHRydWU/IE9wZW5QR1AgY2FsbHMgdGhlbSAic3Ryb25nIi4pCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1lcmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mICJkaCIgYW5kICJnZW5kaCIgcHJvZ3JhbXMgaW50byBhIG5ldyBwcm9ncmFtCiAgICAgImRocGFyYW0iLiBUaGUgb2xkIHByb2dyYW1zIGFyZSByZXRhaW5lZCBmb3Igbm93IGJ1dCB3aWxsIGhhbmRsZSBESCBrZXlzCiAgICAgKGluc3RlYWQgb2YgcGFyYW1ldGVycykgaW4gZnV0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIGNpcGhlcnMsIHNfc2VydmVyIGFuZCBzX2NsaWVudCBwcm9ncmFtcyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcwogICAgIHdoZW4gYSBuZXcgY2lwaGVyIGxpc3QgaXMgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIFNTTC9UTFMgY2lwaGVyIG1lY2hhbmlzbSB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBUTFMgNTZiaXQKICAgICBjaXBoZXJzLiBCZWZvcmUgd2hlbiB0aGUgNTZiaXQgY2lwaGVycyB3ZXJlIGVuYWJsZWQgdGhlIHNvcnRpbmcgd2FzCiAgICAgd3JvbmcuCgogICAgIFRoZSBzeW50YXggZm9yIHRoZSBjaXBoZXIgc29ydGluZyBoYXMgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IHNvcnRpbmcgYnkKICAgICBjaXBoZXItc3RyZW5ndGggKHVzaW5nIHRoZSBzdHJlbmd0aF9iaXRzIGhhcmQgY29kZWQgaW4gdGhlIHRhYmxlcykuCiAgICAgVGhlIG5ldyBjb21tYW5kIGlzICJAU1RSRU5HVEgiIChzZWUgYWxzbyBkb2MvYXBwcy9jaXBoZXJzLnBvZCkuCgogICAgIEZpeCBhIGJ1ZyBpbiB0aGUgY2lwaGVyLWNvbW1hbmQgcGFyc2VyOiB3aGVuIHN1cHBseWluZyBhIGNpcGhlciBjb21tYW5kCiAgICAgc3RyaW5nIHdpdGggYW4gInVuZGVmaW5lZCIgc3ltYm9sIChuZWl0aGVyIGNvbW1hbmQgbm9yIGFscGhhbnVtZXJpYwogICAgIFtBLVphLXowLTldLCBzc2xfc2V0X2NpcGhlcl9saXN0IHVzZWQgdG8gaGFuZyBpbiBhbiBlbmRsZXNzIGxvb3AuIE5vdwogICAgIGFuIGVycm9yIGlzIGZsYWdnZWQuCgogICAgIER1ZSB0byB0aGUgc3RyZW5ndGgtc29ydGluZyBleHRlbnNpb24sIHRoZSBjb2RlIG9mIHRoZQogICAgIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBmdW5jdGlvbiB3YXMgY29tcGxldGVseSByZWFycmFuZ2VkLiBJIGhvcGUgdGhhdAogICAgIHRoZSByZWFkYWJpbGl0eSB3YXMgYWxzbyBpbmNyZWFzZWQgOi0pCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBNaW5vciBjaGFuZ2UgdG8gJ3g1MDknIHV0aWxpdHkuIFRoZSAtQ0FjcmVhdGVzZXJpYWwgb3B0aW9uIG5vdyB1c2VzIDEKICAgICBmb3IgdGhlIGZpcnN0IHNlcmlhbCBudW1iZXIgYW5kIHBsYWNlcyAyIGluIHRoZSBzZXJpYWwgbnVtYmVyIGZpbGUuIFRoaXMKICAgICBhdm9pZHMgcHJvYmxlbXMgd2hlbiB0aGUgcm9vdCBDQSBpcyBjcmVhdGVkIHdpdGggc2VyaWFsIG51bWJlciB6ZXJvIGFuZAogICAgIHRoZSBmaXJzdCB1c2VyIGNlcnRpZmljYXRlIGhhcyB0aGUgc2FtZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcgogICAgIGFzIHRoZSByb290IENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcywgY2hhbmdlIHRoZSAncmVxJyBwcm9ncmFtIHNvIGl0IHVzZXMKICAgICB0aGUgbmV3IGNvZGUuIEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0dWZmLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLiBUaGVzZSBoYXZlIGJlZW4gcmVuYW1lZCBmcm9tCiAgICAgWDUwOV8qKCkgdG8gWDUwOWF0XyooKSBvbiB0aGUgZ3JvdW5kcyB0aGF0IHRoZXkgZG9uJ3QgaGFuZGxlIFg1MDkKICAgICBzdHJ1Y3R1cmVzIGFuZCBiZWhhdmUgaW4gYW4gYW5hbGFnb3VzIHdheSB0byB0aGUgWDUwOXYzIGZ1bmN0aW9uczoKICAgICB0aGV5IHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYnV0IHdyYXBwZXIgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkCiAgICAgaW5zdGVhZC4KCiAgICAgU28gd2UgYWxzbyBub3cgaGF2ZSBzb21lIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgWDUwOWF0IGZ1bmN0aW9ucwogICAgIHdoZW4gcGFzc2VkIGNlcnRpZmljYXRlIHJlcXVlc3RzLiAoVE8gRE86IHNpbWlsYXIgdGhpbmdzIGNhbiBiZSBkb25lIHdpdGgKICAgICBQS0NTIzcgc2lnbmVkIGFuZCB1bnNpZ25lZCBhdHRyaWJ1dGVzLCBQS0NTIzEyIGF0dHJpYnV0ZXMgYW5kIGEgZmV3IG90aGVyCiAgICAgdGhpbmdzLiBTb21lIG9mIHRoZXNlIG5lZWQgc29tZSBkMmkgb3IgaTJkIGFuZCBwcmludCBmdW5jdGlvbmFsaXR5CiAgICAgYmVjYXVzZSB0aGV5IGhhbmRsZSBtb3JlIGNvbXBsZXggc3RydWN0dXJlcy4pCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1pc3NpbmcgI2lmbmRlZnMgdGhhdCBjYXVzZWQgbWlzc2luZyBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgbGlic3NsCiAgICAgYXMgYSBzaGFyZWQgbGlicmFyeSB3aXRob3V0IFJTQS4gIFVzZSAjaWZuZGVmIE5PX1NTTDIgaW5zdGVhZCBvZgogICAgIE5PX1JTQSBpbiBzc2wvczIqLmMuIAogICAgIFtLcmlzIEtlbm5hd2F5IDxrcmlzQGh1Yi5mcmVlYnNkLm9yZz4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFByZWNhdXRpb25zIGFnYWluc3QgdXNpbmcgdGhlIFBSTkcgdW5pbml0aWFsaXplZDogUkFORF9ieXRlcygpIG5vdwogICAgIGhhcyBhIHJldHVybiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhlIHF1YWxpdHkgb2YgdGhlIHJhbmRvbSBkYXRhCiAgICAgKDEgPSBvaywgMCA9IG5vdCBzZWVkZWQpLiAgQWxzbyBhbiBlcnJvciBpcyByZWNvcmRlZCBvbiB0aGUgdGhyZWFkJ3MKICAgICBlcnJvciBxdWV1ZS4gTmV3IGZ1bmN0aW9uIFJBTkRfcHNldWRvX2J5dGVzKCkgZ2VuZXJhdGVzIG91dHB1dCB0aGF0IGlzCiAgICAgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYnV0IG5vdCB1bnByZWRpY3RhYmxlLiBSQU5EX2FkZCBpcyBsaWtlCiAgICAgUkFORF9zZWVkLCBidXQgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgZm9yIGFuIGVudHJvcHkgZXN0aW1hdGUKICAgICAoUkFORF9zZWVkIGFsd2F5cyBhc3N1bWVzIGZ1bGwgZW50cm9weSkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvIG1vcmUgaXRlcmF0aW9ucyBvZiBSYWJpbi1NaWxsZXIgcHJvYmFibGUgcHJpbWUgdGVzdCAoc3BlY2lmaWNhbGx5LAogICAgIDMgZm9yIDEwMjQtYml0IHByaW1lcywgNiBmb3IgNTEyLWJpdCBwcmltZXMsIDEyIGZvciAyNTYtYml0IHByaW1lcwogICAgIGluc3RlYWQgb2Ygb25seSAyIGZvciBhbGwgbGVuZ3Roczsgc2VlIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSBkZWZpbml0aW9uCiAgICAgaW4gY3J5cHRvL2JuL2JuX3ByaW1lLmMgZm9yIHRoZSBjb21wbGV0ZSB0YWJsZSkuICBUaGlzIGd1YXJhbnRlZXMgYQogICAgIGZhbHNlLXBvc2l0aXZlIHJhdGUgb2YgYXQgbW9zdCAyXi04MCBmb3IgcmFuZG9tIGlucHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgc3NsM19yZWFkX24gKHNzbC9zM19wa3QuYykgYXZvaWRpbmcgYSBjb3VwbGUgb2YgYnVncy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DVFhfcmdldF9jaGFpbigpIChyZW5hbWVkIHRvIFg1MDlfQ1RYX2dldDFfY2hhaW4KICAgICBpbiB0aGUgMC45LjUgcmVsZWFzZSksIHRoaXMgcmV0dXJucyB0aGUgY2hhaW4KICAgICBmcm9tIGFuIFg1MDlfQ1RYIHN0cnVjdHVyZSB3aXRoIGEgZHVwIG9mIHRoZSBzdGFjayBhbmQgYWxsCiAgICAgdGhlIFg1MDkgcmVmZXJlbmNlIGNvdW50cyB1cHBlZDogc28gdGhlIHN0YWNrIHdpbGwgZXhpc3QKICAgICBhZnRlciBYNTA5X0NUWF9jbGVhbnVwKCkgaGFzIGJlZW4gY2FsbGVkLiBNb2RpZnkgcGtjczEyLmMKICAgICB0byB1c2UgdGhpcy4KCiAgICAgQWxzbyBtYWtlIFNTTF9TRVNTSU9OX3ByaW50KCkgcHJpbnQgb3V0IHRoZSB2ZXJpZnkgcmV0dXJuCiAgICAgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWFucGFnZSBmb3IgdGhlIHBrY3MxMiBjb21tYW5kLiBBbHNvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciBzbyBNQUMgaXRlcmF0aW9uIGNvdW50cyBhcmUgdXNlZCB1bmxlc3MgdGhlIG5ldwogICAgIC1ub21hY2l0ZXIgb3B0aW9uIGlzIHVzZWQuIFRoaXMgaW1wcm92ZXMgZmlsZSBzZWN1cml0eSBhbmQKICAgICBvbmx5IG9sZGVyIHZlcnNpb25zIG9mIE1TSUUgKDQuMCBmb3IgZXhhbXBsZSkgbmVlZCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIb25vciB0aGUgbm8teHh4IENvbmZpZ3VyZSBvcHRpb25zIHdoZW4gY3JlYXRpbmcgLkRFRiBmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFBLQ1MjMTAgYXR0cmlidXRlcyB0byBmaWVsZCB0YWJsZTogY2hhbGxlbmdlUGFzc3dvcmQsIAogICAgIHVuc3RydWN0dXJlZE5hbWUgYW5kIHVuc3RydWN0dXJlZEFkZHJlc3MuIFRoZXNlIGFyZSB0YWtlbiBmcm9tCiAgICAgZHJhZnQgUEtDUyM5IHYyLjAgYnV0IGFyZSBjb21wYXRpYmxlIHdpdGggdjEuMiBwcm92aWRlZCBubyAKICAgICBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMgYXJlIHVzZWQuCgogICAgIE1vcmUgY2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSBjb2RlOiBhbGxvdyB0aGUgc2V0dGluZyBvZiB0eXBlcwogICAgIGJhc2VkIG9uIHN0cmluZ3MuIFJlbW92ZSB0aGUgJ2xvYycgcGFyYW1ldGVyIHdoZW4gYWRkaW5nCiAgICAgYXR0cmlidXRlcyBiZWNhdXNlIHRoZXNlIHdpbGwgYmUgYSBTRVQgT0YgZW5jb2Rpbmcgd2hpY2ggaXMgc29ydGVkCiAgICAgaW4gQVNOMSBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNoYW5nZXMgdG8gdGhlICdyZXEnIHV0aWxpdHkgdG8gYWxsb3cgcmVxdWVzdCBnZW5lcmF0aW9uCiAgICAgYXV0b21hdGlvbi4gVGhpcyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGp1c3QgZ2VuZXJhdGUgYSB0ZW1wbGF0ZQogICAgIGZpbGUgY29udGFpbmluZyBhbGwgdGhlIGZpZWxkIHZhbHVlcyBhbmQgaGF2ZSByZXEgY29uc3RydWN0IHRoZQogICAgIHJlcXVlc3QuCgogICAgIEluaXRpYWwgc3VwcG9ydCBmb3IgWDUwOV9BVFRSSUJVVEUgaGFuZGxpbmcuIFN0YWNrcyBvZiB0aGVzZSBhcmUKICAgICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBpbmNsdWRpbmcgY2VydGlmaWNhdGUgcmVxdWVzdHMgYW5kIFBLQ1MjNwogICAgIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGN1cnJlbnRseSBoYW5kbGVkIG1hbnVhbGx5IHdoZXJlIG5lY2Vzc2FyeSB3aXRoCiAgICAgc29tZSBwcmltaXRpdmUgd3JhcHBlcnMgZm9yIFBLQ1MjNy4gVGhlIG5ldyBmdW5jdGlvbnMgYmVoYXZlIGluIGEKICAgICBtYW5uZXIgYW5hbG9nb3VzIHRvIHRoZSBYNTA5IGV4dGVuc2lvbiBmdW5jdGlvbnM6IHRoZXkgYWxsb3cKICAgICBhdHRyaWJ1dGVzIHRvIGJlIGxvb2tlZCB1cCBieSBOSUQgYW5kIGFkZGVkLgoKICAgICBMYXRlciBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgWDUwOVYzIGNvZGUgd291bGQgYmUgZGVzaXJhYmxlIHRvCiAgICAgYXV0b21hdGljYWxseSBoYW5kbGUgdGhlIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgcHJpbnRpbmcgb2YgdGhlCiAgICAgbW9yZSBjb21wbGV4IHR5cGVzLiBUaGUgc3RyaW5nIHR5cGVzIGxpa2UgY2hhbGxlbmdlUGFzc3dvcmQgY2FuCiAgICAgYmUgaGFuZGxlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGZ1bmN0aW9ucy4KCiAgICAgQWxzbyBtb2RpZmllZCB0aGUgbXVsdGkgYnl0ZSBzdHJpbmcgdGFibGUgaGFuZGxpbmcuIE5vdyB0aGVyZSBpcwogICAgIGEgJ2dsb2JhbCBtYXNrJyB3aGljaCBtYXNrcyBvdXQgY2VydGFpbiB0eXBlcy4gVGhlIHRhYmxlIGl0c2VsZgogICAgIGNhbiB1c2UgdGhlIGZsYWcgU1RBQkxFX05PX01BU0sgdG8gaWdub3JlIHRoZSBtYXNrIHNldHRpbmc6IHRoaXMKICAgICBpcyB1c2VmdWwgd2hlbiBmb3IgZXhhbXBsZSB0aGVyZSBpcyBvbmx5IG9uZSBwZXJtaXNzaWJsZSB0eXBlCiAgICAgKGFzIGluIGNvdW50cnlOYW1lKSBhbmQgdXNpbmcgdGhlIG1hc2sgbWlnaHQgcmVzdWx0IGluIG5vIHZhbGlkCiAgICAgdHlwZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIHVwICdGaW5pc2hlZCcgaGFuZGxpbmcsIGFuZCBhZGQgZnVuY3Rpb25zIFNTTF9nZXRfZmluaXNoZWQgYW5kCiAgICAgU1NMX2dldF9wZWVyX2ZpbmlzaGVkIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBvYnRhaW4gdGhlIGxhdGVzdAogICAgIEZpbmlzaGVkIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIHBlZXIgb3IgZXhwZWN0ZWQgZnJvbSB0aGUgcGVlciwKICAgICByZXNwZWN0aXZlbHkuICAoU1NMX2dldF9wZWVyX2ZpbmlzaGVkIGlzIHVzdWFsbHkgdGhlIEZpbmlzaGVkIG1lc3NhZ2UKICAgICBhY3R1YWxseSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCBvdGhlcndpc2UgdGhlIHByb3RvY29sIHdpbGwgYmUgYWJvcnRlZC4pCgogICAgIEFzIHRoZSBGaW5pc2hlZCBtZXNzYWdlIGFyZSBtZXNzYWdlIGRpZ2VzdHMgb2YgdGhlIGNvbXBsZXRlIGhhbmRzaGFrZQogICAgICh3aXRoIGEgdG90YWwgb2YgMTkyIGJpdHMgZm9yIFRMUyAxLjAgYW5kIG1vcmUgZm9yIFNTTCAzLjApLCB0aGV5IGNhbgogICAgIGJlIHVzZWQgZm9yIGV4dGVybmFsIGF1dGhlbnRpY2F0aW9uIHByb2NlZHVyZXMgd2hlbiB0aGUgYXV0aGVudGljYXRpb24KICAgICBwcm92aWRlZCBieSBTU0wvVExTIGlzIG5vdCBkZXNpcmVkIG9yIGlzIG5vdCBlbm91Z2guCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgQWxwaGEgTGludXggaXMgYWRkZWQuIE5vdyAuL2NvbmZpZyBjaGVja3MgaWYKICAgICB0aGUgaG9zdCBzdXBwb3J0cyBCV1ggZXh0ZW5zaW9uIGFuZCBpZiBDb21wYXEgQyBpcyBwcmVzZW50IG9uIHRoZQogICAgICRQQVRILiBKdXN0IGV4cGxvaXRpbmcgb2YgdGhlIEJXWCBleHRlbnNpb24gcmVzdWx0cyBpbiAyMC0zMCUKICAgICBwZXJmb3JtYW5jZSBraWNrIGZvciBzb21lIGFsZ29yaXRobXMsIGUuZy4gREVTIGFuZCBSQzQgdG8gbWVudGlvbgogICAgIGEgY291cGxlLiBDb21wYXEgQyBpbiB0dXJuIGdlbmVyYXRlcyB+MjAlIGZhc3RlciBjb2RlIGZvciBNRDUgYW5kCiAgICAgU0hBMS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIE1TICJmYXN0IFNHQyIuIFRoaXMgaXMgYXJndWFibHkgYSB2aW9sYXRpb24gb2YgdGhlCiAgICAgU1NMMy9UTFMgcHJvdG9jb2wuIE5ldHNjYXBlIFNHQyBkb2VzIHR3byBoYW5kc2hha2VzOiB0aGUgZmlyc3Qgd2l0aAogICAgIHdlYWsgY3J5cHRvIGFuZCBhZnRlciBjaGVja2luZyB0aGUgY2VydGlmaWNhdGUgaXMgU0dDIGEgc2Vjb25kIG9uZQogICAgIHdpdGggc3Ryb25nIGNyeXB0by4gTVMgU0dDIHN0b3BzIHRoZSBmaXJzdCBoYW5kc2hha2UgYWZ0ZXIgcmVjZWl2aW5nCiAgICAgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBtZXNzYWdlIGFuZCBzZW5kcyBhIHNlY29uZCBjbGllbnQgaGVsbG8uIFNpbmNlCiAgICAgYSBzZXJ2ZXIgd2lsbCB0eXBpY2FsbHkgZG8gYWxsIHRoZSB0aW1lIGNvbnN1bWluZyBvcGVyYXRpb25zIGJlZm9yZQogICAgIGV4cGVjdGluZyBhbnkgZnVydGhlciBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgKHNlcnZlciBrZXkgZXhjaGFuZ2UKICAgICBpcyB0aGUgbW9zdCBleHBlbnNpdmUpIHRoZXJlIGlzIGxpdHRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by4KCiAgICAgVG8gZ2V0IE9wZW5TU0wgdG8gc3VwcG9ydCBNUyBTR0Mgd2UgaGF2ZSB0byBwZXJtaXQgYSBzZWNvbmQgY2xpZW50CiAgICAgaGVsbG8gbWVzc2FnZSBhZnRlciB3ZSBoYXZlIHNlbnQgc2VydmVyIGRvbmUuIEluIGFkZGl0aW9uIHdlIGhhdmUgdG8KICAgICByZXNldCB0aGUgTUFDIGlmIHdlIGRvIGdldCB0aGlzIHNlY29uZCBjbGllbnQgaGVsbG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gJ2QyaV9BdXRvUHJpdmF0ZUtleSgpJyB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBkZWNpZGUKICAgICBpZiBhIERFUiBlbmNvZGVkIHByaXZhdGUga2V5IGlzIFJTQSBvciBEU0EgdHJhZGl0aW9uYWwgZm9ybWF0LiBDaGFuZ2VkCiAgICAgZDJpX1ByaXZhdGVLZXlfYmlvKCkgdG8gdXNlIGl0LiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgInRyYWRpdGlvbmFsIgogICAgIGZvcm1hdCBERVIgZW5jb2RlZCBwcml2YXRlIGtleS4gTmV3ZXIgY29kZSBzaG91bGQgdXNlIFBLQ1MjOCBmb3JtYXQgd2hpY2gKICAgICBoYXMgdGhlIGtleSB0eXBlIGVuY29kZWQgaW4gdGhlIEFTTjEgc3RydWN0dXJlLiBBZGRlZCBERVIgcHJpdmF0ZSBrZXkKICAgICBzdXBwb3J0IHRvIHBrY3M4IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTCAzL1RMUyAxIHNlcnZlcnMgbm93IGRvbid0IHJlcXVlc3QgY2VydGlmaWNhdGVzIHdoZW4gYW4gYW5vbnltb3VzCiAgICAgY2lwaGVyc3VpdGVzIGhhcyBiZWVuIHNlbGVjdGVkIChhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMvVExTIDEKICAgICBzcGVjaWZpY2F0aW9ucykuICBFeGNlcHRpb246IFdoZW4gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAogICAgIGlzIHNldCwgd2UgaW50ZXJwcmV0IHRoaXMgYXMgYSByZXF1ZXN0IHRvIHZpb2xhdGUgdGhlIHNwZWNpZmljYXRpb24KICAgICAodGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyBhIGhhbmRzaGFrZSBmYWlsdXJlLCBhbmQgJ2NvcnJlY3QnCiAgICAgYmVoYXZpb3VyIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmRzaGFrZSBmYWlsdXJlIGFueXdheSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gU1NMX0NUWF9hZGRfc2Vzc2lvbiwgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZQogICAgIFNTTF9TRVNTSU9OIHN0cnVjdHVyZXMgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIChlLmcuIHdoZW4gdHdvIHRocmVhZHMKICAgICBjb25jdXJyZW50bHkgb2J0YWluIHRoZW0gZnJvbSBhbiBleHRlcm5hbCBjYWNoZSkuCiAgICAgVGhlIGludGVybmFsIGNhY2hlIGNhbiBoYW5kbGUgb25seSBvbmUgU1NMX1NFU1NJT04gd2l0aCBhIGdpdmVuIElELAogICAgIHNvIGlmIHRoZXJlJ3MgYSBjb25mbGljdCwgd2Ugbm93IHRocm93IG91dCB0aGUgb2xkIG9uZSB0byBhY2hpZXZlCiAgICAgY29uc2lzdGVuY3kuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIE9JRHMgZm9yIGlkZWEgYW5kIGJsb3dmaXNoIGluIENCQyBtb2RlLiBUaGlzIHdpbGwgYWxsb3cgYm90aAogICAgIHRvIGJlIHVzZWQgaW4gUEtDUyM1IHYyLjAgYW5kIFMvTUlNRS4gIEFsc28gYWRkIGNoZWNraW5nIHRvCiAgICAgc29tZSByb3V0aW5lcyB0aGF0IHVzZSBjaXBoZXIgT0lEczogc29tZSBjaXBoZXJzIGRvIG5vdCBoYXZlIE9JRHMKICAgICBkZWZpbmVkIGFuZCBzbyB0aGV5IGNhbm5vdCBiZSB1c2VkIGZvciBTL01JTUUgYW5kIFBLQ1MjNSB2Mi4wIGZvcgogICAgIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2ltcGxpZnkgdGhlIHRydXN0IHNldHRpbmcgc3RydWN0dXJlIGFuZCBjb2RlLiBOb3cgd2UganVzdCBoYXZlCiAgICAgdHdvIHNlcXVlbmNlcyBvZiBPSURzIGZvciB0cnVzdGVkIGFuZCByZWplY3RlZCBzZXR0aW5ncy4gVGhlc2Ugd2lsbAogICAgIHR5cGljYWxseSBoYXZlIHZhbHVlcyB0aGUgc2FtZSBhcyB0aGUgZXh0ZW5kZWQga2V5IHVzYWdlIGV4dGVuc2lvbgogICAgIGFuZCBhbnkgYXBwbGljYXRpb24gc3BlY2lmaWMgcHVycG9zZXMuCgogICAgIFRoZSB0cnVzdCBjaGVja2luZyBjb2RlIG5vdyBoYXMgYSBkZWZhdWx0IGJlaGF2aW91cjogaXQgd2lsbCBqdXN0CiAgICAgY2hlY2sgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIE5JRCBhcyB0aGUgcGFzc2VkIGlkLiBGdW5jdGlvbnMgY2FuCiAgICAgYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvciB0aGUgYmVoYXZpb3VyCiAgICAgZm9yIGEgZ2l2ZW4gaWQuIFNTTCBjbGllbnQsIHNlcnZlciBhbmQgZW1haWwgYWxyZWFkeSBoYXZlIGZ1bmN0aW9ucwogICAgIGluIHBsYWNlIGZvciBjb21wYXRpYmlsaXR5OiB0aGV5IGNoZWNrIHRoZSBOSUQgYW5kIGFsc28gcmV0dXJuICJ0cnVzdGVkIgogICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBzZWxmIHNpZ25lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZDJpLGkyZCBiaW8vZnAgZnVuY3Rpb25zIGZvciBQcml2YXRlS2V5OiB0aGVzZSBjb252ZXJ0IHRoZQogICAgIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnRvIGFuIEVWUF9QS0VZIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBwYXNzd29yZCBjYWxsYmFjayBmdW5jdGlvbiBQRU1fY2IoKSB3aGljaCBlaXRoZXIgcHJvbXB0cyBmb3IKICAgICBhIHBhc3N3b3JkIGlmIHVzcl9kYXRhIGlzIE5VTEwgb3Igb3RoZXJ3aXNlIGFzc3VtZXMgaXQgaXMgYSBudWxsCiAgICAgdGVybWluYXRlZCBwYXNzd29yZC4gQWxsb3cgcGFzc3dvcmRzIHRvIGJlIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUKICAgICBlbnZpcm9ubWVudCBvciBjb25maWcgZmlsZXMgaW4gYSBmZXcgbW9yZSB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgREVSIGFuZCBQRU0gZnVuY3Rpb25zIHRvIGhhbmRsZSBQS0NTIzggZm9ybWF0IHByaXZhdGUKICAgICBrZXlzLiBBZGQgc29tZSBzaG9ydCBuYW1lcyBmb3IgUEtDUyM4IFBCRSBhbGdvcml0aG1zIGFuZCBhbGxvdyB0aGVtCiAgICAgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBwa2NzOCBhbmQgcGtjczEyIHV0aWxpdGllcy4KICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBBU04xICJOVUxMIiB0eXBlLiBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIGJ5IHVzaW5nCiAgICAgQVNOMV9UWVBFIGJ1dCB0aGVyZSB3YXNuJ3QgYW55IGZ1bmN0aW9uIHRoYXQgd291bGQgdHJ5IHRvIHJlYWQgYSBOVUxMCiAgICAgYW5kIHByb2R1Y2UgYW4gZXJyb3IgaWYgaXQgY291bGRuJ3QuIEZvciBjb21wYXRpYmlsaXR5IHdlIGFsc28gaGF2ZQogICAgIEFTTjFfTlVMTF9uZXcoKSBhbmQgQVNOMV9OVUxMX2ZyZWUoKSBmdW5jdGlvbnMgYnV0IHRoZXNlIGFyZSBmYWtlZCBhbmQKICAgICBkb24ndCBhbGxvY2F0ZSBhbnl0aGluZyBiZWNhdXNlIHRoZXkgZG9uJ3QgbmVlZCB0by4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIE1hY09TIGlzIG5vdyBwcm92aWRlZC4gRXhhbWluZSBJTlNUQUxMLk1hY09TCiAgICAgZm9yIGRldGFpbHMuCiAgICAgW0FuZHkgUG9seWFrb3YsIFJveSBXb29kcyA8cm95QGNlbnRpY3N5c3RlbXMuY2E+XQoKICAqKSBSZWJ1aWxkIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB1c2VkIGJ5IE9wZW5TU0wgY29kZSBhbmQKICAgICBwb3NzaWJseSBvdGhlcnMgYXMgd2VsbC4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UgYW4gaW50ZXJmYWNlIHRoYXQKICAgICBwcm92aWRlIGhvb2tzIHNvIGFueW9uZSBjYW4gYnVpbGQgYSBzZXBhcmF0ZSBzZXQgb2YgYWxsb2NhdGlvbiBhbmQKICAgICBkZWFsbG9jYXRpb24gcm91dGluZXMgdG8gYmUgdXNlZCBieSBPcGVuU1NMLCBmb3IgZXhhbXBsZSBtZW1vcnkKICAgICBwb29sIGltcGxlbWVudGF0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICBzaW5jZSBNYWxsb2MoKSwgUmVhbGxvYygpIGFuZCBGcmVlKCkgd2VyZSBkZWZpbmVkIGFzIG1hY3JvcyBoYXZpbmcKICAgICB0aGUgdmFsdWVzIG1hbGxvYywgcmVhbGxvYyBhbmQgZnJlZSwgcmVzcGVjdGl2ZWx5IChleGNlcHQgZm9yIFdpbjMyCiAgICAgY29tcGlsYXRpb25zKS4gIFRoZSBzYW1lIGlzIHByb3ZpZGVkIGZvciBtZW1vcnkgZGVidWdnaW5nIGNvZGUuCiAgICAgT3BlblNTTCBhbHJlYWR5IGNvbWVzIHdpdGggZnVuY3Rpb25hbGl0eSB0byBmaW5kIG1lbW9yeSBsZWFrcywgYnV0CiAgICAgdGhpcyBnaXZlcyBwZW9wbGUgYSBjaGFuY2UgdG8gZGVidWcgb3RoZXIgbWVtb3J5IHByb2JsZW1zLgoKICAgICBXaXRoIHRoZXNlIGNoYW5nZXMsIGEgbmV3IHNldCBvZiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBoYXZlIGFwcGVhcmVkOgoKICAgICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpCSAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZ2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKSAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucygpCSAgICAgICAgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfZ2V0X29wdGlvbnMoKSAgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAgICAgICAgICAgICAgIFtNXQoKICAgICBUaGUgbWVtb3J5IGRlYnVnIGZ1bmN0aW9ucyBhcmUgTlVMTCBieSBkZWZhdWx0LCB1bmxlc3MgdGhlIGxpYnJhcnkKICAgICBpcyBjb21waWxlZCB3aXRoIENSWVBUT19NREVCVUcgb3IgZnJpZW5kcyBpcyBkZWZpbmVkLiAgSWYgc29tZW9uZQogICAgIHdhbnRzIHRvIGRlYnVnIG1lbW9yeSBhbnl3YXksIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpICh3aGljaAogICAgIGdpdmVzIHRoZSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZnVuY3Rpb25zIHRoYXQgY29tZSB3aXRoIE9wZW5TU0wpIG9yCiAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgKHRlbGxzIE9wZW5TU0wgdG8gdXNlIGZ1bmN0aW9ucwogICAgIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5IHVzZXIpIG11c3QgYmUgdXNlZC4gIFdoZW4gdGhlIHN0YW5kYXJkCiAgICAgZGVidWdnaW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCwgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyBjYW4gYmUgdXNlZCB0bwogICAgIHJlcXVlc3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKICAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKFZfQ1lSUFRPX01ERUJVR194eHgpIGNvcnJlc3BvbmRzIHRvIHNldHRpbmcKICAgICB0aGUgQ1JZUFRPX01ERUJVR194eHggbWFjcm8gd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkuICAgCgogICAgIEFsc28sIHRoaW5ncyBsaWtlIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyB3aWxsIGFsd2F5cyBnaXZlIHRoZQogICAgIGV4cGVjdGVkIHJlc3VsdCAodGhlIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIGFsbG9jYXRpb24KICAgICBhbmQgZGVhbGxvY2F0aW9uKSBhdCBhbGwgdGltZXMsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0gYW5kIGNvbXBpbGVyCiAgICAgb3B0aW9ucy4KCiAgICAgVG8gZmluaXNoIGl0IHVwLCBzb21lIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgdXNlIGluIGFueSBvdGhlcgogICAgIHdheSB0aGFuIHRocm91Z2ggbWFjcm9zIGhhdmUgYSBuZXcgQVBJIGFuZCBuZXcgc2VtYW50aWM6CgogICAgICAgQ1JZUFRPX2RiZ19tYWxsb2MoKQogICAgICAgQ1JZUFRPX2RiZ19yZWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfZnJlZSgpCgogICAgIEFsbCBtYWNyb3Mgb2YgdmFsdWUgaGF2ZSByZXRhaW5lZCB0aGVpciBvbGQgc3ludGF4LgogICAgIFtSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgU29tZSBTL01JTUUgZml4ZXMuIFRoZSBPSUQgZm9yIFNNSU1FQ2FwYWJpbGl0aWVzIHdhcyB3cm9uZywgdGhlCiAgICAgb3JkZXJpbmcgb2YgU01JTUVDYXBhYmlsaXRpZXMgd2Fzbid0IGluICJzdHJlbmd0aCBvcmRlciIgYW5kIHRoZXJlCiAgICAgd2FzIGEgbWlzc2luZyBOVUxMIGluIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGZvciB0aGUgU0hBMSBzaWduYXR1cmUKICAgICBhbGdvcml0aG0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU29tZSBBU04xIHR5cGVzIHdpdGggaWxsZWdhbCB6ZXJvIGxlbmd0aCBlbmNvZGluZyAoSU5URUdFUiwKICAgICBFTlVNRVJBVEVEIGFuZCBPQkpFQ1QgSURFTlRJRklFUikgY2hva2VkIHRoZSBBU04xIHJvdXRpbmVzLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+LCBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIG15IFMvTUlNRSBsaWJyYXJ5IGZvciBPcGVuU1NMLiBUaGlzIHByb3ZpZGVzIGEgc2ltcGxlCiAgICAgUy9NSU1FIEFQSSBvbiB0b3Agb2YgdGhlIFBLQ1MjNyBjb2RlLCBhIE1JTUUgcGFyc2VyICh3aXRoIGVub3VnaAogICAgIGZ1bmN0aW9uYWxpdHkgdG8gaGFuZGxlIG11bHRpcGFydC9zaWduZWQgcHJvcGVybHkpIGFuZCBhIHV0aWxpdHkKICAgICBjYWxsZWQgJ3NtaW1lJyB0byBjYWxsIGFsbCB0aGlzIHN0dWZmLiBUaGlzIGlzIGJhc2VkIG9uIGNvZGUgSQogICAgIG9yaWdpbmFsbHkgd3JvdGUgZm9yIENlbG8gd2hvIGhhdmUga2luZGx5IGFsbG93ZWQgaXQgdG8gYmUKICAgICBpbmNsdWRlZCBpbiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB2YXJpYW50cyBkZXNfc2V0X2tleV9jaGVja2VkIGFuZCBkZXNfc2V0X2tleV91bmNoZWNrZWQgb2YKICAgICBkZXNfc2V0X2tleSAoYWthIGRlc19rZXlfc2NoZWQpLiAgR2xvYmFsIHZhcmlhYmxlIGRlc19jaGVja19rZXkKICAgICBkZWNpZGVzIHdoaWNoIG9mIHRoZXNlIGlzIGNhbGxlZCBieSBkZXNfc2V0X2tleTsgdGhpcyB3YXkKICAgICBkZXNfY2hlY2tfa2V5IGJlaGF2ZXMgYXMgaXQgYWx3YXlzIGRpZCwgYnV0IGFwcGxpY2F0aW9ucyBhbmQKICAgICB0aGUgbGlicmFyeSBpdHNlbGYsIHdoaWNoIHdhcyBidWdneSBmb3IgZGVzX2NoZWNrX2tleSA9PSAxLAogICAgIGhhdmUgYSBjbGVhbmVyIHdheSB0byBwaWNrIHRoZSB2ZXJzaW9uIHRoZXkgbmVlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzEyX25ld3Bhc3MoKSB3aGljaCBjaGFuZ2VzIHRoZSBwYXNzd29yZCBvZiBhCiAgICAgUEtDUzEyIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgWDUwOV9UUlVTVCBhbmQgWDUwOV9QVVJQT1NFIHNvIGl0IGFsc28gdXNlcyBhIHN0YXRpYyBhbmQKICAgICBkeW5hbWljIG1peC4gSW4gYm90aCBjYXNlcyB0aGUgaWRzIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlCiAgICAgdGFibGUuIEFsc28gbW9kaWZpZWQgdGhlIFg1MDlfVFJVU1RfYWRkKCkgYW5kIFg1MDlfUFVSUE9TRV9hZGQoKQogICAgIGZ1bmN0aW9ucyBzbyB0aGV5IGFjY2VwdCBhIGxpc3Qgb2YgdGhlIGZpZWxkIHZhbHVlcyBhbmQgdGhlCiAgICAgYXBwbGljYXRpb24gZG9lc24ndCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIFg1MDlfVFJVU1QKICAgICBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBBU04xX1NUUklOR19UQUJMRSBzdHVmZiBzbyBpdCBhbHNvIHVzZXMgYnNlYXJjaCBhbmQgZG9lc24ndAogICAgIG5lZWQgaW5pdGlhbGlzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgd2F5IHRoZSBWMyBleHRlbnNpb24gY29kZSBsb29rcyB1cCBleHRlbnNpb25zLiBUaGlzIG5vdwogICAgIHdvcmtzIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIG9iamVjdCBjb2RlOiB3ZSBoYXZlIHNvbWUgInN0YW5kYXJkIgogICAgIGV4dGVuc2lvbnMgaW4gYSBzdGF0aWMgdGFibGUgd2hpY2ggaXMgc2VhcmNoZWQgd2l0aCBPQkpfYnNlYXJjaCgpCiAgICAgYW5kIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWRkIGR5bmFtaWMgb25lcyBpZiBuZWVkZWQuIFRoZSBmaWxlCiAgICAgY3J5cHRvL3g1MDl2My9leHRfZGF0Lmggbm93IGhhcyB0aGUgaW5mbzogdGhpcyBmaWxlIG5lZWRzIHRvIGJlCiAgICAgdXBkYXRlZCB3aGVuZXZlciBhIG5ldyBleHRlbnNpb24gaXMgYWRkZWQgdG8gdGhlIGNvcmUgY29kZSBhbmQga2VwdAogICAgIGluIGV4dF9uaWQgb3JkZXIuIFRoZXJlIGlzIGEgc2ltcGxlIHByb2dyYW0gJ3RhYnRlc3QuYycgd2hpY2ggY2hlY2tzCiAgICAgdGhpcy4gTmV3IGV4dGVuc2lvbnMgYXJlIG5vdCBhZGRlZCB0b28gb2Z0ZW4gc28gdGhpcyBmaWxlIGNhbiByZWFkaWx5CiAgICAgYmUgbWFpbnRhaW5lZCBtYW51YWxseS4KCiAgICAgVGhlcmUgYXJlIHR3byBiaWcgYWR2YW50YWdlcyBpbiBkb2luZyB0aGluZ3MgdGhpcyB3YXkuIFRoZSBleHRlbnNpb25zCiAgICAgY2FuIGJlIGxvb2tlZCB1cCBpbW1lZGlhdGVseSBhbmQgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgImFkZGVkIiB1c2luZwogICAgIFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOiB0aGlzIGZ1bmN0aW9uIG5vdyBkb2VzIG5vdGhpbmcuCiAgICAgW1NpZGUgbm90ZTogSSBnZXQgKmxvdHMqIG9mIGVtYWlsIHNheWluZyB0aGUgZXh0ZW5zaW9uIGNvZGUgZG9lc24ndAogICAgICB3b3JrIGJlY2F1c2UgcGVvcGxlIGZvcmdldCB0byBjYWxsIHRoaXMgZnVuY3Rpb25dCiAgICAgQWxzbyBubyBkeW5hbWljIGFsbG9jYXRpb24gaXMgZG9uZSB1bmxlc3MgbmV3IGV4dGVuc2lvbnMgYXJlIGFkZGVkOgogICAgIHNvIGlmIHdlIGRvbid0IGFkZCBjdXN0b20gZXh0ZW5zaW9ucyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwKICAgICBYNTA5VjNfRVhUX2NsZWFudXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgZW5jIHV0aWxpdHkncyBzYWx0aW5nIGFzIGZvbGxvd3M6IG1ha2Ugc2FsdGluZyB0aGUgZGVmYXVsdC4gQWRkIGEKICAgICBtYWdpYyBoZWFkZXIsIHNvIHVuc2FsdGVkIGZpbGVzIGZhaWwgZ3JhY2VmdWxseSBpbnN0ZWFkIG9mIGp1c3QgZGVjcnlwdGluZwogICAgIHRvIGdhcmJhZ2UuIFRoaXMgaXMgYmVjYXVzZSBub3Qgc2FsdGluZyBpcyBhIGJpZyBzZWN1cml0eSBob2xlLCBzbyBwZW9wbGUKICAgICBzaG91bGQgYmUgZGlzY291cmFnZWQgZnJvbSBkb2luZyBpdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgJ3g1MDknIHV0aWxpdHkuIEl0IGFsbG93ZWQgYSBtZXNzYWdlCiAgICAgZGlnZXN0IHRvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGJ1dCBpdCBvbmx5IHVzZWQgdGhpcwogICAgIHBhcmFtZXRlciB3aGVuIHNpZ25pbmcgYSBjZXJ0aWZpY2F0ZS4gTW9kaWZpZWQgc28gYWxsIHJlbGV2YW50CiAgICAgb3BlcmF0aW9ucyBhcmUgYWZmZWN0ZWQgYnkgdGhlIGRpZ2VzdCBwYXJhbWV0ZXIgaW5jbHVkaW5nIHRoZQogICAgIC1maW5nZXJwcmludCBhbmQgLXg1MDl0b3JlcSBvcHRpb25zLiBBbHNvIC14NTA5dG9yZXEgY2hva2VkIGlmIGEKICAgICBEU0Ega2V5IHdhcyB1c2VkIGJlY2F1c2UgaXQgZGlkbid0IGZpeCB0aGUgZGlnZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZ5IGNvZGUuIEN1cnJlbnRseSB0ZXN0cyB0aGUgdW50cnVzdGVkCiAgICAgY2VydGlmaWNhdGVzIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZSAod2hpY2ggaXMgc2V0CiAgICAgd2hlbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlIGlzIHNldCB1cCkgYW5kIGNoZWNrcyB0aGUgcGF0aGxlbmd0aC4KCiAgICAgVGhlcmUgaXMgYSBOT19DSEFJTl9WRVJJRlkgY29tcGlsYXRpb24gb3B0aW9uIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXI6CiAgICAgdGhpcyBpcyBiZWNhdXNlIGl0IHdpbGwgcmVqZWN0IGNoYWlucyB3aXRoIGludmFsaWQgZXh0ZW5zaW9ucyB3aGVyZWFzCiAgICAgZXZlcnkgcHJldmlvdXMgdmVyc2lvbiBvZiBPcGVuU1NMIGFuZCBTU0xlYXkgbWFkZSBubyBjaGVja3MgYXQgYWxsLgoKICAgICBUcnVzdCBjb2RlOiBjaGVja3MgdGhlIHJvb3QgQ0EgZm9yIHRoZSByZWxldmFudCB0cnVzdCBzZXR0aW5ncy4gVHJ1c3QKICAgICBzZXR0aW5ncyBoYXZlIGFuIGluaXRpYWwgdmFsdWUgY29uc2lzdGVudCB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZTogZS5nLgogICAgIGlmIHRoZSB2ZXJpZnkgcHVycG9zZSBpcyBmb3IgU1NMIGNsaWVudCB1c2UgaXQgZXhwZWN0cyB0aGUgQ0EgdG8gYmUKICAgICB0cnVzdGVkIGZvciBTU0wgY2xpZW50IHVzZS4gSG93ZXZlciB0aGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0bwogICAgIHBlcm1pdCBjdXN0b20gdHJ1c3Qgc2V0dGluZ3M6IG9uZSBleGFtcGxlIG9mIHRoaXMgd291bGQgYmUgdG8gb25seSB0cnVzdAogICAgIGNlcnRpZmljYXRlcyBmcm9tIGEgc3BlY2lmaWMgInNlY3VyZSIgc2V0IG9mIENBcy4KCiAgICAgQWxzbyBhZGRlZCBYNTA5X1NUT1JFX0NUWF9uZXcoKSBhbmQgWDUwOV9TVE9SRV9DVFhfZnJlZSgpIGZ1bmN0aW9ucwogICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciB2ZXJzaW9uIHBvcnRhYmlsaXR5OiBlc3BlY2lhbGx5IHNpbmNlIHRoZQogICAgIHZlcmlmeSBzdHJ1Y3R1cmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBtb3JlIG9mdGVuIG5vdy4KCiAgICAgU1NMIGludGVncmF0aW9uLiBBZGQgcHVycG9zZSBhbmQgdHJ1c3QgdG8gU1NMX0NUWCBhbmQgU1NMIGFuZCBmdW5jdGlvbnMKICAgICB0byBzZXQgdGhlbS4gSWYgbm90IHNldCB0aGVuIGFzc3VtZSBTU0wgY2xpZW50cyB3aWxsIHZlcmlmeSBTU0wgc2VydmVycwogICAgIGFuZCB2aWNlIHZlcnNhLgoKICAgICBUd28gbmV3IG9wdGlvbnMgdG8gdGhlIHZlcmlmeSBwcm9ncmFtOiAtdW50cnVzdGVkIGFsbG93cyBhIHNldCBvZgogICAgIHVudHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gYmUgcGFzc2VkIGluIGFuZCAtcHVycG9zZSB3aGljaCBzZXRzIHRoZQogICAgIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIGNlcnRpZmljYXRlLiBJZiBhIHB1cnBvc2UgaXMgc2V0IHRoZW4gdGhlCiAgICAgbmV3IGNoYWluIHZlcmlmeSBjb2RlIGlzIHVzZWQgdG8gY2hlY2sgZXh0ZW5zaW9uIGNvbnNpc3RlbmN5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHRoZSBhdXRob3JpdHkgaW5mb3JtYXRpb24gYWNjZXNzIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgUlNBIGFuZCBEU0EgUEVNIHJlYWQgcm91dGluZXMgdG8gdHJhbnNwYXJlbnRseSBoYW5kbGUKICAgICBQS0NTIzggZm9ybWF0IHByaXZhdGUga2V5cy4gTmV3ICpfUFVCS0VZXyogZnVuY3Rpb25zIHRoYXQgaGFuZGxlCiAgICAgcHVibGljIGtleXMgaW4gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIGNlcnRpZmljYXRlCiAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gc3RydWN0dXJlcy4gVW5mb3J0dW5hdGVseSB0aGVyZSB3ZXJlIGFscmVhZHkKICAgICBmdW5jdGlvbnMgY2FsbGVkICpfUHVibGljS2V5Xyogd2hpY2ggdXNlZCB2YXJpb3VzIG9kZCBmb3JtYXRzIHNvCiAgICAgdGhlc2UgYXJlIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5OiBob3dldmVyIHRoZSBEU0EgdmFyaWFudHMgd2VyZQogICAgIG5ldmVyIGluIGEgcHVibGljIHJlbGVhc2Ugc28gdGhleSBoYXZlIGJlZW4gZGVsZXRlZC4gQ2hhbmdlZCBkc2EvcnNhCiAgICAgdXRpbGl0aWVzIHRvIGhhbmRsZSB0aGUgbmV3IGZvcm1hdDogbm90ZSBubyByZWxlYXNlcyBldmVyIGhhbmRsZWQgcHVibGljCiAgICAga2V5cyBzbyB3ZSBzaG91bGQgYmUgT0suCgogICAgIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIGF2b2lkIHRoZSBzYW1lIGZpYXNjbwogICAgIHRoYXQgZG9ncyBwcml2YXRlIGtleXM6IHRoZXJlIGFyZSBzZXZlcmFsIGluY29tcGF0aWJsZSBwcml2YXRlIGtleQogICAgIGZvcm1hdHMgc29tZSBvZiB3aGljaCBhcmUgc3RhbmRhcmQgYW5kIHNvbWUgT3BlblNTTCBzcGVjaWZpYyBhbmQKICAgICByZXF1aXJlIHZhcmlvdXMgZXZpbCBoYWNrcyB0byBhbGxvdyBwYXJ0aWFsIHRyYW5zcGFyZW50IGhhbmRsaW5nIGFuZAogICAgIGV2ZW4gdGhlbiBpdCBkb2Vzbid0IHdvcmsgd2l0aCBERVIgZm9ybWF0cy4gR2l2ZW4gdGhlIG9wdGlvbiBhbnl0aGluZwogICAgIG90aGVyIHRoYW4gUEtDUyM4IHNob3VsZCBiZSBkdW1wZWQ6IGJ1dCB0aGUgb3RoZXIgZm9ybWF0cyBoYXZlIHRvCiAgICAgc3RheSBpbiB0aGUgbmFtZSBvZiBjb21wYXRpYmlsaXR5LgoKICAgICBXaXRoIHB1YmxpYyBrZXlzIGFuZCB0aGUgYmVuZWZpdCBvZiBoaW5kc2lnaHQgb25lIHN0YW5kYXJkIGZvcm1hdCAKICAgICBpcyB1c2VkIHdoaWNoIHdvcmtzIHdpdGggRVZQX1BLRVksIFJTQSBvciBEU0Egc3RydWN0dXJlczogdGhvdWdoCiAgICAgaXQgY2xlYXJseSByZXR1cm5zIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gcmVhZCB0aGUgd3Jvbmcga2luZCBvZiBrZXkuCgogICAgIEFkZGVkIGEgLXB1YmtleSBvcHRpb24gdG8gdGhlICd4NTA5JyB1dGlsaXR5IHRvIG91dHB1dCB0aGUgcHVibGljIGtleS4KICAgICBBbHNvIHJlbmFtZSB0aGUgRVZQX1BLRVlfZ2V0XyooKSB0byBFVlBfUEtFWV9yZ2V0XyooKQogICAgIChyZW5hbWVkIHRvIEVWUF9QS0VZX2dldDFfKigpIGluIHRoZSBPcGVuU1NMIDAuOS41IHJlbGVhc2UpIGFuZCBhZGQKICAgICBFVlBfUEtFWV9yc2V0XyooKSBmdW5jdGlvbnMgKHJlbmFtZWQgdG8gRVZQX1BLRVlfc2V0MV8qKCkpCiAgICAgdGhhdCBkbyB0aGUgc2FtZSBhcyB0aGUgRVZQX1BLRVlfYXNzaWduXyooKSBleGNlcHQgdGhleSB1cCB0aGUKICAgICByZWZlcmVuY2UgY291bnQgb2YgdGhlIGFkZGVkIGtleSAodGhleSBkb24ndCAic3dhbGxvdyIgdGhlCiAgICAgc3VwcGxpZWQga2V5KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBjcnlwdG8veDUwOS9ieV9maWxlLmMgdGhlIGNvZGUgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgYW5kCiAgICAgQ1JMcyB3b3VsZCBmYWlsIGlmIHRoZSBmaWxlIGNvbnRhaW5lZCBubyBjZXJ0aWZpY2F0ZXMgb3Igbm8gQ1JMczoKICAgICBhZGRlZCBhIG5ldyBmdW5jdGlvbiB0byByZWFkIGluIGJvdGggdHlwZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyCiAgICAgcmVhZDogdGhpcyBtZWFucyB0aGF0IGlmIG5vbmUgYXJlIHJlYWQgaXQgd2lsbCBiZSBhbiBlcnJvci4gVGhlCiAgICAgREVSIHZlcnNpb25zIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgQ1JMIHJlYWRlciB3b3VsZCBhbHdheXMgZmFpbAogICAgIGJlY2F1c2UgaXQgaXNuJ3QgcG9zc2libGUgdG8gbWl4IGNlcnRpZmljYXRlcyBhbmQgQ1JMcyBpbiBERVIgZm9ybWF0CiAgICAgd2l0aG91dCBjaG9raW5nIG9uZSBvciB0aGUgb3RoZXIgcm91dGluZS4gQ2hhbmdlZCB0aGlzIHRvIGp1c3QgcmVhZAogICAgIGEgY2VydGlmaWNhdGU6IHRoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLiBBbHNvIG1vZGlmaWVkIHRoZSBjb2RlCiAgICAgaW4gYXBwcy92ZXJpZnkuYyB0byB0YWtlIG5vdGljZSBvZiByZXR1cm4gY29kZXM6IGl0IHdhcyBwcmV2aW91c2x5CiAgICAgYXR0ZW1wdGluZyB0byByZWFkIGluIGNlcnRpZmljYXRlcyBmcm9tIE5VTEwgcG9pbnRlcnMgYW5kIGlnbm9yaW5nCiAgICAgYW55IGVycm9yczogdGhpcyBpcyBvbmUgcmVhc29uIHdoeSB0aGUgY2VydCBhbmQgQ1JMIHJlYWRlciBzZWVtZWQKICAgICB0byB3b3JrLiBJdCBkb2Vzbid0IGNoZWNrIHJldHVybiBjb2RlcyBmcm9tIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlCiAgICAgcm91dGluZXM6IHRoZXNlIG1heSB3ZWxsIGZhaWwgaWYgdGhlIGNlcnRpZmljYXRlcyBhcmVuJ3QgaW5zdGFsbGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvZGUgdG8gc3VwcG9ydCBvdGhlck5hbWUgb3B0aW9uIGluIEdlbmVyYWxOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpcnN0IHVwZGF0ZSB0byB2ZXJpZnkgY29kZS4gQ2hhbmdlIHRoZSB2ZXJpZnkgdXRpbGl0eQogICAgIHNvIGl0IHdhcm5zIGlmIGl0IGlzIHBhc3NlZCBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlOgogICAgIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBub3JtYWwgYmVoYXZpb3VyLiBYNTA5X3ZlcmlmeQogICAgIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGl0IHdpbGwgbm93IHZlcmlmeSBhIHNlbGYgc2lnbmVkCiAgICAgY2VydGlmaWNhdGUgaWYgKmV4YWN0bHkqIHRoZSBzYW1lIGNlcnRpZmljYXRlIGFwcGVhcnMKICAgICBpbiB0aGUgc3RvcmU6IGl0IHdhcyBwcmV2aW91c2x5IGltcG9zc2libGUgdG8gdHJ1c3QgYQogICAgIHNpbmdsZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZS4gVGhpcyBtZWFucyB0aGF0OgogICAgIG9wZW5zc2wgdmVyaWZ5IHNzLnBlbQogICAgIG5vdyBnaXZlcyBhIHdhcm5pbmcgYWJvdXQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBidXQKICAgICBvcGVuc3NsIHZlcmlmeSAtQ0FmaWxlIHNzLnBlbSBzcy5wZW0KICAgICBpcyBPSy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3Igc2VydmVycywgc3RvcmUgdmVyaWZ5X3Jlc3VsdCBpbiBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZQogICAgIChhbmQgYWRkIGl0IHRvIGV4dGVybmFsIHNlc3Npb24gcmVwcmVzZW50YXRpb24pLgogICAgIFRoaXMgaXMgbmVlZGVkIHdoZW4gY2xpZW50IGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbnMgZmFpbHMsCiAgICAgYnV0IGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHZlcmlmaWNhdGlvbiBjYWxsYmFjayAoc2V0IGJ5CiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2spIGFsbG93cyBhY2NlcHRpbmcgdGhlIHNlc3Npb24KICAgICBhbnl3YXkgKGkuZS4gbGVhdmVzIHg1MDlfc3RvcmVfY3R4LT5lcnJvciAhPSBYNTA5X1ZfT0sKICAgICBidXQgcmV0dXJucyAxKTogV2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQsIHdlIGhhdmUgdG8gc2V0CiAgICAgc3NsLT52ZXJpZnlfcmVzdWx0IHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIHRvIGF2b2lkCiAgICAgc2VjdXJpdHkgaG9sZXMuCiAgICAgW0JvZG8gTW9lbGxlciwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYSBidWcgaW4gdGhlIG5ldyBQS0NTIzcgY29kZTogaXQgZGlkbid0IGNvbnNpZGVyIHRoZQogICAgIGNhc2UgaW4gUEtDUzdfZGF0YUluaXQoKSB3aGVyZSB0aGUgc2lnbmVkIFBLQ1M3IHN0cnVjdHVyZQogICAgIGRpZG4ndCBjb250YWluIGFueSBleGlzdGluZyBkYXRhIGJlY2F1c2UgaXQgd2FzIGJlaW5nIGNyZWF0ZWQuCiAgICAgW1BvLUNoZW5nIENoZW4gPHBvY2hlbmdAbnN0LmNvbS50dz4sIHNsaWdodGx5IG1vZGlmaWVkIGJ5IFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc2FsdCB0byB0aGUga2V5IGRlcml2YXRpb24gcm91dGluZXMgaW4gZW5jLmMuIFRoaXMKICAgICBmb3JtcyB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGZpbGUuIEFsc28gYWRkIGEKICAgICAtUyBvcHRpb24gdG8gYWxsb3cgYSBzYWx0IHRvIGJlIGlucHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfY21wKCkuIE9kZGx5IGVub3VnaCB0aGVyZSB3YXNuJ3QgYSBmdW5jdGlvbgogICAgIHRvIGNvbXBhcmUgdHdvIGNlcnRpZmljYXRlcy4gV2UgZG8gdGhpcyBieSB3b3JraW5nIG91dCB0aGUgU0hBMQogICAgIGhhc2ggYW5kIGNvbXBhcmluZyB0aGF0LiBYNTA5X2NtcCgpIHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSB0cnVzdAogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMX2dldDFfc2Vzc2lvbigpIGlzIGxpa2UgU1NMX2dldF9zZXNzaW9uKCksIGJ1dCBpbmNyZW1lbnRzCiAgICAgdGhlIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgU1NMX1NFU1NJT04gcmV0dXJuZWQuCiAgICAgW0dlb2ZmIFRob3JwZSA8Z2VvZmZAZXUuYzIubmV0Pl0KCiAgKikgRml4IGZvciAncmVxJzogaXQgd2FzIGFkZGluZyBhIG51bGwgdG8gcmVxdWVzdCBhdHRyaWJ1dGVzLgogICAgIEFsc28gY2hhbmdlIHRoZSBYNTA5X0xPT0tVUCBhbmQgWDUwOV9JTkZPIGNvZGUgdG8gaGFuZGxlCiAgICAgY2VydGlmaWNhdGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciA0MCBhbmQgNjQgYml0IFJDMiBhbmQgUkM0IGFsZ29yaXRobXM6IGRvY3VtZW50CiAgICAgdGhlICdlbmMnIGNvbW1hbmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIG1lbW9yeSBsZWFrCiAgICAgZGV0ZWN0aW5nIG91dHB1dCwgdG8gZm9ybSB0cmFjZWJhY2tzLCBzaG93aW5nIGZyb20gd2hlcmUgZWFjaAogICAgIGFsbG9jYXRpb24gd2FzIG9yaWdpbmF0ZWQ6IENSWVBUT19wdXNoX2luZm8oImNvbnN0YW50IHN0cmluZyIpIGFkZHMKICAgICB0aGUgc3RyaW5nIHBsdXMgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvIGEgcGVyLXRocmVhZAogICAgIHN0YWNrLCBDUllQVE9fcG9wX2luZm8oKSBkb2VzIHRoZSBvYnZpb3VzLCBDUllQVE9fcmVtb3ZlX2FsbF9pbmZvKCkKICAgICBpcyBsaWtlIGNhbGxpbmcgQ1lSUFRPX3BvcF9pbmZvKCkgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LgogICAgIEFsc28gdXBkYXRlZCBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSB0byBiZSBtdWx0aS10aHJlYWQtc2FmZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgb3B0aW9ucyAtdGV4dCBhbmQgLW5vb3V0IHRvIHBrY3M3IHV0aWxpdHkgYW5kIGRlbGV0ZSB0aGUKICAgICBlbmNyeXB0aW9uIG9wdGlvbnMgd2hpY2ggbmV2ZXIgZGlkIGFueXRoaW5nLiBVcGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9ucyB0byBzb21lIG9mIHRoZSB1dGlsaXRpZXMgdG8gYWxsb3cgdGhlIHBhc3MgcGhyYXNlCiAgICAgdG8gYmUgaW5jbHVkZWQgb24gZWl0aGVyIHRoZSBjb21tYW5kIGxpbmUgKG5vdCByZWNvbW1lbmRlZCBvbgogICAgIE9TZXMgbGlrZSBVbml4KSBvciByZWFkIGZyb20gdGhlIGVudmlyb25tZW50LiBVcGRhdGUgdGhlCiAgICAgbWFucGFnZXMgYW5kIGZpeCBhIGZldyBidWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZldyBtYW5wYWdlcyBmb3Igc29tZSBvZiB0aGUgb3BlbnNzbCBjb21tYW5kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIC1yZXZva2Ugb3B0aW9uIGluIGNhLiBJdCB3YXMgZnJlZWluZyB1cCBtZW1vcnkgdHdpY2UsCiAgICAgbGVha2luZyBhbmQgbm90IGZpbmRpbmcgYWxyZWFkeSByZXZva2VkIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgY2hhbmdlcyB0byBzdXBwb3J0IGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBUaGlzIGludm9sdmVzIHRoZSB1c2Ugb2YgWDUwOV9DRVJUX0FVWCBzdHJ1Y3R1cmUgYW5kIFg1MDlfQVVYCiAgICAgZnVuY3Rpb25zLiBBbiBYNTA5X0FVWCBmdW5jdGlvbiBzdWNoIGFzIFBFTV9yZWFkX1g1MDlfQVVYKCkKICAgICBjYW4gc3RpbGwgcmVhZCBpbiBhIGNlcnRpZmljYXRlIGZpbGUgaW4gdGhlIHVzdWFsIHdheSBidXQgaXQKICAgICB3aWxsIGFsc28gcmVhZCBpbiBhbnkgYWRkaXRpb25hbCAiYXV4aWxpYXJ5IGluZm9ybWF0aW9uIi4gQnkKICAgICBkb2luZyB0aGluZ3MgdGhpcyB3YXkgYSBmYWlyIGRlZ3JlZSBvZiBjb21wYXRpYmlsaXR5IGNhbiBiZQogICAgIHJldGFpbmVkOiBleGlzdGluZyBjZXJ0aWZpY2F0ZXMgY2FuIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBhZGRlZAogICAgIHVzaW5nIHRoZSBuZXcgJ3g1MDknIG9wdGlvbnMuIAoKICAgICBDdXJyZW50IGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhbiAiYWxpYXMiIGFuZCBzb21lIHRydXN0CiAgICAgc2V0dGluZ3MuIFRoZSB0cnVzdCBzZXR0aW5ncyB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBpbiBlbmhhbmNlZAogICAgIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmaWNhdGlvbiByb3V0aW5lczogY3VycmVudGx5IGEgY2VydGlmaWNhdGUKICAgICBjYW4gb25seSBiZSB0cnVzdGVkIGlmIGl0IGlzIHNlbGYgc2lnbmVkIGFuZCB0aGVuIGl0IGlzIHRydXN0ZWQKICAgICBmb3IgYWxsIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhc3NlbWJsZXIgZm9yIEFscGhhICh0ZXN0ZWQgb25seSBvbiBERUMgT1NGIG5vdCBMaW51eCBvciAqQlNEKS4KICAgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbmUgb2YgdGhlIHJlcGxhY2VtZW50IHJvdXRpbmVzIGhhZCBub3QgYmVlbiB3b3JraW5nCiAgICAgc2luY2UgU1NMZWF5IHJlbGVhc2VzLiAgRm9yIG5vdyB0aGUgb2ZmZW5kaW5nIHJvdXRpbmUgaGFzIGJlZW4gcmVwbGFjZWQKICAgICB3aXRoIG5vbi1vcHRpbWlzZWQgYXNzZW1ibGVyLiAgRXZlbiBzbywgdGhpcyBub3cgZ2l2ZXMgYXJvdW5kIDk1JQogICAgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciAxMDI0IGJpdCBSU0Egc2lnbnMuCiAgICAgW01hcmsgQ294XQoKICAqKSBIYWNrIHRvIGZpeCBQS0NTIzcgZGVjcnlwdGlvbiB3aGVuIHVzZWQgd2l0aCBzb21lIHVub3J0aG9kb3ggUkMyIAogICAgIGhhbmRsaW5nLiBNb3N0IGNsaWVudHMgaGF2ZSB0aGUgZWZmZWN0aXZlIGtleSBzaXplIGluIGJpdHMgZXF1YWwgdG8KICAgICB0aGUga2V5IGxlbmd0aCBpbiBiaXRzOiBzbyBhIDQwIGJpdCBSQzIga2V5IHVzZXMgYSA0MCBiaXQgKDUgYnl0ZSkga2V5LgogICAgIEEgZmV3IGhvd2V2ZXIgZG9uJ3QgZG8gdGhpcyBhbmQgaW5zdGVhZCB1c2UgdGhlIHNpemUgb2YgdGhlIGRlY3J5cHRlZCBrZXkKICAgICB0byBkZXRlcm1pbmUgdGhlIFJDMiBrZXkgbGVuZ3RoIGFuZCB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciB0byBkZXRlcm1pbmUKICAgICB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGguIEluIHRoaXMgY2FzZSB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGggY2FuIHN0aWxsCiAgICAgYmUgNDAgYml0cyBidXQgdGhlIGtleSBsZW5ndGggY2FuIGJlIDE2OCBiaXRzIGZvciBleGFtcGxlLiBUaGlzIGlzIGZpeGVkCiAgICAgYnkgbWFudWFsbHkgZm9yY2luZyBhbiBSQzIga2V5IGludG8gdGhlIEVWUF9QS0VZIHN0cnVjdHVyZSBiZWNhdXNlIHRoZQogICAgIEVWUCBjb2RlIGNhbid0IGN1cnJlbnRseSBoYW5kbGUgdW51c3VhbCBSQzIga2V5IHNpemVzOiBpdCBhbHdheXMgYXNzdW1lcwogICAgIHRoZSBrZXkgbGVuZ3RoIGFuZCBlZmZlY3RpdmUga2V5IGxlbmd0aCBhcmUgZXF1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiAKICAgICBYNTA5X05BTUUgc3RydWN0dXJlcy4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbzoKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgIkNOIiwgTUJTVFJJTkdfQVNDLCAiU3RldmUiLCAtMSwgLTEsIDApOwogICAgIGFuZCBoYXZlIGl0IGF1dG9tYXRpY2FsbHkgd29yayBvdXQgdGhlIGNvcnJlY3QgZmllbGQgdHlwZSBhbmQgZmlsbCBpbgogICAgIHRoZSBzdHJ1Y3R1cmVzLiBUaGUgbW9yZSBhZHZlbnR1cm91cyBjYW4gdHJ5OgogICAgIFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLCBmaWVsZCwgTUJTVFJJTkdfVVRGOCwgc3RyLCAtMSwgLTEsIDApOwogICAgIGFuZCBpdCB3aWxsIChob3BlZnVsbHkpIHdvcmsgb3V0IHRoZSBjb3JyZWN0IG11bHRpYnl0ZSBlbmNvZGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlICdyZXEnIHV0aWxpdHkgdG8gdXNlIHRoZSBuZXcgZmllbGQgaGFuZGxpbmcgYW5kIG11bHRpYnl0ZQogICAgIGNvcHkgcm91dGluZXMuIEJlZm9yZSB0aGUgRE4gZmllbGQgY3JlYXRpb24gd2FzIGhhbmRsZWQgaW4gYW4gYWQgaG9jCiAgICAgd2F5IGluIHJlcSwgY2EsIGFuZCB4NTA5IHdoaWNoIHdhcyByYXRoZXIgYnJva2VuIGFuZCBkaWRuJ3Qgc3VwcG9ydAogICAgIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MuIFNpbmNlIHNvbWUgc29mdHdhcmUgZG9lc24ndCBpbXBsZW1lbnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzIHlldCwgdGhleSBjYW4gYmUgZW5hYmxlZCB1c2luZyB0aGUgY29uZmlnIGZpbGUKICAgICB1c2luZyB0aGUgZGlyc3RyaW5nX3R5cGUgb3B0aW9uLiBTZWUgdGhlIG5ldyBjb21tZW50IGluIHRoZSBkZWZhdWx0CiAgICAgb3BlbnNzbC5jbmYgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGNyeXB0by9yYW5kL21kX3JhbmQuYyBtb3JlIHJvYnVzdDoKICAgICAtIEFzc3VyZSB1bmlxdWUgcmFuZG9tIG51bWJlcnMgYWZ0ZXIgZm9yaygpLgogICAgIC0gTWFrZSBzdXJlIHRoYXQgY29uY3VycmVudCB0aHJlYWRzIGFjY2VzcyB0aGUgZ2xvYmFsIGNvdW50ZXIgYW5kCiAgICAgICBtZCBzZXJpYWxpemFibHkgc28gdGhhdCB3ZSBuZXZlciBsb3NlIGVudHJvcHkgaW4gdGhlbQogICAgICAgb3IgdXNlIGV4YWN0bHkgdGhlIHNhbWUgc3RhdGUgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICAgIEFjY2VzcyB0byB0aGUgbGFyZ2Ugc3RhdGUgaXMgbm90IGFsd2F5cyBzZXJpYWxpemFibGUgYmVjYXVzZQogICAgICAgdGhlIGFkZGl0aW9uYWwgbG9ja2luZyBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGtpbGxlciwgYW5kCiAgICAgICBtZCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGFueXdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZmlsZSBhcHBzL2FwcF9yYW5kLmMgd2l0aCBjb21tb25seSBuZWVkZWQgZnVuY3Rpb25hbGl0eQogICAgIGZvciBoYW5kbGluZyB0aGUgcmFuZG9tIHNlZWQgZmlsZS4KCiAgICAgVXNlIHRoZSByYW5kb20gc2VlZCBmaWxlIGluIHNvbWUgYXBwbGljYXRpb25zIHRoYXQgcHJldmlvdXNseSBkaWQgbm90OgogICAgICAgICAgY2EsCiAgICAgICAgICBkc2FwYXJhbSAtZ2Vua2V5ICh3aGljaCBhbHNvIGlnbm9yZWQgaXRzICctcmFuZCcgb3B0aW9uKSwgCiAgICAgICAgICBzX2NsaWVudCwKICAgICAgICAgIHNfc2VydmVyLAogICAgICAgICAgeDUwOSAod2hlbiBzaWduaW5nKS4KICAgICBFeGNlcHQgb24gc3lzdGVtcyB3aXRoIC9kZXYvdXJhbmRvbSwgaXQgaXMgY3J1Y2lhbCB0byBoYXZlIGEgcmFuZG9tCiAgICAgc2VlZCBmaWxlIGF0IGxlYXN0IGZvciBrZXkgY3JlYXRpb24sIERTQSBzaWduaW5nLCBhbmQgZm9yIERIIGV4Y2hhbmdlczsKICAgICBmb3IgUlNBIHNpZ25hdHVyZXMgd2UgY291bGQgZG8gd2l0aG91dCBvbmUuCgogICAgIGdlbmRoIGFuZCBnZW5kc2EgKHVubGlrZSBnZW5yc2EpIHVzZWQgdG8gcmVhZCBvbmx5IHRoZSBmaXJzdCBieXRlCiAgICAgb2YgZWFjaCBmaWxlIGxpc3RlZCBpbiB0aGUgJy1yYW5kJyBvcHRpb24uICBUaGUgZnVuY3Rpb24gYXMgcHJldmlvdXNseQogICAgIGZvdW5kIGluIGdlbnJzYSBpcyBub3cgaW4gYXBwX3JhbmQuYyBhbmQgaXMgdXNlZCBieSBhbGwgcHJvZ3JhbXMKICAgICB0aGF0IHN1cHBvcnQgJy1yYW5kJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBSQU5EX3dyaXRlX2ZpbGUsIHVzZSBtb2RlIDA2MDAgZm9yIGNyZWF0aW5nIGZpbGVzOwogICAgIGRvbid0IGp1c3QgY2htb2Qgd2hlbiBpdCBtYXkgYmUgdG9vIGxhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwb3J0IGFuIGVycm9yIGZyb20gWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucwogICAgIHdoZW4gWDUwOV9MT09LVVBfbG9hZF9maWxlIG9yIFg1MDlfTE9PS1VQX2FkZF9kaXIgZmFpbGVkLgogICAgIFtCaWxsIFBlcnJ5XQoKICAqKSBOZXcgZnVuY3Rpb24gQVNOMV9tYnN0cmluZ19jb3B5KCkgdGhpcyBjb3BpZXMgYSBzdHJpbmcgaW4gZWl0aGVyCiAgICAgQVNDSUksIFVuaWNvZGUsIFVuaXZlcnNhbCAoNCBieXRlcyBwZXIgY2hhcmFjdGVyKSBvciBVVEY4IGZvcm1hdAogICAgIGludG8gYW4gQVNOMV9TVFJJTkcgdHlwZS4gQSBtYXNrIG9mIHBlcm1pc3NpYmxlIHR5cGVzIGlzIHBhc3NlZAogICAgIGFuZCBpdCBjaG9vc2VzIHRoZSAibWluaW1hbCIgdHlwZSB0byB1c2Ugb3IgYW4gZXJyb3IgaWYgbm90IHR5cGUKICAgICBpcyBzdWl0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb24gZXF1aXZhbGVudHMgdG8gdGhlIHZhcmlvdXMgbWFjcm9zIGluIGFzbjEuaC4gVGhlIG9sZAogICAgIG1hY3JvcyBhcmUgcmV0YWluZWQgd2l0aCBhbiBNXyBwcmVmaXguIENvZGUgaW5zaWRlIHRoZSBsaWJyYXJ5IGNhbgogICAgIHVzZSB0aGUgTV8gbWFjcm9zLiBFeHRlcm5hbCBjb2RlIChpbmNsdWRpbmcgdGhlIG9wZW5zc2wgdXRpbGl0eSkKICAgICBzaG91bGQgKk5PVCogaW4gb3JkZXIgdG8gYmUgInNoYXJlZCBsaWJyYXJ5IGZyaWVuZGx5Ii4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCBjYW4gY2hlY2sgYSBjZXJ0aWZpY2F0ZSdzIGV4dGVuc2lvbnMKICAgICB0byBzZWUgaWYgaXQgdXNhYmxlIGZvciB2YXJpb3VzIHB1cnBvc2VzIHN1Y2ggYXMgU1NMIGNsaWVudCwKICAgICBzZXJ2ZXIgb3IgUy9NSU1FIGFuZCBDQXMgb2YgdGhlc2UgdHlwZXMuIFRoaXMgaXMgY3VycmVudGx5IAogICAgIFZFUlkgRVhQRVJJTUVOVEFMIGJ1dCB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBmb3IgY2VydGlmaWNhdGUgY2hhaW4KICAgICB2ZXJpZmljYXRpb24uIEFsc28gYWRkZWQgYSAtcHVycG9zZSBmbGFnIHRvIHg1MDkgdXRpbGl0eSB0bwogICAgIHByaW50IG91dCBhbGwgdGhlIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIENSWVBUT19FWF9EQVRBIHRvIFg1MDkgY2VydGlmaWNhdGUgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBYNTA5VjNfe1g1MDksQ1JMLFJFVk9LRUR9X2dldF9kMmkoKSBmdW5jdGlvbnMuIFRoZXNlIHdpbGwgc2VhcmNoCiAgICAgZm9yLCBvYnRhaW4gYW5kIGRlY29kZSBhbmQgZXh0ZW5zaW9uIGFuZCBvYnRhaW4gaXRzIGNyaXRpY2FsIGZsYWcuCiAgICAgVGhpcyBhbGxvd3MgYWxsIHRoZSBuZWNlc3NhcnkgZXh0ZW5zaW9uIGNvZGUgdG8gYmUgaGFuZGxlZCBpbiBhCiAgICAgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUkM0IHR1bmUtdXAgZmVhdHVyaW5nIDMwLTQwJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiBtb3N0IFJJU0MKICAgICBwbGF0Zm9ybXMuIFNlZSBjcnlwdG8vcmM0L3JjNF9lbmMuYyBmb3IgZnVydGhlciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBOZXcgLW5vb3V0IG9wdGlvbiB0byBhc24xcGFyc2UuIFRoaXMgY2F1c2VzIG5vIG91dHB1dCB0byBiZSBwcm9kdWNlZAogICAgIGl0cyBtYWluIHVzZSBpcyB3aGVuIGNvbWJpbmVkIHdpdGggLXN0cnBhcnNlIGFuZCAtb3V0IHRvIGV4dHJhY3QgZGF0YQogICAgIGZyb20gYSBmaWxlICh3aGljaCBtYXkgbm90IGJlIGluIEFTTi4xIGZvcm1hdCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBwa2NzMTIgcHJvZ3JhbS4gSXQgd2FzIGhhc2hpbmcgYW4gaW52YWxpZCBjZXJ0aWZpY2F0ZSBwb2ludGVyCiAgICAgd2hlbiBwcm9kdWNpbmcgdGhlIGxvY2FsIGtleSBpZC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgTmV3IG9wdGlvbiAtZGhwYXJhbSBpbiBzX3NlcnZlci4gVGhpcyBhbGxvd3MgYSBESCBwYXJhbWV0ZXIgZmlsZSB0byBiZQogICAgIHN0YXRlZCBleHBsaWNpdGx5LiBJZiBpdCBpcyBub3Qgc3RhdGVkIHRoZW4gaXQgdHJpZXMgdGhlIGZpcnN0IHNlcnZlcgogICAgIGNlcnRpZmljYXRlIGZpbGUuIFRoZSBwcmV2aW91cyBiZWhhdmlvdXIgaGFyZCBjb2RlZCB0aGUgZmlsZW5hbWUKICAgICAic2VydmVyLnBlbSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1wdWJpbiBhbmQgLXB1Ym91dCBvcHRpb25zIHRvIHRoZSByc2EgYW5kIGRzYSBjb21tYW5kcy4gVGhlc2UgYWxsb3cKICAgICBhIHB1YmxpYyBrZXkgdG8gYmUgaW5wdXQgb3Igb3V0cHV0LiBGb3IgZXhhbXBsZToKICAgICBvcGVuc3NsIHJzYSAtaW4ga2V5LnBlbSAtcHVib3V0IC1vdXQgcHVia2V5LnBlbQogICAgIEFsc28gYWRkZWQgbmVjZXNzYXJ5IERTQSBwdWJsaWMga2V5IGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggc28gUEtDUzdfZGF0YVZlcmlmeSgpIGRvZXNuJ3QgY3Jhc2ggaWYgbm8gY2VydGlmaWNhdGVzIGFyZSBjb250YWluZWQKICAgICBpbiB0aGUgbWVzc2FnZS4gVGhpcyB3YXMgaGFuZGxlZCBieSBhbGxvd2luZwogICAgIFg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbCgpIHRvIHRvbGVyYXRlIGEgTlVMTCBwYXNzZWQgdG8gaXQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgU2FtcG8gS2VsbG9tYWtpIDxzYW1wb0BtYWlsLm5ldXJvbmlvLnB0Pl0KCiAgKikgRml4IGZvciBidWcgaW4gZDJpX0FTTjFfYnl0ZXMoKTogb3RoZXIgQVNOMSBmdW5jdGlvbnMgYWRkIGFuIGV4dHJhIG51bGwKICAgICB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmdzIHdoZXJlYXMgdGhpcyBkaWRuJ3QuIFRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMKICAgICBpZiBzdHJpbmdzIHJlYWQgd2l0aCBkMmlfQVNOMV9ieXRlcygpIHdlcmUgbGF0ZXIgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IGZvciBiYXNlNjQgZGVjb2RlIGJ1Zy4gV2hlbiBhIGJhc2U2NCBiaW8gcmVhZHMgb25seSBvbmUgbGluZSBvZgogICAgIGRhdGEgYW5kIGl0IGNvbnRhaW5zIEVPRiBpdCB3aWxsIGVuZCB1cCByZXR1cm5pbmcgYW4gZXJyb3IuIFRoaXMgaXMKICAgICBjYXVzZWQgYnkgaW5wdXQgNDYgYnl0ZXMgbG9uZy4gVGhlIGNhdXNlIGlzIGR1ZSB0byB0aGUgd2F5IGJhc2U2NAogICAgIEJJT3MgZmluZCB0aGUgc3RhcnQgb2YgYmFzZTY0IGVuY29kZWQgZGF0YS4gVGhleSBkbyB0aGlzIGJ5IHRyeWluZyBhCiAgICAgdHJpYWwgZGVjb2RlIG9uIGVhY2ggbGluZSB1bnRpbCB0aGV5IGZpbmQgb25lIHRoYXQgd29ya3MuIFdoZW4gdGhleQogICAgIGRvIGEgZmxhZyBpcyBzZXQgYW5kIGl0IHN0YXJ0cyBhZ2FpbiBrbm93aW5nIGl0IGNhbiBwYXNzIGFsbCB0aGUKICAgICBkYXRhIGRpcmVjdGx5IHRocm91Z2ggdGhlIGRlY29kZXIuIFVuZm9ydHVuYXRlbHkgaXQgZG9lc24ndCByZXNldAogICAgIHRoZSBjb250ZXh0IGl0IHVzZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiBFT0YgaXMgcmVhY2hlZCBhbiBhdHRlbXB0CiAgICAgaXMgbWFkZSB0byBwYXNzIHR3byBFT0ZzIHRocm91Z2ggdGhlIGNvbnRleHQgYW5kIHRoaXMgY2F1c2VzIHRoZQogICAgIHJlc3VsdGluZyBlcnJvci4gVGhpcyBjYW4gYWxzbyBjYXVzZSBvdGhlciBwcm9ibGVtcyBhcyB3ZWxsLiBBcyBpcwogICAgIHVzdWFsIHdpdGggdGhlc2UgcHJvYmxlbXMgaXQgdGFrZXMgKmFnZXMqIHRvIGZpbmQgYW5kIHRoZSBmaXggaXMKICAgICB0cml2aWFsOiBtb3ZlIG9uZSBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IGlhbkB1bnMubnMuYWMueXUgKEl2YW4gTmVqZ2ViYXVlcikgXQoKICAqKSBVZ2x5IHdvcmthcm91bmQgdG8gZ2V0IHNfY2xpZW50IGFuZCBzX3NlcnZlciB3b3JraW5nIHVuZGVyIFdpbmRvd3MuIFRoZQogICAgIG9sZCBjb2RlIHdvdWxkbid0IHdvcmsgYmVjYXVzZSBpdCBuZWVkZWQgdG8gc2VsZWN0KCkgb24gc29ja2V0cyBhbmQgdGhlCiAgICAgdHR5IChmb3Iga2V5cHJlc3NlcyBhbmQgdG8gc2VlIGlmIGRhdGEgY291bGQgYmUgd3JpdHRlbikuIFdpbjMyIG9ubHkKICAgICBzdXBwb3J0cyBzZWxlY3QoKSBvbiBzb2NrZXRzIHNvIHdlIHNlbGVjdCgpIHdpdGggYSAxcyB0aW1lb3V0IG9uIHRoZQogICAgIHNvY2tldHMgYW5kIHRoZW4gc2VlIGlmIGFueSBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIHRvIGJlIHJlYWQsIGlmIG5vbmUKICAgICBhcmUgcHJlc2VudCB0aGVuIHdlIHJldHJ5LCB3ZSBhbHNvIGFzc3VtZSB3ZSBjYW4gYWx3YXlzIHdyaXRlIGRhdGEgdG8KICAgICB0aGUgdHR5LiBUaGlzIGlzbid0IG5pY2UgYmVjYXVzZSB0aGUgY29kZSB0aGVuIGJsb2NrcyB1bnRpbCB3ZSd2ZQogICAgIHJlY2VpdmVkIGEgY29tcGxldGUgbGluZSBvZiBkYXRhIGFuZCBpdCBpcyBlZmZlY3RpdmVseSBwb2xsaW5nIHRoZQogICAgIGtleWJvYXJkIGF0IDFzIGludGVydmFsczogaG93ZXZlciBpdCdzIHF1aXRlIGEgYml0IGJldHRlciB0aGFuIG5vdAogICAgIHdvcmtpbmcgYXQgYWxsIDotKSBBIGRlZGljYXRlZCBXaW5kb3dzIGFwcGxpY2F0aW9uIG1pZ2h0IGhhbmRsZSB0aGlzCiAgICAgd2l0aCBhbiBldmVudCBsb29wIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuIE5vdyB0aGVyZSBhcmUgdHdvIGV4dHJhIG1ldGhvZHMsIHJzYV9zaWduCiAgICAgYW5kIHJzYV92ZXJpZnkuIFdoZW4gdGhlIFJTQV9GTEFHU19TSUdOX1ZFUiBvcHRpb24gaXMgc2V0IHRoZXNlIGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIGFyZSB1c2VkLiBUaGlzIGlzIHVzZWZ1bAogICAgIGlmIHJzYV9wdWJfZGVjKCkgYW5kIHJzYV9wcml2X2VuYygpIGVxdWl2YWxlbnRzIGFyZSBub3QgYXZhaWxhYmxlLgogICAgIEZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKQogICAgIHNob3VsZCAqbm90KiBiZSB1c2VkOiBSU0Ffc2lnbigpIGFuZCBSU0FfdmVyaWZ5KCkgbXVzdCBiZSB1c2VkIGluc3RlYWQuCiAgICAgVGhpcyBuZWNlc3NpdGF0ZWQgdGhlIHN1cHBvcnQgb2YgYW4gZXh0cmEgc2lnbmF0dXJlIHR5cGUgTklEX21kNV9zaGExCiAgICAgZm9yIFNTTCBzaWduYXR1cmVzIGFuZCBtb2RpZmljYXRpb25zIHRvIHRoZSBTU0wgbGlicmFyeSB0byB1c2UgaXQgaW5zdGVhZAogICAgIG9mIGNhbGxpbmcgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC12ZXJpZnkgLUNBZmlsZSBhbmQgLUNBcGF0aCBvcHRpb25zIHRvIHRoZSBjcmwgcHJvZ3JhbSwgdGhlc2UKICAgICB3aWxsIGxvb2t1cCBhIENSTCBpc3N1ZXJzIGNlcnRpZmljYXRlIGFuZCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpbiBhCiAgICAgc2ltaWxhciB3YXkgdG8gdGhlIHZlcmlmeSBwcm9ncmFtLiBUaWR5IHVwIHRoZSBjcmwgcHJvZ3JhbSBzbyBpdAogICAgIG5vIGxvbmdlciBhY2Nlc3NlcyBzdHJ1Y3R1cmVzIGRpcmVjdGx5LiBNYWtlIHRoZSBBU04xIENSTCBwYXJzaW5nIGEgYml0CiAgICAgbGVzcyBzdHJpY3QuIEl0IHdpbGwgbm93IHBlcm1pdCBDUkwgZXh0ZW5zaW9ucyBldmVuIGlmIGl0IGlzIG5vdAogICAgIGEgVjIgQ1JMOiB0aGlzIHdpbGwgYWxsb3cgaXQgdG8gdG9sZXJhdGUgc29tZSBicm9rZW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsaXplIGFsbCBub24tYXV0b21hdGljIHZhcmlhYmxlcyBlYWNoIHRpbWUgb25lIG9mIHRoZSBvcGVuc3NsCiAgICAgc3ViLXByb2dyYW1zIGlzIHN0YXJ0ZWQgKHRoaXMgaXMgbmVjZXNzYXJ5IGFzIHRoZXkgbWF5IGJlIHN0YXJ0ZWQKICAgICBtdWx0aXBsZSB0aW1lcyBmcm9tIHRoZSAiT3BlblNTTD4iIHByb21wdCkuCiAgICAgW0xlbm5hcnQgQmFuZywgQm9kbyBNb2VsbGVyXQoKICAqKSBQcmVsaW1pbmFyeSBjb21waWxhdGlvbiBvcHRpb24gUlNBX05VTEwgd2hpY2ggZGlzYWJsZXMgUlNBIGNyeXB0byB3aXRob3V0CiAgICAgcmVtb3ZpbmcgYWxsIG90aGVyIFJTQSBmdW5jdGlvbmFsaXR5ICh0aGlzIGlzIHdoYXQgTk9fUlNBIGRvZXMpLiBUaGlzCiAgICAgaXMgc28gKGZvciBleGFtcGxlKSB0aG9zZSBpbiB0aGUgVVMgY2FuIGRpc2FibGUgdGhvc2Ugb3BlcmF0aW9ucyBjb3ZlcmVkCiAgICAgYnkgdGhlIFJTQSBwYXRlbnQgd2hpbGUgYWxsb3dpbmcgc3RvcmFnZSBhbmQgcGFyc2luZyBvZiBSU0Ega2V5cyBhbmQgUlNBCiAgICAga2V5IGdlbmVyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTm9uLWNvcHlpbmcgaW50ZXJmYWNlIHRvIEJJTyBwYWlycy4KICAgICAoc3RpbGwgbGFyZ2VseSB1bnRlc3RlZCkKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQU5TMV90YWcyc3RyKCkgdG8gY29udmVydCBhbiBBU04xIHRhZyB0byBhIGRlc2NyaXB0aXZlCiAgICAgQVNDSUkgc3RyaW5nLiBUaGlzIHdhcyBoYW5kbGVkIGluZGVwZW5kZW50bHkgaW4gdmFyaW91cyBwbGFjZXMgYmVmb3JlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgVVRGOF9nZXRjKCkgYW5kIFVURjhfcHV0YygpIHRoYXQgcGFyc2UgYW5kIGdlbmVyYXRlCiAgICAgVVRGOCBzdHJpbmdzIGEgY2hhcmFjdGVyIGF0IGEgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgY2xpZW50X3ZlcnNpb24gZnJvbSBjbGllbnQgaGVsbG8gdG8gc2VsZWN0IHRoZSBwcm90b2NvbAogICAgIChzMjNfc3J2ci5jKSBhbmQgZm9yIFJTQSBjbGllbnQga2V5IGV4Y2hhbmdlIHZlcmlmaWNhdGlvbgogICAgIChzM19zcnZyLmMpLCBhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMuMC9UTFMgMS4wIHNwZWNpZmljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTUEtBQ3MsIHRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgIGhhbmRsZWQgYnkgcG9raW5nIHJvdW5kIGluIHRoZSBzdHJ1Y3R1cmUgaW50ZXJuYWxzLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBORVRTQ0FQRV9TUEtJX3ByaW50KCkgdG8gcHJpbnQgb3V0IFNQS0FDIGFuZCBhIG5ldyB1dGlsaXR5ICdzcGthYycgdG8KICAgICBwcmludCwgdmVyaWZ5IGFuZCBnZW5lcmF0ZSBTUEtBQ3MuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbQogICAgIE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+IGJ1dCBleHRlbnNpdmVseSBtb2RpZmllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSSVBFTUQxNjAgaXMgb3BlcmF0aW9uYWwgb24gYWxsIHBsYXRmb3JtcyBhbmQgaXMgYmFjayBpbiAnbWFrZSB0ZXN0Jy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWxsb3cgdGhlIGNvbmZpZyBmaWxlIGV4dGVuc2lvbiBzZWN0aW9uIHRvIGJlIG92ZXJ3cml0dGVuIG9uIHRoZQogICAgIGNvbW1hbmQgbGluZS4gQmFzZWQgb24gYW4gb3JpZ2luYWwgaWRlYSBmcm9tIE1hc3NpbWlsaWFubyBQYWxhCiAgICAgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD4uIFRoZSBuZXcgb3B0aW9uIGlzIGNhbGxlZCAtZXh0ZW5zaW9ucwogICAgIGFuZCBjYW4gYmUgYXBwbGllZCB0byBjYSwgcmVxIGFuZCB4NTA5LiBBbHNvIC1yZXFleHRzIHRvIG92ZXJyaWRlCiAgICAgdGhlIHJlcXVlc3QgZXh0ZW5zaW9ucyBpbiByZXEgYW5kIC1jcmxleHRzIHRvIG92ZXJyaWRlIHRoZSBjcmwgZXh0ZW5zaW9ucwogICAgIGluIGNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZmVhdHVyZSB0byB0aGUgU1BLQUMgaGFuZGxpbmcgaW4gY2EuICBOb3cgeW91IGNhbiBpbmNsdWRlCiAgICAgdGhlIHNhbWUgZmllbGQgbXVsdGlwbGUgdGltZXMgYnkgcHJlY2VkaW5nIGl0IGJ5ICJYWFhYLiIgZm9yIGV4YW1wbGU6CiAgICAgMS5PVT0iVW5pdCBuYW1lIDEiCiAgICAgMi5PVT0iVW5pdCBuYW1lIDIiCiAgICAgdGhpcyBpcyB0aGUgc2FtZSBzeW50YXggYXMgdXNlZCBpbiB0aGUgcmVxIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgdG8gY2VydGlmaWNhdGUgcmVxdWVzdHMuIFRoZXNlCiAgICAgYXJlIHNwZWNpZmllZCBpbiBhICdyZXFfZXh0ZW5zaW9ucycgb3B0aW9uIG9mIHRoZSByZXEgc2VjdGlvbiBvZiB0aGUKICAgICBjb25maWcgZmlsZS4gVGhleSBjYW4gYmUgcHJpbnRlZCBvdXQgd2l0aCB0aGUgLXRleHQgb3B0aW9uIHRvIHJlcSBidXQKICAgICBhcmUgb3RoZXJ3aXNlIGlnbm9yZWQgYXQgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBob3JyaWJsZSBidWcgaW4gZW5jX3JlYWQoKSBpbiBjcnlwdG8vZXZwL2Jpb19lbmMuYzogaWYgdGhlIGZpcnN0CiAgICAgZGF0YSByZWFkIGNvbnNpc3RzIG9mIG9ubHkgdGhlIGZpbmFsIGJsb2NrIGl0IHdvdWxkIG5vdCBkZWNyeXB0ZWQgYmVjYXVzZQogICAgIEVWUF9DaXBoZXJVcGRhdGUoKSB3b3VsZCBjb3JyZWN0bHkgcmVwb3J0IHplcm8gYnl0ZXMgaGFkIGJlZW4gZGVjcnlwdGVkLgogICAgIEEgbWlzcGxhY2VkICdicmVhaycgYWxzbyBtZWFudCB0aGUgZGVjcnlwdGVkIGZpbmFsIGJsb2NrIG1pZ2h0IG5vdCBiZQogICAgIGNvcGllZCB1bnRpbCB0aGUgbmV4dCByZWFkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgREhfTUVUSE9ELiBBZ2FpbiBiYXNlZCBvbiBSU0FfTUVUSE9ELiBBbHNvIGFkZGVkCiAgICAgYSBmZXcgZXh0cmEgcGFyYW1ldGVycyB0byB0aGUgREggc3RydWN0dXJlOiB0aGVzZSB3aWxsIGJlIHVzZWZ1bCBpZgogICAgIGZvciBleGFtcGxlIHdlIHdhbnQgdGhlIHZhbHVlIG9mICdxJyBvciBpbXBsZW1lbnQgWDkuNDIgREguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBEU0FfTUVUSE9ELiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBSU0FfTUVUSE9EIGFuZAogICAgIHByb3ZpZGVzIGhvb2tzIHRoYXQgYWxsb3cgdGhlIGRlZmF1bHQgRFNBIGZ1bmN0aW9ucyBvciBmdW5jdGlvbnMgb24gYQogICAgICJwZXIga2V5IiBiYXNpcyB0byBiZSByZXBsYWNlZC4gVGhpcyBhbGxvd3MgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGFuZAogICAgIGhhcmR3YXJlIGtleSBzdG9yYWdlIHRvIGJlIGhhbmRsZWQgd2l0aG91dCBtYWpvciBtb2RpZmljYXRpb24gdG8gdGhlCiAgICAgbGlicmFyeS4gQWxzbyBhZGRlZCBsb3cgbGV2ZWwgbW9kZXhwIGhvb2tzIGFuZCBDUllQVE9fRVggc3RydWN0dXJlIGFuZCAKICAgICBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZmxhZyB0byBtZW1vcnkgQklPcywgQklPX0ZMQUdfTUVNX1JET05MWS4gVGhpcyBtYXJrcyB0aGUgQklPCiAgICAgYXMgInJlYWQgb25seSI6IGl0IGNhbid0IGJlIHdyaXR0ZW4gdG8gYW5kIHRoZSBidWZmZXIgaXQgcG9pbnRzIHRvIHdpbGwKICAgICBub3QgYmUgZnJlZWQuIFJlYWRpbmcgZnJvbSBhIHJlYWQgb25seSBCSU8gaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuCiAgICAgYSBub3JtYWwgbWVtb3J5IEJJTy4gVGhpcyB3YXMgYWRkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc2V2ZXJhbCB0aW1lcyB3aGVuCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIGEgQklPLiBUaGUgcHJldmlvdXMgbWV0aG9kIHdhcwogICAgIHRvIGNyZWF0ZSBhIG1lbW9yeSBCSU8gYW5kIHdyaXRlIHRoZSBkYXRhIHRvIGl0LCB0aGlzIHJlc3VsdHMgaW4gdHdvCiAgICAgY29waWVzIG9mIHRoZSBkYXRhIGFuZCBhbiBPKG5eMikgcmVhZGluZyBhbGdvcml0aG0uIFRoZXJlIGlzIGEgbmV3CiAgICAgZnVuY3Rpb24gQklPX25ld19tZW1fYnVmKCkgd2hpY2ggY3JlYXRlcyBhIHJlYWQgb25seSBtZW1vcnkgQklPIGZyb20KICAgICBhbiBhcmVhIG9mIG1lbW9yeS4gQWxzbyBtb2RpZmllZCB0aGUgUEtDUyM3IHJvdXRpbmVzIHRvIHVzZSByZWFkIG9ubHkKICAgICBtZW1vcnkgQklPcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWdmaXg6IHNzbDIzX2dldF9jbGllbnRfaGVsbG8gZGlkIG5vdCB3b3JrIHByb3Blcmx5IHdoZW4gY2FsbGVkIGluCiAgICAgc3RhdGUgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19CLCBpLmUuIHdoZW4gdGhlIGZpcnN0IDcgYnl0ZXMgb2YKICAgICBhIFNTTHYyLWNvbXBhdGlibGUgY2xpZW50IGhlbGxvIGZvciBTU0x2MyBvciBUTFN2MSBjb3VsZCBiZSByZWFkLAogICAgIGJ1dCBhIHJldHJ5IGNvbmRpdGlvbiBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSByZXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBQS0NTN19FTkNfQ09OVEVOVF9uZXcoKSBmdW5jdGlvbiB3YXMgc2V0dGluZyB0aGUgY29udGVudCB0eXBlIGFzCiAgICAgTklEX3BrY3M3X2VuY3J5cHRlZCBieSBkZWZhdWx0OiB0aGlzIHdhcyB3cm9uZyBzaW5jZSB0aGlzIHNob3VsZCBhbG1vc3QKICAgICBhbHdheXMgYmUgTklEX3BrY3M3X2RhdGEuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1M3X3NldF90eXBlKCkgdG8gaGFuZGxlCiAgICAgdGhlIGVuY3J5cHRlZCBkYXRhIHR5cGU6IHRoaXMgaXMgYSBtb3JlIHNlbnNpYmxlIHBsYWNlIHRvIHB1dCBpdCBhbmQgaXQKICAgICBhbGxvd3MgdGhlIFBLQ1MjMTIgY29kZSB0byBiZSB0aWRpZWQgdXAgdGhhdCBkdXBsaWNhdGVkIHRoaXMKICAgICBmdW5jdGlvbmFsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZWQgb2JqX2RhdC5wbCBzY3JpcHQgc28gaXQgdGFrZXMgaXRzIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgb24KICAgICB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIHNob3VsZCBhdm9pZCBzaGVsbCBlc2NhcGUgcmVkaXJlY3Rpb24gcHJvYmxlbXMKICAgICB1bmRlciBXaW4zMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbiByZXF1ZXN0cywgdGhlc2UgYXJlIGluY2x1ZGVkCiAgICAgaW4gdGhpbmdzIGxpa2UgWGVucm9sbCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gSW5jbHVkZWQgZnVuY3Rpb25zIHRvIGFsbG93CiAgICAgZXh0ZW5zaW9ucyB0byBiZSBvYnRhaW5lZCBhbmQgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLWNybGYgb3B0aW9uIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlciBmb3Igc2VuZGluZyBuZXdsaW5lcyBhcwogICAgIENSTEYgKGFzIHJlcXVpcmVkIGJ5IG1hbnkgcHJvdG9jb2xzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuM2EgYW5kIDAuOS40ICBbMDkgQXVnIDE5OTldCiAgCiAgKikgSW5zdGFsbCBsaWJSU0FnbHVlLmEgd2hlbiBPcGVuU1NMIGlzIGJ1aWx0IHdpdGggUlNBcmVmLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIGZldyBtb3JlIGBgI2lmbmRlZiBOT19GUF9BUEkgLyAjZW5kaWYnJyBwYWlycyBmb3IgY29uc2lzdGVuY3kuCiAgICAgW0FuZHJpamEgQW50b25pamV2aWMgPFRoZUFudG9ueTJAYmlnZm9vdC5jb20+XQoKICAqKSBGaXggLXN0YXJ0ZGF0ZSBhbmQgLWVuZGRhdGUgKHdoaWNoIHdhcyBtaXNzaW5nKSBhcmd1bWVudHMgdG8gJ2NhJwogICAgIHByb2dyYW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIERTQV9kdXBfREgsIHdoaWNoIGR1cGxpY2F0ZXMgRFNBIHBhcmFtZXRlcnMva2V5cyBhcwogICAgIERIIHBhcmFtZXRlcnMva2V5cyAocSBpcyBsb3N0IGR1cmluZyB0aGF0IGNvbnZlcnNpb24sIGJ1dCB0aGUgcmVzdWx0aW5nCiAgICAgREggcGFyYW1ldGVycyBjb250YWluIGl0cyBsZW5ndGgpLgoKICAgICBGb3IgMTAyNC1iaXQgcCwgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgZm9sbG93ZWQgYnkgRFNBX2R1cF9ESCBpcwogICAgIG11Y2ggZmFzdGVyIHRoYW4gREhfZ2VuZXJhdGVfcGFyYW1ldGVycyAod2hpY2ggY3JlYXRlcyBwYXJhbWV0ZXJzCiAgICAgd2hlcmUgcCA9IDIqcSArIDEpLCBhbmQgYWxzbyB0aGUgc21hbGxlciBxIG1ha2VzIERIIGNvbXB1dGF0aW9ucwogICAgIG11Y2ggbW9yZSBlZmZpY2llbnQgKDE2MC1iaXQgZXhwb25lbnRpYXRpb24gaW5zdGVhZCBvZiAxMDI0LWJpdAogICAgIGV4cG9uZW50aWF0aW9uKTsgc28gdGhpcyBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHN1cHBvcnQgREhFCiAgICAgY2lwaGVyc3VpdGVzIGluIFNTTC9UTFMgc2VydmVycyAoc2VlIHNzbC9zc2x0ZXN0LmMpLiAgSXQgaXMgb2YKICAgICB1dHRlciBpbXBvcnRhbmNlIHRvIHVzZQogICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgb3IKICAgICAgICAgU1NMX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgd2hlbiBzdWNoIERIIHBhcmFtZXRlcnMgYXJlIHVzZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHNtYWxsIHN1Ymdyb3VwCiAgICAgYXR0YWNrcyBtYXkgYmVjb21lIHBvc3NpYmxlIQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIG1lbW9yeSBsZWFrIGluIGkyZF9ESHBhcmFtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyB0aGUgLWsgb3B0aW9uIHRvIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGVuYyBwcm9ncmFtOgogICAgIHRoaXMgYWxsb3dzIHRoZSBzYW1lIGVuY3J5cHRlZCBtZXNzYWdlIHRvIGJlIHJlYWQgYnkgbXVsdGlwbGUgcmVjaXBpZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0JKX29iajJ0eHQoYnVmLCBidWZfbGVuLCBhLCBub19uYW1lKSwgdGhpcyBjb252ZXJ0cwogICAgIGFuIEFTTjFfT0JKRUNUIHRvIGEgdGV4dCBzdHJpbmcuIElmIHRoZSAibm9fbmFtZSIgcGFyYW1ldGVyIGlzIHNldCB0aGVuCiAgICAgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBudW1lcmljYWwgZm9ybSBvZiB0aGUgT0lELCBldmVuIGlmIGl0IGhhcyBhIHNob3J0CiAgICAgb3IgbG9uZyBuYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIGV4dHJhIFJTQSBmbGFnOiBSU0FfRkxBR19FWFRfUEtFWS4gUHJldmlvdXNseSB0aGUgcnNhX21vZF9leHAKICAgICBtZXRob2Qgb25seSBnb3QgY2FsbGVkIGlmIHAscSxkbXAxLGRtcTEsaXFtcCBjb21wb25lbnRzIHdlcmUgcHJlc2VudCwKICAgICBvdGhlcndpc2UgYm5fbW9kX2V4cCB3YXMgY2FsbGVkLiBJbiB0aGUgY2FzZSBvZiBoYXJkd2FyZSBrZXlzIGZvciBleGFtcGxlCiAgICAgbm8gcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBuZWVkIGJlIHByZXNlbnQgYW5kIGl0IG1pZ2h0IHN0b3JlIGV4dHJhIGRhdGEKICAgICBpbiB0aGUgUlNBIHN0cnVjdHVyZSwgd2hpY2ggY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYm5fbW9kX2V4cC4KICAgICBCeSBzZXR0aW5nIFJTQV9GTEFHX0VYVF9QS0VZIHJzYV9tb2RfZXhwIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBmb3IKICAgICBwcml2YXRlIGtleSBvcGVyYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFNQQVJDIExpbnV4LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBwZW1fcGFzc3dvcmRfY2IgZnVuY3Rpb24gdHlwZSBpbmNvbXBhdGlibHkgY2hhbmdlZCBmcm9tCiAgICAgICAgICB0eXBlZGVmIGludCBwZW1fcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZyk7CiAgICAgdG8KICAgICAgICAgIC4uLi4oY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpOwogICAgIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBwYXNzIGRhdGEgdG8gdGhlaXIgY2FsbGJhY2tzOgogICAgIFRoZSBQRU1bX0FTTjFdX3tyZWFkLHdyaXRlfS4uLiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBub3cgdGFrZSBhbgogICAgIGFkZGl0aW9uYWwgdm9pZCAqIGFyZ3VtZW50LCB3aGljaCBpcyBqdXN0IGhhbmRlZCB0aHJvdWdoIHdoZW5ldmVyCiAgICAgdGhlIHBhc3N3b3JkIGNhbGxiYWNrIGlzIGNhbGxlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZG1pbGxlckBpbG9naWMuY29tLmF1PjsgdGlueSBjaGFuZ2VzIGJ5IEJvZG8gTW9lbGxlcl0KCiAgICAgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhLgoKICAgICBDb21wYXRpYmlsaXR5IG5vdGU6IEFzIG1hbnkgQyBpbXBsZW1lbnRhdGlvbnMgcHVzaCBmdW5jdGlvbiBhcmd1bWVudHMKICAgICBvbnRvIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyLCB0aGUgbmV3IGxpYnJhcnkgdmVyc2lvbiBpcyBsaWtlbHkgdG8KICAgICBpbnRlcm9wZXJhdGUgd2l0aCBwcm9ncmFtcyB0aGF0IGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBvbGQKICAgICBwZW1fcGFzc3dvcmRfY2IgZGVmaW5pdGlvbiAoUEVNX3doYXRldmVyIHRha2VzIHNvbWUgZGF0YSB0aGF0CiAgICAgaGFwcGVucyB0byBiZSBvbiB0aGUgc3RhY2sgYXMgaXRzIGxhc3QgYXJndW1lbnQsIGFuZCB0aGUgY2FsbGJhY2sKICAgICBqdXN0IGlnbm9yZXMgdGhpcyBnYXJiYWdlKTsgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB3aGF0c29ldmVyIHRoYXQKICAgICB0aGlzIHdpbGwgd29yay4KCiAgKikgVGhlIC1EUExBVEZPUk09IlwiJChQTEFURk9STSlcIiIgZGVmaW5pdGlvbiBhbmQgdGhlIHNpbWlsYXIgLURDRkxBR1M9Li4uCiAgICAgKGJvdGggaW4gY3J5cHRvL01ha2VmaWxlLnNzbCBmb3IgdXNlIGJ5IGNyeXB0by9jdmVyc2lvbi5jKSBjYXVzZWQKICAgICBwcm9ibGVtcyBub3Qgb25seSBvbiBXaW5kb3dzLCBidXQgYWxzbyBvbiBzb21lIFVuaXggcGxhdGZvcm1zLgogICAgIFRvIGF2b2lkIHByb2JsZW1hdGljIGNvbW1hbmQgbGluZXMsIHRoZXNlIGRlZmluaXRpb25zIGFyZSBub3cgaW4gYW4KICAgICBhdXRvLWdlbmVyYXRlZCBmaWxlIGNyeXB0by9idWlsZGluZi5oIChjcmVhdGVkIGJ5IGNyeXB0by9NYWtlZmlsZS5zc2wKICAgICBmb3Igc3RhbmRhcmQgIm1ha2UiIGJ1aWxkcywgYnkgdXRpbC9tazFtZi5wbCBmb3IgIm1rMW1mIiBidWlsZHMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1JUFMgSUlJL0lWIGFzc2VtYmxlciBtb2R1bGUgaXMgcmVpbXBsZW1lbnRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9yZSBERVMgbGlicmFyeSBjbGVhbnVwczogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gc3JhbmQvcmFuZCBhbmQKICAgICBkZWxldGUgYW4gdW51c2VkIGZpbGUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgdGhlIGZyZWUgTmV0d2lkZSBhc3NlbWJsZXIgKE5BU00pIHVuZGVyIFdpbjMyLAogICAgIHNpbmNlIG5vdCBtYW55IHBlb3BsZSBoYXZlIE1BU00gKG1sKSBhbmQgaXQgY2FuIGJlIGhhcmQgdG8gb2J0YWluLgogICAgIFRoaXMgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbCBidXQgaXQgc2VlbXMgdG8gd29yayBPSyBhbmQgcGFzcyBhbGwKICAgICB0aGUgdGVzdHMuIENoZWNrIG91dCBJTlNUQUxMLlczMiBmb3IgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIHMzX2NsbnQuYzogQWxsIG5vbi1hbm9ueW1vdXMgU1NMMy9UTFMxIGNvbm5lY3Rpb25zCiAgICAgd2l0aG91dCB0ZW1wb3Jhcnkga2V5cyBrZXB0IGFuIGV4dHJhIGNvcHkgb2YgdGhlIHNlcnZlciBrZXksCiAgICAgYW5kIGNvbm5lY3Rpb25zIHdpdGggdGVtcG9yYXJ5IGtleXMgZGlkIG5vdCBmcmVlIGV2ZXJ5dGhpbmcgaW4gY2FzZQogICAgIG9mIGFuIGVycm9yLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBSU0FfY2hlY2tfa2V5IGFuZCBuZXcgb3BlbnNzbCByc2Egb3B0aW9uIC1jaGVjawogICAgIGZvciB2ZXJpZnlpbmcgdGhlIGNvbnNpc3RlbmN5IG9mIFJTQSBrZXlzLgogICAgIFtVbGYgTW9lbGxlciwgQm9kbyBNb2VsbGVyXQoKICAqKSBWYXJpb3VzIGNoYW5nZXMgdG8gbWFrZSBXaW4zMiBjb21waWxlIHdvcms6IAogICAgIDEuIENhc3RzIHRvIGF2b2lkICJsb3NzIG9mIGRhdGEiIHdhcm5pbmdzIGluIHA1X2NycHQyLmMKICAgICAyLiBDaGFuZ2UgdW5zaWduZWQgaW50IHRvIGludCBpbiBiX2R1bXAuYyB0byBhdm9pZCAic2lnbmVkL3Vuc2lnbmVkCiAgICAgICAgY29tcGFyaXNvbiIgd2FybmluZ3MuCiAgICAgMy4gQWRkIHNrXzxUWVBFPl9zb3J0IHRvIERFRiBmaWxlIGdlbmVyYXRvciBhbmQgZG8gbWFrZSB1cGRhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZGVidWdnaW5nIG9wdGlvbiB0byBQS0NTIzUgdjIga2V5IGdlbmVyYXRpb24gZnVuY3Rpb246IHdoZW4KICAgICB5b3UgI2RlZmluZSBERUJVR19QS0NTNVYyIHBhc3N3b3Jkcywgc2FsdHMsIGl0ZXJhdGlvbiBjb3VudHMgYW5kCiAgICAgZGVyaXZlZCBrZXlzIGFyZSBwcmludGVkIHRvIHN0ZGVyci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3B5IHRoZSBmbGFncyBpbiBBU04xX1NUUklOR19kdXAoKS4KICAgICBbUm9tYW4gRS4gUGF2bG92IDxwcmVAbW8ubXNrLnJ1Pl0KCiAgKikgVGhlIHg1MDkgYXBwbGljYXRpb24gbWlzaGFuZGxlZCBzaWduaW5nIHJlcXVlc3RzIGNvbnRhaW5pbmcgRFNBCiAgICAga2V5cyB3aGVuIHRoZSBzaWduaW5nIGtleSB3YXMgYWxzbyBEU0EgYW5kIHRoZSBwYXJhbWV0ZXJzIGRpZG4ndCBtYXRjaC4KCiAgICAgSXQgd2FzIHN1cHBvc2VkIHRvIG9taXQgdGhlIHBhcmFtZXRlcnMgd2hlbiB0aGV5IG1hdGNoZWQgdGhlIHNpZ25pbmcga2V5OgogICAgIHRoZSB2ZXJpZnlpbmcgc29mdHdhcmUgd2FzIHRoZW4gc3VwcG9zZWQgdG8gYXV0b21hdGljYWxseSB1c2UgdGhlIENBJ3MKICAgICBwYXJhbWV0ZXJzIGlmIHRoZXkgd2VyZSBhYnNlbnQgZnJvbSB0aGUgZW5kIHVzZXIgY2VydGlmaWNhdGUuCgogICAgIE9taXR0aW5nIHBhcmFtZXRlcnMgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkLiBUaGUgdGVzdCB3YXMgYWxzbwogICAgIHRoZSB3cm9uZyB3YXkgcm91bmQhIFRoaXMgd2FzIHByb2JhYmx5IGR1ZSB0byB1bnVzdWFsIGJlaGF2aW91ciBpbgogICAgIEVWUF9jbXBfcGFyYW1ldGVycygpIHdoaWNoIHJldHVybnMgMSBpZiB0aGUgcGFyYW1ldGVycyBtYXRjaC4gCiAgICAgVGhpcyBtZWFudCB0aGF0IHBhcmFtZXRlcnMgd2VyZSBvbWl0dGVkIHdoZW4gdGhleSAqZGlkbid0KiBtYXRjaCBhbmQKICAgICB0aGUgY2VydGlmaWNhdGUgd2FzIHVzZWxlc3MuIENlcnRpZmljYXRlcyBzaWduZWQgd2l0aCAnY2EnIGRpZG4ndCBoYXZlCiAgICAgdGhpcyBidWcuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRG91ZyBFcmlja3NvbiA8RG91Zy5Fcmlja3NvbkBQYXJ0Lk5FVD5dCgogICopIE1lbW9yeSBsZWFrIGNoZWNraW5nICgtRENSWVBUT19NREVCVUcpIGhhZCBzb21lIHByb2JsZW1zLgogICAgIFRoZSBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZQogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTikgYWthIE1lbUNoZWNrX3N0YXJ0KCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09GRikgYWthIE1lbUNoZWNrX3N0b3AoKTsKICAgICAib2ZmIiBpcyBub3cgdGhlIGRlZmF1bHQuCiAgICAgVGhlIGxpYnJhcnkgaW50ZXJuYWxseSB1c2VzCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0RJU0FCTEUpIGFrYSBNZW1DaGVja19vZmYoKSwKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRU5BQkxFKSBha2EgTWVtQ2hlY2tfb24oKQogICAgIHRvIGRpc2FibGUgbWVtb3J5LWNoZWNraW5nIHRlbXBvcmFyaWx5LgoKICAgICBTb21lIGluY29uc2lzdGVudCBzdGF0ZXMgdGhhdCBwcmV2aW91c2x5IHdlcmUgcG9zc2libGUgKGFuZCB3ZXJlCiAgICAgZXZlbiB0aGUgZGVmYXVsdCkgYXJlIG5vdyBhdm9pZGVkLgoKICAgICAtRENSWVBUT19NREVCVUdfVElNRSBpcyBuZXcgYW5kIGFkZGl0aW9uYWxseSBzdG9yZXMgdGhlIGN1cnJlbnQgdGltZQogICAgIHdpdGggZWFjaCBtZW1vcnkgY2h1bmsgYWxsb2NhdGVkOyB0aGlzIGlzIG9jY2FzaW9uYWxseSBtb3JlIGhlbHBmdWwKICAgICB0aGFuIGp1c3QgaGF2aW5nIGEgY291bnRlci4KCiAgICAgLURDUllQVE9fTURFQlVHX1RIUkVBRCBpcyBhbHNvIG5ldyBhbmQgYWRkcyB0aGUgdGhyZWFkIElELgoKICAgICAtRENSWVBUT19NREVCVUdfQUxMIGVuYWJsZXMgYWxsIG9mIHRoZSBhYm92ZSwgcGx1cyBhbnkgZnV0dXJlCiAgICAgZXh0ZW5zaW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgIm1vZGUiIGZvciBTU0wgc3RydWN0dXJlcyAod2l0aCBkZWZhdWx0cyBpbiBTU0xfQ1RYKSwKICAgICB3aGljaCBsYXJnZWx5IHBhcmFsbGVscyAib3B0aW9ucyIsIGJ1dCBpcyBmb3IgY2hhbmdpbmcgQVBJIGJlaGF2aW91ciwKICAgICB3aGVyZWFzICJvcHRpb25zIiBhcmUgYWJvdXQgcHJvdG9jb2wgYmVoYXZpb3VyLgogICAgIEluaXRpYWwgIm1vZGUiIGZsYWdzIGFyZToKCiAgICAgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgICBBbGxvdyBTU0xfd3JpdGUgdG8gcmVwb3J0IHN1Y2Nlc3Mgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4uCiAgICAgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIgIERvbid0IGluc2lzdCB0aGF0IFNTTF93cml0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcyB1c2UgdGhlIHNhbWUgYnVmZmVyIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1dCBhbGwgb2YgdGhlIGNvbnRlbnRzIG11c3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCEpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBTU0xfc2V0X29wdGlvbnMgaWdub3JlZCBpdHMgcGFyYW1ldGVyLCBvbmx5IFNTTF9DVFhfc2V0X29wdGlvbnMKICAgICB3b3JrZWQuCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIG5vLWhtYWMgZXRjLgogICAgIFtVbGYgTfZsbGVyLCBwb2ludGVkIG91dCBieSBCcmlhbiBXZWxsaW5ndG9uIDxid2VsbGluZ0B0aXNsYWJzLmNvbT5dCgogICopIE5ldyBmdW5jdGlvbnMgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpLCBSU0Ffc2V0X21ldGhvZCgpIGFuZAogICAgIFJTQV9nZXRfbWV0aG9kKCkuIFRoZXNlIGFsbG93cyByZXBsYWNlbWVudCBvZiBSU0FfTUVUSE9EcyB3aXRob3V0IGhhdmluZwogICAgIHRvIG1lc3MgYXJvdW5kIHdpdGggdGhlIGludGVybmFscyBvZiBhbiBSU0Egc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gRFNBX2RvX3NpZ24gYW5kIERTQV9pc19wcmltZS4KICAgICBBbHNvIHJlYWxseSBlbmFibGUgbWVtb3J5IGxlYWsgY2hlY2tzIGluIG9wZW5zc2wuYyBhbmQgaW4gc29tZQogICAgIHRlc3QgcHJvZ3JhbXMuCiAgICAgW0NoYWQgQy4gTXVsbGlnYW4sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGQyaV9BU04xX0lOVEVHRVIoKSBhbmQgaTJkX0FTTjFfSU5URUdFUigpIHdoaWNoIGNhbiBtZXNzCiAgICAgdXAgdGhlIGxlbmd0aCBvZiBuZWdhdGl2ZSBpbnRlZ2Vycy4gVGhpcyBoYXMgbm93IGJlZW4gc2ltcGxpZmllZCB0byBqdXN0CiAgICAgc3RvcmUgdGhlIGxlbmd0aCB3aGVuIGl0IGlzIGZpcnN0IGRldGVybWluZWQgYW5kIHVzZSBpdCBsYXRlciwgcmF0aGVyCiAgICAgdGhhbiB0cnlpbmcgdG8ga2VlcCB0cmFjayBvZiB3aGVyZSBkYXRhIGlzIGNvcGllZCBhbmQgdXBkYXRpbmcgaXQgdG8KICAgICBwb2ludCB0byB0aGUgZW5kLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEJyaWVuIFdoZWVsZXIKICAgICAgPGJ3aGVlbGVyQGF1dGhlbnRpY2Etc2VjdXJpdHkuY29tPl0KCiAgKikgQWRkIGEgbmV3IGZ1bmN0aW9uIFBLQ1M3X3NpZ25hdHVyZVZlcmlmeS4gVGhpcyBhbGxvd3MgdGhlIHZlcmlmaWNhdGlvbgogICAgIG9mIGEgUEtDUyM3IHNpZ25hdHVyZSBidXQgd2l0aCB0aGUgc2lnbmluZyBjZXJ0aWZpY2F0ZSBwYXNzZWQgdG8gdGhlCiAgICAgZnVuY3Rpb24gaXRzZWxmLiBUaGlzIGNvbnRyYXN0cyB3aXRoIFBLQ1M3X2RhdGFWZXJpZnkgd2hpY2ggYXNzdW1lcyB0aGUKICAgICBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50IGluIHRoZSBQS0NTIzcgc3RydWN0dXJlLiBUaGlzIGlzbid0IGFsd2F5cyB0aGUKICAgICBjYXNlOiBjZXJ0aWZpY2F0ZXMgY2FuIGJlIG9taXR0ZWQgZnJvbSBhIFBLQ1MjNyBzdHJ1Y3R1cmUgYW5kIGJlCiAgICAgZGlzdHJpYnV0ZWQgYnkgIm91dCBvZiBiYW5kIiBtZWFucyAoc3VjaCBhcyBhIGNlcnRpZmljYXRlIGRhdGFiYXNlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb21wbGV0ZSB0aGUgUEVNXyogbWFjcm9zIHdpdGggREVDTEFSRV9QRU0gdmVyc2lvbnMgdG8gcmVwbGFjZSB0aGUKICAgICBmdW5jdGlvbiBwcm90b3R5cGVzIGluIHBlbS5oLCBhbHNvIGNoYW5nZSB1dGlsL21rZGVmLnBsIHRvIGFkZCB0aGUKICAgICBuZWNlc3NhcnkgZnVuY3Rpb24gbmFtZXMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIG1rMW1mLnBsICh1c2VkIGJ5IFdpbmRvd3MgYnVpbGRzKSBkaWQgbm90IHByb3Blcmx5IHJlYWQgdGhlCiAgICAgb3B0aW9ucyBzZXQgYnkgQ29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgTWFrZWZpbGUsIGFuZCBDb25maWd1cmUKICAgICB3YXMgbm90IGV2ZW4gYWJsZSB0byB3cml0ZSBtb3JlIHRoYW4gb25lIG9wdGlvbiBjb3JyZWN0bHkuCiAgICAgRml4ZWQsIG5vdyAibm8taWRlYSBuby1yYzUgLURDUllQVE9fTURFQlVHIiBldGMuIHdvcmtzIGFzIGludGVuZGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMgQ09ORl9sb2FkX2JpbygpIGFuZCBDT05GX2xvYWRfZnAoKSB0byBhbGxvdyBhIGNvbmZpZwogICAgIGZpbGUgdG8gYmUgbG9hZGVkIGZyb20gYSBCSU8gb3IgRklMRSBwb2ludGVyLiBUaGUgQklPIHZlcnNpb24gd2lsbAogICAgIGZvciBleGFtcGxlIGFsbG93IG1lbW9yeSBCSU9zIHRvIGNvbnRhaW4gY29uZmlnIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uICJDUllQVE9fbnVtX2xvY2tzIiB0aGF0IHJldHVybnMgQ1JZUFRPX05VTV9MT0NLUy4KICAgICBXaG9ldmVyIGhvcGVzIHRvIGFjaGlldmUgc2hhcmVkLWxpYnJhcnkgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdmVyc2lvbnMKICAgICBtdXN0IHVzZSB0aGlzLCBub3QgdGhlIGNvbXBpbGUtdGltZSBtYWNyby4KICAgICAoRXhlcmNpc2UgMC45LjQ6IFdoaWNoIGlzIHRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlZCBieQogICAgIHN1Y2ggcHJvZ3JhbXM/KQogICAgIE5vdGU6IEFsbCB0aGlzIGFwcGxpZXMgb25seSB0byBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcywgb3RoZXJzIGRvbid0CiAgICAgbmVlZCBsb2Nrcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgbWlzc2luZyBjYXNlIHRvIHMzX2NsbnQuYyBzdGF0ZSBtYWNoaW5lIC0tIG9uZSBvZiB0aGUgbmV3IFNTTCB0ZXN0cwogICAgIHRocm91Z2ggYSBCSU8gcGFpciB0cmlnZ2VyZWQgdGhlIGRlZmF1bHQgY2FzZSwgaS5lLgogICAgIFNTTGVyciguLi4sU1NMX1JfVU5LTk9XTl9TVEFURSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICJCSU8gcGFpciIgY29uY2VwdCAoY3J5cHRvL2Jpby9ic3NfYmlvLmMpIHNvIHRoYXQgYXBwbGljYXRpb25zCiAgICAgY2FuIHVzZSB0aGUgU1NMIGxpYnJhcnkgZXZlbiBpZiBub25lIG9mIHRoZSBzcGVjaWZpYyBCSU9zIGlzCiAgICAgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGkyZF9EU0FQdWJsaWNLZXkoKSB3aGljaCBtZWFudCBpdCByZXR1cm5lZCB0aGUgd3JvbmcgdmFsdWUKICAgICBmb3IgdGhlIGVuY29kZWQgbGVuZ3RoLgogICAgIFtKZW9uIEt5b3VuZ0hvIDxraGplb25Ac2RzLnNhbXN1bmcuY28ua3I+XQoKICAqKSBBZGQgaW5pdGlhbCBkb2N1bWVudGF0aW9uIG9mIHRoZSBYNTA5VjMgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBwYWlyIG9mIGZ1bmN0aW9ucyBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5KCkgYW5kIAogICAgIFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KCkgdGhhdCBhcmUgZXF1aXZhbGVudCB0bwogICAgIFBFTV93cml0ZV9Qcml2YXRlS2V5KCkgYW5kIFBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleSgpIGJ1dCB1c2UgdGhlIG1vcmUKICAgICBzZWN1cmUgUEtDUyM4IHByaXZhdGUga2V5IGZvcm1hdCB3aXRoIGEgaGlnaCBpdGVyYXRpb24gY291bnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRldGVybWluYXRpb24gb2YgUGVybCBpbnRlcnByZXRlcjogQSBwZXJsIG9yIHBlcmw1CiAgICAgX2RpcmVjdG9yeV8gaW4gJFBBVEggd2FzIGFsc28gYWNjZXB0ZWQgYXMgdGhlIGludGVycHJldGVyLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggZGVtb3Mvc2lnbi9zaWduLmM6IHdlbGwgdGhlcmUgd2Fzbid0IGFueXRoaW5nIHN0cmljdGx5IHNwZWFraW5nCiAgICAgd3Jvbmcgd2l0aCBpdCBidXQgaXQgd2FzIHZlcnkgb2xkIGFuZCBkaWQgdGhpbmdzIGxpa2UgY2FsbGluZwogICAgIFBFTV9BU04xX3JlYWQoKSBkaXJlY3RseSBhbmQgdXNlZCBNRDUgZm9yIHRoZSBoYXNoIG5vdCB0byBtZW50aW9uIHNvbWUKICAgICB1bnVzdWFsIGZvcm1hdHRpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRlbW9zL3NlbGZzaWduLmM6IGl0IHVzZWQgb2Jzb2xldGUgYW5kIGRlbGV0ZWQgZnVuY3Rpb25zLCBjaGFuZ2VkCiAgICAgdG8gdXNlIHRoZSBuZXcgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBQRU1fcmVhZC9QRU1fd3JpdGUgZnVuY3Rpb25zIGluIGNyeXB0by9wZW0vcGVtX2FsbC5jCiAgICAgd2l0aCBtYWNyb3MuIFRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIGNoYW5nZSB0aGVpciBmb3JtLCBhZGQgZXh0cmEKICAgICBhcmd1bWVudHMgZXRjLiBGaXggYSBmZXcgUEVNIHByb3RvdHlwZXMgd2hpY2ggZGlkbid0IGhhdmUgY2lwaGVyIGFzIGEKICAgICBjb25zdGFudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdG8gY29uZmlndXJhdGlvbiB0YWJsZSBhIG5ldyBlbnRyeSB0aGF0IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgbmFtZSBmb3IgdW5pc3RkLmggKGZvciBwcmUtUE9TSVggc3lzdGVtcyk7IHdlIG5lZWQgdGhpcyBmb3IgTmVYVHN0ZXAsCiAgICAgYWNjb3JkaW5nIHRvIE1hcmsgQ3Jpc3BpbiA8TVJDQFBhbmRhLkNPTT4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiNpZiAwCiAgKikgREVTIENCQyBkaWQgbm90IHVwZGF0ZSB0aGUgSVYuIFdlaXJkLgogICAgIFtCZW4gTGF1cmllXQojZWxzZQogICAgIGRlc19jYmNfZW5jcnlwdCBkb2VzIG5vdCB1cGRhdGUgdGhlIElWLCBidXQgZGVzX25jYmNfZW5jcnlwdCBkb2VzLgogICAgIENoYW5naW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZvcm1lciBtaWdodCBicmVhayBleGlzdGluZyBwcm9ncmFtcyAtLQogICAgIHdoZXJlIElWIHVwZGF0aW5nIGlzIG5lZWRlZCwgZGVzX25jYmNfZW5jcnlwdCBjYW4gYmUgdXNlZC4KI2VuZGlmCgogICopIFdoZW4gYm50ZXN0IGlzIHJ1biBmcm9tICJtYWtlIHRlc3QiIGl0IGRyaXZlcyBiYyB0byBjaGVjayBpdHMKICAgICBjYWxjdWxhdGlvbnMsIGFzIHdlbGwgYXMgaW50ZXJuYWxseSBjaGVja2luZyB0aGVtLiBJZiBhbiBpbnRlcm5hbCBjaGVjawogICAgIGZhaWxzLCBpdCBuZWVkcyB0byBjYXVzZSBiYyB0byBnaXZlIGEgbm9uLXplcm8gcmVzdWx0IG9yIG1ha2UgdGVzdCBjYXJyaWVzCiAgICAgb24gd2l0aG91dCBub3RpY2luZyB0aGUgZmFpbHVyZS4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIERFUyBsaWJyYXJ5IGNsZWFudXBzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUEJFIGFsZ29yaXRobXMuIFRoaXMgd2lsbCBwZXJtaXQgUEtDUyM4IHRvIGJlCiAgICAgdXNlZCB3aXRoIGFueSBjaXBoZXIgdW5saWtlIFBLQ1MjNSB2MS41IHdoaWNoIGNhbiBhdCBtb3N0IGhhbmRsZSA2NCBiaXQKICAgICBjaXBoZXJzLiBOT1RFOiBhbHRob3VnaCB0aGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gdmVyaWZpZWQKICAgICBhZ2FpbnN0IHNvbWUgcHVibGlzaGVkIHRlc3QgdmVjdG9ycyBpdCBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkCiAgICAgeWV0LiBBZGRlZCBhIC12MiAiY2lwaGVyIiBvcHRpb24gdG8gcGtjczggYXBwbGljYXRpb24gdG8gYWxsb3cgdGhlIHVzZQogICAgIG9mIHYyLjAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5zdGVhZCBvZiAibWtkaXIgLXAiLCB3aGljaCBpcyBub3QgZnVsbHkgcG9ydGFibGUsIHVzZSBuZXcKICAgICBQZXJsIHNjcmlwdCAidXRpbC9ta2Rpci1wLnBsIi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHRoZSB3YXkgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiAoUEJFKSBpcyBoYW5kbGVkLiBJdCB1c2VkIHRvCiAgICAgYXNzdW1lIHRoYXQgdGhlIEFTTjEgQWxnb3JpdGhtSWRlbnRpZmllciBwYXJhbWV0ZXIgd2FzIGEgUEJFUGFyYW1ldGVyCiAgICAgc3RydWN0dXJlLiBUaGlzIHdhcyB0cnVlIGZvciB0aGUgUEtDUyM1IHYxLjUgYW5kIFBLQ1MjMTIgUEJFIGFsZ29yaXRobXMKICAgICBidXQgZG9lc24ndCBhcHBseSB0byBQS0NTIzUgdjIuMCB3aGVyZSBpdCBjYW4gYmUgc29tZXRoaW5nIGVsc2UuIE5vdwogICAgIHRoZSAncGFyYW1ldGVyJyBmaWVsZCBvZiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBpcyBwYXNzZWQgdG8gdGhlCiAgICAgdW5kZXJseWluZyBrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbiBzbyBpdCBtdXN0IGRvIGl0cyBvd24gQVNOMSBwYXJzaW5nLgogICAgIFRoaXMgaGFzIGFsc28gY2hhbmdlZCB0aGUgRVZQX1BCRV9DaXBoZXJJbml0KCkgZnVuY3Rpb24gd2hpY2ggbm93IGhhcyBhCiAgICAgJ3BhcmFtZXRlcicgYXJndW1lbnQgaW5zdGVhZCBvZiBsaXRlcmFsIHNhbHQgYW5kIGl0ZXJhdGlvbiBjb3VudCB2YWx1ZXMKICAgICBhbmQgdGhlIGZ1bmN0aW9uIEVWUF9QQkVfQUxHT1JfQ2lwaGVySW5pdCgpIGhhcyBiZWVuIGRlbGV0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyM1IHYxLjUgY29tcGF0aWJsZSBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGFsZ29yaXRobXMKICAgICBhbmQgUEtDUyM4IGZ1bmN0aW9uYWxpdHkuIE5ldyAncGtjczgnIGFwcGxpY2F0aW9uIGxpbmtlZCB0byBvcGVuc3NsLgogICAgIE5lZWRlZCB0byBjaGFuZ2UgdGhlIFBFTV9TVFJJTkdfRVZQX1BLRVkgdmFsdWUgd2hpY2ggd2FzIGp1c3QgIlBSSVZBVEUKICAgICBLRVkiIGJlY2F1c2UgdGhpcyBjbGFzaGVkIHdpdGggUEtDUyM4IHVuZW5jcnlwdGVkIHN0cmluZy4gU2luY2UgdGhpcwogICAgIHZhbHVlIHdhcyBqdXN0IHVzZWQgYXMgYSAibWFnaWMgc3RyaW5nIiBhbmQgbm90IHVzZWQgZGlyZWN0bHkgaXRzCiAgICAgdmFsdWUgZG9lc24ndCBtYXR0ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHNvbWUgc2VtYmxhbmNlIG9mIGNvbnN0IGNvcnJlY3RuZXNzIHRvIEJOLiBTaGFtZSBDIGRvZXNuJ3QKICAgICBzdXBwb3J0IG11dGFibGUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopICJsaW51eC1zcGFyYzY0IiBjb25maWd1cmF0aW9uICh1bHRyYXBlbmd1aW4pLgogICAgIFtSYXkgTWlsbGVyIDxyYXkubWlsbGVyQG91Y3Mub3guYWMudWs+XQogICAgICJsaW51eC1zcGFyYyIgY29uZmlndXJhdGlvbi4KICAgICBbQ2hyaXN0aWFuIEZvcnN0ZXIgPGZvQGhhd28uc3R3LnVuaS1lcmxhbmdlbi5kZT5dCgogICopIGNvbmZpZyBub3cgZ2VuZXJhdGVzIG5vLXh4eCBvcHRpb25zIGZvciBtaXNzaW5nIGNpcGhlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0ICh3b3JrIGluIHByb2dyZXNzKS4KICAgICBGaWxlIGViY2RpYy5jIG5vdCB5ZXQgaW5jbHVkZWQgYmVjYXVzZSBpdCBoYXMgYSBkaWZmZXJlbnQgbGljZW5zZS4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIFN1cHBvcnQgQlMyMDAwL09TRC1QT1NJWC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIE1ha2UgY2FsbGJhY2tzIGZvciBrZXkgZ2VuZXJhdGlvbiB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIFMvTUlNRSBzYW1wbGVzIGNvbXBpbGUgKG5vdCB5ZXQgdGVzdGVkKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkaXRpb25hbCB0eXBlc2FmZSBzdGFja3MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhbnRzICJic2RpLWVsZi1nY2MiIChCU0QvT1MgNC54KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjMgYW5kIDAuOS4zYSAgWzI5IE1heSAxOTk5XQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50ICJzY281LWdjYyIuCgogICopIFVwZGF0ZWQgc29tZSBkZW1vcy4KICAgICBbU2VhbiBPIFJpb3JkYWluLCBXYWRlIFNjaG9saW5lXQoKICAqKSBBZGQgbWlzc2luZyBCSU9fZnJlZSBhdCBleGl0IG9mIHBrY3MxMiBhcHBsaWNhdGlvbi4KICAgICBbV3UgWmhpZ2FuZ10KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIGNvbmYuYy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGVzIGZvciBXaW4zMiB0byBhc3NlbWJsZXIgdmVyc2lvbiBvZiBNRDUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V0ICMhIHBhdGggdG8gcGVybCBpbiBhcHBzL2Rlcl9jaG9wIHRvIHdoZXJlIHdlIGZvdW5kIGl0CiAgICAgaW5zdGVhZCBvZiB1c2luZyBhIGZpeGVkIHBhdGguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU0hBIGxpYnJhcnkgY2hhbmdlcyBmb3IgaXJpeDY0LW1pcHM0LWNjLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBJbXByb3ZlbWVudHMgZm9yIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMmIgYW5kIDAuOS4zICBbMjQgTWF5IDE5OTldCgogICopIEJpZ251bSBsaWJyYXJ5IGJ1ZyBmaXguIElSSVggNiBwYXNzZXMgIm1ha2UgdGVzdCIgbm93IQogICAgIFRoaXMgYWxzbyBhdm9pZHMgdGhlIHByb2JsZW1zIHdpdGggU0M0LjIgYW5kIHVucGF0Y2hlZCBTQzUuICAKICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBOZXcgZnVuY3Rpb25zIHNrX251bSwgc2tfdmFsdWUgYW5kIHNrX3NldCB0byByZXBsYWNlIHRoZSBwcmV2aW91cyBtYWNyb3MuCiAgICAgVGhlc2UgYXJlIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHR5cGVzYWZlIHN0YWNrIHdvdWxkIG90aGVyd2lzZSBicmVhayAKICAgICBleGlzdGluZyBjb2RlLiBJZiBvbGQgY29kZSB1c2VkIGEgc3RydWN0dXJlIG1lbWJlciB3aGljaCB1c2VkIHRvIGJlIFNUQUNLCiAgICAgYW5kIGlzIG5vdyBTVEFDS19PRiAoZm9yIGV4YW1wbGUgY2VydCBpbiBhIFBLQ1M3X1NJR05FRCBzdHJ1Y3R1cmUpIHdpdGgKICAgICBza19udW0gb3Igc2tfdmFsdWUgaXQgd291bGQgcHJvZHVjZSBhbiBlcnJvciBiZWNhdXNlIHRoZSBudW0sIGRhdGEgbWVtYmVycwogICAgIGFyZSBub3QgcHJlc2VudCBpbiBTVEFDS19PRi4gTm93IGl0IGp1c3QgcHJvZHVjZXMgYSB3YXJuaW5nLiBza19zZXQKICAgICByZXBsYWNlcyB0aGUgb2xkIG1ldGhvZCBvZiBhc3NpZ25pbmcgYSB2YWx1ZSB0byBza192YWx1ZQogICAgIChlLmcuIHNrX3ZhbHVlKHgsIGkpID0geSkgd2hpY2ggdGhlIGxpYnJhcnkgdXNlZCBpbiBhIGZldyBjYXNlcy4gQW55IGNvZGUKICAgICB0aGF0IGRvZXMgdGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrIChhbmQgc2hvdWxkIHVzZSBza19zZXQgaW5zdGVhZCkgYnV0CiAgICAgdGhpcyBjb3VsZCBiZSByZWdhcmRlZCBhcyBhICJxdWVzdGlvbmFibGUiIGJlaGF2aW91ciBhbnl3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1vc3Qgb2YgdGhlIG90aGVyIFBLQ1MjNyBidWdzLiBUaGUgImV4cGVyaW1lbnRhbCIgY29kZSBjYW4gbm93CiAgICAgY29ycmVjdGx5IGhhbmRsZSBlbmNyeXB0ZWQgUy9NSU1FIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgdmFyaW91cyBERVMgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gZGVzX2NibG9jawogICAgICh3aGljaCBtZWFucywgaW4gZnVuY3Rpb24gYXJndW1lbnQgZGVjbGFyYXRpb25zLCBwb2ludGVyIHRvIGNoYXIpCiAgICAgdG8gZGVzX2NibG9jayAqIChtZWFuaW5nIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCA4IGNoYXIgZWxlbWVudHMpLAogICAgIHdoaWNoIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZG8gbW9yZSB0eXBlY2hlY2tpbmc7IGl0IHdhcyBsaWtlCiAgICAgdGhhdCBiYWNrIGluIFNTTGVheSwgYnV0IHdpdGggbG90cyBvZiB1Z2x5IGNhc3RzLgoKICAgICBJbnRyb2R1Y2UgbmV3IHR5cGUgY29uc3RfZGVzX2NibG9jay4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW9yZ2FuaXNlIHRoZSBQS0NTIzcgbGlicmFyeSBhbmQgZ2V0IHJpZCBvZiBzb21lIG9mIHRoZSBtb3JlIG9idmlvdXMKICAgICBwcm9ibGVtczogZmluZCBSZWNpcGllbnRJbmZvIHN0cnVjdHVyZSB0aGF0IG1hdGNoZXMgcmVjaXBpZW50IGNlcnRpZmljYXRlCiAgICAgYW5kIGluaXRpYWxpc2UgdGhlIEFTTjEgc3RydWN0dXJlcyBwcm9wZXJseSBiYXNlZCBvbiBwYXNzZWQgY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlbGF0ZWRseSBtYWtlIHRoZSBCTiB0ZXN0cyBhY3R1YWxseSBjaGVjayB0aGUgcmVzdWx0cy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgbmVnYXRpdmUgQVNOMSBJTlRFR0VSUyBhbmQgY29udmVyc2lvbgogICAgIHRvIGFuZCBmcm9tIEJOczogaXQgd2FzIGNvbXBsZXRlbHkgYnJva2VuLiBOZXcgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgTkVHX1BVQktFWV9CVUcgdG8gYWxsb3cgZm9yIHNvbWUgYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGVuY29kZSBwdWJsaWMKICAgICBrZXkgZWxlbWVudHMgYXMgbmVnYXRpdmUgaW50ZWdlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbml6ZSBhbmQgc3BlZWQgdXAgTUQ1LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+XQoKICAqKSBOZXcgb3B0aW9uIC1vdXQgdG8gYXNuMXBhcnNlIHRvIGFsbG93IHRoZSBwYXJzZWQgc3RydWN0dXJlIHRvIGJlCiAgICAgb3V0cHV0IHRvIGEgZmlsZS4gVGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIC1zdHJwYXJzZQogICAgIG9wdGlvbiB0byBleGFtaW5lIHRoZSBvdXRwdXQgb2YgdGhpbmdzIGxpa2UgT0NURVQgU1RSSU5HUy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNTTCBsaWJyYXJ5IGEgbGl0dGxlIG1vcmUgZm9vbC1wcm9vZiBieSBub3QgcmVxdWlyaW5nIGFueSBsb25nZXIKICAgICB0aGF0IFNTTF9zZXRfe2FjY2VwdCxjb25uZWN0fV9zdGF0ZSBiZSBjYWxsZWQgYmVmb3JlCiAgICAgU1NMX3thY2NlcHQsY29ubmVjdH0gbWF5IGJlIHVzZWQgKFNTTF9zZXRfLi4uX3N0YXRlIGlzIG9taXR0ZWQKICAgICBpbiBtYW55IGFwcGxpY2F0aW9ucyBiZWNhdXNlIHVzdWFsbHkgZXZlcnl0aGluZyAqYXBwZWFyZWQqIHRvIHdvcmsgYXMKICAgICBpbnRlbmRlZCBhbnl3YXkgLS0gbm93IGl0IHJlYWxseSB3b3JrcyBhcyBpbnRlbmRlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBvcGVuc3NsLmNuZiBvdXQgb2YgbGliLy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHZhcmlvdXMgdGhpbmdzIHRvIGxldCBPcGVuU1NMIGV2ZW4gcGFzcyBgYGVnY2MgLXBpcGUgLU8yIC1XYWxsCiAgICAgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbiAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnIHdpdGggRUdDUyAxLjEuMisgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdGhlIEVWUCBhbmQgUEtDUyM3IGNvZGUuIEl0IG1heSBub3cgYmUgYWJsZSB0bwogICAgIGhhbmRsZSBQS0NTIzcgZW52ZWxvcGVkIGRhdGEgcHJvcGVybHkuCiAgICAgW1NlYmFzdGlhbiBBa2VybWFuIDxzYWtAcGFyYWxsZWxjb25zdWx0aW5nLmNvbT4sIG1vZGlmaWVkIGJ5IFN0ZXZlXQoKICAqKSBDcmVhdGUgYSBkdXBsaWNhdGUgb2YgdGhlIFNTTF9DVFgncyBDRVJUIGluIFNTTF9uZXcgaW5zdGVhZCBvZgogICAgIGNvcHlpbmcgcG9pbnRlcnMuICBUaGUgY2VydF9zdCBoYW5kbGluZyBpcyBjaGFuZ2VkIGJ5IHRoaXMgaW4KICAgICB2YXJpb3VzIHdheXMgKGFuZCB0aHVzIHdoYXQgdXNlZCB0byBiZSBrbm93biBhcyBjdHgtPmRlZmF1bHRfY2VydAogICAgIGlzIG5vdyBjYWxsZWQgY3R4LT5jZXJ0LCBzaW5jZSB3ZSBkb24ndCByZXNvcnQgdG8gcy0+Y3R4LT5bZGVmYXVsdF9dY2VydAogICAgIGFueSBsb25nZXIgd2hlbiBzLT5jZXJ0IGRvZXMgbm90IGdpdmUgdXMgd2hhdCB3ZSBuZWVkKS4KICAgICBzc2xfY2VydF9pbnN0YW50aWF0ZSBiZWNvbWVzIG9ic29sZXRlIGJ5IHRoaXMgY2hhbmdlLgogICAgIEFzIHNvb24gYXMgd2UndmUgZ290IHRoZSBuZXcgY29kZSByaWdodCAocG9zc2libHkgaXQgYWxyZWFkeSBpcz8pLAogICAgIHdlIGhhdmUgc29sdmVkIGEgY291cGxlIG9mIGJ1Z3Mgb2YgdGhlIGVhcmxpZXIgY29kZSB3aGVyZSBzLT5jZXJ0CiAgICAgd2FzIHVzZWQgYXMgaWYgaXQgY291bGQgbm90IGhhdmUgYmVlbiBzaGFyZWQgd2l0aCBvdGhlciBTU0wgc3RydWN0dXJlcy4KCiAgICAgTm90ZSB0aGF0IHVzaW5nIHRoZSBTU0wgQVBJIGluIGNlcnRhaW4gZGlydHkgd2F5cyBub3cgd2lsbCByZXN1bHQKICAgICBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYW4gb2JzZXJ2ZWQgd2l0aCBlYXJsaWVyIGxpYnJhcnkgdmVyc2lvbnM6CiAgICAgQ2hhbmdpbmcgc2V0dGluZ3MgZm9yIGFuIFNTTF9DVFggKmN0eCBhZnRlciBoYXZpbmcgZG9uZSBzID0gU1NMX25ldyhjdHgpCiAgICAgZG9lcyBub3QgaW5mbHVlbmNlIHMgYXMgaXQgdXNlZCB0by4KICAgICAKICAgICBJbiBvcmRlciB0byBjbGVhbiB1cCB0aGluZ3MgbW9yZSB0aG9yb3VnaGx5LCBpbnNpZGUgU1NMX1NFU1NJT04KICAgICB3ZSBkb24ndCB1c2UgQ0VSVCBhbnkgbG9uZ2VyLCBidXQgYSBuZXcgc3RydWN0dXJlIFNFU1NfQ0VSVAogICAgIHRoYXQgaG9sZHMgcGVyLXNlc3Npb24gZGF0YSAoaWYgYXZhaWxhYmxlKTsgY3VycmVudGx5LCB0aGlzIGlzCiAgICAgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQsIGZvciBjbGllbnRzLCB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUKICAgICBhbmQgdGVtcG9yYXJ5IGtleS4gIENFUlQgaG9sZHMgb25seSB0aG9zZSB2YWx1ZXMgdGhhdCBjYW4gaGF2ZQogICAgIG1lYW5pbmdmdWwgZGVmYXVsdHMgaW4gYW4gU1NMX0NUWC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX0VYVF9pMmQoKSB0byBjcmVhdGUgYW4gWDUwOV9FWFRFTlNJT04gc3RydWN0dXJlCiAgICAgZnJvbSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFZhcmlvdXMgUEtDUyM3IGZpeGVzOiByZW1vdmUgc29tZQogICAgIGV2aWwgY2FzdHMgYW5kIHNldCB0aGUgZW5jX2RpZ19hbGcgZmllbGQgcHJvcGVybHkgYmFzZWQgb24gdGhlIHNpZ25pbmcKICAgICBrZXkgdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBQS0NTIzEyIHBhc3N3b3JkIHRvIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgdGhlCiAgICAgZW52aXJvbm1lbnQuIExldCAnY2EnIGdldCBpdHMgY29uZmlnIGZpbGUgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudAogICAgIHZhcmlhYmxlcyAiT1BFTlNTTF9DT05GIiBvciAiU1NMRUFZX0NPTkYiIChmb3IgY29uc2lzdGVuY3kgd2l0aCAncmVxJwogICAgIGFuZCAneDUwOScpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIHBvbGljaWVzIGV4dGVuc2lvbiB0byB1c2UgYW4gSUE1U1RSSU5HIGZvciB0aGUKICAgICBvcmdhbml6YXRpb24gZmllbGQuIFRoaXMgaXMgY29udHJhcnkgdG8gdGhlIFBLSVggZGVmaW5pdGlvbiBidXQKICAgICBWZXJpU2lnbiB1c2VzIGl0IGFuZCBJRTUgb25seSByZWNvZ25pc2VzIHRoaXMgZm9ybS4gRG9jdW1lbnQgJ3g1MDknCiAgICAgZXh0ZW5zaW9uIG9wdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUEVEQU5USUMgY29tcGlsZXIgZmxhZyB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIGdjYyAtcGVkYW50aWMsCiAgICAgd2l0aG91dCBkaXNhbGxvd2luZyBpbmxpbmUgYXNzZW1ibGVyIGFuZCB0aGUgbGlrZSBmb3Igbm9uLXBlZGFudGljIGJ1aWxkcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3VwcG9ydCBCb3JsYW5kIEMrKyBidWlsZGVyLgogICAgIFtKYW5leiBKZXJlIDxqakB2b2lkLnNpPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTSEEtMSBjbGVhbnVwcyBhbmQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFNwYXJjIHY4cGx1cyBhc3NlbWJsZXIgZm9yIHRoZSBiaWdudW0gbGlicmFyeS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBBY2NlcHQgYW55IC14eHggYW5kICt4eHggY29tcGlsZXIgb3B0aW9ucyBpbiBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFVwZGF0ZSBIUFVYIGNvbmZpZ3VyYXRpb24uCiAgICAgW0Fub255bW91c10KICAKICAqKSBBZGQgbWlzc2luZyBza188dHlwZT5fdW5zaGlmdCgpIGZ1bmN0aW9uIHRvIHNhZmVzdGFjay5oCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlIHRoYXQgc2V0cyB0aGUKICAgICAiZXh0cmFfY2VydCJzIGluIGFkZGl0aW9uIHRvIHRoZSBjZXJ0aWZpY2F0ZS4gIChUaGlzIG1ha2VzIHNlbnNlCiAgICAgb25seSBmb3IgIlBFTSIgZm9ybWF0IGZpbGVzLCBhcyBjaGFpbnMgYXMgYSB3aG9sZSBhcmUgbm90CiAgICAgREVSLWVuY29kZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgdmVyaWZ5X2RlcHRoIGZyb20gdGhlIFNTTCBBUEkuCiAgICAgeDUwOV92ZnkuYyBoYWQgd2hhdCBjYW4gYmUgY29uc2lkZXJlZCBhbiBvZmYtYnktb25lLWVycm9yOgogICAgIEl0cyBkZXB0aCAod2hpY2ggd2FzIG5vdCBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UpCiAgICAgd2FzIGFjdHVhbGx5IGNvdW50aW5nIHRoZSBudW1iZXIgb2YgY2VydGlmaWNhdGVzIGluIGEgY2hhaW47CiAgICAgbm93IGl0IHJlYWxseSBjb3VudHMgdGhlIGRlcHRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBpbiBjcnlwdG8veDUwOS94NTA5X2NtcC5jOiBUaGUgU1NMZXJyIG1hY3JvIHdhcyB1c2VkCiAgICAgaW5zdGVhZCBvZiBYNTA5ZXJyLCB3aGljaCBvZnRlbiByZXN1bHRlZCBpbiBjb25mdXNpbmcgZXJyb3IKICAgICBtZXNzYWdlcyBzaW5jZSB0aGUgZXJyb3IgY29kZXMgYXJlIG5vdCBnbG9iYWxseSB1bmlxdWUKICAgICAoZS5nLiBhbiBhbGxlZ2VkIGVycm9yIGluIHNzbDNfYWNjZXB0IHdoZW4gYSBjZXJ0aWZpY2F0ZQogICAgIGRpZG4ndCBtYXRjaCB0aGUgcHJpdmF0ZSBrZXkpLgoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IHRoYXQgYWxsb3dzIHRvIHNldCBhIGRlZmF1bHQKICAgICB2YWx1ZSAoc28gdGhhdCB5b3UgZG9uJ3QgbmVlZCBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dCBmb3IgZWFjaAogICAgIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFNTTF9DVFgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9BRVAgZGVjb2RpbmcgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBJTlNUQUxMX1BSRUZJWCBmb3IgcGFja2FnZSBidWlsZGVycywgYXMgcHJvcG9zZWQgYnkKICAgICBEYXZpZCBIYXJyaXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb25zICJ0aHJlYWRzIiBhbmQgIm5vLXRocmVhZHMiLiAgRm9yIHN5c3RlbXMKICAgICB3aGVyZSB0aGUgcHJvcGVyIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGtub3duIChjdXJyZW50bHkgU29sYXJpcwogICAgIGFuZCBMaW51eCksICJ0aHJlYWRzIiBpcyB0aGUgZGVmYXVsdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc2NyaXB0IHV0aWwvbWtsaW5rLnBsIGFzIGEgZmFzdGVyIHN1YnN0aXR1dGUgZm9yIHV0aWwvbWtsaW5rLnNoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluc3RhbGwgdmFyaW91cyBzY3JpcHRzIHRvICQoT1BFTlNTTERJUikvbWlzYywgbm90IHRvCiAgICAgJChJTlNUQUxMVE9QKS9iaW4gLS0gdGhleSBzaG91bGRuJ3QgY2x1dHRlciBkaXJlY3RvcmllcwogICAgIHN1Y2ggYXMgL3Vzci9sb2NhbC9iaW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgIm1ha2UgbGludXgtc2hhcmVkIiB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9uIG5vLTxjaXBoZXI+IChyc2EsIGlkZWEsIHJjNSwgLi4uKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHRoZSBQS0NTIzEyIEFQSSBkb2N1bWVudGF0aW9uIHRvIG9wZW5zc2wudHh0LiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvcgogICAgIGV4dGVuc2lvbiBhZGRpbmcgaW4geDUwOSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBOT1BST1RPIHNlY3Rpb25zIGFuZCBlcnJvciBjb2RlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBQYXJ0aWFsIHJld3JpdGUgb2YgdGhlIERFRiBmaWxlIGdlbmVyYXRvciB0byBub3cgcGFyc2UgdGhlIEFOU0kKICAgICBwcm90b3R5cGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAtLXByZWZpeD1ESVIgYW5kIC0tb3BlbnNzbGRpcj1ESVIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGVycm9yIGNvZGUgc2NyaXB0KHMpLiBJdCBpcyBhbGwgbm93IGhhbmRsZWQKICAgICBieSBvbmUgc2NyaXB0IGF0IHRoZSB0b3AgbGV2ZWwgd2hpY2ggaGFuZGxlcyBlcnJvciBjb2RlIGdhdGhlcmluZywKICAgICBoZWFkZXIgcmV3cml0aW5nIGFuZCBDIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24uIEl0IHNob3VsZCBiZSBtdWNoIGJldHRlcgogICAgIHRoYW4gdGhlIG9sZCBtZXRob2Q6IGl0IG5vdyB1c2VzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBVbGYncyBwYXJzZXIgdG8KICAgICByZWFkIHRoZSBBTlNJIHByb3RvdHlwZXMgaW4gYWxsIGhlYWRlciBmaWxlcyAodGh1cyB0aGUgb2xkIEsmUiBkZWZpbml0aW9ucwogICAgIGFyZW4ndCBuZWVkZWQgZm9yIGVycm9yIGNyZWF0aW9uIGFueSBtb3JlKSBhbmQgZG8gYSBiZXR0ZXIgam9iIG9mCiAgICAgdHJhbnNsYXRpbmcgZnVuY3Rpb24gY29kZXMgaW50byBuYW1lcy4gVGhlIG9sZCAnQVNOMSBlcnJvciBjb2RlIGltYmVkZGVkCiAgICAgaW4gYSBjb21tZW50JyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFuZCBpdCBkb2Vzbid0IHVzZSAuZXJyIGZpbGVzIHdoaWNoCiAgICAgaGF2ZSBub3cgYmVlbiBkZWxldGVkLiBBbHNvIHRoZSBlcnJvciBjb2RlIGNhbGwgZG9lc24ndCBoYXZlIHRvIGFwcGVhciBhbGwKICAgICBvbiBvbmUgbGluZSAod2hpY2ggcmVzdWx0ZWQgaW4gc29tZSBsYXJnZSBsaW5lcy4uLikuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlICNpbmNsdWRlIGZpbGVuYW1lcyBmcm9tIDxmb28uaD4gdG8gPG9wZW5zc2wvZm9vLmg+LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBiZWhhdmlvdXIgb2Ygc3NsMl9yZWFkIHdoZW4gZmFjaW5nIGxlbmd0aC0wIHBhY2tldHM6IERvbid0IHJldHVybgogICAgIDAgKHdoaWNoIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24pLCBidXQgY29udGludWUgcmVhZGluZy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggc29tZSByYWNlIGNvbmRpdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGV4dGVuc2lvbi4gQWRkIENlcnRpZmljYXRlCiAgICAgUG9saWNpZXMgYW5kIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSB0aGUgYXV0b2dlbmVyYXRlZCBoZWFkZXIgZmlsZSBwYXJ0cyB0byBjcnlwdG8vb3BlbnNzbGNvbmYuaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IG5ldyA1Ni1iaXQgREVTIGV4cG9ydCBjaXBoZXJzdWl0ZXM6IHRoZXkgd2VyZSB1c2luZyA3IGJ5dGVzIGluc3RlYWQgb2YKICAgICA4IG9mIGtleWluZyBtYXRlcmlhbC4gTWVybGluIGhhcyBhbHNvIGNvbmZpcm1lZCBpbnRlcm9wIHdpdGggdGhpcyBmaXgKICAgICBiZXR3ZWVuIE9wZW5TU0wgYW5kIEJhbHRpbW9yZSBDL1NTTCAyLjAgYW5kIEovU1NMIDIuMC4KICAgICBbTWVybGluIEh1Z2hlcyA8bWVybGluQGJhbHRpbW9yZS5pZT5dCgogICopIEZpeCBsb3RzIG9mIHdhcm5pbmdzLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgSW4gYWRkX2NlcnRfZGlyKCkgaW4gY3J5cHRvL3g1MDkvYnlfZGlyLmMsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZgogICAgIHRoZSBkaXJlY3Rvcnkgc3BlYyBkaWRuJ3QgZW5kIHdpdGggYSBMSVNUX1NFUEFSQVRPUl9DSEFSLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgRml4IHByb2JsZW1zIHdpdGggc2l6ZW9mKGxvbmcpID09IDguCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQ2hhbmdlIGZ1bmN0aW9ucyB0byBBTlNJIEMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB0eXBvcyBpbiBlcnJvciBjb2Rlcy4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT4sIFVsZiBN9mxsZXJdCgogICopIFJlbW92ZSBkZWZ1bmN0IGFzc2VtYmxlciBmaWxlcyBmcm9tIENvbmZpZ3VyZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU1BBUkMgdjggYXNzZW1ibGVyIEJJR05VTSBpbXBsZW1lbnRhdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTdXBwb3J0IGZvciBDZXJ0aWZpY2F0ZSBQb2xpY2llcyBleHRlbnNpb246IGJvdGggcHJpbnQgYW5kIHNldC4KICAgICBWYXJpb3VzIGFkZGl0aW9ucyB0byBzdXBwb3J0IHRoZSByMmkgbWV0aG9kIHRoaXMgdXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGxvdCBvZiBjb25zdGlmaWNhdGlvbiwgYW5kIGZpeCBhIGJ1ZyBpbiBYNTA5X05BTUVfb25lbGluZSgpIHRoYXQgY291bGQKICAgICByZXR1cm4gYSBjb25zdCBzdHJpbmcgd2hlbiB5b3UgYXJlIGV4cGVjdGluZyBhbiBhbGxvY2F0ZWQgYnVmZmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgQVNOMSB0eXBlcyBVVEY4U3RyaW5nIGFuZCBWSVNJQkxFU1RSSU5HLCBhbHNvIHRoZSBDSE9JQ0UKICAgICB0eXBlcyBEaXJlY3RvcnlTdHJpbmcgYW5kIERpc3BsYXlUZXh0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb2RlIHRvIGFsbG93IHIyaSBleHRlbnNpb25zIHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBkYXRhYmFzZSwKICAgICBhZGQgYW4gTEhBU0ggZGF0YWJhc2UgZHJpdmVyIGFuZCBhZGQgc2V2ZXJhbCBjdHggaGVscGVyIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYW4gZXZpbCBidWcgaW4gYm5fZXhwYW5kMigpIHdoaWNoIGNhdXNlZCB2YXJpb3VzIEJOIGZ1bmN0aW9ucyB0bwogICAgIGZhaWwgd2hlbiB0aGV5IGV4dGVuZGVkIHRoZSBzaXplIG9mIGEgQklHTlVNLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIFNYTmV0IGV4dGVuc2lvbi4gTW9kaWZ5IG1rZGVmLnBsIHRvCiAgICAgc3VwcG9ydCB0eXBlc2FmZSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdHlwbyBpbiBTU0xfW2dzXWV0X29wdGlvbnMoKS4KICAgICBbTmlscyBGcm9zdGJlcmcgPG5pbHNAbWVkY29tLnNlPl0KCiAgKikgRGVsZXRlIHZhcmlvdXMgZnVuY3Rpb25zIGFuZCBmaWxlcyB0aGF0IGJlbG9uZ2VkIHRvIHRoZSAobm93IG9ic29sZXRlKQogICAgIG9sZCBYNTA5VjMgaGFuZGxpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiAicnNhcmVmIi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG9uJ3QgYXV0by1nZW5lcmF0ZSBwZW0uaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgdHlwZS1zYWZlIEFTTi4xIFNFVHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvbnZlcnQgdmFyaW91cyBhZGRpdGlvbmFsIGNhc3RlZCBzdGFja3MgdG8gdHlwZS1zYWZlIFNUQUNLX09GKCkgdmFyaWFudHMuCiAgICAgW0JlbiBMYXVyaWUsIFJhbGYgUy4gRW5nZWxzY2hhbGwsIFN0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBTVEFDS3MuIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrIGxvdHMgb2YgY29kZQogICAgIHRoYXQgbGlua3Mgd2l0aCBPcGVuU1NMICh3ZWxsIGF0IGxlYXN0IGNhdXNlIGxvdHMgb2Ygd2FybmluZ3MpLCBidXQgZmVhcgogICAgIG5vdDogdGhlIGNvbnZlcnNpb24gaXMgdHJpdmlhbCwgYW5kIGl0IGVsaW1pbmF0ZXMgbG9hZHMgb2YgZXZpbCBjYXN0cy4gQQogICAgIGZldyBTVEFDS2VkIHRoaW5ncyBoYXZlIGJlZW4gY29udmVydGVkIGFscmVhZHkuIEZlZWwgZnJlZSB0byBjb252ZXJ0IG1vcmUuCiAgICAgSW4gdGhlIGZ1bGxuZXNzIG9mIHRpbWUsIEknbGwgZG8gYXdheSB3aXRoIHRoZSBTVEFDSyB0eXBlIGFsdG9nZXRoZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBgb3BlbnNzbCBjYSAtcmV2b2tlIDxjZXJ0ZmlsZT4nIGZhY2lsaXR5IHdoaWNoIHJldm9rZXMgYSBjZXJ0aWZpY2F0ZQogICAgIHNwZWNpZmllZCBpbiA8Y2VydGZpbGU+IGJ5IHVwZGF0aW5nIHRoZSBlbnRyeSBpbiB0aGUgaW5kZXgudHh0IGZpbGUuCiAgICAgVGhpcyB3YXkgb25lIG5vIGxvbmdlciBoYXMgdG8gZWRpdCB0aGUgaW5kZXgudHh0IGZpbGUgbWFudWFsbHkgZm9yCiAgICAgcmV2b2tpbmcgYSBjZXJ0aWZpY2F0ZS4gVGhlIC1yZXZva2Ugb3B0aW9uIGRvZXMgdGhlIGdvcnkgZGV0YWlscyBub3cuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5jYS5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggYG9wZW5zc2wgY3JsIC1ub291dCAtdGV4dCcgY29tYmluYXRpb24gd2hlcmUgYC1ub291dCcga2lsbGVkIHRoZQogICAgIGAtdGV4dCcgb3B0aW9uIGF0IGFsbCBhbmQgdGhpcyB3YXkgdGhlIGAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdhcwogICAgIGluY29uc2lzdGVudCBpbiBgb3BlbnNzbCBjcmwnIHdpdGggdGhlIGZyaWVuZHMgaW4gYG9wZW5zc2wgeDUwOXxyc2F8ZHNhJy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIGEgY29ycmVzcG9uZGluZyBwbGFpbiB0ZXh0IGVycm9yIG1lc3NhZ2UgZXhpc3RzIGZvciB0aGUKICAgICBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRC8yMyBlcnJvciBudW1iZXIgd2hpY2ggY2FuIG9jY3VyIHdoZW4gYQogICAgIHZlcmlmeSBjYWxsYmFjayBmdW5jdGlvbiBkZXRlcm1pbmVkIHRoYXQgYSBjZXJ0aWZpY2F0ZSB3YXMgcmV2b2tlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQnVnZml4OiBJbiB0ZXN0L3Rlc3RlbmMsIGRvbid0IHRlc3QgIm9wZW5zc2wgPGNpcGhlcj4iIGZvcgogICAgIGNpcGhlcnMgdGhhdCB3ZXJlIGV4Y2x1ZGVkLCBlLmcuIGJ5IC1ETk9fSURFQS4gIEFsc28sIHRlc3QKICAgICBhbGwgYXZhaWxhYmxlIGNpcGVycyBpbmNsdWRpbmcgcmM1LCB3aGljaCB3YXMgZm9yZ290dGVuIHVudGlsIG5vdy4KICAgICBJbiBvcmRlciB0byBsZXQgdGhlIHRlc3Rpbmcgc2hlbGwgc2NyaXB0IGtub3cgd2hpY2ggYWxnb3JpdGhtcwogICAgIGFyZSBhdmFpbGFibGUsIGEgbmV3ICh1cCB0byBub3cgdW5kb2N1bWVudGVkKSBjb21tYW5kCiAgICAgIm9wZW5zc2wgbGlzdC1jaXBoZXItY29tbWFuZHMiIGlzIHVzZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBzX2NsaWVudCBvY2Nhc2lvbmFsbHkgd291bGQgc2xlZXAgaW4gc2VsZWN0KCkgd2hlbgogICAgIGl0IHNob3VsZCBoYXZlIGNoZWNrZWQgU1NMX3BlbmRpbmcoKSBmaXJzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIERTQV9kb19zaWduIGFuZCBEU0FfZG9fdmVyaWZ5IHRvIHByb3ZpZGUgYWNjZXNzIHRvCiAgICAgdGhlIHJhdyBEU0EgdmFsdWVzIHByaW9yIHRvIEFTTi4xIGVuY29kaW5nLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBUd2Vha3MgdG8gQ29uZmlndXJlCiAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIEFTTjEgUEJFUzIgc3RydWN0dXJlcy4gTm8gb3RoZXIgc3VwcG9ydCwKICAgICB5ZXQuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgdmFyaWFibGVzICQoUkFOTElCKSBhbmQgJChQRVJMKSBpbiB0aGUgTWFrZWZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBOZXcgY29uZmlnIG9wdGlvbiB0byBhdm9pZCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaWxsZWdhbCBvbiB0aGUgODAzODYuCiAgICAgVGhlIGRlZmF1bHQgY29kZSBpcyBmYXN0ZXIsIGJ1dCByZXF1aXJlcyBhdCBsZWFzdCBhIDQ4Ni4KICAgICBbVWxmIE32bGxlcl0KICAKICAqKSBHb3QgcmlkIG9mIG9sZCBTU0wyX0NMSUVOVF9WRVJTSU9OIChpbmNvbnNpc3RlbnRseSB1c2VkKSBhbmQKICAgICBTU0wyX1NFUlZFUl9WRVJTSU9OIChub3QgdXNlZCBhdCBhbGwpIG1hY3Jvcywgd2hpY2ggYXJlIG5vdyB0aGUKICAgICBzYW1lIGFzIFNTTDJfVkVSU0lPTiBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICItc2hvd2NlcnRzIiBvcHRpb24gZm9yIHNfY2xpZW50LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0aWxsIG1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIHBrY3MxMiBhcHBsaWNhdGlvbiB0byBvcGVuc3NsCiAgICAgYXBwbGljYXRpb24uIFZhcmlvdXMgY2xlYW51cHMgYW5kIGZpeGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIG5ldyBwa2NzMTIgZGlyZWN0b3J5IHdpdGggTWFrZWZpbGUuc3NsIGFuZAogICAgIG1vZGlmeSBlcnJvciByb3V0aW5lcyB0byB3b3JrIGludGVybmFsbHkuIEFkZCBlcnJvciBjb2RlcyBhbmQgUEJFIGluaXQKICAgICB0byBsaWJyYXJ5IHN0YXJ0dXAgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVydGhlciBQS0NTIzEyIGludGVncmF0aW9uLiBBZGRlZCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uLCBQS0NTIzggYW5kCiAgICAgcGFja2luZyBmdW5jdGlvbnMgdG8gYXNuMSBhbmQgZXZwLiBDaGFuZ2VkIGZ1bmN0aW9uIG5hbWVzIGFuZCBlcnJvcgogICAgIGNvZGVzIGFsb25nIHRoZSB3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUEtDUzEyIGludGVncmF0aW9uOiBhbmQgc28gaXQgYmVnaW5zLi4uIEZpcnN0IG9mIHNldmVyYWwgcGF0Y2hlcyB0bwogICAgIHNsb3dseSBpbnRlZ3JhdGUgUEtDUyMxMiBmdW5jdGlvbmFsaXR5IGludG8gT3BlblNTTC4gQWRkIFBLQ1MjMTIKICAgICBvYmplY3RzIHRvIG9iamVjdHMuaAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAnaW5kZW50JyBvcHRpb24gdG8gc29tZSBYNTA5VjMgZXh0ZW5zaW9uIGNvZGUuIEluaXRpYWwgQVNOMQogICAgIGFuZCBkaXNwbGF5IHN1cHBvcnQgZm9yIFRoYXd0ZSBzdHJvbmcgZXh0cmFuZXQgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBMaW51eFBQQyBzdXBwb3J0LgogICAgIFtKZWZmIER1YnJ1bGUgPGlnb3JAcG9ib3gub3JnPl0KCiAgKikgR2V0IHJpZCBvZiByZWR1bmRhbnQgQk4gZmlsZSBibl9tdWx3LmMsIGFuZCByZW5hbWUgYm5fZGl2NjQgdG8KICAgICBibl9kaXZfd29yZHMgaW4gYWxwaGEucy4KICAgICBbSGFubmVzIFJlaW5lY2tlIDxILlJlaW5lY2tlQGh3LmFjLnVrPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTWFrZSBzdXJlIHRoZSBSU0EgT0FFUCB0ZXN0IGlzIHNraXBwZWQgdW5kZXIgLURSU0FyZWYgYmVjYXVzZQogICAgIE9BRVAgaXNuJ3Qgc3VwcG9ydGVkIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIE1vdmUgZGVmaW5pdGlvbnMgb2YgSVNfU0VUL0lTX1NFUVVFTkNFIGluc2lkZSBjcnlwdG8vYXNuMS9hc24xLmggCiAgICAgc28gdGhleSBubyBsb25nZXIgYXJlIG1pc3NpbmcgdW5kZXIgLUROT1BST1RPLiAKICAgICBbU29yZW4gUy4gSm9ydmFuZyA8c29yZW5AdC5kaz5dCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMWMgYW5kIDAuOS4yYiAgWzIyIE1hciAxOTk5XQoKICAqKSBNYWtlIFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKCkgd29yayBpbiBzZXJ2ZXJzLiBVbmZvcnR1bmF0ZWx5LCBpdCBzdGlsbAogICAgIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBzZXNzaW9uIGlzIHJldXNlZC4gQ29taW5nIHNvb24hCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBhIHNlY3VyaXR5IGhvbGUsIHRoYXQgYWxsb3dzIHNlc3Npb25zIHRvIGJlIHJldXNlZCBpbiB0aGUgd3JvbmcKICAgICBjb250ZXh0IHRodXMgYnlwYXNzaW5nIGNsaWVudCBjZXJ0IHByb3RlY3Rpb24hIEFsbCBzb2Z0d2FyZSB0aGF0IHVzZXMKICAgICBjbGllbnQgY2VydHMgYW5kIHNlc3Npb24gY2FjaGVzIGluIG11bHRpcGxlIGNvbnRleHRzIE5FRURTIFBBVENISU5HIHRvCiAgICAgYWxsb3cgc2Vzc2lvbiByZXVzZSEgQSBmdWxsZXIgc29sdXRpb24gaXMgaW4gdGhlIHdvcmtzLgogICAgIFtCZW4gTGF1cmllLCBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEhvbGdlciBSZWlmLCBCb2RvIE1vZWxsZXIgKGFuZCA/Pz8pXQoKICAqKSBTb21lIG1vcmUgc291cmNlIHRyZWUgY2xlYW51cHMgKHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMKICAgICBjcnlwdG8vYmYvYXNtL2JmNTg2LnBsLCB0ZXN0L3Rlc3QudHh0IGFuZCBjcnlwdG8vc2hhL2FzbS9mLnM7IGNoYW5nZWQKICAgICBwZXJtaXNzaW9uIG9uICJjb25maWciIHNjcmlwdCB0byBiZSBleGVjdXRhYmxlKSBhbmQgYSBmaXggZm9yIHRoZSBJTlNUQUxMCiAgICAgZG9jdW1lbnQuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgc29tZSBsZWdhY3kgYW5kIGVycm9uZW91cyB1c2VzIG9mIG1hbGxvYywgZnJlZSBpbnN0ZWFkIG9mCiAgICAgTWFsbG9jLCBGcmVlLgogICAgIFtMZW5uYXJ0IEJhbmcgPGxvYkBuZXRzdHJlYW0uc2U+LCB3aXRoIG1pbm9yIGNoYW5nZXMgYnkgU3RldmVdCgogICopIE1ha2UgcnNhX29hZXBfdGVzdCByZXR1cm4gbm9uLXplcm8gb24gZXJyb3IuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIFNvbGFyaXMgc2hhcmVkIGxpYnJhcmllcy4gQ29uZmlndXJlCiAgICAgc29sYXJpcy1zcGFyYy1zYzQtcGljLCBtYWtlLCB0aGVuIHJ1biBzaGxpYi9zb2xhcmlzLXNjNC5zaC4gSXQnZCBiZSBuaWNlCiAgICAgaWYgc29tZW9uZSB3b3VsZCBtYWtlIHRoYXQgbGFzdCBzdGVwIGF1dG9tYXRpYy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAQWROb3Z1bS5DSD5dCgogICopIGN0eF9zaXplIHdhcyBub3QgYnVpbHQgd2l0aCB0aGUgcmlnaHQgY29tcGlsZXIgZHVyaW5nICJtYWtlIGxpbmtzIi4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSB0aGUgbWVhbmluZyBvZiAnQUxMJyBpbiB0aGUgY2lwaGVyIGxpc3QuIEl0IG5vdyBtZWFucyAiZXZlcnl0aGluZwogICAgIGV4Y2VwdCBOVUxMIGNpcGhlcnMiLiBUaGlzIG1lYW5zIHRoZSBkZWZhdWx0IGNpcGhlciBsaXN0IHdpbGwgbm8gbG9uZ2VyCiAgICAgZW5hYmxlIE5VTEwgY2lwaGVycy4gVGhleSBuZWVkIHRvIGJlIHNwZWNpZmljYWxseSBlbmFibGVkIGUuZy4gd2l0aAogICAgIHRoZSBzdHJpbmcgIkRFRkFVTFQ6ZU5VTEwiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBSU0EgcHJpdmF0ZSBlbmNyeXB0aW9uIHJvdXRpbmVzOiBpZiBwIDwgcSB0aGVuIGl0IHdvdWxkCiAgICAgb2NjYXNpb25hbGx5IHByb2R1Y2UgYW4gaW52YWxpZCByZXN1bHQuIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoCiAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQga2V5cyBiZWNhdXNlIE9wZW5TU0wgKGFuZCBTU0xlYXkpIGVuc3VyZSBwID4gcS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZSBsZXNzIHJlc3RyaWN0aXZlIGFuZCBhbGxvdyBhbHNvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwKICAgICAvcGF0aC90by9iaW4vcGVybCcgaW4gYWRkaXRpb24gdG8gYHBlcmwgdXRpbC9wZXJscGF0aC5wbCAvcGF0aC90by9iaW4nLAogICAgIGJlY2F1c2UgdGhpcyB3YXkgb25lIGNhbiBhbHNvIHVzZSBhbiBpbnRlcnByZXRlciBuYW1lZCBgcGVybDUnICh3aGljaCBpcwogICAgIHVzdWFsbHkgdGhlIG5hbWUgb2YgUGVybCA1Lnh4eCBvbiBwbGF0Zm9ybXMgd2hlcmUgYW4gUGVybCA0LnggaXMgc3RpbGwKICAgICBpbnN0YWxsZWQgYXMgYHBlcmwnKS4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIExldCB1dGlsL2NsZWFuLWRlcGVuZC5wbCB3b3JrIGFsc28gd2l0aCBvbGRlciBQZXJsIDUuMDB4IHZlcnNpb25zLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgRml4IE1ha2VmaWxlLm9yZyBzbyBDQyxDRkxBRyBldGMgYXJlIHBhc3NlZCB0byAnbWFrZSBsaW5rcycgYWRkCiAgICAgYWR2YXBpMzIubGliIHRvIFdpbjMyIGJ1aWxkIGFuZCBjaGFuZ2UgdGhlIHBlbSB0ZXN0IGNvbXBhcmlzaW9uCiAgICAgdG8gZmMuZXhlICh0aGFua3MgdG8gVWxyaWNoIEtyb2VuZXIgPGtyb25lcnVAeWFob28uY29tPiBmb3IgdGhlCiAgICAgc3VnZ2VzdGlvbikuIEZpeCBtaXNwbGFjZWQgQVNOSSBwcm90b3R5cGVzIGFuZCBkZWNsYXJhdGlvbnMgaW4gZXZwLmgKICAgICBhbmQgY3J5cHRvL2Rlcy9lZGVfY2JjbV9lbmMuYy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBERVMgcXVhZCBjaGVja3N1bSB3YXMgYnJva2VuIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvbW1lbnQgb3V0IHR3byBmdW5jdGlvbnMgaW4gYmlvLmggdGhhdCBhcmVuJ3QgaW1wbGVtZW50ZWQuIEZpeCB1cCB0aGUKICAgICBXaW4zMiB0ZXN0IGJhdGNoIGZpbGUgc28gaXQgKG1pZ2h0KSB3b3JrIGFnYWluLiBUaGUgV2luMzIgdGVzdCBiYXRjaCBmaWxlCiAgICAgaXMgaG9ycmlibGU6IEkgZmVlbCBpbGwuLi4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSB2YXJpb3VzICNpZmRlZnMgYXJvdW5kIHNvIE5PX1NZU0xPRywgTk9fRElSRU5UIGV0YyBhcmUgbm93IHNlbGVjdGVkCiAgICAgaW4gZV9vcy5oLiBBdWRpdCBvZiBoZWFkZXIgZmlsZXMgdG8gY2hlY2sgQU5TSSBhbmQgbm9uIEFOU0kKICAgICBzZWN0aW9uczogMTAgZnVuY3Rpb25zIHdlcmUgYWJzZW50IGZyb20gbm9uIEFOU0kgc2VjdGlvbiBhbmQgbm90IGV4cG9ydGVkCiAgICAgZnJvbSBXaW5kb3dzIERMTHMuIEZpeGVkIHVwIGxpYmVheS5udW0gZm9yIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBgb3BlbnNzbCB2ZXJzaW9uJyBvdXRwdXQgbGluZXMgY29uc2lzdGVudC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IFdpbjMyIHN5bWJvbCBleHBvcnQgbGlzdHMgZm9yIEJJTyBmdW5jdGlvbnM6IEFkZGVkCiAgICAgQklPX2dldF9leF9uZXdfaW5kZXgsIEJJT19nZXRfZXhfbnVtLCBCSU9fZ2V0X2V4X2RhdGEgYW5kIEJJT19zZXRfZXhfZGF0YQogICAgIHRvIG1zL2xpYmVheXsxNiwzMn0uZGVmLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBTZWNvbmQgcm91bmQgb2YgZml4aW5nIHRoZSBPcGVuU1NMIHBlcmwvIHN0dWZmLiBJdCBub3cgYXQgbGVhc3QgY29tcGlsZWQKICAgICBmaW5lIHVuZGVyIFVuaXggYW5kIHBhc3NlcyBzb21lIHRyaXZpYWwgdGVzdHMgSSd2ZSBub3cgYWRkZWQuIEJ1dCB0aGUKICAgICB3aG9sZSBzdHVmZiBpcyBob3JyaWJseSBpbmNvbXBsZXRlLCBzbyBhIFJFQURNRS4xU1Qgd2l0aCBhIGRpc2NsYWltZXIgd2FzCiAgICAgYWRkZWQgdG8gbWFrZSBzdXJlIG5vIG9uZSBleHBlY3RzIHRoYXQgdGhpcyBzdHVmZiByZWFsbHkgd29ya3MgaW4gdGhlCiAgICAgT3BlblNTTCAwLjkuMiByZWxlYXNlLiAgQWRkaXRpb25hbGx5IEkndmUgc3RhcnRlZCB0byBjbGVhbiB0aGUgWFMgc291cmNlcwogICAgIHVwIGFuZCBmaXhlZCBhIGZldyBsaXR0bGUgYnVncyBhbmQgaW5jb25zaXN0ZW5jaWVzIGluIE9wZW5TU0wue3BtLHhzfSBhbmQKICAgICBvcGVuc3NsX2Jpby54cy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBnZW5lcmF0aW9uIG9mIHR3byBwYXJ0IGFkZHJlc3NlcyBpbiBwZXJsLgogICAgIFtLZW5qaSBNaXlha2UgPGtlbmppQG1peWFrZS5vcmc+LCBpbnRlZ3JhdGVkIGJ5IEJlbiBMYXVyaWVdCgogICopIEFkZCBjb25maWcgZW50cnkgZm9yIExpbnV4IG9uIE1JUFMuCiAgICAgW0pvaG4gVG9iZXkgPGp0b2JleUBjaGFubmVsMS5jb20+XQoKICAqKSBNYWtlIGxpbmtzIHdoZW5ldmVyIENvbmZpZ3VyZSBpcyBydW4sIHVubGVzcyB3ZSBhcmUgb24gV2luZG96ZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgUGVybWl0IGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgdG8gQ1JMcyB1c2luZyBjcmxfc2VjdGlvbiBpbiBvcGVuc3NsLmNuZi4KICAgICBDdXJyZW50bHkgb25seSBpc3N1ZXJBbHROYW1lIGFuZCBBdXRob3JpdHlLZXlJZGVudGlmaWVyIG1ha2UgYW55IHNlbnNlCiAgICAgaW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSB1c2VmdWwga2x1ZGdlIHRvIGFsbG93IHBhY2thZ2UgbWFpbnRhaW5lcnMgdG8gc3BlY2lmeSBjb21waWxlciBhbmQKICAgICBvdGhlciBwbGF0Zm9ybXMgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGhvdXQgaGF2aW5nIHRvIHBhdGNoIHRoZQogICAgIENvbmZpZ3VyZSBzY3JpcHQgZXZlcnl0aW1lOiBPbmUgbm93IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZQogICAgIDxpZD46PGRldGFpbHM+JycsIGkuZS4gcGxhdGZvcm0gaWRzIGFyZSBhbGxvd2VkIHRvIGhhdmUgZGV0YWlscyBhcHBlbmRlZAogICAgIHRvIHRoZW0gKHNlcGVyYXRlZCBieSBjb2xvbnMpLiBUaGlzIGlzIHRyZWF0ZWQgYXMgdGhlcmUgd291bGQgYmUgYSBzdGF0aWMKICAgICBwcmUtY29uZmlndXJlZCBlbnRyeSBpbiBDb25maWd1cmUncyAldGFibGUgdW5kZXIga2V5IDxpZD4gd2l0aCB2YWx1ZQogICAgIDxkZXRhaWxzPiBhbmQgYGBwZXJsIENvbmZpZ3VyZSA8aWQ+JycgaXMgY2FsbGVkLiAgU28sIHdoZW4geW91IHdhbnQgdG8KICAgICBwZXJmb3JtIGEgcXVpY2sgdGVzdC1jb21waWxlIHVuZGVyIEZyZWVCU0QgMy4xIHdpdGggcGdjYyBhbmQgd2l0aG91dAogICAgIGFzc2VtYmxlciBzdHVmZiB5b3UgY2FuIHVzZSBgYHBlcmwgQ29uZmlndXJlICJGcmVlQlNELWVsZjpwZ2NjOi1PNjo6OiInJwogICAgIG5vdywgd2hpY2ggb3ZlcnJpZGVzIHRoZSBGcmVlQlNELWVsZiBlbnRyeSBvbi10aGUtZmx5LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBEaXNhYmxlIG5ldyBUTFMxIGNpcGhlcnN1aXRlcyBieSBkZWZhdWx0OiB0aGV5IGFyZW4ndCBvZmZpY2lhbCB5ZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFsbG93IERTTyBmbGFncyBsaWtlIC1mcGljLCAtZlBJQywgLUtQSUMgZXRjLiB0byBiZSBzcGVjaWZpZWQKICAgICBvbiB0aGUgYHBlcmwgQ29uZmlndXJlIC4uLicgY29tbWFuZCBsaW5lLiBUaGlzIHdheSBvbmUgY2FuIGNvbXBpbGUKICAgICBPcGVuU1NMIGxpYnJhcmllcyB3aXRoIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKFBJQykgd2hpY2ggaXMgbmVlZGVkCiAgICAgZm9yIGxpbmtpbmcgaXQgaW50byBEU09zLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1hcmthYmx5LCBleHBvcnQgY2lwaGVycyB3ZXJlIHRvdGFsbHkgYnJva2VuIGFuZCBuby1vbmUgaGFkIG5vdGljZWQhCiAgICAgRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENsZWFuZWQgdXAgdGhlIExJQ0VOU0UgZG9jdW1lbnQ6IFRoZSBvZmZpY2lhbCBjb250YWN0IGZvciBhbnkgbGljZW5zZQogICAgIHF1ZXN0aW9ucyBub3cgaXMgdGhlIE9wZW5TU0wgY29yZSB0ZWFtIHVuZGVyIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KICAgICBBbmQgYWRkIGEgcGFyYWdyYXBoIGFib3V0IHRoZSBkdWFsLWxpY2Vuc2Ugc2l0dWF0aW9uIHRvIG1ha2Ugc3VyZSBwZW9wbGUKICAgICByZWNvZ25pemUgdGhhdCBfQk9USF8gdGhlIE9wZW5TU0wgbGljZW5zZSBfQU5EXyB0aGUgU1NMZWF5IGxpY2Vuc2UgYXBwbHkKICAgICB0byB0aGUgT3BlblNTTCB0b29sa2l0LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBHZW5lcmFsIHNvdXJjZSB0cmVlIG1ha2VmaWxlIGNsZWFudXBzOiBNYWRlIGBtYWtpbmcgeHh4IGluIHl5eS4uLicKICAgICBkaXNwbGF5IGNvbnNpc3RlbnQgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCByZXBsYWNlZCBgL2Jpbi9ybScgYnkgYHJtJy4KICAgICBBZGRpdG9uYWxseSBjbGVhbmVkIHVwIHRoZSBgbWFrZSBsaW5rcycgdGFyZ2V0OiBSZW1vdmUgdW5uZWNlc3NhcnkKICAgICBzZW1pY29sb25zLCBzdWJzZXF1ZW50IHJlZHVuZGFudCByZW1vdmVzLCBpbmxpbmUgcG9pbnQuc2ggaW50byBta2xpbmsuc2gKICAgICB0byBzcGVlZCBwcm9jZXNzaW5nIGFuZCBubyBsb25nZXIgY2x1dHRlciB0aGUgZGlzcGxheSB3aXRoIGNvbmZ1c2luZwogICAgIHN0dWZmLiBJbnN0ZWFkIG9ubHkgdGhlIGFjdHVhbGx5IGRvbmUgbGlua3MgYXJlIGRpc3BsYXllZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUGVybWl0IG51bGwgZW5jcnlwdGlvbiBjaXBoZXJzdWl0ZXMsIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIG9ubHkuIEl0IHVzZWQKICAgICB0byBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoZSBwcmVwcm9jZXNzb3IgZGVmaW5lIFNTTF9BTExPV19FTlVMTCB0byBkbyB0aGlzLgogICAgIEl0IGlzIG5vdyBuZWNlc3NhcnkgdG8gc2V0IFNTTF9GT1JCSURfRU5VTEwgdG8gcHJldmVudCB0aGUgdXNlIG9mIG51bGwKICAgICBlbmNyeXB0aW9uLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBidW5jaCBvZiBmaXhlcyB0byB0aGUgUEtDUyM3IHN0dWZmLiBJdCB1c2VkIHRvIHNvbWV0aW1lcyByZW9yZGVyCiAgICAgc2lnbmVkIGF0dHJpYnV0ZXMgd2hlbiB2ZXJpZnlpbmcgc2lnbmF0dXJlcyAodGhpcyB3b3VsZCBicmVhayB0aGVtKSwgCiAgICAgdGhlIGRldGFjaGVkIGRhdGEgZW5jb2Rpbmcgd2FzIHdyb25nIGFuZCBwdWJsaWMga2V5cyBvYnRhaW5lZCB1c2luZwogICAgIFg1MDlfZ2V0X3B1YmtleSgpIHdlcmVuJ3QgZnJlZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEJVRkZFUiBmdW5jdGlvbnMuIEFsc28gYWRkZWQgYSB3b3JrIGFyb3VuZAogICAgIHRvIGEgV2luOTUgY29uc29sZSBidWcuIFRoaXMgd2FzIHRyaWdnZXJlZCBieSB0aGUgcGFzc3dvcmQgcmVhZCBzdHVmZjogdGhlCiAgICAgbGFzdCBjaGFyYWN0ZXIgdHlwZWQgZ2V0cyBjYXJyaWVkIG92ZXIgdG8gdGhlIG5leHQgZnJlYWQoKS4gSWYgeW91IHdlcmUgCiAgICAgZ2VuZXJhdGluZyBhIG5ldyBjZXJ0IHJlcXVlc3QgdXNpbmcgJ3JlcScgZm9yIGV4YW1wbGUgdGhlbiB0aGUgbGFzdAogICAgIGNoYXJhY3RlciBvZiB0aGUgcGFzc3BocmFzZSB3b3VsZCBiZSBDUiB3aGljaCB3b3VsZCB0aGVuIGVudGVyIHRoZSBmaXJzdAogICAgIGZpZWxkIGFzIGJsYW5rLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBuZXcgYEluY2x1ZGVzIE9wZW5TU0wgQ3J5cHRvZ3JhcGh5IFNvZnR3YXJlJyBidXR0b24gYXMKICAgICBkb2Mvb3BlbnNzbF9idXR0b24ue2dpZixodG1sfSB3aGljaCBpcyBzaW1pbGFyIGluIHN0eWxlIHRvIHRoZSBvbGQgU1NMZWF5CiAgICAgYnV0dG9uIGFuZCBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgYmFzZWQgb24gT3BlblNTTCB0byBzaG93IHRoZQogICAgIHJlbGF0aW9uc2hpcCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LiAgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZSBjb25mdXNpbmcgdmFyaWFibGVzIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXMgaW4gZmlsZXMKICAgICBzc2wvc3NsX2xpYi5jIGFuZCBzc2wvc3NsLmguCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBEb24ndCBpbnN0YWxsIGJzc19maWxlLmMgdW5kZXIgUFJFRklYL2luY2x1ZGUvCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBHZXQgdGhlIFdpbjMyIGNvbXBpbGUgd29ya2luZyBhZ2Fpbi4gTW9kaWZ5IG1rZGVmLnBsIHNvIGl0IGNhbiBoYW5kbGUKICAgICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGhhcyBzdXBwb3J0IGZvciBOVCBzcGVjaWZpYwogICAgIHN0dWZmLiBGaXggbWsxbWYucGwgYW5kIFZDLTMyLnBsIHRvIHN1cHBvcnQgTlQgZGlmZmVyZW5jZXMgYWxzby4gVmFyaW91cwogICAgICNpZmRlZiBXSU4zMiBhbmQgV0lOTlRzIHNwcmlua2xlZCBhYm91dCB0aGUgcGxhY2UgYW5kIHNvbWUgY2hhbmdlcyBmcm9tCiAgICAgdW5zaWduZWQgdG8gc2lnbmVkIHR5cGVzOiB0aGlzIHdhcyBraWxsaW5nIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgY2VydGlmaWNhdGUgZmlsZSB0byBzdGFjayBmdW5jdGlvbnMsCiAgICAgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjaygpIGFuZAogICAgIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkuICBUaGVzZSBsYXJnZWx5IHN1cHBsYW50CiAgICAgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoKSwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBtdWx0aXBsZSBjZXJ0cyBlYXNpbHkKICAgICB0byBhIHN0YWNrICh1c3VhbGx5IHRoaXMgaXMgdGhlbiBoYW5kZWQgdG8gU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoKSkuCiAgICAgVGhpcyBtZWFucyB0aGF0IEFwYWNoZS1TU0wgYW5kIHNpbWlsYXIgcGFja2FnZXMgZG9uJ3QgaGF2ZSB0byBtZXNzIGFyb3VuZAogICAgIHRvIGFkZCBhcyBtYW55IENBcyBhcyB0aGV5IHdhbnQgdG8gdGhlIHByZWZlcnJlZCBsaXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFeHBlcmltZW50IHdpdGggZG94eWdlbiBkb2N1bWVudGF0aW9uLiBDdXJyZW50bHkgb25seSBwYXJ0aWFsbHkgYXBwbGllZCB0bwogICAgIHNzbC9zc2xfbGliLmMuCiAgICAgU2VlIGh0dHA6Ly93d3cuc3RhY2submwvfmRpbWl0cmkvZG94eWdlbi9pbmRleC5odG1sLCBhbmQgcnVuIGRveHlnZW4gd2l0aAogICAgIG9wZW5zc2wuZG94eSBhcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIFtCZW4gTGF1cmllXQogIAogICopIEdldCByaWQgb2YgcmVtYWluaW5nIEMrKy1zdHlsZSBjb21tZW50cyB3aGljaCBzdHJpY3QgQyBjb21waWxlcnMgaGF0ZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgcG9pbnRlZCBvdXQgYnkgQ2FybG9zIEFtZW5ndWFsXQoKICAqKSBDaGFuZ2VkIEJOX1JFQ1VSU0lPTiBpbiBibl9tb250LmMgdG8gQk5fUkVDVVJTSU9OX01PTlQgc28gaXQgaXMgbm90CiAgICAgY29tcGlsZWQgaW4gYnkgZGVmYXVsdDogaXQgaGFzIHByb2JsZW1zIHdpdGggbGFyZ2Uga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBTU0xfeHh4KCkgZnVuY3Rpb25zIGZvciBjb25maWd1cmluZyB0aGUgdGVtcG9yYXJ5IFJTQSBhbmQKICAgICBESCBwcml2YXRlIGtleXMgYW5kL29yIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aGljaCBkaXJlY3RseSBjb3JyZXNwb25kIHRvCiAgICAgdGhlaXIgU1NMX0NUWF94eHgoKSBjb3VudGVycGFydHMgYnV0IHdvcmsgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4gVGhpcwogICAgIGlzIG5lZWRlZCBmb3IgYXBwbGljYXRpb25zIHdoaWNoIGhhdmUgdG8gY29uZmlndXJlIGNlcnRpZmljYXRlcyBvbiBhCiAgICAgcGVyLWNvbm5lY3Rpb24gYmFzaXMgKGUuZy4gQXBhY2hlK21vZF9zc2wpIGluc3RlYWQgb2YgYSBwZXItY29udGV4dCBiYXNpcwogICAgIChlLmcuIHNfc2VydmVyKS4gCiAgICAgICAgRm9yIHRoZSBSU0EgY2VydGlmaWNhdGUgc2l0dWF0aW9uIGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UsIGJ1dAogICAgIGZvciB0aGUgRFNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiB0aGlzIGZpeGVzIHRoZSAibm8gc2hhcmVkIGNpcGhlciIKICAgICBwcm9ibGVtIHdoZXJlIHRoZSBPcGVuU1NMIGNpcGhlciBzZWxlY3Rpb24gcHJvY2VkdXJlIGZhaWxlZCBiZWNhdXNlIHRoZQogICAgIHRlbXBvcmFyeSBrZXlzIHdlcmUgbm90IG92ZXJ0YWtlbiBmcm9tIHRoZSBjb250ZXh0IGFuZCB0aGUgQVBJIHByb3ZpZGVkCiAgICAgbm8gd2F5IHRvIHJlY29uZmlndXJlIHRoZW0uIAogICAgICAgIFRoZSBuZXcgZnVuY3Rpb25zIG5vdyBsZXQgYXBwbGljYXRpb25zIHJlY29uZmlndXJlIHRoZSBzdHVmZiBhbmQgdGhleQogICAgIGFyZSBpbiBkZXRhaWw6IFNTTF9uZWVkX3RtcF9SU0EsIFNTTF9zZXRfdG1wX3JzYSwgU1NMX3NldF90bXBfZGgsCiAgICAgU1NMX3NldF90bXBfcnNhX2NhbGxiYWNrIGFuZCBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjay4gIEFkZGl0aW9uYWxseSBhIG5ldwogICAgIG5vbi1wdWJsaWMtQVBJIGZ1bmN0aW9uIHNzbF9jZXJ0X2luc3RhbnRpYXRlKCkgaXMgdXNlZCBhcyBhIGhlbHBlcgogICAgIGZ1bmN0aW9uIGFuZCBhbHNvIHRvIHJlZHVjZSBjb2RlIHJlZHVuZGFuY3kgaW5zaWRlIHNzbF9yc2EuYy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW92ZSBzX3NlcnZlciAtZGNlcnQgYW5kIC1ka2V5IG9wdGlvbnMgb3V0IG9mIHRoZSB1bmRvY3VtZW50ZWQgZmVhdHVyZQogICAgIGFyZWEgYmVjYXVzZSB0aGV5IGFyZSB1c2VmdWwgZm9yIHRoZSBEU0Egc2l0dWF0aW9uIGFuZCBzaG91bGQgYmUKICAgICByZWNvZ25pemVkIGJ5IHRoZSB1c2Vycy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBjaXBoZXIgZGVjaXNpb24gc2NoZW1lIGZvciBleHBvcnQgY2lwaGVyczogdGhlIGV4cG9ydCBiaXRzIGFyZQogICAgICpub3QqIHdpdGhpbiBTU0xfTUtFWV9NQVNLIG9yIFNTTF9BVVRIX01BU0ssIHRoZXkgYXJlIHdpdGhpbgogICAgIFNTTF9FWFBfTUFTSy4gIFNvLCB0aGUgb3JpZ2luYWwgdmFyaWFibGUgaGFzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKICAgICBhbHJlYWR5IG1hc2tlZCB2YXJpYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRml4ICdwb3J0JyB2YXJpYWJsZSBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGluIGNyeXB0by9iaW8vYl9zb2NrLmMKICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgYW5vdGhlciBtZF9sZW4gdmFyaWFibGUgaW4gcGs3X2RvaXQuYzpQS0NTN19kYXRhRmluYWwoKQogICAgIGZyb20gYGludCcgdG8gYHVuc2lnbmVkIGludCcgYmVjYXVzZSBpdCdzIGEgbGVuZ3RoIGFuZCBpbml0aWFsaXplZCBieQogICAgIEVWUF9EaWdlc3RGaW5hbCgpIHdoaWNoIGV4cGVjdHMgYW4gYHVuc2lnbmVkIGludCAqJy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaGFyZC1jb2RlIHBhdGggdG8gUGVybCBpbnRlcnByZXRlciBvbiBzaGViYW5nIGxpbmUgb2YgQ29uZmlndXJlCiAgICAgc2NyaXB0LiBJbnN0ZWFkIHVzZSB0aGUgdXN1YWwgU2hlbGwtPlBlcmwgdHJhbnNpdGlvbiB0cmljay4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBgb3BlbnNzbCB4NTA5IC1ub291dCAtbW9kdWx1cycgZnVuY3Rpb25hbCBhbHNvIGZvciBEU0EgY2VydGlmaWNhdGVzCiAgICAgKGluIGFkZGl0aW9uIHRvIFJTQSBjZXJ0aWZpY2F0ZXMpIHRvIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgYG9wZW5zc2wgZHNhCiAgICAgLW5vb3V0IC1tb2R1bHVzJyBhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UgZm9yIGBvcGVuc3NsIHJzYSAtbm9vdXQKICAgICAtbW9kdWx1cycuICBGb3IgUlNBIHRoZSAtbW9kdWx1cyBpcyB0aGUgcmVhbCAibW9kdWx1cyIgd2hpbGUgZm9yIERTQQogICAgIGN1cnJlbnRseSB0aGUgcHVibGljIGtleSBpcyBwcmludGVkIChhIGRlY2lzaW9uIHdoaWNoIHdhcyBhbHJlYWR5IGRvbmUgYnkKICAgICBgb3BlbnNzbCBkc2EgLW1vZHVsdXMnIGluIHRoZSBwYXN0KSB3aGljaCBzZXJ2ZXMgYSBzaW1pbGFyIHB1cnBvc2UuCiAgICAgQWRkaXRpb25hbGx5IHRoZSBOT19SU0Egbm8gbG9uZ2VyIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgd2hvbGUgLW1vZHVsdXMKICAgICBvcHRpb247IGl0IG5vdyBvbmx5IGF2b2lkcyB1c2luZyB0aGUgUlNBIHN0dWZmLiBTYW1lIGFwcGxpZXMgdG8gTk9fRFNBCiAgICAgbm93LCB0b28uCiAgICAgW1JhbGYgUy4gIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgQXJuZSBBbnNwZXIncyByZWxpYWJsZSBCSU8gLSB0aGlzIGlzIGFuIGVuY3J5cHRlZCwgYmxvY2stZGlnZXN0ZWQKICAgICBCSU8uIFNlZSB0aGUgc291cmNlIChjcnlwdG8vZXZwL2Jpb19vay5jKSBmb3IgbW9yZSBpbmZvLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBEdW1wIHRoZSBvbGQgeXVja3kgcmVxIGNvZGUgdGhhdCB0cmllZCAoYW5kIGZhaWxlZCkgdG8gYWxsb3cgcmF3IE9JRHMKICAgICB0byBiZSBhZGRlZC4gTm93IGJvdGggJ3JlcScgYW5kICdjYScgY2FuIHVzZSBuZXcgb2JqZWN0cyBkZWZpbmVkIGluIHRoZQogICAgIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb29sIEJJTyB0aGF0IGRvZXMgc3lzbG9nIChvciBldmVudCBsb2cgb24gTlQpLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+LCBpbnRlZ3JhdGVkIGJ5IEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBuZXcgVExTIGNpcGhlcnN1aXRlcywgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDNF81Nl9NRDUsCiAgICAgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDMl9DQkNfNTZfTUQ1IGFuZAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9ERVNfQ0JDX1NIQSwgYXMgc3BlY2lmaWVkIGluICI1Ni1iaXQgRXhwb3J0IENpcGhlcgogICAgIFN1aXRlcyBGb3IgVExTIiwgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMC50eHQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBwcmVsaW1pbmFyeSBjb25maWcgaW5mbyBmb3IgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUlNBX05PX1BBRERJTkcgcmVhbGx5IHVzZSBubyBwYWRkaW5nLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgR2VuZXJhdGUgZXJyb3JzIHdoZW4gcHJpdmF0ZS9wdWJsaWMga2V5IGNoZWNrIGlzIGRvbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE92ZXJoYXVsIGZvciAnY3JsJyB1dGlsaXR5LiBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfcHJpbnQuIFBhcnRpYWwgc3VwcG9ydAogICAgIGZvciBzb21lIENSTCBleHRlbnNpb25zIGFuZCBuZXcgb2JqZWN0cyBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWFsbHkgZml4IHRoZSBBU04xIElNUExJQ0lUIGJ1ZyB0aGlzIHRpbWUuLi4gUGFydGlhbCBzdXBwb3J0IGZvciBwcml2YXRlCiAgICAga2V5IHVzYWdlIGV4dGVuc2lvbiBhbmQgZnVsbGVyIHN1cHBvcnQgZm9yIGF1dGhvcml0eSBrZXkgaWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIE9BRVAgZW5jcnlwdGlvbiBmb3IgdGhlIE9wZW5TU0wgY3J5cHRvIGxpYnJhcnkuIE9BRVAgaXMgdGhlIGltcHJvdmVkCiAgICAgcGFkZGluZyBtZXRob2QgZm9yIFJTQSwgd2hpY2ggaXMgcmVjb21tZW5kZWQgZm9yIG5ldyBhcHBsaWNhdGlvbnMgaW4gUEtDUwogICAgICMxIHYyLjAgKFJGQyAyNDM3LCBPY3RvYmVyIDE5OTgpLgogICAgIE9BRVAgKE9wdGltYWwgQXN5bW1ldHJpYyBFbmNyeXB0aW9uIFBhZGRpbmcpIGhhcyBiZXR0ZXIgdGhlb3JldGljYWwKICAgICBmb3VuZGF0aW9ucyB0aGFuIHRoZSBhZC1ob2MgcGFkZGluZyB1c2VkIGluIFBLQ1MgIzEgdjEuNS4gSXQgaXMgc2VjdXJlCiAgICAgYWdhaW5zdCBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUlNBLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPiwgcmVmb3JtYXR0ZWQsIGNvcnJlY3RlZCBhbmQgaW50ZWdyYXRlZCBieQogICAgICBCZW4gTGF1cmllXQoKICAqKSBVcGRhdGVzIHRvIHRoZSBuZXcgU1NMIGNvbXByZXNzaW9uIGNvZGUKICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBGaXggc28gdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG1hc3RlciBzZWNyZXQsIHdoZW4gcGFzc2VkCiAgICAgdmlhIFJTQSwgY2hlY2tzIHRoYXQgaWYgVExTIHdhcyBwcm9wb3NlZCwgYnV0IHdlIHJvbGwgYmFjayB0byBTU0x2MwogICAgIChiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbCBub3QgYWNjZXB0IGhpZ2hlciksIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgaXMgMHgwMywweDAxLCBub3QgMHgwMywweDAwCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgUnVuIGV4dGVuc2l2ZSBtZW1vcnkgbGVhayBjaGVja3Mgb24gU1NMIGFwcHMuIEZpeGVkICpsb3RzKiBvZiBtZW1vcnkKICAgICBsZWFrcyBpbiBzc2wvIHJlbGF0aW5nIHRvIG5ldyBYNTA5X2dldF9wdWJrZXkoKSBiZWhhdmlvdXIuIEFsc28gZml4ZXMKICAgICBpbiBhcHBzLyBhbmQgYW4gdW5yZWxhdGVkIGxlYWsgaW4gY3J5cHRvL2RzYS9kc2FfdnJmLmMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBSQVcgZXh0ZW5zaW9ucyB3aGVyZSBhbiBhcmJpdHJhcnkgZXh0ZW5zaW9uIGNhbiBiZQogICAgIGNyZWF0ZWQgYnkgaW5jbHVkaW5nIGl0cyBERVIgZW5jb2RpbmcuIFNlZSBhcHBzL29wZW5zc2wuY25mIGZvcgogICAgIGFuIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBzdXJlIGxhdGVzdCBQZXJsIHZlcnNpb25zIGRvbid0IGludGVycHJldCBzb21lIGdlbmVyYXRlZCBDIGFycmF5CiAgICAgY29kZSBhcyBQZXJsIGFycmF5IGNvZGUgaW4gdGhlIGNyeXB0by9lcnIvZXJyX2dlbmMucGwgc2NyaXB0LgogICAgIFtMYXJzIFdlYmVyIDwzd2ViZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIE1vZGlmeSBtcy9kb19tcy5iYXQgdG8gbm90IGdlbmVyYXRlIGFzc2VtYmx5IGxhbmd1YWdlIG1ha2VmaWxlcyBzaW5jZQogICAgIG5vdCBtYW55IHBlb3BsZSBoYXZlIHRoZSBhc3NlbWJsZXIuIFZhcmlvdXMgV2luMzIgY29tcGlsYXRpb24gZml4ZXMgYW5kCiAgICAgdXBkYXRlIHRvIHRoZSBJTlNUQUxMLlczMiBmaWxlIHdpdGggKGhvcGVmdWxseSkgbW9yZSBhY2N1cmF0ZSBXaW4zMgogICAgIGJ1aWxkIGluc3RydWN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29uZmlndXJlIHNjcmlwdCAnQ29uZmlndXJlJyB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBjcnlwdG8vZGF0ZS5oCiAgICAgZmlsZSB1bmRlciBXaW4zMiBhbmQgYWxzbyBidWlsZCBwZW0uaCBmcm9tIHBlbS5vcmcuIE5ldyBzY3JpcHQKICAgICB1dGlsL21rZmlsZXMucGwgdG8gY3JlYXRlIHRoZSBNSU5GTyBmaWxlIG9uIGVudmlyb25tZW50cyB0aGF0IGNhbid0IGRvIGEKICAgICAnbWFrZSBmaWxlcyc6IHBlcmwgdXRpbC9ta2ZpbGVzLnBsID5NSU5GTyBzaG91bGQgd29yay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWpvciByZXdvcmsgb2YgREVTIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgaW4gdGhlIHB1cnN1aXQgb2YgY29ycmVjdG5lc3MKICAgICBhbmQgcHVyaXR5LiBBcyBhIHJlc3VsdCwgbWFueSBldmlsIGNhc3RzIGV2YXBvcmF0ZWQsIGFuZCBzb21lIHdlaXJkbmVzcywKICAgICB0b28uIFlvdSBtYXkgZmluZCB0aGlzIGNhdXNlcyB3YXJuaW5ncyBpbiB5b3VyIGNvZGUuIFphcHBpbmcgeW91ciBldmlsCiAgICAgY2FzdHMgd2lsbCBwcm9iYWJseSBmaXggdGhlbS4gTW9zdGx5LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGEgdHlwbyBpbiBhc24xLmguIEJ1ZyBmaXggdG8gb2JqZWN0IGNyZWF0aW9uIHNjcmlwdAogICAgIG9ial9kYXQucGwuIEl0IGNvbnNpZGVyZWQgYSB6ZXJvIGluIGFuIG9iamVjdCBkZWZpbml0aW9uIHRvIG1lYW4KICAgICAiZW5kIG9mIG9iamVjdCI6IG5vbmUgb2YgdGhlIG9iamVjdHMgaW4gb2JqZWN0cy5oIGhhdmUgYW55IHplcm9zCiAgICAgc28gaXQgd2Fzbid0IHNwb3R0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRXJ3YW5uIEFCQUxFQSA8ZWFiYWxlYUBjZXJ0cGx1cy5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVHJpcGxlIERFUyBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgd2l0aCBPdXRwdXQgRmVlZGJhY2sKICAgICBNYXNraW5nIChDQkNNKS4gSW4gdGhlIGFic2VuY2Ugb2YgdGVzdCB2ZWN0b3JzLCB0aGUgYmVzdCBJIGhhdmUgYmVlbiBhYmxlCiAgICAgdG8gZG8gaXMgY2hlY2sgdGhhdCB0aGUgZGVjcnlwdCB1bmRvZXMgdGhlIGVuY3J5cHQsIHNvIGZhci4gU2VuZCBtZSB0ZXN0CiAgICAgdmVjdG9ycyBpZiB5b3UgaGF2ZSB0aGVtLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb3JyZWN0IGNhbGN1bGF0aW9uIG9mIGtleSBsZW5ndGggZm9yIGV4cG9ydCBjaXBoZXJzICh0b28gbXVjaCBzcGFjZSB3YXMKICAgICBhbGxvY2F0ZWQgZm9yIG51bGwgY2lwaGVycykuIFRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTW9kaWZpY2F0aW9ucyB0byB0aGUgbWtkZWYucGwgZm9yIFdpbjMyIERFRiBmaWxlIGNyZWF0aW9uLiBUaGUgdXNhZ2UKICAgICBtZXNzYWdlIGlzIG5vdyBjb3JyZWN0IChpdCB1bmRlcnN0YW5kcyAiY3J5cHRvIiBhbmQgInNzbCIgb24gaXRzCiAgICAgY29tbWFuZCBsaW5lKS4gVGhlcmUgaXMgYWxzbyBub3cgYW4gInVwZGF0ZSIgb3B0aW9uLiBUaGlzIHdpbGwgdXBkYXRlCiAgICAgdGhlIHV0aWwvc3NsZWF5Lm51bSBhbmQgdXRpbC9saWJlYXkubnVtIGZpbGVzIHdpdGggYW55IG5ldyBmdW5jdGlvbnMuCiAgICAgSWYgeW91IGRvIGE6IAogICAgIHBlcmwgdXRpbC9ta2RlZi5wbCBjcnlwdG8gc3NsIHVwZGF0ZQogICAgIGl0IHdpbGwgdXBkYXRlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3ZlcmhhdWxlZCB0aGUgUGVybCBpbnRlcmZhY2UgKHBlcmwvKik6CiAgICAgLSBwb3J0ZWQgQk4gc3R1ZmYgdG8gT3BlblNTTCdzIGRpZmZlcmVudCBCTiBsaWJyYXJ5CiAgICAgLSBtYWRlIHRoZSBwZXJsLyBzb3VyY2UgdHJlZSBDVlMtYXdhcmUKICAgICAtIHJlbmFtZWQgdGhlIHBhY2thZ2UgZnJvbSBTU0xlYXkgdG8gT3BlblNTTCAodGhlIGZpbGVzIHN0aWxsIGNvbnRhaW4KICAgICAgIHRoZWlyIGhpc3RvcnkgYmVjYXVzZSBJJ3ZlIGNvcGllZCB0aGVtIGluIHRoZSByZXBvc2l0b3J5KQogICAgIC0gcmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcyAodGhlIHRlc3Qgc2NyaXB0cyB3aWxsIGJlIHJlcGxhY2VkCiAgICAgICBieSBiZXR0ZXIgVGVzdDo6SGFybmVzcyB2YXJpYW50cyBpbiB0aGUgZnV0dXJlKQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXJzdCBjdXQgZm9yIGEgdmVyeSBjb25zZXJ2YXRpdmUgc291cmNlIHRyZWUgY2xlYW51cDoKICAgICAxLiBtZXJnZSB2YXJpb3VzIG9ic29sZXRlIHJlYWRtZSB0ZXh0cyBpbnRvIGRvYy9zc2xlYXkudHh0CiAgICAgd2hlcmUgd2UgY29sbGVjdCB0aGUgb2xkIGRvY3VtZW50cyBhbmQgcmVhZG1lIHRleHRzLgogICAgIDIuIHJlbW92ZSB0aGUgZmlyc3QgcGFydCBvZiBmaWxlcyB3aGVyZSBJJ20gYWxyZWFkeSBzdXJlIHRoYXQgd2Ugbm8KICAgICBsb25nZXIgbmVlZCB0aGVtIGJlY2F1c2Ugb2YgdGhyZWUgcmVhc29uczogZWl0aGVyIHRoZXkgYXJlIGp1c3QgdGVtcG9yYXJ5CiAgICAgZmlsZXMgd2hpY2ggd2VyZSBsZWZ0IGJ5IEVyaWMgb3IgdGhleSBhcmUgcHJlc2VydmVkIG9yaWdpbmFsIGZpbGVzIHdoZXJlCiAgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IHRoZSBkaWZmIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoZSBDVlMgdmlhICJjdnMgZGlmZgogICAgIC1yU1NMZWF5XzBfOF8xYiIgb3IgdGhleSB3ZXJlIHJlbmFtZWQgKGFzIGl0IHdhcyBkZWZpbml0ZWx5IHRoZSBjYXNlIGZvcgogICAgIHRoZSBjcnlwdG8vbWQvIHN0dWZmKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW9yZSBleHRlbnNpb24gY29kZS4gSW5jb21wbGV0ZSBzdXBwb3J0IGZvciBzdWJqZWN0IGFuZCBpc3N1ZXIgYWx0CiAgICAgbmFtZSwgaXNzdWVyIGFuZCBhdXRob3JpdHkga2V5IGlkLiBDaGFuZ2UgdGhlIGkydiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgYW5kIGFkZCBhbiBleHRyYSAnY3JsJyBwYXJhbWV0ZXIgaW4gdGhlIFg1MDlWM19DVFggc3RydWN0dXJlOiBndWVzcwogICAgIHdoYXQgdGhhdCdzIGZvciA6LSkgRml4IHRvIEFTTjEgbWFjcm8gd2hpY2ggbWVzc2VkIHVwCiAgICAgSU1QTElDSVQgdGFnIGFuZCBhZGQgZl9lbnVtLmMgd2hpY2ggYWRkcyBhMmksIGkyYSBmb3IgRU5VTUVSQVRFRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBFTlVNRVJBVEVEIHR5cGUuIFRoaXMgaXMgbGFyZ2VseSBjb3BpZWQgZnJvbSB0aGUKICAgICBJTlRFR0VSIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiwgRVZQX01EX0NUWF9jb3B5KCkgdG8gcmVwbGFjZSBmcmVxdWVudCB1c2Ugb2YgbWVtY3B5LgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIE1ha2Ugc3VyZSBgbWFrZSByZWhhc2gnIHRhcmdldCByZWFsbHkgZmluZHMgdGhlIGBvcGVuc3NsJyBwcm9ncmFtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgU3F1ZWV6ZSBhbm90aGVyIDclIG9mIHNwZWVkIG91dCBvZiBNRDUgYXNzZW1ibGVyLCBhdCBsZWFzdCBvbiBhIFAyLiBJJ2QKICAgICBsaWtlIHRvIGhlYXIgYWJvdXQgaXQgaWYgdGhpcyBzbG93cyBkb3duIG90aGVyIHByb2Nlc3NvcnMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBDeWdXaW4zMiBwbGF0Zm9ybSBpbmZvcm1hdGlvbiB0byBDb25maWd1cmUgc2NyaXB0LgogICAgIFtBbGFuIEJhdGllIDxiYXRpZUBhYWh6LmpmLmludGVsLmNvbT5dCgogICopIEZpeGVkIG1zLzMyYWxsLmJhdCBzY3JpcHQ6IGBub19hc20nIC0+IGBuby1hc20nCiAgICAgW1JhaW5lciBXLiBHZXJsaW5nIDxnZXJsaW5nQG1wZy1ndi5tcGcuZGU+XQogIAogICopIE5ldyBwcm9ncmFtIG5zZXEgdG8gbWFuaXB1bGF0ZSBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY3JsMnBrY3M3IHNvIGl0IHN1cHBvcnRzIG11bHRpcGxlIC1jZXJ0ZmlsZSBhcmd1bWVudHMuIEZpeCBhCiAgICAgZmV3IHR5cG9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIEJOIGNvZGUuICBQcmV2aW91c2x5IHRoZSBkZWZhdWx0IHdhcyB0byBkZWZpbmUgQk5fUkVDVVJTSU9OCiAgICAgYnV0IHRoZSBCTiBjb2RlIGhhZCBzb21lIHByb2JsZW1zIHRoYXQgd291bGQgY2F1c2UgZmFpbHVyZXMgd2hlbgogICAgIGRvaW5nIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMuCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgQWRkIEFTTjEgYW5kIFBFTSBjb2RlIHRvIHN1cHBvcnQgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2V2ZXJhbCBQS0lYIGFuZCBwcml2YXRlIGV4dGVuZGVkIGtleSB1c2FnZSBPSURzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgJ2NhJyBwcm9ncmFtIHRvIGhhbmRsZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLiBNb2RpZnkKICAgICBvcGVuc3NsLmNuZiBmb3IgbmV3IGV4dGVuc2lvbiBmb3JtYXQsIGFkZCBjb21tZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFg1MDkgVjMgY2hhbmdlcy4gRml4IHR5cG8gaW4gdjNfYml0c3RyLmMuIEFkZCBzdXBwb3J0IHRvICdyZXEnCiAgICAgYW5kIGFkZCBhIHNhbXBsZSB0byBvcGVuc3NsLmNuZiBzbyByZXEgLXg1MDkgbm93IGFkZHMgYXBwcm9wcmlhdGUKICAgICBDQSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVlZCBYNTA5IFYzIGNoYW5nZXMuIEFkZCB0byBvdGhlciBtYWtlZmlsZXMsIGludGVncmF0ZSB3aXRoIHRoZQogICAgIGVycm9yIGNvZGUsIGFkZCBpbml0aWFsIHN1cHBvcnQgdG8gWDUwOV9wcmludCgpIGFuZCB4NTA5IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRha2VzIGEgZGVlcCBicmVhdGggYW5kIHN0YXJ0IGFkZGRpbmcgWDUwOSBWMyBleHRlbnNpb24gc3VwcG9ydCBjb2RlLiBBZGQKICAgICBmaWxlcyBpbiBjcnlwdG8veDUwOXYzLiBNb3ZlIG9yaWdpbmFsIHN0dWZmIHRvIGNyeXB0by94NTA5djMvb2xkLiBBbGwgdGhpcwogICAgIHN0dWZmIGlzIGN1cnJlbnRseSBpc29sYXRlZCBhbmQgaXNuJ3QgZXZlbiBjb21waWxlZCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29udGludWluZyBwYXRjaGVzIGZvciBHZW5lcmFsaXplZFRpbWUuIEZpeCB1cCBjZXJ0aWZpY2F0ZSBhbmQgQ1JMCiAgICAgQVNOMSB0byB1c2UgQVNOMV9USU1FIGFuZCBtb2RpZnkgcHJpbnQgcm91dGluZXMgdG8gdXNlIEFTTjFfVElNRV9wcmludC4KICAgICBSZW1vdmVkIHRoZSB2ZXJzaW9ucyBjaGVjayBmcm9tIFg1MDkgcm91dGluZXMgd2hlbiBsb2FkaW5nIGV4dGVuc2lvbnM6CiAgICAgdGhpcyBhbGxvd3MgY2VydGFpbiBicm9rZW4gY2VydGlmaWNhdGVzIHRoYXQgZG9uJ3Qgc2V0IHRoZSB2ZXJzaW9uCiAgICAgcHJvcGVybHkgdG8gYmUgcHJvY2Vzc2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERlYWwgd2l0aCBpcnJpdGF0aW5nIHNoaXQgdG8gZG8gd2l0aCBkZXBlbmRlbmNpZXMsIGluIFlBQUhXIChZZXQgQW5vdGhlcgogICAgIEFkIEhvYyBXYXkpIC0gTWFrZWZpbGUuc3NscyBub3cgYWxsIGNvbnRhaW4gbG9jYWwgZGVwZW5kZW5jaWVzLCB3aGljaAogICAgIGNhbiBzdGlsbCBiZSByZWdlbmVyYXRlZCB3aXRoICJtYWtlIGRlcGVuZCIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFNwZWxsaW5nIG1pc3Rha2UgaW4gQyB2ZXJzaW9uIG9mIENBU1QtMTI4LgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBKZXJlbXkgSHlsdG9uIDxqZXJlbXlAY25yaS5yZXN0b24udmEudXM+XQoKICAqKSBDaGFuZ2VzIHRvIHRoZSBlcnJvciBnZW5lcmF0aW9uIGNvZGUuIFRoZSBwZXJsIHNjcmlwdCBlcnItY29kZS5wbCAKICAgICBub3cgcmVhZHMgaW4gdGhlIG9sZCBlcnJvciBjb2RlcyBhbmQgcmV0YWlucyB0aGUgb2xkIG51bWJlcnMsIG9ubHkKICAgICBhZGRpbmcgbmV3IG9uZXMgaWYgbmVjZXNzYXJ5LiBJdCBhbHNvIG9ubHkgY2hhbmdlcyB0aGUgLmVyciBmaWxlcyBpZiBuZXcKICAgICBjb2RlcyBhcmUgYWRkZWQuIFRoZSBtYWtlZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG9ubHkgaW5zZXJ0IGVycm9ycwogICAgIHdoZW4gbmVlZGVkICh0byBhdm9pZCBuZWVkbGVzc2x5IG1vZGlmeWluZyBoZWFkZXIgZmlsZXMpLiBUaGlzIGlzIGRvbmUKICAgICBieSBvbmx5IGluc2VydGluZyBlcnJvcnMgaWYgdGhlIC5lcnIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBhdXRvIGdlbmVyYXRlZAogICAgIEMgZmlsZS4gVG8gcmVidWlsZCBhbGwgdGhlIGVycm9yIGNvZGVzIGZyb20gc2NyYXRjaCAodGhlIG9sZCBiZWhhdmlvdXIpCiAgICAgZWl0aGVyIG1vZGlmeSBjcnlwdG8vTWFrZWZpbGUuc3NsIHRvIHBhc3MgdGhlIC1yZWdlbiBmbGFnIHRvIGVycl9jb2RlLnBsCiAgICAgb3IgZGVsZXRlIGFsbCB0aGUgLmVyciBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDQVNULTEyOCB3YXMgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgZm9yIHNob3J0IGtleXMuIFRoZSBDIHZlcnNpb24gaGFzCiAgICAgYmVlbiBmaXhlZCwgYnV0IGlzIHVudGVzdGVkLiBUaGUgYXNzZW1ibGVyIHZlcnNpb25zIGFyZSBhbHNvIGZpeGVkLCBidXQKICAgICBuZXcgYXNzZW1ibGVyIEhBUyBOT1QgQkVFTiBHRU5FUkFURUQgRk9SIFdJTjMyIC0gdGhlIE1ha2VmaWxlIG5lZWRzIGZpeGluZwogICAgIHRvIHJlZ2VuZXJhdGUgaXQgaWYgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCAod2l0aCBmaXggZm9yIEMgdmVyc2lvbikgYnkgSnVuLWljaGlybyBpdG9qdW4KICAgICAgSGFnaW5vIDxpdG9qdW5Aa2FtZS5uZXQ+XQoKICAqKSBGaWxlIHdhcyBvcGVuZWQgaW5jb3JyZWN0bHkgaW4gcmFuZGZpbGUuYy4KICAgICBbVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQmVnaW5uaW5nIG9mIHN1cHBvcnQgZm9yIEdlbmVyYWxpemVkVGltZS4gZDJpLCBpMmQsIGNoZWNrIGFuZCBwcmludAogICAgIGZ1bmN0aW9ucy4gQWxzbyBBU04xX1RJTUUgc3VpdGUgd2hpY2ggaXMgYSBDSE9JQ0Ugb2YgVVRDVGltZSBvcgogICAgIEdlbmVyYWxpemVkVGltZS4gQVNOMV9USU1FIGlzIHRoZSBwcm9wZXIgdHlwZSB1c2VkIGluIGNlcnRpZmljYXRlcyBldAogICAgIGFsOiBpdCdzIGp1c3QgYWxtb3N0IGFsd2F5cyBhIFVUQ1RpbWUuIE5vdGUgdGhpcyBwYXRjaCBhZGRzIG5ldyBlcnJvcgogICAgIGNvZGVzIHNvIGRvIGEgIm1ha2UgZXJyb3JzIiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29ycmVjdCBMaW51eCAxIHJlY29nbml0aW9uIGluIGNvbmZpZy4KICAgICBbVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHBvaW50bGVzcyBNRDUgaGFzaCB3aGVuIHVzaW5nIERTQSBrZXlzIGluIGNhLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgR2VuZXJhdGUgYW4gZXJyb3IgaWYgZ2l2ZW4gYW4gZW1wdHkgc3RyaW5nIGFzIGEgY2VydCBkaXJlY3RvcnkuIEFsc28KICAgICBnZW5lcmF0ZSBhbiBlcnJvciBpZiBoYW5kZWQgTlVMTCAocHJldmlvdXNseSByZXR1cm5lZCAwIHRvIGluZGljYXRlIGFuCiAgICAgZXJyb3IsIGJ1dCBkaWRuJ3Qgc2V0IG9uZSkuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IEFub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlcyB0byBTU0wgbWV0aG9kcy4gTWFrZSBTU0xfd3JpdGUncyBidWZmZXIgY29uc3QsIGF0IGxhc3QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZHVtbXkgZnVuY3Rpb24gQk5fcmVmX21vZF9leHAoKSBpbiByc2FyZWYuYyB0byBoYXZlIHRoZSBjb3JyZWN0CiAgICAgcGFyYW1ldGVycy4gVGhpcyB3YXMgY2F1c2luZyBhIHdhcm5pbmcgd2hpY2gga2lsbGVkIG9mZiB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgQysrIHN0eWxlIGNvbW1lbnRzIGZyb20gY3J5cHRvL2JuL2JuX2xvY2FsLmguCiAgICAgW05laWwgQ29zdGlnYW4gPG5laWwuY29zdGlnYW5AY2Vsb2NvbS5jb20+XQoKICAqKSBUaGUgZnVuY3Rpb24gT0JKX3R4dDJuaWQgd2FzIGJyb2tlbi4gSXQgd2FzIHN1cHBvc2VkIHRvIHJldHVybiBhIG5pZAogICAgIGJhc2VkIG9uIGEgdGV4dCBzdHJpbmcsIGxvb2tpbmcgdXAgc2hvcnQgYW5kIGxvbmcgbmFtZXMgYW5kIGZpbmFsbHkKICAgICAiZG90IiBmb3JtYXQuIFRoZSAiZG90IiBmb3JtYXQgc3R1ZmYgZGlkbid0IHdvcmsuIEFkZGVkIG5ldyBmdW5jdGlvbgogICAgIE9CSl90eHQyb2JqIHRvIGRvIHRoZSBzYW1lIGJ1dCByZXR1cm4gYW4gQVNOMV9PQkpFQ1QgYW5kIHJld3JvdGUgCiAgICAgT0JKX3R4dDJuaWQgdG8gdXNlIGl0LiBPQkpfdHh0Mm9iaiBjYW4gYWxzbyByZXR1cm4gb2JqZWN0cyBldmVuIGlmIHRoZQogICAgIE9JRCBpcyBub3QgcGFydCBvZiB0aGUgdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gWDUwOSBsb29rdXAvdmVyaWZ5IG1ldGhvZHMsIGZpeGluZyBhIGJ1ZyBpbgogICAgIFg1MDlfTE9PS1VQX2J5X2FsaWFzKCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFNvcnQgb3BlbnNzbCBmdW5jdGlvbnMgYnkgbmFtZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgR2V0IHRoZSBnZW5kc2EgcHJvZ3JhbSB3b3JraW5nIChob3BlZnVsbHkpIGFuZCBhZGQgaXQgdG8gYXBwIGxpc3QuIFJlbW92ZQogICAgIGVuY3J5cHRpb24gZnJvbSBzYW1wbGUgRFNBIGtleXMgKGluIGNhc2UgYW55b25lIGlzIGludGVyZXN0ZWQgdGhlIHBhc3N3b3JkCiAgICAgd2FzICIxMjM0IikuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBfYWxsXyAqX2ZyZWUgZnVuY3Rpb25zIGFjY2VwdCBhIE5VTEwgcG9pbnRlci4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPl0KCiAgKikgSWYgYSBESCBrZXkgaXMgZ2VuZXJhdGVkIGluIHMzX3NydnIuYywgZG9uJ3QgYmxvdyBpdCBieSB0cnlpbmcgdG8gdXNlCiAgICAgTlVMTCBwb2ludGVycy4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIHNfc2VydmVyIHNob3VsZCBzZW5kIHRoZSBDQWZpbGUgYXMgYWNjZXB0YWJsZSBDQXMsIG5vdCBpdHMgb3duIGNlcnQuCiAgICAgW0JvZG8gTW9lbGxlciA8M21vZWxsZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIERvbid0IGJsb3cgaXQgZm9yIG51bWVyaWMgLW5ld2tleSBhcmd1bWVudHMgdG8gYXBwcy9yZXEuCiAgICAgW0JvZG8gTW9lbGxlciA8M21vZWxsZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIFRlbXAga2V5ICJmb3IgZXhwb3J0IiB0ZXN0cyB3ZXJlIHdyb25nIGluIHMzX3NydnIuYy4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEFkZCBwcm90b3R5cGUgZm9yIHRlbXAga2V5IGNhbGxiYWNrIGZ1bmN0aW9ucwogICAgIFNTTF9DVFhfc2V0X3RtcF97cnNhLGRofV9jYWxsYmFjaygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIERIX2ZyZWUoKSB0b2xlcmF0ZSBiZWluZyBwYXNzZWQgYSBOVUxMIHBvaW50ZXIgKGxpa2UgUlNBX2ZyZWUoKSBhbmQKICAgICBEU0FfZnJlZSgpKS4gTWFrZSBYNTA5X1BVQktFWV9zZXQoKSBjaGVjayBmb3IgZXJyb3JzIGluIGQyaV9QdWJsaWNLZXkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBYNTA5X25hbWVfYWRkX2VudHJ5KCkgZnJlZWQgdGhlIHdyb25nIHRoaW5nIGFmdGVyIGFuIGVycm9yLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSByc2FfZWF5LmMgd291bGQgYXR0ZW1wdCB0byBmcmVlIGEgTlVMTCBjb250ZXh0LgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBCSU9fc19zb2NrZXQoKSBoYWQgYSBicm9rZW4gc2hvdWxkX3JldHJ5KCkgb24gV2luZG96ZS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX2ZfYnVmZmVyKCkgZGlkbid0IHBhc3Mgb24gQklPX0NUUkxfRkxVU0guCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIE1ha2Ugc3VyZSB0aGUgYWxyZWFkeSBleGlzdGluZyBYNTA5X1NUT1JFLT5kZXB0aCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZAogICAgIGluIFg1MDlfU1RPUkVfbmV3KCksIGJ1dCBkb2N1bWVudCB0aGUgZmFjdCB0aGF0IHRoaXMgdmFyaWFibGUgaXMgc3RpbGwKICAgICB1bnVzZWQgaW4gdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIHZhcmlvdXMgbGlicmFyeSBhbmQgYXBwcyBmaWxlcyB0byBmcmVlIHVwIHBrZXlzIG9idGFpbmVkIGZyb20KICAgICBYNTA5X1BVQktFWV9nZXQoKSBldCBhbC4gQWxzbyBhbGxvdyB4NTA5LmMgdG8gaGFuZGxlIG5ldHNjYXBlIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHJlZmVyZW5jZSBjb3VudGluZyBpbiBYNTA5X1BVQktFWV9nZXQoKS4gVGhpcyBtYWtlcwogICAgIGRlbW9zL21hdXJpY2UvZXhhbXBsZTIuYyB3b3JrLCBhbW9uZ3N0IG90aGVycywgcHJvYmFibHkuCiAgICAgW1N0ZXZlIEhlbnNvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgRmlyc3QgY3V0IG9mIGEgY2xlYW51cCBmb3IgYXBwcy8uIEZpcnN0IHRoZSBgc3NsZWF5JyBwcm9ncmFtIGlzIG5vdyBuYW1lZAogICAgIGBvcGVuc3NsJyBhbmQgc2Vjb25kLCB0aGUgc2hvcnRjdXQgc3ltbGlua3MgZm9yIHRoZSBgb3BlbnNzbCA8Y29tbWFuZD4nCiAgICAgYXJlIG5vIGxvbmdlciBjcmVhdGVkLiBUaGlzIHdheSB3ZSBoYXZlIGEgc2luZ2xlIGFuZCBjb25zaXN0ZW50IGNvbW1hbmQKICAgICBsaW5lIGludGVyZmFjZSBgb3BlbnNzbCA8Y29tbWFuZD4nLCBzaW1pbGFyIHRvIGBjdnMgPGNvbW1hbmQ+Jy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUGF1bCBTdXR0b24gYW5kIEJlbiBMYXVyaWVdCgogICopIGNhLmM6IG1vdmUgdGVzdCBmb3IgRFNBIGtleXMgaW5zaWRlICNpZm5kZWYgTk9fRFNBLiBNYWtlIHB1YmtleQogICAgIEJJVCBTVFJJTkcgd3JhcHBlciBhbHdheXMgaGF2ZSB6ZXJvIHVudXNlZCBiaXRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBDQS5wbCwgcGVybCB2ZXJzaW9uIG9mIENBLnNoLCBhZGQgZXh0ZW5kZWQga2V5IHVzYWdlIE9JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSB0b3AtbGV2ZWwgSU5TVEFMTCBkb2N1bWVudGF0aW9uIGVhc2llciB0byB1bmRlcnN0YW5kLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZWZpbGVzIHVwZGF0ZWQgdG8gZXhpdCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gYSBzdWItZGlyZWN0b3J5CiAgICAgbWFrZSAoaW5jbHVkaW5nIGlmIHVzZXIgcHJlc3NlcyBeQykgW1BhdWwgU3V0dG9uXQoKICAqKSBNYWtlIE1vbnRnb21lcnkgY29udGV4dCBzdHVmZiBleHBsaWNpdCBpbiBSU0EgZGF0YSBzdHJ1Y3R1cmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBidWlsZCBvcmRlciBvZiBwZW0gYW5kIGVyciB0byBhbGxvdyBmb3IgZ2VuZXJhdGVkIHBlbS5oLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggcmVudW1iZXJpbmcgYnVnIGluIFg1MDlfTkFNRV9kZWxldGVfZW50cnkoKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRW5oYW5jZWQgdGhlIGVyci1pbnMucGwgc2NyaXB0IHNvIGl0IG1ha2VzIHRoZSBlcnJvciBsaWJyYXJ5IG51bWJlciAKICAgICBnbG9iYWwgYW5kIGNhbiBhZGQgYSBsaWJyYXJ5IG5hbWUuIFRoaXMgaXMgbmVlZGVkIGZvciBleHRlcm5hbCBBU04xIGFuZAogICAgIG90aGVyIGVycm9yIGxpYnJhcmllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlZCBza19pbnNlcnQgd2hpY2ggbmV2ZXIgd29ya2VkIHByb3Blcmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBBU04xIG1hY3JvcyBzbyB0aGV5IGNhbiBoYW5kbGUgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydXRlZCAKICAgICBFWFBMSUNJVCB0YWdzLiBTb21lIG5vbiBzdGFuZGFyZCBjZXJ0aWZpY2F0ZXMgdXNlIHRoZXNlOiB0aGV5IGNhbiBub3cKICAgICBiZSByZWFkIGluLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlZCB0aGUgdmFyaW91cyBvbGQvb2Jzb2xldGUgU1NMZWF5IGRvY3VtZW50YXRpb24gZmlsZXMgKGRvYy94eHguZG9jKQogICAgIGludG8gYSBzaW5nbGUgZG9jL3NzbGVheS50eHQgYnVuZGxlLiBUaGlzIHdheSB0aGUgaW5mb3JtYXRpb24gaXMgc3RpbGwKICAgICBwcmVzZXJ2ZWQgYnV0IG5vIGxvbmdlciBtZXNzZXMgdXAgdGhpcyBkaXJlY3RvcnkuIE5vdyBpdCdzIG5ldyByb29tIGZvcgogICAgIHRoZSBuZXcgc2V0IG9mIGRvY3VtZW5hdGlvbiBmaWxlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU0VUcyB3ZXJlIGluY29ycmVjdGx5IERFUiBlbmNvZGVkLiBUaGlzIHdhcyBhIG1ham9yIHBhaW4sIGJlY2F1c2UgdGhleQogICAgIHNoYXJlZCBjb2RlIHdpdGggU0VRVUVOQ0VzLCB3aGljaCBhcmVuJ3QgY29kZWQgdGhlIHNhbWUuIFRoaXMgbWVhbnMgdGhhdAogICAgIGFsbW9zdCBldmVyeXRoaW5nIHRvIGRvIHdpdGggU0VUcyBvciBTRVFVRU5DRXMgaGFzIGVpdGhlciBjaGFuZ2VkIG5hbWUgb3IKICAgICBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgIFtCZW4gTGF1cmllLCBiYXNlZCBvbiBhIHBhcnRpYWwgZml4IGJ5IEdQIEpheWFuIDxncEBuc2ouY28uanA+XQoKICAqKSBGaXggdGVzdCBkYXRhIHRvIHdvcmsgd2l0aCB0aGUgYWJvdmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgUlNBIGhlYWRlciBkZWNsYXJhdGlvbnMgdGhhdCBoaWQgYSBidWcgSSBmaXhlZCBpbiAwLjkuMGIgYnV0CiAgICAgd2FzIGFscmVhZHkgZml4ZWQgYnkgRXJpYyBmb3IgMC45LjEgaXQgc2VlbXMuCiAgICAgW0JlbiBMYXVyaWUgLSBwb2ludGVkIG91dCBieSBVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBBdXRvZGV0ZWN0IEZyZWVCU0QzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdmFyaW91cyBidWdzIGluIENvbmZpZ3VyZS4gVGhpcyBhZmZlY3RzIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOgogICAgIG5leHRzdGVwCiAgICAgbmNyLXNjZGUKICAgICB1bml4d2FyZS0yLjAKICAgICB1bml4d2FyZS0yLjAtcGVudGl1bQogICAgIHNjbzUtY2MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVsaW1pbmF0ZSBnZW5lcmF0ZWQgZmlsZXMgZnJvbSBDVlMuIFJlb3JkZXIgdGVzdHMgdG8gcmVnZW5lcmF0ZSBmaWxlcwogICAgIGJlZm9yZSB0aGV5IGFyZSBuZWVkZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdlbmVyYXRlIE1ha2VmaWxlLnNzbCBmcm9tIE1ha2VmaWxlLm9yZyAodG8ga2VlcCBDVlMgaGFwcHkpLgogICAgIFtCZW4gTGF1cmllXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFiIGFuZCAwLjkuMWMgIFsyMy1EZWMtMTk5OF0KCiAgKikgQWRkZWQgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiB0byBjcnlwdG8vY3J5cHRvLmggYW5kIAogICAgIGNoYW5nZWQgU1NMZWF5IHRvIE9wZW5TU0wgaW4gdmVyc2lvbiBzdHJpbmdzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogIAogICopIFNvbWUgZml4dXBzIHRvIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnRzLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgRml4ZWQgdGhlIG5hc3R5IGJ1ZyB3aGVyZSByc2FyZWYuaCB3YXMgbm90IGZvdW5kIHVuZGVyIGNvbXBpbGUtdGltZQogICAgIGJlY2F1c2UgdGhlIHN5bWxpbmsgdG8gaW5jbHVkZS8gd2FzIG1pc3NpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEluY29ycG9yYXRlZCB0aGUgcG9wdWxhciBuby1SU0EvRFNBLW9ubHkgcGF0Y2hlcyAKICAgICB3aGljaCBhbGxvdyB0byBjb21waWxlIGEgUlNBLWZyZWUgU1NMZWF5LgogICAgIFtBbmRyZXcgQ29va2UgLyBJbnRlcnJhZGVyIExkdC4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIG5hc3R5IHJlaGFzaCBwcm9ibGVtIHVuZGVyIGBtYWtlIC1mIE1ha2VmaWxlLnNzbCBsaW5rcycKICAgICB3aGVuICJzc2xlYXkiIGlzIHN0aWxsIG5vdCBmb3VuZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgbW9yZSBwbGF0Zm9ybXMgdG8gQ29uZmlndXJlOiBDcmF5IFQzRSwgSFBVWCAxMSwgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIEJlY2ttYW5uIDxiZWNrbWFuQGFjbC5sYW5sLmdvdj5dCgogICopIFVwZGF0ZWQgdGhlIFJFQURNRSBmaWxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB2YXJpb3VzIC5jdnNpZ25vcmUgZmlsZXMgaW4gdGhlIENWUyByZXBvc2l0b3J5IHN1YmRpcnMKICAgICB0byBtYWtlIGEgImN2cyB1cGRhdGUiIHJlYWxseSBzaWxlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlY29tcGlsZWQgdGhlIGVycm9yLWRlZmluaXRpb24gaGVhZGVyIGZpbGVzIGFuZCBhZGRlZAogICAgIG1pc3Npbmcgc3ltYm9scyB0byB0aGUgV2luMzIgbGlua2VyIHRhYmxlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQ2xlYW5lZCB1cCB0aGUgdG9wLWxldmVsIGRvY3VtZW50czsKICAgICBvIG5ldyBmaWxlczogQ0hBTkdFUyBhbmQgTElDRU5TRQogICAgIG8gbWVyZ2VkIFZFUlNJT04sIEhJU1RPUlkqIGFuZCBSRUFETUUqIGZpbGVzIGEgQ0hBTkdFUy5TU0xlYXkgCiAgICAgbyBtZXJnZWQgQ09QWVJJR0hUIGludG8gTElDRU5TRQogICAgIG8gcmVtb3ZlZCBvYnNvbGV0ZSBUT0RPIGZpbGUKICAgICBvIHJlbmFtZWQgTUlDUk9TT0ZUIHRvIElOU1RBTEwuVzMyCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZWQgZHVtbXkgZmlsZXMgZnJvbSB0aGUgMC45LjFiIHNvdXJjZSB0cmVlOiAKICAgICBjcnlwdG8vYXNuMS94IGNyeXB0by9iaW8vY2QgY3J5cHRvL2Jpby9mZyBjcnlwdG8vYmlvL2dyZXAgY3J5cHRvL2Jpby92aQogICAgIGNyeXB0by9ibi9hc20vLi4uLi4uYWRkLmMgY3J5cHRvL2JuL2FzbS9hLm91dCBjcnlwdG8vZHNhL2YgY3J5cHRvL21kNS9mCiAgICAgY3J5cHRvL3BlbS9nbW9uLm91dCBjcnlwdG8vcGVybGFzbS9mIGNyeXB0by9wa2NzNy9idWlsZCBjcnlwdG8vcnNhL2YKICAgICBjcnlwdG8vc2hhL2FzbS9mIGNyeXB0by90aHJlYWRzL2YgbXMvenp6IHNzbC9mIHNzbC9mLm1hayB0ZXN0L2YKICAgICB1dGlsL2YubWFrIHV0aWwvcGwvZiB1dGlsL3BsL2YubWFrIGNyeXB0by9iZi9iZl9sb2NsLm9sZCBhcHBzL2YKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyBwbGF0Zm9ybSBwb3J0YWJpbGl0eSBmaXhlcy4KICAgICBbTWFyayBKLiBDb3hdCgogICopIFRoZSBHZW5lc2lzIG9mIHRoZSBPcGVuU1NMIHJwamVjdDoKICAgICBXZSBzdGFydCB3aXRoIHRoZSBsYXRlc3QgKHVucmVsZWFzZWQpIFNTTGVheSB2ZXJzaW9uIDAuOS4xYiB3aGljaCBFcmljIEEuCiAgICAgWW91bmcgYW5kIFRpbSBKLiBIdWRzb24gY3JlYXRlZCB3aGlsZSB0aGV5IHdlcmUgd29ya2luZyBmb3IgQzJOZXQgdW50aWwKICAgICBzdW1tZXIgMTk5OC4KICAgICBbVGhlIE9wZW5TU0wgUHJvamVjdF0KIAoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMGIgYW5kIDAuOS4xYiAgW25vdCByZWxlYXNlZF0KCiAgKikgVXBkYXRlZCBhIGZldyBDQSBjZXJ0aWZpY2F0ZXMgdW5kZXIgY2VydHMvCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENoYW5nZWQgc29tZSBCSUdOVU0gYXBpIHN0dWZmLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBWYXJpb3VzIHBsYXRmb3JtIHBvcnRzOiBPcGVuQlNELCBVbHRyaXgsIElSSVggNjRiaXQsIE5ldEJTRCwgCiAgICAgREdVWCB4ODYsIExpbnV4IEFscGhhLCBldGMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIE5ldyBDT01QIGxpYnJhcnkgW2NyeXB0by9jb21wL10gZm9yIFNTTCBSZWNvcmQgTGF5ZXIgQ29tcHJlc3Npb246IAogICAgIFJMRSAoZHVtbXkgaW1wbGVtZW50ZWQpIGFuZCBaTElCIChyZWFsbHkgaW1wbGVtZW50ZWQgd2hlbiBaTElCIGlzCiAgICAgYXZhaWxhYmxlKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkIC1zdHJwYXJzZSBvcHRpb24gdG8gYXNuMXBhcnMgcHJvZ3JhbSB3aGljaCBwYXJzZXMgbmVzdGVkIAogICAgIGJpbmFyeSBzdHJ1Y3R1cmVzIAogICAgIFtEciBTdGVwaGVuIEhlbnNvbiA8c2hlbnNvbkBiaWdmb290LmNvbT5dCgogICopIEFkZGVkICJvaWRfZmlsZSIgdG8gc3NsZWF5LmNuZiBmb3IgImNhIiBhbmQgInJlcSIgcHJvZ3JhbXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIERTQSBmaXggZm9yICJjYSIgcHJvZ3JhbS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgIi1nZW5rZXkiIG9wdGlvbiB0byAiZHNhcGFyYW0iIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIFJJUEUgTUQxNjAgKHJtZDE2MCkgbWVzc2FnZSBkaWdlc3QuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIC1hIChhbGwpIG9wdGlvbiB0byAic3NsZWF5IHZlcnNpb24iIGNvbW1hbmQuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIFBMQVRGT1JNIGRlZmluZSB3aGljaCBpcyB0aGUgaWQgZ2l2ZW4gdG8gQ29uZmlndXJlLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBNZW1DaGVja19YWFhYIGZ1bmN0aW9ucyB0byBjcnlwdG8vbWVtLmMgZm9yIG1lbW9yeSBjaGVja2luZy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRXh0ZW5kZWQgdGhlIEFTTi4xIHBhcnNlciByb3V0aW5lcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRXh0ZW5kZWQgQklPIHJvdXRpbmVzIHRvIHN1cHBvcnQgUkVVU0VBRERSLCBzZWVrLCB0ZWxsLCBldGMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGEgQk5fQ1RYIHRvIHRoZSBCTiBsaWJyYXJ5LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCB0aGUgd2VhayBrZXkgdmFsdWVzIGluIERFUyBsaWJyYXJ5CiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENoYW5nZWQgQVBJIGluIEVWUCBsaWJyYXJ5IGZvciBjaXBoZXIgYWxpYXNlcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgUkMyLzY0Yml0IGNpcGhlci4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ29udmVydGVkIHRoZSBsaGFzaCBsaWJyYXJ5IHRvIHRoZSBjcnlwdG8vbWVtLmMgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBtb3JlIHJlY29nbml6ZWQgQVNOLjEgb2JqZWN0IGlkcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSBSU0EgcGFkZGluZyBjaGVja3MgZm9yIFNTTC9UTFMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIEJJTyBwcm94eS9maWx0ZXIgZnVuY3Rpb25hbGl0eS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgZXh0cmFfY2VydHMgdG8gU1NMX0NUWCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHNlbmQgZXh0cmEgQ0EgY2VydGlmaWNhdGVzIHRvIHRoZSBjbGllbnQgaW4gdGhlIENBIGNlcnQgY2hhaW4gc2VuZGluZwogICAgIHByb2Nlc3MuIEl0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydCgpLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOb3cgRm9ydGV6emEgaXMgZGVuaWVkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBwaGFzZSBiZWNhdXNlCiAgICAgdGhpcyBpcyBrZXkgZXhjaGFuZ2UgbWVjaGFuaXNtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU1NMZWF5IGF0IGFsbC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkaXRpb25hbCBQS0NTMSBjaGVja3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIFN1cHBvcnQgdGhlIHN0cmluZyAiVExTdjEiIGZvciBhbGwgVExTIHYxIGNpcGhlcnMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGZ1bmN0aW9uIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSB3aGljaCBnaXZlcyB0aGUKICAgICBleF9kYXRhIGluZGV4IG9mIHRoZSBTU0wgY29udGV4dCBpbiB0aGUgWDUwOV9TVE9SRV9DVFggZXhfZGF0YS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgYSBmZXcgbWVtb3J5IGxlYWtzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCB2YXJpb3VzIGNvZGUgYW5kIGNvbW1lbnQgdHlwb3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEEgbWlub3IgYnVnIGluIHNzbC9zM19jbG50LmMgd2hlcmUgdGhlcmUgd291bGQgYWx3YXlzIGJlIDQgMCAKICAgICBieXRlcyBzZW50IGluIHRoZSBjbGllbnQgcmFuZG9tLgogICAgIFtFZHdhcmQgQmlzaG9wIDxlYmlzaG9wQHNweWdsYXNzLmNvbT5dCgo=