Q2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjIKCiAgKikgRml4IGEgcHJvYmxlbSB3aGVyZSB0aGUgdGhyZWFkZWQgTVBNIHN0YWxscyBhZnRlciByZXN0YXJ0cyBvcgogICAgIHNlZ2ZhdWx0cy4gIEFsc28gcHJldmVudCBtdWx0aXBsZSBhY3RpdmUgcHJvY2Vzc2VzIGZyb20gdXNpbmcKICAgICB0aGUgc2FtZSBzY29yZWJvYXJkIHNsb3QuICBbR3JlZyBBbWVzXQoKICAqKSBBcGFjaGUvV2luMzIgbm93IGZpbGxzIGluIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIHdpdGggQXBhY2hlJ3MKICAgICBzZXJ2ZXIgdmVyc2lvbiBzdHJpbmcsIGluY2x1ZGluZyBsb2FkZWQgYW5kIGFkdmVydGlzZWQgbW9kdWxlcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBJbXByb3ZlZCBzdXBwb3J0IGZvciB0aGUgV2luMzIgYnVpbGQsIHRvIHJlY292ZXIgZ3JhY2VmdWxseSBmcm9tCiAgICAgbWlzc2luZyBhcHIgb3IgYXByLXV0aWwgZGlyZWN0b3JpZXMgb3IgdGhlIGF3ayBpbnRlcnByZXRlciwgCiAgICAgY3JlYXRlIHRoZSBwcm9wZXIgY2dpLWJpbiBleGFtcGxlcywgaW5jbHVkaW5nIGEgdGVzdC1jZ2kuYmF0LCBhbmQgCiAgICAgZml4IHRoZSBwZXJsIHNoZWJhbmcgbGluZSBmb3IgcHJpbnRlbnYucGwsIHdoZW4gaW5zdGFsbGluZyBmcm9tIAogICAgIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIHRocmVhZGVkLmMgY2F1c2VkIGJ5IHBhc3NpbmcgdW5pbml0aWFsaXplZAogICAgIGFwcl90aHJlYWRfdCAqIHRvIGFwcl90aHJlYWRfam9pbigpLiAgW0plZmYgVHJhd2lja10KCiAgKikgVXNlIG5ldyBBUFIgbnVtYmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRvIHJlZHVjZSBDUFUgY29uc3VtcHRpb24gCiAgICAgd2hlbiBzZXR0aW5nIHRoZSBjb250ZW50IGxlbmd0aCwgYW5kIGluIG1vZF9sb2dfY29uZmlnLgogICAgIFtCcmlhbiBQYW5lXQogICAgIAogICopIEZpeCBwcm9ibGVtIHJlcG9ydGVkIGJ5IFRha2V0byBLYWJlIDxrYWJlQHNyYS10b2hva3UuY28uanA+CiAgICAgd2hlcmUgSEVBRCByZXNwb25zZSBoZWFkZXJzIHdlcmUgYmVpbmcgcmVwZWF0ZWQgdHdpY2UgZm9yCiAgICAgZmlsZXMgZ3JlYXRlciB0aGFuIDMySyBieXRlcyAoNCpBUF9NSU5fQllURVNfVE9fV1JJVEUpLiBUaGlzCiAgICAgcHJvYmxlbSBpbiB0aGUgaHR0cF9oZWFkZXIgZmlsdGVyIHdhcyBleHBvc2VkIGJ5IHRoZSByZWNlbnQgcmV3cml0ZQogICAgIG9mIHRoZSBjb250ZW50X2xlbmd0aCBmaWx0ZXIuIFtUYWtldG8gS2FiZSwgQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHNlZyBmYXVsdHMgaW4gbW9kX3N0YXR1cyB3aXRoIEV4dGVuZGVkU3RhdHVzIGVuYWJsZWQsIGFmdGVyCiAgICAgcmVzdGFydHMuICBBIGdhcmJhZ2UgcG9pbnRlciB0byBhIHZob3N0J3Mgc2VydmVyX3JlYyBmcm9tIHRoZQogICAgIHByZXZpb3VzIGdlbmVyYXRpb24gd2FzIGJlaW5nIGxlZnQgYXJvdW5kIHVuZGVyIGNlcnRhaW4KICAgICBjb25kaXRpb25zLiBbR3JlZyBBbWVzXQoKICAqKSBGaXggYSBjb3NtZXRpYyBwcm9ibGVtIHdpdGggbW9kX2luY2x1ZGUuICBOb24tZXhpc3RhbnQgU1NJIHZhcnMKICAgICB1c2VkIHRvIGFwcGVhciBhcyAnKG5vbmUnLCB3aXRob3V0IHRoZSBjbG9zaW5nIHBhcmVuLgogICAgIFtH/G50ZXIgS25hdWYgPGVmbGFzaEBnbXgubmV0Pl0KCiAgKikgSW1wcm92ZSB0aGUgZXhwb3J0cyBnZW5lcmF0aW5nIGF3ayBzY3JpcHQuICBJbiB0aGUgcGFzdCwgd2UgaGFkCiAgICAgd29yayBhcm91bmQgcHJvYmxlbXMgaW4gdGhlIGF3ayBzY3JpcHQgYnkgYXZvaWRpbmcgc29tZSAjaWYgYW5kCiAgICAgI2lmZGVmcy4gIFRoaXMgaGFzIGJpdHRlbiB1cyBtYW55IHRpbWVzIGluIGdlbmVyYXRpbmcgdGhlIGV4cG9ydHMuYwogICAgIGZpbGUuICBUaGlzIGltcHJvdmVtZW50IGFsbG93cyBjb3JyZWN0cyB0aGUgaGVhZGVyIGZpbGUgcGFyc2luZy4KICAgICBbU2FuZGVyIFN0cmlrZXIgPHN0cmlrZXJAYXBhY2hlLm9yZz5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yMQoKICAqKSBSZXNvbHZlIHRoZSBXaW4zMiBodHBhc3N3ZCBidWcsIHdoZXJlIGEgZmlsZSB0aGF0IGV4aXN0ZWQgd291bGQgYmUKICAgICBvdmVyd3JpdHRlbiwgcmVnYXJkbGVzcyBvZiB0aGUgLWMgZmxhZy4KICAgICBbV2lsbGlhbSBSb3dlLCBNbGFkZW4gVHVyayA8bWxhZGVuLnR1cmtAbWFpbC5pbmV0LmhyPl0KCiAgKikgSW50cm9kdWNlIGNvbm5lY3Rpb24gc3ViLXBvb2xzIGludG8gYWIuICBUcnVuY2F0aW5nIHRoZSBsaWZldGltZQogICAgIG9mIHRoZXNlIGFsbG9jYXRpb25zIG1lYW5zIHRoYXQgYWIgbm8gbG9uZ2VyIHBlcnBldHVhbGx5IGdyb3dzCiAgICAgaXRzIHdvcmtpbmcgc2V0LCBydW5uaW5nIG91dCBvZiBtZW1vcnkgb24gbGFyZ2UgcmVxdWVzdCBhdHRlbXB0cy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNYWtlIHNjb3JlYm9hcmQgY3JlYXRpb24gYSBob29rLiAgVGhpcyBhbGxvd3MgbWFuYWdlbWVudAogICAgIG1vZHVsZXMgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHNjb3JlYm9hcmQgYXQgdGhlIHRpbWUgdGhhdCBpdCBpcwogICAgIGNyZWF0ZWQsIGFuZCBhdCBldmVyeSByZXN0YXJ0IHJlcXVlc3QuICAKICAgICBbQ29keSBTaGVyciA8Y3NoZXJyQGNvdmFsZW50Lm5ldD5dCgogICopIENoYW5nZWQgQVBfTVBNUV9NQVhfREFFTU9OUyB0byByZWZlciB0byBNYXhDbGllbnRzIGFuZAogICAgIGFkZGVkIGFuIEFQX01QTVFfTUFYX0RBRU1PTl9VU0VEIHRvIHJlZmVyIHRvIHRoZSBoaWdoZXN0CiAgICAgZGFlbW9uIGluZGV4IGFjdHVhbGx5IHVzZWQgaW4gdGhlIHNjb3JlYm9hcmQuIEkgYWxzbwogICAgIHVwZGF0ZWQgdGhlIHBlcnRpbmVudCBjYWxscy4gW1BhdWwgSi4gUmVkZXJdCgogICopIFdpbjMyOiBQcmV2ZW50IGxpc3RlbmluZyBzb2NrZXRzIGZyb20gYmVpbmcgaW5oZXJpdGVkIGJ5CiAgICAgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzLCBDR0kgc2NyaXB0cywgcm90YXRlbG9nIHByb2Nlc3MKICAgICBldGMuICBJZiB0aGUgQXBhY2hlIGNoaWxkIHByb2Nlc3Mgc2VnZmF1bHRzLCBhbnkgcHJvY2Vzc2VzIAogICAgIHRoYXQgdGhlIGNoaWxkIHN0YXJ0ZWQgYXJlIG5vdCByZWFwZWQuIFByaW9yIHRvIHRoaXMgZml4LAogICAgIHRoZXNlIHByb2Nlc3NlcyBpbmhlcml0ZWQgdGhlIGxpc3RlbmluZyBzb2NrZXRzIHdoaWNoIHNvbWV0aW1lcwogICAgIHByZXZlbnRlZCB0aGUgcmVzdGFydGVkIEFwYWNoZSBjaGlsZCBwcm9jZXNzIGZyb20gYWNjZXB0aW5nCiAgICAgY29ubmVjdGlvbnMgKGllLCB0aGUgc2VydmVyIHdvdWxkIGhhbmcpLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgUHJvdmlkZSB2aG9zdCBhbmQgcmVxdWVzdCBzdHJpbmdzIHdoZW4gRXh0ZW5kZWRTdGF0dXMgaXMgb24uCiAgICAgW0dyZWcgQW1lc10KCiAgKikgRml4IHNvbWUgaXNzdWVzIHdpdGggdGhlIHBvZCBhbmQgcHJlZm9yazogY2hlY2sgdGhlIHBvZCAqYWZ0ZXIqCiAgICAgcHJvY2Vzc2luZyBhIGNvbm5lY3Rpb24gc28gdGhhdCBhIHNlcnZlciBwcm9jZXNzaW5nIGEgdGltZS0KICAgICBjb25zdW1pbmcgcmVxdWVzdCBiYWlscyBvdXQgYXMgc29vbiBhcyBwcmFjdGljYWw7IHdoZW4gdGhlCiAgICAgcGFyZW50IHByb2Nlc3Mgd2FrZXMgdXAgYSBzZXJ2ZXIgcHJvY2VzcyB2aWEgY29ubmVjdCgpLCB1c2UgYW4KICAgICBBUFIgdGltZW91dCBvbiB0aGUgY29ubmVjdCgpIHNvIHRoYXQgd2UgZG9uJ3QgaGFuZyBmb3IgYSBsb25nCiAgICAgdGltZSBpZiB0aGVyZSBhcmVuJ3Qgc2VydmVyIHByb2Nlc3NlcyBhcm91bmQgdG8gZG8gYWNjZXB0KCkuCiAgICAgW0plZmYgVHJhd2ljaywgR3JlZyBBbWVzXQoKICAqKSBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB0byBtb2RfbWltZS5jLiBmaW5kX2N0KCkgaW4gbW9kX21pbWUsIAogICAgIHNwZW5kcyBhIGxvdCBvZiB0aW1lIGluIGFwcl90YWJsZV9nZXQgY2FsbHMuICBVc2luZyB0aGUgZGVmYXVsdCAKICAgICBodHRwZC5jb25mLCB0aGUgdGFibGVzIGZvciBsYW5ndWFnZXMgYW5kIGNoYXJzZXRzIGFyZSBzb21ld2hhdAogICAgIGxhcmdlLCBzbyB0aGUgdGltZSBzcGVudCBzY2FubmluZyB0aGVtIG9uIGVhY2ggcmVxdWVzdCBpcwogICAgIHNpZ25pZmljYW50LiBSZXBsYWNpbmcgdGhlIHRhYmxlcyB3aXRoIGhhc2ggdGFibGVzIHByb3ZpZGVzCiAgICAgYSBuaWNlIHNwZWVkdXAuIFtCcmlhbiBQYW5lIDxicGFuZUBwYWNiZWxsLm5ldD5dCgogICopIEFkZCB0d28gZnVuY3Rpb25zIHRvIGFsbG93IG1vZHVsZXMgdG8gYWNjZXNzIHJhbmRvbSBwYXJ0cyBvZiB0aGUKICAgICBzY29yZWJvYXJkLiAgVGhpcyBhbGxvd3MgbW9kdWxlcyBjb21waWxlZCBmb3Igb25lIE1QTSB0byBhY2Nlc3MgdGhlCiAgICAgc2NvcmVib2FyZCwgZXZlbiBpZiBpdCB0aGUgc2VydmVyIHdhcyBjb21waWxlZCBmb3IgYW5vdGhlciBNUE0uCiAgICAgW0hhcnJpZSBIYXpld2lua2VsIDxoYXJyaWVAY292YWxlbnQubmV0Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjIwCgogICopIEZpeCBwcm9ibGVtIGluIGNvbnRlbnQtbGVuZ3RoIGZpbHRlciB3aGVyZSB0aGUgZmlsdGVyIHdvdWxkCiAgICAgYnVmZmVyIGFsbCB0aGUgb3V0cHV0IGZyb20gYSBDR0kgYmVmb3JlIHNlbmRpbmcgYW55IGJ5dGVzCiAgICAgZG93biB0aGUgZmlsdGVyIHN0YWNrIHRvIHRoZSBuZXR3b3JrLiBUaGlzIHByb2JsZW0gd291bGQgY2F1c2UKICAgICBzaWduaWZpY2FudCBtZW1vcnkgY29uc3VtcHRpb24gaWYgdGhlIENHSXMgZ2VuZXJhdGVkCiAgICAgbG90cyBvZiBieXRlcy4gW0JpbGwgU3RvZGRhcmRdCiAgCiAgKikgR2V0IG5vbi1ibG9ja2luZyBDR0kgcGlwZSByZWFkcyB3b3JraW5nIHdpdGggdGhlIGJ1Y2tldCBicmlnYWRlcy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHNlZyBmYXVsdCBvbiBXaW5kb3dzIHdoZW4gc2VydmluZyBmaWxlcyBjYWNoZWQgd2l0aCBtb2RfZmlsZV9jYWNoZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IGEgYnVnIGluIHRoZSB0aHJlYWRlZCBNUE0gdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBraWxsIG9mZiBhbGwKICAgICB3b3JrZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0aW5nIGlmIHRoZSBudW1iZXIgb2Ygd29ya2VycyBzdGFydGVkCiAgICAgd2FzIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQuICBbUnlhbiBCbG9vbSwgQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE5CgogICopIEZpeCBwcm9ibGVtIHdpdGggdGhyZWFkZWQgTVBNLiAgVGhlIHByb2JsZW0gd2FzIHRoYXQgaWYgZWFjaCBjaGlsZAogICAgIHByb2Nlc3Mgd2FzIGJ1c3kgc2VydmluZyBhIHNpbmdsZSBsb25nLWxpdmVkIHJlcXVlc3QgYW5kIHRoZSBzZXJ2ZXIKICAgICB3YXMgc2VudCBhIGdyYWNlZnVsIHJlc3RhcnQgc2lnbmFsLCB0aGUgc2VydmVyIHdvdWxkIHN0b3Agc2VydmluZwogICAgIHJlcXVlc3RzLiAgVGhpcyB3b3VsZCBoYXBwZW4gYmVjYXVzZSBlYWNoIGNoaWxkIHByb2Nlc3Mgd291bGQgd2FpdCB0bwogICAgIGRpZSB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgd2FzIGRvbmUsIGFuZCB0aGUgcGFyZW50IHdvdWxkbid0IHNwYXduIGFueQogICAgIG5ldyBjaGlsZHJlbiB1bnRpbCBhIHByb2Nlc3MgZGllZC4gIE5vdywgdGhlIHBhcmVudCBsb29rcyBhdCB0aGUgZmFjdAogICAgIHRoYXQgdGhlIGNoaWxkcmVuIGFyZSBkeWluZyBncmFjZWZ1bGx5LCBhbmQgc3RhcnRzIG5ldyBjaGlsZHJlbi4KICAgICBUaG9zZSBuZXcgY2hpbGRyZW4gb25seSBzdGFydCBlbm91Z2ggdGhyZWFkcyB0byBjb21wbGltZW50IHRoZSBudW1iZXIKICAgICBvZiB0aHJlYWRzIGluIHRoZSBvdGhlciBjaGlsZCBwcm9jZXNzIHRoYXQgc2hhcmVzIHRoZSBzYW1lIHNwb3QgaW4KICAgICB0aGUgc2NvcmVib2FyZC4gIEluIHRoaXMgd2F5LCB3ZSBtYWtlIHN1cmUgdG8gbmV2ZXIgZ28gb3ZlcgogICAgIE1heENsaWVudHMuICBbUnlhbiBCbG9vbV0KCiAgKikgbW9kaWZpZWQgbW9kX25lZ290aWF0aW9uIGFuZCBtb2RfYXV0b2luZGV4IHRvIHNwZWVkIHVwIGJ5IGFsbW9zdCBhCiAgICAgZmFjdG9yIG9mIHR3byBvbiBhcHJfZGlyX3JlYWQoKS1lbmhhbmNlZCBwbGF0Zm9ybXMsIHN1Y2ggYXMgV2luMzIKICAgICBhbmQgT1MyLCBieSBjYWxsaW5nIGFwX3N1Yl9yZXF1ZXN0X2xvb2t1cF9kaXJlbnQoKSB3aXRoIHRoZSByZXN1bHRzCiAgICAgYWxyZWFkeSBwcm92aWRlZCBieSBhcHJfZGlyX3JlYWQoKS4gIFtXaWxsaWFtIFJvd2VdCgogICopIG1vZF9maWxlX2NhY2hlIGlzIG5vdyBtb3JlIHJvYnVzdCB0byBmaWx0ZXJpbmcgYW5kIHNlcnZlcyByZXF1ZXN0cwogICAgIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50bHkuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRml4IHByb2JsZW0gaGFuZGxpbmcgRkxVU0ggYnVja2V0IGluIHRoZSBjaHVua2VkIGVuY29kaW5nIGZpbHRlci4KICAgICBNb2R1bGUgd2FzIGNhbGxpbmcgYXBfcndyaXRlKCkgZm9sbG93ZWQgYnkgYXBfcmZsdXNoKCkgYnV0IHRoZSAKICAgICBzZXJ2ZWQgY29udGVudCB3YXMgbm90IGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgYnJvd3Nlci4gSW5zcGVjdGlvbgogICAgIG9mIHRoZSBvdXRwdXQgc3RyZWFtIHJldmVhbGVkIHRoYXQgdGhlIGZpcnN0IGRhdGEgY2h1bmsgd2FzCiAgICAgbWlzc2luZyB0aGUgdHJhaWxpbmcgQ1JMRiByZXF1aXJlZCBieSB0aGUgUkZDLiAgW0JpbGwgU3RvZGRhcmRdCgogICopIGFweHMgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhcF9zZW5kX2h0dHBfaGVhZGVyKCkgaW4gdGhlIGV4YW1wbGUgaGFuZGxlcgoKICAqKSBGaXggYW4gYWIgcHJvYmxlbSB3aGljaCBjb3VsZCBjYXVzZSBhIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbgogICAgIHdpdGggY2VydGFpbiBpbnZvY2F0aW9ucyAoZS5nLiwgYWIgLWsgLWMgNiAtbiAxMDAgbG9jYWxob3N0LykuCiAgICAgW0lhbiBIb2xzbWFuIDxpYW5oQGNuZXQuY29tPl0KCiAgKikgU29sdmUgY2FzZS1pbnNlbnNpdGl2ZSBwbGF0Zm9ybXMnIGNvbmZ1c2lvbiBhYm91dCBuZWdvdGlhdGVkCiAgICAgZmlsZW5hbWVzLCBhbGxvd2luZyBmaWxlcyBvZiBkaWZmZXJudCBjYXNlIHRvIG1hdGNoIGluIGNob29zaW5nCiAgICAgdGhlIGRvY3VtZW50IHRvIHNlcnZlLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGJyb2tlbm5lc3Mgd2hlbiBUaHJlYWRzUGVyQ2hpbGQgaXMgaGlnaGVyIHRoYW4gdGhlIGJ1aWx0LWluCiAgICAgbGltaXQuICBXZSBsZWZ0IGFwX3RocmVhZHNfcGVyX2NoaWxkIGF0IHRoZSBoaWdoZXIgdmFsdWUgd2hpY2gKICAgICBsZWQgdG8gc2VnZmF1bHRzIHdoZW4gZG9pbmcgY2VydGFpbiBzY29yZWJvYXJkIG9wZXJhdGlvbnMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHNlZyBmYXVsdHMgYW5kL29yIG1pc3Npbmcgb3V0cHV0IGZyb20gbW9kX2luY2x1ZGUuICBUaGUKICAgICBkZWZhdWx0X2hhbmRsZXIgd2FzIHVzaW5nIHRoZSBzdWJyZXF1ZXN0IHBvb2wgZm9yIGZpbGVzIGFuZAogICAgIE1NQVBzLCBldmVuIHRob3VnaCB0aGUgYXNzb2NpYXRlZCBBUFIgc3RydWN0dXJlcyB0eXBpY2FsbHkgCiAgICAgbGl2ZSBsb25nZXIgdGhhbiB0aGUgc3VicmVxdWVzdC4gW0dyZWcgQW1lc10KICAKICAqKSBFeHRlbmQgbW9kX3NldGVudmlmIHRvIHN1cHBvcnQgc3BlY2lmeWluZyByZWd1bGFyIGV4cHJlc3Npb25zCiAgICAgb24gdGhlIFNldEVudklmIChhbmQgU2V0RW52SWZOb0Nhc2UpIGRpcmVjdGl2ZSBhdHRyaWJ1dGUgZmllbGQuCiAgICAgRXhhbXBsZTogIFNldEVudklmIF5UUyogIFthLXpdLiogSEFWRV9UUyAKICAgICB3aWxsIGNhdXNlIEhBVkVfVFMgdG8gYmUgc2V0IGlmIGFueSBvZiB0aGUgcmVxdWVzdCBoZWFkZXJzIGJlZ2lucyAKICAgICB3aXRoICJUUyIgYW5kIGhhcyBhIHZhbHVlIHRoYXQgYmVnaW5zIHdpdGggYW55IGNoYXJhY3RlciBpbiB0aGUKICAgICBzZXQgW2Etel0uIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBodHRwZCBjaGlsZHJlbiBub3cgcmUtYmluZCB0aGVtc2VsdmVzIHRvIGEgcmFuZG9tIENQVSBvbgogICAgIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMgb24gQUlYIHZpYSBiaW5kcHJvY2Vzc29yKCkgaW4gMi4wLgogICAgIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KCiAgKikgRml4IGh0ZGlnZXN0LiBJdCB3b3VsZCBnbyBpbnRvIGEgbG9vcCBpbiBnZXRsaW5lIHdoZW4gYWRkaW5nIAogICAgIGEgc2Vjb25kIHVzZXIuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMiBwbGF0Zm9ybXMgbm93IGZ1bGx5IHN1cHBvcnQgbW9kX3VzZXJkaXIgb3B0aW9ucy4gIFtXaWxsIFJvd2VdCgogICopIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaHR0cGQuZXhwIGZvciBBSVguCiAgICAgRFNPcyBub3cgd29yayBhZ2FpbiBvbiBBSVggaW4gMi4wCiAgICAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBBZGQgYSBuZXcgcmVxdWVzdCBob29rLCBlcnJvcl9sb2cuICBUaGlzIHBoYXNlIGFsbG93cyBtb2R1bGVzCiAgICAgdG8gYWN0IG9uIHRoZSBlcnJvciBsb2cgc3RyaW5nIF9hZnRlcl8gaXQgaGFzIGJlZW4gd3JpdHRlbgogICAgIHRvIHRoZSBlcnJvciBsb2cuICBUaGUgZ29hbCBmb3IgdGhpcyBob29rIGlzIHRvIGFsbG93IG1vbml0b3JpbmcKICAgICBtb2R1bGVzIHRvIHNlbmQgdGhlIGVycm9yIHN0cmluZyB0byB0aGUgbW9uaXRvcmluZyBhZ2VudC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgTW9kaWZ5IG1vZF9lY2hvIHRvIG1ha2UgaXQgdXNlIGZpbHRlcnMgZm9yIGlucHV0IGFuZCBvdXRwdXQuCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuQGNvdmFsZW50Lm5ldD5dCgogICopIEV4dGVuZCBtb2RfaGVhZGVycyB0byBzdXBwb3J0IGNvbmRpdGlvbmFsIGRyaXZlbiBIZWFkZXIgCiAgICAgYWRkLCBhcHBlbmQgYW5kIHNldC4gVXNlIFNldEVudklmIHRvIHNldCBhbiBlbnZhciBhbmQgY29uZGl0aW9uYWxseQogICAgIGFkZC9hcHBlbmQvc2V0IGhlYWRlcnMgYmFzZWQgb24gdGhpcyBlbnZhciB0aHVzbHk6CgogICAgIFNldEVudklmIFRTTXlIZWFkZXIgdmFsdWUgSEFWRV9UU015SGVhZGVyCiAgICAgSGVhZGVyIGFkZCBNeUhlYWRlciAiJXQgJUQiIGVudj1IQVZFX1RTTXlIZWFkZXIKCiAgICAgSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgaGVhZGVyICJUU015SGVhZGVyOiB2YWx1ZSIgdGhlbiBoZWFkZXIKICAgICBNeUhlYWRlcjogInQ9eHh4eHh4eHh4eCBEPXl5eXkiIHdpbGwgYmUgc2VudCBvbiB0aGUgcmVzcG9uc2UuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEV4dGVuZCBtb2RfaGVhZGVycyB0byBzdXBwb3J0IHVzaW5nIGZvcm1hdCBzcGVjaWZpZXJzIG9uIEhlYWRlcgogICAgIGFkZCwgYXBwZW5kIGFuZCBzZXQgaGVhZGVyIHZhbHVlcy4gVHdvIGZvcm1hdCBzcGVjaWZpZXJzIGFyZSBzdXBwb3J0ZWQ6CgogICAgICV0IC0gcmVwb3J0cywgaW4gVVRDIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gsIHdoZW4gdGhlCiAgICAgICAgICByZXF1ZXN0IHdhcyByZWNlaXZlZC4KCiAgICAgJUQgLSByZXBvcnRzIHRoZSB0aW1lLCBpbiBtaWNyb3NlY29uZHMsIGJldHdlZW4gd2hlbiB0aGUgcmVxdWVzdCB3YXMgCiAgICAgICAgICByZWNlaXZlZCBhbmQgdGhlIHJlc3BvbnNlIHNlbnQuIAoKICAgICBFeGFtcGxlczoKICAgICBIZWFkZXIgYWRkIE15SGVhZGVyICJUaGlzIHJlcXVlc3Qgc2VydmVkIGluICVEIG1pY3Jvc2Vjb25kcy4gJXQiCgogICAgIHJlc3VsdHMgaW4gYSBoZWFkZXIgYmVpbmcgYWRkZWQgdG8gdGhlIHJlc3BvbnNlIHRoYXQgbG9va3MgbGlrZSB0aGlzOgogICAgIAogICAgIE15SGVhZGVyOiBUaGlzIHJlcXVlc3Qgc2VydmVkIGluIEQ9NTQzOCBtaWNyb3NlY29uZHMuIHQ9OTkxNDI0NzA0NDQ3MjU2CgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggcmVzZXRfZmlsdGVyKCkuICBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgaG93IHdlIHJlbW92ZSBmaWx0ZXJzLgogICAgIElmIHdlIHNldCByLT5vdXRwdXRfZmlsdGVycyB0byBOVUxMLCB3ZSBhbHNvIGhhdmUgdG8gcmVzZXQgdGhlCiAgICAgY29ubmVjdGlvbidzIGZpbHRlcnMuICBbSm9obiBTdGVybGluZ10KCiAgKikgT3B0aW1pc2UgcmVzZXRfZmlsdGVyKCkgaW4gaHR0cF9wcm90b2NvbC5jLiBbR3JlZyBTdGVpbl0KCiAgKikgQWRkIGEgY2hlY2sgdG8gYXBfZGllKCkgdG8gbWFrZSBzdXJlIHRoZSBmaWx0ZXIgc3RhY2sgaXMgc2FuZSBhbmQKICAgICBjb250YWlucyB0aGUgY29ycmVjdCBiYXNpYyBmaWx0ZXJzIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBUaGlzIGZpeGVzCiAgICAgYSBwcm9ibGVtIHdoZXJlIGhlYWRlcnMgYXJlIG5vdCBiZWluZyBzZW50IG9uIGVycm9yLiBbSm9obiBTdGVybGluZ10KCiAgKikgTmV3IEhlYWRlciBkaXJlY3RpdmUgJ2VjaG8nIG9wdGlvbi4gIkhlYWRlciBlY2hvIHJlZ2V4IiB3aWxsCiAgICAgY2F1c2UgYW55IGhlYWRlcnMgcmVjZWl2ZWQgb24gdGhlIHJlcXVlc3QgdGhhdCBtYXRjaCByZWdleCB0byBiZQogICAgIGVjaG9lZCB0byAoaW5jbHVkZWQgaW4pIHRoZSByZXNwb25zZSBoZWFkZXJzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBpbmNsdWRlL2FwX2NvbXBhdC5oIHRlc3RlZCBhbmQgc2V0IEFQUl9DT01QQVRfSCBpbnN0ZWFkIG9mIEFQX0NPTVBBVF9ILgogICAgIFRoaXMgcHJldmVudGVkIHRoZSBpbmNsdXNpb24gb2YgYXByX2NvbXBhdC5oLiAgUFIgIzc3NzMKICAgICBbT2xlZyBCcm95dG1hbm4gPHBoZEBwaGQucHAucnU+XQoKICAqKSBNb3ZlZCB1dGlsX3VyaSB0byB0aGUgYXByLXV0aWwgbGlicmFyeS4gIFRoaXMgcmVxdWlyZWQgYSBidW5jaCBvZgogICAgIGFwcl9uYW1lIGNoYW5nZXMgZm9yIHRoZSB1cmkgdXRpbGl0eSBmdW5jdGlvbnMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIE1vdmUgdGhlIGFkZGl0aW9uIG9mIGRlZmF1bHQgQVBfSFRUUF9IVFRQX0hFQURFUiBmaWx0ZXJzIHRvIHRoZQogICAgIGluc2VydF9maWx0ZXIgcGhhc2Ugc28gdGhhdCBvdGhlciBmaWx0ZXJzIGFyZSBub3QgYnlwYXNzZWQgYnkgZGVmYXVsdC4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIFJlaW1wbGVtZW50IG1vZF9oZWFkZXJzIGFzIGFuIG91dHB1dCBmaWx0ZXIuIG1vZF9oZWFkZXJzIGNhbiBub3cKICAgICBhZGQgY3VzdG9tIGhlYWRlcnMgdG8gaW5ib3VuZCByZXF1ZXN0cyB1c2luZyB0aGUgUmVxdWVzdEhlYWRlciBkaXJlY3RpdmUKICAgICBhbmQgdG8gcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIG9sZCBIZWFkZXIgZGlyZWN0aXZlLiAgW0dyYWhhbSBMZWdnZXR0XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTgKCiAgKikgRml4IGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nIHNvIHRoYXQgaWYgYSBiYWQgYXJndW1lbnQgaXMgc3BlY2lmaWVkCiAgICAgQXBhY2hlIHdpbGwgZXhpdC4gIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZSB0aGUgbWFrZSB0YXJnZXRzIGFuZCBydWxlcyB0byBiZSBjb25zaXN0ZW50IGluIGFsbCBvZiB0aGUKICAgICBBcGFjaGUtb3duZWQgc291cmNlIHRyZWVzLiAgW1JveSBGaWVsZGluZ10KICAgICAKICAqKSBGaXggcHJvY2Vzc2luZyBvZiB0aGUgVFJBQ0UgbWV0aG9kLiAgUHJldmlvdXNseSB3ZSBwYXNzZWQgYm9ndXMKICAgICBwYXJtcyB0byBmb3JtX2hlYWRlcl9maWVsZCgpIGFuZCBpdCBvdmVybGFpZCBzb21lIHZob3N0IHN0cnVjdHVyZXMsCiAgICAgcmVzdWx0aW5nIGluIGEgc2VnZmF1bHQgaW4gY2hlY2tfaG9zdGFsaWFzKCkuIAogICAgIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgV2luMzI6IEFkZCBzdXBwb3J0IGZvciByZWxpYWJsZSBwaXBlZCBsb2dzLiBJZiB0aGUgbG9nZ2luZyBwcm9jZXNzCiAgICAgZ29lcyBkb3duLCBBcGFjaGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgaXQuIFRoaXMgZnVuY3Rpb24gaGFzIAogICAgIGJlZW4gcGFydCBvZiBBcGFjaGUgb24gVW5peC9MaW51eC9CU0Qgc2luY2UgdGhlIGVhcmx5IHYxLjMgcmVsZWFzZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIERvIG5vdCBzdGFydCBwaXBlZCBsb2cgcHJvY2Vzc2VzIGR1cmluZyB0aGUgY29uZmlnIGZpbGUgCiAgICAgcHJlZmxpZ2h0LiAgVGhpcyBjaGFuZ2UgYWxzbyBjaXJjdW12ZW50cyBhIHByb2JsZW0gb24gCiAgICAgV2luZG93cyB3aGVyZSB0aGUgcm90YXRlbG9nIHByb2Nlc3NlcyBjcmVhdGVkIGR1cmluZyBwcmVmbGlnaHQKICAgICB3YXMgbm90IGdldHRpbmcgY2xlYW5lZCB1cCBwcm9wZXJseS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgYWRkICJSZXF1ZXN0IFBoYXNlIFBhcnRpY2lwYXRpb24iIGluZm8gdG8gbW9kX2luZm8KICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBNYWtlIGZpcnN0IHBoYXNlIGNoYW5nZXMgdG8gdGhlIHNjb3JlYm9hcmQgZGF0YSBzdHJ1Y3R1cmVzIGluCiAgICAgcHJlcGFyYXRpb24gZm9yIHRoZSByZXdyaXRpbmcgb2YgdGhlIHNjb3JlYm9hcmQgcGVyIG15IHBvc3RlZAogICAgIGRlc2lnbiBub3Rlcy4gW1BhdWwgSi4gUmVkZXJdCgogICopIEZpeCBodHRwZCdzIGRlZmluaXRpb24gb2YgTFRGTEFHUyB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhhdCBvZiBhcHIKICAgICBhbmQgYXByLXV0aWwsIGFsbG93IGl0IHRvIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvbmZpZ3VyZSBjb21tYW5kLWxpbmUKICAgICAoZGVmYXVsdD0iLS1zaWxlbnQiKSBhbmQgaW50cm9kdWNlIExUX0xERkxBR1MgdG8gcmVwbGFjZSB3aGF0IHdlIHdlcmUKICAgICBmb3JtZXJseSBhYnVzaW5nIGFzIExURkxBR1MuICBbUm95IEZpZWxkaW5nXQoKICAqKSBDbGVhbiB1cCB0aGUgcmVwb3J0aW5nIG9mIGluY29ycmVjdCBjbG9zaW5nIGNvbnRhaW5lciB0YWdzLgogICAgIFtCYXJyaWUgU2xheW1ha2VyIDxiYXJyaWVzQHNsYXlzeXMuY29tPl0KCiAgKikgU2ltcGxpZnkgdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIGJ5IG1vdmluZyBhbGwgbGlidG9vbCBzdHVmZiB0byBBUFIKICAgICBhbmQgbW92aW5nIGhpbnRzLm00IGlubGluZS4gIFtSb3kgRmllbGRpbmddCgogICopIEFkZCB0aGUgQVBfREVDTEFSRSgpL0FQX0NPUkVfREVDTEFSRSBtYWNyb3Mgb24gdGhlIHJldHVybiB0eXBlcwogICAgIG9mIGZ1bmN0aW9ucyB1c2VkIGJ5IG1vZF9wcm94eSBmb3IgZXhwb3J0IGluIHRoZSBETEwgCiAgICAgW0lhbiBIb2xzbWFuIDxJYW5IQGNuZXQuY29tPl0KCiAgKikgUHJldmVudCBhIGhhbmcgd2hlbiBhIGNnaSBoYW5kbGVkIGJ5IG1vZF9jZ2lkIHRyaWVzIHRvIHJlYWQgYQogICAgIHJlcXVlc3QgYm9keSBmcm9tIGl0cyBzdGRpbiBidXQgbm8gcmVxZXN0IGJvZHkgaXMgYmVpbmcgd3JpdHRlbiB0byAKICAgICB0aGUgY2dpLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2xvZ19jb25maWc6ICVjIGNvbm5lY3Rpb24gc3RhdHVzIGluY29ycmVjdGx5IGxvZ2dlZAogICAgIGFzICItIiAobm9uLWtlZXBhbGl2ZSkgd2hlbiBNYXhLZWVwQWxpdmVSZXF1ZXN0cyBpcyBzZXQgdG8gMC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgR2V0IG1vZF9jZXJuX21ldGEgd29ya2luZyB1bmRlciBXaW5kb3dzCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIENyZWF0ZSBGaWxlcywgYW5kIHRodXMgTU1BUHMsIG91dCBvZiB0aGUgcmVxdWVzdCBwb29sLCBub3QgdGhlCiAgICAgY29ubmVjdGlvbiBwb29sLiAgVGhpcyBzb2x2ZXMgYSBzbWFsbCByZXNvdXJjZSBsZWFrIHRoYXQgaGFkIHVzCiAgICAgbm90IGNsb3NpbmcgZmlsZXMgdW50aWwgYSBjb25uZWN0aW9uIHdhcyBjbG9zZWQuICBJbiBvcmRlciB0byBkbwogICAgIHRoaXMsIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmVfb3V0cHV0X2ZpbHRlciwgd2UgbG9vcCB0aHJvdWdoIHRoZQogICAgIGJyaWdhZGUgYW5kIGNvbnZlcnQgYW55IGRhdGEgd2UgaGF2ZSBpbnRvIGEgc2luZ2xlIEhFQVAgYnVja2V0CiAgICAgdGhhdCB3ZSBrbm93IHdpbGwgc3Vydml2ZSBjbGVhcmluZyB0aGUgcmVxdWVzdF9yZWMuCiAgICAgW1J5YW4gQmxvb20sIEp1c3RpbiBFcmVua3JhbnR6IDxqZXJlbmtyYW50ekBlYnVpbHQuY29tPiwKICAgICAgQ2xpZmYgV29vbGxleV0KCiAgKikgQ29tcGxldGVseSByZXZhbXAgY29uZmlndXJlIHNvIHRoYXQgaXQgcHJlc2VydmVzIHRoZSBzdGFuZGFyZCBtYWtlCiAgICAgdmFyaWFibGVzIENQUEZMQUdTLCBDRkxBR1MsIENYWEZMQUdTLCBMREZMQUdTIGFuZCBMSUJTIGJ5IG1vdmluZwogICAgIHRoZSBjb25maWd1cmUgYWRkaXRpb25zIHRvIEVYVFJBXyogdmFyaWFibGVzLiAgQWxzbywgYWxsb3cgdGhlIHVzZXIKICAgICB0byBzcGVjaWZ5IE5PVEVTVF8qIHZhbHVlcyBmb3IgYWxsIG9mIHRoZSBhYm92ZSwgd2hpY2ggZWxpbWluYXRlcyB0aGUKICAgICBuZWVkIGZvciBUSFJFQURfQ1BQRkxBR1MsIFRIUkVBRF9DRkxBR1MsIGFuZCBPUFRJTS4gIEZpeCB0aGUgc2V0dGluZwogICAgIG9mIElOQ0xVREVTIGFuZCBFWFRSQV9JTkNMVURFUy4gIENoZWNrIGZsYWdzIGFzIHRoZXkgYXJlIGFkZGVkIHRvCiAgICAgYXZvaWQgcG9pbnRsZXNzIGR1cGxpY2F0aW9ucy4gIEZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggZmxhZ3MgYXJlIGdpdmVuCiAgICAgb24gdGhlIGNvbXBpbGUgYW5kIGxpbmsgbGluZXMuICBSZW1vdmUgb2Jzb2xldGUgbWFjcm9zIEFQUl9ET0VYVFJBLAogICAgIEFDX0FERF9MSUJSQVJZLCBBQ19DSEVDS19ERUZJTkUsIEFQQUNIRV9QQVNTVEhSVSwgYW5kIEFQQUNIRV9PTkNFLgogICAgIEFkZGVkIEFQUl9TQVZFX1RIRV9FTlZJUk9OTUVOVCBhbmQgQVBSX1JFU1RPUkVfVEhFX0VOVklST05NRU5UIG1hY3Jvcy4KICAgICBSZW5hbWVkIEFDX1RZUEVfUkxJTV9UIG1hY3JvIHRvIEFQQUNIRV9UWVBFX1JMSU1fVC4gIFtSb3kgRmllbGRpbmddCgogICopIEdldCBtb2RfdGxzIHRvIGNvbXBpbGUvd29yayBiZXR0ZXIgb24gV2luZG93cy4gIFBSICM3NjEyCiAgICAgW0Jlcm5oYXJkIFNjaHJlbmsgPGIuc2NocmVua0BpbXByb3guY29tPl0KCiAgKikgRml4IHNodXRkb3duL3Jlc3RhcnQgaGFuZ3MgaW4gdGhlIHRocmVhZGVkIE1QTS4KICAgICBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXMsIFJ5YW4gQmxvb21dCiAgCiAgKikgUmVtb3ZlZCB0aGUga2VwdGFsaXZlIGJvb2xlYW4gZnJvbSBjb25uX3JlYyBiZWNhdXNlIGl0IGlzIG5vdyBvbmx5CiAgICAgdXNlZCBieSBhIHNpbmdsZSByb3V0aW5lIGFuZCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBsb2NhbCB2YXJpYWJsZS4KICAgICBbR3JlZyBTdGVpbiwgUnlhbiBCbG9vbSwgUm95IEZpZWxkaW5nXQoKICAqKSBQYXRjaCBwcmVmb3JrIHRvIHB1dCBlbm91Z2ggb2YgdGhlIHNpZ25hbCBwcm9jZXNzaW5nIGJhY2sgaW4gc28gdGhhdAogICAgIHNpZ25hbHMgYXJlIGFsbCBoYW5kbGVkIHByb3Blcmx5IG5vdy4gVGhlIHByZXZpb3VzIHBhdGNoIGZpeGVkIHRoZQogICAgIGRlYWRsb2NrIHJhY2UgY29uZGl0aW9uLCBidXQgYnJva2UgdGhlIHVzZXIgZGlyZWN0ZWQgc2lnbmFsIGhhbmRsaW5nLgogICAgIFRoaXMgZml4ZXMgaXQgdG8gd29yayB0aGUgd2F5IGl0IGRpZCBiZWZvcmUgbXkgcHJldmlvdXMgcHJlZm9yayBwYXRjaAogICAgIChwcmltYXJpbHksIFNJR1RFUk0gaXMgbm93IHdvcmtpbmcpLgogCiAgKikgQ2hhbmdlIGhvdyBpbnB1dCBmaWx0ZXJzIGRlY2lkZSBob3cgbXVjaCBkYXRhIGlzIHJldHVybmVkIHRvIHRoZQogICAgIGhpZ2hlciBmaWx0ZXIuICBXZSB1c2VkIHRvIHVzZSBhIGZpZWxkIGluIHRoZSBjb25uX3JlYywgd2l0aCB0aGlzCiAgICAgY2hhbmdlLCB3ZSB1c2UgYW4gYXJndW1lbnQgdG8gYXBfZ2V0X2JyaWdhZGUgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoCiAgICAgZGF0YSBpcyByZXRyaWV2ZWQuIFtSeWFuIEJsb29tXQoKICAqKSBGaXggc2VnIGZhdWx0IGF0IHN0YXJ0LXVwIGludHJvZHVjZWQgYnkgUnlhbidzIGNoYW5nZSB0byBlbmFibGUKICAgICBtb2R1bGVzIHRvIHNwZWNpZnkgdGhlaXIgb3duIGxvZ2dpbmcgdGFncy4gbW9kX2xvZ19jb25maWcKICAgICByZWdpc3RlcnMgYW4gb3B0aW9uYWwgZnVuY3Rpb24sIGFwX3JlZ2lzdGVyX2xvZ19oYW5kbGVyKCkuCiAgICAgYXBfcmVnaXN0ZXJfbG9nX2hhbmRsZXIoKSB3YXMgYmVpbmcgY2FsbGVkIGJ5IGh0dHBfY29yZSBiZWZvcmUKICAgICB0aGUgZGlyZWN0aXZlIGhhc2ggdGFibGUgd2FzIGNyZWF0ZWQuIFRoaXMgcGF0Y2ggY3JlYXRlcyB0aGUKICAgICBkaXJlY3RpdmUgaGFzaCB0YWJsZSBiZWZvcmUgYXBfcmVnaXN0ZXJfbG9nX2hhbmRsZXIoKSBpcwogICAgIHJlZ2lzdGVyZWQgYXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24uCiAgICAgW2plYW4tZnJlZGVyaWMgY2xlcmUgPGpmcmVkZXJpYy5jbGVyZUBmdWppdHN1LXNpZW1lbnMuY29tPl0KCiAgKikgQWRkIGFwX3NldF9pbnRfc2xvdCgpIGZ1bmN0aW9uCiAgICAgW0pvaG4gSy4gU3RlcmxpbmcgPHN0ZXJsaW5nQGNvdmFsZW50Lm5ldD5dCgogICopIFVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgQXBhY2hlIGRpZCBub3Qgc3VwcGx5IHRoZQogICAgIHJpZ2h0IHJlc3BvbnNlIGhlYWRlcnMgd2hlbiByZXF1aXJpbmcgYXV0aGVudGljYXRpb24uCiAgICAgW0dlcnRqYW4gdmFuIFdpbmdlcmRlIDxHZXJ0amFuLnZhbi5XaW5nZXJkZUBjbWcubmw+XSBQUiM3MTE0CiAgICAgKFRoaXMgaXMgYSBwb3J0IG9mIHRoZSBjaGFuZ2UgdGhhdCB3ZW50IGludG8gQXBhY2hlIDEuMy4xOS4pCgogICopIEFsbG93IG1vZHVsZXMgdG8gc3BlY2lmeSB0aGVpciBvd24gbG9nZ2luZyB0YWdzLiAgVGhpcyBiYXNpY2FsbHkKICAgICBhbGxvd3MgYSBtb2R1bGUgdG8gdGVsbCBtb2RfbG9nX2NvbmZpZyB0aGF0IHdoZW4gJXggaXMgZW5jb3VudGVyZWQKICAgICBhIHNwZWNpZmljIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuICBDdXJyZW50bHksIHggY2FuIGJlIGFueSBzaW5nbGUKICAgICBjaGFyYWN0ZXIuICBJdCBtYXkgYmUgbW9yZSB1c2VmdWwgdG8gbWFrZSB0aGlzIGEgc3RyaW5nIGF0IHNvbWUgcG9pbnQuCiAgICAgW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xNwoKICAqKSBJZiBhIGhpZ2hlci1sZXZlbCBmaWx0ZXIgaGFuZGxlcyB0aGUgdGhlIGJ5dGVyYW5nZSBhc3BlY3RzIG9mIGEKICAgICByZXF1ZXN0LCB0aGVuIHRoZSBieXRlcmFuZ2UgZmlsdGVyIHNob3VsZCBub3QgdHJ5IHRvIHJlZG8gdGhlCiAgICAgd29yay4gIFRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIHRoaXMgaGFwcGVuaW5nLCBpcyBhIGJ5dGVyYW5nZQogICAgIHJlcXVlc3QgZ29pbmcgdGhyb3VnaCB0aGUgcHJveHksIGFuZCB0aGUgb3JpZ2luIHNlcnZlciBoYW5kbGVzCiAgICAgdGhlIGJ5dGVyYW5nZSByZXF1ZXN0LiAgVGhlIHByb3h5IHNob3VsZCBpZ25vcmUgaXQuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KCiAgKikgQ2hhbmdlZCB0aGUgdGhyZWFkZWQgbXBtIHRvIGhhdmUgY2hpbGRfbWFpbiBqb2luIHRvIGVhY2ggb2YgdGhlCiAgICAgd29ya2VyIHRocmVhZHMgdG8gbWFrZSBzdXJlIHRoZSBraWRzIGFyZSBhbGwgZ29uZSBiZWZvcmUgY2hpbGRfbWFpbgogICAgIGV4aXRzIGFmdGVyIGEgc2lnbmFsIChjbGVhbnVwIGZyb20gcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSkuCiAgICAgVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgUnlhbnMgcmVjZW50IGNvbW1pdCB0byBtYWtlIHRoZSBjaGlsZF9tYWluCiAgICAgdGhlIHNpZ25hbCB0aHJlYWQuCgogICopIEFkZCBtb3JlIG9wdGlvbnMgdG8gdGhlIGFwX21wbV9xdWVyeSBmdW5jdGlvbi4gIFRoaXMgYWxzbyBhbGxvd3MgTVBNcyB0bwogICAgIHJlcG9ydCBpZiB0aGVpciB0aHJlYWRzIGFyZSBkeW5hbWljIG9yIHN0YXRpYy4gIEZpbmFsbHksIHRoaXMgYWxzbwogICAgIGltcGxlbWVudHMgYSBuZXcgQVBJLCBhcF9zaG93X21wbSwgd2hpY2ggcmV0dXJucyB0aGUgTVBNIHRoYXQgd2FzCiAgICAgcmVxdWlyZWQgaW50byB0aGUgY29yZS4gW0hhcnJpZSBIYXpld2lua2VsIDxoYXJyaWVAY292YWxlbnQubmV0Pl0KCiAgKikgRG8gbm90IGluc3RhbGwgdGhlIGJpbmFyaWVzIGZyb20gdGhlIHN1cHBvcnQgZGlyZWN0b3J5IHR3aWNlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuQGlpamxhYi5uZXQ+XQoKICAqKSBUaGUgYXBfZiogZnVuY3Rpb25zIHNob3VsZCBmbHVzaCBkYXRhIHRvIHRoZSBmaWx0ZXIgdGhhdCBpcyBwYXNzZWQKICAgICBpbiwgbm90IHRoZSB0aGUgZmlsdGVyIGFmdGVyIHRoZSBvbmUgcGFzc2VkIGluLgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbkBjb3ZhbGVudC5uZXQ+XQoKICAqKSBNYWtlIGFiIHdvcmsgYWdhaW4gYnkgY2hhbmdpbmcgaXRzIG5hdGl2ZSB0eXBlcyB0byBhcHIgdHlwZXMgYW5kIGZvcm1hdHMuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6IDxqZXJlbmtyYW50ekBlYnVpbHQuY29tPl0KCiAgKikgTW92ZSB0aGUgYnl0ZXJhbmdlIGZpbHRlciBhbmQgYWxsIG9mIHRoZSBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBiYWNrCiAgICAgdG8gdGhlIEhUVFAgbW9kdWxlLiAgVGhlIGJ5dGVyYW5nZSBmaWx0ZXIgdHVybmVkIG91dCB0byBiZSB2ZXJ5CiAgICAgSFRUUCBzcGVjaWZpYywgYW5kIGl0IGJlbG9uZ3MgaW4gdGhlIEhUVFAgbW9kdWxlLiAgW0dyZWcgU3RlaW5dCgogICopIE1ha2UgY2xlYW4sIGRpc3RjbGVhbiwgYW5kIGV4dHJhY2xlYW4gY29uc2lzdGVudGx5IGFjY29yZGluZyB0byB0aGUKICAgICBHbnUgbWFrZWZpbGUgZ3VpZGVsaW5lcy4gIFtKdXN0aW4gRXJlbmtyYW50eiA8amVyZW5rcmFudHpAZWJ1aWx0LmNvbT5dCgogICopIEZpeCBlcnJvcnMgaW4gdGhlIHJlbmFtaW5nIG9mIHRoZSBhcHJfdGhyZWFkYXR0cl9kZXRhY2hfeHh4IGZ1bmN0aW9ucy4KICAgICBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2luZyBwcm9ibGVtcyBzdG9wcGluZyBwcm9jZXNzZXMgaW4gdGhlIHRocmVhZGVkCiAgICAgbXBtJ3MuIFtHcmVnIEFtZXNdCgogICopIEZpeCBjb250ZW50LWxlbmd0aCBpbiBtb2RfbmVnb3RpYXRpb24gdG8gYSBsb25nIGludCByZXByZXNlbnRhdGlvbi4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZW1vdmUgQmluZEFkZHJlc3MgZnJvbSB0aGUgZGVmYXVsdCBjb25maWcgZmlsZS4KICAgICBbZ2lsZXNAbmVtZXRvbi5jb20uYXVdCgogICopIEFsbG93IG1vZHVsZSBhdXRob3JzIHRvIGFkZCBhIG1vZHVsZSB0byB0aGVpciBBcGFjaGUgYnVpbGQgdXNpbmcKICAgICAtLXdpdGgtbW9kdWxlLCB3aXRob3V0IHJlLXJ1bm5pbmcgYnVpbGRjb25mLiAgVGhlIHN5bnRheCBpczoKCS0td2l0aC1tb2R1bGU9bW9kdWxlX3R5cGU6L3BhdGgvdG8vbW9kdWxlLmMKICAgICBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGNvcHkgdGhlIG1vZHVsZS5jIGZpbGUgdG8gCiAgICAgbW9kdWxlcy9tb2R1bGVfdHlwZSwgYW5kIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlbGV2YW50IE1ha2VmaWxlcy4KICAgICBjdXJyZW50bHksIHRoaXMgb25seSB3b3JrcyBmb3Igc3RhdGljIG1vZHVsZXMuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2hhbmdlcyByZXF1aXJlZCB0byBtYWtlIHByZWZvcmsgY2xlYW4gdXAgaWRsZSBjaGlsZHJlbiBwcm9wZXJseS4KICAgICBUaGVyZSB3YXMgYSB3aW5kb3cgZHVyaW5nIHdoaWNoIGEgc3RhcnRpbmcgd29ya2VyIGRlYWRsb2NrcyB3aGVuCiAgICAgYW4gaWRsZSBjbGVhbnVwIGFycml2ZXMgYmVmb3JlIGl0IGNvbXBsZXRlcyBpbml0LiBBcGFjaGUgdGhlbiBrZWVwcwogICAgIHRyeWluZyB0byBjbGVhbnVwIHRoZSBzYW1lIGRlYWRsb2NrZWQgd29ya2VyIGZvcmV2ZXIgKHVudGlsIGhpZ2hlcgogICAgIHBpZHMgY29tZSBhbG9uZywgYnV0IGl0IHN0aWxsIHdpbGwgbmV2ZXIgcmVkdWNlIGJlbG93IHRoZSBkZWFkbG9ja2VkCiAgICAgcGlkKS4gVGh1cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHdvdWxkIG5vdCByZWR1Y2UgdG8gdGhlIGNvcnJlY3QKICAgICBpZGxlIGxldmVsLiBbUGF1bCBKLiBSZWRlcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE2CgogICopIENoYW5nZSB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIC91c3IvbG9jYWwvYXBhY2hlMiwKICAgICBhcyBub3cgZGVmaW5lZCBieSB0aGUgIkFwYWNoZSIgbGF5b3V0IGluIGNvbmZpZy5sYXlvdXQuIFtNYXJjIFNsZW1rb10KCiAgKikgT1MvMjogQWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyBhcyBPUy8yIERMTHMuIAogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEdldCBNYXhSZXF1ZXN0c1BlckNoaWxkIHdvcmtpbmcgd2l0aCB0aGUgV2luZG93cyBNUE0uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIE1ha2UgZ2VuZXJpYyBob29rcyB0byB3b3JrLCB3aXRoIG1vZF9nZW5lcmljX2hvb2tfaW1wb3J0L2V4cG9ydAogICAgIGV4cGVyaW1lbnRhbCBtb2R1bGVzLiAgW0JlbiBMYXVyaWUsIFdpbGwgUm93ZV0KCiAgKikgRml4IHNlZ2ZhdWx0cyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCBlcnJvcnMgc3VjaCBhcwogICAgICI8RGlyZWN0b3J5PiIgZm9sbG93ZWQgYnkgIjwvRGlyZWN0b3J5IiBhbmQKICAgICAiPERpcmVjdG9yeT4iIGZvbGxvd2VkIGJ5ICI8L0RpcmVjdG9yeXo+Ii4gIFtKZWZmIFRyYXdpY2tdCgogICopIENsZWFudXAgdGhlIC0tZW5hYmxlLWxheW91dCBvcHRpb24gb2YgY29uZmlndXJlLiAgVGhpcyBtYWtlcwogICAgIHVzIHVzZSBhIGNvbnNpc3RlbnQgbG9jYXRpb24gZm9yIHRoZSBjb25maWcubGF5b3V0IGZpbGUsIGFuZCBpdAogICAgIG1ha2VzIGNvbmZpZ3VyZSBtb3JlIHBvcnRhYmxlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuQGlpamxhYi5uZXQ+XQoKICAqKSBDaGFuZ2VzIHRvICdhYic7IGZpeGVkIGludCBvdmVycnVuJ3MsIGFkZGVkIHN0YXRpc3RpY3MsIG91dHB1dCBpbgogICAgIGNzdi9nbnVwbG90IGZvcm1hdCwgcnVkaW1lbnRhcnkgc3NsIHN1cHBvcnQgYW5kIHZhcmlvdXMgb3RoZXIgdHdlYWtzCiAgICAgdG8gbWFrZSByZXN1bHRzIG1vcmUgdHJ1ZSB0byB3aGF0IGlzIG1lYXN1cmVkLiBUaGUgdXBzaG90IG9mIHRoaXMgaXQKICAgICB0dXJucyBvdXQgdGhhdCAnYWInIGhhcyBvZnRlbiB1bmRlcnJlcG9ydGVkIHRoZSB0cnVlIHBlcmZvcm1hbmNlIG9mCiAgICAgYXBhY2hlLiBPZnRlbiBieSBhIG9yZGVyIG9mIG1hZ25pdHVkZSA6LSkgU2VlIHRhbGsvcGFwZXIgb2YgU2FuZGVyIAogICAgIFRlbW1lIDxzY3RlbW1lQGNvdmFsZW50Lm5ldD4gYXQgQXByaWwgQXBhY2hlQ29uIDIwMDEgZm9yIGRldGFpbHMuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpa10KCiAgKikgQ2xlYW4gdXAgbW9kX2NnaWQncyB0ZW1wb3JhcnkgcmVxdWVzdCBwb29sLiAgQmVzaWRlcyBmaXhpbmcgYQogICAgIHN0b3JhZ2UgbGVhayB0aGlzIGVuc3VyZXMgdGhhdCBzb21lIHVubmVjZXNzYXJ5IHBpcGVzIGFyZSBjbG9zZWQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgUGVyZm9ybWFuY2U6IEFkZCBxdWlja19oYW5kbGVyIGhvb2suIFRoaXMgaG9vayBpcyBjYWxsZWQgYXQgdGhlCiAgICAgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBiZWZvcmUgbG9jYXRpb25fd2FsaywKICAgICB0cmFuc2xhdGVfbmFtZSwgZXRjLiAgVGhpcyBob29rIGlzIHVzZWZ1bCBmb3IgVVJJIGtleWVkIGNvbnRlbnQKICAgICBjYWNoZXMgbGlrZSBNaWtlIEFiYm90dCdzIFF1aWNrIFNob3J0Y3V0IENhY2hlLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSB0b3BfbW9kdWxlIGdsb2JhbCB2YXJpYWJsZSByZW5hbWVkIHRvIGFwX3RvcF9tb2R1bGUgW1BlcmxdCgogICopIE1vdmUgYXBfc2V0X2xhc3RfbW9kaWZpZWQgdG8gdGhlIGNvcmUuICBUaGlzIGlzIGEgcG90ZW50aWFsbHkgCiAgICAgY29udHJvdmVyc2lhbCBjaGFuZ2UsIGJlY2F1c2UgdGhpcyBpcyBraW5kIG9mIEhUVFAgc3BlY2lmaWMuICBIb3dldmVyCiAgICAgbWFueSBwcm90b2NvbHMgc2hvdWxkIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBraW5kIG9mCiAgICAgaW5mb3JtYXRpb24uICBJIGV4cGVjdCB0aGF0IGhlYWRlcnMgd2lsbCBuZWVkIG9uZSBtb3JlIGxheWVyIG9mCiAgICAgaW5kaXJlY3Rpb24gZm9yIG11bHRpLXByb3RvY29sIHdvcmssIGJ1dCB0aGlzIGlzIGEgc21hbGwgc3RlcCBpbgogICAgIHRoZSByaWdodCBkaXJlY3Rpb24uICBbUnlhbiBCbG9vbV0KCiAgKikgRW5hYmxlIG1vZF9zdGF0dXMgYnkgZGVmYXVsdC4gIFRoaXMgbWF0Y2hlcyB3aGF0IEFwYWNoZSAxLjMgZG9lcy4KICAgICBbRWQgS29ydGhvZl0KCiAgKikgQWRkIGEgU2NyaXB0U29jayBkaXJlY3RpdmUgdG8gdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUuICBUaGlzIGlzCiAgICAgb25seSBlbmFibGVkIHdoZW4gbW9kX2NnaWQgaXMgdXNlZC4gIAogICAgIFtUYWtldG8gS2FiZSA8a2FiZUBzcmEtdG9ob2t1LmNvLmpwPl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE1CgogICopIFVudGFuZ2xlZCB0aGUgYnVpbGRjb25mIHNjcmlwdCBhbmQgZWxpbWluYXRlZCB0aGUgbmVlZCBmb3IgYnVpbGQncwogICAgIGFjbG9jYWwubTQsIGdlbmVyYXRlZF9saXN0cywgYnVpbGQubWssIGJ1aWxkMi5taywgYW5kIGEgaG9zdCBvZiBvdGhlcgogICAgIGxpYnRvb2wgbXVjayB0aGF0IGlzIG5vdyB1bmRlciBzcmNsaWIvYXByL2J1aWxkLiAgW1JveSBGaWVsZGluZ10KCiAgKikgV2luMzI6IERvbid0IGFjY2VwdCBtb3JlIGNvbm5lY3Rpb25zIHRoYW4gd2UgaGF2ZSB3b3JrZXIgdGhyZWFkcwogICAgIHRvIGhhbmRsZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IGJ1ZyBpbiB0aGUgVW5peCB0aHJlYWRlZC5jIE1QTSB0aGF0IGFsbG93ZWQgY2hpbGQgcHJvY2Vzc2VzCiAgICAgdG8gZm9yaygpIG5ldyBjaGlsZCBwcm9jZXNzZXMuIAogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBtYWpvciBzZWN1cml0eSBwcm9ibGVtIHdpdGggZG91YmxlLXJldmVyc2UgbG9va3VwIGNoZWNraW5nLiAgCiAgICAgUHJldmlvdXNseSwgYSBjbGllbnQgY29ubmVjdGluZyBvdmVyIElQdjQgd291bGQgbm90IGJlIG1hdGNoZWQgCiAgICAgcHJvcGVybHkgd2hlbiB0aGUgc2VydmVyIGhhZCBhbiBJUHY2IGxpc3RlbmluZyBzb2NrZXQuICBQUiAjNzQwNwogICAgIFtUYWtldG8gS2FiZSA8a2lhYmVAc3JhLXRvaG9rdS5jby5qcD5dCgogICopIENoYW5nZSB0aGUgd2F5IHRoZSBiZW9zIE1QTSBoYW5kbGVzIHBvbGxpbmcgdG8gYWxsb3cgaXQgdG8gc3RvcCBhbmQKICAgICByZXN0YXJ0LiAgUHJvYmxlbSB3YXMgdGhlIHNvY2tldHMgYmVpbmcgcG9sbGVkIHdlcmUgYmVpbmcgcmVzZXQgYnkKICAgICB0aGUgc2VsZWN0IGNhbGwsIHNvIG9uY2UgaXQgaGFkIGFjY2VwdGVkIGEgY29ubmVjdGlvbiBpdCB3YXMgbm8KICAgICBsb25nZXIgbGlzdGVuaW5nIG9uIHRoZSBVRFAgc29ja2V0IHdlIHVzZSBmb3Igc2h1dGRvd24gaW5zdHJ1Y3Rpb25zLgogICAgIEFQUiBuZWVkcyB0byBiZSBhbHRlcmVkLCBwYXRjaCBvbiBpdCdzIHdheS4gW0RhdmlkIFJlaWRdCgogICopIEVtcHR5IG91dCB0aGUgYnJpZ2FkZSBzaGFyZWQgYnkgYXBfZ2V0bGluZSgpL2FwX2dldF9jbGllbnRfYmxvY2soKQogICAgIG9uIGVycm9yIGV4aXQgZnJvbSBhcF9nZXRsaW5lKCkuICBTb21lIG90aGVyIGNvZGUgZ290IHVwc2V0IGJlY2F1c2UKICAgICB0aGUgd3JvbmcgZGF0YSB3YXMgaW4gdGhlIGJyaWdhZGUuICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIEhhbmRsZSBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keSgpIGJlaW5nIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KICAgICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIEdldCByaWQgb2YgYW4gaW5hZHZlcnRlbnQgY2xvc2Ugb2YgZmlsZSBkZXNjcmlwdG9yIDIgaW4KICAgICBtb2RfbWltZV9tYWdpYy4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgQWRkIGEgaG9vaywgY3JlYXRlX3JlcXVlc3QuICBUaGlzIGhvb2sgYWxsb3dzIG1vZHVsZXMgdG8gbW9kaWZ5CiAgICAgYSByZXF1ZXN0IHdoaWxlIGl0IGlzIGJlaW5nIGNyZWF0ZWQuICBUaGlzIGhvb2sgaXMgY2FsbGVkIGZvciBhbGwKICAgICByZXF1ZXN0X3JlYydzLCBtYWluIHJlcXVlc3QsIHN1YiByZXF1ZXN0LCBhbmQgaW50ZXJuYWwgcmVkaXJlY3QuCiAgICAgV2hlbiB0aGlzIGhvb2sgaXMgY2FsbGVkLCB0aGUgdGhlIHItPm1haW4sIHItPnByZXYsIHItPm5leHQKICAgICBwb2ludGVycyBoYXZlIGJlZW4gc2V0LCBzbyBtb2R1bGVzIGNhbiBkZXRlcm1pbmUgd2hhdCBraW5kIG9mCiAgICAgcmVxdWVzdCB0aGlzIGlzLiAgW1J5YW4gQmxvb21dCgogICopIENsZWFudXAgdGhlIGJ1aWxkIHByb2Nlc3MgYSBiaXQgbW9yZS4gIFRoZSBBcGFjaGUgY29uZmlndXJlCiAgICAgc2NyaXB0IG5vIGxvbmdlciBjcmVhdGVzIGl0cyBvd24gaGVscGVyIHNjcmlwdHMsIGl0IGp1c3QKICAgICB1c2VzIEFQUidzLiAgCiAgICAgW2plYW4tZnJlZGVyaWMgY2xlcmUgPGpmcmVkZXJpYy5jbGVyZUBmdWppdHN1LXNpZW1lbnMuY29tPl0KCiAgKikgU3RvcCB0aGUgZm9yY2VkIGRvd25ncmFkZSBvZiB0aGUgY29ubmVjdGlvbiB0byBIVFRQLzEuMCBmb3IKICAgICBwcm94eSByZXF1ZXN0cy4gIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgQXZvaWQgdXNpbmcgc3NjYW5mIHRvIGRldGVybWluZSB0aGUgSFRUUCBwcm90b2NvbCBudW1iZXIgaW4KICAgICB0aGUgY29tbW9uIGNhc2UgYmVjYXVzZSBzc2NhbmYgaXMgYSBwZXJmb3JtYW5jZSBob2cuIEZyb20KICAgICBNaWtlIEFiYm90J3MgQWNjZWxlcmF0aW5nIEFwYWNoZSBwYXRjaCBudW1iZXIgNi4KICAgICBbTWlrZSBBYmJvdCA8bWphQHRydWRnZS5lbmdyLnNnaS5jb20+LCBCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBzZWN1cml0eSBleHBvc3VyZSBpbiBtb2RfYWNjZXNzLiAgUHJldmlvdXNseSB3aGVuIElQdjYgCiAgICAgbGlzdGVuaW5nIHNvY2tldHMgd2VyZSB1c2VkLCBhbGxvdy9kZW55LWZyb20tSVB2NC1hZGRyZXNzIHJ1bGVzIAogICAgIHdlcmUgbm90IGV2YWx1YXRlZCBwcm9wZXJseSAoUFIgIzc0MDcpLiAgQWxzbywgYWRkIHRoZSBhYmlsaXR5IHRvIAogICAgIHNwZWNpZnkgSVB2NiBhZGRyZXNzIHN0cmluZ3Mgd2l0aCBvcHRpb25hbCBwcmVmaXggbGVuZ3RoIG9uIEFsbG93IAogICAgIGFuZCBEZW55LiAgW0plZmYgVHJhd2lja10KCiAgKikgRW5oYW5jZSByb3RhdGVsb2dzIHNvIHRoYXQgYSBVVEMgb2Zmc2V0IGNhbiBiZSBzcGVjaWZpZWQsIGFuZAogICAgIHRoZSBsb2dmaWxlIG5hbWUgY2FuIGJlIGZvcm1hdHRlZCB1c2luZyBzdHJmdGltZSgzKS4gIChCcm91Z2h0CiAgICAgZm9yd2FyZCBmcm9tIDEuMy4pICBbS2VuIENvYXJdCgogICopIFJlaW1wbGVtZW50IHRoZSBXaW5kb3dzIE1QTSAobXBtX3dpbm50LmMpIHRvIGVsaW1pbmF0ZSBjYWxsaW5nIAogICAgIER1cGxpY2F0ZUhhbmRsZSBvbiBhbiBJT0NvbXBsZXRpb25Qb3J0IChhIHByYWN0aWNlIHdoaWNoCiAgICAgTVMgImRpc2NvdXJhZ2VzIikuIFRoZSBuZXcgbW9kZWwgZG9lcyBub3QgcmVseSBvbiBhc3NvY2lhdGluZwogICAgIHRoZSBjb21wbGV0aW9uIHBvcnQgd2l0aCB0aGUgbGlzdGVuaW5nIHNvY2tldHMsIHRodXMgdGhlCiAgICAgY29tcGxldGlvbiBwb3J0IGNhbiBiZSBjb21wbGV0ZWx5IG1hbmFnZWQgd2l0aGluIHRoZSBjaGlsZCAKICAgICBwcm9jZXNzLiAgQSBkZWRpY2F0ZWQgdGhyZWFkIGFjY2VwdHMgY29ubmVjdGlvbnMgb2ZmIHRoZSBuZXR3b3JrLAogICAgIHRoZW4gY2FsbHMgUG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoKSB0byB3YWtlIHVwIHdvcmtlcgogICAgIHRocmVhZHMgYmxvY2tlZCBvbiB0aGUgY29tcGxldGlvbiBwb3J0LgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBCcmluZyBmb3J3YXJkIHRoZSAtLXN1ZXhlYy11bWFzayBvcHRpb24gd2hpY2ggYWxsb3dzIHRoZQogICAgIGJ1aWxkZXIgdG8gcHJlc2V0IHRoZSB1bWFzayBmb3Igc3VleGVjIHByb2Nlc3Nlcy4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIGEgLVYgZmxhZyB0byBzdWV4ZWMsIHdoaWNoIGNhdXNlcyBpdCB0byBkaXNwbGF5IHRoZQogICAgIGNvbXBpbGUtdGltZSBzZXR0aW5ncyB3aXRoIHdoaWNoIGl0IHdhcyBidWlsdC4gIChPbmx5CiAgICAgdXNhYmxlIGJ5IHJvb3Qgb3IgdGhlIEFQX0hUVFBEX1VTRVIgdXNlcm5hbWUuKSAgW0tlbiBDb2FyXQoKICAqKSBNb2RfaW5jbHVkZSBzaG91bGQgYWx3YXlzIHVuc2V0IHRoZSBjb250ZW50LWxlbmd0aCBpZiB0aGUgZmlsZSBpcwogICAgIGdvaW5nIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHNlbmRfcGFyc2VkX2NvbnRlbnQuICBUaGVyZSBpcyBubyB0bwogICAgIGRldGVybWluZSBpZiB0aGUgY29udGVudCB3aWxsIGNoYW5nZSBiZWZvcmUgYWN0dWFsbHkgc2Nhbm5pbmcgdGhlCiAgICAgZW50aXJlIGNvbnRlbnQuICBJdCBpcyBmYXIgc2FmZXIgdG8ganVzdCByZW1vdmUgdGhlIEMtTCBhcyBsb25nCiAgICAgYXMgd2UgYXJlIHNjYW5uaW5nIGl0LiAgW1J5YW4gQmxvb21dCgogICopIE1ha2Ugc3VyZSBBcGFjaGUgc2VuZHMgV1dXLUF1dGhlbnRpY2F0ZSBkdXJpbmcgYSByZXZlcnNlIHByb3h5CiAgICAgcmVxdWVzdCBhbmQgbm90IFByb3h5LUF1dGhlbnRpY2F0ZS4KICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTQKCiAgKikgRml4IGNvbnRlbnQtbGVuZ3RoIGNvbXB1dGF0aW9uLiAgV2UgT05MWSBjb21wdXRlIGEgY29udGVudC1sZW5ndGggaWYKICAgICBXZSBhcmUgbm90IGluIGEgMS4xIHJlcXVlc3QgYW5kIHdlIGNhbm5vdCBjaHVuaywgYW5kIHRoaXMgaXMgYSBrZWVwYWxpdmUKICAgICBvciB3ZSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhLiAgW1J5YW4gQmxvb21dCgogICopIFJlcG9ydCB1bmJvdW5kZWQgY29udGFpbmVycyBpbiB0aGUgY29uZmlnIGZpbGUuICBQcmV2aW91c2x5LCBhIHR5cG8KICAgICBpbiB0aGUgPC9jb250YWluZXI+IGRpcmVjdGl2ZSBjb3VsZCByZXN1bHQgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZwogICAgIGZpbGUgYmVpbmcgc2lsZW50bHkgaWdub3JlZCwgd2l0aCB1bmRlc2lyZWQgZGVmYXVsdHMgdXNlZC4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNYWtlIHRoZSBvbGRfd3JpdGUgZmlsdGVyIHVzZSB0aGUgYXBfZiogZnVuY3Rpb25zIGZvciB0aGUgYnVmZmVyaW5nLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBNb3ZlIG1vcmUgY29kZSBmcm9tIHRoZSBodHRwIG1vZHVsZSBpbnRvIHRoZSBjb3JlIHNlcnZlci4gIFRoaXMKICAgICBpcyBjb3JlIGNvZGUsIGJhc2ljYWxseSB0aGUgZGVmYXVsdCBoYW5kbGVyLCB0aGUgZGVmYXVsdCBpbnB1dAogICAgIGFuZCBvdXRwdXQgZmlsdGVycywgYW5kIGFsbCBvZiB0aGUgY29yZSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuCiAgICAgQWxsIG9mIHRoaXMgY29kZSBpcyByZXF1aXJlZCBpbiBvcmRlciBmb3IgdGhlIHNlcnZlciB0byB3b3JrLCB3aXRoIG9yCiAgICAgd2l0aG91dCBIVFRQLiAgVGhlIHNlcnZlciBpcyBjbG9zZXIgdG8gd29ya2luZyB3aXRob3V0IHRoZSBIVFRQCiAgICAgbW9kdWxlLCBhbHRob3VnaCB0aGVyZSBpcyBzdGlsbCBtb3JlIHRvIGRvLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIG51bWJlciBvZiBTR0kgY29tcGlsZSB3YXJuaW5ncyB0aHJvdWdob3V0IHRoZSBzZXJ2ZXIuICBGaXggc29tZQogICAgIGJhZCBwYXJhbWV0ZXJzIHRvIGFwcl9idWNrZXRfcmVhZCgpLiAgRml4IGEgYmFkIHN0YXRlbWVudCBpbiAKICAgICBhcF9tZXRob2RfaW5fbGlzdCgpLiAgRm9yIHRoZSBtb2RfcmV3cml0ZSBjYWNoZSB1c2UgYXByX3RpbWVfdCAKICAgICBjb25zaXN0ZW50bHk7IHdlIHdlcmUgbWl4aW5nIGFwcl90aW1lX3QgYW5kIHRpbWVfdCBpbiBpbnZhbGlkIHdheXMgCiAgICAgYmVmb3JlLiAgSW4gbG9hZF9maWxlKCksIGNhbGwgYXByX2Rzb19lcnJvcigpIGluc3RlYWQgb2YgCiAgICAgYXByX3N0cmVycm9yKCkgc28gdGhhdCB3ZSBnZXQgYSBtb3JlIHNwZWNpZmljIHN0cmluZyBvbiBzb21lIHBsYXRmb3Jtcy4KICAgICBQUiAjNjk4MCAgW0plZmYgVHJhd2lja10KCiAgKikgQWxsb3cgbW9kdWxlcyB0byBxdWVyeSB0aGUgTVBNIGFib3V0IGl0J3MgZXhlY3V0aW9uIHByb2ZpbGUuICBUaGlzCiAgICAgcXVlcnkgQVBJIGNhbiBhbmQgc2hvdWxkIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIGJ1dCBmb3Igbm93LAogICAgIG1heF9kYWVtb25zLCBhbmQgdGhyZWFkaW5nIG9yIGZvcmtpbmcgaXMgYSB2ZXJ5IGdvb2Qgc3RhcnQuCiAgICAgW0pvbiBUcmF2aXMgPGp0cmF2aXNAY292YWxlbnQubmV0Pl0KCiAgKikgTW9kaWZ5IG1vZF9pbmNsdWRlIHRvIHNlbmQgYmxvY2tzIG9mIGRhdGEgbm8gbGFyZ2VyIHRoYW4gOWsuCiAgICAgV2l0aG91dCB0aGlzLCBtb2RfaW5jbHVkZSB3aWxsIHdhaXQgdW50aWwgdGhlIHdob2xlIGZpbGUgaXMgcGFyc2VkLAogICAgIG9yIHRoZSBmaXJzdCB0YWcgaXMgZm91bmQgdG8gc2VuZCBhbnkgZGF0YSB0byB0aGUgY2xpZW50LgogICAgIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEZpeCBtb2RfaW5mbywgc28gdGhhdCA8RGlyZWN0b3J5PiBhbmQgPExvY2F0aW9uPiBkaXJlY3RpdmVzIGFyZQogICAgIG5vdCBkaXNwbGF5ZWQgdHdpY2Ugd2hlbiBkaXNwbGF5aW5nIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuQGNvdmFsZW50Lm5ldD5dCgogICopIEFkZCBjb25maWcgZGlyZWN0aXZlcyB0byBvdmVycmlkZSBERUZBVUxUX0VSUk9SX01TRyBhbmQKICAgICBERUZBVUxUX1RJTUVfRk9STUFULiAgVGhpcyB3YXMgc2VudCBpbiBhcyBQUiA2MTkzLgogICAgIFtEYW4gUmVuY2ggPGRyZW5jaEB4bmV0LmNvbT5dCgogICopIEdldCBtb2RfaW5mbyBidWlsZGluZyBhbmQgbG9hZGluZyBvbiBXaW4zMi4gIFtXaWxsaWFtIFJvd2VdCgogICopIEJlZ2luIHRvIG1vdmUgcHJvdG9jb2wgaW5kZXBlbmRhbnQgZnVuY3Rpb25zIG91dCBvZiBtb2RfaHR0cC4gIFRoZSBnb2FsCiAgICAgaXMgdG8gaGF2ZSBvbmx5IGZ1bmN0aW9ucyB0aGF0IGFyZSBIVFRQIHNwZWNpZmljIGluIHRoZSBodHRwIGRpcmVjdG9yeS4KICAgICBbUnlhbiBCbG9vbV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjEzCgogICopIERvbid0IGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYWx3YXlzIGJlIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBieXRlcmFuZ2UgCiAgICAgZmlsdGVyLiAgSXQgaXMgcG9zc2libGUgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gZG8gYnl0ZXJhbmdlcyB3aXRoIG9ubHkKICAgICBvbmUgY2FsbCB0byB0aGUgZmlsdGVyLiAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuQGNvdmFsZW50Lm5ldD5dCgogICopIE1vdmUgdGhlIGVycm9yX2J1Y2tldCBkZWZpbml0aW9uIGZyb20gdGhlIGh0dHAgbW9kdWxlIHRvIHRoZQogICAgIGNvcmUgc2VydmVyLiAgRXZlcnkgcHJvdG9jb2wgd2lsbCBuZWVkIHRoaXMgYWJpbGl0eSwgbm90IGp1c3QKICAgICBIVFRQLiAgW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xMgoKICAqKSBNb2RpZnkgbW9kX2ZpbGVfY2FjaGUgdG8gc2F2ZSBwcmUtZm9ybWF0dGVkIHN0cmluZ3MgZm9yIAogICAgIGNvbnRlbnQtbGVuZ3RoIGFuZCBsYXN0LW1vZGlmaWVkIGhlYWRlcnMgZm9yIHBlcmZvcm1hbmNlLiAKICAgICBbTWlrZSBBYmJvdCA8bWphQHRydWRnZS5lbmdyLnNnaS5jb20+XQoKICAqKSBOYW1lc3BhY2UgcHJvdGVjdCBJT0JVRlNJWiBzaW5jZSBpdCBpcyBleHBvc2VkIGluIHRoZSBBUEkuCiAgICAgW0pvbiBUcmF2aXMgPGp0cmF2aXNAY292YWxlbnQubmV0Pl0KCiAgKikgVXNlICJCYXNpYyIgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiAiYmFzaWMiIGluIGFiLCBhcyB0aGUgc3BlYwogICAgIHNheXMgd2Ugc2hvdWxkLiAgW0FuZHJlIEJyZWlsZXIgPGFuZHJlLmJyZWlsZXJAcmQuYmJjLmNvLnVrPl0KCiAgKikgRml4IGEgc2VnIGZhdWx0IGluIG1vZF91c2VyZGlyLmMuICBXZSB1c2VkIHRvIHVzZSB0aGUgcHcgc3RydWN0dXJlCiAgICAgd2l0aG91dCBldmVyIGZpbGxpbmcgaXQgb3V0LiAgVGhpcyBmaXhlcyBQUiA3MjcxLgogICAgIFtUYWtldG8gS2FiZSA8a2FiZUBzcmEtdG9ob2t1LmNvLmpwPiBhbmQgCiAgICAgIENsaWZmIFdvb2xsZXkgPGNsaWZmd29vbGxleUB5YWhvby5jb20+XQoKICAqKSBBZGQgYSBjb3VwbGUgb2YgR0NDIGF0dHJpYnV0ZSB0YWdzIHRvIHByaW50ZiBzdHlsZSBmdW5jdGlvbnMuCiAgICAgW0pvbiBUcmF2aXMgPGp0cmF2aXNAY292YWxlbnQubmV0Pl0KCiAgKikgQWRkIHRoZSBjb3JyZWN0IGxhbmd1YWdlIHRhZyBmb3IgaW50ZXJvcGVyYXRpb24gd2l0aCB0aGUgVGFpd2FuZXNlCiAgICAgdmVyc2lvbnMgb2YgTVNJRSBhbmQgTmV0c2NhcGUuIFtDbGl2ZSBMaW4gPGNsaXZlQENpclguT1JHPl0gUFIjNzE0MgoKICAqKSBNaWdyYXRlIHRoZSBwZXJjaGlsZCBNUE0gdG8gdXNlIHRoZSBuZXcgYXByIHNpZ25hbCBjaGlsZCwgYW5kIAogICAgIEFQUiB0aHJlYWQgZnVuY3Rpb25zLiAgW1J5YW4gQmxvb21dCgogICopIENsb3NlIG9uZSBjb3B5IG9mIHRoZSBDR0kncyBzdGRvdXQgYmVmb3JlIGNyZWF0aW5nIHRoZSBuZXcgcHJvY2Vzcy4KICAgICBUaGUgQ0dJIHdpbGwgc3RpbGwgaGF2ZSBzdGRvdXQsIGJlY2F1c2Ugd2UgaGF2ZSBhbHJlYWR5IGR1cCdlZCBpdC4KICAgICBUaGlzIGtlZXBzIEFwYWNoZSBmcm9tIHdhaXRpbmcgZm9yZXZlciB0byBzZW5kIHRoZSByZXN1bHRzIG9mIGEgQ0dJCiAgICAgcHJvY2VzcyB0aGF0IGhhcyBmb3JrZWQgYSBsb25nLWxpdmVkIGNoaWxkIHByb2Nlc3MuCiAgICAgW1Rha2V0byBLYWJlIDxrYWJlQHNyYS10b2hva3UuY28uanA+XQoKICAqKSBSZW1vdmUgdGhlIHJlc3Qgb2YgdGhlIHB0aHJlYWRzIGZ1bmN0aW9ucyBmcm9tIHRoZSB0aHJlYWRlZCBNUE0uCiAgICAgVGhpcyByZXF1aXJlcyB0aGUgQVBSIHN1cHBvcnQgZm9yIGEgc2lnbmFsIHRocmVhZCB0aGF0IHdhcyBqdXN0CiAgICAgYWRkZWQuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSBtb2RfZGlyIHVzZSBhIGZpeHVwIGZvciBzZW5kaW5nIGEgcmVkaXJlY3QgdG8gdGhlIGJyb3dzZXIuCiAgICAgQmVmb3JlIHRoaXMsIHdlIHdlcmUgdXNpbmcgYSBoYW5kbGVyLCB3aGljaCBkb2Vzbid0IG1ha2UgbXVjaAogICAgIHNlbnNlLCBiZWNhdXNlIHRoZSBoYW5kbGVyIHdhc24ndCBnZW5lcmF0aW5nIGFueSBkYXRhLCBpdCB3b3VsZAogICAgIGVpdGhlciByZXR1cm4gYSByZWRpcmVjdCBlcnJvciBjb2RlLCBvciBERUNMSU5FRC4gIFRoaXMgZml0cyB0aGUKICAgICBjdXJyZW50IGhvb2tzIGJldHRlci4gIFtSeWFuIE1vcmdhbiA8cm1vcmdhbkBjb3ZhbGVudC5uZXQ+XQoKICAqKSBNYWtlIHRoZSB0aHJlYWRlZCBNUE0gdXNlIEFQUiB0aHJlYWRzIGluc3RlYWQgb2YgcHRocmVhZHMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBtb2RfdGxzIHRvIHRoZSBwb2ludCB3aGVyZSBpdCBhY3R1YWxseSBhcHBlYXJzIHRvIHdvcmsgaW4gYWxsIGNhc2VzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBpbXBsZW1lbnQgLS1lbmFibGUtbW9kdWxlcyBhbmQgLS1lbmFibGUtbW9kcy1zaGFyZWQgZm9yICJhbGwiIGFuZAogICAgICJtb3N0Ii4gIFtHcmVnIFN0ZWluXQoKICAqKSBNb3ZlIHRoZSB0aHJlYWRlZCBNUE0gdG8gdXNlIEFQUiBsb2NrcyBpbnN0ZWFkIG9mIHB0aHJlYWQgbG9ja3MuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbmFtZSBtcG10X3B0aHJlYWQgdG8gdGhyZWFkZWQuICBUaGlzIGlzIG1vcmUgaW4gbGluZSB3aXRoIHRoZQogICAgIGZhY3QgdGhhdCBtcG10X3B0aHJlYWQgc2hvdWxkbid0IGJlIHVzaW5nIHB0aHJlYWRzIGRpcmVjdGx5LCBhbmQKICAgICBpdCBpcyBhIHNtYWxsZXIgbmFtZSB0aGF0IGRvZXNuJ3QgdGllIGludG8gYW55dGhpbmcuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbmFtZSB0aGUgbW9kdWxlIHN0cnVjdHVyZXMgc28gdGhhdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIG1hdGNoZXMKICAgICB0aGUgZmlsZSBuYW1lLCBhbmQgaXQgaXMgZWFzaWVyIHRvIGF1dG9tYXRlIHRoZSBpbnN0YWxsYXRpb24KICAgICBwcm9jZXNzIChnZW5lcmF0aW5nIExvYWRNb2R1bGUgZGlyZWN0aXZlcyBmcm9tIHRoZSBtb2R1bGUgZmlsZW5hbWVzKS4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFJlbW92ZSB0aGUgY29hbGVzY2UgZmlsdGVyLiAgV2l0aCB0aGUgYXBfZiogZnVuY3Rpb25zLCB0aGlzIGZpbHRlcgogICAgIGlzIG5vIGxvbmdlciBuZWVkZWQuIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTEKCiAgKikgUmVtb3ZlIHRoZSBkZXh0ZXIgTVBNLiAgUGVyY2hpbGQgaXMgdGhlIHNhbWUgYmFzaWMgaWRlYSwgYnV0IGl0IGhhcyB0aGUKICAgICBhZGRlZCBmZWF0dXJlIG9mIGFsbG93aW5nIGEgdWlkL2dpZCBwZXIgY2hpbGQgcHJvY2Vzcy4gIElmIG5vCiAgICAgdWlkL2dpZCBpcyBzcGVjaWZpZWQsIHRoZW4gUGVyY2hpbGQgYmVoYXZlcyBleGFjdGx5IGxpa2UgZGV4dGVyLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgcGVyY2hpbGQgYnVpbGRpbmcgYWdhaW4uIFtSeWFuIEJsb29tXQoKICAqKSBEb24ndCBkaXNhYmxlIHRocmVhZHMganVzdCBiZWNhdXNlIHdlIGFyZSB1c2luZyB0aGUgcHJlZm9yayBNUE0uCiAgICAgSWYgc29tZWJvZHkgd2FudHMgdG8gY29tcGlsZSB3aXRob3V0IHRocmVhZHMsIHRoZXkgbXVzdCBub3cgYWRkCiAgICAgLS1kaXNhYmxlLXRocmVhZHMgdG8gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuICBbUnlhbiBCbG9vbV0KCiAgKikgQmVnaW4gdG8gbW92ZSB0aGUgY2FsbHMgdG8gdXBkYXRlX2NoaWxkX3N0YXR1cyBpbnRvIGNvbW1vbiBjb2RlLCBzbwogICAgIHRoYXQgZWFjaCBpbmRpdmlkdWFsIE1QTSBkb2VzIG5vdCBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NvcmVib2FyZCBpdHNlbGYuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IG1vZF90bHMgdG8gY29tcGlsZSB1bmRlciBVbml4IGJveGVzIHdoZXJlIG9wZW5zc2wgaGFzIGJlZW4KICAgICBpbnN0YWxsZWQgdG8gdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLgogICAgIFtHb21leiBIZW5yaSA8bmV3LWh0dHBkQHNsaWIuZnI+XQoKICAqKSBDbGVhbnVwIHRoZSBtb2RfdGxzIGNvbmZpZ3VyZSBwcm9jZXNzLiAgVGhpcyBzaG91bGQgcmVtb3ZlIGFueSBuZWVkCiAgICAgdG8gaGFuZC1lZGl0IGFueSBmaWxlcy4gIFdlIHJlcXVpcmUgT3BlblNTTCAwLjkuNiBvciBsYXRlciwgYnV0IAogICAgIGNvbmZpZ3VyZSBkb2Vzbid0IGNoZWNrIHRoYXQgeWV0LiAgW1J5YW4gQmxvb21dCgogICopIEFkZCBhIHZlcnkgZWFybHkgcHJvdG90eXBlIG9mIFNTTCBzdXBwb3J0IChpbiBtb2RfdGxzLmMpLiBJdCBpcwogICAgIHZpdGFsIHRoYXQgeW91IHJlYWQgbW9kdWxlcy90bHMvUkVBRE1FIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGJ1aWxkCiAgICAgaXQuIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYSBwb3RlbnRpYWwgc2VnIGZhdWx0IG9uIGFsbCBwbGF0Zm9ybXMuICBEYXZpZCBSZWlkIGZpeGVkIHRoaXMKICAgICBvbiBCRU9TLCBidXQgdGhlIHByb2JsZW0gY291bGQgaGFwcGVuIGFueXdoZXJlLCBzbyB3ZSBkb24ndCB3YW50CiAgICAgdG8gI2lmZGVmIGl0LiBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5QHlhaG9vLmNvbT5dCiAKICAqKSBBZGQgbmV3IExvZ0Zvcm1hdCBkaXJlY3RpdmUsICVELCB0byBsb2cgdGltZSBpdCB0YWtlcyB0byBzZXJ2ZSBhCiAgICAgcmVxdWVzdCBpbiBtaWNyb3NlY29uZHMuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBDaGFuZ2UgQWRkSW5wdXRGaWx0ZXIgYW5kIEFkZE91dHB1dEZpbHRlciB0byBTZXRJbnB1dEZpbHRlciBhbmQKICAgICBTZXRPdXRwdXRGaWx0ZXIuICBUaGlzIGNvcnJlc3BvbmRzIG5pY2VseSB3aXRoIHRoZSBvdGhlciBTZXQgCiAgICAgZGlyZWN0aXZlcywgd2hpY2ggb3BlcmF0ZSBvbiBjb250YWluZXJzIHdoaWxlIHRoZSBBZGQqIGRpcmVjdGl2ZXMKICAgICB0ZW5kIHRvIHdvcmsgZGlyZWN0bHkgb24gZXh0ZW5zaW9ucy4gIFtSeWFuIEJsb29tXQoKICAqKSBDbGVhbnVwIHRoZSBoZWFkZXIgaGFuZGxpbmcgYSBiaXQuICBUaGlzIHVzZXMgdGhlIGFwcl9icmlnYWRlXyoKICAgICBmdW5jdGlvbnMgZm9yIHRoZSBidWZmZXJpbmcgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNvbXB1dGUKICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXJzIGJlZm9yZSB3ZSBhY3R1YWxseSBjcmVhdGUgdGhlIGhlYWRlcgogICAgIGJ1ZmZlci4gIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBmaWx0ZXJzIHRvIGJ1ZmZlciBkYXRhIHVzaW5nIHRoZSBhcF9mKiBmdW5jdGlvbnMuICBUaGVzZSBoYXZlCiAgICAgYmVjb21lIG1hY3JvcyB0aGF0IHJlc29sdmUgZGlyZWN0bHkgdG8gYXByX2JyaWdhZGVfKi4gIAogICAgIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIFVuaXggTVBNJ3MgdG8gZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGFnYWluLiAgSWYgd2UgYXJlIGdvaW5nCiAgICAgdG8gcmVnaXN0ZXIgYSBjbGVhbnVwIHdpdGggYXBfY2xlYW51cF9zY29yZWJvYXJkLCB0aGVuIHdlIGhhdmUgdG8KICAgICBraWxsIHRoZSBjbGVhbnVwIHdpdGggdGhlIHNhbWUgZnVuY3Rpb24sICBhbmQgdGhhdCBmdW5jdGlvbiBjYW4ndCBiZQogICAgIHN0YXRpYy4gIFtSeWFuIEJsb29tXQoKICAqKSBJbnN0YWxsIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMuICBXaXRob3V0IHRoZXNlLCBpdCB3YXMgbm90CiAgICAgcG9zc2libGUgdG8gY29tcGlsZSBzb21lIG1vZHVsZXMgb3V0c2lkZSBvZiB0aGUgc2VydmVyLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggdGhlIEFsaWFzTWF0Y2ggZGlyZWN0aXZlIGluIEFwYWNoZSAyLjAuICBXaGVuIHdlIGJyb3VnaHQgYSBwYXRjaAogICAgIGZvcndhcmQgZnJvbSAxLjMgdG8gMi4wLCB3ZSBtaXNzZWQgYSBzaW5nbGUgbGluZSwgd2hpY2ggYnJva2UgcmVnZXgKICAgICBhbGlhc2VzLiAgW1J5YW4gQmxvb21dCgogICopIFdlIGhhdmUgYSBwb29yIGFic3RyYWN0aW9uIGluIHRoZSBwcm90b2NvbC4gIFRoaXMgaXMgYSB0ZW1wb3JhcnkKICAgICBoYWNrIHRvIGZpeCB0aGUgYnVnLCBidXQgaXQgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIGZvciByZWFsLiAgSWYKICAgICB3ZSBmaW5kIGFuIGVycm9yIHdoaWxlIHNlbmRpbmcgb3V0IGEgY3VzdG9tIGVycm9yIHJlc3BvbnNlLCB3ZSBiYWNrCiAgICAgdXAgdG8gdGhlIGZpcnN0IG5vbi1PSyByZXF1ZXN0IGFuZCBzZW5kIHRoZSBkYXRhLiAgVGhlbiwgd2hlbiB3ZSBzZW5kCiAgICAgdGhlIEVPUyBmcm9tIGZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wsIHdlIGdvIHRvIHRoZSBsYXN0IHJlcXVlc3QsCiAgICAgdG8gZW5zdXJlIHRoYXQgd2UgYXJlbid0IHNlbmRpbmcgYW4gRU9TIHRvIGEgcmVxdWVzdCB0aGF0IGhhcyBhbHJlYWR5CiAgICAgcmVjZWl2ZWQgb25lLiAgQmVjYXVzZSB0aGUgZGF0YSBpcyBzZW50IG9uIGEgZGlmZmVyZW50IHJlcXVlc3QgdGhhbgogICAgIHRoZSBFT1MsIHRoZSBlcnJvciB0ZXh0IG5ldmVyIGdldHMgc2VudCBkb3duIHRoZSBmaWx0ZXIgc3RhY2suICBUaGlzCiAgICAgZml4ZXMgdGhlIHByb2JsZW0gYnkgZmluZGluZyB0aGUgbGFzdCByZXF1ZXN0LCBhbmQgc2VuZGluZyB0aGUgZGF0YQogICAgIHdpdGggdGhhdCByZXF1ZXN0LiAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgdGhlIHNlcnZlciBzdGF0dXMgcGFnZSBzaG93IHRoZSBjb3JyZWN0IHJlc3RhcnQgdGltZSwgYW5kCiAgICAgdGh1cyB0aGUgcHJvcGVyIHVwdGltZS4gW1J5YW4gQmxvb21dCgogICopIE1vdmUgdGhlIENHSSBjcmVhdGlvbiBsb2dpYyBmcm9tIG1vZF9pbmNsdWRlIHRvIG1vZF9jZ2koZCkuICBUaGlzCiAgICAgc2hvdWxkIHJlZHVjZSB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZSBjb2RlIHRoYXQgaXMgcmVxdWlyZWQgdG8KICAgICBjcmVhdGUgQ0dJIHByb2Nlc3Nlcy4KICAgICBbUGF1bCBKLiBSZWRlciA8cmVkZXJwakByYWxlaWdoLmlibS5jb20+XQoKICAqKSBhcF9uZXdfY29ubmVjdGlvbigpIGNsb3NlcyB0aGUgc29ja2V0IGFuZCByZXR1cm5zIE5VTEwgaWYgYSBzb2NrZXQKICAgICBjYWxsIGZhaWxzLiAgVXN1YWxseSB0aGlzIGlzIGR1ZSB0byBhIGNvbm5lY3Rpb24gd2hpY2ggaGFzIGJlZW4gCiAgICAgcmVzZXQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3ZlIHRoZSBBcGFjaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBvdXQgb2YgaHR0cGQuaCBhbmQgaW50byByZWxlYXNlLmguCiAgICAgVGhpcyBpcyBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIGZpcnN0IHRhZyB3aXRoIHRoZSBuZXcgdGFnIGFuZCByZWxlYXNlCiAgICAgc3lzdGVtLiAgW1J5YW4gQmxvb21dCgogICopIEJlZ2luIHJlc3RydWN0dXJpbmcgc2NvcmVib2FyZCBjb2RlIHRvIGVuYWJsZSBhZGRpbmcgYmFjayBpbgogICAgIHRoZSBhYmlsaXR5IHRvIHVzZSBJUEMgb3RoZXIgdGhhbiBzaGFyZWQgbWVtb3J5LgogICAgIEdldCBtb2Rfc3RhdHVzIHdvcmtpbmcgb24gV2luZG93cyBhZ2Fpbi4gW0JpbGwgU3RvZGRhcmRdCgogICopIE1ha2UgbW9kX3N0YXR1cyB3b3JrIHdpdGggMi4wLiAgVGhpcyB3aWxsIHdvcmsgZm9yIHByZWZvcmssCiAgICAgbXBtdF9wdGhyZWFkLCBhbmQgZGV4dGVyLiAgW1J5YW4gQmxvb21dCgogICopIENvcnJlY3QgYSB0eXBvIGluIGh0dHBkLmNvbmYuCiAgICAgW0t1bmloaXJvIFRhbmFrYSA8dGFuYWthQGFwYWNoZS5vci5qcD5dIFBSIzcxNTQgCgogICopIFJlYWxseSBmaXggbW9kX3Jld3JpdGUgbWFwIGxvb2t1cHMgdGhpcyB0aW1lLiBbVG9ueSBGaW5jaF0KCiAgKikgR2V0IHRoZSBjb3JyZWN0IElQIGFkZHJlc3MgaWYgU2VydmVyTmFtZSBpc24ndCBzZXQgYW5kIHdlIGNhbid0CiAgICAgZmluZCBhIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSBhdCBzdGFydHVwLgogICAgIFBSIzcxNzAgW0RhbmVrIER1dmFsbCA8ZGR1dmFsbEBlbmcuc3VuLmNvbT5dCgogICopIE1ha2UgbW9kX2NnaWQgd29yayB3aXRoIFN1RXhlYy4gIFtSeWFuIEJsb29tXQoKICAqKSBBZG9wdCBhcHIgdXNlci9ncm91cCBuYW1lIGZlYXR1cmVzIGZvciBtb2RfcmV3cml0ZS4gIEVsaW1pbmF0ZXMgc29tZQogICAgICdleHRyYScgc3RhdCdzIGZvciB1c2VyL2dyb3VwIHNpbmNlIHRoZXkgc2hvdWxkIG5ldmVyIG9jY3VyLCBhbmQgbm93CiAgICAgcmVzb2x2ZXMgdGhlIFNDUklQVF9VU0VSIGFuZCBTQ1JJUFRfR1JPVVAsIGluY2x1ZGluZyBvbiBXaW5OVCBOVEZTCiAgICAgdm9sdW1lcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkb3B0IGFwciBmZWF0dXJlcyB0byBzaW1wbGlmeSBtb2RfaW5jbHVkZXMuICBUaGlzIGNoYW5nZXMgdGhlCiAgICAgYmVoYXZpb3Igb2YgdGhlIFVTRVJfTkFNRSB2YXJpYWJsZSwgdW5rbm93biB1aWQncyBhcmUgbm93IHJlcG9ydGVkCiAgICAgYXMgVVNFUl9OQU1FPSI8dW5rbm93bj4iIHJhdGhlciB0aGFuIHRoZSBvbGQgdXNlciMwMDAgcmVzdWx0LgogICAgIFdpbk5UIG5vdyByZXNvbHZlcyBVU0VSX05BTUUgb24gTlRGUyB2b2x1bWVzLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRvcHQgYXByIGZlYXR1cmVzIGZvciBzaW1wbGlmaW5nIG1vZF91c2VyZGlyLCBhbmQgYWNjZXB0IHRoZSBuZXcKICAgICBXaW4zMi9PUzIgZXhjZXB0aW9ucyB3aXRob3V0IGhpY2N1cGluZy4gIFtXaWxsaWFtIFJvd2VdCgogICopIFJlcGxhY2UgY29uZmlndXJlIC0td2l0aC1vcHRpbSBvcHRpb24gYnkgdXNpbmcgYW5kIHNhdmluZyB0aGUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUFRJTSBpbnN0ZWFkLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBjb25maWd1cmUKICAgICBvcHRpb25zIGRvIG5vdCBzdXBwb3J0IG11bHRpcGxlIGZsYWdzIHNlcGFyYXRlZCBieSBzcGFjZXMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IHNvbWUgYnl0ZXJhbmdlIGhhbmRsaW5nLiAgSWYgd2UgZ2V0IGEgYnl0ZSByYW5nZSB0aGF0IGxvb2tzIGxpa2UKICAgICAiLTk5OTk5OSIgd2hlcmUgdGhhdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdlIHNob3VsZCByZXR1cm4gCiAgICAgYSBQQVJUSUFMIENPTlRFTlQgc3RhdHVzIGNvZGUsIGFuZCByZXR1cm4gdGhlIHdob2xlIGZpbGUgYXMgb25lIGJpZwogICAgIGJ5dGVyYW5nZS4gIFRoaXMgbWF0Y2hlcyB0aGUgMS4zIGhhbmRsaW5nIG5vdy4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIHRoZSBlcnJvciBidWNrZXQgYSByZWFsIG1ldGEtZGF0YSBidWNrZXQuICBUaGlzIG1lYW5zIHRoYXQgdGhlCiAgICAgYnVja2V0IGxlbmd0aCBpcyAwLCBhbmQgYSByZWFkIHJldHVybnMgTlVMTCBkYXRhLiAgSWYgb25lIG9mIHRoZXNlCiAgICAgYnVja2V0cyBpcyBwYXNzZWQgZG93biBhZnRlciB0aGUgaGVhZGVycyBhcmUgc2VudCwgdGhpcyBkYXRhIHdpbGwKICAgICBqdXN0IGJlIGlnbm9yZWQuICBbR3JlZyBTdGVpbl0KCiAgKikgVGhlIHByZWZvcmsgTVBNIHdhc24ndCBraWxsaW5nIGNoaWxkIHByb2Nlc3NlcyBjb3JyZWN0bHkgaWYgYSByZXN0YXJ0CiAgICAgc2lnbmFsIHdhcyByZWNlaXZlZCB3aGlsZSB0aGUgcHJvY2VzcyB3YXMgc2VydmluZyBhIHJlcXVlc3QuICBUaGUgY2hpbGQKICAgICBwcm9jZXNzIHdvdWxkIGJlY29tZSB0aGUgZXF1aXZhbGVudCBvZiBhIHNlY29uZCBwYXJlbnQgcHJvY2Vzcy4gIElmCiAgICAgd2UgYnJlYWsgb3V0IG9mIHRoZSBhY2NlcHQgbG9vcCwgdGhlbiB3ZSBuZWVkIHRvIGRvIGRpZSBhZnRlciBjbGVhbmluZwogICAgIHVwIGFmdGVyIG91cnNlbHZlcy4gIFtSeWFuIEJsb29tXQoKICAqKSBDaGFuZ2UgdGhlIFByZWZvcmsgTVBNIHRvIHVzZSBTSUdXSU5DSCBpbnN0ZWFkIG9mIFNJR1VTUjEgZm9yIGdyYWNlZnVsCiAgICAgcmVzdGFydHMuICBbUnlhbiBCbG9vbV0KCiAgKikgTW9kaWZ5IHRoZSBhcHJfc3RhdC9sc3RhdC9nZXRmaWxlaW5mbyBjYWxscyB3aXRoaW4gYXBhY2hlIHRvIHVzZQogICAgIHRoZSBtb3N0IG9wdGltYWwgQVBSX0ZJTkZPX3dhbnRlZCBiaXRzLiAgVGhpcyBzcGFyZXMgV2luMzIgZnJvbQogICAgIHBlcmZvcm1pbmcgdmVyeSBleHBlbnNpdmUgb3duZXIsIGdyb3VwIGFuZCBwZXJtaXNzaW9uIGxvb2t1cHMKICAgICBhbmQgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gZnVuY3Rpb24gdW50aWwgdGhlc2UgYXByX2ZpbmZvX3QgZmllbGRzCiAgICAgYXJlIGltcGxlbWVudGVkIHVuZGVyIFdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgU3VwcG9ydCBmb3IgdHlwZWRzYWZlIG9wdGlvbmFsIGZ1bmN0aW9ucyAtIHRoYXQgaXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5CiAgICAgb3B0aW9uYWwgbW9kdWxlcywgd2hpY2gsIHRoZXJlZm9yZSwgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCwgZGVwZW5kaW5nCiAgICAgb24gY29uZmlndXJhdGlvbi4gU2VlIHRoZSBleHBlcmltZW50YWwgbW9kdWxlcyBtb2Rfb3B0aW9uYWxfZm5fe2V4LGltfXBvcnQKICAgICBmb3Igc2FtcGxlIGNvZGUuIFtCZW4gTGF1cmllXQoKICAqKSBmaWx0ZXJzIGNhbiBub3cgcmVwb3J0IGFuIEhUVFAgZXJyb3IgdG8gdGhlIHNlcnZlci4gIFRoaXMgaXMgZG9uZQogICAgIGJ5IHNlbmRpbmcgYSBicmlnYWRlIHdoZXJlIHRoZSBmaXJzdCBidWNrZXQgaXMgYW4gZXJyb3JfYnVja2V0LgogICAgIFRoaXMgYnVja2V0IGlzIGEgc2ltcGxlIGJ1Y2tldCB0aGF0IHN0b3JlcyBhbiBIVFRQIGVycm9yIGFuZAogICAgIGEgc3RyaW5nLiAgQ3VycmVudGx5IHRoZSBzdHJpbmcgaXMgbm90IHVzZWQsIGJ1dCBpdCBtYXkgYmUgbmVlZGVkCiAgICAgdG8gb3V0cHV0IGFuIGVycm9yIGxvZy4gIFRoZSBodHRwX2hlYWRlcl9maWx0ZXIgd2lsbCBmaW5kIHRoaXMKICAgICBidWNrZXQsIGFuZCBvdXRwdXQgdGhlIGVycm9yIHRleHQsIGFuZCB0aGVuIHJldHVybiAKICAgICBBUF9GSUxURVJfRVJST1IsIHdoaWNoIGluZm9ybXMgdGhlIHNlcnZlciB0aGF0IHRoZSBlcnJvciB3ZWIgcGFnZQogICAgIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gIFtSeWFuIEJsb29tXQoKICAqKSBJZiB3ZSBnZXQgYW4gZXJyb3IsIHRoZW4gd2Ugc2hvdWxkIHJlbW92ZSBhbGwgZmlsdGVycyBleGNlcHQgZm9yCiAgICAgdGhvc2UgY3JpdGljYWwgdG8gc2VydmluZyBhIHdlYiBwYWdlLiAgVGhpcyBmaXhlcyBhIGJ1Zywgd2hlcmUKICAgICBlcnJvciBwYWdlcyB3ZXJlIGdvaW5nIHRocm91Z2ggdGhlIGJ5dGVyYW5nZSBmaWx0ZXIsIGV2ZW4gdGhvdWdoCiAgICAgdGhhdCBtYWRlIG5vIHNlbnNlLiAgW1J5YW4gQmxvb21dCgogICopIFJlbGF4IHRoZSBzeW50YXggY2hlY2tpbmcgb2YgSG9zdDogaGVhZGVycyBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgaUROUy4gUFIjNjYzNSBbVG9ueSBGaW5jaF0KCiAgKikgQ2xlYW51cCB0aGUgYnl0ZXJhbmdlIGZpbHRlciB0byB1c2UgdGhlIGFwcl9icmlnYWRlX3BhcnRpdGlvbgogICAgIGFuZCBhcHJfYnVja2V0X2NvcHkgZnVuY3Rpb25zLiAgVGhpcyByZW1vdmVzIGEgbG90IG9mIHZlcnkgbWVzc3kKICAgICBjb2RlLCBhbmQgaG9wZWZ1bGx5IG1ha2VzIHRoaXMgZmlsdGVyIG1vcmUgc3RhYmxlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBSZW1vdmUgQWRkTW9kdWxlIGFuZCBDbGVhck1vZHVsZUxpc3QgZGlyZWN0aXZlcy4gIEJvdGggb2YgdGhlc2UKICAgICBkaXJlY3RpdmVzIHdlcmUgdXNlZCB0byBlbnN1cmUgdGhhdCBtb2R1bGVzIGNvdWxkIGJlIGVuYWJsZWQKICAgICBpbiB0aGUgY29ycmVjdCBvcmRlci4gIFRoYXQgcmVxdWlyZW1lbnQgaXMgbm93IGdvbmUsIGJlY2F1c2UKICAgICB3ZSB1c2UgaG9va3MgdG8gZW5zdXJlIHRoYXQgbW9kdWxlcyBhcmUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFdoZW4gU3VFeGVjIGlzIHNwZWNpZmllZCwgd2UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YKICAgICB0YXJnZXRzIHRvIGJlIGJ1aWx0LiAgSWYgd2UgZG9uJ3QsIHRoZW4gYW55IGNoYW5nZXMgdG8gdGhlCiAgICAgY29uZmlndXJhdGlvbiB3b24ndCBhZmZlY3QgU3VFeGVjLCB1bmxlc3MgJ21ha2Ugc3VleGVjJyBpcwogICAgIHNwZWNpZmljYWxseSBydW4uICBbUnlhbiBCbG9vbV0KCiAgKikgQ2xlYW5lZCBvdXQgb3Blbl9maWxlIGZyb20gbW9kX2ZpbGVfY2FjaGUsIGFzIGFwciBub3cgYWNjZXB0cwogICAgIHRoZSBBUFJfWFRIUkVBRCBhcmd1bWVudCB0byBvcGVuIGEgZmlsZSBmb3IgY29uc3VtcHRpb24gYnkKICAgICBwYXJhbGxlbCB0aHJlYWRzIG9uIHdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29ycmVjdCBhIGJ1ZyBpbiBkZXRlcm1pbmluZyB3aGVuIHdlIGZvbGxvdyBzeW1saW5rcy4gIFRoZSBjb2RlCiAgICAgZXhwZWN0ZWQgYSBzdGF0IC0xIHJlc3VsdCwgbm90IGFuIGFwcl9zdGF0dXNfdCBwb3NpdGl2ZSBlcnJvci4KICAgICBBbHNvIGNoZWNrIGlmIHRoZSBBUFJfRklORk9fVVNFUiBmaWVsZHMgYXJlIHZhbGlkIGJlZm9yZSB3ZQogICAgIGZvbGxvdyB0aGUgbGluay4gIFtXaWxsaWFtIFJvd2VdCgogICopIE1vdmUgaW5pdGdyb3VwZ3MsIGFwX3VuYW1lMmlkIGFuZCBhcF9nbmFtZTJpZCBmcm9tIHV0aWwuYyB0bwogICAgIG1wbV9jb21tb24uYy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSB2YWxpZCBvbiBzb21lIHBsYXRmb3JtcywKICAgICBzbyB0aGV5IHNob3VsZCBub3QgYmUgaW4gdGhlIG1haW4tbGluZSBjb2RlLiBbUnlhbiBCbG9vbV0KCiAgKikgUmVtb3ZlIGFwX2NoZGlyX2ZpbGUoKS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZC1zYWZlLAogICAgIGFuZCBub2JvZHkgaXMgY3VycmVudGx5IHVzaW5nIGl0LiAgW1J5YW4gQmxvb21dCgogICopIERvIG5vdCB0cnkgdG8gcnVuIG1ha2UgZGVwZW5kIGlmIHRoZXJlIGFyZSBubyAuYyBmaWxlcyBpbiB0aGUKICAgICBjdXJyZW50IGRpcmVjdG9yeSwgZG9pbmcgc28gbWFrZXMgYG1ha2UgZGVwZW5kYCBmYWlsLgogICAgIFtSeWFuIEJsb29tXQoKICAgKikgVXBkYXRlIGhpZ2hwZXJmb3JtYW5jZS5jb25mIHRvIHdvcmsgd2l0aCBlaXRoZXIgcHJlZm9yayBvcgogICAgICBwdGhyZWFkcyBtcG1zLiAgW0dyZWcgQW1lc10gCgogICopIFN0b3AgY2hlY2tpbmcgdG8gc2VlIGlmIHRoaXMgaXMgYSBwaXBlbGluZWQgcmVxdWVzdCBpZiB3ZSBrbm93CiAgICAgZm9yIGEgZmFjdCB0aGF0IGl0IGlzbid0LiAgQmFzaWNhbGx5LCBpZiByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPT0gMC4KICAgICBUaGlzIGtlZXBzIHVzIGZyb20gbWFraW5nIGFuIGV4dHJhIHJlYWQgY2FsbCB3aGVuIHNlcnZpbmcgYSAxLjAKICAgICByZXF1ZXN0LiAgW1J5YW4gQmxvb20gYW5kIEdyZWcgU3RlaW5dCgogICopIEZpeCB0aGUgaGFuZGxpbmcgb2YgdmFyaWFibGUgZXhwYW5zaW9uIGxvb2stYWhlYWQgaW4gbW9kX3Jld3JpdGUsCiAgICAgaS5lLiBzeW50YXggbGlrZSAle0xBLVU6UkVNT1RFX1VTRVJ9LCBhbmQgYWxzbyBmaXggdGhlIHBhcnNpbmcgb2YKICAgICBtb3JlIGNvbXBsaWNhdGVkIG5lc3RlZCBSZXdyaXRlTWFwIGxvb2t1cHMuIFBSIzcwODcgW1RvbnkgRmluY2hdCgogICopIEZpeCB0aGUgUkZDIG51bWJlciBtZW50aW9uZWQgd2hlbiBjb21wbGFpbmluZyBhYm91dCBhIG1pc3NpbmcKICAgICBIb3N0OiBoZWFkZXIuIFBSIzcwNzkgW0FsZXhleSBUb3B0eWdpbiA8YWxleGV5dEB3YW0udW1kLmVkdT5dCgogICopIEZpeCBhbiBlbmRsZXNzIGxvb3AgaW4gYWIgd2hpY2ggb2NjdXJyZWQgd2hlbiBhYiB3YXMgcG9zdGluZwogICAgIGFuZCB0aGUgc2VydmVyIGRyb3BwZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHNlZ2ZhdWx0IHdoaWxlIGhhbmRsaW5nIHJlcXVlc3QgYm9kaWVzIGluIGFwX2h0dHBfZmlsdGVyKCkuICAKICAgICBUaGlzIHByb2JsZW0gaGFzIGJlZW4gc2VlbiB3aXRoIG1vZF9kYXYgdXNhZ2UgYXMgd2VsbCBhcyB3aXRoIAogICAgIHJlcXVlc3RzIHdoZXJlIHRoZSBib2R5IHdhcyBqdXN0IGJlaW5nIGRpc2NhcmRlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIFNvbWUgYWRqdXN0bWVudCBvbiB0aGUgaGFuZGxpbmcgYW5kIGF1dG9tYXRpYyBzZXR0aW5nICh2aWEKICAgICBoaW50cy5tNCkgb2YgdmFyaW91cyBjb21waWxhdGlvbiBmbGFncyAoZWc6IENGTEFHUykuIEFsc28sCiAgICAgYWRkIHRoZSBjYXBhYmlsaXR5IHRvIHNwZWNpZnkgZmxhZ3MgKE5PVEVTVF9DRkxBR1MgYW5kCiAgICAgTk9URVNUX0xERkxBR1MpIHdoaWNoIGFyZSB1c2VkIHRvIGNvbXBpbGUgQXBhY2hlLCBidXQKICAgICBub3QgdXNlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVXNlZnVsIGZvcgogICAgIGZsYWdzIGxpa2UgIi1XZXJyb3IiLiBbSmltIEphZ2llbHNraV0KCiAgKikgU3RvcCB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZm9yY2UgZGVidWcgbW9kZSBvcgogICAgIG5vIGRldGFjaC4gIFdlIG5vdyB1c2UgdGhlIC1EIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0byAKICAgICBzcGVjaWZ5IHRoZSBjb3JyZWN0IG1vZGUuICAtRE9ORV9QUk9DRVNTIGFuZCAtRE5PX0RFVEFDSC4KICAgICBbR3JlZyBTdGVpbiwgUnlhbiBCbG9vbV0KCiAgKikgQ2hhbmdlIGhhbmRsZXJzIHRvIHVzZSBob29rcy4gW0JlbiBMYXVyaWVdCgogICopIFN0b3AgcmV0dXJuaW5nIGNvcGllcyBvZiBmaWxlbmFtZXMgZnJvbSBib3RoIGFwcl9maWxlX3QgYW5kCiAgICAgYXByX2Rpcl90LiAgV2UgcHN0cmR1cCB0aGUgZmlsZW5hbWVzIHRoYXQgd2Ugc3RvcmUgaW4gdGhlCiAgICAgYWN0dWFsIHN0cnVjdHVyZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8gcHN0cmR1cCB0aGUgc3RyaW5ncyBhZ2Fpbi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgbW9kX2NnaTogRml4IHNvbWUgcHJvYmxlbXMgd2hlcmUgdGhlIHdyb25nIGVycm9yIHZhbHVlIHdhcyBiZWluZwogICAgIHRyYWNlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEVCQ0RJQzogRml4IHNvbWUgbWlzc2luZyBBU0NJSSBjb252ZXJzaW9uIG9uIHNvbWUgcHJvdG9jb2wgZGF0YS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgZ2VuZXJpYyBob29rcy4gW0JlbiBMYXVyaWVdCgogICopIFVzZSBhIHJlYWwgcG9vbCB0byBkdXAgdGhlIGVycm9yIGxvZyBkZXNjcmlwdG9yLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIHNlZ2ZhdWx0IGNhdXNlZCBieSBtb2RfZXh0X2ZpbHRlciB3aGVuIHRoZSBleHRlcm5hbCBmaWx0ZXIgCiAgICAgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdC4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IGFuIG91dHB1dCB0cnVuY2F0aW9uIGVycm9yIHdoZW4gb24gYW4gSFRUUCA+PSAxLjAgcmVxdWVzdCBhbgogICAgIG9iamVjdCBvZiBzaXplIGJldHdlZW4gREVGQVVMVF9CVUNLRVRfU0laRSBhbmQgQVBfTUlOX0JZVEVTX1RPX1dSSVRFIAogICAgIHdhcyBzZXJ2ZWQgdGhyb3VnaCBtb2RfY2hhcnNldF9saXRlIChvciBhbnl0aGluZyBlbHNlIHRoYXQgd291bGQKICAgICBjcmVhdGUgYSB0cmFuc2llbnQgYnVja2V0IGluIHRoaXMgc2l6ZSByYW5nZSkuICBhcF9idWNrZXRfbWFrZV9oZWFwKCkKICAgICBzaWxlbnRseSBmYWlsZWQgKGZpeGVkKSwgdHJhbnNpZW50X3NldGFzaWRlKCkgZGlzY292ZXJlZCBpdCwgYnV0CiAgICAgYXBfc2F2ZV9icmlnYWRlKCkgaWdub3JlZCBpdCAoZml4ZWQpLiBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIElnbm9yZSBcclxuIG9yIFxuIHdoZW4gdXNpbmcgUEVFSyBtb2RlIGZvciBpbnB1dCBmaWx0ZXJzLiAgVGhlIHByb2JsZW0KICAgICBpcyB0aGF0IHNvbWUgYnJvd3NlcnMgc2VuZCBleHRyYSBsaW5lcyBhdCB0aGUgZW5kIG9mIFBPU1QgcmVxdWVzdHMsIGFuZAogICAgIHdlIGRvbid0IHdhbnQgdG8gZGVsYXkgc2VuZGluZyBkYXRhIGJhY2sgdG8gdGhlIHVzZXIganVzdCBiZWNhdXNlIHRoZQogICAgIGJyb3dzZXIgaXNuJ3Qgd2VsbCBiZWhhdmVkLiBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IFN1RVhFQyB3b3JraW5nIGFnYWluLiAgV2UgY2FuJ3Qgc2VuZCBhYnNvbHV0ZSBwYXRocyB0byBzdUV4ZWMKICAgICBiZWNhdXNlIGl0IHJlZnVzZXMgdG8gZXhlY3V0ZSB0aG9zZSBwcm9ncmFtcy4gIFN1RVhFQyBhbHNvIHdhc24ndAogICAgIGFsd2F5cyByZWNvZ25pemluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMgbWFkZSB1c2luZyB0aGUgYXV0b2NvbmYKICAgICBzZXR1cC4gIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyB0aGUgYnVpbGRjb25mIHByb2Nlc3MgdG8gZmluZCB0aGUgY29uZmlnLm00IGZpbGVzIGluIHRoZSBjb3JyZWN0CiAgICAgb3JkZXIuICBCYXNpY2FsbHksIHdlIGNhbiBub3cgbmFtZSBjb25maWcubTQgZmlsZXMgYXMgY29uZmlnXGRcZC5tNCwKICAgICBhbmQgd2Ugd2lsbCBzb3J0IHRoZW0gY29ycmVjdGx5IHdoZW4gaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgYnVpbGQKICAgICBwcm9jZXNzLiAgW1J5YW4gQmxvb21dCgogICopIEdldCBtb2RfY2dpZCB0byB1c2UgYXByIGNhbGxzIGZvciBjcmVhdGluZyB0aGUgYWN0dWFsIENHSSBwcm9jZXNzLgogICAgIFRoaXMgYWxzbyBhbGxvd3MgbW9kX2NnaWQgdG8gdXNlIGFwX29zX2NyZWF0ZV9wcml2aWxlZGdlZF9wcm9jZXNzLAogICAgIHRodXMgYWxsb3dpbmcgZm9yIFN1RXhlYyBleGVjdXRpb24gZnJvbSBtb2RfY2dpZC4gIEN1cnJlbnRseSwgd2UgZG8KICAgICBub3Qgc3VwcG9ydCBldmVyeXRoaW5nIHRoYXQgc3RhbmRhcmQgU3VFeGVjIHN1cHBvcnRzLCBidXQgYXQgbGVhc3QKICAgICBpdCB3b3JrcyBtaW5pbWFsbHkgbm93LiBbUnlhbiBCbG9vbV0KCiAgKikgQWxsb3cgU3VFeGVjIHRvIGJlIGNvbmZpZ3VyZWQgZnJvbSB0aGUgLi9jb25maWd1cmUgY29tbWFuZCBsaW5lLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBVcGRhdGUgc29tZSBvZiB0aGUgZG9jcyBpbiBSRUFETUUgYW5kIElOU1RBTEwgdG8gcmVmbGVjdCBzb21lIG9mCiAgICAgdGhlIGNoYW5nZXMgaW4gQXBhY2hlIDIuMCBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5QHlhaG9vLmNvbT5dCgogICopIElmIHdlIGdldCBFQUdBSU4gcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byBhcHJfc2VuZGZpbGUsIHRoZW4gd2UKICAgICBuZWVkIHRvIGNhbGwgc2VuZGZpbGUgYWdhaW4uICBUaGlzIGdldHMgdXMgc2VydmluZyBsYXJnZSBmaWxlcwogICAgIHN1Y2ggYXMgYXBhY2hlXzIuMGE5LnRhci5neiBvbiBGcmVlQlNEIGFnYWluLiBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IHRoZSBzdXBwb3J0IHByb2dyYW1zIGJ1aWxkaW5nIGNsZWFubHkgYWdhaW4uCiAgICAgW0NsaWZmIFdvb2xsZXkgPGNsaWZmd29vbGxleUB5YWhvby5jb20+XQoKICAqKSBUaGUgQXBhY2hlL1dpbjMyIEFwYWNoZS5leGUgYW5kIGRsbCdzIG5vdyBsaXZlIGluIGJpbi4gIFRoZSAKICAgICBjdXJyZW50IGRpcmVjdG9yeSBsb2dpYyBub3cgYmFja3MgdXAgb3ZlciBiaW4vIHRvIGRldGVybWluZSB0aGUKICAgICBzZXJ2ZXIgcm9vdCBmcm9tIHRoZSBBcGFjaGUuZXhlIHBhdGguCgogICopIEFwYWNoZS9XaW4zMiBub3cgZm9sbG93cyB0aGUgc3RhbmRhcmQgY29udmVudGlvbnMgb2YgbW9kX2Zvby5zbwogICAgIGxvYWRhYmxlIG1vZHVsZXMsIGR5bmFtaWMgbGlicyBhcmUgYWxsIG5hbWVkIGxpYmZvby5kbGwsIGFuZCB0aGUKICAgICBtYWtlZmlsZS53aW4gcG9wdWxhdGVzIHRoZSBpbmNsdWRlLCBsaWIgYW5kIGxpYmV4ZWMgZGlyZWN0b3JpZXMuCgogICopIEFwYWNoZSBpcyBub3cgSVB2Ni1jYXBhYmxlLiAgT24gc3lzdGVtcyB3aGVyZSBBUFIgc3VwcG9ydHMgSVB2NiwKICAgICBBcGFjaGUgZ2V0cyBJUHY2IGxpc3RlbmluZyBzb2NrZXRzIGJ5IGRlZmF1bHQuICBBZGRpdGlvbmFsbHksIHRoZQogICAgIExpc3RlbiwgTmFtZVZpcnR1YWxIb3N0LCBhbmQgPFZpcnR1YWxIb3N0PiBkaXJlY3RpdmVzIHN1cHBvcnQgSVB2NgogICAgIG51bWVyaWMgYWRkcmVzcyBzdHJpbmdzIChlLmcuLCAiTGlzdGVuIFtmZTgwOjoxXTo4MDgwIikuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTW9kaWZ5IHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBsYXlvdXQuICBNb2R1bGVzIGFyZSBub3cgaW5zdGFsbGVkIGluCiAgICAgbW9kdWxlcy8uICBTaGFyZWQgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gbGlicmFyaWVzLywgYnV0CiAgICAgd2UgZG9uJ3QgaGF2ZSBhbnkgb2YgdGhvc2Ugb24gVW5peCB5ZXQuICBBbGwgaW5zdGFsbCBkaXJlY3RvcmllcwogICAgIGFyZSBtb2RpZnlhYmxlIGF0IGNvbmZpZ3VyZSB0aW1lLiBbUnlhbiBCbG9vbV0KCiAgKikgSW5zdGFsbCBhbGwgaGVhZGVyIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBvbiBVbml4LiBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IHRoZSBmdW5jdGlvbnMgaW4gc2VydmVyL2xpbmtlZCBpbnRvIHRoZSBzZXJ2ZXIsIHJlZ2FyZGxlc3Mgb2YKICAgICB3aGljaCBtb2R1bGVzIGxpbmtlZCBpbnRvIHRoZSBzZXJ2ZXIuICBUaGlzIHVzZXMgdGhlIHNhbWUgaGFjayAKICAgICBmb3IgQXBhY2hlIHRoYXQgd2UgdXNlIGZvciBBUFIgYW5kIGFwci11dGlsIHRvIGVuc3VyZSBhbGwgb2YgdGhlCiAgICAgbmVjZXNzYXJ5IGZ1bmN0aW9ucyBhcmUgbGlua2VkLiAgQXMgYSBwYXJ0IG9mIHRoaXNlLCB0aGUgQ0hBUlNFVF9FQkNESUMKICAgICB3YXMgcmVuYW1lZCB0byBBUF9DSEFSU0VUX0VCQ0RJQyBmb3IgbmFtZXNwYWNlIHByb3RlY3Rpb24sIGFuZCB0byBtYWtlCiAgICAgdGhlIHNjcmlwdHMgYSBiaXQgZWFzaWVyLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBSZXdvcmsgdGhlIFJGQzE0MTMgaGFuZGxpbmcgdG8gbWFrZSBpdCB0aHJlYWQtc2FmZSwgdXNlIGEgdGltZW91dAogICAgIG9uIHRoZSBxdWVyeSwgYW5kIHJlbW92ZSBJUHY0IGRlcGVuZGVuY2llcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEdldCBhbGwgb2YgdGhlIGF1dGggbW9kdWxlcyB0byB0aGUgcG9pbnQgdGhhdCB0aGV5IHdpbGwgaW5zdGFsbCBhbmQKICAgICBiZSBsb2FkYWJsZSBpbnRvIHRoZSBzZXJ2ZXIuICBPdXIgbmV3IGJ1aWxkL2luc3RhbGwgbWVjaGFuaXNtIGV4cGVjdHMKICAgICB0aGF0IGFsbCBtb2R1bGVzIHdpbGwgaGF2ZSBhIGNvbW1vbiBuYW1lIGZvcm1hdC4gIFRoZSBhdXRoIG1vZHVsZXMgCiAgICAgZGlkbid0IHVzZSB0aGF0IGZvcm1hdCwgc28gd2UgZGlkbid0IGluc3RhbGwgdGhlbSBwcm9wZXJseS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQVBJIHJvdXRpbmVzIGFwX3BnZXRob3N0YnluYW1lKCkgYW5kIGFwX3BkdXBob3N0ZW50KCkgYXJlIG5vIGxvbmdlcgogICAgIGF2YWlsYWJsZS4gIFVzZSBhcHJfZ2V0YWRkcmluZm8oKSBpbnN0ZWFkLiAgW0plZmYgVHJhd2lja10KCiAgKikgR2V0ICJOYW1lVmlydHVhbEhvc3QgKiIgd29ya2luZyBpbiAyLjAuICBbUnlhbiBCbG9vbV0KCiAgKikgUmV0dXJuIEhUVFBfUkFOR0VfTk9UX1NBVElTRklBQkxFIGlmIHRoZSBldmVyeSByYW5nZSByZXF1ZXN0ZWQgc3RhcnRzCiAgICAgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgcmVzcG9uc2UuIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgYnl0ZXJhbmdlIHJlcXVlc3RzIHdvcmtpbmcgd2l0aCByZXNwb25zZXMgdGhhdCBkbyBub3QgaGF2ZSBhCiAgICAgY29udGVudC1sZW5ndGguICBCZWNhdXNlIG9mIHRoZSB3YXkgYnl0ZXJhbmdlIHJlcXVlc3RzIHdvcmssIHdlIGhhdmUgdG8KICAgICBoYXZlIGFsbCBvZiB0aGUgZGF0YSBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IGRvIHRoZSBieXRlcmFuZ2UsIHNvIHdlCiAgICAgY2FuIGNvbXB1dGUgdGhlIGNvbnRlbnQtbGVuZ3RoIGluIHRoZSBieXRlcmFuZ2UgZmlsdGVyLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgZXhlIENHSSdzIHdvcmtpbmcgYWdhaW4gb24gV2luZG93cy4KICAgICBbQWxsYW4gRWR3YXJkc10KCiAgKikgR2V0IG1vZF9jZ2lkIGFuZCBtb2RfcmV3cml0ZSB0byB3b3JrIGFzIERTT3MgYnkgY2hhbmdpbmcgdGhlIHdheQogICAgIHRoZXkga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB0aGVpciAgcG9zdCBjb25maWcgaG9vayBoYXMgYmVlbgogICAgIGNhbGxlZCBiZWZvcmUuICBJbnN0ZWFkIG9mIGEgc3RhdGljIHZhcmlhYmxlICh3aGljaCBpcyByZXBsYWNlZCB3aGVuIAogICAgIHRoZSBEU08gaXMgbG9hZGVkIGEgc2Vjb25kIHRpbWUpLCB1c2UgdXNlcmRhdGEgaW4gdGhlIHByb2Nlc3MgcG9vbC4KICAgICBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhOQoKICAqKSBXaW4zMiBub3cgcmVxdWlyZXMgcGVybCB0byBjb21wbGV0ZSB0aGUgZmluYWwgaW5zdGFsbCBzdGVwIGZvciB1c2VycwogICAgIHRvIGJ1aWxkICsgaW5zdGFsbCBvbiBXaW4zMi4gIE1ha2VmaWxlLndpbiBub3cgcmV3cml0ZXMgQEBTZXJ2ZXJSb290QAogICAgIGFuZCBpbnN0YWxscyB0aGUgY29uZiwgaHRkb2NzIGFuZCBodGRvY3MvbWFudWFsIGRpcmVjdG9yaWVzLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgbW9kX2luY2x1ZGUgdXNlIGEgaGFzaCB0YWJsZSB0byBhc3NvY2lhdGUgZGlyZWN0aXZlIHRhZ3Mgd2l0aAogICAgIGZ1bmN0aW9ucy4gIFRoaXMgYWxsb3dzIG1vZHVsZXMgdG8gaW1wbGVtZW50IHRoZWlyIG93biBTU0kgdGFncyBlYXNpbHkuCiAgICAgVGhlIGlkZWEgaXMgc2ltcGxlIGVub3VnaCwgYSBtb2R1bGUgY2FuIGluc2VydCBpdCdzIG93biB0YWcgYW5kIGZ1bmN0aW9uCiAgICAgY29tYmluYXRpb24gaW50byBhIGhhc2ggdGFibGUgcHJvdmlkZWQgYnkgbW9kX2luY2x1ZGUuICBXaGlsZSBtb2RfaW5jbHVkZQogICAgIHBhcnNlcyBhbiBTU0kgZmlsZSwgd2hlbiBpdCBlbmNvdW50ZXJzIGEgdGFnIGluIHRoZSBmaWxlLCBpdCBkb2VzIGEKICAgICBoYXNoIGxvb2t1cCB0byBmaW5kIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhhdCB0YWcsIGFuZCBwYXNzZXMKICAgICBhbGwgb2YgdGhlIHJlbGV2YW50IGRhdGEgdG8gdGhlIGZ1bmN0aW9uLiAgVGhhdCBmdW5jdGlvbiBpcyB0aGVuCiAgICAgcmVzcG9uc2libGUgZm9yIHByb2Nlc3NpbmcgdGhlIHRhZyBhbmQgaGFuZGluZyB0aGUgcmVtYWluaW5nIGRhdGEgYmFjawogICAgIHRvIG1vZF9pbmNsdWRlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgICAgW1BhdWwgSi4gUmVkZXIgPHJlZGVycGpAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgR2V0IHJpZCBvZiBhcF9uZXdfYXByX2Nvbm5lY3Rpb24oKS4gIGFwX25ld19jb25uZWN0aW9uKCkgbm93IGhhcyAKICAgICBmZXdlciBwYXJhbWV0ZXJzOiB0aGUgbG9jYWwgYW5kIHJlbW90ZSBzb2NrZXQgYWRkcmVzc2VzIHdlcmUgcmVtb3ZlZAogICAgIGZyb20gdGhlIHBhcmFtZXRlciBsaXN0IGJlY2F1c2UgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQogICAgIHZpYSB0aGUgQVBSIHNvY2tldC4gIFtKZWZmIFRyYXdpY2tdCgogICopIERpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHJlb3JnYW5pemVkIHRvIHJlZmxlY3QgYQogICAgIG5vcm1hbCBzb3VyY2UgZGlzdHJpYnV0aW9uIHdpdGggZXh0ZXJuYWwgaW5zdGFsbCB0YXJnZXRzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBNUE1zIHRoYXQgbmVlZCBtdWx0aXBsZSBzZWdtZW50cyBvZiBzaGFyZWQgbWVtb3J5IG5vdyBjcmVhdGUKICAgICB0d28gYXByX3NobWVtX3QgdmFyaWFibGVzLCBvbmUgZm9yIGVhY2ggc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgogICAgIHRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkCiAgICAgZm9yIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbnMgb25jZSB3ZSB0cnkgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIG9uZQogICAgIHZhcmlhYmxlLiAgVGhlIE1NIGNvZGUgYXV0b21hdGljYWxseSBhbGlnbnMgdGhlIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbnMsCiAgICAgc28gd2UgZW5kIHVwIG5lZWRpbmcgdG8gcGFkIHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSB3ZSB3YW50IGJhc2VkCiAgICAgb24gaG93IG1hbnkgdmFyaWFibGVzIHdpbGwgYmUgYWxsb2NhdGVkIG91dCBvZiB0aGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50LgogICAgIEl0IGlzIGp1c3QgZWFzaWVyIHRvIGNyZWF0ZSBhIHNlY29uZCBhcHJfc2htZW1fdCB2YXJpYWJsZSwgYW5kIHR3bwogICAgIHNobWVtIG1lbW9yeSBibG9ja3MuCiAgICAgW1J5YW4gQmxvb21dCgogICopIENsZWFudXAgdGhlIGV4cG9ydCBsaXN0IGEgYml0LiAgVGhpcyBjcmVhdGVzIGEgc2luZ2xlIHVuaWZpZWQgbGlzdCBvZgogICAgIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBBUFIuICBUaGUgZXhwb3J0IGxpc3QgaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyZQogICAgIHRpbWUsIGFuZCB0aGF0IGxpc3QgaXMgdGhlbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBleHBvcnRzLmMgZmlsZS4KICAgICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlIGV4cG9ydCBsaXN0IGlzIGdlbmVyYXRlZCwgd2Ugb25seSBleHBvcnQgdGhvc2UKICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgdmFsaWQgb24gdGhlIHBsYXRmb3JtIHdlIGFyZSBidWlsZGluZyBvbi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRW5hYmxlIGxvZ2dpbmcgdGhlIGNvb2tpZSB3aXRoIG1vZF9sb2dfY29uZmlnCiAgICAgW1NhbmRlciB2YW4gWm9lc3QgPHNhbmRlckBjb3ZhbGVudC5uZXQ+XQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiBtb2RfaW5mbyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGRlZCBsaWIvYXB1dGlsLyBhcyBhIHBsYWNlaG9sZGVyIGZvciB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90CiAgICAgc3BlY2lmaWMgdG8gdGhlIEFwYWNoZSBIVFRQIFNlcnZlciAoYnV0IGRvIG5vdCBtYWtlIHNlbnNlIHdpdGggQVBSKS4KICAgICBUaGUgZmlyc3QgdXRpbGl0eSBpcyAiYXB1X2RibSI6IGEgc2V0IG9mIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggREJNCiAgICAgZmlsZXMuIFRoaXMgZmlyc3QgdmVyc2lvbiBjYW4gYmUgY29tcGlsZWQgZm9yIFNEQk0gb3IgR0RCTSBkYXRhYmFzZXMuCiAgICAgW0dyZWcgU3RlaW5dCgogICopIENvbXBsZXRlIHJlLXdyaXRlIG9mIG1vZF9pbmNsdWRlLiAgVGhpcyBtYWtlcyBtb2RfaW5jbHVkZSBhIGZpbHRlciB0aGF0CiAgICAgdXNlcyBidWNrZXRzIGRpcmVjdGx5LiAgVGhpcyBoYXMgbm93IHNlcnZlZCB0aGUgRkFRIGNvcnJlY3RseS4KICAgICBbUGF1bCBSZWRlciA8cmVkZXJwakByYWxlaWdoLmlibS5jb20+XQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHNwZWNpZnkgdGhlIGZpcnN0IGZpbHRlciBpbiBhIHN1Yl9yZXF1ZXN0IHdoZW4KICAgICBtYWtpbmcgdGhlIHN1Yl9yZXF1ZXN0LiAgVGhpcyBrZWVwcyBtb2R1bGVzIGZyb20gaGF2aW5nIHRvIGNoYW5nZSB0aGUKICAgICBvdXRwdXRfZmlsdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIHRoZSBzdWItcmVxdWVzdCwgYW5kIHRoZXJlZm9yZQogICAgIHNraXAgdGhlIHN1Yl9yZXFfb3V0cHV0X2ZpbHRlci4gIFtSeWFuIEJsb29tXQoKICAqKSBVcGRhdGUgYWIgdG8gYWNjZXB0IFVSTHMgd2l0aCBJUHY2IGxpdGVyYWwgYWRkcmVzcyBzdHJpbmdzIChpbiB0aGUKICAgICBmb3JtYXQgZGVzY3JpYmVkIGluIFJGQyAyNzMyKSwgYW5kIHRvIGJ1aWxkIEhvc3QgaGVhZGVyIGZpZWxkcyBpbgogICAgIHRoZSBzYW1lIGZvcm1hdC4gIFRoaXMgYWxsb3dzIElQdjYgbGl0ZXJhbCBhZGRyZXNzIHN0cmluZ3MgdG8gYmUKICAgICB1c2VkIHdpdGggYWIuICBUaGlzIHN1cHBvcnQgaGFzIGJlZW4gdGVzdGVkIGFnYWluc3QgQXBhY2hlIDEuMyB3aXRoIAogICAgIHRoZSBLQU1FIHBhdGNoLCBidXQgQXBhY2hlIDIuMCBkb2VzIG5vdCB5ZXQgd29yayB3aXRoIHRoaXMgZm9ybWF0CiAgICAgb2YgdGhlIEhvc3QgaGVhZGVyIGZpZWxkLiAgW0plZmYgVHJhd2lja10KCiAgKikgQWNjb21vZGF0ZSBhbiBvdXQtb2Ytc3BhY2UgY29uZGl0aW9uIGluIHRoZSBwaXBlZCBsb2dzIGFuZCB0aGUKICAgICByb3RhdGVsb2dzLmMgY29kZSwgYW5kIG5vIGxvbmdlciBjaHVybiBsb2cgcHJvY2Vzc2VzIGZvciB0aGlzCiAgICAgY29uZGl0aW9uLiAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgcGFydGlhbCB3cml0ZXMgd2l0aCBhcHJfc2VuZGZpbGUoKSB0byBjb3JlX291dHB1dF9maWx0ZXIuCiAgICAgW0dyZWcgQW1lc10gCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE4CgogICopIEFkZCBhIGRpcmVjdGl2ZSB0byBtb2RfbWltZSBzbyB0aGF0IGZpbHRlcnMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aAogICAgIGEgZ2l2ZW4gbWltZS10eXBlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgbXVsdGktdmlld3Mgd29ya2luZyBhZ2Fpbi4gIFdlIHdlcmUgc2V0dGluZyB0aGUgcGF0aF9pbmZvCiAgICAgZmllbGQgaW5jb3JyZWN0bHkgaWYgd2UgY291bGRuJ3QgZmluZCB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCAzMDQgcHJvY2Vzc2luZy4gIFRoZSBjb3JlIHNob3VsZCBuZXZlciB0cnkgdG8gc2VuZCB0aGUgaGVhZGVycwogICAgIGRvd24gdGhlIGZpbHRlciBzdGFjay4gIEFsd2F5cywganVzdCBzZXR1cCB0aGUgdGFibGUgaW4gdGhlIHJlcXVlc3QKICAgICByZWNvcmQsIGFuZCBsZXQgdGhlIGhlYWRlciBmaWx0ZXIgY29udmVydCBpdCB0byBkYXRhIHRoYXQgaXMgcmVhZHkKICAgICBmb3IgdGhlIG5ldHdvcmsuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1vcmUgZml4ZXMgZm9yIHRoZSBwcm94eS4gIFRoZXJlIGFyZSBzdGlsbCBidWdzIGluIHRoZSBwcm94eSBjb2RlLAogICAgIGJ1dCB0aGlzIGhhcyBub3cgcHJveGllZCB3d3cueWFob28uY29tIGFuZCB3d3cubnRybmV0Lm5ldCAobXkgSVNQKQogICAgIHN1Y2Nlc3NmdWxseS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHBhcmFtcyBmb3IgYXByX2dldGFkZHJpbmZvKCkgY2FsbCBpbiBjb25uZWN0IHByb3h5IGhhbmRsZXIuCiAgICAgW0NodWNrIE11cmNrb10KCiAgKikgQVBSOiBBZGQgbmV3IGFwcl9nZXRvcHRfbG9uZyBmdW5jdGlvbiB0byBoYW5kbGUgbG9uZyBvcHRpb25zLgogICAgIFtCLiBXLiBGaXR6cGF0cmljayA8Zml0ekByZWQtYmVhbi5jb20+XQoKICAqKSBBUFI6IENoYW5nZSBhcHJfY29ubmVjdCgpIHRvIHRha2UgYXByX3NvY2thZGRyX3QgaW5zdGVhZCBvZiBob3N0bmFtZS4KICAgICBBZGQgZ2VuZXJpYyBhcHJfY3JlYXRlX3NvY2tldCgpLiAgQWRkIGFwcl9nZXRhZGRyaW5mbygpIGZvciBkb2luZwogICAgIGhvc3RuYW1lIHJlc29sdXRpb24vYWRkcmVzcyBzdHJpbmcgcGFyc2luZyBhbmQgYnVpbGRpbmcKICAgICBhcHJfc29ja2FkZHJfdC4gIEFkZCBhcHJfZ2V0X3NvY2thZGRyKCkgZm9yIGdldHRpbmcgdGhlIGFkZHJlc3MKICAgICBvZiBvbmUgb2YgdGhlIGFwcl9zb2NrYWRkcl90IHN0cnVjdHVyZXMgZm9yIGEgc29ja2V0LiAgQ2hhbmdlCiAgICAgYXByX2JpbmQoKSB0byB0YWtlIGFwcl9zb2NrYWRkcl90LiAgW0RhdmlkIFJlaWQgYW5kIEplZmYgVHJhd2lja10KCiAgKikgUmVtb3ZlIHRoZSBCVUZGIGZyb20gdGhlIEhUVFAgcHJveHkuICBUaGlzIGlzIHN0aWxsIGEgYml0IHVnbHksIGJ1dAogICAgIEkgaGF2ZSBwcm94aWVkIHBhZ2VzIHdpdGggaXQsIGNsZWFudXAgd2lsbCBjb21tZW5jZSBzb29uLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIHRoZSBwcm94eSB3b3JrIHdpdGggZmlsdGVycy4gIFRoaXMgaXNuJ3QgcGVyZmVjdCwgYmVjYXVzZSB3ZQogICAgIGFyZW4ndCBkZWFsaW5nIHdpdGggdGhlIGhlYWRlcnMgcHJvcGVybHkuICBbUnlhbiBCbG9vbV0KCiAgKikgRG8gbm90IHNlbmQgYSBjb250ZW50LWxlbmd0aCBpZmYgdGhlIEMtTCBpcyAwIGFuZCB0aGlzIGlzIGEgaGVhZAogICAgIHJlcXVlc3QuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSBjZ2ktYmluIHdvcmsgYXMgYSByZWd1bGFyIGRpcmVjdG9yeSB3aGVuIHVzaW5nIG1vZF92aG9zdF9hbGlhcwogICAgIHdpdGggbm8gVmlydHVhbFNjcmlwdEFsaWFzIGRpcmVjdGl2ZXMuIFBSIzY4MjkgW1RvbnkgRmluY2hdCgogICopIFJlbW92ZSBCVUZGIGZyb20gdGhlIFBST1hZIGNvbm5lY3QgaGFuZGxpbmcuIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIGRlZmF1bHRfaGFuZGxlciB0byBzdG9wIHRyeWluZyB0byBkZWFsIHdpdGggSEVBRCByZXF1ZXN0cy4KICAgICBUaGUgaWRlYSBpcyB0byBsZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGZpbHRlciBjb21wdXRlIHRoZSBDLUwgYmVmb3JlCiAgICAgd2UgdHJ5IHRvIHNlbmQgdGhlIGRhdGEuICBJZiB3ZSBjYW4gZ2V0IHRoZSBDLUwgY29ycmVjdGx5LCB0aGVuIHdlCiAgICAgc2hvdWxkIHNlbmQgaXQgaW4gdGhlIEhFQUQgcmVzcG9uc2UuCiAgICAgW1J5YW4gQmxvb21dCiAgICAgCiAgKikgVGhlIEhlYWRlciBmaWx0ZXIgY2FuIG5vdyBkZXRlcm1pbmUgaWYgYSBib2R5IHNob3VsZCBiZSBzZW50IGJhc2VkCiAgICAgb24gci0+aGVhZGVyX29ubHkuICBUaGUgZ2VuZXJhbCBpZGVhIG9mIHRoaXMgaXMgdGhhdCBpZiB3ZSBkZWxheQogICAgIGRlY2lkaW5nIHRvIHNlbmQgdGhlIGJvZHksIHRoZW4gd2UgbWlnaHQgYmUgYWJsZSB0byBjb21wdXRlIHRoZQogICAgIGNvbnRlbnQtbGVuZ3RoIGNvcnJlY3RseSwgd2hpY2ggd2lsbCBoZWxwIGNhY2hpbmcgcHJveGllcyB0byBjYWNoZQogICAgIG91ciBkYXRhIGJldHRlci4gIEFueSBoYW5kbGVyIHRoYXQgZG9lc24ndCB3YW50IHRvIHRyeSB0byBjb21wdXRlCiAgICAgdGhlIGNvbnRlbnQtbGVuZ3RoIGNhbiBqdXN0IHNlbmQgYW4gRU9TIGJ1Y2tldCB3aXRob3V0IGRhdGEgYW5kCiAgICAgZXZlcnl0aGluZyB3aWxsIGp1c3Qgd29yay4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIHRoZSByZWZlcmVyIHRvIHRoZSBlcnJvciBsb2cgaWYgb25lIGlzIGF2YWlsYWJsZS4KICAgICBbTWFya3VzIEd5Z2VyIDxtZ3lnZXJAaXRyLmNoPl0KCiAgKikgTW9kX2luZm8uYyBoYXMgbm93IGJlZW4gcG9ydGVkIHRvIEFwYWNoZSAyLjAuICBBcyBhIHBhcnQgb2YgdGhpcwogICAgIGNoYW5nZSwgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdHJlZSBoYXMgYmVlbiBleHBvc2VkIHRvIG1vZHVsZXMKICAgICBhcyBhcF9jb25mdHJlZS4KICAgICBbUnlhbiBNb3JnYW4gPHJtb3JnYW5AY292YWxlbnQubmV0Pl0KCiAgKikgR2V0IHRoZSBjb3JlX291dHB1dF9maWx0ZXIgdG8gdXNlIHRoZSBidWNrZXQgaW50ZXJmYWNlIGRpcmVjdGx5LgogICAgIFRoaXMga2VlcHMgdXMgZnJvbSBjYWxsaW5nIHRoZSBjb250ZW50LWxlbmd0aCBmaWx0ZXIgbXVsdGlwbGUgdGltZXMKICAgICBmb3IgYSBzaW1wbGUgc3RhdGljIHJlcXVlc3QuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFdlIGFyZSBzZW5kaW5nIHRoZSBjb250ZW50LXR5cGUgY29ycmVjdGx5IG5vdy4KICAgICBbUnlhbiBCbG9vbSBhbmQgV2lsbCBSb3dlXQoKICAqKSBBUFIgb24gRnJlZUJTRDogRml4IGEgYnVnIGluIGFwcl9zZW5kZmlsZSgpIHdoaWNoIGNhdXNlZCB1cyB0byByZXBvcnQKICAgICBhIGJvZ3VzIGJ5dGVzLXNlbnQgdmFsdWUgd2hlbiB0aGUgb25seSB0aGluZyBiZWluZyBzZW50IHdhcyB0cmFpbGVycwogICAgIGFuZCB3cml0ZXYoKSByZXR1cm5lZCBhbiBlcnJvciAob3IgRUFHQUlOKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEdldCBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgd29ya2luZyBhZ2Fpbi4gIFRoaXMgdXNlcyB0aGUKICAgICBoaW50cyBmaWxlIHRvIGRldGVybWluZSB3aGljaCBwbGF0Zm9ybXMgZGVmaW5lIAogICAgIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQVBSOiBhZGQgYXByX2dldF9ob21lX2RpcmVjdG9yeSgpICBbSmVmZiBUcmF3aWNrXQoKICAqKSBJbml0aWFsIGltcG9ydCBvZiAxLjMtY3VycmVudCBtb2RfcHJveHkuIFtDaHVjayBNdXJja29dCgogICopIE5vdCBhbGwgcGxhdGZvcm1zIGhhdmUgSU5BRERSX05PTkUgZGVmaW5lZCBieSBkZWZhdWx0LiAgQXBhY2hlCiAgICAgdXNlZCB0byBtYWtlIHRoaXMgY2hlY2sgYW5kIGRlZmluZSBJTkFERFJfTk9ORSBpZiBhcHByb3ByaWF0ZSwKICAgICBidXQgQVBSIG5lZWRzIHRoZSBjaGVjayB0b28sIGFuZCBJIHN1c3BlY3Qgb3RoZXIgYXBwbGljYXRpb25zIHdpbGwKICAgICBhcyB3ZWxsLiAgQVBSIG5vdyBkZWZpbmVzIEFQUl9JTkFERFJfTk9ORSwgd2hpY2ggaXMgYWx3YXlzIGEgdmFsaWQKICAgICB2YWx1ZSBvbiBhbGwgcGxhdGZvcm1zLgogICAgIFtCcmFua28gyGliZWogPGJyYW5lQHhiYy5udT5dCgogICopIERlc3Ryb3kgdGhlIHB0aHJlYWQgbXV0ZXggaW4gbG9ja19pbnRyYV9jbGVhbnVwKCkgZm9yIFBSIzY4MjQuCiAgICAgW1NodWljaGkgS2l0YWd1Y2hpIDxraUBoaC5paWo0dS5vci5qcD5dIAoKICAqKSBSZWxheCB0aGUgc3ludGF4IGNoZWNraW5nIG9mIEhvc3Q6IGhlYWRlcnMgaW4gb3JkZXIgdG8gc3VwcG9ydAogICAgIGlETlMuIFBSIzY2MzUgW1RvbnkgRmluY2hdCgogICopIFdoZW4gcmVhZGluZyBmcm9tIGZpbGUgYnVja2V0cyB3ZSBjb252ZXJ0IHRvIGFuIE1NQVAgaWYgaXQgbWFrZXMKICAgICBzZW5zZS4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBkZWZhdWx0IGhhbmRsZXIgYmVjYXVzZSB0aGUKICAgICBkZWZhdWx0IGhhbmRsZXIgbm8gbG9uZ2VyIG5lZWRzIHRvIHRyeSB0byBjcmVhdGUgTU1BUHMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEJVRkYgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYWluIHNlcnZlci4gIFRoZSBCVUZGIGNvZGUgd2lsbCByZW1haW4KICAgICBpbiB0aGUgY29kZSB1bnRpbCBpdCBoYXMgYmVlbiBwdXJnZWQgZnJvbSB0aGUgcHJveHkgbW9kdWxlIGFzIHdlbGwuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEJ5dGVyYW5nZXMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmUtd3JpdHRlbiB0byBiZSBhIGZpbHRlci4gIFRoaXMKICAgICBoYXMgYmVlbiB0ZXN0ZWQsIGFuZCBJIGJlbGlldmUgaXQgaXMgd29ya2luZyBjb3JyZWN0bHksIGJ1dCBpdCBjb3VsZAogICAgIGRvZXNuJ3Qgd29yayBmb3IgdGhlIEFkb2JlIEFjcm9iYXQgcGx1Zy1pbi4gIFRoZSBvdXRwdXQgYWxtb3N0IG1hdGNoZXMKICAgICB0aGUgb3V0cHV0IGZyb20gMS4zLCB0aGUgb25seSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgMS4zIGluY2x1ZGVzCiAgICAgYSBjb250ZW50LWxlbmd0aCBpbiB0aGUgcmVzcG9uc2UsIGFuZCB0aGlzIGRvZXMgbm90LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUFIgcmVhZC93cml0ZSBmdW5jdGlvbnMgYW5kIGJ1Y2tldCByZWFkIGZ1bmN0aW9ucyBub3cgb3BlcmF0ZQogICAgIG9uIHVuc2lnbmVkIGludGVnZXJzLCBpbnN0ZWFkIG9mIHNpZ25lZCBvbmVzLiAgSXQgZG9lc24ndCBtYWtlCiAgICAgYW55IHNlbnNlIHRvIHVzZSBzaWduZWQgaW50cywgYmVjYXVzZSB3ZSByZXR1cm4gdGhlIGVycm9yIGNvZGVzLAogICAgIHNvIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2Ugc2hvdWxkIHJlcG9ydCAwIGJ5dGVzIHJlYWQgb3Igd3JpdHRlbi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWx3YXlzIGNvbXB1dGUgdGhlIGNvbnRlbnQgbGVuZ3RoLCB3aGV0aGVyIGl0IGlzIHNlbnQgb3Igbm90LgogICAgIFRoZSByZWFzb24gZm9yIHRoaXMsIGlzIHRoYXQgaXQgYWxsb3dzIHVzIHRvIGNvcnJlY3RseSByZXBvcnQKICAgICB0aGUgYnl0ZXNfc2VudCB3aGVuIGxvZ2dpbmcgdGhlIHJlcXVlc3QuICBUaGlzIGFsc28gc2ltcGxpZmllcwogICAgIGNvbnRlbnQtbGVuZ3RoIGZpbHRlciBhIGJpdCwgYW5kIGZpeGVzIHRoZSBhY3R1YWwgYnl0ZS1yZXBvcmluZwogICAgIGNvZGUgaW4gbW9kX2xvZ19jb25maWcuYwogICAgIFtSeWFuIEJsb29tXQoKICAqKSBSZW1vdmUgQVBfRU5EX09GX0JSSUdBREUgZGVmaW5pdGlvbi4gIFRoaXMgZG9lcyBub3Qgc2lnbmlmeSB3aGF0CiAgICAgaXQgc2F5cywgYmVjYXVzZSBpdCB3YXMgb25seSB1c2VkIGJ5IEVPUyBhbmQgRkxVU0ggYnVja2V0cy4gIFNpbmNlCiAgICAgbmVpdGhlciBvZiB0aG9zZSBhcmUgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiBhIGJyaWdhZGUsIHRoaXMgd2FzCiAgICAgcmVhbGx5IHNpZ25pZnlpbmcgRkxVU0hfVEhFX0RBVEEsIGJ1dCB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJldHRlcgogICAgIGJ5IGNoZWNraW5nIEFQX0JVQ0tFVF9JU19FT1MoKSBvciBBUF9CVUNLRVRfSVNfRkxVU0guICBFT1MgYW5kIEZMVVNICiAgICAgYnVja2V0cyBub3cgcmV0dXJuIGEgbGVuZ3RoIG9mIDAsIHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBhbW91bnQgb2YgZGF0YQogICAgIHJlYWQsIHNvIHRoZXkgbWFrZSBtb3JlIHNlbnNlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyB0aGUgY29yZV9vdXRwdXRfZmlsdGVyIHRvIHNhdmUgc29tZSBkYXRhIHBhc3QgdGhlIGVuZCBvZiBhCiAgICAgcmVxdWVzdC4gIElmIHdlIGdldCBhbiBFT1MgYnVja2V0LCB3ZSBvbmx5IHNlbmQgdGhlIGRhdGEgaWYgaXQgCiAgICAgbWFrZXMgc2Vuc2UgdG8gc2VuZCBpdC4gIFRoaXMgYWxsb3dzIHVzIHRvIHBpcGVsaW5lIHJlcXVlc3QKICAgICByZXNwb25zZXMuICBBcyBhIHBhcnQgb2YgdGhpcywgd2UgYWxzbyBuZWVkIHRvIGFsbG9jYXRlIG1tYXAKICAgICBidWNrZXRzIG91dCBvZiB0aGUgY29ubmVjdGlvbiBwb29sLCBub3QgdGhlIHJlcXVlc3QgcG9vbC4gIFRoaXMKICAgICBhbGxvd3MgdGhlIG1tYXAgdG8gb3V0bGl2ZSB0aGUgcmVxdWVzdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIGJ1Y2tldCByZWFkcyB3b3JrIGNvcnJlY3RseSBmb3IKICAgICBzb2NrZXRzIGFuZCBwaXBlcy4gIFRoZXNlIGFyZSB0aGUgb25seSBidWNrZXQgdHlwZXMgdGhhdCBzaG91bGQKICAgICBoYXZlIG5vbi1ibG9ja2luZyByZWFkcywgYmVjYXVzZSB0aGUgb3RoZXIgYnVja2V0IHR5cGVzIHNob3VsZAogICAgIEFMV0FZUyBiZSBhYmxlIHRvIHJldHVybiBzb21ldGhpbmcgaW1tZWRpYXRlbHkuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEluIHRoZSBBcGFjaGUvV2luMzIgY29uc29sZSB3aW5kb3csIGFjY2VwdCBDdHJsK0MgdG8gc3RvcCB0aGUgCiAgICAgc2VydmVyLCBidXQgdXNlIEN0cmwrQnJlYWsgdG8gaW5pdGlhdGUgYSBncmFjZWZ1bCByZXN0YXJ0IAogICAgIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgYmVoYXZpb3IuIFtKb2huIFN0ZXJsaW5nXQoKICAqKSBQYXRjaCBtb2RfYXV0b2luZGV4IHRvIHNldCB0aGUgTGFzdC1Nb2RpZmllZCBoZWFkZXIgYmFzZWQgb24KICAgICB0aGUgZGlyZWN0b3J5J3MgbXRpbWUsIGFuZCBhZGQgdGhlIEVUYWcgaGVhZGVyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWVyZ2UgdGhlIDEuMyBwYXRjaCB0byBhZGQgc3VwcG9ydCBmb3IgbG9nZ2luZyBxdWVyeSBzdHJpbmcgaW4gCiAgICAgc3VjaCBhIHdheSB0aGF0ICIlbSAlVSVxICVIIiBpcyB0aGUgc2FtZSBhcyAiJXIiLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBQb3J0IHRocmVlIGxvZyBtZXRob2RzIGZyb20gbW9kX2xvZ19jb25maWcgMS4zIHRvIDIuMDogCiAgICAgQ0xGIGNvbXBsaWFudCAnLScgYnl0ZSBjb3VudCwgbWV0aG9kIGFuZCBwcm90b2NvbC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIGEgbmV3IExvZ0Zvcm1hdCBkaXJlY3RpdmUsICVjLCB0aGF0IHdpbGwgbG9nIGNvbm5lY3Rpb24KICAgICBzdGF0dXMgYXQgdGhlIGVuZCBvZiB0aGUgcmVzcG9uc2UgYXMgZm9sbG93czoKICAgICAnWCcgLSBjb25uZWN0aW9uIGFib3J0ZWQgYmVmb3JlIHRoZSByZXNwb25zZSBjb21wbGV0ZWQuCiAgICAgJysnIC0gY29ubmVjdGlvbiBtYXkgYmUga2VwdC1hbGl2ZSBieSB0aGUgc2VydmVyLgogICAgICctJyAtIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYnkgdGhlIHNlcnZlci4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRXhwYW5kIEFQUiBmb3IgV2luTlQgdG8gZnVsbHkgYWNjZXB0IGFuZCByZXR1cm4gdXRmLTggZW5jb2RlZAogICAgIFVuaWNvZGUgZmlsZSBuYW1lcyBhbmQgcGF0aHMgZm9yIFdpbjMyLCBhbmQgdGFnIHRoZSBDb250ZW50LVR5cGUgCiAgICAgZnJvbSBtb2RfYXV0b2luZGV4IHRvIHJlZmxlY3QgdGhhdCBjaGFyc2V0IGlmIHRoZSB0aGUgZmVhdHVyZQogICAgIG1hY3JvIEFQUl9IQVNfVU5JQ09ERV9GUyBpcyB0cnVlLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGggKGFuZCBhZGQgYXBwcm9wcmlhdGUgaGVhZGVyIGZpZWxkKSBmb3IKICAgICB0aGUgcmVzcG9uc2Ugd2hlbiBubyBjb250ZW50IGxlbmd0aCBpcyBhdmFpbGFibGUgYW5kIHdlIGNhbid0IHVzZSAKICAgICBjaHVua2VkIGVuY29kaW5nLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlZCBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keSgpIHRvIHVzZSBSRVFVRVNUX0NIVU5LRURfREVDSFVOSywKICAgICBzbyB0aGF0IGNvbnRlbnQgaW5wdXQgZmlsdGVycyBnZXQgZGVjaHVua2VkIGRhdGEgd2hlbiB1c2luZwogICAgIHRoZSBkZWZhdWx0IGhhbmRsZXIuIEFsc28gcmVtb3ZlZCBSRVFVRVNUX0NIVU5LRURfUEFTUy4KICAgICBbU2FzY2hhIFNjaHVtYW5uXQogICAgIAogICopIEFkZCBtb2RfZXh0X2ZpbHRlciBhcyBhbiBleHBlcmltZW50YWwgbW9kdWxlLiAgVGhpcyBtb2R1bGUgYWxsb3dzCiAgICAgdGhlIGFkbWluaXN0cmF0b3IgdG8gdXNlIGV4dGVybmFsIHByb2dyYW1zIGFzIGZpbHRlcnMuICBDdXJyZW50bHksCiAgICAgb25seSBmaWx0ZXJpbmcgb2Ygb3V0cHV0IGlzIHN1cHBvcnRlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vc3QgQXBhY2hlIGZ1bmN0aW9ucyB3b3JrIG9uIEVCQ0RJQyBtYWNoaW5lcyBhZ2FpbiwgYXMgcHJvdG9jb2wKICAgICBkYXRhIGlzIG5vdyB0cmFuc2xhdGVkIChhZ2FpbikuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBJbnRyb2R1Y2UgYXBfeGxhdGVfcHJvdG9fe3RvfGZyb219X2FzY2lpKCkgdG8gY2xlYW4gdXAgc29tZSBvZgogICAgIHRoZSBFQkNESUMgc3VwcG9ydC4gIFRoZXkgYXJlIG5vb3BzIG9uIEFTQ0lJIG1hY2hpbmVzLCBzbyB0aGlzCiAgICAgdHlwZSBvZiB0cmFuc2xhdGlvbiBkb2Vzbid0IGhhdmUgdG8gYmUgc3Vycm91bmRlZCBieSAjaWZkZWYKICAgICBDSEFSU0VUX0VCQ0RJQy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBtb2RfaW5jbHVkZS4gIHRhZyBjb21tYW5kcyB3b3JrIGFnYWluLCBhbmQgdGhlIHNlcnZlciB3aWxsCiAgICAgc2VuZCB0aGUgRkFRIGFnYWluLiAgVGhpcyBhbHNvIGFsbG93cyBtb2RfaW5jbHVkZSB0byBzZXQgYXNpZGUKICAgICBidWNrZXRzIHRoYXQgaW5jbHVkZSBwYXJ0aWFsIGJ1Y2tldHMuCiAgICAgW1J5YW4gQmxvb20gYW5kIERhdmlkIFJlaWRdCgogICopIEFkZCBzdWV4ZWMgc3VwcG9ydCBiYWNrLiAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgTGluZ2VyaW5nIGNsb3NlIG5vdyB1c2VzIHRoZSBzb2NrZXQgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZwogICAgIEJVRkYuICBUaGlzIGhhcyBiZWVuIHRlc3RlZCwgYnV0IHNpbmNlIGFsbCB3ZSBjYW4gdGVsbCBpcyB0aGF0IGl0CiAgICAgZG9lc24ndCBmYWlsLCB0aGlzIG5lZWRzIHRvIGJlIHJlYWxseSBoYWNrZWQgb24uCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IGZpbHRlcnMgdG8gbW9kaWZ5IGhlYWRlcnMgYW5kIGhhdmUgdGhvc2UgaGVhZGVycyBiZSBzZW50IHRvCiAgICAgdGhlIGNsaWVudC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgaGF2ZSBhbiBodHRwX2hlYWRlciBmaWx0ZXIgdGhhdAogICAgIGFjdHVhbGx5IHNlbmRzIHRoZSBoZWFkZXJzIHRvIHRoZSBuZXR3b3JrLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkCiAgICAgZm9yIHRoZSBCVUZGIHRvIHNlbmQgaGVhZGVycy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQ2hhcnNldCB0cmFuc2xhdGlvbjogbW9kX2NoYXJzZXRfbGl0ZSBoYW5kbGVzIHRyYW5zbGF0aW9uIG9mCiAgICAgcmVxdWVzdCBib2RpZXMuICBHZXQgcmlkIG9mIHRoZSB4bGF0ZSB2ZXJzaW9uIG9mIGFwX21kNV9kaWdlc3QoKQogICAgIHNpbmNlIHdlIGRvbid0IGNvbXB1dGUgZGlnZXN0cyBvZiBmaWx0ZXJlZCAoZS5nLiwgdHJhbnNsYXRlZCkgCiAgICAgcmVzcG9uc2UgYm9kaWVzIHRoaXMgd2F5IGFueW1vcmUuICAoTm90ZSB0aGF0IHdlIGRvbid0IGRvIGl0IGF0CiAgICAgYWxsIGF0IHRoZSBwcmVzZW50OyBzb21lYm9keSBuZWVkcyB0byB3cml0ZSBhIGZpbHRlciB0byBkbyBzby4pCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgSW5wdXQgZmlsdGVycyBhbmQgYXBfZ2V0X2JyaWdhZGUoKSBub3cgaGF2ZSBhIGlucHV0IG1vZGUgcGFyYW1ldGVyIAogICAgIChibG9ja2luZywgbm9uLWJsb2NraW5nLCBwZWVrKSBpbnN0ZWFkIG9mIGEgbGVuZ3RoIHBhcmFtZXRlci4KICAgICBbaGFja2F0aG9uXQoKICAqKSBVcGRhdGUgdGhlIG1pbWUudHlwZXMgZmlsZSB0byB0aGUgcmVnaXN0ZXJlZCBtZWRpYSB0eXBlcyBhcwogICAgIG9mIDIwMDAtMTAtMTkuIFBSIzY2MTMgW0NhcnN0ZW4gS2xhcHAgPGNhcnN0ZW4ua2xhcHBAaG9tZS5uZXQ+LAogICAgIFRvbnkgRmluY2hdCgogICopIE5hbWVzcGFjZSBwcm90ZWN0IHNvbWUgbWFjcm9zIGRlY2xhcmVkIGluIGFwX2NvbmZpZy5oCiAgICAgW1J5YW4gQmxvb21dCgogICopIFN1cHBvcnQgSFRUUCBoZWFkZXIgbGluZSBmb2xkaW5nIHdpdGggaW5wdXQgZmlsdGVyaW5nLgogICAgIFtHcmVnIEFtZXNdCgogICopIE1vZF9pbmNsdWRlIHdvcmtzIGFnYWluLiAgVGhpcyBzaG91bGQgc3RpbGwgYmUgcmUtd3JpdHRlbiwgYnV0IGF0CiAgICAgbGVhc3Qgbm93IHdlIGNhbiBzZXJ2ZSBhbiBTSFRNTCBwYWdlIGFnYWluLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBCZWdpbiB0byByZW1vdmUgQlVGRiBmcm9tIHRoZSBjb3JlLiAgQ3VycmVudGx5LCB3ZSBrZWVwIGEgcG9pbnRlcgogICAgIHRvIGJvdGggdGhlIEJVRkYgYW5kIHRoZSBzb2NrZXQgaW4gdGhlIGNvbm5fcmVjLiAgRnVuY3Rpb25zIHRoYXQKICAgICB3YW50IHRvIHVzZSB0aGUgQlVGRiBjYW4sIGZ1bmN0aW9ucyB0aGF0IHdhbnQgdG8gdXNlIHRoZSBzb2NrZXQsCiAgICAgY2FuLiAgVGhleSBwb2ludCB0byB0aGUgc2FtZSBwbGFjZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3BzcHJpbnRmIGRvZXNuJ3QgdW5kZXJzdGFuZCAlbGxkIGFzIGEgZm9ybWF0LiAgTWFrZSBpdCAlbGQuCiAgICAgW1RvbWFzICLWZ3JlbiIgPHN0cmljQGluZy51bXUuc2U+XQoKICAqKSBBUFIgcGlwZXMgb24gVW5peCBhbmQgV2luMzIgYXJlIG5vdyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgCiAgICAgYXNzb2NpYXRlZCBwb29sIGdvZXMgYXdheS4gIChBUFIgcGlwZXMgb24gT1MvMiB3ZXJlIGFscmVhZHkgaGFkIHRoaXMKICAgICBsb2dpYy4pICBUaGlzIHJlc29sdnMgYSBmYXRhbCBmaWxlIGRlc2NyaXB0b3IgbGVhayB3aXRoIENHSXMuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgZmluYWwgbGluZSBvZiB0aGUgY29uZmlnIGZpbGUgd2FzIG5vdCBiZWluZyByZWFkIGlmIHRoZXJlIHdhcwogICAgIG5vIFxuIGF0IHRoZSBlbmQgb2YgaXQuICBUaGlzIHdhcyBjYXVzZWQgYnkgYXByX2ZnZXRzIHJldHVybmluZyAKICAgICBBUFJfRU9GIGV2ZW4gdGhvdWdoIHdlIGhhZCByZWFkIHZhbGlkIGRhdGEuICBUaGlzIGlzIHNvbHZlZCBieQogICAgIG1ha2luZyBjZmdfZ2V0bGluZSBjaGVjayB0aGUgYnVmZiB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIGFwcl9mZ2V0cy4KICAgICBJZiBhcHJfZmdldHMgcmV0dXJuIEFQUl9FT0YsIGJ1dCB0aGVyZSB3YXMgZGF0YSBpbiB0aGUgYnVmLCB0aGVuIHdlCiAgICAgcmV0dXJuIHRoZSBidWYsIG90aGVyd2lzZSB3ZSByZXR1cm4gTlVMTC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUGlwZWQgbG9ncyB3b3JrIGFnYWluIGluIHRoZSAyLjAgc2VyaWVzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBSZXN0b3JlIGZ1bmN0aW9uYWxpdHkgYnJva2VuIGJ5IHRoZSBtb2RfcmV3cml0ZSBzZWN1cml0eSBmaXg6CiAgICAgcmV3cml0ZSBtYXAgbG9va3VwIGtleXMgYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBub3cgZXhwYW5kZWQKICAgICBzbyB0aGF0IHRoZSBsb29rdXAgY2FuIGRlcGVuZCBvbiB0aGUgcmVxdWVzdGVkIFVSSSBldGMuCiAgICAgUFIgIzY2NzEgW1RvbnkgRmluY2hdCgogICopIFRpZ2h0ZW4gdXAgdGhlIHN5bnRheCBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIHRvIGZpeCBhCiAgICAgc2VjdXJpdHkgYnVnIGluIHNvbWUgbWFzcyB2aXJ0dWFsIGhvc3RpbmcgY29uZmlndXJhdGlvbnMKICAgICB0aGF0IGNhbiBhbGxvdyBhIHJlbW90ZSBhdHRhY2tlciB0byByZXRyaWV2ZSBzb21lIGZpbGVzCiAgICAgb24gdGhlIHN5c3RlbSB0aGF0IHNob3VsZCBiZSBpbmFjY2Vzc2libGUuIFtUb255IEZpbmNoXQoKICAqKSBBZGQgYSBwb29sIGJ1Y2tldCB0eXBlLiAgVGhpcyBidWNrZXQgaXMgdXNlZCBmb3IgZGF0YSBhbGxvY2F0ZWQgb3V0CiAgICAgb2YgYSBwb29sLiAgSWYgdGhlIHBvb2wgaXMgY2xlYW5lZCBiZWZvcmUgdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWQsIHRoZW4KICAgICB0aGUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBoZWFwIGJ1Y2tldCwgYWxsb3dpbmcgaXQgdG8gc3Vydml2ZSB0aGUKICAgICBkZWF0aCBvZiB0aGUgcG9vbC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGEgZmx1c2ggYnVja2V0LiAgVGhpcyBhbGxvd3MgbW9kdWxlcyB0byBzaWduYWwgdGhhdCB0aGUgZmlsdGVycwogICAgIHNob3VsZCBhbGwgZmx1c2ggd2hhdGV2ZXIgZGF0YSB0aGV5IGN1cnJlbnRseSBoYXZlLiAgVGhlcmUgaXMgbm8gd2F5CiAgICAgdG8gYWN0dWFsbHkgZm9yY2UgdGhlbSB0byBkbyB0aGlzLCBzbyBpZiBhIGZpbHRlciBpZ25vcmVzIHRoaXMgYnVja2V0LAogICAgIHRoYXQncyBsaWZlLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRyeSB3aXRoIHRoaXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCBhbiBvdXRwdXQgZmlsdGVyIGZvciBzdWItcmVxdWVzdHMuICBUaGlzIGZpbHRlciBqdXN0IHN0cmlwcyB0aGUKICAgICBFT1MgYnVja2V0IHNvIHRoYXQgd2UgZG9uJ3QgY29uZnVzZSB0aGUgbWFpbiByZXF1ZXN0J3MgY29yZSBvdXRwdXQKICAgICBmaWx0ZXIgYnkgc2VuZGluZyBtdWx0aXBsZSBFT1MgYnVja2V0cy4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgc3ViCiAgICAgcmVxdWVzdHMgc3RhcnQgdG8gc2VuZCBFT1MgYnVja2V0cyB3aGVuIHRoZXkgYXJlIGZpbmlzaGVkLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIGFwX2J1Y2tldF8ocmVhZHxkZXN0cm95fHNwbGl0fHNldGFzaWRlKSBpbnRvIG1hY3Jvcy4gIEFsc28KICAgICBtYWtlcyBhcF9idWNrZXRfZGVzdHJveSBhIHJldHVybiB2b2lkLCB3aGljaCBpcyBva2F5IGJlY2F1c2UgaXQKICAgICB1c2VkIHRvIGFsd2F5cyByZXR1cm4gQVBSX1NVQ0NFU1MsIGFuZCBub2JvZHkgZXZlciBjaGVja2VkIGl0cwogICAgIHJldHVybiB2YWx1ZSBhbnl3YXkuCiAgICAgW0NsaWZmIFdvb2xsZXkgPGNsaWZmd29vbGxleUB5YWhvby5jb20+XQoKICAqKSBSZW1vdmUgdGhlIGluZGV4IGludG8gdGhlIGJ1Y2tldC10eXBlIHRhYmxlIGZyb20gdGhlIGJ1Y2tldHMKICAgICBzdHJ1Y3R1cmUuICBUaGlzIGhhcyBub3cgYmVlbiByZXBsYWNlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUKICAgICBidWNrZXRfdHlwZS4gIEFsc28gYWRkIHNvbWUgbWFjcm9zIHRvIHRlc3QgdGhlIGJ1Y2tldC10eXBlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBSZW5hbWVkIGFsbCBNT0RVTEVfRVhQT1JUIHN5bWJvbHMgdG8gQVBfTU9EVUxFX0RFQ0xBUkUgYW5kIGFsbCBzeW1ib2xzCiAgICAgZm9yIENPUkVfRVhQT1JUIHRvIEFQX0NPUkVfREVDTEFSRSAobmFtZXNwYWNlIHByb3RlY3RpbmcgdGhlIHdyYXBwZXIpCiAgICAgYW5kIHJldGl0bGVkIEFQSV9FWFBPUlQgYXMgQVBfREVDTEFSRSBhbmQgQVBSX0VYUE9SVCBhcyBBUFJfREVDTEFSRS4KICAgICBBbGwgX1ZBUl8gZmxhdm9ycyBjaGFuZ2VzIHRvIF9EQVRBIHRvIGJlIGFic29sdXRlbHkgY2xlYXIuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIC8sIC8vLCAvL3NlcnZlcm5hbWUgYW5kIC8vc2VydmVyL3NoYXJlbmFtZSAKICAgICBwYXJzaW5nIG9mIDxEaXJlY3Rvcnk+IGJsb2NrcyB1bmRlciBXaW4zMiBhbmQgT1MyLgogICAgIFtUaW0gQ29zdGVsbG8sIFdpbGxpYW0gUm93ZSwgQnJpYW4gSGFydmFyZF0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbiBwb2ludGVycyBmcm9tIHRoZSBhcF9idWNrZXQgdHlwZS4gIFRoZXkgaGF2ZSBiZWVuCiAgICAgcmVwbGFjZWQgd2l0aCBhIGdsb2JhbCB0YWJsZS4gIE1vZHVsZXMgYXJlIGFsbG93ZWQgdG8gcmVnaXN0ZXIgYnVja2V0CiAgICAgdHlwZXMgYW5kIHVzZSB0aGVuIHVzZSB0aG9zZSBidWNrZXRzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfY2dpZDogSW4gdGhlIGhhbmRsZXIsIHNodXQgZG93biB0aGUgVW5peCBzb2NrZXQgKG9ubHkgZm9yIHdyaXRlKSAKICAgICBvbmNlIHdlIGZpbmlzaCB3cml0aW5nIHRoZSByZXF1ZXN0IGJvZHkgdG8gdGhlIGNnaSBjaGlsZCBwcm9jZXNzOyAKICAgICBvdGhlcndpc2UsIHRoZSBjbGllbnQgZG9lc24ndCBoaXQgRU9GIG9uIHN0ZGluLiAgU21hbGwgcmVxdWVzdCBib2RpZXMgCiAgICAgd29ya2VkIHdpdGhvdXQgdGhpcyBjaGFuZ2UgKGZvciByZWFzb25zIEkgZG9uJ3QgdW5kZXJzdGFuZCksIGJ1dCBsYXJnZSAKICAgICBvbmVzIGRpZG4ndC4gIFtKZWZmIFRyYXdpY2tdCgogICopIFJlbW92ZSBmaWxlIGJ1Y2tldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcF9idWNrZXQgdHlwZS4KICAgICBUaGlzIGhhcyBiZWVuIG1vdmVkIHRvIGEgZmlsZV9idWNrZXQgc3BlY2lmaWMgdHlwZSB0aGF0IGhhbmdzIG9mZgogICAgIHRoZSBkYXRhIHBvaW50ZXIgaW4gdGhlIGFwX2J1Y2tldCB0eXBlLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBJbnB1dCBmaWx0ZXJpbmcgbm93IGhhcyBhIHRoaXJkIGFyZ3VtZW50LiAgVGhpcyBpcyB0aGUgYW1vdW50IG9mIGRhdGEKICAgICB0byByZWFkIGZyb20gbG93ZXIgZmlsdGVycy4gIFRoaXMgYXJndW1lbnQgY2FuIGJlIC0xLCAwLCBvciBhIHBvc2l0aXZlCiAgICAgbnVtYmVyLiAgLTEgbWVhbnMgZ2l2ZSBtZSBhbGwgdGhlIGRhdGEgeW91IGhhdmUsIEknbGwgZGVhbCB3aXRoIGl0IGFuZAogICAgIGxldCB5b3Uga25vdyBpZiBJIG5lZWQgbW9yZS4gIDAgbWVhbnMgZ2l2ZSBtZSBvbmUgbGluZSBhbmQgb25lIGxpbmUKICAgICBvbmx5LiAgQSBwb3NpdGl2ZSBudW1iZXIgbWVhbnMgSSB3YW50IG5vIG1vcmUgdGhhbiB0aGlzIG11Y2ggZGF0YS4KCiAgICAgQ3VycmVudGx5LCBvbmx5IDAgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGFyZSBpbXBsZW1lbnRlZC4gIFRoaXMgYWxsb3dzCiAgICAgdXMgdG8gcmVtb3ZlIHRoZSByZW1haW5pbmcgZmllbGQgZnJvbSB0aGUgY29ubl9yZWMgc3RydWN0dXJlLCB3aGljaAogICAgIGhhcyBhbHNvIGJlZW4gZG9uZS4KICAgICBbUnlhbiBCbG9vbV0gCiAgICAKICAqKSBCaWcgY2xlYW51cCBvZiB0aGUgaW5wdXQgZmlsdGVyaW5nLiAgVGhlIGdvYWwgaXMgdGhhdCBodHRwX2ZpbHRlcgogICAgIHVuZGVyc3RhbmRzIHR3byBjb25kaXRpb25zLCBoZWFkZXJzIGFuZCBib2R5LiAgSXQga25vd3Mgd2hlcmUgaXQgaXMKICAgICBiYXNlZCBvbiBjLT5yZW1haW5pbmcuICBJZiBjLT5yZW1haW5pbmcgaXMgMCwgdGhlbiB3ZSBhcmUgaW4gaGVhZGVycywKICAgICBhbmQgaHR0cF9maWx0ZXIgcmV0dXJucyBhIGxpbmUgYXQgYSB0aW1lLiAgSWYgaXQgaXMgbm90IDAsIHRoZW4gd2UgYXJlCiAgICAgaW4gYm9keSwgYW5kIGh0dHBfZmlsdGVyIHJldHVybnMgcmF3IGRhdGEsIGJ1dCBvbmx5IHVwIHRvIGMtPnJlbWFpbmluZwogICAgIGJ5dGVzLiAgSXQgY2FuIHJldHVybiBsZXNzLCBidXQgbmV2ZXIgbW9yZS4KICAgICBbR3JlZyBBbWVzLCBSeWFuIEJsb29tLCBKZWZmIFRyYXdpY2tdCgogICopIG1vZF9jZ2k6IFdyaXRlIGFsbCBvZiB0aGUgcmVxdWVzdCBib2R5IHRvIHRoZSBjaGlsZCwgbm90IGp1c3Qgd2hhdAogICAgIHRoZSBrZXJuZWwgd291bGQgYWNjZXB0IG9uIHRoZSBmaXJzdCB3cml0ZS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEJhY2sgb3V0IHRoZSBjaGFuZ2UgdGhhdCBtb3ZlZCB0aGUgYnJpZ2FkZSBmcm9tIHRoZSBjb3JlX291dHB1dF9maWx0ZXJzCiAgICAgY3R4IHRvIHRoZSBjb25uX3JlYy4gIFNpbmNlIGFsbCByZXF1ZXN0cyBvdmVyIGEgZ2l2ZW4gY29ubmVjdGlvbgogICAgIGdvIHRocm91Z2ggdGhlIHNhbWUgY29yZV9vdXRwdXRfZmlsdGVyLCB0aGUgY3R4IHBvaW50ZXIgaGFzIHRoZQogICAgIGNvcnJlY3QgbGlmZXRpbWUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhbm90aGVyIGJ1ZyBpbiB0aGUgc2VuZF90aGVfZmlsZSgpIHJlYWQvd3JpdGUgbG9vcC4gQSBwYXJ0aWFsCiAgICAgc2VuZCBieSBhcHJfc2VuZCB3b3VsZCBjYXVzZSB1bnNlbnQgZGF0YSBpbiB0aGUgcmVhZCBidWZmZXIgdG8KICAgICBnZXQgY2xvYmJlcmVkLiBDb21wbGV0ZSBtYWtpbmcgc2VuZF90aGVfZmlsZSBoYW5kbGUgcGFydGlhbAogICAgIHdyaXRlcyB0byB0aGUgbmV0d29yay4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IGEgY291cGxlIG9mIHR5cGUgZml4ZXMgdG8gYWxsb3cgY29tcGlsYXRpb24gb24gQUlYIGFnYWluCiAgICAgW1ZpY3RvciBKLiBPcmxpa293c2tpIDx2Lmoub3JsaWtvd3NraUBndGUubmV0Pl0KCiAgKikgRml4IGJ1ZyBpbiBzZW5kX3RoZV9maWxlKCkgd2hpY2ggY2F1c2VzIG9mZnNldCB0byBiZSBpZ25vcmVkCiAgICAgaWYgdGhlcmUgYXJlIG5vIGhlYWRlcnMgdG8gc2VuZC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgSGFuZGxlIEFQUl9FTk9USU1QTCByZXR1cm5lZCBmcm9tIGFwcl9zZW5kZmlsZSBpbiB0aGUgY29yZQogICAgIGZpbHRlci4gVXNlZnVsIGZvciBzdXBwb3J0aW5nIFdpbmRvd3MgOSogd2l0aCBhIGJpbmFyeQogICAgIGNvbXBpbGVkIG9uIFdpbmRvd3MgTlQuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE3CgogICopIFJlaW1wbGVtZW50IGNvcmVfb3V0cHV0X2ZpbHRlciB0byBidWZmZXIvc2F2ZSBidWNrZXQgYnJpZ2FkZXMKICAgICBhY3Jvc3MgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIGNvcmVfZmlsdGVyLiBUaGUgYnJpZ2FkZSB3aWxsIGJlCiAgICAgc2VudCB3aGVuIGVpdGhlciBNSU5fQllURVNfVE9fU0VORCBvciBNQVhfSU9WRUNfVE9fV1JJVEUKICAgICB0aHJlc2hvbGRzIGFyZSBoaXQgb3IgdGhlIEVPUyBidWNrZXQgaXMgcmVjZWl2ZWQuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIENyZWF0ZSBleHBlcmltZW50YWwgZmlsdGVyIChidWZmZXJfZmlsdGVyKSB0aGF0IGNvYWxlc2NlcyBieXRlcyAKICAgICBpbnRvIG9uZSBsYXJnZSBidWZmZXIgYmVmb3JlIGludm9raW5nIHRoZSBuZXh0IGZpbHRlciBpbiB0aGUKICAgICBjaGFpbi4gVGhpcyBmaWx0ZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aXRoIHRoZSBjdXJyZW50IAogICAgIGltcGxlbWVudGF0aW9uIG9mIG1vZF9hdXRvaW5kZXggd2hlbiBpdCBpbnNlcnRlZCBhYm92ZSB0aGUKICAgICBjaHVua19maWx0ZXIuIG1vZF9hdXRvaW5kZXggZ2VuZXJhdGVzIGEgbG90IG9mIGJyaWdhZGVzIHRoYXQKICAgICBjb250YWluaW5nIGJ1Y2tldHMgaG9sZGluZyBqdXN0IGEgZmV3IGJ5dGVzIGVhY2guIFRoZQogICAgIGJ1ZmZlcl9maWx0ZXIgY29hbGVzY2VzIHRoZXNlIGJ1Y2tldHMgaW50byBhIHNpbmdsZSBsYXJnZSBidWNrZXQuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEFkZCBhcHJfc2VuZGZpbGUoKSBzdXBwb3J0IGludG8gdGhlIGNvcmVfb3V0cHV0X2ZpbHRlci4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIGFwcl9zZW5kdigpIHN1cHBvcnQgaW50byB0aGUgY29yZV9vdXRwdXRfZmlsdGVyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggbW9kX2xvZ19jb25maWcgc28gdGhhdCBpdCBjb21waWxlcyBjbGVhbmx5IHdpdGggQlVGRkVSRURfTE9HUwogICAgIFtNaWtlIEFiYm90dCA8bWphQHNnaS5jb20+XQoKICAqKSBSZW1vdmUgYXBfc2VuZF9mYi4gIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQgaW4gQXBhY2hlLCBhbmQgaXQgZG9lc24ndAogICAgIG1ha2UgbXVjaCBzZW5zZSwgYmVjYXVzZSBBcGFjaGUgdXNlcyBidWNrZXRzIGluc3RlYWQgb2YgQlVGRnMgbm93LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBzZW5kX3RoZV9maWxlIG5vdyBmYWxscyBiYWNrIHRvIGEgcmVhZC93cml0ZSBsb29wIG9uIHBsYXRmb3JtcyB0aGF0CiAgICAgZG8gbm90IGhhdmUgc2VuZGZpbGUuCiAgICAgW1J5YW4gQmxvb20gYW5kIEJyaWFuIEhhdmFyZF0KCiAgKikgSW5zdGFsbCBhcGFjaGVjdGwgY29ycmVjdGx5LCBhbmQgc3Vic3RpdHV0ZSB0aGUgcHJvcGVyIHZhbHVlcyBzbwogICAgIHRoYXQgaXQgd29ya3MgYWdhaW4uICBbUnlhbiBCbG9vbV0KCiAgKikgQmV0dGVyKD8/KSBoYW5kbGUgcGxhdGZvcm1zIHRoYXQgbGFjayBzZW5kZmlsZSgpLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBBUFIgbm93IGhhcyBVVUlEIGdlbmVyYXRpb24vZm9ybWF0dGluZy9wYXJzaW5nIHN1cHBvcnQuCiAgICAgW0dyZWcgU3RlaW5dCgogICopIEJlZ2luIHRoZSBodHRwX2ZpbHRlci4gIFRoaXMgaXMgYW4gaW5wdXQgZmlsdGVyIHRoYXQgdW5kZXJzdGFuZHMKICAgICB0aGUgYWJzb2x1dGUgYmFzaWMgYW1vdW50IHJlcXVpcmVkIHRvIHBhcnNlIGFuIEhUVFAgUmVxdWVzdC4gIFRoZQogICAgIGdvYWwgaXMgdG8gYmUgYWJsZSB0byBzcGxpdCBoZWFkZXJzIGZyb20gcmVxdWVzdCBib2R5IGJlZm9yZSBwYXNzaW5nCiAgICAgdGhlIGRhdGEgYmFjayB0byB0aGUgb3RoZXIgZmlsdGVycy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQnJpbmcgZm9yd2FyZCBmcm9tIDEuMy4xMyB0aGUgY29uZmlnIGRpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBpbnN0YWxsIGFweHMgaWYgaXQgaXMgY3JlYXRlZAogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGRlZCBBUFJfSVNfU1RBVFVTX2NvbmRpdGlvbiB0ZXN0IG1hY3JvcyB0byBlbGltaW5hdGUgY2Fub25pY2FsIGVycm9yCiAgICAgY29udmVyc2lvbnMuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBOb3cgdGhhdCB3ZSBoYXZlIGFwX2FkZF9pbnB1dF9maWx0ZXIoKSwgcmVuYW1lIGFwX2FkZF9maWx0ZXIoKSB0byAKICAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcigpLiAgW0plZmYgVHJhd2lja10KCiAgKikgTXVsdGlwbGUgYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gZml4ZXMKICAgIEJ1aWxkIHByb2Nlc3M6CgogICAgICAtYWRkIGRhdGFkaXIgYW5kIGxvY2Fsc3RhdGVkaXIgc3Vic3RpdHV0aW9ucwogICAgICAtZml4IGxheW91dCBuYW1lCiAgICAgIC1maXggbG9nZmlsZW5hbWUgbWlzc3BlbGxpbmcKICAgICAgLWZpeCBldmFsdWF0aW9uIG9mIGluc3RhbGxhdGlvbiBkaXIgdmFyaWFibGVzIGFuZAogICAgICAtcmVwbGFjZSAkZm9vYmFyIGJ5ICQoZm9vYmFyKSB0byBiZSB1c2VmdWxsIGluIHRoZSBtYWtlZmlsZQogICAgCiAgICBDcm9zcyBjb21waWxlOgogICAgCiAgICAgIC1hZGQgcnVsZXMgZm9yIGNyb3NzLWNvbXBpbGluZyBpbiBydWxlcy5tay4gT2theSwgcnVsZSB0byBjaGVjayBmb3IKICAgICAgICRDQ19GT1JfQlVJTEQgaXMgc3RpbGwgbWlzc2luZwogICAgICAtdXNlIENIRUNLX1RPT0wgaW5zdGVhZCBvZiBDSEVDS19QUk9HIGZvciByYW5saWIKICAgICAgLWFkZCBtaXNzaW5nICJBUj1AQVJAIiB0byBzZXZlcmFseSBNYWtlZmlsZS5pbidzCiAgICAgIC1jYWNoZSByZXN1bHQgZm9yICJzdHJ1Y3QgcmxpbWl0IgogICAgICAtY29tcGlsZSBhbGwgaGVscGVyIHByb2dyYW1zIHdpdGggbmF0aXZlIGFuZCBjcm9zcyBjb21waWxlcgogICAgICAgYW5kIHVzZSB0aGUgbmF0aXZlIHZlcnNpb24gdG8gZ2VuZXJhdGUgaGVhZGVyIGZpbGUKICAgICBbIlL8ZGlnZXIiIEt1aGxtYW5uIDxUYWR1QGdteC5kZT5dCgogICopIFByZXBhcmUgb3VyIGF1dG9jb25mIHNldHVwIGZvciBhdXRvY29uZiAyLjE0YSBhbmQgZm9yIGNyb3NzLQogICAgIGNvbXBpbGluZy4KICAgICBbIlL8ZGlnZXIiIEt1aGxtYW5uIDxUYWR1QGdteC5kZT5dCgogICopIEZpeCBhIGJ1ZyB3aGVyZSBhIGNsaWVudCB3aGljaCBvbmx5IHNlbmRzIFxuIHRvIGRlbGltaXQgaGVhZGVyCiAgICAgbGluZXMgKG5ldGNhdCkgZ2V0cyBhIHN0cmFuZ2UgbG9va2luZyBIVFRQX05PVF9JTVBMRU1FTlRFRCAKICAgICBtZXNzYWdlLiAgU3RhcnQgd29ya2luZyBvbiBlYmNkaWMgY28tZXhpc3RhbmNlIHdpdGggaW5wdXQgCiAgICAgZmlsdGVyaW5nLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgQW1lc10KCiAgKikgSWYgbW9kX3NvIGlzIGVuYWJsZWQgaW4gdGhlIHNlcnZlciBhbHdheXMgY3JlYXRlIGxpYmV4ZWMsIGV2ZW4KICAgICBpZiB0aGVyZSBhcmUgbm8gbW9kdWxlcyBpbnN0YWxsZWQgaW4gdGhpcyBkaXJlY3RvcnkuICBUaGlzIGlzIGEKICAgICByZXF1aXJlbWVudCBmb3IgQVBYUyB0byB3b3JrIGNvcnJlY3RseS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQ29ubmVjdGlvbiBvcmllbnRlZCBvdXRwdXQgZmlsdGVycyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgCiAgICAgY29ubl9yZWMgaW5zdGVhZCBvZiB0aGUgcmVxdWVzdF9yZWMuICBUaGlzIGFsbG93cyB1cyB0byBhZGQgdGhlCiAgICAgb3V0cHV0IGZpbHRlciBpbiB0aGUgcHJlLWNvbm5lY3Rpb24gcGhhc2UgaW5zdGVhZCBvZiB0aGUKICAgICBwb3N0X3JlYWRfcmVxdWVzdCBwaGFzZSwgd2hpY2gga2VlcHMgdXMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgYW4KICAgICBlcnJvciBwYWdlIGJlZm9yZSB3ZSBoYXZlIGEgZmlsdGVyIHRvIHdyaXRlIHRvIHRoZSBuZXR3b3JrLgogICAgIFtSeWFuIEJsb29tLCBKZWZmIFRyYXdpY2ssIGFuZCBHcmVnIEFtZXNdCgogICopIENsZWFuaW5nIHVwIGFuIG1tYXAgYnVja2V0IG5vIGxvbmdlciBkZWxldGVzIHRoZSBtbWFwLiAgQW4KICAgICBtbWFwIGNhbiBiZSB1c2VkIGFjcm9zcyBtdWx0aXBsZSBidWNrZXRzIChkZWZhdWx0X2hhbmRsZXIgd2l0aAogICAgIGJ5dGUgcmFuZ2VzLCBtb2RfZmlsZV9jYWNoZSwgbW9kX21tYXBfc3RhdGljKSwgc28gY2xlYW51cCBvZgogICAgIHRoZSBtbWFwIGl0c2VsZiBjYW4ndCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1Y2tldC4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgLmRsbCBjYWNoaW5nIGRpcmVjdGl2ZSBJU0FQSUNhY2hlRmlsZSB0byBtb2RfaXNhcGkuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmFkaWNhbCBzdXJnZXJ5IHRvIGltcHJvdmUgbW9kX2lzYXBpIHN1cHBvcnQgdW5kZXIgV2luMzIuCiAgICAgSW5jbHVkZXMgYSBudW1iZXIgb2YgbmV3ZXIgU2VydmVyU3VwcG9ydEZ1bmN0aW9uIGNhbGxzLCBzdXBwb3J0CiAgICAgZm9yIFJlYWRDbGllbnQgKGluIG9yZGVyIHRvIHJldHJpZXZlIFBPU1RzIGdyZWF0ZXIgdGhhbiA0OEtCKSwKICAgICBhbmQgZ2VuZXJhbCBidWcgZml4ZXMgdG8gbW9yZSByZWxpYWJseSBsb2FkIElTQVBJIC5kbGwncyBhbmQKICAgICBwcmV2ZW50IGxlYWtpbmcgaGFuZGxlIHJlc291cmNlcy4gIE5vdGU6IFRoZXJlIGFyZSBzdGlsbCAKICAgICBkaXNjcmVwYW5jaWVzIGJldHdlZW4gSUlTJ3MgYW5kIEFwYWNoZSdzIFNlcnZlclZhcmlhYmxlcywgYW5kCiAgICAgYXN5bmMgY2FsbHMgYXJlIHN0aWxsIG5vdCBzdXBwb3J0ZWQuICBBZGRpdGlvbmFsIHdhcm5pbmdzIGFyZQogICAgIGxvZ2dlZCB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZyBvZiB1bnN1cHBvcnRlZCBJU0FQSSBjYWxscy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgaW5wdXQgZmlsdGVyaW5nIHRvIEFwYWNoZS4gIFRoZSBiYXNpYyBpZGVhIGZvciB0aGUgaW5wdXQKICAgICBmaWx0ZXJzIGlzIHRoZSBzYW1lIGFzIHRoZSBpZGVhcyBmb3Igb3V0cHV0IGZpbHRlcnMuICBUaGUgYmlnZ2VzdAogICAgIGRpZmZlcmVuY2UgaXMgdGhhdCBpbnN0ZWFkIG9mIGNhbGxpbmcgYXBfcGFzc19icmlnYWRlLCBhcF9nZXRfYnJpZ2FkZQogICAgIHNob3VsZCBiZSBjYWxsZWQsIGFuZCB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIGZvciB0aGUgZmlsdGVyIGl0c2VsZiBpcwogICAgIGRpZmZlcmVudC4gIFdoZW4gd3JpdGluZyBhbiBvdXRwdXQgZmlsdGVyLCBhIGJyaWdhZGUgaXMgcGFzc2VkIGluLAogICAgIGFuZCBmaWx0ZXJzIG9wZXJhdGUgZGlyZWN0bHkgb24gdGhhdCBicmlnYWRlLCB3aGVuIGRvbmUsIHRoZXkgY2FsbAogICAgIGFwX3Bhc3NfYnJpZ2FkZS4gIElucHV0IGZpbHRlcnMgYXJlIHRoZSBleGFjdCBvcHBvc2l0ZS4gIEJlY2F1c2UgaW5wdXQKICAgICBpcyBub3QgYSBwdXNoIG9wZXJhdGlvbiwgZmlsdGVycyBmaXJzdCBjYWxsIGFwX2dldF9icmlnYWRlLiAgV2hlbiB0aGlzCiAgICAgZnVuY3Rpb24gcmV0dXJucywgdGhlIGlucHV0IGZpbHRlciB3aWxsIGJlIGxlZnQgd2l0aCBhIHZhbGlkIGJyaWdhZGUuCiAgICAgVGhlIGlucHV0IGZpbHRlciBzaG91bGQgdGhlbiBvcGVyYXRlIG9uIHRoZSBicmlnYWRlLCBhbmQgcmV0dXJuLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYnVpbGRpbmcgb24gQlNEL09TIHVzaW5nIGl0cyBuYXRpdmUgbWFrZS4gVGhlIGJ1aWxkIHN5c3RlbQogICAgIGZhbGxzIGJhY2sgdG8gdGhlIEJTRCAuaW5jbHVkZSBkaXJlY3RpdmUgb24gdGhhdCBob3N0IHBsYXRmb3JtLgogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEV4cGFuZCBkYm1tYW5hZ2UgdG8gYWxsb3cgLWQgLW0gLXMgLXAgb3B0aW9ucyBmb3IgQ3J5cHQsIE1ENSwKICAgICBTSEExIGFuZCBwbGFpbnRleHQgcGFzc3dvcmQgZW5jb2RpbmdzLiAgTWFrZSBmZWF0dXJlIHRlc3RzIGEKICAgICBiaXQgbW9yZSBmbGV4aWJsZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIENoYXJzZXQgdHJhbnNsYXRpb246IG1vZF9jaGFyc2V0X2xpdGUgaGFuZGxlcyBvdXRwdXQgY29udGVudCAKICAgICB0cmFuc2xhdGlvbiBpbiBhIGZpbHRlci4gIG1vZF9jaGFyc2V0X2xpdGUgbm8gbG9uZ2VyIGlnbm9yZXMgCiAgICAgc3VicmVxdWVzdHMuICBBIGJ1bmNoIG9mIGNydWZ0IHJlbGF0ZWQgdG8gQlVGRidzIHN1cHBvcnQgZm9yCiAgICAgdHJhbnNsYXRpbmcgcmVxdWVzdCBhbmQgcmVzcG9uc2UgYm9kaWVzIHdhcyByZW1vdmVkLiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTW92ZSB0aGUgYWRkaXRpb24gb2YgdGhlIENPUkUgZmlsdGVyIHRvIHRoZSBwb3N0X3JlYWRfcmVxdWVzdAogICAgIGhvb2sgaW4gaHR0cF9jb3JlLmMuICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgdG8gYWRkIHRoZSBmaWx0ZXIgaW4KICAgICBtdWx0aXBsZSBwbGFjZXMgYW5kIGFsbG93cyBmb3IgYW4gU1NMIG1vZHVsZSB0byBiZSBhZGRlZCBtdWNoCiAgICAgc2ltcGxlci4gW1J5YW4gQmxvb21dCgogICopIEZpeCBhIHNlY3VyaXR5IHByb2JsZW0gdGhhdCBhZmZlY3RzIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb2YKICAgICBtb2RfcmV3cml0ZS4gSWYgdGhlIHJlc3VsdCBvZiBhIFJld3JpdGVSdWxlIGlzIGEgZmlsZW5hbWUgdGhhdAogICAgIGNvbnRhaW5zIGV4cGFuc2lvbiBzcGVjaWZpZXJzLCBlc3BlY2lhbGx5IHJlZ2V4cCBiYWNrcmVmZXJlbmNlcwogICAgICQwLi4kOSBhbmQgJTAuLiU5LCB0aGVuIGl0IG1heSBiZSBwb3NzaWJsZSBmb3IgYW4gYXR0YWNrZXIgdG8KICAgICBhY2Nlc3MgYW55IGZpbGUgb24gdGhlIHdlYiBzZXJ2ZXIuIFtUb255IEZpbmNoXQoKICAqKSBGaXggYSBidWcgd2hlcmUgZXJyb3JzIHRoYXQgYXJlIGRldGVjdGVkIGR1cmluZyBlYXJseSByZXF1ZXN0IHBhcnNpbmcKICAgICBkb24ndCBwcm9kdWNlIHZpc2libGUgSFRUUCBlcnJvciBtZXNzYWdlcyBhdCB0aGUgYnJvd3NlciwgYmVjYXVzZQogICAgIHRoZSBjb3JlX2ZpbHRlciB3YXNuJ3QgcHJlc2VudC4gIFtHcmVnIEFtZXNdCgogICopIFByb3ZpZGUgYXByX3NvY2tsZW5fdCBhcyBhIHBvcnRhYmlsaXR5IGFpZC4gCiAgICAgW1ZpY3RvciAgSi4gT3JsaWtvd3NraV0KCiAgKikgT3ZlcmhhdWwgb2YgZGJtbWFuYWdlIHRvIGFsbG93IGEgZ3JvdXBzIGFyZyAoYXMgaW4gQXBhY2hlIDEuMikKICAgICBhcyB3ZWxsIGFzIGEgY29tbWVudCBhcmcgdG8gdGhlIGFkZCwgYWRkdXNlciBhbmQgdXBkYXRlIGNtZHMuCiAgICAgdXBkYXRlIGFsbG93cyB0aGUgdXNlciB0byBjbGVhciBvciBwcmVzZXJ2ZSBwdy9ncm91cHMvY29tbWVudC4KICAgICBGaXhlZCBhIGJ1ZyBpbiBkYm1tYW5hZ2UgdGhhdCBwcmV2ZW50ZWQgdGhlIGNoZWNrIG9wdGlvbiBmcm9tIAogICAgIHBhcnNpbmcgYSBwYXNzd29yZCBmb2xsb3dlZCBieSA6Z3JvdXAuLi4gdGV4dC4gIENvcnJlY3RlZCB0aGUKICAgICBzZWVkIGNhbGN1YWxhdGlvbiBmb3IgV2luMzIgc3lzdGVtcywgYW5kIGFkZGVkIC1sc2RibSBzdXBwb3J0LgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIENvbmZpZ3VyZWQgbW9kX2F1dGhfZGJtIHRvIGNvbXBpbGUgd2l0aCBzZGJtbGliIHVuZGVyIFdpbjMyLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEF2b2lkIGEgc2VnZmF1bHQgd2hlbiBwYXJzaW5nIC5odGFjY2VzcyBmaWxlcy4gIEFuIAogICAgIHVuaW5pdGlhbGl6ZWQgdHJlZSBwb2ludGVyIHdhcyBwYXNzZWQgdG8gYXBfYnVpbGRfY29uZmlnKCkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSB3YXkgdGhhdCBpbmV0X2FkZHIgJiBpbmV0X25ldHdvcmsgYXJlIGNoZWNrZWQgZm9yCiAgICAgaW4gQVBSJ3MgY29uZmlndXJlIHByb2Nlc3MgdG8gYWxsb3cgQmVPUyBCT05FIHRvIGNvcnJlY3RseQogICAgIGZpbmQgdGhlbS4gV2l0aCB0aGlzIGNoYW5nZSBCZU9TIEJPTkUgbm93IGJ1aWxkcyBmcm9tIHNvdXJjZQogICAgIHdpdGggbm8gcHJvYmxlbXMuICBbRGF2aWQgUmVpZF0KCiAgKikgRml4IGEgYnVnIGluIGFwcl9jcmVhdGVfcHJvY2VzcygpIGZvciBVbml4LiAgVGhlIE5VTEwgc2lnbmlmeWluZwogICAgIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlcnMgdG8gZXhlY3ZlKCkgd2FzIHN0b3JlZCBpbiB0aGUgd3JvbmcKICAgICBsb2NhdGlvbiwgb3ZlcmxheWluZyB0aGUgc3RvcmFnZSBiZXlvbmQgdGhlIG5ld2FyZ3NbXSBhcnJheSBhbmQgCiAgICAgYWxzbyBwYXNzaW5nIHVuaW5pdGlhbGl6ZWQgc3RvcmFnZSB0byBleGVjdmUoKSwgd2hpY2ggd291bGQgCiAgICAgc29tZXRpbWVzIGZhaWwgd2l0aCBFRkFVTFQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBidWcgcGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbmVycy4gIFdpdGggYSBzZXF1ZW5jZQogICAgIGxpa2UgdGhpcyBpbiB0aGUgY29uZmlnIGZpbGUKCiAgICAgICA8SWZNb2R1bGUgbW9kX2tpbHJveS5jPgogICAgICAgYW55IHN0dWZmCiAgICAgICA8L0lmTW9kdWxlPgogICAgICAgPElmTW9kdWxlIG1vZF9sb3Zlam95LmM+CiAgICAgICAoYmxhbmsgbGluZSkKICAgICAgIGFueSBzdHVmZgogICAgICAgPC9JZk1vZHVsZT4KCiAgICAgdGhlIHNlY29uZCBjb250YWluZXIgd291bGQgYmUgdGVybWluYXRlZCBhdCB0aGUgYmxhbmsgbGluZSBkdWUgdG8KICAgICBzZWRpbWVudCBpbiB0aGUgYnVmZmVyIGZyb20gcmVhZGluZyB0aGUgcHJpb3IgPC9JZk1vZHVsZT4gYW5kIGFuIAogICAgIGVycm9yIG1lc3NhZ2Ugd291bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgcmVhbCA8L0lmTW9kdWxlPiBmb3IgdGhlCiAgICAgc2Vjb25kIGNvbnRhaW5lci4gIEFsc28gZHVlIHRvIHRoaXMgcHJvYmxlbSwgYW55IHR3byBjaGFyYWN0ZXJzIAogICAgIGNvdWxkIGJlIHVzZWQgZm9yICI8LyIgaW4gdGhlIGNsb3NlIG9mIGEgY29udGFpbmVyLiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgYXBfYWRkX2ZpbHRlciBwcm90b3R5cGUgY2hhbmdlZCB0byByZW1vdmUgdGhlIGN0eCBwb2ludGVyLiAgVGhlCiAgICAgcG9pbnRlciBzdGlsbCByZW1haW5zIGluIHRoZSBmaWx0ZXIgc3RydWN0dXJlLCBidXQgaXQgY2FuIG5vdCBiZQogICAgIGEgcGFydCBvZiB0aGUgYXBfYWRkX2ZpbHRlciBwcm90b3R5cGUuICBUaGUgcmVhc29uIGlzIHRoYXQgd2hlbgogICAgIHRoZSBjb3JlIHVzZXMgQWRkRmlsdGVyIHRvIGFkZCBhIGZpbHRlciB0byB0aGUgc3RhY2sgaXQgZG9lc24ndAogICAgIGtub3cgaG93IHRvIGFsbG9jYXRlIHRoZSBjdHggcG9pbnRlciwgb3IgZXZlbiBob3cgbXVjaCBtZW1vcnkgc2hvdWxkCiAgICAgYmUgYWxsb2NhdGVkLiAgVGhlIGZpbHRlcnMgd2lsbCBoYXZlIHRvIGJlIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nCiAgICAgdGhlIGN0eCBtZW1vcnkgd2hlbiB0aGV5IG5lZWQgaXQuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCBhbiBBZGRGaWx0ZXIgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgdGFrZXMgYSBsaXN0IG9mIGZpbHRlcnMKICAgICB0aGF0IHNob3VsZCBiZSBhY3RpdmF0ZWQgZm9yIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCiAgICAgW1J5YW4gQmxvb21dCgogICopIGFwcl9zbnByaW50ZigpOiBHZXQgcXVhZCBmb3JtYXQgc3RyaW5ncyB3b3JraW5nIG9uIE9TLzM5MCAoYW5kIHBlcmhhcHMKICAgICBzb21lIG90aGVyIHBsYXRmb3JtcykuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb2RpZnkgbW9kX2luY2x1ZGUgdG8gYmUgYSBmaWx0ZXIuICBDdXJyZW50bHksIGl0IGhhcyBvbmx5IGJlZW4gdGVzdGVkCiAgICAgb24gYWN0dWFsIGZpbGVzLCBidXQgaXQgc2hvdWxkIHdvcmsgZm9yIENHSSBzY3JpcHRzIHRvby4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3B1dGMoKSwgYXByX3B1dHMoKSBmb3IgVW5peDogaGFuZGxlIGJ1ZmZlcmVkIGZpbGVzIGFuZCBpbnRlcnJ1cHRlZAogICAgIHdyaXRlcy4gIGFwcl9mbHVzaCgpIGZvciBVbml4OiBoYW5kbGUgaW50ZXJydXB0ZWQgd3JpdGVzLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIE5hbWVWaXJ0dWFsSG9zdCBjYW4gbm93IHRha2UgIioiIGFzIGFuIGFyZ3VtZW50IGluc3RlYWQgb2YKICAgICBhbiBJUCBhZGRyZXNzLiBUaGlzIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgcHVyZWx5IG5hbWUtYmFzZWQKICAgICB2aXJ0dWFsIGhvc3Rpbmcgc2VydmVyIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgSVAgYWRkcmVzc2VzIGluCiAgICAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgd2hpY2ggaWdub3JlcyB0aGUgbG9jYWwgYWRkcmVzcwogICAgIG9mIGFueSBjb25uZWN0aW9ucy4gUFIgIzU1OTUsIFBSICM0NDU1IFtUb255IEZpbmNoXQoKICAqKSBGaXggc29tZSBjb21waWxlIHdhcm5pbmdzIGluIG1vZF9tbWFwX3N0YXRpYy5jCiAgICAgW01pa2UgQWJib3R0IDxtamFAc2dpLmNvbT5dCgogICopIEZpeCBjaHVua2luZyBwcm9ibGVtIHdpdGggQ0dJIHNjcmlwdHMuICBUaGUgZ2VuZXJhbCBwcm9ibGVtIHdhcyB0aGF0CiAgICAgdGhlIENHSSBtb2R1bGVzIHdlcmUgYWRkaW5nIGFuIEVPUyBidWNrZXQgYW5kIHRoZW4gdGhlIGNvcmUgYWRkZWQgYW4KICAgICBFT1MgYnVja2V0LiAgVGhlIGNodW5raW5nIGZpbHRlciBmaW5hbGl6ZXMgdGhlIGNodW5rZWQgcmVzcG9uc2Ugd2hlbiBpdAogICAgIGVuY291bnRlcnMgYW4gRU9TIGJ1Y2tldC4gIEJlY2F1c2UgdHdvIEVPUyBidWNrZXRzIHdlcmUgc2VudCwgd2UKICAgICBmaW5hbGl6ZWQgdGhlIHJlc3BvbnNlIHR3aWNlLiAgVGhlIGZpeCBpcyB0byBtYWtlIHN1cmUgd2Ugb25seSBzZW5kIG9uZQogICAgIEVPUywgYnkgdXRpbGl6aW5nIGEgZmxhZyBpbiB0aGUgcmVxdWVzdF9yZWMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIGFwcl9wdXRfb3NfZmlsZSgpIG5vdyBzZXRzIHVwIHRoZSB1bmdldCBieXRlIGFwcHJvcHJpYXRlbHkgb24gVW5peAogICAgIGFuZCBXaW4zMi4gIFByZXZpb3VzbHksIHRoZSBmaXJzdCByZWFkIGZyb20gYW4gYXByX2ZpbGVfdCBzZXQgdXAgdmlhCiAgICAgYXByX3B1dF9vc19maWxlKCkgd291bGQgcmV0dXJuIGEgJ1wwJy4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vZF9jZ2lkIG5vdyBjcmVhdGVzIGEgc2luZ2xlIGVsZW1lbnQgYnVja2V0IGJyaWdhZGUsIHdpdGggYSBwaXBlCiAgICAgYnVja2V0LCBpbnN0ZWFkIG9mIHVzaW5nIEJVRkYncyBhbmQgYXBfciouCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFQUlZBUlMuaW4gbm8gbG9uZ2VyIG92ZXJ3cml0ZXMgdGhlIEVYVFJBX0xJQlMgdmFyaWFibGUuCiAgICAgW01pa2UgQWJib3R0IDxtamFAc2dpLmNvbT5dCgogICopIFJlbW92ZSBhcF9ib3BlbmYgZnJvbSBidWZmIGNvZGUuICBUaGlzIHJlcXVpcmVkIG1vZGlmeWluZyB0aGUgZmlsZV9jYWNoZQogICAgIGNvZGUgdG8gdXNlIEFQUiBmaWxlJ3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIEJVRkZzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggY29tcGlsZSBicmVhayBvbiBzb21lIHBsYXRmb3JtcyBmb3IgbW9kX21pbWVfbWFnaWMuYwogICAgIFtKb2huIEsuIFN0ZXJsaW5nIDxzdGVybGluZ0Bjb3ZhbGVudC5uZXQ+XQoKICAqKSBGaXggbWVyZ2luZyBvZiBBZGREZWZhdWx0Q2hhcnNldCBkaXJlY3RpdmUuCiAgICAgUFIgIzU4NzIgKDEuMykgW0p1biBLdXJpeWFtYSA8a3VyaXlhbWFAaW1nc3JjLmNvLmpwPl0KCiAgKikgTWlub3IgcmV2YW1wIG9mIHRoZSBybGltaXQgc2VjdGlvbnMgb2YgY29kZS4gV2Ugbm93IHRlc3QKICAgICBleHBsaWNpdGx5IGZvciBzZXRybGltaXQgYW5kIGdldHJsaW1pdC4gQWxzbywgdW5peGRfc2V0X3JsaW1pdCgpCiAgICAgaXMgbm93ICJhdmFpbGFibGUiIGV2ZW4gaWYgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAogICAgIHRoZSBybGltaXQgZmFtaWx5IChpdCdzIGp1c3QgYSBub29wIHRob3VnaCkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBNaWdyYXRlIHRoZSBwcmUtc2VsZWN0aW9uIG9mIHdoaWNoIE1QTSB0byB1c2UgZm9yIHNwZWNpZmljCiAgICAgcGxhdGZvcm1zIHRvIGhpbnRzLm00LCB3aGljaCBjb250YWlucyAob3Igc2hvdWxkIGNvbnRhaW4pCiAgICAgYWxsIHBsYXRmb3JtIHNwZWNpZmljICJoaW50cyIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZW1vdmUgSU9McyBmcm9tIEFwYWNoZS4gIFdpdGggZmlsdGVyaW5nLCBJT0xzIGFyZSBubyBsb25nZXIgbmVjZXNzYXJ5CiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCB0YWJsZXMgd2l0aCBub24tc3RyaW5nL2JpbmFyeSB2YWx1ZXMgdG8gQVBSLgogICAgIFtLZW4gQ29hcl0KCiAgKikgRml4IHNvbWUgYmFkIGNhbGxzIHRvIGFwX2xvZ19yZXJyb3IoKSBpbiBtb2RfcmV3cml0ZS4gCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgVXBkYXRlIFBDUkUgdG8gdmVyc2lvbiAzLjIuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2hhbmdlIHRoZSB3YXkgYnVja2V0cycgZGVzdHJveSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBzbyB0aGF0CiAgICAgdGhleSBjYW4gYmUgbW9yZSBkaXJlY3RseSB1c2VkIHdoZW4gY2hhbmdpbmcgdGhlIHR5cGUgb2YgYQogICAgIGJ1Y2tldCBpbiBwbGFjZS4gW1RvbnkgRmluY2hdCgogICopIEFkZCBnZW5lcmljIHN1cHBvcnQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyB0aGUgcmVzb3VyY2VzIHVzZWQgYnkKICAgICBidWNrZXRzLCBhbmQgYWx0ZXIgdGhlIEhFQVAgYW5kIE1NQVAgYnVja2V0cyB0byB1c2UgaXQuIENoYW5nZQogICAgIHRoZSB3YXkgYnVja2V0cyBhcmUgaW5pdGlhbGlzZWQgdG8gc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHlwZSBvZgogICAgIGJ1Y2tldHMgaW4gcGxhY2UsIGFuZCB1c2UgaXQgd2hlbiBzZXR0aW5nIGFzaWRlIFRSQU5TSUVOVCBidWNrZXRzLgogICAgIENoYW5nZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgVFJBTlNJRU5UIGJ1Y2tldHMgc28gdGhhdCBpdCBjYW4gYmUKICAgICBtb3N0bHkgc2hhcmVkIHdpdGggSU1NT1JUQUwgYnVja2V0cywgd2hpY2ggYXJlIG5vdyBpbXBsZW1lbnRlZC4KICAgICBbVG9ueSBGaW5jaF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTYKCiAgKikgQWRkIHN1cHBvcnQgdG8gQXBhY2hlIGFuZCBBUFIgZm9yIGRzb3Mgb24gT1MvMzkwLiAgW0dyZWcgQW1lc10KCiAgKikgQWRkIGEgY2h1bmtpbmcgZmlsdGVyIHRvIEFwYWNoZS4gIFRoaXMgYnJpbmdzIHVzIG9uZSBzdGVwIGNsb3NlcgogICAgIHRvIHJlbW92aW5nIEJVRkYuIFtSeWFuIEJsb29tXQoKICAqKSBhcF9hZGRfZmlsdGVyIG5vdyBhZGRzIGZpbHRlcnMgaW4gYSBMSUZPIGZhc2hpb24uICBUaGUgZmlyc3QgZmlsdGVyCiAgICAgYWRkZWQgdG8gdGhlIHN0YWNrIGlzIHRoZSBsYXN0IGZpbHRlciB0byBiZSBjYWxsZWQuICBbUnlhbiBCbG9vbV0KCiAgKikgQXBhY2hlIDIuMCBoYXMgYmVlbiBjb21wbGV0ZWx5IGRvY3VtZW50ZWQgdXNpbmcgU2NhbmRvYy4gIFRoZQogICAgIGRvY3MgY2FuIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nICdtYWtlIGRvY3MnLiAgW1J5YW4gQmxvb21dCgogICopIEFkZCBmaWx0ZXJlZCBJL08gdG8gQXBhY2hlLiAgVGhpcyBpcyBiYXNlZCBvbiBidWNrZXQgYnJpZ2FkZXMsCiAgICAgQ3VycmVudGx5IHRoZSBidWNrZXRzIHN0aWxsIHVzZSBCVUZGIHVuZGVyIHRoZSBjb3ZlcnMsIGJ1dCB0aGF0CiAgICAgc2hvdWxkIGNoYW5nZSBxdWlja2x5LiAgVGhlIG9ubHkgY3VycmVudGx5IHdyaXR0ZW4gZmlsdGVyIGlzIHRoZQogICAgIGNvcmUgZmlsdGVyIHdoaWNoIGp1c3QgY2FsbHMgYXBfYndyaXRlLiAgW1RoZSBBcGFjaGUgR3JvdXBdCgogICopIEFQUiBsb2NrcyBvbiBVbml4OiBMZXQgQVBSX0xPQ0tBTEwgbG9ja3Mgd29yayB3aGVuIEFQUiBpc24ndAogICAgIGJ1aWx0IHdpdGggdGhyZWFkIHN1cHBvcnQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBYm9ydCBjb25maWd1cmF0aW9uIGlmIC0td2l0aC1sYXlvdXQgd2FzIHNwZWNpZmllZCBhbmQgdGhlcmUncwogICAgIG5vIGxheW91dCBkZWZpbml0aW9uIGZpbGUuICBbS2VuIENvYXJdCgogICopIEFkZCBzdXBwb3J0IGZvciAnLS13aXRoLXBvcnQ9bicgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGV4dGVuc2lvbiBtZXRob2RzIGZvciB0aGUgQWxsb3cgcmVzcG9uc2UgaGVhZGVyCiAgICAgZmllbGQsIGFuZCBhbiBBUEkgcm91dGluZSBmb3IgYWNjZXNzaW5nIHItPmFsbG93ZWQgYW5kIHRoZQogICAgIGxpc3Qgb2YgZXh0ZW5zaW9uIG1ldGhvZHMgaW4gYSB1bmlmaWVkIG1hbm5lci4gIFtLZW4gQ29hcl0KCiAgKikgbW9kX2Nlcm5fbWV0YTogZml4IGJyb2tlbiBmaWxlIHJlYWRpbmcgbG9vcCBpbiBzY2FuX21ldGFfZmlsZSgpLgogICAgIFtSb2IgU2ltb25zb24gPHNpbW9AdXMuaWJtLmNvbT5dCgogICopIEdldCB4bGF0ZSBidWlsZHMgd29ya2luZyBhZ2Fpbi4gIFRoZSBhcHIgcmVuYW1pbmcgaW4gMi4wYTUgYnJva2UKICAgICBBUEFDSEVfWExBVEUgYnVpbGRzLiAgW0plZmYgVHJhd2lja10KCiAgKikgQSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZyBwcm9ibGVtIHdhcyBmaXhlZC4gIFdoZW4gdGhlIAogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBzdGFydGVkIHdpdGggYW4gSWZNb2R1bGUvSWZEZWZpbmUgY29udGFpbmVyLCAKICAgICBvbmx5IHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgY29udGFpbmVyIHdvdWxkIGJlIHJldGFpbmVkLiAgCiAgICAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTUKCiAgKikgUGVyY2hpbGQgaXMgc2VydmluZyBwYWdlcyBhZnRlciBwYXNzaW5nIHRoZW0gdG8gZGlmZmVyZW50IGNoaWxkCiAgICAgcHJvY2Vzc2VzLiAgVGhlcmUgYXJlIHN0aWxsIGEgbG90IG9mIGJ1Z3MsIGJ1dCB0aGlzIGRvZXMgd29yay4gIEkKICAgICBoYXZlIG1hZGUgcmVxdWVzdHMgYWdhaW5zdCB0aGUgc2FtZSBpbnN0YWxsYXRpb24gb2YgQXBhY2hlLCBhbmQgaGFkCiAgICAgZGlmZmVyZW50IHNlcnZlcnMgdXNlIGRpZmZlcmVudCB1c2VyIElEcyB0byBzZXJ2ZSB0aGUgcmVzcG9uc2VzLgogICAgIFRoaXMgY2hhbmdlIG1vdmVzIHRvIHVzaW5nIHNvY2tldHBhaXIgaW5zdGVhZCBvZiBhbiBBRl9VTklYIHNvY2tldC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUGVyY2hpbGQgTVBNIHN0aWxsIGRvZXNuJ3Qgd29yayBwZXJmZWN0bHksIGJ1dCBpdCBpcyBzZXJ2aW5nIHBhZ2VzLgogICAgIEl0IGNhbid0IHNlZW0gdG8gcGFzcyBiZXR3ZWVuIGNoaWxkIHByb2Nlc3NlcyB5ZXQsIGJ1dCBJIHRoaW5rIHdlCiAgICAgYXJlIGNsb3NlciBub3cgdGhhbiBiZWZvcmUuICBUaGlzIG1vdmVzIHVzIGJhY2sgdG8gdXNpbmcgVW5peAogICAgIERvbWFpbiBTb2NrZXRzLiAgW1J5YW4gQmxvb21dCgogICopIGxpYmFwciBmdW5jdGlvbnMgYW5kIHR5cGVzIHJlbmFtZWQgd2l0aCBhcHJfIHByZWZpeC4KICAgICAjaW5jbHVkZSAiYXByX2NvbXBhdC5oIiBmb3IgMS4zLnggYmFja3dhcmRzIGNvbXBhdAogICAgIFtQZXJsXQoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBBUFIgc29ja2FkZHIgaGFuZGxpbmcgb24gV2luMzIuICBJdCBkaWRuJ3QgYWx3YXlzCiAgICAgcmV0dXJuIHRoZSByaWdodCBpbmZvcm1hdGlvbiBvbiB0aGUgbG9jYWwgc29ja2V0IGFkZHJlc3MuCiAgICAgW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xsc0BsZXZlbDguY29tPl0KCiAgKikgYXBfcmVjdigpIG9uIFdpbjMyOiBTZXQgYnl0ZXMtcmVhZCB0byAwIG9uIGVycm9yLiAgCiAgICAgW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xsc0BsZXZlbDguY29tPl0KCiAgKikgQWRkIGFuIG9wdGlvbiB0byBub3QgZGV0YWNoIGZyb20gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIHdpdGhvdXQKICAgICBnb2luZyBpbnRvIHNpbmdsZSBwcm9jZXNzIG1vZGUuICBUaGlzIGFsbG93cyBmb3IgbXVjaCBlYXNpZXIKICAgICBkZWJ1Z2dpbmcgb2YgdGhlIHByb2Nlc3Mgc3RhcnR1cCBjb2RlLiBbUnlhbiBCbG9vbV0KCiAgKikgYWI6IGRvbid0IHVzZSBwZXJyb3IoKSB0byByZXBvcnQgdGhlIGZhaWx1cmUgb2YgYW4gQVBSIGZ1bmN0aW9uLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgZGV4dGVyLCBtcG10X3B0aHJlYWQsIGFuZCBwZXJjaGlsZCBNUE1zIG5vdCBkZXN0cm95IHRoZQogICAgIHNjb3JlYm9hcmQgb24gZ3JhY2VmdWwgcmVzdGFydHMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBzZWdmYXVsdC9TSUdTRUdWIHdoZW4gcnVubmluZyBnemlwIGZyb20gbW9kX21pbWVfbWFnaWMuYy4KICAgICBBbiBpbnZhbGlkIGFwX3Byb2NfdCB3YXMgcGFzc2VkIHRvIGFwX2NyZWF0ZV9wcm9jZXNzKCkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWxsb3cgbW9kdWxlcyB0byByZWdpc3RlciBmaWx0ZXJzLiAgVGhvc2UgZmlsdGVycyBhcmUgc3RpbGwKICAgICBuZXZlciBjYWxsZWQsIGJ1dCB0aGlzIGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgogICAgIFtSeWFuIEJsb29tIGFuZCBHcmVnIFN0ZWluXQoKICAqKSBSZWdpc3RlciB0aGUgbW9kX2NnaWQgZGFlbW9uIHByb2Nlc3MgZm9yIGNsZWFudXAgc28gdGhhdCBpdCBpcwogICAgIGtpbGxlZCBhdCB0ZXJtaW5hdGlvbiBpZiBpdCBkb2VzIG5vdCBkaWUgd2hlbiB0aGUgcGFyZW50IGdldHMKICAgICBTSUdURVJNLiAgVGhpcyBjaGFuZ2UgaXMgdG8gZml4IG9jY2FzaW9uYWwgcHJvYmxlbXMgd2hlcmUgdGhlCiAgICAgcHJvY2VzcyBzdGF5cyBhcm91bmQuICBCdWdzIGluIHNpbWlsYXIgbG9naWMgaW4gbW9kX3Jld3JpdGUgYW5kCiAgICAgbW9kX2luY2x1ZGUgd2VyZSBhbHNvIGZpeGVkLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIGluIHRoZSB0aW1lIGhhbmRsaW5nLiAgQmFzaWNhbGx5LCB3ZSB3ZXJlIGltcGxvZGluZyBhIHRpbWUKICAgICBpbiBhcF9wYXJzZUhUVFBkYXRlLCBidXQgaXQgaGFkIGJvZ3VzIGRhdGEgaW4gdGhlIGV4cGxvZGVkIHRpbWUgZm9ybWF0LgogICAgIE5hbWVseSwgdG1fdXNlYyBhbmQgdG1fZ210b2ZmIHdlcmUgbm90IGZpbGxlZCBvdXQuICBhcF9pbXBsb2RlX3RpbWUKICAgICB1c2VzIHRob3NlIHR3byBmaWVsZHMgdG8gYWRqdXN0IHRoZSB0aW1lIHZhbHVlLiAgQmVjYXVzZSBvZiB0aGUgSFRUUAogICAgIHNwZWMsIGJvdGggb2YgdGhvc2UgdmFsdWVzIGNhbiBiZSB6ZXJvJ2VkIG91dCBzYWZlbHkuICBUaGlzIGZpeGVzCiAgICAgdGhlIGJ1ZyBjb3JyZWN0bHkuICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGEgY291cGxlIG9mIHBsYWNlIGluIHRoZSBXaW5kb3dzIGNvZGUgd2hlcmUgdGhlIHdyb25nIGVycm9yCiAgICAgY29kZSB3YXMgYmVpbmcgcmV0dXJuZWQuIFtHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHNAbGV2ZWw4LmNvbT5dCgogICopIEZpeCBQT09MX0RFQlVHIChhdCBsZWFzdCBmb3IgcHJlZm9yayBtcG0pLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIHRoZSBBUFJfRU9MX1NUUiBtYWNybyBmb3IgcGxhdGZvcm0gZGVwZW5kZW50IGRpZmZlcmVuY2VzIGluIAogICAgIGxvZ2ZpbGVzIGFuZCBvdGhlciByYXcgdGV4dCAoc3VjaCBhcyBhbGwgQVBSIGZpbGVzKS4gIEZpeGVzIGxvZ2ZpbGVzCiAgICAgbm90IHRlcm1pbmF0ZWQgd2l0aCBjci9sZiBzZXF1ZW5jZXMgaW4gV2luMzIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNb3ZlIGFsbCBzdHJpbmdzIGZ1bmN0aW9ucyBpbiBBUFIgdG8gc3JjL2xpYi9hcHIvc3RyaW5ncyBhbmQgY3JlYXRlCiAgICAgYXByX3N0cmluZ3MuaCBmb3IgdGhlIHByb3RvdHlwZXMuIFtSeWFuIEJsb29tXQoKICAqKSBBUFIgbG9jayBmaXhlczogd2hlbiB1c2luZyBTeXNWIHNlbXMsIGZsb2NrKCksIG9yIGZjbnRsKCksIGJlIHN1cmUKICAgICB0byByZXBlYXQgdGhlIHN5c2NhbGwgdW50aWwgd2Ugc3RvcCBnZXR0aW5nIEVJTlRSLiAgSSBub3RpY2VkIGEKICAgICByZWxhdGVkIHByb2JsZW0gYXQgdGVybWluYXRpb24gKFNJR1RFUk0pIG9uIEZyZWVCU0Qgd2hlbiB1c2luZwogICAgIGZjbnRsKCkuICBBcGFjaGUgMS4zIGhhZCB0aGVzZSBuZXcgbG9vcHMgdG9vLiAgQWxzbywgbWFrZSB0aGUgZmxvY2soKSAKICAgICBpbXBsZW1lbnRhdGlvbiB3b3JrIHByb3Blcmx5IHdpdGggY2hpbGQgaW5pdC4gIFByZXZpb3VzbHksIGFwX2xvY2soKQogICAgIHdhcyBlc3NlbnRpYWxseSBhIG5vLW9wIGJlY2F1c2UgYWxsIGNoaWxkcmVuIHdlcmUgdXNpbmcgZGlmZmVyZW50CiAgICAgbG9ja3MgYW5kIHRodXMgbm9ib2R5IGV2ZXIgYmxvY2tlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIFRoZSBodGRvY3MvIHRyZWUgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSBDVlMgc291cmNlIHRyZWUgaW50bwogICAgIGEgc2VwYXJhdGUgYXJlYSBmb3IgZWFzaWVyIGRldmVsb3BtZW50LiAgVGhpcyBoYXMgTk8gRUZGRUNUIG9uCiAgICAgZW5kLXVzZXJzIG9yIEFwYWNoZSBpbnN0YWxsYXRpb25zLiAgW0tlbiBDb2FyXQoKICAqKSBJbnRlZ3JhdGUgdGhlIG1vZF9kYXYgbW9kdWxlIGZvciBXZWJEQVYgcHJvdG9jb2wgaGFuZGxpbmcuIFRoaXMKICAgICBhZGRzIHRoZSBkYXYgYW5kIGRhdl9mcyBtb2R1bGVzLCB0aGUgU0RCTSBsaWJyYXJ5LCBhbmQgYWRkaXRpb25hbAogICAgIFhNTCBoYW5kbGluZyB1dGlsaXRpZXMuIFtHcmVnIFN0ZWluXQoKICAqKSBDbGVhbiBvdXQgb2Jzb2xldGUgbmFtZXMgKGZyb20gaHR0cGQuaCkgZm9yIHRoZSBIVFRQIFN0YXR1cyBDb2RlcwogICAgIFtHcmVnIFN0ZWluXQoKICAqKSBVcGRhdGUgdGhlIGxpYi9leHBhdC1saXRlLyBsaWJyYXJ5IChicmluZyBmb3J3YXJkIGNoYW5nZXMgZnJvbQogICAgIHRoZSBBcGFjaGUgMS4zIHJlcG9zaXRvcnkpLiBbR3JlZyBTdGVpbl0KCiAgKikgSWYgc2l6ZW9mKGxvbmcgbG9uZykgPT0gc2l6ZW9mKGxvbmcpLCB0aGVuIHByZWZlciBsb25nIGluIEFQUgogICAgIGNvbmZpZ3VyZS5pbi4gIFtEYXZlIEhpbGwgPGRkaGlsbEB6azMuZGVjLmNvbT5dCgogICopIEFkZCBhcF9zZW5kZmlsZSBmb3IgVHJ1NjQgVW5peC4gIEFsc28sIGFkZCBhbiBlcnJvciBtZXNzYWdlIGZvcgogICAgIG1hY2hpbmVzIHdoZXJlIHNlbmRmaWxlIGlzIGRldGVjdGVkLCBidXQgbm9ib2R5IGhhcyB3cml0dGVuIGFwX3NlbmRmaWxlLgogICAgIFtEYXZlIEhpbGwgPGRkaGlsbEB6azMuZGVjLmNvbT5dCgogICopIENvbXBpbGUgZml4ZXMgaW4gbW9kX21tYXBfc3RhdGljLiAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBhYiB3b3VsZCBzdGFydCB1cCBtb3JlIGNvbm5lY3Rpb25zIHRoYW4gbmVlZGVkLCB0aGVuIHF1aXQgd2hlbiB0aGUKICAgICBkZXNpcmVkIG51bWJlciB3ZXJlIGZpbmlzaGVkLiBBbHNvIGZpeGVkIGEgbG9naWMgZXJyb3IgaW52b2x2aW5nCiAgICAgYWIga2VlcGFsaXZlcy4gIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KCiAgKikgV2luTlQ6IEltcGxlbWVudCBub24tYmxvY2tpbmcgcGlwZXMgd2l0aCB0aW1lb3V0cyB0byBjb21tdW5pY2F0ZQogICAgIHdpdGggQ0dJcy4gQXBhY2hlIDIuMGE0IGhhZCBub24tYmxvY2tpbmcgcGlwZXMgYnV0IHdpdGhvdXQgCiAgICAgdGltZW91dHMgKGkuZSwgaWYgYSB0aW1lb3V0IHdhcyBzcGVjaWZpZWQsIHRoZSBwaXBlIHJldmVydGVkIHRvCiAgICAgYSBmdWxsIGJsb2NraW5nIHBpcGUpLiBOb3cgdGhlIGJlaGF2aW91ciBpcyBtb3JlIGluIGxpbmUgd2l0aAogICAgIFVuaXggbm9uLWJsb2NraW5nIHBpcGVzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW5OVDogSW1wbGVtZW50IGFjY2VwdCBzb2NrZXQgcmV1c2UuIFVzaW5nIG1vZF9maWxlX2NhY2hlIHRvCiAgICAgY2FjaGUgb3BlbiBmaWxlIGhhbmRsZXMgYWxvbmcgd2l0aCBhY2NlcHQgc29ja2V0IHJldXNlIGVuYWJsZXMKICAgICBBcGFjaGUgMi4wIHRvIHNlcnZlIG5vbi1rZWVwYWxpdmUgcmVxdWVzdHMgZm9yIHN0YXRpYyBmaWxlcyBhdAogICAgIDN4IHRoZSByYXRlIG9mIEFwYWNoZSAxLjMuKGUuZywgQXBhY2hlIDEuMyB3aWxsIHNlcnZlIDQwMCBycHMKICAgICBhbmQgQXBhY2hlIDIuMCB3aWxsIHNlcnZlIGFsbW9zdCAxMjAwIHJwcyBvbiBteSBzeXN0ZW0pLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBNZXJnZSBtb2RfbW1hcF9zdGF0aWMgZnVuY3Rpb24gaW50byBtb2RfZmlsZV9jYWNoZS4gbW9kX2ZpbGVfY2FjaGUKICAgICBzdXBwb3J0cyB0d28gY29uZmlnIGRpcmVjdGl2ZXMsIG1tYXBmaWxlIChzYW1lIGJlaGF2aW91cyBhcwogICAgIG1vZF9tbWFwX3N0YXRpYykgYW5kIGNhY2hlZmlsZS4gVXNlIHRoZSBjYWNoZWZpbGUgZGlyZWN0aXZlCiAgICAgdG8gY2FjaGUgb3BlbiBmaWxlIGhhbmRsZXMuIFRoaXMgZGlyZWN0aXZlIG9ubHkgd29ya3Mgb24gc3lzdGVtcwogICAgIHRoYXQgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgYXBfc2VuZGZpbGUgQVBJLiBjYWNoZWZpbGUgd29ya3MgdG9kYXkKICAgICBvbiBXaW5kb3dzIE5ULCBidXQgaGFzIG5vdCBiZWVuIHRlc3RlZCBvbiBhbnkgZmxhdm9ycyBvZiBVbml4LgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBDbGVhbnVwIHRoZSBjb25maWd1cmF0aW9uLiAgV2l0aCB0aGUgbGFzdCBmZXcgY2hhbmdlcyB0aGUKICAgICBjb25maWd1cmF0aW9uIHByb2Nlc3MgYXV0b21hdGljYWxseToKICAgICAgICAgaW5oZXJpdHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGJ1aWxkIGZyb20gQVBSLiAgQWxsb3dpbmcKICAgICAgICAgQVBSIHRvIGluZm9ybSBBcGFjaGUgdGhhdCBpdCBzaG91bGQgb3Igc2hvdWxkIG5vdCB1c2UgLWxkbAogICAgICAgIAogICAgICAgICBEZXRlY3RzIHdoaWNoIG1vZF9jZ2kgc2hvdWxkIGJlIHVzZWQgbW9kX2NnaSBvciBtb2RfY2dpZCwKICAgICAgICAgYmFzZWQgb24gdGhlIHRocmVhZGluZyBtb2RlbAoKICAgICAgICAgQXBhY2hlIGNhbGxzIEFQUidzIGNvbmZpZ3VyZSBwcm9jZXNzIGJlZm9yZSBmaW5pc2hpbmcgaXQncwogICAgICAgICBjb25maWd1cmF0aW9uIHByb2Nlc3NpbmcsIGFsbG93aW5nIGZvciBtb3JlIGluZm9ybWF0aW9uIGZsb3cKICAgICAgICAgYmV0d2VlbiB0aGUgdHdvLgogICAgIFtSeWFuIEJsb29tXQogICAgICAgICAKCiAgKikgQ2hhbmdlIFVuaXggYW5kIFdpbjMyIGFwX3NldHNvY2tvcHQoKSBzbyB0aGF0IEFQUl9TT19OT05CTE9DSwogICAgIHdpdGggbm9uLXplcm8gYXJndW1lbnQgbWFrZXMgdGhlIHNvY2tldCBub24tYmxvY2tpbmcuICBCZU9TIGFuZAogICAgIE9TLzIgYWxyZWFkeSB3b3JrZWQgdGhpcyB3YXkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcF9jbG9zZSgpIG5vdyBjYWxscyBhcF9mbHVzaCgpIGZvciBidWZmZXJlZCBmaWxlcywgc28gd3JpdGUKICAgICBvcGVyYXRpb25zIHdvcmsgYSB3aG9sZSBsb3QgYmV0dGVyIG9uIGJ1ZmZlcmVkIGZpbGVzLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBlcnJvciBtZXNzYWdlcyBpc3N1ZWQgZnJvbSBNUE1zIHdoaWNoIGV4cGxhaW4gd2hlcmUgdG8gY2hhbmdlCiAgICAgY29tcGlsZWQtaW4gbGltaXRzIChlLmcuLCBUaHJlYWRzUGVyQ2hpbGQsIE1heENsaWVudHMsIFN0YXJ0VHJlYWRzKS4KICAgICBbR3JlZyBBbWVzXQoKICAqKSBhcF9jcmVhdGVfcGlwZSgpIG5vdyBsZWF2ZXMgcGlwZXMgaW4gYmxvY2tpbmcgc3RhdGUuICAoVGhpcyBoZWxwcyAKICAgICByZWR1Y2UgdGhlIG51bWJlciBvZiBzeXNjYWxscyBvbiBVbml4LikgIGFwX3NldF9waXBlX3RpbWVvdXQoKSBpcwogICAgIG5vdyB0aGUgd2F5IHRoYXQgdGhlIGJsb2NraW5nIHN0YXRlIG9mIGEgcGlwZSBpcyBtYW5pcHVsYXRlZC4KICAgICBhcF9ibG9ja19waXBlKCkgaXMgZ29uZS4gIFtKZWZmIFRyYXdpY2tdCgogICopIENvcnJlY3QgdGhlIHByb2JsZW0gd2hlcmUgdGhlIG9ubHkgbG9jYWwgaG9zdCBuYW1lIHRoYXQgdGhlIElQIHN0YWNrCiAgICAgY2FuIGRpc2NvdmVyIGFyZSAndW5kb3R0ZWQnIHByaXZhdGUgbmFtZXMuICBJZiBubyBmdWxseSBxdWFsaWZpZWQKICAgICBkb21haW4gbmFtZSBjYW4gYmUgaWRlbnRpZmllZCwgdGhlIGRlZmF1bHQgU2VydmVyTmFtZSB3aWxsIGJlIHNldCB0bwogICAgIHRoZSBtYWNoaW5lJ3MgSVAgYWRkcmVzcyBzdHJpbmcuIEEgd2FybmluZyBpcyBhbHdheXMgcHJvdmlkZWQgaWYgdGhlCiAgICAgU2VydmVyTmFtZSBub3Qgc3BlY2lmaWVkLCBidXQgYXNzdW1lZC4gIFNvbHZlcyBQUjYyMTUgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmVwYWlyIHByb2JsZW1zIHdpdGggY29uZmlnIGZpbGUgcHJvY2Vzc2luZyB3aGljaCBjYXVzZWQgc2VnZmF1bHQKICAgICBhdCBpbml0IHdoZW4gdmlydHVhbCBob3N0cyB3ZXJlIGRlZmluZWQgYW5kIHdoaWNoIGNhdXNlZCBTZXJ2ZXJOYW1lIHRvCiAgICAgYmUgaWdub3JlZCB3aGVuIHRoZXJlIHdhcyBubyB2YWxpZCBETlMgc2V0dXAuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZW1vdmVkIHBvaW50bGVzcyBhcF9pc19hYm9ydGVkIG1hY3JvIGZ1bmN0aW9uLiBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgYXBfc2VuZGZpbGUgaW1wbGVtZW50YXRpb24gZm9yIEFJWAogICAgIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KCiAgKikgUmVwYWlyIEMrKyBjb21wYXRpYmlsaXR5IGluIGFwX2NvbmZpZy5oLCBhcHJfZmlsZV9pby5oLCAKICAgICBhcHJfbmV0d29ya19pby5oLCBhbmQgYXByX3RocmVhZF9wcm9jLmguICAKICAgICBbVHlsZXIgSi4gQnJvb2tzIDx0eWxlcmpicm9va3NAaG9tZS5jb20+LCBKZWZmIFRyYXdpY2tdCgogICopIEJyaW5nIHRoZSBhbGxvY2F0aW9uIGFuZCBwb29sIGRlYnVnZ2luZyBjb2RlIGJhY2sgaW50byBhIHdvcmtpbmcKICAgICBzdGF0ZS4gIFRoaXMgd2lsbCBuZWVkIHRvIGJlIHRlc3RlZCBhcyBzbyBmYXIgaXQncyBvbmx5IGJlZW4gdXNlZCBvbgogICAgIEJlT1MuIFtEYXZpZCBSZWlkXQoKICAqKSBDaGFuZ2UgY29uZmlndXJhdGlvbiBjb21tYW5kIHNldHVwIHRvIGJlIHByb3Blcmx5IHR5cGVzYWZlIHdoZW4gaW4KICAgICBtYWludGFpbmVyIG1vZGUuIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgY29tcGlsZXIgdGhhdCBjYW4gaW5pdGlhbGlzZQogICAgIHVuaW9ucy4gW0JlbiBMYXVyaWVdCgogICopIFR1cm4gb24gYnVmZmVyaW5nIGZvciBjb25maWcgZmlsZSByZWFkcy4gIFBhcnQgb2YgdGhpcyB3YXMgdG8KICAgICByZXBhaXIgYnVmZmVyZWQgSS9PIHN1cHBvcnQgaW4gVW5peCBhbmQgaW1wbGVtZW50IGJ1ZmZlcmVkCiAgICAgYXBfZmdldHMoKSBmb3IgYWxsIHBsYXRmb3Jtcy4gIFtCcmlhbiBIYXZhcmQsIEplZmYgVHJhd2lja10KCiAgKikgV2luMzI6IEZpeCBwcm9ibGVtIHdoZXJlIFVUQyBvZmZzZXQgd2FzIG5vdCBiZWluZyBzZXQgY29ycmVjdGx5CiAgICAgaW4gdGhlIGFjY2VzcyBsb2cuIFByb2JsZW0gcmVwb3J0ZWQgb24gbmV3cyBncm91cCBieSBKZXJyeSBCYWtlci4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHNlZ2ZhdWx0IHdoZW4gcmVwb3J0aW5nIHRoaXMgdHlwZSBvZiBzeW50YXggZXJyb3I6CiAgICAgIjwvY29udGFpbmVyPiB3aXRob3V0IG1hdGNoaW5nIDxjb250YWluZXI+IHNlY3Rpb24iLCB3aGVyZQogICAgIGNvbnRhaW5lciBpcyBWaXJ0dWFsSG9zdCBvciBEaXJlY3Rvcnkgb3Igd2hhdGV2ZXIuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgUHJldmVudCB0aGUgc291cmNlIGNvZGUgZm9yIENHSXMgZnJvbSBiZWluZyByZXZlYWxlZCB3aGVuIHVzaW5nCiAgICAgbW9kX3Zob3N0X2FsaWFzIGFuZCB0aGUgQ0dJIGRpcmVjdG9yeSBpcyB1bmRlciB0aGUgZG9jdW1lbnQgcm9vdAogICAgIGFuZCBhIHVzZXIgbWFrZXMgYSByZXF1ZXN0IGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8vY2dpLWJpbi9jZ2kKICAgICBhcyByZXBvcnRlZCBpbiA8bmV3czo5NjA5OTkxMDUuMzQ0MzIxQGVybmFuaS5sb2dpY2EuY28udWs+CiAgICAgW1RvbnkgRmluY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IEJlb3MgTmV0d09ya2luZyBFbnZpcm9ubWVudCAoQk9ORSkKICAgICBbRGF2aWQgUmVpZF0KCiAgKikgeGxhdGU6IGFwX3hsYXRlX2NvbnZfYnVmZmVyKCkgbm93IHRlbGxzIHRoZSBjYWxsZXIgd2hlbiB0aGUKICAgICBmaW5hbCBpbnB1dCBjaGFyIGlzIGluY29tcGxldGU7IGFwX2J3cml0ZV94bGF0ZSgpIG5vdyBoYW5kbGVzCiAgICAgaW5jb21wbGV0ZSBmaW5hbCBpbnB1dCBjaGFycy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFlldCBhbm90aGVyIHVwZGF0ZSB0byBzYWZlcmVhZC9oYWxmZHVwbGV4IHN0dWZmIC0tIG5lZWQgdG8gZW5zdXJlCiAgICAgdGhhdCBhIGJoYWxmZHVwbGV4IGNhbGwgb2NjdXJzIGJlZm9yZSBsb2dnaW5nIG9yIGVsc2UgRE5TIGFuZAogICAgIHN1Y2ggY2FuIGRlbGF5IHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcmVzcG9uc2UuICBbRGVhbiBHYXVkZXRdCgogICopIFNvbWUgc3lzY2FsbCByZWR1Y3Rpb24gaW4gQVBSIG9uIHVuaXggLS0gZG9uJ3Qgc2VlayB3aGVuIHNldHRpbmcKICAgICB1cCBhbiBtbWFwOyBhbmQgZG9uJ3QgZmNudGwoKSBtb3JlIHRoYW4gb25jZSBwZXIgc29ja2V0LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgV2hlbiBtb2RfY2dpZCBpcyBzdGFydGVkIGFzIHJvb3QsIHRoZSBjZ2kgZGFlbW9uIG5vdyBzd2l0Y2hlcyAKICAgICB0byB0aGUgY29uZmlndXJlZCBVc2VyL0dyb3VwIChsaWtlIG90aGVyIGh0dHBkIHByb2Nlc3NlcykgCiAgICAgaW5zdGVhZCBvZiBjb250aW51aW5nIGFzIHJvb3QuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgcHJlZm9yayBNUE0gbm93IHVzZXMgYW4gQVBSIGxvY2sgZm9yIHRoZSBhY2NlcHQoKSBtdXRleC4KICAgICBJdCBoYXMgbm90IGJlZW4gZ2V0dGluZyBhIGxvY2sgYXQgYWxsIHJlY2VudGx5LiAgaHR0cGQgLVYgbm93IAogICAgIGRpc3BsYXlzIEFQUidzIHNlbGVjdGlvbiBvZiB0aGUgbG9jayBtZWNoYW5pc20gaW5zdGVhZCBvZiB0aGUgCiAgICAgc3ltYm9scyBwcmV2aW91c2x5IHJlc3BlY3RlZCBieSBwcmVmb3JrLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSBtbWFwKCkgZmVhdHVyZSB0ZXN0IHRvIGNoZWNrIG9ubHkgZm9yIGV4aXN0ZW5jZS4KICAgICBUaGUgcHJldmlvdXMgY2hlY2sgcmVxdWlyZWQgZmVhdHVyZXMgbm90IHVzZWQgYnkgQXBhY2hlLgogICAgIFtHcmVnIEFtZXNdCgogICopIEZpeCBhIGNvdXBsZSBvZiBidWdzIGluIG1vZF9jZ2lkOiAgVGhlIGNnaSBhcmd1bWVudHMgd2VyZQogICAgIHNvbWV0aW1lcyBtYW5nbGVkLiAgVGhlIGxlbiBwYXJtIHRvIGFjY2VwdCgpIHdhcyBub3QgCiAgICAgaW5pdGlhbGl6ZWQsIGxlYWRpbmcgc29tZXRpbWVzIHRvIGFuIGVuZGxlc3MgbG9vcCBvZiBmYWlsZWQKICAgICBhY2NlcHQoKSBjYWxscyBvbiBPUy8zOTAgYW5kIGFueXdoZXJlIGVsc2UgdGhhdCBmYWlsZWQgdGhlIGNhbGwKICAgICBpZiB0aGUgbGVuIHdhcyBuZWdhdGl2ZS4gIFVzZSA8c3lzL3VuLmg+IGZvciBzdHJ1Y3Qgc29ja2FkZHJfdW4KICAgICBpbnN0ZWFkIG9mIGRlY2xhcmluZyBpdCBvdXJzZWx2ZXMgdG8gZml4IGEgY29tcGlsYXRpb24gcHJvYmxlbQogICAgIG9uIFNvbGFyaXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgUmVzb3VyY2UgbGltaXRpbmcgY29kZSBiYWNrIGludG8gQXBhY2hlIDIuMC4gW1J5YW4gQmxvb21dCgogICopIEZpeCB6b21iaWUgcHJvY2VzcyBwcm9ibGVtIHdpdGggbW9kX2NnaS4gIFtKZWZmIFRyYXdpY2tdCgogICopIFBvcnQgbW9kX21tYXBfc3RhdGljIHRvIDIuMC4gIE1ha2UgaXQgZ28gZmFzdGVyLiAgW0dyZWcgQW1lc10KCiAgKikgRml4IHN0b3JhZ2Ugb3ZlcmxheSB3aGVuIGxvYWRpbmcgZHNvcy4gIFN5bXB0b206IEFwYWNoZSBkaWVzIGF0CiAgICAgaW5pdGlhbGl6YXRpb24gaWYgQUxMT0NfREVCVUcgaXMgZGVmaW5lZDsgbm8ga25vd24gc3ltcHRvbSAKICAgICBvdGhlcndpc2UuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdHlwbyBpbiBjb25maWd1cmUgc2NyaXB0IHdoZW4gY2hlY2tpbmcgZm9yIG1vZF9zby4gIGJhc2gKICAgICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHByb2JsZW0gYnV0IC9iaW4vc2ggb24gU29sYXJpcyBkb2VzLgogICAgIFN5bXB0b206ICIuL2NvbmZpZ3VyZTogdGVzdDogdW5rbm93biBvcGVyYXRvciA9PSIKICAgICBbSmVmZiBUcmF3aWNrXQogICAKICAqKSBSZWJpbmQgdGhlIFdpbjMyIE5UIGFuZCA5eCBzZXJ2aWNlcyBjb250cm9sIGludG8gdGhlIE1QTS4gIAogICAgIEFsbCBjb25zb2xlLCBXaW5OVCBTQ00gYW5kIFdpbjl4IHBzZXVkby1zZXJ2aWNlIGNvbnRyb2wgY29kZSBpcwogICAgIG5vdyB3cmFwcGVkIHdpdGhpbiB0aGUgV2luTlQgTVBNLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgYSBjb3B5IG9mIGdldGVudigiUEFUSCIpIGJlZm9yZSBzdG9yaW5nIGZvciBsYXRlciB1c2UuICBTb21lCiAgICAgZ2V0ZW52KCkgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGZvciBzdWNjZXNzaXZlIGNhbGxzLgogICAgIENHSXMgb24gT1MvMzkwIGhhZCBhIGJhZCBQQVRIIGR1ZSB0byB0aGlzLiAgW0plZmYgVHJhd2lja10KCiAgKikgU2VydmVyIFRva2VucyB3b3JrIGluIDIuMCBhZ2Fpbi4gIFRoaXMgYWxzbyBwcm9wb2dhdGVzIHRoZSBjaGFuZ2UKICAgICB0byBhbGxvdyBqdXN0IHRoZSBwcm9kdWN0IG5hbWUgaW4gdGhlIHNlcnZlciBzdHJpbmcgdXNpbmcKICAgICBQUk9EVUNUX09OTFkuCiAgICAgW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE0CgogICopIEVCQ0RJQzogUmVhcnJhbmdlIGNhbGxzIHRvIGFwX2NoZWNrY29udigpIHNvIHRoYXQgbW9zdCBoYW5kbGVycwogICAgIHdvbid0IG5lZWQgdG8gY2FsbCBpdC4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgTW92ZSBwcmVfY29uZmlnIGhvb2sgY2FsbCB0byBiZXR3ZWVuIGNvbmZpZ3VyYXRpb24gcmVhZCBhbmQgY29uZmlnCiAgICAgdHJlZSB3YWxrLiAgVGhpcyBhbGxvd3MgYWxsIG1vZHVsZXMgdG8gaW1wbGVtZW50IHByZV9jb25maWcgaG9va3MKICAgICBhbmQga25vdyB0aGF0IHRoZXkgd2lsbCBiZSBjYWxsZWQgYXQgYW4gYXBwcm9wcmlhdGUgdGltZS4KICAgICBbUnlhbiBCbG9vbV0gCgogICopIG1vZF9jZ2ksIG1vZF9jZ2lkOiBNYWtlIFNjcmlwdExvZyBkaXJlY3RpdmUgd29yayBhZ2Fpbi4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBwcmUtY29uZmlnIGhvb2tzIGJhY2sgdG8gYWxsIG1vZHVsZXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIFNJR1NFR1YgaW4gYXBfbWQ1ZGlnZXN0KCksIHdoaWNoIGlzIHVzZWQgd2hlbiB5b3UgaGF2ZQogICAgIENvbnRlbnREaWdlc3QgZW5hYmxlZCBhbmQgd2UgY2FuJ3QvZG9uJ3QgbW1hcCB0aGUgZmlsZS4gCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgV2Ugbm93IHJlcG9ydCB0aGUgY29ycmVjdCBsaW5lIG51bWJlciBmb3Igc3ludGF4IGVycm9ycyBpbiBjb25maWcKICAgICBmaWxlcy4gIFtSeWFuIEJsb29tLCBHcmVnIFN0ZWluLCBKZWZmIFRyYXdpY2tdCgogICopIEJyb3VnaHQgbW9kX2F1dGhfZGlnZXN0IHVwIHRvIHN5bmNoIHdpdGggMS4zLCBmaXhlZCBhcF90aW1lX3QtCiAgICAgcmVsYXRlZCBidWdzLCBhbmQgY2hhbmdlZCBzaG1lbS9sb2NraW5nIHRvIHVzZSBhcHIgQVBJLiBTaGFyZWQtbWVtCiAgICAgaXMgY3VycmVudGx5IGRpc2FibGVkLCBob3dldmVyLCBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggZ3JhY2VmdWwKICAgICByZXN0YXJ0cy4gW1JvbmFsZCBUc2NoYWzkcl0KCiAgKikgRml4IGNvcnJ1cHRpb24gb2YgSUZTIHZhcmlhYmxlIGluIC0td2l0aC1tb2R1bGU9IGhhbmRsaW5nLiAgCiAgICAgRGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3Mgc2hlbGwgb3IgY3VzdG9taXphdGlvbiB0aGVyZW9mLCB0aGVyZSAKICAgICB3b3VsZCBiZSBlcnJvcnMgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGxhdGVyIGluIHRoZSBjb25maWd1cmUKICAgICBwcm9jZWR1cmUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpOiBSZXN0b3JlIGxvZ2dpbmcgb2Ygc3RkZXJyIGZyb20gY2hpbGQgcHJvY2VzcyB3aGVuIFNjcmlwdExvZyAKICAgICBpc24ndCB1c2VkIChhcyBpbiAxLjMpLCBleGNlcHQgdGhhdCBvbiBVbml4IGl0IGlzIG5vdyBsb2dnZWQgdmlhIAogICAgIGFwX2xvZ19yZXJyb3IoKSBpbnN0ZWFkIG9mIGJ5IHRoZSBjaGlsZCBoYXZpbmcgU1RERVJSX0ZJTEVOTyByZWZlcgogICAgIHRvIHRoZSBlcnJvciBsb2cuICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIEFkZCAnLUQnIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIHJ1biB0aW1lIGNvbmZpZ3VyYXRpb24gZGVmaW5lcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBPcmdhbml6ZSBodHRwX21haW4uYyBhcyBpbmRlcGVuZGVudCBjb2RlLCBzdWNoIHRoYXQgbm8gY29kZSBvcgogICAgIGdsb2JhbCBkYXRhIGlzIGV4cG9ydGVkIGZyb20gaXQuICBXSU4zMiB3aWxsIGR5bmFtaWNhbGx5IGxpbmsgaXQKICAgICB0byB0aGUgc2VydmVyIGNvcmUsIHNvIHRoaXMgd2lsbCBwcmV2ZW50IG11dHVhbCBkZXBlbmRlbmN5LgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZCBzZXBhcmF0ZSBkeW5hbWljIGxpbmthZ2UgdGFncyBBUFJfRVhQT1JUKCksIEFQUl9FWFBPUlRfTk9OU1REKCkKICAgICBhbmQgQVBSX1ZBUl9FWFBPUlQgdG8gY29ycmVjdGx5IHJlc29sdmUgYXByIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgV2luOXggc2VydmljZSBleGVjdXRpb24gYW5kIEN0cmwrQy9DdHJsK0JyZWFrL1NodXRkb3duIGhhbmRsZXJzLgogICAgIFtXaWxsaWFtIFJvd2UsIEphbiBKdXN0IEtlaWpzZXIgPEtFSUpTRVJKSkBsb2dpY2EuY29tPl0KCiAgKikgQWRkIG1vZF9jaGFyc2V0X2xpdGUgZm9yIGNvbmZpZ3VyaW5nIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24uCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkICctbicgb3B0aW9uIHRvIGh0cGFzc3dkIHRvIG1ha2UgaXQgcHJpbnQgaXRzIHVzZXI6cHcgcmVjb3JkCiAgICAgb24gc3Rkb3V0IHJhdGhlciB0aGFuIGhhdmluZyB0byBmcm9iIGEgdGV4dCBmaWxlLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggc2FmZXJlYWQuICBCYXNpY2FsbHksIHdlIGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGlmIGEgcmVhZCBvbiB0aGUKICAgICBpbnB1dCB3aWxsIGJsb2NrLgogICAgIFtSeWFuIEJsb29tXQogCiAgKikgQVBSOiBBZGQgYXBfeGxhdGVfZ2V0X3NiKCkgc28gdGhhdCBhbiBhcHAgY2FuIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90CiAgICAgYSBjb252ZXJzaW9uIGlzIHNpbmdsZS1ieXRlIG9ubHkuIFtKZWZmIFRyYXdpY2tdCgogICopIEJFT1M6IGFwX3NodXRkb3duIHNob3VsZCByZXR1cm4gQVBSX1NVQ0NFU1Mgb3IgZXJybm8uIE5vdGUgdGhhdAogICAgIHRoZSBCZU9TIDUuMCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBzaHV0ZG93biBkb2Vzbid0IHdvcmsgeWV0LgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBzb21lIG1pbm9yIGVycm9ycyB3aGVyZSBwaWQgd2FzIGJlaW5nIG1hbmlwdWxhdGVkIGFzIGFuIGludAogICAgIGluc3RlYWQgb2YgdGhlIHBvcnRhYmxlIHBpZF90LiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IHNvbWUgZXJyb3IgbG9nIHByaW50cyB0aGF0IHdlcmUgcHJpbnRpbmcgdGhlIHBvaW50ZXIgdG8gYQogICAgIHN0cnVjdHVyZSByYXRoZXIgdGhhbiB0aGUgcGlkIHdpdGhpbiB0aGUgc3RydWN0dXJlLgogICAgIFtKZWZmIFRyYXdpY2ssIFJveSBGaWVsZGluZ10KCiAgKikgYWI6IEZpeCBhIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nIGJ1ZzsgdHJhY2sgYmFkIGhlYWRlcnMgaW4gCiAgICAgZXJyX3Jlc3BvbnNlOyBzdXBwb3J0IHJlYWRpbmcgaGVhZGVycyB1cCB0byAySy4gCiAgICAgW0FzayBCam9lcm4gSGFuc2VuIDxhc2tAdmFsdWVjbGljay5jb20+XQoKICAqKSBGaXggYXBfcmVzb2x2ZV9lbnYoKSBzbyB0aGF0IGl0IGhhbmRsZXMgbmV3IGZ1bmN0aW9uIGFkZGVkIGluIGEgcHJpb3IKICAgICBhbHBoYSAoc2VlICJBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKICAgICBjb25maWcgZmlsZS4iKSBhcyB3ZWxsIGFzIHRoZSBjb25zdHJ1Y3RzIHVzZWQgYnkgbW9kX3Jld3JpdGUuCiAgICAgW1BhdWwgUmVkZXIgPHJlZGVycGpAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgQXBhY2hlIDIuMCBidWlsZHMgYW5kIHJ1bnMgb24gT1MvMzkwLiBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXNdCgogICopIENoYW5nZSB0aGUgRUJDRElDIHN1cHBvcnQgaW4gZnVuY3Rpb25zIGZvciBNRDUsIFNIQTEsIGFuZCBiYXNlIDY0IHRvIHVzZQogICAgIEFQUiB0byBwZXJmb3JtIHRyYW5zbGF0aW9uLCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyB0aGUgaGFyZC1jb2RlZCB0YWJsZXMKICAgICBpbiAxLjMncyBlYmNkaWMuYy4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IHNvbWUgYnVncyAobW9zdGx5IGxvc3QgMS4zIGNvZGUpIGluIGFiJ3MgY29tbWFuZC1saW5lIHByb2Nlc3NpbmcuIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBob29rIGludG8gdGhlIGNvbmZpZyBmaWxlIHJlYWRpbmcgcGhhc2UuICBCYXNpY2FsbHkKICAgICBpZiBhIGRpcmVjdGl2ZSBpcyBzcGVjaWZpZWQgRVhFQ19PTl9SRUFELCB0aGVuIHdoZW4gdGhhdCBkaXJlY3RpdmUgaXMKICAgICByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCB0aGUgYXNzb2NhaXRlZCBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIFRoaXMKICAgICBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0aG9zZSBkaXJlY3RpdmVzIHRoYXQgbXVzdCBtdWNrIHdpdGggSE9XIHRoZQogICAgIHNlcnZlciBJTlRFUlBSRVRTIHRoZSBjb25maWcuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZGlyZWN0aXZlcwogICAgIHRoYXQgcmUtb3JkZXIgb3IgcmVwbGFjZSBpdGVtcyBpbiB0aGUgY29uZmlnIHRyZWUuICBUaG9zZSBjaGFuZ2VzIHNob3VsZAogICAgIGJlIG1hZGUgaW4gdGhlIHByZS1jb25maWcgc3RlcC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIG1vZF9leGFtcGxlIHRvIHRoZSBidWlsZCBzeXN0ZW0uCiAgICAgW1RvbnkgRmluY2hdCgogICopIEFQUjogQWRkIGFwX3hsYXRlX2NvbnZfYnl0ZSgpIHRvIGNvbnZlcnQgb25lIGNoYXIgYmV0d2VlbiBzaW5nbGUtCiAgICAgYnl0ZSBjaGFyYWN0ZXIgc2V0cy4gW0plZmYgVHJhd2lja10KCiAgKikgUGljayB1cCB2YXJpb3VzIEVCQ0RJQyBmaXhlcyBmcm9tIDEuMyAoZnJvbSBNYXJ0aW4KICAgICBLcmFlbWVyIGFuZCBPbGl2ZXIgUmVoIG9yaWdpbmFsbHkgYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2UgbG9nKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgcHJvYmxlbXMgaW4gUkZDMTQxMyBzdXBwb3J0IChjb250cm9sbGVkIGJ5IHRoZQogICAgIElkZW50aXR5Q2hlY2sgZGlyZWN0aXZlKS4gIEFwYWNoZSBkaWQgbm90IGJ1aWxkIHRoZSByZXF1ZXN0IHN0cmluZwogICAgIHByb3Blcmx5IGFuZCBtb3JlIGltcG9ydGFudGx5IEFwYWNoZSB3b3VsZCBsb29wIGZvcmV2ZXIgaWYgdGhlIAogICAgIHdvdWxkLWJlIGlkZW50IHNlcnZlciBkcm9wcGVkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBzZW5kaW5nIGEKICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkIHJlc3BvbnNlLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcHhzIHdvcmtzIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVsaWFibGUgcGlwZWQgbG9ncyB3b3JrIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgSW50cm9kdWNlIGEgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBpbnRvIEFQUiB0byBiZSB1c2VkIGZvcgogICAgIHJlcGxhY2luZyB0YWJsZXMgYW5kIG90aGVyIHJhbmRvbSBkYXRhIHN0cnVjdHVyZXMgaW4gQXBhY2hlLgogICAgIFtUb255IEZpbmNoXQoKICAqKSBBZGQgc29tZSBtb3JlIGVycm9yIHJlcG9ydGluZyB0byBodHBhc3N3ZCBpbiB0aGUgY2FzZSBvZiBwcm9ibGVtcwogICAgIGdlbmVyYXRpbmcgb3IgYWNjZXNzaW5nIHRoZSB0ZW1wb3JhcnkgZmlsZS4gIEFsc28sIHBhc3MgaW4gYQogICAgIGJ1ZmZlciBpZiB0aGUgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IHRvIHVzZSBpdCAoaS5lLiwgaWYgTF90bXBuYW0KICAgICBpcyBkZWZpbmVkKS4gIFtLZW4gQ29hcl0KCiAgKikgQ29uZmlndXJlIGNyZWF0ZXMgY29uZmlnLm5pY2Ugbm93IGNvbnRhaW5pbmcgeW91ciBjb25maWd1cmUKICAgICBvcHRpb25zLiBTeW50YXg6IC4vY29uZmlnLm5pY2UgWy0tbW9yZS1vcHRpb25zXQogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCB2YXJpb3VzIHJldHVybiBjb2RlIHByb2JsZW1zIGluIEFQUiBvbiBXaW4zMi4gIEZvciBtb3N0IG9mCiAgICAgdGhlc2UsIEFQUiB3YXMgcmV0dXJuaW5nIEFQUl9FRVhJU1QgaW5zdGVhZCBvZiBHZXRMYXN0RXJyb3IoKS8KICAgICBXU0FHZXRMYXN0RXJyb3IoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgcGlwZWQgbG9ncyB3b3JrIGFnYWluIGluIHZlcnNpb24gMi4wCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCBWUEFUSCBzdXBwb3J0IHRvIFVOSVggYnVpbGQgc3lzdGVtIG9mIEFwYWNoZSBhbmQgQVBSLgogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCBhcF90b2tlbml6ZV90b19hcmd2IHRvIHJlc3BlY3QgdGhlIGNvbnN0IGFyZ3VtZW50cyB0aGF0IGFyZQogICAgIHBhc3NlZCB0byBpdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IG1tJ3MgbWVtY3B5L21lbXNldCBtYWNyb3MsIHBvaW50ZXIgYXJpdGhtZXRpYyB3YXMgYnJva2VuLgogICAgIFBhdGNoIHN1Ym1pdHRlZCB0byBhdXRob3IuCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KCiAgKikgRml4IG1tIGNvbmZpZ3VyYXRpb24gb24gU29sYXJpcyA4IHg4NiBhbmQgT1MvMzkwLiAgRG9uJ3QgcmVxdWlyZQogICAgIC9zYmluIGluIFBBVEggb24gRnJlZUJTRCAoYWxsIHN1Ym1pdHRlZCB0byByc2UgcHJldmlvdXNseSkgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGJ1aWxkaW5nIFB0aHJlYWQtYmFzZWQgTVBNcyBvbiBPcGVuQlNECiAgICAgW1Nhc2NoYSBTY2h1bWFubl0gUFIjMjYKCiAgKikgRml4IGFwX3JlYWRkaXIoKSBwcm9ibGVtIG9uIHN5c3RlbXMgd2hlcmUgZF9uYW1lW10gZmllbGQgaW4KICAgICBzdHJ1Y3QgZGlyZW50IGlzIGRlY2xhcmVkIHdpdGggb25seSBvbmUgYnl0ZS4gIChUaGlzIHByb2JsZW0gb25seSAKICAgICBhZmZlY3RlZCBtdWx0aXRocmVhZGVkIGJ1aWxkcy4pICBUaGlzIGNhdXNlZCBhIHNlZ2ZhdWx0IGR1cmluZwogICAgIHBvb2wgY2xlYW51cCB3aXRoIG1vZF9hdXRvaW5kZXggb24gU29sYXJpcyAoU29sYXJpcyA4IHg4NiwgYXQgCiAgICAgbGVhc3QpLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggc29tZSBtYWtlLXBvcnRhYmlsaXR5IHByb2JsZW1zIG9uIGF0IGxlYXN0IFRydTY0LCBJcml4CiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIFBSIzE4LCBQUiMzOQoKICAqKSBBZGQgYXBfc2lnd2FpdCgpIHRvIHN1cHBvcnQgb2xkLXN0eWxlIHNpZ3dhaXQoKSBvbiBzeXN0ZW1zCiAgICAgbGlrZSBPUy8zOTAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIAoKICAqKSBBZGQgUE9TSVgtdGhyZWFkIGZsYWdzIGZvciBtb3JlIHBsYXRmb3Jtcy4KICAgICBbU2FzY2hhIFNjaHVtYW5uXQoKICAqKSBGaXggc29tZSBtaW5vciBidWdzIGluIGFwX3N0cmVycm9yKCkuICBUZWFjaCBhcF9zdHJlcnJvcigpCiAgICAgKG9uIFVuaXgsIGF0IGxlYXN0KSB0byBoYW5kbGUgcmVzb2x2ZXIgZXJyb3JzLiAgRml4IGEgYnVnIGluCiAgICAgdGhlIGRlZmluaXRpb24gb2YgQVBSX0VOT01FTSBzbyB0aGF0IGFwX3N0cmVycm9yKCkgY2FuIHNwaXQKICAgICBvdXQgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgaXQuCiAgICAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTMKCiAgKikgbW9kX3NvIHJlcG9ydHMgYXBfb3NfZHNvX2Vycm9yKCkgaWYgYXBfZHNvX2xvYWQoKSBmYWlscwogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogKkhPT0sqIG1hY3JvcyBub3cgaGF2ZSBhbiBBUF8gcHJlZml4CiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZSByZWR1bmRhbnQgY2FsbHMgdG8gaW5pdGlhbGl6ZSB3aW5zb2NrLgogICAgIFtUaW0gQ29zdGVsbG8gPHRpbWNvc3RlbGxvQG96ZW1haWwuY29tLmF1Pl0KCiAgKikgRml4IGJ1Z3MgaW5pdGlhbGl6aW5nIHVuZ2V0Y2hhciBmb3IgcGlwZXMuIAogICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW9AQ2lyWC5PUkc+XQoKICAqKSBUaGUgYWIgcHJvZ3JhbSBpbiB0aGUgc3JjL3N1cHBvcnQgZGlyZWN0b3J5IGlzIG5vdyBwb3J0YWJsZSB1c2luZwogICAgIEFQUi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgU3VwcG9ydCBkaXJlY3RvcnkgaXMgYmVpbmcgY29tcGlsZWQgd2hlbiB0aGUgc2VydmVyIGlzIGJ1aWx0CiAgICAgW1J5YW4gQmxvb21dCgogICopIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wcm9ncmFtLW5hbWUgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKICAgICBkZXZlbG9wZXJzIHRvIHJlbmFtZSB0aGUgZXhlY3V0YWJsZSBhdCBjb25maWd1cmUgdGltZS4gIFRoaXMgYWxzbwogICAgIGNoYW5nZXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB0aGUgZXhlY3V0YWJsZSdzIG5hbWUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIG1vZF9hdXRvaW5kZXg6IEFkZCBgSW5kZXhPcHRpb25zICtWZXJzaW9uU29ydCcsIHRvIG5pY2VseSBzb3J0IGZpbGVuYW1lcwogICAgIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzLiBbTWFydGluIFBvb2xdCgogICopIGFwX29wZW4oLi4sQVBSX09TX0RFRkFVTFQsLi4pIHVzZXMgcGVybXMgMDY2NiBpbnN0ZWFkIG9mIDA3Nzcgb24KICAgICBVbml4OyBhY2Nlc3NfbG9nIGFuZCBlcnJvcl9sb2cgbm93IGNyZWF0ZWQgd2l0aCB0aGVzZSBwZXJtczsgbm9uLQogICAgIFVuaXggaXMgdW5hZmZlY3RlZCBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIEZpbmlzaGVkIG1vdmUgb2YgYXBfbWQ1IHJvdXRpbmVzIHRvIGFwcl9tZDUuICBSZW1vdmVkIGFwX21kNS5oLgogICAgIFJlcGxhY2VkIG1vcmUgbWFnaWMgbnVtYmVycyB3aXRoIE1ENV9ESUdFU1RTSVpFLgogICAgIFtXaWxsaWFtIFJvd2UsIFJveSBGaWVsZGluZ10KCiAgKikgV2luMzI6IEdldCBtb2RfYXV0aF9kaWdlc3QgY29tcGlsaW5nIGFuZCBhZGRlZCB0byB0aGUgV2luZG93cwogICAgIGJ1aWxkIGVudmlyb25tZW50LiBOb3QgdGVzdGVkIGFuZCBJJ2QgYmUgc3VwcmlzZWQgaWYgaXQgCiAgICAgYWN0dWFsbHkgd29ya3MuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBSZXZhbXAgdGhlIFdpbjMyIG1ha2UgZW52aXJvbm1lbnQuIE1ha2VmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQKICAgICBBcGFjaGUuZHN3IGNyZWF0ZWQgdG8gYnJpbmcgdG9nZXRoZXIgYWxsIHRoZSBwaWVjZXMuIENyZWF0ZSBuZXcgZmlsZQogICAgIG9zL3dpbjMyL0Jhc2VBZGRyLnJlZiB0byBkZWZpbmUgbW9kdWxlIGJhc2UgYWRkcmVzc2VzICh0byBwcmV2ZW50CiAgICAgZGxsIHJlbG9jYXRpb24gYXQgc3RhcnQtdXApLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgTWFyciwgVGltIENvc3RlbGxvLCBCaWxsIFN0b2RkYXJkXQoKICAqKSBbRUJDRElDXSBQb3J0IFBhdWwgR2lsbWFydGluJ3MgQ1JMRiBwYXRjaCBmcm9tIDEuMy4gIFRoaXMgcmVwbGFjZXMgbW9zdAogICAgIG9mIHRoZSBcMDE1LCBcMDEyLCBhbmQgXDAxNVwwMTIgY29uc3RhbnRzIHdpdGggbWFjcm9zLgogICAgIFtHcmVnIEFtZXMgPGdyZWdhbWVzQHVzLmlibS5jb20+XQogICAgIAogICopIEFkZCBhcF94bGF0ZV9vcGVuKCkgZXQgYWwgZm9yIHRyYW5zbGF0aW9uIG9mIHRleHQgYmV0d2VlbiBkaWZmZXJlbnQgCiAgICAgY2hhcmFjdGVyIHNldHMuICBUaGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBpY29udigpLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIE1vcmUgRkFRcyBhbmQgYW5zd2VycyBmcm9tIGNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peC4KICAgICBbSm9zaHVhIFNsaXZlIDxzbGl2ZUBmaW5hbmNlLmNvbW1lcmNlLnViYy5jYT5dCgogICopIENHSSBvdXRwdXQgaXMgYmVpbmcgdGltZWQgb3V0IG5vdy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHRoZSBwcm9ibGVtIHdpdGggZGllaW5nIHF1aWV0bHkuICBkdXBmaWxlIG5vdyB0YWtlcyBhIHBvb2wgd2hpY2gKICAgICBpcyB1c2VkIGJ5IHRoZSBuZXcgYXByIGZpbGUuICBUaGVyZSBpcyBubyByZWFzb24gdG8gY3JlYXRlIGEgbmV3IGZpbGUKICAgICB3aXRoIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBvcmlnaW5hbCBmaWxlLgogICAgIFtSeWFuIEJsb29tXSAKCiAgKikgV2luMzI6IEF0dGVtcHQgdG8gZWxpbWluYXRlIGRsbCByZWxvY2F0aW9uIGF0IHN0YXJ0LXVwIGJ5IHNwZWNpZnlpbmcKICAgICBtb2R1bGUgYmFzZSBhZGRyZXNzZXMuIFRoaXMgd2lsbCBoZWxwIHNob290aW5nIHNlZyBmYXVsdHMKICAgICBpbiB0aGUgZmllbGQuIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+XQoKICAqKSBVcGRhdGUgQXBhY2hlIG9uIFdpbmRvd3MgZG9jdW1lbnRhdGlvbi4gQWRkIG5ldyBkb2N1bWVudAogICAgIGRlc2NyaWJpbmcgaG93IHRvIGNvbXBpbGUgQXBhY2hlIG9uIFdpbmRvd3MuCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCgogICopIGFwX3NldF9waXBlX3RpbWVvdXQoKSwgYXBfcG9sbCgpLCBhbmQgQVBSX1NPX1RJTUVPVVQgbm93IHRha2UgCiAgICAgbWljcm9zZWNvbmRzIGluc3RlYWQgb2Ygc2Vjb25kcy4gIFNvbWUgc3RvcmFnZSBsZWFrcyBhbmQgb3RoZXIKICAgICBtaW5vciBidWdzIGluIHJlbGF0ZWQgY29kZSB3ZXJlIGZpeGVkLiAgW0plZmYgVHJhd2lja10KCiAgKikgV2luMzI6IEZpcnN0IGN1dCBhdCBnZXR0aW5nIG1vZF9pc2FwaSB3b3JraW5nIHVuZGVyIDIuMAogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+XQoKICAqKSBGaXJzdCBzdGFiIGF0IGdldHRpbmcgbW9kX2F1dGhfZGlnZXN0IHdvcmtpbmcgdW5kZXIgMi4wCiAgICAgcXVpY2sgY2hhbmdlIHN1bW1hcnk6CiAgICAgLSBtb3ZlZCB0aGUgcmFuZG9tIGJ5dGUgZ2VuZXJhdGlvbiAoYXBfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzKSBpbnRvIEFQUgogICAgIC0gbm93IHVzZXMgYXBfdGltZV90CiAgICAgLSBjb21waWxlcyBhbmQgcnVucyBvbiBsaW51eAogICAgIC0gdGVzdGVkIHdpdGggYW1heWEKICAgICBbQnJpYW4gTWFydGluIDxibWFydGluQHBlbmd1aW5jb21wdXRpbmcuY29tPl0KCiAgKikgV2luMzI6IE1vdmUgdGhlIHNwYWNlIHN0cmlwcGluZyBvZiBwaHlzaWNhbCBzZXJ2aWNlIG5hbWVzCiAgICAgZml4IHVwIGZyb20gQXBhY2hlIDEuMy4gI2luY2x1ZGUnaW5nICJhcF9tcG0uaCIgZml4ZXMgdXAgYW4KICAgICB1bnJlc29sdmVkIHN5bWJvbC4gQWRkIGRlcGVuZGVuY3kgY2hlY2tpbmcgdG8gdGhlCiAgICAgQ3JlYXRlU2VydmljZSBjYWxsIHRvIGVuc3VyZSBUQ1BJUCBhbmQgQUZQICh3aW5zb2NrKSBpcyBzdGFydGVkCiAgICAgYmVmb3JlIEFwYWNoZS4KICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0KCiAgKikgV2luMzI6IEFkZCBjb2RlIHRvIHBlcmZvcm0gbGF0ZWJpbmRpbmcgb24gZnVuY3Rpb25zIHRoYXQgbWF5CiAgICAgbm90IGV4aXN0IG9uIGFsbCBsZXZlbHMgb2YgV2luZG93cyB3aGVyZSBBcGFjaGUgcnVucy4gVGhpcwogICAgIGlzIG5lZWRlZCB0byBhbGxvdyBBcGFjaGUgdG8gc3RhcnQtdXAgb24gV2luOTUvOTguIEFsbCBjYWxscwogICAgIHRvIG5vbiBwb3J0YWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3RlY3RlZCB3aXRoCiAgICAgYXBfb3NsZXZlbCBjaGVja3MgdG8gcHJldmVudCBydW50aW1lIHNlZ2ZhdWx0cy4gCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCgogICopIEZpeCBmYWxsYmFjayBkZWZhdWx0IHZhbHVlcyBmb3IgU0hNX1IgYW5kIFNITV9XIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgR2V0IGxpbmdlcmluZ19jbG9zZSgpIHdvcmtpbmcgYWdhaW4uIFtEZWFuIEdhdWRldCwgSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogR2V0IG5vbi1ibG9ja2luZyBDR0kgcGlwZSByZWFkcyB3b3JraW5nIHVuZGVyIFdpbmRvd3MgTlQuCiAgICAgVGhpcyBhZGRyZXNzZXMgUFIgMTYyMy4gU3RpbGwgbmVlZCB0byBhZGRyZXNzIHRpbWluZyBvdXQgcnVuYXdheQogICAgIENHSSBzY3JpcHRzLiBbQmlsbCBTdG9kZGFyZF0KIAogICopIFdpbjMyOiBNYWtlIGFwX3N0YXQgV2luZG93cyA5NS85OCBmcmllbmRseQogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICopIFdpbjMyOiBGaXggYSBidWcgaW4gYXBfZ2V0X29zbGV2ZWwgd2hpY2ggY2F1c2VzIEdldFZlcnNpb25FeCgpIHRvIAogICAgIGFsd2F5cyBmYWlsLiBOZWVkIHRvIGluaXRpYWxpc2UgdGhlIGR3T1NWZXJzaW9uSW5mb1NpemUgbWVtYmVyIG9mIHRoZSAKICAgICBPU1ZFUlNJT05JTkZPIHN0cnVjdCBiZWZvcmUgY2FsbGluZyBHZXRWZXJzaW9uRXgsIHNvIEdldFZlcnNpb25FeCAKICAgICBhbHdheXMgZmFpbHMuIAoKICAgICBUaGUgcGF0Y2ggYWxzbyBlbmhhbmNlcyBhcF9nZXRfb3NsZXZlbCAoYW5kIHRoZSBhc3NvY2lhdGVkIGVudW0pIHRvIAogICAgIGhhbmRsZSBzZWxlY3RlZCBzZXJ2aWNlIHBhY2tzIGZvciBOVDQsIGFuZCBhZGRzIHJlY29nbml0aW9uIGZvciAKICAgICBXaW5kb3dzIDIwMDAuIFRoaXMgaXMgdXNlZnVsLCBlZy4gaWYgd2UgY2FuIHJlY29nbmlzZSBOVDQgU1AyIHRoZW4gCiAgICAgd2UgY2FuIHVzZSBSZWFkRmlsZVNjYXR0ZXIgYW5kIFdyaXRlRmlsZUdhdGhlciBpbiByZWFkd3JpdGUuYy4gCiAgICAgW1RpbSBDb3N0ZWxsbyA8VGltLkNvc3RlbGxvQEJURmluYW5jaWFsZ3JvdXAuY29tPl0KCiAgKikgR2V0IG1vZF9yZXdyaXRlIGJ1aWxkaW5nIGFuZCBydW5uaW5nLCBhbmQgbW9kX3N0YXR1cyBidWlsZGluZyBmb3IgV2luIE5UCiAgICAgW0FsbGFuIEVkd2FyZHMgPGFrZUByYWxlaWdoLmlibS5jb20+XQoKICAqKSBQYXRjaCB0byBwb3J0IG1vZF9hdXRoX2RiIHRvIHRoZSAyLjAgYXBpIGFuZCBhbHNvIHRvIHN1cHBvcnQgCiAgICAgQmVybGVrZXkgREIgMy4wLiBJdCB3b3JrcyBmb3IgbWUgd2l0aCBib3RoIEJlcmtlbGV5IERCIDMuMC41NSBhbmQgCiAgICAgMi43LjcuICBJdCBzaG91bGQgd29yayB3aXRoIHZlcnNpb24gMSBhcyB3ZWxsIGJ1dCBJIGhhdmVuJ3QgdGVzdGVkIGl0LiAgCiAgICAgW0JyaWFuIE1hcnRpbiA8Ym1hcnRpbkBwZW5ndWluY29tcHV0aW5nLmNvbT5dCgogICopIEdldCBBUFIgRFNPIGNvZGUgd29ya2luZyB1bmRlciBXaW5kb3dzLiBJbmNsdWRlcyBjcm9zcyBwbGF0Zm9ybQogICAgIGZpeGVzIHRvIG1vZF9zby5jLgogICAgIFtUaW0uQ29zdGVsbG9AQlRGaW5hbmNpYWxncm91cC5jb21dCgogICopIEZpeCBzb21lIG9mIHRoZSBXaW5kb3dzIEFQUiB0aW1lIGZ1bmN0aW9ucy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGQVEgY2hhbmdlcyByZWxhdGVkIHRvIHRpZHlpbmcgdXAgaGlzdG9yaWNhbCBkb2N1bWVudHMgb24gdGhlIHdlYiBzaXRlLgogICAgIFtKb3NodWEgU2xpdmUgPHNsaXZlQGZpbmFuY2UuY29tbWVyY2UudWJjLmNhPl0KCiAgKikgTW92ZSBXaW5kb3dzIERTTyBjb2RlIGludG8gQVBSLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBFbGltaW5hdGUgYXByX3dpbi5oIGFuZCBhcHJfd2luY29uZmlnLmggKGFuZCB0aGUgdWdseSAjaWZkZWZzIHRoZXkgY2F1c2UpLgogICAgIE5vdywgYXByLmggYW5kIGFwcl9jb25maWcuaCBhcmUgZ2VuZXJhdGVkIGZyb20gYXByLmh3IGFuZCBhcHJfY29uZmlnLmh3CiAgICAgYXQgYnVpbGQgdGltZS4gQXQgdGhpcyBwb2ludCwgdGhlIHNlcnZlciB3aWxsIG5vdCBjb21waWxlIG9uIFdpbmRvd3MgYmVjYXVzZQogICAgIG9mIHRoZSByZWNlbnQgRFNPIGNvbW1pdHMuIEZpeGluZyB0aG9zZSBuZXh0LgogICAgIFtCaWxsIFJvd2UgJiBCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGRlZCBlcnJvciBjaGVja2luZyBmb3IgZmlsZSBJL08gQVBSIHJvdXRpbmVzLgogICAgIFtKb24gVHJhdmlzIDxqdHJhdmlzQGNvdmFsZW50Lm5ldD5dCgogICopIEFQUjogRG9uJ3QgdXNlIHRoZSB2YWx1ZXMgb2YgcmVzb2x2ZXIgZXJyb3IgY29kZXMgZm9yIHRoZSAKICAgICBjb3JyZXNwb25kaW5nIEFQUiBlcnJvciBjb2Rlcy4gIE9uIFVuaXggYW5kIFdpbjMyLCByZXR1cm4gdGhlIAogICAgIHByb3BlciBBUFIgZXJyb3IgY29kZSBhZnRlciBhIHJlc29sdmVyIGVycm9yLiBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhMgoKICAqKSBSZW5hbWVkIHRoZSBleGVjdXRhYmxlIGJhY2sgdG8gaHR0cGQgb24gYWxsIHBsYXRmb3JtcyBvdGhlciAKICAgICB0aGFuIFdpbjMyCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IEJlT1MgdG8gc3Vydml2ZSByZXN0YXJ0cywgbG9nIHByb3Blcmx5IGFuZCBhIGZldwogICAgIHNtYWxsIHRoaW5ncyBpdCBoYWQgcHJvYmxlbXMgd2l0aCBkdWUgdG8gdGhlIHdheSBpdCBzZXR1cAogICAgIHVzZXJzIGFuZCBncm91cHMuIFtEYXZpZCBSZWlkXQoKICAqKSBHZXQgbW9kX3Jld3JpdGUgd29ya2luZyB3aXRoIEFQUiBsb2NrcwogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFjdHVhbGx5IHJlbW92ZSB0aGUgc2VtcGFob3JlIHdoZW4gdGhlIGxvY2sgY2xlYW51cCByb3V0aW5lCiAgICAgaXMgY2FsbGVkIG9uIEJlT1MuIFtEYXZpZCBSZWlkXQoKICAqKSBDbGVhciBob29rIHJlZ2lzdHJhdGlvbnMgYmV0d2VlbiByZWFkcyBvZiB0aGUgY29uZmlnIGZpbGUuCiAgICAgV2hlbiBEU09zIGFyZSB1bmxvYWRlZCBhbmQgcmUtbG9hZGVkIHRoZSBvbGQgaG9vayBwb2ludGVycyBtYXkKICAgICBubyBsb25nZXIgYmUgdmFsaWQuIFRoaXMgZml4IGVsaW1pbmF0ZXMgcG90ZW50aWFsIHNlZ2ZhdWx0cy4KICAgICBbQWxsYW4gRWR3YXJkcyA8YWtlQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEZpeCBhIHByb2JsZW0gd2l0aCBTaWdmdW5jIG5vdCBiZWluZyBkZWZpbmVkIG9yIGJ5cGFzc2VkCiAgICAgaWYgc2lnYWN0aW9uKCkgd2Fzbid0IGZvdW5kLiBbSmltIEphZ2llbHNraV0KCiAgKikgRml4IHRoZSBsb2NraW5nIG1lY2hhbmlzbSBvbiBCU0QgdmFyaWFudHMuICBUaGV5IG5vdyB1c2UgZmNudGwKICAgICBsb2Nrcy4gIFRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYW5kIHNlcnZlIHBhZ2VzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXJzdCBjdXQgYXQgZ2V0dGluZyB0aGUgV2luMzIgaW5zdGFsbGVyIHRvIHdvcmsKICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0KCiAgKikgR2V0IGh0cGFzc3dkIGNvbXBpbGluZyB1bmRlciBXaW5kb3dzCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCgogICopIENoYW5nZSB0aGUgbG9nIG1lc3NhZ2UgZm9yIGEgYmluZCgpIGZhaWx1cmUgdG8gc2hvdyB0aGUKICAgICBpbnRlcmZhY2UgYW5kIHBvcnQgbnVtYmVyLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBJbXBvcnQgdGhlIGRvY3VtZW50YXRpb24gZnJvbSAxLjMuMTIgYW5kIGJyaW5nIHBhcnRzIG9mIGl0CiAgICAgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkCiAgICAgaW4gMi4wLgogICAgIFtUb255IEZpbmNoXQoKICAqKSBCZU9TIE1QTSB1cGRhdGVkLiAgQ0dJIGJ1ZyBvbiBCZU9TIGZpeGVkLiAgSVAgYWRkcmVzc2VzCiAgICAgbm93IGxvZ2dlZCBjb3JyZWN0bHkgb24gQmVPUy4KICAgICBbRGF2aWQgUmVpZF0KCiAgKikgQ3JlYXRlIG9uZSBtYWtlZmlsZSBmb3IgYWxsIFdpbjMyIGRpc3RyaWJ1dGlvbnMgKE5ULzIwMDAvOTUvOTgpLgogICAgIE1ha2VmaWxlLndpbiBpbmNsdWRlcyB0aGUgc2FtZSB1c2VyIGludGVyZmFjZSBhcyB0aGUgb2xkIAogICAgIE1ha2VmaWxlLm50IAogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+LCBKZWZmIFRyYXdpY2sgPHRyYXdpY2tAdXMuaWJtLmNvbT5dCgogICopIFdpbjMyIGV4ZWMgbm93IHVzZXMgQ09NU1BFQyBlbnZpcm9ubWVudCBzdHJpbmcgZm9yIGNvbW1hbmQgCiAgICAgc2hlbGwgcGF0aCByZXNvbHV0aW9uLgogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+XSBQUiMzNzE1CgogICopIFdpbjMyOiBhcF9jb25uZWN0KCkgd2FzIG5vdCByZXR1cm5pbmcgY29ycmVjdCBlcnJvciBjb25kaXRpb24KICAgICBQUjU4NjYKICAgICBbQWxsZW4gUHJlc2NvdHQgPGFsbGVuQGNsYW5wcmVzY290dC5jb20+XQoKICAqKSBXaW4zMjogYXBfb3BlbigpIHdhcyBicm9rZW4gb24gV2luOXggYmVjYXVzZSBhbiBOVC1zcGVjaWZpYwogICAgIGZsYWcgd2FzIHBhc3NlZCB0byBDcmVhdGVGaWxlLiAgYXBfcHV0cygpIGFkZGVkIGFuIHVubmVjZXNzYXJ5CiAgICAgJ1xuJy4KICAgICBbSmVmZiBUcmF3aWNrIDx0cmF3aWNrQHVzLmlibS5jb20+XQoKICAqKSBQdXQgaW4gS29yZWFuIGFuZCBOb3J3ZWdpYW4gaW5kZXguaHRtbCBwYWdlcyAoMi4wIGFuZCAxLjMpCiAgICAgd2hpY2ggd2hlcmUgZG9uYXRlZCBieSBMZWUgS3VrIEh5dW4gYW5kIExvcmFudCBDemFyYW4uICdGaXhlZCcKICAgICBjb25mdXNpbmcgZWUvZXQgbmFtZSBhbmQgbWFkZSBhbGwgZXh0ZW5zaW9ucyBsYW5ndWFnZS9kaWFsZWN0CiAgICAgcmF0aGVyIHRoYW4gY291bnRyeSByZWZsZWN0aW5nLiBDaGFuZ2VkIGV4YW1wbGUgZmlsZXMgdG8KICAgICBleHBsaWNpdCByZWZsZWN0IHRoZSBJU08gY2hhcnNldCBhbmQgYWRkZWQgYSBmZXcgY29tbW9uIAogICAgIG9uZXMgdG8gdGhlIGV4YW1wbGUgY29uZmlnIFtkaXJreF0KCiAgKikgRXh0ZW5kIGV4dGVybmFsIG1vZHVsZSBjYXBhYmlsaXR5LiAgVG8gdXNlIHRoaXMsIHlvdSBjYWxsCiAgICAgY29uZmlndXJlIHdpdGggLS13aXRoLW1vZHVsZT1wYXRoL3RvL21vZDEscGF0aC90by9tb2QyLGV0Yy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQmFja3BvcnRlZCB0aGUgdmFyaW91cyAiZGVmYXVsdCBjaGFyc2V0IiBmaXhlcyBmcm9tIDEuMy4xMiwKICAgICBpbmNsdWRpbmcgdGhlIEFkZERlZmF1bHRDaGFyc2V0IGRpcmVjdGl2ZS4gW0ppbSBKYWdpZWxza2ldCgogICopIEFkZGVkIHRoZSBjYXBhYmlsaXR5IHRvIGRvICR7RU5WVkFSfSBjb25zdHJ1Y3RzIGluIHRoZQogICAgIGNvbmZpZyBmaWxlLiBFLmcuICdTZXJ2ZXJBZG1pbiAke1BPU1RNQVNURVJ9Jy4gQXMgY29tbWl0ZWQKICAgICBpdCBkb2VzIHRoaXMgb24gYSBsaW5lIGJ5IGxpbmUgYmFzaXM7IGkuZS4gaWYgdGhlIGVudnZhcgogICAgIGV4cGFuZHMgdG8gc29tZXRoaW5nIHdpdGggc3BhY2VzIHlvdSBoYXZlIHRvIHByb3RlY3QgaXQKICAgICBieSBhZGRpbmcgcXVvdGVzIGFyb3VuZCBpdCAoVW5sZXNzIG9mIGNvdXJzZSB5b3UgZXhwZWN0IGl0CiAgICAgdG8gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gQWx0ZXJuYXRpdmVseSB5b3UKICAgICBjYW4gY29tcGlsZSBpdCBvbiBhIHBlciB0b2tlbiBiYXNpczsgd2hpY2ggaXMgd2hhdCBwZW9wbGUKICAgICB1c3VhbGx5IGV4cGVjdCBieSBzZXR0aW5nIFJFU09MVkVfRU5WX1BFUl9UT0tFTi4gQnV0IHRoaXMKICAgICBoYW1wZXJzIGZhbmNpZXIgaGFja3MuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpa10KCiAgKikgQ2hhbmdlZCB0aGUgJ0Vycm9yRG9jdW1lbnQnIHN5bnRheCBpbiB0aGF0IGl0IE5PIGxvbmdlcgogICAgIHN1cHBvcnRzIHRoZSBhc3ltZXRyaWMKCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IDMwMSAiU29tZSBtZXNzYWdlCgogICAgIE5vdGUgdGhlIG9wZW5pbmcgIiBxdW90ZSwgd2l0aG91dCBhIGNsb3NpbmcgcXVvdGUuIEl0IG5vdwogICAgIGhhcyBlaXRoZXIgdGhlIGZvbGxvd2luZyBzeW50YXhlcwoKICAgICAgICAgICAgICAgIEVycm9yRG9jdW1lbnQgWFhYIC9sb2NhbC91cmkKICAgICAgICAgICAgICAgIEVycm9yRG9jdW1lbnQgWFhYIGh0dHA6Ly92YWxpZC91cmwKICAgICAgICAgICAgICAgIEVycm9yRG9jdW1lbnQgWFhYICJTb21lIE1lc3NhZ2UiCgogICAgIFRoZSByZWNvZ25pdGlvbiBoZXVyaXN0aWMgaXM6IGlmIGl0IGhhcyBhIHNwYWNlIGl0CiAgICAgaXMgYSBtZXNzYWdlLiBJZiBpdCBoYXMgbm8gc3BhY2VzIGFuZCBzdGFydHMgd2l0aCBhIC8KICAgICBvciBpcyBhIHZhbGlkIFVSTCB0aGVuIHRyZWF0IGl0IHRoYXQgd2F5LiBPdGhlcndpc2UgaXQKICAgICBpcyBhc3N1bWVkIHRvIGJlIGEgbWVzc2FnZS4KCiAgICAgVGhpcyBicmVha3MgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgbWFrZXMgbGl2ZSBhIGhlbGwKICAgICBvZiBhIGxvdCBlYXNpZXIgZm9yIEdVSSdzIGFuZCBjb25maWcgZmlsZSBwYXJzZXJzLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIENoYW5nZWQgJ0NhY2hlTmVnb3RpYXRlZERvY3MnIGZyb20gaXRzIHByZXNlbnQvbm90LXByZXNlbnQKICAgICBzeW50YXggaW50byBhICdvbicgb3IgJ29mZicgc3ludGF4LiBBcyBpdCBjdXJyZW50bHkgaXMgdGhlCiAgICAgb25seSBub24gbmVzdGluZyB0b2tlbiB3aGljaCB1c2VzIE5PX0FSR1MgYW5kIHRodXMgaXMgYW4KICAgICBhYnNvbHV0ZSBwYWluIGZvciBhbnkgY29uZmlnIGludGVyZmFjZSBhdXRvbWF0aW9uLiBUaGlzCiAgICAgYnJlYWtzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIEFkZCBhYmlsaXR5IHRvIGFkZCBleHRlcm5hbCBtb2R1bGVzIHRvIHRoZSBidWlsZCBwcm9jZXNzLiAgVGhpcyBpcwogICAgIGRvbmUgd2l0aCAtLXdpdGgtbW9kdWxlPS9wYXRoL3RvL21vZHVsZS4gIE1vZHVsZXMgY2FuIG9ubHkgYmUgYWRkZWQKICAgICBhcyBzdGF0aWMgbW9kdWxlcyBhdCB0aGlzIHBvaW50LgogICAgIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhMQoKICAqKSBGaXggRnJlZUJTRCAzLjMgY29yZSBkdW1wLgogICAgIEJhc2ljYWxseSwgYXBfaW5pdGlhbGl6ZSgpIG5lZWRzIHRvIGdldCBjYWxsZWQgYmVmb3JlIAogICAgIGNyZWF0ZV9wcm9jZXNzKCksIHNpbmNlIGNyZWF0ZV9wcm9jZXNzKCkgcGFzc2VzIG9wX29uIHN0cnVjdHVyZQogICAgIHRvIHNlbW9wKCkgdG8gZ2V0IGEgbG9jaywgYnV0IG9wX29uIGlzbid0IGluaXRpYWxpemVkIHVudGlsIAogICAgIGFwX2luaXRpYWxpemUoKSBjYWxscyBzZXR1cF9sb2NrKCkuICBIZXJlIGlzIGEgc2xpZ2h0CiAgICAgcmVhcnJhbmdlbWVudCB0byBtYWluKCkgd2hpY2ggY2FsbHMgYXBfaW5pdGlhbGl6ZSgpIGVhcmxpZXIuLi4KICAgICBbSmVmZiBUcmF3aWNrIDx0cmF3aWNrQHVzLmlibS5jb20+XQoKICAqKSBFbmFibGUgQXBhY2hlIHRvIHVzZSBzZW5kZmlsZS9UcmFuc21pdEZpbGUgQVBJCiAgICAgW0JpbGwgU3RvZGRhcmQsIERhdmlkIFJlaWQsIFBhdWwgUmVkZXJdCgogICopIFJlLUltcGxlbWVudCBXaW4zMiBBUFIgbmV0d29yayBJL08gQVBJcyBhbmQgbW9zdCBvZiB0aGUgZmlsZSBJL08KICAgICBBUElzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBNYWtlIGZpbGUgSS9PIGFuZCBuZXR3b3JrIEkvTyB3cml0ZXYvc2VuZHYgQVBJcyBjb25zaXN0ZW50LgogICAgIEVsaW1pbmF0ZSB1c2Ugb2YgYXBfaW92ZWNfdCBhbmQgdXNlIFBvc2l4IHN0cnVjdCBpb3ZlYy4KICAgICBVc2Ugc2VwZXJhdGUgdmFyaWFibGUgb24gYXBfd3JpdGV2IHRvIHNldCB0aGUgbnVtYmVyIG9mIGlvdmVjcwogICAgIHBhc3NlZCBpbiBhbmQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEFkYXB0IGZpbGUgaW9sIHRvIHVzZSBBUFIgZnVuY3Rpb25zLiBSZXBsYWNlZCBhcF9vcGVuX2ZpbGUoKSAKICAgICB3aXRoIGFwX2NyZWF0ZV9maWxlX2lvbCgpLiBhcF9jcmVhdGVfZmlsZV9pb2woKSByZXF1aXJlcyB0aGF0IAogICAgIHRoZSBmaWxlIGJlIG9wZW5lZCBwcmlvciB0byB0aGUgY2FsbCB1c2luZyBhcF9vcGVuKCkuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFBvcnQgbW9kX2luY2x1ZGUgYW5kIG1vZF9jZ2kgdG8gMi4wCiAgICAgW1BhdWwgUmVkZXIsIEJpbGwgU3RvZGRhcmRdCgogICopIGFwX3NlbmR7LHZ9LCBhcF9yZWN2LCBhcF9zZW5kZmlsZSBBUEkgY2xhcmlmaWNhdGlvbiAtLQogICAgIGJ5dGVzX3JlYWQvYnl0ZXNfd3JpdHRlbiBpcyBhbHdheXMgdmFsaWQgKG5ldmVyIC0xKS4gIFBsdXMKICAgICBzb21lIGZpeGVzIHRvIGJ1ZmYuYyB0byBjb3JyZWN0IHByb2JsZW1zIGludHJvZHVjZWQgYnkgdGhlCiAgICAgZXJybm8gPT4gYXBfc3RhdHVzX3QgY2hhbmdlcyBhIHdoaWxlIGJhY2suICBQbHVzIGEgZml4IHRvCiAgICAgY2h1bmtlZCBlbmNvZGluZyBpbnRyb2R1Y2VkIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgMi4wLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgUmV2YW1wZWQgVU5JWCBidWlsZCBzeXN0ZW0gdG8gdXNlIGF1dG9jb25mIGFuZCBsaWJ0b29sLgogICAgIFtNYW5vaiBLYXNpY2hhaW51bGEsIFNhc2NoYSBTY2h1bWFubl0KCiAgKikgcG9ydCBtb2RfcmV3cml0ZSB0byAyLjAuIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIE1vcmUgcmlnb3JvdXMgY2hlY2tpbmcgb2YgSG9zdDogaGVhZGVycyB0byBmaXggc2VjdXJpdHkgcHJvYmxlbXMKICAgICB3aXRoIG1hc3MgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RpbmcgKHdoZXRoZXIgdXNpbmcgbW9kX3Jld3JpdGUKICAgICBvciBtb2Rfdmhvc3RfYWxpYXMpLgogICAgIFtCZW4gSHlkZSwgVG9ueSBGaW5jaF0KICAKICAqKSBBZGQgYmFjayBzdXBwb3J0IGZvciBVc2VDYW5vbmljYWxOYW1lIGluIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMuCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQWRkZWQgQVBMT0dfU1RBUlRVUCBsb2cgdHlwZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHdyaXRlIGFuIGVycm9yCiAgICAgbWVzc2FnZSB3aXRob3V0IGFueSBvZiB0aGUgZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gIEFzIGEgcGFydAogICAgIG9mIHRoaXMgY2hhbmdlLCBJIGFsc28gcmVtb3ZlZCBhbGwgb2YgdGhlIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyCiAgICAgYW5kIHJlcGxhY2VkIHRoZW0gd2l0aCBjYWxscyB0byBhcF9sb2dfZXJyb3IgdXNpbmcgQVBMT0dfU1RBUlRVUAogICAgIHdyaXRpbmcgdG8gc3RkZXJyIGlzIG5vIGxvbmdlciBwb3J0YWJsZSwgYmVjYXVzZSB3ZSBkb24ndCBkaXJlY3QgCiAgICAgc3RkZXJyIHRvIHRoZSBlcnJvciBsb2cgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUnlhbiBCbG9vbV0gCiAKICAqKSBDb252ZXJ0IGVycm9yIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRha2UgZXJybm8gYXMgYW4gYXJndW1lbnQuCiAgICAgVGhpcyBtYWtlcyBvdXIgZXJyb3IgbG9ncyBtb3JlIHBvcnRhYmxlLCBiZWNhdXNlIHNvbWUgV2luZG93cyBBUEkncyAKICAgICBkb24ndCBzZXQgZXJybm8uICBUaGlzIGNoYW5nZSBhbGxvd3MgdXMgdG8gc3RpbGwgb3V0cHV0IGEgdmFsaWQKICAgICBtZXNzYWdlIG9uIGFsbCBvZiBvdXIgcGxhdGZvcm1zLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfbWltZV9tYWdpYyBydW5zIGluIDIuMC1kZXYgbm93LgogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIHNlbmRmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIEFQUi4KICAgICBbSm9obiBaZWRsZXdza2kgPHplZGx3c2tpQFByaW5jZXRvbi5FRFU+XQoKICAqKSBidWZmLmMgaGFzIGJlZW4gY29udmVydGVkIHRvIG5vIGxvbmdlciB1c2UgZXJybm8uCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgbW9kX3NwZWxpbmcgcnVucyBpbiAyLjAtZGV2IG5vdzogYSBidWcgaW4gcmVhZGRpcl9yIGhhbmRsaW5nIGFuZAogICAgIGludGVyZmFjZSBhZGFwdGlvbiB0byBBUFIgZnVuY3Rpb25zIGRpZCBpdC4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBTdXBwb3J0IERTT3MgcHJvcGVybHkgb24gMzItYml0IEhQLVVYIDExLjAKICAgICBbRGlsaXAgS2hhbmRla2FyIDxkaWxpcEBjdXAuaHAuY29tPl0KCiAgKikgVXBkYXRlZCBNTSBpbiBBUFIgc291cmNlIHRyZWUgZnJvbSB2ZXJzaW9uIDEuMC44IHRvIDEuMC4xMQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbmVkIEFQUiBidWlsZCBlbnZpcm9ubWVudCBpbnRlZ3JhdGlvbiBhbmQgYm9vdHN0cmFwIEFQUiAKICAgICBhdXRvbWF0aWNhbGx5IGZvciBkZXZlbG9wZXJzIGZyb20gc3JjL0NvbmZpZ3VyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgYnVpbGRpbmcgb2Ygc3JjL3N1cHBvcnQvaHRwYXNzd2QuYwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgdGhlIExvY2F0aW9uOiBoZWFkZXIsIG1vZF9zcGVsaW5nIGZvcmdvdAogICAgIHRvIGVzY2FwZSB0aGUgc3BlbGxpbmctZml4ZWQgdXJpLiAoRm9ydy1Qb3J0IGZyb20gMS4zKQogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgbW9kX2F1dGhfZGlnZXN0LmMgZnJvbSBleHBlcmltZW50YWwgdG8gc3RhbmRhcmQuIFtSb3kgRmllbGRpbmddCgogICopIENoYW5nZSBhbGwgcG9vbHMgdG8gQVBSIGNvbnRleHRzLiAgVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCB0bwogICAgIGluY29ycG9yYXRpbmcgQVBSIGludG8gQXBhY2hlLiBbUnlhbiBCbG9vbV0KCiAgKikgTW92ZSAiaGFuZGxlciBub3QgZm91bmQiIHdhcm5pbmcgbWVzc2FnZSB0byBiZWxvdyB0aGUgY2hlY2sKICAgICBmb3IgYSB3aWxkY2FyZCBoYW5kbGVyLiAgW0RpcmsgPGRpcmttQHRlbGVwb3J0LmNvbT4sIFJveSBGaWVsZGluZ10KICAgICBQUiMyNTg0LCBQUiMyNzUxLCBQUiMzMzQ5LCBQUiMzNDM2LCBQUiMzNTQ4LCBQUiM0Mzg0LCBQUiM0Nzk1LCBQUiM0ODA3CgogICopIFN1cHBvcnQgbGluZS1jb250aW51YXRpb24gZmVhdHVyZSBpbiBjb25maWcub3B0aW9uIGZpbGUgYW5kCiAgICAgYWxsb3cgdGhlIGxvYWRpbmcgb2YgbXVsdGlwbGUgb3B0aW9uIHNlY3Rpb25zIGF0IG9uY2UgdmlhCiAgICAgYGAtLXdpdGgtb3B0aW9uPTxzZWN0aW9uMT4sPHNlY3Rpb24yPiwuLi4nJwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWJ1aWx0IENWUyByZXBvc2l0b3J5IHdpdGggQXBhY2hlIDEuMy45IGFzIGJhc2lzLiAgW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgTVBNCgogICopIFVzZSBhc3luY2hyb25vdXMgQWNjZXB0RXgoKSBhbmQgYSBjb21wbGV0aW9uIHBvcnQgdG8gYWNjZXB0IGFuZAogICAgIGRpc3BhdGNoIGNvbm5lY3Rpb25zIHRvIHRocmVhZHMgaW4gV2luZG93cyBOVC8yMDAwLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgSW1wbGVtZW50IFdJTk5UIFdpbjMyIE1QTSBmcm9tIG9yaWdpbmFsIFdpbjMyIGNvZGUgaW4gaHR0cF9tYWluLmMKICAgICBbQmlsbCBTdG9kZGFyZF0gIAoKICAqKSBJbXBsZW1lbnQgdGhlIEFQQUNJIC0td2l0aC1vcHRpb24gZmFjaWxpdHkgCiAgICAgKHBlciBkZWZhdWx0IHVzZWQgdGhlIGNvbmZpZy5vcHRpb24gZmlsZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1QTSBCRU9TIHBvcnQuICBbRGF2aWQgUmVpZCA8YWJiMzdAZGlhbC5waXBleC5jb20+XQoKICAqKSBTdGFydCB0byBpbXBsZW1lbnQgbW9kdWxlLWRlZmluZWQgaG9va3MgdGhhdCBhcmUgYSkgZmFzdCBhbmQgYikgdHlwZXNhZmUuCiAgICAgUmVwbGFjZSBwcmVfY29ubmVjdGlvbiBtb2R1bGUgY2FsbCB3aXRoIGEgcmVnaXN0ZXJfaG9vayBjYWxsIGFuZAogICAgIGltcGxlbWVudCBwcmVfY29ubmVjdGlvbiBhcyBhIGhvb2suIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGVzZSBob29rcyB3aWxsCiAgICAgYmUgZXh0ZW5kZWQgdG8gYWxsb3cgQXBhY2hlIHRvIGJlIG11bHRpLXByb3RvY29sLCBhbmQgYWxzbyB0byBhbGxvdyB0aGUKICAgICBjYWxsaW5nIG9yZGVyIHRvIGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob29rL3Blci1tb2R1bGUgYmFzaXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEltcGxlbWVudCBtcG1fKiBtZXRob2RzIGFzICJtb2R1bGVzIi4gRWFjaCBtZXRob2QgZ2V0cyBpdHMgb3duCiAgICAgc3ViZGlyIGluIHNyYy9tb2R1bGVzIChlZzogc3JjL21vZHVsZXMvcHJlZm9yaykuIFNlbGVjdGlvbgogICAgIG9mIG1ldGhvZCB1c2VzIFJ1bGUgTVBNX01FVEhPRC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQb3J0IHRoZSBoeWJyaWQgc2VydmVyIGZyb20gdGhlIGFwYWNoZS1hcHIgcmVwb3NpdG9yeSBhcwogICAgIG1wbV9tcG10X3B0aHJlYWQuICBbTWFub2ogS2FzaWNoYWludWxhXQoKICAqKSBvcy91bml4L3VuaXhkLltjaF06IGRldGFjaCwgc2V0dWlkLCBzZXRnaWQsIHN0dWZmIHdoaWNoIHdpbGwgYmUgY29tbW9uCiAgICAgYW1vbmdzdCB0aGUgdW5peCBNUE1zLgoKICAqKSBtcG1fcHJlZm9yazogdGhyb3cgYXdheSBhbGwgdGhlIGFsYXJtL3RpbWVvdXQgY3J1ZDsgYW5kIGNsZWFuIHVwIHRoZQogICAgIHNpZ25hbCBoYW5kbGluZyBmb3IgdGhlIG5ldyB3b3JsZCBvcmRlci4gIFtEZWFuIEdhdWRldF0KCiAgKikgQ3J1ZGUgYXBfdGhyZWFkX211dGV4IGFic3RyYWN0aW9uIHNvIHRoYXQgd2UgZ2V0IHRoZSBwdGhyZWFkIHN0dWZmIG91dAogICAgIG9mIGFsbG9jLmMgZm9yIG5vdy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSGFuZGxlIHBhcnRpYWwgbGFyZ2Ugd3JpdGVzIGNvcnJlY3RseS4gIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgY29ubl9yZWMncyBwb2ludGVyIHRvIHNlcnZlci4gQWxsIGl0IGtub3dzIGlzIHRoZSBiYXNlIHNlcnZlcgogICAgIGJhc2VkIG9uIElQL3BvcnQuICBbQmVuIExhdXJpZV0KCiAgKikgUG9ydCBhIGJ1bmNoIG9mIG1vZHVsZXMgdG8gdGhlIG5ldyBtb2R1bGUgc3RydWN0dXJlLgogICAgIFsiTWljaGFlbCBILiBWb2FzZSIgPG12b2FzZUBtaWRjb2FzdC5jb20uYXU+XQoKICAqKSBJL08gbGF5ZXJpbmcgYW5kIEJVRkYgcmV2YW1wLiAgU2VlIGRvY3MvYnVmZi50eHQuICBbRGVhbiBHYXVkZXRdCgogICopIEJhc2ljIHJlc3RydWN0dXJpbmcgdG8gaW50cm9kdWNlIHRoZSBNUE0gY29uY2VwdDsgaW5jbHVkZXMgdmFyaW91cwogICAgIGNoYW5nZXMgdG8gdGhlIG1vZHVsZSBBUEkuLi4gYmV0dGVyIGRlc2NyaWJlZCBieQogICAgIGRvY3MvaW5pdGlhbF9ibHVyYi50eHQuICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIHB0aHJlYWRzCgogICopIE5ldyBidWZmIG9wdGlvbiBhZGRlZDogQk9fVElNRU9VVC4gSXQgZGVzY3JpYmVzIHRoZSB0aW1lb3V0IGZvcgogICAgIGJ1ZmYgb3BlcmF0aW9ucyAoZ2VuZXJhbGx5IG92ZXIgYSBuZXR3b3JrKS4KICAgICBbRGVhbiBHYXVkZXQsIFJ5YW4gQmxvb20sIE1hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQ3JlYXRlZCBodHRwX2FjY2VwdCBhYnN0cmFjdGlvbi4gQWRkZWQgNCBuZXcgZnVuY3Rpb25zIChub3QgZXhwb3J0ZWQpOgogICAgIGluaXRfYWNjZXB0KCksIGJlZ2luX2FjY2VwdGluZ19yZXF1ZXN0cygpLCBnZXRfcmVxdWVzdCgpLCAKICAgICBzdG9wX2FjY2VwdGluZ19yZXF1ZXN0cygpIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggdG8gYXBfcnByaW50ZiBjYWxsIHRoYXQgYWxsb3dzIG1vZF9pbmZvIHRvIHdvcmsgcHJvcGVybHkuCiAgICAgW0phbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1Pl0KCiAgKikgdXNlciBhbmQgYXBfYXV0aF90eXBlIGZpZWxkcyB3ZXJlIG1vdmVkIGZyb20gY29ubmVjdGlvbl9yZWMgdG8gCiAgICAgcmVxdWVzdF9yZWMuIFtSeWFuIEJsb29tXSAKCiAgKikgUmVtb3ZlZCB0aGUgYXBfYmxvY2tfYWxhcm1zIGFuZCBhcF91bmJsb2NrX2FsYXJtIGNhbGxzLiAgVGhlc2UgYXJlbid0CiAgICAgbmVlZGVkIGluIGEgdGhyZWFkZWQgc2VydmVyLgoKICAqKSBJbml0aWFsIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gZnJvbSBmcm9tIERlYW4ncyBhcGFjaGUtbnNwciBjb2RlLgogICAgIFtCaWxsIFN0b2RkYXJkLCBSeWFuIEJsb29tXQoKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjkKCiAgKikgUmVtb3ZlIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHJlZGlyZWN0IGRvZXNuJ3Qgc2V0IExvY2F0aW9uLgogICAgIEluc3RlYWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgY29yZWR1bXAgaWYgdGhlIGVycm9yIG1lc3NhZ2UKICAgICB3YXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBhIGxvY2F0aW9uLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRG9uJ3QgYWxsb3cgY29uZmlndXJlIHRvIGluY2x1ZGUgbW9kX2F1dGhfZGlnZXN0IHVubGVzcyBpdCBpcwogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBldmVuIGlmIHRoZSB1c2VyIGFza2VkIGZvciBhbGwgbW9kdWxlcy4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBUcmFuc2xhdGUgbW9kdWxlIG5hbWVzIHRvIGRsbCBuYW1lcyBmb3IgT1MvMiBzbyB0aGF0IHRoZXkgYXJlIG5vIG1vcmUKICAgICB0aGFuIDggY2hhcmFjdGVycyBsb25nIGFuZCBoYXZlIGFuIGV4dGVuc2lvbiBvZiAiZGxsIiBpbnN0ZWFkIG9mICJzbyIuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgUHJpbnQgb3V0IHBvaW50ZXIgdG8gUnVsZSBERVZfUkFORE9NIHdoZW4gdHJ1ZXJhbmQgbGliIG5vdCBmb3VuZC4KICAgICBGaXggdGVzdC1jb21waWxlIGNoZWNrIHRvIGNoZWNrIGZvciByYW5kYnl0ZSBpbnN0ZWFkIG9mIHRyYW5kMzIuCiAgICAgVXNlIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkvZGVjb2RlIGluc3RlYWQgb2YgY29weSBpbiBtb2RfYXV0aF9kaWdlc3QuYwogICAgIGFuZCB0d2VhayB0byBtYWtlIEFtYXlhIGhhcHBpZXIuICBbUm9uYWxkIFRzY2hhbORyXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgaW5zdGFsbGVkIGV4cGF0IGluY2x1ZGUgZmlsZXMgYXJlIHdvcmxkIHJlYWRhYmxlLAogICAgIGp1c3QgbGlrZSB0aGUgb3RoZXIgaGVhZGVyIGZpbGVzLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXhlZCBnZW5lcmF0ZWQgQWRkTW9kdWxlIGFkanVzdG1lbnRzIGluIEFQQUNJJ3MgYGNvbmZpZ3VyZScgc2NyaXB0CiAgICAgaW4gb3JkZXIgdG8gYWxsb3cgKG5ldykgbW9kdWxlcyBsaWtlIG1vZF92aG9zdF9hbGlhcyB0byBiZSBoYW5kbGVkCiAgICAgY29ycmVjdGx5ICh3aGljaCB3YXMgdG91Y2hlZCBieSB0aGUgYWRqdXN0bWVudHMgZm9yIG1vZF9hbGlhcykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZvciBiaW5hcnkgYnVpbGRzLCBhZGQgLVIgZmxhZyB0byBhcGFjaGVjdGwgdG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2YKICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSAuL2xpYmV4ZWMgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWJodHRwLmVwIGZpbGUKICAgICBpcyBuZWVkZWQgZm9yIFNIQVJFRF9DT1JFIGFyY2hpdGVjdHVyZXMuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgV0lOMzI6IENyZWF0ZSB0aGUgQ0dJIHNjcmlwdCBwcm9jZXNzIGFzIERFVEFDSEVELiAgVGhpcyBtYXkgc29sdmUgdGhlCiAgICAgcHJvYmxlbSBvYnNlcnZlZCBieSBzb21lIFdpbjk1Lzk4IHVzZXJzIHdoZXJlIHRoZXkgZ2V0IENHSSBzY3JpcHQKICAgICBvdXRwdXQgc2VudCB0byB0aGUgY29uc29sZS4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggKHJlKW5hbWluZyBpbiB0aGUgdXVlbmNvZGUvZGVjb2RlIHNlY3Rpb24uIFRoZSBhcC9hcF8KICAgICByb3V0aW5lcyBhcmUgbm93IGNhbGxlZCBhcF9iYXNlNjQqIGFuZCBhcmUgJ3BsYWluJyAoaS5lLiwgbm8gCiAgICAgcG9vbCBhY2Nlc3Mgb3IgYW55dGhpbmcgY2xldmVyKS4gSW5zaWRlIHV0aWwuYyB0aGUgcm91dGluZXMgYWN0aW5nCiAgICAgbGlrZSBwc3RyZHVwIGFyZSBjYWxsZWQgYXBfcGJhc2U2NGVuY29kZSgpIGFuZCBhcF9wYmFzZTY0ZGVjb2RlKCkuCiAgICAgVGhlIG9kZGx5IG5hbWVkIGFwX3V1ZW5jb2RlKCksIGFwX3V1ZGVjb2RlKCkgYXJlIGtlcHQgYXJvdW5kIGZvcgogICAgIG5vdyBidXQgZGVwcmVjYXRlZC4gIFtkaXJreF0KCiAgKikgQ2xlYW4gdXAgdGhlIGJhc2U2NCBhbmQgU0hBMSBhZGRpdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZQogICAgIHJlcHJlc2VudGVkIGluIHRoZSBBcGFjaGVDb3JlLmRlZiwgQXBhY2hlQ29yZU9TMi5kZWYsIGFuZCBodHRwZC5leHAKICAgICBmaWxlcy4gIFtSb3kgRmllbGRpbmddCgogICopIFdJTjMyOiBNaWdyYXRlIHRvIEluc3RhbGxTaGllbGQgNS41IGFuZCBwcm92aWRlIGEgYml0IG1vcmUgZXJyb3IKICAgICBjaGVja2luZy4gIEFsbG93IGNvbXBpbGluZyBvbiBWUyA2LjAuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgYXNzdW1wdGlvbiBvZiBhYnNvbHV0ZSBwYXRocyBpbiBiaW5idWlsZC5zaC4gIFtUb255IEZpbmNoXQoKICAqKSBVc2UgVGVzdENvbXBpbGUgdG8gc2VhcmNoIGZvciB0aGUgdHJ1ZXJhbmQgbGlicmFyeSAocmF0aGVyIHRoYW4gYmxpbmRseQogICAgIGFzc3VtaW5nIGl0cyBleGlzdGVuY2UpLiBJZiBpdCBpcyBub3QgZm91bmQsIGNvbXBsYWluIChidXQgZG8gbm90CiAgICAgZXhpdCAtIHlldCkuICBbTWFydGluIEtyYWVtZXJdCgogICopIFdlIGZvcmdvdCB0byBhZGQgdGhlIG5ldyBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0bwogICAgIHNyYy9zdXBwb3J0L2h0dHBkLmV4cC4gIFtCaWxsIFN0b2RkYXJkLCBSYW5keSBUZXJidXNoXQoKICAqKSBBZGQgZGVzY3JpcHRpb24gb2YgLVQgY29tbWFuZC1saW5lIG9wdGlvbiB0byB1c2FnZSgpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGb3IgInNvbWUiIHBsYXRmb3JtcyAobm90YWJseSwgRUJDRElDIGJhc2VkIG9uZXMpLCBsaWJvcyBuZWVkcyB0byBiZQogICAgIHNlYXJjaGVkIG9ubHkgQUZURVIgbGliYXAgaGFzIGJlZW4gc2VhcmNoZWQsIGJlY2F1c2UgbGliYXAgbmVlZHMKICAgICBzb21lIHN5bWJvbHMgZnJvbSBsaWJvcy4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IGNvbmZsaWN0IHdpdGggb3JpZ2luYWwgbW9kX2RpZ2VzdCByZWxhdGVkIHRvIHRoZSBzeW1ib2wgb2YgdGhlCiAgICAgbW9kdWxlIGRpc3BhdGNoIGxpc3QgKHdoaWNoIGhhcyB0byBiZSB1bmlxdWUgZm9yIERTTyBhbmQgZm9sbG93IHRoZQogICAgIHVzdWFsIGNvbnZlbnRpb25zIGZvciB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBhIGRibS1saWJyYXJ5IGNoZWNrIGZvciB0aGUgInVzdWFsIHBsYWNlcyIgKC1sZGJtLCAtbG5kYm0sIC1sZGIpCiAgICAgZm9yIG90aGVyIHBsYXRmb3JtcyBhcyB3ZWxsLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBNYWtlIGFwX3NoYTEuYyBjb21waWxlIGZvciBFQkNESUMgcGxhdGZvcm1zOiByZXBsYWNlIHJlbWFpbmluZyBMT05HCiAgICAgdHlwZXMgYnkgQVBfTE9ORyBhbmQgcmVwbGFjZSByZWZlcmVuY2UgdG8gcmVuYW1lZCB2YXJpYWJsZSAndWJ1ZicKICAgICBieSAnYnVmZmVyJy4gIFtNYXJ0aW4gS3JhZW1lcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjggW25vdCByZWxlYXNlZF0KCiAgKikgRmx1c2ggdGhlIG91dHB1dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VuZGluZyBhbiBlcnJvciBvciByZWRpcmVjdAogICAgIHJlc3BvbnNlLCBzaW5jZSB0aGUgcmVzdWx0IG1heSBiZSBuZWVkZWQgYnkgdGhlIGNsaWVudCB0byBhYm9ydCBhCiAgICAgbG9uZyBkYXRhIHRyYW5zZmVyIG9yIHJlc3RhcnQgYSBzZXJpZXMgb2YgcGlwZWxpbmVkIHJlcXVlc3RzLgogICAgIFtUb20gVmF1Z2hhbiA8dHZhdWdoYW5AYXZlbnRhaWwuY29tPiwgUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBJbXByb3ZlZCBjb21waWxhdGlvbiBhbmQgRFNPIHN1cHBvcnQgb24gU2VxdWVudCBEWU5JWC9wdHguCiAgICAgW0lhbiBUdXJuZXIgPGlhbnRAc2VxdWVudC5jb20+XSBQUiM0NzM1CgogICopIExvY2FsIHN0cnVjdCBtbWFwIGluIGh0dHBfY29yZS5jIGNvbmZsaWN0ZWQgd2l0aCBzeXN0ZW0gc3RydWN0dXJlCiAgICAgbmFtZSBvbiBEWU5JWCAtLSBjaGFuZ2VkIHRvIG1tYXBfcmVjLiAgW1JveSBGaWVsZGluZ10gUFIjNDczNQoKICAqKSBBZGRlZCB1cGRhdGVkIG1vZF9kaWdlc3QgYXMgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfZGlnZXN0LgogICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZEBpbm5vdmF0aW9uLmNoPl0KCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hlcmUgdGhlIG1vZHVsZSBjb3VudHMgd2VyZSBnZXR0aW5nIG1lc3NlZAogICAgIHVwIGFjcm9zcyByZXN0YXJ0cy4gIFtEYXZpZCBIYXJyaXMgPGRoYXJyaXNAZHJoLm5ldD5dCgogICopIENJRFIgYWRkcmVzc2VzIHN1Y2ggYXMgYS5iLmMuZC8yNCB3aGVyZSBkICE9IDAgd2VyZW4ndCBoYW5kbGVkCiAgICAgcHJvcGVybHkgaW4gbW9kX2FjY2Vzcy4KICAgICBbIlBhdWwgSi4gUmVkZXIiIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dIFBSIzQ3NzAKCiAgKikgUmV3cml0ZUxvY2svUmV3cml0ZU1hcCBkaWRuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHZpcnR1YWwgaG9zdHMuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hQGJvZy5tc3Uuc3U+XSBQUiMzODc0CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIGNvbXBhcS90YW5kZW0vY29tLgogICAgIFtNaWNoYWVsIE90dGF0aSA8bWljaGFlbC5vdHRhdGlAY29tcGFxLmNvbT4sIGRpcmt4XQoKICAqKSBBZGRlZCBTSEExIHBhc3N3b3JkIGVuY3J5cHRpb24gc3VwcG9ydCB0byBlYXN5IG1pZ3JhdGlvbiBmcm9tIAogICAgIE5ldHNjYXBlIHNlcnZlcnMuIFNlZSBzdXBwb3J0L1NIQTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgQ2F1c2VkIHRoZSBzZXBhcmF0aW9uIG9mIGFwX21kNS5jIGludG8gbWQ1LCBzaGExIGFuZCBhIGdlbmVyYWwKICAgICBhcF9jaGVja3Bhc3MuYyB3aXRoIGp1c3QgYSB2YWxpZGF0ZV9wYXNzd2Qgcm91dGluZS4gQWRkZWQgYQogICAgIGNvdXBsZSBvZiBmbGFncyB0byBzdXBwb3J0L2h0cGFzc3dkLiBTb21lIHJldXNlIG9mIHRoZSB0bzY0KCkKICAgICBmdW5jdGlvbjsgaGVuY2UgcmVuYW1lZCB0byBhcF90bzY0KCkuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpaywgQ2xpbnRvbiBXb25nIDxjbGludGR3QG5ldGNvbS5jb20+XQoKICAqKSBDaGFuZ2UgZm9yIEVCQ0RJQyBwbGF0Zm9ybXMgKFRQRiBhbmQgQlMyMDAwKSB0byBjb3JyZWN0bHkgZGVhbAogICAgIHdpdGggQVNDSUkvRUJDRElDIGNvbnZlcnNpb25zIGluICJpZGVudCIgcXVlcnkuCiAgICAgW0RhdmlkIE1jQ3JlZWR5IDxNY0NyZWVkeUB1cy5pYm0uY29tPl0KCiAgKikgR2V0IHJpZCBvZiByZWRlZmluaXRpb24gd2FybmluZyBvbiBNQUNfT1NfWF9TRVJWRVIgcGxhdGZvcm0uCiAgICAgQ2hhbmdlICJQb3dlciBNYWNpbnRvc2giIHRvIFBvd2VyKiBzbyBpZiB1bmFtZSBwcmludHMgIlBvd2VyIEJvb2siCiAgICAgd2UncmUgc3RpbGwgaGFwcHkgb24gUmhhcHNvZHkgcGxhdGZvcm1zLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBTSUdTRUdWIG9uIHNvbWUgc3lzdGVtcyBiZWNhdXNlIHRoZSBWYXJ5IGZpeCBiZWxvdyBpbmNsdWRlZAogICAgIGEgY2FsbCB0byB0YWJsZV9kbyB3aXRoIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCB0aGF0IHdhcyBub3QKICAgICBOVUxMIHRlcm1pbmF0ZWQuICBSZXBsYWNlZCB3aXRoIGJldHRlciBpbXBsZW1lbnRhdGlvbi4gW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjcgW25vdCByZWxlYXNlZF0KCiAgKikgVGhlICJWYXJ5IiByZXNwb25zZSBoZWFkZXIgZmllbGQgaXMgbm93IHNhbml0aXNlZCByaWdodCBiZWZvcmUKICAgICB0aGUgaGVhZGVyIGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LiAgTXVsdGlwbGUgIlZhcnkiIGZpZWxkcwogICAgIGFyZSBjb21iaW5lZCwgYW5kIGR1cGxpY2F0ZSB0b2tlbnMgKGUuZy4sICJWYXJ5OiBob3N0LCBob3N0IiBvcgogICAgICJWYXJ5OiBob3N0LCBuZWdvdGlhdGUsIGhvc3QsIGFjY2VwdC1sYW5ndWFnZSIpIGFyZSByZWR1Y2VkIHRvCiAgICAgc2luZ2xlIGluc3RhbmNlcy4gIFRoaXMgaXMgYSBiZXR0ZXIgc29sdXRpb24gdGhhbiB0aGUgZm9yY2Utbm8tdmFyeQogICAgIG9uZSAod2hpY2ggaXMgc3RpbGwgdmFsaWQgZm9yIGNsaWVudHMgdGhhdCBjYW4ndCBjb3BlIHdpdGggVmFyeQogICAgIGF0IGFsbCkuICBQUiMzMTE4IFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nLCBLZW4gQ29hcl0KCiAgKikgUG9ydGFiaWxpdHkgY2hhbmdlcyBmb3IgQmVPUy4gW0RhdmlkIFJlaWQgYWJiMzdAZGlhbC5waXBleC5jb21dCgogICopIExpbmsgRFNPJ3Mgd2l0aCAiZ2NjIC1zaGFyZWQiIGluc3RlYWQgb2YgImxkIC1Cc2hhcmVhYmxlIiBhdCAKICAgICBsZWFzdCBvbiBMaW51eCBhbmQgRnJlZUJTRCBmb3Igbm93LiAgCiAgICAgW1Jhc211cyBMZXJkb3JmXQoKICAqKSBXaW4zMjogTW9yZSBhcGFjaGUgLWsgcmVzdGFydCB3b3JrLiBSZXN0YXJ0cyBhcmUgbm93IGhvbm9yZWQKICAgICBpbW1lZGlhdGVseSBhbmQgY29ubmVjdGlvbnMgaW4gdGhlIGxpc3RlbiBxdWV1ZSBhcmUgLW5vdC0gbG9zdC4KICAgICBUaGlzIGlzIG1hZGUgcG9zc2libGUgYnkgdGhlIHVzZSBvZiB0aGUgV1NBRHVwbGljYXRlU29ja2V0KCkKICAgICBjYWxsLiAgVGhlIGxpc3RlbmVycyBhcmUgb3BlbmVkIGluIHRoZSBwYXJlbnQsIGR1cGxpY2F0ZWQsIHRoZW4KICAgICB0aGUgZHVwbGljYXRlcyBhcmUgcGFzc2VkIHRvIHRoZSBjaGlsZC4gVGhlIG9yaWdpbmFsIGxpc3RlbiBzb2NrZXRzIAogICAgIGFyZSBub3QgY2xvc2VkIGJ5IHRoZSBwYXJlbnQgYWNyb3NzIGEgcmVzdGFydCwgdGh1cyB0aGUgbGlzdGVuIHF1ZXVlIAogICAgIGlzIHByZXNlcnZlZC4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRml4IGhhbmRsaW5nIG9mIGNhc2Ugd2hlbiBhIGNsaWVudCBoYXMgc2VudCAiRXhwZWN0OiAxMDAtY29udGludWUiCiAgICAgYW5kIHdlIGFyZSBnb2luZyB0byByZXNwb25kIHdpdGggYW4gZXJyb3IsIGJ1dCBnZXQgc3R1Y2sgd2FpdGluZyB0bwogICAgIGRpc2NhcmQgdGhlIGJvZHkgaW4gdGhlIHBvaW50bGVzcyBob3BlIG9mIHByZXNlcnZpbmcgdGhlIGNvbm5lY3Rpb24uCiAgICAgW1JveSBGaWVsZGluZywgSm9lIE9ydG9uIDxqZW8xMDFAeW9yay5hYy51az5dIFBSIzQ0OTksIFBSIzM4MDYKCiAgKikgRml4ICdjb25maWd1cmUnIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggU3lzVi1iYXNlZCB2ZXJzaW9ucyBvZgogICAgICd0cicgKGNvbnNpc3RlbnQgd2l0aCBDb25maWd1cmUncyB1c2UgYXMgd2VsbCkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBhcHhzOiBBZGQgIi1TIHZhcj12YWwiIG9wdGlvbiB3aGljaCBhbGxvd3MgZm9yIG92ZXJyaWRlIG9mIENGR18qCiAgICAgYnVpbHQtaW4gdmFsdWVzLiBBZGQgIi1lIiBvcHRpb24gd2hpY2ggd29ya3MgbGlrZSAtaSBidXQgZG9lc24ndAogICAgIGluc3RhbGwgdGhlIERTTzsgdXNlZnVsIGZvciBlZGl0aW5nIGh0dHBkLmNvbmYgd2l0aCBhcHhzLiBGaXgKICAgICBlZGl0aW5nIGNvZGUgc28gdGhhdCBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiBhcHhzIC1hIHdpbGwgbm90CiAgICAgY3JlYXRlIGR1cGxpY2F0ZSBMb2FkTW9kdWxlL0FkZE1vZHVsZSBlbnRyaWVzOyBhcHhzIGNhbiBub3cgYmUKICAgICB1c2VkIHRvIHJlLSBlbmFibGUvZGlzYWJsZSBhIG1vZHVsZS4gIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBXaW4zMjogVXBkYXRlIHRoZSBzZXJ2ZXIgdG8gdXNlIFdpbnNvY2sgMi4gU3BlY2lmaWNhbGx5LCBsaW5rIHdpdGgKICAgICB3czJfMzIubGliIHJhdGhlciB0aGFuIHdzb2NrMzIubGliLiAgVGhpcyBnaXZlcyB1cyBhY2Nlc3MgdG8gCiAgICAgV1NBRHVwbGNhdGVTb2NrZXQoKSBpbiBhZGRpdGlvbiB0byBzb21lIG90aGVyIGVuaGFuY2VkIGNvbW0gQVBJcy4KICAgICBXaW4gOTUgdXNlcnMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoZWlyIFRDUC9JUCBzdGFjayB0byBwaWNrIHVwCiAgICAgV2luc29jayAyLiAoU2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW5kb3dzOTUvZG93bmxvYWRzLykKICAgICBbQmlsbCBTdG9kZGFyZCBzdG9kZGFyZEByYWxlaWdoLmlibS5jb21dCgogICopIFdpbjMyOiBSZWRpcmVjdCBDR0kgc2NyaXB0IHN0ZGVyciAoc2NyaXB0IGRlYnVnIGluZm8pIGludG8gdGhlIAogICAgIGVycm9yLmxvZyB3aGVuIENHSSBzY3JpcHRzIGZhaWwuIFRoaXMgbWFrZXMgQXBhY2hlIG9uIFdpbjMyIAogICAgIGJlaGF2ZSBtb3JlIGxpa2UgVW5peC4gICAgICAKICAgICBbQmlsbCBTdG9kZGFyZCBzdG9kZGFyZEByYWxlaWdoLmlibS5jb21dCgogICopIEZpeGVkIGBodHRwZCcgdXNhZ2UgZGlzcGxheTogLUQgd2FzIG1pc3NpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzQ2MTQKCiAgKikgRml4IGBtYWtlIHInIHRlc3QgcHJvY2VkdXJlIGluIHNyYy9yZWdleC86IGFwX2lzcHJpbnQgd2FzIG5vdCBmb3VuZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDU2MSwgUFIjNDU2MgoKICAqKSBPUy8yOiBGaXggcHJvYmxlbSB3aXRoIGFjY2VwdCBsb2NrIHNlbWFwaG9yZXMgd2hlcmUgc2VydmVyIHdvdWxkIGRpZSB3aXRoCiAgICAgIk9TMlNFTTogRXJyb3IgMTA1IGdldHRpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIiAKICAgICBbQnJpYW4gSGF2YXJkXSBQUiM0NTA1CgogICopIEFkZCBEU08gc3VwcG9ydCBmb3IgREdVWCA0LnggdXNpbmcgZ2NjLiBUZXN0ZWQgb24geDg2IHBsYXRmb3Jtcy4KICAgICBbUmFuZHkgVGVyYnVzaCA8cmFuZHlAY292YWxlbnQubmV0Pl0KIAogICopIEFkZCB0aGUgbmV3IG1hc3Mtdmhvc3QgbW9kdWxlIChtb2Rfdmhvc3RfYWxpYXMuYykgZGV2ZWxvcGVkIGFuZAogICAgIHVzZWQgYnkgRGVtb24gSW50ZXJuZXQsIEx0ZC4gW1RvbnkgRmluY2ggPGZhbmZAZGVtb24ubmV0Pl0KCiAgKikgQmV0dGVyIEdDQyBkZXRlY3Rpb24gZm9yIERTTyBmbGFncyB1bmRlciBTb2xhcmlzIDIgd2hlcmUgdGhlIGBjYycgCiAgICAgY29tbWFuZCBwb3RlbnRpYWxseSBfaXNfIEdDQy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBhcHhzIGJ1aWxkIGlzc3VlcyBvbiBBSVggCiAgICAgW1Jhc211cyBMZXJkb3JmIDxyYXNtdXNAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRG9jdW1lbnRSb290IENoZWNraW5nOiBVbmRlciBwcmV2aW91cyB2ZXJzaW9ucywgd2hlbiBBcGFjaGUKICAgICBmaXJzdCBzdGFydGVkIHVwLCBpdCB1c2VkIHRvIGRvIGEgc3RhdCBvZiBlYWNoIERvY3VtZW50Um9vdCB0bwogICAgIHNlZSBpZiBpdCBleGlzdGVkIGFuZCB3YXMgYSBkaXJlY3RvcnkuIElmIG5vdCwgdGhlbiBhbiBlcnJvcgogICAgIG1lc3NhZ2Ugd2FzIHByaW50ZWQuIFRISVMgSEFTIEJFRU4gRElTQUJMRUQuIElmIERvY3VtZW50Um9vdAogICAgIGRvZXMgbm90IGV4aXN0LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZXMgaW4gZXJyb3JfbG9nLiBJZgogICAgIHRoZSAnLXQnIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZCAodG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24pCiAgICAgdGhlIGNoZWNrIG9mIERvY3VtZW50Um9vdCBJUyBwZXJmb3JtZWQuIEFuIGFkZGl0aW9uYWwgY29tbWFuZAogICAgIGxpbmUgb3B0aW9uLCAnLVQnLCBoYXMgYmVlbiBhZGRlZCBpZiB5b3Ugd2FudCB0byBhdm9pZCB0aGUKICAgICBEb2N1bWVudFJvb3QgY2hlY2sgZXZlbiB3aGVuIGNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9uLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBXaW4zMjogVGhlIHF1ZXJ5IHN3aXRjaCAiYXBhY2hlIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtCaWxsIFN0b2RkYXJkIC0gRml4ZWQgYnkgTWFydGluIG9uIFVuaXggaW4gMS4zLjRdCgogICopIFdpbjMyOiBDaGFuZ2VkIGJlaGF2aW91ciBvZiBhcGFjaGUgLWsgcmVzdGFydC4gCiAgICAgUHJldmlvdXNseSwgdGhlIHNlcnZlciB3b3VsZCBkcmFpbiBhbGwgY29ubmVjdGlvbnMgaW4gdGhlIHN0YWNrJ3MKICAgICBsaXN0ZW4gcXVldWUgYmVmb3JlIGhvbm9yaW5nIHRoZSByZXN0YXJ0LiBPbiBhIGJ1c3kgc2VydmVyLCB0aGlzCiAgICAgY291bGQgdGFrZSBob3Vycy4gIE5vdywgYSByZXN0YXJ0IGlzIGhvbm9yZWQgYWxtb3N0IGltbWVkaWF0ZWx5LiAKICAgICBBbGwgY29ubmVjdGlvbnMgaW4gQXBhY2hlJ3MgcXVldWVzIGFyZSBoYW5kbGVkIGJ1dCBjb25uZWN0aW9ucyBpbiAKICAgICB0aGUgc3RhY2sncyBsaXN0ZW4gcXVldWUgYXJlIGRpc2NhcmRlZC4gUmVzdGFydCB0cmlnZ2VyZWQgYnkgCiAgICAgTWF4UmVxdWVzdFBlckNoaWxkIGlzIHVuY2hhbmdlZC4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZWQgdW5uZWNlc3NhcnkgY2FsbCB0byB3YWl0X2Zvcl9tdWx0aXBsZV9vYmplY3RzIGluCiAgICAgdGhlIGFjY2VwdCBsb29wLiBHb29kIGZvciBhIDUlIHBlcmZvcm1hbmNlIGJvb3N0LiBDbGVhbmVkIHVwIAogICAgIHBhcmVudC9jaGlsZCBwcm9jZXNzIG1hbmFnZW1lbnQgY29kZS4gCiAgICAgW0JpbGwgU3RvZGRhcmQgPHN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFkZGVkIGNlaWxpbmcgb24gZmlsZSBzaXplIGZvciBtZW1vcnkgbWFwcGVkIGZpbGVzLgogICAgIFtKb2huIEdpYW5uYW5kcmVhIDxqZ0BtZWVyLm5ldD5dIFBSIzQxMjIKCiAgKikgRml4IG5kYm0uaCBpbmNsdWRlIHByb2JsZW1zIHdpdGggYnJhaW4tZGVhZCBnbGliYyA+PSAyLjEgd2hpY2ggCiAgICAgaGFzIG5kYm0uaCBpbiBhIG5vbi1zdGFuZGFyZCBkYjEvIHN1YmRpci4gUFIjNDQzMSwgUFIjNDUyOAogICAgIFtIZW5yaSBHb21leiA8Z29tZXpAc2xpYi5mcj4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIAoKICAqKSBEZXRlcm1pbmUgQVBfQllURV9PUkRFUiBmb3IgYXBfY29uZmlnX2F1dG8uaCBhbmQgYWxyZWFkeQogICAgIHVzZSB0aGlzIGF0IGxlYXN0IGZvciBFeHBhdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IC5tb2R1bGUgZmlsZXMgdG8gc3BlY2lmeSBsaWJyYXJpZXMgd2l0aCBMaWI6LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBTZXRFbnZJZltOb0Nhc2VdIHRvIHRlc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBoZWFkZXIgZmllbGRzIGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMuICBbS2VuIENvYXJdCgogICopIEZpeCBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgU2NhbkhUTUxUaXRsZXMgd2hlbiBmaWxlCiAgICAgY29udGVudC10eXBlcyBhcmUgInRleHQvaHRtbDtwYXJhbWV0ZXJzIi4gIFBSIzQ1MjQgIFtLZW4gQ29hcl0KCiAgKikgUmVtb3ZlICJteGIiIHN1cHBvcnQgZnJvbSBtb2RfbmVnb3RpYXRpb24gLS0gaXQgd2FzIGEgZHJhZnQgZmVhdHVyZQogICAgIG5ldmVyIGFjY2VwdGVkIGludG8gYW55IHN0YW5kYXJkLCBhbmQgaXQgb3BlbnMgdXAgY2VydGFpbiBEb1MKICAgICBhdHRhY2tzLiAgW0tvZW4gSG9sdG1hbiA8S29lbi5Ib2x0bWFuQGNlcm4uY2g+XQoKICAqKSBUZXN0Q29tcGlsZSB1cGRhdGVkLiBXZSBjYW4gbm93IHJ1biBwcm9ncmFtcyBhbmQgb3V0cHV0IHRoZQogICAgIHJlc3VsdHMgZHVyaW5nIHRoZSBDb25maWd1cmUgcHJvY2Vzcy4gWyBKaW0gSmFnaWVsc2tpXQoKICAqKSBUaGUgc291cmNlIGlzIG5vdyBxdWFkIChsb25nIGxvbmcpIGF3YXJlIGFzIG5lZWRlZC4gU3BlY2lmaWNhbGx5LAogICAgIHRoZSBDb25maWd1cmUgcHJvY2VzcyBkZXRlcm1pbmVzIHRoZSBjb3JyZWN0IHNpemUgb2Ygb2ZmX3QgYW5kCiAgICAgKnZvaWQuIFdoZW4gdGhlIE9TL3BsYXRmb3JtL2NvbXBpbGVyIHN1cHBvcnRzIHF1YWRzLCBhcF9zbnByaW50ZigpCiAgICAgcHJvdmlkZXMgZm9yIHRoZSAncScgZm9ybWF0IHF1YWxpZmllciAoaWYgcXVhZHMgYXJlIG5vdCBhdmFpbGFibGUsCiAgICAgJ3EnIGlzIHNpbGVudGx5ICJkZW1vdGVkIiB0byBsb25nKS4gW0ppbSBKYWdpZWxza2ldCgogICopIFdoZW4gdGhlIHVzZXJuYW1lIG9yIHBhc3N3b3JkIGZlZCB0byBodHBhc3N3ZCBpcyB0b28gbG9uZywgaW5jbHVkZSB0aGUKICAgICBzaXplIGxpbWl0IGluIHRoZSBlcnJvciBtZXNzYWdlLiAgQWxzbyByZXBvcnQgaWxsZWdhbCBjaGFyYWN0ZXJzCiAgICAgKGN1cnJlbnRseSBvbmx5ICc6JykgaW4gdGhlIHVzZXJuYW1lLiAgQWRkIHRoZSBzaXplIHJlc3RyaWN0aW9ucwogICAgIHRvIHRoZSBtYW4gcGFnZS4gIFtLZW4gQ29hcl0KCiAgKikgRml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3VwcG9ydCBvcHRpb24gc28gaXQgZG9lc24ndCByZXN1bHQgaW4KICAgICBhbiBpbmZpbml0ZSBsb29wLiAgW01hcmMgU2xlbWtvXQoKICAqKSBQaXBlZCBlcnJvciBsb2dzIGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQgaWYgYW4gZXJyb3Igb2NjdXJlZAogICAgIGR1cmluZyBjb25maWd1cmF0aW9uIGFmdGVyIGEgcmVzdGFydC4KICAgICBbQWlkYW4gQ3VsbHkgPGFpZGFuQHBhbml4LmNvbT5dIFBSIzQ0NTYKCiAgKikgSWYgYSAiTG9jYXRpb24iIGZpZWxkIHdhcyBzdG9yZWQgaW4gci0+ZXJyX2hlYWRlcnNfb3V0IHJhdGhlcgogICAgIHRoYW4gci0+aGVhZGVyc19vdXQsIHJlZGlyZWN0IHByb2Nlc3Npbmcgd291bGRuJ3QgZmluZCBpdCBhbmQKICAgICB0aGUgc2VydmVyIHdvdWxkIGNvcmUgZHVtcCBvbiBhcF9lc2NhcGVfaHRtbChOVUxMKS4gIENoZWNrIGJvdGgKICAgICB0YWJsZXMgYW5kIHJhaXNlIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIHdpdGggYSBsb2cgbWVzc2FnZQogICAgIGlmIExvY2F0aW9uIGlzbid0IHNldC4gIFtEb3VnIE1hY0VhY2hlcm4sIEtlbiBDb2FyXQoKICAqKSBBZGQgUlVMRV9FWFBBVCwgdGhlIHNyYy9saWIvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCBhIG1vZGlmaWVkIGNvcHkKICAgICBvZiB0aGUgRXhwYXQgMS4wLjIgZGlzdHJpYnV0aW9uLiBbR3JlZyBTdGVpbl0KCiAgKikgUmVwbGFjZSByZWdleGVjKCkgY2FsbHMgd2l0aCBjYWxscyB0byBhIG5ldyBBUEkgc3R1YiBmdW5jdGlvbgogICAgIGFwX3JlZ2V4ZWMoKS4gIFRoaXMgc29sdmVzIHByb2JsZW1zIHdpdGggRFNPIG1vZHVsZXMgd2hpY2ggdXNlIHRoZSByZWdleAogICAgIGxpYnJhcnkuIFtKZW5zLVV3ZSBNYWdlciA8anVtQGhlbGlvcy5kZT4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCAnUmVxdWVzdF9Qcm90b2NvbCcgc3BlY2lhbCBrZXl3b3JkIHRvIG1vZF9zZXRlbnZpZiBzbyB0aGF0CiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uCiAgICAgKGUuZy4sIEhUVFAvMC45IG9yIEhUVFAvMS4xKSBvZiB0aGUgcmVxdWVzdC4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIERTTyBzdXBwb3J0IGZvciBPcGVuU3RlcCAoTWFjaCA0LjIpIHBsYXRmb3JtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBSZXggRGlldGVyIDxyZGlldGVyQG1hdGgudW5sLmVkdT5dIFBSIzM5OTcKCiAgKikgRml4IHNlZCByZWdleCBmb3IgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGluIHNyYy9Db25maWd1cmUuCiAgICAgW0phbiBHYWxsbyA8Z2FsbG9AcHZ0LnNrPl0gUFIjMzY5MCwgUFIjNDM3MwogCiAgKikgU3dpdGNoIHRvIC9iaW4vc2g1IGluIEFQQUNJIG9uIFVsdHJpeCBhbmQgZnJpZW5kcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgdGhlaXIgYnJhaW4tZGVhZCAvYmluL3NoLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDM3MgoKICAqKSBCZXR0ZXIgRFNPIGZsYWdzIHJlY29nbml0aW9uIG9uIE5ldEJTRCBwbGF0Zm9ybXMgdXNpbmcgRUxGLgogICAgIFtUb2RkIFZpZXJsaW5nIDx0dkBwb2JveC5jb20+XSBQUiM0MzEwCgogICopIEFsd2F5cyBsb2cgbW9udGhzIGluIGVuZ2xpc2ggZm9ybWF0IGZvciAldCBpbiBtb2RfbG9nX2NvbmZpZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGFAZmVlLnZ1dGJyLmN6Pl0gUFIjNDM2NiwgNjc5CgogICopIFN1cHBvcnQgZm9yIHNlcnZlci1wYXJzZWQgYW5kIG11bHRpdmlldy1kZXRlcm1pbmVkIFJlYWRtZU5hbWUgYW5kCiAgICAgSGVhZGVyTmFtZSBmaWxlcyBpbiBtb2RfYXV0b2luZGV4LiBSZW1vdmVkIHRoZSByZXN0cmljdGlvbiBvbgogICAgICIvInMgaW4gUmVhZG1lTmFtZSBhbmQgSGVhZGVyTmFtZSBkaXJlY3RpdmVzIHNpbmNlIHRoZSAqc3ViX3JlcSoKICAgICByb3V0aW5lcyB3aWxsIGRlYWwgd2l0aCB0aGUgYWNjZXNzIGlzc3Vlcy4gKEl0J3Mgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSB7c2l0ZXxncm91cHxwcm9qZWN0fGN1c3RvbWVyfC4uLn0gd2lkZSByZWFkbWVzIGFuZCBoZWFkZXJzLikKICAgICBbUmF5bW9uZCBTIEJyYW5kIDxyc2J4QHJzYngubmV0PiwgS2VuIENvYXJdIFBSIzE1NzQsIDMwMjYsIDM1MjksCiAgICAgMzU2OSwgNDI1NgoKICAqKSBXaGVuIHN0YXQoKSBmYWlscywgZG9uJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZSBjb250ZW50cyBvZgogICAgIHRoZSBzdHJ1Y3Qgc3RhdC4gIFtFZCBLb3J0aG9mIDxlZEBiaXRtZWNoYW5pYy5jb20+XQoKICAqKSBJdCdzIE9LIGZvciBhIHNlbW9wIHRvIHJldHVybiBFSU5UUiwganVzdCBsb29wIGFyb3VuZCBhbmQgdHJ5CiAgICAgYWdhaW4uICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBjb25maWd1cmF0aW9uIGVuZ2luZSByZS1lbnRyYW50IGhhbmd1cHMsIHdoaWNoIHNvbHZlIGEKICAgICBoYW5kZnVsIG9mIHByb2JsZW1zIHNlZW4gd2l0aCBtb2RfcGVybCA8UGVybD4gY29uZmlndXJhdGlvbiBzZWN0aW9ucwogICAgIFtTYWx2YWRvciBPcnRpeiBHYXJjaWEgPHNvZ0Btc2cuY29tLm14Pl0KCiAgKikgTWFjIE9TIGFuZCBNYWMgT1MgWCBTZXJ2ZXIgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUgY3VzdG9tIGxheW91dAogICAgIGJ5IGRlZmF1bHQgd2hlbiBidWlsZGluZyB3aXRoIEFQQUNJOyBhbGxvdyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKICAgICB2YXJpYWJsZSBkZWZhdWx0cyBpbiBjb25maWd1cmUuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBEbyBzZXRnaWQoKSBiZWZvcmUgaW5pdGdyb3VwcygpIGluIGh0dHBfbWFpbjsgc29tZSBwbGF0Zm9ybXMKICAgICB6YXAgdGhlIGdyb3VwbGlzdCB3aGVuIHNldGdpZCgpIGlzIGNhbGxlZC4gIFRoaXMgd2FzIGZpeGVkIGluCiAgICAgc3VleGVjIGVhcmxpZXIsIGJ1dCB0aGUgbWFpbiBodHRwZCBjb2RlIG1pc3NlZCB0aGUgY2hhbmdlLgogICAgIFtSb2IgU2FjY29jY2lvIDxyb2JzQEluZmluaXRlVGVjaG5vbG9neS5jb20+XSAgUFIjMjU3OQoKICAqKSBBZGQgcmVjb2duaXRpb24gb2YgLnRneiBhcyBhIGd6aXBwZWQgdGFyY2hpdmUuCiAgICAgW0JlcnRyYW5kIGRlIFNpbmdseSA8YmVydHJhbmQuZGUtc2luZ2x5QHBvbHl0ZWNobmlxdWUuZnI+XSAgUFIjMjM2NAoKICAqKSBtb2RfaW5jbHVkZSdzIGZzaXplL2ZsYXN0bW9kIHNob3VsZCBhbGxvdyBvbmx5IHJlbGF0aXZlIHBhdGhzLCBqdXN0CiAgICAgbGlrZSAiaW5jbHVkZSBmaWxlIi4gIFtKYXJvc2xhdiBCZW5rb3Zza3kgPGJlbmtvdnNrQHBoYS5wdnQuY3o+XQoKICAqKSBPUy8yOiBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyB1c2luZyBETExzLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEFkZCBpY29uc2RpciwgaHRkb2NzZGlyLCBhbmQgY2dpZGlyIHRvIGNvbmZpZy5sYXlvdXQuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBtaW5vciBidXQgYW5ub3lpbmcgYnVnIHdpdGggdGhlIHRlc3QgZm9yIENvbmZpZ3VyYXRpb24udG1wbAogICAgIGJlaW5nIG5ld2VyIHRoYW4gQ29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGlzIGxlc3MgbGlrZWx5IHRvIGZhaWwKICAgICB3aGVuIHVzaW5nIEFQQUNJIGFuZCBzaGFkb3cgc291cmNlcy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIFBPUlQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE1hYyBPUyAodmVyc2lvbnMgMTAuMCBhbmQKICAgICBncmVhdGVyKS4gVXNlIE1hYyBPUyBYIFNlcnZlciBsYXlvdXQgZm9yIG5vdy4gQ2xlYW4gdXAgZHlsZCBjb2RlCiAgICAgaW4gdW5peC9vcy5jLCBhbmQgZG9uJ3QgaW5zdGFsbCB0aGUgZHlsZCBlcnJvciBoYW5kbGVycywgd2hpY2gKICAgICBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBpbiBNYWMgT1MuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBSZW5hbWUgUmhhcHNvZHkgbGF5b3V0IHRvICJNYWMgT1MgWCBTZXJ2ZXIiLiBDaGFuZ2UgaW5zdGFsbAogICAgIGxvY2F0aW9ucyB0byBhcHByb3ByaWF0ZSBvbmVzIGZvciB1c2VyLWJ1aWx0IChhcyBvcHBvc2VkIHRvCiAgICAgc3lzdGVtKSBpbnN0YWxscy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIE1vZGlmeSBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgQWRkRGVzY3JpcHRpb24gc28gdGhhdCB0aGUKICAgICBiZWhhdmlvdXIgbWF0Y2hlcyB0aGUgZG9jdW1lbnRhdGlvbi4gIFtLZW4gQ29hcl0gUFIjMTg5OCwgMzA3Mi4KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGluc3RhbGwtYmluZGlzdC5zaCBzY3JpcHQgY3JlYXRlZCBieQogICAgIGJpbmJ1aWxkLnNoIHRvIHVzZSB0YXIgd2hlbiBjb3B5aW5nIGRpc3RyaWJ1dGlvbiBmaWxlcyB0byB0aGUKICAgICBzZXJ2ZXJyb290LiBUaGlzIGFsbG93cyB1cGdyYWRpbmcgYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uCiAgICAgd2l0aG91dCBuZXN0aW5nIHRoZSBuZXcgZGlzdHJpYnV0aW9uIGluIHRoZSBvbGQuCgogICAgIGluc3RhbGwtYmluZGlzdC5zaCBub3cgZGV0ZWN0cyB0aGUgbG9jYWwgcGVybDUgcGF0aCB0byBpbnN0YWxsCiAgICAgYXB4cyBhbmQgZGJtbWFuYWdlIHdpdGggcHJvcGVyIHBhdGggdG8gcGVybCBpbnRlcnByZXRlci4KCiAgICAgQWRkIGFuIGluc3RhbGwtYmluc3VwcG9ydCB0YXJnZXQgd2hpY2ggY29waWVzIHRoZSBzb3VyY2UgZmlsZXMKICAgICBmb3IgYXB4cyBhbmQgZGJtbWFuYWdlIHRvIGJpbmRpc3QgdG8gYWxsb3cgdGhlc2Ugc2NyaXB0cyB0bwogICAgIGJlIHByb3Blcmx5IGluc3RhbGxlZCByZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gc2VydmVycm9vdC4KICAgICBbUmFuZHkgVGVyYnVzaCwgQ292YWxlbnQgVGVjaG5vbG9naWVzLCByYW5keUBjb3ZhbGVudC5uZXRdCgogICopIEZpeCBpbnRlcm1pdHRlbnQgU0VHViBpbiBhcF9wcm94eV9jYWNoZV9lcnJvcigpIGluCiAgICAgc3JjL21vZHVsZXMvcHJveHlfdXRpbC5jIHdoZXJlIGEgTlVMTCBmaWxlcG9pbnRlciBhbmQKICAgICB0ZW1wb3JhcnkgZmlsZW5hbWUgd2VyZSBjbG9zZWQgYW5kIHVubGlua2VkLgogICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT4sCiAgICAgVGltIENvc3RlbGxvIDx0amNvc3RlbEBzb2NzLnV0cy5lZHUuYXU+XSBQUiMzMTc4CgogICopIEZpeCBpbmNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgbW9kX3Byb3h5LgogICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCgogICopIE9TLzI6IEZpeCB0ZXJtaW5hdGluZyBDR0lzIHRoYXQgYXJlbid0IGNvbXBpbGVkIGJ5IEVNWCBHQ0Mgd2hlbiBhIAogICAgIGNvbm5lY3Rpb24gaXMgYWJvcnRlZC4gIFtCcmlhbiBIYXZhcmRdCgogICopIEZvcmNlIHRoZSBMQU5HIGVudmFyaWFibGUgdG8gdGhlIGtub3duIHN0YXRlIG9mICJDIiBzbyB0aGF0IHdlCiAgICAgaGF2ZSBhc3N1cmFuY2UgYWJvdXQgaG93IHN0cmluZyBtYW5pcHVsYXRvcnMgKGUuZy4sIHRyKSB3aWxsCiAgICAgZnVuY3Rpb24uICBbS2VuIENvYXJdICBQUiMxNjMwCgogICopIEFkZCBhIGRpcmVjdGl2ZSB0byBhbGxvdyBjdXN0b21pc2luZyBvZiB0aGUgdHJhY2tpbmcgY29va2llIG5hbWUuCiAgICAgW0tlbiBDb2FyXSAgUFIjMjkyMSwgNDMwMwoKICAqKSBBZGQgImZvcmNlLW5vLXZhcnkiIGVudmFyaWFibGUgdG8gYWxsb3cgc2VydmVycyB0byB3b3JrIGFyb3VuZAogICAgIGNsaWVudHMgdGhhdCBjaG9rZSBvbiAiVmFyeSIgZmllbGRzIGluIHRoZSByZXNwb25zZSBoZWFkZXIuCiAgICAgW0tlbiBDb2FyLCBEbWl0cnkgS2hydXN0YWxldiA8ZGltYUB6aXBweS5tYWNoYW9uLnJ1Pl0gIFBSIzQxMTgKCiAgKikgRml4ZWQgYSBidWcgaW4gbW9kX2RpciB0aGF0IGNhdXNlcyBhIGNoaWxkIHByb2Nlc3Mgd2lsbCBpbmZpbml0ZWx5CiAgICAgcmVjdXJzZSB3aGVuIGl0IGF0dGVtcHMgdG8gaGFuZGxlIGEgcmVxdWVzdCBmb3IgYSBkaXJlY3Rvcnkgd25kIHRoZQogICAgIHZhbHVlIG9mIHRoZSBEaXJlY3RvcnlJbmRleCBkaXJlY3RpdmUgaXMgYSBzaW5nbGUgZG90LiBBbHNvIGxpa2VseQogICAgIHRvIGhhcHBlbiBmb3IgYW55b3RoZXIgdmFsdWVzIG9mIERpcmVjdG9yeUluZGV4IHRoYXQgd2lsbCBtYXAgYmFjawogICAgIHRvIHRoZSBzYW1lIGRpcmVjdG9yeS4gVGhlIGhhbmRsZXIgbm93IG9ubHkgY29uc2lkZXJzIHJlZ3VsYXIgZmlsZXMKICAgICBhcyBiZWluZyBpbmRleCBjYW5kaWRhdGVzLiBObyBQUiNzIGZvdW5kLgogICAgIFtSYXltb25kIFMgQnJhbmQgPHJzYnhAcnNieC5uZXQ+XQoKICAqKSBFYXNlIGNvbmZpZ3VyYXRpb24gZGVidWdnaW5nIGJ5IG1ha2luZyBUZXN0Q29tcGlsZSBmYWxsIGJhY2sgdG8KICAgICB1c2luZyAibWFrZSIgaWYgdGhlICRNQUtFIHZhcmlhYmxlIGlzIHVuc2V0IFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4ZWQgdGhlIFNlcnZlclNpZ25hdHVyZSBkaXJlY3RpdmUgdG8gd29yayBhcyBkb2N1bWVudGVkLgogICAgIFtSYXltb25kIFMgQnJhbmQgPHJzYnhAcnNieC5uZXQ+XSBQUiM0MjQ4CgogICopIEFkZCAib3B0IiAoU3lzVi1zdHlsZSkgbGF5b3V0IHRvIGNvbmZpZy5sYXlvdXQuIFtSYXltb25kIFMgQnJhbmQKICAgICA8cnNieEByc2J4Lm5ldD5dCgogICopIEFkZCBBUEFDSSAtLXdpdGhvdXQtZXhlY3N0cmlwIG9wdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoZQogICAgIHN0cmlwcGluZyBvZiBleGVjdXRhYmxlcyBvbiBpbnN0YWxsYXRpb24uICBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IGZvciBEU08KICAgICBhbmQgZGVidWdnaW5nIHNpdHVhdGlvbnMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgT1MvMiAoY2FzZSBpbnNlbnN0aXZlIGZpbGVzeXN0ZW0sIC5leGUgc3VmZml4LCBldGMpCiAgICAgdG8gQVBBQ0kgZmlsZXMgYW5kIHJlbGF0ZWQgc2NyaXB0cy4gCiAgICAgW1lpdHpjaGFrIFNjb3R0LVRob2VubmVzIDxzdGhvZW5uYUBlZm4ub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDI2OQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc3RhbmRhbG9uZSBtb2RlIGluIFRQRgogICAgIFtKb2UgTW9lbmljaCA8bW9lbmljaEB1cy5pYm0uY29tPl0KCiAgKikgRml4IG51bWJlciBvZiBieXRlcyBjb3BpZWQgYnkgcmVhZF9jb25uZWN0aW9uKCkgaW4gc3JjL3N1cHBvcnQvYWIuYwogICAgIFtKaW0gQ294IDxqY0BzdXBlcmxpbmsubmV0Pl0gUFIjNDI3MQoKICAqKSBGaXggc3BlY2lhbCBSZXdyaXRlQ29uZCAiLXMiIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgW0JvYiBGaW5jaCA8Ym9iQG5hcy5jb20+XQoKICAqKSBGaXggdmFsdWUgcXVvdGluZyBpbiBzcmMvQ29uZmlndXJlIHNjcmlwdCBmb3IgYXBfY29uZmlnX2F1dG8uaCAKICAgICBbUGF1bCBTdXR0b24gPHBhdWxAYXdlLmNvbT5dCgogICopIE1ha2Ugc3VyZSBSZXdyaXRlTG9jayBjYW4gYmUgdXNlZCBvbmx5IGluIHRoZSBnbG9iYWwgY29udGV4dCwgKGkuZS4KICAgICBvdXRzaWRlIG9mIGFueSA8VmlydHVhbEhvc3Q+IHNlY3Rpb25zKSBiZWNhdXNlIGl0J3MgYSBnbG9iYWwgZmFjaWxpdHkgb2YKICAgICB0aGUgcmV3cml0ZSBlbmdpbmUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIG93bmVyc2hpcCBkZWxlZ2F0aW9uIGZvciBwcm94eSBkaXJlY3RvcnkgdW5kZXIgYG1ha2UgaW5zdGFsbCcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFQQUNJIHdvdWxkIG5vdCBjb3JyZWN0bHkgYnVpbGQgc3VleGVjLiBbTWFyaWEgVmVyaW5hCiAgICAgPG1hcmlhdkBpY2dlYi50cmllc3RlLml0Pl0gUFIjNDI2MAoKICAqKSBtb2RfbWltZV9tYWdpYyBwYXNzZWQgb25seSB0aGUgZmlyc3QgNGsgb2YgYSBmaWxlIHRvCiAgICAgdW5jb21wcmVzcy9nemlwLCBidXQgdGhvc2UgdG9vbHMgc29tZXRpbWVzIGRvIG5vdCBwcm9kdWNlCiAgICAgYW55IG91dHB1dCB1bmxlc3MgYSBzdWZmaWNpZW50IHBvcnRpb24gb2YgdGhlIGNvbXByZXNzZWQKICAgICBmaWxlIGlzIGlucHV0LiAgQ2hhbmdlIHRvIHBhc3MgdGhlIGVudGlyZSBmaWxlIC0tIGJ1dAogICAgIG9ubHkgcmVhZCA0ayBvZiBvdXRwdXQuCiAgICAgW01hcmNpbiBDaWVzbGFrIDxzYXBlckBzeXN0ZW0ucGw+XSBQUiM0MDk3CgogICopICJJbmRleE9wdGlvbnMgTm9uZSIgZ2VuZXJhdGVkIGV4dHJhIHNwYWNlcyBhdCB0aGUgZW5kIG9mIGVhY2gKICAgICBsaW5lLiAgW2lua2xpbmdAZmlyc3RuZXRob3UuY29tXSBQUiMzNzcwCgogICopIFRoZSAiMTAwIENvbnRpbnVlIiByZXNwb25zZSB3YXNuJ3QgYmVpbmcgc2VudCBhZnRlciBpbnRlcm5hbAogICAgIHJlZGlyZWN0cy4gW0pvc2UgS0FIQU4gPGthaGFuQHczLm9yZz5dIFBSIzM5MTAsIDM4MDYsIDM1NzUKCiAgKikgV2hlbiBwYWRkaW5nIHRoZSBuYW1lIHdpdGggc3BhY2VzIGZvciBkaXNwbGF5LCBtb2RfYXV0b2luZGV4IHdvdWxkCiAgICAgY291bnQgJiwgPCwgYW5kID4gaW4gdGhlaXIgZXNjYXBlZCB3aWR0aCwgbWVzc2luZyB1cCB0aGUgZGlzcGxheS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQwNzUsIDM3NTgKCiAgKikgUE9SVDogZml4ZWQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIE5FWFQuCiAgICAgW0phY3F1ZXMgRGlzdGxlciA8ZGlzdGxlckBnb2xlbS5waC51dGV4YXMuZWR1Pl0gUFIjNDEzMAoKICAqKSByLT5yZXF1ZXN0X3RpbWUgd2Fzbid0IGJlaW5nIHNldCBwcm9wZXJseSBpbiBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0MTU2CgogICopIFBPUlQ6IGRlYWwgd2l0aCBVVFMgY29tcGlsZXIgZXJyb3IgaW4gaHR0cF9wcm90b2NvbC5jCiAgICAgW0RhdmUgRHlrc3RyYSA8ZHdkQGJlbGwtbGFicy5jb20+XSBQUiM0MTg5CgogICopIEFkZCBhcF92cnByaW50ZigpIGZ1bmN0aW9uLiAgW0pvaG4gVG9iZXkgPGp0b2JleUBiYW50YS1pbS5jb20+XSBQUiM0MjQ2CgogICopIEZpeCB0aGUgbW9kX21pbWUgaGFzaCB0YWJsZSB0byB3b3JrIHByb3Blcmx5IHdpdGggbG9jYWxlcyBvdGhlcgogICAgIHRoYW4gQy4gIFtEZWFuIEdhdWRldF0gUFIjMzQyNwoKICAqKSBGaXggYSBtZW1vcnkgbGVhayB3aGljaCBpcyBleGFjZXJiYXRlZCBieSBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDIyNQoKICAqKSBQcmV2ZW50IGNsb2JiZXJpbmcgc2F2ZWQgSUZTIHZhbHVlcyBpbiBBUEFDSS4gW0ppbSBKYWdpZWxza2ldCgogICopIEZpeCBidWZmZXIgb3ZlcmZsb3dzIGluIGFwX3V1ZW5jb2RlIGFuZCBhcF91dWRlY29kZSBwb2ludGVkIG91dAogICAgIGJ5ICJQZXRlciAnTHVuYScgQWx0YmVyZyA8cGV0ZXJAYWx0YmVyZy5udT4iIGFuZCBQUiMzNDIyCiAgICAgW1BldGVyICdMdW5hJyBBbHRiZXJnIDxwZXRlckBhbHRiZXJnLm51PiwgUm9uYWxkIFRzY2hhbORyXQoKICAqKSBNYWtlIHtTZXQsVW5zZXQsUGFzc31FbnYgcGVyLWRpcmVjdG9yeSBpbnN0ZWFkIG9mIHBlci1zZXJ2ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvcnJlY3QgYW4gYXBwYXJlbnQgdHlwbzogb24gdGhlIFdpbmRvd3MgYW5kIE1QRSBwbGF0Zm9ybXMsIHRoZQogICAgIGh0cGFzc3dkIHV0aWxpdHkgd2FzIGxpbWl0aW5nIHBhc3N3b3JkcyB0byBvbmx5IDggY2hhcmFjdGVycy4KICAgICBbS2VuIENvYXJdCgogICopIEVCQ0RJQyBwbGF0Zm9ybXM6IERhdmlkIHN1Ym1pdHRlZCBwYXRjaGVzIGZvciB0d28gYnVncyBpbiB0aGUKICAgICBNRDUgZGlnZXN0IHBvcnQgZm9yIEVCQ0RJQyBtYWNoaW5lczoKICAgICBhKSB0aGUgaHRkaWdlc3QgdXRpbGl0eSBvdmVyd3JvdGUgdGhlIG9sZCBjb250ZW50cyBvZiB0aGUgZGlnZXN0IGZpbGUKICAgICBiKSB0aGUgQ29udGVudC1NRDUgaGVhZGVyIHZhbHVlIChDb250ZW50RGlnZXN0IGRpcmVjdGl2ZSkgd2FzIHdyb25nCiAgICAgd2hlbiB0aGUgcmV0dXJuZWQgZmlsZSB3YXMgbm90IGNvbnZlcnRlZCBmcm9tIEVCQ0RJQywgYnV0IHdhcyBhCiAgICAgYmluYXJ5IChlLmcuLCBpbWFnZSBmaWxlKSBpbiB0aGUgZmlyc3QgcGxhY2UuCiAgICAgW0RhdmlkIE1jQ3JlZWR5IDxtY2NyZWVkeUB1cy5pYm0uY29tPl0KCiAgKikgc3VwcG9ydC9odHBhc3N3ZCBub3cgcGVybWl0cyB0aGUgcGFzc3dvcmQgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZQogICAgIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAnLWInIHN3aXRjaC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGFzc3dvcmRzCiAgICAgbmVlZCB0byBiZSBtYWludGFpbmVkIGJ5IHNjcmlwdHMgLS0gcGFydGljdWxhcmx5IGluIHRoZSBXaW4zMgogICAgIGVudmlyb25tZW50LiAgW0tlbiBDb2FyXQoKICAqKSBXaW4zMjogV2luMzIgbXVsdGlwbGUgc2VydmljZXMgcGF0Y2guIEFkZGVkIGNhcGFiaWxpdHkgdG8gaW5zdGFsbCBhbmQKICAgICBydW4gbXVsdGlwbGUgY29waWVzIG9mIGFwYWNoZSBhcyBpbmRpdmlkdWFsIHNlcnZpY2VzLgoKICAgICBFeGFtcGxlIDE6CiAgICAgYXBhY2hlIC1uIGFwYWNoZTEgLWkgLWYgYzovaHR0cGQuY29uZgogICAgICAgIEluc3RhbGxzIGFwYWNoZSBhcyBzZXJ2aWNlICdhcGFjaGUxJyBhbmQgYXNzb2NpYXRlcyBjOi9odHRwZC5jb25mCiAgICAgICAgd2l0aCB0aGF0IHNlcnZpY2UuCiAgICAgbmV0IHN0YXJ0IGFwYWNoZTEKICAgICAgICBTdGFydHMgYXBhY2hlMSBzZXJ2aWNlLgogICAgIG5ldCBzdG9wIGFwYWNoZTEKICAgICAgICBTdG9wcyBhcGFjaGUxIHNlcnZpY2UKCiAgICAgRXhhbXBsZSAyOgogICAgIGFwYWNoZSAtbiBhcGFjaGUyIC1pCiAgICAgICAgSW5zdGFsbHMgYXBhY2hlIGFzIHNlcnZpY2UgJ2FwYWNoZTInLiBodHRwZC5jb25mIGlzIGxvY2F0ZWQgdW5kZXIKICAgICAgICB0aGUgZGVmYXVsdCBzZXJ2ZXIgcm9vdCAoL2FwYWNoZS9jb25mL2h0dHBkLmNvbmYpLgogICAgIG5ldCBzdGFydCBhcGFjaGUyCiAgICAgICAgU3RhcnRzIGFwYWNoZTIgc2VydmljZS4KCiAgICAgRXhhbXBsZSAzOgogICAgIGFwYWNoZSAtbiBhcGFjaGUzIC1pIC1kIGM6L3Byb2dyYW0gZmlsZXMvYXBhY2hlCiAgICAgICAgSW5zdGFsbCBhcGFjaGUgYXMgc2VydmljZSAnYXBhY2hlMycgYW5kIHNldHMgc2VydmVyIHJvb3QgdG8KICAgICAgICBjOi9wcm9ncmFtIGZpbGVzL2FwYWNoZS4KCiAgICAgRXhhbXBsZSA0OgogICAgIGFwYWNoZSAtbiBhcGFjaGUyIC1rIHJlc3RhcnQKICAgICAgICBSZXN0YXJ0IGFwYWNoZTIgc2VydmljZSAKCiAgICAgW0tlaXRoIFdhbm5hbWFrZXIsIEtlbiBQYXJ6eWduYXQsIEJpbGwgU3RvZGRhcmRdCgogICopIENvcnJlY3QgdGhlIHNpZ25lZC91bnNpZ25lZCBjaGFyYWN0ZXIgaGFuZGxpbmcgZm9yIHRoZSBNRDUgcm91dGluZXM7CiAgICAgbWlzbWF0Y2hlcyB3ZXJlIGNhdXNpbmcgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBnY2MgLXBlZGFudGljIGFuZAogICAgIGluIHRoZSBUUEYgY3Jvc3MtY29tcGlsYXRpb24uICBbS2VuIENvYXJdCgogICopIE9TLzI6IFJld29yayBDR0kgaGFuZGxpbmcgdG8gdXNlIHNwYXduKigpIGluc3RlYWQgb2YgZm9yay9leGVjLCBhY2hpZXZpbmcKICAgICBhIHJvdWdobHkgNSBmb2xkIHNwZWVkIHVwLiBbQnJpYW4gSGF2YXJkXQoKICAqKSBwcm94eSBmdHA6IGluc3RlYWQgb2YgdXNpbmcgdGhlIGhhcmR3aXJlZCBzdHJpbmcgInRleHQvcGxhaW4iIGFzCiAgICAgYSBmYWxsYmFjayB0eXBlIGZvciBmaWxlcyBzZXJ2ZWQgYnkgdGhlIGZ0cCBwcm94eSwgdXNlIHRoZQogICAgIGFwX2RlZmF1bHRfdHlwZSgpIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgY29uZmlndXJlZCB0eXBlLgogICAgIFRoaXMgYWxsb3dzIGZvciBzcGVjaWFsIGNvbmZpZ3VyYXRpb25zIGxpa2UKICAgICAgICA8RGlyZWN0b3J5IHByb3h5OmZ0cDovL3NvbWUuaG9zdD4KICAgICAgICBEZWZhdWx0VHlwZSBnYXJnbGUvYmx1cmIKICAgICAgICA8L0RpcmVjdG9yeT4KICAgICBBZGRpdGlvbmFsbHksIGFkZCB0aGUgQ29udGVudC1FbmNvZGluZzogaGVhZGVyIHRvIEZUUCBwcm94eSByZXBsaWVzCiAgICAgd2hlbiB0aGUgZW5jb2RpbmcgaXMgZGVmaW5lZCAoYnkgdGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZSkuCiAgICAgQmVjYXVzZSBpdCB3YXMgbWlzc2luZywgaXQgd2FzIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGJyb3dzZSBjb21wcmVzc2VkCiAgICAgZmlsZXMgdXNpbmcgdGhlIEZUUCBwcm94eSAod29ya3Mgbm93IHBlcmZlY3RseSBpbiBDb21tdW5pY2F0b3IpLgogICAgIFRoZSBmdHAgcHJveHkgbm93IGFsc28gcmV0dXJucyB0aGUgRGF0ZTogYW5kIFNlcnZlcjogaGVhZGVyIGxpbmVzIChpZiBub3QKICAgICBtdWNoIGVsc2UuLi4gVGhpcyBjb2RlIGlzICJzb21ld2hhdCIgYnJva2VuKSBsaWtlIG5vcm1hbCByZXF1ZXN0cyBkby4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIEJlIG1vcmUgc21hcnQgaW4gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIFVJRC9HSUQKICAgICBmb3IgVXNlci9Hcm91cCBkaXJlY3RpdmVzIGFuZCB1c2UgdGhlIGRldGVybWluZWQgVUlEL0dJRCB0byBpbml0aWFsaXplCiAgICAgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBwcm94eWNhY2hlZGlyLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWssIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENoYW5nZWQgdGhlIGZvcmtpbmctcHJpb3ItdG8tY2xlYW51cCBpbiB0aGUgcHJveHkgbW9kdWxlIHRvIGZpcnN0CiAgICAgY2hlY2sgd2V0aGVyIGl0IGFjdHVhbGx5IG5lZWRzIHRvIGNvbGxlY3QgZ2FyYmFnZS4gVGhpcyByZWR1Y2VzIAogICAgIHRoZSBudW1iZXIgb2YgZm9yaygpcyBmcm9tIG9uZS9yZXF1ZXN0IHRvIGp1c3QgdGhlIG9kZCBvbmUgYW4gaG91ci4KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBBZGRlZCBwcm94eSwgYXV0aCBhbmQgaGVhZGVyIHN1cHBvcnQgdG8gc3JjL3N1cHBvcnQvYWIuYy4gQWRkZWQgYQogICAgIFJFQURNRSBmaWxlIHRvIHNyYy9zdXBwb3J0LwogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIERvbid0IGhhcmQtY29kZSB0aGUgcGF0aCB0byBBV0sgaW4gLS1zaGFkb3cgYm9vdHN0cmFwcGluZyBNYWtlZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDA1MAoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRFNPIG1vZHVsZSBjb21waWxhdGlvbiBvbiBCU0QvT1MgMy54LgogICAgIFtSYW5keSBUZXJidXNoLCBDb3ZhbGVudCBUZWNobm9sb2dpZXNdCgogICopIEZpeCBzZWQtc3Vic3RpdHV0aW9ucyBpbiBgbWFrZSBpbnN0YWxsJzogcGF0aCBlbGVtZW50cyBsaWtlIGBodHRwZC9jb25mJwogICAgIChmb3IgaW5zdGFuY2UgZnJvbSBhbiBBUEFDSSBjb25maWd1cmUgLS1zeXNjb25mZGlyPS9ldGMvaHR0cGQvY29uZgogICAgIG9wdGlvbikgd2VyZSBzdWJzdGl0dXRlZCB3aXRoICQoVEFSR0VUKS5jb25mLCBldGMuIFNhbWUgZm9yIG90aGVyIHN0cmluZ3MKICAgICB3aXRoIGRvdHMgd2hlcmUgdGhlIGRvdCB3YXNuJ3QgbWF0Y2hlZCBhcyBwbGFpbiB0ZXh0LiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUE9SVDogQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0QgNC54IFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdmVyYm9zZSBvdXRwdXQgb2YgQVBBQ0kgY29uZmlndXJlIChvcHRpb24gLXYpIAogICAgIFtNYXJ0aW4gS3JhZW1lciwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjYKCiAgKikgUmVtb3ZlZCBuZXcgUGFzc0FsbEVudiBjb2RlIGR1ZSB0byBEU08gcHJvYmxlbXMuIFtMYXJzIEVpbGVicmVjaHRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy41IFtub3QgcmVsZWFzZWRdCgogICopIE1fSU5WQUxJRCBuZWVkZWQgYSB2YWx1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIE1FVEhPRFMgc28gdGhhdCB1bmtub3duCiAgICAgbWV0aG9kcyBjYW4gYmUgYWNjZXNzIGNvbnRyb2xsZWQuICBbUm95IEZpZWxkaW5nXSBQUiMzODIxCgogICopIEFkZGVkIFBhc3NBbGxFbnY7IG1ha2VzIHNlcnZlcidzIGVudGlyZSBlbnZpcm9ubWVudCBhdmFpbGFibGUKICAgICB0byBDR0lzIGFuZCBTU0lzIGV4ZWN1dGVkIHdpdGhpbiBkaXJlY3RpdmUncyBzY29wZS4gIFtLZW4gQ29hcl0KCiAgKikgYXBfdXVlbmNvZGUoKSBhbHdheXMgYWRkZWQgdHdvIHRyYWlsaW5nICc9J3MgYW5kIGVuY29kaW5nIG9mCiAgICAgOCBiaXQgY2hhcmFjdGVycyBvbiBhIG1hY2hpbmUgd2l0aCBzaWduZWQgY2hhciBtYXkgcHJvZHVjZWQKICAgICBpbmNvcnJlY3QgcmVzdWx0cy4gQWRkaXRpb25hbGx5IGFwX3V1ZW5jb2RlKCkgc2hvdWxkIG5vdwogICAgIHdvcmsgY29ycmVjdGx5IG9uIEVCQ0RJQyBwbGF0Zm9ybXMuCiAgICAgW1JvbmFsZCBUc2NoYWzkciA8cm9uYWxkQGlubm92YXRpb24uY2g+XSBQUiMzNDExCgogICopIFdJTjMyOiBCaW5hcnkgaW5zdGFsbGVyIG5vdyBydW5zIHRoZSBjb25maWd1cmF0aW9uIERMTCBiZWZvcmUKICAgICB0aGUgcmVib290IHByb21wdCAod2hpY2ggaXMgb25seSBnaXZlbiBpZiBNU1ZDUlQuRExMIHN5c3RlbQogICAgIERMTCBpcyBuZXcgb3IgdXBkYXRlZCkuIFRoaXMgc2hvdWxkIGF2b2lkIHRoZSBjb25maWd1cmF0aW9uCiAgICAgZGlyZWN0b3J5IGJlaW5nIGVtcHR5IGFmdGVyIGluc3RhbGxhdGlvbi4gW1BhdWwgU3V0dG9uXQogICAgIFBSIzM3NjcsIDM4MDAsIDM4MjcsIDM4NTAsIDM5MDAsIDM5NTMsIDM5ODgKCiAgKikgV0lOMzI6IEJpbmFyeSBpbnN0YWxsZXIgbm93IGNyZWF0ZXMgU3RhcnQgbWVudSBvcHRpb25zIHRvIHN0YXJ0CiAgICAgYW5kIHN0b3AgQXBhY2hlIGFzIGEgY29uc29sZSBhcHBsaWNhdGlvbiBhbmQgdG8gdW5pbnN0YWxsCiAgICAgdGhlIEFwYWNoZSBzZXJ2aWNlIG9uIE5ULiBbUGF1bCBTdXR0b25dIFBSIzM3NDEKCiAgKikgV0lOMzI6IEFwYWNoZS5leGUgbm93IGNvbnRhaW5zIGFuIGljb24uIFtQYXVsIFN1dHRvbl0KCiAgKikgUE9SVDogU3dpdGNoIGJhY2sgdG8gdXNpbmcgZmNudGwoKSBsb2NraW5nIG9uIExpbnV4IC0tIGluc3RhYmlsaXRpZXMKICAgICBoYXZlIGJlZW4gcmVwb3J0ZWQgd2l0aCBmbG9jaygpIGxvY2tpbmcgKHByb2JhYmx5IHJlbGF0ZWQgdG8ga2VybmVsCiAgICAgdmVyc2lvbikuICBbRGVhbiBHYXVkZXRdIFBSIzI3MjMsIDM1MzEKCiAgKikgVXNpbmcgQVBBQ0ksIHRoZSBtYWluIGNvbmZpZyBmaWxlICh1c3VhbGx5IGh0dHBkLmNvbmYpIHdhcwogICAgIG5vdCBiZWluZyBhZGp1c3RlZCBhcyAkKFRBUkdFVCkuY29uZi4gW1dpbGZyZWRvIFNhbmNoZXoKICAgICA8d3NhbmNoZXpAYXBwbGUuY29tPl0KCiAgKikgUE9SVDogQUlYIGRvZXMgbm90IHJlcXVpcmUgdGhlIFNIQVJFRF9DT0RFICJoYWNrIgogICAgIFtSeWFuIEJsb29tIDxyYmJAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgU2V0LUNvb2tpZSBoZWFkZXJzIHdlcmUgYmVpbmcgZG91YmxlZCB1cCBmb3Igc29tZSBDR0lzIGJ5IHRoZSBPKG5eMikKICAgICBhdm9pZGFuY2UgY29kZSBhZGRlZCBpbiAxLjMuMy4KICAgICBbRGVhbiBHYXVkZXQsIEplZmYgTGV3aXMgPGxld2lzQHN0YW5mb3JkLmVkdT5dIFBSIzM4NzIKCiAgKikgYXBfaXN4ZGlnaXQgd2FzIHNvbWVob3cgbmVnbGVjdGVkIHdoZW4gYWRkaW5nIHRoZSBhcF9pc2ZvbygpIG1hY3JvcwogICAgIGZvciA4LWJpdCBzYWZlbmVzcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogVXNlIC1mUElDIGluc3RlYWQgb2YgLWZwaWMgb24gU29sYXJpcyBhbmQgU3VuT1MgZm9yIGNvbXBpbGluZyBEU09zCiAgICAgYmVjYXVzZSBTUEFSQ3MgaGF2ZSBhIHNtYWxsIG1hY2hpbmUtc3BlY2lmaWMgbWF4aW11bSBzaXplIGZvciB0aGUgR2xvYmFsCiAgICAgT2Zmc2V0IFRhYmxlIHdoaWNoIGlzIG9mdGVuIGV4Y2VlZGVkIHdoZW4gY29tcGlsaW5nIG9uZSBvZiB0aGUgbGFyZ2VyCiAgICAgdGhpcmQtcGFydHkgbW9kdWxlcyB3aXRoIEFwYWNoZS4gW1BldGVyIFVyYmFuIDxQZXRlci5VcmJhbkBlcGZsLmNoPl0gUFIjMzk3NwoKICAqKSBNb3ZlIHRoZSBkaXJlY3RpdmUgYEV4dGVuZGVkU3RhdHVzJyBpbiBodHRwZC5jb25mLWRpc3Qtd2luIF9hZnRlcl8gdGhlCiAgICAgRFNPL0RMTCBzZWN0aW9uIGJlY2F1c2UgaXQncyBhIGRpcmVjdGl2ZSBmcm9tIG1vZF9zdGF0dXMgYW5kIGlzbid0CiAgICAgYXZhaWxhYmxlIGJlZm9yZSB0aGUgRExMIG9mIG1vZF9zdGF0dXMgaXMgbG9hZGVkLgogICAgIFtNYXJ0aW4gUE9FU0NITCA8bXBvZXNjaGxAZ214Lm5ldD5dIFBSIzM5MzYKCiAgKikgU0VDVVJJVFk6IEZpeCBhIGJ1ZyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgbGluZSAKICAgICBjb250aW51YXRpb24gZmFjaWxpdHkgaW4gQXBhY2hlJ3MgY29uZmlndXJhdGlvbiBmaWxlcyB3aGljaCBjb3VsZCAKICAgICBsZWFkIHRvIGEgYnVmZmVyIG92ZXJmbG93IHNpdHVhdGlvbi4KICAgICBbVGhvbWFzIERldmFubmVhdXggPFRob21hcy5EZXZhbm5lYXV4QGVuc3QuZnI+XSBQUiMzNjE3CgogICopIE1ha2UgZG9jdW1lbnRhdGlvbiBhbmQgZXJyb3IgbWVzc2FnZXMgb2YgQVBBQ0kncyAtLWFjdGl2YXRlLW1vZHVsZT1GSUxFIAogICAgIG9wdGlvbiBtb3JlIGNsZWFyLiBbSmFuIFdvbHRlciA8amFuY0B3d25ldC5uZXQ+XSBQUiMzOTk1CgogICopIEZpeCB0aGUgZ2NjIHZlcnNpb24gY2hlY2sgKGZvciBlbmFibGluZyB0aGUgYGlubGluZScgZmFjaWxpdHkpIHRvIAogICAgIHJlYWxseSBzdXBwb3J0IGFsbCBmdXR1cmUgZ2NjIHZlcnNpb25zID49IDIuNyB1bnRpbCB3ZSBrbm93IG1vcmUuCiAgICAgW0pvaG4gVG9iZXkgPGp0b2JleUBiYW50YS1pbS5jb20+XSBQUiMzOTgzCgogICopIExldCBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQgY29ycmVjdGx5IGNvbXBsYWluIGZvciB1bmtub3duIC0tZW5hYmxlLVhYWAogICAgIGFuZCAtLWRpc2FibGUtWFhYIG9wdGlvbnMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzOTU4CgogICopIExpbmsgdGhlIHNoYXJlZCBjb3JlIGJvb3RzdHJhcCBwcm9ncmFtIChgYFJ1bGUgU0hBUkVEX0NPUkU9eWVzJycpIGFsc28KICAgICBhZ2FpbnN0IGxpYmFwLmEgYW5kIHVzZSBpdHMgYXBfc25wcmludGYoKSBpbnN0ZWFkIG9mIHNwcmludGYoKSB0byBhdm9pZAogICAgIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvd3MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgbm8gbG9uZ2VyIHVzZWQgbm9uLUFQSSBmdW5jdGlvbiBhcF9zaW5nbGVfbW9kdWxlX2luaXQoKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFwcGxlJ3MgTWFjIE9TIFggU2VydmVyIExheW91dCAiUmhhcHNvZHkiIHRvIGNvbmZpZy5sYXlvdXQuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEFkZCBjZ2lkaXIsIGh0ZG9jc2RpciwgaWNvbnNkaXIgdmFyaWFibGVzIHRvIE1ha2VmaWxlLnRtcGwgaW4gb3JkZXIKICAgICB0byBtYWtlIHBsYXRmb3JtIGluc3RhbGxhdGlvbnMgZWFzaWVyLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEluIGNvbmZpZ3VyZSwgZG8gbm90IGFwcGVuZCB0aGUgdGFyZ2V0IG5hbWUgdG8gdGhlIGRpcmVjdG9yeSBwYXRoIGlmCiAgICAgdGhlIHBhdGggYWxyZWFkeSBjb250YWlucyAiYXBhY2hlIi4gIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBTSUdQSVBFIGlzIG5vdyBpZ25vcmVkIGJ5IHRoZSBzZXJ2ZXIgY29yZS4gIFRoZSByZXF1ZXN0IHdyaXRlIHJvdXRpbmVzCiAgICAgKGFwX3JwdXRjLCBhcF9ycHV0cywgYXBfcnZwdXRzLCBhcF9yd3JpdGUsIGFwX3JwcmludGYsIGFwX3JmbHVzaCkgbm93CiAgICAgY29ycmVjdGx5IGNoZWNrIGZvciBvdXRwdXQgZXJyb3JzIGFuZCBtYXJrIHRoZSBjb25uZWN0aW9uIGFzIGFib3J0ZWQuCiAgICAgUmVwbGFjZWQgbWFueSBkaXJlY3QgKHVuY2hlY2tlZCkgY2FsbHMgdG8gYXBfYiogcm91dGluZXMgd2l0aCB0aGUKICAgICBhbmFsb2dvdXMgYXBfciogY2FsbHMuICBbUm95IEZpZWxkaW5nXQoKICAqKSBFbmhhbmNlZCBtb2RfcmV3cml0ZSdzIG1hcGZpbGUgaGFuZGxpbmc6IFRoZSBpbi1jb3JlIGNhY2hlIGZvciB0ZXh0IGFuZAogICAgIERCTSBmb3JtYXQgbWFwZmlsZXMgbm93IHVzZXMgYSA0LXdheSBoYXNoIHRhYmxlIHdpdGggTFJVIGZ1bmN0aW9uYWxpdHkuCiAgICAgRnVydGhlcm1vcmUgbWFwIGxvb2t1cHMgZm9yIG5vbi1leGlzdGVudCBrZXlzIGFyZSBub3cgY2FjaGVkIGFzIHdlbGwuCiAgICAgQWRkaXRpb25hbGx5ICJ0eHQiIG1hcHMgYXJlIG5vdyBwYXJzZWQgd2l0aCBzaW1wbGUgc3RyaW5nIGZ1bmN0aW9ucwogICAgIGluc3RlYWQgb2YgdXNpbmcgYXBfcHJlZ2NvbXAoKS4gQXMgYSBzaWRlIGVmZmVjdCBhIGJ1ZyB0aGF0IHByZXZlbnRlZAogICAgIHRoZSB1c2FnZSBvZiBrZXlzIGNvbnRhaW5pbmcgdGhlICIsIiBjaGFyYWN0ZXIgd2FzIGZpeGVkLgogICAgIFRoZSBjaGFuZ2VzIGRyYXN0aWNhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIHdoZW4gbGFyZ2UgcmV3cml0ZSBtYXBzCiAgICAgYXJlIGluIHVzZS4KICAgICBbTWljaGFlbCB2YW4gRWxzdCA8bWxlbHN0dkBzZXJwZW5zLnN3Yi5kZT4sIExhcnMgRWlsZWJyZWNodF0gUFIjMzE2MAoKICAqKSBBZGRlZCBhcF9zdWJfcmVxX21ldGhvZF91cmkoKSBmb3IgZG9pbmcgYSBzdWJyZXF1ZXN0IHdpdGggYSBtZXRob2QKICAgICBvdGhlciB0aGFuIEdFVCwgYW5kIGNvbnN0J2QgdGhlIGRlZmluaXRpb24gb2YgbWV0aG9kIGluIHJlcXVlc3RfcmVjLgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSBVc2UgcHJvcGVyIHBpZF90IHR5cGUgZm9yIHNhdmluZyBQSURzIGluIGFsbG9jLmMuICBbSm9obiBCbGV5XQoKICAqKSBSZXBsYWNlZCB1c2Ugb2YgV0lOMzIgZGVmaW5lIHdpdGggSEFWRV9EUklWRV9MRVRURVJTIHRvIGluZGljYXRlCiAgICAgd2hlbiB0aGUgT1MgYWxsb3dzIGEgRE9TIGRyaXZlIGxldHRlciB3aXRoaW4gcGF0aG5hbWVzLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgQWRkICVWIHRvIG1vZF9sb2dfY29uZmlnLCB0aGlzIGxvZ3MgdGhlIGhvc3RuYW1lIGFjY29yZGluZyB0byB0aGUKICAgICBVc2VDYW5vbmljYWxOYW1lIHNldHRpbmcgKHRoaXMgaXMgdGhlIHByZS0xLjMuNCBiZWhhdmlvdXIgb2YKICAgICAldikuICBVc2VmdWwgZm9yIG1hc3Mgdmhvc3RpbmcuICBbVG9ueSBGaW5jaCA8ZG90QGRvdGF0LmF0Pl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFxuIGFuZCBcdCB0byBtb2RfbG9nX2NvbmZpZywgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZQogICAgIG1vcmUgcmVsaWFibGUgbG9ncyB3aXRoIG11bHRpbGluZSBlbnRyaWVzLiAgW1RvbnkgRmluY2ggPGRvdEBkb3RhdC5hdD5dCgogICopIEZpeGVkIGEgZmV3IGNvbXBpbGVyIG5pdHMuICBbSm9obiBCbGV5IDxqYmI2QGFjcHViLmR1a2UuZWR1Pl0KCiAgKikgQWRkZWQgaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMgZm9yIGZhaWxlZCBtdW5tYXAoKSBhbmQgZnNlZWsoKSBjYWxscwogICAgIGluIGh0dHBfY29yZS5jLiBbSm9obiBCbGV5LCBSb3kgRmllbGRpbmddCgogICopIEFkZGVkIHNvbWUgaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMgZm9yIHNvbWUgZmFpbGVkIG1hbGxvYygpCiAgICAgY2FsbHMuIFtKb2huIEJsZXkgPGpiYjZAYWNwdWIuZHVrZS5lZHU+LCBKaW0gSmFnaWVsc2tpXQoKICAqKSBPUy8yIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZSgpJ3MgYmVoYXZpb3VyIGlzIGltcHJvdmVkOiBhcF9hc3NlcnQoKQogICAgIGlzIHJlbW92ZWQuIFRoaXMgYWxsb3dzIDxEaXJlY3RvcnkgcHJveHk6Kj4gZGlyZWN0aXZlcyB0byB3b3JrIGFuZAogICAgIHByZXZlbnRzIGludmFsaWQgcmVxdWVzdHMgZnJvbSBraWxsaW5nIHRoZSBwcm9jZXNzLgogICAgIFtCcmlhbiBIYXZhcmQgPGJyaWFuaEBraGVsZGFyLmFwYW5hLm9yZy5hdT5dCgogICopIFJlb3JnYW5pc2VkIEZBUSBkb2N1bWVudC4KICAgICBbSm9zaHVhIFNsaXZlIDxzbGl2ZUBmaW5hbmNlLmNvbW1lcmNlLnViYy5jYT5dIFBSIzI0OTcKCiAgKikgc3JjL3N1cHBvcnQvOiBUaGUgQXBhY2hlQmVuY2ggYmVuY2htYXJrIHByb2dyYW0gd2FzIG92ZXJoYXVsZWQgYnkKICAgICBEYXZpZCBOLiBXZWx0b246IHlvdSBjYW4gbm93IGhhdmUgaXQgZ2VuZXJhdGUgYW4gSFRNTCBUQUJMRSwgcHJlc3VtYWJseQogICAgIGZvciBpbnRlZ3JhdGlvbiBpbnRvIG90aGVyIEhUTUwgc291cmNlcy4gRGF2aWQgdXBkYXRlZCB0aGUgYWIgbWFuIHBhZ2UKICAgICBhcyB3ZWxsIGFuZCBhZGRlZCBzb21lIG1pc3NpbmcgZGVzY3JpcHRpb25zLiBUaGFua3MhCiAgICAgW0RhdmlkIE4uIFdlbHRvbiA8ZGF2aWR3QHByb3NhLml0Pl0KCiAgKikgV2luMzI6IFRoZSBmaWxlbmFtZSB2YWxpZGl0eSBjaGVja2VyIG5vdyBhbGxvd3MgZmlsZW5hbWVzIGNvbnRhaW5pbmcKICAgICBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAweDgwIHRvIDB4ZmYgKGZvciBleGFtcGxlIGFjY2VudGVkIGNoYXJhY3RlcnMpLgogICAgIFtQYXVsIFN1dHRvbl0gUFIjMzg5MAoKICAqKSBBZGRlZCBjb25kaXRpb25hbCBsb2dnaW5nIGJhc2VkIHVwb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvCiAgICAgbW9kX2xvZ19jb25maWcuICBtb2RfbG9nX3JlZmVyZXIgYW5kIG1vZF9sb2dfYWdlbnQKICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuICBbS2VuIENvYXJdCgogICopIEFsbG93IGFwYWNoZSBhY3RpbmcgYXMgYSBwcm94eSBzZXJ2ZXIgdG8gcmVsYXkgdGhlIHJlYWwKICAgICByZWFzb24gb2YgYSBmYWlsdXJlIHRvIGEgY2xpZW50IHJhdGhlciB0aGFuIHRoZSAiaW50ZXJuYWwKICAgICBzZXJ2ZXIgZXJyb3IiIGl0IGRvZXMgY3VycmVudGx5LiBUaGUgZ2VuZXJhbCBleHBvc3VyZSBtZWNoYW5pc20KICAgICBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGFueSBtb2R1bGUgYnkgc2V0dGluZyB0aGUgInZlcmJvc2UtZXJyb3ItdG8iCiAgICAgbm90ZSB0byAiKiI7IHRoaXMgYWxsb3dzIG1vcmUgdGhhbiBqdXN0IHByb3h5IGVycm9ycyB0byBiZSBleHBvc2VkLgogICAgIFtDbGlmZiBTa29sbmljaywgUm95IEZpZWxkaW5nLCBNYXJ0aW4gS3JhZW1lcl0gUmVsYXRlZCB0byBQUiMzNDU1LCA0MDg2CgogICopIE1vdmVkIG1hbiBwYWdlcyBmb3IgYWIgYW5kIGFwYWNoZWN0cmwgdG8gc2VjdGlvbiA4LgogICAgIFtXaWxmcmVkbyBTYW5jaGV6LCBSb3kgRmllbGRpbmddCgogICopIEFkZGVkIC1TIG9wdGlvbiB0byBpbnN0YWxsLnNoIHNvIHRoYXQgb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvCiAgICAgc3RyaXAgb24gc29tZSBwbGF0Zm9ybXMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBUd2VhayBtb2R1bGVzIE1ha2VmaWxlIGdlbmVyYXRlZCBieSBDb25maWd1cmUgc28gdGhhdCBpdCBoYW5kbGVzCiAgICAgdGhlIHRlc3QgY2FzZSBvZiBubyBtb2R1bGVzIGJlaW5nIHNlbGVjdGVkLiBbY2hhekByZWxpYW50LmNvbV0KCiAgKikgQWRkZWQgYSA8TGltaXRFeGNlcHQgbWV0aG9kIC4uLj4gc2VjdGlvbmluZyBkaXJlY3RpdmUgdGhhdCBhbGxvd3MKICAgICB0aGUgdXNlciB0byBhc3NpZ24gYXV0aGVudGljYXRpb24gY29udHJvbCB0byBhbnkgSFRUUCBtZXRob2QgdGhhdAogICAgIGlzICpub3QqIGdpdmVuIGluIHRoZSBhcmd1bWVudCBsaXN0OyBpLmUuLCB0aGUgbG9naWNhbCBuZWdhdGlvbgogICAgIG9mIHRoZSA8TGltaXQ+IGRpcmVjdGl2ZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29udHJvbGxpbmcKICAgICBhY2Nlc3Mgb24gbWV0aG9kcyB1bmtub3duIHRvIHRoZSBBcGFjaGUgY29yZSwgYnV0IHBlcmhhcHMga25vd24gYnkKICAgICBzb21lIG1vZHVsZSBvciBDR0kgc2NyaXB0LiBbUm95IEZpZWxkaW5nLCBUb255IEZpbmNoXQoKICAqKSBQcmV2ZW50IGFwYWNoZWN0bCBmcm9tIGNvbXBsYWluaW5nIGlmIHRoZSBQSURGSUxFIGV4aXN0cyBidXQKICAgICBkb2VzIG5vdCBjb250YWluIGEgcHJvY2VzcyBpZCwgYXMgbWlnaHQgb2NjdXIgaWYgdGhlIHNlcnZlciBpcwogICAgIGJlaW5nIHJhcGlkbHkgcmVzdGFydGVkLiBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgV2luMzI6IEFkZCBnbG9iYWwgc3ltYm9scyBtaXNzaW5nIGZyb20gQXBhY2hlQ29yZS5kZWYuIFtDYXJsIE9sc2VuXQoKICAqKSBFbnRpdHkgdGFnIGNvbXBhcmlzb25zIGZvciBJZi1NYXRjaCBhbmQgSWYtTm9uZS1NYXRjaCB3ZXJlIG5vdCBiZWluZwogICAgIHBlcmZvcm1lZCBjb3JyZWN0bHkgLS0gd2VhayB0YWdzIG1pZ2h0IGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4gIEFsc28sCiAgICAgc3Ryb25nIGNvbXBhcmlzb24gd2Fzbid0IHByb3Blcmx5IGVuZm9yY2VkIGluIGFsbCBjYXNlcy4KICAgICBbUm95IEZpZWxkaW5nLCBLZW4gQ29hciwgRGVhbiBHYXVkZXRdIFBSIzIwNjUsIDM2NTcKCiAgKikgT1MvMjogU3VwcGx5IE9TLzIgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGVycm5vIG9uIHNlbWFwaG9yZSBlcnJvcnMuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTHlueCByZWdhcmRpbmcgaXRzIHNlbmRpbmcgIk5lZ290aWF0ZTogdHJhbnMiCiAgICAgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCB1bmRlcnN0YW5kIFRDTi4gIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgYXBfc2l6ZV9saXN0X2l0ZW0oKSwgYXBfZ2V0X2xpc3RfaXRlbSgpLCBhbmQgYXBfZmluZF9saXN0X2l0ZW0oKQogICAgIHRvIHV0aWwuYyBmb3IgcGFyc2luZyBhbiBIVFRQIGhlYWRlciBmaWVsZCB2YWx1ZSB0byBleHRyYWN0IHRoZSBuZXh0CiAgICAgbGlzdCBpdGVtLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwb3NzaWJsZSBwcmVzZW5jZSBvZiBuZXN0ZWQgY29tbWVudHMsCiAgICAgcXVvdGVkLXBhaXJzLCBhbmQgcXVvdGVkLXN0cmluZ3MuIGFwX2dldF9saXN0X2l0ZW0oKSBhbHNvIHJlbW92ZXMKICAgICBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2UgYW5kIGxvd2VyY2FzZXMgbm9uLXF1b3RlZCB0b2tlbnMuCiAgICAgW1JveSBGaWVsZGluZ10gUFIjMjA2NQoKICAqKSBwcm94eTogVGhlIHZhcmlvdXMgY2FsbHMgdG8gYXBfcHJveHllcnJvcigpIGNhbiByZXR1cm4gSFRUUC8xLjEgc3RhdHVzCiAgICAgY29kZSBkaWZmZXJlbnQgZnJvbSA1MDAuIFRoaXMgYWxsb3dzIHRoZSBwcm94eSB0bywgZS5nLiwgcmV0dXJuCiAgICAgIjQwMyBGb3JiaWRkZW4iIGZvciBQcm94eUJsb2NrJ2VkIFVSTCdzLiBbTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NQoKICAqKSBGaXggb3JkZXJpbmcgb2YgbGFuZ3VhZ2UgdmFyaWFudHMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0cmFkaXRpb25hbAogICAgIG5lZ290aWF0aW9uIGFsZ29yaXRobSBpcyBiZWluZyB1c2VkIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2UgdmFyaWFudHMKICAgICBhbmQgbm8gQWNjZXB0LUxhbmd1YWdlLiBbSmFtZXMgVHJlYWN5IDx0cmVhY3lAZGViaWFuLm9yZz5dIFBSIzMyOTksIDM2ODgKCiAgKikgRG8gbm90IHJvdW5kIHRoZSBUQ04gcXVhbGl0eSBjYWxjdWxhdGlvbiB0byA1IGRlY2ltYWwgcGxhY2VzLAogICAgIHVubGlrZSBSRkMgMjI5NiwgYmVjYXVzZSB0aGUgY2FsY3VsYXRpb24gbWlnaHQgbmVlZCAxMiBkZWNpbWFsIHBsYWNlcwogICAgIHRvIGdldCB0aGUgcmlnaHQgcmVzdWx0LiAgW1JveSBGaWVsZGluZ10KCiAgKikgUmVtb3ZlIHVudXNlZCBjb2RlIHRvIGRpc2FibGUgdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24gd2hlbgogICAgIG5lZ290aWF0aW5nIG9uIGVuY29kaW5nIG9ubHksIGFzIHdlIG5vdyBoYW5kbGUgZW5jb2RpbmcgdG9vCiAgICAgKHRob3VnaCB0aGlzIGlzIG5vbnN0YW5kYXJkIGZvciBUQ04pLCByZW1vdmUgY2hhcnNldD1JU08tODg1OS0xCiAgICAgZmlkZGxlIGZyb20gdGhlIGZpZGRsZS1hdmVyc2UgUlZTQSBjb21wYXJpc29uLCBhbmQgZml4IGJ1Z3MgaW4KICAgICBzb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHdpdGhpbiBtb2RfbmVnb3RpYXRpb24uIFtLb2VuIEhvbHRtYW5dCgogICopIEZpeGVkIGEgcmFyZSBtZW1vcnkgY29ycnVwdGlvbiBwb3NzaWJpbGl0eSBpbiBtb2RfZGlyIGlmIHRoZSBpbmRleAogICAgIGZpbGUgaXMgbmVnb3RpYWJsZSBhbmQgbm8gYWNjZXB0YWJsZSB2YXJpYW50IGNhbiBiZSBmb3VuZC4KICAgICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdCgogICopIFdpbjMyOiBBZGQgbmV3IGNvbmZpZyBkaXJlY3RpdmUsIFNjcmlwdEludGVycHJldGVyU291cmNlLCB0byBlbmFibGUKICAgICBzZWFyY2hpbmcgdGhlIFdpbjMyIHJlZ2lzdHJ5IGZvciBzY3JpcHQgaW50ZXJwcmV0ZXJzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMjogVGhlIGNvbXBpbGVkLWluIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciBsb2cgaXMgbm93CiAgICAgZXJyb3IubG9nLCB3aGljaCBtYXRjaGVzIHRoZSBkZWZhdWx0IGluIHRoZSBkaXN0cmlidXRlZCBodHRwZC5jb25mLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgV2luMzI6IEFueSBlcnJvciBtZXNzYWdlcyBmcm9tIC1pIG9yIC11IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cKICAgICBkaXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgb3V0cHV0IHJhdGhlciB0aGFuIHNlbnQgdG8gdGhlIGVycm9yIGxvZy4KICAgICBBbHNvIHRoZSAiUnVubmluZyBBcGFjaGUuLi4iIG1lc3NhZ2UgaXMgbm90IG91dHB1dCB1bmxlc3MgQXBhY2hlIGlzCiAgICAgZ29pbmcgdG8gc2VydmUgcmVxdWVzdHMuIFtQYXVsIFN1dHRvbl0KCiAgKikgUmV3b3JrIHRoZSBNRDUgYXV0aGVudGljYXRpb24gc2NoZW1lIHRvIHVzZSBGcmVlQlNEJ3MgYWxnb3JpdGhtLAogICAgIGFuZCB1c2UgYSBwcml2YXRlIHNpZ25pZmljYXRvciAoJyRhcHIxJCcpIHRvIG1hcmsgcGFzc3dvcmRzIGFzCiAgICAgYmVpbmcgc21hc2hlZCB3aXRoIG91ciBvd24gYWxnb3JpdGhtLiAgQWxzbyBhYnN0cmFjdCB0aGUgcGFzc3dvcmQKICAgICBjaGVja2luZyBpbnRvIGEgbmV3IGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgcm91dGluZS4gIFtLZW4gQ29hcl0KCiAgKikgV2luMzI6IFRoZSBmaWxlbmFtZSB2YWxpZGl0eSBjaGVja2VyIG5vdyBhbGxvd3MgIkNPTSIgYnV0IHJlZnVzZXMgCiAgICAgYWNjZXNzIHRvICJDT00xIiB0aHJvdWdoICJDT000Ii4gVGhpcyBhbGxvd3MgZmlsZW5hbWVzIHN1Y2gKICAgICBhcyAiY29tLm5hbWUiIHRvIGJlIHNlcnZlZC4gW1BhdWwgU3V0dG9uXSBQUiMzNzY5LgoKICAqKSBCUzIwMDA6IEFkYXB0IHRvIHRoZSBuZXcgdWZvcmsoKSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2Ugd2hpY2ggd2lsbAogICAgIG1ha2Ugc3VidGFza2luZyBlYXNpZXIgb24gdGhlIE9TRC9QT1NJWCBtYWluZnJhbWUgZW52aXJvbm1lbnQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgYSBjb21wYXRpYmlsaXR5IGRlZmluZSBmb3IgZXNjYXBlX3VyaSgpIC0+IGFwX2VzY2FwZV91cmkoKSB0bwogICAgIGFwX2NvbXBhdC5oLiBbRGF2aWQgV2hpdGUgPGRhdmlkQHBlcnNpbW1vbi5jb20+XSBQUiMzNzI1CgogICopIE1ha2UgTkRCTSBmaWxlIHN1ZmZpeCBkZXRlcm1pbmF0aW9uIGZvciBtb2RfcmV3cml0ZSBtb3JlIGFjY3VyYXRlLCBpLmUuCiAgICAgdXNlIGAuZGInIGluc3RlYWQgb2YgYC5wYWcnIG5vdCBvbmx5IGZvciBGcmVlQlNELCBidXQgYWxzbyB3aGVuCiAgICAgdGhlIE5EQk0gbGlicmFyeSBsb29rcyBsaWtlIEJlcmtlbGV5LURCIGJhc2VkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzNzczCgogICopIEFkZCBhYmlsaXR5IHRvIGhhbmRsZSBERVMgb3IgTUQ1IGF1dGhlbnRpY2F0aW9uIHBhc3N3b3Jkcy4KICAgICBbUnlhbiBCbG9vbSA8cmJiQFJhbGVpZ2guSUJNLkNvbT5dCgogICopIEZpeCBPKG5eMikgbWVtb3J5IGNvbnN1bXB0aW9uIGluIG1vZF9zcGVsaW5nLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogQXZvaWQgc29tZSBidWZmZXIgb3ZlcmZsb3cgcHJvYmxlbXMgd2hlbiBlc2NhcGluZwogICAgIHF1b3RlZCBzdHJpbmdzLiAgKFRoaXMgb3ZlcmZsb3cgd2FzIG9uIHRoZSBoZWFwIGFuZCB3ZSBiZWxpZXZlCiAgICAgaW1wb3NzaWJsZSB0byBleHBsb2l0LikgIFtSaWNrIFBlcnJ5IDxwZXJyeUBlY2UudmlsbC5lZHU+XQoKICAqKSBMZXQgc3JjL0NvbmZpZ3VyZSBiZSBhd2FyZSBvZiBDRkxBR1Mgb3B0aW9ucyBzdGFydGluZyB3aXRoIHBsdXMKICAgICBzaWducyBhcyBpdCdzIHRoZSBjYXNlIGZvciB0aGUgSFAvVVggY29tcGlsZXIuCiAgICAgW0RvdWcgWWF0Y2lsbGEgPHlhdGNpbGRhQHVtZG5qLmVkdT5dIFBSIzM2ODEKCiAgKikgUmVtb3ZlIHRoZSBoYXJkLXdpcmUgb2YgVEFSPXRhciAod2Ugbm93IGNoZWNrIGZvciBndGFyIGFuZCBnbnV0YXIgZmlyc3QpCiAgICAgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgdGFyIHdlIHdpbmQgdXAgd2l0aCBzdXBwb3J0cyAnLWgnLgogICAgIFtKaW0gSmFnaWVsc2tpXSBQUiMzNjcxCgogICopIEEgY29uc2lzdGVudCBhbmQgY29uc2VydmF0aXZlIHN0eWxlIGZvciBhbGwgc2hlbGwgc2NyaXB0cyBoYXMgYmVlbgogICAgIGltcGxlbWVudGVkLiBCYXNpY2FsbHksIGFsbCBzaGVsbCBzdHJpbmcgdGVzdHMgdXNlIHRoZSB0cmFkaXRpb25hbAogICAgIGhhY2sgb2YgJ2lmIFsgIngkdmFyIiAhPSAieCIgXScgb3IgJ2lmIFsgIngkdmFyIiA9ICJ4c3RyaW5nIiBdJwogICAgIHRvIHByb3RlY3QgYWdhaW5zdCBiYXJlIG51bGwgdmFyaWFibGUgc3RyaW5ncyAoaWU6IHdyYXBwaW5nIGJvdGgKICAgICBzaWRlcyB3aXRoIGRvdWJsZSBxdW90ZXMgYW5kIHByZXBlbmRpbmcgJ3gnKS4gJ3gnIHdhcyBjaG9zZW4KICAgICBiZWNhdXNlIGl0J3MgbW9yZSB1bml2ZXJzYWwgYW5kIGhvcGVmdWxseSBlYXNpZXIgZm9yIG9sZCBzaGVsbAogICAgIHByZ3JhbW1lcnMsIGFzIHdlbGwgYXMgYmVpbmcgZWFzaWVyIHRvIHNlYXJjaCBmb3IgaW4gJ3ZpJyAoL3hcJCkgOikKICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgVGhlIHN0YXR1cyBtb2R1bGUgbm93IHByaW50cyBvdXQgYm90aCB0aGUgbWFpbiBzZXJ2ZXIgZ2VuZXJhdGlvbiBhcwogICAgIHdlbGwgYXMgdGhlIGdlbmVyYXRpb24gb2YgZWFjaCBwcm9jZXNzLiBBbHNvLCB0aGUgdmhvc3QgaW5mbyBpcwogICAgIHByaW50ZWQgd2l0aCAnP25vdGFibGUnLiBbSmltIEphZ2llbHNraV0KCiAgKikgTW92ZSBzcmMvbWFpbi9tZDVjLmMgdG8gc3JjL2FwL2FwX21kNWMuYzsgaXQncyBodHRwZC1uZXV0cmFsCiAgICAgYW5kIHRoaXMgbWFrZXMgaXRzIGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gdGhpbmdzIGluIHNyYy9zdXBwb3J0LgogICAgIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjQKCiAgKikgUmVuYW1lZCBtYWNyb3Mgc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gdG8gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KICAgICBhbmQgdmVzdGlnaWFsIHNjYW5fc2NyaXB0X2hlYWRlciB0byBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyLAogICAgIG1vc3RseSBmb3IgYWVzdGhldGljIHJlYXNvbnMuIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBxdWVyeSBzd2l0Y2ggImh0dHBkIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgdGhlIE1PRFVMRV9NQUdJQ19DT09LSUUgZnJvbSBiZWZvcmUgdGhlIHZlcnNpb25zIGFuZAogICAgIGZpbGVuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIFNUQU5EQVJEX01PRFVMRV9TVFVGRi4gIEl0cwogICAgIHByZXNlbmNlIGF0IHRoZSBiZWdpbm5pbmcgcHJldmVudGVkIHJlcG9ydGluZyBvZiB0aGUgZmlsZW5hbWUKICAgICBmb3IgbW9kdWxlcyBjb21waWxlZCBiZWZvcmUgMSBKYW51YXJ5IDE5OTkuICBbS2VuIENvYXJdCgogICopIFNFQ1VSSVRZOiBhcF9vc19pc19maWxlbmFtZV92YWxpZCgpIGhhcyBiZWVuIGFkZGVkIHRvIFdpbjMyCiAgICAgdG8gZGV0ZWN0IGFuZCBwcmV2ZW50IGFjY2VzcyB0byBzcGVjaWFsIERPUyBkZXZpY2UgZmlsZSBuYW1lcy4KICAgICBbUGF1bCBTdXR0b24sIEtlbiBQYXJ6eWduYXRdCiAgICAgCiAgKikgV0lOMzI6IENyZWF0ZWQgbmV3IG1ha2VmaWxlcyBNYWtlZmlsZV93aW4zMi50eHQgKG5vcm1hbCBidWlsZCkKICAgICBhbmQgTWFrZWZpbGVfd2luMzJfZGVidWcudHh0IChkZWJ1ZyBidWlsZCkgdGhhdCB3b3JrIG9uIFdpbjk1LgogICAgIFJ1biBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgc3JjIGRpcmVjdG9yeToKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMi50eHQgICAgICAgICAgICMgY29tcGlsZXMgbm9ybWFsIGJ1aWxkCiAgICAgICAgbm1ha2UgL2YgTWFrZWZpbGVfd2luMzIudHh0IGluc3RhbGwgICAjIGNvbXBpbGVzIGFuZCBpbnN0YWxscwogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyLnR4dCBjbGVhbiAgICAgIyByZW1vdmVzIGNvbXBpbGVkIGp1bmsKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgICAgICMgY29tcGlsZXMgZGVidWcgYnVpbGQKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgaW5zdGFsbAogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyX2RlYnVnLnR4dCBjbGVhbgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEFkZGVkIGJpbmJ1aWxkLnNoIGFuZCBmaW5kcHJnLnNoIGhlbHBlcnMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVzCiAgICAgdG8gYnVpbGQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMuIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEluZGV4T3B0aW9ucyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgb25seSB0dXJuZWQgb2ZmIG1ha2luZwogICAgIHRoZSBjb2x1bW4gaGVhZGVycyBhbmNob3JzOyB5b3UgY291bGQgc3RpbGwgY2hhbmdlIHRoZSBkaXNwbGF5CiAgICAgb3JkZXIgYnkgbWFudWFsbHkgYWRkaW5nIGEgJz9OPUEnIG9yIHNpbWlsYXIgcXVlcnkgc3RyaW5nIHRvIHRoZQogICAgIFVSTC4gIE5vdyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgbG9ja3MgaW4gdGhlIHNvcnQgb3JkZXIgc28KICAgICBpdCBjYW4ndCBiZSBvdmVycmlkZGVuIHRoaXMgd2F5LiAgW0tlbiBDb2FyXQoKICAqKSBBZGRlZCBJbmRleE9yZGVyRGVmYXVsdCBkaXJlY3RpdmUgdG8gc3VwcGx5IGEgZGVmYXVsdCBzb3J0IG9yZGVyCiAgICAgZm9yIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZ3MuICBbS2VuIENvYXJdIFBSIzE2OTkKCiAgKikgQ2hhbmdlIHRoZSBhcF9hc3NlcnQgbWFjcm8gdG8gYSB2YXJpYW50IHRoYXQgd29ya3Mgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUmljaGFyZCBQcmlueiA8cmljaGFyZC5wcmluekBjc28ubmV0Pl0gUFIjMjU3NQoKICAqKSBNYWtlIHN1cmUgdW5kZXIgRUxGLWJhc2VkIE5ldEJTRCAobm93KSBhbmQgT3BlbkJTRCAoZnV0dXJlKSB3ZSBkb24ndAogICAgIHNlYXJjaCBmb3IgYW4gdW5kZXJzY29yZSBvbiBkbHN5bSgpIChhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UKICAgICBmb3IgRnJlZUJTRCAzLjApLiBbVG9kZCBWaWVybGluZyA8dHZAcG9ib3guY29tPl0gUFIjMjQ2MgogIAogICopIFNtYWxsIGZpeCBmb3IgbW9kX2Vudi5odG1sOiBUaGUgbW9kdWxlIHdhcyBkb2N1bWVudGVkIGFzIHRvIGJlIF9ub3RfCiAgICAgY29tcGlsZWQgaW50byBBcGFjaGUgcGVyIGRlZmF1bHQsIGFsdGhvdWdoIGl0IF9JU18gY29tcGlsZWQgaW50byAKICAgICBBcGFjaGUgcGVyIGRlZmF1bHQuIFtTaW0gSGFyYmVydCA8c2ltQG1pbmRzcHJpbmcuY29tPl0gUFIjMzU3MgoKICAqKSBJbnN0ZWFkIG9mIGZpeGluZyBhIGJ1ZyBpbiB0aGUgZ2VuZXJhdGlvbiBwcm9jZWR1cmUgZm9yIGNvbmZpZy5zdGF0dXMgKGEKICAgICBiYWNrc2xhc2ggd2FzIG1pc3NpbmcpIHdlIHJlbW92ZSB0aGUgYnVnIHRvZ2V0aGVyIHdpdGggaXQncyBjb21wbGV0ZQogICAgIGNvbnRleHQgYmVjYXVzZSB0aGUgc3BlY2lhbCBjYXNlcyBvZiB0aGUgcGFzdCBjYW4gbm93IG5vIGxvbmdlciBvY2N1cgogICAgIGJlY2F1c2Ugb2YgdGhlIHJlY2VudCBtYWdpYyBmb3IgdGhlIC0td2l0aC1sYXlvdXQgZGVmYXVsdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzU5MAogCiAgKikgTWFrZSB0b3AtbGV2ZWwgTWFrZWZpbGUgYXdhcmUgb2YgYSBwYXJhbGxlbCBidWlsZCBwcm9jZWR1cmVzIChtYWtlIC1qKSBieQogICAgIG1ha2luZyBzdXJlIHRoZSBzcmMvc3VwcG9ydC8gdG9vbHMgYXJlIF9mb3JjZWRfIHRvIGJlIGJ1aWxkIGxhc3QgKHRoZXkKICAgICBkZXBlbmQgb24gb3RoZXIgbGlicmFyaWVzKS4KICAgICBbTWFya3VzIFRoZWlzc2luZ2VyIDxtYXJrdXMudGhlaXNzaW5nZXJAZ214LmRlPl0KCiAgKikgRml4IGluc3RhbGxhdGlvbiBwcm9jZWR1cmU6IE5vdyB0aGF0IG9zLWlubGluZS5jIGlzIGFjdHVhbGx5IHVzZWQgKGEKICAgICByZWNlbnRseSBmaXhlZCBidWcgcHJldmVudGVkIHRoaXMpIHdlIG5lZWQgdG8gYWxzbyBpbnN0YWxsIG9zLWluY2x1ZGUuYwogICAgIGluIGFkZGl0aW9uIHRvIG9zLmggaW50byB0aGUgUFJFRklYL2luY2x1ZGUvIGxvY2F0aW9uIG9yIGJ1aWxkaW5nIG9mCiAgICAgbW9kdWxlIERTT3Mgd2l0aCBBUFhTIGZhaWxzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzUyNwoKICAqKSBBZGRlZCBNT0RVTEVfTUFHSUNfQ09PS0lFIGFzIHRoZSBmaXJzdCBmaWVsZCBpbiBhIG1vZHVsZSBzdHJ1Y3R1cmUgdG8KICAgICBhbGxvdyB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2FyYmxlZCBEU08gKG9yIGV2ZW4gYSBmaWxlIHdoaWNoIGlzbid0CiAgICAgYW4gQXBhY2hlIG1vZHVsZSBEU08gYXQgYWxsKSBhbmQgYSBEU08gd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudAogICAgIEFwYWNoZSBBUEkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMTUyCiAKICAqKSBUd28gbWlub3IgZW5oYW5jZW1lbnRzIHRvIG1vZF9yZXdyaXRlOiBGaXJzdCBSZXdyaXRlUnVsZSBub3cgYWxzbwogICAgIHN1cHBvcnRzIHRoZSBgYG5vY2FzZXxOQycnIGZsYWcgKGFzIFJld3JpdGVDb25kIGFscmVhZHkgZG9lcyBmb3IgYWdlcykgdG8KICAgICBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlICh0aGlzIGVzcGVjaWFsbHkgYXZvaWRzIG5hc3R5IHBhdHRlcm5zIGxpa2UKICAgICBgW3RUXVtlRV1bc1NdW3RUXScpLiBTZWNvbmQgdHdvIGFkZGl0aW9uYWwgaW50ZXJuYWwgbWFwIGZ1bmN0aW9ucwogICAgIGBlc2NhcGUnIGFuZCBgdW5lc2NhcGUnIHdlcmUgYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXNjYXBlL3VuZXNjYXBlCiAgICAgdG8vZnJvbSBoZXgtZW5jb2RpbmdzIGluIFVSTHMgcGFydHMgKHRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4KICAgICBjb21iaW5hdGlvbiB3aXRoIG1hcCBsb29rdXBzKS4gCiAgICAgW01hZ251cyBCb2RpbiwgSWFuIEthbGxlbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCB0aGUgbWFjcm8gZXNjYXBlX3VyaSgpIHRvIGFwX2VzY2FwZV91cmkoKSB3aGljaCB3YXMKICAgICBmb3Jnb3R0ZW4gKGJlY2F1c2UgaXQgd2FzIGEgbWFjcm8pIGluIHRoZSBzeW1ib2wgcmVuYW1pbmcgcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHNvbWUgaW5jb25zaXN0ZW5jaWVzIHJlbGF0ZWQgdG8gdGhlIHNjb3BlcyBvZiBkaXJlY3RpdmVzLiBUaGUgb25seQogICAgIHVzZXIgdmlzaWJsZSBjaGFuZ2UgaXMgdGhhdCB0aGUgZGlyZWN0aXZlcyBgVXNlQ2Fub25pY2FsTmFtZScgYW5kCiAgICAgYENvbnRlbnREaWdlc3QnIG5vdyB1c2UgdGhlIChtb3JlIGNvcnJlY3QpIGBPcHRpb25zJyBzY29wZSBpbnN0ZWFkIG9mCiAgICAgKGxlc3MgY29ycmVjdCkgYEF1dGhDb25maWcnIHNjb3BlLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzaW5nIERTTywgdGhlIFNlcnZlciB0b2tlbiB3YXMgYmVpbmcgbWFuZ2xlZC4gU3BlY2lmaWNhbGx5LCB0aGUKICAgICBtb2R1bGUncyB0b2tlbiB3YXMgYmVpbmcgYWRkZWQgZmlyc3QgYmVmb3JlIHRoZSBBcGFjaGUgdG9rZW4uIFRoaXMKICAgICBoYXMgYmVlbiBmaXhlZC4gW0ppbSBKYWdpZWxza2ldCgogICopIE1ham9yIG92ZXJoYXVsIG9mIG1vZF9uZWdvdGlhdGlvbi5jLCBwYXJ0IDIuCiAgICAgLSBwcm9wZXJseSBoYW5kbGUgImlkZW50aXR5IiB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWxsb3cgZW5jb2RlZCB2YXJpYW50cyBpbiBSVlNBIG5lZ290aWF0aW9uIGFuZCBsZXQgdGhlbSBhcHBlYXIgaW4KICAgICAgIHRoZSBBbHRlcm5hdGVzIGZpZWxkIHVzaW5nIHRoZSBub24tc3RhbmRhcmQgImVuY29kaW5nIiB0YWctbGlzdC4KICAgICAtIGZpeGVkIGJvdGggbmVnb3RpYXRpb24gYWxnb3JpdGhtcyBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgYWNjZXB0ZWQKICAgICAgIGVuY29kaW5nIGlzIHByZWZlcnJlZCBvdmVyIG5vIGVuY29kaW5nIGlmICJpZGVudGl0eSIgaXMgbm90CiAgICAgICBpbmNsdWRlZCB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWRkZWQgYXBfYXJyYXlfcHN0cmNhdCgpIHRvIGFsbG9jLmMgZm9yIGVmZmljaWVudCBjb25jYXRlbmF0aW9uCiAgICAgICBvZiBsYXJnZSBzdWJzdHJpbmcgc2VxdWVuY2VzLgogICAgIC0gcmVwbGFjZWQgTyhuXjIpIG1lbW9yeSBob2dzIGluIG1vZF9uZWdvdGlhdGlvbiB3aXRoIGFwX2FycmF5X3BzdHJjYXQuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgTWFqb3Igb3ZlcmhhdWwgb2YgbW9kX25lZ290aWF0aW9uLmMsIHBhcnQgMS4KICAgICAtIGNsZWFudXBzIHRvIG1vZF9uZWdvdGlhdGlvbiBjb21tZW50cyBhbmQgY29kZSBzdHJ1Y3R1cmUKICAgICAtIG1hZGUgY29tcGxpYW50IHdpdGggSFRUUC8xLjEgcHJvcG9zZWQgc3RhbmRhcmQgKHJmYzIwNjgpIGFuZCBhZGRlZAogICAgICAgc3VwcG9ydCBmb3IgZXZlcnl0aGluZyBpbiB0aGUgdXBjb21pbmcgSFRUUC8xLjEKICAgICAgIHJldmlzaW9uIChkcmFmdC1pZXRmLWh0dHAtdjExLXNwZWMtcmV2LTA2LnR4dCkuCiAgICAgICAgIC0gbGFuZ3VhZ2UgdGFnIG1hdGNoaW5nIGFsc28gaGFuZGxlcyB0YWdzIHdpdGggbW9yZSB0aGFuIDIKICAgICAgICAgICBsZXZlbHMgbGlrZSB4LXktegogICAgICAgICAtIGVtcHR5IEFjY2VwdCwgQWNjZXB0LUxhbmd1YWdlLCBBY2NlcHQtQ2hhcnNldCBoZWFkZXJzIGFyZQogICAgICAgICAgIHByb2Nlc3NlZCBjb3JyZWN0bHk7IHByZXZpb3VzbHkgYW4gZW1wdHkgaGVhZGVyIHdvdWxkIG1ha2UgYWxsCiAgICAgICAgICAgdmFsdWVzIGFjY2VwdGFibGUgaW5zdGVhZCBvZiB1bmFjY2VwdGFibGUuCiAgICAgICAgIC0gYWxsb3dlZCBmb3IgcSB2YWx1ZXMgaW4gQWNjZXB0LUVuY29kaW5nCiAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChyZmMyMjk1IGFuZAogICAgICAgcmZjMjI5NikgKHRob3VnaCB3ZSBkbyBub3QgaW1wbGVtZW50IGFsbCBmZWF0dXJlcyBpbiB0aGVzZSBkcmFmdHMsCiAgICAgICBlLmcuIG5vIGZlYXR1cmUgbmVnb3RpYXRpb24pLiAgUmVtb3ZlZCBvbGQgZXhwZXJpbWVudGFsIHZlcnNpb24uCiAgICAgLSBpbXBsZW1lbnRlZCAnc3RydWN0dXJlZCBlbnRpdHkgdGFncycgZm9yIGJldHRlciBjYWNoZSBjb3JyZWN0bmVzcwogICAgICAgKHN0cnVjdHVyZWQgZW50aXR5IHRhZ3MgZW5zdXJlIHRoYXQgY2FjaGVzIHdoaWNoIGNhbiBkZWFsIHdpdGggVmFyeQogICAgICAgd2lsbCAoZXZlbnR1YWxseSkgYmUgdXBkYXRlZCBpZiB0aGUgc2V0IG9mIHZhcmlhbnRzIG9uIHRoZSBzZXJ2ZXIKICAgICAgIGlzIGNoYW5nZWQpCiAgICAgICAgIC0gdGhpcyBpbnZvbHZlZCBhZGRpbmcgYSB2bGlzdF92YWxpZGF0b3IgZWxlbWVudCB0byByZXF1ZXN0X3JlYwogICAgICAgICAtIHRoaXMgaW52b2x2ZWQgYWRkaW5nIHRoZSBhcF9tYWtlX2V0YWcoKSBmdW5jdGlvbiB0byB0aGUgZ2xvYmFsIEFQSQogICAgIC0gbW9kaWZpZWQgZ3Vlc3Npbmcgb2YgY2hhcnNldHMgdXNlZCBieSBBcGFjaGUgbmVnb3RpYXRpb24gYWxnb3JpdGhtIAogICAgICAgdG8gZ3Vlc3MgJ25vIGNoYXJzZXQnIGlmIHRoZSB2YXJpYW50IGlzIG5vdCBhIHRleHQvKiB0eXBlCiAgICAgLSBhZGRlZCBjb2RlIHRvIHNvcnQgbXVsdGl2aWV3cyB2YXJpYW50cyBpbnRvIGEgY2Fub25pY2FsIG9yZGVyIHNvIHRoYXQKICAgICAgIG5lZ290aWF0aW9uIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2t1cC9yZXN0b3JlcyBhbmQgbWlycm9ycwogICAgIC0gcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIHR5cGUgbWFwIGZpbGUgcmVzb2x2aW5nIHRvIGFub3RoZXIgdHlwZSBtYXAKICAgICAgIGZpbGUgYXMgaXRzIGJlc3QgdmFyaWFudAogICAgIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZywgTGFycyBFaWxlYnJlY2h0XSBQUiMzNDUxLCAzMjk5LCAxOTg3CgogICopIFJGQzIzOTYgYWxsb3dzIHRoZSBzeW50YXggaHR0cDovL2hvc3Q6L3BhdGggKHdpdGggbm8gcG9ydCBudW1iZXIpCiAgICAgYnV0IHRoZSBwcm94eSBkaXNhbGxvd2VkIGl0IChhcF9wcm94eV9jYW5vbl9uZXRsb2MoKSkuCiAgICAgW0RhdmlkIEtyaXN0b2wgPGRta0BiZWxsLWxhYnMuY29tPl0gUFIjMzUzMAoKICAqKSBXaGVuIG1vZHVsZXMgdXBkYXRlL21vZGlmeSB0aGUgZmlsZSBuYW1lIGluIHRoZSBjb25maWdmaWxlX3Qgc3RydWN0dXJlLAogICAgIHN5bnRheCBlcnJvcnMgd2lsbCByZXBvcnQgdGhlIHVwZGF0ZWQgbmFtZSwgbm90IHRoZSBvcmlnaW5hbCBvbmUuCiAgICAgW0ZhYmllbiBDb2VsaG8gPGNvZWxob0BjcmkuZW5zbXAuZnI+XSBQUiMzNTczCgogICopIENvcnJlY3Qgc29tZSBmaWxlbmFtZSBjYXNlIGFzc3VtcHRpb25zIGZyb20gV0lOMzIgdG8KICAgICBDQVNFX0JMSU5EX0ZJTEVTWVNURU0uICBbQnJpYW4gSGF2YXJkIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBGb3IgJXYgbG9nIFNlcnZlck5hbWUgcmVnYXJkbGVzcyBvZiB0aGUgVXNlQ2Fub25pY2FsTmFtZQogICAgIHNldHRpbmcgKHNpbWlsYXJseSBmb3IgJXApLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDb25maWd1cmUgd2FzIGluaXRpYWxpemluZyB0aGUgdmFyaWFibGVzICRPU0RJUiwgJElOQ0RJUiBhbmQgJFNIRUxMCiAgICAgcmF0aGVyIGxhdGUgKHRvbyBsYXRlIGZvciBzb21lIGludm9jYXRpb25zIG9mIFRlc3RDb21waWxlKS4KICAgICBUaGlzIGltcHJvdmVzIHRoZSBtYWtlIGVudmlyb25tZW50IGF2YWlsYWJsZSB0byBUZXN0Q29tcGlsZSBhbmQKICAgICB0aGUgKi5tb2R1bGUgc2NyaXB0cy4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBUaGUgaGFzaGJhbmcgZW11bGF0aW9uIGNvZGUgaW4gYXBfZXhlY3ZlLmMgd291bGQgaW50ZXJwcmV0CiAgICAgIyEvaGFzaGJhbmcvc2NyaXB0cyBjb3JyZWN0bHksIGJ1dCBmYWlsZWQgdG8gZmFsbCBiYWNrIHRvIGEKICAgICBzdGFuZGFyZCBzaGVsbCBmb3Igc2NyaXB0cyB3aGljaCBkaWQgTk9UIHN0YXJ0IHdpdGggIyEKICAgICBOb3cgU0hFTExfUEFUSCBpcyBzdGFydGVkIGluIHRoZXNlIGNhc2VzLiBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEFkZGVkIHRoZSBDeWJlcmd1YXJkIFYyIHBvcnQgW1JpY2hhcmQgU3RhZ2cgPHN0YWdnQGxlbnRpbC5vcmc+XQogICAgIFBSIzMzMzYKCiAgKikgVXBkYXRlIEFQWFMgbWFudWFsIHBhZ2U6IHNvbWUgLXEgb3B0aW9uIGFyZ3VtZW50cyB3ZXJlIG1pc3NpbmcKICAgICBhbmQgYW5vdGhlciB3YXMgaW5jb3JyZWN0LiBbTWFyayBBbmRlcnNvbiA8bWRhQGRpc2Nlcm5pbmcuY29tPl0gUFIjMzU1MwoKICAqKSBDbGVhbnVwIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uczogYC0/JyB3YXMgZG9jdW1lbnRlZCB0byBzaG93CiAgICAgdGhlIHVzYWdlIGxpc3QgYnV0IGRvZXMgaXQgd2l0aCBhbiBlcnJvciBiZWNhdXNlIGA/JyBpcyBub3QgYSB2YWxpZAogICAgIGNvbW1hbmQuIE9UT0ggYSBsb3Qgb2YgdXNlcnMgZXhwZWN0IGAtaCcgdG8gcHJpbnQgc3VjaCBhIHVzYWdlIGxpc3QgYW5kCiAgICAgaW5zdGVhZCBhcmUgYW5ub3llZCBmb3IgYWdlcyBieSBvdXIgaHVnZSB1bnJlYWRhYmxlIGxpc3Qgb2YgZGlyZWN0aXZlcy4KICAgICBTbyB3ZSBub3cgY2hhbmdlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhpcyB3YXk6CiAgICAgMS4gYC1MJyA9PiBgLVInIAogICAgICAgIEludGVudDogd2UgbmVlZCBgLUwnIHRvIGJlIGZyZWUsIGFuZCBgLVInIGZvciB0aGUgRFNPIHJ1bi10aW1lIHBhdGggaXMKICAgICAgICB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHBvcHVsYXIgbGlua2VyIG9wdGlvbi4KICAgICAyLiBgLWgnID0+IGAtTCcKICAgICAgICBJbnRlbnQ6IHdoaWxlIC1sIGdpdmVzIHRoZSBzbWFsbCBsaXN0IG9mIG1vZHVsZXMsIC1MIG5vdyBnaXZlcyB0aGUKICAgICAgICBsYXJnZSBsaXN0IG9mIGRpcmVjdGl2ZXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbW9kdWxlcy4gIFRoaXMgaXMgYWxzbwogICAgICAgIGNvbnNpc3RlbnQgd2l0aCAtdiAoc2hvcnQgdmVyc2lvbiBpbmZvKSBhbmQgLVYgKGxhcmdlIHZlcnNpb24gaW5mbykuCiAgICAgMy4gYC0/JyA9PiBgLWgnIAogICAgICAgIEludGVudDogaXQncyBub3cgdGhlIGV4cGVjdGVkIG9wdGlvbiA7LSkKICAgICBUaGUgbWFudWFsIHBhZ2Ugd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxNAoKICAqKSBGaXhlZCBwcm9ibGVtIG9mIGZjbG9zZSgpIG9uIGFuIHVub3BlbmVkIGZpbGUgaW4gc3VleGVjIGlmIExPR19FWEVDCiAgICAgd2Fzbid0IGRlZmluZWQuICBbUmljayBGcmFuY2h1ayA8cmlja2ZAdHJhbnNwZWN0Lm5ldD5dCgogICopIFJlbW92ZWQgcmVjZW50bHkgaW50cm9kdWNlZCBidWdzIGFuZCBkaXNmaWd1cmVtZW50cyBpbiBBUEFDSToKICAgICBvIGZpeGVkIGFyZ3VtZW50IGxpbmUgcHJvY2Vzc2luZzogdXNpbmcgJGFyZ3Mgd2FzIGJyb2tlbjogSXQgd2FzIG5vdAogICAgICAgaW5pdGlhbGl6ZWQgYW5kIHVzaW5nIGFyZ3M9IiRhcmdzICRhcGNfb3B0aW9uIiBhbmQgZXZlbiBhcmdzPSIkYXJncwogICAgICAgXCIkYXBjX29wdGlvblwiIiBmYWlscyBpbiB0aGUgc2Vjb25kIHByb2Nlc3Npbmcgcm91bmQgZm9yIGFueSBhcmd1bWVudHMKICAgICAgIGNvbnRhaW5pbmcgd2hpdGVzcGFjZXMuIFRoZSBvbmx5IGNvcnJlY3Qgd2F5IGlzIHRvIHVzZSB0aGUgY29uc3RydWN0CiAgICAgICAiJEAiIChidXQgbm90IHBvc3NpYmxlIGhlcmUpIG9yIGl0ZXJhdGUgX2JvdGhfIHRpbWVzIG92ZXIgdGhlIGltcGxpY2l0CiAgICAgICBhcmd1bWVudCBsaW5lIChubyBhcmd1bWVudCB0byBmb3ItbG9vcCkgd2hpY2ggaXMgd2hhdCB3ZSBub3cgdXNlLgogICAgIG8gbWFrZSAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0aGUgZGVmYXVsdCB3aXRob3V0IGNyZWF0aW5nCiAgICAgICByZWR1bmRhbmN5IChjb3B5aW5nIHRoZSAtLXdpdGgtbGF5b3V0IGJsb2NrIGluIHRoZSBhcmd1bWVudCBwYXJzaW5nCiAgICAgICBsb29wKS4gIFdlIGFjaGlldmUgdGhpcyBieSB1c2luZyB0aGUgIiRAIiBjb25zdHJ1Y3QgdG9nZXRoZXIgd2l0aCB0aGUKICAgICAgIGBzZXQnIGNvbW1hbmQgdG8gcHJlcGVuZCAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0byB0aGUgY29tbWFuZCBsaW5lIGluCiAgICAgICBjYXNlIC0td2l0aC1sYXlvdXQgaXMgbm90IHVzZWQuCiAgICAgbyBmaXhlZCBhdXRvLXN1ZmZpeCBoYW5kbGluZyBub3cgdGhhdCBjb25maWcubGF5b3V0IGV4aXN0cy4KICAgICAgIFBhdGhzIHdoaWNoIGFyZSBhdXRvLXN1ZmZpeGVkIGFyZSBtYXJrZWQgd2l0aCBhIHRyYWlsaW5nIHBsdXMgc2lnbiBpbgogICAgICAgY29uZmlnLmxheW91dCBhbmQgZXZlcnkgcGF0aCBub3cgY2FuIGJlIG1hcmtlZCB0aGlzIHdheSAobm90IG9ubHkgdGhlCiAgICAgICBmb3VyIHBhdGhzIGZvciB3aGljaCB3ZSBkbyBpdCBjdXJyZW50bHkpLiAgQWRkaXRpb25hbGx5IHRoZSBzdWZmaXggaXMKICAgICAgIG5vIGxvbmdlciBhIHN0YXRpYyBvbmUuIEluc3RlYWQgaXQncyBub3cgYC88dGFyZ2V0Picgd2hlcmUgPHRhcmdldD4gaXMKICAgICAgIHRoZSBhcmd1bWVudCBvZiB0aGUgLS10YXJnZXQgb3B0aW9uIG9yIHBlciBkZWZhdWx0IGBodHRwZCcuCiAgICAgbyBhbGxvdyBhbHNvIHRhYnMgKGFuZCBvbmx5IHNwYWNlcykgd2hlcmUgd2UgbWF0Y2ggd2hpdGVzcGFjZXMKICAgICBvIHZhcmlvdXMgZml4ZXMgYW5kIGNsZWFudXBzIHJlbGF0ZWQgdG8gdXNlZCBzaGVsbCBjb2Rpbmcgc3R5bGUKICAgICBvIG1hZGUgSmltIGhhcHB5IGJ5IHJlcGxhY2luZyBgV3JpdHRlbiBieScgd2l0aCBgSW5pdGlhbGx5IHdyaXR0ZW4gYnknIDstKQogICAgIG8gdHJpbW1lZCBvdXRwdXQgb2YgLS1oZWxwIHRvIGZpdCBpbnRvIDgwIGNvbHVtbnMKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdHdvIG5ldyBjb3JlIEFQSSBmdW5jdGlvbnMsIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKCkgYW5kCiAgICAgYXBfc2luZ2xlX21vZHVsZV9pbml0KCksIHdoaWNoIGFyZSBub3cgdXNlZCBieSBtb2Rfc28gdG8gY29uZmlndXJlIGEgbW9kdWxlCiAgICAgYWZ0ZXIgbG9hZGluZy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCBkZWZpbmVzIGZvciBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgYW5kCiAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHRvIE5ldEJTRC9PcGVuQlNEIHNlY3Rpb24KICAgICBvZiBhcF9jb25maWcuaCB0byBhbGxvdyBzZXJpYWxpemVkIGFjY2VwdCBmb3IgbXVsdGlwb3J0IGxpc3RlbnMuCiAgICAgW1JveSBGaWVsZGluZywgQ3VydCBTYW1wc29uXSBQUiMzMTIwCgogICopIFBPUlQ6IEZpeGVkIGEgbWlzcGxhY2VkICNlbmRpZiBmb3IgTmV0QlNEL09wZW5CU0Qgc2VjdGlvbgogICAgIG9mIGFwX2NvbmZpZy5oIHRoYXQgd291bGQgc2tpcCBzZXZlcmFsIGRlZmluZXMgaWYgREVGQVVMVF9HUk9VUAogICAgIHdhcyBvdmVycmlkZGVuLiBbUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBUaGUgSTg2IHZlcnNpb24gb2YgREdVWCBoYXMgc3VwcG9ydCBmb3Igc3RybmNhc2VjbXAgYW5kIAogICAgIHN0cmNhc2VjbXAsIHNvIGFsbG93IGl0IGluIGFwX2NvbmZpZy5oLiBbQW1pZWwgTGVlIFllZV0gUFIjMzI0NwoKICAqKSBGaXggb3JkZXJpbmcgb2YgZGVmaW5pdGlvbnMgaW4gYXBfY29uZmlnLmggc28gdGhhdCBhcF9pbmxpbmUgaXMKICAgICBkZWZpbmVkIGJlZm9yZSBpdCBtaWdodCBiZSB1c2VkLiBbVmljdG9yIEtoaW1lbmtvXQoKICAqKSBQT1JUOiBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIEJTREkgKHY0LjApLgogICAgIFtUb20gU2Vya293c2tpIDx0a3NAYnNkaS5jb20+XSBQUiMzNDUzCgogICopIE1ha2UgZ2VuZXJhdGlvbiBvZiBzcmMvQ29uZmlndXJhdGlvbi5hcGFjaSBtb3JlIHJvYnVzdDogSXQgZmFpbGVkIHRvCiAgICAgZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIG1vZHVsZXMgd2hlbiBvbmUgbW9kdWxlIG5hbWUgd2FzIGEgcG9zdGZpeCBvZgogICAgIGFub3RoZXIgKGUuZy4gY2dpIHZzLiBmYXN0Y2dpKS4gV2Ugbm93IGNoZWNrIGZvciBtb2RfWFhYLCBsaWJYWFggYW5kIGV2ZW4KICAgICBqdXN0IFhYWCAodGhpbmsgYWJvdXQgdG90YWxseSBub24tc3RhbmRhcmQgbmFtZXMgbGlrZSAiYXBhY2hlX3NzbCIsIHRvbykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMzODAKCiAgKikgSW4gc3JjL0NvbmZpZ3VyZSByZW1vdmUgdGhlIFNFUlZFUl9TVUJWRVJTSU9OIHN1cHBvcnQgKGFscmVhZHkgZGVwcmVjYXRlZAogICAgIHNpbmNlIDEuM2I3KSBhbmQgbWFrZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIG1vcmUgcm9idXN0IChpdCBmYWlsZWQgaG9ycmlibGUKICAgICB3aGVuIHdoaXRlc3BhY2VzIHdlcmUgcHJlc2VudCBpbiB0aGUgYXJndW1lbnRzIG9mIC1EIG9wdGlvbnMpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMjQwCgogICopIEFkZCBBUEFDSSAtLXNoYWRvdz1ESVIgdmFyaWFudCAoaW4gYWRkaXRpb24gdG8gLS1zaGFkb3cpLiBUaGlzIG5vdyBmaXJzdAogICAgIGNyZWF0ZXMgYW4gZXh0ZXJuYWwgcGFja2FnZSBzaGFkb3cgdHJlZSBpbiBESVIgYmVmb3JlIHRoZSBsb2NhbCBidWlsZAogICAgIHNoYWRvdyB0cmVlIGlzIGdlbmVyYXRlZCB1bmRlciBESVIuIFRoaXMgd2F5IG9uZSBjYW4gaGF2ZSB0aGUgZXh0cmFjdGVkCiAgICAgQXBhY2hlIGRpc3RyaWJ1dGlvbiB0cmVlIHJlYWQtb25seSBvbiBORlMgb3IgQ0RST00gYW5kIHN0aWxsIGJ1aWxkIEFwYWNoZQogICAgIGZyb20gdGhlc2Ugc291cmNlcy4gQW4gYXV0b21hdGljYWxseSB0cmlnZ2VyZWQgVlBBVEgtbGlrZSBtZWNoYW5pc20gaXMKICAgICBwcm92aWRlZCB0aHJvdWdoIHRoZSBUT1AgdmFyaWFibGUsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXpAYXBwbGUuY29tPl0KCiAgKikgRml4IG5lZ290aWF0aW9uIHNvIHRoYXQgYSBWYXJ5IHJlc3BvbnNlIGhlYWRlciBpcyBjb3JyZWN0bHkgCiAgICAgZ2VuZXJhdGVkIHdoZW4sIGZvciBhIHBhcnRpY3VsYXIgZGltZW5zaW9uLCB2YXJpYW50cyBvbmx5IHZhcnkKICAgICBpbiBoYXZpbmcgb3Igbm90IGhhdmluZyBhIHZhbHVlIGZvciB0aGF0IGRpbWVuc2lvbi4gW1BhdWwgU3V0dG9uXQoKICAqKSBGaXggbmVnb3RpYXRpb24gc28gdGhhdCB3ZSBwcmVmZXIgYW4gZW5jb2RlZCB2YXJpYW50IG92ZXIgYW4KICAgICB1bmVuY29kZWQgdmFyaWFudCBpZiB0aGUgdXNlci1hZ2VudCBleHBsaWNpdGx5IHNheXMgaXQgY2FuCiAgICAgYWNjZXB0IHRoYXQgZW5jb2RpbmcuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHByZWZlcnJlZCB0aGUgdW5lbmNvZGVkCiAgICAgdmFyaWFudC4KICAgICBbUGF1bCBBdXNiZWNrIDxwYXVsYUBhbHVtbmkuY3NlLnVjc2MuZWR1PiwgUGF1bCBTdXR0b25dIFBSIzM0NDcKIAogICopIEZpeCBBUFhTIHRvb2w6IHF1ZXJ5IHZhcmlhYmxlcyBMSUJTX1NITElCIGFuZCBUQVJHRVQgd2VyZSBub3QgcmVjb2duaXplZAogICAgIGFuZCB0aGUgdXNhZ2UgcGFnZSB3YXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgYW5kIG1hbnBhZ2UuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IHNwZWNpYWwgb3B0aW9ucyAtV2MseHh4IGFuZCAtV2wseHh4IG9uIEFQWFMgY29tcGlsZS9saW5rIGNvbW1hbmQuCiAgICAgVGhleSBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgYW5kIHRoZWlyIGFyZ3VtZW50cyAoYHh4eCcpIGFyZSBwYXNzZWQgQVMKICAgICBJUyB0byB0aGUgY29tcGlsZXIvbGlua2VyIGNvbW1hbmQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgcG9zc2libGUgKGJ1dCBoYXJtbGVzcyBpbiBwcmFjdGljZSkgYnVnIGluIHRoZSBEQk0gbG9va3VwCiAgICAgcHJvY2VkdXJlIG9mIG1vZF9yZXdyaXRlOiB2ZXJ5IGxvbmcga2V5cyB3ZXJlIHRydW5jYXRlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgYSBnZW5lcmljIC0td2l0aC1sYXlvdXQ9W0ZJTEU6XUlEIG9wdGlvbi4gSUQgaGVyZSBpcyBhIGxheW91dAogICAgIGlkZW50aWZpZXIsIGN1cnJlbnRseSAiQXBhY2hlIiBhbmQgIkdOVSIgYXJlIHByZS1kZWZpbmVkIGluIHRoZSBmaWxlCiAgICAgY29uZmlnLmxheW91dC4gIEN1c3RvbSBsYXlvdXRzIGFyZSBwb3NzaWJsZSBieSB1c2luZyBGSUxFOklEIGFzIHRoZQogICAgIGFyZ3VtZW50IHdoZXJlIHRoZSBsYXlvdXQgSUQgaXMgdGFrZW4gZnJvbSBGSUxFLgoKICAgICBUaGUgY29uZmlnLmxheW91dCBmaWxlIGNvbnNpc3RzIG9mIDxMYXlvdXQgSUQ+Li48L0xheW91dD4gc2VjdGlvbnMKICAgICB3aGVyZSBpbnNpZGUgdGhvc2Ugc2VjdGlvbnMgInBhdGhfdmFyaWFibGU6IHBhdGhfdmFsdWUiIHBhaXJzIGNhbiBiZQogICAgIHNwZWNpZmllZC4gVGhlc2UgbGluZXMgYXJlIGNvbnZlcnRlZCB0byBwYXRoX3ZhcmlhYmxlPSdwYXRoX3ZhbHVlJy4KCiAgKikgQWRkIGEgRGVmYXVsdExhbmd1YWdlIGRpcmVjdGl2ZSBzbyB0aGF0IGZpbGVzIG1pc3NpbmcgYSBsYW5ndWFnZQogICAgIGV4dGVuc2lvbiAoZS5nLiwgLmZyLCAuZGUpIGNhbiBiZSBsYWJlbGxlZCBhcyBiZWluZyBzb21lIG90aGVyCiAgICAgZGVmYXVsdCBsYW5ndWFnZS4gRGVmYXVsdExhbmd1YWdlIGNhbiBhcHBlYXIgaW4gPERpcmVjdG9yeT4gYW5kIAogICAgIDxGaWxlcz4gY29udGFpbmVycyBhcyB3ZWxsIGFzIC5odGFjY2VzcyBmaWxlcy4gIFtQYXVsIFN1dHRvbl0KICAgICBQUiMxMTgwCgogICopIEZpeCBUQVJHRVQgY29uZmlndXJhdGlvbiB3aGVuIGNvbmZpZ3VyaW5nIGFuZCBpbnN0YWxsaW5nIHVzaW5nCiAgICAgQVBBQ0kgY29uZmlndXJlLiBUQVJHRVQgbm93IGRlZmluZXMgdGhlIGJhc2VuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uCiAgICAgZmlsZSwgc3RhcnR1cCBzY3JpcHQsIG1hbnVhbCBwYWdlLCBldGMuIGxvZ19lcnJvcl9jb3JlKCkgbm93IHJlcG9ydHMKICAgICB0aGUgc2VydmVyIGJpbmFyeSBuYW1lIGdpdmVuIGJ5IGFyZ3ZbMF0uIFRBUkdFVCBjYW4gbm93IGFsc28gYmUgZGVmaW5lZAogICAgIHdpdGggLS10YXJnZXQ9VEFSR0VUIHBhcmFtZXRlciBwYXNzZWQgdG8gQVBBQ0kgY29uZmlndXJlLgogICAgIFtSYWxmIEVuZ2Vsc2NoYWxsLCBSYW5keSBUZXJidXNoXQoKICAqKSBtb2RfaW5jbHVkZS5jOmhhbmRsZV9wZXJsKCkgbm93IHByb3Blcmx5IHRlc3RzIGZvciBPUFRfSU5DTk9FWEVDCiAgICAgcmF0aGVyIHRoYW4gT1BUX0lOQ0xVREVTIFtSYWluZXIgU2Nob2VwZiA8c2Nob2VwZkB1bmktbWFpbnouZGU+XQoKICAqKSBhcF9tZDVfYmluYXJ5KCkgd2FzIHVzaW5nIHNwcmludGYoKSByYXRoZXIgdGhhbiBhIHRhYmxlIGxvb2t1cAogICAgIHRvIGNvbnZlcnQgYmluYXJ5IGJ5dGVzIHRvIGhleCBkaWdpdHMuCiAgICAgW1JvbmFsZCBUc2NoYWzkciA8cm9uYWxkQGlubm92YXRpb24uY2g+XSBQUiMzNDA5CgogICopIEZpeCBTRUdWIGluIFRDTiBuZWdvdGlhdGlvbiBpZiBubyB2YXJpYW50cyBhcmUgYWNjZXB0YWJsZS4KICAgICBbTWFydGluIFBsZWNoc21pZCA8cGxlY2hzbWlAa2FybGluLm1mZi5jdW5pLmN6Pl0gUFIjMTk4NwoKICAqKSBBUEk6IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCkgZnVuY3Rpb24gaXMgbm93ICJwdWJsaWMiIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEZpeCBkb2N1bWVudGF0aW9uIG9mIGBBY3Rpb24nIGRpcmVjdGl2ZTogSXQgY2FuIGFjdGl2YXRlIGEgQ0dJIHNjcmlwdAogICAgIHdoZW4gZWl0aGVyIGEgaGFuZGxlciBvciBhIE1JTUUgY29udGVudCB0eXBlIGlzIHRyaWdnZXJlZCBieSB0aGUgcmVxdWVzdC4KICAgICBbQW5kcmV3IFBpbWxvdHQgPHBpbWxvdHRAbWF0aC5oYXJ2YXJkLmVkdT5dIFBSIzMzNDAKCiAgKikgRG9jdW1lbnQgdGhlIGBhZGQnIGNvbW1hbmQgb2YgYGRibW1hbmFnZScgaW4gYGRibW1hbmFnZS4xJyBtYW5wYWdlLgogICAgIFtEYXZpZCBNYWNLZW56aWUgPGRqbUB1dS5uZXQ+XSBQUiMzMzk0CgogICopIElnbm9yZSBhICJFcnJvckRvY3VtZW50IDQwMSIgZGlyZWN0aXZlIHdpdGggYSBmdWxsIFVSTCBhbmQgd3JpdGUgYQogICAgIG5vdGljZSB0byB0aGUgZXJyb3IgbG9nLiBJdCBpcyBub3QgcG9zc2libGUgdG8gc2VuZCBhIDQwMSByZXNwb25zZQogICAgIGFuZCBhIHJlZGlyZWN0IGF0IHRoZSBzYW1lIHRpbWUuICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBGYWxsYmFjayB0byBuYXRpdmUgY29tcGlsZXJzIGZvciBJUklYLTMyIHBsYXRmb3JtLiBJdCBzZWVtcyB0aGF0CiAgICAgYSBnY2MgMi44LjEgY29tcGlsZWQgYXBhY2hlIGlzIGxvZ2dpbmcgY2xpZW50IGFkZHJlc3NlcyB3aXRoIGFsbAogICAgIGJpdHMgc2V0ICgyNTUuMjU1LjI1NS4yNTUpLiBUaGlzIGlzIHRoZSBzZWNvbmQgc3VjaCBwcm9ibGVtIGNhdXNlZAogICAgIGJ5IGdjYyAyLjguMSBjb21waWxlci4gVGhlIGZpcnN0IGJlaW5nIGJyb2tlbiBzZW1hcGhvcmUgbG9ja2luZy4KICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgVXBkYXRlZCBtaW1lLnR5cGVzIHRvIHJlZmxlY3QgY3VycmVudCBJbnRlcm5ldCBtZWRpYSB0eXBlcwogICAgIGFuZCBpbmNsdWRlIGEgVVJMIHRvIHRoZSByZWdpc3RyeS4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBSb3kgRmllbGRpbmddIFBSIzIzODAsIDIyODYsIDIyNDYKCiAgKikgU0VDVVJJVFk6IERvIGEgbW9yZSBjb21wbGV0ZSBjaGVjayBpbiBtb2RfaW5jbHVkZSB0byBhdm9pZCAKICAgICBhbiBpbmZpbml0ZSBsb29wIG9mIHJlY3Vyc2l2ZSBTU0kgaW5jbHVkZXMuICBbTWFyYyBTbGVta29dIFBSIzMzMjMKCiAgKikgQWRkIEFQQUNJIC0tc3VleGVjLWRvY3Jvb3QgYW5kIC0tc3VleGVjLWxvZ2ZpbGUgb3B0aW9ucyB3aGljaCBjYW4gYmUKICAgICB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgKERPQ19ST09UKSBhbmQgdGhlIHN1ZXhlYwogICAgIGxvZ2ZpbGUgKExPR19FWEVDKSwgcmVzcGVjdGl2ZWx5LiBBZGRpdGlvbmFsbHkgdGhlIC0tbGF5b3V0IG9wdGlvbgogICAgIHdhcyBjaGFuZ2VkIHRvIHNob3cgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VFWEVDIHNldHVwLgogICAgIFtMYXJzIEVpbGVicmVjaHRdIFBSIzMzMTYsIDMzNTcsIDMzNjEKCiAgKikgQWRkZWQgdGhlIGxhc3QgdHdvIFdlYkRBViBzdGF0dXMgY29kZXMgb2YgNDI0IChGYWlsZWQgRGVwZW5kZW5jeSkKICAgICBhbmQgNTA3IChJbnN1ZmZpY2llbnQgU3RvcmFnZSkgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEVuYWJsZWQgYWxsIG9mIHRoZSBXZWJEQVYgbWV0aG9kIG5hbWVzIGZvciB1c2UgYnkgdGhpcmQtcGFydHkKICAgICBtb2R1bGVzLCBMaW1pdCwgYW5kIFNjcmlwdCBkaXJlY3RpdmVzLiAgVGhhdCBpbmNsdWRlcyBQQVRDSCwKICAgICBQUk9QRklORCwgUFJPUFBBVENILCBNS0NPTCwgQ09QWSwgTU9WRSwgTE9DSywgYW5kIFVOTE9DSy4KICAgICBJbXByb3ZlZCBtb2RfYWN0aW9ucy5jIHNvIHRoYXQgaXQgY2FuIHVzZSBhbnkgb2YgdGhlIG1ldGhvZHMKICAgICBkZWZpbmVkIGluIGh0dHBkLmguICBBZGRlZCBhcF9tZXRob2RfbnVtYmVyX29mKG1ldGhvZCkgZm9yCiAgICAgZ2V0dGluZyB0aGUgaW50ZXJuYWwgbWV0aG9kIG51bWJlci4gIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIFRQRiBPUy4gW0pvZSBNb2VuaWNoIDxtb2VuaWNoQHVzLmlibS5jb20+IGFuZAogICAgIG90aGVycyBhdCBJQk1dCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIGhhbmRsaW5nIG9mIFVOQyBuYW1lcyAoZS5nLiwgXFxob3N0XHBhdGgpCiAgICAgb24gV2luMzIuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnpAdXMuaWJtLmNvbT5dCgogICopIFJld29yayBvc19jYW5vbmljYWxfKigpIG9uIFdpbjMyIHNvIGl0J3Mgc2ltcGxlciwgbW9yZQogICAgIHJvYnVzdCwgYW5kIHdvcmtzLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6QHVzLmlibS5jb20+XQogICAgIFBSIzI1NTUsIDI5MTUsIDMwNjQsIDMyMzIKCiAgKikgV29yayBhcm91bmQgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJmdGltZSBvbiBXaW4zMi4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBLZW4gUGFyenlnbmF0IDxrcGFyekB1cy5pYm0uY29tPl0KCiAgKikgTW92ZSBhIHR5cGVkZWYgdG8gZml4IGNvbXBpbGUgcHJvYmxlbXMgb24gTGludXggd2l0aCAxLngga2VybmVscy4KICAgICBbTWFub2ogS2FzaWNoYWludWxhXSBQUiMzMTc3CgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIENvbmN1cnJlbnQgUG93ZXJNQVggT1MuIFtUb20gSG9yc2xleQogICAgIDxUb20uSG9yc2xleUBtYWlsLmNjdXIuY29tPl0KCiAgKikgV0lOMzI6IExvZyBtb3JlIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2VzIGlmIHNwYXduaW5nIGFuIGludGVycHJldGVkIAogICAgIHNjcmlwdCBmYWlsZWQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gYXR0ZW1wdCB0byBleGVjdXRlIAogICAgIHRoZSBpbnRlcnByZXRlciBhbmQgdGhlIFdpbjMyIGVycm9yIGNvZGUgcmV0dXJuZWQuICBbTWFyYyBTbGVta29dCgogICopIERpc2FibGUgc2VuZGluZyBvZiBlcnJvci1ub3RlcyBvbiBhIDUwMCAoSW50ZXJuYWwgU2VydmVyIEVycm9yKSByZXNwb25zZQogICAgIHNpbmNlIGl0IG9mdGVuIGluY2x1ZGVzIGZpbGUgcGF0aCBpbmZvLiAgRW5hYmxlIHNlbmRpbmcgb2YgZXJyb3Itbm90ZXMKICAgICBvbiBhIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkuICBbUm95IEZpZWxkaW5nXSBQUiMzMTczCgogICopIGh0dHBfY29uZmlnLmMgd291bGQgcmVzcG9uZCB3aXRoIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkgaWYgYQogICAgIGNvbnRlbnQgdHlwZSBoYW5kbGVyIHdhcyBzcGVjaWZpZWQgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCwgd2hpY2gKICAgICBzaG91bGQgaGF2ZSBiZWVuIGEgNTAwIHJlc3BvbnNlLiAgTGlrZXdpc2UsIG1vZF9wcm94eS5jIHdvdWxkIHJlc3BvbnNkCiAgICAgd2l0aCBhIDUwMSBpZiB0aGUgVVJJIHNjaGVtZSBpcyB1bnJlY29nbml6ZWQgaW5zdGVhZCBvZiB0aGUgY29ycmVjdAogICAgIHJlc3BvbnNlIG9mIDQwMyAoRm9yYmlkZGVuKS4gIFtSb3kgRmllbGRpbmddCgogICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgRG9TIGF0dGFjayB3aGVuIGEgYmFkIFVSSSBwYXRoIGNvbnRhaW5zIHdoYXQKICAgICBsb29rcyBsaWtlIGEgcHJpbnRmIGZvcm1hdCBlc2NhcGUuICBbTWFyYyBTbGVta28sIFN0dWRlbnRlbiBOZXQgVHdlbnRlXQoKICAqKSBGaXggaW4gbW9kX2F1dG9pbmRleDogZm9yIGZpbGVzIHdoZXJlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgc3RhbXAgd2FzCiAgICAgdW5hdmFpbGFibGUsIGFuIGVtcHR5IHN0cmluZyB3YXMgcHJpbnRlZCB3aGljaCB3YXMgMiBieXRlcyBzaG9ydC4KICAgICBUaGUgc2l6ZSBhbmQgZGVzY3JpcHRpb24gY29sdW1ucyB3ZXJlIHRoZXJlZm9yZSBub3QgYWxpZ25lZCBjb3JyZWN0bHkuCiAgICAgW01hcnRpbiBLcmFlbWVyXSAobm8gUFIjKQoKICAqKSBVcGRhdGUgQlMyMDAwIE9TIGNvZGUgdG8gd29yayB3aXRoIHJlY2VudCB2ZXJzaW9ucy4gU3RhcnRpbmcgd2l0aAogICAgIHJlbGVhc2UgQTE3LCB0aGUgY2hpbGQgZm9yaygpIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBfcmZvcmsoKS4KICAgICAoQlMyMDAwIG9ubHkpIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQWRkIHRoZSBhY3R1YWwgc2VydmVyX3JlYyBzdHJ1Y3R1cmUgb2YgdGhlIHNwZWNpZmljIFZob3N0IHRvIHRoZQogICAgIHNjb3JlYm9hcmQgZmlsZSBhbmQgYXZvaWQgYSBzdHJpbmcgY29weSAoYXMgd2VsbCBhcyBhbGxvdyBzb21lCiAgICAgZnVydGhlciBmdXR1cmUgZW5oYW5jZW1lbnRzKS4gW0hhcnJpZSBIYXpld2lua2VsCiAgICAgPGhhcnJpZS5oYXpld2lua2VsQGpyYy5pdD5dCgogICopIEFkZCBBUEFDSSAtLXBlcm11dGUtbW9kdWxlPWZvbzpiYXIgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvCiAgICAgb24tdGhlLWZseS9iYXRjaCBwZXJtdXRlIHRoZSBvcmRlciBvZiB0d28gbW9kdWxlcyAobW9kX2ZvbyBhbmQgbW9kX2JhcikKICAgICBpbiB0aGUgQ29uZmlndXJhdGlvblsuYXBhY2ldIGZpbGUuIFR3byBzcGVjaWFsIGFuZCBpbXBvcnRhbnQgdmFyaWFudHMgYXJlCiAgICAgc3VwcG9ydGVkIGZvciB0aGUgb3B0aW9uIGFyZ3VtZW50OiBmaXJzdCBCRUdJTjpmb28gd2hpY2ggcGVybXV0ZXMgbW9kdWxlCiAgICAgbW9kX2ZvbyB3aXRoIHRoZSBiZWdpbiBvZiB0aGUgbW9kdWxlIGxpc3QsIGkuZS4gaXQgYG1vdmVzJyB0aGUgbW9kdWxlIHRvCiAgICAgdGhlIGJlZ2luIG9mIHRoZSBsaXN0IChnaXZlcyBpdCBsb3dlc3QgcHJpb3JpdHkpLiAgQW5kIHNlY29uZCBmb286RU5ECiAgICAgd2hpY2ggcGVybXV0ZXMgbW9kX2ZvbyB3aXRoIHRoZSBlbmQgb2YgdGhlIG1vZHVsZSBsaXN0LCBpLmUuIGl0IGBtb3ZlcycKICAgICB0aGUgbW9kdWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGdpdmVzIGl0IGhpZ2hlc3QgcHJpb3JpdHkpLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHByb2JsZW0gd2l0aCAnYXBhY2hlIC1rIHNodXRkb3duJyBhbmQgc3RhcnR1cCBldmVudAogICAgIHN5bmNocm9uaXNhdGlvbiAoV2luMzIpLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6QHJhbGVpZ2guaWJtLmNvbT5dCiAgICAgUFIjMzI1NQoKICAqKSBUaGUgY29uZmlnIHBhcnNlciB3YXNuJ3QgY29ycmVjdGx5IG5vdGljaW5nIGEgbWlzc2luZyAnPicKICAgICBvbiBjb250YWluZXIgc3RhcnQgbGluZXMgKGUuZy4sIGl0IHdvdWxkbid0IHNwb3QKICAgICAiPERpcmVjdG9yeSAvIiBhcyBhIHN5bnRheCBlcnJvcikuICBbUnlhbiBCbG9vbSA8cmJibG9vbUB1cy5pYm0uY29tPl0KICAgICBQUiMzMjc5CgogICopIEFkZCBhICdSZW1vdmVIYW5kbGVyJyBkaXJlY3RpdmUgd2hpY2ggd2lsbCBzZWxlY3RpdmVseSByZW1vdmUKICAgICBhbGwgaGFuZGxlciBhc3NvY2lhdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBleHRlbnNpb25zLgogICAgIFtSeWFuIEJsb29tIDxyYmJsb29tQHVzLmlibS5jb20+XSBQUiMxNzk5LgoKICAqKSBQcm9wZXJseSBoYW5kbGUgJiBhbGxvdyAibnVsIiBhbmQgIi4qL251bGwiIGluIEFjY2Vzc0NvbmZpZyBhbmQKICAgICBSZXNvdXJjZUNvbmZpZyBkaXJlY3RpdmVzIG9uIFdpbjMyLiAgQWxzbyBhZGQgYSBub3RlIHRvIHRoZSBlZmZlY3QKICAgICBvZiAndXNlbGVzcyBVc2VyIGRpcmVjdGl2ZSBpZ25vcmVkIG9uIFdpbjMyJyB0byB0aGUgZXJyb3Jsb2cgaWYKICAgICBhIFVzZXIgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyekByYWxlaWdoLmlibS5jb20+XSBQUiMyMDc4LCAyMzAzLgoKICAqKSBGaXggbXVsdGlwbGUgd2hpdGVzcGFjZSBoYW5kbGluZyBpbiBpbWFnZW1hcHMgZm9yIG1vZF9pbWFwIHdoaWNoIHdhcwogICAgIGJyb2tlbiBzaW5jZSBBcGFjaGUgMS4zLjEgd2hlcmUgd2UgdG9vayBvdXQgY29tcHJlc3Npbmcgb2YgbXVsdGlwbGUKICAgICBzcGFjZXMgaW4gYXBfY2ZnX2dldGxpbmUoKS4KICAgICBbSXZhbiBSaWNod2Fsc2tpIDxpdmFuQHNlcHB1a3UubmV0Pl0gUFIjMzI0OQoKICAqKSBGaXggQmVya2VsZXktREIvMi54IHN1cHBvcnQgaW4gbW9kX2F1dGhfZGI6IFRoZSBkYXRhIHN0cnVjdHVyZXMgd2VyZSBub3QKICAgICBpbml0aWFsaXplZCBjb3JyZWN0bHkgYW5kIHRoZSBkYl9vcGVuKCkgY2FsbCB1c2VkIGFuIGludmFsaWQgbW9kZQogICAgIHBhcmFtZXRlci4gW1JvbiBLbGF0Y2hrbyA8cm9uQGNrbS51Y3NmLmVkdT5dIFBSIzMxNzEKCiAgKikgUE9SVDogRFNPIHN1cHBvcnQgZm9yIFVuaXhXYXJlIDcKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUm9uIFJlY29yZCA8cnJAc2NvLmNvbT5dCgogICopIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0aGUge3NybSxhY2Nlc3N9LmNvbmYtZGlzdCogZmlsZXMgaW50byB0aGUKICAgICBodHRwZC5jb25mLWRpc3QqIGZpbGVzLiAgVGhlIHNybSBhbmQgYWNjZXNzIGZpbGVzIG5vdyBjb250YWluCiAgICAgb25seSBjb21tZW50cywgYW5kIGh0dHBkLmNvbmYgaGFzIGFsbCB0aGUgY29tYmluZWQgY29udGVudHMgaW4KICAgICBhIHJhdGlvbmFsIG9yZGVyLiAgW0tlbiBDb2FyXQoKICAqKSBQT1JUOiBEU08vRUxGIHN1cHBvcnQgZm9yIEZyZWVCU0QgMy4wLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBEaXJrIEZyb2VtYmVyZyA8aWJleEBwaHlzaWsuVFUtQmVybGluLkRFPl0KICAKICAqKSBBZGQgYSAiZGVmYXVsdC1oYW5kbGVyIiBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIGRlZmF1bHRfaGFuZGVyKCkKICAgICBmdW5jdGlvbiB3aGljaCBpcyBub3JtYWxseSBjYWxsZWQgZm9yIHN0YXRpYyBjb250ZW50LiAgVGhpcyBhbGxvd3MKICAgICB5b3UgdG8gb3ZlcnJpZGUgYSBzcGVjaWZpYyBoYW5kbGVyLiAgW01hcmMgU2xlbWtvXQoKICAqKSBGdXJ0aGVyIHNpbXBsaWZ5IGNoZWNraW5nIGZvciBhYnNvbHV0ZSBwYXRocyBieSByZXBsYWNpbmcgYW4KICAgICBoYXJkLWNvZGVkIHN5bnRheCBjaGVjayB3aXRoIGEgY2FsbCB0byBhIHJvdXRpbmUgd2UgYWxyZWFkeSBjcmVhdGVkIHRvCiAgICAgZG8gdGhpcy4gIFtLZW4gUGFyenlnbmF0IDxrcGFyekByYWxlaWdoLmlibS5jb20+XSBQUiMyOTc2LCAzMDc0CgogICopIExvZyBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYSBtYWxmb3JtZWQgInJlcXVpcmUiIGRpcmVjdGl2ZSAKICAgICBpbiBtb2RfYXV0aCBpZiB3ZSBrbm93IHRoYXQgd2Uga25vdyB0aGF0IG5vIG90aGVyIG1vZHVsZSBjYW4KICAgICBkZWFsIHdpdGggaXQuICBbTWFyYyBTbGVta29dCgogICopIFJlbW92ZSBhcF9wcml2YXRlX2V4dGVybiBtZXRob2Qgb2YgaGlkaW5nIGNvbmZsaWN0aW5nIHN5bWJvbHMKICAgICBvbiB0aGUgTkVYVCBwbGF0Zm9ybSBiZWNhdXNlIGl0IGlzIG5vdCBjb3JyZWN0IGZvciBhbGwgdmVyc2lvbnMsCiAgICAgYW5kIHRoZSB2ZXJzaW9ucyBmb3Igd2hpY2ggaXQgaXMgY29ycmVjdCBhcmUgdW5rbm93bi4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXpAYXBwbGUuY29tPl0KCiAgKikgRml4IGluaGVyaXRhbmNlIG9mIEluZGV4T3B0aW9ucyBOYW1lV2lkdGggYW5kIHJlbW92ZSB1bmludGVuZGVkCiAgICAgcmVzdHJpY3Rpb24gb24gK05hbWVXaWR0aCwgK0ljb25IZWlnaHQsIGFuZCArSWNvbldpZHRoLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2luZyBmb3IgY2FzZXMgaW4gd2hpY2ggYSA1MDAgZXJyb3IKICAgICBpcyBlbmNvdW50ZXJlZCBpbiBhbiAuaHRhY2Nlc3MgZmlsZSBzb21ld2hlcmUgZG93biB0aGUgdHJlZS4KICAgICBbS2VuIENvYXJdICBQUiMyNDA5CgogICopIE1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHRvIGFwX2VzY2FwZV9odG1sKCkuIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBpbiBtb2RfcHJveHkgd2hlbiBhIHJlc3BvbnNlIGlzCiAgICAgbm9uLWNhY2hhYmxlLiAgW1JveSBGaWVsZGluZywgdHJhY2VkIGJ5IERvdWcgQmxvZWJhdW1dLiBQUiMyOTUwLCAzMDU2CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4zCgogICopIEFkZGVkIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEV4cGVjdCBoZWFkZXIgZmllbGQgYXMKICAgICBzcGVjaWZpZWQgaW4gcmV2LTA1IG9mIEhUVFAvMS4xLiAgRGlzYWJsZWQgdGhlIDEwMCBDb250aW51ZQogICAgIHJlc3BvbnNlIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoZSBmaW5hbCBzdGF0dXMsIHdoaWNoIGlzIG1pZ2h0eQogICAgIHVzZWZ1bCBmb3IgUFVUIHJlc3BvbnNlcyB0aGF0IHJlc3VsdCBpbiAzMDIgb3IgNDAxLiBbUm95IEZpZWxkaW5nXQoKICAqKSBSZW1vdmUgZXh0cmEgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBnZXRsaW5lIHJlc3VsdHMgYXMgcGFydAogICAgIG9mIHRoZSBwcm90b2NvbCBwcm9jZXNzaW5nLCB3aGljaCBpcyBleHRyYSBuaWNlIGJlY2F1c2UgaXQgd29ya3MKICAgICBiZXR3ZWVuIGNvbnRpbnVhdGlvbiBsaW5lcywgaXMgYWxtb3N0IG5vIGNvc3QgaW4gdGhlIG5vcm1hbCBjYXNlCiAgICAgb2Ygbm8gZXh0cmEgd2hpdGVzcGFjZSwgYW5kIHNhdmVzIG1lbW9yeS4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgbmV3IEhUVFAgc3RhdHVzIGNvZGVzIGFuZCBkZWZhdWx0IHJlc3BvbnNlIGJvZGllcyBmcm9tIHRoZQogICAgIHJldmlzZWQgSFRUUC8xLjEgKDMwNywgNDE2LCA0MTcpLCBXZWJEQVYgKDEwMiwgMjA3LCA0MjIsIDQyMyksIGFuZCAKICAgICBIVFRQIEV4dGVuc2lvbiBGcmFtZXdvcmsgKDUxMCkgc3BlY2lmaWNhdGlvbnMuICBEaWQgbm90IGFkZCB0aGUKICAgICBXZWJEQVYgNDI0IGFuZCA0MjUgY29kZXMgYmVjYXVzZSB0aGV5IGFyZSBib2d1cy4gIFdlIGRvbid0IHVzZSBhbnkKICAgICBvZiB0aGVzZSBjb2RlcyB5ZXQsIGJ1dCB0aGV5IGFyZSBub3cgYXZhaWxhYmxlIHRvIDNyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gdGltZWQtb3V0IHJlcXVlc3RzIGFuZCB0aGUKICAgICBhcF9iaGFsZmR1cGxleCBzZWxlY3QgdGhhdCBtaWdodCByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcCBvbgogICAgIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCB2YWxpZGF0ZSB0aGUgZGVzY3JpcHRvci4gW1JveSBGaWVsZGluZ10KCiAgKikgV0lOMzI6IEFkZCAiLWsgc2h1dGRvd24iIGFuZCAiLWsgcmVzdGFydCIgb3B0aW9ucyB0byBzaWduYWwgYQogICAgIHJ1bm5pbmcgQXBhY2hlIHNlcnZlciBbUGF1bCBTdXR0b25dCgogICopIEZpeCBtb2RfYXV0b2luZGV4IGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBnb3QgYSBzaXplIG9mICIwayIgaW5zdGVhZAogICAgIG9mICItIi4gIFtNYXJ0aW4gUGxlY2hzbWlkIDxwbGVjaHNtaUBrYXJsaW4ubWZmLmN1bmkuY3o+LCBNYXJjIFNsZW1rb10KICAgICBQUiMzMTMwCgogICopIFBPUlQ6IERSUyA2MDAwIG1hY2hpbmUuIFtQYXVsIERlYmxlZWNrZXIgPHBkZWJsZWVja2VyQGpldGFpci5iZT5dCgogICopIEFkZCB0aGUgc2VydmVyIHNpZ25hdHVyZSB0ZXh0IChmcm9tIHRoZSBjb3JlIFNlcnZlclNpZ25hdHVyZSBkaXJlY3RpdmUpCiAgICAgdG8gdGhlIGxpc3Qgb2YgZW52YXJpYWJsZXMgYXZhaWxhYmxlIHRvIHNjcmlwdHMsIFNTSSwgYW5kIHRoZSBsaWtlLgogICAgIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogRml4IHN5cy9yZXNvdXJjZS5oIGhhbmRsaW5nIGZvciBTQ08gMy54IHBsYXRmb3JtLgogICAgIFtNLiBMYWFrIDxtYWVydEBwcm9pbnYuZWU+XSBQUiMzMTA4CiAKICAqKSBGYWxsYmFjayBmcm9tIHN5c2NvbmYtYmFzZWQgdG8gcGxhaW4gSFotYmFzZWQgYHRpY2tzIHBlciBzZWNvbmQnCiAgICAgY2FsY3VsYXRpb24gaW4gbW9kX3N0YXR1cyBmb3IgYWxsIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBQT1NJWAogICAgIHN5c2NvbmYoKSAobGlrZSBVVFMgMi4xKSBhbmQgbm90IG9ubHkgZm9yIHRoZSBORVhUIHBsYXRmb3JtLgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMzA1NQoKICAqKSBGaXggYHJlcXVpcmUgLi4uJyBkaXJlY3RpdmUgcGFyc2luZyBpbiBtb2RfYXV0aCwgbW9kX2F1dGhfZGJtIGFuZAogICAgIG1vZF9hdXRoX2RiIGJ5IHVzaW5nIGFwX2dldHdvcmRfd2hpdGUoKSAod2hpY2ggdXNlcyBhcF9pc3NwYWNlKCkpIAogICAgIGluc3RlYWQgb2YgYXBfZ2V0d29yZCguLi4sICcgJykgKHdoaWNoIHBhcnNlcyBvbmx5IGFjY29yZGluZyB0byBzcGFjZXMgCiAgICAgYnV0IG5vdCB0YWJzKS4gIFtKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4sIAogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMxMDUKCiAgKikgRml4IHRoZSBTRVJWRVJfTkFNRSB2YXJpYWJsZSB1bmRlciBzdWItcmVxdWVzdCBzaXR1YXRpb25zICh3aGVyZQogICAgIGBVc2VDYW5vbmljYWxOYW1lIG9mZicgaXMgdXNlZCkgbGlrZSBDR0kncyBjYWxsZWQgZnJvbSBTU0kgcGFnZXMgb3IKICAgICBSZXdyaXRlQ29uZCB2YXJpYWJsZXMgYnkgYWRvcHRpbmcgci0+aG9zdG5hbWUgdG8gc3ViLXJlcXVlc3RzLgogICAgIFtKYW1lcyBHcmludGVyIDxqcmdAYmxvZHdlbi5kZW1vbi5jby51az5dIFBSIzMxMTEKCiAgKikgRml4IHN0ZGVyciByZWRpcmVjdGlvbiB1bmRlciBzeXNsb2ctYmFzZWQgZXJyb3IgbG9nZ2luZyBzaXR1YXRpb24uCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NQoKICAqKSBEb2N1bWVudCBgRXJyb3JMb2cgc3lzbG9nOmZhY2lsaXR5JyB2YXJpYW50IG9mIGVycm9yIGxvZ2dpbmcuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NgoKICAqKSBGaXggaHR0cDovL2xvY2FsaG9zdC8gaGludHMgaW4gdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnQuCiAgICAgW1JvYiBKZW5zb24gPHJvYmplbkBzcG90Y2guY29tPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzA4OAoKICAqKSBRdW90ZSBwYXRocyBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgUE9SVDogUmVtb3ZlIGV4dHJhIEhBVkVfU1lTX1JFU09VUkNFX0ggZGVmaW5lIGZvciBSSEFQU09EWSBzaW5jZQogICAgIGl0IGlzIG5vdyB0YWtlbiBjYXJlIG9mIHByb3Blcmx5IGJ5IHRoZSBoZWFkZXIgZmlsZSB0ZXN0cy4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXpAYXBwbGUuY29tPl0KCiAgKikgRml4IHByb2JsZW0gd2l0aCBzY3JpcHRzIGFuZCBmaWxlaGFuZGxlIGluaGVyaXRhbmNlIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyekByYWxlaWdoLmlibS5jb20+XSAgUFIjMjg4NCwgMjkxMAoKICAqKSBXaW4zMiBuYW1lIGNhbm9uaWNhbGlzYXRpb24gY291bGQgZW5kIHVwIHVzaW5nIHRoZSBzZXJ2ZXIncwogICAgIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGZpbGwgaW4gc29tZSBibGFua3MuICBbS2VuIFBhcnp5Z25hdAogICAgIDxrcGFyekByYWxlaWdoLmlibS5jb20+XSBQUiMzMDAxCgogICopIENvcnJlY3QgaW52YWxpZCBhc3N1bXB0aW9uIGJ5IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoKSB0aGF0IGFsbAogICAgIGFic29sdXRlIHBhdGhzIGJlZ2luIHdpdGggIi8iIC0tIGJlY2F1c2UgdGhleSBkb24ndCBvbiBXaW4zMi4KICAgICBbS2VuIFBhcnp5Z25hdCA8a3BhcnpAcmFsZWlnaC5pYm0uY29tPl0gUFIjMjk3NiwgMzA3NAoKICAqKSBBZGQgW1JFRElSRUNUX11WQVJJQU5UUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtb2Rfc3BlbGluZwogICAgIHNvIHRoYXQgRXJyb3JEb2N1bWVudCAzMDAgcHJvY2Vzc29ycyBjYW4gcmVmb3JtYXQgdGhlIGxpc3QKICAgICBpZiBkZXNpcmVkLiAgW0tlbiBDb2FyXSBQUiMyODU5CgogICopIEFkZCArLy0gaW5jcmVtZW50YWwgcHJlZml4ZXMgdG8gSW5kZXhPcHRpb25zIGtleXdvcmRzLCBhbmQKICAgICBlbmFibGUgbWVyZ2luZyBvZiBtdWx0aXBsZSBJbmRleE9wdGlvbnMgZGlyZWN0aXZlcy4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogQWxsb3cgR3Vlc3NPUyB0byByZWNvZ25pemUgVW5peHdhcmUgNy4wLjEgW1N0ZXZlIENhbWVyb24KICAgICA8c3RldmUuY2FtZXJvbkBjb21wYXEuY29tPl0KCiAgKikgUmVjb25zdHJ1Y3RlZCB0aGUgbG9vcCB0aHJvdWdoIG11bHRpcGxlIGh0YWNjZXNzIGZpbGUgbmFtZXMgc28KICAgICB0aGF0IG1pc3NpbmcgZmlsZXMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHVucmVhZGFibGUgZmlsZXMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIGFwX3Bmb3BlbiBhbmQgYXBfcGZkb3BlbiByb3V0aW5lcyB3ZXJlIGZhaWxpbmcgdG8gcHJvdGVjdCB0aGUKICAgICBlcnJubyBvbiBhbiBlcnJvciwgd2hpY2ggbGVhZHMgdG8gb25lIGVycm9yIGJlaW5nIG1pc3Rha2VuIGZvcgogICAgIGFub3RoZXIgd2hlbiByZWFkaW5nIG5vbi1leGlzdGVudCAuaHRhY2Nlc3MgZmlsZXMuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIE9TLzI6IFRoZSBuZXcgaGVhZGVyIHRlc3RzIGdldCB0aGluZ3MgcmlnaHQsIG5lZWQgdG8gdXBkYXRlCiAgICAgYXBfY29uZmlnLmguICBbQnJpYW4gSGF2YXJkXQoKICAqKSBUaGUgUGVybCAlRU5WIGhhc2ggd2lsbCBub3cgYmUgc2V0dXAgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZQogICAgIG1vZF9pbmNsdWRlIGBwZXJsJyBjb21tYW5kIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIFBPUlQ6IEFkZCBQeXJhbWlkIERDL09TeCBzdXBwb3J0IHRvIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtLgogICAgIFtFYXJsZSBBa2UgPGFrZWVAd3BkaXNzMS53cGFmYi5hZi5taWw+XQoKICAqKSBQT1JUOiBGaXggc3lzL3Jlc291cmNlLmggaGFuZGxpbmcgZm9yIEFtZGFobCdzIFVUUyAyLjEKICAgICBbRGF2ZSBEeWtzdHJhIDxkd2RAYmVsbC1sYWJzLmNvbT5dIFBSIzMwNTQKCiAgKikgQ29ycmVjdCBjb21tZW50IGluIG1vZF9sb2dfY29uZmlnLmMgYWJvdXQgaXRzIGludGVybmFscy4KICAgICBbRWxmIFN0ZXJuYmVyZyA8ZWxmQGhhbGN5b24uY29tPl0KCiAgKikgQXZvaWQgcG9zc2libGUgbGluZSBvdmVyZmxvdyBpbiBDb25maWd1cmU6IFVzZSBhbiBhd2tmaWxlIHRvCiAgICAgaGFuZGxlIHRoZSBjcmVhdGlvbiBvZiBtb2R1bGVzLmMgW0ppbSBKYWdpZWxza2ldCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4yCgogICopIEZpeCBidWcgaW4gYXBfcmVtb3ZlX21vZHVsZSgpLCB3aGljaCBjYXVzZWQgcHJvYmxlbXMgZm9yIGRzbydzIAogICAgIHdobyB3ZXJlIHRoZSB0b3BfbW9kdWxlLiAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEJlcmtlbGV5LURCLzIueCAoaW4gYWRkaXRpb24gdG8gQmVya2VsZXktREIvMS54KSB0bwogICAgIG1vZF9hdXRoX2RiIHRvIGJvdGggYmUgZnJpZW5kbHkgdG8gdXNlcnMgd2hvIHdhbnRzIHRvIHVzZSB0aGlzIHZlcnNpb24KICAgICBhbmQgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIgcGxhdGZvcm1zIHdoZXJlIG9ubHkgdmVyc2lvbiAyLnggaXMgcHJlc2VudC4KICAgICBbRGFuIEphY29ib3dpdHogPGRyb3dAZmFsc2Uub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgV2hlbiB1c2luZyBhcF9sb2dfcmVycm9yKCksIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHRoZQogICAgICpFUlJPUl9OT1RFUyBlbnZhcmlhYmxlcyBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQoKICAqKSBCUzIwMDAgcGxhdGZvcm0gb25seTogZ2V0IHJpZCBvZiB0aGUgbmFzdHkgQlMyMDAwQXV0aEZpbGUuCiAgICAgWW91IG5vdyBtdXN0IGRlZmluZSBhIEJTMjAwMEFjY291bnQgbmFtZSBmb3IgdGhlIHNlcnZlciBVc2VyLgogICAgIFRoaXMgaGFzIGZld2VyIHNlY3VyaXR5IGltcGxpY2F0aW9ucyB0aGFuIHRoZSBvbGQgYXBwcm9hY2guCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggU0hBUkVEX0NPUkUgZmVhdHVyZSBmb3IgSFBVWCBwbGF0Zm9ybTogV2Ugbm93IHVzZSBleHRlbnNpb24gYC5zbCcKICAgICBpbnN0ZWFkIG9mIGAuc28nIGFuZCBgU0hMSUJfUEFUSCcgaW5zdGVhZCBvZiBgTERfTElCUkFSWV9QQVRIJyBvbiB0aGlzCiAgICAgcGxhdGZvcm0gdG8gbWFrZSB0aGUgYnJhaW5kZWFkIEhQVVggbGlua2VyIGhhcHB5LiBOb3RpY2UsIGZvciB0aGUgbW9kdWxlCiAgICAgRFNPcyB3ZSBkb24ndCBoYXZlIHRvIHVzZSB0aGlzLCBiZWNhdXNlIHRoZXNlIGFyZSBsb2FkZWQgbWFudWFsbHkgKGFuZAogICAgIG5vdCB2aWEgSFBVWCcgZGxkKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI5MDUsIFBSIzI5NjgKCiAgKikgUmVtb3ZlIDY0IHRocmVhZCBsaW1pdCBvbiBXaW4zMi4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBzdWJzdGl0dXRpb25zIGluIHRvcC1sZXZlbCBNYWtlZmlsZS50bXBsLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggQVBBQ0kncyBgR3JvdXAnIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudCAtIGVzcGVjaWFsbHkgZm9yIExpbnV4CiAgICAgcGxhdGZvcm1zIHdoZXJlIGBub2dyb3VwJyBleGlzdHMgaW4gL2V0Yy9ncm91cC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAKICAqKSBNYWtlIFByaW50UGF0aCB3b3JrIGdlbmVyaWNhbGx5IGluc3RlYWQgb2YgaGF2aW5nIG9uZSB2ZXJzaW9uCiAgICAgc3RyaWN0bHkgZm9yIE9TLzIuIFtKaW0gSmFnaWVsc2tpLCBCcmlhbiBIYXZhcmRdCgogICopIEZpeCB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBDIGhlYWRlciBmaWxlIGNoZWNraW5nOiBXZSBub3cgdXNlIHRoZSBDCiAgICAgcHJlLXByb2Nlc3NvciBwYXNzIG9ubHkgKGFuZCBubyBsb25nZXIgdGhlIGNvbXBsZXRlIGNvbXBpbGVyIHBhc3MpIHRvCiAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgYSBDIGhlYWRlciBmaWxlIGV4aXN0cyBvciBub3QuIEJlY2F1c2Ugb25seSB0aGlzIHdheQogICAgIHdlJ3JlIHNhZmUgYWdhaW5zdCBpbnRlci1oZWFkZXIgZGVwZW5kZW5jaWVzICh3aGljaCBjYXVzZWQgaG9ycmlibGUKICAgICBwb3J0YWJpbGl0eSBwcm9ibGVtcykuIFRoZSBvbmx5IGRyYXdiYWNrIGlzIHRoYXQgd2Ugbm93IGhhdmUgYSBDUFAKICAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHdoaWNoIGhhcyB0byBiZSBkZXRlcm1pbmVkIGZpcnN0ICh3ZSBkbyBhIHNpbWlsYXIKICAgICBhcHByb2FjaCBhcyBHTlUgQXV0b2NvbmYgZG9lcyBoZXJlKS4gV2hlbiBhbGwgZmFpbHMgdGhlIHVzZXIgc3RpbGwgaGFzCiAgICAgdGhlIHBvc3NpYmlsaXR5IHRvIG92ZXJyaWRlIGl0IG1hbnVhbGx5IHZpYSBBUEFDSSBvciBzcmMvQ29uZmlndXJhdGlvbi4KICAgICBBcyBhIGZhbGxiYWNrIGZvciB0aGUgaGVhZGVyIGNoZWNrIGl0c2VsZiB3ZSBjYW4gZGlyZWN0bHkgY2hlY2sgdGhlCiAgICAgZXhpc3RhbmNlIG9mIHRoZSBmaWxlIHVuZGVyIC91c3IvaW5jbHVkZSwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzc3CgogICopIFBPUlQ6IEFkZGVkIFJIQVBTT0RZIChNYWMgT1MgWCBTZXJ2ZXIpIHN1cHBvcnQuIE1BUF9UTVBGSUxFIGRlZmluZWQKICAgICBhcyBhbiBhbHRlcm5hdGUgbWVjaGFuaXNtIGZvciBtbWFwJ2Qgc2hhcmVkIG1lbW9yeSBmb3IgUkhBUFNPRFkuCiAgICAgYXBfcHJpdmF0ZV9leHRlcm4gZGVmaW5lZCB0byBoaWRlIHN5bWJvbHMgdGhhdCBjb25mbGljdCB3aXRoIGxvYWRlZAogICAgIGR5bmFtaWMgbGlicmFyaWVzIG9uIHRoZSBORVhUIGFuZCBSSEFQU09EWSBwbGF0Zm9ybXMuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6QGFwcGxlLmNvbT5dCgogICopIERlbGV0ZSBQSUQgZmlsZSBvbiBjbGVhbiBzaHV0ZG93bnMuCiAgICAgW0NoYXJsZXMgUmFuZGFsbCA8Y3JhbmRhbGxAbWF0Y2hsb2dpYy5jb20+XSBQUiMyOTQ3CgogICopIEZpeCBtb2RfYXV0aF8qLmh0bWwgZG9jdW1lbnRzOiBOU0NBIC0+IE5DU0EKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2FAanAuRnJlZUJTRC5vcmc+XSBQUiMyOTkxCgogICopIEZpeCBJTlNUQUxMIGRvY3VtZW50OiB3d3cuZ251LmFpLm1pdC5lZHUgLT4gd3d3LmdudS5vcmcKICAgICBbS2FybCBCZXJyeSA8a2FybEBnbnUub3JnPl0gUFIjMjk5NAoKICAqKSBGaXggZGJtbWFuYWdlLjEgbWFudWFsIHBhZ2UuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0Qub3JnPl0gUFIjMjk5MgogICAgIAogICopIEZpeCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgc2l0dWF0aW9uIGluIHN1ZXhlYy5jLgogICAgIFtKZWZmIFN0ZXdhcnQgPGp3c0BwdXJkdWUuZWR1Pl0gUFIjMjc5MAoKICAqKSBBZGQgc29tZSBtb3JlIExJQlMgZm9yIHRoZSBTQ081IHBsYXRmb3JtIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRoZSBhbHJlYWR5CiAgICAgdXNlZCAtbHByb3QuIEl0J3MgYWN0dWFsbHkgYSBidWcgaW4gU0NPNSwgb2YgY291cnNlLgogICAgIFtSb25hbGQgUmVjb3JkIDxyckBzY28uY29tPl0gUFIjMjUzMwoKICAqKSBGaXggZG9jdW1lbnRhdGlvbiBvZiBQcm94eVBhc3MvUHJveHlQYXNzUmV2ZXJzZSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgdHJhaWxpbmcgc2xhc2ggcHJvYmxlbS4gW0pvbiBEcnVrbWFuIDxqc2RAZ2FtZXNwb3QuY29tPl0gUFIjMjkzMwogIAogICopIFJlbW92ZSBgLW1zeW0nIG9wdGlvbiBmcm9tIExERkxBR1NfU0hMSUIgZm9yIHRoZSBEaWdpdGFsIFVOSVggKE9TRi8xKQogICAgIHBsYXRmb3JtLCBiZWNhdXNlIGl0J3Mgb25seSBzdXBwb3J0ZWQgdW5kZXIgdmVyc2lvbiA0LjAgYW5kIGhpZ2hlci4gQnV0CiAgICAgYmVjYXVzZSBvdXIgR3Vlc3NPUyBpcyBzdGlsbCB1bmF3YXJlIG9mIERpZ2l0YWwgVU5JWCB2ZXJzaW9ucyBhbmQgdGhlCiAgICAgLW1zeW0gaXMganVzdCB0byBvcHRpbWl6ZSB0aGUgRFNPIHN0YXR1cCB0aW1lIGEgbGl0dGxlIGJpdCBpdCdzIHNhZmUgYW5kCiAgICAgYmVzdCB3aGVuIHdlIGxlYXZlIGl0IG91dCBub3cuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjk2OQoKICAqKSBGaXggdGhlIGFwX2xvZ19lcnJvcl9vbGQoKSwgYXBfbG9nX3VuaXhlcnIoKSBhbmQgYXBfbG9nX3ByaW50ZigpCiAgICAgZnVuY3Rpb25zOiBGaXJzdCBhbGwgdGhyZWUgZnVuY3Rpb25zIG5vIGxvbmdlciBmYWlsIG9uIHN0cmluZ3MgY29udGFpbmluZwogICAgICIlIiBjaGFycyBhbmQgc2Vjb25kIGFwX2xvZ19wcmludGYoKSBubyBsb25nZXIgZG9lcyBhIGRvdWJsZS1mb3JtYXR0aW5nCiAgICAgKGluc3RlYWQgaXQgZGlyZWN0bHkgcGFzc2VzIHRocm91Z2ggdGhlIG1lc3NhZ2UgdG8gYmUgZm9ybWF0dGVkIHRvIHRoZQogICAgIHJlYWwgaW50ZXJuYWwgZm9ybWF0dGluZyBmdW5jdGlvbikuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyOTQxCgogICopIEFsbG93ICJJbmNsdWRlIiBkaXJlY3RpdmVzIGFueXdoZXJlIGluIHRoZSBzZXJ2ZXIgY29uZmlnCiAgICAgZmlsZXMgKGJ1dCBub3QgLmh0YWNjZXNzIGZpbGVzKS4gIFtLZW4gQ29hcl0gUFIjMjcyNwoKICAqKSBUaGUgcHJveHkgd2FzIHJlZnVzaW5nIHRvIHNlcnZlIENPTk5FQ1QgcmVxdWVzdHMgZXhjZXB0IHRvCiAgICAgcG9ydCA0NDMgKGh0dHBzOi8vKSBhbmQgNTYzIChzbmV3czovLykuIFRoZSBuZXcgQWxsb3dDT05ORUNUCiAgICAgZGlyZWN0aXZlIGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcG9ydHMgdG8gd2hpY2ggYQogICAgIENPTk5FQ1QgaXMgYWxsb3dlZC4gIFtTYW1lZXIgUGFyZWtoLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgbW9kX2V4cGlyZXMgd2lsbCBub3cgYWN0IG9uIGNvbnRlbnQgdGhhdCBpcyBub3Qgc2VudCBmcm9tIGEgZmlsZQogICAgIG9uIGRpc2suICBQcmV2aW91c2x5IGl0IHdvdWxkIG5ldmVyIGFkZCBhbiBFeHBpcmVzOiBoZWFkZXIgdG8KICAgICBhbnkgcmVzcG9uc2UgdGhhdCBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUgb24gZGlzazsgdGhlIG9ubHkKICAgICBjYXNlIHdoZXJlIGl0IHN0aWxsIGRvZXNuJ3QgKGFuZCBjYW4ndCkgYWRkIG9uZSBmb3IgdGhhdCB0eXBlIG9mIAogICAgIGNvbnRlbnQgaXMgaWYgeW91IGFyZSB1c2luZyBhIG1vZGlmaWNhdGlvbiBkYXRlIGJhc2VkIHNldHRpbmcuICAKICAgICBbTWFyYyBTbGVta28sIFBhdWwgUGhpbGxpcHMgPHBhdWxwQGdvMm5ldC5jb20+XQoKICAqKSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgLmh0YWNjZXNzIHBhcnNpbmcgb3IgQ0dJIGV4ZWN1dGlvbgogICAgIHRoYXQgbGVhZCB0byBhICI1MDAgU2VydmVyIEVycm9yIiBjb25kaXRpb24gbm93IHByb3ZpZGUgZXhwbGFuYXRvcnkKICAgICB0ZXh0IChpbiB0aGUgKkVSUk9SX05PVEVTIGVudmFyaWFibGUpIHRvIEVycm9yRG9jdW1lbnQgNTAwIHNjcmlwdHMuCiAgICAgW0tlbiBDb2FyXSBQUiMxMjkxCgogICopIEFkZCBOYW1lV2lkdGgga2V5d29yZCB0byBJbmRleE9wdGlvbnMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlCiAgICAgd2lkdGggb2YgdGhlIGZpbGVuYW1lIGNvbHVtbiBpcyBjdXN0b21pc2FibGUuICBbS2VuIENvYXIsIERlYW4gR2F1ZGV0XQogICAgIFBSIzE5NDksIDIzMjQuCgogICopIFJlY29nbml6ZSBsb3dlcmNhc2UgX2FuZF8gdXBwZXJjYXNlIGB1bmFtZScgcmVzdWx0cyB1bmRlcgogICAgIFNDTyBPcGVuU2VydmVyLiBbRGF2aWQgQ29lbGhvIDxkcmNAcHB0LmNvbT5dCgogICopIEFzIGR1cGxpY2F0ZSAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcyB3aXRoaW4gdGhlIGhlYWRlciBzZWVtIHRvIGJlCiAgICAgYSBjb21tb24gcHJvYmxlbSBvZiAobWlzLWFkbWluaXN0cmF0ZWQ/KSBJSVMgc2VydmVycywgbWFrZSB0aGUgYXBhY2hlCiAgICAgcHJveHkgaW1tdW5lIHRvIHRoZXNlIGVycm9ycyAoYW5kIGlnbm9yZSB0aGUgZHVwbGljYXRlcywgYnV0IGxvZwogICAgIHRoZSBmYWN0IHRvIGVycm9yX2xvZykuIFtNYXJ0aW4gS3JhZW1lcl0sIGFmdGVyIHRoZSBwcm9wb3NhbCBpbiBQUiMyOTE0IAogICAgIAogICopIFRoZSA8SWZNb2R1bGUgYW5kIDxJZkRlZmluZSBibG9jayBzdGFydGluZyBkaXJlY3RpdmVzIG5vdyBvbmx5CiAgICAgYWxsb3cgZXhhY3RseSBvbmUgYXJndW1lbnQuIFByZXZpb3VzbHksIHRoZSBvcHRpb25hbCBuZWdhdGlvbgogICAgIGNoYXJhY3RlciAnIScgY291bGQgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aG91dCBhIHN5bnRheAogICAgIGVycm9yIGJlaW5nIHJlcG9ydGVkLCBhbGJlaXQgZGVmZWF0aW5nIHRoZSBJZk1vZHVsZSBmdW5jdGlvbmFsaXR5CiAgICAgKGVuY2xvc2VkIGRpcmVjdGl2ZXMgd291bGQgQUxXQVlTIGJlIGV4ZWN1dGVkKS4gQnkgdXNpbmcgdGhlCiAgICAgc3RyaWN0ZXIgc3ludGF4LCB0aGVzZSBoYXJkLXRvLXRyYWNrIGVycm9ycyBjYW4gYmUgYXZvaWRlZC4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIEluZGV4T3B0aW9ucyBpbiBtb2RfYXV0b2luZGV4IC0tIGFuZCBCVFcKICAgICBjYXVzZSB0aGUgc3RhbmRhbG9uZSBGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSB0byBsb2dpY2FsbHkgT1IKICAgICBpbnRvIGFueSBleGlzdGluZyBJbmRleE9wdGlvbnMgc2V0dGluZ3MgcmF0aGVyIHRoYW4gd2lwaW5nCiAgICAgdGhlbSBvdXQuICBbS2VuIENvYXJdCgogICopIENoYW5nZXMgaW4gZnRwIHByb3h5OiBtYWtlIFVSTCBwYXJzaW5nIHNpbXBsZXIgYnkgdXNpbmcgdGhlCiAgICAgcGFyc2VkX3VyaSBzdHVmZi4KICAgICArIEFkZCBkaXNwbGF5IG9mIHRoZSAiY3VycmVudCBkaXJlY3RvcnkiIGluIGNhc2VzIHdoZXJlIGl0J3MKICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgc3VwcGxpZWQgcGF0aCAoZS5nLiwgZnRwOi8vdXNlckBob3N0LyBsaXZlcwogICAgIGluIC9ob21lL3VzZXIsIG5vdCBpbiAvLCB0aGVyZWZvcmUgY2xpY2tpbmcgb24gIi4uLyIgaW4gdGhlCiAgICAgc3RhcnRpbmcgZGlyZWN0b3J5IG1pZ2h0IHNlbmQgdXMgdG8gL2hvbWUvKS4KICAgICArIFdoZW4gZnRwIGxvZ2luIGZhaWxzLCAoZXNwLiB3aGVuIGEgdXNlciBuYW1lIHdhcyBwYXJ0IG9mIHRoZQogICAgIFVSTCBhbHJlYWR5KSwgd2Ugbm93IHJldHVybiBbNDAxIFVuYXV0aG9yaXplZCBdIHRvIGFsbG93IHRoZQogICAgIGJyb3dzZXIgdG8gcG9wIHVwIGFuIGF1dGhvcml6YXRpb24gZGlhbG9nLiBUaGlzIG1ha2VzIHBhc3N3b3JkcwogICAgIHNsaWdodGx5IGxlc3MgdmlzaWJsZSAodGhleSBkb24ndCBhcHBlYXIgaW4gdGhlIHJlZ3VsYXIgbG9nIGZpbGVzKQogICAgIGFuZCBpbXBsZW1lbnRzIGEgZnVuY3Rpb25hbGl0eSB0aGF0IG90aGVyIHd3dyBwcm94eSBzZXJ2ZXJzCiAgICAgYWxyZWFkeSBvZmZlcmVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVHJpZ2dlcmVkIGJ5IHRoZSByZWNlbnQgIlZpYToiIGhlYWRlciBjaGFuZ2VzLCB0aGUgcHJveHkgbW9kdWxlIHdvdWxkCiAgICAgZHVtcCBjb3JlIGZvciByZXBsaWVzIHdpdGggaW52YWxpZCBoZWFkZXJzIChlLmcuLCBkdXBsaWNhdGUKICAgICAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcykuIFRoZXNlIGVycm9ycyBhcmUgbm93IGxvZ2dlZCBhbmQgdGhlCiAgICAgY29yZSBkdW1wIGlzIGF2b2lkZWQuIEFsc28sIGJyb2tlbiByZXBsaWVzIGFyZSBub3QgY2FjaGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0gUFIjMjkxNAoKICAqKSBuZXcgYEdwcm9mRGlyJyBkaXJlY3RpdmUgd2hlbiBjb21waWxlZCB3aXRoIC1ER1BST0YsIHdoZXJlIGdwcm9mIGNhbgogICAgIHBsb3AgZ21vbi5vdXQgcHJvZmlsZSBkYXRhIGZvciBlYWNoIGNoaWxkIFtEb3VnIE1hY0VhY2hlcm5dCiAgIAogICopIFVzZSB0aGUgY29uc3RydWN0IGBgIiRAIicnIGluc3RlYWQgb2YgYGAkKicnIGluIHRoZSBnZW5lcmF0ZWQKICAgICBjb25maWcuc3RhdHVzIHNjcmlwdCB0byBiZSBpbW11bmUgYWdhaW5zdCBhcmd1bWVudHMgd2l0aCB3aGl0ZXNwYWNlcy4KICAgICBbWXZlcyBBcnJvdXllIDx5dmVzQGFwcGxlLmNvbT5dIFBSIzI4NjYKCiAgKikgUmVwbGFjZSB0aGUgaW5saW5lZCBpbmZvcm1hdGlvbiBncmFiYmluZyBzdHVmZiBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhZGp1c3RtZW50IGZlYXR1cmUgKG5vIC0td2l0aG91dC1jb25mYWRqdXN0KSB3aXRoIGNhbGxzIHRvIGEgbmV3IGhlbHBlcgogICAgIHNjcmlwdCBgYnVpbGRpbmZvLnNoJyB3aGljaCBpcyBib3RoIG1vcmUgZmxleGlibGUgYW5kIGFscmVhZHkgcHJvb2ZlZCB0bwogICAgIGJlIG1vcmUgcm9idXN0IGFnYWluc3QgcGxhdGZvcm0gZGlmZmVyZW5jZXMuIFRoaXMgbWFpbmx5IGZpeGVzIHRoZQogICAgIHJlY2VudGx5IG9jY3VyZWQgYGBzZWQ6IGNvbW1hbmQgZ2FyYmxlZDogLi4uJycgcHJvYmxlbXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3NzYsIFBSIzI4NDgKCiAgKikgTWFrZSBhYi5jIGFnYWluIHBhc3MgYGBnY2MgLVdhbGwgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbgogICAgIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnCiAgICAgd2l0aG91dCBjb21wbGFpbnMgYWZ0ZXIgd2UgcmVjZW50bHkgYWRkZWQgdGhlIFBPU1QgZmVhdHVyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCBpc19IVFRQX3h4eCgpIG1hY3JvcyB0byBhcF9pc19IVFRQX3h4eCgpIG5hbWUuIFRoZXkgYXJlIHVzZWQgaW5zaWRlCiAgICAgbW9kdWxlcyBhcyBBUEkgZnVuY3Rpb25zIGFuZCB3ZSBmb3Jnb3QgdGhlbSBhdCB0aGUgYmlnIHN5bWJvbCByZW5hbWluZy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIGJhZCByZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIFNFUlZFUl9WRVJTSU9OIGluIG1vZF9yZXdyaXRlLmh0bWwKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2FAanAuRnJlZUJTRC5PUkc+XSBQUiMyODk1CgogICopIER5bmFtaWNhbGx5IHNpemUgdGhlIGZpbGVuYW1lIGNvbHVtbiBvZiBtb2RfYXV0b2luZGV4IG91dHB1dC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBkbyBQT1NUIHJlcXVlc3RzIHRvIHRoZSBhYiBiZW5jaG1hcmtpbmcgdG9vbC4KICAgICBbS3VydCBTdXNzbWFuIDxrbHNAYmVzdC5jb20+XSBQUiMyODcxCgogICopIEJ1bXAgdXAgTUFYX0VOVl9GTEFHUyBpbiBtb2RfcmV3cml0ZS5oIGZyb20gdGhlIHRvbyBjb25zZXJ2YXRpY2UgbGltaXQgb2YKICAgICA1IHRvIDEwIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgdXNlcnMgb3V0IHRoZXJlIHdobyBhbHdheXMgaGF2ZSA1IHRvIDgKICAgICB2YXJpYWJsZXMgaW4gb25lIFJld3JpdGVSdWxlIGFuZCBoYWQgdG8gcGF0Y2ggbW9kX3Jld3JpdGUuaCBmb3IgZXZlcnkKICAgICByZWxlYXNlLiBTbyAxNSBzaG91bGQgYmUgbm93IG1vcmUgdGhhbiBlbm91Z2gsIGV2ZW4gZm9yIHRoZW0uIChJIG5ldmVyCiAgICAgbmVlZGVkIG1vcmUgdGhhbiA0IGluIG15IFJld3JpdGVSdWxlcyA7LSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSB0aGUgcHJveHkgZ2VuZXJhdGUgYW5kIHVuZGVyc3RhbmQgVmlhOiBoZWFkZXJzCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBDaGFuZ2UgdGhlIHByb3h5IHRvIHVzZSB0YWJsZXMgaW5zdGVhZCBvZiBhcnJheV9oZWFkZXJzIGZvcgogICAgIHRoZSBoZWFkZXIgbGluZXMuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzdXJlIHRoZSBjb25maWcuc3RhdHVzIGZpbGUgaXMgbm90IG92ZXJyaWRkZW4gd2hlbiBqdXN0CiAgICAgYGBjb25maWd1cmUgLS1oZWxwJycgaXMgdXNlZC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI4NDQKCiAgKikgU3BsaXQgTU9EVUxFX01BR0lDX05VTUJFUiBpbnRvIF9NQUpPUi9fTUlOT1IgbnVtYmVycy4gVGhpcyBzaG91bGQKICAgICBwcm92aWRlIGEgd2F5IHRvIHRyYWNlIEFQSSBjaGFuZ2VzIHRoYXQgYWRkIGZ1bmN0aW9uYWxpdHkgYnV0IGRvCiAgICAgbm90IGNyZWF0ZSBhIGNvbXBhdGliaWxpdHkgaXNzdWUgZm9yIHByZWNvbXBpbGVkIG1vZHVsZXMsIGV0Yy4KICAgICBTZWUgaW5jbHVkZS9hcF9tbW4uaCBmb3IgbW9yZSBkZXRhaWxzLiAgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeCBzdWV4ZWMgaW5zdGFsbGF0aW9uIHVuZGVyIGBtYWtlIGluc3RhbGwgcm9vdD14eHgnIHNpdHVhdGlvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRXh0ZW5kIHRoZSBvdXRwdXQgb2YgdGhlIC1WIHN3aXRjaCB0byBpbmNsdWRlIHRoZSBwYXRocyBvZiBhbGwKICAgICBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZpbGVzLCBpZiB0aGV5IHdlcmUgb3ZlcnJpZGRlbiBhdAogICAgIGNvbXBpbGUgdGltZSwgZm9yIGxlYXN0IGFzdG9uaXNobWVudCBvZiB0aGUgdXNlci4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFdoZW4gUkVBRGluZyBhIHJlcXVlc3QgaW4gRXh0ZW5kZWRTdGF0dXMgbW9kZSwgdGhlICJvbGQiCiAgICAgdmhvc3QsIHJlcXVlc3QgYW5kIGNsaWVudCBpbmZvcm1hdGlvbiBpcyBub3QgZGlzcGxheWVkLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTVEFUVVMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gRnVsbCBzdGF0dXMgaW5mb3JtYXRpb24gbm93CiAgICAgcnVuLXRpbWUgY29uZmlndXJhYmxlIHVzaW5nIHRoZSBFeHRlbmRlZFN0YXR1cyBkaXJlY3RpdmUuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgTyhuXjIpIHNwYWNlIERvUyBhdHRhY2tzIChhbmQgb3RoZXIgTyhuXjIpCiAgICAgY3B1IHRpbWUgYXR0YWNrcykgaW4gaGVhZGVyIHBhcnNpbmcuICBBZGQgYXBfb3ZlcmxhcF90YWJsZXMoKSwKICAgICBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYnVsayB1cGRhdGUgb3BlcmF0aW9ucwogICAgIG9uIHRhYmxlcyBpbiBhIG1vcmUgZWZmaWNpZW50IG1hbm5lci4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEFkZGVkIGNvbXBpbGUtdGltZSBhbmQgY29uZmlndXJhYmxlIGxpbWl0cyBmb3IKICAgICB2YXJpb3VzIGFzcGVjdHMgb2YgcmVhZGluZyBhIGNsaWVudCByZXF1ZXN0IHRvIGF2b2lkIHNvbWUgc2ltcGxlCiAgICAgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcywgaW5jbHVkaW5nIGxpbWl0cyBvbiBtYXhpbXVtIHJlcXVlc3QtbGluZQogICAgIHNpemUgKExpbWl0UmVxdWVzdExpbmUpLCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyAoTGltaXRSZXF1ZXN0RmllbGRzKSwKICAgICBhbmQgc2l6ZSBvZiBhbnkgb25lIGhlYWRlciBmaWVsZCAoTGltaXRSZXF1ZXN0RmllbGRzaXplKS4gIEFsc28gYWRkZWQKICAgICBhIGNvbmZpZ3VyYWJsZSBkaXJlY3RpdmUgTGltaXRSZXF1ZXN0Qm9keSBmb3IgbGltaXRpbmcgdGhlIHNpemUgb2YgdGhlCiAgICAgcmVxdWVzdCBtZXNzYWdlIGJvZHkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNYWtlIHN0YXR1cyBtb2R1bGUgYXdhcmUgb2YgRE5TIGFuZCBsb2dnaW5nIHN0YXRlcywgZXZlbiBpZgogICAgIFNUQVRVUyBub3QgZGVmaW5lZC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggdGhlIG5ldyBPUy8yIG11dGV4ZXMuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBFbmhhbmNlIG1vZF9zcGVsaW5nIHNvIHRoYXQgQ2hlY2tTcGVsbGluZyBjYW4gYmUgdXNlZCBpbgogICAgIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMgYW5kIC5odGFjY2VzcyBmaWxlcy4gIFtLZW4gQ29hcl0KCiAgKikgQVBJOiBuZXcgYXBfY3VzdG9tX3Jlc3BvbnNlKCkgZnVuY3Rpb24gZm9yIGhvb2tpbmcgaW50byB0aGUKICAgICBFcnJvckRvY3VtZW50IG1lY2hhbmlzbSBhdCBydW50aW1lIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogbmV3IGFwX3V1ZW5jb2RlKCkgZnVuY3Rpb24gW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQVBJOiBzY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBub3cgInB1YmxpYyIgYW5kIHJlbmFtZWQKICAgICBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBUaGUgJ3N0YXR1cycgbW9kdWxlIHdpbGwgbm93IHNob3cgdGhlIHByb2Nlc3MgcGlkJ3MgYW5kIHRoZWlyCiAgICAgc3RhdGUgZXZlbiB3aXRob3V0IGZ1bGwgU1RBVFVTIGFjY291bnRpbmcuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZXN0b3JlIHRoZSBjbGllbnQgSVAgYWRkcmVzcyB0byB0aGUgZXJyb3IgbG9nIG1lc3NhZ2VzLCB0aGlzCiAgICAgd2FzIGxvc3QgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIGZyb20gMS4yIHRvIDEuMy4gIEFkZCBhIG5ldwogICAgIGZ1bmN0aW9uIGFwX2xvZ19yZXJyb3IoKSB3aGljaCB0YWtlcyBhIHJlcXVlc3RfcmVjICogYW5kCiAgICAgZm9ybWF0cyBpdCBhcHByb3ByaWF0ZWx5LiAgW0RlYW4gR2F1ZGV0XSBQUiMyNjYxCgogICopIEN1cmUgYXBfY2ZnX2dldGxpbmUoKSBvZiBpdHMgbmFzdHkgaGFiaXQgb2YgY29tcHJlc3NpbmcgaW50ZXJuYWwKICAgICB3aGl0ZXNwYWNlIGluIGlucHV0IGxpbmVzIC0tIGluY2x1ZGluZyB3aXRoaW4gcXVvdGVkIHN0cmluZ3MuCiAgICAgW0tlbiBDb2FyXQogICAgIGJ1dCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZCBjb250aW51ZSB0byBiZQogICAgIHN0cmlwcGVkIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQ2xlYW51cCBvZiB0aGUgUHJpbnRQYXRoL1ByaW50UGF0aE9TMiBoZWxwZXIgZnVuY3Rpb25zLiBBdm9pZAogICAgIHRoZSB1Z2x5IHVzZSBvZiBhbiBlbnYuIHZhcmlhYmxlIGFuZCB1c2UgY29tbWFuZC1saW5lIGFyZ3MgZm9yCiAgICAgYWx0ZXJuYXRlICRQQVRILiBNYWtlIG1vcmUgbGlrZSBhZHZhbmNlZCAndHlwZSdzIGFzIHdlbGwuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFRoZSBJUklYTjMyIFJ1bGUgd2FzIGJlaW5nIGlnbm9yZWQuIENvbmZpZ3VyZSBub3cgY29ycmVjdGx5IGFkZHMKICAgICAtbjMyIG9ubHkgaWYgSVJJWE4zMiBzYXlzIHRvLiBbSmltIEphZ2llbHNraSwgQWxhaW4gU3QtRGVuaXMKICAgICA8YWxhaW4uc3QtZGVuaXNAZWMuZ2MuY2E+XSBQUiMyNzM2CgogICopIENsZWFuIHVwIGEgd2FybmluZyBpbiBtb2RfcHJveHkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW5hbWVkIF9fRU1YX18gKGludGVybmFsIGRlZmluZSBvZiB0aGUgZ2NjIHBvcnQgdW5kZXIgT1MvMikgdG8gT1MyCiAgICAgZm9sbG93aW5nIHRoZSBzYW1lIGlkZWEgYXMgIk1TVkMgdnMgV0lOMzIiLiBBZGRpdGlvbmFsbHkgdGhlIHNyYy9vcy9lbXgvCiAgICAgZGlyZWN0b3J5IHdhcyByZW5hbWVkIHRvIHNyYy9vcy9vczIvIGZvciBjb25zaXN0ZW5jeS4KICAgICBbQnJpYW4gSGF2YXJkLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgbmV3IFJ1bGUgU0hBUkVEX0NIQUlOIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBsaW5raW5nIG9mIERTTwogICAgIGZpbGVzIChoZXJlIG1vZHVsZXMpIGFnYWluc3Qgb3RoZXIgRFNPIGZpbGVzIChoZXJlIHNoYXJlZCBsaWJyYXJpZXMpLgogICAgIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyBhIHN1YnNldCBvZiBMSUJTIHdoaWNoIGNhbiBiZSBzYWZlbHkgdXNlZCBmb3IKICAgICBsaW5raW5nIHRoZSBEU09zLCBpLmUuIFBJQyBsaWJzIGFuZCBzaGFyZWQgbGlicy4gIEN1cnJlbnRseSB0aGUgcnVsZSBpcwogICAgIGRpc2FibGVkIGZvciBhbGwgcGxhdGZvcm1zIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhpcyAoZXhwZXJpbWVudGFsKQogICAgIHJ1bGUuIEJ1dCB3ZSBwcm92aWRlIGl0IG5vdyBmb3IgdGhvc2UgcGVvcGxlIGhvdyByYW4gaW50byBwcm9ibGVtcyBhbmQKICAgICB3YW50IHRvIGNhbWUgb3V0IGJ5IGZvcmNpbmcgbGlua2luZyBhZ2FpbnN0IERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1ODcKCiAgKikgRml4IHN1RVhFQyBzdGFydCBtZXNzYWdlOiBIYXMgdG8gYmUgb2YgYG5vdGljZScgbGV2ZWwgdG8gcmVhbGx5IGdldAogICAgIHByaW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgc3RhbmRhcmQgc3RhcnR1cCBtZXNzYWdlIGJlY2F1c2UgdGhlIGBub3RpY2UnCiAgICAgbGV2ZWwgaXMgaGFuZGxlZCBzcGVjaWFsIGluc2lkZSBhcF9sb2dfZXJyb3IoKSBmb3Igc3RhcnR1cCBtZXNzYWdlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc2MSBQUiMyNzYxIFBSIzI3NjUKCiAgKikgQWRkIGNvcnJlY3QgYG1vZGVsJyBNSU1FIHR5cGVzIGZyb20gUkZDMjA3NyB0byBtaW1lLnR5cGVzIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MzIKCiAgKikgRml4ZWQgZXhhbXBsZXMgaW4gbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudC4gCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0Qub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc1NgoKICAqKSBBbGxvdyBhcF9yZWFkX3JlcXVlc3QgZXJyb3JzIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBub3JtYWwgcmVxdWVzdAogICAgIGhhbmRsaW5nIGxvb3Agc28gdGhhdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgcHJvcGVybHkgY2xvc2VkIHdpdGgKICAgICBsaW5nZXJpbmdfY2xvc2UsIHRodXMgYXZvaWRpbmcgYSBwb3RlbnRpYWwgVENQIHJlc2V0IHRoYXQgd291bGQKICAgICBjYXVzZSB0aGUgY2xpZW50IHRvIG1pc3MgdGhlIEhUVFAgZXJyb3IgcmVzcG9uc2UuICBbUm95IEZpZWxkaW5nXQoKICAqKSBPbmUgbW9yZSBwb3J0YWJpbGl0eSBmaXggZm9yIEFQQUNJIHNoYWRvdyB0cmVlIHN1cHBvcnQ6IFN3YXAgb3JkZXIgb2YgYXdrCiAgICAgYW5kIHNlZCBpbiB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBhdm9pZCBzZWQgZmFpbHMgb24gc29tZQogICAgIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUKICAgICBub24tbmV3bGluZS10ZXJtaW5lZCBvdXRwdXQgb2YgQXdrLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcyOQoKICAqKSBQT1JUOiBORUMgRVdTNDgwMCBzdXBwb3J0LgogICAgIFtNQVRTVVVSQSBUYWthbm9yaSA8dC1tYXRzdXVAcHJvdGVpbi5vc2FrYS11LmFjLmpwPl0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIHByb3h5IG9uIE9TLzIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBGaXggV2luMzIgcGFydCBvZiBhcF9zcGF3bl9jaGlsZCgpIGJ5IHByb3ZpZGluZyBhIHJlYXNvbmFibGUgY2hpbGRfaW5mbwogICAgIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGp1c3QgTlVMTC4gVGhpcyBmaXhlcyBhdCBsZWFzdCB0aGUgUmV3cml0ZU1hcAogICAgIHByb2dyYW1zIHVuZGVyIFdpbjMyLiBbTWFyY28gRGUgTWljaGVsZSA8bWRlbWljaGVsZUB0aW4uaXQ+XSBQUiMyNDgzCgogICopIEFkZCB3b3JrYXJvdW5kIHRvIHRvcC1sZXZlbCBgY29uZmlndXJlJyBzY3JpcHQgZm9yIGJyYWluIGRlYWQgCiAgICAgYGVjaG8nIGNvbW1hbmRzIHdoaWNoIGludGVycGV0IGVzY2FwZSBzZXF1ZW5jZXMgcGVyIGRlZmF1bHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2NTQKCiAgKikgTWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIgaXMgY29ycmVjdGx5CiAgICAgYWRqdXN0ZWQgdW5kZXIgYG1ha2UgaW5zdGFsbCcgYWxzbyBmb3IgdGhlIHByaW50ZW52IENHSSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1OTUKIAogICopIFVwZGF0ZSB0aGUgbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudCB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgc2l0dWF0aW9uCiAgICAgb2YgdGhlIGBwcm94eScgKGBbUF0nKSBmZWF0dXJlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY3OQoKICAqKSBGaXggYGluc3RhbGwtaW5jbHVkZXMnIHN1Yi10YXJnZXQgb2YgYGluc3RhbGwnIHRhcmdldCBpbiB0b3AtbGV2ZWwKICAgICBNYWtlZmlsZS50bXBsOiBUaGUgdW1hc2srY3AgYXBwcm9hY2ggZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQgKGVzcGVjaWFsbHkKICAgICBmb3IgdXNlcnMgd2hpY2ggZXh0cmFjdGVkIHRoZSBkaXN0cmlidXRpb24gdW5kZXIgJ3VtYXNrIDA3NycpLCBzbyByZXBsYWNlCiAgICAgaXQgYnkgYW4gZXhwbGljaXQgY3ArY2htb2QgYXBwcm9hY2guCiAgICAgW1JpY2hhcmQgTGxveWQsIEN1cnQgU2FtcHNvbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY1NiBQUiMyNjI2CiAKICAqKSBGaXggYGRpc3RjbGVhbicgYW5kIGBjbGVhbicgdGFyZ2V0cyBpbiBzcmMvTWFrZWZpbGUudG1wbCB0byBoYXZlIHNhbWUKICAgICBiZWhhdmlvciBhbmQgdG8gY2xlYW51cCBjb3JyZWN0bHkgZXZlbiB1bmRlciBlbmFibGVkIFNIQVJFRF9DT1JFIHJ1bGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzZSBhIG1vcmUgc3RyYWlnaHQgZm9yd2FyZCBhbmQgdGh1cyBsZXNzIHByb2JsZW1hdGljIFNlZCBjb21tYW5kIGluCiAgICAgc3JjL2hlbHBlci9ta2Rpci5zaCBzY3JpcHQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoZSBgY29uZmlndXJlJyBzY3JpcHRzIGRvZXNuJ3QgZmFpbCB3aGVuIHRyeWluZyB0byBndWVzcyB0aGUKICAgICBkb21haW5uYW1lIG9mIHRoZSBtYWNoaW5lIGFuZCB0aGVyZSBhcmUgbXVsdGlwbGUgYGRvbWFpbm5hbWUnIGFuZAogICAgIGBzZWFyY2gnIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxMAoKICAqKSBBZGQgbm90ZSBhYm91dCB0aGUgU0hBUkVEX0NPUkUgcmVxdWlyZW1lbnQgb24gc29tZSBwbGF0Zm9ybXMgYWxzbyB0byB0aGUKICAgICBJTlNUQUxMIGZpbGUgYmVjYXVzZSBhIGxvdCBvZiB1c2VycyBkb24ndCByZWFkIGh0ZG9jcy9tYW51YWwvZHNvLmh0bWwKICAgICBmaXJzdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MDEKCiAgKikgRml4IGRvY3VtZW50ICJoeXBlcmxpbmsiIGZvciBkc28uaHRtbCBpbiBzcmMvQ29uZmlndXJhdGlvbi50bXBsCiAgICAgW0tudXQgQS5TeWVkIDxLbnV0LlN5ZWRAbmhoLm5vPl0gUFIjMjY3NAoKICAqKSBNb2RpZnkgbW9kX3Jld3JpdGUgdG8gdXBkYXRlIHRoZSBWYXJ5IHJlc3BvbnNlIGZpZWxkIGlmIHRoZSBVUkwgcmV3cml0aW5nCiAgICAgZW5naW5lIGRvZXMgYW55IG1hbmlwdWxhdGlvbnMgb3IgZGVjaXNpb25zIGJhc2VkIHVwb24gcmVxdWVzdCBmaWVsZHMuIAogICAgIFtLZW4gQ29hcl0gUFIjMTY0NAoKICAqKSBEb2N1bWVudCB0aGUgc3BlY2lhbCBBUEFDSSBiZWhhdmlvciBmb3IgaW5zdGFsbGF0aW9uIHBhdGhzIHdoZXJlCiAgICAgYGAvYXBhY2hlJycgaXMgYXBwZW5kZWQgdG8gcGF0aHMgdW5kZXIgc29tZSAod2VsbCBkZWZpbmVkLCBvZiBjb3Vyc2UpCiAgICAgc2l0dWF0aW9ucyB0byBwcmV2ZW50IHBvbGx1dGlvbiBvZiBzeXN0ZW0gbG9jYXRpb25zIHdpdGggQXBhY2hlIGZpbGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjYwCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBidWZmZXJlZCByZXNwb25zZSBtZXNzYWdlIG5vdCBiZWluZyBzZW50IGZvcgogICAgIHRoZSByZWFkX3JlcXVlc3QgZXJyb3IgY29uZGl0aW9ucyBvZiBVUkktdG9vLWxvbmcgKDQxNCkgYW5kCiAgICAgbWFsZm9ybWVkIGhlYWRlciBmaWVsZHMgKDQwMCkuICBbUm95IEZpZWxkaW5nXSBQUiMyNjQ2CgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgTWF4LUZvcndhcmRzOiBoZWFkZXIgbGluZSByZXF1aXJlZCBieSBSRkMyMDY4IGZvcgogICAgIHRoZSBUUkFDRSBtZXRob2QuIFRoaXMgYWxsb3dzIGFwYWNoZSB0byBUUkFDRSBhbG9uZyBhIGNoYWluIG9mIHByb3hpZXMKICAgICB1cCB0byBhIHByZWRldGVybWluZWQgZGVwdGguIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IFNIQVJFRF9DT1JFIHJ1bGU6IFRoZSBDRkxBR1NfU0hMSUIgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIGRvdWJsZWQKICAgICAoY29tcGlsZXJzIGNvbXBsYWluZWQpIGFuZCB0aGUgLnNvLlYuUi5QIGZpbGVuYW1lIGV4dGVuc2lvbiB3YXMgYWRqdXN0ZWQKICAgICB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgMS4zLjIgdmVyc2lvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY0NAoKICAqKSBTRUNVUklUWTogUGx1ZyAiLi4uIiBhbmQgb3RoZXIgY2Fub25pY2FsaXphdGlvbiBob2xlcyB1bmRlciBPUy8yLgogICAgIFtCcmlhbiBIYXZhcmRdCiAgCiAgKikgUE9SVDogaW1wbGVtZW50IHNlcmlhbGl6ZWQgYWNjZXB0cyBmb3IgT1MvMi4gIFtCcmlhbiBIYXZhcmRdCgogICopIG1vZF9pbmNsdWRlIGhhZCBwcm9ibGVtcyB3aXRoIHRoZSBmc2l6ZSBhbmQgZmxhc3Rtb2QgZGlyZWN0aXZlcwogICAgIHVuZGVyIFdJTjMyLiAgRml4IGFsc28gYXZvaWRzIHRoZSBtaW5vciBzZWN1cml0eSBob2xlIG9mIHVzaW5nCiAgICAgIi4uIiBwYXRocyBmb3IgZnNpemUgYW5kIGZsYXN0bW9kLgogICAgIFtNYW5vaiBLYXNpY2hhaW51bGEgPG1hbm9qa0ByYWxlaWdoLmlibS5jb20+XSBQUiMyMzU1CgogICopIEZpeGVkIHNvbWUgTWFrZWZpbGUgZGVwZW5kZW5jeSBwcm9ibGVtcy4gIFtEZWFuIEdhdWRldF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjEKCiAgKikgRGlzYWJsZSB0aGUgaW5jb3JyZWN0IGVudHJ5IGZvciBhcHBsaWNhdGlvbi9tc3dvcmQgaW4gdGhlIAogICAgIG1vZF9taW1lX21hZ2ljICJtYWdpYyIgZmlsZSBiZWNhdXNlIGl0IGFsc28gbWF0Y2hlcyBvdGhlciBPZmZpY2UKICAgICBkb2N1bWVudHMuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjYwOAoKICAqKSBGaXggYnJva2VuIFJBTkxJQiBoYW5kbGluZyBpbiBzcmMvQ29uZmlndXJlICh0aGUgZW50cnkgZnJvbQogICAgIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgd2FzIGlnbm9yZWQpIGFuZCBhZGRpdGlvbmFsbHkgZm9yY2UgUkFOTElCIHRvCiAgICAgL2Jpbi90cnVlIHVuZGVyIEhQL1VYIHdoZXJlIHJhbmxpYiBleGlzdHMgYnV0IGlzIGRlcHJlY2F0ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2MjcKICAgICAKICAqKSAnYXBhY2hlY3RsIHN0YXR1cycgZmFpbGVkIG9uIHNvbWUgc3lzdGVtcy4KICAgICBbU3RldmUgVmFuRGV2ZW5kZXIgPHN0ZXZldkBkYXJrd2luZy51b3JlZ29uLmVkdT4sIExhcnMgRWlsZWJyZWNodF0gUFIjMjYxMwoKICAqKSBBZGQgbmV3IGZsYWdzIGZvciBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKCkgdG8gbWFrZSBpdCBnZW5lcmF0ZQogICAgIHRoZSBzY2hlbWU6Ly9zaXRlcGFydCBzdHJpbmcgb25seSwgb3IgdG8gb21pdCB0aGUgcXVlcnkgc3RyaW5nLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgV0lOMzI6IENhbm9uaWNhbGl6ZSBTZXJ2ZXJSb290IGJlZm9yZSBjaGVja2luZyB0byBzZWUgaWYgaXQKICAgICBpcyBhIHZhbGlkIGRpcmVjdG9yeS4gIFRoZSBmYWlsdXJlIHRvIGRvIHRoaXMgY2F1c2VkIGNlcnRhaW4KICAgICBTZXJ2ZXJSb290IHNldHRpbmdzIChlZy4gIlNlcnZlclJvb3QgL2FwYWNoZSIpIHRvIGJlIGltcHJvcGVybHkKICAgICByZWplY3RlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgR2xvYmFsIHJlbmFtaW5nIG9mIEMgaGVhZGVyIGZpbGVzIHRvIGJvdGggZ2V0IHJpZCBvZiBjb25mbGljdHMgd2l0aCB0aGlyZAogICAgIHBhcnR5IHBhY2thZ2VzIGFuZCB0byBhZ2FpbiByZWFjaCBjb25zaXN0ZW5jeToKICAgICAgIDEuIGNvbmYuaCAgICAgIC0+IGFwX2NvbmZpZy5oCiAgICAgICAyLiBjb25mX2F1dG8uaCAtPiBhcF9jb25maWdfYXV0by5oIFwgdGhlc2UgYXJlIG5vdyBtZXJnZWQKICAgICAgIDMuIGFwX2NvbmZpZy5oIC0+IGFwX2NvbmZpZ19hdXRvLmggLyBpbiB0aGUgY29uZmlnIHByb2Nlc3MKICAgICAgIDQuIGNvbXBhdC5oICAgIC0+IGFwX2NvbXBhdC5oCiAgICAgICA1LiBhcGN0eXBlLmggICAtPiBhcF9jdHlwZS5oCiAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmaWxlcyBmb3IgY29uZi5oIGFuZCBjb21wYXQuaCB3ZXJlIGNyZWF0ZWQuCgogICopIG1vZF9tbWFwX3N0YXRpYyB3aWxsIG5vIGxvbmdlciB0YWtlIGFjdGlvbiBvbiByZXF1ZXN0cyB1bmxlc3MgYXQgCiAgICAgbGVhc3Qgb25lICJtbWFwZmlsZSIgZGlyZWN0aXZlIGlzIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIAogICAgIFRoaXMgZXhwZXJpbWVudGFsIG1vZHVsZSBoYXMgdG8gZG8gc29tZSBibGFjayBtYWdpYyB0byBvcGVyYXRlIAogICAgIGluc2lkZSB0aGUgY3VycmVudCBBUEkgYW5kIHRodXMgY3JlYXRlcyBzaWRlLWVmZmVjdHMgZm9yIG90aGVyIAogICAgIG1vZHVsZXMgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogCiAgKikgQWRkIGNvbnNlcnZhdGl2ZSB0aWNrcyBhcm91bmQgbW9yZSBlZ3JlcCBhcmd1bWVudHMgaW4gdG9wLWxldmVsIGNvbmZpZ3VyZQogICAgIHRvIGF2b2lkIHByb2JsZW1zIHVuZGVyIGJyYWluLWRlYWQgcGxhdGZvcm1zIGxpa2UgRGlnaXRhbCBVTklYIChPU0YxKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjU5NgoKICAqKSBtb2RfcmV3cml0ZSBjcmVhdGVkIFJld3JpdGVMb2NrIGZpbGVzIHVuZGVyIHRoZSBVSUQgb2YgdGhlIHBhcmVudAogICAgIHByb2Nlc3MsIHRodXMgdGhlIGNoaWxkIHByb2Nlc3NlcyBoYWQgbm8gd3JpdGUgYWNjZXNzIHRvIHRoZSBmaWxlcy4KICAgICBOb3cgYSBjaG93bigpIGlzIGRvbmUgb24gdGhlIGZpbGUgdG8gdGhlIHVpZCBvZiB0aGUgY2hpbGRyZW4sCiAgICAgaWYgYXBwbGljYWJsZS4gIFtMYXJzIEVpbGVicmVjaHQsIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzNDEKCiAgKikgQXV0b2dlbmVyYXRlIHNvbWUgSEFWRV9YWFhYWF9IIGRlZmluZXMgaW4gY29uZl9hdXRvLmggKGRldGVybWluZWQgdmlhCiAgICAgVGVzdENvbXBpbGUpIGluc3RlYWQgb2YgZGVmaW5pbmcgdGhlbSBtYW51YWxseSBpbiBjb25mLmggYmFzZWQgb24gbGVzcwogICAgIGFjY3VyYXRlIHBsYXRmb3JtIGRlZmluaXRpb25zLiAgVGhpcyB3YXkgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gZmlkZGxlIHdpdGgKICAgICBPUy10eXBlIGFuZC9vciBPUy12ZXJzaW9uIGlkZW50aWZpZXJzIHRvIGRpc2NvdmVyIHdoZXRoZXIgYSBzeXN0ZW0gaGVhZGVyCiAgICAgZmlsZSBleGlzdHMgb3Igbm90LiAgSW5zdGVhZCB3ZSBub3cgZGlyZWN0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YKICAgICB0aG9zZSBlc290ZXJpYyBvbmVzLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjA5MywgUFIjMjM2MSwgUFIjMjM3NywgUFIjMjQzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIjMjUyNCwgUFIjMjUyNSwgUFIjMjUzMywgUFIjMjU2OQoKICAqKSBtb2Rfc2V0ZW52aWYgKEJyb3dzZXJNYXRjaCogYW5kIGZyaWVuZHMpIHdpbGwgbm93IG1hdGNoIGEgbWlzc2luZwogICAgIGZpZWxkIHdpdGggIl4kIi4gIFtLZW4gQ29hcl0KCiAgKikgU2V0IHRoZSBSVExEX0dMT0JBTCBkbG9wZW4gbW9kZSBwYXJhbWV0ZXIgdG8gYWxsb3cgZHluYW1pY2FsbHkgbG9hZGVkCiAgICAgbW9kdWxlcyB0byBsb2FkIHRoZWlyIG93biBtb2R1bGVzIGR5bmFtaWNhbGx5LiAgVGhpcyBpbXByb3ZlcyBtb2RfcGVybAogICAgIGFuZCBtb2RfcGhwMyB3aGVuIHRoZXNlIG1vZHVsZXMgYXJlIGxvYWRlZCBkeW5hbWljYWxseSBpbnRvIEFwYWNoZS4KICAgICBbUmFzbXVzIExlcmRvcmZdCgogICopIENhY2hlIGEgcHJveGllZCByZXF1ZXN0IGluIHRoZSBldmVudCB0aGF0IHRoZSBjbGllbnQgY2FuY2VscyB0aGUKICAgICB0cmFuc2ZlciwgcHJvdmlkZWQgdGhhdCB0aGUgY29uZmlndXJlZCBwZXJjZW50YWdlIG9mIHRoZSBmaWxlIGhhcwogICAgIGFscmVhZHkgYmVlbiB0cmFuc2ZlcmVkLiBJdCB3b3JrcyBmb3IgSFRUUCB0cmFuc2ZlcnMgb25seS4gIFRoZSAKICAgICBuZXcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgY2FsbGVkIENhY2hlRm9yY2VDb21wbGV0aW9uLiAKICAgICBbR2xlbiBQYXJrZXIgPGdsZW5lYm9iQG53bGluay5jb20+XSBQUiMyMjc3CgogICopIEFkZCB0aGUgIjwhRE9DVFlQRSBIVE1MIiBtYWdpYyBjb29raWUgdXNlZCBieSBtb2Rlcm4gZG9jdW1lbnRzIChhbmQKICAgICByZXF1aXJlZCBieSBIVE1MIDMuMiBhbmQgbGF0ZXIpIHRvIG1vZF9taW1lX21hZ2ljJ3MgY29uZi9tYWdpYy4KICAgICBbQW5uYSBTaGVyZ29sZCA8YW5uYUBpbmV4dC5jby51az5dCgogICopIEZpeCB5ZXQgYW5vdGhlciBzaWduYWwtYmFzZWQgcmFjZSBjb25kaXRpb24gaW52b2x2aW5nIG5lc3RlZCB0aW1lcnMuCiAgICAgU2lnbmFscyBzdWNrLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBzdWV4ZWMncyBlcnJvciBtZXNzYWdlcyBoYXZlIGJlZW4gY2xhcmlmaWVkIGEgbGl0dGxlIGJpdC4gIFtLZW4gQ29hcl0KCiAgKikgQ2xlYW4gdXAgc29tZSwgYnV0IHBlcmhhcHMgbm90IGFsbCwgOC1iaXQgY2hhcmFjdGVyIHNldCBwcm9ibGVtcwogICAgIHdpdGggY29uZmlnIGZpbGUgcGFyc2luZywgYW5kIFVSTCBwYXJzaW5nLiAgV2Ugbm93IGRlZmluZQogICAgIGFwX2lzZGlnaXQoKSwgYXBfaXN1cHBlcigpLCAuLi4gd2hpY2ggY2FzdCB0byBhbiAodW5zaWduZWQgY2hhcikuCiAgICAgVGhpcyBzaG91bGQgd29yayBvbiBtb3N0IG1vZGVybiB1bml4ZXMuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM4MDAsIDIyODIsIDI1NTMgIChhbmQgb3RoZXJzKQoKICAqKSBUaGUgImhhbmRsZXIgbm90IGZvdW5kIiBlcnJvciB3YXMgaXNzdWVkIGluIGNhc2VzIHdoZXJlIHRoZSBoYW5kbGVyCiAgICAgcmVhbGx5IGRpZCBleGlzdCwgYnV0IHdhcyBqdXN0IGRlY2xpbmluZyB0byBzZXJ2ZSB0aGUgcmVxdWVzdC4KICAgICBbSm9obiBWYW4gRXNzZW4gPGp2ZUBnYW1lcnMub3JnPl0gUFIjMjUyOQoKICAqKSBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIFNDTzUgKE9wZW5TZXJ2ZXIgNS4wLngpLgogICAgIFtSb25hbGQgUmVjb3JkIDxyckBzY28uY29tPl0gUFIjMjUzMwoKICAqKSBUaGUgQVBBQ0kgbGliZXhlY2RpciB3YXMgbm90IGV4dGVuZGVkIHdpdGggYW4gImFwYWNoZS8iIHN1YmRpcgogICAgIGlmIHRoZSBpbnN0YWxsYXRpb24gcHJlZml4IGRpZG4ndCBhbHJlYWR5IGNvbnRhaW4gImFwYWNoZSIsIGJ1dAogICAgIGl0IHNob3VsZCBiZSBiZWNhdXNlIHRoZSBEU08gZmlsZXMgYXJlIEFwYWNoZS1zcGVjaWZpYy4gIE5vdwogICAgIGxpYmV4ZWNkaXIgaXMgdHJlYXRlZCB0aGUgc2FtZSB3YXkgc3lzY29uZmRpciwgZGF0YWRpciwgbG9jYWxzdGF0ZWRpcgogICAgIGFuZCBpbmNsdWRlZGlyIGFyZSBhbHJlYWR5IHRyZWF0ZWQuCiAgICAgW0NoYXJsZXMgTGV2ZXJ0IDxjaGFybGVzQGNvbW0ucG9seW10bC5jYT5dIFBSIzI1NTEKCiAgKikgVGhlIDxMaW1pdD4gcGFyc2luZyByb3V0aW5lIHdhcyBpbmNvcnJlY3RseSB0cmVhdGluZyBtZXRob2RzIGFzCiAgICAgY2FzZS1pbnNlbnNpdGl2ZS4gIFtLZW4gQ29hcl0KCiAgKikgVGhlIGFwX2JwcmludGYoKSBjb2RlIG5lZ2xlY3RlZCB0byB0ZXN0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvbgogICAgIHRoZSBjb25uZWN0aW9uLiAgYXBfYmZsdXNoKCkgbWlzZGlhZ25vc2VkIGEgZmFpbHVyZSBhcyBhIHN1Y2Nlc3MuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBhZGQgc3VwcG9ydCBmb3IgI3BlcmwgYXJnIGludGVycG9sYXRpb24gaW4gbW9kX2luY2x1ZGUKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBBUEk6IE5hbWUgY2hhbmdlcyBvZiB0YWJsZV9lbHRzIHRvIGFwX3RhYmxlX2VsdHMsIGlzX3RhYmxlX2VtcHR5CiAgICAgdG8gYXBfaXNfdGFibGVfZW1wdHkgYW5kIGJnZXRmbGFnIHRvIGFwX2JnZXRmbGFnLiBbQmVuIExhdXJpZV0KCiAgKikgUE9SVDogQWRkIFVuaXhXYXJlIDcgc3VwcG9ydAogICAgIFtWYWRpbSBLb3N0b2dsb2RvZmYgPHZhZGltQG9sbHkucnU+XSBQUiMyNDYzCgogICopIEZpeCB0aGUgR3Vlc3MtRFNPLWZsYWdzLWZyb20tUGVybCBzdHVmZiBpbiBzcmMvQ29uZmlndXJlOiAicGVybCIgd2FzCiAgICAgdXNlZCBpbnN0ZWFkIG9mICIkUEVSTCIgd2hpY2ggY29udGFpbnMgdGhlIGNvcnJlY3RseSBkZXRlcm1pbmVkIFBlcmwKICAgICBpbnRlcnByZXRlciAoaW1wb3J0YW50IGZvciBpbnN0YW5jZSBvbiBzeXN0ZW1zIHdoZXJlICJwZXJsIiBhbmQgInBlcmw1IgogICAgIGV4aXN0cywgbGlrZSBCU0RJIG9yIEZyZWVCU0QsIGV0YykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1MDUKCiAgKikgTW92ZSB0aGUgaW5pdGlhbCBzdUVYRUMtcmVsYXRlZCBzdGFydHVwIG1lc3NhZ2UgZnJvbSBwbGFpbgogICAgIGZwcmludGYoKS9zdGRlcnIgdG8gYSBkZWxheWVkIGFwX2xvZ19lcnJvcigpLWJhc2VkIG9uZSB0byBhdm9pZCBwcm9ibGVtcwogICAgIHdoZW4gQXBhY2hlIGlzIHN0YXJ0ZWQgZnJvbSBpbmV0ZCAoaW5zdGVhZCBvZiBzdGFuZGFsb25lKS4gVW5kZXIgdGhpcwogICAgIHNpdHVhdGlvbiBzdGFydHVwIG1lc3NhZ2VzIG9uIHN0ZGVyciBsZWFkIHRvIHByb2JsZW1zICh0aGUgbGluZSBpcyBzZW50CiAgICAgdG8gdGhlIGNsaWVudCBpbiBmcm9udCBvZiB0aGUgcmVxdWVzdGVkIGRvY3VtZW50KS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjODcxLCBQUiMxMzE4CgogICopIEFkZCBhIGZsYWcgc28gYXBfZm5tYXRjaCgpIGNhbiBiZSB1c2VkIGZvciBjYXNlLWJsaW5kIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgW0tlbiBDb2FyLCBEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IERvbid0IGNvbGxhcHNlIG11bHRpcGxlIHNsYXNoZXMgaW4gUEFUSF9JTkZPLgogICAgIFtCZW4gTGF1cmllLCBCaWxsIFN0b2RkYXJkIDx3Z3N0b2RkYUB1cy5pYm0uY29tPl0gUFIjMjI3NAoKICAqKSBXSU4zMiBTRUNVUklUWTogRWxpbWluYXRlIHRyYWlsaW5nICIuInMgaW4gcGF0aCBjb21wb25lbnRzLiBUaGVzZSBhcmUKICAgICBpZ25vcmVkIGJ5IHRoZSBXaW5kb3dzIGZpbGVzeXN0ZW0sIGFuZCBzbyBjYW4gYmUgdXNlZCB0byBieXBhc3Mgc2VjdXJpdHkuCiAgICAgW0JlbiBMYXVyaWUsIEFsZXhlaSBLb3N1dF0uCgogICopIFdlIG5vdyBhdHRlbXB0IHRvIGR1bXAgY29yZSB3aGVuIHdlIGdldCBTSUdJTEwuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQT1JUOiByZW1vdmUgYnJva2VuIHRlc3QgZm9yIE1BUF9GSUxFIGluIGh0dHBfbWFpbi5jLgogICAgIFtXaWxmcmVkbyBTYW5jaGV6IDx3c2FuY2hlekBhcHBsZS5jb20+XQoKICAqKSBQT1JUOiBDaGFuZ2Ugc3VwcG9ydC9hcGFjaGVjdGwgdG8gdXNlICJraWxsIC0wICRwaWQiIHRvIHRlc3QgaWYgdGhlCiAgICAgaHR0cGQgaXMgcnVubmluZy4gIFRoaXMgc2hvdWxkIGJlIG1vcmUgcG9ydGFibGUgdGhhbiBmaWd1cmluZyBvdXQKICAgICB3aGljaCBvZiB0aHJlZSBkb3plbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgInBzIiBhcmUgaW5zdGFsbGVkLgogICAgIFthIGNhc3Qgb2YgZG96ZW5zXQoKICAqKSBXSU4zMjogSWYgd2UgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gZXhlY3V0ZSBhIGZpbGUgaW4gYSBzY3JpcHQKICAgICBkaXJlY3RvcnksIGJhaWwgb3V0IG9mIHRoZSByZXF1ZXN0IHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFtXIEcgU3RvZGRhcmRdCgogICopIFdJTjMyIFNFQ1VSSVRZOiBFbGltaW5hdGUgZGlyZWN0b3JpZXMgY29uc2lzdGluZyBvZiB0aHJlZSBvciBtb3JlIGRvdHM7CiAgICAgdGhlc2UgYXJlIHRyZWF0ZWQgYnkgV2luMzIgYXMgaWYgdGhleSBhcmUgIi4uIiBidXQgYXJlIG5vdCBkZXRlY3RlZCBieQogICAgIG90aGVyIG1hY2hpbmVyeSB3aXRoaW4gQXBhY2hlLiBUaGlzIGlzIHNvbWV0aGluZyBvZiBhIGtsdWRnZSBidXQKICAgICBlbGltaW5hdGVzIGEgc2VjdXJpdHkgaG9sZS4gW01hbm9qIEthc2ljaGFpbnVsYSwgQmVuIExhdXJpZV0KCiAgKikgTW92ZSBhcF9lc2NhcGVfcXVvdGVzKCkgZnJvbSBzcmMvYXAgdG8gc3JjL21haW4vdXRpbC5jOyBpdCB1c2VzCiAgICAgcG9vbHMgYW5kIHRodXMgcG9sbHV0ZXMgbGliYXAgKHVudGlsIHRoZSBwb29sIHN0dWZmIGlzIG1vdmVkIHRoZXJlKS4KICAgICBbS2VuIENvYXJdCgogICopIEluZGV4SWdub3JlIHNob3VsZCBiZSBjYXNlLWJsaW5kIG9uIFdpbjMyIChhbmQgYW55IG90aGVyIGNhc2UtYXdhcmUKICAgICBidXQgY2FzZS1pbnNlbnNpdGl2ZSBwbGF0Zm9ybXMpLiAgTmV3ICNkZWZpbmUgZm9yIHRoaXMgYWRkZWQgdG8gY29uZi5oCiAgICAgKENBU0VfQkxJTkRfRklMRVNZU1RFTSkuICBbS2VuIENvYXJdIFBSIzI0NTUKCiAgKikgRW5hYmxlIERTTyBzdXBwb3J0IGZvciBPcGVuQlNEIGluIGdlbmVyYWwsIG5vdCBvbmx5IGZvciAyLngsIGJlY2F1c2UgaXQKICAgICBhbHNvIHdvcmtzIGZvciBPcGVuQlNEIDEueC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEZpeCBjb21waWxhdGlvbiBwcm9ibGVtIG9uIEFSTSBMaW51eC4KICAgICBbU2FtIEtpbmd0b24gPHNhbUBpbGx1bWluYXRlZC5jby51az5dIFBSIzI0NDMKCiAgKikgTGV0IEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCBkZXRlcm1pbmUgc29tZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAoR3JvdXAsIFBvcnQsIFNlcnZlckFkbWluLCBTZXJ2ZXJOYW1lKSB2aWEgc29tZSBpbnRlbGxpZ2VudCB0ZXN0cyB0bwogICAgIHJlbW92ZSBzb21lIG9mIHRoZSBjbGFzc2ljYWwgaHVyZGxlcyBmb3IgbmV3IHVzZXJzIHdoZW4gc2V0dGluZyB1cAogICAgIEFwYWNoZS4gVGhpcyBpcyBkb25lIHBlciBkZWZhdWx0IGJlY2F1c2UgaXQgaXMgdXNlZnVsIGZvciB0aGUgYXZlcmFnZQogICAgIHVzZXIuIFBhY2thZ2UgYXV0aG9ycyBjYW4gdXNlIHRoZSAtLXdpdGhvdXQtY29uZmFkanVzdCBvcHRpb24gdG8gZGlzYWJsZQogICAgIHRoZXNlIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIGFuIEVYVFJBX0RFUFMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHVzZWQKICAgICB0byBhZGQgYW4gZXh0cmEgTWFrZWZpbGUgZGVwZW5kZW5jeSBmb3IgdGhlIGh0dHBkIHRhcmdldCwgZm9yIGluc3RhbmNlCiAgICAgdG8gZXh0ZXJuYWwgdGhpcmQtcGFydHkgbGlicmFyaWVzLCBldGMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCA8SWZEZWZpbmU+Li48L0lmRGVmaW5lPiBzZWN0aW9ucyB0byB0aGUgY29yZSBtb2R1bGUgKHdpdGggc2FtZSBzcGlyaXQKICAgICBhcyA8SWZNb2R1bGU+Li48L0lmTW9kdWxlPiBzZWN0aW9ucykgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2tpcCBvciBwcm9jZXNzCiAgICAgY29udGFpbmVkIGNvbW1hbmRzIGRlcGVuZGVuZCBvZiBgYC1EIFBBUkFNRVRFUicnIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQKICAgICBsaW5lLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgbG9naWNhbCBjb25kaXRpb25zIGxpa2UgPElmRGVmaW5lCiAgICAgUmV2ZXJzZVByb3h5PiBpbnN0ZWFkIG9mIHBoeXNpY2FsbHkgb25lcyAoZS5nLiA8SWZNb2R1bGUgbW9kX3Byb3h5LmM+KQogICAgIGFuZCB0aHVzIGVzcGVjaWFsbHkgY2FuIGJlIHVzZWQgZm9yIGNvbmRpdGlvbmFsbHkgbG9hZGluZyBEU08tYmFzZWQKICAgICBtb2R1bGVzIHZpYSBMb2FkTW9kdWxlLCBldGMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBjbGVhbiB1cCBhIHdhcm5pbmcgaW4gbW9kX3N0YXR1cyBmb3IgT1MvMi4gIFtCcmlhbiBIYXZhcmRdCgogICopIE1ha2UgdGFibGUgZWxlbWVudHMgY29uc3QuIFRoaXMgbWF5IHByZXZlbnQgb2JzY3VyZSBlcnJvcnMuIFtCZW4gTGF1cmllXQoKICAqKSBGaXggcGFyc2luZyBvZiBGVFAgYFNJWkUnIHJlc3BvbnNlcyBpbiBwcm94eSBtb2R1bGU6IFRoZSBuZXdsaW5lIHdhcyBub3QKICAgICB0cnVuY2F0ZWQgd2hpY2ggZm9yY2VkIGZvbGxvd2luZyBIVFRQIGhlYWRlcnMgdG8gYmUgZGF0YSBpbiB0aGUgSFRUUAogICAgIHJlcG9uc2UuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBDaGFybGVzIEZ1IDxjY3dmQGJhY2NodXMuY29tPl0gCiAgICAgUFIjMjQxMiwgMjM2NwoKICAqKSBQb3J0YWJpbGl0eSBmaXggZm9yIEFQQUNJIHNoYWRvdyB0cmVlIHN1cHBvcnQ6IFN3YXAgb3JkZXIgb2YgYXdrIGFuZCBzZWQKICAgICBpbiB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBhdm9pZCBzZWQgZmFpbHMgb24gc29tZSBwbGF0Zm9ybXMgKGZvcgogICAgIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUgbm9uLW5ld2xpbmUtdGVybWluZWQKICAgICBvdXRwdXQgb2YgQXdrLiBbQmlsbCBIb3VsZSA8YmhvdWxlQHNhbmRpZWdvY2EubmNyLmNvbT5dIFBSIzI0MzUKCiAgKikgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBkaXJlY3RvcnkgbGlzdGluZ3MgKG1vZF9hdXRvaW5kZXgpIGJ5IGNvbXBhcmluZwogICAgIGludGVnZXIga2V5cyAobGFzdC1tb2RpZmllZCBhbmQgc2l6ZSkgYXMgaW50ZWdlcnMgcmF0aGVyIHRoYW4gY29udmVydGluZwogICAgIHRoZW0gdG8gc3RyaW5ncyBmaXJzdC4gIEFsc28gdXNlIGEgc2V0IG9mIGV4cGxpY2l0IGJ5dGUgdGVzdHMgcmF0aGVyCiAgICAgdGhhbiBzdHJjbXAoKSB0byBjaGVjayBmb3IgcGFyZW50IGRpcmVjdG9yeS1uZXNzIG9mIGFuIGVudHJ5LiAgT2gsIGFuZAogICAgIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGRpcmVjdG9yeSAoaWYgZGlzcGxheWVkKSBpcyAqYWx3YXlzKiBsaXN0ZWQgZmlyc3QKICAgICByZWdhcmRsZXNzIG9mIHRoZSBzb3J0IGtleS4gIE92ZXJhbGwgcGVyZm9ybWFuY2Ugd2lubmFnZSBzaG91bGQgYmUgZ29vZAogICAgIGluIENQVSB0aW1lLCBpbnN0cnVjdGlvbiBjYWNoZSwgYW5kIG1lbW9yeSB1c2FnZSwgcGFydGljdWxhcmx5IGZvciBsYXJnZQogICAgIGRpcmVjdG9yaWVzLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSB0aW55IGJ1dCB1c2VmdWwgZ29vZHkgdG8gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0OiBUaGUgZ2VuZXJhdGlvbgogICAgIG9mIGEgY29uZmlnLnN0YXR1cyBzY3JpcHQgKGFzIEdOVSBBdXRvY29uZiBkb2VzKSB3aGljaCByZW1lbWJlcnMgdGhlIHVzZWQKICAgICBjb25maWd1cmUgY29tbWFuZCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uZmlndXJhdGlvbiBieQogICAgIGp1c3QgcmUtcnVubmluZyB0aGlzIHNjcmlwdCBvciBmb3IgcmVtZW1iZXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gYmV0d2VlbgogICAgIHJlbGVhc2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgaHR0cGQgLXQgKHRlc3QpIG9wdGlvbiBmb3IgcnVubmluZyBjb25maWd1cmF0aW9uIHN5bnRheCB0ZXN0cyBvbmx5LgogICAgIElmIHNvbWV0aGluZyBpcyBicm9rZW4gaXQgY29tcGxhaW5zIGFuZCBleGl0cyB3aXRoIGEgcmV0dXJuIGNvZGUKICAgICBub24tZXF1YWwgdG8gMC4gVGhpcyBjYW4gYmUgdXNlZCBtYW51YWxseSBieSB0aGUgdXNlciB0byBjaGVjayB0aGUgQXBhY2hlCiAgICAgY29uZmlndXJhdGlvbiBhZnRlciBlZGl0aW5nIGFuZCBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgdXNlZCBieSBhcGFjaGVjdGwKICAgICBvbiAoZ3JhY2VmdWwpIHJlc3RhcnQgY29tbWFuZCB0byBtYWtlIHN1cmUgQXBhY2hlIGRvZXNuJ3QgZGllIG9uIHJlc3RhcnRzCiAgICAgYmVjYXVzZSBvZiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgbm93IGJyb2tlbiBzaW5jZSB0aGUgbGFzdCAocmUpc3RhcnQuCiAgICAgVGhpcyB3YXkgYGFwYWNoZWN0bCByZXN0YXJ0JyBjYW4gYmUgdXNlZCBpbnNpZGUgY3JvbmpvYnMgd2l0aG91dCBoYXZpbmcKICAgICB0byBleHBlY3QgQXBhY2hlIHRvIGJlIGZhbGxpbmcgZG93bi4gQWRkaXRpb25hbGx5IHRoZSBodHRwZCAtdCBjYW4gYmUgcnVuCiAgICAgdmlhIGBhcGFjaGVjdGwgY29uZmlndGVzdCcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzOTMKICAKICAqKSBNaW5vciBkaXNwbGF5IGZpeCBmb3IgImluc3RhbGwiIHRhcmdldCBvZiB0b3AtbGV2ZWwgTWFrZWZpbGU6CiAgICAgdGhlIGRpc3BsYXllZCBpbnN0YWxsYXRpb24gY29tbWFuZCB3YXMgaW5jb3JyZWN0IGFsdGhvdWdoIHRoZQogICAgIGV4ZWN1dGVkIGNvbW1hbmQgd2FzIGNvcnJlY3QuIE5vdyB0aGV5IGFyZSBpbiBzeW5jLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNDAyCgogICopIENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGUgYGFsbG93ZWRfZ2xvYmFscycgaW4gaHR0cF9tYWluLmMKICAgICBbSnVzdGluIEJyYWRmb3JkIDxqdXN0aW5AdWthbnMuZWR1Pl0gUFIjMjQwMAoKICAqKSBBcGFjaGUgd291bGQgaW5jb3JyZWN0bHkgZG93bmNhc2UgdGhlIGVudGlyZSBDb250ZW50LVR5cGUgcGFzc2VkIGZyb20KICAgICBDR0lzLiAgVGhpcyBhZmZlY3RlZCBzZXJ2ZXItcHVzaCBzY3JpcHRzIGFuZCBzdWNoIHdoaWNoIHVzZQogICAgIG11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7Ym91bmRhcnk9VGhpc1JhbmRvbVN0cmluZy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzIzOTQKCiAgKikgUE9SVDogUU5YIHVwZGF0ZSB0byBwcm9wZXJseSBndWVzcyAzMi1iaXQgc3lzdGVtcy4KICAgICBbU2VhbiBCb3VkcmVhdSA8c2VhbmJAcW54LmNvbT5dIFBSIzIzOTAKCiAgKikgTWFrZSBzdXJlIHRoZSBEU08gZW11bGF0aW9uIGNvZGUgZm9yIEhQVVggZmluZHMgdGhlIHByb3ByaWV0YXJ5IHNobF94eHgoKQogICAgIGZ1bmN0aW9ucyB3aGljaCBhcmUgaW4gbGliZGxkIHVuZGVyIEhQVVggOS8xMC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjM3OAoKICAqKSBNYWtlIHN1cmUgdGhlICJpbnN0YWxsIiB0YXJnZXQgb2YgdGhlIHRvcC1sZXZlbCBNYWtlZmlsZSBkb2Vzbid0IGJyZWFrCiAgICAgYmVjYXVzZSBvZiBhIHJldHVybiBjb2RlIG9mIDEgZnJvbSBhbiAiaWYiIChmb3IgaW5zdGFuY2UgdW5kZXIgYnJhaW5kZWFkCiAgICAgVWx0cml4IHRoZSByZXN1bHQgY29kZSBvZiBhbiAiaWYiIGNvbnN0cnVjdCBpcyAxIGlmIHRoZSAidGhlbiIgY2xhdXNlCiAgICAgZGlkbid0IG1hdGNoKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBhbiBhZGRpdGlvbmFsICJkdW1teSIgdGFyZ2V0IHRvIHRoZSAiJChMSUIpIiB0YXJnZXQgaW4gZ2VuZXJhdGVkCiAgICAgbW9kdWxlcy94eHgvTWFrZWZpbGUncyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIFNWUjQgTWFrZSB1bmRlciAiZnVsbC1EU08iCiAgICAgc2l0dWF0aW9uIChubyBsaWJ4eHguYSBidWlsdCwgb25seSBtb2RfeHh4LnNvJ3MpIHdoZXJlIExJQiBhbmQgT0JKUyBhcmUKICAgICBlbXB0eS4gW1JhbGYgUy4gRW5nZWxzY2hhbGwsIERlYW4gR2F1ZGV0LCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVwbGFjZSB0d28gYmFkIHNwcmludGYoKSBjYWxscyB3aXRoIGFwX3NucHJpbnRmKCkgdmFyaWFudHMgaW4KICAgICBtb2RfcmV3cml0ZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBtaXNzaW5nIHVzYWdlIGRlc2NyaXB0aW9uIGZvciBNZXRhRmlsZXMgZGlyZWN0aXZlLgogICAgIFtEYXZpZCBNYWNLZW56aWUgPGRqbUB2YS5wdWJuaXguY29tPl0gUFIjMjM4NAoKICAqKSBtb2RfbG9nX2NvbmZpZyB3b3VsZG4ndCBsZXQgdmhvc3RzIHVzZSBsb2cgZm9ybWF0cyBkZWZpbmVkIGluIHRoZQogICAgIG1haW4gc2VydmVyLiAgW0NocmlzdG9mIERhbWlhbiA8ZGFtaWFuQG1lZGlhY29uc3VsdC5jb20+XSBQUiMyMDkwCgogICopIG1vZF91c2VydHJhY2sgd2FzIGNvcnJ1cHRpbmcgdGhlIGNsaWVudCBob3N0bmFtZS4gIEFzIHBhcnQgb2YgdGhlCiAgICAgZml4LCB0aGUgY29va2llIHZhbHVlcyB3ZXJlIHNsaWdodGx5IGV4dGVuZGVkIHRvIGluY2x1ZGUgdGhlCiAgICAgZnVsbHkgcXVhbGlmaWVkIGhvc3RuYW1lIG9mIHRoZSBjbGllbnQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMyMTkwLCAyMjI5LCAyMzY2CgogICopIEZpeCBhIHR5cG8gaW4gcG9vbCBkZWJ1Z2dpbmcgY29kZS4gIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgbW9kX3VuaXF1ZV9pZCBkaWQgbm90IHdvcmsgb24gYWxwaGEgbGludXggKGluIGdlbmVyYWwgb24gYW55CiAgICAgYXJjaGl0ZWN0dXJlIHRoYXQgaGFzIDY0LWJpdCB0aW1lX3QpLgogICAgIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgUE9SVDogTWFrZSBTQ08gNSAoYW5kIHByb2JhYmx5IDMpIGNvbXBpbGUgYWdhaW4uIFtCZW4gTGF1cmllXQoKICAqKSBQT1JUOiBOQ1IgTVBSQVMgc3lzdGVtcyBoYXZlIHRoZSBzYW1lIGJ1ZyB3aXRoIFNJR0hVUCByZXN0YXJ0IHRoYXQKICAgICBTb2xhcmlzIHN5c3RlbXMgZXhwZXJpZW5jZS4gIFNvIGRlZmluZSBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHLgogICAgIFtLbGF1cyBXZWJlciA8a3dlYmVyQGNoZXBocmVuLmdlcm1hbnkubmNyLmNvbT5dIFBSIzE5NzMKCiAgKikgQ2hhbmdlICJPcHRpb25zIE5vbmUiIHRvICJPcHRpb25zIEZvbGxvd1N5bUxpbmtzIiBpbiB0aGUgCiAgICAgPERpcmVjdG9yeSAvPiBzZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGFjY2Vzcy5jb25mLWRpc3QKICAgICAoYW5kIC13aW4gZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXR0ZXIgdGhlcmUpLiAgVGhpcyBoYXMgYmV0dGVyCiAgICAgcGVyZm9ybWFuY2UsIGFuZCBtb3JlIGludHVpdGl2ZSBzZW1hbnRpY3MuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFVwZGF0ZWQgc3VwcG9ydCBmb3IgVVRTIDIuMS4yLgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMjMyMAoKICAqKSBGaXggc3ltYm9sIGV4cG9ydCBsaXN0IChzcmMvc3VwcG9ydC9odHRwZC5leHApIGFmdGVyIHJlY2VudAogICAgIEFQSSBjaGFuZ2VzIGluIHRoZSBjaGlsZCBzcGF3bmluZyBhcmVhLgogICAgIFtKZW5zLVV3ZSBNYWdlciA8anVtQGhlbGlvcy5kZT5dCgogICopIFdvcmthcm91bmQgZm9yIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG9sZCBgdGVzdCcgY29tbWFuZHMgd2hpY2ggZG8gbm90CiAgICAgc3VwcG9ydCB0aGUgLXggZmxhZyAoZm9yIGluc3RhbmNlIHVuZGVyIHBsYXRmb3JtcyBsaWtlIFVsdHJpeCkuIFRoaXMgaXMKICAgICBzb2x2ZWQgYnkgYW5vdGhlciBoZWxwZXIgc2NyaXB0IGZpbmRwcmcuc2ggd2hpY2ggc2VhcmNoZXMgZm9yIFBlcmwgYW5kCiAgICAgQXdrIGxpa2UgUHJpbnRQYXRoIGJ1dCBfdmlhIGRpZmZlcmVudCBuYW1lc18uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZSB0aGUgc3lzdGVtKCkgY2FsbCBmcm9tIGh0cGFzc3dkLmMsIHdoaWNoIGVsaW1pbmF0ZXMgYSBzeXN0ZW0KICAgICBkZXBlbmRhbmN5LiAgWyJNLkQuUGFya2VyIiA8bWRwY0BuZXRjb20uY29tPl0gUFIjMjMzMgoKICAqKSBQT1JUOiBGaXggY29tcGlsYXRpb24gZmFpbHVyZXMgb24gTkVYVFNURVAuCiAgICAgW1JleCBEaWV0ZXIgPHJkaWV0ZXJAbWF0aC51bmwuZWR1Pl0gUFIjMjI5MywgMjMxNgoKICAqKSBQT1JUOiBGX05ERUxBWSBpcyBhIHR5cG8sIHNob3VsZCBoYXZlIGJlZW4gRk5ERUxBWS4gIFRoZXJlJ3MgYWxzbwogICAgIE9fTkRFTEFZIG9uIHZhcmlvdXMgc3lzdGVtcy4gIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMjMxMwoKICAqKSBQT1JUOiBoZWxwZXJzL0d1ZXNzT1MgdXBkYXRlcyBmb3IgdmFyaW91cyB2ZXJzaW9ucyBmb3IgTkNSIFNWUjQuCiAgICAgW2p1ZXJnIHNjaHJlaW5lciA8ai5zY2hyZWluZXJAemguY2g+LAogICAgIEJpbGwgSG91bGUgPEJpbGwuSG91bGVAU2FuRGllZ29DQS5OQ1IuQ09NPl0gUFIjMjMxMAoKICAqKSBGaXggcmVjZW50bHkgaW50cm9kdWNlZCBXaW4zMiBjaGlsZCBzcGF3bmluZyBjb2RlIGluIG1vZF9yZXdyaXRlLmMgd2hpY2gKICAgICB3YXMgYnJva2VuIGJlY2F1c2Ugb2YgaW52YWxpZCBhcF9wc3RyY2F0KCkgLT4gc3RyY2F0KCkgdHJhbnNmb3JtYXRpb24uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFByb3h5IENhY2hlIEZpeGVzOiBhY2NvdW50IGZvciBkaXJlY3Rvcnkgc2l6ZXMsIGZvcmsgb2ZmIGdhcmJhZ2UgY29sbGVjdGlvbgogICAgIHRvIGNvbnRpbnVlIGluIGJhY2tncm91bmQsIHVzZSBwcmVkZWZpbmVkIHR5cGVzIChvZmZfdCwgc2l6ZV90LCB0aW1lX3QpLAogICAgIGxvZyB0aGUgY3VycmVudCBjYWNoZSB1c2FnZSBwZXJjZW50YWdlIGF0IExvZ0xldmVsIGRlYnVnCiAgICAgW01hcnRpbiBLcmFlbWVyLCBiYXNlZCBvbiBkaXNjdXNzaW9uIGJldHdlZW4gRGVhbiBHYXVkZXQgJiBEaXJrIHZhbkd1bGlrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuMAoKICAqKSBVc2luZyBhIHR5cGUgbWFwIGZpbGUgYXMgYSBjdXN0b20gZXJyb3IgZG9jdW1lbnQgd2FzIG5vdCBwb3NzaWJsZS4KICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiMxMDMxCgogICopIEF2b2lkIHByb2JsZW1zIHdpdGggYnJhaW5kZWFkIEF3a3MgYnkgYWRkaXRpb25hbGx5IHNlYXJjaGluZyBmb3IgZ2F3ayAKICAgICBhbmQgbmF3ayBpbiBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQuCiAgICAgW0RhdmUgRHlrc3RyYSA8ZHdkQGJlbGwtbGFicy5jb20+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzE5CgogICopIFJlbmFtZSBtZDUuaCB0byBhcF9tZDUuaCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBuYXRpdmUgTUQ1IG9uCiAgICAgc29tZSBzeXN0ZW1zLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQ2hhbmdlIHVzYWdlIG9mIHBlcnJvcigpK2ZwcmludGYoc3RkZXJyLC4uLikgaW4gbW9kX3Jld3JpdGUgdG8KICAgICBtb3JlIHByb3BlciBhcF9sb2dfZXJyb3IoKSB2YXJpYW50cy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBmb3IgdGhlIC0tYWRkLW1vZHVsZSBvcHRpb24gdG8gQVBBQ0kncyBjb25maWd1cmUKICAgICBzY3JpcHQgaXMgb2YgdHlwZSBbcGF0aC90by9dbW9kX3h4eC5jIGJlY2F1c2UgYWxsIGNhbGN1bGF0aW9ucyBpbnNpZGUKICAgICBjb25maWd1cmUgYW5kIHNyYy9Db25maWd1cmUgZGVwZW5kIG9uIHRoaXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzMDcKCiAgKikgQ2hhbmdlcyB1c2FnZSBvZiBwZXJyb3IvZnByaW50ZiB0byBzdGRlcnIgdG8gbW9yZSBwcm9wZXIgYXBfbG9nX2Vycm9yCiAgICAgaW4gbW9kX21pbWUsIG1vZF9sb2dfcmVmZXJlciwgbW9kX2xvZ19hZ2VudCwgYW5kIG1vZF9sb2dfY29uZmlnLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBWYXJpb3VzIE9TLzIgY2xlYW51cHMgWyJCcmlhbiBIYXZhcmQiIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBQT1JUOiBRTlggbmVlZGVkIGEgI2luY2x1ZGUgPHN5cy9tbWFuLmg+OyBhbmQgbm93IGl0IHVzZXMgZmxvY2sKICAgICBzZXJpYWxpemVkIGFjY2VwdCB0byBoYW5kbGUgbXVsdGlwbGUgc29ja2V0cy4KICAgICBbUm9iIFNhY2NvY2NpbyA8cm9ic0BJbmZpbml0ZVRlY2hub2xvZ3kuY29tPl0gUFIjMjI5NSwgMjI5NgogCiAgKikgSGF2ZSBOVCBwcm9wZXJseSBzZXQgdGhlIGRpcmVjdG9yeSBmb3IgQ0dJIHNjcmlwdHMgCiAgICAgKCYgb3RoZXIgc3Bhd25lZCBjaGlsZHJlbikKICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYUB1cy5pYm0uY29tPl0KCiAgKikgUHJvcGFnYXRlIGVudmlyb25tZW50IHRvIENHSSBzY3JpcHRzIGNvcnJlY3RseSBpbiBXaW4zMi4KICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYUB1cy5pYm0uY29tPl0gUFIjMjI5NAoKICAqKSBTb21lIHN5bWJvbCByZW5hbWluZzoKICAgICBhcF9zcGF3bl9jaGlsZF9lcnIgYmVjYW1lIGFwX3NwYXduX2NoaWxkCiAgICAgYXBfc3Bhd25fY2hpbGRfZXJyX2J1ZmYgYmVjYW1lIGFwX2JzcGF3bl9jaGlsZAogICAgIHNwYXduX2NoaWxkIHdhcyBvYnNvbGV0ZWQgYW5kIG1vdmVkIHRvIGNvbXBhdC5oCiAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIFVwZ3JhZGUgdGhlIGNoaWxkIHNwYXduaW5nIGNvZGUgaW4gbW9kX3Jld3JpdGUgZm9yIHRoZSBSZXdyaXRlTWFwCiAgICAgcHJvZ3JhbXM6IGFwX3NwYXduX2NoaWxkX2VycigpIGlzIHVzZWQgYW5kIHRoZSBXaW4zMiBjYXNlIG5vdyB1c2VzCiAgICAgQ3JlYXRlUHJvY2VzcygpIGluc3RlYWQgb2YgYSBsb3ctbGV2ZWwgZXhlY2woKSAod2hpY2ggY2F1c2VkIHByb2JsZW1zIGluCiAgICAgdGhlIHBhc3QgdW5kZXIgV2luMzIpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIGZldyBjb3NtZXRpY3MgYW5kIHRyaXZpYWwgZW5oYW5jZW1lbnRzIHRvIEFQWFMgdG8gbWFrZSB0aGUKICAgICBnZW5lcmF0ZWQgTWFrZWZpbGUgbW9yZSB1c2VyIGZyaWVuZGx5LiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUHJveHkgRml4OiBUaGUgcHJveHkgc3BlY2lhbCBmYWlsdXJlIHJvdXRpbmUgYXBfcHJveHllcnJvcigpCiAgICAgd2FzIHVwZGF0ZWQgdG8gdXNlIHRoZSBub3JtYWwgYXBhY2hlIGVycm9yIHByb2Nlc3NpbmcsIHRoZXJlYnkgYWxsb3dpbmcKICAgICBwcm94eSBlcnJvcnMgdG8gYmUgdHJlYXRlZCBieSBFcnJvckRvY3VtZW50J3MgYXMgd2VsbC4gRm9yIHRoaXMKICAgICBwdXJwb3NlLCBhIG5ldyBtb2R1bGUtdG8tY29yZSBjb21tdW5pY2F0aW9uIHZhcmlhYmxlICJlcnJvci1ub3RlcyIKICAgICB3YXMgaW50cm9kdWNlZDsgdGhlIHByb3h5IChhbmQgcG9zc2libHkgb3RoZXIgbW9kdWxlcykgY29tbXVuaWNhdGVzCiAgICAgaXRzIGVycm9yIHRleHQgdXNpbmcgdGhpcyB2YXJpYWJsZS4gSXRzIGNvbnRlbnQgaXMgY29waWVkIHRvIGEgbmV3CiAgICAgY2dpLWVudi12YXIgUkVESVJFQ1RfRVJST1JfTk9URVMgZm9yIHVzZSBieSBFcnJvckRvY3VtZW50cy4KICAgICBUaGUgb2xkIHByb3h5IHNwZWNpYWwgZXJyb3Igcm91dGluZSBhcF9wcm94eV9sb2dfdWVycm9yKCkKICAgICB3YXMgcmVwbGFjZWQgYnkgcmVndWxhciBhcF9sb2dfZXJyb3IoKSBjYWxscywgbWFueSBtZXNzYWdlcyB3ZXJlIG1hZGUKICAgICBtb3JlIGluZm9ybWF0aXZlLiAKICAgICBbTWFydGluIEtyYWVtZXJdIFBSIzQ5NCwgMTI1OQoKICAqKSBTRUNVUklUWTogQSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIGZ0cCBwcm94eSB3YXMgZml4ZWQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBUcmFuc2Zvcm0gdGhlIGNvbmZpZ3VyZSBtZXNzYWdlICJZb3UgbmVlZCByb290IHByaXZpbGVnZXMgZm9yIHN1RVhFQyIKICAgICBmcm9tIGEgZmF0YWwgZXJyb3IgaW50byBhIChtb3JlIGZyaWVuZGx5KSB3YXJuaW5nIGJlY2F1c2UgdGhlIGJ1aWxkaW5nCiAgICAgKCJtYWtlIikgb2YgQXBhY2hlIHdlIGNhbiBhbGxvdywgb2YgY291cnNlLiBSb290IHByaXZpbGVnZXMgYXJlIG5lZWRlZAogICAgIG9ubHkgZm9yIHRoZSBpbnN0YWxsYXRpb24gc3RlcCAoIm1ha2UgaW5zdGFsbCIpLiBTbyBtYWtlIHN1cmUgdGhlCiAgICAgdXNlciBpcyBhd2FyZSBvZiB0aGlzIGZhY3QgYnV0IGxldCBoaW0gcHJvY2VlZCBhcyBsb25nIGFzIGhlIGNhbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjI4OAogIAogICopIFJlbmFtZWQgdGhyZWUgbW9yZSBmdW5jdGlvbnMgdG8gY29tbW9uIGFwXyBwcmVmaXggd2hpY2ggd2UgbWlzc2VkIGF0IHRoZQogICAgIEJpZyBTeW1ib2wgUmVuYW1pbmcgYmVjYXVzZSB0aGV5J3JlICNkZWZpbmVzIGFuZCBub3QgcmVhbCBDIGZ1bmN0aW9uczoKICAgICBpc19kZWZhdWx0X3BvcnQoKSwgZGVmYXVsdF9wb3J0KCksIGh0dHBfbWV0aG9kKCkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEEgemVyby1sZW5ndGggbmFtZSBhZnRlciBhICQgaW4gYW4gU1NJIGRvY3VtZW50IHNob3VsZCBjYXVzZQogICAgIGp1c3QgdGhlICQgdG8gYmUgaW4gdGhlIGV4cGFuc2lvbi4gIFRoaXMgd2FzIGJyb2tlbiBkdXJpbmcgdGhlCiAgICAgc2VjdXJpdHkgZml4ZXMgaW4gMS4yLjUuICBbRGVhbiBHYXVkZXRdIFBSIzE5MjEsIDIyNDkKCiAgKikgQ2FsbCBhcF9kZXN0cm95X3N1Yl9yZXEoKSBpbiBhcF9hZGRfY2dpX3ZhcnMoKSB0byByZWNsYWltIHNvbWUKICAgICBtZW1vcnkuICBbUm9iIFNhY2NvY2NpbyA8cm9ic0BJbmZpbml0ZVRlY2hub2xvZ3kuY29tPl0gUFIjMjI1MgoKICAqKSBGaXggc3JjL3N1cHBvcnQvaHR0cGQuZXhwIChEU08gZXhwb3J0IGZpbGUgd2hpY2ggaXMgY3VycmVudGx5IG9ubHkKICAgICB1c2VkIHVuZGVyIEFJWCkgYmVjYXVzZSBvZiByZWNlbnQgY2hhbmdlcyB0byBmdW5jdGlvbiBuYW1lcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjcKCiAgKikgTWFrZSBzdXJlIGEgTUlNRS10eXBlIGNhbiBiZSBmb3JjZWQgdmlhIGEgUmV3cml0ZVJ1bGUgZXZlbiB3aGVuIG5vCiAgICAgc3Vic3RpdHV0aW9uIHRha2VzIHBsYWNlLCBmb3IgaW5zdGFuY2UgdmlhIHRoZSBmb2xsb3dpbmcgcnVsZToKICAgICBgYFJld3JpdGVSdWxlIF5teXNjcmlwdCQgLSBbVD1hcHBsaWNhdGlvbi94LWh0dHBkLWNnaV0nJyBUaGlzIHdhcyBvZnRlbgogICAgIHJlcXVlc3RlZCBieSB1c2VycyBpbiB0aGUgcGFzdCB0byBmb3JjZSBhIHNpbmdsZSBzY3JpcHQgd2l0aG91dCBhIC5jZ2kKICAgICBleHRlbnNpb24gYW5kIG91dHNpZGUgYW55IGNnaS1iaW4gZGlycyB0byBiZSBleGVjdXRlZCBhcyBhIENHSSBwcm9ncmFtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMjU0CgogICopIEEgZml4IGZvciBwcm90b2NvbCBpc3N1ZXMgc3Vycm91bmRpbmcgNDAwLCA0MDgsIGFuZAogICAgIDQxNCByZXNwb25zZXMuIFtFZCBLb3J0aG9mXQoKICAqKSBJZ25vcmUgTWF4UmVxdWVzdHNQZXJDaGlsZCBvbiBXSU4zMi4gW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIEZpeCBkaXNjcmVwYW5jeSBpbiBwcm94eV9mdHAuYyB3aGljaCB3YXMgY2F1c2luZyBmYWlsdXJlcyB3aGVuIAogICAgIHRyeWluZyB0byBjb25uZWN0IHRvIGNlcnRhaW4gZnRwZCdzLCBzdWNoIGFzIGFub25mdHBkLiAgCiAgICAgW1JpY2sgT2huZW11cyA8cmlja0BlY29tcGNvbi5jb20+XQoKICAqKSBNYWtlIG1vZF9yZXdyaXRlIHVzZSBhcF9vcGVuX3BpcGVkX2xvZygpIGZvciBSZXdyaXRlTG9nIGRpcmVjdGl2ZSdzCiAgICAgbG9nZmlsZSBpbnN0ZWFkIG9mIGZpZGRsaW5nIGFyb3VuZCBpdHNlbGYgd2l0aCBjaGlsZCBzcGF3bmluZyBzdHVmZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFkZSBSZWZlcmVySWdub3JlIGNhc2UtaW5zZW5zaXRpdmUuCgogICopIE1vZF9sb2dfYWdlbnQsIG1vZF9sb2dfcmVmZXJlciBub3cgdXNlIGFwX29wZW5fcGlwZWRfbG9nIGZvciBwaXBlZCBsb2dzLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBSZXBsYWNlIHVzZSBvZiBzcGF3bl9jaGlsZCB3aXRoIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmLCB0byBtYWtlIGV2ZXJ5dGhpbmcKICAgICAic2FmZSIgdW5kZXIgV2luMzIuICBJbjogbW9kX2luY2x1ZGUuYywgbW9kX21pbWVfbWFnaWMuYwogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBJbXByb3ZlIFJGQzE0MTMgc3VwcG9ydC4gW0JvYiBCZWNrIDxiZWNrQGJvZmgudWNzLnVhbGJlcnRhLmNhPl0KCiAgKikgRml4IHN1cHBvcnQgc2NyaXB0IGBkYm1tYW5hZ2UnOiBJdCB3YXMgdW5hYmxlIHRvIGhhbmRsZSBzb21lIHNvcnQKICAgICBvZiBwYXNzd29yZHMsIGVzcGVjaWFsbHkgcGFzc3dvcmRzIHdpdGggIjAiIGNoYXJzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMjQyCgogICopIFdJTjMyOiBDbGlja2luZyBvbiAiTGFzdCBNb2RpZmllZCIgaW4gYSBmYW5jeSBpbmRleCBjYXVzZWQgYSBjcmFzaC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdIFBSIzIyMzgKCiAgKikgV0lOMzI6IENHSXMgY291bGQgY2F1c2UgYSBoYW5nIChiZWNhdXNlIG9mIGEgZGVhZGxvY2sgaW4gdGhlIHN0YW5kYXJkIEMKICAgICBsaWJyYXJ5KSwgc28gQ0dJIGhhbmRsaW5nIGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIFdpbjMyIG5hdGl2ZSBoYW5kbGVzCiAgICAgaW5zdGVhZCBvZiBDIGZpbGUgZGVzY3JpcHRvcnMuCiAgICAgW0JlbiBMYXVyaWUgYW5kIEJpbGwgU3RvZGRhcmQgPHdnc3RvZGRhQHVzLmlibS5jb20+XSBQUiMxMTI5LCAxNjA3CgogICopIFRoZSBwcm94eSBjYWNoZSB3b3VsZCBzdG9yZSBhbiBpbmNvcnJlY3QgY29udGVudC1sZW5ndGggaW4gdGhlIGNhY2hlZAogICAgIGZpbGUgY29weSBhZnRlciBhIGNhY2hlIHVwZGF0ZS4gVGhhdCByZXN1bHRlZCBpbiByZXBlYXRlZCBmZXRjaGluZwogICAgIG9mIHRoZSBvcmlnaW5hbCBjb3B5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGNhY2hlZCBjb3B5LgogICAgIFtFcm5zdCBLbG9wcGVuYnVyZyA8a2xvcHBlbkBpc3IudW5pLXN0dXR0Z2FydC5kZT5dIFBSIzIwOTQKCiAgKikgVGhlIE1ha2VmaWxlcyBhc3N1bWVkIHRoYXQgRFNPIGZpbGVzIGFyZSBidWlsZCB2aWEgJChMRCkuIFRoaXMKICAgICBpcyBicm9rZW4gZm9yIHR3byByZWFzb25zOiBGaXJzdCB3ZSBuZXZlciBkZWZpbmVkIGF0IGxlYXN0IExEPWxkCiAgICAgc29tZXdoZXJlIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIChpdCB3YXMgc2lsZW50bHkgYXNzdW1lZCB0aGF0IG1vc3QgTWFrZQogICAgIHByb3ZpZGUgYSBidWlsdC1pbiBMRCBkZWZpbml0aW9uIC0gQVJHTCEpIGFuZCBzZWNvbmQgdXNpbmcgdGhlIGdlbmVyaWMgTEQKICAgICB2YXJpYWJsZSBpcyBub3QgdGhlIHRydXRoLiBJbnN0ZWFkIGEgc3BlY2lhbCB2YXJpYWJsZSBuYW1lZCBMRF9TSExJQiBpcwogICAgIHJlYXNvbmFibGUgYmVjYXVzZSBhbHRob3VnaCAibGQiIGlzIHVzdWFsbHkgdGhlIGRlZmF1bHQsIHRoZSBjb21tYW5kIGZvcgogICAgIGJ1aWxkaW5nIERTTyBmaWxlcyBjYW4gYmUgImxpYnRvb2wiIG9yIGV2ZW4gImNjIiBvbiBzb21lIHN5c3RlbXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlcGxhY2UgdGhlIEFkZFZlcnNpb25QbGF0Zm9ybSBkaXJlY3RpdmUgd2l0aCBTZXJ2ZXJUb2tlbnMgd2hpY2gKICAgICBwcm92aWRlcyBmb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIGZvcm1hdCBvZiB0aGUgU2VydmVyOgogICAgIGhlYWRlciBsaW5lLiBTRVJWRVJfU1VCVkVSU0lPTiBpcyBubyBsb25nZXIgc3VwcG9ydGVkOwogICAgIGFsbCBtb2R1bGUgc2hvdWxkIHVzZSB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkKICAgICBBUEkgZnVuY3Rpb24gaW5zdGVhZC4gW0ppbSBKYWdpZWxza2ldCgogICopIFN1cHBvcnQgZm9yIHRoZSBOQ1IgTVAvUkFTIDMuMAogICAgIFtKb2huIFdpdGhlcnMgPHdpdGhlcnNAc2VtaS5rY3NjLm13ci5pcnMuZ292Pl0KCiAgKikgVGhlIExERkxBR1NfU0hMSUJfRVhQT1JUIHZhcmlhYmxlIG9mIHNyYy9Db25maWd1cmF0aW9uWy50bXBsXSB3YXMKICAgICBub3QgcmV0cmlldmVkIGluIHNyYy9Db25maWd1cmUgYW5kIHRodXMgd2FzIG5vdCB1c2VhYmxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogCiAgKikgVmFyaW91cyBNYWtlZmlsZSBjb25zaXN0ZW5jeSBjbGVhbnVwczoKICAgICAtIG1ha2UgT1NESVIgYWxzbyBhdXRvbWF0aWNhbGx5IGJlIHJlbGF0aXZlIHRvIHNyYy8gbGlrZSBJTkNESVIKICAgICAtIFNVQkRJUlMgaXMgbm93IGdlbmVyYXRlZCBpbiBzcmMvTWFrZWZpbGUgb25seSBhbmQgbm90IGluCiAgICAgICBNYWtlZmlsZS5jb25maWcgYmVjYXVzZSBpdCBpcyBhIGxvY2FsIGRlZmluZSBmb3IgdGhpcyBsb2NhdGlvbi4KICAgICAtIHJlbW92ZSBCUk9LRU5fQlBSSU5URl9GTEFHUyBiZWNhdXNlIGlzIGl0IG5vIGxvbmdlciB1c2VkIGluc2lkZQogICAgICAgYW55IE1ha2VmaWxlIGJ1dCBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCB0aGUgIi1LIGlubGluZSIgaXMga2VwdCBpbgogICAgICAgQ0ZMQUdTIGZvciBTQ08gNS4KICAgICAtIHVwZGF0ZSB0aGUgImRlcGVuZCIgdGFyZ2V0cyBpbiBNYWtlZmlsZS50bXBsIGZpbGVzIHRvIHVzZSAkKE9TRElSKSwgdG9vLgogICAgIC0gdXBkYXRlZCB0aGUgZGVwZW5kZW5jaWVzIHRoZWlyc2VsZgogICAgIC0gcmVtb3ZlZCBub3QgZXhpc3RpbmcgU0hMSUIgdmFyaWFibGUgZnJvbSAiY2xlYW4iIHRhcmdldHMKICAgICAtIHJlcGxhY2VkIFNITElCX09CSlMvU0hMSUJTX09CSiBjb25zaXN0ZW50bHkgd2l0aCBPQkpTX1BJQyBiZWNhdXNlIE9CSlMKICAgICAgIGFscmVhZHkgZXhpc3RzIGFuZCBPQkpTX1BJQyBhcmUgYWxzbyBqdXN0IHBsYWluIG9iamVjdHMgYW5kIGhhdmUgbm90CiAgICAgICBkaXJlY3RseSB0byBkbyB3aXRoICJzaGFyZWQiIHRoaW5ncy4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXkKICAgICAgIGNvbnRhaW4gUElDLiBTbyBPQkpTX1BJQyBpcyB0aGUgbW9yZSBjYW5vbmljYWwgbmFtZS4KICAgICAtIFVwZGF0ZWQgdGhlIE1ha2VmaWxlLWRlcGVuZGVuY3kgbGluZXMgZm9yIE9CSlNfUElDCiAgICAgLSBSZW1vdmVkIHRoZSBNYWtlZmlsZS1kZXBlbmRlbmN5IGxpbmUgaW4gQ29uZmlndXJlIHRvIGF2b2lkIGRvdWJsZQogICAgICAgZGVmaW5pdGlvbnMKICAgICAtIHJlcGxhY2VkIHVnbHkgeHgtc28uby94eC5zby1vIGhhY2sgd2l0aCBhIGNsZWFuIGFuZCBjb25zaXN0ZW50IHVzYWdlCiAgICAgICBvZiB4eHgubG8gYXMgR05VIGxpYnRvb2wgZG9lcyB3aXRoIGl0cyBQSUMgb2JqZWN0cwogICAgIC0gcmVkdWNlIGxvY2FsIGNvbXBsZXhpdHkgaW4gbW9kdWxlcyBNYWtlZmlsZS50bXBsIGJ5IG1vdmluZyB0aGUgbGFzdAogICAgICAgZXhpc3RpbmcgdGFyZ2V0ICJkZXBlbmQiIHRvIHRoZSBnZW5lcmF0aW9uIHNlY3Rpb24gaW4gQ29uZmlndXJlLCB0b28uCiAgICAgLSByZW1vdmVkIHRoZSBoaXN0b3JpY2FsICQoU1BBQ0VSKSB3aGljaCB3YXMgdXNlZCBpbiB0aGUgcGFzdCB0b2dldGhlcgogICAgICAgd2l0aCBCUk9LRU5fQlBSSU5URl9GTEFHUyB0byBhdm9pZCB6aWctemFncyBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4gVGhpcwogICAgICAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAtIGZvcmNlIHRoZSBidWlsZCBhbmQgcnVuIG9mIHRoZSBnZW5feHh4IHByb2dyYW1zIHVuZGVyIG1haW4vIGFzIHRoZQogICAgICAgZmlyc3Qgc3RlcCBiZWZvcmUgYnVpbGRpbmcgdGhlIG9iamVjdHMgYmVjYXVzZSBpdCBsb29rcyBjbGVhbmVyCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdJTjMyOiBNYWtlIFdpbjMyIHdvcmsgYWdhaW4gYWZ0ZXIgdGhlIC9kZXYvbnVsbCBEb1MgZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvd3MgaW4gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogRG9uJ3QgZm9yY2UgSVNBUEkgaGVhZGVycyB0byBmaW5pc2ggd2l0aCBcbi4KICAgICBbSmltIFBhdHRlcnNvbiA8SmltLlBhdHRlcnNvbkBDb2dub3MuQ09NPiwgQmVuIExhdXJpZV0gUFIjMjA2MAoKICAqKSBXaGVuIG9wZW5pbmcgImNvbmZpZ3VyYXRpb24iIGZpbGVzIChsaWtlIGh0dHBkLmNvbmYsIGh0YWNjZXNzCiAgICAgYW5kIGh0cGFzc3dkKSwgQXBhY2hlIHdpbGwgbm90IGFsbG93IHRoZW0gdG8gYmUgbm9uLS9kZXYvbnVsbAogICAgIGRldmljZSBmaWxlcy4gVGhpcyBjbG9zZXMgYSBEb1MgaG9sZS4gQXQgdGhlIHNhbWUgdGltZSwKICAgICB3ZSB1c2UgYXBfcGZvcGVuIHRvIG9wZW4gdGhlc2UgZmlsZXMgdG8gaGFuZGxlIHRpbWVvdXRzLgogICAgIFtKaW0gSmFnaWVsc2tpLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQXBhY2hlIHdpbGwgbm93IGxvZyB0aGUgcmVhc29uIGl0cyBodHRwZCBjaGlsZHJlbiBleGl0IGlmIHRoZXkgZXhpdAogICAgIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNpZ25hbC4gIChJdCByZXF1aXJlcyBhIG5ldyBwb3J0aW5nIGRlZmluZSwKICAgICBTWVNfU0lHTElTVCwgd2hpY2ggaWYgZGVmaW5lZCBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIHRleHQKICAgICBkZXNjcmlwdGlvbnMgb2YgdGhlIHNpZ25hbHMgYXZhaWxhYmxlLiAgU2VlIFBPUlRJTkcuKSAgW0RlYW4gR2F1ZGV0XQoKICAqKSBXSU4zMjogY2hkaXIoKSBkb2Vzbid0IG1ha2Ugc2Vuc2UgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IAogICAgIGxpa2UgV0lOMzIuICBCZWZvcmUsIFdpbjMyIENHSSdzIGNvdWxkIGhhdmUgaGFkIHNwb3JhZGljIGZhaWx1cmVzIAogICAgIGlmIGEgY2hkaXIgY2FsbCBmcm9tIG9uZSB0aHJlYWQgd2FzIG1hZGUgYmV0d2VlbiBhbm90aGVyIGNoZGlyIGNhbGwgCiAgICAgYW5kIGEgc3Bhd24gaW4gYW5vdGhlciB0aHJlYWQuICBTbywgZm9yIG5vdyBkb24ndCBjaGRpciBmb3IgQ0dJIHNjcmlwdHMgCiAgICAgaW4gV0lOMzIuICBUaGUgY3VycmVudCBDR0kgInNwZWMiIGlzIHVuY2xlYXIgYXMgdG8gd2hldGhlciBpdCdzIAogICAgIG5lY2Vzc2FyeS4gIExvbmctdGVybSBmaXggaXMgdG8gZWl0aGVyIHNlcmlhbGl6ZSB0aGUgY2hkaXIvc3Bhd24gY29tYm8gCiAgICAgb3IgdXNlIFdJTjMyIG5hdGl2ZSBjYWxscyB0byBzcGF3biBhIHByb2Nlc3MuICBUaGlzIHRlbXAgZml4IHdhcyAKICAgICBuZWNlc3NhcnkgdG8gcmVtb3ZlIHRoaXMgYXMgYSBzaG93c3RvcHBlciBmb3IgMS4zJ3MgcmVsZWFzZS4gCiAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIENsZWFudXAgdGhlIHN1RVhFQyBzdXBwb3J0IGluIEFQQUNJIGFuZCBtYWtlIGl0IG1vcmUgc2FmZToKICAgICAxLiBBZGQgYmlnIGZhdCBoaW50IGluIElOU1RBTEwgYWJvdXQgcmlza3MgYW5kIHRvIHJlYWQgdGhlCiAgICAgICAgaHRkb2NzL21hbnVhbC9zdWV4ZWMuaHRtbCBkb2N1bWVudCBiZWZvcmUgdXNpbmcgdGhlIHN1ZXhlYy1yZWxhdGVkCiAgICAgICAgY29uZmlndXJlIG9wdGlvbnMuCiAgICAgMi4gTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBhdCBsZWFzdCBwcm92aWRlZCBvbmUgLS1zdWV4ZWMteHh4eCBvcHRpb24KICAgICAgICAoc3BlY2lmaWVzIHN1RVhFQyBwYXJhbWV0ZXJzKSBpbiBhZGRpdGlvbiB0byAtLWVuYWJsZS1zdWV4ZWMgb3B0aW9uLgogICAgICAgIElmIG9ubHkgLS1lbmFibGUtc3VleGVjIGlzIGdpdmVuIEFQQUNJIHN0b3BzIHdpdGggYSBoaW50IHRvIElOU1RBTEwKICAgICAgICBhbmQgaHRkb2NzL21hbnVhbC9zdWV4ZWMuaHRtbCBkb2N1bWVudHMuCiAgICAgMy4gUHJvdmlkZSB0d28gYWRkaXRpb25hbCAtLXN1ZXhlYy14eHh4IG9wdGlvbnMgdG8gbWFrZSB0aGUgc3VFWEVDCiAgICAgICAgY29uZmlndXJhdGlvbiBjb21wbGV0ZSAoZXNwZWNpYWxseSBmb3IgcGFja2FnZSBtYWludGFpbmVycyB3aG8gZWxzZQogICAgICAgIGhhZCB0byBwYXRjaCB0aGUgc291cmNlIHRyZWUpIGJ5IHByb3ZpZGluZyB3YXlzIHRvIGNvbmZpZ3VyZSBtaW5pbWFsCiAgICAgICAgVUlEL0dJRCBhbmQgc2FmZSBQQVRILCB0b28uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFudXAgb2YgdGhlIGBjb25maWd1cmUgLS1zaGFkb3cnIHByb2Nlc3M6CiAgICAgLSBtYWtlIHN1cmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY3JlYXRlcyBpdHMgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZQogICAgICAgc2hhZG93IHRyZWUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggcGFyYWxsZWwgY29uZmlndXJlIHJ1bnMKICAgICAtIHJlbW92ZWQgdW5uZWNlc3Nhcnkgb3B0aW9uICItciIgZnJvbSAicm0iIGNhbGwgZm9yIE1ha2VmaWxlcwogICAgIC0gbWFrZSBzdXJlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBjcmVhdGVzIHRoZSBzaGFkb3ctd3JhcHBlciBNYWtlZmlsZQogICAgICAgb25seSB3aGVuIG5vIHNoYWRvdyB0cmVlcyBhbHJlYWR5IGV4aXN0cwogICAgIC0gbWFrZSBzdXJlICJtYWtlIGRpc3RjbGVhbiIgcmVtb3ZlcyB0aGUgc2hhZG93LXdyYXBwZXIgTWFrZWZpbGUgYnV0IG9ubHkKICAgICAgIHdoZW4gbm8gbW9yZSBzaGFkb3cgdHJlZXMgZXhpc3RzCiAgICAgLSBvdmVyaGF1bGVkIG1rc2hhZG93LnNoIHNjcmlwdDogbm93IGl0cyBtb3JlIElGUy1zYWZlIGFuZCBhcHByb3guIHR3aWNlCiAgICAgICBhcyBmYXN0IChpbiB0aGUgcGFzdCBpdCBuZWVkZWQgNzBzZWMsIG5vdyBpdCBydW5zIGp1c3QgMzhzZWMpCiAgICAgLSBtYWtlIHN1cmUgQ1ZTIGRvZXMgbm90IGNvbXBsYWluIGFib3V0IHRoZSBjcmVhdGVkIGZpbGVzCiAgICAgICBNYWtlZmlsbGUuPGdudXRyaXBsZT4gYW5kIGRpcmVjdG9yaWVzIHNyYy48Z251dHJpcGxlPgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkgQVBJIHJvdXRpbmUgYW5kIHRoZQogICAgIEFkZFZlcnNpb25QbGF0Zm9ybSBjb3JlIGRpcmVjdGl2ZS4gIFRoZSBmaXJzdCBhbGxvd3MgbW9kdWxlcyB0bwogICAgIGRlY2xhcmUgdGhlbXNlbHZlcyBpbiB0aGUgU2VydmVyIHJlc3BvbnNlIGhlYWRlciBmaWVsZCB2YWx1ZSwKICAgICBhdWdtZW50aW5nIHRoZSBTRVJWRVJfU1VCVkVSU0lPTiBkZWZpbmUgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZQogICAgIHdpdGggcnVuLXRpbWUgc2V0dGluZ3MgKG1vcmUgdXNlZnVsIGluIGEgbG9hZGFibGUtbW9kdWxlIGVudmlyb25tZW50KS4KICAgICBBZGRWZXJzaW9uUGxhdGZvcm0gaW5zZXJ0cyBhIGNvbW1lbnQgc3VjaCBhcyAiKFVOSVgpIiBvciAiKFdpbjMyKSIKICAgICBpbnRvIHRoZSBzZXJ2ZXIgdmVyc2lvbiBzdHJpbmcuICBbS2VuIENvYXJdIFBSIzIwNTYKCiAgKikgTWlub3Igc3RhYmlsaXR5IHR3ZWFrcyB0byBhdm9pZCBjb3JlIGR1bXBzIGluIGFwX3NucHJpbnRmLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRW1pdCB0aGUgIkFjY2VwdC1SYW5nZSIgaGVhZGVyIGZvciB0aGUgZGVmYXVsdCBoYW5kbGVyLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXSBQUiMxNDY0CgogICopIEFkZCBhIG5vdGUgdG8gaHR0cGQuY29uZi1kaXN0IHRoYXQgYXBhY2hlIHdpbGwgb24gc29tZSBzeXN0ZW1zIGZhaWwKICAgICB0byBzdGFydCB3aGVuIHRoZSBHcm91cCAjIGlzIHNldCB0byBhIG5lZ2F0aXZlIG9yIGxhcmdlIHBvc2l0aXZlIHZhbHVlLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzdXJlIHRoZSBtb2R1bGUgZXhlY3V0aW9uIG9yZGVyIGlzIGNvcnJlY3QgZXZlbiB3aGVuIHNvbWUgbW9kdWxlcwogICAgIGFyZSBsb2FkZWQgdW5kZXIgcnVudGltZSAoYExvYWRNb2R1bGUnKSB2aWEgdGhlIERTTyBtZWNoYW5pc206CiAgICAgMS4gVGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgaXMgbm93IGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uZQogICAgICAgIGFuZCBub3QgdGhlIG9yaWdpbmFsIHN0YXRpY2FsbHkgbGlzdCBmcm9tIG1vZHVsZXMuYwogICAgIDIuIFRoZSBsb2FkZWQgbW9kdWxlcyBhcmUgbm93IGNvcnJlY3RseSBzZXR1cCBieSBMb2FkTW9kdWxlIGZvcgogICAgICAgIGxhdGVyIHVzZSBieSB0aGUgQWRkTW9kdWxlIGNvbW1hbmQuCiAgICAgMy4gV2hlbiB0aGUgRFNPIG1lY2hhbmlzbSBmb3IgbW9kdWxlcyBpcyB1c2VkIEFQQUNJJ3MgYGluc3RhbGwnCiAgICAgICAgdGFyZ2V0IG5vdyBlbmFibGVzIGFsbCBjcmVhdGVkIGBMb2FkTW9kdWxlJyBsaW5lcyBwZXIgZGVmYXVsdCBiZWNhdXNlCiAgICAgICAgdGhpcyBpcyBib3RoIGFscmVhZHkgZXhwZWN0ZWQgYnkgdGhlIHVzZXIgX2FuZF8gbmVlZGVkIHRvIGF2b2lkCiAgICAgICAgY29uZnVzaW9uIHdpdGggdGhlIG5leHQgcG9pbnQgYW5kIHJlZHVjZXMgdGhlIE1ha2VmaWxlLnRtcGwgY29tcGxleGl0eQogICAgIDQuIFdoZW4gdGhlIERTTyBtZWNoYW5pc20gZm9yIG1vZHVsZXMgaXMgdXNlZCwgQVBBQ0kncyBgaW5zdGFsbCcKICAgICAgICB0YXJnZXQgbm93IGFkZGl0aW9uYWxseSBtYWtlcyBzdXJlIHRoZSBtb2R1bGUgbGlzdCBpcyByZWNvbnN0cnVjdGVkCiAgICAgICAgdmlhIGEgY29tcGxldGUgYENsZWFyTW9kdWxlTGlzdCtBZGRNb2R1bGUuLi4nIGVudHJ5LgogICAgIDUuIFRoZSBzdXBwb3J0IHRvb2wgYGFweHMnIG5vdyBhbHNvIG1ha2VzIHN1cmUgYW4gQWRkTW9kdWxlIGNvbW1hbmQKICAgICAgICBpcyBhZGRlZCBpbiBhZGRpdGlvbiB0byB0aGUgTG9hZE1vZHVsZSBjb21tYW5kLgogICAgIDYuIFRoZSBtb2R1bGVzLmMgZ2VuZXJhdGlvbiB3YXMgZXh0ZW5kZWQgdG8gbm93IGNvbnRhaW4gdHdvCiAgICAgICAgY29tbWVudHMgdG8gbWFrZSBzdXJlIG5vIG9uZSBpcyBjb25mdXNlZCBieSB0aGUgY29uZnVzaW5nIHRlcm1pbm9sb2d5CiAgICAgICAgb2YgbG9hZGluZy9saW5raW5nICh3ZSB1c2UgbG9hZD1saW5rK2xvYWQgJiBsaW5rPWFjdGl2YXRlIGluc3RlYWQgb2YKICAgICAgICB0aGUgb2J2aW91cyBsb2FkPWFjdGl2YXRlICYgbGluaz1saW5rIDotKCApCiAgICAgVGhpcyB3YXkgbm93IHRoZXJlIGlzIG5vIGxvbmdlciBhIGRpZmZlcmVuY2UgdW5kZXIgZXhlY3V0aW9uIHRpbWUgYmV0d2VlbgogICAgIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGdlbmVyYXRlZCBtb2RfeHh4LmMgZnJvbSAiYXB4cyAtZyAtZiB4eHgiIGFmdGVyIHRoZQogICAgIEJpZyBTeW1ib2wgUmVuYW1pbmcuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgYSBjb21tZW50IHRvIG1vZF9leGFtcGxlLmMgc2hvd2luZyB0aGUgZm9ybWF0IG9mIGEgRkxBRyBjb21tYW5kCiAgICAgaGFuZGxlci4gIFtLZW4gQ29hcl0KCiAgKikgU3RhbmRhcmRpemVkIHRoZSB0aW1lIGZvcm1hdCBpbiBtb2Rfc3RhdHVzIHRvIG1hdGNoIHRoYXQgb2Ygb3RoZXIgCiAgICAgcGxhY2VzIGluIHRoZSBjb2RlIChlLmcuIERBVEVfR01UKS4gIFBSIzE1NTEKCiAgKikgRml4IGhhbmRsaW5nIG9mICVaIGluIHRpbWVmbXQgc3RyaW5ncyBmb3IgdGhvc2UgcGxhdGZvcm1zIHdpdGggbm8gdGltZQogICAgIHpvbmUgaW5mb3JtYXRpb24gaW4gdGhlaXIgdG0gc3RydWN0LiBbUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT5dCiAgICAgUFIjNzU0CgogICopIE1ha2VzIG1vZF9yZXdyaXRlLCBtb2RfbG9nX2NvbmZpZywgbW9kX3N0YXR1cyBhbmQgdGhlIFNlcnZlclNpZ25hdHVyZSAKICAgICBmZWF0dXJlIGNvbXBhdGlibGUgd2l0aCAnVXNlQ2Fub25pY2FsTmFtZSBvZmYnIGJ5IGNoYW5naW5nICAKICAgICByLT5zZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZSB0byBhcF9nZXRfc2VydmVyX25hbWUoKS4gIEFuZCBJIGNoYW5nZWQgc29tZSAKICAgICBmdW5jdGlvbnMgd2hpY2ggdXNlIHItPnNlcnZlci0+cG9ydCB0byB1c2UgYXBfZ2V0X3NlcnZlcl9wb3J0KCkgaW5zdGVhZCwgCiAgICAgYmVjYXVzZSBpZiB0aGVyZSdzIG5vIFBvcnQgZGlyZWN0aXZlIGluIHRoZSBjb25maWcgci0+c2VydmVyLT5wb3J0IGlzIDAuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgZ2V0L3NldF9tb2R1bGVfY29uZmlnIGFyZSB0cml2aWFsIGVub3VnaCB0byBiZSBiZXR0ZXIgb2ZmIGlubGluZS4gIFdvcnRoCiAgICAgMS41JSBwZXJmb3JtYW5jZSBib29zdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBhcF9wcm94eV9kYXRlX2Nhbm9uKCkgaW4gcHJveHlfdXRpbC5jCiAgICAgd2hlbiBlbnN1cmluZyAneCcgaXMgYXQgbGVhc3QgMzAtY2hhcnMgYmlnLiBbSmltIEphZ2llbHNraSwKICAgICBCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBbQlMyMDAwIHNlY3VyaXR5XSBCUzIwMDAgbmVlZHMgYW4gZXh0cmEgYXV0aGVudGljYXRpb24gdG8gaW5pdGlhbGl6ZQogICAgIHRoZSB0YXNrIGVudmlyb25tZW50IHRvIHRoZSB1bnByaXZpbGVnZWQgVXNlciBpZC4gT3RoZXJ3aXNlIENHSSBzY3JpcHRzCiAgICAgd291bGQgaGF2ZSBhIHdheSB0byBnYWluIHN1cGVyIHVzZXIgYWNjZXNzLiBbTWFydGluIEtyYWVtZXJdCgogICopIEZpeCBkZWJ1ZyBsb2cgbWVzc2FnZXMgZm9yIEJTMjAwMC9PU0Q6IGluc3RlYWQgb2YgbG9nZ2luZyB0aGUgd2hvbGUKICAgICBhYnNvbHV0ZSBwYXRoLCBvbmx5IGxvZyBiYXNlIG5hbWUgb2YgbG9nZ2luZyBzb3VyY2UgYXMgaXMgZG9uZQogICAgIGluIHVuaXguIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUm9uYWxkIFRzY2hhbGFlcidzIEFjY2VwdC1FbmNvZGluZyBwYXRjaCAtIHByZXNlcnZlIHRoZSAieC0iIGluCiAgICAgdGhlIGVuY29kaW5nIHR5cGUgZnJvbSB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlciAoaWYgaXQncyB0aGVyZSkKICAgICBhbmQgdXNlIGl0IGluIHRoZSByZXNwb25zZSwgYXMgdGhhdCdzIHByb2JhYmx5IHdoYXQgaXQnbGwgYmUgZXhwZWN0aW5nLgogICAgIFtSb25hbGQuVHNjaGFsYWVyQHBzaS5jaF0KCiAgKikgRml4IHRvIG1vZF9hbGlhczogdHJhbnNsYXRlX2FsaWFzX3JlZGlyIGlzIGRlYWxpbmcgd2l0aAogICAgIGEgVVJJLCBub3QgYSBmaWxlbmFtZSwgc28gdGhlIGNoZWNrIGZvciBkcml2ZSBsZXR0ZXJzIGZvciB3aW4zMiAKICAgICBhbmQgZW14IGlzIG5vdCBuZWNlc3NhcnkuIFtEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IEFsbG93IC5jbWQgYXMgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uCiAgICAgW0thcmkgTGlrb3Z1b3JpIDxLYXJpLkxpa292dW9yaUBtb2wuZmk+XSBQUiMyMTQ2CgogICopIE1ha2UgQXBhY2hlIGhlYWRlciBmaWxlcywgYW5kIHNvbWUgdmFyaWFibGVzLCBDKysgZnJpZW5kbHkuCiAgICAgW01pY2hhZWwgQW5kZXJzb24ncyA8bWthQHJlZGVzLmludC5jb20ubXg+XQoKICAqKSBDaGlsZCBwcm9jZXNzZXMgY2FuIG5vdyAic2lnbmFsIiAoYnkgZXhpdGluZyB3aXRoIGEgc3RhdHVzCiAgICAgb2YgQVBFWElUX0NISUxERkFUQUwpIHRoZSBwYXJlbnQgcHJvY2VzcyB0byBhYm9ydCBhbmQKICAgICBzaHV0ZG93biB0aGUgc2VydmVyIGlmIHRoZSBlcnJvciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB3YXMKICAgICBmYXRhbCBlbm91Z2guIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBtb2RfYXV0b2luZGV4J3MgZmluZF9pdG1lKCkgd2FzIHNlbnNpdGl2ZSB0byBNSU1FIHR5cGUgY2FzZS4KICAgICBbSmltIEphZ2llbHNraV0gUFIjMjExMgoKICAqKSBNYWtlIHN1cmUgdGhlIHJlZmVyZXJfbG9nIGFuZCBhZ2VudF9sb2cgZW50cmllcyBpbiB0aGUgZGVmYXVsdCBodHRwZC5jb25mCiAgICAgZmlsZSBhcmUgYWxzbyBhZGp1c3RlZCBmb3IgdGhlIGFjdHVhbCByZWxhdGl2ZSBpbnN0YWxsYXRpb24gcGF0aHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxNzUKCiAgKikgV0lOMzI6IEV4dGVuc2l2ZSBvdmVyaGF1bCBvZiB0aGUgd2F5IFVOQ3MgYXJlIGhhbmRsZWQuIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogTWFrZSByb290cyBvZiBmaWxlc3lzdGVtcyAoZS5nLiBjOi8pIHdvcmsuIFtCZW4gTGF1cmllXQogICAgIFBSIzE1NTgKCiAgKikgUE9SVDogVmFyaW91cyBwb3J0aW5nIGNoYW5nZXMgdG8gc3VwcG9ydCBBSVggMy4yLCA0LjEuNSwgNC4yIGFuZCA0LjMuCiAgICAgQWRkaXRpb25hbGx5IHRoZSBjaGVja3MgZm9yIGZpbmRpbmcgdGhlIHZlbmRvciBEU08gbGlicmFyeSB3ZXJlIG1vdmVkCiAgICAgZnJvbSBtb2Rfc28uYyB0byBDb25maWd1cmUgYmVjYXVzZSBmaXJzdCBpdCBuZWVkcyAkUExBVCBldGMuIGFuZCBzZWNvbmQKICAgICBtb2Rfc28gYWxyZWFkeSB1c2VzIGFuIGFic3RyYWN0aW9uIGxheWVyIGFuZCBkb2VzIG5vdCBmaWRkbGUgd2l0aCB0aGUKICAgICB2ZW5kb3IgZnVuY3Rpb25zIGl0c2VsZi4KICAgICBbSmVucy1Vd2UgTWFnZXIsIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IFNvbWUgb3B0aW1pemF0aW9uIGRlZmluZXMgZm9yIE5ldEJTRAogICAgIFtKYXJvbWlyIERvbGVjZWsgPGRvbGVjZWtAaWNzLm11bmkuY3o+XSBQUiMyMTY1CgogICopIFBPUlQ6IER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBOZXRCU0QuCiAgICAgW0phcm9taXIgRG9sZWNlayA8ZG9sZWNla0BpY3MubXVuaS5jej4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxNTgKCiAgKikgQWRkIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBBSVggKGF0IGxlYXN0IDQuMiBidXQgb2xkZXIKICAgICBBSVggdmFyaWFudHMgc2hvdWxkIHdvcmsgZmluZSwgdG9vLiBFdmVuIEFJWCAzLnggc2hvdWxkIHdvcmspLiBUaGlzIGlzCiAgICAgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBmcmVlIERTTyBlbXVsYXRpb24gY29kZSBmcm9tIEplbnMtVXdlIE1hZ2VyCiAgICAgd2hpY2ggd2UgcHV0IGludG8gYSBvcy91bml4L29zLWRzby1haXguYyBmaWxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogIAogICopIFBPUlQ6IEZpeCBjb21waWxlciB3YXJuaW5ncyB1bmRlciBBSVggPj0gNC4yIHdoZXJlIHRoZSBtYW51YWwgcGFnZXMgaW1wbHkKICAgICB0aGF0IHdlIHNob3VsZCB1c2UgTkVUX1NJWkVfVCA9PSBpbnQgYnV0IHRoZSBpbmNsdWRlIGZpbGVzIGZvcmNlIHNpemVfdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHR3byBidWdzIGluIHNlbGVjdCgpIGhhbmRsaW5nIGluIGh0dHBfbWFpbi5jLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIFN1cHByZXNzICJlcnJvcigwKSIgbWVzc2FnZXMgZm9yIGFwX2xvZ19lcnJvcigpIHdoZW4gdGhlIEFQTE9HX05PRVJSTk8KICAgICBpcyB1bnNldCAoYXMgaXQgaXMgaW4gc2l0dWF0aW9ucyBsaWtlIHRpbWVvdXRzKSB3aGVyZSBpdCBpcyB1bmNsZWFyCiAgICAgd2hldGhlciBlcnJubyBpcyBzZXQgb3Igbm90LiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBKdXN0IGhhdmluZyBBUEFDSSdzIGxvY2Fsc3RhdGVkaXIgaXMgdG9vIGdlbmVyYWwgYW5kIG5vdCBlbm91Z2ggZm9yIG1vc3QKICAgICBvZiB0aGUgc3lzdGVtcy4gMS4zYjYgYWdhaW4gcmVxdWlyZWQgbWFudWFsIEFQQUNJIHBhdGNoZXMgYnkgcGFja2FnZQogICAgIG1haW50YWluZXJzIGZyb20gUmVkSGF0IGFuZCBGcmVlQlNEIGJlY2F1c2UgZm9yIHRoZWlyIGZpbGVzeXN0ZW0gbGF5b3V0IGEKICAgICBsaXR0bGUgYml0IG1vcmUgZmxleGliaWxpdHkgaW4gY29uZmlndXJpbmcgdGhlIHBhdGhzIGlzIG5lZWRlZC4gSGVuY2Ugd2UKICAgICBwcm92aWRlIHRocmVlIGFkZGl0aW9uYWwgY29uZmlndXJlIG9wdGlvbnMgKC0tcnVudGltZWRpciwgLS1sb2dmaWxlZGlyLAogICAgIC0tcHJveHljYWNoZWRpcikgd2hpY2ggbm93IGNhbiBiZSB1c2VkIGZvciBtb3JlIGdyYW51bGFyIGFkanVzdG1lbnRzIGlmCiAgICAgLS1sb2NhbHN0YXRlZGlyIGlzIG5vdCBlbm91Z2ggdG8gZml0IHRoZSBwYXJ0aWN1bGFyIG5lZWRzLiBBcyBhIG5pY2UKICAgICBzaWRlLWVmZmVjdCB0aGlzIHJlZHVjZXMgc29tZSBzdWJkaXIgZmlkZGxpbmcgaW4gY29uZmlndXJlK01ha2VmaWxlLnRtcGwuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgdGhlIGluc3RhbGwgcm9vdCBmb3IgIm1ha2UgaW5zdGFsbCIgaW4gQVBBQ0kncyBNYWtlZmlsZSBvdmVycmlkZWFibGUKICAgICBieSBwYWNrYWdlIGF1dGhvcnMuICBUaGlzIHdheSB3ZSBhcmUgZXZlbiBtb3JlIGZyaWVuZGx5IHRvIHBhY2thZ2UKICAgICBtYWludGFpbmVycyAoZXNwZWNpYWxseSBEZWJpYW4gYW5kIFJlZEhhdCkgd2hvIGJ1aWxkIGZvciB0aGUgcmVhbCBwcmVmaXgKICAgICB2aWEgImNvbmZpZ3VyZSAtLXByZWZpeD0vPHJlYWw+IiBidXQgdXNlIGEgZGlmZmVyZW50IGxvY2FsIHByZWZpeCB2aWEKICAgICAibWFrZSByb290PS90bXAvYXBhY2hlIGluc3RhbGwiIGZvciByb2xsaW5nIHRoZSBwYWNrYWdlIHdpdGhvdXQgYnJpc3RsaW5nCiAgICAgdGhlIHRhcmdldCBsb2NhdGlvbiBvbiB0aGVpciBzeXN0ZW0uIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXb3JrYXJvdW5kIHNlZCBsaW1pdGF0aW9ucyBpbiBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQgYnkgbm93CiAgICAgc3Vic3RpdHV0aW5nIGluIGNodW5rcyBvZiA1MCBjb21tYW5kcyAoYmVjYXVzZSBmb3IgaW5zdGFuY2UgSFBVWCdzIHZlbmRvcgogICAgIHNlZCBoYXMgYSBsaW1pdCBvZiBtYXguIDk4IGNvbW1hbmRzKQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTM2CgogICopIEFkZGluZyBTT0NLUzUgc3VwcG9ydCBhbmQgZml4aW5nIGV4aXN0aW5nIFNPQ0tTNCBzdXBwb3J0LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTQwCgogICopIE1hbnVhbGx5IGZpeCBzb21lIHN5bWJvbHMgd2hpY2ggd2VyZSBub3QgcmVuYW1lZCB0byBwcmVmaXggYXBfIGluIHRoZSBCSUcKICAgICBSRU5BTUlORyBwcm9jZXNzIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBhcyBwcmUtcHJvY2Vzc29yIG1hY3JvcyBpbnN0ZWFkCiAgICAgb2YgcmVhbCBmdW5jdGlvbnM6IGJwdXRjLCBiZ2V0YywgcGlwZWRfbG9nX3dyaXRlX2ZkLCBwaXBlZF9sb2dfcmVhZF9mZAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXb3JrYXJvdW5kIGJyYWluZGVhZCBBV0sncyB3aGVuIGdlbmVyYXRpbmcgYXBfY29uZmlnLmg6IFRoZSBzcGxpdCgpIGFuZAogICAgIHN1YnN0cigpIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbmVzdGVkIHVuZGVyIHZlbmRvciBBV0sgZnJvbSBTb2xhcmlzIDIuNi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEzOQoKICAqKSBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBjbGVhbnVwcyBmb3IgdGhlIEFQQUNJIGNvbmZpZ3VyZSBzY3JpcHQ6CiAgICAgbyBmaXggSUZTIGhhbmRsaW5nIGZvciBfbmVzdGVkXyBzaXR1YXRpb24KICAgICBvIGZpeCBQZXJsIGludGVycHJldGVyIHNlYXJjaDogdGFrZSBmaXJzdCBvbmUgZm91bmQgaW5zdGVhZCBvZiBsYXN0IG9uZQogICAgIG8gZml4IERTTyBjb25zaXN0ZW5jeSBjaGVjawogICAgIG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0CiAgICAgbyBhZGQgaW5zdGFsbC1xdWlldCBmb3IgLS1zaGFkb3cgc2l0dWF0aW9uIHRvIE1ha2VmaWxlIHN0dWIKICAgICBvIHJlZHVjZSBjb21wbGV4aXR5IGJ5IGF2b2lkaW5nIHNlZC1oYWNrcyBmb3IgcnVsZSBhbmQgbW9kdWxlIGxpc3QgbG9vcHMKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IERFQlVHX0NHSSBzaXR1YXRpb24gaW4gbW9kX2NnaS5jIFtEYXZpZCBNYWNLZW56aWVdIFBSIzIxMTQKCiAgKikgTWFrZSBzdXJlIHRoZSBpbnB1dCBmaWVsZCBzZXBhcmF0b3IgKElGUykgc2hlbGwgdmFyaWFibGUgaXMgZXhwbGljaXRseQogICAgIGluaXRpYWxpemVkIGNvcnJlY3RseSBiZWZvcmUgX2V2ZXJ5XyBgZm9yJyBsb29wIGFuZCBhbHNvIHJlc3RvcmVkIGFmdGVyCiAgICAgdGhlIGxvb3BzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoYXQgIm1ha2UgaW5zdGFsbCIgZG9lc24ndCBvdmVyd3JpdGUgdGhlIGBtaW1lLnR5cGVzJyBhbmQKICAgICBgbWFnaWMnIGZpbGVzIGZyb20gYW4gZXhpc3RpbmcgQXBhY2hlIGluc3RhbGxhdGlvbi4gQmVjYXVzZSBwZW9wbGUgb2Z0ZW4KICAgICBjdXN0b21pemUgdGhlc2UgZm9yIG93biBNSU1FIGFuZCBjb250ZW50IHR5cGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgc3VwcG9ydCBmb3IgT3BlbkJTRCAyLngKICAgICBbUGV0ZXIgR2FsYmF2eSwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEwOQoKICAqKSBGaXggdGhlIHBhdGggdG8gdGhlIFNjb3JlQm9hcmRGaWxlIGluIHRoZSBpbnN0YWxsLWNvbmZpZyB0YXJnZXQsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEwNQoKICAqKSBMZXQgImNvbmZpZ3VyZSIgY2xlYXIgb3V0IHRoZSB1c2VycyBwYXJhbWV0ZXJzIChwcm92aWRlZCBhcyBzaGVsbAogICAgIHZhcmlhYmxlcykgdG8gYXZvaWQgc2lkZS1lZmZlY3RzIGluICJzcmMvQ29uZmlndXJlIiB3aGVuIHRoZSB1c2VyCiAgICAgZXhwb3J0ZWQgdGhlbSAod2hpY2ggaXMgbm90IG5lZWRlZCwgYnV0IHNvbWUgdXNlcnMgZG8gaXQpLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEwMQoKICAqKSBQcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZnJvbSBzb21lIG9sZCBzcmMvQ29uZmlndXJhdGlvbi50bXBsCiAgICAgcGFyYW1ldGVyIG5hbWVzIHRvIHRoZSBjYW5vbmljYWwgQXV0b2NvbmYtc3R5bGUgc2hlbGwgdmFyaWFibGUgbmFtZXMuIEZvcgogICAgIGluc3RhbmNlIENGTEFHUyB2cy4gRVhUUkFfQ0ZMQUdTLiBUaGUgRVhUUkFfeHh4IHZhcmlhbnRzIGFyZSBhY2NlcHRlZCBub3cKICAgICBidXQgYSBoaW50IG1lc3NhZ2UgaXMgZGlzcGxheWVkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBNYWtlIHN1cmUgdGhhdCAibWFrZSBpbnN0YWxsIiBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUgRG9jdW1lbnRSb290IGFuZAogICAgIENHSSBzY3JpcHRzIGZyb20gYW4gZXhpc3RpbmcgQXBhY2hlIGluc3RhbGxhdGlvbi4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIEppbSBKYWdpZWxza2ldIFBSIzIwODQKCiAgKikgTWFrZSBgY29uZmlndXJlIC0tY29tcGF0JyBtb3JlICJjb21wYXRpYmxlIiBieSBmaXJzdCAKICAgICBsZXQgdGhlIGxpYmV4ZWNkaXIgZGVmYXVsdCB0byBFUFJFRklYL2xpYmV4ZWMgaW5zdGVhZCBvZiBFUFJFRklYL2JpbiBhbmQKICAgICBzZWNvbmQgYnkgbWFraW5nIHN1cmUgdGhlICJhdm9pZC1icmlzdGxpbmctc3VmZml4IiAvYXBhY2hlIGlzIG5vdAogICAgIGFwcGVuZGVkIHRvIHN5c2NvbmZkaXIsIGRhdGFkaXIsIGxvY2Fsc3RhdGVkaXIgYW5kIGluY2x1ZGVkaXIgd2hlbgogICAgIC0tY29tcGF0IGlzIHVzZWQuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBMYXJzIEVpbGVicmVjaHRdCgogICopIE5lWFQgcmVxdWlyZWQgc3RyZHVwKCkgaW4gc3VwcG9ydC9sb2dyZXNvbHZlLmMKICAgICBbRnJhbmNpc2NvIFRvbWVpIDxmYXRvbWVpQHNhbmRidXJnLnVubS5lZHU+XSBQUiMyMDgyCgogICopIEFJWCByZXF1aXJlZCBzeXMvc2VsZWN0LmggaW4gc3VwcG9ydC9hYi5jCiAgICAgW0plbnMgU2NobGV1c2VuZXIgPEplbnMuU2NobGV1c2VuZXJAZGxyLmRlPl0gUFIjMjA4MQoKICAqKSBGaXggdGhlIHBhdGggdG8gdGhlIE1pbWVNYWdpY0ZpbGUgaW4gdGhlIGluc3RhbGwtY29uZmlnIHRhcmdldCwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMDg5CgogICopIFBPUlQ6IEFkZGVkIEhQLVVYIDExIHBhdGNoZXMgW0plZmYgRWFyaWNrc29uIDxqYWVhcmlja0Bjb2xieS5lZHU+XQoKICAqKSBJZiB5b3Ugc3RhcnQgYXBhY2hlIHdpdGggdGhlIC1TIGNvbW1hbmQgbGluZSBvcHRpb24gaXQgd2lsbCBkdW1wCiAgICAgb3V0IHRoZSBwYXJzZWQgdmhvc3Qgc2V0dGluZ3MuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZm9sa3MgdHJ5aW5nCiAgICAgdG8gZmlndXJlIG91dCB3aGF0IGlzIHdyb25nIHdpdGggdGhlaXIgdmhvc3QgY29uZmlndXJhdGlvbi4KICAgICAoT3RoZXIgZHVtcHMgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuKSBbRGVhbiBHYXVkZXRdCgogICopIEFkZCAlcEEsICVwSSwgYW5kICVwcCBjb2RlcyB0byBhcF92Zm9ybWF0dGVyIChhbmQgaGVuY2UgYXBfYnByaW50ZiwKICAgICBhcF9zbnByaW50ZiwgYW5kIGFwX3BzcHJpbnRmKS4gIFNlZSBpbmNsdWRlL2FwLmggZm9yIGRvY3MuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBCZWNhdXNlIC91c3IvbG9jYWwvYXBhY2hlIGlzIHRoZSBkZWZhdWx0IHByZWZpeCB0aGUgYGBjb25maWd1cmUKICAgICAtLWNvbXBhdCcnIG9wdGlvbiBubyBsb25nZXIgaGFzIHRvIHNldCBwcmVmaXgsIGFnYWluLiBUaGlzIHdheSB0aGUKICAgICAtLWNvbXBhdCBvcHRpb24gaG9ub3JzIGEgbGVhZGluZyAtLXByZWZpeCBvcHRpb24uIFtMYXJzIEVpbGVicmVjaHRdCgogICopIFBPUlQ6IENhc3QgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGRsb3BlbigpIGluIGFwX29zX2Rzb19sb2FkKCkKICAgICB0byBgY2hhciAqJyB1bmRlciBPU0YxIGFuZCBGcmVlQlNEIDIueCB3aGVyZSBpdCBpcyBkZWZpbmVkIHRoaXMgd2F5CiAgICAgdG8gYXZvaWQgImRpc2NhcmQgY29uc3QiIHdhcm5pbmdzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSWYgYSBzcGVjaWZpYyBoYW5kbGVyIGlzIHNldCBmb3IgYSBmaWxlIHlldCB0aGUgcmVxdWVzdCBzdGlsbAogICAgIGVuZHMgdXAgYmVpbmcgaGFuZGxlZCBieSB0aGUgZGVmYXVsdCBoYW5kbGVyLCBsb2cgYW4gZXJyb3IKICAgICBtZXNzYWdlIGJlZm9yZSBoYW5kbGluZyBpdC4gIFRoaXMgY2F0Y2hlcyB0aGluZ3Mgc3VjaCBhcyB0cnlpbmcgCiAgICAgdG8gdXNlIFNTSXMgd2l0aG91dCBtb2RfaW5jbHVkZSBlbmFibGVkLiAgW01hcmMgU2xlbWtvXQoKICAqKSBGaXggZXJyb3IgbG9nZ2luZyBmb3IgdGhlIHN0YXJ0dXAgY2FzZSB3aGVyZSBhcF9sb2dfZXJyb3IoKSBzdGlsbCB1c2VzCiAgICAgc3RkZXJyIGFzIHRoZSB0YXJnZXQuIE5vdyB0aGUgZGVmYXVsdCBsb2cgbGV2ZWwgaXMgaG9ub3JlZCBoZXJlLCB0b28uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAgICAKICAqKSBQT1JUOiBNYWtlIHN1cmUgc29tZSBBV0sncyBkb24ndCBmYWlsIGluIHNyYy9Db25maWd1cmUgd2l0aCAic3RyaW5nIHRvbwogICAgIGxvbmciIGVycm9ycyB3aGVuIGdlbmVyYXRpbmcgdGhlIE1PRFVMRVMgZW50cnkgZm9yIHNyYy9NYWtlZmlsZQogICAgIFtCZW4gSHlkZSwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHNyYy9Db25maWd1cmUgZG9lc24ndCBjb21wbGFpbiBhYm91dCB0aGUgb2xkIGRpcmVjdG9yeQogICAgIC91c3IvbG9jYWwvZXRjL2h0dHBkLyB3aGVuIEFQQUNJIGlzIHVzZWQuICBbTGFycyBFaWxlYnJlY2h0XQogICAKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjNiNgoKICAqKSBQT1JUOiBDbGVhbiB1cCB3YXJuaW5ncyBvbiBVbHRyaXggYW5kIEhQVVguICBbQmVuIEh5ZGVdCiAKICAqKSBBZGRpbmcgRFNPIHN1cHBvcnQgZm9yIHRoZSBIUC9VWCBwbGF0Zm9ybSBieSBlbXVsYXRpbmcgdGhlIGRsb3Blbi1zdHlsZQogICAgIGludGVyZmFjZSB2aWEgdGhlIHNpbWlsYXIgYnV0IHByb3ByaWV0YXJ5IEhQL1VYIHNobF94eHgtc3R5bGUgc3lzdGVtCiAgICAgY2FsbHMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBVcGRhdGVkIFVuaXhXYXJlIDIuMC54IGFuZCAyLjEueCBlbnRyaWVzIGZvciBEU08gc3VwcG9ydCBhbmQgbWFkZQogICAgIEFQQUNJIE1ha2VmaWxlLnRtcGwgImluc3RhbGwiIHRhcmdldCBtb3JlIHJvYnVzdCBmb3Igc2Vuc2libGUgVW5peFdhcmUKICAgICBNYWtlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgKysrKyBUSEUgQklHIFNZTUJPTCBSRU5BTUlORyArKysrCiAgICAgVG8gYXZvaWQgc3ltYm9sIGNsYXNoZXMgd2l0aCB0aGlyZC1wYXJ0eSBjb2RlIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciwKICAgICB3ZSBnbG9iYWxseSBhcHBsaWVkIHRoZSBwcmVmaXggImFwXyIgdG8gdGhlIGZvbGxvd2luZyBjbGFzc2VzIG9mCiAgICAgZnVuY3Rpb25zOgogICAgICAgIC0gQXBhY2hlIHByb3ZpZGVkIGdlbmVyYWwgZnVuY3Rpb25zIChlLmcuLCBhcF9jcHlzdHJuKQogICAgICAgIC0gUHVibGljIEFQSSBmdW5jdGlvbnMgKGUuZy4sIHBhbGxvYywgYmdldHMpCiAgICAgICAgLSBQcml2YXRlIGZ1bmN0aW9ucyB3aGljaCB3ZSBjYW4ndCBtYWtlIHN0YXRpYyAoYmVjYXVzZSBvZgogICAgICAgICAgY3Jvc3Mtb2JqZWN0IHVzYWdlKSBidXQgc2hvdWxkIGJlIChlLmcuLCBuZXdfY29ubmVjdGlvbikKICAgICBGb3IgYmFja3dhcmQgc291cmNlIGNvbXBhdGliaWxpdHkgYSBuZXcgaGVhZGVyIGZpbGUgbmFtZWQgY29tcGF0Lmggd2FzCiAgICAgY3JlYXRlZCB3aGljaCBwcm92aWRlcyBkZWZpbmVzIGZvciB0aGUgb2xkIHN5bWJvbCBuYW1lcyBhbmQgY2FuIGJlIHVzZWQKICAgICBieSB0aGlyZC1wYXJ0eSBtb2R1bGUgYXV0aG9ycy4KICAgICBbVGhlIEFwYWNoZSBHcm91cF0KCiAgKikgQWRkZWQgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIFNWUjQtZGVyaXZhdGVzOiBUaGUKICAgICBwcm9ibGVtIHVuZGVyIFNWUjQgaXMgdGhhdCB0aGVyZSBpcyBubyBjb21tYW5kIGZsYWcgdG8gZm9yY2UgdGhlIGxpbmtlcgogICAgIHRvIGV4cG9ydCB0aGUgZ2xvYmFsIHN5bWJvbHMgb2YgdGhlIGh0dHBkIGV4ZWN1dGFibGUgdGhlcmV3aXRoIHRoZXkgYXJlCiAgICAgYXZhaWxhYmxlIHRvIHRoZSBEU08ncy4gSW5zdGVhZCBvZiBwcm9ibGVtYXRpYyBoYWNrcyBsaWtlIGNyZWF0aW5nIGEKICAgICBkdW1teS5zbyBmaWxlIChjb250YWluaW5nIGR1bW15IHJlZmVyZW5jZXMgdG8gYWxsIGdsb2JhbCBzeW1ib2xzKSB0aGUKICAgICBodHRwZCBiaW5hcnkgaXMgbGlua2VkIGFnYWluc3QsIHdlIHVzZSBhIGNsZWFuIHRyaWNrIHN0b2xlbiBmcm9tIFBlcmwgNToKICAgICBQbGFjaW5nIHRoZSBBcGFjaGUgY29yZSBjb2RlIGl0c2VsZiBpbnRvIGEgRFNPIGxpYnJhcnkgbmFtZWQgbGliaHR0cGQuc28uCiAgICAgVGhpcyB3YXkgdGhlIGdsb2JhbCBzeW1ib2xzIF9IQVZFXyB0byBiZSBleHBvcnRlZCBhbmQgdGh1cyBhcmUgYXZhaWxhYmxlCiAgICAgdG8gYW55IG1hbnVhbGx5IGxvYWRlZCBEU08ncyB1bmRlciBydW50aW1lLiBUbyByZWR1Y2UgdGhlIGltcGFjdCB0byB0aGUKICAgICB1c2VyIHRvIG51bGwgd2UgZ28gZXZlbiBmdXJ0aGVyIGFuZCBjcmVhdGUgYSBzdHViIGh0dHBkIGV4ZWN1dGFibGUgd2hpY2gKICAgICBhdXRvbWF0aWNhbGx5IGtlZXBzIHRyYWNrIG9mIHRoZSBEU08gbGlicmFyeSBsb2FkaW5nIGl0c2VsZiBhbmQgdGh1cwogICAgIGhpZGVzIHRoZSBjb21wbGV0ZSBtZWNoYW5pc20gZnJvbSB0aGUgdXNlci4gQWx0aG91Z2ggdGhlIGdlbmVyYXRpb24gb2YKICAgICB0aGlzIERTTyBsaWJyYXJ5IGlzIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcmVkIGZvciBwbGF0Zm9ybXMgd2hpY2gKICAgICBlc3NlbnRpYWxseSBuZWVkIGl0IChtb3N0bHkgYWxsIFNWUjQtZGVyaXZhdGVzKSBpdCBjYW4gYmUgYWxzbyBlbmFibGVkCiAgICAgbWFudWFsbHkgdmlhIHRoZSBSdWxlIFNIQVJFRF9DT1JFLiBUaGlzIGNhbiBiZSBpbnRlcmVzdGluZyBpbiB0aGUgZnV0dXJlCiAgICAgd2hlcmUgd2UgcGVyaGFwcyBleHBsb2l0IHRoaXMgbGliaHR0cGQuc28gbWVjaGFuaXNtIGZvciBwcm92aWRpbmcgbmlmdHkKICAgICBmZWF0dXJlcyBsaWtlIGdyYWNlZnVsIHVwZ3JhZGVzLCBvciB3aGF0ZXZlci4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIE1hcnRpbiBLcmFlbWVyXQoKICAqKSBCdWlsZCB0aGUgbGlicmFyaWVzIGJlZm9yZSBidWlsZGluZyB0aGUgcmVzdCBvZiB0aGUgdG9vbHMuIFtCZW4gSHlkZV0KCiAgKikgQWRkICJkaXN0Y2xlYW4iIHRhcmdldCB0byBzcmMvLU1ha2VmaWxlcyB0byBwcm92aWRlICJtYWtlIGRpc3RjbGVhbiIgYWxzbwogICAgIGluc2lkZSB0aGUgc3JjIHN1YnRyZWUgKGkuZS4gZm9yIG5vbi1BUEFDSSB1c2VycykuIEZvbGxvd2luZyBHTlUgTWFrZWZpbGUKICAgICBjb252ZW50aW9ucyB3aGlsZSAiY2xlYW4iIHJlbW92ZXMgb25seSBzdHVmZiBjcmVhdGVkIGJ5ICJhbGwiIHRhcmdldHMsCiAgICAgImRpc3RjbGVhbiIgYWRkaXRpb25hbGx5IHJlbW92ZXMgdGhlIHN0dWZmIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KICAgICBwcm9jZXNzLiBUaGlzIHdheSAibWFrZSBkaXN0Y2xlYW4iIChoZW5jZSB0aGUgbmFtZSkgcHJvdmlkZXMgYSBmcmVzaAogICAgIHNvdXJjZSB0cmVlIGFzIGl0IHdhcyBmb3IgZGlzdHJpYnV0aW9uLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBbGxvdyB0b3AtbGV2ZWwgKEFQQUNJKSBNYWtlZmlsZSB0byBicmVhayBvbiBidWlsZCBlcnJvcnMKICAgICB0aGUgc2FtZSB3YXkgdGhlIHNyYy8gc3VidHJlZSBNYWtlZmlsZXMgYnJlYWtzIG9uIHRoZW0gYnkgcmVwbGFjaW5nIHRoZQogICAgIGluaXRpYWwgQVBBQ0kgc2VkLXN1YmRpci1kaXNwbGF5LWtsdWRnZSB3aXRoIGEgbW9yZSBjbGVhbgogICAgIHZhcmlhYmxlLXBhc3Npbmctc29sdXRpb246IHZhcmlhYmxlIFNEUCBjYW4gb3B0aW9uYWxseSBob2xkIHRoZSBzdWJkaXIKICAgICBwcmVmaXggd2hpY2ggaXMgY29uc2lzdGVudGx5IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlIHN1YmRpciBtb3ZlbWVudC4KICAgICBUaGlzIHdheSBldmVuIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUgY2FuIHN0b3AgY29ycmVjdGx5IG9uIGVycm9ycyBhcyB0aGUKICAgICB1c2VyIGV4cGVjdHMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBvcmRlcmluZyBvZiBhcmd1bWVudCBjaGVja3MgZm9yIFJld3JpdGVCYXNlIGRpcmVjdGl2ZS4KICAgICBbVG9kZCBFaWdlbnNjaGluayA8ZWlnZW5zdHJAbWl4aS5uZXQ+XSBQUiMyMDQ1CgogICopIENoYW5nZSBXaW4zMiBJU19NT0RVTEUgdG8gU0hBUkVEX01PRFVMRSB0byBtYXRjaCBVbml4JyBtZXRob2Qgb2YKICAgICBpbmRpY2F0aW5nIHRoYXQgYSBtb2R1bGUgaXMgYmVpbmcgY29tcGlsZWQgZm9yIGR5bmFtaWMgbG9hZGluZy4gQWxzbwogICAgIHJlbW92ZSAjZGVmaW5lIElTX01PRFVMRSBmcm9tIG1vZHVsZXMgYW5kIGFkZCBTSEFSRURfTU9EVUxFIGRlZmluZQogICAgIHRvIHRoZSBtYWsvZHNwIGZpbGVzLiBbQWxleGVpIEtvc3V0XQoKICAqKSBSZWR1Y2UgbG9nZ2luZyBsZXZlbCBvZiAibm9ybWFsIiB3YXJuaW5nIG1lc3NhZ2VzIHRvIEFQTE9HX0lORk8sCiAgICAgc2luY2Ugd2UgYXJlIG5vdyBsb2dnaW5nIEFQTE9HX1dBUk5JTkcgYnkgZGVmYXVsdC4gW1JveSBGaWVsZGluZ10KCiAgKikgUE9SVDogT1MvMiB0d2VhayB0byBkZWFsIHdpdGggbXVsdGlwbGUgLmV4ZSB0YXJnZXRzLiBbQnJpYW4gSGF2YXJkXQogCiAgKikgQWRkIGRvY3VtZW50YXRpb24gZmlsZSBhbmQgc3JjL0NvbmZpZ3VyYXRpb24udG1wbCBlbnRyeSBmb3IgdGhlCiAgICAgZXhwZXJpbWVudGFsIG1vZF9tbWFwX3N0YXRpYyBtb2R1bGUuIEJlY2F1c2UgYWx0aG91Z2ggaXQgaXMgYW5kIG1hcmtlZCBhcwogICAgIGFuIGV4cGVyaW1lbnRhbCBvbmUgaXQgaXMgZGlzdHJpYnV0ZWQgYW5kIHRodXMgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYW5kCiAgICAgcHJlcGFyZWQgZm9yIGNvbmZpZ3VyYXRpb24gdGhlIHNhbWUgd2F5IGFzIGFsbCBvdGhlcnMgbW9kdWxlcy4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBxdWVyeSAoLXEpIG9wdGlvbiB0byBhcHhzIHN1cHBvcnQgdG9vbCB0byBiZSBhYmxlIHRvIG1hbnVhbGx5IHF1ZXJ5CiAgICAgc3BlY2lmaWMgc2V0dGluZ3MgZnJvbSBhcHhzLiBUaGlzIGlzIG5lZWRlZCBmb3IgaW5zdGFuY2Ugd2hlbiB5b3UKICAgICBtYW51YWxseSB3YW50IHRvIGFjY2VzcyBBcGFjaGUncyBoZWFkZXIgZmlsZXMgYW5kIHlvdSBuZWVkIHRvIGFzc2VtYmxlCiAgICAgdGhlIC1JIG9wdGlvbi4gIE5vdyB5b3UgY2FuIGRvIC1JYGFweHMgLXEgSU5DTFVERURJUmAuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE5vdyBzcmMvQ29uZmlndXJlIHVzZXMgYSBmYWxsYmFjayBzdHJhdGVneSBmb3IgdGhlIHNoYXJlZCBvYmplY3Qgc3VwcG9ydAogICAgIG9uIHBsYXRmb3JtcyB3aGVyZSBubyBleHBsaWNpdCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU6IElmIGEgUGVybAogICAgIGluc3RhbGxhdGlvbiBleGlzdHMgd2UgYXNrIGl0IGFib3V0IGl0cyBzaGFyZWQgb2JqZWN0IHN1cHBvcnQgYW5kIGlmIGl0J3MKICAgICB0aGUgZGxvcGVuLXN0eWxlIG9uZSB3ZSBzaGFtZWxlc3NseSBndWVzcyB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncwogICAgIGZvciBjcmVhdGluZyBzaGFyZWQgb2JqZWN0cyBmcm9tIFBlcmxzIGtub3dsZWRnZS4gT2YgY291cnNlLCB0aGUgdXNlciBpcwogICAgIHdhcm5pbmcgYWJvdXQgd2hhdCB3ZSBhcmUgZG9pbmcgYW5kIGluZm9ybWVkIHRoYXQgaGUgc2hvdWxkIHNlbmQgdXMKICAgICB0aGUgZ3Vlc3NlZCBmbGFncyB3aGVuIHRoZXkgd29yay4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFByb3ZpZGUgQVBBQ0kgLS13aXRob3V0LXN1cHBvcnQgb3B0aW9uIHRvIGJlIGFibGUgdG8gZGlzYWJsZSB0aGUgYnVpbGQKICAgICBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBzdXBwb3J0IHRvb2xzIGZyb20gdGhlIHNyYy9zdXBwb3J0LyBhcmVhLgogICAgIEFsdGhvdWdoIGl0cyB1c2VmdWwgdG8gaGF2ZSB0aGVzZSBpbnN0YWxsZWQgcGVyIGRlZmF1bHQgd2Ugc2hvdWxkIHByb3ZpZGUKICAgICBhIHdheSB0byBjb21waWxlIGFuZCBpbnN0YWxsIHdpdGhvdXQgdGhlbSBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIG9mIHRoZSBuZXcgQVBhY2hlIGVYdGVuU2lvbiAoYXB4cykgc3VwcG9ydCB0b29sIGZvciBidWlsZGluZyBhbmQKICAgICBpbnN0YWxsaW5nIG1vZHVsZXMgaW50byBhbiBfYWxyZWFkeSBpbnN0YWxsZWRfIEFwYWNoZSBwYWNrYWdlIHRocm91Z2ggdGhlCiAgICAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbSBbbW9kX3NvLmNdLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0CiAgICAgdGhpcyBhcHByb2FjaCBhY3R1YWxseSBkb2Vzbid0IG5lZWQgdGhlIEFwYWNoZSBzb3VyY2UgdHJlZS4gIFRoZQogICAgIChBUEFDSS1pbnN0YWxsZWQpIHNlcnZlciBwYWNrYWdlIGlzIGVub3VnaCwgYmVjYXVzZSB0aGlzIG5vdyBpbmNsdWRlcyB0aGUKICAgICBBcGFjaGUgQyBoZWFkZXIgZmlsZXMgKFBSRUZJWC9pbmNsdWRlKSBhbmQgdGhlIG5ldyBBUFhTIHRvb2wKICAgICAoU0JJTkRJUi9hcHhzKS4gIFRoZSBpbnRlbmQgaXMgdG8gcHJvdmlkZSBhIGhhbmR5IHRvb2wgZm9yIHRoaXJkLXBhcnR5CiAgICAgbW9kdWxlIGF1dGhvcnMgdG8gYnVpbGQgdGhlaXIgQXBhY2hlIG1vZHVsZXMgX09VVFNJREVfIHRoZSBBcGFjaGUgc291cmNlCiAgICAgdHJlZSB3aGlsZSBhdm9pZGluZyB0aGVtIHRvIGZpZGRsZSBhcm91bmQgd2l0aCB0aGUgdG90YWxseSBwbGF0Zm9ybQogICAgIGRlcGVuZGVuZCB3YXkgb2YgY29tcGlsaW5nIERTTyBmaWxlcy4gVGhlIHRvb2wgc3VwcG9ydHMgYWxsIHJhbmdlcyBvZgogICAgIG1vZHVsZXMsIGZyb20gdHJpdmlhbCBvbmVzIChzaW5nbGUgbW9kX2Zvby5jKSB0byBjb21wbGV4IG9uZXMgKGxpa2UgUEhQMwogICAgIHdoaWNoIGhhcyBhIG1vZF9waHAzLmMgcGx1cyBhIHByZS1idWlsdCBsaWJtb2RwaHAzLXNvLmEpIGFuZCBldmVuIGNhbgogICAgIG9uLXRoZS1mbHkgZ2VuZXJhdGUgYSBtaW5pbWFsaXN0aWMgTWFrZWZpbGUgYW5kIHNhbXBsZSBtb2R1bGUgZm9yIHRoZQogICAgIGZpcnN0IHN0ZXAgdG8gcHJvdmlkZSBib3RoIGEgcXVpY2sgc3VjY2VzcyBldmVudCBhbmQgdG8gZGVtb25zdHJhdGUgdGhlCiAgICAgQVBYUyBtZWNoYW5pc20gdG8gbW9kdWxlIGF1dGhvcnMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggY29yZSBkdW1wcyBpbiB1c2Ugb2YgQ09OTkVDVCBpbiBwcm94eS4gIAogICAgIFtSYWluZXIuU2NoZXJnQHJleHJvdGguZGVdIFBSIzEzMjYsICMxNTczLCAjMTk0MgoKICAqKSBNb2RpZnkgdGhlIGxvZyBkaXJlY3RpdmVzIGluIGh0dHBkLmNvbmYtZGlzdCBmaWxlcyB0byB1c2UgQ3VzdG9tTG9nCiAgICAgc28gdGhhdCB1c2VycyBoYXZlIGV4YW1wbGVzIG9mIGhvdyBDdXN0b21Mb2cgY2FuIGJlIHVzZWQuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgQWRkIHRoZSBuZXcgQXBhY2hlIEF1dG9jb25mLXN0eWxlIEludGVyZmFjZSAoQVBBQ0kpIGZvciB0aGUgdG9wLWxldmVsIG9mCiAgICAgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gdHJlZS4gIFVudGlsIEFwYWNoZSAxLjMgdGhlcmUgd2FzIG5vIHJlYWwKICAgICBvdXQtb2YtdGhlLWJveCBiYXRjaC1jYXBhYmxlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGZvciB0aGUKICAgICBjb21wbGV0ZSBBcGFjaGUgcGFja2FnZS4gVGhpcyBpcyBub3cgcHJvdmlkZWQgYnkgYSB0b3AtbGV2ZWwgImNvbmZpZ3VyZSIKICAgICBzY3JpcHQgYW5kIGEgY29ycmVzcG9uZGluZyB0b3AtbGV2ZWwgIk1ha2VmaWxlLnRtcGwiIGZpbGUuICBUaGUgZ29hbCBpcwogICAgIHRvIHByb3ZpZGUgYSBHTlUgQXV0b2NvbmYtc3R5bGUgZnJvbnRlbmQgd2hpY2ggaXMgY2FwYWJsZSB0byBib3RoIGRyaXZlCiAgICAgdGhlIG9sZCBzcmMvQ29uZmlndXJlIHN0dWZmIGluIGJhdGNoIGFuZCBhZGRpdGlvbmFsbHkgaW5zdGFsbHMgdGhlCiAgICAgcGFja2FnZSB3aXRoIGEgR05VLWNvbmZvcm1pbmcgZGlyZWN0b3J5IGxheW91dC4gQW55IG9wdGlvbnMgZnJvbSB0aGUgb2xkCiAgICAgY29uZmlndXJhdGlvbiBzY2hlbWUgYXJlIGF2YWlsYWJsZSBwbHVzIGEgbG90IG9mIG5ldyBvcHRpb25zIGZvciBmbGV4aWJseQogICAgIGN1c3RvbWl6aW5nIEFwYWNoZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFRoZSBmbG9hdGluZyBwb2ludCBhcF9zbnByaW50ZiBjb2RlIHdhc24ndCB0aHJlYWRzYWZlLgogICAgIEhhZCB0byByZW1vdmUgdGhlIEhBVkVfQ1ZUIG1hY3JvIGluIG9yZGVyIHRvIGRvIHRocmVhZHNhZmUKICAgICBjYWxsaW5nIG9mIHRoZSA/Y3Z0KCkgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEFkZCB0aGUgU0NPX1NWIHBvcnQuIFtKaW0gSmFnaWVsc2tpXSBQUiMxOTYyCgogICopIFBPUlQ6IElSSVggbmVlZHMgdGhlIC1uMzIgZmxhZyBpZmYgdXNpbmcgdGhlICdjYycgY29tcGlsZXIKICAgICBbSmltIEphZ2llbHNraV0gUFIjMTkwMQoKICAqKSBCVUc6IENvbmZpZ3VyZSB3YXMgdXNpbmcgVENDIGFuZCBDQyBpbmNvbnNpc3RlbnRseS4gTWFrZSBzdXJlCiAgICAgQ29uZmlndXJlIGtub3dzIHdoaWNoIENDIHdlIGFyZSB1c2luZy4gW0ppbSBKYWdpZWxza2ldCgogICopICJPcHRpb25zICtJbmNsdWRlcyIgd2Fzbid0IGNvcnJlY3RseSBtZXJnZWQgaWYgIitJbmNsdWRlc05vRXhlYyIKICAgICB3YXMgZGVmaW5lZCBpbiBhIHBhcmVudCBkaXJlY3RvcnkuIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEFQSTogYXBfc25wcmludGYoKSBjb2RlIG11dGF0ZWQgaW50byBhcF92Zm9ybWF0dGVyKCksIHdoaWNoIGlzCiAgICAgYSBnZW5lcmljIHByaW50Zi1zdHlsZSByb3V0aW5lIHRoYXQgY2FuIGNhbGwgYXJiaXRyYXJ5IG91dHB1dAogICAgIHJvdXRpbmVzLiAgVXNlIHRoaXMgdG8gcmVwbGFjZSBodHRwX2JwcmludGYuYy4gIEFkZCBuZXcgcm91dGluZXMKICAgICBwc3ByaW50ZigpLCBwdnNwcmludGYoKSB3aGljaCBhbGxvY2F0ZSB0aGUgZXhhY3QgYW1vdW50IG9mIG1lbW9yeQogICAgIHJlcXVpcmVkIGZvciBhIHN0cmluZyBmcm9tIGEgcG9vbC4gIFVzZSBwc3ByaW50ZigpIHRvIGNsZWFuIHVwCiAgICAgdmFyaW91cyBiaXRzIG9mIGNvZGUgd2hpY2ggdXNlZCBhcF9zbnByaW50ZigpL3BzdHJkdXAoKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEhBVkVfU05QUklOVEYgZG9lc24ndCBkbyBhbnl0aGluZyBhbnkgbG9uZ2VyLiAgVGhpcyBpcyBiZWNhdXNlCiAgICAgYXBfc25wcmludGYoKSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBhbmQgZm9ybWF0dGluZyBjb2RlcyB0aGFuCiAgICAgc25wcmludGYoKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0lHWENQVSBhbmQgU0lHWEZTWiBhcmUgbm93IHJlc2V0IHRvIFNJR19ERkwgYXQgYm9vdC10aW1lLiAgVGhpcwogICAgIGlzIG5lY2Vzc2FyeSBvbiBhdCBsZWFzdCBTb2xhcmlzIHdoZXJlIHRoZSAvZXRjL3JjPy5kIHNjcmlwdHMKICAgICBhcmUgcnVuIHdpdGggdGhlc2Ugc2lnbmFscyBpZ25vcmVkLCBhbmQgIlNJR19JR04iIHNldHRpbmdzIGFyZQogICAgIG1haW50YWluZWQgYWNyb3NzIGV4ZWMoKS4KICAgICBbUmVpbiBUb2xsZXZpayA8cmVpbnRAc3lzLnNvbC5ubz5dIFBSIzIwMDkKCiAgKikgRml4IHRoZSBjaGVjayBmb3Igc3ltYm9saWMgbGlua3MgaW4gYGBSZXdyaXRlQ29uZCAuLi4gLWwnJzogc3RhdCgpIHdhcwogICAgIHVzZWQgaW5zdGVhZCBvZiBsc3RhdCgpIGFuZCB0aHVzIHRoaXMgZmxhZyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4KICAgICBbUmVpbiBUb2xsZXZpayA8cmVpbnRAc3lzLnNvbC5ubz5dIFBSIzIwMTAKCiAgKikgRml4IHRoZSBwcm94eSBwYXNzLXRocm91Z2ggZmVhdHVyZSBvZiBtb2RfcmV3cml0ZSBmb3IgdGhlIGNhc2Ugb2YKICAgICBleGlzdGluZyBRVUVSWV9TVFJJTkcgbm93IHRoYXQgbW9kX3Byb3h5IHdhcyByZWNlbnRseSBjaGFuZ2VkIGJlY2F1c2Ugb2YKICAgICB0aGUgbmV3IFVSTCBwYXJzaW5nIHN0dWZmLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgY2hhbmdlcyB0byBzY29yZWJvYXJkIGRlZmluaXRpb25zIHdoaWNoIGhlbHBzIGdjYyBnZW5lcmF0ZQogICAgIGJldHRlciBjb2RlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBTlNJIEMgZG9lc24ndCBndWFyYW50ZWUgdGhhdCAiaW50IGZvbyA6IDIiIGluIGEgc3RydWN0dXJlIHdpbGwKICAgICBiZSBhIHNpZ25lZCBiaXRmaWVsZC4gIFNvIG1hcmsgYSBmZXcgYml0ZmllbGRzIGFzIHNpZ25lZCB0bwogICAgIGVuc3VyZSBjb3JyZWN0IGNvZGUuICBbRGVhbiBHYXVkZXRdCgogICopIFRoZSBkZWZhdWx0IGZvciBIb3N0bmFtZUxvb2t1cHMgd2FzIGNoYW5nZWQgdG8gT2ZmLCBidXQgdGhlcmUKICAgICB3YXMgYSBwcm9ibGVtIGFuZCBpdCB3YXNuJ3QgdGFraW5nIGVmZmVjdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBDbGVhbiB1cCB1bmRlZmluZWQgc2lnbmFscyBvbiBzb21lIHBsYXRmb3JtcyAoU0NPLCBCZU9TKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFmdGVyIGEgU0lHSFVQIHRoZSBsaXN0ZW5pbmcgc29ja2V0cyBpbiB0aGUgcGFyZW50IHdlcmVuJ3QKICAgICBwcm9wZXJseSBtYXJrZWQgZm9yIGNsb3N1cmUgb24gZm9yaygpLgogICAgIFtK/HJnZW4gS2VpbCA8amtAdG9vbHMuZGU+XSBQUiMyMDAwCiAKICAqKSBBbGxvdyAlMkYgaW4gdHdvIHNpdHVhdGlvbnM6IDEpIGl0IGlzIGluIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkksCiAgICAgdGhlcmVmb3JlIG5vdCBleHBvc2VkIHRvICUyRiAtPiAnLycgdHJhbnNsYXRpb25zIGFuZCAyKSB0aGUgcmVxdWVzdAogICAgIGlzIGEgcHJveHkgcmVxdWVzdCwgc28gd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIGxvY2FsIHJlc291cmNlIGFueXdheS4KICAgICBXaXRob3V0IHRoaXMsIHRoZSBwcm94eSB3b3VsZCBmYWlsIHRvIHdvcmsgZm9yIGFueSBVUkwncyB3aXRoCiAgICAgJTJmIGluIHRoZW0gKG9jY3VycyBxdWl0ZSBvZnRlbiBpbgogICAgIGh0dHA6Ly8uLi4vY2dpLWJpbi8uLi4/aHR0cCUzQSUyRiUyRi4uLiByZWZlcmVuY2VzKSBbTWFydGluIEtyYWVtZXJdCgogICopIFByb3RlY3QgYWdhaW5zdCBGRF9TRVRTSVpFIG1pc21hdGNoZXMuICBbRGVhbiBHYXVkZXRdCgogICopIE1ha2UgdGhlIHNoYXJlZCBvYmplY3QgY29tcGlsYXRpb24gY29tbWFuZCBtb3JlIHBvcnRhYmxlIGJ5IGF2b2lkaW5nCiAgICAgdGhlIGRpcmVjdCBjb21iaW5hdGlvbiBvZiBgLWMnICYgYC1vJyB3aGljaCBpcyBub3QgaG9ub3JlZCBieSBzb21lCiAgICAgY29tcGlsZXJzIGxpa2UgVW5peFdhcmUncyBjYy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdJTjMyOiB0aGUgcHJveHkgd2FzIGNyZWF0aW5nIGZpbGVuYW1lcyBtaXNzaW5nIHRoZSBsYXN0IGZvdXIKICAgICBjaGFyYWN0ZXJzLiAgV2hpbGUgdGhpcyBub3JtYWxseSBkb2Vzbid0IHN0b3AgYW55dGhpbmcgZnJvbSAKICAgICB3b3JraW5nLCBpdCBjYW4gcmVzdWx0IGluIGV4dHJhIGNvbGxpc2lvbnMuICAKICAgICBbVGltIENvc3RlbGxvIDx0amNvc3RlbEBzb2NzLnV0cy5lZHUuYXU+XSBQUiMxODkwCgogICopIE5vdyBtb2RfcHJveHkgdXNlcyB0aGUgcmVzcG9uc2Ugc3RyaW5nIChpbiBhZGRpdGlvbiB0byB0aGUgcmVzcG9uc2Ugc3RhdHVzCiAgICAgY29kZSkgZnJvbSB0aGUgYWxyZWFkeSB1c2VkIEZUUCBTSVpFIGNvbW1hbmQgdG8gc2V0dXAgdGhlIENvbnRlbnQtTGVuZ3RoCiAgICAgaGVhZGVyIGlmIGF2YWlsYWJsZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzExODMKCiAgKikgUmVhbmltYXRlZCB0aGUgKHN0aWxsIHVuZG9jdW1lbnRlZCkgcHJveHkgcmVjZWl2ZSBidWZmZXIgc2l6ZSBkaXJlY3RpdmU6CiAgICAgUmVuYW1lZCBmcm9tIFJlY2VpdmVCdWZmZXJTaXplIHRvIFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUgYmVjYXVzZSB0aGUgb2xkCiAgICAgbmFtZSB3YXMgcmVhbGx5IHRvbyBnZW5lcmljLCBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGRpcmVjdGl2ZSB0bwogICAgIHRoZSBtb2RfcHJveHkuaHRtbCBhbmQgY29ycmVjdGVkIHRoZSBoeXBlcmxpbmsgdG8gaXQgaW4gdGhlCiAgICAgbmV3X2ZlYXR1cmVzXzEuMy5odG1sIGRvY3VtZW50LiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzEzNDgKCiAgKikgRml4IGEgYnVnIGluIHRoZSBzcmMvaGVscGVycy9mcDJycCBzY3JpcHQgYW5kIG1ha2UgaXQgYSBsaXR0bGUgYml0CiAgICAgZmFzdGVyIFtNYXJ0aW4gS3JhZW1lcl0KICAKICAqKSBNYWtlIENvbmZpZ3VyZSBkaWUgd2hlbiB5b3UgZ2l2ZSBpdCBhbiB1bmtub3duIGNvbW1hbmQgc3dpdGNoLgogICAgIFtCZW4gSHlkZV0KCiAgKikgQWRkIGZpdmUgbmV3IGFuZCBmcmVzaCBtYW5wYWdlcyBmb3IgdGhlIHN1cHBvcnQgcHJvZ3JhbXM6IGRibW1hbmFnZS4xLAogICAgIHN1ZXhlYy44LCBodGRpZ2VzdC4xLCByb3RhdGVsb2dzLjggYW5kIGxvZ3Jlc29sdmUuOC4gIE5vdyBhbGwgdXAtdG8tZGF0ZQogICAgIGFuZCBwZXIgZGVmYXVsdCBjb21waWxlZCBzdXBwb3J0IHByb2dyYW1zIGhhdmUgbWFudWFsIHBhZ2VzIC0ganVzdCB0bwogICAgIGRvY3VtZW50IG91ciBzdHVmZiBhIGxpdHRsZSBiaXQgbW9yZSBhbmQgdG8gYmUgYWJsZSB0byBkbyByZWFsbHkKICAgICBVbml4LWxpa2UgaW5zdGFsbGF0aW9ucyA7LSkgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ham9yIGNsZWFudXBzIHRvIHRoZSBDb25maWd1cmUgc2NyaXB0IHRvIG1ha2UgaXQgYW5kIGl0cyBnZW5lcmF0ZWQKICAgICBNYWtlZmlsZXMgYWdhaW4gcmVhZGFibGUgYW5kIG1haW50YWluYWJsZTogYWRkIFNSQ0RJUiBvcHRpb24sIHJlbW92ZWQKICAgICBJTkNMVURFU19ERVBUSFswLTJdIGtsdWRnZSwgY2xlYW51cCBvZiBUQVJHRVQgb3B0aW9uLCBjbGVhbnVwIG9mCiAgICAgZ2VuZXJhdGVkIHNlY3Rpb25zLCBjb25zZXF1ZW50bHkgYWRkZWQgTWFrZWZpbGUgaGVhZGVycyB3aXRoIGluaGVyaXRhbmNlCiAgICAgaW5mb3JtYXRpb24sIGFkZGVkIHN1YmRpciBtb3ZlbWVudCBtZXNzYWdlcyBmb3IgZWFzaWVyIGZvbGxvd2luZyB3aGVyZQogICAgIHRoZSBidWlsZCBwcm9jZXNzIGN1cnJlbnRseSBzdGF5cyAobW9yZSB2ZXJib3NlIHRoZW4gc3RhbmRhcmQgTWFrZSwgbGVzcwogICAgIHZlcmJvc2UgdGhhbiBHTlUgbWFrZSksIHNhbWUgc3R5bGUgdG8gY29tbWVudHMgaW4gdGhlIENvbmZpZ3VyZSBzY3JpcHQsCiAgICAgYWRkZWQgQXBhY2hlIGxpY2Vuc2UgaGVhZGVyLCBmaXhlZCBhIGZldyBidWdzLCBldGMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogICAgIAogICopIEFkZCB0aGUgbmV3IEFwYWNoZUJlbmNoIHByb2dyYW0gImFiIiB0byBzcmMvc3VwcG9ydC86IFRoaXMgaXMgZGVyaXZlZAogICAgIGZyb20gdGhlIFpldXNCZW5jaCBiZW5jaG1hcmtpbmcgcHJvZ3JhbSBhbmQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQogICAgIHJlc3BvbnNlIHBlcmZvcm1hbmNlIG9mIGFuIEFwYWNoZSBpbnN0YWxsYXRpb24uIFRoaXMgdmVyc2lvbiBpcwogICAgIG9mZmljaWFsbHkgbGljZW5zZWQgd2l0aCBaZXVzIFRlY2hub2xvZ3ksIEx0ZC4gU2VlIHRoZSBsaWNlbnNlIGFncmVlbWVudAogICAgIHN0YXRlbWVudHMgaW4gPDE5OTgwMzE3MTIyNC5OQUEyNDU0N0BlbjEuZW5nZWxzY2hhbGwuY29tPiBpbiBhcGFjaGUtY29yZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBJOiBWYXJpb3VzIGNvcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluYXRlbHkgbm90IHBhcnQgb2YgdGhlIEFQSQogICAgIGhhdmUgYmVlbiBtYWRlIHN0YXRpYywgYW5kIGEgZmV3IGhhdmUgYmVlbiBtYXJrZWQgQVBJX0VYUE9SVC4gIFN0aWxsCiAgICAgbW9yZSBoYXZlIGJlZW4gbWFya2VkIENPUkVfRVhQT1JUIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsCiAgICAgdXNlIGJ5IG1vZHVsZXMuICBbRG91ZyBNYWNFYWNoZXJuLCBEZWFuIEdhdWRldF0KCiAgKikgbW9kX3Byb3h5IHdhcyBub3QgY2xlYXJpbmcgdGhlIFByb3h5LUNvbm5lY3Rpb24gaGVhZGVyIGZyb20KICAgICByZXF1ZXN0czsgbm93IGl0IGRvZXMuICBUaGlzIGRpZCBub3QgdmlvbGF0ZSBhbnkgc3BlYywgaG93ZXZlciAKICAgICBjYXVzZXMgcG9vciBpbnRlcmFjdGlvbnMgd2hlbiB5b3UgYXJlIHRhbGtpbmcgdG8gcmVtb3RlIHByb3hpZXMuICAKICAgICBbTWFyYyBTbGVta29dIFBSIzE3NDEKCiAgKikgVmFyaW91cyBjbGVhbnVwcyB0byB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSBhbmQgbWFudWFsIHBhZ2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBjZmdfZ2V0bGluZSgpIHdhcyBub3QgcHJvcGVybHkgaGFuZGxpbmcgbGluZXMgdGhhdCBkaWQgbm90IGVuZAogICAgIHdpdGggYSBsaW5lIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIFtNYXJjIFNsZW1rb10gUFIjMTg2OSwgMTkwOQoKICAqKSBQZXJmb3JtYW5jZSB0d2VhayB0byBtb2RfbG9nX2NvbmZpZy4gIFtEbWl0cnkgS2hydXN0YWxldl0KCiAgKikgQ2xlYW4gdXAgc29tZSB1bmRvY3VtZW50ZWQgYmVoYXZpb3Igb2YgbW9kX3NldGVudmlmIHJlbGF0ZWQgdG8KICAgICAibWVyZ2luZyIgdHdvIFNldEVudklmIGRpcmVjdGl2ZXMgd2hlbiB0aGV5IG1hdGNoIHRoZSBzYW1lIGhlYWRlcgogICAgIGFuZCByZWdleC4gIERvY3VtZW50IHRoYXQgbW9kX3NldGVudmlmIHdpbGwgcGVyZm9ybSBjb21wYXJpc29ucyBpbgogICAgIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlnIGZpbGUuICBPcHRpbWl6ZSBtb2Rfc2V0ZW52aWYgYnkKICAgICBkb2luZyBtb3JlIHdvcmsgYXQgY29uZmlnIHRpbWUgcmF0aGVyIHRoYW4gYXQgcnVudGltZS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIHNyYy9pbmNsdWRlL2FwX2NvbmZpZy5oIG5vdyB3cmFwcyBpdCdzICNkZWZpbmUncyB3aXRoICNpZm5kZWYvI2VuZGlmJ3MKICAgICB0byBhbGxvdyBmb3IgbW9kdWxlcyB0byBvdmVycnVsZSB0aGVtIGFuZCB0byByZWR1Y2UgcmVkZWZpbml0aW9uCiAgICAgd2FybmluZ3MgW0ppbSBKYWdpZWxza2ldCgogICopIFtQT1JUXSBGb3IgQS9VWCBjaGFuZ2UgdGhlIE9TLSNkZWZpbmUgZm9yIC1EQVVYIHRvIC1EQVVYMy4KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgTWFraW5nIHRoZSBoYXJkLWNvZGVkIGNyb3NzLW1vZHVsZSBmdW5jdGlvbiBjYWxsIG1pbWVfZmluZF9jdCgpIChmcm9tCiAgICAgbW9kX3Byb3h5IHRvIG1vZF9taW1lKSBvYnNvbGV0ZSBieSBtYWtpbmcgc3VyZSB0aGUgQVBJIGhvb2sgZm9yIE1JTUUgdHlwZQogICAgIGNoZWNraW5nIGlzIHJlYWxseSBjYWxsZWQgZXZlbiBmb3IgcHJveHkgcmVxdWVzdHMgZXhjZXB0IGZvciBVUkxzIHdpdGgKICAgICBIVFRQIHNjaGVtZXMgKGJlY2F1c2UgdGhlcmUgd2UgY2FuIG9wdGltaXplIGJ5IG5vdCBydW5uaW5nIHRoZSB0eXBlCiAgICAgY2hlY2tpbmcgaG9va3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHByb3h5IGdldHMgdGhlIE1JTUUgQ29udGVudC10eXBlCiAgICAgZnJvbSB0aGUgcmVtb3RlIGhvc3QgbGF0ZXIpLiBUaGlzIGNoYW5nZSBjbGVhbnMgdXAgbW9kX21pbWUgYnkgcmVtb3ZpbmcKICAgICB0aGUgdWdseSBleHBvcnQga2x1ZGdlLCBtYWtlcyB0aGUgb25lLWxpbmVyIGZpbGUgbW9kX21pbWUuaCBvYnNvbGV0ZSwgYW5kCiAgICAgZXNwZWNpYWxseSB1bmJ1bmRsZXMgbW9kX3Byb3h5IGFuZCBtb2RfbWltZS4gVGhpcyB3YXkgdGhleSBib3RoIG5vdyBjYW4KICAgICBiZSBjb21waWxlZCBhcyBzaGFyZWQgb2JqZWN0cyBhbmQgYXJlIG5vIGxvbmdlciB0aWVkIHRvZ2V0aGVyLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgdXRpbC5jIGNsZWFudXAgYW5kIHNwZWVkdXAuIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBDbGFyaWZpY2F0aW9uLCBwc3RybmR1cCgpIHdpbGwgYWx3YXlzIGNvcHkgbiBieXRlcyBvZiB0aGUgc291cmNlCiAgICAgYW5kIE5VTCB0ZXJtaW5hdGUgYXQgdGhlIChuKzEpc3QgYnl0ZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgTWFyayBtb2R1bGUgY29tbWFuZF9yZWMgYW5kIGhhbmRsZXJfcmVjIHN0cnVjdHVyZXMgY29uc3Qgc28gdGhhdCB0aGV5CiAgICAgZW5kIHVwIGluIHRoZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9uIChhbmQgYXJlIGZyaWVuZGxpZXIgdG8gc3lzdGVtcwogICAgIHRoYXQgZG9uJ3QgZG8gb3B0aW1pc3RpYyBtZW1vcnkgYWxsb2NhdGlvbiBvbiBmb3JrKCkpLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZCBjaGVjayB0byB0aGUgIlBvcnQiIGRpcmVjdGl2ZSB0byBtYWtlIHN1cmUgdGhlIHNwZWNpZmllZCAKICAgICBwb3J0IGlzIGluIHRoZSBhcHByb3ByaWF0ZSByYW5nZS4gIFtCZW4gSHlkZV0KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIGludm9rZV9oYW5kbGVyKCkuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hQGJvZy5tc3Uuc3U+XQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyBzaGFyZWQgb2JqZWN0cyBldmVuIGZvciBsaWJyYXJ5LXN0eWxlIG1vZHVsZXMKICAgICAod2hpY2ggYXJlIGJ1aWx0IGZyb20gbW9yZSB0aGFuIG9uZSBvYmplY3QgZmlsZSkuIFRoaXMgbm93IHByb3ZpZGVzIHRoZQogICAgIGFiaWxpdHkgdG8gYnVpbGQgbW9kX3Byb3h5IGFzIGEgc2hhcmVkIG9iamVjdCBtb2R1bGUuIEFkZGl0aW9uYWxseQogICAgIG1vZHVsZXMgbGlrZSBtb2RfZXhhbXBsZSBhcmUgbm93IGFsc28gc3VwcG9ydGVkIGZvciBzaGFyZWQgb2JqZWN0CiAgICAgYnVpbGRpbmcgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlcyBub3cgbm8gbG9uZ2VyIGFzc3VtZSB0aGVyZSBpcyBhdAogICAgIGxlYXN0IG9uZSBzdGF0aWNhbGx5IGxpbmtlZCBtb2R1bGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBUEk6IENsYXJpZnkgdXNhZ2Ugb2YgY29udGVudF90eXBlLCBoYW5kbGVyLCBjb250ZW50X2VuY29kaW5nLAogICAgIGNvbnRlbnRfbGFuZ3VhZ2UgYW5kIGNvbnRlbnRfbGFuZ3VhZ2VzIGZpZWxkcyBpbiByZXF1ZXN0X3JlYy4gIFRoZXkKICAgICBtdXN0IGFsd2F5cyBiZSBsb3dlcmNhc2VkOyBhbmQgdGhlIHN0cmluZ3MgcG9pbnRlZCB0byBzaG91bGRuJ3QKICAgICBiZSBtb2RpZmllZCAoeW91IG11c3QgY29weSB0aGVtIHRvIG1vZGlmeSB0aGVtKS4gIEZpeCBhIGZldyBidWdzCiAgICAgcmVsYXRlZCB0byB0aGlzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IENsYXJpZmljYXRpb246IGV4Y2VwdCBmb3IgUkFXX0FSR1MsIGFsbCBjb21tYW5kIGhhbmRsZXJzIGNhbgogICAgIHRyZWF0IHRoZSBjaGFyICogcGFyYW1ldGVycyBhcyBwZXJtYW5lbnQsIGFuZCBtb2RpZmlhYmxlLiAgVGhlcmUKICAgICBpcyBubyBuZWVkIHRvIHBzdHJkdXAoKSB0aGVtLiAgQ2xlYW4gdXAgc29tZSBuZWVkbGVzcyBwc3RyZHVwKCkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBOb3cgbW9kX3NvIGtlZXBzIHRyYWNrIG9mIHdoaWNoIG1vZHVsZSBzaGFyZWQgb2JqZWN0cyB3aXRoIHdoaWNoIG5hbWVzCiAgICAgYXJlIGxvYWRlZCBhbmQgdGh1cyBhdm9pZHMgbXVsdGlwbGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIGFuZCBpcnJpdGF0aW5nCiAgICAgZXJyb3JfbG9nIG1lc3NhZ2VzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUHJpb3IgdG8gdGhlIGV4aXN0ZW5jZSBvZiBtb2Rfc2V0ZW52IGl0IHdhcyBuZWNlc3NhcnkgdG8gdHdlYWsgdGhlIFRaCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGFwYWNoZSBjb3JlLiAgQnV0IHRoYXQgdHdlYWtpbmcgaW50ZXJmZXJlcwogICAgIHdpdGggbW9kX3NldGVudi4gIFNvIGRvbid0IHR3ZWFrIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYW4gZXhwbGljaXQKICAgICBUWiB2YXJpYWJsZS4gIFtKYXkgU29mZmlhbiA8amF5QGNpbWVkaWEuY29tPl0gUFIjMTg4OAoKICAqKSBycHV0cygpIGRpZCBub3QgY2FsY3VsYXRlIHItPnNlbnRfYm9keWN0IHByb3Blcmx5LgogICAgIFtTaWVnbXVuZCBTdGlybndlaXNzIDxzaWVnc3RAa2F0LmluYS5kZT5dIFBSIzE5MDAKCiAgKikgVGhlIENHSSBzcGVjIHNheXMgdGhhdCBSRU1PVEVfSE9TVCBzaG91bGQgYmUgc2V0IHRvIHRoZSByZW1vdGUgaG9zdHMncwogICAgIG5hbWUsIG9yIGxlZnQgdW5zZXQgaWYgdGhpcyB2YWx1ZSBpcyB1bmF2YWlsYWJsZS4gIEFwYWNoZSB3YXMgc2V0dGluZwogICAgIGl0IHRvIHRoZSBJUCBhZGRyZXNzIHdoZW4gdW5hdmFpbGFibGUuCiAgICAgW1RvbnkgRmluY2ggPGZhbmZAZGVtb24ubmV0Pl0gUFIjMTkyNQoKICAqKSBWYXJpb3VzIGltcHJvdmVtZW50cyB0byB0aGUgY29uZmlndXJhdGlvbiBhbmQgYnVpbGQgc3VwcG9ydCBmb3IgY29tcGlsaW5nCiAgICAgbW9kdWxlcyBhcyBzaGFyZWQgb2JqZWN0cy4gRXNwZWNpYWxseSBTb2xhcmlzIDIueCwgU3VuT1MgNC4xLCBJUklYIGFuZAogICAgIE9TRjEgc3VwcG9ydCB3aXRoIEdDQyBhbmQgdmVuZG9yIGNvbXBpbGVycyB3YXMgYWRkZWQuICBUaGlzIHdheSBzaGFyZWQKICAgICBvYmplY3Qgc3VwcG9ydCBpcyBub3cgcHJvdmlkZWQgb3V0LW9mLXRoZS1ib3ggZm9yIEZyZWVCU0QsIExpbnV4LAogICAgIFNvbGFyaXMsIFN1bk9TLCBJUklYIGFuZCBPU0YxLiBJbiBzaG9ydDogT24gYWxsIG1ham9yIHBsYXRmb3JtcyEKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWlub3IgY2xlYW51cCBpbiBodHRwX21haW4gLS0gc3BsaXQgUU5YIGFuZCBPUzIgc3BlY2lmaWMgIm1tYXAiCiAgICAgc2NvcmVib2FyZCBjb2RlIGludG8gc2VwYXJhdGUgI2RlZmluZXMgLS0gVVNFX1BPU0lYX1NDT1JFQk9BUkQKICAgICBhbmQgVVNFX09TMl9TQ09SRUJPQVJELiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggb25lIG1vcmUgc3BlY2lhbCBsb2NraW5nIHByb2JsZW0gZm9yIFJld3JpdGVNYXAgcHJvZ3JhbXMgaW4KICAgICBtb2RfcmV3cml0ZTogQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGZsb2NrKCksICJMb2NrcyBhcmUgb24KICAgICBmaWxlcywgbm90IGZpbGUgZGVzY3JpcHRvcnMuICBUaGF0IGlzLCBmaWxlIGRlc2NyaXB0b3JzIGR1cGxpY2F0ZWQKICAgICB0aHJvdWdoIGR1cCgyKSBvciBmb3JrKDIpIGRvIG5vdCByZXN1bHQgaW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGEgbG9jaywKICAgICBidXQgcmF0aGVyIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gYSBzaW5nbGUgbG9jay4gSWYgYSBwcm9jZXNzIGhvbGRpbmcgYQogICAgIGxvY2sgb24gYSBmaWxlIGZvcmtzIGFuZCB0aGUgY2hpbGQgZXhwbGljaXRseSB1bmxvY2tzIHRoZSBmaWxlLCB0aGUKICAgICBwYXJlbnQgd2lsbCBsb3NlIGl0cyBsb2NrLiIuIFRvIG92ZXJjb21lIHRoaXMgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlCiAgICAgUmV3cml0ZUxvY2sgZmlsZSBpcyBvcGVuZWQgX0FGVEVSXyB0aGUgY2hpbGRzIHdlcmUgc3Bhd25lZCB3aGljaCBpcyBub3cKICAgICB0aGUgY2FzZSBieSBvcGVuaW5nIGl0IGluIHRoZSBjaGlsZF9pbml0IGluc3RlYWQgb2YgdGhlIG1vZHVsZV9pbml0IEFQSQogICAgIGhvb2suIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMDI5CgogICopIENoYW5nZSB0byBMb2NhdGlvbiBhbmQgTG9jYXRpb25NYXRjaCBzZW1hbnRpY3MuICBMb2NhdGlvbk1hdGNoIG5vCiAgICAgbG9uZ2VyIGxldHMgYSBzaW5nbGUgc2xhc2ggbWF0Y2ggbXVsdGlwbGUgYWRqYWNlbnQgc2xhc2hlcyBpbiB0aGUKICAgICBVUkwuICBUaGlzIGNoYW5nZSBpcyBmb3IgY29uc2lzdGVuY3kgd2l0aCBSZXdyaXRlUnVsZSBhbmQKICAgICBBbGlhc01hdGNoLiAgTXVsdGlwbGUgc2xhc2hlcyBoYXZlIG1lYW5pbmcgaW4gVVJMcyB0aGF0IHRoZXkgZG8KICAgICBub3QgaGF2ZSBpbiAoc29tZSkgZmlsZXN5c3RlbXMuICBMb2NhdGlvbiBvbiB0aGUgb3RoZXIgaGFuZCBjYW4KICAgICBiZSBjb25zaWRlcmVkIGEgc2hvcnRoYW5kIGZvciBhIG1vcmUgY29tcGxpY2F0ZWQgcmVnZXgsIGFuZCBpdAogICAgIGRvZXMgbWF0Y2ggbXVsdGlwbGUgc2xhc2hlcyB3aXRoIGEgc2luZ2xlIHNsYXNoIC0tIHdoaWNoIGlzCiAgICAgYWxzbyBjb25zaXN0ZW50IHdpdGggdGhlIEFsaWFzIGRpcmVjdGl2ZS4KICAgICBbRGVhbiBHYXVkZXRdIHJlbGF0ZWQgUFIjMTQ0MAoKICAqKSBGaXggYnVnIHdpdGggbW9kX21pbWVfbWFnaWMgY2F1c2luZyBjZXJ0YWluIGZpbGVzLCBpbmNsdWRpbmcgZmlsZXMKICAgICBvZiBsZW5ndGggMCwgdG8gcmVzdWx0IGluIG5vIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFRoZSBDb25maWd1cmUgc2NyaXB0IG5vdyBnZW5lcmF0ZXMgc3JjL2luY2x1ZGUvYXBfY29uZmlnLmggd2hpY2gKICAgICBjb250YWlucyB0aGUgc2V0IG9mIGRlZmluZXMgdXNlZCB3aGVuIEFwYWNoZSBpcyBjb21waWxlZCBvbiBhIHBsYXRmb3JtLgogICAgIFRoaXMgZmlsZSBjYW4gdGhlbiBiZSBpbmNsdWRlZCBieSBleHRlcm5hbCBtb2R1bGVzIGJlZm9yZSBpbmNsdWRpbmcKICAgICBhbnkgQXBhY2hlIGhlYWRlciBmaWxlcyBpbiBjYXNlIHRoZXkgYXJlIGJlaW5nIGJ1aWx0IHNlcGFyYXRlbHkgZnJvbQogICAgIEFwYWNoZS4gIEFsb25nIHdpdGggdGhpcyBjaGFuZ2UsIGEgY291cGxlIG9mIG1pbm9yIGNoYW5nZXMgd2VyZQogICAgIG1hZGUgdG8gbWFrZSBBcGFjaGUncyAjZGVmaW5lcyBjb2V4aXN0IHBlYWNlZnVsbHkgd2l0aCBhbnkgYXV0b2NvbmYKICAgICBkZWZpbmVzIGFuIGV4dGVybmFsIG1vZHVsZSBtaWdodCBoYXZlLiBbUmFzbXVzIExlcmRvcmZdCgogICopIEZpeCBtb2RfcmV3cml0ZSBmb3IgdGhlIHVnbHkgQVBJIGNhc2Ugd2hlcmUgPFZpcnR1YWxIb3N0PiBzZWN0aW9ucyBleGlzdAogICAgIGJ1dCB3aXRob3V0IGFueSBSZXdyaXRlWFhYWFggZGlyZWN0aXZlcy4gSGVyZSBtb2RfcmV3cml0ZSBpcyBnaXZlbiBubwogICAgIGNoYW5jZSBieSB0aGUgQVBJIHRvIGluaXRpYWxpemUgaXRzIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiBhbmQgdGh1cwogICAgIHJlY2VpdmVzIHRoZSB3cm9uZyBvbmUgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuIFRoaXMgaXMgbm93IGF2b2lkZWQgYnkKICAgICByZW1lbWJlcmluZyB0aGUgc2VydmVyIHRvZ2V0aGVyIHdpdGggdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgd2hpbGUKICAgICBjb25maWd1cmluZyBhbmQgbGF0ZXIgYXNzdW1pbmcgdGhlcmUgaXMgbm8gY29uZmlnIHdoZW4gd2Ugc2VlIGEKICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbWVtYmVyZWQgc2VydmVyIGFuZCB0aGUgb25lIGNhbGxpbmcgdXMuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNzkwCgogICopIEZpeGVkIHRoZSBEQk0gUmV3cml0ZU1hcCBzdXBwb3J0IGZvciBtb2RfcmV3cml0ZTogRmlyc3QgdGhlIHN1cHBvcnQgbm93CiAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCB1bmRlciBjb25maWd1cmUgdGltZSB3aGVuIHRoZSBkYm1feHh4IGZ1bmN0aW9ucwogICAgIGFyZSBub3QgYXZhaWxhYmxlLiBTZWNvbmQsIHR3byBoZWF2eSBzb3VyY2UgY29kZSBlcnJvcnMgaW4gdGhlIERCTQogICAgIHN1cHBvcnQgY29kZSB3ZXJlIGZpeGVkLiAgVGhpcyBtYWtlcyBEQk0gUmV3cml0ZU1hcCdzIHVzYWJsZSBhZ2FpbiBhZnRlcgogICAgIGEgbG9uZyB0aW1lIG9mIGJyb2tlbm5lc3MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNjk2CgogICopIE5vdyBhbGwgY29uZmlndXJhdGlvbiBmaWxlcyBzdXBwb3J0IFVuaXgtc3R5bGUgbGluZS1jb250aW51YXRpb24gdmlhIAogICAgIHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggKCJcIikgY2hhcmFjdGVyLiBUaGlzIGVuYWJsZXMgdXMgdG8gd3JpdGUgZG93bgogICAgIGNvbXBsZXggb3IganVzdCB2ZXJ5IGxvbmcgZGlyZWN0aXZlcyBpbiBhIG1vcmUgcmVhZGFibGUgd2F5LiAgVGhlCiAgICAgYmFja3NsYXNoIGNoYXJhY3RlciBoYXMgdG8gYmUgcmVhbGx5IHRoZSBsYXN0IGNoYXJhY3RlciBiZWZvcmUgdGhlCiAgICAgbmV3bGluZSBhbmQgaXQgaGFzIG5vdCBiZWVuIHByZWZpeGVkIGJ5IGFub3RoZXIgKGVzY2FwaW5nKSBiYWNrc2xhc2guCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdoZW4gdXNpbmcgUHJveHlQYXNzIHRoZSA/cXVlcnlzdHJpbmcgd2FzIG5vdCBwYXNzZWQgY29ycmVjdGx5LgogICAgIFtKb2VsIFRydWhlciA8dHJ1aGVyQHdpcmVkLmNvbT5dCgogICopIFRvIGRlYWwgd2l0aCBtb2R1bGVzIGJlaW5nIGNvbXBpbGVkIGFuZCBbZHluYW1pY2FsbHldIGxpbmtlZAogICAgIGF0IGEgZGlmZmVyZW50IHRpbWUgZnJvbSB0aGUgY29yZSwgdGhlIFNFUlZFUl9WRVJTSU9OIGFuZAogICAgIFNFUlZFUl9CVUlMVCBzeW1ib2xzIGhhdmUgYmVlbiBhYnN0cmFjdGVkIHRocm91Z2ggdGhlIG5ldwogICAgIEFQSSByb3V0aW5lcyBhcGFwaV9nZXRfc2VydmVyX3ZlcnNpb24oKSBhbmQgYXBhcGlfZ2V0X3NlcnZlcl9idWlsdCgpLgogICAgIFtLZW4gQ29hcl0gIFBSIzE0NDgKCiAgKikgV0lOMzI6IFByZXNlcnZlIHRyYWlsaW5nIHNsYXNoIGluIGNhbm9uaWNhbCBwYXRoIChhbmQgaGVuY2UKICAgICBpbiBQQVRIX0lORk8pLiBbUGF1bCBTdXR0b24sIEJlbiBMYXVyaWVdCgogICopIFBPUlQ6IFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUIGhhcyBwcm92ZW4gdW5yZWxpYWJsZQogICAgIGRlcGVuZGluZyBvbiB0aGUgcmV2IG9mIFNvbGFyaXMgYW5kIHdoYXQgbWl4dHVyZSBvZiBtb2R1bGVzCiAgICAgYXJlIGluIHVzZS4gIFNvIGl0IGhhcyBiZWVuIGRpc2FibGVkLCBhbmQgU29sYXJpcyBpcyBiYWNrIHRvCiAgICAgdXNpbmcgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULiAgVXNlcnMgbWF5IGV4cGVyaW1lbnQgd2l0aAogICAgIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUIGF0IHRoZWlyIG93biByaXNrLCBpdCBtYXkgc3BlZWQKICAgICB1cCBzdGF0aWMgY29udGVudCBvbmx5IHNlcnZlcnMuICBPciBpdCBtYXkgZmFpbCB1bnByZWRpY3RhYmx5LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTc3OSwgMTg1NCwgMTkwNAoKICAqKSBtb2RfdGVzdF91dGlsX3VyaS5jIGNyZWF0ZWQgd2hpY2ggdGVzdHMgdGhlIGxvZ2ljIGluIHV0aWxfdXJpLmMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IFJld3JpdGUgb2YgYWJzb2x1dGVVUkkgaGFuZGxpbmcsIGFuZCBpbiBwYXJ0aWN1bGFyIGhvdwogICAgIGFic29sdXRlVVJJcyBtYXRjaCB2aG9zdHMuICBVbmxlc3MgYSByZXF1ZXN0IGlzIGEgcHJveHkgcmVxdWVzdCwgYQogICAgICJodHRwOi8vaG9zdCIgdXJsIGlzIHRyZWF0ZWQgYXMgaWYgYSBzaW1pbGFyICJIb3N0OiIgaGVhZGVyIGhhZCBiZWVuCiAgICAgc3VwcGxpZWQuICBUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBzdXBwb3J0IGZ1dHVyZSBIVFRQLzEueCBwcm90b2NvbHMKICAgICB3aGljaCBtYXkgcmVxdWlyZSBjbGllbnRzIHRvIHNlbmQgYWJzb2x1dGVVUklzIGZvciBhbGwgcmVxdWVzdHMuCgogICAgIEluIG9yZGVyIHRvIGFjaGlldmUgdGhpcyBjaGFuZ2Ugc3VidGxlIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBBUEkuICBJbiBhCiAgICAgcmVxdWVzdF9yZWMsIHItPmhvc3RsZW4gaGFzIGJlZW4gcmVtb3ZlZC4gIHItPnVucGFyc2VkX3VyaSBub3cgZXhpc3RzIHNvCiAgICAgdGhhdCB0aGUgdW5tb2RpZmllZCB1cmkgY2FuIGJlIHJldHJpZXZlZCBlYXNpbHkuICByLT5wcm94eXJlcSBpcyBub3Qgc2V0CiAgICAgYnkgdGhlIGNvcmUsIG1vZHVsZXMgbXVzdCBzZXQgaXQgZHVyaW5nIHRoZSBwb3N0X3JlYWRfcmVxdWVzdCBvcgogICAgIHRyYW5zbGF0ZV9uYW1lcyBwaGFzZS4KCiAgICAgUGx1cyBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsaG9zdCB0ZXN0IHN1aXRlIGZvciBhYnNvbHV0ZVVSSSB0ZXN0aW5nLgoKICAgICBUaGlzIGZpeGVzIHNldmVyYWwgYnVncyB3aXRoIHRoZSBwcm94eSBwcm94eWluZyByZXF1ZXN0cyB0byB2aG9zdHMKICAgICBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh0dHBkLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBDbGVhbnVwIG9mIGNvZGUgaW4gaHR0cF92aG9zdC5jLCBhbmQgcmVtb3ZlIHZob3N0IG1hdGNoaW5nCiAgICAgY29kZSBmcm9tIG1vZF9yZXdyaXRlLiAgVGhlIHZob3N0IG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgYnkgYQogICAgIGdsb2JhbGx5IGF2YWlsYWJsZSBmdW5jdGlvbiBtYXRjaGVzX3JlcXVlc3Rfdmhvc3QoKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgUmVkdWNlIG1lbW9yeSB1c2FnZSwgYW5kIHNwZWVkIHVwIFNlcnZlckFsaWFzIHN1cHBvcnQuICBBcyBhCiAgICAgc2lkZS1lZmZlY3QgdXNlcnMgY2FuIGxpc3QgbXVsdGlwbGUgU2VydmVyQWxpYXMgZGlyZWN0aXZlcwogICAgIGFuZCB0aGV5J3JlIGFsbCBjb25zaWRlcmVkLgogICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW9AY2lyeC5vcmc+XSBQUiMxNTMxCgogICopIFRoZSAicG9seSIgZGlyZWN0aXZlIGluIGltYWdlIG1hcHMgZGlkIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzIG9mIHRoZQogICAgIHBvbHlnb24sIHdoZXJlYXMgdGhlICJyZWN0IiBkaXJlY3RpdmUgZG9lcy4gIEZpeCB0aGlzIGluY29uc2lzdGVuY3kuCiAgICAgW0tvbnN0YW50aW4gTW9yc2huZXYgPG1va29AZGVzaWduLnJ1Pl0gUFIjMTc3MQoKICAqKSBNYWtlIFxcIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFtSb25hbGQuVHNjaGFsYWVyQHBzaS5jaF0KCiAgKikgQWRkIHRoZSBgJWEnIGNvbnN0cnVjdCB0byBMb2dGb3JtYXQgYW5kIEN1c3RvbUxvZyB0byBsb2cgdGhlIGNsaWVudCBJUAogICAgIGFkZHJlc3MuIFtUb2RkIEVpZ2Vuc2NoaW5rIDxlaWdlbnN0ckBtaXhpLm5ldD5dIFBSIzE4ODUKCiAgKikgQVBJOiBBIG5ldyBzb3VyY2UgbW9kdWxlIG1haW4vdXRpbF91cmkuYzsgSXQgY29udGFpbnMgYSByb3V0aW5lCiAgICAgcGFyc2VfdXJpX2NvbXBvbmVudHMoKSBhbmQgZnJpZW5kcyB3aGljaCBicmVha3MgYSBVUkkgaW50byBpdHMgY29tcG9uZW50CiAgICAgcGFydHMuICBUaGVzZSBwYXJ0cyBhcmUgc3RvcmVkIGluIGEgdXJpX2NvbXBvbmVudHMgc3RydWN0dXJlIGNhbGxlZAogICAgIHBhcnNlZF91cmkgd2l0aGluIGVhY2ggcmVxdWVzdF9yZWMsIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGFsbCBtb2R1bGVzLgogICAgIEFkZGl0aW9uYWxseSwgYW4gdW5wYXJzZSByb3V0aW5lIGlzIHN1cHBsaWVkIHdoaWNoIHJlLWFzc2VtYmxlcyB0aGUgVVJJCiAgICAgY29tcG9uZW50cyBiYWNrIHRvIGFuIFVSSSwgb3B0aW9uYWxseSBoaWRpbmcgdGhlIHVzZXJuYW1lOnBhc3N3b3JkQCBwYXJ0CiAgICAgZnJvbSBmdHAgcHJveHkgcmVxdWVzdHMsIGFuZCBvdGhlciB1c2VmdWwgcm91dGluZXMuICBXaXRoaW4gdGhlIHN0cnVjdHVyZSwKICAgICB5b3UgZmluZCBvbiBhIHJlYWR5LWZvci11c2UgYmFzaXM6CiAgICAgICAgc2NoZW1lOyAgICAgLyogc2NoZW1lICgiaHR0cCIvImZ0cCIvLi4uKSAqLwogICAgICAgIGhvc3RpbmZvOyAgIC8qIGNvbWJpbmVkIFt1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdICovCiAgICAgICAgdXNlcjsgICAgICAgLyogdXNlciBuYW1lLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwogICAgICAgIHBhc3N3b3JkOyAgIC8qIHBhc3N3b3JkLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwogICAgICAgIGhvc3RuYW1lOyAgIC8qIGhvc3RuYW1lIGZyb20gVVJJIChvciBmcm9tIEhvc3Q6IGhlYWRlcikgKi8KICAgICAgICBwb3J0X3N0cjsgICAvKiBwb3J0IHN0cmluZyAoaW50ZWdlciByZXByZXNlbnRhdGlvbiBpcyBpbiAicG9ydCIpICovCiAgICAgICAgcGF0aDsgICAgICAgLyogdGhlIHJlcXVlc3QgcGF0aCAob3IgIi8iIGlmIG9ubHkgc2NoZW1lOi8vaG9zdCB3YXMgZ2l2ZW4pICovCiAgICAgICAgcXVlcnk7ICAgICAgLyogRXZlcnl0aGluZyBhZnRlciBhICc/JyBpbiB0aGUgcGF0aCwgaWYgcHJlc2VudCAqLwogICAgICAgIGZyYWdtZW50OyAgIC8qIFRyYWlsaW5nICIjZnJhZ21lbnQiIHN0cmluZywgaWYgcHJlc2VudCAqLwogICAgIFRoaXMgaXMgbWVhbnQgdG8gc2VydmUgYXMgdGhlIHBsYXRmb3JtIGZvciAqQklHKiBzYXZpbmdzIGluCiAgICAgY29kZSBjb21wbGV4aXR5IGZvciB0aGUgcHJveHkgbW9kdWxlIChhbmQgbWF5YmUgdGhlIHZob3N0IGxvZ2ljKS4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIE1ha2UgYWxsIHBvc3NpYmxlIG1ldGEtY29uc3RydWN0IGV4cGFuc2lvbnMgKCROLCAlTiwgJXtOQU1FfSBhbmQKICAgICAke21hcDprZXl9KSBhdmFpbGFibGUgZm9yIGFsbCBsb2NhdGlvbiB3aGVyZSBhIHN0cmluZyBpcyBjcmVhdGVkIGluCiAgICAgbW9kX3Jld3JpdGUgcmV3cml0aW5nIHJ1bGVzZXRzOiAxc3QgYXJnIG9mIFJld3JpdGVDb25kLCAybmQgYXJnIG9mCiAgICAgUmV3cml0ZVJ1bGUgYW5kIGZvciB0aGUgW0U9TkFNRTpTVFJJTkddIGZsYWcgb2YgUmV3cml0ZVJ1bGUuIFRoaXMgd2F5IHRoZQogICAgIHBvc3NpYmxlIGV4cGFuc2lvbnMgYXJlIGNvbnNlcXVlbnRseSB1c2FibGUgYXQgYWxsIHN0cmluZyBjcmVhdGlvbgogICAgIGxvY2F0aW9ucy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBpbml0aWFsaXphdGlvbiBvZiBSZXdyaXRlTG9nTGV2ZWwgKGRlZmF1bHQgbm93IGlzIDAgYXMgZG9jdW1lbnRlZCAKICAgICBhbmQgbm90IDEpIGFuZCB0aGUgcGVyLXZpcnR1YWwtc2VydmVyIG1lcmdpbmcgb2YgZGlyZWN0aXZlcy4gTm93IGFsbAogICAgIGRpcmVjdGl2ZXMgZXhjZXB0IGBSZXdyaXRlRW5naW5lJyBhbmQgYFJld3JpdGVPcHRpb24nIGFyZSBlaXRoZXIKICAgICBjb21wbGV0ZWx5IG92ZXJyaWRkZW4gKGRlZmF1bHQpIG9yIGNvbXBsZXRlbHkgaW5oZXJpdGVkICh3aGVuCiAgICAgYFJld3JpdGVPcHRpb25zIGluaGVyaXQnKSBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTMyNQoKICAqKSBGaXggYFJld3JpdGVNYXAnIHByb2dyYW0gbG9va3VwIGluIHNpdHVhdGlvbnMgd2hlcmUgc3VjaCBtYXBzIGFyZQogICAgIGRlZmluZWQgYnV0IGRpc2FibGVkIChgUmV3cml0ZUVuZ2luZSBvZmYnKSBpbiBwZXItc2VydmVyIGNvbnRleHQuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNDMxCgogICopIEZpeCBidWcgaW50cm9kdWNlZCBpbiAxLjNiNC1kZXYsIGNvbmZpZyB3aXRoIG5vIFBvcnQgc2V0dGluZyB3b3VsZCBjYXVzZQogICAgIHNlcnZlciB0byBiaW5kIHRvIHBvcnQgMCByYXRoZXIgdGhhbiA4MC4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGxvbmctc3RhbmRpbmcgcHJvYmxlbSB3aXRoIFJld3JpdGVNYXAgX3Byb2dyYW1zXyB1bmRlciBVbml4IGRlcml2YXRlcwogICAgIChsaWtlIFN1bk9TIGFuZCBGcmVlQlNEKSB3aGljaCBkb24ndCBhY2NlcHQgdGhlIGxvY2tpbmcgb2YgcGlwZXMKICAgICBkaXJlY3RseS4gIEEgbmV3IGRpcmVjdGl2ZSBSZXdyaXRlTG9jayBpcyBpbnRyb2R1Y2VkIHdoaWNoIGNhbiBiZSB1c2VkIHRvCiAgICAgc2V0dXAgYSBzZXBhcmF0ZSBsb2NraW5nIGZpbGUgd2hpY2ggdGhlbiBpcyB1c2VkIGZvciBzeW5jaHJvbml6YXRpb24uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzEwMjkKCiAgKikgV0lOMzI6IFRoZSBzZXJ2ZXIgcm9vdCBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBrZXkKICAgICBIS0xNXFNPRlRXQVJFXEFwYWNoZSBHcm91cFxBcGFjaGVcPHZlcnNpb24+ICh2ZXJzaW9uIGlzIGN1cnJlbnRseQogICAgICIxLjMgYmV0YSIpLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgLWQgY29tbWFuZCBsaW5lIGZsYWcuIFRoZQogICAgIHZhbHVlIGlzIHN0b3JlZCBieSBydW5uaW5nICJhcGFjaGUgLWkgLWQgc2VydmVycm9vdCIuIFtQYXVsIFN1dHRvbl0KCiAgKikgTWVyZ2VkIG9zL3dpbjMyL21vZF9kbGwuYyBpbnRvIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3NvLmMgdG8gc3VwcG9ydAogICAgIGR5bmFtaWMgbG9hZGluZyBvbiBXaW4zMiBhbmQgVW5peCB2aWEgdGhlIHNhbWUgbW9kdWxlLiBbUGF1bCBTdXR0b25dCgogICopIE5vdyBtb2RfcmV3cml0ZSBubyBsb25nZXIgbWFrZXMgcHJvYmxlbWF0aWMgYXNzdW1wdGlvbnMgb24gdGhlIGNoYXJhY3RlcnMKICAgICBhIHVzZXJuYW1lIGNhbiBjb250YWluIHdoZW4gdHJ5aW5nIHRvIGV4cGFuZCBpdCB2aWEgL2V0Yy9wYXNzd2QuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBUaGUgbW9kX3NldGVudmlmIEJyb3dzZXJNYXRjaCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb21tYW5kIGRpZCBub3QKICAgICB3b3JrIHByb3Blcmx5IHdpdGggc3BhY2VzIGluIHRoZSByZWdleC4gIFtSb25hbGQgVHNjaGFsYWVyXSBQUiMxODI1CgogICopIEFkZCBuZXcgUmV3cml0ZU1hcCB0eXBlczogRmlyc3QsIGBybmQnIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGB0eHQnCiAgICAgdHlwZSBidXQgd2l0aCBhIHNwZWNpYWwgcG9zdC1wcm9jZXNzaW5nIGZvciB0aGUgbG9va2VkLXVwIHZhbHVlOiBJdAogICAgIHBhcnNlcyBpdCBpbnRvIGFsdGVybmF0aXZlcyBhY2NvcmRpbmcgdG8gYHwnIGNoYXJzIGFuZCB0aGVuIG9ubHkgb25lCiAgICAgcGFydGljdWxhciBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4gcmFuZG9tbHkgKHRoaXMgaXMgYW4gZXNzZW50aWFsCiAgICAgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGJhbGFuY2luZyBiZXR3ZWVuIGJhY2tlbmQtc2VydmVycyB3aGVuIHVzaW5nCiAgICAgQXBhY2hlIGFzIGEgUmV2ZXJzZSBQcm94eS4gIFRoZSBsb29rZWQgdXAgdmFsdWUgaGVyZSBpcyBhIGxpc3Qgb2YKICAgICBzZXJ2ZXJzKS4gU2Vjb25kLCBgaW50JyB3aXRoIHRoZSBidWlsdC1pbiBtYXBzIG5hbWVkIGB0b2xvd2VyJyBhbmQKICAgICBgdG91cHBlcicgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFwIFVSTCBwYXJ0cyB0byBhIGZpeGVkIGNhc2UgKHRoaXMgaXMgYW4KICAgICBlc3NlbnRpYWwgZmVhdHVyZSB0byBmaXggdGhlIGNhc2Ugb2Ygc2VydmVyIG5hbWVzIHdoZW4gZG9pbmcgbWFzcwogICAgIHZpcnR1YWwtaG9zdGluZyB3aXRoIHRoZSBoZWxwIG9mIG1vZF9yZXdyaXRlIGluc3RlYWQgb2YgdXNpbmcKICAgICA8VmlydHVhbEhvc3Q+IHNlY3Rpb25zKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBhcnRzIGJhc2VkIG9uIGNvZGUgZnJvbQogICAgIEpheSBTb2ZmaWFuIDxqYXlAY2ltZWRpYS5jb20+XSBQUiMxNjMxCgogICopIEFkZCBhIG5ldyBkaXJlY3RpdmUgdG8gbW9kX3Byb3h5IHNpbWlsYXIgdG8gUHJveHlQYXNzOiBgUHJveHlQYXNzUmV2ZXJzZScuCiAgICAgVGhpcyBkaXJlY3RpdmUgbGV0cyBBcGFjaGUgYWRqdXN0IHRoZSBVUkwgaW4gTG9jYXRpb24taGVhZGVycyBvbiBIVFRQCiAgICAgcmVkaXJlY3QgcmVzcG9uc2VzIHNlbnQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuIFRoaXMgd2F5IHRoZSB2aXJ0dWFsbHkKICAgICBtYXBwZWQgYXJlYSBpcyBubyBsb25nZXIgbGVmdCBvbiByZWRpcmVjdHMgYW5kIHRodXMgYnktcGFzc2VkIHdoaWNoIGlzCiAgICAgZXNwZWNpYWxseSBlc3NlbnRpYWwgd2hlbiBydW5uaW5nIEFwYWNoZSBhcyBhIHJldmVyc2UgcHJveHkuICAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSGlkZSBQcm94eS1BdXRob3JpemF0aW9uIGZyb20gQ0dJL1NTSS9ldGMganVzdCBsaWtlIEF1dGhvcml6YXRpb24gaXMKICAgICBoaWRkZW4uIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgQXBhY2hlIHdpbGwsIHdoZW4gc3RhcnRlZCB3aXRoIHRoZSAtWCAoc2luZ2xlIHByb2Nlc3MpIGRlYnVnZ2luZyBmbGFnLAogICAgIGhvbm9yIHRoZSBTSUdJTlQgb3IgU0lHUVVJVCBzaWduYWxzIGFnYWluIG5vdy4gVGhpcyBjYXBhYmlsaXR5IGdvdCBsb3N0CiAgICAgYSB3aGlsZSBhZ28gZHVyaW5nIE9TLzIgc2lnbmFsIGhhbmRsaW5nIGNoYW5nZXMuCgogICopIFtQT1JUXSBXb3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IE5lWFQgcnVucyBvbiBtb3JlIHRoYW4gdGhlCiAgICAgbTY4ayBjaGlwcyBpbiBtb2Rfc3RhdHVzIFtTY290dCBBbmd1aXNoIGFuZCBUaW1vdGh5IEx1b21hCiAgICAgPGx1b21hdEBwZWFrLm9yZz5dCgogICopIFtQT1JUXSBSZWNvZ25pemUgRnJlZUJTRCB2ZXJzaW9ucyBzbyB3ZSBjYW4gdXNlIHRoZSBPUyByZWdleCBhcyB3ZWxsCiAgICAgYXMgaGFuZGxpbmcgdW5zaWduZWQtY2hhcnMgZm9yIEZyZWVCU0QgdjMgYW5kIHYyIFtBbmRyZXkgQ2hlcm5vdgogICAgIDxhY2hlQG5hZ3VhbC5wcC5ydT4gYW5kIEppbV0gUFIjMTQ1MAoKICAqKSBVc2UgU0FfUkVTRVRIQU5EIG9yIFNBX09ORVNIT1Qgd2hlbiBpbnN0YWxsaW5nIHRoZSBjb3JlZHVtcCBoYW5kbGVycy4KICAgICBJbiBwYXJ0aWN1bGFyIHRoZSBoYW5kbGVycyBjb3VsZCB0cmlnZ2VyIHRoZW1zZWx2ZXMgaW50byBhbiBpbmZpbml0ZQogICAgIGxvb3AgaWYgUkxpbWl0TWVtIHdhcyB1c2VkIHdpdGggYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IC0tIHRvbyBzbWFsbAogICAgIGZvciB0aGUgc2lnbmFsIHN0YWNrIGZyYW1lIHRvIGJlIHNldCB1cC4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IHByb2JsZW1zIHdpdGggYWJzb2x1dGVVUklzIGludHJvZHVjZWQgZHVyaW5nIDEuM2I0LiAgW0RlYW4gR2F1ZGV0LAogICAgIEFsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhIDxhbHZhcm9AbGFuZGVyLmVzPl0KCiAgKikgRml4IG11bHRpcGxlIFVzZXJEaXIgcHJvYmxlbSBpbnRyb2R1Y2VkIGR1cmluZyAxLjNiNC1kZXYuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxODUwCgogICopIGFwX2NweXN0cm4oKSBoYWQgYW4gb2ZmLWJ5LTEgZXJyb3IuCiAgICAgW0NoYXJsZXMgRnUgPGNjd2ZAa2xhYi5jYWx0ZWNoLmVkdT5dIFBSIzE4NDcKCiAgKikgQVBJOiBBcyBLZW4gc3VnZ2VzdGVkIHRoZSBjaGVja19jbWRfY29udGV4dCgpIGZ1bmN0aW9uIGFuZCByZWxhdGVkCiAgICAgZGVmaW5lcyBhcmUgbm9uLXN0YXRpYyBub3cgc28gbW9kdWxlcyBjYW4gdXNlICdlbS4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgbW9kX2luZm8gd291bGQgb2NjYXNpb25hbGx5IHByb2R1Y2UgYW4gdW5wYWlyZWQgPHR0PiBpbiBpdHMKICAgICBvdXRwdXQuIEZpeGVkLiBbTWFydGluIEtyYWVtZXJdCgogICopIEJ5IGRlZmF1bHQgQUlYIGJpbmRzIGEgcHJvY2VzcyAoYW5kIGl0J3MgY2hpbGRyZW4pIHRvIGEgc2luZ2xlCiAgICAgcHJvY2Vzc29yLiAgaHR0cGQgY2hpbGRyZW4gbm93IHVuYmluZCB0aGVtc2VsdmVzIGZyb20gdGhhdCBjcHUKICAgICBhbmQgcmUtYmluZCB0byBvbmUgc2VsZWN0ZWQgYXQgcmFuZG9tIHZpYSBiaW5kcHJvY2Vzc29yKCkKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBMaW51eCAyLjAgYW5kIGFib3ZlIGltcGxlbWVudCBSTElNSVRfQVMsIFJMSU1JVF9EQVRBIGhhcyBhbG1vc3Qgbm8KICAgICBlZmZlY3QuICBXb3JrIGFyb3VuZCBpdCBieSB1c2luZyBSTElNSVRfQVMgZm9yIHRoZSBSTGltaXRNRU0KICAgICBkaXJlY3RpdmUuICBbRW5yaWsgQmVya2hhbiA8ZW5yaWtAaW5rYS5kZT5dIFBSIzE4MTYKCiAgKikgbW9kX21pbWVfbWFnaWMgZXJyb3IgbWVzc2FnZSBzaG91bGQgaW5kaWNhdGUgdGhlIGZpbGVuYW1lIHdoZW4KICAgICByZWFkcyBmYWlsLiAgWyJNLkQuUGFya2VyIiA8bWRwY0BuZXRjb20uY29tPl0gUFIjMTgyNwoKICAqKSBQcmV2aW91c2x5IEFwYWNoZSB3b3VsZCBwZXJtaXQgPC9GaWxlcz4gdG8gZW5kIDxGaWxlc01hdGNoPiAoYW5kCiAgICAgc2ltaWxhcnkgZm9yIExvY2F0aW9uIGFuZCBEaXJlY3RvcnkpLCBub3cgdGhpcyBpcyBkaWFnbm9zZWQgYXMgYW4KICAgICBlcnJvci4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIG1pc21hdGNoZWQgc2VjdGlvbnMgKDxGaWxlcz4sCiAgICAgPEZpbGVzTWF0Y2g+LCA8RGlyZWN0b3J5PiwgPERpcmVjdG9yeU1hdGNoPiwgLi4uKS4KICAgICBbRGVhbiBHYXVkZXQsIE1hcnRpbiBLcmFlbWVyXQoKICAqKSA8RmlsZXM+IGlzIG5vdCBwZXJtaXR0ZWQgd2l0aGluIDxMb2NhdGlvbj4gKGJlY2F1c2Ugb2YgdGhlCiAgICAgc2VtYW50aWMgb3JkZXJpbmcpLiAgW0RlYW4gR2F1ZGV0XSBQUiMzNzkKCiAgKikgPEZpbGVzPiB3aXRoIHdpbGRjYXJkcyB3YXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UgaW4gd2lsZGNhcmQKICAgICBzZW1hbnRpY3MgKCogZG9lcyBub3QgbWF0Y2ggLykuICBUbyBmaXggdGhpcywgPEZpbGVzPiBub3cKICAgICBhcHBseSBvbmx5IHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWxlbmFtZS4gIFRoaXMKICAgICBmaXhlcyBzb21lIG90aGVyIGluY29uc2lzdGVuY2llcyBpbiA8RmlsZXM+IHNlbWFudGljcwogICAgIChzdWNoIGFzIDxGaWxlcyBhKmI+IG5vdCB3b3JraW5nKS4gIFtEZWFuIEdhdWRldF0gUFIjMTgxNwoKICAqKSBSZW1vdmVkIGJvZ3VzICJkaXN0LnRhciIgdGFyZ2V0IGZyb20gTWFrZWZpbGUudG1wbCBhbmQgbWFrZSBzdXJlCiAgICAgYmFja3VwIGZpbGVzIGFyZSByZW1vdmVkIG9uICJjbGVhbiIgdGFyZ2V0IFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBBZGQgLWxtIHRvIExJQlMgZm9yIEhQVVguICBbRGVhbiBHYXVkZXRdIFBSIzE2MzkKCiAgKikgVmFyaW91cyBlcnJvcnMgZnJvbSBzZWxlY3QoKSBhbmQgYWNjZXB0KCkgaW4gY2hpbGRfbWFpbigpIHdvdWxkCiAgICAgcmVzdWx0IGluIGFuIGluZmluaXRlIGxvb3AuICBJdCBzZWVtcyB0aGVzZSB0d28gdGlja2xlIGtlcm5lbAogICAgIG9yIGxpYnJhcnkgYnVncyBvY2Nhc2lvbmFsbHksIGFuZCByZXN1bHQgaW4gbG9nIHNwYW1tYWdlIGFuZAogICAgIGEgZ2VuZXJhbGx5IGJhZCBzY2VuZS4gIE5vdyB0aGUgY2hpbGQgZXhpdHMgaW1tZWRpYXRlbHksCiAgICAgd2hpY2ggc2VlbXMgdG8gYmUgYSBnb29kIHdvcmthcm91bmQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxNzQ3LCAxMTA3LCA1ODgsIDE3ODcsIDk4NywgNTg4CgogICopIENsZWFuZWQgdXAgc29tZSByYWNlIGNvbmRpdGlvbnMgaW4gdW5peCBjaGlsZF9tYWluIGR1cmluZwogICAgIGluaXRpYWxpemF0aW9uLiBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiAiVXNlckRpciAvYWJzcGF0aCIgd2l0aG91dCBhICogaW4gdGhlIHBhdGggd291bGQgYWxsb3cKICAgICByZW1vdGUgdXNlcnMgdG8gYWNjZXNzICIvfi4uIiBhbmQgYnlwYXNzIGFjY2VzcyByZXN0cmljdGlvbnMKICAgICAoYnV0IG5vdGUgL34uLi8uLiB3YXMgaGFuZGxlZCBwcm9wZXJseSkuCiAgICAgW0xhdXJpIEplc21pbiA8amVzbWluQHV0LmVlPl0gUFIjMTcwMQoKICAqKSBBUEk6IG9zX2lzX3BhdGhfYWJzb2x1dGUoKSBub3cgdGFrZXMgYSBjb25zdCBjaGFyICogaW5zdGVhZCBvZiBhIGNoYXIgKi4KICAgICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I1CgogICopIFNvdXJjZSBmaWxlIGRlcGVuZGVuY2llcyBpbiBNYWtlZmlsZS50bXBsIGZpbGVzIHRocm91Z2hvdXQgdGhlCiAgICAgc291cmNlIHRyZWUgd2VyZSB1cGRhdGVkIHRvIGFjY3VyYXRlbHkgcmVmbGVjdCByZWFsaXR5LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgUHJlc2VydmUgdGhlIGNvbnRlbnQgZW5jb2RpbmcgZ2l2ZW4gYnkgdGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZQogICAgIHdoZW4gdGhlIGNsaWVudCBkb2Vzbid0IG90aGVyd2lzZSBzcGVjaWZ5IGFuIGVuY29kaW5nLgogICAgIFtSb25hbGQgVHNjaGFsYWVyIDxSb25hbGQuVHNjaGFsYWVyQHBzaS5jaD5dCgogICopIFNvcnQgb3V0IHByb2JsZW1zIHdpdGggY2Fub25pY2FsIGZpbGVuYW1lIGhhbmRsaW5nIGhhcHBlbmluZyB0b28gbGF0ZS4KICAgICBbRGVhbiBHYXVkZXQsIEJlbiBMYXVyaWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I0CgogICopIFRoZSBtb2R1bGUgc3RydWN0dXJlIHdhcyBtb2RpZmllZCB0byBpbmNsdWRlIGEgKmR5bmFtaWNfbG9hZF9oYW5kbGUKICAgICBpbiB0aGUgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIHBvcnRpb24sIGFuZCB0aGUgTU9EVUxFX01BR0lDX05VTUJFUgogICAgIGhhcyBiZWVuIGJ1bXBlZCBhY2NvcmRpbmdseS4gIFtQYXVsIFN1dHRvbl0KCiAgKikgQWxsIEJyb3dzZXJNYXRjaCBkaXJlY3RpdmVzIG1lbnRpb25lZCBpbgogICAgIGh0ZG9jcy9tYW51YWwva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwgYXJlIGluIHRoZSBkZWZhdWx0CiAgICAgY29uZmlndXJhdGlvbiBmaWxlcy4gIFtMYXJzIEVpbGVicmVjaHRdCgogICopIE1pTlQgcG9ydCB1cGRhdGUuIFtKYW4gUGF1bCBTY2htaWR0XQoKICAqKSBIVFRQLzEuMSByZXF1aXJlcyB4LWd6aXAgYW5kIGd6aXAgZW5jb2RpbmdzIGJlIHRyZWF0ZWQKICAgICBlcXVpdmFsZW50LCBzaW1pbGFybHkgZm9yIHgtY29tcHJlc3MgYW5kIGNvbXByZXNzLiAgQXBhY2hlCiAgICAgbm93IGlnbm9yZXMgYSBsZWFkaW5nIHgtIHdoZW4gY29tcGFyaW5nIGVuY29kaW5ncy4gIEl0IGFsc28KICAgICBwcmVzZXJ2ZXMgdGhlIGVuY29kaW5nIHRoZSBjbGllbnQgcmVxdWVzdHMgKGZvciBleGFtcGxlIGlmCiAgICAgaXQgcmVxdWVzdHMgeC1nemlwLCB0aGVuIEFwYWNoZSB3aWxsIHJlc3BvbmQgd2l0aCB4LWd6aXAKICAgICBpbiB0aGUgQ29udGVudC1FbmNvZGluZyBoZWFkZXIpLgogICAgIFtSb25hbGQgVHNjaGFsYWVyIDxSb25hbGQuVHNjaGFsYWVyQHBzaS5jaD5dIFBSIzE3NzIKCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgb24ga2VlcC1hbGl2ZSBjb25uZWN0aW9ucy4gIFtJZ29yIFRhdGFyaW5vdl0KCiAgKikgQWRkZWQgbW9kX3NvIG1vZHVsZSB0byBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZyBvZiBtb2R1bGVzIG9uIFVuaXgKICAgICAobGlrZSBtb2RfZGxkIGZvciBXaW4zMikuIFRoaXMgcmVwbGFjZXMgbW9kX2RsZC5jLiBVc2UgU2hhcmVkTW9kdWxlCiAgICAgaW5zdGVhZCBvZiBBZGRNb2R1bGUgaW4gQ29uZmlndXJhdGlvbiB0byBidWlsZCBzaGFyZWQgbW9kdWxlcwogICAgIFtTYW1lZXIgUGFyZWtoLCBQYXVsIFN1dHRvbl0KCiAgKikgTWlub3IgY2xlYW51cHMgdG8gci0+ZmluZm8gaGFuZGxpbmcgaW4gc29tZSBtb2R1bGVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQWJzdHJhY3QgcmVhZCgpL3dyaXRlKCkgdG8gYXBfcmVhZCgpL2FwX3dyaXRlKCkuCiAgICAgTWFrZXMgaXQgZWFzaWVyIHRvIGFkZCBvdGhlciB0eXBlcyBvZiBJTyBjb2RlIHN1Y2ggYXMgU0ZJTy4KICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQVBJOiBHZW5lcmFsaXplIGRlZmF1bHRfcG9ydCBtYW5pcHVsYXRpb25zIHRvIG1ha2Ugc3VwcG9ydCBvZgogICAgIGRpZmZlcmVudCBwcm90b2NvbHMgZWFzaWVyLiBbQmVuIExhdXJpZSwgUmFuZHkgVGVyYnVzaF0KCiAgKikgVGhlcmUgYXJlIG1hbnkgY2FzZXMgd2hlcmUgdXNlcnMgZG8gbm90IHdhbnQgQXBhY2hlIHRvIGZvcm0KICAgICBzZWxmLXJlZmVyZW50aWFsIHVybHMgdXNpbmcgdGhlICJjYW5vbmljYWwiIFNlcnZlck5hbWUgYW5kIFBvcnQuCiAgICAgVGhlIG5ldyBVc2VDYW5vbmljYWxOYW1lIGRpcmVjdGl2ZSAoZGVmYXVsdCBvbiksIGlmIHNldCB0byBvZmYKICAgICB3aWxsIGNhdXNlIEFwYWNoZSB0byB1c2UgdGhlIGNsaWVudC1zdXBwbGllZCBob3N0bmFtZSBhbmQgcG9ydC4KICAgICBBUEk6IFBhcnQgb2YgdGhpcyBjaGFuZ2UgcmVxdWlyZWQgYSBjaGFuZ2UgdG8gdGhlIGNvbnN0cnVjdF91cmwoKQogICAgIHByb3RvdHlwZTsgYW5kIHRoZSBhZGRpdGlvbiBvZiBnZXRfc2VydmVyX25hbWUoKSBhbmQKICAgICBnZXRfc2VydmVyX3BvcnQoKS4KICAgICBbTWljaGFlbCBEb3VnbGFzcyA8bWlrZWRvdWdAdGV4YXMubmV0PiwgRGVhbiBHYXVkZXRdCiAgICAgUFIjMzE1LCA0NTksIDQ4NSwgMTQzMwoKICAqKSBZZXQgYW5vdGhlciByZWFycmFuZ2VtZW50IG9mIHRoZSBzb3VyY2UgdHJlZS4uIG5vdyBhbGwgdGhlIGNvbW1vbgogICAgIGhlYWRlciBmaWxlcyBhcmUgaW4gdGhlIHNyYy9pbmNsdWRlIGRpcmVjdG9yeS4gIFRoZSAtSW1haW4gLUlhcAogICAgIHJlZmVyZW5jZXMgaW4gTWFrZWZpbGVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHRoZSBzaW1wbGVyIC1JaW5jbHVkZQogICAgIGluc3RlYWQuICBJbiBhZGRpdGlvbiB0byBzaW1wbGlmeWluZyB0aGUgYnVpbGQgYSBsaXR0bGUgYml0LCB0aGlzCiAgICAgYWxzbyBtYWtlcyBpdCBjbGVhciB3aGVuIGEgbW9kdWxlIGlzIHJlZmVyZW5jaW5nIHNvbWV0aGluZyBpbiBhCiAgICAgb3RoZXIgdGhhbiBrb3NoZXIgbWFubmVyIChlLmcuLCB0aGUgcHJveHkgaW5jbHVkaW5nIG1vZF9taW1lLmgpLgogICAgIE1vZHVsZS1wcml2YXRlIGhlYWRlciBmaWxlcyAodGhlIHByb3h5LCBtb2RfbWltZSwgdGhlIHJlZ2V4IGxpYnJhcnksCiAgICAgYW5kIG1vZF9yZXdyaXRlKSBoYXZlIG5vdCBiZWVuIG1vdmVkIHRvIHNyYy9pbmNsdWRlOyBub3IgaGF2ZQogICAgIHRoZSBPUy1hYnN0cmFjdGlvbiBmaWxlcy4gIFtLZW4gQ29hcl0KCiAgKikgRml4IGEgYnVnIHdoZXJlIHItPmhvc3RuYW1lIGRpZG4ndCBoYXZlIHRoZSA6cG9ydCBzdHJpcHBlZAogICAgIGZyb20gaXQuICBbRGVhbiBHYXVkZXRdCgogICopIFR3ZWFrZWQgdGhlIGhlYWRlcnNfb3V0IHRhYmxlIHNpemUsIGFuZCB0aGUgc3VicHJvY2Vzc19lbnYKICAgICB0YWJsZSBzaXplIGd1ZXNzIGluIHJlbmFtZV9vcmlnaW5hbF9lbnZpcm9ubWVudCgpLiAgQWRkZWQKICAgICBNQUtFX1RBQkxFX1BST0ZJTEUgd2hpY2ggY2FuIGhlbHAgZGlzY292ZXIgbWFrZV90YWJsZSgpCiAgICAgY2FsbHMgdGhhdCB1c2UgdG9vIHNtYWxsIGFuIGluaXRpYWwgZ3Vlc3MsIHNlZSBhbGxvYy5jLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgT3B0aW9ucyBhbmQgQWxsb3dPdmVycmlkZSB3ZXJlbid0IHByb3Blcmx5IG1lcmdpbmcgaW4gdGhlIG1haW4KICAgICBzZXJ2ZXIgc2V0dGluZyBpbnNpZGUgdmhvc3RzIChvbmx5IGFuIGlzc3VlIHdoZW4geW91IGhhdmUgbm8KICAgICA8RGlyZWN0b3J5PiBvciBvdGhlciBzZWN0aW9uIGNvbnRhaW5pbmcgYW4gT3B0aW9ucyB0aGF0IGFmZmVjdHMKICAgICBhIHJlcXVlc3QpLiAgT3B0aW9ucyArZm9vIG9yIC1mb28gaW4gdGhlIG1haW5fc2VydmVyIHdvdWxkbid0CiAgICAgYWZmZWN0IHRoZSBtYWluX3NlcnZlcidzIGxvb2t1cCBkZWZhdWx0cy4gIFtEZWFuIEdhdWRldF0KCiAgKikgVmFyaWFibGUgJ2N3ZCcgd2FzIGJlaW5nIHVzZWQgcG9pbnRsZXNzbHkgYmVmb3JlIGJlaW5nIHNldC4KICAgICBbS2VuIENvYXJdIFBSIzE3MzgKCiAgKikgci0+YWxsb3dlZCBoYW5kbGluZyBjbGVhbmVkIHVwIGluIHRoZSBzdGFuZGFyZCBtb2R1bGVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgU29tZSBjYXNlLXNlbnNpdGl2aXR5IGlzc3VlcyBjbGVhbmVkIHVwIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAogICAgIFJGQzIwNjguICBbRGVhbiBHYXVkZXRdCgogICopIFNJR1VSRyBkb2Vzbid0IGV4aXN0IGV2ZXJ5d2hlcmUuCiAgICAgW01hcmsgQW5kcmV3IEhlaW5yaWNoIDxoZWlucmljaEB0aW5kZXJib3guU3RhbmZvcmQuRURVPl0KCiAgKikgbW9kX3VuaXF1ZV9pZCB3YXMgZXJyb25lb3VzbHkgZ2VuZXJhdGluZyBhIHNlY29uZCB1bmlxdWUgaWQgd2hlbgogICAgIGFuIGludGVybmFsIHJlZGlyZWN0IG9jY3VyZWQuICBTdWNoIHJlZGlyZWN0cyBvY2N1ciwgZm9yIGV4YW1wbGUsCiAgICAgd2hlbiBwcm9jZXNzaW5nIGEgRGlyZWN0b3J5SW5kZXggbWF0Y2guICBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogdGFibGVfYWRkLCB0YWJsZV9tZXJnZSwgYW5kIHRhYmxlX3NldCBpbmNsdWRlIGltcGxpY2l0IHBzdHJkdXAoKQogICAgIG9mIHRoZSBrZXkgYW5kIHZhbHVlLiAgQnV0IGluIG1hbnkgY2FzZXMgdGhpcyBpcyBub3QgcmVxdWlyZWQKICAgICBiZWNhdXNlIHRoZSBrZXkvdmFsdWUgaXMgYSBjb25zdGFudCwgb3IgdGhlIHZhbHVlIGhhcyBiZWVuIGJ1aWx0CiAgICAgYnkgcHN0cmNhdCgpIG9yIG90aGVyIHNpbWlsYXIgbWVhbnMuICBOZXcgcm91dGluZXMgdGFibGVfYWRkbiwKICAgICB0YWJsZV9tZXJnZW4sIGFuZCB0YWJsZV9zZXRuIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgQVBJLCB0aGVzZQogICAgIHJvdXRpbmVzIGRvIG5vdCBwc3RyZHVwKCkgdGhlaXIgYXJndW1lbnRzLiAgVGhlIGNvcmUgY29kZSBhbmQKICAgICBzdGFuZGFyZCBtb2R1bGVzIHdlcmUgY2hhbmdlZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGVzZSByb3V0aW5lcy4KICAgICBUaGUgcmVzdWx0aW5nIHNlcnZlciBpcyB1cCB0byAyMCUgZmFzdGVyIGluIHNvbWUgc2l0dWF0aW9ucy4KCiAgICAgTm90ZSB0aGF0IGl0IGlzIGVhc3kgdG8gZ2V0IGNvZGUgc3VidGx5IHdyb25nIGlmIHlvdSBwYXNzIGEga2V5L3ZhbHVlCiAgICAgd2hpY2ggaXMgaW4gYSBwb29sIG90aGVyIHRoYW4gdGhlIHBvb2wgb2YgdGhlIHRhYmxlLiAgVGhlIG9ubHkKICAgICBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIHBhc3Mga2V5L3ZhbHVlcyB3aGljaCBhcmUgaW4gdGhlIHBvb2wgb2YKICAgICB0aGUgdGFibGUsIG9yIGluIG9uZSBvZiB0aGUgYW5jZXN0b3JzIG9mIHRoZSBwb29sIG9mIHRoZSB0YWJsZS4KICAgICBpLmUuIGlmIHRoZSB0YWJsZSBpcyBwYXJ0IG9mIGEgc3VicmVxdWVzdCwgYSB2YWx1ZSBmcm9tIHRoZSBtYWluCiAgICAgcmVxdWVzdCdzIHBvb2wgaXMgT0sgc2luY2UgdGhlIHN1YnJlcXVlc3QgcG9vbCBpcyBhIHN1Yl9wb29sIG9mIHRoZQogICAgIG1haW4gcmVxdWVzdCdzIHBvb2wgKGFuZCB0aGVyZWZvcmUgaGFzIGEgbGlmZXNwYW4gYXQgbW9zdCBhcyBsb25nIGFzCiAgICAgdGhlIG1haW4gcG9vbCkuICBUaGVyZSBpcyBkZWJ1Z2dpbmcgY29kZSB3aGljaCBjYW4gZGV0ZWN0IGltcHJvcGVyCiAgICAgdXNhZ2UsIGVuYWJsZWQgYnkgZGVmaW5pbmcgUE9PTF9ERUJVRy4gIFNlZSBhbGxvYy5jIGZvciBtb3JlIGRldGFpbHMuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hQGJvZy5tc3Uuc3U+LCBEZWFuIEdhdWRldF0KCiAgKikgTW9yZSBtb2RfbWltZV9tYWdpYyBjbGVhbnVwOiAgZmV3ZXIgc3lzY2FsbHM7IHNob3VsZCBoYW5kbGUgImZpbGVzIgogICAgIHdoaWNoIGRvbid0IGV4aXN0IG9uIGRpc2sgbW9yZSBncmFjZWZ1bGx5OyBoYW5kbGVzIHZob3N0cyBwcm9wZXJseS4KICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoZSBjb2RlIC0tIGlmIHRoZXJlJ3Mgbm8KICAgICBNaW1lTWFnaWNGaWxlIGRpcmVjdGl2ZSB0aGVuIHRoZSBtb2R1bGUgaXMgbm90IGVuYWJsZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBTb21lIG9sZGVyICpuaXggZGlhbGVjdHMgY2Fubm90IGF1dG9tYXRpY2FsbHkgc3RhcnQgc2NyaXB0cwogICAgIHdoaWNoIGJlZ2luIHdpdGggYSAjISBpbnRlcnByZXRlciBsaW5lICh0aGUgc2hlbGwgc3RhcnRzIHRoZSBzY3JpcHRzCiAgICAgYXBwcm9wcmlhdGVseSBvbiB0aGVzZSBwbGF0Zm9ybXMpLiBBcGFjaGUgbm93IHN1cHBvcnRzIHN0YXJ0aW5nIG9mCiAgICAgImhhc2hiYW5nLXNjcmlwdHMiIHdoZW4gdGhlIE5FRURfSEFTSEJBTkdfRU1VTCBkZWZpbmUgaXMgc2V0LgogICAgIFtNYXJ0aW4gS3JhZW1lciwgd2l0aCBjb2RlIGZyb20gcGV0ZXJAemV1cy5kaWFsaXgub3ouYXUgKFBldGVyIFdlbW0pCiAgICAgdGFrZW4gZnJvbSB0Y3NoXQoKICAqKSBBUEk6ICJ0eXBlZGVmIGFycmF5X2hlYWRlciB0YWJsZSIgcmVtb3ZlZCBmcm9tIGFsbG9jLmgsIGZvbGtzIHNob3VsZAogICAgIGhhdmUgYmVlbiB3cml0aW5nIHRvIHVzZSB0YWJsZSBhcyBpZiBpdCB3ZXJlIGFuIG9wYXF1ZSB0eXBlLCBidXQgZXZlbgogICAgIHNvbWUgc3RhbmRhcmQgbW9kdWxlcyBnb3QgdGhpcyB3cm9uZy4gIEJ5IGNoYW5naW5nIHRoZSBkZWZpbml0aW9uCiAgICAgdG8gInR5cGVkZWYgc3RydWN0IHRhYmxlIHRhYmxlIiBtb2R1bGUgYXV0aG9ycyB3aWxsIHJlY2VpdmUgY29tcGlsZQogICAgIHRpbWUgd2FybmluZ3MgdGhhdCB0aGV5J3JlIGRvaW5nIHRoZSB3cm9uZyB0aGluZy4gIFRoaXMgY2hhbmdlCiAgICAgZmFjaWxpdGF0ZXMgZnV0dXJlIGNoYW5nZXMgd2l0aCBtb3JlIHNvcGhpc3RpY2F0ZWQgdGFibGUKICAgICBzdHJ1Y3R1cmVzLiAgU3BlY2lmaWNhbGx5LCBtb2R1bGUgYXV0aG9ycyBzaG91bGQgYmUgdXNpbmcgdGFibGVfZWx0cygpCiAgICAgdG8gZ2V0IGFjY2VzcyB0byBhbiBhcnJheV9oZWFkZXIgKiBmb3IgdGhlIHRhYmxlLiBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogUmVuYW1lZCBuZXdfY29ubmVjdGlvbigpIHRvIGF2b2lkIG5hbWVzcGFjZSBjb2xsaXNpb24gd2l0aCBMREFQCiAgICAgbGlicmFyeSByb3V0aW5lcy4gIFtLZW4gQ29hciwgUmFzbXVzIExlcmRvcmZdCgogICopIFdJTjMyOiBtb2Rfc3BlbGluZyBpcyBub3cgYXZhaWxhYmxlIG9uIHRoZSBXaW4zMiBwbGF0Zm9ybS4KICAgICBbTWFyYyBTbGVta29dCgogICopIEZvciBjbGFyaXR5IHRoZSBmb2xsb3dpbmcgY29tcGlsZSB0aW1lIGRlZmluaXRpb24gd2FzIGNoYW5nZWQ6CgogICAgICAgIFNBRkVfVU5TRVJJQUxJWkVEX0FDQ0VQVCAgLT4gICBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKCiAgICAgQWxzbywgZm9yIGV4YW1wbGUsIEhBVkVfTU1BUCB3b3VsZCBtZWFuIHRvIHVzZSBtbWFwKCkgc2NvcmVib2FyZHMKICAgICBhbmQgbm90IGJlIGEgZ2VuZXJhbCBub3RpY2UgdGhhdCB0aGUgT1MgaGFzIG1tYXAoKS4gTm93IHRoZQogICAgIEhBVkVfTU1BUC9TSE1HRVQgI2RlZmluZXMgc3RyaWN0bHkgYXJlIGluZm9ybWF0aW9uYWwgdGhhdCB0aGUKICAgICBPUyBoYXMgdGhhdCBtZXRob2Qgb2Ygc2hhcmVkIG1lbW9yeTsgdGhlIHR5cGUgdG8gdXNlIGZvcgogICAgIHRoZSBzY29yZWJvYXJkIGlzIGEgc2VwZXJhdGUgI2RlZmluZSAoVVNFX01NQVBfU0NPUkVCT0FSRAogICAgIGFuZCBVU0VfU0hNR0VUX1NDT1JFQk9BUkQpLiBUaGlzIGFsbG93cyBvdXRzaWRlIG1vZHVsZXMgdG8KICAgICBkZXRlcm1pbmUgaWYgc2hhcmVkIG1lbW9yeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93cyBBcGFjaGUKICAgICB0byBkZXRlcm1pbmUgdGhlIGJlc3QgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHNjb3JlYm9hcmQuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFBPUlQ6IFVuaXhXYXJlIDIuMS4yIFNNUCBhcHBlYXJzIHRvIHJlcXVpcmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULAogICAgIGFzIGRvIHZhcmlvdXMgZWFybGllciB2ZXJzaW9ucy4gIEl0IHNob3VsZCBiZSBzYWZlIG9uIGFsbCB2ZXJzaW9ucy4KICAgICBVbml4d2FyZSAxLnggYXBwZWFycyB0byBoYXZlIHRoZSBzYW1lIFNJR0hVUCBidWcgYXMgc29sYXJpcyBkb2VzIHdpdGgKICAgICB0aGUgc2xhY2sgY29kZS4gIEEgZmV3IG90aGVyIGNsZWFudXBzIGZvciBVbml4d2FyZS4KICAgICBbVG9tIEh1Z2hlcyA8dGhoQGN5YmVyc2NpZW5jZS5jb20+XSBQUiMxMDgyLCBQUiMxMjgyLCBQUiMxNDk5LCBQUiMxNTUzCgogICopIFBPUlQ6IEEvVVggY2FuIGhhbmRsZSBzaW5nbGUtbGlzdGVuIGFjY2VwdHMgd2l0aG91dCBtdXRleAogICAgIGxvY2tpbmcsIHNvIHdlIGFkZCBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBXaGVuIGRpZSgpIGhhcHBlbnMgd2UgbmVlZCB0byBlYXQgYW55IHJlcXVlc3QgYm9keSBpZiBvbmUgZXhpc3RzLgogICAgIE90aGVyd2lzZSB3ZSBjYW4ndCBjb250aW51ZSB3aXRoIGEga2VlcGFsaXZlIHNlc3Npb24uICBUaGlzIHNob3dzIHVwCiAgICAgYXMgYSBQT1NUIHByb2JsZW0gd2l0aCBNU0lFIDQuMCwgdHlwaWNhbGx5IGFnYWluc3QgcGFnZXMgd2hpY2ggYXJlCiAgICAgYXV0aGVudGljYXRlZC4gIFtSb3kgRmllbGRpbmddIFBSIzEzOTkKCiAgKikgSWYgeW91IGRlZmluZSBTRUNVUklUWV9IT0xFX1BBU1NfQVVUSE9SSVpBVElPTiB0aGVuIHRoZSBBdXRob3JpemF0aW9uCiAgICAgaGVhZGVyIHdpbGwgYmUgcGFzc2VkIHRvIENHSXMuICBUaGlzIGlzIGdlbmVyYWxseSBhIHNlY3VyaXR5IGhvbGUsIHNvCiAgICAgaXQncyBub3QgYSBkZWZhdWx0LiAgW01hcmMgU2xlbWtvXSBQUiM1NDkKCiAgKikgRml4IFkySyBwcm9ibGVtIHdpdGggZGF0ZSBwcmludGluZyBpbiBzdWV4ZWMgbG9nLgogICAgIFtQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPl0gUFIjMTM0MwoKICAqKSBXSU4zMiBkZXNlcnZlcyBhIHBpZCBmaWxlLiAgW0JlbiBIeWRlXQoKICAqKSBzdWV4ZWMgZXJyb3JzIG5vdyBpbmNsdWRlIHRoZSBlcnJuby9kZXNjcmlwdGlvbi4gIFtNYXJjIFNsZW1rb10gUFIjMTU0MwoKICAqKSBQT1JUOiBPU0YvMSBub3cgdXNlcyBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgdG8gc29sdmUgUFIjNDY3LgogICAgIFRoZSBjaG9pY2Ugb2YgZmxvY2sgdnMuIGZjbnRsIHdhcyBtYWRlIGJhc2VkIG9uIHRpbWluZ3Mgd2hpY2ggc2hvd2VkIHRoYXQKICAgICBldmVuIG9uIG5vbi1ORlMsIG5vbi1leHBvcnRlZCBmaWxlc3lzdGVtcyBmY250bCgpIHdhcyBhbiBvcmRlciBvZgogICAgIG1hZ25pdHVkZSBzbG93ZXIuICBJdCBhbHNvIHVzZXMgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHNvCiAgICAgdGhhdCBzaW5nbGUgc29ja2V0IHVzZXJzIHdpbGwgc2VlIG5vIGRpZmZlcmVuY2UuIFtEZWFuIEdhdWRldF0gUFIjNDY3CgogICopICJGaWxlIGRvZXMgbm90IGV4aXN0IiBlcnJvciBtZXNzYWdlIHdhcyBlcnJvbmVvdXNseSBpbmNsdWRpbmcgdGhlCiAgICAgZXJybm8uICBbTWFyYyBTbGVta29dCgogICopIEltcHJvdmUgdGhlIHdhcm5pbmcgbWVzc2FnZSBnZW5lcmF0ZWQgd2hlbiBhIGNsaWVudCBkcm9wcyB0aGUKICAgICBjb25uZWN0aW9uIChoaXRzIHN0b3AgYnV0dG9uLCBldGMuKSBkdXJpbmcgYSBzZW5kLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRGVmaW5pbmcgR1BST0Ygd2lsbCBkaXNhYmxlIHByb2ZpbGluZyBpbiB0aGUgcGFyZW50IGFuZCBlbmFibGUgaXQKICAgICBpbiB0aGUgY2hpbGRyZW4uICBJZiB5b3UncmUgcHJvZmlsaW5nIHVuZGVyIExpbnV4IHRoaXMgaXMgcHJldHR5IG11Y2gKICAgICBuZWNlc3NhcnkgYmVjYXVzZSBTSUdQUk9GIGlzIGxvc3QgYWNyb3NzIGEgZm9yaygpLiBbRGVhbiBHYXVkZXRdCgogICopIGh0ZGlnZXN0IGFuZCBodHBhc3N3ZCBuZWVkZWQgc2xpZ2h0IHR3ZWFrcyB0byB3b3JrIG9uIE9TLzIgYW5kIFdJTjMyLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIFRoZSBOZVhUIGNjICh3aGljaCBpcyBnY2MgaGFja2VkIHVwKSBkb2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHNvbWUKICAgICBnY2MgZnVuY3Rpb25hbGl0eS4gIFdvcmsgYXJvdW5kIGl0LgogICAgIFtLZWl0aCBTZXZlcnNvbiA8a2VpdGhAc3NzZC5uYXZ5Lm1pbD5dIFBSIzE2MTMKCiAgKikgU29tZSBsaW5rZXJzIGNvbXBsYWluIHdoZW4gLm8gZmlsZXMgY29udGFpbiBubyBmdW5jdGlvbnMuCiAgICAgW0tlaXRoIFNldmVyc29uIDxrZWl0aEBzc3NkLm5hdnkubWlsPl0gUFIjMTYxNAoKICAqKSBTb21lIGNvbnN0IGRlY2xhcmF0aW9ucyBpbiBtb2RfaW1hcC5jIHRoYXQgd2VyZSBhZGRlZCBmb3IgZGVidWdnaW5nCiAgICAgcHVycG9zZXMgY2F1c2VkIHNvbWUgY29tcGlsZXJzIGhlYXJ0YnVybiB3aXRob3V0IGFkZGluZyBhbnkKICAgICBzaWduaWZpY2FudCB2YWx1ZSwgc28gdGhleSd2ZSBiZWVuIHJlbW92ZWQuICBbS2VuIENvYXJdCgogICopIFRoZSBzcmMvbWFpbi8qLmggaGVhZGVyIGZpbGVzIGhhdmUgaGFkICNpZm5kZWYgd3JhcHBlcnMgYWRkZWQgdG8KICAgICBpbnN1bGF0ZSB0aGVtIGFnYWluc3QgZHVwbGljYXRlIGNhbGxzIGlmIHRoZXkgZ2V0IGluY2x1ZGVkIHRocm91Z2gKICAgICBtdWx0aXBsZSBwYXRocyAoZS5nLiwgaW4gLmMgZmlsZXMgYXMgd2VsbCBhcyBvdGhlciAuaCBmaWxlcykuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBUaGUgbGliYXAgcm91dGluZXMgbm93IGhhdmUgYSBoZWFkZXIgZmlsZSBmb3IgdGhlaXIgcHJvdG90eXBlcywKICAgICBzcmMvYXAvYXAuaCwgdG8gZWFzZSB0aGVpciB1c2UgaW4gbm9uLWh0dHBkIGFwcGxpY2F0aW9ucy4gIFtLZW4gQ29hcl0KCiAgKikgbW9kX2F1dG9pbmRleCB3aXRoIGEgcGxhaW50ZXh0IGhlYWRlciBmaWxlIHdvdWxkIGVtaXQgdGhlIDxQUkU+CiAgICAgc3RhcnQtdGFnIGJlZm9yZSB0aGUgSFRNTCBwcmVhbWJsZSwgcmF0aGVyIHRoYW4gYWZ0ZXIgdGhlIHByZWFtYmxlCiAgICAgYnV0IGJlZm9yZSB0aGUgaGVhZGVyIGZpbGUgY29udGVudHMuICBbSm9obiBWYW4gRXNzZW4gPGp2ZUBnYW1lcnMub3JnPl0KICAgICBQUiMxNjY3CgogICopIFNFQ1VSSVRZOiBGaXggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gbG9ncmVzb2x2ZS4gIFRoaXMgaXMKICAgICBvbmx5IGFuIGlzc3VlIG9uIHN5c3RlbXMgd2l0aG91dCBhIE1BWEROQU1FIGRlZmluZSBvciB3aGVyZQogICAgIHRoZSByZXNvbHZlciByZXR1cm5zIGRvbWFpbiBuYW1lcyBsb25nZXIgdGhhbiBNQVhETkFNRS4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVsaW1pbmF0ZSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gY2ZnX2dldGxpbmUsIHdoaWNoCiAgICAgaXMgdXNlZCB0byByZWFkIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgc3VjaCBhcyBodGFjY2VzcyBhbmQKICAgICBodHBhc3N3ZCBmaWxlcy4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcmV0dXJuZWQgYnkgaHRfdGltZSBpcyBhbHdheXMKICAgICBwcm9wZXJseSBudWxsIHRlcm1pbmF0ZWQuICBbTWFyYyBTbGVta29dCgogICopIFRoZSAiQ29ubmVjdGlvbiIgaGVhZGVyIGNvdWxkIGJlIHNlbnQgYmFjayB3aXRoIG11bHRpcGxlICJjbG9zZSIKICAgICB0b2tlbnMuICBOb3QgYW4gZXJyb3IsIGJ1dCBhIHdhc3RlLgogICAgIFtSb25hbGQuVHNjaGFsYWVyQHBzaS5jaF0gUFIjMTY4MwoKICAqKSBtb2RfcmV3cml0ZSdzIFJld3JpdGVMb2cgc2hvdWxkIGJlaGF2ZSBsaWtlIG1vZF9sb2dfY29uZmlnLCBpdAogICAgIHNob3VsZG4ndCBmb3JjZSBob3N0bmFtZSBsb29rdXBzLiAgW0RlYW4gR2F1ZGV0XSBQUiMxNjg0CgogICopICJiYXNpYyIgYXV0aCBuZWVkcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4KICAgICBbUm9uYWxkLlRzY2hhbGFlckBwc2kuY2hdIFBSIzE2NjYKCiAgKikgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHRoZSBlbnZpcm9ubWVudCBwYXNzZWQgdG8gQ0dJcyBzaG91bGQKICAgICBvbmx5IGNvbnRhaW4gdmFyaWFibGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSByZWdleAogICAgIC9bYS16QS1aXVthLXpBLVowLTlfXSovLiAgVGhpcyBpcyBub3cgZW5mb3JjZWQgYnkgc3RhbXBpbmcKICAgICB1bmRlcnNjb3JlcyBvdmVyIGFueSBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgcmVnZXguICBUaGlzCiAgICAgYWZmZWN0cyBIVFRQXyogdmFyaWFibGVzLCBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSBiYWNrd2FyZAogICAgIGNvbXBhdGlibGUgZm9yIGFsbCB0aGUgc3RhbmRhcmQgaGVhZGVyczsgYW5kIGFmZmVjdHMgdmFyaWFibGVzCiAgICAgc2V0IHdpdGggU2V0RW52L0Jyb3dzZXJNYXRjaCBhbmQgc2ltaWxhciBkaXJlY3RpdmVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX3NwZWxpbmcgcmV0dXJuZWQgaW5jb3JyZWN0IEhSRUYncyB3aGVuIGFuIGFtYmlnb3VzIG1hdGNoCiAgICAgd2FzIGZvdW5kLiBOb3RpY2VkIGJ5IDxyb2JpbnRvbkBhbXRyYXNoLmNvbWxpbmsuZGU+IChTb2VyZW4gWmllaGUpCiAgICAgW3JvYmludG9uQGFtdHJhc2guY29tbGluay5kZSAoU29lcmVuIFppZWhlKSwgTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEFwYWNoZSBub3cgY29tcGlsZXMgJiBydW5zIG9uIGFuIEVCQ0RJQyBtYWluZnJhbWUKICAgICAodGhlIFNpZW1lbnMgQlMyMDAwL09TRCBmYW1pbHkpIGluIHRoZSBQT1NJWCBzdWJzeXN0ZW0KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEZpeCBwcm9ibGVtIGtpbGxpbmcgY2hpbGRyZW4gd2hlbiB0ZXJtaW5hdGluZy4gIEFsbG93IF5DCiAgICAgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBwc3RyZHVwKCkgaXMgaW1wbGljaXQgaW4gY2FsbHMgdG8gdGFibGVfKiBmdW5jdGlvbnMsIHNvIHRoZXJlJ3MKICAgICBubyBuZWVkIHRvIGRvIGl0IGJlZm9yZSBjYWxsaW5nLiAgQ2xlYW4gdXAgYSBmZXcgY2FzZXMuCiAgICAgW01hcmMgU2xlbWtvLCBEZWFuIEdhdWRldF0KCiAgKikgbmV3IC1DIGFuZCAtYyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgdXNhZ2U6CiAgICAgLUMgImRpcmVjdGl2ZSIgOiBwcm9jZXNzIGRpcmVjdGl2ZSBiZWZvcmUgcmVhZGluZyBjb25maWcgZmlsZXMKICAgICAtYyAiZGlyZWN0aXZlIiA6IHByb2Nlc3MgZGlyZWN0aXZlIGFmdGVyIHJlYWRpbmcgY29uZmlnIGZpbGVzCiAgICAgZXhhbXBsZToKICAgICBodHRwZCAtQyAiUGVybE1vZHVsZSBBcGFjaGU6Omh0dHBkX2NvbmYiCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgTWFydGluIEtyYWVtZXJdCgogICopIFdJTjMyOiBGaXggdGhlIGV4ZWN1dGlvbiBvZiBDR0lzIHRoYXQgYXJlIHNjcmlwdHMgYW5kIGNhbGxlZCAKICAgICB3aXRoIHBhdGggaW5mbyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gJz0nIGluLgogICAgIChlZy4gaHR0cDovL3NlcnZlci9jZ2ktYmluL3ByaW50ZW52P2Zvb2JhcikgIAogICAgIFtNYXJjIFNsZW1rb10gUFIjMTU5MQoKICAqKSBXSU4zMjogRml4IGEgY2FsbCB0byBvc19jYW5vbmljYWxfZmlsZW5hbWUgc28gaXQgZG9lc24ndCB0cnkgdG8gCiAgICAgbWVzcyB3aXRoIGZha2UgZmlsZW5hbWVzLiAgVGhpcyBmaXhlcyBwcm94eSBjYWNoaW5nIG9uIAogICAgIHdpbjMyLiBQUiMxMjY1CgogICopIFNFQ1VSSVRZOiBHZW5lcmFsIG1vZF9pbmNsdWRlIGNsZWFudXAsIGluY2x1ZGluZyBmaXhpbmcgc2V2ZXJhbAogICAgIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvd3MgYW5kIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcC4KICAgICBbRGVhbiBHYXVkZXQsIE1hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogTnVtZXJvdXMgY2hhbmdlcyB0byBtb2RfaW1hcCBpbiBhIGdlbmVyYWwgY2xlYW51cAogICAgIGluY2x1ZGluZyBmaXhpbmcgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cuICBbRGVhbiBHYXVkZXRdCgogICopIFdJTjMyOiBvdmVyaGF1bCBvZiBtdWx0aXRocmVhZGluZyBjb2RlLiBTaHV0ZG93bnMgYXJlIG5vdyBncmFjZWZ1bAogICAgIChjb25uZWN0aW9ucyBhcmUgbm90IGRyb3BwZWQpLiBDb2RlIGNhbiBoYW5kbGUgZ3JhY2VmdWwgcmVzdGFydHMKICAgICAoYnV0IHRoZXJlIGlzIGFzIHlldCBubyB3YXkgdG8gc2lnbmFsIHRoaXMgdG8gQXBhY2hlKS4gVmFyaW91cwogICAgIG90aGVyIGNsZWFudXBzLiBbUGF1bCBTdXR0b25dCgogICopIFRoZSBhcGxvZ19lcnJvciBjaGFuZ2VzIHNwZWNpZmljIHRvIDEuMyBpbnRyb2R1Y2VkIGEgYnVmZmVyCiAgICAgb3ZlcnJ1biBpbiB0aGUgKG5vdyBsZWdhY3kpIGxvZ19wcmludGYgZnVuY3Rpb24uICBGaXhlZC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9kaWdlc3QgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbi4gIEl0CiAgICAgYWxzbyBsYWNrZWQgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzaW9uIG9mIHRoZSAiRGlnZXN0IgogICAgIHRva2VuLiAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoPl0gUFIjMTU5OQoKICAqKSBBIGZldyBjbGVhbnVwcyBpbiBtb2Rfc3RhdHVzIGZvciBlZmZpY2llbmN5LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBIGZldyBjbGVhbnVwcyBpbiBtb2RfaW5mbyB0byBtYWtlIGl0IHRocmVhZC1zYWZlLCBhbmQgcmVtb3ZlIGFuCiAgICAgb2ZmLWJ5LTUgYnVnIHRoYXQgY291bGQgaGFtbWVyIFwwIG9uIHRoZSBzdGFjay4gW0RlYW4gR2F1ZGV0XQoKICAqKSBubzJzbGFzaCgpIHdhcyBPKG5eMikgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuICBNYWtlIGl0IE8obikuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IG1pZ3JhdGlvbiBmcm9tIHN0cm5jcHkoKSB0byBvdXIgImVuaGFuY2VkIiB2ZXJzaW9uIGNhbGxlZAogICAgIGFwX2NweXN0cm4oKSBmb3IgcGVyZm9ybWFuY2UgYW5kIGZ1bmN0aW9uYWxpdHkgcmVhc29ucy4KICAgICBMb2NhdGVkIGluIGxpYmFwLmEuICBbSmltIEphZ2llbHNraV0KCiAgKikgdGFibGVfc2V0KCkgYW5kIHRhYmxlX3Vuc2V0KCkgZGlkIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoCiAgICAgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUga2V5LgogICAgIFtTdGVwaGVuIFNjaGVjayA8c3NjaGVja0BpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKCiAgKikgVGhlIEF1dGhOYW1lIG11c3Qgbm93IGJlIGVuY2xvc2VkIGluIHF1b3RlcyBpZiBpdCBpcyB0byBjb250YWluCiAgICAgc3BhY2VzLiAgW0tlbiBDb2FyXSBQUiMxMTk1CgogICopIEFQSTogbmV3IGZ1bmN0aW9uOiBhcF9lc2NhcGVfcXVvdGVzKCkuIFtLZW4gQ29hcl0gUFIjMTE5NQoKICAqKSBXSU4zMjogV29yayBhcm91bmQgb3B0aW1pc2VyIGJ1ZyB0aGF0IGtpbGxlZCBJU0FQSSBpbiByZWxlYXNlCiAgICAgdmVyc2lvbnMuIFtCZW4gTGF1cmllXSBQUiMxNTMzCgogICopIFBPUlQ6IFVwZGF0ZSB0aGUgTVBFIHBvcnQgW01hcmsgQml4YnksIEppbSBKYWdpZWxza2ldCgogICopIEludGVyaW0gKHNsb3cpIGZpeCBmb3IgcC0+c3ViX3Bvb2wgY3JpdGljYWwgc2VjdGlvbnMgaW4KICAgICBhbGxvYy5jIChhZmZlY3RzIHdpbjMyIG9ubHkpLiAgW0JlbiBIeWRlXQoKICAqKSBub24tV0lOMzIgd2FzIG1pc3NpbmcgZGVzdHJveV9tdXRleCBkZWZpbml0aW9uLiAgW0JlbiBIeWRlXQoKICAqKSBzZW5kX2ZkX2xlbmd0aCgpIGRpZCBub3QgY2FsY3VsYXRlIHRvdGFsX2J5dGVzX3NlbnQgcHJvcGVybHkuCiAgICAgW0JlbiBSZXNlciA8YnJlc2VyQHJlZ25vdy5jb20+XSBQUiMxMzY2CgogICopIFRoZSBicHV0YygpIG1hY3JvIHdhcyBub3QgcHJvcGVybHkgaW50ZWdyYXRlZCB3aXRoIHRoZSBjaHVua2luZwogICAgIGNvZGU7IGluIG1hbnkgY2FzZXMgbW9kdWxlcyB1c2luZyBicHV0YygpIGNvdWxkIGNhdXNlIGNvbXBsZXRlbHkKICAgICBib2d1cyBjaHVua2VkIG91dHB1dC4gIChUeXBpY2FsbHkgdGhpcyB3aWxsIHNob3cgdXAgYXMgcHJvYmxlbXMKICAgICB3aXRoIEludGVybmV0IEV4cGxvcmVyIDQuMCByZWFkaW5nIGEgcGFnZSwgYnV0IG90aGVyIGJyb3dzZXJzCiAgICAgaGF2aW5nIG5vIHByb2JsZW0uKSBbRGVhbiBHYXVkZXRdCgogICopIENyZWF0ZSBMQVJHRV9XUklURV9USFJFU0hPTEQgZGVmaW5lIHdoaWNoIGRldGVybWluZXMgaG93IG1hbnkKICAgICBieXRlcyBoYXZlIHRvIGJlIHN1cHBsaWVkIHRvIGJ3cml0ZSgpIGJlZm9yZSBpdCB3aWxsIGNvbnNpZGVyCiAgICAgZG9pbmcgYSB3cml0ZXYoKSB0byBhc3NlbWJsZSBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBzeXN0ZW0KICAgICBjYWxsLiAgVGhpcyBpcyBjcml0aWNhbCBmb3IgbW9kdWxlcyBzdWNoIGFzIG1vZF9pbmNsdWRlLAogICAgIG1vZF9hdXRvaW5kZXgsIG1vZF9waHAzIHdoaWNoIGFsbCB1c2UgYnB1dGMoKS9icHV0cygpIG9mIHNtYWxsZXIKICAgICBzdHJpbmdzIGluIHNvbWUgY2FzZXMuICBUaGUgcmVzdWx0IHdvdWxkIGJlIGV4dHJhIGVmZm9ydAogICAgIHNldHRpbmcgdXAgd3JpdGV2KCksIGFuZCBpbiBtYW55IGNhc2VzIGV4dHJhIGVmZm9ydCBidWlsZGluZwogICAgIGNodW5rcy4gIFRoZSBkZWZhdWx0IGlzIDMxLCBpdCBjYW4gYmUgb3ZlcnJpZGVuIGF0IGNvbXBpbGUKICAgICB0aW1lLiBbRGVhbiBHYXVkZXRdCgogICopIE1vdmUgdGhlIGdpZCBzd2l0Y2hpbmcgY29kZSBpbnRvIHRoZSBjaGlsZCBzbyB0aGF0IGxvZyBmaWxlcwogICAgIGFuZCBwaWQgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIHRoZSByb290IGdpZC4KICAgICBbR3JlZ29yeSBBIEx1bmRiZXJnIDxsdW5kYmVyZ0B2ci5uZXQ+XQoKICAqKSBXSU4zMjogQ2hlY2sgZm9yIGJpbmFyaWVzIGJ5IGxvb2tpbmcgZm9yIHRoZSBleGVjdXRhYmxlIGhlYWRlcgogICAgIGluc3RlYWQgb2YgY291bnRpbmcgY29udHJvbCBjaGFyYWN0ZXJzLgogICAgIFtKaW0gUGF0dGVyc29uIDxKaW0uUGF0dGVyc29uQENvZ25vcy5DT00+XSBQUiMxMzQwCgogICopIGFwX3NucHJpbnRmKCkgbW92ZWQgZnJvbSBtYWluL3V0aWxfc25wcmludGYuYyB0byBhcC9hcF9zbnByaW50Zi5jCiAgICAgc28gdGhlIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBvdGhlciB0aGFuIHRoZQogICAgIHNlcnZlciBpdHNlbGYgKGxpa2UgdGhlIHNyYy9zdXBwb3J0IHRvb2xzKS4gIFtLZW4gQ29hcl0KCiAgKikgYXBfc2xhY2soKSBtb3ZlZCBvdXQgb2YgbWFpbi91dGlsLmMgaW50byBhcC9hcF9zbGFjay5jIGFzIHBhcnQgb2YKICAgICB0aGUgbGliYXAgY29uc29saWRhdGlvbiB3b3JrLiAgW0tlbiBDb2FyXQoKICAqKSBhcF9zbnByaW50ZigpIHdpdGggYSBsZW4gb2YgMCBiZWhhdmVkIGxpa2Ugc3ByaW50ZigpLiAgVGhpcyBpcyBub3QKICAgICB1c2VmdWwsIGFuZCBpc24ndCB3aGF0IHRoZSBzdGFuZGFyZHMgcmVxdWlyZS4gIE5vdyBpdCByZXR1cm5zIDAKICAgICBhbmQgd3JpdGVzIG5vdGhpbmcuICBbRGVhbiBHYXVkZXRdCgogICopIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIGZjbnRsKCkgbG9ja2luZyBzdWdnZXN0IHRoZSB1c2VyIGxvb2sgdXAKICAgICB0aGUgZG9jcyBmb3IgTG9ja0ZpbGUuICBbRGVhbiBHYXVkZXRdCgogICopIEVsaW1pbmF0ZSBzb21lIGRlYWQgY29kZSBmcm9tIHdyaXRldl9pdF9hbGwoKS4KICAgICBbSWdvciBUYXRhcmlub3YgPHRhdGFyaW5vQHByYWlyaWUuTm9EYWsuZWR1Pl0KCiAgKikgbW9kX2F1dG9pbmRleCBoYWQgYW4gZnJlYWQoKSB3aXRob3V0IGNoZWNraW5nIHRoZSByZXN1bHQgY29kZS4KICAgICBJdCBhbHNvIHdvdWxkbid0IGhhbmRsZSAiQWRkSWNvbkJ5VHlwZSAoVFhULC9pY29ucy90ZXh0LmdpZiB0ZXh0LyoiCiAgICAgKG5vdGUgdGhlIG1pc3NpbmcgY2xvc2luZyBwYXJlbikgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCgogICopIEl0IGFwcGVhcnMgdGhlICIyNTd0aCBieXRlIiBidWcgKHNlZQogICAgIGh0ZG9jcy9tYW51YWwvbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCMyNTd0aC1ieXRlKSBjYW4gaGFwcGVuCiAgICAgYXQgdGhlIDI1NnRoIGJ5dGUgYXMgd2VsbC4gIEZpeGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBGaXggbW9kX21pbWVfbWFnaWMgdW5kZXIgT1MvMiwgbm8gc3VwcG9ydCBmb3IgYmxvY2sgZGV2aWNlcy4KICAgICBbQnJpYW4gSGF2YXJkXQoKICAqKSBGaXggbWVtb3J5IGNvcnJ1cHRpb24gY2F1c2VkIGJ5IGFsbG9jYXRpbmcgYXV0aCB1c2VybmFtZXMgaW4gdGhlCiAgICAgd3JvbmcgcG9vbC4gIFtEZWFuIEdhdWRldF0gUFIjMTUwMAoKICAqKSBGaXggYW4gb2ZmLWJ5LTEsIGFuZCBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGVycm9yIGluCiAgICAgbW9kX21pbWVfbWFnaWMuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBhIHBvdGVudGlhbCBTRUdWIHByb2JsZW0gaW4gbW9kX25lZ290aWF0aW9uIHdoZW4gZGVhbGluZwogICAgIHdpdGggdHlwZS1tYXBzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBCZXR0ZXIgZ2xpYmMgc3VwcG9ydCB1bmRlciBMaW51eC4gIFtEZWFuIEdhdWRldF0gUFIjMTU0MgoKICAqKSAiUmVkaXJlY3RNYXRjaCBnb25lIC8iIHdvdWxkIGNhdXNlIGEgU0lHU0VHVi4gW0RlYW4gR2F1ZGV0XSBQUiMxMzE5CgogICopIFdJTjMyOiBhdm9pZCBvdmVyZmxvd3MgZHVyaW5nIGZpbGUgY2Fub25pY2FsaXNhdGlvbnMuCiAgICAgW21hbGNvbG1AbWdkZXYuZGVtb24uY28udWtdIFBSIzEzNzgKCiAgKikgV0lOMzI6IHNldF9maWxlX3Nsb3QoKSBkaWRuJ3QgZGV0ZWN0IGFic29sdXRlIHBhdGhzLiBbQmVuIExhdXJpZV0KICAgICBQUiMxNTExLCAxNTA4CgogICopIFdJTjMyOiBtb2Rfc3RhdHVzIGRpc3BsYXkgaGVhZGVyIGRpZG4ndCBtYXRjaCBmaWVsZHMuIFtCZW4gTGF1cmllXQoKICAqKSBUaGUgcHRocmVhZF9tdXRleF8qIGZ1bmN0aW9ucyByZXR1cm4gYW4gZXJyb3IgY29kZSwgYW5kIGRvbid0CiAgICAgc2V0IGVycm5vLiAgW0lnb3IgVGF0YXJpbm92IDx0YXRhcmlub0BwcmFpcmllLk5vRGFrLmVkdT5dCgogICopIFdJTjMyOiBBbGxvdyBzcGFjZXMgdG8gcHJlZml4IHRoZSBpbnRlcnByZXRlciBpbiAjISBsaW5lcy4KICAgICBbQmVuIExhdXJpZV0gUFIjMTEwMQoKICAqKSBXSU4zMjogQ3VyZSBmaWxlIGxlYWsgaW4gQ0dJcy4gW1BldGVyIFRpbGxlbWFucyA8cHRpQG5ldDRhbGwuYmU+XSBQUiMxNTIzCgogICopIHByb3h5X2Z0cDogdGhlIGRpcmVjdG9yeSBsaXN0aW5ncyBnZW5lcmF0ZWQgYnkgdGhlIHByb3h5IGZ0cCBtb2R1bGUKICAgICBub3cgaGF2ZSBhIHRpdGxlIGluIHdoaWNoIHRoZSBwYXRoIGNvbXBvbmVudHMgYXJlIGNsaWNrYWJsZSBhbmQgYWxsb3cKICAgICBxdWljayBuYXZpZ2F0aW9uIHRvIHRoZSBjbGlja2VkLW9uIGRpcmVjdG9yeSBvbiB0aGUgY3VycmVudGx5IGxpc3RlZAogICAgIGZ0cCBzZXJ2ZXIuIFRoaXMgYWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSB0aGUgIi4uIiBkaXJlY3RvcnkgbGlua3Mgd291bGQKICAgICBzb21ldGltZXMgcmVmZXIgdG8gdGhlIHdyb25nIGRpcmVjdG9yeS4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgV0lOMzI6IEFsbG9jYXRlIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBzY29yZWJvYXJkLgogICAgIFtCZW4gSHlkZV0gUFIjMTM4NwoKICAqKSBXSU4zMjogT25seSBsb3dlcmNhc2UgdGhlIHBhcnQgb2YgdGhlIHBhdGggdGhhdCBpcyByZWFsLiBbQmVuIExhdXJpZV0KICAgICBQUiMxNTA1CgogICopIEZpeCBwcm9ibGVtcyB3aXRoIHRpbWVvdXRzIGluIGluZXRkIG1vZGUgYW5kIC1YIG1vZGUuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCB0aGUgc3B1cmlvdXMgIigwKXVua25vd24gZXJyb3I6IG1tYXBfaGFuZGxlcjogbW1hcCBmYWlsZWQiCiAgICAgZXJyb3IgbWVzc2FnZXMuIFtCZW4gSHlkZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjMKCiAgKikgV0lOMzI6IFdvcmsgYXJvdW5kIGJyYWluLWRhbWFnZWQgc3Bhd24gY2FsbHMgdGhhdCBjYW4ndCBkZWFsCiAgICAgd2l0aCBzcGFjZXMgYW5kIHNsYXNoZXMuICBbQmVuIExhdXJpZV0KCiAgKikgV0lOMzI6IEZpeCB0aGUgY29kZSBzbyBDR0lzIGNhbiB1c2Ugc29ja2V0IGNhbGxzIG9uIFdpbmRvd3MuICAKICAgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCBjZXJ0YWluIHVuZG9jdW1lbnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgICBuZWVkZWQgZm9yIHNvY2tldHMgdG8gd29yayB1bmRlciBXaW4zMiB3ZXJlIG5vdCBiZWluZyBwYXNzZWQuCiAgICAgW0ZyYW5rIEZhdWJlcnQgPGZyYW5rQHNhbmUuY29tPl0KCiAgKikgQWRkIGEgIi1WIiBjb21tYW5kIGxpbmUgZmxhZyB0byB0aGUgaHR0cGQgYmluYXJ5LiAgVGhpcyAKICAgICBmbGFnIHNob3dzIHNvbWUgb2YgdGhlIGRlZmluZXMgdGhhdCBBcGFjaGUgd2FzIGNvbXBpbGVkIHdpdGguCiAgICAgSXQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBbTWFydGluIEtyYWVtZXJdCgogICopIFN0YXJ0IHNlcGFyYXRpbmcgdGhlIGFwXyooKSByb3V0aW5lcyBpbnRvIHRoZWlyIG93biBsaWJyYXJ5LCBzbyB0aGV5CiAgICAgY2FuIGJlIHVzZWQgYnkgaXRlbXMgaW4gc3JjL3N1cHBvcnQgYW1vbmcgb3RoZXIgdGhpbmdzLiAgCiAgICAgW0tlbiBDb2FyXSBQUiM1MTIsIDkwNSwgMTI1MiwgMTMwOCAKCiAgKikgR2l2ZSBhIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3Igd2hlbiBubyBBdXRoVHlwZSBpcyBzZXQuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgUmVtb3ZlIHN0cnRvdWwoKSB1c2UgZnJvbSBtb2RfcHJveHkgYmVjYXVzZSBpdCBpc24ndCBhdmFpbGFibGUKICAgICBvbiBhbGwgcGxhdGZvcm1zLiAgIFtNYXJjIFNsZW1rb10gUFIjMTIxNAoKICAqKSBXSU4zMjogU29tZSBXaW4zMiBzeXN0ZW1zIHRlcm1pbmF0ZWQgYWxsIHJlc3BvbnNlcyBhZnRlciAxNiBrQi4gCiAgICAgVGhpcyB0dXJucyBvdXQgdG8gYmUgYSBidWcgaW4gV2luc29jayAtIHNlbGVjdCgpIGRvZXNuJ3QgYWx3YXlzIAogICAgIHJldHVybiB0aGUgY29ycmVjdCBzdGF0dXMuICBbQmVuIExhdXJpZV0KCiAgKikgRGlyZWN0aXZlcyBvd25lZCBieSBodHRwX2NvcmUgY2FuIG5vdyB1c2UgdGhlIG5ldyBjaGVja19jbWRfY29udGV4dCgpCiAgICAgcm91dGluZSB0byBlbnN1cmUgdGhhdCB0aGV5J3JlIG5vdCBiZWluZyB1c2VkIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgIChlLmcuLCA8RGlyZWN0b3J5Pikgd2hlcmUgdGhleSdyZSBpbnZhbGlkLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBQT1JUOiBSZWNlbnQgY2hhbmdlcyBtYWRlIGl0IG5lY2Vzc2FyeSB0byBhZGQgZXhwbGljaXQgcHJvdG90eXBlCiAgICAgZm9yIGZnZXRjKCkgYW5kIGZnZXRzKCkgb24gU3VuT1MgNC54LiAgW01hcnRpbiBLcmFlbWVyLCBCZW4gSHlkZV0KCiAgKikgSXQgd2FzIG5lY2Vzc2FyeSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlc291cmNlcyB3aGljaCBhcmUKICAgICBhbGxvY2F0ZWQgaW4gdGhlIHBhcmVudCwgZm9yIGNsZWFudXAgaW4gdGhlIHBhcmVudCwgYW5kIHJlc291cmNlcwogICAgIHdoaWNoIGFyZSBhbGxvY2F0ZWQgaW4gZWFjaCBjaGlsZCwgZm9yIGNsZWFudXAgaW4gZWFjaCBjaGlsZC4KICAgICBBIG5ldyBwb29sIHdhcyBjcmVhdGVkIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlIGNoaWxkX2luaXQKICAgICBhbmQgY2hpbGRfZXhpdCBmdW5jdGlvbnM7IG1vZHVsZXMgYXJlIGZyZWUgdG8gcmVnaXN0ZXIgcGVyLWNoaWxkCiAgICAgY2xlYW51cHMgdGhlcmUuICBUaGlzIGZpeGVzIGEgYnVnIHdpdGggcmVsaWFibGUgcGlwZWQgbG9ncy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9hdXRvaW5kZXggd2Fzbid0IGRpc3BsYXlpbmcgdGhlIFJlYWRtZU5hbWUgZmlsZSBhdCB0aGUgYm90dG9tCiAgICAgdW5sZXNzIGl0IHdhcyBhbHNvIGRvaW5nIEZhbmN5SW5kZXhlcywgYnV0IGl0IGRpc3BsYXllZCB0aGUKICAgICBIZWFkZXJOYW1lIGZpbGUgYXQgdGhlIHRvcCB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gIEl0IG5vdyBzaG93cwogICAgIHRoZSBSZWFkbWVOYW1lIGZpbGUgZm9yIHNpbXBsZSBpbmRpY2VzLCB0b28sIGFzIGl0IHNob3VsZC4gIAogICAgIFtLZW4gQ29hcl0gUFIjMTM3MwoKICAqKSBodHRwX2NvcmUgd2FzIG1tYXAoKWluZyBldmVuIGluIGNhc2VzIHdoZXJlIGl0IHdhc24ndCBnb2luZyB0bwogICAgIHJlYWQgdGhlIGZpbGUuICBbQmVuIEh5ZGUgPGJoeWRlQGdlbnN5bS5jb20+XQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIDstKSBvZiBtb2RfcmV3cml0ZSdzIFVSTCByZXdyaXRpbmcgZW5naW5lOgogICAgIE5vdyB0aGUgcmV3cml0aW5nIGVuZ2luZSAodGhlIGhlYXJ0IG9mIG1vZF9yZXdyaXRlKSBpcyBvcmdhbml6ZWQgbW9yZQogICAgIHN0cmFpZ2h0LWZvcndhcmQsIGZpcnN0IHRpbWUgd2VsbCBkb2N1bWVudGVkIGFuZCByZWR1Y2VkIHRvIHRoZSByZWFsbHkKICAgICBlc3NlbnRpYWwgcGFydHMuIEFsbCByZWR1bmRhbnQgY2FzZXMgd2VyZSBzdHJpcHBlZCBvZmYgYW5kIHByb2Nlc3Npbmcgbm93CiAgICAgaXMgdGhlIHNhbWUgZm9yIGJvdGggcGVyLXNlcnZlciBhbmQgcGVyLWRpcmVjdG9yeSBjb250ZXh0IHdpdGggb25seSBhCiAgICAgbWluaW11bSBkaWZmZXJlbmNlICh0aGUgcHJlZml4IHN0cmlwcGluZyBpbiBwZXItZGlyIGNvbnRleHQpLiBBcyBhCiAgICAgc2lkZS1lZmZlY3Qgc29tZSBzdWJ0bGUgcmVzdHJpY3Rpb25zIGFuZCB0d28gcmVjZW50bHkgZGlzY292ZXJlZCBwcm9ibGVtcwogICAgIGFyZSBnb25lOiBXcm9uZyBlc2NhcGluZyBvZiBRVUVSWV9TVFJJTkcgb24gcmVkaXJlY3RzIGluIHBlci1kaXJlY3RvcnkKICAgICBjb250ZXh0IGFuZCByZXN0cmljdGlvbnMgb24gdGhlIHN1YnN0aXR1dGlvbiBVUkwgb24gcmVkaXJlY3RzLgogICAgIEFkZGl0aW9uYWxseSBzb21lIG1pbm9yIHNvdXJjZSBjbGVhbnVwcyB3ZXJlIGRvbmUuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSAKCiAgKikgTGFycyBFaWxlYnJlY2h0IHdyb3RlIGEgd2hvbGUgbmV3IHNldCBvZiBBcGFjaGUgVmhvc3QgSW50ZXJuYWxzCiAgICAgZG9jdW1lbnRhdGlvbiwgZXhhbXBsZXMsIGV4cGxhbmF0aW9ucyBhbmQgY2F2ZWF0cy4gVGhleSBsaXZlIGluIGEgbmV3CiAgICAgc3ViZGlyZWN0b3J5IGh0ZG9jcy9tYW51YWwvdmhvc3QvLiBbTGFycyBFaWxlYnJlY2h0IDxzZnhAdW5peC1hZy5vcmc+XQoKICAqKSBJZiBhcF9zbGFjayBmYWlscyB0byBhbGxvY2F0ZSBhYm92ZSB0aGUgbG93IHNsYWNrIGxpbmUgaXQncyBhIGdvb2QKICAgICBpbmRpY2F0aW9uIHRoYXQgZnVydGhlciBwcm9ibGVtcyB3aWxsIG9jY3VyOyBpdCdzIGEgYmV0dGVyIGluZGljYXRpb24KICAgICB0aGFuIG1hbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGdpdmUgdXMgd2hlbiB3ZSBhY3R1YWxseSBydW4gb3V0IG9mCiAgICAgZGVzY3JpcHRvcnMuICBTbyByZXBvcnQgaXQgdG8gdGhlIHVzZXIgb25jZSBwZXIgcmVzdGFydC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzExODEKCiAgKikgQ2hhbmdlIG1vZF9pbmNsdWRlIGFuZCBtb2RfYXV0b2luZGV4IHRvIHVzZSBZMkstc2FmZSBkYXRlIGZvcm1hdHMKICAgICBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSAiU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIiBvcHRpb24gdG8gdGhlIEluZGV4T3B0aW9ucyBsaXN0LAogICAgIHdoaWNoIHdpbGwga2VlcCB0aGUgY29sdW1uIGhlYWRpbmcgZnJvbSBiZWluZyBsaW5rcyBmb3Igc29ydGluZwogICAgIHRoZSBkaXNwbGF5LiAgW0tlbiBDb2FyLCBzdWdnZXN0ZWQgYnkgQnJpYW4gVGllbWFubiA8YnRtYW5AcGFjaWZpYy5uZXQ+XQogICAgIFBSICMxMjYxCgogICopIFBPUlQ6IFVwZGF0ZSB0aGUgTHlueE9TIHBvcnQuICBbTWFyaXVzIEdyb2VnZXIgPG1hZ0BzeXNnby5kZT5dCgogICopIEZpeCBsb2dpYyBlcnJvciB3aGVuIGlzc3VpbmcgYSBtbWFwKCkgZmFpbGVkIG1lc3NhZ2UKICAgICB3aXRoIGEgbm9uLXplcm8gTU1BUF9USFJFU0hPTEQuCiAgICAgW0RhdmlkIENoYW1iZXJzIDxkYXZpZGNAZmxvc3VuLnNhbGsuZWR1Pl0gUFIjMTI5NAoKICAqKSBQcmVzZXJ2ZSBoYW5kbGVyIHZhbHVlIG9uIFByb3h5UGFzcydlZCByZXF1ZXN0cyBieSBub3QKICAgICBjYWxsaW5nIGZpbmRfdHlwZXMgb24gYSBwcm94eSdkIHJlcXVlc3Q7IGZpeGVzIHByb2JsZW1zCiAgICAgd2hlcmUgc29tZSBQcm94eVBhc3MnZWQgVVJMcyB3ZXJlbid0IGFjdHVhbGx5IHBhc3NlZAogICAgIHRvIHRoZSBwcm94eS4KICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiM4NzAKCiAgKikgRml4IGEgYnl0ZSBvcmRlcmluZyBwcm9ibGVtIGluIG1vZF9hY2Nlc3Mgd2hpY2ggcHJldmVudGVkCiAgICAgdGhlIG9sZC1zdHlsZSBzeW50YXggKGkuZS4gImEuYi5jLiIgdG8gbWF0Y2ggYSBjbGFzcyBDKQogICAgIGZyb20gd29ya2luZyBwcm9wZXJseS4gW0RlYW4gR2F1ZGV0XSBQUiMxMjQ4LCAxMzI4LCAxMzg0CgogICopIEZpeCBwcm9ibGVtIHdpdGggVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUIG5vdCB3b3JraW5nCiAgICAgcHJvcGVybHkuIEVhY2ggY2hpbGQgbmVlZHMgdG8gb3BlbiB0aGUgbG9ja2ZpbGUgaW5zdGVhZAogICAgIG9mIHVzaW5nIHRoZSBwYXNzZWQgZmlsZS1kZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudC4gCiAgICAgW0ppbSBKYWdpZWxza2ldIFBSIzEwNTYKCiAgKikgRml4IHRoZSBlcnJvciBsb2dnaW5nIGluIG1vZF9jZ2k7IHRoZSByZWNlbnQgZXJyb3IgbG9nIGNoYW5nZXMKICAgICBpbnRyb2R1Y2VkIGEgYnVnIHRoYXQgcHJldmVudGVkIGl0IGZyb20gd29ya2luZyBjb3JyZWN0bHkuCiAgICAgW00uRC5QYXJrZXJdIFBSIzEzNTIKCiAgKikgRGVmYXVsdCB0byBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgb24gSFBVWCB0byBwcm9wZXJseSAKICAgICBoYW5kbGUgbXVsdGlwbGUgTGlzdGVuIGRpcmVjdGl2ZXMuICBbTWFyYyBTbGVta29dIFBSIzg3MgoKICAqKSBJbmhlcml0IGEgYnVnZml4IHRvIGZubWF0Y2guYyBmcm9tIEZyZWVCU0Qgc291cmNlcy4KICAgICBbIltLT0k4LVJdIOHOxNLFyiD+xdLOz9ciIDxhY2hlQG5hZ3VhbC5wcC5ydT5dIFBSIzEzMTEKCiAgKikgV2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyc2UgY29tcGxhaW5lZCBhYm91dCBhIGJhZCBkaXJlY3RpdmUsCiAgICAgdGhlIGxvZ2dlciB3b3VsZCB1c2Ugd2hhdGV2ZXIgKHVucmVsYXRlZCkgdmFsdWUgd2FzIGluIGVycm5vLgogICAgIGVycm5vIGlzIG5vdyBmb3JjZWQgdG8gRUlOVkFMIGZpcnN0IGluIHRoaXMgY2FzZS4gIFtLZW4gQ29hcl0KCiAgKikgQSBzZWQgY29tbWFuZCBpbiB0aGUgQ29uZmlndXJlIHNjcmlwdCBwdXNoZWQgdGhlIGVkZ2Ugb2YgUE9TSVhuZXNzLAogICAgIGJyZWFraW5nIG9uIHNvbWUgc3lzdGVtcy4gIFtCaGFiYSBSLk1pc3JhIDxzeXN0ZW1AdnQuZWR1Pl0gUFIjMTM2OAoKICAqKSBTb2xhcmlzID49IDIuNSB3YXMgdG90YWxseSBicm9rZW4gZHVlIHRvIGEgbWVzcyB1cCB1c2luZyBwdGhyZWFkCiAgICAgbXV0ZXhlcy4gIFtSb3kgRmllbGRpbmcsIERlYW4gR2F1ZGV0XQoKICAqKSBPUy8yIFBvcnQgdXBkYXRlZDsgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIE9TLzIgZnJvbSB0aGUgc2FtZQogICAgIHNvdXJjZXMgYXMgVW5peCBub3cuICBbQnJpYW4gSGF2YXJkIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBGaXggYSB5ZWFyIGZvcm1hdHRpbmcgYnVnIGluIG1vZF91c2VydHJhY2suCiAgICAgW1BhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+XSBQUiMxMzQyCgogICopIEEgbWlsZCBTSUdURVJNL1NJR0FMUk0gcmFjZSBjb25kaXRpb24gd2FzIGVsaW1pbmF0ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMjExCgogICopIFdhcm4gdXNlciB0aGF0IGRlZmF1bHQgcGF0aCBoYXMgY2hhbmdlZCBpZiAvdXNyL2xvY2FsL2V0Yy9odHRwZAogICAgIGlzIGZvdW5kIG9uIHRoZSBzeXN0ZW0uICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBWYXJpb3VzIG1vZF9taW1lX21hZ2ljIGJ1ZyBmaXhlcyBhbmQgY2xlYW51cHM6IFVuY29tcHJlc3Npb24KICAgICBzaG91bGQgd29yaywgaXQgc2hvdWxkIHdvcmsgb24gV0lOMzIsIGFuZCBhIGZldyByZXNvdXJjZQogICAgIGxlYWtzIGFuZCBhYm9ydCBjb25kaXRpb25zIGFyZSBmaXhlZC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzEyMDUKCiAgKikgUE9SVDogT24gQUlYIDEueCBmaWxlcyBjYW4ndCBiZSBuYW1lZCAnQCcsIGZpeCB0aGUgcHJveHkgY2FjaGUKICAgICB0byB1c2UgJyUnIGluc3RlYWQgb2YgJ0AnIGluIGl0cyBlbmNvZGluZ3MuCiAgICAgW0RhdmlkIFNjaHVsZXIgPHNjaHVsZEBidHYuaWJtLmNvbT5dIFBSIzEzMTcKCiAgKikgSW1wcm92ZSB0aGUgd2FybmluZyBtZXNzYWdlIGdlbmVyYXRlZCB3aGVuIHRoZSAic2VydmVyIGlzIGJ1c3kiLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTI5MwoKICAqKSBQT1JUOiBBbGwgcG9ydHMgd2hpY2ggZG9uJ3Qgb3RoZXJ3aXNlIGRlZmluZSBERUZfV0FOVEhTUkVHRVggd2lsbAogICAgIGdldCBTcGVuY2VyIHJlZ2V4IGJ5IGRlZmF1bHQuICBUaGlzIGlzIHRvIGF2b2lkIGhhdmluZyB0bwogICAgIGRpc2NvdmVyIGJ1Z3MgaW4gb3BlcmF0aW5nIHN5c3RlbSBsaWJyYXJpZXMuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6ICJGaXgiIFBSIzQ2NyBieSBnZW5lcmF0aW5nIHdhcm5pbmdzIG9uIHN5c3RlbXMgd2hpY2ggd2UgaGF2ZQogICAgIG5vdCBiZWVuIGFibGUgdG8gZ2V0IHdvcmtpbmcgVVNFXypfU0VSSUFMSVpFRF9BQ0NFUFQgc2V0dGluZ3MgZm9yLgogICAgIERvY3VtZW50IHRoaXMgYSBiaXQgbW9yZSBpbiBzcmMvUE9SVElORy4gIFtEZWFuIEdhdWRldF0gUFIjNDY3CgogICopIEVuc3VyZSB0aGF0IG9uZSBjb3B5IG9mIGNvbmZpZyB3YXJuaW5ncyBtYWtlcyBpdCB0byB0aGUKICAgICBlcnJvcl9sb2cuICBbRGVhbiBHYXVkZXRdCgogICopIEludmVudCBuZXcgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIG1ldGhvZHMgdG8gaGFuZGxlIGNvbmZpZyBmaWxlCiAgICAgcmVhZGluZy4gQWRkICJjdXN0b20iIGhvb2sgdG8gdXNlIGNvbmZpZyBmaWxlIGNmZ19nZXRsaW5lKCkgb24KICAgICBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgRklMRSogIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzaW5nbGUtZXhlIFdpbmRvd3MgaW5zdGFsbC4gW0JlbiBMYXVyaWUgYW5kIEVyaWMgRXNzZWxpbmtdCgogICopIFdJTjMyOiBNYWtlIENHSSB3b3JrIHVuZGVyIFdpbjk1LiBbQmVuIExhdXJpZSBhbmQgUGF1bCBTdXR0b25dCgogICopIFdJTjMyOiBNYWtlIGluZGV4Lmh0bWwgYW5kIGZyaWVuZHMgd29yayB1bmRlciBXaW45NS4gW0JlbiBMYXVyaWVdCgogICopIFBPUlQ6IFNvbGFyaXMgMi40IG5lZWRzIFNwZW5jZXIgcmVnZXgsIHRoZSBzeXN0ZW0gcmVnZXggaXMgYnJva2VuLgogICAgIFtKb2huIExpbmUgPGptbDRAY2FtLmFjLnVrPl0gUFIjMTMyMQoKICAqKSBEZWZhdWx0IHBhdGhuYW1lIGhhcyBiZWVuIGNoYW5nZWQgZXZlcnl3aGVyZSB0byAvdXNyL2xvY2FsL2FwYWNoZQogICAgIFtTYW1lZXIgPHNhbWVlckBjMi5uZXQ+XQoKICAqKSBQT1JUOiBBSVggbm93IHVzZXMgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULgogICAgIFtEYXZpZCBCcm9uZGVyIDxEYXZpZC1Ccm9uZGVyQHVpb3dhLmVkdT5dIFBSIzg0OQoKICAqKSBQT1JUOiBpMzg2IEFJWCBkb2VzIG5vdCBoYXZlIG1lbW1vdmUuCiAgICAgW0RhdmlkIFNjaHVsZXIgPHNjaHVsZEBidHYuaWJtLmNvbT5dIFBSIzEyNjcKCiAgKikgUE9SVDogSFBVWCBub3cgZGVmYXVsdHMgdG8gdXNpbmcgU3BlbmNlciByZWdleC4KICAgICBbUGhpbGlwcGUgVmFuaGFlc2VuZG9uY2sgPHB2YW5oYWVzQGJlLm9yYWNsZS5jb20+LAogICAgIE9tYXIgRGVsIFJpbyA8YWwxMTIyNjNAYWNhZGVtMDEubGFnLml0ZXNtLm14Pl0gUFIjNDgyLCAxMjQ2CgogICopIFBPUlQ6IFNvbWUgdmVyc2lvbnMgb2YgTmV0QlNEIGRvbid0IGF1dG9tYXRpY2FsbHkgZGVmaW5lCiAgICAgX19OZXRCU0RfXy4gIFdvcmthcm91bmQgYnkgZGVmaW5pbmcgTkVUQlNELgogICAgIFtDaHJpcyBDcmFmdCA8Y2NyYWZ0QGNuY2MuY2MuY28udXM+XSBQUiM5NzcKCiAgKikgUE9SVDogVW5peFdhcmUgMi54IHJlcXVpcmVzIC1sZ2VuIGZvciBzeXNsb2cuCiAgICAgW0hhbnMgU25pamRlciA8aHNAbWVnYW5ldC5ubD5dIFBSIzEyNDkKCiAgKikgUE9SVDogVUxUUklYIGFwcGVhcnMgdG8gbm90IGhhdmUgc3lzbG9nLgogICAgIFtMYXJzIEVpbGVicmVjaHQgPExhcnMuRWlsZWJyZWNodEB1bml4LWFnLm9yZz5dCgogICopIFBPUlQ6IEJhc2ljIEdlbWluaSBwb3J0ICh0cmVhdCBpdCBsaWtlIHVuaXh3YXJlMjEyKS4KICAgICBbIlBhdmVsIFlha292bGV2IChQYXVsIE1jSGFja2VyKSIgPGhhY0B0b21jYXQub2xseS5ydT5dCgogICopIFBPUlQ6IEFsbCBTVlI0IHN5c3RlbXMgbm93IHVzZSBORVRfU0laRV9UID0gc2l6ZV90LCBhbmQKICAgICB1c2UgVVNFX1NITUdFVF9TQ09SRUJPQVJELgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVmFyaW91cyBpbXByb3ZlbWVudHMgaW4gZGV0ZWN0aW5nIGNvbmZpZyBmaWxlIGVycm9ycyAobWlzc2luZyBjbG9zaW5nCiAgICAgZGlyZWN0aXZlcyBmb3IgPERpcmVjdG9yeT4sIDxGaWxlcz4gZXRjLiBibG9ja3MsIHByb2hpYml0aW5nIGdsb2JhbAogICAgIHNlcnZlciBzZXR0aW5ncyBpbiA8VmlydHVhbEhvc3Q+IGJsb2NrcywgZmxhZ2dpbmcgdW5oYW5kbGVkIG11bHRpcGxlCiAgICAgYXJndW1lbnRzIHRvIDxEaXJlY3Rvcnk+LCA8RmlsZXM+IGV0Yy4pCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgc3VwcG9ydCB0byBzdWV4ZWMgd3JhcHBlciBwcm9ncmFtIGZvciBtb2RfdW5pcXVlX2lkJ3MgVU5JUVVFX0lECiAgICAgdmFyaWFibGUgdG8gcHJvdmlkZSB0aGlzIG9uZSB0byBzdWV4ZWMnZCBDR0lzLCB0b28uCiAgICAgW00uRC5QYXJrZXIgPG1kcGNAbmV0Y29tLmNvbT5dIFBSIzEyODQKCiAgKikgTmV3IHN1cHBvcnQgdG9vbDogc3JjL3N1cHBvcnQvc3BsaXQtbG9nZmlsZSwgYSBzYW1wbGUgUGVybCBzY3JpcHQgd2hpY2gKICAgICBzcGxpdHMgdXAgYSBjb21iaW5lZCBhY2Nlc3MgbG9nIGludG8gc2VwYXJhdGUgZmlsZXMgYmFzZWQgb24gdGhlCiAgICAgbmFtZSBvZiB0aGUgdmlydHVhbCBob3N0IChsaXN0ZWQgZmlyc3QgaW4gdGhlIGxvZyByZWNvcmRzIGJ5ICIldiIpLgogICAgIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjIgKHRoZXJlIGlzIG5vIDEuM2IxKQoKICAqKSBUZXN0Q29tcGlsZSB3YXMgbm90IHBhc3NpbmcgJExJQlMgW0RlYW4gR2F1ZGV0XQoKICAqKSBNYWtlZmlsZS50bXBsIHdhcyBub3QgdXNpbmcgJENGTEFHUyBpbiB0aGUgbGluayBwaGFzZS4gCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgZGVidWdnaW5nIGNvZGUgdG8gYWxsb2MuYy4gIERlZmluaW5nIEFMTE9DX0RFQlVHIHByb3ZpZGVzIGEKICAgICBydWRpbWVudGFyeSBtZW1vcnkgZGVidWdnZXIgd2hpY2ggY2FuIGJlIHVzZWQgb24gbGl2ZSBzZXJ2ZXJzIHdpdGgKICAgICBsb3cgaW1wYWN0IC0tIGl0IHNldHMgYWxsIGFsbG9jYXRlZCBhbmQgZnJlZWQgbWVtb3J5IGJ5dGVzIHRvIDB4YTUuCiAgICAgRGVmaW5pbmcgQUxMT0NfVVNFX01BTExPQyB3aWxsIGNhdXNlIHRoZSBhbGxvYyBjb2RlIHRvIHVzZSBtYWxsb2MoKQogICAgIGFuZCBmcmVlKCkgZm9yIGVhY2ggb2JqZWN0LiAgVGhpcyBpcyBmYXIgbW9yZSBleHBlbnNpdmUgYW5kIHNob3VsZAogICAgIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZyB3aXRoIHRvb2xzIHN1Y2ggYXMgRWxlY3RyaWMgRmVuY2UgYW5kCiAgICAgUHVyaWZ5LiAgU2VlIG1haW4vYWxsb2MuYyBmb3IgbW9yZSBkZXRhaWxzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDb25maWd1cmUgdXNlcyBhIHNoIHRyYXAgYW5kIGRpZG4ndCBzZXQgaXRzIGV4aXRjb2RlIHByb3Blcmx5LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTE1OQoKICAqKSBZZXQgYW5vdGhlciB2aG9zdCByZXZhbXAuICBBZGQgdGhlIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUgd2hpY2gKICAgICBleHBsaWNpdGx5IGxpc3RzIHRoZSBpcDpwb3J0IHBhaXJzIHRoYXQgYXJlIHRvIGJlIHVzZWQgZm9yIG5hbWUtdmhvc3RzLgogICAgIEZyb20gYSBnaXZlbiBpcDpwb3J0LCByZWdhcmRsZXNzIHdoYXQgdGhlIEhvc3Q6IGhlYWRlciBpcywgeW91IGNhbgogICAgIG9ubHkgcmVhY2ggdGhlIHZob3N0cyBkZWZpbmVkIG9uIHRoYXQgaXA6cG9ydC4gIFRoZSBwcmVjZWRlbmNlIG9mCiAgICAgdmhvc3RzIHdhcyByZXZlcnNlZCB0byBtYXRjaCBvdGhlciBwcmVjZWRlbmNlcyBpbiB0aGUgY29uZmlnIC0tCiAgICAgdGhlIGVhcmxpZXIgdmhvc3RzIG92ZXJyaWRlIHRoZSBsYXRlciB2aG9zdHMuICBBbGwgdmhvc3QgbWF0Y2hpbmcgd2FzCiAgICAgbW92ZWQgaW50byBodHRwX3Zob3N0LltjaF0uICBbRGVhbiBHYXVkZXRdCgogICopIGFwX2lubGluZSBjYW4gYmUgdXNlZCB0byBmb3JjZSBpbmxpbmluZy4gIEdOVUMgX19hdHRyaWJ1dGVfXygpIGNhbgogICAgIGJlIHVzZWQgZm9yIHdoYXRldmVyIHJlYXNvbiBpcyBhcHByb3ByaWF0ZSAoaS5lLiBmb3JtYXQoKSB3YXJuaW5ncwogICAgIGZvciBwcmludGYgc3R5bGUgZnVuY3Rpb25zKS4gIEJvdGggYXJlIGVuYWJsZWQgb25seSB3aXRoCiAgICAgZ2NjID49IDIuNy54IChzbyB0aGF0IHdlIGhhdmUgZmV3ZXIgc3VwcG9ydCBpc3N1ZXMgd2l0aCBvbGRlcgogICAgIHZlcnNpb25zKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IHN1cHBvcnQgZm9yIFByb3h5IEF1dGhlbnRpY2F0aW9uICh3ZSB3ZXJlIHRlc3RpbmcgdGhlIHJlc3BvbnNlCiAgICAgc3RhdHVzIHRvbyBlYXJseSkuIFtNYXJjIFNsZW1rb10KCiAgKikgQ29yZUR1bXBEaXJlY3RvcnkgZGlyZWN0aXZlIGRpcmVjdHMgd2hlcmUgdGhlIGNvcmUgZmlsZSBpcwogICAgIHdyaXR0ZW4gd2hlbiBhIFNJR1NFR1YsIFNJR0JVUywgU0lHQUJPUlQgb3IgU0lHQUJSVCBhcmUKICAgICByZWNlaXZlZC4gIFtNYXJjIFNsZW1rbywgRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIEF0YXJpIE1JTlQuCiAgICAgW0phbiBQYXVsIFNjaG1pZHQgPEphbi5QLlNjaG1pZHRAbW5pLmZoLWdpZXNzZW4uZGU+XQoKICAqKSBXaGVuIGJvb3RpbmcsIGFwYWNoZSB3aWxsIG5vdyBkZXRhY2ggaXRzZWxmIGZyb20gc3RkaW4sIHN0ZG91dCwKICAgICBhbmQgc3RkZXJyLiAgc3RkZXJyIHdpbGwgbm90IGJlIGRldGFjaGVkIHVudGlsIGFmdGVyIHRoZSBjb25maWcKICAgICBmaWxlcyBoYXZlIGJlZW4gcmVhZCBzbyB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSBpbml0aWFsIGVycm9yCiAgICAgbWVzc2FnZXMuICBBZnRlciB0aGF0IGFsbCBlcnJvcnMgYXJlIGxvZ2dlZCBpbiB0aGUgZXJyb3JfbG9nLgogICAgIFRoaXMgbWFrZXMgaXQgbW9yZSBjb252ZW5pZW50IHRvIHN0YXJ0IGFwYWNoZSB2aWEgcnNoLCBzc2gsCiAgICAgb3IgY3JvbnRhYnMuICBbRGVhbiBHYXVkZXRdIFBSIzUyMwoKICAqKSBtb2RfcHJveHkgd2FzIHNlbmRpbmcgSFRUUC8xLjEgcmVzcG9uc2VzIHRvIGZ0cCByZXF1ZXN0cyBieSBtaXN0YWtlLgogICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKICAgICBzb3VyY2Ugb2Ygc28gbWFueSBtaXNkaXJlY3RlZCBidWcgcmVwb3J0cy4gIFtSb3kgRmllbGRpbmcsIE1hcmMgU2xlbWtvXQoKICAqKSBzZW5kX2ZiIHdvdWxkIG5vdCBkZXRlY3QgYWJvcnRlZCBjb25uZWN0aW9ucyBpbiBzb21lIHNpdHVhdGlvbnMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfaW5jbHVkZSB3b3VsZCB1c2UgdW5pbml0aWFsaXplZCBkYXRhIHdoZW4gcGFyc2luZyBjZXJ0YWluCiAgICAgZXhwcmVzc2lvbnMgaW52b2x2aW5nICYmIGFuZCB8fC4gW0JyaWFuIFNsZXNpbnNreV0gUFIjMTEzOQoKICAqKSBtb2RfaW1hcCBzaG91bGQgb25seSBoYW5kbGUgR0VUIG1ldGhvZHMuICBbSmF5IEJsb29kd29ydGhdCgogICopIHN1ZXhlYy5jIHdvdWxkbid0IGJ1aWxkIHdpdGhvdXQgLURMT0dfRVhFQy4gW0phc29uIEEuIERvdXJdCgogICopIG1vZF9hdXRvaW5kZXggaW1wcm9wZXJseSBjb3VudGVkICZlc2NhcGVzOyBhcyBtb3JlIHRoYW4gb25lCiAgICAgY2hhcmFjdGVyIGluIHRoZSBkZXNjcmlwdGlvbi4gIEl0IGFsc28gaW1wcm9wZXJseSB0cnVuY2F0ZWQKICAgICBkZXNjcmlwdGlvbnMgdGhhdCB3ZXJlIGV4YWN0bHkgdGhlIG1heGltdW0gbGVuZ3RoLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVkaXJlY3RNYXRjaCB3YXMgbm90IHByb3Blcmx5IGVzY2FwaW5nIHRoZSByZXN1bHQgKFBSIzExNTUpLiAgQWxzbwogICAgICJSZWRpcmVjdE1hdGNoIC9hZHZlcnRpc2VyLyguKikgJDEiIGlzIG5vdyBwZXJtaXR0ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfaW5jbHVkZSBub3cgdXNlcyBzeW1ib2xpYyBuYW1lcyB0byBjaGVjayBmb3IgcmVxdWVzdCBzdWNjZXNzCiAgICAgYW5kIHJldHVybiBIVFRQIGVycm9ycywgYW5kIGNvcnJlY3RseSBoYW5kbGVzIGFsbCB0eXBlcyBvZgogICAgIHJlZGlyZWN0aW9ucyAocHJldmlvdXNseSBpdCBvbmx5IGRpZCB0ZW1wb3JhcnkgcmVkaXJlY3QgY29ycmVjdGx5KS4KICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZ10KCiAgKikgbW9kX3VzZXJkaXIgd2FzIG1vZGlmeWluZyByLT5maW5mbyBpbiBjYXNlcyB3aGVyZSBpdCB3YXNuJ3Qgc2V0dGluZwogICAgIHItPmZpbGVuYW1lLiAgU2luY2UgdGhvc2UgdHdvIGFyZSBtZWFudCB0byBiZSBpbiBzeW5jIHdpdGggZWFjaCBvdGhlcgogICAgIHRoaXMgaXMgYSBidWcuICBbIlBhdWwgQi4gSGVuc29uIiA8aGVuc29uQGludHJhbmV0LmNzdXBvbW9uYS5lZHU+XQoKICAqKSBQT1JUOiBTdXBwb3J0IFVuaXN5cyBTVlI0LCB3aG9zZSB1bmFtZSByZXR1cm5zIG1vc3RseSB1c2VsZXNzIGRhdGEuCiAgICAgWyJLYXVmbWFuLCBTdGV2ZW4gRSIgPFN0ZXZlbi5LYXVmbWFuQHVuaXN5cy5jb20+XQoKICAqKSBJbmV0ZCBtb2RlICh3aGljaCBpcyBidWdneSkgdXNlcyB0aW1lb3V0cyB3aXRob3V0IGhhdmluZyBzZXR1cCB0aGUKICAgICBqbXBidWZmZXIuIFtEZWFuIEdhdWRldF0gUFIjMTA2NAoKICAqKSBXb3JrIGFyb3VuZCBwcm9ibGVtIHVuZGVyIExpbnV4IHdoZXJlIGEgY2hpbGQgd2lsbCBzdGFydCBsb29waW5nCiAgICAgcmVwb3J0aW5nIGEgc2VsZWN0IGVycm9yIG92ZXIgYW5kIG92ZXIuCiAgICAgW1JpY2sgRnJhbmNodWsgPHJpY2tmQHRyYW5zcGVjdC5uZXQ+XSBQUiMxMTA3LCA5ODcsIDU4OAoKICAqKSBGaXhlZCBlcnJvciBpbiBwcm94eV91dGlsLmMgd2hlbiBsb29waW5nIHRocm91Z2ggbXVsdGlwbGUgaG9zdCBJUAogICAgIGFkZHJlc3Nlcy4gW0xhcnMgRWlsZWJyZWNodF0gUFIjOTc0CgogICopIElmIEJVRkZFUkVEX0xPR1MgaXMgZGVmaW5lZCB0aGVuIG1vZF9sb2dfY29uZmlnIHdpbGwgZG8gYXRvbWljCiAgICAgYnVmZmVyZWQgd3JpdGVzIC0tIHRoYXQgaXMsIGl0IHdpbGwgYnVmZmVyIHVwIHRvIFBJUEVfQlVGIChpLmUuIDRrKQogICAgIGJ5dGVzIGJlZm9yZSB3cml0aW5nLCBidXQgaXQgd2lsbCBuZXZlciBzcGxpdCBhIGxvZyBlbnRyeSBhY3Jvc3MgYQogICAgIGJ1ZmZlciBib3VuZGFyeS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiB0aGUgc2hvcnRfc2NvcmUgcmVjb3JkIGhhcyBiZWVuIHNwbGl0IGludG8gdHdvIHBpZWNlcywgb25lIHdoaWNoCiAgICAgdGhlIHBhcmVudCB3cml0ZXMgb24sIGFuZCBvbmUgd2hpY2ggdGhlIGNoaWxkIHdyaXRlcyBvbi4gIEFzIHBhcnQgb2YKICAgICB0aGlzIGNoYW5nZSB0aGUgZ2V0X3Njb3JlYm9hcmRfaW5mbygpIGZ1bmN0aW9uIHdhcyByZW1vdmVkLCBhbmQKICAgICBzY29yZWJvYXJkX2ltYWdlIHdhcyBleHBvcnRlZC4gIFRoaXMgY2hhbmdlIGZpeGVzIGEgcmFjZSBjb25kaXRpb24KICAgICBpbiBmaWxlIGJhc2VkIHNjb3JlYm9hcmQgc3lzdGVtcywgYW5kIHNwZWVkcyB1cCBjaGFuZ2VzIGludm9sdmluZyB0aGUKICAgICBzY29yZWJvYXJkIGluIGVhcmxpZXIgMS4zIGRldmVsb3BtZW50LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IE5ldyByZWdpc3Rlcl9vdGhlcl9jaGlsZCgpIEFQSSAoc2VlIGh0dHBfbWFpbi5oKSB3aGljaCBhbGxvd3MKICAgICBtb2R1bGVzIHRvIHJlZ2lzdGVyIGNoaWxkcmVuIHdpdGggdGhlIHBhcmVudCBmb3IgbWFpbnRlbmFuY2UuICBJdAogICAgIGlzIGRpc2FibGVkIGJ5IGRlZmluaW5nIE5PX09USEVSX0NISUxELiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IE5ldyBwaXBlZF9sb2cgQVBJIChzZWUgaHR0cF9sb2cuaCkgd2hpY2ggaW1wbGVtZW50cyBwaXBlZCBsb2dzLAogICAgIGFuZCB3aWxsIHVzZSByZWdpc3Rlcl9vdGhlcl9jaGlsZCB0byBpbXBsZW1lbnQgcmVsaWFibGUgcGlwZWQgbG9ncwogICAgIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiAgVGhlIHJlbGlhYmxlIHBpcGVkIGxvZ3MgcGFydCBjYW4gYmUgZGlzYWJsZWQKICAgICBieSBkZWZpbmluZyBOT19SRUxJQUJMRV9QSVBFRF9MT0dTLiAgQXQgdGhlIG1vbWVudCByZWxpYWJsZSBwaXBlZAogICAgIGxvZ3MgaXMgb25seSBhdmFpbGFibGUgb24gVW5peC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IHNldF9sYXN0X21vZGlmaWVkKCkgYnJva2VuIGludG8gc2V0X2xhc3RfbW9kaWZpZWQoKSwgc2V0X2V0YWcoKSwgYW5kCiAgICAgbWVldHNfY29uZGl0aW9ucygpLiAgVGhpcyBhbGxvd3MgY29uZGl0aW9uYWwgSFRUUCBzZWxlY3Rpb24gdG8gYmUKICAgICBoYW5kbGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RvcmluZyBvZiB0aGUgaGVhZGVyIGZpZWxkcywgYW5kIHByb3ZpZGVzCiAgICAgdGhlIGFiaWxpdHkgZm9yIENHSXMgdG8gc2V0IHRoZWlyIG93biBFVGFncyBmb3IgY29uZGl0aW9uYWwgY2hlY2tpbmcuCiAgICAgW0tlbiBDb2FyLCBSb3kgRmllbGRpbmddICBQUiM4OTUKCiAgKikgQ2hhbmdlcyB0byBtb2RfbG9nX2NvbmZpZyB0byBhbGxvdyBuYW1pbmcgb2YgZm9ybWF0IHN0cmluZ3MuCiAgICAgRm9ybWF0IG5pY2tuYW1lcyBhcmUgZGVmaW5lZCB3aXRoICJMb2dGb3JtYXQgZm10IG5pY2tuYW1lIiwgYW5kIGNhbgogICAgIGJlIHVzZWQgd2l0aCAiTG9nRm9ybWF0IG5pY2tuYW1lIiBhbmQgIkN1c3RvbUxvZyBsb2d0YXJnZXQgbmlja25hbWUiLgogICAgIFtLZW4gQ29hcl0KCiAgKikgTmV3IG1vZHVsZSwgIm1vZF9zcGVsaW5nIiwgd2hpY2ggY2FuIGhlbHAgZmluZCBmaWxlcyBldmVuIHdoZW4gCiAgICAgdGhlIFVSTCBpcyBzbGlnaHRseSBtaXNzcGVsbGVkLiBbTWFydGluIEtyYWVtZXIsIEFsZXhlaSBLb3N1dF0KCiAgKikgQVBJOiBOZXcgZnVuY3Rpb24gY2hpbGRfdGVybWluYXRlKCkgdHJpZ2dlcnMgdGhlIGNoaWxkIHByb2Nlc3MgdG8KICAgICBleGl0LCB3aGlsZSBhbGxvd2luZyB0aGUgY2hpbGQgZmluaXNoIHdoYXQgaXQgbmVlZHMgdG8gZm9yIHRoZQogICAgIGN1cnJlbnQgcmVxdWVzdCBmaXJzdC4gIAogICAgIFtEb3VnIE1hY0VhY2hlcm4sIEFsZXhlaSBLb3N1dF0KCiAgKikgV2luZG93cyBub3cgZGVmYXVsdHMgdG8gdXNpbmcgZnVsbCBzdGF0dXMgcmVwb3J0cyB3aXRoIG1vZF9zdGF0dXMuCiAgICAgW0FsZXhlaSBLb3N1dF0gUFIgIzEwOTQKCiAgKikgKlJlYWxseSogZGlzYWJsZSBhbGwgbW9kX3Jld3JpdGUgb3BlcmF0aW9ucyBpZiB0aGUgZW5naW5lIGlzIG9mZi4KICAgICBTb21lIHRoaW5ncyAobGlrZSBSZXdyaXRlTWFwcykgd2VyZSBjaGVja2VkL3BlcmZvcm1lZCBldmVuIGlmIHRoZXkKICAgICB3ZXJlbid0IHN1cHBvc2VkIHRvIGJlLiAgW0tlbiBDb2FyXSBQUiAjOTkxCgogICopIEltcGxlbWVudCBhIG5ldyB0aW1lciBzY2hlbWUgd2hpY2ggZWxpbWluYXRlcyB0aGUgbmVlZCB0byBjYWxsIGFsYXJtKCkgYWxsCiAgICAgdGhlIHRpbWUuICBJbnN0ZWFkIGEgY291bnRlciBpbiB0aGUgc2NvcmVib2FyZCBmb3IgZWFjaCBjaGlsZCBpcyB1c2VkIHRvCiAgICAgc2hvdyB3aGVuIHRoZSBjaGlsZCBoYXMgbWFkZSBmb3J3YXJkIHByb2dyZXNzLiAgVGhlIHBhcmVudCBzYW1wbGVzIHRoaXMKICAgICBjb3VudGVyIGV2ZXJ5IHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UgY3ljbGUsIGFuZCBpc3N1ZXMgU0lHQUxSTSBpZiBubwogICAgIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgaW4gdGhlIHRpbWVvdXQgcGVyaW9kLiAgVGhpcyByZWR1Y2VzIHRoZSBzdGF0aWMKICAgICByZXF1ZXN0IGJlc3QtY2FzZSBzeXNjYWxsIGNvdW50IHRvIDIyIGZyb20gMjkuICBUaGlzIHNjaGVtZSBpcyBvbmx5CiAgICAgdXNlZCBieSBzeXN0ZW1zIHdpdGggbWVtb3J5LWJhc2VkIHNjb3JlYm9hcmRzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUaGUgcHJveHkgbm93IHByb3Blcmx5IGhhbmRsZXMgQ09OTkVDVCByZXF1ZXN0cyB3aGljaCBhcmUgc2VudAogICAgIHRvIHByb3h5IHNlcnZlcnMgd2hlbiB1c2luZyBQcm94eVJlbW90ZS4gIFtNYXJjIFNsZW1rb10gUFIjMTAyNAoKICAqKSBBIHNjcmlwdCBjYWxsZWQgYXBhY2hlY3RsIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzdXBwb3J0IAogICAgIGRpcmVjdG9yeS4gIFRoaXMgc2NyaXB0IGFsbG93cyB5b3UgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgCiAgICAgImFwYWNoZWN0bCBzdGFydCIgYW5kICJhcGFjaGVjdGwgcmVzdGFydCIgZnJvbSB0aGUgY29tbWFuZAogICAgIGxpbmUuICBbTWFyYyBTbGVta29dCgogICopIE1vZHVsZXMgYW5kIGNvcmUgcm91dGluZXMgYXJlIG5vdyBwdXQgaW50byBsaWJyYXJpZXMsIHdoaWNoCiAgICAgc2ltcGxpZmllcyB0aGUgbGluayBsaW5lIHRyZW1lbmRvdXNseSAoYW1vbmcgb3RoZXIgYWR2YW50YWdlcykuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBTb21lIG9mIHRoZSBNRDUgbmFtZXMgZGVmaW5lZCBpbiBBcGFjaGUgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gaGF2ZQogICAgIGFuIGBhcF8nIHByZWZpeCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCByb3V0aW5lcyBzdXBwbGllZCBieQogICAgIGV4dGVybmFsIGxpYnJhcmllcy4gIFtLZW4gQ29hcl0KCiAgKikgUmVtb3ZhbCBvZiBtb2RfYXV0aF9tc3FsLmMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLiBUaGVyZSBhcmUgbWFueQogICAgIG90aGVyIG9wdGlvbnMgZm9yIGRhdGFiYXNlcyB0b2RheS4gUmF0aGVyIHRoYW4gb2ZmZXIgb25lIG9wdGlvbiwKICAgICBvZmZlciBub25lIGF0IHRoaXMgdGltZS4gbW9kX2F1dGhfbXNxbCBhbmQgb3RoZXIgU1FMIGRhdGFiYXNlCiAgICAgYXV0aGVudGljYXRpb24gbW9kdWxlcyBjYW4gYmUgZm91bmQgYXQgdGhlIEFwYWNoZSBNb2R1bGUgUmVnaXN0cnkuCiAgICAgaHR0cDovL21vZHVsZXMuYXBhY2hlLm9yZy8gSXQgd291bGQgYmUgbmljZSB0byBvZmZlciBhIGdlbmVyaWMKICAgICBtb2RfYXV0aF9zcWwgb3B0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KCiAgKikgUE9SVDogQmVPUyBzdXBwb3J0IGFkZGVkIFtBbGV4ZWkgS29zdXRdCgogICopIENvbmZpZ3VyZSBubyBsb25nZXIgYWNjZXB0cyB0aGUgLW1ha2Ugb3B0aW9uLCBzaW5jZSBpdCBjcmVhdGVzCiAgICAgTWFrZWZpbGUgb24gdGhlIGZseSBiYXNlZCBvbiBNYWtlZmlsZS50bXBsIGFuZCBDb25maWd1cmF0aW9uLgoKICAqKSBBcGFjaGUgbm93IGdyYWNlZnVsbHkgc2h1dHMgZG93biB3aGVuIGl0IHJlY2VpdmVzIGEgU0lHVEVSTSwgaW5zdGVhZAogICAgIG9mIGZvcmNpYmx5IGtpbGxpbmcgb2ZmIGFsbCBpdHMgcHJvY2Vzc2VzIGFuZCBleGl0aW5nIHdpdGhvdXQKICAgICBjbGVhbmluZyB1cC4gW0FsZXhlaSBLb3N1dF0KCiAgKikgQVBJOiBBIG5ldyBmaWVsZCBpbiB0aGUgcmVxdWVzdF9yZWMsIHItPm10aW1lLCBoYXMgYmVlbiBhZGRlZCB0bwogICAgIGF2b2lkIGdyYXR1aXRvdXMgcGFyc2luZyBvZiBkYXRlIHN0cmluZ3MuICBJdCBpcyBpbnRlbmRlZCB0byBob2xkCiAgICAgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UgKGlmIGFwcGxpY2FibGUpLiAgQW4KICAgICB1cGRhdGVfbXRpbWUoKSByb3V0aW5lIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gYWR2YW5jZSBpdCBpZgogICAgIGFwcHJvcHJpYXRlLiAgW1JveSBGaWVsZGluZywgS2VuIENvYXJdCgogICopIFNFQ1VSSVRZOiBJZiBhIGh0YWNjZXNzIGZpbGUgY2FuIG5vdCBiZSByZWFkIGR1ZSB0byBiYWQgcGVybWlzc2lvbnMsCiAgICAgZGVueSBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgSFRUUF9GT1JCSURERU4uICBUaGUgcHJldmlvdXMKICAgICBiZWhhdmlvciB3YXMgdG8gaWdub3JlIHRoZSBodGFjY2VzcyBmaWxlIGlmIGl0IGNvdWxkIG5vdCBiZSByZWFkLgogICAgIFRoaXMgY2hhbmdlIG1heSBtYWtlIHNvbWUgc2V0dXBzIHdpdGggdW5yZWFkYWJsZSBodGFjY2VzcyBmaWxlcwogICAgIHN0b3Agd29ya2luZy4gIFtNYXJjIFNsZW1rb10gUFIjODE3CgogICopIEFkZCBhcGxvZ19lcnJvcigpIHByb3ZpZGluZyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgbGV2ZWxzIG9mCiAgICAgdmVyYm9zaXR5IHRvIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nZ2luZy4gVGhpcyBhZGRpdGlvbiBhbHNvIHByb3ZpZGVzCiAgICAgdGhlIGFiaWxpdHkgdG8gbG9nIGVycm9ycyB1c2luZyBzeXNsb2dkLiBFcnJvciBsb2dnaW5nIGlzIGNvbmZpZ3VyYWJsZQogICAgIG9uIGEgcGVyLXNlcnZlciBiYXNpcyB1c2luZyB0aGUgTG9nTGV2ZWwgZGlyZWN0aXZlLiBDb252ZXJzaW9uCiAgICAgb2YgbG9nXyooKSBpbiBwcm9ncmVzcy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIEZ1cnRoZXIgZW5oYW5jZSBhcGxvZ19lcnJvcigpIHRvIG5vdCBsb2cgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQKICAgICBlcnJubyBpbmZvcm1hdGlvbiB3aGVuIGl0IGlzbid0IGFwcGxpY2FibGUuIFtLZW4gQ29hciwgRGVhbiBHYXVkZXRdCgogICopIFdJTjMyOiBDYW5vbmljYWxpc2UgZmlsZW5hbWVzIHVuZGVyIFdpbjMyLiBTaG9ydCBmaWxlbmFtZXMgYXJlCiAgICAgY29udmVydGVkIHRvIGxvbmcgb25lcy4gQmFja3NsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBmb3J3YXJkCiAgICAgc2xhc2hlcy4gQ2FzZSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXIuIFBhcnRzIG9mIFVSTHMgdGhhdCBkbyBub3QKICAgICBjb3JyZXNwb25kIHRvIGZpbGVzIGFyZSBsZWZ0IGNvbXBsZXRlbHkgYWxvbmUuIFtCZW4gTGF1cmllXQoKICAqKSBQT1JUOiAyIG5ldyBPU3MgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcG9ydHM6CiAgICAgIEVuY29yZSdzIFVNQVggVjogQXJpZWggTWFya2VsIDxhbWFya2VsQGVuY29yZS5jb20+CiAgICAgIEFjb3JuIFJJU0NpWDogU3RlcGhlbiBCb3JyaWxsIDxzYm9ycmlsbEB4ZW1wbGFyLmNvLnVrPgoKICAqKSBBZGQgdGhlIHNlcnZlciB2ZXJzaW9uIChTRVJWRVJfVkVSU0lPTiBtYWNybykgdG8gdGhlICJzZXJ2ZXIKICAgICBjb25maWd1cmVkIGFuZCBydW5uaW5nIiBlbnRyeSBpbiB0aGUgZXJyb3JfbG9nLiAgQWxzbyBidWlsZCBhbgogICAgIG9iamVjdCBmaWxlIGF0IGxpbmstdGltZSB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IHRpbWUKICAgICAoU0VSVkVSX0JVSUxUIGdsb2JhbCBjb25zdCBjaGFyW10pLCBhbmQgaW5jbHVkZSB0aGF0IGluIHRoZQogICAgIG1lc3NhZ2UuICBbS2VuIENvYXJdCgogICopIFNldCByLT5oZWFkZXJzX291dCB3aGVuIHNlbmRpbmcgcmVzcG9uc2VzIGZyb20gdGhlIHByb3h5LgogICAgIFRoaXMgZml4ZXMgdGhpbmdzIHN1Y2ggYXMgdGhlIGxvZ2dpbmcgb2YgaGVhZGVycyBzZW50IGZyb20KICAgICB0aGUgcHJveHkuICBbTWFyYyBTbGVta29dIFBSIzY1OQoKICAqKSBzdXBwb3J0L2h0dHBkX21vbml0b3IgaXMgbm8gbG9uZ2VyIGRpc3RyaWJ1dGVkIGJlY2F1c2UgdGhlIAogICAgIHNjb3JlYm9hcmQgc2hvdWxkIG5vdCBiZSBmaWxlIGJhc2VkIGlmIGF0IGFsbCBwb3NzaWJsZS4gVXNlCiAgICAgbW9kX3N0YXR1cyB0byBzZWUgY3VycmVudCBzZXJ2ZXIgc25hcHNob3QuCgogICopIChzZXRfZmlsZV9zbG90KTogTmV3IGZ1bmN0aW9uLCBhbGxvd2luZyBhdXRoIGRpcmVjdGl2ZXMgdG8gYmUKICAgICBpbmRlcGVuZGVudCBvZiB0aGUgc2VydmVyIHJvb3QsIHNvIHRoZSBzZXJ2ZXIgZG9jdW1lbnRzIGNhbiBiZQogICAgIG1vdmVkIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBvciBtYWNoaW5lIG1vcmUgZWFzaWx5LgogICAgIFtEYXZpZCBKLiBNYWNLZW56aWVdCgogICopIElmIG5vIFRyYW5zZmVyTG9nIGlzIGdpdmVuIGV4cGxpY2l0bHksIGRlY2xpbmUKICAgICB0byBsb2cuICBUaGlzIHN1cHBvcnRzIGNvZXhpc3RlbmNlIHdpdGggb3RoZXIgbG9nZ2luZyBtb2R1bGVzLAogICAgIHN1Y2ggYXMgdGhlIGN1c3RvbSBvbmUgdGhhdCBVVU5FVCB1c2VzLiBbRGF2aWQgSi4gTWFjS2VuemllXQoKICAqKSBDaGVjayBmb3IgdGl0bGVzIGluIHNlcnZlci1wYXJzZWQgSFRNTCBmaWxlcy4KICAgICBJZ25vcmUgbGVhZGluZyBuZXdsaW5lcyBhbmQgcmV0dXJucyBpbiB0aXRsZXMuICBUaGUgb2xkIGJlaGF2aW9yCiAgICAgb2YgcmVwbGFjaW5nIGEgbmV3bGluZSBhZnRlciA8dGl0bGU+IHdpdGggYSBzcGFjZSBjYXVzZXMgdGhlCiAgICAgdGl0bGUgdG8gYmUgbWlzYWxpZ25lZCBpbiB0aGUgbGlzdGluZy4gW0RhdmlkIEouIE1hY0tlbnppZV0KCiAgKikgQ2hhbmdlIG1vZF9jZXJuX21ldGEgdG8gYmUgY29uZmlndXJhYmxlIG9uIGEgcGVyLWRpcmVjdG9yeSBiYXNpcy4KICAgICBbRGF2aWQgSi4gTWFjS2VuemllXQoKICAqKSBBZGQgJ0luY2x1ZGUnIGRpcmVjdGl2ZSB0byBhbGxvdyBpbmNsdXNpb24gb2YgY29uZmlndXJhdGlvbgogICAgIGZpbGVzIHdpdGhpbiBjb25maWd1cmF0aW9uIGZpbGVzLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUHJveHkgZXJyb3JzIG9uIGNvbm5lY3QoKSBhcmUgbG9nZ2VkIHRvIHRoZSBlcnJvcl9sb2cgKG5vdGhpbmcKICAgICBuZXcpOyBub3cgdGhleSBpbmNsdWRlIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IHRoYXQgZmFpbGVkCiAgICAgKCp0aGF0J3MqIG5ldykuICAgW0tlbiBDb2FyLCBNYXJjIFNsZW1rb10gUFIjMzUyCgogICopIFZhcmlvdXMgYXJjaGl0ZWN0dXJlcyBub3cgZGVmaW5lIFVTRV9NTUFQX0ZJTEVTIHdoaWNoIGNhdXNlcwogICAgIHRoZSBzZXJ2ZXIgdG8gdXNlIG1tYXAoKSBmb3Igc3RhdGljIGZpbGVzLiAgVGhlcmUgYXJlIHR3bwogICAgIGNvbXBpbGUtdGltZSB0dW5hYmxlcyBNTUFQX1RIUkVTSE9MRCAobWluaW11bSBudW1iZXIgb2YgYnl0ZXMKICAgICByZXF1aXJlZCB0byB1c2UgbW1hcCgpLCBkZWZhdWx0IGlzIDApLCBhbmQgTU1BUF9TRUdNRU5UX1NJWkUgKG1heGltdW0KICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBvbmUgY3ljbGUgZnJvbSBhIHNpbmdsZSBtbWFwKClkIG9iamVjdCwKICAgICBkZWZhdWx0IDMyNzY4KS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBBZGRlZCBwb3N0X3JlYWRfcmVxdWVzdCBBUEkgcGhhc2Ugd2hpY2ggaXMgcnVuIHJpZ2h0IGFmdGVyIHJlYWRpbmcKICAgICB0aGUgcmVxdWVzdCBmcm9tIGEgY2xpZW50LCBvciByaWdodCBhZnRlciBhbiBpbnRlcm5hbCByZWRpcmVjdC4gIEl0IGlzCiAgICAgdXNlZnVsIGZvciBtb2R1bGVzIHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgZGVwZW5kIG9ubHkgb24KICAgICB0aGUgaGVhZGVycy9jb250ZW50cyBvZiB0aGUgcmVxdWVzdC4gIEl0IGRvZXMgbm90IHJ1biBkdXJpbmcgc3VicmVxdWVzdHMKICAgICBiZWNhdXNlIHN1YnJlcXVlc3RzIGluaGVyaXQgcHJldHR5IG11Y2ggZXZlcnl0aGluZyBmcm9tIHRoZSBtYWluCiAgICAgcmVxdWVzdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGRlZCBtb2RfdW5pcXVlX2lkIHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKICAgICBlYWNoIGhpdCwgYXZhaWxhYmxlIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVTklRVUVfSUQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBpbml0X21vZHVsZXMgaXMgbm93IGNhbGxlZCBhZnRlciB0aGUgZXJyb3IgbG9ncyBoYXZlIGJlZW4gb3BlbmVkLiAgVGhpcwogICAgIGFsbG93cyBtb2R1bGVzIHRvIGVtaXQgaW5mb3JtYXRpb24gbWVzc2FnZXMgaW50byB0aGUgZXJyb3IgbG9ncy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIHByb3h5LXBhc3MtdGhyb3VnaCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlOyBBZGRlZCBlcnJvciBsb2dnaW5nCiAgICAgaW5mb3JtYXRpb24gZm9yIGNhc2Ugd2hlcmUgcHJveHkgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIFtNYXJjIFNsZW1rb10KCiAgKikgUE9SVDogQXBhY2hlIGhhcyBuZWVkIGZvciBtdXRleGVzIHRvIHNlcmlhbGl6ZSBpdHMgY2hpbGRyZW4gYXJvdW5kCiAgICAgYWNjZXB0LiAgSW4gcHJpb3IgdmVyc2lvbnMgZWl0aGVyIGZjbnRsIGZpbGUgbG9ja2luZyBvciBmbG9jayBmaWxlCiAgICAgbG9ja2luZyB3ZXJlIHVzZWQuICBUaGUgbWV0aG9kIGlzIGNob3NlbiBieSB0aGUgZGVmaW5pdGlvbiBvZgogICAgIFVTRV94eHhfU0VSSUFMSVpFRF9BQ0NFUFQgaW4gY29uZi5oLiAgeHh4IGlzIEZDTlRMIGZvciBmY250bCgpLAogICAgIGFuZCBGTE9DSyBmb3IgZmxvY2soKS4gIE5ldyBvcHRpb25zIGhhdmUgYmVlbiBhZGRlZDoKICAgICAgICAtIFNZU1ZTRU0gdG8gdXNlIFN5c3RlbSBWIHN0eWxlIHNlbWFwaG9yZXMKICAgICAgICAtIFBUSFJFQUQgdG8gdXNlIFBPU0lYIHRocmVhZHMgKGFwcGVhcnMgdG8gd29yayBvbiBTb2xhcmlzIG9ubHkpCiAgICAgICAgLSBVU0xPQ0sgdG8gdXNlIElSSVggdXNsb2NrCiAgICAgQmFzZWQgb24gdGltaW5nIHZhcmlvdXMgdGVjaG5pcXVlcywgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZQogICAgIHRvIHRoZSBkZWZhdWx0czoKICAgICAgICAtIExpbnV4IDIueCB1c2VzIGZsb2NrIGluc3RlYWQgb2YgZmNudGwKICAgICAgICAtIFNvbGFyaXMgMi54IHVzZXMgcHRocmVhZHMKICAgICAgICAtIElSSVggdXNlcyBTeXNWIHNlbWFwaG9yZXMgLS0gaG93ZXZlciBtdWx0aXByb2Nlc3NvciBJUklYIGJveGVzCiAgICAgICAgICB3b3JrIGZhciBmYXN0ZXIgaWYgeW91IC1EVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAogICAgIFtEZWFuIEdhdWRldCwgUGllcnJlLVl2ZXMgS2VyZW1iZWxsZWMgPFBpZXJyZS1ZdmVzLktlcmVtYmVsbGVjQHZ0Y29tLmZyPiwKICAgICBNYXJ0aWpuIEtvc3RlciA8bS5rb3N0ZXJAcG9ib3guY29tPl0KCiAgKikgUE9SVDogVGhlIHNlbWFudGljcyBvZiBhY2NlcHQvc2VsZWN0IG1ha2UgaXQgdmVyeSBkZXNpcmFibGUgdG8gdXNlCiAgICAgbXV0ZXhlcyB0byBzZXJpYWxpemUgYWNjZXB0IHdoZW4gbXVsdGlwbGUgTGlzdGVucyBhcmUgaW4gdXNlLiAgQnV0CiAgICAgaW4gdGhlIGNhc2Ugd2hlcmUgb25seSBhIHNpbmdsZSBzb2NrZXQgaXMgb3BlbiBpdCBpcyBzb21ldGltZXMKICAgICByZWR1bmRhbnQgdG8gc2VyaWFsaXplIGFjY2VwdCgpLiAgTm90IGFsbCB1bml4ZXMgZG8gYSBnb29kIGpvYiB3aXRoCiAgICAgcG90ZW50aWFsbHkgZG96ZW5zIG9mIGNoaWxkcmVuIGJsb2NrZWQgb24gYWNjZXB0KCkgb24gdGhlIHNhbWUKICAgICBzb2NrZXQuICBJdCdzIG5vdyBwb3NzaWJsZSB0byBkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIGFuZAogICAgIHRoZSBzZXJ2ZXIgd2lsbCBhdm9pZCBzZXJpYWxpemF0aW9uIHdoZW4gbGlzdGVuaW5nIG9uIG9ubHkgb25lIHNvY2tldCwKICAgICBhbmQgdXNlIHNlcmlhbGl6YXRpb24gd2hlbiBsaXN0ZW5pbmcgb24gbXVsdGlwbGUgc29ja2V0cy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQ2NwoKICAqKSBDb25maWd1cmUgY2hhbmdlczogVGVzdExpYiByZXBsYWNlZCBieSBUZXN0Q29tcGlsZSwgd2hpY2ggaGFzCiAgICAgc29tZSBhZGRpdGlvbmFsIGNhcGFiaWxpdHkgKHN1Y2ggYXMgZG9pbmcgYSBzYW5pdHkgY2hlY2sgb2YKICAgICB0aGUgY29tcGlsZXIgYW5kIGZsYWdzIHNlbGVjdGVkKTsgdGhlIHZlcnNpb24gb2YgU29sYXJpcyBpcyBub3cKICAgICBhdmFpbGFibGUgdmlhIHRoZSAjZGVmaW5lIHZhbHVlIG9mIFNPTEFSSVMyOyBJUklYIG4zMmJpdCBsaWJzCiAgICAgbm93IHN1cHBvcnRlZCBhbmQgc2VsZWN0YWJsZSBieSBuZXcgQ29uZmlndXJhdGlvbiBSdWxlOiBJUklYTjMyOwogICAgIFdlIG5vIGxvbmdlciBkZWZhdWx0IHRvIC1PMiBvcHRpbWl6YXRpb24uICBbSmltIEphZ2llbHNraV0KCiAgKikgVXBkYXRlZCBDb25maWd1cmU6IENvbmZpZ3VyYXRpb24gbm93IHVzZXMgQWRkTW9kdWxlIHRvIHNwZWNpZnkKICAgICBtb2R1bGUgc291cmNlIG9yIGJpbmFyeSBmaWxlIGxvY2F0aW9uLCByZWxhdGl2ZSB0byBzcmMgZGlyZWN0b3J5LgogICAgIE1vZHVsZXMgY2FuIGJlIGRyb3BwZWQgaW50byBtb2R1bGVzL2V4dHJhLCBvciBpbiB0aGVpciBvd24gCiAgICAgZGlyZWN0b3J5LCBhbmQgbW9kdWxlcyBjYW4gY29tZSB3aXRoIGEgTWFrZWZpbGUgb3IgQ29uZmlndXJlIGNhbiAKICAgICBjcmVhdGUgb25lLiAgTW9kdWxlcyBjYW4gYWRkIGNvbXBpbGVyIG9yIGxpYnJhcnkgaW5mb3JtYXRpb24gdG8gCiAgICAgZ2VuZXJhdGVkIE1ha2VmaWxlcy4gW1BhdWwgU3V0dG9uXQoKICAqKSBTb3VyY2UgY29yZSByZS1vcmdhbmlzYXRpb246IGRpc3RyaWJ1dGVkIG1vZHVsZXMgYXJlIG5vdyBpbiAKICAgICBtb2R1bGVzL3N0YW5kYXJkLiBBbGwgb3RoZXIgc291cmNlIGNvZGUgaXMgaW4gbWFpbi4gT1Mtc3BlY2lmaWMKICAgICBjb2RlIGlzIGluIG9zL3t1bml4LGVteCx3aW4zMn0gZGlyZWN0b3JpZXMuIFtQYXVsIFN1dHRvbl0KCiAgKikgbW9kX2Jyb3dzZXIgaGFzIGJlZW4gcmVtb3ZlZCwgc2luY2UgaXQncyByZXBsYWNlZCBieSBtb2Rfc2V0ZW52aWYuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXggYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCiAgICAgaGFwcGlseSBza2lwIHBhc3QgYWNjZXNzIGNoZWNrcyBvbiBzdWJkaXJlY3RvcmllcyBsb29rZWQgdXAgd2l0aAogICAgIHJlbGF0aXZlIHBhdGhzLiAgKEl0J3MgdXNlZCBieSBtb2RfZGlyLCBtb2RfbmVnb3RpYXRpb24sCiAgICAgYW5kIG1vZF9pbmNsdWRlLikgW0RlYW4gR2F1ZGV0XQoKICAqKSBkaXJlY3Rvcnlfd2FsayBvcHRpbWl6YXRpb24gdG8gcmVkdWNlIGFuIE8oTipNKSBsb29wIHRvIE8oTitNKSB3aGVyZQogICAgIE4gaXMgdGhlIG51bWJlciBvZiA8RGlyZWN0b3J5PiBzZWN0aW9ucywgYW5kIE0gaXMgdGhlIG51bWJlciBvZgogICAgIGNvbXBvbmVudHMgaW4gdGhlIGZpbGVuYW1lIG9mIGFuIG9iamVjdC4KCiAgICAgVG8gYWNoaWV2ZSB0aGlzIG9wdGltaXphdGlvbiB0aGUgZm9sbG93aW5nIGNvbmZpZyBjaGFuZ2VzIHdlcmUgbWFkZToKICAgICAgICAtIFdpbGRjYXJkcyAoKiBhbmQgPywgbm90IHRoZSByZWdleCBmb3JtcykgaW4gPERpcmVjdG9yeT5zLAogICAgICAgICAgPEZpbGVzPnMsIGFuZCA8TG9jYXRpb24+cyBub3cgdHJlYXQgYSBzbGFzaCBhcyBhIHNwZWNpYWwKICAgICAgICAgIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlICIvaG9tZS8qL3B1YmxpY19odG1sIiBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICBtYXRjaCAiL2hvbWUvYS9hbmRyZXcvcHVibGljX2h0bWwiLCBub3cgaXQgb25seSBtYXRjaGVzIHRoaW5ncwogICAgICAgICAgbGlrZSAiL2hvbWUvYm9iL3B1YmxpY19odG1sIi4gIFRoaXMgbWltaWNzIC9iaW4vc2ggYmVoYXZpb3VyLgogICAgICAgIC0gSXQncyBwb3NzaWJsZSBub3cgdG8gdXNlIFtdIHdpbGRjYXJkaW5nIGluIDxEaXJlY3Rvcnk+LCA8RmlsZXM+CiAgICAgICAgICBvciA8TG9jYXRpb24+LgogICAgICAgIC0gUmVnZXggPERpcmVjdG9yeT5zIGFyZSBhcHBsaWVkIGFmdGVyIGFsbCBub24tcmVnZXggPERpcmVjdG9yeT5zLgoKICAgIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGEgYnVnIGludHJvZHVjZWQgaW4gMS4zYTEgZGlyZWN0b3J5X3dhbGsgcmVnYXJkaW5nIC5odGFjY2VzcyBmaWxlcwogICAgIGFuZCBjb3JydXB0ZWQgcGF0aHMuICBbRGVhbiBHYXVkZXRdCgogICopIEVuaGFuY2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBVUkwgcmV3cml0aW5nIGVuZ2luZSBvZiBtb2RfcmV3cml0ZToKICAgICBGaXJzdCB0aGUgZ3JvdXBlZCBwYXJ0cyBvZiBSZXdyaXRlUnVsZSBwYXR0ZXJuIG1hdGNoZXMgKHBhcmVudGhlc2lzISkgY2FuCiAgICAgYmUgYWNjZXNzZWQgbm93IHZpYSBiYWNrcmVmZXJlbmNlcyAkMS4uJDkgaW4gUmV3cml0ZUNvbmRzIHRlc3QtYWdhaW5zdAogICAgIHN0cmluZ3MgaW4gYWRkaXRpb24gdG8gUmV3cml0ZVJ1bGVzIHN1YnN0IHN0cmluZy4gU2Vjb25kIHRoZSBncm91cGVkCiAgICAgcGFydHMgb2YgUmV3cml0ZUNvbmQgcGF0dGVybiBtYXRjaGVzIChwYXJlbnRoZXNpcyEpIGNhbiBiZSBhY2Nlc3NlZCBub3cKICAgICB2aWEgYmFja3JlZmVyZW5jZXMgJTEuLiU5IGJvdGggaW4gZm9sbG93aW5nIFJld3JpdGVDb25kIHRlc3QtYWdhaW5zdAogICAgIHN0cmluZ3MgYW5kIFJld3JpdGVSdWxlcyBzdWJzdCBzdHJpbmcuIFRoaXMgcHJvdmlkZXMgbWF4aW11bSBmbGV4aWJpbGl0eQogICAgIHRocm91Z2ggdGhlIHVzZSBvZiBiYWNrcmVmZXJlbmNlcy4KICAgICBBZGRpdGlvbmFsbHkgdGhlIHJld3JpdGluZyBlbmdpbmUgd2FzIGNsZWFuZWQgdXAgYnkgcHV0dGluZyBjb21tb24KICAgICBjb2RlIHRvIHRoZSBuZXcgZXhwYW5kX2JhY2tyZWZzX2luYnVmZmVyKCkgZnVuY3Rpb24uIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwogICAgIGEgdmhvc3QsIHB1dCB0aGUgbWFpbiBzZXJ2ZXIncyBmaXJzdCBhbmQgdGhlIHZob3N0J3Mgc2Vjb25kLiAgT3RoZXJ3aXNlCiAgICAgdGhlIHZob3N0IGNhbid0IG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlci4gIFtEZWFuIEdhdWRldF0gUFIjNzE3CgogICopIFRoZSA8RGlyZWN0b3J5PiBjb2RlIHdvdWxkIG1lcmdlIGFuZCByZS1tZXJnZSB0aGUgc2FtZSBzZWN0aW9uIGFmdGVyCiAgICAgYSBtYXRjaCB3YXMgZm91bmQsIHBvc3NpYmx5IGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBzb21lIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBpcC1iYXNlZCB2aG9zdHMgYXJlIHN0b3JlZCBhbmQgcXVlcmllZCB1c2luZyBhIGhhc2hpbmcgZnVuY3Rpb24sIHdoaWNoCiAgICAgaGFzIGJlZW4gc2hvd24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzZXJ2ZXJzIHdpdGggbWFueSBpcC12aG9zdHMuCiAgICAgU29tZSBvdGhlciBjaGFuZ2VzIGhhZCB0byBiZSBtYWRlIHRvIGFjY29tbW9kYXRlIHRoaXM6CiAgICAgICAgLSB0aGUgKiBhZGRyZXNzIGZvciB2aG9zdHMgbm93IGJlaGF2ZXMgbGlrZSBfZGVmYXVsdF8KICAgICAgICAtIHRoZSBtYXRjaGluZyBwcm9jZXNzIG5vdyBpczoKICAgICAgICAgICAgLSBtYXRjaCBhbiBpcC12aG9zdCBkaXJlY3RseSB2aWEgaGFzaCAocG9zc2libHkgbWF0Y2hlcyBtYWluCiAgICAgICAgICAgICAgc2VydmVyKQogICAgICAgICAgICAtIGlmIHRoYXQgZmFpbHMsIGp1c3QgcHJldGVuZCBpdCBtYXRjaGVkIHRoZSBtYWluIHNlcnZlcgogICAgICAgICAgICAtIGlmIHNvIGZhciBvbmx5IHRoZSBtYWluIHNlcnZlciBoYXMgYmVlbiBtYXRjaGVkLCBwZXJmb3JtCiAgICAgICAgICAgICAgbmFtZS1iYXNlZCBsb29rdXBzIChTZXJ2ZXJOYW1lLCBTZXJ2ZXJBbGlhcywgU2VydmVyUGF0aCkKICAgICAgICAgICAgICAqb25seSBvbiBuYW1lLWJhc2VkIHZob3N0cyoKICAgICAgICAgICAgLSBpZiB0aGV5IGZhaWwsIGxvb2sgZm9yIF9kZWZhdWx0XyB2aG9zdHMKICAgICBbRGVhbiBHYXVkZXQsIERhdmUgSGFua2lucyA8ZGhhbmtpbnNAc3VnYXJhdC5uZXQ+XQoKICAqKSBkYm1tYW5hZ2Ugb3ZlcmhhdWw6CiAgICAgLSBtZXJnZSBkYm1tYW5hZ2UgYW5kIGRibW1hbmFnZS5uZXcgZnVuY3Rpb25hbGl0eSwgcmVtb3ZlIGRibW1hbmFnZS5uZXcgCiAgICAgLSB0aWUoKSB0byBBbnlEQk1fRmlsZSB3aGljaCB3aWxsIHVzZSBvbmUgb2YgREJfRmlsZSwgTkRCTV9GaWxlIG9yCiAgICAgICBHREJNX0ZpbGUgKC1sZGIsIC1sbmRibSwgLWxnZGJtKSAodHJ5aW5nIGVhY2ggaW4gdGhhdCBvcmRlcikKICAgICAtIHByb3ZpZGUgYmV0dGVyIHNlZWQgZm9yIHJhbmQKICAgICAtIHByb21wdCBmb3IgcGFzc3dvcmQgYXMgcGVyIGdldHBhc3MoMykgKHR1cm4gb2ZmIGVjaG8sIHJlYWQgZnJvbQogICAgICAgL2Rldi90dHksIGV0Yy4pCiAgICAgLSB1c2UgIm5ld3N0eWxlIiBjcnlwdCBiYXNlZCBvbiAkQ29uZmlne29zbmFtZX0gKCReTykKICAgICAtIHdpbGwgbm90IGFkZCBhIHVzZXIgaWYgYWxyZWFkeSBpbiBkYXRhYmFzZSwgdXNlIG5ldyBgdXBkYXRlJyBjb21tYW5kCiAgICAgICBpbnN0ZWFkCiAgICAgLSBhZGRlZCBgY2hlY2snIGNvbW1hbmQgdG8gY2hlY2sgYSB1c2VycycgcGFzc3dvcmQKICAgICAtIGFkZGVkIGBpbXBvcnQnIGNvbW1hbmQgdG8gY29udmVydCBleGlzdGluZyBwYXNzd29yZCB0ZXh0LWZpbGVzIG9yIAogICAgICAgZGJtIGZpbGVzIGV4cG9ydGVkIHdpdGggYHZpZXcnCiAgICAgLSBtb3JlIGRlc2NyaXB0aXZlIHVzYWdlLCBnZW5lcmFsIGNsZWFudXAsICd1c2Ugc3RyaWN0JyBjbGVhbiwgZXRjLgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFkZGVkIHBzb2NrZXQoKSB3aGljaCBpcyBhIHBvb2wgZm9ybSBvZiBzb2NrZXQoKSwgdmFyaW91cyBwbGFjZXMgd2l0aGluCiAgICAgdGhlIHByb3h5IHdlcmVuJ3QgcHJvcGVybHkgYmxvY2tpbmcgYWxhcm1zIHdoaWxlIHJlZ2lzdGVyaW5nIHRoZSBjbGVhbnVwCiAgICAgZm9yIGl0cyBzb2NrZXRzLiAgYmNsb3NlKCkgbm93IHVzZXMgcGNsb3NlKCkgYW5kIHBjbG9zZXNvY2tldCgpLiAgVGhlcmUKICAgICB3YXMgYSBidWcgd2hlcmUgdGhlIGNsaWVudCBzb2NrZXQgd2FzIGJlaW5nIGNsb3NlKClkIHR3aWNlIGR1ZSBhIHN0aWxsCiAgICAgcmVnaXN0ZXJlZCBjbGVhbnVwLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBIGZldyBjbGVhbnVwcyB3ZXJlIG1hZGUgdG8gcmVkdWNlIHRpbWUoKSwgZ2V0cGlkKCksIGFuZCBzaWduYWwoKSBjYWxscy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEFJWCA+PSA0LjIgcmVxdWlyZXMgLWxtIGR1ZSB0byBsaWJjIGNoYW5nZXMuCiAgICAgW0phc29uIFZlbm5lciA8amFzb25AaWRpb20uY29tPl0gUFIjNjY3CgogICopIEVuYWJsZSBgYD0iIicnIGZvciBSZXdyaXRlQ29uZCBkaXJlY3RpdmVzIHRvIG1hdGNoIGFnYWluc3QKICAgICB0aGUgZW1wdHkgc3RyaW5nLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IGluc3RlYWQgb2YgYGBeJCcnLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBhbiBpbmZpbml0ZSBsb29wIGluIG1vZF9pbWFwIGZvciByZWZlcmVuY2VzIGFib3ZlIHRoZSBzZXJ2ZXIgcm9vdAogICAgIFtEZWFuIEdhdWRldF0gUFIjNzQ4CgogICopIG1vZF9wcm94eSBub3cgaGFzIGEgUmVjZWl2ZUJ1ZmZlclNpemUgZGlyZWN0aXZlLCBzaW1pbGFyIHRvCiAgICAgU2VuZEJ1ZmZlclNpemUsIHNvIHRoYXQgdGhlIFRDUCB3aW5kb3cgY2FuIGJlIHNldCBhcHByb3ByaWF0ZWx5CiAgICAgZm9yIExGTnMuIFtQaGlsbGlwIEEuIFByaW5kZXZpbGxlXQoKICAqKSBtb2RfYnJvd3NlciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBnZW5lcmFsIG1vZF9zZXRlbnZpZgogICAgIChjb3VydGVzeSBvZiBQYXVsIFN1dHRvbikuICBCcm93c2VyTWF0Y2gqIGRpcmVjdGl2ZXMgYXJlIHN0aWxsCiAgICAgYXZhaWxhYmxlLCBidXQgYXJlIG5vdyBqb2luZWQgYnkgU2V0RW52SWYqLCBVblNldEVudklmKiwgYW5kCiAgICAgVW5TZXRFbnZJZlplcm8gZGlyZWN0aXZlcy4gIFtLZW4gQ29hcl0KCiAgKikgIkhvc3RuYW1lTG9va3VwcyBkb3VibGUiIGZvcmNlcyBkb3VibGUtcmV2ZXJzZSBETlMgdG8gc3VjY2VlZCBpbgogICAgIG9yZGVyIGZvciByZW1vdGVfaG9zdCB0byBiZSBzZXQgKGZvciBsb2dnaW5nLCBvciBmb3IgdGhlIGVudiB2YXIKICAgICBSRU1PVEVfSE9TVCkuICBUaGUgb2xkIGRlZmluZSBNQVhJTVVNX0ROUyBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX2FjY2VzcyBvdmVyaGF1bDoKICAgICAtIE5vdyB1bmRlcnN0YW5kcyBuZXR3b3JrL25ldG1hc2sgc3ludGF4IChpLmUuICAxMC4xLjAuMC8yNTUuMjU1LjAuMCkKICAgICAgIGFuZCBjaWRyIHN5bnRheCAoaS5lLiAxMC4xLjAuMC8xNikuICBQUiM3NjIKICAgICAtIENyaXRpY2FsIHBhdGggd2FzIHNwZWQgdXAgYnkgcHJlLWNvbXB1dGluZyBhIGZldyB0aGluZ3MgYXQgY29uZmlnIHRpbWUuCiAgICAgLSBUaGUgdW5kb2N1bWVudGVkIHN5bnRheCAiYWxsb3cgdXNlci1hZ2VudHMiIHdhcyByZW1vdmVkLAogICAgICAgdGhlIHJlcGxhY2VtZW50IGlzICJhbGxvdyBmcm9tIGVudj1mb29iYXIiIGNvbWJpbmVkIHdpdGggbW9kX2Jyb3dzZXIuCiAgICAgLSBXaGVuIHVzZWQgd2l0aCBob3N0bmFtZXMgaXQgbm93IGZvcmNlcyBhIGRvdWJsZS1yZXZlcnNlIGxvb2t1cAogICAgICAgbm8gbWF0dGVyIHdoYXQgdGhlIGRpcmVjdG9yeSBzZXR0aW5ncyBhcmUuICBUaGlzIGRvdWJsZS1yZXZlcnNlCiAgICAgICBkb2Vzbid0IGFmZmVjdCBhbnkgb2YgdGhlIG90aGVyIHJvdXRpbmVzIHRoYXQgdXNlIHRoZSByZW1vdGUKICAgICAgIGhvc3RuYW1lLiAgSW4gcGFydGljdWxhciBpdCdzIHN0aWxsIHBhc3NlZCB0byBDR0lzIGFuZCB0aGUgbG9nCiAgICAgICB3aXRob3V0IHRoZSBkb3VibGUtcmV2ZXJzZSBjaGVjay4gIFJlbGF0ZWQgUFIjODYwLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgV2hlbiBhIGxhcmdlIGJ3cml0ZSgpIG9jY3VycyAobGFyZ2VyIHRoYW4gdGhlIGludGVybmFsIGJ1ZmZlciBzaXplKSwKICAgICB3aGlsZSB0aGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyLCBhcGFjaGUgd2lsbCBjb21iaW5lCiAgICAgdGhlIGxhcmdlIHdyaXRlIGFuZCB0aGUgYnVmZmVyIGludG8gYSBzaW5nbGUgd3JpdGV2KCkuICAoVGhpcyBpcwogICAgIGluIGFudGljaXBhdGlvbiBvZiB1c2luZyBtbWFwKCkgZm9yIHJlYWRpbmcgZmlsZXMuKQogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgSW4gb2JzY3VyZSBjYXNlcyB3aGVyZSBhIHBhcnRpYWwgc29ja2V0IHdyaXRlIG9jY3VycmVkIHdoaWxlIGNodW5raW5nLAogICAgIEFwYWNoZSB3b3VsZCBvbWl0IHRoZSBjaHVuayBoZWFkZXIvZm9vdGVyIG9uIHRoZSBuZXh0IGJsb2NrLiAgQ2xlYW5lZAogICAgIHVwIG90aGVyIGJ1Z3MvaW5jb25zaXN0ZW5jaWVzIGluIGVycm9yIGNvbmRpdGlvbnMgaW4gYnVmZi5jLiAgRml4ZWQKICAgICBhIGJ1ZyB3aGVyZSBhIGxvbmcgcGF1c2UgaW4gRE5TIGxvb2t1cHMgY291bGQgY2F1c2UgdGhlIGxhc3QgcGFja2V0CiAgICAgb2YgYSByZXNwb25zZSB0byBiZSB1bmR1bHkgZGVsYXllZC4gIFtSb3kgRmllbGRpbmcsIERlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IEFkZGVkIGNoaWxkX2V4aXQgZnVuY3Rpb24gdG8gbW9kdWxlIHN0cnVjdHVyZS4gIFRoaXMgaXMgY2FsbGVkCiAgICAgb25jZSBwZXIgImhlYXZ5LXdlaWdodCBwcm9jZXNzIiBqdXN0IGJlZm9yZSBhIHNlcnZlciBjaGlsZCBleGl0KCkncyAKICAgICBlLmcuIHdoZW4gbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCBpcyByZWFjaGVkLCBldGMuCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIGNsZWFudXAgc2hvd2VkIHRoYXQgaGFuZGxlX2Vsc2Ugd2FzIGJlaW5nIHVzZWQgdG8gaGFuZGxlCiAgICAgZW5kaWYuICBJdCBkaWRuJ3QgY2F1c2UgcHJvYmxlbXMsIGJ1dCBpdCB3YXMgY2xlYW5lZCB1cCB0b28uCiAgICAgW0hvd2FyZCBGZWFyXQoKICAqKSBtb2RfY2Vybl9tZXRhIHdvdWxkIGF0dGVtcHQgdG8gZmluZCBtZXRhIGZpbGVzIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZgogICAgIGluIHNvbWUgY2FzZXMsIGJ1dCBub3QgaW4gb3RoZXJzLiAgSXQgbm93IGF2b2lkcyBpdCBpbiBhbGwgY2FzZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfbWltZV9tYWdpYyB3b3VsZCBjb3JlIGR1bXAgaWYgdGhlcmUgd2FzIGEgZGVjb21wcmVzc2lvbiBlcnJvci4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQG1jaC5zbmkuZGU+XSBQUiM5MDQKCiAgKikgUE9SVDogc29tZSB2YXJpYW50cyBvZiBER1VYIHJlcXVpcmUgLWxzb2NrZXQgLWxuc2wKICAgICBbQWxleGFuZGVyIEwgSm9uZXMgPGFsZXhAc3lzdGVtcy1vcHRpb25zLmNvLnVrPl0gUFIjNzMyCgogICopIG1vZF9hdXRvaW5kZXggbm93IGFsbG93cyBzb3J0aW5nIG9mIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZ3MKICAgICBieSB0aGUgdmFyaW91cyBmaWVsZHMgKG5hbWUsIHNpemUsIGV0IGNldGVyYSksIGVpdGhlciBpbiBhc2NlbmRpbmcKICAgICBvciBkZXNjZW5kaW5nIG9yZGVyLiAgSnVzdCBjbGljayBvbiB0aGUgY29sdW1uIGhlYWRlci4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogVmFyaW91cyB0d2Vha3MgdG8gZWxpbWluYXRlIHBvaW50ZXItaW50IGNhc3Rpbmcgd2FybmluZ3Mgb24gNjQtYml0CiAgICAgQ1BVcyBsaWtlIHRoZSBBbHBoYS4gIEFwYWNoZSBzdGlsbCBzdG9yZXMgaW50cyBpbiBwb2ludGVycywgYnV0IHRoYXQncwogICAgIHRoZSByZWxhdGl2ZWx5IHNhZmUgZGlyZWN0aW9uLiAgW0RlYW4gR2F1ZGV0XSBQUiMzNDQKCiAgKikgUE9SVDogUU5YIG1tYXAoKSBzdXBwb3J0IGZvciBmYXN0ZXIvbW9yZSByZWxpYWJsZSBzY29yZWJvYXJkIGhhbmRsaW5nLgogICAgIFtJZ29yIE4gS292YWxlbmtvIDxpbmZvaEBtYWlsLndwbHVzLm5ldD5dIFBSIzY4MwoKICAqKSBjaGlsZF9tYWluIGF2b2lkcyBhbiB1bm5lZWRlZCBjYWxsIHRvIHNlbGVjdCgpIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKICAgICBsaXN0ZW5pbmcgc29ja2V0LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgc2VydmVyIGlzIHN0YXJ2ZWQgZm9yIGlkbGUgc2VydmVycyBpdCB3aWxsCiAgICAgc3Bhd24gMSwgdGhlbiAyLCB0aGVuIDQsIC4uLiwgdGhlbiAzMiBzZXJ2ZXJzIGVhY2ggc2Vjb25kLAogICAgIGRvdWJsaW5nIGVhY2ggc2Vjb25kLiAgSXQnbGwgYWxzbyBnaXZlIGEgd2FybmluZyBpbiB0aGUgZXJyb3Jsb2cKICAgICBzaW5jZSB0aGUgbW9zdCBjb21tb24gcmVhc29uIGZvciB0aGlzIGlzIGEgcG9vciBTdGFydFNlcnZlcnMKICAgICBzZXR0aW5nLiAgVGhlIGRlZmluZSBNQVhfU1BBV05fUkFURSBjYW4gYmUgdXNlZCB0byByYWlzZS9sb3dlcgogICAgIHRoZSBtYXhpbXVtLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBcGFjaGUgbm93IHByb3ZpZGVzIGFuIGVmZmVjdGl2ZWx5IHVuYnVmZmVyZWQgY29ubmVjdGlvbiBmb3IKICAgICBDR0kgc2NyaXB0cy4gIFRoaXMgbWVhbnMgdGhhdCBkYXRhIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50CiAgICAgYXMgc29vbiBhcyB0aGUgQ0dJIHBhdXNlcyBvciBzdG9wcyBvdXRwdXQ7IHByZXZpb3VzbHksIEFwYWNoZSB3b3VsZAogICAgIGJ1ZmZlciB0aGUgb3V0cHV0IHVwIHRvIGEgZml4ZWQgYnVmZmVyIHNpemUgYmVmb3JlIHNlbmRpbmcsIHdoaWNoCiAgICAgY291bGQgcmVzdWx0IGluIHRoZSB1c2VyIHZpZXdpbmcgYW4gZW1wdHkgcGFnZSB1bnRpbCB0aGUgQ0dJIGZpbmlzaGVkCiAgICAgb3Igb3V0cHV0IGEgY29tcGxldGUgYnVmZmVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB1c2UgYW4KICAgICAibnBoLSIgQ0dJIHRvIGdldCB1bmJ1ZmZlcmVkIG91dHB1dC4gIEdpdmVuIHRoYXQgbW9zdCBDR0lzIGFyZSB3cml0dGVuCiAgICAgaW4gYSBsYW5ndWFnZSB0aGF0IGJ5IGRlZmF1bHQgZG9lcyBidWZmZXJpbmcgKGUuZy4gcGVybCkgdGhpcwogICAgIHNob3VsZG4ndCBoYXZlIGEgZGV0cmltZW50YWwgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLgoKICAgICAibnBoLSIgQ0dJcywgd2hpY2ggZm9ybWVybHkgcHJvdmlkZWQgYSBkaXJlY3Qgc29ja2V0IHRvIHRoZSBjbGllbnQKICAgICB3aXRob3V0IGFueSBzZXJ2ZXIgcG9zdC1wcm9jZXNzaW5nLCB3ZXJlIG5vdCBmdWxseSBjb21wYXRpYmxlIHdpdGgKICAgICBIVFRQLzEuMSBvciBTU0wgc3VwcG9ydC4gIEFzIHN1Y2ggdGhleSB3b3VsZCBoYXZlIGhhZCB0byBpbXBsZW1lbnQKICAgICB0aGUgdHJhbnNwb3J0IGRldGFpbHMsIHN1Y2ggYXMgZW5jcnlwdGlvbiBvciBjaHVua2luZywgaW4gb3JkZXIKICAgICB0byB3b3JrIHByb3Blcmx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucy4gIE5vdywgdGhlIG9ubHkgZGlmZmVyZW5jZQogICAgIGJldHdlZW4gbnBoIGFuZCBub24tbnBoIHNjcmlwdHMgaXMgIm5vbi1wYXJzZWQgaGVhZGVycyIuCiAgICAgW0RlYW4gR2F1ZGV0LCBTYW1lZXIgUGFyZWtoLCBSb3kgRmllbGRpbmddCgogICopIElmIGEgQlVGRiBpcyBzd2l0Y2hlZCBmcm9tIGJ1ZmZlcmVkIHRvIHVuYnVmZmVyZWQgcmVhZGluZyB0aGUgZmlyc3QKICAgICBicmVhZCgpIHdpbGwgcmV0dXJuIHdoYXRldmVyIHJlbWFpbmVkIGluIHRoZSBidWZmZXIgcHJpb3IgdG8gdGhlCiAgICAgc3dpdGNoLiBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2ExCgogICopIEFkZGVkIGFub3RoZXIgQ29uZmlndXJlIGhlbHBlciBzY3JpcHQ6IFRlc3RMaWIuIEl0IGRldGVybWluZXMKICAgICBpZiBhIHNwZWNpZmllZCBsaWJyYXJ5IGV4aXN0cy4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQT1JUOiBBbGxvdyBmb3IgdXNlIG9mIG4zMmJpdCBsaWJyYXJpZXMgdW5kZXIgSVJJWCA2LngKICAgICBbZGVyaXZlZCBmcm9tIHBhdGNoIGZyb20gSmVmZiBIYXllcyA8amhheWVzQGF3LnNnaS5jb20+XQogICAgIFBSIzcyMQoKICAqKSBQT1JUOiBTb21lIGFyY2hpdGVjdHVyZXMgdXNlIHNpemVfdCBmb3IgdmFyaW91cyBsZW5ndGhzIGluIG5ldHdvcmsKICAgICBmdW5jdGlvbnMgc3VjaCBhcyBhY2NlcHQoKSwgYW5kIGdldHNvY2tuYW1lKCkuICBUaGUgZGVmaW5pdGlvbgogICAgIE5FVF9TSVpFX1QgaXMgdXNlZCB0byBjb250cm9sIHRoaXMuIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogTGludXg6IEF0dGVtcHQgdG8gZGV0ZWN0IGdsaWJjIGJhc2VkIHN5c3RlbXMgYW5kIGluY2x1ZGUgY3J5cHQuaAogICAgIGFuZCAtbGNyeXB0LiAgVGVzdCBmb3IgdmFyaW91cyBkYiBsaWJyYXJpZXMgKGRibSwgbmRibSwgZGIpIHdoZW4KICAgICBtb2RfYXV0aF9kYm0gb3IgbW9kX2F1dGhfZGIgYXJlIGluY2x1ZGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBRTlggZG9lc24ndCBoYXZlIGluaXRncm91cHMoKSB3aGljaCBzdXBwb3J0L3N1ZXhlYy5jIHVzZXMuCiAgICAgW0lnb3IgTiBLb3ZhbGVua28gPGluZm9oQG1haWwud3BsdXMubmV0Pl0KCiAgKikgImZvcmNlLXJlc3BvbnNlLTEuMCIgbm93IG9ubHkgYXBwbGllcyB0byByZXF1ZXN0cyB3aGljaCBhcmUgSFRUUC8xLjAgdG8KICAgICBiZWdpbiB3aXRoLiAgIm5va2VlcGFsaXZlIiBub3cgd29ya3MgZm9yIEhUVFAvMS4xIGNsaWVudHMuICBBZGRlZAogICAgICJkb3duZ3JhZGUtMS4wIiB3aGljaCBjYXVzZXMgQXBhY2hlIHRvIHByZXRlbmQgaXQgcmVjZWl2ZWQgYSAxLjAuCiAgICAgW0RlYW4gR2F1ZGV0XSByZWxhdGVkIFBSIzg3NQoKICAqKSBBUEk6IENvcnJlY3QgY2hpbGRfaW5pdCgpIHNsb3QgZGVjbGFyYXRpb24gZnJvbSBpbnQgdG8gdm9pZCwgdG8KICAgICBtYXRjaCB0aGUgaW5pdCgpIGRlY2xhcmF0aW9uLiAgVXBkYXRlIG1vZF9leGFtcGxlIHRvIHVzZSB0aGUgbmV3CiAgICAgaG9vay4gIFtLZW4gQ29hcl0KCiAgKikgYWRkZWQgdHJhbnNwb3J0IGhhbmRsZSBzbG90ICh0X2hhbmRsZSkgdG8gdGhlIEJVRkYgc3RydWN0dXJlCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgZ2V0X2NsaWVudF9ibG9jaygpIHJldHVybnMgd3JvbmcgbGVuZ3RoIGlmIHBvbGljeSBpcwogICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LLgogICAgIFtLZW5pY2hpIEhvcmkgPGtlbkBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODE1CgogICopIFN1cHBvcnQgdGhlIGltYWdlIG1hcCBmb3JtYXQgb2YgRnJvbnRQYWdlLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgcmVjdCAvdXJsLmhybSAxMCAyMCAzMCA0MAogICAgIFsiQ2hyaXMgTydCeXJuZSIgPG9ieXJuZUBpb2wuaWU+XSBQUiM4MDcKCiAgKikgUE9SVDogLWxyZXNvbHYgYW5kIC1sc29ja3Mgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIgZm9yIFNvbGFyaXMuCiAgICAgWyJEYXJyZW4gTydTaGF1Z2huZXNzeSIgPGRhcnJlbkBhYWlpLm96LmF1Pl0gUFIjODQ2CgogICopIEFkZE1vZHVsZUluZm8gZGlyZWN0aXZlIGZvciBtb2RfaW5mbyB3aGljaCBhbGxvd3MgeW91IHRvIGFubm90YXRlCiAgICAgdGhlIG91dHB1dCBvZiBtb2RfaW5mby4gIFsiTG91IEQuIExhbmdob2x0eiIgPGxkbEB1c2kudXRhaC5lZHU+XQoKICAqKSBBZGRlZCBOb1Byb3h5IGRpcmVjdGl2ZSB0byBhdm9pZCB1c2luZyBQcm94eVJlbW90ZSBmb3Igc2VsZWN0ZWQKICAgICBhZGRyZXNzZXMuICBBZGRlZCBQcm94eURvbWFpbiBkaXJlY3RpdmUgdG8gY2F1c2UgdW5xdWFsaWZpZWQKICAgICBuYW1lcyB0byBiZSBxdWFsaWZpZWQgYnkgcmVkaXJlY3Rpb24uCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBtY2guc25pLmRlPl0KCiAgKikgU3VwcG9ydCBQcm94eSBBdXRoZW50aWNhdGlvbiwgYW5kIGRvbid0IHBhc3MgdGhlIFByb3h5LUF1dGhvcml6ZQogICAgIGhlYWRlciB0byB0aGUgcmVtb3RlIGhvc3QgaW4gdGhlIHByb3h5LiBbU2FtZWVyIFBhcmVraCBhbmQKICAgICBXYWxsYWNlXQoKICAqKSBVcGdyYWRlZCBtb2RfcmV3cml0ZSBmcm9tIDMuMC42KyB0byBsYXRlc3Qgb2ZmaWNpYWxseSBhdmFpbGFibGUgdmVyc2lvbgogICAgIDMuMC45LiBUaGlzIHVwZ3JhZGUgaW5jbHVkZXM6IGZpeGVkIGRlYWRsb29waW5nIG9uIHJld3JpdGluZyB0byBzYW1lCiAgICAgVVJMcywgZml4ZWQgcmV3cml0ZWxvZygpLCBmaXhlZCBmb3JjZWQgcmVzcG9uc2UgY29kZSBoYW5kbGluZyBvbgogICAgIHJlZGlyZWN0cyBmcm9tIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMsIGRpc2FibGVkIHBpcGUgbG9ja2luZyB1bmRlcgogICAgIGJyYWluZGVhZCBTdW5PUyA0LjEueCwgYWxsb3cgZW52IHZhcmlhYmxlcyB0byBiZSBzZXQgZXZlbiBvbiBydWxlcyB3aXRoCiAgICAgbm8gc3Vic3RpdHV0aW9uLCBidWdmaXhlZCBzaXR1YXRpb25zIHdoZXJlIEhvc3RuYW1lTG9va3VwcyBpcyBvZmYsIG1hZGUKICAgICBtb2RfcmV3cml0ZSBtb3JlIHRocmVhZC1zYWZlIGZvciBOVCBwb3J0IGFuZCBmaXhlZCBwcm9ibGVtIHdoZW4gY3JlYXRpbmcKICAgICBhbiBlbXB0eSBxdWVyeSBzdHJpbmcgdmlhICJ4eHg/Ii4KICAgICAgICAgVGhpcyB1cGRhdGUgYWxzbyByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb2YgUmFsZiBTLiBFbmdlbHNjaGFsbCwKICAgICBpLmUuIG5vdyBtb2RfcmV3cml0ZSBubyBsb25nZXIgaGFzIGEgc2hhcmVkIGNvcHlyaWdodC4gSW5zdGVhZCBpcyBpcwogICAgIGV4Y2x1c2l2ZWx5IGNvcHlyaWdodGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgbm93LiBUaGlzIGhhcHBlbmVkIGJlY2F1c2UKICAgICB0aGUgYXV0aG9yIG5vdyBoYXMgZ2lmdGVkIG1vZF9yZXdyaXRlIGV4Y2x1c2l2ZWx5IHRvIHRoZSBBcGFjaGUgR3JvdXAgYW5kIAogICAgIG5vIGxvbmdlciBtYWludGFpbnMgYW4gZXh0ZXJuYWwgdmVyc2lvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBJOiBBZGRlZCBjaGlsZF9pbml0IGZ1bmN0aW9uIHRvIG1vZHVsZSBzdHJ1Y3R1cmUuICBUaGlzIGlzIGNhbGxlZAogICAgIG9uY2UgcGVyICJoZWF2eS13ZWlnaHQgcHJvY2VzcyIgYmVmb3JlIGFueSByZXF1ZXN0cyBhcmUgaGFuZGxlZC4KICAgICBTZWUgaHR0cF9jb25maWcuaCBmb3IgbW9yZSBkZXRhaWxzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBbm9ueW1vdXNfTG9nRW1haWwgd2FzIGxvZ2dpbmcgb24gZWFjaCBzdWJyZXF1ZXN0LgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDIxLCA4NjgKCiAgKikgQVBJOiBBZGRlZCBpc19pbml0aWFsX3JlcSgpIHdoaWNoIHRlc3RzIGlmIHRoZSByZXF1ZXN0IGJlaW5nCiAgICAgcHJvY2Vzc2VkIGlzIHRoZSBpbml0aWFsIHJlcXVlc3QsIG9yIGEgc3VicmVxdWVzdC4KICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBFeHRlbmRlZCBTU0kgKG1vZF9pbmNsdWRlKSBub3cgaGFuZGxlcyBhZGRpdGlvbmFsIHJlbG9wcyBmb3IKICAgICBzdHJpbmcgY29tcGFyaXNvbnMgKDwsID4sIDw9LCBhbmQgPj0pLiAgW0JydW5vIFdvbGZmIElJSV0gUFIjNDEKCiAgKikgQ29uZmlndXJlIGZpeGVkIHRvIGNvcnJlY3RseSBwcm9wYWdhdGUgdXNlci1zZWxlY3RlZCBvcHRpb25zIGFuZAogICAgIHNldHRpbmdzIChzdWNoIGFzIENDIGFuZCBPUFRJTSkgdG8gTWFrZWZpbGVzIG90aGVyIHRoYW4KICAgICBzcmMvTWFrZWZpbGUgKG5vdGFibHkgc3VwcG9ydC9NYWtlZmlsZSkuICBbS2VuIENvYXJdIFBSIzY2NiwgIzgzNAoKICAqKSBJbmRleE9wdGlvbnMgU3VwcHJlc3NIVE1MUHJlYW1ibGUgbm93IGNhdXNlcyB0aGUgYWN0dWFsIEhUTUwgb2YKICAgICBkaXJlY3RvcnkgaW5kaWNlcyB0byBzdGFydCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgSGVhZGVyTmFtZSBmaWxlCiAgICAgaWYgdGhlcmUgaXMgb25lLiAgSWYgdGhlcmUgaXNuJ3Qgb25lLCB0aGUgYmVoYXZpb3VyIGlzIHVuY2hhbmdlZC4KICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZywgQW5kcmV5IEEuIENoZXJub3ZdCgogICopIFdJTjMyOiBNb2R1bGVzIGNhbiBub3cgYmUgZHluYW1pY2FsbHkgbG9hZGVkIERMTHMgdXNpbmcgdGhlCiAgICAgTG9hZE1vZHVsZS9Mb2FkRmlsZSBkaXJlY3RpdmVzLiBOb3RlIHRoYXQgbW9kdWxlIERMTHMgbXVzdCBiZQogICAgIGNvbXBpbGVkIHdpdGggdGhlIG11bHRpdGhyZWFkZWQgRExMIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUgbGlicmFyeS4KICAgICBbQWxleGVpIEtvc3V0IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBdXRvbWF0aWMgaW5kZXhpbmcgcmVtb3ZlZCBmcm9tIG1vZF9kaXIgYW5kIHBsYWNlZCBpbnRvIG1vZF9hdXRvaW5kZXguCiAgICAgVGhpcyBhbGxvd3MgdGhlIGFkbWluIHRvIGNvbXBsZXRlbHkgcmVtb3ZlIGF1dG9tYXRpYyBpbmRleGluZwogICAgIGZyb20gdGhlIHNlcnZlciwgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyB0aGUgYmFzaWMgZnVuY3Rpb25zIG9mCiAgICAgdHJhaWxpbmctc2xhc2ggcmVkaXJlY3RzIGFuZCBEaXJlY3RvcnlJbmRleCBmaWxlcy4gIE5vdGUgdGhhdCBpZgogICAgIHlvdSdyZSBjYXJyeWluZyBvdmVyIGFuIG9sZCBDb25maWd1cmF0aW9uIGZpbGUgYW5kIHlvdSB1c2UgZGlyZWN0b3J5CiAgICAgaW5kZXhpbmcgdGhlbiB5b3UnbGwgd2FudCB0byBhZGQ6CgogICAgIE1vZHVsZSBhdXRvaW5kZXhfbW9kdWxlICAgIG1vZF9hdXRvaW5kZXgubwoKICAgICBiZWZvcmUgbW9kX2RpciBpbiB5b3VyIENvbmZpZ3VyYXRpb24uICBbRGVhbiBHYXVkZXRdCgogICopIHBvcGVuZGlyL3BjbG9zZWRpciBjcmVhdGVkIHRvIHByb3Blcmx5IHByb3RlY3QgZGlyZWN0b3J5IHNjYW5uaW5nLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNTI1CgogICopIEFsaWFzTWF0Y2gsIFNjcmlwdEFsaWFzTWF0Y2ggYW5kIFJlZGlyZWN0TWF0Y2ggZGlyZWN0aXZlcyBhZGRlZCwKICAgICBnaXZpbmcgcmVnZXggc3VwcG9ydCB0byBtb2RfYWxpYXMuIDxEaXJlY3RvcnlNYXRjaD4sIDxMb2NhdGlvbk1hdGNoPgogICAgIGFuZCA8RmlsZXNNYXRjaD4gc2VjdGlvbnMgYWRkZWQgdG8gc3VjY2VlZCA8RGlyZWN0b3J5TWF0Y2ggfj4sIGV0Yy4uLgogICAgIFtBbGV4ZWkgS29zdXRdCgogICopIFRoZSBBY2Nlc3NGaWxlTmFtZSBkaXJlY3RpdmUgY2FuIG5vdyB0YWtlIG1vcmUgdGhhbiBvbmUgZmlsZW5hbWUuCiAgICAgWyJMb3UgRC4gTGFuZ2hvbHR6IiA8bGRsQHVzaS51dGFoLmVkdT5dCgogICopIFRoZSBuZXcgbW9kX21pbWVfbWFnaWMgY2FuIGJlIHVzZWQgdG8gIm1hZ2ljYWxseSIgZGV0ZXJtaW5lIHRoZSB0eXBlCiAgICAgb2YgYSBmaWxlIGlmIHRoZSBleHRlbnNpb24gaXMgdW5rbm93bi4gIEJhc2VkIG9uIHRoZSB1bml4IGZpbGUoMSkKICAgICBjb21tYW5kLiAgW0lhbiBLbHVmdCA8aWtsdWZ0QGNpc2NvLmNvbT5dCgogICopIFdlIG5vdyBkZXRlcm1pbmUgYW5kIGRpc3BsYXkgdGhlIHRpbWUgc3BlbnQgcHJvY2Vzc2luZyBhCiAgICAgcmVxdWVzdCBpZiBkZXNpcmVkLiAgW0ppbSBKYWdpZWxza2ldCgogICopIG1vZF9zdGF0dXM6IFBJRCBmaWVsZCBvZiAiZGVhZCIgY2hpbGQgc2xvdHMgbm8gbG9uZ2VyIGRpc3BsYXlzCiAgICAgbWFpbiBodHRwZCBwcm9jZXNzJ3MgUElELiAgW0ppbSBKYWdpZWxza2ldCgogICopIE1ha2VmaWxlLm50IGFkZGVkIC0gdG8gYnVpbGQgYWxsIHRoZSBiaXRzIGZyb20gdGhlIGNvbW1hbmQgbGluZToKICAgICAgICBubWFrZSAtZiBNYWtlZmlsZS5udAogICAgICAgICBEb2Vzbid0IHlldCB3b3JrIHByb3Blcmx5LiBbQmVuIExhdXJpZV0KCiAgKikgRGVmYXVsdCB0ZXh0IG9mIDQwNCBlcnJvciBpcyBub3cgIk5vdCBGb3VuZCIgcmF0aGVyIHRoYW4gdGhlCiAgICAgcG90ZW50aWFsbHkgbWlzbGVhZGluZyAiRmlsZSBOb3QgRm91bmQiLiAgW0tlbiBDb2FyXQoKICAqKSBDT05GSUc6ICJIb3N0bmFtZUxvb2t1cHMiIG5vdyBkZWZhdWx0cyB0byBvZmYgYmVjYXVzZSBpdCBpcyBmYXIgYmV0dGVyCiAgICAgZm9yIHRoZSBuZXQgaWYgd2UgcmVxdWlyZSBwZW9wbGUgdGhhdCBhY3R1YWxseSBuZWVkIHRoaXMgZGF0YSB0bwogICAgIGVuYWJsZSBpdC4gIFtMaW51cyBUb3J2YWxkc10KCiAgKikgZGlyZWN0b3J5X3dhbGsoKSBpcyBhbiBleHBlbnNpdmUgZnVuY3Rpb24sIGtlZXAgYSBsaXR0bGUgbW9yZSBzdGF0ZSB0bwogICAgIGF2b2lkIG5lZWRsZXNzIHN0cmluZyBjb3VudGluZy4gIEFkZCB0d28gbmV3IGZ1bmN0aW9ucyBtYWtlX2RpcnN0cl9wYXJlbnQKICAgICBhbmQgbWFrZV9kaXJzdHJfcHJlZml4IHdoaWNoIHJlcGxhY2UgYWxsIGV4aXN0aW5nIHVzZXMgb2YgbWFrZV9kaXJzdHIuCiAgICAgVGhlIG5ldyBmdW5jdGlvbnMgYXJlIGEgbGl0dGxlIGxlc3MgZ2VuZXJhbCB0aGFuIG1ha2VfZGlyc3RyLCBidXQKICAgICB3b3JrIG1vcmUgZWZmaWNpZW50bHkgKGxlc3MgbWVtb3J5LCBsZXNzIHN0cmluZyBjb3VudGluZykuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBFWFRSQV9MRkxBR1Mgd2FzIGNoYW5nZWQgdG8gRVhUUkFfTERGTEFHUyAoYW5kIExGTEFHUyB3YXMgY2hhbmdlZAogICAgIHRvIExERkxBR1MpIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMgd2l0aCBsZXggcnVsZXMgaW4gbWFrZSBmaWxlcy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzM3MgoKICAqKSBydW5fbWV0aG9kIG9wdGltaXplZCB0byBhdm9pZCBuZWVkbGVzcyBzY2FubmluZyBvdmVyIE5VTExzIGluIHRoZQogICAgIG1vZHVsZSBsaXN0LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXZhbXAgb2YgKHVuaXgpIHNjb3JlYm9hcmQgbWFuYWdlbWVudCBjb2RlIHN1Y2ggdGhhdCBpdCBhdm9pZHMKICAgICB1bm5lY2Vzc2FyeSB0cmF2ZXJzYWxzIG9mIHRoZSBzY29yZWJvYXJkIG9uIGVhY2ggaGl0LiAgVGhpcyBpcwogICAgIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIGhpZ2ggdm9sdW1lIHNpdGVzIHdpdGggYSBsYXJnZQogICAgIEhBUkRfU0VSVkVSX0xJTUlULiAgU29tZSBvZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlIE8obl4yKSwKICAgICBhbmQgYXJlIG5vdyBPKG4pLiAgU2VlIGFsc28gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCBpbgogICAgIGh0dHBkLmguIFtEZWFuIEdhdWRldF0KCiAgKikgSW4gY29uZmlndXJhdGlvbnMgdXNpbmcgbXVsdGlwbGUgTGlzdGVuIHN0YXRlbWVudHMgaXQgd2FzIHBvc3NpYmxlIGZvcgogICAgIGJ1c3kgc29ja2V0cyB0byBzdGFydmUgb3RoZXIgc29ja2V0cyBvZiBzZXJ2aWNlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGRlZCBob29rIHNvIHN0YW5kYWxvbmVfbWFpbiBjYW4gYmUgcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lCiAgICAgKGRlZmluZSBTVEFOREFMT05FX01BSU4pCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgTG93ZXN0LWxldmVsIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGluIGJ1ZmYuYyB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKICAgICB0aGUgU0ZJTyBsaWJyYXJ5IGNhbGxzIHNmcmVhZC9zZndyaXRlIGlmIEJfU0ZJTyBpcyBkZWZpbmVkIGF0CiAgICAgY29tcGlsZSB0aW1lLiAgVGhlIGRlZmF1bHQgc2ZpbyBkaXNjaXBsaW5lIHdpbGwgYmVoYXZlIGFzIGFwYWNoZQogICAgIHdvdWxkIHdpdGhvdXQgc2ZpbyBjb21waWxlZCBpbi4KICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBFbmhhbmNlIFVzZXJEaXIgZGlyZWN0aXZlIChtb2RfdXNlcmRpcikgdG8gYWNjZXB0IGEgbGlzdCBvZgogICAgIHVzZXJuYW1lcyBmb3IgdGhlICdkaXNhYmxlJyBrZXl3b3JkLCBhbmQgYWRkICdlbmFibGUgdXNlci4uLicgdG8KICAgICBzZWxlY3RpdmVseSAqZW4qYWJsZSB1c2VyZGlycyBpZiB0aGV5J3JlIGdsb2JhbGx5IGRpc2FibGVkLgogICAgIFtLZW4gQ29hcl0KCiAgKikgSWYgTkVUU0NBUEVfREJNX0NPTVBBVCBpcyBkZWZpbmVkIGluIEVYVFJBX0NGTEFHUyB0aGVuIEFwYWNoZQogICAgIHdpbGwgd29yayB3aXRoIE5ldHNjYXBlIGRibSBmaWxlcy4gIChkYm1tYW5hZ2Ugd2lsbCBwcm9iYWJseSBub3QKICAgICB3b3JrIGhvd2V2ZXIuKSBbQWxleGFuZGVyIFNwb2hyIDxhc3BvaHJAbmV0bWF0aWMuY29tPl0gUFIjNDQ0CgogICopIEFkZCBhIExpc3RlbkJhY2tsb2cgZGlyZWN0aXZlIHRvIGNvbnRyb2wgdGhlIGJhY2tsb2cgcGFyYW1ldGVyCiAgICAgcGFzc2VkIHRvIGxpc3RlbigpLiAgQWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gNTExIGZyb20gNTEyLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgQVBJOiBBIG5ldyBoYW5kbGVyIHJlc3BvbnNlIERPTkUgd2hpY2ggaW5mb3JtcyBhcGFjaGUgdGhhdCB0aGUKICAgICByZXF1ZXN0IGhhcyBiZWVuIGhhbmRsZWQgYW5kIGl0IGNhbiBmaW5pc2ggb2ZmIHF1aWNrbHksIHNpbWlsYXIgdG8KICAgICBob3cgaXQgaGFuZGxlcyBlcnJvcnMuIFtSb2IgSGFydGlsbF0KCiAgKikgVHVybiBvZmYgY2h1bmtlZCBlbmNvZGluZyBhZnRlciBzZW5kaW5nIHRlcm1pbmF0aW5nIGNodW5rL2Zvb3RlcgogICAgIHNvIHRoYXQgd2UgY2FuJ3QgZG8gaXQgdHdpY2UgYnkgYWNjaWRlbnQuIFtSb3kgRmllbGRpbmddCgogICopIG1vZF9leHBpcmUgYWxzbyBpc3N1ZXMgQ2FjaGUtQ29udHJvbDogbWF4LWFnZSBoZWFkZXJzLgogICAgIFtSb2IgSGFydGlsbF0KCiAgKikgQVBJOiBBZGRlZCBraWxsX29ubHlfb25jZSBvcHRpb24gZm9yIGZyZWVfcHJvY19jaGFpbiBzbyB0aGF0IGl0IHdvbid0CiAgICAgYWdncmVzc2l2ZWx5IHRyeSB0byBraWxsIG9mZiBzcGVjaWZpYyBjaGlsZHJlbi4gIEZvciBmYXN0Y2dpLgogICAgIFtTdGFubGV5IEdhbWJhcmluIDxnYW1iYXJpbkBPcGVuTWFya2V0LmNvbT5dCgogICopIG1vZF9hdXRoIGRlYWxzIHdpdGggZXh0cmEgJzonIGRlbGltaXRlZCBmaWVsZHMuICBbTWFyYyBTbGVta29dCgogICopIEFkZGVkIEljb25IZWlnaHQgYW5kIEljb25XaWR0aCB0byBtb2RfZGlyJ3MgSW5kZXhPcHRpb25zIGRpcmVjdGl2ZS4KICAgICBXaGVuIHVzZWQgdG9nZXRoZXIsIHRoZXNlIGNhdXNlIG1vZF9kaXIgdG8gZW1pdCBIRUlHSFQgYW5kIFdJRFRICiAgICAgYXR0cmlidXRlcyBpbiB0aGUgRmFuY3lJbmRleGluZyBJTUcgdGFncy4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogU2VxdWVudCBhbmQgU09OWSBORVdTLU9TIHN1cHBvcnQgYWRkZWQuICBbSmltIEphZ2llbHNraV0KCiAgKikgUE9SVDogQWRkZWQgV2luZG93cyBOVCBzdXBwb3J0CiAgICAgW0JlbiBMYXVyaWUgYW5kIEFtYmFyaXNoIE1hbHBhbmkgPGFtYmFyaXNoQHZhbGljZXJ0LmNvbT5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi42CgogICopIG1vZF9pbmNsdWRlIHdoZW4gdXNpbmcgWEJpdEhhY2sgRnVsbCB3b3VsZCBzZW5kIEVUYWdzIGluIGFkZGl0aW9uIHRvCiAgICAgc2VuZGluZyBMYXN0LU1vZGlmaWVkcy4gIFRoaXMgaXMgaW5jb3JyZWN0IEhUVFAvMS4xIGJlaGF2aW91ci4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzExMzMKCiAgKikgU0VDVVJJVFk6IFdoZW4gYSBjbGllbnQgY29ubmVjdHMgdG8gYSBwYXJ0aWN1bGFyIHBvcnQvYWRkciwgYW5kCiAgICAgZ2l2ZXMgYSBIb3N0OiBoZWFkZXIgZW5zdXJlIHRoYXQgdGhlIHZpcnR1YWwgaG9zdCByZXF1ZXN0ZWQgY2FuCiAgICAgYWN0dWFsbHkgYmUgcmVhY2hlZCB2aWEgdGhhdCBwb3J0L2FkZHIuICBbRWQgS29ydGhvZiA8ZWRAb3JnYW5pYy5jb20+XQoKICAqKSBTdXBwb3J0IHZpcnR1YWwgaG9zdHMgd2l0aCB3aWxkY2FyZCBwb3J0IGFuZC9vciBtdWx0aXBsZSBwb3J0cwogICAgIHByb3Blcmx5LiAgW0VkIEtvcnRob2YgPGVkQG9yZ2FuaWMuY29tPl0KCiAgKikgRml4ZWQgc29tZSBjYXNlLXNlbnNpdGl2aXR5IGlzc3VlcyBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFNldCByLT5hbGxvd2VkIHByb3Blcmx5IGluIG1vZF9hc2lzLmMsIG1vZF9kaXIuYywgbW9kX2luZm8uYywKICAgICBhbmQgbW9kX2luY2x1ZGUuYy4gIFtEZWFuIEdhdWRldF0KCiAgKikgVmFyaWFibGUgJ2N3ZCcgd2FzIGJlaW5nIHVzZWQgcG9pbnRsZXNzbHkgYmVmb3JlIGJlaW5nIHNldC4KICAgICBbS2VuIENvYXJdIFBSIzE3MzgKCiAgKikgU0lHVVJHIGRvZXNuJ3QgZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbTWFyayBBbmRyZXcgSGVpbnJpY2ggPGhlaW5yaWNoQHRpbmRlcmJveC5TdGFuZm9yZC5FRFU+XQoKICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSBQT1NULCBvciBvdGhlciBvcGVyYXRpb24gd2l0aCBhCiAgICAgcmVxdWVzdCBib2R5LCB0aGUgYm9keSBoYXMgdG8gYmUgcmVhZCBmcm9tIHRoZSBuZXQgYmVmb3JlIGFsbG93aW5nCiAgICAgYSBrZWVwYWxpdmUgc2Vzc2lvbiB0byBjb250aW51ZS4gIFtSb3kgRmllbGRpbmddIFBSIzEzOTkKCiAgKikgV2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gZmNudGwoKSBsb2NraW5nIHN1Z2dlc3QgdGhlIHVzZXIgbG9vayB1cAogICAgIHRoZSBkb2NzIGZvciBMb2NrRmlsZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgdGFibGVfc2V0KCkgYW5kIHRhYmxlX3Vuc2V0KCkgZGlkIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoCiAgICAgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUga2V5LiBbU3RlcGhlbiBTY2hlY2sKICAgICA8c3NjaGVja0BpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKCiAgKikgc2VuZF9mZF9sZW5ndGgoKSBkaWQgbm90IGNhbGN1bGF0ZSB0b3RhbF9ieXRlc19zZW50IHByb3Blcmx5IGluIGVycm9yCiAgICAgY2FzZXMuICBbQmVuIFJlc2VyIDxicmVzZXJAcmVnbm93LmNvbT5dIFBSIzEzNjYKCiAgKikgci0+Y29ubmVjdGlvbi0+dXNlciB3YXMgYWxsb2NhdGVkIGluIHRoZSB3cm9uZyBwb29sIGNhdXNpbmcgY29ycnVwdGlvbgogICAgIGluIHNvbWUgY2FzZXMgd2hlbiB1c2VkIHdpdGggbW9kX2Nlcm5fbWV0YS4gIFtEZWFuIEdhdWRldF0gUFIjMTUwMAoKICAqKSBtb2RfcHJveHkgd2FzIHNlbmRpbmcgSFRUUC8xLjEgcmVzcG9uc2VzIHRvIGZ0cCByZXF1ZXN0cyBieSBtaXN0YWtlLgogICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKICAgICBzb3VyY2Ugb2Ygc28gbWFueSBtaXNkaXJlY3RlZCBidWcgcmVwb3J0cy4gIFtSb3kgRmllbGRpbmcsIE1hcmMgU2xlbWtvXQoKICAqKSBNdWx0aXBsZSAiY2xvc2UiIHRva2VucyBtYXkgaGF2ZSBiZWVuIHNldCBpbiB0aGUgIkNvbm5lY3Rpb24iCiAgICAgaGVhZGVyLCBub3QgYW4gZXJyb3IsIGJ1dCBhIHdhc3RlLgogICAgIFtSb25hbGQuVHNjaGFsYWVyQHBzaS5jaF0gUFIjMTY4MwoKICAqKSAiYmFzaWMiIGFuZCAiZGlnZXN0IiBhdXRoIHRva2VucyBzaG91bGQgYmUgdGVzdGVkIGNhc2UtaW5zZW5zaXRpdmUuCiAgICAgW1JvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoXSBQUiMxNTk5LCBQUiMxNjY2CgogICopIEl0IGFwcGVhcnMgdGhlICIyNTd0aCBieXRlIiBidWcgKHNlZQogICAgIGh0ZG9jcy9tYW51YWwvbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCMyNTd0aC1ieXRlKSBjYW4gaGFwcGVuCiAgICAgYXQgdGhlIDI1NnRoIGJ5dGUgYXMgd2VsbC4gIEZpeGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfcmV3cml0ZSB3b3VsZCBub3QgaGFuZGxlICUzZiBwcm9wZXJseSBpbiBzb21lIHNpdHVhdGlvbnMuCiAgICAgW1JhbGYgRW5nZWxzY2hhbGxdCgogICopIEFwYWNoZSBjb3VsZCBnZW5lcmF0ZSBpbXByb3Blcmx5IGNodW5rZWQgSFRUUC8xLjEgcmVzcG9uc2VzIHdoZW4KICAgICB0aGUgYnB1dGMoKSBvciBycHV0YygpIGZ1bmN0aW9ucyB3ZXJlIHVzZWQgYnkgbW9kdWxlcyAoc3VjaCBhcwogICAgIG1vZF9pbmNsdWRlKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgI2lmZGVmIHdyYXAgYSBmZXcgI2RlZmluZXMgaW4gaHR0cGQuaCB0byBtYWtlIGxpZmUgZWFzaWVyIG9uCiAgICAgc29tZSBwb3J0cy4gIFtSYWxmIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggTVBFIGNvbXBpbGF0aW9uIGVycm9yIGluIG1vZF91c2VydHJhY2suYy4gIFtNYXJrIEJpeGJ5XQoKICAqKSBRdW90ZSBDQz0nJChDQyknIHRvIGltcHJvdmUgcmVjdXJzZSBtYWtlIGNhbGxzLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBdm9pZCBCX0VSUk9SIHJlZGVjbGFyYXRpb24gb24gc3lzdnI0IHN5c3RlbXMuICBbTWFydGluIEtyYWVtZXJdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi41CgogICopIFNFQ1VSSVRZOiBGaXggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gbG9ncmVzb2x2ZS4gIFRoaXMgaXMKICAgICBvbmx5IGFuIGlzc3VlIG9uIHN5c3RlbXMgd2l0aG91dCBhIE1BWEROQU1FIGRlZmluZSBvciB3aGVyZSAKICAgICB0aGUgcmVzb2x2ZXIgcmV0dXJucyBkb21haW4gbmFtZXMgbG9uZ2VyIHRoYW4gTUFYRE5BTUUuICBbTWFyYyBTbGVta29dCgogICopIEZpeCBhbiBpbXByb3BlciBsZW5ndGggaW4gYW4gYXBfc25wcmludGYgY2FsbCBpbiBwcm94eV9kYXRlX2Nhbm9uKCkuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBGaXggY29yZSBkdW1wIGluIHRoZSBmdHAgcHJveHkgd2hlbiByZWFkaW5nIGluY29ycmVjdGx5IGZvcm1hdHRlZAogICAgIGRpcmVjdG9yeSBsaXN0aW5ncy4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEZpeCBwb3NzaWJsZSBtaW5vciBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHByb3h5IGNhY2hlLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVsaW1pbmF0ZSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gY2ZnX2dldGxpbmUsIHdoaWNoCiAgICAgaXMgdXNlZCB0byByZWFkIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgc3VjaCBhcyBodGFjY2VzcyBhbmQgCiAgICAgaHRwYXNzd2QgZmlsZXMuICBbTWFyYyBTbGVta29dCgogICopIFNFQ1VSSVRZOiBFbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHJldHVybmVkIGJ5IGh0X3RpbWUgaXMgYWx3YXlzCiAgICAgcHJvcGVybHkgbnVsbCB0ZXJtaW5hdGVkLiAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogR2VuZXJhbCBtb2RfaW5jbHVkZSBjbGVhbnVwLCBpbmNsdWRpbmcgZml4aW5nIHNldmVyYWwKICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzIGFuZCBhIHBvc3NpYmxlIGluZmluaXRlIGxvb3AuICBUaGlzIGNsZWFudXAKICAgICB3YXMgZG9uZSBhZ2FpbnN0IDEuMyBjb2RlIGFuZCB0aGVuIGJhY2twb3J0ZWQgdG8gMS4yLCB0aGUgcmVzdWx0CiAgICAgaXMgYSBsYXJnZSBkaWZmZXJlbmNlIChkdWUgdG8gaW5kZW50YXRpb24gY2xlYW51cCBpbiAxLjMgY29kZSkuCiAgICAgVXNlcnMgaW50ZXJlc3RlZCBpbiBzZWVpbmcgYSBzbWFsbGVyIHNldCBvZiByZWxldmFudCBkaWZmZXJlbmNlcwogICAgIHNob3VsZCBjb25zaWRlciBjb21wYXJpbmcgYWdhaW5zdCBzcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5jbHVkZS5jCiAgICAgZnJvbSB0aGUgMS4zYjMgcmVsZWFzZS4gIE5vbi1pbmRlbnRhdGlvbiBjaGFuZ2VzIHRvIG1vZF9pbmNsdWRlCiAgICAgYmV0d2VlbiAxLjIgYW5kIDEuMyB3ZXJlIG1pbmltYWwuICBbRGVhbiBHYXVkZXQsIE1hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogTnVtZXJvdXMgY2hhbmdlcyB0byBtb2RfaW1hcCBpbiBhIGdlbmVyYWwgY2xlYW51cAogICAgIGluY2x1ZGluZyBmaXhpbmcgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cuICBUaGlzIGNsZWFudXAgYWxzbwogICAgIHdhcyBkb25lIHdpdGggMS4zIGNvZGUgYXMgYSBiYXNpcywgc2VlIHRoZSB0aGUgcHJldmlvdXMgbm90ZQogICAgIGFib3V0IG1vZF9pbmNsdWRlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogSWYgYSBodGFjY2VzcyBmaWxlIGNhbiBub3QgYmUgcmVhZCBkdWUgdG8gYmFkIAogICAgIHBlcm1pc3Npb25zLCBkZW55IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHdpdGggYSBIVFRQX0ZPUkJJRERFTi4gIAogICAgIFRoZSBwcmV2aW91cyBiZWhhdmlvciB3YXMgdG8gaWdub3JlIHRoZSBodGFjY2VzcyBmaWxlIGlmIGl0IGNvdWxkIG5vdAogICAgIGJlIHJlYWQuICBUaGlzIGNoYW5nZSBtYXkgbWFrZSBzb21lIHNldHVwcyB3aXRoIHVucmVhZGFibGUKICAgICBodGFjY2VzcyBmaWxlcyBzdG9wIHdvcmtpbmcuICBQUiM4MTcgIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IG5vMnNsYXNoKCkgd2FzIE8obl4yKSBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4gIAogICAgIE1ha2UgaXQgTyhuKS4gIFRoaXMgaW5lZmZpY2llbmN5IGNvdWxkIGJlIHVzZWQgdG8gbW91bnQgYSBkZW5pYWwgCiAgICAgb2Ygc2VydmljZSBhdHRhY2sgYWdhaW5zdCB0aGUgQXBhY2hlIHNlcnZlci4gIFRoYW5rcyB0byAKICAgICBNaWNoYWwgWmFsZXdza2kgPGxjYW10dWZAYm9zcy5zdGFzemljLndhdy5wbD4gZm9yIHJlcG9ydGluZwogICAgIHRoaXMuICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIHVzZWQgdW5pbml0aWFsaXplZCBkYXRhIGZvciBzb21lIHVzZXMgb2YgJiYgYW5kIHx8LgogICAgIFtCcmlhbiBTbGVzaW5za3kgPGJzbGVzaW5zQHdpcmVkLmNvbT5dIFBSIzExMzkKCiAgKikgbW9kX2ltYXAgc2hvdWxkIGRlY2xpbmUgYWxsIG5vbi1HRVQgbWV0aG9kcy4KICAgICBbSmF5IEJsb29kd29ydGggPGpheUBwYXRod2F5cy5zZGUuc3RhdGUuc2MudXM+XQoKICAqKSBzdWV4ZWMuYyB3b3VsZG4ndCBidWlsZCB3aXRob3V0IC1ETE9HX0VYRUMuIFtKYXNvbiBBLiBEb3VyXQoKICAqKSBtb2RfdXNlcmRpciB3YXMgbW9kaWZ5aW5nIHItPmZpbmZvIGluIGNhc2VzIHdoZXJlIGl0IHdhc24ndCBzZXR0aW5nCiAgICAgci0+ZmlsZW5hbWUuICBTaW5jZSB0aG9zZSB0d28gYXJlIG1lYW50IHRvIGJlIGluIHN5bmMgd2l0aCBlYWNoIG90aGVyCiAgICAgdGhpcyBpcyBhIGJ1Zy4gIFsiUGF1bCBCLiBIZW5zb24iIDxoZW5zb25AaW50cmFuZXQuY3N1cG9tb25hLmVkdT5dCgogICopIG1vZF9pbmNsdWRlIGRpZCBub3QgcHJvcGVybHkgaGFuZGxlIGFsbCBwb3NzaWJsZSByZWRpcmVjdHMgZnJvbSBzdWItCiAgICAgcmVxdWVzdHMuICBbS2VuIENvYXJdCgogICopIEluZXRkIG1vZGUgKHdoaWNoIGlzIGJ1Z2d5KSB1c2VzIHRpbWVvdXRzIHdpdGhvdXQgaGF2aW5nIHNldHVwIHRoZQogICAgIGptcGJ1ZmZlci4gW0RlYW4gR2F1ZGV0XSBQUiMxMDY0CgogICopIFdvcmsgYXJvdW5kIHByb2JsZW0gdW5kZXIgTGludXggd2hlcmUgYSBjaGlsZCB3aWxsIHN0YXJ0IGxvb3BpbmcKICAgICByZXBvcnRpbmcgYSBzZWxlY3QgZXJyb3Igb3ZlciBhbmQgb3Zlci4KICAgICBbUmljayBGcmFuY2h1ayA8cmlja2ZAdHJhbnNwZWN0Lm5ldD5dIFBSIzExMDcKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjQKCiAgKikgVGhlIFByb3h5UmVtb3RlIGNoYW5nZSBpbiAxLjIuMyBpbnRyb2R1Y2VkIGEgYnVnIHJlc3VsdGluZyBpbiB0aGUgcHJveHkKICAgICBhbHdheXMgbWFraW5nIHJlcXVlc3RzIHdpdGggdGhlIGZ1bGwtVVJJIGluc3RlYWQgb2YganVzdCB0aGUgVVJJIHBhdGguCiAgICAgW01hcmMgU2xlbWtvLCBSb3kgRmllbGRpbmddCgogICopIEFkZCAtbG0gZm9yIEFJWCB2ZXJzaW9ucyA+PSA0LjIgdG8gYWxsb3cgQXBhY2hlIHRvIGxpbmsgcHJvcGVybHkKICAgICBvbiB0aGlzIHBsYXRmb3JtLiAgW01hcmMgU2xlbWtvXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuMwoKICAqKSBUaGUgcmVxdWVzdCB0byBhIHJlbW90ZSBwcm94eSB3YXMgbWFuZ2xlZCBpZiBpdCB3YXMgZ2VuZXJhdGVkIGFzIHRoZQogICAgIHJlc3VsdCBvZiBhIFByb3h5UGFzcyBkaXJlY3RpdmUuIFVSTCBzY2hlbWVzIG90aGVyIHRoYW4gaHR0cDovLyB3ZXJlIG5vdAogICAgIHN1cHBvcnRlZCB3aGVuIFByb3h5UmVtb3RlIHdhcyB1c2VkLiBQUiMyNjAsIFBSIzY1NiwgUFIjNjk5LCBQUiM3MTMsCiAgICAgUFIjODEyIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEZpeGVkIHByb3h5LXBhc3MtdGhyb3VnaCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlOyBBZGRlZCBlcnJvciBsb2dnaW5nCiAgICAgaW5mb3JtYXRpb24gZm9yIGNhc2Ugd2hlcmUgcHJveHkgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIFtNYXJjIFNsZW1rb10KCiAgKikgRm9yY2UgcHJveHkgdG8gYWx3YXlzIHJlc3BvbmQgYXMgSFRUUC8xLjAsIHdoaWNoIGl0IHdhcyBmYWlsaW5nIHRvCiAgICAgZG8gZm9yIGVycm9ycyBhbmQgY2FjaGVkIHJlc3BvbnNlcy4gIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IEltcHJvdmVkIHN1cHBvcnQgZm9yIENvbnZleE9TIDExLiAgW0plZmYgVmVudGVyc10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjIgW25vdCByZWxlYXNlZF0KCiAgKikgRml4ZWQgYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCiAgICAgaGFwcGlseSBza2lwIHBhc3QgYWNjZXNzIGNoZWNrcyBvbiBzdWJkaXJlY3RvcmllcyBsb29rZWQgdXAgd2l0aCByZWxhdGl2ZQogICAgIHBhdGhzLiAgKEl0J3MgdXNlZCBieSBtb2RfZGlyLCBtb2RfbmVnb3RpYXRpb24sIGFuZCBtb2RfaW5jbHVkZS4pCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGQgbG9ja2ZpbGUgbmFtZSB0byBlcnJvciBtZXNzYWdlIHByaW50ZWQgb3V0IHdoZW4KICAgICBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgaXMgZGVmaW5lZC4KICAgICBbTWFyYyBTbGVta29dCgogICopIEVuaGFuY2VkIHRoZSBjaHVua2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgaW5zaWRlIHRoZSBidWZmZXIgZnVuY3Rpb25zLgogICAgIFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nXQoKICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwogICAgIGEgdmhvc3QsIHB1dCB0aGUgbWFpbiBzZXJ2ZXIncyBmaXJzdCBhbmQgdGhlIHZob3N0J3Mgc2Vjb25kLiAgT3RoZXJ3aXNlCiAgICAgdGhlIHZob3N0IGNhbid0IG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlci4gIFtEZWFuIEdhdWRldF0gUFIjNzE3CgogICopIFRoZSA8RGlyZWN0b3J5PiBjb2RlIHdvdWxkIG1lcmdlIGFuZCByZS1tZXJnZSB0aGUgc2FtZSBzZWN0aW9uIGFmdGVyCiAgICAgYSBtYXRjaCB3YXMgZm91bmQsIHBvc3NpYmx5IGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBzb21lIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBhbiBpbmZpbml0ZSBsb29wIGluIG1vZF9pbWFwIGZvciByZWZlcmVuY2VzIGFib3ZlIHRoZSBzZXJ2ZXIgcm9vdC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzc0OAoKICAqKSBtb2RfaW5jbHVkZSBjbGVhbnVwIHNob3dlZCB0aGF0IGhhbmRsZV9lbHNlIHdhcyBiZWluZyB1c2VkIHRvIGhhbmRsZQogICAgIGVuZGlmLiAgSXQgZGlkbid0IGNhdXNlIHByb2JsZW1zLCBidXQgaXQgd2FzIGNsZWFuZWQgdXAgdG9vLgogICAgIFtIb3dhcmQgRmVhcl0KCiAgKikgTGFzdCBvZmZpY2lhbCBzeW5jaHJvbml6YXRpb24gb2YgbW9kX3Jld3JpdGUgd2l0aCBhdXRob3IgdmVyc2lvbiAoYmVjYXVzZQogICAgIG1vZF9yZXdyaXRlIGlzIG5vdyBkaXJlY3RseSBkZXZlbG9wZWQgYnkgdGhlIGF1dGhvciBhdCB0aGUgQXBhY2hlIEdyb3VwKToKICAgICBvIGFkZGVkIGRpZmYgYmV0d2VlbiBtb2RfcmV3cml0ZSAzLjAuNisgYW5kIDMuMC45CiAgICAgICBtaW51cyBXSU4zMi9OVCBzdHVmZiwgYnV0IHBsdXMgY29weXJpZ2h0IHJlbW92ZW1lbnQuCiAgICAgICBJbiBkZXRhaWw6CiAgICAgICAtIHdvcmthcm91bmQgZm9yIGRldGVjdGluZyBpbmZpbml0ZSByZXdyaXRpbmcgbG9vcHMKICAgICAgIC0gZml4ZWQgc2V0dGluZyBvZiBlbnYgdmFycyB3aGVuICItIiBpcyB1c2VkIGFzIHN1YnN0IHN0cmluZwogICAgICAgLSBmaXhlZCBmb3JjZWQgcmVzcG9uc2UgY29kZSBvbiByZWRpcmVjdHMgKFBSIzc3NykKICAgICAgIC0gZml4ZWQgY2FzZXMgd2hlcmUgci0+YXJncyBpcyAiIgogICAgICAgLSBrbHVkZ2UgdG8gZGlzYWJsZSBsb2NraW5nIG9uIHBpcGVzIHVuZGVyIGJyYWluZGVhZCBTdW5PUwogICAgICAgLSBmaXggZm9yIHJld3JpdGVsb2cgaW4gY2FzZXMgd2hlcmUgcmVtb3RlIGhvc3RuYW1lIGlzIHVua25vd24KICAgICAgIC0gZml4ZWQgdG90YWxseSBkYW1hZ2VkIHJlcXVlc3RfcmVjIHdhbGstYmFjayBsb29wCiAgICAgbyByZW1vdmUgc3RhdGljIGZyb20gbG9jYWwgZGF0YSBhbmQgYWRkIHN0YXRpYyB0byBnbG9iYWwgb25lcy4KICAgICBvIHJlcGxhY2VkIHVnbHkgcHJveHkgZmluZGluZyBzdHVmZiBieSBzaW1wbGUKICAgICAgIGZpbmRfbGlua2VkX21vZHVsZSgibW9kX3Byb3h5IikgY2FsbC4KICAgICBvIGFkZGVkIG1pc3NpbmcgbmVnYXRpb24gY2hhciBvbiByZXdyaXRlbG9nKCkKICAgICBvIGZpeGVkIGEgZmV3IGNvbW1lbnQgdHlwb3MKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQW5vbnltb3VzX0xvZ0VtYWlsIHdhcyBsb2dnaW5nIG9uIGVhY2ggc3VicmVxdWVzdC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQyMSwgUFIjODY4CgogICopICJmb3JjZS1yZXNwb25zZS0xLjAiIG5vdyBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdHMgd2hpY2ggYXJlIEhUVFAvMS4wIHRvCiAgICAgYmVnaW4gd2l0aC4gICJub2tlZXBhbGl2ZSIgbm93IHdvcmtzIGZvciBIVFRQLzEuMSBjbGllbnRzLiAgQWRkZWQKICAgICAiZG93bmdyYWRlLTEuMCIgd2hpY2ggY2F1c2VzIEFwYWNoZSB0byBwcmV0ZW5kIGl0IHJlY2VpdmVkIGEgMS4wLgogICAgIEFkZGl0aW9uYWxseSBtb2RfYnJvd3NlciBub3cgdHJpZ2dlcnMgZHVyaW5nIHRyYW5zbGF0ZV9uYW1lIHRvIHdvcmthcm91bmQKICAgICBhIGRlZmljaWVuY3kgaW4gdGhlIGhlYWRlcl9wYXJzZSBwaGFzZS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzg3NQoKICAqKSBnZXRfY2xpZW50X2Jsb2NrKCkgcmV0dXJucyB3cm9uZyBsZW5ndGggaWYgcG9saWN5IGlzIAogICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LLgogICAgIFtLZW5pY2hpIEhvcmkgPGtlbkBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODE1CgogICopIFByb3Blcmx5IHRyZWF0IDxmaWxlcz4gY29udGFpbmVyIGxpa2Ugb3RoZXIgY29udGFpbmVycyBpbiBtb2RfaW5mby4KICAgICBbTWFyYyBTbGVta29dIFBSIzg0OAoKICAqKSBUaGUgcHJveHkgZGlkbid0IHRyZWF0IHRoZSAiSG9zdDoiIGtleXdvcmQgb2YgdGhlIGhvc3QgaGVhZGVyIGFzIGNhc2UtCiAgICAgaW5zZW5zaXRpdmUuICBUaGUgcHJveHkgd291bGQgY29ycnVwdCB0aGUgZmlyc3QgbGluZSBvZiBhIHJlc3BvbnNlIGZyb20KICAgICBhbiBIVFRQLzAuOSBzZXJ2ZXIuICBbS2VuaWNoaSBIb3JpIDxrZW5AZDIuYnMxLmZjLm5lYy5jby5qcD5dIFBSIzgxMyw4MTQKCiAgKikgbW9kX2luY2x1ZGUgd291bGQgbG9nIHNvbWUgYm9ndXMgdmFsdWVzIG9jY2FzaW9uYWxseS4KICAgICBbU2tpcCBNb250YW5hcm8gPHNraXBAY2FsZW5kYXIuY29tPiwgTWFyYyBTbGVta29dIFBSIzc5NwoKICAqKSBQT1JUOiBUaGUgc2xhY2sgZmQgY2hhbmdlcyBpbiAxLjIuMSBpbnRyb2R1Y2VkIGEgcHJvYmxlbSB3aXRoIFNJR0hVUAogICAgIHVuZGVyIFNvbGFyaXMgMi54ICh1cCB0aHJvdWdoIDIuNS4xKS4gIEl0IGhhcyBiZWVuIGZpeGVkLgogICAgIFtEZWFuIEdhdWRldF0gUFIjODMyCgogICopIEFQSTogSW4gSFRUUC8xLjEsIHdoZXRoZXIgb3Igbm90IGEgcmVxdWVzdCBtZXNzYWdlIGNvbnRhaW5zIGEgYm9keQogICAgIGlzIGluZGVwZW5kZW50IG9mIHRoZSByZXF1ZXN0IG1ldGhvZCBhbmQgYmFzZWQgc29sZWx5IG9uIHRoZSBwcmVzZW5jZQogICAgIG9mIGEgQ29udGVudC1MZW5ndGggb3IgVHJhbnNmZXItRW5jb2RpbmcuICBUaGVyZWZvcmUsIG91ciBkZWZhdWx0CiAgICAgaGFuZGxlcnMgbmVlZCB0byBiZSBwcmVwYXJlZCB0byByZWFkIGEgYm9keSBldmVuIGlmIHRoZXkgZG9uJ3Qga25vdwogICAgIHdoYXQgdG8gZG8gd2l0aCBpdDsgb3RoZXJ3aXNlLCB0aGUgYm9keSB3b3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlCiAgICAgbmV4dCByZXF1ZXN0IG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiAgZGlzY2FyZF9yZXF1ZXN0X2JvZHkoKQogICAgIGhhcyBiZWVuIGFkZGVkIHRvIHRha2UgY2FyZSBvZiB0aGF0LiAgW1JveSBGaWVsZGluZ10gUFIjMzc4CgogICopIEFQSTogU3ltYm9sIEFQQUNIRV9SRUxFQVNFIHByb3ZpZGVzIGEgbnVtZXJpYyBmb3JtIG9mIHRoZSBBcGFjaGUKICAgICByZWxlYXNlIHZlcnNpb24gbnVtYmVyLCBzdWNoIHRoYXQgaXQgYWx3YXlzIGluY3JlYXNlcyBhbG9uZyB0aGUKICAgICBzYW1lIGxpbmVzIGFzIG91ciBzb3VyY2UgY29kZSBicmFuY2hpbmcuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNaW5vciBvdmVyc2lnaHQgb24gbXVsdGlwbGUgdmFyaWFudHMgZml4ZWQuICBbUGF1bCBTdXR0b25dIFBSIzk0CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi4xCgogICopIFNFQ1VSSVRZOiBEb24ndCBzZXJ2ZSBmaWxlIHN5c3RlbSBvYmplY3RzIHVubGVzcyB0aGV5IGFyZSBwbGFpbiBmaWxlcywKICAgICBzeW1saW5rcywgb3IgZGlyZWN0b3JpZXMuICBUaGlzIHByZXZlbnRzIGxvY2FsIHVzZXJzIGZyb20gdXNpbmcgcGlwZXMKICAgICBvciBuYW1lZCBzb2NrZXRzIHRvIGludm9rZSBwcm9ncmFtcyBmb3IgYW4gZXh0cmVtZWx5IGNydWRlIGZvcm0gb2YKICAgICBDR0kuICBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiBIZWFkZXJOYW1lIGFuZCBSZWFkbWVOYW1lIHdlcmUgc2V0dGFibGUgaW4gLmh0YWNjZXNzIGFuZAogICAgIGNvdWxkIGNvbnRhaW4gIi4uLyIgYWxsb3dpbmcgYSBsb2NhbCB1c2VyIHRvICJwdWJsaXNoIiBhbnkgZmlsZSBvbgogICAgIHRoZSBzeXN0ZW0uICBObyBzbGFzaGVzIGFyZSBhbGxvd2VkIG5vdy4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEl0IHdhcyBwb3NzaWJsZSB0byB2aW9sYXRlIHRoZSBzeW1saW5rIE9wdGlvbnMgdXNpbmcgbW9kX2RpcgogICAgIChoZWFkZXJzLCByZWFkbWVzLCB0aXRsZXMpLCBtb2RfbmVnb3RpYXRpb24gKHR5cGUgbWFwcyksIG9yCiAgICAgbW9kX2Nlcm5fbWV0YSAobWV0YSBmaWxlcykuICBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiBBcGFjaGUgd2lsbCByZWZ1c2UgdG8gcnVuIGFzICJVc2VyIHJvb3QiIHVubGVzcwogICAgIEJJR19TRUNVUklUWV9IT0xFIGlzIGRlZmluZWQgYXQgY29tcGlsZSB0aW1lLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDT05GSUc6IElmIGEgc3ltbGluayBwb2ludGVkIHRvIGEgZGlyZWN0b3J5IHRoZW4gaXQgd291bGQgYmUgZGlzYWxsb3dlZAogICAgIGlmIGl0IGNvbnRhaW5lZCBhIC5odGFjY2VzcyBkaXNhbGxvd2luZyBzeW1saW5rcy4gIFRoaXMgaXMgY29udHJhcnkKICAgICB0byB0aGUgcnVsZSB0aGF0IHN5bWxpbmsgcGVybWlzc2lvbnMgYXJlIHRlc3RlZCB3aXRoIHRoZSBzeW1saW5rCiAgICAgb3B0aW9ucyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4gIFtEZWFuIEdhdWRldF0gUFIjMzUzCgogICopIENPTkZJRzogVGhlIExvY2tGaWxlIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwbGFjZSB0aGUgc2VyaWFsaXppbmcKICAgICBsb2NrZmlsZSBpbiBhbnkgbG9jYXRpb24uICBJdCBwcmV2aW91c2x5IGRlZmF1bHRlZCB0byAvdXNyL3RtcC9odGxvY2suCiAgICAgW1NvbWVob3cgaXQgdG9vayBmb3VyIG9mIHVzOiBSYW5keSBUZXJidXNoLCBKaW0gSmFnaWVsc2tpLCBEZWFuIEdhdWRldCwKICAgICBNYXJjIFNsZW1rb10KCiAgKikgUmVxdWVzdCBwcm9jZXNzaW5nIG5vdyByZXRhaW5zIHN0YXRlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSByZXF1ZXN0CiAgICAgYm9keSBoYXMgYmVlbiByZWFkLCBzbyB0aGF0IGludGVybmFsIHJlZGlyZWN0cyBhbmQgc3VicmVxdWVzdHMgd2lsbAogICAgIG5vdCB0cnkgdG8gcmVhZCBpdCB0d2ljZSAoYW5kIGJsb2NrKS4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkIGEgcGxhY2Vob2xkZXIgaW4gbW9kdWxlcy9NYWtlZmlsZSB0byBhdm9pZCBlcnJvcnMgd2l0aCBjZXJ0YWluCiAgICAgbWFrZXMuIFtNYXJjIFNsZW1rb10KCiAgKikgUVVFUllfU1RSSU5HIHdhcyB1bmVzY2FwZWQgaW4gbW9kX2luY2x1ZGUsIGl0IHNob3VsZG4ndCBiZS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzY0NAoKICAqKSBtb2RfaW5jbHVkZSB3YXMgbm90IHByb3Blcmx5IGNoYW5naW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KICAgICBbTWFyYyBTbGVta29dIFBSIzc0MgoKICAqKSBBdHRlbXB0IHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggdGhpcmQgcGFydHkgbGlicmFyaWVzIHRoYXQgZG8gbm90CiAgICAgaGFuZGxlIGhpZ2ggbnVtYmVyZWQgZGVzY3JpcHRvcnMgKGV4YW1wbGVzIGluY2x1ZGUgYmluZCwgYW5kCiAgICAgc29sYXJpcyBsaWJjKS4gIE9uIGFsbCBzeXN0ZW1zIGFwYWNoZSBhdHRlbXB0cyB0byBrZWVwIGFsbCBwZXJtYW5lbnQKICAgICBkZXNjcmlwdG9ycyBhYm92ZSAxNSAoY2FsbGVkIHRoZSBsb3cgc2xhY2sgbGluZSkuICBTb2xhcmlzIHVzZXJzCiAgICAgY2FuIGFsc28gYmVuZWZpdCBmcm9tIGFkZGluZyAtREhJR0hfU0xBQ0tfTElORT0yNTYgdG8gRVhUUkFfQ0ZMQUdTCiAgICAgd2hpY2gga2VlcHMgYWxsIG5vbi1GSUxFICogZGVzY3JpcHRvcnMgYWJvdmUgMjU1LiAgT24gYWxsIHN5c3RlbXMKICAgICB0aGlzIHNob3VsZCBtYWtlIHN1cHBvcnRpbmcgbGFyZ2UgbnVtYmVycyBvZiB2aG9zdHMgd2l0aCBtYW55IG9wZW4KICAgICBsb2cgZmlsZXMgbW9yZSBmZWFzaWJsZS4gIElmIHRoaXMgY2F1c2VzIHRyb3VibGUgcGxlYXNlIHJlcG9ydCBpdCwKICAgICB5b3UgY2FuIGRpc2FibGUgdGhpcyB3b3JrYXJvdW5kIGJ5IGFkZGluZyAtRE5PX1NMQUNLIHRvIEVYVFJBX0NGTEFHUy4KICAgICBbRGVhbiBHYXVkZXRdIHZhcmlvdXMgUFJzCgogICopIFJlbGF0ZWQgdG8gdGhlIGxhc3QgZW50cnksIG5ldHdvcmsgc29ja2V0cyBhcmUgbm93IG9wZW5lZCBiZWZvcmUKICAgICBsb2cgZmlsZXMgYXJlIG9wZW5lZC4gIFRoZSBvbmx5IGtub3duIGNhc2Ugd2hlcmUgdGhpcyBjYW4gY2F1c2UKICAgICBwcm9ibGVtcyBpcyB1bmRlciBTb2xhcmlzIHdpdGggbWFueSB2aXJ0dWFsaG9zdHMgYW5kIG1hbnkgTGlzdGVuCiAgICAgZGlyZWN0aXZlcy4gIEJ1dCB1c2luZyAtREhJR0hfU0xBQ0tfTElORT0yNTYgZGVzY3JpYmVkIGFib3ZlIHdpbGwKICAgICB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uICBbRGVhbiBHYXVkZXRdCgogICopIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCBpcyBub3cgZGVmYXVsdCBmb3IgRnJlZUJTRCwgQS9VWCwgYW5kCiAgICAgU3VuT1MgNC4KCiAgKikgSW1wcm92ZWQgdW5peCBlcnJvciByZXNwb25zZSBsb2dnaW5nLiAgW01hcmMgU2xlbWtvXQoKICAqKSBVcGRhdGUgbW9kX3Jld3JpdGUgZnJvbSAzLjAuNSB0byAzLjAuNi4gIE5ldyBydWxlZmxhZwogICAgIFFTQT1xdWVyeV9zdHJpbmdfYXBwZW5kLiAgQWxzbyBmaXhlZCBhIG5hc3R5IGJ1ZyBpbiBwZXItZGlyIGNvbnRleHQ6CiAgICAgd2hlbiBhIFVSTCBodHRwOi8vLi4uIHdhcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBzcGVjaWFsCiAgICAgcmVkaXJlY3QgZmxhZywgZS5nLiBSPXBlcm1hbmVudCwgdGhlIHBlcm1hbmVudCBzdGF0dXMgd2FzIGxvc3QuCiAgICAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSWYgYW4gb2JqZWN0IGhhcyBtdWx0aXBsZSB2YXJpYW50cyB0aGF0IGFyZSBvdGhlcndpc2UgZXF1YWwgQXBhY2hlCiAgICAgd291bGQgcHJlZmVyIHRoZSBsYXN0IGxpc3RlZCB2YXJpYW50IHJhdGhlciB0aGFuIHRoZSBmaXJzdC4KICAgICBbUGF1bCBTdXR0b25dIFBSIzk0CgogICopICJtYWtlIGNsZWFuIiBhdCB0aGUgdG9wIGxldmVsIG5vdyByZW1vdmVzICouby4gIFtEZWFuIEdhdWRldF0gUFIjNzUyCgogICopIG1vZF9zdGF0dXMgZHVtcHMgY29yZSBpbiBpbmV0ZCBtb2RlLiAgW01hcmMgU2xlbWtvIGFuZCBSb3kgRmllbGRpbmddCiAgICAgUFIjNTY2CgogICopIHByZWdzdWIgaGFkIGFuIG9mZi1ieS0xIGluIGl0cyBlcnJvciBjaGVja2luZyBjb2RlLiBbQWxleGVpIEtvc3V0XQoKICAqKSBQT1JUOiBmaXggcmxpbV90IHByb2JsZW1zIHdpdGggQUlYIDQuMi4gW01hcmMgU2xlbWtvXSBQUiMzMzMKCiAgKikgUE9SVDogVXBkYXRlIFVuaXhXYXJlIHN1cHBvcnQgZm9yIDIuMS4yLgogICAgIFtMYXdyZW5jZSBSb3Nlbm1hbiA8bGVyQGxlcmN0ci5vcmc+XSBQUiM1MTEKCiAgKikgUE9SVDogTm9uU3RvcC1VWCBbSm9hY2hpbSBTY2htaXR6IDxzY2htaXR6X2pvYWNoaW1AdGFuZGVtLmNvbT5dIFBSIzMyNwoKICAqKSBQT1JUOiBVcGRhdGUgQ29udmV4T1Mgc3VwcG9ydCBmb3IgMTEuNS4KICAgICBbRGF2aWQgRGVTaW1vbmUgPGZveEBjb252ZXguY29tPl0gUFIjMzk5CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIERFQyBjYyBjb21waWxlciB1bmRlciBVTFRSSVguCiAgICAgWyJQLiBBbGVqYW5kcm8gTG9wZXotVmFsZW5jaWEiIDxhbGVqb2xvQGlkZWFtLmdvdi5jbz5dIFBSIzM4OAoKICAqKSBQT1JUOiBTdXBwb3J0IGZvciBNYXhpb24vT1MgU1ZSNC4yIFJlYWwgVGltZSBVbml4LiBbbm8gbmFtZSBnaXZlbl0gUFIjMzgzCgogICopIFBPUlQ6IFdvcmthcm91bmQgZm9yIEFJWCAzLnggY29tcGlsZXIgYnVnIGluIGh0dHBfYnByaW50Zi5jLiAgCiAgICAgW01hcmMgU2xlbWtvXSBQUiM3MjUKCiAgKikgUE9SVDogZml4IHByb2JsZW0gY29tcGlsaW5nIGh0dHBfYnByaW50Zi5jIHdpdGggZ2NjIHVuZGVyIFNDTwogICAgIFtNYXJjIFNsZW1rb10gUFIjNjk1CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMTEKCiAgKikgRml4ZWQgb3BlbiB0aW1lc3RhbXAgZmQgaW4gcHJveHlfY2FjaGUuYyBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGRlZCB1bmRvY3VtZW50ZWQgcGVybCBTU0kgbWVjaGFuaXNtIGZvciAtRFVTRV9QRVJMX1NTSSBhbmQgbW9kX3BlcmwuCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgUm9iIEhhcnRpbGxdCgogICopIFByb3h5IG5lZWRzIHRvIHVzZSBoYXJkX3RpbWVvdXQgaW5zdGVhZCBvZiBzb2Z0X3RpbWVvdXQgd2hlbiBpdCBpcwogICAgIHJlYWRpbmcgZnJvbSBvbmUgYnVmZmVyIGFuZCB3cml0aW5nIHRvIGFub3RoZXIsIGF0IGxlYXN0IHVudGlsIGl0IGhhcwogICAgIGEgY3VzdG9tIHRpbWVvdXQgaGFuZGxlci4gIFtSb3kgRmllbGRpbmcgYW5kIFBldHIgTGFtcGFdCgogICopIEZpeGVkIHByb2JsZW0gb24gSVJJWCB3aXRoIHNlcnZlcnMgaGFuZ2luZyBpbiBJZGVudGl0eUNoZWNrLAogICAgIGFwcGFyZW50bHkgZHVlIHRvIGEgbWlzbWF0Y2ggYmV0d2VlbiBzaWdhY3Rpb24gYW5kIHNldGptcC4KICAgICBbUm95IEZpZWxkaW5nXSBQUiM1MDIKCiAgKikgTG9nIGNvcnJlY3Qgc3RhdHVzIGNvZGUgaWYgd2UgdGltZW91dCBiZWZvcmUgcmVjZWl2aW5nIGEgcmVxdWVzdCAoNDA4KQogICAgIG9yIGlmIHdlIHJlY2VpdmVkIGEgcmVxdWVzdC1saW5lIHRoYXQgd2FzIHRvbyBsb25nIHRvIHByb2Nlc3MgKDQxNCkuCiAgICAgW0VkIEtvcnRob2YgYW5kIFJveSBGaWVsZGluZ10gUFIjNjAxCgogICopIFZpcnR1YWwgaG9zdHMgd2l0aCB0aGUgc2FtZSBTZXJ2ZXJOYW1lLCBidXQgb24gZGlmZmVyZW50IHBvcnRzLCB3ZXJlCiAgICAgbm90IGJlaW5nIHNlbGVjdGVkIHByb3Blcmx5LiAgW0VkIEtvcnRob2ZdCgogICopIEFkZGVkIGNvZGUgdG8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgSVAgYWRkcmVzcyBmcm9tIHByb3h5X2hvc3QyYWRkcigpCiAgICAgaWYgZ2V0aG9zdGJ5YWRkcigpIGZhaWxzIGR1ZSB0byByZXZlcnNlIEROUyBsb29rdXAgcHJvYmxlbXMuIE9yaWdpbmFsCiAgICAgY2hhbmdlIHN1Ym1pdHRlZCBieSBKb3pzZWYgSG9sbG9zaSA8aG9sbG9zaUBzYmNtLmNvbT4uCiAgICAgW0NodWNrIE11cmNrb10gUFIjNjE0CgogICopIElmIG11bHRpcGxlIHJlcXVlc3RzIG9uIGEgc2luZ2xlIGNvbm5lY3Rpb24gYXJlIHVzZWQgdG8gcmV0cmlldmUKICAgICBkYXRhIGZyb20gZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMsIHRoZSB2aXJ0dWFsIGhvc3QgbGlzdCB3b3VsZCBiZQogICAgIHNjYW5uZWQgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIFZIIGluc3RlYWQgb2YgdGhlIGZpcnN0LAogICAgIGNhdXNpbmcgbW9zdCB2aXJ0dWFsIGhvc3RzIHRvIGJlIGlnbm9yZWQuCiAgICAgW1BhdWwgU3V0dG9uIGFuZCBNYXJ0aW4gTWFyZXNdIFBSIzYxMAoKICAqKSBUaGUgT1MvMiBoYW5kbGluZyBvZiBwcm9jZXNzIGdyb3VwIHdhcyBicm9rZW4gYnkgYSBwb3J0aW5nIHBhdGNoIGZvcgogICAgIE1QRSwgc28gcmVzdG9yZWQgcHJpb3IgY29kZSBmb3IgT1MvMi4gIFtSb3kgRmllbGRpbmcgYW5kIEdhcmV5IFNtaWxleV0KCiAgKikgSW5oZXJpdCB2aXJ0dWFsIHNlcnZlciBwb3J0IGZyb20gbWFpbiBzZXJ2ZXIgaWYgbm9uZSAob3IgIioiKSBpcwogICAgIGdpdmVuIGZvciBWaXJ0dWFsSG9zdC4gIFtEZWFuIEdhdWRldF0gUFIjNTc2CgogICopIElmIHRoZSBsb29rdXAgZm9yIGEgRGlyZWN0b3J5SW5kZXggbmFtZSB3aXRoIGNvbnRlbnQgbmVnb3RpYXRpb24KICAgICBoYXMgZm91bmQgbWF0Y2hpbmcgdmFyaWFudHMsIGJ1dCBub25lIGFyZSBhY2NlcHRhYmxlLCByZXR1cm4gdGhlCiAgICAgbmVnb3RpYXRpb24gcmVzdWx0IGlmIHRoZXJlIGFyZSBubyBtb3JlIERpcmVjdG9yeUluZGV4IG5hbWVzIHRvIGxvb2t1cC4KICAgICBbUGV0ciBMYW1wYSBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBJZiBhIHNvZnRfdGltZW91dCBvY2N1cnMgYWZ0ZXIga2VlcGFsaXZlIGlzIHNldCwgdGhlbiB0aGUgbWFpbiBjaGlsZAogICAgIGxvb3Agd291bGQgdHJ5IHRvIHJlYWQgYW5vdGhlciByZXF1ZXN0IGV2ZW4gdGhvdWdoIHRoZSBjb25uZWN0aW9uCiAgICAgaGFzIGJlZW4gYWJvcnRlZC4gIFtSb3kgRmllbGRpbmddCgogICopIENvbmZpZ3VyZSBjaGFuZ2VzOiBBbGxvdyBmb3Igd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYQogICAgIE1vZHVsZSBkZWNsYXJhdGlvbi4gQWxzbywgYmUgbW9yZSB1bmRlcnN0YW5kaW5nIGFib3V0IHRoZQogICAgIENDPS9PUFRJTT0gZm9ybWF0IGluIENvbmZpZ3VyYXRpb24uIEZpbmFsbHksIGZpeCBjb21waWxlcgogICAgIGZsYWdzIGlmIHVzaW5nIEhQLVVYJ3MgY2MgY29tcGlsZXIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTdWJyZXF1ZXN0cyBhbmQgaW50ZXJuYWwgcmVkaXJlY3RzIG5vdyBpbmhlcml0IHRoZV9yZXF1ZXN0IGZyb20gdGhlCiAgICAgb3JpZ2luYWwgcmVxdWVzdC1saW5lLiBbUm95IEZpZWxkaW5nXQoKICAqKSBUZXN0IGZvciBlcnJvciBjb25kaXRpb25zIGJlZm9yZSBjcmVhdGluZyBvdXRwdXQgaGVhZGVyIGZpZWxkcywgc2luY2UKICAgICB3ZSBkb24ndCB3YW50IHRoZSBlcnJvciBtZXNzYWdlIHRvIGluY2x1ZGUgdGhvc2UgZmllbGRzLiAgTGlrZXdpc2UsCiAgICAgcmVzZXQgdGhlIGNvbnRlbnRfbGFuZ3VhZ2UocykgYW5kIGNvbnRlbnRfZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlCiAgICAgYmVmb3JlIGdlbmVyYXRpbmcgb3IgcmVkaXJlY3RpbmcgdG8gYW4gZXJyb3IgbWVzc2FnZSwgc2luY2UgdGhlIG5ldwogICAgIG1lc3NhZ2Ugd2lsbCBoYXZlIGl0cyBvd24gQ29udGVudC0qIGRlZmluaXRpb25zLiBbRGVhbiBHYXVkZXRdCgogICopIFJlc3RvcmVkIHRoZSBzZW1hbnRpY3Mgb2YgaGVhZGVyc19vdXQgKGhlYWRlcnMgc2VudCBvbmx5IHdpdGggMjAwLi4yOTkKICAgICBhbmQgMzA0IHJlc3BvbnNlcykgYW5kIGVycl9oZWFkZXJzX291dCAoaGVhZGVycyBzZW50IHdpdGggYWxsIHJlc3BvbnNlcykuCiAgICAgQXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvcHlpbmcgdGFibGVzIGlmIGVycl9oZWFkZXJzX291dCBpcyBlbXB0eQogICAgICh0aGUgdXN1YWwgY2FzZSkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBGaXhlZCBhIGNvdXBsZSBwbGFjZXMgd2hlcmUgYSBjaGVjayBmb3IgdGhlIGRlZmF1bHQgQ29udGVudC1UeXBlIHdhcwogICAgIG5vdCBwcm9wZXJseSBjaGVja2luZyBib3RoIHRoZSB2YWx1ZSBjb25maWd1cmVkIGJ5IHRoZSBEZWZhdWx0VHlwZQogICAgIGRpcmVjdGl2ZSBhbmQgdGhlIERFRkFVTFRfVFlQRSBzeW1ib2wgaW4gaHR0cGQuaC4gIENoYW5nZWQgdGhlIHZhbHVlCiAgICAgb2YgREVGQVVMVF9UWVBFIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIGRlZmF1bHQgKHRleHQvcGxhaW4pLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNTA2CgogICopIEVzY2FwZSB0aGUgSFRNTC1zZW5zaXRpdmUgY2hhcmFjdGVycyBpbiB0aGUgUmVxdWVzdC1VUkkgdGhhdCBpcwogICAgIG91dHB1dCBmb3IgZWFjaCBjaGlsZCBieSBtb2Rfc3RhdHVzLiBbRGVhbiBHYXVkZXQgYW5kIEtlbiBDb2FyXSBQUiM1MDEKCiAgKikgUHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUgZmxvY2sgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBtdXRleCBsb2NraW5nCiAgICAgYXJvdW5kIGFjY2VwdCgpIHdoZW4gVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIGlzIGRlZmluZWQuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBUaGUgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBQQVRIX0lORk8gaGFzIGJlZW4gcmVzdG9yZWQgdG8gdGhlIHByZS0xLjJiCiAgICAgKGFuZCBOQ1NBIGh0dHBkKSBkZWZpbml0aW9uIHdoZXJlaW4gaXQgd2FzIHRoZSBleHRyYSBwYXRoIGluZm8gYmV5b25kCiAgICAgdGhlIENHSSBzY3JpcHQgZmlsZW5hbWUuICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRklMRVBBVEhfSU5GTyBoYXMKICAgICBiZWVuIHJlbW92ZWQsIGFuZCBpbnN0ZWFkIHdlIHN1cHBseSB0aGUgb3JpZ2luYWwgUkVRVUVTVF9VUkkgdG8gYW55CiAgICAgc2NyaXB0IHRoYXQgd2FudHMgdG8gYmUgQXBhY2hlLXNwZWNpZmljIGFuZCBuZWVkcyB0aGUgcmVhbCBVUkkgcGF0aC4KICAgICBUaGlzIHNvbHZlcyBhIHByb2JsZW0gd2l0aCBleGlzdGluZyBzY3JpcHRzIHRoYXQgdXNlIGV4dHJhIHBhdGggaW5mbwogICAgIGluIHRoZSBTY3JpcHRBbGlhcyBkaXJlY3RpdmUgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBDR0kgc2NyaXB0LgogICAgIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBfZGVmYXVsdF8gY2hhbmdlIGluIDEuMmIxMCB3aWxsIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9uIGNvbmZpZ3MKICAgICB0aGF0IHVzZSBtdWx0aXBsZSBMaXN0ZW4gc3RhdGVtZW50cyBmb3IgbGlzdGVuaW5nIG9uIG11bHRpcGxlIHBvcnRzLgogICAgIEJ1dCB0aGF0IGNoYW5nZSBpcyBuZWNlc3NhcnkgdG8gbWFrZSBfZGVmYXVsdF8gY29uc2lzdGVudCB3aXRoIG90aGVyCiAgICAgZm9ybXMgb2YgPFZpcnR1YWxIb3N0Pi4gIEl0IHJlcXVpcmVzIHN1Y2ggY29uZmlncyB0byBiZSBtb2RpZmllZAogICAgIHRvIHVzZSA8VmlydHVhbEhvc3QgX2RlZmF1bHRfOio+LiAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4KICAgICB1cGRhdGVkLiAgW0RlYW4gR2F1ZGV0XSBQUiM1MzAKCiAgKikgSWYgYW4gRXJyb3JEb2N1bWVudCBDR0kgc2NyaXB0IGlzIHVzZWQgdG8gcmVzcG9uZCB0byBhbiBlcnJvcgogICAgIGdlbmVyYXRlZCBieSBhbm90aGVyIENHSSBzY3JpcHQgd2hpY2ggaGFzIGFscmVhZHkgcmVhZCB0aGUgbWVzc2FnZQogICAgIGJvZHkgb2YgdGhlIHJlcXVlc3QsIHRoZSBzZXJ2ZXIgd291bGQgYmxvY2sgdHJ5aW5nIHRvIHJlYWQgdGhlCiAgICAgbWVzc2FnZSBib2R5IGFnYWluLiAgW1JvYiBIYXJ0aWxsXQoKICAqKSBzaWduYWwoKSByZXBsYWNlbWVudCBjb25mbGljdGVkIHdpdGggYSBkZWZpbmUgb24gUU5YIChhbmQgcG90ZW50aWFsbHkKICAgICBvdGhlciBwbGF0Zm9ybXMpLiBGaXhlZC4gW0JlbiBMYXVyaWVdIFBSIzUxMgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMTAKCiAgKikgQWxsb3cgSFRUUERfUk9PVCwgU0VSVkVSX0NPTkZJR19GSUxFLCBERUZBVUxUX1BBVEgsIGFuZCBTSEVMTF9QQVRICiAgICAgdG8gYmUgY29uZmlndXJlZCB2aWEgLUQgaW4gQ29uZmlndXJhdGlvbi4gIFtEZWFuIEdhdWRldF0gUFIjNDQ5CgogICopIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86cG9ydG51bT4gZGlkbid0IHdvcmsgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIHByb3RvdHlwZSBmb3IgbWt0ZW1wKCkgZm9yIFNVTk9TNCBbTWFyYyBTbGVta29dCgogICopIEluIG1vZF9wcm94eS5jLCBjaGVjayByZXR1cm4gdmFsdWVzIGZvciBwcm94eV9ob3N0MmFkZHIoKSB3aGVuIHJlYWRpbmcKICAgICBjb25maWcsIGluIGNhc2UgdGhlIGhvc3RlbnQgc3RydWN0IHJldHVybmVkIGlzIHRyYXNoLgogICAgIFtDaHVjayBNdXJja29dIFBSICM0OTEKCiAgKikgRml4ZWQgdGhlIGZpeCBpbiAxLjJiOSBmb3IgcGFyc2luZyBVUkwgcXVlcnkgaW5mbyBpbnRvIGFyZ3MgZm9yIENHSQogICAgIHNjcmlwdHMuICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFyYyBTbGVta29dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI5ICBbbmV2ZXIgYW5ub3VuY2VkXQoKICAqKSBSZXNldCB0aGUgTU9EVUxFX01BR0lDX05VTUJFUiB0byBhY2NvdW50IGZvciB0aGUgdW5zaWduZWQgcG9ydAogICAgIGNoYW5nZXMgYW5kIGluIGFudGljaXBhdGlvbiBvZiAxLjIgZmluYWwgcmVsZWFzZS4gIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBwcm9ibGVtIHdpdGggc2NyaXB0cyBub3QgcmVjZWl2aW5nIGEgU0lHUElQRSB3aGVuIGNsaWVudCBkcm9wcwogICAgIHRoZSBjb25uZWN0aW9uIChlLmcuLCB3aGVuIHVzZXIgcHJlc3NlcyBTdG9wKS4gIEFwYWNoZSB3aWxsIG5vdyBzdG9wCiAgICAgdHJ5aW5nIHRvIHNlbmQgYSBtZXNzYWdlIGJvZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gZXJyb3IgZnJvbSB3cml0ZS4KICAgICBbUm95IEZpZWxkaW5nIGFuZCBOYXRoYW4gS3Vyel0gUFIjMzM1CgogICopIFJlYXJyYW5nZSBDb25maWd1cmF0aW9uLnRtcGwgc28gdGhhdCBtb2RfcmV3cml0ZSBoYXMgaGlnaGVyIHByaW9yaXR5CiAgICAgdGhhbiBtb2RfYWxpYXMsIGFuZCBtb2RfYWxpYXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIG1vZF9wcm94eTsKICAgICByZWFycmFuZ2VkIG90aGVyIG1vZHVsZXMgdG8gZW5oYW5jZSB1bmRlcnN0YW5kaW5nIG9mIHRoZWlyIHB1cnBvc2UKICAgICBhbmQgcmVsYXRpdmUgb3JkZXIgKGFuZCBtYXliZSBldmVuIHJlZHVjZSBzb21lIG92ZXJoZWFkKS4KICAgICBbUm95IEZpZWxkaW5nIGFuZCBTYW1lZXIgUGFyZWtoXQoKICAqKSBGaXggZ3JhY2VmdWwgcmVzdGFydC4gIEVsaW1pbmF0ZSBtYW55IHNpZ25hbC1yZWxhdGVkIHJhY2UKICAgICBjb25kaXRpb25zIGluIGJvdGggZm9ybXMgb2YgcmVzdGFydCwgYW5kIGluIFNJR1RFUk0uICBTZWUKICAgICBodGRvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwgZm9yIGRldGFpbHMgb24gc3RvcHBpbmcgYW5kCiAgICAgcmVzdGFydGluZyB0aGUgcGFyZW50LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIG1vZF9yZXdyaXRlLCBtb2RfYnJvd3NlciwgbW9kX2luY2x1ZGUuICBUdW5lCiAgICAgbWVtb3J5IGFsbG9jYXRvciB0byBhdm9pZCBhIGJlaGF2aW91ciB0aGF0IHJlcXVpcmVkIGV4dHJhIGJsb2NrcyB0bwogICAgIGJlIGFsbG9jYXRlZC4gIFtEZWFuIEdhdWRldF0KCiAgKikgQWxsb3cgc3VleGVjIHRvIGFjY2VzcyBmaWxlcyByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeSBidXQgbm90CiAgICAgYWJvdmUuICAoRXhjbHVkaW5nIGxlYWRpbmcgLyBvciBhbnkgLi4gZGlyZWN0b3J5LikgIFtLZW4gQ29hcl0KICAgICBQUiMyNjksIDMxOSwgMzk1CgogICopIEZpeCBzdWV4ZWMgc2VnZmF1bHQgd2hlbiBncm91cCBkb2Vzbid0IGV4aXN0LiBbR3JlZ29yeSBOZWlsIFNoYXBpcm9dCiAgICAgUFIjMzY3LCAzNjgsIDM1NCwgNDUzCgogICopIEZpeCB0aGUgYWJvdmUgZml4OiBpZiBzdWV4ZWMgaXMgZW5hYmxlZCwgYXZvaWQgZGVzdHJveWluZyByLT51cmwKICAgICB3aGlsZSBvYnRhaW5pbmcgdGhlIC9+dXNlciBhbmQgc2F2ZSB0aGUgdXNlcm5hbWUgaW4gYSBzZXBhcmF0ZSBkYXRhCiAgICAgYXJlYSBzbyB0aGF0IGl0IHdvbid0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjYWxsIHRvIGdldGdyZ2lkKCksIGFuZAogICAgIGZpeCBzb21lIG1pc3VzZSBvZiB0aGUgcG9vbCBzdHJpbmcgYWxsb2NhdGlvbiBmdW5jdGlvbnMuICBBbHNvIGZpeGVzCiAgICAgYSBnZW5lcmFsIHByb2JsZW0gd2l0aCBwYXJzaW5nIFVSTCBxdWVyeSBpbmZvIGludG8gYXJncyBmb3IgQ0dJIHNjcmlwdHMuCiAgICAgW1JveSBGaWVsZGluZ10gUFIjMzM5LCAzNjcsIDM1NCwgNDUzCgogICopIEZpeCBJUklYIHdhcm5pbmcgYWJvdXQgYnplcm8gdW5kZWZpbmVkLiBbTWFyYyBTbGVta29dCgogICopIEZpeCBwcm9ibGVtIHdpdGggPERpcmVjdG9yeSBwcm94eTouLi4+LiBbTWFydGluIEtyYWVtZXJdIFBSIzI3MQoKICAqKSBDb3JyZWN0ZWQgc3BlbGxpbmcgb2YgImF1dGhvcml0YXRpdmUiLiAgQXV0aERCQXV0aG9yYXRhdGl2ZSBiZWNhbWUKICAgICBBdXRoREJBdXRob3JpdGF0aXZlLiBbTWFyYyBTbGVta29dIFBSIzQyMAoKICAqKSBNYXhDbGllbnRzIHNob3VsZCBiZSBhdCBsZWFzdCAxLiBbTGFycyBFaWxlYnJlY2h0XSBQUiMzNzUKCiAgKikgVGhlIGRlZmF1bHQgaGFuZGxlciBub3cgbG9ncyBpbnZhbGlkIG1ldGhvZHMgb3IgVVJJcyAoaS5lLiBQVVQgb24gYW4KICAgICBvYmplY3QgdGhhdCBjYW4ndCBiZSBQVVQsIG9yIEZPT0JBUiBmb3Igc29tZSBtZXRob2QgRk9PQkFSIHRoYXQKICAgICBhcGFjaGUgZG9lc24ndCBrbm93IGFib3V0IGF0IGFsbCkuICBMb2cgNDA0cyB0aGF0IG9jY3VyIGluIG1vZF9pbmNsdWRlLgogICAgIFtQYXVsIFN1dHRvbiwgSm9obiBWYW4gRXNzZW5dCgogICopIElmIGEgc29mdCB0aW1lb3V0IChvciBsaW5nZXJvdXQpIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gZmx1c2ggYQogICAgIGJ1ZmZlciBvciB3cml0ZSBpbnNpZGUgYnVmZi5jIG9yIGZyZWFkJ2luZyBmcm9tIGEgQ0dJJ3Mgb3V0cHV0LAogICAgIHRoZW4gdGhlIHRpbWVvdXQgd291bGQgYmUgaWdub3JlZC4gW1JveSBGaWVsZGluZ10gUFIjMzczCgogICopIFdvcmsgYXJvdW5kIGEgYnVnIGluIE5ldHNjYXBlIE5hdmlnYXRvciB2ZXJzaW9ucyAyLngsIDMueCBhbmQgNC4wYjIncwogICAgIHBhcnNpbmcgb2YgaGVhZGVycy4gIElmIHRoZSB0ZXJtaW5hdGluZyBlbXB0eS1saW5lIENSTEYgb2NjdXJzIHN0YXJ0aW5nCiAgICAgYXQgdGhlIDI1NnRoIG9yIDI1N3RoIGJ5dGUgb2Ygb3V0cHV0LCB0aGVuIE5hdmlnYXRvciB3aWxsIHRoaW5rIGEgbm9ybWFsCiAgICAgaW1hZ2UgaXMgaW52YWxpZC4gIFdlIGFyZSBndWVzc2luZyB0aGF0IHRoaXMgaXMgYmVjYXVzZSB0aGVpciBpbml0aWFsCiAgICAgcmVhZCBvZiBhIG5ldyByZXF1ZXN0IHVzZXMgYSAyNTYgYnl0ZSBidWZmZXIuIFdlIGNoZWNrIHRoZSBieXRlcyB3cml0dGVuCiAgICAgc28gZmFyIGFuZCwgaWYgd2UgYXJlIGFib3V0IHRvIHRpY2tsZSB0aGUgYnVnLCB3ZSBpbnN0ZWFkIGluc2VydCBhCiAgICAgcGFkZGluZyBoZWFkZXIgb2YgZW1pbmVudCBib2dvc2l0eS4gW1JveSBGaWVsZGluZyBhbmQgRGVhbiBHYXVkZXRdIFBSIzIzMgoKICAqKSBGaXhlZCBTSUdTRUdWIHByb2JsZW0gd2hlbiBhIERpcmVjdG9yeUluZGV4IGZpbGUgaXMgYWxzbyB0aGUgc291cmNlCiAgICAgb2YgYW4gZXh0ZXJuYWwgcmVkaXJlY3Rpb24uICBbUm95IEZpZWxkaW5nIGFuZCBQYXVsIFN1dHRvbl0KCiAgKikgQ29uZmlndXJlIHdvdWxkIGNyZWF0ZSBhIGJyb2tlbiBNYWtlZmlsZSBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgY29udGFpbmVkIGEgY29tbWVudGVkLW91dCBSdWxlLiAgW1JveSBGaWVsZGluZ10KCiAgKikgUHJvbW90ZSBwZXJfZGlyX2NvbmZpZyBhbmQgc3VicHJvY2Vzc19lbnYgZnJvbSB0aGUgc3VicmVxdWVzdCB0byB0aGUKICAgICBtYWluIHJlcXVlc3QgaW4gbW9kX25lZ290aWF0aW9uLiAgSW4gcGFydGljdWxhciB0aGlzIGZpeGVzIGEgYnVnCiAgICAgd2hlcmUgPEZpbGVzPiBzZWN0aW9ucyB3b3VsZG4ndCBwcm9wZXJseSBhcHBseSB0byBuZWdvdGlhdGVkIGNvbnRlbnQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggYSBwb3RlbnRpYWwgZGVhZGxvY2sgaW4gbW9kX2NnaSBzY3JpcHRfZXJyIGhhbmRsaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSByb3RhdGVsb2dzIHplcm8tcGFkcyB0aGUgbG9nZmlsZSBuYW1lcyB0byBpbXByb3ZlIGFscGhhYmV0aWMgc29ydGluZy4KICAgICBbTWl0Y2hlbGwgQmxhbmsgSnJdCgogICopIFVwZGF0ZWQgbW9kX3Jld3JpdGUgdG8gMy4wLjQ6IEZpeGVzIEhUVFAgcmVkaXJlY3RzIGZyb20gd2l0aGluCiAgICAgLmh0YWNjZXNzIGZpbGVzIGJlY2F1c2UgdGhlIFJld3JpdGVCYXNlIHdhcyBub3QgcmVwbGFjZWQgY29ycmVjdGx5LgogICAgIFVwZGF0ZWQgbW9kX3Jld3JpdGUgdG8gMy4wLjU6IEZpeGVzIHByb2JsZW0gd2l0aCByZXdyaXRpbmcgaW5zaWRlCiAgICAgPERpcmVjdG9yeT4gc2VjdGlvbnMgbWlzc2luZyBhIHRyYWlsaW5nIC8uICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQ2xlYW4gdXAgTGludXggc2V0dGluZ3MgaW4gY29uZi5oIGJ5IGRldGVjdGluZyAyLnggdmVyc3VzIDEueC4gIEZvcgogICAgIDEueCB0aGUgc2V0dGluZ3MgYXJlIHRob3NlIG9mIHByZS0xLjJiOC4gIEZvciAyLnggd2UgaW5jbHVkZQogICAgIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCAoc2NvcmVib2FyZCBpbiBzaGFyZWQgbWVtb3J5IHJhdGhlciB0aGFuIGZpbGUpIGFuZAogICAgIEhBVkVfU1lTX1JFU09VUkNFX0ggKGVuYWJsZSB0aGUgUkxpbWl0IGNvbW1hbmRzKS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzMzNiwgUFIjMzQwCgogICopIFJlZGlyZWN0IGRpZCBub3QgcHJlc2VydmUgP3F1ZXJ5X3N0cmluZ3Mgd2hlbiBwcmVzZW50IGluIHRoZSBjbGllbnQncwogICAgIHJlcXVlc3QuICBbRGVhbiBHYXVkZXRdCgogICopIENvbmZpZ3VyZSB3YXMgZmluZGluZyBub24tbW9kdWxlcyBvbiBFWFRSQV9MSUJTLiBbRnJhbmsgQ3JpbmdsZV0gUFIjMzgwCgogICopIFVzZSAvYmluL3NoNSBvbiBVTFRSSVguICBbUC4gQWxlamFuZHJvIExvcGV6LVZhbGVuY2lhXSBQUiMzNjkKCiAgKikgQWRkIFVuaXhXYXJlIGNvbXBpbGUvaW5zdGFsbCBpbnN0cnVjdGlvbnMuICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGQgbW9kX2V4YW1wbGUgKGlsbHVzdHJhdGlvbiBvZiBBUEkgdGVjaG5pcXVlcykuICBbS2VuIENvYXJdCgogICopIEFkZCBtYWNybyBmb3IgbWVtbW92ZSB0byBjb25mLmggZm9yIFNVTk9TNC4gW01hcmMgU2xlbWtvXQoKICAqKSBJbXByb3ZlIGhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzIHdoZW4gZmlsZW5hbWVzIGhhdmUgc3BhY2VzIGluIHRoZW0uCiAgICAgW0NodWNrIE11cmNrb10KCiAgKikgRm9yIGhvc3RzIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCB0cnkgYWxsIGFkZGl0aW9uYWwgYWRkcmVzc2VzIGlmCiAgICAgbmVjZXNzYXJ5IHRvIGdldCBhIGNvbm5lY3QuIEZhaWwgb25seSBpZiBob3N0ZW50IGFkZHJlc3MgbGlzdCBpcwogICAgIGV4aGF1c3RlZC4gW0NodWNrIE11cmNrb10KCiAgKikgTW9yZSBzaWduZWQvdW5zaWduZWQgcG9ydCBmaXhlcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSEFSRF9TRVJWRVJfTElNSVQgY2FuIGJlIGRlZmluZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZSBub3cuCiAgICAgW0RlYW4gR2F1ZGV0XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiOAoKICAqKSBzdWV4ZWMuYyBkb2Vzbid0IGNsb3NlIHRoZSBsb2cgZmlsZSwgYWxsb3dpbmcgQ0dJcyB0byBjb250aW51ZSB3cml0aW5nCiAgICAgdG8gaXQuICBbTWFyYyBTbGVta29dCgogICopIFRoZSBhZGRpdGlvbiBvZiA8TG9jYXRpb24+IGFuZCA8RmlsZT4gZGlyZWN0aXZlcyBtYWRlIHRoZQogICAgIHN1Yl9yZXFfbG9va3VwX3NpbXBsZSgpIGZ1bmN0aW9uIGJvZ3VzLCBzbyB3ZSBub3cgaGFuZGxlCiAgICAgdGhlIHNwZWNpYWwgY2FzZXMgZGlyZWN0bHkuICBbRGVhbiBHYXVkZXRdCgogICopIFdlIG5vdyB0cnkgdG8gbG9nIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgZHVtcGluZyBjb3JlIHdoZW4gYSBmYXRhbAogICAgIHNpZ25hbCBpcyByZWNlaXZlZC4gIFtLZW4gQ29hcl0KCiAgKikgSW1wcm92ZWQgbGluZ2VyaW5nX2Nsb3NlIGJ5IGFkZGluZyBhIHNwZWNpYWwgdGltZW91dCwgcmVtb3ZpbmcgdGhlCiAgICAgc3B1cmlvdXMgbG9nIG1lc3NhZ2VzLCByZW1vdmluZyB0aGUgbm9uYmxvY2tpbmcgc2V0dGluZ3MgKHRoZXkKICAgICBhcmUgbm90IG5lZWRlZCB3aXRoIHRoZSBiZXR0ZXIgdGltZW91dCksIGFuZCBhZGRpbmcgY29tbWVudGFyeQogICAgIGFib3V0IHRoZSBOT19MSU5HQ0xPU0UgYW5kIFVTRV9TT19MSU5HRVIgaXNzdWVzLiAgTk9fTElOR0NMT1NFIGlzCiAgICAgbm93IHRoZSBkZWZhdWx0IGZvciBTdW5PUzQsIFVuaXhXYXJlLCBOZVhULCBhbmQgSVJJWC4gIFtSb3kgRmllbGRpbmddCgogICopIFNlbmQgZXJyb3IgbWVzc2FnZXMgYWJvdXQgc2V0c29ja29wdCBmYWlsdXJlcyB0byB0aGUgc2VydmVyIGVycm9yCiAgICAgbG9nIGluc3RlYWQgb2Ygc3RkZXJyLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IGxvb3Bob2xlcyBpbiBwcm94eSBjYWNoZSBleHBpcnkgdmlzIGEgdmlzIGFsYXJtcy4gW0JyaWFuIE1vb3JlXQoKICAqKSBTdG9wZ2FwIHNvbHV0aW9uIGZvciBDR0kgMy1zZWNvbmQgZGVsYXkgd2l0aCBzZXJ2ZXItc2lkZSBpbmNsdWRlczogaWYKICAgICBwcm9jZXNzaW5nIGEgc3VicmVxdWVzdCwgYWxsb2NhdGUgbWVtb3J5IGZyb20gci0+bWFpbi0+cG9vbCBpbnN0ZWFkCiAgICAgb2Ygci0+cG9vbCBzbyB0aGF0IHdlIGNhbiBhdm9pZCB3YWl0aW5nIGZvciBmcmVlX3Byb2NfY2hhaW4gdG8gY2xlYW51cAogICAgIGluIHRoZSBtaWRkbGUgb2YgYW4gU1NJIHJlcXVlc3QuICBbRGVhbiBHYXVkZXRdIFBSICMxMjIKCiAgKikgRml4ZWQgc3RhdHVzIG9mIHJlc3BvbnNlIHdoZW4gUE9TVCBpcyByZWNlaXZlZCBmb3IgYSBub25leGlzdGVudCBVUkwKICAgICAod2FzIHNlbmRpbmcgNDA1LCBub3cgNDA0KSBhbmQgd2hlbiBhbnkgbWV0aG9kIGlzIHNlbnQgd2l0aCBhCiAgICAgZnVsbC1VUkkgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgaXMgbm90IGFjdGluZwogICAgIGFzIGEgcHJveHkgKHdhcyBzZW5kaW5nIDUwMSwgbm93IDQwMykuICBbUm95IEZpZWxkaW5nXQoKICAqKSBIb3N0IHBvcnQgY2hhbmdlZCB0byB1bnNpZ25lZCBzaG9ydC4gW0tlbiBDb2FyXSBQUiAjMjc2CgogICopIEZpeCB0eXBvIGluIGNvbW1hbmQgZGVmaW5pdGlvbiBvZiBBdXRoQXV0aG9yaXRhdGl2ZS4gW0tlbiBDb2FyXSBQUiAjMjQ2CgogICopIERlZmluZWQgVVNFX1NITUdFVF9TQ09SRUJPQVJEIGZvciBzaGFyZWQgbWVtb3J5IG9uIExpbnV4LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXBvcnQgZXh0cmEgaW5mbyBmcm9tIGVycm5vIHdpdGggbWFueSBlcnJvcnMgdGhhdCBjYXVzZSBodHRwZCB0byBleGl0LgogICAgIHNwYXduX2NoaWxkLCBwb3BlbmYsIGFuZCBwY2xvc2VmIG5vdyBoYXZlIHZhbGlkIGVycm5vIHJldHVybnMgaW4gdGhlCiAgICAgZXZlbnQgb2YgYW4gZXJyb3IuICBDb3JyZWN0IHByb2JsZW1zIHdoZXJlIGVycm5vIHdhcyBzdG9tcGVkIG9uCiAgICAgYmVmb3JlIGJlaW5nIHJlcG9ydGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiB0aGUgcHJveHksIGlmIHRoZSBjYWNoZSBmaWxlc3lzdGVtIHdhcyBmdWxsLCBnYXJiYWdlX2NvbGwoKSB3YXMKICAgICBuZXZlciBjYWxsZWQsIGFuZCB0aHVzIHRoZSBmaWxlc3lzdGVtIHdvdWxkIHJlbWFpbiBmdWxsIGluZGVmaW5pdGVseS4KICAgICBXZSBub3cgYWxzbyByZW1vdmUgaW5jb21wbGV0ZSBjYWNoZSBmaWxlcyBsZWZ0IGlmIHRoZSBvcmlnaW4gc2VydmVyCiAgICAgZGlkbid0IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgYW5kIGVpdGhlciB0aGUgY2xpZW50IGhhcyBhYm9ydGVkCiAgICAgdHJhbnNmZXIgb3IgYndyaXRlKCkgdG8gY2xpZW50IGhhcyBmYWlsZWQuIFtQZXRyIExhbXBhXQoKICAqKSBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgbW9kdWxlIGFuZCBzY3JpcHQtYWRkZWQgaGVhZGVyIGZpZWxkcy4KICAgICBJbXByb3ZlZCB0aGUgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGhlYWRlciBmaWVsZHMgYW5kIHJlZHVjZWQKICAgICB0aGUgZHVwbGljYXRpb24gb2YgY29kZSBiZXR3ZWVuIHNlbmRpbmcgb2theSByZXNwb25zZXMgYW5kIGVycm9ycy4KICAgICBXZSBub3cgYWx3YXlzIHNlbmQgYm90aCBoZWFkZXJzX291dCBhbmQgZXJyX2hlYWRlcnNfb3V0LCBhbmQKICAgICBlbnN1cmUgdGhhdCB0aGUgc2VydmVyLXJlc2VydmVkIGZpZWxkcyBhcmUgbm90IGJlaW5nIG92ZXJyaWRkZW4sCiAgICAgd2hpbGUgbm90IG92ZXJyaWRpbmcgdGhvc2UgdGhhdCBhcmUgbm90IHJlc2VydmVkLiAgW1JveSBGaWVsZGluZ10KCiAgKikgTW92ZWQgdHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbiBmaWVsZHMgdG8gZXJyX2hlYWRlcnNfb3V0CiAgICAgdG8gcmVmbGVjdCBhYm92ZSBjaGFuZ2VzLiAgW1BldHIgTGFtcGFdCgogICopIEZpeGVkIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBtYWtlIHRoZQogICAgIGNvbm5lY3Rpb24gcGVyc2lzdGVudCBmb3IgYWxsIG9mIHRoZSBjYXNlcyB3aGVyZSBzb21lIG90aGVyIHBhcnQKICAgICBvZiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IGluZGljYXRlZCB0aGF0IHdlIHNob3VsZCBub3QuICBBbHNvCiAgICAgaW1wcm92ZWQgdGhlIG9yZGVyaW5nIG9mIHRoZSB0ZXN0IHNvIHRoYXQgY2h1bmtlZCBlbmNvZGluZyB3aWxsCiAgICAgYmUgc2V0IHdoZW5ldmVyIGl0IGlzIGRlc2lyZWQgaW5zdGVhZCBvZiBvbmx5IHdoZW4gS2VlcEFsaXZlCiAgICAgaXMgZW5hYmxlZC4gQWRkZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIGNhcGFiaWxpdHkgZm9yIG1vc3QgZXJyb3IKICAgICByZXNwb25zZXMgKHRob3NlIHRoYXQgZG8gbm90IGluZGljYXRlIGEgYmFkIGlucHV0IHN0cmVhbSkgd2hlbgogICAgIGFjY2Vzc2VkIGJ5IGFuIEhUVFAvMS4xIGNsaWVudC4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgbWlzc2luZyB0aW1lb3V0cyBmb3Igc2VuZGluZyBoZWFkZXIgZmllbGRzLCBlcnJvciByZXNwb25zZXMsCiAgICAgYW5kIHRoZSBsYXN0IGNodW5rIG9mIGNodW5rZWQgZW5jb2RpbmcsIGVhY2ggb2Ygd2hpY2ggY291bGQgaGF2ZQogICAgIHJlc3VsdGVkIGluIGEgcHJvY2VzcyBiZWluZyBzdHVjayBpbiB3cml0ZSBmb3JldmVyLiAgVXNpbmcgc29mdF90aW1lb3V0CiAgICAgcmVxdWlyZXMgdGhhdCB0aGUgc2VuZGVyIGNoZWNrIGZvciBhbiBhYm9ydGVkIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4KICAgICBjb250aW51aW5nIGFmdGVyIGFuIEVJTlRSLiAgVGltZW91dHMgdGhhdCB1c2VkIHRvIGJlIGluaXRpYXRlZCBiZWZvcmUKICAgICBzZW5kX2h0dHBfaGVhZGVyIChhbmQgbmV2ZXIga2lsbGVkKSBhcmUgbm93IGluaXRpYXRlZCBvbmx5IHdpdGhpbiBvcgogICAgIGFyb3VuZCB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSBkbyB0aGUgc2VuZGluZywgYW5kIG5vdCBhbGxvd2VkIHRvCiAgICAgcHJvcGFnYXRlIGFib3ZlIHRoZSBjYWxsZXIuICBbUm95IEZpZWxkaW5nXQoKICAqKSBtb2RfYXV0aF9hbm9uIHJlcXVpcmVkIGFuIEAgb3IgYSAuIGluIHRoZSBlbWFpbCBhZGRyZXNzLCBub3QgYm90aC4KICAgICBbRGlyayB2YW5HdWxpa10KCiAgKikgcGVyX2Rpcl9kZWZhdWx0cyB3ZXJlbid0IHNldCBjb3JyZWN0bHkgdW50aWwgZGlyZWN0b3J5X3dhbGsgZm9yCiAgICAgbmFtZS1iYXNlZCB2aG9zdHMuICBUaGlzIGZpeGVzIGFuIG9ic2N1cmUgYnVnIHdpdGggdGhlIHdyb25nIGNvbmZpZwogICAgIGluZm8gYmVpbmcgdXNlZCBmb3Igdmhvc3RzIHRoYXQgc2hhcmUgdGhlIHNhbWUgaXAgYXMgdGhlIHNlcnZlci4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEltcHJvdmVkIGdlbmVyYXRpb24gb2YgbW9kdWxlcy9NYWtlZmlsZSB0byBiZSBtb3JlIGdlbmVyaWMgZm9yCiAgICAgbmV3IG1vZHVsZSBkaXJlY3Rvcmllcy4gW0tlbiBDb2FyLCBDaHVjayBNdXJja28sIFJveSBGaWVsZGluZ10KCiAgKikgR2VuZXJhdGUgbWFrZWZpbGUgZGVwZW5kZW5jeSBmb3IgQ29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgYWN0dWFsCiAgICAgbmFtZSBnaXZlbiB3aGVuIHJ1bm5pbmcgdGhlIENvbmZpZ3VyZSBwcm9jZXNzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBwcm9ibGVtIHdpdGggdmhvc3QgZXJyb3IgbG9nIG5vdCBiZWluZyBzZXQgcHJpb3IgdG8KICAgICBpbml0aWFsaXppbmcgdmlydHVhbCBob3N0cy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBpbmZpbml0ZSBsb29wIHdoZW4gYSB0cmFpbGluZyBzbGFzaCBpcyBpbmNsdWRlZCBhZnRlciBhIHR5cGUgbWFwCiAgICAgZmlsZSBVUkwgKGV4dHJhIHBhdGggaW5mbykuIFtQZXRyIExhbXBhXQoKICAqKSBGaXhlZCBzZXJ2ZXIgc3RhdHVzIHVwZGF0aW5nIG9mIHBlci1jb25uZWN0aW9uIGNvdW50ZXJzLiBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgRE5TIGlzc3VlcyAocmVsaWFiaWxpdHkgYW5kIHNlY3VyaXR5KSwgYW5kIHRyeQogICAgIHRvIGV4cGxhaW4gdGhlIHZpcnR1YWwgaG9zdCBtYXRjaGluZyBwcm9jZXNzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUcnkgdG8gY29udGludWUgZ3JhY2VmdWxseSBieSBkaXNhYmxpbmcgdGhlIHZob3N0IGlmIGEgRE5TIGxvb2t1cAogICAgIGZhaWxzIHdoaWxlIHBhcnNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgSW1wcm92ZWQgY2FsbHMgdG8gc2V0c29ja29wdC4gIFtSb3kgRmllbGRpbmddCgogICopIE5lZ290aWF0aW9uIGNoYW5nZXM6IERvbid0IG91dHB1dCBlbXB0eSBjb250ZW50LXR5cGUgaW4gdmFyaWFudCBsaXN0OwogICAgIE91dHB1dCBjaGFyc2V0IGluIHZhcmlhbnQgbGlzdDsgUmV0dXJuIHNvb25lciBmcm9tIGhhbmRsZV9tdWx0aSgpIGlmCiAgICAgbm8gdmFyaWFudHMgZm91bmQ7IEFkZCBoYW5kbGluZyBvZiAnKicgd2lsZGNhcmQgaW4gQWNjZXB0LUNoYXJzZXQuCiAgICAgW1BldHIgTGFtcGEgYW5kIFBhdWwgU3V0dG9uXQoKICAqKSBGaXhlZCBvdmVybGF5aW5nIG9mIHJlcXVlc3Qvc3ViLXJlcXVlc3Qgbm90ZXMgYW5kIGhlYWRlcnMgaW4KICAgICBtb2RfbmVnb3RpYXRpb24uICBbRGVhbiBHYXVkZXRdCgogICopIElmIHR3byB2YXJpYW50cycgY2hhcnNldCBxdWFsaXR5IGFyZSBlcXVhbCBhbmQgb25lIGlzIHRoZSBkZWZhdWx0CiAgICAgY2hhcnNldCAoaXNvLTg4NTktMSksIHRoZW4gcHJlZmVyIHRoZSB2YXJpYW50IHRoYXQgd2FzIHNwZWNpZmljYWxseQogICAgIGxpc3RlZCBpbiBBY2NlcHQtQ2hhcnNldCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LiAgW1BldHIgTGFtcGFdCgogICopIE1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gcHVzaF9hcnJheSgpIC0tIGl0IHdvdWxkIGNvcnJ1cHQgbWVtb3J5CiAgICAgd2hlbiBuYWxsb2M9PTAuICBbS2FpIFJpc2t1IDxrcmlza3VAdGYuaHV0LmZpPiBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBpbnZva2VfaGFuZGxlcigpIGRvZXNuJ3QgaGFuZGxlIG1pbWUgYXJndW1lbnRzIGluIGNvbnRlbnQtdHlwZQogICAgIFtQZXRyIExhbXBhXSBQUiMxNjAKCiAgKikgUmVkdWNlZCBJZGVudGl0eUNoZWNrIHRpbWVvdXQgdG8gMzAgc2Vjb25kcywgYXMgcGVyIFJGQyAxNDEzIG1pbmltdW0uCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXhlZCBwcm9ibGVtIHdpdGggRXJyb3JEb2N1bWVudCBub3Qgd29ya2luZyBmb3IgdmlydHVhbCBob3N0cwogICAgIGR1ZSB0byBvbmUgb2YgdGhlIHBlcmZvcm1hbmNlIGNoYW5nZXMgaW4gMS4yYjcuIFtEZWFuIEdhdWRldF0KCiAgKikgTG9nIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgZ2V0IGEgcmVxdWVzdCBoZWFkZXIgdGhhdCBpcyB0b28gbG9uZywKICAgICBzaW5jZSBpdCBtYXkgaW5kaWNhdGUgYSBidWZmZXIgb3ZlcmZsb3cgYXR0YWNrLiBbTWFyYyBTbGVta29dCgogICopIE1hZGUgaXNfdXJsKCkgYWxsb3cgIlstLithLXpBLVowLTldKzoiIGFzIGEgdmFsaWQgc2NoZW1lIGFuZAogICAgIG5vdCByZWplY3QgVVJMcyB3aXRob3V0IGEgZG91YmxlLXNsYXNoLCBhcyBwZXIgUkZDMjA2OCBzZWN0aW9uIDMuMi4KICAgICBbS2VuIENvYXJdIFBSICMxNDYsICMxODcKCiAgKikgQWRkZWQgdGFibGUgZW50cnkgcGxhY2Vob2xkZXIgZm9yIG5ldyBoZWFkZXJfcGFyc2VyIGNhbGxiYWNrCiAgICAgaW4gYWxsIG9mIHRoZSBkaXN0cmlidXRlZCBtb2R1bGVzLiBbS2VuIENvYXJdIFBSICMxOTEKCiAgKikgQWxsb3cgZm9yIGNnaSBmaWxlcyB3aXRob3V0IHRoZSAuRVhFIGV4dGVuc2lvbiBvbiB0aGVtIHVuZGVyIE9TLzIuCiAgICAgW0dhcmV5IFNtaWxleV0gUFIgIzU5CgogICopIEZpeGVkIGVycm9yIG1lc3NhZ2Ugd2hlbiByZXNvdXJjZSBpcyBub3QgZm91bmQgYW5kIFVSTCBjb250YWlucwogICAgIHBhdGggaW5mby4gW1BldHIgTGFtcGEgYW5kIERlYW4gR2F1ZGV0XSBQUiAjNDAKCiAgKikgRml4ZWQgdXNlciBhbmQgc2VydmVyIGNvbmZ1c2lvbiBvdmVyIHdoYXQgc2hvdWxkIGJlIGEgdmlydHVhbCBob3N0CiAgICAgYW5kIHdoYXQgaXMgdGhlIG1haW4gc2VydmVyLCByZXN1bHRpbmcgaW4gYWNjZXNzIHRvIHNvbWV0aGluZwogICAgIG90aGVyIHRoYW4gdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgdmlydHVhbGhvc3QgZGlyZWN0aXZlIChidXQKICAgICB3aXRoIHRoZSBzYW1lIElQIGFkZHJlc3MpIGZhaWxpbmcuIFtEZWFuIEdhdWRldF0KCiAgKikgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byB2ZXJzaW9uIDMuMC4yLCB3aGljaDogZml4ZXMgY29tcGlsZSBlcnJvciBvbgogICAgIEFJWDsgaW1wcm92ZXMgdGhlIHJlZGlyZWN0aW9uIHN0dWZmIHRvIGVuYWJsZSB0aGUgdXNlcnMgdG8gZ2VuZXJhbGx5CiAgICAgcmVkaXJlY3QgdG8gaHR0cCwgaHR0cHMsIGdvcGhlciBhbmQgZnRwOyBhZGRlZCBUSU1FIHZhcmlhYmxlIGZvcgogICAgIFJld3JpdGVDb25kIHdoaWNoIGV4cGFuZHMgdG8gWVlZWU1NRERISE1NU1Mgc3RyaW5ncyBhbmQgYWRkZWQgdGhlCiAgICAgc3BlY2lhbCBwYXR0ZXJucyA+U1RSSU5HLCA8U1RSSU5HIGFuZCA9U1RSSU5HIHRvIFJld3JpdGVDb25kLCB3aGljaAogICAgIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJXtUSU1FfSBvciBvdGhlciB2YXJpYWJsZXMgdG8gY3JlYXRlCiAgICAgdGltZS1kZXBlbmRlbnQgcmV3cml0aW5nIHJ1bGVzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgYnB1c2hmZCgpIG5vIGxvbmdlciBub3RlcyBjbGVhbnVwcyBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvcnMgaXQgaXMgaGFuZGVkLgogICAgIE1vZHVsZSBhdXRob3JzIG1heSBuZWVkIHRvIGFkanVzdCB0aGVpciBjb2RlIGZvciBwcm9wZXIgY2xlYW51cCB0byB0YWtlCiAgICAgcGxhY2UgKHRoYXQgaXMsIGNhbGwgbm90ZV9jbGVhbnVwc19mb3JfZmQoKSkuIFRoaXMgY2hhbmdlIGZpeGVzIHByb2JsZW1zCiAgICAgd2l0aCBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIGVycm9uZW91c2x5IGNsb3NlZCB3aGVuIHRoZSBwcm94eSBtb2R1bGUgd2FzCiAgICAgaW4gdXNlLiBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ1ZyBpbiBzdWV4ZWMgcmVpbnRyb2R1Y2VkIGJ5IGNoYW5nZXMgaW4gMS4yYjcgd2hpY2ggYWxsb3dzCiAgICAgaW5pdGdyb3VwcygpIHRvIGhvc2UgdGhlIGdyb3VwIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgbGF0ZXIKICAgICBjb21wYXJpc29ucy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxsIHRvIHZhX2VuZCgpIGluIGNyZWF0ZV9hcmd2KCkgd2hpY2gKICAgICBjYXVzZWQgYSBTRUdWIG9uIHNvbWUgc3lzdGVtcy4KCiAgKikgVXNlIHByb3BlciBNQVhIT1NUTkFNRUxFTiBzeW1ib2wgZm9yIGxpbWl0aW5nIGxlbmd0aCBvZiBzZXJ2ZXIgbmFtZS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIENsZWFyIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxpc3RlbmVycy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIEltcHJvdmVkIGhhbmRsaW5nIG9mIElQIGFkZHJlc3MgYXMgYSB2aXJ0dWFsaG9zdCBhZGRyZXNzIGFuZAogICAgIGludHJvZHVjZWQgIl9kZWZhdWx0XyIgYXMgYSBzeW5vbnltIGZvciB0aGUgZGVmYXVsdCB2aG9zdCBjb25maWcuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiAjMjEyCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI3CgogICopIFBvcnQgdG8gIFVYUC9EUyhWMjApIFtUb3NoaWFraSBOb211cmEgPG5vbUB5ay5mdWppdHN1LmNvLmpwPl0KCiAgKikgdW5zZXQgQ29udGVudC1MZW5ndGggaWYgY2h1bmtlZCAoUkZDLTIwNjgpIFtQZXRyIExhbXBhXQoKICAqKSBtb2RfbmVnb3RpYXRpb24gZml4ZXMgW1BldHIgTGFtcGFdIFBSIzE1NywgUFIjMTU4LCBQUiMxNTkKICAgICAtIHJlcGxhY2UgcHJvdG9jb2wgcmVzcG9uc2UgbnVtYmVycyB3aXRoIHN5bWJvbHMKICAgICAtIHNhdmUgdmFyaWFudC1saXN0IGludG8gbWFpbiByZXF1ZXN0IG5vdGVzCiAgICAgLSBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBzdWJyZXF1ZXN0cwogICAgIC0gbWVyZ2Ugbm90ZXMsIGhlYWRlcnNfb3V0IGFuZCBlcnJfaGVhZGVyc19vdXQKCiAgKikgY2hhbmdlZCBzdGF0dXMgY2hlY2sgbWFzayBpbiBwcm94eV9odHRwLmMgZnJvbSAiSFRUUC8jLiMgIyMjICoiIHRvCiAgICAgIkhUVFAvIy4jICMjIyoiIHRvIGJlIG1vcmUgbGVuaWVudCBhYm91dCB3aGF0IHdlIGFjY2VwdC4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBtb3JlIHByb3h5IEZUUCBidWcgZml4ZXM6CiAgICAgLSBDaGFuZ2VkIHNlbmRfZGlyKCkgdG8gcmVtb3ZlIHVzZXIvcGFzc3dkIGZyb20gZGlzcGxheWVkIFVSTC4KICAgICAtIENoYW5nZWQgbG9naW4gZXJyb3IgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXNjcmlwdGl2ZS4KICAgICAtIHJlbW92ZSBzZXR0aW5nIG9mIFNPX0RFQlVHIHNvY2tldCBvcHRpb24KICAgICAtIE1ha2UgZnRwX2dldHJjKCkgbW9yZSBsZW5pZW50IGFib3V0IG11bHRpbGluZSByZXNwb25zZXMsCiAgICAgICBzcGVjaWZpY2FsbHksIDIzMCByZXNwb25zZXMgd2hpY2ggZG9uJ3QgaGF2ZSBjb250aW51YXRpb24gMjMwLQogICAgICAgb24gZWFjaCBsaW5lKS4gVGhlc2Ugc2VlbSB0byBiZSBhbGwgTlQgRlRQIHNlcnZlcnMsIGFuZCB3aGlsZQogICAgICAgcGVyaGFwcyBxdWVzdGlvbmFibGUsIHRoZXkgYXBwZWFyIHRvIGJlIGxlZ2FsIGJ5IFJGQyA5NTkuCiAgICAgLSBBZGQgbWlzc2luZyBraWxsX3RpbWVvdXQoKSBhZnRlciB0cmFuc2ZlciB0byB1c2VyIGNvbXBsZXRlcy4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBGaXhlZCBwcm9ibGVtIHdoZXJlIGEgYnVzeSBzZXJ2ZXIgY291bGQgaGFuZyB3aGVuIHJlc3RhcnRpbmcKICAgICBhZnRlciBiZWluZyBzZW50IGEgU0lHSFVQIGR1ZSB0byBjaGlsZCBwcm9jZXNzZXMgbm90IGV4aXRpbmcuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBNb2RpZnkgbW9kX2luY2x1ZGUgZXNjYXBpbmcgc28gYSAnXCcgb25seSBzaWduaWZpZXMgYW4gZXNjYXBlZAogICAgIGNoYXJhY3RlciBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgb25lIHRoYXQgbmVlZHMKICAgICBlc2NhcGluZy4gIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGVkIHBvc3NpYmxlIGluZmluaXRlIGxvb3AgaW4gbW9kX2ltYXAgd2hlbiByZWxhdGl2ZSBVUkxzIGFyZQogICAgIHVzZWQgd2l0aCBhICdiYXNlJyBkaXJlY3RpdmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgJy8nIGluIGl0LgogICAgIFtNYXJjIFNsZW1rbywgcmVwb3J0ZWQgYnkgT25ubyBXaXR2bGlldCA8b25ub0B0Yy5oc2Eubmw+XQoKICAqKSBSZWR1Y2VkIHRoZSBkZWZhdWx0IHRpbWVvdXQgZnJvbSAxMjAwIHNlY29uZHMgdG8gMzAwLCBhbmQgdGhlCiAgICAgb25lIGluIHRoZSBzYW1wbGUgY29uZmlnZmlsZSBmcm9tIDQwMCB0byAzMDAuICBbTWFyYyBTbGVta29dCgogICopIFN0b3AgdmJwcmludGYgZnJvbSBjcmFzaGluZyBpZiBnaXZlbiBhIE5VTEwgc3RyaW5nIHBvaW50ZXI7CiAgICAgcHJpbnQgKG51bGwpIGluc3RlYWQuICBbS2VuIENvYXJdCgogICopIERvbid0IGRpc2FibGUgTmFnbGUgYWxnb3JpdGhtIGlmIHN5c3RlbSBkb2Vzbid0IGhhdmUgVENQX05PREVMQVkuCiAgICAgW01hcmMgU2xlbWtvIGFuZCBSb3kgRmllbGRpbmddCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBtb2RfY2dpLWdlbmVyYXRlZCBpbnRlcm5hbCByZWRpcmVjdHMgdHJ5aW5nIHRvCiAgICAgcmVhZCB0aGUgcmVxdWVzdCBtZXNzYWdlLWJvZHkgdHdpY2UuIFtBcmNoaWUgQ29iYnMgYW5kIFJveSBGaWVsZGluZ10KCiAgKikgUmVkdWNlZCB0aW1lb3V0IG9uIGxpbmdlcmluZyBjbG9zZSwgcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIGJsb2NrZWQKICAgICByZWFkIGNhdXNpbmcgdGhlIGNoaWxkIHRvIGhhbmcsIGFuZCBzdG9wcGVkIGxvZ2dpbmcgb2YgZXJyb3JzIGlmCiAgICAgdGhlIHNvY2tldCBpcyBub3QgY29ubmVjdGVkIChyZXNldCBieSBjbGllbnQpLiAgW1JveSBGaWVsZGluZ10KCiAgKikgUmVhcnJhbmdlZCBtYWluIGNoaWxkIGxvb3AgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIG9mIGNvZGUgaW4KICAgICBzZWxlY3QvYWNjZXB0IGFuZCBrZWVwLWFsaXZlIHJlcXVlc3RzLCBmaXhlZCBzZXZlcmFsIGJ1Z3MgcmVnYXJkaW5nCiAgICAgY2hlY2tpbmcgc2NvcmVib2FyZF9pbWFnZSBmb3IgZXhpdCBpbmRpY2F0aW9uIGFuZCBmYWlsdXJlIHRvCiAgICAgYWNjb3VudCBmb3IgYWxsIHN1Y2Nlc3MgY29uZGl0aW9ucyBhbmQgdHJhcCBhbGwgZXJyb3IgY29uZGl0aW9ucywKICAgICBwcmV2ZW50ZWQgbXVsdGlwbGUgZmx1c2hlcyBiZWZvcmUgY2xvc2luZyB0aGUgc29ja2V0OyBjbG9zZSB0aGUgZW50aXJlCiAgICAgc29ja2V0IGJ1ZmZlciBpbnN0ZWFkIG9mIGp1c3Qgb25lIGRlc2NyaXB0b3IsIHByZXZlbnQgbG9nZ2luZyBvZgogICAgIEVQUk9UTyBhbmQgRUNPTk5BQk9SVEVEIG9uIHBsYXRmb3JtcyB3aGVyZSBzdXBwb3J0ZWQsIGFuZCBnZW5lcmFsbHkKICAgICBpbXByb3ZlZCByZWFkYWJpbGl0eS4gIFtSb3kgRmllbGRpbmddCgogICopIEV4dGVuc2l2ZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuIENsZWFuZWQgdXAgaW5lZmZpY2llbnQgdXNlIG9mCiAgICAgYXV0byBpbml0aWFsaXplcnMsIG11bHRpcGxlIGlzX21hdGNoZXhwIGNhbGxzIG9uIGEgc3RhdGljIHN0cmluZywKICAgICBhbmQgZXhjZXNzaXZlIG1lcmdpbmcgb2YgcmVzcG9uc2VfY29kZV9zdHJpbmdzLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIGRvdWJsZS1idWZmZXJpbmcgdG8gbW9kX2luY2x1ZGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbgogICAgIHNlcnZlci1zaWRlIGluY2x1ZGVzLiBbTWFyYyBTbGVta29dCgogICopIFNldmVyYWwgZml4ZXMgZm9yIHN1ZXhlYyB3cmFwcGVyLiBbUmFuZHkgVGVyYnVzaF0KICAgICAtIE1ha2Ugd3JhcHBlciB3b3JrIGZvciBmaWxlcyBvbiBORlMgZmlsZXN5c3RlbS4KICAgICAtIEZpeCBwb3J0YWJpbGl0eSBwcm9ibGVtIG9mIE1BWFBBVEhMRU4uCiAgICAgLSBGaXggYXJyYXkgb3ZlcnJ1biBwcm9ibGVtIGluIGNsZWFuX2VudigpLgogICAgIC0gRml4IGFsbG9jYXRpb24gb2YgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQoKICAqKSBSZW1vdmVkIGV4dHJhbmVvdXMgYmxhbmsgbGluZSBpcyBkZXNjcmlwdGlvbiBvZiBtb2Rfc3RhdHVzIGNoYXJzLgogICAgIFtLdXJ0IEtvaGxlcl0KCiAgKikgTG9nZ2luZyBvZiBlcnJvcnMgZnJvbSB0aGUgY2FsbF9leGVjIHJvdXRpbmUgc2ltcGx5IHdlbnQgbm93aGVyZSwKICAgICBzaW5jZSB0aGUgbG9nZmlsZSBmZCBoYXMgYmVlbiBjbG9zZWQsIHNvIG5vdyB3ZSBzZW5kIHRoZW0gdG8gc3RkZXJyLgogICAgIFtIYXJhbGQgVC4gQWx2ZXN0cmFuZF0KCiAgKikgRml4ZWQgY29yZSBkdW1wIHdoZW4gRG9jdW1lbnRSb290IGlzIGEgQ0dJLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBnZWRkaXNAdGVzc2VyYWUuY29tXQoKICAqKSBGaXhlZCBwb3RlbnRpYWwgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gbW9kX2FzaXM7IHVwZGF0ZWQgaXQgYW5kCiAgICAgaHR0cF9jb3JlIHRvIHVzZSBwZm9wZW4vcGZjbG9zZSBpbnN0ZWFkIG9mIGZvcGVuL2ZjbG9zZS4KICAgICBbUmFuZHkgVGVyYnVzaCBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBGaXhlZCBoYW5kbGluZyBvZiB1bnNpZ25lZCBpbnRzIGluIGFwX3NucHJpbnRmKCkgb24gc29tZSBjaGlwcyBzdWNoCiAgICAgYXMgdGhlIERFQyBBbHBoYSB3aGljaCBpcyA2NC1iaXQgYnV0IHVzZXMgMzItYml0IGludHMuCiAgICAgW0RlYW4gR2F1ZGV0IGFuZCBLZW4gQ29hcl0KCiAgKikgUmV0dXJuIGEgMzAyIHJlc3BvbnNlIGNvZGUgdG8gdGhlIGNsaWVudCB3aGVuIHNlbmRpbmcgYSByZWRpcmVjdAogICAgIGR1ZSB0byBhIG1pc3NpbmcgdHJhaWxpbmcgJy8nIG9uIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSAzMDE7IG5vdwogICAgIGl0IGlzIGNhY2hlYWJsZS4gW01hcmt1cyBHeWdlcl0KCiAgKikgRml4IGNvbmRpdGlvbiB3aGVyZSwgaWYgYSBiYWQgZGlyZWN0aXZlIG9jY3VycyBpbiAuaHRhY2Nlc3MsIGFuZAogICAgIHN1Yl9yZXF1ZXN0KCkgZ29lcyBmaXJzdCB0byB0aGlzIGRpcmVjdG9yeSwgdGhlbiBsb2dfcmVhc29uKCkgd2lsbAogICAgIFNJR1NFR1YgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgaW5pdGlhbGl6ZWQgci0+cGVyX2Rpcl9jb25maWcuCiAgICAgW1BSIzE2MiBmcm9tIFBldHIgTGFtcGEsIGZpeCBieSBNYXJjIFNsZW1rbyBhbmQgRGVhbiBHYXVkZXRdCgogICopIEZpeCBoYW5kbGluZyBvZiBsYW5nX2luZGV4IGluIGlzX3ZhcmlhbnRfYmV0dGVyKCkuICBUaGlzIHdhcwogICAgIGNhdXNpbmcgcHJvYmxlbXMgd2hpY2ggcmVzdWx0ZWQgaW4gdGhlIHNlcnZlciBzZW5kaW5nIHRoZQogICAgIHdyb25nIGxhbmd1YWdlIGRvY3VtZW50IGluIHNvbWUgY2FzZXMuIFtQZXRyIExhbXBhXQoKICAqKSBSZW1vdmUgZnJlZSgpIGZyb20gY2xlYW5fZW52KCkgaW4gc3VleGVjIHdyYXBwZXIuIFRoaXMgd2FzIG51a2luZwogICAgIHRoZSBjbGVhbiBlbnZpcm9ubWVudCBvbiBzb21lIHN5c3RlbXMuCgogICopIFR3ZWFrIGJ5dGVzZXJ2aW5nIGNvZGUgKGUuZy4gc2VydmluZyBQREYgZmlsZXMpIHRvIHdvcmsgYXJvdW5kCiAgICAgYnVncyBpbiBOZXRzY2FwZSBOYXZpZ2F0b3IgYW5kIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3Jlci4KICAgICBFbWl0IENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aGVuIHNlbmRpbmcgbXVsdGlwYXJ0L2J5dGVyYW5nZXMuCiAgICAgW0FsZXhlaSBLb3N1dF0KCiAgKikgUG9ydCB0byBISS1VWC9XRTIuIFtOaWNrIE1hY2xhcmVuXQoKICAqKSBQb3J0IHRvIEhQIE1QRSBvcGVyYXRpbmcgc3lzdGVtIGZvciBIUCAzMDAwIG1hY2hpbmVzCiAgICAgW01hcmsgQml4YnkgPG1hcmtiQGNjY2QuZWR1Pl0KCiAgKikgRml4ZWQgYnVnIHdoaWNoIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBmYXVsdCBpZiBvbmx5IG9uZSBhcmd1bWVudAogICAgIGdpdmVuIHRvIFJMaW1pdCogZGlyZWN0aXZlcy4gW0VkIEtvcnRob2ZdCgogICopIENvbnRpbnVlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBhZnRlciAyMDQgb3IgMzA0IHJlc3BvbnNlLiBbRGVhbiBHYXVkZXRdCgogICopIEltcHJvdmVkIGJ1ZmZlcmVkIG91dHB1dCB0byB0aGUgY2xpZW50IGJ5IGRlbGF5aW5nIHRoZSBmbHVzaCBkZWNpc2lvbgogICAgIHVudGlsIHRoZSBCVUZGIGNvZGUgaXMgYWN0dWFsbHkgYWJvdXQgdG8gcmVhZCB0aGUgbmV4dCByZXF1ZXN0LgogICAgIFRoaXMgZml4ZXMgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gMS4yYjUgd2l0aCBjbGllbnRzIHRoYXQgc2VuZAogICAgIGFuIGV4dHJhIENSTEYgYWZ0ZXIgYSBQT1NUIHJlcXVlc3QuIEFsc28gaW1wcm92ZWQgY2h1bmtlZCBvdXRwdXQKICAgICBwZXJmb3JtYW5jZSBieSBjb21iaW5pbmcgd3JpdGVzIHVzaW5nIHdyaXRldigpIGFuZCByZW1vdmluZyBhcwogICAgIG1hbnkgYmZsdXNoKCkgY2FsbHMgYXMgcG9zc2libGUuICBOT1RFOiBQbGF0Zm9ybXMgd2l0aG91dCB3cml0ZXYoKQogICAgIG11c3QgYWRkIC1ETk9fV1JJVEVWIHRvIHRoZSBjb21waWxlciBDRkxBR1MsIGVpdGhlciBpbiBDb25maWd1cmF0aW9uCiAgICAgb3IgQ29uZmlndXJlLCB1bmxlc3Mgd2UgaGF2ZSBhbHJlYWR5IGRvbmUgc28uICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIG1vZF9yZXdyaXRlIGJ1ZyB3aGljaCB0cnVuY2F0ZWQgdGhlIHJld3JpdHRlbiBVUkwgW01hcmMgU2xlbWtvXQoKICAqKSBGaXhlZCBtb2RfaW5mbyBvdXRwdXQgY29ycnVwdGlvbiBidWcgaW50cm9kdWNlZCBieSBidWZmZXIgb3ZlcmZsb3cKICAgICBmaXhlcy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBodHRwX3Byb3RvY29sIHRvIGNvcnJlY3RseSBvdXRwdXQgYWxsIEhUVFAvMS4xIGhlYWRlcnMsIGluY2x1ZGluZwogICAgIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgMzA0IHJlc3BvbnNlLiAgW1BhdWwgU3V0dG9uXQoKICAqKSBJbXByb3ZlZCBoYW5kbGluZyBvZiBUUkFDRSBtZXRob2QgYnkgYnlwYXNzaW5nIG5vcm1hbCBtZXRob2QgaGFuZGxpbmcKICAgICBhbmQgaGVhZGVyIHBhcnNpbmcgcm91dGluZXM7IGZpeGVkIEFsbG93IHJlc3BvbnNlIHRvIGFsd2F5cyBhbGxvdyBUUkFDRS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIHRoZSByZWdleCBsaWJyYXJ5LiBbRGVhbiBHYXVkZXRdCgogICopIENsZWFuZWQtdXAgc29tZSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwuIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjYKCiAgKikgQWxsb3cgd2hpdGVzcGFjZSBpbiBpbWFnZW1hcCBtYXBmaWxlIGNvb3JkaW5hdGVzLiBbTWFyYyBTbGVta29dCgogICopIEZpeCB0eXBvIGludHJvZHVjZWQgaW4gZml4IGZvciBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBhcm91bmQKICAgICBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkuIFRoaXMgY2hhbmdlIGNhdXNlZCB0aGUgcmV2IHRvIDEuMmI2LgogICAgIDEuMmI1IHdhcyBuZXZlciBhIHB1YmxpYyBiZXRhLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiNQoKICAqKSBDaGFuZ2UgS2VlcEFsaXZlIHNlbWFudGljcyAoT258T2ZmIGluc3RlYWQgb2YgYSBudW1iZXIpLCBhZGQKICAgICBNYXhLZWVwQWxpdmVSZXF1ZXN0cyBkaXJlY3RpdmUuIFtBbGV4ZWkgS29zdXRdCgogICopIFZhcmlvdXMgTmVYVCBjb21waWxhdGlvbiBwYXRjaGVzLCBhcyB3ZWxsIGFzIGEgY2hhbmdlIGluCiAgICAgcmVnZXgvcmVnY29tcC5jIHNpbmNlIHRoYXQgZmlsZSBhbHNvIHVzZWQgYSBORVhUIGRlZmluZS4KICAgICBbQW5kcmVhcyBLb2VuaWddCgogICopIEFsbG93ICogdG8gdGVybWluYXRlIHRoZSBlbmQgb2YgYSBkaXJlY3RvcnkgbWF0Y2ggaW4gbW9kX2Rpci4KICAgICBBbGxvd3MgL34qIHRvIG1hdGNoIGZvciBib3RoIC9+am9lIGFuZCAvfmpvZS8uIFtEYXZpZCBCcm9uZGVyXQoKICAqKSBEb24ndCBjYWxsIGNhbl9leGVjKCkgaWYgc3VleGVjX2VuYWJsZWQuIENhbGxpbmcgdGhpcyByZXF1aXJlcwogICAgIHNjcmlwdHMgZXhlY3V0ZWQgYnkgdGhlIHN1ZXhlYyB3cmFwcGVyIHRvIGJlIHdvcmxkIGV4ZWN1dGFibGUsIHdoaWNoCiAgICAgZGVmZWF0cyBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgcnVubmluZyB0aGUgd3JhcHBlci4gW1JhbmR5IFRlcmJ1c2hdCgogICopIFBvcnRhYmlsaXR5IEZpeDogSVJJWCBjb21wbGFpbmVkIHdpdGggJ21ha2UgY2xlYW4nIGFib3V0ICpwdXJlKiAocmVtb3ZlZCkKICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgTWlncmF0aW9uIGZyb20gc3ByaW50ZigpIHRvIHNucHJpbnRmKCkgdG8gYXZvaWQgYnVmZmVyCiAgICAgb3ZlcmZsb3dzLiBbTWFyYyBTbGVta29dCgogICopIFByb3ZpZGUgcG9ydGFibGUgc25wcmludGYoKSBpbXBsZW1lbnRhdGlvbiAoYXBfc25wcmludGYpCiAgICAgYXMgd2VsbCBhcyAqY3Z0IGZhbWlseS4gW0ppbSBKYWdpZWxza2ldCgogICopIFBvcnRhYmlsaXR5IEZpeDogTmVYVCBsYWNrcyB1bmlzdGQuaCBzbyB3ZSB3cmFwIGl0J3MgaW5jbHVzaW9uCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFJlbW92ZSBtb2RfZmFzdGNnaS5jIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4gVGhpcyBtb2R1bGUgYXBwZWFycwogICAgIHRvIGJlIG1haW50YWluZWQgbW9yZSB0aHJvdWdoIHRoZSBPcGVuIE1hcmtldCBjaGFubmVscyBhbmQgc2hvdWxkCiAgICAgY29udGludWUgdG8gYmUgZWFzaWx5IGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmZhc3RjZ2kuY29tLwoKICAqKSBGaXhlZCBidWcgaW4gbW9kdWxlcy9NYWtlZmlsZSB0aGF0IHdvdWxkbid0IGFsbG93IGJ1aWxkaW5nIGluIG1vcmUKICAgICB0aGFuIG9uZSBzdWJkaXJlY3RvcnkgKG9yIGNsZWFuaW5nLCBlaXRoZXIpLiBbSmVyZW15IExhaWRtYW5dCgogICopIG1vZF9pbmZvIGFzc3VtZWQgdGhhdCB0aGUgY29uZmlnIGZpbGVzIHdlcmUgcmVsYXRpdmUgdG8gU2VydmVyUm9vdC4KICAgICBbS2VuIHRoZSBSb2RlbnRdCgogICopIENHSSBzY3JpcHRzIGNhbGxlZCBhcyBhbiBlcnJvciBkb2N1bWVudCByZXN1bHRpbmcgZnJvbSBmYWlsZWQKICAgICBDR0kgZXhlY3V0aW9uIHdvdWxkIGhhbmcgd2FpdGluZyBmb3IgUE9TVCdlZCBkYXRhLiBbUm9iIEhhcnRpbGxdCgogICopIExvZyByZWFzb24gd2hlbiBtb2RfZGlyIHJldHVybnMgYWNjZXNzIEhUVFBfRk9SQklEREVOCiAgICAgW0tlbiB0aGUgUm9kZW50XQoKICAqKSBQcm9wZXJseSBjaGVjayBlcnJubyB0byBwcmV2ZW50IGRpc3BsYXkgb2YgYSBkaXJlY3RvcnkgaW5kZXgKICAgICB3aGVuIHNlcnZlciByZWNlaXZlcyBhIGxvbmcgZW5vdWdoIFVSTCB0byBjb25mdXNlIHN0YXQoKS4KICAgICBbTWFyYyBTbGVta29dCgogICopIFNldmVyYWwgc2VjdXJpdHkgZW5oYW5jZW1lbnRzIHRvIHN1ZXhlYyB3cmFwcGVyLiBJdCBpcyBfaGlnaGx5XwogICAgIHJlY29tbWVuZGVkIHRoYXQgcHJldmlvdXNseSBpbnN0YWxsZWQgdmVyc2lvbnMgb2YgdGhlIHdyYXBwZXIKICAgICBiZSByZXBsYWNlZCB3aXRoIHRoaXMgdmVyc2lvbi4gIFtSYW5keSBUZXJidXNoLCBKYXNvbiBEb3VyXQoKICAgICAgICAtIH51c2VyIGV4ZWN1dGlvbiBub3cgcHJvcGVybHkgcmVzdHJpY3RlZCB0byB+dXNlcidzIGhvbWUKICAgICAgICAgIGRpcmVjdG9yeSBhbmQgYmVsb3cuCiAgICAgICAgLSBleGVjdXRpb24gcmVzdHJpY3RlZCB0byBVSUQvR0lEID4gMTAwCiAgICAgICAgLSByZXN0cmljdCBwYXNzZWQgZW52aXJvbm1lbnQgdG8ga25vd24gdmFyaWFibGVzCiAgICAgICAgLSBjYWxsIHNldGdpZCgpIGJlZm9yZSBpbml0Z3JvdXBzKCkgKHBvcnRhYmlsaXR5IGZpeCkKICAgICAgICAtIHJlbW92ZSB1c2Ugb2Ygc2V0ZW52KCkgKHBvcnRhYmlsaXR5IGZpeCkKCiAgKikgQWRkIEhUVFAvMS4wIHJlc3BvbnNlIGZvcmNpbmcuIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYWNjZXNzIGNvbnRyb2wgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcy4gW0JlbiBMYXVyaWVdCgogICopIEFkZCByZmx1c2goKSBmdW5jdGlvbi4gW0FsZXhlaSBLb3N1dF0KCiAgKikgcmVtb3ZlIGR1cGxpY2F0ZSBwY2FsbG9jKCkgY2FsbCBpbiBuZXdfY29ubmVjdGlvbigpLgoKICAqKSBGaXggaW5jb3JyZWN0IGNvbXBhcmlzb24gd2hpY2ggY291bGQgYWxsb3cgbnVtYmVyIG9mIGNoaWxkcmVuID0KICAgICBNYXhDbGllbnRzICsgMSBpZiBsZXNzIHRoYW4gSEFSRF9TRVJWRVJfTElNSVQuIEFsc28gZml4IHBvdGVudGlhbAogICAgIHByb2JsZW0gaWYgU3RhcnRTZXJ2ZXJzID4gSEFSRF9TRVJWRVJfTElNSVQuIFtFZCBLb3J0aG9mXQoKICAqKSBVcGRhdGVkIHN1cHBvcnQgZm9yIE9TZXMgKE1hY2hUZW4sIFVMVFJJWCwgUGFyYWdvbiwgSVNDLCBPcGVuQlNECiAgICAgQUlYIFBTLzIsIENPTlZFWE9TLiBbSmltIEphZ2llbHNraV0KCiAgKikgUmVwbGFjZSBpbnN0YW5jZXMgb2YgaW5ldF9udG9hKCkgd2l0aCBpbmV0X2FkZHIoKSBmb3IgUHJveHlCbG9jay4KICAgICBJdCdzIG1vcmUgcG9ydGFibGUuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVwbGFjZSByZWZlcmVuY2VzIHRvIG1ha2UgaW4gTWFrZWZpbGUudG1wbCB3aXRoICQoTUFLRSkuCiAgICAgW0NodWNrIE11cmNrb10KCiAgKikgQWRkIFByb3h5QmxvY2sgZGlyZWN0aXZlIHcvSVAgYWRkcmVzcyBjYWNoaW5nLiBBZGQgSVAgYWRkcmVzcwogICAgIGNhY2hpbmcgdG8gTm9DYWNoZSBkaXJlY3RpdmUgYXMgd2VsbC4gUHJveHlCbG9jayB3b3JrcyB3aXRoIGFsbAogICAgIGhhbmRsZXJzOyBOb0NhY2hlIG5vdyBhbHNvIHdvcmtzIHdpdGggRlRQIGZvciBhbm9ueW1vdXMgbG9naW5zLgogICAgIFN0aWxsIG1vcmUgY29kZSBjbGVhbnVwLiBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGQgImhlYWRlciBwYXJzZSIgQVBJIGhvb2sgW0JlbiBMYXVyaWVdCgogICopIEZpeCBieXRlIG9yZGVyaW5nIHByb2JsZW1zIGZvciBSRU1PVEVfUE9SVCBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBzdUVYRUMgd3JhcHBlciB3YXMgZnJlZWluZyBtZW1vcnkgdGhhdCBoYWQgbm90IGJlZW4gbWFsbG9jJ2VkLgoKICAqKSBDb3JyZWN0bHkgYWxsb3cgYWNjZXNzIGFuZCBhdXRoIGRpcmVjdGl2ZXMgaW4gPEZpbGVzPiBzZWN0aW9ucyBpbgogICAgIHNlcnZlciBjb25maWcgZmlsZXMuIFtBbGV4ZWkgS29zdXRdCgogICopIEZpeCBidWcgd2l0aCBTZXJ2ZXJQYXRoIHRoYXQgY291bGQgY2F1c2UgY2VydGFpbiBmaWxlcyB0byBiZSBub3QKICAgICBmb3VuZCBieSB0aGUgc2VydmVyLiBbQWxleGVpIEtvc3V0XQoKICAqKSBGaXggaGFuZGxpbmcgb2YgRXJyb3JEb2N1bWVudCBzbyB0aGF0IGl0IGRvZXNuJ3QgcmVtb3ZlIGEgdHJhaWxpbmcKICAgICBkb3VibGUtcXVvdGUgZnJvbSB0ZXh0IGFuZCBzbyB0aGF0IGl0IHByb3Blcmx5IGNoZWNrcyBmb3IgdW5zdXBwb3J0ZWQKICAgICBzdGF0dXMgY29kZXMgdXNpbmcgdGhlIG5ldyBpbmRleF9vZl9yZXNwb25zZSBpbnRlcmZhY2UuIFtSb3kgRmllbGRpbmddCgogICopIE11bHRpcGxlIGZpeGVzIHRvIHRoZSBsaW5nZXJpbmdfY2xvc2UgY29kZSBpbiBvcmRlciB0byBhdm9pZCBiZWluZwogICAgIGludGVycnVwdGVkIGJ5IGEgc3RyYXkgdGltZW91dCwgdG8gYXZvaWQgbGluZ2VyaW5nIG9uIGEgY29ubmVjdGlvbgogICAgIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhYm9ydGVkIG9yIG5ldmVyIHJlYWxseSBleGlzdGVkLCB0byBlbnN1cmUgdGhhdAogICAgIHdlIHN0b3AgbGluZ2VyaW5nIGFzIHNvb24gYXMgYW55IGVycm9yIGNvbmRpdGlvbiBpcyByZWNlaXZlZCwgYW5kIHRvCiAgICAgcHJldmVudCBiZWluZyBzdHVjayBpbmRlZmluaXRlbHkgaWYgdGhlIHJlYWQgYmxvY2tzLiAgQWxzbyBpbXByb3ZlcwogICAgIHJlcG9ydGluZyBvZiBlcnJvciBjb25kaXRpb25zLiAgW01hcmMgU2xlbWtvIGFuZCBSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGluaXRpYWxpemF0aW9uIG9mIHBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIHNpZ2FjdGlvbi4KICAgICBbbWd5Z2VyQGl0ci5jaCwgQWRyaWFuIEZpbGlwaS1NYXJ0aW5dCgogICopIEZpeGVkIHJlaW5pdGlhbGl6aW5nIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBlYWNoIGNhbGwgdG8gYWNjZXB0IGFuZAogICAgIHNlbGVjdCwgYW5kIHJlbW92ZWQgcG90ZW50aWFsIGZvciBpbmZpbml0ZSBsb29wIGluIGFjY2VwdC4KICAgICBbUm95IEZpZWxkaW5nLCBhZnRlciB1c2VmdWwgUFIgZnJvbSBhZHJpYW5AdmlyZ2luaWEuZWR1XQoKICAqKSBGaXhlZCBjb25kaXRpb24gd2hlcmUsIGlmIGEgY2hpbGQgZmFpbHMgdG8gZm9yaywgdGhlIHNjb3JlYm9hcmQgd291bGQKICAgICBjb250aW51ZSB0byBzYXkgU0VSVkVSX1NUQVJUSU5HIGZvcmV2ZXIuIEV2ZW50dWFsbHksIHRoZSBtYWluIHByb2Nlc3MKICAgICB3b3VsZCByZWZ1c2UgdG8gc3RhcnQgbmV3IGNoaWxkcmVuIGJlY2F1c2UgY291bnRfaWRsZV9zZXJ2ZXJzKCkgd2lsbAogICAgIGNvdW50IHRob3NlIFNFUlZFUl9TVEFSVElORyBlbnRyaWVzIGFuZCB3aWxsIGFsd2F5cyByZXBvcnQgdGhhdCB0aGVyZQogICAgIGFyZSBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiBbUGhpbGxpcCBWYW5kcnldCgogICopIEZpeGVkIGJ1ZyBpbiBiY3dyaXRlIHJlZ2FyZGluZyBmYWlsdXJlIHRvIGFjY291bnQgZm9yIHBhcnRpYWwgd3JpdGVzLgogICAgIEF2b2lkZWQgY2FsbGluZyBiZmx1c2goKSB3aGVuIHRoZSBjbGllbnQgaXMgcGlwZWxpbmluZyByZXF1ZXN0cy4KICAgICBSZW1vdmVkIHVubmVjZXNzYXJ5IGZsdXNoZXMgZnJvbSBodHRwX3Byb3RvY29sLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIGRlc2NyaXB0aW9uIG9mICIuIiBtb2RlIGluIHNlcnZlci1zdGF0dXMgW0ppbSBKYWdpZWxza2ldCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI0CgogICopIEZpeCBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBpbiBhY2NlcHRfbXV0ZXhfaW5pdCgpIHRoYXQKICAgICBjb3VsZCBsZWF2ZSBhIHNtYWxsIHNlY3VyaXR5IGhvbGUgb3BlbiBhbGxvd2luZyBmaWxlcyB0byBiZQogICAgIG92ZXJ3cml0dGVuIGluIGNhc2VzIHdoZXJlIHRoZSBzZXJ2ZXIgVUlEIGhhcyB3cml0ZSBwZXJtaXNzaW9ucy4KICAgICBbTWFyYyBTbGVta29dCgogICopIEZpeCBhd2sgY29tcGF0aWJpbHR5IHByb2JsZW0gaW4gQ29uZmlndXJlLiBbSmltIEphZ2llbHNraV0KCiAgKikgRml4IHBvcnRhYmxpdHkgcHJvYmxlbSBpbiB1dGlsX3NjcmlwdCB3aGVyZSBBUkdfTUFYIG1heSBub3QgYmUKICAgICBkZWZpbmVkIGZvciBzb21lIHN5c3RlbXMuCgogICopIEFkZCBjaGFuZ2VzIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9uIE1hY2h0ZW4gNC4wLjMgZm9yIFBvd2VyUEMuCiAgICAgW1JhbmRhbCBTY2h3YXJ0el0KCiAgKikgT1MvMiBjaGFuZ2VzIHRvIHN1cHBvcnQgYW4gTU1BUCBzdHlsZSBzY29yZWJvYXJkIGZpbGUgYW5kIFVOSVgKICAgICBzdHlsZSBtYWdpYyAjISB0b2tlbiBmb3IgYmV0dGVyIHNjcmlwdCBwb3J0YWJpbGl0eS4gW0dhcmV5IFNtaWxleV0KCiAgKikgRml4IGJ1ZyBpbiBzdWV4ZWMgd3JhcHBlciBpbnRyb2R1Y2VkIGluIGIzIHRoYXQgd291bGQgY2F1c2UgZmFpbGVkCiAgICAgZXhlY3V0aW9uIGZvciB+dXNlcmRpciBDR0kuIFtKYXNvbiBEb3VyXQoKICAqKSBGaXggaW5pdGdyb3VwcygpIGJ1c2luZXNzIGluIHN1ZXhlYyB3cmFwcGVyLiBbSmFzb24gRG91cl0KCiAgKikgRml4IG1vbnRoIG9mZiBieSBvbmUgaW4gc3VleGVjIHdyYXBwZXIgbG9nZ2luZy4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjM6CgogICopIEZpeCBlcnJvciBpbiBtb2RfY2dpIHdoaWNoIGNvdWxkIGNhdXNlIHJlc291cmNlcyBub3QgdG8gYmUgcHJvcGVybHkKICAgICBmcmVlZCwgb3Igd29yc2UuIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGZpbmRfc3RyaW5nKCkgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLiBbSG93YXJkIEZlYXJdCgogICopIEFkZCBzZXRfZmxhZ19zbG90KCkgYXQgdGhlIHJlcXVlc3Qgb2YgRGlyayBhbmQgb3RoZXJzLgogICAgIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBTeW5jIG1vZF9yZXdyaXRlIHdpdGggcGF0Y2ggbGV2ZWwgMTAuIFtSYWxmIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgY2hhbmdlcyB0byBpbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGdpdmVuIGZvciBpbnZhbGlkCiAgICAgU2VydmVyTmFtZSBwYXJhbWV0ZXJzLiBbRGlyayB2YW5HdWxpa10KCiAgKikgQWRkICJBdXRob3JpdGF0aXZlIiBkaXJlY3RpdmUgZm9yIEF1dGggbW9kdWxlcyB0aGF0IGRvbid0CiAgICAgY3VycmVudGx5IGhhdmUgaXQuIFRoaXMgZ2l2ZXMgYWRtaW4gY29udHJvbCB0byBhc3NpZ24gYXV0aG9yaXRhdGl2ZQogICAgIGNvbnRyb2wgdG8gYW4gYXV0aGVudGljYXRpb24gc2NoZW1lIGFuZCBhbGxvdyAiZmFsbCB0aHJvdWdoIiBmb3IKICAgICB0aG9zZSBhdXRoZW50aWNhdGlvbiBtb2R1bGVzIHRoYXQgYXJlbid0ICJBdXRob3JpdGF0aXZlIiB0aGVyZWJ5CiAgICAgYWxsb3dpbmcgbXVsdGlwbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0byBiZSBjaGFpbmVkLgogICAgIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBSZW1vdmUgcmVxdWlyZW1lbnQgZm9yIFJlc291cmNlQ29uZmlnL0FjY2Vzc0NvbmZpZyBpZiBub3QgdXNpbmcKICAgICB0aGUgdGhyZWUgY29uZmlnIGZpbGUgbGF5b3V0LiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQWRkIFBBU1YgbW9kZSB0byBtb2RfcHJveHkgRlRQIGhhbmRsZXIuIFtDaHVjayBNdXJja29dCgogICopIENoYW5nZXMgdG8gc3VleGVjIHdyYXBwZXIgdG8gZml4IHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6CiAgICAgMS4gIHN5bWxpbmtlZCBob21lZGlycyB3aWxsIGtpbGwgfnVzZXJkaXJzLgogICAgIDIuICBpbml0Z3JvdXBzKCkgb24gTGludXggMi4wLnggY2xvYmJlcnMgZ3ItPmdyaWQuCiAgICAgMy4gIENHSSBjb21tYW5kIGxpbmVzIHBhcmFtdGVycyBwcm9ibGVtcwogICAgIDQuICBwdy1wd2RpciBmb3IgImRvY3Jvb3QgY2hlY2siIHN0aWxsIHRoZSBodHRwZCB1c2VyJ3MgcHcgcmVjb3JkLgogICAgW1JhbmR5IFRlcmJ1c2gsIEphc29uIERvdXJdCgogICopIENoYW5nZSBjcmVhdGVfYXJndigpIHRvIGFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMuIFRoaXMgZml4ZXMKICAgICBhIHByb2JsZW0gd2hlcmUgYXJndW1lbnRzIHdlcmUgbm90IGdldHRpbmcgcGFzc2VkIHRvIHRoZSBDR0kgdmlhCiAgICAgYXJndltdIHdoZW4gdGhlIHN1ZXhlYyB3cmFwcGVyIHdhcyBhY3RpdmUuIFtSYW5keSBUZXJidXNoLCBKYWtlIEJ1Y2hob2x6XQoKICAqKSBDb2xsYXBzZSBtdWx0aXBsZSBzbGFzaGVzIGluIHBhdGggVVJMcyB0byBwcm9wZXJseSBhcHBseQogICAgIGhhbmRsZXJzIGRlZmluZWQgYnkgPExvY2F0aW9uPi4gW0FsZXhlaSBLb3N1dF0KCiAgKikgRGVmaW5lIGEgc2FuZSBzZXQgb2YgREVGQVVMVF9VU0VSIGFuZCBERUZBVUxUX0dST1VQIHZhbHVlcyBmb3IgQUlYLgoKICAqKSBJbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiByZXF1ZXN0IGR1cmF0aW9uIHRpbWluZ3MgYnkgc2V0dGluZwogICAgIHItPnJlcXVlc3RfdGltZSBpbiByZWFkX3JlcXVlc3RfbGluZSgpIGluc3RlYWQgb2YgcmVhZF9yZXF1ZXN0KCkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXNldCB0aW1lb3V0IHdoaWxlIHJlYWRpbmcgdmlhIGdldF9jbGllbnRfYmxvY2soKSBpbiBtb2RfY2dpLmMKICAgICBGaXhlcyBwcm9ibGVtIHdpdGggdGltZWQgb3V0IHRyYW5zZmVycyBvZiBsYXJnZSBmaWxlcy4gW1Jhc211cyBMZXJkb3JmXQoKICAqKSBBZGQgdGhlIGFiaWxpdHkgdG8gcGFzcyBkaWZmZXJlbnQgTWFrZWZpbGUudG1wbCBmaWxlcyB0byBDb25maWd1cmUKICAgICB1c2luZyB0aGUgLW1ha2UgZmxhZy4gW1JvYiBIYXJ0aWxsXQoKICAqKSBGaXggY29yZWR1bXAgdHJpZ2dlcmVkIHdoZW4gc2VuZGluZyBhIFNJR0hVUCB0byB0aGUgc2VydmVyIGNhdXNlZAogICAgIGJ5IGFuIGFzc2VydGlvbiBmYWlsdXJlLCBpbiB0dXJuIGNhdXNlZCBieSBhbiB1bmluaXRpYWxpc2VkIGZpZWxkIGluIGEKICAgICBsaXN0ZW5fcmVjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgRklMRVBBVEhfSU5GTyB2YXJpYWJsZSB0byBDR0kgZW52aXJvbm1lbnQsIHdoaWNoIGlzIGVxdWFsIHRvCiAgICAgUEFUSF9JTkZPIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgb2YgQXBhY2hlIChpbiBjZXJ0YWluIHNpdHVhdGlvbnMsCiAgICAgQXBhY2hlIDEuMidzIFBBVEhfSU5GTyB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIDEuMSdzKS4gW0FsZXhlaSBLb3N1dF0KICAgICBbbGF0ZXIgcmVtb3ZlZCBpbiAxLjJiMTFdCgogICopIEFkZCByd3JpdGUoKSBmdW5jdGlvbiB0byBBUEkgdG8gYWxsb3cgZm9yIHNlbmRpbmcgc3RyaW5ncyBvZgogICAgIGFyYml0cmFyeSBsZW5ndGguIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIFJlbW92ZSBybGltX3QgdHlwZWRlZiBmb3IgTmV0QlNELiBEbyBvbGRlciB2ZXJzaW9ucyBuZWVkIHRoaXM/CgogICopIERlZmluZWQgcmxpbV90IGFuZCBXQU5USFNSRUdFWD15ZXMgYW5kIGZpeGVkIHdhaXRwaWQoKSBzdWJzdGl0dXRlIGZvcgogICAgIE5lWFQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZW1vdmVkIHJlY2VudCBtb2RpZmljYXRpb24gdG8gcHJvbW90ZSB0aGUgc3RhdHVzIGNvZGUgb24gaW50ZXJuYWwKICAgICByZWRpcmVjdHMsIHNpbmNlIHRoZSBjb3JyZWN0IGZpeCB3YXMgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGxvZyBmb3JtYXQKICAgICBpbiBtb2RfbG9nX2NvbmZpZyBzbyB0aGF0IGl0IG91dHB1dHMgdGhlIG9yaWdpbmFsIHN0YXR1cy4gW1JvYiBIYXJ0aWxsXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMjoKCiAgKikgVXBkYXRlIHNldF9zaWduYWxzKCkgdG8gdXNlIHNpZ2FjdGlvbigpIGZvciBzZXR0aW5nIGhhbmRsZXJzLgogICAgIFRoaXMgYXBwZWFycyB0byBmaXggYSByZS1lbnRyYW50IHByb2JsZW0gaW4gdGhlIHNlZ19mYXVsdCgpCiAgICAgYnVzX2Vycm9yKCkgaGFuZGxlcnMuIFtSYW5keSBUZXJidXNoXQoKICAqKSBDaGFuZ2VzIHRvIGFsbG93IG1vZF9zdGF0dXMgY29tcGlsZSBmb3IgT1MvMiBbR2FyZXkgU21pbGV5XQoKICAqKSBjaGFuZ2VzIGZvciBERUMgQVhQIHJ1bm5pbmcgT1NGLzEgdjMuMC4gW01hcmMgRXZhbnNdCgogICopIHByb3h5X2h0dHAuYyBidWdmaXhlczogIFtDaHVjayBNdXJja29dCiAgICAgICAgMSkgZml4ZXMgcG9zc2libGUgTlVMTCBwb2ludGVyIHJlZmVyZW5jZSB3L05vQ2FjaGUKICAgICAgICAyKSBmaXhlcyBOb0NhY2hlIGJlaGF2aW9yIHdoZW4gdXNpbmcgUHJveHlSZW1vdGUgKFByb3h5UmVtb3RlCiAgICAgICAgICAgaG9zdCB3b3VsZCBjYWNoZSBub3RoaW5nIGlmIGl0IHdhcyBpbiB0aGUgbG9jYWwgZG9tYWluLAogICAgICAgICAgIGFuZCB0aGUgbG9jYWwgZG9tYWluIHdhcyBpbiB0aGUgTm9DYWNoZSBsaXN0KQogICAgICAgIDMpIEFkZHMgSG9zdDogaGVhZGVyIHdoZW4gbm90IGF2YWlsYWJsZQogICAgICAgIDQpIFNvbWUgY29kZSBjbGVhbnVwIGFuZCBjbGFyaWZpY2F0aW9uCgogICopIG1vZF9pbmNsdWRlLmMgYnVnZml4ZXM6CiAgICAgICAgMSkgRml4ZWQgYW4gb21taXNzaW9uIHRoYXQgY2F1c2VkIGluY2x1ZGUgdmFyaWFibGVzIHRvIG5vdAogICAgICAgICAgIGJlIHBhcnNlZCBpbiBjb25maWcgZXJybXNnIGRpcmVjdGl2ZXMgW0hvd2FyZCBGZWFyXQogICAgICAgIDIpIFJlbW92ZSBIQVZFX1BPU0lYX1JFR0VYIGNydWZ0IFtBbGV4ZWkgS29zdXRdCiAgICAgICAgMykgUGF0Y2ggdG8gZml4IGNvbXBpbGVyIHdhcm5pbmdzIFtwZXJyb3RAbGFsLmluMnAzLmZyXQogICAgICAgIDQpIEFsbG93IGJhY2tzbGFzaC1lc2NhcGluZyB0byBhbGwgcXVvdGVkIHRleHQKICAgICAgICAgICBbQmVuIFlvc2hpbm8gPGJlbkB3aWxpa2kuZW5nLmhhd2FpaS5lZHU+XQogICAgICAgIDUpIFBhc3MgdmFyaWFibGUgdG8gY29tbWFuZCBsaW5lIGlmIG5vdCBzZXQgaW4gWFNTSSdzIGVudgogICAgICAgICAgIFtIb3dhcmQgRmVhcl0KCiAgKikgRml4IGluZmluaXRlIGxvb3Agd2hlbiBwcm9jZXNzaW5nIENvbnRlbnQtbGFuZ3VhZ2UgbGluZXMgaW4KICAgICB0eXBlLW1hcCBmaWxlcy4gW0FsZXhlaSBLb3N1dF0KCiAgKikgQ2xvc2VkIGZpbGUtZ2xvYmJpbmcgaG9sZSBpbiB0ZXN0LWNnaSBzY3JpcHQuIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBGaXhlZCBwcm9ibGVtIGluIHNldF9bdXNlcnxncm91cF0gdGhhdCBwcmV2ZW50ZWQgQ0dJIGV4ZWN1dGlvbgogICAgIGZvciBub24tdmlydHVhbGhvc3RzIHdoZW4gc3VFWEVDIHdhcyBlbmFibGVkLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQWRkZWQgUE9SVElORyBpbmZvcm1hdGlvbiBmaWxlLiAgW0ppbSBKYWdpZWxza2ldCgogICopIEFkZGVkIGRlZmluaXRpb25zIGZvciBTX0lXR1JQIGFuZCBTX0lXT1RIIHRvIGNvbmYuaCBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlZCBkZWZhdWx0IGdyb3VwIHRvICJub2dyb3VwIiBpbnN0ZWFkIG9mICJub2JvZHkiIFtSYW5keSBUZXJidXNoXQoKICAqKSBGaXhlZCBkZWZpbmUgdHlwbyBvZiBGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCB3aGVyZQogICAgIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCB3YXMgaW50ZW5kZWQuCgogICopIEZpeGVkIGFkZGl0aW9uYWwgdXNlcyBvZiAweGZmZmZmZmZmIHdoZXJlIElOQUREUl9OT05FIHdhcyBpbnRlbmRlZCwKICAgICB3aGljaCBjYXVzZWQgcHJvYmxlbXMgb2Ygc3lzdGVtcyB3aGVyZSBzb2NrZXQgc19hZGRyIGlzID4zMmJpdHMuCgogICopIEFkZGVkIGNvbW1lbnQgdG8gZXhwbGFpbiAoci0+Y2h1bmtlZCA9IDEpIHNpZGUtZWZmZWN0IGluCiAgICAgaHR0cF9wcm90b2NvbC5jIFtSb3kgRmllbGRpbmddCgogICopIFJlcGxhY2VkIHVzZSBvZiBpbmRleCgpIGluIG1vZF9leHBpcmVzLmMgd2l0aCBtb3JlIGFwcHJvcHJpYXRlCiAgICAgYW5kIHBvcnRhYmxlIGlzZGlnaXQoKSB0ZXN0LiAgW0JlbiBMYXVyaWVdCgogICopIFVwZGF0ZWQgQ29uZmlndXJlIGZvciAuLi4KICAgICAgICBPUy8yICAgICAgICAgIChERUZfV0FOVEhTUkVHRVg9eWVzLCBvdGhlciBjb2RlIGNoYW5nZXMpCiAgICAgICAgKi1kZy1kZ3V4KiAgICAoYmFkIHBhdHRlcm4gbWF0Y2gpCiAgICAgICAgUU5YICAgICAgICAgICAoREVGX1dBTlRIU1JFR0VYPXllcykKICAgICAgICAqLXN1bm9zNCogICAgIChERUZfV0FOVEhTUkVHRVg9eWVzLCAtRFVTRUJDT1BZKQogICAgICAgICotdWx0cml4ICAgICAgKG5ldykKICAgICAgICAqLXVuaXh3YXJlMjExIChuZXcpCiAgICAgYW5kIGFkZGVkIHNvbWUgdXNlciBkaWFnbm9zdGljIGluZm8uICBbQmVuIExhdXJpZV0KCiAgKikgSW4gaGVscGVycy9DdXRSdWxlLCByZXBsYWNlZCAiY3V0IiBpbnZvY2F0aW9uIHdpdGggImF3ayIgaW52b2NhdGlvbgogICAgIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBVcGRhdGVkIGhlbHBlcnMvR3Vlc3NPUyBmb3IgLi4uCiAgICAgICAgU0NPIDUgICAgICAgICAgICAocmVjb2duaXplIG1pbm9yIHJlbGVhc2VzKQogICAgICAgIFNDTyBVbml4V2FyZSAgICAgKGJyYWluZGFtYWdlZCB1bmFtZSwgd2hhdGV2ZXItd2hhdGV2ZXItdW5peHdhcmUyKQogICAgICAgIFNDTyBVbml4V2FyZSAyLjEuMSAgICAgIChyZXF1aXJlcyBhIHNlcGFyYXRlIHNldCBvZiAjZGVmaW5lcyBpbiBjb25mLmgpCiAgICAgICAgSVJJWDY0ICAgICAgICAgICAoLXNnaS1pcml4NjQpCiAgICAgICAgVUxUUklYICAgICAgICAgICAoLXVua25vd24tdWx0cml4KQogICAgICAgIFNJTklYICAgICAgICAgICAgKC13aGF0ZXZlci1zeXN2NCkKICAgICAgICBOQ1IgVW5peCAgICAgICAgICgtbmNyLXN5c3Y0KQogICAgIGFuZCBmaXhlZCBzb21ldGhpbmcgaW4gaGVscGVycy9QcmludFBhdGggIFtCZW4gTGF1cmllXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMQoKICAqKSBOb3QgbGlzdGVkLiBTZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL25ld19mZWF0dXJlc18xXzIuaHRtbD4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xLjEKCiAgKikgRml4ZWQgYnVnIHdoZXJlIENvb2tpZSBtb2R1bGUgd291bGQgbWFrZSB0d28gZW50cmllcyBpbiB0aGUKICAgICBsb2dmaWxlIGZvciBlYWNoIGFjY2VzcyBbTWFyayBDb3hdCgogICopIEZpeGVkIGJ1ZyB3aGVyZSBSZWRpcmVjdCBpbiAuaHRhY2Nlc3MgZmlsZXMgd291bGQgY2F1c2UgbWVtb3J5CiAgICAgbGVhay4gW05hdGhhbiBOZXVsaW5nZXJdCgogICopIE11bHRpVmlld3Mgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIEFkZEhhbmRsZXIgW0FsZXhlaSBLb3N1dF0KCiAgKikgUHJvYmxlbXMgd2l0aCBtb2RfYXV0aF9tc3FsIGZpeGVkIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBGaXggbWlzc3BlbGxpbmcgb2YgIkFub255bW91c19BdXRob3JhdGl2ZSIgZGlyZWN0aXZlIGluIG1vZF9hdXRoX2Fub24uCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMS4wCgogICopIEJyaW5nIE5lWFQgc3VwcG9ydCB1cCB0byBkYXRlLiBbVGFrYWFraSBNYXRzdW1vdG9dCgogICopIEJyaW5nIFFOWCBzdXBwb3J0IHVwIHRvIGRhdGUuIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIHZpcnR1YWwgaG9zdHMgZGVmYXVsdCB0byBtYWluIHNlcnZlciBrZWVwYWxpdmUgcGFyYW1ldGVycy4KICAgICBbQWxleGVpIEtvc3V0LCBCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBTY2FuSFRNTFRpdGxlcyB0byB3b3JrIHdpdGggbG93ZXJjYXNlIDx0aXRsZT4gdGFncy4gW0FsZXhlaSBLb3N1dF0KCiAgKikgRml4IG1pc3NpbmcgYWRkcmVzcyBmYW1pbHkgZm9yIGNvbm5lY3QsIGFsc28gcmVtb3ZlIHVucmVhY2hhYmxlIHN0YXRlbWVudAogICAgIGluIG1vZF9wcm94eS4gW0JlbiBMYXVyaWVdCgogICopIG1vZF9lbnYgbm93IHR1cm5lZCBvbiBieSBkZWZhdWx0IGluIENvbmZpZ3VyYXRpb24udG1wbC4KCiAgKikgQnVncyB3aGljaCB3ZXJlIGZpeGVkOgogICAgICAgIGEpIHlldCBtb3JlIG1vZF9wcm94eSBidWdzIFtCZW4gTGF1cmllXQogICAgICAgIGIpIENHSSB3b3JrcyBhZ2FpbiB3aXRoIGluZXRkIFtBbGV4ZWkgS29zdXRdCiAgICAgICAgYykgTGVhZGluZyBjb2xvbnMgd2VyZSBzdHJpcHBlZCBmcm9tIHBhc3N3b3JkcyBbb3NtQGludGVyZ3VpZGUuY29tXQogICAgICAgIGQpIEFub3RoZXIgZml4IHRvIG11bHRpLW1ldGhvZCBMaW1pdCBwcm9ibGVtIFtqa0B0b29scy5kZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjQKCiAgKikgci0+Ynl0ZXNfc2VudCB2YXJpYWJsZSByZXN0b3JlZC4gW1JvYmVydCBUaGF1XQoKICAqKSBQcmV2aW91c2x5IGJyb2tlbiBtdWx0aS1tZXRob2QgPExpbWl0PiBwYXJzaW5nIGZpeGVkLiBbUm9iZXJ0IFRoYXVdCgogICopIE1vcmUgcG9zc2libHkgdW5zZWN1cmUgcHJvZ3JhbXMgcmVtb3ZlZCBmcm9tIHRoZSBzdXBwb3J0IGRpcmVjdG9yeS4KCiAgKikgTW9yZSBtb2RfYXV0aF9tc3FsIGF1dGhlbnRpY2F0aW9uIGltcHJvdmVtZW50cy4KCiAgKikgVmlydHVhbEhvc3RzIGJhc2VkIG9uIEhvc3Q6IGhlYWRlcnMgbm8gbG9uZ2VyIGNvbmZsaWN0IHdpdGggdGhlCiAgICAgTGlzdGVuIGRpcmVjdGl2ZS4KCiAgKikgT1MvMiBjb21wYXRpYmlsaXR5IGVuaGFuY2VtZW50cy4gW0dhcnkgU21pbGV5XQoKICAqKSBQT1NUIG5vdyBhbGxvd2VkIHRvIGRpcmVjdG9yeSBpbmRleCBDR0kgc2NyaXB0cy4KCiAgKikgQWN0aW9ucyBub3cgd29yayB3aXRoIGZpbGVzIG9mIHRoZSBkZWZhdWx0IHR5cGUuCgogICopIEJ1Z3Mgd2hpY2ggd2VyZSBmaXhlZDoKICAgICAgICBhKSBtb3JlIG1vZF9wcm94eSBidWdzCiAgICAgICAgYikgZWFybHkgdGVybWluYXRpb24gb2YgaW5ldGQgcmVxdWVzdHMKICAgICAgICBjKSBjb21waWxlIHdhcm5pbmdzIG9uIHNldmVyYWwgc3lzdGVtcwogICAgICAgIGQpIHByb2JsZW1zIHdoZW4gc2NyaXB0cyBzdG9wIHJlYWRpbmcgb3V0cHV0IGVhcmx5CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMWIzCgogICopIE11Y2ggb2YgY2dpLWJpbiBhbmQgYWxsIG9mIGNnaS1zcmMgaGFzIGJlZW4gcmVtb3ZlZCwgZHVlIHRvCiAgICAgdmFyaW91cyBzZWN1cml0eSBob2xlcyBmb3VuZCBhbmQgdGhhdCB3ZSBjb3VsZCBubyBsb25nZXIgc3VwcG9ydAogICAgIHRoZW0uCgogICopIFRoZSAiU2V0LUNvb2tpZSIgaGVhZGVyIGlzIG5vdyBzcGVjaWFsLWNhc2VkIHRvIG5vdCBtZXJnZSBtdWx0aXBsZQogICAgIGluc3RhbmNlcywgc2luY2UgY2VydGFpbiBwb3B1bGFyIGJyb3dzZXJzIGNhbiBub3QgaGFuZGxlIG11bHRpcGxlCiAgICAgU2V0LUNvb2tpZSBpbnN0cnVjdGlvbnMgaW4gYSBzaW5nbGUgaGVhZGVyLiBbUGF1bCBTdXR0b25dCgogICopIHJwcmludGYoKSBhZGRlZCB0byBidWZmZXIgY29kZSwgb2NjdXJyZW5jZXMgb2Ygc3ByaW50ZiByZW1vdmVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDT05ORUNUIG1ldGhvZCBmb3IgcHJveHkgbW9kdWxlLCB3aGljaCBtZWFucyB0dW5uZWxpbmcgU1NMIHNob3VsZCB3b3JrLgogICAgIChObyBjcnlwdG8gbmVlZGVkKSAgQWxzbyBhIE5vQ2FjaGUgY29uZmlnIGRpcmVjdGl2ZS4KCiAgKikgU2V2ZXJhbCBBUEkgYWRkaXRpb25zOiBwc3RybmR1cCgpLCB0YWJsZV91bnNldCgpIGFuZCBnZXRfdG9rZW4oKQogICAgIGZ1bmN0aW9ucyBub3cgYXZhaWxhYmxlIHRvIG1vZHVsZXMuCgogICopIG1vZF9pbWFwIGZpeHVwcywgaW4gcGFydGljdWxhciBMb2NhdGlvbjogaGVhZGVycyBhcmUgbm93IGNvbXBsZXRlCiAgICAgVVJMJ3MuCgogICopIE5ldyAiaW5mbyIgbW9kdWxlIHdoaWNoIHJlcG9ydHMgb24gaW5zdGFsbGVkIG1vZHVsZSBzZXQgdGhyb3VnaCBhCiAgICAgc3BlY2lhbCBVUkwsIGEgbGEgbW9kX3N0YXR1cy4KCiAgKikgIlNlcnZlclBhdGgiIGRpcmVjdGl2ZSBhZGRlZCAtIGFsbG93cyBmb3IgZ3JhY2VmdWwgdHJhbnNpdGlvbgogICAgIGZvciBIb3N0Oi1oZWFkZXItYmFzZWQgdmlydHVhbCBob3N0cy4KCiAgKikgQW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBpbXByb3ZlbWVudHMuCgogICopIE1TUUwgYXV0aGVudGljYXRpb24gbW9kdWxlIGltcHJvdmVtZW50cy4KCiAgKikgU3RhdHVzIG1vZHVsZSBkZXNpZ24gaW1wcm92ZWQgLSBvdXRwdXQgbm93IHRhYmxlLWJhc2VkLiBbQmVuIExhdXJpZV0KCiAgKikgaHRkaWdlc3QgdXRpbGl0eSBpbmNsdWRlZCBmb3IgdXNlIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uCiAgICAgbW9kdWxlLgoKICAqKSBtb2RfbmVnb3RpYXRpb246IEFjY2VwdCB2YWx1ZXMgd2l0aCB3aWxkY2FyZHMgdG8gYmUgdHJlYXRlZCB3aXRoCiAgICAgbGVzcyBwcmlvcml0eSB0aGFuIHRob3NlIHdpdGhvdXQgd2lsZGNhcmRzIGF0IHRoZSBzYW1lIHF1YWxpdHkKICAgICB2YWx1ZS4gW0FsZXhlaSBLb3N1dF0KCiAgKikgQnVncyB3aGljaCB3ZXJlIGZpeGVkOgogICAgICAgIGEpIG51bWVyb3VzIG1vZF9wcm94eSBidWdzCiAgICAgICAgYikgQ0dJIGVhcmx5LXRlcm1pbmF0aW9uIGJ1ZyBbQmVuIExhdXJpZV0KICAgICAgICBjKSBLZWVwYWxpdmVzIG5vdCB3b3JraW5nIHdpdGggdmlydHVhbCBob3N0cwogICAgICAgIGQpIFJlZmVyZXJJZ25vcmUgcHJvYmxlbXMKICAgICAgICBlKSBjbG9zaW5nIGZkJ3MgdHdpY2UgaW4gbW9kX2luY2x1ZGUgKGNhdXNpbmcgY29yZSBkdW1wcyBvbgogICAgICAgICAgIExpbnV4IGFuZCBlbHNld2hlcmUpLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjFiMgoKICAqKSBCdWdmaXhlczoKICAgICAgICBhKSBjb3JlIGR1bXBzIGluIG1vZF9kaWdlc3QKICAgICAgICBiKSB0cnVuY2F0ZWQgaG9zdG5hbWVzL2lwIGFkZHJlc3MgaW4gdGhlIGxvZ3MKICAgICAgICBjKSByZWxhdGl2ZSBVUkwncyBpbiBtb2RfaW1hcCBtYXAgZmlsZXMKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjEKCiAgKikgTm90IGxpc3RlZC4gU2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9uZXdfZmVhdHVyZXNfMV8xLmh0bWw+CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4zCgogICopIEludGVybmFsIHJlZGlyZWN0cyB3aGljaCBvY2N1ciBpbiBtb2RfZGlyLmMgbm93IHByZXNlcnZlIHRoZQogICAgIHF1ZXJ5IHBvcnRpb24gb2YgYSByZXF1ZXN0ICh0aGUgYml0IGFmdGVyIHRoZSBxdWVzdGlvbiBtYXJrKS4KICAgICBbQWRhbSBTdXNzbWFuXQoKICAqKSBFc2NhcGUgYWN0aXZlIGNoYXJhY3RlcnMgJzwnLCAnPicgYW5kICcmJyBpbiBodG1sIG91dHB1dCBpbgogICAgIGRpcmVjdG9yeSBsaXN0aW5ncywgZXJyb3IgbWVzc2FnZXMgYW5kIHJlZGlyZWN0aW9uIGxpbmtzLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQXBhY2hlIHdpbGwgbm93IHdvcmsgd2l0aCBMeW54T1MgMi4zIGFuZCBsYXRlciBbU3RldmVuIFdhdHRdCgogICopIEZpeCBmb3IgUE9TSVggY29tcGxpYW5jZSBpbiB3YWl0aW5nIGZvciBwcm9jZXNzZXMgaW4gYWxsb2MuYy4KICAgICBbTmljayBXaWxsaWFtc10KCiAgKikgc2V0c29ja29wdCBubyBsb25nZXIgdGFrZXMgYSBjb25zdCBkZWNsYXJlZCBhcmd1bWVudCBbTWFydGlqbiBLb3N0ZXJdCgogICopIFJlc2V0IHRpbWVvdXQgdGltZXIgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGZ3cml0ZSgpIHRvIHRoZSBuZXR3b3JrLgogICAgIFRoaXMgcGF0Y2ggYWRkcyBhIHJlc2V0X3RpbWVvdXQoKSBwcm9jZWR1cmUgdGhhdCBpcyBjYWxsZWQgYnkKICAgICBzZW5kX2ZkKCkgdG8gcmVzZXQgdGhlIHRpbWVvdXQgZXZlciB0aW1lIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgbmV0LgogICAgIFtOYXRoYW4gU2NocmVua10KCiAgKikgdGltZW91dCgpIHNpZ25hbCBoYW5kbGVyIG5vdyBjaGVja3MgZm9yIFNJR1BJUEUgYW5kIHJlcG9ydHMKICAgICBsb3N0IGNvbm5lY3Rpb25zIGluIGEgbW9yZSB1c2VyIGZyaWVuZGx5IHdheS4gW1JvYiBIYXJ0aWxsXQoKICAqKSBMb2NhdGlvbiBvZiB0aGUgInNjb3JlYm9hcmQiIGZpbGUgd2hpY2ggdXNlZCB0byBsaXZlIGluIC90bXAgaXMKICAgICBub3cgY29uZmlndXJhYmxlIChmb3IgT1NlcyB0aGF0IGNhbid0IHVzZSBtbWFwKSB2aWEgU2NvcmVCb2FyZEZpbGUKICAgICB3aGljaCB3b3JrcyBzaW1pbGFyIHRvIFBpZEZpbGUgKGluIGh0dHBkLmNvbmYpIFtSb2IgSGFydGlsbF0KCiAgKikgSW5jbHVkZSBzeXMvcmVzb3VyY2UuaCBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgU3VuT1M0IFtTYW1lZXIgUGFyZWtoXQoKICAqKSB0aGUgcHN0cmNhdCBjYWxsIGluIG1vZF9jb29raWVzLmMgZGlkbid0IGhhdmUgYW4gZW5kaW5nIE5VTEwsCiAgICAgd2hpY2ggY2F1c2VkIGEgU0VHViB3aXRoIGNvb2tpZXMgZW5hYmxlZAoKICAqKSBPdXRwdXQgd2FybmluZyB3aGVuIE1pblNwYXJlU2VydmVycyBpcyBzZXQgdG8gPD0gMCBhbmQgY2hhbmdlIGl0IHRvIDEKICAgICBbUm9iIEhhcnRpbGxdCgogICopIExvZyB0aGUgVU5JWCB0ZXh0dWFsIGVycm9yIHJldHVybmVkIGJ5IHNvbWUgc3lzdGVtIGNhbGxzLCBpbgogICAgIHBhcnRpY3VsYXIgZXJyb3JzIGZyb20gYWNjZXB0KCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBZGQgc3RyZXJyb3IgZnVuY3Rpb24gdG8gdXRpbC5jIGZvciBTdW5PUzQgW1JhbmR5IFRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4yCgogICopIHBhdGNoIHRvIGdldCBBcGFjaGUgY29tcGlsZWQgb24gVW5peFdhcmUgMi54LCByZWNvbW1lbmRlZCBhcwogICAgIGEgdGVtcG9yYXJ5IG1lYXN1cmUsIHBlbmRpbmcgcmV3cml0ZSBvZiByZmM5MzEuYy4gW0NodWNrIE11cmNrb10KCiAgKikgRml4IGdldF9iYXNpY19hdXRoX3B3KCkgdG8gc2V0IHRoZSBhdXRoX3R5cGUgb2YgdGhlIHJlcXVlc3QuCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBwYXN0IGNoYW5nZXMgdG8gaHR0cF9jb25maWcuYyB0byBvbmx5IHVzZSB0aGUKICAgICBzZXRybGltaXQgZnVuY3Rpb24gb24gc3lzdGVtcyBkZWZpbmluZyBSTElNSVRfTk9GSUxFCiAgICAgYnJva2UgdGhlIGZlYXR1cmUgb24gU1VOT1M0LiBOb3cgZGVmaW5lcyBIQVZFX1JFU09VUkNFCiAgICAgZm9yIFNVTk9TIGFuZCBwcm90b3R5cGVzIHRoZSBuZWVkZWQgZnVuY3Rpb25zLgoKICAqKSBSZW1vdmUgdXNlcyBvZiBNQVhfU1RSSU5HX0xFTi9IVUdFX1NUUklOR19MRU4gZnJvbSBzZXZlcmFsIHJvdXRpbmVzLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRml4IHVzZSBvZiBwb2ludGVyIHRvIHNjcmF0Y2ggbWVtb3J5LiBbQ2xpZmYgU2tvbG5pY2tdCgogICopIE1lcmdlIG11bHRpcGxlIGhlYWRlcnMgZnJvbSBDR0kgc2NyaXB0cyBpbnN0ZWFkIG9mIHRha2luZyBsYXN0CiAgICAgb25lLiBbRGF2aWQgUm9iaW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBTQ08gNS4gW0JlbiBMYXVyaWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4xCgogICopIFNpbGVuY2UgbW9kX2xvZ19yZWZlcmVyIGFuZCBtb2RfbG9nX2FnZW50IGlmIG5vdCBjb25maWd1cmVkCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIFJlY3Vyc2l2ZSBpbmNsdWRlcyBjYW4gb2NjdXIgaWYgdGhlIGNsaWVudCBzdXBwbGllcyBQQVRIX0lORk8gZGF0YQogICAgIGFuZCB0aGUgc2VydmVyIHByb3ZpZGVyIHVzZXMgcmVsYXRpdmUgbGlua3M7IGFzIGZpbGUuaHRtbAogICAgIHJlbGF0aXZlIHRvIC9kb2Muc2h0bWwvcGF0aGluZm8gaXMgL2RvYy5zaHRtbC9maWxlLmh0bWwuIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgVGhlIHJlcGxhY2VtZW50IGZvciBpbml0Z3JvdXBzKCkgZGlkIG5vdCBjYWxsIHtzZXQsZW5kfWdyZW50KCkuIFRoaXMKICAgICBoYWQgdHdvIGltcGxpY2F0aW9uczogaWYgYW55dGhpbmcgZWxzZSB1c2VkIGdldGdyZW50KCksIHRoZW4KICAgICBpbml0Z3JvdXBzKCkgd291bGQgZmFpbCwgYW5kIGl0IHdhcyBjb25zdW1pbmcgYSBmaWxlIGRlc2NyaXB0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE9uIGhlYXZpbHkgbG9hZGVkIHNlcnZlcnMgaXQgd2FzIHBvc3NpYmxlIGZvciB0aGUgc2NvcmVib2FyZCB0byBnZXQKICAgICBvdXQgb2Ygc3luYyB3aXRoIHJlYWxpdHksIGFzIGEgcmVzdWx0IG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgVGhlIG9ic2VydmVkIHN5bXB0b21zIGFyZSBmYXIgbW9yZSBBcGFjaGVzIHJ1bm5pbmcgdGhhbiBzaG91bGQKICAgICBiZSwgYW5kIGhlYXZ5IHN5c3RlbSBsb2FkcywgZ2VuZXJhbGx5IGZvbGxvd2VkIGJ5IGNhdGFzdHJvcGhpYwogICAgIHN5c3RlbSBmYWlsdXJlLiBbQmVuIExhdXJpZV0KCiAgKikgRml4IHR5cG8gaW4gbGljZW5zZS4gW0RhdmlkIFJvYmluc29uXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMyBOb3YgMTk5NQoKICAqKSBOb3QgbGlzdGVkLiBTZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL25ld19mZWF0dXJlc18xXzAuaHRtbD4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDUgTm92IDE5OTUKCiAgKikgTmV3IG1hbiBwYWdlIGZvciAnaHR0cGQnIGFkZGVkIHRvIHN1cHBvcnQgZGlyZWN0b3J5IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgLmh0Z3JvdXAgZmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBsaW5lIGdpdmluZyBtZW1iZXJzIGZvciBhCiAgICAgZ2l2ZW4gZ3JvdXAgKGVhY2ggbXVzdCBoYXZlIHRoZSBncm91cCBuYW1lIGluIGZyb250KSwgZm9yIE5DU0EKICAgICBiYWNrLWNvbXBhdGliaWxpdHkgW1JvYmVydCBUaGF1XQoKICAqKSBNdXR1YWwgZXhjbHVzaW9uIGFyb3VuZCBhY2NlcHQoKSBpcyBvbiBieSBkZWZhdWx0IGZvciBTVlI0IHN5c3RlbXMKICAgICBnZW5lcmFsbHksIHNpbmNlIHRoZXkgZ2VuZXJhbGx5IGNhbid0IGhhbmRsZSBtdWx0aXBsZSBwcm9jZXNzZXMgaW4KICAgICBhY2NlcHQoKSBvbiB0aGUgc2FtZSBzb2NrZXQuICBUaGlzIHNob3VsZCBjdXJlIGZsYWt5IGJlaGF2aW9yIG9uCiAgICAgYSBsb3Qgb2YgdGhvc2Ugc3lzdGVtcy4gIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQWRkVHlwZSwgQWRkRW5jb2RpbmcsIGFuZCBBZGRMYW5ndWFnZSBkaXJlY3RpdmVzIHRha2UgbXVsdGlwbGUKICAgICBleHRlbnNpb25zIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBbRGF2aWQgUm9iaW5zb25dCgogICopIFVzZXJEaXIgY2FuIGJlIGRpc2FibGVkIGZvciBhIGdpdmVuIHZpcnR1YWwgaG9zdCBieSBzYXlpbmcKICAgICAiVXNlckRpciBkaXNhYmxlZCIgaW4gdGhlIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbiAtLS0gaXQgd2FzIGEgYnVnCiAgICAgdGhhdCB0aGlzIGRpZG4ndCB3b3JrLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb21waWxlcyBvbiBRTlggW0JlbiBMYXVyaWVdCgogICopIENvcnJlY3RlZCBwYXJzaW5nIG9mIGN0aW1lIHRpbWUgZm9ybWF0IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgaHR0cGQgZG9lcyBhIHBlcnJvcigpIGJlZm9yZSBleGl0aW5nIGlmIGl0IGNhbid0IGxvZyBpdHMgcGlkCiAgICAgdG8gdGhlIFBpZEZpbGUsIHRvIG1ha2UgZGlhZ25vc2luZyB0aGUgZXJyb3IgYSBiaXQgZWFzaWVyLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgPCEtLSNpbmNsdWRlIGZpbGU9Ii4uLiItLT4gY2FuIG5vIGxvbmdlciBpbmNsdWRlIGZpbGVzIGluIHRoZQogICAgIHBhcmVudCBkaXJlY3RvcnksIGZvciBOQ1NBIGJhY2stY29tcGF0aWJpbGl0eS4gIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgJ34nIGlzICpub3QqIGVzY2FwZWQgaW4gVVJJcyBnZW5lcmF0ZWQgZm9yIGRpcmVjdG9yeSBsaXN0aW5ncwogICAgIFtSb3kgRmllbGRpbmddCgogICopIEVsaW1pbmF0ZWQgY29tcGlsZXIgd2FybmluZyBpbiB0aGUgaW1hZ2VtYXAgbW9kdWxlIFtSYW5keSBUZXJidXNoXQoKICAqKSBGaXhlZCBidWcgaW52b2x2aW5nIGhhbmRsaW5nIFVSSXMgd2l0aCBlc2NhcGVkICUtY2hhcmFjdGVycwogICAgIGluIHJlZGlyZWN0cyBbRGF2aWQgUm9iaW5zb25dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IE9jdCAxOTk1CgogICopIFN3aXRjaGVkIHRvIG5ldywgc2ltcGxlciBsaWNlbnNlCgogICopIEVsaW1pbmF0ZWQgY29yZSBkdW1wcyB3aXRoIGltcHJvcGVybHkgZm9ybWF0dGVkIERCTSBncm91cCBmaWxlcyBbTWFyayBDb3hdCgogICopIERvbid0IGFsbG93IHJlcXVlc3RzIGZvciBvcmRpbmFyeSBmaWxlcyB0byBoYXZlIFBBVEhfSU5GTyBbQmVuIExhdXJpZV0KCiAgKikgUmVqZWN0IHBhdGhzIGNvbnRhaW5pbmcgJS1lc2NhcGVkICclJyBvciBudWxsIGNoYXJhY3RlcnMgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb3JyZWN0bHkgaGFuZGxlcyBpbnRlcm5hbCByZWRpcmVjdHMgdG8gZmlsZXMgd2l0aCBuYW1lcyBjb250YWluaW5nICclJwogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgUmVwdW5jdHVhdGVkIHNvbWUgZXJyb3IgbWVzc2FnZXMgW0FyYW0gTWlyemFkZWgsIEFuZHJldyBXaWxzb25dCgogICopIFVzZSBnZXRldWlkKCkgcmF0aGVyIHRoYW4gZ2V0dWlkKCkgdG8gc2VlIGlmIHdlIGhhdmUgcm9vdCBwcml2aWxlZ2UsCiAgICAgc28gdGhhdCBzZXJ2ZXIgY29ycmVjdGx5IHJlc2V0cyBwcml2aWxlZ2UgaWYgcnVuIHNldHVpZCByb290LiAgW0FuZHJldwogICAgIFdpbHNvbl0KCiAgKikgSGFuZGxlIGZ0cDogYW5kIHRlbG5ldDogVVJMcyBjb3JyZWN0bHkgaW4gaW1hZ2VtYXBzIChidWlsdC1pbiBtb2R1bGUpCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeCByZWxhdGl2ZSBVUkxzIGluIGltYWdlbWFwIGZpbGVzIFtSYW5keSBUZXJidXNoXQoKICAqKSBTb21ld2hhdCBiZXR0ZXIgZml4IGZvciB0aGUgb2xkICJBbGlhcyAvZm9vLyAvYmFyLyIgYnVzaW5lc3MKICAgICBbRGF2aWQgUm9iaW5zb25dCgogICopIERvbid0IHJlcGVhdGVkbHkgb3BlbiB0aGUgRXJyb3JMb2cgaWYgYSBidW5jaCBvZiA8VmlydHVhbEhvc3Q+CiAgICAgZW50cmllcyBhbGwgbmFtZSB0aGUgc2FtZSBvbmUuIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRml4IGRpcmVjdG9yeSBsaXN0aW5ncyB3aXRoIGZpbGVuYW1lcyBjb250YWluaW5nIHVudXN1YWwgY2hhcmFjdGVycwogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQmV0dGVyIFVSSS1lc2NhcGluZyBmb3IgZ2VuZXJhdGVkIFVSSXMgaW4gZGlyZWN0b3JpZXMgd2l0aCBmaWxlbmFtZXMKICAgICBjb250YWluaW5nIHVudXN1YWwgY2hhcmFjdGVycyBbQmVuIExhdXJpZV0KCiAgKikgRml4ZWQgcG90ZW50aWFsIEZJTEUqIGxlYWsgaW4gaHR0cF9tYWluLmMgW0JlbiBMYXVyaWVdCgogICopIFVuYmxvY2sgYWxhcm1zIG9uIGVycm9yIHJldHVybiBmcm9tIHNwYXduX2NoaWxkKCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBTYW1wbGUgQ29uZmlnIGZpbGVzIGhhdmUgZXh0cmEgbm90ZSBmb3IgU0NPIHVzZXJzIFtCZW4gTGF1cmllXQoKICAqKSBDb25maWd1cmF0aW9uIGhhcyBub3RlIGZvciBIUC1VWCB1c2VycyBbUm9iIEhhcnRpbGxdCgogICopIEVsaW1pbmF0ZWQgc29tZSBib2d1cyBMaW51eC1vbmx5ICNkZWZpbmVzIGluIGNvbmYuaCBbQXJhbSBNaXJ6YWRlaF0KCiAgKikgTnVrZWQgYm9ndXMgI2RlZmluZSBpbiBodHRwZC5oIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQmV0dGVyIHRlc3QgZm9yIHdoZXRoZXIgYSBzeXN0ZW0gaGFzIHNldHJsaW1pdCgpIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQ2FsbHMgdXBkYXRlX2NoaWxkX3N0YXR1cygpIGFmdGVyIHJlb3Blbl9zY29yZWJvYXJkKCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBEb2Vzbid0IHNlbmQgaXRzZWxmIFNJR0hVUCBvbiBzdGFydHVwIHdoZW4gcnVuIGluIHRoZSAtWCBkZWJ1Zy1vbmx5IG1vZGUKICAgICBbQmVuIExhdXJpZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgU2VwIDE5OTUKCiAgKikgQ29tcGlsZXMgb24gU0NPIE9EVCAzLjAgW0JlbiBMYXVyaWVdCgogICopIEFkZERlc2NyaXB0aW9uIHdvcmtzIChiZXR0ZXIpIFtCZW4gTGF1cmllXQoKICAqKSBMZWF2ZXMgYW4gaW50ZWxsaWdpYmxlIGVycm9yIGRpYWdub3N0aWMgd2hlbiBpdCBjYW4ndCBzZXQgZ3JvdXAKICAgICBwcml2aWxlZ2VzIG9uIHN0YW5kYWxvbmUgc3RhcnR1cCBbQW5kcmV3IFdpbHNvbl0KCiAgKikgQ29tcGlsZXMgb24gTmVYVCBhZ2FpbiAtLS0gdGhlIDAuOC4xMyBSTElNSVQgcGF0Y2ggd2FzIGZhaWxpbmcgb24KICAgICB0aGF0IG1hY2hpbmUsIHdoaWNoIGNsYWltcyB0byBiZSBCU0QgYnV0IGRvZXMgbm90IHN1cHBvcnQgUkxJTUlULgogICAgIFtSYW5keSBUZXJidXNoXQoKICAqKSBnY2MgLVdhbGwgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCBhbiB1bnVzZWQgdmFyaWFibGUgd2hlbiB1dGlsLmMKICAgICBpcyBjb21waWxlZCB3aXRoIC1ETUlOSU1BTF9ETlMgW0FuZHJldyBXaWxzb25dCgogICopIE51a2VkIGFub3RoZXIgY29tcGlsZXIgd2FybmluZyBmb3IgLVdhbGwgb24gTGludXggW0FyYW0gTWlyemFkZWhdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3IFNlcCAxOTk1CgogICopIE1ha2UgSW5kZXhJZ25vcmUgKndvcmsqIChvb29wcykgW0phcmtrbyBUb3JwcGFdCgogICopIEhhdmUgYnVpbHQtaW4gaW1hZ2VtYXAgY29kZSByZWNvZ25pemUgJiBob25vciBQb2ludCBkaXJlY3RpdmUgW0phbWVzCiAgICAgQ2xvb3NdCgogICopIEdlbmVyYXRlIGNsZWFuZXIgZGlyZWN0b3J5IGxpc3RpbmdzIGluIGRpcmVjdG9yaWVzIHdpdGggYSBtaXggb2YKICAgICBsb25nIGFuZCBzaG9ydCBmaWxlbmFtZXMgW1JvYiBIYXJ0aWxsXQoKICAqKSBQcm9wZXJseSBpbml0aWFsaXplIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzIFtSb3lzdG9uIFNodWZmbGVib3RoYW1dCgogICopIFByb3Blcmx5IGRlZmF1bHQgU2VydmVyTmFtZSBmb3IgdmlydHVhbCBzZXJ2ZXJzIFtSb2JlcnQgVGhhdV0KCiAgKikgUmF0aW9uYWxpemUgaGFuZGxpbmcgb2YgQlNEIGluIGNvbmYuaCBhbmQgZWxzZXdoZXJlIFtSYW5keSBUZXJidXNoLAogICAgIFBhdWwgUmljaGFyZHMgYW5kIGEgY2FzdCBvZiB0aG91c2FuZHMuLi5dCgogICopIE9uIHNlbGYtaWRlbnRpZmllZCBCU0Qgc3lzdGVtcyAod2UgZG9uJ3QgdHJ5IHRvIGd1ZXNzIGFueSBtb3JlKSwKICAgICBhbGxvY2F0ZSBhIGZldyBleHRyYSBmaWxlIGRlc2NyaXB0b3JzIHBlciB2aXJ0dWFsIGhvc3Qgd2l0aCBzZXRybGltaXQsCiAgICAgaWYgd2UgY2FuLCB0byBhdm9pZCBydW5uaW5nIG91dC4gW1JhbmR5IFRlcmJ1c2hdCgogICopIFdyaXRlIDIyLWNoYXJhY3RlciBsb2NrIGZpbGUgbmFtZSBpbnRvIGJ1ZmZlciB3aXRoIGVub3VnaCBzcGFjZQogICAgIG9uIHN0YXJ0dXAgW0tvbnN0YW50aW4gT2xjaGFuc2tpXQoKICAqKSBVc2UgYXJjaGFpYyBzZXRwZ3JwKCkgaW50ZXJmYWNlIG9uIE5lWFQsIHdoaWNoIHJlcXVpcmVzIGl0IFtCcmlhbgogICAgIFBpbmtlcnRvbl0KCiAgKikgU3VwcHJlc3MgLVdhbGwgd2FybmluZyBieSBjYXN0aW5nIGNvbnN0IGF3YXkgaW4gdXRpbC5jIFtBcmFtIE1pcnphZGVoXQoKICAqKSBTdXBwcmVzcyAtV2FsbCB3YXJuaW5nIGJ5IGluaXRpYWxpemluZyB2YXJpYWJsZSBpbiBuZWdvdGlhdGlvbiBjb2RlCiAgICAgW1RvYmlhcyBXZWluZ2FydG5lcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgQXVnIDE5OTUKCiAgKikgRG9lc24ndCBwYXVzZSB0aHJlZSBzZWNvbmRzIGFmdGVyIGluY2x1ZGluZyBhIENHSSBzY3JpcHQgd2hpY2ggaXMKICAgICB0b28gc2xvdyB0byBkaWUgb2ZmICh0aGlzIGlzIGRvbmUgYnkgbm90IGV2ZW4gdHJ5aW5nIHRvIGtpbGwgb2ZmCiAgICAgc3VicHJvY2Vzc2VzLCBpbmNsdWRpbmcgdGhlIFNJR1RFUk0vcGF1c2UvU0lHS0lMTCByb3V0aW5lLCB1bnRpbAogICAgIGFmdGVyIHRoZSBlbnRpcmUgZG9jdW1lbnQgaGFzIGJlZW4gcHJvY2Vzc2VkKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9lc24ndCBkbyBTU0kgaWYgT3B0aW9ucyBJbmNsdWRlcyBpcyBvZmYuICAoT29vcHMpLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBPcHRpb25zIEluY2x1ZGVzTm9FeGVjIGFsbG93cyBpbmNsdXNpb24gb2YgYXQgbGVhc3QgdGV4dC8qIFtSb3kgRmllbGRpbmddCgogICopIEFsbG93cyAuaHRhY2Nlc3MgZmlsZXMgdG8gb3ZlcnJpZGUgPERpcmVjdG9yeT4gc2VjdGlvbnMgbmFtaW5nIHRoZQogICAgIHNhbWUgZGlyZWN0b3J5IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgUmVtb3ZlZCBhbiBlZmZpY2llbmN5IGhhY2sgaW4gc3ViX3JlcV9sb29rdXBfdXJpIHdoaWNoIHdhcwogICAgIGNhdXNpbmcgY2VydGFpbiBleHRyZW1lbHkgbWFyZ2luYWwgY2FzZXMgKGUuZy4sIFNjcmlwdEFsaWFzIG9mIGEKICAgICAqcGFydGljdWxhciogaW5kZXguaHRtbCBmaWxlKSB0byBmYWlsLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBEb2Vzbid0IGxvZyBhbiBlcnJvciB3aGVuIHRoZSByZXF1ZXN0ZWQgVVJJIHJlcXVpcmVzCiAgICAgYXV0aGVudGljYXRpb24sIGJ1dCBubyBhdXRoIGhlYWRlciBsaW5lIHdhcyBzdXBwbGllZCBieSB0aGUKICAgICBjbGllbnQ7IHRoaXMgaXMgYSBub3JtYWwgY29uZGl0aW9uICh0aGUgY2xpZW50IGRvZXNuJ3Qgbm8gYXV0aCBpcwogICAgIG5lZWRlZCBoZXJlIHlldCkuICBbUm9iZXJ0IFRoYXVdCgogICopIEJlaGF2ZXMgbW9yZSBzYW5lbHkgd2hlbiB0aGUgbmFtZSBzZXJ2ZXIgbG9zZXMgaXRzIG1pbmQgW1NlYW4gV2VsY2hdCgogICopIFJGQzkzMSBjb2RlIGNvbXBpbGVzIGNsZWFubHkgb24gb2xkIEJTREkgcmVsZWFzZXMgW1JhbmR5IFRlcmJ1c2hdCgogICopIFJGQzkzMSBjb2RlIG5vIGxvbmdlciBwYXNzZXMgb3V0IG5hbWUgb2YgcHJpb3IgY2xpZW50cyBvbiBjdXJyZW50CiAgICAgcmVxdWVzdHMgaWYgdGhlIGN1cnJlbnQgcmVxdWVzdCBjYW1lIGZyb20gYSBzZXJ2ZXIgdGhhdCBkb2Vzbid0CiAgICAgZG8gUkZDOTMxLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb25maWd1cmF0aW9uIHNjcmlwdCBhY2NlcHRzICJNb2R1bGUiIGxpbmVzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIENsZWFuZWQgdXAgY29tcGlsZXIgd2FybmluZyBmcm9tIG1vZF9hY2Nlc3MuYyBbUm9iZXJ0IFRoYXVdCgogICopIENsZWFuZWQgdXAgY29tbWVudHMgaW4gbW9kX2NnaS5jIFtSb2JlcnQgVGhhdV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgQXVnIDE5OTUKCiAgKikgV2lsZGNhcmQgPERpcmVjdG9yeT4gc3BlY2lmaWNhdGlvbnMgd29yay4gIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9lc24ndCBsb29wIGZvciBidWdneSBDR0kgb24gU29sYXJpcyBbQ2xpZmYgU2tvbG5pY2tdCgogICopIFN5bWxpbmsgY2hlY2tzIChGb2xsb3dTeW1MaW5rcyBvZmYsIG9yIFN5bUxpbmtJZk93bmVyTWF0Y2gpIGFsd2F5cyBjaGVjawogICAgIHRoZSBmaWxlIGJlaW5nIHJlcXVlc3RlZCBpdHNlbGYsIGluIGFkZGl0aW9uIHRvIHRoZSBkaXJlY3RvcmllcyBsZWFkaW5nCiAgICAgdXAgdG8gaXQuIFtSb2JlcnQgVGhhdV0KCiAgKikgTG9ncyBhY2Nlc3MgZmFpbHVyZXMgZHVlIHRvIHN5bWxpbmsgY2hlY2tzIG9yIGludmFsaWQgY2xpZW50IGFkZHJlc3MKICAgICBpbiB0aGUgZXJyb3IgbG9nIFtSb3kgRmllbGRpbmcsIFJvYmVydCBUaGF1XQoKICAqKSBTeW1saW5rIGNoZWNrcyBkZWFsIGNvcnJlY3RseSB3aXRoIHN5c3RlbXMgd2hlcmUgbHN0YXQgb2YKICAgICAiL3BhdGgvdG8vc29tZS9saW5rLyIgZm9sbG93cyB0aGUgbGluay4gIFtUaGF1LCBGaWVsZGluZ10KCiAgKikgRG9lc24ndCByZXNldCBEaXJlY3RvcnlJbmRleCB0byAnaW5kZXguaHRtbCcgd2hlbgogICAgIG90aGVyIGRpcmVjdG9yeSBvcHRpb25zIGFyZSBzZXQgaW4gYSAuaHRhY2Nlc3MgZmlsZS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQ2xhcmlmaWVkIGluaXQgY29kZSBhbmQgbnVrZWQgYm9ndXMgd2FybmluZyBpbiBtb2RfYWNjZXNzLmMKICAgICBbRmxvcmVudCBHdWlsbGF1bWVdCgogICopIENvcnJlY3RlZCBzZXZlcmFsIGRpcmVjdGl2ZXMgaW4gc2FtcGxlIHNybS5jb25mCiAgICAgLS0tIGluY2x1ZGVzIGNvcnJlY3Rpb25zIHRvIGRpcmVjdG9yeSBpbmRleGluZyBpY29uLXJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICh1c2luZyB1bmtub3duLmdpZiByYXRoZXIgdGhhbiB1bmtub3duLnhibSBhcyB0aGUgRGVmYXVsdEljb24sIGRvaW5nCiAgICAgaWNvbnMgZm9yIGVuY29kaW5ncyByaWdodCwgYW5kIHR1cm5pbmcgb24gQWRkRW5jb2RpbmcgYnkgZGVmYXVsdCkuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgQ29ycmVjdGVkIGRlc2NyaXB0aW9ucyBvZiBhcmdzIHRvIEFkZEljb24gYW5kIEFkZEFsdCBpbiBjb21tYW5kIHRhYmxlCiAgICAgW0phbWVzIENsb29zXQoKICAqKSBJTlNUQUxMICYgUkVBRE1FIG1lbnRpb24gImNvbnRyaWJ1dGVkIG1vZHVsZXMiIGRpcmVjdG9yeSBbQnJpYW4KICAgICBCZWhsZW5kb3JmXQoKICAqKSBGaXhlZCBFbmdsaXNoIGluIHRoZSBsaWNlbnNlIGxhbmd1YWdlLi4uICAiZm9yIGZvciIgLS0+ICJmb3IiLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIFNjcmlwdEFsaWFzL0FsaWFzIGludGVyYWN0aW9uIGJ5IG1vdmluZyBTY3JpcHRBbGlhcyBoYW5kbGluZyB0bwogICAgIG1vZF9hbGlhcy5jLCBtZXJnaW5nIGl0IGFsbW9zdCBjb21wbGV0ZWx5IHdpdGggaGFuZGxpbmcgb2YgQWxpYXMsIGFuZAogICAgIGFkZGluZyBhICdub3RlcycgZmllbGQgdG8gdGhlIHJlcXVlc3RfcmVjIHdoaWNoIGFsbG93cyB0aGUgQ0dJIG1vZHVsZQogICAgIHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIEFsaWFzIG1vZHVsZSBoYXMgcHV0IHRoaXMgcmVxdWVzdCB0aHJvdWdoCiAgICAgU2NyaXB0QWxpYXMgKHdoaWNoIGl0IG5lZWRzIHRvIGtub3cgZm9yIGJhY2stY29tcGF0aWJpbGl0eSwgYXMgdGhlIG9sZAogICAgIE5DU0EgY29kZSBkaWQgbm90IGNoZWNrIE9wdGlvbnMgRXhlY0NHSSBpbiBTY3JpcHRBbGlhcyBkaXJlY3RvcmllcykuCiAgICAgW1JvYmVydCBUaGF1XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBBdWcgMTk5NQoKICAqKSBBbGxvd092ZXJyaWRlIGFwcGxpZXMgdG8gdGhlIG5hbWVkIGRpcmVjdG9yeSwgYW5kIG5vdCBqdXN0CiAgICAgc3ViZGlyZWN0b3JpZXMuICBbRGF2aWQgUm9iaW5zb25dCgogICopIERvIGxvY2tpbmcgZm9yIGFjY2VwdCgpIGV4Y2x1c2lvbiAob24gc3lzdGVtcyB0aGF0IG5lZWQgaXQpCiAgICAgdXNpbmcgYSBzcGVjaWFsIGZpbGUgY3JlYXRlZCBmb3IgdGhlIHB1cnBvc2UgaW4gL3Vzci90bXAsIGFuZAogICAgIG5vdCB0aGUgZXJyb3IgbG9nOyB1c2luZyB0aGUgZXJyb3IgbG9nIGNhdXNlcyByZWFsIHByb2JsZW1zCiAgICAgaWYgaXQncyBORlMtbW91bnRlZDsgdGhpcyBpcyBrbm93biB0byBiZSB0aGUgY2F1c2Ugb2YgYSB3aG9sZQogICAgIGxvdCBvZiAic2VydmVyIGhhbmciIHByb2JsZW1zIHdpdGggU29sYXJpcy4gIFtEYXZpZCBSb2JpbnNvbjsKICAgICB0aGFua3MgdG8gTWVydGVuIFNjaHVtYW5uIGZvciBoZWxwIGRpYWdub3NpbmcgdGhlIHByb2JsZW1dLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBBdWcgMTk5NQoKICAqKSBDb21waWxlcyB3aXRoIC1ETUFYSU1VTV9ETlMgLS0tLSBvb29wcyEgW0hlbnJpayBNb3J0ZW5zZW5dCgogICopIE5lc3RlZCBpbmNsdWRlcyBzZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIHRoZSBpbmNsdWRpbmcgZG9jdW1lbnQsCiAgICAgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkgKHNvbWUgc2l0ZXMgaGF2ZSBzdGFuZGFyZCBmb290ZXIgaW5jbHVkZXMKICAgICB3aGljaCB0cnkgdG8gcHJpbnQgb3V0IHRoZSBsYXN0LW1vZGlmaWVkIGRhdGUpLiAgW0VyaWMgSGFnYmVyZy9Sb2JlcnQKICAgICBUaGF1XQoKICAqKSA8IS0tZXhlYyBjZ2k9Ii9zb21lL3VyaS9oZXJlIi0tPiBhbHdheXMgdHJlYXRzIHRoZSBpdGVtIG5hbWVkIGJ5IHRoZQogICAgIFVSSSBhcyBhIENHSSBzY3JpcHQsIGV2ZW4gaWYgaXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMgc29tZXRoaW5nCiAgICAgZWxzZSBpZiByZXF1ZXN0ZWQgZGlyZWN0bHksIGZvciBOQ1NBIGJhY2stY29tcGF0aWJpbGl0eS4gIChOb3RlIHRoYXQKICAgICB0aGlzIG1lYW5zIHRoYXQgcGVvcGxlIHdobyBrbm93IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgY2FuIHNlZSB0aGUKICAgICBjb2RlIGp1c3QgYnkgYXNraW5nIGZvciBpdCkuICBbUm9iZXJ0IFRoYXVdCgogICopIE5ldyB2ZXJzaW9uIG9mIGRibW1hbmFnZSBzY3JpcHQgaW5jbHVkZWQgaW4gc3VwcG9ydCBkaXJlY3RvcnkgYXMKICAgICBkYm1tYW5hZ2UubmV3LgoKICAqKSBDaGVjayBpZiBzY29yZWJvYXJkIGZpbGUgY291bGRuJ3QgYmUgb3BlbmVkLCBhbmQgc2F5IHNvLCByYXRoZXIKICAgICB0aGVuIGdvaW5nIGluc2FuZSBbRGF2aWQgUm9iaW5zb25dCgogICopIFBPU1QgdG8gQ0dJIHdvcmtzIG9uIEEvVVggW0ppbSBKYWdpZWxza2ldCgogICopIEFkZEljb24gYW5kIEFkZEFsdCBjb21tYW5kcyB3b3JrIHByb3Blcmx5IFtSb2IgSGFydGlsbF0KCiAgKikgTkNTQSBzZXJ2ZXIgcHVzaCB3b3JrcyBwcm9wZXJseSAtLS0gdGhlIEFyZW5hIGJ1ZyBjb21wYXRpYmlsaXR5CiAgICAgd29ya2Fyb3VuZCwgd2hpY2ggYnJva2UgaXQsIGlzIGdvbmUgKHVzZSAtREFSRU5BX0JVR19XT1JLQVJPVU5ECiAgICAgaWYgeW91IHN0aWxsIHdhbnQgdGhlIHdvcmthcm91bmQpLiAgW1JvYiBIYXJ0aWxsXQoKICAqKSBJZiBjbGllbnQgZGlkbid0IHN1Ym1pdCBhbnkgQWNjZXB0LWVuY29kaW5ncywgaWdub3JlIGVuY29kaW5ncyBpbgogICAgIGNvbnRlbnQgbmVnb3RpYXRpb24uICAoTkIgdGhpcyB3aWxsIGFsbCBoYXZlIHRvIGJlIHJld29ya2VkIGFueXdheQogICAgIGZvciB0aGUgbmV3IEhUVFAgZHJhZnQpLiAgW0Zsb3JlbnQgR3VpbGxhdW1lXQoKICAqKSBEb24ndCBkdW1wIGNvcmUgd2hlbiB0cnlpbmcgdG8gbG9nIHRpbWVkLW91dCByZXF1ZXN0cyBbSmltIEphZ2llbHNraV0KCiAgKikgUmVhbGx5IGhvbm9yIENhY2hlTmVnb3RpYXRlZERvY3MgW0Zsb3JlbnQgR3VpbGxhdW1lXQoKICAqKSBHaXZlIFJlZGlyZWN0IHByaW9yaXR5IG92ZXIgQWxpYXMsIGZvciBOQ1NBIGJ1ZyBjb21wYXRpYmlsaXR5CiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb3JyZWN0bHkgc2V0IFBBVEhfVFJBTlNMQVRFRCBpbiBhbGwgY2FzZXMgZnJvbSA8IS0tI2V4ZWMgY21kPSIiLS0+LAogICAgIHBhcmFsbGVsaW5nIGVhcmxpZXIgYnVnIGZpeCBmb3IgQ0dJIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgSWYgREJNIGF1dGggaXMgaW1wcm9wZXJseSBjb25maWd1cmVkLCByZXBvcnQgYSBzZXJ2ZXIgZXJyb3IgYW5kIGRvbid0CiAgICAgZHVtcCBjb3JlLgoKICAqKSBEZWxldGVkIEZDTlRMX1NFUklBTElaRURfQUNDRVBUUyBmcm9tIGNvbmYuaCBlbnRyeSBmb3IgQS9VWDsKICAgICBpdCBzZWVtcyB0byB3b3JrIHdlbGwgZW5vdWdoIHdpdGhvdXQgaXQgKGV2ZW4gaW4gYSAxMCBoaXRzL3NlYwogICAgIHdvcmtvdXQpLCBhbmQgdGhlIG92ZXJoZWFkIGZvciB0aGUgbG9ja2luZyB1bmRlciBBL1VYIGlzCiAgICAgYWxhcm1pbmdseSBoaWdoICh0aG91Z2ggaXQgaXMgdmVyeSBsb3cgb24gb3RoZXIgc3lzdGVtcykuCiAgICAgW0VyaWMgSGFnYmVyZywgSmltIEphZ2llbHNraV0KCiAgKikgRml4ZWQgcG9ydGFiaWxpdHkgcHJvYmxlbXMgd2l0aCBtb2RfY29va2llcy5jIFtDbGlmZiBTa29sbmlja10KCiAgKikgRnVydGhlciBkZS1CZXJrbGl6ZSBtb2RfY29va2llcy5jOyBjaGFuZ2UgdGhlIGJvZ3VzICNpbmNsdWRlLiAgW0JyaWFuCiAgICAgQmVobGVuZG9yZi9FcmljIEhhZ2JlcmddCgogICopIE1vcmUgaW1wcm92ZW1lbnRzIHRvIGRlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgQS9VWCBbSmltIEphZ2llbHNraV0KCiAgKikgQ29tcGlsZXMgY2xlYW4gb24gTkVYVCBbUm9iIEhhcnRpbGxdCgogICopIENvbXBpbGVzIGNsZWFuIG9uIFNHSSBbUm9iZXJ0IFRoYXVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA4IEF1ZyAxOTk1CgogICopIFN1bk9TIGxpYnJhcnkgcHJvdG90eXBlcyBub3cgbmV2ZXIgaW5jbHVkZWQgdW5sZXNzIGV4cGxpY2l0bHkKICAgICByZXF1ZXN0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKHZpYSAtRFNVTk9TX0xJQl9QUk9UT1RZUEVTKTsKICAgICBwZW9wbGUgdXNpbmcgR05VIGxpYmMgb24gU3VuT1MgYXJlIHNjcmV3ZWQgYnkgcHJvdG90eXBlcyBmb3IgdGhlCiAgICAgc3RhbmRhcmQgbGlicmFyeS4KCiAgICAgKFRob3NlIHdobyB3aXNoIHRvIGNvbXBpbGUgY2xlYW4gd2l0aCBnY2MgLVdhbGwgb24gYSBzdGFuZGFyZAogICAgIFN1bk9TIHNldHVwIG5lZWQgdGhlIHByb3RvdHlwZXMsIGFuZCBtYXkgb2J0YWluIHRoZW0gdXNpbmcKICAgICAtRFNVTk9TX0xJQl9QUk9UT1RZUEVTLiAgVGhvc2Ugd2lzaGluZyB0byB1c2UgLVdhbGwgb24gYSBzeXN0ZW0KICAgICB3aXRoIG5vbnN0YW5kYXJkIGxpYnJhcmllcyBhcmUgcHJlc3VtYWJseSBjb21wZXRlbnQgdG8gbWFrZSB0aGVpcgogICAgIG93biBhcnJhbmdlbWVudHMpLgoKICAqKSBTdHJpcHMgdHJhaWxpbmcgJy8nIGNoYXJhY3RlcnMgb2ZmIGJvdGggYXJncyB0byB0aGUgQWxpYXMgY29tbWFuZCwKICAgICB0byBtYWtlICdBbGlhcyAvZm9vLyAvYmFyLycgd29yay4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgQXVnIDE5OTUKCiAgKikgRG9uJ3QgaGFuZyB3aGVuIHJlc3RhcnRpbmcgd2l0aCBhIGNoaWxkIGZyb20gJ1RyYW5zZmVyTG9nICJ8Li4uIicgcnVubmluZwogICAgIFtyZXBvcnRlZCBieSBEYXZpZCBSb2JpbnNvbl0KCiAgKikgQ29tcGlsZXMgY2xlYW4gb24gT1NGLzEgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBZGRlZCBzb21lIG9mIHRoZSBtb3JlIHJlY2VudCBzaWduaWZpY2FudCBjaGFuZ2VzIChBZGRMYW5ndWFnZSBzdHVmZiwKICAgICBleHBlcmltZW50YWwgTG9nRm9ybWF0IHN1cHBvcnQpIHRvIENIQU5HRVMgZmlsZSBpbiBkaXN0cmlidXRpb24gcm9vdAogICAgIGRpcmVjdG9yeQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiBBdWcgMTk5NQoKICAqKSBEZWxldGVkIE5ldHNjYXBlIHJlbG9hZCB3b3JrYXJvdW5kIC0tLSBpdCdzIGluIHZpb2xhdGlvbiBvZiBIVFRQIHNwZWNzLgogICAgIChJZiB5b3UgYWN0dWFsbHkgd2FudGVkIGEgY29uZGl0aW9uYWwgR0VUIHdoaWNoIGJ5cGFzc2VkIHRoZSBjYWNoZSwgeW91CiAgICAgY291bGRuJ3QgZ2V0IGl0KS4gW1JlcG9ydGVkIGJ5IFJveSBGaWVsZGluZ10KCiAgKikgUHJvcGVybHkgdGVybWluYXRlIGhlYWRlcnMgb24gJzMwNCBOb3QgTW9kaWZpZWQnIHJlcGxpZXMgdG8gY29uZGl0aW9uYWwKICAgICBHRVRzIC0tLSBubyBicm93c2VyIHdlIGNhbiBmaW5kIGNhcmVzIG11Y2gsIGJ1dCB0aGUgQ0VSTiBwcm94eSBjaG9rZXMuCiAgICAgW1JlcG9ydGVkIGJ5IENsaWZmIFNrb2xuaWNrOyBmaXggZGlzY292ZXJlZCBpbmRlcGVuZGVudGx5IGJ5IFJvYiBIYXJ0aWxsXQoKICAqKSBodHRwZCAtdiBkb2Vzbid0IGNhbGwgaXRzZWxmICJTaGFtYmhhbGEiLiAgW1JlcG9ydGVkIGJ5IENodWNrIE11cmNrb10KCiAgKikgU3VuT1MgbGliLWZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gY29uZi5oIGNvbmRpdGlvbmFsaXplZCBvbiBfX0dOVUNfXywKICAgICBub3QgX19TVU5QUk9fQyAodGhleSdyZSBuZWVkZWQgdG8gcXVpZXQgZ2NjIC1XYWxsLCBidXQgYWNjIGNob2tlcyBvbiAnZW0sCiAgICAgYW5kIG9sZGVyIHZlcnNpb25zIGRvbid0IHNldCB0aGUgX19TVU5QUk9fQyBwcmVwcm9jZXNzb3IgdmFyaWFibGUpLiAgT24KICAgICBhbGwgb3RoZXIgc3lzdGVtcywgdGhlc2UgYXJlIG5ldmVyIHVzZWQgYW55d2F5LiAgW1JlcG9ydGVkIGJ5IE1hcmsgQ294XS4KCiAgKikgU2NvcmVib2FyZCBmaWxlICgvdG1wL2h0c3RhdHVzLiopIG5vIGxvbmdlciBwdWJsaWNhbGx5IHdyaXRhYmxlLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBBdWcgMTk5NQoKICAqKSBBZGRlZCBsYXN0LW1pbnV0ZSBjb25maWd1cmFibGUgbG9nIGV4cGVyaW1lbnQsIGFzIG9wdGlvbmFsIG1vZHVsZQoKICAqKSBDb3JyZWN0bHkgc2V0IHItPmJ5dGVzX3NlbnQgZm9yIEhUVFAvMC45IHJlcXVlc3RzLCBzbyB0aGV5IGdldCBsb2dnZWQKICAgICBwcm9wZXJseS4gIChPbmUtbGluZSBmaXggdG8gaHR0cF9wcm90b2NvbC5jKS4KCiAgKikgV29yayBhcm91bmQgYm9ndXMgYmVoYXZpb3Igd2hlbiByZWxvYWRpbmcgZnJvbSBOZXRzY2FwZS4KICAgICBJdCdzIE5ldHNjYXBlJ3MgYnVnIC0tLSBmb3Igc29tZSByZWFzb24gdGhleSBleHBlY3QgYSByZXF1ZXN0IHdpdGgKICAgICBJZi1tb2RpZmllZC1zaW5jZTogdG8gbm90IGZ1bmN0aW9uIGFzIGEgY29uZGl0aW9uYWwgR0VUIGlmIGl0IGFsc28KICAgICBjb21lcyB3aXRoIFByYWdtYTogbm8tY2FjaGUsIHdoaWNoIGlzIHdheSBvdXQgb2YgbGluZSB3aXRoIHRoZSBIVFRQCiAgICAgc3BlYyAoYWNjb3JkaW5nIHRvIFJveSBGaWVsZGluZywgdGhlIHJlZGFjdG9yKS4KCiAgKikgQWRkZWQgcGFyYW1ldGVyIHRvIHNldCBtYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzLgoKICAqKSBBZGRlZCBwYXRjaGVzIHRvIG1ha2UgaXQgd29yayBvbiBBL1VYLiAgQS9VWCBpcyAqd2VpcmQqLiAgW0VyaWMgSGFnYmVyZywKICAgICBKaW0gSmFnaWVsc2tpXQoKICAqKSBJZGVudGl0eUNoZWNrIGJ1Z2ZpeCBbQ2h1Y2sgTXVyY2tvXS4KCiAgKikgQ29ycmVjdGVkIGNnaS1zcmMvTWFrZWZpbGUgZW50cnkgZm9yIG5ldyBpbWFnZW1hcCBzY3JpcHQuICBbQWxleGVpIEtvc3V0XQoKICAqKSBNb3JlIHNhbXBsZSBjb25maWcgZmlsZSBjb3JyZWN0aW9uczsgYWRkIGV4dGVuc2lvbiB0byBBZGRUeXBlIGZvcgogICAgICouYXNpcywgbW92ZSBBZGRUeXBlIGdlbmVyaWMgZGVzY3JpcHRpb24gdG8gaXRzIHByb3BlciBwbGFjZSwgYW5kCiAgICAgZml4IG1pc2NlbGxhbmVvdXMgdHlwb3MuIFsgQWxleGVpIEtvc3V0IF0KCiAgKikgRGVsZXRlZCB0aGUgKm90aGVyKiByZWZlcmVuY2UgdG8gdGhlIHJlZ2VudHMgZnJvbSB0aGUgQmVya2VsZXkKICAgICBsZWdhbCBkaXNjbGFpbWVyIChldmVyeXBsYWNlKS4KCiAgKikgTnVrZWQgU2hhbWJoYWxhIG5hbWUgZnJvbSBzcmMvUkVBRE1FOyBoYWQgYWxyZWFkeSBjbGVhbmVkIGl0IG91dAogICAgIG9mIGV2ZXJ5d2hlcmUgZWxzZS4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjQKCiAgKikgQ2hhbmdlcyB0byBzZXJ2ZXItcG9vbCBtYW5hZ2VtZW50IHBhcm1zIC0tLSByZW5hbWVkIGN1cnJlbnQKICAgICBTdGFydFNlcnZlcnMgdG8gTWluU3BhcmVTZXJ2ZXJzLCBjcmVhdGVkIHNlcGFyYXRlIFN0YXJ0U2VydmVycwogICAgIHBhcmFtZXRlciB3aGljaCBtZWFucyB3aGF0IGl0IHNheXMsIGFuZCByZW5hbWVkIE1heFNlcnZlcnMgdG8KICAgICBNYXhTcGFyZVNlcnZlcnMgKHRob3VnaCB0aGUgb2xkIG5hbWUgc3RpbGwgd29ya3MsIGZvciBOQ1NBIDEuNAogICAgIGJhY2stY29tcGF0aWJpbGl0eSkuICBUaGUgb2xkIG5hbWVzIHdlcmUgZ2VuZXJhbGx5IHJlZ2FyZGVkIGFzCiAgICAgdG9vIGNvbmZ1c2luZy4gIEFsc28gYWx0ZXJlZCAiZG9jcyIgaW4gc2FtcGxlIGNvbmZpZyBmaWxlcy4KCiAgKikgTW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBjb25maWcgZmlsZXMgLS0tCiAgICAgc2FtcGxlIGRpcmVjdGl2ZXMgKGNvbW1lbnRlZCBvdXQpIGZvciBYQml0SGFjaywgQmluZEFkZHJlc3MsCiAgICAgQ2FjaGVOZWdvdGlhdGVkRG9jcywgVmlydHVhbEhvc3Q7IGRlY2VudCBzZXQgb2YgQWRkTGFuZ3VhZ2UKICAgICBkZWZhdWx0cywgQWRkVHlwZXMgZm9yIHNlbmQtYXMtaXMgYW5kIGltYWdlbWFwIG1hZ2ljIHR5cGVzLCBhbmQKICAgICBpbXByb3ZlbWVudHMgdG8gc2FtcGxlcyBmb3IgRGlyZWN0b3J5SW5kZXggW0FsZXhlaSBLb3N1dF0KCiAgKikgWWV0IG1vcmUgaW1wcm92ZW1lbnRzIHRvIGRlZmF1bHQgY29uZmlnIGZpbGVzIC0tLSBjaGFuZ2VzIHRvCiAgICAgQWxleGVpJ3Mgc2FtcGxlIEFkZExhbmd1YWdlIGRpcmVjdGl2ZXMsIGFuZCBzYW1wbGUgTGFuZ3VhZ2VQcmlvcml0eQogICAgIFsgRmxvcmVudCBHdWlsbGF1bWUgXQoKICAqKSBTZXQgY29uZmlnIGZpbGUgbG9jYXRpb25zIHByb3Blcmx5IGlmIG5vdCBzZXQgaW4gaHR0cGQuY29uZgogICAgIFsgRGF2aWQgUm9iaW5zb24gXQoKICAqKSBEb24ndCBlc2NhcGUgVVJJcyBpbiBpbnRlcm5hbCByZWRpcmVjdHMgbXVsdGlwbGUgdGltZXM7IGRvbid0CiAgICAgZG8gdGhhdCB3aGVuIHRyYW5zbGF0aW5nIFBBVEhfSU5GTyB0byBQQVRIX1RSQU5TTEFURUQgZWl0aGVyLgogICAgIFsgRGF2aWQgUm9iaW5zb24gXQoKICAqKSBDb3JyZWN0ZWQgc3BlbGxpbmcgb2YgIlJlcXVpcmVkIiBpbiA0MDEgZXJyb3IgcmVwb3J0cyBbQW5kcmV3IFdpbHNvbl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjMKCiAgKikgRWRpdGVkIGRpc3RyaWJ1dGlvbiBSRUFETUUgdG8gKmJyaWVmbHkqIHN1bW1hcml6ZSBpbnN0YWxsYXRpb24KICAgICBwcm9jZWR1cmVzLCBhbmQgZ2l2ZSBhIHBvaW50ZXIgdG8gdGhlIElOU1RBTEwgZmlsZSBpbiB0aGUgc3JjLwogICAgIGRpcmVjdG9yeS4KCiAgKikgVXBncmFkZWQgaW1hZ2VtYXAgc2NyaXB0IGluIGNnaS1iaW4gdG8gMS44IHZlcnNpb24gZnJvbSBtb3JlCiAgICAgcmVjZW50IE5DU0EgZGlzdHJpYnV0aW9ucy4KCiAgKikgQnVnIGZpeCB0byBwcmV2aW91cyBidWcgZml4IC0tLSBpZiAuaHRhY2Nlc3MgZmlsZSBhbmQgPERpcmVjdG9yeT4KICAgICBleGlzdCBmb3IgdGhlIHNhbWUgZGlyZWN0b3J5LCB1c2UgYm90aCBhbmQgZG9uJ3Qgc2VnZmF1bHQuICBbUmVwb3J0ZWQKICAgICBieSBEYXZpZCBSb2JpbnNvbl0KCiAgKikgUHJvcGVyIG1ha2VmaWxlIGRlcGVuZGVuY2llcyBbRGF2aWQgUm9iaW5zb25dCgogICopIE5vdGUgKHJlKXN0YXJ0cyBpbiBlcnJvciBsb2cgLS0tIHJlcG9ydGVkIGJ5IFJvYiBIYXJ0aWxsLgoKICAqKSBPbmx5IGNhbGwgbm8yc2xhc2goKSBhZnRlciBnZXRfcGF0aF9pbmZvKCkgaGFzIGJlZW4gZG9uZSwgdG8KICAgICBwcmVzZXJ2ZSBtdWx0aXBsZSBzbGFzaGVzIGluIHRoZSBQQVRIX0lORk8gW05DU0EgY29tcGF0aWJpbGl0eSwKICAgICByZXBvcnRlZCBieSBBbmRyZXcgV2lsc29uLCB0aG91Z2ggdGhpcyBvbmUgaXMgcHJvYmFibHkgYSByZWFsIGJ1Z10KCiAgKikgRml4ZWQgbW9kX2ltYXAuYyAtLS0gcmVsYXRpdmUgcGF0aHMgd2l0aCBiYXNlX3VyaSByZWZlcmVyIGRvbid0CiAgICAgZHVtcCBjb3JlIHdoZW4gUmVmZXJlciBpcyBub3Qgc3VwcGxpZWQuIFtSYW5keSBUZXJidXNoXQoKICAqKSBMaWdodGx5IGVkaXRlZCBzYW1wbGUgY29uZmlnIGZpbGVzIHRvIHJlZmVyIHBlb3BsZSB0byBvdXIgZG9jdW1lbnRhdGlvbgogICAgIGluc3RlYWQgb2YgTkNTQSdzLCBhbmQgdG8gbGlzdCBSb2IgTWNDb29sIGFzICpvcmlnaW5hbCogYXV0aG9yIChhbHNvCiAgICAgZGVsZXRlZCBoaXMgb2xkLCBhbmQgbm8gZG91YnQgbm9uLWZ1bmN0aW9uYWwgZW1haWwgYWRkcmVzcykuICBXb3VsZCBiZQogICAgIG5pY2UgdG8gaGF2ZSBleGFtcGxlcyBvZiBuZXcgZmVhdHVyZXMuLi4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgSnVsIDE5OTUKCiAgKikgQWRkZWQgQWRkTGFudWFnZSBjb2RlIFtGbG9yZW50IEd1aWxsYXVtZV0KCiAgKikgRG9uJ3Qgc2F5ICJhY2Nlc3MgZm9yYmlkZGVuIiB3aGVuIGEgQ0dJIHNjcmlwdCBpcyBub3QgZm91bmQuICBbTWFyayBDb3hdCgogICopIEFsbCBzb3J0cyBvZiBwcm9ibGVtcyB3aGVuIE11bHRpVmlld3MgZmluZHMgYSBkaXJlY3RvcnkuICBJdCB3b3VsZAogICAgIGJlIG5pY2UgaWYgbW9kX2Rpci5jIHdhcyByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGF0LCBidXQgZm9yIG5vdywKICAgICBqdXN0IHB1bnQuICBbcmVwb3J0ZWQgYnkgQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgV2FpdCBmb3IgYWxsIGNoaWxkcmVuIG9uIHJlc3RhcnQsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvbGQgc29ja2V0CiAgICAgaXMgZ29uZSBhbmQgd2UgY2FuIHJlb3BlbiBpdC4gIFtyZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQoKICAqKSBJbWFnZW1hcCBtb2R1bGUgaXMgZW5hYmxlZCBpbiBkZWZhdWx0IENvbmZpZ3VyYXRpb24KCiAgKikgUmVmZXJlckxvZyBhbmQgVXNlckFnZW50TG9nIG1vZHVsZXMgcHJvcGVybHkgZGVmYXVsdCB0aGUgbG9nZmlsZQogICAgIFtSYW5keSBUZXJidXNoXQoKICAqKSBNYXJrIENveCdzIG1vZF9jb29raWVzIGFkZGVkIHRvIHRoZSBkaXN0cmlidXRpb24gYXMgYW4gb3B0aW9uYWwKICAgICBtb2R1bGUgKGNvbW1lbnRlZCBvdXQgaW4gdGhlIGRlZmF1bHQgQ29uZmlndXJhdGlvbiwgYW5kIG5vdGVkIGFzCiAgICAgYW4gZXhwZXJpbWVudCwgYWxvbmcgd2l0aCBtb2RfZGxkKS4gW01hcmsgQ294XQoKICAqKSBDb21waWxlcyBvbiBVTFRSSVggKGEgY29udGludWluZyBiYXR0bGUuLi4pLiBbUm9iZXJ0IFRoYXVdCgogICopIEZpeGVkIG5hc3R5IGJ1ZyBpbiBTSUdURVJNIGhhbmRsaW5nIFtyZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQoKICAqKSBDaGFuZ2VkICJTaGFtYmhhbGEiIHRvICJBcGFjaGUiIGluIEFQSSBkb2NzLiBbUm9iZXJ0IFRoYXVdCgogICopIEFkZGVkIG5ldywgdG9vdGhpZXIgbGVnYWwgZGlzY2xhaW1lci4gW1JvYmVydCBUaGF1OyBjb3BpZWQgZnJvbSBCU0QKICAgICBsaWNlbnNlXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMQoKICAqKSBOZXcgaW1hZ2VtYXAgbW9kdWxlIFtSYW5keSBUZXJidXNoXQoKICAqKSBSZXBsYWNlbWVudCByZWZlcmVyIGxvZyBtb2R1bGUgd2l0aCBOQ1NBLWNvbXBhdGlibGUgUmVmZXJlcklnbm9yZQogICAgIFtNYXR0aGV3IEdyYXkgYWdhaW5dCgogICopIERvbid0IG11bmcgZGlyZWN0b3J5IGxpc3RpbmdzIHdpdGggdmVyeSBsb25nIGZpbGVuYW1lcy4KICAgICBbRmxvcmVudCBHdWlsbGF1bWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4wIChuZWUgU2hhbWJoYWxhIDAuNi4yKSAgICAgICAgICAgICAgICAgIDE2IEp1bCAxOTk1CgogICopIE5ldyBjb25maWcgc2NyaXB0LiAgU2VlIElOU1RBTEwgZm9yIGluZm8uICBbUm9iZXJ0IFRoYXVdCgogICopIFNjb3JlYm9hcmQgbWVjaGFuaXNtIGZvciByZWd1bGF0aW5nIHRoZSBudW1iZXIgb2YgZXh0YW50IHNlcnZlcgogICAgIHByb2Nlc3Nlcy4gIE1heFNlcnZlcnMgYW5kIFN0YXJ0U2VydmVycyBkZWZhdWx0cyBhcmUgdGhlIHNhbWUgYXMKICAgICBmb3IgTkNTQSwgYnV0IHRoZSBtZWFuaW5ncyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LiAgKEFjdHVhbGx5LAogICAgIEkgc2hvdWxkIHByb2JhYmx5IGxvd2VyIHRoZSBNYXhTZXJ2ZXJzIGRlZmF1bHQgdG8gMTApLgoKICAgICBCZWZvcmUgYXNraW5nIGZvciBhIG5ldyBjb25uZWN0aW9uLCBlYWNoIHNlcnZlciBwcm9jZXNzIGNoZWNrcwogICAgIHRoZSBudW1iZXIgb2Ygb3RoZXIgc2VydmVycyB3aGljaCBhcmUgYWxzbyB3YWl0aW5nIGZvciBhCiAgICAgY29ubmVjdGlvbi4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTWF4U2VydmVycywgaXQgcXVpZXRseSBkaWVzCiAgICAgb2ZmLiAgQ29udmVyc2VseSwgZXZlcnkgc2Vjb25kLCB0aGUgcm9vdCwgb3IgY2FyZXRha2VyLCBwcm9jZXNzCiAgICAgbG9va3MgdG8gc2VlIGhvdyBtYW55IHNlcnZlcnMgYXJlIHdhaXRpbmcgZm9yIGEgbmV3IGNvbm5lY3Rpb247CiAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gU3RhcnRTZXJ2ZXJzLCBpdCBzdGFydHMgYSBuZXcgb25lLiAgVGhpcwogICAgIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgYWxyZWFkeSBleHRhbnQuCiAgICAgVGhlIGFjY291bnRpbmcgaXMgYXJyYW5nZWQgdGhyb3VnaCBhICJzY29yZWJvYXJkIiBmaWxlLCBuYW1lZAogICAgIC90bXAvaHRzdGF0dXMuKiwgb24gd2hpY2ggZWFjaCBwcm9jZXNzIGhhcyBhbiBpbmRlcGVuZGVudCBmaWxlCiAgICAgZGVzY3JpcHRvciAodGhleSBuZWVkIHRvIHNlZWsgd2l0aG91dCBpbnRlcmZlcmVuY2UpLgoKICAgICBUaGUgZW5kIGVmZmVjdCBpcyB0aGF0IE1heFNlcnZlcnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCiAgICAgc2VydmVycyBvbiBhbiAqaW5hY3RpdmUqIHNlcnZlciBtYWNoaW5lLCBidXQgbW9yZSB3aWxsIGJlIGZvcmtlZAogICAgIG9mZiB0byBoYW5kbGUgdW51c3VhbGx5IGhlYXZ5IGxvYWRzIChvciB1bnVzdWFsbHkgc2xvdyBjbGllbnRzKTsKICAgICB0aGVzZSB3aWxsIGRpZSBvZmYgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIC0tLSB3aXRob3V0CiAgICAgcmV2ZXJ0aW5nIHRvIHRoZSBvdmVyaGVhZCBvZiBmdWxsIGZvcmtpbmcgb3BlcmF0aW9uLiAgVGhlcmUgaXMgYQogICAgIGhhcmQgbWF4aW11bSBvZiAxNTAgc2VydmVyIHByb2Nlc3NlcyBjb21waWxlZCBpbiwgbGFyZ2VseSB0bwogICAgIGF2b2lkIGZvcmtpbmcgb3V0IG9mIGNvbnRyb2wgYW5kIGRyYWdnaW5nIHRoZSBtYWNoaW5lIGRvd24uCiAgICAgKFRoaXMgaXMgYXJndWFibHkgdG9vIGhpZ2gpLgoKICAgICBJbiBteSBzZXJ2ZXIgZW5kdXJhbmNlIHRlc3RzLCB0aGlzIG1lY2hhbmlzbSBkaWQgbm90IGFwcGVhciB0bwogICAgIGltcG9zZSBhbnkgc2lnbmlmaWNhbnQgb3ZlcmhlYWQsIGV2ZW4gYWZ0ZXIgSSBmb3JjZWQgaXQgdG8gcHV0IHRoZQogICAgIHNjb3JlYm9hcmQgZmlsZSBvbiBhIG5vcm1hbCBmaWxlc3lzdGVtICh3aGljaCBtaWdodCBoYXZlIG1vcmUKICAgICBvdmVyaGVhZCB0aGFuIHRtcGZzKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgU2V0IEhUVFBfRk9PIHZhcmlhYmxlcyBmb3IgU1NJIDwhLS0jZXhlYyBjbWQtLT5zLCBub3QganVzdCBDR0kgc2NyaXB0cy4KICAgICBbQ2xpZmYgU2tvbG5pY2tdCgogICopIFJlYWQgLmh0YWNjZXNzIGZpbGVzIGV2ZW4gaW4gZGlyZWN0b3J5IHdpdGggPERpcmVjdG9yeT4gc2VjdGlvbi4KICAgICAoRm9ybWVyIGluY29tcGF0aWJpbGl0eSBub3RlZCBvbiBtYWlsaW5nIGxpc3QsIG5vdyBmaXhlZCkuIFtSb2JlcnQKICAgICBUaGF1XQoKICAqKSAiSEVBRCAvIiBnaXZlcyB0aGUgY2xpZW50IGEgIkJhZCBSZXF1ZXN0IiBlcnJvciBtZXNzYWdlLCByYXRoZXIKICAgICB0aGFuIHRyeWluZyB0byBzZW5kIG5vIGJvZHkgKmFuZCogbm8gaGVhZGVycy4gIFtDbGlmZiBTa29sbmlja10uCgogICopIERvbid0IHByb2R1Y2UgZG91YmxlIGVycm9yIHJlcG9ydHMgZm9yIHNvbWUgdmVyeSBvYnNjdXJlIGNhc2VzCiAgICAgbWFpbmx5IGludm9sdmluZyBhdXRoIGNvbmZpZ3VyYXRpb24gKHRoZSAiYWxsIG1vZHVsZXMgZGVjbGluZSB0bwogICAgIGhhbmRsZSIgY2FzZSB3aGljaCBpcyBhIHN1cmUgc2lnbiBvZiBhIHNlcnZlciBidWcgaW4gbW9zdCBjYXNlcywKICAgICBidXQgYWxzbyBoYXBwZW5zIHdoZW4gYXV0aGVudGljYXRpb24gaXMgYmFkbHkgbWlzY29uZmlndXJlZCkuCiAgICAgW1JvYmVydCBUaGF1XQoKICAqKSBNb3ZlZCBGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBkZWZpbmVzIGludG8gY29uZi5oICh0aGF0J3Mgd2hhdAogICAgIGl0J3MgKmZvciosIGFuZCB0aGlzIHNvcnQgb2YgdGhpbmcgcmVhbGx5IHNob3VsZG4ndCBiZSBjbHV0dGVyaW5nCiAgICAgdXAgdGhlIE1ha2VmaWxlKS4gW1JvYmVydCBUaGF1XQoKICAqKSBJbmNpZGVudGFsIGNvZGUgY2xlYW51cHMgaW4gaHR0cF9tYWluLmMgLS0tIHN0b3AgZHJhZ2dpbmcKICAgICBzYV9jbGllbnQgYXJvdW5kOyBqdXN0IGRlY2xhcmUgaXQgd2hlcmUgdXNlZC4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQW5vdGhlciBhY2MtcmVsYXRlZCBmaXguICAoSXQgZG9lc24ndCBsaWtlIGNvbnN0IGNoYXIKICAgICBpbiBzb21lIHBsYWNlcy4uLikuIFtNYXJrIENveF0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC42LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgSnVsIDE5OTUKCiAgKikgRml4ZWQgYXV0aF9uYW1lLXJlbGF0ZWQgdHlwb3MgaW4gaHR0cF9jb3JlLmMgW0JyaWFuIEJlaGxlbmRvcmZdCiAgICAgQWxzbywgZml4ZWQgYXV0aCB0eXBvIGluIGh0dHBfcHJvdG9jb2wuYyB1bm1hc2tlZCBieSB0aGlzIGZpeC4KCiAgKikgQ29tcGlsZXMgY2xlYW4gd2l0aCBhY2Mgb24gU3VuT1MgW1BhdWwgU3V0dG9uXQoKICAqKSBSZW9yZGVyZWQgbW9kdWxlcyBpbiBtb2R1bGVzLmMgc28gdGhhdCBSZWRpcmVjdCB0YWtlcyBwcmlvcml0eQogICAgIG92ZXIgU2NyaXB0QWxpYXMsIGZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5IFtSb2IgSGFydGlsbF0gLS0tCiAgICAgYmVsaWV2ZSBpdCBvciBub3QsIGhlIGhhcyBhbiBhY3R1YWwgc2l0ZSB3aXRoIGEgU2NyaXB0QWxpYXMgYW5kCiAgICAgYSBSZWRpcmVjdCBkZWNsYXJlZCBmb3IgdGhlICpleGFjdCBzYW1lIGRpcmVjdG9yeSouICBFdmVuICpteSoKICAgICBjb21wYXRpYmlsaXR5IGZldGlzaCB3b3VsZG4ndCBtb3RpdmF0ZSBtZSB0byBmaXggdGhpcyBpZiB0aGUgZml4CiAgICAgcmVxdWlyZWQgYW55IGVmZm9ydCwgYnV0IGl0IGRvZXNuJ3QsIHNvIHdoYXQgdGhlIGhleS4KCiAgKikgRml4ZWQgdG8gcHJvcGVybHkgZGVmYXVsdCBzZXZlcmFsIHNlcnZlcl9yZWMgZmllbGRzIGZvciB2aXJ0dWFsCiAgICAgc2VydmVycyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgbWFpbiBzZXJ2ZXJfcmVjLgogICAgIFtDbGlmZiBTa29sbmljayAtLS0gJ3BvcnQnIHdhcyBhIHBhcnRpY3VsYXIgaXJyaXRhbnRdLgoKICAqKSBObyBsb25nZXIga2lsbHMgb2ZmIG5waC0gY2hpbGQgcHJvY2Vzc2VzIGJlZm9yZSB0aGV5IGFyZQogICAgIGZpbmlzaGVkIHNlbmRpbmcgb3V0cHV0LiBbTWF0dGhldyBHcmF5XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjYuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBKdWwgMTk5NQoKICAqKSBUd28gc3R5bGVzIG9mIHRpbWVvdXQgLS0tIGhhcmQgYW5kIHNvZnQuICBzb2Z0X3RpbWVvdXQoKXMganVzdCBwdXQKICAgICB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGluIGFuICJhYm9ydGVkIiBzdGF0ZSwgYnV0IG90aGVyd2lzZQogICAgIGFsbG93IHdoYXRldmVyIGhhbmRsZXJzIGFyZSBydW5uaW5nIHRvIGNsZWFuIHVwLiAgaGFyZF90aW1lb3V0KClzCiAgICAgYWJvcnQgdGhlIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgY29tcGxldGVseTsgYW55dGhpbmcgbm90IHRpZWQgdG8gc29tZQogICAgIHJlc291cmNlIHBvb2wgY2xlYW51cCB3aWxsIGxlYWsuICBUaGV5J3JlIHN0aWxsIGFyb3VuZCBiZWNhdXNlIEkKICAgICBoYXZlbid0IHlldCBjb21lIHVwIHdpdGggYSBtb3JlIGVsZWdhbnQgd2F5IG9mIGhhbmRsaW5nCiAgICAgdGltZW91dHMgd2hlbiB0YWxraW5nIHRvIHNvbWV0aGluZyB0aGF0IGlzbid0IHRoZSBjbGllbnQuICBUaGUKICAgICBkZWZhdWx0X2hhbmRsZXIgYW5kIHRoZSBkaXJfaGFuZGxlciBub3cgdXNlIHNvZnQgdGltZW91dHMsIGxhcmdlbHkKICAgICBzbyBJIGNhbiB0ZXN0IHRoZSBmZWF0dXJlLiAgW1JvYmVydCBUaGF1XQoKICAqKSBUcmFuc2ZlckxvZyAifCBteV9wb3N0cHJvY2Vzc29yIC4uLiIgc2VlbXMgdG8gYmUgdGhlcmUuICBOb3RlIHRoYXQKICAgICB0aGUgY2FzZSBvZiBsb2cgaGFuZGxlcnMgZHlpbmcgcHJlbWF0dXJlbHkgaXMgcHJvYmFibHkgaGFuZGxlZCBWRVJZCiAgICAgZ3JhY2VsZXNzbHkgYXQgdGhpcyBwb2ludCwgYW5kIGlmIHRoZSBsb2dnZXIgc3RvcHMgcmVhZGluZyBpbnB1dCwKICAgICB0aGUgc2VydmVyIHdpbGwgaGFuZy4gIChJdCBpcyBrbm93biB0byBjb3JyZWN0bHkgcmVzdGFydCB0aGUKICAgICBsb2dnaW5nIHByb2Nlc3Mgb24gc2VydmVyIHJlc3RhcnQ7IHRoaXMgaXMgKHNob3VsZCBiZSEpIGdvaW5nIHRocm91Z2gKICAgICB0aGUgc2FtZSBTSUdURVJNL3BhdXNlL1NJR0tJTEwgcm91dGluZSB1c2VkIHRvIGRpbmcgYW4gZXJyYW50IENHSQogICAgIHNjcmlwdCkuICBbUm9iZXJ0IFRoYXVdCgogICopIGFzaXMgZmlsZXMgc3VwcG9ydGVkIChuZXcgbW9kdWxlKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgSWRlbnRpdHlDaGVjayBjb2RlIGlzIGNvbXBpbGVkIGluLCBidXQgaGFzIG5vdCBiZWVuIHRlc3RlZC4gIChJCiAgICAgZG9uJ3Qga25vdyBhbnlvbmUgd2hvIHJ1bnMgaWRlbnRkKS4gW1JvYmVydCBUaGF1XQoKICAqKSBQQVRIX0lORk8gYW5kIFBBVEhfVFJBTlNMQVRFRCBhcmUgbm90IHNldCB1bmxlc3Mgc29tZSByZWFsIFBBVEhfSU5GTwogICAgIGNhbWUgaW4gd2l0aCB0aGUgcmVxdWVzdCwgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkuIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9uJ3QgbGVhayB0aGUgRElSICogb24gSEVBRCByZXF1ZXN0IGZvciBhIGRpcmVjdG9yeS4gW1JvYmVydCBUaGF1XQoKICAqKSBEZWxldGVkIHRoZSBibG9ja19hbGFybXMoKSBzdHVmZiBmcm9tIGRibV9hdXRoOyBubyBsb25nZXIgbmVjZXNzYXJ5LAogICAgIGFzIHRpbWVvdXRzIGFyZSBub3QgaW4gc2NvcGUuIFtSb2JlcnQgVGhhdV0KCiAgKikgcXVvdGVkLXN0cmluZyBhcmdzIGluIGNvbmZpZyBmaWxlcyBub3cgaGFuZGxlZCBjb3JyZWN0bHkgKGRvZXNuJ3QgZHJvcAogICAgIHRoZSBsYXN0IGNoYXJhY3RlcikuIFtSb2JlcnQgVGhhdTsgcmVwb3J0ZWQgYnkgUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgc2lsbHkgdHlwbyBpbiBodHRwX21haW4uYyB3aGljaCB3YXMgc3VkZGVubHkgZmF0YWwgaW4gSFAtVVguCiAgICAgSG93IHRoZSBoZWxsIGRpZCBpdCBldmVyIHdvcms/IFtSb2JlcnQgVGhhdTsgcmVwb3J0ZWQgYnkgUm9iIEhhcnRpbGxdCgogICopIG1vZF9jb3JlLmMgLS0tIGRlZmF1bHRfdHlwZSByZXR1cm5zIERFRkFVTFRfVFlQRSAodGhlIGNvbXBpbGUtdGltZQogICAgIGRlZmF1bHQgZGVmYXVsdCB0eXBlKTsgdGhlIGZvcm1lciBkZWZhdWx0IGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBhbGwKICAgICB0eXBlLWNoZWNrZXJzIGRlZmF1bHRlZCBoYWQgYmVlbiBhIGNvcmUgZHVtcC4gIFtQYXVsIFN1dHRvbl0KCiAgKikgQ29weSBmaWxlbmFtZXMgb3V0IG9mIHRoZSBzdHJ1Y3QgZGlyZW50IHdoZW4gaW5kZXhpbmcKICAgICBkaXJlY3Rvcmllcy4gIChPbiBMaW51eCwgcmVhZGRpcigpIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzYW1lCiAgICAgbWVtb3J5IGFyZWEgZXZlcnkgdGltZSkuICBGaXggaXMgaW4gbW9kX2Rpci5jLiAgW1BhdWwgU3V0dG9uXQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMyBbbm90IHJlbGVhc2VkXQoKICAqKSBEZWZhdWx0IHJlc3BvbnNlIGhhbmRsZXIgbm90ZXMgImZpbGUgbm90IGZvdW5kIiBpbiB0aGUgZXJyb3IgbG9nLAogICAgIGlmIHRoZSBmaWxlIHdhcyBub3QgZm91bmQuICBbQ2xpZmYgU2tvbG5pY2tdLgoKICAqKSBBbm90aGVyIENsaWZmIGJ1ZyAtLS0gIkdFVCAvfnVzZXIiIG5vdyBwcm9wZXJseSByZWRpcmVjdHMgKHRoZSB1c2VyZGlyCiAgICAgY29kZSBubyBsb25nZXIgc2V0cyB1cCBib2d1cyBQQVRIX0lORk8gd2hpY2ggZmFrZXMgb3V0IHRoZSBkaXJlY3RvcnkKICAgICBoYW5kbGVyKS4gW0NsaWZmIFNrb2xuaWNrXQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNiBKdWwgMTk5NQoKICAqKSBDaGFuZ2VzIHRvIGh0dHBfbWFpbi5jIC0tLSByb290IHNlcnZlciBubyBsb25nZXIgcGxheXMgc2lsbHkKICAgICBnYW1lcyB3aXRoIFNJR0NITEQsIGFuZCBzbyBub3cgZGV0ZWN0cyBhbmQgcmVwbGFjZXMgZHlpbmcKICAgICBjaGlsZHJlbi4gIENoaWxkIHByb2Nlc3NlcyBqdXN0IGRpZSBvbiBTSUdURVJNLCB3aXRob3V0IHRha2luZwogICAgIHRoZSB3aG9sZSBwcm9jZXNzIGdyb3VwIHdpdGggdGhlbS4gIFBvdGVudGlhbCBwcm9ibGVtIC0tLSBpZiBhbnkKICAgICBjaGlsZCBwcm9jZXNzIHJlZnVzZXMgdG8gZGllLCB3ZSBoYW5nIGluIHJlc3RhcnQuCiAgICAgTWF4UmVxdWVzdHNQZXJDaGlsZCBtYXkgc3RpbGwgbm90IHdvcmssIGJ1dCBpdCBjZXJ0YWlubHkgd29ya3MKICAgICBiZXR0ZXIgdGhhbiBpdCBkaWQgYmVmb3JlIHRoaXMhICBbUm9iZXJ0IFRoYXVdCgogICopIG1vZF9kaXIuYyBidWcgZml4ZXM6IFJlYWRtZU5hbWUgYW5kIEhlYWRlck5hbWUKICAgICB3b3JrIChvciB3b3JrIGJldHRlciwgYXQgbGVhc3QpOyBvdmVyLWxvbmcgZGVzY3JpcHRpb24gbGluZXMKICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkLiBbTWFyayBDb3hdCgogICopIGh0dHBfcmVxdWVzdC5jIG5vdyBjYWxscyB1bmVzY2FwZV91cmwoKSBtb3JlIHBsYWNlcyB3aGVyZSBpdAogICAgIHNob3VsZCBbUGF1bCBTdXR0b25dLgoKICAqKSBNb3JlIGRpcmVjdG9yeSBoYW5kbGluZyBidWdzIChyZXBvcnRlZCBieSBDb3gpCiAgICAgUGFyZW50IERpcmVjdG9yeSBsaW5rIGlzIG5vdyBzZXQgY29ycmVjdGx5LiBbUm9iZXJ0IFRoYXVdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNS4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA0IEp1bCAxOTk1CgogICopIEdlbmVyYWxpemVkIGNsZWFudXAgaW50ZXJmYWNlIGluIGFsbG9jLmMgLS0tIGFueSBmdW5jdGlvbiBjYW4gYmUKICAgICByZWdpc3RlcmVkIHdpdGggYWxsb2MuYyBhcyBhIGNsZWFudXAgZm9yIGEgcmVzb3VyY2UgcG9vbDsKICAgICB0cmFja2luZyBvZiBmaWxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycyBoYXMgYmVlbiByZWltcGxlbWVudGVkIGluCiAgICAgdGVybXMgb2YgdGhpcyBpbnRlcmZhY2UsIHNvIEkgY2FuIGdpdmUgaXQgc29tZSBzb3J0IG9mIGEgdGVzdC4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIE1vcmUgY2hhbmdlcyBpbiBhbGxvYy5jIC0tLSBuZXcgY2xlYW51cF9mb3JfZXhlYygpIGZ1bmN0aW9uLAogICAgIHdoaWNoIHRyYWNrcyBkb3duIGFuZCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgd2hpY2ggaGF2ZSBiZWVuCiAgICAgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhbGxvYy5jIG1hY2hpbmVyeSBiZWZvcmUgdGhlIHNlcnZlciBleGVjKClzIGEKICAgICBjaGlsZCBwcm9jZXNzIGZvciBDR0kgb3IgPCEtLSNleGVjLS0+LiAgQ0dJIGNoaWxkcmVuIG5vdyBnZXQKICAgICBzdGFydGVkIHdpdGggZXhhY3RseSB0aHJlZSBmaWxlIGRlc2NyaXB0b3JzIG9wZW4uICBIb3BlZnVsbHksCiAgICAgdGhpcyBjdXJlcyB0aGUgcHJvYmxlbSBSb2IgSC4gd2FzIGhhdmluZyB3aXRoIG92ZXJseSBwZXJzaXN0ZW50CiAgICAgQ0dJIGNvbm5lY3Rpb25zLiBbUm9iZXJ0IFRoYXVdCgogICopIE11dHVhbCBleGNsdXNpb24gYXJvdW5kIHRoZSBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkgLS0tIHRoaXMgaXMKICAgICByZXF1aXJlZCBvbiBhdCBsZWFzdCBTR0ksIFNvbGFyaXMgYW5kIExpbnV4LCBhbmQgaXMgI2lmZGVmJ2VkIGluCiAgICAgYnkgZGVmYXVsdCBvbiB0aG9zZSBzeXN0ZW1zIG9ubHkgKC1ERkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQpLgogICAgIFRoaXMgdXNlcyBmY250bChGX1NFVExLLC4uLikgb24gdGhlIGVycm9yIGxvZyBkZXNjcmlwdG9yIGJlY2F1c2UKICAgICBmbG9jaygpIG9uIHRoYXQgZGVzY3JpcHRvciB3b24ndCB3b3JrIG9uIHN5c3RlbXMgd2hpY2ggaGF2ZSBCU0QKICAgICBmbG9jaygpIHNlbWFudGljcywgaW5jbHVkaW5nIChJIHRoaW5rKSBMaW51eCAxLjMgYW5kIFNvbGFyaXMuCgogICAgIFRoaXMgZG9lcyB3b3JrIG9uIFN1bk9TICh3aGVuIHRoZSBzZXJ2ZXIgaXMgaWRsZSwgb25seSBvbmUKICAgICBwcm9jZXNzIGluIHRoZSBwb29sIGlzIHdhaXRpbmcgb24gYWNjZXB0KCkpOyBpdCAqb3VnaHQqIHRvIHdvcmsKICAgICBvbiB0aGUgb3RoZXIgc3lzdGVtcy4gW1JvYmVydCBUaGF1XQoKICAqKSBGcmVlQlNEIGFuZCBCU0RJIHBvcnRhYmlsaXR5IHR3ZWFrcyBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBzaXplb2YoKnNhX2NsaWVudCkgYnVnZml4IGZyb20gW1JvYiBIYXJ0aWxsXQoKICAqKSBwc3RyZHVwKC4uLiwgTlVMTCkgcmV0dXJucyBOVUxMLCBbUmFuZHkgVGVyYnVzaF0KCiAgKikgYmxvY2tfYWxhcm1zKCkgdG8gYXZvaWQgbGVha2luZyB0aGUgREJNKiBpbiBkYm0gYXV0aCAodGhpcyBzaG91bGQKICAgICBiZSB1bm5lY2Vzc2FyeSBpZiBJIGdvIHRvIHRoZSByZXZpc2VkIHRpbWVvdXQtaGFuZGxpbmcgc2NoZW1lKS4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIEZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5LCBzZXQgUVVFUllfU1RSSU5HIGVudiB2YXIgKHRvIGEgbnVsbAogICAgIHN0cmluZykgZXZlbiBpZiBub25lIGNhbWUgaW4gd2l0aCB0aGUgcmVxdWVzdC4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQ0hBTkdFUyBmaWxlIGFkZGVkIHRvIGRpc3RyaWJ1dGlvbiA7LSkuCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC41CgogICopIG1vZF9kbGQgLS0tIGVhcmx5IGR5bmFtaWMgbG9hZGluZyBzdXBwb3J0IFtyc3RdCiAgKikgQWRkIHdpbGRjYXJkIGNvbnRlbnQgaGFuZGxlcnMgZm9yIFhCSVRIQUNLOyBkZWZhdWx0X2hhbmRlciBub3cKICAgICBpbnZva2VkIHdpdGggdGhhdCBtZWNoYW5pc20gKGFzIGEgaGFuZGxlciBoYW5naW5nIG9mZiBtb2RfY29yZSkgW3JzdF0KICAqKSBYQklUSEFDSyBzdXBwb3J0ZWQgYXMgYSB3aWxkY2FyZCBjb250ZW50LWhhbmRsZXIsIGFuZCAKICAgICBjb25maWd1cmFibGUgYXQgcnVuLXRpbWUgKG5vdCBqdXN0IGF0IGNvbXBpbGUgdGltZSwgYXMgaW4gdGhlCiAgICAgInBhdGNoeSBzZXJ2ZXIiIHJlbGVhc2VzKSBbcnN0XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjQuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCBKdW4gMTk5NQoKICAqKSBGaXhlZCBiYXNpYyB0aGlua29zIGluIG1vZF9kYm1fYXV0aC5jIFtyc3QsIHJlcG9ydGVkIGJ5IE1hcmsgQ294XQogICopIEhhbmRsZSBBZGR0eXBlIHgveSAueiBbcnN0LCByZXBvcnRlZCBieSBDb3hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC4zCgogICopIEZpeGVkIHZlcnkgZHVtYiBidWcgaW4gbW9kX2FsaWFzOyAiQWxpYXMiIGFuZCAiUmVkaXJlY3QiIGFyZSBub3QKICAgICBzeW5vbnltb3VzIFtyc3QsIHRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IEp1biAxOTk1CgogICopIEZpcnN0LWN1dCB2aXJ0dWFsIGhvc3QgaW1wbGVtZW50YXRpb247IHNvbWUgcmVmaXQgaW4gdGhlIGNvbmZpZwogICAgIHJlYWRpbmcgY29kZSwgYW5kIGxvZyBtYW5hZ2VtZW50LCB3YXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhpcyBbcnN0XQogICopIFN1Yi1wb29sIG1hY2hpbmVyeSwgb3JpZ2luYWxseSBhZGRlZCB0byBhdm9pZCBleGNlc3NpdmUgc3RvcmFnZQogICAgIGFsbG9jYXRpb24gb24gbGlzdGluZ3Mgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgKHdoaWNoIHR1cm5lZCBvdXQgdG8KICAgICBiZSB0aGUgcHJvYmxlbSB0aGF0IHRoZSAwLjMgc3RvcmFnZSBhY2NvdW50aW5nIHdhcyBhZGRlZCB0bwogICAgIGZpbmQpLiAgU3VicmVxdWVzdHMgYW5kIG1vZF9kaXIgY2hhbmdlZCB0byB1c2Ugc3VicG9vbHMuICBbcnN0XQogICopIE1vcmUgbWVtb3J5IGRlYnVnZ2luZyAtLS0gZnJlZSBsaXN0IGNvbnNpc3RlbmN5IGNoZWNrcy4gW3JzdF0KICAqKSBBZGRlZCBlcnJfaGVhZGVycyB0byByZXF1ZXN0X3JlYywgd2l0aCBzdXBwb3J0IGVsc2V3aGVyZSBbcnN0XQogICopIE90aGVyIGZpeGVzIHRvIG1pbm9yIGJ1Z3MgaW4gbW9kX2RpciBhbmQgbW9kX2luY2x1ZGVzIFtyc3QsIHRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5IEp1biAxOTk1CgogICopIFN3aXRjaCBPTkVfUFJPQ0VTUyB0byBhIHJ1bnRpbWUgY29tbWFuZC1saW5lIG9wdGlvbiAoLVgpCiAgKikgRG9uJ3QgY29tcGlsZSBpbiBtb2RfYWlfYmFja2NvbXBhdCBieSBkZWZhdWx0CiAgKikgU3dpdGNoIG5hbWUgb2Ygc2VydmVyIGZyb20gQXBhY2hlIHRvIFNoYW1iaGFsYSBpbiBNYWtlZmlsZQogICopIEFkZCBzb21lIGFjY291bnRpbmcgcm91dGluZXMgdG8gdHJhY2sgbWVtb3J5IHVzYWdlIGluIHRoZSBwb29scywKICAgICBmb3IgZGVidWdnaW5nCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMgoKICAqKSBTZXQgRE9DVU1FTlRfUk9PVCBDR0kgdmFyaWFibGUKICAqKSBBZGQgc2luZ2xlLXByb2Nlc3MgZGVidWdnaW5nLCBhcyBhIGNvbXBpbGUtdGltZSBvcHRpb24gKE9ORV9QUk9DRVNTKQogICopIEFkZCBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3Rpb24gdG8gaGFuZGxpbmcgb2YgY2xlYW51cCBzdHJ1Y3R1cmVzIAogICAgIGluIGFsbG9jLmMgW3JzdF0KICAqKSBTaWduaWZpY2FudCBjb2RlIHJlb3JnIHdpdGhpbiB0aGUgc2VydmVyIGNvcmUgdG8gZ3JvdXAgcmVsYXRlZAogICAgIGZ1bmN0aW9ucyB0b2dldGhlciBbcnN0XQogICopIENvcnJlY3RseSBoYW5kbGUgY2xpZW50cyB0aGF0IGhhbmcgdXAgYmVmb3JlIHNlbmRpbmcgYW55IHJlcXVlc3QKICAgICBbcnN0XQogICopIFJlcGxhY2UgZHlpbmcgY2hpbGQgcHJvY2Vzc2VzLiBbcnN0XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBKdW4gMTk5NQoKICAgTWFqb3IgcmV3cml0ZSBvZiB0aGUgcHJlLWV4aXN0aW5nICJwYXRjaHkgc2VydmVyIiBjb2RlYmFzZSwgYnkKICAgUm9iZXJ0IFRoYXUgKHJzdCkuICBTaWduaWZpY2FudCBwb3J0aW9ucyBvZiB0aGUgc2VydmVyIGNvZGUsIHN1Y2gKICAgYXMgY29uZmlndXJhdGlvbi1maWxlIGhhbmRsaW5nIGFuZCBIVFRQIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsCiAgIHdlcmUgcmlwcGVkIG91dCBhbmQgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4gIENvZGUgdGhhdCB3YXMgbm90CiAgIGNvbXBsZXRlbHkgcmV3cml0dGVuIHdhcyBzaWduaWZpY2FudGx5IGFsdGVyZWQuCgogICBNYWpvciBjaGFuZ2VzIHdpdGggdGhpcyByZWxlYXNlIGluY2x1ZGU6CgogICAqKSBJbnRyb2R1Y3Rpb24gb2YgdGhlIG1vZHVsZSBBUEk7IGluIHJlcXVlc3QgaGFuZGxpbmcsIHRoZSBjZW50cmFsIAogICAgICBtYWNoaW5lcnkganVzdCBkaXNwYXRjaGVzIHRvIHZhcmlvdXMgbW9kdWxlcywgd2hpY2ggYWN0dWFsbHkgZG8KICAgICAgbW9zdCBvZiB0aGUgd29yay4gIENvbmZpZ3VyYXRpb24gaGFuZGxpbmcgaXMgc2ltaWxhciAtLS0gbW9kdWxlcwogICAgICBkZWNsYXJlIHRoZWlyIG93biBjb21tYW5kcywgYW5kIHRoZSBjZW50cmFsIG1hY2hpbmVyeSBqdXN0CiAgICAgIGRpc3BhdGNoZXMgdG8gdGhlbS4gIAoKICAgICAgQVBJIGZlYXR1cmVzIGZyb20gc2hhbWJoYWxhLzAuMSB3ZXJlIHN1YnN0YW50aWFsbHkgdW5jaGFuZ2VkIGluCiAgICAgIEFwYWNoZSAxLjAgYW5kIDEuMS4gICgxLjAgQVBJIGZlYXR1cmVzIG5vdCB5ZXQgcHJlc2VudCBpbiB0aGlzCiAgICAgIHJlbGVhc2UsIHN1Y2ggYXMgd2lsZGNhcmQgaGFuZGxlcnMgYW5kIHN1YnBvb2xzLCB3ZXJlIGFkZGVkIGluCiAgICAgIHN1YnNlcXVlbnQgU2hhbWJoYWxhIHJlbGVhc2VzLCBhbmQgd2VyZSBhbHNvIGdlbmVyYWxseSByc3QncwogICAgICB3b3JrKS4gCgogICAqKSBUaGlzIHJlbGVhc2UgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgoKICAgICAgbW9kX2FjY2VzcyAgICAgIChhY2Nlc3MgY29udHJvbCAtLS0gYWxsb3cgYW5kIGRlbnkgZGlyZWN0aXZlcyksCiAgICAgIG1vZF9hbGlhcyAgICAgICAoQWxpYXMgYW5kIFJlZGlyZWN0IGNvbW1hbmRzKSwKICAgICAgbW9kX2F1dGggICAgICAgIChzdHJhaWdodCBIVFRQIGF1dGhlbnRpY2F0aW9uLCBiYXNlZCBvbiBmbGF0LWZpbGVzKQogICAgICBtb2RfYXV0aF9kYm0gICAgKHNhbWUsIHdpdGggZGJtIGZpbGVzKQogICAgICBtb2RfY2dpICAgICAgICAgKENHSSBzY3JpcHRzIGFuZCwgaW4gdGhpcyByZWxlYXNlLCBTY3JpcHRBbGlhcykKICAgICAgbW9kX2NvbW1vbl9sb2cgIChDTEYgYWNjZXNzIGxvZ3M7IGxhdGVyIHJlbmFtZWQgbW9kX2xvZ19jb21tb24pCiAgICAgIG1vZF9kaXIgICAgICAgICAoZGlyZWN0b3J5IGluZGV4aW5nKQogICAgICBtb2RfaW5jbHVkZSAgICAgKHNlcnZlci1zaWRlIGluY2x1ZGVzKQogICAgICBtb2RfbWltZSAgICAgICAgKEFkZFR5cGUgZGlyZWN0aXZlcykKICAgICAgbW9kX25lZ290aWF0aW9uIChjb250ZW50IG5lZ290aWF0aW9uKQogICAgICBtb2RfdXNlcmRpciAgICAgKHN1cHBvcnQgZm9yIHVzZXJzJyBwdWJsaWNfaHRtbCBkaXJlY3RvcmllcykKCiAgICAgIEl0IGFsc28gaW5jbHVkZWQgYSBtb2RfYWlfYmFja2NvbXBhdCwgd2hpY2ggd2FzIGEgcHJpdmF0ZSBoYWNrCiAgICAgIGZvciBiYWNrLWNvbXBhdGliaWxpdHkgd2l0aCByc3QncyBvd24gQUktbGFiIHNlcnZlcnMuCgogICAgICBBbGwgb2YgdGhlc2UgbW9kdWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY29tcGxldGUsIGFuZCBmdW5jdGlvbmFsIAogICAgICBvciBuZWFybHkgc28gKGEgZmV3LCB3aGljaCBpbXBsZW1lbnRlZCBmZWF0dXJlcyBub3QgaW4gdXNlIGF0CiAgICAgIFRoYXUncyBzaXRlLCByZXF1aXJlZCBwYXRjaGVzIG9mIGEgZmV3IGxpbmVzKS4KCiAgICopIHN1Yi1yZXF1ZXN0IG1hY2hpbmVyeSwgdG8gYWxsb3cgbW9kdWxlcyB0byBkZXRlcm1pbmUgaG93IG90aGVyCiAgICAgIG1vZHVsZXMgd291bGQgYXNzaWduIE1JTUUgdHlwZXMgdG8gYSBnaXZlbiBmaWxlLCBvciBvcHRpb25hbGx5CiAgICAgIHNlcnZlIGl0cyBjb250ZW50ICh0aGlzIGlzIGhlYXZpbHkgdXNlZCBieSBtb2RfZGlyLCBtb2RfaW5jbHVkZQogICAgICBhbmQgbW9kX25lZ290aWF0aW9uKS4KCiAgICopIFJlc291cmNlIHBvb2wgc3lzdGVtIGZvciBrZWVwaW5nIHRyYWNrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYW5kCiAgICAgIGZpbGVzIG9wZW5lZCBpbiBzZXJ2aWNlIG9mIGEgcGFydGljdWxhciByZXF1ZXN0LiAgTXVjaCBvZiB0aGUKICAgICAgY29kZSBpbiB0aGUgbW9kdWxlcyAod2hlbiB0aGV5IHdlcmVuJ3QgcmV3cml0ZXMpIHdhcyBhZGp1c3RlZCB0byAKICAgICAgcmVwbGFjZSBhIHBlcnZhc2l2ZSBjb252ZW50aW9uIG9mIHVzaW5nIGZpeGVkLXNpemUgYnVmZmVycyBvbgogICAgICB0aGUgc3RhY2sgd2l0aCBhbiBlcXVhbGx5IHBlcnZhc2l2ZSBjb252ZW50aW9uIG9mIHVzaW5nIG1lbW9yeQogICAgICBhbGxvY2F0ZWQgd2l0aCBwYWxsb2MoKS4KCiAgICopIFJlb3JnYW5pemF0aW9uIG9mIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogICAgICByZXF1ZXN0IHRvIGVsaW1pbmF0ZSB1c2Ugb2YgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHRyb3VibGVzb21lIAogICAgICB1bm11bmdlX25hbWUgZnVuY3Rpb24gKHVzZWQgaW4gTkNTQSBhbmQgZWFybHkgQXBhY2hlIHJlbGVhc2VzIHRvIAogICAgICBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgVVJJIHdoaWNoIG1hcHBlZCB0byBhIGdpdmVuIGZpbGVuYW1lCiAgICAgIC0tLSBhIGRpZmZpY3VsdCBwcm9wb3NpdGlvbiwgZ2l2ZW4gdGhhdCBpdCBpcyBlYXN5IHRvIHByb2R1Y2UKICAgICAgc2V0dXBzIGluIHdoaWNoIG11bHRpcGxlIFVSSXMgbWFwIHRvIHRoZSBzYW1lIGZpbGUpLgoKICAgKikgU291cmNlIGZpbGVzIHJlbmFtZWQgYW5kIHJlYXJyYW5nZWQKCiAgICopIFZlcnkgc2ltcGxlIHByZS1mb3JraW5nIGJlaGF2aW9yIC0tLSBwYXJlbnQgcHJvY2VzcyBmb3JrZWQgb2ZmIGEgCiAgICAgIGZpeGVkIG51bWJlciBvZiBjaGlsZHJlbiwgYW5kIHRoZW4ganVzdCB3YWl0ZWQgZm9yIFNJR0hVUC4KCiAgICopIE90aGVyIG1vcmUgbWlub3IgY2hhbmdlcyB0b28gbnVtZXJvdXMgdG8gbGlzdC4KCiAgIFRoaXMgcmVsZWFzZSBpbmNsdWRlZCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGxvdCBvZiBjb2RlIGZyb20gdGhlCiAgIEFwYWNoZSAwLjYuNCBwdWJsaWMgcmVsZWFzZSwgcGx1cyBhbiBlYXJseSBwcmUtZm9ya2luZyBwYXRjaAogICBjb2RldmVsb3BlZCBieSBSb2JlcnQgVGhhdSBhbmQgUm9iIEhhcnRpbGwuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuNy4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIEp1biAxOTk1CgogICAqKSBUaGVyZSB3ZXJlIGEgYnVuY2ggb2YgY2hhbmdlcyBiZXR3ZWVuIEFwYWNoZSAwLjYuNCBhbmQgMC43LjMgdGhhdAogICAgICB3ZXJlIGluY29ycG9yYXRlZCBieSBSb2IgSGFydGlsbCBvbiB0aGUgbWFpbiBicmFuY2ggd2hpbGUgUm9iZXJ0IFRoYXUKICAgICAgd29ya2VkIG9uIHRoZSBTaGFtYmhhbGEgcmV3cml0ZSBhYm92ZS4gIE1vc3Qgd2VyZSBtZXJnZWQgaW50byB0aGUKICAgICAgU2hhbWJhbGEgYXJjaGl0ZWN0dXJlIGFmdGVyIEFwYWNoZSAwLjguMC4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC42LjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgTWF5IDE5OTUKCiAgICopIFBhdGNoZXMgYnkgUm9iIEhhcnRpbGwsIENsaWZmIFNrb2xuaWNrLCBSYW5keSBUZXJidXNoLCBSb2JlcnQgVGhhdSwKICAgICAgYW5kIG90aGVycy4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC41LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgQXByIDE5OTUKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDIgQXByIDE5OTUKCiAgKikgUGF0Y2hlcyBieSBCcmlhbiBCZWhsZW5kb3JmLCBBbmRyZXcgV2lsc29uLCBSb2JlcnQgVGhhdSwKICAgICBhbmQgUm9iIEhhcnRpbGwuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IE1hciAxOTk1CgogICopIFBhdGNoZXMgYnkgUm9iZXJ0IFRoYXUsIERhdmlkIFJvYmluc29uLCBSb2IgSGFydGlsbCwgYW5kCiAgICAgQ2FybG9zIFZhcmVsYS4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggTWFyIDE5OTUKCiAgKikgQmFzZWQgb24gTkNTQSBodHRwZCAxLjMgYnkgUm9iIE1jQ29vbCBhbmQgcGF0Y2hlcyBieSBDRVJULAogICAgIFJveSBGaWVsZGluZywgUm9iZXJ0IFRoYXUsIE5pY29sYXMgUGlvY2gsIERhdmlkIFJvYmluc29uLAogICAgIEJyaWFuIEJlaGxlbmRvcmYsIFJvYiBIYXJ0aWxsLCBhbmQgQ2xpZmYgU2tvbG5pY2suCg==