Q2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNTMKCiAgKikgVXRpbF9sZGFwOiBJbXBsZW1lbnRlZCB0aGUgdXRpbF9sZGFwX2NhY2hlX2dldHVzZXJkbigpIEFQSSBzbyB0aGF0IAogICAgIGxkYXAgYXV0aG9yaXphdGlvbiBvbmx5IG1vZHVsZXMgaGF2ZSBhY2Nlc3MgdG8gdGhlIHV0aWxfbGRhcCAKICAgICB1c2VyIGNhY2hlIHdpdGhvdXQgaGF2aW5nIHRvIHJlcXVpcmUgbGRhcCBhdXRoZW50aWNhdGlvbiBhcyB3ZWxsLiAgCiAgICAgW1BSIDMxODk4XSBbSmFyaSBBaG9uZW4gamFoIHByb2dyZXNzLmNvbSwgQnJhZCBOaWNob2xlc10KCiAgKikgbW9kX2F1dGhfbGRhcDogQWRkZWQgdGhlIGRpcmVjdGl2ZSAiUmVxdWlyZXMgbGRhcC1hdHRyaWJ1dGUiIHRoYXQKICAgICBhbGxvd3MgdGhlIG1vZHVsZSB0byBvbmx5IGF1dGhvcml6ZSBhIHVzZXIgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZQogICAgIHNwZWNpZmllZCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBvYmplY3QuIFBSIDMxOTEzCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIHBvYm94LmNvbT5dCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wOTQyIChjdmUubWl0cmUub3JnKQogICAgIEZpeCBmb3IgbWVtb3J5IGNvbnN1bXB0aW9uIERvUyBpbiBoYW5kbGluZyBvZiBNSU1FIGZvbGRlZCByZXF1ZXN0CiAgICAgaGVhZGVycy4gIFtKb2UgT3J0b25dCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wODg1IChjdmUubWl0cmUub3JnKQogICAgIG1vZF9zc2w6IEZpeCBhIGJ1ZyB3aGljaCBhbGxvd2VkIGFuIFNTTENpcGhlclN1aXRlIHNldHRpbmcgdG8gYmUKICAgICBieXBhc3NlZCBkdXJpbmcgYW4gU1NMIHJlbmVnb3RpYXRpb24uICBQUiAzMTUwNS4gIAogICAgIFtIYXJ0bXV0IEtlaWwgPEhhcnRtdXQuS2VpbCBhZG5vdnVtLmNoPiwgSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBGYWlsIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gc2VnZmF1bHQgYXQgcnVudGltZSBpZiBhCiAgICAgY2xpZW50IGNlcnQgaXMgY29uZmlndXJlZCB3aXRoIGFuIGVuY3J5cHRlZCBwcml2YXRlIGtleS4KICAgICBQUiAyNDAzMC4gIFtKb2UgT3J0b25dCgogICopIGFweHM6IGZpeCBoYW5kbGluZyBvZiAtV2MvLVdsIGFuZCAiLW8gbW9kX2Zvby5zbyIuIFBSIDMxNDQ4CiAgICAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2xkYXA6IEZpeCBmb3JtYXQgc3RyaW5ncyB0byB1c2UgJUFQUl9QSURfVF9GTVQgaW5zdGVhZCBvZiAlZC4KICAgICBbSmVmZiBUcmF3aWNrXQogCiAgKikgbW9kX2NhY2hlOiBDYWNoZURpc2FibGUgd2lsbCBvbmx5IGRpc2FibGUgdGhlIFVSTHMgaXQgd2FzIG1lYW50IHRvCiAgICAgZGlzYWJsZSwgbm90IGFsbCBjYWNoaW5nLiBQUiAzMTEyOC4KICAgICBbRWR3YXJkIFJ1ZGQgPGVkZGllIG9tZWdhd2FyZS5jb20+LCBQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2NhY2hlOiBUcnkgdG8gY29ycmVjdGx5IGZvbGxvdyBSRkMgMjYxNiAxMy4zIG9uIHZhbGlkYXRpbmcgc3RhbGUKICAgICBjYWNoZSByZXNwb25zZXMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9yZXdyaXRlOiBIYW5kbGUgcGVyLWxvY2F0aW9uIHJ1bGVzIHdoZW4gci0+ZmlsZW5hbWUgaXMgdW5zZXQuCiAgICAgUHJldmlvdXNseSB0aGlzIHdvdWxkIHNlZ2ZhdWx0IG9yIHNpbXBseSBub3QgbWF0Y2ggYXMgZXhwZWN0ZWQsCiAgICAgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9yZXdyaXRlOiBGaXggcXVlcnkgc3RyaW5nIGhhbmRsaW5nIGZvciBwcm94aWVkIFVSTHMuIFBSIDE0NTE4LgogICAgIFttaWNoYWVsIHRlaXRsZXIgPG1pY2hhZWwudGVpdGxlciBjZXRlbGVtLmZyPiwKICAgICAgSmFuIEtyYXRvY2h2aWwgPHJjcHQtZGV2LkFULmh0dHBkLmFwYWNoZS5vcmcgamFua3JhdG9jaHZpbC5uZXQ+XQoKICAqKSBtb2RfcmV3cml0ZTogRml4IDAgYnl0ZXMgd3JpdGUgaW50byByYW5kb20gbWVtb3J5IHBvc2l0aW9uLgogICAgIFBSIDMxMDM2LiBbQW5kcukgTWFsb10KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IERvIG5vdCBzdG9yZSBhYm9ydGVkIGNvbnRlbnQuICBQUiAyMTQ5Mi4KICAgICBbUsO8aWdlciBQbMO8IDxyLnBsdWVtIHQtb25saW5lLmRlPl0KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IENvcnJlY3RseSBzdG9yZSBjYWNoZWQgY29udGVudCB0eXBlLiAgUFIgMzAyNzguCiAgICAgW1LDvGlnZXIgUGzDvCA8ci5wbHVlbSB0LW9ubGluZS5kZT5dCgogICopIG1vZF9sZGFwOiBwcmV2ZW50IHRoZSBwb3NzaWJsaXR5IG9mIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIExEQVAKICAgICBzdGF0aXN0aWNzIGRpc3BsYXkuIFBSIDI5MjE2IFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgbW9kX2xkYXA6IGZpeCBhIGJvZ3VzIGVycm9yIG1lc3NhZ2UgdG8gdGVsbCB0aGUgdXNlciB3aGljaCBmaWxlCiAgICAgaXMgY2F1c2luZyBhIHBvdGVudGlhbCBwcm9ibGVtIHdpdGggdGhlIExEQVAgc2hhcmVkIG1lbW9yeSBjYWNoZS4KICAgICBQUiAzMTQzMSBbR3JhaGFtIExlZ2dldHRdCgogICopIG1vZF9kaXNrX2NhY2hlOiBEbyBub3Qgc3RvcmUgaG9wLWJ5LWhvcCBoZWFkZXJzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggdGhlIHJlLWxpbmtpbmcgaXNzdWUgd2hlbiBwdXJnaW5nIGVsZW1lbnRzIGZyb20gdGhlIExEQVAgY2FjaGUKICAgICBQUiAyNDgwMSBbSmVzcyBIb2xsZSA8amVzc2ggcHRjLmNvbT5dCiAgICAgIAogICopIG1vZF9kaXNrX2NhY2hlOiBGaXggcmFjZXMgaW4gc2F2aW5nIHJlc3BvbnNlcy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IEV4cGlyZXMgaGFuZGxpbmcgaW4gbW9kX2NhY2hlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBbHRlciBtb2RfZXhwaXJlcyB0byBydW4gYXQgYSBkaWZmZXJlbnQgZmlsdGVyIHByaW9yaXR5IHRvIGFsbG93CiAgICAgcHJvcGVyIEV4cGlyZXMgc3RvcmFnZSBieSBtb2RfY2FjaGUuICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC41MgoKICAqKSBVc2UgSFRNTCAyLjAgPGhyPiBmb3IgZXJyb3IgcGFnZXMuIFBSIDMwNzMyIFtBbmRy6SBNYWxvXQoKICAqKSBGaXggdGhlIGdsb2JhbCBtdXRleCBjcmFzaCB3aGVuIHRoZSBnbG9iYWwgbXV0ZXggaXMgbmV2ZXIgYWxsb2NhdGVkCiAgICAgZHVlIHRvIGRpc2FibGVkL2VtcHR5IGNhY2hlcy4gW0plc3MgSG9sbGUgPGplc3NoIHB0Yy5jb20+XQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiB0aGUgTERBUCBjYWNoZSB3aGVuIGl0IGlzIGNvbmZpZ3VyZWQgc3dpdGNoZWQKICAgICBvZmYuIFtKZXNzIEhvbGxlIDxqZXNzaCBwdGMuY29tPl0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA4MTEgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IG1lcmdpbmcgb2YgdGhlIFNhdGlzZnkgZGlyZWN0aXZlLCB3aGljaCB3YXMgYXBwbGllZCB0bwogICAgIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGFuZCBjb3VsZCBhbGxvdyBhY2Nlc3MgZGVzcGl0ZSBjb25maWd1cmVkCiAgICAgYXV0aGVudGljYXRpb24uICBQUiAzMTMxNS4gIFtSaWNpIExha2UgPHJpY2kgcmljaWxha2UubmV0Pl0KCiAgKikgRml4IHRoZSBoYW5kbGluZyBvZiBVUklzIGNvbnRhaW5pbmcgJTJGIHdoZW4gQWxsb3dFbmNvZGVkU2xhc2hlcwogICAgIGlzIGVuYWJsZWQuICBQcmV2aW91c2x5LCBzdWNoIHVybHMgd291bGQgc3RpbGwgYmUgcmVqZWN0ZWQuCiAgICAgW0plZmYgVHJhd2ljaywgQmlsbCBTdG9kZGFyZF0KCiAgKikgbW9kX21lbV9jYWNoZTogRml4ZWQgcmFjZSBjb25kaXRpb24gY2F1c2luZyBzZWdmYXVsdCBiZWNhdXNlIG9mIG1lbW9yeSBiZWluZwogICAgIGZyZWVkIHR3aWNlLCBvciByZXVzZWQgYWZ0ZXIgYmVpbmcgZnJlZWQuCiAgICAgW0ouIENsYXIsIFcuIFN0b2RkYXJkLCBHLiBBbWVzXQogICAgCiAgKikgQWRkIC1sIG9wdGlvbiB0byByb3RhdGVsb2dzIHRvIGxldCBpdCB1c2UgbG9jYWwgdGltZSByYXRoZXIgdGhhbgogICAgIFVUQy4gIFBSIDI0NDE3LiAgW0tlbiBDb2FyLCBVbGkgWmFwcGUgPHVsaSByaXR1YWwub3JnPl0KCiAgKikgbW9kX2xvZ19jb25maWc6IEZpeCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgcmVxdWVzdCBjb21wbGV0aW9uIHRpbWUKICAgICBmcm9tIGJlaW5nIGxvZ2dlZCBmb3IgSV9JTlNJU1RfT05fRVhUUkFfQ1lDTEVTX0ZPUl9DTEZfQ09NUExJQU5DRQogICAgIHByb2Nlc3NpbmcuICBQUiAyOTY5Ni4gIFtBbG9pcyBUcmVpbmRsIDxhbG9pcyBhc3Ryby5jaD5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC41MQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDc4NiAoY3ZlLm1pdHJlLm9yZykKICAgICBGaXggYW4gaW5wdXQgdmFsaWRhdGlvbiBpc3N1ZSBpbiBhcHItdXRpbCB3aGljaCBjb3VsZCBiZQogICAgIHRyaWdnZXJlZCBieSBtYWxmb3JtZWQgSVB2NiBsaXRlcmFsIGFkZHJlc3Nlcy4gIFtKb2UgT3J0b25dCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wNzQ3IChjdmUubWl0cmUub3JnKQogICAgIEZpeCBidWZmZXIgb3ZlcmZsb3cgaW4gZXhwYW5zaW9uIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbgogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nLiAgW0FuZHLpIE1hbG9dCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wODA5IChjdmUubWl0cmUub3JnKQogICAgIG1vZF9kYXZfZnM6IEZpeCBhIHNlZ2ZhdWx0IGluIHRoZSBoYW5kbGluZyBvZiBhbiBpbmRpcmVjdCBsb2NrCiAgICAgcmVmcmVzaC4gIFBSIDMxMTgzLiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2luY2x1ZGUgbm8gbG9uZ2VyIGNoZWNrcyBmb3IgcmVjdXJzaW9uLCBiZWNhdXNlIHRoYXQncyBkb25lCiAgICAgaW4gdGhlIGNvcmUuIFRoaXMgYWxsb3dzIGZvciBjYXJlZnVsIHVzYWdlIG9mIHJlY3Vyc2l2ZSBTU0kuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIEZpeCBtZW1vcnkgbGVhayBpbiB0aGUgY2FjaGUgaGFuZGxpbmcgb2YgbW9kX3Jld3JpdGUuIFBSIDI3ODYyLgogICAgIFtjaHVueWFuIHNoZW5nIDxzaGVuZ3BlcnNvbiB5YWhvby5jb20+LCBBbmRy6SBNYWxvXQoKICAqKSBJbmNsdWRlIGRpcmVjdGl2ZXMgbm8gbG9uZ2VyIHJlZnVzZSB0byBwcm9jZXNzIHN5bWxpbmtzIG9uCiAgICAgZGlyZWN0b3JpZXMuIEluc3RlYWQgdGhlcmUncyBub3cgYSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwKICAgICBvZiBpbmNsdWRlZCBkaXJlY3RvcmllcyAoMTI4IGFzIGRpc3RyaWJ1dGVkKS4gVGhpcyBpcyBjb25maWd1cmFibGUKICAgICBhdCBjb21waWxlIHRpbWUgdXNpbmcgdGhlIC1EQVBfTUFYX0lOQ0xVREVfRElSX0RFUFRIIHN3aXRjaC4KICAgICBQUiAyODQ5Mi4gIFtBbmRy6SBNYWxvXQoKICAqKSBXaW4zMjogYXBhY2hlIC1rIHN0YXJ0fHJlc3RhcnR8aW5zdGFsbHxjb25maWcgY2FuIGxlYXZlIHN0cmFuZGVkCiAgICAgcGlwZWQgbG9nZ2VyIHByb2Nlc3NlcyAoZWcsIHJvdGF0ZWxvZ3MuZXhlKSBkdWUgdG8gaW1wcm9wZXIKICAgICBzZXJ2ZXIgc2h1dGRvd24gb24gdGhlc2UgY29kZSBwYXRocy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA3NTEgKGN2ZS5taXRyZS5vcmcpCiAgICAgbW9kX3NzbDogRml4IGEgc2VnZmF1bHQgaW4gdGhlIFNTTCBpbnB1dCBmaWx0ZXIgd2hpY2ggY291bGQgYmUKICAgICB0cmlnZ2VyZWQgaWYgdXNpbmcgInNwZWN1bGF0aXZlIiBtb2RlLCBmb3IgaW5zdGFuY2UgYnkgYSAKICAgICBwcm94eSByZXF1ZXN0IHRvIGFuIFNTTCBzZXJ2ZXIuICBQUiAzMDEzNC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9yZXdyaXRlOiBBZGQgJXtTU0w6Li4ufSBhbmQgJXtIVFRQU30gdmFyaWFibGUgbG9va3Vwcy4KICAgICBQUiAzMDQ2NC4gIFtKb2UgT3J0b24sIE1hZGh1c3VkYW4gTWF0aGloYWxsaV0KCiAgKikgbW9kX3NzbDogQWRkIG5ldyAnc3NsX2lzX2h0dHBzJyBvcHRpb25hbCBmdW5jdGlvbi4gIFtKb2UgT3J0b25dCgogICopIFByZXZlbnQgQ0dJIHNjcmlwdCBvdXRwdXQgd2hpY2ggaW5jbHVkZXMgYSBDb250ZW50LVJhbmdlIGhlYWRlcgogICAgIGZyb20gYmVpbmcgcGFzc2VkIHRocm91Z2ggdGhlIGJ5dGVyYW5nZSBmaWx0ZXIuICBbSm9lIE9ydG9uXQoKICAqKSBTYXRpc2Z5IGRpcmVjdGl2ZXMgbm93IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGEgc3Vycm91bmRpbmcgPExpbWl0PgogICAgIGNvbnRhaW5lci4gIFBSIDE0NzI2LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlIG5vdyBvZmZpY2lhbGx5IHN1cHBvcnRzIFJld3JpdGVSdWxlcyBpbiA8UHJveHk+IHNlY3Rpb25zLgogICAgIFBSIDI3OTg1LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9kaXNrX2NhY2hlOiBJbXBsZW1lbnQgYmluYXJ5IGZvcm1hdCBmb3Igb24tZGlzayBoZWFkZXIgZmlsZXMuCiAgICAgW0JyaWFuIEFraW5zIDxiYWtpbnMgd2ViLnR1cm5lci5jb20+LCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IE9wdGltaXplIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb2YgZGlzayBjYWNoZSBzdWJzeXN0ZW0gYnkKICAgICBhbGxvd2luZyB6ZXJvLWNvcHkgKHNlbmRmaWxlKSB3cml0ZXMgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZml4ZXMuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfY2FjaGUsIG1vZF9kaXNrX2NhY2hlLCBtb2RfbWVtX2NhY2hlOiBSZWZhY3RvciBjYWNoZSBtb2R1bGVzLCBhbmQKICAgICBzd2l0Y2ggdG8gdGhlIHByb3ZpZGVyIEFQSSBpbnN0ZWFkIG9mIGhvb2tzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfYXV0b2luZGV4OiBEb24ndCB0cnVuY2F0ZSB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgaWYgYSBzdGF0KCkKICAgICBjYWxsIGZhaWxzIChmb3IgaW5zdGFuY2Ugb24gYSA+MkdiIGZpbGUpLiAgUFIgMTczNTcuCiAgICAgW0pvZSBPcnRvbl0KCiAgKikgTWFrZWZpbGUgZml4OiBodHRwZCBpcyBsaW5rZWQgYWdhaW5zdCBMSUJTIGdpdmVuIHRvIHRoZQogICAgICdtYWtlJyBpbnZvY2F0aW9uLiAgUFIgNzg4Mi4gIFtKb2UgT3J0b25dCgogICopIFdpbk5UIE1QTTogRml4IGEgYnJva2VuIGxvZyBtZXNzYWdlIGF0IHRlcm1pbmF0aW9uLiAgUFIgMjgwNjMuCiAgICAgW0VpZGVyIE9saXZlaXJhIDxlaWRlciBib2wuY29tLmJyPl0KCiAgKikgUHJldmVudCBXaW4zMiBwb29sIGNvcnJ1cHRpb24gYXQgc3RhcnR1cCBbQWxsYW4gRWR3YXJkc10KCiAgKikgbW9kX3NzbDogQWRkICJTU0xVc2VyTmFtZSIgZGlyZWN0aXZlIHRvIHNldCByLT51c2VyIGJhc2VkIG9uIGEKICAgICBjaG9zZW4gU1NMIGVudmlyb25tZW50IHZhcmlhYmxlLiAgUFIgMjA5NTcuIAogICAgIFtNYXJ0aW4gdi4gTG9ld2lzIDxtYXJ0aW4gdi5sb2V3aXMuZGU+XQoKICAqKSBzdWV4ZWM6IFBhc3MgdGhlIFNFUlZFUl9TSUdOQVRVUkUgZW52dmFyIHRocm91Z2ggdG8gQ0dJcy4KICAgICBbWnZpIEhhcidFbCA8cmwgbWF0aC50ZWNobmlvbi5hYy5pbD5dCgogICopIGFwYWNoZWN0bDogRml4IGEgcHJvYmxlbSBmaW5kaW5nIGVudnZhcnMgaWYgc2JpbmRpciAhPSBiaW5kaXIuCiAgICAgUFIgMzA3MjMuICBbRnJpZWRyaWNoIEhhdWJlbnNhayA8aHNrIGltYi1qZW5hLmRlPl0KCiAgKikgbW9kX3NzbDogQnVpbGQgb24gUkhFTCAzLiAgUFIgMTg5ODkuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wNzQ4IChjdmUubWl0cmUub3JnKQogICAgIG1vZF9zc2w6IEZpeCBhIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wLiAgUFIgMjk5NjQuICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBBdm9pZCBzdGFydHVwIGZhaWx1cmUgYWZ0ZXIgdW5jbGVhbiBzaHV0ZG93biBpZiB1c2luZyBzaG1jYi4KICAgICBQUiAxODk4OS4gIFtKb2UgT3J0b25dCgogICopIG1vZF91c2VyZGlyOiBFbnN1cmUgdGhhdCB0aGUgdXNlcmRpciBpZGVudGl0eSBpcyB1c2VkIGZvcgogICAgIHN1ZXhlYyB1c2VyZGlyIGFjY2VzcyBpbiBhIHZpcnR1YWwgaG9zdCB3aGljaCBoYXMgc3VleGVjIGNvbmZpZ3VyZWQuICAKICAgICBQUiAxODE1Ni4gIFtKb3NodWEgU2xpdmVdCgogICopIG1vZF9yZXdyaXRlIG5vIGxvbmdlciBjb25mdXNlcyB0aGUgUmV3cml0ZU1hcCBjYWNoZXMgaWYKICAgICBkaWZmZXJlbnQgbWFwcyBkZWZpbmVkIGluIGRpZmZlcmVudCB2aXJ0dWFsIGhvc3RzIHVzZSB0aGUKICAgICBzYW1lIG1hcCBuYW1lLiBQUiAyNjQ2Mi4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc2V0ZW52aWY6IFJlbW92ZSAic3VwcG9ydCIgZm9yIFJlbW90ZV9Vc2VyIHZhcmlhYmxlIHdoaWNoCiAgICAgbmV2ZXIgd29ya2VkIGF0IGFsbC4gUFIgMjU3MjUuICBbQW5kcukgTWFsb10KCiAgKikgQmFja3BvcnQgZnJvbSAyLjEgLyBSZWdyZXNzaW9uIGZyb20gMS4zOiBtb2RfaGVhZGVycyBub3cga25vd3MKICAgICBhZ2FpbiB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgRXJyb3JIZWFkZXIgZGlyZWN0aXZlLiBCdXQgaW5zdGVhZAogICAgIHVzaW5nIHRoaXMgbWlzbm9tZXIgYWRkaXRpb25hbCBmbGFncyB0byB0aGUgSGVhZGVyIGRpcmVjdGl2ZSB3ZXJlCiAgICAgaW50cm9kdWNlZCAoImFsd2F5cyIgYW5kICJvbnN1Y2Nlc3MiLCBkZWZhdWx0aW5nIHRvIHRoZSBsYXR0ZXIpLgogICAgIFBSIDI4NjU3LiAgW0FuZHLpIE1hbG9dCgogICopIFVzZSB0aGUgaGlnaGVyIHBlcmZvcm1pbmcgJ2h0dHByZWFkeScgQWNjZXB0IEZpbHRlciBvbiBhbGwgcGxhdGZvcm1zIAogICAgIGV4Y2VwdCBGcmVlQlNEIDwgNC4xLjEuIFtQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX3VzZXJ0cmFjazogRXNjYXBlIHRoZSBjb29raWUgbmFtZSBiZWZvcmUgcGFzdGluZyBpbnRvIHRoZQogICAgIHJlZ2V4cC4gIFtBbmRy6SBNYWxvXQoKICAqKSBFeHRlbmQgdGhlIFNldEVudklmIGRpcmVjdGl2ZSB0byBjYXB0dXJlIHN1YmV4cHJlc3Npb25zIG9mIHRoZQogICAgIG1hdGNoZWQgdmFsdWUuICBbQW5kcukgTWFsb10KCiAgKikgUmVjdXJzaXZlIEluY2x1ZGUgZGlyZWN0aXZlcyBubyBsb25nZXIgY3Jhc2guIFRoZSBzZXJ2ZXIgc3RvcHMKICAgICBpbmNsdWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBhZnRlciBhIGNlcnRhaW4gbmVzdGluZyBsZXZlbCAoMTI4CiAgICAgYXMgZGlzdHJpYnV0ZWQpLiBUaGlzIGlzIGNvbmZpZ3VyYWJsZSBhdCBjb21waWxlIHRpbWUgdXNpbmcgdGhlCiAgICAgLURBUF9NQVhfSU5DTFVERV9ERVBUSCBzd2l0Y2guIFBSIDI4MzcwLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9kaXI6IHRoZSB0cmFpbGluZy1zbGFzaCBiZWhhdmlvdXIgaXMgbm93IGNvbmZpZ3VyYWJsZSB1c2luZyB0aGUKICAgICBEaXJlY3RvcnlTbGFzaCBkaXJlY3RpdmUuICBbQW5kcukgTWFsb10KCiAgKikgQWxsb3cgcHJveHlpbmcgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIGludm9rZWQgdmlhIERpcmVjdG9yeUluZGV4LgogICAgIFBSIDE0NjQ4LCAxNTExMiwgMjk5NjEuICBbQW5kcukgTWFsb10KCiAgKikgdXRpbF9sZGFwOiBTd2l0Y2hlZCB0aGUgbG9jayB0eXBlcyBvbiB0aGUgc2hhcmVkIG1lbW9yeSBjYWNoZSAKICAgICBmcm9tIHRocmVhZCByZWFkZXIvd3JpdGVyIGxvY2tzIHRvIGdsb2JhbCBtdXRleGVzIGluIG9yZGVyIHRvIAogICAgIHByb3ZpZGUgY3Jvc3MgcHJvY2VzcyBjYWNoZSBwcm90ZWN0aW9uLiBbQnJhZCBOaWNob2xlc10KICAgICAKICAqKSB1dGlsX2xkYXA6IFJld29ya2VkIHRoZSBjYWNoZSBsb2NraW5nIHNjaGVtZSB0byBlbGltaW5hdGUgZHVwbGljYXRlIAogICAgIGNhY2hlIGVudHJpZXMgaW4gdGhlIGNyZWRlbnRpYWxzIGNhY2hlIGR1ZSB0byByYWNlIGNvbmRpdGlvbnMuCiAgICAgW0JyYWQgTmljaG9sZXNdCiAgICAgCiAgKikgdXRpbF9sZGFwOiBFbmhhbmNlZCB0aGUgdXRpbF9sZGFwIGNhY2hlLWluZm8gZGlzcGxheSB0byBzaG93IG1vcmUgCiAgICAgZGV0YWlsIGFib3V0IHRoZSBjb250ZW50cyBhbmQgY3VycmVudCBzdGF0ZSBvZiB0aGUgY2FjaGUuIAogICAgIFtCcmFkIE5pY2hvbGVzXQogICAgIAogICopIEVuYWJsZSB0aGUgb3B0aW9uIHRvIHN1cHBvcnQgYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgaW4gbW9kX2xkYXAuCiAgICAgVGhpcyBtYWtlcyB0aGUgY2FjaGUgd29yayBvbiBMaW51eCBhZ2Fpbi4gW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBFbmFibGUgc3BlY2lhbCBFcnJvckRvY3VtZW50IHZhbHVlICdkZWZhdWx0JyB3aGljaCByZXN0b3JlcyB0aGUKICAgICBjYW5uZWQgc2VydmVyIHJlc3BvbnNlIGZvciB0aGUgc2NvcGUgb2YgdGhlIGRpcmVjdGl2ZS4KICAgICBbR2VvZmZyZXkgWW91bmcsIEFuZHLpIE1hbG9dCgogICopIHdvcmsgYXJvdW5kIE1TSUUgRGlnZXN0IGF1dGggYnVnIC0gaWYgQXV0aERpZ2VzdEVuYWJsZVF1ZXJ5U3RyaW5nSGFjawogICAgIGlzIHNldCBpbiByLT5zdWJwcm9jZXNzX2VudiBhbGxvdyBtaXNtYXRjaGVkIHF1ZXJ5IHN0cmluZ3MgdG8gcGFzcy4KICAgICBQUiAyNzc1OC4gIFtQYXVsIFF1ZXJuYSwgR2VvZmZyZXkgWW91bmddCgogICopIEFjY2VwdCBVUkxzIGZvciB0aGUgU2VydmVyQWRtaW4gZGlyZWN0aXZlLiBJZiB0aGUgc3VwcGxpZWQKICAgICBhcmd1bWVudCBpcyBub3QgcmVjb2duaXplZCBhcyBhbiBVUkwsIGFzc3VtZSBpdCdzIGEgbWFpbCBhZGRyZXNzLgogICAgIFBSIDI4MTc0LiAgW0FuZHLpIE1hbG8sIFBhdWwgUXVlcm5hXQoKICAqKSBpbml0aWFsaXplIHNlcnZlciBhcnJheXMgcHJpb3IgdG8gY2FsbGluZyBhcF9zZXR1cF9wcmVsaW5rZWRfbW9kdWxlcwogICAgIHNvIHRoYXQgc3RhdGljIG1vZHVsZXMgY2FuIHB1c2ggRGVmaW5lcyB2YWx1ZXMgd2hlbiByZWdpc3RlcmluZwogICAgIGhvb2tzIGp1c3QgbGlrZSBEU08gbW9kdWxlcyBjYW4gWyJQaGlsaXBwZSBNLiBDaGlhc3NvbiIgPGdvemVyIGNwYW4ub3JnPl0KCiAgKikgU21hbGwgZml4IHRvIGFsbG93IHJldmVyc2UgcHJveHlpbmcgdG8gYW4gZnRwIHNlcnZlci4gUHJldmlvdXNseQogICAgIGFuIGF0dGVtcHQgdG8gZG8gdGhpcyB3b3VsZCB0cnkgYW5kIGNvbm5lY3QgdG8gMC4wLjAuMCwgcmVnYXJkbGVzcwogICAgIG9mIHRoZSBzZXJ2ZXIgc3BlY2lmaWVkLiBQUiAyNDkyMgogICAgIFtQYXNjYWwgVGVyamFuIDxwdGVyamFuQGxpbnV4ZnIub3JnPl0KCiAgKikgQWRkIHRoZSBOT1RJQ0UgZmlsZSB0byB0aGUgcnBtIHNwZWMgZmlsZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICAgQXBhY2hlIHYyLjAgbGljZW5zZS4gW0dyYWhhbSBMZWdnZXR0XQogCiAgKikgUlBNIHNwZWMgZmlsZSBjaGFuZ2VzOiBjaGFuZ2VkIGRlZmF1bHQgZGVwZW5kYW5jeSB0byBsaW5rIHRvIGRiNAogICAgIGluc3RlYWQgb2YgZGIzLiBGaXhlZCBjb21wbGFpbnRzIGFib3V0IHVucGFja2FnZWQgZmlsZXMuCiAgICAgW0dyYWhhbSBMZWdnZXR0XQogCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjUwCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wNDkzIChjdmUubWl0cmUub3JnKQogICAgIENsb3NlIGEgZGVuaWFsIG9mIHNlcnZpY2UgdnVsbmVyYWJpbGl0eSBpZGVudGlmaWVkIGJ5IEdlb3JnaQogICAgIEd1bmluc2tpIHdoaWNoIGNvdWxkIGxlYWQgdG8gbWVtb3J5IGV4aGF1c3Rpb24gd2l0aCBjZXJ0YWluCiAgICAgaW5wdXQgZGF0YS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9jZ2k6IEhhbmRsZSBvdXRwdXQgb24gc3RkZXJyIGR1cmluZyBzY3JpcHQgZXhlY3V0aW9uIG9uIFVuaXgKICAgICBwbGF0Zm9ybXM7IHByZXZlbnRpbmcgZGVhZGxvY2sgd2hlbiBzdGRlcnIgb3V0cHV0IGZpbGxzIHBpcGUgYnVmZmVyLgogICAgIEFsc28gZml4ZXMgY2FzZSB3aGVyZSBzdGRlcnIgZnJvbSBucGgtIHNjcmlwdHMgY291bGQgYmUgbG9zdC4KICAgICBQUiAyMjAzMCwgMTgzNDguICBbSm9lIE9ydG9uLCBKZWZmIFRyYXdpY2tdCgogICopIG1vZF9hbGlhcyBub3cgZW1pdHMgYSB3YXJuaW5nIGlmIGl0IGRldGVjdHMgb3ZlcmxhcHBpbmcgKkFsaWFzKgogICAgIGRpcmVjdGl2ZXMuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGUgbm8gbG9uZ2VyIHR1cm5zIGZvcndhcmQgcHJveHkgcmVxdWVzdHMgaW50byByZXZlcnNlIHByb3h5CiAgICAgcmVxdWVzdHMuIFBSIDI4MTI1ICBbYXN0IGRvbWR2LmRlLCBBbmRy6SBNYWxvXQoKICAqKSBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbCBhbmQgYXBfZmluYWxpemVfc3ViX3JlcV9wcm90b2NvbCBhcmUgbm93CiAgICAgZXhwb3J0ZWQgb24gV2luMzIgYW5kIE5ldHdhcmUgYXMgd2VsbCAobWlub3IgTU1OIGJ1bXApLiAgUFIgMjg1MjMuCiAgICAgW0Vkd2FyZCBSdWRkIDxlZGRpZSBvbWVnYXdhcmUuY29tPiwgQW5kcukgTWFsb10KCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgQWNjZXB0RXggb24gV2luOXggc3lzdGVtcwogICAgIGF1dG9tYXRpY2FsbHkgKGJyb2tlbiBpbiAyLjAuNDkpLiBQUiAyODUyOS4gIFtBbmRy6SBNYWxvXQoKICAqKSA8VmlydHVhbEhvc3QgbXlob3N0PiBub3cgYXBwbGllcyB0byBhbGwgSVAgYWRkcmVzc2VzIGZvciBteWhvc3QKICAgICBpbnN0ZWFkIG9mIGp1c3QgdGhlIGZpcnN0IG9uZSByZXBvcnRlZCBieSB0aGUgcmVzb2x2ZXIuICBUaGlzCiAgICAgY29ycmVjdHMgYSByZWdyZXNzaW9uIHNpbmNlIDEuMy4gIFtKZWZmIFRyYXdpY2tdCgogICopIHV0aWxfbGRhcDogYWxsb3cgcmVsYXRpdmUgcGF0aHMgZm9yIExEQVBUcnVzdGVkQ0EgdG8gYmUgcmVzb2x2ZWQKICAgICBhZ2FpbnN0IFNlcnZlclJvb3QgUFIjMjY2MDIgW0JyYWQgTmljaG9sZXNdCiAgICAgICAKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDQ4OCAoY3ZlLm1pdHJlLm9yZykKICAgICBtb2Rfc3NsOiBGaXggYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIEZha2VCYXNpY0F1dGggY29kZSBmb3IgYQogICAgICh0cnVzdGVkKSBjbGllbnQgY2VydGlmaWNhdGUgc3ViamVjdCBETiB3aGljaCBleGNlZWRzIDZLIGluIGxlbmd0aC4KICAgICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfZGF2X2ZzOiBGaXggTUtDT0wgcmVzcG9uc2UgZm9yIG1pc3NpbmcgcGFyZW50IGNvbGxlY3Rpb25zLCB3aGljaCAKICAgICBjYXVzZWQgaXNzdWVzIGZvciB0aGUgRWNsaXBzZSBXZWJEQVYgZXh0ZW5zaW9uLgogICAgIFBSIDI5MDM0LiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2RlZmxhdGU6IEZpeCBtZW1vcnkgY29uc3VtcHRpb24gKHdoaWNoIHdhcyBwcm9wb3J0aW9uYWwgdG8gdGhlCiAgICAgcmVzcG9uc2Ugc2l6ZSkuICBQUiAyOTMxOC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9zc2w6IExvZyB0aGUgZXJyb3JzIHJldHVybmVkIG9uIGZhaWx1cmUgdG8gbG9hZCBvciBpbml0aWFsaXplCiAgICAgYSBjcnlwdG8gYWNjZWxlcmF0b3IgZW5naW5lLiAgW0pvZSBPcnRvbl0KCiAgKikgQWxsb3cgUmVxdWVzdEhlYWRlciBkaXJlY3RpdmVzIHRvIGJlIGNvbmRpdGlvbmFsLiBQUiAyNzk1MS4KICAgICBbVmluY2VudCBEZWZmb250YWluZXMgPHZpbmNlbnQgZ3J5em9yLmNvbT4sIEFuZHLpIE1hbG9dCgogICopIEFsbG93IExpbWl0UmVxdWVzdEJvZHkgdG8gYmUgcmVzZXQgdG8gdW5saW1pdGVkLiBQUiAyOTEwNgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBGaXggYSBidW5jaCBvZiBjYXNlcyB3aGVyZSB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIHJlZ2V4IGNvbXBpbGVyCiAgICAgd2FzIG5vdCBjaGVja2VkIHByb3Blcmx5LiBUaGlzIGFmZmVjdHM6IG1vZF9zZXRlbnZpZiwgbW9kX3VzZXJ0cmFjaywKICAgICBtb2RfcHJveHksIG1vZF9wcm94eV9mdHAgYW5kIGNvcmUuIFBSIDI4MjE4LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9zc2w6IEZpeCBhIHBvdGVudGlhbCBzZWdmYXVsdCBpbiB0aGUgJ3NobWNiJyBzZXNzaW9uIGNhY2hlIGZvcgogICAgIHNtYWxsIGNhY2hlIHNpemVzLiAgUFIgMjc3NTEuICBbR2VvZmYgVGhvcnBlIDxnZW9mZiBnZW9mZnRob3JwZS5uZXQ+XQoKICAqKSBSZW1vdmUgMkdiIGxvZyBmaWxlIHNpemUgcmVzdHJpY3Rpb24gb24gc29tZSAzMi1iaXQgcGxhdGZvcm1zLgogICAgIFBSIDEzNTExLiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2xvZ2lvIG5vIGxvbmdlciByZW1vdmVzIHRoZSBFT1MgYnVja2V0LiBQUiAyNzkyOC4KICAgICBbQm9qYW4gU21vanZlciA8Ym9qYW4gcmV4dXJzaXZlLmNvbT5dCgogICopIGh0cGFzc3dkIG5vIGxvbmdlciByZWZ1c2VzIHRvIHByb2Nlc3MgZmlsZXMgdGhhdCBjb250YWluIGVtcHR5CiAgICAgbGluZXMuICBbQW5kcukgTWFsb10KCiAgKikgUmVncmVzc2lvbiBmcm9tIDEuMzogQXQgc3RhcnR1cCwgc3VleGVjIG5vdyB3aWxsIGJlIGNoZWNrZWQgZm9yCiAgICAgYXZhaWxhYmlsaXR5LCB0aGUgc2V0dWlkIGJpdCBhbmQgdXNlciByb290LiBUaGUgd29ya3Mgb25seSBpZgogICAgIGh0dHBkIGlzIGNvbXBpbGVkIHdpdGggdGhlIHNoaXBwZWQgQVBSIHZlcnNpb24gKDAuOS41KS4KICAgICBQUiAyODI4Ny4gIFtBbmRy6SBNYWxvXQoKICAqKSBVbml4IE1QTXM6IFN0b3AgZHJvcHBpbmcgY29ubmVjdGlvbnMgd2hlbiB0aGUgZmlsZSBkZXNjcmlwdG9yCiAgICAgaXMgYXQgbGVhc3QgRkRfU0VUU0laRS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBoYW5kbGluZyBvZiBJUHY2IG51bWVyaWMgc3RyaW5ncyBpbiBtb2RfcHJveHkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfaXNhcGk6IHNlbmRfcmVzcG9uc2VfaGVhZGVyKCkgZmFpbGVkIHRvIGNvcHkgc3RhdHVzIHN0cmluZydzIAogICAgIGxhc3QgY2hhcmFjdGVyLiAgUFIgMjA2MTkuICBbSmVzc2UgUGVsdG9uIDxqc3AgcGtjLmNvbT5dCgogICopIEZpeCBhIHNlZ2ZhdWx0IHdoZW4gcmVxdWVzdHMgZm9yIHNoYXJlZCBtZW1vcnkgZmFpbHMgYW5kIHJldHVybnMKICAgICBOVUxMLiBGaXggYSBzZWdmYXVsdCBjYXVzZWQgYnkgYSBsYWNrIG9mIGJvdW5kcyBjaGVja2luZyBvbiB0aGUKICAgICBjYWNoZS4gIFBSIDI0ODAxLiAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBUaHJvdyBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgdGhlIExEQVBUcnVzdGVkQ0EKICAgICBvciBMREFQVHJ1c3RlZENBVHlwZSBkaXJlY3RpdmVzIGluIGEgVmlydHVhbEhvc3QuIFBSIDI2MzkwCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIEZpeCBhIHBvdGVudGlhbCBzZWdmYXVsdCBpZiB0aGUgYmluZCBwYXNzd29yZCBpbiB0aGUgTERBUCBjYWNoZQogICAgIGlzIE5VTEwuICBQUiAyODI1MC4gIFtKYXJpIEFob25lbiA8amFoIHByb2dyZXNzLmNvbT5dCgogICopIFF1b3RlcyBjYW5ub3QgYmUgdXNlZCBhcm91bmQgcmVxdWlyZSBncm91cCBhbmQgcmVxdWlyZSBkbgogICAgIGRpcmVjdGl2ZXMsIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoaXMuIEFsc28gYWRkCiAgICAgcXVvdGVzIGFyb3VuZCB0aGUgZG4gYW5kIGdyb3VwIHdpdGhpbiBkZWJ1ZyBtZXNzYWdlcywgdG8gbWFrZSBpdAogICAgIG1vcmUgb2J2aW91cyB3aHkgYXV0aGVudGljYXRpb24gaXMgZmFpbGluZyBpZiBxdW90ZXMgYXJlIHVzZWQgaW4KICAgICBlcnJvci4gIFBSIDE5MzA0LiAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBUaGUgTWljcm9zb2Z0IExEQVAgU0RLIGVzY2FwZXMgZmlsdGVycyBmb3IgdXMsIHN0b3AgdXRpbF9sZGFwCiAgICAgZnJvbSBlc2NhcGluZyBmaWx0ZXJzIHR3aWNlIHdoZW4gdGhlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaXMgdXNlZC4KICAgICBQUiAyNDQzNy4gIFtKZXNzIEhvbGxlIDxqZXNzaCBwdGMuY29tPl0KCiAgKikgT3ZlcmhhdWwgaGFuZGxpbmcgb2YgTERBUCBlcnJvciBjb25kaXRpb25zLCBzbyB0aGF0IHRoZSB1dGlsX2xkYXBfKgogICAgIGZ1bmN0aW9ucyBsZWF2ZSB0aGUgY29ubmVjdGlvbnMgaW4gYSBzYW5lIHN0YXRlIGFmdGVyIGVycm9ycyBoYXZlCiAgICAgb2NjdXJyZWQuIFBSIDI3NzQ4LCAxNzI3NCwgMTc1OTksIDE4NjYxLCAyMTc4NywgMjQ1OTUsIDI0NjgzLCAyNzEzNCwKICAgICAyNzI3MSBbR3JhaGFtIExlZ2dldHRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKikgbW9kX2xkYXAgY2FsbHMgbGRhcF9zaW1wbGVfYmluZF9zKCkgdG8gdmFsaWRhdGUgdGhlIHVzZXIKICAgICBjcmVkZW50aWFscy4gIElmIHRoZSBiaW5kIGZhaWxzLCB0aGUgY29ubmVjdGlvbiBpcyBsZWZ0CiAgICAgaW4gYW4gdW5ib3VuZCBzdGF0ZS4gIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZGFwIGNvbm5lY3Rpb24KICAgICByZWNvcmQgaXMgdXBkYXRlZCB0byBzaG93IHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyCiAgICAgYm91bmQuIFtCcmFkIE5pY2hvbGVzXQoKICAqKSBFbnN1cmUgdGhhdCBsaW5lcyBpbiB0aGUgcmVxdWVzdCB3aGljaCBhcmUgdG9vIGxvbmcgYXJlIAogICAgIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGxvZ2dpbmcuCiAgICAgW1RzdXJ1dGFuaSBOYW9raSA8dHVydXRhbmkgc2NwaHlzLmt5b3RvLXUuYWMuanA+XQoKICAqKSBVcGRhdGUgdGhlIGJpbmQgY3JlZGVudGlhbHMgZm9yIHRoZSBjYWNoZWQgTERBUCBjb25uZWN0aW9uIHRvIAogICAgIHJlZmxlY3QgdGhlIGxhc3QgYmluZC4gIFRoaXMgcHJldmVudHMgdXRpbF9sZGFwIGZyb20gY3JlYXRpbmcgCiAgICAgdW5uZWNlc3NhcnkgY29ubmVjdGlvbnMgcmF0aGVyIHRoYW4gcmV1c2luZyBjYWNoZWQgY29ubmVjdGlvbnMuCiAgICAgW0JyYWQgTmljaG9sZXNdCiAgICAgCiAgKikgbW9kX2lzYXBpOiBHZXRTZXJ2ZXJWYXJpYWJsZSByZXR1cm5lZCBpbXByb3Blcmx5IHRlcm1pbmF0ZWQgaGVhZGVyIAogICAgIGZpZWxkcyBnaXZlbiAiQUxMX0hUVFAiIG9yICJBTExfUkFXIi4gIFBSIDIwNjU2LgogICAgIFtKZXNzZSBQZWx0b24gPGpzcCBwa2MuY29tPl0KCiAgKikgbW9kX2lzYXBpOiBHZXRTZXJ2ZXJWYXJpYWJsZSgiQUxMX1JBVyIpIHJldHVybmVkIHRoZSB3cm9uZyBidWZmZXIKICAgICBzaXplLiAgUFIgMjA2MTcuICBbSmVzc2UgUGVsdG9uIDxqc3AgcGtjLmNvbT5dCgogICopIG1vZF9kYXY6IEZpeCBhIHByb2JsZW0gdGhhdCBjb3VsZCBjYXVzZSBjcmFzaGVzIHdoZW4gbWFuaXB1bGF0aW5nIAogICAgIGxvY2tzIG9uIHNvbWUgcGxhdGZvcm1zLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2hlYWRlcnMgbm8gbG9uZ2VyIGNyYXNoZXMgaWYgYW4gZW1wdHkgaGVhZGVyIHZhbHVlIHNob3VsZAogICAgIGJlIGFkZGVkLiAgW0FuZHLpIE1hbG9dCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfZXhwaXJlcywgd2hpY2ggb2NjdXJlZCB1bmRlciBjZXJ0YWluCiAgICAgY2lyY3Vtc3RhbmNlcy4gUFIgMjgwNDcuICBbQW5kcukgTWFsb10KCiAgKikgaHRwYXNzd2Q6IHVzZSBhcHJfdGVtcF9kaXJfZ2V0KCkgYW5kIGdlbmVyYWwgY2xlYW51cAogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD4sIFRob20gTWF5XQoKICAqKSBtb2Rfc3NsOiBGaXggbWVtb3J5IGxlYWsgaW4gc2Vzc2lvbiBjYWNoZSBoYW5kbGluZy4gIFBSIDI2NTYyCiAgICAgW01hZGh1c3VkYW4gTWF0aGloYWxsaV0KCiAgKikgbW9kX3NzbDogRml4IHBvdGVudGlhbCBzZWdmYXVsdHMgd2hlbiBwZXJmb3JtaW5nIFNTTCBzaHV0ZG93biBmcm9tCiAgICAgYSBwb29sIGNsZWFudXAuICBQUiAyNzk0NS4gIFtKb2UgT3J0b25dCgogICopIEFkZCBmb3JlbnNpYyBsb2dnaW5nIG1vZHVsZSAobW9kX2xvZ19mb3JlbnNpYykuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIGxvZ3Jlc29sdmU6IEFsbG93IHNpemUgb2YgbG9nIGxpbmUgYnVmZmVyIHRvIGJlIG92ZXJyaWRkZW4gYXQKICAgICBidWlsZCB0aW1lIChNQVhMSU5FKS4gIFBSIDI3NzkzLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHRoZSBjb21tZW50IGRlbGltaXRlciBpbiBodGRibSBzbyB0aGF0IGl0IGNvcnJlY3RseSBwYXJzZXMgdGhlIAogICAgIHVzZXJuYW1lIGNvbW1lbnQuICBBbHNvIGFkZCBhIHRlcm1pbmF0ZSBmdW5jdGlvbiB0byBhbGxvdyBOZXRXYXJlIAogICAgIHRvIHBhdXNlIHRoZSBvdXRwdXQgYmVmb3JlIHRoZSBzY3JlZW4gaXMgZGVzdHJveWVkLgogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD4sIEJyYWQgTmljaG9sZXNdIAogIAogICopIEZpeCBjcmFzaCB3aGVuIEFwYWNoZSB3YXMgc3RhcnRlZCB3aXRoIG5vIExpc3RlbiBkaXJlY3RpdmVzLgogICAgIFtNaWNoYWVsIENvcmNvcmFuIDxtY29yY29yYW4gd2FycHNvbHV0aW9ucy5jb20+XQoKICAqKSBjb3JlX291dHB1dF9maWx0ZXI6IEZpeCBidWcgdGhhdCBjb3VsZCByZXN1bHQgaW4gc2VuZGluZwogICAgIGdhcmJhZ2Ugb3ZlciB0aGUgbmV0d29yayB3aGVuIG1vZHVsZSBoYW5kbGVycyBjb25zdHJ1Y3QKICAgICBidWNrZXQgYnJpZ2FkZXMgY29udGFpbmluZyBtdWx0aXBsZSBmaWxlIGJ1Y2tldHMgYWxsIHJlZmVyZW5jaW5nCiAgICAgdGhlIHNhbWUgb3BlbiBmaWxlIGRlc2NyaXB0b3IuIFtCb2phbiBTbW9qdmVyXQoKICAqKSBGaXggbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSB3aXRoIGFwX2N1c3RvbV9yZXNwb25zZSgpIGZ1bmN0aW9uLgogICAgIFRoZSBjb3JlIHBlci1kaXIgY29uZmlnIHdvdWxkIGxhdGVyIHBvaW50IHRvIHJlcXVlc3QgcG9vbCBkYXRhCiAgICAgdGhhdCB3b3VsZCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBwdXJwb3NlcyBvbiBkaWZmZXJlbnQgcmVxdWVzdHMuCiAgICAgW0plZmYgVHJhd2ljaywgYmFzZWQgb24gYW4gb2xkIDEuMyBwYXRjaCBzdWJtaXR0ZWQgYnkgV2lsbCBMb3dlXQoKICAqKSBXaW4zMjogVHdlYWsgd29ya2VyIHRocmVhZCBhY2NvdW50aW5nIHJvdXRpbmVzIHRvIGVsaW1pbmF0ZQogICAgIHNlcnZlciBoYW5nIHdoZW4gbnVtYmVyIG9mIExpc3RlbiBkaXJlY3RpdmVzIGluIGh0dHBkLmNvbmYKICAgICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNldHRpbmcgb2YgVGhyZWFkc1BlckNoaWxkLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDkKCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTAxNzQgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IHN0YXJ2YXRpb24gaXNzdWUgb24gbGlzdGVuaW5nIHNvY2tldHMgd2hlcmUgYSBzaG9ydC1saXZlZAogICAgIGNvbm5lY3Rpb24gb24gYSByYXJlbHktYWNjZXNzZWQgbGlzdGVuaW5nIHNvY2tldCB3aWxsIGNhdXNlIGEKICAgICBjaGlsZCB0byBob2xkIHRoZSBhY2NlcHQgbXV0ZXggYW5kIGJsb2NrIG91dCBuZXcgY29ubmVjdGlvbnMgdW50aWwKICAgICBhbm90aGVyIGNvbm5lY3Rpb24gYXJyaXZlcyBvbiB0aGF0IHJhcmVseS1hY2Nlc3NlZCBsaXN0ZW5pbmcgc29ja2V0LgogICAgIFdpdGggQXBhY2hlIDIueCB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBjb25jZXJuIGFib3V0IGVuYWJsaW5nIHRoZSAKICAgICBsb2dpYyBmb3IgcGxhdGZvcm1zIHdoaWNoIGRvbid0IG5lZWQgaXQsIHNvIGl0IGlzIGVuYWJsZWQgZXZlcnl3aGVyZQogICAgIGV4Y2VwdCBmb3IgV2luMzIuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpZDogRml4IHN0b3JhZ2UgY29ycnVwdGlvbiBjYXVzZWQgYnkgdXNlIG9mIGluY29ycmVjdCBwb29sLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBmaW5kX3JlYWRfbGlzdGVuZXJzIHdhcyBub3QgY29ycmVjdGx5IGhhbmRsaW5nIG11bHRpcGxlCiAgICAgbGlzdGVuZXJzIG9uIHRoZSBXaW4zMkRpc2FibGVBY2NlcHRFeCBwYXRoLiAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBidWcgaW4gbW9kX3VzZXJ0cmFjayB3aGVuIG5vIENvb2tpZU5hbWUgaXMgc2V0LiAgUFIgMjQ0ODMuCiAgICAgW01hbm5pIFdvb2QgPG1hbm5pd29vZCBwbGFuZXQtc2F2ZS5jb20+XQoKICAqKSBGaXggc29tZSBwaXBlZCBsb2cgcHJvYmxlbXM6IGJvZ3VzICJwaXBlZCBsb2cgcHJvZ3JhbSAnKG51bGwpJwogICAgIGZhaWxlZCIgbWVzc2FnZXMgZHVyaW5nIHJlc3RhcnQgYW5kIHByb2JsZW0gd2l0aCB0aGUgbG9nZ2VyCiAgICAgcmVzcGF3bmluZyBhZ2FpbiBhZnRlciBBcGFjaGUgaXMgc3RvcHBlZC4gIFBSIDIxNjQ4LCBQUiAyNDgwNS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXhlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHJlYWwgbWVkaWEgZmlsZXMgYW5kIHJlbW92ZWQgcnBtIGV4dGVuc2lvbgogICAgIGZyb20gbWltZS50eXBlcy4gUFIgMjYwNzkuICBbQWxsYW4gU2FuZGZlbGQgPGtkZSBjYXJld29sZi5jb20+XQoKICAqKSBSZW1vdmUgY29tcGlsZS10aW1lIGxlbmd0aCBsaW1pdCBvbiByZXF1ZXN0IHN0cmluZ3MuIExlbmd0aCBpcwogICAgIG5vdyBlbmZvcmNlZCBzb2xlbHkgd2l0aCB0aGUgTGltaXRSZXF1ZXN0TGluZSBjb25maWcgZGlyZWN0aXZlLgogICAgIFtQYXVsIEouIFJlZGVyXQoKICAqKSBtb2Rfc3NsOiBTZW5kIHRoZSBDbG9zZSBBbGVydCBtZXNzYWdlIHRvIHRoZSBwZWVyIGJlZm9yZSBjbG9zaW5nCiAgICAgdGhlIFNTTCBzZXNzaW9uLiAgUFIgMjc0MjguICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpLCBKb2UgT3J0b25dCgogICopIFNFQ1VSSVRZOiBDVkUtMjAwNC0wMTEzIChjdmUubWl0cmUub3JnKQogICAgIG1vZF9zc2w6IEZpeCBhIG1lbW9yeSBsZWFrIGluIHBsYWluLUhUVFAtb24tU1NMLXBvcnQgaGFuZGxpbmcuCiAgICAgUFIgMjcxMDYuICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBGaXggYnVnIGluIHBhc3NwaHJhc2UgaGFuZGxpbmcgd2hpY2ggY291bGQgY2F1c2Ugc3B1cmlvdXMKICAgICBmYWlsdXJlcyBpbiBTU0wgZnVuY3Rpb25zIGxhdGVyLiAgUFIgMjExNjAuICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfbG9nX2NvbmZpZzogRml4IGNvcnJ1cHRpb24gb2YgYnVmZmVyZWQgbG9ncyB3aXRoIHRocmVhZGVkCiAgICAgTVBNcy4gIFBSIDI1NTIwLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IG1vZF9pbmNsdWRlJ3MgZXhwcmVzc2lvbiBwYXJzZXIgdG8gcmVjb2duaXplIHN0cmluZ3MgY29ycmVjdGx5CiAgICAgZXZlbiBpZiB0aGV5IHN0YXJ0IHdpdGggYW4gZXNjYXBlZCB0b2tlbi4gIFtBbmRy6SBNYWxvXQoKICAqKSBBZGQgZmF0YWwgZXhjZXB0aW9uIGhvb2sgZm9yIHVzZSBieSBkaWFnbm9zdGljIG1vZHVsZXMuICBUaGUgaG9vawogICAgIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSAtLWVuYWJsZS1leGNlcHRpb24taG9vayBjb25maWd1cmUgcGFybSAKICAgICBpcyB1c2VkIGFuZCB0aGUgRW5hYmxlRXhjZXB0aW9uSG9vayBkaXJlY3RpdmUgaGFzIGJlZW4gc2V0IHRvIAogICAgICJvbiIuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2RfYXV0aF9kaWdlc3QgdG8gd29yayB3aXRoIHN1Yi1yZXF1ZXN0cyB3aXRoIGRpZmZlcmVudAogICAgIG1ldGhvZHMgdGhhbiB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gIFBSIDI1MDQwLgogICAgIFtKb3NoIERhZHkgPGpwZCBpbmRlY2lzaXZlLmNvbT5dCgogICopIGZpeCAiRXhwZWN0ZWQgPC9Gb28+PiBidXQgc2F3IDwvRm9vPiIgZXJyb3JzIGluIG5lc3RlZCwKICAgICBhcmd1bWVudGxlc3MgY29udGFpbmVycy4KICAgICBbIlBoaWxpcHBlIE0uIENoaWFzc29uIiA8Z296ZXIgY3Bhbi5vcmc+XQoKICAqKSBtb2RfYXV0aF9sZGFwOiBGaXggc29tZSBzZWdmYXVsdHMgaW4gdGhlIGNhY2hlIGxvZ2ljLiAgUFIgMTg3NTYuCiAgICAgW01hdHRoaWV1IEVzdHJhZGUgPGFwYWNoZSBtb3Jlc2VjdXJpdHkub3JnPiwgQnJhZCBOaWNob2xlc10KCiAgKikgbW9kX2NnaWQ6IFJlc3RhcnQgdGhlIGNnaWQgZGFlbW9uIGlmIGl0IGNyYXNoZXMuICBQUiAxOTg0OQogICAgIFtHbGVubiBOaWVsc2VuIDxnbGVubiBhcGFjaGUub3JnPl0KCiAgKikgVGhlIHdob2xlIGNvZGViYXNlIHdhcyByZWxpY2Vuc2VkIGFuZCBpcyBub3cgYXZhaWxhYmxlIHVuZGVyCiAgICAgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzKS4KICAgICBbQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25dCgogICopIEZpeGVkIGNhY2hlLXJlbW92YWwgb3JkZXIgaW4gbW9kX21lbV9jYWNoZS4KICAgICBbSmVhbi1KYWNxdWVzIENsYXIsIENsaWZmIFdvb2xsZXldCgogICopIG1vZF9zZXRlbnZpZjogRml4IHRoZSByZWdleCBvcHRpbWl6ZXIsIHdoaWNoIHVuZGVyIGNpcmN1bXN0YW5jZXMKICAgICB0cmVhdGVkIHRoZSBzdXBwbGllZCByZWdleCBhcyBsaXRlcmFsIHN0cmluZy4gUFIgMjQyMTkuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIGFwX21wbS5oOiBGaXggaW5jbHVkZSBndWFyZCBvZiBhcF9tcG0uaCB0byByZWZlcmVuY2UgbXBtCiAgICAgaW5zdGVhZCBvZiBtbW4uIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogQ2F0Y2ggYW4gZWRnZSBjYXNlLCB3aGVyZSBzdHJhbmdlIHN1YnNlcXVlbnQgUmV3cml0ZVJ1bGVzCiAgICAgY291bGQgbGVhZCB0byBhIDQwMCAoQmFkIFJlcXVlc3QpIHJlc3BvbnNlLiAgW0FuZHLpIE1hbG9dCgogICopIEtlZXAgZm9jdXMgb2YgSVRFUkFURSBhbmQgSVRFUkFURTIgb24gdGhlIGN1cnJlbnQgbW9kdWxlIHdoZW4KICAgICB0aGUgbW9kdWxlIGNob29zZXMgdG8gcmV0dXJuIERFQ0xJTkVfQ01EIGZvciB0aGUgZGlyZWN0aXZlLgogICAgIFBSIDIyMjk5LiAgW0dlb2ZmcmV5IFlvdW5nIDxnZW9mZiBhcGFjaGUub3JnPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIElNVCBtaW5vci10eXBlIHdpbGRjYXJkcyAoZS5nLiwgdGV4dC8qKSB0bwogICAgIEV4cGlyZXNCeVR5cGUuICBQUiM3OTkxICBbS2VuIENvYXJdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIGNhY2hlX2luc2VydCgpIGR1ZSB0byBjYWNoZSBzaXplCiAgICAgYmVjb21pbmcgbmVnYXRpdmUuICBQUjogMjEyODUsIDIxMjg3CiAgICAgW0JpbGwgU3RvZGRhcmQsIE1hc3NpbW8gVG9ycXVhdGksIEplYW4tSmFjcXVlcyBDbGFyXQoKICAqKSBjb3JlLmM6IElmIGxhcmdlIGZpbGUgc3VwcG9ydCBpcyBlbmFibGVkLCBhbGxvdyBhbnkgZmlsZSB0aGF0IGlzCiAgICAgZ3JlYXRlciB0aGFuIEFQX01BWF9TRU5ERklMRSB0byBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIGJ1Y2tldHMuCiAgICAgVGhpcyBhbGxvd3MgQXBhY2hlIHRvIHNlbmQgZmlsZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIDJnaWcuCiAgICAgT3RoZXJ3aXNlIHdlIHJ1biBpbnRvIDMyLzY0IGJpdCB0eXBlIG1pc21hdGNoZXMgaW4gdGhlIGZpbGUgc2l6ZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgcHJveHlfaHR0cCBmaXg6IG1vZF9wcm94eSBoYW5ncyB3aGVuIGJvdGggS2VlcEFsaXZlIGFuZAogICAgIFByb3h5RXJyb3JPdmVycmlkZSBhcmUgZW5hYmxlZCwgYW5kIGEgbm9uLTIwMCByZXNwb25zZSB3aXRob3V0IGEKICAgICBib2R5IGlzIGdlbmVyYXRlZCBieSB0aGUgYmFja2VuZCBzZXJ2ZXIuIChlLmcuOiBhIGNsaWVudCBtYWtlcyBhCiAgICAgcmVxdWVzdCBjb250YWluaW5nIHRoZSAiSWYtTW9kaWZpZWQtU2luY2UiIGFuZCAiSWYtTm9uZS1NYXRjaCIKICAgICBoZWFkZXJzLCB0byB3aGljaCB0aGUgYmFja2VuZCBzZXJ2ZXIgcmVzcG9uZCB3aXRoIHN0YXR1cyAzMDQuKQogICAgIFtHcmFoYW0gV2lzZW1hbiA8Z3dpc2VtYW4gZnNjaW50ZXJuZXQuY29tPiwgUmljaGFyZCBSZWluZXJdCgogICopIG1vZF9kYXY6IFJlamVjdCByZXF1ZXN0cyB3aGljaCBpbmNsdWRlIGFuIHVuZXNjYXBlZCBmcmFnbWVudCBpbiB0aGUKICAgICBSZXF1ZXN0LVVSSS4gIFBSIDIxNzc5LiAgW0FtaXQgQXRoYXZhbGUgPGFtaXRfYXRoYXZhbGUgbHljb3MuY29tPl0KCiAgKikgQnVpbGQgYXJyYXkgb2YgYWxsb3dlZCBtZXRob2RzIHdpdGggcHJvcGVyIGRpbWVuc2lvbnMsIGZpeGluZwogICAgIHBvc3NpYmxlIG1lbW9yeSBjb3JydXB0aW9uLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX3NzbDogRml4IHBvdGVudGlhbCBzZWdmYXVsdCBvbiBsb29rdXAgb2YgU1NMX1NFU1NJT05fSUQuCiAgICAgUFIgMTUwNTcuICBbT3RtYXIgTGVuZGwgPGxlbmRsIG5pYy5hdD5dCgogICopIG1vZF9zc2w6IEZpeCBzdHJlYW1pbmcgb3V0cHV0IGZyb20gYW4gbnBoLSBDR0kgc2NyaXB0LiBQUiAyMTk0NAogICAgIFtKb2UgT3J0b25dCgogICopIG1vZF91c2VydHJhY2sgbm8gbG9uZ2VyIGluc3BlY3RzIHRoZSBDb29raWUyIGhlYWRlciBmb3IKICAgICB0aGUgY29va2llIG5hbWUuIFBSIDExNDc1LiAgW0NocmlzIERhcnJvY2hpIDxjaHJpc2QgcGVhcnNvbmNtZy5jb20+XQoKICAqKSBtb2RfdXNlcnRyYWNrIG5vIGxvbmdlciBvdmVyd3JpdGVzIG90aGVyIGNvb2tpZXMuCiAgICAgUFIgMjYwMDIuICBbU2NvdHQgTW9vcmUgPGFwYWNoZSBub3BkZXNpZ24uY29tPl0KCiAgKikgd29ya2VyIE1QTTogZml4IHN0YWNrIG92ZXJsYXkgYnVnIHRoYXQgY291bGQgY2F1c2UgdGhlIHBhcmVudAogICAgIHByb2Nlc3MgdG8gY3Jhc2guICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogQWRkIFdpbjMyRGlzYWJsZUFjY2VwdEV4IGRpcmVjdGl2ZS4gVGhpcyBXaW5kb3dzCiAgICAgTlQvMjAwMC9DUCBkaXJlY3RpdmUgaXMgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSAKICAgICB0aGlyZCBwYXJ0eSBsYXllcmVkIHNlcnZpY2UgcHJvdmlkZXJzIGxpa2UgdmlydXMgc2Nhbm5lcnMsIAogICAgIFZQTiBhbmQgZmlyZXdhbGwgcHJvZHVjdHMsIHRoYXQgZG8gbm90IHByb3Blcmx5IGhhbmRsZSAKICAgICBXaW5Tb2NrIDIgQVBJcy4gIFVzZSB0aGlzIGRpcmVjdGl2ZSBpZiB5b3VyIHNlcnZlciBpcyBpc3N1aW5nCiAgICAgQWNjZXB0RXggZmFpbGVkIG1lc3NhZ2VzLgogICAgIFtBbGxhbiBFZHdhcmRzLCBCaWxsIFJvd2UsIEJpbGwgU3RvZGRhcmQsIEplZmYgVHJhd2lja10KCiAgKikgTWFrZSBSRU1PVEVfUE9SVCB2YXJpYWJsZSBhdmFpbGFibGUgaW4gbW9kX3Jld3JpdGUuCiAgICAgUFIgMjU3NzIuICBbQW5kcukgTWFsb10KCiAgKikgRml4IGEgbG9uZyBkZWxheSB3aXRoIENHSSByZXF1ZXN0cyBhbmQga2VlcGFsaXZlIGNvbm5lY3Rpb25zIG9uCiAgICAgQUlYLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2F1dG9pbmRleDogQWRkICdYSFRNTCcgb3B0aW9uIGluIG9yZGVyIHRvIGFsbG93IHN3aXRjaGluZyBiZXR3ZWVuCiAgICAgSFRNTCAzLjIgYW5kIFhIVE1MIDEuMCBvdXRwdXQuIFBSIDIzNzQ3LiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBYSFRNTCBEb2N1bWVudCBUeXBlIERlZmluaXRpb25zIHRvIGh0dHBkLmggKG1pbm9yIE1NTiBidW1wKS4KICAgICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3NzbDogQWR2ZXJ0aXNlIFNTTCBsaWJyYXJ5IHZlcnNpb24gYXMgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSByYXRoZXIKICAgICB0aGFuIGF0IGNvbXBpbGUtdGltZS4gIFBSIDIzOTU2LiAgW0VyaWMgU2VpZGVsIDxzZWlkZWwgYXBwbGUuY29tPl0KCiAgKikgbW9kX3NzbDogRml4IHNlZ2ZhdWx0IG9uIGEgbm9uLVNTTCByZXF1ZXN0IGlmIHRoZSAnYycgbG9nCiAgICAgZm9ybWF0IGNvZGUgaXMgdXNlZC4gIFBSIDIyNzQxLiAgW0dhcnkgRS4gTWlsbGVyIDxnZW0gcmVsbGltLmNvbT5dCgogICopIEZpeCBidWlsZCB3aXRoIHBhcmFsbGVsIG1ha2UuICBQUiAyNDY0My4gIFtKb2UgT3J0b25dCgogICopIG1vZF9yZXdyaXRlOiBJbiBleHRlcm5hbCByZXdyaXRlIG1hcHMgbG9va3VwIGtleXMgY29udGFpbmluZwogICAgIGEgbmV3bGluZSBub3cgY2F1c2UgYSBsb29rdXAgZmFpbHVyZS4gUFIgMTQ0NTMuCiAgICAgW0NlZHJpYyBHYXZhZ2UgPGNlZHJpYy5nYXZhZ2UgdW5peHRlY2guYmU+LCBBbmRy6SBNYWxvXQoKICAqKSBCYWNrcG9ydCBtYWpvciBvdmVyaGF1bCBvZiBtb2RfaW5jbHVkZSdzIGZpbHRlciBwYXJzZXIgZnJvbSAyLjEuCiAgICAgVGhlIG5ldyBwYXJzZXIgY29kZSBpcyBleHBlY3RlZCB0byBiZSBtb3JlIHJvYnVzdCBhbmQgc2hvdWxkCiAgICAgY2F0Y2ggYWxsIG9mIHRoZSBlZGdlIGNhc2VzIHRoYXQgd2VyZSBub3QgaGFuZGxlZCBieSB0aGUgcHJldmlvdXMgb25lLgogICAgIFRoZSAyLjEgZXh0ZXJuYWwgQVBJIGNoYW5nZXMgd2VyZSBoaWRkZW4gYnkgYSB3cmFwcGVyIHdoaWNoIGlzCiAgICAgZXhwZWN0ZWQgdG8ga2VlcCB0aGUgQVBJIGJhY2t3YXJkcyBjb21wYXRpYmxlLiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBhIGhvb2sgKGluc2VydF9lcnJvcl9maWx0ZXIpIHRvIGFsbG93IGZpbHRlcnMgdG8gcmUtaW5zZXJ0CiAgICAgdGhlbXNlbHZlcyBkdXJpbmcgcHJvY2Vzc2luZyBvZiBlcnJvciByZXNwb25zZXMuIEVuYWJsZSBtb2RfZXhwaXJlcwogICAgIHRvIHVzZSB0aGUgbmV3IGhvb2sgdG8gaW5jbHVkZSBFeHBpcmVzIGhlYWRlcnMgaW4gdmFsaWQgZXJyb3IKICAgICByZXNwb25zZXMuIFRoaXMgYWRkcmVzc2VzIGFuIFJGQyB2aW9sYXRpb24uIEl0IGZpeGVzIFBScyAxOTc5NCwKICAgICAyNDg4NCwgYW5kIDI1MTIzLiBbUGF1bCBKLiBSZWRlcl0KCiAgKikgQWRkIFBvbGlzaCB0cmFuc2xhdGlvbiBvZiBlcnJvciBtZXNzYWdlcy4gIFBSIDI1MTAxLgogICAgIFtUb21hc3ogS2VwY3p5bnNraSA8dG9tZWsgam90MjMub3JnPl0KCiAgKikgQWRkIEFQX01QTVFfTVBNX1NUQVRFIGZ1bmN0aW9uIGNvZGUgZm9yIGFwX21wbV9xdWVyeS4gKE5vdCB5ZXQKICAgICBzdXBwb3J0ZWQgZm9yIEJlT1Mgb3IgT1MvMiBNUE1zLikgIFtKZWZmIFRyYXdpY2ssIEJyYWQgTmljaG9sZXMsCiAgICAgQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIG1vZF9zdGF0dXMgaG9vayB0byBhbGxvdyBtb2R1bGVzIHRvIGFkZCB0byB0aGUgbW9kX3N0YXR1cwogICAgIHJlcG9ydC4gIFtKb2UgT3J0b25dCgogICopIEZpeCBodGRibSB0byBnZW5lcmF0ZSBjb21tZW50IGZpZWxkcyBpbiBEQk0gZmlsZXMgY29ycmVjdGx5LgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgbW9kX2RhdjogVXNlIGJ1Y2tldCBicmlnYWRlcyB3aGVuIHJlYWRpbmcgUFVUIGRhdGEuIFRoaXMgYXZvaWRzCiAgICAgcHJvYmxlbXMgaWYgdGhlIGRhdGEgc3RyZWFtIGlzIG1vZGlmaWVkIGJ5IGFuIGlucHV0IGZpbHRlci4gUFIgMjIxMDQuCiAgICAgW1RpbSBSb2JiaW5zIDx0aW0gcm9iYmlucy5kcm9wYmVhci5pZC5hdT4sIEFuZHLpIE1hbG9dCgogICopIEZpeCBSZXdyaXRlQmFzZSBkaXJlY3RpdmUgdG8gbm90IGFkZCBkb3VibGUgc2xhc2hlcy4gIFtBbmRy6SBNYWxvXQoKICAqKSBJbXByb3ZlICdjb25maWd1cmUgLS1oZWxwJyBvdXRwdXQgZm9yIHNvbWUgbW9kdWxlcy4gIFtBc3RyaWQgS2XfbGVyXQoKICAqKSBDb3JyZWN0IFVzZUNhbm9uaWNhbE5hbWUgT2ZmIHRvIHByb3Blcmx5IGNoZWNrIGluY29taW5nIHBvcnQgbnVtYmVyLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggc2xvdyBncmFjZWZ1bCByZXN0YXJ0cyB3aXRoIHByZWZvcmsgTVBNLiAgW0pvZSBPcnRvbl0KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSBtYXBwaW5ncyBiZWluZyBkcm9wcGVkIGluIG1vZF9kYXZfZnM7CiAgICAgaWYgYW55IHByb3BlcnR5IHZhbHVlcyB3ZXJlIHNldCB3aGljaCBkZWZpbmVkIG5hbWVzcGFjZXMgdGhlc2UKICAgICBjYW1lIG91dCBtYW5nbGVkIGluIHRoZSBQUk9QRklORCByZXNwb25zZS4gIFBSIDExNjM3LgogICAgIFtBbWl0IEF0aGF2YWxlIDxhbWl0X2F0aGF2YWxlIHBlcnNpc3RlbnQuY28uaW4+XQoKICAqKSBtb2RfZGF2OiBSZXR1cm4gYSBXV1ctYXV0aCBoZWFkZXIgZm9yIE1PVkUvQ09QWSByZXF1ZXN0cyB3aGVyZQogICAgIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZSBnaXZlcyBhIDQwMS4gIFBSIDE1NTcxLiAgW0pvZSBPcnRvbl0KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAzLTAwMjAgKGN2ZS5taXRyZS5vcmcpCiAgICAgRXNjYXBlIGFyYml0cmFyeSBkYXRhIGJlZm9yZSB3cml0aW5nIGludG8gdGhlIGVycm9ybG9nLiBVbmVzY2FwZWQKICAgICBlcnJvcmxvZ3MgYXJlIHN0aWxsIHBvc3NpYmxlIHVzaW5nIHRoZSBjb21waWxlIHRpbWUgc3dpdGNoCiAgICAgIi1EQVBfVU5TQUZFX0VSUk9SX0xPR19VTkVTQ0FQRUQiLiAgW0dlb2ZmcmV5IFlvdW5nLCBBbmRy6SBNYWxvXQoKICAqKSBtb2RfYXV0b2luZGV4IC8gY29yZTogRG9uJ3QgZmFpbCB0byBzaG93IGZpbGVuYW1lcyBjb250YWluaW5nCiAgICAgc3BlY2lhbCBjaGFyYWN0ZXJzIGxpa2UgJyUnLiBQUiAxMzU5OC4gIFtBbmRy6SBNYWxvXQogCiAgKikgbW9kX3N0YXR1czogUmVwb3J0IHRvdGFsIENQVSB0aW1lIGFjY3VyYXRlbHkgd2hlbiB1c2luZyBhIHRocmVhZGVkCiAgICAgTVBNLiAgUFIgMjM3OTUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gaGFuZGxpbmcgb2YgcmVxdWVzdCBib2RpZXMgZHVyaW5nIHJldmVyc2UKICAgICBwcm94eSBvcGVyYXRpb25zLiAgUFIgMjQ5OTEuIFtMYXJyeSBUb3BwaSA8bGFycnkudG9wcGkgY2l0cml4LmNvbT5dCgogICopIFdpbjMyIE1QTTogSW1wbGVtZW50IE1heE1lbUZyZWUgdG8gZW5hYmxlIHNldHRpbmcgYW4gdXBwZXIKICAgICBsaW1pdCBvbiB0aGUgYW1vdW50IG9mIHN0b3JhZ2UgdXNlZCBieSB0aGUgYnVja2V0IGJyaWdhZGVzCiAgICAgaW4gZWFjaCBzZXJ2ZXIgdGhyZWFkLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTW9kaWZpZWQgdGhlIGNhY2hlIGNvZGUgdG8gYmUgaGVhZGVyLWxvY2F0aW9uIGFnbm9zdGljLiBBbHNvCiAgICAgZml4ZWQgYSBudW1iZXIgb2Ygb3RoZXIgY2FjaGUgY29kZSBidWdzIHJlbGF0ZWQgdG8gUFIgMTU4NTIuCiAgICAgSW5jbHVkZXMgYSBwYXRjaCBzdWJtaXR0ZWQgYnkgU3VzaG1hIFJhaSA8cnN1c2htYSBub3ZlbGwuY29tPi4KICAgICBUaGlzIGZpeGVzIG1vZF9tZW1fY2FjaGUgYnV0IG5vdCBtb2RfZGlza19jYWNoZSB5ZXQgc28gSSdtIG5vdAogICAgIGNsb3NpbmcgdGhlIFBSIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGV5IGFyZSB1c2luZy4gW1BhdWwgSi4gUmVkZXJdCgogICopIGNvbXBsYWluIHZpYSBlcnJvcl9sb2cgd2hlbiBtb2RfaW5jbHVkZSdzIElOQ0xVREVTIGZpbHRlciBpcwogICAgIGVuYWJsZWQsIGJ1dCB0aGUgcmVsZXZhbnQgT3B0aW9ucyBmbGFnIGFsbG93aW5nIHRoZSBmaWx0ZXIgdG8gcnVuCiAgICAgZm9yIHRoZSBzcGVjaWZpYyByZXNvdXJjZSB3YXNuJ3Qgc2V0LCBzbyB0aGF0IHRoZSBmaWx0ZXIgd29uJ3QKICAgICBzaWxlbnRseSBnZXQgc2tpcHBlZC4gbmV4dCByZW1vdmUgaXRzZWxmLCBzbyB0aGUgd2FybmluZyB3aWxsIGJlCiAgICAgbG9nZ2VkIG9ubHkgb25jZSBbU3RhcyBCZWttYW4sIEplZmYgVHJhd2ljaywgQmlsbCBSb3dlXQoKICAqKSBtb2RfaW5mbzogSFRNTCBlc2NhcGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBzbyBpdCBkaXNwbGF5cyAKICAgICBjb3JyZWN0bHkuIFBSIDI0MjMyLiBbVGhvbSBNYXldCiAgICAgCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBhZGQgYSBkZXNjcmlwdGlvbiBmb3IgZGlyZWN0b3JpZXMgdGhhdAogICAgIGRvbid0IGNvbnRhaW4gYW4gaW5kZXggZmlsZS4gIChCcm9rZW4gaW4gMi4wLjQ4KSBbQW5kcukgTWFsb10KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIHRoZSBkaXNwbGF5IG9mIGVtcHR5IHZhcmlhYmxlcyAoIlNldEVudiBmb28iKSBpbgogICAgIG1vZF9pbmNsdWRlLiAgUFIgMjQ3MzQgIFtNYXJrdXMgSnVsZW4gPG1qIHplcm1hdHQubmV0Pl0KCiAgKikgbW9kX2xvZ19jb25maWc6IExvZyB0aGUgbWludXRlcyBjb21wb25lbnQgb2YgdGhlIHRpbWV6b25lIGNvcnJlY3RseS4KICAgICBQUiAyMzY0Mi4gIFtIb25nLUd1bm4gQ2hldyA8aGdidWcgZ3VubmV0Lm9yZz5dCgogICopIG1vZF9wcm94eTogRml4IGNhc2VzIHdoZXJlIGFuIGludmFsaWQgc3RhdHVzLWxpbmUgY291bGQgYmUgc2VudCAKICAgICB0byB0aGUgY2xpZW50LiAgUFIgMjM5OTguICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBGaXggc2VnZmF1bHRzIGF0IHN0YXJ0dXAgaWYgb3RoZXIgbW9kdWxlcyB3aGljaCB1c2UgT3BlblNTTAogICAgIGFyZSBhbHNvIGxvYWRlZC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9zc2w6IFVzZSBodW1hbi1yZWFkYWJsZSBPcGVuU1NMIGVycm9yIHN0cmluZ3MgaW4gbG9nczsgdXNlCiAgICAgdGhyZWFkLXNhZmUgaW50ZXJmYWNlIGZvciByZXRyaWV2aW5nIGVycm9yIHN0cmluZ3MuICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfZXhwaXJlczogSW5pdGlhbGl6ZSBFeHBpcmVzRGVmYXVsdCB0byBOVUxMIGluc3RlYWQgb2YgIiIgdG8KICAgICBhdm9pZCByZXBvcnRpbmcgYW4gSW50ZXJuYWwgU2VydmVyIGVycm9yIGlmIGl0IGlzIHVzZWQgd2l0aG91dAogICAgIGhhdmluZyBiZWVuIHNldCBpbiB0aGUgaHR0cGQuY29uZiBmaWxlLiBQUjogMjM3NDgsIDI0NDU5CiAgICAgW0FuZHJlIE1hbG8sIExpYW0gUXVpbm4gIDxsaWFtIGh0bWxoZWxwLmNvbT5dCgogICopIG1vZF9hdXRvaW5kZXg6IERvbid0IG9taXQgdGhlIDx0cj4gc3RhcnQgdGFnIGlmIHRoZSBTdXBwcmVzc0ljb24KICAgICBvcHRpb24gaXMgc2V0LiBQUiAyMTY2OC4gIFtKZXNzZSBUaWUtVGVuLVF1ZWUgPGhpZ2hvcyBoaWdob3MuY29tPl0KCiAgKikgbW9kX2luY2x1ZGUgbm8gbG9uZ2VyIGFsbG93cyBhbiBFVGFnIGhlYWRlciBvbiAzMDQgcmVzcG9uc2VzLgogICAgIFBSIDE5MzU1LiBbR2VvZmZyZXkgWW91bmcgPGdlb2ZmIGFwYWNoZS5vcmc+LCBBbmRy6SBNYWxvXQoKICAqKSBFQkNESUM6IENvbnZlcnQgaGVhZGVyIGZpZWxkcyB0byBBU0NJSSBiZWZvcmUgc2VuZGluZyAoYnJva2VuCiAgICAgc2luY2UgMi4wLjQ0KS4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggdGhlIGluYWJpbGl0eSB0byBsb2cgZXJyb3JzIGxpa2UgZXhlYyBmYWlsdXJlIGluCiAgICAgbW9kX2V4dF9maWx0ZXIvbW9kX2NnaSBzY3JpcHQgY2hpbGRyZW4uICBUaGlzIHdhcyBicm9rZW4gYWZ0ZXIgCiAgICAgc3VjaCBjaGlsZHJlbiBzdG9wcGVkIGluaGVyaXRpbmcgdGhlIGVycm9yIGxvZyBoYW5kbGUuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX2luZm8gdG8gdXNlIHRoZSByZWFsIGNvbmZpZyBmaWxlIG5hbWUsIG5vdCB0aGUgZGVmYXVsdAogICAgIGNvbmZpZyBmaWxlIG5hbWUuICBbQXJ5ZWggS2F0eiA8YXJ5ZWggc2VjdXJlZC1zZXJ2aWNlcy5jb20+XQoKICAqKSBTZXQgdGhlIHNjb3JlYm9hcmQgc3RhdGUgdG8gaW5kaWNhdGUgbG9nZ2luZyBwcmlvciB0byBydW5uaW5nIAogICAgIGxvZ2dpbmcgaG9va3Mgc28gdGhhdCBzZXJ2ZXItc3RhdHVzIHdpbGwgc2hvdyAnTCcgZm9yIGh1bmcgbG9nZ2VycwogICAgIGluc3RlYWQgb2YgJ1cnLiAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ4CgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMy0wNzg5IChjdmUubWl0cmUub3JnKQogICAgIG1vZF9jZ2lkOiBSZXNvbHZlIHNvbWUgbWlzaGFuZGxpbmcgb2YgdGhlIEFGX1VOSVggc29ja2V0IHVzZWQgdG8KICAgICBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjZ2lkIGRhZW1vbiBhbmQgdGhlIENHSSBzY3JpcHQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTA1NDIgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IGJ1ZmZlciBvdmVyZmxvd3MgaW4gbW9kX2FsaWFzIGFuZCBtb2RfcmV3cml0ZSB3aGljaCBvY2N1cnJlZAogICAgIGlmIG9uZSBjb25maWd1cmVkIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggbW9yZSB0aGFuIDkgY2FwdHVyZXMuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9pbmNsdWRlOiBmaXggc2VnZmF1bHQgd2hpY2ggb2NjdXJlZCBpZiB0aGUgZmlsZW5hbWUgd2FzIG5vdAogICAgIHNldCwgZm9yIGV4YW1wbGUsIHdoZW4gcHJvY2Vzc2luZyBzb21lIGVycm9yIGNvbmRpdGlvbnMuCiAgICAgUFIgMjM4MzYuICBbQnJpYW4gQWtpbnMgPGJha2lucyB3ZWIudHVybmVyLmNvbT4sIEFuZHLpIE1hbG9dCgogICopIGZpeCB0aGUgY29uZmlnIHBhcnNlciB0byBzdXBwb3J0IDxGb28+Li48L0Zvbz4gY29udGFpbmVycyAobm8KICAgICBhcmd1bWVudHMgaW4gdGhlIG9wZW5pbmcgdGFnKSBzdXBwb3J0ZWQgYnkgaHR0cGQgMS4zLiBXaXRob3V0CiAgICAgdGhpcyBjaGFuZ2UgbW9kX3BlcmwgMi4wJ3MgPFBlcmw+IHNlY3Rpb25zIGFyZSBicm9rZW4uCiAgICAgWyJQaGlsaXBwZSBNLiBDaGlhc3NvbiIgPGdvemVyIGNwYW4ub3JnPl0KCiAgKikgbW9kX2NnaWQ6IGZpeCBhIGhhc2ggdGFibGUgY29ycnVwdGlvbiBwcm9ibGVtIHdoaWNoIGNvdWxkCiAgICAgcmVzdWx0IGluIHRoZSB3cm9uZyBzY3JpcHQgYmVpbmcgY2xlYW5lZCB1cCBhdCB0aGUgZW5kIG9mIGEKICAgICByZXF1ZXN0LiAgW0plZmYgVHJhd2lja10KCiAgKikgVXBkYXRlIGh0dHBkLSouY29uZiB0byBiZSBjbGVhcmVyIGluIGRlc2NyaWJpbmcgdGhlIGNvbm5lY3Rpb24KICAgICBiZXR3ZWVuIEFkZFR5cGUgYW5kIEFkZEVuY29kaW5nIGZvciBkZWZpbmluZyB0aGUgbWVhbmluZyBvZgogICAgIGNvbXByZXNzZWQgZmlsZSBleHRlbnNpb25zLiBbUm95IEZpZWxkaW5nXQoKICAqKSBtb2RfcmV3cml0ZTogRG9uJ3QgZGllIHNpbGVudGx5IHdoZW4gZmFpbGluZyB0byBvcGVuIFJld3JpdGVMb2dzLgogICAgIFBSIDIzNDE2LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBGaXggbW9kX3Jld3JpdGUncyBzdXBwb3J0IG9mIHRoZSBbUF0gb3B0aW9uIHRvIHNlbmQKICAgICByZXdyaXR0ZW4gcmVxdWVzdCB1c2luZyAicHJveHk6Ii4gVGhlIGNvZGUgd2FzIGFkZGluZyBtdWx0aXBsZSAicHJveHk6IgogICAgIGZpZWxkcyBpbiB0aGUgcmV3cml0dGVuIFVSSS4gUFI6IDEzOTQ2LgogICAgIFtFaWRlciBPbGl2ZWlyYSA8ZWlkZXIgYm9sLmNvbS5icj5dCgogICopIGNhY2hlX3V0aWw6IEZpeCBhcF9jaGVja19jYWNoZV9mcmVzaG5lc3MgdG8gY2hlY2sgbWF4X2FnZSwgc21heF9hZ2UsIGFuZAogICAgIGV4cGlyZXMgYXMgZGlyZWN0ZWQgaW4gUkZDIDI2MTYuIFtUaG9tYXMgQ2FzdGVsbGUgPHRjYXN0ZWxsZSBnZW5lcmFsaS5mcj5dCgogICopIEVuc3VyZSB0aGF0IHNzbC1zdGQuY29uZiBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIGFuZCBzd2l0Y2gKICAgICB0byB1c2luZyB0aGUgZXhwYW5kZWQgY29uZmlnIHZhcmlhYmxlcyB0byB3b3JrIHRoZSBzYW1lIGFzCiAgICAgaHR0cGQtc3RkLmNvbmYgUFI6IDE5NjExCiAgICAgW1Rob20gTWF5XQoKICAqKSBtb2Rfc3NsOiBGaXggc2VnZmF1bHRzIGFmdGVyIHJlbmVnb3RpYXRpb24gZmFpbHVyZS4gUFIgMjEzNzAKICAgICBbSGFydG11dCBLZWlsIDxIYXJ0bXV0LktlaWwgYWRub3Z1bS5jaD5dCgogICopIG1vZF9hdXRvaW5kZXg6IElmIGEgZGlyZWN0b3J5IGNvbnRhaW5zIGEgZmlsZSBsaXN0ZWQgaW4gdGhlCiAgICAgRGlyZWN0b3J5SW5kZXggZGlyZWN0aXZlLCB0aGUgZm9sZGVyIGljb24gaXMgbm8gbG9uZ2VyIHJlcGxhY2VkCiAgICAgYnkgdGhlIGljb24gb2YgdGhhdCBmaWxlLiBQUiA5NTg3LgogICAgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgRml4ZWQgbW9kX3VzZXJ0cmFjayB0byBub3QgZ2V0IGZhbHNlIHBvc2l0aXZlIG1hdGNoZXMgb24gdGhlCiAgICAgdXNlci10cmFja2luZyBjb29raWUncyBuYW1lLiAgUFIgMTY2NjEuCiAgICAgW01hbm5pIFdvb2QgPG1hbm5pd29vZCBwbGFuZXQtc2F2ZS5jb20+XQoKICAqKSBtb2RfY2FjaGU6IEZpeCB0aGUgY2FjaGUgY29kZSBzbyB0aGF0IHJlc3BvbnNlcyBjYW4gYmUgY2FjaGVkCiAgICAgaWYgdGhleSBoYXZlIGFuIEV4cGlyZXMgaGVhZGVyIGJ1dCBubyBFdGFnIG9yIExhc3QtTW9kaWZpZWQKICAgICBoZWFkZXJzLiBQUiAyMzEzMC4KICAgICBbPGJqb3JuIGV4b3dlYi5uZXQ+XQoKICAqKSBtb2RfbG9nX2NvbmZpZzogRml4ICViIGxvZyBmb3JtYXQgdG8gd3JpdGUgcmVhbGx5ICItIiB3aGVuIDAgYnl0ZXMKICAgICB3ZXJlIHNlbnQgKGUuZy4gd2l0aCAzMDQgb3IgMjA0IHJlc3BvbnNlIGNvZGVzKS4gIFtBc3RyaWQgS2XfbGVyXQoKICAqKSBNb2RpZnkgYXBfZ2V0X2NsaWVudF9ibG9jaygpIHRvIG5vdGUgaWYgaXQgaGFzIHNlZW4gRU9TLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgYnVnLCB3aGVyZSBtb2RfZGVmbGF0ZSBzb21ldGltZXMgdW5jb25kaXRpb25hbGx5IGNvbXByZXNzZWQgdGhlCiAgICAgY29udGVudCBpZiB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlciBjb250YWluZWQgb25seSBvdGhlciB0b2tlbnMgdGhhbgogICAgICJnemlwIiAoc3VjaCBhcyAiZGVmbGF0ZSIpLiBQUiAyMTUyMy4gIFtKb2UgT3J0b24sIEFuZHLpIE1hbG9dCgogICopIEF2b2lkIGFuIGluZmluaXRlIHJlY3Vyc2lvbiwgd2hpY2ggb2NjdXJlZCBpZiB0aGUgbmFtZSBvZiBhbiBpbmNsdWRlZAogICAgIGNvbmZpZyBmaWxlIG9yIGRpcmVjdG9yeSBjb250YWluZWQgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuIFBSIDIyMTk0LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc3NsOiBGaXggYSBwcm9ibGVtIHNldHRpbmcgdmFyaWFibGVzIHRoYXQgcmVwcmVzZW50IHRoZQogICAgIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbi4gIFBSIDIxMzcxICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVbml4OiBIYW5kbGUgcGVybWlzc2lvbnMgc2V0dGluZ3MgZm9yIGZsb2NrLWJhc2VkIG11dGV4ZXMgaW4gCiAgICAgdW5peGRfc2V0X2dsb2JhbHxwcm9jX211dGV4X3Blcm1zKCkuICBBbGxvdyB0aGUgZnVuY3Rpb25zIHRvIGJlCiAgICAgY2FsbGVkIGZvciBhbnkgdHlwZSBvZiBtdXRleC4gIFBSIDIwMzEyICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhYjogV29yayBvdmVyIG5vbi1sb29wYmFjayBvbiBVbml4IGFnYWluLiBQUiAyMTQ5NS4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgbWlzbGVhZGluZyBtZXNzYWdlIGZyb20gdGhlIHNvbWUgb2YgdGhlIHRocmVhZGVkIE1QTXMgd2hlbiAKICAgICBNYXhDbGllbnRzIGhhcyB0byBiZSBsb3dlcmVkIGR1ZSB0byB0aGUgc2V0dGluZyBvZiBTZXJ2ZXJMaW1pdC4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIExvd2VyIHRoZSBzZXZlcml0eSBvZiB0aGUgImxpc3RlbmVyIHRocmVhZCBkaWRuJ3QgZXhpdCIgbWVzc2FnZQogICAgIHRvIGRlYnVnLCBhcyBpdCBpcyBvZiBpbnRlcmVzdCBvbmx5IHRvIGRldmVsb3BlcnMuICBQUiA5MDExCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTVBNczogVGhlIGJ1Y2tldCBicmlnYWRlcyBzdWJzeXN0ZW0gbm93IGhvbm9ycyB0aGUgTWF4TWVtRnJlZSBzZXR0aW5nLgogICAgIFtDbGlmZiBXb29sbGV5LCBKZWFuLUphY3F1ZXMgQ2xhcl0KCiAgKikgSW5zdGFsbCBjb25maWcubmljZSBpbnRvIHRoZSBidWlsZC8gZGlyZWN0b3J5IHRvIG1ha2UKICAgICBtaW5vciB2ZXJzaW9uIHVwZ3JhZGVzIGVhc2llci4gW0pvc2h1YSBTbGl2ZV0KCiAgKikgRml4IG1vZF9kZWZsYXRlIHNvIHRoYXQgaXQgZG9lcyBub3QgY2FsbCBkZWZsYXRlKCkgd2l0aG91dCBjaGVja2luZwogICAgIGZpcnN0IHdoZXRoZXIgaXQgaGFzIHNvbWV0aGluZyB0byBkZWZsYXRlLiAoQ3VycmVudGx5IHRoaXMgY2F1c2VzCiAgICAgZGVmbGF0ZSB0byBnZW5lcmF0ZSBhIGZhdGFsIGVycm9yIGFjY29yZGluZyB0byB0aGUgemxpYiBzcGVjLikKICAgICBQUiAyMjI1OS4gW1N0YXMgQmVrbWFuXQoKICAqKSBtb2Rfc3NsOiBGaXggRmFrZUJhc2ljQXV0aCBmb3Igc3VicmVxdWVzdC4gIExvZyBhbiBlcnJvciB3aGVuIGFuCiAgICAgaWRlbnRpdHkgc3Bvb2YgaXMgZW5jb3VudGVyZWQuCiAgICAgW1NhbmRlciBTdHJpa2VyXQoKICAqKSBtb2RfcmV3cml0ZTogSWdub3JlIFJld3JpdGVSdWxlcyBpbiAuaHRhY2Nlc3MgZmlsZXMgaWYgdGhlIGRpcmVjdG9yeQogICAgIGNvbnRhaW5pbmcgdGhlIC5odGFjY2VzcyBmaWxlIGlzIHJlcXVlc3RlZCB3aXRob3V0IGEgdHJhaWxpbmcgc2xhc2guCiAgICAgUFIgMjAxOTUuICBbQW5kcukgTWFsb10KCiAgKikgYWI6IE92ZXJsb25nIGNyZWRlbnRpYWxzIGdpdmVuIHZpYSBjb21tYW5kIGxpbmUgbm8gbG9uZ2VyIGNsb2JiZXIKICAgICB0aGUgYnVmZmVyLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9kZWZsYXRlOiBEb24ndCBhdHRlbXB0IHRvIGhvbGQgYWxsIG9mIHRoZSByZXNwb25zZSB1bnRpbCB3ZSdyZQogICAgIGRvbmUuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFzc3VyZSB0aGF0IHdlIGJsb2NrIHByb3Blcmx5IHdoZW4gcmVhZGluZyBpbnB1dCBib2RpZXMgd2l0aCBTU0wuCiAgICAgUFIgMTkyNDIuICBbRGF2aWQgRGVhdmVzIDxEYXZpZC5EZWF2ZXMgZGQuaWQuYXU+LCBXaWxsaWFtIFJvd2VdCgogICopIFVwZGF0ZSBtaW1lLnR5cGVzIHRvIGluY2x1ZGUgbGF0ZXN0IElBTkEgYW5kIFczQyB0eXBlcy4gIFtSb3kgRmllbGRpbmddCgogICopIG1vZF9leHRfZmlsdGVyOiBTZXQgYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHVzZSBieQogICAgIHRoZSBleHRlcm5hbCBmaWx0ZXIuICBQUiAyMDk0NC4gIFtBbmRyZXcgSG8sIEplZmYgVHJhd2lja10KCiAgKikgRml4IGJ1aWxkY29uZiBlcnJvcnMgd2hlbiBsaWJ0b29sIHZlcnNpb24gY2hhbmdlcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFJlbWVtYmVyIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBkdXJpbmcgaW50ZXJuYWwgcmVkaXJlY3RzIGlmIHRoZQogICAgIHJlZGlyZWN0aW9uIHRhcmdldCBpcyBub3QgYWNjZXNzIHByb3RlY3RlZCBhbmQgcGFzcyBpdAogICAgIHRvIHNjcmlwdHMgdXNpbmcgdGhlIFJFRElSRUNUX1JFTU9URV9VU0VSIGVudmlyb25tZW50IHZhcmlhYmxlLgogICAgIFBSIDEwNjc4LCAxMTYwMi4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfaW5jbHVkZTogRml4IGEgdHJpbyBvZiBidWdzIHRoYXQgd291bGQgY2F1c2UgdmFyaW91cyB1bnVzdWFsCiAgICAgc2VxdWVuY2VzIG9mIHBhcnNlZCBieXRlcyB0byBvbWl0IHBvcnRpb25zIG9mIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgIFBSIDIxMDk1LiBbUm9uIFBhcmsgPHJvbmFsZC5wYXJrIGNuZXQuY29tPiwgQW5kcukgTWFsbywgQ2xpZmYgV29vbGxleV0KCiAgKikgVXBkYXRlIHRoZSBoZWFkZXIgdG9rZW4gcGFyc2luZyBjb2RlIHRvIGFsbG93IExXUyBiZXR3ZWVuIHRoZQogICAgIHRva2VuIHdvcmQgYW5kIHRoZSAnOicgc2VwZXJhdG9yLiAgW1BSIDE2NTIwXQogICAgIFtLcmlzIFZlcmJlZWNrIDxrcmlzLnZlcmJlZWNrIGFkdmFsdmFzLmJlPiwgTmljZWwgS00gPG1uaWNlbCB5YWhvby5jb20+XQoKICAqKSBFbGltaW5hdGUgY3JlYXRpb24gb2YgYSB0ZW1wb3JhcnkgdGFibGUgaW4gYXBfZ2V0X21pbWVfaGVhZGVyc19jb3JlKCkKICAgICBbSm9lIFNjaGFlZmVyIDxqb2UrZ21hbmUgc3Vuc3RhcnN5cy5jb20+XQoKICAqKSBBZGRlZCBGcmVlQlNEIGRpcmVjdG9yeSBsYXlvdXQuIFBSIDIxMTAwLgogICAgIFtTYW5kZXIgSG9sdGhhdXMgPGluZm8gb3JhbmdleGwuY29tPiwgQW5kcukgTWFsb10KCiAgKikgRml4IE5VTEwtcG9pbnRlciBpc3N1ZSBpbiBhYiB3aGVuIHBhcnNpbmcgYW4gaW5jb21wbGV0ZSBvciBub24tSFRUUAogICAgIHJlc3BvbnNlLiBQUiAyMTA4NS4gW0dsZW5uIE5pZWxzZW4gPGdsZW5uIGFwYWNoZS5vcmc+LCBBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogUGVyZm9ybSBjaGlsZCBpbml0aWFsaXphdGlvbiBvbiB0aGUgcmV3cml0ZSBsb2cgbG9jay4KICAgICBUaGlzIGZpeGVzIGEgbG9nIGNvcnJ1cHRpb24gaXNzdWUgd2hlbiBmbG9jay1iYXNlZCBzZXJpYWxpemF0aW9uCiAgICAgaXMgdXNlZCAoZS5nLiwgRnJlZUJTRCkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBEb24ndCByZXNwZWN0IHRoZSBTZXJ2ZXIgaGVhZGVyIGZpZWxkIGFzIHNldCBieSBtb2R1bGVzIGFuZCBDR0lzLgogICAgIEFzIHdpdGggMS4zLCBmb3IgcHJveHkgcmVxdWVzdHMgYW55IHN1Y2ggZmllbGQgaXMgZnJvbSB0aGUgb3JpZ2luCiAgICAgc2VydmVyOyBvdGhlcndpc2UgaXQgd2lsbCBoYXZlIG91ciBzZXJ2ZXIgaW5mbyBhcyBjb250cm9sbGVkIGJ5CiAgICAgdGhlIFNlcnZlclRva2VucyBkaXJlY3RpdmUuICBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDcKCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxOTIgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgd2hlcmVieSBjZXJ0YWluIHNlcXVlbmNlcyBvZiBwZXItZGlyZWN0b3J5CiAgICAgcmVuZWdvdGlhdGlvbnMgYW5kIHRoZSBTU0xDaXBoZXJTdWl0ZSBkaXJlY3RpdmUgYmVpbmcgdXNlZCB0bwogICAgIHVwZ3JhZGUgZnJvbSBhIHdlYWsgY2lwaGVyc3VpdGUgdG8gYSBzdHJvbmcgb25lIGNvdWxkIHJlc3VsdCBpbgogICAgIHRoZSB3ZWFrIGNpcGhlcnN1aXRlIGJlaW5nIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHN0cm9uZyBvbmUuICAKICAgICBbQmVuIExhdXJpZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAyNTMgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgaW4gcHJlZm9yayBNUE0gY2F1c2luZyB0ZW1wb3JhcnkgZGVuaWFsIG9mIHNlcnZpY2UKICAgICB3aGVuIGFjY2VwdCgpIG9uIGEgcmFyZWx5IGFjY2Vzc2VkIHBvcnQgcmV0dXJucyBjZXJ0YWluIGVycm9ycy4KICAgICBSZXBvcnRlZCBieSBTYWhlZWQgQWtodGFyIDxTLkFraHRhciB0YWxpcy5jb20+LiAgW0plZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAyNTQgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgaW4gZnRwIHByb3h5IGNhdXNpbmcgZGVuaWFsIG9mIHNlcnZpY2Ugd2hlbiB0YXJnZXQKICAgICBob3N0IGlzIElQdjYgYnV0IHByb3h5IHNlcnZlciBjYW4ndCBjcmVhdGUgSVB2NiBzb2NrZXQuICBGaXhlZCBieQogICAgIHRoZSByZXBvcnRlci4gIFtZb3NoaW9rYSBUc3VuZW8gPHRzdW5lby55b3NoaW9rYSBmLXNlY3VyZS5jb20+XQoKICAqKSBTRUNVUklUWSBbVlUjMzc5ODI4XSBQcmV2ZW50IHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZyB3aGVuIGVudGVyaW5nCiAgICAgaW5maW5pdGUgbG9vcHMuIFRoZSBuZXcgTGltaXRJbnRlcm5hbFJlY3Vyc2lvbiBkaXJlY3RpdmUgY29uZmlndXJlcwogICAgIGxpbWl0cyBvZiBzdWJzZXF1ZW50IGludGVybmFsIHJlZGlyZWN0cyBhbmQgbmVzdGVkIHN1YnJlcXVlc3RzLCBhZnRlcgogICAgIHdoaWNoIHRoZSByZXF1ZXN0IHdpbGwgYmUgYWJvcnRlZC4gIFBSIDE5NzUzIChhbmQgcHJvYmFibHkgb3RoZXJzKS4KICAgICBbV2lsbGlhbSBSb3dlLCBKZWZmIFRyYXdpY2ssIEFuZHLpIE1hbG9dCgogICopIGNvcmVfb3V0cHV0X2ZpbHRlcjogZG9uJ3Qgc3BsaXQgdGhlIGJyaWdhZGUgYWZ0ZXIgYSBGTFVTSCBidWNrZXQgaWYKICAgICBpdCdzIHRoZSBsYXN0IGJ1Y2tldC4gIFRoaXMgcHJldmVudHMgY3JlYXRpbmcgdW5uZWNjZXNzYXJ5IGVtcHR5CiAgICAgYnJpZ2FkZXMgd2hpY2ggbWF5IG5vdCBiZSBkZXN0cm95ZWQgdW50aWwgdGhlIGVuZCBvZiBhIGtlZXBhbGl2ZQogICAgIGNvbm5lY3Rpb24uCiAgICAgW0p1YW4gUml2ZXJhIDxKdWFuLlJpdmVyYSBjaXRyaXguY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yICJzdHJlYW15IiBQUk9QRklORCByZXNwb25zZXMuCiAgICAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIG1vZF9jZ2lkOiBFbGltaW5hdGUgYSBkb3VibGUtY2xvc2Ugb2YgYSBzb2NrZXQuICBUaGlzIHJlc29sdmVzCiAgICAgdmFyaW91cyBvcGVyYXRpb25hbCBwcm9ibGVtcyBpbiBhIHRocmVhZGVkIE1QTSwgc2luY2Ugb24gdGhlCiAgICAgc2Vjb25kIGF0dGVtcHQgdG8gY2xvc2UgdGhlIHNvY2tldCwgdGhlIHNhbWUgZGVzY3JpcHRvciB3YXMKICAgICBvZnRlbiBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHRocmVhZCBmb3IgYW5vdGhlciBwdXJwb3NlLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9uZWdvdGlhdGlvbjogSW50cm9kdWNlICJwcmVmZXItbGFuZ3VhZ2UiIGVudmlyb25tZW50IHZhcmlhYmxlLAogICAgIHdoaWNoIGFsbG93cyB0byBpbmZsdWVuY2UgdGhlIG5lZ290aWF0aW9uIHByb2Nlc3Mgb24gcmVxdWVzdCBiYXNpcwogICAgIHRvIHByZWZlciBhIGNlcnRhaW4gbGFuZ3VhZ2UuICBbQW5kcukgTWFsb10KCiAgKikgTWFrZSBtb2RfZXhwaXJlcycgRXhwaXJlc0J5VHlwZSB3b3JrIHByb3Blcmx5LCBpbmNsdWRpbmcgZm9yCiAgICAgZHluYW1pY2FsbHktZ2VuZXJhdGVkIGRvY3VtZW50cy4gIFtLZW4gQ29hciwgQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ2CgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMy0wMjQ1IChjdmUubWl0cmUub3JnKQogICAgIEZpeGVkIGEgYnVnIGNhdXNpbmcgYXByX3B2c3ByaW50ZigpIHRvIGNyYXNoIGJ5IHNlbmRpbmcgYW4gb3Zlcmx5CiAgICAgbG9uZyBzdHJpbmcuICBUaGlzIGNhbiBiZSB0cmlnZ2VyZWQgcmVtb3RlbHkgdGhyb3VnaCBtb2RfZGF2LAogICAgIG1vZF9zc2wsIGFuZCBvdGhlciBtZWNoYW5pc21zLgogICAgIFJlcG9ydGVkIGJ5IERhdmlkIEVuZGxlciA8REVuZGxlciBpRGVmZW5zZS5jb20+LiAgW0pvZSBPcnRvbl0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxODkgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBkZW5pYWwtb2Ytc2VydmljZSB2dWxuZXJhYmlsaXR5IGFmZmVjdGluZyBiYXNpYwogICAgIGF1dGhlbnRpY2F0aW9uIG9uIFVuaXggcGxhdGZvcm1zIHJlbGF0ZWQgdG8gdGhyZWFkLXNhZmV0eSBpbgogICAgIGFwcl9wYXNzd29yZF92YWxpZGF0ZSgpLgogICAgIFJlcG9ydGVkIGJ5IEpvaG4gSHVnaGVzIDxqb2huLmh1Z2hlcyBlbnRlZ3JpdHkuY29tPi4KCiAgKikgRml4IGZvciBtb2RfZGF2LiAgQ2FsbCB0aGUgJ2Nhbl9iZV9hY3Rpdml0eScgY2FsbGJhY2ssIGlmIHByb3ZpZGVkLAogICAgIHdoZW4gYSBNS0FDVElWSVRZIHJlcXVlc3QgY29tZXMgaW4uCiAgICAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIFBlcmZvcm0gcnVuLXRpbWUgcXVlcnkgaW4gYXB4cyBmb3IgYXByIGFuZCBhcHItdXRpbCdzIGluY2x1ZGVzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgcnVuIGxpYnRvb2wgZnJvbSB0aGUgYXByIGluc3RhbGwgZGlyZWN0b3J5IChpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50CiAgICAgZnJvbSB0aGUgYXBhY2hlIGluc3RhbGwgZGlyZWN0b3J5KSBbSmVmZiBUcmF3aWNrXQoKICAqKSBjb25maWd1cmUuaW46IFBsYXkgbmljZSB3aXRoIGxpYnRvb2wtMS41LiBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgSWYgbW9kX21pbWVfbWFnaWMgZG9lcyBub3Qga25vdyB0aGUgY29udGVudC10eXBlLCBkbyBub3QgYXR0ZW1wdCB0bwogICAgIGd1ZXNzLiAgUFIgMTY5MDguICBbQW5kcmV3IEdhcG9uIDxhZ2Fwb24gdGVsY29yZGlhLmNvbT5dCgogICopIHNzbCBzZXNzaW9uIGNhY2hpbmcoc2htaHQpIDogRml4IGEgU0VHViBwcm9ibGVtIHdpdGggU0hNSFQgc2Vzc2lvbgogICAgIGNhY2hpbmcuIFBSIDE3ODY0LgogICAgIFtBbmRyZWFzIExlaW1iYWNoZXIgPGFuZHJlYXNsNjcgeWFob28uZGU+LCBNYWRodXN1ZGFuIE1hdGhpaGFsbGldCgogICopIEFkZCBhIGRlbGV0ZSBmbGFnIHRvIGh0cGFzc3dkLgogICAgIFtUaG9tIE1heV0KCiAgKikgRml4IG1vZF9yZXdyaXRlJ3MgaGFuZGxpbmcgb2YgYWJzb2x1dGUgVVJJcy4gVGhlIGVzY2FwaW5nIHJvdXRpbmVzCiAgICAgbm93IHdvcmsgc2NoZW1lIGRlcGVuZGVudCBhbmQgdGhlIHF1ZXJ5IHN0cmluZyB3aWxsIG9ubHkgYmUKICAgICBhcHBlbmRlZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgc2NoZW1lLiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBhbm90aGVyIGNoZWNrIGZvciBhbHJlYWR5IGNvbXByZXNzZWQgY29udGVudCBpbiBtb2RfZGVmbGF0ZS4KICAgICBQUiAxOTkxMy4gW1RzdXlvc2hpIFNBU0FNT1RPIDxuYXpvbmF6byBzdXBlci53aW4ubmUuanA+XQoKICAqKSBGaXhlcyBmb3IgVlBBVEggYnVpbGRzOyBjb3B5aW5nIHNwZWNpYWwubWsgYW5kIGFueSBmdXR1cmUgLm1rIGZpbGVzIAogICAgIGZyb20gdGhlIHNvdXJjZSB0cmVlIGFzIHdlbGwgYXMgdGhlIGJ1aWxkIHRyZWUgKG5vdyBjcmVhdGVzIGEgdXNhYmxlCiAgICAgY29uZmlndXJhdGlvbiBmb3IgYXB4cyksIGFuZCBlbGltaW5hdGVkIHJlZHVuZGFudCAtSSduY2x1ZGUgcGF0aHMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29kZSBmaXhlcywgY29uc3RuZXNzIGNvcnJlY3Rpb25zIGFuZCBzc2xfdG9vbGtpdF9jb21wYXQuaCB1cGRhdGVzCiAgICAgZm9yIFNTTEMgYW5kIE9wZW5TU0wgdG9vbGtpdCBjb21wYXRpYmlsaXR5LiAgU3RpbGwgd29yayByZW1haW5zIHRvCiAgICAgYmUgZG9uZSB0byBjcmlwcGxlIGZlYXR1cmVzIGJhc2VkIG9uIHRoZSBsaW1pdGF0aW9ucyBvZiBSU0EncyBiaW5hcnkgCiAgICAgZGlzdHJpYnV0aW9uIG9mIHRoZWlyIFNTTC1DIHRvb2xraXQuCiAgICAgW1dpbGxpYW0gUm93ZSwgTWFkaHVzdWRhbiBNYXRoaWhhbGxpLCBKZWZmIFRyYXdpY2tdCgogICopIExpbnV4IDIuNCs6IElmIEFwYWNoZSBpcyBzdGFydGVkIGFzIHJvb3QgYW5kIHlvdSBjb2RlIAogICAgIENvcmVEdW1wRGlyZWN0b3J5LCBjb3JlZHVtcHMgYXJlIGVuYWJsZWQgdmlhIHRoZSBwcmN0bCgpIHN5c2NhbGwuCiAgICAgW0dyZWcgQW1lc10KCiAgKikgYXBfZ2V0X21pbWVfaGVhZGVyc19jb3JlOiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIG51bGwKICAgICB3aGVuIGZvbGRpbmcgaXMgaW4gZWZmZWN0LgogICAgIFBSIDE4MTcwIFtQZXRlciBNYXluZSA8UGV0ZXJNYXluZSBTUEFNX1NVWC5hcC5zcGhlcmlvbi5jb20+XQoKICAqKSBGaXggLS1lbmFibGUtbW9kcy1zaGFyZWQ9bW9zdCBhbmQgb3RoZXIgdmFyaWFudHMuICBbQWFyb24gQmFubmVydF0KCiAgKikgbW9kX2xvZ19jb25maWc6IEFkZCB0aGUgYWJpbGl0eSB0byBsb2cgdGhlIGlkIG9mIHRoZSB0aHJlYWQgCiAgICAgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCB2aWEgbmV3ICVQIGZvcm1hdHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVc2UgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgY29kZXMgZm9yIEN6ZWNoIChjcykgYW5kIFRyYWRpdGlvbmFsIENoaW5lc2UKICAgICAoemgtdHcpIGluIGRlZmF1bHQgY29uZmlnIGZpbGVzLiBQUiA5NDI3LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRoX2xkYXA6IFVzZSBnZW5lcmljIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGNsYXNzIHdoZW4gcGFyc2luZwogICAgICJyZXF1aXJlIiBkaXJlY3RpdmVzLCBpbnN0ZWFkIG9mIGxpdGVyYWwgc3BhY2VzIG9ubHkuIFBSIDE3MTM1LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBIb29rIG1vZF9yZXdyaXRlJ3MgdHlwZSBjaGVja2VyIGJlZm9yZSBtb2RfbWltZSdzIG9uZS4gVGhhdCB3YXkgdGhlCiAgICAgUmV3cml0ZVJ1bGUgW1Q9Li4uXSBGbGFnIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkIG5vdy4gUFIgMTk2MjYuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIGh0cGFzc3dkOiBDaGVjayB0aGUgcHJvY2Vzc2VkIGZpbGUgb24gdmFsaWRpdHkuIElmIGEgbGluZSBpcyBub3QgZW1wdHkKICAgICBhbmQgbm90IGEgY29tbWVudCwgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjb2xvbi4gT3RoZXJ3aXNlIGV4aXQKICAgICB3aXRoIGVycm9yIGNvZGUgNy4gW0tyaXMgVmVyYmVlY2sgPEtyaXMuVmVyYmVlY2sgdWJpemVuLmNvbT4sIFRob20gTWF5XQoKICAqKSBGaXggYSBwcm9ibGVtIHRoYXQgY2F1c2VkIGh0dHBkIHRvIGJlIGxpbmtlZCB3aXRoIGluY29ycmVjdCBmbGFncwogICAgIG9uIHNvbWUgcGxhdGZvcm1zIHdoZW4gbW9kX3NvIHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJyZWFraW5nIAogICAgIERTT3Mgb24gQUlYLiAgUFIgMTkwMTIgIFtKZWZmIFRyYXdpY2tdCgogICopIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2FtZSBDQyBhbmQgQ1BQIHdpdGggd2hpY2ggQVBSIHdhcyBidWlsdC4KICAgICBUaGUgdXNlciBjYW4gb3ZlcnJpZGUgd2l0aCBDQyBhbmQgQ1BQIGVudmlyb25tZW50IHZhcmlhYmxlcy4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYXBfY29uc3RydWN0X3VybCgpIHNvIHRoYXQgaXQgc3Vycm91bmRzIElQdjYgbGl0ZXJhbCBhZGRyZXNzCiAgICAgc3RyaW5ncyB3aXRoIFtdLiAgVGhpcyBmaXhlcyBjZXJ0YWluIHR5cGVzIG9mIHJlZGlyZWN0aW9uLgogICAgIFBSIDE5MjA3LiAgW0plZmYgVHJhd2lja10KCiAgKikgZm9yd2FyZCBwb3J0IG9mIGJ1ZmZlciBvdmVyZmxvdyBmaXhlcyBmb3IgaHRkaWdlc3QuIFtUaG9tIE1heV0KCiAgKikgQWRkZWQgQWxsb3dFbmNvZGVkU2xhc2hlcyBkaXJlY3RpdmUgdG8gcGVybWl0IGNvbnRyb2wgb2Ygd2hldGhlcgogICAgIHRoZSBzZXJ2ZXIgd2lsbCBhY2NlcHQgZW5jb2RlZCBzbGFzaGVzICgnJTJmJykgaW4gdGhlIFVSSSBwYXRoLgogICAgIERlZmF1bHQgY29uZGl0aW9uIGlzIG9mZiAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3VyKS4gIFRoaXMgcGVybWl0cwogICAgIGVudmlyb25tZW50cyBpbiB3aGljaCB0aGUgcGF0aC1pbmZvIG5lZWRzIHRvIGNvbnRhaW4gZW5jb2RlZAogICAgIHNsYXNoZXMuICBQUiA1NDMsIDIzODksIDM1ODEsIDM1ODksIDU2ODcsIDcwNjYsIDc4NjUsIDE0NjM5LiAgW0tlbiBDb2FyXQoKICAqKSBXaGVuIHVzaW5nIFJlZGlyZWN0IGluIGRpcmVjdG9yeSBjb250ZXh0LCBhcHBlbmQgcmVxdWVzdGVkIHF1ZXJ5CiAgICAgc3RyaW5nIGlmIHRoZXJlJ3Mgbm8gb25lIHN1cHBsaWVkIGJ5IGNvbmZpZ3VyYXRpb24uIFBSIDEwOTYxLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBVbmVzY2FwZSB0aGUgc3VwcGxpZWQgd2lsZGNhcmQgcGF0dGVybiBpbiBtb2RfYXV0b2luZGV4LiBPdGhlcndpc2UKICAgICB0aGUgcGF0dGVybiB3aWxsIG5vdCBhbHdheXMgbWF0Y2ggYXMgZGVzaXJlZC4gUFIgMTI1OTYuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRvaW5kZXggbm93IGVtaXRzIGFuZCBhY2NlcHRzIG1vZGVybiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyCiAgICAgZGVsaW1pdGVycyAoOykuIFRodXMgY29sdW1uIGhlYWRlcnMgbm8gbG9uZ2VyIGNvbnRhaW4gdW5lc2NhcGVkCiAgICAgYW1wZXJzYW5kcy4gUFIgMTA4ODAgIFtBbmRy6SBNYWxvXQoKICAqKSBFbmFibGUgYXBfc29ja19kaXNhYmxlX25hZ2xlIGZvciBXaW5kb3dzLiBUaGlzIGFsb25nIHdpdGggdGhlIAogICAgIGFkZGl0aW9uIG9mIEFQUl9UQ1BfTk9ERUxBWV9JTkhFUklURUQgdG8gYXByLmh3IHdpbGwgY2F1c2UgTmFnbGUgCiAgICAgdG8gYmUgZGlzYWJsZWQgZm9yIFdpbmRvd3MuIFtBbGxhbiBFZHdhcmRzXQoKICAqKSBDb3JyZWN0IGEgbWlzLWNvcnJlbGF0aW9uIGJldHdlZW4gbXBtX2NvbW1vbi5jIGFuZCBtcG1fY29tbW9uLmg7CiAgICAgVGhpcyBwYXRjaCByZXZlcnRzIHVzIHRvIHByZS0yLjAuNDYgYmVoYXZpb3IsIHVzaW5nIHRoZSAKICAgICBhcF9zb2NrX2Rpc2FibGVfbmFnbGUgbm9vcCBtYWNybywgYmVjYXVzZSBhcF9zb2NrX2Rpc2FibGVfbmFnbGUgCiAgICAgd2FzIG5ldmVyIGNvbXBpbGVkIG9uIFdpbjMyLiBbQWxsYW4gRWR3YXJkcywgV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBidWlsZCBwcm9ibGVtIHdpdGggcGFzc2luZyB1bnN1cHBvcnRlZCAtLWVuYWJsZS1sYXlvdXQKICAgICBhcmdzIHRvIGFwciBhbmQgYXByLXV0aWwuICBUaGlzIGJyb2tlIGJpbmJ1aWxkLnNoIGFzIHdlbGwgYXMKICAgICB1c2VyLXNwZWNpZmllZCBsYXlvdXQgcGFyYW1ldGVycy4gIFBSIDE4NjQ5IFtKdXN0aW4gRXJlbmtyYW50eiwKICAgICBKZWZmIFRyYXdpY2tdCgogICopIElmIGEgRGF0ZSByZXNwb25zZSBoZWFkZXIgd2FzIGFscmVhZHkgc2V0IGluIHRoZSBoZWFkZXJzIGFycmF5LAogICAgIHRoaXMgdmFsdWUgd2FzIGlnbm9yZWQgaW4gZmF2b3VyIG9mIHRoZSBjdXJyZW50IHRpbWUuIFRoaXMgbWVhbnQKICAgICB0aGF0IERhdGUgaGVhZGVycyBvbiBwcm94aWVkIHJlcXVlc3RzIHdoZXJlIHJld3JpdHRlbiB3aGVuIHRoZXkKICAgICBzaG91bGQgbm90IGhhdmUgYmVlbi4gUFI6IDE0Mzc2IFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgQWRkIGNvZGUgdG8gYnVpbGRjb25mIHRoYXQgcHJvZHVjZXMgYW4gaHR0cGQuc3BlYyBmaWxlIGZyb20KICAgICBodHRwZC5zcGVjLmluLCB1c2luZyBidWlsZC9nZXQtdmVyc2lvbi5zaCBmcm9tIEFQUi4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeGVkIGEgc2VnZmF1bHQgd2hlbiBtdWx0aXBsZSBQcm94eUJsb2NrIGRpcmVjdGl2ZXMgd2VyZSB1c2VkLgogICAgIFBSOiAxOTAyMyBbU2FtaSBUaWtrYSA8c2FtaS50aWtrYSBmLXNlY3VyZS5jb20+XQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDMtMDEzNCAoY3ZlLm1pdHJlLm9yZykKICAgICBPUzI6IEZpeCBhIERlbmlhbCBvZiBTZXJ2aWNlIHZ1bG5lcmFiaWxpdHkgaWRlbnRpZmllZCBhbmQKICAgICByZXBvcnRlZCBieSBSb2JlcnQgSG93YXJkIDxyaWhvd2FyZCByYXdidy5jb20+IHRoYXQgd2hlcmUgZGV2aWNlCiAgICAgbmFtZXMgZmF1bHRlZCB0aGUgcnVubmluZyBPUzIgd29ya2VyIHByb2Nlc3MuICBUaGUgZml4IGlzCiAgICAgYWN0dWFsbHkgaW4gQVBSIDAuOS40LiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgRm9yd2FyZCBwb3J0OiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChlc3BlY2lhbGx5IGNvbnRyb2wKICAgICBjaGFyYWN0ZXJzKSBpbiBtb2RfbG9nX2NvbmZpZyB0byBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbgogICAgIGNsaWVudC1zdXBwbGllZCBzdHJpbmdzICh3aXRoIHNwZWNpYWwgY2hhcmFjdGVycykgYW5kIHNlcnZlci1zaWRlCiAgICAgc3RyaW5ncy4gVGhpcyB3YXMgYWxyZWFkeSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4zLjI1LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfZGVmbGF0ZTogQ2hlY2sgYWxzbyBlcnJfaGVhZGVyc19vdXQgZm9yIGFuIGFscmVhZHkgc2V0CiAgICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIuIFRoaXMgcHJldmVudHMgZ3ppcCBjb21wcmVzc2VkIGNvbnRlbnQKICAgICBmcm9tIGEgQ0dJIHNjcmlwdCBmcm9tIGJlaW5nIGNvbXByZXNzZWQgb25jZSBtb3JlLiBQUiAxNzc5Ny4KICAgICBbQW5kcukgTWFsb10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ1CgogICopIEZpeCBwb3NzaWJsZSBzZWdmYXVsdHMgdW5kZXIgb2JzY3VyZSBlcnJvciBjb25kaXRpb25zIHdpdGhpbiB0aGUKICAgICBjZ2lkIGRhZW1vbi4gIFtKZWZmIFRyYXdpY2ssIFdpbGxpYW0gUm93ZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxMzIgKGN2ZS5taXRyZS5vcmcpCiAgICAgQ2xvc2UgYSBEZW5pYWwgb2YgU2VydmljZSB2dWxuZXJhYmlsaXR5IGlkZW50aWZpZWQgYnkgRGF2aWQKICAgICBFbmRsZXIgPERFbmRsZXIgaURlZmVuc2UuY29tPiBvbiBhbGwgcGxhdGZvcm1zLiAgQW4gdW5saW1pdGVkCiAgICAgc3RyZWFtIG9mIG5ld2xpbmVzIHdlcmUgYWNjZXB0YWJsZSBiZXR3ZWVuIHJlcXVlc3RzIHdoZXJlIGVhY2gKICAgICA8bGY+IHdvdWxkIGFsbG9jYXRlIGFuIDgwIGJ5dGUgYnVmZmVyLCBsZWFkaW5nIHZlcnkgcXVpY2tseSB0bwogICAgIG1lbW9yeSBleGFodXN0aW9uLiAgW0JyaWFuIFBhbmVdCgogICopIEFkZGVkIGFuIHJwbSBidWlsZCBzY3JpcHQuCiAgICAgW0dyYWhhbSBMZWdnZXR0LCBKb2UgT3J0b24gPGpvcnRvbiByZWRoYXQuY29tPl0KCiAgKikgU2ltcGxlciwgZmFzdGVyIGNvZGUgcGF0aCBmb3IgcmVxdWVzdCBoZWFkZXIgc2Nhbm5pbmcgIFtCcmlhbiBQYW5lXQoKICAqKSBTRUNVUklUWTogIEVsaW1pbmF0ZWQgbGVha3Mgb2Ygc2V2ZXJhbCBmaWxlIGRlc2NyaXB0b3JzIHRvIGNoaWxkCiAgICAgcHJvY2Vzc2VzLCBzdWNoIGFzIENHSSBzY3JpcHRzLiAgVGhpcyBmaXggZGVwZW5kcyBvbiB0aGUgQVBSIGxpYnJhcnkgCiAgICAgcmVsZWFzZSAwLjkuMiBvciBsYXRlciAoMC45LjMgd2FzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGh0dHBkIAogICAgIHNvdXJjZSB0YXJiYWxsIGZvciBBcGFjaGUgMi4wLjQ1LikgIFBSIDE3MjA2CiAgICAgW0NocmlzdGlhbiBLcmF0emVyIDxjayBja3NvZnQuZGU+LCBCam9lcm4gQS4gWmVlYiA8YnogemFiYmFkb3oubmV0Pl0KCiAgKikgRml4IHBhdGggaGFuZGxpbmcgb2YgbW9kX3Jld3JpdGUsIGVzcGVjaWFsbHkgb24gbm9uLXVuaXggc3lzdGVtcy4KICAgICBUaGVyZSB3YXMgc29tZSBjb25mdXNpb24gYmV0d2VlbiBsb2NhbCBwYXRocyBhbmQgVVJMIHBhdGhzLgogICAgIFBSIDEyOTAyLiAgW0FuZHLpIE1hbG9dCgogICopIFByZXZlbnQgZW5kbGVzcyBsb29wcyBvZiBpbnRlcm5hbCByZWRpcmVjdHMgaW4gbW9kX3Jld3JpdGUgYnkKICAgICBhYm9ydGluZyBhZnRlciBleGNlZWRpbmcgYSBsaW1pdCBvZiBpbnRlcm5hbCByZWRpcmVjdHMuIFRoZQogICAgIGxpbWl0IGRlZmF1bHRzIHRvIDEwIGFuZCBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgUmV3cml0ZU9wdGlvbnMKICAgICBkaXJlY3RpdmUuIFBSIDE3NDYyLiAgW0FuZHLpIE1hbG9dCgogICopIFdpbjMyOiBBdm9pZCBidXN5IHdhaXQgKGNvbnN1bWluZyBhbGwgdGhlIENQVSBpZGxlIGN5Y2xlcykgd2hlbgogICAgIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUgYnVzeS4gCiAgICAgW0lnb3IgTmF6YXJlbmtvIDxpZ29yX25hemFyZW5rbyBob3RtYWlsLmNvbT5dCgogICopIEtlZXAgdGhlIHN1YnJlcXVlc3QgZmlsdGVyIGluIHBsYWNlIHdoZW4gYSBzdWJyZXF1ZXN0IGlzIAogICAgIHJlZGlyZWN0ZWQuICBQUiAxNTQyMy4gIFtKZWZmIFRyYXdpY2tdCgogICopIHlvdSBjYW4gbm93IHNwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGxldmVsIGZvciBtb2RfZGVmbGF0ZS4gCiAgICAgW0lhbiBIb2xzbWFuLCBTdGVwaGVuIFBpZXJ6Y2hhbGEgPHN0ZXBoZW4gcGllcnpjaGFsYS5jb20+LCAKICAgICBNaWNoYWVsIFNjaHJvZXBsIDxNaWNoYWVsLlNjaHJvZXBsIHRlbGVrdXJzLmRlPl0KCiAgKikgbW9kX2RlZmxhdGU6IEV4dGVuZCB0aGUgRGVmbGF0ZUZpbHRlck5vdGUgZGlyZWN0aXZlIHRvCiAgICAgYWxsb3cgYWNjdXJhdGUgbG9nZ2luZyBvZiB0aGUgZmlsdGVyJ3MgaW4tIGFuZCBvdXRzdHJlYW0uCiAgICAgW0FuZHLpIE1hbG9dCgogICopIEFsbG93IFNTTE11dGV4IHRvIHNlbGVjdC91c2UgdGhlIGZ1bGwgcmFuZ2Ugb2YgQVBSIGxvY2tpbmcKICAgICBtZWNoYW5pc21zIGF2YWlsYWJsZSB0byBpdC4gQWxzbywgZml4IHRoZSBidWcgdGhhdCBTU0xNdXRleCB1c2VzCiAgICAgQVBSX0xPQ0tfREVGQVVMVCBubyBtYXR0ZXIgd2hhdC4gIFBSIDgxMjIgIFtKaW0gSmFnaWVsc2tpLAogICAgIE1hcnRpbiBLdXRzY2hrZXIgPG1hcnRpbi50Lmt1dHNjaGtlciBibGFja2JveC5uZXQ+XQoKICAqKSBSZXN0b3JlIHRoZSBhYmlsaXR5IG9mIGh0ZGlnZXN0LmV4ZSB0byBjcmVhdGUgZmlsZXMgdGhhdCBjb250YWluCiAgICAgbW9yZSB0aGFuIG9uZSB1c2VyLiBQUiAxMjkxMC4gIFtBbmRy6SBNYWxvXQoKICAqKSBJbXByb3ZlIGJpbmFyeSBjb21wYXRpYmlsaXR5IG9mIHRoZSBjb3JlIGJldHdlZW4gZGVidWcgKGFrYQogICAgIG1haW50YWluZXItbW9kZSkgYW5kIGEgbm9uLWRlYnVnIGNvbXBpbGUuCiAgICAgW1NhbmRlciBTdHJpa2VyXQoKICAqKSBtb2RfdXNlcnRyYWNrOiBkb24ndCBzZXQgdGhlIGNvb2tpZSBpbiBzdWJyZXF1ZXN0cy4gVGhpcyB3b3JrcwogICAgIGFyb3VuZCB0aGUgcHJvYmxlbSB0aGF0IGNvb2tpZXMgd2VyZSBzZXQgdHdpY2UgZHVyaW5nIGZhc3QgaW50ZXJuYWwKICAgICByZWRpcmVjdHMuIFBSIDEzMjExLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRvaW5kZXggbm8gbG9uZ2VyIGZvcmdldHMgb3V0cHV0IGZvcm1hdCBhbmQgZW5hYmxlZCB2ZXJzaW9uCiAgICAgc29ydCBpbiBsaW5rZWQgY29sdW1uIGhlYWRlcnMuICBbQW5kcukgTWFsb10KCiAgKikgVXNlIC5zdiBpbnN0ZWFkIG9mIC5zZSBhcyBleHRlbnNpb24gZm9yIFN3ZWRpc2ggZG9jdW1lbnRzIGluIHRoZQogICAgIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gUFIgMTI4NzcuICBbQW5kcukgTWFsb10KCiAgKikgVXBkYXRlZCBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcCB0byBzdXBwb3J0IHRoZSBOb3ZlbGwgTERBUCBTREsgU1NMCiAgICAgYW5kIHN0YW5kYXJkaXplZCB0aGUgTERBUCBTU0wgc3VwcG9ydCBhY3Jvc3MgdGhlIHZhcmlvdXMgTERBUCBTREtzLiAgCiAgICAgSXNvbGF0ZWQgdGhlIFNTTCBmdW5jdGlvbmFsaXR5IHRvIG1vZF9sZGFwIHJhdGhlciB0aGFuIHNwZWFkaW5nIGl0IAogICAgIGFjcm9zcyBtb2RfYXV0aF9sZGFwIGFuZCBtb2RfbGRhcC4gIEFsc28gYWRkZWQgTERBUFRydXN0ZWRDQQogICAgIGFuZCBMREFQVHJ1c3RlZENBVHlwZSBkaXJlY3RpdmVzIHRvIG1vZF9sZGFwIHRvIGFsbG93IGZvciBhIG1vcmUgCiAgICAgY29tbW9uIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIHRoZSBTU0wgY2VydGlmaWNhdGUuCiAgICAgW0RhdmUgV2FyZCwgQnJhZCBOaWNob2xlc10KCiAgKikgRml4ZWQgbW9kX3NzbCdzIFNTTENlcnRpZmljYXRlQ2hhaW4gaW5pdGlhbGl6YXRpb24gdG8gbm8gbG9uZ2VyIAogICAgIHNraXAgdGhlIGZpcnN0IGNlcnQgb2YgdGhlIGNoYWluIGJ5IGRlZmF1bHQuICBUaGlzIG1pc2JlaGF2aW9yIAogICAgIHdhcyBpbnRyb2R1Y2VkIGluIDIuMC4zNC4gIFBSIDE0NTYwICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpXQoKICAqKSBtb2RfY2dpLCBtb2RfY2dpZCwgbW9kX2V4dF9maWx0ZXI6IExvZyBlcnJvcnMgd2hlbiBzY3JpcHRzIGNhbm5vdAogICAgIGJlIHN0YXJ0ZWQgb24gVW5peCBiZWNhdXNlIG9mIHN1Y2ggcHJvYmxlbXMgYXMgYmFkIHBlcm1pc3Npb25zLAogICAgIGJhZCBzaGViYW5nIGxpbmUsIGV0Yy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCA2NC1iaXQgcHJvYmxlbSBpbiBtb2Rfc3NsIGlucHV0IGxvZ2ljLiAgCiAgICAgW01hZGh1c3VkYW4gTWF0aGloYWxsaSA8bWFkaHVzdWRhbl9tYXRoaWhhbGxpIGhwLmNvbT5dCgogICopIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzIGluIG1vZF9kZWZsYXRlIG9uIG1hbGZvcm1lZCBkYXRhLiAgUFIgMTYwNDYuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZXdyaXRlIGFwX3htbF9wYXJzZV9pbnB1dCB0byB1c2UgYnVja2V0IGJyaWdhZGVzLiAgUFIgMTYxMzQuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggc2VnZmF1bHQgd2hpY2ggb2NjdXJyZWQgd2hlbiBhIHNlY3Rpb24gaW4gYW4gaW5jbHVkZWQKICAgICBjb25maWd1cmF0aW9uIGZpbGUgd2FzIG5vdCBjbG9zZWQuIFBSIDE3MDkzLiAgW0FuZHLpIE1hbG9dCgogICopIEVuaGFuY2UgdGhlIGJlaGF2aW9yIG9mIG1vZF9pc2FwaSdzIFdyaXRlQ2xpZW50KCkgY2FsbGJhY2sgdG8KICAgICBwcm92aWRlIGJldHRlciBlbXVsYXRpb24gZm9yIGlzYXBpIG1vZHVsZXMgdGhhdCBwcmVzdW1lIHRoYXQgdGhlCiAgICAgZmlyc3QgV3JpdGVDbGllbnQoKSBjYWxsIG1heSBzZW5kIHN0YXR1cyBhbmQgaGVhZGVycy4gIEFuIGV4YW1wbGUKICAgICBvZiBXcml0ZUNsaWVudCgpIGFidXNlIGlzIHRoZSBmb3hpc2FwaSBtb2R1bGUsIHdoaWNoIHJlbGllcyBvbgogICAgIHRoYXQgYXNzdW1waW9uIGFuZCBub3cgd29ya3MuICBbV2lsbGlhbSBSb3dlLCBNaWxhbiBLb3NpbmFdCgogICopIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYXBfcnVuX3ByZV9jb25uZWN0aW9uKCkuIFNvIGlmIHRoZQogICAgIHByZV9jb25uZWN0aW9uIHBoYXNlIGZhaWxzICh3aXRob3V0IHNldHRpbmcgYy0+YWJvcnRlZCkKICAgICBhcF9ydW5fcHJvY2Vzc19jb25uZWN0aW9uIGlzIG5vdCBleGVjdXRlZC4gW1N0YXMgQmVrbWFuXQoKICAqKSBGaXhlZCBhIHByb2JsZW0gd2l0aCBtb2RfbGRhcCB3aGljaCBjYXVzZWQgaXQgdG8gZmF1bHQgd2hlbiBjYWNoaW5nCiAgICAgd2FzIGRpc2FibGVkLiAgTmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGRpZCBub3QKICAgICBhdHRlbXB0IHRvIHVzZSB0aGUgY2FjaGUgaWYgaXQgZGlkbid0IGV4aXN0LiBBbHNvIGZpeGVkIHNvbWUgbWVtb3J5CiAgICAgbGVha3Mgd2hpY2ggd2VyZSBkdWUgdG8gbm90IHJlbGVhc2luZyBMREFQIHJlc291cmNlcyBvbiBlcnJvcgogICAgIGNvbmRpdGlvbnMuICBbQnJhZCBOaWNob2xlc10KICAgICAKICAqKSBIb29rIG1vZF9wcm94eSdzIGZpeHVwIGJlZm9yZSBtb2RfcmV3cml0ZSdzIGZpeHVwLCBzbyB0aGF0IGJ5CiAgICAgbW9kX3Jld3JpdGUgcHJveGllZCBVUkxzIHdpbGwgbm90IGJlIGVzY2FwZWQgYWNjaWRlbnRhbGx5IGJ5CiAgICAgbW9kX3Byb3h5J3MgZml4dXAuIFBSIDE2MzY4ICBbQW5kcukgTWFsb10KCiAgKikgV2hpbGUgcHJvY2Vzc2luZyBmaWx0ZXJzIG9uIGludGVybmFsIHJlZGlyZWN0cywgcmVtZW1iZXIgc2VlbiBFT1MKICAgICBidWNrZXRzIGFsc28gaW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlIG9mIHRoZSByZWRpcmVjdCBpc3N1ZXIocykuIFRoaXMKICAgICBwcmV2ZW50cyBmaWx0ZXJzIChzdWNoIGFzIG1vZF9kZWZsYXRlKSBmcm9tIGFkZGluZyBnYXJiYWdlIHRvIHRoZQogICAgIHJlc3BvbnNlLiBQUiAxNDQ1MS4gIFtBbmRy6SBNYWxvXQoKICAqKSBzdWV4ZWM6IEJlIG1vcmUgcGVkYW50aWMgd2hlbiBjbGVhbmluZyBlbnZpcm9ubWVudC4gQ2xlYW4gaXQKICAgICBpbW1lZGlhdGVseSBhZnRlciBzdGFydHVwLiBQUiAyNzkwLCAxMDQ0OS4KICAgICBbSmVmZiBTdGV3YXJ0IDxqd3MgcHVyZHVlLmVkdT4sIEFuZHLpIE1hbG9dCgogICopIEZpeCBhcHhzIHRvIGluc2VydCBMb2FkTW9kdWxlIGRpcmVjdGl2ZXMgb25seSBvdXRzaWRlIG9mIHNlY3Rpb25zLgogICAgIFBSIDg3MTIsIDkwMTIuICBbQW5kcukgTWFsb10KCiAgKikgRml4IHN1ZXhlYyBjb21waWxlIGVycm9yIHVuZGVyIFNVTk9TNCwgd2hlcmUgc3RyZXJyb3IoKSBkb2Vzbid0CiAgICAgZXhpc3QuIFBSIDU5MTMsIDk5NzcuCiAgICAgW0pvbmF0aGFuIFcgTWluZXIgPEpvbmF0aGFuLlcuTWluZXIgbG1jby5jb20+XQoKICAqKSBGaXggSWYgaGVhZGVyIHBhcnNpbmcgd2hlbiBhIG5vbi1tb2RfZGF2IGxvY2sgdG9rZW4gaXMgcGFzc2VkIHRvIGl0LgogICAgIFBSIDE2NDUyLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfYXV0aF9kaWdlc3Qgbm8gbG9uZ2VyIHRyaWVzIHRvIGd1ZXNzIEF1dGhEaWdlc3REb21haW4sIGlmIGl0J3MKICAgICBub3Qgc3BlY2lmaWVkLiBOb3cgaXQgYXNzdW1lcyAiLyIgYXMgYWxyZWFkeSBkb2N1bWVudGVkLiBQUiAxNjkzNy4KICAgICBbQW5kcukgTWFsb10KCiAgKikgVHJ5IHRvIGxvZyBhbiBlcnJvciBpZiBhIHBpcGVkIGxvZyBwcm9ncmFtIGZhaWxzLiAgVHJ5IHRvCiAgICAgcmVzdGFydCBhIHBpcGVkIGxvZyBwcm9ncmFtIGluIG1vcmUgZmFpbHVyZSBzaXR1YXRpb25zLiAgRml4IGFuCiAgICAgZXhpc3RpbmcgcHJvYmxlbSB3aXRoIGVycm9yIGhhbmRsaW5nIGluIHBpcGVkX2xvZ19zcGF3bigpLiAgVXNlCiAgICAgbmV3IEFQUiBhcHJfcHJvY19jcmVhdGUoKSBmZWF0dXJlcyB0byBwcmV2ZW50IEFwYWNoZSBmcm9tIHN0YXJ0aW5nCiAgICAgb24gVW5peCogaW4gbW9zdCBjYXNlcyB3aGVyZSBhIHBpcGVkIGxvZyBwcm9ncmFtIGNhbiBiZSBzdGFydGVkLAogICAgIGFuZCBhZGQgbG9nIG1lc3NhZ2VzIGZvciB0aGUgb3RoZXIgc2l0dWF0aW9ucy4gICpPdGhlciBwbGF0Zm9ybXMKICAgICBhbHJlYWR5IGZhaWxlZCBBcGFjaGUgaW5pdGlhbGl6YXRpb24gaWYgYSBwaXBlZCBsb2cgcHJvZ3JhbQogICAgIGNvdWxkbid0IGJlIHN0YXJ0ZWQuICBQUiAxNTc2MSAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IG1vZF9jZXJuX21ldGEgdG8gbm90IGNyZWF0ZSBlbXB0eSBtZXRhZmlsZXMgd2hlbiB0aGUKICAgICBtZXRhZmlsZSBzZWFyY2hlZCBmb3IgZG9lcyBub3QgZXhpc3QuICBQUiAxMjM1MwogICAgIFtPd2VuIFJlZXMgPG93ZW5fcmVlcyBocC5jb20+XQoKICAqKSBJbnRyb2R1Y2UgZGVidWdnaW5nIHN5bWJvbHMgZm9yIFdpbjMyIHJlbGVhc2UgYnVpbGRzLCBib3RoIC5wZGIgCiAgICAgYW5kIC5kYmcgZmlsZXMgKG9sZGVyIGRlYnVnZ2VycyBhbmQgRHIuIFdhdHNvbi10eXBlIHV0aWxpdGllcyAKICAgICBvbiBXaW5OVCBvciBXaW45eCBkb24ndCBzdXBwb3J0IHRoZSBuZXdlciAucGRiIGZsYXZvci4pCiAgICAgW0FsbGVuIEVkd2FyZHMsIFdpbGxpYW0gUm93ZV0KIAogICopIEZpeCBidWcgd2hlcmUgJ1NhdGlzZnkgQW55JyB3aXRob3V0IGFuIEF1dGhUeXBlIGxvc3QgYWxsIE1JTUUKICAgICBpbmZvcm1hdGlvbiAoYW5kIG1vcmUpLiBSZWxhdGVkIHRvIFBSIDkwNzYuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2ZpbGVfY2FjaGU6IGZpeCBzZWdmYXVsdCBzZXJ2aW5nIG1tYXBlZCBjYWNoZWQgZmlsZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9maWxlX2NhY2hlOiBmaXhlZCBhIHNlZ2ZhdWx0IHdoZW4gbXVsdGlwbGUgTU1hcEZpbGUgZGlyZWN0aXZlcwogICAgIHdlcmUgdXNlZC4gIFBSIDE2MzEzLiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBhIG5hc3R5IHNlZ2ZhdWx0IGluIG1tYXBfYnVja2V0X3NldGFzaWRlKCkgY2F1c2VkIGJ5IHBhc3NpbmcKICAgICBhbiBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlIHRvIG1tYXBfYnVja2V0X2Rlc3Ryb3kodm9pZCopLgogICAgIFtHZXJhcmQgRXZpc3RvbiA8Z2V2aXN0b24gYmlncG9uZC5uZXQuYXU+XQoKICAqKSBFbmFibGUgdGhlIC1uIG5hbWUgcGFyYW1ldGVyIG9uIE5ldFdhcmUgdG8gYWxsb3cgdGhlCiAgICAgYWRtaW5pc3RyYXRvciB0byByZW5hbWUgdGhlIEFwYWNoZSBjb25zb2xlIHNjcmVlbgogICAgIFtCcmFkIE5pY2hvbGVzXQogICAgIAogICopIEZpeGVkIHBpcGVkIGFjY2VzcyBsb2dzIG9uIFdpbjMyIGJ5IGRpc2FibGluZyBPVEhFUl9DSElMRAogICAgIHN1cHBvcnQgYnkgZGVmYXVsdCBpbiBBUFIuICBNb3JlIGRldmVsb3BtZW50IGlzIHJlcXVpcmVkCiAgICAgdG8gZGVwbG95IE9USEVSX0NISUxEIG9uIFdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVXNlIHNhbmVyIGRlZmF1bHQgY29uZmlnIHZhbHVlcyBmb3Igc3VleGVjLiBQUiAxNTcxMy4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgbW9kX3Jld3JpdGU6IEFsbG93ICJSZXdyaXRlRW5naW5lIE9mZiIgZXZlbiBpZiBubyAiT3B0aW9ucyBGb2xsb3dTeW1saW5rcyIKICAgICAob3IgU3ltbGlua3NJZk93bmVybWF0Y2gpIGlzIHNldC4gUFIgMTIzOTUuICBbQW5kcukgTWFsb10KCiAgKikgYXB4czogSW5jbHVkZSBhbnkgc3BlY2lhbCBBUFIgbGQgZmxhZ3Mgd2hlbiBsaW5raW5nIHRoZSBEU08uCiAgICAgVGhpcyByZXNvbHZlcyBwcm9ibGVtcyBvbiBBSVggd2hlbiBidWlsZGluZyBhIERTTyB3aXRoIGFweHMrZ2NjLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGNoYXJhY3RlciBzZXQgc3VwcG9ydCB0byBtb2RfYXV0aF9MREFQIHRvIGFsbG93IGl0IHRvIAogICAgIGNvbnZlcnQgZXh0ZW5kZWQgY2hhcmFjdGVycyB1c2VkIGluIHRoZSB1c2VyIElEIHRvIFVURi04IAogICAgIGJlZm9yZSBhdXRoZW50aWNhdGluZyBhZ2FpbnN0IHRoZSBMREFQIGRpcmVjdG9yeS4gVGhlIG5ldwogICAgIGRpcmVjdGl2ZSBBdXRoTERBUENoYXJzZXRDb25maWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWcKICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNoYXJhY3RlciBzZXQgY29udmVyc2lvbiB0YWJsZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgRG9uJ3QgcmVtb3ZlIHRoZSBDb250ZW50LUxlbmd0aCBmcm9tIHJlc3BvbnNlcyBpbiBtb2RfcHJveHkKICAgICBQUjogODY3NyBbQnJpYW4gUGFuZV0KCiAgKikgRW5zdXJlIExEQVAgdmVyc2lvbiBpcyBzZXQgdG8gdjMgb24gZXZlcnkgYmluZC4gUFIgMTQyMzUuCiAgICAgW1NlcmdleSBBLiBMaXBuZXZpY2ggPHNlcmdleWxpIHBpc2VtLm5ldD5dCgogICopIEZpeCBtb2RfbGRhcCB0byBvcGVuIGFuIGV4aXN0aW5nIHNoYXJlZCBtZW1vcnkgZmlsZSBzaG91bGQgb25lCiAgICAgYWxyZWFkeSBleGlzdC4gUFIgMTI3NTcuIFtTY29vdGVyIE1vcnJpcyA8c2Nvb3RlciBnZW5lLmNvbT4sCiAgICAgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCB0aGUgdWxpbWl0IGNvbW1hbmQgdXNlZCBieSBhcGFjaGVjdGwgb24gVHJ1NjQuICBQUiAxMzYwOS4KICAgICBbSm9zZXBoIFNlbnVsaXMgPEpvc2VwaC5TZW51bGlzIGRuci5zdGF0ZS53aS51cz4sIEplZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSB1bGltaXQgY29tbWFuZCB1c2VkIGJ5IGFwYWNoZWN0bCBvbiBBSVggc28gdGhhdCBpdAogICAgIHdvcmtzIGluIGFsbCBsb2NhbGVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2V4dF9maWx0ZXI6IEZpeCBhIHByb2JsZW0gYnVpbGRpbmcgYXJndW1lbnQgbGlzdHMgd2hpY2ggCiAgICAgb2NjYXNpb25hbGx5IGNhdXNlZCBleGVjIHRvIGZhaWwuICBQUiAxNTQ5MS4gIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40NAoKICAqKSBtb2RfYXV0b2luZGV4OiBCcmluZyBmb3J3YXJkIHRoZSBJbmRleE9wdGlvbnMgSWdub3JlQ2FzZSBvcHRpb24KICAgICBmcm9tIEFwYWNoZSAxLjMuICBQUiAxNDI3NgogICAgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPiwgV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfbWltZTogV29ya2Fyb3VuZCB0byBwcmV2ZW50IGEgc2VnZmF1bHQgaWYgci0+ZmlsZW5hbWU9TlVMTAogICAgIFtCcmlhbiBQYW5lXQogCiAgKikgUmVvcmRlciB0aGUgZGVmaW5pdGlvbnMgZm9yIG1vZF9sZGFwIGFuZCBtb2RfYXV0aF9sZGFwIHdpdGhpbgogICAgIGNvbmZpZy5tNCB0byBtYWtlIHN1cmUgdGhlIHBhcmVudCBtb2RfbGRhcCBpcyBkZWZpbmVkIGZpcnN0LgogICAgIFRoaXMgZW5zdXJlcyB0aGF0IG1vZF9sZGFwIGNvbWVzIGJlZm9yZSBtb2RfYXV0aF9sZGFwIGluIHRoZQogICAgIGh0dHBkLmNvbmYgZmlsZSwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBtb2RfYXV0aF9sZGFwIHRvIGxvYWQuCiAgICAgUFIgMTQyNTYgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4IHRoZSBidWlsZGluZyBvZiBjZ2kgY29tbWFuZCBsaW5lcyB3aGVuIHRoZSBxdWVyeSBzdHJpbmcKICAgICBjb250YWlucyAnPScuICBQUiAxMzkxNCAgW1ZpbGxlIFNreXR05CA8dmlsbGUuc2t5dHRhIGlraS5maT4sCiAgICAgSmVmZiBUcmF3aWNrXQoKICAqKSBSZW5hbWUgQ2FjaGVNYXhTdHJlYW1pbmdCdWZmZXIgdG8gTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyLiBNb3ZlCiAgICAgaW1wbGVtZW50YXRpb24gb2YgTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIGZyb20gbW9kX2NhY2hlIHRvCiAgICAgbW9kX21lbV9jYWNoZS4gTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIG5vdyBkZWZhdWx0cyB0byB0aGUKICAgICBsZXNzZXIgb2YgMTAwLDAwMCBieXRlcyBvciBNQ2FjaGVNYXhDYWNoZU9iamVjdFNpemUuIFRoaXMgc2hvdWxkIAogICAgIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgZXhwbGljaXRseSBjb2RpbmcgTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyCiAgICAgaW4gbW9zdCBjb25maWd1cmF0aW9ucy4gW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9jYWNoZTogRml4IFBSIDE1MTEzLCBhIGNvcmUgZHVtcCBpbiBjYWNoZV9pbl9maWx0ZXIgd2hlbgogICAgIGEgcmVkaXJlY3Qgb2NjdXJzLiBUaGUgY29kZSB3YXMgcGFzc2luZyBhIGZvcm1hdCBzdHJpbmcgYW5kCiAgICAgaW50ZWdlciB0byBhcHJfcHN0cmNhdC4gQ2hhbmdlZCB0byBhcHJfcHNwcmludGYuCiAgICAgW1BhdWwgSi4gUmVkZXJdCgogICopIFJlcGxhY2UgQVBVX0hBU19MREFQU1NMX0NMSUVOVF9JTklUIHdpdGggQVBVX0hBU19MREFQX05FVFNDQVBFX1NTTAogICAgIGFzIHNldCBieSBhcHItdXRpbCBpbiB1dGlsX2xkYXAuYy4gVGhpcyBzaG91bGQgYWxsb3cgbW9kX2xkYXAKICAgICB0byB3b3JrIHdpdGggdGhlIE5ldHNjYXBlL01vemlsbGEgTERBUCBsaWJyYXJ5LiBb2Hl2aW4gU/htbWUKICAgICA8c29tbWUgb3Nsby53ZXN0ZXJuZ2Vjby5zbGIuY29tPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBjcml0aWNhbCBidWcgaW4gbmV3IC0tZW5hYmxlLXY0LW1hcHBlZCBjb25maWd1cmUgb3B0aW9uCiAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggYnJva2UgSVB2NCBsaXN0ZW5pbmcgc29ja2V0cyBvbiBzb21lCiAgICAgc3lzdGVtcy4gIFtoaXJveXVraSBoYW5haSA8aGFuYWkgaW1nc3JjLmNvLmpwPl0KCiAgKikgbW9kX3NldGVudmlmOiBGaXggQnJvd3Nlck1hdGNoTm9DYXNlIHN1cHBvcnQgZm9yIG5vbi1yZWdleAogICAgIHBhdHRlcm5zIFtBbmRy6SBNYWxvIDxuZCBwZXJsaWcuZGU+XQoKICAqKSBBZGQgdmVyc2lvbiBzdHJpbmcgdG8gcHJvdmlkZXIgQVBJLiAgW0p1c3RpbiBFcmVua3JhbnR6XQogCiAgKikgYnVpbGQ6ICcuL2NvbmZpZ3VyZSAmJiBtYWtlJyBub3cgd29ya3Mgd2l0aG91dCBhbiBpbi10cmVlCiAgICAgYXByIGFuZCBhcHItdXRpbC4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIG1vZF9uZWdvdGlhdGlvbjogU2V0IHRoZSBhcHByb3ByaWF0ZSBtaW1lIHJlc3BvbnNlIGhlYWRlcnMKICAgICAoQ29udGVudC1UeXBlLCBjaGFyc2V0LCBDb250ZW50LUxhbmd1YWdlIGFuZCBDb250ZW50LUVuY29kaW5nKQogICAgIGZvciBuZWdvdGF0ZWQgdHlwZS1tYXAgIkJvZHk6IiByZXNwb25zZXMgKHN1Y2ggYXMgdGhlIGVycm9yCiAgICAgcGFnZXMuKSAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9sb2dfY29uZmlnOiBBbGxvdyAnJSUnIGVzY2FwaW5nIGluIEN1c3RvbUxvZyBmb3JtYXQKICAgICBzdHJpbmdzIHRvIGluc2VydCBhIGxpdGVyYWwsIHNpbmdsZSAnJScuCiAgICAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9hdXRvaW5kZXg6IEFkZERlc2NyaXB0aW9uIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yaWVzCiAgICAgbm93IHdvcmsgYXMgaW4gQXBhY2hlIDEuMywgd2hlcmUgbm8gdHJhaWxpbmcgJy8nIGlzCiAgICAgc3BlY2lmaWVkIG9uIHRoZSBkaXJlY3RvcnkgbmFtZS4gIFByZXZpb3VzbHksIHRoZSB0cmFpbGluZwogICAgICcvJyAqaGFkKiB0byBiZSBzcGVjaWZpZWQsIHdoaWNoIHdhcyBpbmNvbXBhdGlibGUgd2l0aAogICAgIEFwYWNoZSAxLjMuICBQUiA3OTkwICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggZm9yIFBSIDE0NTU2LiBUaGUgZXhwaXJ5IGNhbGN1bGF0aW9ucyBpbiBtb2RfY2FjaGUgd2VyZQogICAgIHRyeWluZyB0byBwZXJmb3JtICJub3cgKyAoKGRhdGUgLSBsYXN0bW9kKSAqIGZhY3RvcikiIHdoZXJlCiAgICAgZGF0ZSA9PSBsYXN0bW9kIHJlc3VsdGluZyBpbiAibm93ICsgMCIuIFRoZSBjb2RlIG5vdyBmb2xsb3dzCiAgICAgdGhlIGVsc2UgcGF0aCAodXNpbmcgdGhlIGRlZmF1bHQgZXhwaXJhdGlvbikgaWYgZGF0ZSBpcwogICAgIGVxdWFsIHRvIGxhc3Rtb2QuIFtTZXJnZXkgPHJ4IGFybXN0cmlrZS5jb20+LCBQYXVsIEouIFJlZGVyXQoKICAqKSBVc2UgQVBfREVDTEFSRSBpbiB0aGUgZGVidWcgdmVyc2lvbnMgb2YgYXBfc3RyWFhYIGluIGNhc2UgdGhlCiAgICAgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieQogICAgIEFQX0RFQ0xBUkUuICBbSnVhbiBSaXZlcmEgPEp1YW4uUml2ZXJhIGNpdHJpeC5jb20+XQoKICAqKSBtb2RfY2FjaGU6IERvbid0IGNhY2hlIHJlc3BvbnNlIGhlYWRlciBmaWVsZHMgZGVzaWduYXRlZAogICAgIGFzIGhvcC1ieS1ob3AgaGVhZGVycyBpbiBIVFRQLzEuMSAoUkZDIDI2MTYgU2VjdGlvbiAxMy41LjEpLgogICAgIFtFc3RyYWRlIE1hdHRoaWV1IDxlc3RyYWRlLW0gaWZyYW5jZS5jb20+LCBCcmlhbiBQYW5lXQoKICAqKSBtb2RfY2dpZDogSGFuZGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgogICAgIFBSIDE0NTUwICBbUGlvdHIgQ3plamtvd3NraSA8YXBhY2hlIGN6YXJueS5ldS5vcmc+LCBKZWZmCiAgICAgVHJhd2lja10KCiAgKikgTW92ZSBtb2RfZXh0X2ZpbHRlciBvdXQgb2YgZXhwZXJpbWVudGFsIGFuZCBpbnRvIGZpbHRlcnMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBtb2RfZGVmbGF0ZSB3aXRoIGR5bmFtaWMgY29udGVudC4KICAgICBQUiAxNDMyMSAgW0tlbiBGcmFua2VuIDxrZnJhbmtlbiBkZWNpc2lvbm1hcmsuY29tPl0KCiAgKikgQWRkIC0tW2VuYWJsZXxkaXNhYmxlXS12NC1tYXBwZWQgY29uZmlndXJlIG9wdGlvbiB0byBjb250cm9sCiAgICAgd2hldGhlciBvciBub3QgQXBhY2hlIGV4cGVjdHMgdG8gaGFuZGxlIElQdjQgY29ubmVjdGlvbnMKICAgICBvbiBJUHY2IGxpc3RlbmluZyBzb2NrZXRzLiAgRWl0aGVyIHNldHRpbmcgd2lsbCB3b3JrIG9uIAogICAgIHN5c3RlbXMgd2l0aCB0aGUgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbi4gIC0tZW5hYmxlLXY0LW1hcHBlZAogICAgIG11c3QgYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgYWx3YXlzIGFsbG93IElQdjQgY29ubmVjdGlvbnMgb24KICAgICBJUHY2IGxpc3RlbmluZyBzb2NrZXRzLiAgUFIgMTQwMzcgKEJ1Z3ppbGxhKSwgUFIgNzQ5MiAoR25hdHMpCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2hlcmUgdGhlIHVuZGVybHlpbmcgY2FjaGUgY29kZQogICAgIGluZGljYXRlZCB0aGF0IHRoZXJlIHdhcyBvbmUgbW9yZSBlbGVtZW50IG9uIHRoZSBjYWNoZQogICAgIHRoYW4gdGhlcmUgYWN0dWFsbHkgd2FzLiBUaGlzIGhhcHBlbmVkIHNpbmNlIGVsZW1lbnQgMAogICAgIGV4aXN0cyBidXQgaXMgbm90IHVzZWQuIFRoaXMgY29kZSBhbGxvY2F0ZXMgdGhlIGNvcnJlY3QKICAgICBudW1iZXIgb2YgdXNlYWJsZSBlbGVtZW50cyBhbmQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mCiAgICAgYWN0dWFsbHkgdXNlZCBlbGVtZW50cy4gVGhlIHByZXZpb3VzIGNvZGUgb25seSBhbGxvd2VkCiAgICAgTUNhY2hlTWF4T2JqZWN0Q291bnQtMSBvYmplY3RzIHRvIGJlIHN0b3JlZCBpbiB0aGUKICAgICBjYWNoZS4gW1BhdWwgSi4gUmVkZXJdCgogICopIG1vZF9zZXRlbnZpZjogQWRkIFNFUlZFUl9BRERSIHNwZWNpYWwga2V5d29yZCB0byBhbGxvdwogICAgIGVudmFyaWFibGUgc2V0dGluZyBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlciBJUCBhZGRyZXNzCiAgICAgd2hpY2ggcmVjZWl2ZWQgdGhlIHJlcXVlc3QuICBbS2VuIENvYXJdCgogICopIG1vZF9jZ2lkOiBUZXJtaW5hdGUgQ0dJIHNjcmlwdHMgd2hlbiB0aGUgY2xpZW50IGNvbm5lY3Rpb24gCiAgICAgZHJvcHMuICBQUiA4Mzg4ICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZWFycmFuZ2UgT3BlblNTTCBlbmdpbmUgaW5pdGlhbGl6YXRpb24gdG8gc3VwcG9ydCBSQU5EIAogICAgIHJlZGlyZWN0aW9uIG9uIGNyeXB0byBhY2NlbGVyYXRvci4gCiAgICAgW0ZyZWRlcmljIERPTk5BVCA8ZnJlZGVyaWMuZG9ubmF0IHplbmNvZC5jb20+XQoKICAqKSBBbHdheXMgZW1pdCBWYXJ5IGhlYWRlciBpZiBtb2RfZGVmbGF0ZSBpcyBpbnZvbHZlZCBpbiB0aGUKICAgICByZXF1ZXN0LiAgW0FuZHJlIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9pc2FwaTogU3RvcCB1bnNldHRpbmcgdGhlICdlbXB0eScgcXVlcnkgc3RyaW5nIHJlc3VsdCB3aXRoCiAgICAgYSBOVUxMIGFyZ3VtZW50IGluIGVjYi0+bHBzelF1ZXJ5U3RyaW5nLCBlbGltaW5hdGluZyBzZWdmYXVsdHMKICAgICBmb3Igc29tZSBJU0FQSSBtb2R1bGVzLiAgUFIgMTQzOTkKICAgICBbRGV0bGV2IFZlbmR0IDxkZXRsZXYudmVuZHQgYnJpbGxpdC5kZT5dCgogICopIG1vZF9pc2FwaTogRml4IGFuIGlzc3VlIHdoZXJlIHRoZSBIU0VfUkVRX0RPTkVfV0lUSF9TRVNTSU9OCiAgICAgbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkIGJlZm9yZSB0aGUgSHR0cEV4dGVuc2lvblByb2MoKSByZXR1cm5zIAogICAgIEhTRV9TVEFUVVNfUEVORElORy4gIFRoaXMgb25seSBhZmZlY3RlZCBpc2FwaSAuZGxsJ3MgY29uZmlndXJlZCAKICAgICB3aXRoIHRoZSBJU0FQSUZha2VBc3luYyBvbiBkaXJlY3RpdmUuICBQUiAxMTkxOAogICAgIFtKb2huIERlU2V0dG8gPGpkZXNldHRvIHJhZGlhbnRzeXN0ZW1zLmNvbT4sIFdpbGxpYW0gUm93ZV0KCiAgKikgbW9kX2lzYXBpOiBGaXggdGhlIGlzc3VlIHdoZXJlIGFsbCByZXN1bHRzIGZyb20gbW9kX2lzYXBpIHdvdWxkCiAgICAgcnVuIHRocm91Z2ggdGhlIGNvcmUgZGllIGhhbmRsZXIgcmVzdWx0aW5nIGluIGludmFsaWQgcmVzcG9uc2VzCiAgICAgb3IgYWNjZXNzIGxvZyBlbnRyaWVzLiAgUFIgMTAyMTYgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW1wcm92ZXMgdGhlIHVzZXIgZnJpZW5kbGluZXNzIG9mIHRoZSBDYWNoZVJvb3QgcHJvY2Vzc2luZwogICAgIG92ZXIgbXkgbGFzdCBwYXNzLiBUaGlzIHZlcnNpb24gYXZvaWRzIHRoZSBwb29sIGFsbG9jYXRpb25zCiAgICAgYnV0IGRvZXNuJ3QgYXZvaWQgYWxsIG9mIHRoZSBydW50aW1lIGNoZWNrcy4gSXQgbm8gbG9uZ2VyCiAgICAgdGVybWluYXRlcyBkdXJpbmcgcG9zdC1jb25maWcgcHJvY2Vzc2luZy4gQW4gZXJyb3IgaXMgbG9nZ2VkCiAgICAgb25jZSBwZXIgd29ya2VyLCBpbmRpY2F0aW5nIHRoYXQgdGhlIENhY2hlUm9vdCBuZWVkcyB0byBiZSBzZXQuCiAgICAgW1BhdWwgSi4gUmVkZXJdCgogICopIEZpeCBhIGJ1ZyB3aGVyZSB3ZSBrZWVwIGZpbGVzIG9wZW4gdW50aWwgdGhlIGVuZCBvZiBhIAogICAgIGtlZXBhbGl2ZSBjb25uZWN0aW9uLCB3aGljaCBjYW4gcmVzdWx0IGluOgogICAgICgyNClUb28gbWFueSBvcGVuIGZpbGVzOiBmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzcwogICAgIGVzcGVjaWFsbHkgb24gdGhyZWFkZWQgc2VydmVycy4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIGluIHdoaWNoIG1vZF9wcm94eSBzZW50IGFuIGludmFsaWQgQ29udGVudC1MZW5ndGgKICAgICB3aGVuIGEgcHJveGllZCBVUkwgd2FzIGludm9rZWQgYXMgYSBzZXJ2ZXItc2lkZSBpbmNsdWRlIHdpdGhpbgogICAgIGEgcGFnZSBnZW5lcmF0ZWQgaW4gcmVzcG9uc2UgdG8gYSBmb3JtIFBPU1QuICBbQnJpYW4gUGFuZV0KCiAgKikgQWRkZWQgY29kZSB0byBwcm9jZXNzIG1pbiBhbmQgbWF4IGZpbGUgc2l6ZSBkaXJlY3RpdmVzIGFuZCB0bwogICAgIGluaXQgdGhlIGV4cGlyeWNoayBmbGFnIGluIG1vZF9kaXNrX2NhY2hlLiBBZGRlZCBhIGNsYXJpZnlpbmcKICAgICBjb21tZW50IHRvIGNhY2hlX3V0aWwuICAgW1BhdWwgSi4gUmVkZXJdCgogICopIFRoZSB2YWx1ZSBlbWl0dGVkIGJ5IFNlcnZlclNpZ25hdHVyZSBub3cgbWltaWNzIHRoZSBTZXJ2ZXIgSFRUUAogICAgIGhlYWRlciBhcyBjb250cm9sbGVkIGJ5IFNlcnZlclRva2Vucy4gIFtGcmFuY2lzIERhbHkgPGRldmEgZGFvaW5lLm9yZz5dCgogICopIEdyYWNlZnVsbHkgaGFuZGx5IHJldHJ5IHNpdHVhdGlvbnMgaW4gdGhlIFNTTCBpbnB1dCBmaWx0ZXIsCiAgICAgYnkgZm9sbG93aW5nIHRoZSBTU0wgbGlicmFyaWVzJyByZXRyeSBzZW1hbnRpY3MuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVGVybWluYXRlIENHSSBzY3JpcHRzIHdoZW4gdGhlIGNsaWVudCBjb25uZWN0aW9uIGRyb3BzLiAgVGhpcwogICAgIGZpeCBvbmx5IGFwcGxpZXMgdG8gc29tZSBub3JtYWwgcGF0aHMgaW4gbW9kX2NnaS4gIG1vZF9jZ2lkCiAgICAgaXMgc3RpbGwgYnVzdGVkLiAgUFIgODM4OCAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIHdoZXJlIDQxNiAiUmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB3YXMgYmVpbmcKICAgICByZXR1cm5lZCBmb3IgY29udGVudCB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVkaXJlY3RlZC4KICAgICBbR3JlZyBBbWVzXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gbW9kX3NzbCBmcm9tIGludGVybmFsIFNTTCBsaWJyYXJ5IGFsbG9jYXRpb25zCiAgICAgd2l0aGluIFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZSBhbmQgWDUwOV9nZXRfcHVia2V5LgogICAgIFtadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPgogICAgICBNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XS4KCiAgKikgbW9kX3NzbCB1c2VzIGZyZWUoKSBpbmFwcHJvcHJpYXRlbHkgaW4gc2V2ZXJhbCBwbGFjZXMsIHRvIGZyZWUKICAgICBtZW1vcnkgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseSBhbGxvY2F0ZWQgaW5zaWRlIE9wZW5TU0wuCiAgICAgU3VjaCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIHdpdGggT1BFTlNTTF9mcmVlKCksIG5vdCB3aXRoIGZyZWUoKS4KICAgICBbTmFkYXYgSGFyJ0VsIDxueWggbWF0aC50ZWNobmlvbi5hYy5pbD4sCiAgICAgIE1hZGh1c3VkYW4gTWF0aGloYWxsaSA8bWFkaHVzdWRhbl9tYXRoaWhhbGxpIGhwLmNvbT5dLgoKICAqKSBFbWl0IGEgbWVzc2FnZSB0byB0aGUgZXJyb3IgbG9nIHdoZW4gd2UgcmV0dXJuIDQwNCBiZWNhdXNlCiAgICAgdGhlIFVSSSBjb250YWluZWQgJyUyZicuICAoVGhpcyB3YXMgcHJldmlvdXNseSBuYXN0aWx5IHNpbGVudAogICAgIGFuZCBkaWZmaWN1bHQgdG8gZGVidWcuKSAgW0tlbiBDb2FyXQoKICAqKSBGaXggc3RyZWFtaW5nIG91dHB1dCBmcm9tIGFuIG5waC0gQ0dJIHNjcmlwdC4gIENHSTpJUkMgbm93CiAgICAgd29ya3MuICBQUiA4NDgyICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3JlIGFjY3VyYXRlIGxvZ2dpbmcgb2YgYnl0ZXMgc2VudCBpbiBtb2RfbG9naW8gd2hlbgogICAgIHRoZSBjbGllbnQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHJlc3BvbnNlCiAgICAgaXMgY29tcGxldGVseSBzZW50ICBbQm9qYW4gU21vanZlciA8Ym9qYW4gcmV4dXJzaXZlLmNvbT5dCgogICopIEZpeCBzb21lIHByb2JsZW1zIGluIHRoZSBwZXJjaGlsZCBNUE0uICAKICAgICBbSm9uYXMgRXJpa3Nzb24gPGpvbmFzIHdlYmtvbnN1bHRlcm5hLmNvbT5dCgogICopIENoYW5nZSB0aGUgQ2FjaGVSb290IHByb2Nlc3NpbmcgdG8gY2hlY2sgZm9yIGEgcmVxdWlyZWQKICAgICB2YWx1ZSBhdCBjb25maWcgdGltZS4gVGhpcyBzYXZlcyBhIGxvdCBvZiB3YXN0ZWQgcHJvY2Vzc2luZwogICAgIGlmIHRoZSBtb2RfZGlza19jYWNoZSBtb2R1bGUgaXMgbG9hZGVkIGJ1dCBubyBDYWNoZVJvb3QKICAgICB3YXMgcHJvdmlkZWQuIFRoaXMgZml4IGFsc28gYWRkcyBjb2RlIHRvIGxvZyBhbiBlcnJvcgogICAgIGFuZCBhdm9pZCB1c2VsZXNzIHBhbGxvY3MgYW5kIHByb2Nlc2luZyB3aGVuIHRoZSBjb21wdXRlZAogICAgIGNhY2hlIGZpbGUgbmFtZSBjYW5ub3QgYmUgb3BlbmVkLiBUaGlzIGFsc28gdXBkYXRlcyB0aGUKICAgICBkb2NzIGFjY29yZGluZ2x5LiAgW1BhdWwgSi4gUmVkZXJdCgogICopIEludHJvZHVjZSB0aGUgRW5hYmxlU2VuZGZpbGUgZGlyZWN0aXZlLCBhbGxvd2luZyB1c2VycyBvZiBORlMgCiAgICAgc2hhcmVzIHRvIGRpc2FibGUgc2VuZGZpbGUgbWVjaGFuaWNzIHdoZW4gdGhleSBlaXRoZXIgZmFpbAogICAgIG91dHJpZ2h0IG9yIHByb3ZpZGUgaW50ZXJtaXRhbnRseSBjb3JydXB0ZWQgZGF0YS4gIFBSIAogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIFJlc29sdmUgdGhlIGVycm9yICJBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBzb21ldGhpbmcgCiAgICAgdGhhdCBpcyBub3QgYSBzb2NrZXQuICA6IHdpbm50X2FjY2VwdDogQWNjZXB0RXggZmFpbGVkLiAKICAgICBBdHRlbXB0aW5nIHRvIHJlY292ZXIuIiBmb3IgdXNlcnMgb2YgdmFyaW91cyBmaXJld2FsbCBhbmQKICAgICBhbnRpLXZpcnVzIHNvZnR3YXJlIG9uIFdpbmRvd3MuICBQUiA4MzI1ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgdGhlIFByb3h5QmFkSGVhZGVyIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIGFkbWluIHNvbWUKICAgICBjb250cm9sIG9uIGhvdyBtb2RfcHJveHkgc2hvdWxkIGhhbmRsZSBib2d1cyBIVFRQIGhlYWRlcnMgZnJvbQogICAgIHByb3hpZWQgc2VydmVycy4gVGhpcyBhbGxvd3MgMi4wIHRvICJlbXVsYXRlIiAxLjMncyBiZWhhdmlvciBpZgogICAgIGRlc2lyZWQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBDaGFuZ2UgdGhlIExEQVAgbW9kdWxlcyB0byBleHBvcnQgdGhlaXIgc3ltYm9scyBjb3JyZWN0bHkKICAgICBkdXJpbmcgYSBXaW5kb3dzIGJ1aWxkLiBBZGQgZHNwIGZpbGVzIGZvciBXaW5kb3dzLiBVcGRhdGUKICAgICBSRUFETUUubGRhcCBmaWxlIGZvciBXaW5kb3dzIGJ1aWxkIGluc3RydWN0aW9ucy4KICAgICBbQW5kcmUgU2NoaWxkIDxBLlNjaGlsZCBhYXJib2FyZC5jaD5dCgogICopIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgdGhlIGNvZGUgdGhhdCBnZW5lcmF0ZXMgSFRUUAogICAgIHJlc3BvbnNlIGhlYWRlcnMgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgLVMgYXMgYSBzeW5vbnltIGZvciAtdCAtRERVTVBfVkhPU1RTLgogICAgIFtUaG9tIE1heSA8dGhvbSBwbGFuZXRhcnl0cmFtcC5uZXQ+XQoKICAqKSBGaXggYSBidWcgd2l0aCBkYm0gcmV3cml0ZSBtYXBzIHdoaWNoIGNhdXNlZCB0aGUgd3JvbmcgdmFsdWUgdG8KICAgICBiZSB1c2VkIHdoZW4gdGhlIGtleSB3YXMgbm90IGZvdW5kIGluIHRoZSBkYm0uICBQUiAxMzIwNAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHByb2JsZW0gd2l0aCBzdHJlYW1pbmcgc2NyaXB0IG91dHB1dCBhbmQgbW9kX2NnaWQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkIGFwX3JlZ2lzdGVyX3Byb3ZpZGVyL2FwX2xvb2t1cF9wcm92aWRlciBBUEkuCiAgICAgW0pvaG4gSy4gU3RlcmxpbmcgPGpvaG4gc3RlcmxzLmNvbT4sIEp1c3RpbiBFcmVua3JhbnR6XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDMKCiAgKikgU0VDVVJJVFk6IENWRS0yMDAyLTA4NDAgKGN2ZS5taXRyZS5vcmcpCiAgICAgSFRNTC1lc2NhcGUgdGhlIGFkZHJlc3MgcHJvZHVjZWQgYnkgYXBfc2VydmVyX3NpZ25hdHVyZSgpIGFnYWluc3QKICAgICB0aGlzIGNyb3NzLXNpdGUgc2NyaXB0aW5nIHZ1bG5lcmFiaWxpdHkgZXhwb3NlZCBieSB0aGUgZGlyZWN0aXZlCiAgICAgJ1VzZUNhbm9uaWNhbE5hbWUgT2ZmJy4gIEFsc28gSFRNTC1lc2NhcGUgdGhlIFNFUlZFUl9OQU1FCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIENHSSBhbmQgU1NJIHJlcXVlc3RzLiAgSXQncyBzYWZlIHRvCiAgICAgZXNjYXBlIGFzIG9ubHkgdGhlICc8JywgJz4nLCBhbmQgJyYnIGNoYXJhY3RlcnMgYXJlIGFmZmVjdGVkLAogICAgIHdoaWNoIHdvbid0IGFwcGVhciBpbiBhIHZhbGlkIGhvc3RuYW1lLiAgUmVwb3J0ZWQgYnkgTWF0dGhldwogICAgIE11cnBoeSA8bWF0dG11cnBoeSBrYy5yci5jb20+LiAgW0JyaWFuIFBhbmVdCgogICopIEZpeCBhIGNvcmUgZHVtcCBpbiBtb2RfY2FjaGUgd2hlbiBpdCBhdHRlbXRwZWQgdG8gc3RvcmUgdW5jb3B5YWJsZQogICAgIGJ1Y2tldHMuIFRoaXMgaGFwcGVuZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIGZpbGUgdG8gYmUgY2FjaGVkCiAgICAgY29udGFpbmVkIFNTSSB0YWdzIHRvIGV4ZWN1dGUgYSBDR0kgc2NyaXB0IChwYXNzZWQgYXMgYSBwaXBlCiAgICAgYnVja2V0KS4gW1BhdWwgSi4gUmVkZXJdCgogICopIEVuc3VyZSB0aGF0IG91dHB1dCBhbHJlYWR5IGF2YWlsYWJsZSBpcyBmbHVzaGVkIHRvIHRoZSBuZXR3b3JrCiAgICAgd2hlbiB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIHJlYWxpemVzIHRoYXQgbm8gbmV3IG91dHB1dCB3aWxsCiAgICAgYmUgYXZhaWxhYmxlIGZvciBhIHdoaWxlLiAgVGhpcyBoZWxwcyBzb21lIHN0cmVhbWluZyBDR0lzIGFzCiAgICAgd2VsbCBhcyBzb21lIG90aGVyIGR5bmFtaWNhbGx5LWdlbmVyYXRlZCBjb250ZW50LiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgbXV0ZXggcHJvYmxlbSBpbiBtb2Rfc3NsIHNlc3Npb24gY2FjaGUgc3VwcG9ydCB3aGljaAogICAgIGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIFBSIDEyNzA1ICAKICAgICBbQW11bmQgRWxzdGFkIDxhbXVuZC5lbHN0YWQgZXJnby5ubz4sIEplZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAyLTExNTYgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IHRoZSBleHBvc3VyZSBvZiBDR0kgc291cmNlIHdoZW4gYSBQT1NUIHJlcXVlc3QgaXMgc2VudCB0byAKICAgICBhIGxvY2F0aW9uIHdoZXJlIGJvdGggREFWIGFuZCBDR0kgYXJlIGVuYWJsZWQuIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyB0aGUgVXNlckRpciBkaXJlY3RpdmUgdG8gYWNjZXB0IGEgbGlzdCBvZiBkaXJlY3Rvcmllcy4KICAgICBUaGlzIG1hdGNoZXMgd2hhdCBBcGFjaGUgMS4zIGRvZXMuICBBbHNvIGFkZCBkb2N1bWVudGF0aW9uIGZvcgogICAgIHRoaXMgZmVhdHVyZS4gW0pheSBCYWxsIDxqYXkgdmVnZ2llc3BhbS5jb20+XQoKICAqKSBOZXcgTW9kdWxlOiBtb2RfbG9naW8uIGFkZHMgdGhlIGFiaWxpdHkgdG8gbG9nIGJ5dGVzIHNlbnQgYW5kCiAgICAgcmVjZWl2ZWQuIFtCb2phbiBTbW9qdmVyIDxib2phbiByZXh1cnNpdmUuY29tPl0KCiAgKikgU3VFeGVjIG5lZWRzIHRvIHVzZSB0aGUgc2FtZSBkZWZhdWx0IGRpcmVjdG9yeSBhcyB0aGUgcmVzdCBvZgogICAgIHNlcnZlciwgbmFtZWx5IC91c3IvbG9jYWwvYXBhY2hlMi4gIAogICAgIFtTYW5nQmVvbSBoYW4gPHNiaGFuIG9zLmtvcmVhLmFjLmtyPl0KCiAgKikgR2V0IG1vZF9hdXRoX2xkYXAgdG8gcmV0cnkgY29ubmVjdGlvbnMgb24gTERBUF9TRVJWRVJfRE9XTi4KICAgICBbVGhvbWFzIEJlbm5ldHQgPHRob21hcy5iZW5uZXR0IGVkcy5jb20+LCBHcmFoYW0gTGVnZ2V0dF0KCiAgKikgTWFrZSBzdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgaXMKICAgICBwYXNzZWQgb24gYSA0eHggZXJyb3IgYnkgcHJveHkuIFByZXZpb3VzbHkgYWxsIGhlYWRlcnMKICAgICB3ZXJlIGRyb3BwZWQsIHJlc3VsdGluZyBpbiB0aGUgYnJvd3NlciBiZWluZyB1bmFibGUgdG8KICAgICBhdXRoZW50aWNhdGUuIFtEciBSaWNoYXJkIFJlaW5lciA8cnJlaW5lciBmc2NpbnRlcm5ldC5jb20+LAogICAgIFJpY2hhcmQgRGFuaWVsbGkgPHJkYW5pZWxsaSBmc2NpbnRlcm5ldC5jb20+LCBHcmFoYW0gV2lzZW1hbgogICAgIDxnd2lzZW1hbiBmc2NpbnRlcm5ldC5jb20+LCBEYXZpZCBIZW5kZXJzb24KICAgICA8ZGhlbmRlcnNvbiBmc2NpbnRlcm5ldC5jb20+XQoKICAqKSBNYWtlIG1vZF9jYWNoZSdzIENhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIGRpcmVjdGl2ZSB3b3JrCiAgICAgcHJvcGVybHkgZm9yIHZpcnR1YWwgaG9zdHMgdGhhdCBvdmVycmlkZSBzZXJ2ZXItd2lkZSBtb2RfY2FjaGUKICAgICBzZXR0dGluZ3MuICBbTWF0dGhpZXUgRXN0cmFkZSA8ZXN0cmFkZS1tIGlmcmFuY2UuY29tPl0KCiAgKikgQWRkIC1wIG9wdGlvbiB0byBhcHhzIHRvIGFsbG93IHByb2dyYW1zIHRvIGJlIGNvbXBpbGVkIHdpdGggYXB4cy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40MgoKICAqKSBtb2RfZGF2OiBDaGVjayBmb3IgdmVyc2lvbmluZyBob29rcyBiZWZvcmUgdXNpbmcgdGhlbS4KICAgICBbR3JlZyBTdGVpbl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQxCgogICopIFRoZSBwcm90b2NvbCB2ZXJzaW9uIChlZzogSFRUUC8xLjEpIGluIHRoZSByZXF1ZXN0IGxpbmUgcGFyc2luZwogICAgIGlzIG5vdyBjYXNlIGluc2Vuc2l0aXZlLiBbSmltIEphZ2llbHNraV0KCiAgKikgQWxsb3cgQWRkT3V0cHV0RmlsdGVyQnlUeXBlIHRvIGFkZCBtdWx0aXBsZSBmaWx0ZXJzIHBlciBkaXJlY3RpdmUuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZW1vdmUgd2FybmluZ3Mgd2l0aCBTdW4ncyBGb3J0ZSBjb21waWxlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4ZWQgbW9kX2Rpc2tfY2FjaGUncyBnZW5lcmF0aW9uIG9mIDMwNHMKICAgICBbS3JpcyBWZXJiZWVjayA8S3Jpcy5WZXJiZWVjayB1Yml6ZW4uY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHVzaW5nIGZubWF0Y2ggcGF0dGVybnMgaW4gdGhlIGZpbmFsIHBhdGgKICAgICBzZWdtZW50IG9mIGFuIEluY2x1ZGUgc3RhdGVtZW50IChlZy4uIGluY2x1ZGUgL2Zvby9iYXIvKi5jb25mKS4KICAgICBhbmQgcmVtb3ZlIHRoZSBub2lzZSBvbiBzdGRlcnIgZHVyaW5nIGNvbmZpZyBkaXIgcHJvY2Vzc2luZy4KICAgICBbSm9lIE9ydG9uIDxqb3J0b24gcmVkaGF0LmNvbT5dCgogICopIG1vZF9jYWNoZTogY2FjaGVfc3RvcmFnZS5jLiBBZGQgdGhlIGhvc3RuYW1lIGFuZCBhbnkgcmVxdWVzdAogICAgIGFyZ3MgdG8gdGhlIGtleSBnZW5lcmF0ZWQgZm9yIGNhY2hpbmcuIFRoaXMgcHJvdmlkZXMgYSB1bmlxdWUKICAgICBrZXkgZm9yIGVhY2ggdmlydHVhbCBob3N0IGFuZCBmb3IgZWFjaCByZXF1ZXN0IHdpdGggdW5pcXVlCiAgICAgYXJncy4gW1BhdWwgSi4gUmVkZXIsIGFyZ3MgY29kZSBwcm92aWRlZCBieSBLcmlzIFZlcmJlZWNrXQoKICAqKSBtb2RfY2FjaGU6IERvIG5vdCBjYWNoZSByZXNwb25zZXMgdG8gR0VUIHJlcXVlc3RzIHdpdGggcXVlcnkKICAgICBVUkxzIGlmIHRoZSBvcmlnaW4gc2VydmVyIGRvZXMgbm90IGV4cGxpY2l0bHkgcHJvdmlkZSBhbgogICAgIEV4cGlyZXMgaGVhZGVyIG9uIHRoZSByZXNwb25zZSAoUkZDIDI2MTYgU2VjdGlvbiAxMy45KQogICAgIFtLcmlzIFZlcmJlZWNrIDxrcmlzdiBiZS51Yml6ZW4uY29tPl0KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIGNvcmVfb3V0cHV0X2ZpbHRlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgVXBkYXRlIE9wZW5TU0wgZGV0ZWN0aW9uIHRvIHdvcmsgb24gRGFyd2luLgogICAgIFtTYW5kZXIgVGVtbWUgPHNjdGVtbWUgY292YWxlbnQubmV0Pl0KCiAgKikgVXBkYXRlIHRoZSB4c2x0IGFuZCBjc3MgdG8gZ2l2ZSB0aGUgZG9jdW1lbnRhdGlvbiBhIG1vcmUKICAgICBtb2Rlcm4gc3R5bGUuCiAgICAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT4sIEdlcm5vdCBXaW5rbGVyIDxncmVoIG8zbWVkaWEuZGU+XQoKICAqKSBGaXggc29tZSBidWNrZXQgbWVtb3J5IGxlYWtzIGluIHRoZSBjaHVua2luZyBjb2RlCiAgICAgW0pvZSBTY2hhZWZlciA8am9lK2FwYWNoZSBzdW5zdGFyc3lzLmNvbT5dCgogICopIEFkZCBNb2RNaW1lVXNlUGF0aEluZm8gZGlyZWN0aXZlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfY2FjaGU6IGFkZGVkIHN1cHBvcnQgZm9yIGNhY2hpbmcgc3RyZWFtZWQgcmVzcG9uc2VzIChwcm94eSwKICAgICBDR0ksIGV0Yykgd2l0aCBvcHRpb25hbCBDYWNoZU1heFN0cmVhbWluZ0J1ZmZlciBzZXR0aW5nIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgaW1hZ2UveC1pY29uIHRvIGh0dHBkLmNvbmYgUFIgMTA5OTMuCiAgICAgW0lhbiBIb2xzbWFuLCBQZXRlciBCaWVyaW5nZXIgPHBiIGJpZXJpbmdlci5kZT5dCgogICopIEZpeCBGaWxlRVRhZ3Mgbm9uZSBvcGVyYXRpb24uICBQUiAxMjIwNy4KICAgICBbSnVzdGluIEVyZW5rcmFudHosIEFuZHJldyBIbyA8YW5kcmV3IHRlbGxtZS5jb20+XQoKICAqKSBSZXN0b3JlZCB0aGUgZXhwZXJpbWVudGFsIGxlYWRlci9mb2xsb3dlcnMgTVBNIHRvIHdvcmtpbmcKICAgICBjb25kaXRpb24gYW5kIGNvbnZlcnRlZCBpdHMgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBmcm9tCiAgICAgbXV0ZXhlcyB0byBhdG9taWMgQ0FTLiAgW0JyaWFuIFBhbmVdCgogICopIEZpeCBMb2dpYyBvbiBub24taHRtbCBmaWxlIHJlbW92YWwgaW4gbW9kX2RlZmxhdGUKICAgICBbS3JpcyBWZXJiZWVjayA8S3Jpcy5WZXJiZWVjayB1Yml6ZW4uY29tPl0KCiAgKikgRml4ICJhYiAtZyIncyB0cnVuY2F0ZWQgeWVhcjogdGhlIGxhc3QgZGlnaXQgd2FzIGN1dCBvZmYuCiAgICAgW0xlb24gQnJvY2FyZCA8YWNtZSBhc3RyYXkuY29tPl0KCiAgKikgbW9kX3Jld3JpdGUgY2FuIG5vdyBzZXRzIGNvb2tpZXMgaW4gZXJyX2hlYWRlcnMsIHVzZXMgdGhlIGNvcnJlY3QKICAgICBleHBpcnkgZGF0ZSwgYW5kIGNhbiBub3cgc2V0IHRoZSBwYXRoIGFzIHdlbGwKICAgICBQUiAxMjEzMiwxMjE4MSwxMjE3Mi4KICAgICBbSWFuIEhvbHNtYW4gLyBSb2IgQ3JvbXdlbGwgPGFwYWNoZWNoYW5nZWxvZyByb2Jjcm9td2VsbC5jb20+XQoKICAqKSBUaGUgY29udGVudC1sZW5ndGggZmlsdGVyIG5vIGxvbmdlciB0cmllcyB0byBidWZmZXIgdXAKICAgICB0aGUgZW50aXJlIG91dHB1dCBvZiBhIGxvbmctcnVubmluZyByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nCiAgICAgYW55dGhpbmcgdG8gdGhlIGNsaWVudC4gIFtCcmlhbiBQYW5lXQoKICAqKSBXaW4zMjogTG93ZXIgdGhlIGRlZmF1bHQgc3RhY2sgc2l6ZSBmcm9tIDFNQiB0byAyNTZLLiBUaGlzIHdpbGwKICAgICBhbGxvdyBhcm91bmQgODAwMCB0aHJlYWRzIHRvIGJlIHN0YXJ0ZWQgcGVyIGNoaWxkIHByb2Nlc3MuIAogICAgICdFRElUQklOIC9TVEFDSzpzaXplIGFwYWNoZS5leGUnIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGlzIAogICAgIHZhbHVlIGRpcmVjdGx5IGluIHRoZSBhcGFjaGUuZXhlIGV4ZWN1dGFibGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFdpbjMyOiBJbXBsZW1lbnQgVGhyZWFkTGltaXQgZGlyZWN0aXZlIGluIHRoZSBXaW5kb3dzIE1QTS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgUmVtb3ZlIENhY2hlT24gY29uZmlnIGRpcmVjdGl2ZSBzaW5jZSBpdCBpcyBzZXQgYnV0IG5ldmVyIGNoZWNrZWQuCiAgICAgTm8gc2Vuc2Ugd2FzdGluZyBjeWNsZXMgb24gdW51c2VkIGNvZGUuIEJlc2lkZXMsIHRoZSBvbmx5IHRydWx5CiAgICAgYnVnIGZyZWUgY29kZSBpcyBkZWxldGVkIGNvZGUuIDopICAgW1BhdWwgSi4gUmVkZXJdCgogICopIEJ1ZmZlckxvZ3MgYXJlIG5vdyBydW4tdGltZSBlbmFibGVkLCBhbmQgdGhlIGxvZ19jb25maWcgbm93IGhhcyAyIG5ldwogICAgIGNhbGxiYWNrcyB0byBhbGxvdyBhIDNyZCBwYXJ0eSBtb2R1bGUgdG8gYWN0dWFsbHkgZG8gdGhlIHdyaXRpbmcgb2YgdGhlCiAgICAgbG9nIGZpbGUgW0lhbiBIb2xzbWFuXQoKICAqKSBDb3JyZWN0IElTQVBJUmVhZEFoZWFkQnVmZmVyIHRvIGRlZmF1bHQgdG8gNDkxNTIsIHBlciBtb2RfaXNhcGkgZG9jcy4KICAgICBbQW5kcukgTWFsbywgQXN0cmlkIEtl32xlciA8a2VzcyBrZXNzLW5ldC5kZT5dCgogICopIEZpeCBTZWdmYXVsdCBpbiBtb2RfY2FjaGUuIFtLcmlzIFZlcmJlZWNrIDxLcmlzLlZlcmJlZWNrIHViaXplbi5jb20+XQoKICAqKSBGaXggYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgaW4gdGhlIG1lcmdlX2Vudl9kaXJfY29uZmlncwogICAgIGZ1bmN0aW9uIG9mIHRoZSBtb2RfZW52IG1vZHVsZS4gUFIgMTE3OTEKICAgICBbUGF1bCBKLiBSZWRlcl0KCiAgKikgTmV3IG9wdGlvbiB0byBTZXJ2ZXJUb2tlbnMgJ21haltvcl0nLiBPbmx5IHNob3cgdGhlIG1ham9yIHZlcnNpb24KICAgICBBbHNvIFN1cmZhY2VkIHRoaXMgZGlyZWN0aXZlIGluIHRoZSBzdGFuZGFyZCBjb25maWcgKGRlZmF1bHQgRlVMTCkKICAgICBbSWFuIEhvbHNtYW5dCgogICopIENoYW5nZSBtb2RfcmV3cml0ZSB0byB1c2UgYXByLXV0aWwncyBkYm0gc3VwcG9ydCBmb3IgZGJtIHJld3JpdGUKICAgICBtYXBzLiAgVGhlIGRibSB0eXBlIChlLmcuLCBuZGJtLCBnZGJtKSBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZQogICAgIFJld3JpdGVNYXAgZGlyZWN0aXZlLiAgUFIgMTA2NDQgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeGVkIG1vZF9yZXdyaXRlJ3MgUmV3cml0ZU1hcCBwcmc6IHN1cHBvcnQgc28gdGhhdCByZXF1ZXN0L3Jlc3BvbnNlCiAgICAgcGFpcnMgd2lsbCBubyBsb25nZXIgZ2V0IG91dCBvZiBzeW5jIHdpdGggZWFjaCBvdGhlci4gIFBSIDk1MzQKICAgICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRml4ZXMgcmVxdWlyZWQgdG8gZ2V0IHF1b3RlZCBhbmQgZXNjYXBlZCBjb21tYW5kIGFyZ3Mgd29ya2luZyBpbgogICAgIG1vZF9leHRfZmlsdGVyLiBQUiAxMTc5MyBbUGF1bCBKLiBSZWRlcl0KCiAgKikgbW9kLXByb3h5OiBoYW5kbGUgcHJveGllZCByZXNwb25zZXMgd2l0aCBubyBzdGF0dXMgbGluZXMKICAgICBbSkQgU2lsdmVzdGVyIDxqc2lsdmVzIHV3by5jYT4sIEJyZXR0IEh1dHRsZXkgPGJyZXR0IGh1dHRsZXkubmV0Pl0KCiAgKikgRml4IGJ1ZyB3aGVyZSBlbnZpcm9ubWVudCBvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGNvbnRhaW5pbmcgCiAgICAgbm9uLUFTQ0lJLTcgY2hhcmFjdGVycyB3b3VsZCBjYXVzZSB0aGUgV2luMzIgY2hpbGQgcHJvY2VzcyBjcmVhdGlvbgogICAgIHRvIGZhaWwuICBQUiAxMTg1NCAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQnVnICMxMTIxMy4uIG1ha2UgbW9kdWxlIGxvYWRpbmcgZXJyb3IgbWVzc2FnZXMgbW9yZSBpbmZvcm1hdGl2ZSAKICAgICBbSWFuIERhcndpbiA8SWFuNzc5IGRhcndpbnN5cy5jb20+XQoKICAqKSB0aHJlYWQgc2FmZXR5ICYgcHJveHktZnRwIFtBbGV4ZXkgUGFuY2hlbmtvIDxhbGV4ZXkgbGl3ZXN0LnJ1PiwgSWFuIEhvbHNtYW5dCgogICopIG1vZF9kaXNrX2NhY2hlIHdvcmtzIG11Y2ggYmV0dGVyLiBUaGlzIG1vZHVsZSBzaG91bGQgc3RpbGwKICAgICBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gW0VyaWMgUHJ1ZCdob21tZWF1eF0KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIGtlZXBhbGl2ZSByZXF1ZXN0czogd2hlbiBzZXR0aW5nCiAgICAgYXNpZGUgYSBzbWFsbCBmaWxlIGZvciBwb3RlbnRpYWwgY29uY2F0ZW5hdGlvbiB3aXRoIHRoZSBuZXh0CiAgICAgcmVzcG9uc2Ugb24gdGhlIGNvbm5lY3Rpb24sIHNldCBhc2lkZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHJhdGhlcgogICAgIHRoYW4gY29weWluZyB0aGUgZmlsZSBpbnRvIHRoZSBoZWFwLiAgW0JyaWFuIFBhbmVdCgogICopIE1vZGlmaWVkIHZlcnNpb24gY2hlY2sgb24gb3BlbnNzbCBzbyB0aGF0IGl0IGZpbmRzIHRoZSBleGVjdXRhYmxlCiAgICAgZmlyc3QgYW5kIHRoZW4gcGVyZm9ybXMgYSBjaGVjayBvZiB0aGUgdmVyc2lvbiwgb25seSB3YXJuaW5nIHRoZQogICAgIHVzZXIgaWYgdGhleSBjaG9zZSwgb3Igd2Ugc2VsZWN0ZWQsIGFuIG9sZCB2ZXJzaW9uIG9mIE9wZW5TU0wuCiAgICAgVGhpcyBjaGFuZ2UgYWxzbyBhbGxvd3MgdGhlIGNvZGUgdG8gd29yayBmb3Igbm9uLW9wZW5zc2wgbGlicmFyaWVzCiAgICAgc2VsZWN0ZWQgdmlhIHRoZSAtLXdpdGgtc3NsPWRpciBvcHRpb24sIHdoaWNoIGNhbiBvdmVycmlkZSB0aGUKICAgICBhdXRvbWF0ZWQgbGlicmFyeSBjaGVjayBpbiBhbnkgY2FzZS4gIFtSb3kgRmllbGRpbmddCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40MAoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDItMDY2MSAoY3ZlLm1pdHJlLm9yZykgCiAgICAgQ2xvc2UgYSB2ZXJ5IHNpZ25pZmljYW50IHNlY3VyaXR5IGhvbGUgdGhhdCAKICAgICBhcHBsaWVzIG9ubHkgdG8gdGhlIFdpbjMyLCBPUzIgYW5kIE5ldHdhcmUgcGxhdGZvcm1zLiAgVW5peCB3YXMgbm90IAogICAgIGFmZmVjdGVkLCBDeWd3aW4gbWF5IGJlIGFmZmVjdGVkLiAgQ2VydGFpbiBVUklzIHdpbGwgYnlwYXNzIHNlY3VyaXR5CiAgICAgYW5kIGFsbG93IHVzZXJzIHRvIGludm9rZSBvciBhY2Nlc3MgYW55IGZpbGUgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gCiAgICAgY29uZmlndXJhdGlvbi4gIFdpdGhvdXQgdXBncmFkaW5nLCBhIHNpbmdsZSAuY29uZiBjaGFuZ2Ugd2lsbCBjbG9zZSAKICAgICB0aGUgdnVsbmVyYWJpbGl0eS4gIEFkZCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSBpbiB0aGUgZ2xvYmFsIHNlcnZlcgogICAgIGh0dHBkLmNvbmYgY29udGV4dCBiZWZvcmUgYW55IG90aGVyIEFsaWFzIG9yIFJlZGlyZWN0IGRpcmVjdGl2ZXM7CiAgICAgICAgIFJlZGlyZWN0TWF0Y2ggNDAwICJcXFwuXC4iCiAgICAgUmVwb3J0ZWQgYnkgQXVyaWVtbWEgTHVpZ2kgPGJ1Z3Rlc3Qgc2l0b3ZlcmRlLmNvbT4uCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMi0wNjU0IChjdmUubWl0cmUub3JnKQogICAgIENsb3NlIGEgcGF0aC1yZXZlYWxpbmcgZXhwb3N1cmUgaW4gbXVsdGl2aWV3IHR5cGUKICAgICBtYXAgbmVnb3RpYXRpb24gKHN1Y2ggYXMgdGhlIGRlZmF1bHQgZXJyb3IgZG9jdW1lbnRzKSB3aGVyZSB0aGUKICAgICBtb2R1bGUgd291bGQgcmVwb3J0IHRoZSBmdWxsIHBhdGggb2YgdGhlIHR5cGVtYXBwZWQgLnZhciBmaWxlIHdoZW4KICAgICBtdWx0aXBsZSBkb2N1bWVudHMgb3Igbm8gZG9jdW1lbnRzIGNvdWxkIGJlIHNlcnZlZCBiYXNlZCBvbiB0aGUgbWltZQogICAgIG5lZ290aWF0aW9uLiAgUmVwb3J0ZWQgYnkgQXVyaWVtbWEgTHVpZ2kgPGJ1Z3Rlc3Qgc2l0b3ZlcmRlLmNvbT4uCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAyLTA2NTQgKGN2ZS5taXRyZS5vcmcpCiAgICAgQ2xvc2UgYSBwYXRoLXJldmVhbGluZyBleHBvc3VyZSBpbiBjZ2kvY2dpZCB3aGVuIHdlIAogICAgIGZhaWwgdG8gaW52b2tlIGEgc2NyaXB0LiAgVGhlIG1vZHVsZXMgd291bGQgcmVwb3J0ICJjb3VsZG4ndCBjcmVhdGUgCiAgICAgY2hpbGQgcHJvY2VzcyAvcGF0aC10by1zY3JpcHQvc2NyaXB0LnBsIiByZXZlYWxpbmcgdGhlIGZ1bGwgcGF0aAogICAgIG9mIHRoZSBzY3JpcHQuICBSZXBvcnRlZCBieSBKaW0gUmFjZSA8anJhY2UgcXVhbHlzLmNvbT4uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFNldCBhc2lkZSB0aGUgYXByLWljb252IGFuZCBhcHJfeGxhdGUoKSBmZWF0dXJlcyBmb3IgdGhlIFdpbjMyCiAgICAgYnVpbGQgb2YgMi4wLjQwIHNvIGRldmVsb3BtZW50IGNhbiBiZSBjb21wbGV0ZWQuICBBIHBhdGNoLCBmcm9tCiAgICAgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2h0dHBkL3BhdGNoZXMvYXBwbHlfdG9fMi4wLjQwLz4KICAgICB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdGhvc2UgdGhhdCB3aXNoIHRvIHdvcmsgd2l0aCBhcHItaWNvbnYuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IHByb3h5IHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIGZ0cDogVVJMcyB2aWEgYSBwcm94eQogICAgIGNoYWluLiBbUGV0ZXIgVmFuIEJpZXNlbiA8cGV0ZXIudmFuYmllc2VuIHZsYWZvLmJlPl0KCiAgKikgbW9kLWRlZmxhdGUgbm93IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCAnZ3ppcC1vbmx5LXRleHQvaHRtbCcgaXMKICAgICBzZXQgdG8gMSwgc28gd2UgY2FuIGV4Y2x1ZGUgdGhpbmdzIGZyb20gdGhlIGdlbmVyYWwgY2FzZSB3aXRoCiAgICAgYnJvd3Nlcm1hdGNoLiBbSWFuIEhvbHNtYW4sIEFuZHJlIFNjaGlsZCA8QS5TY2hpbGQgYWFyYm9hcmQuY2g+XQogIAogICopIEFjY2VwdCBtdWx0aXBsZSBsZWFkaW5nIC8ncyBmb3IgcmVxdWVzdHMgd2l0aGluIHRoZSBEb2N1bWVudFJvb3QuCiAgICAgUFIgMTA5NDYgIFtXaWxsaWFtIFJvd2UsIERhdmlkIFNoYW5lIEhvbGRlbiA8ZHBlamVzaCB5YWhvby5jb20+XQoKICAqKSBTb2x2ZWQgdGhlIHJlcG9ydHMgb2YgLnBkZiBieXRlcmFuZ2UgZmFpbHVyZXMgb24gV2luMzIgYWxvbmUuCiAgICAgQVBSJ3Mgc2VuZGZpbGUgZm9yIHRoZSB3aW4zMiBwbGF0Zm9ybSBjb2xsYXBzZXMgaGVhZGVyIGFuZCB0cmFpbGVyCiAgICAgYnVmZmVycyBpbnRvIGEgc2luZ2xlIGJ1ZmZlci4gIEhvd2V2ZXIsIHdlIGRlc3Ryb3llZCB0aGUgcG9pbnRlcnMKICAgICB0byB0aGUgaGVhZGVyIGJ1ZmZlciBpZiBhIHRyYWlsZXIgYnVmZmVyIHdhcyBwcmVzZW50LiAgUFIgMTA3ODEKICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfZXh0X2ZpbHRlcjogQWRkIHRoZSBhYmlsaXR5IHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgZmlsdGVyIHZpYQogICAgIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLiAgQWRkIHRoZSBhYmlsaXR5IHRvIHJlZ2lzdGVyIGEgZmlsdGVyIG9mCiAgICAgdHlwZSBvdGhlciB0aGFuIEFQX0ZUWVBFX1JFU09VUkNFLiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IGhvc3QgbmFtZXMgb24gTGlzdGVuIGRpcmVjdGl2ZXMuCiAgICAgUFIgMTEwMzAuICBbSmVmZiBUcmF3aWNrLCBEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgV2hlbiBkZWNpZGluZyBvbiB0aGUgZGVmYXVsdCBhZGRyZXNzIGZhbWlseSBmb3IgbGlzdGVuaW5nIHNvY2tldHMsIAogICAgIG1ha2Ugc3VyZSB3ZSBjYW4gYWN0dWFsbHkgYmluZCB0byBhbiBBRl9JTkVUNiBzb2NrZXQgYmVmb3JlCiAgICAgZGVjaWRpbmcgdGhhdCB3ZSBzaG91bGQgZGVmYXVsdCB0byBBRl9JTkVUNi4gIFRoaXMgZml4ZXMgYSBzdGFydHVwCiAgICAgcHJvYmxlbSBvbiBjZXJ0YWluIGxldmVscyBvZiBPcGVuVU5JWC4gIFBSIDEwMjM1LiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVwbGFjZSB1c2FnZSBvZiBhdG9sKCkgdG8gcGFyc2Ugc3RyaW5ncyB3aGVuIHdlIG1pZ2h0IHdhbnQgYQogICAgIGxhcmdlci10aGFuLWxvbmcgdmFsdWUgd2l0aCBhcHJfYXRvbGwoKSwgd2hpY2ggcmV0dXJucyBsb25nIGxvbmcuCiAgICAgVGhpcyBhbGxvd3MgSFRUUEQgdG8gZGVhbCB3aXRoIGxhcmdlciBmaWxlcyBjb3JyZWN0bHkuCiAgICAgW1NoYW50b251IFNlbiA8c3NlbiBhcHBsZS5jb20+XQoKICAqKSBtb2RfZXh0X2ZpbHRlcjogSWdub3JlIGFueSBjb250ZW50LXR5cGUgcGFyYW1ldGVycyB3aGVuIGNoZWNraW5nIGlmCiAgICAgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBmaWx0ZXJlZC4gIFByZXZpb3VzbHksICJpbnR5cGU9dGV4dC9odG1sIgogICAgIHdvdWxkbid0IG1hdGNoIHNvbWV0aGluZyBsaWtlICJ0ZXh0L2h0bWw7Y2hhcnNldD04ODU5XzEiLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9leHRfZmlsdGVyOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBleHRlcm5hbCBwcm9ncmFtcy4KICAgICBbQ3JhaWcgU2ViZW5payA8Y3JhaWcgbmV0YXBwLmNvbT5dCgogICopIE1vZGlmaWVkIHRoZSBIVFRQX0lOIGZpbHRlciB0byBpbW1lZGlhdGVseSBhcHBlbmQgdGhlIEVPUyAoZW5kIG9mCiAgICAgc3RyZWFtKSBidWNrZXQgZm9yIEMtTCBQT1NUIGJvZGllcywgc2F2aW5nIGEgcm91bmR0cmlwIGFuZCBhbGxvd2luZwogICAgIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoYXQgbm8gY29udGVudCByZW1haW5zIHdpdGhvdXQgcHJlZmV0Y2hpbmcKICAgICBhZGRpdGlvbmFsIFBPU1QgYm9keS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEdldCBwcm94eSBmdHAgdG8gd29yayBvdmVyIElQdjYuICBbU2hvaWNoaSBTYWthbmUgPHNha2FuZSBrYW1lLm5ldD5dCgogICopIExvb2sgZm9yIE9wZW5TU0wgbGlicmFyaWVzIGluIC91c3IvbGliNjQuICBbUGV0ZXIgUG9lbWwgPHBvZW1sIHN1c2UuZGU+XQoKICAqKSBVcGRhdGUgU3VTRSBsYXlvdXQuICBbUGV0ZXIgUG9lbWwgPHBvZW1sIHN1c2UuZGU+XQoKICAqKSBDaGFuZ2VzIHRvIHRoZSBpbnRlcm5hdGlvbmFsaXplZCBlcnJvciBkb2N1bWVudHM6CiAgICAgQ29tbWVudCB0aGVtIG91dCBpbiB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSB0byBtYWtlIHRoZSBkZWZhdWx0CiAgICAgaW5zdGFsbCBhcyBzaW1wbGUgYXMgcG9zc2libGU7IENvcnJlY3QgdGhlIGVuZ2xpc2ggNTAwIGVycm9yIHRvCiAgICAgYmUgbW9yZSB1bmRlcnN0YW5kYWJsZTsgQWRkIGEgU3dlZGlzaCB0cmFuc2xhdGlvbi4KICAgICBbVGhvbWFzIFNqb2dyZW4gPHRob21hcyBub3J0aGVybnNlY3VyaXR5Lm5ldD4sIAogICAgICBFcmlrIEFiZWxlIDxlcmlrIGNvZGVmYWt0b3IuZGU+LCBSaWNoIEJvd2VuLCBKb3NodWEgU2xpdmVdCiAgICAgCiAgKikgSW5jcmVhc2UgdGhlIGxpbWl0IG9uIGZpbGUgZGVzY3JpcHRvcnMgcGVyIHByb2Nlc3MgaW4gYXBhY2hlY3RsLgogICAgIFtCcmlhbiBQYW5lXQoKICAqKSBGaXggYSBkZXBlbmRlbmN5IGVycm9yIHdoZW4gYnVpbGRpbmcgQXBhY2hlTW9uaXRvciwgc28gdGhhdCBXaW4zMgogICAgIGFuZCBNU1ZDIG5vdyB0cnVzdCB0aGF0IHRoZSBwcm9qZWN0IGlzIGN1cnJlbnQgKHdoZW4gaXQgaXMpLgogICAgIFtKYW1lcyBDb3ggPGltYWplcyBwaHAubmV0Pl0KCiAgKikgbW9kX2V4dF9maWx0ZXI6IGRvbid0IHNlZ2ZhdWx0IGlmIGNvbnRlbnQtdHlwZSBpcyBub3Qgc2V0LiAgUFIgMTA2MTcuCiAgICAgW0FydGh1ciBQLiBTbWl0aCA8YXBzbWl0aCBhcHMub3JnPiwgSmVmZiBUcmF3aWNrXQoKICAqKSBBUFItVXRpbCBSZW5hbWVzIHBlbmRpbmcgaGF2ZSBiZWVuIGNvbXBsZXRlZCBbVGhvbSBNYXldCgogICopIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgdGhlIGNvZGUgdGhhdCByZWFkcyByZXF1ZXN0CiAgICAgaGVhZGVycyAoYXBfcmdldGxpbmVfY29yZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucykgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgYSBuZXcgZGlyZWN0aXZlOiBNYXhNZW1GcmVlLiAgTWF4TWVtRnJlZSBtYWtlcyBpdCBwb3NzaWJsZQogICAgIHRvIGNvbmZpZ3VyZSB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoZSBhbGxvY2F0b3JzIHdpbGwKICAgICBob2xkIG9uIHRvIGZvciByZXVzZS4gIEFueXRoaW5nIG92ZXIgdGhlIE1heE1lbUZyZWUgdGhyZXNob2xkCiAgICAgd2lsbCBiZSBmcmVlKClkLiAgVGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIHdoZW4gdW5jb21tb24gbGFyZ2UKICAgICBwZWFrcyBvY2N1ciBpbiBtZW1vcnkgdXNhZ2UuICBJdCBzaG91bGQgX25vdF8gYmUgdXNlZCB0byBtYXNrCiAgICAgZGVmZWN0aXZlIG1vZHVsZXMnIG1lbW9yeSB1c2UuICBbU2FuZGVyIFN0cmlrZXJdCgogICopIEZpeGVkIHRoZSBDb250ZW50LUxlbmd0aCBmaWx0ZXIgc28gdGhhdCBIVFRQLzEuMCByZXF1ZXN0cyB0byBDR0kKICAgICBzY3JpcHRzIHdvdWxkIG5vdCByZXN1bHQgaW4gYSB0cnVuY2F0ZWQgcmVzcG9uc2UuCiAgICAgW1J5YW4gQmxvb20sIEp1c3RpbiBFcmVua3JhbnR6LCBDbGlmZiBXb29sbGV5XQoKICAqKSBBZGQgYSBmaWx0ZXJfaW5pdCBwYXJhbWV0ZXIgdG8gdGhlIGZpbHRlciByZWdpc3RyYXRpb24gZnVuY3Rpb25zCiAgICAgc28gdGhhdCBhIGZpbHRlciBjYW4gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGhhbmRsZXJzCiAgICAgYXJlIGludm9rZWQuICBUaGlzIHJlc29sdmVzIGEgcHJvYmxlbSB3aGVyZSBtb2RfaW5jbHVkZSByZXF1ZXN0cwogICAgIHdvdWxkIGluY29ycmVjdGx5IHJldHVybiBhIDMwNC4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgbG9uZy1zdGFuZGluZyBidWcgaW4gMi4wLCBDR0kgc2NyaXB0cyB3ZXJlIGJlaW5nIGNhbGxlZAogICAgIHdpdGggcmVsYXRpdmUgcGF0aHMgaW5zdGVhZCBvZiBhYnNvbHV0ZSBwYXRocy4gIEFwYWNoZSAxLjMgdXNlZAogICAgIGFic29sdXRlIHBhdGhzIGZvciBldmVyeXRoaW5nIGV4Y2VwdCBmb3IgU3VFeGVjLCB0aGlzIGJyaW5ncyBiYWNrCiAgICAgdGhhdCBzdGFuZGFyZC4gIFtSeWFuIEJsb29tXQoKICAqKSBGaXggaW5maW5pdGUgbG9vcCBkdWUgdG8gdHdvIEhUVFBfSU4gZmlsdGVycyBiZWluZyBwcmVzZW50IGZvcgogICAgIGludGVybmFsbHkgcmVkaXJlY3RlZCByZXF1ZXN0cy4gIFBSIDEwMTQ2LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTd2l0Y2ggY29ubl9yZWMtPmtlZXBhbGl2ZSB0byBhbiBlbnVtZXJhdGlvbiByYXRoZXIgdGhhbiBhIGJpdGZpZWxkLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IG1vZF9leHRfZmlsdGVyIHRvIGxvb2sgaW4gdGhlIG1haW4gc2VydmVyIGZvciBmaWx0ZXIgZGVmaW5pdGlvbnMKICAgICB3aGVuIHJ1bm5pbmcgaW4gYSB2aG9zdCBpZiB0aGUgZmlsdGVyIGRlZmluaXRpb24gaXMgbm90IGZvdW5kIGluCiAgICAgdGhlIHZob3N0LiAgUFIgMTAxNDcgIFtKZWZmIFRyYXdpY2tdCgogICopIFN1cHBvcnQgV2luTlQgQ0dJIGludm9jYXRpb24gdGhyb3VnaCBTY3JpcHRJbnRlcnByZXRlclNvdXJjZSAKICAgICAncmVnaXN0cnknIGZvciBzY3JpcHQgaW50ZXJwcmV0ZXIgcGF0aHMgYW5kIG5hbWVzIHdpdGggbm9uLWFzY2lpCiAgICAgY2hhcmFjdGVycyBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlcGF0aC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFN1cHBvcnQgdGhlIC13IGZsYWcgb24gdG8ga2VlcCB0aGUgV2luMzIgY29uc29sZSBvcGVuIG9uIGVycm9yLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE5vcm1hbGl6ZSB0aGUgaG9zdG5hbWUgdmFsdWUgaW4gdGhlIHJlcXVlc3RfcmVjIHRvIGFsbC1sb3dlcmNhc2UKICAgICBbUGVycnkgSGFycmluZ3RvbiA8cGVkd2FyZCB3ZWJjb20uY29tPl0KCiAgKikgRml4IFdpbk5UIGNnaSA1MDAgZXJyb3JzIHdoZW4gUVVFUllfQVJHUyBvciBvdGhlciBzdHJpbmdzIGluY2x1ZGUKICAgICBleHRlbmRlZCBjaGFyYWN0ZXJzIChub24gVVMtQVNDSUkpIGluIG5vbi11dGY4IGZvcm1hdC4gIFRoaXMgYnJpbmdzCiAgICAgV2luMzIgYmFjayBpbnRvIENHSS8xLjEgY29tcGxpYW5jZSwgYW5kIGxlYXZlcyBjaGFyc2V0IGRlY29kaW5nIHVwCiAgICAgdG8gdGhlIGNnaSBhcHBsaWNhdGlvbiBpdHNlbGYuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNYWpvciBvdmVyaGF1bCBvZiBtb2RfZGF2LCBtb2RfZGF2X2ZzIGFuZCB0aGUgZXhwZXJpbWVudGFsL2NhY2hlCiAgICAgbW9kdWxlcyB0byBicmluZyB0aGVtIHVwIHRvIHRoZSBjdXJyZW50IGFwci9hcHItdXRpbCBBUElzLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIG1vc3QgZnJlcXVlbnRseSBvYnNlcnZlZCB3aGVuCiAgICAgc2VydmluZyB0aGUgc2FtZSBmaWxlIHRvIG11bHRpcGxlIGNsaWVudHMgb24gYW4gTVAgbWFjaGluZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgbW9kX3Jld3JpdGUgY2FuIG5vdyBzZXQgY29va2llcyAgKFJld3JpdGVSdWxlICguKikgLSBbQ089bmFtZTokMTouZG9tYWluXSkKICAgICBbQnJpYW4gRGVnZW5oYXJkdCA8Ym1kIG1wMy5jb20+LCBJYW4gSG9sc21hbl0KCiAgKikgRml4IHBlcmNoaWxkIHRvIHdvcmsgd2l0aCBhcGFjaGVjdGwgYnkgYWRkaW5nIC1rIHN1cHBvcnQgdG8gcGVyY2hpbGQuCiAgICAgUFIgMTAwNzQgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHNpbGx5IGh0cGFzc3dkLmMgbG9naWMgZXJyb3IgdGhhdCBpbmNvcnJlY3RseSByZXBvcnRlZCB0aGF0CiAgICAgYm90aCAtYyBhbmQgLW4gaGFkIGJlZW4gdXNlZC4gIFBSIDk5ODkgIFtDbGlmZiBXb29sbGV5XQoKICAqKSBGaXhlZCBhIG1vZF9pbmNsdWRlIGVycm9yIGNhc2UgaW4gd2hpY2ggbm8gSFRUUCByZXNwb25zZSB3YXMgc2VudAogICAgIHRvIHRoZSBjbGllbnQgaWYgYW4gc2h0bWwgZG9jdW1lbnQgY29udGFpbmVkIGFuIHVudGVybWluYXRlZCBTU0kKICAgICBkaXJlY3RpdmUgW0JyaWFuIFBhbmVdCgogICopIEltcHJvdmUgYXBfZ2V0X2NsaWVudF9ibG9jayBpbXBsZW1lbnRhdGlvbiBieSB1c2luZyBBUFItdXRpbCBicmlnYWRlCiAgICAgaGVscGVyIGZ1bmN0aW9ucyBhbmQgcmVseWluZyBvbiBjdXJyZW50IGZpbHRlciBhc3N1bXB0aW9ucy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zOQoKICAqKSBGaXhlZCBhIGJ1aWxkIHByb2JsZW0gaW4gaHRwYXNzd2QuYyBvbiBXaW4zMi4KICAgICBbR3VlbnRlciBLbmF1ZiA8ZWZsYXNoIGdteC5uZXQ+LCBDbGlmZiBXb29sbGV5XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzgKCiAgKikgUmV3cml0ZSBodHBhc3N3ZCB0byB1c2UgQVBSLiAgVGhlIHJlbW92ZXMgdGhlIGFubm95aW5nIHdhcm5pbmcgYWJvdXQKICAgICB0bXBuYW0gYmVpbmcgdW5zYWZlLiAgIFtSeWFuIEJsb29tXQoKICAqKSBXZSBtdXN0IHNldCB0aGUgTUlNRS10eXBlIGZvciAuc2h0bWwgZmlsZXMgdG8gdGV4dC9odG1sIGlmIHdlIHdhbnQgdGhlbQogICAgIHRvIGJlIHBhcnNlZCBmb3IgU1NJIHRhZ3MuICBBZGQgdGhlIGNvbmZpZyBmb3IgdGhhdCB0byB0aGUgZGVmYXVsdCAKICAgICBjb25maWcgZmlsZSBzbyB0aGF0IGl0IGlzIGVhc2llciB0byBlbmFibGUgLnNodG1sIHBhcnNpbmcuCiAgICAgW0RhdmUgRHllciA8ZGR5ZXIgcmVhbC1tZS5uZXQ+XQoKICAqKSBGaXhlZCBhIHByb2JsZW0gd2l0aCAnbWFrZSBpbnN0YWxsJyBvbiBSZWxpYW50VW5peC4KICAgICBbSmVhbi1mcmVkZXJpYyBDbGVyZSA8amZyZWRlcmljLmNsZXJlIGZ1aml0c3Utc2llbWVucy5jb20+XQoKICAqKSBNYWtlIHRoZSBkZWZhdWx0X2hhbmRsZXIgY2F0Y2ggYWxsIHJlcXVlc3RzIHRoYXQgYXJlbid0IHNlcnZlZCBieQogICAgIGFub3RoZXIgaGFuZGxlci4gIFRoaXMgYWxzbyBnZXRzIHVzIHRvIHJldHVybiBhIDQwNCBpZiBhIGRpcmVjdG9yeQogICAgIGlzIHJlcXVlc3RlZCwgdGhlcmUgaXMgbm8gRGlyZWN0b3J5SW5kZXgsIGFuZCBtb2RfYXV0b2luZGV4IGlzbid0CiAgICAgbG9hZGVkLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgbmVzdGVkIGlmLXN0YXRlbWVudHMgaW4gc2h0bWwgZmlsZXMuCiAgICAgUFIgOTg2NiAgW0JyaWFuIFBhbmVdCgogICopIEFsbG93ICdtYWtlIGluc3RhbGwgREVTVERJUj0vcGF0aCcuICBUaGlzIGFsbG93cyBwYWNrYWdlcnMgdG8gaW5zdGFsbAogICAgIGludG8gYSBkaXJlY3RvcnkgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB0aGF0IHdhcyBjb25maWd1cmVkLiAgVGhpcyAKICAgICBhbHNvIG1pcnJvcnMgdGhlIHJvb3Q9IGZlYXR1cmUgZnJvbSAxLjMuICBXZSBjYW5ub3QgdXNlIHByZWZpeD0sCiAgICAgYmVjYXVzZSBib3RoIEFQUiBhbmQgQVBSLXV0aWwgcmVzb2x2ZSB0aGVpciBpbnN0YWxsYXRpb24gcGF0aHMgYXQgCiAgICAgY29uZmlndXJhdGlvbiB0aW1lLiAgVGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZhcmlhYmxlIHByZWZpeCAKICAgICB0byByZXBsYWNlLiAgW0FuZHJlYXMgSGFzZW5hY2sgPGFuZHJlYXMgbmV0YmFuay5jb20uYnI+XQoKICAqKSBBSVggNC4zLjIgYW5kIGFib3ZlOiBEZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBULgogICAgIFRoZXNlIGxldmVscyBvZiBBSVggZG9uJ3QgaGF2ZSBhIHRodW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdpdGgKICAgICBhY2NlcHQoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIHByZWZvcmsgTVBNOiBJZ25vcmUgbXV0ZXggZXJyb3JzIGR1cmluZyBncmFjZWZ1bCByZXN0YXJ0LiAgRm9yCiAgICAgY2VydGFpbiB0eXBlcyBvZiBtdXRleGVzIChwYXJ0aWN1bGFybHkgU3lzViBzZW1hcGhvcmVzKSwgd2UKICAgICBzaG91bGQgZXhwZWN0IHRvIG9jY2FzaW9uYWxseSBmYWlsIHRvIG9idGFpbiBvciByZWxlYXNlIHRoZQogICAgIG11dGV4IGR1cmluZyByZXN0YXJ0IHByb2Nlc3NpbmcuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggaW5zdGFsbC1iaW5kaXN0LnNoIHNvIHRoYXQgaXQgZmluZHMgYW55IHBlcmwgaW5zdGVhZCBvZiBqdXN0CiAgICAgZWFybHkgcGVybCA1LnggdmVyc2lvbnMuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBhIGJ1aWxkL2luc3RhbGwKICAgICBmcm9tIHNvdXJjZSwgYW5kIGl0IGFsbG93cyB0aGUgcGVybCBzY3JpcHRzIGluc3RhbGxlZCBieSBhIGJpbmRpc3QgCiAgICAgdG8gd29yayBvbiBzeXN0ZW1zIHdpdGggcGVybCA1LjYuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYXB4cyBzbyB0aGF0IHRoZSBtYWtlZmlsZSBjcmVhdGVkIGJ5ICJhcHhzIC1nIiB3b3JrcyBvbiBBSVggYW5kCiAgICAgVHJ1NjQgKGFuZCBwcm9iYWJseSBzb21lIG90aGVyIHBsYXRmb3JtcykuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBDR0kgc2NyaXB0cyB0byByZXR1cm4gdGhlaXIgQ29udGVudC1MZW5ndGguICBUaGlzIGFsc28gZml4ZXMgYQogICAgIGhhbmcgb24gSEVBRCByZXF1ZXN0cyBzZWVuIG9uIGNlcnRhaW4gcGxhdGZvcm1zIChzdWNoIGFzIEZyZWVCU0QpLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWRkZWQgbG9nIHJvdGF0aW9uIGJhc2VkIG9uIGZpbGUgc2l6ZSB0byB0aGUgUm90YXRlTG9nIHN1cHBvcnQKICAgICB1dGlsaXR5LiBbQnJhZCBOaWNob2xlc10KCiAgKikgRml4IHNvbWUgY2FzdGluZyBpbiBtb2RfcmV3cml0ZSB3aGljaCBicm9rZSByYW5kb20gbWFwcy4KICAgICBQUiA5NzcwICBbQWxsYW4gRWR3YXJkcywgR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zNwoKICAqKSBhbGxvdyBQT1NUIG1ldGhvZCBvdmVyIFNTTCB3aGVuIHBlci1kaXJlY3RvcnkgY2xpZW50IGNlcnQKICAgICBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIHdpdGggJ1NTTE9wdGlvbnMgK09wdFJlbmVnb3RpYXRlJyBlbmFibGVkCiAgICAgYW5kIGEgY2xpZW50IGNlcnQgd2FzIGZvdW5kIGluIHRoZSBzc2wgc2Vzc2lvbiBjYWNoZS4KCiAgKikgJ1NTTE9wdGlvbnMgK09wdFJlbmdvdGlhdGUnIHdpbGwgdXNlIGNsaWVudCBjZXJ0IGluIGZyb20gdGhlIHNzbAogICAgIHNlc3Npb24gY2FjaGUgd2hlbiB0aGVyZSBpcyBubyBjZXJ0IGNoYWluIGluIHRoZSBjYWNoZS4gIHByaW9yIHRvCiAgICAgdGhlIGZpeCB0aGlzIHNpdHVhdGlvbiB3b3VsZCByZXN1bHQgaW4gYSBGT1JCSURERU4gcmVzcG9uc2UgYW5kCiAgICAgZXJyb3IgbWVzc2FnZSAiQ2Fubm90IGZpbmQgcGVlciBjZXJ0aWZpY2F0ZSBjaGFpbiIKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBhcF9maW5hbGl6ZV9zdWJfcmVxX3Byb3RvY29sKCkgc2hvdWxkbid0IHNlbmQgYW4gRU9TIGJ1Y2tldCBpZgogICAgIG9uZSB3YXMgYWxyZWFkeSBzZW50LiAgUFIgOTY0NCAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IG5hbWUgZm9yIHRoZSBtaW1lIHR5cGVzIGNvbmZpZwogICAgIGZpbGUuICBQUiA5NzI5ICBbTWF0dGhldyBCcmVja25lbGwgPG1icmVja25lbGwgb3JjaGVzdHJlYW0uY29tPl0KCiAgKikgRml4IHRoZSB3b3JraW5nIGRpcmVjdG9yeSAqZm9yIFdpbk5ULzJLL1hQIHNlcnZpY2VzIG9ubHkqIHRvCiAgICAgY2hhbmdlIHRvIHRoZSBBcGFjaGUgZGlyZWN0b3J5IChvbmUgbGV2ZWwgYWJvdmUgdGhlIGxvY2F0aW9uIAogICAgIG9mIEFwYWNoZS5leGUsIGluIHRoZSBjYXNlIHRoYXQgQXBhY2hlLmV4ZSByZXNpZGVzIGluIGJpbi8uKQogICAgIFNvbHZlcyB0aGUgY2FzZSBvZiBTZXJ2ZXJSb290IC9mb28gcGF0aHMgd2hlcmUgL2ZvbyB3YXMgbm90CiAgICAgb24gdGhlIHNhbWUgZHJpdmUgYXMgL3dpbm50L3N5c3RlbTMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSAyLjAncyAiQWNjZXB0TXV0ZXgiIHN0YXJ0dXAgbWVzc2FnZSBub3cgImNvbXBsZXRlbHkiCiAgICAgbWF0Y2ggaG93IDEuMyBkb2VzIGl0LiBbSmltIEphZ2llbHNraV0KCiAgKikgSW1wbGVtZW50IGEgZml4ZWQgc2l6ZSBtZW1vcnkgY2FjaGUgdXNpbmcgYSBwcmlvcml0eSBxdWV1ZQogICAgIFtJYW4gSG9sc21hbl0KCiAgKikgRml4IGFweHMgdG8gYWxsb3cgImFweHMgLXEgaW5zdGFsbGJ1aWxkZGlyIiBhbmQgdG8gYWxsb3cKICAgICBxdWVyeWluZyBjZXJ0YWluIG90aGVyIHZhcmlhYmxlcyBmcm9tIGNvbmZpZ192YXJzLm1rLiAgUFIgOTMxNiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkZWQgdGhlICJkZXRhY2hlZCIgYXR0cmlidXRlIHRvIHRoZSBjZ2lfZXhlY19pbmZvX3QgaW50ZXJuYWxzCiAgICAgc28gdGhhdCBXaW4zMiBhbmQgTmV0d2FyZSB3b24ndCBjcmVhdGUgYSBuZXcgd2luZG93IG9yIGNvbnNvbGUKICAgICBmb3IgZWFjaCBDR0kgaW52b2tlZC4gIFBSIDgzODcKICAgICBbQnJhZCBOaWNob2xlcywgV2lsbGlhbSBSb3dlXQoKICAqKSBDb25zb2xpZGF0ZWQgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIAogICAgIG1hbmlwdWxhdGVkIGJ5IHRoZSBvcHRpb25hbCBmdW5jdGlvbiBhcF9jZ2lfYnVpbGRfY29tbWFuZCgpIGluCiAgICAgbW9kX2NnaSBpbnRvIGEgc2luZ2xlIHN0cnVjdHVyZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgR2V0IHJpZCBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGVycm9ycyB3aXRoICJhcHhzIC1xIiBvbiBjZXJ0YWluCiAgICAgdmFyaWFibGVzLiAgW1N0YXMgQmVrbWFuIDxzdGFzIHN0YXNvbi5vcmc+XQoKICAqKSBGaXggYXB4cyB0byBhbGxvdyBpdCB0byB3b3JrIHdoZW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyBzb21ld2hlcmUKICAgICBiZXNpZGVzIHNlcnZlci1yb290L2J1aWxkLiAgUFIgODQ1MyAgCiAgICAgW0plZmYgVHJhd2ljayBhbmQgYSBob3N0IG9mIG90aGVyc10KCiAgKikgQWxsb3cgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkgdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZQogICAgIHNhbWUgcmVxdWVzdC4gIEVzc2VudGlhbGx5LCBhcF9odHRwX2ZpbHRlciBrZWVwcyB0cmFjayBvZiB3aGV0aGVyCiAgICAgaXQgaGFzIHNlbnQgYW4gRU9TIGJ1Y2tldCB1cCB0aGUgc3RhY2ssIGlmIHNvLCBpdCB3aWxsIG9ubHkgZXZlcgogICAgIHNlbmQgYW4gRU9TIGJ1Y2tldCBmb3IgdGhpcyByZXF1ZXN0LiAgCiAgICAgW1J5YW4gQmxvb20sIEp1c3RpbiBFcmVua3JhbnR6LCBHcmVnIFN0ZWluXQoKICAqKSBSZW1vdmUgYWxsIHNwZWNpYWwgbW9kX3NzbCBVUklzLiAgVGhpcyBhbHNvIGZpeGVzIHRoZSBidWcgd2hlcmUKICAgICByZWRpcmVjdGluZyAoLiopIHdpbGwgYWxsb3cgYW4gU1NMIHByb3RlY3RlZCBwYWdlIHRvIGJlIHZpZXdlZAogICAgIHdpdGhvdXQgU1NMLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCB0aGUgYmluYXJ5IGJ1aWxkIGluc3RhbGwgc2NyaXB0IHNvIHRoYXQgdGhlIGJ1aWxkIGxvZ2ljCiAgICAgY3JlYXRlZCBieSAiYXB4cyAtZyIgd2lsbCB3b3JrIHdoZW4gdGhlIHVzZXIgaGFzIGEgYmluYXJ5CiAgICAgYnVpbGQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBpbnN0ZHNvLnNoIHRvIHdvcmsgd2l0aCBmdWxsIHBhdGhzIHRvIHRoZSBzaGFyZWQgbW9kdWxlLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTmV0V2FyZTogRW5hYmxlZCBDR0kgZnVuY3Rpb25hbGl0eSBhbmQgYWRkZWQgbW9kX2NnaSBhcyBhIGJ1aWx0CiAgICAgaW4gbW9kdWxlIGZvciBOZXRXYXJlICBbQnJhZCBOaWNob2xlc10KCiAgKikgQ2hhbmdlZCBjZ2kgYW5kIHBpcGVkIGxvZyBiZWhhdmlvciB0byBhY2NlcHQgNjU1MzYgY2hhcmFjdGVycwogICAgIG9uIFdpbjMyIChtYXRjaGluZyBMaW51eCkgYmVmb3JlIGRlYWRsb2NraW5nIGJldHdlZW4gb3V0cHV0aW5nCiAgICAgY2xpZW50IHN0ZGluLCBzbHVycGluZyB0aGUgb3V0cHV0IGZyb20gc3Rkb3V0IGFuZCB0aGVuIHRoZSBzdGRlcnIKICAgICBzdHJlYW0uICBQUiA4MTc5ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXhlZCBXaW4zMiB3aW50dHkuZXhlIHN1cHBvcnQgdG8gYXNzdXJlIHRoZSB3aW5kb3cgdGl0bGUgaXMgdmFsaWQuCiAgICAgRWxpbWlhdGVzIHBvc3NpYmxlIGdwZmF1bHQgb3IgZ2FyYmFnZSB0aXRsZSB3aXRob3V0IHRoZSAtdCBvcHRpb24uCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmV3cml0ZSBtb2RfY2dpLCBtb2RfY2dpZCwgYW5kIG1vZF9wcm94eSBpbnB1dCBoYW5kbGluZyB0byB1c2UKICAgICBicmlnYWRlcyBhbmQgaW5wdXQgZmlsdGVycy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWxsb3cgYXBfaHR0cF9maWx0ZXIgKEhUVFBfSU4pIHRvIHJldHVybiBFT1Mgd2hlbiB0aGVyZSBpcyBubyByZXF1ZXN0CiAgICAgYm9keS4gIFtKdXN0aW4gRXJlbmtyYW50el0KICAgIAogICopIE5ldFdhcmU6IFBpcGluZyBsb2cgZW50cmllcyB0aHJvdWdoIFJvdGF0ZUxvZ3MgdXNpbmcgdGhlIAogICAgIEN1c3RvbUxvZ3MgZGlyZWN0aXZlIGlzIGZpbmFsbHkgc3VwcG9ydGVkIG5vdyB0aGF0IHdlIGhhdmUgCiAgICAgdGhlIHBpcGVzIGFuZCBzcGF3bmluZyBmdW5jdGlvbmFsaXR5IHdvcmtpbmcuCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIFNFQ1VSSVRZOiBDVkUtMjAwMi0wMzkyIChjdmUubWl0cmUub3JnKSBbQ0VSVCBWVSM5NDQzMzVdCiAgICAgRGV0ZWN0IG92ZXJmbG93IHdoZW4gcmVhZGluZyB0aGUgaGV4IGJ5dGVzIGZvcm1pbmcgYSBjaHVuayBsaW5lLgogICAgIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBbGxvdyBSZXdyaXRlTWFwIHByZzoncyB0byB0YWtlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBQUiA4NDY0LgogICAgIFtKYW1lcyBUYWl0IDxKVGFpdCB3eXJkZHJlYW1zLmRlbW9uLmNvLnVrPl0KCiAgKikgQ29ycmVjdGx5IHJldHVybiA0MTMgd2hlbiBhbiBpbnZhbGlkIGNodW5rIHNpemUgaXMgZ2l2ZW4gb24KICAgICBpbnB1dC4gIEFsc28gbW9kaWZ5IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5IHRvIG5vdCBkbyBhbnl0aGluZwogICAgIG9uIHN1Yi1yZXF1ZXN0cyBvciB3aGVuIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZC4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCB0aGUgVElNRV8qIFNTTCB2YXIgbG9va3VwcyB0byBiZSB0aHJlYWRzYWZlLiAgUFIgOTQ2OS4KICAgICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRW5zdXJlIHRoYXQgYXByX2JyaWdhZGVfd3JpdGUoKSBmbHVzaGVzIGluIGFsbCBvZiB0aGUgY2FzZXMgdGhhdAogICAgIGl0IHNob3VsZCB0byBhdm9pZCBjb25kaXRpb25zIGluIHNvbWUgbW9kdWxlcyB0aGF0IGNvdWxkIGNhdXNlCiAgICAgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRvIGJlIGJ1ZmZlcmVkLiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBwcm9ibGVtIHdoZXJlIG1vZF9jYWNoZS9tb2RfZGlza19jYWNoZSB3YXMgaW5jb3JyZWN0bHkKICAgICBzdHJpcHBpbmcgdGhlIGNvbnRlbnRfdHlwZSBmcm9tIGNhY2hlZCByZXNwb25zZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIGFwYWNoZWN0bCBwYXNzZXMgdGhyb3VnaCBhbnkgaHR0cGQgb3B0aW9ucy4gIE5vdGU6IGFwYWNoZWN0bAogICAgIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gaHR0cGQgc2luY2UgaXQgZW5zdXJlcyB0aGF0IGFueQogICAgIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlIGJlZW4gc2V0IHVwLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCB0aGUgY29tYmluYXRpb24gb2YgbW9kX2NnaWQsIG1vZF9zZXR1ZXhlYywgYW5kIG1vZF91c2VyZGlyLgogICAgIFBSIDc4MTAgIFtDb2xtIE1hY0NhcnRoYWlnaCA8Y29sbW1hY2MgcmVkYnJpY2suZGN1LmllPl0KCiAgKikgRml4IHN1ZXhlYyBleGVjdXRpb24gb2YgQ0dJIHNjcmlwdHMgZnJvbSBtb2RfaW5jbHVkZS4KICAgICBQUiA3NzkxLCA4MjkxICBbQ29sbSBNYWNDYXJ0aGFpZ2ggPGNvbG1tYWNjIHJlZGJyaWNrLmRjdS5pZT5dCgogICopIEZpeCBzZWdmYXVsdHMgYXQgc3RhcnR1cCBvbiBzb21lIHBsYXRmb3JtcyB3aGVuIG1vZF9hdXRoX2RpZ2VzdCwKICAgICBtb2Rfc3VleGVjLCBvciBtb2Rfc3NsIHdlcmUgdXNlZCBhcyBEU08ncyBkdWUgdG8gdGhlIHdheSB0aGV5CiAgICAgd2VyZSB0cmFja2luZyB0aGUgY3VycmVudCBpbml0IHBoYXNlIHNpbmNlIERTTydzIGdldCBjb21wbGV0ZWx5CiAgICAgdW5sb2FkZWQgYW5kIHJlbG9hZGVkIGJldHdlZW4gcGhhc2VzLiAgUFIgOTQxMy4KICAgICBbVHN1eW9zaGkgU2FzYW1vdG8gPG5hem9uYXpvIHN1cGVyLndpbi5uZS5qcD4sIEJyYWQgTmljaG9sZXNdCgogICopIEZpeCBtb2RfaW5jbHVkZSdzIGhhbmRsaW5nIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4KICAgICAiPCEtLSNpZiIgZGlyZWN0aXZlcyBbSnVsaXVzIEdhd2xhcyA8anVsaXVzX2dhd2xhcyBocC5jb20+XQoKICAqKSBGaXggdGhlIHdvcmtlciBNUE0gZGVhZGxvY2sgcHJvYmxlbSAgW0JyaWFuIFBhbmVdCgogICopIE1vZGlmeSB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24gdG8gYWxsb3cgZm9yIHRyYW5zbGF0aW9ucy4KICAgICBbWW9zaGlraSBIYXlhc2hpLCBKb3NodWEgU2xpdmVdCgogICopIEZpeCBhIGZpbGUgcGVybWlzc2lvbnMgcHJvYmxlbSB3aGljaCBwcmV2ZW50ZWQgbW9kX2Rpc2tfY2FjaGUKICAgICBmcm9tIHdvcmtpbmcgb24gVW5peC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCAiLWsgc3RhcnR8cmVzdGFydHxncmFjZWZ1bHxzdG9wIiBzdXBwb3J0IHRvIGh0dHBkIGZvciB0aGUgVW5peCAKICAgICBNUE1zLiAgVGhlc2UgaGF2ZSBzZW1hbnRpY3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBvbGQgYXBhY2hlY3RsIAogICAgIGNvbW1hbmRzIG9mIHRoZSBzYW1lIG5hbWUuICBbSnVzdGluIEVyZW5rcmFudHosIEplZmYgVHJhd2lja10KCiAgKikgTWFrZSBzdXJlIHRoYXQgdGhlIHJ1bnRpbWUgZGlyIGlzIGNyZWF0ZWQgYnkgbWFrZSBpbnN0YWxsLgogICAgIFBSIDkyMzMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gdW51c3VhbCBzZXQgb2YgLi9jb25maWd1cmUgYXJndW1lbnRzIHRoYXQgY291bGQgY2F1c2UKICAgICBtb2RfaHR0cCB0byBiZSBidWlsdCBhcyBhIERTTywgd2hpY2ggaXQgY3VycmVudGx5IGRvZXNuJ3QKICAgICBzdXBwb3J0LiAgUFIgOTI0NC4KICAgICBbQ2xpZmYgV29vbGxleSwgUm9iaW4gSm9obnNvbiA8cm9iYmF0MiBvcmJpcy10ZXJyYXJ1bS5uZXQ+XQoKICAqKSBXaW4zMjogRml4IGJ1ZyBpbiBhcHJfc2VuZGZpbGUoKSB0aGF0IGNhdXNlZCBpbmNvcnJlY3Qgb3BlcmF0aW9uCiAgICAgb2YgdGhlICVYLCAlYiBhbmQgJUIgbG9nZm9ybWF0IG9wdGlvbnMuIFBSIDgyNTMsIDg5OTYuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIElmIGNvbnRlbnQtZW5jb2RpbmcgaXMgYWxyZWFkeSBwcmVzZW50LCBkbyBub3QgcnVuIGRlZmxhdGUgKFBSIDkyMjIpCiAgICAgW0thenVoaXNhIEFTQURBIDxrYXogYXNhZGEuc3l0ZXMubmV0Pl0KCiAgKikgVGhlIEFQTE9HX05PRVJSTk8gZmxhZyB0byBhcF9sb2dfW3JdZXJyb3IoKSBpcyBub3cgZGVwcmVjYXRlZC4KICAgICBJdCBpcyBjdXJyZW50bHkgaWdub3JlZCBhbmQgaXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UKICAgICBvZiBBcGFjaGUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZW1vdmVkIGRvY3VtZW50YXRpb24gcmVmZXJlbmNlcyB0byB0aGUgbm8tbG9uZ2VyLXN1cHBvcnRlZAogICAgICJtYWtlIGNlcnRpZmljYXRlIiBmZWF0dXJlIG9mIG1vZF9zc2wgZm9yIEFwYWNoZSAxLjMueC4gIFRlc3QKICAgICBjZXJ0aWZpY2F0ZXMsIGlmIHRydWx5IGRlc2lyZWQsIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcgb3BlbnNzbAogICAgIGNvbW1hbmRzLiAgUFIgODcyNC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBSZW1vdmUgU1NMTG9nIGFuZCBTU0xMb2dMZXZlbCBkaXJlY3RpdmVzIGluIGZhdm9yIG9mIGhhdmluZwogICAgIG1vZF9zc2wgdXNlIHRoZSBzdGFuZGFyZCBFcnJvckxvZyBkaXJlY3RpdmVzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBPUy8zOTA6IExJQlBBVEggbm8gbG9uZ2VyIGhhcyB0byBiZSBtYW51YWxseSB1bmNvbW1lbnRlZCBpbgogICAgIGVudnZhcnMgdG8gZ2V0IGFwYWNoZWN0bCB0byBzZXQgdXAgaHR0cGQgcHJvcGVybHkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfaXNhcGk6IEFsbCBtb2RfaXNhcGkgZGlyZWN0aXZlcywgZXhjbHVkaW5nIElTQVBJQ2FjaGVGaWxlLAogICAgIG1heSBub3cgYmUgc3BlY2lmaWVkIHRvIHRoZSA8RmlsZS9EaXJlY3RvcnkgPiBjb250YWluZXIsIHJhdGhlcgogICAgIHRoYW4gYnkgdmhvc3QuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfaXNhcGk6IEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBmYXV4IGFzeW5jIHN1cHBvcnQgZm9yIElTQVBJCiAgICAgbW9kdWxlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIG1vZF9pc2FwaTogTWFqb3IgcmVmYWN0b3Jpbmcgb2YgdGhlIGNvZGUgdG8gcmVseSBvbiBhcHIgaW50ZXJuYWxzCiAgICAgcmF0aGVyIHRoYW4gTVMgQVBJcyAodXNpbmcgb3VyIG93biBtb2RfaXNhcGkuaCBoZWFkZXJzIGZvciBJU0FQSQogICAgIHN5bWJvbCBkZWZpbml0aW9ucy4pICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfaXNhcGk6IEZpeGVkIHRoZSByZXR1cm4gc3RyaW5nIGxlbmd0aCBmcm9tIEdldFNlcnZlclZhcmlhYmxlCiAgICAgY2FsbGJhY2ssIGl0IHdhcyBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsIGluIHRoZSBjb25zdW1lZAogICAgIGJ1ZmZlciBzaXplLiAgVGhpcyB3YXMgcGFydGljdWxhcmx5IGJhZCBmb3IgRGVscGhpIDYuMCB1c2Vycy4KICAgICBQUiA4OTM0ICBbU2ViYXN0aWFuIEhhbnRzY2ggPHNlYmFzdGlhbi5oYW50c2NoIGdteC5kZT5dCgogICopIEZpeGVkIFdpbjMyIGJ1aWxkcyBmb3IgTWljcm9zb2Z0IFZpc3VhbFN0dWRpbyA3LjAgKC5uZXQpLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgYXB4cyBsb29rIGluIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBmb3IgZW52dmFycy4gIEl0IHdhcwogICAgIGJyb2tlbiB3aGVuIHNiaW5kaXIgIT0gYmluZGlyLiAgUFIgODg2OQogICAgIFtBbmRyZWFzIFN1bmRzdHL2bSA8c3Vua2FuIHphcHBhLmN4Pl0KICAKICAqKSBGaXggbW9kX2RlZmxhdGUgY29ycnVwdGlvbiB3aGVuIHVzaW5nIG11bHRpcGxlIGJ1Y2tldHMuICBQUiA5MDE0LgogICAgIFtBc2FkYSBLYXp1aGlzYSA8a2F6IGFzYWRhLnN5dGVzLm5ldD5dCgogICopIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBmb3IgYWNjZXNzIGxvZ2dlciB3aGVuIHVzaW5nCiAgICAgZGVmYXVsdCB0aW1lc3RhbXAgZm9ybWF0dGluZyAgW0JyaWFuIFBhbmVdCgogICopIEFkZGVkIEVuYWJsZU1NQVAgY29uZmlnIGRpcmVjdGl2ZSB0byBlbmFibGUgdGhlIHNlcnZlcgogICAgIGFkbWluaXN0cmF0b3IgdG8gZGlzYWJsZSBtZW1vcnktbWFwcGluZyBvZiBkZWxpdmVyZWQgZmlsZXMKICAgICBvbiBhIHBlci1kaXJlY3RvcnkgYmFzaXMuICBbQnJpYW4gUGFuZV0KCiAgKikgUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIGZvciBtb2Rfc2V0ZW52aWYgIFtCcmlhbiBQYW5lXQoKICAqKSBGaXggYSBtb2Rfc3NsIGJ1aWxkIHByb2JsZW0gb24gT1MvMzkwLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4ZWQgSWYtTW9kaWZpZWQtU2luY2Ugb24gV2luMzIsIHdoaWNoIHdvdWxkIGdpdmUgZmFsc2UgcG9zaXRpdmVzCiAgICAgYmVjYXVzZSBvZiB0aGUgc3ViLXNlY29uZCByZXNvbHV0aW9uIG9mIGZpbGUgdGltZXN0YW1wcyBvbiB0aGF0CiAgICAgcGxhdGZvcm0uICBbQ2xpZmYgV29vbGxleV0KCiAgKikgUmV2ZXJzZSB0aGUgaG9vayBvcmRlcmluZyBmb3IgbW9kX3VzZXJkaXIgYW5kIG1vZF9hbGlhcyBzbwogICAgIHRoYXQgQWxpYXMvU2NyaXB0QWxpYXMgd2lsbCBvdmVycmlkZSBVc2VyZGlyLiAgUFIgODg0MQogICAgIFtKb3NodWEgU2xpdmVdCgogICopIE1vdmUgbW9kX2RlZmxhdGUgb3V0IG9mIGV4cGVyaW1lbnRhbCBhbmQgaW50byBmaWx0ZXJzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgR2V0IHByb3h5IENPTk5FQ1QgYmFzaWNhbGx5IHdvcmtpbmcuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX3Jld3JpdGUgaGFuZyB3aGVuIEFQUiB1c2VzIFN5c1YgU2VtYXBob3JlcyBhbmQKICAgICBSZXdyaXRlTG9nTGV2ZWwgaXMgc2V0IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gMC4gIFBSOiA4MTQzCiAgICAgW0Fhcm9uIEJhbm5lcnQsIENsaWZmIFdvb2xsZXldCgogICopIEZpeCBieXRlcmFuZ2UgcmVxdWVzdHMgZnJvbSByZXR1cm5pbmcgNDE2IHdoZW4gdXNpbmcgZHluYW1pYyBkYXRhCiAgICAgKHN1Y2ggYXMgZmlsdGVycyBsaWtlIG1vZF9pbmNsdWRlKS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWxsb3cgbW9kX3Jld3JpdGUncyBzZXQgb2YgImludDoiIGludGVybmFsIFJld3JpdGVNYXAgZnVuY3Rpb25zCiAgICAgdG8gYmUgZXh0ZW5kZWQgYnkgdGhpcmQtcGFydHkgbW9kdWxlcyB2aWEgYW4gb3B0aW9uYWwgZnVuY3Rpb24uCiAgICAgW1RhaGlyeSBSYW1hbmFtYW1wYW5vaGFyYW5hIDxub21lbnRzb2EgaG90bWFpbC5jb20+LCBDbGlmZiBXb29sbGV5XQoKICAqKSBGaXggbW9kX2luY2x1ZGUgZXhwcmVzc2lvbiBwYXJzZXIncyBoYW5kbGluZyBvZiB1bnF1b3RlZCBzdHJpbmdzCiAgICAgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBjbG9zaW5nIHBhcmVuLiAgUFIgODQ2Mi4gIFtCcmlhbiBQYW5lXQoKICAqKSBSZW1vdmUgYXV0b200dGUuY2FjaGUgaW4gJ21ha2UgZGlzdGNsZWFuJy4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgRml4IGdlbmVyYXRlZCBodHRwZC5jb25mIHRvIHJlc3BlY3QgbGF5b3V0IGZvciBMb2FkTW9kdWxlIGxpbmVzLgogICAgIFBSIDgxNzAuICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgV2luMzI6IER1cmluZyBhIGdyYWNlZnVsIHJlc3RhcnQsIHRocmVhZHMgaW4gdGhlIG5ldyBwcm9jZXNzCiAgICAgd2VyZSBhY2Nlc3Npbmcgc2NvcmVib2FyZCBzbG90cyBzdGlsbCBpbiB1c2UgYnkgYWN0aXZlIHRocmVhZHMgaW4gCiAgICAgdGhlIG9sZCBwcm9jZXNzLiBbQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjM2CgogICopIEZpeCBzb21lIG1pbm9yIGZvcm1hdHRpbmcgaXNzdWVzIHdpdGggYWIuIFBhcnQgb2YgdGhpcyBpcwogICAgIGluIHJlZmVyZW5jZSB0byBQUiA4NTQ0LCB0aGUgcmVzdCBJIG5vdGljZWQgd2hpbGUgdGVzdGluZwogICAgIHRoZSBQUiBmaXguIFtQYXVsIEouIFJlZGVyXQoKICAqKSBGaXggYSBjYXNlIHdoZXJlIGFuIGludmFsaWQgcGFzcyBwaHJhc2UgaXMgZW50ZXJlZCBhbmQgYW4KICAgICBlcnJvciBtZXNzYWdlIGlzIGdpdmVuLCBidXQgdGhlIHByb21wdCBpcyBub3Qgc2hvd24gYWdhaW4uCiAgICAgVGhpcyBsZWZ0IHRoZSB1c2VyIGluIGFuIGFtYmlndW91cyBzdGF0ZS4gUFIgODMyMCBbUGF1bCBKLiBSZWRlcl0KCiAgKikgQ2xvc2Ugc29ja2V0cyBvbiB3b3JrZXIgTVBNIHdoZW4gZG9pbmcgYSBncmFjZWxlc3MgcmVzdGFydC4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgUmV2ZXJ0ZWQgYSBtaW5vciBvcHRpbWl6YXRpb24gaW4gbW9kX3NzbC5jIHRoYXQgdXNlZCB0aGUgdmhvc3QgSUQKICAgICBhcyB0aGUgc2Vzc2lvbiBpZCBjb250ZXh0IHJhdGhlciB0aGF0IGEgTUQ1IGhhc2ggb2YgdGhhdCB2aG9zdCBJRCwKICAgICBiZWNhdXNlIGl0IGNhdXNlZCB2ZXJ5IGxvbmcgdmhvc3QgaWQncyB0byBiZSB1bnVzYWJsZSB3aXRoIG1vZF9zc2wuCiAgICAgUFIgODU3Mi4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBGaXggdGhlIGxpbmsgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBDb3JlZHVtcERpcmVjdG9yeSAKICAgICBkaXJlY3RpdmUgaW4gdGhlIHNlcnZlci13aWRlIGRvY3VtZW50LiAgUFIgODY0My4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeGVkIFNITUNCIHNlc3Npb24gY2FjaGluZy4gIFtBYXJvbiBCYW5uZXJ0LCBDbGlmZiBXb29sbGV5XQoKICAqKSBTeW5jZWQgd2l0aCByZW1haW5pbmcgY2hhbmdlcyBmcm9tIG1vZF9zc2wgMi44LjgtMS4zLjI0OgogICAgIC0gQXZvaWQgU0lHQlVTIG9uIHNwYXJjIG1hY2hpbmVzIHdpdGggU0hNQ0Igc2Vzc2lvbiBjYWNoZXMKICAgICAtIEFsbG93IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgcGlwZSBhbmQgdGhlIG5hbWUgb2YgdGhlCiAgICAgcHJvZ3JhbSBpbiBTU0xMb2cgInwgL3BhdGgvdG8vcHJvZ3JhbSIuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgSW50cm9kdWNlIG1vZF9leHRfZmlsdGVyIGFuZCBtb2RfZGVmbGF0ZSBleHBlcmltZW50YWwgbW9kdWxlcwogICAgIHRvIHRoZSBXaW4zMiBidWlsZCAoemxpYiBzb3VyY2VzIG11c3QgYmUgaW4gc3JjbGliXHpsaWIuKQogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIENoYW5nZXMgdG8gdGhlIHdvcmtlciBNUE0ncyBxdWV1ZSBtYW5hZ2VtZW50IGFuZCB0aHJlYWQKICAgICBzeW5jaHJvbml6YXRpb24gY29kZSB0byByZWR1Y2UgbXV0ZXggY29udGVudGlvbiAgW0JyaWFuIFBhbmVdCgogICopIERvbid0IGluc3RhbGwgKi5pbiBjb25maWd1cmF0aW9uIGZpbGVzIHNpbmNlIHdlIGFscmVhZHkgaW5zdGFsbAogICAgICotc3RkLmNvbmYgZmlsZXMuICBbQWFyb24gQmFubmVydF0KCiAgKikgTWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIHRocmVhZHBvb2wgTVBNLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzdWJyZXFzIHRoYXQgYXJlIHByb21vdGVkIHZpYSBmYXN0X3JlZGlyZWN0IGZyb20gaGF2aW5nIGludmFsaWQKICAgICBmcmVjLT5yIHN0cnVjdHVyZXMuICBUaGlzIHdvdWxkIGNhdXNlIHN1YnRsZSBlcnJvcnMgbGF0ZXIgb24gaW4KICAgICByZXF1ZXN0IHByb2Nlc3Npbmcgc3VjaCBhcyBzZWVuIGluIFBSIDc5NjYuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIE1vcmUgZWZmaWNpZW50IHBvb2wgcmVjeWNsaW5nIGxvZ2ljIGZvciB0aGUgd29ya2VyIE1QTSBbQnJpYW4gUGFuZV0KCiAgKikgTW9kaWZ5IHRoZSB3b3JrZXIgTVBNIHRvIG5vdCBhY2NlcHQoKSBuZXcgY29ubmVjdGlvbnMgdW50aWwKICAgICB0aGVyZSBpcyBhbiBhdmFpbGFibGUgd29ya2VyIHRocmVhZC4gVGhpcyBwcmV2ZW50cyBxdWV1ZWQKICAgICBjb25uZWN0aW9ucyBmcm9tIHN0YXJ2aW5nIGZvciBwcm9jZXNzaW5nIHRpbWUgd2hpbGUgbG9uZy1ydW5uaW5nCiAgICAgY29ubmVjdGlvbnMgd2VyZSBob2dnaW5nIGFsbCB0aGUgYXZhaWxhYmxlIHRocmVhZHMuICBbQWFyb24gQmFubmVydF0KCiAgKikgQ29udmVydCB0aGUgd29ya2VyIE1QTSdzIGZkcXVldWUgZnJvbSBhIExJRk8gYmFjayBpbnRvIGEgRklGTy4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgR2V0IGJhc2ljIEhUVFAgcHJveHkgd29ya2luZyBvbiBFQkNESUMgbWFjaGluZXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2RfdW5pcXVlX2lkIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRoIG5vIElQdjQgYWRkcmVzcwogICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgaG9zdCBuYW1lLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHN1ZXhlYyBiZWhhdmlvciB3aXRoIHVzZXIgZGlyZWN0b3JpZXMuICBQUiA3ODEwLgogICAgIFtDb2xtIDxjb2xtbWFjYyByZWRicmljay5kY3UuaWU+XQoKICAqKSBSZWplY3QgYSBibGFuayBVc2VyRGlyIGRpcmVjdGl2ZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMuICBQUiA4NDcyLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTWFrZSBtb2RfbWltZSB1c2UgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyB3aGVuIGV4YW1pbmluZwogICAgIGV4dGVuc2lvbnMgb24gYWxsIHBsYXRmb3Jtcy4gIFBSIDgyMjMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFkZCBhbiBpbnRlbGxpZ2VudCBlcnJvciBtZXNzYWdlIHNob3VsZCBubyBwcm94eSBzdWJtb2R1bGVzIGJlCiAgICAgdmFsaWQgdG8gaGFuZGxlIGEgcmVxdWVzdC4gUFIgODQwNyBbR3JhaGFtIExlZ2dldHRdCgogICopIE1ham9yIGltcHJvdmVtZW50cyBpbiBjb25jdXJyZW50IHByb2Nlc3NpbmcgZm9yIEFCIGJ5IGVuYWJsaW5nCiAgICAgbm9uLWJsb2NraW5nIGNvbm5lY3QoKXMgYW5kIHByZXZlbnRpbmcgQVBSIGZyb20gZG9pbmcgYmxvY2tpbmcKICAgICByZWFkKClzLiBBbHNvIGltcGxlbWVudCBmYXRhbCBlcnJvciBjaGVja2luZyBmb3IgYXByX3JlY3YoKS4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IFdpbjMyIE5URlMgSnVuY3Rpb25zIChzeW1saW5rcykuICBQUiA4MDE0ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggV2luMzIgJ3Nob3J0IG5hbWUnIGFsaWFzZXMgaW4gaHR0cGQuY29uZiBkaXJlY3RpdmVzLgogICAgIFBSIDgwMDkgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgaHR0cGQuY29uZiB3aGVuIHRoZSBsYXlvdXQgcGF0aHMgYXJlCiAgICAgZGlzam9pbnQuICBQUiA3OTc5LCA4MjI3LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTd2FwIGRvd25ncmFkZS0xLjAgYW5kIGZvcmNlLXJlc3BvbnNlLTEuMCBjb25kaXRpb25hbCBjaGVja3Mgc28KICAgICB0aGF0IGRvd25ncmFkZWQgcmVzcG9uc2VzIGNhbiBoYXZlIGZvcmNlLXJlc3BvbnNlLiAgUFIgODM1Ny4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBwZXJjaGlsZCBNUE0gc28gdGhhdCBpdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBtb3ZlIHRvIHRoZQogICAgIGV4cGVyaW1lbnRhbCBkaXJlY3RvcnkuICBbU2NvdHQgTGFtYiA8c2xhbWIgc2xhbWIub3JnPl0KCiAgKikgRml4IHBlcmNoaWxkIE1QTSBzbyB0aGF0IGl0IHVzZXMgYXBfZ25hbWUyaWQgZm9yIGdyb3VwcyBpbnN0ZWFkIG9mCiAgICAgYXBfdW5hbWUyaWQuIFtTY290dCBMYW1iIDxzbGFtYiBzbGFtYi5vcmc+XQoKICAqKSBGaXggQWNjZXB0UGF0aEluZm8uIFBSIDgyMzQgIFtDbGlmZiBXb29sbGV5XQoKICAqKSBTRUNVUklUWTogQWRkZWQgdGhlIEFQTE9HX1RPQ0xJRU5UIGZsYWcgdG8gYXBfbG9nX3JlcnJvcigpIHRvCiAgICAgZXhwbGljaXRseSB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3YXJuaW5nIG1lc3NhZ2VzIHNob3VsZCBiZSBzZW50IAogICAgIHRvIHRoZSBjbGllbnQgaW4gYWRkaXRpb24gdG8gYmVpbmcgcmVjb3JkZWQgaW4gdGhlIGVycm9yIGxvZy4gCiAgICAgUHJpb3IgdG8gdGhpcyBjaGFuZ2UsIGFwX2xvZ19yZXJyb3IoKSBhbHdheXMgc2VudCB3YXJuaW5nIAogICAgIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQuIEluIG9uZSBjYXNlLCBhIGZhdWx0eSBDR0kgc2NyaXB0IGNhdXNlZAogICAgIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY2xpZW50IHRoYXQgY29udGFpbmVkCiAgICAgdGhlIGZ1bGwgcGF0aCB0byB0aGUgQ0dJIHNjcmlwdC4gVGhpcyBjb3VsZCBiZSBjb25zaWRlcmVkIGEKICAgICBtaW5vciBzZWN1cml0eSBleHBvc3VyZS4gW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9hdXRvaW5kZXggb3V0cHV0IHdoZW4gU3VwcHJlc3NSdWxlcyB3YXMgc3BlY2lmaWVkIHdvdWxkCiAgICAgb21pdCB0aGUgZmlyc3QgY2FycmlhZ2UgcmV0dXJuIHNvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0CiAgICAgd291bGQgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgY29sdW1uIGhlYWRpbmdzIGluc3RlYWQgb2YKICAgICB1bmRlcm5lYXRoIHRoZW0uIFBSIDgwMTYgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgTW92ZWQgdGhlIGNhbGwgdG8gYXByX21tYXBfZHVwIG91dHNpZGUgdGhlIGVycm9yIGJyYW5jaCBzbwogICAgIHRoYXQgaXQgd291bGQgYWN0dWFsbHkgZ2V0IGNhbGxlZC4gVGhpcyBmaXhlcyBhIGNvcmUgZHVtcAogICAgIGF0IGluaXQgZXZlcnl0aW1lIHlvdSB1c2UgdGhlIE1NYXBGaWxlIGRpcmVjdGl2ZS4gUFIgODMxNAogICAgIFtQYXVsIEouIFJlZGVyXQoKICAqKSBUcmlnZ2VyIGFuIGVycm9yIHdoZW4gYSBMb2FkTW9kdWxlIGRpcmVjdGl2ZSBhdHRlbXB0cyB0bwogICAgIGxvYWQgYSBtb2R1bGUgd2hpY2ggaXMgYnVpbHQtaW4uICBUaGlzIGlzIGEgY29tbW9uIGVycm9yIHdoZW4KICAgICBzd2l0Y2hpbmcgZnJvbSBhIERTTyBidWlsZCB0byBhIHN0YXRpYyBidWlsZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZSBpbnN0ZHNvLnNoIHRvIHVzZSBsaWJ0b29sIC0taW5zdGFsbCBldmVyeXdoZXJlIGFuZCB0aGVuCiAgICAgY2xlYW4gdXAgc29tZSBzdHJheSBmaWxlcyBhbmQgc3ltbGlua3MgdGhhdCBsaWJ0b29sIGxlYXZlcyBhcm91bmQKICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gIFRoaXMgZ2V0cyBzdWJ2ZXJzaW9uIGJ1aWxkaW5nIHByb3Blcmx5IHNpbmNlCiAgICAgaXQgbmVlZGVkIGEgcmUtbGluayB0byBiZSBwZXJmb3JtZWQgYnkgbGlidG9vbCBhdCBpbnN0YWxsIHRpbWUsCiAgICAgYW5kIHRoZSBvbGQgaW5zdGRzby5zaCBsb2dpYyB0byBzaW1wbHkgY3AgdGhlIERTTyBkaWRuJ3QgaGFuZGxlCiAgICAgdGhhdCByZXF1aXJlbWVudC4gIFtTYW5kZXIgU3RyaWtlcl0KCiAgKikgQWxsb3cgVlBBVEggYnVpbGRzIHRvIHN1Y2NlZWQgd2hlbiBjb25maWd1cmVkIGZyb20gYW4gZW1wdHkKICAgICBkaXJlY3RvcnkuICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgRml4ICdjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uJyB3YXJuaW5nIGluCiAgICAgc2VydmVyL2xvZy5jLiAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIFBlcmNoaWxkIE1QTSBpcyBub3cgY29ycmVjdGx5IGRlZW1lZCBhcyBleHBlcmltZW50YWwgYW5kIGlzIG5vdwogICAgIGxvY2F0ZWQgaW4gc2VydmVyL21wbS9leHBlcmltZW50YWwuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIHdoZW4gZ2FyYWJnZSBjb2xsZWN0aW5nIGFuIGV4cGlyZWQKICAgICBjYWNoZSBlbnRyeS4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBJbnRyb2R1Y2VkIC1FIHN0YXJ0dXBfbG9nZmlsZV9uYW1lIG9wdGlvbiB0byBodHRwZCB0byBhbGxvdyBhZG1pbnMKICAgICB0byBiZWdpbiBsb2dnaW5nIGVycm9ycyBpbW1lZGlhdGVseS4gIFRoaXMgcHJvdmlkZXMgV2luMzIgdXNlcnMgCiAgICAgYW4gYWx0ZXJuYXRpdmUgdG8gc2VuZGluZyBzdGFydHVwIGVycm9ycyB0byB0aGUgZXZlbnQgdmlld2VyLCBhbmQKICAgICBhbGxvd3Mgb3RoZXIgZGFlbW9uIHRvb2wgYXV0aG9ycyBhbiBhbHRlcm5hdGl2ZSB0byBsb2dnaW5nIHRvIHN0ZGVyci4KICAgICBbV2lsbGlhbSBSb3dlXSAKICAgICAKICAqKSBGaXggc3VicmVxcyB3aXRoIG5vbi1kZWZpbmVkIENvbnRlbnQtVHlwZXMgYmVpbmcgc2VydmVkIGltcHJvcGVybHkuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNZXJnZSBpbiBsYXRlc3QgR05VIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YiBmaWxlcy4gIFBSIDc4MTguCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNb3ZlIDEwMCAtIENvbnRpbnVlIHN1cHBvcnQgdG8gdGhlIEhUVFBfSU4gZmlsdGVyIHNvIHRoYXQgZmlsdGVycwogICAgIGFyZSBndWFyYW50ZWVkIHRvIHN1cHBvcnQgMTAwIC0gQ29udGludWUgbG9naWMgd2l0aG91dCBhbnkKICAgICBpbnRlcnZlbnRpb24uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFkZCBIVFRQIGNodW5rZWQgaW5wdXQgdHJhaWxlciBzdXBwb3J0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZW5hbWUgYW5kIGV4cG9ydCBnZXRfbWltZV9oZWFkZXJzIGFzIGFwX2dldF9taW1lX2hlYWRlcnMuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBbGxvdyBlbXB0eSBIb3N0OiBoZWFkZXIgYXJndW1lbnRzLiAgUFIgNzQ0MS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUHJvcGVybHkgc3Vic3RpdHV0ZSBzYmluZGlyIGFzIGh0dHBkJ3MgbG9jYXRpb24gaW4gYXBhY2hlY3RsLiAgUFIgNzg0MC4KICAgICBbQW5kcmVhcyBIYXNlbmFjayA8YW5kcmVhcyBuZXRiYW5rLmNvbS5icj5dCgogICopIEFsbG93IFdpbjMyIHNoZWJhbmcgc2NyaXB0cyB0byBmb2xsb3cgdGhlIHBhdGggKG9yIG9taXQgdGhlIC5leGUKICAgICBzdWZmaXggZnJvbSB0aGUgc2hlYmFuZyBjb21tYW5kKSwgYW5kIGFsbG93IFNjcmlwdEludGVycHJldGVyU291cmNlCiAgICAgUmVnaXN0cnkgb3IgUmVnaXN0cnlTdHJpY3QgdG8gb3ZlcnJpZGUgc2hlYmFuZyBsaW5lcywgYXMgMS4zIGRpZC4KICAgICBQUiA4MDA0ICBbV2lsbGlhbSBSb3dlXQoKICAqKSB3b3JrZXIgTVBNOiBGaXggYSBzaXR1YXRpb24gd2hlcmUgYSBjaGlsZCBleGl0ZWQgd2l0aG91dCByZWxlYXNpbmcKICAgICB0aGUgYWNjZXB0IG11dGV4LiAgRGVwZW5kaW5nIG9uIHRoZSBPUyBhbmQgbXV0ZXggbWVjaGFuaXNtIHRoaXMgCiAgICAgY291bGQgcmVzdWx0IGluIGEgaGFuZy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBtb2RfZXhhbXBsZS4KICAgICBbU3RhcyBCZWttYW5dCiAgCiAgKikgRml4IFBpZEZpbGUgdG8gZGVmYXVsdCB0byByZWxfcnVudGltZWRpciBpbnN0ZWFkIG9mCiAgICAgcmVsX2xvZ2ZpbGVkaXIuICBQUiA3ODQxLiAgW0FuZHJlYXMgSGFzZW5hY2sgPGFuZHJlYXMgbmV0YmFuay5jb20uYnI+XQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gdGhhdCBjYXVzZWQgcmFwaWQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24KICAgICB3aGVuIG51bWJlciBvZiBjb25uZWN0aW5nIGNsaWVudHMgZXhjZWVkZWQgVGhyZWFkc1BlckNoaWxkLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXhlZCBhIHNlZ2ZhdWx0IHBhcnNpbmcgbGFyZ2UgU1NJcyBvbiBub24tbW1hcCBzeXN0ZW1zLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIFByb3h5IHdhcyBib21iaW5nIG91dCBldmVyeSBzZWNvbmQga2VlcGFsaXZlIHJlcXVlc3QsIGNhdXNlZCBieSBhCiAgICAgc3RyYXkgQ1JMRiBiZWZvcmUgdGhlIHNlY29uZCByZXNwb25zZSdzIHN0YXR1cyBsaW5lLiBQcm94eSBub3cKICAgICB0cmllcyB0byByZWFkIG9uZSBtb3JlIGxpbmUgaWYgaXQgZW5jb3VudGVycyBhIENSTEYgd2hlcmUgaXQKICAgICBleHBlY3RlZCBhIHN0YXR1cy4gUFIgMTAwMTAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBEZXByZWNhdGVkIHRoZSBhcHJfbG9jay5oIEFQSS4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzCiAgICAgZm9yIHRoZSBpbXByb3ZlZCB0aHJlYWQgYW5kIHByb2Nlc3MgbG9ja2luZyBhbmQgc2lnbmFsaW5nOiAKICAgICBhcHJfcHJvY19tdXRleC5oLCBhcHJfdGhyZWFkX211dGV4LmgsIGFwcl90aHJlYWRfcndsb2NrLmgsCiAgICAgYXByX3RocmVhZF9jb25kLmgsIGFuZCBhcHJfZ2xvYmFsX211dGV4LmguICBbQWFyb24gQmFubmVydF0KCiAgKikgQ2hhbmdlIG1vZF9zdGF0dXMgdG8gdXNlIHNjb3JlYm9hcmQgYWNjZXNzb3IgZnVuY3Rpb25zIHNvIGl0IGNhbgogICAgIGJlIHVzZWQgaW4gYW55IE1QTSB3aXRob3V0IGhhdmluZyB0byBiZSByZWNvbXBpbGVkLgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBGaXggcGFyc2luZyBvZiBzb21lIEFQX0RFQ0xBUkVfREFUQSBkZWNsYXJhdGlvbnMgc28gdGhhdCB0aGUgZmlsdGVyCiAgICAgaGFuZGxlIGRlY2xhcmF0aW9ucyBhcmUgcmVjb2duaXplZC4gIFRoaXMgZml4ZXMgcHJvYmxlbXMgbG9hZGluZyAKICAgICBtb2RfYXV0b2luZGV4IG9uIHNvbWUgcGxhdGZvcm1zLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgYWRkIG9wdGlvbmFsIGZpeHVwIGhvb2sgdG8gcHJveHkgW0RhbmllbCBMb3BleiA8ZGFuaWVsIGNvdmFsZW50Lm5ldD5dCgogICopIFJlbWluZCB0aGUgYWRtaW4gYWJvdXQgdGhlIFVzZXIgYW5kIEdyb3VwIGRpcmVjdGl2ZXMgd2hlbiB3ZSBhcmUKICAgICB1bmFibGUgdG8gc2V0IHBlcm1pc3Npb25zIG9uIGEgc2VtYXBob3JlLiAgUFIgNzgxMiAgW0plZmYgVHJhd2lja10KCiAgKikgZml4IHBvc3NpYmxlIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gc3NsX2VuZ2luZV9rZXJuZWwuYy4gUFIgNzgwMgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGZpeCBwb3NzaWJsZSBpbmZpbml0ZSBsb29wIGluIG1vZF9zc2wgdHJpZ2dlcmVkIGJ5IGNlcnRhaW4KICAgICBuZXRzY2FwZSBjbGllbnRzIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGZpeCBQcm94eVBhc3Mgd2hlbiBmcm9udGVuZCBpcyBodHRwcyBhbmQgYmFja2VuZCBpcyBodHRwCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkIERBU0wgc3VwcG9ydCB0byBtb2RfZGF2CiAgICAgW1N1bmcgS2ltIDxodW5raW0gY3NlLnVjc2MuZWR1Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjM1CgogICopIG1vZF9yZXdyaXRlOiB1cGRhdGVkIHRvIHVzZSB0aGUgbmV3IEFQUiBnbG9iYWwgbXV0ZXggdHlwZS4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4ZXMgZm9yIG1vZF9pbmNsdWRlIGVycm9ycyBvbiBib3VuZGFyeSBjb25kaXRpb25zIGluIHdoaWNoCiAgICAgIjwhLS0jIiBvY2N1cnMgYXQgdGhlIHZlcnkgZW5kIG9mIGEgYnVja2V0CiAgICAgW1BhdWwgUmVkZXIsIEJyaWFuIFBhbmVdCgogICopIHdvcmtlciwgcHJlZm9yaywgcGVyY2hpbGQsIGJlb3MgTVBNczogQWRkIC1ERk9SRUdST1VORCBzd2l0Y2ggdG8gCiAgICAgY2F1c2UgdGhlIEFwYWNoZSBwYXJlbnQgcHJvY2VzcyB0byBydW4gaW4gdGhlIGZvcmVncm91bmQgKHNpbWlsYXIgdG8KICAgICAtRE5PX0RFVEFDSCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHN3aXRjaCBzZXNzaW9uIGlkcykuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBQb3NpeCBzZW1hcGhvcmUgbXV0ZXggbG9ja2luZyAoQWNjZXB0TXV0ZXggcG9zaXhzZW0pCiAgICAgZm9yIHRob3NlIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuIElmIHVzaW5nIHRoZSBkZWZhdWx0CiAgICAgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgYmV0d2VlbiBwdGhyZWFkIGFuZCBzeXN2c2VtIGluIHByaW9yaXR5LgogICAgIFRoaXMgaW1wbGllcyBpdCdzIHRoZSBuZXcgZGVmYXVsdCBmb3IgRGFyd2luLiBbSmltIEphZ2llbHNraV0KCiAgKikgQUlYOiBGaXggdGhlIHN5bnRheCBmb3Igc2V0dGluZyB0aGUgTERSX0NOVFJMIGFuZCBBSVhUSFJFQURfU0NPUEUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gdGhlIGVudnZhcnMgZmlsZS4gIFtKZWZmIFRyYXdpY2tdCgogICopIHdvcmtlciBNUE06IERvbid0IGNyZWF0ZSBhIGxpc3RlbmVyIHRocmVhZCB1bnRpbCB3ZSBoYXZlIGEgd29ya2VyCiAgICAgdGhyZWFkLiAgT3RoZXJ3aXNlLCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlJ2xsIGhhdmUgdG8gd2FpdCBhIHdoaWxlCiAgICAgdG8gdGFrZSBvdmVyIHNjb3JlYm9hcmQgc2xvdHMgZnJvbSBhIHByZXZpb3VzIGdlbmVyYXRpb24sIHdlJ2xsIGJlCiAgICAgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIHdlIGNhbid0IHByb2Nlc3MgeWV0LiAgW0plZmYgVHJhd2lja10KCiAgKikgQWxsb3cgd29ya2VyIE1QTSB0byBidWlsZCBvbiBzeXN0ZW1zIHdpdGhvdXQgcHRocmVhZF9raWxsKCkuCiAgICAgW1BpZXIgRnVtYWdhbGxpLCBKZWZmIFRyYXdpY2tdCgogICopIFByZXZlbnQgYXBfYWRkX291dHB1dF9maWx0ZXJzX2J5X3R5cGUgZnJvbSBiZWluZyBjYWxsZWQgaW4KICAgICBhcF9zZXRfY29udGVudF90eXBlIGlmIHRoZSBjb250ZW50LXR5cGUgaGFzbid0IGNoYW5nZWQuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBQZXJmb3JtYW5jZTogaW1wbGVtZW50ZWQgdGhlIGJ1Y2tldCBhbGxvY2F0b3IgbWFkZSBwb3NzaWJsZSBieSB0aGUKICAgICBBUEkgY2hhbmdlIGluIDIuMC4zNC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBEb24ndCBhbGxvdyBpbml0aWFsaXphdGlvbiB0byBzdWNjZWVkIGlmIHdlIGNhbid0IGdldCBhIHNvY2tldAogICAgIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBMaXN0ZW4gc3RhdGVtZW50cy4gIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zNAoKICAqKSBBbGxvdyBhbGwgUGVyY2hpbGQgZGlyZWN0aXZlcyB0byBhY2NlcHQgZWl0aGVyIG51bWVyaWNhbCBVSUQvR0lECiAgICAgb3IgbG9naWNhbCB1c2VyL2dyb3VwIG5hbWVzLiAgW1Njb3R0IExhbWIgPHNsYW1iIHNsYW1iLm9yZz5dCgogICopIE1ha2UgUGVyY2hpbGQgY29tcGlsZSBjbGVhbmx5IGFuZCBzZXJ2ZSBwYWdlcyBhZ2Fpbi4gW1J5YW4gQmxvb21dCgogICopIGltcGxlbWVudCBzc2wgcHJveHkgdG8gc3VwcG9ydCBQcm94eVBhc3MgLyBodHRwczovLyBhbmQgdGhlCiAgICAgU1NMUHJveHkqIGRpcmVjdGl2ZXMgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgVXBkYXRlIG1vZF9jZ2lkIHRvIG5vdCBkbyBzaW5nbGUtYnl0ZSBzb2NrZXQgcmVhZHMgZm9yIENHSSBoZWFkZXJzCiAgICAgW0JyaWFuIFBhbmVdCgogICopIE1hZGUgQUIncyB1c2Ugb2YgdGhlIEhvc3Q6IGhlYWRlciByZmMyNjE2IGNvbXBsaWFudAogICAgIGJ5IFRhaXN1a2UgWWFtYWRhIDx0YWkgaWlqLmFkLmpwPiBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXS4KCiAgKikgVGhlIG9sZCwgbGVnYWN5IChhbmQgdW51c2VkKSBjb2RlIGluIHdoaWNoIHRoZSBzY29yZWJvYXJkIHdhcyB0b3RhbGx5CiAgICAgYW5kIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIGEgZmlsZSAoU0NPUkVCT0FSRF9GSUxFKSBoYXMgYmVlbgogICAgIHJlbW92ZWQuIFRoaXMgZG9lcyBub3QgYWZmZWN0IHNjb3JlYm9hcmRzIHdoaWNoIGFyZSAqbWFwcGVkKiB0bwogICAgIGZpbGVzIHVzaW5nIG5hbWVkLXNoYXJlZC1tZW1vcnkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBDaGFuZ2UgYnVja2V0IGJyaWdhZGVzIEFQSSB0byBhbGxvdyBhICJidWNrZXQgYWxsb2NhdG9yIiB0byBiZQogICAgIHBhc3NlZCBpbiBhdCBjZXJ0YWluIHBvaW50cy4gIFRoaXMgYWxsb3dzIHVzIHRvIGltcGxlbWVudCBmcmVlbGlzdHMKICAgICBzbyB0aGF0IHdlIGNhbiBzdG9wIHVzaW5nIG1hbGxvYy9mcmVlIHNvIGZyZXF1ZW50bHkuCiAgICAgW0NsaWZmIFdvb2xsZXksIEJyaWFuIFBhbmVdCgogICopIEFkZCBzdXBwb3J0IGZvciBtYWNybyBleHBhbnNpb24gd2l0aGluIHRoZSB2YXJpYWJsZSBuYW1lcyBpbgogICAgIDwhLS0jZWNoby0tPiBhbmQgPCEtLSNzZXQtLT4gZGlyZWN0aXZlcyBbQnJpYW4gUGFuZV0KCiAgKikgRml4IHNvbWUgbW9kX2luY2x1ZGUgc2VnZmF1bHRzIFtDbGlmZiBXb29sbGV5LCBCcmlhbiBQYW5lLCBCcmFkIE5pY2hvbGVzXQoKICAqKSBVcGRhdGUgdGhlICJSZWRIYXQiIExheW91dCB0byBtYXRjaCBSZWQgSGF0IExpbnV4IHZlcnNpb24gNy4gUFIgQlotNzQyMgogICAgIFtKb2UgT3J0b25dIAoKICAqKSBhZGQgY29tcGF0IGxheWVyIHRvIHN1cHBvcnQgUlNBIFNTTEMgMS54IGFuZCAyLnggaW4gbW9kX3NzbAogICAgIFtKb24gVHJhdmlzLCBKb2huIEJhcmJlZSwgV2lsbGlhbSBSb3dlLCBSeWFuIEJsb29tLCBEb3VnIE1hY0VhY2hlcm5dCgogICopIEFkZCBhIG5ldyBwYXJhbWV0ZXIgdG8gdGhlIHF1aWNrX2hhbmRsZXIgaG9vayB0byBpbnN0cnVjdAogICAgIHF1aWNrIGhhbmRsZXJzIHRvIG9wdGlvbmFsbHkgZG8gYSBsb29rdXAgcmF0aGVyIHRoYW4gYWN0dWFsbHkgCiAgICAgc2VydmUgY29udGVudC4gVGhpcyBpcyB0aGUgZmlyc3Qgb2Ygc2V2ZXJhbCBjaGFuZ2VzIHJlcXVpcmVkIGZpeAogICAgIHNldmVyYWwgcHJvYmxlbXMgd2l0aCBob3cgcXVpY2sgaGFuZGxlcnMgd29yayB3aXRoIHN1YnJlcXVlc3RzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSB3b3JrZXIgTVBNOiBHZXQgTWF4UmVxdWVzdHNQZXJDaGlsZCB0byB3b3JrIGFnYWluLiAgW0plZmYgVHJhd2lja10KCiAgKikgW0FQUi1yZWxhdGVkXSBUaGUgb3JkZXJpbmcgb2YgdGhlIGRlZmF1bHQgYWNjZXB0IG11dGV4IG1ldGhvZCBoYXMKICAgICBiZWVuIGNoYW5nZWQgdG8gYmV0dGVyIG1hdGNoIHdoYXQncyBkb25lIGluIEFwYWNoZSAxLjMuIFRoZSBvcmRlcmluZyAKICAgICBpcyBub3cgKGhpZ2hlc3QgdG8gbG93ZXN0KTogcHRocmVhZCAtPiBzeXN2c2VtIC0+IGZjbnRsIC0+IGZsb2NrLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgYnVpbGQvIGRpcmVjdG9yeSBpcyBjcmVhdGVkIHdoZW4gdXNpbmcgVlBBVEguCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBZGQgc29tZSBwb3B1bGFyIHR5cGVzIHRvIHRoZSBtaW1lIG1hZ2ljIGZpbGUuICBQUiA3NzMwLgogICAgIFtMaW51cyBXYWxsZWlqIDx0cmlhZCBkZi5sdGguc2U+LCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUmVtb3ZlIHRoZSBzaW5nbGUtYnl0ZSBzb2NrZXQgcmVhZHMgZm9yIENHSSBoZWFkZXJzIFtCcmlhbiBQYW5lXQoKICAqKSBXaGVuIGEgcHJveGllZCBzaXRlIHdhcyBiZWluZyBzZXJ2ZWQsIEFwYWNoZSB3YXMgcmVwbGFjaW5nCiAgICAgdGhlIG9yaWdpbmFsIHNpdGUgU2VydmVyIGhlYWRlciB3aXRoIGl0J3Mgb3duLCB3aGljaCBpcyBub3QKICAgICBhbGxvd2VkIGJ5IFJGQzI2MTYuIEZpeGVkLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBhIG1vZF9jZ2lkIHByb2JsZW0gdGhhdCBsZWZ0IGRhZW1vbiBwcm9jZXNzZXMgc3RyYW5kZWQKICAgICBpbiBzb21lIHNlcnZlciByZXN0YXJ0IHNjZW5hcmlvcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGV4cF9mb28gYW5kIHJlbF9mb28gdmFyaWFibGVzIHRvIGNvbmZpZ192YXJzLm1rIGZvcgogICAgIGFsbCBBcGFjaGUgYW5kIEF1dG9jb25mIHBhdGggdmFyaWFibGVzIChsaWtlIC0tc3lzY29uZmRpciwKICAgICAtLXNiaW5kaXIsIGV0YykuIGV4cF9mb28gaXMgdGhlICJleHBhbmRlZCIgdmVyc2lvbiwgd2hpY2ggbWVhbnMKICAgICB0aGF0IGFsbCBpbnRlcm5hbCB2YXJpYWJsZSByZWZlcmVuY2VzIGhhdmUgYmVlbiBpbnRlcnBvbGF0ZWQuCiAgICAgcmVsX2ZvbyBpcyB0aGUgc2FtZSBhcyAkZXhwX2Zvbywgb25seSByZWxhdGl2ZSB0byAkcHJlZml4IGlmIHRoZXkKICAgICBzaGFyZSBhIGNvbW1vbiBwYXRoLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzb21lIHJlc3RhcnQvdGVybWluYXRlIHByb2JsZW1zIGluIHRoZSB3b3JrZXIgTVBNLiAgRG9uJ3QKICAgICBkcm9wIGNvbm5lY3Rpb25zIGR1cmluZyBncmFjZWZ1bCByZXN0YXJ0LiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSBoZWFkZXIgbWVyZ2luZyBiZWhhdmlvdXIgaW4gcHJveHksIGFzIHNvbWUgaGVhZGVycwogICAgIChsaWtlIFNldC1Db29raWUpIGNhbm5vdCBiZSB1bm1lcmdlZCBkdWUgdG8gc3RyYXkgY29tbWFzIGluCiAgICAgZGF0ZXMuIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgQmUgbW9yZSB2b2NhbCBhYm91dCB3aGF0IEFjY2VwdE11dGV4IHZhbHVlcyB3ZSBhbGxvdywgdG8gbWFrZQogICAgIHVzIGNsb3NlciB0byBob3cgMS4zIGRvZXMgaXQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBHZXQgbnBoLSBDR0kgc2NyaXB0cyB3b3JraW5nIGFnYWluLiAgUFJzIDg5MDIsIDg5MDcsIDk5ODMKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVcGdyYWRlZCBQQ1JFIGxpYnJhcnkgdG8gbGF0ZXN0IHZlcnNpb24gMy45IFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgYWNjZXNzb3IgZnVuY3Rpb24gdG8gc2V0IHItPmNvbnRlbnRfdHlwZS4gRnJvbSBub3cgb24sCiAgICAgYXBfcnNldF9jb250ZW50X3R5cGUoKSBzaG91bGQgYmUgdXNlZCB0byBzZXQgci0+Y29udGVudF90eXBlLgogICAgIFRoaXMgY2hhbmdlIGlzIHJlcXVpcmVkIHRvIHByb3Blcmx5IGltcGxlbWVudCB0aGUgCiAgICAgQWRkT3V0cHV0RmlsdGVyQnlUeXBlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLgogICAgIFtCaWxsIFN0b2RkYXJkLCBTYW5kZXIgU3RyaWtlciwgUnlhbiBCbG9vbV0KCiAgKikgQWRkIG5ldyBNX0ZPTyBzeW1ib2xzIGZvciB0aGUgV2ViREFWL0RlbHRhViBtZXRob2RzIHNwZWNpZmllZCBieQogICAgIFJGQyAzMjUzLiBJbXByb3ZlZCB0aGUgbWV0aG9kIG5hbWUvbnVtYmVyIG1hcHBpbmcgZnVuY3Rpb25zLgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSByZW1vdmUgc29ja19lbmFibGVfbGluZ2VyIGZyb20gY29ubmVjdGlvbi5jIFtJYW4gSG9sc21hbl0KCiAgKikgRml4IGZvciB2aXJ0dWFsIGhvc3QgcHJvY2Vzc2luZyB3aGVyZSB0aGUgcmVxdWVzdGVkIGhvc3RuYW1lCiAgICAgaGFzIGEgJy4nIGF0IHRoZSBlbmQgKFBSIDkxODcpIFtSeWFuIENydXNlIDxyeWFuIGVzdGFyYS5jb20+XQoKICAqKSBtb2RfZGF2J3MgQVBJcyBmb3IgUkVQT1JUIHJlc3BvbnNlIGhhbmRsaW5nIHdhcyBjaGFuZ2VkIHNvIHRoYXQKICAgICBwcm92aWRlcnMgY2FuIGdlbmVyYXRlIHRoZSBjb250ZW50IGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBmaWx0ZXIKICAgICBzdGFjaywgcmF0aGVyIHRoYW4gYnVmZmVyaW5nIHRoZSByZXNwb25zZSBpbnRvIG1lbW9yeS4gW0dyZWcgU3RlaW5dCgogICopIEZpeCBhIGhhbmcgY29uZGl0aW9uIHdpdGggZ3JhY2VmdWwgcmVzdGFydCBhbmQgcHJlZm9yayBNUE0KICAgICBpbiB0aGUgc2l0dWF0aW9uIHdoZXJlIE1heENsaWVudHMgaXMgdmVyeSBoaWdoIGJ1dAogICAgIG11Y2ggZmV3ZXIgc2VydmVycyBhcmUgYWN0dWFsbHkgc3RhcnRlZCBhdCB0aGUgdGltZSBvZiB0aGUKICAgICByZXN0YXJ0LiAgW0plZmYgVHJhd2lja10KCiAgKikgU21hbGwgcGVyZm9ybWFuY2UgZml4ZXMgZm9yIG1vZF9pbmNsdWRlIFtCcmlhbiBQYW5lXQoKICAqKSBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgdGhlIGVycm9yIGxvZ2dlciBbQnJpYW4gUGFuZV0KCiAgKikgQ2hhbmdlIGNvbmZpZ3VyZSBzbyB0aGF0IFNvbGFyaXMgOCBhbmQgYWJvdmUgaGF2ZSAKICAgICBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgZGVmaW5lZCBieSBkZWZhdWx0LgogICAgIGFjY29yZGluZyB0byBzdW4gcGVvcGxlIHNvbGFyaXMgOCsgZG9lc24ndCBoYXZlIGEgdGh1bmRlcmluZwogICAgIGhlcmQgcHJvYmxlbSBbSWFuIEhvbHNtYW5dCgogICopIEFsbG93IFVSSXMgc3BlY2lmeWluZyBDR0kgc2NyaXB0cyB0byBpbmNsdWRlICcvJyBhdCB0aGUgZW5kCiAgICAgKGUuZy4sIC9jZ2ktYmluL3ByaW50ZW52Lykgb24gQUlYIGFuZCBTb2xhcmlzIChhbmQgb3RoZXIgT1NzCiAgICAgd2hpY2ggaWdub3JlICcvJyBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lcyBvZiBub24tZGlyZWN0b3JpZXMpLgogICAgIFBSIDEwMTM4ICBbSmVmZiBUcmF3aWNrXQoKICAqKSBpbXBsZW1lbnQgU1NMU2Vzc2lvbkNhY2hlIHNobWh0IGFuZCBzaG1jYiBiYXNlZCBvbiBhcHJfcm1tIGFuZAogICAgIGFwcl9zaG0uICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPl0KCiAgKikgRml4IGFweHMgLWcgaGFuZGxpbmcuICBNb3ZlIGNvbmZpZ192YXJzLm1rIGZyb20gdGhlIHRvcCBidWlsZAogICAgIGRpcmVjdG9yeSB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgUFIgMTAxNjMgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzb21lIG1vZF9pbmNsdWRlIHByb2JsZW1zIHdoaWNoIGJyb2tlIGV2YWx1YXRpb24gb2Ygc29tZQogICAgIGV4cHJlc3Npb25zLiAgUFIgMTAxMDggIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCB0aGUgY2FsY3VsYXRpb24gb2YgcmVxdWVzdCB0aW1lIGluIG1vZF9zdGF0dXMuICBbU3RhcyBCZWttYW5dCgogICopIEZpeCB0aGUgY2FsY3VsYXRpb24gb2YgdGhyZWFkX251bSBpbiB0aGUgd29ya2VyIHNjb3JlIHN0cnVjdHVyZS4KICAgICBbU3RhcyBCZWttYW5dCgogICopIFVzZSBhcHJfYXRvbWljIG9wZXJhdGlvbnMgaW4gbWFuYWdpbmcgdGhlIG1vZF9tZW1fY2FjaGUKICAgICBjYWNoZV9vYmplY3RzIGZvciBTTVAgc2NhbGFiaWxpdHkuIChzZWUgVVNFX0FUT01JQ1MKICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGluIG1vZF9maWxlX2NhY2hlKQogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgZmlsZWhhbmRsZSBjYWNoaW5nIHRvIG1vZF9tZW1fY2FjaGUuIChzZWUgQ0FDSEVfRkQKICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGluIG1vZF9maWxlX2NhY2hlKQogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBJbXBsZW1lbnQgcHJvdG90eXBlIG1vZF9kaXNrX2NhY2hlIGZvciB1c2Ugd2l0aCBtb2RfY2FjaGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEFkZCBhIG1pc3NpbmcgbWFudWFsZGlyIGVudHJ5IGluIHRoZSBEZWJpYW4gY29uZmlnLmxheW91dC4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgU3RvcCBpbnN0YWxsaW5nIGxpYnRvb2wgZm9yIEFQUiBhbmQgdGVsbCBBUFIgd2hlcmUgaXQgc2hvdWxkIHBsYWNlCiAgICAgaXRzIGNvcHkgb2YgbGlidG9vbCAodmlhIG91ciBpbnN0YWxsYnVpbGRwYXRoIGxheW91dCB2YXJpYWJsZSkuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBOZXcgZGlyZWN0aXZlIFByb3h5SU9CdWZmZXJTaXplLiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZAogICAgIHdoZW4gcmVhZGluZyBmcm9tIGEgcmVtb3RlIEhUVFAgc2VydmVyIGluIHByb3h5LiBbR3JhaGFtIExlZ2dldHRdCgogICopIE1vZGlmeSByZWNlaXZlL3NlbmQgbG9vcCBpbiBwcm94eV9odHRwIGFuZCBwcm94eV9mdHAgc28gdGhhdAogICAgIHNob3VsZCBpdCBiZSBuZWNlc3NhcnksIHRoZSByZW1vdGUgc2VydmVyIHNvY2tldCBpcyBjbG9zZWQgYmVmb3JlCiAgICAgdHJhbnNtaXR0aW5nIHRoZSBsYXN0IGJ1ZmZlciAoc2V0IGJ5IFByb3h5SU9CdWZmZXJTaXplKSB0byB0aGUKICAgICBjbGllbnQuIFRoaXMgcHJldmVudHMgdGhlIGJhY2tlbmQgc2VydmVyIGZyb20gYmVpbmcgZm9yY2VkIHRvIGhhbmcKICAgICBhcm91bmQgd2hpbGUgdGhlIGxhc3QgZmV3IGJ5dGVzIGFyZSB0cmFuc21pdHRlZCB0byBhIHNsb3cgY2xpZW50LgogICAgIEZpeCB0aGUgY2FzZSB3aGVyZSBubyBlcnJvciBjaGVja2luZyB3YXMgcGVyZm9ybWVkIG9uIHRoZSBmaW5hbAogICAgIGJyaWdhZGUgaW4gdGhlIGxvb3AuIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgU2NyYXAgQ2FjaGVNYXhFeHBpcmVNaW4gYW5kIENhY2hlRGVmYXVsdEV4cGlyZU1pbi4gQ2hhbmdlCiAgICAgQ2FjaGVNYXhFeHBpcmUgYW5kIENhY2hlRGVmYXVsdEV4cGlyZSB0byB1c2Ugc2Vjb25kcyByYXRoZXIgdGhhbgogICAgIGhvdXJzLiBbR3JhaGFtIExlZ2dldHQsIEJpbGwgU3RvZGRhcmRdCgogICopIE5ldyBEaXJlY3RpdmUgU1NJVW5kZWZpbmVkRWNoby4gdG8gY2hhbmdlIHRoZSAnKG5vbmUpJyBlY2hvZWQKICAgICBmb3IgYSB1bmRlZmluZWQgdmFyaWFibGUuIFtJYW4gSG9sc21hbl0KCiAgKikgUHJveHkgSFRUUCBhbmQgQ09OTkVDVDogS2VlcCB0cnlpbmcgb3RoZXIgYWRkcmVzc2VzIGZyb20gdGhlIEROUwogICAgIHdoZW4gd2UgY2FuJ3QgZ2V0IGEgc29ja2V0IGluIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBmYW1pbHkuICBXZSBtYXkKICAgICBoYXZlIGdvdHRlbiBiYWNrIGFuIElQdjYgYWRkcmVzcyBmaXJzdCBhbmQgeWV0IG91ciBzeXN0ZW0gaXMgbm90CiAgICAgY29uZmlndXJlZCB0byBhbGxvdyBJUHY2IHNvY2tldHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBCZSBtb3JlIGNhcmVmdWwgYWJvdXQgcmVjdXJzaXZlbHkgcmVtb3ZpbmcgQ1ZTIGRpcmVjdG9yaWVzLiBNYWtlCiAgICAgc3VyZSB0aGF0IHdlIGFyZW4ndCBjZCdpbmcgdG8gdGhlaXIgaG9tZSBkaXJlY3RvcnkgZmlyc3QuIFBSOiA5OTkzCiAgICAgW0Fhcm9uIEJhbm5lcnQsIEphbWVzIExld2lzTW9zcyA8ZHJlcyBsZXdpc21vc3MubmV0Pl0KCiAgKikgQWRkIGEgbWlzc2luZyBlcnJvcmRpciBlbnRyeSBpbiB0aGUgRGViaWFuIGNvbmZpZy5sYXlvdXQuIFBSOiAxMDA2NwogICAgIFtEaXJrLUphbiBGYWJlciA8ZGlyay1qYW4gc2Vsd2VyZC5ubD4sIEFhcm9uIEJhbm5lcnQsCiAgICAgIFRob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD5dCgogICopIFJlbmFtZSB0aGUgZmlsdGVyIG9yZGVyaW5nIHByaW9yaXRpZXMuICBUaGUgcmVjZW50IGZpbHRlcmluZyBmaXhlcwogICAgIGhhdmUgc2hvd2Nhc2VkIHByb2JsZW1zIHdpdGggdGhlaXIgdXNhZ2UuICBUaGVyZWZvcmUsIHdlIG5lZWQgdG8KICAgICByZW5hbWUgdGhlbSB0byBpbmNyZWFzZSB0aGUgY2xhcml0eS4gIChDT05URU5ULT5SRVNPVVJDRSwKICAgICBIVFRQX0hFQURFUi0+Q09OVEVOVF9TRVQvUFJPVE9DT0wpICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zMwoKICAqKSBGaXggYSBwcm9ibGVtIGluIHRoZSBuZXcgLS1lbmFibGUtbGF5b3V0IGZ1bmN0aW9uYWxpdHkgd2hlcmUKICAgICBpdCB3b3VsZG4ndCBhbGxvdyBvdmVycmlkZXMgZnJvbSB2YXJpYWJsZXMgbGlrZSAtLXByZWZpeCwKICAgICAtLWJpbmRpciwgZXRjLiAgW1Rob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD5dCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgY29yZSBpbnB1dCBmaWx0ZXIgZm9yIEFQX01PREVfRVhIQVVTVElWRS4gSXQKICAgICBubyBsb25nZXIgaGFuZ3MgYXJvdW5kIHdhaXRpbmcgZm9yIHRoZSBzb2NrZXQgdG8gY2xvc2UgYmVmb3JlCiAgICAgcmV0dXJuaW5nIGV4aGF1c3RpdmUgZGF0YS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSByZW5hbWUgYXByX2V4cGxvZGVkX3RpbWVfdCB0byBhcHJfdGltZV9leHBfdCAoYXMgcGVyIHJlbmFtZXMgcGVuZGluZykKICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgQ2hhbmdlIG1vZF9zc2wgdG8gYWx3YXlzIGRvIGEgZnVsbCBzdGFydHVwL3RlYXJkb3duIG9uIHJlc3RhcnRzLgogICAgIHRoaXMgYWxsb3dzIG1vZF9zc2wgdG8gYmUgYWRkZWQgdG8gYSBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5CiAgICAgcnVubmluZyBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gYWRkL2NoYW5nZSBjZXJ0cy9rZXlzIGFmdGVyIHRoZQogICAgIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgSW50cm9kdWNlIFBhc3NQaHJhc2VEaWFsb2cgInwvcGF0aC90by9waXBlIiBtZWNoYW5pc20gdG8gbW9kX3NzbC4KICAgICBUaGlzIHBpcGUgbXVzdCBiZSBhIGJpZGlyZWN0aW9uYWwgJ2NvbnNvbGUnIHN0eWxlIHJlbGF5LCB3aGljaAogICAgIG1vZF9zc2wgcHJpbnRzIGFsbCBwcm9tcHRzIHRvIHRoZSBwaXBlJ3Mgc3RkaW4sIGFuZCByZWFkcyB0aGUKICAgICBwYXNzcGhyYXNlcyBmcm9tIHRoZSBwaXBlJ3Mgc3Rkb3V0LiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGJ1ZyB3aGVyZSAtLXN5c2NvbmZkaXIgYW5kIC0tbG9jYWxzdGF0ZWRpciB3ZXJlIGJlaW5nCiAgICAgaWdub3JlZC4gIFtUaG9tIE1heSA8dGhvbSBwbGFuZXRhcnl0cmFtcC5uZXQ+LCBBYXJvbiBCYW5uZXJ0XQogICAgIFBSIDk4ODgKCiAgKikgRml4IC0tZW5hYmxlLWxheW91dCB0byB3b3JrIGFnYWluLiBDYXV0aW9uOiBXaGVuIHNwZWNpZnlpbmcKICAgICAtLWVuYWJsZS1sYXlvdXQsIGNvbW1vbiBhcmd1bWVudHMgbGlrZSAtLXByZWZpeCwgLS1leGVjLXByZWZpeCwKICAgICBldGMuIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHNldHRpbmdzIGZyb20gdGhlIGxheW91dCB3aWxsIGJlCiAgICAgdXNlZCBpbnN0ZWFkLiAgW1Rob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD4sIEFhcm9uIEJhbm5lcnRdCiAgICAgUFIgOTEyNCwgOTg3MywgOTg4NQoKICAqKSBOZXcgRGlyZWN0aXZlIGZvciBtb2RfcHJveHk6IFByb3h5UmVtb3RlTWF0Y2guIFRoaXMgcHJvdmlkZXMKICAgICByZWdleCBwYXR0ZXJuIG1hdGNoaW5nIGZvciB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCByZXF1ZXN0cwogICAgIHRvIHVzZSB0aGUgcmVtb3RlIHByb3h5IGZvci4gW0ppbSBKYWdpZWxza2ldCgogICopIEZpeCBDdXN0b21Mb2cgYnl0ZXMtc2VudCB3aXRoIEhUVFAgMC45LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBQcmV2ZW50IEFwYWNoZSBmcm9tIGlnbm9yaW5nIFNJR0hVUCBkdWUgdG8gc29tZSBsaW5nZXJpbmcgMS4zCiAgICAgY3J1ZnQgaW4gcGlwZWQgbG9ncyBhbmQgcmV3cml0ZW1hcCBjaGlsZCBwcm9jZXNzZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWxsIGluc3RhbmNlcyBvZiBhcHJfbG9ja190IGhhdmUgYmVlbiByZW1vdmVkIGFuZCBjb252ZXJ0ZWQKICAgICB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBuZXcgbG9jayBBUElzOiBhcHJfdGhyZWFkX211dGV4LmgsCiAgICAgYXByX3Byb2NfbXV0ZXguaCwgb3IgYXByX2dsb2JhbF9tdXRleC5oLiBObyBuZXcgY29kZSBzaG91bGQKICAgICB1c2UgdGhlIGFwcl9sb2NrLmggQVBJLCBhcyB0aGUgb2xkIEFQSSB3aWxsIHNvb24gYmUgZGVwcmVjYXRlZC4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgTWVyZ2VkIGluIGNoYW5nZXMgdG8gbW9kX3NzbCB1cCB0aHJvdWdoIDIuOC43LTEuMy4yMy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQ2xpZmYgV29vbGxleV0KCiAgKikgbW9kLWluY2x1ZGU6IG1ha2UgaXQgaGFuZGxlIGZsdXNoJ2VzIGFuZCBmaXggdGhlICdmYWxzZS1hbGFybScKICAgICBbSnVzdGluIEVyZW5rcmFudHosIEJyaWFuIFBhbmUsIElhbiBIb2xzbWFuXQoKICAqKSBhcF9nZXRfKl9maWx0ZXJfaGFuZGxlKCkgZnVuY3Rpb25zIHRvIGFsbG93IDNyZCBwYXJ0eSBtb2R1bGVzCiAgICAgdG8gbG9va3VwIGZpbHRlciBoYW5kbGVzIHNvIHRoZXkgY2FuIGJ5cGFzcyB0aGUgZmlsdGVyIG5hbWUKICAgICBsb29rdXAgd2hlbiBhZGRpbmcgZmlsdGVycyB0byBhIHJlcXVlc3QgKHZpYSBhcF9hZGRfKl9maWx0ZXJfaGFuZGxlKCkpCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBmb3IgbXVsdGlwbGUgZmlsZSBidWNrZXRzIG9uIFdpbjMyLCB3aGVyZSB0aGUgZmlyc3QgZmlsZQogICAgIGJ1Y2tldCB3b3VsZCBjYXVzZSB0aGUgaW1tZWRpYXRlIGNsb3N1cmUgb2YgdGhlIHNvY2tldCBvbiBhbnkKICAgICBub24ta2VlcGFsaXZlIHJlcXVlc3RzLiAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIENvcnJlY3QgV2luMzIgZmFpbHVyZSBvZiBtbWFwIG9mIGEgc2VnbWVudCBiZXlvbmQgc3RhcnQgb2YgdGhlCiAgICAgZmlsZTsgZml4ZXMgbGFyZ2UgU1NMIGFuZCBzaW1pbGFyIHRyYW5zZmVycy4gIFtXaWxsaWFtIFJvd2VdCiAgICAgUFIgOTg5OAoKICAqKSBJbXBsZW1lbnQgYXByX3Byb2NfZGV0YWNoIGNoYW5nZXMgYW5kIGFsbG93IC1ETk9fREVUQUNIIGluIHRoZQogICAgIG11bHRpLXByb2Nlc3MgbW9kZSB0byBub3QgImRhZW1vbml6ZSIgd2hpbGUgZGV0YWNoaW5nIGZyb20gdGhlCiAgICAgY29udHJvbGxpbmcgdGVybWluYWwuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBBcGFjaGUgdG8gd29yayB3aXRoCiAgICAgcHJvY2Vzcy1tYW5hZ2VtZW50IHRvb2xzIGxpa2UgQUlYJ3MgIlN5c3RlbSBSZXNvdXJjZSBDb250cm9sbGVyIgogICAgIGFzIHdlbGwgYXMgRGFuIEJlcm5zdGVpbidzICJkYWVtb250b29scyIuCiAgICAgW0pvcyBCYWNrdXMgPGpvc2IgY25jZHNsLmNvbT4sIEFhcm9uIEJhbm5lcnRdCgogICopIENvbnZlcnQgbW9kX2F1dGhfZGlnZXN0IHRvIHVzZSB0aGUgbmV3IGFwcl9nbG9iYWxfbXV0ZXhfdAogICAgIHR5cGUuICBbQWFyb24gQmFubmVydF0KCiAgKikgZml4IGJ1ZyBpbiBtb2QtaW5jbHVkZSB3aGVyZSBpdCB3b3VsZG4ndCBzZW5kIGEgdW5tYXRjaGVkCiAgICAgcGFydCBpZiBpdCB3YXMgYXQgdGhlIGVuZCBvZiBhIGJ1Y2tldCBbSWFuIEhvbHNtYW5dCgogICopIHdvcmtlciBNUE06IEltcHJvdmUgbG9nZ2luZyBvZiBlcnJvcnMgd2l0aCB0aGUgaW50ZXJmYWNlIGJldHdlZW4KICAgICB0aGUgbGlzdGVuZXIgdGhyZWFkIGFuZCB3b3JrZXIgdGhyZWFkcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFNvbWUgYnJvd3NlcnMgaWdub3JlIGNvb2tpZXMgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYQogICAgIHNpbmdsZSBTZXQtQ29va2llIGhlYWRlci4gU2V0LUNvb2tpZSBhbmQgU2V0LUNvb2tpZTIgaGVhZGVycwogICAgIGFyZSBub3cgdW5tZXJnZWQgaW4gdGhlIGh0dHAgcHJveHkgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlCiAgICAgY2xpZW50LiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBhIHByb2JsZW0gd2l0aCBwcm94eSB3aGVyZSBlYWNoIGVudHJ5IG9mIGEgZHVwbGljYXRlZAogICAgIGhlYWRlciBzdWNoIGFzIFNldC1Db29raWUgd291bGQgb3ZlcndyaXRlIGFuZCBvYmxpdGVyYXRlIHRoZQogICAgIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBoZWFkZXIsIHJlc3VsdGluZyBpbiBtdWx0aXBsZSBoZWFkZXIKICAgICB2YWx1ZXMgKGxpa2UgY29va2llcykgZ29pbmcgbWlzc2luZy4KICAgICBbR3JhaGFtIExlZ2dldHQsIEpvc2h1YSBTbGl2ZV0KCiAgKikgQWRkIHRoZSBzZXJ2ZXItbGltaXQgYW5kIHRocmVhZC1saW1pdCB2YWx1ZXMgdG8gdGhlIHNjb3JlYm9hcmQKICAgICBmb3IgdGhlIHNha2Ugb2YgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgogICAgIFtBZGFtIFN1c3NtYW4gPG15ZGRyeW4gdmlzaG51LnZpZHlhLmNvbT5dCgogICopIEZpeCBzZWdmYXVsdCB3aGVuIHByb3h5IHJlY2lldmVzIGFuIGludmFsaWQgSFRUUCByZXNwb25zZSBbSWFuIEhvbHNtYW5dCgogICopIE9TLzM5MDogR2V0IG1ha2UgaW5zdGFsbCB0byBwcm9wZXJseSBjb3B5IERTTyBtb2R1bGVzLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBGaXggYnVnIGluIG1vZF9zdGF0dXMgd2l0aCBkaXNwbGF5aW5nICJSZXN0YXJ0IFRpbWUiCiAgICAgYW5kICJTZXJ2ZXIgdXB0aW1lIi4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IElQdjYgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLiAgW0plZmYgVHJhd2lja10KCiAgKikgSW50cm9kdWNlIEFkZE91dHB1dEZpbHRlckJ5VHlwZSBkaXJlY3RpdmUuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBERUJVR19DR0kgc3VwcG9ydCBpbiBtb2RfY2dpLiAgUFIgOTY3MCwgOTY3MS4KICAgICBbRGF2aWQgTWFjS2VuemllIDxkam0gcGl4Lm5ldD5dCgogICopIEZpeCBpbmNvcnJlY3QgY2hlY2sgZm9yIHNjcmlwdF9pbiBpbiBtb2RfY2dpLiAgUFIgOTY2OS4KICAgICBbRGF2aWQgTWFjS2VuemllIDxkam0gcGl4Lm5ldD5dCgogICopIEZpeCBzZWdmYXVsdCBhbmQgZGlzcGxheSBlcnJvciB3aGVuIFNTTE11dGV4IGZpbGUgY2FuIG5vdCBiZQogICAgIGNyZWF0ZWQuICBbQWRhbSBTdXNzbWFuIDxteWRkcnluIHZpc2hudS52aWR5YS5jb20+XQoKICAqKSBBZGQgcmVmZXJlbmNlIGNvdW50aW5nIHRvIG1vZF9tZW1fY2FjaGUgY2FjaGUgb2JqZWN0cyB0bwogICAgIGJldHRlciBtYW5hZ2UgcmVtb3Zpbmcgb2JqZWN0cyBmcm9tIHRoZSBjYWNoZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ2hhbmdlIHRoZSB2ZXJiYWdlIG9uIHRoZSBTY29yZUJvYXJkRmlsZSBpbiBvdXIgZGVmYXVsdCBjb25maWdzLgogICAgIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGJlIGNvbW1lbnRlZCBvdXQgKHVuc3BlY2lmaWVkKSBzbyB3ZQogICAgIGdldCBhbm9ueW1vdXMgc2hhcmVkIG1lbW9yeSBieSBkZWZhdWx0LiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEltcGxlbWVudCBuZXcgU2NvcmVCb2FyZEZpbGUgZGlyZWN0aXZlIGxvZ2ljLiBUaGlzIGFmZmVjdHMgaG93CiAgICAgd2UgY3JlYXRlIHRoZSBzY29yZWJvYXJkJ3Mgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiBJZiB0aGUgZGlyZWN0aXZlCiAgICAgaXMgcHJlc2VudCwgYSBuYW1lLWJhc2VkIHNlZ21lbnQgaXMgY3JlYXRlZC4gSWYgdGhlIGRpcmVjdGl2ZSBpcwogICAgIG5vdCBwcmVzZW50LCBmaXJzdCBhbiBhbm9ueW1vdXMgc2VnbWVudCBpcyBjcmVhdGVkLCBhbmQgaWYgdGhhdAogICAgIGZhaWxzLCBhIG5hbWUtYmFzZWQgc2VnbWVudCBpcyBjcmVhdGVkIGZyb20gYSBmaWxlIG9mIHRoZSBuYW1lCiAgICAgREVGQVVMVF9TQ09SRUJPQVJELiBUaGlzIGdpdmVzIHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyB0aGUKICAgICBhYmlsaXR5IHRvIGFjY2VzcyBvdXIgc2NvcmVib2FyZC4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBbGxvdyBtb2RfZGVmbGF0ZSB0byB3b3JrIHdpdGggbm9uLUdFVCByZXF1ZXN0cyBhbmQgcHJvcGVybHkgc2VuZAogICAgIENvbnRlbnQtTGVuZ3Rocy4gIFtTYW5kZXIgU3RyaWtlciA8c3RyaWtlciBhcGFjaGUub3JnPl0KCiAgKikgRml4IGFwX2RpcmVjdG9yeV9tZXJnZSgpIHRvIGNvcnJlY3RseSBtZXJnZSBjb25maWdzIHdoZW4gdGhlcmUgaXMKICAgICBubyA8RGlyZWN0b3J5IC8+IGJsb2NrLiAgW0p1c3RpbiBFcmVua3JhbnR6LCBXaWxsaWFtIFJvd2VdCgogICopIFJlbW92ZSBzcHVyaW91cyBkZWJ1ZyBtZXNzc2FnZXMgdGhhdCBhcmUgbm9ybWFsIHVuZGVyIEhUVFAKICAgICBrZWVwLWFsaXZlIGxvZ2ljLiAgW0plZmYgVHJhd2ljaywgSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBhIGJ1ZyBpbiBtb2RfY2dpZCB0aGF0IHdvdWxkIHByZXZlbnQgcHJvcGVyIHNodXRkb3duIGRlYXRoCiAgICAgb2YgdGhlIGNnaWQgcHJvY2Vzcy4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBZGQgc2lnbmFsIGhhbmRsaW5nIGJhY2sgaW4gdG8gdGhlIHdvcmtlciBNUE0gZm9yIHRoZSBvbmVfcHJvY2VzcwogICAgICgtWCwgLURERUJVRywgLURPTkVfUFJPQ0VTUykgY2FzZS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBQZXJmb3JtYW5jZTogUmV1c2UgcGVyLWNvbm5lY3Rpb24gdHJhbnNhY3Rpb24gcG9vbHMgaW4gdGhlCiAgICAgd29ya2VyIE1QTSwgcmF0aGVyIHRoYW4gZGVzdHJveWluZyBhbmQgcmVjcmVhdGluZyB0aGVtLiAgW0JyaWFuIFBhbmVdCgogICopIFJlbW92ZSBhbGwgc2lnbmFscyBmcm9tIHRoZSB3b3JrZXIgTVBNJ3MgY2hpbGQgcHJvY2Vzcy4gIEluc3RlYWQsCiAgICAgdGhlIHBhcmVudCB1c2VzIHRoZSBQaXBlIG9mIERlYXRoIGZvciBhbGwgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQogICAgIGNoaWxkIHByb2Nlc3Nlcy4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzIKCiAgKikgbW9kX25lZ290aWF0aW9uOiBGb3JjZUxhbmd1YWdlUHJpb3JpdHkgbm93IHVzZXMgJ1ByZWZlcicgYXMgdGhlCiAgICAgZGVmYXVsdCBpZiB0aGUgZGlyZWN0aXZlIGlzIG5vdCBzcGVjaWZpZWQuICBUaGlzIG1pcnJvcnMgb2xkZXIKICAgICBiZWhhdmlvciB3aXRob3V0IGNoYW5nZXMgdG8gdGhlIGh0dHBkLmNvbmYuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBXaW4zMjogc29sdmUgdGhlIHdpbjMyIHNlcnZpY2UgcHJvYmxlbXMgaW4gMi4wLjMxLWFscGhhLCBieSBmaXhpbmcKICAgICB0aGUgc2VydmljZSwgbXBtIGFuZCBsb2dnaW5nIGNvZGUsIGFuZCBidWdzIGluIGFwcl9maWxlX29wZW5fc3RkZXJyIAogICAgIGFuZCBhcHJfZmlsZV9kdXAyIGZ1bmN0aW9ucy4gIFdpbjJLL1hQIHNlcnZpY2VzIGhhdmUgbm8gaGFuZGxlcyAKICAgICBhc3NvY2lhdGVkIGZvciBzdGRpbi9vdXQvZXJyLCB3aGljaCBjYXVzZWQgdW5wcmVkaWN0YWJsZSBiZWhhdmlvcgogICAgIGluIHRoZSBwcmlvciByZWxlYXNlLiAgW1dpbGxpYW0gUm93ZSwgQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzI6IHNpbXBsaWZ5IHRoZSBBcHBsaWNhdGlvbiBFdmVudCBMb2cgbWVzc2FnZXMsIHNpbmNlIHRoZXJlIGlzbid0CiAgICAgbGlrZWx5IHRvIGJlICdtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBlcnJvciBsb2cnIGJlZm9yZSBhbiBlcnJvciBsb2cKICAgICBoYXMgYmVlbiBvcGVuZWQuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBXaW4zMjogc3Vic3RhbnRpYWwgY2xlYW51cCB0byB0aGUgbXBtX3dpbm50IGNvZGUgZm9yIGxlZ2liaWxpdHkgYW5kCiAgICAgdG8gZm9sbG93IHRoZSBwcm9ncmFtIGZsb3cgb2Ygb3RoZXIgTVBNcy4gIFtSeWFuIEJsb29tLCBXaWxsaWFtIFJvd2VdCgogICopIFdpbjMyOiBhcGFjaGUgLWsgc2h1dGRvd24gbm93IGJlaGF2ZXMgbGlrZSBhcGFjaGUgLWsgc3RvcC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHByZWZvcmsgdG8gbm90IGtpbGwgdGhlIHBhcmVudCBpZiBhIGNoaWxkIGhpdHMgYSByZXNvdXJjZSBzaG9ydGFnZQogICAgIG9uIGFjY2VwdCgpLiAgW0dyZWcgQW1lc10KCiAgKikgRml4IHNlZyBmYXVsdHMgdGhhdCBvY2N1ciB3aGVuIHdoYXQgc2hvdWxkIGJlIHRoZSBodHRwZCByZXF1ZXN0IGxpbmUKICAgICBzdGFydHMgd2l0aCBcclxuIGZvbGxvd2VkIGJ5IGdhcmJhZ2UuICBbR3JlZyBBbWVzXQoKICAqKSBBbGxvdyBzdGF0aWNhbGx5IGxpbmtlZCBzdXBwb3J0IGJpbmFyaWVzIHdpdGggdGhlIG5ldwogICAgIC0tZW5hYmxlLXN0YXRpYy1zdXBwb3J0IGZsYWcsIGFuZCBlbmFibGUgdGhpcyBiZWhhdmlvciBpbgogICAgIHRoZSBiaW5idWlsZCBzY3JpcHQuIEFsc28gYWRkIGEgbmV3IC0tZW5hYmxlLXN0YXRpYy1odGRibQogICAgIGZsYWcuICBbQWFyb24gQmFubmVydF0KCiAgKikgQWxsb3cgbW9kX2F1dG9pbmRleCB0byBzZXJ2ZSBzeW1saW5rcyBpZiBwZXJtaXR0ZWQgYW5kIGF0dGVtcHQgdG8KICAgICBkbyBvbmx5IG9uZSBzdGF0KCkgY2FsbCB3aGVuIGdlbmVyYXRpbmcgdGhlIGRpcmVjdG9yeSBsaXN0aW5ncy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCByZXNvbHZlX3N5bWxpbmsgdG8gc2F2ZSB0aGUgb3JpZ2luYWwgc3ltbGluayBuYW1lIGlmIGtub3duLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQmUgYSBiaXQgbW9yZSBzYW5lIHdpdGggcmVnYXJkIHRvIENhbm9uaWNhbE5hbWVzLiAgSWYgdGhlIHVzZXIgaGFzCiAgICAgc3BlY2lmaWVkIHRoZXkgd2FudCB0byB1c2UgdGhlIENhbm9uaWNhbE5hbWUsIGJ1dCB0aGV5IGhhdmUgbm90CiAgICAgY29uZmlndXJlZCBhIHBvcnQgd2l0aCB0aGUgU2VydmVyTmFtZSwgdGhlbiB1c2UgdGhlIHNhbWUgcG9ydCB0aGF0IAogICAgIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHVzZWQuIFtSeWFuIEJsb29tIGFuZCBLZW4gQ29hcl0KCiAgKikgSW4gY29yZV9pbnB1dF9maWx0ZXIsIGNoZWNrIGZvciBhbiBlbXB0eSBicmlnYWRlIGFmdGVyIAogICAgIEFQUl9CUklHQURFX05PUk1BTElaRSgpLiAgT3RoZXJ3aXNlLCB3ZSBjYW4gZ2V0IHNlZ2ZhdWx0cyBpZiBhCiAgICAgY2xpZW50IHNheXMgaXQgd2lsbCBwb3N0IHNvbWUgZGF0YSBidXQgd2UgZ2V0IEZJTiBiZWZvcmUgYW55CiAgICAgZGF0YSBhcnJpdmVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgTm90IGJlaW5nIGFibGUgdG8gYmluZCB0byB0aGUgc29ja2V0IGlzIGEgZmF0YWwgZXJyb3IuICBXZSBzaG91bGQKICAgICBwcmludCBhbiBlcnJvciB0byB0aGUgY29uc29sZSwgYW5kIHJldHVybiBhIG5vbi16ZXJvIHN0YXR1cyBjb2RlLgogICAgIFdpdGggdGhlc2UgY2hhbmdlcywgYWxsIG9mIHRoZSBVbml4IE1QTXMgZG8gdGhhdCBjb3JyZWN0bHkuCiAgICAgW1J5YW4gQmxvb21dCgogICopIHN1ZXhlYzogQWxsb3cgSFRUUFMgYW5kIFNTTF8qIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQKICAgICB0aHJvdWdoIHRvIENHSSBzY3JpcHRzLiBQUiA5MTYzCiAgICAgW0JyaWFuIFJlaWQgPGJyZWlkIGN1c3RvbWxvZ2ljLmNvbT4sIAogICAgICBadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPl0KCiAgKikgYmluYnVpbGQuc2g6IE1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUgZXhwYXQgZnJvbSBvdXIgc291cmNlCiAgICAgdHJlZSBzbyB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgc3VycHJpc2VzIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpZDogQWRkIHJldHJ5IGxvZ2ljIGZvciB3aGVuIHRoZSBkYWVtb24gY2FuJ3QgZm9yayBmYXN0CiAgICAgZW5vdWdoIHRvIGtlZXAgdXAgd2l0aCBuZXcgcmVxdWVzdHMuICBTdGFydCB1c2luZyAKICAgICBIVFRQX1NFUlZFUl9VTkFWQUlMQUJMRSBpbnN0ZWFkIG9mIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SCiAgICAgd2hlbiB3ZSBjYW4ndCB0YWxrIHRvIHRoZSBkYWVtb24uICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcHhzOiBMVEZMQUdTIGVudnZhciBjYW4gb3ZlcnJpZGUgZGVmYXVsdCBsaWJ0b29sIG9wdGlvbnMuICBUcnkKICAgICAiTFRGTEFHUz0nICcgYXB4cyAtYyBtb2RfZm9vLmMiIHRvIHNlZSB3aGF0IGxpYnRvb2wgZG9lcyB1bmRlcgogICAgIHRoZSBjb3ZlcnMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgTG9jYXRpb246IHJlc3BvbnNlIGhlYWRlciBmaWVsZCwgdXNlZCBmb3IgZXh0ZXJuYWwKICAgICByZWRpcmVjdCwgKm11c3QqIGJlIGFuIGFic29sdXRlVVJJLiAgVGhlIFJlZGlyZWN0IGRpcmVjdGl2ZQogICAgIHRlc3RlZCBmb3IgdGhhdCwgYnV0IFJlZGlyZWN0TWF0Y2ggZGlkbid0IC0tIGl0IHdvdWxkIGFsbG93CiAgICAgYWxtb3N0IGFueXRoaW5nIHRocm91Z2guICBOb3cgaXQgd2lsbCB0cnkgdG8gdHVybiBhbiBhYnNfcGF0aAogICAgIGludG8gYW4gYWJzb2x1dGVVUkksIGJ1dCBpdCB3aWxsIGNvcnJlY3RseSB2YXJmIGxpa2UgUmVkaXJlY3QKICAgICBpZiB0aGUgZmluYWwgcmVkaXJlY3Rpb24gdGFyZ2V0IGlzbid0IGFuIGFic29sdXRlVVJJLiAgW0tlbiBDb2FyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzEKCiAgKikgQ3JlYXRlIHRoZSBzY29yZWJvYXJkIChpbiB0aGUgcGFyZW50KSBpbiBhIGdsb2JhbCBwb29sIGNvbnRleHQsCiAgICAgc28gaXQgc3Vydml2ZXMgZ3JhY2VmdWwgcmVzdGFydHMuIFRoaXMgZml4ZXMgYSBTRUdWIGR1cmluZwogICAgIGdyYWNlZnVsIHJlc3RhcnRzLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEFkZCBhIHRpbWVvdXQgb3B0aW9uIHRvIHRoZSBwcm94eSBjb2RlICdQcm94eVRpbWVvdXQnIAogICAgIFtJYW4gSG9sc21hbl0KCiAgKikgRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBhcmUgbm93IGFsd2F5cyByZXRyaWV2ZWQgaW4gQVNDSUkgbW9kZS4KICAgICBUaGUgRlRQIHByb3h5IHByb3Blcmx5IGVzY2FwZXMgVVJJJ3MgYW5kIEhUTUwgaW4gdGhlIGdlbmVyYXRlZAogICAgIGxpc3RpbmcsIGFuZCBlc2NhcGVzIHRoZSBwYXRoIGNvbXBvbmVudHMgd2hlbiB0YWxraW5nIHRvIHRoZSBGVFAKICAgICBzZXJ2ZXIuIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBicm93c2UgdGhlIHJvb3QgZGlyZWN0b3J5IGJ5IHVzaW5nCiAgICAgYSB1cmwgbGlrZTogICBmdHA6Ly91c2VyQGhvc3QvJTJmLyAocG9ydGVkIGZyb20gYXBhY2hlXzEuMy4yNCkKICAgICBBbHNvLCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzCiAgICAgJyonIGFuZCAnPycsIGFuZCBpZiB0aGV5IGRvLCBhIGRpcmVjdG9yeSBsaXN0aW5nIGlzIGNyZWF0ZWQgaW5zdGVhZAogICAgIG9mIGEgZmlsZSByZXRyaWV2YWwuIEV4YW1wbGU6IGZ0cDovL3VzZXJAaG9zdC9odHRwZC9zZXJ2ZXIvKi5jCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGRlZCBzaW5nbGUtbGlzdGVuZXIgdW5zZXJpYWxpemVkIGFjY2VwdCBzdXBwb3J0IHRvIHRoZQogICAgIHdvcmtlciBNUE0gW0JyaWFuIFBhbmVdCgogICopIE5ldyBEaXJlY3RpdmUgZm9yIG1vZF9wcm94eTogJ1Byb3h5UHJlc2VydmVIb3N0Jy4gVGhpcyBwYXNzZXMKICAgICB0aGUgaW5jb21pbmcgaG9zdCBoZWFkZXIgdGhyb3VnaCB0byB0aGUgcHJveGllZCBzZXJ2ZXIKICAgICBbR2VvZmYgPGcucnVzc2VsbCBpZWVlLm9yZz5dCgogICopIE5ldyBEaXJlY3RpdmUgT3B0aW9uIGZvciBQcm94eVBhc3MuIEl0IG5vdyBjYW4gYmxvY2sgYSBsb2NhdGlvbgogICAgIGZyb20gYmVpbmcgcHJveGllZCBbSnVra2EgUGlobCA8anVra2EucGlobCBlbnRpcmVtLmNvbT5dCgogICopIERvbid0IGxldCB0aGUgZGVmYXVsdCBoYW5kbGVyIHRyeSB0byBzZXJ2ZSBhIHJhdyBkaXJlY3RvcnkuICBBdAogICAgIGJlc3QgeW91IGdldCBnaWJiZXJpc2guICBNdWNoIHdvcnNlIHRoaW5ncyBjYW4gaGFwcGVuIGRlcGVuZGluZwogICAgIG9uIHRoZSBPUy4gIFtKZWZmIFRyYXdpY2tdCiAgICAgCiAgKikgQ2hhbmdlIHRoZSBwcmVfY29uZmlnIGhvb2sgdG8gcmV0dXJuIGEgdmFsdWUuIE1vZHVsZXMgY2FuIG5vdyBlbWl0CiAgICAgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGhlbiBjYXVzZSB0aGUgc2VydmVyIHRvIHF1aXQgZ3JhY2VmdWxseSBkdXJpbmcKICAgICBzdGFydHVwLiBUaGlzIHJlcXVpcmVkIGEgYnVtcCB0byB0aGUgTU1OLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzb21lIHVuaXggc29ja2V0IGRlc2NyaXB0b3IgbGVha3MgaW4gdGhlIGhhbmRsZXIgc2lkZSBvZgogICAgIG1vZF9jZ2lkICh0aGUgcGFydCB0aGF0IHJ1bnMgaW4gdGhlIHNlcnZlciBwcm9jZXNzKS4gIFdoYWNrIGEKICAgICBzaWxseSAiY2xvc2UoLTEpIiBpbiB0aGUgaGFuZGxlciB0b28uICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIHByZV9tcG0gaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgc28gdGhhdCBzY29yZWJvYXJkCiAgICAgaW5pdCBlcnJvcnMgcGVyY29sYXRlIHVwIHRvIGNvZGUgdGhhdCBrbm93cyBob3cgdG8gZXhpdCAKICAgICBjbGVhbmx5LiAgVGhpcyByZXF1aXJlZCBhIGJ1bXAgdG8gdGhlIE1NTi4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgc29ja2V0IGJhY2sgdG8gdGhlIGNvbm5fcmVjIGFuZCByZW1vdmUgdGhlIGNyZWF0ZV9jb25uZWN0aW9uCiAgICAgaG9vay4gVGhlIGNyZWF0ZV9jb25uZWN0aW9uIGhvb2sgaGFkIGEgZGVzaWduIGZsYXcgdGhhdCBkaWQgbm90IAogICAgIGFsbG93IGNyZWF0aW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIHZob3N0IGluZm8uIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXhlZCBQQVRIX0lORk8gYW5kIFFVRVJZX1NUUklORyBmcm9tIG1vZF9uZWdvdGlhdGlvbiByZXN1bHRzLgogICAgIFJlc29sdmVzIHRoZSBjb21tb24gY2FzZSBvZiB1c2luZyBuZWdvdGF0aW9uIHRvIHJlc29sdmUgdGhlIHJlcXVlc3QKICAgICAvc2NyaXB0L2ZvbyBmb3IgL3NjcmlwdC5jZ2kvZm9vLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkZWQgbmV3IGZ1bmN0aW9ucyBhcF9hZGRfKGlucHV0fG91dHB1dClfZmlsdGVyX2hhbmRsZSB0bwogICAgIGFsbG93IG1vZHVsZXMgdG8gYnlwYXNzIHRoZSB1c3VhbCBmaWx0ZXIgbmFtZSBsb29rdXAgd2hlbgogICAgIGFkZGluZyBoYXJkLWNvZGVkIGZpbHRlcnMgdG8gYSByZXF1ZXN0IFtCcmlhbiBQYW5lXQoKICAqKSBjYWNoaW5nIHNob3VsZCBub3cgd29yayBvbiBzdWJyZXF1ZXN0cyAoc3RpbGwgdmVyeSBleHBlcmltZW50YWwpCiAgICAgW0lhbiBIb2xzbWFuXQogIAogICopIFRoZSBXaW4zMiBtcG1fd2lubnQgbm93IGhhcyBhIHNoYXJlZCBzY29yZWJvYXJkLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ2hhbmdlIGFwX2dldF9icmlnYWRlIHByb3RvdHlwZSB0byB1c2UgYXByX29mZl90IGluc3RlYWQgb2YgYXByX29mZl90Ki4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJlZmFjdG9yIGFwX3JnZXRsaW5lIHNvIHRoYXQgaXQgZG9lcyBub3QgdXNlIGFuIGludGVybmFsIGJyaWdhZGUuCiAgICAgQ2hhbmdlIGFwX3JnZXRsaW5lJ3MgcHJvdG90eXBlIHRvIHJldHVybiBlcnJvcnMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJlbW92ZSBtb2RfYXV0aF9kYi4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRG8gbm90IGluc3RhbGwgdW5uZWNlc3NhcnkgcGNyZSBoZWFkZXJzIGxpa2UgY29uZmlnLmggYW5kIGludGVybmFsLmguCiAgICAgW0pvZSBPcnRvbiA8am9lIG1hbnlmaXNoLmNvLnVrPl0KCiAgKikgQ2hhbmdlIGluIHF1aWNrX2hhbmxkZXIgYmVoYXZpb3IgZm9yIHN1YnJlcXVlc3RzLiBpdCBub3cgcGFzc2VzIERPTkUKICAgICAoYXMgaXQgZG9lcyBmb3IgYSBub3JtYWwgcmVxdWVzdCkuIHF1aWNrX2hhbmRsZWQgc3ViLXJlcXVlc3RzIG5vdyB3b3JrCiAgICAgaW4gbW9kLWluY2x1ZGUgW0lhbiBIb2xzbWFuXQoKICAqKSBDaGFuZ2UgU1VCUkVRX0NPUkUgc28gdGhhdCBpdCBpcyBhICdIVFRQX0hFQURFUicgZmlsdGVyIGluc3RlYWQgb2YKICAgICAnQ09OVEVOVCcgb25lLCBhcyBpdCBuZWVkcyB0byBydW4gQUZURVIgYWxsIGNvbnRlbnQgaGVhZGVycwoKICAqKSBSZW5hbWUgQmVPUyBNUE0gZGlyZWN0aXZlIFJlcXVlc3RzUGVyVGhyZWFkIHRvIE1heFJlcXVlc3RzUGVyVGhyZWFkLgogICAgIFtMYXJzIEVpbGVicmVjaHRdCgogICopIFNwbGl0IG91dCBibG9ja2luZyBmcm9tIHRoZSBtb2RlIGluIHRoZSBpbnB1dCBmaWx0ZXJzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gbW9kX2luY2x1ZGUuICBbSnVzdGluIEVyZW5rcmFudHosIEplZmYgVHJhd2lja10KCiAgKikgQ2F1c2UgV2luMzIgdG8gY2FwdHVyZSBhbGwgY2hpbGQtd29ya2VyIHByb2Nlc3MgZXJyb3JzIGluCiAgICAgQXBhY2hlIHRvIHRoZSBtYWluIHNlcnZlciBlcnJvciBsb2csIHVudGlsIHRoZSBjaGlsZCBjYW4KICAgICBvcGVuIGl0cyBvd24gZXJyb3IgbG9ncy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEhQVVggMTEuKjogRG8gbm90IGtpbGwgdGhlIGNoaWxkIHByb2Nlc3Mgd2hlbiBhY2NlcHQoKSAKICAgICByZXR1cm5zIEVOT0JVRlMgb24gSFBVWCAxMS4qLiAocG9ydGVkIGZyb20gdGggMS4zIHBhdGNoKQogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+LCBCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBwcm9ibGVtIGluIHRoZSBwYXJzaW5nIG9mIHRoZSA8UHJveHkgZm9vPiBkaXJlY3RpdmUuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgcmV3cml0ZSBvZiBtb2Rfc3NsIGlucHV0IGZpbHRlciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBsZXNzCiAgICAgbWVtb3J5IHVzYWdlIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGFsbG93IHF1aWNrX2hhbmRsZXIgdG8gYmUgcnVuIG9uIHN1YnJlcXVlc3RzLiBbSWFuIEhvbHNtYW5dCgogICopIG1vZF9kYXYgbm93IGFza3MgaXRzIHByb3ZpZGVyIHRvIHBsYWNlIGNvbnRlbnQgZGlyZWN0bHkgaW50byB0aGUKICAgICBmaWx0ZXIgc3RhY2sgd2hlbiBoYW5kbGluZyBhIEdFVCByZXF1ZXN0LiBUaGUgbW9kX2Rhdi9wcm92aWRlcgogICAgIEFQSSBoYXMgY2hhbmdlZCwgc28gcHJvdmlkZXJzIG5lZWQgdG8gYmUgdXBkYXRlZC4gW0dyZWcgU3RlaW5dCgogICopIENsZWFyIHRoZSBvdXRwdXQgc29ja2V0IGRlc2NyaXB0b3IgaW4gdW5peGRfYWNjZXB0KCkgdG8gbWFrZSBzdXJlCiAgICAgd2UgZG9uJ3Qgc3VwcGx5IGEgYm9ndXMgc29ja2V0IHRvIHRoZSBjYWxsZXIgaWYgdGhlIGFjY2VwdCBmYWlscy4KICAgICBUaGlzIGNhdXNlZCBwcm9ibGVtcyB3aXRoIHRoZSB3b3JrZXIgTVBNLCB3aGljaCB0cmllZCB0byBwcm9jZXNzCiAgICAgdGhlIHJldHVybmVkIHNvY2tldCBpZiBpdCB3YXMgbm9uLU5VTEwuICBbQnJpYW4gUGFuZV0KCiAgKikgTW92ZSBhIGNoZWNrIGZvciBhbiBlbXB0eSBicmlnYWRlIHRvIHRoZSBzdGFydCBvZiBjb3JlIGlucHV0IGZpbHRlcgogICAgIHRvIGF2b2lkIHNlZ2ZhdWx0cy4gIFtKdXN0aW4gRXJlbmtyYW50eiwgSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgRmlsZUVUYWcgZGlyZWN0aXZlIHRvIGFsbG93IGNvbmZpZ3VyYWJsZSBjb250cm9sIG9mIHdoYXQKICAgICBkYXRhIGFyZSB1c2VkIHRvIGZvcm0gRVRhZyB2YWx1ZXMgZm9yIGZpbGUtYmFzZWQgVVJJcy4gIE1NTgogICAgIGJ1bXBlZCB0byAyMDAyMDExMSBiZWNhdXNlIG9mIGZpZWxkcyBhZGRlZCB0byB0aGUgZW5kIG9mCiAgICAgdGhlIGNvcmVfZGlyX2NvbmZpZyBzdHJ1Y3R1cmUuICBbS2VuIENvYXJdCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIG1vZF9yZXdyaXRlJ3MgbG9nZ2luZyBjb2RlIGNhdXNlZCBieSBwYXNzaW5nIHRoZQogICAgIHdyb25nIGNvbmZpZyB0byBhcF9nZXRfcmVtb3RlX2hvc3QoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFsbG93IG1vZF9jZ2lkIHRvIHdvcmsgZnJvbSBhIGJpbmFyeSBkaXN0cmlidXRpb24gaW5zdGFsbCBieQogICAgIHVzaW5nIDc1NSBmb3IgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBsb2cgZGlyZWN0b3J5IGluc3RlYWQgb2YKICAgICA3NTAuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXhlZCBhIHNlZ2ZhdWx0IHRoYXQgaGFwcGVuZWQgZHVyaW5nIGdyYWNlZnVsIHNodXRkb3duIChvciB3aGVuCiAgICAgdGhlIGh0dHBkIHJhbiBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycykgd2l0aCB0aGUgd29ya2VyIE1QTSBbQnJpYW4gUGFuZV0KCiAgKikgU3BsaXQgYWxsIFdpbjMyIG1vZHVsZXMgW2V4Y2x1ZGluZyB0aGUgY29yZSBjb21wb25lbnRzIG1vZF9jb3JlLCAKICAgICBtb2Rfc28sIG1vZF93aW4zMiBhbmQgdGhlIHdpbm50IG1wbV0gaW50byBpbmRpdmlkdWFsIGxvYWRhYmxlCiAgICAgbW9kdWxlcywgc28gdGhlIGFkbWluaXN0cmF0b3IgbWF5IGluZGl2aWR1YWxseSBkaXNhYmxlIHRoZSBmb3JtZXIKICAgICBjb21waWxlZC1pbiBtb2R1bGVzIGJ5IHNpbXBseSBjb21tZW50aW5nIG91dCB0aGVpciBMb2FkTW9kdWxlCiAgICAgZGlyZWN0aXZlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNhdmVkIFdpbjMyIG1vZHVsZSBhdXRob3JzIGFuZCBwb3J0ZXJzIG1hbnkgZnV0dXJlIGhlYWRhY2hlcywgYnkKICAgICBkdXBsaWNhdGluZyB0aGUgYXBwcm9wcmlhdGUgLmggZmlsZXMgc3VjaCBhcyBvcy5oIGludG8gdGhlIGluY2x1ZGUKICAgICBkaXJlY3RvcnksIGluY2x1ZGluZyBpbiB0aGUgYnVpbGQgdHJlZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIG1vZF9zc2wgYWRqdXN0bWVudHMgdG8gaGVscCB3aXRoIHVzaW5nIHRvb2xraXRzIG90aGVyIHRoYW4gT3BlblNTTDoKICAgICAgVXNlIFNTTCBmdW5jdGlvbnMvbWFjcm9zIGluc3RlYWQgb2YgZGlyZWN0bHkgZGVyZWZlcmVuY2luZyBTU0wKICAgICAgc3RydWN0dXJlcyB3aGVyZXZlciBwb3NzaWJsZS4KICAgICAgQWRkIHR5cGUtY2FzdHMgZm9yIHRoZSBjYXNlcyB3aGVyZSBmdW5jdGlvbnMgcmV0dXJuIGEgZ2VuZXJpYyBwb2ludGVyLgogICAgICBBZGQgJFNTTC9pbmNsdWRlIHRvIGNvbmZpZ3VyZSBzZWFyY2ggcGF0aC4KICAgICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPl0KCiAgKikgTW92ZWQgc2V2ZXJhbCBwb2ludGVycyBvdXQgb2YgdGhlIHNoYXJlZCBTY29yZWJvYXJkIHNvIGl0IGlzCiAgICAgbW9yZSBwb3J0YWJsZSwgYW5kIHdpbGwgcHJlc2VudCB0aGUgdmhvc3QgbmFtZSBhY3Jvc3Mgc2VydmVyCiAgICAgZ2VuZXJhdGlvbiByZXN0YXJ0cy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBTU0xQYXNzUGhyYXNlRGlhbG9nIGV4ZWM6IGFuZCBTU0xSYW5kb21TZWVkIGV4ZWM6CiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjMwCgogICopIEZpeCB0aGUgbWFpbiBidWcgZm9yIEZyZWVCU0QgYW5kIHRocmVhZGVkIE1QTSdzLiBUaGVyZSBhcmUKICAgICBzdGlsbCBpc3N1ZXMgKHNlZSBTVEFUVVMpIGJ1dCBhdCBsZWFzdCB0aGUgc2VydmVyIHdpbGwgbm93CiAgICAgcnVuIHdpdGhvdXQgY3Jhc2hpbmcgdGhlIG1hY2hpbmUuCiAgICAgW0RhdmlkIFJlaWQsIEFhcm9uIEJhbm5lcnQsIEp1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggYSB0eXBvIGluIG1vZF9kZWZsYXRlJ3MgbTQgY29uZmlnIHNlY3Rpb24uCiAgICAgW2FsYmVydCBjaGluIDxjaGluYSB0aGV3cml0dGVud29yZC5jb20+XQoKICAqKSBGaXggYSBjb3VwbGUgb2YgbW9kX3Byb3h5IHByb2JsZW1zIGZvcndhcmRpbmcgSFRUUCBjb25uZWN0aW9ucwogICAgIGFuZCBoYW5kbGluZyBDT05ORUNUOgogICAgICgxKSBQUiAjOTE5MCAgUHJveHkgZmFpbGVkIHRvIGNvbm5lY3QgdG8gSVB2NiBob3N0cy4KICAgICAoMikgUHJveHkgZmFpbGVkIHRvIGNvbm5lY3Qgd2hlbiB0aGUgZmlyc3QgSVAgYWRkcmVzcyByZXR1cm5lZCBieSAKICAgICAgICAgdGhlIHJlc29sdmVyIHdhcyB1bnJlYWNoYWJsZSBidXQgYSBzZWNvbmRhcnkgSVAgYWRkcmVzcyB3YXMuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdGhlIG1vZHVsZSBpZGVudGlmZXIgYXMgc2hvd24gaW4gdGhlIGRvY3MgZm9yIHZhcmlvdXMgY29yZQogICAgIG1vZHVsZXMgKGUuZy4sIHRoZSBpZGVudGlmZXIgZm9yIG1vZF9sb2dfY29uZmlnIHdhcyBwcmV2aW91c2x5CiAgICAgbGlzdGVkIGFzIGNvbmZpZ19sb2dfbW9kdWxlKS4gIFBSICM5MzM4CiAgICAgW0phbWVzIFdhdHNvbiA8YXAyYnVnIHNvd2VnYS5vcmc+XQoKICAqKSBGaXggTGltaXRSZXF1ZXN0Qm9keSBkaXJlY3RpdmUgYnkgcGxhY2luZyBpdCBpbiB0aGUgSFRUUAogICAgIGZpbHRlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IG1vZF9wcm94eSBzZWcgZmF1bHQgd2hlbiB0aGUgcHJveGllZCBzZXJ2ZXIgcmV0dXJucyAKICAgICBhbiBIVFRQLzAuOSByZXNwb25zZSBvciBhIGJvZ3VzIHN0YXR1cyBsaW5lLgogICAgIFtBZGFtIFN1c3NtYW5dCgogICopIFByZXZlbnQgbW9kX3Byb3h5IGZyb20gdHJ1bmNhdGluZyBvbmUgY2hhcmFjdGVyIG9mZiB0aGUKICAgICBlbmQgb2YgdGhlIHN0YXR1cyBsaW5lIHJldHVybmVkIGZyb20gdGhlIHByb3hpZWQgc2VydmVyLgogICAgIFtBZGFtIFN1c3NtYW4sIEJpbGwgU3RvZGRhcmRdCgogICopIEVsaW1pbmF0ZSBsb29wIGluIGFwX3Byb3h5X3N0cmluZ19yZWFkKCkuCiAgICAgW0FkYW0gU3Vzc21hbiwgQmlsbCBTdG9kZGFyZF0KCiAgKikgUHJvdmlkZSAkMC4uJDkgcmVzdWx0cyBmcm9tIG1vZF9pbmNsdWRlIHJlZ2V4IHBhcnNpbmcuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWxsb3cgbW9kLWluY2x1ZGUgdG8gbG9vayBmb3IgYWx0ZXJuYXRlIHN0YXJ0ICYgZW5kIHRhZ3MgW0lhbiBIb2xzbWFuXQoKICAqKSBJbnRyb2R1Y2VkIHRoZSBGb3JjZUxhbmd1YWdlUHJpb3JpdHkgZGlyZWN0aXZlLCB0byBwcmV2ZW50CiAgICAgcmV0dXJuaW5nIE1VTFRJUExFX0NIT0lDRVMgb3IgTk9ORV9BQ0NFUFRBQkxFIGluIHNvbWUgY2FzZXMsCiAgICAgd2hlbiB1c2luZyBNdWx0aXZpZXdzLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGEgcHJvYmxlbSB3aGljaCBwcmV2ZW50ZWQgbW9kX2NnaWQgYW5kIHN1ZXhlYyBmcm9tIHdvcmtpbmcKICAgICB0b2dldGhlciByZWxpYWJseSBbR3JlZyBBbWVzXQoKICAqKSBSZW1vdmUgdGhlIGNhbGwgdG8gZXhpdCgpIGZyb20gd2l0aGluIG1vZF9hdXRoX2RpZ2VzdCdzIHBvc3RfY29uZmlnCiAgICAgcGhhc2UuICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IGEgcHJvYmxlbSBpbiBtb2RfYXV0aF9kaWdlc3QgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBjYXVzZQogICAgIHByb2JsZW1zIHdpdGggaW5pdGlhbGl6ZWQgc3RhdGljIGRhdGEgb24gYSBzeXN0ZW0gdGhhdCB1c2VzIERTT3MuCiAgICAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIHRoZSB3b3JrZXIgTVBNIHRoYXQgY291bGQgaGFwcGVuIGR1cmluZwogICAgIGNoaWxkIHByb2Nlc3MgZXhpdHMuICBbQnJpYW4gUGFuZSwgQWFyb24gQmFubmVydF0KCiAgKikgQWxsb3cgbW9kX2F1dGhfZGJtIHRvIGhhbmRsZSBtdWx0aXBsZSBEQk0gdHlwZXMgW0lhbiBIb2xzbWFuXQoKICAqKSBGaXggbWF0Y2hpbmcgb2Ygdmhvc3RzIGJ5IGlwIGFkZHJlc3Mgc28gd2UgZmluZCBJUHY0CiAgICAgdmhvc3QgYWRkcmVzcyB3aGVuIHRhcmdldCBhZGRyZXNzIGlzIHY0LW1hcHBlZCBmb3JtIG9mCiAgICAgdGhhdCBhZGRyZXNzLiAgW0plZmYgVHJhd2lja10KCiAgKikgTW9yZSBwZXJmb3JtYW5jZSB0d2Vha3MgdG8gdGhlIEJORE0gc3RyaW5nLXNlYXJjaCBhbGdvcml0aG0KICAgICB1c2VkIHRvIGZpbmQgIjwhLS0jIiB0b2tlbnMgaW4gbW9kX2luY2x1ZGUgW0JyaWFuIFBhbmVdCgogICopIE1pc2NlbGxhbmVvdXMgc21hbGwgcGVyZm9ybWFuY2UgZml4ZXM6IG9wdGltaXplZCBhd2F5IHZhcmlvdXMKICAgICBzdHJpbmcgY29weSBvcGVyYXRpb25zIGFuZCByZW1vdmVkIGxhcmdlIHRlbXAgYnVmZmVycyBmcm9tCiAgICAgdGhlIHN0YWNrIFtCcmlhbiBQYW5lXQoKICAqKSBGaXhlZCBzdGFydHVwIHNlZ2ZhdWx0IHRoYXQgb2NjdXJyZWQgd2hlbiBhIFZpcnR1YWxIb3N0CiAgICAgZGlyZWN0aXZlIGhhZCBhIHBvcnQgYnV0IG5vIGFkZHJlc3MgW0JyaWFuIFBhbmVdCgogICopIEFsbG93IGh0ZGJtIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBEQk0gdHlwZXMgW0lhbiBIb2xzbWFuXQoKICAqKSBXaW4zMjogTWFkZSBjaGFuZ2UgdG8gYXByX3NlbmRmaWxlKCkgdG8gcmV0dXJuIEFQUl9FTk9USU1QTAogICAgIGlmIG9zbGV2ZWwgPCBXSU5OVC4gIFRoaXMgc2hvdWxkIGZpeCBzZXZlcmFsIHByb2JsZW1zIHJlcG9ydGVkCiAgICAgQWdhaW5zdCAyLjAuMjggb24gV2luZG93cyA5OCBbQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzI6IEZpeCBidWcgdGhhdCBjb3VsZCBjYXVzZSBDR0kgc2NyaXB0cyB3aXRoIFFVRVJZX1NUUklOR1MKICAgICB0byBmYWlsLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ2hhbmdlIGNvcmUgY29kZSB0byBhbGxvdyBhbiBNUE0gdG8gc2V0IGhhcmQgdGhyZWFkL3NlcnZlcgogICAgIGxpbWl0cyBhdCBzdGFydHVwLiAgcHJlZm9yaywgd29ya2VyLCBhbmQgcGVyY2hpbGQgTVBNcyBub3cgaGF2ZSAKICAgICBkaXJlY3RpdmVzIHRvIHNldCB0aGVzZSBsaW1pdHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogVGhlIGFzeW5jIEFjY2VwdEV4KCkgZXZlbnQgc2hvdWxkIGJlIGF1dG9yZXNldCB1cG9uCiAgICAgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGEgd2FpdCAoV2FpdEZvclNpbmdsZU9iamVjdCkuIFRoaXMKICAgICBlbGltaW5hdGVzIGEgbnVtYmVyIG9mIHNwdXJpb3VzCiAgICAgc2V0c29ja29wdChTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQpIGZhaWxlZC4iIG1lc3NhZ2VzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBNb3ZlIGFueSBsb2FkIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3V0IG9mIAogICAgIGFwYWNoZWN0bCBhbmQgaW50byBhIHNlcGFyYXRlIGVudmlyb25tZW50IHZhcmlhYmxlIGZpbGUgd2hpY2gKICAgICBjYW4gYmUgbW9yZSBlYXNpbHkgdGFpbG9yZWQgYnkgdGhlIGFkbWluLiAgVGhlIGVudmlyb25tZW50CiAgICAgdmFyaWFibGUgZmlsZSBhcyBidWlsdCBieSBBcGFjaGUgbWF5IGhhdmUgYWRkaXRpb25hbCBzeXN0ZW0tCiAgICAgc3BlY2lmaWMgc2V0dGluZ3MuICBGb3IgZXhhbXBsZSwgb24gT1MvMzkwIHdlIHRhaWxvciB0aGUgaGVhcAogICAgIHNldHRpbmdzIHRvIGFsbG93IGxvdHMgb2YgdGhyZWFkcy4gIFtKZWZmIFRyYXdpY2tdCiAgICAKICAqKSBVc2UgdGhlIG5ldyBBUFIgcG9vbCBjb2RlIHRvIHJlZHVjZSBwb29sLXJlbGF0ZWQgbG9jawogICAgIGNvbnRlbnRpb24gaW4gdGhlIHdvcmtlciBNUE0uICBbU2FuZGVyIFN0cmlrZXJdCgogICopIFRoZSBQT0Qgbm8gbG9uZ2VyIGFzc3VtZXMgdGhlIGNoaWxkIGlzIGxpc3RlbmluZyBvbiAxMjcuMC4wLjEKICAgICBhbmQgbm93IHB1bGxzIHRoZSBmaXJzdCBob3N0bmFtZSBpbiB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgdG8KICAgICBwZXJmb3JtIHRoZSBkdW1teSBjb25uZWN0IG9uLiBUaGlzIGZpeGVzIGEgYnVnIHdoZW4gdGhlIHVzZXIKICAgICBoYWQgY29uZmlndXJlZCB0aGUgTGlzdGVuIGRpcmVjdGl2ZSBmb3IgYW4gSVAgb3RoZXIgdGhhbgogICAgIDEyNy4wLjAuMS4gVGhpcyB3b3VsZCByZXN1bHQgaW4gdW5kZWFkIGNoaWxkcmVuIGFuZCBlcnJvcgogICAgIG1lc3NhZ2VzIHN1Y2ggYXMgIkNvbm5lY3Rpb24gcmVmdXNlZDogY29ubmVjdCB0byBsaXN0ZW5lciIuCiAgICAgW0Fhcm9uIEJhbm5lcnRdCgogICopIFRoZSB3b3JrZXIgTVBNIG5vdyByZXNwZWN0cyB0aGUgTG9ja0ZpbGUgc2V0dGluZywgbmVlZGVkIHRvCiAgICAgYXZvaWQgbG9ja2luZyBwcm9ibGVtcyB3aXRoIE5GUy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzZWdmYXVsdCB3aGVuIHdvcmtlciBNUE0gcmVjZWl2ZXMgU0lHSFVQLgogICAgIFtJYW4gSG9sc21hbiwgQWFyb24gQmFubmVydCwgSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBidWcgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBwcmV2ZW50IHRoZSBwZXJjaGlsZCBNUE0gZnJvbQogICAgIHdvcmtpbmcgd2l0aCBtb3JlIHRoYW4gb25lIHZob3N0L3VpZC4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBDaGFuZ2UgbWFrZSBpbnN0YWxsIGFuZCBhcHhzIC1pIHByb2Nlc3Npbmcgb2YgRFNPIG1vZHVsZXMgdG8gCiAgICAgcGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIG9uIHBsYXRmb3JtcyB3aGVyZSBsaWJ0b29sIGRvZXNuJ3QgaW5zdGFsbCAKICAgICBtb2RfZm9vLnNvLiAgVGhpcyBmaXhlcyBzb21lIHdvbmtpbmVzcyBvbiBIUC1VWCwgVHJ1NjQsIGFuZCBBSVggCiAgICAgd2hpY2ggcHJldmVudGVkIHN0YW5kYXJkIExvYWRNb2R1bGUgc3RhdGVtZW50cyBmcm9tIHdvcmtpbmcuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgV2hlbmV2ZXIgbW9kX3NvIGlzIGVuYWJsZWQgKG5vdCBqdXN0IHdoZW4gdGhlcmUgYXJlIERTT3MgZm9yCiAgICAgb3VyIG1vZHVsZXMpLCBkbyB3aGF0ZXZlciBzcGVjaWFsIG1hZ2ljIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcvCiAgICAgbG9hZGluZyB0aGlyZC1wYXJ0eSBtb2R1bGVzLiAgVGhpcyBhbGxvd3MgdGhpcmQtcGFydHkgRFNPcyB0bwogICAgIGJlIHVzZWQgb24gYW4gQUlYIGJ1aWxkIHdoZW4gdGhlcmUgd2VyZSBubyBidWlsdC1pbiBtb2R1bGVzCiAgICAgYnVpbHQgYXMgRFNPcy4gIChUaGlzIHNob3VsZCBoZWxwIG9uIE9TLzM5MCBhbmQgQmVPUyBhcyB3ZWxsLikKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBhcHhzIHRvIGJlIHVzZWQgdG8gYnVpbGQgRFNPcyBvbiBBSVggd2l0aG91dCByZXF1aXJpbmcgdGhlCiAgICAgdXNlciB0byBoYXJkLWNvZGUgdGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKFRoaXMgc2hvdWxkIGhlbHAKICAgICBvbiBPUy8zOTAgYW5kIEJlT1MgYXMgd2VsbC4pICBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIFJlc29sdmVkIHNlZ2ZhdWx0IGluIG1vZF9pc2FwaSB3aGVuIGNvbmZpZ3VyaW5nIHdpdGggSVNBUElDYWNoZUZpbGUuCiAgICAgUFIgODU2MywgODkxOSAgW1dpbGxpYW0gUm93ZV0KICAKICAqKSBHZXQgYmluYXJ5IGJ1aWxkcyB3b3JraW5nIHdoZW4gbGliYXByIGFuZCBsaWJhcHJ1dGlsIGFyZSBidWlsdAogICAgIHNoYXJlZCBbR3JlZyBBbWVzXQoKICAqKSBHZXQgc2hhcmVkIGJ1aWxkcyBvZiBsaWJhcHIgYW5kIGxpYmFwcnV0aWwsIGFzIHdlbGwgYXMgQXBhY2hlIERTT3MsCiAgICAgd29ya2luZyBvbiBBSVguICBbQWFyb24gQmFubmVydCwgRGljayBEdW5iYXIgPFJMRHVuYmFyIHBhY2JlbGwubmV0PiwKICAgICBHYXJ5IEhvb2sgPGdob29rIHVzLmlibS5jb20+LCBWaWN0b3IgT3JsaWtvd3NraSwgSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdGhlIGhhbmRsaW5nIG9mIFNTSSBkaXJlY3RpdmVzIGluIHdoaWNoIHRoZSAiPiIgb2YgdGhlCiAgICAgdGVybWluYXRpbmcgIi0tPiIgaXMgdGhlIGxhc3QgYnl0ZSBpbiBhIGZpbGUgW0JyaWFuIFBhbmVdCgogICopIEFkZCBiYWNrIGluIHRoZSAic3VFWEVDIG1lY2hhbmlzbSBlbmFibGVkICh3cmFwcGVyOiAvcGF0aC90by9zdWV4ZWMpIgogICAgIG1lc3NhZ2UgdGhhdCB3ZSBoYWQgYmFjayBpbiBhcGFjaGUtMS4zIGFuZCBzdGlsbCBoYXZlIHNjYXR0ZXJlZAogICAgIHRocm91Z2hvdXQgb3VyIGRvY3MuICBbQWFyb24gQmFubmVydF0KCiAgKikgUHJldmVudCB0aGUgV2luMzIgcG9ydCBmcm9tIGNvbnRpbnVpbmcgYWZ0ZXIgZW5jb3VudGVyaW5nIGFuCiAgICAgZXJyb3IgaW4gdGhlIGNvbW1hbmQgbGluZSBhcmdzIHRvIGFwYWNoZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIE9uIGEgZXJyb3IgaW4gdGhlIHByb3h5LCBtYWtlIGl0IHdyaXRlIGEgbGluZSB0byB0aGUgZXJyb3IgbG9nCiAgICAgW0lhbiBIb2xzbWFuXQoKICAqKSBWYXJpb3VzIG1vZF9zc2wgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIFtEb3VnIE1hY0VhY2hlcm5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yOQoKICAqKSBBZGQgYnVmZmVyaW5nIGluIGNvcmVfb3V0cHV0X2ZpbHRlciB0byBlbnN1cmUgdGhhdCBsb25nCiAgICAgbGlzdHMgb2Ygc21hbGwgYnVja2V0cyBkb24ndCBjYXVzZSBzbWFsbCBwYWNrZXQgd3JpdGVzLgogICAgIFtCcmlhbiBQYW5lLCBSeWFuIEJsb29tXQoKICAqKSBGaXggdGhlIGluc3RhbGxhdGlvbiB0YXJnZXQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1hbnVhbCBpcyAKICAgICBpbnN0YWxsZWQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgW1lvc2hpZnVtaSBIaXJhbWF0c3UgPGhpcmFtYXR1IGJvcmVhcy5kdGkubmUuanA+IGFuZAogICAgICBHb21leiBIZW5yaSA8aGdvbWV6IHNsaWIuZnI+XQoKICAqKSBGaXggdGhlIGNtZCBjb21tYW5kIGZvciBtb2RfaW5jbHVkZS4gIFdoZW4gd2UgYXJlIHByb2Nlc3NpbmcKICAgICBhIGNtZCBjb21tYW5kLCB3ZSBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHItPmZpbGVuYW1lIHRvIHNldAogICAgIHRoZSBjb21tYW5kIG5hbWUuICBUaGUgY29tbWFuZCBjb21lcyBmcm9tIHRoZSBTU0kgdGFnLiAgVG8gZG8gdGhpcywKICAgICBJIGFkZGVkIGEgdmFyaWFibGUgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgYnVpbGRzIHRoZSBjb21tYW5kIGxpbmUKICAgICBpbiBtb2RfY2dpLiAgVGhpcyBhbGxvd3MgdGhlIGluY2x1ZGVfY21kIGZ1bmN0aW9uIHRvIHNwZWNpZnkKICAgICB0aGUgY29tbWFuZCBsaW5lIGl0c2VsZi4gW1J5YW4gQmxvb21dCgogICopIENoYW5nZSBvcGVuX2xvZ3MgaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgYWxsb3dpbmcgeW91CiAgICAgdG8gZmxhZyBhIGVycm9yIHdoaWxlIG9wZW5pbmcgbG9ncwogICAgIFtJYW4gSG9sc21hbiwgRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBDaGFuZ2UgcG9zdF9jb25maWcgaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgYWxsb3dpbmcgeW91CiAgICAgdG8gZmxhZyBhIGVycm9yIHBvc3QgY29uZmlnCiAgICAgW0lhbiBIb2xzbWFuLCBKZWZmIFRyYXdpY2tdCgogICopIEFsbG93IFNVRVhFQ19CSU4gKHRoZSBwYXRoIHRvIHRoZSBzdWV4ZWMgYmluYXJ5IHRoYXQgaXMKICAgICBoYXJkLWNvZGVkIGludG8gdGhlIHNlcnZlcikgdG8gYmUgc3BlY2lmaWVkIHRvIHRoZSBjb25maWd1cmUKICAgICBzY3JpcHQgYnkgdGhlIC0td2l0aC1zdWV4ZWMtYmluIHBhcmFtZXRlci4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBGaXggc2VndiBpbiB3b3JrZXIgTVBNIGZvbGxvd2luZyBhY2NlcHQgb24gcGlwZS1vZi1kZWF0aAogICAgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgbW9kX2RlZmxhdGUgdG8gZXhwZXJpbWVudGFsLiAgCiAgICAgW0lhbiBIb2xzbWFuLCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQmFpbCBvdXQgYXQgY29uZmlndXJlIHRpbWUgaWYgYW4gaW52YWxpZCBNUE0gd2FzIHNwZWNpZmllZC4KICAgICBbamVhbi1mcmVkZXJpYyBjbGVyZSA8amZyZWRlcmljLmNsZXJlIGZ1aml0c3Utc2llbWVucy5jb20+XQoKICAqKSBQcmV2ZW50IHNlZ3YgaW4gYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUoKSB3aGVuIG5vIEF1dGhOYW1lIGlzCiAgICAgY29uZmlndXJlZCBbSm9obiBTdGVybGluZyA8c3RlcmxpbmcgY292YWxlbnQubmV0Pl0KCiAgKikgRml4IGFweHMgdG8gdXNlIHNiaW5kaXIuICBbSGVucmkgR29tZXogPGhnb21leiBzbGliLmZyPl0KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIElQdjYgdmhvc3RzLiAgUFIgIzgxMTggIFtKZWZmIFRyYXdpY2tdCgogICopIE9wdGltaXphdGlvbiBmb3IgdGhlIEJORE0gc3RyaW5nLXNlYXJjaCBmdW5jdGlvbiBpbgogICAgIG1vZF9pbmNsdWRlLiAgW0JyaWFuIFBhbmVdCgogICopIEZpeGVkIHRoZSBiZWhhdmlvciBvZiB0aGUgWEJpdEhhY2sgZGlyZWN0aXZlLgogICAgIFtUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPiwgQ2xpZmYgV29vbGxleV0gUFIjODgwNAoKICAqKSBUaGUgdGhyZWFkZWQgTVBNIGZvciBVbml4IGhhcyBiZWVuIHJlbW92ZWQuICBVc2UgdGhlIHdvcmtlcgogICAgIE1QTSBpbnN0ZWFkLiAgW3ZhcmlvdXNdCgogICopIEFQUi1pemUgdGhlIHJlc29sdmVyIGxvZ2ljIGluIG1vZF91bmlxdWVfaWQuICBUaGlzIGZpeGVzIGEgYnVnCiAgICAgaW4gbG9nZ2luZyB0aGUgZXJyb3IgZnJvbSBhIGZhaWxlZCBETlMgbG9va3VwLiAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkZWQgdGhlIG1pc3NpbmcgbWFjcm9zIEFQX0lOSVRfVEFLRTEzIGFuZCBBUF9JTklUX1RBS0UxMjMuCiAgICAgW0NsaWZmIFdvb2xsZXldCgogICopIEdldCBtb2RfY2dpZCBraWxsZWQgd2hlbiBhIE1QTSBleGl0cyBkdWUgdG8gYSBmYXRhbCBlcnJvci4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBtb2RfaW5jbHVkZS4gIFdoZW4gd2UgaW5jbHVkZSBhCiAgICAgZmlsZSwgd2UgdXNlIGEgc3ViLXJlcXVlc3QsIGJ1dCB3ZSBkaWRuJ3QgZGVzdHJveSB0aGUgc3ViLXJlcXVlc3QKICAgICBpbW1lZGlhdGVseSwgaW5zdGVhZCB3ZSB3YWl0ZWQgdW50aWwgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2FzCiAgICAgZG9uZS4gIFRoaXMgcGF0Y2ggY2xvc2VzIHRoZSBzdWItcmVxdWVzdCBhcyBzb29uIGFzIHRoZSBkYXRhIGlzCiAgICAgZG9uZSBiZWluZyBnZW5lcmF0ZWQuICBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBBbGxvdyBtb2R1bGVzIHRoYXQgYWRkIHNvY2tldHMgdG8gdGhlIGFwX2xpc3RlbmVycyBsaXN0IHRvCiAgICAgZGVmaW5lIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGFjY2VwdCBvbiB0aGF0CiAgICAgc29ja2V0LiAgRWFjaCBNUE0gY2FuIGRlZmluZSB0aGVpciBvd24gZnVuY3Rpb24gdG8gdXNlIGZvcgogICAgIHRoZSBhY2NlcHQgZnVuY3Rpb24gd2l0aCB0aGUgTVBNX0FDQ0VQVF9GVU5DIG1hY3JvLiAgVGhpcwogICAgIGFsc28gYWJzdHJhY3RzIG91dCBhbGwgb2YgdGhlIFVuaXggYWNjZXB0IGVycm9yIGhhbmRsaW5nCiAgICAgbG9naWMsIHdoaWNoIGhhcyBiZWNvbWUgb3V0IG9mIHN5bmNoIGFjcm9zcyBVbml4IE1QTXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIGJ1ZyB3aGljaCB3b3VsZCBjYXVzZSB0aGUgcmVzcG9uc2UgaGVhZGVycyB0byBiZSBvbWl0dGVkCiAgICAgd2hlbiBzZW5kaW5nIGEgbmVnb3RpYXRlZCBFcnJvckRvY3VtZW50IGJlY2F1c2UgdGhlIHJlcXVpcmVkCiAgICAgZmlsdGVycyB3ZXJlIGF0dGFjaGVkIHRvIHRoZSB3cm9uZyByZXF1ZXN0X3JlYy4KICAgICBbSm9obiBTdGVybGluZyA8c3RlcmxpbmcgY292YWxlbnQubmV0Pl0KCiAgKikgUmVtb3ZlIGNvbW1hcyBmcm9tIHRoZSBlbmQgb2YgdGhlIG1hY3JvcyB0aGF0IGRlZmluZQogICAgIGRpcmVjdGl2ZXMgdGhhdCBhcmUgdXNlZCBieSBNUE1zLiAgUHJpb3IgdG8gdGhpcyBwYXRjaCwKICAgICB5b3Ugd291bGQgdXNlIHRoZXNlIG1hY3JvcyB3aXRob3V0IGNvbW1hcywgd2hpY2ggd2FzIHVubGlrZQogICAgIHRoZSBtYWNyb3MgZm9yIGFueSBvdGhlciBkaXJlY3RpdmVzLiAgTm93LCB0aGUgY2FsbGVyIHByb3ZpZGVzCiAgICAgdGhlIGNvbW1hIHJhdGhlciB0aGFuIHRoZSBtYWNybyBwcm92aWRpbmcgaXQuICBUaGlzIG1ha2VzCiAgICAgdGhlIG1hY3JvcyBsb29rIG1vcmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgZGlyZWN0aXZlcy4KICAgICBbUnlhbiBCbG9vbSBhbmQgQ2xpZmYgV29vbGxleV0KCiAgKikgQWRkICdyZWRpcmVjdC1jYXJlZnVsbHknIGVudmlyb25tZW50IG9wdGlvbiB0byBkaXNhYmxlIHNlbmRpbmcKICAgICByZWRpcmVjdHMgdW5kZXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzLiAgVGhpcyBpcyBoZWxwZnVsIGZvciAKICAgICBNaWNyb3NvZnQncyBXZWJGb2xkZXJzIHdoZW4gYWNjZXNzaW5nIGEgZGlyZWN0b3J5IHJlc291cmNlIHZpYQogICAgIERBViBtZXRob2RzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBCZWdpbiB0byBhYnN0cmFjdCBvdXQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgogICAgIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHJlbW92ZSB0aGUgc29ja2V0IGZyb20gdGhlIGNvbm5fcmVjLAogICAgIHRoZSBzZXJ2ZXIgbm93IGxpdmVzIGluIGEgY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byB0aGUKICAgICBjb3JlJ3MgaW5wdXQgYW5kIG91dHB1dCBmaWx0ZXJzLiBUaGlzIGZvcmNlcyB1cyB0byBiZSB2ZXJ5CiAgICAgY2FyZWZ1bCB3aGVuIGFkZGluZyBjYWxscyB0aGF0IHVzZSB0aGUgc29ja2V0IGRpcmVjdGx5LAogICAgIGJlY2F1c2UgdGhlIHNvY2tldCBpc24ndCBhdmFpbGFibGUgaW4gbW9zdCBsb2NhdGlvbnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlYWxseSByZXNldCB0aGUgTWF4Q2xpZW50cyB2YWx1ZSBpbiB3b3JrZXIgYW5kIHRocmVhZGVkCiAgICAgd2hlbiB0aGUgY29uZmlndXJlZCB2YWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbnVtYmVyIAogICAgIG9mIHRocmVhZHMgcGVyIGNoaWxkLiAgV2Ugc2FpZCB3ZSBkaWQgcHJldmlvdXNseSBidXQgd2UgCiAgICAgZm9yZ290IHRvLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgRGViaWFuIGxheW91dC4gIFtEYW5pZWwgU3RvbmUgPGRhbmllbCBzZmFyYy5uZXQ+XQoKICAqKSBJZiBzaGFyZWQgbW9kdWxlcyBhcmUgcmVxdWVzdGVkIGFuZCBtb2Rfc28gaXMgbm90IGF2YWlsYWJsZSwKICAgICBwcm9kdWNlIGEgZmF0YWwgY29uZmlnLXRpbWUgZXJyb3IuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEltcHJvdmUgaHR0cDJlbnYncyBwZXJmb3JtYW5jZSBieSBjdXR0aW5nIHRoZSB3b3JrIGl0IGhhcyB0bwogICAgIGRvLiAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgdXNlIG5ldyAnYXByX2hhc2hfbWVyZ2UnIGZ1bmN0aW9uIGluIG1vZF9taW1lIChwZXJmb3JtYW5jZSBmaXgpCiAgICAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjI4CgogICopIEZpeCBpbmZpbml0ZSBsb29wIGluIG1vZF9jZ2lkLmMuICAKICAgICBbRGFsZSBHaGVudCA8ZGFsZWcgZWxlbWVudGFsLm9yZz4sIEJyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgV2hlbiBubyBwb3J0IGlzIGdpdmVuIGluIGEgIlNlcnZlck5hbWUgaG9zdCIgZGlyZWN0aXZlLCB0aGUKICAgICBzZXJ2ZXJfcmVjLT5wb3J0IGlzIG5vdyBzZXQgdG8gemVybywgbm90IDgwLiBUaGF0IGFsbG93cyBmb3IKICAgICBydW4tdGltZSBkZWR1Y3Rpb24gb2YgdGhlIGNvcnJlY3Qgc2VydmVyIHBvcnQgKGRlcGVuZGluZyBvbgogICAgIFNTTC9wbGFpbiwgYW5kIGRlcGVuZGluZyBhbHNvIG9uIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKICAgICBVc2VDYW5vbmljYWxOYW1lKS4gVGhpcyBjaGFuZ2UgbWFrZXMgcmVkaXJlY3Rpb25zCiAgICAgd29yaywgZXZlbiB3aXRoIGh0dHBzOi8vIGNvbm5lY3Rpb25zLiBBcyBpbiBBcGFjaGUtMS4zLCB0aGUKICAgICBjb25uZWN0aW9uJ3MgYWN0dWFsIHBvcnQgbnVtYmVyIGlzIG5ldmVyIHVzZWQsIG9ubHkgdGhlIFNlcnZlck5hbWUKICAgICBzZXR0aW5nIG9yIHRoZSBjbGllbnQncyBIb3N0OiBzZXR0aW5nLiBEb2N1bWVudGF0aW9uIHVwZGF0ZWQKICAgICB0byByZWZsZWN0IHRoZSBjaGFuZ2UuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQWRkIGEgJyV7bm90ZS1uYW1lfWUnIGFyZ3VtZW50IHRvIG1vZC1oZWFkZXJzLCB3aGljaCB3b3JrcyBpbgogICAgIHRoZSBzYW1lIHdheSBhcyBtb2RfbG9nX2NvbmZnLiAgW0lhbiBIb2xzbWFuXQoKICAqKSBGaXggdGhlIHNwZWxsaW5nIG9mIHRoZSBBUF9NUE1RX01JTl9TUEFSRV9EQUVNT05TIGFuZAogICAgIEFQX01QTVFfTUFYX1JFUVVFU1RTX0RBRU1PTiBtYWNyb3MgaW4gYXBfbXBtLmggYW5kIGFsbCBzdGFuZGFyZAogICAgIE1QTXMuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgSW50cm9kdWNlIGh0ZGJtLCBhIHVzZXIgbWFuYWdlbWVudCB1dGlsaXR5IGZvciBkYi9kYm0gYXV0aG9yaXphdGlvbgogICAgIGRhdGFiYXNlcy4gIFtNbGFkZW4gVHVyayA8bXR1cmsgbWFwcGluZ3NvZnQuY29tPl0KCiAgKikgT3B0aW1pemUgdXNhZ2Ugb2Ygc3RybGVuIGFuZCBzdHJjYXQgaW4gYXBfZGlyZWN0b3J5X3dhbGsuCiAgICAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjI3CgogICopIEludHJvZHVjZSBhbiBBcGFjaGUgbW9kX3NzbCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGUgCiAgICAgKHNzbC5jb25mLCBnZW5lcmF0ZWQgZnJvbSBzc2wtc3RkLmNvbmYpLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGdldGxpbmUgcGFyc2luZyBjb2RlIHRoYXQgY291bGQKICAgICBiZSB0cmlnZ2VyZWQgYnkgYXJiaXRyYXJpbHkgbGFyZ2UgaGVhZGVyIGxpbmVzLiBSZXF1ZXN0cwogICAgIGZyb20gdGhlIGNvcmUgaW5wdXQgZmlsdGVyIGZvciBzaW5nbGUgbGluZXMgYXJlIG5vdyBsaW1pdGVkCiAgICAgdG8gSFVHRV9TVFJJTkdfTEVOICg4MTkyIGJ5dGVzKS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBGaXggYSB0cnVuY2F0aW9uIGJ1ZyBpbiBob3cgd2UgcHJpbnQgdGhlIHBvcnQgb24gdGhlIFZpYTogaGVhZGVyLiAKICAgICBUaGUgcm91dGluZSB0aGF0IHByaW50cyB0aGUgVmlhOiBoZWFkZXIgbm93IHRha2VzIGEgbGVuZ3RoIGZvcgogICAgIHRoZSBwb3J0IHN0cmluZy4gIFtadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPl0KCiAgKikgU29tZSBzeW50YXggZXJyb3JzIGluIG1vZF9taW1lX21hZ2ljJ3MgbWFnaWMgZmlsZSBjYW4gcmVzdWx0CiAgICAgaW4gYSA1MDAgZXJyb3IsIHdoaWNoIHByZXZpb3VzbHkgd2FzIHVubG9nZ2VkLiAgTm93IHdlIGxvZyB0aGUKICAgICBlcnJvci4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgc3VwcG9ydC9jaGVja2dpZCBoZWxwZXIgYXBwLCB3aGljaCBjaGVja3MgdGhlIHJ1bi10aW1lCiAgICAgdmFsaWRpdHkgb2YgZ3JvdXAgaWRlbnRpZmllcnMgdXNhYmxlIGluIHRoZSBHcm91cCBkaXJlY3RpdmUuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBWYXJpb3VzIC0tZW5hYmxlLXNvIG9wdGlvbnMgaGF2ZSBiZWVuIGZpeGVkOiAtLWVuYWJsZS1zbyBpcwogICAgIHRyZWF0ZWQgYXMgInN0YXRpYyI7IGV4cGxpY2l0IC0tZW5hYmxlLXNvPXNoYXJlZCBpc3N1ZXMgYW4gZXJyb3I7CiAgICAgYW5kIGV4cGxpY2l0IC0tZW5hYmxlLXNvIGZhaWxzIHdpdGggZXJyb3Igb24gc3lzdGVtcyB3aXRob3V0CiAgICAgQVBSX0hBU19EU08uICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIGNvcmUgaW5wdXQgZmlsdGVyIHdoZW4gdGhlIGNsaWVudCBzb2NrZXQKICAgICBnZXRzIGRpc2Nvbm5lY3RlZCB1bmV4cGVjdGVkbHkuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRml4IHRoZSByZXBvcnRpbmcgZm9yIGNoaWxkIHByb2Nlc3NlcyB0aGF0IGRpZS4gIFRoaXMgcmVtb3ZlcwogICAgIGFsbCBvZiB0aGUgbm9uLXBvcnRhYmxlIFcqIG1hY3JvcyBmcm9tIEFwYWNoZS4gCiAgICAgW0plZmYgVHJhd2ljayBhbmQgUnlhbiBCbG9vbV0KCiAgKikgV2luMzI6IFRyYWNrIGFuZCBkaXNwbGF5ICJQYXJlbnQgU2VydmVyIEdlbmVyYXRpb246IiBpbgogICAgIG1vZF9zdGF0dXMgb3V0cHV0LiBUaGUgZ2VuZXJhdGlvbiB3aWxsIGJlIGJ1bXBlZCBhdAogICAgIHNlcnZlciBncmFjZWZ1bCByZXN0YXJ0LCB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRzCiAgICAgYnkgaGl0dGluZyBNYXhSZXF1ZXN0c1BlckNoaWxkIG9yIGlmIHRoZSBjaGlsZCAKICAgICBwcm9jZXNzIGV4aXRzIGFibm9ybWFsbHkuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gd2hlcmUgTWF4UmVxdWVzdHNQZXJDaGlsZCBkaXJlY3RpdmUgd2FzCiAgICAgbm90IGJlaW5nIHBpY2tlZCB1cCBpbiBmYXZvciBvZiB0aGUgZGVmYXVsdC4gRW5hYmxlCiAgICAgdGhlIHBhcmVudCB0byBzdGFydCB1cCBhIG5ldyBjaGlsZCBwcm9jZXNzIGltbWVkaWF0ZWx5IHVwb24KICAgICB0aGUgb2xkIGNoaWxkIHN0YXJ0aW5nIHNodXRkb3duLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggc29tZSBidW5nbGluZyBvZiB0aGUgcmVtb3RlIHBvcnQgaW4gcmZjMTQxMy5jIHNvIHRoYXQgCiAgICAgSWRlbnRpdHlDaGVjayByZXRyaWV2ZXMgdGhlIHByb3BlciB1c2VyIGlkIGluc3RlYWQgb2YgZmFpbGluZwogICAgIGFuZCB0aHVzIGFsd2F5cyByZXR1cm5pbmcgIm5vYm9keS4iICAKICAgICBbRGljayBTdHJlZWZsYW5kIDxEaWNrLlN0cmVlZmxhbmQgeHM0YWxsLm5sPl0KCiAgKikgSW50cm9kdWNlZCB0aHJlYWQgc2FmdGV5IGZvciBtb2RfcmV3cml0ZSdzIGludGVybmFsIGNhY2hlLgogICAgIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIFNpbXBsaWZpZWQgbW9kX2VudidzIGRpcmVjdGl2ZXMgdG8gYmVoYXZlIGFzIG1vc3QgZGlyZWN0aXZlcyBhcmUKICAgICBleHBlY3RlZCwgaW4gdGhhdCBVbnNldEVudiB3aWxsIG5vdCB1bnNldCBhIFNldEVudiBhbmQgUGFzc0VudiAKICAgICBkaXJlY3RpdmUgZm9sbG93aW5nIHRoYXQgVW5zZXRFbnYgd2l0aGluIHRoZSBzYW1lIGNvbnRhaW5lci4KICAgICBBbHNvIHByb3ZpZGVzIGEgcnVudGltZSBzdGFydHVwIHdhcm5pbmcgaWYgYSBQYXNzRW52IGNvbmZpZ3VyZWQgCiAgICAgZW52aXJvbm1lbnQgdmFsdWUgaXMgdW5kZWZpbmVkLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVGhlIHdvcmtlciBNUE0gaXMgbm93IGNvbXBsZXRlbHkgcG9ydGVkIHRvIEFQUidzIG5ldyBsb2NrIEFQSS4gSXQKICAgICB1c2VzIG5hdGl2ZSBBUFIgdHlwZXMgZm9yIHRocmVhZCBtdXRleGVzLCBjcm9zcy1wcm9jZXNzIG11dGV4ZXMsCiAgICAgYW5kIGNvbmRpdGlvbiB2YXJpYWJsZXMuICBbQWFyb24gQmFubmVydF0KCiAgKikgU3luYyB1cCBkb2N1bWVudGF0aW9uIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbm93IGRlcHJlY2F0ZWQKICAgICBQb3J0IGRpcmVjdGl2ZS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTW92ZWQgYWxsIGxkYXAgbW9kdWxlcyBmcm9tIHRoZSBjb3JlIHRvIGh0dHBkLWxkYXAgc3ViLXByb2plY3QKICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRXhpdCB3aGVuIHdlIGNhbid0IGxpc3RlbiBvbiBhbnkgb2YgdGhlIGNvbmZpZ3VyZWQgcG9ydHMuICBUaGlzCiAgICAgaXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgMS4zLCBhbmQgaXQgYXZvaWRzIGhhdmluZyB0aGUgTVBNcyB0bwogICAgIGRlYWwgd2l0aCBib2d1cyBhcF9saXN0ZW5fcmVjIHN0cnVjdHVyZXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDbGVhbnVwIHRoZSBwcm94eSBjb2RlIHRoYXQgY3JlYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG9yaWdpbgogICAgIHNlcnZlci4gIFRoaXMgY2hhbmdlIGFkZHMgYW4gb3B0aW9uYWwgaG9vaywgd2hpY2ggYWxsb3dzIG1vZHVsZXMKICAgICB0byBnYWluIGNvbnRyb2wgd2hpbGUgdGhlIHJlcXVlc3QgaXMgY3JlYXRlZCBpZiB0aGUgcHJveHkgbW9kdWxlCiAgICAgaXMgbG9hZGVkLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBob29rIGlzIHRvIGFsbG93IG1vZHVsZXMgdG8gYWRkCiAgICAgaW5wdXQgYW5kL29yIG91dHB1dCBmaWx0ZXJzIHRvIHRoZSByZXF1ZXN0IHRvIHRoZSBvcmlnaW4uICBXaGlsZQogICAgIEkgd2FzIGF0IGl0LCBJIG1hZGUgdGhlIGNvcmUgdXNlIHRoaXMgaG9vaywgc28gdGhhdCBwcm94eSByZXF1ZXN0CiAgICAgY3JlYXRpb24gdXNlcyBzb21lIG9mIHRoZSBjb2RlIGZyb20gdGhlIGNvcmUuICBUaGlzIGNhbiBzdGlsbCBiZQogICAgIGdyZWF0bHkgaW1wcm92ZWQsIGJ1dCB0aGlzIGlzIGEgZ29vZCBzdGFydC4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjYKCiAgKikgUG9ydCB0aGUgTWF4Q2xpZW50cyBjaGFuZ2VzIGZyb20gdGhlIHdvcmtlciBNUE0gdG8gdGhlIHRocmVhZGVkCiAgICAgTVBNLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCBtb2RfcHJveHkgc28gdGhhdCBpdCBoYW5kbGVzIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgYW5kIHdvcmtzCiAgICAgd2l0aCB0aGUgbmV3IGlucHV0IGZpbHRlcmluZyBzeXN0ZW0uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEludHJvZHVjZSB0aGUgTXVsdGl2aWV3c01hdGNoIGRpcmVjdGl2ZSwgdG8gYWxsb3cgdGhlIG9wZXJhdG9yCiAgICAgdG8gYmUgZmxleGlibGUgaW4gcmVjb2duaXppbmcgSGFuZGxlcnMgYW5kIEZpbHRlcnMgZmlsZW5hbWUKICAgICBleHRlbnNpb25zIGFzIHBhcnQgb2YgdGhlIE11bHRpdmlld3MgbWF0Y2hpbmcgbG9naWMsIHN0cmljdCB3aXRoCiAgICAgTXVsdGl2aWV3c01hdGNoIE5lZ290aWF0ZWRPbmx5IHRvIGFjY2VwdCBvbmx5IGZpbGVuYW1lIGV4dGVudGlvbnMgCiAgICAgdGhhdCBkZXNpZ25hdGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzLCAoY29udGVudCB0eXBlLCBjaGFyc2V0LCBldGMuKQogICAgIG9yIE11bHRpdmlld3NBbGwgZm9yIHRoZSAxLjMgYmVoYXZpb3Igb2YgbWF0Y2hpbmcgYW55IGZpbGVzLCBldmVuCiAgICAgaWYgdGhleSBoYXZlIHVucmVnaXN0ZXJlZCBleHRlbnNpb25zLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRkIGEgTG9hZE1vZHVsZSBkaXJlY3RpdmUgdG8KICAgICB0aGUgZGVmYXVsdCBodHRwZC5jb25mIGZvciBhbnkgbW9kdWxlIHRoYXQgd2FzIGNvbXBpbGVkCiAgICAgYXMgYSBEU08uICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgcmV3cml0ZSBtb2Rfc3NsIGlucHV0IGZpbHRlcmluZyB0byB3b3JrIHdpdGggdGhlIG5ldyBpbnB1dCBmaWx0ZXJpbmcKICAgICBzeXN0ZW0uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIHByZWZvcms6IERvbid0IHNlZ2ZhdWx0IHdoZW4gd2UgYXJlIGFibGUgdG8gbGlzdGVuIG9uIHNvbWUgYnV0CiAgICAgbm90IGFsbCBvZiB0aGUgY29uZmlndXJlZCBwb3J0cy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEJ1aWxkIG1vZF9zbyBldmVuIGlmIG5vIGNvcmUgbW9kdWxlcyBhcmUgYnVpbHQgc2hhcmVkLgogICAgIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBJbnRyb2R1Y2UgYXBfZGlyZWN0b3J5X3dhbGsgcmV3cml0ZSAod2l0aCBmdXJ0aGVyIG9wdGltaXphdGlvbnMKICAgICByZXF1aXJlZCkgdG8gYWRhcHQgdG8gdGhlIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCgpIGNoYW5nZXMuCiAgICAgT3B0aW1pemVkIHNvIHN1YnJlcXVlc3RzIGFuZCByZWRpcmVjdHMgbm93IHJldXNlIHByZXZpb3VzIHNlY3Rpb24gCiAgICAgbWVyZ2VzLCB1bnRpbCB3ZSBtaXNtYXRjaCB3aXRoIHRoZSBvcmlnaW5hbCBkaXJlY3Rvcnlfd2FsaywgYW5kCiAgICAgcHJlY29tcHV0ZWQgci0+ZmluZm8gcmVzdWx0cyB3aWxsIGNhdXNlIGRpcmVjdG9yeV93YWxrIHRvIHNraXAKICAgICB0aGUgbW9zdCBleHBlbnNpdmUgcGhhc2VzIG9mIHRoZSBmdW5jdGlvbi4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFsbG93IEFwYWNoZU1vbml0b3IgdG8gY29ubmVjdCB0byBhbmQgY29udHJvbCBBcGFjaGUgb24gb3RoZXIgCiAgICAgV2luTlQvMksgbWFjaGluZXMuICAgW01sYWRlbiBUdXJrIDxtdHVyayBtYXBwaW5nc29mdC5jb20+XQoKICAqKSBSZW1vdmUgdGhlIFBvcnQgZGlyZWN0aXZlLiAgSW4gaXQncyBwbGFjZSwgdGhlIExpc3RlbiBkaXJlY3RpdmUKICAgICBpcyBub3cgYSByZXF1aXJlZCBkaXJlY3RpdmUsIHdoaWNoIHRlbGxzIEFwYWNoZSB3aGF0IHBvcnQgdG8KICAgICBsaXN0ZW4gb24uICBUaGUgU2VydmVyTmFtZSBkaXJlY3RpdmUgaGFzIGFsc28gYmVlbiBleHRlbmRlZAogICAgIHRvIGFjY2VwdCBhbiBvcHRpb25hbCBwb3J0LiAgSWYgdGhlIHBvcnQgaXMgc3BlY2lmaWVkIHRvIHRoZQogICAgIFNlcnZlck5hbWUsIHRoZSBzZXJ2ZXIgd2lsbCByZXBvcnQgdGhhdCBwb3J0IHdoZW5ldmVyIGl0CiAgICAgcmVwb3J0cyB0aGUgcG9ydCB0aGF0IGl0IGlzIGxpc3RlbmluZyBvbi4gIFRoaXMgY2hhbmdlIHdhcwogICAgIG1hZGUgdG8gZWFzZSBjb25maWd1cmF0aW9uIGVycm9ycyB0aGF0IHN0ZW0gZnJvbSBoYXZpbmcgYSBQb3J0CiAgICAgZGlyZWN0aXZlLCBhbmQgYSBMaXN0ZW4gZGlyZWN0aXZlLiAgSW4gdGhhdCBzaXR1YXRpb24sIHRoZSBzZXJ2ZXIKICAgICB3b3VsZCBvbmx5IGxpc3RlbiB0byB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgdGhlIExpc3RlbiBjb21tYW5kLAogICAgIHdoaWNoIGNhdXNlZCBhIGxvdCBvZiBjb25mdXNpb24gdG8gdXNlcnMuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkZWQgbW9kX21pbWVfbWFnaWMsIG1vZF91bmlxdWVfaWQgYW5kIG1vZF92aG9zdF9hbGlhcyB0byB0aGUgV2luMzIKICAgICBidWlsZCwgYXMgbG9hZGFibGUgbW9kdWxlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCAtLWVuYWJsZS1tb2RzLXNoYXJlZCBwcm9jZXNzaW5nLiAgSWYgbW9zdCBpcyBzcGVjaWZpZWQsCiAgICAgdGhlbiBhbGwgbW9kdWxlcyB0aGF0IGNhbiBiZSBjb21waWxlZCBhcyBzaGFyZWQgbW9kdWxlcyBhcmUuCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIFVwZGF0ZSB0aGUgbWltZS50eXBlcyBmaWxlIHRvIG1hcCB2aWRlby92bmQubXBlZ3VybCB0byBteHUKICAgICBhbmQgYWRkIGNvbW1vbmx5IHVzZWQgYXVkaW8veC1tcGVndXJsIGZvciBtM3UgZXh0ZW5zaW9ucy4gICAgICAgIAogICAgIFtIZWlrbyBSZWNrdGVud2FsZCA8dXpzMTA2IHVuaS1ib25uLmRlPiwgTGFycyBFaWxlYnJlY2h0XQoKICAqKSBFbGltaW5hdGUgdGhlIGRlcHJlY2lhdGVkIHItPmNvbnRlbnRfbGFuZ3VhZ2UsIGluIGZhdm9yIG9mIHRoZSBhcnJheQogICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2VzIGludHJvZHVjZWQgbWFueSB5ZWFycyBhZ28uICBNb2R1bGUgYXV0aG9ycyBtdXN0CiAgICAgc3Vic3RhbnRpYWxseSBvdmVyaGF1bCB0aGVpciBtb2R1bGVzLCBzbyB0aGlzIG5lZWRzIHRvIGJlIHVwZ3JhZGVkCiAgICAgaWYgdGhlIG1vZHVsZSBzdGlsbCByZWxpZWQgb24gYmFja3dhcmRzLWJyb2tlbmVzcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFsbG93IGNvbmZpZ3VyZSBoZWxwIHN0cmluZ3MgdG8gd29yayB3aXRoIGF1dG9jb25mIDIuNTArIGFuZCAyLjEzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUmV3cml0ZSB0aGUgaW5wdXQgZmlsdGVyaW5nIG1lY2hhbmlzbXMgdG8gY29uc29saWRhdGUgYW5kIHJlb3JnYW5pemUKICAgICBjb2RlLiAgSW4gc2hvcnQsIGNvcmVfaW5wdXRfZmlsdGVyIGRvZXMgc29tZXRoaW5nIG5vdyBhbmQKICAgICBhcF9odHRwX2ZpbHRlciBpcyBub3cgb25seSBjb25jZXJuZWQgd2l0aCBIVFRQLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBVcGRhdGUgdGhlIFdpbjMyIGJ1aWxkIHRvIHJlLWFic29yYiBtb2RfcHJveHkgYW5kIGZhbWlseS4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZXNvbHZlZCB0aGUgYnVpbGQgZmFpbHVyZSBvbiBXaW4zMiB1c2luZyBNU1ZDIDUuMCAod2l0aG91dCB0aGUKICAgICBjdXJyZW50IFNESy4pICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTb21lIHN0eWxlIGNoYW5nZXMgdG8gdGhlIGNvZGUgdGhhdCBkb2VzIFByb3h5RXJyb3JPdmVycmlkZS4gRml4ZWQKICAgICBjb25maWcgbWVyZ2UgYmVoYXZpb3VyLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEFsbG93IHN1cHBvcnQgcHJvZ3JhbXMgdG8gYmUgY29tcGlsZWQgYWdhaW5zdCBhIHN0YXRpYyB2ZXJzaW9uCiAgICAgb2YgbGliYXByLiAgVGhpcyBhbGxvd3MgdGhlIHNtYWxsZXIgc3VwcG9ydCBwcm9ncmFtcyB0byBiZSAKICAgICByZWxvY2F0ZWQuICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgVXBkYXRlIHRoZSBtaW1lLnR5cGVzIGZpbGUgdG8gdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdHlwZXMgYXMKICAgICBvZiAyMDAxLTA5LTI1LCBhbmQgYWRkIG1hcHBpbmcgZm9yIHhzbCBleHRlbnNpb24gW01hcmsgQ294XQoKICAqKSBGaXggTWF4Q2xpZW50cyBpbiB0aGUgV29ya2VyIE1QTSwgc28gdGhhdCBpdCBzcGVjaWZpZXMgdGhlIG1heGltdW0KICAgICBudW1iZXIgb2YgY2xpZW50cyB0aGF0IGNhbiBjb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUsIGluc3RlYWQgb2YKICAgICBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZCBwcm9jZXNzZXMuCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIFN3aXRjaCBwcm9jX3B0aHJlYWQgQWNjZXB0TXV0ZXggY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgdG8gcHRocmVhZCB0byAKICAgICBiZSBjb25zaXN0ZW50IHdpdGggMS4zLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBDYWNoZSBhcHJfZXhwbG9kZV9sb2NhbHRpbWUoKSB2YWx1ZSBmb3IgMTUgc2Vjb25kcy4KICAgICBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBGaXggbW9kX2luY2x1ZGUgdG8gbm90IHJldHVybiBFVGFnIG9yIExhc3QtTW9kaWZpZWQgaGVhZGVycy4KICAgICBbSWFuIEhvbHNtYW4gPGlhbmggY25ldC5jb20+XQoKICAqKSBGaXggd29ya2VyIE1QTSdzIHNjb3JlYm9hcmQgbG9naWMuICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgRWxpbWluYXRlIHRoZSB3YXN0ZWZ1bCBydW4tdGltZSBjb252ZXJzaW9uIG9mIG1ldGhvZCBuYW1lcyBmcm9tIHN0cmluZ3MgCiAgICAgdG8gbnVtYmVycyBpbiBwbGFjZXMgd2hlcmUgdGhlIG1ldGhvZHMgYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZS4gIAogICAgIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIFR1cm4gdGhlIHdvcmtlciBNUE0ncyBxdWV1ZSBpbnRvIGEgTElGTy4gIFRoaXMgbWF5CiAgICAgaW1wcm92ZSBjYWNoZS1oaXQgcGVyZm9ybWFuY2UgdW5kZXIgc29tZSBjb25kaXRpb25zLgogICAgIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBTd2l0Y2ggYmFjayB0byBTSUdVU1IxIGZvciBncmFjZWZ1bCByZXN0YXJ0cyBvbiBhbGwgcGxhdGZvcm1zIHRoYXQKICAgICBzdXBwb3J0IGl0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBDbGVhbnVwIHRoZSB3b3JrZXIgTVBNLiAgV2Ugbm8gbG9uZ2VyIHJlLXVzZSB0cmFuc2FjdGlvbgogICAgIHBvb2xzLiAgVGhpcyBpbmN1cnMgbGVzcyBvdmVyaGVhZCB0aGFuIHNodWZmbGluZyB0aGUgcG9vbHMKICAgICBhcm91bmQgc28gdGhhdCB0aGV5IGNhbiBiZSByZS11c2VkLiAgUmVtb3ZlIG9uZSBvZiB0aGUKICAgICBxdWV1ZSdzIGNvbmRpdGlvbiB2YXJpYWJsZXMuICBXZSBqdXN0IHJlZGVmaW5lZCB0aGUgQVBJIHRvCiAgICAgc3RhdGUgdGhhdCB5b3UgY2FuJ3QgdHJ5IHRvIGFkZCBtb3JlIHN0dWZmIHRoYW4geW91IGFsbG9jYXRlZAogICAgIHNlZ21lbnRzIGZvci4gIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBGaXggU1NMIFZQQVRIIGJ1aWxkcyBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeGVkIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBhIHJlcXVlc3QgY29udGFpbnMgYSBib2R5LgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSBtb2RfZGF2IHVzZXMgYSBuZXcgQVBJIHRvIHNwZWFrIHRvIHRoZSBiYWNrZW5kIHByb3ZpZGVyIGZvciBkZWFkCiAgICAgcHJvcGVydHkgbWFuYWdlbWVudC4gW0dyZWcgU3RlaW5dCgogICopIFJlbW92ZSB0aGUgV2luMzIgc2NyaXB0LXByb2Nlc3NpbmcgZXhjZXB0aW9uIGZyb20gbW9kX2NnaSwgYW5kCiAgICAgcm9sbCBidWlsZF9jb21tYW5kX2xpbmUvYnVpbGRfYXJndl9saXN0IGludG8gYSB1bmlmaWVkLCBvdmVycmlkZWFibGUKICAgICBhcF9jZ2lfYnVpbGRfY29tbWFuZCBvcHRpb25hbCBmdW5jdGlvbi4gIFtXaWxsaWFtIFJvd2VdCgogICopIFJld3JpdGUgZmluZF9zdGFydF9zZXF1ZW5jZSB0byB1c2UgYSBiZXR0ZXIgc2VhcmNoIGFsZ29yaXRobQogICAgIHRvIGZpbmQgdGhlIHN0YXJ0IHRhZy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgc2VnIGZhdWx0IGluIG1vZF9pbmNsdWRlLiAgV2hlbiB3ZSBhcmUgZ2VuZXJhdGluZyBhbgogICAgIGludGVybmFsIHJlZGlyZWN0LCB3ZSBtdXN0IHNldCByLT51cmkgdG8gIiIsIG5vdCBhIGJvZ3VzCiAgICAgc3RyaW5nLCBhbmQgbm90IE5VTEwuICBbUnlhbiBCbG9vbV0KCiAgKikgT3B0aW1pemVkIGxvY2F0aW9uX3dhbGssIHNvIHN1YnJlcXVlc3RzLCByZWRpcmVjdHMgYW5kIHNlY29uZCBwYXNzZXMKICAgICBub3cgcmV1c2UgcHJldmlvdXMgc2VjdGlvbiBtZXJnZXMgb24gYSA8TG9jYXRpb24gPiBieSA8TG9jYXRpb24gPgogICAgIGJhc2lzLCB1bnRpbCB3ZSBtaXNtYXRjaCB3aXRoIHRoZSBvcmlnaW5hbCBsb2NhdGlvbl93YWxrLiAKICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBCYWNrIG91dCB0aGUgMS40NSBjaGFuZ2UgdG8gdXRpbF9zY3JpcHQuYy4gIFRoaXMgY2hhbmdlIG1hZGUKICAgICB1cyBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFJFUVVFU1RfVVJJIHRvIHRoZSByZWRpcmVjdGVkCiAgICAgVVJJLCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbGx5IHJlcXVlc3RlZCBVUkkuCiAgICAgW1Rha2V0byBLYWJlIDxrYWJlIHNyYS10b2hva3UuY28uanA+XQoKICAqKSBNYWtlIG1vZF9pbmNsdWRlIGRvIGxhenkgZXZhbHVhdGlvbiBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgdG8KICAgICBjb21wdXRlIHZhcmlhYmxlcy4gIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIEZpeCBsb2dnaW5nIG9mIGJ5dGVzIHNlbnQgZm9yIEhFQUQgcmVxdWVzdHMuICAlYiBhbmQgJUIgc2hvdWxkCiAgICAgbG9nIGVpdGhlciAtIG9yIDAsIGJlZm9yZSB0aGlzIHBhdGNoLCB0aGV5IHdlcmUgYm90aCBsb2dnaW5nCiAgICAgdGhlIGZpbGUgc2l6ZS4gIFtUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPl0KCiAgKikgTWFrZSBtb2RfaW5jbHVkZSBjaGVjayBmb3IgQllURV9DSEVDS19USFJFU0hPTEQgcGVyIGJ1Y2tldCByYXRoZXIgCiAgICAgdGhhbiBwZXIgY2hhcmFjdGVyLiAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgTm9ybWFsaXplIHRoZSBwcmltYXJ5IHJlcXVlc3QsIHJlZGlyZWN0cyBhbmQgc3ViLXJlcXVlc3RzIHRvCiAgICAgcnVuIHRoZSBzYW1lIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCBmb3IgY29uc2lzdGVuY3kgaW4KICAgICByb2J1c3RuZXNzLCBiZWhhdmlvciBhbmQgc2VjdXJpdHkuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBzZWdmYXVsdCB3aXRoIG1vZF9pbmNsdWRlIHdoZW4gci0+cGF0aF9pbmZvIGlzIG5vdCBzZXQKICAgICAod2hpY2ggaXMgdGhlIGNhc2Ugd2l0aCBtb2RfcHJveHkpLiAgW0lhbiBIb2xzbWFuIDxpYW5oIGNuZXQuY29tPl0KCiAgKikgQWRkIC1YIGZ1bmN0aW9uYWxpdHkgYmFjay4gIFRoaXMgaW5kaWNhdGVzIHRvIGFsbCBNUE1zIGFuZCBhbnkgb3RoZXIKICAgICBwYXJ0IG9mIEFwYWNoZSB0aGF0IGl0IHNob3VsZCBydW4gaW4gImRlYnVnIiBtb2RlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTb21lIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIGN5Z3dpbiBwbGF0Zm9ybSBbcHJlZm9yayBvbmx5XS4KICAgICBUaGlzIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHN1cHBvcnQgZm9yIHRoZSBXaW5OVC9XaW4zMgogICAgIHBsYXRmb3JtLCB3aGljaCBpcyB0aGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiBmb3IgbmF0aXZlCiAgICAgV2luMzIgdXNlcnMuICBUaGUgY3lnd2luIHBsYXRmb3JtIHN1cHBvcnQgaXMgcmVjb21tZW5kZWQgZm9yCiAgICAgY3lnd2luIHBsYXRmb3JtIHVzZXJzLiBbU3RpcGUgVG9saiA8dG9saiB3YXBtZS1zeXN0ZW1zLmRlPl0KCiAgKikgQ2hhbmdlZCBzeW50YXggb2YgU2V0e0lucHV0fE91dHB1dH1GaWx0ZXIuICBUaGUgbGlzdCBvZiBmaWx0ZXJzCiAgICAgbXVzdCBiZSBzZW1pY29sb24gZGVsaW1pdGVkIChpZiBtb3JlIHRoYW4gb25lIGZpbHRlciBpcyBnaXZlbi4pCiAgICAgVGhlIFNldHtJbnB1dHxPdXRwdXR9RmlsdGVyIGRpcmVjdGl2ZSBub3cgb3ZlcnJpZGVzIGEgcGFyZW50CiAgICAgY29udGFpbmVyJ3MgZGlyZWN0aXZlIChlLmcuIFNldElucHV0RmlsdGVyIGluIDxEaXJlY3RvcnkgL3dlYi9mb28+CiAgICAgd2lsbCBvdmVycmlkZSBhbnkgU2V0SW5wdXRGaWx0ZXIgZGlyZWN0aXZlIGluIDxEaXJlY3RvcnkgL3dlYj4uKQogICAgIFRoaXMgbmV3IHN5bnRheCBpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBZGR7SW5wdXR8T3V0cHV0fUZpbHRlcgogICAgIGRpcmVjdGl2ZXMgZGVmaW5lZCBpbiBtb2RfbWltZS4gIEFsc28gY3VyZXMgYSBidWcgaW4gcHJpb3IgcmVsZWFzZXMKICAgICB3aGVyZSB0aGUgU2V0e0lucHV0fE91dHB1dH1GaWx0ZXIgZGlyZWN0aXZlIHdvdWxkIGNvcnJ1cHQgdGhlIAogICAgIGdsb2JhbCBjb25maWd1cmF0aW9uIGlmIHRoZSBtdWx0aXBsZSBkaXJlY3RpdmVzIHdlcmUgbmVzdGVkLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEN1cmVkIHdoYXQncyBhaWxlZCBtaW1lIGZvciBxdWl0ZSBzb21lIHRpbWUuICBJZiBhbiBBZGRTb21ldGhpbmcKICAgICB3YXMgZ2l2ZW4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gKExhbmd1YWdlLCBDaGFyc2V0LCBIYW5kbGVyIG9yCiAgICAgRW5jb2RpbmcpIEFwYWNoZSB3b3VsZCBzZXQgdGhlIGNvbnRlbnQgdHlwZSBhcyBnaXZlbiBieSBBZGRUeXBlLCAKICAgICBidXQgcmVmdXNlZCB0byBjaGVjayB0aGUgbWltZS50eXBlcyBmaWxlIGlmIEFkZFR5cGUgd2Fzbid0IGdpdmVuIAogICAgIGZvciB0aGF0IHNwZWNpZmljIGV4dGVuc2lvbi4gIFNldHRpbmcgdGhlIEFkZEhhbmRsZXIgZm9yIC5odG1sIAogICAgIHdpdGhvdXQgc2V0dGluZyB0aGUgQWRkVHlwZSB0ZXh0L2h0bWwgaHRtbCB3b3VsZCBjYXVzZSBBcGFjaGUgdG8gCiAgICAgdXNlIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIHNvbWUgYnVsbGV0cHJvb2ZpbmcgdG8gbWVtb3J5IGFsbG9jYXRpb24gaW4gdGhlIExEQVAgY2FjaGUKICAgICBjb2RlLiBbR3JhaGFtIExlZ2dldHRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yNQoKICAqKSBNb3ZlIHRoZSBpbnN0YWxsZWQgL21hbnVhbCBkaXJlY3Rvcnkgb3V0IG9mIHRoZSAvaHRkb2NzLyB0cmVlLCBzbwogICAgIHRoYXQgaXQgY2FuIGJlIGtlcHQgbW9yZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIHJlbWFpbmluZyBkb2N1bWVudAogICAgIHJvb3QuIFRoZSAiQWxpYXMgL21hbnVhbCAuLi4iIGFscmVhZHkgYWxsb3dlZCBmb3IgZWFzeSBwcm9qZWN0aW9uCiAgICAgaW50byBleGlzdGluZyBwcml2YXRlIGRvY3VtZW50IHRyZWVzLiBbTWFydGluIEtyYWVtZXJdCgogICopIEFkZCBzcGVjaWZpZWQgdXNlciBhdHRyaWJ1dGVzIHRvIHRoZSBlbnZpcm9ubWVudCB3aGVuIHVzaW5nCiAgICAgbW9kX2F1dGhfbGRhcC4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBtb2RfaW5jbHVkZSB0byBlbWJlZCBzcGVjaWZpZWQKICAgICB1c2VyIGF0dHJpYnV0ZXMgaW4gYSBwYWdlIGxpa2Ugc286CiAgICAgSGVsbG8gPCEtLSNlY2hvIHZhcj0iQVVUSEVOVElDQVRFX0NOIi0tPiwgaG93IGFyZSB5b3U/CiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBGaXggYSBwZXJmb3JtYW5jZSBwcm9ibGVtIHdpdGggdGhlIHdvcmtlciBNUE0uICBXZSBub3cgY3JlYXRlCiAgICAgdHJhbnNhY3Rpb24gcG9vbHMgb25jZSwgYW5kIHJlLXVzZSB0aGVtIGZvciBlYWNoIGNvbm5lY3Rpb24uCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIE1vZGZpZWQgbW9kX21pbWUgdG8gcHJldmVudCBtb2RfbmVnb3RhdGlvbiBmcm9tIHNlcnZpbmcgYSBtdWx0aXZpZXcKICAgICBvZiBhICdoYW5kbGVyJyBvciAnZmlsdGVyJywgc28gdGhhdCBhbnkgZmlsZW5hbWUgZXh0ZW5zaW9uIHRoYXQgZG9lcyAKICAgICBub3QgY29udHJpYnV0ZSB0byB0aGUgbmVnb3RpYXRlZCBtZXRhZGF0YSBjYW4ndCBiZSBzZXJ2ZWQgd2l0aG91dAogICAgIGFuIGV4cGxpY2l0IHJlcXVlc3QuICBFLmcuLCBpZiB0aGUgLlogZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQgd2l0aAogICAgIGFuIHVuemlwIGZpbHRlciwgdGhlIHVzZXIgcmVxdWVzdCBzb21lZmlsZS5aLmh0bWwsIG1vZF9uZWdvdGlhdGlvbgogICAgIHdvbid0IHNlcnZlIGl0LiAgSXQgY2FuIHNlcnZlIHNvbWVmaWxlLlouaHRtbCB3aGVuIHNvbWVmaWxlLlogaXMKICAgICByZXF1ZXN0ZWQsIHNpbmNlIHRoZSAuWiBleHRlbnNpb24gaXMgZXhwbGljdGx5IHJlcXVlc3RlZCwgaWYgdGhlCiAgICAgLmh0bWwgZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBDb250ZW50VHlwZSB0ZXh0L2h0bWwuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW50cm9kdWNlIHRoZSBBZGRJbnB1dEZpbHRlciBmaWx0ZXJbO2ZpbHRlci4uLl0gZXh0IFtleHQuLi5dCiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgQWRkT3V0cHV0RmlsdGVyIHN5bnRheCwgdG8gaW5zZXJ0IG9uZSBvciBtb3JlIAogICAgIGZpbHRlcnMgYnkgbW9kX21pbWUgZmlsZW5hbWUgZXh0ZW5zaW9uIHByb2Nlc3NpbmcuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGEgZ3Jvd2luZyBjb25uZWN0aW9uIHBvb2wgaW4gY29yZV9vdXRwdXRfZmlsdGVyKCkgZm9yIAogICAgIGtlZXBhbGl2ZSByZXF1ZXN0cy4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vdmVkIHNwbGl0X2FuZF9wYXNzX3ByZXRhZ19idWNrZXRzIGJhY2sgdG8gYmVpbmcgYQogICAgIG1hY3JvIGF0IFJ5YW5zJ3MgcmVxdWVzdC4gUmVtb3ZlZCB0aGUgcmV0dXJuIGZyb20gaXQKICAgICBieSBzZXR0aW5nIGFuZCByZXR1cm5pbmcgYSByZXR1cm4gY29kZSBpbnN0ZWFkLiBVcGRhdGVkCiAgICAgdGhlIGNvZGUgdG8gY2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIG1hY3JvIGFuZAogICAgIGRvIHRoZSByaWdodCB0aGluZy4gW1BhdWwgSi4gUmVkZXJdCgogICopIEZpeCBhIHNlZ2ZhdWx0IHdoZW4gYSBudW1lcmljIHZhbHVlIHdhcyByZWNlaXZlZCBmb3IgSG9zdDouCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkIGEgZnVuY3Rpb24gYXBfcmVtb3ZlX2lucHV0X2ZpbHRlci4gIFRoaXMgaXMgdG8gbWF0Y2gKICAgICB1cCB3aXRoIGFwX3JlbW92ZV9vdXRwdXRfZmlsdGVyLiAgW1J5YW4gQmxvb21dCgogICopIENsZWFuIHVwIGxvY2F0aW9uX3dhbGssIHNvIHRoYXQgdGhpcyBzdGVwIHBlcmZvcm1zIGEgbWluaW11bQogICAgIGFtb3VudCBvZiByZWR1bmRhbnQgZWZmb3J0IChpdCBtdXN0IGJlIHJ1biB0d2ljZSwgYnV0IGl0IHdpbGwgbm8KICAgICBsb25nZXIgcmVwYXJzZSBhbGwgPExvY2F0aW9uID4gYmxvY2tzIHdoZW4gdGhlIHJlcXVlc3QgdXJpCiAgICAgaGFkbid0IGNoYW5nZWQuKSAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRWxpbWluYXRlIHByb3h5OiAoYW5kIGFsbCBvdGhlciAnc3BlY2lhbCcpIHByb2Nlc3NpbmcgZnJvbSB0aGUKICAgICBhcF9kaXJlY3Rvcnlfd2FsaygpIHBoYXNlLiAgTW9kdWxlcyB0aGF0IHdhbnQgdG8gdXNlIHNwZWNpYWwKICAgICB3YWxrIGxvZ2ljIHNob3VsZCByZWZlciB0byB0aGUgbW9kX3Byb3h5IG1hcF90b19sb2NhdGlvbiBleGFtcGxlLAogICAgIHdpdGggaXQncyBwcm94eV93YWxrIGFuZCBwcm94eXNlY3Rpb24gaW1wbGVtZW50YXRpb24uICBUaGlzIG1ha2VzCiAgICAgZWl0aGVyIGRpcmVjdG9yeV93YWxrIGZsYXZvciBtdWNoIG1vcmUgbGVnaWJsZSwgc2luY2UgdGhhdCBwaGFzZQogICAgIG9ubHkgcnVucyBhZ2FpbnN0IHJlYWwgPERpcmVjdG9yeSA+IGJsb2Nrcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTRUNVUklUWTogRml4IGEgc2VjdXJpdHkgcHJvYmxlbSBpbiBtb2RfaW5jbHVkZSB3aGljaCB3b3VsZCBhbGxvdwogICAgIGFuIFNTSSBkb2N1bWVudCB0byBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCB1bnBhcnNlZC4KICAgICBbQ2xpZmYgV29vbGxleSwgQnJpYW4gUGFuZV0KCiAgKikgSW50cm9kdWNlIHRoZSBtYXBfdG9fc3RvcmFnZSBob29rLCB3aGljaCBhbGxvd3MgbW9kdWxlcyB0byBieXBhc3MKICAgICB0aGUgZGlyZWN0b3J5X3dhbGsgYW5kIGZpbGVfd2FsayBmb3Igbm9uLWZpbGUgcmVxdWVzdHMuICBUUkFDRQogICAgIHNob3J0Y3V0IG1vdmVkIHRvIGh0dHBfcHJvdG9jb2wuYyBhcyBBUFJfSE9PS19NSURETEUsIGFuZCB0aGUKICAgICBkaXJlY3Rvcnlfd2Fsay9maWxlX3dhbGsgaGFwcGVuIGFzIEFQUl9IT09LX1ZFUllfTEFTVCBpbiBjb3JlLmMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkIHRoZSBhYmlsaXR5IGZvciBtb2RfaW5jbHVkZSB0byBhZGQgdGhlIElOQ0xVREVTIGZpbHRlcgogICAgIGlmIHRoZSBmaWxlIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBzZXJ2ZXItcGFyc2VkIGhhbmRsZXIuCiAgICAgVGhpcyBtYWtlcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgLnNodG1sIGZpbGVzIG11Y2ggZWFzaWVyCiAgICAgdG8gdW5kZXJzdGFuZCwgYW5kIGFsbG93cyBtb2RfaW5jbHVkZSB0byBob25vciBBcGFjaGUgMS4zCiAgICAgY29uZmlnIGZpbGVzLiAgIEJhc2VkIG9uIERvdWcgTWFjRWFjaGVybidzIHBhdGNoIHRvIFBIUAogICAgIHRvIGRvIHRoZSBzYW1lIHRoaW5nLiAgW1J5YW4gQmxvb21dCgogICopIGZvcmNlIE9wZW5TU0wgdG8gaWdub3JlIHByb2Nlc3MgbG9jYWwtY2FjaGluZyBhbmQgdG8gYWx3YXlzCiAgICAgZ2V0L3NldC9kZWxldGUgc2Vzc2lvbnMgdXNpbmcgbW9kX3NzbCdzIGNhbGxiYWNrcwogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+LAogICAgICBHZW9mZiBUaG9ycGUgPGdlb2ZmIGdlb2ZmdGhvcnBlLm5ldD5dCgogICopIE1ha2UgdGhlIHdvcmtlciBNUE0gc2h1dGRvd24gYW5kIHJlc3RhcnQgY2xlYW5seS4gIFRoaXMgYWxzbwogICAgIGNsZWFucyB1cCBzb21lIHJhY2UgY29uZGl0aW9ucywgYW5kIGdldHMgdGhlIHdvcmtlciB1c2luZwogICAgIHBvb2xzIG1vcmUgY2xlYW5seS4gIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBJbXBsZW1lbnQgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCkgaW4gdGVybXMgb2YgYXByX2xvY2sKICAgICBmb3IgbW9kX3NzbAogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XQoKICAqKSBGaXggZm9yIG1vZF9pbmNsdWRlLiBSeWFuJ3MgcGF0Y2ggdG8gY2hlY2sgZXJyb3IKICAgICBjb2RlcyBwdXQgYSByZXR1cm4gaW4gdGhlIHdyb25nIHBsYWNlLiBBbHNvLCB0aGUKICAgICBpbmNsdWRlIGhhbmRsZXIgcmV0dXJuIGNvZGUgd2Fzbid0IGJlaW5nIGNoZWNrZWQuCiAgICAgSSBkb24ndCBsaWtlIG1hY3JvcyB3aXRoIHJldHVybnMsIHNvIEkgY29udmVydGVkCiAgICAgU1BMSVRfQU5EX1BBU1NfUFJFVEFHX0JVQ0tFVFMgaW50byBhIGZ1bmN0aW9uLgogICAgIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIGZpeCBzZWd2IGluIG1vZF9taW1lIGlmIG5vIEFkZFR5cGVzIGFyZSBjb25maWd1cmVkCiAgICAgW0pvaG4gU3RlcmxpbmcgPHN0ZXJsaW5nIGNvdmFsZW50Lm5ldD5dCgogICopIEVuYWJsZSBzc2wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGF0IFNTTF9hY2NlcHQgdGltZQogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiBtb2RfaW5jbHVkZSB3aGVuIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGhhcyBubwogICAgIGFzc29jaWF0ZWQgZmlsZW5hbWUgKGUuZy4sIHdlJ3JlIGZpbHRlcmluZyB0aGUgZXJyb3IgZG9jdW1lbnQgZm9yCiAgICAgYSBiYWQgVVJJKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHN0b3JhZ2UgbGVhayAoYSBzdHJkdXAoKSBjYWxsKSBpbiBtb2RfbWltZV9tYWdpYy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFRoZSBwcmVmb3JrIGFuZCBPUy8yIE1QTXMgYXJlIG92ZXJ3cml0aW5nIHRoZSBwaWQgZmlsZSB3aGVuIGEgc2Vjb25kIGNvcHkKICAgICBvZiBodHRwZCBpcyBzdGFydGVkIGFuZCBzaHV0cyBkb3duIGR1ZSB0byBzb2NrZXQgY29uZmxpY3QuIE1vdmluZyB0aGUKICAgICBjYWxsIHRvIGFwX2xvZ19waWQgc29sdmVzIHRoZSBwcm9ibGVtLgoKICAqKSBDaGFuZ2VkIHRoZSBsYXRlLTEuMyBsb2dfY29uZmlnIHN1YnN0aXR1dGlvbiAlYyB0byAlWCwgdG8gbG9nIHRoZQogICAgIHN0YXR1cyBvZiB0aGUgY2xvc2VkIGNvbm5lY3Rpb24sIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZSBmYXIgbW9yZQogICAgIGNvbW1vbiwgaGlzdG9yaWNhbCBzc2wgbG9nZ2luZyBkaXJlY3RpdmUgJS4uLnt2YXJ9Yy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIHRoZSBjb21tb24gZXJyb3IvIHRyZWUgdG8gdGhlIGJ1aWxkL2luc3RhbGwgdGFyZ2V0cyAKICAgICAoc2ltaWxhciB0byB0aGUgY29tbW9uIGljb25zLyB0cmVlKSBmb3IgdGhlIG11bHRpLWxhbmd1YWdlIGVycm9yIAogICAgIG1lc3NhZ2VzIHRoYXQgTGFycyBjb21taXR0ZWQgZWFybGllci4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIGEgbXVsdGkgcHJvY2VzcywgbXVsdGkgdGhyZWFkZWQgT1MvMiBNUE0gbXBtdF9vczIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBBZGRlZCBhIGRlZmF1bHQgY29tbWVudGVkLW91dCBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcAogICAgIGNvbmZpZ3VyYXRpb24gdG8gaHR0cGQtc3RkLmNvbmYgYW5kIGh0dHBkLXdpbi5jb25mCiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcC4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIEVuYWJsZWQgbmVnYXRpdmUgY2FjaGluZyBvbiBhdHRyaWJ1dGUgY29tcGFyaXNvbnMgaW4gdGhlIExEQVAgY2FjaGUuCiAgICAgRml4ZWQgYSBwcm9ibGVtIHdoZXJlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCB3YXMgc2V0IGluIG1pbGxpc2Vjb25kcwogICAgIG5vdCBtaWNyb3NlY29uZHMgY2F1c2luZyB0aGUgY2FjaGUgdG8gdGltZSBvdXQgYWxtb3N0IGltbWVkaWF0ZWx5LgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4ZWQgYWxsIHRoZSAjaWYgQVBSX0hBU19TSEFSRURfTUVNT1JZIGNoZWNrcyB3aXRoaW4gdGhlIExEQVAKICAgICBtb2R1bGUgY29kZSB0byBmb2xsb3cgQVBSLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeGVkIExEQVAgY2xlYW51cCBvbiBncmFjZWZ1bCByZXN0YXJ0cy4gTERBUCBjb25uZWN0aW9ucyBhcmUgbm93CiAgICAgY2xlYW5lZCB1cCB3aGVuIHRoZSBjb25uZWN0aW9uIHBvb2wgcG9vbCBpcyBjbGVhbmVkIHVwLgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4IGEgbWlub3IgaXNzdWUgd2l0aCBKZWZmIFRyYXdpY2sncyBtb2RfaW5jbHVkZQogICAgIHBhdGNoLiBXaXRob3V0IHRoaXMgcGF0Y2gsIHRoZSBjb2RlIHdpbGwganVzdCBhbGxvY2F0ZQogICAgIG1vcmUgYnl0ZXMgaW4gZ2V0X2NvbWJpbmVkX2RpcmVjdGl2ZSB0aGFuIGFyZSBuZWVkZWQuCiAgICAgW1BhdWwgUmVkZXJdCgogICopIEFkZGVkIHRoZSBMREFQIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBtb2RfYXV0aF9sZGFwLgogICAgIFtEYXZlIENhcnJpZ2FuIDxkYXZlIHJ1ZGVkb2cub3JnPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEFkZGVkIHRoZSBMREFQIGNhY2hlIGFuZCBjb25uZWN0aW9uIHBvb2xpbmcgbW9kdWxlIG1vZF9sZGFwLgogICAgIFtEYXZlIENhcnJpZ2FuIDxkYXZlIHJ1ZGVkb2cub3JnPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCAtLWVuYWJsZS1tb2R1bGVzPWFsbCBicmVha2FnZSB3aXRoIG1vZF9hdXRoX2RiIGFuZCBtb2RfYXV0aF9kaWdlc3QKICAgICBieSBhbGxvd2luZyBhIG1vZHVsZSB0byBkaXNhYmxlIGl0c2VsZiBpZiBpdHMgcHJlcmVxdWlzaXRlcyBhcmUgbm90CiAgICAgbWV0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjQKCiAgKikgRml4IGEgY291cGxlIG9mIGlzc3VlcyBpbiBtb2RfaW5jbHVkZSB3aGVuIHRoZSB0YWcgYXBwZWFyZWQgYXQKICAgICBvZmZzZXRzIG5lYXIgODE5MiBpbiB0aGUgZmlsZSBiZWluZyBwYXJzZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gbW9kX3NzbCB3aGVuIHRoZSBrZWVwYWxpdmUgdGltZW91dCBpcyAgCiAgICAgcmVhY2hlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE51bWVyb3VzIGltcHJvdmVtZW50cyB0byB0aGUgV2luMzIgYnVpbGQgc3lzdGVtLiAgSW50cm9kdWNlZCBjb21tYW5kIGxpbmUKICAgICBidWlsZHMgd2l0aG91dCByZXF1aXJpbmcgLm1hayBmaWxlcyBmb3IgTVNWQyA2LjAgYW5kIGxhdGVyIHZlcnNpb25zLgogICAgIEltcHJvdmVkIC5kc3AgZmlsZSBjb21wYXRpYmlsaXR5IGZvciBib3RoIFZpc3VhbCBTdHVkaW8gNS4wIGFuZCA2LjAgdXNlcnMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQXNzb3J0ZWQgY29ycmVjdGlvbnMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgd2lubnRfbXBtIHN0YXJ0dXAgY29kZS4gIEJldHRlcgogICAgIHJlcG9ydGluZyBvZiB1bmluc3RhbGxlZCBzZXJ2aWNlcyBhbmQgb3RoZXIgZXJyb3IgY29uZGl0aW9ucywgYW5kIGNoYW5nZWQgdGhlIAogICAgIGRlZmF1bHQgc2VydmljZSBuYW1lIHRvIEFwYWNoZTIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBOdW1lcm91cyBpbXByb3ZlbWVudHMgdG8gdGhlIFdpbjMyIEFwYWNoZU1vbml0b3IgdXRpbGl0eSwgaW5jbHVkaW5nIHdpbm50X21wbSAKICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgQXBhY2hlIDEuMyBXaW4zMiBBcGFjaGUgbWFuYWdlbWVudCB1dGlsaXRlcy4gIAogICAgIFtNbGFkZW4gVHVyayA8bXR1cmsgbWFwcGluZ3NvZnQuY29tPiwgV2lsbGlhbSBSb3dlXQoKICAqKSBGaXhlZCB0aGUgc2VnZmF1bHRzIGluIG1vZF9taW1lIGludHJvZHVjZWQgYnkgaGFzaCB0YWJsZXMgaW4gMi4wLjIwLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgQW1lc10KCiAgKikgUm91bmRlZCBvdXQgdGhlIG1vZF9taW1lIEFkZC9SZW1vdmUgcGFpcnMgYnkgYWRkaW5nIFJlbW92ZUxhbmd1YWdlCiAgICAgYW5kIFJlbW92ZUNoYXJzZXQgZGlyZWN0aXZlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIFRoZSBVbml4IE1QTXMgb3RoZXIgdGhhbiBwZXJjaGlsZCBub3cgYWxsb3cgY2hpbGQgc2VydmVyIAogICAgIHByb2Nlc3NlcyB0byB1c2UgdGhlIGFjY2VwdCBtdXRleCB3aGVuIHN0YXJ0aW5nIGFzIHJvb3QgYW5kIAogICAgIHVzaW5nIFN5c1Ygc2VtcyBmb3IgdGhlIGFjY2VwdCBtdXRleC4gIFByZXZpb3VzbHksIHRoaXMgCiAgICAgY29tYmluYXRpb24gd291bGQgbGVhZCB0byBmYXRhbCBlcnJvcnMgaW4gdGhlIGNoaWxkIHNlcnZlciAKICAgICBwcm9jZXNzZXMuICBwZXJjaGlsZCBjYW4ndCB1c2UgU3lzViBzZW1zIGJlY2F1c2Ugb2Ygc2VjdXJpdHkKICAgICBpc3N1ZXMuICBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXNdCgogICopIEFkZGVkIFdpbjMyIHJldmlzaW9uIHN0YW1wIHJlc291cmNlcyB0byBhbGwgaHR0cCBiaW5hcmllcwogICAgIChpbmNsdWRpbmcgbW9kdWxlcy8gYW5kIHN1cHBvcnQvIHRvb2xzLikgIFBSNzMyMiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGFwX3J2cHJpbnRmIHRvIHN1cHBvcnQgbW9yZSB0aGFuIDRLIG9mIGRhdGEgYXQgb25lIHRpbWUuCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBXZSBoYXZlIGFsd2F5cyB1c2VkIHRoZSBvYnNvbGV0ZS9kZXByZWNhdGVkIE5ldHNjYXBlIHN5bnRheAogICAgIGZvciBvdXIgdHJhY2tpbmcgY29va2llczsgbm93IHRoZSBDb29raWVTdHlsZSBkaXJlY3RpdmUKICAgICBhbGxvd3MgdGhlIFdlYm1hc3RlciB0byBjaG9vc2UgdGhlIE5ldHNjYXBlLCBSRkMyMTA5LCBvcgogICAgIFJGQzI5NjUgZm9ybWF0LiAgVGhlIG5ldyBDb29raWVEb21haW4gZGlyZWN0aXZlIGFsbG93cyB0aGUKICAgICBzZXR0aW5nIG9mIHRoZSBjb29raWUncyBEb21haW49IGF0dHJpYnV0ZSwgdG9vLiAgUFIgI3MgNTAwNiwKICAgICA1MDIzLCA1OTIwLCA2MTQwIFtLZW4gQ29hcl0KCiAgKikgVHdlYWsgc2VydmVyL01ha2VmaWxlIHNvIHRoYXQgdGhlIHJ1bGVzIGZvciBnZW5lcmF0aW5nIGV4cG9ydHMuYwogICAgIGFyZSBjb21wYXRpYmxlIHdpdGggbWFrZSB1dGlsaXRpZXMgd2hpY2ggZG9uJ3QgZXhwYW5kIHdpbGRjYXJkcwogICAgIGluIGEgZGVwZW5kZW5jeSBsaXN0IChlLmcuLCBPUy8zOTAgbWFrZSwgY2VydGFpbiBsZXZlbHMgb2YgR05VCiAgICAgbWFrZSkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBJbnN0YWxsIHRoZSBTU0wgaGVhZGVycy4gIFtKb2huIFN0ZXJsaW5nIDxzdGVybGluZyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBCZWdpbiB0byBzYW5pdGl6ZSB0aGUgTVBNIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4gIE5vdywgYWxsCiAgICAgTVBNcyB1c2UgdGhlIHNhbWUgZnVuY3Rpb25zIGZvciBhbGwgY29tbW9uIE1QTSBkaXJlY3RpdmVzLiAgVGhpcwogICAgIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjYXRjaCBhbGwgYnVncyBpbiB0aGVzZSBkaXJlY3RpdmVzIG9uY2UuCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBDbG9zZSBhIG1ham9yIHJlc291cmNlIGxlYWsuICBFdmVyeSB0aW1lIHdlIGhhZCBpc3N1ZWQgYQogICAgIGdyYWNlZnVsIHJlc3RhcnQsIHdlIGxlYWtlZCBhIHNvY2tldCBkZXNjcmlwdG9yLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggdGhlIG5ldyBtZXRob2QgY29kZS4gIFdlIG5lZWQgdG8gY2FzdAogICAgIHRoZSAxIHRvIGFuIGFwcl9pbnQ2NF90IG9yIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIDMyLWJpdAogICAgIGludGVnZXIsIGFuZCBpdCB3aWxsIHdyYXAgYWZ0ZXIgYmVpbmcgc2hpZnRlZCAzMiB0aW1lcy4KICAgICBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD4gYW5kIFJ5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBhIGJ1ZyBpbiBtb2RfZXhwaXJlcy4gIFByZXZpb3VzIHRvIHRoaXMgcGF0Y2gsIGlmIHlvdQogICAgIHRvbGQgbW9kX2V4cGlyZXMgdG8gYWRkIDYwNDgwMCBzZWNvbmRzIHRvIHRoZSBsYXN0LW1vZGlmaWVkCiAgICAgdGltZSwgaXQgYWN0dWFsbHkgYWRkZWQgNjA0ODAwIHVzZWMncyB0byB0aGUgbGFzdC1tb2RpZmllZCB0aW1lLAogICAgIHNvIHRoYXQgd2hlbiBsb29raW5nIGF0IHRoZSByZXNwb25zZSBpdCBsb29rZWQgbGlrZSBub3RoaW5nCiAgICAgaGFkIGJlZW4gZG9uZS4gIFRoZSByb290IG9mIHRoZSBwcm9ibGVtIHdhcyB0aGF0IHdlIGFsd2F5cyBjb21wdXRlCiAgICAgdGltZSBpbiB1c2VjJ3MsIGJ1dCB3ZSBhc2sgdXNlcnMgdG8gaW5wdXQgc2VjJ3MuICBUaGlzIG1lYW5zIHdlCiAgICAgbmVlZCB0byBjb252ZXJ0IHRvIHVzZWMncyBiZWZvcmUgdXNpbmcgdGhvc2UgdmFsdWVzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBUaGUgd29ya2VyIE1QTSBub3cgaGFuZGxlcyBzaHV0ZG93biBhbmQgcmVzdGFydCByZXF1ZXN0cy4gIEl0CiAgICAgZGVmaW5pdGVseSBpc24ndCBwZXJmZWN0LCBidXQgd2UgZG8gc3RvcCB0aGUgc2VydmVycyBjb3JyZWN0bHkuCiAgICAgVGhlIGJpZ2dlc3QgcHJvYmxlbSByaWdodCBub3cgaXMgdGhhdCBTSUdIVVAgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8KICAgICBqdXN0IGRpZS4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjMKCiAgKikgVXNlIHRoZSBwcmVmb3JrIE1QTSBieSBkZWZhdWx0IG9uIFVuaXguICBbdmFyaW91c10KCiAgKikgQWRkZWQgYSBzeXN0cmF5IGljb24gbW9uaXRvciBhcHBsaWNhdGlvbiBmb3IgV2luMzIuCiAgICAgW01sYWRlbiBUdXJrIDxtdHVyayBtYXBwaW5nc29mdC5jb20+XQoKICAqKSBtb2RfcmV3cml0ZTogRml4IHRoZSBsaW5lIGVuZGluZyBvbiBzb21lIG5vbi1Vbml4IHN5c3RlbXMgZm9yIAogICAgIG1lc3NhZ2VzIHdyaXR0ZW4gdG8gdGhlIHJld3JpdGUgbG9nLiAgCiAgICAgW1JpY2hhcmQgTGFiZW5uZXR0IDxybGFiZW5uIHVzLmlibS5jb20+XQoKICAqKSBBbGwgbW9kX2F1dG9pbmRleCBxdWVyeSBwYXJzaW5nIGlzIG5vdyBxdWlldGx5IHF1YXNoZWQgd2l0aCB0aGUgCiAgICAgSW5kZXhPcHRpb24gSWdub3JlQ2xpZW50LiAgVGhlIEluZGV4T3B0aW9uIFN1cHByZXNzQ29sdW1uU29ydGluZyAKICAgICBzdGlsbCBkcm9wcyB0aGUgY29sdW1uIHNvcnQgPGEgaHJlZj4ncyBmb3IgdGhlIGNvbHVtbiBoZWFkZXJzLCBidXQgCiAgICAgSWdub3JlQ2xpZW50IGlzIHJlcXVpcmVkIHRvIGlnbm9yZSB0aGVzZSBRdWVyeSBvcHRpb25zIGVudGlyZWx5LiAgCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW50cm9kdWNlZCBuZXcgbW9kX2F1dG9pbmRleCBxdWVyeSBhcmd1bWVudCBwYXJzaW5nIGZvciBGPVswfDF8Ml0KICAgICB0byBhbGxvdyB0aGUgY2xpZW50IHRvIHNlbGVjdCBwbGFpbiwgRmFuY3lJbmRleGluZyBvciBIVE1MVGFibGUKICAgICBmb3JtYXR0aW5nLCBWPVswfDFdIHRvIGluaGliaXQgb3IgZW5hYmxlIHZlcnNpb24gc29ydGluZywgYW5kIAogICAgIFA9cGF0dGVybiB0byByZXR1cm4gb25seSBzcGVjaWZpYyBmaWxlcy4gIFRoZSBvbGQgUXVlcnkgQXJndW1lbnRzCiAgICAgd2VyZSByZW9yZ2FuaXplZCBhcyBDPWYgZm9yIHNvcnRpbmcgY29sdW1uICdmJyAoc2FtZSBOLCBELCBTLCBvciBNCiAgICAgYXMgYmVmb3JlKSwgYW5kIE89QXxEIGZvciBvcmRlcmluZyBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4gIAogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeGVkIGFuIGVycm9yIGluIG1vZF9pbmNsdWRlJ3MgZGlyZWN0aXZlIHBhcnNpbmcgcm91dGluZXMgd2hpY2gKICAgICBjYXVzZWQgI2lmLCAjZWxpZiwgYW5kICNlbHNlIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgYmFja3NsYXNoZXMKICAgICB0byBiZSBpbXByb3Blcmx5IGV2YWx1YXRlZC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBJbnRyb2R1Y2VkIG5ldyBtb2RfYXV0b2luZGV4IEluZGV4T3B0aW9ucyBmbGFnczogU3VwcHJlc3NJY29uIHRvIAogICAgIGRyb3AgdGhlIGljb24gY29sdW1uLCBTdXBwcmVzc1J1bGVzIHRvIGRyb3AgdGhlIDxocj4gZWxlbWVudHMsIAogICAgIGFuZCBIVE1MVGFibGUgdG8gY3JlYXRlIHJ1ZGltZW50YXJ5IEhUTUwgdGFibGUgbGlzdGluZ3MgKGltcGxpZXMgCiAgICAgRmFuY3lJbmRleGluZykuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZS1pbnRyb2R1Y2VkIHRoZSBtb2RfYXV0b2luZGV4IEluZGV4T3B0aW9ucyBmbGFnIFRyYWNrTW9kaWZpZWQKICAgICBmcm9tIEFwYWNoZSAxLjMuMTUuICBUaGlzIGlzIG5lZWRlZCBmb3IgdHdvIHJlYXNvbnMsIGZpcnN0LCBnaXZlbgogICAgIG11bHRpcGxlIG1hY2hpbmVzIHdpdGhpbiBhIHNlcnZlciBmYXJtLCBFVGFncyBhbmQgTGFzdC1Nb2RpZmllZCAKICAgICBzdGFtcHMgd29uJ3QgY29ycmVzcG9uZCBmcm9tIG1hY2hpbmUgdG8gbWFjaGluZSwgYW5kIHNlY29uZCwgbWFueSAKICAgICBVbml4ZXMgZG9uJ3QgY2FwdHVyZSBjaGFuZ2VzIHRvIHRoZSBkYXRlIG9yIHRpbWUgc3RhbXAgb2YgZXhpc3RpbmcgCiAgICAgZmlsZXMsIHNpbmNlIHRoZXNlIGRvbid0IG1vZGlmeSB0aGUgZGlyZW50IGl0c2VsZi4gIFtXaWxsaWFtIFJvd2VdCgogICopIFJlLWludHJvZHVjZWQgdGhlIG1vZF9hdXRvaW5kZXggSW5kZXhPcHRpb25zIGZsYWcgRm9sZGVyc0ZpcnN0IAogICAgIGFuZCBEaXJlY3RvcnlXaWR0aCBvcHRpb25zIGZyb20gQXBhY2hlIDEuMy4xMC4gCiAgICAgW1dpbGxpYW0gUm93ZSwgS2VuIENvYXJdCgogICopIEVsaW1pbmF0ZWQgRmFuY3lJbmRleGluZyBkaXJlY3RpdmUsIGRlcHJlY2F0ZWQgZWFybHkgaW4gQXBhY2hlCiAgICAgMS4zIGJ5IHRoZSBJbmRleE9wdGlvbnMgRmFuY3lJbmRleGluZyBzeW50YXguICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfYXV0b2luZGV4IG5vdyBleGNsdWRlcyBhbnkgZmlsZSBuYW1lcyB0aGF0IHdvdWxkIHJlc3VsdCBpbgogICAgIGFuIGVycm9yLCBvdGhlciB0aGFuIGEgc3VjY2VzcyBvciByZWRpcmVjdC4gIEFsc28gb3B0aW1pemVkCiAgICAgdGhlIHBhcmVudCBkaXJlY3RvcnksIGFsd2F5cyBpbmNsdWRlZCBleGNlcHQgaW4gdGhlIFVSSSAnLycuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmVmYWN0b3JlZCBtb2RfbmVnb3RpYXRpb24gYW5kIG1vZF9taW1lIHRvIGhlbHAgbW9kX2RpciBhY2NlcHQKICAgICBuZWdvdGlhdGVkIGluZGV4IHBhZ2VzLCBhbmQgcHJldmVudCB0aGUgc2VydmVyIGZyb20gZGVmYXVsdGluZwogICAgIHRvIGFuIGF1dG9pbmRleCBvZiB0aGUgZGlyZWN0b3J5LiAgbW9kX25lZ290aWF0aW9uIHdpbGwgbm93IGRpZQogICAgIHdpdGggYSA1MDAgSW50ZXJuYWwgRXJyb3IgaWYgaXQgY291bGQgbWF0Y2ggc29tZSBmaWxlbmFtZXMgCiAgICAgKGUuZy4gZm9yIG1vZF9kaXIpIGJ1dCBub25lIGNhbiBiZSBzZXJ2ZWQuICBtb2RfbmVnb3RhdGlvbiBub3cKICAgICByZWZ1c2VzIHRvIHNlcnZlIGFueSBmaWxlIHdpdGggYW4gZXh0ZW50aW9uIHRoYXQgbW9kX21pbWUgZG9lc24ndAogICAgIHJlY29nbml6ZSwgYW5kIHdhc24ndCBwYXJ0IG9mIHRoZSByZXF1ZXN0LiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRWxpbWluYXRlIG1vZF9jZ2kncyBoYW5kbGluZyBvZiAuZXhlIGZpbGVzIHdpdGhvdXQgdGhlIC5leGUgZmlsZQogICAgIGV4dGVuc2lvbi4gIFRoaXMgaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IG11bHRpdmlld3MsIGlmIHRoZSBhZG1pbgogICAgIHdpc2hlcyB0byBBZGRIYW5kbGVyIC5leGUgb3IgZGVmaW5lIGEgY29udGVudCB0eXBlIGhhbmRsZXIgYW5kIAogICAgIGFzc29jaWF0ZSAuZXhlIGZpbGVzIHdpdGggdGhhdCBjb250ZW50IHR5cGUuICBNdWx0aXZpZXdzIG11c3QgYmUKICAgICBlbmFibGVkIHRvIGFsbG93IHRoZXNlIHRvIGJlIHNlcnZlZC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNwZWVkIHVwIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0byBhIHNwaWtlIGluIGluY29taW5nIHdvcmtsb2FkCiAgICAgb3IgcmVzdGFydHMgYnkgYXNzaWduaW5nIGVtcHR5IHNjb3JlYm9hcmQgc2xvdHMgdG8gbmV3IHByb2Nlc3NlcwogICAgIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlLiAgW0dyZWcgQW1lc10KCiAgKikgQWRkIGEgaGFuZGxlciB0byBtb2RfaW5jbHVkZXMuYy4gIFRoaXMgaGFuZGxlciBpcyBkZXNpZ25lZCB0bwogICAgIGltcGxlbWVudCB0aGUgWGJpdEhhY2sgZGlyZWN0aXZlLiAgVGhpcyBjYW4ndCBiZSBkb25lIHdpdGggYQogICAgIGZpeHVwLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnQtdHlwZSwgd2hpY2ggaXMKICAgICBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgaGFuZGxlciBwaGFzZS4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIHRoZSBpbmNsdWRlcyBmaWx0ZXIgY2hlY2sgcmV0dXJuIGNvZGVzIGZyb20gZmlsdGVycyBsb3dlciBpbgogICAgIHRoZSBmaWx0ZXIgY2hhaW4uICBJZiBhIGxvd2VyIGxldmVsIGZpbHRlciByZXR1cm5zIGFuIGVycm9yLCB0aGVuCiAgICAgdGhlIHJlcXVlc3QgbmVlZHMgdG8gc3RvcCBpbW1lZGlhdGVseS4gIFRoaXMgYWxsb3dzIG1vZF9pbmNsdWRlIHRvCiAgICAgc3RvcCBwYXJzaW5nIGRhdGEgb25jZSBhIGxvd2VyIGZpbHRlciByZWNvZ25pemVzIGFuIGVycm9yLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgdGhlIGFiaWxpdHkgdG8gZXh0ZW5kIHRoZSBtZXRob2RzIHRoYXQgQXBhY2hlIHVuZGVyc3RhbmRzCiAgICAgYW5kIGhhdmUgdGhvc2UgbWV0aG9kcyA8bGltaXQ+YWJsZSBpbiB0aGUgaHR0cGQuY29uZi4gSXQgdXNlcyAKICAgICB0aGUgc2FtZSBiaXQgbWFzay9zaGlmdGVkIG9mZnNldCBhcyB0aGUgb3JpZ2luYWwgSFRUUCBtZXRob2RzIAogICAgIHN1Y2ggYXMgTV9HRVQgb3IgTV9QT1NULCBidXQgZXhwYW5kcyB0aGUgdG90YWwgYml0cyBmcm9tIGFuIGludCB0byAKICAgICBhbiBhcF9pbnQ2NF90IHRvIGhhbmRsZSBtb3JlIGJpdHMgZm9yIG5ldyByZXF1ZXN0IG1ldGhvZHMgdGhhbiAKICAgICBhbiBpbnQgcHJvdmlkZXMuICBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBicm9rZW4gbW9kX21pbWUgYmVoYXZpb3IgaW4gbWVyZ2luZyBpdHMgYXJndW1lbnRzLiAgUG9zc2libGUKICAgICBjYXVzZSBvZiB1bmV4cGxpY2FibGUgY3Jhc2hlcyBpbnRyb2R1Y2VkIGluIDIuMC4yMC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNvbHZlIG1hbnkgbW9kX3NzbCBwb3J0aW5nIGlzc3VlcyAodG9vIG1hbnkgdG8gZGV0YWlsKSB3aXRoIAogICAgIGhlbHAgZnJvbSB0aGUgd2hvbGUgdGVhbSwgYnV0IG1vc3Qgbm90YWJseSBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgCiAgICAgTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPiwgCiAgICAgRG91ZyBNYWNFYWNoZXJuLCBXaWxsaWFtIFJvd2UsIENsaWZmIFdvb2xsZXldCgogICopIE1vcmUgc3RhbGwgZml4ZXMgZm9yIHRoZSB0aHJlYWRlZCAmIHdvcmtlciBtcG0ncy4KICAgICBNYWtlIG1vZF9zdGF0dXMgb3V0cHV0IG1vcmUgYWNjdXJhdGUuICBEb24ndAogICAgIGNvdW50IHdvcmtlcnMgaW4gcHJvY2Vzc2VzIHdoaWNoIGFyZW4ndCBhY3RpdmVseQogICAgIHNlcnZpbmcgcmVxdWVzdHMuIFtHcmVnIEFtZXNdCiAgICAgCiAgKikgV2luMzI6IEdldCBTU0kgZXhlYyBjZ2kgdGFnIHdvcmtpbmcuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYSBzaW5nbGUgbGlzdGVuZXIvbXVsdGlwbGUgd29ya2VyIE1QTS4gIFRoaXMgTVBNIGlzCiAgICAgZGVmaW5hdGVseSBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGl0IGFsbG93cyB1cyB0byBzb2x2ZSBtYW55CiAgICAgb2YgdGhlIHByb2JsZW1zIHRoYXQgZXhpc3QgaW4gdGhlIHRocmVhZGVkIE1QTS4gIFRoaXMgaXMgYSAKICAgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB0aHJlYWRlZCBNUE0uICBbUnlhbiBCbG9vbV0KCiAgKikgSW1wcm92ZSBjb250ZW50IGdlbmVyYXRpb24gdGhyb3VnaG91dCBBcGFjaGUsIHByb3ZpZGluZyBjbG9zZXIKICAgICBjb21wbGlhbmNlIHdpdGggSFRNTCAzLjIsIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgYW5kIFhIVE1MIDEuMAogICAgIFRyYW5zaXRpb25hbCBzcGVjaWZpY2F0aW9ucy4gIFtXaWxsaWFtIFJvd2VdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yMgogIAogICopIEZpeCBhIHByb2JsZW0gd2hlcmUgdGhlIHRocmVhZGVkIE1QTSBzdGFsbHMgYWZ0ZXIgcmVzdGFydHMgb3IKICAgICBzZWdmYXVsdHMuICBBbHNvIHByZXZlbnQgbXVsdGlwbGUgYWN0aXZlIHByb2Nlc3NlcyBmcm9tIHVzaW5nCiAgICAgdGhlIHNhbWUgc2NvcmVib2FyZCBzbG90LiAgW0dyZWcgQW1lc10KCiAgKikgQXBhY2hlL1dpbjMyIG5vdyBmaWxscyBpbiB0aGUgc2VydmljZSBkZXNjcmlwdGlvbiB3aXRoIEFwYWNoZSdzCiAgICAgc2VydmVyIHZlcnNpb24gc3RyaW5nLCBpbmNsdWRpbmcgbG9hZGVkIGFuZCBhZHZlcnRpc2VkIG1vZHVsZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGhlIFdpbjMyIGJ1aWxkLCB0byByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbQogICAgIG1pc3NpbmcgYXByIG9yIGFwci11dGlsIGRpcmVjdG9yaWVzIG9yIHRoZSBhd2sgaW50ZXJwcmV0ZXIsIAogICAgIGNyZWF0ZSB0aGUgcHJvcGVyIGNnaS1iaW4gZXhhbXBsZXMsIGluY2x1ZGluZyBhIHRlc3QtY2dpLmJhdCwgYW5kIAogICAgIGZpeCB0aGUgcGVybCBzaGViYW5nIGxpbmUgZm9yIHByaW50ZW52LnBsLCB3aGVuIGluc3RhbGxpbmcgZnJvbSAKICAgICB0aGUgYnVpbGQgZW52aXJvbm1lbnQuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiB0aHJlYWRlZC5jIGNhdXNlZCBieSBwYXNzaW5nIHVuaW5pdGlhbGl6ZWQKICAgICBhcHJfdGhyZWFkX3QgKiB0byBhcHJfdGhyZWFkX2pvaW4oKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIFVzZSBuZXcgQVBSIG51bWJlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyB0byByZWR1Y2UgQ1BVIGNvbnN1bXB0aW9uIAogICAgIHdoZW4gc2V0dGluZyB0aGUgY29udGVudCBsZW5ndGgsIGFuZCBpbiBtb2RfbG9nX2NvbmZpZy4KICAgICBbQnJpYW4gUGFuZV0KICAgICAKICAqKSBGaXggcHJvYmxlbSByZXBvcnRlZCBieSBUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPgogICAgIHdoZXJlIEhFQUQgcmVzcG9uc2UgaGVhZGVycyB3ZXJlIGJlaW5nIHJlcGVhdGVkIHR3aWNlIGZvcgogICAgIGZpbGVzIGdyZWF0ZXIgdGhhbiAzMksgYnl0ZXMgKDQqQVBfTUlOX0JZVEVTX1RPX1dSSVRFKS4gVGhpcwogICAgIHByb2JsZW0gaW4gdGhlIGh0dHBfaGVhZGVyIGZpbHRlciB3YXMgZXhwb3NlZCBieSB0aGUgcmVjZW50IHJld3JpdGUKICAgICBvZiB0aGUgY29udGVudF9sZW5ndGggZmlsdGVyLiBbVGFrZXRvIEthYmUsIEJpbGwgU3RvZGRhcmRdCgogICopIEZpeCBzZWcgZmF1bHRzIGluIG1vZF9zdGF0dXMgd2l0aCBFeHRlbmRlZFN0YXR1cyBlbmFibGVkLCBhZnRlcgogICAgIHJlc3RhcnRzLiAgQSBnYXJiYWdlIHBvaW50ZXIgdG8gYSB2aG9zdCdzIHNlcnZlcl9yZWMgZnJvbSB0aGUKICAgICBwcmV2aW91cyBnZW5lcmF0aW9uIHdhcyBiZWluZyBsZWZ0IGFyb3VuZCB1bmRlciBjZXJ0YWluCiAgICAgY29uZGl0aW9ucy4gW0dyZWcgQW1lc10KCiAgKikgRml4IGEgY29zbWV0aWMgcHJvYmxlbSB3aXRoIG1vZF9pbmNsdWRlLiAgTm9uLWV4aXN0YW50IFNTSSB2YXJzCiAgICAgdXNlZCB0byBhcHBlYXIgYXMgJyhub25lJywgd2l0aG91dCB0aGUgY2xvc2luZyBwYXJlbi4KICAgICBbR/xudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD5dCgogICopIEltcHJvdmUgdGhlIGV4cG9ydHMgZ2VuZXJhdGluZyBhd2sgc2NyaXB0LiAgSW4gdGhlIHBhc3QsIHdlIGhhZAogICAgIHdvcmsgYXJvdW5kIHByb2JsZW1zIGluIHRoZSBhd2sgc2NyaXB0IGJ5IGF2b2lkaW5nIHNvbWUgI2lmIGFuZAogICAgICNpZmRlZnMuICBUaGlzIGhhcyBiaXR0ZW4gdXMgbWFueSB0aW1lcyBpbiBnZW5lcmF0aW5nIHRoZSBleHBvcnRzLmMKICAgICBmaWxlLiAgVGhpcyBpbXByb3ZlbWVudCBhbGxvd3MgY29ycmVjdHMgdGhlIGhlYWRlciBmaWxlIHBhcnNpbmcuCiAgICAgW1NhbmRlciBTdHJpa2VyIDxzdHJpa2VyIGFwYWNoZS5vcmc+XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjEKCiAgKikgUmVzb2x2ZSB0aGUgV2luMzIgaHRwYXNzd2QgYnVnLCB3aGVyZSBhIGZpbGUgdGhhdCBleGlzdGVkIHdvdWxkIGJlCiAgICAgb3ZlcndyaXR0ZW4sIHJlZ2FyZGxlc3Mgb2YgdGhlIC1jIGZsYWcuCiAgICAgW1dpbGxpYW0gUm93ZSwgTWxhZGVuIFR1cmsgPG1sYWRlbi50dXJrIG1haWwuaW5ldC5ocj5dCgogICopIEludHJvZHVjZSBjb25uZWN0aW9uIHN1Yi1wb29scyBpbnRvIGFiLiAgVHJ1bmNhdGluZyB0aGUgbGlmZXRpbWUKICAgICBvZiB0aGVzZSBhbGxvY2F0aW9ucyBtZWFucyB0aGF0IGFiIG5vIGxvbmdlciBwZXJwZXR1YWxseSBncm93cwogICAgIGl0cyB3b3JraW5nIHNldCwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9uIGxhcmdlIHJlcXVlc3QgYXR0ZW1wdHMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSBzY29yZWJvYXJkIGNyZWF0aW9uIGEgaG9vay4gIFRoaXMgYWxsb3dzIG1hbmFnZW1lbnQKICAgICBtb2R1bGVzIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBzY29yZWJvYXJkIGF0IHRoZSB0aW1lIHRoYXQgaXQgaXMKICAgICBjcmVhdGVkLCBhbmQgYXQgZXZlcnkgcmVzdGFydCByZXF1ZXN0LiAgCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBDaGFuZ2VkIEFQX01QTVFfTUFYX0RBRU1PTlMgdG8gcmVmZXIgdG8gTWF4Q2xpZW50cyBhbmQKICAgICBhZGRlZCBhbiBBUF9NUE1RX01BWF9EQUVNT05fVVNFRCB0byByZWZlciB0byB0aGUgaGlnaGVzdAogICAgIGRhZW1vbiBpbmRleCBhY3R1YWxseSB1c2VkIGluIHRoZSBzY29yZWJvYXJkLiBJIGFsc28KICAgICB1cGRhdGVkIHRoZSBwZXJ0aW5lbnQgY2FsbHMuIFtQYXVsIEouIFJlZGVyXQoKICAqKSBXaW4zMjogUHJldmVudCBsaXN0ZW5pbmcgc29ja2V0cyBmcm9tIGJlaW5nIGluaGVyaXRlZCBieQogICAgIHRoZSBBcGFjaGUgY2hpbGQgcHJvY2VzcywgQ0dJIHNjcmlwdHMsIHJvdGF0ZWxvZyBwcm9jZXNzCiAgICAgZXRjLiAgSWYgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzIHNlZ2ZhdWx0cywgYW55IHByb2Nlc3NlcyAKICAgICB0aGF0IHRoZSBjaGlsZCBzdGFydGVkIGFyZSBub3QgcmVhcGVkLiBQcmlvciB0byB0aGlzIGZpeCwKICAgICB0aGVzZSBwcm9jZXNzZXMgaW5oZXJpdGVkIHRoZSBsaXN0ZW5pbmcgc29ja2V0cyB3aGljaCBzb21ldGltZXMKICAgICBwcmV2ZW50ZWQgdGhlIHJlc3RhcnRlZCBBcGFjaGUgY2hpbGQgcHJvY2VzcyBmcm9tIGFjY2VwdGluZwogICAgIGNvbm5lY3Rpb25zIChpZSwgdGhlIHNlcnZlciB3b3VsZCBoYW5nKS4gCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFByb3ZpZGUgdmhvc3QgYW5kIHJlcXVlc3Qgc3RyaW5ncyB3aGVuIEV4dGVuZGVkU3RhdHVzIGlzIG9uLgogICAgIFtHcmVnIEFtZXNdCgogICopIEZpeCBzb21lIGlzc3VlcyB3aXRoIHRoZSBwb2QgYW5kIHByZWZvcms6IGNoZWNrIHRoZSBwb2QgKmFmdGVyKgogICAgIHByb2Nlc3NpbmcgYSBjb25uZWN0aW9uIHNvIHRoYXQgYSBzZXJ2ZXIgcHJvY2Vzc2luZyBhIHRpbWUtCiAgICAgY29uc3VtaW5nIHJlcXVlc3QgYmFpbHMgb3V0IGFzIHNvb24gYXMgcHJhY3RpY2FsOyB3aGVuIHRoZQogICAgIHBhcmVudCBwcm9jZXNzIHdha2VzIHVwIGEgc2VydmVyIHByb2Nlc3MgdmlhIGNvbm5lY3QoKSwgdXNlIGFuCiAgICAgQVBSIHRpbWVvdXQgb24gdGhlIGNvbm5lY3QoKSBzbyB0aGF0IHdlIGRvbid0IGhhbmcgZm9yIGEgbG9uZwogICAgIHRpbWUgaWYgdGhlcmUgYXJlbid0IHNlcnZlciBwcm9jZXNzZXMgYXJvdW5kIHRvIGRvIGFjY2VwdCgpLgogICAgIFtKZWZmIFRyYXdpY2ssIEdyZWcgQW1lc10KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgdG8gbW9kX21pbWUuYy4gZmluZF9jdCgpIGluIG1vZF9taW1lLCAKICAgICBzcGVuZHMgYSBsb3Qgb2YgdGltZSBpbiBhcHJfdGFibGVfZ2V0IGNhbGxzLiAgVXNpbmcgdGhlIGRlZmF1bHQgCiAgICAgaHR0cGQuY29uZiwgdGhlIHRhYmxlcyBmb3IgbGFuZ3VhZ2VzIGFuZCBjaGFyc2V0cyBhcmUgc29tZXdoYXQKICAgICBsYXJnZSwgc28gdGhlIHRpbWUgc3BlbnQgc2Nhbm5pbmcgdGhlbSBvbiBlYWNoIHJlcXVlc3QgaXMKICAgICBzaWduaWZpY2FudC4gUmVwbGFjaW5nIHRoZSB0YWJsZXMgd2l0aCBoYXNoIHRhYmxlcyBwcm92aWRlcwogICAgIGEgbmljZSBzcGVlZHVwLiBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBBZGQgdHdvIGZ1bmN0aW9ucyB0byBhbGxvdyBtb2R1bGVzIHRvIGFjY2VzcyByYW5kb20gcGFydHMgb2YgdGhlCiAgICAgc2NvcmVib2FyZC4gIFRoaXMgYWxsb3dzIG1vZHVsZXMgY29tcGlsZWQgZm9yIG9uZSBNUE0gdG8gYWNjZXNzIHRoZQogICAgIHNjb3JlYm9hcmQsIGV2ZW4gaWYgaXQgdGhlIHNlcnZlciB3YXMgY29tcGlsZWQgZm9yIGFub3RoZXIgTVBNLgogICAgIFtIYXJyaWUgSGF6ZXdpbmtlbCA8aGFycmllIGNvdmFsZW50Lm5ldD5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yMAoKICAqKSBGaXggcHJvYmxlbSBpbiBjb250ZW50LWxlbmd0aCBmaWx0ZXIgd2hlcmUgdGhlIGZpbHRlciB3b3VsZAogICAgIGJ1ZmZlciBhbGwgdGhlIG91dHB1dCBmcm9tIGEgQ0dJIGJlZm9yZSBzZW5kaW5nIGFueSBieXRlcwogICAgIGRvd24gdGhlIGZpbHRlciBzdGFjayB0byB0aGUgbmV0d29yay4gVGhpcyBwcm9ibGVtIHdvdWxkIGNhdXNlCiAgICAgc2lnbmlmaWNhbnQgbWVtb3J5IGNvbnN1bXB0aW9uIGlmIHRoZSBDR0lzIGdlbmVyYXRlZAogICAgIGxvdHMgb2YgYnl0ZXMuIFtCaWxsIFN0b2RkYXJkXQogIAogICopIEdldCBub24tYmxvY2tpbmcgQ0dJIHBpcGUgcmVhZHMgd29ya2luZyB3aXRoIHRoZSBidWNrZXQgYnJpZ2FkZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBzZWcgZmF1bHQgb24gV2luZG93cyB3aGVuIHNlcnZpbmcgZmlsZXMgY2FjaGVkIHdpdGggbW9kX2ZpbGVfY2FjaGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgdGhyZWFkZWQgTVBNIHRoYXQgd291bGQgY2F1c2UgaXQgdG8ga2lsbCBvZmYgYWxsCiAgICAgd29ya2VycyBpbW1lZGlhdGVseSBhZnRlciBzdGFydGluZyBpZiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgc3RhcnRlZAogICAgIHdhcyBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkLiAgW1J5YW4gQmxvb20sIEJpbGwgU3RvZGRhcmRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xOQoKICAqKSBGaXggcHJvYmxlbSB3aXRoIHRocmVhZGVkIE1QTS4gIFRoZSBwcm9ibGVtIHdhcyB0aGF0IGlmIGVhY2ggY2hpbGQKICAgICBwcm9jZXNzIHdhcyBidXN5IHNlcnZpbmcgYSBzaW5nbGUgbG9uZy1saXZlZCByZXF1ZXN0IGFuZCB0aGUgc2VydmVyCiAgICAgd2FzIHNlbnQgYSBncmFjZWZ1bCByZXN0YXJ0IHNpZ25hbCwgdGhlIHNlcnZlciB3b3VsZCBzdG9wIHNlcnZpbmcKICAgICByZXF1ZXN0cy4gIFRoaXMgd291bGQgaGFwcGVuIGJlY2F1c2UgZWFjaCBjaGlsZCBwcm9jZXNzIHdvdWxkIHdhaXQgdG8KICAgICBkaWUgdW50aWwgdGhlIGxhc3QgdGhyZWFkIHdhcyBkb25lLCBhbmQgdGhlIHBhcmVudCB3b3VsZG4ndCBzcGF3biBhbnkKICAgICBuZXcgY2hpbGRyZW4gdW50aWwgYSBwcm9jZXNzIGRpZWQuICBOb3csIHRoZSBwYXJlbnQgbG9va3MgYXQgdGhlIGZhY3QKICAgICB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgZHlpbmcgZ3JhY2VmdWxseSwgYW5kIHN0YXJ0cyBuZXcgY2hpbGRyZW4uCiAgICAgVGhvc2UgbmV3IGNoaWxkcmVuIG9ubHkgc3RhcnQgZW5vdWdoIHRocmVhZHMgdG8gY29tcGxpbWVudCB0aGUgbnVtYmVyCiAgICAgb2YgdGhyZWFkcyBpbiB0aGUgb3RoZXIgY2hpbGQgcHJvY2VzcyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBzcG90IGluCiAgICAgdGhlIHNjb3JlYm9hcmQuICBJbiB0aGlzIHdheSwgd2UgbWFrZSBzdXJlIHRvIG5ldmVyIGdvIG92ZXIKICAgICBNYXhDbGllbnRzLiAgW1J5YW4gQmxvb21dCgogICopIG1vZGlmaWVkIG1vZF9uZWdvdGlhdGlvbiBhbmQgbW9kX2F1dG9pbmRleCB0byBzcGVlZCB1cCBieSBhbG1vc3QgYQogICAgIGZhY3RvciBvZiB0d28gb24gYXByX2Rpcl9yZWFkKCktZW5oYW5jZWQgcGxhdGZvcm1zLCBzdWNoIGFzIFdpbjMyCiAgICAgYW5kIE9TMiwgYnkgY2FsbGluZyBhcF9zdWJfcmVxdWVzdF9sb29rdXBfZGlyZW50KCkgd2l0aCB0aGUgcmVzdWx0cwogICAgIGFscmVhZHkgcHJvdmlkZWQgYnkgYXByX2Rpcl9yZWFkKCkuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfZmlsZV9jYWNoZSBpcyBub3cgbW9yZSByb2J1c3QgdG8gZmlsdGVyaW5nIGFuZCBzZXJ2ZXMgcmVxdWVzdHMKICAgICBzbGlnaHRseSBtb3JlIGVmZmljaWVudGx5LiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBwcm9ibGVtIGhhbmRsaW5nIEZMVVNIIGJ1Y2tldCBpbiB0aGUgY2h1bmtlZCBlbmNvZGluZyBmaWx0ZXIuCiAgICAgTW9kdWxlIHdhcyBjYWxsaW5nIGFwX3J3cml0ZSgpIGZvbGxvd2VkIGJ5IGFwX3JmbHVzaCgpIGJ1dCB0aGUgCiAgICAgc2VydmVkIGNvbnRlbnQgd2FzIG5vdCBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIGJyb3dzZXIuIEluc3BlY3Rpb24KICAgICBvZiB0aGUgb3V0cHV0IHN0cmVhbSByZXZlYWxlZCB0aGF0IHRoZSBmaXJzdCBkYXRhIGNodW5rIHdhcwogICAgIG1pc3NpbmcgdGhlIHRyYWlsaW5nIENSTEYgcmVxdWlyZWQgYnkgdGhlIFJGQy4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBhcHhzIG5vIGxvbmdlciBnZW5lcmF0ZXMgYXBfc2VuZF9odHRwX2hlYWRlcigpIGluIHRoZSBleGFtcGxlIGhhbmRsZXIKCiAgKikgRml4IGFuIGFiIHByb2JsZW0gd2hpY2ggY291bGQgY2F1c2UgYSBkaXZpZGUtYnktemVybyBleGNlcHRpb24KICAgICB3aXRoIGNlcnRhaW4gaW52b2NhdGlvbnMgKGUuZy4sIGFiIC1rIC1jIDYgLW4gMTAwIGxvY2FsaG9zdC8pLgogICAgIFtJYW4gSG9sc21hbiA8aWFuaCBjbmV0LmNvbT5dCgogICopIFNvbHZlIGNhc2UtaW5zZW5zaXRpdmUgcGxhdGZvcm1zJyBjb25mdXNpb24gYWJvdXQgbmVnb3RpYXRlZAogICAgIGZpbGVuYW1lcywgYWxsb3dpbmcgZmlsZXMgb2YgZGlmZmVybnQgY2FzZSB0byBtYXRjaCBpbiBjaG9vc2luZwogICAgIHRoZSBkb2N1bWVudCB0byBzZXJ2ZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBicm9rZW5uZXNzIHdoZW4gVGhyZWFkc1BlckNoaWxkIGlzIGhpZ2hlciB0aGFuIHRoZSBidWlsdC1pbgogICAgIGxpbWl0LiAgV2UgbGVmdCBhcF90aHJlYWRzX3Blcl9jaGlsZCBhdCB0aGUgaGlnaGVyIHZhbHVlIHdoaWNoCiAgICAgbGVkIHRvIHNlZ2ZhdWx0cyB3aGVuIGRvaW5nIGNlcnRhaW4gc2NvcmVib2FyZCBvcGVyYXRpb25zLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzZWcgZmF1bHRzIGFuZC9vciBtaXNzaW5nIG91dHB1dCBmcm9tIG1vZF9pbmNsdWRlLiAgVGhlCiAgICAgZGVmYXVsdF9oYW5kbGVyIHdhcyB1c2luZyB0aGUgc3VicmVxdWVzdCBwb29sIGZvciBmaWxlcyBhbmQKICAgICBNTUFQcywgZXZlbiB0aG91Z2ggdGhlIGFzc29jaWF0ZWQgQVBSIHN0cnVjdHVyZXMgdHlwaWNhbGx5IAogICAgIGxpdmUgbG9uZ2VyIHRoYW4gdGhlIHN1YnJlcXVlc3QuIFtHcmVnIEFtZXNdCiAgCiAgKikgRXh0ZW5kIG1vZF9zZXRlbnZpZiB0byBzdXBwb3J0IHNwZWNpZnlpbmcgcmVndWxhciBleHByZXNzaW9ucwogICAgIG9uIHRoZSBTZXRFbnZJZiAoYW5kIFNldEVudklmTm9DYXNlKSBkaXJlY3RpdmUgYXR0cmlidXRlIGZpZWxkLgogICAgIEV4YW1wbGU6ICBTZXRFbnZJZiBeVFMqICBbYS16XS4qIEhBVkVfVFMgCiAgICAgd2lsbCBjYXVzZSBIQVZFX1RTIHRvIGJlIHNldCBpZiBhbnkgb2YgdGhlIHJlcXVlc3QgaGVhZGVycyBiZWdpbnMgCiAgICAgd2l0aCAiVFMiIGFuZCBoYXMgYSB2YWx1ZSB0aGF0IGJlZ2lucyB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgc2V0IFthLXpdLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgaHR0cGQgY2hpbGRyZW4gbm93IHJlLWJpbmQgdGhlbXNlbHZlcyB0byBhIHJhbmRvbSBDUFUgb24KICAgICBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zIG9uIEFJWCB2aWEgYmluZHByb2Nlc3NvcigpIGluIDIuMC4KICAgICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIEZpeCBodGRpZ2VzdC4gSXQgd291bGQgZ28gaW50byBhIGxvb3AgaW4gZ2V0bGluZSB3aGVuIGFkZGluZyAKICAgICBhIHNlY29uZCB1c2VyLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzIgcGxhdGZvcm1zIG5vdyBmdWxseSBzdXBwb3J0IG1vZF91c2VyZGlyIG9wdGlvbnMuICBbV2lsbCBSb3dlXQoKICAqKSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGh0dHBkLmV4cCBmb3IgQUlYLgogICAgIERTT3Mgbm93IHdvcmsgYWdhaW4gb24gQUlYIGluIDIuMAogICAgIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KCiAgKikgQWRkIGEgbmV3IHJlcXVlc3QgaG9vaywgZXJyb3JfbG9nLiAgVGhpcyBwaGFzZSBhbGxvd3MgbW9kdWxlcwogICAgIHRvIGFjdCBvbiB0aGUgZXJyb3IgbG9nIHN0cmluZyBfYWZ0ZXJfIGl0IGhhcyBiZWVuIHdyaXR0ZW4KICAgICB0byB0aGUgZXJyb3IgbG9nLiAgVGhlIGdvYWwgZm9yIHRoaXMgaG9vayBpcyB0byBhbGxvdyBtb25pdG9yaW5nCiAgICAgbW9kdWxlcyB0byBzZW5kIHRoZSBlcnJvciBzdHJpbmcgdG8gdGhlIG1vbml0b3JpbmcgYWdlbnQuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1vZGlmeSBtb2RfZWNobyB0byBtYWtlIGl0IHVzZSBmaWx0ZXJzIGZvciBpbnB1dCBhbmQgb3V0cHV0LgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBFeHRlbmQgbW9kX2hlYWRlcnMgdG8gc3VwcG9ydCBjb25kaXRpb25hbCBkcml2ZW4gSGVhZGVyIAogICAgIGFkZCwgYXBwZW5kIGFuZCBzZXQuIFVzZSBTZXRFbnZJZiB0byBzZXQgYW4gZW52YXIgYW5kIGNvbmRpdGlvbmFsbHkKICAgICBhZGQvYXBwZW5kL3NldCBoZWFkZXJzIGJhc2VkIG9uIHRoaXMgZW52YXIgdGh1c2x5OgoKICAgICBTZXRFbnZJZiBUU015SGVhZGVyIHZhbHVlIEhBVkVfVFNNeUhlYWRlcgogICAgIEhlYWRlciBhZGQgTXlIZWFkZXIgIiV0ICVEIiBlbnY9SEFWRV9UU015SGVhZGVyCgogICAgIElmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGhlYWRlciAiVFNNeUhlYWRlcjogdmFsdWUiIHRoZW4gaGVhZGVyCiAgICAgTXlIZWFkZXI6ICJ0PXh4eHh4eHh4eHggRD15eXl5IiB3aWxsIGJlIHNlbnQgb24gdGhlIHJlc3BvbnNlLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBFeHRlbmQgbW9kX2hlYWRlcnMgdG8gc3VwcG9ydCB1c2luZyBmb3JtYXQgc3BlY2lmaWVycyBvbiBIZWFkZXIKICAgICBhZGQsIGFwcGVuZCBhbmQgc2V0IGhlYWRlciB2YWx1ZXMuIFR3byBmb3JtYXQgc3BlY2lmaWVycyBhcmUgc3VwcG9ydGVkOgoKICAgICAldCAtIHJlcG9ydHMsIGluIFVUQyBtaWNyb3NlY29uZHMgc2luY2UgdGhlIGVwb2NoLCB3aGVuIHRoZQogICAgICAgICAgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCgogICAgICVEIC0gcmVwb3J0cyB0aGUgdGltZSwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIAogICAgICAgICAgcmVjZWl2ZWQgYW5kIHRoZSByZXNwb25zZSBzZW50LiAKCiAgICAgRXhhbXBsZXM6CiAgICAgSGVhZGVyIGFkZCBNeUhlYWRlciAiVGhpcyByZXF1ZXN0IHNlcnZlZCBpbiAlRCBtaWNyb3NlY29uZHMuICV0IgoKICAgICByZXN1bHRzIGluIGEgaGVhZGVyIGJlaW5nIGFkZGVkIHRvIHRoZSByZXNwb25zZSB0aGF0IGxvb2tzIGxpa2UgdGhpczoKICAgICAKICAgICBNeUhlYWRlcjogVGhpcyByZXF1ZXN0IHNlcnZlZCBpbiBEPTU0MzggbWljcm9zZWNvbmRzLiB0PTk5MTQyNDcwNDQ0NzI1NgoKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHJlc2V0X2ZpbHRlcigpLiAgV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhvdyB3ZSByZW1vdmUgZmlsdGVycy4KICAgICBJZiB3ZSBzZXQgci0+b3V0cHV0X2ZpbHRlcnMgdG8gTlVMTCwgd2UgYWxzbyBoYXZlIHRvIHJlc2V0IHRoZQogICAgIGNvbm5lY3Rpb24ncyBmaWx0ZXJzLiAgW0pvaG4gU3RlcmxpbmddCgogICopIE9wdGltaXNlIHJlc2V0X2ZpbHRlcigpIGluIGh0dHBfcHJvdG9jb2wuYy4gW0dyZWcgU3RlaW5dCgogICopIEFkZCBhIGNoZWNrIHRvIGFwX2RpZSgpIHRvIG1ha2Ugc3VyZSB0aGUgZmlsdGVyIHN0YWNrIGlzIHNhbmUgYW5kCiAgICAgY29udGFpbnMgdGhlIGNvcnJlY3QgYmFzaWMgZmlsdGVycyB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBmaXhlcwogICAgIGEgcHJvYmxlbSB3aGVyZSBoZWFkZXJzIGFyZSBub3QgYmVpbmcgc2VudCBvbiBlcnJvci4gW0pvaG4gU3RlcmxpbmddCgogICopIE5ldyBIZWFkZXIgZGlyZWN0aXZlICdlY2hvJyBvcHRpb24uICJIZWFkZXIgZWNobyByZWdleCIgd2lsbAogICAgIGNhdXNlIGFueSBoZWFkZXJzIHJlY2VpdmVkIG9uIHRoZSByZXF1ZXN0IHRoYXQgbWF0Y2ggcmVnZXggdG8gYmUKICAgICBlY2hvZWQgdG8gKGluY2x1ZGVkIGluKSB0aGUgcmVzcG9uc2UgaGVhZGVycy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgaW5jbHVkZS9hcF9jb21wYXQuaCB0ZXN0ZWQgYW5kIHNldCBBUFJfQ09NUEFUX0ggaW5zdGVhZCBvZiBBUF9DT01QQVRfSC4KICAgICBUaGlzIHByZXZlbnRlZCB0aGUgaW5jbHVzaW9uIG9mIGFwcl9jb21wYXQuaC4gIFBSICM3NzczCiAgICAgW09sZWcgQnJveXRtYW5uIDxwaGQgcGhkLnBwLnJ1Pl0KCiAgKikgTW92ZWQgdXRpbF91cmkgdG8gdGhlIGFwci11dGlsIGxpYnJhcnkuICBUaGlzIHJlcXVpcmVkIGEgYnVuY2ggb2YKICAgICBhcHJfbmFtZSBjaGFuZ2VzIGZvciB0aGUgdXJpIHV0aWxpdHkgZnVuY3Rpb25zLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNb3ZlIHRoZSBhZGRpdGlvbiBvZiBkZWZhdWx0IEFQX0hUVFBfSFRUUF9IRUFERVIgZmlsdGVycyB0byB0aGUKICAgICBpbnNlcnRfZmlsdGVyIHBoYXNlIHNvIHRoYXQgb3RoZXIgZmlsdGVycyBhcmUgbm90IGJ5cGFzc2VkIGJ5IGRlZmF1bHQuCiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBSZWltcGxlbWVudCBtb2RfaGVhZGVycyBhcyBhbiBvdXRwdXQgZmlsdGVyLiBtb2RfaGVhZGVycyBjYW4gbm93CiAgICAgYWRkIGN1c3RvbSBoZWFkZXJzIHRvIGluYm91bmQgcmVxdWVzdHMgdXNpbmcgdGhlIFJlcXVlc3RIZWFkZXIgZGlyZWN0aXZlCiAgICAgYW5kIHRvIHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBvbGQgSGVhZGVyIGRpcmVjdGl2ZS4gIFtHcmFoYW0gTGVnZ2V0dF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE4CgogICopIEZpeCBjb21tYW5kLWxpbmUgcHJvY2Vzc2luZyBzbyB0aGF0IGlmIGEgYmFkIGFyZ3VtZW50IGlzIHNwZWNpZmllZAogICAgIEFwYWNoZSB3aWxsIGV4aXQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIG1ha2UgdGFyZ2V0cyBhbmQgcnVsZXMgdG8gYmUgY29uc2lzdGVudCBpbiBhbGwgb2YgdGhlCiAgICAgQXBhY2hlLW93bmVkIHNvdXJjZSB0cmVlcy4gIFtSb3kgRmllbGRpbmddCiAgICAgCiAgKikgRml4IHByb2Nlc3Npbmcgb2YgdGhlIFRSQUNFIG1ldGhvZC4gIFByZXZpb3VzbHkgd2UgcGFzc2VkIGJvZ3VzCiAgICAgcGFybXMgdG8gZm9ybV9oZWFkZXJfZmllbGQoKSBhbmQgaXQgb3ZlcmxhaWQgc29tZSB2aG9zdCBzdHJ1Y3R1cmVzLAogICAgIHJlc3VsdGluZyBpbiBhIHNlZ2ZhdWx0IGluIGNoZWNrX2hvc3RhbGlhcygpLiAKICAgICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBBZGQgc3VwcG9ydCBmb3IgcmVsaWFibGUgcGlwZWQgbG9ncy4gSWYgdGhlIGxvZ2dpbmcgcHJvY2VzcwogICAgIGdvZXMgZG93biwgQXBhY2hlIHdpbGwgYXV0b21hdGljYWxseSByZXN0YXJ0IGl0LiBUaGlzIGZ1bmN0aW9uIGhhcyAKICAgICBiZWVuIHBhcnQgb2YgQXBhY2hlIG9uIFVuaXgvTGludXgvQlNEIHNpbmNlIHRoZSBlYXJseSB2MS4zIHJlbGVhc2VzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBEbyBub3Qgc3RhcnQgcGlwZWQgbG9nIHByb2Nlc3NlcyBkdXJpbmcgdGhlIGNvbmZpZyBmaWxlIAogICAgIHByZWZsaWdodC4gIFRoaXMgY2hhbmdlIGFsc28gY2lyY3VtdmVudHMgYSBwcm9ibGVtIG9uIAogICAgIFdpbmRvd3Mgd2hlcmUgdGhlIHJvdGF0ZWxvZyBwcm9jZXNzZXMgY3JlYXRlZCBkdXJpbmcgcHJlZmxpZ2h0CiAgICAgd2FzIG5vdCBnZXR0aW5nIGNsZWFuZWQgdXAgcHJvcGVybHkuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIGFkZCAiUmVxdWVzdCBQaGFzZSBQYXJ0aWNpcGF0aW9uIiBpbmZvIHRvIG1vZF9pbmZvCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgTWFrZSBmaXJzdCBwaGFzZSBjaGFuZ2VzIHRvIHRoZSBzY29yZWJvYXJkIGRhdGEgc3RydWN0dXJlcyBpbgogICAgIHByZXBhcmF0aW9uIGZvciB0aGUgcmV3cml0aW5nIG9mIHRoZSBzY29yZWJvYXJkIHBlciBteSBwb3N0ZWQKICAgICBkZXNpZ24gbm90ZXMuIFtQYXVsIEouIFJlZGVyXQoKICAqKSBGaXggaHR0cGQncyBkZWZpbml0aW9uIG9mIExURkxBR1MgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoYXQgb2YgYXByCiAgICAgYW5kIGFwci11dGlsLCBhbGxvdyBpdCB0byBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjb25maWd1cmUgY29tbWFuZC1saW5lCiAgICAgKGRlZmF1bHQ9Ii0tc2lsZW50IikgYW5kIGludHJvZHVjZSBMVF9MREZMQUdTIHRvIHJlcGxhY2Ugd2hhdCB3ZSB3ZXJlCiAgICAgZm9ybWVybHkgYWJ1c2luZyBhcyBMVEZMQUdTLiAgW1JveSBGaWVsZGluZ10KCiAgKikgQ2xlYW4gdXAgdGhlIHJlcG9ydGluZyBvZiBpbmNvcnJlY3QgY2xvc2luZyBjb250YWluZXIgdGFncy4KICAgICBbQmFycmllIFNsYXltYWtlciA8YmFycmllcyBzbGF5c3lzLmNvbT5dCgogICopIFNpbXBsaWZ5IHRoZSBjb25maWd1cmUgcHJvY2VzcyBieSBtb3ZpbmcgYWxsIGxpYnRvb2wgc3R1ZmYgdG8gQVBSCiAgICAgYW5kIG1vdmluZyBoaW50cy5tNCBpbmxpbmUuICBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgdGhlIEFQX0RFQ0xBUkUoKS9BUF9DT1JFX0RFQ0xBUkUgbWFjcm9zIG9uIHRoZSByZXR1cm4gdHlwZXMKICAgICBvZiBmdW5jdGlvbnMgdXNlZCBieSBtb2RfcHJveHkgZm9yIGV4cG9ydCBpbiB0aGUgRExMIAogICAgIFtJYW4gSG9sc21hbiA8SWFuSCBjbmV0LmNvbT5dCgogICopIFByZXZlbnQgYSBoYW5nIHdoZW4gYSBjZ2kgaGFuZGxlZCBieSBtb2RfY2dpZCB0cmllcyB0byByZWFkIGEKICAgICByZXF1ZXN0IGJvZHkgZnJvbSBpdHMgc3RkaW4gYnV0IG5vIHJlcWVzdCBib2R5IGlzIGJlaW5nIHdyaXR0ZW4gdG8gCiAgICAgdGhlIGNnaS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9sb2dfY29uZmlnOiAlYyBjb25uZWN0aW9uIHN0YXR1cyBpbmNvcnJlY3RseSBsb2dnZWQKICAgICBhcyAiLSIgKG5vbi1rZWVwYWxpdmUpIHdoZW4gTWF4S2VlcEFsaXZlUmVxdWVzdHMgaXMgc2V0IHRvIDAuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEdldCBtb2RfY2Vybl9tZXRhIHdvcmtpbmcgdW5kZXIgV2luZG93cwogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBDcmVhdGUgRmlsZXMsIGFuZCB0aHVzIE1NQVBzLCBvdXQgb2YgdGhlIHJlcXVlc3QgcG9vbCwgbm90IHRoZQogICAgIGNvbm5lY3Rpb24gcG9vbC4gIFRoaXMgc29sdmVzIGEgc21hbGwgcmVzb3VyY2UgbGVhayB0aGF0IGhhZCB1cwogICAgIG5vdCBjbG9zaW5nIGZpbGVzIHVudGlsIGEgY29ubmVjdGlvbiB3YXMgY2xvc2VkLiAgSW4gb3JkZXIgdG8gZG8KICAgICB0aGlzLCBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlX291dHB1dF9maWx0ZXIsIHdlIGxvb3AgdGhyb3VnaCB0aGUKICAgICBicmlnYWRlIGFuZCBjb252ZXJ0IGFueSBkYXRhIHdlIGhhdmUgaW50byBhIHNpbmdsZSBIRUFQIGJ1Y2tldAogICAgIHRoYXQgd2Uga25vdyB3aWxsIHN1cnZpdmUgY2xlYXJpbmcgdGhlIHJlcXVlc3RfcmVjLgogICAgIFtSeWFuIEJsb29tLCBKdXN0aW4gRXJlbmtyYW50eiA8amVyZW5rcmFudHogZWJ1aWx0LmNvbT4sCiAgICAgIENsaWZmIFdvb2xsZXldCgogICopIENvbXBsZXRlbHkgcmV2YW1wIGNvbmZpZ3VyZSBzbyB0aGF0IGl0IHByZXNlcnZlcyB0aGUgc3RhbmRhcmQgbWFrZQogICAgIHZhcmlhYmxlcyBDUFBGTEFHUywgQ0ZMQUdTLCBDWFhGTEFHUywgTERGTEFHUyBhbmQgTElCUyBieSBtb3ZpbmcKICAgICB0aGUgY29uZmlndXJlIGFkZGl0aW9ucyB0byBFWFRSQV8qIHZhcmlhYmxlcy4gIEFsc28sIGFsbG93IHRoZSB1c2VyCiAgICAgdG8gc3BlY2lmeSBOT1RFU1RfKiB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUgYWJvdmUsIHdoaWNoIGVsaW1pbmF0ZXMgdGhlCiAgICAgbmVlZCBmb3IgVEhSRUFEX0NQUEZMQUdTLCBUSFJFQURfQ0ZMQUdTLCBhbmQgT1BUSU0uICBGaXggdGhlIHNldHRpbmcKICAgICBvZiBJTkNMVURFUyBhbmQgRVhUUkFfSU5DTFVERVMuICBDaGVjayBmbGFncyBhcyB0aGV5IGFyZSBhZGRlZCB0bwogICAgIGF2b2lkIHBvaW50bGVzcyBkdXBsaWNhdGlvbnMuICBGaXggdGhlIG9yZGVyIGluIHdoaWNoIGZsYWdzIGFyZSBnaXZlbgogICAgIG9uIHRoZSBjb21waWxlIGFuZCBsaW5rIGxpbmVzLiAgUmVtb3ZlIG9ic29sZXRlIG1hY3JvcyBBUFJfRE9FWFRSQSwKICAgICBBQ19BRERfTElCUkFSWSwgQUNfQ0hFQ0tfREVGSU5FLCBBUEFDSEVfUEFTU1RIUlUsIGFuZCBBUEFDSEVfT05DRS4KICAgICBBZGRlZCBBUFJfU0FWRV9USEVfRU5WSVJPTk1FTlQgYW5kIEFQUl9SRVNUT1JFX1RIRV9FTlZJUk9OTUVOVCBtYWNyb3MuCiAgICAgUmVuYW1lZCBBQ19UWVBFX1JMSU1fVCBtYWNybyB0byBBUEFDSEVfVFlQRV9STElNX1QuICBbUm95IEZpZWxkaW5nXQoKICAqKSBHZXQgbW9kX3RscyB0byBjb21waWxlL3dvcmsgYmV0dGVyIG9uIFdpbmRvd3MuICBQUiAjNzYxMgogICAgIFtCZXJuaGFyZCBTY2hyZW5rIDxiLnNjaHJlbmsgaW1wcm94LmNvbT5dCgogICopIEZpeCBzaHV0ZG93bi9yZXN0YXJ0IGhhbmdzIGluIHRoZSB0aHJlYWRlZCBNUE0uCiAgICAgW0plZmYgVHJhd2ljaywgR3JlZyBBbWVzLCBSeWFuIEJsb29tXQogIAogICopIFJlbW92ZWQgdGhlIGtlcHRhbGl2ZSBib29sZWFuIGZyb20gY29ubl9yZWMgYmVjYXVzZSBpdCBpcyBub3cgb25seQogICAgIHVzZWQgYnkgYSBzaW5nbGUgcm91dGluZSBhbmQgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgbG9jYWwgdmFyaWFibGUuCiAgICAgW0dyZWcgU3RlaW4sIFJ5YW4gQmxvb20sIFJveSBGaWVsZGluZ10KCiAgKikgUGF0Y2ggcHJlZm9yayB0byBwdXQgZW5vdWdoIG9mIHRoZSBzaWduYWwgcHJvY2Vzc2luZyBiYWNrIGluIHNvIHRoYXQKICAgICBzaWduYWxzIGFyZSBhbGwgaGFuZGxlZCBwcm9wZXJseSBub3cuIFRoZSBwcmV2aW91cyBwYXRjaCBmaXhlZCB0aGUKICAgICBkZWFkbG9jayByYWNlIGNvbmRpdGlvbiwgYnV0IGJyb2tlIHRoZSB1c2VyIGRpcmVjdGVkIHNpZ25hbCBoYW5kbGluZy4KICAgICBUaGlzIGZpeGVzIGl0IHRvIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIG15IHByZXZpb3VzIHByZWZvcmsgcGF0Y2gKICAgICAocHJpbWFyaWx5LCBTSUdURVJNIGlzIG5vdyB3b3JraW5nKS4KIAogICopIENoYW5nZSBob3cgaW5wdXQgZmlsdGVycyBkZWNpZGUgaG93IG11Y2ggZGF0YSBpcyByZXR1cm5lZCB0byB0aGUKICAgICBoaWdoZXIgZmlsdGVyLiAgV2UgdXNlZCB0byB1c2UgYSBmaWVsZCBpbiB0aGUgY29ubl9yZWMsIHdpdGggdGhpcwogICAgIGNoYW5nZSwgd2UgdXNlIGFuIGFyZ3VtZW50IHRvIGFwX2dldF9icmlnYWRlIHRvIGRldGVybWluZSBob3cgbXVjaAogICAgIGRhdGEgaXMgcmV0cmlldmVkLiBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHNlZyBmYXVsdCBhdCBzdGFydC11cCBpbnRyb2R1Y2VkIGJ5IFJ5YW4ncyBjaGFuZ2UgdG8gZW5hYmxlCiAgICAgbW9kdWxlcyB0byBzcGVjaWZ5IHRoZWlyIG93biBsb2dnaW5nIHRhZ3MuIG1vZF9sb2dfY29uZmlnCiAgICAgcmVnaXN0ZXJzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLCBhcF9yZWdpc3Rlcl9sb2dfaGFuZGxlcigpLgogICAgIGFwX3JlZ2lzdGVyX2xvZ19oYW5kbGVyKCkgd2FzIGJlaW5nIGNhbGxlZCBieSBodHRwX2NvcmUgYmVmb3JlCiAgICAgdGhlIGRpcmVjdGl2ZSBoYXNoIHRhYmxlIHdhcyBjcmVhdGVkLiBUaGlzIHBhdGNoIGNyZWF0ZXMgdGhlCiAgICAgZGlyZWN0aXZlIGhhc2ggdGFibGUgYmVmb3JlIGFwX3JlZ2lzdGVyX2xvZ19oYW5kbGVyKCkgaXMKICAgICByZWdpc3RlcmVkIGFzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLgogICAgIFtqZWFuLWZyZWRlcmljIGNsZXJlIDxqZnJlZGVyaWMuY2xlcmUgZnVqaXRzdS1zaWVtZW5zLmNvbT5dCgogICopIEFkZCBhcF9zZXRfaW50X3Nsb3QoKSBmdW5jdGlvbgogICAgIFtKb2huIEsuIFN0ZXJsaW5nIDxzdGVybGluZyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIEFwYWNoZSBkaWQgbm90IHN1cHBseSB0aGUKICAgICByaWdodCByZXNwb25zZSBoZWFkZXJzIHdoZW4gcmVxdWlyaW5nIGF1dGhlbnRpY2F0aW9uLgogICAgIFtHZXJ0amFuIHZhbiBXaW5nZXJkZSA8R2VydGphbi52YW4uV2luZ2VyZGUgY21nLm5sPl0gUFIjNzExNAogICAgIChUaGlzIGlzIGEgcG9ydCBvZiB0aGUgY2hhbmdlIHRoYXQgd2VudCBpbnRvIEFwYWNoZSAxLjMuMTkuKQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHNwZWNpZnkgdGhlaXIgb3duIGxvZ2dpbmcgdGFncy4gIFRoaXMgYmFzaWNhbGx5CiAgICAgYWxsb3dzIGEgbW9kdWxlIHRvIHRlbGwgbW9kX2xvZ19jb25maWcgdGhhdCB3aGVuICV4IGlzIGVuY291bnRlcmVkCiAgICAgYSBzcGVjaWZpYyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkLiAgQ3VycmVudGx5LCB4IGNhbiBiZSBhbnkgc2luZ2xlCiAgICAgY2hhcmFjdGVyLiAgSXQgbWF5IGJlIG1vcmUgdXNlZnVsIHRvIG1ha2UgdGhpcyBhIHN0cmluZyBhdCBzb21lIHBvaW50LgogICAgIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTcKCiAgKikgSWYgYSBoaWdoZXItbGV2ZWwgZmlsdGVyIGhhbmRsZXMgdGhlIGJ5dGVyYW5nZSBhc3BlY3RzIG9mIGEKICAgICByZXF1ZXN0LCB0aGVuIHRoZSBieXRlcmFuZ2UgZmlsdGVyIHNob3VsZCBub3QgdHJ5IHRvIHJlZG8gdGhlCiAgICAgd29yay4gIFRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIHRoaXMgaGFwcGVuaW5nLCBpcyBhIGJ5dGVyYW5nZQogICAgIHJlcXVlc3QgZ29pbmcgdGhyb3VnaCB0aGUgcHJveHksIGFuZCB0aGUgb3JpZ2luIHNlcnZlciBoYW5kbGVzCiAgICAgdGhlIGJ5dGVyYW5nZSByZXF1ZXN0LiAgVGhlIHByb3h5IHNob3VsZCBpZ25vcmUgaXQuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPl0KCiAgKikgQ2hhbmdlZCB0aGUgdGhyZWFkZWQgbXBtIHRvIGhhdmUgY2hpbGRfbWFpbiBqb2luIHRvIGVhY2ggb2YgdGhlCiAgICAgd29ya2VyIHRocmVhZHMgdG8gbWFrZSBzdXJlIHRoZSBraWRzIGFyZSBhbGwgZ29uZSBiZWZvcmUgY2hpbGRfbWFpbgogICAgIGV4aXRzIGFmdGVyIGEgc2lnbmFsIChjbGVhbnVwIGZyb20gcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSkuCiAgICAgVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgUnlhbnMgcmVjZW50IGNvbW1pdCB0byBtYWtlIHRoZSBjaGlsZF9tYWluCiAgICAgdGhlIHNpZ25hbCB0aHJlYWQuCgogICopIEFkZCBtb3JlIG9wdGlvbnMgdG8gdGhlIGFwX21wbV9xdWVyeSBmdW5jdGlvbi4gIFRoaXMgYWxzbyBhbGxvd3MgTVBNcyB0bwogICAgIHJlcG9ydCBpZiB0aGVpciB0aHJlYWRzIGFyZSBkeW5hbWljIG9yIHN0YXRpYy4gIEZpbmFsbHksIHRoaXMgYWxzbwogICAgIGltcGxlbWVudHMgYSBuZXcgQVBJLCBhcF9zaG93X21wbSwgd2hpY2ggcmV0dXJucyB0aGUgTVBNIHRoYXQgd2FzCiAgICAgcmVxdWlyZWQgaW50byB0aGUgY29yZS4gW0hhcnJpZSBIYXpld2lua2VsIDxoYXJyaWUgY292YWxlbnQubmV0Pl0KCiAgKikgRG8gbm90IGluc3RhbGwgdGhlIGJpbmFyaWVzIGZyb20gdGhlIHN1cHBvcnQgZGlyZWN0b3J5IHR3aWNlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuIGlpamxhYi5uZXQ+XQoKICAqKSBUaGUgYXBfZiogZnVuY3Rpb25zIHNob3VsZCBmbHVzaCBkYXRhIHRvIHRoZSBmaWx0ZXIgdGhhdCBpcyBwYXNzZWQKICAgICBpbiwgbm90IHRoZSBmaWx0ZXIgYWZ0ZXIgdGhlIG9uZSBwYXNzZWQgaW4uCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIE1ha2UgYWIgd29yayBhZ2FpbiBieSBjaGFuZ2luZyBpdHMgbmF0aXZlIHR5cGVzIHRvIGFwciB0eXBlcyBhbmQgZm9ybWF0cy4KICAgICBbSnVzdGluIEVyZW5rcmFudHogPGplcmVua3JhbnR6IGVidWlsdC5jb20+XQoKICAqKSBNb3ZlIHRoZSBieXRlcmFuZ2UgZmlsdGVyIGFuZCBhbGwgb2YgdGhlIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGJhY2sKICAgICB0byB0aGUgSFRUUCBtb2R1bGUuICBUaGUgYnl0ZXJhbmdlIGZpbHRlciB0dXJuZWQgb3V0IHRvIGJlIHZlcnkKICAgICBIVFRQIHNwZWNpZmljLCBhbmQgaXQgYmVsb25ncyBpbiB0aGUgSFRUUCBtb2R1bGUuICBbR3JlZyBTdGVpbl0KCiAgKikgTWFrZSBjbGVhbiwgZGlzdGNsZWFuLCBhbmQgZXh0cmFjbGVhbiBjb25zaXN0ZW50bHkgYWNjb3JkaW5nIHRvIHRoZQogICAgIEdudSBtYWtlZmlsZSBndWlkZWxpbmVzLiAgW0p1c3RpbiBFcmVua3JhbnR6IDxqZXJlbmtyYW50eiBlYnVpbHQuY29tPl0KCiAgKikgRml4IGVycm9ycyBpbiB0aGUgcmVuYW1pbmcgb2YgdGhlIGFwcl90aHJlYWRhdHRyX2RldGFjaF94eHggZnVuY3Rpb25zLgogICAgIFRoaXMgbWF5IGhhdmUgYmVlbiBjYXVzaW5nIHByb2JsZW1zIHN0b3BwaW5nIHByb2Nlc3NlcyBpbiB0aGUgdGhyZWFkZWQKICAgICBtcG0ncy4gW0dyZWcgQW1lc10KCiAgKikgRml4IGNvbnRlbnQtbGVuZ3RoIGluIG1vZF9uZWdvdGlhdGlvbiB0byBhIGxvbmcgaW50IHJlcHJlc2VudGF0aW9uLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIFJlbW92ZSBCaW5kQWRkcmVzcyBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlLgogICAgIFs8Z2lsZXMgbmVtZXRvbi5jb20uYXU+XQoKICAqKSBBbGxvdyBtb2R1bGUgYXV0aG9ycyB0byBhZGQgYSBtb2R1bGUgdG8gdGhlaXIgQXBhY2hlIGJ1aWxkIHVzaW5nCiAgICAgLS13aXRoLW1vZHVsZSwgd2l0aG91dCByZS1ydW5uaW5nIGJ1aWxkY29uZi4gIFRoZSBzeW50YXggaXM6CiAgICAgICAgIC0td2l0aC1tb2R1bGU9bW9kdWxlX3R5cGU6L3BhdGgvdG8vbW9kdWxlLmMKICAgICBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGNvcHkgdGhlIG1vZHVsZS5jIGZpbGUgdG8gCiAgICAgbW9kdWxlcy9tb2R1bGVfdHlwZSwgYW5kIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlbGV2YW50IE1ha2VmaWxlcy4KICAgICBjdXJyZW50bHksIHRoaXMgb25seSB3b3JrcyBmb3Igc3RhdGljIG1vZHVsZXMuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2hhbmdlcyByZXF1aXJlZCB0byBtYWtlIHByZWZvcmsgY2xlYW4gdXAgaWRsZSBjaGlsZHJlbiBwcm9wZXJseS4KICAgICBUaGVyZSB3YXMgYSB3aW5kb3cgZHVyaW5nIHdoaWNoIGEgc3RhcnRpbmcgd29ya2VyIGRlYWRsb2NrcyB3aGVuCiAgICAgYW4gaWRsZSBjbGVhbnVwIGFycml2ZXMgYmVmb3JlIGl0IGNvbXBsZXRlcyBpbml0LiBBcGFjaGUgdGhlbiBrZWVwcwogICAgIHRyeWluZyB0byBjbGVhbnVwIHRoZSBzYW1lIGRlYWRsb2NrZWQgd29ya2VyIGZvcmV2ZXIgKHVudGlsIGhpZ2hlcgogICAgIHBpZHMgY29tZSBhbG9uZywgYnV0IGl0IHN0aWxsIHdpbGwgbmV2ZXIgcmVkdWNlIGJlbG93IHRoZSBkZWFkbG9ja2VkCiAgICAgcGlkKS4gVGh1cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHdvdWxkIG5vdCByZWR1Y2UgdG8gdGhlIGNvcnJlY3QKICAgICBpZGxlIGxldmVsLiBbUGF1bCBKLiBSZWRlcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE2CgogICopIENoYW5nZSB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIC91c3IvbG9jYWwvYXBhY2hlMiwKICAgICBhcyBub3cgZGVmaW5lZCBieSB0aGUgIkFwYWNoZSIgbGF5b3V0IGluIGNvbmZpZy5sYXlvdXQuIFtNYXJjIFNsZW1rb10KCiAgKikgT1MvMjogQWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyBhcyBPUy8yIERMTHMuIAogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEdldCBNYXhSZXF1ZXN0c1BlckNoaWxkIHdvcmtpbmcgd2l0aCB0aGUgV2luZG93cyBNUE0uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIE1ha2UgZ2VuZXJpYyBob29rcyB0byB3b3JrLCB3aXRoIG1vZF9nZW5lcmljX2hvb2tfaW1wb3J0L2V4cG9ydAogICAgIGV4cGVyaW1lbnRhbCBtb2R1bGVzLiAgW0JlbiBMYXVyaWUsIFdpbGwgUm93ZV0KCiAgKikgRml4IHNlZ2ZhdWx0cyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCBlcnJvcnMgc3VjaCBhcwogICAgICI8RGlyZWN0b3J5PiIgZm9sbG93ZWQgYnkgIjwvRGlyZWN0b3J5IiBhbmQKICAgICAiPERpcmVjdG9yeT4iIGZvbGxvd2VkIGJ5ICI8L0RpcmVjdG9yeXo+Ii4gIFtKZWZmIFRyYXdpY2tdCgogICopIENsZWFudXAgdGhlIC0tZW5hYmxlLWxheW91dCBvcHRpb24gb2YgY29uZmlndXJlLiAgVGhpcyBtYWtlcwogICAgIHVzIHVzZSBhIGNvbnNpc3RlbnQgbG9jYXRpb24gZm9yIHRoZSBjb25maWcubGF5b3V0IGZpbGUsIGFuZCBpdAogICAgIG1ha2VzIGNvbmZpZ3VyZSBtb3JlIHBvcnRhYmxlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuIGlpamxhYi5uZXQ+XQoKICAqKSBDaGFuZ2VzIHRvICdhYic7IGZpeGVkIGludCBvdmVycnVuJ3MsIGFkZGVkIHN0YXRpc3RpY3MsIG91dHB1dCBpbgogICAgIGNzdi9nbnVwbG90IGZvcm1hdCwgcnVkaW1lbnRhcnkgc3NsIHN1cHBvcnQgYW5kIHZhcmlvdXMgb3RoZXIgdHdlYWtzCiAgICAgdG8gbWFrZSByZXN1bHRzIG1vcmUgdHJ1ZSB0byB3aGF0IGlzIG1lYXN1cmVkLiBUaGUgdXBzaG90IG9mIHRoaXMgaXQKICAgICB0dXJucyBvdXQgdGhhdCAnYWInIGhhcyBvZnRlbiB1bmRlcnJlcG9ydGVkIHRoZSB0cnVlIHBlcmZvcm1hbmNlIG9mCiAgICAgYXBhY2hlLiBPZnRlbiBieSBhIG9yZGVyIG9mIG1hZ25pdHVkZSA6LSkgU2VlIHRhbGsvcGFwZXIgb2YgU2FuZGVyIAogICAgIFRlbW1lIGF0IEFwcmlsIEFwYWNoZUNvbiAyMDAxIGZvciBkZXRhaWxzLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIENsZWFuIHVwIG1vZF9jZ2lkJ3MgdGVtcG9yYXJ5IHJlcXVlc3QgcG9vbC4gIEJlc2lkZXMgZml4aW5nIGEKICAgICBzdG9yYWdlIGxlYWsgdGhpcyBlbnN1cmVzIHRoYXQgc29tZSB1bm5lY2Vzc2FyeSBwaXBlcyBhcmUgY2xvc2VkLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFBlcmZvcm1hbmNlOiBBZGQgcXVpY2tfaGFuZGxlciBob29rLiBUaGlzIGhvb2sgaXMgY2FsbGVkIGF0IHRoZQogICAgIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgYmVmb3JlIGxvY2F0aW9uX3dhbGssCiAgICAgdHJhbnNsYXRlX25hbWUsIGV0Yy4gIFRoaXMgaG9vayBpcyB1c2VmdWwgZm9yIFVSSSBrZXllZCBjb250ZW50CiAgICAgY2FjaGVzIGxpa2UgTWlrZSBBYmJvdHQncyBRdWljayBTaG9ydGN1dCBDYWNoZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgdG9wX21vZHVsZSBnbG9iYWwgdmFyaWFibGUgcmVuYW1lZCB0byBhcF90b3BfbW9kdWxlIFtQZXJsXQoKICAqKSBNb3ZlIGFwX3NldF9sYXN0X21vZGlmaWVkIHRvIHRoZSBjb3JlLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IAogICAgIGNvbnRyb3ZlcnNpYWwgY2hhbmdlLCBiZWNhdXNlIHRoaXMgaXMga2luZCBvZiBIVFRQIHNwZWNpZmljLiAgSG93ZXZlcgogICAgIG1hbnkgcHJvdG9jb2xzIHNob3VsZCBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMga2luZCBvZgogICAgIGluZm9ybWF0aW9uLiAgSSBleHBlY3QgdGhhdCBoZWFkZXJzIHdpbGwgbmVlZCBvbmUgbW9yZSBsYXllciBvZgogICAgIGluZGlyZWN0aW9uIGZvciBtdWx0aS1wcm90b2NvbCB3b3JrLCBidXQgdGhpcyBpcyBhIHNtYWxsIHN0ZXAgaW4KICAgICB0aGUgcmlnaHQgZGlyZWN0aW9uLiAgW1J5YW4gQmxvb21dCgogICopIEVuYWJsZSBtb2Rfc3RhdHVzIGJ5IGRlZmF1bHQuICBUaGlzIG1hdGNoZXMgd2hhdCBBcGFjaGUgMS4zIGRvZXMuCiAgICAgW0VkIEtvcnRob2ZdCgogICopIEFkZCBhIFNjcmlwdFNvY2sgZGlyZWN0aXZlIHRvIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlLiAgVGhpcyBpcwogICAgIG9ubHkgZW5hYmxlZCB3aGVuIG1vZF9jZ2lkIGlzIHVzZWQuICAKICAgICBbVGFrZXRvIEthYmUgPGthYmUgc3JhLXRvaG9rdS5jby5qcD5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xNQoKICAqKSBVbnRhbmdsZWQgdGhlIGJ1aWxkY29uZiBzY3JpcHQgYW5kIGVsaW1pbmF0ZWQgdGhlIG5lZWQgZm9yIGJ1aWxkJ3MKICAgICBhY2xvY2FsLm00LCBnZW5lcmF0ZWRfbGlzdHMsIGJ1aWxkLm1rLCBidWlsZDIubWssIGFuZCBhIGhvc3Qgb2Ygb3RoZXIKICAgICBsaWJ0b29sIG11Y2sgdGhhdCBpcyBub3cgdW5kZXIgc3JjbGliL2Fwci9idWlsZC4gIFtSb3kgRmllbGRpbmddCgogICopIFdpbjMyOiBEb24ndCBhY2NlcHQgbW9yZSBjb25uZWN0aW9ucyB0aGFuIHdlIGhhdmUgd29ya2VyIHRocmVhZHMKICAgICB0byBoYW5kbGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBidWcgaW4gdGhlIFVuaXggdGhyZWFkZWQuYyBNUE0gdGhhdCBhbGxvd2VkIGNoaWxkIHByb2Nlc3NlcwogICAgIHRvIGZvcmsoKSBuZXcgY2hpbGQgcHJvY2Vzc2VzLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgU0VDVVJJVFk6IEZpeCBhIG1ham9yIHNlY3VyaXR5IHByb2JsZW0gd2l0aCBkb3VibGUtcmV2ZXJzZSBsb29rdXAgCiAgICAgY2hlY2tpbmcuICBQcmV2aW91c2x5LCBhIGNsaWVudCBjb25uZWN0aW5nIG92ZXIgSVB2NCB3b3VsZCBub3QgYmUgCiAgICAgbWF0Y2hlZCBwcm9wZXJseSB3aGVuIHRoZSBzZXJ2ZXIgaGFkIGFuIElQdjYgbGlzdGVuaW5nIHNvY2tldC4gIAogICAgIFBSICM3NDA3ICAgW1Rha2V0byBLYWJlIDxraWFiZSBzcmEtdG9ob2t1LmNvLmpwPl0KCiAgKikgQ2hhbmdlIHRoZSB3YXkgdGhlIGJlb3MgTVBNIGhhbmRsZXMgcG9sbGluZyB0byBhbGxvdyBpdCB0byBzdG9wIGFuZAogICAgIHJlc3RhcnQuICBQcm9ibGVtIHdhcyB0aGUgc29ja2V0cyBiZWluZyBwb2xsZWQgd2VyZSBiZWluZyByZXNldCBieQogICAgIHRoZSBzZWxlY3QgY2FsbCwgc28gb25jZSBpdCBoYWQgYWNjZXB0ZWQgYSBjb25uZWN0aW9uIGl0IHdhcyBubwogICAgIGxvbmdlciBsaXN0ZW5pbmcgb24gdGhlIFVEUCBzb2NrZXQgd2UgdXNlIGZvciBzaHV0ZG93biBpbnN0cnVjdGlvbnMuCiAgICAgQVBSIG5lZWRzIHRvIGJlIGFsdGVyZWQsIHBhdGNoIG9uIGl0J3Mgd2F5LiBbRGF2aWQgUmVpZF0KCiAgKikgRW1wdHkgb3V0IHRoZSBicmlnYWRlIHNoYXJlZCBieSBhcF9nZXRsaW5lKCkvYXBfZ2V0X2NsaWVudF9ibG9jaygpCiAgICAgb24gZXJyb3IgZXhpdCBmcm9tIGFwX2dldGxpbmUoKS4gIFNvbWUgb3RoZXIgY29kZSBnb3QgdXBzZXQgYmVjYXVzZQogICAgIHRoZSB3cm9uZyBkYXRhIHdhcyBpbiB0aGUgYnJpZ2FkZS4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgSGFuZGxlIGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KCkgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgR2V0IHJpZCBvZiBhbiBpbmFkdmVydGVudCBjbG9zZSBvZiBmaWxlIGRlc2NyaXB0b3IgMiBpbgogICAgIG1vZF9taW1lX21hZ2ljLiAgW0dyZWcgQW1lcywgSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgYSBob29rLCBjcmVhdGVfcmVxdWVzdC4gIFRoaXMgaG9vayBhbGxvd3MgbW9kdWxlcyB0byBtb2RpZnkKICAgICBhIHJlcXVlc3Qgd2hpbGUgaXQgaXMgYmVpbmcgY3JlYXRlZC4gIFRoaXMgaG9vayBpcyBjYWxsZWQgZm9yIGFsbAogICAgIHJlcXVlc3RfcmVjJ3MsIG1haW4gcmVxdWVzdCwgc3ViIHJlcXVlc3QsIGFuZCBpbnRlcm5hbCByZWRpcmVjdC4KICAgICBXaGVuIHRoaXMgaG9vayBpcyBjYWxsZWQsIHRoZSByLT5tYWluLCByLT5wcmV2LCByLT5uZXh0CiAgICAgcG9pbnRlcnMgaGF2ZSBiZWVuIHNldCwgc28gbW9kdWxlcyBjYW4gZGV0ZXJtaW5lIHdoYXQga2luZCBvZgogICAgIHJlcXVlc3QgdGhpcyBpcy4gIFtSeWFuIEJsb29tXQoKICAqKSBDbGVhbnVwIHRoZSBidWlsZCBwcm9jZXNzIGEgYml0IG1vcmUuICBUaGUgQXBhY2hlIGNvbmZpZ3VyZQogICAgIHNjcmlwdCBubyBsb25nZXIgY3JlYXRlcyBpdHMgb3duIGhlbHBlciBzY3JpcHRzLCBpdCBqdXN0CiAgICAgdXNlcyBBUFIncy4gIAogICAgIFtqZWFuLWZyZWRlcmljIGNsZXJlIDxqZnJlZGVyaWMuY2xlcmUgZnVqaXRzdS1zaWVtZW5zLmNvbT5dCgogICopIFN0b3AgdGhlIGZvcmNlZCBkb3duZ3JhZGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gSFRUUC8xLjAgZm9yCiAgICAgcHJveHkgcmVxdWVzdHMuICBbR3JhaGFtIExlZ2dldHRdCgogICopIEF2b2lkIHVzaW5nIHNzY2FuZiB0byBkZXRlcm1pbmUgdGhlIEhUVFAgcHJvdG9jb2wgbnVtYmVyIGluCiAgICAgdGhlIGNvbW1vbiBjYXNlIGJlY2F1c2Ugc3NjYW5mIGlzIGEgcGVyZm9ybWFuY2UgaG9nLiBGcm9tCiAgICAgTWlrZSBBYmJvdCdzIEFjY2VsZXJhdGluZyBBcGFjaGUgcGF0Y2ggbnVtYmVyIDYuCiAgICAgW01pa2UgQWJib3QgPG1qYSB0cnVkZ2UuZW5nci5zZ2kuY29tPiwgQmlsbCBTdG9kZGFyZF0KCiAgKikgU0VDVVJJVFk6IEZpeCBhIHNlY3VyaXR5IGV4cG9zdXJlIGluIG1vZF9hY2Nlc3MuICBQcmV2aW91c2x5IHdoZW4gCiAgICAgSVB2NiBsaXN0ZW5pbmcgc29ja2V0cyB3ZXJlIHVzZWQsIGFsbG93L2RlbnktZnJvbS1JUHY0LWFkZHJlc3MgcnVsZXMgCiAgICAgd2VyZSBub3QgZXZhbHVhdGVkIHByb3Blcmx5IChQUiAjNzQwNykuICBBbHNvLCBhZGQgdGhlIGFiaWxpdHkgdG8gCiAgICAgc3BlY2lmeSBJUHY2IGFkZHJlc3Mgc3RyaW5ncyB3aXRoIG9wdGlvbmFsIHByZWZpeCBsZW5ndGggb24gQWxsb3cgCiAgICAgYW5kIERlbnkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBFbmhhbmNlIHJvdGF0ZWxvZ3Mgc28gdGhhdCBhIFVUQyBvZmZzZXQgY2FuIGJlIHNwZWNpZmllZCwgYW5kCiAgICAgdGhlIGxvZ2ZpbGUgbmFtZSBjYW4gYmUgZm9ybWF0dGVkIHVzaW5nIHN0cmZ0aW1lKDMpLiAgKEJyb3VnaHQKICAgICBmb3J3YXJkIGZyb20gMS4zLikgIFtLZW4gQ29hcl0KCiAgKikgUmVpbXBsZW1lbnQgdGhlIFdpbmRvd3MgTVBNIChtcG1fd2lubnQuYykgdG8gZWxpbWluYXRlIGNhbGxpbmcgCiAgICAgRHVwbGljYXRlSGFuZGxlIG9uIGFuIElPQ29tcGxldGlvblBvcnQgKGEgcHJhY3RpY2Ugd2hpY2gKICAgICBNUyAiZGlzY291cmFnZXMiKS4gVGhlIG5ldyBtb2RlbCBkb2VzIG5vdCByZWx5IG9uIGFzc29jaWF0aW5nCiAgICAgdGhlIGNvbXBsZXRpb24gcG9ydCB3aXRoIHRoZSBsaXN0ZW5pbmcgc29ja2V0cywgdGh1cyB0aGUKICAgICBjb21wbGV0aW9uIHBvcnQgY2FuIGJlIGNvbXBsZXRlbHkgbWFuYWdlZCB3aXRoaW4gdGhlIGNoaWxkIAogICAgIHByb2Nlc3MuICBBIGRlZGljYXRlZCB0aHJlYWQgYWNjZXB0cyBjb25uZWN0aW9ucyBvZmYgdGhlIG5ldHdvcmssCiAgICAgdGhlbiBjYWxscyBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cygpIHRvIHdha2UgdXAgd29ya2VyCiAgICAgdGhyZWFkcyBibG9ja2VkIG9uIHRoZSBjb21wbGV0aW9uIHBvcnQuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEJyaW5nIGZvcndhcmQgdGhlIC0tc3VleGVjLXVtYXNrIG9wdGlvbiB3aGljaCBhbGxvd3MgdGhlCiAgICAgYnVpbGRlciB0byBwcmVzZXQgdGhlIHVtYXNrIGZvciBzdWV4ZWMgcHJvY2Vzc2VzLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSAtViBmbGFnIHRvIHN1ZXhlYywgd2hpY2ggY2F1c2VzIGl0IHRvIGRpc3BsYXkgdGhlCiAgICAgY29tcGlsZS10aW1lIHNldHRpbmdzIHdpdGggd2hpY2ggaXQgd2FzIGJ1aWx0LiAgKE9ubHkKICAgICB1c2FibGUgYnkgcm9vdCBvciB0aGUgQVBfSFRUUERfVVNFUiB1c2VybmFtZS4pICBbS2VuIENvYXJdCgogICopIE1vZF9pbmNsdWRlIHNob3VsZCBhbHdheXMgdW5zZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlmIHRoZSBmaWxlIGlzCiAgICAgZ29pbmcgdG8gYmUgcGFzc2VkIHRocm91Z2ggc2VuZF9wYXJzZWRfY29udGVudC4gIFRoZXJlIGlzIG5vIHRvCiAgICAgZGV0ZXJtaW5lIGlmIHRoZSBjb250ZW50IHdpbGwgY2hhbmdlIGJlZm9yZSBhY3R1YWxseSBzY2FubmluZyB0aGUKICAgICBlbnRpcmUgY29udGVudC4gIEl0IGlzIGZhciBzYWZlciB0byBqdXN0IHJlbW92ZSB0aGUgQy1MIGFzIGxvbmcKICAgICBhcyB3ZSBhcmUgc2Nhbm5pbmcgaXQuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSBzdXJlIEFwYWNoZSBzZW5kcyBXV1ctQXV0aGVudGljYXRlIGR1cmluZyBhIHJldmVyc2UgcHJveHkKICAgICByZXF1ZXN0IGFuZCBub3QgUHJveHktQXV0aGVudGljYXRlLgogICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbiBzaGFycC5mbT5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xNAoKICAqKSBGaXggY29udGVudC1sZW5ndGggY29tcHV0YXRpb24uICBXZSBPTkxZIGNvbXB1dGUgYSBjb250ZW50LWxlbmd0aCBpZgogICAgIFdlIGFyZSBub3QgaW4gYSAxLjEgcmVxdWVzdCBhbmQgd2UgY2Fubm90IGNodW5rLCBhbmQgdGhpcyBpcyBhIGtlZXBhbGl2ZQogICAgIG9yIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEuICBbUnlhbiBCbG9vbV0KCiAgKikgUmVwb3J0IHVuYm91bmRlZCBjb250YWluZXJzIGluIHRoZSBjb25maWcgZmlsZS4gIFByZXZpb3VzbHksIGEgdHlwbwogICAgIGluIHRoZSA8L2NvbnRhaW5lcj4gZGlyZWN0aXZlIGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdCBvZiB0aGUgY29uZmlnCiAgICAgZmlsZSBiZWluZyBzaWxlbnRseSBpZ25vcmVkLCB3aXRoIHVuZGVzaXJlZCBkZWZhdWx0cyB1c2VkLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgdGhlIG9sZF93cml0ZSBmaWx0ZXIgdXNlIHRoZSBhcF9mKiBmdW5jdGlvbnMgZm9yIHRoZSBidWZmZXJpbmcuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1vdmUgbW9yZSBjb2RlIGZyb20gdGhlIGh0dHAgbW9kdWxlIGludG8gdGhlIGNvcmUgc2VydmVyLiAgVGhpcwogICAgIGlzIGNvcmUgY29kZSwgYmFzaWNhbGx5IHRoZSBkZWZhdWx0IGhhbmRsZXIsIHRoZSBkZWZhdWx0IGlucHV0CiAgICAgYW5kIG91dHB1dCBmaWx0ZXJzLCBhbmQgYWxsIG9mIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4KICAgICBBbGwgb2YgdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGluIG9yZGVyIGZvciB0aGUgc2VydmVyIHRvIHdvcmssIHdpdGggb3IKICAgICB3aXRob3V0IEhUVFAuICBUaGUgc2VydmVyIGlzIGNsb3NlciB0byB3b3JraW5nIHdpdGhvdXQgdGhlIEhUVFAKICAgICBtb2R1bGUsIGFsdGhvdWdoIHRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gZG8uICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGEgbnVtYmVyIG9mIFNHSSBjb21waWxlIHdhcm5pbmdzIHRocm91Z2hvdXQgdGhlIHNlcnZlci4gIEZpeCBzb21lCiAgICAgYmFkIHBhcmFtZXRlcnMgdG8gYXByX2J1Y2tldF9yZWFkKCkuICBGaXggYSBiYWQgc3RhdGVtZW50IGluIAogICAgIGFwX21ldGhvZF9pbl9saXN0KCkuICBGb3IgdGhlIG1vZF9yZXdyaXRlIGNhY2hlIHVzZSBhcHJfdGltZV90IAogICAgIGNvbnNpc3RlbnRseTsgd2Ugd2VyZSBtaXhpbmcgYXByX3RpbWVfdCBhbmQgdGltZV90IGluIGludmFsaWQgd2F5cyAKICAgICBiZWZvcmUuICBJbiBsb2FkX2ZpbGUoKSwgY2FsbCBhcHJfZHNvX2Vycm9yKCkgaW5zdGVhZCBvZiAKICAgICBhcHJfc3RyZXJyb3IoKSBzbyB0aGF0IHdlIGdldCBhIG1vcmUgc3BlY2lmaWMgc3RyaW5nIG9uIHNvbWUgcGxhdGZvcm1zLgogICAgIFBSICM2OTgwICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHF1ZXJ5IHRoZSBNUE0gYWJvdXQgaXQncyBleGVjdXRpb24gcHJvZmlsZS4gIFRoaXMKICAgICBxdWVyeSBBUEkgY2FuIGFuZCBzaG91bGQgYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgYnV0IGZvciBub3csCiAgICAgbWF4X2RhZW1vbnMsIGFuZCB0aHJlYWRpbmcgb3IgZm9ya2luZyBpcyBhIHZlcnkgZ29vZCBzdGFydC4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBNb2RpZnkgbW9kX2luY2x1ZGUgdG8gc2VuZCBibG9ja3Mgb2YgZGF0YSBubyBsYXJnZXIgdGhhbiA5ay4KICAgICBXaXRob3V0IHRoaXMsIG1vZF9pbmNsdWRlIHdpbGwgd2FpdCB1bnRpbCB0aGUgd2hvbGUgZmlsZSBpcyBwYXJzZWQsCiAgICAgb3IgdGhlIGZpcnN0IHRhZyBpcyBmb3VuZCB0byBzZW5kIGFueSBkYXRhIHRvIHRoZSBjbGllbnQuCiAgICAgW1BhdWwgSi4gUmVkZXIgPHJlZGVycGogcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRml4IG1vZF9pbmZvLCBzbyB0aGF0IDxEaXJlY3Rvcnk+IGFuZCA8TG9jYXRpb24+IGRpcmVjdGl2ZXMgYXJlCiAgICAgbm90IGRpc3BsYXllZCB0d2ljZSB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KICAgICBbUnlhbiBNb3JnYW4gPHJtb3JnYW4gY292YWxlbnQubmV0Pl0KCiAgKikgQWRkIGNvbmZpZyBkaXJlY3RpdmVzIHRvIG92ZXJyaWRlIERFRkFVTFRfRVJST1JfTVNHIGFuZAogICAgIERFRkFVTFRfVElNRV9GT1JNQVQuICBUaGlzIHdhcyBzZW50IGluIGFzIFBSIDYxOTMuCiAgICAgW0RhbiBSZW5jaCA8ZHJlbmNoIHhuZXQuY29tPl0KCiAgKikgR2V0IG1vZF9pbmZvIGJ1aWxkaW5nIGFuZCBsb2FkaW5nIG9uIFdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQmVnaW4gdG8gbW92ZSBwcm90b2NvbCBpbmRlcGVuZGFudCBmdW5jdGlvbnMgb3V0IG9mIG1vZF9odHRwLiAgVGhlIGdvYWwKICAgICBpcyB0byBoYXZlIG9ubHkgZnVuY3Rpb25zIHRoYXQgYXJlIEhUVFAgc3BlY2lmaWMgaW4gdGhlIGh0dHAgZGlyZWN0b3J5LgogICAgIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTMKCiAgKikgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIGJ5dGVyYW5nZSAKICAgICBmaWx0ZXIuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHdpbGwgbmVlZCB0byBkbyBieXRlcmFuZ2VzIHdpdGggb25seQogICAgIG9uZSBjYWxsIHRvIHRoZSBmaWx0ZXIuICBbUnlhbiBNb3JnYW4gPHJtb3JnYW4gY292YWxlbnQubmV0Pl0KCiAgKikgTW92ZSB0aGUgZXJyb3JfYnVja2V0IGRlZmluaXRpb24gZnJvbSB0aGUgaHR0cCBtb2R1bGUgdG8gdGhlCiAgICAgY29yZSBzZXJ2ZXIuICBFdmVyeSBwcm90b2NvbCB3aWxsIG5lZWQgdGhpcyBhYmlsaXR5LCBub3QganVzdAogICAgIEhUVFAuICBbUnlhbiBCbG9vbV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjEyCgogICopIE1vZGlmeSBtb2RfZmlsZV9jYWNoZSB0byBzYXZlIHByZS1mb3JtYXR0ZWQgc3RyaW5ncyBmb3IgCiAgICAgY29udGVudC1sZW5ndGggYW5kIGxhc3QtbW9kaWZpZWQgaGVhZGVycyBmb3IgcGVyZm9ybWFuY2UuIAogICAgIFtNaWtlIEFiYm90IDxtamEgdHJ1ZGdlLmVuZ3Iuc2dpLmNvbT5dCgogICopIE5hbWVzcGFjZSBwcm90ZWN0IElPQlVGU0laIHNpbmNlIGl0IGlzIGV4cG9zZWQgaW4gdGhlIEFQSS4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBVc2UgIkJhc2ljIiBhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mICJiYXNpYyIgaW4gYWIsIGFzIHRoZSBzcGVjCiAgICAgc2F5cyB3ZSBzaG91bGQuICBbQW5kcmUgQnJlaWxlciA8YW5kcmUuYnJlaWxlciByZC5iYmMuY28udWs+XQoKICAqKSBGaXggYSBzZWcgZmF1bHQgaW4gbW9kX3VzZXJkaXIuYy4gIFdlIHVzZWQgdG8gdXNlIHRoZSBwdyBzdHJ1Y3R1cmUKICAgICB3aXRob3V0IGV2ZXIgZmlsbGluZyBpdCBvdXQuICBUaGlzIGZpeGVzIFBSIDcyNzEuCiAgICAgW1Rha2V0byBLYWJlIDxrYWJlIHNyYS10b2hva3UuY28uanA+IGFuZCAKICAgICAgQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIEFkZCBhIGNvdXBsZSBvZiBHQ0MgYXR0cmlidXRlIHRhZ3MgdG8gcHJpbnRmIHN0eWxlIGZ1bmN0aW9ucy4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBBZGQgdGhlIGNvcnJlY3QgbGFuZ3VhZ2UgdGFnIGZvciBpbnRlcm9wZXJhdGlvbiB3aXRoIHRoZSBUYWl3YW5lc2UKICAgICB2ZXJzaW9ucyBvZiBNU0lFIGFuZCBOZXRzY2FwZS4gW0NsaXZlIExpbiA8Y2xpdmUgQ2lyWC5PUkc+XSBQUiM3MTQyCgogICopIE1pZ3JhdGUgdGhlIHBlcmNoaWxkIE1QTSB0byB1c2UgdGhlIG5ldyBhcHIgc2lnbmFsIGNoaWxkLCBhbmQgCiAgICAgQVBSIHRocmVhZCBmdW5jdGlvbnMuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2xvc2Ugb25lIGNvcHkgb2YgdGhlIENHSSdzIHN0ZG91dCBiZWZvcmUgY3JlYXRpbmcgdGhlIG5ldyBwcm9jZXNzLgogICAgIFRoZSBDR0kgd2lsbCBzdGlsbCBoYXZlIHN0ZG91dCwgYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgZHVwJ2VkIGl0LgogICAgIFRoaXMga2VlcHMgQXBhY2hlIGZyb20gd2FpdGluZyBmb3JldmVyIHRvIHNlbmQgdGhlIHJlc3VsdHMgb2YgYSBDR0kKICAgICBwcm9jZXNzIHRoYXQgaGFzIGZvcmtlZCBhIGxvbmctbGl2ZWQgY2hpbGQgcHJvY2Vzcy4KICAgICBbVGFrZXRvIEthYmUgPGthYmUgc3JhLXRvaG9rdS5jby5qcD5dCgogICopIFJlbW92ZSB0aGUgcmVzdCBvZiB0aGUgcHRocmVhZHMgZnVuY3Rpb25zIGZyb20gdGhlIHRocmVhZGVkIE1QTS4KICAgICBUaGlzIHJlcXVpcmVzIHRoZSBBUFIgc3VwcG9ydCBmb3IgYSBzaWduYWwgdGhyZWFkIHRoYXQgd2FzIGp1c3QKICAgICBhZGRlZC4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIG1vZF9kaXIgdXNlIGEgZml4dXAgZm9yIHNlbmRpbmcgYSByZWRpcmVjdCB0byB0aGUgYnJvd3Nlci4KICAgICBCZWZvcmUgdGhpcywgd2Ugd2VyZSB1c2luZyBhIGhhbmRsZXIsIHdoaWNoIGRvZXNuJ3QgbWFrZSBtdWNoCiAgICAgc2Vuc2UsIGJlY2F1c2UgdGhlIGhhbmRsZXIgd2Fzbid0IGdlbmVyYXRpbmcgYW55IGRhdGEsIGl0IHdvdWxkCiAgICAgZWl0aGVyIHJldHVybiBhIHJlZGlyZWN0IGVycm9yIGNvZGUsIG9yIERFQ0xJTkVELiAgVGhpcyBmaXRzIHRoZQogICAgIGN1cnJlbnQgaG9va3MgYmV0dGVyLiAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIE1ha2UgdGhlIHRocmVhZGVkIE1QTSB1c2UgQVBSIHRocmVhZHMgaW5zdGVhZCBvZiBwdGhyZWFkcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IG1vZF90bHMgdG8gdGhlIHBvaW50IHdoZXJlIGl0IGFjdHVhbGx5IGFwcGVhcnMgdG8gd29yayBpbiBhbGwgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIGltcGxlbWVudCAtLWVuYWJsZS1tb2R1bGVzIGFuZCAtLWVuYWJsZS1tb2RzLXNoYXJlZCBmb3IgImFsbCIgYW5kCiAgICAgIm1vc3QiLiAgW0dyZWcgU3RlaW5dCgogICopIE1vdmUgdGhlIHRocmVhZGVkIE1QTSB0byB1c2UgQVBSIGxvY2tzIGluc3RlYWQgb2YgcHRocmVhZCBsb2Nrcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVuYW1lIG1wbXRfcHRocmVhZCB0byB0aHJlYWRlZC4gIFRoaXMgaXMgbW9yZSBpbiBsaW5lIHdpdGggdGhlCiAgICAgZmFjdCB0aGF0IG1wbXRfcHRocmVhZCBzaG91bGRuJ3QgYmUgdXNpbmcgcHRocmVhZHMgZGlyZWN0bHksIGFuZAogICAgIGl0IGlzIGEgc21hbGxlciBuYW1lIHRoYXQgZG9lc24ndCB0aWUgaW50byBhbnl0aGluZy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVuYW1lIHRoZSBtb2R1bGUgc3RydWN0dXJlcyBzbyB0aGF0IHRoZSBleHBvcnRlZCBzeW1ib2wgbWF0Y2hlcwogICAgIHRoZSBmaWxlIG5hbWUsIGFuZCBpdCBpcyBlYXNpZXIgdG8gYXV0b21hdGUgdGhlIGluc3RhbGxhdGlvbgogICAgIHByb2Nlc3MgKGdlbmVyYXRpbmcgTG9hZE1vZHVsZSBkaXJlY3RpdmVzIGZyb20gdGhlIG1vZHVsZSBmaWxlbmFtZXMpLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVtb3ZlIHRoZSBjb2FsZXNjZSBmaWx0ZXIuICBXaXRoIHRoZSBhcF9mKiBmdW5jdGlvbnMsIHRoaXMgZmlsdGVyCiAgICAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xMQoKICAqKSBSZW1vdmUgdGhlIGRleHRlciBNUE0uICBQZXJjaGlsZCBpcyB0aGUgc2FtZSBiYXNpYyBpZGVhLCBidXQgaXQgaGFzIHRoZQogICAgIGFkZGVkIGZlYXR1cmUgb2YgYWxsb3dpbmcgYSB1aWQvZ2lkIHBlciBjaGlsZCBwcm9jZXNzLiAgSWYgbm8KICAgICB1aWQvZ2lkIGlzIHNwZWNpZmllZCwgdGhlbiBQZXJjaGlsZCBiZWhhdmVzIGV4YWN0bHkgbGlrZSBkZXh0ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBwZXJjaGlsZCBidWlsZGluZyBhZ2Fpbi4gW1J5YW4gQmxvb21dCgogICopIERvbid0IGRpc2FibGUgdGhyZWFkcyBqdXN0IGJlY2F1c2Ugd2UgYXJlIHVzaW5nIHRoZSBwcmVmb3JrIE1QTS4KICAgICBJZiBzb21lYm9keSB3YW50cyB0byBjb21waWxlIHdpdGhvdXQgdGhyZWFkcywgdGhleSBtdXN0IG5vdyBhZGQKICAgICAtLWRpc2FibGUtdGhyZWFkcyB0byB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4gIFtSeWFuIEJsb29tXQoKICAqKSBCZWdpbiB0byBtb3ZlIHRoZSBjYWxscyB0byB1cGRhdGVfY2hpbGRfc3RhdHVzIGludG8gY29tbW9uIGNvZGUsIHNvCiAgICAgdGhhdCBlYWNoIGluZGl2aWR1YWwgTVBNIGRvZXMgbm90IG5lZWQgdG8gdXBkYXRlIHRoZSBzY29yZWJvYXJkIGl0c2VsZi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWxsb3cgbW9kX3RscyB0byBjb21waWxlIHVuZGVyIFVuaXggYm94ZXMgd2hlcmUgb3BlbnNzbCBoYXMgYmVlbgogICAgIGluc3RhbGxlZCB0byB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuCiAgICAgW0dvbWV6IEhlbnJpIDxuZXctaHR0cGQgc2xpYi5mcj5dCgogICopIENsZWFudXAgdGhlIG1vZF90bHMgY29uZmlndXJlIHByb2Nlc3MuICBUaGlzIHNob3VsZCByZW1vdmUgYW55IG5lZWQKICAgICB0byBoYW5kLWVkaXQgYW55IGZpbGVzLiAgV2UgcmVxdWlyZSBPcGVuU1NMIDAuOS42IG9yIGxhdGVyLCBidXQgCiAgICAgY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgdGhhdCB5ZXQuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGEgdmVyeSBlYXJseSBwcm90b3R5cGUgb2YgU1NMIHN1cHBvcnQgKGluIG1vZF90bHMuYykuIEl0IGlzCiAgICAgdml0YWwgdGhhdCB5b3UgcmVhZCBtb2R1bGVzL3Rscy9SRUFETUUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQKICAgICBpdC4gW0JlbiBMYXVyaWVdCgogICopIEZpeCBhIHBvdGVudGlhbCBzZWcgZmF1bHQgb24gYWxsIHBsYXRmb3Jtcy4gIERhdmlkIFJlaWQgZml4ZWQgdGhpcwogICAgIG9uIEJFT1MsIGJ1dCB0aGUgcHJvYmxlbSBjb3VsZCBoYXBwZW4gYW55d2hlcmUsIHNvIHdlIGRvbid0IHdhbnQKICAgICB0byAjaWZkZWYgaXQuIFtDbGlmZiBXb29sbGV5IDxjbGlmZndvb2xsZXkgeWFob28uY29tPl0KIAogICopIEFkZCBuZXcgTG9nRm9ybWF0IGRpcmVjdGl2ZSwgJUQsIHRvIGxvZyB0aW1lIGl0IHRha2VzIHRvIHNlcnZlIGEKICAgICByZXF1ZXN0IGluIG1pY3Jvc2Vjb25kcy4gW0JpbGwgU3RvZGRhcmRdCgogICopIENoYW5nZSBBZGRJbnB1dEZpbHRlciBhbmQgQWRkT3V0cHV0RmlsdGVyIHRvIFNldElucHV0RmlsdGVyIGFuZAogICAgIFNldE91dHB1dEZpbHRlci4gIFRoaXMgY29ycmVzcG9uZHMgbmljZWx5IHdpdGggdGhlIG90aGVyIFNldCAKICAgICBkaXJlY3RpdmVzLCB3aGljaCBvcGVyYXRlIG9uIGNvbnRhaW5lcnMgd2hpbGUgdGhlIEFkZCogZGlyZWN0aXZlcwogICAgIHRlbmQgdG8gd29yayBkaXJlY3RseSBvbiBleHRlbnNpb25zLiAgW1J5YW4gQmxvb21dCgogICopIENsZWFudXAgdGhlIGhlYWRlciBoYW5kbGluZyBhIGJpdC4gIFRoaXMgdXNlcyB0aGUgYXByX2JyaWdhZGVfKgogICAgIGZ1bmN0aW9ucyBmb3IgdGhlIGJ1ZmZlcmluZyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY29tcHV0ZQogICAgIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlcnMgYmVmb3JlIHdlIGFjdHVhbGx5IGNyZWF0ZSB0aGUgaGVhZGVyCiAgICAgYnVmZmVyLiAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IGZpbHRlcnMgdG8gYnVmZmVyIGRhdGEgdXNpbmcgdGhlIGFwX2YqIGZ1bmN0aW9ucy4gIFRoZXNlIGhhdmUKICAgICBiZWNvbWUgbWFjcm9zIHRoYXQgcmVzb2x2ZSBkaXJlY3RseSB0byBhcHJfYnJpZ2FkZV8qLiAgCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCB0aGUgVW5peCBNUE0ncyB0byBkbyBhIGdyYWNlZnVsIHJlc3RhcnQgYWdhaW4uICBJZiB3ZSBhcmUgZ29pbmcKICAgICB0byByZWdpc3RlciBhIGNsZWFudXAgd2l0aCBhcF9jbGVhbnVwX3Njb3JlYm9hcmQsIHRoZW4gd2UgaGF2ZSB0bwogICAgIGtpbGwgdGhlIGNsZWFudXAgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbiwgIGFuZCB0aGF0IGZ1bmN0aW9uIGNhbid0IGJlCiAgICAgc3RhdGljLiAgW1J5YW4gQmxvb21dCgogICopIEluc3RhbGwgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcy4gIFdpdGhvdXQgdGhlc2UsIGl0IHdhcyBub3QKICAgICBwb3NzaWJsZSB0byBjb21waWxlIHNvbWUgbW9kdWxlcyBvdXRzaWRlIG9mIHRoZSBzZXJ2ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCB0aGUgQWxpYXNNYXRjaCBkaXJlY3RpdmUgaW4gQXBhY2hlIDIuMC4gIFdoZW4gd2UgYnJvdWdodCBhIHBhdGNoCiAgICAgZm9yd2FyZCBmcm9tIDEuMyB0byAyLjAsIHdlIG1pc3NlZCBhIHNpbmdsZSBsaW5lLCB3aGljaCBicm9rZSByZWdleAogICAgIGFsaWFzZXMuICBbUnlhbiBCbG9vbV0KCiAgKikgV2UgaGF2ZSBhIHBvb3IgYWJzdHJhY3Rpb24gaW4gdGhlIHByb3RvY29sLiAgVGhpcyBpcyBhIHRlbXBvcmFyeQogICAgIGhhY2sgdG8gZml4IHRoZSBidWcsIGJ1dCBpdCB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgZm9yIHJlYWwuICBJZgogICAgIHdlIGZpbmQgYW4gZXJyb3Igd2hpbGUgc2VuZGluZyBvdXQgYSBjdXN0b20gZXJyb3IgcmVzcG9uc2UsIHdlIGJhY2sKICAgICB1cCB0byB0aGUgZmlyc3Qgbm9uLU9LIHJlcXVlc3QgYW5kIHNlbmQgdGhlIGRhdGEuICBUaGVuLCB3aGVuIHdlIHNlbmQKICAgICB0aGUgRU9TIGZyb20gZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbCwgd2UgZ28gdG8gdGhlIGxhc3QgcmVxdWVzdCwKICAgICB0byBlbnN1cmUgdGhhdCB3ZSBhcmVuJ3Qgc2VuZGluZyBhbiBFT1MgdG8gYSByZXF1ZXN0IHRoYXQgaGFzIGFscmVhZHkKICAgICByZWNlaXZlZCBvbmUuICBCZWNhdXNlIHRoZSBkYXRhIGlzIHNlbnQgb24gYSBkaWZmZXJlbnQgcmVxdWVzdCB0aGFuCiAgICAgdGhlIEVPUywgdGhlIGVycm9yIHRleHQgbmV2ZXIgZ2V0cyBzZW50IGRvd24gdGhlIGZpbHRlciBzdGFjay4gIFRoaXMKICAgICBmaXhlcyB0aGUgcHJvYmxlbSBieSBmaW5kaW5nIHRoZSBsYXN0IHJlcXVlc3QsIGFuZCBzZW5kaW5nIHRoZSBkYXRhCiAgICAgd2l0aCB0aGF0IHJlcXVlc3QuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSB0aGUgc2VydmVyIHN0YXR1cyBwYWdlIHNob3cgdGhlIGNvcnJlY3QgcmVzdGFydCB0aW1lLCBhbmQKICAgICB0aHVzIHRoZSBwcm9wZXIgdXB0aW1lLiBbUnlhbiBCbG9vbV0KCiAgKikgTW92ZSB0aGUgQ0dJIGNyZWF0aW9uIGxvZ2ljIGZyb20gbW9kX2luY2x1ZGUgdG8gbW9kX2NnaShkKS4gIFRoaXMKICAgICBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZHVwbGljYXRlIGNvZGUgdGhhdCBpcyByZXF1aXJlZCB0bwogICAgIGNyZWF0ZSBDR0kgcHJvY2Vzc2VzLgogICAgIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIGFwX25ld19jb25uZWN0aW9uKCkgY2xvc2VzIHRoZSBzb2NrZXQgYW5kIHJldHVybnMgTlVMTCBpZiBhIHNvY2tldAogICAgIGNhbGwgZmFpbHMuICBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIGEgY29ubmVjdGlvbiB3aGljaCBoYXMgYmVlbiAKICAgICByZXNldC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vdmUgdGhlIEFwYWNoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIG91dCBvZiBodHRwZC5oIGFuZCBpbnRvIHJlbGVhc2UuaC4KICAgICBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciB0aGUgZmlyc3QgdGFnIHdpdGggdGhlIG5ldyB0YWcgYW5kIHJlbGVhc2UKICAgICBzeXN0ZW0uICBbUnlhbiBCbG9vbV0KCiAgKikgQmVnaW4gcmVzdHJ1Y3R1cmluZyBzY29yZWJvYXJkIGNvZGUgdG8gZW5hYmxlIGFkZGluZyBiYWNrIGluCiAgICAgdGhlIGFiaWxpdHkgdG8gdXNlIElQQyBvdGhlciB0aGFuIHNoYXJlZCBtZW1vcnkuCiAgICAgR2V0IG1vZF9zdGF0dXMgd29ya2luZyBvbiBXaW5kb3dzIGFnYWluLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTWFrZSBtb2Rfc3RhdHVzIHdvcmsgd2l0aCAyLjAuICBUaGlzIHdpbGwgd29yayBmb3IgcHJlZm9yaywKICAgICBtcG10X3B0aHJlYWQsIGFuZCBkZXh0ZXIuICBbUnlhbiBCbG9vbV0KCiAgKikgQ29ycmVjdCBhIHR5cG8gaW4gaHR0cGQuY29uZi4KICAgICBbS3VuaWhpcm8gVGFuYWthIDx0YW5ha2EgYXBhY2hlLm9yLmpwPl0gUFIjNzE1NCAKCiAgKikgUmVhbGx5IGZpeCBtb2RfcmV3cml0ZSBtYXAgbG9va3VwcyB0aGlzIHRpbWUuIFtUb255IEZpbmNoXQoKICAqKSBHZXQgdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBpZiBTZXJ2ZXJOYW1lIGlzbid0IHNldCBhbmQgd2UgY2FuJ3QKICAgICBmaW5kIGEgZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGF0IHN0YXJ0dXAuCiAgICAgUFIjNzE3MCBbRGFuZWsgRHV2YWxsIDxkZHV2YWxsIGVuZy5zdW4uY29tPl0KCiAgKikgTWFrZSBtb2RfY2dpZCB3b3JrIHdpdGggU3VFeGVjLiAgW1J5YW4gQmxvb21dCgogICopIEFkb3B0IGFwciB1c2VyL2dyb3VwIG5hbWUgZmVhdHVyZXMgZm9yIG1vZF9yZXdyaXRlLiAgRWxpbWluYXRlcyBzb21lCiAgICAgJ2V4dHJhJyBzdGF0J3MgZm9yIHVzZXIvZ3JvdXAgc2luY2UgdGhleSBzaG91bGQgbmV2ZXIgb2NjdXIsIGFuZCBub3cKICAgICByZXNvbHZlcyB0aGUgU0NSSVBUX1VTRVIgYW5kIFNDUklQVF9HUk9VUCwgaW5jbHVkaW5nIG9uIFdpbk5UIE5URlMKICAgICB2b2x1bWVzLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRvcHQgYXByIGZlYXR1cmVzIHRvIHNpbXBsaWZ5IG1vZF9pbmNsdWRlcy4gIFRoaXMgY2hhbmdlcyB0aGUKICAgICBiZWhhdmlvciBvZiB0aGUgVVNFUl9OQU1FIHZhcmlhYmxlLCB1bmtub3duIHVpZCdzIGFyZSBub3cgcmVwb3J0ZWQKICAgICBhcyBVU0VSX05BTUU9Ijx1bmtub3duPiIgcmF0aGVyIHRoYW4gdGhlIG9sZCB1c2VyIzAwMCByZXN1bHQuCiAgICAgV2luTlQgbm93IHJlc29sdmVzIFVTRVJfTkFNRSBvbiBOVEZTIHZvbHVtZXMuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZG9wdCBhcHIgZmVhdHVyZXMgZm9yIHNpbXBsaWZpbmcgbW9kX3VzZXJkaXIsIGFuZCBhY2NlcHQgdGhlIG5ldwogICAgIFdpbjMyL09TMiBleGNlcHRpb25zIHdpdGhvdXQgaGljY3VwaW5nLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmVwbGFjZSBjb25maWd1cmUgLS13aXRoLW9wdGltIG9wdGlvbiBieSB1c2luZyBhbmQgc2F2aW5nIHRoZQogICAgIGVudmlyb25tZW50IHZhcmlhYmxlIE9QVElNIGluc3RlYWQuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGNvbmZpZ3VyZQogICAgIG9wdGlvbnMgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgZmxhZ3Mgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBGaXggc29tZSBieXRlcmFuZ2UgaGFuZGxpbmcuICBJZiB3ZSBnZXQgYSBieXRlIHJhbmdlIHRoYXQgbG9va3MgbGlrZQogICAgICItOTk5OTk5IiB3aGVyZSB0aGF0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwgd2Ugc2hvdWxkIHJldHVybiAKICAgICBhIFBBUlRJQUwgQ09OVEVOVCBzdGF0dXMgY29kZSwgYW5kIHJldHVybiB0aGUgd2hvbGUgZmlsZSBhcyBvbmUgYmlnCiAgICAgYnl0ZXJhbmdlLiAgVGhpcyBtYXRjaGVzIHRoZSAxLjMgaGFuZGxpbmcgbm93LiAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgdGhlIGVycm9yIGJ1Y2tldCBhIHJlYWwgbWV0YS1kYXRhIGJ1Y2tldC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKICAgICBidWNrZXQgbGVuZ3RoIGlzIDAsIGFuZCBhIHJlYWQgcmV0dXJucyBOVUxMIGRhdGEuICBJZiBvbmUgb2YgdGhlc2UKICAgICBidWNrZXRzIGlzIHBhc3NlZCBkb3duIGFmdGVyIHRoZSBoZWFkZXJzIGFyZSBzZW50LCB0aGlzIGRhdGEgd2lsbAogICAgIGp1c3QgYmUgaWdub3JlZC4gIFtHcmVnIFN0ZWluXQoKICAqKSBUaGUgcHJlZm9yayBNUE0gd2Fzbid0IGtpbGxpbmcgY2hpbGQgcHJvY2Vzc2VzIGNvcnJlY3RseSBpZiBhIHJlc3RhcnQKICAgICBzaWduYWwgd2FzIHJlY2VpdmVkIHdoaWxlIHRoZSBwcm9jZXNzIHdhcyBzZXJ2aW5nIGEgcmVxdWVzdC4gIFRoZSBjaGlsZAogICAgIHByb2Nlc3Mgd291bGQgYmVjb21lIHRoZSBlcXVpdmFsZW50IG9mIGEgc2Vjb25kIHBhcmVudCBwcm9jZXNzLiAgSWYKICAgICB3ZSBicmVhayBvdXQgb2YgdGhlIGFjY2VwdCBsb29wLCB0aGVuIHdlIG5lZWQgdG8gZG8gZGllIGFmdGVyIGNsZWFuaW5nCiAgICAgdXAgYWZ0ZXIgb3Vyc2VsdmVzLiAgW1J5YW4gQmxvb21dCgogICopIENoYW5nZSB0aGUgUHJlZm9yayBNUE0gdG8gdXNlIFNJR1dJTkNIIGluc3RlYWQgb2YgU0lHVVNSMSBmb3IgZ3JhY2VmdWwKICAgICByZXN0YXJ0cy4gIFtSeWFuIEJsb29tXQoKICAqKSBNb2RpZnkgdGhlIGFwcl9zdGF0L2xzdGF0L2dldGZpbGVpbmZvIGNhbGxzIHdpdGhpbiBhcGFjaGUgdG8gdXNlCiAgICAgdGhlIG1vc3Qgb3B0aW1hbCBBUFJfRklORk9fd2FudGVkIGJpdHMuICBUaGlzIHNwYXJlcyBXaW4zMiBmcm9tCiAgICAgcGVyZm9ybWluZyB2ZXJ5IGV4cGVuc2l2ZSBvd25lciwgZ3JvdXAgYW5kIHBlcm1pc3Npb24gbG9va3VwcwogICAgIGFuZCBhbGxvd3MgdGhlIHNlcnZlciB0byBmdW5jdGlvbiB1bnRpbCB0aGVzZSBhcHJfZmluZm9fdCBmaWVsZHMKICAgICBhcmUgaW1wbGVtZW50ZWQgdW5kZXIgV2luMzIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTdXBwb3J0IGZvciB0eXBlZHNhZmUgb3B0aW9uYWwgZnVuY3Rpb25zIC0gdGhhdCBpcyBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkKICAgICBvcHRpb25hbCBtb2R1bGVzLCB3aGljaCwgdGhlcmVmb3JlLCBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LCBkZXBlbmRpbmcKICAgICBvbiBjb25maWd1cmF0aW9uLiBTZWUgdGhlIGV4cGVyaW1lbnRhbCBtb2R1bGVzIG1vZF9vcHRpb25hbF9mbl97ZXgsaW19cG9ydAogICAgIGZvciBzYW1wbGUgY29kZS4gW0JlbiBMYXVyaWVdCgogICopIGZpbHRlcnMgY2FuIG5vdyByZXBvcnQgYW4gSFRUUCBlcnJvciB0byB0aGUgc2VydmVyLiAgVGhpcyBpcyBkb25lCiAgICAgYnkgc2VuZGluZyBhIGJyaWdhZGUgd2hlcmUgdGhlIGZpcnN0IGJ1Y2tldCBpcyBhbiBlcnJvcl9idWNrZXQuCiAgICAgVGhpcyBidWNrZXQgaXMgYSBzaW1wbGUgYnVja2V0IHRoYXQgc3RvcmVzIGFuIEhUVFAgZXJyb3IgYW5kCiAgICAgYSBzdHJpbmcuICBDdXJyZW50bHkgdGhlIHN0cmluZyBpcyBub3QgdXNlZCwgYnV0IGl0IG1heSBiZSBuZWVkZWQKICAgICB0byBvdXRwdXQgYW4gZXJyb3IgbG9nLiAgVGhlIGh0dHBfaGVhZGVyX2ZpbHRlciB3aWxsIGZpbmQgdGhpcwogICAgIGJ1Y2tldCwgYW5kIG91dHB1dCB0aGUgZXJyb3IgdGV4dCwgYW5kIHRoZW4gcmV0dXJuIAogICAgIEFQX0ZJTFRFUl9FUlJPUiwgd2hpY2ggaW5mb3JtcyB0aGUgc2VydmVyIHRoYXQgdGhlIGVycm9yIHdlYiBwYWdlCiAgICAgaGFzIGFscmVhZHkgYmVlbiBzZW50LiAgW1J5YW4gQmxvb21dCgogICopIElmIHdlIGdldCBhbiBlcnJvciwgdGhlbiB3ZSBzaG91bGQgcmVtb3ZlIGFsbCBmaWx0ZXJzIGV4Y2VwdCBmb3IKICAgICB0aG9zZSBjcml0aWNhbCB0byBzZXJ2aW5nIGEgd2ViIHBhZ2UuICBUaGlzIGZpeGVzIGEgYnVnLCB3aGVyZQogICAgIGVycm9yIHBhZ2VzIHdlcmUgZ29pbmcgdGhyb3VnaCB0aGUgYnl0ZXJhbmdlIGZpbHRlciwgZXZlbiB0aG91Z2gKICAgICB0aGF0IG1hZGUgbm8gc2Vuc2UuICBbUnlhbiBCbG9vbV0KCiAgKikgUmVsYXggdGhlIHN5bnRheCBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQKICAgICBpRE5TLiBQUiM2NjM1IFtUb255IEZpbmNoXQoKICAqKSBDbGVhbnVwIHRoZSBieXRlcmFuZ2UgZmlsdGVyIHRvIHVzZSB0aGUgYXByX2JyaWdhZGVfcGFydGl0aW9uCiAgICAgYW5kIGFwcl9idWNrZXRfY29weSBmdW5jdGlvbnMuICBUaGlzIHJlbW92ZXMgYSBsb3Qgb2YgdmVyeSBtZXNzeQogICAgIGNvZGUsIGFuZCBob3BlZnVsbHkgbWFrZXMgdGhpcyBmaWx0ZXIgbW9yZSBzdGFibGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbW92ZSBBZGRNb2R1bGUgYW5kIENsZWFyTW9kdWxlTGlzdCBkaXJlY3RpdmVzLiAgQm90aCBvZiB0aGVzZQogICAgIGRpcmVjdGl2ZXMgd2VyZSB1c2VkIHRvIGVuc3VyZSB0aGF0IG1vZHVsZXMgY291bGQgYmUgZW5hYmxlZAogICAgIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgVGhhdCByZXF1aXJlbWVudCBpcyBub3cgZ29uZSwgYmVjYXVzZQogICAgIHdlIHVzZSBob29rcyB0byBlbnN1cmUgdGhhdCBtb2R1bGVzIGFyZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgV2hlbiBTdUV4ZWMgaXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgbGlzdCBvZgogICAgIHRhcmdldHMgdG8gYmUgYnVpbHQuICBJZiB3ZSBkb24ndCwgdGhlbiBhbnkgY2hhbmdlcyB0byB0aGUKICAgICBjb25maWd1cmF0aW9uIHdvbid0IGFmZmVjdCBTdUV4ZWMsIHVubGVzcyAnbWFrZSBzdWV4ZWMnIGlzCiAgICAgc3BlY2lmaWNhbGx5IHJ1bi4gIFtSeWFuIEJsb29tXQoKICAqKSBDbGVhbmVkIG91dCBvcGVuX2ZpbGUgZnJvbSBtb2RfZmlsZV9jYWNoZSwgYXMgYXByIG5vdyBhY2NlcHRzCiAgICAgdGhlIEFQUl9YVEhSRUFEIGFyZ3VtZW50IHRvIG9wZW4gYSBmaWxlIGZvciBjb25zdW1wdGlvbiBieQogICAgIHBhcmFsbGVsIHRocmVhZHMgb24gd2luMzIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBDb3JyZWN0IGEgYnVnIGluIGRldGVybWluaW5nIHdoZW4gd2UgZm9sbG93IHN5bWxpbmtzLiAgVGhlIGNvZGUKICAgICBleHBlY3RlZCBhIHN0YXQgLTEgcmVzdWx0LCBub3QgYW4gYXByX3N0YXR1c190IHBvc2l0aXZlIGVycm9yLgogICAgIEFsc28gY2hlY2sgaWYgdGhlIEFQUl9GSU5GT19VU0VSIGZpZWxkcyBhcmUgdmFsaWQgYmVmb3JlIHdlCiAgICAgZm9sbG93IHRoZSBsaW5rLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTW92ZSBpbml0Z3JvdXBncywgYXBfdW5hbWUyaWQgYW5kIGFwX2duYW1lMmlkIGZyb20gdXRpbC5jIHRvCiAgICAgbXBtX2NvbW1vbi5jLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IHZhbGlkIG9uIHNvbWUgcGxhdGZvcm1zLAogICAgIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbWFpbi1saW5lIGNvZGUuIFtSeWFuIEJsb29tXQoKICAqKSBSZW1vdmUgYXBfY2hkaXJfZmlsZSgpLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUsCiAgICAgYW5kIG5vYm9keSBpcyBjdXJyZW50bHkgdXNpbmcgaXQuICBbUnlhbiBCbG9vbV0KCiAgKikgRG8gbm90IHRyeSB0byBydW4gbWFrZSBkZXBlbmQgaWYgdGhlcmUgYXJlIG5vIC5jIGZpbGVzIGluIHRoZQogICAgIGN1cnJlbnQgZGlyZWN0b3J5LCBkb2luZyBzbyBtYWtlcyBgbWFrZSBkZXBlbmRgIGZhaWwuCiAgICAgW1J5YW4gQmxvb21dCgogICAqKSBVcGRhdGUgaGlnaHBlcmZvcm1hbmNlLmNvbmYgdG8gd29yayB3aXRoIGVpdGhlciBwcmVmb3JrIG9yCiAgICAgIHB0aHJlYWRzIG1wbXMuICBbR3JlZyBBbWVzXSAKCiAgKikgU3RvcCBjaGVja2luZyB0byBzZWUgaWYgdGhpcyBpcyBhIHBpcGVsaW5lZCByZXF1ZXN0IGlmIHdlIGtub3cKICAgICBmb3IgYSBmYWN0IHRoYXQgaXQgaXNuJ3QuICBCYXNpY2FsbHksIGlmIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9PSAwLgogICAgIFRoaXMga2VlcHMgdXMgZnJvbSBtYWtpbmcgYW4gZXh0cmEgcmVhZCBjYWxsIHdoZW4gc2VydmluZyBhIDEuMAogICAgIHJlcXVlc3QuICBbUnlhbiBCbG9vbSBhbmQgR3JlZyBTdGVpbl0KCiAgKikgRml4IHRoZSBoYW5kbGluZyBvZiB2YXJpYWJsZSBleHBhbnNpb24gbG9vay1haGVhZCBpbiBtb2RfcmV3cml0ZSwKICAgICBpLmUuIHN5bnRheCBsaWtlICV7TEEtVTpSRU1PVEVfVVNFUn0sIGFuZCBhbHNvIGZpeCB0aGUgcGFyc2luZyBvZgogICAgIG1vcmUgY29tcGxpY2F0ZWQgbmVzdGVkIFJld3JpdGVNYXAgbG9va3Vwcy4gUFIjNzA4NyBbVG9ueSBGaW5jaF0KCiAgKikgRml4IHRoZSBSRkMgbnVtYmVyIG1lbnRpb25lZCB3aGVuIGNvbXBsYWluaW5nIGFib3V0IGEgbWlzc2luZwogICAgIEhvc3Q6IGhlYWRlci4gUFIjNzA3OSBbQWxleGV5IFRvcHR5Z2luIDxhbGV4ZXl0IHdhbS51bWQuZWR1Pl0KCiAgKikgRml4IGFuIGVuZGxlc3MgbG9vcCBpbiBhYiB3aGljaCBvY2N1cnJlZCB3aGVuIGFiIHdhcyBwb3N0aW5nCiAgICAgYW5kIHRoZSBzZXJ2ZXIgZHJvcHBlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgc2VnZmF1bHQgd2hpbGUgaGFuZGxpbmcgcmVxdWVzdCBib2RpZXMgaW4gYXBfaHR0cF9maWx0ZXIoKS4gIAogICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBzZWVuIHdpdGggbW9kX2RhdiB1c2FnZSBhcyB3ZWxsIGFzIHdpdGggCiAgICAgcmVxdWVzdHMgd2hlcmUgdGhlIGJvZHkgd2FzIGp1c3QgYmVpbmcgZGlzY2FyZGVkLiAgW0plZmYgVHJhd2lja10KCiAgKikgU29tZSBhZGp1c3RtZW50IG9uIHRoZSBoYW5kbGluZyBhbmQgYXV0b21hdGljIHNldHRpbmcgKHZpYQogICAgIGhpbnRzLm00KSBvZiB2YXJpb3VzIGNvbXBpbGF0aW9uIGZsYWdzIChlZzogQ0ZMQUdTKS4gQWxzbywKICAgICBhZGQgdGhlIGNhcGFiaWxpdHkgdG8gc3BlY2lmeSBmbGFncyAoTk9URVNUX0NGTEFHUyBhbmQKICAgICBOT1RFU1RfTERGTEFHUykgd2hpY2ggYXJlIHVzZWQgdG8gY29tcGlsZSBBcGFjaGUsIGJ1dAogICAgIG5vdCB1c2VkIGR1cmluZyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLiBVc2VmdWwgZm9yCiAgICAgZmxhZ3MgbGlrZSAiLVdlcnJvciIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTdG9wIHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBmb3JjZSBkZWJ1ZyBtb2RlIG9yCiAgICAgbm8gZGV0YWNoLiAgV2Ugbm93IHVzZSB0aGUgLUQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIAogICAgIHNwZWNpZnkgdGhlIGNvcnJlY3QgbW9kZS4gIC1ET05FX1BST0NFU1MgYW5kIC1ETk9fREVUQUNILgogICAgIFtHcmVnIFN0ZWluLCBSeWFuIEJsb29tXQoKICAqKSBDaGFuZ2UgaGFuZGxlcnMgdG8gdXNlIGhvb2tzLiBbQmVuIExhdXJpZV0KCiAgKikgU3RvcCByZXR1cm5pbmcgY29waWVzIG9mIGZpbGVuYW1lcyBmcm9tIGJvdGggYXByX2ZpbGVfdCBhbmQKICAgICBhcHJfZGlyX3QuICBXZSBwc3RyZHVwIHRoZSBmaWxlbmFtZXMgdGhhdCB3ZSBzdG9yZSBpbiB0aGUKICAgICBhY3R1YWwgc3RydWN0dXJlcywgc28gd2UgZG9uJ3QgbmVlZCB0byBwc3RyZHVwIHRoZSBzdHJpbmdzIGFnYWluLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfY2dpOiBGaXggc29tZSBwcm9ibGVtcyB3aGVyZSB0aGUgd3JvbmcgZXJyb3IgdmFsdWUgd2FzIGJlaW5nCiAgICAgdHJhY2VkLiAgW0plZmYgVHJhd2lja10KCiAgKikgRUJDRElDOiBGaXggc29tZSBtaXNzaW5nIEFTQ0lJIGNvbnZlcnNpb24gb24gc29tZSBwcm90b2NvbCBkYXRhLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBnZW5lcmljIGhvb2tzLiBbQmVuIExhdXJpZV0KCiAgKikgVXNlIGEgcmVhbCBwb29sIHRvIGR1cCB0aGUgZXJyb3IgbG9nIGRlc2NyaXB0b3IuICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGEgc2VnZmF1bHQgY2F1c2VkIGJ5IG1vZF9leHRfZmlsdGVyIHdoZW4gdGhlIGV4dGVybmFsIGZpbHRlciAKICAgICBwcm9ncmFtIGRvZXMgbm90IGV4aXN0LiBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gb3V0cHV0IHRydW5jYXRpb24gZXJyb3Igd2hlbiBvbiBhbiBIVFRQID49IDEuMCByZXF1ZXN0IGFuCiAgICAgb2JqZWN0IG9mIHNpemUgYmV0d2VlbiBERUZBVUxUX0JVQ0tFVF9TSVpFIGFuZCBBUF9NSU5fQllURVNfVE9fV1JJVEUgCiAgICAgd2FzIHNlcnZlZCB0aHJvdWdoIG1vZF9jaGFyc2V0X2xpdGUgKG9yIGFueXRoaW5nIGVsc2UgdGhhdCB3b3VsZAogICAgIGNyZWF0ZSBhIHRyYW5zaWVudCBidWNrZXQgaW4gdGhpcyBzaXplIHJhbmdlKS4gIGFwX2J1Y2tldF9tYWtlX2hlYXAoKQogICAgIHNpbGVudGx5IGZhaWxlZCAoZml4ZWQpLCB0cmFuc2llbnRfc2V0YXNpZGUoKSBkaXNjb3ZlcmVkIGl0LCBidXQKICAgICBhcF9zYXZlX2JyaWdhZGUoKSBpZ25vcmVkIGl0IChmaXhlZCkuIFtKZWZmIFRyYXdpY2tdCiAgICAgCiAgKikgSWdub3JlIFxyXG4gb3IgXG4gd2hlbiB1c2luZyBQRUVLIG1vZGUgZm9yIGlucHV0IGZpbHRlcnMuICBUaGUgcHJvYmxlbQogICAgIGlzIHRoYXQgc29tZSBicm93c2VycyBzZW5kIGV4dHJhIGxpbmVzIGF0IHRoZSBlbmQgb2YgUE9TVCByZXF1ZXN0cywgYW5kCiAgICAgd2UgZG9uJ3Qgd2FudCB0byBkZWxheSBzZW5kaW5nIGRhdGEgYmFjayB0byB0aGUgdXNlciBqdXN0IGJlY2F1c2UgdGhlCiAgICAgYnJvd3NlciBpc24ndCB3ZWxsIGJlaGF2ZWQuIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgU3VFWEVDIHdvcmtpbmcgYWdhaW4uICBXZSBjYW4ndCBzZW5kIGFic29sdXRlIHBhdGhzIHRvIHN1RXhlYwogICAgIGJlY2F1c2UgaXQgcmVmdXNlcyB0byBleGVjdXRlIHRob3NlIHByb2dyYW1zLiAgU3VFWEVDIGFsc28gd2Fzbid0CiAgICAgYWx3YXlzIHJlY29nbml6aW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYWRlIHVzaW5nIHRoZSBhdXRvY29uZgogICAgIHNldHVwLiAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IHRoZSBidWlsZGNvbmYgcHJvY2VzcyB0byBmaW5kIHRoZSBjb25maWcubTQgZmlsZXMgaW4gdGhlIGNvcnJlY3QKICAgICBvcmRlci4gIEJhc2ljYWxseSwgd2UgY2FuIG5vdyBuYW1lIGNvbmZpZy5tNCBmaWxlcyBhcyBjb25maWdcZFxkLm00LAogICAgIGFuZCB3ZSB3aWxsIHNvcnQgdGhlbSBjb3JyZWN0bHkgd2hlbiBpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSBidWlsZAogICAgIHByb2Nlc3MuICBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IG1vZF9jZ2lkIHRvIHVzZSBhcHIgY2FsbHMgZm9yIGNyZWF0aW5nIHRoZSBhY3R1YWwgQ0dJIHByb2Nlc3MuCiAgICAgVGhpcyBhbHNvIGFsbG93cyBtb2RfY2dpZCB0byB1c2UgYXBfb3NfY3JlYXRlX3ByaXZpbGVkZ2VkX3Byb2Nlc3MsCiAgICAgdGh1cyBhbGxvd2luZyBmb3IgU3VFeGVjIGV4ZWN1dGlvbiBmcm9tIG1vZF9jZ2lkLiAgQ3VycmVudGx5LCB3ZSBkbwogICAgIG5vdCBzdXBwb3J0IGV2ZXJ5dGhpbmcgdGhhdCBzdGFuZGFyZCBTdUV4ZWMgc3VwcG9ydHMsIGJ1dCBhdCBsZWFzdAogICAgIGl0IHdvcmtzIG1pbmltYWxseSBub3cuIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBTdUV4ZWMgdG8gYmUgY29uZmlndXJlZCBmcm9tIHRoZSAuL2NvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFVwZGF0ZSBzb21lIG9mIHRoZSBkb2NzIGluIFJFQURNRSBhbmQgSU5TVEFMTCB0byByZWZsZWN0IHNvbWUgb2YKICAgICB0aGUgY2hhbmdlcyBpbiBBcGFjaGUgMi4wIFtDbGlmZiBXb29sbGV5IDxjbGlmZndvb2xsZXkgeWFob28uY29tPl0KCiAgKikgSWYgd2UgZ2V0IEVBR0FJTiByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIHRvIGFwcl9zZW5kZmlsZSwgdGhlbiB3ZQogICAgIG5lZWQgdG8gY2FsbCBzZW5kZmlsZSBhZ2Fpbi4gIFRoaXMgZ2V0cyB1cyBzZXJ2aW5nIGxhcmdlIGZpbGVzCiAgICAgc3VjaCBhcyBhcGFjaGVfMi4wYTkudGFyLmd6IG9uIEZyZWVCU0QgYWdhaW4uIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIHN1cHBvcnQgcHJvZ3JhbXMgYnVpbGRpbmcgY2xlYW5seSBhZ2Fpbi4KICAgICBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIFRoZSBBcGFjaGUvV2luMzIgQXBhY2hlLmV4ZSBhbmQgZGxsJ3Mgbm93IGxpdmUgaW4gYmluLiAgVGhlIAogICAgIGN1cnJlbnQgZGlyZWN0b3J5IGxvZ2ljIG5vdyBiYWNrcyB1cCBvdmVyIGJpbi8gdG8gZGV0ZXJtaW5lIHRoZQogICAgIHNlcnZlciByb290IGZyb20gdGhlIEFwYWNoZS5leGUgcGF0aC4KCiAgKikgQXBhY2hlL1dpbjMyIG5vdyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBjb252ZW50aW9ucyBvZiBtb2RfZm9vLnNvCiAgICAgbG9hZGFibGUgbW9kdWxlcywgZHluYW1pYyBsaWJzIGFyZSBhbGwgbmFtZWQgbGliZm9vLmRsbCwgYW5kIHRoZQogICAgIG1ha2VmaWxlLndpbiBwb3B1bGF0ZXMgdGhlIGluY2x1ZGUsIGxpYiBhbmQgbGliZXhlYyBkaXJlY3Rvcmllcy4KCiAgKikgQXBhY2hlIGlzIG5vdyBJUHY2LWNhcGFibGUuICBPbiBzeXN0ZW1zIHdoZXJlIEFQUiBzdXBwb3J0cyBJUHY2LAogICAgIEFwYWNoZSBnZXRzIElQdjYgbGlzdGVuaW5nIHNvY2tldHMgYnkgZGVmYXVsdC4gIEFkZGl0aW9uYWxseSwgdGhlCiAgICAgTGlzdGVuLCBOYW1lVmlydHVhbEhvc3QsIGFuZCA8VmlydHVhbEhvc3Q+IGRpcmVjdGl2ZXMgc3VwcG9ydCBJUHY2CiAgICAgbnVtZXJpYyBhZGRyZXNzIHN0cmluZ3MgKGUuZy4sICJMaXN0ZW4gW2ZlODA6OjFdOjgwODAiKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb2RpZnkgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGxheW91dC4gIE1vZHVsZXMgYXJlIG5vdyBpbnN0YWxsZWQgaW4KICAgICBtb2R1bGVzLy4gIFNoYXJlZCBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBsaWJyYXJpZXMvLCBidXQKICAgICB3ZSBkb24ndCBoYXZlIGFueSBvZiB0aG9zZSBvbiBVbml4IHlldC4gIEFsbCBpbnN0YWxsIGRpcmVjdG9yaWVzCiAgICAgYXJlIG1vZGlmeWFibGUgYXQgY29uZmlndXJlIHRpbWUuIFtSeWFuIEJsb29tXQoKICAqKSBJbnN0YWxsIGFsbCBoZWFkZXIgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uIFVuaXguIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIGZ1bmN0aW9ucyBpbiBzZXJ2ZXIvbGlua2VkIGludG8gdGhlIHNlcnZlciwgcmVnYXJkbGVzcyBvZgogICAgIHdoaWNoIG1vZHVsZXMgbGlua2VkIGludG8gdGhlIHNlcnZlci4gIFRoaXMgdXNlcyB0aGUgc2FtZSBoYWNrIAogICAgIGZvciBBcGFjaGUgdGhhdCB3ZSB1c2UgZm9yIEFQUiBhbmQgYXByLXV0aWwgdG8gZW5zdXJlIGFsbCBvZiB0aGUKICAgICBuZWNlc3NhcnkgZnVuY3Rpb25zIGFyZSBsaW5rZWQuICBBcyBhIHBhcnQgb2YgdGhpc2UsIHRoZSBDSEFSU0VUX0VCQ0RJQwogICAgIHdhcyByZW5hbWVkIHRvIEFQX0NIQVJTRVRfRUJDRElDIGZvciBuYW1lc3BhY2UgcHJvdGVjdGlvbiwgYW5kIHRvIG1ha2UKICAgICB0aGUgc2NyaXB0cyBhIGJpdCBlYXNpZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJld29yayB0aGUgUkZDMTQxMyBoYW5kbGluZyB0byBtYWtlIGl0IHRocmVhZC1zYWZlLCB1c2UgYSB0aW1lb3V0CiAgICAgb24gdGhlIHF1ZXJ5LCBhbmQgcmVtb3ZlIElQdjQgZGVwZW5kZW5jaWVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgR2V0IGFsbCBvZiB0aGUgYXV0aCBtb2R1bGVzIHRvIHRoZSBwb2ludCB0aGF0IHRoZXkgd2lsbCBpbnN0YWxsIGFuZAogICAgIGJlIGxvYWRhYmxlIGludG8gdGhlIHNlcnZlci4gIE91ciBuZXcgYnVpbGQvaW5zdGFsbCBtZWNoYW5pc20gZXhwZWN0cwogICAgIHRoYXQgYWxsIG1vZHVsZXMgd2lsbCBoYXZlIGEgY29tbW9uIG5hbWUgZm9ybWF0LiAgVGhlIGF1dGggbW9kdWxlcyAKICAgICBkaWRuJ3QgdXNlIHRoYXQgZm9ybWF0LCBzbyB3ZSBkaWRuJ3QgaW5zdGFsbCB0aGVtIHByb3Blcmx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUEkgcm91dGluZXMgYXBfcGdldGhvc3RieW5hbWUoKSBhbmQgYXBfcGR1cGhvc3RlbnQoKSBhcmUgbm8gbG9uZ2VyCiAgICAgYXZhaWxhYmxlLiAgVXNlIGFwcl9nZXRhZGRyaW5mbygpIGluc3RlYWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBHZXQgIk5hbWVWaXJ0dWFsSG9zdCAqIiB3b3JraW5nIGluIDIuMC4gIFtSeWFuIEJsb29tXQoKICAqKSBSZXR1cm4gSFRUUF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgaWYgdGhlIGV2ZXJ5IHJhbmdlIHJlcXVlc3RlZCBzdGFydHMKICAgICBhZnRlciB0aGUgZW5kIG9mIHRoZSByZXNwb25zZS4gW1J5YW4gQmxvb21dCgogICopIEdldCBieXRlcmFuZ2UgcmVxdWVzdHMgd29ya2luZyB3aXRoIHJlc3BvbnNlcyB0aGF0IGRvIG5vdCBoYXZlIGEKICAgICBjb250ZW50LWxlbmd0aC4gIEJlY2F1c2Ugb2YgdGhlIHdheSBieXRlcmFuZ2UgcmVxdWVzdHMgd29yaywgd2UgaGF2ZSB0bwogICAgIGhhdmUgYWxsIG9mIHRoZSBkYXRhIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgZG8gdGhlIGJ5dGVyYW5nZSwgc28gd2UKICAgICBjYW4gY29tcHV0ZSB0aGUgY29udGVudC1sZW5ndGggaW4gdGhlIGJ5dGVyYW5nZSBmaWx0ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBleGUgQ0dJJ3Mgd29ya2luZyBhZ2FpbiBvbiBXaW5kb3dzLgogICAgIFtBbGxhbiBFZHdhcmRzXQoKICAqKSBHZXQgbW9kX2NnaWQgYW5kIG1vZF9yZXdyaXRlIHRvIHdvcmsgYXMgRFNPcyBieSBjaGFuZ2luZyB0aGUgd2F5CiAgICAgdGhleSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHRoZWlyICBwb3N0IGNvbmZpZyBob29rIGhhcyBiZWVuCiAgICAgY2FsbGVkIGJlZm9yZS4gIEluc3RlYWQgb2YgYSBzdGF0aWMgdmFyaWFibGUgKHdoaWNoIGlzIHJlcGxhY2VkIHdoZW4gCiAgICAgdGhlIERTTyBpcyBsb2FkZWQgYSBzZWNvbmQgdGltZSksIHVzZSB1c2VyZGF0YSBpbiB0aGUgcHJvY2VzcyBwb29sLgogICAgIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE5CgogICopIFdpbjMyIG5vdyByZXF1aXJlcyBwZXJsIHRvIGNvbXBsZXRlIHRoZSBmaW5hbCBpbnN0YWxsIHN0ZXAgZm9yIHVzZXJzCiAgICAgdG8gYnVpbGQgKyBpbnN0YWxsIG9uIFdpbjMyLiAgTWFrZWZpbGUud2luIG5vdyByZXdyaXRlcyBAQFNlcnZlclJvb3RACiAgICAgYW5kIGluc3RhbGxzIHRoZSBjb25mLCBodGRvY3MgYW5kIGh0ZG9jcy9tYW51YWwgZGlyZWN0b3JpZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSBtb2RfaW5jbHVkZSB1c2UgYSBoYXNoIHRhYmxlIHRvIGFzc29jaWF0ZSBkaXJlY3RpdmUgdGFncyB3aXRoCiAgICAgZnVuY3Rpb25zLiAgVGhpcyBhbGxvd3MgbW9kdWxlcyB0byBpbXBsZW1lbnQgdGhlaXIgb3duIFNTSSB0YWdzIGVhc2lseS4KICAgICBUaGUgaWRlYSBpcyBzaW1wbGUgZW5vdWdoLCBhIG1vZHVsZSBjYW4gaW5zZXJ0IGl0J3Mgb3duIHRhZyBhbmQgZnVuY3Rpb24KICAgICBjb21iaW5hdGlvbiBpbnRvIGEgaGFzaCB0YWJsZSBwcm92aWRlZCBieSBtb2RfaW5jbHVkZS4gIFdoaWxlIG1vZF9pbmNsdWRlCiAgICAgcGFyc2VzIGFuIFNTSSBmaWxlLCB3aGVuIGl0IGVuY291bnRlcnMgYSB0YWcgaW4gdGhlIGZpbGUsIGl0IGRvZXMgYQogICAgIGhhc2ggbG9va3VwIHRvIGZpbmQgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGF0IHRhZywgYW5kIHBhc3NlcwogICAgIGFsbCBvZiB0aGUgcmVsZXZhbnQgZGF0YSB0byB0aGUgZnVuY3Rpb24uICBUaGF0IGZ1bmN0aW9uIGlzIHRoZW4KICAgICByZXNwb25zaWJsZSBmb3IgcHJvY2Vzc2luZyB0aGUgdGFnIGFuZCBoYW5kaW5nIHRoZSByZW1haW5pbmcgZGF0YSBiYWNrCiAgICAgdG8gbW9kX2luY2x1ZGUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAgICBbUGF1bCBKLiBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBHZXQgcmlkIG9mIGFwX25ld19hcHJfY29ubmVjdGlvbigpLiAgYXBfbmV3X2Nvbm5lY3Rpb24oKSBub3cgaGFzIAogICAgIGZld2VyIHBhcmFtZXRlcnM6IHRoZSBsb2NhbCBhbmQgcmVtb3RlIHNvY2tldCBhZGRyZXNzZXMgd2VyZSByZW1vdmVkCiAgICAgZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QgYmVjYXVzZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCiAgICAgdmlhIHRoZSBBUFIgc29ja2V0LiAgW0plZmYgVHJhd2lja10KCiAgKikgRGlzdHJpYnV0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgcmVvcmdhbml6ZWQgdG8gcmVmbGVjdCBhCiAgICAgbm9ybWFsIHNvdXJjZSBkaXN0cmlidXRpb24gd2l0aCBleHRlcm5hbCBpbnN0YWxsIHRhcmdldHMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIE1QTXMgdGhhdCBuZWVkIG11bHRpcGxlIHNlZ21lbnRzIG9mIHNoYXJlZCBtZW1vcnkgbm93IGNyZWF0ZQogICAgIHR3byBhcHJfc2htZW1fdCB2YXJpYWJsZXMsIG9uZSBmb3IgZWFjaCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCiAgICAgdGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQKICAgICBmb3Igc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbmNlIHdlIHRyeSB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gb25lCiAgICAgdmFyaWFibGUuICBUaGUgTU0gY29kZSBhdXRvbWF0aWNhbGx5IGFsaWducyB0aGUgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9ucywKICAgICBzbyB3ZSBlbmQgdXAgbmVlZGluZyB0byBwYWQgdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IHdlIHdhbnQgYmFzZWQKICAgICBvbiBob3cgbWFueSB2YXJpYWJsZXMgd2lsbCBiZSBhbGxvY2F0ZWQgb3V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuCiAgICAgSXQgaXMganVzdCBlYXNpZXIgdG8gY3JlYXRlIGEgc2Vjb25kIGFwcl9zaG1lbV90IHZhcmlhYmxlLCBhbmQgdHdvCiAgICAgc2htZW0gbWVtb3J5IGJsb2Nrcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQ2xlYW51cCB0aGUgZXhwb3J0IGxpc3QgYSBiaXQuICBUaGlzIGNyZWF0ZXMgYSBzaW5nbGUgdW5pZmllZCBsaXN0IG9mCiAgICAgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IEFQUi4gIFRoZSBleHBvcnQgbGlzdCBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJlCiAgICAgdGltZSwgYW5kIHRoYXQgbGlzdCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGV4cG9ydHMuYyBmaWxlLgogICAgIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgZXhwb3J0IGxpc3QgaXMgZ2VuZXJhdGVkLCB3ZSBvbmx5IGV4cG9ydCB0aG9zZQogICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSB2YWxpZCBvbiB0aGUgcGxhdGZvcm0gd2UgYXJlIGJ1aWxkaW5nIG9uLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBFbmFibGUgbG9nZ2luZyB0aGUgY29va2llIHdpdGggbW9kX2xvZ19jb25maWcKICAgICBbU2FuZGVyIHZhbiBab2VzdCA8c2FuZGVyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIG1vZF9pbmZvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmF0aW9uLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGxpYi9hcHV0aWwvIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFyZSBub3QKICAgICBzcGVjaWZpYyB0byB0aGUgQXBhY2hlIEhUVFAgU2VydmVyIChidXQgZG8gbm90IG1ha2Ugc2Vuc2Ugd2l0aCBBUFIpLgogICAgIFRoZSBmaXJzdCB1dGlsaXR5IGlzICJhcHVfZGJtIjogYSBzZXQgb2YgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBEQk0KICAgICBmaWxlcy4gVGhpcyBmaXJzdCB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBmb3IgU0RCTSBvciBHREJNIGRhdGFiYXNlcy4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgQ29tcGxldGUgcmUtd3JpdGUgb2YgbW9kX2luY2x1ZGUuICBUaGlzIG1ha2VzIG1vZF9pbmNsdWRlIGEgZmlsdGVyIHRoYXQKICAgICB1c2VzIGJ1Y2tldHMgZGlyZWN0bHkuICBUaGlzIGhhcyBub3cgc2VydmVkIHRoZSBGQVEgY29ycmVjdGx5LgogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFsbG93IG1vZHVsZXMgdG8gc3BlY2lmeSB0aGUgZmlyc3QgZmlsdGVyIGluIGEgc3ViX3JlcXVlc3Qgd2hlbgogICAgIG1ha2luZyB0aGUgc3ViX3JlcXVlc3QuICBUaGlzIGtlZXBzIG1vZHVsZXMgZnJvbSBoYXZpbmcgdG8gY2hhbmdlIHRoZQogICAgIG91dHB1dF9maWx0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN1Yi1yZXF1ZXN0LCBhbmQgdGhlcmVmb3JlCiAgICAgc2tpcCB0aGUgc3ViX3JlcV9vdXRwdXRfZmlsdGVyLiAgW1J5YW4gQmxvb21dCgogICopIFVwZGF0ZSBhYiB0byBhY2NlcHQgVVJMcyB3aXRoIElQdjYgbGl0ZXJhbCBhZGRyZXNzIHN0cmluZ3MgKGluIHRoZQogICAgIGZvcm1hdCBkZXNjcmliZWQgaW4gUkZDIDI3MzIpLCBhbmQgdG8gYnVpbGQgSG9zdCBoZWFkZXIgZmllbGRzIGluCiAgICAgdGhlIHNhbWUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgSVB2NiBsaXRlcmFsIGFkZHJlc3Mgc3RyaW5ncyB0byBiZQogICAgIHVzZWQgd2l0aCBhYi4gIFRoaXMgc3VwcG9ydCBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBBcGFjaGUgMS4zIHdpdGggCiAgICAgdGhlIEtBTUUgcGF0Y2gsIGJ1dCBBcGFjaGUgMi4wIGRvZXMgbm90IHlldCB3b3JrIHdpdGggdGhpcyBmb3JtYXQKICAgICBvZiB0aGUgSG9zdCBoZWFkZXIgZmllbGQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBY2NvbW9kYXRlIGFuIG91dC1vZi1zcGFjZSBjb25kaXRpb24gaW4gdGhlIHBpcGVkIGxvZ3MgYW5kIHRoZQogICAgIHJvdGF0ZWxvZ3MuYyBjb2RlLCBhbmQgbm8gbG9uZ2VyIGNodXJuIGxvZyBwcm9jZXNzZXMgZm9yIHRoaXMKICAgICBjb25kaXRpb24uICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIEFkZCBzdXBwb3J0IGZvciBwYXJ0aWFsIHdyaXRlcyB3aXRoIGFwcl9zZW5kZmlsZSgpIHRvIGNvcmVfb3V0cHV0X2ZpbHRlci4KICAgICBbR3JlZyBBbWVzXSAKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTgKCiAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIG1vZF9taW1lIHNvIHRoYXQgZmlsdGVycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCiAgICAgYSBnaXZlbiBtaW1lLXR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBtdWx0aS12aWV3cyB3b3JraW5nIGFnYWluLiAgV2Ugd2VyZSBzZXR0aW5nIHRoZSBwYXRoX2luZm8KICAgICBmaWVsZCBpbmNvcnJlY3RseSBpZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgZmlsZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IDMwNCBwcm9jZXNzaW5nLiAgVGhlIGNvcmUgc2hvdWxkIG5ldmVyIHRyeSB0byBzZW5kIHRoZSBoZWFkZXJzCiAgICAgZG93biB0aGUgZmlsdGVyIHN0YWNrLiAgQWx3YXlzLCBqdXN0IHNldHVwIHRoZSB0YWJsZSBpbiB0aGUgcmVxdWVzdAogICAgIHJlY29yZCwgYW5kIGxldCB0aGUgaGVhZGVyIGZpbHRlciBjb252ZXJ0IGl0IHRvIGRhdGEgdGhhdCBpcyByZWFkeQogICAgIGZvciB0aGUgbmV0d29yay4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgTW9yZSBmaXhlcyBmb3IgdGhlIHByb3h5LiAgVGhlcmUgYXJlIHN0aWxsIGJ1Z3MgaW4gdGhlIHByb3h5IGNvZGUsCiAgICAgYnV0IHRoaXMgaGFzIG5vdyBwcm94aWVkIHd3dy55YWhvby5jb20gYW5kIHd3dy5udHJuZXQubmV0IChteSBJU1ApCiAgICAgc3VjY2Vzc2Z1bGx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggcGFyYW1zIGZvciBhcHJfZ2V0YWRkcmluZm8oKSBjYWxsIGluIGNvbm5lY3QgcHJveHkgaGFuZGxlci4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBUFI6IEFkZCBuZXcgYXByX2dldG9wdF9sb25nIGZ1bmN0aW9uIHRvIGhhbmRsZSBsb25nIG9wdGlvbnMuCiAgICAgW0IuIFcuIEZpdHpwYXRyaWNrIDxmaXR6IHJlZC1iZWFuLmNvbT5dCgogICopIEFQUjogQ2hhbmdlIGFwcl9jb25uZWN0KCkgdG8gdGFrZSBhcHJfc29ja2FkZHJfdCBpbnN0ZWFkIG9mIGhvc3RuYW1lLgogICAgIEFkZCBnZW5lcmljIGFwcl9jcmVhdGVfc29ja2V0KCkuICBBZGQgYXByX2dldGFkZHJpbmZvKCkgZm9yIGRvaW5nCiAgICAgaG9zdG5hbWUgcmVzb2x1dGlvbi9hZGRyZXNzIHN0cmluZyBwYXJzaW5nIGFuZCBidWlsZGluZwogICAgIGFwcl9zb2NrYWRkcl90LiAgQWRkIGFwcl9nZXRfc29ja2FkZHIoKSBmb3IgZ2V0dGluZyB0aGUgYWRkcmVzcwogICAgIG9mIG9uZSBvZiB0aGUgYXByX3NvY2thZGRyX3Qgc3RydWN0dXJlcyBmb3IgYSBzb2NrZXQuICBDaGFuZ2UKICAgICBhcHJfYmluZCgpIHRvIHRha2UgYXByX3NvY2thZGRyX3QuICBbRGF2aWQgUmVpZCBhbmQgSmVmZiBUcmF3aWNrXQoKICAqKSBSZW1vdmUgdGhlIEJVRkYgZnJvbSB0aGUgSFRUUCBwcm94eS4gIFRoaXMgaXMgc3RpbGwgYSBiaXQgdWdseSwgYnV0CiAgICAgSSBoYXZlIHByb3hpZWQgcGFnZXMgd2l0aCBpdCwgY2xlYW51cCB3aWxsIGNvbW1lbmNlIHNvb24uCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgdGhlIHByb3h5IHdvcmsgd2l0aCBmaWx0ZXJzLiAgVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlIHdlCiAgICAgYXJlbid0IGRlYWxpbmcgd2l0aCB0aGUgaGVhZGVycyBwcm9wZXJseS4gIFtSeWFuIEJsb29tXQoKICAqKSBEbyBub3Qgc2VuZCBhIGNvbnRlbnQtbGVuZ3RoIGlmZiB0aGUgQy1MIGlzIDAgYW5kIHRoaXMgaXMgYSBoZWFkCiAgICAgcmVxdWVzdC4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIGNnaS1iaW4gd29yayBhcyBhIHJlZ3VsYXIgZGlyZWN0b3J5IHdoZW4gdXNpbmcgbW9kX3Zob3N0X2FsaWFzCiAgICAgd2l0aCBubyBWaXJ0dWFsU2NyaXB0QWxpYXMgZGlyZWN0aXZlcy4gUFIjNjgyOSBbVG9ueSBGaW5jaF0KCiAgKikgUmVtb3ZlIEJVRkYgZnJvbSB0aGUgUFJPWFkgY29ubmVjdCBoYW5kbGluZy4gW1J5YW4gQmxvb21dCgogICopIEdldCB0aGUgZGVmYXVsdF9oYW5kbGVyIHRvIHN0b3AgdHJ5aW5nIHRvIGRlYWwgd2l0aCBIRUFEIHJlcXVlc3RzLgogICAgIFRoZSBpZGVhIGlzIHRvIGxldCB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIGNvbXB1dGUgdGhlIEMtTCBiZWZvcmUKICAgICB3ZSB0cnkgdG8gc2VuZCB0aGUgZGF0YS4gIElmIHdlIGNhbiBnZXQgdGhlIEMtTCBjb3JyZWN0bHksIHRoZW4gd2UKICAgICBzaG91bGQgc2VuZCBpdCBpbiB0aGUgSEVBRCByZXNwb25zZS4KICAgICBbUnlhbiBCbG9vbV0KICAgICAKICAqKSBUaGUgSGVhZGVyIGZpbHRlciBjYW4gbm93IGRldGVybWluZSBpZiBhIGJvZHkgc2hvdWxkIGJlIHNlbnQgYmFzZWQKICAgICBvbiByLT5oZWFkZXJfb25seS4gIFRoZSBnZW5lcmFsIGlkZWEgb2YgdGhpcyBpcyB0aGF0IGlmIHdlIGRlbGF5CiAgICAgZGVjaWRpbmcgdG8gc2VuZCB0aGUgYm9keSwgdGhlbiB3ZSBtaWdodCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlCiAgICAgY29udGVudC1sZW5ndGggY29ycmVjdGx5LCB3aGljaCB3aWxsIGhlbHAgY2FjaGluZyBwcm94aWVzIHRvIGNhY2hlCiAgICAgb3VyIGRhdGEgYmV0dGVyLiAgQW55IGhhbmRsZXIgdGhhdCBkb2Vzbid0IHdhbnQgdG8gdHJ5IHRvIGNvbXB1dGUKICAgICB0aGUgY29udGVudC1sZW5ndGggY2FuIGp1c3Qgc2VuZCBhbiBFT1MgYnVja2V0IHdpdGhvdXQgZGF0YSBhbmQKICAgICBldmVyeXRoaW5nIHdpbGwganVzdCB3b3JrLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgdGhlIHJlZmVyZXIgdG8gdGhlIGVycm9yIGxvZyBpZiBvbmUgaXMgYXZhaWxhYmxlLgogICAgIFtNYXJrdXMgR3lnZXIgPG1neWdlciBpdHIuY2g+XQoKICAqKSBNb2RfaW5mby5jIGhhcyBub3cgYmVlbiBwb3J0ZWQgdG8gQXBhY2hlIDIuMC4gIEFzIGEgcGFydCBvZiB0aGlzCiAgICAgY2hhbmdlLCB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGhhcyBiZWVuIGV4cG9zZWQgdG8gbW9kdWxlcwogICAgIGFzIGFwX2NvbmZ0cmVlLgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBHZXQgdGhlIGNvcmVfb3V0cHV0X2ZpbHRlciB0byB1c2UgdGhlIGJ1Y2tldCBpbnRlcmZhY2UgZGlyZWN0bHkuCiAgICAgVGhpcyBrZWVwcyB1cyBmcm9tIGNhbGxpbmcgdGhlIGNvbnRlbnQtbGVuZ3RoIGZpbHRlciBtdWx0aXBsZSB0aW1lcwogICAgIGZvciBhIHNpbXBsZSBzdGF0aWMgcmVxdWVzdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgV2UgYXJlIHNlbmRpbmcgdGhlIGNvbnRlbnQtdHlwZSBjb3JyZWN0bHkgbm93LgogICAgIFtSeWFuIEJsb29tIGFuZCBXaWxsIFJvd2VdCgogICopIEFQUiBvbiBGcmVlQlNEOiBGaXggYSBidWcgaW4gYXByX3NlbmRmaWxlKCkgd2hpY2ggY2F1c2VkIHVzIHRvIHJlcG9ydAogICAgIGEgYm9ndXMgYnl0ZXMtc2VudCB2YWx1ZSB3aGVuIHRoZSBvbmx5IHRoaW5nIGJlaW5nIHNlbnQgd2FzIHRyYWlsZXJzCiAgICAgYW5kIHdyaXRldigpIHJldHVybmVkIGFuIGVycm9yIChvciBFQUdBSU4pLiAgW0plZmYgVHJhd2lja10KCiAgKikgR2V0IFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVCB3b3JraW5nIGFnYWluLiAgVGhpcyB1c2VzIHRoZQogICAgIGhpbnRzIGZpbGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHBsYXRmb3JtcyBkZWZpbmUgCiAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBULgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUFI6IGFkZCBhcHJfZ2V0X2hvbWVfZGlyZWN0b3J5KCkgIFtKZWZmIFRyYXdpY2tdCgogICopIEluaXRpYWwgaW1wb3J0IG9mIDEuMy1jdXJyZW50IG1vZF9wcm94eS4gW0NodWNrIE11cmNrb10KCiAgKikgTm90IGFsbCBwbGF0Zm9ybXMgaGF2ZSBJTkFERFJfTk9ORSBkZWZpbmVkIGJ5IGRlZmF1bHQuICBBcGFjaGUKICAgICB1c2VkIHRvIG1ha2UgdGhpcyBjaGVjayBhbmQgZGVmaW5lIElOQUREUl9OT05FIGlmIGFwcHJvcHJpYXRlLAogICAgIGJ1dCBBUFIgbmVlZHMgdGhlIGNoZWNrIHRvbywgYW5kIEkgc3VzcGVjdCBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbAogICAgIGFzIHdlbGwuICBBUFIgbm93IGRlZmluZXMgQVBSX0lOQUREUl9OT05FLCB3aGljaCBpcyBhbHdheXMgYSB2YWxpZAogICAgIHZhbHVlIG9uIGFsbCBwbGF0Zm9ybXMuCiAgICAgW0JyYW5rbyDIaWJlaiA8YnJhbmUgeGJjLm51Pl0KCiAgKikgRGVzdHJveSB0aGUgcHRocmVhZCBtdXRleCBpbiBsb2NrX2ludHJhX2NsZWFudXAoKSBmb3IgUFIjNjgyNC4KICAgICBbU2h1aWNoaSBLaXRhZ3VjaGkgPGtpIGhoLmlpajR1Lm9yLmpwPl0gCgogICopIFJlbGF4IHRoZSBzeW50YXggY2hlY2tpbmcgb2YgSG9zdDogaGVhZGVycyBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgaUROUy4gUFIjNjYzNSBbVG9ueSBGaW5jaF0KCiAgKikgV2hlbiByZWFkaW5nIGZyb20gZmlsZSBidWNrZXRzIHdlIGNvbnZlcnQgdG8gYW4gTU1BUCBpZiBpdCBtYWtlcwogICAgIHNlbnNlLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGRlZmF1bHQgaGFuZGxlciBiZWNhdXNlIHRoZQogICAgIGRlZmF1bHQgaGFuZGxlciBubyBsb25nZXIgbmVlZHMgdG8gdHJ5IHRvIGNyZWF0ZSBNTUFQcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQlVGRiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1haW4gc2VydmVyLiAgVGhlIEJVRkYgY29kZSB3aWxsIHJlbWFpbgogICAgIGluIHRoZSBjb2RlIHVudGlsIGl0IGhhcyBiZWVuIHB1cmdlZCBmcm9tIHRoZSBwcm94eSBtb2R1bGUgYXMgd2VsbC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQnl0ZXJhbmdlcyBoYXZlIGJlZW4gY29tcGxldGVseSByZS13cml0dGVuIHRvIGJlIGEgZmlsdGVyLiAgVGhpcwogICAgIGhhcyBiZWVuIHRlc3RlZCwgYW5kIEkgYmVsaWV2ZSBpdCBpcyB3b3JraW5nIGNvcnJlY3RseSwgYnV0IGl0IGNvdWxkCiAgICAgZG9lc24ndCB3b3JrIGZvciB0aGUgQWRvYmUgQWNyb2JhdCBwbHVnLWluLiAgVGhlIG91dHB1dCBhbG1vc3QgbWF0Y2hlcwogICAgIHRoZSBvdXRwdXQgZnJvbSAxLjMsIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmVpbmcgdGhhdCAxLjMgaW5jbHVkZXMKICAgICBhIGNvbnRlbnQtbGVuZ3RoIGluIHRoZSByZXNwb25zZSwgYW5kIHRoaXMgZG9lcyBub3QuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFQUiByZWFkL3dyaXRlIGZ1bmN0aW9ucyBhbmQgYnVja2V0IHJlYWQgZnVuY3Rpb25zIG5vdyBvcGVyYXRlCiAgICAgb24gdW5zaWduZWQgaW50ZWdlcnMsIGluc3RlYWQgb2Ygc2lnbmVkIG9uZXMuICBJdCBkb2Vzbid0IG1ha2UKICAgICBhbnkgc2Vuc2UgdG8gdXNlIHNpZ25lZCBpbnRzLCBiZWNhdXNlIHdlIHJldHVybiB0aGUgZXJyb3IgY29kZXMsCiAgICAgc28gaWYgd2UgaGF2ZSBhbiBlcnJvciB3ZSBzaG91bGQgcmVwb3J0IDAgYnl0ZXMgcmVhZCBvciB3cml0dGVuLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbHdheXMgY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGgsIHdoZXRoZXIgaXQgaXMgc2VudCBvciBub3QuCiAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcywgaXMgdGhhdCBpdCBhbGxvd3MgdXMgdG8gY29ycmVjdGx5IHJlcG9ydAogICAgIHRoZSBieXRlc19zZW50IHdoZW4gbG9nZ2luZyB0aGUgcmVxdWVzdC4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzCiAgICAgY29udGVudC1sZW5ndGggZmlsdGVyIGEgYml0LCBhbmQgZml4ZXMgdGhlIGFjdHVhbCBieXRlLXJlcG9yaW5nCiAgICAgY29kZSBpbiBtb2RfbG9nX2NvbmZpZy5jCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbW92ZSBBUF9FTkRfT0ZfQlJJR0FERSBkZWZpbml0aW9uLiAgVGhpcyBkb2VzIG5vdCBzaWduaWZ5IHdoYXQKICAgICBpdCBzYXlzLCBiZWNhdXNlIGl0IHdhcyBvbmx5IHVzZWQgYnkgRU9TIGFuZCBGTFVTSCBidWNrZXRzLiAgU2luY2UKICAgICBuZWl0aGVyIG9mIHRob3NlIGFyZSByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIGEgYnJpZ2FkZSwgdGhpcyB3YXMKICAgICByZWFsbHkgc2lnbmlmeWluZyBGTFVTSF9USEVfREFUQSwgYnV0IHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmV0dGVyCiAgICAgYnkgY2hlY2tpbmcgQVBfQlVDS0VUX0lTX0VPUygpIG9yIEFQX0JVQ0tFVF9JU19GTFVTSC4gIEVPUyBhbmQgRkxVU0gKICAgICBidWNrZXRzIG5vdyByZXR1cm4gYSBsZW5ndGggb2YgMCwgd2hpY2ggaXMgYWN0dWFsbHkgdGhlIGFtb3VudCBvZiBkYXRhCiAgICAgcmVhZCwgc28gdGhleSBtYWtlIG1vcmUgc2Vuc2UuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IHRoZSBjb3JlX291dHB1dF9maWx0ZXIgdG8gc2F2ZSBzb21lIGRhdGEgcGFzdCB0aGUgZW5kIG9mIGEKICAgICByZXF1ZXN0LiAgSWYgd2UgZ2V0IGFuIEVPUyBidWNrZXQsIHdlIG9ubHkgc2VuZCB0aGUgZGF0YSBpZiBpdCAKICAgICBtYWtlcyBzZW5zZSB0byBzZW5kIGl0LiAgVGhpcyBhbGxvd3MgdXMgdG8gcGlwZWxpbmUgcmVxdWVzdAogICAgIHJlc3BvbnNlcy4gIEFzIGEgcGFydCBvZiB0aGlzLCB3ZSBhbHNvIG5lZWQgdG8gYWxsb2NhdGUgbW1hcAogICAgIGJ1Y2tldHMgb3V0IG9mIHRoZSBjb25uZWN0aW9uIHBvb2wsIG5vdCB0aGUgcmVxdWVzdCBwb29sLiAgVGhpcwogICAgIGFsbG93cyB0aGUgbW1hcCB0byBvdXRsaXZlIHRoZSByZXF1ZXN0LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgYnVja2V0IHJlYWRzIHdvcmsgY29ycmVjdGx5IGZvcgogICAgIHNvY2tldHMgYW5kIHBpcGVzLiAgVGhlc2UgYXJlIHRoZSBvbmx5IGJ1Y2tldCB0eXBlcyB0aGF0IHNob3VsZAogICAgIGhhdmUgbm9uLWJsb2NraW5nIHJlYWRzLCBiZWNhdXNlIHRoZSBvdGhlciBidWNrZXQgdHlwZXMgc2hvdWxkCiAgICAgQUxXQVlTIGJlIGFibGUgdG8gcmV0dXJuIHNvbWV0aGluZyBpbW1lZGlhdGVseS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgSW4gdGhlIEFwYWNoZS9XaW4zMiBjb25zb2xlIHdpbmRvdywgYWNjZXB0IEN0cmwrQyB0byBzdG9wIHRoZSAKICAgICBzZXJ2ZXIsIGJ1dCB1c2UgQ3RybCtCcmVhayB0byBpbml0aWF0ZSBhIGdyYWNlZnVsIHJlc3RhcnQgCiAgICAgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBiZWhhdmlvci4gW0pvaG4gU3RlcmxpbmddCgogICopIFBhdGNoIG1vZF9hdXRvaW5kZXggdG8gc2V0IHRoZSBMYXN0LU1vZGlmaWVkIGhlYWRlciBiYXNlZCBvbgogICAgIHRoZSBkaXJlY3RvcnkncyBtdGltZSwgYW5kIGFkZCB0aGUgRVRhZyBoZWFkZXIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNZXJnZSB0aGUgMS4zIHBhdGNoIHRvIGFkZCBzdXBwb3J0IGZvciBsb2dnaW5nIHF1ZXJ5IHN0cmluZyBpbiAKICAgICBzdWNoIGEgd2F5IHRoYXQgIiVtICVVJXEgJUgiIGlzIHRoZSBzYW1lIGFzICIlciIuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFBvcnQgdGhyZWUgbG9nIG1ldGhvZHMgZnJvbSBtb2RfbG9nX2NvbmZpZyAxLjMgdG8gMi4wOiAKICAgICBDTEYgY29tcGxpYW50ICctJyBieXRlIGNvdW50LCBtZXRob2QgYW5kIHByb3RvY29sLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYSBuZXcgTG9nRm9ybWF0IGRpcmVjdGl2ZSwgJWMsIHRoYXQgd2lsbCBsb2cgY29ubmVjdGlvbgogICAgIHN0YXR1cyBhdCB0aGUgZW5kIG9mIHRoZSByZXNwb25zZSBhcyBmb2xsb3dzOgogICAgICdYJyAtIGNvbm5lY3Rpb24gYWJvcnRlZCBiZWZvcmUgdGhlIHJlc3BvbnNlIGNvbXBsZXRlZC4KICAgICAnKycgLSBjb25uZWN0aW9uIG1heSBiZSBrZXB0LWFsaXZlIGJ5IHRoZSBzZXJ2ZXIuCiAgICAgJy0nIC0gY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBieSB0aGUgc2VydmVyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBFeHBhbmQgQVBSIGZvciBXaW5OVCB0byBmdWxseSBhY2NlcHQgYW5kIHJldHVybiB1dGYtOCBlbmNvZGVkCiAgICAgVW5pY29kZSBmaWxlIG5hbWVzIGFuZCBwYXRocyBmb3IgV2luMzIsIGFuZCB0YWcgdGhlIENvbnRlbnQtVHlwZSAKICAgICBmcm9tIG1vZF9hdXRvaW5kZXggdG8gcmVmbGVjdCB0aGF0IGNoYXJzZXQgaWYgdGhlIGZlYXR1cmUKICAgICBtYWNybyBBUFJfSEFTX1VOSUNPREVfRlMgaXMgdHJ1ZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIENvbXB1dGUgdGhlIGNvbnRlbnQgbGVuZ3RoIChhbmQgYWRkIGFwcHJvcHJpYXRlIGhlYWRlciBmaWVsZCkgZm9yCiAgICAgdGhlIHJlc3BvbnNlIHdoZW4gbm8gY29udGVudCBsZW5ndGggaXMgYXZhaWxhYmxlIGFuZCB3ZSBjYW4ndCB1c2UgCiAgICAgY2h1bmtlZCBlbmNvZGluZy4gIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZWQgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkoKSB0byB1c2UgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTkssCiAgICAgc28gdGhhdCBjb250ZW50IGlucHV0IGZpbHRlcnMgZ2V0IGRlY2h1bmtlZCBkYXRhIHdoZW4gdXNpbmcKICAgICB0aGUgZGVmYXVsdCBoYW5kbGVyLiBBbHNvIHJlbW92ZWQgUkVRVUVTVF9DSFVOS0VEX1BBU1MuCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KICAgICAKICAqKSBBZGQgbW9kX2V4dF9maWx0ZXIgYXMgYW4gZXhwZXJpbWVudGFsIG1vZHVsZS4gIFRoaXMgbW9kdWxlIGFsbG93cwogICAgIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHVzZSBleHRlcm5hbCBwcm9ncmFtcyBhcyBmaWx0ZXJzLiAgQ3VycmVudGx5LAogICAgIG9ubHkgZmlsdGVyaW5nIG9mIG91dHB1dCBpcyBzdXBwb3J0ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3N0IEFwYWNoZSBmdW5jdGlvbnMgd29yayBvbiBFQkNESUMgbWFjaGluZXMgYWdhaW4sIGFzIHByb3RvY29sCiAgICAgZGF0YSBpcyBub3cgdHJhbnNsYXRlZCAoYWdhaW4pLiAgW0plZmYgVHJhd2lja10KCiAgKikgSW50cm9kdWNlIGFwX3hsYXRlX3Byb3RvX3t0b3xmcm9tfV9hc2NpaSgpIHRvIGNsZWFuIHVwIHNvbWUgb2YKICAgICB0aGUgRUJDRElDIHN1cHBvcnQuICBUaGV5IGFyZSBub29wcyBvbiBBU0NJSSBtYWNoaW5lcywgc28gdGhpcwogICAgIHR5cGUgb2YgdHJhbnNsYXRpb24gZG9lc24ndCBoYXZlIHRvIGJlIHN1cnJvdW5kZWQgYnkgI2lmZGVmCiAgICAgQ0hBUlNFVF9FQkNESUMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX2luY2x1ZGUuICB0YWcgY29tbWFuZHMgd29yayBhZ2FpbiwgYW5kIHRoZSBzZXJ2ZXIgd2lsbAogICAgIHNlbmQgdGhlIEZBUSBhZ2Fpbi4gIFRoaXMgYWxzbyBhbGxvd3MgbW9kX2luY2x1ZGUgdG8gc2V0IGFzaWRlCiAgICAgYnVja2V0cyB0aGF0IGluY2x1ZGUgcGFydGlhbCBidWNrZXRzLgogICAgIFtSeWFuIEJsb29tIGFuZCBEYXZpZCBSZWlkXQoKICAqKSBBZGQgc3VleGVjIHN1cHBvcnQgYmFjay4gIFtNYW5vaiBLYXNpY2hhaW51bGFdCgogICopIExpbmdlcmluZyBjbG9zZSBub3cgdXNlcyB0aGUgc29ja2V0IGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcKICAgICBCVUZGLiAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBzaW5jZSBhbGwgd2UgY2FuIHRlbGwgaXMgdGhhdCBpdAogICAgIGRvZXNuJ3QgZmFpbCwgdGhpcyBuZWVkcyB0byBiZSByZWFsbHkgaGFja2VkIG9uLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBmaWx0ZXJzIHRvIG1vZGlmeSBoZWFkZXJzIGFuZCBoYXZlIHRob3NlIGhlYWRlcnMgYmUgc2VudCB0bwogICAgIHRoZSBjbGllbnQuICBUaGUgaWRlYSBpcyB0aGF0IHdlIGhhdmUgYW4gaHR0cF9oZWFkZXIgZmlsdGVyIHRoYXQKICAgICBhY3R1YWxseSBzZW5kcyB0aGUgaGVhZGVycyB0byB0aGUgbmV0d29yay4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZAogICAgIGZvciB0aGUgQlVGRiB0byBzZW5kIGhlYWRlcnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIENoYXJzZXQgdHJhbnNsYXRpb246IG1vZF9jaGFyc2V0X2xpdGUgaGFuZGxlcyB0cmFuc2xhdGlvbiBvZgogICAgIHJlcXVlc3QgYm9kaWVzLiAgR2V0IHJpZCBvZiB0aGUgeGxhdGUgdmVyc2lvbiBvZiBhcF9tZDVfZGlnZXN0KCkKICAgICBzaW5jZSB3ZSBkb24ndCBjb21wdXRlIGRpZ2VzdHMgb2YgZmlsdGVyZWQgKGUuZy4sIHRyYW5zbGF0ZWQpIAogICAgIHJlc3BvbnNlIGJvZGllcyB0aGlzIHdheSBhbnltb3JlLiAgKE5vdGUgdGhhdCB3ZSBkb24ndCBkbyBpdCBhdAogICAgIGFsbCBhdCB0aGUgcHJlc2VudDsgc29tZWJvZHkgbmVlZHMgdG8gd3JpdGUgYSBmaWx0ZXIgdG8gZG8gc28uKQogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIElucHV0IGZpbHRlcnMgYW5kIGFwX2dldF9icmlnYWRlKCkgbm93IGhhdmUgYSBpbnB1dCBtb2RlIHBhcmFtZXRlciAKICAgICAoYmxvY2tpbmcsIG5vbi1ibG9ja2luZywgcGVlaykgaW5zdGVhZCBvZiBhIGxlbmd0aCBwYXJhbWV0ZXIuCiAgICAgW2hhY2thdGhvbl0KCiAgKikgVXBkYXRlIHRoZSBtaW1lLnR5cGVzIGZpbGUgdG8gdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdHlwZXMgYXMKICAgICBvZiAyMDAwLTEwLTE5LiBQUiM2NjEzIFtDYXJzdGVuIEtsYXBwIDxjYXJzdGVuLmtsYXBwIGhvbWUubmV0PiwKICAgICBUb255IEZpbmNoXQoKICAqKSBOYW1lc3BhY2UgcHJvdGVjdCBzb21lIG1hY3JvcyBkZWNsYXJlZCBpbiBhcF9jb25maWcuaAogICAgIFtSeWFuIEJsb29tXQoKICAqKSBTdXBwb3J0IEhUVFAgaGVhZGVyIGxpbmUgZm9sZGluZyB3aXRoIGlucHV0IGZpbHRlcmluZy4KICAgICBbR3JlZyBBbWVzXQoKICAqKSBNb2RfaW5jbHVkZSB3b3JrcyBhZ2Fpbi4gIFRoaXMgc2hvdWxkIHN0aWxsIGJlIHJlLXdyaXR0ZW4sIGJ1dCBhdAogICAgIGxlYXN0IG5vdyB3ZSBjYW4gc2VydmUgYW4gU0hUTUwgcGFnZSBhZ2Fpbi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQmVnaW4gdG8gcmVtb3ZlIEJVRkYgZnJvbSB0aGUgY29yZS4gIEN1cnJlbnRseSwgd2Uga2VlcCBhIHBvaW50ZXIKICAgICB0byBib3RoIHRoZSBCVUZGIGFuZCB0aGUgc29ja2V0IGluIHRoZSBjb25uX3JlYy4gIEZ1bmN0aW9ucyB0aGF0CiAgICAgd2FudCB0byB1c2UgdGhlIEJVRkYgY2FuLCBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIHVzZSB0aGUgc29ja2V0LAogICAgIGNhbi4gIFRoZXkgcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2UuCiAgICAgW1J5YW4gQmxvb21dCgogICopIGFwcl9wc3ByaW50ZiBkb2Vzbid0IHVuZGVyc3RhbmQgJWxsZCBhcyBhIGZvcm1hdC4gIE1ha2UgaXQgJWxkLgogICAgIFtUb21hcyAi1mdyZW4iIDxzdHJpYyBpbmcudW11LnNlPl0KCiAgKikgQVBSIHBpcGVzIG9uIFVuaXggYW5kIFdpbjMyIGFyZSBub3cgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIAogICAgIGFzc29jaWF0ZWQgcG9vbCBnb2VzIGF3YXkuICAoQVBSIHBpcGVzIG9uIE9TLzIgd2VyZSBhbHJlYWR5IGhhZCB0aGlzCiAgICAgbG9naWMuKSAgVGhpcyByZXNvbHZzIGEgZmF0YWwgZmlsZSBkZXNjcmlwdG9yIGxlYWsgd2l0aCBDR0lzLiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgVGhlIGZpbmFsIGxpbmUgb2YgdGhlIGNvbmZpZyBmaWxlIHdhcyBub3QgYmVpbmcgcmVhZCBpZiB0aGVyZSB3YXMKICAgICBubyBcbiBhdCB0aGUgZW5kIG9mIGl0LiAgVGhpcyB3YXMgY2F1c2VkIGJ5IGFwcl9mZ2V0cyByZXR1cm5pbmcgCiAgICAgQVBSX0VPRiBldmVuIHRob3VnaCB3ZSBoYWQgcmVhZCB2YWxpZCBkYXRhLiAgVGhpcyBpcyBzb2x2ZWQgYnkKICAgICBtYWtpbmcgY2ZnX2dldGxpbmUgY2hlY2sgdGhlIGJ1ZmYgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBhcHJfZmdldHMuCiAgICAgSWYgYXByX2ZnZXRzIHJldHVybiBBUFJfRU9GLCBidXQgdGhlcmUgd2FzIGRhdGEgaW4gdGhlIGJ1ZiwgdGhlbiB3ZQogICAgIHJldHVybiB0aGUgYnVmLCBvdGhlcndpc2Ugd2UgcmV0dXJuIE5VTEwuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFBpcGVkIGxvZ3Mgd29yayBhZ2FpbiBpbiB0aGUgMi4wIHNlcmllcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVzdG9yZSBmdW5jdGlvbmFsaXR5IGJyb2tlbiBieSB0aGUgbW9kX3Jld3JpdGUgc2VjdXJpdHkgZml4OgogICAgIHJld3JpdGUgbWFwIGxvb2t1cCBrZXlzIGFuZCBkZWZhdWx0IHZhbHVlcyBhcmUgbm93IGV4cGFuZGVkCiAgICAgc28gdGhhdCB0aGUgbG9va3VwIGNhbiBkZXBlbmQgb24gdGhlIHJlcXVlc3RlZCBVUkkgZXRjLgogICAgIFBSICM2NjcxIFtUb255IEZpbmNoXQoKICAqKSBTRUNVUklUWTogVGlnaHRlbiB1cCB0aGUgc3ludGF4IGNoZWNraW5nIG9mIEhvc3Q6IGhlYWRlcnMgdG8gZml4IGEKICAgICBzZWN1cml0eSBidWcgaW4gc29tZSBtYXNzIHZpcnR1YWwgaG9zdGluZyBjb25maWd1cmF0aW9ucwogICAgIHRoYXQgY2FuIGFsbG93IGEgcmVtb3RlIGF0dGFja2VyIHRvIHJldHJpZXZlIHNvbWUgZmlsZXMKICAgICBvbiB0aGUgc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGluYWNjZXNzaWJsZS4gW1RvbnkgRmluY2hdCgogICopIEFkZCBhIHBvb2wgYnVja2V0IHR5cGUuICBUaGlzIGJ1Y2tldCBpcyB1c2VkIGZvciBkYXRhIGFsbG9jYXRlZCBvdXQKICAgICBvZiBhIHBvb2wuICBJZiB0aGUgcG9vbCBpcyBjbGVhbmVkIGJlZm9yZSB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgdGhlbgogICAgIHRoZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIGhlYXAgYnVja2V0LCBhbGxvd2luZyBpdCB0byBzdXJ2aXZlIHRoZQogICAgIGRlYXRoIG9mIHRoZSBwb29sLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgYSBmbHVzaCBidWNrZXQuICBUaGlzIGFsbG93cyBtb2R1bGVzIHRvIHNpZ25hbCB0aGF0IHRoZSBmaWx0ZXJzCiAgICAgc2hvdWxkIGFsbCBmbHVzaCB3aGF0ZXZlciBkYXRhIHRoZXkgY3VycmVudGx5IGhhdmUuICBUaGVyZSBpcyBubyB3YXkKICAgICB0byBhY3R1YWxseSBmb3JjZSB0aGVtIHRvIGRvIHRoaXMsIHNvIGlmIGEgZmlsdGVyIGlnbm9yZXMgdGhpcyBidWNrZXQsCiAgICAgdGhhdCdzIGxpZmUsIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gdHJ5IHdpdGggdGhpcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGFuIG91dHB1dCBmaWx0ZXIgZm9yIHN1Yi1yZXF1ZXN0cy4gIFRoaXMgZmlsdGVyIGp1c3Qgc3RyaXBzIHRoZQogICAgIEVPUyBidWNrZXQgc28gdGhhdCB3ZSBkb24ndCBjb25mdXNlIHRoZSBtYWluIHJlcXVlc3QncyBjb3JlIG91dHB1dAogICAgIGZpbHRlciBieSBzZW5kaW5nIG11bHRpcGxlIEVPUyBidWNrZXRzLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBzdWIKICAgICByZXF1ZXN0cyBzdGFydCB0byBzZW5kIEVPUyBidWNrZXRzIHdoZW4gdGhleSBhcmUgZmluaXNoZWQuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgYXBfYnVja2V0XyhyZWFkfGRlc3Ryb3l8c3BsaXR8c2V0YXNpZGUpIGludG8gbWFjcm9zLiAgQWxzbwogICAgIG1ha2VzIGFwX2J1Y2tldF9kZXN0cm95IGEgcmV0dXJuIHZvaWQsIHdoaWNoIGlzIG9rYXkgYmVjYXVzZSBpdAogICAgIHVzZWQgdG8gYWx3YXlzIHJldHVybiBBUFJfU1VDQ0VTUywgYW5kIG5vYm9keSBldmVyIGNoZWNrZWQgaXRzCiAgICAgcmV0dXJuIHZhbHVlIGFueXdheS4KICAgICBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIFJlbW92ZSB0aGUgaW5kZXggaW50byB0aGUgYnVja2V0LXR5cGUgdGFibGUgZnJvbSB0aGUgYnVja2V0cwogICAgIHN0cnVjdHVyZS4gIFRoaXMgaGFzIG5vdyBiZWVuIHJlcGxhY2VkIHdpdGggYSBwb2ludGVyIHRvIHRoZQogICAgIGJ1Y2tldF90eXBlLiAgQWxzbyBhZGQgc29tZSBtYWNyb3MgdG8gdGVzdCB0aGUgYnVja2V0LXR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbmFtZWQgYWxsIE1PRFVMRV9FWFBPUlQgc3ltYm9scyB0byBBUF9NT0RVTEVfREVDTEFSRSBhbmQgYWxsIHN5bWJvbHMKICAgICBmb3IgQ09SRV9FWFBPUlQgdG8gQVBfQ09SRV9ERUNMQVJFIChuYW1lc3BhY2UgcHJvdGVjdGluZyB0aGUgd3JhcHBlcikKICAgICBhbmQgcmV0aXRsZWQgQVBJX0VYUE9SVCBhcyBBUF9ERUNMQVJFIGFuZCBBUFJfRVhQT1JUIGFzIEFQUl9ERUNMQVJFLgogICAgIEFsbCBfVkFSXyBmbGF2b3JzIGNoYW5nZXMgdG8gX0RBVEEgdG8gYmUgYWJzb2x1dGVseSBjbGVhci4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgLywgLy8sIC8vc2VydmVybmFtZSBhbmQgLy9zZXJ2ZXIvc2hhcmVuYW1lIAogICAgIHBhcnNpbmcgb2YgPERpcmVjdG9yeT4gYmxvY2tzIHVuZGVyIFdpbjMyIGFuZCBPUzIuCiAgICAgW1RpbSBDb3N0ZWxsbywgV2lsbGlhbSBSb3dlLCBCcmlhbiBIYXJ2YXJkXQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gdGhlIGFwX2J1Y2tldCB0eXBlLiAgVGhleSBoYXZlIGJlZW4KICAgICByZXBsYWNlZCB3aXRoIGEgZ2xvYmFsIHRhYmxlLiAgTW9kdWxlcyBhcmUgYWxsb3dlZCB0byByZWdpc3RlciBidWNrZXQKICAgICB0eXBlcyBhbmQgdXNlIHRoZW4gdXNlIHRob3NlIGJ1Y2tldHMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIG1vZF9jZ2lkOiBJbiB0aGUgaGFuZGxlciwgc2h1dCBkb3duIHRoZSBVbml4IHNvY2tldCAob25seSBmb3Igd3JpdGUpIAogICAgIG9uY2Ugd2UgZmluaXNoIHdyaXRpbmcgdGhlIHJlcXVlc3QgYm9keSB0byB0aGUgY2dpIGNoaWxkIHByb2Nlc3M7IAogICAgIG90aGVyd2lzZSwgdGhlIGNsaWVudCBkb2Vzbid0IGhpdCBFT0Ygb24gc3RkaW4uICBTbWFsbCByZXF1ZXN0IGJvZGllcyAKICAgICB3b3JrZWQgd2l0aG91dCB0aGlzIGNoYW5nZSAoZm9yIHJlYXNvbnMgSSBkb24ndCB1bmRlcnN0YW5kKSwgYnV0IGxhcmdlIAogICAgIG9uZXMgZGlkbid0LiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVtb3ZlIGZpbGUgYnVja2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGFwX2J1Y2tldCB0eXBlLgogICAgIFRoaXMgaGFzIGJlZW4gbW92ZWQgdG8gYSBmaWxlX2J1Y2tldCBzcGVjaWZpYyB0eXBlIHRoYXQgaGFuZ3Mgb2ZmCiAgICAgdGhlIGRhdGEgcG9pbnRlciBpbiB0aGUgYXBfYnVja2V0IHR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIElucHV0IGZpbHRlcmluZyBub3cgaGFzIGEgdGhpcmQgYXJndW1lbnQuICBUaGlzIGlzIHRoZSBhbW91bnQgb2YgZGF0YQogICAgIHRvIHJlYWQgZnJvbSBsb3dlciBmaWx0ZXJzLiAgVGhpcyBhcmd1bWVudCBjYW4gYmUgLTEsIDAsIG9yIGEgcG9zaXRpdmUKICAgICBudW1iZXIuICAtMSBtZWFucyBnaXZlIG1lIGFsbCB0aGUgZGF0YSB5b3UgaGF2ZSwgSSdsbCBkZWFsIHdpdGggaXQgYW5kCiAgICAgbGV0IHlvdSBrbm93IGlmIEkgbmVlZCBtb3JlLiAgMCBtZWFucyBnaXZlIG1lIG9uZSBsaW5lIGFuZCBvbmUgbGluZQogICAgIG9ubHkuICBBIHBvc2l0aXZlIG51bWJlciBtZWFucyBJIHdhbnQgbm8gbW9yZSB0aGFuIHRoaXMgbXVjaCBkYXRhLgoKICAgICBDdXJyZW50bHksIG9ubHkgMCBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgYXJlIGltcGxlbWVudGVkLiAgVGhpcyBhbGxvd3MKICAgICB1cyB0byByZW1vdmUgdGhlIHJlbWFpbmluZyBmaWVsZCBmcm9tIHRoZSBjb25uX3JlYyBzdHJ1Y3R1cmUsIHdoaWNoCiAgICAgaGFzIGFsc28gYmVlbiBkb25lLgogICAgIFtSeWFuIEJsb29tXSAKICAgIAogICopIEJpZyBjbGVhbnVwIG9mIHRoZSBpbnB1dCBmaWx0ZXJpbmcuICBUaGUgZ29hbCBpcyB0aGF0IGh0dHBfZmlsdGVyCiAgICAgdW5kZXJzdGFuZHMgdHdvIGNvbmRpdGlvbnMsIGhlYWRlcnMgYW5kIGJvZHkuICBJdCBrbm93cyB3aGVyZSBpdCBpcwogICAgIGJhc2VkIG9uIGMtPnJlbWFpbmluZy4gIElmIGMtPnJlbWFpbmluZyBpcyAwLCB0aGVuIHdlIGFyZSBpbiBoZWFkZXJzLAogICAgIGFuZCBodHRwX2ZpbHRlciByZXR1cm5zIGEgbGluZSBhdCBhIHRpbWUuICBJZiBpdCBpcyBub3QgMCwgdGhlbiB3ZSBhcmUKICAgICBpbiBib2R5LCBhbmQgaHR0cF9maWx0ZXIgcmV0dXJucyByYXcgZGF0YSwgYnV0IG9ubHkgdXAgdG8gYy0+cmVtYWluaW5nCiAgICAgYnl0ZXMuICBJdCBjYW4gcmV0dXJuIGxlc3MsIGJ1dCBuZXZlciBtb3JlLgogICAgIFtHcmVnIEFtZXMsIFJ5YW4gQmxvb20sIEplZmYgVHJhd2lja10KCiAgKikgbW9kX2NnaTogV3JpdGUgYWxsIG9mIHRoZSByZXF1ZXN0IGJvZHkgdG8gdGhlIGNoaWxkLCBub3QganVzdCB3aGF0CiAgICAgdGhlIGtlcm5lbCB3b3VsZCBhY2NlcHQgb24gdGhlIGZpcnN0IHdyaXRlLiAgW0plZmYgVHJhd2lja10KCiAgKikgQmFjayBvdXQgdGhlIGNoYW5nZSB0aGF0IG1vdmVkIHRoZSBicmlnYWRlIGZyb20gdGhlIGNvcmVfb3V0cHV0X2ZpbHRlcnMKICAgICBjdHggdG8gdGhlIGNvbm5fcmVjLiAgU2luY2UgYWxsIHJlcXVlc3RzIG92ZXIgYSBnaXZlbiBjb25uZWN0aW9uCiAgICAgZ28gdGhyb3VnaCB0aGUgc2FtZSBjb3JlX291dHB1dF9maWx0ZXIsIHRoZSBjdHggcG9pbnRlciBoYXMgdGhlCiAgICAgY29ycmVjdCBsaWZldGltZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGFub3RoZXIgYnVnIGluIHRoZSBzZW5kX3RoZV9maWxlKCkgcmVhZC93cml0ZSBsb29wLiBBIHBhcnRpYWwKICAgICBzZW5kIGJ5IGFwcl9zZW5kIHdvdWxkIGNhdXNlIHVuc2VudCBkYXRhIGluIHRoZSByZWFkIGJ1ZmZlciB0bwogICAgIGdldCBjbG9iYmVyZWQuIENvbXBsZXRlIG1ha2luZyBzZW5kX3RoZV9maWxlIGhhbmRsZSBwYXJ0aWFsCiAgICAgd3JpdGVzIHRvIHRoZSBuZXR3b3JrLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgdHlwZSBmaXhlcyB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBBSVggYWdhaW4KICAgICBbVmljdG9yIEouIE9ybGlrb3dza2kgPHYuai5vcmxpa293c2tpIGd0ZS5uZXQ+XQoKICAqKSBGaXggYnVnIGluIHNlbmRfdGhlX2ZpbGUoKSB3aGljaCBjYXVzZXMgb2Zmc2V0IHRvIGJlIGlnbm9yZWQKICAgICBpZiB0aGVyZSBhcmUgbm8gaGVhZGVycyB0byBzZW5kLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBIYW5kbGUgQVBSX0VOT1RJTVBMIHJldHVybmVkIGZyb20gYXByX3NlbmRmaWxlIGluIHRoZSBjb3JlCiAgICAgZmlsdGVyLiBVc2VmdWwgZm9yIHN1cHBvcnRpbmcgV2luZG93cyA5KiB3aXRoIGEgYmluYXJ5CiAgICAgY29tcGlsZWQgb24gV2luZG93cyBOVC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTcKCiAgKikgUmVpbXBsZW1lbnQgY29yZV9vdXRwdXRfZmlsdGVyIHRvIGJ1ZmZlci9zYXZlIGJ1Y2tldCBicmlnYWRlcwogICAgIGFjcm9zcyBtdWx0aXBsZSBjYWxscyB0byB0aGUgY29yZV9maWx0ZXIuIFRoZSBicmlnYWRlIHdpbGwgYmUKICAgICBzZW50IHdoZW4gZWl0aGVyIE1JTl9CWVRFU19UT19TRU5EIG9yIE1BWF9JT1ZFQ19UT19XUklURQogICAgIHRocmVzaG9sZHMgYXJlIGhpdCBvciB0aGUgRU9TIGJ1Y2tldCBpcyByZWNlaXZlZC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ3JlYXRlIGV4cGVyaW1lbnRhbCBmaWx0ZXIgKGJ1ZmZlcl9maWx0ZXIpIHRoYXQgY29hbGVzY2VzIGJ5dGVzIAogICAgIGludG8gb25lIGxhcmdlIGJ1ZmZlciBiZWZvcmUgaW52b2tpbmcgdGhlIG5leHQgZmlsdGVyIGluIHRoZQogICAgIGNoYWluLiBUaGlzIGZpbHRlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggdGhlIGN1cnJlbnQgCiAgICAgaW1wbGVtZW50YXRpb24gb2YgbW9kX2F1dG9pbmRleCB3aGVuIGl0IGluc2VydGVkIGFib3ZlIHRoZQogICAgIGNodW5rX2ZpbHRlci4gbW9kX2F1dG9pbmRleCBnZW5lcmF0ZXMgYSBsb3Qgb2YgYnJpZ2FkZXMgdGhhdAogICAgIGNvbnRhaW5pbmcgYnVja2V0cyBob2xkaW5nIGp1c3QgYSBmZXcgYnl0ZXMgZWFjaC4gVGhlCiAgICAgYnVmZmVyX2ZpbHRlciBjb2FsZXNjZXMgdGhlc2UgYnVja2V0cyBpbnRvIGEgc2luZ2xlIGxhcmdlIGJ1Y2tldC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIGFwcl9zZW5kZmlsZSgpIHN1cHBvcnQgaW50byB0aGUgY29yZV9vdXRwdXRfZmlsdGVyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYXByX3NlbmR2KCkgc3VwcG9ydCBpbnRvIHRoZSBjb3JlX291dHB1dF9maWx0ZXIuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBtb2RfbG9nX2NvbmZpZyBzbyB0aGF0IGl0IGNvbXBpbGVzIGNsZWFubHkgd2l0aCBCVUZGRVJFRF9MT0dTCiAgICAgW01pa2UgQWJib3R0IDxtamEgc2dpLmNvbT5dCgogICopIFJlbW92ZSBhcF9zZW5kX2ZiLiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZCBpbiBBcGFjaGUsIGFuZCBpdCBkb2Vzbid0CiAgICAgbWFrZSBtdWNoIHNlbnNlLCBiZWNhdXNlIEFwYWNoZSB1c2VzIGJ1Y2tldHMgaW5zdGVhZCBvZiBCVUZGcyBub3cuCiAgICAgW1J5YW4gQmxvb21dCgogICopIHNlbmRfdGhlX2ZpbGUgbm93IGZhbGxzIGJhY2sgdG8gYSByZWFkL3dyaXRlIGxvb3Agb24gcGxhdGZvcm1zIHRoYXQKICAgICBkbyBub3QgaGF2ZSBzZW5kZmlsZS4KICAgICBbUnlhbiBCbG9vbSBhbmQgQnJpYW4gSGF2YXJkXQoKICAqKSBJbnN0YWxsIGFwYWNoZWN0bCBjb3JyZWN0bHksIGFuZCBzdWJzdGl0dXRlIHRoZSBwcm9wZXIgdmFsdWVzIHNvCiAgICAgdGhhdCBpdCB3b3JrcyBhZ2Fpbi4gIFtSeWFuIEJsb29tXQoKICAqKSBCZXR0ZXIoPz8pIGhhbmRsZSBwbGF0Zm9ybXMgdGhhdCBsYWNrIHNlbmRmaWxlKCkuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIEFQUiBub3cgaGFzIFVVSUQgZ2VuZXJhdGlvbi9mb3JtYXR0aW5nL3BhcnNpbmcgc3VwcG9ydC4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgQmVnaW4gdGhlIGh0dHBfZmlsdGVyLiAgVGhpcyBpcyBhbiBpbnB1dCBmaWx0ZXIgdGhhdCB1bmRlcnN0YW5kcwogICAgIHRoZSBhYnNvbHV0ZSBiYXNpYyBhbW91bnQgcmVxdWlyZWQgdG8gcGFyc2UgYW4gSFRUUCBSZXF1ZXN0LiAgVGhlCiAgICAgZ29hbCBpcyB0byBiZSBhYmxlIHRvIHNwbGl0IGhlYWRlcnMgZnJvbSByZXF1ZXN0IGJvZHkgYmVmb3JlIHBhc3NpbmcKICAgICB0aGUgZGF0YSBiYWNrIHRvIHRoZSBvdGhlciBmaWx0ZXJzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBCcmluZyBmb3J3YXJkIGZyb20gMS4zLjEzIHRoZSBjb25maWcgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIGluc3RhbGwgYXB4cyBpZiBpdCBpcyBjcmVhdGVkCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZGVkIEFQUl9JU19TVEFUVVNfY29uZGl0aW9uIHRlc3QgbWFjcm9zIHRvIGVsaW1pbmF0ZSBjYW5vbmljYWwgZXJyb3IKICAgICBjb252ZXJzaW9ucy4gIFtXaWxsaWFtIFJvd2VdCgogICopIE5vdyB0aGF0IHdlIGhhdmUgYXBfYWRkX2lucHV0X2ZpbHRlcigpLCByZW5hbWUgYXBfYWRkX2ZpbHRlcigpIHRvIAogICAgIGFwX2FkZF9vdXRwdXRfZmlsdGVyKCkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNdWx0aXBsZSBidWlsZCBhbmQgY29uZmlndXJhdGlvbiBmaXhlcwogICAgQnVpbGQgcHJvY2VzczoKCiAgICAgIC1hZGQgZGF0YWRpciBhbmQgbG9jYWxzdGF0ZWRpciBzdWJzdGl0dXRpb25zCiAgICAgIC1maXggbGF5b3V0IG5hbWUKICAgICAgLWZpeCBsb2dmaWxlbmFtZSBtaXNzcGVsbGluZwogICAgICAtZml4IGV2YWx1YXRpb24gb2YgaW5zdGFsbGF0aW9uIGRpciB2YXJpYWJsZXMgYW5kCiAgICAgIC1yZXBsYWNlICRmb29iYXIgYnkgJChmb29iYXIpIHRvIGJlIHVzZWZ1bGwgaW4gdGhlIG1ha2VmaWxlCiAgICAKICAgIENyb3NzIGNvbXBpbGU6CiAgICAKICAgICAgLWFkZCBydWxlcyBmb3IgY3Jvc3MtY29tcGlsaW5nIGluIHJ1bGVzLm1rLiBPa2F5LCBydWxlIHRvIGNoZWNrIGZvcgogICAgICAgJENDX0ZPUl9CVUlMRCBpcyBzdGlsbCBtaXNzaW5nCiAgICAgIC11c2UgQ0hFQ0tfVE9PTCBpbnN0ZWFkIG9mIENIRUNLX1BST0cgZm9yIHJhbmxpYgogICAgICAtYWRkIG1pc3NpbmcgIkFSPUBBUkAiIHRvIHNldmVyYWx5IE1ha2VmaWxlLmluJ3MKICAgICAgLWNhY2hlIHJlc3VsdCBmb3IgInN0cnVjdCBybGltaXQiCiAgICAgIC1jb21waWxlIGFsbCBoZWxwZXIgcHJvZ3JhbXMgd2l0aCBuYXRpdmUgYW5kIGNyb3NzIGNvbXBpbGVyCiAgICAgICBhbmQgdXNlIHRoZSBuYXRpdmUgdmVyc2lvbiB0byBnZW5lcmF0ZSBoZWFkZXIgZmlsZQogICAgIFsiUvxkaWdlciIgS3VobG1hbm4gPFRhZHUgZ214LmRlPl0KCiAgKikgUHJlcGFyZSBvdXIgYXV0b2NvbmYgc2V0dXAgZm9yIGF1dG9jb25mIDIuMTRhIGFuZCBmb3IgY3Jvc3MtCiAgICAgY29tcGlsaW5nLgogICAgIFsiUvxkaWdlciIgS3VobG1hbm4gPFRhZHUgZ214LmRlPl0KCiAgKikgRml4IGEgYnVnIHdoZXJlIGEgY2xpZW50IHdoaWNoIG9ubHkgc2VuZHMgXG4gdG8gZGVsaW1pdCBoZWFkZXIKICAgICBsaW5lcyAobmV0Y2F0KSBnZXRzIGEgc3RyYW5nZSBsb29raW5nIEhUVFBfTk9UX0lNUExFTUVOVEVEIAogICAgIG1lc3NhZ2UuICBTdGFydCB3b3JraW5nIG9uIGViY2RpYyBjby1leGlzdGFuY2Ugd2l0aCBpbnB1dCAKICAgICBmaWx0ZXJpbmcuCiAgICAgW1dpbGxpYW0gUm93ZSwgR3JlZyBBbWVzXQoKICAqKSBJZiBtb2Rfc28gaXMgZW5hYmxlZCBpbiB0aGUgc2VydmVyIGFsd2F5cyBjcmVhdGUgbGliZXhlYywgZXZlbgogICAgIGlmIHRoZXJlIGFyZSBubyBtb2R1bGVzIGluc3RhbGxlZCBpbiB0aGlzIGRpcmVjdG9yeS4gIFRoaXMgaXMgYQogICAgIHJlcXVpcmVtZW50IGZvciBBUFhTIHRvIHdvcmsgY29ycmVjdGx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBDb25uZWN0aW9uIG9yaWVudGVkIG91dHB1dCBmaWx0ZXJzIGFyZSBub3cgc3RvcmVkIGluIHRoZSAKICAgICBjb25uX3JlYyBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0X3JlYy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCB0aGUKICAgICBvdXRwdXQgZmlsdGVyIGluIHRoZSBwcmUtY29ubmVjdGlvbiBwaGFzZSBpbnN0ZWFkIG9mIHRoZQogICAgIHBvc3RfcmVhZF9yZXF1ZXN0IHBoYXNlLCB3aGljaCBrZWVwcyB1cyBmcm9tIHRyeWluZyB0byB3cml0ZSBhbgogICAgIGVycm9yIHBhZ2UgYmVmb3JlIHdlIGhhdmUgYSBmaWx0ZXIgdG8gd3JpdGUgdG8gdGhlIG5ldHdvcmsuCiAgICAgW1J5YW4gQmxvb20sIEplZmYgVHJhd2ljaywgYW5kIEdyZWcgQW1lc10KCiAgKikgQ2xlYW5pbmcgdXAgYW4gbW1hcCBidWNrZXQgbm8gbG9uZ2VyIGRlbGV0ZXMgdGhlIG1tYXAuICBBbgogICAgIG1tYXAgY2FuIGJlIHVzZWQgYWNyb3NzIG11bHRpcGxlIGJ1Y2tldHMgKGRlZmF1bHRfaGFuZGxlciB3aXRoCiAgICAgYnl0ZSByYW5nZXMsIG1vZF9maWxlX2NhY2hlLCBtb2RfbW1hcF9zdGF0aWMpLCBzbyBjbGVhbnVwIG9mCiAgICAgdGhlIG1tYXAgaXRzZWxmIGNhbid0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVja2V0LgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCAuZGxsIGNhY2hpbmcgZGlyZWN0aXZlIElTQVBJQ2FjaGVGaWxlIHRvIG1vZF9pc2FwaS4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSYWRpY2FsIHN1cmdlcnkgdG8gaW1wcm92ZSBtb2RfaXNhcGkgc3VwcG9ydCB1bmRlciBXaW4zMi4KICAgICBJbmNsdWRlcyBhIG51bWJlciBvZiBuZXdlciBTZXJ2ZXJTdXBwb3J0RnVuY3Rpb24gY2FsbHMsIHN1cHBvcnQKICAgICBmb3IgUmVhZENsaWVudCAoaW4gb3JkZXIgdG8gcmV0cmlldmUgUE9TVHMgZ3JlYXRlciB0aGFuIDQ4S0IpLAogICAgIGFuZCBnZW5lcmFsIGJ1ZyBmaXhlcyB0byBtb3JlIHJlbGlhYmx5IGxvYWQgSVNBUEkgLmRsbCdzIGFuZAogICAgIHByZXZlbnQgbGVha2luZyBoYW5kbGUgcmVzb3VyY2VzLiAgTm90ZTogVGhlcmUgYXJlIHN0aWxsIAogICAgIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiBJSVMncyBhbmQgQXBhY2hlJ3MgU2VydmVyVmFyaWFibGVzLCBhbmQKICAgICBhc3luYyBjYWxscyBhcmUgc3RpbGwgbm90IHN1cHBvcnRlZC4gIEFkZGl0aW9uYWwgd2FybmluZ3MgYXJlCiAgICAgbG9nZ2VkIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nIG9mIHVuc3VwcG9ydGVkIElTQVBJIGNhbGxzLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZCBpbnB1dCBmaWx0ZXJpbmcgdG8gQXBhY2hlLiAgVGhlIGJhc2ljIGlkZWEgZm9yIHRoZSBpbnB1dAogICAgIGZpbHRlcnMgaXMgdGhlIHNhbWUgYXMgdGhlIGlkZWFzIGZvciBvdXRwdXQgZmlsdGVycy4gIFRoZSBiaWdnZXN0CiAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IGluc3RlYWQgb2YgY2FsbGluZyBhcF9wYXNzX2JyaWdhZGUsIGFwX2dldF9icmlnYWRlCiAgICAgc2hvdWxkIGJlIGNhbGxlZCwgYW5kIHRoZSBvcmRlciBvZiBleGVjdXRpb24gZm9yIHRoZSBmaWx0ZXIgaXRzZWxmIGlzCiAgICAgZGlmZmVyZW50LiAgV2hlbiB3cml0aW5nIGFuIG91dHB1dCBmaWx0ZXIsIGEgYnJpZ2FkZSBpcyBwYXNzZWQgaW4sCiAgICAgYW5kIGZpbHRlcnMgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGF0IGJyaWdhZGUsIHdoZW4gZG9uZSwgdGhleSBjYWxsCiAgICAgYXBfcGFzc19icmlnYWRlLiAgSW5wdXQgZmlsdGVycyBhcmUgdGhlIGV4YWN0IG9wcG9zaXRlLiAgQmVjYXVzZSBpbnB1dAogICAgIGlzIG5vdCBhIHB1c2ggb3BlcmF0aW9uLCBmaWx0ZXJzIGZpcnN0IGNhbGwgYXBfZ2V0X2JyaWdhZGUuICBXaGVuIHRoaXMKICAgICBmdW5jdGlvbiByZXR1cm5zLCB0aGUgaW5wdXQgZmlsdGVyIHdpbGwgYmUgbGVmdCB3aXRoIGEgdmFsaWQgYnJpZ2FkZS4KICAgICBUaGUgaW5wdXQgZmlsdGVyIHNob3VsZCB0aGVuIG9wZXJhdGUgb24gdGhlIGJyaWdhZGUsIGFuZCByZXR1cm4uCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBidWlsZGluZyBvbiBCU0QvT1MgdXNpbmcgaXRzIG5hdGl2ZSBtYWtlLiBUaGUgYnVpbGQgc3lzdGVtCiAgICAgZmFsbHMgYmFjayB0byB0aGUgQlNEIC5pbmNsdWRlIGRpcmVjdGl2ZSBvbiB0aGF0IGhvc3QgcGxhdGZvcm0uCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KCiAgKikgRXhwYW5kIGRibW1hbmFnZSB0byBhbGxvdyAtZCAtbSAtcyAtcCBvcHRpb25zIGZvciBDcnlwdCwgTUQ1LAogICAgIFNIQTEgYW5kIHBsYWludGV4dCBwYXNzd29yZCBlbmNvZGluZ3MuICBNYWtlIGZlYXR1cmUgdGVzdHMgYQogICAgIGJpdCBtb3JlIGZsZXhpYmxlLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ2hhcnNldCB0cmFuc2xhdGlvbjogbW9kX2NoYXJzZXRfbGl0ZSBoYW5kbGVzIG91dHB1dCBjb250ZW50IAogICAgIHRyYW5zbGF0aW9uIGluIGEgZmlsdGVyLiAgbW9kX2NoYXJzZXRfbGl0ZSBubyBsb25nZXIgaWdub3JlcyAKICAgICBzdWJyZXF1ZXN0cy4gIEEgYnVuY2ggb2YgY3J1ZnQgcmVsYXRlZCB0byBCVUZGJ3Mgc3VwcG9ydCBmb3IKICAgICB0cmFuc2xhdGluZyByZXF1ZXN0IGFuZCByZXNwb25zZSBib2RpZXMgd2FzIHJlbW92ZWQuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3ZlIHRoZSBhZGRpdGlvbiBvZiB0aGUgQ09SRSBmaWx0ZXIgdG8gdGhlIHBvc3RfcmVhZF9yZXF1ZXN0CiAgICAgaG9vayBpbiBodHRwX2NvcmUuYy4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byBhZGQgdGhlIGZpbHRlciBpbgogICAgIG11bHRpcGxlIHBsYWNlcyBhbmQgYWxsb3dzIGZvciBhbiBTU0wgbW9kdWxlIHRvIGJlIGFkZGVkIG11Y2gKICAgICBzaW1wbGVyLiBbUnlhbiBCbG9vbV0KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAwLTA5MTMgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IGEgc2VjdXJpdHkgcHJvYmxlbSB0aGF0IGFmZmVjdHMgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvZgogICAgIG1vZF9yZXdyaXRlLiBJZiB0aGUgcmVzdWx0IG9mIGEgUmV3cml0ZVJ1bGUgaXMgYSBmaWxlbmFtZSB0aGF0CiAgICAgY29udGFpbnMgZXhwYW5zaW9uIHNwZWNpZmllcnMsIGVzcGVjaWFsbHkgcmVnZXhwIGJhY2tyZWZlcmVuY2VzCiAgICAgJDAuLiQ5IGFuZCAlMC4uJTksIHRoZW4gaXQgbWF5IGJlIHBvc3NpYmxlIGZvciBhbiBhdHRhY2tlciB0bwogICAgIGFjY2VzcyBhbnkgZmlsZSBvbiB0aGUgd2ViIHNlcnZlci4gW1RvbnkgRmluY2hdCgogICopIEZpeCBhIGJ1ZyB3aGVyZSBlcnJvcnMgdGhhdCBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGVhcmx5IHJlcXVlc3QgcGFyc2luZwogICAgIGRvbid0IHByb2R1Y2UgdmlzaWJsZSBIVFRQIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSBicm93c2VyLCBiZWNhdXNlCiAgICAgdGhlIGNvcmVfZmlsdGVyIHdhc24ndCBwcmVzZW50LiAgW0dyZWcgQW1lc10KCiAgKikgUHJvdmlkZSBhcHJfc29ja2xlbl90IGFzIGEgcG9ydGFiaWxpdHkgYWlkLiAKICAgICBbVmljdG9yICBKLiBPcmxpa293c2tpXQoKICAqKSBPdmVyaGF1bCBvZiBkYm1tYW5hZ2UgdG8gYWxsb3cgYSBncm91cHMgYXJnIChhcyBpbiBBcGFjaGUgMS4yKQogICAgIGFzIHdlbGwgYXMgYSBjb21tZW50IGFyZyB0byB0aGUgYWRkLCBhZGR1c2VyIGFuZCB1cGRhdGUgY21kcy4KICAgICB1cGRhdGUgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIG9yIHByZXNlcnZlIHB3L2dyb3Vwcy9jb21tZW50LgogICAgIEZpeGVkIGEgYnVnIGluIGRibW1hbmFnZSB0aGF0IHByZXZlbnRlZCB0aGUgY2hlY2sgb3B0aW9uIGZyb20gCiAgICAgcGFyc2luZyBhIHBhc3N3b3JkIGZvbGxvd2VkIGJ5IDpncm91cC4uLiB0ZXh0LiAgQ29ycmVjdGVkIHRoZQogICAgIHNlZWQgY2FsY3VhbGF0aW9uIGZvciBXaW4zMiBzeXN0ZW1zLCBhbmQgYWRkZWQgLWxzZGJtIHN1cHBvcnQuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29uZmlndXJlZCBtb2RfYXV0aF9kYm0gdG8gY29tcGlsZSB3aXRoIHNkYm1saWIgdW5kZXIgV2luMzIuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQXZvaWQgYSBzZWdmYXVsdCB3aGVuIHBhcnNpbmcgLmh0YWNjZXNzIGZpbGVzLiAgQW4gCiAgICAgdW5pbml0aWFsaXplZCB0cmVlIHBvaW50ZXIgd2FzIHBhc3NlZCB0byBhcF9idWlsZF9jb25maWcoKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIHdheSB0aGF0IGluZXRfYWRkciAmIGluZXRfbmV0d29yayBhcmUgY2hlY2tlZCBmb3IKICAgICBpbiBBUFIncyBjb25maWd1cmUgcHJvY2VzcyB0byBhbGxvdyBCZU9TIEJPTkUgdG8gY29ycmVjdGx5CiAgICAgZmluZCB0aGVtLiBXaXRoIHRoaXMgY2hhbmdlIEJlT1MgQk9ORSBub3cgYnVpbGRzIGZyb20gc291cmNlCiAgICAgd2l0aCBubyBwcm9ibGVtcy4gIFtEYXZpZCBSZWlkXQoKICAqKSBGaXggYSBidWcgaW4gYXByX2NyZWF0ZV9wcm9jZXNzKCkgZm9yIFVuaXguICBUaGUgTlVMTCBzaWduaWZ5aW5nCiAgICAgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVycyB0byBleGVjdmUoKSB3YXMgc3RvcmVkIGluIHRoZSB3cm9uZwogICAgIGxvY2F0aW9uLCBvdmVybGF5aW5nIHRoZSBzdG9yYWdlIGJleW9uZCB0aGUgbmV3YXJnc1tdIGFycmF5IGFuZCAKICAgICBhbHNvIHBhc3NpbmcgdW5pbml0aWFsaXplZCBzdG9yYWdlIHRvIGV4ZWN2ZSgpLCB3aGljaCB3b3VsZCAKICAgICBzb21ldGltZXMgZmFpbCB3aXRoIEVGQVVMVC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIGJ1ZyBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWluZXJzLiAgV2l0aCBhIHNlcXVlbmNlCiAgICAgbGlrZSB0aGlzIGluIHRoZSBjb25maWcgZmlsZQoKICAgICAgIDxJZk1vZHVsZSBtb2Rfa2lscm95LmM+CiAgICAgICBhbnkgc3R1ZmYKICAgICAgIDwvSWZNb2R1bGU+CiAgICAgICA8SWZNb2R1bGUgbW9kX2xvdmVqb3kuYz4KICAgICAgIChibGFuayBsaW5lKQogICAgICAgYW55IHN0dWZmCiAgICAgICA8L0lmTW9kdWxlPgoKICAgICB0aGUgc2Vjb25kIGNvbnRhaW5lciB3b3VsZCBiZSB0ZXJtaW5hdGVkIGF0IHRoZSBibGFuayBsaW5lIGR1ZSB0bwogICAgIHNlZGltZW50IGluIHRoZSBidWZmZXIgZnJvbSByZWFkaW5nIHRoZSBwcmlvciA8L0lmTW9kdWxlPiBhbmQgYW4gCiAgICAgZXJyb3IgbWVzc2FnZSB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSByZWFsIDwvSWZNb2R1bGU+IGZvciB0aGUKICAgICBzZWNvbmQgY29udGFpbmVyLiAgQWxzbyBkdWUgdG8gdGhpcyBwcm9ibGVtLCBhbnkgdHdvIGNoYXJhY3RlcnMgCiAgICAgY291bGQgYmUgdXNlZCBmb3IgIjwvIiBpbiB0aGUgY2xvc2Ugb2YgYSBjb250YWluZXIuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcF9hZGRfZmlsdGVyIHByb3RvdHlwZSBjaGFuZ2VkIHRvIHJlbW92ZSB0aGUgY3R4IHBvaW50ZXIuICBUaGUKICAgICBwb2ludGVyIHN0aWxsIHJlbWFpbnMgaW4gdGhlIGZpbHRlciBzdHJ1Y3R1cmUsIGJ1dCBpdCBjYW4gbm90IGJlCiAgICAgYSBwYXJ0IG9mIHRoZSBhcF9hZGRfZmlsdGVyIHByb3RvdHlwZS4gIFRoZSByZWFzb24gaXMgdGhhdCB3aGVuCiAgICAgdGhlIGNvcmUgdXNlcyBBZGRGaWx0ZXIgdG8gYWRkIGEgZmlsdGVyIHRvIHRoZSBzdGFjayBpdCBkb2Vzbid0CiAgICAga25vdyBob3cgdG8gYWxsb2NhdGUgdGhlIGN0eCBwb2ludGVyLCBvciBldmVuIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQKICAgICBiZSBhbGxvY2F0ZWQuICBUaGUgZmlsdGVycyB3aWxsIGhhdmUgdG8gYmUgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcKICAgICB0aGUgY3R4IG1lbW9yeSB3aGVuIHRoZXkgbmVlZCBpdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGFuIEFkZEZpbHRlciBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSB0YWtlcyBhIGxpc3Qgb2YgZmlsdGVycwogICAgIHRoYXQgc2hvdWxkIGJlIGFjdGl2YXRlZCBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3NucHJpbnRmKCk6IEdldCBxdWFkIGZvcm1hdCBzdHJpbmdzIHdvcmtpbmcgb24gT1MvMzkwIChhbmQgcGVyaGFwcwogICAgIHNvbWUgb3RoZXIgcGxhdGZvcm1zKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vZGlmeSBtb2RfaW5jbHVkZSB0byBiZSBhIGZpbHRlci4gIEN1cnJlbnRseSwgaXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQKICAgICBvbiBhY3R1YWwgZmlsZXMsIGJ1dCBpdCBzaG91bGQgd29yayBmb3IgQ0dJIHNjcmlwdHMgdG9vLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBhcHJfcHV0YygpLCBhcHJfcHV0cygpIGZvciBVbml4OiBoYW5kbGUgYnVmZmVyZWQgZmlsZXMgYW5kIGludGVycnVwdGVkCiAgICAgd3JpdGVzLiAgYXByX2ZsdXNoKCkgZm9yIFVuaXg6IGhhbmRsZSBpbnRlcnJ1cHRlZCB3cml0ZXMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTmFtZVZpcnR1YWxIb3N0IGNhbiBub3cgdGFrZSAiKiIgYXMgYW4gYXJndW1lbnQgaW5zdGVhZCBvZgogICAgIGFuIElQIGFkZHJlc3MuIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBwdXJlbHkgbmFtZS1iYXNlZAogICAgIHZpcnR1YWwgaG9zdGluZyBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBJUCBhZGRyZXNzZXMgaW4KICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB3aGljaCBpZ25vcmVzIHRoZSBsb2NhbCBhZGRyZXNzCiAgICAgb2YgYW55IGNvbm5lY3Rpb25zLiBQUiAjNTU5NSwgUFIgIzQ0NTUgW1RvbnkgRmluY2hdCgogICopIEZpeCBzb21lIGNvbXBpbGUgd2FybmluZ3MgaW4gbW9kX21tYXBfc3RhdGljLmMKICAgICBbTWlrZSBBYmJvdHQgPG1qYSBzZ2kuY29tPl0KCiAgKikgRml4IGNodW5raW5nIHByb2JsZW0gd2l0aCBDR0kgc2NyaXB0cy4gIFRoZSBnZW5lcmFsIHByb2JsZW0gd2FzIHRoYXQKICAgICB0aGUgQ0dJIG1vZHVsZXMgd2VyZSBhZGRpbmcgYW4gRU9TIGJ1Y2tldCBhbmQgdGhlbiB0aGUgY29yZSBhZGRlZCBhbgogICAgIEVPUyBidWNrZXQuICBUaGUgY2h1bmtpbmcgZmlsdGVyIGZpbmFsaXplcyB0aGUgY2h1bmtlZCByZXNwb25zZSB3aGVuIGl0CiAgICAgZW5jb3VudGVycyBhbiBFT1MgYnVja2V0LiAgQmVjYXVzZSB0d28gRU9TIGJ1Y2tldHMgd2VyZSBzZW50LCB3ZQogICAgIGZpbmFsaXplZCB0aGUgcmVzcG9uc2UgdHdpY2UuICBUaGUgZml4IGlzIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IHNlbmQgb25lCiAgICAgRU9TLCBieSB1dGlsaXppbmcgYSBmbGFnIGluIHRoZSByZXF1ZXN0X3JlYy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3B1dF9vc19maWxlKCkgbm93IHNldHMgdXAgdGhlIHVuZ2V0IGJ5dGUgYXBwcm9wcmlhdGVseSBvbiBVbml4CiAgICAgYW5kIFdpbjMyLiAgUHJldmlvdXNseSwgdGhlIGZpcnN0IHJlYWQgZnJvbSBhbiBhcHJfZmlsZV90IHNldCB1cCB2aWEKICAgICBhcHJfcHV0X29zX2ZpbGUoKSB3b3VsZCByZXR1cm4gYSAnXDAnLiAgW0plZmYgVHJhd2lja10KCiAgKikgTW9kX2NnaWQgbm93IGNyZWF0ZXMgYSBzaW5nbGUgZWxlbWVudCBidWNrZXQgYnJpZ2FkZSwgd2l0aCBhIHBpcGUKICAgICBidWNrZXQsIGluc3RlYWQgb2YgdXNpbmcgQlVGRidzIGFuZCBhcF9yKi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQVBSVkFSUy5pbiBubyBsb25nZXIgb3ZlcndyaXRlcyB0aGUgRVhUUkFfTElCUyB2YXJpYWJsZS4KICAgICBbTWlrZSBBYmJvdHQgPG1qYSBzZ2kuY29tPl0KCiAgKikgUmVtb3ZlIGFwX2JvcGVuZiBmcm9tIGJ1ZmYgY29kZS4gIFRoaXMgcmVxdWlyZWQgbW9kaWZ5aW5nIHRoZSBmaWxlX2NhY2hlCiAgICAgY29kZSB0byB1c2UgQVBSIGZpbGUncyBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggQlVGRnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBjb21waWxlIGJyZWFrIG9uIHNvbWUgcGxhdGZvcm1zIGZvciBtb2RfbWltZV9tYWdpYy5jCiAgICAgW0pvaG4gSy4gU3RlcmxpbmcgPHN0ZXJsaW5nIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBtZXJnaW5nIG9mIEFkZERlZmF1bHRDaGFyc2V0IGRpcmVjdGl2ZS4KICAgICBQUiAjNTg3MiAoMS4zKSBbSnVuIEt1cml5YW1hIDxrdXJpeWFtYSBpbWdzcmMuY28uanA+XQoKICAqKSBNaW5vciByZXZhbXAgb2YgdGhlIHJsaW1pdCBzZWN0aW9ucyBvZiBjb2RlLiBXZSBub3cgdGVzdAogICAgIGV4cGxpY2l0bHkgZm9yIHNldHJsaW1pdCBhbmQgZ2V0cmxpbWl0LiBBbHNvLCB1bml4ZF9zZXRfcmxpbWl0KCkKICAgICBpcyBub3cgImF2YWlsYWJsZSIgZXZlbiBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CiAgICAgdGhlIHJsaW1pdCBmYW1pbHkgKGl0J3MganVzdCBhIG5vb3AgdGhvdWdoKS4gW0ppbSBKYWdpZWxza2ldCgogICopIE1pZ3JhdGUgdGhlIHByZS1zZWxlY3Rpb24gb2Ygd2hpY2ggTVBNIHRvIHVzZSBmb3Igc3BlY2lmaWMKICAgICBwbGF0Zm9ybXMgdG8gaGludHMubTQsIHdoaWNoIGNvbnRhaW5zIChvciBzaG91bGQgY29udGFpbikKICAgICBhbGwgcGxhdGZvcm0gc3BlY2lmaWMgImhpbnRzIi4gW0ppbSBKYWdpZWxza2ldCgogICopIFJlbW92ZSBJT0xzIGZyb20gQXBhY2hlLiAgV2l0aCBmaWx0ZXJpbmcsIElPTHMgYXJlIG5vIGxvbmdlciBuZWNlc3NhcnkKICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIHRhYmxlcyB3aXRoIG5vbi1zdHJpbmcvYmluYXJ5IHZhbHVlcyB0byBBUFIuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXggc29tZSBiYWQgY2FsbHMgdG8gYXBfbG9nX3JlcnJvcigpIGluIG1vZF9yZXdyaXRlLiAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVcGRhdGUgUENSRSB0byB2ZXJzaW9uIDMuMi4gIFtSeWFuIEJsb29tXQoKICAqKSBDaGFuZ2UgdGhlIHdheSBidWNrZXRzJyBkZXN0cm95IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHNvIHRoYXQKICAgICB0aGV5IGNhbiBiZSBtb3JlIGRpcmVjdGx5IHVzZWQgd2hlbiBjaGFuZ2luZyB0aGUgdHlwZSBvZiBhCiAgICAgYnVja2V0IGluIHBsYWNlLiBbVG9ueSBGaW5jaF0KCiAgKikgQWRkIGdlbmVyaWMgc3VwcG9ydCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIHRoZSByZXNvdXJjZXMgdXNlZCBieQogICAgIGJ1Y2tldHMsIGFuZCBhbHRlciB0aGUgSEVBUCBhbmQgTU1BUCBidWNrZXRzIHRvIHVzZSBpdC4gQ2hhbmdlCiAgICAgdGhlIHdheSBidWNrZXRzIGFyZSBpbml0aWFsaXNlZCB0byBzdXBwb3J0IGNoYW5naW5nIHRoZSB0eXBlIG9mCiAgICAgYnVja2V0cyBpbiBwbGFjZSwgYW5kIHVzZSBpdCB3aGVuIHNldHRpbmcgYXNpZGUgVFJBTlNJRU5UIGJ1Y2tldHMuCiAgICAgQ2hhbmdlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUUkFOU0lFTlQgYnVja2V0cyBzbyB0aGF0IGl0IGNhbiBiZQogICAgIG1vc3RseSBzaGFyZWQgd2l0aCBJTU1PUlRBTCBidWNrZXRzLCB3aGljaCBhcmUgbm93IGltcGxlbWVudGVkLgogICAgIFtUb255IEZpbmNoXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNgoKICAqKSBBZGQgc3VwcG9ydCB0byBBcGFjaGUgYW5kIEFQUiBmb3IgZHNvcyBvbiBPUy8zOTAuICBbR3JlZyBBbWVzXQoKICAqKSBBZGQgYSBjaHVua2luZyBmaWx0ZXIgdG8gQXBhY2hlLiAgVGhpcyBicmluZ3MgdXMgb25lIHN0ZXAgY2xvc2VyCiAgICAgdG8gcmVtb3ZpbmcgQlVGRi4gW1J5YW4gQmxvb21dCgogICopIGFwX2FkZF9maWx0ZXIgbm93IGFkZHMgZmlsdGVycyBpbiBhIExJRk8gZmFzaGlvbi4gIFRoZSBmaXJzdCBmaWx0ZXIKICAgICBhZGRlZCB0byB0aGUgc3RhY2sgaXMgdGhlIGxhc3QgZmlsdGVyIHRvIGJlIGNhbGxlZC4gIFtSeWFuIEJsb29tXQoKICAqKSBBcGFjaGUgMi4wIGhhcyBiZWVuIGNvbXBsZXRlbHkgZG9jdW1lbnRlZCB1c2luZyBTY2FuZG9jLiAgVGhlCiAgICAgZG9jcyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgJ21ha2UgZG9jcycuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGZpbHRlcmVkIEkvTyB0byBBcGFjaGUuICBUaGlzIGlzIGJhc2VkIG9uIGJ1Y2tldCBicmlnYWRlcywKICAgICBDdXJyZW50bHkgdGhlIGJ1Y2tldHMgc3RpbGwgdXNlIEJVRkYgdW5kZXIgdGhlIGNvdmVycywgYnV0IHRoYXQKICAgICBzaG91bGQgY2hhbmdlIHF1aWNrbHkuICBUaGUgb25seSBjdXJyZW50bHkgd3JpdHRlbiBmaWx0ZXIgaXMgdGhlCiAgICAgY29yZSBmaWx0ZXIgd2hpY2gganVzdCBjYWxscyBhcF9id3JpdGUuICBbVGhlIEFwYWNoZSBHcm91cF0KCiAgKikgQVBSIGxvY2tzIG9uIFVuaXg6IExldCBBUFJfTE9DS0FMTCBsb2NrcyB3b3JrIHdoZW4gQVBSIGlzbid0CiAgICAgYnVpbHQgd2l0aCB0aHJlYWQgc3VwcG9ydC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFib3J0IGNvbmZpZ3VyYXRpb24gaWYgLS13aXRoLWxheW91dCB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSdzCiAgICAgbm8gbGF5b3V0IGRlZmluaXRpb24gZmlsZS4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yICctLXdpdGgtcG9ydD1uJyBvcHRpb24gdG8gY29uZmlndXJlLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIG1ldGhvZHMgZm9yIHRoZSBBbGxvdyByZXNwb25zZSBoZWFkZXIKICAgICBmaWVsZCwgYW5kIGFuIEFQSSByb3V0aW5lIGZvciBhY2Nlc3Npbmcgci0+YWxsb3dlZCBhbmQgdGhlCiAgICAgbGlzdCBvZiBleHRlbnNpb24gbWV0aG9kcyBpbiBhIHVuaWZpZWQgbWFubmVyLiAgW0tlbiBDb2FyXQoKICAqKSBtb2RfY2Vybl9tZXRhOiBmaXggYnJva2VuIGZpbGUgcmVhZGluZyBsb29wIGluIHNjYW5fbWV0YV9maWxlKCkuCiAgICAgW1JvYiBTaW1vbnNvbiA8c2ltbyB1cy5pYm0uY29tPl0KCiAgKikgR2V0IHhsYXRlIGJ1aWxkcyB3b3JraW5nIGFnYWluLiAgVGhlIGFwciByZW5hbWluZyBpbiAyLjBhNSBicm9rZQogICAgIEFQQUNIRV9YTEFURSBidWlsZHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIHByb2JsZW0gd2FzIGZpeGVkLiAgV2hlbiB0aGUgCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHN0YXJ0ZWQgd2l0aCBhbiBJZk1vZHVsZS9JZkRlZmluZSBjb250YWluZXIsIAogICAgIG9ubHkgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBjb250YWluZXIgd291bGQgYmUgcmV0YWluZWQuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNQoKICAqKSBQZXJjaGlsZCBpcyBzZXJ2aW5nIHBhZ2VzIGFmdGVyIHBhc3NpbmcgdGhlbSB0byBkaWZmZXJlbnQgY2hpbGQKICAgICBwcm9jZXNzZXMuICBUaGVyZSBhcmUgc3RpbGwgYSBsb3Qgb2YgYnVncywgYnV0IHRoaXMgZG9lcyB3b3JrLiAgSQogICAgIGhhdmUgbWFkZSByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBzYW1lIGluc3RhbGxhdGlvbiBvZiBBcGFjaGUsIGFuZCBoYWQKICAgICBkaWZmZXJlbnQgc2VydmVycyB1c2UgZGlmZmVyZW50IHVzZXIgSURzIHRvIHNlcnZlIHRoZSByZXNwb25zZXMuCiAgICAgVGhpcyBjaGFuZ2UgbW92ZXMgdG8gdXNpbmcgc29ja2V0cGFpciBpbnN0ZWFkIG9mIGFuIEFGX1VOSVggc29ja2V0LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBQZXJjaGlsZCBNUE0gc3RpbGwgZG9lc24ndCB3b3JrIHBlcmZlY3RseSwgYnV0IGl0IGlzIHNlcnZpbmcgcGFnZXMuCiAgICAgSXQgY2FuJ3Qgc2VlbSB0byBwYXNzIGJldHdlZW4gY2hpbGQgcHJvY2Vzc2VzIHlldCwgYnV0IEkgdGhpbmsgd2UKICAgICBhcmUgY2xvc2VyIG5vdyB0aGFuIGJlZm9yZS4gIFRoaXMgbW92ZXMgdXMgYmFjayB0byB1c2luZyBVbml4CiAgICAgRG9tYWluIFNvY2tldHMuICBbUnlhbiBCbG9vbV0KCiAgKikgbGliYXByIGZ1bmN0aW9ucyBhbmQgdHlwZXMgcmVuYW1lZCB3aXRoIGFwcl8gcHJlZml4LgogICAgICNpbmNsdWRlICJhcHJfY29tcGF0LmgiIGZvciAxLjMueCBiYWNrd2FyZHMgY29tcGF0CiAgICAgW1BlcmxdCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIEFQUiBzb2NrYWRkciBoYW5kbGluZyBvbiBXaW4zMi4gIEl0IGRpZG4ndCBhbHdheXMKICAgICByZXR1cm4gdGhlIHJpZ2h0IGluZm9ybWF0aW9uIG9uIHRoZSBsb2NhbCBzb2NrZXQgYWRkcmVzcy4KICAgICBbR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGxldmVsOC5jb20+XQoKICAqKSBhcF9yZWN2KCkgb24gV2luMzI6IFNldCBieXRlcy1yZWFkIHRvIDAgb24gZXJyb3IuICAKICAgICBbR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGxldmVsOC5jb20+XQoKICAqKSBBZGQgYW4gb3B0aW9uIHRvIG5vdCBkZXRhY2ggZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgd2l0aG91dAogICAgIGdvaW5nIGludG8gc2luZ2xlIHByb2Nlc3MgbW9kZS4gIFRoaXMgYWxsb3dzIGZvciBtdWNoIGVhc2llcgogICAgIGRlYnVnZ2luZyBvZiB0aGUgcHJvY2VzcyBzdGFydHVwIGNvZGUuIFtSeWFuIEJsb29tXQoKICAqKSBhYjogZG9uJ3QgdXNlIHBlcnJvcigpIHRvIHJlcG9ydCB0aGUgZmFpbHVyZSBvZiBhbiBBUFIgZnVuY3Rpb24uCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTWFrZSBkZXh0ZXIsIG1wbXRfcHRocmVhZCwgYW5kIHBlcmNoaWxkIE1QTXMgbm90IGRlc3Ryb3kgdGhlCiAgICAgc2NvcmVib2FyZCBvbiBncmFjZWZ1bCByZXN0YXJ0cy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHNlZ2ZhdWx0L1NJR1NFR1Ygd2hlbiBydW5uaW5nIGd6aXAgZnJvbSBtb2RfbWltZV9tYWdpYy5jLgogICAgIEFuIGludmFsaWQgYXBfcHJvY190IHdhcyBwYXNzZWQgdG8gYXBfY3JlYXRlX3Byb2Nlc3MoKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHJlZ2lzdGVyIGZpbHRlcnMuICBUaG9zZSBmaWx0ZXJzIGFyZSBzdGlsbAogICAgIG5ldmVyIGNhbGxlZCwgYnV0IHRoaXMgaXMgYSBzdGVwIGluIHRoZSByaWdodCBkaXJlY3Rpb24uCiAgICAgW1J5YW4gQmxvb20gYW5kIEdyZWcgU3RlaW5dCgogICopIFJlZ2lzdGVyIHRoZSBtb2RfY2dpZCBkYWVtb24gcHJvY2VzcyBmb3IgY2xlYW51cCBzbyB0aGF0IGl0IGlzCiAgICAga2lsbGVkIGF0IHRlcm1pbmF0aW9uIGlmIGl0IGRvZXMgbm90IGRpZSB3aGVuIHRoZSBwYXJlbnQgZ2V0cwogICAgIFNJR1RFUk0uICBUaGlzIGNoYW5nZSBpcyB0byBmaXggb2NjYXNpb25hbCBwcm9ibGVtcyB3aGVyZSB0aGUKICAgICBwcm9jZXNzIHN0YXlzIGFyb3VuZC4gIEJ1Z3MgaW4gc2ltaWxhciBsb2dpYyBpbiBtb2RfcmV3cml0ZSBhbmQKICAgICBtb2RfaW5jbHVkZSB3ZXJlIGFsc28gZml4ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBidWcgaW4gdGhlIHRpbWUgaGFuZGxpbmcuICBCYXNpY2FsbHksIHdlIHdlcmUgaW1wbG9kaW5nIGEgdGltZQogICAgIGluIGFwX3BhcnNlSFRUUGRhdGUsIGJ1dCBpdCBoYWQgYm9ndXMgZGF0YSBpbiB0aGUgZXhwbG9kZWQgdGltZSBmb3JtYXQuCiAgICAgTmFtZWx5LCB0bV91c2VjIGFuZCB0bV9nbXRvZmYgd2VyZSBub3QgZmlsbGVkIG91dC4gIGFwX2ltcGxvZGVfdGltZQogICAgIHVzZXMgdGhvc2UgdHdvIGZpZWxkcyB0byBhZGp1c3QgdGhlIHRpbWUgdmFsdWUuICBCZWNhdXNlIG9mIHRoZSBIVFRQCiAgICAgc3BlYywgYm90aCBvZiB0aG9zZSB2YWx1ZXMgY2FuIGJlIHplcm8nZWQgb3V0IHNhZmVseS4gIFRoaXMgZml4ZXMKICAgICB0aGUgYnVnIGNvcnJlY3RseS4gIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgcGxhY2UgaW4gdGhlIFdpbmRvd3MgY29kZSB3aGVyZSB0aGUgd3JvbmcgZXJyb3IKICAgICBjb2RlIHdhcyBiZWluZyByZXR1cm5lZC4gW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBsZXZlbDguY29tPl0KCiAgKikgRml4IFBPT0xfREVCVUcgKGF0IGxlYXN0IGZvciBwcmVmb3JrIG1wbSkuIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkZWQgdGhlIEFQUl9FT0xfU1RSIG1hY3JvIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQgZGlmZmVyZW5jZXMgaW4gCiAgICAgbG9nZmlsZXMgYW5kIG90aGVyIHJhdyB0ZXh0IChzdWNoIGFzIGFsbCBBUFIgZmlsZXMpLiAgRml4ZXMgbG9nZmlsZXMKICAgICBub3QgdGVybWluYXRlZCB3aXRoIGNyL2xmIHNlcXVlbmNlcyBpbiBXaW4zMi4gIFtXaWxsaWFtIFJvd2VdCgogICopIE1vdmUgYWxsIHN0cmluZ3MgZnVuY3Rpb25zIGluIEFQUiB0byBzcmMvbGliL2Fwci9zdHJpbmdzIGFuZCBjcmVhdGUKICAgICBhcHJfc3RyaW5ncy5oIGZvciB0aGUgcHJvdG90eXBlcy4gW1J5YW4gQmxvb21dCgogICopIEFQUiBsb2NrIGZpeGVzOiB3aGVuIHVzaW5nIFN5c1Ygc2VtcywgZmxvY2soKSwgb3IgZmNudGwoKSwgYmUgc3VyZQogICAgIHRvIHJlcGVhdCB0aGUgc3lzY2FsbCB1bnRpbCB3ZSBzdG9wIGdldHRpbmcgRUlOVFIuICBJIG5vdGljZWQgYQogICAgIHJlbGF0ZWQgcHJvYmxlbSBhdCB0ZXJtaW5hdGlvbiAoU0lHVEVSTSkgb24gRnJlZUJTRCB3aGVuIHVzaW5nCiAgICAgZmNudGwoKS4gIEFwYWNoZSAxLjMgaGFkIHRoZXNlIG5ldyBsb29wcyB0b28uICBBbHNvLCBtYWtlIHRoZSBmbG9jaygpIAogICAgIGltcGxlbWVudGF0aW9uIHdvcmsgcHJvcGVybHkgd2l0aCBjaGlsZCBpbml0LiAgUHJldmlvdXNseSwgYXBfbG9jaygpCiAgICAgd2FzIGVzc2VudGlhbGx5IGEgbm8tb3AgYmVjYXVzZSBhbGwgY2hpbGRyZW4gd2VyZSB1c2luZyBkaWZmZXJlbnQKICAgICBsb2NrcyBhbmQgdGh1cyBub2JvZHkgZXZlciBibG9ja2VkLiAgW0plZmYgVHJhd2lja10KCiAgKikgVGhlIGh0ZG9jcy8gdHJlZSBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIENWUyBzb3VyY2UgdHJlZSBpbnRvCiAgICAgYSBzZXBhcmF0ZSBhcmVhIGZvciBlYXNpZXIgZGV2ZWxvcG1lbnQuICBUaGlzIGhhcyBOTyBFRkZFQ1Qgb24KICAgICBlbmQtdXNlcnMgb3IgQXBhY2hlIGluc3RhbGxhdGlvbnMuICBbS2VuIENvYXJdCgogICopIEludGVncmF0ZSB0aGUgbW9kX2RhdiBtb2R1bGUgZm9yIFdlYkRBViBwcm90b2NvbCBoYW5kbGluZy4gVGhpcwogICAgIGFkZHMgdGhlIGRhdiBhbmQgZGF2X2ZzIG1vZHVsZXMsIHRoZSBTREJNIGxpYnJhcnksIGFuZCBhZGRpdGlvbmFsCiAgICAgWE1MIGhhbmRsaW5nIHV0aWxpdGllcy4gW0dyZWcgU3RlaW5dCgogICopIENsZWFuIG91dCBvYnNvbGV0ZSBuYW1lcyAoZnJvbSBodHRwZC5oKSBmb3IgdGhlIEhUVFAgU3RhdHVzIENvZGVzCiAgICAgW0dyZWcgU3RlaW5dCgogICopIFVwZGF0ZSB0aGUgbGliL2V4cGF0LWxpdGUvIGxpYnJhcnkgKGJyaW5nIGZvcndhcmQgY2hhbmdlcyBmcm9tCiAgICAgdGhlIEFwYWNoZSAxLjMgcmVwb3NpdG9yeSkuIFtHcmVnIFN0ZWluXQoKICAqKSBJZiBzaXplb2YobG9uZyBsb25nKSA9PSBzaXplb2YobG9uZyksIHRoZW4gcHJlZmVyIGxvbmcgaW4gQVBSCiAgICAgY29uZmlndXJlLmluLiAgW0RhdmUgSGlsbCA8ZGRoaWxsIHprMy5kZWMuY29tPl0KCiAgKikgQWRkIGFwX3NlbmRmaWxlIGZvciBUcnU2NCBVbml4LiAgQWxzbywgYWRkIGFuIGVycm9yIG1lc3NhZ2UgZm9yCiAgICAgbWFjaGluZXMgd2hlcmUgc2VuZGZpbGUgaXMgZGV0ZWN0ZWQsIGJ1dCBub2JvZHkgaGFzIHdyaXR0ZW4gYXBfc2VuZGZpbGUuCiAgICAgW0RhdmUgSGlsbCA8ZGRoaWxsIHprMy5kZWMuY29tPl0KCiAgKikgQ29tcGlsZSBmaXhlcyBpbiBtb2RfbW1hcF9zdGF0aWMuICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIGFiIHdvdWxkIHN0YXJ0IHVwIG1vcmUgY29ubmVjdGlvbnMgdGhhbiBuZWVkZWQsIHRoZW4gcXVpdCB3aGVuIHRoZQogICAgIGRlc2lyZWQgbnVtYmVyIHdlcmUgZmluaXNoZWQuIEFsc28gZml4ZWQgYSBsb2dpYyBlcnJvciBpbnZvbHZpbmcKICAgICBhYiBrZWVwYWxpdmVzLiAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBXaW5OVDogSW1wbGVtZW50IG5vbi1ibG9ja2luZyBwaXBlcyB3aXRoIHRpbWVvdXRzIHRvIGNvbW11bmljYXRlCiAgICAgd2l0aCBDR0lzLiBBcGFjaGUgMi4wYTQgaGFkIG5vbi1ibG9ja2luZyBwaXBlcyBidXQgd2l0aG91dCAKICAgICB0aW1lb3V0cyAoaS5lLCBpZiBhIHRpbWVvdXQgd2FzIHNwZWNpZmllZCwgdGhlIHBpcGUgcmV2ZXJ0ZWQgdG8KICAgICBhIGZ1bGwgYmxvY2tpbmcgcGlwZSkuIE5vdyB0aGUgYmVoYXZpb3VyIGlzIG1vcmUgaW4gbGluZSB3aXRoCiAgICAgVW5peCBub24tYmxvY2tpbmcgcGlwZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFdpbk5UOiBJbXBsZW1lbnQgYWNjZXB0IHNvY2tldCByZXVzZS4gVXNpbmcgbW9kX2ZpbGVfY2FjaGUgdG8KICAgICBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcyBhbG9uZyB3aXRoIGFjY2VwdCBzb2NrZXQgcmV1c2UgZW5hYmxlcwogICAgIEFwYWNoZSAyLjAgdG8gc2VydmUgbm9uLWtlZXBhbGl2ZSByZXF1ZXN0cyBmb3Igc3RhdGljIGZpbGVzIGF0CiAgICAgM3ggdGhlIHJhdGUgb2YgQXBhY2hlIDEuMy4oZS5nLCBBcGFjaGUgMS4zIHdpbGwgc2VydmUgNDAwIHJwcwogICAgIGFuZCBBcGFjaGUgMi4wIHdpbGwgc2VydmUgYWxtb3N0IDEyMDAgcnBzIG9uIG15IHN5c3RlbSkuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIE1lcmdlIG1vZF9tbWFwX3N0YXRpYyBmdW5jdGlvbiBpbnRvIG1vZF9maWxlX2NhY2hlLiBtb2RfZmlsZV9jYWNoZQogICAgIHN1cHBvcnRzIHR3byBjb25maWcgZGlyZWN0aXZlcywgbW1hcGZpbGUgKHNhbWUgYmVoYXZpb3VzIGFzCiAgICAgbW9kX21tYXBfc3RhdGljKSBhbmQgY2FjaGVmaWxlLiBVc2UgdGhlIGNhY2hlZmlsZSBkaXJlY3RpdmUKICAgICB0byBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcy4gVGhpcyBkaXJlY3RpdmUgb25seSB3b3JrcyBvbiBzeXN0ZW1zCiAgICAgdGhhdCBoYXZlIGltcGxlbWVudGVkIHRoZSBhcF9zZW5kZmlsZSBBUEkuIGNhY2hlZmlsZSB3b3JrcyB0b2RheQogICAgIG9uIFdpbmRvd3MgTlQsIGJ1dCBoYXMgbm90IGJlZW4gdGVzdGVkIG9uIGFueSBmbGF2b3JzIG9mIFVuaXguCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIENsZWFudXAgdGhlIGNvbmZpZ3VyYXRpb24uICBXaXRoIHRoZSBsYXN0IGZldyBjaGFuZ2VzIHRoZQogICAgIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyBhdXRvbWF0aWNhbGx5OgogICAgICAgICBpbmhlcml0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gYnVpbGQgZnJvbSBBUFIuICBBbGxvd2luZwogICAgICAgICBBUFIgdG8gaW5mb3JtIEFwYWNoZSB0aGF0IGl0IHNob3VsZCBvciBzaG91bGQgbm90IHVzZSAtbGRsCiAgICAgICAgCiAgICAgICAgIERldGVjdHMgd2hpY2ggbW9kX2NnaSBzaG91bGQgYmUgdXNlZCBtb2RfY2dpIG9yIG1vZF9jZ2lkLAogICAgICAgICBiYXNlZCBvbiB0aGUgdGhyZWFkaW5nIG1vZGVsCgogICAgICAgICBBcGFjaGUgY2FsbHMgQVBSJ3MgY29uZmlndXJlIHByb2Nlc3MgYmVmb3JlIGZpbmlzaGluZyBpdCdzCiAgICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZywgYWxsb3dpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24gZmxvdwogICAgICAgICBiZXR3ZWVuIHRoZSB0d28uCiAgICAgW1J5YW4gQmxvb21dCiAgICAgICAgIAoKICAqKSBDaGFuZ2UgVW5peCBhbmQgV2luMzIgYXBfc2V0c29ja29wdCgpIHNvIHRoYXQgQVBSX1NPX05PTkJMT0NLCiAgICAgd2l0aCBub24temVybyBhcmd1bWVudCBtYWtlcyB0aGUgc29ja2V0IG5vbi1ibG9ja2luZy4gIEJlT1MgYW5kCiAgICAgT1MvMiBhbHJlYWR5IHdvcmtlZCB0aGlzIHdheS4gIFtKZWZmIFRyYXdpY2tdCgogICopIGFwX2Nsb3NlKCkgbm93IGNhbGxzIGFwX2ZsdXNoKCkgZm9yIGJ1ZmZlcmVkIGZpbGVzLCBzbyB3cml0ZQogICAgIG9wZXJhdGlvbnMgd29yayBhIHdob2xlIGxvdCBiZXR0ZXIgb24gYnVmZmVyZWQgZmlsZXMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGVycm9yIG1lc3NhZ2VzIGlzc3VlZCBmcm9tIE1QTXMgd2hpY2ggZXhwbGFpbiB3aGVyZSB0byBjaGFuZ2UKICAgICBjb21waWxlZC1pbiBsaW1pdHMgKGUuZy4sIFRocmVhZHNQZXJDaGlsZCwgTWF4Q2xpZW50cywgU3RhcnRUcmVhZHMpLgogICAgIFtHcmVnIEFtZXNdCgogICopIGFwX2NyZWF0ZV9waXBlKCkgbm93IGxlYXZlcyBwaXBlcyBpbiBibG9ja2luZyBzdGF0ZS4gIChUaGlzIGhlbHBzIAogICAgIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHN5c2NhbGxzIG9uIFVuaXguKSAgYXBfc2V0X3BpcGVfdGltZW91dCgpIGlzCiAgICAgbm93IHRoZSB3YXkgdGhhdCB0aGUgYmxvY2tpbmcgc3RhdGUgb2YgYSBwaXBlIGlzIG1hbmlwdWxhdGVkLgogICAgIGFwX2Jsb2NrX3BpcGUoKSBpcyBnb25lLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ29ycmVjdCB0aGUgcHJvYmxlbSB3aGVyZSB0aGUgb25seSBsb2NhbCBob3N0IG5hbWUgdGhhdCB0aGUgSVAgc3RhY2sKICAgICBjYW4gZGlzY292ZXIgYXJlICd1bmRvdHRlZCcgcHJpdmF0ZSBuYW1lcy4gIElmIG5vIGZ1bGx5IHF1YWxpZmllZAogICAgIGRvbWFpbiBuYW1lIGNhbiBiZSBpZGVudGlmaWVkLCB0aGUgZGVmYXVsdCBTZXJ2ZXJOYW1lIHdpbGwgYmUgc2V0IHRvCiAgICAgdGhlIG1hY2hpbmUncyBJUCBhZGRyZXNzIHN0cmluZy4gQSB3YXJuaW5nIGlzIGFsd2F5cyBwcm92aWRlZCBpZiB0aGUKICAgICBTZXJ2ZXJOYW1lIG5vdCBzcGVjaWZpZWQsIGJ1dCBhc3N1bWVkLiAgU29sdmVzIFBSNjIxNSBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZXBhaXIgcHJvYmxlbXMgd2l0aCBjb25maWcgZmlsZSBwcm9jZXNzaW5nIHdoaWNoIGNhdXNlZCBzZWdmYXVsdAogICAgIGF0IGluaXQgd2hlbiB2aXJ0dWFsIGhvc3RzIHdlcmUgZGVmaW5lZCBhbmQgd2hpY2ggY2F1c2VkIFNlcnZlck5hbWUgdG8KICAgICBiZSBpZ25vcmVkIHdoZW4gdGhlcmUgd2FzIG5vIHZhbGlkIEROUyBzZXR1cC4gIFtKZWZmIFRyYXdpY2tdCgogICopIFJlbW92ZWQgcG9pbnRsZXNzIGFwX2lzX2Fib3J0ZWQgbWFjcm8gZnVuY3Rpb24uIFtSb3kgRmllbGRpbmddCgogICopIEFkZCBhcF9zZW5kZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUlYCiAgICAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBSZXBhaXIgQysrIGNvbXBhdGliaWxpdHkgaW4gYXBfY29uZmlnLmgsIGFwcl9maWxlX2lvLmgsIAogICAgIGFwcl9uZXR3b3JrX2lvLmgsIGFuZCBhcHJfdGhyZWFkX3Byb2MuaC4gIAogICAgIFtUeWxlciBKLiBCcm9va3MgPHR5bGVyamJyb29rcyBob21lLmNvbT4sIEplZmYgVHJhd2lja10KCiAgKikgQnJpbmcgdGhlIGFsbG9jYXRpb24gYW5kIHBvb2wgZGVidWdnaW5nIGNvZGUgYmFjayBpbnRvIGEgd29ya2luZwogICAgIHN0YXRlLiAgVGhpcyB3aWxsIG5lZWQgdG8gYmUgdGVzdGVkIGFzIHNvIGZhciBpdCdzIG9ubHkgYmVlbiB1c2VkIG9uCiAgICAgQmVPUy4gW0RhdmlkIFJlaWRdCgogICopIENoYW5nZSBjb25maWd1cmF0aW9uIGNvbW1hbmQgc2V0dXAgdG8gYmUgcHJvcGVybHkgdHlwZXNhZmUgd2hlbiBpbgogICAgIG1haW50YWluZXIgbW9kZS4gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBjb21waWxlciB0aGF0IGNhbiBpbml0aWFsaXNlCiAgICAgdW5pb25zLiBbQmVuIExhdXJpZV0KCiAgKikgVHVybiBvbiBidWZmZXJpbmcgZm9yIGNvbmZpZyBmaWxlIHJlYWRzLiAgUGFydCBvZiB0aGlzIHdhcyB0bwogICAgIHJlcGFpciBidWZmZXJlZCBJL08gc3VwcG9ydCBpbiBVbml4IGFuZCBpbXBsZW1lbnQgYnVmZmVyZWQKICAgICBhcF9mZ2V0cygpIGZvciBhbGwgcGxhdGZvcm1zLiAgW0JyaWFuIEhhdmFyZCwgSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gd2hlcmUgVVRDIG9mZnNldCB3YXMgbm90IGJlaW5nIHNldCBjb3JyZWN0bHkKICAgICBpbiB0aGUgYWNjZXNzIGxvZy4gUHJvYmxlbSByZXBvcnRlZCBvbiBuZXdzIGdyb3VwIGJ5IEplcnJ5IEJha2VyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggc2VnZmF1bHQgd2hlbiByZXBvcnRpbmcgdGhpcyB0eXBlIG9mIHN5bnRheCBlcnJvcjoKICAgICAiPC9jb250YWluZXI+IHdpdGhvdXQgbWF0Y2hpbmcgPGNvbnRhaW5lcj4gc2VjdGlvbiIsIHdoZXJlCiAgICAgY29udGFpbmVyIGlzIFZpcnR1YWxIb3N0IG9yIERpcmVjdG9yeSBvciB3aGF0ZXZlci4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDAtMTIwNCAoY3ZlLm1pdHJlLm9yZykKICAgICBQcmV2ZW50IHRoZSBzb3VyY2UgY29kZSBmb3IgQ0dJcyBmcm9tIGJlaW5nIHJldmVhbGVkIHdoZW4gCiAgICAgdXNpbmcgbW9kX3Zob3N0X2FsaWFzIGFuZCB0aGUgQ0dJIGRpcmVjdG9yeSBpcyB1bmRlciB0aGUgZG9jdW1lbnQgcm9vdAogICAgIGFuZCBhIHVzZXIgbWFrZXMgYSByZXF1ZXN0IGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8vY2dpLWJpbi9jZ2kKICAgICBhcyByZXBvcnRlZCBpbiA8bmV3czo5NjA5OTkxMDUuMzQ0MzIxIGVybmFuaS5sb2dpY2EuY28udWs+CiAgICAgW1RvbnkgRmluY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IEJlb3MgTmV0d09ya2luZyBFbnZpcm9ubWVudCAoQk9ORSkKICAgICBbRGF2aWQgUmVpZF0KCiAgKikgeGxhdGU6IGFwX3hsYXRlX2NvbnZfYnVmZmVyKCkgbm93IHRlbGxzIHRoZSBjYWxsZXIgd2hlbiB0aGUKICAgICBmaW5hbCBpbnB1dCBjaGFyIGlzIGluY29tcGxldGU7IGFwX2J3cml0ZV94bGF0ZSgpIG5vdyBoYW5kbGVzCiAgICAgaW5jb21wbGV0ZSBmaW5hbCBpbnB1dCBjaGFycy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFlldCBhbm90aGVyIHVwZGF0ZSB0byBzYWZlcmVhZC9oYWxmZHVwbGV4IHN0dWZmIC0tIG5lZWQgdG8gZW5zdXJlCiAgICAgdGhhdCBhIGJoYWxmZHVwbGV4IGNhbGwgb2NjdXJzIGJlZm9yZSBsb2dnaW5nIG9yIGVsc2UgRE5TIGFuZAogICAgIHN1Y2ggY2FuIGRlbGF5IHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcmVzcG9uc2UuICBbRGVhbiBHYXVkZXRdCgogICopIFNvbWUgc3lzY2FsbCByZWR1Y3Rpb24gaW4gQVBSIG9uIHVuaXggLS0gZG9uJ3Qgc2VlayB3aGVuIHNldHRpbmcKICAgICB1cCBhbiBtbWFwOyBhbmQgZG9uJ3QgZmNudGwoKSBtb3JlIHRoYW4gb25jZSBwZXIgc29ja2V0LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgV2hlbiBtb2RfY2dpZCBpcyBzdGFydGVkIGFzIHJvb3QsIHRoZSBjZ2kgZGFlbW9uIG5vdyBzd2l0Y2hlcyAKICAgICB0byB0aGUgY29uZmlndXJlZCBVc2VyL0dyb3VwIChsaWtlIG90aGVyIGh0dHBkIHByb2Nlc3NlcykgCiAgICAgaW5zdGVhZCBvZiBjb250aW51aW5nIGFzIHJvb3QuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgcHJlZm9yayBNUE0gbm93IHVzZXMgYW4gQVBSIGxvY2sgZm9yIHRoZSBhY2NlcHQoKSBtdXRleC4KICAgICBJdCBoYXMgbm90IGJlZW4gZ2V0dGluZyBhIGxvY2sgYXQgYWxsIHJlY2VudGx5LiAgaHR0cGQgLVYgbm93IAogICAgIGRpc3BsYXlzIEFQUidzIHNlbGVjdGlvbiBvZiB0aGUgbG9jayBtZWNoYW5pc20gaW5zdGVhZCBvZiB0aGUgCiAgICAgc3ltYm9scyBwcmV2aW91c2x5IHJlc3BlY3RlZCBieSBwcmVmb3JrLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSBtbWFwKCkgZmVhdHVyZSB0ZXN0IHRvIGNoZWNrIG9ubHkgZm9yIGV4aXN0ZW5jZS4KICAgICBUaGUgcHJldmlvdXMgY2hlY2sgcmVxdWlyZWQgZmVhdHVyZXMgbm90IHVzZWQgYnkgQXBhY2hlLgogICAgIFtHcmVnIEFtZXNdCgogICopIEZpeCBhIGNvdXBsZSBvZiBidWdzIGluIG1vZF9jZ2lkOiAgVGhlIGNnaSBhcmd1bWVudHMgd2VyZQogICAgIHNvbWV0aW1lcyBtYW5nbGVkLiAgVGhlIGxlbiBwYXJtIHRvIGFjY2VwdCgpIHdhcyBub3QgCiAgICAgaW5pdGlhbGl6ZWQsIGxlYWRpbmcgc29tZXRpbWVzIHRvIGFuIGVuZGxlc3MgbG9vcCBvZiBmYWlsZWQKICAgICBhY2NlcHQoKSBjYWxscyBvbiBPUy8zOTAgYW5kIGFueXdoZXJlIGVsc2UgdGhhdCBmYWlsZWQgdGhlIGNhbGwKICAgICBpZiB0aGUgbGVuIHdhcyBuZWdhdGl2ZS4gIFVzZSA8c3lzL3VuLmg+IGZvciBzdHJ1Y3Qgc29ja2FkZHJfdW4KICAgICBpbnN0ZWFkIG9mIGRlY2xhcmluZyBpdCBvdXJzZWx2ZXMgdG8gZml4IGEgY29tcGlsYXRpb24gcHJvYmxlbQogICAgIG9uIFNvbGFyaXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgUmVzb3VyY2UgbGltaXRpbmcgY29kZSBiYWNrIGludG8gQXBhY2hlIDIuMC4gW1J5YW4gQmxvb21dCgogICopIEZpeCB6b21iaWUgcHJvY2VzcyBwcm9ibGVtIHdpdGggbW9kX2NnaS4gIFtKZWZmIFRyYXdpY2tdCgogICopIFBvcnQgbW9kX21tYXBfc3RhdGljIHRvIDIuMC4gIE1ha2UgaXQgZ28gZmFzdGVyLiAgW0dyZWcgQW1lc10KCiAgKikgRml4IHN0b3JhZ2Ugb3ZlcmxheSB3aGVuIGxvYWRpbmcgZHNvcy4gIFN5bXB0b206IEFwYWNoZSBkaWVzIGF0CiAgICAgaW5pdGlhbGl6YXRpb24gaWYgQUxMT0NfREVCVUcgaXMgZGVmaW5lZDsgbm8ga25vd24gc3ltcHRvbSAKICAgICBvdGhlcndpc2UuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdHlwbyBpbiBjb25maWd1cmUgc2NyaXB0IHdoZW4gY2hlY2tpbmcgZm9yIG1vZF9zby4gIGJhc2gKICAgICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHByb2JsZW0gYnV0IC9iaW4vc2ggb24gU29sYXJpcyBkb2VzLgogICAgIFN5bXB0b206ICIuL2NvbmZpZ3VyZTogdGVzdDogdW5rbm93biBvcGVyYXRvciA9PSIKICAgICBbSmVmZiBUcmF3aWNrXQogICAKICAqKSBSZWJpbmQgdGhlIFdpbjMyIE5UIGFuZCA5eCBzZXJ2aWNlcyBjb250cm9sIGludG8gdGhlIE1QTS4gIAogICAgIEFsbCBjb25zb2xlLCBXaW5OVCBTQ00gYW5kIFdpbjl4IHBzZXVkby1zZXJ2aWNlIGNvbnRyb2wgY29kZSBpcwogICAgIG5vdyB3cmFwcGVkIHdpdGhpbiB0aGUgV2luTlQgTVBNLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgYSBjb3B5IG9mIGdldGVudigiUEFUSCIpIGJlZm9yZSBzdG9yaW5nIGZvciBsYXRlciB1c2UuICBTb21lCiAgICAgZ2V0ZW52KCkgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGZvciBzdWNjZXNzaXZlIGNhbGxzLgogICAgIENHSXMgb24gT1MvMzkwIGhhZCBhIGJhZCBQQVRIIGR1ZSB0byB0aGlzLiAgW0plZmYgVHJhd2lja10KCiAgKikgU2VydmVyIFRva2VucyB3b3JrIGluIDIuMCBhZ2Fpbi4gIFRoaXMgYWxzbyBwcm9wb2dhdGVzIHRoZSBjaGFuZ2UKICAgICB0byBhbGxvdyBqdXN0IHRoZSBwcm9kdWN0IG5hbWUgaW4gdGhlIHNlcnZlciBzdHJpbmcgdXNpbmcKICAgICBQUk9EVUNUX09OTFkuCiAgICAgW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE0CgogICopIEVCQ0RJQzogUmVhcnJhbmdlIGNhbGxzIHRvIGFwX2NoZWNrY29udigpIHNvIHRoYXQgbW9zdCBoYW5kbGVycwogICAgIHdvbid0IG5lZWQgdG8gY2FsbCBpdC4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgTW92ZSBwcmVfY29uZmlnIGhvb2sgY2FsbCB0byBiZXR3ZWVuIGNvbmZpZ3VyYXRpb24gcmVhZCBhbmQgY29uZmlnCiAgICAgdHJlZSB3YWxrLiAgVGhpcyBhbGxvd3MgYWxsIG1vZHVsZXMgdG8gaW1wbGVtZW50IHByZV9jb25maWcgaG9va3MKICAgICBhbmQga25vdyB0aGF0IHRoZXkgd2lsbCBiZSBjYWxsZWQgYXQgYW4gYXBwcm9wcmlhdGUgdGltZS4KICAgICBbUnlhbiBCbG9vbV0gCgogICopIG1vZF9jZ2ksIG1vZF9jZ2lkOiBNYWtlIFNjcmlwdExvZyBkaXJlY3RpdmUgd29yayBhZ2Fpbi4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBwcmUtY29uZmlnIGhvb2tzIGJhY2sgdG8gYWxsIG1vZHVsZXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIFNJR1NFR1YgaW4gYXBfbWQ1ZGlnZXN0KCksIHdoaWNoIGlzIHVzZWQgd2hlbiB5b3UgaGF2ZQogICAgIENvbnRlbnREaWdlc3QgZW5hYmxlZCBhbmQgd2UgY2FuJ3QvZG9uJ3QgbW1hcCB0aGUgZmlsZS4gCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgV2Ugbm93IHJlcG9ydCB0aGUgY29ycmVjdCBsaW5lIG51bWJlciBmb3Igc3ludGF4IGVycm9ycyBpbiBjb25maWcKICAgICBmaWxlcy4gIFtSeWFuIEJsb29tLCBHcmVnIFN0ZWluLCBKZWZmIFRyYXdpY2tdCgogICopIEJyb3VnaHQgbW9kX2F1dGhfZGlnZXN0IHVwIHRvIHN5bmNoIHdpdGggMS4zLCBmaXhlZCBhcF90aW1lX3QtCiAgICAgcmVsYXRlZCBidWdzLCBhbmQgY2hhbmdlZCBzaG1lbS9sb2NraW5nIHRvIHVzZSBhcHIgQVBJLiBTaGFyZWQtbWVtCiAgICAgaXMgY3VycmVudGx5IGRpc2FibGVkLCBob3dldmVyLCBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggZ3JhY2VmdWwKICAgICByZXN0YXJ0cy4gW1JvbmFsZCBUc2NoYWzkcl0KCiAgKikgRml4IGNvcnJ1cHRpb24gb2YgSUZTIHZhcmlhYmxlIGluIC0td2l0aC1tb2R1bGU9IGhhbmRsaW5nLiAgCiAgICAgRGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3Mgc2hlbGwgb3IgY3VzdG9taXphdGlvbiB0aGVyZW9mLCB0aGVyZSAKICAgICB3b3VsZCBiZSBlcnJvcnMgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGxhdGVyIGluIHRoZSBjb25maWd1cmUKICAgICBwcm9jZWR1cmUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpOiBSZXN0b3JlIGxvZ2dpbmcgb2Ygc3RkZXJyIGZyb20gY2hpbGQgcHJvY2VzcyB3aGVuIFNjcmlwdExvZyAKICAgICBpc24ndCB1c2VkIChhcyBpbiAxLjMpLCBleGNlcHQgdGhhdCBvbiBVbml4IGl0IGlzIG5vdyBsb2dnZWQgdmlhIAogICAgIGFwX2xvZ19yZXJyb3IoKSBpbnN0ZWFkIG9mIGJ5IHRoZSBjaGlsZCBoYXZpbmcgU1RERVJSX0ZJTEVOTyByZWZlcgogICAgIHRvIHRoZSBlcnJvciBsb2cuICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIEFkZCAnLUQnIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIHJ1biB0aW1lIGNvbmZpZ3VyYXRpb24gZGVmaW5lcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBPcmdhbml6ZSBodHRwX21haW4uYyBhcyBpbmRlcGVuZGVudCBjb2RlLCBzdWNoIHRoYXQgbm8gY29kZSBvcgogICAgIGdsb2JhbCBkYXRhIGlzIGV4cG9ydGVkIGZyb20gaXQuICBXSU4zMiB3aWxsIGR5bmFtaWNhbGx5IGxpbmsgaXQKICAgICB0byB0aGUgc2VydmVyIGNvcmUsIHNvIHRoaXMgd2lsbCBwcmV2ZW50IG11dHVhbCBkZXBlbmRlbmN5LgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZCBzZXBhcmF0ZSBkeW5hbWljIGxpbmthZ2UgdGFncyBBUFJfRVhQT1JUKCksIEFQUl9FWFBPUlRfTk9OU1REKCkKICAgICBhbmQgQVBSX1ZBUl9FWFBPUlQgdG8gY29ycmVjdGx5IHJlc29sdmUgYXByIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgV2luOXggc2VydmljZSBleGVjdXRpb24gYW5kIEN0cmwrQy9DdHJsK0JyZWFrL1NodXRkb3duIGhhbmRsZXJzLgogICAgIFtXaWxsaWFtIFJvd2UsIEphbiBKdXN0IEtlaWpzZXIgPEtFSUpTRVJKSiBsb2dpY2EuY29tPl0KCiAgKikgQWRkIG1vZF9jaGFyc2V0X2xpdGUgZm9yIGNvbmZpZ3VyaW5nIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24uCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkICctbicgb3B0aW9uIHRvIGh0cGFzc3dkIHRvIG1ha2UgaXQgcHJpbnQgaXRzIHVzZXI6cHcgcmVjb3JkCiAgICAgb24gc3Rkb3V0IHJhdGhlciB0aGFuIGhhdmluZyB0byBmcm9iIGEgdGV4dCBmaWxlLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggc2FmZXJlYWQuICBCYXNpY2FsbHksIHdlIGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGlmIGEgcmVhZCBvbiB0aGUKICAgICBpbnB1dCB3aWxsIGJsb2NrLgogICAgIFtSeWFuIEJsb29tXQogCiAgKikgQVBSOiBBZGQgYXBfeGxhdGVfZ2V0X3NiKCkgc28gdGhhdCBhbiBhcHAgY2FuIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90CiAgICAgYSBjb252ZXJzaW9uIGlzIHNpbmdsZS1ieXRlIG9ubHkuIFtKZWZmIFRyYXdpY2tdCgogICopIEJFT1M6IGFwX3NodXRkb3duIHNob3VsZCByZXR1cm4gQVBSX1NVQ0NFU1Mgb3IgZXJybm8uIE5vdGUgdGhhdAogICAgIHRoZSBCZU9TIDUuMCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBzaHV0ZG93biBkb2Vzbid0IHdvcmsgeWV0LgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBzb21lIG1pbm9yIGVycm9ycyB3aGVyZSBwaWQgd2FzIGJlaW5nIG1hbmlwdWxhdGVkIGFzIGFuIGludAogICAgIGluc3RlYWQgb2YgdGhlIHBvcnRhYmxlIHBpZF90LiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IHNvbWUgZXJyb3IgbG9nIHByaW50cyB0aGF0IHdlcmUgcHJpbnRpbmcgdGhlIHBvaW50ZXIgdG8gYQogICAgIHN0cnVjdHVyZSByYXRoZXIgdGhhbiB0aGUgcGlkIHdpdGhpbiB0aGUgc3RydWN0dXJlLgogICAgIFtKZWZmIFRyYXdpY2ssIFJveSBGaWVsZGluZ10KCiAgKikgYWI6IEZpeCBhIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nIGJ1ZzsgdHJhY2sgYmFkIGhlYWRlcnMgaW4gCiAgICAgZXJyX3Jlc3BvbnNlOyBzdXBwb3J0IHJlYWRpbmcgaGVhZGVycyB1cCB0byAySy4gCiAgICAgW0FzayBCam9lcm4gSGFuc2VuIDxhc2sgdmFsdWVjbGljay5jb20+XQoKICAqKSBGaXggYXBfcmVzb2x2ZV9lbnYoKSBzbyB0aGF0IGl0IGhhbmRsZXMgbmV3IGZ1bmN0aW9uIGFkZGVkIGluIGEgcHJpb3IKICAgICBhbHBoYSAoc2VlICJBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKICAgICBjb25maWcgZmlsZS4iKSBhcyB3ZWxsIGFzIHRoZSBjb25zdHJ1Y3RzIHVzZWQgYnkgbW9kX3Jld3JpdGUuCiAgICAgW1BhdWwgUmVkZXIgPHJlZGVycGogcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgQXBhY2hlIDIuMCBidWlsZHMgYW5kIHJ1bnMgb24gT1MvMzkwLiBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXNdCgogICopIENoYW5nZSB0aGUgRUJDRElDIHN1cHBvcnQgaW4gZnVuY3Rpb25zIGZvciBNRDUsIFNIQTEsIGFuZCBiYXNlIDY0IHRvIHVzZQogICAgIEFQUiB0byBwZXJmb3JtIHRyYW5zbGF0aW9uLCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyB0aGUgaGFyZC1jb2RlZCB0YWJsZXMKICAgICBpbiAxLjMncyBlYmNkaWMuYy4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IHNvbWUgYnVncyAobW9zdGx5IGxvc3QgMS4zIGNvZGUpIGluIGFiJ3MgY29tbWFuZC1saW5lIHByb2Nlc3NpbmcuIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBob29rIGludG8gdGhlIGNvbmZpZyBmaWxlIHJlYWRpbmcgcGhhc2UuICBCYXNpY2FsbHkKICAgICBpZiBhIGRpcmVjdGl2ZSBpcyBzcGVjaWZpZWQgRVhFQ19PTl9SRUFELCB0aGVuIHdoZW4gdGhhdCBkaXJlY3RpdmUgaXMKICAgICByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCB0aGUgYXNzb2NhaXRlZCBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIFRoaXMKICAgICBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0aG9zZSBkaXJlY3RpdmVzIHRoYXQgbXVzdCBtdWNrIHdpdGggSE9XIHRoZQogICAgIHNlcnZlciBJTlRFUlBSRVRTIHRoZSBjb25maWcuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZGlyZWN0aXZlcwogICAgIHRoYXQgcmUtb3JkZXIgb3IgcmVwbGFjZSBpdGVtcyBpbiB0aGUgY29uZmlnIHRyZWUuICBUaG9zZSBjaGFuZ2VzIHNob3VsZAogICAgIGJlIG1hZGUgaW4gdGhlIHByZS1jb25maWcgc3RlcC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIG1vZF9leGFtcGxlIHRvIHRoZSBidWlsZCBzeXN0ZW0uCiAgICAgW1RvbnkgRmluY2hdCgogICopIEFQUjogQWRkIGFwX3hsYXRlX2NvbnZfYnl0ZSgpIHRvIGNvbnZlcnQgb25lIGNoYXIgYmV0d2VlbiBzaW5nbGUtCiAgICAgYnl0ZSBjaGFyYWN0ZXIgc2V0cy4gW0plZmYgVHJhd2lja10KCiAgKikgUGljayB1cCB2YXJpb3VzIEVCQ0RJQyBmaXhlcyBmcm9tIDEuMyAoZnJvbSBNYXJ0aW4KICAgICBLcmFlbWVyIGFuZCBPbGl2ZXIgUmVoIG9yaWdpbmFsbHkgYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2UgbG9nKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgcHJvYmxlbXMgaW4gUkZDMTQxMyBzdXBwb3J0IChjb250cm9sbGVkIGJ5IHRoZQogICAgIElkZW50aXR5Q2hlY2sgZGlyZWN0aXZlKS4gIEFwYWNoZSBkaWQgbm90IGJ1aWxkIHRoZSByZXF1ZXN0IHN0cmluZwogICAgIHByb3Blcmx5IGFuZCBtb3JlIGltcG9ydGFudGx5IEFwYWNoZSB3b3VsZCBsb29wIGZvcmV2ZXIgaWYgdGhlIAogICAgIHdvdWxkLWJlIGlkZW50IHNlcnZlciBkcm9wcGVkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBzZW5kaW5nIGEKICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkIHJlc3BvbnNlLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcHhzIHdvcmtzIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVsaWFibGUgcGlwZWQgbG9ncyB3b3JrIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgSW50cm9kdWNlIGEgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBpbnRvIEFQUiB0byBiZSB1c2VkIGZvcgogICAgIHJlcGxhY2luZyB0YWJsZXMgYW5kIG90aGVyIHJhbmRvbSBkYXRhIHN0cnVjdHVyZXMgaW4gQXBhY2hlLgogICAgIFtUb255IEZpbmNoXQoKICAqKSBBZGQgc29tZSBtb3JlIGVycm9yIHJlcG9ydGluZyB0byBodHBhc3N3ZCBpbiB0aGUgY2FzZSBvZiBwcm9ibGVtcwogICAgIGdlbmVyYXRpbmcgb3IgYWNjZXNzaW5nIHRoZSB0ZW1wb3JhcnkgZmlsZS4gIEFsc28sIHBhc3MgaW4gYQogICAgIGJ1ZmZlciBpZiB0aGUgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IHRvIHVzZSBpdCAoaS5lLiwgaWYgTF90bXBuYW0KICAgICBpcyBkZWZpbmVkKS4gIFtLZW4gQ29hcl0KCiAgKikgQ29uZmlndXJlIGNyZWF0ZXMgY29uZmlnLm5pY2Ugbm93IGNvbnRhaW5pbmcgeW91ciBjb25maWd1cmUKICAgICBvcHRpb25zLiBTeW50YXg6IC4vY29uZmlnLm5pY2UgWy0tbW9yZS1vcHRpb25zXQogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCB2YXJpb3VzIHJldHVybiBjb2RlIHByb2JsZW1zIGluIEFQUiBvbiBXaW4zMi4gIEZvciBtb3N0IG9mCiAgICAgdGhlc2UsIEFQUiB3YXMgcmV0dXJuaW5nIEFQUl9FRVhJU1QgaW5zdGVhZCBvZiBHZXRMYXN0RXJyb3IoKS8KICAgICBXU0FHZXRMYXN0RXJyb3IoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgcGlwZWQgbG9ncyB3b3JrIGFnYWluIGluIHZlcnNpb24gMi4wCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCBWUEFUSCBzdXBwb3J0IHRvIFVOSVggYnVpbGQgc3lzdGVtIG9mIEFwYWNoZSBhbmQgQVBSLgogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCBhcF90b2tlbml6ZV90b19hcmd2IHRvIHJlc3BlY3QgdGhlIGNvbnN0IGFyZ3VtZW50cyB0aGF0IGFyZQogICAgIHBhc3NlZCB0byBpdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IG1tJ3MgbWVtY3B5L21lbXNldCBtYWNyb3MsIHBvaW50ZXIgYXJpdGhtZXRpYyB3YXMgYnJva2VuLgogICAgIFBhdGNoIHN1Ym1pdHRlZCB0byBhdXRob3IuCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KCiAgKikgRml4IG1tIGNvbmZpZ3VyYXRpb24gb24gU29sYXJpcyA4IHg4NiBhbmQgT1MvMzkwLiAgRG9uJ3QgcmVxdWlyZQogICAgIC9zYmluIGluIFBBVEggb24gRnJlZUJTRCAoYWxsIHN1Ym1pdHRlZCB0byByc2UgcHJldmlvdXNseSkgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGJ1aWxkaW5nIFB0aHJlYWQtYmFzZWQgTVBNcyBvbiBPcGVuQlNECiAgICAgW1Nhc2NoYSBTY2h1bWFubl0gUFIjMjYKCiAgKikgRml4IGFwX3JlYWRkaXIoKSBwcm9ibGVtIG9uIHN5c3RlbXMgd2hlcmUgZF9uYW1lW10gZmllbGQgaW4KICAgICBzdHJ1Y3QgZGlyZW50IGlzIGRlY2xhcmVkIHdpdGggb25seSBvbmUgYnl0ZS4gIChUaGlzIHByb2JsZW0gb25seSAKICAgICBhZmZlY3RlZCBtdWx0aXRocmVhZGVkIGJ1aWxkcy4pICBUaGlzIGNhdXNlZCBhIHNlZ2ZhdWx0IGR1cmluZwogICAgIHBvb2wgY2xlYW51cCB3aXRoIG1vZF9hdXRvaW5kZXggb24gU29sYXJpcyAoU29sYXJpcyA4IHg4NiwgYXQgCiAgICAgbGVhc3QpLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggc29tZSBtYWtlLXBvcnRhYmlsaXR5IHByb2JsZW1zIG9uIGF0IGxlYXN0IFRydTY0LCBJcml4CiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIFBSIzE4LCBQUiMzOQoKICAqKSBBZGQgYXBfc2lnd2FpdCgpIHRvIHN1cHBvcnQgb2xkLXN0eWxlIHNpZ3dhaXQoKSBvbiBzeXN0ZW1zCiAgICAgbGlrZSBPUy8zOTAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIAoKICAqKSBBZGQgUE9TSVgtdGhyZWFkIGZsYWdzIGZvciBtb3JlIHBsYXRmb3Jtcy4KICAgICBbU2FzY2hhIFNjaHVtYW5uXQoKICAqKSBGaXggc29tZSBtaW5vciBidWdzIGluIGFwX3N0cmVycm9yKCkuICBUZWFjaCBhcF9zdHJlcnJvcigpCiAgICAgKG9uIFVuaXgsIGF0IGxlYXN0KSB0byBoYW5kbGUgcmVzb2x2ZXIgZXJyb3JzLiAgRml4IGEgYnVnIGluCiAgICAgdGhlIGRlZmluaXRpb24gb2YgQVBSX0VOT01FTSBzbyB0aGF0IGFwX3N0cmVycm9yKCkgY2FuIHNwaXQKICAgICBvdXQgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgaXQuCiAgICAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTMKCiAgKikgbW9kX3NvIHJlcG9ydHMgYXBfb3NfZHNvX2Vycm9yKCkgaWYgYXBfZHNvX2xvYWQoKSBmYWlscwogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogKkhPT0sqIG1hY3JvcyBub3cgaGF2ZSBhbiBBUF8gcHJlZml4CiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZSByZWR1bmRhbnQgY2FsbHMgdG8gaW5pdGlhbGl6ZSB3aW5zb2NrLgogICAgIFtUaW0gQ29zdGVsbG8gPHRpbWNvc3RlbGxvIG96ZW1haWwuY29tLmF1Pl0KCiAgKikgRml4IGJ1Z3MgaW5pdGlhbGl6aW5nIHVuZ2V0Y2hhciBmb3IgcGlwZXMuIAogICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW8gQ2lyWC5PUkc+XQoKICAqKSBUaGUgYWIgcHJvZ3JhbSBpbiB0aGUgc3JjL3N1cHBvcnQgZGlyZWN0b3J5IGlzIG5vdyBwb3J0YWJsZSB1c2luZwogICAgIEFQUi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgU3VwcG9ydCBkaXJlY3RvcnkgaXMgYmVpbmcgY29tcGlsZWQgd2hlbiB0aGUgc2VydmVyIGlzIGJ1aWx0CiAgICAgW1J5YW4gQmxvb21dCgogICopIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wcm9ncmFtLW5hbWUgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKICAgICBkZXZlbG9wZXJzIHRvIHJlbmFtZSB0aGUgZXhlY3V0YWJsZSBhdCBjb25maWd1cmUgdGltZS4gIFRoaXMgYWxzbwogICAgIGNoYW5nZXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB0aGUgZXhlY3V0YWJsZSdzIG5hbWUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIG1vZF9hdXRvaW5kZXg6IEFkZCBgSW5kZXhPcHRpb25zICtWZXJzaW9uU29ydCcsIHRvIG5pY2VseSBzb3J0IGZpbGVuYW1lcwogICAgIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzLiBbTWFydGluIFBvb2xdCgogICopIGFwX29wZW4oLi4sQVBSX09TX0RFRkFVTFQsLi4pIHVzZXMgcGVybXMgMDY2NiBpbnN0ZWFkIG9mIDA3Nzcgb24KICAgICBVbml4OyBhY2Nlc3NfbG9nIGFuZCBlcnJvcl9sb2cgbm93IGNyZWF0ZWQgd2l0aCB0aGVzZSBwZXJtczsgbm9uLQogICAgIFVuaXggaXMgdW5hZmZlY3RlZCBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIEZpbmlzaGVkIG1vdmUgb2YgYXBfbWQ1IHJvdXRpbmVzIHRvIGFwcl9tZDUuICBSZW1vdmVkIGFwX21kNS5oLgogICAgIFJlcGxhY2VkIG1vcmUgbWFnaWMgbnVtYmVycyB3aXRoIE1ENV9ESUdFU1RTSVpFLgogICAgIFtXaWxsaWFtIFJvd2UsIFJveSBGaWVsZGluZ10KCiAgKikgV2luMzI6IEdldCBtb2RfYXV0aF9kaWdlc3QgY29tcGlsaW5nIGFuZCBhZGRlZCB0byB0aGUgV2luZG93cwogICAgIGJ1aWxkIGVudmlyb25tZW50LiBOb3QgdGVzdGVkIGFuZCBJJ2QgYmUgc3VwcmlzZWQgaWYgaXQgCiAgICAgYWN0dWFsbHkgd29ya3MuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBSZXZhbXAgdGhlIFdpbjMyIG1ha2UgZW52aXJvbm1lbnQuIE1ha2VmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQKICAgICBBcGFjaGUuZHN3IGNyZWF0ZWQgdG8gYnJpbmcgdG9nZXRoZXIgYWxsIHRoZSBwaWVjZXMuIENyZWF0ZSBuZXcgZmlsZQogICAgIG9zL3dpbjMyL0Jhc2VBZGRyLnJlZiB0byBkZWZpbmUgbW9kdWxlIGJhc2UgYWRkcmVzc2VzICh0byBwcmV2ZW50CiAgICAgZGxsIHJlbG9jYXRpb24gYXQgc3RhcnQtdXApLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgTWFyciwgVGltIENvc3RlbGxvLCBCaWxsIFN0b2RkYXJkXQoKICAqKSBbRUJDRElDXSBQb3J0IFBhdWwgR2lsbWFydGluJ3MgQ1JMRiBwYXRjaCBmcm9tIDEuMy4gIFRoaXMgcmVwbGFjZXMgbW9zdAogICAgIG9mIHRoZSBcMDE1LCBcMDEyLCBhbmQgXDAxNVwwMTIgY29uc3RhbnRzIHdpdGggbWFjcm9zLgogICAgIFtHcmVnIEFtZXNdCiAgICAgCiAgKikgQWRkIGFwX3hsYXRlX29wZW4oKSBldCBhbCBmb3IgdHJhbnNsYXRpb24gb2YgdGV4dCBiZXR3ZWVuIGRpZmZlcmVudCAKICAgICBjaGFyYWN0ZXIgc2V0cy4gIFRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGljb252KCkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTW9yZSBGQVFzIGFuZCBhbnN3ZXJzIGZyb20gY29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4LgogICAgIFtKb3NodWEgU2xpdmUgPHNsaXZlIGZpbmFuY2UuY29tbWVyY2UudWJjLmNhPl0KCiAgKikgQ0dJIG91dHB1dCBpcyBiZWluZyB0aW1lZCBvdXQgbm93LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggdGhlIHByb2JsZW0gd2l0aCBkaWVpbmcgcXVpZXRseS4gIGR1cGZpbGUgbm93IHRha2VzIGEgcG9vbCB3aGljaAogICAgIGlzIHVzZWQgYnkgdGhlIG5ldyBhcHIgZmlsZS4gIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBjcmVhdGUgYSBuZXcgZmlsZQogICAgIHdpdGggdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGUuCiAgICAgW1J5YW4gQmxvb21dIAoKICAqKSBXaW4zMjogQXR0ZW1wdCB0byBlbGltaW5hdGUgZGxsIHJlbG9jYXRpb24gYXQgc3RhcnQtdXAgYnkgc3BlY2lmeWluZwogICAgIG1vZHVsZSBiYXNlIGFkZHJlc3Nlcy4gVGhpcyB3aWxsIGhlbHAgc2hvb3Rpbmcgc2VnIGZhdWx0cwogICAgIGluIHRoZSBmaWVsZC4gW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIFVwZGF0ZSBBcGFjaGUgb24gV2luZG93cyBkb2N1bWVudGF0aW9uLiBBZGQgbmV3IGRvY3VtZW50CiAgICAgZGVzY3JpYmluZyBob3cgdG8gY29tcGlsZSBBcGFjaGUgb24gV2luZG93cy4KICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0KCiAgKikgYXBfc2V0X3BpcGVfdGltZW91dCgpLCBhcF9wb2xsKCksIGFuZCBBUFJfU09fVElNRU9VVCBub3cgdGFrZSAKICAgICBtaWNyb3NlY29uZHMgaW5zdGVhZCBvZiBzZWNvbmRzLiAgU29tZSBzdG9yYWdlIGxlYWtzIGFuZCBvdGhlcgogICAgIG1pbm9yIGJ1Z3MgaW4gcmVsYXRlZCBjb2RlIHdlcmUgZml4ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogRmlyc3QgY3V0IGF0IGdldHRpbmcgbW9kX2lzYXBpIHdvcmtpbmcgdW5kZXIgMi4wCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIEZpcnN0IHN0YWIgYXQgZ2V0dGluZyBtb2RfYXV0aF9kaWdlc3Qgd29ya2luZyB1bmRlciAyLjAKICAgICBxdWljayBjaGFuZ2Ugc3VtbWFyeToKICAgICAtIG1vdmVkIHRoZSByYW5kb20gYnl0ZSBnZW5lcmF0aW9uIChhcF9nZW5lcmF0ZV9yYW5kb21fYnl0ZXMpIGludG8gQVBSCiAgICAgLSBub3cgdXNlcyBhcF90aW1lX3QKICAgICAtIGNvbXBpbGVzIGFuZCBydW5zIG9uIGxpbnV4CiAgICAgLSB0ZXN0ZWQgd2l0aCBhbWF5YQogICAgIFtCcmlhbiBNYXJ0aW4gPGJtYXJ0aW4gcGVuZ3VpbmNvbXB1dGluZy5jb20+XQoKICAqKSBXaW4zMjogTW92ZSB0aGUgc3BhY2Ugc3RyaXBwaW5nIG9mIHBoeXNpY2FsIHNlcnZpY2UgbmFtZXMKICAgICBmaXggdXAgZnJvbSBBcGFjaGUgMS4zLiAjaW5jbHVkZSdpbmcgImFwX21wbS5oIiBmaXhlcyB1cCBhbgogICAgIHVucmVzb2x2ZWQgc3ltYm9sLiBBZGQgZGVwZW5kZW5jeSBjaGVja2luZyB0byB0aGUKICAgICBDcmVhdGVTZXJ2aWNlIGNhbGwgdG8gZW5zdXJlIFRDUElQIGFuZCBBRlAgKHdpbnNvY2spIGlzIHN0YXJ0ZWQKICAgICBiZWZvcmUgQXBhY2hlLgogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlIGxuZC5jb20+XQoKICAqKSBXaW4zMjogQWRkIGNvZGUgdG8gcGVyZm9ybSBsYXRlYmluZGluZyBvbiBmdW5jdGlvbnMgdGhhdCBtYXkKICAgICBub3QgZXhpc3Qgb24gYWxsIGxldmVscyBvZiBXaW5kb3dzIHdoZXJlIEFwYWNoZSBydW5zLiBUaGlzCiAgICAgaXMgbmVlZGVkIHRvIGFsbG93IEFwYWNoZSB0byBzdGFydC11cCBvbiBXaW45NS85OC4gQWxsIGNhbGxzCiAgICAgdG8gbm9uIHBvcnRhYmxlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdGVjdGVkIHdpdGgKICAgICBhcF9vc2xldmVsIGNoZWNrcyB0byBwcmV2ZW50IHJ1bnRpbWUgc2VnZmF1bHRzLiAKICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0KCiAgKikgRml4IGZhbGxiYWNrIGRlZmF1bHQgdmFsdWVzIGZvciBTSE1fUiBhbmQgU0hNX1cgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBHZXQgbGluZ2VyaW5nX2Nsb3NlKCkgd29ya2luZyBhZ2Fpbi4gW0RlYW4gR2F1ZGV0LCBKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBHZXQgbm9uLWJsb2NraW5nIENHSSBwaXBlIHJlYWRzIHdvcmtpbmcgdW5kZXIgV2luZG93cyBOVC4KICAgICBUaGlzIGFkZHJlc3NlcyBQUiAxNjIzLiBTdGlsbCBuZWVkIHRvIGFkZHJlc3MgdGltaW5nIG91dCBydW5hd2F5CiAgICAgQ0dJIHNjcmlwdHMuIFtCaWxsIFN0b2RkYXJkXQogCiAgKikgV2luMzI6IE1ha2UgYXBfc3RhdCBXaW5kb3dzIDk1Lzk4IGZyaWVuZGx5CiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgKikgV2luMzI6IEZpeCBhIGJ1ZyBpbiBhcF9nZXRfb3NsZXZlbCB3aGljaCBjYXVzZXMgR2V0VmVyc2lvbkV4KCkgdG8gCiAgICAgYWx3YXlzIGZhaWwuIE5lZWQgdG8gaW5pdGlhbGlzZSB0aGUgZHdPU1ZlcnNpb25JbmZvU2l6ZSBtZW1iZXIgb2YgdGhlIAogICAgIE9TVkVSU0lPTklORk8gc3RydWN0IGJlZm9yZSBjYWxsaW5nIEdldFZlcnNpb25FeCwgc28gR2V0VmVyc2lvbkV4IAogICAgIGFsd2F5cyBmYWlscy4gCgogICAgIFRoZSBwYXRjaCBhbHNvIGVuaGFuY2VzIGFwX2dldF9vc2xldmVsIChhbmQgdGhlIGFzc29jaWF0ZWQgZW51bSkgdG8gCiAgICAgaGFuZGxlIHNlbGVjdGVkIHNlcnZpY2UgcGFja3MgZm9yIE5UNCwgYW5kIGFkZHMgcmVjb2duaXRpb24gZm9yIAogICAgIFdpbmRvd3MgMjAwMC4gVGhpcyBpcyB1c2VmdWwsIGVnLiBpZiB3ZSBjYW4gcmVjb2duaXNlIE5UNCBTUDIgdGhlbiAKICAgICB3ZSBjYW4gdXNlIFJlYWRGaWxlU2NhdHRlciBhbmQgV3JpdGVGaWxlR2F0aGVyIGluIHJlYWR3cml0ZS5jLiAKICAgICBbVGltIENvc3RlbGxvIDxUaW0uQ29zdGVsbG8gQlRGaW5hbmNpYWxncm91cC5jb20+XQoKICAqKSBHZXQgbW9kX3Jld3JpdGUgYnVpbGRpbmcgYW5kIHJ1bm5pbmcsIGFuZCBtb2Rfc3RhdHVzIGJ1aWxkaW5nIGZvciBXaW4gTlQKICAgICBbQWxsYW4gRWR3YXJkcyA8YWtlIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIFBhdGNoIHRvIHBvcnQgbW9kX2F1dGhfZGIgdG8gdGhlIDIuMCBhcGkgYW5kIGFsc28gdG8gc3VwcG9ydCAKICAgICBCZXJsZWtleSBEQiAzLjAuIEl0IHdvcmtzIGZvciBtZSB3aXRoIGJvdGggQmVya2VsZXkgREIgMy4wLjU1IGFuZCAKICAgICAyLjcuNy4gIEl0IHNob3VsZCB3b3JrIHdpdGggdmVyc2lvbiAxIGFzIHdlbGwgYnV0IEkgaGF2ZW4ndCB0ZXN0ZWQgaXQuICAKICAgICBbQnJpYW4gTWFydGluIDxibWFydGluIHBlbmd1aW5jb21wdXRpbmcuY29tPl0KCiAgKikgR2V0IEFQUiBEU08gY29kZSB3b3JraW5nIHVuZGVyIFdpbmRvd3MuIEluY2x1ZGVzIGNyb3NzIHBsYXRmb3JtCiAgICAgZml4ZXMgdG8gbW9kX3NvLmMuCiAgICAgWzxUaW0uQ29zdGVsbG8gQlRGaW5hbmNpYWxncm91cC5jb20+XQoKICAqKSBGaXggc29tZSBvZiB0aGUgV2luZG93cyBBUFIgdGltZSBmdW5jdGlvbnMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRkFRIGNoYW5nZXMgcmVsYXRlZCB0byB0aWR5aW5nIHVwIGhpc3RvcmljYWwgZG9jdW1lbnRzIG9uIHRoZSB3ZWIgc2l0ZS4KICAgICBbSm9zaHVhIFNsaXZlIDxzbGl2ZSBmaW5hbmNlLmNvbW1lcmNlLnViYy5jYT5dCgogICopIE1vdmUgV2luZG93cyBEU08gY29kZSBpbnRvIEFQUi4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRWxpbWluYXRlIGFwcl93aW4uaCBhbmQgYXByX3dpbmNvbmZpZy5oIChhbmQgdGhlIHVnbHkgI2lmZGVmcyB0aGV5IGNhdXNlKS4KICAgICBOb3csIGFwci5oIGFuZCBhcHJfY29uZmlnLmggYXJlIGdlbmVyYXRlZCBmcm9tIGFwci5odyBhbmQgYXByX2NvbmZpZy5odwogICAgIGF0IGJ1aWxkIHRpbWUuIEF0IHRoaXMgcG9pbnQsIHRoZSBzZXJ2ZXIgd2lsbCBub3QgY29tcGlsZSBvbiBXaW5kb3dzIGJlY2F1c2UKICAgICBvZiB0aGUgcmVjZW50IERTTyBjb21taXRzLiBGaXhpbmcgdGhvc2UgbmV4dC4KICAgICBbQmlsbCBSb3dlICYgQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkZWQgZXJyb3IgY2hlY2tpbmcgZm9yIGZpbGUgSS9PIEFQUiByb3V0aW5lcy4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBBUFI6IERvbid0IHVzZSB0aGUgdmFsdWVzIG9mIHJlc29sdmVyIGVycm9yIGNvZGVzIGZvciB0aGUgCiAgICAgY29ycmVzcG9uZGluZyBBUFIgZXJyb3IgY29kZXMuICBPbiBVbml4IGFuZCBXaW4zMiwgcmV0dXJuIHRoZSAKICAgICBwcm9wZXIgQVBSIGVycm9yIGNvZGUgYWZ0ZXIgYSByZXNvbHZlciBlcnJvci4gW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTIKCiAgKikgUmVuYW1lZCB0aGUgZXhlY3V0YWJsZSBiYWNrIHRvIGh0dHBkIG9uIGFsbCBwbGF0Zm9ybXMgb3RoZXIgCiAgICAgdGhhbiBXaW4zMgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBCZU9TIHRvIHN1cnZpdmUgcmVzdGFydHMsIGxvZyBwcm9wZXJseSBhbmQgYSBmZXcKICAgICBzbWFsbCB0aGluZ3MgaXQgaGFkIHByb2JsZW1zIHdpdGggZHVlIHRvIHRoZSB3YXkgaXQgc2V0dXAKICAgICB1c2VycyBhbmQgZ3JvdXBzLiBbRGF2aWQgUmVpZF0KCiAgKikgR2V0IG1vZF9yZXdyaXRlIHdvcmtpbmcgd2l0aCBBUFIgbG9ja3MKICAgICBbUGF1bCBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBBY3R1YWxseSByZW1vdmUgdGhlIHNlbXBhaG9yZSB3aGVuIHRoZSBsb2NrIGNsZWFudXAgcm91dGluZQogICAgIGlzIGNhbGxlZCBvbiBCZU9TLiBbRGF2aWQgUmVpZF0KCiAgKikgQ2xlYXIgaG9vayByZWdpc3RyYXRpb25zIGJldHdlZW4gcmVhZHMgb2YgdGhlIGNvbmZpZyBmaWxlLgogICAgIFdoZW4gRFNPcyBhcmUgdW5sb2FkZWQgYW5kIHJlLWxvYWRlZCB0aGUgb2xkIGhvb2sgcG9pbnRlcnMgbWF5CiAgICAgbm8gbG9uZ2VyIGJlIHZhbGlkLiBUaGlzIGZpeCBlbGltaW5hdGVzIHBvdGVudGlhbCBzZWdmYXVsdHMuCiAgICAgW0FsbGFuIEVkd2FyZHMgPGFrZSByYWxlaWdoLmlibS5jb20+XQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggU2lnZnVuYyBub3QgYmVpbmcgZGVmaW5lZCBvciBieXBhc3NlZAogICAgIGlmIHNpZ2FjdGlvbigpIHdhc24ndCBmb3VuZC4gW0ppbSBKYWdpZWxza2ldCgogICopIEZpeCB0aGUgbG9ja2luZyBtZWNoYW5pc20gb24gQlNEIHZhcmlhbnRzLiAgVGhleSBub3cgdXNlIGZjbnRsCiAgICAgbG9ja3MuICBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIHN0YXJ0IGFuZCBzZXJ2ZSBwYWdlcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRmlyc3QgY3V0IGF0IGdldHRpbmcgdGhlIFdpbjMyIGluc3RhbGxlciB0byB3b3JrCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIEdldCBodHBhc3N3ZCBjb21waWxpbmcgdW5kZXIgV2luZG93cwogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlIGxuZC5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIGxvZyBtZXNzYWdlIGZvciBhIGJpbmQoKSBmYWlsdXJlIHRvIHNob3cgdGhlCiAgICAgaW50ZXJmYWNlIGFuZCBwb3J0IG51bWJlci4gW0plZmYgVHJhd2lja10KCiAgKikgSW1wb3J0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20gMS4zLjEyIGFuZCBicmluZyBwYXJ0cyBvZiBpdAogICAgIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZAogICAgIGluIDIuMC4KICAgICBbVG9ueSBGaW5jaF0KCiAgKikgQmVPUyBNUE0gdXBkYXRlZC4gIENHSSBidWcgb24gQmVPUyBmaXhlZC4gIElQIGFkZHJlc3NlcwogICAgIG5vdyBsb2dnZWQgY29ycmVjdGx5IG9uIEJlT1MuCiAgICAgW0RhdmlkIFJlaWRdCgogICopIENyZWF0ZSBvbmUgbWFrZWZpbGUgZm9yIGFsbCBXaW4zMiBkaXN0cmlidXRpb25zIChOVC8yMDAwLzk1Lzk4KS4KICAgICBNYWtlZmlsZS53aW4gaW5jbHVkZXMgdGhlIHNhbWUgdXNlciBpbnRlcmZhY2UgYXMgdGhlIG9sZCAKICAgICBNYWtlZmlsZS5udCAKICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPiwgSmVmZiBUcmF3aWNrIDx0cmF3aWNrIHVzLmlibS5jb20+XQoKICAqKSBXaW4zMiBleGVjIG5vdyB1c2VzIENPTVNQRUMgZW52aXJvbm1lbnQgc3RyaW5nIGZvciBjb21tYW5kIAogICAgIHNoZWxsIHBhdGggcmVzb2x1dGlvbi4KICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0gUFIjMzcxNQoKICAqKSBXaW4zMjogYXBfY29ubmVjdCgpIHdhcyBub3QgcmV0dXJuaW5nIGNvcnJlY3QgZXJyb3IgY29uZGl0aW9uCiAgICAgUFI1ODY2CiAgICAgW0FsbGVuIFByZXNjb3R0IDxhbGxlbiBjbGFucHJlc2NvdHQuY29tPl0KCiAgKikgV2luMzI6IGFwX29wZW4oKSB3YXMgYnJva2VuIG9uIFdpbjl4IGJlY2F1c2UgYW4gTlQtc3BlY2lmaWMKICAgICBmbGFnIHdhcyBwYXNzZWQgdG8gQ3JlYXRlRmlsZS4gIGFwX3B1dHMoKSBhZGRlZCBhbiB1bm5lY2Vzc2FyeQogICAgICdcbicuCiAgICAgW0plZmYgVHJhd2ljayA8dHJhd2ljayB1cy5pYm0uY29tPl0KCiAgKikgUHV0IGluIEtvcmVhbiBhbmQgTm9yd2VnaWFuIGluZGV4Lmh0bWwgcGFnZXMgKDIuMCBhbmQgMS4zKQogICAgIHdoaWNoIHdoZXJlIGRvbmF0ZWQgYnkgTGVlIEt1ayBIeXVuIGFuZCBMb3JhbnQgQ3phcmFuLiAnRml4ZWQnCiAgICAgY29uZnVzaW5nIGVlL2V0IG5hbWUgYW5kIG1hZGUgYWxsIGV4dGVuc2lvbnMgbGFuZ3VhZ2UvZGlhbGVjdAogICAgIHJhdGhlciB0aGFuIGNvdW50cnkgcmVmbGVjdGluZy4gQ2hhbmdlZCBleGFtcGxlIGZpbGVzIHRvCiAgICAgZXhwbGljaXQgcmVmbGVjdCB0aGUgSVNPIGNoYXJzZXQgYW5kIGFkZGVkIGEgZmV3IGNvbW1vbiAKICAgICBvbmVzIHRvIHRoZSBleGFtcGxlIGNvbmZpZyBbZGlya3hdCgogICopIEV4dGVuZCBleHRlcm5hbCBtb2R1bGUgY2FwYWJpbGl0eS4gIFRvIHVzZSB0aGlzLCB5b3UgY2FsbAogICAgIGNvbmZpZ3VyZSB3aXRoIC0td2l0aC1tb2R1bGU9cGF0aC90by9tb2QxLHBhdGgvdG8vbW9kMixldGMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEJhY2twb3J0ZWQgdGhlIHZhcmlvdXMgImRlZmF1bHQgY2hhcnNldCIgZml4ZXMgZnJvbSAxLjMuMTIsCiAgICAgaW5jbHVkaW5nIHRoZSBBZGREZWZhdWx0Q2hhcnNldCBkaXJlY3RpdmUuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKICAgICBjb25maWcgZmlsZS4gRS5nLiAnU2VydmVyQWRtaW4gJHtQT1NUTUFTVEVSfScuIEFzIGNvbW1pdGVkCiAgICAgaXQgZG9lcyB0aGlzIG9uIGEgbGluZSBieSBsaW5lIGJhc2lzOyBpLmUuIGlmIHRoZSBlbnZ2YXIKICAgICBleHBhbmRzIHRvIHNvbWV0aGluZyB3aXRoIHNwYWNlcyB5b3UgaGF2ZSB0byBwcm90ZWN0IGl0CiAgICAgYnkgYWRkaW5nIHF1b3RlcyBhcm91bmQgaXQgKFVubGVzcyBvZiBjb3Vyc2UgeW91IGV4cGVjdCBpdAogICAgIHRvIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQuIEFsdGVybmF0aXZlbHkgeW91CiAgICAgY2FuIGNvbXBpbGUgaXQgb24gYSBwZXIgdG9rZW4gYmFzaXM7IHdoaWNoIGlzIHdoYXQgcGVvcGxlCiAgICAgdXN1YWxseSBleHBlY3QgYnkgc2V0dGluZyBSRVNPTFZFX0VOVl9QRVJfVE9LRU4uIEJ1dCB0aGlzCiAgICAgaGFtcGVycyBmYW5jaWVyIGhhY2tzLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIENoYW5nZWQgdGhlICdFcnJvckRvY3VtZW50JyBzeW50YXggaW4gdGhhdCBpdCBOTyBsb25nZXIKICAgICBzdXBwb3J0cyB0aGUgYXN5bWV0cmljCgogICAgICAgICAgICAgICAgRXJyb3JEb2N1bWVudCAzMDEgIlNvbWUgbWVzc2FnZQoKICAgICBOb3RlIHRoZSBvcGVuaW5nICIgcXVvdGUsIHdpdGhvdXQgYSBjbG9zaW5nIHF1b3RlLiBJdCBub3cKICAgICBoYXMgZWl0aGVyIHRoZSBmb2xsb3dpbmcgc3ludGF4ZXMKCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCAvbG9jYWwvdXJpCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCBodHRwOi8vdmFsaWQvdXJsCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCAiU29tZSBNZXNzYWdlIgoKICAgICBUaGUgcmVjb2duaXRpb24gaGV1cmlzdGljIGlzOiBpZiBpdCBoYXMgYSBzcGFjZSBpdAogICAgIGlzIGEgbWVzc2FnZS4gSWYgaXQgaGFzIG5vIHNwYWNlcyBhbmQgc3RhcnRzIHdpdGggYSAvCiAgICAgb3IgaXMgYSB2YWxpZCBVUkwgdGhlbiB0cmVhdCBpdCB0aGF0IHdheS4gT3RoZXJ3aXNlIGl0CiAgICAgaXMgYXNzdW1lZCB0byBiZSBhIG1lc3NhZ2UuCgogICAgIFRoaXMgYnJlYWtzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IG1ha2VzIGxpdmUgYSBoZWxsCiAgICAgb2YgYSBsb3QgZWFzaWVyIGZvciBHVUkncyBhbmQgY29uZmlnIGZpbGUgcGFyc2Vycy4KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBDaGFuZ2VkICdDYWNoZU5lZ290aWF0ZWREb2NzJyBmcm9tIGl0cyBwcmVzZW50L25vdC1wcmVzZW50CiAgICAgc3ludGF4IGludG8gYSAnb24nIG9yICdvZmYnIHN5bnRheC4gQXMgaXQgY3VycmVudGx5IGlzIHRoZQogICAgIG9ubHkgbm9uIG5lc3RpbmcgdG9rZW4gd2hpY2ggdXNlcyBOT19BUkdTIGFuZCB0aHVzIGlzIGFuCiAgICAgYWJzb2x1dGUgcGFpbiBmb3IgYW55IGNvbmZpZyBpbnRlcmZhY2UgYXV0b21hdGlvbi4gVGhpcwogICAgIGJyZWFrcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBBZGQgYWJpbGl0eSB0byBhZGQgZXh0ZXJuYWwgbW9kdWxlcyB0byB0aGUgYnVpbGQgcHJvY2Vzcy4gIFRoaXMgaXMKICAgICBkb25lIHdpdGggLS13aXRoLW1vZHVsZT0vcGF0aC90by9tb2R1bGUuICBNb2R1bGVzIGNhbiBvbmx5IGJlIGFkZGVkCiAgICAgYXMgc3RhdGljIG1vZHVsZXMgYXQgdGhpcyBwb2ludC4KICAgICBbUnlhbiBCbG9vbV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTEKCiAgKikgRml4IEZyZWVCU0QgMy4zIGNvcmUgZHVtcC4KICAgICBCYXNpY2FsbHksIGFwX2luaXRpYWxpemUoKSBuZWVkcyB0byBnZXQgY2FsbGVkIGJlZm9yZSAKICAgICBjcmVhdGVfcHJvY2VzcygpLCBzaW5jZSBjcmVhdGVfcHJvY2VzcygpIHBhc3NlcyBvcF9vbiBzdHJ1Y3R1cmUKICAgICB0byBzZW1vcCgpIHRvIGdldCBhIGxvY2ssIGJ1dCBvcF9vbiBpc24ndCBpbml0aWFsaXplZCB1bnRpbCAKICAgICBhcF9pbml0aWFsaXplKCkgY2FsbHMgc2V0dXBfbG9jaygpLiAgSGVyZSBpcyBhIHNsaWdodAogICAgIHJlYXJyYW5nZW1lbnQgdG8gbWFpbigpIHdoaWNoIGNhbGxzIGFwX2luaXRpYWxpemUoKSBlYXJsaWVyLi4uCiAgICAgW0plZmYgVHJhd2ljayA8dHJhd2ljayB1cy5pYm0uY29tPl0KCiAgKikgRW5hYmxlIEFwYWNoZSB0byB1c2Ugc2VuZGZpbGUvVHJhbnNtaXRGaWxlIEFQSQogICAgIFtCaWxsIFN0b2RkYXJkLCBEYXZpZCBSZWlkLCBQYXVsIFJlZGVyXQoKICAqKSBSZS1JbXBsZW1lbnQgV2luMzIgQVBSIG5ldHdvcmsgSS9PIEFQSXMgYW5kIG1vc3Qgb2YgdGhlIGZpbGUgSS9PCiAgICAgQVBJcy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTWFrZSBmaWxlIEkvTyBhbmQgbmV0d29yayBJL08gd3JpdGV2L3NlbmR2IEFQSXMgY29uc2lzdGVudC4KICAgICBFbGltaW5hdGUgdXNlIG9mIGFwX2lvdmVjX3QgYW5kIHVzZSBQb3NpeCBzdHJ1Y3QgaW92ZWMuCiAgICAgVXNlIHNlcGVyYXRlIHZhcmlhYmxlIG9uIGFwX3dyaXRldiB0byBzZXQgdGhlIG51bWJlciBvZiBpb3ZlY3MKICAgICBwYXNzZWQgaW4gYW5kIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGFwdCBmaWxlIGlvbCB0byB1c2UgQVBSIGZ1bmN0aW9ucy4gUmVwbGFjZWQgYXBfb3Blbl9maWxlKCkgCiAgICAgd2l0aCBhcF9jcmVhdGVfZmlsZV9pb2woKS4gYXBfY3JlYXRlX2ZpbGVfaW9sKCkgcmVxdWlyZXMgdGhhdCAKICAgICB0aGUgZmlsZSBiZSBvcGVuZWQgcHJpb3IgdG8gdGhlIGNhbGwgdXNpbmcgYXBfb3BlbigpLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBQb3J0IG1vZF9pbmNsdWRlIGFuZCBtb2RfY2dpIHRvIDIuMAogICAgIFtQYXVsIFJlZGVyLCBCaWxsIFN0b2RkYXJkXQoKICAqKSBhcF9zZW5keyx2fSwgYXBfcmVjdiwgYXBfc2VuZGZpbGUgQVBJIGNsYXJpZmljYXRpb24gLS0KICAgICBieXRlc19yZWFkL2J5dGVzX3dyaXR0ZW4gaXMgYWx3YXlzIHZhbGlkIChuZXZlciAtMSkuICBQbHVzCiAgICAgc29tZSBmaXhlcyB0byBidWZmLmMgdG8gY29ycmVjdCBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IHRoZQogICAgIGVycm5vID0+IGFwX3N0YXR1c190IGNoYW5nZXMgYSB3aGlsZSBiYWNrLiAgUGx1cyBhIGZpeCB0bwogICAgIGNodW5rZWQgZW5jb2RpbmcgaW50cm9kdWNlZCByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIDIuMC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFJldmFtcGVkIFVOSVggYnVpbGQgc3lzdGVtIHRvIHVzZSBhdXRvY29uZiBhbmQgbGlidG9vbC4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBTYXNjaGEgU2NodW1hbm5dCgogICopIHBvcnQgbW9kX3Jld3JpdGUgdG8gMi4wLiBbUGF1bCBKLiBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBTRUNVUklUWTogTW9yZSByaWdvcm91cyBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIHRvIGZpeCBzZWN1cml0eSAKICAgICBwcm9ibGVtcyB3aXRoIG1hc3MgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RpbmcgKHdoZXRoZXIgdXNpbmcgbW9kX3Jld3JpdGUKICAgICBvciBtb2Rfdmhvc3RfYWxpYXMpLgogICAgIFtCZW4gSHlkZSwgVG9ueSBGaW5jaF0KICAKICAqKSBBZGQgYmFjayBzdXBwb3J0IGZvciBVc2VDYW5vbmljYWxOYW1lIGluIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMuCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQWRkZWQgQVBMT0dfU1RBUlRVUCBsb2cgdHlwZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHdyaXRlIGFuIGVycm9yCiAgICAgbWVzc2FnZSB3aXRob3V0IGFueSBvZiB0aGUgZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gIEFzIGEgcGFydAogICAgIG9mIHRoaXMgY2hhbmdlLCBJIGFsc28gcmVtb3ZlZCBhbGwgb2YgdGhlIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyCiAgICAgYW5kIHJlcGxhY2VkIHRoZW0gd2l0aCBjYWxscyB0byBhcF9sb2dfZXJyb3IgdXNpbmcgQVBMT0dfU1RBUlRVUAogICAgIHdyaXRpbmcgdG8gc3RkZXJyIGlzIG5vIGxvbmdlciBwb3J0YWJsZSwgYmVjYXVzZSB3ZSBkb24ndCBkaXJlY3QgCiAgICAgc3RkZXJyIHRvIHRoZSBlcnJvciBsb2cgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUnlhbiBCbG9vbV0gCiAKICAqKSBDb252ZXJ0IGVycm9yIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRha2UgZXJybm8gYXMgYW4gYXJndW1lbnQuCiAgICAgVGhpcyBtYWtlcyBvdXIgZXJyb3IgbG9ncyBtb3JlIHBvcnRhYmxlLCBiZWNhdXNlIHNvbWUgV2luZG93cyBBUEkncyAKICAgICBkb24ndCBzZXQgZXJybm8uICBUaGlzIGNoYW5nZSBhbGxvd3MgdXMgdG8gc3RpbGwgb3V0cHV0IGEgdmFsaWQKICAgICBtZXNzYWdlIG9uIGFsbCBvZiBvdXIgcGxhdGZvcm1zLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfbWltZV9tYWdpYyBydW5zIGluIDIuMC1kZXYgbm93LgogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIHNlbmRmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIEFQUi4KICAgICBbSm9obiBaZWRsZXdza2kgPHplZGx3c2tpIFByaW5jZXRvbi5FRFU+XQoKICAqKSBidWZmLmMgaGFzIGJlZW4gY29udmVydGVkIHRvIG5vIGxvbmdlciB1c2UgZXJybm8uCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgbW9kX3NwZWxpbmcgcnVucyBpbiAyLjAtZGV2IG5vdzogYSBidWcgaW4gcmVhZGRpcl9yIGhhbmRsaW5nIGFuZAogICAgIGludGVyZmFjZSBhZGFwdGlvbiB0byBBUFIgZnVuY3Rpb25zIGRpZCBpdC4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBTdXBwb3J0IERTT3MgcHJvcGVybHkgb24gMzItYml0IEhQLVVYIDExLjAKICAgICBbRGlsaXAgS2hhbmRla2FyIDxkaWxpcCBjdXAuaHAuY29tPl0KCiAgKikgVXBkYXRlZCBNTSBpbiBBUFIgc291cmNlIHRyZWUgZnJvbSB2ZXJzaW9uIDEuMC44IHRvIDEuMC4xMQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbmVkIEFQUiBidWlsZCBlbnZpcm9ubWVudCBpbnRlZ3JhdGlvbiBhbmQgYm9vdHN0cmFwIEFQUiAKICAgICBhdXRvbWF0aWNhbGx5IGZvciBkZXZlbG9wZXJzIGZyb20gc3JjL0NvbmZpZ3VyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgYnVpbGRpbmcgb2Ygc3JjL3N1cHBvcnQvaHRwYXNzd2QuYwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgdGhlIExvY2F0aW9uOiBoZWFkZXIsIG1vZF9zcGVsaW5nIGZvcmdvdAogICAgIHRvIGVzY2FwZSB0aGUgc3BlbGxpbmctZml4ZWQgdXJpLiAoRm9ydy1Qb3J0IGZyb20gMS4zKQogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgbW9kX2F1dGhfZGlnZXN0LmMgZnJvbSBleHBlcmltZW50YWwgdG8gc3RhbmRhcmQuIFtSb3kgRmllbGRpbmddCgogICopIENoYW5nZSBhbGwgcG9vbHMgdG8gQVBSIGNvbnRleHRzLiAgVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCB0bwogICAgIGluY29ycG9yYXRpbmcgQVBSIGludG8gQXBhY2hlLiBbUnlhbiBCbG9vbV0KCiAgKikgTW92ZSAiaGFuZGxlciBub3QgZm91bmQiIHdhcm5pbmcgbWVzc2FnZSB0byBiZWxvdyB0aGUgY2hlY2sKICAgICBmb3IgYSB3aWxkY2FyZCBoYW5kbGVyLiAgW0RpcmsgPGRpcmttIHRlbGVwb3J0LmNvbT4sIFJveSBGaWVsZGluZ10KICAgICBQUiMyNTg0LCBQUiMyNzUxLCBQUiMzMzQ5LCBQUiMzNDM2LCBQUiMzNTQ4LCBQUiM0Mzg0LCBQUiM0Nzk1LCBQUiM0ODA3CgogICopIFN1cHBvcnQgbGluZS1jb250aW51YXRpb24gZmVhdHVyZSBpbiBjb25maWcub3B0aW9uIGZpbGUgYW5kCiAgICAgYWxsb3cgdGhlIGxvYWRpbmcgb2YgbXVsdGlwbGUgb3B0aW9uIHNlY3Rpb25zIGF0IG9uY2UgdmlhCiAgICAgYGAtLXdpdGgtb3B0aW9uPTxzZWN0aW9uMT4sPHNlY3Rpb24yPiwuLi4nJwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWJ1aWx0IENWUyByZXBvc2l0b3J5IHdpdGggQXBhY2hlIDEuMy45IGFzIGJhc2lzLiAgW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgTVBNCgogICopIFVzZSBhc3luY2hyb25vdXMgQWNjZXB0RXgoKSBhbmQgYSBjb21wbGV0aW9uIHBvcnQgdG8gYWNjZXB0IGFuZAogICAgIGRpc3BhdGNoIGNvbm5lY3Rpb25zIHRvIHRocmVhZHMgaW4gV2luZG93cyBOVC8yMDAwLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgSW1wbGVtZW50IFdJTk5UIFdpbjMyIE1QTSBmcm9tIG9yaWdpbmFsIFdpbjMyIGNvZGUgaW4gaHR0cF9tYWluLmMKICAgICBbQmlsbCBTdG9kZGFyZF0gIAoKICAqKSBJbXBsZW1lbnQgdGhlIEFQQUNJIC0td2l0aC1vcHRpb24gZmFjaWxpdHkgCiAgICAgKHBlciBkZWZhdWx0IHVzZWQgdGhlIGNvbmZpZy5vcHRpb24gZmlsZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1QTSBCRU9TIHBvcnQuICBbRGF2aWQgUmVpZCA8YWJiMzcgZGlhbC5waXBleC5jb20+XQoKICAqKSBTdGFydCB0byBpbXBsZW1lbnQgbW9kdWxlLWRlZmluZWQgaG9va3MgdGhhdCBhcmUgYSkgZmFzdCBhbmQgYikgdHlwZXNhZmUuCiAgICAgUmVwbGFjZSBwcmVfY29ubmVjdGlvbiBtb2R1bGUgY2FsbCB3aXRoIGEgcmVnaXN0ZXJfaG9vayBjYWxsIGFuZAogICAgIGltcGxlbWVudCBwcmVfY29ubmVjdGlvbiBhcyBhIGhvb2suIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGVzZSBob29rcyB3aWxsCiAgICAgYmUgZXh0ZW5kZWQgdG8gYWxsb3cgQXBhY2hlIHRvIGJlIG11bHRpLXByb3RvY29sLCBhbmQgYWxzbyB0byBhbGxvdyB0aGUKICAgICBjYWxsaW5nIG9yZGVyIHRvIGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob29rL3Blci1tb2R1bGUgYmFzaXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEltcGxlbWVudCBtcG1fKiBtZXRob2RzIGFzICJtb2R1bGVzIi4gRWFjaCBtZXRob2QgZ2V0cyBpdHMgb3duCiAgICAgc3ViZGlyIGluIHNyYy9tb2R1bGVzIChlZzogc3JjL21vZHVsZXMvcHJlZm9yaykuIFNlbGVjdGlvbgogICAgIG9mIG1ldGhvZCB1c2VzIFJ1bGUgTVBNX01FVEhPRC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQb3J0IHRoZSBoeWJyaWQgc2VydmVyIGZyb20gdGhlIGFwYWNoZS1hcHIgcmVwb3NpdG9yeSBhcwogICAgIG1wbV9tcG10X3B0aHJlYWQuICBbTWFub2ogS2FzaWNoYWludWxhXQoKICAqKSBvcy91bml4L3VuaXhkLltjaF06IGRldGFjaCwgc2V0dWlkLCBzZXRnaWQsIHN0dWZmIHdoaWNoIHdpbGwgYmUgY29tbW9uCiAgICAgYW1vbmdzdCB0aGUgdW5peCBNUE1zLgoKICAqKSBtcG1fcHJlZm9yazogdGhyb3cgYXdheSBhbGwgdGhlIGFsYXJtL3RpbWVvdXQgY3J1ZDsgYW5kIGNsZWFuIHVwIHRoZQogICAgIHNpZ25hbCBoYW5kbGluZyBmb3IgdGhlIG5ldyB3b3JsZCBvcmRlci4gIFtEZWFuIEdhdWRldF0KCiAgKikgQ3J1ZGUgYXBfdGhyZWFkX211dGV4IGFic3RyYWN0aW9uIHNvIHRoYXQgd2UgZ2V0IHRoZSBwdGhyZWFkIHN0dWZmIG91dAogICAgIG9mIGFsbG9jLmMgZm9yIG5vdy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSGFuZGxlIHBhcnRpYWwgbGFyZ2Ugd3JpdGVzIGNvcnJlY3RseS4gIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgY29ubl9yZWMncyBwb2ludGVyIHRvIHNlcnZlci4gQWxsIGl0IGtub3dzIGlzIHRoZSBiYXNlIHNlcnZlcgogICAgIGJhc2VkIG9uIElQL3BvcnQuICBbQmVuIExhdXJpZV0KCiAgKikgUG9ydCBhIGJ1bmNoIG9mIG1vZHVsZXMgdG8gdGhlIG5ldyBtb2R1bGUgc3RydWN0dXJlLgogICAgIFsiTWljaGFlbCBILiBWb2FzZSIgPG12b2FzZSBtaWRjb2FzdC5jb20uYXU+XQoKICAqKSBJL08gbGF5ZXJpbmcgYW5kIEJVRkYgcmV2YW1wLiAgU2VlIGRvY3MvYnVmZi50eHQuICBbRGVhbiBHYXVkZXRdCgogICopIEJhc2ljIHJlc3RydWN0dXJpbmcgdG8gaW50cm9kdWNlIHRoZSBNUE0gY29uY2VwdDsgaW5jbHVkZXMgdmFyaW91cwogICAgIGNoYW5nZXMgdG8gdGhlIG1vZHVsZSBBUEkuLi4gYmV0dGVyIGRlc2NyaWJlZCBieQogICAgIGRvY3MvaW5pdGlhbF9ibHVyYi50eHQuICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIHB0aHJlYWRzCgogICopIE5ldyBidWZmIG9wdGlvbiBhZGRlZDogQk9fVElNRU9VVC4gSXQgZGVzY3JpYmVzIHRoZSB0aW1lb3V0IGZvcgogICAgIGJ1ZmYgb3BlcmF0aW9ucyAoZ2VuZXJhbGx5IG92ZXIgYSBuZXR3b3JrKS4KICAgICBbRGVhbiBHYXVkZXQsIFJ5YW4gQmxvb20sIE1hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQ3JlYXRlZCBodHRwX2FjY2VwdCBhYnN0cmFjdGlvbi4gQWRkZWQgNCBuZXcgZnVuY3Rpb25zIChub3QgZXhwb3J0ZWQpOgogICAgIGluaXRfYWNjZXB0KCksIGJlZ2luX2FjY2VwdGluZ19yZXF1ZXN0cygpLCBnZXRfcmVxdWVzdCgpLCAKICAgICBzdG9wX2FjY2VwdGluZ19yZXF1ZXN0cygpIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggdG8gYXBfcnByaW50ZiBjYWxsIHRoYXQgYWxsb3dzIG1vZF9pbmZvIHRvIHdvcmsgcHJvcGVybHkuCiAgICAgW0phbWVzIE1vcnJpcyA8am1vcnJpcyBpbnRlcmNvZGUuY29tLmF1Pl0KCiAgKikgdXNlciBhbmQgYXBfYXV0aF90eXBlIGZpZWxkcyB3ZXJlIG1vdmVkIGZyb20gY29ubmVjdGlvbl9yZWMgdG8gCiAgICAgcmVxdWVzdF9yZWMuIFtSeWFuIEJsb29tXSAKCiAgKikgUmVtb3ZlZCB0aGUgYXBfYmxvY2tfYWxhcm1zIGFuZCBhcF91bmJsb2NrX2FsYXJtIGNhbGxzLiAgVGhlc2UgYXJlbid0CiAgICAgbmVlZGVkIGluIGEgdGhyZWFkZWQgc2VydmVyLgoKICAqKSBJbml0aWFsIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gZnJvbSBmcm9tIERlYW4ncyBhcGFjaGUtbnNwciBjb2RlLgogICAgIFtCaWxsIFN0b2RkYXJkLCBSeWFuIEJsb29tXQoKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjkKCiAgKikgUmVtb3ZlIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHJlZGlyZWN0IGRvZXNuJ3Qgc2V0IExvY2F0aW9uLgogICAgIEluc3RlYWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgY29yZWR1bXAgaWYgdGhlIGVycm9yIG1lc3NhZ2UKICAgICB3YXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBhIGxvY2F0aW9uLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRG9uJ3QgYWxsb3cgY29uZmlndXJlIHRvIGluY2x1ZGUgbW9kX2F1dGhfZGlnZXN0IHVubGVzcyBpdCBpcwogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBldmVuIGlmIHRoZSB1c2VyIGFza2VkIGZvciBhbGwgbW9kdWxlcy4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBUcmFuc2xhdGUgbW9kdWxlIG5hbWVzIHRvIGRsbCBuYW1lcyBmb3IgT1MvMiBzbyB0aGF0IHRoZXkgYXJlIG5vIG1vcmUKICAgICB0aGFuIDggY2hhcmFjdGVycyBsb25nIGFuZCBoYXZlIGFuIGV4dGVuc2lvbiBvZiAiZGxsIiBpbnN0ZWFkIG9mICJzbyIuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgUHJpbnQgb3V0IHBvaW50ZXIgdG8gUnVsZSBERVZfUkFORE9NIHdoZW4gdHJ1ZXJhbmQgbGliIG5vdCBmb3VuZC4KICAgICBGaXggdGVzdC1jb21waWxlIGNoZWNrIHRvIGNoZWNrIGZvciByYW5kYnl0ZSBpbnN0ZWFkIG9mIHRyYW5kMzIuCiAgICAgVXNlIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkvZGVjb2RlIGluc3RlYWQgb2YgY29weSBpbiBtb2RfYXV0aF9kaWdlc3QuYwogICAgIGFuZCB0d2VhayB0byBtYWtlIEFtYXlhIGhhcHBpZXIuICBbUm9uYWxkIFRzY2hhbORyXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgaW5zdGFsbGVkIGV4cGF0IGluY2x1ZGUgZmlsZXMgYXJlIHdvcmxkIHJlYWRhYmxlLAogICAgIGp1c3QgbGlrZSB0aGUgb3RoZXIgaGVhZGVyIGZpbGVzLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXhlZCBnZW5lcmF0ZWQgQWRkTW9kdWxlIGFkanVzdG1lbnRzIGluIEFQQUNJJ3MgYGNvbmZpZ3VyZScgc2NyaXB0CiAgICAgaW4gb3JkZXIgdG8gYWxsb3cgKG5ldykgbW9kdWxlcyBsaWtlIG1vZF92aG9zdF9hbGlhcyB0byBiZSBoYW5kbGVkCiAgICAgY29ycmVjdGx5ICh3aGljaCB3YXMgdG91Y2hlZCBieSB0aGUgYWRqdXN0bWVudHMgZm9yIG1vZF9hbGlhcykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZvciBiaW5hcnkgYnVpbGRzLCBhZGQgLVIgZmxhZyB0byBhcGFjaGVjdGwgdG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2YKICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSAuL2xpYmV4ZWMgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWJodHRwLmVwIGZpbGUKICAgICBpcyBuZWVkZWQgZm9yIFNIQVJFRF9DT1JFIGFyY2hpdGVjdHVyZXMuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgV0lOMzI6IENyZWF0ZSB0aGUgQ0dJIHNjcmlwdCBwcm9jZXNzIGFzIERFVEFDSEVELiAgVGhpcyBtYXkgc29sdmUgdGhlCiAgICAgcHJvYmxlbSBvYnNlcnZlZCBieSBzb21lIFdpbjk1Lzk4IHVzZXJzIHdoZXJlIHRoZXkgZ2V0IENHSSBzY3JpcHQKICAgICBvdXRwdXQgc2VudCB0byB0aGUgY29uc29sZS4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggKHJlKW5hbWluZyBpbiB0aGUgdXVlbmNvZGUvZGVjb2RlIHNlY3Rpb24uIFRoZSBhcC9hcF8KICAgICByb3V0aW5lcyBhcmUgbm93IGNhbGxlZCBhcF9iYXNlNjQqIGFuZCBhcmUgJ3BsYWluJyAoaS5lLiwgbm8gCiAgICAgcG9vbCBhY2Nlc3Mgb3IgYW55dGhpbmcgY2xldmVyKS4gSW5zaWRlIHV0aWwuYyB0aGUgcm91dGluZXMgYWN0aW5nCiAgICAgbGlrZSBwc3RyZHVwIGFyZSBjYWxsZWQgYXBfcGJhc2U2NGVuY29kZSgpIGFuZCBhcF9wYmFzZTY0ZGVjb2RlKCkuCiAgICAgVGhlIG9kZGx5IG5hbWVkIGFwX3V1ZW5jb2RlKCksIGFwX3V1ZGVjb2RlKCkgYXJlIGtlcHQgYXJvdW5kIGZvcgogICAgIG5vdyBidXQgZGVwcmVjYXRlZC4gIFtkaXJreF0KCiAgKikgQ2xlYW4gdXAgdGhlIGJhc2U2NCBhbmQgU0hBMSBhZGRpdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZQogICAgIHJlcHJlc2VudGVkIGluIHRoZSBBcGFjaGVDb3JlLmRlZiwgQXBhY2hlQ29yZU9TMi5kZWYsIGFuZCBodHRwZC5leHAKICAgICBmaWxlcy4gIFtSb3kgRmllbGRpbmddCgogICopIFdJTjMyOiBNaWdyYXRlIHRvIEluc3RhbGxTaGllbGQgNS41IGFuZCBwcm92aWRlIGEgYml0IG1vcmUgZXJyb3IKICAgICBjaGVja2luZy4gIEFsbG93IGNvbXBpbGluZyBvbiBWUyA2LjAuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgYXNzdW1wdGlvbiBvZiBhYnNvbHV0ZSBwYXRocyBpbiBiaW5idWlsZC5zaC4gIFtUb255IEZpbmNoXQoKICAqKSBVc2UgVGVzdENvbXBpbGUgdG8gc2VhcmNoIGZvciB0aGUgdHJ1ZXJhbmQgbGlicmFyeSAocmF0aGVyIHRoYW4gYmxpbmRseQogICAgIGFzc3VtaW5nIGl0cyBleGlzdGVuY2UpLiBJZiBpdCBpcyBub3QgZm91bmQsIGNvbXBsYWluIChidXQgZG8gbm90CiAgICAgZXhpdCAtIHlldCkuICBbTWFydGluIEtyYWVtZXJdCgogICopIFdlIGZvcmdvdCB0byBhZGQgdGhlIG5ldyBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0bwogICAgIHNyYy9zdXBwb3J0L2h0dHBkLmV4cC4gIFtCaWxsIFN0b2RkYXJkLCBSYW5keSBUZXJidXNoXQoKICAqKSBBZGQgZGVzY3JpcHRpb24gb2YgLVQgY29tbWFuZC1saW5lIG9wdGlvbiB0byB1c2FnZSgpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGb3IgInNvbWUiIHBsYXRmb3JtcyAobm90YWJseSwgRUJDRElDIGJhc2VkIG9uZXMpLCBsaWJvcyBuZWVkcyB0byBiZQogICAgIHNlYXJjaGVkIG9ubHkgQUZURVIgbGliYXAgaGFzIGJlZW4gc2VhcmNoZWQsIGJlY2F1c2UgbGliYXAgbmVlZHMKICAgICBzb21lIHN5bWJvbHMgZnJvbSBsaWJvcy4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IGNvbmZsaWN0IHdpdGggb3JpZ2luYWwgbW9kX2RpZ2VzdCByZWxhdGVkIHRvIHRoZSBzeW1ib2wgb2YgdGhlCiAgICAgbW9kdWxlIGRpc3BhdGNoIGxpc3QgKHdoaWNoIGhhcyB0byBiZSB1bmlxdWUgZm9yIERTTyBhbmQgZm9sbG93IHRoZQogICAgIHVzdWFsIGNvbnZlbnRpb25zIGZvciB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBhIGRibS1saWJyYXJ5IGNoZWNrIGZvciB0aGUgInVzdWFsIHBsYWNlcyIgKC1sZGJtLCAtbG5kYm0sIC1sZGIpCiAgICAgZm9yIG90aGVyIHBsYXRmb3JtcyBhcyB3ZWxsLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBNYWtlIGFwX3NoYTEuYyBjb21waWxlIGZvciBFQkNESUMgcGxhdGZvcm1zOiByZXBsYWNlIHJlbWFpbmluZyBMT05HCiAgICAgdHlwZXMgYnkgQVBfTE9ORyBhbmQgcmVwbGFjZSByZWZlcmVuY2UgdG8gcmVuYW1lZCB2YXJpYWJsZSAndWJ1ZicKICAgICBieSAnYnVmZmVyJy4gIFtNYXJ0aW4gS3JhZW1lcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjggW25vdCByZWxlYXNlZF0KCiAgKikgRmx1c2ggdGhlIG91dHB1dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VuZGluZyBhbiBlcnJvciBvciByZWRpcmVjdAogICAgIHJlc3BvbnNlLCBzaW5jZSB0aGUgcmVzdWx0IG1heSBiZSBuZWVkZWQgYnkgdGhlIGNsaWVudCB0byBhYm9ydCBhCiAgICAgbG9uZyBkYXRhIHRyYW5zZmVyIG9yIHJlc3RhcnQgYSBzZXJpZXMgb2YgcGlwZWxpbmVkIHJlcXVlc3RzLgogICAgIFtUb20gVmF1Z2hhbiA8dHZhdWdoYW4gYXZlbnRhaWwuY29tPiwgUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBJbXByb3ZlZCBjb21waWxhdGlvbiBhbmQgRFNPIHN1cHBvcnQgb24gU2VxdWVudCBEWU5JWC9wdHguCiAgICAgW0lhbiBUdXJuZXIgPGlhbnQgc2VxdWVudC5jb20+XSBQUiM0NzM1CgogICopIExvY2FsIHN0cnVjdCBtbWFwIGluIGh0dHBfY29yZS5jIGNvbmZsaWN0ZWQgd2l0aCBzeXN0ZW0gc3RydWN0dXJlCiAgICAgbmFtZSBvbiBEWU5JWCAtLSBjaGFuZ2VkIHRvIG1tYXBfcmVjLiAgW1JveSBGaWVsZGluZ10gUFIjNDczNQoKICAqKSBBZGRlZCB1cGRhdGVkIG1vZF9kaWdlc3QgYXMgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfZGlnZXN0LgogICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZCBpbm5vdmF0aW9uLmNoPl0KCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hlcmUgdGhlIG1vZHVsZSBjb3VudHMgd2VyZSBnZXR0aW5nIG1lc3NlZAogICAgIHVwIGFjcm9zcyByZXN0YXJ0cy4gIFtEYXZpZCBIYXJyaXMgPGRoYXJyaXMgZHJoLm5ldD5dCgogICopIENJRFIgYWRkcmVzc2VzIHN1Y2ggYXMgYS5iLmMuZC8yNCB3aGVyZSBkICE9IDAgd2VyZW4ndCBoYW5kbGVkCiAgICAgcHJvcGVybHkgaW4gbW9kX2FjY2Vzcy4KICAgICBbIlBhdWwgSi4gUmVkZXIiIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dIFBSIzQ3NzAKCiAgKikgUmV3cml0ZUxvY2svUmV3cml0ZU1hcCBkaWRuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHZpcnR1YWwgaG9zdHMuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIGJvZy5tc3Uuc3U+XSBQUiMzODc0CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIGNvbXBhcS90YW5kZW0vY29tLgogICAgIFtNaWNoYWVsIE90dGF0aSA8bWljaGFlbC5vdHRhdGkgY29tcGFxLmNvbT4sIGRpcmt4XQoKICAqKSBBZGRlZCBTSEExIHBhc3N3b3JkIGVuY3J5cHRpb24gc3VwcG9ydCB0byBlYXN5IG1pZ3JhdGlvbiBmcm9tIAogICAgIE5ldHNjYXBlIHNlcnZlcnMuIFNlZSBzdXBwb3J0L1NIQTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgQ2F1c2VkIHRoZSBzZXBhcmF0aW9uIG9mIGFwX21kNS5jIGludG8gbWQ1LCBzaGExIGFuZCBhIGdlbmVyYWwKICAgICBhcF9jaGVja3Bhc3MuYyB3aXRoIGp1c3QgYSB2YWxpZGF0ZV9wYXNzd2Qgcm91dGluZS4gQWRkZWQgYQogICAgIGNvdXBsZSBvZiBmbGFncyB0byBzdXBwb3J0L2h0cGFzc3dkLiBTb21lIHJldXNlIG9mIHRoZSB0bzY0KCkKICAgICBmdW5jdGlvbjsgaGVuY2UgcmVuYW1lZCB0byBhcF90bzY0KCkuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpaywgQ2xpbnRvbiBXb25nIDxjbGludGR3IG5ldGNvbS5jb20+XQoKICAqKSBDaGFuZ2UgZm9yIEVCQ0RJQyBwbGF0Zm9ybXMgKFRQRiBhbmQgQlMyMDAwKSB0byBjb3JyZWN0bHkgZGVhbAogICAgIHdpdGggQVNDSUkvRUJDRElDIGNvbnZlcnNpb25zIGluICJpZGVudCIgcXVlcnkuCiAgICAgW0RhdmlkIE1jQ3JlZWR5IDxNY0NyZWVkeSB1cy5pYm0uY29tPl0KCiAgKikgR2V0IHJpZCBvZiByZWRlZmluaXRpb24gd2FybmluZyBvbiBNQUNfT1NfWF9TRVJWRVIgcGxhdGZvcm0uCiAgICAgQ2hhbmdlICJQb3dlciBNYWNpbnRvc2giIHRvIFBvd2VyKiBzbyBpZiB1bmFtZSBwcmludHMgIlBvd2VyIEJvb2siCiAgICAgd2UncmUgc3RpbGwgaGFwcHkgb24gUmhhcHNvZHkgcGxhdGZvcm1zLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBTSUdTRUdWIG9uIHNvbWUgc3lzdGVtcyBiZWNhdXNlIHRoZSBWYXJ5IGZpeCBiZWxvdyBpbmNsdWRlZAogICAgIGEgY2FsbCB0byB0YWJsZV9kbyB3aXRoIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCB0aGF0IHdhcyBub3QKICAgICBOVUxMIHRlcm1pbmF0ZWQuICBSZXBsYWNlZCB3aXRoIGJldHRlciBpbXBsZW1lbnRhdGlvbi4gW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjcgW25vdCByZWxlYXNlZF0KCiAgKikgVGhlICJWYXJ5IiByZXNwb25zZSBoZWFkZXIgZmllbGQgaXMgbm93IHNhbml0aXNlZCByaWdodCBiZWZvcmUKICAgICB0aGUgaGVhZGVyIGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LiAgTXVsdGlwbGUgIlZhcnkiIGZpZWxkcwogICAgIGFyZSBjb21iaW5lZCwgYW5kIGR1cGxpY2F0ZSB0b2tlbnMgKGUuZy4sICJWYXJ5OiBob3N0LCBob3N0IiBvcgogICAgICJWYXJ5OiBob3N0LCBuZWdvdGlhdGUsIGhvc3QsIGFjY2VwdC1sYW5ndWFnZSIpIGFyZSByZWR1Y2VkIHRvCiAgICAgc2luZ2xlIGluc3RhbmNlcy4gIFRoaXMgaXMgYSBiZXR0ZXIgc29sdXRpb24gdGhhbiB0aGUgZm9yY2Utbm8tdmFyeQogICAgIG9uZSAod2hpY2ggaXMgc3RpbGwgdmFsaWQgZm9yIGNsaWVudHMgdGhhdCBjYW4ndCBjb3BlIHdpdGggVmFyeQogICAgIGF0IGFsbCkuICBQUiMzMTE4IFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nLCBLZW4gQ29hcl0KCiAgKikgUG9ydGFiaWxpdHkgY2hhbmdlcyBmb3IgQmVPUy4gW0RhdmlkIFJlaWQgPGFiYjM3IGRpYWwucGlwZXguY29tPl0KCiAgKikgTGluayBEU08ncyB3aXRoICJnY2MgLXNoYXJlZCIgaW5zdGVhZCBvZiAibGQgLUJzaGFyZWFibGUiIGF0IAogICAgIGxlYXN0IG9uIExpbnV4IGFuZCBGcmVlQlNEIGZvciBub3cuICAKICAgICBbUmFzbXVzIExlcmRvcmZdCgogICopIFdpbjMyOiBNb3JlIGFwYWNoZSAtayByZXN0YXJ0IHdvcmsuIFJlc3RhcnRzIGFyZSBub3cgaG9ub3JlZAogICAgIGltbWVkaWF0ZWx5IGFuZCBjb25uZWN0aW9ucyBpbiB0aGUgbGlzdGVuIHF1ZXVlIGFyZSAtbm90LSBsb3N0LgogICAgIFRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSB0aGUgdXNlIG9mIHRoZSBXU0FEdXBsaWNhdGVTb2NrZXQoKQogICAgIGNhbGwuICBUaGUgbGlzdGVuZXJzIGFyZSBvcGVuZWQgaW4gdGhlIHBhcmVudCwgZHVwbGljYXRlZCwgdGhlbgogICAgIHRoZSBkdXBsaWNhdGVzIGFyZSBwYXNzZWQgdG8gdGhlIGNoaWxkLiBUaGUgb3JpZ2luYWwgbGlzdGVuIHNvY2tldHMgCiAgICAgYXJlIG5vdCBjbG9zZWQgYnkgdGhlIHBhcmVudCBhY3Jvc3MgYSByZXN0YXJ0LCB0aHVzIHRoZSBsaXN0ZW4gcXVldWUgCiAgICAgaXMgcHJlc2VydmVkLgogICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZCByYWxlaWdoLmlibS5jb20+XQoKICAqKSBGaXggaGFuZGxpbmcgb2YgY2FzZSB3aGVuIGEgY2xpZW50IGhhcyBzZW50ICJFeHBlY3Q6IDEwMC1jb250aW51ZSIKICAgICBhbmQgd2UgYXJlIGdvaW5nIHRvIHJlc3BvbmQgd2l0aCBhbiBlcnJvciwgYnV0IGdldCBzdHVjayB3YWl0aW5nIHRvCiAgICAgZGlzY2FyZCB0aGUgYm9keSBpbiB0aGUgcG9pbnRsZXNzIGhvcGUgb2YgcHJlc2VydmluZyB0aGUgY29ubmVjdGlvbi4KICAgICBbUm95IEZpZWxkaW5nLCBKb2UgT3J0b24gPGplbzEwMSB5b3JrLmFjLnVrPl0gUFIjNDQ5OSwgUFIjMzgwNgoKICAqKSBGaXggJ2NvbmZpZ3VyZScgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBTeXNWLWJhc2VkIHZlcnNpb25zIG9mCiAgICAgJ3RyJyAoY29uc2lzdGVudCB3aXRoIENvbmZpZ3VyZSdzIHVzZSBhcyB3ZWxsKS4gW0ppbSBKYWdpZWxza2ldCgogICopIGFweHM6IEFkZCAiLVMgdmFyPXZhbCIgb3B0aW9uIHdoaWNoIGFsbG93cyBmb3Igb3ZlcnJpZGUgb2YgQ0ZHXyoKICAgICBidWlsdC1pbiB2YWx1ZXMuIEFkZCAiLWUiIG9wdGlvbiB3aGljaCB3b3JrcyBsaWtlIC1pIGJ1dCBkb2Vzbid0CiAgICAgaW5zdGFsbCB0aGUgRFNPOyB1c2VmdWwgZm9yIGVkaXRpbmcgaHR0cGQuY29uZiB3aXRoIGFweHMuIEZpeAogICAgIGVkaXRpbmcgY29kZSBzbyB0aGF0IG11bHRpcGxlIGludm9jYXRpb25zIG9mIGFweHMgLWEgd2lsbCBub3QKICAgICBjcmVhdGUgZHVwbGljYXRlIExvYWRNb2R1bGUvQWRkTW9kdWxlIGVudHJpZXM7IGFweHMgY2FuIG5vdyBiZQogICAgIHVzZWQgdG8gcmUtIGVuYWJsZS9kaXNhYmxlIGEgbW9kdWxlLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIFdpbjMyOiBVcGRhdGUgdGhlIHNlcnZlciB0byB1c2UgV2luc29jayAyLiBTcGVjaWZpY2FsbHksIGxpbmsgd2l0aAogICAgIHdzMl8zMi5saWIgcmF0aGVyIHRoYW4gd3NvY2szMi5saWIuICBUaGlzIGdpdmVzIHVzIGFjY2VzcyB0byAKICAgICBXU0FEdXBsY2F0ZVNvY2tldCgpIGluIGFkZGl0aW9uIHRvIHNvbWUgb3RoZXIgZW5oYW5jZWQgY29tbSBBUElzLgogICAgIFdpbiA5NSB1c2VycyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlaXIgVENQL0lQIHN0YWNrIHRvIHBpY2sgdXAKICAgICBXaW5zb2NrIDIuIChTZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3dpbmRvd3M5NS9kb3dubG9hZHMvKQogICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZCByYWxlaWdoLmlibS5jb20+XQoKICAqKSBXaW4zMjogUmVkaXJlY3QgQ0dJIHNjcmlwdCBzdGRlcnIgKHNjcmlwdCBkZWJ1ZyBpbmZvKSBpbnRvIHRoZSAKICAgICBlcnJvci5sb2cgd2hlbiBDR0kgc2NyaXB0cyBmYWlsLiBUaGlzIG1ha2VzIEFwYWNoZSBvbiBXaW4zMiAKICAgICBiZWhhdmUgbW9yZSBsaWtlIFVuaXguICAgICAgCiAgICAgW0JpbGwgU3RvZGRhcmQgPHN0b2RkYXJkIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEZpeGVkIGBodHRwZCcgdXNhZ2UgZGlzcGxheTogLUQgd2FzIG1pc3NpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzQ2MTQKCiAgKikgRml4IGBtYWtlIHInIHRlc3QgcHJvY2VkdXJlIGluIHNyYy9yZWdleC86IGFwX2lzcHJpbnQgd2FzIG5vdCBmb3VuZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDU2MSwgUFIjNDU2MgoKICAqKSBPUy8yOiBGaXggcHJvYmxlbSB3aXRoIGFjY2VwdCBsb2NrIHNlbWFwaG9yZXMgd2hlcmUgc2VydmVyIHdvdWxkIGRpZSB3aXRoCiAgICAgIk9TMlNFTTogRXJyb3IgMTA1IGdldHRpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIiAKICAgICBbQnJpYW4gSGF2YXJkXSBQUiM0NTA1CgogICopIEFkZCBEU08gc3VwcG9ydCBmb3IgREdVWCA0LnggdXNpbmcgZ2NjLiBUZXN0ZWQgb24geDg2IHBsYXRmb3Jtcy4KICAgICBbUmFuZHkgVGVyYnVzaCA8cmFuZHkgY292YWxlbnQubmV0Pl0KIAogICopIEFkZCB0aGUgbmV3IG1hc3Mtdmhvc3QgbW9kdWxlIChtb2Rfdmhvc3RfYWxpYXMuYykgZGV2ZWxvcGVkIGFuZAogICAgIHVzZWQgYnkgRGVtb24gSW50ZXJuZXQsIEx0ZC4gW1RvbnkgRmluY2ggPGZhbmYgZGVtb24ubmV0Pl0KCiAgKikgQmV0dGVyIEdDQyBkZXRlY3Rpb24gZm9yIERTTyBmbGFncyB1bmRlciBTb2xhcmlzIDIgd2hlcmUgdGhlIGBjYycgCiAgICAgY29tbWFuZCBwb3RlbnRpYWxseSBfaXNfIEdDQy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBhcHhzIGJ1aWxkIGlzc3VlcyBvbiBBSVggCiAgICAgW1Jhc211cyBMZXJkb3JmIDxyYXNtdXMgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRG9jdW1lbnRSb290IENoZWNraW5nOiBVbmRlciBwcmV2aW91cyB2ZXJzaW9ucywgd2hlbiBBcGFjaGUKICAgICBmaXJzdCBzdGFydGVkIHVwLCBpdCB1c2VkIHRvIGRvIGEgc3RhdCBvZiBlYWNoIERvY3VtZW50Um9vdCB0bwogICAgIHNlZSBpZiBpdCBleGlzdGVkIGFuZCB3YXMgYSBkaXJlY3RvcnkuIElmIG5vdCwgdGhlbiBhbiBlcnJvcgogICAgIG1lc3NhZ2Ugd2FzIHByaW50ZWQuIFRISVMgSEFTIEJFRU4gRElTQUJMRUQuIElmIERvY3VtZW50Um9vdAogICAgIGRvZXMgbm90IGV4aXN0LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZXMgaW4gZXJyb3JfbG9nLiBJZgogICAgIHRoZSAnLXQnIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZCAodG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24pCiAgICAgdGhlIGNoZWNrIG9mIERvY3VtZW50Um9vdCBJUyBwZXJmb3JtZWQuIEFuIGFkZGl0aW9uYWwgY29tbWFuZAogICAgIGxpbmUgb3B0aW9uLCAnLVQnLCBoYXMgYmVlbiBhZGRlZCBpZiB5b3Ugd2FudCB0byBhdm9pZCB0aGUKICAgICBEb2N1bWVudFJvb3QgY2hlY2sgZXZlbiB3aGVuIGNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9uLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBXaW4zMjogVGhlIHF1ZXJ5IHN3aXRjaCAiYXBhY2hlIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtCaWxsIFN0b2RkYXJkIC0gRml4ZWQgYnkgTWFydGluIG9uIFVuaXggaW4gMS4zLjRdCgogICopIFdpbjMyOiBDaGFuZ2VkIGJlaGF2aW91ciBvZiBhcGFjaGUgLWsgcmVzdGFydC4gCiAgICAgUHJldmlvdXNseSwgdGhlIHNlcnZlciB3b3VsZCBkcmFpbiBhbGwgY29ubmVjdGlvbnMgaW4gdGhlIHN0YWNrJ3MKICAgICBsaXN0ZW4gcXVldWUgYmVmb3JlIGhvbm9yaW5nIHRoZSByZXN0YXJ0LiBPbiBhIGJ1c3kgc2VydmVyLCB0aGlzCiAgICAgY291bGQgdGFrZSBob3Vycy4gIE5vdywgYSByZXN0YXJ0IGlzIGhvbm9yZWQgYWxtb3N0IGltbWVkaWF0ZWx5LiAKICAgICBBbGwgY29ubmVjdGlvbnMgaW4gQXBhY2hlJ3MgcXVldWVzIGFyZSBoYW5kbGVkIGJ1dCBjb25uZWN0aW9ucyBpbiAKICAgICB0aGUgc3RhY2sncyBsaXN0ZW4gcXVldWUgYXJlIGRpc2NhcmRlZC4gUmVzdGFydCB0cmlnZ2VyZWQgYnkgCiAgICAgTWF4UmVxdWVzdFBlckNoaWxkIGlzIHVuY2hhbmdlZC4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmQgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZWQgdW5uZWNlc3NhcnkgY2FsbCB0byB3YWl0X2Zvcl9tdWx0aXBsZV9vYmplY3RzIGluCiAgICAgdGhlIGFjY2VwdCBsb29wLiBHb29kIGZvciBhIDUlIHBlcmZvcm1hbmNlIGJvb3N0LiBDbGVhbmVkIHVwIAogICAgIHBhcmVudC9jaGlsZCBwcm9jZXNzIG1hbmFnZW1lbnQgY29kZS4gCiAgICAgW0JpbGwgU3RvZGRhcmQgPHN0b2RkYXJkIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFkZGVkIGNlaWxpbmcgb24gZmlsZSBzaXplIGZvciBtZW1vcnkgbWFwcGVkIGZpbGVzLgogICAgIFtKb2huIEdpYW5uYW5kcmVhIDxqZyBtZWVyLm5ldD5dIFBSIzQxMjIKCiAgKikgRml4IG5kYm0uaCBpbmNsdWRlIHByb2JsZW1zIHdpdGggYnJhaW4tZGVhZCBnbGliYyA+PSAyLjEgd2hpY2ggCiAgICAgaGFzIG5kYm0uaCBpbiBhIG5vbi1zdGFuZGFyZCBkYjEvIHN1YmRpci4gUFIjNDQzMSwgUFIjNDUyOAogICAgIFtIZW5yaSBHb21leiA8Z29tZXogc2xpYi5mcj4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIAoKICAqKSBEZXRlcm1pbmUgQVBfQllURV9PUkRFUiBmb3IgYXBfY29uZmlnX2F1dG8uaCBhbmQgYWxyZWFkeQogICAgIHVzZSB0aGlzIGF0IGxlYXN0IGZvciBFeHBhdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IC5tb2R1bGUgZmlsZXMgdG8gc3BlY2lmeSBsaWJyYXJpZXMgd2l0aCBMaWI6LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBTZXRFbnZJZltOb0Nhc2VdIHRvIHRlc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBoZWFkZXIgZmllbGRzIGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMuICBbS2VuIENvYXJdCgogICopIEZpeCBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgU2NhbkhUTUxUaXRsZXMgd2hlbiBmaWxlCiAgICAgY29udGVudC10eXBlcyBhcmUgInRleHQvaHRtbDtwYXJhbWV0ZXJzIi4gIFBSIzQ1MjQgIFtLZW4gQ29hcl0KCiAgKikgUmVtb3ZlICJteGIiIHN1cHBvcnQgZnJvbSBtb2RfbmVnb3RpYXRpb24gLS0gaXQgd2FzIGEgZHJhZnQgZmVhdHVyZQogICAgIG5ldmVyIGFjY2VwdGVkIGludG8gYW55IHN0YW5kYXJkLCBhbmQgaXQgb3BlbnMgdXAgY2VydGFpbiBEb1MKICAgICBhdHRhY2tzLiAgW0tvZW4gSG9sdG1hbiA8S29lbi5Ib2x0bWFuIGNlcm4uY2g+XQoKICAqKSBUZXN0Q29tcGlsZSB1cGRhdGVkLiBXZSBjYW4gbm93IHJ1biBwcm9ncmFtcyBhbmQgb3V0cHV0IHRoZQogICAgIHJlc3VsdHMgZHVyaW5nIHRoZSBDb25maWd1cmUgcHJvY2Vzcy4gWyBKaW0gSmFnaWVsc2tpXQoKICAqKSBUaGUgc291cmNlIGlzIG5vdyBxdWFkIChsb25nIGxvbmcpIGF3YXJlIGFzIG5lZWRlZC4gU3BlY2lmaWNhbGx5LAogICAgIHRoZSBDb25maWd1cmUgcHJvY2VzcyBkZXRlcm1pbmVzIHRoZSBjb3JyZWN0IHNpemUgb2Ygb2ZmX3QgYW5kCiAgICAgKnZvaWQuIFdoZW4gdGhlIE9TL3BsYXRmb3JtL2NvbXBpbGVyIHN1cHBvcnRzIHF1YWRzLCBhcF9zbnByaW50ZigpCiAgICAgcHJvdmlkZXMgZm9yIHRoZSAncScgZm9ybWF0IHF1YWxpZmllciAoaWYgcXVhZHMgYXJlIG5vdCBhdmFpbGFibGUsCiAgICAgJ3EnIGlzIHNpbGVudGx5ICJkZW1vdGVkIiB0byBsb25nKS4gW0ppbSBKYWdpZWxza2ldCgogICopIFdoZW4gdGhlIHVzZXJuYW1lIG9yIHBhc3N3b3JkIGZlZCB0byBodHBhc3N3ZCBpcyB0b28gbG9uZywgaW5jbHVkZSB0aGUKICAgICBzaXplIGxpbWl0IGluIHRoZSBlcnJvciBtZXNzYWdlLiAgQWxzbyByZXBvcnQgaWxsZWdhbCBjaGFyYWN0ZXJzCiAgICAgKGN1cnJlbnRseSBvbmx5ICc6JykgaW4gdGhlIHVzZXJuYW1lLiAgQWRkIHRoZSBzaXplIHJlc3RyaWN0aW9ucwogICAgIHRvIHRoZSBtYW4gcGFnZS4gIFtLZW4gQ29hcl0KCiAgKikgRml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3VwcG9ydCBvcHRpb24gc28gaXQgZG9lc24ndCByZXN1bHQgaW4KICAgICBhbiBpbmZpbml0ZSBsb29wLiAgW01hcmMgU2xlbWtvXQoKICAqKSBQaXBlZCBlcnJvciBsb2dzIGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQgaWYgYW4gZXJyb3Igb2NjdXJlZAogICAgIGR1cmluZyBjb25maWd1cmF0aW9uIGFmdGVyIGEgcmVzdGFydC4KICAgICBbQWlkYW4gQ3VsbHkgPGFpZGFuIHBhbml4LmNvbT5dIFBSIzQ0NTYKCiAgKikgSWYgYSAiTG9jYXRpb24iIGZpZWxkIHdhcyBzdG9yZWQgaW4gci0+ZXJyX2hlYWRlcnNfb3V0IHJhdGhlcgogICAgIHRoYW4gci0+aGVhZGVyc19vdXQsIHJlZGlyZWN0IHByb2Nlc3Npbmcgd291bGRuJ3QgZmluZCBpdCBhbmQKICAgICB0aGUgc2VydmVyIHdvdWxkIGNvcmUgZHVtcCBvbiBhcF9lc2NhcGVfaHRtbChOVUxMKS4gIENoZWNrIGJvdGgKICAgICB0YWJsZXMgYW5kIHJhaXNlIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIHdpdGggYSBsb2cgbWVzc2FnZQogICAgIGlmIExvY2F0aW9uIGlzbid0IHNldC4gIFtEb3VnIE1hY0VhY2hlcm4sIEtlbiBDb2FyXQoKICAqKSBBZGQgUlVMRV9FWFBBVCwgdGhlIHNyYy9saWIvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCBhIG1vZGlmaWVkIGNvcHkKICAgICBvZiB0aGUgRXhwYXQgMS4wLjIgZGlzdHJpYnV0aW9uLiBbR3JlZyBTdGVpbl0KCiAgKikgUmVwbGFjZSByZWdleGVjKCkgY2FsbHMgd2l0aCBjYWxscyB0byBhIG5ldyBBUEkgc3R1YiBmdW5jdGlvbgogICAgIGFwX3JlZ2V4ZWMoKS4gIFRoaXMgc29sdmVzIHByb2JsZW1zIHdpdGggRFNPIG1vZHVsZXMgd2hpY2ggdXNlIHRoZSByZWdleAogICAgIGxpYnJhcnkuIFtKZW5zLVV3ZSBNYWdlciA8anVtIGhlbGlvcy5kZT4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCAnUmVxdWVzdF9Qcm90b2NvbCcgc3BlY2lhbCBrZXl3b3JkIHRvIG1vZF9zZXRlbnZpZiBzbyB0aGF0CiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uCiAgICAgKGUuZy4sIEhUVFAvMC45IG9yIEhUVFAvMS4xKSBvZiB0aGUgcmVxdWVzdC4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIERTTyBzdXBwb3J0IGZvciBPcGVuU3RlcCAoTWFjaCA0LjIpIHBsYXRmb3JtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBSZXggRGlldGVyIDxyZGlldGVyIG1hdGgudW5sLmVkdT5dIFBSIzM5OTcKCiAgKikgRml4IHNlZCByZWdleCBmb3IgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGluIHNyYy9Db25maWd1cmUuCiAgICAgW0phbiBHYWxsbyA8Z2FsbG8gcHZ0LnNrPl0gUFIjMzY5MCwgUFIjNDM3MwogCiAgKikgU3dpdGNoIHRvIC9iaW4vc2g1IGluIEFQQUNJIG9uIFVsdHJpeCBhbmQgZnJpZW5kcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgdGhlaXIgYnJhaW4tZGVhZCAvYmluL3NoLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDM3MgoKICAqKSBCZXR0ZXIgRFNPIGZsYWdzIHJlY29nbml0aW9uIG9uIE5ldEJTRCBwbGF0Zm9ybXMgdXNpbmcgRUxGLgogICAgIFtUb2RkIFZpZXJsaW5nIDx0diBwb2JveC5jb20+XSBQUiM0MzEwCgogICopIEFsd2F5cyBsb2cgbW9udGhzIGluIGVuZ2xpc2ggZm9ybWF0IGZvciAldCBpbiBtb2RfbG9nX2NvbmZpZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGEgZmVlLnZ1dGJyLmN6Pl0gUFIjNDM2NiwgNjc5CgogICopIFN1cHBvcnQgZm9yIHNlcnZlci1wYXJzZWQgYW5kIG11bHRpdmlldy1kZXRlcm1pbmVkIFJlYWRtZU5hbWUgYW5kCiAgICAgSGVhZGVyTmFtZSBmaWxlcyBpbiBtb2RfYXV0b2luZGV4LiBSZW1vdmVkIHRoZSByZXN0cmljdGlvbiBvbgogICAgICIvInMgaW4gUmVhZG1lTmFtZSBhbmQgSGVhZGVyTmFtZSBkaXJlY3RpdmVzIHNpbmNlIHRoZSAqc3ViX3JlcSoKICAgICByb3V0aW5lcyB3aWxsIGRlYWwgd2l0aCB0aGUgYWNjZXNzIGlzc3Vlcy4gKEl0J3Mgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSB7c2l0ZXxncm91cHxwcm9qZWN0fGN1c3RvbWVyfC4uLn0gd2lkZSByZWFkbWVzIGFuZCBoZWFkZXJzLikKICAgICBbUmF5bW9uZCBTIEJyYW5kIDxyc2J4IHJzYngubmV0PiwgS2VuIENvYXJdIFBSIzE1NzQsIDMwMjYsIDM1MjksCiAgICAgMzU2OSwgNDI1NgoKICAqKSBXaGVuIHN0YXQoKSBmYWlscywgZG9uJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZSBjb250ZW50cyBvZgogICAgIHRoZSBzdHJ1Y3Qgc3RhdC4gIFtFZCBLb3J0aG9mIDxlZCBiaXRtZWNoYW5pYy5jb20+XQoKICAqKSBJdCdzIE9LIGZvciBhIHNlbW9wIHRvIHJldHVybiBFSU5UUiwganVzdCBsb29wIGFyb3VuZCBhbmQgdHJ5CiAgICAgYWdhaW4uICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBjb25maWd1cmF0aW9uIGVuZ2luZSByZS1lbnRyYW50IGhhbmd1cHMsIHdoaWNoIHNvbHZlIGEKICAgICBoYW5kZnVsIG9mIHByb2JsZW1zIHNlZW4gd2l0aCBtb2RfcGVybCA8UGVybD4gY29uZmlndXJhdGlvbiBzZWN0aW9ucwogICAgIFtTYWx2YWRvciBPcnRpeiBHYXJjaWEgPHNvZyBtc2cuY29tLm14Pl0KCiAgKikgTWFjIE9TIGFuZCBNYWMgT1MgWCBTZXJ2ZXIgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUgY3VzdG9tIGxheW91dAogICAgIGJ5IGRlZmF1bHQgd2hlbiBidWlsZGluZyB3aXRoIEFQQUNJOyBhbGxvdyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKICAgICB2YXJpYWJsZSBkZWZhdWx0cyBpbiBjb25maWd1cmUuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBEbyBzZXRnaWQoKSBiZWZvcmUgaW5pdGdyb3VwcygpIGluIGh0dHBfbWFpbjsgc29tZSBwbGF0Zm9ybXMKICAgICB6YXAgdGhlIGdyb3VwbGlzdCB3aGVuIHNldGdpZCgpIGlzIGNhbGxlZC4gIFRoaXMgd2FzIGZpeGVkIGluCiAgICAgc3VleGVjIGVhcmxpZXIsIGJ1dCB0aGUgbWFpbiBodHRwZCBjb2RlIG1pc3NlZCB0aGUgY2hhbmdlLgogICAgIFtSb2IgU2FjY29jY2lvIDxyb2JzIEluZmluaXRlVGVjaG5vbG9neS5jb20+XSAgUFIjMjU3OQoKICAqKSBBZGQgcmVjb2duaXRpb24gb2YgLnRneiBhcyBhIGd6aXBwZWQgdGFyY2hpdmUuCiAgICAgW0JlcnRyYW5kIGRlIFNpbmdseSA8YmVydHJhbmQuZGUtc2luZ2x5IHBvbHl0ZWNobmlxdWUuZnI+XSAgUFIjMjM2NAoKICAqKSBtb2RfaW5jbHVkZSdzIGZzaXplL2ZsYXN0bW9kIHNob3VsZCBhbGxvdyBvbmx5IHJlbGF0aXZlIHBhdGhzLCBqdXN0CiAgICAgbGlrZSAiaW5jbHVkZSBmaWxlIi4gIFtKYXJvc2xhdiBCZW5rb3Zza3kgPGJlbmtvdnNrIHBoYS5wdnQuY3o+XQoKICAqKSBPUy8yOiBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyB1c2luZyBETExzLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEFkZCBpY29uc2RpciwgaHRkb2NzZGlyLCBhbmQgY2dpZGlyIHRvIGNvbmZpZy5sYXlvdXQuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBtaW5vciBidXQgYW5ub3lpbmcgYnVnIHdpdGggdGhlIHRlc3QgZm9yIENvbmZpZ3VyYXRpb24udG1wbAogICAgIGJlaW5nIG5ld2VyIHRoYW4gQ29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGlzIGxlc3MgbGlrZWx5IHRvIGZhaWwKICAgICB3aGVuIHVzaW5nIEFQQUNJIGFuZCBzaGFkb3cgc291cmNlcy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIFBPUlQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE1hYyBPUyAodmVyc2lvbnMgMTAuMCBhbmQKICAgICBncmVhdGVyKS4gVXNlIE1hYyBPUyBYIFNlcnZlciBsYXlvdXQgZm9yIG5vdy4gQ2xlYW4gdXAgZHlsZCBjb2RlCiAgICAgaW4gdW5peC9vcy5jLCBhbmQgZG9uJ3QgaW5zdGFsbCB0aGUgZHlsZCBlcnJvciBoYW5kbGVycywgd2hpY2gKICAgICBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBpbiBNYWMgT1MuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBSZW5hbWUgUmhhcHNvZHkgbGF5b3V0IHRvICJNYWMgT1MgWCBTZXJ2ZXIiLiBDaGFuZ2UgaW5zdGFsbAogICAgIGxvY2F0aW9ucyB0byBhcHByb3ByaWF0ZSBvbmVzIGZvciB1c2VyLWJ1aWx0IChhcyBvcHBvc2VkIHRvCiAgICAgc3lzdGVtKSBpbnN0YWxscy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIE1vZGlmeSBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgQWRkRGVzY3JpcHRpb24gc28gdGhhdCB0aGUKICAgICBiZWhhdmlvdXIgbWF0Y2hlcyB0aGUgZG9jdW1lbnRhdGlvbi4gIFtLZW4gQ29hcl0gUFIjMTg5OCwgMzA3Mi4KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGluc3RhbGwtYmluZGlzdC5zaCBzY3JpcHQgY3JlYXRlZCBieQogICAgIGJpbmJ1aWxkLnNoIHRvIHVzZSB0YXIgd2hlbiBjb3B5aW5nIGRpc3RyaWJ1dGlvbiBmaWxlcyB0byB0aGUKICAgICBzZXJ2ZXJyb290LiBUaGlzIGFsbG93cyB1cGdyYWRpbmcgYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uCiAgICAgd2l0aG91dCBuZXN0aW5nIHRoZSBuZXcgZGlzdHJpYnV0aW9uIGluIHRoZSBvbGQuCgogICAgIGluc3RhbGwtYmluZGlzdC5zaCBub3cgZGV0ZWN0cyB0aGUgbG9jYWwgcGVybDUgcGF0aCB0byBpbnN0YWxsCiAgICAgYXB4cyBhbmQgZGJtbWFuYWdlIHdpdGggcHJvcGVyIHBhdGggdG8gcGVybCBpbnRlcnByZXRlci4KCiAgICAgQWRkIGFuIGluc3RhbGwtYmluc3VwcG9ydCB0YXJnZXQgd2hpY2ggY29waWVzIHRoZSBzb3VyY2UgZmlsZXMKICAgICBmb3IgYXB4cyBhbmQgZGJtbWFuYWdlIHRvIGJpbmRpc3QgdG8gYWxsb3cgdGhlc2Ugc2NyaXB0cyB0bwogICAgIGJlIHByb3Blcmx5IGluc3RhbGxlZCByZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gc2VydmVycm9vdC4KICAgICBbUmFuZHkgVGVyYnVzaCwgQ292YWxlbnQgVGVjaG5vbG9naWVzLCA8cmFuZHkgY292YWxlbnQubmV0Pl0KCiAgKikgRml4IGludGVybWl0dGVudCBTRUdWIGluIGFwX3Byb3h5X2NhY2hlX2Vycm9yKCkgaW4KICAgICBzcmMvbW9kdWxlcy9wcm94eV91dGlsLmMgd2hlcmUgYSBOVUxMIGZpbGVwb2ludGVyIGFuZAogICAgIHRlbXBvcmFyeSBmaWxlbmFtZSB3ZXJlIGNsb3NlZCBhbmQgdW5saW5rZWQuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPiwKICAgICBUaW0gQ29zdGVsbG8gPHRqY29zdGVsIHNvY3MudXRzLmVkdS5hdT5dIFBSIzMxNzgKCiAgKikgRml4IGluY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyByZXBvcnRlZCBieSBtb2RfcHJveHkuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPl0KCiAgKikgT1MvMjogRml4IHRlcm1pbmF0aW5nIENHSXMgdGhhdCBhcmVuJ3QgY29tcGlsZWQgYnkgRU1YIEdDQyB3aGVuIGEgCiAgICAgY29ubmVjdGlvbiBpcyBhYm9ydGVkLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgRm9yY2UgdGhlIExBTkcgZW52YXJpYWJsZSB0byB0aGUga25vd24gc3RhdGUgb2YgIkMiIHNvIHRoYXQgd2UKICAgICBoYXZlIGFzc3VyYW5jZSBhYm91dCBob3cgc3RyaW5nIG1hbmlwdWxhdG9ycyAoZS5nLiwgdHIpIHdpbGwKICAgICBmdW5jdGlvbi4gIFtLZW4gQ29hcl0gIFBSIzE2MzAKCiAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIGFsbG93IGN1c3RvbWlzaW5nIG9mIHRoZSB0cmFja2luZyBjb29raWUgbmFtZS4KICAgICBbS2VuIENvYXJdICBQUiMyOTIxLCA0MzAzCgogICopIEFkZCAiZm9yY2Utbm8tdmFyeSIgZW52YXJpYWJsZSB0byBhbGxvdyBzZXJ2ZXJzIHRvIHdvcmsgYXJvdW5kCiAgICAgY2xpZW50cyB0aGF0IGNob2tlIG9uICJWYXJ5IiBmaWVsZHMgaW4gdGhlIHJlc3BvbnNlIGhlYWRlci4KICAgICBbS2VuIENvYXIsIERtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIHppcHB5Lm1hY2hhb24ucnU+XSAgUFIjNDExOAoKICAqKSBGaXhlZCBhIGJ1ZyBpbiBtb2RfZGlyIHRoYXQgY2F1c2VzIGEgY2hpbGQgcHJvY2VzcyB3aWxsIGluZmluaXRlbHkKICAgICByZWN1cnNlIHdoZW4gaXQgYXR0ZW1wcyB0byBoYW5kbGUgYSByZXF1ZXN0IGZvciBhIGRpcmVjdG9yeSB3bmQgdGhlCiAgICAgdmFsdWUgb2YgdGhlIERpcmVjdG9yeUluZGV4IGRpcmVjdGl2ZSBpcyBhIHNpbmdsZSBkb3QuIEFsc28gbGlrZWx5CiAgICAgdG8gaGFwcGVuIGZvciBhbnlvdGhlciB2YWx1ZXMgb2YgRGlyZWN0b3J5SW5kZXggdGhhdCB3aWxsIG1hcCBiYWNrCiAgICAgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LiBUaGUgaGFuZGxlciBub3cgb25seSBjb25zaWRlcnMgcmVndWxhciBmaWxlcwogICAgIGFzIGJlaW5nIGluZGV4IGNhbmRpZGF0ZXMuIE5vIFBSI3MgZm91bmQuCiAgICAgW1JheW1vbmQgUyBCcmFuZCA8cnNieCByc2J4Lm5ldD5dCgogICopIEVhc2UgY29uZmlndXJhdGlvbiBkZWJ1Z2dpbmcgYnkgbWFraW5nIFRlc3RDb21waWxlIGZhbGwgYmFjayB0bwogICAgIHVzaW5nICJtYWtlIiBpZiB0aGUgJE1BS0UgdmFyaWFibGUgaXMgdW5zZXQgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXhlZCB0aGUgU2VydmVyU2lnbmF0dXJlIGRpcmVjdGl2ZSB0byB3b3JrIGFzIGRvY3VtZW50ZWQuCiAgICAgW1JheW1vbmQgUyBCcmFuZCA8cnNieCByc2J4Lm5ldD5dIFBSIzQyNDgKCiAgKikgQWRkICJvcHQiIChTeXNWLXN0eWxlKSBsYXlvdXQgdG8gY29uZmlnLmxheW91dC4gW1JheW1vbmQgUyBCcmFuZAogICAgIDxyc2J4IHJzYngubmV0Pl0KCiAgKikgQWRkIEFQQUNJIC0td2l0aG91dC1leGVjc3RyaXAgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgc3RyaXBwaW5nIG9mIGV4ZWN1dGFibGVzIG9uIGluc3RhbGxhdGlvbi4gIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIERTTwogICAgIGFuZCBkZWJ1Z2dpbmcgc2l0dWF0aW9ucy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBzdXBwb3J0IGZvciBPUy8yIChjYXNlIGluc2Vuc3RpdmUgZmlsZXN5c3RlbSwgLmV4ZSBzdWZmaXgsIGV0YykKICAgICB0byBBUEFDSSBmaWxlcyBhbmQgcmVsYXRlZCBzY3JpcHRzLiAKICAgICBbWWl0emNoYWsgU2NvdHQtVGhvZW5uZXMgPHN0aG9lbm5hIGVmbi5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiM0MjY5CgogICopIEFkZCBzdXBwb3J0IGZvciBzdGFuZGFsb25lIG1vZGUgaW4gVFBGCiAgICAgW0pvZSBNb2VuaWNoIDxtb2VuaWNoIHVzLmlibS5jb20+XQoKICAqKSBGaXggbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBieSByZWFkX2Nvbm5lY3Rpb24oKSBpbiBzcmMvc3VwcG9ydC9hYi5jCiAgICAgW0ppbSBDb3ggPGpjIHN1cGVybGluay5uZXQ+XSBQUiM0MjcxCgogICopIEZpeCBzcGVjaWFsIFJld3JpdGVDb25kICItcyIgcGF0dGVybiBtYXRjaGluZy4KICAgICBbQm9iIEZpbmNoIDxib2IgbmFzLmNvbT5dCgogICopIEZpeCB2YWx1ZSBxdW90aW5nIGluIHNyYy9Db25maWd1cmUgc2NyaXB0IGZvciBhcF9jb25maWdfYXV0by5oIAogICAgIFtQYXVsIFN1dHRvbiA8cGF1bCBhd2UuY29tPl0KCiAgKikgTWFrZSBzdXJlIFJld3JpdGVMb2NrIGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIGdsb2JhbCBjb250ZXh0LCAoaS5lLgogICAgIG91dHNpZGUgb2YgYW55IDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMpIGJlY2F1c2UgaXQncyBhIGdsb2JhbCBmYWNpbGl0eSBvZgogICAgIHRoZSByZXdyaXRlIGVuZ2luZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgb3duZXJzaGlwIGRlbGVnYXRpb24gZm9yIHByb3h5IGRpcmVjdG9yeSB1bmRlciBgbWFrZSBpbnN0YWxsJy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBBQ0kgd291bGQgbm90IGNvcnJlY3RseSBidWlsZCBzdWV4ZWMuIFtNYXJpYSBWZXJpbmEKICAgICA8bWFyaWF2IGljZ2ViLnRyaWVzdGUuaXQ+XSBQUiM0MjYwCgogICopIG1vZF9taW1lX21hZ2ljIHBhc3NlZCBvbmx5IHRoZSBmaXJzdCA0ayBvZiBhIGZpbGUgdG8KICAgICB1bmNvbXByZXNzL2d6aXAsIGJ1dCB0aG9zZSB0b29scyBzb21ldGltZXMgZG8gbm90IHByb2R1Y2UKICAgICBhbnkgb3V0cHV0IHVubGVzcyBhIHN1ZmZpY2llbnQgcG9ydGlvbiBvZiB0aGUgY29tcHJlc3NlZAogICAgIGZpbGUgaXMgaW5wdXQuICBDaGFuZ2UgdG8gcGFzcyB0aGUgZW50aXJlIGZpbGUgLS0gYnV0CiAgICAgb25seSByZWFkIDRrIG9mIG91dHB1dC4KICAgICBbTWFyY2luIENpZXNsYWsgPHNhcGVyIHN5c3RlbS5wbD5dIFBSIzQwOTcKCiAgKikgIkluZGV4T3B0aW9ucyBOb25lIiBnZW5lcmF0ZWQgZXh0cmEgc3BhY2VzIGF0IHRoZSBlbmQgb2YgZWFjaAogICAgIGxpbmUuICBbPGlua2xpbmcgZmlyc3RuZXRob3UuY29tPl0gUFIjMzc3MAoKICAqKSBUaGUgIjEwMCBDb250aW51ZSIgcmVzcG9uc2Ugd2Fzbid0IGJlaW5nIHNlbnQgYWZ0ZXIgaW50ZXJuYWwKICAgICByZWRpcmVjdHMuIFtKb3NlIEtBSEFOIDxrYWhhbiB3My5vcmc+XSBQUiMzOTEwLCAzODA2LCAzNTc1CgogICopIFdoZW4gcGFkZGluZyB0aGUgbmFtZSB3aXRoIHNwYWNlcyBmb3IgZGlzcGxheSwgbW9kX2F1dG9pbmRleCB3b3VsZAogICAgIGNvdW50ICYsIDwsIGFuZCA+IGluIHRoZWlyIGVzY2FwZWQgd2lkdGgsIG1lc3NpbmcgdXAgdGhlIGRpc3BsYXkuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0MDc1LCAzNzU4CgogICopIFBPUlQ6IGZpeGVkIGEgY29tcGlsYXRpb24gcHJvYmxlbSBvbiBORVhULgogICAgIFtKYWNxdWVzIERpc3RsZXIgPGRpc3RsZXIgZ29sZW0ucGgudXRleGFzLmVkdT5dIFBSIzQxMzAKCiAgKikgci0+cmVxdWVzdF90aW1lIHdhc24ndCBiZWluZyBzZXQgcHJvcGVybHkgaW4gY2VydGFpbiBlcnJvciBjb25kaXRpb25zLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDE1NgoKICAqKSBQT1JUOiBkZWFsIHdpdGggVVRTIGNvbXBpbGVyIGVycm9yIGluIGh0dHBfcHJvdG9jb2wuYwogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjNDE4OQoKICAqKSBBZGQgYXBfdnJwcmludGYoKSBmdW5jdGlvbi4gIFtKb2huIFRvYmV5IDxqdG9iZXkgYmFudGEtaW0uY29tPl0gUFIjNDI0NgoKICAqKSBGaXggdGhlIG1vZF9taW1lIGhhc2ggdGFibGUgdG8gd29yayBwcm9wZXJseSB3aXRoIGxvY2FsZXMgb3RoZXIKICAgICB0aGFuIEMuICBbRGVhbiBHYXVkZXRdIFBSIzM0MjcKCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hpY2ggaXMgZXhhY2VyYmF0ZWQgYnkgY2VydGFpbiBjb25maWd1cmF0aW9ucy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQyMjUKCiAgKikgUHJldmVudCBjbG9iYmVyaW5nIHNhdmVkIElGUyB2YWx1ZXMgaW4gQVBBQ0kuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93cyBpbiBhcF91dWVuY29kZSBhbmQgYXBfdXVkZWNvZGUgcG9pbnRlZCBvdXQKICAgICBieSAiUGV0ZXIgJ0x1bmEnIEFsdGJlcmcgPHBldGVyIGFsdGJlcmcubnU+IiBhbmQgUFIjMzQyMgogICAgIFtQZXRlciAnTHVuYScgQWx0YmVyZyA8cGV0ZXIgYWx0YmVyZy5udT4sIFJvbmFsZCBUc2NoYWzkcl0KCiAgKikgTWFrZSB7U2V0LFVuc2V0LFBhc3N9RW52IHBlci1kaXJlY3RvcnkgaW5zdGVhZCBvZiBwZXItc2VydmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb3JyZWN0IGFuIGFwcGFyZW50IHR5cG86IG9uIHRoZSBXaW5kb3dzIGFuZCBNUEUgcGxhdGZvcm1zLCB0aGUKICAgICBodHBhc3N3ZCB1dGlsaXR5IHdhcyBsaW1pdGluZyBwYXNzd29yZHMgdG8gb25seSA4IGNoYXJhY3RlcnMuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBFQkNESUMgcGxhdGZvcm1zOiBEYXZpZCBzdWJtaXR0ZWQgcGF0Y2hlcyBmb3IgdHdvIGJ1Z3MgaW4gdGhlCiAgICAgTUQ1IGRpZ2VzdCBwb3J0IGZvciBFQkNESUMgbWFjaGluZXM6CiAgICAgYSkgdGhlIGh0ZGlnZXN0IHV0aWxpdHkgb3Zlcndyb3RlIHRoZSBvbGQgY29udGVudHMgb2YgdGhlIGRpZ2VzdCBmaWxlCiAgICAgYikgdGhlIENvbnRlbnQtTUQ1IGhlYWRlciB2YWx1ZSAoQ29udGVudERpZ2VzdCBkaXJlY3RpdmUpIHdhcyB3cm9uZwogICAgIHdoZW4gdGhlIHJldHVybmVkIGZpbGUgd2FzIG5vdCBjb252ZXJ0ZWQgZnJvbSBFQkNESUMsIGJ1dCB3YXMgYQogICAgIGJpbmFyeSAoZS5nLiwgaW1hZ2UgZmlsZSkgaW4gdGhlIGZpcnN0IHBsYWNlLgogICAgIFtEYXZpZCBNY0NyZWVkeSA8bWNjcmVlZHkgdXMuaWJtLmNvbT5dCgogICopIHN1cHBvcnQvaHRwYXNzd2Qgbm93IHBlcm1pdHMgdGhlIHBhc3N3b3JkIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUgd2l0aCB0aGUgJy1iJyBzd2l0Y2guICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBhc3N3b3JkcwogICAgIG5lZWQgdG8gYmUgbWFpbnRhaW5lZCBieSBzY3JpcHRzIC0tIHBhcnRpY3VsYXJseSBpbiB0aGUgV2luMzIKICAgICBlbnZpcm9ubWVudC4gIFtLZW4gQ29hcl0KCiAgKikgV2luMzI6IFdpbjMyIG11bHRpcGxlIHNlcnZpY2VzIHBhdGNoLiBBZGRlZCBjYXBhYmlsaXR5IHRvIGluc3RhbGwgYW5kCiAgICAgcnVuIG11bHRpcGxlIGNvcGllcyBvZiBhcGFjaGUgYXMgaW5kaXZpZHVhbCBzZXJ2aWNlcy4KCiAgICAgRXhhbXBsZSAxOgogICAgIGFwYWNoZSAtbiBhcGFjaGUxIC1pIC1mIGM6L2h0dHBkLmNvbmYKICAgICAgICBJbnN0YWxscyBhcGFjaGUgYXMgc2VydmljZSAnYXBhY2hlMScgYW5kIGFzc29jaWF0ZXMgYzovaHR0cGQuY29uZgogICAgICAgIHdpdGggdGhhdCBzZXJ2aWNlLgogICAgIG5ldCBzdGFydCBhcGFjaGUxCiAgICAgICAgU3RhcnRzIGFwYWNoZTEgc2VydmljZS4KICAgICBuZXQgc3RvcCBhcGFjaGUxCiAgICAgICAgU3RvcHMgYXBhY2hlMSBzZXJ2aWNlCgogICAgIEV4YW1wbGUgMjoKICAgICBhcGFjaGUgLW4gYXBhY2hlMiAtaQogICAgICAgIEluc3RhbGxzIGFwYWNoZSBhcyBzZXJ2aWNlICdhcGFjaGUyJy4gaHR0cGQuY29uZiBpcyBsb2NhdGVkIHVuZGVyCiAgICAgICAgdGhlIGRlZmF1bHQgc2VydmVyIHJvb3QgKC9hcGFjaGUvY29uZi9odHRwZC5jb25mKS4KICAgICBuZXQgc3RhcnQgYXBhY2hlMgogICAgICAgIFN0YXJ0cyBhcGFjaGUyIHNlcnZpY2UuCgogICAgIEV4YW1wbGUgMzoKICAgICBhcGFjaGUgLW4gYXBhY2hlMyAtaSAtZCBjOi9wcm9ncmFtIGZpbGVzL2FwYWNoZQogICAgICAgIEluc3RhbGwgYXBhY2hlIGFzIHNlcnZpY2UgJ2FwYWNoZTMnIGFuZCBzZXRzIHNlcnZlciByb290IHRvCiAgICAgICAgYzovcHJvZ3JhbSBmaWxlcy9hcGFjaGUuCgogICAgIEV4YW1wbGUgNDoKICAgICBhcGFjaGUgLW4gYXBhY2hlMiAtayByZXN0YXJ0CiAgICAgICAgUmVzdGFydCBhcGFjaGUyIHNlcnZpY2UgCgogICAgIFtLZWl0aCBXYW5uYW1ha2VyLCBLZW4gUGFyenlnbmF0LCBCaWxsIFN0b2RkYXJkXQoKICAqKSBDb3JyZWN0IHRoZSBzaWduZWQvdW5zaWduZWQgY2hhcmFjdGVyIGhhbmRsaW5nIGZvciB0aGUgTUQ1IHJvdXRpbmVzOwogICAgIG1pc21hdGNoZXMgd2VyZSBjYXVzaW5nIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggZ2NjIC1wZWRhbnRpYyBhbmQKICAgICBpbiB0aGUgVFBGIGNyb3NzLWNvbXBpbGF0aW9uLiAgW0tlbiBDb2FyXQoKICAqKSBPUy8yOiBSZXdvcmsgQ0dJIGhhbmRsaW5nIHRvIHVzZSBzcGF3biooKSBpbnN0ZWFkIG9mIGZvcmsvZXhlYywgYWNoaWV2aW5nCiAgICAgYSByb3VnaGx5IDUgZm9sZCBzcGVlZCB1cC4gW0JyaWFuIEhhdmFyZF0KCiAgKikgcHJveHkgZnRwOiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBoYXJkd2lyZWQgc3RyaW5nICJ0ZXh0L3BsYWluIiBhcwogICAgIGEgZmFsbGJhY2sgdHlwZSBmb3IgZmlsZXMgc2VydmVkIGJ5IHRoZSBmdHAgcHJveHksIHVzZSB0aGUKICAgICBhcF9kZWZhdWx0X3R5cGUoKSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyZWQgdHlwZS4KICAgICBUaGlzIGFsbG93cyBmb3Igc3BlY2lhbCBjb25maWd1cmF0aW9ucyBsaWtlCiAgICAgICAgPERpcmVjdG9yeSBwcm94eTpmdHA6Ly9zb21lLmhvc3Q+CiAgICAgICAgRGVmYXVsdFR5cGUgZ2FyZ2xlL2JsdXJiCiAgICAgICAgPC9EaXJlY3Rvcnk+CiAgICAgQWRkaXRpb25hbGx5LCBhZGQgdGhlIENvbnRlbnQtRW5jb2Rpbmc6IGhlYWRlciB0byBGVFAgcHJveHkgcmVwbGllcwogICAgIHdoZW4gdGhlIGVuY29kaW5nIGlzIGRlZmluZWQgKGJ5IHRoZSBBZGRFbmNvZGluZyBkaXJlY3RpdmUpLgogICAgIEJlY2F1c2UgaXQgd2FzIG1pc3NpbmcsIGl0IHdhcyBhbG1vc3QgaW1wb3NzaWJsZSB0byBicm93c2UgY29tcHJlc3NlZAogICAgIGZpbGVzIHVzaW5nIHRoZSBGVFAgcHJveHkgKHdvcmtzIG5vdyBwZXJmZWN0bHkgaW4gQ29tbXVuaWNhdG9yKS4KICAgICBUaGUgZnRwIHByb3h5IG5vdyBhbHNvIHJldHVybnMgdGhlIERhdGU6IGFuZCBTZXJ2ZXI6IGhlYWRlciBsaW5lcyAoaWYgbm90CiAgICAgbXVjaCBlbHNlLi4uIFRoaXMgY29kZSBpcyAic29tZXdoYXQiIGJyb2tlbikgbGlrZSBub3JtYWwgcmVxdWVzdHMgZG8uCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBCZSBtb3JlIHNtYXJ0IGluIEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCB3aGVuIGRldGVybWluaW5nIHRoZSBVSUQvR0lECiAgICAgZm9yIFVzZXIvR3JvdXAgZGlyZWN0aXZlcyBhbmQgdXNlIHRoZSBkZXRlcm1pbmVkIFVJRC9HSUQgdG8gaW5pdGlhbGl6ZQogICAgIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgcHJveHljYWNoZWRpci4KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDaGFuZ2VkIHRoZSBmb3JraW5nLXByaW9yLXRvLWNsZWFudXAgaW4gdGhlIHByb3h5IG1vZHVsZSB0byBmaXJzdAogICAgIGNoZWNrIHdldGhlciBpdCBhY3R1YWxseSBuZWVkcyB0byBjb2xsZWN0IGdhcmJhZ2UuIFRoaXMgcmVkdWNlcyAKICAgICB0aGUgbnVtYmVyIG9mIGZvcmsoKXMgZnJvbSBvbmUvcmVxdWVzdCB0byBqdXN0IHRoZSBvZGQgb25lIGFuIGhvdXIuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpa10KCiAgKikgQWRkZWQgcHJveHksIGF1dGggYW5kIGhlYWRlciBzdXBwb3J0IHRvIHNyYy9zdXBwb3J0L2FiLmMuIEFkZGVkIGEKICAgICBSRUFETUUgZmlsZSB0byBzcmMvc3VwcG9ydC8KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBEb24ndCBoYXJkLWNvZGUgdGhlIHBhdGggdG8gQVdLIGluIC0tc2hhZG93IGJvb3RzdHJhcHBpbmcgTWFrZWZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzQwNTAKCiAgKikgQWRkIHN1cHBvcnQgZm9yIERTTyBtb2R1bGUgY29tcGlsYXRpb24gb24gQlNEL09TIDMueC4KICAgICBbUmFuZHkgVGVyYnVzaCwgQ292YWxlbnQgVGVjaG5vbG9naWVzXQoKICAqKSBGaXggc2VkLXN1YnN0aXR1dGlvbnMgaW4gYG1ha2UgaW5zdGFsbCc6IHBhdGggZWxlbWVudHMgbGlrZSBgaHR0cGQvY29uZicKICAgICAoZm9yIGluc3RhbmNlIGZyb20gYW4gQVBBQ0kgY29uZmlndXJlIC0tc3lzY29uZmRpcj0vZXRjL2h0dHBkL2NvbmYKICAgICBvcHRpb24pIHdlcmUgc3Vic3RpdHV0ZWQgd2l0aCAkKFRBUkdFVCkuY29uZiwgZXRjLiBTYW1lIGZvciBvdGhlciBzdHJpbmdzCiAgICAgd2l0aCBkb3RzIHdoZXJlIHRoZSBkb3Qgd2Fzbid0IG1hdGNoZWQgYXMgcGxhaW4gdGV4dC4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIDQueCBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHZlcmJvc2Ugb3V0cHV0IG9mIEFQQUNJIGNvbmZpZ3VyZSAob3B0aW9uIC12KSAKICAgICBbTWFydGluIEtyYWVtZXIsIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy42CgogICopIFJlbW92ZWQgbmV3IFBhc3NBbGxFbnYgY29kZSBkdWUgdG8gRFNPIHByb2JsZW1zLiBbTGFycyBFaWxlYnJlY2h0XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuNSBbbm90IHJlbGVhc2VkXQoKICAqKSBNX0lOVkFMSUQgbmVlZGVkIGEgdmFsdWUgd2l0aGluIHRoZSBzY29wZSBvZiBNRVRIT0RTIHNvIHRoYXQgdW5rbm93bgogICAgIG1ldGhvZHMgY2FuIGJlIGFjY2VzcyBjb250cm9sbGVkLiAgW1JveSBGaWVsZGluZ10gUFIjMzgyMQoKICAqKSBBZGRlZCBQYXNzQWxsRW52OyBtYWtlcyBzZXJ2ZXIncyBlbnRpcmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlCiAgICAgdG8gQ0dJcyBhbmQgU1NJcyBleGVjdXRlZCB3aXRoaW4gZGlyZWN0aXZlJ3Mgc2NvcGUuICBbS2VuIENvYXJdCgogICopIGFwX3V1ZW5jb2RlKCkgYWx3YXlzIGFkZGVkIHR3byB0cmFpbGluZyAnPSdzIGFuZCBlbmNvZGluZyBvZgogICAgIDggYml0IGNoYXJhY3RlcnMgb24gYSBtYWNoaW5lIHdpdGggc2lnbmVkIGNoYXIgbWF5IHByb2R1Y2VkCiAgICAgaW5jb3JyZWN0IHJlc3VsdHMuIEFkZGl0aW9uYWxseSBhcF91dWVuY29kZSgpIHNob3VsZCBub3cKICAgICB3b3JrIGNvcnJlY3RseSBvbiBFQkNESUMgcGxhdGZvcm1zLgogICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZCBpbm5vdmF0aW9uLmNoPl0gUFIjMzQxMQoKICAqKSBXSU4zMjogQmluYXJ5IGluc3RhbGxlciBub3cgcnVucyB0aGUgY29uZmlndXJhdGlvbiBETEwgYmVmb3JlCiAgICAgdGhlIHJlYm9vdCBwcm9tcHQgKHdoaWNoIGlzIG9ubHkgZ2l2ZW4gaWYgTVNWQ1JULkRMTCBzeXN0ZW0KICAgICBETEwgaXMgbmV3IG9yIHVwZGF0ZWQpLiBUaGlzIHNob3VsZCBhdm9pZCB0aGUgY29uZmlndXJhdGlvbgogICAgIGRpcmVjdG9yeSBiZWluZyBlbXB0eSBhZnRlciBpbnN0YWxsYXRpb24uIFtQYXVsIFN1dHRvbl0KICAgICBQUiMzNzY3LCAzODAwLCAzODI3LCAzODUwLCAzOTAwLCAzOTUzLCAzOTg4CgogICopIFdJTjMyOiBCaW5hcnkgaW5zdGFsbGVyIG5vdyBjcmVhdGVzIFN0YXJ0IG1lbnUgb3B0aW9ucyB0byBzdGFydAogICAgIGFuZCBzdG9wIEFwYWNoZSBhcyBhIGNvbnNvbGUgYXBwbGljYXRpb24gYW5kIHRvIHVuaW5zdGFsbAogICAgIHRoZSBBcGFjaGUgc2VydmljZSBvbiBOVC4gW1BhdWwgU3V0dG9uXSBQUiMzNzQxCgogICopIFdJTjMyOiBBcGFjaGUuZXhlIG5vdyBjb250YWlucyBhbiBpY29uLiBbUGF1bCBTdXR0b25dCgogICopIFBPUlQ6IFN3aXRjaCBiYWNrIHRvIHVzaW5nIGZjbnRsKCkgbG9ja2luZyBvbiBMaW51eCAtLSBpbnN0YWJpbGl0aWVzCiAgICAgaGF2ZSBiZWVuIHJlcG9ydGVkIHdpdGggZmxvY2soKSBsb2NraW5nIChwcm9iYWJseSByZWxhdGVkIHRvIGtlcm5lbAogICAgIHZlcnNpb24pLiAgW0RlYW4gR2F1ZGV0XSBQUiMyNzIzLCAzNTMxCgogICopIFVzaW5nIEFQQUNJLCB0aGUgbWFpbiBjb25maWcgZmlsZSAodXN1YWxseSBodHRwZC5jb25mKSB3YXMKICAgICBub3QgYmVpbmcgYWRqdXN0ZWQgYXMgJChUQVJHRVQpLmNvbmYuIFtXaWxmcmVkbyBTYW5jaGV6CiAgICAgPHdzYW5jaGV6IGFwcGxlLmNvbT5dCgogICopIFBPUlQ6IEFJWCBkb2VzIG5vdCByZXF1aXJlIHRoZSBTSEFSRURfQ09ERSAiaGFjayIKICAgICBbUnlhbiBCbG9vbSA8cmJiIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIFNldC1Db29raWUgaGVhZGVycyB3ZXJlIGJlaW5nIGRvdWJsZWQgdXAgZm9yIHNvbWUgQ0dJcyBieSB0aGUgTyhuXjIpCiAgICAgYXZvaWRhbmNlIGNvZGUgYWRkZWQgaW4gMS4zLjMuCiAgICAgW0RlYW4gR2F1ZGV0LCBKZWZmIExld2lzIDxsZXdpcyBzdGFuZm9yZC5lZHU+XSBQUiMzODcyCgogICopIGFwX2lzeGRpZ2l0IHdhcyBzb21laG93IG5lZ2xlY3RlZCB3aGVuIGFkZGluZyB0aGUgYXBfaXNmb28oKSBtYWNyb3MKICAgICBmb3IgOC1iaXQgc2FmZW5lc3MuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFVzZSAtZlBJQyBpbnN0ZWFkIG9mIC1mcGljIG9uIFNvbGFyaXMgYW5kIFN1bk9TIGZvciBjb21waWxpbmcgRFNPcwogICAgIGJlY2F1c2UgU1BBUkNzIGhhdmUgYSBzbWFsbCBtYWNoaW5lLXNwZWNpZmljIG1heGltdW0gc2l6ZSBmb3IgdGhlIEdsb2JhbAogICAgIE9mZnNldCBUYWJsZSB3aGljaCBpcyBvZnRlbiBleGNlZWRlZCB3aGVuIGNvbXBpbGluZyBvbmUgb2YgdGhlIGxhcmdlcgogICAgIHRoaXJkLXBhcnR5IG1vZHVsZXMgd2l0aCBBcGFjaGUuIFtQZXRlciBVcmJhbiA8UGV0ZXIuVXJiYW4gZXBmbC5jaD5dIFBSIzM5NzcKCiAgKikgTW92ZSB0aGUgZGlyZWN0aXZlIGBFeHRlbmRlZFN0YXR1cycgaW4gaHR0cGQuY29uZi1kaXN0LXdpbiBfYWZ0ZXJfIHRoZQogICAgIERTTy9ETEwgc2VjdGlvbiBiZWNhdXNlIGl0J3MgYSBkaXJlY3RpdmUgZnJvbSBtb2Rfc3RhdHVzIGFuZCBpc24ndAogICAgIGF2YWlsYWJsZSBiZWZvcmUgdGhlIERMTCBvZiBtb2Rfc3RhdHVzIGlzIGxvYWRlZC4KICAgICBbTWFydGluIFBPRVNDSEwgPG1wb2VzY2hsIGdteC5uZXQ+XSBQUiMzOTM2CgogICopIFNFQ1VSSVRZOiBGaXggYSBidWcgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIGxpbmUgCiAgICAgY29udGludWF0aW9uIGZhY2lsaXR5IGluIEFwYWNoZSdzIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2hpY2ggY291bGQgCiAgICAgbGVhZCB0byBhIGJ1ZmZlciBvdmVyZmxvdyBzaXR1YXRpb24uCiAgICAgW1Rob21hcyBEZXZhbm5lYXV4IDxUaG9tYXMuRGV2YW5uZWF1eCBlbnN0LmZyPl0gUFIjMzYxNwoKICAqKSBNYWtlIGRvY3VtZW50YXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzIG9mIEFQQUNJJ3MgLS1hY3RpdmF0ZS1tb2R1bGU9RklMRSAKICAgICBvcHRpb24gbW9yZSBjbGVhci4gW0phbiBXb2x0ZXIgPGphbmMgd3duZXQubmV0Pl0gUFIjMzk5NQoKICAqKSBGaXggdGhlIGdjYyB2ZXJzaW9uIGNoZWNrIChmb3IgZW5hYmxpbmcgdGhlIGBpbmxpbmUnIGZhY2lsaXR5KSB0byAKICAgICByZWFsbHkgc3VwcG9ydCBhbGwgZnV0dXJlIGdjYyB2ZXJzaW9ucyA+PSAyLjcgdW50aWwgd2Uga25vdyBtb3JlLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXkgYmFudGEtaW0uY29tPl0gUFIjMzk4MwoKICAqKSBMZXQgQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0IGNvcnJlY3RseSBjb21wbGFpbiBmb3IgdW5rbm93biAtLWVuYWJsZS1YWFgKICAgICBhbmQgLS1kaXNhYmxlLVhYWCBvcHRpb25zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzk1OAoKICAqKSBMaW5rIHRoZSBzaGFyZWQgY29yZSBib290c3RyYXAgcHJvZ3JhbSAoYGBSdWxlIFNIQVJFRF9DT1JFPXllcycnKSBhbHNvCiAgICAgYWdhaW5zdCBsaWJhcC5hIGFuZCB1c2UgaXRzIGFwX3NucHJpbnRmKCkgaW5zdGVhZCBvZiBzcHJpbnRmKCkgdG8gYXZvaWQKICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIG5vIGxvbmdlciB1c2VkIG5vbi1BUEkgZnVuY3Rpb24gYXBfc2luZ2xlX21vZHVsZV9pbml0KCkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBBcHBsZSdzIE1hYyBPUyBYIFNlcnZlciBMYXlvdXQgIlJoYXBzb2R5IiB0byBjb25maWcubGF5b3V0LgogICAgIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBBZGQgY2dpZGlyLCBodGRvY3NkaXIsIGljb25zZGlyIHZhcmlhYmxlcyB0byBNYWtlZmlsZS50bXBsIGluIG9yZGVyCiAgICAgdG8gbWFrZSBwbGF0Zm9ybSBpbnN0YWxsYXRpb25zIGVhc2llci4gIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBJbiBjb25maWd1cmUsIGRvIG5vdCBhcHBlbmQgdGhlIHRhcmdldCBuYW1lIHRvIHRoZSBkaXJlY3RvcnkgcGF0aCBpZgogICAgIHRoZSBwYXRoIGFscmVhZHkgY29udGFpbnMgImFwYWNoZSIuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU0lHUElQRSBpcyBub3cgaWdub3JlZCBieSB0aGUgc2VydmVyIGNvcmUuICBUaGUgcmVxdWVzdCB3cml0ZSByb3V0aW5lcwogICAgIChhcF9ycHV0YywgYXBfcnB1dHMsIGFwX3J2cHV0cywgYXBfcndyaXRlLCBhcF9ycHJpbnRmLCBhcF9yZmx1c2gpIG5vdwogICAgIGNvcnJlY3RseSBjaGVjayBmb3Igb3V0cHV0IGVycm9ycyBhbmQgbWFyayB0aGUgY29ubmVjdGlvbiBhcyBhYm9ydGVkLgogICAgIFJlcGxhY2VkIG1hbnkgZGlyZWN0ICh1bmNoZWNrZWQpIGNhbGxzIHRvIGFwX2IqIHJvdXRpbmVzIHdpdGggdGhlCiAgICAgYW5hbG9nb3VzIGFwX3IqIGNhbGxzLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRW5oYW5jZWQgbW9kX3Jld3JpdGUncyBtYXBmaWxlIGhhbmRsaW5nOiBUaGUgaW4tY29yZSBjYWNoZSBmb3IgdGV4dCBhbmQKICAgICBEQk0gZm9ybWF0IG1hcGZpbGVzIG5vdyB1c2VzIGEgNC13YXkgaGFzaCB0YWJsZSB3aXRoIExSVSBmdW5jdGlvbmFsaXR5LgogICAgIEZ1cnRoZXJtb3JlIG1hcCBsb29rdXBzIGZvciBub24tZXhpc3RlbnQga2V5cyBhcmUgbm93IGNhY2hlZCBhcyB3ZWxsLgogICAgIEFkZGl0aW9uYWxseSAidHh0IiBtYXBzIGFyZSBub3cgcGFyc2VkIHdpdGggc2ltcGxlIHN0cmluZyBmdW5jdGlvbnMKICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwX3ByZWdjb21wKCkuIEFzIGEgc2lkZSBlZmZlY3QgYSBidWcgdGhhdCBwcmV2ZW50ZWQKICAgICB0aGUgdXNhZ2Ugb2Yga2V5cyBjb250YWluaW5nIHRoZSAiLCIgY2hhcmFjdGVyIHdhcyBmaXhlZC4KICAgICBUaGUgY2hhbmdlcyBkcmFzdGljYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSB3aGVuIGxhcmdlIHJld3JpdGUgbWFwcwogICAgIGFyZSBpbiB1c2UuCiAgICAgW01pY2hhZWwgdmFuIEVsc3QgPG1sZWxzdHYgc2VycGVucy5zd2IuZGU+LCBMYXJzIEVpbGVicmVjaHRdIFBSIzMxNjAKCiAgKikgQWRkZWQgYXBfc3ViX3JlcV9tZXRob2RfdXJpKCkgZm9yIGRvaW5nIGEgc3VicmVxdWVzdCB3aXRoIGEgbWV0aG9kCiAgICAgb3RoZXIgdGhhbiBHRVQsIGFuZCBjb25zdCdkIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBpbiByZXF1ZXN0X3JlYy4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgVXNlIHByb3BlciBwaWRfdCB0eXBlIGZvciBzYXZpbmcgUElEcyBpbiBhbGxvYy5jLiAgW0pvaG4gQmxleV0KCiAgKikgUmVwbGFjZWQgdXNlIG9mIFdJTjMyIGRlZmluZSB3aXRoIEhBVkVfRFJJVkVfTEVUVEVSUyB0byBpbmRpY2F0ZQogICAgIHdoZW4gdGhlIE9TIGFsbG93cyBhIERPUyBkcml2ZSBsZXR0ZXIgd2l0aGluIHBhdGhuYW1lcy4gIFtCcmlhbiBIYXZhcmRdCgogICopIEFkZCAlViB0byBtb2RfbG9nX2NvbmZpZywgdGhpcyBsb2dzIHRoZSBob3N0bmFtZSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgVXNlQ2Fub25pY2FsTmFtZSBzZXR0aW5nICh0aGlzIGlzIHRoZSBwcmUtMS4zLjQgYmVoYXZpb3VyIG9mCiAgICAgJXYpLiAgVXNlZnVsIGZvciBtYXNzIHZob3N0aW5nLiAgW1RvbnkgRmluY2ggPGRvdCBkb3RhdC5hdD5dCgogICopIEFkZCBzdXBwb3J0IGZvciBcbiBhbmQgXHQgdG8gbW9kX2xvZ19jb25maWcsIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UKICAgICBtb3JlIHJlbGlhYmxlIGxvZ3Mgd2l0aCBtdWx0aWxpbmUgZW50cmllcy4gIFtUb255IEZpbmNoIDxkb3QgZG90YXQuYXQ+XQoKICAqKSBGaXhlZCBhIGZldyBjb21waWxlciBuaXRzLiAgW0pvaG4gQmxleSA8amJiNiBhY3B1Yi5kdWtlLmVkdT5dCgogICopIEFkZGVkIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBmYWlsZWQgbXVubWFwKCkgYW5kIGZzZWVrKCkgY2FsbHMKICAgICBpbiBodHRwX2NvcmUuYy4gW0pvaG4gQmxleSwgUm95IEZpZWxkaW5nXQoKICAqKSBBZGRlZCBzb21lIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBzb21lIGZhaWxlZCBtYWxsb2MoKQogICAgIGNhbGxzLiBbSm9obiBCbGV5IDxqYmI2IGFjcHViLmR1a2UuZWR1PiwgSmltIEphZ2llbHNraV0KCiAgKikgT1MvMiBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoKSdzIGJlaGF2aW91ciBpcyBpbXByb3ZlZDogYXBfYXNzZXJ0KCkKICAgICBpcyByZW1vdmVkLiBUaGlzIGFsbG93cyA8RGlyZWN0b3J5IHByb3h5Oio+IGRpcmVjdGl2ZXMgdG8gd29yayBhbmQKICAgICBwcmV2ZW50cyBpbnZhbGlkIHJlcXVlc3RzIGZyb20ga2lsbGluZyB0aGUgcHJvY2Vzcy4KICAgICBbQnJpYW4gSGF2YXJkIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBSZW9yZ2FuaXNlZCBGQVEgZG9jdW1lbnQuCiAgICAgW0pvc2h1YSBTbGl2ZSA8c2xpdmUgZmluYW5jZS5jb21tZXJjZS51YmMuY2E+XSBQUiMyNDk3CgogICopIHNyYy9zdXBwb3J0LzogVGhlIEFwYWNoZUJlbmNoIGJlbmNobWFyayBwcm9ncmFtIHdhcyBvdmVyaGF1bGVkIGJ5CiAgICAgRGF2aWQgTi4gV2VsdG9uOiB5b3UgY2FuIG5vdyBoYXZlIGl0IGdlbmVyYXRlIGFuIEhUTUwgVEFCTEUsIHByZXN1bWFibHkKICAgICBmb3IgaW50ZWdyYXRpb24gaW50byBvdGhlciBIVE1MIHNvdXJjZXMuIERhdmlkIHVwZGF0ZWQgdGhlIGFiIG1hbiBwYWdlCiAgICAgYXMgd2VsbCBhbmQgYWRkZWQgc29tZSBtaXNzaW5nIGRlc2NyaXB0aW9ucy4gVGhhbmtzIQogICAgIFtEYXZpZCBOLiBXZWx0b24gPGRhdmlkdyBwcm9zYS5pdD5dCgogICopIFdpbjMyOiBUaGUgZmlsZW5hbWUgdmFsaWRpdHkgY2hlY2tlciBub3cgYWxsb3dzIGZpbGVuYW1lcyBjb250YWluaW5nCiAgICAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMHg4MCB0byAweGZmIChmb3IgZXhhbXBsZSBhY2NlbnRlZCBjaGFyYWN0ZXJzKS4KICAgICBbUGF1bCBTdXR0b25dIFBSIzM4OTAKCiAgKikgQWRkZWQgY29uZGl0aW9uYWwgbG9nZ2luZyBiYXNlZCB1cG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bwogICAgIG1vZF9sb2dfY29uZmlnLiAgbW9kX2xvZ19yZWZlcmVyIGFuZCBtb2RfbG9nX2FnZW50CiAgICAgYXJlIG5vdyBkZXByZWNhdGVkLiAgW0tlbiBDb2FyXQoKICAqKSBBbGxvdyBhcGFjaGUgYWN0aW5nIGFzIGEgcHJveHkgc2VydmVyIHRvIHJlbGF5IHRoZSByZWFsCiAgICAgcmVhc29uIG9mIGEgZmFpbHVyZSB0byBhIGNsaWVudCByYXRoZXIgdGhhbiB0aGUgImludGVybmFsCiAgICAgc2VydmVyIGVycm9yIiBpdCBkb2VzIGN1cnJlbnRseS4gVGhlIGdlbmVyYWwgZXhwb3N1cmUgbWVjaGFuaXNtCiAgICAgY2FuIGJlIHRyaWdnZXJlZCBieSBhbnkgbW9kdWxlIGJ5IHNldHRpbmcgdGhlICJ2ZXJib3NlLWVycm9yLXRvIgogICAgIG5vdGUgdG8gIioiOyB0aGlzIGFsbG93cyBtb3JlIHRoYW4ganVzdCBwcm94eSBlcnJvcnMgdG8gYmUgZXhwb3NlZC4KICAgICBbQ2xpZmYgU2tvbG5pY2ssIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NSwgNDA4NgoKICAqKSBNb3ZlZCBtYW4gcGFnZXMgZm9yIGFiIGFuZCBhcGFjaGVjdHJsIHRvIHNlY3Rpb24gOC4KICAgICBbV2lsZnJlZG8gU2FuY2hleiwgUm95IEZpZWxkaW5nXQoKICAqKSBBZGRlZCAtUyBvcHRpb24gdG8gaW5zdGFsbC5zaCBzbyB0aGF0IG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0bwogICAgIHN0cmlwIG9uIHNvbWUgcGxhdGZvcm1zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgVHdlYWsgbW9kdWxlcyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgQ29uZmlndXJlIHNvIHRoYXQgaXQgaGFuZGxlcwogICAgIHRoZSB0ZXN0IGNhc2Ugb2Ygbm8gbW9kdWxlcyBiZWluZyBzZWxlY3RlZC4gWzxjaGF6IHJlbGlhbnQuY29tPl0KCiAgKikgQWRkZWQgYSA8TGltaXRFeGNlcHQgbWV0aG9kIC4uLj4gc2VjdGlvbmluZyBkaXJlY3RpdmUgdGhhdCBhbGxvd3MKICAgICB0aGUgdXNlciB0byBhc3NpZ24gYXV0aGVudGljYXRpb24gY29udHJvbCB0byBhbnkgSFRUUCBtZXRob2QgdGhhdAogICAgIGlzICpub3QqIGdpdmVuIGluIHRoZSBhcmd1bWVudCBsaXN0OyBpLmUuLCB0aGUgbG9naWNhbCBuZWdhdGlvbgogICAgIG9mIHRoZSA8TGltaXQ+IGRpcmVjdGl2ZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29udHJvbGxpbmcKICAgICBhY2Nlc3Mgb24gbWV0aG9kcyB1bmtub3duIHRvIHRoZSBBcGFjaGUgY29yZSwgYnV0IHBlcmhhcHMga25vd24gYnkKICAgICBzb21lIG1vZHVsZSBvciBDR0kgc2NyaXB0LiBbUm95IEZpZWxkaW5nLCBUb255IEZpbmNoXQoKICAqKSBQcmV2ZW50IGFwYWNoZWN0bCBmcm9tIGNvbXBsYWluaW5nIGlmIHRoZSBQSURGSUxFIGV4aXN0cyBidXQKICAgICBkb2VzIG5vdCBjb250YWluIGEgcHJvY2VzcyBpZCwgYXMgbWlnaHQgb2NjdXIgaWYgdGhlIHNlcnZlciBpcwogICAgIGJlaW5nIHJhcGlkbHkgcmVzdGFydGVkLiBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgV2luMzI6IEFkZCBnbG9iYWwgc3ltYm9scyBtaXNzaW5nIGZyb20gQXBhY2hlQ29yZS5kZWYuIFtDYXJsIE9sc2VuXQoKICAqKSBFbnRpdHkgdGFnIGNvbXBhcmlzb25zIGZvciBJZi1NYXRjaCBhbmQgSWYtTm9uZS1NYXRjaCB3ZXJlIG5vdCBiZWluZwogICAgIHBlcmZvcm1lZCBjb3JyZWN0bHkgLS0gd2VhayB0YWdzIG1pZ2h0IGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4gIEFsc28sCiAgICAgc3Ryb25nIGNvbXBhcmlzb24gd2Fzbid0IHByb3Blcmx5IGVuZm9yY2VkIGluIGFsbCBjYXNlcy4KICAgICBbUm95IEZpZWxkaW5nLCBLZW4gQ29hciwgRGVhbiBHYXVkZXRdIFBSIzIwNjUsIDM2NTcKCiAgKikgT1MvMjogU3VwcGx5IE9TLzIgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGVycm5vIG9uIHNlbWFwaG9yZSBlcnJvcnMuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTHlueCByZWdhcmRpbmcgaXRzIHNlbmRpbmcgIk5lZ290aWF0ZTogdHJhbnMiCiAgICAgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCB1bmRlcnN0YW5kIFRDTi4gIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgYXBfc2l6ZV9saXN0X2l0ZW0oKSwgYXBfZ2V0X2xpc3RfaXRlbSgpLCBhbmQgYXBfZmluZF9saXN0X2l0ZW0oKQogICAgIHRvIHV0aWwuYyBmb3IgcGFyc2luZyBhbiBIVFRQIGhlYWRlciBmaWVsZCB2YWx1ZSB0byBleHRyYWN0IHRoZSBuZXh0CiAgICAgbGlzdCBpdGVtLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwb3NzaWJsZSBwcmVzZW5jZSBvZiBuZXN0ZWQgY29tbWVudHMsCiAgICAgcXVvdGVkLXBhaXJzLCBhbmQgcXVvdGVkLXN0cmluZ3MuIGFwX2dldF9saXN0X2l0ZW0oKSBhbHNvIHJlbW92ZXMKICAgICBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2UgYW5kIGxvd2VyY2FzZXMgbm9uLXF1b3RlZCB0b2tlbnMuCiAgICAgW1JveSBGaWVsZGluZ10gUFIjMjA2NQoKICAqKSBwcm94eTogVGhlIHZhcmlvdXMgY2FsbHMgdG8gYXBfcHJveHllcnJvcigpIGNhbiByZXR1cm4gSFRUUC8xLjEgc3RhdHVzCiAgICAgY29kZSBkaWZmZXJlbnQgZnJvbSA1MDAuIFRoaXMgYWxsb3dzIHRoZSBwcm94eSB0bywgZS5nLiwgcmV0dXJuCiAgICAgIjQwMyBGb3JiaWRkZW4iIGZvciBQcm94eUJsb2NrJ2VkIFVSTCdzLiBbTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NQoKICAqKSBGaXggb3JkZXJpbmcgb2YgbGFuZ3VhZ2UgdmFyaWFudHMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0cmFkaXRpb25hbAogICAgIG5lZ290aWF0aW9uIGFsZ29yaXRobSBpcyBiZWluZyB1c2VkIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2UgdmFyaWFudHMKICAgICBhbmQgbm8gQWNjZXB0LUxhbmd1YWdlLiBbSmFtZXMgVHJlYWN5IDx0cmVhY3kgZGViaWFuLm9yZz5dIFBSIzMyOTksIDM2ODgKCiAgKikgRG8gbm90IHJvdW5kIHRoZSBUQ04gcXVhbGl0eSBjYWxjdWxhdGlvbiB0byA1IGRlY2ltYWwgcGxhY2VzLAogICAgIHVubGlrZSBSRkMgMjI5NiwgYmVjYXVzZSB0aGUgY2FsY3VsYXRpb24gbWlnaHQgbmVlZCAxMiBkZWNpbWFsIHBsYWNlcwogICAgIHRvIGdldCB0aGUgcmlnaHQgcmVzdWx0LiAgW1JveSBGaWVsZGluZ10KCiAgKikgUmVtb3ZlIHVudXNlZCBjb2RlIHRvIGRpc2FibGUgdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24gd2hlbgogICAgIG5lZ290aWF0aW5nIG9uIGVuY29kaW5nIG9ubHksIGFzIHdlIG5vdyBoYW5kbGUgZW5jb2RpbmcgdG9vCiAgICAgKHRob3VnaCB0aGlzIGlzIG5vbnN0YW5kYXJkIGZvciBUQ04pLCByZW1vdmUgY2hhcnNldD1JU08tODg1OS0xCiAgICAgZmlkZGxlIGZyb20gdGhlIGZpZGRsZS1hdmVyc2UgUlZTQSBjb21wYXJpc29uLCBhbmQgZml4IGJ1Z3MgaW4KICAgICBzb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHdpdGhpbiBtb2RfbmVnb3RpYXRpb24uIFtLb2VuIEhvbHRtYW5dCgogICopIEZpeGVkIGEgcmFyZSBtZW1vcnkgY29ycnVwdGlvbiBwb3NzaWJpbGl0eSBpbiBtb2RfZGlyIGlmIHRoZSBpbmRleAogICAgIGZpbGUgaXMgbmVnb3RpYWJsZSBhbmQgbm8gYWNjZXB0YWJsZSB2YXJpYW50IGNhbiBiZSBmb3VuZC4KICAgICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdCgogICopIFdpbjMyOiBBZGQgbmV3IGNvbmZpZyBkaXJlY3RpdmUsIFNjcmlwdEludGVycHJldGVyU291cmNlLCB0byBlbmFibGUKICAgICBzZWFyY2hpbmcgdGhlIFdpbjMyIHJlZ2lzdHJ5IGZvciBzY3JpcHQgaW50ZXJwcmV0ZXJzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMjogVGhlIGNvbXBpbGVkLWluIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciBsb2cgaXMgbm93CiAgICAgZXJyb3IubG9nLCB3aGljaCBtYXRjaGVzIHRoZSBkZWZhdWx0IGluIHRoZSBkaXN0cmlidXRlZCBodHRwZC5jb25mLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgV2luMzI6IEFueSBlcnJvciBtZXNzYWdlcyBmcm9tIC1pIG9yIC11IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cKICAgICBkaXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgb3V0cHV0IHJhdGhlciB0aGFuIHNlbnQgdG8gdGhlIGVycm9yIGxvZy4KICAgICBBbHNvIHRoZSAiUnVubmluZyBBcGFjaGUuLi4iIG1lc3NhZ2UgaXMgbm90IG91dHB1dCB1bmxlc3MgQXBhY2hlIGlzCiAgICAgZ29pbmcgdG8gc2VydmUgcmVxdWVzdHMuIFtQYXVsIFN1dHRvbl0KCiAgKikgUmV3b3JrIHRoZSBNRDUgYXV0aGVudGljYXRpb24gc2NoZW1lIHRvIHVzZSBGcmVlQlNEJ3MgYWxnb3JpdGhtLAogICAgIGFuZCB1c2UgYSBwcml2YXRlIHNpZ25pZmljYXRvciAoJyRhcHIxJCcpIHRvIG1hcmsgcGFzc3dvcmRzIGFzCiAgICAgYmVpbmcgc21hc2hlZCB3aXRoIG91ciBvd24gYWxnb3JpdGhtLiAgQWxzbyBhYnN0cmFjdCB0aGUgcGFzc3dvcmQKICAgICBjaGVja2luZyBpbnRvIGEgbmV3IGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgcm91dGluZS4gIFtLZW4gQ29hcl0KCiAgKikgV2luMzI6IFRoZSBmaWxlbmFtZSB2YWxpZGl0eSBjaGVja2VyIG5vdyBhbGxvd3MgIkNPTSIgYnV0IHJlZnVzZXMgCiAgICAgYWNjZXNzIHRvICJDT00xIiB0aHJvdWdoICJDT000Ii4gVGhpcyBhbGxvd3MgZmlsZW5hbWVzIHN1Y2gKICAgICBhcyAiY29tLm5hbWUiIHRvIGJlIHNlcnZlZC4gW1BhdWwgU3V0dG9uXSBQUiMzNzY5LgoKICAqKSBCUzIwMDA6IEFkYXB0IHRvIHRoZSBuZXcgdWZvcmsoKSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2Ugd2hpY2ggd2lsbAogICAgIG1ha2Ugc3VidGFza2luZyBlYXNpZXIgb24gdGhlIE9TRC9QT1NJWCBtYWluZnJhbWUgZW52aXJvbm1lbnQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgYSBjb21wYXRpYmlsaXR5IGRlZmluZSBmb3IgZXNjYXBlX3VyaSgpIC0+IGFwX2VzY2FwZV91cmkoKSB0bwogICAgIGFwX2NvbXBhdC5oLiBbRGF2aWQgV2hpdGUgPGRhdmlkIHBlcnNpbW1vbi5jb20+XSBQUiMzNzI1CgogICopIE1ha2UgTkRCTSBmaWxlIHN1ZmZpeCBkZXRlcm1pbmF0aW9uIGZvciBtb2RfcmV3cml0ZSBtb3JlIGFjY3VyYXRlLCBpLmUuCiAgICAgdXNlIGAuZGInIGluc3RlYWQgb2YgYC5wYWcnIG5vdCBvbmx5IGZvciBGcmVlQlNELCBidXQgYWxzbyB3aGVuCiAgICAgdGhlIE5EQk0gbGlicmFyeSBsb29rcyBsaWtlIEJlcmtlbGV5LURCIGJhc2VkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzNzczCgogICopIEFkZCBhYmlsaXR5IHRvIGhhbmRsZSBERVMgb3IgTUQ1IGF1dGhlbnRpY2F0aW9uIHBhc3N3b3Jkcy4KICAgICBbUnlhbiBCbG9vbSA8cmJiIFJhbGVpZ2guSUJNLkNvbT5dCgogICopIEZpeCBPKG5eMikgbWVtb3J5IGNvbnN1bXB0aW9uIGluIG1vZF9zcGVsaW5nLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogQXZvaWQgc29tZSBidWZmZXIgb3ZlcmZsb3cgcHJvYmxlbXMgd2hlbiBlc2NhcGluZwogICAgIHF1b3RlZCBzdHJpbmdzLiAgKFRoaXMgb3ZlcmZsb3cgd2FzIG9uIHRoZSBoZWFwIGFuZCB3ZSBiZWxpZXZlCiAgICAgaW1wb3NzaWJsZSB0byBleHBsb2l0LikgIFtSaWNrIFBlcnJ5IDxwZXJyeSBlY2UudmlsbC5lZHU+XQoKICAqKSBMZXQgc3JjL0NvbmZpZ3VyZSBiZSBhd2FyZSBvZiBDRkxBR1Mgb3B0aW9ucyBzdGFydGluZyB3aXRoIHBsdXMKICAgICBzaWducyBhcyBpdCdzIHRoZSBjYXNlIGZvciB0aGUgSFAvVVggY29tcGlsZXIuCiAgICAgW0RvdWcgWWF0Y2lsbGEgPHlhdGNpbGRhIHVtZG5qLmVkdT5dIFBSIzM2ODEKCiAgKikgUmVtb3ZlIHRoZSBoYXJkLXdpcmUgb2YgVEFSPXRhciAod2Ugbm93IGNoZWNrIGZvciBndGFyIGFuZCBnbnV0YXIgZmlyc3QpCiAgICAgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgdGFyIHdlIHdpbmQgdXAgd2l0aCBzdXBwb3J0cyAnLWgnLgogICAgIFtKaW0gSmFnaWVsc2tpXSBQUiMzNjcxCgogICopIEEgY29uc2lzdGVudCBhbmQgY29uc2VydmF0aXZlIHN0eWxlIGZvciBhbGwgc2hlbGwgc2NyaXB0cyBoYXMgYmVlbgogICAgIGltcGxlbWVudGVkLiBCYXNpY2FsbHksIGFsbCBzaGVsbCBzdHJpbmcgdGVzdHMgdXNlIHRoZSB0cmFkaXRpb25hbAogICAgIGhhY2sgb2YgJ2lmIFsgIngkdmFyIiAhPSAieCIgXScgb3IgJ2lmIFsgIngkdmFyIiA9ICJ4c3RyaW5nIiBdJwogICAgIHRvIHByb3RlY3QgYWdhaW5zdCBiYXJlIG51bGwgdmFyaWFibGUgc3RyaW5ncyAoaWU6IHdyYXBwaW5nIGJvdGgKICAgICBzaWRlcyB3aXRoIGRvdWJsZSBxdW90ZXMgYW5kIHByZXBlbmRpbmcgJ3gnKS4gJ3gnIHdhcyBjaG9zZW4KICAgICBiZWNhdXNlIGl0J3MgbW9yZSB1bml2ZXJzYWwgYW5kIGhvcGVmdWxseSBlYXNpZXIgZm9yIG9sZCBzaGVsbAogICAgIHByZ3JhbW1lcnMsIGFzIHdlbGwgYXMgYmVpbmcgZWFzaWVyIHRvIHNlYXJjaCBmb3IgaW4gJ3ZpJyAoL3hcJCkgOikKICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgVGhlIHN0YXR1cyBtb2R1bGUgbm93IHByaW50cyBvdXQgYm90aCB0aGUgbWFpbiBzZXJ2ZXIgZ2VuZXJhdGlvbiBhcwogICAgIHdlbGwgYXMgdGhlIGdlbmVyYXRpb24gb2YgZWFjaCBwcm9jZXNzLiBBbHNvLCB0aGUgdmhvc3QgaW5mbyBpcwogICAgIHByaW50ZWQgd2l0aCAnP25vdGFibGUnLiBbSmltIEphZ2llbHNraV0KCiAgKikgTW92ZSBzcmMvbWFpbi9tZDVjLmMgdG8gc3JjL2FwL2FwX21kNWMuYzsgaXQncyBodHRwZC1uZXV0cmFsCiAgICAgYW5kIHRoaXMgbWFrZXMgaXRzIGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gdGhpbmdzIGluIHNyYy9zdXBwb3J0LgogICAgIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjQKCiAgKikgUmVuYW1lZCBtYWNyb3Mgc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gdG8gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KICAgICBhbmQgdmVzdGlnaWFsIHNjYW5fc2NyaXB0X2hlYWRlciB0byBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyLAogICAgIG1vc3RseSBmb3IgYWVzdGhldGljIHJlYXNvbnMuIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBxdWVyeSBzd2l0Y2ggImh0dHBkIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgdGhlIE1PRFVMRV9NQUdJQ19DT09LSUUgZnJvbSBiZWZvcmUgdGhlIHZlcnNpb25zIGFuZAogICAgIGZpbGVuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIFNUQU5EQVJEX01PRFVMRV9TVFVGRi4gIEl0cwogICAgIHByZXNlbmNlIGF0IHRoZSBiZWdpbm5pbmcgcHJldmVudGVkIHJlcG9ydGluZyBvZiB0aGUgZmlsZW5hbWUKICAgICBmb3IgbW9kdWxlcyBjb21waWxlZCBiZWZvcmUgMSBKYW51YXJ5IDE5OTkuICBbS2VuIENvYXJdCgogICopIFNFQ1VSSVRZOiBhcF9vc19pc19maWxlbmFtZV92YWxpZCgpIGhhcyBiZWVuIGFkZGVkIHRvIFdpbjMyCiAgICAgdG8gZGV0ZWN0IGFuZCBwcmV2ZW50IGFjY2VzcyB0byBzcGVjaWFsIERPUyBkZXZpY2UgZmlsZSBuYW1lcy4KICAgICBbUGF1bCBTdXR0b24sIEtlbiBQYXJ6eWduYXRdCiAgICAgCiAgKikgV0lOMzI6IENyZWF0ZWQgbmV3IG1ha2VmaWxlcyBNYWtlZmlsZV93aW4zMi50eHQgKG5vcm1hbCBidWlsZCkKICAgICBhbmQgTWFrZWZpbGVfd2luMzJfZGVidWcudHh0IChkZWJ1ZyBidWlsZCkgdGhhdCB3b3JrIG9uIFdpbjk1LgogICAgIFJ1biBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgc3JjIGRpcmVjdG9yeToKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMi50eHQgICAgICAgICAgICMgY29tcGlsZXMgbm9ybWFsIGJ1aWxkCiAgICAgICAgbm1ha2UgL2YgTWFrZWZpbGVfd2luMzIudHh0IGluc3RhbGwgICAjIGNvbXBpbGVzIGFuZCBpbnN0YWxscwogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyLnR4dCBjbGVhbiAgICAgIyByZW1vdmVzIGNvbXBpbGVkIGp1bmsKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgICAgICMgY29tcGlsZXMgZGVidWcgYnVpbGQKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgaW5zdGFsbAogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyX2RlYnVnLnR4dCBjbGVhbgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEFkZGVkIGJpbmJ1aWxkLnNoIGFuZCBmaW5kcHJnLnNoIGhlbHBlcnMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVzCiAgICAgdG8gYnVpbGQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMuIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEluZGV4T3B0aW9ucyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgb25seSB0dXJuZWQgb2ZmIG1ha2luZwogICAgIHRoZSBjb2x1bW4gaGVhZGVycyBhbmNob3JzOyB5b3UgY291bGQgc3RpbGwgY2hhbmdlIHRoZSBkaXNwbGF5CiAgICAgb3JkZXIgYnkgbWFudWFsbHkgYWRkaW5nIGEgJz9OPUEnIG9yIHNpbWlsYXIgcXVlcnkgc3RyaW5nIHRvIHRoZQogICAgIFVSTC4gIE5vdyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgbG9ja3MgaW4gdGhlIHNvcnQgb3JkZXIgc28KICAgICBpdCBjYW4ndCBiZSBvdmVycmlkZGVuIHRoaXMgd2F5LiAgW0tlbiBDb2FyXQoKICAqKSBBZGRlZCBJbmRleE9yZGVyRGVmYXVsdCBkaXJlY3RpdmUgdG8gc3VwcGx5IGEgZGVmYXVsdCBzb3J0IG9yZGVyCiAgICAgZm9yIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZ3MuICBbS2VuIENvYXJdIFBSIzE2OTkKCiAgKikgQ2hhbmdlIHRoZSBhcF9hc3NlcnQgbWFjcm8gdG8gYSB2YXJpYW50IHRoYXQgd29ya3Mgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUmljaGFyZCBQcmlueiA8cmljaGFyZC5wcmlueiBjc28ubmV0Pl0gUFIjMjU3NQoKICAqKSBNYWtlIHN1cmUgdW5kZXIgRUxGLWJhc2VkIE5ldEJTRCAobm93KSBhbmQgT3BlbkJTRCAoZnV0dXJlKSB3ZSBkb24ndAogICAgIHNlYXJjaCBmb3IgYW4gdW5kZXJzY29yZSBvbiBkbHN5bSgpIChhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UKICAgICBmb3IgRnJlZUJTRCAzLjApLiBbVG9kZCBWaWVybGluZyA8dHYgcG9ib3guY29tPl0gUFIjMjQ2MgogIAogICopIFNtYWxsIGZpeCBmb3IgbW9kX2Vudi5odG1sOiBUaGUgbW9kdWxlIHdhcyBkb2N1bWVudGVkIGFzIHRvIGJlIF9ub3RfCiAgICAgY29tcGlsZWQgaW50byBBcGFjaGUgcGVyIGRlZmF1bHQsIGFsdGhvdWdoIGl0IF9JU18gY29tcGlsZWQgaW50byAKICAgICBBcGFjaGUgcGVyIGRlZmF1bHQuIFtTaW0gSGFyYmVydCA8c2ltIG1pbmRzcHJpbmcuY29tPl0gUFIjMzU3MgoKICAqKSBJbnN0ZWFkIG9mIGZpeGluZyBhIGJ1ZyBpbiB0aGUgZ2VuZXJhdGlvbiBwcm9jZWR1cmUgZm9yIGNvbmZpZy5zdGF0dXMgKGEKICAgICBiYWNrc2xhc2ggd2FzIG1pc3NpbmcpIHdlIHJlbW92ZSB0aGUgYnVnIHRvZ2V0aGVyIHdpdGggaXQncyBjb21wbGV0ZQogICAgIGNvbnRleHQgYmVjYXVzZSB0aGUgc3BlY2lhbCBjYXNlcyBvZiB0aGUgcGFzdCBjYW4gbm93IG5vIGxvbmdlciBvY2N1cgogICAgIGJlY2F1c2Ugb2YgdGhlIHJlY2VudCBtYWdpYyBmb3IgdGhlIC0td2l0aC1sYXlvdXQgZGVmYXVsdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzU5MAogCiAgKikgTWFrZSB0b3AtbGV2ZWwgTWFrZWZpbGUgYXdhcmUgb2YgYSBwYXJhbGxlbCBidWlsZCBwcm9jZWR1cmVzIChtYWtlIC1qKSBieQogICAgIG1ha2luZyBzdXJlIHRoZSBzcmMvc3VwcG9ydC8gdG9vbHMgYXJlIF9mb3JjZWRfIHRvIGJlIGJ1aWxkIGxhc3QgKHRoZXkKICAgICBkZXBlbmQgb24gb3RoZXIgbGlicmFyaWVzKS4KICAgICBbTWFya3VzIFRoZWlzc2luZ2VyIDxtYXJrdXMudGhlaXNzaW5nZXIgZ214LmRlPl0KCiAgKikgRml4IGluc3RhbGxhdGlvbiBwcm9jZWR1cmU6IE5vdyB0aGF0IG9zLWlubGluZS5jIGlzIGFjdHVhbGx5IHVzZWQgKGEKICAgICByZWNlbnRseSBmaXhlZCBidWcgcHJldmVudGVkIHRoaXMpIHdlIG5lZWQgdG8gYWxzbyBpbnN0YWxsIG9zLWluY2x1ZGUuYwogICAgIGluIGFkZGl0aW9uIHRvIG9zLmggaW50byB0aGUgUFJFRklYL2luY2x1ZGUvIGxvY2F0aW9uIG9yIGJ1aWxkaW5nIG9mCiAgICAgbW9kdWxlIERTT3Mgd2l0aCBBUFhTIGZhaWxzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzUyNwoKICAqKSBBZGRlZCBNT0RVTEVfTUFHSUNfQ09PS0lFIGFzIHRoZSBmaXJzdCBmaWVsZCBpbiBhIG1vZHVsZSBzdHJ1Y3R1cmUgdG8KICAgICBhbGxvdyB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2FyYmxlZCBEU08gKG9yIGV2ZW4gYSBmaWxlIHdoaWNoIGlzbid0CiAgICAgYW4gQXBhY2hlIG1vZHVsZSBEU08gYXQgYWxsKSBhbmQgYSBEU08gd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudAogICAgIEFwYWNoZSBBUEkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMTUyCiAKICAqKSBUd28gbWlub3IgZW5oYW5jZW1lbnRzIHRvIG1vZF9yZXdyaXRlOiBGaXJzdCBSZXdyaXRlUnVsZSBub3cgYWxzbwogICAgIHN1cHBvcnRzIHRoZSBgYG5vY2FzZXxOQycnIGZsYWcgKGFzIFJld3JpdGVDb25kIGFscmVhZHkgZG9lcyBmb3IgYWdlcykgdG8KICAgICBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlICh0aGlzIGVzcGVjaWFsbHkgYXZvaWRzIG5hc3R5IHBhdHRlcm5zIGxpa2UKICAgICBgW3RUXVtlRV1bc1NdW3RUXScpLiBTZWNvbmQgdHdvIGFkZGl0aW9uYWwgaW50ZXJuYWwgbWFwIGZ1bmN0aW9ucwogICAgIGBlc2NhcGUnIGFuZCBgdW5lc2NhcGUnIHdlcmUgYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXNjYXBlL3VuZXNjYXBlCiAgICAgdG8vZnJvbSBoZXgtZW5jb2RpbmdzIGluIFVSTHMgcGFydHMgKHRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4KICAgICBjb21iaW5hdGlvbiB3aXRoIG1hcCBsb29rdXBzKS4gCiAgICAgW01hZ251cyBCb2RpbiwgSWFuIEthbGxlbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCB0aGUgbWFjcm8gZXNjYXBlX3VyaSgpIHRvIGFwX2VzY2FwZV91cmkoKSB3aGljaCB3YXMKICAgICBmb3Jnb3R0ZW4gKGJlY2F1c2UgaXQgd2FzIGEgbWFjcm8pIGluIHRoZSBzeW1ib2wgcmVuYW1pbmcgcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHNvbWUgaW5jb25zaXN0ZW5jaWVzIHJlbGF0ZWQgdG8gdGhlIHNjb3BlcyBvZiBkaXJlY3RpdmVzLiBUaGUgb25seQogICAgIHVzZXIgdmlzaWJsZSBjaGFuZ2UgaXMgdGhhdCB0aGUgZGlyZWN0aXZlcyBgVXNlQ2Fub25pY2FsTmFtZScgYW5kCiAgICAgYENvbnRlbnREaWdlc3QnIG5vdyB1c2UgdGhlIChtb3JlIGNvcnJlY3QpIGBPcHRpb25zJyBzY29wZSBpbnN0ZWFkIG9mCiAgICAgKGxlc3MgY29ycmVjdCkgYEF1dGhDb25maWcnIHNjb3BlLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzaW5nIERTTywgdGhlIFNlcnZlciB0b2tlbiB3YXMgYmVpbmcgbWFuZ2xlZC4gU3BlY2lmaWNhbGx5LCB0aGUKICAgICBtb2R1bGUncyB0b2tlbiB3YXMgYmVpbmcgYWRkZWQgZmlyc3QgYmVmb3JlIHRoZSBBcGFjaGUgdG9rZW4uIFRoaXMKICAgICBoYXMgYmVlbiBmaXhlZC4gW0ppbSBKYWdpZWxza2ldCgogICopIE1ham9yIG92ZXJoYXVsIG9mIG1vZF9uZWdvdGlhdGlvbi5jLCBwYXJ0IDIuCiAgICAgLSBwcm9wZXJseSBoYW5kbGUgImlkZW50aXR5IiB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWxsb3cgZW5jb2RlZCB2YXJpYW50cyBpbiBSVlNBIG5lZ290aWF0aW9uIGFuZCBsZXQgdGhlbSBhcHBlYXIgaW4KICAgICAgIHRoZSBBbHRlcm5hdGVzIGZpZWxkIHVzaW5nIHRoZSBub24tc3RhbmRhcmQgImVuY29kaW5nIiB0YWctbGlzdC4KICAgICAtIGZpeGVkIGJvdGggbmVnb3RpYXRpb24gYWxnb3JpdGhtcyBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgYWNjZXB0ZWQKICAgICAgIGVuY29kaW5nIGlzIHByZWZlcnJlZCBvdmVyIG5vIGVuY29kaW5nIGlmICJpZGVudGl0eSIgaXMgbm90CiAgICAgICBpbmNsdWRlZCB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWRkZWQgYXBfYXJyYXlfcHN0cmNhdCgpIHRvIGFsbG9jLmMgZm9yIGVmZmljaWVudCBjb25jYXRlbmF0aW9uCiAgICAgICBvZiBsYXJnZSBzdWJzdHJpbmcgc2VxdWVuY2VzLgogICAgIC0gcmVwbGFjZWQgTyhuXjIpIG1lbW9yeSBob2dzIGluIG1vZF9uZWdvdGlhdGlvbiB3aXRoIGFwX2FycmF5X3BzdHJjYXQuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgTWFqb3Igb3ZlcmhhdWwgb2YgbW9kX25lZ290aWF0aW9uLmMsIHBhcnQgMS4KICAgICAtIGNsZWFudXBzIHRvIG1vZF9uZWdvdGlhdGlvbiBjb21tZW50cyBhbmQgY29kZSBzdHJ1Y3R1cmUKICAgICAtIG1hZGUgY29tcGxpYW50IHdpdGggSFRUUC8xLjEgcHJvcG9zZWQgc3RhbmRhcmQgKHJmYzIwNjgpIGFuZCBhZGRlZAogICAgICAgc3VwcG9ydCBmb3IgZXZlcnl0aGluZyBpbiB0aGUgdXBjb21pbmcgSFRUUC8xLjEKICAgICAgIHJldmlzaW9uIChkcmFmdC1pZXRmLWh0dHAtdjExLXNwZWMtcmV2LTA2LnR4dCkuCiAgICAgICAgIC0gbGFuZ3VhZ2UgdGFnIG1hdGNoaW5nIGFsc28gaGFuZGxlcyB0YWdzIHdpdGggbW9yZSB0aGFuIDIKICAgICAgICAgICBsZXZlbHMgbGlrZSB4LXktegogICAgICAgICAtIGVtcHR5IEFjY2VwdCwgQWNjZXB0LUxhbmd1YWdlLCBBY2NlcHQtQ2hhcnNldCBoZWFkZXJzIGFyZQogICAgICAgICAgIHByb2Nlc3NlZCBjb3JyZWN0bHk7IHByZXZpb3VzbHkgYW4gZW1wdHkgaGVhZGVyIHdvdWxkIG1ha2UgYWxsCiAgICAgICAgICAgdmFsdWVzIGFjY2VwdGFibGUgaW5zdGVhZCBvZiB1bmFjY2VwdGFibGUuCiAgICAgICAgIC0gYWxsb3dlZCBmb3IgcSB2YWx1ZXMgaW4gQWNjZXB0LUVuY29kaW5nCiAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChyZmMyMjk1IGFuZAogICAgICAgcmZjMjI5NikgKHRob3VnaCB3ZSBkbyBub3QgaW1wbGVtZW50IGFsbCBmZWF0dXJlcyBpbiB0aGVzZSBkcmFmdHMsCiAgICAgICBlLmcuIG5vIGZlYXR1cmUgbmVnb3RpYXRpb24pLiAgUmVtb3ZlZCBvbGQgZXhwZXJpbWVudGFsIHZlcnNpb24uCiAgICAgLSBpbXBsZW1lbnRlZCAnc3RydWN0dXJlZCBlbnRpdHkgdGFncycgZm9yIGJldHRlciBjYWNoZSBjb3JyZWN0bmVzcwogICAgICAgKHN0cnVjdHVyZWQgZW50aXR5IHRhZ3MgZW5zdXJlIHRoYXQgY2FjaGVzIHdoaWNoIGNhbiBkZWFsIHdpdGggVmFyeQogICAgICAgd2lsbCAoZXZlbnR1YWxseSkgYmUgdXBkYXRlZCBpZiB0aGUgc2V0IG9mIHZhcmlhbnRzIG9uIHRoZSBzZXJ2ZXIKICAgICAgIGlzIGNoYW5nZWQpCiAgICAgICAgIC0gdGhpcyBpbnZvbHZlZCBhZGRpbmcgYSB2bGlzdF92YWxpZGF0b3IgZWxlbWVudCB0byByZXF1ZXN0X3JlYwogICAgICAgICAtIHRoaXMgaW52b2x2ZWQgYWRkaW5nIHRoZSBhcF9tYWtlX2V0YWcoKSBmdW5jdGlvbiB0byB0aGUgZ2xvYmFsIEFQSQogICAgIC0gbW9kaWZpZWQgZ3Vlc3Npbmcgb2YgY2hhcnNldHMgdXNlZCBieSBBcGFjaGUgbmVnb3RpYXRpb24gYWxnb3JpdGhtIAogICAgICAgdG8gZ3Vlc3MgJ25vIGNoYXJzZXQnIGlmIHRoZSB2YXJpYW50IGlzIG5vdCBhIHRleHQvKiB0eXBlCiAgICAgLSBhZGRlZCBjb2RlIHRvIHNvcnQgbXVsdGl2aWV3cyB2YXJpYW50cyBpbnRvIGEgY2Fub25pY2FsIG9yZGVyIHNvIHRoYXQKICAgICAgIG5lZ290aWF0aW9uIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2t1cC9yZXN0b3JlcyBhbmQgbWlycm9ycwogICAgIC0gcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIHR5cGUgbWFwIGZpbGUgcmVzb2x2aW5nIHRvIGFub3RoZXIgdHlwZSBtYXAKICAgICAgIGZpbGUgYXMgaXRzIGJlc3QgdmFyaWFudAogICAgIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZywgTGFycyBFaWxlYnJlY2h0XSBQUiMzNDUxLCAzMjk5LCAxOTg3CgogICopIFJGQzIzOTYgYWxsb3dzIHRoZSBzeW50YXggaHR0cDovL2hvc3Q6L3BhdGggKHdpdGggbm8gcG9ydCBudW1iZXIpCiAgICAgYnV0IHRoZSBwcm94eSBkaXNhbGxvd2VkIGl0IChhcF9wcm94eV9jYW5vbl9uZXRsb2MoKSkuCiAgICAgW0RhdmlkIEtyaXN0b2wgPGRtayBiZWxsLWxhYnMuY29tPl0gUFIjMzUzMAoKICAqKSBXaGVuIG1vZHVsZXMgdXBkYXRlL21vZGlmeSB0aGUgZmlsZSBuYW1lIGluIHRoZSBjb25maWdmaWxlX3Qgc3RydWN0dXJlLAogICAgIHN5bnRheCBlcnJvcnMgd2lsbCByZXBvcnQgdGhlIHVwZGF0ZWQgbmFtZSwgbm90IHRoZSBvcmlnaW5hbCBvbmUuCiAgICAgW0ZhYmllbiBDb2VsaG8gPGNvZWxobyBjcmkuZW5zbXAuZnI+XSBQUiMzNTczCgogICopIENvcnJlY3Qgc29tZSBmaWxlbmFtZSBjYXNlIGFzc3VtcHRpb25zIGZyb20gV0lOMzIgdG8KICAgICBDQVNFX0JMSU5EX0ZJTEVTWVNURU0uICBbQnJpYW4gSGF2YXJkIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBGb3IgJXYgbG9nIFNlcnZlck5hbWUgcmVnYXJkbGVzcyBvZiB0aGUgVXNlQ2Fub25pY2FsTmFtZQogICAgIHNldHRpbmcgKHNpbWlsYXJseSBmb3IgJXApLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDb25maWd1cmUgd2FzIGluaXRpYWxpemluZyB0aGUgdmFyaWFibGVzICRPU0RJUiwgJElOQ0RJUiBhbmQgJFNIRUxMCiAgICAgcmF0aGVyIGxhdGUgKHRvbyBsYXRlIGZvciBzb21lIGludm9jYXRpb25zIG9mIFRlc3RDb21waWxlKS4KICAgICBUaGlzIGltcHJvdmVzIHRoZSBtYWtlIGVudmlyb25tZW50IGF2YWlsYWJsZSB0byBUZXN0Q29tcGlsZSBhbmQKICAgICB0aGUgKi5tb2R1bGUgc2NyaXB0cy4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBUaGUgaGFzaGJhbmcgZW11bGF0aW9uIGNvZGUgaW4gYXBfZXhlY3ZlLmMgd291bGQgaW50ZXJwcmV0CiAgICAgIyEvaGFzaGJhbmcvc2NyaXB0cyBjb3JyZWN0bHksIGJ1dCBmYWlsZWQgdG8gZmFsbCBiYWNrIHRvIGEKICAgICBzdGFuZGFyZCBzaGVsbCBmb3Igc2NyaXB0cyB3aGljaCBkaWQgTk9UIHN0YXJ0IHdpdGggIyEKICAgICBOb3cgU0hFTExfUEFUSCBpcyBzdGFydGVkIGluIHRoZXNlIGNhc2VzLiBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEFkZGVkIHRoZSBDeWJlcmd1YXJkIFYyIHBvcnQgW1JpY2hhcmQgU3RhZ2cgPHN0YWdnIGxlbnRpbC5vcmc+XQogICAgIFBSIzMzMzYKCiAgKikgVXBkYXRlIEFQWFMgbWFudWFsIHBhZ2U6IHNvbWUgLXEgb3B0aW9uIGFyZ3VtZW50cyB3ZXJlIG1pc3NpbmcKICAgICBhbmQgYW5vdGhlciB3YXMgaW5jb3JyZWN0LiBbTWFyayBBbmRlcnNvbiA8bWRhIGRpc2Nlcm5pbmcuY29tPl0gUFIjMzU1MwoKICAqKSBDbGVhbnVwIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uczogYC0/JyB3YXMgZG9jdW1lbnRlZCB0byBzaG93CiAgICAgdGhlIHVzYWdlIGxpc3QgYnV0IGRvZXMgaXQgd2l0aCBhbiBlcnJvciBiZWNhdXNlIGA/JyBpcyBub3QgYSB2YWxpZAogICAgIGNvbW1hbmQuIE9UT0ggYSBsb3Qgb2YgdXNlcnMgZXhwZWN0IGAtaCcgdG8gcHJpbnQgc3VjaCBhIHVzYWdlIGxpc3QgYW5kCiAgICAgaW5zdGVhZCBhcmUgYW5ub3llZCBmb3IgYWdlcyBieSBvdXIgaHVnZSB1bnJlYWRhYmxlIGxpc3Qgb2YgZGlyZWN0aXZlcy4KICAgICBTbyB3ZSBub3cgY2hhbmdlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhpcyB3YXk6CiAgICAgMS4gYC1MJyA9PiBgLVInIAogICAgICAgIEludGVudDogd2UgbmVlZCBgLUwnIHRvIGJlIGZyZWUsIGFuZCBgLVInIGZvciB0aGUgRFNPIHJ1bi10aW1lIHBhdGggaXMKICAgICAgICB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHBvcHVsYXIgbGlua2VyIG9wdGlvbi4KICAgICAyLiBgLWgnID0+IGAtTCcKICAgICAgICBJbnRlbnQ6IHdoaWxlIC1sIGdpdmVzIHRoZSBzbWFsbCBsaXN0IG9mIG1vZHVsZXMsIC1MIG5vdyBnaXZlcyB0aGUKICAgICAgICBsYXJnZSBsaXN0IG9mIGRpcmVjdGl2ZXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbW9kdWxlcy4gIFRoaXMgaXMgYWxzbwogICAgICAgIGNvbnNpc3RlbnQgd2l0aCAtdiAoc2hvcnQgdmVyc2lvbiBpbmZvKSBhbmQgLVYgKGxhcmdlIHZlcnNpb24gaW5mbykuCiAgICAgMy4gYC0/JyA9PiBgLWgnIAogICAgICAgIEludGVudDogaXQncyBub3cgdGhlIGV4cGVjdGVkIG9wdGlvbiA7LSkKICAgICBUaGUgbWFudWFsIHBhZ2Ugd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxNAoKICAqKSBGaXhlZCBwcm9ibGVtIG9mIGZjbG9zZSgpIG9uIGFuIHVub3BlbmVkIGZpbGUgaW4gc3VleGVjIGlmIExPR19FWEVDCiAgICAgd2Fzbid0IGRlZmluZWQuICBbUmljayBGcmFuY2h1ayA8cmlja2YgdHJhbnNwZWN0Lm5ldD5dCgogICopIFJlbW92ZWQgcmVjZW50bHkgaW50cm9kdWNlZCBidWdzIGFuZCBkaXNmaWd1cmVtZW50cyBpbiBBUEFDSToKICAgICBvIGZpeGVkIGFyZ3VtZW50IGxpbmUgcHJvY2Vzc2luZzogdXNpbmcgJGFyZ3Mgd2FzIGJyb2tlbjogSXQgd2FzIG5vdAogICAgICAgaW5pdGlhbGl6ZWQgYW5kIHVzaW5nIGFyZ3M9IiRhcmdzICRhcGNfb3B0aW9uIiBhbmQgZXZlbiBhcmdzPSIkYXJncwogICAgICAgXCIkYXBjX29wdGlvblwiIiBmYWlscyBpbiB0aGUgc2Vjb25kIHByb2Nlc3Npbmcgcm91bmQgZm9yIGFueSBhcmd1bWVudHMKICAgICAgIGNvbnRhaW5pbmcgd2hpdGVzcGFjZXMuIFRoZSBvbmx5IGNvcnJlY3Qgd2F5IGlzIHRvIHVzZSB0aGUgY29uc3RydWN0CiAgICAgICAiJEAiIChidXQgbm90IHBvc3NpYmxlIGhlcmUpIG9yIGl0ZXJhdGUgX2JvdGhfIHRpbWVzIG92ZXIgdGhlIGltcGxpY2l0CiAgICAgICBhcmd1bWVudCBsaW5lIChubyBhcmd1bWVudCB0byBmb3ItbG9vcCkgd2hpY2ggaXMgd2hhdCB3ZSBub3cgdXNlLgogICAgIG8gbWFrZSAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0aGUgZGVmYXVsdCB3aXRob3V0IGNyZWF0aW5nCiAgICAgICByZWR1bmRhbmN5IChjb3B5aW5nIHRoZSAtLXdpdGgtbGF5b3V0IGJsb2NrIGluIHRoZSBhcmd1bWVudCBwYXJzaW5nCiAgICAgICBsb29wKS4gIFdlIGFjaGlldmUgdGhpcyBieSB1c2luZyB0aGUgIiRAIiBjb25zdHJ1Y3QgdG9nZXRoZXIgd2l0aCB0aGUKICAgICAgIGBzZXQnIGNvbW1hbmQgdG8gcHJlcGVuZCAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0byB0aGUgY29tbWFuZCBsaW5lIGluCiAgICAgICBjYXNlIC0td2l0aC1sYXlvdXQgaXMgbm90IHVzZWQuCiAgICAgbyBmaXhlZCBhdXRvLXN1ZmZpeCBoYW5kbGluZyBub3cgdGhhdCBjb25maWcubGF5b3V0IGV4aXN0cy4KICAgICAgIFBhdGhzIHdoaWNoIGFyZSBhdXRvLXN1ZmZpeGVkIGFyZSBtYXJrZWQgd2l0aCBhIHRyYWlsaW5nIHBsdXMgc2lnbiBpbgogICAgICAgY29uZmlnLmxheW91dCBhbmQgZXZlcnkgcGF0aCBub3cgY2FuIGJlIG1hcmtlZCB0aGlzIHdheSAobm90IG9ubHkgdGhlCiAgICAgICBmb3VyIHBhdGhzIGZvciB3aGljaCB3ZSBkbyBpdCBjdXJyZW50bHkpLiAgQWRkaXRpb25hbGx5IHRoZSBzdWZmaXggaXMKICAgICAgIG5vIGxvbmdlciBhIHN0YXRpYyBvbmUuIEluc3RlYWQgaXQncyBub3cgYC88dGFyZ2V0Picgd2hlcmUgPHRhcmdldD4gaXMKICAgICAgIHRoZSBhcmd1bWVudCBvZiB0aGUgLS10YXJnZXQgb3B0aW9uIG9yIHBlciBkZWZhdWx0IGBodHRwZCcuCiAgICAgbyBhbGxvdyBhbHNvIHRhYnMgKGFuZCBvbmx5IHNwYWNlcykgd2hlcmUgd2UgbWF0Y2ggd2hpdGVzcGFjZXMKICAgICBvIHZhcmlvdXMgZml4ZXMgYW5kIGNsZWFudXBzIHJlbGF0ZWQgdG8gdXNlZCBzaGVsbCBjb2Rpbmcgc3R5bGUKICAgICBvIG1hZGUgSmltIGhhcHB5IGJ5IHJlcGxhY2luZyBgV3JpdHRlbiBieScgd2l0aCBgSW5pdGlhbGx5IHdyaXR0ZW4gYnknIDstKQogICAgIG8gdHJpbW1lZCBvdXRwdXQgb2YgLS1oZWxwIHRvIGZpdCBpbnRvIDgwIGNvbHVtbnMKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdHdvIG5ldyBjb3JlIEFQSSBmdW5jdGlvbnMsIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKCkgYW5kCiAgICAgYXBfc2luZ2xlX21vZHVsZV9pbml0KCksIHdoaWNoIGFyZSBub3cgdXNlZCBieSBtb2Rfc28gdG8gY29uZmlndXJlIGEgbW9kdWxlCiAgICAgYWZ0ZXIgbG9hZGluZy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCBkZWZpbmVzIGZvciBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgYW5kCiAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHRvIE5ldEJTRC9PcGVuQlNEIHNlY3Rpb24KICAgICBvZiBhcF9jb25maWcuaCB0byBhbGxvdyBzZXJpYWxpemVkIGFjY2VwdCBmb3IgbXVsdGlwb3J0IGxpc3RlbnMuCiAgICAgW1JveSBGaWVsZGluZywgQ3VydCBTYW1wc29uXSBQUiMzMTIwCgogICopIFBPUlQ6IEZpeGVkIGEgbWlzcGxhY2VkICNlbmRpZiBmb3IgTmV0QlNEL09wZW5CU0Qgc2VjdGlvbgogICAgIG9mIGFwX2NvbmZpZy5oIHRoYXQgd291bGQgc2tpcCBzZXZlcmFsIGRlZmluZXMgaWYgREVGQVVMVF9HUk9VUAogICAgIHdhcyBvdmVycmlkZGVuLiBbUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBUaGUgSTg2IHZlcnNpb24gb2YgREdVWCBoYXMgc3VwcG9ydCBmb3Igc3RybmNhc2VjbXAgYW5kIAogICAgIHN0cmNhc2VjbXAsIHNvIGFsbG93IGl0IGluIGFwX2NvbmZpZy5oLiBbQW1pZWwgTGVlIFllZV0gUFIjMzI0NwoKICAqKSBGaXggb3JkZXJpbmcgb2YgZGVmaW5pdGlvbnMgaW4gYXBfY29uZmlnLmggc28gdGhhdCBhcF9pbmxpbmUgaXMKICAgICBkZWZpbmVkIGJlZm9yZSBpdCBtaWdodCBiZSB1c2VkLiBbVmljdG9yIEtoaW1lbmtvXQoKICAqKSBQT1JUOiBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIEJTREkgKHY0LjApLgogICAgIFtUb20gU2Vya293c2tpIDx0a3MgYnNkaS5jb20+XSBQUiMzNDUzCgogICopIE1ha2UgZ2VuZXJhdGlvbiBvZiBzcmMvQ29uZmlndXJhdGlvbi5hcGFjaSBtb3JlIHJvYnVzdDogSXQgZmFpbGVkIHRvCiAgICAgZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIG1vZHVsZXMgd2hlbiBvbmUgbW9kdWxlIG5hbWUgd2FzIGEgcG9zdGZpeCBvZgogICAgIGFub3RoZXIgKGUuZy4gY2dpIHZzLiBmYXN0Y2dpKS4gV2Ugbm93IGNoZWNrIGZvciBtb2RfWFhYLCBsaWJYWFggYW5kIGV2ZW4KICAgICBqdXN0IFhYWCAodGhpbmsgYWJvdXQgdG90YWxseSBub24tc3RhbmRhcmQgbmFtZXMgbGlrZSAiYXBhY2hlX3NzbCIsIHRvbykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMzODAKCiAgKikgSW4gc3JjL0NvbmZpZ3VyZSByZW1vdmUgdGhlIFNFUlZFUl9TVUJWRVJTSU9OIHN1cHBvcnQgKGFscmVhZHkgZGVwcmVjYXRlZAogICAgIHNpbmNlIDEuM2I3KSBhbmQgbWFrZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIG1vcmUgcm9idXN0IChpdCBmYWlsZWQgaG9ycmlibGUKICAgICB3aGVuIHdoaXRlc3BhY2VzIHdlcmUgcHJlc2VudCBpbiB0aGUgYXJndW1lbnRzIG9mIC1EIG9wdGlvbnMpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMjQwCgogICopIEFkZCBBUEFDSSAtLXNoYWRvdz1ESVIgdmFyaWFudCAoaW4gYWRkaXRpb24gdG8gLS1zaGFkb3cpLiBUaGlzIG5vdyBmaXJzdAogICAgIGNyZWF0ZXMgYW4gZXh0ZXJuYWwgcGFja2FnZSBzaGFkb3cgdHJlZSBpbiBESVIgYmVmb3JlIHRoZSBsb2NhbCBidWlsZAogICAgIHNoYWRvdyB0cmVlIGlzIGdlbmVyYXRlZCB1bmRlciBESVIuIFRoaXMgd2F5IG9uZSBjYW4gaGF2ZSB0aGUgZXh0cmFjdGVkCiAgICAgQXBhY2hlIGRpc3RyaWJ1dGlvbiB0cmVlIHJlYWQtb25seSBvbiBORlMgb3IgQ0RST00gYW5kIHN0aWxsIGJ1aWxkIEFwYWNoZQogICAgIGZyb20gdGhlc2Ugc291cmNlcy4gQW4gYXV0b21hdGljYWxseSB0cmlnZ2VyZWQgVlBBVEgtbGlrZSBtZWNoYW5pc20gaXMKICAgICBwcm92aWRlZCB0aHJvdWdoIHRoZSBUT1AgdmFyaWFibGUsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IG5lZ290aWF0aW9uIHNvIHRoYXQgYSBWYXJ5IHJlc3BvbnNlIGhlYWRlciBpcyBjb3JyZWN0bHkgCiAgICAgZ2VuZXJhdGVkIHdoZW4sIGZvciBhIHBhcnRpY3VsYXIgZGltZW5zaW9uLCB2YXJpYW50cyBvbmx5IHZhcnkKICAgICBpbiBoYXZpbmcgb3Igbm90IGhhdmluZyBhIHZhbHVlIGZvciB0aGF0IGRpbWVuc2lvbi4gW1BhdWwgU3V0dG9uXQoKICAqKSBGaXggbmVnb3RpYXRpb24gc28gdGhhdCB3ZSBwcmVmZXIgYW4gZW5jb2RlZCB2YXJpYW50IG92ZXIgYW4KICAgICB1bmVuY29kZWQgdmFyaWFudCBpZiB0aGUgdXNlci1hZ2VudCBleHBsaWNpdGx5IHNheXMgaXQgY2FuCiAgICAgYWNjZXB0IHRoYXQgZW5jb2RpbmcuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHByZWZlcnJlZCB0aGUgdW5lbmNvZGVkCiAgICAgdmFyaWFudC4KICAgICBbUGF1bCBBdXNiZWNrIDxwYXVsYSBhbHVtbmkuY3NlLnVjc2MuZWR1PiwgUGF1bCBTdXR0b25dIFBSIzM0NDcKIAogICopIEZpeCBBUFhTIHRvb2w6IHF1ZXJ5IHZhcmlhYmxlcyBMSUJTX1NITElCIGFuZCBUQVJHRVQgd2VyZSBub3QgcmVjb2duaXplZAogICAgIGFuZCB0aGUgdXNhZ2UgcGFnZSB3YXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgYW5kIG1hbnBhZ2UuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IHNwZWNpYWwgb3B0aW9ucyAtV2MseHh4IGFuZCAtV2wseHh4IG9uIEFQWFMgY29tcGlsZS9saW5rIGNvbW1hbmQuCiAgICAgVGhleSBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgYW5kIHRoZWlyIGFyZ3VtZW50cyAoYHh4eCcpIGFyZSBwYXNzZWQgQVMKICAgICBJUyB0byB0aGUgY29tcGlsZXIvbGlua2VyIGNvbW1hbmQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgcG9zc2libGUgKGJ1dCBoYXJtbGVzcyBpbiBwcmFjdGljZSkgYnVnIGluIHRoZSBEQk0gbG9va3VwCiAgICAgcHJvY2VkdXJlIG9mIG1vZF9yZXdyaXRlOiB2ZXJ5IGxvbmcga2V5cyB3ZXJlIHRydW5jYXRlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgYSBnZW5lcmljIC0td2l0aC1sYXlvdXQ9W0ZJTEU6XUlEIG9wdGlvbi4gSUQgaGVyZSBpcyBhIGxheW91dAogICAgIGlkZW50aWZpZXIsIGN1cnJlbnRseSAiQXBhY2hlIiBhbmQgIkdOVSIgYXJlIHByZS1kZWZpbmVkIGluIHRoZSBmaWxlCiAgICAgY29uZmlnLmxheW91dC4gIEN1c3RvbSBsYXlvdXRzIGFyZSBwb3NzaWJsZSBieSB1c2luZyBGSUxFOklEIGFzIHRoZQogICAgIGFyZ3VtZW50IHdoZXJlIHRoZSBsYXlvdXQgSUQgaXMgdGFrZW4gZnJvbSBGSUxFLgoKICAgICBUaGUgY29uZmlnLmxheW91dCBmaWxlIGNvbnNpc3RzIG9mIDxMYXlvdXQgSUQ+Li48L0xheW91dD4gc2VjdGlvbnMKICAgICB3aGVyZSBpbnNpZGUgdGhvc2Ugc2VjdGlvbnMgInBhdGhfdmFyaWFibGU6IHBhdGhfdmFsdWUiIHBhaXJzIGNhbiBiZQogICAgIHNwZWNpZmllZC4gVGhlc2UgbGluZXMgYXJlIGNvbnZlcnRlZCB0byBwYXRoX3ZhcmlhYmxlPSdwYXRoX3ZhbHVlJy4KCiAgKikgQWRkIGEgRGVmYXVsdExhbmd1YWdlIGRpcmVjdGl2ZSBzbyB0aGF0IGZpbGVzIG1pc3NpbmcgYSBsYW5ndWFnZQogICAgIGV4dGVuc2lvbiAoZS5nLiwgLmZyLCAuZGUpIGNhbiBiZSBsYWJlbGxlZCBhcyBiZWluZyBzb21lIG90aGVyCiAgICAgZGVmYXVsdCBsYW5ndWFnZS4gRGVmYXVsdExhbmd1YWdlIGNhbiBhcHBlYXIgaW4gPERpcmVjdG9yeT4gYW5kIAogICAgIDxGaWxlcz4gY29udGFpbmVycyBhcyB3ZWxsIGFzIC5odGFjY2VzcyBmaWxlcy4gIFtQYXVsIFN1dHRvbl0KICAgICBQUiMxMTgwCgogICopIEZpeCBUQVJHRVQgY29uZmlndXJhdGlvbiB3aGVuIGNvbmZpZ3VyaW5nIGFuZCBpbnN0YWxsaW5nIHVzaW5nCiAgICAgQVBBQ0kgY29uZmlndXJlLiBUQVJHRVQgbm93IGRlZmluZXMgdGhlIGJhc2VuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uCiAgICAgZmlsZSwgc3RhcnR1cCBzY3JpcHQsIG1hbnVhbCBwYWdlLCBldGMuIGxvZ19lcnJvcl9jb3JlKCkgbm93IHJlcG9ydHMKICAgICB0aGUgc2VydmVyIGJpbmFyeSBuYW1lIGdpdmVuIGJ5IGFyZ3ZbMF0uIFRBUkdFVCBjYW4gbm93IGFsc28gYmUgZGVmaW5lZAogICAgIHdpdGggLS10YXJnZXQ9VEFSR0VUIHBhcmFtZXRlciBwYXNzZWQgdG8gQVBBQ0kgY29uZmlndXJlLgogICAgIFtSYWxmIEVuZ2Vsc2NoYWxsLCBSYW5keSBUZXJidXNoXQoKICAqKSBtb2RfaW5jbHVkZS5jOmhhbmRsZV9wZXJsKCkgbm93IHByb3Blcmx5IHRlc3RzIGZvciBPUFRfSU5DTk9FWEVDCiAgICAgcmF0aGVyIHRoYW4gT1BUX0lOQ0xVREVTIFtSYWluZXIgU2Nob2VwZiA8c2Nob2VwZiB1bmktbWFpbnouZGU+XQoKICAqKSBhcF9tZDVfYmluYXJ5KCkgd2FzIHVzaW5nIHNwcmludGYoKSByYXRoZXIgdGhhbiBhIHRhYmxlIGxvb2t1cAogICAgIHRvIGNvbnZlcnQgYmluYXJ5IGJ5dGVzIHRvIGhleCBkaWdpdHMuCiAgICAgW1JvbmFsZCBUc2NoYWzkciA8cm9uYWxkIGlubm92YXRpb24uY2g+XSBQUiMzNDA5CgogICopIEZpeCBTRUdWIGluIFRDTiBuZWdvdGlhdGlvbiBpZiBubyB2YXJpYW50cyBhcmUgYWNjZXB0YWJsZS4KICAgICBbTWFydGluIFBsZWNoc21pZCA8cGxlY2hzbWkga2FybGluLm1mZi5jdW5pLmN6Pl0gUFIjMTk4NwoKICAqKSBBUEk6IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCkgZnVuY3Rpb24gaXMgbm93ICJwdWJsaWMiIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEZpeCBkb2N1bWVudGF0aW9uIG9mIGBBY3Rpb24nIGRpcmVjdGl2ZTogSXQgY2FuIGFjdGl2YXRlIGEgQ0dJIHNjcmlwdAogICAgIHdoZW4gZWl0aGVyIGEgaGFuZGxlciBvciBhIE1JTUUgY29udGVudCB0eXBlIGlzIHRyaWdnZXJlZCBieSB0aGUgcmVxdWVzdC4KICAgICBbQW5kcmV3IFBpbWxvdHQgPHBpbWxvdHQgbWF0aC5oYXJ2YXJkLmVkdT5dIFBSIzMzNDAKCiAgKikgRG9jdW1lbnQgdGhlIGBhZGQnIGNvbW1hbmQgb2YgYGRibW1hbmFnZScgaW4gYGRibW1hbmFnZS4xJyBtYW5wYWdlLgogICAgIFtEYXZpZCBNYWNLZW56aWUgPGRqbSB1dS5uZXQ+XSBQUiMzMzk0CgogICopIElnbm9yZSBhICJFcnJvckRvY3VtZW50IDQwMSIgZGlyZWN0aXZlIHdpdGggYSBmdWxsIFVSTCBhbmQgd3JpdGUgYQogICAgIG5vdGljZSB0byB0aGUgZXJyb3IgbG9nLiBJdCBpcyBub3QgcG9zc2libGUgdG8gc2VuZCBhIDQwMSByZXNwb25zZQogICAgIGFuZCBhIHJlZGlyZWN0IGF0IHRoZSBzYW1lIHRpbWUuICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBGYWxsYmFjayB0byBuYXRpdmUgY29tcGlsZXJzIGZvciBJUklYLTMyIHBsYXRmb3JtLiBJdCBzZWVtcyB0aGF0CiAgICAgYSBnY2MgMi44LjEgY29tcGlsZWQgYXBhY2hlIGlzIGxvZ2dpbmcgY2xpZW50IGFkZHJlc3NlcyB3aXRoIGFsbAogICAgIGJpdHMgc2V0ICgyNTUuMjU1LjI1NS4yNTUpLiBUaGlzIGlzIHRoZSBzZWNvbmQgc3VjaCBwcm9ibGVtIGNhdXNlZAogICAgIGJ5IGdjYyAyLjguMSBjb21waWxlci4gVGhlIGZpcnN0IGJlaW5nIGJyb2tlbiBzZW1hcGhvcmUgbG9ja2luZy4KICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgVXBkYXRlZCBtaW1lLnR5cGVzIHRvIHJlZmxlY3QgY3VycmVudCBJbnRlcm5ldCBtZWRpYSB0eXBlcwogICAgIGFuZCBpbmNsdWRlIGEgVVJMIHRvIHRoZSByZWdpc3RyeS4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBSb3kgRmllbGRpbmddIFBSIzIzODAsIDIyODYsIDIyNDYKCiAgKikgU0VDVVJJVFk6IERvIGEgbW9yZSBjb21wbGV0ZSBjaGVjayBpbiBtb2RfaW5jbHVkZSB0byBhdm9pZCAKICAgICBhbiBpbmZpbml0ZSBsb29wIG9mIHJlY3Vyc2l2ZSBTU0kgaW5jbHVkZXMuICBbTWFyYyBTbGVta29dIFBSIzMzMjMKCiAgKikgQWRkIEFQQUNJIC0tc3VleGVjLWRvY3Jvb3QgYW5kIC0tc3VleGVjLWxvZ2ZpbGUgb3B0aW9ucyB3aGljaCBjYW4gYmUKICAgICB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgKERPQ19ST09UKSBhbmQgdGhlIHN1ZXhlYwogICAgIGxvZ2ZpbGUgKExPR19FWEVDKSwgcmVzcGVjdGl2ZWx5LiBBZGRpdGlvbmFsbHkgdGhlIC0tbGF5b3V0IG9wdGlvbgogICAgIHdhcyBjaGFuZ2VkIHRvIHNob3cgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VFWEVDIHNldHVwLgogICAgIFtMYXJzIEVpbGVicmVjaHRdIFBSIzMzMTYsIDMzNTcsIDMzNjEKCiAgKikgQWRkZWQgdGhlIGxhc3QgdHdvIFdlYkRBViBzdGF0dXMgY29kZXMgb2YgNDI0IChGYWlsZWQgRGVwZW5kZW5jeSkKICAgICBhbmQgNTA3IChJbnN1ZmZpY2llbnQgU3RvcmFnZSkgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEVuYWJsZWQgYWxsIG9mIHRoZSBXZWJEQVYgbWV0aG9kIG5hbWVzIGZvciB1c2UgYnkgdGhpcmQtcGFydHkKICAgICBtb2R1bGVzLCBMaW1pdCwgYW5kIFNjcmlwdCBkaXJlY3RpdmVzLiAgVGhhdCBpbmNsdWRlcyBQQVRDSCwKICAgICBQUk9QRklORCwgUFJPUFBBVENILCBNS0NPTCwgQ09QWSwgTU9WRSwgTE9DSywgYW5kIFVOTE9DSy4KICAgICBJbXByb3ZlZCBtb2RfYWN0aW9ucy5jIHNvIHRoYXQgaXQgY2FuIHVzZSBhbnkgb2YgdGhlIG1ldGhvZHMKICAgICBkZWZpbmVkIGluIGh0dHBkLmguICBBZGRlZCBhcF9tZXRob2RfbnVtYmVyX29mKG1ldGhvZCkgZm9yCiAgICAgZ2V0dGluZyB0aGUgaW50ZXJuYWwgbWV0aG9kIG51bWJlci4gIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIFRQRiBPUy4gW0pvZSBNb2VuaWNoIDxtb2VuaWNoIHVzLmlibS5jb20+IGFuZAogICAgIG90aGVycyBhdCBJQk1dCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIGhhbmRsaW5nIG9mIFVOQyBuYW1lcyAoZS5nLiwgXFxob3N0XHBhdGgpCiAgICAgb24gV2luMzIuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnogdXMuaWJtLmNvbT5dCgogICopIFJld29yayBvc19jYW5vbmljYWxfKigpIG9uIFdpbjMyIHNvIGl0J3Mgc2ltcGxlciwgbW9yZQogICAgIHJvYnVzdCwgYW5kIHdvcmtzLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6IHVzLmlibS5jb20+XQogICAgIFBSIzI1NTUsIDI5MTUsIDMwNjQsIDMyMzIKCiAgKikgV29yayBhcm91bmQgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJmdGltZSBvbiBXaW4zMi4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBLZW4gUGFyenlnbmF0IDxrcGFyeiB1cy5pYm0uY29tPl0KCiAgKikgTW92ZSBhIHR5cGVkZWYgdG8gZml4IGNvbXBpbGUgcHJvYmxlbXMgb24gTGludXggd2l0aCAxLngga2VybmVscy4KICAgICBbTWFub2ogS2FzaWNoYWludWxhXSBQUiMzMTc3CgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIENvbmN1cnJlbnQgUG93ZXJNQVggT1MuIFtUb20gSG9yc2xleQogICAgIDxUb20uSG9yc2xleSBtYWlsLmNjdXIuY29tPl0KCiAgKikgV0lOMzI6IExvZyBtb3JlIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2VzIGlmIHNwYXduaW5nIGFuIGludGVycHJldGVkIAogICAgIHNjcmlwdCBmYWlsZWQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gYXR0ZW1wdCB0byBleGVjdXRlIAogICAgIHRoZSBpbnRlcnByZXRlciBhbmQgdGhlIFdpbjMyIGVycm9yIGNvZGUgcmV0dXJuZWQuICBbTWFyYyBTbGVta29dCgogICopIERpc2FibGUgc2VuZGluZyBvZiBlcnJvci1ub3RlcyBvbiBhIDUwMCAoSW50ZXJuYWwgU2VydmVyIEVycm9yKSByZXNwb25zZQogICAgIHNpbmNlIGl0IG9mdGVuIGluY2x1ZGVzIGZpbGUgcGF0aCBpbmZvLiAgRW5hYmxlIHNlbmRpbmcgb2YgZXJyb3Itbm90ZXMKICAgICBvbiBhIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkuICBbUm95IEZpZWxkaW5nXSBQUiMzMTczCgogICopIGh0dHBfY29uZmlnLmMgd291bGQgcmVzcG9uZCB3aXRoIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkgaWYgYQogICAgIGNvbnRlbnQgdHlwZSBoYW5kbGVyIHdhcyBzcGVjaWZpZWQgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCwgd2hpY2gKICAgICBzaG91bGQgaGF2ZSBiZWVuIGEgNTAwIHJlc3BvbnNlLiAgTGlrZXdpc2UsIG1vZF9wcm94eS5jIHdvdWxkIHJlc3BvbnNkCiAgICAgd2l0aCBhIDUwMSBpZiB0aGUgVVJJIHNjaGVtZSBpcyB1bnJlY29nbml6ZWQgaW5zdGVhZCBvZiB0aGUgY29ycmVjdAogICAgIHJlc3BvbnNlIG9mIDQwMyAoRm9yYmlkZGVuKS4gIFtSb3kgRmllbGRpbmddCgogICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgRG9TIGF0dGFjayB3aGVuIGEgYmFkIFVSSSBwYXRoIGNvbnRhaW5zIHdoYXQKICAgICBsb29rcyBsaWtlIGEgcHJpbnRmIGZvcm1hdCBlc2NhcGUuICBbTWFyYyBTbGVta28sIFN0dWRlbnRlbiBOZXQgVHdlbnRlXQoKICAqKSBGaXggaW4gbW9kX2F1dG9pbmRleDogZm9yIGZpbGVzIHdoZXJlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgc3RhbXAgd2FzCiAgICAgdW5hdmFpbGFibGUsIGFuIGVtcHR5IHN0cmluZyB3YXMgcHJpbnRlZCB3aGljaCB3YXMgMiBieXRlcyBzaG9ydC4KICAgICBUaGUgc2l6ZSBhbmQgZGVzY3JpcHRpb24gY29sdW1ucyB3ZXJlIHRoZXJlZm9yZSBub3QgYWxpZ25lZCBjb3JyZWN0bHkuCiAgICAgW01hcnRpbiBLcmFlbWVyXSAobm8gUFIjKQoKICAqKSBVcGRhdGUgQlMyMDAwIE9TIGNvZGUgdG8gd29yayB3aXRoIHJlY2VudCB2ZXJzaW9ucy4gU3RhcnRpbmcgd2l0aAogICAgIHJlbGVhc2UgQTE3LCB0aGUgY2hpbGQgZm9yaygpIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBfcmZvcmsoKS4KICAgICAoQlMyMDAwIG9ubHkpIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQWRkIHRoZSBhY3R1YWwgc2VydmVyX3JlYyBzdHJ1Y3R1cmUgb2YgdGhlIHNwZWNpZmljIFZob3N0IHRvIHRoZQogICAgIHNjb3JlYm9hcmQgZmlsZSBhbmQgYXZvaWQgYSBzdHJpbmcgY29weSAoYXMgd2VsbCBhcyBhbGxvdyBzb21lCiAgICAgZnVydGhlciBmdXR1cmUgZW5oYW5jZW1lbnRzKS4gW0hhcnJpZSBIYXpld2lua2VsCiAgICAgPGhhcnJpZS5oYXpld2lua2VsIGpyYy5pdD5dCgogICopIEFkZCBBUEFDSSAtLXBlcm11dGUtbW9kdWxlPWZvbzpiYXIgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvCiAgICAgb24tdGhlLWZseS9iYXRjaCBwZXJtdXRlIHRoZSBvcmRlciBvZiB0d28gbW9kdWxlcyAobW9kX2ZvbyBhbmQgbW9kX2JhcikKICAgICBpbiB0aGUgQ29uZmlndXJhdGlvblsuYXBhY2ldIGZpbGUuIFR3byBzcGVjaWFsIGFuZCBpbXBvcnRhbnQgdmFyaWFudHMgYXJlCiAgICAgc3VwcG9ydGVkIGZvciB0aGUgb3B0aW9uIGFyZ3VtZW50OiBmaXJzdCBCRUdJTjpmb28gd2hpY2ggcGVybXV0ZXMgbW9kdWxlCiAgICAgbW9kX2ZvbyB3aXRoIHRoZSBiZWdpbiBvZiB0aGUgbW9kdWxlIGxpc3QsIGkuZS4gaXQgYG1vdmVzJyB0aGUgbW9kdWxlIHRvCiAgICAgdGhlIGJlZ2luIG9mIHRoZSBsaXN0IChnaXZlcyBpdCBsb3dlc3QgcHJpb3JpdHkpLiAgQW5kIHNlY29uZCBmb286RU5ECiAgICAgd2hpY2ggcGVybXV0ZXMgbW9kX2ZvbyB3aXRoIHRoZSBlbmQgb2YgdGhlIG1vZHVsZSBsaXN0LCBpLmUuIGl0IGBtb3ZlcycKICAgICB0aGUgbW9kdWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGdpdmVzIGl0IGhpZ2hlc3QgcHJpb3JpdHkpLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHByb2JsZW0gd2l0aCAnYXBhY2hlIC1rIHNodXRkb3duJyBhbmQgc3RhcnR1cCBldmVudAogICAgIHN5bmNocm9uaXNhdGlvbiAoV2luMzIpLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6IHJhbGVpZ2guaWJtLmNvbT5dCiAgICAgUFIjMzI1NQoKICAqKSBUaGUgY29uZmlnIHBhcnNlciB3YXNuJ3QgY29ycmVjdGx5IG5vdGljaW5nIGEgbWlzc2luZyAnPicKICAgICBvbiBjb250YWluZXIgc3RhcnQgbGluZXMgKGUuZy4sIGl0IHdvdWxkbid0IHNwb3QKICAgICAiPERpcmVjdG9yeSAvIiBhcyBhIHN5bnRheCBlcnJvcikuICBbUnlhbiBCbG9vbSA8cmJibG9vbSB1cy5pYm0uY29tPl0KICAgICBQUiMzMjc5CgogICopIEFkZCBhICdSZW1vdmVIYW5kbGVyJyBkaXJlY3RpdmUgd2hpY2ggd2lsbCBzZWxlY3RpdmVseSByZW1vdmUKICAgICBhbGwgaGFuZGxlciBhc3NvY2lhdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBleHRlbnNpb25zLgogICAgIFtSeWFuIEJsb29tIDxyYmJsb29tIHVzLmlibS5jb20+XSBQUiMxNzk5LgoKICAqKSBQcm9wZXJseSBoYW5kbGUgJiBhbGxvdyAibnVsIiBhbmQgIi4qL251bGwiIGluIEFjY2Vzc0NvbmZpZyBhbmQKICAgICBSZXNvdXJjZUNvbmZpZyBkaXJlY3RpdmVzIG9uIFdpbjMyLiAgQWxzbyBhZGQgYSBub3RlIHRvIHRoZSBlZmZlY3QKICAgICBvZiAndXNlbGVzcyBVc2VyIGRpcmVjdGl2ZSBpZ25vcmVkIG9uIFdpbjMyJyB0byB0aGUgZXJyb3Jsb2cgaWYKICAgICBhIFVzZXIgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMyMDc4LCAyMzAzLgoKICAqKSBGaXggbXVsdGlwbGUgd2hpdGVzcGFjZSBoYW5kbGluZyBpbiBpbWFnZW1hcHMgZm9yIG1vZF9pbWFwIHdoaWNoIHdhcwogICAgIGJyb2tlbiBzaW5jZSBBcGFjaGUgMS4zLjEgd2hlcmUgd2UgdG9vayBvdXQgY29tcHJlc3Npbmcgb2YgbXVsdGlwbGUKICAgICBzcGFjZXMgaW4gYXBfY2ZnX2dldGxpbmUoKS4KICAgICBbSXZhbiBSaWNod2Fsc2tpIDxpdmFuIHNlcHB1a3UubmV0Pl0gUFIjMzI0OQoKICAqKSBGaXggQmVya2VsZXktREIvMi54IHN1cHBvcnQgaW4gbW9kX2F1dGhfZGI6IFRoZSBkYXRhIHN0cnVjdHVyZXMgd2VyZSBub3QKICAgICBpbml0aWFsaXplZCBjb3JyZWN0bHkgYW5kIHRoZSBkYl9vcGVuKCkgY2FsbCB1c2VkIGFuIGludmFsaWQgbW9kZQogICAgIHBhcmFtZXRlci4gW1JvbiBLbGF0Y2hrbyA8cm9uIGNrbS51Y3NmLmVkdT5dIFBSIzMxNzEKCiAgKikgUE9SVDogRFNPIHN1cHBvcnQgZm9yIFVuaXhXYXJlIDcKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUm9uIFJlY29yZCA8cnIgc2NvLmNvbT5dCgogICopIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0aGUge3NybSxhY2Nlc3N9LmNvbmYtZGlzdCogZmlsZXMgaW50byB0aGUKICAgICBodHRwZC5jb25mLWRpc3QqIGZpbGVzLiAgVGhlIHNybSBhbmQgYWNjZXNzIGZpbGVzIG5vdyBjb250YWluCiAgICAgb25seSBjb21tZW50cywgYW5kIGh0dHBkLmNvbmYgaGFzIGFsbCB0aGUgY29tYmluZWQgY29udGVudHMgaW4KICAgICBhIHJhdGlvbmFsIG9yZGVyLiAgW0tlbiBDb2FyXQoKICAqKSBQT1JUOiBEU08vRUxGIHN1cHBvcnQgZm9yIEZyZWVCU0QgMy4wLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBEaXJrIEZyb2VtYmVyZyA8aWJleCBwaHlzaWsuVFUtQmVybGluLkRFPl0KICAKICAqKSBBZGQgYSAiZGVmYXVsdC1oYW5kbGVyIiBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIGRlZmF1bHRfaGFuZGVyKCkKICAgICBmdW5jdGlvbiB3aGljaCBpcyBub3JtYWxseSBjYWxsZWQgZm9yIHN0YXRpYyBjb250ZW50LiAgVGhpcyBhbGxvd3MKICAgICB5b3UgdG8gb3ZlcnJpZGUgYSBzcGVjaWZpYyBoYW5kbGVyLiAgW01hcmMgU2xlbWtvXQoKICAqKSBGdXJ0aGVyIHNpbXBsaWZ5IGNoZWNraW5nIGZvciBhYnNvbHV0ZSBwYXRocyBieSByZXBsYWNpbmcgYW4KICAgICBoYXJkLWNvZGVkIHN5bnRheCBjaGVjayB3aXRoIGEgY2FsbCB0byBhIHJvdXRpbmUgd2UgYWxyZWFkeSBjcmVhdGVkIHRvCiAgICAgZG8gdGhpcy4gIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMyOTc2LCAzMDc0CgogICopIExvZyBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYSBtYWxmb3JtZWQgInJlcXVpcmUiIGRpcmVjdGl2ZSAKICAgICBpbiBtb2RfYXV0aCBpZiB3ZSBrbm93IHRoYXQgd2Uga25vdyB0aGF0IG5vIG90aGVyIG1vZHVsZSBjYW4KICAgICBkZWFsIHdpdGggaXQuICBbTWFyYyBTbGVta29dCgogICopIFJlbW92ZSBhcF9wcml2YXRlX2V4dGVybiBtZXRob2Qgb2YgaGlkaW5nIGNvbmZsaWN0aW5nIHN5bWJvbHMKICAgICBvbiB0aGUgTkVYVCBwbGF0Zm9ybSBiZWNhdXNlIGl0IGlzIG5vdCBjb3JyZWN0IGZvciBhbGwgdmVyc2lvbnMsCiAgICAgYW5kIHRoZSB2ZXJzaW9ucyBmb3Igd2hpY2ggaXQgaXMgY29ycmVjdCBhcmUgdW5rbm93bi4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IGluaGVyaXRhbmNlIG9mIEluZGV4T3B0aW9ucyBOYW1lV2lkdGggYW5kIHJlbW92ZSB1bmludGVuZGVkCiAgICAgcmVzdHJpY3Rpb24gb24gK05hbWVXaWR0aCwgK0ljb25IZWlnaHQsIGFuZCArSWNvbldpZHRoLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2luZyBmb3IgY2FzZXMgaW4gd2hpY2ggYSA1MDAgZXJyb3IKICAgICBpcyBlbmNvdW50ZXJlZCBpbiBhbiAuaHRhY2Nlc3MgZmlsZSBzb21ld2hlcmUgZG93biB0aGUgdHJlZS4KICAgICBbS2VuIENvYXJdICBQUiMyNDA5CgogICopIE1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHRvIGFwX2VzY2FwZV9odG1sKCkuIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBpbiBtb2RfcHJveHkgd2hlbiBhIHJlc3BvbnNlIGlzCiAgICAgbm9uLWNhY2hhYmxlLiAgW1JveSBGaWVsZGluZywgdHJhY2VkIGJ5IERvdWcgQmxvZWJhdW1dLiBQUiMyOTUwLCAzMDU2CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4zCgogICopIEFkZGVkIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEV4cGVjdCBoZWFkZXIgZmllbGQgYXMKICAgICBzcGVjaWZpZWQgaW4gcmV2LTA1IG9mIEhUVFAvMS4xLiAgRGlzYWJsZWQgdGhlIDEwMCBDb250aW51ZQogICAgIHJlc3BvbnNlIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoZSBmaW5hbCBzdGF0dXMsIHdoaWNoIGlzIG1pZ2h0eQogICAgIHVzZWZ1bCBmb3IgUFVUIHJlc3BvbnNlcyB0aGF0IHJlc3VsdCBpbiAzMDIgb3IgNDAxLiBbUm95IEZpZWxkaW5nXQoKICAqKSBSZW1vdmUgZXh0cmEgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBnZXRsaW5lIHJlc3VsdHMgYXMgcGFydAogICAgIG9mIHRoZSBwcm90b2NvbCBwcm9jZXNzaW5nLCB3aGljaCBpcyBleHRyYSBuaWNlIGJlY2F1c2UgaXQgd29ya3MKICAgICBiZXR3ZWVuIGNvbnRpbnVhdGlvbiBsaW5lcywgaXMgYWxtb3N0IG5vIGNvc3QgaW4gdGhlIG5vcm1hbCBjYXNlCiAgICAgb2Ygbm8gZXh0cmEgd2hpdGVzcGFjZSwgYW5kIHNhdmVzIG1lbW9yeS4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgbmV3IEhUVFAgc3RhdHVzIGNvZGVzIGFuZCBkZWZhdWx0IHJlc3BvbnNlIGJvZGllcyBmcm9tIHRoZQogICAgIHJldmlzZWQgSFRUUC8xLjEgKDMwNywgNDE2LCA0MTcpLCBXZWJEQVYgKDEwMiwgMjA3LCA0MjIsIDQyMyksIGFuZCAKICAgICBIVFRQIEV4dGVuc2lvbiBGcmFtZXdvcmsgKDUxMCkgc3BlY2lmaWNhdGlvbnMuICBEaWQgbm90IGFkZCB0aGUKICAgICBXZWJEQVYgNDI0IGFuZCA0MjUgY29kZXMgYmVjYXVzZSB0aGV5IGFyZSBib2d1cy4gIFdlIGRvbid0IHVzZSBhbnkKICAgICBvZiB0aGVzZSBjb2RlcyB5ZXQsIGJ1dCB0aGV5IGFyZSBub3cgYXZhaWxhYmxlIHRvIDNyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gdGltZWQtb3V0IHJlcXVlc3RzIGFuZCB0aGUKICAgICBhcF9iaGFsZmR1cGxleCBzZWxlY3QgdGhhdCBtaWdodCByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcCBvbgogICAgIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCB2YWxpZGF0ZSB0aGUgZGVzY3JpcHRvci4gW1JveSBGaWVsZGluZ10KCiAgKikgV0lOMzI6IEFkZCAiLWsgc2h1dGRvd24iIGFuZCAiLWsgcmVzdGFydCIgb3B0aW9ucyB0byBzaWduYWwgYQogICAgIHJ1bm5pbmcgQXBhY2hlIHNlcnZlciBbUGF1bCBTdXR0b25dCgogICopIEZpeCBtb2RfYXV0b2luZGV4IGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBnb3QgYSBzaXplIG9mICIwayIgaW5zdGVhZAogICAgIG9mICItIi4gIFtNYXJ0aW4gUGxlY2hzbWlkIDxwbGVjaHNtaSBrYXJsaW4ubWZmLmN1bmkuY3o+LCBNYXJjIFNsZW1rb10KICAgICBQUiMzMTMwCgogICopIFBPUlQ6IERSUyA2MDAwIG1hY2hpbmUuIFtQYXVsIERlYmxlZWNrZXIgPHBkZWJsZWVja2VyIGpldGFpci5iZT5dCgogICopIEFkZCB0aGUgc2VydmVyIHNpZ25hdHVyZSB0ZXh0IChmcm9tIHRoZSBjb3JlIFNlcnZlclNpZ25hdHVyZSBkaXJlY3RpdmUpCiAgICAgdG8gdGhlIGxpc3Qgb2YgZW52YXJpYWJsZXMgYXZhaWxhYmxlIHRvIHNjcmlwdHMsIFNTSSwgYW5kIHRoZSBsaWtlLgogICAgIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogRml4IHN5cy9yZXNvdXJjZS5oIGhhbmRsaW5nIGZvciBTQ08gMy54IHBsYXRmb3JtLgogICAgIFtNLiBMYWFrIDxtYWVydCBwcm9pbnYuZWU+XSBQUiMzMTA4CiAKICAqKSBGYWxsYmFjayBmcm9tIHN5c2NvbmYtYmFzZWQgdG8gcGxhaW4gSFotYmFzZWQgYHRpY2tzIHBlciBzZWNvbmQnCiAgICAgY2FsY3VsYXRpb24gaW4gbW9kX3N0YXR1cyBmb3IgYWxsIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBQT1NJWAogICAgIHN5c2NvbmYoKSAobGlrZSBVVFMgMi4xKSBhbmQgbm90IG9ubHkgZm9yIHRoZSBORVhUIHBsYXRmb3JtLgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjMzA1NQoKICAqKSBGaXggYHJlcXVpcmUgLi4uJyBkaXJlY3RpdmUgcGFyc2luZyBpbiBtb2RfYXV0aCwgbW9kX2F1dGhfZGJtIGFuZAogICAgIG1vZF9hdXRoX2RiIGJ5IHVzaW5nIGFwX2dldHdvcmRfd2hpdGUoKSAod2hpY2ggdXNlcyBhcF9pc3NwYWNlKCkpIAogICAgIGluc3RlYWQgb2YgYXBfZ2V0d29yZCguLi4sICcgJykgKHdoaWNoIHBhcnNlcyBvbmx5IGFjY29yZGluZyB0byBzcGFjZXMgCiAgICAgYnV0IG5vdCB0YWJzKS4gIFtKYW1lcyBNb3JyaXMgPGptb3JyaXMgaW50ZXJjb2RlLmNvbS5hdT4sIAogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMxMDUKCiAgKikgRml4IHRoZSBTRVJWRVJfTkFNRSB2YXJpYWJsZSB1bmRlciBzdWItcmVxdWVzdCBzaXR1YXRpb25zICh3aGVyZQogICAgIGBVc2VDYW5vbmljYWxOYW1lIG9mZicgaXMgdXNlZCkgbGlrZSBDR0kncyBjYWxsZWQgZnJvbSBTU0kgcGFnZXMgb3IKICAgICBSZXdyaXRlQ29uZCB2YXJpYWJsZXMgYnkgYWRvcHRpbmcgci0+aG9zdG5hbWUgdG8gc3ViLXJlcXVlc3RzLgogICAgIFtKYW1lcyBHcmludGVyIDxqcmcgYmxvZHdlbi5kZW1vbi5jby51az5dIFBSIzMxMTEKCiAgKikgRml4IHN0ZGVyciByZWRpcmVjdGlvbiB1bmRlciBzeXNsb2ctYmFzZWQgZXJyb3IgbG9nZ2luZyBzaXR1YXRpb24uCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NQoKICAqKSBEb2N1bWVudCBgRXJyb3JMb2cgc3lzbG9nOmZhY2lsaXR5JyB2YXJpYW50IG9mIGVycm9yIGxvZ2dpbmcuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NgoKICAqKSBGaXggaHR0cDovL2xvY2FsaG9zdC8gaGludHMgaW4gdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnQuCiAgICAgW1JvYiBKZW5zb24gPHJvYmplbiBzcG90Y2guY29tPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzA4OAoKICAqKSBRdW90ZSBwYXRocyBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgUE9SVDogUmVtb3ZlIGV4dHJhIEhBVkVfU1lTX1JFU09VUkNFX0ggZGVmaW5lIGZvciBSSEFQU09EWSBzaW5jZQogICAgIGl0IGlzIG5vdyB0YWtlbiBjYXJlIG9mIHByb3Blcmx5IGJ5IHRoZSBoZWFkZXIgZmlsZSB0ZXN0cy4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IHByb2JsZW0gd2l0aCBzY3JpcHRzIGFuZCBmaWxlaGFuZGxlIGluaGVyaXRhbmNlIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSAgUFIjMjg4NCwgMjkxMAoKICAqKSBXaW4zMiBuYW1lIGNhbm9uaWNhbGlzYXRpb24gY291bGQgZW5kIHVwIHVzaW5nIHRoZSBzZXJ2ZXIncwogICAgIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGZpbGwgaW4gc29tZSBibGFua3MuICBbS2VuIFBhcnp5Z25hdAogICAgIDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMzMDAxCgogICopIENvcnJlY3QgaW52YWxpZCBhc3N1bXB0aW9uIGJ5IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoKSB0aGF0IGFsbAogICAgIGFic29sdXRlIHBhdGhzIGJlZ2luIHdpdGggIi8iIC0tIGJlY2F1c2UgdGhleSBkb24ndCBvbiBXaW4zMi4KICAgICBbS2VuIFBhcnp5Z25hdCA8a3BhcnogcmFsZWlnaC5pYm0uY29tPl0gUFIjMjk3NiwgMzA3NAoKICAqKSBBZGQgW1JFRElSRUNUX11WQVJJQU5UUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtb2Rfc3BlbGluZwogICAgIHNvIHRoYXQgRXJyb3JEb2N1bWVudCAzMDAgcHJvY2Vzc29ycyBjYW4gcmVmb3JtYXQgdGhlIGxpc3QKICAgICBpZiBkZXNpcmVkLiAgW0tlbiBDb2FyXSBQUiMyODU5CgogICopIEFkZCArLy0gaW5jcmVtZW50YWwgcHJlZml4ZXMgdG8gSW5kZXhPcHRpb25zIGtleXdvcmRzLCBhbmQKICAgICBlbmFibGUgbWVyZ2luZyBvZiBtdWx0aXBsZSBJbmRleE9wdGlvbnMgZGlyZWN0aXZlcy4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogQWxsb3cgR3Vlc3NPUyB0byByZWNvZ25pemUgVW5peHdhcmUgNy4wLjEgW1N0ZXZlIENhbWVyb24KICAgICA8c3RldmUuY2FtZXJvbiBjb21wYXEuY29tPl0KCiAgKikgUmVjb25zdHJ1Y3RlZCB0aGUgbG9vcCB0aHJvdWdoIG11bHRpcGxlIGh0YWNjZXNzIGZpbGUgbmFtZXMgc28KICAgICB0aGF0IG1pc3NpbmcgZmlsZXMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHVucmVhZGFibGUgZmlsZXMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIGFwX3Bmb3BlbiBhbmQgYXBfcGZkb3BlbiByb3V0aW5lcyB3ZXJlIGZhaWxpbmcgdG8gcHJvdGVjdCB0aGUKICAgICBlcnJubyBvbiBhbiBlcnJvciwgd2hpY2ggbGVhZHMgdG8gb25lIGVycm9yIGJlaW5nIG1pc3Rha2VuIGZvcgogICAgIGFub3RoZXIgd2hlbiByZWFkaW5nIG5vbi1leGlzdGVudCAuaHRhY2Nlc3MgZmlsZXMuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIE9TLzI6IFRoZSBuZXcgaGVhZGVyIHRlc3RzIGdldCB0aGluZ3MgcmlnaHQsIG5lZWQgdG8gdXBkYXRlCiAgICAgYXBfY29uZmlnLmguICBbQnJpYW4gSGF2YXJkXQoKICAqKSBUaGUgUGVybCAlRU5WIGhhc2ggd2lsbCBub3cgYmUgc2V0dXAgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZQogICAgIG1vZF9pbmNsdWRlIGBwZXJsJyBjb21tYW5kIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIFBPUlQ6IEFkZCBQeXJhbWlkIERDL09TeCBzdXBwb3J0IHRvIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtLgogICAgIFtFYXJsZSBBa2UgPGFrZWUgd3BkaXNzMS53cGFmYi5hZi5taWw+XQoKICAqKSBQT1JUOiBGaXggc3lzL3Jlc291cmNlLmggaGFuZGxpbmcgZm9yIEFtZGFobCdzIFVUUyAyLjEKICAgICBbRGF2ZSBEeWtzdHJhIDxkd2QgYmVsbC1sYWJzLmNvbT5dIFBSIzMwNTQKCiAgKikgQ29ycmVjdCBjb21tZW50IGluIG1vZF9sb2dfY29uZmlnLmMgYWJvdXQgaXRzIGludGVybmFscy4KICAgICBbRWxmIFN0ZXJuYmVyZyA8ZWxmIGhhbGN5b24uY29tPl0KCiAgKikgQXZvaWQgcG9zc2libGUgbGluZSBvdmVyZmxvdyBpbiBDb25maWd1cmU6IFVzZSBhbiBhd2tmaWxlIHRvCiAgICAgaGFuZGxlIHRoZSBjcmVhdGlvbiBvZiBtb2R1bGVzLmMgW0ppbSBKYWdpZWxza2ldCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4yCgogICopIEZpeCBidWcgaW4gYXBfcmVtb3ZlX21vZHVsZSgpLCB3aGljaCBjYXVzZWQgcHJvYmxlbXMgZm9yIGRzbydzIAogICAgIHdobyB3ZXJlIHRoZSB0b3BfbW9kdWxlLiAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEJlcmtlbGV5LURCLzIueCAoaW4gYWRkaXRpb24gdG8gQmVya2VsZXktREIvMS54KSB0bwogICAgIG1vZF9hdXRoX2RiIHRvIGJvdGggYmUgZnJpZW5kbHkgdG8gdXNlcnMgd2hvIHdhbnRzIHRvIHVzZSB0aGlzIHZlcnNpb24KICAgICBhbmQgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIgcGxhdGZvcm1zIHdoZXJlIG9ubHkgdmVyc2lvbiAyLnggaXMgcHJlc2VudC4KICAgICBbRGFuIEphY29ib3dpdHogPGRyb3cgZmFsc2Uub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgV2hlbiB1c2luZyBhcF9sb2dfcmVycm9yKCksIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHRoZQogICAgICpFUlJPUl9OT1RFUyBlbnZhcmlhYmxlcyBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQoKICAqKSBCUzIwMDAgcGxhdGZvcm0gb25seTogZ2V0IHJpZCBvZiB0aGUgbmFzdHkgQlMyMDAwQXV0aEZpbGUuCiAgICAgWW91IG5vdyBtdXN0IGRlZmluZSBhIEJTMjAwMEFjY291bnQgbmFtZSBmb3IgdGhlIHNlcnZlciBVc2VyLgogICAgIFRoaXMgaGFzIGZld2VyIHNlY3VyaXR5IGltcGxpY2F0aW9ucyB0aGFuIHRoZSBvbGQgYXBwcm9hY2guCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggU0hBUkVEX0NPUkUgZmVhdHVyZSBmb3IgSFBVWCBwbGF0Zm9ybTogV2Ugbm93IHVzZSBleHRlbnNpb24gYC5zbCcKICAgICBpbnN0ZWFkIG9mIGAuc28nIGFuZCBgU0hMSUJfUEFUSCcgaW5zdGVhZCBvZiBgTERfTElCUkFSWV9QQVRIJyBvbiB0aGlzCiAgICAgcGxhdGZvcm0gdG8gbWFrZSB0aGUgYnJhaW5kZWFkIEhQVVggbGlua2VyIGhhcHB5LiBOb3RpY2UsIGZvciB0aGUgbW9kdWxlCiAgICAgRFNPcyB3ZSBkb24ndCBoYXZlIHRvIHVzZSB0aGlzLCBiZWNhdXNlIHRoZXNlIGFyZSBsb2FkZWQgbWFudWFsbHkgKGFuZAogICAgIG5vdCB2aWEgSFBVWCcgZGxkKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI5MDUsIFBSIzI5NjgKCiAgKikgUmVtb3ZlIDY0IHRocmVhZCBsaW1pdCBvbiBXaW4zMi4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmQgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBzdWJzdGl0dXRpb25zIGluIHRvcC1sZXZlbCBNYWtlZmlsZS50bXBsLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggQVBBQ0kncyBgR3JvdXAnIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudCAtIGVzcGVjaWFsbHkgZm9yIExpbnV4CiAgICAgcGxhdGZvcm1zIHdoZXJlIGBub2dyb3VwJyBleGlzdHMgaW4gL2V0Yy9ncm91cC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAKICAqKSBNYWtlIFByaW50UGF0aCB3b3JrIGdlbmVyaWNhbGx5IGluc3RlYWQgb2YgaGF2aW5nIG9uZSB2ZXJzaW9uCiAgICAgc3RyaWN0bHkgZm9yIE9TLzIuIFtKaW0gSmFnaWVsc2tpLCBCcmlhbiBIYXZhcmRdCgogICopIEZpeCB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBDIGhlYWRlciBmaWxlIGNoZWNraW5nOiBXZSBub3cgdXNlIHRoZSBDCiAgICAgcHJlLXByb2Nlc3NvciBwYXNzIG9ubHkgKGFuZCBubyBsb25nZXIgdGhlIGNvbXBsZXRlIGNvbXBpbGVyIHBhc3MpIHRvCiAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgYSBDIGhlYWRlciBmaWxlIGV4aXN0cyBvciBub3QuIEJlY2F1c2Ugb25seSB0aGlzIHdheQogICAgIHdlJ3JlIHNhZmUgYWdhaW5zdCBpbnRlci1oZWFkZXIgZGVwZW5kZW5jaWVzICh3aGljaCBjYXVzZWQgaG9ycmlibGUKICAgICBwb3J0YWJpbGl0eSBwcm9ibGVtcykuIFRoZSBvbmx5IGRyYXdiYWNrIGlzIHRoYXQgd2Ugbm93IGhhdmUgYSBDUFAKICAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHdoaWNoIGhhcyB0byBiZSBkZXRlcm1pbmVkIGZpcnN0ICh3ZSBkbyBhIHNpbWlsYXIKICAgICBhcHByb2FjaCBhcyBHTlUgQXV0b2NvbmYgZG9lcyBoZXJlKS4gV2hlbiBhbGwgZmFpbHMgdGhlIHVzZXIgc3RpbGwgaGFzCiAgICAgdGhlIHBvc3NpYmlsaXR5IHRvIG92ZXJyaWRlIGl0IG1hbnVhbGx5IHZpYSBBUEFDSSBvciBzcmMvQ29uZmlndXJhdGlvbi4KICAgICBBcyBhIGZhbGxiYWNrIGZvciB0aGUgaGVhZGVyIGNoZWNrIGl0c2VsZiB3ZSBjYW4gZGlyZWN0bHkgY2hlY2sgdGhlCiAgICAgZXhpc3RhbmNlIG9mIHRoZSBmaWxlIHVuZGVyIC91c3IvaW5jbHVkZSwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzc3CgogICopIFBPUlQ6IEFkZGVkIFJIQVBTT0RZIChNYWMgT1MgWCBTZXJ2ZXIpIHN1cHBvcnQuIE1BUF9UTVBGSUxFIGRlZmluZWQKICAgICBhcyBhbiBhbHRlcm5hdGUgbWVjaGFuaXNtIGZvciBtbWFwJ2Qgc2hhcmVkIG1lbW9yeSBmb3IgUkhBUFNPRFkuCiAgICAgYXBfcHJpdmF0ZV9leHRlcm4gZGVmaW5lZCB0byBoaWRlIHN5bWJvbHMgdGhhdCBjb25mbGljdCB3aXRoIGxvYWRlZAogICAgIGR5bmFtaWMgbGlicmFyaWVzIG9uIHRoZSBORVhUIGFuZCBSSEFQU09EWSBwbGF0Zm9ybXMuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6IGFwcGxlLmNvbT5dCgogICopIERlbGV0ZSBQSUQgZmlsZSBvbiBjbGVhbiBzaHV0ZG93bnMuCiAgICAgW0NoYXJsZXMgUmFuZGFsbCA8Y3JhbmRhbGwgbWF0Y2hsb2dpYy5jb20+XSBQUiMyOTQ3CgogICopIEZpeCBtb2RfYXV0aF8qLmh0bWwgZG9jdW1lbnRzOiBOU0NBIC0+IE5DU0EKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2EganAuRnJlZUJTRC5vcmc+XSBQUiMyOTkxCgogICopIEZpeCBJTlNUQUxMIGRvY3VtZW50OiB3d3cuZ251LmFpLm1pdC5lZHUgLT4gd3d3LmdudS5vcmcKICAgICBbS2FybCBCZXJyeSA8a2FybCBnbnUub3JnPl0gUFIjMjk5NAoKICAqKSBGaXggZGJtbWFuYWdlLjEgbWFudWFsIHBhZ2UuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMjk5MgogICAgIAogICopIEZpeCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgc2l0dWF0aW9uIGluIHN1ZXhlYy5jLgogICAgIFtKZWZmIFN0ZXdhcnQgPGp3cyBwdXJkdWUuZWR1Pl0gUFIjMjc5MAoKICAqKSBBZGQgc29tZSBtb3JlIExJQlMgZm9yIHRoZSBTQ081IHBsYXRmb3JtIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRoZSBhbHJlYWR5CiAgICAgdXNlZCAtbHByb3QuIEl0J3MgYWN0dWFsbHkgYSBidWcgaW4gU0NPNSwgb2YgY291cnNlLgogICAgIFtSb25hbGQgUmVjb3JkIDxyciBzY28uY29tPl0gUFIjMjUzMwoKICAqKSBGaXggZG9jdW1lbnRhdGlvbiBvZiBQcm94eVBhc3MvUHJveHlQYXNzUmV2ZXJzZSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgdHJhaWxpbmcgc2xhc2ggcHJvYmxlbS4gW0pvbiBEcnVrbWFuIDxqc2QgZ2FtZXNwb3QuY29tPl0gUFIjMjkzMwogIAogICopIFJlbW92ZSBgLW1zeW0nIG9wdGlvbiBmcm9tIExERkxBR1NfU0hMSUIgZm9yIHRoZSBEaWdpdGFsIFVOSVggKE9TRi8xKQogICAgIHBsYXRmb3JtLCBiZWNhdXNlIGl0J3Mgb25seSBzdXBwb3J0ZWQgdW5kZXIgdmVyc2lvbiA0LjAgYW5kIGhpZ2hlci4gQnV0CiAgICAgYmVjYXVzZSBvdXIgR3Vlc3NPUyBpcyBzdGlsbCB1bmF3YXJlIG9mIERpZ2l0YWwgVU5JWCB2ZXJzaW9ucyBhbmQgdGhlCiAgICAgLW1zeW0gaXMganVzdCB0byBvcHRpbWl6ZSB0aGUgRFNPIHN0YXR1cCB0aW1lIGEgbGl0dGxlIGJpdCBpdCdzIHNhZmUgYW5kCiAgICAgYmVzdCB3aGVuIHdlIGxlYXZlIGl0IG91dCBub3cuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjk2OQoKICAqKSBGaXggdGhlIGFwX2xvZ19lcnJvcl9vbGQoKSwgYXBfbG9nX3VuaXhlcnIoKSBhbmQgYXBfbG9nX3ByaW50ZigpCiAgICAgZnVuY3Rpb25zOiBGaXJzdCBhbGwgdGhyZWUgZnVuY3Rpb25zIG5vIGxvbmdlciBmYWlsIG9uIHN0cmluZ3MgY29udGFpbmluZwogICAgICIlIiBjaGFycyBhbmQgc2Vjb25kIGFwX2xvZ19wcmludGYoKSBubyBsb25nZXIgZG9lcyBhIGRvdWJsZS1mb3JtYXR0aW5nCiAgICAgKGluc3RlYWQgaXQgZGlyZWN0bHkgcGFzc2VzIHRocm91Z2ggdGhlIG1lc3NhZ2UgdG8gYmUgZm9ybWF0dGVkIHRvIHRoZQogICAgIHJlYWwgaW50ZXJuYWwgZm9ybWF0dGluZyBmdW5jdGlvbikuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyOTQxCgogICopIEFsbG93ICJJbmNsdWRlIiBkaXJlY3RpdmVzIGFueXdoZXJlIGluIHRoZSBzZXJ2ZXIgY29uZmlnCiAgICAgZmlsZXMgKGJ1dCBub3QgLmh0YWNjZXNzIGZpbGVzKS4gIFtLZW4gQ29hcl0gUFIjMjcyNwoKICAqKSBUaGUgcHJveHkgd2FzIHJlZnVzaW5nIHRvIHNlcnZlIENPTk5FQ1QgcmVxdWVzdHMgZXhjZXB0IHRvCiAgICAgcG9ydCA0NDMgKGh0dHBzOi8vKSBhbmQgNTYzIChzbmV3czovLykuIFRoZSBuZXcgQWxsb3dDT05ORUNUCiAgICAgZGlyZWN0aXZlIGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcG9ydHMgdG8gd2hpY2ggYQogICAgIENPTk5FQ1QgaXMgYWxsb3dlZC4gIFtTYW1lZXIgUGFyZWtoLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgbW9kX2V4cGlyZXMgd2lsbCBub3cgYWN0IG9uIGNvbnRlbnQgdGhhdCBpcyBub3Qgc2VudCBmcm9tIGEgZmlsZQogICAgIG9uIGRpc2suICBQcmV2aW91c2x5IGl0IHdvdWxkIG5ldmVyIGFkZCBhbiBFeHBpcmVzOiBoZWFkZXIgdG8KICAgICBhbnkgcmVzcG9uc2UgdGhhdCBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUgb24gZGlzazsgdGhlIG9ubHkKICAgICBjYXNlIHdoZXJlIGl0IHN0aWxsIGRvZXNuJ3QgKGFuZCBjYW4ndCkgYWRkIG9uZSBmb3IgdGhhdCB0eXBlIG9mIAogICAgIGNvbnRlbnQgaXMgaWYgeW91IGFyZSB1c2luZyBhIG1vZGlmaWNhdGlvbiBkYXRlIGJhc2VkIHNldHRpbmcuICAKICAgICBbTWFyYyBTbGVta28sIFBhdWwgUGhpbGxpcHMgPHBhdWxwIGdvMm5ldC5jb20+XQoKICAqKSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgLmh0YWNjZXNzIHBhcnNpbmcgb3IgQ0dJIGV4ZWN1dGlvbgogICAgIHRoYXQgbGVhZCB0byBhICI1MDAgU2VydmVyIEVycm9yIiBjb25kaXRpb24gbm93IHByb3ZpZGUgZXhwbGFuYXRvcnkKICAgICB0ZXh0IChpbiB0aGUgKkVSUk9SX05PVEVTIGVudmFyaWFibGUpIHRvIEVycm9yRG9jdW1lbnQgNTAwIHNjcmlwdHMuCiAgICAgW0tlbiBDb2FyXSBQUiMxMjkxCgogICopIEFkZCBOYW1lV2lkdGgga2V5d29yZCB0byBJbmRleE9wdGlvbnMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlCiAgICAgd2lkdGggb2YgdGhlIGZpbGVuYW1lIGNvbHVtbiBpcyBjdXN0b21pc2FibGUuICBbS2VuIENvYXIsIERlYW4gR2F1ZGV0XQogICAgIFBSIzE5NDksIDIzMjQuCgogICopIFJlY29nbml6ZSBsb3dlcmNhc2UgX2FuZF8gdXBwZXJjYXNlIGB1bmFtZScgcmVzdWx0cyB1bmRlcgogICAgIFNDTyBPcGVuU2VydmVyLiBbRGF2aWQgQ29lbGhvIDxkcmMgcHB0LmNvbT5dCgogICopIEFzIGR1cGxpY2F0ZSAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcyB3aXRoaW4gdGhlIGhlYWRlciBzZWVtIHRvIGJlCiAgICAgYSBjb21tb24gcHJvYmxlbSBvZiAobWlzLWFkbWluaXN0cmF0ZWQ/KSBJSVMgc2VydmVycywgbWFrZSB0aGUgYXBhY2hlCiAgICAgcHJveHkgaW1tdW5lIHRvIHRoZXNlIGVycm9ycyAoYW5kIGlnbm9yZSB0aGUgZHVwbGljYXRlcywgYnV0IGxvZwogICAgIHRoZSBmYWN0IHRvIGVycm9yX2xvZykuIFtNYXJ0aW4gS3JhZW1lcl0sIGFmdGVyIHRoZSBwcm9wb3NhbCBpbiBQUiMyOTE0IAogICAgIAogICopIFRoZSA8SWZNb2R1bGUgYW5kIDxJZkRlZmluZSBibG9jayBzdGFydGluZyBkaXJlY3RpdmVzIG5vdyBvbmx5CiAgICAgYWxsb3cgZXhhY3RseSBvbmUgYXJndW1lbnQuIFByZXZpb3VzbHksIHRoZSBvcHRpb25hbCBuZWdhdGlvbgogICAgIGNoYXJhY3RlciAnIScgY291bGQgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aG91dCBhIHN5bnRheAogICAgIGVycm9yIGJlaW5nIHJlcG9ydGVkLCBhbGJlaXQgZGVmZWF0aW5nIHRoZSBJZk1vZHVsZSBmdW5jdGlvbmFsaXR5CiAgICAgKGVuY2xvc2VkIGRpcmVjdGl2ZXMgd291bGQgQUxXQVlTIGJlIGV4ZWN1dGVkKS4gQnkgdXNpbmcgdGhlCiAgICAgc3RyaWN0ZXIgc3ludGF4LCB0aGVzZSBoYXJkLXRvLXRyYWNrIGVycm9ycyBjYW4gYmUgYXZvaWRlZC4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIEluZGV4T3B0aW9ucyBpbiBtb2RfYXV0b2luZGV4IC0tIGFuZCBCVFcKICAgICBjYXVzZSB0aGUgc3RhbmRhbG9uZSBGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSB0byBsb2dpY2FsbHkgT1IKICAgICBpbnRvIGFueSBleGlzdGluZyBJbmRleE9wdGlvbnMgc2V0dGluZ3MgcmF0aGVyIHRoYW4gd2lwaW5nCiAgICAgdGhlbSBvdXQuICBbS2VuIENvYXJdCgogICopIENoYW5nZXMgaW4gZnRwIHByb3h5OiBtYWtlIFVSTCBwYXJzaW5nIHNpbXBsZXIgYnkgdXNpbmcgdGhlCiAgICAgcGFyc2VkX3VyaSBzdHVmZi4KICAgICArIEFkZCBkaXNwbGF5IG9mIHRoZSAiY3VycmVudCBkaXJlY3RvcnkiIGluIGNhc2VzIHdoZXJlIGl0J3MKICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgc3VwcGxpZWQgcGF0aCAoZS5nLiwgZnRwOi8vdXNlckBob3N0LyBsaXZlcwogICAgIGluIC9ob21lL3VzZXIsIG5vdCBpbiAvLCB0aGVyZWZvcmUgY2xpY2tpbmcgb24gIi4uLyIgaW4gdGhlCiAgICAgc3RhcnRpbmcgZGlyZWN0b3J5IG1pZ2h0IHNlbmQgdXMgdG8gL2hvbWUvKS4KICAgICArIFdoZW4gZnRwIGxvZ2luIGZhaWxzLCAoZXNwLiB3aGVuIGEgdXNlciBuYW1lIHdhcyBwYXJ0IG9mIHRoZQogICAgIFVSTCBhbHJlYWR5KSwgd2Ugbm93IHJldHVybiBbNDAxIFVuYXV0aG9yaXplZCBdIHRvIGFsbG93IHRoZQogICAgIGJyb3dzZXIgdG8gcG9wIHVwIGFuIGF1dGhvcml6YXRpb24gZGlhbG9nLiBUaGlzIG1ha2VzIHBhc3N3b3JkcwogICAgIHNsaWdodGx5IGxlc3MgdmlzaWJsZSAodGhleSBkb24ndCBhcHBlYXIgaW4gdGhlIHJlZ3VsYXIgbG9nIGZpbGVzKQogICAgIGFuZCBpbXBsZW1lbnRzIGEgZnVuY3Rpb25hbGl0eSB0aGF0IG90aGVyIHd3dyBwcm94eSBzZXJ2ZXJzCiAgICAgYWxyZWFkeSBvZmZlcmVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVHJpZ2dlcmVkIGJ5IHRoZSByZWNlbnQgIlZpYToiIGhlYWRlciBjaGFuZ2VzLCB0aGUgcHJveHkgbW9kdWxlIHdvdWxkCiAgICAgZHVtcCBjb3JlIGZvciByZXBsaWVzIHdpdGggaW52YWxpZCBoZWFkZXJzIChlLmcuLCBkdXBsaWNhdGUKICAgICAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcykuIFRoZXNlIGVycm9ycyBhcmUgbm93IGxvZ2dlZCBhbmQgdGhlCiAgICAgY29yZSBkdW1wIGlzIGF2b2lkZWQuIEFsc28sIGJyb2tlbiByZXBsaWVzIGFyZSBub3QgY2FjaGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0gUFIjMjkxNAoKICAqKSBuZXcgYEdwcm9mRGlyJyBkaXJlY3RpdmUgd2hlbiBjb21waWxlZCB3aXRoIC1ER1BST0YsIHdoZXJlIGdwcm9mIGNhbgogICAgIHBsb3AgZ21vbi5vdXQgcHJvZmlsZSBkYXRhIGZvciBlYWNoIGNoaWxkIFtEb3VnIE1hY0VhY2hlcm5dCiAgIAogICopIFVzZSB0aGUgY29uc3RydWN0IGBgIiRAIicnIGluc3RlYWQgb2YgYGAkKicnIGluIHRoZSBnZW5lcmF0ZWQKICAgICBjb25maWcuc3RhdHVzIHNjcmlwdCB0byBiZSBpbW11bmUgYWdhaW5zdCBhcmd1bWVudHMgd2l0aCB3aGl0ZXNwYWNlcy4KICAgICBbWXZlcyBBcnJvdXllIDx5dmVzIGFwcGxlLmNvbT5dIFBSIzI4NjYKCiAgKikgUmVwbGFjZSB0aGUgaW5saW5lZCBpbmZvcm1hdGlvbiBncmFiYmluZyBzdHVmZiBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhZGp1c3RtZW50IGZlYXR1cmUgKG5vIC0td2l0aG91dC1jb25mYWRqdXN0KSB3aXRoIGNhbGxzIHRvIGEgbmV3IGhlbHBlcgogICAgIHNjcmlwdCBgYnVpbGRpbmZvLnNoJyB3aGljaCBpcyBib3RoIG1vcmUgZmxleGlibGUgYW5kIGFscmVhZHkgcHJvb2ZlZCB0bwogICAgIGJlIG1vcmUgcm9idXN0IGFnYWluc3QgcGxhdGZvcm0gZGlmZmVyZW5jZXMuIFRoaXMgbWFpbmx5IGZpeGVzIHRoZQogICAgIHJlY2VudGx5IG9jY3VyZWQgYGBzZWQ6IGNvbW1hbmQgZ2FyYmxlZDogLi4uJycgcHJvYmxlbXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3NzYsIFBSIzI4NDgKCiAgKikgTWFrZSBhYi5jIGFnYWluIHBhc3MgYGBnY2MgLVdhbGwgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbgogICAgIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnCiAgICAgd2l0aG91dCBjb21wbGFpbnMgYWZ0ZXIgd2UgcmVjZW50bHkgYWRkZWQgdGhlIFBPU1QgZmVhdHVyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCBpc19IVFRQX3h4eCgpIG1hY3JvcyB0byBhcF9pc19IVFRQX3h4eCgpIG5hbWUuIFRoZXkgYXJlIHVzZWQgaW5zaWRlCiAgICAgbW9kdWxlcyBhcyBBUEkgZnVuY3Rpb25zIGFuZCB3ZSBmb3Jnb3QgdGhlbSBhdCB0aGUgYmlnIHN5bWJvbCByZW5hbWluZy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIGJhZCByZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIFNFUlZFUl9WRVJTSU9OIGluIG1vZF9yZXdyaXRlLmh0bWwKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2EganAuRnJlZUJTRC5PUkc+XSBQUiMyODk1CgogICopIER5bmFtaWNhbGx5IHNpemUgdGhlIGZpbGVuYW1lIGNvbHVtbiBvZiBtb2RfYXV0b2luZGV4IG91dHB1dC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBkbyBQT1NUIHJlcXVlc3RzIHRvIHRoZSBhYiBiZW5jaG1hcmtpbmcgdG9vbC4KICAgICBbS3VydCBTdXNzbWFuIDxrbHMgYmVzdC5jb20+XSBQUiMyODcxCgogICopIEJ1bXAgdXAgTUFYX0VOVl9GTEFHUyBpbiBtb2RfcmV3cml0ZS5oIGZyb20gdGhlIHRvbyBjb25zZXJ2YXRpY2UgbGltaXQgb2YKICAgICA1IHRvIDEwIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgdXNlcnMgb3V0IHRoZXJlIHdobyBhbHdheXMgaGF2ZSA1IHRvIDgKICAgICB2YXJpYWJsZXMgaW4gb25lIFJld3JpdGVSdWxlIGFuZCBoYWQgdG8gcGF0Y2ggbW9kX3Jld3JpdGUuaCBmb3IgZXZlcnkKICAgICByZWxlYXNlLiBTbyAxNSBzaG91bGQgYmUgbm93IG1vcmUgdGhhbiBlbm91Z2gsIGV2ZW4gZm9yIHRoZW0uIChJIG5ldmVyCiAgICAgbmVlZGVkIG1vcmUgdGhhbiA0IGluIG15IFJld3JpdGVSdWxlcyA7LSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSB0aGUgcHJveHkgZ2VuZXJhdGUgYW5kIHVuZGVyc3RhbmQgVmlhOiBoZWFkZXJzCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBDaGFuZ2UgdGhlIHByb3h5IHRvIHVzZSB0YWJsZXMgaW5zdGVhZCBvZiBhcnJheV9oZWFkZXJzIGZvcgogICAgIHRoZSBoZWFkZXIgbGluZXMuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzdXJlIHRoZSBjb25maWcuc3RhdHVzIGZpbGUgaXMgbm90IG92ZXJyaWRkZW4gd2hlbiBqdXN0CiAgICAgYGBjb25maWd1cmUgLS1oZWxwJycgaXMgdXNlZC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI4NDQKCiAgKikgU3BsaXQgTU9EVUxFX01BR0lDX05VTUJFUiBpbnRvIF9NQUpPUi9fTUlOT1IgbnVtYmVycy4gVGhpcyBzaG91bGQKICAgICBwcm92aWRlIGEgd2F5IHRvIHRyYWNlIEFQSSBjaGFuZ2VzIHRoYXQgYWRkIGZ1bmN0aW9uYWxpdHkgYnV0IGRvCiAgICAgbm90IGNyZWF0ZSBhIGNvbXBhdGliaWxpdHkgaXNzdWUgZm9yIHByZWNvbXBpbGVkIG1vZHVsZXMsIGV0Yy4KICAgICBTZWUgaW5jbHVkZS9hcF9tbW4uaCBmb3IgbW9yZSBkZXRhaWxzLiAgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeCBzdWV4ZWMgaW5zdGFsbGF0aW9uIHVuZGVyIGBtYWtlIGluc3RhbGwgcm9vdD14eHgnIHNpdHVhdGlvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRXh0ZW5kIHRoZSBvdXRwdXQgb2YgdGhlIC1WIHN3aXRjaCB0byBpbmNsdWRlIHRoZSBwYXRocyBvZiBhbGwKICAgICBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZpbGVzLCBpZiB0aGV5IHdlcmUgb3ZlcnJpZGRlbiBhdAogICAgIGNvbXBpbGUgdGltZSwgZm9yIGxlYXN0IGFzdG9uaXNobWVudCBvZiB0aGUgdXNlci4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFdoZW4gUkVBRGluZyBhIHJlcXVlc3QgaW4gRXh0ZW5kZWRTdGF0dXMgbW9kZSwgdGhlICJvbGQiCiAgICAgdmhvc3QsIHJlcXVlc3QgYW5kIGNsaWVudCBpbmZvcm1hdGlvbiBpcyBub3QgZGlzcGxheWVkLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTVEFUVVMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gRnVsbCBzdGF0dXMgaW5mb3JtYXRpb24gbm93CiAgICAgcnVuLXRpbWUgY29uZmlndXJhYmxlIHVzaW5nIHRoZSBFeHRlbmRlZFN0YXR1cyBkaXJlY3RpdmUuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFNFQ1VSSVRZOiBDVkUtMTk5OS0xMTk5IChjdmUubWl0cmUub3JnKSAKICAgICBFbGltaW5hdGUgTyhuXjIpIHNwYWNlIERvUyBhdHRhY2tzIChhbmQgb3RoZXIgTyhuXjIpCiAgICAgY3B1IHRpbWUgYXR0YWNrcykgaW4gaGVhZGVyIHBhcnNpbmcuICBBZGQgYXBfb3ZlcmxhcF90YWJsZXMoKSwKICAgICBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYnVsayB1cGRhdGUgb3BlcmF0aW9ucwogICAgIG9uIHRhYmxlcyBpbiBhIG1vcmUgZWZmaWNpZW50IG1hbm5lci4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEFkZGVkIGNvbXBpbGUtdGltZSBhbmQgY29uZmlndXJhYmxlIGxpbWl0cyBmb3IKICAgICB2YXJpb3VzIGFzcGVjdHMgb2YgcmVhZGluZyBhIGNsaWVudCByZXF1ZXN0IHRvIGF2b2lkIHNvbWUgc2ltcGxlCiAgICAgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcywgaW5jbHVkaW5nIGxpbWl0cyBvbiBtYXhpbXVtIHJlcXVlc3QtbGluZQogICAgIHNpemUgKExpbWl0UmVxdWVzdExpbmUpLCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyAoTGltaXRSZXF1ZXN0RmllbGRzKSwKICAgICBhbmQgc2l6ZSBvZiBhbnkgb25lIGhlYWRlciBmaWVsZCAoTGltaXRSZXF1ZXN0RmllbGRzaXplKS4gIEFsc28gYWRkZWQKICAgICBhIGNvbmZpZ3VyYWJsZSBkaXJlY3RpdmUgTGltaXRSZXF1ZXN0Qm9keSBmb3IgbGltaXRpbmcgdGhlIHNpemUgb2YgdGhlCiAgICAgcmVxdWVzdCBtZXNzYWdlIGJvZHkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNYWtlIHN0YXR1cyBtb2R1bGUgYXdhcmUgb2YgRE5TIGFuZCBsb2dnaW5nIHN0YXRlcywgZXZlbiBpZgogICAgIFNUQVRVUyBub3QgZGVmaW5lZC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggdGhlIG5ldyBPUy8yIG11dGV4ZXMuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBFbmhhbmNlIG1vZF9zcGVsaW5nIHNvIHRoYXQgQ2hlY2tTcGVsbGluZyBjYW4gYmUgdXNlZCBpbgogICAgIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMgYW5kIC5odGFjY2VzcyBmaWxlcy4gIFtLZW4gQ29hcl0KCiAgKikgQVBJOiBuZXcgYXBfY3VzdG9tX3Jlc3BvbnNlKCkgZnVuY3Rpb24gZm9yIGhvb2tpbmcgaW50byB0aGUKICAgICBFcnJvckRvY3VtZW50IG1lY2hhbmlzbSBhdCBydW50aW1lIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogbmV3IGFwX3V1ZW5jb2RlKCkgZnVuY3Rpb24gW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQVBJOiBzY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBub3cgInB1YmxpYyIgYW5kIHJlbmFtZWQKICAgICBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBUaGUgJ3N0YXR1cycgbW9kdWxlIHdpbGwgbm93IHNob3cgdGhlIHByb2Nlc3MgcGlkJ3MgYW5kIHRoZWlyCiAgICAgc3RhdGUgZXZlbiB3aXRob3V0IGZ1bGwgU1RBVFVTIGFjY291bnRpbmcuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZXN0b3JlIHRoZSBjbGllbnQgSVAgYWRkcmVzcyB0byB0aGUgZXJyb3IgbG9nIG1lc3NhZ2VzLCB0aGlzCiAgICAgd2FzIGxvc3QgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIGZyb20gMS4yIHRvIDEuMy4gIEFkZCBhIG5ldwogICAgIGZ1bmN0aW9uIGFwX2xvZ19yZXJyb3IoKSB3aGljaCB0YWtlcyBhIHJlcXVlc3RfcmVjICogYW5kCiAgICAgZm9ybWF0cyBpdCBhcHByb3ByaWF0ZWx5LiAgW0RlYW4gR2F1ZGV0XSBQUiMyNjYxCgogICopIEN1cmUgYXBfY2ZnX2dldGxpbmUoKSBvZiBpdHMgbmFzdHkgaGFiaXQgb2YgY29tcHJlc3NpbmcgaW50ZXJuYWwKICAgICB3aGl0ZXNwYWNlIGluIGlucHV0IGxpbmVzIC0tIGluY2x1ZGluZyB3aXRoaW4gcXVvdGVkIHN0cmluZ3MuCiAgICAgW0tlbiBDb2FyXQogICAgIGJ1dCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZCBjb250aW51ZSB0byBiZQogICAgIHN0cmlwcGVkIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQ2xlYW51cCBvZiB0aGUgUHJpbnRQYXRoL1ByaW50UGF0aE9TMiBoZWxwZXIgZnVuY3Rpb25zLiBBdm9pZAogICAgIHRoZSB1Z2x5IHVzZSBvZiBhbiBlbnYuIHZhcmlhYmxlIGFuZCB1c2UgY29tbWFuZC1saW5lIGFyZ3MgZm9yCiAgICAgYWx0ZXJuYXRlICRQQVRILiBNYWtlIG1vcmUgbGlrZSBhZHZhbmNlZCAndHlwZSdzIGFzIHdlbGwuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFRoZSBJUklYTjMyIFJ1bGUgd2FzIGJlaW5nIGlnbm9yZWQuIENvbmZpZ3VyZSBub3cgY29ycmVjdGx5IGFkZHMKICAgICAtbjMyIG9ubHkgaWYgSVJJWE4zMiBzYXlzIHRvLiBbSmltIEphZ2llbHNraSwgQWxhaW4gU3QtRGVuaXMKICAgICA8YWxhaW4uc3QtZGVuaXMgZWMuZ2MuY2E+XSBQUiMyNzM2CgogICopIENsZWFuIHVwIGEgd2FybmluZyBpbiBtb2RfcHJveHkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW5hbWVkIF9fRU1YX18gKGludGVybmFsIGRlZmluZSBvZiB0aGUgZ2NjIHBvcnQgdW5kZXIgT1MvMikgdG8gT1MyCiAgICAgZm9sbG93aW5nIHRoZSBzYW1lIGlkZWEgYXMgIk1TVkMgdnMgV0lOMzIiLiBBZGRpdGlvbmFsbHkgdGhlIHNyYy9vcy9lbXgvCiAgICAgZGlyZWN0b3J5IHdhcyByZW5hbWVkIHRvIHNyYy9vcy9vczIvIGZvciBjb25zaXN0ZW5jeS4KICAgICBbQnJpYW4gSGF2YXJkLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgbmV3IFJ1bGUgU0hBUkVEX0NIQUlOIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBsaW5raW5nIG9mIERTTwogICAgIGZpbGVzIChoZXJlIG1vZHVsZXMpIGFnYWluc3Qgb3RoZXIgRFNPIGZpbGVzIChoZXJlIHNoYXJlZCBsaWJyYXJpZXMpLgogICAgIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyBhIHN1YnNldCBvZiBMSUJTIHdoaWNoIGNhbiBiZSBzYWZlbHkgdXNlZCBmb3IKICAgICBsaW5raW5nIHRoZSBEU09zLCBpLmUuIFBJQyBsaWJzIGFuZCBzaGFyZWQgbGlicy4gIEN1cnJlbnRseSB0aGUgcnVsZSBpcwogICAgIGRpc2FibGVkIGZvciBhbGwgcGxhdGZvcm1zIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhpcyAoZXhwZXJpbWVudGFsKQogICAgIHJ1bGUuIEJ1dCB3ZSBwcm92aWRlIGl0IG5vdyBmb3IgdGhvc2UgcGVvcGxlIGhvdyByYW4gaW50byBwcm9ibGVtcyBhbmQKICAgICB3YW50IHRvIGNhbWUgb3V0IGJ5IGZvcmNpbmcgbGlua2luZyBhZ2FpbnN0IERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1ODcKCiAgKikgRml4IHN1RVhFQyBzdGFydCBtZXNzYWdlOiBIYXMgdG8gYmUgb2YgYG5vdGljZScgbGV2ZWwgdG8gcmVhbGx5IGdldAogICAgIHByaW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgc3RhbmRhcmQgc3RhcnR1cCBtZXNzYWdlIGJlY2F1c2UgdGhlIGBub3RpY2UnCiAgICAgbGV2ZWwgaXMgaGFuZGxlZCBzcGVjaWFsIGluc2lkZSBhcF9sb2dfZXJyb3IoKSBmb3Igc3RhcnR1cCBtZXNzYWdlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc2MSBQUiMyNzYxIFBSIzI3NjUKCiAgKikgQWRkIGNvcnJlY3QgYG1vZGVsJyBNSU1FIHR5cGVzIGZyb20gUkZDMjA3NyB0byBtaW1lLnR5cGVzIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MzIKCiAgKikgRml4ZWQgZXhhbXBsZXMgaW4gbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudC4gCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc1NgoKICAqKSBBbGxvdyBhcF9yZWFkX3JlcXVlc3QgZXJyb3JzIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBub3JtYWwgcmVxdWVzdAogICAgIGhhbmRsaW5nIGxvb3Agc28gdGhhdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgcHJvcGVybHkgY2xvc2VkIHdpdGgKICAgICBsaW5nZXJpbmdfY2xvc2UsIHRodXMgYXZvaWRpbmcgYSBwb3RlbnRpYWwgVENQIHJlc2V0IHRoYXQgd291bGQKICAgICBjYXVzZSB0aGUgY2xpZW50IHRvIG1pc3MgdGhlIEhUVFAgZXJyb3IgcmVzcG9uc2UuICBbUm95IEZpZWxkaW5nXQoKICAqKSBPbmUgbW9yZSBwb3J0YWJpbGl0eSBmaXggZm9yIEFQQUNJIHNoYWRvdyB0cmVlIHN1cHBvcnQ6IFN3YXAgb3JkZXIgb2YgYXdrCiAgICAgYW5kIHNlZCBpbiB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBhdm9pZCBzZWQgZmFpbHMgb24gc29tZQogICAgIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUKICAgICBub24tbmV3bGluZS10ZXJtaW5lZCBvdXRwdXQgb2YgQXdrLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcyOQoKICAqKSBQT1JUOiBORUMgRVdTNDgwMCBzdXBwb3J0LgogICAgIFtNQVRTVVVSQSBUYWthbm9yaSA8dC1tYXRzdXUgcHJvdGVpbi5vc2FrYS11LmFjLmpwPl0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIHByb3h5IG9uIE9TLzIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBGaXggV2luMzIgcGFydCBvZiBhcF9zcGF3bl9jaGlsZCgpIGJ5IHByb3ZpZGluZyBhIHJlYXNvbmFibGUgY2hpbGRfaW5mbwogICAgIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGp1c3QgTlVMTC4gVGhpcyBmaXhlcyBhdCBsZWFzdCB0aGUgUmV3cml0ZU1hcAogICAgIHByb2dyYW1zIHVuZGVyIFdpbjMyLiBbTWFyY28gRGUgTWljaGVsZSA8bWRlbWljaGVsZSB0aW4uaXQ+XSBQUiMyNDgzCgogICopIEFkZCB3b3JrYXJvdW5kIHRvIHRvcC1sZXZlbCBgY29uZmlndXJlJyBzY3JpcHQgZm9yIGJyYWluIGRlYWQgCiAgICAgYGVjaG8nIGNvbW1hbmRzIHdoaWNoIGludGVycGV0IGVzY2FwZSBzZXF1ZW5jZXMgcGVyIGRlZmF1bHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2NTQKCiAgKikgTWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIgaXMgY29ycmVjdGx5CiAgICAgYWRqdXN0ZWQgdW5kZXIgYG1ha2UgaW5zdGFsbCcgYWxzbyBmb3IgdGhlIHByaW50ZW52IENHSSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1OTUKIAogICopIFVwZGF0ZSB0aGUgbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudCB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgc2l0dWF0aW9uCiAgICAgb2YgdGhlIGBwcm94eScgKGBbUF0nKSBmZWF0dXJlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY3OQoKICAqKSBGaXggYGluc3RhbGwtaW5jbHVkZXMnIHN1Yi10YXJnZXQgb2YgYGluc3RhbGwnIHRhcmdldCBpbiB0b3AtbGV2ZWwKICAgICBNYWtlZmlsZS50bXBsOiBUaGUgdW1hc2srY3AgYXBwcm9hY2ggZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQgKGVzcGVjaWFsbHkKICAgICBmb3IgdXNlcnMgd2hpY2ggZXh0cmFjdGVkIHRoZSBkaXN0cmlidXRpb24gdW5kZXIgJ3VtYXNrIDA3NycpLCBzbyByZXBsYWNlCiAgICAgaXQgYnkgYW4gZXhwbGljaXQgY3ArY2htb2QgYXBwcm9hY2guCiAgICAgW1JpY2hhcmQgTGxveWQsIEN1cnQgU2FtcHNvbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY1NiBQUiMyNjI2CiAKICAqKSBGaXggYGRpc3RjbGVhbicgYW5kIGBjbGVhbicgdGFyZ2V0cyBpbiBzcmMvTWFrZWZpbGUudG1wbCB0byBoYXZlIHNhbWUKICAgICBiZWhhdmlvciBhbmQgdG8gY2xlYW51cCBjb3JyZWN0bHkgZXZlbiB1bmRlciBlbmFibGVkIFNIQVJFRF9DT1JFIHJ1bGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzZSBhIG1vcmUgc3RyYWlnaHQgZm9yd2FyZCBhbmQgdGh1cyBsZXNzIHByb2JsZW1hdGljIFNlZCBjb21tYW5kIGluCiAgICAgc3JjL2hlbHBlci9ta2Rpci5zaCBzY3JpcHQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoZSBgY29uZmlndXJlJyBzY3JpcHRzIGRvZXNuJ3QgZmFpbCB3aGVuIHRyeWluZyB0byBndWVzcyB0aGUKICAgICBkb21haW5uYW1lIG9mIHRoZSBtYWNoaW5lIGFuZCB0aGVyZSBhcmUgbXVsdGlwbGUgYGRvbWFpbm5hbWUnIGFuZAogICAgIGBzZWFyY2gnIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxMAoKICAqKSBBZGQgbm90ZSBhYm91dCB0aGUgU0hBUkVEX0NPUkUgcmVxdWlyZW1lbnQgb24gc29tZSBwbGF0Zm9ybXMgYWxzbyB0byB0aGUKICAgICBJTlNUQUxMIGZpbGUgYmVjYXVzZSBhIGxvdCBvZiB1c2VycyBkb24ndCByZWFkIGh0ZG9jcy9tYW51YWwvZHNvLmh0bWwKICAgICBmaXJzdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MDEKCiAgKikgRml4IGRvY3VtZW50ICJoeXBlcmxpbmsiIGZvciBkc28uaHRtbCBpbiBzcmMvQ29uZmlndXJhdGlvbi50bXBsCiAgICAgW0tudXQgQS5TeWVkIDxLbnV0LlN5ZWQgbmhoLm5vPl0gUFIjMjY3NAoKICAqKSBNb2RpZnkgbW9kX3Jld3JpdGUgdG8gdXBkYXRlIHRoZSBWYXJ5IHJlc3BvbnNlIGZpZWxkIGlmIHRoZSBVUkwgcmV3cml0aW5nCiAgICAgZW5naW5lIGRvZXMgYW55IG1hbmlwdWxhdGlvbnMgb3IgZGVjaXNpb25zIGJhc2VkIHVwb24gcmVxdWVzdCBmaWVsZHMuIAogICAgIFtLZW4gQ29hcl0gUFIjMTY0NAoKICAqKSBEb2N1bWVudCB0aGUgc3BlY2lhbCBBUEFDSSBiZWhhdmlvciBmb3IgaW5zdGFsbGF0aW9uIHBhdGhzIHdoZXJlCiAgICAgYGAvYXBhY2hlJycgaXMgYXBwZW5kZWQgdG8gcGF0aHMgdW5kZXIgc29tZSAod2VsbCBkZWZpbmVkLCBvZiBjb3Vyc2UpCiAgICAgc2l0dWF0aW9ucyB0byBwcmV2ZW50IHBvbGx1dGlvbiBvZiBzeXN0ZW0gbG9jYXRpb25zIHdpdGggQXBhY2hlIGZpbGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjYwCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBidWZmZXJlZCByZXNwb25zZSBtZXNzYWdlIG5vdCBiZWluZyBzZW50IGZvcgogICAgIHRoZSByZWFkX3JlcXVlc3QgZXJyb3IgY29uZGl0aW9ucyBvZiBVUkktdG9vLWxvbmcgKDQxNCkgYW5kCiAgICAgbWFsZm9ybWVkIGhlYWRlciBmaWVsZHMgKDQwMCkuICBbUm95IEZpZWxkaW5nXSBQUiMyNjQ2CgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgTWF4LUZvcndhcmRzOiBoZWFkZXIgbGluZSByZXF1aXJlZCBieSBSRkMyMDY4IGZvcgogICAgIHRoZSBUUkFDRSBtZXRob2QuIFRoaXMgYWxsb3dzIGFwYWNoZSB0byBUUkFDRSBhbG9uZyBhIGNoYWluIG9mIHByb3hpZXMKICAgICB1cCB0byBhIHByZWRldGVybWluZWQgZGVwdGguIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IFNIQVJFRF9DT1JFIHJ1bGU6IFRoZSBDRkxBR1NfU0hMSUIgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIGRvdWJsZWQKICAgICAoY29tcGlsZXJzIGNvbXBsYWluZWQpIGFuZCB0aGUgLnNvLlYuUi5QIGZpbGVuYW1lIGV4dGVuc2lvbiB3YXMgYWRqdXN0ZWQKICAgICB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgMS4zLjIgdmVyc2lvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY0NAoKICAqKSBTRUNVUklUWTogUGx1ZyAiLi4uIiBhbmQgb3RoZXIgY2Fub25pY2FsaXphdGlvbiBob2xlcyB1bmRlciBPUy8yLgogICAgIFtCcmlhbiBIYXZhcmRdCiAgCiAgKikgUE9SVDogaW1wbGVtZW50IHNlcmlhbGl6ZWQgYWNjZXB0cyBmb3IgT1MvMi4gIFtCcmlhbiBIYXZhcmRdCgogICopIG1vZF9pbmNsdWRlIGhhZCBwcm9ibGVtcyB3aXRoIHRoZSBmc2l6ZSBhbmQgZmxhc3Rtb2QgZGlyZWN0aXZlcwogICAgIHVuZGVyIFdJTjMyLiAgRml4IGFsc28gYXZvaWRzIHRoZSBtaW5vciBzZWN1cml0eSBob2xlIG9mIHVzaW5nCiAgICAgIi4uIiBwYXRocyBmb3IgZnNpemUgYW5kIGZsYXN0bW9kLgogICAgIFtNYW5vaiBLYXNpY2hhaW51bGEgPG1hbm9qayByYWxlaWdoLmlibS5jb20+XSBQUiMyMzU1CgogICopIEZpeGVkIHNvbWUgTWFrZWZpbGUgZGVwZW5kZW5jeSBwcm9ibGVtcy4gIFtEZWFuIEdhdWRldF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjEKCiAgKikgRGlzYWJsZSB0aGUgaW5jb3JyZWN0IGVudHJ5IGZvciBhcHBsaWNhdGlvbi9tc3dvcmQgaW4gdGhlIAogICAgIG1vZF9taW1lX21hZ2ljICJtYWdpYyIgZmlsZSBiZWNhdXNlIGl0IGFsc28gbWF0Y2hlcyBvdGhlciBPZmZpY2UKICAgICBkb2N1bWVudHMuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjYwOAoKICAqKSBGaXggYnJva2VuIFJBTkxJQiBoYW5kbGluZyBpbiBzcmMvQ29uZmlndXJlICh0aGUgZW50cnkgZnJvbQogICAgIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgd2FzIGlnbm9yZWQpIGFuZCBhZGRpdGlvbmFsbHkgZm9yY2UgUkFOTElCIHRvCiAgICAgL2Jpbi90cnVlIHVuZGVyIEhQL1VYIHdoZXJlIHJhbmxpYiBleGlzdHMgYnV0IGlzIGRlcHJlY2F0ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2MjcKICAgICAKICAqKSAnYXBhY2hlY3RsIHN0YXR1cycgZmFpbGVkIG9uIHNvbWUgc3lzdGVtcy4KICAgICBbU3RldmUgVmFuRGV2ZW5kZXIgPHN0ZXZldiBkYXJrd2luZy51b3JlZ29uLmVkdT4sIExhcnMgRWlsZWJyZWNodF0gUFIjMjYxMwoKICAqKSBBZGQgbmV3IGZsYWdzIGZvciBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKCkgdG8gbWFrZSBpdCBnZW5lcmF0ZQogICAgIHRoZSBzY2hlbWU6Ly9zaXRlcGFydCBzdHJpbmcgb25seSwgb3IgdG8gb21pdCB0aGUgcXVlcnkgc3RyaW5nLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgV0lOMzI6IENhbm9uaWNhbGl6ZSBTZXJ2ZXJSb290IGJlZm9yZSBjaGVja2luZyB0byBzZWUgaWYgaXQKICAgICBpcyBhIHZhbGlkIGRpcmVjdG9yeS4gIFRoZSBmYWlsdXJlIHRvIGRvIHRoaXMgY2F1c2VkIGNlcnRhaW4KICAgICBTZXJ2ZXJSb290IHNldHRpbmdzIChlZy4gIlNlcnZlclJvb3QgL2FwYWNoZSIpIHRvIGJlIGltcHJvcGVybHkKICAgICByZWplY3RlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgR2xvYmFsIHJlbmFtaW5nIG9mIEMgaGVhZGVyIGZpbGVzIHRvIGJvdGggZ2V0IHJpZCBvZiBjb25mbGljdHMgd2l0aCB0aGlyZAogICAgIHBhcnR5IHBhY2thZ2VzIGFuZCB0byBhZ2FpbiByZWFjaCBjb25zaXN0ZW5jeToKICAgICAgIDEuIGNvbmYuaCAgICAgIC0+IGFwX2NvbmZpZy5oCiAgICAgICAyLiBjb25mX2F1dG8uaCAtPiBhcF9jb25maWdfYXV0by5oIFwgdGhlc2UgYXJlIG5vdyBtZXJnZWQKICAgICAgIDMuIGFwX2NvbmZpZy5oIC0+IGFwX2NvbmZpZ19hdXRvLmggLyBpbiB0aGUgY29uZmlnIHByb2Nlc3MKICAgICAgIDQuIGNvbXBhdC5oICAgIC0+IGFwX2NvbXBhdC5oCiAgICAgICA1LiBhcGN0eXBlLmggICAtPiBhcF9jdHlwZS5oCiAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmaWxlcyBmb3IgY29uZi5oIGFuZCBjb21wYXQuaCB3ZXJlIGNyZWF0ZWQuCgogICopIG1vZF9tbWFwX3N0YXRpYyB3aWxsIG5vIGxvbmdlciB0YWtlIGFjdGlvbiBvbiByZXF1ZXN0cyB1bmxlc3MgYXQgCiAgICAgbGVhc3Qgb25lICJtbWFwZmlsZSIgZGlyZWN0aXZlIGlzIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIAogICAgIFRoaXMgZXhwZXJpbWVudGFsIG1vZHVsZSBoYXMgdG8gZG8gc29tZSBibGFjayBtYWdpYyB0byBvcGVyYXRlIAogICAgIGluc2lkZSB0aGUgY3VycmVudCBBUEkgYW5kIHRodXMgY3JlYXRlcyBzaWRlLWVmZmVjdHMgZm9yIG90aGVyIAogICAgIG1vZHVsZXMgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogCiAgKikgQWRkIGNvbnNlcnZhdGl2ZSB0aWNrcyBhcm91bmQgbW9yZSBlZ3JlcCBhcmd1bWVudHMgaW4gdG9wLWxldmVsIGNvbmZpZ3VyZQogICAgIHRvIGF2b2lkIHByb2JsZW1zIHVuZGVyIGJyYWluLWRlYWQgcGxhdGZvcm1zIGxpa2UgRGlnaXRhbCBVTklYIChPU0YxKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjU5NgoKICAqKSBtb2RfcmV3cml0ZSBjcmVhdGVkIFJld3JpdGVMb2NrIGZpbGVzIHVuZGVyIHRoZSBVSUQgb2YgdGhlIHBhcmVudAogICAgIHByb2Nlc3MsIHRodXMgdGhlIGNoaWxkIHByb2Nlc3NlcyBoYWQgbm8gd3JpdGUgYWNjZXNzIHRvIHRoZSBmaWxlcy4KICAgICBOb3cgYSBjaG93bigpIGlzIGRvbmUgb24gdGhlIGZpbGUgdG8gdGhlIHVpZCBvZiB0aGUgY2hpbGRyZW4sCiAgICAgaWYgYXBwbGljYWJsZS4gIFtMYXJzIEVpbGVicmVjaHQsIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzNDEKCiAgKikgQXV0b2dlbmVyYXRlIHNvbWUgSEFWRV9YWFhYWF9IIGRlZmluZXMgaW4gY29uZl9hdXRvLmggKGRldGVybWluZWQgdmlhCiAgICAgVGVzdENvbXBpbGUpIGluc3RlYWQgb2YgZGVmaW5pbmcgdGhlbSBtYW51YWxseSBpbiBjb25mLmggYmFzZWQgb24gbGVzcwogICAgIGFjY3VyYXRlIHBsYXRmb3JtIGRlZmluaXRpb25zLiAgVGhpcyB3YXkgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gZmlkZGxlIHdpdGgKICAgICBPUy10eXBlIGFuZC9vciBPUy12ZXJzaW9uIGlkZW50aWZpZXJzIHRvIGRpc2NvdmVyIHdoZXRoZXIgYSBzeXN0ZW0gaGVhZGVyCiAgICAgZmlsZSBleGlzdHMgb3Igbm90LiAgSW5zdGVhZCB3ZSBub3cgZGlyZWN0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YKICAgICB0aG9zZSBlc290ZXJpYyBvbmVzLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjA5MywgUFIjMjM2MSwgUFIjMjM3NywgUFIjMjQzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIjMjUyNCwgUFIjMjUyNSwgUFIjMjUzMywgUFIjMjU2OQoKICAqKSBtb2Rfc2V0ZW52aWYgKEJyb3dzZXJNYXRjaCogYW5kIGZyaWVuZHMpIHdpbGwgbm93IG1hdGNoIGEgbWlzc2luZwogICAgIGZpZWxkIHdpdGggIl4kIi4gIFtLZW4gQ29hcl0KCiAgKikgU2V0IHRoZSBSVExEX0dMT0JBTCBkbG9wZW4gbW9kZSBwYXJhbWV0ZXIgdG8gYWxsb3cgZHluYW1pY2FsbHkgbG9hZGVkCiAgICAgbW9kdWxlcyB0byBsb2FkIHRoZWlyIG93biBtb2R1bGVzIGR5bmFtaWNhbGx5LiAgVGhpcyBpbXByb3ZlcyBtb2RfcGVybAogICAgIGFuZCBtb2RfcGhwMyB3aGVuIHRoZXNlIG1vZHVsZXMgYXJlIGxvYWRlZCBkeW5hbWljYWxseSBpbnRvIEFwYWNoZS4KICAgICBbUmFzbXVzIExlcmRvcmZdCgogICopIENhY2hlIGEgcHJveGllZCByZXF1ZXN0IGluIHRoZSBldmVudCB0aGF0IHRoZSBjbGllbnQgY2FuY2VscyB0aGUKICAgICB0cmFuc2ZlciwgcHJvdmlkZWQgdGhhdCB0aGUgY29uZmlndXJlZCBwZXJjZW50YWdlIG9mIHRoZSBmaWxlIGhhcwogICAgIGFscmVhZHkgYmVlbiB0cmFuc2ZlcmVkLiBJdCB3b3JrcyBmb3IgSFRUUCB0cmFuc2ZlcnMgb25seS4gIFRoZSAKICAgICBuZXcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgY2FsbGVkIENhY2hlRm9yY2VDb21wbGV0aW9uLiAKICAgICBbR2xlbiBQYXJrZXIgPGdsZW5lYm9iIG53bGluay5jb20+XSBQUiMyMjc3CgogICopIEFkZCB0aGUgIjwhRE9DVFlQRSBIVE1MIiBtYWdpYyBjb29raWUgdXNlZCBieSBtb2Rlcm4gZG9jdW1lbnRzIChhbmQKICAgICByZXF1aXJlZCBieSBIVE1MIDMuMiBhbmQgbGF0ZXIpIHRvIG1vZF9taW1lX21hZ2ljJ3MgY29uZi9tYWdpYy4KICAgICBbQW5uYSBTaGVyZ29sZCA8YW5uYSBpbmV4dC5jby51az5dCgogICopIEZpeCB5ZXQgYW5vdGhlciBzaWduYWwtYmFzZWQgcmFjZSBjb25kaXRpb24gaW52b2x2aW5nIG5lc3RlZCB0aW1lcnMuCiAgICAgU2lnbmFscyBzdWNrLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBzdWV4ZWMncyBlcnJvciBtZXNzYWdlcyBoYXZlIGJlZW4gY2xhcmlmaWVkIGEgbGl0dGxlIGJpdC4gIFtLZW4gQ29hcl0KCiAgKikgQ2xlYW4gdXAgc29tZSwgYnV0IHBlcmhhcHMgbm90IGFsbCwgOC1iaXQgY2hhcmFjdGVyIHNldCBwcm9ibGVtcwogICAgIHdpdGggY29uZmlnIGZpbGUgcGFyc2luZywgYW5kIFVSTCBwYXJzaW5nLiAgV2Ugbm93IGRlZmluZQogICAgIGFwX2lzZGlnaXQoKSwgYXBfaXN1cHBlcigpLCAuLi4gd2hpY2ggY2FzdCB0byBhbiAodW5zaWduZWQgY2hhcikuCiAgICAgVGhpcyBzaG91bGQgd29yayBvbiBtb3N0IG1vZGVybiB1bml4ZXMuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM4MDAsIDIyODIsIDI1NTMgIChhbmQgb3RoZXJzKQoKICAqKSBUaGUgImhhbmRsZXIgbm90IGZvdW5kIiBlcnJvciB3YXMgaXNzdWVkIGluIGNhc2VzIHdoZXJlIHRoZSBoYW5kbGVyCiAgICAgcmVhbGx5IGRpZCBleGlzdCwgYnV0IHdhcyBqdXN0IGRlY2xpbmluZyB0byBzZXJ2ZSB0aGUgcmVxdWVzdC4KICAgICBbSm9obiBWYW4gRXNzZW4gPGp2ZSBnYW1lcnMub3JnPl0gUFIjMjUyOQoKICAqKSBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIFNDTzUgKE9wZW5TZXJ2ZXIgNS4wLngpLgogICAgIFtSb25hbGQgUmVjb3JkIDxyciBzY28uY29tPl0gUFIjMjUzMwoKICAqKSBUaGUgQVBBQ0kgbGliZXhlY2RpciB3YXMgbm90IGV4dGVuZGVkIHdpdGggYW4gImFwYWNoZS8iIHN1YmRpcgogICAgIGlmIHRoZSBpbnN0YWxsYXRpb24gcHJlZml4IGRpZG4ndCBhbHJlYWR5IGNvbnRhaW4gImFwYWNoZSIsIGJ1dAogICAgIGl0IHNob3VsZCBiZSBiZWNhdXNlIHRoZSBEU08gZmlsZXMgYXJlIEFwYWNoZS1zcGVjaWZpYy4gIE5vdwogICAgIGxpYmV4ZWNkaXIgaXMgdHJlYXRlZCB0aGUgc2FtZSB3YXkgc3lzY29uZmRpciwgZGF0YWRpciwgbG9jYWxzdGF0ZWRpcgogICAgIGFuZCBpbmNsdWRlZGlyIGFyZSBhbHJlYWR5IHRyZWF0ZWQuCiAgICAgW0NoYXJsZXMgTGV2ZXJ0IDxjaGFybGVzIGNvbW0ucG9seW10bC5jYT5dIFBSIzI1NTEKCiAgKikgVGhlIDxMaW1pdD4gcGFyc2luZyByb3V0aW5lIHdhcyBpbmNvcnJlY3RseSB0cmVhdGluZyBtZXRob2RzIGFzCiAgICAgY2FzZS1pbnNlbnNpdGl2ZS4gIFtLZW4gQ29hcl0KCiAgKikgVGhlIGFwX2JwcmludGYoKSBjb2RlIG5lZ2xlY3RlZCB0byB0ZXN0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvbgogICAgIHRoZSBjb25uZWN0aW9uLiAgYXBfYmZsdXNoKCkgbWlzZGlhZ25vc2VkIGEgZmFpbHVyZSBhcyBhIHN1Y2Nlc3MuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBhZGQgc3VwcG9ydCBmb3IgI3BlcmwgYXJnIGludGVycG9sYXRpb24gaW4gbW9kX2luY2x1ZGUKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBBUEk6IE5hbWUgY2hhbmdlcyBvZiB0YWJsZV9lbHRzIHRvIGFwX3RhYmxlX2VsdHMsIGlzX3RhYmxlX2VtcHR5CiAgICAgdG8gYXBfaXNfdGFibGVfZW1wdHkgYW5kIGJnZXRmbGFnIHRvIGFwX2JnZXRmbGFnLiBbQmVuIExhdXJpZV0KCiAgKikgUE9SVDogQWRkIFVuaXhXYXJlIDcgc3VwcG9ydAogICAgIFtWYWRpbSBLb3N0b2dsb2RvZmYgPHZhZGltIG9sbHkucnU+XSBQUiMyNDYzCgogICopIEZpeCB0aGUgR3Vlc3MtRFNPLWZsYWdzLWZyb20tUGVybCBzdHVmZiBpbiBzcmMvQ29uZmlndXJlOiAicGVybCIgd2FzCiAgICAgdXNlZCBpbnN0ZWFkIG9mICIkUEVSTCIgd2hpY2ggY29udGFpbnMgdGhlIGNvcnJlY3RseSBkZXRlcm1pbmVkIFBlcmwKICAgICBpbnRlcnByZXRlciAoaW1wb3J0YW50IGZvciBpbnN0YW5jZSBvbiBzeXN0ZW1zIHdoZXJlICJwZXJsIiBhbmQgInBlcmw1IgogICAgIGV4aXN0cywgbGlrZSBCU0RJIG9yIEZyZWVCU0QsIGV0YykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1MDUKCiAgKikgTW92ZSB0aGUgaW5pdGlhbCBzdUVYRUMtcmVsYXRlZCBzdGFydHVwIG1lc3NhZ2UgZnJvbSBwbGFpbgogICAgIGZwcmludGYoKS9zdGRlcnIgdG8gYSBkZWxheWVkIGFwX2xvZ19lcnJvcigpLWJhc2VkIG9uZSB0byBhdm9pZCBwcm9ibGVtcwogICAgIHdoZW4gQXBhY2hlIGlzIHN0YXJ0ZWQgZnJvbSBpbmV0ZCAoaW5zdGVhZCBvZiBzdGFuZGFsb25lKS4gVW5kZXIgdGhpcwogICAgIHNpdHVhdGlvbiBzdGFydHVwIG1lc3NhZ2VzIG9uIHN0ZGVyciBsZWFkIHRvIHByb2JsZW1zICh0aGUgbGluZSBpcyBzZW50CiAgICAgdG8gdGhlIGNsaWVudCBpbiBmcm9udCBvZiB0aGUgcmVxdWVzdGVkIGRvY3VtZW50KS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjODcxLCBQUiMxMzE4CgogICopIEFkZCBhIGZsYWcgc28gYXBfZm5tYXRjaCgpIGNhbiBiZSB1c2VkIGZvciBjYXNlLWJsaW5kIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgW0tlbiBDb2FyLCBEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IERvbid0IGNvbGxhcHNlIG11bHRpcGxlIHNsYXNoZXMgaW4gUEFUSF9JTkZPLgogICAgIFtCZW4gTGF1cmllLCBCaWxsIFN0b2RkYXJkIDx3Z3N0b2RkYSB1cy5pYm0uY29tPl0gUFIjMjI3NAoKICAqKSBXSU4zMiBTRUNVUklUWTogRWxpbWluYXRlIHRyYWlsaW5nICIuInMgaW4gcGF0aCBjb21wb25lbnRzLiBUaGVzZSBhcmUKICAgICBpZ25vcmVkIGJ5IHRoZSBXaW5kb3dzIGZpbGVzeXN0ZW0sIGFuZCBzbyBjYW4gYmUgdXNlZCB0byBieXBhc3Mgc2VjdXJpdHkuCiAgICAgW0JlbiBMYXVyaWUsIEFsZXhlaSBLb3N1dF0uCgogICopIFdlIG5vdyBhdHRlbXB0IHRvIGR1bXAgY29yZSB3aGVuIHdlIGdldCBTSUdJTEwuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQT1JUOiByZW1vdmUgYnJva2VuIHRlc3QgZm9yIE1BUF9GSUxFIGluIGh0dHBfbWFpbi5jLgogICAgIFtXaWxmcmVkbyBTYW5jaGV6IDx3c2FuY2hleiBhcHBsZS5jb20+XQoKICAqKSBQT1JUOiBDaGFuZ2Ugc3VwcG9ydC9hcGFjaGVjdGwgdG8gdXNlICJraWxsIC0wICRwaWQiIHRvIHRlc3QgaWYgdGhlCiAgICAgaHR0cGQgaXMgcnVubmluZy4gIFRoaXMgc2hvdWxkIGJlIG1vcmUgcG9ydGFibGUgdGhhbiBmaWd1cmluZyBvdXQKICAgICB3aGljaCBvZiB0aHJlZSBkb3plbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgInBzIiBhcmUgaW5zdGFsbGVkLgogICAgIFthIGNhc3Qgb2YgZG96ZW5zXQoKICAqKSBXSU4zMjogSWYgd2UgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gZXhlY3V0ZSBhIGZpbGUgaW4gYSBzY3JpcHQKICAgICBkaXJlY3RvcnksIGJhaWwgb3V0IG9mIHRoZSByZXF1ZXN0IHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFtXIEcgU3RvZGRhcmRdCgogICopIFdJTjMyIFNFQ1VSSVRZOiBFbGltaW5hdGUgZGlyZWN0b3JpZXMgY29uc2lzdGluZyBvZiB0aHJlZSBvciBtb3JlIGRvdHM7CiAgICAgdGhlc2UgYXJlIHRyZWF0ZWQgYnkgV2luMzIgYXMgaWYgdGhleSBhcmUgIi4uIiBidXQgYXJlIG5vdCBkZXRlY3RlZCBieQogICAgIG90aGVyIG1hY2hpbmVyeSB3aXRoaW4gQXBhY2hlLiBUaGlzIGlzIHNvbWV0aGluZyBvZiBhIGtsdWRnZSBidXQKICAgICBlbGltaW5hdGVzIGEgc2VjdXJpdHkgaG9sZS4gW01hbm9qIEthc2ljaGFpbnVsYSwgQmVuIExhdXJpZV0KCiAgKikgTW92ZSBhcF9lc2NhcGVfcXVvdGVzKCkgZnJvbSBzcmMvYXAgdG8gc3JjL21haW4vdXRpbC5jOyBpdCB1c2VzCiAgICAgcG9vbHMgYW5kIHRodXMgcG9sbHV0ZXMgbGliYXAgKHVudGlsIHRoZSBwb29sIHN0dWZmIGlzIG1vdmVkIHRoZXJlKS4KICAgICBbS2VuIENvYXJdCgogICopIEluZGV4SWdub3JlIHNob3VsZCBiZSBjYXNlLWJsaW5kIG9uIFdpbjMyIChhbmQgYW55IG90aGVyIGNhc2UtYXdhcmUKICAgICBidXQgY2FzZS1pbnNlbnNpdGl2ZSBwbGF0Zm9ybXMpLiAgTmV3ICNkZWZpbmUgZm9yIHRoaXMgYWRkZWQgdG8gY29uZi5oCiAgICAgKENBU0VfQkxJTkRfRklMRVNZU1RFTSkuICBbS2VuIENvYXJdIFBSIzI0NTUKCiAgKikgRW5hYmxlIERTTyBzdXBwb3J0IGZvciBPcGVuQlNEIGluIGdlbmVyYWwsIG5vdCBvbmx5IGZvciAyLngsIGJlY2F1c2UgaXQKICAgICBhbHNvIHdvcmtzIGZvciBPcGVuQlNEIDEueC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEZpeCBjb21waWxhdGlvbiBwcm9ibGVtIG9uIEFSTSBMaW51eC4KICAgICBbU2FtIEtpbmd0b24gPHNhbSBpbGx1bWluYXRlZC5jby51az5dIFBSIzI0NDMKCiAgKikgTGV0IEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCBkZXRlcm1pbmUgc29tZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAoR3JvdXAsIFBvcnQsIFNlcnZlckFkbWluLCBTZXJ2ZXJOYW1lKSB2aWEgc29tZSBpbnRlbGxpZ2VudCB0ZXN0cyB0bwogICAgIHJlbW92ZSBzb21lIG9mIHRoZSBjbGFzc2ljYWwgaHVyZGxlcyBmb3IgbmV3IHVzZXJzIHdoZW4gc2V0dGluZyB1cAogICAgIEFwYWNoZS4gVGhpcyBpcyBkb25lIHBlciBkZWZhdWx0IGJlY2F1c2UgaXQgaXMgdXNlZnVsIGZvciB0aGUgYXZlcmFnZQogICAgIHVzZXIuIFBhY2thZ2UgYXV0aG9ycyBjYW4gdXNlIHRoZSAtLXdpdGhvdXQtY29uZmFkanVzdCBvcHRpb24gdG8gZGlzYWJsZQogICAgIHRoZXNlIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIGFuIEVYVFJBX0RFUFMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHVzZWQKICAgICB0byBhZGQgYW4gZXh0cmEgTWFrZWZpbGUgZGVwZW5kZW5jeSBmb3IgdGhlIGh0dHBkIHRhcmdldCwgZm9yIGluc3RhbmNlCiAgICAgdG8gZXh0ZXJuYWwgdGhpcmQtcGFydHkgbGlicmFyaWVzLCBldGMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCA8SWZEZWZpbmU+Li48L0lmRGVmaW5lPiBzZWN0aW9ucyB0byB0aGUgY29yZSBtb2R1bGUgKHdpdGggc2FtZSBzcGlyaXQKICAgICBhcyA8SWZNb2R1bGU+Li48L0lmTW9kdWxlPiBzZWN0aW9ucykgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2tpcCBvciBwcm9jZXNzCiAgICAgY29udGFpbmVkIGNvbW1hbmRzIGRlcGVuZGVuZCBvZiBgYC1EIFBBUkFNRVRFUicnIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQKICAgICBsaW5lLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgbG9naWNhbCBjb25kaXRpb25zIGxpa2UgPElmRGVmaW5lCiAgICAgUmV2ZXJzZVByb3h5PiBpbnN0ZWFkIG9mIHBoeXNpY2FsbHkgb25lcyAoZS5nLiA8SWZNb2R1bGUgbW9kX3Byb3h5LmM+KQogICAgIGFuZCB0aHVzIGVzcGVjaWFsbHkgY2FuIGJlIHVzZWQgZm9yIGNvbmRpdGlvbmFsbHkgbG9hZGluZyBEU08tYmFzZWQKICAgICBtb2R1bGVzIHZpYSBMb2FkTW9kdWxlLCBldGMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBjbGVhbiB1cCBhIHdhcm5pbmcgaW4gbW9kX3N0YXR1cyBmb3IgT1MvMi4gIFtCcmlhbiBIYXZhcmRdCgogICopIE1ha2UgdGFibGUgZWxlbWVudHMgY29uc3QuIFRoaXMgbWF5IHByZXZlbnQgb2JzY3VyZSBlcnJvcnMuIFtCZW4gTGF1cmllXQoKICAqKSBGaXggcGFyc2luZyBvZiBGVFAgYFNJWkUnIHJlc3BvbnNlcyBpbiBwcm94eSBtb2R1bGU6IFRoZSBuZXdsaW5lIHdhcyBub3QKICAgICB0cnVuY2F0ZWQgd2hpY2ggZm9yY2VkIGZvbGxvd2luZyBIVFRQIGhlYWRlcnMgdG8gYmUgZGF0YSBpbiB0aGUgSFRUUAogICAgIHJlcG9uc2UuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBDaGFybGVzIEZ1IDxjY3dmIGJhY2NodXMuY29tPl0gCiAgICAgUFIjMjQxMiwgMjM2NwoKICAqKSBQb3J0YWJpbGl0eSBmaXggZm9yIEFQQUNJIHNoYWRvdyB0cmVlIHN1cHBvcnQ6IFN3YXAgb3JkZXIgb2YgYXdrIGFuZCBzZWQKICAgICBpbiB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBhdm9pZCBzZWQgZmFpbHMgb24gc29tZSBwbGF0Zm9ybXMgKGZvcgogICAgIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUgbm9uLW5ld2xpbmUtdGVybWluZWQKICAgICBvdXRwdXQgb2YgQXdrLiBbQmlsbCBIb3VsZSA8YmhvdWxlIHNhbmRpZWdvY2EubmNyLmNvbT5dIFBSIzI0MzUKCiAgKikgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBkaXJlY3RvcnkgbGlzdGluZ3MgKG1vZF9hdXRvaW5kZXgpIGJ5IGNvbXBhcmluZwogICAgIGludGVnZXIga2V5cyAobGFzdC1tb2RpZmllZCBhbmQgc2l6ZSkgYXMgaW50ZWdlcnMgcmF0aGVyIHRoYW4gY29udmVydGluZwogICAgIHRoZW0gdG8gc3RyaW5ncyBmaXJzdC4gIEFsc28gdXNlIGEgc2V0IG9mIGV4cGxpY2l0IGJ5dGUgdGVzdHMgcmF0aGVyCiAgICAgdGhhbiBzdHJjbXAoKSB0byBjaGVjayBmb3IgcGFyZW50IGRpcmVjdG9yeS1uZXNzIG9mIGFuIGVudHJ5LiAgT2gsIGFuZAogICAgIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGRpcmVjdG9yeSAoaWYgZGlzcGxheWVkKSBpcyAqYWx3YXlzKiBsaXN0ZWQgZmlyc3QKICAgICByZWdhcmRsZXNzIG9mIHRoZSBzb3J0IGtleS4gIE92ZXJhbGwgcGVyZm9ybWFuY2Ugd2lubmFnZSBzaG91bGQgYmUgZ29vZAogICAgIGluIENQVSB0aW1lLCBpbnN0cnVjdGlvbiBjYWNoZSwgYW5kIG1lbW9yeSB1c2FnZSwgcGFydGljdWxhcmx5IGZvciBsYXJnZQogICAgIGRpcmVjdG9yaWVzLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSB0aW55IGJ1dCB1c2VmdWwgZ29vZHkgdG8gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0OiBUaGUgZ2VuZXJhdGlvbgogICAgIG9mIGEgY29uZmlnLnN0YXR1cyBzY3JpcHQgKGFzIEdOVSBBdXRvY29uZiBkb2VzKSB3aGljaCByZW1lbWJlcnMgdGhlIHVzZWQKICAgICBjb25maWd1cmUgY29tbWFuZCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uZmlndXJhdGlvbiBieQogICAgIGp1c3QgcmUtcnVubmluZyB0aGlzIHNjcmlwdCBvciBmb3IgcmVtZW1iZXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gYmV0d2VlbgogICAgIHJlbGVhc2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgaHR0cGQgLXQgKHRlc3QpIG9wdGlvbiBmb3IgcnVubmluZyBjb25maWd1cmF0aW9uIHN5bnRheCB0ZXN0cyBvbmx5LgogICAgIElmIHNvbWV0aGluZyBpcyBicm9rZW4gaXQgY29tcGxhaW5zIGFuZCBleGl0cyB3aXRoIGEgcmV0dXJuIGNvZGUKICAgICBub24tZXF1YWwgdG8gMC4gVGhpcyBjYW4gYmUgdXNlZCBtYW51YWxseSBieSB0aGUgdXNlciB0byBjaGVjayB0aGUgQXBhY2hlCiAgICAgY29uZmlndXJhdGlvbiBhZnRlciBlZGl0aW5nIGFuZCBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgdXNlZCBieSBhcGFjaGVjdGwKICAgICBvbiAoZ3JhY2VmdWwpIHJlc3RhcnQgY29tbWFuZCB0byBtYWtlIHN1cmUgQXBhY2hlIGRvZXNuJ3QgZGllIG9uIHJlc3RhcnRzCiAgICAgYmVjYXVzZSBvZiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgbm93IGJyb2tlbiBzaW5jZSB0aGUgbGFzdCAocmUpc3RhcnQuCiAgICAgVGhpcyB3YXkgYGFwYWNoZWN0bCByZXN0YXJ0JyBjYW4gYmUgdXNlZCBpbnNpZGUgY3JvbmpvYnMgd2l0aG91dCBoYXZpbmcKICAgICB0byBleHBlY3QgQXBhY2hlIHRvIGJlIGZhbGxpbmcgZG93bi4gQWRkaXRpb25hbGx5IHRoZSBodHRwZCAtdCBjYW4gYmUgcnVuCiAgICAgdmlhIGBhcGFjaGVjdGwgY29uZmlndGVzdCcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzOTMKICAKICAqKSBNaW5vciBkaXNwbGF5IGZpeCBmb3IgImluc3RhbGwiIHRhcmdldCBvZiB0b3AtbGV2ZWwgTWFrZWZpbGU6CiAgICAgdGhlIGRpc3BsYXllZCBpbnN0YWxsYXRpb24gY29tbWFuZCB3YXMgaW5jb3JyZWN0IGFsdGhvdWdoIHRoZQogICAgIGV4ZWN1dGVkIGNvbW1hbmQgd2FzIGNvcnJlY3QuIE5vdyB0aGV5IGFyZSBpbiBzeW5jLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNDAyCgogICopIENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGUgYGFsbG93ZWRfZ2xvYmFscycgaW4gaHR0cF9tYWluLmMKICAgICBbSnVzdGluIEJyYWRmb3JkIDxqdXN0aW4gdWthbnMuZWR1Pl0gUFIjMjQwMAoKICAqKSBBcGFjaGUgd291bGQgaW5jb3JyZWN0bHkgZG93bmNhc2UgdGhlIGVudGlyZSBDb250ZW50LVR5cGUgcGFzc2VkIGZyb20KICAgICBDR0lzLiAgVGhpcyBhZmZlY3RlZCBzZXJ2ZXItcHVzaCBzY3JpcHRzIGFuZCBzdWNoIHdoaWNoIHVzZQogICAgIG11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7Ym91bmRhcnk9VGhpc1JhbmRvbVN0cmluZy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzIzOTQKCiAgKikgUE9SVDogUU5YIHVwZGF0ZSB0byBwcm9wZXJseSBndWVzcyAzMi1iaXQgc3lzdGVtcy4KICAgICBbU2VhbiBCb3VkcmVhdSA8c2VhbmIgcW54LmNvbT5dIFBSIzIzOTAKCiAgKikgTWFrZSBzdXJlIHRoZSBEU08gZW11bGF0aW9uIGNvZGUgZm9yIEhQVVggZmluZHMgdGhlIHByb3ByaWV0YXJ5IHNobF94eHgoKQogICAgIGZ1bmN0aW9ucyB3aGljaCBhcmUgaW4gbGliZGxkIHVuZGVyIEhQVVggOS8xMC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjM3OAoKICAqKSBNYWtlIHN1cmUgdGhlICJpbnN0YWxsIiB0YXJnZXQgb2YgdGhlIHRvcC1sZXZlbCBNYWtlZmlsZSBkb2Vzbid0IGJyZWFrCiAgICAgYmVjYXVzZSBvZiBhIHJldHVybiBjb2RlIG9mIDEgZnJvbSBhbiAiaWYiIChmb3IgaW5zdGFuY2UgdW5kZXIgYnJhaW5kZWFkCiAgICAgVWx0cml4IHRoZSByZXN1bHQgY29kZSBvZiBhbiAiaWYiIGNvbnN0cnVjdCBpcyAxIGlmIHRoZSAidGhlbiIgY2xhdXNlCiAgICAgZGlkbid0IG1hdGNoKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBhbiBhZGRpdGlvbmFsICJkdW1teSIgdGFyZ2V0IHRvIHRoZSAiJChMSUIpIiB0YXJnZXQgaW4gZ2VuZXJhdGVkCiAgICAgbW9kdWxlcy94eHgvTWFrZWZpbGUncyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIFNWUjQgTWFrZSB1bmRlciAiZnVsbC1EU08iCiAgICAgc2l0dWF0aW9uIChubyBsaWJ4eHguYSBidWlsdCwgb25seSBtb2RfeHh4LnNvJ3MpIHdoZXJlIExJQiBhbmQgT0JKUyBhcmUKICAgICBlbXB0eS4gW1JhbGYgUy4gRW5nZWxzY2hhbGwsIERlYW4gR2F1ZGV0LCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVwbGFjZSB0d28gYmFkIHNwcmludGYoKSBjYWxscyB3aXRoIGFwX3NucHJpbnRmKCkgdmFyaWFudHMgaW4KICAgICBtb2RfcmV3cml0ZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBtaXNzaW5nIHVzYWdlIGRlc2NyaXB0aW9uIGZvciBNZXRhRmlsZXMgZGlyZWN0aXZlLgogICAgIFtEYXZpZCBNYWNLZW56aWUgPGRqbSB2YS5wdWJuaXguY29tPl0gUFIjMjM4NAoKICAqKSBtb2RfbG9nX2NvbmZpZyB3b3VsZG4ndCBsZXQgdmhvc3RzIHVzZSBsb2cgZm9ybWF0cyBkZWZpbmVkIGluIHRoZQogICAgIG1haW4gc2VydmVyLiAgW0NocmlzdG9mIERhbWlhbiA8ZGFtaWFuIG1lZGlhY29uc3VsdC5jb20+XSBQUiMyMDkwCgogICopIG1vZF91c2VydHJhY2sgd2FzIGNvcnJ1cHRpbmcgdGhlIGNsaWVudCBob3N0bmFtZS4gIEFzIHBhcnQgb2YgdGhlCiAgICAgZml4LCB0aGUgY29va2llIHZhbHVlcyB3ZXJlIHNsaWdodGx5IGV4dGVuZGVkIHRvIGluY2x1ZGUgdGhlCiAgICAgZnVsbHkgcXVhbGlmaWVkIGhvc3RuYW1lIG9mIHRoZSBjbGllbnQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMyMTkwLCAyMjI5LCAyMzY2CgogICopIEZpeCBhIHR5cG8gaW4gcG9vbCBkZWJ1Z2dpbmcgY29kZS4gIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgbW9kX3VuaXF1ZV9pZCBkaWQgbm90IHdvcmsgb24gYWxwaGEgbGludXggKGluIGdlbmVyYWwgb24gYW55CiAgICAgYXJjaGl0ZWN0dXJlIHRoYXQgaGFzIDY0LWJpdCB0aW1lX3QpLgogICAgIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgUE9SVDogTWFrZSBTQ08gNSAoYW5kIHByb2JhYmx5IDMpIGNvbXBpbGUgYWdhaW4uIFtCZW4gTGF1cmllXQoKICAqKSBQT1JUOiBOQ1IgTVBSQVMgc3lzdGVtcyBoYXZlIHRoZSBzYW1lIGJ1ZyB3aXRoIFNJR0hVUCByZXN0YXJ0IHRoYXQKICAgICBTb2xhcmlzIHN5c3RlbXMgZXhwZXJpZW5jZS4gIFNvIGRlZmluZSBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHLgogICAgIFtLbGF1cyBXZWJlciA8a3dlYmVyIGNoZXBocmVuLmdlcm1hbnkubmNyLmNvbT5dIFBSIzE5NzMKCiAgKikgQ2hhbmdlICJPcHRpb25zIE5vbmUiIHRvICJPcHRpb25zIEZvbGxvd1N5bUxpbmtzIiBpbiB0aGUgCiAgICAgPERpcmVjdG9yeSAvPiBzZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGFjY2Vzcy5jb25mLWRpc3QKICAgICAoYW5kIC13aW4gZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXR0ZXIgdGhlcmUpLiAgVGhpcyBoYXMgYmV0dGVyCiAgICAgcGVyZm9ybWFuY2UsIGFuZCBtb3JlIGludHVpdGl2ZSBzZW1hbnRpY3MuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFVwZGF0ZWQgc3VwcG9ydCBmb3IgVVRTIDIuMS4yLgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjMjMyMAoKICAqKSBGaXggc3ltYm9sIGV4cG9ydCBsaXN0IChzcmMvc3VwcG9ydC9odHRwZC5leHApIGFmdGVyIHJlY2VudAogICAgIEFQSSBjaGFuZ2VzIGluIHRoZSBjaGlsZCBzcGF3bmluZyBhcmVhLgogICAgIFtKZW5zLVV3ZSBNYWdlciA8anVtIGhlbGlvcy5kZT5dCgogICopIFdvcmthcm91bmQgZm9yIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG9sZCBgdGVzdCcgY29tbWFuZHMgd2hpY2ggZG8gbm90CiAgICAgc3VwcG9ydCB0aGUgLXggZmxhZyAoZm9yIGluc3RhbmNlIHVuZGVyIHBsYXRmb3JtcyBsaWtlIFVsdHJpeCkuIFRoaXMgaXMKICAgICBzb2x2ZWQgYnkgYW5vdGhlciBoZWxwZXIgc2NyaXB0IGZpbmRwcmcuc2ggd2hpY2ggc2VhcmNoZXMgZm9yIFBlcmwgYW5kCiAgICAgQXdrIGxpa2UgUHJpbnRQYXRoIGJ1dCBfdmlhIGRpZmZlcmVudCBuYW1lc18uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZSB0aGUgc3lzdGVtKCkgY2FsbCBmcm9tIGh0cGFzc3dkLmMsIHdoaWNoIGVsaW1pbmF0ZXMgYSBzeXN0ZW0KICAgICBkZXBlbmRhbmN5LiAgWyJNLkQuUGFya2VyIiA8bWRwYyBuZXRjb20uY29tPl0gUFIjMjMzMgoKICAqKSBQT1JUOiBGaXggY29tcGlsYXRpb24gZmFpbHVyZXMgb24gTkVYVFNURVAuCiAgICAgW1JleCBEaWV0ZXIgPHJkaWV0ZXIgbWF0aC51bmwuZWR1Pl0gUFIjMjI5MywgMjMxNgoKICAqKSBQT1JUOiBGX05ERUxBWSBpcyBhIHR5cG8sIHNob3VsZCBoYXZlIGJlZW4gRk5ERUxBWS4gIFRoZXJlJ3MgYWxzbwogICAgIE9fTkRFTEFZIG9uIHZhcmlvdXMgc3lzdGVtcy4gIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjMjMxMwoKICAqKSBQT1JUOiBoZWxwZXJzL0d1ZXNzT1MgdXBkYXRlcyBmb3IgdmFyaW91cyB2ZXJzaW9ucyBmb3IgTkNSIFNWUjQuCiAgICAgW2p1ZXJnIHNjaHJlaW5lciA8ai5zY2hyZWluZXIgemguY2g+LAogICAgIEJpbGwgSG91bGUgPEJpbGwuSG91bGUgU2FuRGllZ29DQS5OQ1IuQ09NPl0gUFIjMjMxMAoKICAqKSBGaXggcmVjZW50bHkgaW50cm9kdWNlZCBXaW4zMiBjaGlsZCBzcGF3bmluZyBjb2RlIGluIG1vZF9yZXdyaXRlLmMgd2hpY2gKICAgICB3YXMgYnJva2VuIGJlY2F1c2Ugb2YgaW52YWxpZCBhcF9wc3RyY2F0KCkgLT4gc3RyY2F0KCkgdHJhbnNmb3JtYXRpb24uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFByb3h5IENhY2hlIEZpeGVzOiBhY2NvdW50IGZvciBkaXJlY3Rvcnkgc2l6ZXMsIGZvcmsgb2ZmIGdhcmJhZ2UgY29sbGVjdGlvbgogICAgIHRvIGNvbnRpbnVlIGluIGJhY2tncm91bmQsIHVzZSBwcmVkZWZpbmVkIHR5cGVzIChvZmZfdCwgc2l6ZV90LCB0aW1lX3QpLAogICAgIGxvZyB0aGUgY3VycmVudCBjYWNoZSB1c2FnZSBwZXJjZW50YWdlIGF0IExvZ0xldmVsIGRlYnVnCiAgICAgW01hcnRpbiBLcmFlbWVyLCBiYXNlZCBvbiBkaXNjdXNzaW9uIGJldHdlZW4gRGVhbiBHYXVkZXQgJiBEaXJrIHZhbkd1bGlrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuMAoKICAqKSBVc2luZyBhIHR5cGUgbWFwIGZpbGUgYXMgYSBjdXN0b20gZXJyb3IgZG9jdW1lbnQgd2FzIG5vdCBwb3NzaWJsZS4KICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiMxMDMxCgogICopIEF2b2lkIHByb2JsZW1zIHdpdGggYnJhaW5kZWFkIEF3a3MgYnkgYWRkaXRpb25hbGx5IHNlYXJjaGluZyBmb3IgZ2F3ayAKICAgICBhbmQgbmF3ayBpbiBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQuCiAgICAgW0RhdmUgRHlrc3RyYSA8ZHdkIGJlbGwtbGFicy5jb20+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzE5CgogICopIFJlbmFtZSBtZDUuaCB0byBhcF9tZDUuaCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBuYXRpdmUgTUQ1IG9uCiAgICAgc29tZSBzeXN0ZW1zLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQ2hhbmdlIHVzYWdlIG9mIHBlcnJvcigpK2ZwcmludGYoc3RkZXJyLC4uLikgaW4gbW9kX3Jld3JpdGUgdG8KICAgICBtb3JlIHByb3BlciBhcF9sb2dfZXJyb3IoKSB2YXJpYW50cy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBmb3IgdGhlIC0tYWRkLW1vZHVsZSBvcHRpb24gdG8gQVBBQ0kncyBjb25maWd1cmUKICAgICBzY3JpcHQgaXMgb2YgdHlwZSBbcGF0aC90by9dbW9kX3h4eC5jIGJlY2F1c2UgYWxsIGNhbGN1bGF0aW9ucyBpbnNpZGUKICAgICBjb25maWd1cmUgYW5kIHNyYy9Db25maWd1cmUgZGVwZW5kIG9uIHRoaXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzMDcKCiAgKikgQ2hhbmdlcyB1c2FnZSBvZiBwZXJyb3IvZnByaW50ZiB0byBzdGRlcnIgdG8gbW9yZSBwcm9wZXIgYXBfbG9nX2Vycm9yCiAgICAgaW4gbW9kX21pbWUsIG1vZF9sb2dfcmVmZXJlciwgbW9kX2xvZ19hZ2VudCwgYW5kIG1vZF9sb2dfY29uZmlnLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBWYXJpb3VzIE9TLzIgY2xlYW51cHMgWyJCcmlhbiBIYXZhcmQiIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBQT1JUOiBRTlggbmVlZGVkIGEgI2luY2x1ZGUgPHN5cy9tbWFuLmg+OyBhbmQgbm93IGl0IHVzZXMgZmxvY2sKICAgICBzZXJpYWxpemVkIGFjY2VwdCB0byBoYW5kbGUgbXVsdGlwbGUgc29ja2V0cy4KICAgICBbUm9iIFNhY2NvY2NpbyA8cm9icyBJbmZpbml0ZVRlY2hub2xvZ3kuY29tPl0gUFIjMjI5NSwgMjI5NgogCiAgKikgSGF2ZSBOVCBwcm9wZXJseSBzZXQgdGhlIGRpcmVjdG9yeSBmb3IgQ0dJIHNjcmlwdHMgCiAgICAgKCYgb3RoZXIgc3Bhd25lZCBjaGlsZHJlbikKICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYSB1cy5pYm0uY29tPl0KCiAgKikgUHJvcGFnYXRlIGVudmlyb25tZW50IHRvIENHSSBzY3JpcHRzIGNvcnJlY3RseSBpbiBXaW4zMi4KICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYSB1cy5pYm0uY29tPl0gUFIjMjI5NAoKICAqKSBTb21lIHN5bWJvbCByZW5hbWluZzoKICAgICBhcF9zcGF3bl9jaGlsZF9lcnIgYmVjYW1lIGFwX3NwYXduX2NoaWxkCiAgICAgYXBfc3Bhd25fY2hpbGRfZXJyX2J1ZmYgYmVjYW1lIGFwX2JzcGF3bl9jaGlsZAogICAgIHNwYXduX2NoaWxkIHdhcyBvYnNvbGV0ZWQgYW5kIG1vdmVkIHRvIGNvbXBhdC5oCiAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIFVwZ3JhZGUgdGhlIGNoaWxkIHNwYXduaW5nIGNvZGUgaW4gbW9kX3Jld3JpdGUgZm9yIHRoZSBSZXdyaXRlTWFwCiAgICAgcHJvZ3JhbXM6IGFwX3NwYXduX2NoaWxkX2VycigpIGlzIHVzZWQgYW5kIHRoZSBXaW4zMiBjYXNlIG5vdyB1c2VzCiAgICAgQ3JlYXRlUHJvY2VzcygpIGluc3RlYWQgb2YgYSBsb3ctbGV2ZWwgZXhlY2woKSAod2hpY2ggY2F1c2VkIHByb2JsZW1zIGluCiAgICAgdGhlIHBhc3QgdW5kZXIgV2luMzIpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIGZldyBjb3NtZXRpY3MgYW5kIHRyaXZpYWwgZW5oYW5jZW1lbnRzIHRvIEFQWFMgdG8gbWFrZSB0aGUKICAgICBnZW5lcmF0ZWQgTWFrZWZpbGUgbW9yZSB1c2VyIGZyaWVuZGx5LiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUHJveHkgRml4OiBUaGUgcHJveHkgc3BlY2lhbCBmYWlsdXJlIHJvdXRpbmUgYXBfcHJveHllcnJvcigpCiAgICAgd2FzIHVwZGF0ZWQgdG8gdXNlIHRoZSBub3JtYWwgYXBhY2hlIGVycm9yIHByb2Nlc3NpbmcsIHRoZXJlYnkgYWxsb3dpbmcKICAgICBwcm94eSBlcnJvcnMgdG8gYmUgdHJlYXRlZCBieSBFcnJvckRvY3VtZW50J3MgYXMgd2VsbC4gRm9yIHRoaXMKICAgICBwdXJwb3NlLCBhIG5ldyBtb2R1bGUtdG8tY29yZSBjb21tdW5pY2F0aW9uIHZhcmlhYmxlICJlcnJvci1ub3RlcyIKICAgICB3YXMgaW50cm9kdWNlZDsgdGhlIHByb3h5IChhbmQgcG9zc2libHkgb3RoZXIgbW9kdWxlcykgY29tbXVuaWNhdGVzCiAgICAgaXRzIGVycm9yIHRleHQgdXNpbmcgdGhpcyB2YXJpYWJsZS4gSXRzIGNvbnRlbnQgaXMgY29waWVkIHRvIGEgbmV3CiAgICAgY2dpLWVudi12YXIgUkVESVJFQ1RfRVJST1JfTk9URVMgZm9yIHVzZSBieSBFcnJvckRvY3VtZW50cy4KICAgICBUaGUgb2xkIHByb3h5IHNwZWNpYWwgZXJyb3Igcm91dGluZSBhcF9wcm94eV9sb2dfdWVycm9yKCkKICAgICB3YXMgcmVwbGFjZWQgYnkgcmVndWxhciBhcF9sb2dfZXJyb3IoKSBjYWxscywgbWFueSBtZXNzYWdlcyB3ZXJlIG1hZGUKICAgICBtb3JlIGluZm9ybWF0aXZlLiAKICAgICBbTWFydGluIEtyYWVtZXJdIFBSIzQ5NCwgMTI1OQoKICAqKSBTRUNVUklUWTogQSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIGZ0cCBwcm94eSB3YXMgZml4ZWQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBUcmFuc2Zvcm0gdGhlIGNvbmZpZ3VyZSBtZXNzYWdlICJZb3UgbmVlZCByb290IHByaXZpbGVnZXMgZm9yIHN1RVhFQyIKICAgICBmcm9tIGEgZmF0YWwgZXJyb3IgaW50byBhIChtb3JlIGZyaWVuZGx5KSB3YXJuaW5nIGJlY2F1c2UgdGhlIGJ1aWxkaW5nCiAgICAgKCJtYWtlIikgb2YgQXBhY2hlIHdlIGNhbiBhbGxvdywgb2YgY291cnNlLiBSb290IHByaXZpbGVnZXMgYXJlIG5lZWRlZAogICAgIG9ubHkgZm9yIHRoZSBpbnN0YWxsYXRpb24gc3RlcCAoIm1ha2UgaW5zdGFsbCIpLiBTbyBtYWtlIHN1cmUgdGhlCiAgICAgdXNlciBpcyBhd2FyZSBvZiB0aGlzIGZhY3QgYnV0IGxldCBoaW0gcHJvY2VlZCBhcyBsb25nIGFzIGhlIGNhbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjI4OAogIAogICopIFJlbmFtZWQgdGhyZWUgbW9yZSBmdW5jdGlvbnMgdG8gY29tbW9uIGFwXyBwcmVmaXggd2hpY2ggd2UgbWlzc2VkIGF0IHRoZQogICAgIEJpZyBTeW1ib2wgUmVuYW1pbmcgYmVjYXVzZSB0aGV5J3JlICNkZWZpbmVzIGFuZCBub3QgcmVhbCBDIGZ1bmN0aW9uczoKICAgICBpc19kZWZhdWx0X3BvcnQoKSwgZGVmYXVsdF9wb3J0KCksIGh0dHBfbWV0aG9kKCkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEEgemVyby1sZW5ndGggbmFtZSBhZnRlciBhICQgaW4gYW4gU1NJIGRvY3VtZW50IHNob3VsZCBjYXVzZQogICAgIGp1c3QgdGhlICQgdG8gYmUgaW4gdGhlIGV4cGFuc2lvbi4gIFRoaXMgd2FzIGJyb2tlbiBkdXJpbmcgdGhlCiAgICAgc2VjdXJpdHkgZml4ZXMgaW4gMS4yLjUuICBbRGVhbiBHYXVkZXRdIFBSIzE5MjEsIDIyNDkKCiAgKikgQ2FsbCBhcF9kZXN0cm95X3N1Yl9yZXEoKSBpbiBhcF9hZGRfY2dpX3ZhcnMoKSB0byByZWNsYWltIHNvbWUKICAgICBtZW1vcnkuICBbUm9iIFNhY2NvY2NpbyA8cm9icyBJbmZpbml0ZVRlY2hub2xvZ3kuY29tPl0gUFIjMjI1MgoKICAqKSBGaXggc3JjL3N1cHBvcnQvaHR0cGQuZXhwIChEU08gZXhwb3J0IGZpbGUgd2hpY2ggaXMgY3VycmVudGx5IG9ubHkKICAgICB1c2VkIHVuZGVyIEFJWCkgYmVjYXVzZSBvZiByZWNlbnQgY2hhbmdlcyB0byBmdW5jdGlvbiBuYW1lcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjcKCiAgKikgTWFrZSBzdXJlIGEgTUlNRS10eXBlIGNhbiBiZSBmb3JjZWQgdmlhIGEgUmV3cml0ZVJ1bGUgZXZlbiB3aGVuIG5vCiAgICAgc3Vic3RpdHV0aW9uIHRha2VzIHBsYWNlLCBmb3IgaW5zdGFuY2UgdmlhIHRoZSBmb2xsb3dpbmcgcnVsZToKICAgICBgYFJld3JpdGVSdWxlIF5teXNjcmlwdCQgLSBbVD1hcHBsaWNhdGlvbi94LWh0dHBkLWNnaV0nJyBUaGlzIHdhcyBvZnRlbgogICAgIHJlcXVlc3RlZCBieSB1c2VycyBpbiB0aGUgcGFzdCB0byBmb3JjZSBhIHNpbmdsZSBzY3JpcHQgd2l0aG91dCBhIC5jZ2kKICAgICBleHRlbnNpb24gYW5kIG91dHNpZGUgYW55IGNnaS1iaW4gZGlycyB0byBiZSBleGVjdXRlZCBhcyBhIENHSSBwcm9ncmFtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMjU0CgogICopIEEgZml4IGZvciBwcm90b2NvbCBpc3N1ZXMgc3Vycm91bmRpbmcgNDAwLCA0MDgsIGFuZAogICAgIDQxNCByZXNwb25zZXMuIFtFZCBLb3J0aG9mXQoKICAqKSBJZ25vcmUgTWF4UmVxdWVzdHNQZXJDaGlsZCBvbiBXSU4zMi4gW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIEZpeCBkaXNjcmVwYW5jeSBpbiBwcm94eV9mdHAuYyB3aGljaCB3YXMgY2F1c2luZyBmYWlsdXJlcyB3aGVuIAogICAgIHRyeWluZyB0byBjb25uZWN0IHRvIGNlcnRhaW4gZnRwZCdzLCBzdWNoIGFzIGFub25mdHBkLiAgCiAgICAgW1JpY2sgT2huZW11cyA8cmljayBlY29tcGNvbi5jb20+XQoKICAqKSBNYWtlIG1vZF9yZXdyaXRlIHVzZSBhcF9vcGVuX3BpcGVkX2xvZygpIGZvciBSZXdyaXRlTG9nIGRpcmVjdGl2ZSdzCiAgICAgbG9nZmlsZSBpbnN0ZWFkIG9mIGZpZGRsaW5nIGFyb3VuZCBpdHNlbGYgd2l0aCBjaGlsZCBzcGF3bmluZyBzdHVmZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFkZSBSZWZlcmVySWdub3JlIGNhc2UtaW5zZW5zaXRpdmUuCgogICopIE1vZF9sb2dfYWdlbnQsIG1vZF9sb2dfcmVmZXJlciBub3cgdXNlIGFwX29wZW5fcGlwZWRfbG9nIGZvciBwaXBlZCBsb2dzLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBSZXBsYWNlIHVzZSBvZiBzcGF3bl9jaGlsZCB3aXRoIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmLCB0byBtYWtlIGV2ZXJ5dGhpbmcKICAgICAic2FmZSIgdW5kZXIgV2luMzIuICBJbjogbW9kX2luY2x1ZGUuYywgbW9kX21pbWVfbWFnaWMuYwogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBJbXByb3ZlIFJGQzE0MTMgc3VwcG9ydC4gW0JvYiBCZWNrIDxiZWNrIGJvZmgudWNzLnVhbGJlcnRhLmNhPl0KCiAgKikgRml4IHN1cHBvcnQgc2NyaXB0IGBkYm1tYW5hZ2UnOiBJdCB3YXMgdW5hYmxlIHRvIGhhbmRsZSBzb21lIHNvcnQKICAgICBvZiBwYXNzd29yZHMsIGVzcGVjaWFsbHkgcGFzc3dvcmRzIHdpdGggIjAiIGNoYXJzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMjQyCgogICopIFdJTjMyOiBDbGlja2luZyBvbiAiTGFzdCBNb2RpZmllZCIgaW4gYSBmYW5jeSBpbmRleCBjYXVzZWQgYSBjcmFzaC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdIFBSIzIyMzgKCiAgKikgV0lOMzI6IENHSXMgY291bGQgY2F1c2UgYSBoYW5nIChiZWNhdXNlIG9mIGEgZGVhZGxvY2sgaW4gdGhlIHN0YW5kYXJkIEMKICAgICBsaWJyYXJ5KSwgc28gQ0dJIGhhbmRsaW5nIGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIFdpbjMyIG5hdGl2ZSBoYW5kbGVzCiAgICAgaW5zdGVhZCBvZiBDIGZpbGUgZGVzY3JpcHRvcnMuCiAgICAgW0JlbiBMYXVyaWUgYW5kIEJpbGwgU3RvZGRhcmQgPHdnc3RvZGRhIHVzLmlibS5jb20+XSBQUiMxMTI5LCAxNjA3CgogICopIFRoZSBwcm94eSBjYWNoZSB3b3VsZCBzdG9yZSBhbiBpbmNvcnJlY3QgY29udGVudC1sZW5ndGggaW4gdGhlIGNhY2hlZAogICAgIGZpbGUgY29weSBhZnRlciBhIGNhY2hlIHVwZGF0ZS4gVGhhdCByZXN1bHRlZCBpbiByZXBlYXRlZCBmZXRjaGluZwogICAgIG9mIHRoZSBvcmlnaW5hbCBjb3B5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGNhY2hlZCBjb3B5LgogICAgIFtFcm5zdCBLbG9wcGVuYnVyZyA8a2xvcHBlbiBpc3IudW5pLXN0dXR0Z2FydC5kZT5dIFBSIzIwOTQKCiAgKikgVGhlIE1ha2VmaWxlcyBhc3N1bWVkIHRoYXQgRFNPIGZpbGVzIGFyZSBidWlsZCB2aWEgJChMRCkuIFRoaXMKICAgICBpcyBicm9rZW4gZm9yIHR3byByZWFzb25zOiBGaXJzdCB3ZSBuZXZlciBkZWZpbmVkIGF0IGxlYXN0IExEPWxkCiAgICAgc29tZXdoZXJlIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIChpdCB3YXMgc2lsZW50bHkgYXNzdW1lZCB0aGF0IG1vc3QgTWFrZQogICAgIHByb3ZpZGUgYSBidWlsdC1pbiBMRCBkZWZpbml0aW9uIC0gQVJHTCEpIGFuZCBzZWNvbmQgdXNpbmcgdGhlIGdlbmVyaWMgTEQKICAgICB2YXJpYWJsZSBpcyBub3QgdGhlIHRydXRoLiBJbnN0ZWFkIGEgc3BlY2lhbCB2YXJpYWJsZSBuYW1lZCBMRF9TSExJQiBpcwogICAgIHJlYXNvbmFibGUgYmVjYXVzZSBhbHRob3VnaCAibGQiIGlzIHVzdWFsbHkgdGhlIGRlZmF1bHQsIHRoZSBjb21tYW5kIGZvcgogICAgIGJ1aWxkaW5nIERTTyBmaWxlcyBjYW4gYmUgImxpYnRvb2wiIG9yIGV2ZW4gImNjIiBvbiBzb21lIHN5c3RlbXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlcGxhY2UgdGhlIEFkZFZlcnNpb25QbGF0Zm9ybSBkaXJlY3RpdmUgd2l0aCBTZXJ2ZXJUb2tlbnMgd2hpY2gKICAgICBwcm92aWRlcyBmb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIGZvcm1hdCBvZiB0aGUgU2VydmVyOgogICAgIGhlYWRlciBsaW5lLiBTRVJWRVJfU1VCVkVSU0lPTiBpcyBubyBsb25nZXIgc3VwcG9ydGVkOwogICAgIGFsbCBtb2R1bGUgc2hvdWxkIHVzZSB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkKICAgICBBUEkgZnVuY3Rpb24gaW5zdGVhZC4gW0ppbSBKYWdpZWxza2ldCgogICopIFN1cHBvcnQgZm9yIHRoZSBOQ1IgTVAvUkFTIDMuMAogICAgIFtKb2huIFdpdGhlcnMgPHdpdGhlcnMgc2VtaS5rY3NjLm13ci5pcnMuZ292Pl0KCiAgKikgVGhlIExERkxBR1NfU0hMSUJfRVhQT1JUIHZhcmlhYmxlIG9mIHNyYy9Db25maWd1cmF0aW9uWy50bXBsXSB3YXMKICAgICBub3QgcmV0cmlldmVkIGluIHNyYy9Db25maWd1cmUgYW5kIHRodXMgd2FzIG5vdCB1c2VhYmxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogCiAgKikgVmFyaW91cyBNYWtlZmlsZSBjb25zaXN0ZW5jeSBjbGVhbnVwczoKICAgICAtIG1ha2UgT1NESVIgYWxzbyBhdXRvbWF0aWNhbGx5IGJlIHJlbGF0aXZlIHRvIHNyYy8gbGlrZSBJTkNESVIKICAgICAtIFNVQkRJUlMgaXMgbm93IGdlbmVyYXRlZCBpbiBzcmMvTWFrZWZpbGUgb25seSBhbmQgbm90IGluCiAgICAgICBNYWtlZmlsZS5jb25maWcgYmVjYXVzZSBpdCBpcyBhIGxvY2FsIGRlZmluZSBmb3IgdGhpcyBsb2NhdGlvbi4KICAgICAtIHJlbW92ZSBCUk9LRU5fQlBSSU5URl9GTEFHUyBiZWNhdXNlIGlzIGl0IG5vIGxvbmdlciB1c2VkIGluc2lkZQogICAgICAgYW55IE1ha2VmaWxlIGJ1dCBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCB0aGUgIi1LIGlubGluZSIgaXMga2VwdCBpbgogICAgICAgQ0ZMQUdTIGZvciBTQ08gNS4KICAgICAtIHVwZGF0ZSB0aGUgImRlcGVuZCIgdGFyZ2V0cyBpbiBNYWtlZmlsZS50bXBsIGZpbGVzIHRvIHVzZSAkKE9TRElSKSwgdG9vLgogICAgIC0gdXBkYXRlZCB0aGUgZGVwZW5kZW5jaWVzIHRoZWlyc2VsZgogICAgIC0gcmVtb3ZlZCBub3QgZXhpc3RpbmcgU0hMSUIgdmFyaWFibGUgZnJvbSAiY2xlYW4iIHRhcmdldHMKICAgICAtIHJlcGxhY2VkIFNITElCX09CSlMvU0hMSUJTX09CSiBjb25zaXN0ZW50bHkgd2l0aCBPQkpTX1BJQyBiZWNhdXNlIE9CSlMKICAgICAgIGFscmVhZHkgZXhpc3RzIGFuZCBPQkpTX1BJQyBhcmUgYWxzbyBqdXN0IHBsYWluIG9iamVjdHMgYW5kIGhhdmUgbm90CiAgICAgICBkaXJlY3RseSB0byBkbyB3aXRoICJzaGFyZWQiIHRoaW5ncy4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXkKICAgICAgIGNvbnRhaW4gUElDLiBTbyBPQkpTX1BJQyBpcyB0aGUgbW9yZSBjYW5vbmljYWwgbmFtZS4KICAgICAtIFVwZGF0ZWQgdGhlIE1ha2VmaWxlLWRlcGVuZGVuY3kgbGluZXMgZm9yIE9CSlNfUElDCiAgICAgLSBSZW1vdmVkIHRoZSBNYWtlZmlsZS1kZXBlbmRlbmN5IGxpbmUgaW4gQ29uZmlndXJlIHRvIGF2b2lkIGRvdWJsZQogICAgICAgZGVmaW5pdGlvbnMKICAgICAtIHJlcGxhY2VkIHVnbHkgeHgtc28uby94eC5zby1vIGhhY2sgd2l0aCBhIGNsZWFuIGFuZCBjb25zaXN0ZW50IHVzYWdlCiAgICAgICBvZiB4eHgubG8gYXMgR05VIGxpYnRvb2wgZG9lcyB3aXRoIGl0cyBQSUMgb2JqZWN0cwogICAgIC0gcmVkdWNlIGxvY2FsIGNvbXBsZXhpdHkgaW4gbW9kdWxlcyBNYWtlZmlsZS50bXBsIGJ5IG1vdmluZyB0aGUgbGFzdAogICAgICAgZXhpc3RpbmcgdGFyZ2V0ICJkZXBlbmQiIHRvIHRoZSBnZW5lcmF0aW9uIHNlY3Rpb24gaW4gQ29uZmlndXJlLCB0b28uCiAgICAgLSByZW1vdmVkIHRoZSBoaXN0b3JpY2FsICQoU1BBQ0VSKSB3aGljaCB3YXMgdXNlZCBpbiB0aGUgcGFzdCB0b2dldGhlcgogICAgICAgd2l0aCBCUk9LRU5fQlBSSU5URl9GTEFHUyB0byBhdm9pZCB6aWctemFncyBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4gVGhpcwogICAgICAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAtIGZvcmNlIHRoZSBidWlsZCBhbmQgcnVuIG9mIHRoZSBnZW5feHh4IHByb2dyYW1zIHVuZGVyIG1haW4vIGFzIHRoZQogICAgICAgZmlyc3Qgc3RlcCBiZWZvcmUgYnVpbGRpbmcgdGhlIG9iamVjdHMgYmVjYXVzZSBpdCBsb29rcyBjbGVhbmVyCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdJTjMyOiBNYWtlIFdpbjMyIHdvcmsgYWdhaW4gYWZ0ZXIgdGhlIC9kZXYvbnVsbCBEb1MgZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvd3MgaW4gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogRG9uJ3QgZm9yY2UgSVNBUEkgaGVhZGVycyB0byBmaW5pc2ggd2l0aCBcbi4KICAgICBbSmltIFBhdHRlcnNvbiA8SmltLlBhdHRlcnNvbiBDb2dub3MuQ09NPiwgQmVuIExhdXJpZV0gUFIjMjA2MAoKICAqKSBXaGVuIG9wZW5pbmcgImNvbmZpZ3VyYXRpb24iIGZpbGVzIChsaWtlIGh0dHBkLmNvbmYsIGh0YWNjZXNzCiAgICAgYW5kIGh0cGFzc3dkKSwgQXBhY2hlIHdpbGwgbm90IGFsbG93IHRoZW0gdG8gYmUgbm9uLS9kZXYvbnVsbAogICAgIGRldmljZSBmaWxlcy4gVGhpcyBjbG9zZXMgYSBEb1MgaG9sZS4gQXQgdGhlIHNhbWUgdGltZSwKICAgICB3ZSB1c2UgYXBfcGZvcGVuIHRvIG9wZW4gdGhlc2UgZmlsZXMgdG8gaGFuZGxlIHRpbWVvdXRzLgogICAgIFtKaW0gSmFnaWVsc2tpLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQXBhY2hlIHdpbGwgbm93IGxvZyB0aGUgcmVhc29uIGl0cyBodHRwZCBjaGlsZHJlbiBleGl0IGlmIHRoZXkgZXhpdAogICAgIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNpZ25hbC4gIChJdCByZXF1aXJlcyBhIG5ldyBwb3J0aW5nIGRlZmluZSwKICAgICBTWVNfU0lHTElTVCwgd2hpY2ggaWYgZGVmaW5lZCBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIHRleHQKICAgICBkZXNjcmlwdGlvbnMgb2YgdGhlIHNpZ25hbHMgYXZhaWxhYmxlLiAgU2VlIFBPUlRJTkcuKSAgW0RlYW4gR2F1ZGV0XQoKICAqKSBXSU4zMjogY2hkaXIoKSBkb2Vzbid0IG1ha2Ugc2Vuc2UgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IAogICAgIGxpa2UgV0lOMzIuICBCZWZvcmUsIFdpbjMyIENHSSdzIGNvdWxkIGhhdmUgaGFkIHNwb3JhZGljIGZhaWx1cmVzIAogICAgIGlmIGEgY2hkaXIgY2FsbCBmcm9tIG9uZSB0aHJlYWQgd2FzIG1hZGUgYmV0d2VlbiBhbm90aGVyIGNoZGlyIGNhbGwgCiAgICAgYW5kIGEgc3Bhd24gaW4gYW5vdGhlciB0aHJlYWQuICBTbywgZm9yIG5vdyBkb24ndCBjaGRpciBmb3IgQ0dJIHNjcmlwdHMgCiAgICAgaW4gV0lOMzIuICBUaGUgY3VycmVudCBDR0kgInNwZWMiIGlzIHVuY2xlYXIgYXMgdG8gd2hldGhlciBpdCdzIAogICAgIG5lY2Vzc2FyeS4gIExvbmctdGVybSBmaXggaXMgdG8gZWl0aGVyIHNlcmlhbGl6ZSB0aGUgY2hkaXIvc3Bhd24gY29tYm8gCiAgICAgb3IgdXNlIFdJTjMyIG5hdGl2ZSBjYWxscyB0byBzcGF3biBhIHByb2Nlc3MuICBUaGlzIHRlbXAgZml4IHdhcyAKICAgICBuZWNlc3NhcnkgdG8gcmVtb3ZlIHRoaXMgYXMgYSBzaG93c3RvcHBlciBmb3IgMS4zJ3MgcmVsZWFzZS4gCiAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIENsZWFudXAgdGhlIHN1RVhFQyBzdXBwb3J0IGluIEFQQUNJIGFuZCBtYWtlIGl0IG1vcmUgc2FmZToKICAgICAxLiBBZGQgYmlnIGZhdCBoaW50IGluIElOU1RBTEwgYWJvdXQgcmlza3MgYW5kIHRvIHJlYWQgdGhlCiAgICAgICAgaHRkb2NzL21hbnVhbC9zdWV4ZWMuaHRtbCBkb2N1bWVudCBiZWZvcmUgdXNpbmcgdGhlIHN1ZXhlYy1yZWxhdGVkCiAgICAgICAgY29uZmlndXJlIG9wdGlvbnMuCiAgICAgMi4gTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBhdCBsZWFzdCBwcm92aWRlZCBvbmUgLS1zdWV4ZWMteHh4eCBvcHRpb24KICAgICAgICAoc3BlY2lmaWVzIHN1RVhFQyBwYXJhbWV0ZXJzKSBpbiBhZGRpdGlvbiB0byAtLWVuYWJsZS1zdWV4ZWMgb3B0aW9uLgogICAgICAgIElmIG9ubHkgLS1lbmFibGUtc3VleGVjIGlzIGdpdmVuIEFQQUNJIHN0b3BzIHdpdGggYSBoaW50IHRvIElOU1RBTEwKICAgICAgICBhbmQgaHRkb2NzL21hbnVhbC9zdWV4ZWMuaHRtbCBkb2N1bWVudHMuCiAgICAgMy4gUHJvdmlkZSB0d28gYWRkaXRpb25hbCAtLXN1ZXhlYy14eHh4IG9wdGlvbnMgdG8gbWFrZSB0aGUgc3VFWEVDCiAgICAgICAgY29uZmlndXJhdGlvbiBjb21wbGV0ZSAoZXNwZWNpYWxseSBmb3IgcGFja2FnZSBtYWludGFpbmVycyB3aG8gZWxzZQogICAgICAgIGhhZCB0byBwYXRjaCB0aGUgc291cmNlIHRyZWUpIGJ5IHByb3ZpZGluZyB3YXlzIHRvIGNvbmZpZ3VyZSBtaW5pbWFsCiAgICAgICAgVUlEL0dJRCBhbmQgc2FmZSBQQVRILCB0b28uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFudXAgb2YgdGhlIGBjb25maWd1cmUgLS1zaGFkb3cnIHByb2Nlc3M6CiAgICAgLSBtYWtlIHN1cmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY3JlYXRlcyBpdHMgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZQogICAgICAgc2hhZG93IHRyZWUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggcGFyYWxsZWwgY29uZmlndXJlIHJ1bnMKICAgICAtIHJlbW92ZWQgdW5uZWNlc3Nhcnkgb3B0aW9uICItciIgZnJvbSAicm0iIGNhbGwgZm9yIE1ha2VmaWxlcwogICAgIC0gbWFrZSBzdXJlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBjcmVhdGVzIHRoZSBzaGFkb3ctd3JhcHBlciBNYWtlZmlsZQogICAgICAgb25seSB3aGVuIG5vIHNoYWRvdyB0cmVlcyBhbHJlYWR5IGV4aXN0cwogICAgIC0gbWFrZSBzdXJlICJtYWtlIGRpc3RjbGVhbiIgcmVtb3ZlcyB0aGUgc2hhZG93LXdyYXBwZXIgTWFrZWZpbGUgYnV0IG9ubHkKICAgICAgIHdoZW4gbm8gbW9yZSBzaGFkb3cgdHJlZXMgZXhpc3RzCiAgICAgLSBvdmVyaGF1bGVkIG1rc2hhZG93LnNoIHNjcmlwdDogbm93IGl0cyBtb3JlIElGUy1zYWZlIGFuZCBhcHByb3guIHR3aWNlCiAgICAgICBhcyBmYXN0IChpbiB0aGUgcGFzdCBpdCBuZWVkZWQgNzBzZWMsIG5vdyBpdCBydW5zIGp1c3QgMzhzZWMpCiAgICAgLSBtYWtlIHN1cmUgQ1ZTIGRvZXMgbm90IGNvbXBsYWluIGFib3V0IHRoZSBjcmVhdGVkIGZpbGVzCiAgICAgICBNYWtlZmlsbGUuPGdudXRyaXBsZT4gYW5kIGRpcmVjdG9yaWVzIHNyYy48Z251dHJpcGxlPgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkgQVBJIHJvdXRpbmUgYW5kIHRoZQogICAgIEFkZFZlcnNpb25QbGF0Zm9ybSBjb3JlIGRpcmVjdGl2ZS4gIFRoZSBmaXJzdCBhbGxvd3MgbW9kdWxlcyB0bwogICAgIGRlY2xhcmUgdGhlbXNlbHZlcyBpbiB0aGUgU2VydmVyIHJlc3BvbnNlIGhlYWRlciBmaWVsZCB2YWx1ZSwKICAgICBhdWdtZW50aW5nIHRoZSBTRVJWRVJfU1VCVkVSU0lPTiBkZWZpbmUgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZQogICAgIHdpdGggcnVuLXRpbWUgc2V0dGluZ3MgKG1vcmUgdXNlZnVsIGluIGEgbG9hZGFibGUtbW9kdWxlIGVudmlyb25tZW50KS4KICAgICBBZGRWZXJzaW9uUGxhdGZvcm0gaW5zZXJ0cyBhIGNvbW1lbnQgc3VjaCBhcyAiKFVOSVgpIiBvciAiKFdpbjMyKSIKICAgICBpbnRvIHRoZSBzZXJ2ZXIgdmVyc2lvbiBzdHJpbmcuICBbS2VuIENvYXJdIFBSIzIwNTYKCiAgKikgTWlub3Igc3RhYmlsaXR5IHR3ZWFrcyB0byBhdm9pZCBjb3JlIGR1bXBzIGluIGFwX3NucHJpbnRmLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRW1pdCB0aGUgIkFjY2VwdC1SYW5nZSIgaGVhZGVyIGZvciB0aGUgZGVmYXVsdCBoYW5kbGVyLgogICAgIFtCcmlhbiBCZWhsZW5kb3JmXSBQUiMxNDY0CgogICopIEFkZCBhIG5vdGUgdG8gaHR0cGQuY29uZi1kaXN0IHRoYXQgYXBhY2hlIHdpbGwgb24gc29tZSBzeXN0ZW1zIGZhaWwKICAgICB0byBzdGFydCB3aGVuIHRoZSBHcm91cCAjIGlzIHNldCB0byBhIG5lZ2F0aXZlIG9yIGxhcmdlIHBvc2l0aXZlIHZhbHVlLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzdXJlIHRoZSBtb2R1bGUgZXhlY3V0aW9uIG9yZGVyIGlzIGNvcnJlY3QgZXZlbiB3aGVuIHNvbWUgbW9kdWxlcwogICAgIGFyZSBsb2FkZWQgdW5kZXIgcnVudGltZSAoYExvYWRNb2R1bGUnKSB2aWEgdGhlIERTTyBtZWNoYW5pc206CiAgICAgMS4gVGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgaXMgbm93IGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uZQogICAgICAgIGFuZCBub3QgdGhlIG9yaWdpbmFsIHN0YXRpY2FsbHkgbGlzdCBmcm9tIG1vZHVsZXMuYwogICAgIDIuIFRoZSBsb2FkZWQgbW9kdWxlcyBhcmUgbm93IGNvcnJlY3RseSBzZXR1cCBieSBMb2FkTW9kdWxlIGZvcgogICAgICAgIGxhdGVyIHVzZSBieSB0aGUgQWRkTW9kdWxlIGNvbW1hbmQuCiAgICAgMy4gV2hlbiB0aGUgRFNPIG1lY2hhbmlzbSBmb3IgbW9kdWxlcyBpcyB1c2VkIEFQQUNJJ3MgYGluc3RhbGwnCiAgICAgICAgdGFyZ2V0IG5vdyBlbmFibGVzIGFsbCBjcmVhdGVkIGBMb2FkTW9kdWxlJyBsaW5lcyBwZXIgZGVmYXVsdCBiZWNhdXNlCiAgICAgICAgdGhpcyBpcyBib3RoIGFscmVhZHkgZXhwZWN0ZWQgYnkgdGhlIHVzZXIgX2FuZF8gbmVlZGVkIHRvIGF2b2lkCiAgICAgICAgY29uZnVzaW9uIHdpdGggdGhlIG5leHQgcG9pbnQgYW5kIHJlZHVjZXMgdGhlIE1ha2VmaWxlLnRtcGwgY29tcGxleGl0eQogICAgIDQuIFdoZW4gdGhlIERTTyBtZWNoYW5pc20gZm9yIG1vZHVsZXMgaXMgdXNlZCwgQVBBQ0kncyBgaW5zdGFsbCcKICAgICAgICB0YXJnZXQgbm93IGFkZGl0aW9uYWxseSBtYWtlcyBzdXJlIHRoZSBtb2R1bGUgbGlzdCBpcyByZWNvbnN0cnVjdGVkCiAgICAgICAgdmlhIGEgY29tcGxldGUgYENsZWFyTW9kdWxlTGlzdCtBZGRNb2R1bGUuLi4nIGVudHJ5LgogICAgIDUuIFRoZSBzdXBwb3J0IHRvb2wgYGFweHMnIG5vdyBhbHNvIG1ha2VzIHN1cmUgYW4gQWRkTW9kdWxlIGNvbW1hbmQKICAgICAgICBpcyBhZGRlZCBpbiBhZGRpdGlvbiB0byB0aGUgTG9hZE1vZHVsZSBjb21tYW5kLgogICAgIDYuIFRoZSBtb2R1bGVzLmMgZ2VuZXJhdGlvbiB3YXMgZXh0ZW5kZWQgdG8gbm93IGNvbnRhaW4gdHdvCiAgICAgICAgY29tbWVudHMgdG8gbWFrZSBzdXJlIG5vIG9uZSBpcyBjb25mdXNlZCBieSB0aGUgY29uZnVzaW5nIHRlcm1pbm9sb2d5CiAgICAgICAgb2YgbG9hZGluZy9saW5raW5nICh3ZSB1c2UgbG9hZD1saW5rK2xvYWQgJiBsaW5rPWFjdGl2YXRlIGluc3RlYWQgb2YKICAgICAgICB0aGUgb2J2aW91cyBsb2FkPWFjdGl2YXRlICYgbGluaz1saW5rIDotKCApCiAgICAgVGhpcyB3YXkgbm93IHRoZXJlIGlzIG5vIGxvbmdlciBhIGRpZmZlcmVuY2UgdW5kZXIgZXhlY3V0aW9uIHRpbWUgYmV0d2VlbgogICAgIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGdlbmVyYXRlZCBtb2RfeHh4LmMgZnJvbSAiYXB4cyAtZyAtZiB4eHgiIGFmdGVyIHRoZQogICAgIEJpZyBTeW1ib2wgUmVuYW1pbmcuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgYSBjb21tZW50IHRvIG1vZF9leGFtcGxlLmMgc2hvd2luZyB0aGUgZm9ybWF0IG9mIGEgRkxBRyBjb21tYW5kCiAgICAgaGFuZGxlci4gIFtLZW4gQ29hcl0KCiAgKikgU3RhbmRhcmRpemVkIHRoZSB0aW1lIGZvcm1hdCBpbiBtb2Rfc3RhdHVzIHRvIG1hdGNoIHRoYXQgb2Ygb3RoZXIgCiAgICAgcGxhY2VzIGluIHRoZSBjb2RlIChlLmcuIERBVEVfR01UKS4gIFBSIzE1NTEKCiAgKikgRml4IGhhbmRsaW5nIG9mICVaIGluIHRpbWVmbXQgc3RyaW5ncyBmb3IgdGhvc2UgcGxhdGZvcm1zIHdpdGggbm8gdGltZQogICAgIHpvbmUgaW5mb3JtYXRpb24gaW4gdGhlaXIgdG0gc3RydWN0LiBbUGF1bCBFZ2dlcnQgPGVnZ2VydCB0d2luc3VuLmNvbT5dCiAgICAgUFIjNzU0CgogICopIE1ha2VzIG1vZF9yZXdyaXRlLCBtb2RfbG9nX2NvbmZpZywgbW9kX3N0YXR1cyBhbmQgdGhlIFNlcnZlclNpZ25hdHVyZSAKICAgICBmZWF0dXJlIGNvbXBhdGlibGUgd2l0aCAnVXNlQ2Fub25pY2FsTmFtZSBvZmYnIGJ5IGNoYW5naW5nICAKICAgICByLT5zZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZSB0byBhcF9nZXRfc2VydmVyX25hbWUoKS4gIEFuZCBJIGNoYW5nZWQgc29tZSAKICAgICBmdW5jdGlvbnMgd2hpY2ggdXNlIHItPnNlcnZlci0+cG9ydCB0byB1c2UgYXBfZ2V0X3NlcnZlcl9wb3J0KCkgaW5zdGVhZCwgCiAgICAgYmVjYXVzZSBpZiB0aGVyZSdzIG5vIFBvcnQgZGlyZWN0aXZlIGluIHRoZSBjb25maWcgci0+c2VydmVyLT5wb3J0IGlzIDAuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgZ2V0L3NldF9tb2R1bGVfY29uZmlnIGFyZSB0cml2aWFsIGVub3VnaCB0byBiZSBiZXR0ZXIgb2ZmIGlubGluZS4gIFdvcnRoCiAgICAgMS41JSBwZXJmb3JtYW5jZSBib29zdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBhcF9wcm94eV9kYXRlX2Nhbm9uKCkgaW4gcHJveHlfdXRpbC5jCiAgICAgd2hlbiBlbnN1cmluZyAneCcgaXMgYXQgbGVhc3QgMzAtY2hhcnMgYmlnLiBbSmltIEphZ2llbHNraSwKICAgICBCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBbQlMyMDAwIHNlY3VyaXR5XSBCUzIwMDAgbmVlZHMgYW4gZXh0cmEgYXV0aGVudGljYXRpb24gdG8gaW5pdGlhbGl6ZQogICAgIHRoZSB0YXNrIGVudmlyb25tZW50IHRvIHRoZSB1bnByaXZpbGVnZWQgVXNlciBpZC4gT3RoZXJ3aXNlIENHSSBzY3JpcHRzCiAgICAgd291bGQgaGF2ZSBhIHdheSB0byBnYWluIHN1cGVyIHVzZXIgYWNjZXNzLiBbTWFydGluIEtyYWVtZXJdCgogICopIEZpeCBkZWJ1ZyBsb2cgbWVzc2FnZXMgZm9yIEJTMjAwMC9PU0Q6IGluc3RlYWQgb2YgbG9nZ2luZyB0aGUgd2hvbGUKICAgICBhYnNvbHV0ZSBwYXRoLCBvbmx5IGxvZyBiYXNlIG5hbWUgb2YgbG9nZ2luZyBzb3VyY2UgYXMgaXMgZG9uZQogICAgIGluIHVuaXguIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUm9uYWxkIFRzY2hhbGFlcidzIEFjY2VwdC1FbmNvZGluZyBwYXRjaCAtIHByZXNlcnZlIHRoZSAieC0iIGluCiAgICAgdGhlIGVuY29kaW5nIHR5cGUgZnJvbSB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlciAoaWYgaXQncyB0aGVyZSkKICAgICBhbmQgdXNlIGl0IGluIHRoZSByZXNwb25zZSwgYXMgdGhhdCdzIHByb2JhYmx5IHdoYXQgaXQnbGwgYmUgZXhwZWN0aW5nLgogICAgIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XQoKICAqKSBGaXggdG8gbW9kX2FsaWFzOiB0cmFuc2xhdGVfYWxpYXNfcmVkaXIgaXMgZGVhbGluZyB3aXRoCiAgICAgYSBVUkksIG5vdCBhIGZpbGVuYW1lLCBzbyB0aGUgY2hlY2sgZm9yIGRyaXZlIGxldHRlcnMgZm9yIHdpbjMyIAogICAgIGFuZCBlbXggaXMgbm90IG5lY2Vzc2FyeS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBXSU4zMjogQWxsb3cgLmNtZCBhcyBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4KICAgICBbS2FyaSBMaWtvdnVvcmkgPEthcmkuTGlrb3Z1b3JpIG1vbC5maT5dIFBSIzIxNDYKCiAgKikgTWFrZSBBcGFjaGUgaGVhZGVyIGZpbGVzLCBhbmQgc29tZSB2YXJpYWJsZXMsIEMrKyBmcmllbmRseS4KICAgICBbTWljaGFlbCBBbmRlcnNvbidzIDxta2EgcmVkZXMuaW50LmNvbS5teD5dCgogICopIENoaWxkIHByb2Nlc3NlcyBjYW4gbm93ICJzaWduYWwiIChieSBleGl0aW5nIHdpdGggYSBzdGF0dXMKICAgICBvZiBBUEVYSVRfQ0hJTERGQVRBTCkgdGhlIHBhcmVudCBwcm9jZXNzIHRvIGFib3J0IGFuZAogICAgIHNodXRkb3duIHRoZSBzZXJ2ZXIgaWYgdGhlIGVycm9yIGluIHRoZSBjaGlsZCBwcm9jZXNzIHdhcwogICAgIGZhdGFsIGVub3VnaC4gW0ppbSBKYWdpZWxza2ldCgogICopIG1vZF9hdXRvaW5kZXgncyBmaW5kX2l0bWUoKSB3YXMgc2Vuc2l0aXZlIHRvIE1JTUUgdHlwZSBjYXNlLgogICAgIFtKaW0gSmFnaWVsc2tpXSBQUiMyMTEyCgogICopIE1ha2Ugc3VyZSB0aGUgcmVmZXJlcl9sb2cgYW5kIGFnZW50X2xvZyBlbnRyaWVzIGluIHRoZSBkZWZhdWx0IGh0dHBkLmNvbmYKICAgICBmaWxlIGFyZSBhbHNvIGFkanVzdGVkIGZvciB0aGUgYWN0dWFsIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBwYXRocy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjE3NQoKICAqKSBXSU4zMjogRXh0ZW5zaXZlIG92ZXJoYXVsIG9mIHRoZSB3YXkgVU5DcyBhcmUgaGFuZGxlZC4gW0JlbiBMYXVyaWVdCgogICopIFdJTjMyOiBNYWtlIHJvb3RzIG9mIGZpbGVzeXN0ZW1zIChlLmcuIGM6Lykgd29yay4gW0JlbiBMYXVyaWVdCiAgICAgUFIjMTU1OAoKICAqKSBQT1JUOiBWYXJpb3VzIHBvcnRpbmcgY2hhbmdlcyB0byBzdXBwb3J0IEFJWCAzLjIsIDQuMS41LCA0LjIgYW5kIDQuMy4KICAgICBBZGRpdGlvbmFsbHkgdGhlIGNoZWNrcyBmb3IgZmluZGluZyB0aGUgdmVuZG9yIERTTyBsaWJyYXJ5IHdlcmUgbW92ZWQKICAgICBmcm9tIG1vZF9zby5jIHRvIENvbmZpZ3VyZSBiZWNhdXNlIGZpcnN0IGl0IG5lZWRzICRQTEFUIGV0Yy4gYW5kIHNlY29uZAogICAgIG1vZF9zbyBhbHJlYWR5IHVzZXMgYW4gYWJzdHJhY3Rpb24gbGF5ZXIgYW5kIGRvZXMgbm90IGZpZGRsZSB3aXRoIHRoZQogICAgIHZlbmRvciBmdW5jdGlvbnMgaXRzZWxmLgogICAgIFtKZW5zLVV3ZSBNYWdlciwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUE9SVDogU29tZSBvcHRpbWl6YXRpb24gZGVmaW5lcyBmb3IgTmV0QlNECiAgICAgW0phcm9taXIgRG9sZWNlayA8ZG9sZWNlayBpY3MubXVuaS5jej5dIFBSIzIxNjUKCiAgKikgUE9SVDogRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIE5ldEJTRC4KICAgICBbSmFyb21pciBEb2xlY2VrIDxkb2xlY2VrIGljcy5tdW5pLmN6PiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjE1OAoKICAqKSBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIEFJWCAoYXQgbGVhc3QgNC4yIGJ1dCBvbGRlcgogICAgIEFJWCB2YXJpYW50cyBzaG91bGQgd29yayBmaW5lLCB0b28uIEV2ZW4gQUlYIDMueCBzaG91bGQgd29yaykuIFRoaXMgaXMKICAgICBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIGZyZWUgRFNPIGVtdWxhdGlvbiBjb2RlIGZyb20gSmVucy1Vd2UgTWFnZXIKICAgICB3aGljaCB3ZSBwdXQgaW50byBhIG9zL3VuaXgvb3MtZHNvLWFpeC5jIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAgCiAgKikgUE9SVDogRml4IGNvbXBpbGVyIHdhcm5pbmdzIHVuZGVyIEFJWCA+PSA0LjIgd2hlcmUgdGhlIG1hbnVhbCBwYWdlcyBpbXBseQogICAgIHRoYXQgd2Ugc2hvdWxkIHVzZSBORVRfU0laRV9UID09IGludCBidXQgdGhlIGluY2x1ZGUgZmlsZXMgZm9yY2Ugc2l6ZV90LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdHdvIGJ1Z3MgaW4gc2VsZWN0KCkgaGFuZGxpbmcgaW4gaHR0cF9tYWluLmMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgU3VwcHJlc3MgImVycm9yKDApIiBtZXNzYWdlcyBmb3IgYXBfbG9nX2Vycm9yKCkgd2hlbiB0aGUgQVBMT0dfTk9FUlJOTwogICAgIGlzIHVuc2V0IChhcyBpdCBpcyBpbiBzaXR1YXRpb25zIGxpa2UgdGltZW91dHMpIHdoZXJlIGl0IGlzIHVuY2xlYXIKICAgICB3aGV0aGVyIGVycm5vIGlzIHNldCBvciBub3QuICBbTWFydGluIEtyYWVtZXJdCgogICopIEp1c3QgaGF2aW5nIEFQQUNJJ3MgbG9jYWxzdGF0ZWRpciBpcyB0b28gZ2VuZXJhbCBhbmQgbm90IGVub3VnaCBmb3IgbW9zdAogICAgIG9mIHRoZSBzeXN0ZW1zLiAxLjNiNiBhZ2FpbiByZXF1aXJlZCBtYW51YWwgQVBBQ0kgcGF0Y2hlcyBieSBwYWNrYWdlCiAgICAgbWFpbnRhaW5lcnMgZnJvbSBSZWQgSGF0IGFuZCBGcmVlQlNEIGJlY2F1c2UgZm9yIHRoZWlyIGZpbGVzeXN0ZW0gbGF5b3V0IGEKICAgICBsaXR0bGUgYml0IG1vcmUgZmxleGliaWxpdHkgaW4gY29uZmlndXJpbmcgdGhlIHBhdGhzIGlzIG5lZWRlZC4gSGVuY2Ugd2UKICAgICBwcm92aWRlIHRocmVlIGFkZGl0aW9uYWwgY29uZmlndXJlIG9wdGlvbnMgKC0tcnVudGltZWRpciwgLS1sb2dmaWxlZGlyLAogICAgIC0tcHJveHljYWNoZWRpcikgd2hpY2ggbm93IGNhbiBiZSB1c2VkIGZvciBtb3JlIGdyYW51bGFyIGFkanVzdG1lbnRzIGlmCiAgICAgLS1sb2NhbHN0YXRlZGlyIGlzIG5vdCBlbm91Z2ggdG8gZml0IHRoZSBwYXJ0aWN1bGFyIG5lZWRzLiBBcyBhIG5pY2UKICAgICBzaWRlLWVmZmVjdCB0aGlzIHJlZHVjZXMgc29tZSBzdWJkaXIgZmlkZGxpbmcgaW4gY29uZmlndXJlK01ha2VmaWxlLnRtcGwuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgdGhlIGluc3RhbGwgcm9vdCBmb3IgIm1ha2UgaW5zdGFsbCIgaW4gQVBBQ0kncyBNYWtlZmlsZSBvdmVycmlkZWFibGUKICAgICBieSBwYWNrYWdlIGF1dGhvcnMuICBUaGlzIHdheSB3ZSBhcmUgZXZlbiBtb3JlIGZyaWVuZGx5IHRvIHBhY2thZ2UKICAgICBtYWludGFpbmVycyAoZXNwZWNpYWxseSBEZWJpYW4gYW5kIFJlZCBIYXQpIHdobyBidWlsZCBmb3IgdGhlIHJlYWwgcHJlZml4CiAgICAgdmlhICJjb25maWd1cmUgLS1wcmVmaXg9LzxyZWFsPiIgYnV0IHVzZSBhIGRpZmZlcmVudCBsb2NhbCBwcmVmaXggdmlhCiAgICAgIm1ha2Ugcm9vdD0vdG1wL2FwYWNoZSBpbnN0YWxsIiBmb3Igcm9sbGluZyB0aGUgcGFja2FnZSB3aXRob3V0IGJyaXN0bGluZwogICAgIHRoZSB0YXJnZXQgbG9jYXRpb24gb24gdGhlaXIgc3lzdGVtLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgV29ya2Fyb3VuZCBzZWQgbGltaXRhdGlvbnMgaW4gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0IGJ5IG5vdwogICAgIHN1YnN0aXR1dGluZyBpbiBjaHVua3Mgb2YgNTAgY29tbWFuZHMgKGJlY2F1c2UgZm9yIGluc3RhbmNlIEhQVVgncyB2ZW5kb3IKICAgICBzZWQgaGFzIGEgbGltaXQgb2YgbWF4LiA5OCBjb21tYW5kcykKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEzNgoKICAqKSBBZGRpbmcgU09DS1M1IHN1cHBvcnQgYW5kIGZpeGluZyBleGlzdGluZyBTT0NLUzQgc3VwcG9ydC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjE0MAoKICAqKSBNYW51YWxseSBmaXggc29tZSBzeW1ib2xzIHdoaWNoIHdlcmUgbm90IHJlbmFtZWQgdG8gcHJlZml4IGFwXyBpbiB0aGUgQklHCiAgICAgUkVOQU1JTkcgcHJvY2VzcyBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgYXMgcHJlLXByb2Nlc3NvciBtYWNyb3MgaW5zdGVhZAogICAgIG9mIHJlYWwgZnVuY3Rpb25zOiBicHV0YywgYmdldGMsIHBpcGVkX2xvZ193cml0ZV9mZCwgcGlwZWRfbG9nX3JlYWRfZmQKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgV29ya2Fyb3VuZCBicmFpbmRlYWQgQVdLJ3Mgd2hlbiBnZW5lcmF0aW5nIGFwX2NvbmZpZy5oOiBUaGUgc3BsaXQoKSBhbmQKICAgICBzdWJzdHIoKSBmdW5jdGlvbnMgY2Fubm90IGJlIG5lc3RlZCB1bmRlciB2ZW5kb3IgQVdLIGZyb20gU29sYXJpcyAyLjYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMzkKCiAgKikgVmFyaW91cyBidWdmaXhlcyBhbmQgY2xlYW51cHMgZm9yIHRoZSBBUEFDSSBjb25maWd1cmUgc2NyaXB0OgogICAgIG8gZml4IElGUyBoYW5kbGluZyBmb3IgX25lc3RlZF8gc2l0dWF0aW9uCiAgICAgbyBmaXggUGVybCBpbnRlcnByZXRlciBzZWFyY2g6IHRha2UgZmlyc3Qgb25lIGZvdW5kIGluc3RlYWQgb2YgbGFzdCBvbmUKICAgICBvIGZpeCBEU08gY29uc2lzdGVuY3kgY2hlY2sKICAgICBvIHByaW50IGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dAogICAgIG8gYWRkIGluc3RhbGwtcXVpZXQgZm9yIC0tc2hhZG93IHNpdHVhdGlvbiB0byBNYWtlZmlsZSBzdHViCiAgICAgbyByZWR1Y2UgY29tcGxleGl0eSBieSBhdm9pZGluZyBzZWQtaGFja3MgZm9yIHJ1bGUgYW5kIG1vZHVsZSBsaXN0IGxvb3BzCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBERUJVR19DR0kgc2l0dWF0aW9uIGluIG1vZF9jZ2kuYyBbRGF2aWQgTWFjS2VuemllXSBQUiMyMTE0CgogICopIE1ha2Ugc3VyZSB0aGUgaW5wdXQgZmllbGQgc2VwYXJhdG9yIChJRlMpIHNoZWxsIHZhcmlhYmxlIGlzIGV4cGxpY2l0bHkKICAgICBpbml0aWFsaXplZCBjb3JyZWN0bHkgYmVmb3JlIF9ldmVyeV8gYGZvcicgbG9vcCBhbmQgYWxzbyByZXN0b3JlZCBhZnRlcgogICAgIHRoZSBsb29wcy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSB0aGF0ICJtYWtlIGluc3RhbGwiIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSBgbWltZS50eXBlcycgYW5kCiAgICAgYG1hZ2ljJyBmaWxlcyBmcm9tIGFuIGV4aXN0aW5nIEFwYWNoZSBpbnN0YWxsYXRpb24uIEJlY2F1c2UgcGVvcGxlIG9mdGVuCiAgICAgY3VzdG9taXplIHRoZXNlIGZvciBvd24gTUlNRSBhbmQgY29udGVudCB0eXBlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUE9SVDogRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIE9wZW5CU0QgMi54CiAgICAgW1BldGVyIEdhbGJhdnksIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMDkKCiAgKikgRml4IHRoZSBwYXRoIHRvIHRoZSBTY29yZUJvYXJkRmlsZSBpbiB0aGUgaW5zdGFsbC1jb25maWcgdGFyZ2V0LCB0b28uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMDUKCiAgKikgTGV0ICJjb25maWd1cmUiIGNsZWFyIG91dCB0aGUgdXNlcnMgcGFyYW1ldGVycyAocHJvdmlkZWQgYXMgc2hlbGwKICAgICB2YXJpYWJsZXMpIHRvIGF2b2lkIHNpZGUtZWZmZWN0cyBpbiAic3JjL0NvbmZpZ3VyZSIgd2hlbiB0aGUgdXNlcgogICAgIGV4cG9ydGVkIHRoZW0gKHdoaWNoIGlzIG5vdCBuZWVkZWQsIGJ1dCBzb21lIHVzZXJzIGRvIGl0KS4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMDEKCiAgKikgUHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZyb20gc29tZSBvbGQgc3JjL0NvbmZpZ3VyYXRpb24udG1wbAogICAgIHBhcmFtZXRlciBuYW1lcyB0byB0aGUgY2Fub25pY2FsIEF1dG9jb25mLXN0eWxlIHNoZWxsIHZhcmlhYmxlIG5hbWVzLiBGb3IKICAgICBpbnN0YW5jZSBDRkxBR1MgdnMuIEVYVFJBX0NGTEFHUy4gVGhlIEVYVFJBX3h4eCB2YXJpYW50cyBhcmUgYWNjZXB0ZWQgbm93CiAgICAgYnV0IGEgaGludCBtZXNzYWdlIGlzIGRpc3BsYXllZC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAgCiAgKikgTWFrZSBzdXJlIHRoYXQgIm1ha2UgaW5zdGFsbCIgZG9lc24ndCBvdmVyd3JpdGUgdGhlIERvY3VtZW50Um9vdCBhbmQKICAgICBDR0kgc2NyaXB0cyBmcm9tIGFuIGV4aXN0aW5nIEFwYWNoZSBpbnN0YWxsYXRpb24uIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBKaW0gSmFnaWVsc2tpXSBQUiMyMDg0CgogICopIE1ha2UgYGNvbmZpZ3VyZSAtLWNvbXBhdCcgbW9yZSAiY29tcGF0aWJsZSIgYnkgZmlyc3QgCiAgICAgbGV0IHRoZSBsaWJleGVjZGlyIGRlZmF1bHQgdG8gRVBSRUZJWC9saWJleGVjIGluc3RlYWQgb2YgRVBSRUZJWC9iaW4gYW5kCiAgICAgc2Vjb25kIGJ5IG1ha2luZyBzdXJlIHRoZSAiYXZvaWQtYnJpc3RsaW5nLXN1ZmZpeCIgL2FwYWNoZSBpcyBub3QKICAgICBhcHBlbmRlZCB0byBzeXNjb25mZGlyLCBkYXRhZGlyLCBsb2NhbHN0YXRlZGlyIGFuZCBpbmNsdWRlZGlyIHdoZW4KICAgICAtLWNvbXBhdCBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTGFycyBFaWxlYnJlY2h0XQoKICAqKSBOZVhUIHJlcXVpcmVkIHN0cmR1cCgpIGluIHN1cHBvcnQvbG9ncmVzb2x2ZS5jCiAgICAgW0ZyYW5jaXNjbyBUb21laSA8ZmF0b21laSBzYW5kYnVyZy51bm0uZWR1Pl0gUFIjMjA4MgoKICAqKSBBSVggcmVxdWlyZWQgc3lzL3NlbGVjdC5oIGluIHN1cHBvcnQvYWIuYwogICAgIFtKZW5zIFNjaGxldXNlbmVyIDxKZW5zLlNjaGxldXNlbmVyIGRsci5kZT5dIFBSIzIwODEKCiAgKikgRml4IHRoZSBwYXRoIHRvIHRoZSBNaW1lTWFnaWNGaWxlIGluIHRoZSBpbnN0YWxsLWNvbmZpZyB0YXJnZXQsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjA4OQoKICAqKSBQT1JUOiBBZGRlZCBIUC1VWCAxMSBwYXRjaGVzIFtKZWZmIEVhcmlja3NvbiA8amFlYXJpY2sgY29sYnkuZWR1Pl0KCiAgKikgSWYgeW91IHN0YXJ0IGFwYWNoZSB3aXRoIHRoZSAtUyBjb21tYW5kIGxpbmUgb3B0aW9uIGl0IHdpbGwgZHVtcAogICAgIG91dCB0aGUgcGFyc2VkIHZob3N0IHNldHRpbmdzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGZvbGtzIHRyeWluZwogICAgIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZWlyIHZob3N0IGNvbmZpZ3VyYXRpb24uCiAgICAgKE90aGVyIGR1bXBzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLikgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGQgJXBBLCAlcEksIGFuZCAlcHAgY29kZXMgdG8gYXBfdmZvcm1hdHRlciAoYW5kIGhlbmNlIGFwX2JwcmludGYsCiAgICAgYXBfc25wcmludGYsIGFuZCBhcF9wc3ByaW50ZikuICBTZWUgaW5jbHVkZS9hcC5oIGZvciBkb2NzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQmVjYXVzZSAvdXNyL2xvY2FsL2FwYWNoZSBpcyB0aGUgZGVmYXVsdCBwcmVmaXggdGhlIGBgY29uZmlndXJlCiAgICAgLS1jb21wYXQnJyBvcHRpb24gbm8gbG9uZ2VyIGhhcyB0byBzZXQgcHJlZml4LCBhZ2Fpbi4gVGhpcyB3YXkgdGhlCiAgICAgLS1jb21wYXQgb3B0aW9uIGhvbm9ycyBhIGxlYWRpbmcgLS1wcmVmaXggb3B0aW9uLiBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBQT1JUOiBDYXN0IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBkbG9wZW4oKSBpbiBhcF9vc19kc29fbG9hZCgpCiAgICAgdG8gYGNoYXIgKicgdW5kZXIgT1NGMSBhbmQgRnJlZUJTRCAyLnggd2hlcmUgaXQgaXMgZGVmaW5lZCB0aGlzIHdheQogICAgIHRvIGF2b2lkICJkaXNjYXJkIGNvbnN0IiB3YXJuaW5ncy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIElmIGEgc3BlY2lmaWMgaGFuZGxlciBpcyBzZXQgZm9yIGEgZmlsZSB5ZXQgdGhlIHJlcXVlc3Qgc3RpbGwKICAgICBlbmRzIHVwIGJlaW5nIGhhbmRsZWQgYnkgdGhlIGRlZmF1bHQgaGFuZGxlciwgbG9nIGFuIGVycm9yCiAgICAgbWVzc2FnZSBiZWZvcmUgaGFuZGxpbmcgaXQuICBUaGlzIGNhdGNoZXMgdGhpbmdzIHN1Y2ggYXMgdHJ5aW5nIAogICAgIHRvIHVzZSBTU0lzIHdpdGhvdXQgbW9kX2luY2x1ZGUgZW5hYmxlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgRml4IGVycm9yIGxvZ2dpbmcgZm9yIHRoZSBzdGFydHVwIGNhc2Ugd2hlcmUgYXBfbG9nX2Vycm9yKCkgc3RpbGwgdXNlcwogICAgIHN0ZGVyciBhcyB0aGUgdGFyZ2V0LiBOb3cgdGhlIGRlZmF1bHQgbG9nIGxldmVsIGlzIGhvbm9yZWQgaGVyZSwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogICAgCiAgKikgUE9SVDogTWFrZSBzdXJlIHNvbWUgQVdLJ3MgZG9uJ3QgZmFpbCBpbiBzcmMvQ29uZmlndXJlIHdpdGggInN0cmluZyB0b28KICAgICBsb25nIiBlcnJvcnMgd2hlbiBnZW5lcmF0aW5nIHRoZSBNT0RVTEVTIGVudHJ5IGZvciBzcmMvTWFrZWZpbGUKICAgICBbQmVuIEh5ZGUsIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSBzcmMvQ29uZmlndXJlIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgdGhlIG9sZCBkaXJlY3RvcnkKICAgICAvdXNyL2xvY2FsL2V0Yy9odHRwZC8gd2hlbiBBUEFDSSBpcyB1c2VkLiAgW0xhcnMgRWlsZWJyZWNodF0KICAgCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjYKCiAgKikgUE9SVDogQ2xlYW4gdXAgd2FybmluZ3Mgb24gVWx0cml4IGFuZCBIUFVYLiAgW0JlbiBIeWRlXQogCiAgKikgQWRkaW5nIERTTyBzdXBwb3J0IGZvciB0aGUgSFAvVVggcGxhdGZvcm0gYnkgZW11bGF0aW5nIHRoZSBkbG9wZW4tc3R5bGUKICAgICBpbnRlcmZhY2UgdmlhIHRoZSBzaW1pbGFyIGJ1dCBwcm9wcmlldGFyeSBIUC9VWCBzaGxfeHh4LXN0eWxlIHN5c3RlbQogICAgIGNhbGxzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUE9SVDogVXBkYXRlZCBVbml4V2FyZSAyLjAueCBhbmQgMi4xLnggZW50cmllcyBmb3IgRFNPIHN1cHBvcnQgYW5kIG1hZGUKICAgICBBUEFDSSBNYWtlZmlsZS50bXBsICJpbnN0YWxsIiB0YXJnZXQgbW9yZSByb2J1c3QgZm9yIHNlbnNpYmxlIFVuaXhXYXJlCiAgICAgTWFrZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopICsrKysgVEhFIEJJRyBTWU1CT0wgUkVOQU1JTkcgKysrKwogICAgIFRvIGF2b2lkIHN5bWJvbCBjbGFzaGVzIHdpdGggdGhpcmQtcGFydHkgY29kZSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsCiAgICAgd2UgZ2xvYmFsbHkgYXBwbGllZCB0aGUgcHJlZml4ICJhcF8iIHRvIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBvZgogICAgIGZ1bmN0aW9uczoKICAgICAgICAtIEFwYWNoZSBwcm92aWRlZCBnZW5lcmFsIGZ1bmN0aW9ucyAoZS5nLiwgYXBfY3B5c3RybikKICAgICAgICAtIFB1YmxpYyBBUEkgZnVuY3Rpb25zIChlLmcuLCBwYWxsb2MsIGJnZXRzKQogICAgICAgIC0gUHJpdmF0ZSBmdW5jdGlvbnMgd2hpY2ggd2UgY2FuJ3QgbWFrZSBzdGF0aWMgKGJlY2F1c2Ugb2YKICAgICAgICAgIGNyb3NzLW9iamVjdCB1c2FnZSkgYnV0IHNob3VsZCBiZSAoZS5nLiwgbmV3X2Nvbm5lY3Rpb24pCiAgICAgRm9yIGJhY2t3YXJkIHNvdXJjZSBjb21wYXRpYmlsaXR5IGEgbmV3IGhlYWRlciBmaWxlIG5hbWVkIGNvbXBhdC5oIHdhcwogICAgIGNyZWF0ZWQgd2hpY2ggcHJvdmlkZXMgZGVmaW5lcyBmb3IgdGhlIG9sZCBzeW1ib2wgbmFtZXMgYW5kIGNhbiBiZSB1c2VkCiAgICAgYnkgdGhpcmQtcGFydHkgbW9kdWxlIGF1dGhvcnMuCiAgICAgW1RoZSBBcGFjaGUgR3JvdXBdCgogICopIEFkZGVkIGR5bmFtaWMgc2hhcmVkIG9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBTVlI0LWRlcml2YXRlczogVGhlCiAgICAgcHJvYmxlbSB1bmRlciBTVlI0IGlzIHRoYXQgdGhlcmUgaXMgbm8gY29tbWFuZCBmbGFnIHRvIGZvcmNlIHRoZSBsaW5rZXIKICAgICB0byBleHBvcnQgdGhlIGdsb2JhbCBzeW1ib2xzIG9mIHRoZSBodHRwZCBleGVjdXRhYmxlIHRoZXJld2l0aCB0aGV5IGFyZQogICAgIGF2YWlsYWJsZSB0byB0aGUgRFNPJ3MuIEluc3RlYWQgb2YgcHJvYmxlbWF0aWMgaGFja3MgbGlrZSBjcmVhdGluZyBhCiAgICAgZHVtbXkuc28gZmlsZSAoY29udGFpbmluZyBkdW1teSByZWZlcmVuY2VzIHRvIGFsbCBnbG9iYWwgc3ltYm9scykgdGhlCiAgICAgaHR0cGQgYmluYXJ5IGlzIGxpbmtlZCBhZ2FpbnN0LCB3ZSB1c2UgYSBjbGVhbiB0cmljayBzdG9sZW4gZnJvbSBQZXJsIDU6CiAgICAgUGxhY2luZyB0aGUgQXBhY2hlIGNvcmUgY29kZSBpdHNlbGYgaW50byBhIERTTyBsaWJyYXJ5IG5hbWVkIGxpYmh0dHBkLnNvLgogICAgIFRoaXMgd2F5IHRoZSBnbG9iYWwgc3ltYm9scyBfSEFWRV8gdG8gYmUgZXhwb3J0ZWQgYW5kIHRodXMgYXJlIGF2YWlsYWJsZQogICAgIHRvIGFueSBtYW51YWxseSBsb2FkZWQgRFNPJ3MgdW5kZXIgcnVudGltZS4gVG8gcmVkdWNlIHRoZSBpbXBhY3QgdG8gdGhlCiAgICAgdXNlciB0byBudWxsIHdlIGdvIGV2ZW4gZnVydGhlciBhbmQgY3JlYXRlIGEgc3R1YiBodHRwZCBleGVjdXRhYmxlIHdoaWNoCiAgICAgYXV0b21hdGljYWxseSBrZWVwcyB0cmFjayBvZiB0aGUgRFNPIGxpYnJhcnkgbG9hZGluZyBpdHNlbGYgYW5kIHRodXMKICAgICBoaWRlcyB0aGUgY29tcGxldGUgbWVjaGFuaXNtIGZyb20gdGhlIHVzZXIuIEFsdGhvdWdoIHRoZSBnZW5lcmF0aW9uIG9mCiAgICAgdGhpcyBEU08gbGlicmFyeSBpcyBhdXRvbWF0aWNhbGx5IHRyaWdnZXJlZCBmb3IgcGxhdGZvcm1zIHdoaWNoCiAgICAgZXNzZW50aWFsbHkgbmVlZCBpdCAobW9zdGx5IGFsbCBTVlI0LWRlcml2YXRlcykgaXQgY2FuIGJlIGFsc28gZW5hYmxlZAogICAgIG1hbnVhbGx5IHZpYSB0aGUgUnVsZSBTSEFSRURfQ09SRS4gVGhpcyBjYW4gYmUgaW50ZXJlc3RpbmcgaW4gdGhlIGZ1dHVyZQogICAgIHdoZXJlIHdlIHBlcmhhcHMgZXhwbG9pdCB0aGlzIGxpYmh0dHBkLnNvIG1lY2hhbmlzbSBmb3IgcHJvdmlkaW5nIG5pZnR5CiAgICAgZmVhdHVyZXMgbGlrZSBncmFjZWZ1bCB1cGdyYWRlcywgb3Igd2hhdGV2ZXIuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQnVpbGQgdGhlIGxpYnJhcmllcyBiZWZvcmUgYnVpbGRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRvb2xzLiBbQmVuIEh5ZGVdCgogICopIEFkZCAiZGlzdGNsZWFuIiB0YXJnZXQgdG8gc3JjLy1NYWtlZmlsZXMgdG8gcHJvdmlkZSAibWFrZSBkaXN0Y2xlYW4iIGFsc28KICAgICBpbnNpZGUgdGhlIHNyYyBzdWJ0cmVlIChpLmUuIGZvciBub24tQVBBQ0kgdXNlcnMpLiBGb2xsb3dpbmcgR05VIE1ha2VmaWxlCiAgICAgY29udmVudGlvbnMgd2hpbGUgImNsZWFuIiByZW1vdmVzIG9ubHkgc3R1ZmYgY3JlYXRlZCBieSAiYWxsIiB0YXJnZXRzLAogICAgICJkaXN0Y2xlYW4iIGFkZGl0aW9uYWxseSByZW1vdmVzIHRoZSBzdHVmZiBmcm9tIHRoZSBjb25maWd1cmF0aW9uCiAgICAgcHJvY2Vzcy4gVGhpcyB3YXkgIm1ha2UgZGlzdGNsZWFuIiAoaGVuY2UgdGhlIG5hbWUpIHByb3ZpZGVzIGEgZnJlc2gKICAgICBzb3VyY2UgdHJlZSBhcyBpdCB3YXMgZm9yIGRpc3RyaWJ1dGlvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWxsb3cgdG9wLWxldmVsIChBUEFDSSkgTWFrZWZpbGUgdG8gYnJlYWsgb24gYnVpbGQgZXJyb3JzCiAgICAgdGhlIHNhbWUgd2F5IHRoZSBzcmMvIHN1YnRyZWUgTWFrZWZpbGVzIGJyZWFrcyBvbiB0aGVtIGJ5IHJlcGxhY2luZyB0aGUKICAgICBpbml0aWFsIEFQQUNJIHNlZC1zdWJkaXItZGlzcGxheS1rbHVkZ2Ugd2l0aCBhIG1vcmUgY2xlYW4KICAgICB2YXJpYWJsZS1wYXNzaW5nLXNvbHV0aW9uOiB2YXJpYWJsZSBTRFAgY2FuIG9wdGlvbmFsbHkgaG9sZCB0aGUgc3ViZGlyCiAgICAgcHJlZml4IHdoaWNoIGlzIGNvbnNpc3RlbnRseSB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZSBzdWJkaXIgbW92ZW1lbnQuCiAgICAgVGhpcyB3YXkgZXZlbiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlIGNhbiBzdG9wIGNvcnJlY3RseSBvbiBlcnJvcnMgYXMgdGhlCiAgICAgdXNlciBleHBlY3RzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgb3JkZXJpbmcgb2YgYXJndW1lbnQgY2hlY2tzIGZvciBSZXdyaXRlQmFzZSBkaXJlY3RpdmUuCiAgICAgW1RvZGQgRWlnZW5zY2hpbmsgPGVpZ2Vuc3RyIG1peGkubmV0Pl0gUFIjMjA0NQoKICAqKSBDaGFuZ2UgV2luMzIgSVNfTU9EVUxFIHRvIFNIQVJFRF9NT0RVTEUgdG8gbWF0Y2ggVW5peCcgbWV0aG9kIG9mCiAgICAgaW5kaWNhdGluZyB0aGF0IGEgbW9kdWxlIGlzIGJlaW5nIGNvbXBpbGVkIGZvciBkeW5hbWljIGxvYWRpbmcuIEFsc28KICAgICByZW1vdmUgI2RlZmluZSBJU19NT0RVTEUgZnJvbSBtb2R1bGVzIGFuZCBhZGQgU0hBUkVEX01PRFVMRSBkZWZpbmUKICAgICB0byB0aGUgbWFrL2RzcCBmaWxlcy4gW0FsZXhlaSBLb3N1dF0KCiAgKikgUmVkdWNlIGxvZ2dpbmcgbGV2ZWwgb2YgIm5vcm1hbCIgd2FybmluZyBtZXNzYWdlcyB0byBBUExPR19JTkZPLAogICAgIHNpbmNlIHdlIGFyZSBub3cgbG9nZ2luZyBBUExPR19XQVJOSU5HIGJ5IGRlZmF1bHQuIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IE9TLzIgdHdlYWsgdG8gZGVhbCB3aXRoIG11bHRpcGxlIC5leGUgdGFyZ2V0cy4gW0JyaWFuIEhhdmFyZF0KIAogICopIEFkZCBkb2N1bWVudGF0aW9uIGZpbGUgYW5kIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgZW50cnkgZm9yIHRoZQogICAgIGV4cGVyaW1lbnRhbCBtb2RfbW1hcF9zdGF0aWMgbW9kdWxlLiBCZWNhdXNlIGFsdGhvdWdoIGl0IGlzIGFuZCBtYXJrZWQgYXMKICAgICBhbiBleHBlcmltZW50YWwgb25lIGl0IGlzIGRpc3RyaWJ1dGVkIGFuZCB0aHVzIHNob3VsZCBiZSBkb2N1bWVudGVkIGFuZAogICAgIHByZXBhcmVkIGZvciBjb25maWd1cmF0aW9uIHRoZSBzYW1lIHdheSBhcyBhbGwgb3RoZXJzIG1vZHVsZXMuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgcXVlcnkgKC1xKSBvcHRpb24gdG8gYXB4cyBzdXBwb3J0IHRvb2wgdG8gYmUgYWJsZSB0byBtYW51YWxseSBxdWVyeQogICAgIHNwZWNpZmljIHNldHRpbmdzIGZyb20gYXB4cy4gVGhpcyBpcyBuZWVkZWQgZm9yIGluc3RhbmNlIHdoZW4geW91CiAgICAgbWFudWFsbHkgd2FudCB0byBhY2Nlc3MgQXBhY2hlJ3MgaGVhZGVyIGZpbGVzIGFuZCB5b3UgbmVlZCB0byBhc3NlbWJsZQogICAgIHRoZSAtSSBvcHRpb24uICBOb3cgeW91IGNhbiBkbyAtSWBhcHhzIC1xIElOQ0xVREVESVJgLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBOb3cgc3JjL0NvbmZpZ3VyZSB1c2VzIGEgZmFsbGJhY2sgc3RyYXRlZ3kgZm9yIHRoZSBzaGFyZWQgb2JqZWN0IHN1cHBvcnQKICAgICBvbiBwbGF0Zm9ybXMgd2hlcmUgbm8gZXhwbGljaXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOiBJZiBhIFBlcmwKICAgICBpbnN0YWxsYXRpb24gZXhpc3RzIHdlIGFzayBpdCBhYm91dCBpdHMgc2hhcmVkIG9iamVjdCBzdXBwb3J0IGFuZCBpZiBpdCdzCiAgICAgdGhlIGRsb3Blbi1zdHlsZSBvbmUgd2Ugc2hhbWVsZXNzbHkgZ3Vlc3MgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MKICAgICBmb3IgY3JlYXRpbmcgc2hhcmVkIG9iamVjdHMgZnJvbSBQZXJscyBrbm93bGVkZ2UuIE9mIGNvdXJzZSwgdGhlIHVzZXIgaXMKICAgICB3YXJuaW5nIGFib3V0IHdoYXQgd2UgYXJlIGRvaW5nIGFuZCBpbmZvcm1lZCB0aGF0IGhlIHNob3VsZCBzZW5kIHVzCiAgICAgdGhlIGd1ZXNzZWQgZmxhZ3Mgd2hlbiB0aGV5IHdvcmsuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQcm92aWRlIEFQQUNJIC0td2l0aG91dC1zdXBwb3J0IG9wdGlvbiB0byBiZSBhYmxlIHRvIGRpc2FibGUgdGhlIGJ1aWxkCiAgICAgYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgc3VwcG9ydCB0b29scyBmcm9tIHRoZSBzcmMvc3VwcG9ydC8gYXJlYS4KICAgICBBbHRob3VnaCBpdHMgdXNlZnVsIHRvIGhhdmUgdGhlc2UgaW5zdGFsbGVkIHBlciBkZWZhdWx0IHdlIHNob3VsZCBwcm92aWRlCiAgICAgYSB3YXkgdG8gY29tcGlsZSBhbmQgaW5zdGFsbCB3aXRob3V0IHRoZW0gZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBvZiB0aGUgbmV3IEFQYWNoZSBlWHRlblNpb24gKGFweHMpIHN1cHBvcnQgdG9vbCBmb3IgYnVpbGRpbmcgYW5kCiAgICAgaW5zdGFsbGluZyBtb2R1bGVzIGludG8gYW4gX2FscmVhZHkgaW5zdGFsbGVkXyBBcGFjaGUgcGFja2FnZSB0aHJvdWdoIHRoZQogICAgIGR5bmFtaWMgc2hhcmVkIG9iamVjdCAoRFNPKSBtZWNoYW5pc20gW21vZF9zby5jXS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdAogICAgIHRoaXMgYXBwcm9hY2ggYWN0dWFsbHkgZG9lc24ndCBuZWVkIHRoZSBBcGFjaGUgc291cmNlIHRyZWUuICBUaGUKICAgICAoQVBBQ0ktaW5zdGFsbGVkKSBzZXJ2ZXIgcGFja2FnZSBpcyBlbm91Z2gsIGJlY2F1c2UgdGhpcyBub3cgaW5jbHVkZXMgdGhlCiAgICAgQXBhY2hlIEMgaGVhZGVyIGZpbGVzIChQUkVGSVgvaW5jbHVkZSkgYW5kIHRoZSBuZXcgQVBYUyB0b29sCiAgICAgKFNCSU5ESVIvYXB4cykuICBUaGUgaW50ZW5kIGlzIHRvIHByb3ZpZGUgYSBoYW5keSB0b29sIGZvciB0aGlyZC1wYXJ0eQogICAgIG1vZHVsZSBhdXRob3JzIHRvIGJ1aWxkIHRoZWlyIEFwYWNoZSBtb2R1bGVzIF9PVVRTSURFXyB0aGUgQXBhY2hlIHNvdXJjZQogICAgIHRyZWUgd2hpbGUgYXZvaWRpbmcgdGhlbSB0byBmaWRkbGUgYXJvdW5kIHdpdGggdGhlIHRvdGFsbHkgcGxhdGZvcm0KICAgICBkZXBlbmRlbmQgd2F5IG9mIGNvbXBpbGluZyBEU08gZmlsZXMuIFRoZSB0b29sIHN1cHBvcnRzIGFsbCByYW5nZXMgb2YKICAgICBtb2R1bGVzLCBmcm9tIHRyaXZpYWwgb25lcyAoc2luZ2xlIG1vZF9mb28uYykgdG8gY29tcGxleCBvbmVzIChsaWtlIFBIUDMKICAgICB3aGljaCBoYXMgYSBtb2RfcGhwMy5jIHBsdXMgYSBwcmUtYnVpbHQgbGlibW9kcGhwMy1zby5hKSBhbmQgZXZlbiBjYW4KICAgICBvbi10aGUtZmx5IGdlbmVyYXRlIGEgbWluaW1hbGlzdGljIE1ha2VmaWxlIGFuZCBzYW1wbGUgbW9kdWxlIGZvciB0aGUKICAgICBmaXJzdCBzdGVwIHRvIHByb3ZpZGUgYm90aCBhIHF1aWNrIHN1Y2Nlc3MgZXZlbnQgYW5kIHRvIGRlbW9uc3RyYXRlIHRoZQogICAgIEFQWFMgbWVjaGFuaXNtIHRvIG1vZHVsZSBhdXRob3JzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGNvcmUgZHVtcHMgaW4gdXNlIG9mIENPTk5FQ1QgaW4gcHJveHkuICAKICAgICBbPFJhaW5lci5TY2hlcmcgcmV4cm90aC5kZT5dIFBSIzEzMjYsICMxNTczLCAjMTk0MgoKICAqKSBNb2RpZnkgdGhlIGxvZyBkaXJlY3RpdmVzIGluIGh0dHBkLmNvbmYtZGlzdCBmaWxlcyB0byB1c2UgQ3VzdG9tTG9nCiAgICAgc28gdGhhdCB1c2VycyBoYXZlIGV4YW1wbGVzIG9mIGhvdyBDdXN0b21Mb2cgY2FuIGJlIHVzZWQuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgQWRkIHRoZSBuZXcgQXBhY2hlIEF1dG9jb25mLXN0eWxlIEludGVyZmFjZSAoQVBBQ0kpIGZvciB0aGUgdG9wLWxldmVsIG9mCiAgICAgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gdHJlZS4gIFVudGlsIEFwYWNoZSAxLjMgdGhlcmUgd2FzIG5vIHJlYWwKICAgICBvdXQtb2YtdGhlLWJveCBiYXRjaC1jYXBhYmxlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGZvciB0aGUKICAgICBjb21wbGV0ZSBBcGFjaGUgcGFja2FnZS4gVGhpcyBpcyBub3cgcHJvdmlkZWQgYnkgYSB0b3AtbGV2ZWwgImNvbmZpZ3VyZSIKICAgICBzY3JpcHQgYW5kIGEgY29ycmVzcG9uZGluZyB0b3AtbGV2ZWwgIk1ha2VmaWxlLnRtcGwiIGZpbGUuICBUaGUgZ29hbCBpcwogICAgIHRvIHByb3ZpZGUgYSBHTlUgQXV0b2NvbmYtc3R5bGUgZnJvbnRlbmQgd2hpY2ggaXMgY2FwYWJsZSB0byBib3RoIGRyaXZlCiAgICAgdGhlIG9sZCBzcmMvQ29uZmlndXJlIHN0dWZmIGluIGJhdGNoIGFuZCBhZGRpdGlvbmFsbHkgaW5zdGFsbHMgdGhlCiAgICAgcGFja2FnZSB3aXRoIGEgR05VLWNvbmZvcm1pbmcgZGlyZWN0b3J5IGxheW91dC4gQW55IG9wdGlvbnMgZnJvbSB0aGUgb2xkCiAgICAgY29uZmlndXJhdGlvbiBzY2hlbWUgYXJlIGF2YWlsYWJsZSBwbHVzIGEgbG90IG9mIG5ldyBvcHRpb25zIGZvciBmbGV4aWJseQogICAgIGN1c3RvbWl6aW5nIEFwYWNoZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFRoZSBmbG9hdGluZyBwb2ludCBhcF9zbnByaW50ZiBjb2RlIHdhc24ndCB0aHJlYWRzYWZlLgogICAgIEhhZCB0byByZW1vdmUgdGhlIEhBVkVfQ1ZUIG1hY3JvIGluIG9yZGVyIHRvIGRvIHRocmVhZHNhZmUKICAgICBjYWxsaW5nIG9mIHRoZSA/Y3Z0KCkgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEFkZCB0aGUgU0NPX1NWIHBvcnQuIFtKaW0gSmFnaWVsc2tpXSBQUiMxOTYyCgogICopIFBPUlQ6IElSSVggbmVlZHMgdGhlIC1uMzIgZmxhZyBpZmYgdXNpbmcgdGhlICdjYycgY29tcGlsZXIKICAgICBbSmltIEphZ2llbHNraV0gUFIjMTkwMQoKICAqKSBCVUc6IENvbmZpZ3VyZSB3YXMgdXNpbmcgVENDIGFuZCBDQyBpbmNvbnNpc3RlbnRseS4gTWFrZSBzdXJlCiAgICAgQ29uZmlndXJlIGtub3dzIHdoaWNoIENDIHdlIGFyZSB1c2luZy4gW0ppbSBKYWdpZWxza2ldCgogICopICJPcHRpb25zICtJbmNsdWRlcyIgd2Fzbid0IGNvcnJlY3RseSBtZXJnZWQgaWYgIitJbmNsdWRlc05vRXhlYyIKICAgICB3YXMgZGVmaW5lZCBpbiBhIHBhcmVudCBkaXJlY3RvcnkuIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEFQSTogYXBfc25wcmludGYoKSBjb2RlIG11dGF0ZWQgaW50byBhcF92Zm9ybWF0dGVyKCksIHdoaWNoIGlzCiAgICAgYSBnZW5lcmljIHByaW50Zi1zdHlsZSByb3V0aW5lIHRoYXQgY2FuIGNhbGwgYXJiaXRyYXJ5IG91dHB1dAogICAgIHJvdXRpbmVzLiAgVXNlIHRoaXMgdG8gcmVwbGFjZSBodHRwX2JwcmludGYuYy4gIEFkZCBuZXcgcm91dGluZXMKICAgICBwc3ByaW50ZigpLCBwdnNwcmludGYoKSB3aGljaCBhbGxvY2F0ZSB0aGUgZXhhY3QgYW1vdW50IG9mIG1lbW9yeQogICAgIHJlcXVpcmVkIGZvciBhIHN0cmluZyBmcm9tIGEgcG9vbC4gIFVzZSBwc3ByaW50ZigpIHRvIGNsZWFuIHVwCiAgICAgdmFyaW91cyBiaXRzIG9mIGNvZGUgd2hpY2ggdXNlZCBhcF9zbnByaW50ZigpL3BzdHJkdXAoKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEhBVkVfU05QUklOVEYgZG9lc24ndCBkbyBhbnl0aGluZyBhbnkgbG9uZ2VyLiAgVGhpcyBpcyBiZWNhdXNlCiAgICAgYXBfc25wcmludGYoKSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBhbmQgZm9ybWF0dGluZyBjb2RlcyB0aGFuCiAgICAgc25wcmludGYoKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0lHWENQVSBhbmQgU0lHWEZTWiBhcmUgbm93IHJlc2V0IHRvIFNJR19ERkwgYXQgYm9vdC10aW1lLiAgVGhpcwogICAgIGlzIG5lY2Vzc2FyeSBvbiBhdCBsZWFzdCBTb2xhcmlzIHdoZXJlIHRoZSAvZXRjL3JjPy5kIHNjcmlwdHMKICAgICBhcmUgcnVuIHdpdGggdGhlc2Ugc2lnbmFscyBpZ25vcmVkLCBhbmQgIlNJR19JR04iIHNldHRpbmdzIGFyZQogICAgIG1haW50YWluZWQgYWNyb3NzIGV4ZWMoKS4KICAgICBbUmVpbiBUb2xsZXZpayA8cmVpbnQgc3lzLnNvbC5ubz5dIFBSIzIwMDkKCiAgKikgRml4IHRoZSBjaGVjayBmb3Igc3ltYm9saWMgbGlua3MgaW4gYGBSZXdyaXRlQ29uZCAuLi4gLWwnJzogc3RhdCgpIHdhcwogICAgIHVzZWQgaW5zdGVhZCBvZiBsc3RhdCgpIGFuZCB0aHVzIHRoaXMgZmxhZyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4KICAgICBbUmVpbiBUb2xsZXZpayA8cmVpbnQgc3lzLnNvbC5ubz5dIFBSIzIwMTAKCiAgKikgRml4IHRoZSBwcm94eSBwYXNzLXRocm91Z2ggZmVhdHVyZSBvZiBtb2RfcmV3cml0ZSBmb3IgdGhlIGNhc2Ugb2YKICAgICBleGlzdGluZyBRVUVSWV9TVFJJTkcgbm93IHRoYXQgbW9kX3Byb3h5IHdhcyByZWNlbnRseSBjaGFuZ2VkIGJlY2F1c2Ugb2YKICAgICB0aGUgbmV3IFVSTCBwYXJzaW5nIHN0dWZmLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgY2hhbmdlcyB0byBzY29yZWJvYXJkIGRlZmluaXRpb25zIHdoaWNoIGhlbHBzIGdjYyBnZW5lcmF0ZQogICAgIGJldHRlciBjb2RlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBTlNJIEMgZG9lc24ndCBndWFyYW50ZWUgdGhhdCAiaW50IGZvbyA6IDIiIGluIGEgc3RydWN0dXJlIHdpbGwKICAgICBiZSBhIHNpZ25lZCBiaXRmaWVsZC4gIFNvIG1hcmsgYSBmZXcgYml0ZmllbGRzIGFzIHNpZ25lZCB0bwogICAgIGVuc3VyZSBjb3JyZWN0IGNvZGUuICBbRGVhbiBHYXVkZXRdCgogICopIFRoZSBkZWZhdWx0IGZvciBIb3N0bmFtZUxvb2t1cHMgd2FzIGNoYW5nZWQgdG8gT2ZmLCBidXQgdGhlcmUKICAgICB3YXMgYSBwcm9ibGVtIGFuZCBpdCB3YXNuJ3QgdGFraW5nIGVmZmVjdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBDbGVhbiB1cCB1bmRlZmluZWQgc2lnbmFscyBvbiBzb21lIHBsYXRmb3JtcyAoU0NPLCBCZU9TKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFmdGVyIGEgU0lHSFVQIHRoZSBsaXN0ZW5pbmcgc29ja2V0cyBpbiB0aGUgcGFyZW50IHdlcmVuJ3QKICAgICBwcm9wZXJseSBtYXJrZWQgZm9yIGNsb3N1cmUgb24gZm9yaygpLgogICAgIFtK/HJnZW4gS2VpbCA8amsgdG9vbHMuZGU+XSBQUiMyMDAwCiAKICAqKSBBbGxvdyAlMkYgaW4gdHdvIHNpdHVhdGlvbnM6IDEpIGl0IGlzIGluIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkksCiAgICAgdGhlcmVmb3JlIG5vdCBleHBvc2VkIHRvICUyRiAtPiAnLycgdHJhbnNsYXRpb25zIGFuZCAyKSB0aGUgcmVxdWVzdAogICAgIGlzIGEgcHJveHkgcmVxdWVzdCwgc28gd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIGxvY2FsIHJlc291cmNlIGFueXdheS4KICAgICBXaXRob3V0IHRoaXMsIHRoZSBwcm94eSB3b3VsZCBmYWlsIHRvIHdvcmsgZm9yIGFueSBVUkwncyB3aXRoCiAgICAgJTJmIGluIHRoZW0gKG9jY3VycyBxdWl0ZSBvZnRlbiBpbgogICAgIGh0dHA6Ly8uLi4vY2dpLWJpbi8uLi4/aHR0cCUzQSUyRiUyRi4uLiByZWZlcmVuY2VzKSBbTWFydGluIEtyYWVtZXJdCgogICopIFByb3RlY3QgYWdhaW5zdCBGRF9TRVRTSVpFIG1pc21hdGNoZXMuICBbRGVhbiBHYXVkZXRdCgogICopIE1ha2UgdGhlIHNoYXJlZCBvYmplY3QgY29tcGlsYXRpb24gY29tbWFuZCBtb3JlIHBvcnRhYmxlIGJ5IGF2b2lkaW5nCiAgICAgdGhlIGRpcmVjdCBjb21iaW5hdGlvbiBvZiBgLWMnICYgYC1vJyB3aGljaCBpcyBub3QgaG9ub3JlZCBieSBzb21lCiAgICAgY29tcGlsZXJzIGxpa2UgVW5peFdhcmUncyBjYy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdJTjMyOiB0aGUgcHJveHkgd2FzIGNyZWF0aW5nIGZpbGVuYW1lcyBtaXNzaW5nIHRoZSBsYXN0IGZvdXIKICAgICBjaGFyYWN0ZXJzLiAgV2hpbGUgdGhpcyBub3JtYWxseSBkb2Vzbid0IHN0b3AgYW55dGhpbmcgZnJvbSAKICAgICB3b3JraW5nLCBpdCBjYW4gcmVzdWx0IGluIGV4dHJhIGNvbGxpc2lvbnMuICAKICAgICBbVGltIENvc3RlbGxvIDx0amNvc3RlbCBzb2NzLnV0cy5lZHUuYXU+XSBQUiMxODkwCgogICopIE5vdyBtb2RfcHJveHkgdXNlcyB0aGUgcmVzcG9uc2Ugc3RyaW5nIChpbiBhZGRpdGlvbiB0byB0aGUgcmVzcG9uc2Ugc3RhdHVzCiAgICAgY29kZSkgZnJvbSB0aGUgYWxyZWFkeSB1c2VkIEZUUCBTSVpFIGNvbW1hbmQgdG8gc2V0dXAgdGhlIENvbnRlbnQtTGVuZ3RoCiAgICAgaGVhZGVyIGlmIGF2YWlsYWJsZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzExODMKCiAgKikgUmVhbmltYXRlZCB0aGUgKHN0aWxsIHVuZG9jdW1lbnRlZCkgcHJveHkgcmVjZWl2ZSBidWZmZXIgc2l6ZSBkaXJlY3RpdmU6CiAgICAgUmVuYW1lZCBmcm9tIFJlY2VpdmVCdWZmZXJTaXplIHRvIFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUgYmVjYXVzZSB0aGUgb2xkCiAgICAgbmFtZSB3YXMgcmVhbGx5IHRvbyBnZW5lcmljLCBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGRpcmVjdGl2ZSB0bwogICAgIHRoZSBtb2RfcHJveHkuaHRtbCBhbmQgY29ycmVjdGVkIHRoZSBoeXBlcmxpbmsgdG8gaXQgaW4gdGhlCiAgICAgbmV3X2ZlYXR1cmVzXzEuMy5odG1sIGRvY3VtZW50LiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzEzNDgKCiAgKikgRml4IGEgYnVnIGluIHRoZSBzcmMvaGVscGVycy9mcDJycCBzY3JpcHQgYW5kIG1ha2UgaXQgYSBsaXR0bGUgYml0CiAgICAgZmFzdGVyIFtNYXJ0aW4gS3JhZW1lcl0KICAKICAqKSBNYWtlIENvbmZpZ3VyZSBkaWUgd2hlbiB5b3UgZ2l2ZSBpdCBhbiB1bmtub3duIGNvbW1hbmQgc3dpdGNoLgogICAgIFtCZW4gSHlkZV0KCiAgKikgQWRkIGZpdmUgbmV3IGFuZCBmcmVzaCBtYW5wYWdlcyBmb3IgdGhlIHN1cHBvcnQgcHJvZ3JhbXM6IGRibW1hbmFnZS4xLAogICAgIHN1ZXhlYy44LCBodGRpZ2VzdC4xLCByb3RhdGVsb2dzLjggYW5kIGxvZ3Jlc29sdmUuOC4gIE5vdyBhbGwgdXAtdG8tZGF0ZQogICAgIGFuZCBwZXIgZGVmYXVsdCBjb21waWxlZCBzdXBwb3J0IHByb2dyYW1zIGhhdmUgbWFudWFsIHBhZ2VzIC0ganVzdCB0bwogICAgIGRvY3VtZW50IG91ciBzdHVmZiBhIGxpdHRsZSBiaXQgbW9yZSBhbmQgdG8gYmUgYWJsZSB0byBkbyByZWFsbHkKICAgICBVbml4LWxpa2UgaW5zdGFsbGF0aW9ucyA7LSkgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ham9yIGNsZWFudXBzIHRvIHRoZSBDb25maWd1cmUgc2NyaXB0IHRvIG1ha2UgaXQgYW5kIGl0cyBnZW5lcmF0ZWQKICAgICBNYWtlZmlsZXMgYWdhaW4gcmVhZGFibGUgYW5kIG1haW50YWluYWJsZTogYWRkIFNSQ0RJUiBvcHRpb24sIHJlbW92ZWQKICAgICBJTkNMVURFU19ERVBUSFswLTJdIGtsdWRnZSwgY2xlYW51cCBvZiBUQVJHRVQgb3B0aW9uLCBjbGVhbnVwIG9mCiAgICAgZ2VuZXJhdGVkIHNlY3Rpb25zLCBjb25zZXF1ZW50bHkgYWRkZWQgTWFrZWZpbGUgaGVhZGVycyB3aXRoIGluaGVyaXRhbmNlCiAgICAgaW5mb3JtYXRpb24sIGFkZGVkIHN1YmRpciBtb3ZlbWVudCBtZXNzYWdlcyBmb3IgZWFzaWVyIGZvbGxvd2luZyB3aGVyZQogICAgIHRoZSBidWlsZCBwcm9jZXNzIGN1cnJlbnRseSBzdGF5cyAobW9yZSB2ZXJib3NlIHRoZW4gc3RhbmRhcmQgTWFrZSwgbGVzcwogICAgIHZlcmJvc2UgdGhhbiBHTlUgbWFrZSksIHNhbWUgc3R5bGUgdG8gY29tbWVudHMgaW4gdGhlIENvbmZpZ3VyZSBzY3JpcHQsCiAgICAgYWRkZWQgQXBhY2hlIGxpY2Vuc2UgaGVhZGVyLCBmaXhlZCBhIGZldyBidWdzLCBldGMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogICAgIAogICopIEFkZCB0aGUgbmV3IEFwYWNoZUJlbmNoIHByb2dyYW0gImFiIiB0byBzcmMvc3VwcG9ydC86IFRoaXMgaXMgZGVyaXZlZAogICAgIGZyb20gdGhlIFpldXNCZW5jaCBiZW5jaG1hcmtpbmcgcHJvZ3JhbSBhbmQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQogICAgIHJlc3BvbnNlIHBlcmZvcm1hbmNlIG9mIGFuIEFwYWNoZSBpbnN0YWxsYXRpb24uIFRoaXMgdmVyc2lvbiBpcwogICAgIG9mZmljaWFsbHkgbGljZW5zZWQgd2l0aCBaZXVzIFRlY2hub2xvZ3ksIEx0ZC4gU2VlIHRoZSBsaWNlbnNlIGFncmVlbWVudAogICAgIHN0YXRlbWVudHMgaW4gPDE5OTgwMzE3MTIyNC5OQUEyNDU0NyBlbjEuZW5nZWxzY2hhbGwuY29tPiBpbiBhcGFjaGUtY29yZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBJOiBWYXJpb3VzIGNvcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluYXRlbHkgbm90IHBhcnQgb2YgdGhlIEFQSQogICAgIGhhdmUgYmVlbiBtYWRlIHN0YXRpYywgYW5kIGEgZmV3IGhhdmUgYmVlbiBtYXJrZWQgQVBJX0VYUE9SVC4gIFN0aWxsCiAgICAgbW9yZSBoYXZlIGJlZW4gbWFya2VkIENPUkVfRVhQT1JUIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsCiAgICAgdXNlIGJ5IG1vZHVsZXMuICBbRG91ZyBNYWNFYWNoZXJuLCBEZWFuIEdhdWRldF0KCiAgKikgbW9kX3Byb3h5IHdhcyBub3QgY2xlYXJpbmcgdGhlIFByb3h5LUNvbm5lY3Rpb24gaGVhZGVyIGZyb20KICAgICByZXF1ZXN0czsgbm93IGl0IGRvZXMuICBUaGlzIGRpZCBub3QgdmlvbGF0ZSBhbnkgc3BlYywgaG93ZXZlciAKICAgICBjYXVzZXMgcG9vciBpbnRlcmFjdGlvbnMgd2hlbiB5b3UgYXJlIHRhbGtpbmcgdG8gcmVtb3RlIHByb3hpZXMuICAKICAgICBbTWFyYyBTbGVta29dIFBSIzE3NDEKCiAgKikgVmFyaW91cyBjbGVhbnVwcyB0byB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSBhbmQgbWFudWFsIHBhZ2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBjZmdfZ2V0bGluZSgpIHdhcyBub3QgcHJvcGVybHkgaGFuZGxpbmcgbGluZXMgdGhhdCBkaWQgbm90IGVuZAogICAgIHdpdGggYSBsaW5lIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIFtNYXJjIFNsZW1rb10gUFIjMTg2OSwgMTkwOQoKICAqKSBQZXJmb3JtYW5jZSB0d2VhayB0byBtb2RfbG9nX2NvbmZpZy4gIFtEbWl0cnkgS2hydXN0YWxldl0KCiAgKikgQ2xlYW4gdXAgc29tZSB1bmRvY3VtZW50ZWQgYmVoYXZpb3Igb2YgbW9kX3NldGVudmlmIHJlbGF0ZWQgdG8KICAgICAibWVyZ2luZyIgdHdvIFNldEVudklmIGRpcmVjdGl2ZXMgd2hlbiB0aGV5IG1hdGNoIHRoZSBzYW1lIGhlYWRlcgogICAgIGFuZCByZWdleC4gIERvY3VtZW50IHRoYXQgbW9kX3NldGVudmlmIHdpbGwgcGVyZm9ybSBjb21wYXJpc29ucyBpbgogICAgIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlnIGZpbGUuICBPcHRpbWl6ZSBtb2Rfc2V0ZW52aWYgYnkKICAgICBkb2luZyBtb3JlIHdvcmsgYXQgY29uZmlnIHRpbWUgcmF0aGVyIHRoYW4gYXQgcnVudGltZS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIHNyYy9pbmNsdWRlL2FwX2NvbmZpZy5oIG5vdyB3cmFwcyBpdCdzICNkZWZpbmUncyB3aXRoICNpZm5kZWYvI2VuZGlmJ3MKICAgICB0byBhbGxvdyBmb3IgbW9kdWxlcyB0byBvdmVycnVsZSB0aGVtIGFuZCB0byByZWR1Y2UgcmVkZWZpbml0aW9uCiAgICAgd2FybmluZ3MgW0ppbSBKYWdpZWxza2ldCgogICopIFtQT1JUXSBGb3IgQS9VWCBjaGFuZ2UgdGhlIE9TLSNkZWZpbmUgZm9yIC1EQVVYIHRvIC1EQVVYMy4KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgTWFraW5nIHRoZSBoYXJkLWNvZGVkIGNyb3NzLW1vZHVsZSBmdW5jdGlvbiBjYWxsIG1pbWVfZmluZF9jdCgpIChmcm9tCiAgICAgbW9kX3Byb3h5IHRvIG1vZF9taW1lKSBvYnNvbGV0ZSBieSBtYWtpbmcgc3VyZSB0aGUgQVBJIGhvb2sgZm9yIE1JTUUgdHlwZQogICAgIGNoZWNraW5nIGlzIHJlYWxseSBjYWxsZWQgZXZlbiBmb3IgcHJveHkgcmVxdWVzdHMgZXhjZXB0IGZvciBVUkxzIHdpdGgKICAgICBIVFRQIHNjaGVtZXMgKGJlY2F1c2UgdGhlcmUgd2UgY2FuIG9wdGltaXplIGJ5IG5vdCBydW5uaW5nIHRoZSB0eXBlCiAgICAgY2hlY2tpbmcgaG9va3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHByb3h5IGdldHMgdGhlIE1JTUUgQ29udGVudC10eXBlCiAgICAgZnJvbSB0aGUgcmVtb3RlIGhvc3QgbGF0ZXIpLiBUaGlzIGNoYW5nZSBjbGVhbnMgdXAgbW9kX21pbWUgYnkgcmVtb3ZpbmcKICAgICB0aGUgdWdseSBleHBvcnQga2x1ZGdlLCBtYWtlcyB0aGUgb25lLWxpbmVyIGZpbGUgbW9kX21pbWUuaCBvYnNvbGV0ZSwgYW5kCiAgICAgZXNwZWNpYWxseSB1bmJ1bmRsZXMgbW9kX3Byb3h5IGFuZCBtb2RfbWltZS4gVGhpcyB3YXkgdGhleSBib3RoIG5vdyBjYW4KICAgICBiZSBjb21waWxlZCBhcyBzaGFyZWQgb2JqZWN0cyBhbmQgYXJlIG5vIGxvbmdlciB0aWVkIHRvZ2V0aGVyLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgdXRpbC5jIGNsZWFudXAgYW5kIHNwZWVkdXAuIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBDbGFyaWZpY2F0aW9uLCBwc3RybmR1cCgpIHdpbGwgYWx3YXlzIGNvcHkgbiBieXRlcyBvZiB0aGUgc291cmNlCiAgICAgYW5kIE5VTCB0ZXJtaW5hdGUgYXQgdGhlIChuKzEpc3QgYnl0ZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgTWFyayBtb2R1bGUgY29tbWFuZF9yZWMgYW5kIGhhbmRsZXJfcmVjIHN0cnVjdHVyZXMgY29uc3Qgc28gdGhhdCB0aGV5CiAgICAgZW5kIHVwIGluIHRoZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9uIChhbmQgYXJlIGZyaWVuZGxpZXIgdG8gc3lzdGVtcwogICAgIHRoYXQgZG9uJ3QgZG8gb3B0aW1pc3RpYyBtZW1vcnkgYWxsb2NhdGlvbiBvbiBmb3JrKCkpLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZCBjaGVjayB0byB0aGUgIlBvcnQiIGRpcmVjdGl2ZSB0byBtYWtlIHN1cmUgdGhlIHNwZWNpZmllZCAKICAgICBwb3J0IGlzIGluIHRoZSBhcHByb3ByaWF0ZSByYW5nZS4gIFtCZW4gSHlkZV0KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIGludm9rZV9oYW5kbGVyKCkuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIGJvZy5tc3Uuc3U+XQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyBzaGFyZWQgb2JqZWN0cyBldmVuIGZvciBsaWJyYXJ5LXN0eWxlIG1vZHVsZXMKICAgICAod2hpY2ggYXJlIGJ1aWx0IGZyb20gbW9yZSB0aGFuIG9uZSBvYmplY3QgZmlsZSkuIFRoaXMgbm93IHByb3ZpZGVzIHRoZQogICAgIGFiaWxpdHkgdG8gYnVpbGQgbW9kX3Byb3h5IGFzIGEgc2hhcmVkIG9iamVjdCBtb2R1bGUuIEFkZGl0aW9uYWxseQogICAgIG1vZHVsZXMgbGlrZSBtb2RfZXhhbXBsZSBhcmUgbm93IGFsc28gc3VwcG9ydGVkIGZvciBzaGFyZWQgb2JqZWN0CiAgICAgYnVpbGRpbmcgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlcyBub3cgbm8gbG9uZ2VyIGFzc3VtZSB0aGVyZSBpcyBhdAogICAgIGxlYXN0IG9uZSBzdGF0aWNhbGx5IGxpbmtlZCBtb2R1bGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBUEk6IENsYXJpZnkgdXNhZ2Ugb2YgY29udGVudF90eXBlLCBoYW5kbGVyLCBjb250ZW50X2VuY29kaW5nLAogICAgIGNvbnRlbnRfbGFuZ3VhZ2UgYW5kIGNvbnRlbnRfbGFuZ3VhZ2VzIGZpZWxkcyBpbiByZXF1ZXN0X3JlYy4gIFRoZXkKICAgICBtdXN0IGFsd2F5cyBiZSBsb3dlcmNhc2VkOyBhbmQgdGhlIHN0cmluZ3MgcG9pbnRlZCB0byBzaG91bGRuJ3QKICAgICBiZSBtb2RpZmllZCAoeW91IG11c3QgY29weSB0aGVtIHRvIG1vZGlmeSB0aGVtKS4gIEZpeCBhIGZldyBidWdzCiAgICAgcmVsYXRlZCB0byB0aGlzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IENsYXJpZmljYXRpb246IGV4Y2VwdCBmb3IgUkFXX0FSR1MsIGFsbCBjb21tYW5kIGhhbmRsZXJzIGNhbgogICAgIHRyZWF0IHRoZSBjaGFyICogcGFyYW1ldGVycyBhcyBwZXJtYW5lbnQsIGFuZCBtb2RpZmlhYmxlLiAgVGhlcmUKICAgICBpcyBubyBuZWVkIHRvIHBzdHJkdXAoKSB0aGVtLiAgQ2xlYW4gdXAgc29tZSBuZWVkbGVzcyBwc3RyZHVwKCkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBOb3cgbW9kX3NvIGtlZXBzIHRyYWNrIG9mIHdoaWNoIG1vZHVsZSBzaGFyZWQgb2JqZWN0cyB3aXRoIHdoaWNoIG5hbWVzCiAgICAgYXJlIGxvYWRlZCBhbmQgdGh1cyBhdm9pZHMgbXVsdGlwbGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIGFuZCBpcnJpdGF0aW5nCiAgICAgZXJyb3JfbG9nIG1lc3NhZ2VzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUHJpb3IgdG8gdGhlIGV4aXN0ZW5jZSBvZiBtb2Rfc2V0ZW52IGl0IHdhcyBuZWNlc3NhcnkgdG8gdHdlYWsgdGhlIFRaCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGFwYWNoZSBjb3JlLiAgQnV0IHRoYXQgdHdlYWtpbmcgaW50ZXJmZXJlcwogICAgIHdpdGggbW9kX3NldGVudi4gIFNvIGRvbid0IHR3ZWFrIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYW4gZXhwbGljaXQKICAgICBUWiB2YXJpYWJsZS4gIFtKYXkgU29mZmlhbiA8amF5IGNpbWVkaWEuY29tPl0gUFIjMTg4OAoKICAqKSBycHV0cygpIGRpZCBub3QgY2FsY3VsYXRlIHItPnNlbnRfYm9keWN0IHByb3Blcmx5LgogICAgIFtTaWVnbXVuZCBTdGlybndlaXNzIDxzaWVnc3Qga2F0LmluYS5kZT5dIFBSIzE5MDAKCiAgKikgVGhlIENHSSBzcGVjIHNheXMgdGhhdCBSRU1PVEVfSE9TVCBzaG91bGQgYmUgc2V0IHRvIHRoZSByZW1vdGUgaG9zdHMncwogICAgIG5hbWUsIG9yIGxlZnQgdW5zZXQgaWYgdGhpcyB2YWx1ZSBpcyB1bmF2YWlsYWJsZS4gIEFwYWNoZSB3YXMgc2V0dGluZwogICAgIGl0IHRvIHRoZSBJUCBhZGRyZXNzIHdoZW4gdW5hdmFpbGFibGUuCiAgICAgW1RvbnkgRmluY2ggPGZhbmYgZGVtb24ubmV0Pl0gUFIjMTkyNQoKICAqKSBWYXJpb3VzIGltcHJvdmVtZW50cyB0byB0aGUgY29uZmlndXJhdGlvbiBhbmQgYnVpbGQgc3VwcG9ydCBmb3IgY29tcGlsaW5nCiAgICAgbW9kdWxlcyBhcyBzaGFyZWQgb2JqZWN0cy4gRXNwZWNpYWxseSBTb2xhcmlzIDIueCwgU3VuT1MgNC4xLCBJUklYIGFuZAogICAgIE9TRjEgc3VwcG9ydCB3aXRoIEdDQyBhbmQgdmVuZG9yIGNvbXBpbGVycyB3YXMgYWRkZWQuICBUaGlzIHdheSBzaGFyZWQKICAgICBvYmplY3Qgc3VwcG9ydCBpcyBub3cgcHJvdmlkZWQgb3V0LW9mLXRoZS1ib3ggZm9yIEZyZWVCU0QsIExpbnV4LAogICAgIFNvbGFyaXMsIFN1bk9TLCBJUklYIGFuZCBPU0YxLiBJbiBzaG9ydDogT24gYWxsIG1ham9yIHBsYXRmb3JtcyEKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWlub3IgY2xlYW51cCBpbiBodHRwX21haW4gLS0gc3BsaXQgUU5YIGFuZCBPUzIgc3BlY2lmaWMgIm1tYXAiCiAgICAgc2NvcmVib2FyZCBjb2RlIGludG8gc2VwYXJhdGUgI2RlZmluZXMgLS0gVVNFX1BPU0lYX1NDT1JFQk9BUkQKICAgICBhbmQgVVNFX09TMl9TQ09SRUJPQVJELiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggb25lIG1vcmUgc3BlY2lhbCBsb2NraW5nIHByb2JsZW0gZm9yIFJld3JpdGVNYXAgcHJvZ3JhbXMgaW4KICAgICBtb2RfcmV3cml0ZTogQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGZsb2NrKCksICJMb2NrcyBhcmUgb24KICAgICBmaWxlcywgbm90IGZpbGUgZGVzY3JpcHRvcnMuICBUaGF0IGlzLCBmaWxlIGRlc2NyaXB0b3JzIGR1cGxpY2F0ZWQKICAgICB0aHJvdWdoIGR1cCgyKSBvciBmb3JrKDIpIGRvIG5vdCByZXN1bHQgaW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGEgbG9jaywKICAgICBidXQgcmF0aGVyIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gYSBzaW5nbGUgbG9jay4gSWYgYSBwcm9jZXNzIGhvbGRpbmcgYQogICAgIGxvY2sgb24gYSBmaWxlIGZvcmtzIGFuZCB0aGUgY2hpbGQgZXhwbGljaXRseSB1bmxvY2tzIHRoZSBmaWxlLCB0aGUKICAgICBwYXJlbnQgd2lsbCBsb3NlIGl0cyBsb2NrLiIuIFRvIG92ZXJjb21lIHRoaXMgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlCiAgICAgUmV3cml0ZUxvY2sgZmlsZSBpcyBvcGVuZWQgX0FGVEVSXyB0aGUgY2hpbGRzIHdlcmUgc3Bhd25lZCB3aGljaCBpcyBub3cKICAgICB0aGUgY2FzZSBieSBvcGVuaW5nIGl0IGluIHRoZSBjaGlsZF9pbml0IGluc3RlYWQgb2YgdGhlIG1vZHVsZV9pbml0IEFQSQogICAgIGhvb2suIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMDI5CgogICopIENoYW5nZSB0byBMb2NhdGlvbiBhbmQgTG9jYXRpb25NYXRjaCBzZW1hbnRpY3MuICBMb2NhdGlvbk1hdGNoIG5vCiAgICAgbG9uZ2VyIGxldHMgYSBzaW5nbGUgc2xhc2ggbWF0Y2ggbXVsdGlwbGUgYWRqYWNlbnQgc2xhc2hlcyBpbiB0aGUKICAgICBVUkwuICBUaGlzIGNoYW5nZSBpcyBmb3IgY29uc2lzdGVuY3kgd2l0aCBSZXdyaXRlUnVsZSBhbmQKICAgICBBbGlhc01hdGNoLiAgTXVsdGlwbGUgc2xhc2hlcyBoYXZlIG1lYW5pbmcgaW4gVVJMcyB0aGF0IHRoZXkgZG8KICAgICBub3QgaGF2ZSBpbiAoc29tZSkgZmlsZXN5c3RlbXMuICBMb2NhdGlvbiBvbiB0aGUgb3RoZXIgaGFuZCBjYW4KICAgICBiZSBjb25zaWRlcmVkIGEgc2hvcnRoYW5kIGZvciBhIG1vcmUgY29tcGxpY2F0ZWQgcmVnZXgsIGFuZCBpdAogICAgIGRvZXMgbWF0Y2ggbXVsdGlwbGUgc2xhc2hlcyB3aXRoIGEgc2luZ2xlIHNsYXNoIC0tIHdoaWNoIGlzCiAgICAgYWxzbyBjb25zaXN0ZW50IHdpdGggdGhlIEFsaWFzIGRpcmVjdGl2ZS4KICAgICBbRGVhbiBHYXVkZXRdIHJlbGF0ZWQgUFIjMTQ0MAoKICAqKSBGaXggYnVnIHdpdGggbW9kX21pbWVfbWFnaWMgY2F1c2luZyBjZXJ0YWluIGZpbGVzLCBpbmNsdWRpbmcgZmlsZXMKICAgICBvZiBsZW5ndGggMCwgdG8gcmVzdWx0IGluIG5vIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFRoZSBDb25maWd1cmUgc2NyaXB0IG5vdyBnZW5lcmF0ZXMgc3JjL2luY2x1ZGUvYXBfY29uZmlnLmggd2hpY2gKICAgICBjb250YWlucyB0aGUgc2V0IG9mIGRlZmluZXMgdXNlZCB3aGVuIEFwYWNoZSBpcyBjb21waWxlZCBvbiBhIHBsYXRmb3JtLgogICAgIFRoaXMgZmlsZSBjYW4gdGhlbiBiZSBpbmNsdWRlZCBieSBleHRlcm5hbCBtb2R1bGVzIGJlZm9yZSBpbmNsdWRpbmcKICAgICBhbnkgQXBhY2hlIGhlYWRlciBmaWxlcyBpbiBjYXNlIHRoZXkgYXJlIGJlaW5nIGJ1aWx0IHNlcGFyYXRlbHkgZnJvbQogICAgIEFwYWNoZS4gIEFsb25nIHdpdGggdGhpcyBjaGFuZ2UsIGEgY291cGxlIG9mIG1pbm9yIGNoYW5nZXMgd2VyZQogICAgIG1hZGUgdG8gbWFrZSBBcGFjaGUncyAjZGVmaW5lcyBjb2V4aXN0IHBlYWNlZnVsbHkgd2l0aCBhbnkgYXV0b2NvbmYKICAgICBkZWZpbmVzIGFuIGV4dGVybmFsIG1vZHVsZSBtaWdodCBoYXZlLiBbUmFzbXVzIExlcmRvcmZdCgogICopIEZpeCBtb2RfcmV3cml0ZSBmb3IgdGhlIHVnbHkgQVBJIGNhc2Ugd2hlcmUgPFZpcnR1YWxIb3N0PiBzZWN0aW9ucyBleGlzdAogICAgIGJ1dCB3aXRob3V0IGFueSBSZXdyaXRlWFhYWFggZGlyZWN0aXZlcy4gSGVyZSBtb2RfcmV3cml0ZSBpcyBnaXZlbiBubwogICAgIGNoYW5jZSBieSB0aGUgQVBJIHRvIGluaXRpYWxpemUgaXRzIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiBhbmQgdGh1cwogICAgIHJlY2VpdmVzIHRoZSB3cm9uZyBvbmUgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuIFRoaXMgaXMgbm93IGF2b2lkZWQgYnkKICAgICByZW1lbWJlcmluZyB0aGUgc2VydmVyIHRvZ2V0aGVyIHdpdGggdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgd2hpbGUKICAgICBjb25maWd1cmluZyBhbmQgbGF0ZXIgYXNzdW1pbmcgdGhlcmUgaXMgbm8gY29uZmlnIHdoZW4gd2Ugc2VlIGEKICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbWVtYmVyZWQgc2VydmVyIGFuZCB0aGUgb25lIGNhbGxpbmcgdXMuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNzkwCgogICopIEZpeGVkIHRoZSBEQk0gUmV3cml0ZU1hcCBzdXBwb3J0IGZvciBtb2RfcmV3cml0ZTogRmlyc3QgdGhlIHN1cHBvcnQgbm93CiAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCB1bmRlciBjb25maWd1cmUgdGltZSB3aGVuIHRoZSBkYm1feHh4IGZ1bmN0aW9ucwogICAgIGFyZSBub3QgYXZhaWxhYmxlLiBTZWNvbmQsIHR3byBoZWF2eSBzb3VyY2UgY29kZSBlcnJvcnMgaW4gdGhlIERCTQogICAgIHN1cHBvcnQgY29kZSB3ZXJlIGZpeGVkLiAgVGhpcyBtYWtlcyBEQk0gUmV3cml0ZU1hcCdzIHVzYWJsZSBhZ2FpbiBhZnRlcgogICAgIGEgbG9uZyB0aW1lIG9mIGJyb2tlbm5lc3MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNjk2CgogICopIE5vdyBhbGwgY29uZmlndXJhdGlvbiBmaWxlcyBzdXBwb3J0IFVuaXgtc3R5bGUgbGluZS1jb250aW51YXRpb24gdmlhIAogICAgIHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggKCJcIikgY2hhcmFjdGVyLiBUaGlzIGVuYWJsZXMgdXMgdG8gd3JpdGUgZG93bgogICAgIGNvbXBsZXggb3IganVzdCB2ZXJ5IGxvbmcgZGlyZWN0aXZlcyBpbiBhIG1vcmUgcmVhZGFibGUgd2F5LiAgVGhlCiAgICAgYmFja3NsYXNoIGNoYXJhY3RlciBoYXMgdG8gYmUgcmVhbGx5IHRoZSBsYXN0IGNoYXJhY3RlciBiZWZvcmUgdGhlCiAgICAgbmV3bGluZSBhbmQgaXQgaGFzIG5vdCBiZWVuIHByZWZpeGVkIGJ5IGFub3RoZXIgKGVzY2FwaW5nKSBiYWNrc2xhc2guCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdoZW4gdXNpbmcgUHJveHlQYXNzIHRoZSA/cXVlcnlzdHJpbmcgd2FzIG5vdCBwYXNzZWQgY29ycmVjdGx5LgogICAgIFtKb2VsIFRydWhlciA8dHJ1aGVyIHdpcmVkLmNvbT5dCgogICopIFRvIGRlYWwgd2l0aCBtb2R1bGVzIGJlaW5nIGNvbXBpbGVkIGFuZCBbZHluYW1pY2FsbHldIGxpbmtlZAogICAgIGF0IGEgZGlmZmVyZW50IHRpbWUgZnJvbSB0aGUgY29yZSwgdGhlIFNFUlZFUl9WRVJTSU9OIGFuZAogICAgIFNFUlZFUl9CVUlMVCBzeW1ib2xzIGhhdmUgYmVlbiBhYnN0cmFjdGVkIHRocm91Z2ggdGhlIG5ldwogICAgIEFQSSByb3V0aW5lcyBhcGFwaV9nZXRfc2VydmVyX3ZlcnNpb24oKSBhbmQgYXBhcGlfZ2V0X3NlcnZlcl9idWlsdCgpLgogICAgIFtLZW4gQ29hcl0gIFBSIzE0NDgKCiAgKikgV0lOMzI6IFByZXNlcnZlIHRyYWlsaW5nIHNsYXNoIGluIGNhbm9uaWNhbCBwYXRoIChhbmQgaGVuY2UKICAgICBpbiBQQVRIX0lORk8pLiBbUGF1bCBTdXR0b24sIEJlbiBMYXVyaWVdCgogICopIFBPUlQ6IFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUIGhhcyBwcm92ZW4gdW5yZWxpYWJsZQogICAgIGRlcGVuZGluZyBvbiB0aGUgcmV2IG9mIFNvbGFyaXMgYW5kIHdoYXQgbWl4dHVyZSBvZiBtb2R1bGVzCiAgICAgYXJlIGluIHVzZS4gIFNvIGl0IGhhcyBiZWVuIGRpc2FibGVkLCBhbmQgU29sYXJpcyBpcyBiYWNrIHRvCiAgICAgdXNpbmcgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULiAgVXNlcnMgbWF5IGV4cGVyaW1lbnQgd2l0aAogICAgIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUIGF0IHRoZWlyIG93biByaXNrLCBpdCBtYXkgc3BlZWQKICAgICB1cCBzdGF0aWMgY29udGVudCBvbmx5IHNlcnZlcnMuICBPciBpdCBtYXkgZmFpbCB1bnByZWRpY3RhYmx5LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTc3OSwgMTg1NCwgMTkwNAoKICAqKSBtb2RfdGVzdF91dGlsX3VyaS5jIGNyZWF0ZWQgd2hpY2ggdGVzdHMgdGhlIGxvZ2ljIGluIHV0aWxfdXJpLmMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IFJld3JpdGUgb2YgYWJzb2x1dGVVUkkgaGFuZGxpbmcsIGFuZCBpbiBwYXJ0aWN1bGFyIGhvdwogICAgIGFic29sdXRlVVJJcyBtYXRjaCB2aG9zdHMuICBVbmxlc3MgYSByZXF1ZXN0IGlzIGEgcHJveHkgcmVxdWVzdCwgYQogICAgICJodHRwOi8vaG9zdCIgdXJsIGlzIHRyZWF0ZWQgYXMgaWYgYSBzaW1pbGFyICJIb3N0OiIgaGVhZGVyIGhhZCBiZWVuCiAgICAgc3VwcGxpZWQuICBUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBzdXBwb3J0IGZ1dHVyZSBIVFRQLzEueCBwcm90b2NvbHMKICAgICB3aGljaCBtYXkgcmVxdWlyZSBjbGllbnRzIHRvIHNlbmQgYWJzb2x1dGVVUklzIGZvciBhbGwgcmVxdWVzdHMuCgogICAgIEluIG9yZGVyIHRvIGFjaGlldmUgdGhpcyBjaGFuZ2Ugc3VidGxlIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBBUEkuICBJbiBhCiAgICAgcmVxdWVzdF9yZWMsIHItPmhvc3RsZW4gaGFzIGJlZW4gcmVtb3ZlZC4gIHItPnVucGFyc2VkX3VyaSBub3cgZXhpc3RzIHNvCiAgICAgdGhhdCB0aGUgdW5tb2RpZmllZCB1cmkgY2FuIGJlIHJldHJpZXZlZCBlYXNpbHkuICByLT5wcm94eXJlcSBpcyBub3Qgc2V0CiAgICAgYnkgdGhlIGNvcmUsIG1vZHVsZXMgbXVzdCBzZXQgaXQgZHVyaW5nIHRoZSBwb3N0X3JlYWRfcmVxdWVzdCBvcgogICAgIHRyYW5zbGF0ZV9uYW1lcyBwaGFzZS4KCiAgICAgUGx1cyBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsaG9zdCB0ZXN0IHN1aXRlIGZvciBhYnNvbHV0ZVVSSSB0ZXN0aW5nLgoKICAgICBUaGlzIGZpeGVzIHNldmVyYWwgYnVncyB3aXRoIHRoZSBwcm94eSBwcm94eWluZyByZXF1ZXN0cyB0byB2aG9zdHMKICAgICBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh0dHBkLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBDbGVhbnVwIG9mIGNvZGUgaW4gaHR0cF92aG9zdC5jLCBhbmQgcmVtb3ZlIHZob3N0IG1hdGNoaW5nCiAgICAgY29kZSBmcm9tIG1vZF9yZXdyaXRlLiAgVGhlIHZob3N0IG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgYnkgYQogICAgIGdsb2JhbGx5IGF2YWlsYWJsZSBmdW5jdGlvbiBtYXRjaGVzX3JlcXVlc3Rfdmhvc3QoKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgUmVkdWNlIG1lbW9yeSB1c2FnZSwgYW5kIHNwZWVkIHVwIFNlcnZlckFsaWFzIHN1cHBvcnQuICBBcyBhCiAgICAgc2lkZS1lZmZlY3QgdXNlcnMgY2FuIGxpc3QgbXVsdGlwbGUgU2VydmVyQWxpYXMgZGlyZWN0aXZlcwogICAgIGFuZCB0aGV5J3JlIGFsbCBjb25zaWRlcmVkLgogICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW8gY2lyeC5vcmc+XSBQUiMxNTMxCgogICopIFRoZSAicG9seSIgZGlyZWN0aXZlIGluIGltYWdlIG1hcHMgZGlkIG5vdCBpbmNsdWRlIHRoZSBib3JkZXJzIG9mIHRoZQogICAgIHBvbHlnb24sIHdoZXJlYXMgdGhlICJyZWN0IiBkaXJlY3RpdmUgZG9lcy4gIEZpeCB0aGlzIGluY29uc2lzdGVuY3kuCiAgICAgW0tvbnN0YW50aW4gTW9yc2huZXYgPG1va28gZGVzaWduLnJ1Pl0gUFIjMTc3MQoKICAqKSBNYWtlIFxcIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XQoKICAqKSBBZGQgdGhlIGAlYScgY29uc3RydWN0IHRvIExvZ0Zvcm1hdCBhbmQgQ3VzdG9tTG9nIHRvIGxvZyB0aGUgY2xpZW50IElQCiAgICAgYWRkcmVzcy4gW1RvZGQgRWlnZW5zY2hpbmsgPGVpZ2Vuc3RyIG1peGkubmV0Pl0gUFIjMTg4NQoKICAqKSBBUEk6IEEgbmV3IHNvdXJjZSBtb2R1bGUgbWFpbi91dGlsX3VyaS5jOyBJdCBjb250YWlucyBhIHJvdXRpbmUKICAgICBwYXJzZV91cmlfY29tcG9uZW50cygpIGFuZCBmcmllbmRzIHdoaWNoIGJyZWFrcyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQKICAgICBwYXJ0cy4gIFRoZXNlIHBhcnRzIGFyZSBzdG9yZWQgaW4gYSB1cmlfY29tcG9uZW50cyBzdHJ1Y3R1cmUgY2FsbGVkCiAgICAgcGFyc2VkX3VyaSB3aXRoaW4gZWFjaCByZXF1ZXN0X3JlYywgYW5kIGFyZSBhdmFpbGFibGUgdG8gYWxsIG1vZHVsZXMuCiAgICAgQWRkaXRpb25hbGx5LCBhbiB1bnBhcnNlIHJvdXRpbmUgaXMgc3VwcGxpZWQgd2hpY2ggcmUtYXNzZW1ibGVzIHRoZSBVUkkKICAgICBjb21wb25lbnRzIGJhY2sgdG8gYW4gVVJJLCBvcHRpb25hbGx5IGhpZGluZyB0aGUgdXNlcm5hbWU6cGFzc3dvcmRAIHBhcnQKICAgICBmcm9tIGZ0cCBwcm94eSByZXF1ZXN0cywgYW5kIG90aGVyIHVzZWZ1bCByb3V0aW5lcy4gIFdpdGhpbiB0aGUgc3RydWN0dXJlLAogICAgIHlvdSBmaW5kIG9uIGEgcmVhZHktZm9yLXVzZSBiYXNpczoKICAgICAgICBzY2hlbWU7ICAgICAvKiBzY2hlbWUgKCJodHRwIi8iZnRwIi8uLi4pICovCiAgICAgICAgaG9zdGluZm87ICAgLyogY29tYmluZWQgW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0gKi8KICAgICAgICB1c2VyOyAgICAgICAvKiB1c2VyIG5hbWUsIGFzIGluIGh0dHA6Ly91c2VyOnBhc3N3ZEBob3N0OnBvcnQvICovCiAgICAgICAgcGFzc3dvcmQ7ICAgLyogcGFzc3dvcmQsIGFzIGluIGh0dHA6Ly91c2VyOnBhc3N3ZEBob3N0OnBvcnQvICovCiAgICAgICAgaG9zdG5hbWU7ICAgLyogaG9zdG5hbWUgZnJvbSBVUkkgKG9yIGZyb20gSG9zdDogaGVhZGVyKSAqLwogICAgICAgIHBvcnRfc3RyOyAgIC8qIHBvcnQgc3RyaW5nIChpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGlzIGluICJwb3J0IikgKi8KICAgICAgICBwYXRoOyAgICAgICAvKiB0aGUgcmVxdWVzdCBwYXRoIChvciAiLyIgaWYgb25seSBzY2hlbWU6Ly9ob3N0IHdhcyBnaXZlbikgKi8KICAgICAgICBxdWVyeTsgICAgICAvKiBFdmVyeXRoaW5nIGFmdGVyIGEgJz8nIGluIHRoZSBwYXRoLCBpZiBwcmVzZW50ICovCiAgICAgICAgZnJhZ21lbnQ7ICAgLyogVHJhaWxpbmcgIiNmcmFnbWVudCIgc3RyaW5nLCBpZiBwcmVzZW50ICovCiAgICAgVGhpcyBpcyBtZWFudCB0byBzZXJ2ZSBhcyB0aGUgcGxhdGZvcm0gZm9yICpCSUcqIHNhdmluZ3MgaW4KICAgICBjb2RlIGNvbXBsZXhpdHkgZm9yIHRoZSBwcm94eSBtb2R1bGUgKGFuZCBtYXliZSB0aGUgdmhvc3QgbG9naWMpLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBhbGwgcG9zc2libGUgbWV0YS1jb25zdHJ1Y3QgZXhwYW5zaW9ucyAoJE4sICVOLCAle05BTUV9IGFuZAogICAgICR7bWFwOmtleX0pIGF2YWlsYWJsZSBmb3IgYWxsIGxvY2F0aW9uIHdoZXJlIGEgc3RyaW5nIGlzIGNyZWF0ZWQgaW4KICAgICBtb2RfcmV3cml0ZSByZXdyaXRpbmcgcnVsZXNldHM6IDFzdCBhcmcgb2YgUmV3cml0ZUNvbmQsIDJuZCBhcmcgb2YKICAgICBSZXdyaXRlUnVsZSBhbmQgZm9yIHRoZSBbRT1OQU1FOlNUUklOR10gZmxhZyBvZiBSZXdyaXRlUnVsZS4gVGhpcyB3YXkgdGhlCiAgICAgcG9zc2libGUgZXhwYW5zaW9ucyBhcmUgY29uc2VxdWVudGx5IHVzYWJsZSBhdCBhbGwgc3RyaW5nIGNyZWF0aW9uCiAgICAgbG9jYXRpb25zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGluaXRpYWxpemF0aW9uIG9mIFJld3JpdGVMb2dMZXZlbCAoZGVmYXVsdCBub3cgaXMgMCBhcyBkb2N1bWVudGVkIAogICAgIGFuZCBub3QgMSkgYW5kIHRoZSBwZXItdmlydHVhbC1zZXJ2ZXIgbWVyZ2luZyBvZiBkaXJlY3RpdmVzLiBOb3cgYWxsCiAgICAgZGlyZWN0aXZlcyBleGNlcHQgYFJld3JpdGVFbmdpbmUnIGFuZCBgUmV3cml0ZU9wdGlvbicgYXJlIGVpdGhlcgogICAgIGNvbXBsZXRlbHkgb3ZlcnJpZGRlbiAoZGVmYXVsdCkgb3IgY29tcGxldGVseSBpbmhlcml0ZWQgKHdoZW4KICAgICBgUmV3cml0ZU9wdGlvbnMgaW5oZXJpdCcpIGlzIHVzZWQuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMzI1CgogICopIEZpeCBgUmV3cml0ZU1hcCcgcHJvZ3JhbSBsb29rdXAgaW4gc2l0dWF0aW9ucyB3aGVyZSBzdWNoIG1hcHMgYXJlCiAgICAgZGVmaW5lZCBidXQgZGlzYWJsZWQgKGBSZXdyaXRlRW5naW5lIG9mZicpIGluIHBlci1zZXJ2ZXIgY29udGV4dC4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzE0MzEKCiAgKikgRml4IGJ1ZyBpbnRyb2R1Y2VkIGluIDEuM2I0LWRldiwgY29uZmlnIHdpdGggbm8gUG9ydCBzZXR0aW5nIHdvdWxkIGNhdXNlCiAgICAgc2VydmVyIHRvIGJpbmQgdG8gcG9ydCAwIHJhdGhlciB0aGFuIDgwLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggbG9uZy1zdGFuZGluZyBwcm9ibGVtIHdpdGggUmV3cml0ZU1hcCBfcHJvZ3JhbXNfIHVuZGVyIFVuaXggZGVyaXZhdGVzCiAgICAgKGxpa2UgU3VuT1MgYW5kIEZyZWVCU0QpIHdoaWNoIGRvbid0IGFjY2VwdCB0aGUgbG9ja2luZyBvZiBwaXBlcwogICAgIGRpcmVjdGx5LiAgQSBuZXcgZGlyZWN0aXZlIFJld3JpdGVMb2NrIGlzIGludHJvZHVjZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8KICAgICBzZXR1cCBhIHNlcGFyYXRlIGxvY2tpbmcgZmlsZSB3aGljaCB0aGVuIGlzIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTAyOQoKICAqKSBXSU4zMjogVGhlIHNlcnZlciByb290IGlzIG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJ5IGtleQogICAgIEhLTE1cU09GVFdBUkVcQXBhY2hlIEdyb3VwXEFwYWNoZVw8dmVyc2lvbj4gKHZlcnNpb24gaXMgY3VycmVudGx5CiAgICAgIjEuMyBiZXRhIiksIHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSAtZCBjb21tYW5kIGxpbmUgZmxhZy4gVGhlCiAgICAgdmFsdWUgaXMgc3RvcmVkIGJ5IHJ1bm5pbmcgImFwYWNoZSAtaSAtZCBzZXJ2ZXJyb290Ii4gW1BhdWwgU3V0dG9uXQoKICAqKSBNZXJnZWQgb3Mvd2luMzIvbW9kX2RsbC5jIGludG8gbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc28uYyB0byBzdXBwb3J0CiAgICAgZHluYW1pYyBsb2FkaW5nIG9uIFdpbjMyIGFuZCBVbml4IHZpYSB0aGUgc2FtZSBtb2R1bGUuIFtQYXVsIFN1dHRvbl0KCiAgKikgTm93IG1vZF9yZXdyaXRlIG5vIGxvbmdlciBtYWtlcyBwcm9ibGVtYXRpYyBhc3N1bXB0aW9ucyBvbiB0aGUgY2hhcmFjdGVycwogICAgIGEgdXNlcm5hbWUgY2FuIGNvbnRhaW4gd2hlbiB0cnlpbmcgdG8gZXhwYW5kIGl0IHZpYSAvZXRjL3Bhc3N3ZC4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFRoZSBtb2Rfc2V0ZW52aWYgQnJvd3Nlck1hdGNoIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNvbW1hbmQgZGlkIG5vdAogICAgIHdvcmsgcHJvcGVybHkgd2l0aCBzcGFjZXMgaW4gdGhlIHJlZ2V4LiAgW1JvbmFsZCBUc2NoYWxhZXJdIFBSIzE4MjUKCiAgKikgQWRkIG5ldyBSZXdyaXRlTWFwIHR5cGVzOiBGaXJzdCwgYHJuZCcgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYHR4dCcKICAgICB0eXBlIGJ1dCB3aXRoIGEgc3BlY2lhbCBwb3N0LXByb2Nlc3NpbmcgZm9yIHRoZSBsb29rZWQtdXAgdmFsdWU6IEl0CiAgICAgcGFyc2VzIGl0IGludG8gYWx0ZXJuYXRpdmVzIGFjY29yZGluZyB0byBgfCcgY2hhcnMgYW5kIHRoZW4gb25seSBvbmUKICAgICBwYXJ0aWN1bGFyIGFsdGVybmF0aXZlIGlzIGNob3NlbiByYW5kb21seSAodGhpcyBpcyBhbiBlc3NlbnRpYWwKICAgICBmdW5jdGlvbmFsaXR5IG5lZWRlZCBmb3IgYmFsYW5jaW5nIGJldHdlZW4gYmFja2VuZC1zZXJ2ZXJzIHdoZW4gdXNpbmcKICAgICBBcGFjaGUgYXMgYSBSZXZlcnNlIFByb3h5LiAgVGhlIGxvb2tlZCB1cCB2YWx1ZSBoZXJlIGlzIGEgbGlzdCBvZgogICAgIHNlcnZlcnMpLiBTZWNvbmQsIGBpbnQnIHdpdGggdGhlIGJ1aWx0LWluIG1hcHMgbmFtZWQgYHRvbG93ZXInIGFuZAogICAgIGB0b3VwcGVyJyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXAgVVJMIHBhcnRzIHRvIGEgZml4ZWQgY2FzZSAodGhpcyBpcyBhbgogICAgIGVzc2VudGlhbCBmZWF0dXJlIHRvIGZpeCB0aGUgY2FzZSBvZiBzZXJ2ZXIgbmFtZXMgd2hlbiBkb2luZyBtYXNzCiAgICAgdmlydHVhbC1ob3N0aW5nIHdpdGggdGhlIGhlbHAgb2YgbW9kX3Jld3JpdGUgaW5zdGVhZCBvZiB1c2luZwogICAgIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMpLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgcGFydHMgYmFzZWQgb24gY29kZSBmcm9tCiAgICAgSmF5IFNvZmZpYW4gPGpheSBjaW1lZGlhLmNvbT5dIFBSIzE2MzEKCiAgKikgQWRkIGEgbmV3IGRpcmVjdGl2ZSB0byBtb2RfcHJveHkgc2ltaWxhciB0byBQcm94eVBhc3M6IGBQcm94eVBhc3NSZXZlcnNlJy4KICAgICBUaGlzIGRpcmVjdGl2ZSBsZXRzIEFwYWNoZSBhZGp1c3QgdGhlIFVSTCBpbiBMb2NhdGlvbi1oZWFkZXJzIG9uIEhUVFAKICAgICByZWRpcmVjdCByZXNwb25zZXMgc2VudCBieSB0aGUgcmVtb3RlIHNlcnZlci4gVGhpcyB3YXkgdGhlIHZpcnR1YWxseQogICAgIG1hcHBlZCBhcmVhIGlzIG5vIGxvbmdlciBsZWZ0IG9uIHJlZGlyZWN0cyBhbmQgdGh1cyBieS1wYXNzZWQgd2hpY2ggaXMKICAgICBlc3BlY2lhbGx5IGVzc2VudGlhbCB3aGVuIHJ1bm5pbmcgQXBhY2hlIGFzIGEgcmV2ZXJzZSBwcm94eS4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBIaWRlIFByb3h5LUF1dGhvcml6YXRpb24gZnJvbSBDR0kvU1NJL2V0YyBqdXN0IGxpa2UgQXV0aG9yaXphdGlvbiBpcwogICAgIGhpZGRlbi4gW0FsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhXQoKICAqKSBBcGFjaGUgd2lsbCwgd2hlbiBzdGFydGVkIHdpdGggdGhlIC1YIChzaW5nbGUgcHJvY2VzcykgZGVidWdnaW5nIGZsYWcsCiAgICAgaG9ub3IgdGhlIFNJR0lOVCBvciBTSUdRVUlUIHNpZ25hbHMgYWdhaW4gbm93LiBUaGlzIGNhcGFiaWxpdHkgZ290IGxvc3QKICAgICBhIHdoaWxlIGFnbyBkdXJpbmcgT1MvMiBzaWduYWwgaGFuZGxpbmcgY2hhbmdlcy4KCiAgKikgW1BPUlRdIFdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgTmVYVCBydW5zIG9uIG1vcmUgdGhhbiB0aGUKICAgICBtNjhrIGNoaXBzIGluIG1vZF9zdGF0dXMgW1Njb3R0IEFuZ3Vpc2ggYW5kIFRpbW90aHkgTHVvbWEKICAgICA8bHVvbWF0IHBlYWsub3JnPl0KCiAgKikgW1BPUlRdIFJlY29nbml6ZSBGcmVlQlNEIHZlcnNpb25zIHNvIHdlIGNhbiB1c2UgdGhlIE9TIHJlZ2V4IGFzIHdlbGwKICAgICBhcyBoYW5kbGluZyB1bnNpZ25lZC1jaGFycyBmb3IgRnJlZUJTRCB2MyBhbmQgdjIgW0FuZHJleSBDaGVybm92CiAgICAgPGFjaGUgbmFndWFsLnBwLnJ1PiBhbmQgSmltXSBQUiMxNDUwCgogICopIFVzZSBTQV9SRVNFVEhBTkQgb3IgU0FfT05FU0hPVCB3aGVuIGluc3RhbGxpbmcgdGhlIGNvcmVkdW1wIGhhbmRsZXJzLgogICAgIEluIHBhcnRpY3VsYXIgdGhlIGhhbmRsZXJzIGNvdWxkIHRyaWdnZXIgdGhlbXNlbHZlcyBpbnRvIGFuIGluZmluaXRlCiAgICAgbG9vcCBpZiBSTGltaXRNZW0gd2FzIHVzZWQgd2l0aCBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgLS0gdG9vIHNtYWxsCiAgICAgZm9yIHRoZSBzaWduYWwgc3RhY2sgZnJhbWUgdG8gYmUgc2V0IHVwLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBhYnNvbHV0ZVVSSXMgaW50cm9kdWNlZCBkdXJpbmcgMS4zYjQuICBbRGVhbiBHYXVkZXQsCiAgICAgQWx2YXJvIE1hcnRpbmV6IEVjaGV2YXJyaWEgPGFsdmFybyBsYW5kZXIuZXM+XQoKICAqKSBGaXggbXVsdGlwbGUgVXNlckRpciBwcm9ibGVtIGludHJvZHVjZWQgZHVyaW5nIDEuM2I0LWRldi4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzE4NTAKCiAgKikgYXBfY3B5c3RybigpIGhhZCBhbiBvZmYtYnktMSBlcnJvci4KICAgICBbQ2hhcmxlcyBGdSA8Y2N3ZiBrbGFiLmNhbHRlY2guZWR1Pl0gUFIjMTg0NwoKICAqKSBBUEk6IEFzIEtlbiBzdWdnZXN0ZWQgdGhlIGNoZWNrX2NtZF9jb250ZXh0KCkgZnVuY3Rpb24gYW5kIHJlbGF0ZWQKICAgICBkZWZpbmVzIGFyZSBub24tc3RhdGljIG5vdyBzbyBtb2R1bGVzIGNhbiB1c2UgJ2VtLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBtb2RfaW5mbyB3b3VsZCBvY2Nhc2lvbmFsbHkgcHJvZHVjZSBhbiB1bnBhaXJlZCA8dHQ+IGluIGl0cwogICAgIG91dHB1dC4gRml4ZWQuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQnkgZGVmYXVsdCBBSVggYmluZHMgYSBwcm9jZXNzIChhbmQgaXQncyBjaGlsZHJlbikgdG8gYSBzaW5nbGUKICAgICBwcm9jZXNzb3IuICBodHRwZCBjaGlsZHJlbiBub3cgdW5iaW5kIHRoZW1zZWx2ZXMgZnJvbSB0aGF0IGNwdQogICAgIGFuZCByZS1iaW5kIHRvIG9uZSBzZWxlY3RlZCBhdCByYW5kb20gdmlhIGJpbmRwcm9jZXNzb3IoKQogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIExpbnV4IDIuMCBhbmQgYWJvdmUgaW1wbGVtZW50IFJMSU1JVF9BUywgUkxJTUlUX0RBVEEgaGFzIGFsbW9zdCBubwogICAgIGVmZmVjdC4gIFdvcmsgYXJvdW5kIGl0IGJ5IHVzaW5nIFJMSU1JVF9BUyBmb3IgdGhlIFJMaW1pdE1FTQogICAgIGRpcmVjdGl2ZS4gIFtFbnJpayBCZXJraGFuIDxlbnJpayBpbmthLmRlPl0gUFIjMTgxNgoKICAqKSBtb2RfbWltZV9tYWdpYyBlcnJvciBtZXNzYWdlIHNob3VsZCBpbmRpY2F0ZSB0aGUgZmlsZW5hbWUgd2hlbgogICAgIHJlYWRzIGZhaWwuICBbIk0uRC5QYXJrZXIiIDxtZHBjIG5ldGNvbS5jb20+XSBQUiMxODI3CgogICopIFByZXZpb3VzbHkgQXBhY2hlIHdvdWxkIHBlcm1pdCA8L0ZpbGVzPiB0byBlbmQgPEZpbGVzTWF0Y2g+IChhbmQKICAgICBzaW1pbGFyeSBmb3IgTG9jYXRpb24gYW5kIERpcmVjdG9yeSksIG5vdyB0aGlzIGlzIGRpYWdub3NlZCBhcyBhbgogICAgIGVycm9yLiAgSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBmb3IgbWlzbWF0Y2hlZCBzZWN0aW9ucyAoPEZpbGVzPiwKICAgICA8RmlsZXNNYXRjaD4sIDxEaXJlY3Rvcnk+LCA8RGlyZWN0b3J5TWF0Y2g+LCAuLi4pLgogICAgIFtEZWFuIEdhdWRldCwgTWFydGluIEtyYWVtZXJdCgogICopIDxGaWxlcz4gaXMgbm90IHBlcm1pdHRlZCB3aXRoaW4gPExvY2F0aW9uPiAoYmVjYXVzZSBvZiB0aGUKICAgICBzZW1hbnRpYyBvcmRlcmluZykuICBbRGVhbiBHYXVkZXRdIFBSIzM3OQoKICAqKSA8RmlsZXM+IHdpdGggd2lsZGNhcmRzIHdhcyBicm9rZW4gYnkgdGhlIGNoYW5nZSBpbiB3aWxkY2FyZAogICAgIHNlbWFudGljcyAoKiBkb2VzIG5vdCBtYXRjaCAvKS4gIFRvIGZpeCB0aGlzLCA8RmlsZXM+IG5vdwogICAgIGFwcGx5IG9ubHkgdG8gdGhlIGJhc2VuYW1lIG9mIHRoZSByZXF1ZXN0IGZpbGVuYW1lLiAgVGhpcwogICAgIGZpeGVzIHNvbWUgb3RoZXIgaW5jb25zaXN0ZW5jaWVzIGluIDxGaWxlcz4gc2VtYW50aWNzCiAgICAgKHN1Y2ggYXMgPEZpbGVzIGEqYj4gbm90IHdvcmtpbmcpLiAgW0RlYW4gR2F1ZGV0XSBQUiMxODE3CgogICopIFJlbW92ZWQgYm9ndXMgImRpc3QudGFyIiB0YXJnZXQgZnJvbSBNYWtlZmlsZS50bXBsIGFuZCBtYWtlIHN1cmUKICAgICBiYWNrdXAgZmlsZXMgYXJlIHJlbW92ZWQgb24gImNsZWFuIiB0YXJnZXQgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCAtbG0gdG8gTElCUyBmb3IgSFBVWC4gIFtEZWFuIEdhdWRldF0gUFIjMTYzOQoKICAqKSBWYXJpb3VzIGVycm9ycyBmcm9tIHNlbGVjdCgpIGFuZCBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkgd291bGQKICAgICByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcC4gIEl0IHNlZW1zIHRoZXNlIHR3byB0aWNrbGUga2VybmVsCiAgICAgb3IgbGlicmFyeSBidWdzIG9jY2FzaW9uYWxseSwgYW5kIHJlc3VsdCBpbiBsb2cgc3BhbW1hZ2UgYW5kCiAgICAgYSBnZW5lcmFsbHkgYmFkIHNjZW5lLiAgTm93IHRoZSBjaGlsZCBleGl0cyBpbW1lZGlhdGVseSwKICAgICB3aGljaCBzZWVtcyB0byBiZSBhIGdvb2Qgd29ya2Fyb3VuZC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzE3NDcsIDExMDcsIDU4OCwgMTc4NywgOTg3LCA1ODgKCiAgKikgQ2xlYW5lZCB1cCBzb21lIHJhY2UgY29uZGl0aW9ucyBpbiB1bml4IGNoaWxkX21haW4gZHVyaW5nCiAgICAgaW5pdGlhbGl6YXRpb24uIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6ICJVc2VyRGlyIC9hYnNwYXRoIiB3aXRob3V0IGEgKiBpbiB0aGUgcGF0aCB3b3VsZCBhbGxvdwogICAgIHJlbW90ZSB1c2VycyB0byBhY2Nlc3MgIi9+Li4iIGFuZCBieXBhc3MgYWNjZXNzIHJlc3RyaWN0aW9ucwogICAgIChidXQgbm90ZSAvfi4uLy4uIHdhcyBoYW5kbGVkIHByb3Blcmx5KS4KICAgICBbTGF1cmkgSmVzbWluIDxqZXNtaW4gdXQuZWU+XSBQUiMxNzAxCgogICopIEFQSTogb3NfaXNfcGF0aF9hYnNvbHV0ZSgpIG5vdyB0YWtlcyBhIGNvbnN0IGNoYXIgKiBpbnN0ZWFkIG9mIGEgY2hhciAqLgogICAgIFtEZWFuIEdhdWRldF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjUKCiAgKikgU291cmNlIGZpbGUgZGVwZW5kZW5jaWVzIGluIE1ha2VmaWxlLnRtcGwgZmlsZXMgdGhyb3VnaG91dCB0aGUKICAgICBzb3VyY2UgdHJlZSB3ZXJlIHVwZGF0ZWQgdG8gYWNjdXJhdGVseSByZWZsZWN0IHJlYWxpdHkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQcmVzZXJ2ZSB0aGUgY29udGVudCBlbmNvZGluZyBnaXZlbiBieSB0aGUgQWRkRW5jb2RpbmcgZGlyZWN0aXZlCiAgICAgd2hlbiB0aGUgY2xpZW50IGRvZXNuJ3Qgb3RoZXJ3aXNlIHNwZWNpZnkgYW4gZW5jb2RpbmcuCiAgICAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0KCiAgKikgU29ydCBvdXQgcHJvYmxlbXMgd2l0aCBjYW5vbmljYWwgZmlsZW5hbWUgaGFuZGxpbmcgaGFwcGVuaW5nIHRvbyBsYXRlLgogICAgIFtEZWFuIEdhdWRldCwgQmVuIExhdXJpZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjQKCiAgKikgVGhlIG1vZHVsZSBzdHJ1Y3R1cmUgd2FzIG1vZGlmaWVkIHRvIGluY2x1ZGUgYSAqZHluYW1pY19sb2FkX2hhbmRsZQogICAgIGluIHRoZSBTVEFOREFSRF9NT0RVTEVfU1RVRkYgcG9ydGlvbiwgYW5kIHRoZSBNT0RVTEVfTUFHSUNfTlVNQkVSCiAgICAgaGFzIGJlZW4gYnVtcGVkIGFjY29yZGluZ2x5LiAgW1BhdWwgU3V0dG9uXQoKICAqKSBBbGwgQnJvd3Nlck1hdGNoIGRpcmVjdGl2ZXMgbWVudGlvbmVkIGluCiAgICAgaHRkb2NzL21hbnVhbC9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCBhcmUgaW4gdGhlIGRlZmF1bHQKICAgICBjb25maWd1cmF0aW9uIGZpbGVzLiAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgTWlOVCBwb3J0IHVwZGF0ZS4gW0phbiBQYXVsIFNjaG1pZHRdCgogICopIEhUVFAvMS4xIHJlcXVpcmVzIHgtZ3ppcCBhbmQgZ3ppcCBlbmNvZGluZ3MgYmUgdHJlYXRlZAogICAgIGVxdWl2YWxlbnQsIHNpbWlsYXJseSBmb3IgeC1jb21wcmVzcyBhbmQgY29tcHJlc3MuICBBcGFjaGUKICAgICBub3cgaWdub3JlcyBhIGxlYWRpbmcgeC0gd2hlbiBjb21wYXJpbmcgZW5jb2RpbmdzLiAgSXQgYWxzbwogICAgIHByZXNlcnZlcyB0aGUgZW5jb2RpbmcgdGhlIGNsaWVudCByZXF1ZXN0cyAoZm9yIGV4YW1wbGUgaWYKICAgICBpdCByZXF1ZXN0cyB4LWd6aXAsIHRoZW4gQXBhY2hlIHdpbGwgcmVzcG9uZCB3aXRoIHgtZ3ppcAogICAgIGluIHRoZSBDb250ZW50LUVuY29kaW5nIGhlYWRlcikuCiAgICAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0gUFIjMTc3MgoKICAqKSBGaXggYSBtZW1vcnkgbGVhayBvbiBrZWVwLWFsaXZlIGNvbm5lY3Rpb25zLiAgW0lnb3IgVGF0YXJpbm92XQoKICAqKSBBZGRlZCBtb2Rfc28gbW9kdWxlIHRvIHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMgb24gVW5peAogICAgIChsaWtlIG1vZF9kbGQgZm9yIFdpbjMyKS4gVGhpcyByZXBsYWNlcyBtb2RfZGxkLmMuIFVzZSBTaGFyZWRNb2R1bGUKICAgICBpbnN0ZWFkIG9mIEFkZE1vZHVsZSBpbiBDb25maWd1cmF0aW9uIHRvIGJ1aWxkIHNoYXJlZCBtb2R1bGVzCiAgICAgW1NhbWVlciBQYXJla2gsIFBhdWwgU3V0dG9uXQoKICAqKSBNaW5vciBjbGVhbnVwcyB0byByLT5maW5mbyBoYW5kbGluZyBpbiBzb21lIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBYnN0cmFjdCByZWFkKCkvd3JpdGUoKSB0byBhcF9yZWFkKCkvYXBfd3JpdGUoKS4KICAgICBNYWtlcyBpdCBlYXNpZXIgdG8gYWRkIG90aGVyIHR5cGVzIG9mIElPIGNvZGUgc3VjaCBhcyBTRklPLgogICAgIFtSYW5keSBUZXJidXNoXQoKICAqKSBBUEk6IEdlbmVyYWxpemUgZGVmYXVsdF9wb3J0IG1hbmlwdWxhdGlvbnMgdG8gbWFrZSBzdXBwb3J0IG9mCiAgICAgZGlmZmVyZW50IHByb3RvY29scyBlYXNpZXIuIFtCZW4gTGF1cmllLCBSYW5keSBUZXJidXNoXQoKICAqKSBUaGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB1c2VycyBkbyBub3Qgd2FudCBBcGFjaGUgdG8gZm9ybQogICAgIHNlbGYtcmVmZXJlbnRpYWwgdXJscyB1c2luZyB0aGUgImNhbm9uaWNhbCIgU2VydmVyTmFtZSBhbmQgUG9ydC4KICAgICBUaGUgbmV3IFVzZUNhbm9uaWNhbE5hbWUgZGlyZWN0aXZlIChkZWZhdWx0IG9uKSwgaWYgc2V0IHRvIG9mZgogICAgIHdpbGwgY2F1c2UgQXBhY2hlIHRvIHVzZSB0aGUgY2xpZW50LXN1cHBsaWVkIGhvc3RuYW1lIGFuZCBwb3J0LgogICAgIEFQSTogUGFydCBvZiB0aGlzIGNoYW5nZSByZXF1aXJlZCBhIGNoYW5nZSB0byB0aGUgY29uc3RydWN0X3VybCgpCiAgICAgcHJvdG90eXBlOyBhbmQgdGhlIGFkZGl0aW9uIG9mIGdldF9zZXJ2ZXJfbmFtZSgpIGFuZAogICAgIGdldF9zZXJ2ZXJfcG9ydCgpLgogICAgIFtNaWNoYWVsIERvdWdsYXNzIDxtaWtlZG91ZyB0ZXhhcy5uZXQ+LCBEZWFuIEdhdWRldF0KICAgICBQUiMzMTUsIDQ1OSwgNDg1LCAxNDMzCgogICopIFlldCBhbm90aGVyIHJlYXJyYW5nZW1lbnQgb2YgdGhlIHNvdXJjZSB0cmVlLi4gbm93IGFsbCB0aGUgY29tbW9uCiAgICAgaGVhZGVyIGZpbGVzIGFyZSBpbiB0aGUgc3JjL2luY2x1ZGUgZGlyZWN0b3J5LiAgVGhlIC1JbWFpbiAtSWFwCiAgICAgcmVmZXJlbmNlcyBpbiBNYWtlZmlsZXMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdGhlIHNpbXBsZXIgLUlpbmNsdWRlCiAgICAgaW5zdGVhZC4gIEluIGFkZGl0aW9uIHRvIHNpbXBsaWZ5aW5nIHRoZSBidWlsZCBhIGxpdHRsZSBiaXQsIHRoaXMKICAgICBhbHNvIG1ha2VzIGl0IGNsZWFyIHdoZW4gYSBtb2R1bGUgaXMgcmVmZXJlbmNpbmcgc29tZXRoaW5nIGluIGEKICAgICBvdGhlciB0aGFuIGtvc2hlciBtYW5uZXIgKGUuZy4sIHRoZSBwcm94eSBpbmNsdWRpbmcgbW9kX21pbWUuaCkuCiAgICAgTW9kdWxlLXByaXZhdGUgaGVhZGVyIGZpbGVzICh0aGUgcHJveHksIG1vZF9taW1lLCB0aGUgcmVnZXggbGlicmFyeSwKICAgICBhbmQgbW9kX3Jld3JpdGUpIGhhdmUgbm90IGJlZW4gbW92ZWQgdG8gc3JjL2luY2x1ZGU7IG5vciBoYXZlCiAgICAgdGhlIE9TLWFic3RyYWN0aW9uIGZpbGVzLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggYSBidWcgd2hlcmUgci0+aG9zdG5hbWUgZGlkbid0IGhhdmUgdGhlIDpwb3J0IHN0cmlwcGVkCiAgICAgZnJvbSBpdC4gIFtEZWFuIEdhdWRldF0KCiAgKikgVHdlYWtlZCB0aGUgaGVhZGVyc19vdXQgdGFibGUgc2l6ZSwgYW5kIHRoZSBzdWJwcm9jZXNzX2VudgogICAgIHRhYmxlIHNpemUgZ3Vlc3MgaW4gcmVuYW1lX29yaWdpbmFsX2Vudmlyb25tZW50KCkuICBBZGRlZAogICAgIE1BS0VfVEFCTEVfUFJPRklMRSB3aGljaCBjYW4gaGVscCBkaXNjb3ZlciBtYWtlX3RhYmxlKCkKICAgICBjYWxscyB0aGF0IHVzZSB0b28gc21hbGwgYW4gaW5pdGlhbCBndWVzcywgc2VlIGFsbG9jLmMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBPcHRpb25zIGFuZCBBbGxvd092ZXJyaWRlIHdlcmVuJ3QgcHJvcGVybHkgbWVyZ2luZyBpbiB0aGUgbWFpbgogICAgIHNlcnZlciBzZXR0aW5nIGluc2lkZSB2aG9zdHMgKG9ubHkgYW4gaXNzdWUgd2hlbiB5b3UgaGF2ZSBubwogICAgIDxEaXJlY3Rvcnk+IG9yIG90aGVyIHNlY3Rpb24gY29udGFpbmluZyBhbiBPcHRpb25zIHRoYXQgYWZmZWN0cwogICAgIGEgcmVxdWVzdCkuICBPcHRpb25zICtmb28gb3IgLWZvbyBpbiB0aGUgbWFpbl9zZXJ2ZXIgd291bGRuJ3QKICAgICBhZmZlY3QgdGhlIG1haW5fc2VydmVyJ3MgbG9va3VwIGRlZmF1bHRzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBWYXJpYWJsZSAnY3dkJyB3YXMgYmVpbmcgdXNlZCBwb2ludGxlc3NseSBiZWZvcmUgYmVpbmcgc2V0LgogICAgIFtLZW4gQ29hcl0gUFIjMTczOAoKICAqKSByLT5hbGxvd2VkIGhhbmRsaW5nIGNsZWFuZWQgdXAgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTb21lIGNhc2Utc2Vuc2l0aXZpdHkgaXNzdWVzIGNsZWFuZWQgdXAgdG8gYmUgY29uc2lzdGVudCB3aXRoCiAgICAgUkZDMjA2OC4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0lHVVJHIGRvZXNuJ3QgZXhpc3QgZXZlcnl3aGVyZS4KICAgICBbTWFyayBBbmRyZXcgSGVpbnJpY2ggPGhlaW5yaWNoIHRpbmRlcmJveC5TdGFuZm9yZC5FRFU+XQoKICAqKSBtb2RfdW5pcXVlX2lkIHdhcyBlcnJvbmVvdXNseSBnZW5lcmF0aW5nIGEgc2Vjb25kIHVuaXF1ZSBpZCB3aGVuCiAgICAgYW4gaW50ZXJuYWwgcmVkaXJlY3Qgb2NjdXJlZC4gIFN1Y2ggcmVkaXJlY3RzIG9jY3VyLCBmb3IgZXhhbXBsZSwKICAgICB3aGVuIHByb2Nlc3NpbmcgYSBEaXJlY3RvcnlJbmRleCBtYXRjaC4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiB0YWJsZV9hZGQsIHRhYmxlX21lcmdlLCBhbmQgdGFibGVfc2V0IGluY2x1ZGUgaW1wbGljaXQgcHN0cmR1cCgpCiAgICAgb2YgdGhlIGtleSBhbmQgdmFsdWUuICBCdXQgaW4gbWFueSBjYXNlcyB0aGlzIGlzIG5vdCByZXF1aXJlZAogICAgIGJlY2F1c2UgdGhlIGtleS92YWx1ZSBpcyBhIGNvbnN0YW50LCBvciB0aGUgdmFsdWUgaGFzIGJlZW4gYnVpbHQKICAgICBieSBwc3RyY2F0KCkgb3Igb3RoZXIgc2ltaWxhciBtZWFucy4gIE5ldyByb3V0aW5lcyB0YWJsZV9hZGRuLAogICAgIHRhYmxlX21lcmdlbiwgYW5kIHRhYmxlX3NldG4gaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBBUEksIHRoZXNlCiAgICAgcm91dGluZXMgZG8gbm90IHBzdHJkdXAoKSB0aGVpciBhcmd1bWVudHMuICBUaGUgY29yZSBjb2RlIGFuZAogICAgIHN0YW5kYXJkIG1vZHVsZXMgd2VyZSBjaGFuZ2VkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZXNlIHJvdXRpbmVzLgogICAgIFRoZSByZXN1bHRpbmcgc2VydmVyIGlzIHVwIHRvIDIwJSBmYXN0ZXIgaW4gc29tZSBzaXR1YXRpb25zLgoKICAgICBOb3RlIHRoYXQgaXQgaXMgZWFzeSB0byBnZXQgY29kZSBzdWJ0bHkgd3JvbmcgaWYgeW91IHBhc3MgYSBrZXkvdmFsdWUKICAgICB3aGljaCBpcyBpbiBhIHBvb2wgb3RoZXIgdGhhbiB0aGUgcG9vbCBvZiB0aGUgdGFibGUuICBUaGUgb25seQogICAgIHNhZmUgdGhpbmcgdG8gZG8gaXMgdG8gcGFzcyBrZXkvdmFsdWVzIHdoaWNoIGFyZSBpbiB0aGUgcG9vbCBvZgogICAgIHRoZSB0YWJsZSwgb3IgaW4gb25lIG9mIHRoZSBhbmNlc3RvcnMgb2YgdGhlIHBvb2wgb2YgdGhlIHRhYmxlLgogICAgIGkuZS4gaWYgdGhlIHRhYmxlIGlzIHBhcnQgb2YgYSBzdWJyZXF1ZXN0LCBhIHZhbHVlIGZyb20gdGhlIG1haW4KICAgICByZXF1ZXN0J3MgcG9vbCBpcyBPSyBzaW5jZSB0aGUgc3VicmVxdWVzdCBwb29sIGlzIGEgc3ViX3Bvb2wgb2YgdGhlCiAgICAgbWFpbiByZXF1ZXN0J3MgcG9vbCAoYW5kIHRoZXJlZm9yZSBoYXMgYSBsaWZlc3BhbiBhdCBtb3N0IGFzIGxvbmcgYXMKICAgICB0aGUgbWFpbiBwb29sKS4gIFRoZXJlIGlzIGRlYnVnZ2luZyBjb2RlIHdoaWNoIGNhbiBkZXRlY3QgaW1wcm9wZXIKICAgICB1c2FnZSwgZW5hYmxlZCBieSBkZWZpbmluZyBQT09MX0RFQlVHLiAgU2VlIGFsbG9jLmMgZm9yIG1vcmUgZGV0YWlscy4KICAgICBbRG1pdHJ5IEtocnVzdGFsZXYgPGRpbWEgYm9nLm1zdS5zdT4sIERlYW4gR2F1ZGV0XQoKICAqKSBNb3JlIG1vZF9taW1lX21hZ2ljIGNsZWFudXA6ICBmZXdlciBzeXNjYWxsczsgc2hvdWxkIGhhbmRsZSAiZmlsZXMiCiAgICAgd2hpY2ggZG9uJ3QgZXhpc3Qgb24gZGlzayBtb3JlIGdyYWNlZnVsbHk7IGhhbmRsZXMgdmhvc3RzIHByb3Blcmx5LgogICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgdGhlIGNvZGUgLS0gaWYgdGhlcmUncyBubwogICAgIE1pbWVNYWdpY0ZpbGUgZGlyZWN0aXZlIHRoZW4gdGhlIG1vZHVsZSBpcyBub3QgZW5hYmxlZC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFNvbWUgb2xkZXIgKm5peCBkaWFsZWN0cyBjYW5ub3QgYXV0b21hdGljYWxseSBzdGFydCBzY3JpcHRzCiAgICAgd2hpY2ggYmVnaW4gd2l0aCBhICMhIGludGVycHJldGVyIGxpbmUgKHRoZSBzaGVsbCBzdGFydHMgdGhlIHNjcmlwdHMKICAgICBhcHByb3ByaWF0ZWx5IG9uIHRoZXNlIHBsYXRmb3JtcykuIEFwYWNoZSBub3cgc3VwcG9ydHMgc3RhcnRpbmcgb2YKICAgICAiaGFzaGJhbmctc2NyaXB0cyIgd2hlbiB0aGUgTkVFRF9IQVNIQkFOR19FTVVMIGRlZmluZSBpcyBzZXQuCiAgICAgW01hcnRpbiBLcmFlbWVyLCB3aXRoIGNvZGUgZnJvbSBQZXRlciBXZW1tIDxwZXRlciB6ZXVzLmRpYWxpeC5vei5hdT4KICAgICB0YWtlbiBmcm9tIHRjc2hdCgogICopIEFQSTogInR5cGVkZWYgYXJyYXlfaGVhZGVyIHRhYmxlIiByZW1vdmVkIGZyb20gYWxsb2MuaCwgZm9sa3Mgc2hvdWxkCiAgICAgaGF2ZSBiZWVuIHdyaXRpbmcgdG8gdXNlIHRhYmxlIGFzIGlmIGl0IHdlcmUgYW4gb3BhcXVlIHR5cGUsIGJ1dCBldmVuCiAgICAgc29tZSBzdGFuZGFyZCBtb2R1bGVzIGdvdCB0aGlzIHdyb25nLiAgQnkgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24KICAgICB0byAidHlwZWRlZiBzdHJ1Y3QgdGFibGUgdGFibGUiIG1vZHVsZSBhdXRob3JzIHdpbGwgcmVjZWl2ZSBjb21waWxlCiAgICAgdGltZSB3YXJuaW5ncyB0aGF0IHRoZXkncmUgZG9pbmcgdGhlIHdyb25nIHRoaW5nLiAgVGhpcyBjaGFuZ2UKICAgICBmYWNpbGl0YXRlcyBmdXR1cmUgY2hhbmdlcyB3aXRoIG1vcmUgc29waGlzdGljYXRlZCB0YWJsZQogICAgIHN0cnVjdHVyZXMuICBTcGVjaWZpY2FsbHksIG1vZHVsZSBhdXRob3JzIHNob3VsZCBiZSB1c2luZyB0YWJsZV9lbHRzKCkKICAgICB0byBnZXQgYWNjZXNzIHRvIGFuIGFycmF5X2hlYWRlciAqIGZvciB0aGUgdGFibGUuIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBSZW5hbWVkIG5ld19jb25uZWN0aW9uKCkgdG8gYXZvaWQgbmFtZXNwYWNlIGNvbGxpc2lvbiB3aXRoIExEQVAKICAgICBsaWJyYXJ5IHJvdXRpbmVzLiAgW0tlbiBDb2FyLCBSYXNtdXMgTGVyZG9yZl0KCiAgKikgV0lOMzI6IG1vZF9zcGVsaW5nIGlzIG5vdyBhdmFpbGFibGUgb24gdGhlIFdpbjMyIHBsYXRmb3JtLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgRm9yIGNsYXJpdHkgdGhlIGZvbGxvd2luZyBjb21waWxlIHRpbWUgZGVmaW5pdGlvbiB3YXMgY2hhbmdlZDoKCiAgICAgICAgU0FGRV9VTlNFUklBTElaRURfQUNDRVBUICAtPiAgIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAoKICAgICBBbHNvLCBmb3IgZXhhbXBsZSwgSEFWRV9NTUFQIHdvdWxkIG1lYW4gdG8gdXNlIG1tYXAoKSBzY29yZWJvYXJkcwogICAgIGFuZCBub3QgYmUgYSBnZW5lcmFsIG5vdGljZSB0aGF0IHRoZSBPUyBoYXMgbW1hcCgpLiBOb3cgdGhlCiAgICAgSEFWRV9NTUFQL1NITUdFVCAjZGVmaW5lcyBzdHJpY3RseSBhcmUgaW5mb3JtYXRpb25hbCB0aGF0IHRoZQogICAgIE9TIGhhcyB0aGF0IG1ldGhvZCBvZiBzaGFyZWQgbWVtb3J5OyB0aGUgdHlwZSB0byB1c2UgZm9yCiAgICAgdGhlIHNjb3JlYm9hcmQgaXMgYSBzZXBlcmF0ZSAjZGVmaW5lIChVU0VfTU1BUF9TQ09SRUJPQVJECiAgICAgYW5kIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCkuIFRoaXMgYWxsb3dzIG91dHNpZGUgbW9kdWxlcyB0bwogICAgIGRldGVybWluZSBpZiBzaGFyZWQgbWVtb3J5IGlzIGF2YWlsYWJsZSBhbmQgYWxsb3dzIEFwYWNoZQogICAgIHRvIGRldGVybWluZSB0aGUgYmVzdCBtZXRob2QgdG8gdXNlIGZvciB0aGUgc2NvcmVib2FyZC4KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgUE9SVDogVW5peFdhcmUgMi4xLjIgU01QIGFwcGVhcnMgdG8gcmVxdWlyZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQsCiAgICAgYXMgZG8gdmFyaW91cyBlYXJsaWVyIHZlcnNpb25zLiAgSXQgc2hvdWxkIGJlIHNhZmUgb24gYWxsIHZlcnNpb25zLgogICAgIFVuaXh3YXJlIDEueCBhcHBlYXJzIHRvIGhhdmUgdGhlIHNhbWUgU0lHSFVQIGJ1ZyBhcyBzb2xhcmlzIGRvZXMgd2l0aAogICAgIHRoZSBzbGFjayBjb2RlLiAgQSBmZXcgb3RoZXIgY2xlYW51cHMgZm9yIFVuaXh3YXJlLgogICAgIFtUb20gSHVnaGVzIDx0aGggY3liZXJzY2llbmNlLmNvbT5dIFBSIzEwODIsIFBSIzEyODIsIFBSIzE0OTksIFBSIzE1NTMKCiAgKikgUE9SVDogQS9VWCBjYW4gaGFuZGxlIHNpbmdsZS1saXN0ZW4gYWNjZXB0cyB3aXRob3V0IG11dGV4CiAgICAgbG9ja2luZywgc28gd2UgYWRkIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVC4gW0ppbSBKYWdpZWxza2ldCgogICopIFdoZW4gZGllKCkgaGFwcGVucyB3ZSBuZWVkIHRvIGVhdCBhbnkgcmVxdWVzdCBib2R5IGlmIG9uZSBleGlzdHMuCiAgICAgT3RoZXJ3aXNlIHdlIGNhbid0IGNvbnRpbnVlIHdpdGggYSBrZWVwYWxpdmUgc2Vzc2lvbi4gIFRoaXMgc2hvd3MgdXAKICAgICBhcyBhIFBPU1QgcHJvYmxlbSB3aXRoIE1TSUUgNC4wLCB0eXBpY2FsbHkgYWdhaW5zdCBwYWdlcyB3aGljaCBhcmUKICAgICBhdXRoZW50aWNhdGVkLiAgW1JveSBGaWVsZGluZ10gUFIjMTM5OQoKICAqKSBJZiB5b3UgZGVmaW5lIFNFQ1VSSVRZX0hPTEVfUEFTU19BVVRIT1JJWkFUSU9OIHRoZW4gdGhlIEF1dGhvcml6YXRpb24KICAgICBoZWFkZXIgd2lsbCBiZSBwYXNzZWQgdG8gQ0dJcy4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc2VjdXJpdHkgaG9sZSwgc28KICAgICBpdCdzIG5vdCBhIGRlZmF1bHQuICBbTWFyYyBTbGVta29dIFBSIzU0OQoKICAqKSBGaXggWTJLIHByb2JsZW0gd2l0aCBkYXRlIHByaW50aW5nIGluIHN1ZXhlYyBsb2cuCiAgICAgW1BhdWwgRWdnZXJ0IDxlZ2dlcnQgdHdpbnN1bi5jb20+XSBQUiMxMzQzCgogICopIFdJTjMyIGRlc2VydmVzIGEgcGlkIGZpbGUuICBbQmVuIEh5ZGVdCgogICopIHN1ZXhlYyBlcnJvcnMgbm93IGluY2x1ZGUgdGhlIGVycm5vL2Rlc2NyaXB0aW9uLiAgW01hcmMgU2xlbWtvXSBQUiMxNTQzCgogICopIFBPUlQ6IE9TRi8xIG5vdyB1c2VzIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCB0byBzb2x2ZSBQUiM0NjcuCiAgICAgVGhlIGNob2ljZSBvZiBmbG9jayB2cy4gZmNudGwgd2FzIG1hZGUgYmFzZWQgb24gdGltaW5ncyB3aGljaCBzaG93ZWQgdGhhdAogICAgIGV2ZW4gb24gbm9uLU5GUywgbm9uLWV4cG9ydGVkIGZpbGVzeXN0ZW1zIGZjbnRsKCkgd2FzIGFuIG9yZGVyIG9mCiAgICAgbWFnbml0dWRlIHNsb3dlci4gIEl0IGFsc28gdXNlcyBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgc28KICAgICB0aGF0IHNpbmdsZSBzb2NrZXQgdXNlcnMgd2lsbCBzZWUgbm8gZGlmZmVyZW5jZS4gW0RlYW4gR2F1ZGV0XSBQUiM0NjcKCiAgKikgIkZpbGUgZG9lcyBub3QgZXhpc3QiIGVycm9yIG1lc3NhZ2Ugd2FzIGVycm9uZW91c2x5IGluY2x1ZGluZyB0aGUKICAgICBlcnJuby4gIFtNYXJjIFNsZW1rb10KCiAgKikgSW1wcm92ZSB0aGUgd2FybmluZyBtZXNzYWdlIGdlbmVyYXRlZCB3aGVuIGEgY2xpZW50IGRyb3BzIHRoZQogICAgIGNvbm5lY3Rpb24gKGhpdHMgc3RvcCBidXR0b24sIGV0Yy4pIGR1cmluZyBhIHNlbmQuICBbUm95IEZpZWxkaW5nXQoKICAqKSBEZWZpbmluZyBHUFJPRiB3aWxsIGRpc2FibGUgcHJvZmlsaW5nIGluIHRoZSBwYXJlbnQgYW5kIGVuYWJsZSBpdAogICAgIGluIHRoZSBjaGlsZHJlbi4gIElmIHlvdSdyZSBwcm9maWxpbmcgdW5kZXIgTGludXggdGhpcyBpcyBwcmV0dHkgbXVjaAogICAgIG5lY2Vzc2FyeSBiZWNhdXNlIFNJR1BST0YgaXMgbG9zdCBhY3Jvc3MgYSBmb3JrKCkuIFtEZWFuIEdhdWRldF0KCiAgKikgaHRkaWdlc3QgYW5kIGh0cGFzc3dkIG5lZWRlZCBzbGlnaHQgdHdlYWtzIHRvIHdvcmsgb24gT1MvMiBhbmQgV0lOMzIuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgVGhlIE5lWFQgY2MgKHdoaWNoIGlzIGdjYyBoYWNrZWQgdXApIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgc29tZQogICAgIGdjYyBmdW5jdGlvbmFsaXR5LiAgV29yayBhcm91bmQgaXQuCiAgICAgW0tlaXRoIFNldmVyc29uIDxrZWl0aCBzc3NkLm5hdnkubWlsPl0gUFIjMTYxMwoKICAqKSBTb21lIGxpbmtlcnMgY29tcGxhaW4gd2hlbiAubyBmaWxlcyBjb250YWluIG5vIGZ1bmN0aW9ucy4KICAgICBbS2VpdGggU2V2ZXJzb24gPGtlaXRoIHNzc2QubmF2eS5taWw+XSBQUiMxNjE0CgogICopIFNvbWUgY29uc3QgZGVjbGFyYXRpb25zIGluIG1vZF9pbWFwLmMgdGhhdCB3ZXJlIGFkZGVkIGZvciBkZWJ1Z2dpbmcKICAgICBwdXJwb3NlcyBjYXVzZWQgc29tZSBjb21waWxlcnMgaGVhcnRidXJuIHdpdGhvdXQgYWRkaW5nIGFueQogICAgIHNpZ25pZmljYW50IHZhbHVlLCBzbyB0aGV5J3ZlIGJlZW4gcmVtb3ZlZC4gIFtLZW4gQ29hcl0KCiAgKikgVGhlIHNyYy9tYWluLyouaCBoZWFkZXIgZmlsZXMgaGF2ZSBoYWQgI2lmbmRlZiB3cmFwcGVycyBhZGRlZCB0bwogICAgIGluc3VsYXRlIHRoZW0gYWdhaW5zdCBkdXBsaWNhdGUgY2FsbHMgaWYgdGhleSBnZXQgaW5jbHVkZWQgdGhyb3VnaAogICAgIG11bHRpcGxlIHBhdGhzIChlLmcuLCBpbiAuYyBmaWxlcyBhcyB3ZWxsIGFzIG90aGVyIC5oIGZpbGVzKS4KICAgICBbS2VuIENvYXJdCgogICopIFRoZSBsaWJhcCByb3V0aW5lcyBub3cgaGF2ZSBhIGhlYWRlciBmaWxlIGZvciB0aGVpciBwcm90b3R5cGVzLAogICAgIHNyYy9hcC9hcC5oLCB0byBlYXNlIHRoZWlyIHVzZSBpbiBub24taHR0cGQgYXBwbGljYXRpb25zLiAgW0tlbiBDb2FyXQoKICAqKSBtb2RfYXV0b2luZGV4IHdpdGggYSBwbGFpbnRleHQgaGVhZGVyIGZpbGUgd291bGQgZW1pdCB0aGUgPFBSRT4KICAgICBzdGFydC10YWcgYmVmb3JlIHRoZSBIVE1MIHByZWFtYmxlLCByYXRoZXIgdGhhbiBhZnRlciB0aGUgcHJlYW1ibGUKICAgICBidXQgYmVmb3JlIHRoZSBoZWFkZXIgZmlsZSBjb250ZW50cy4gIFtKb2huIFZhbiBFc3NlbiA8anZlIGdhbWVycy5vcmc+XQogICAgIFBSIzE2NjcKCiAgKikgU0VDVVJJVFk6IEZpeCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyBpbiBsb2dyZXNvbHZlLiAgVGhpcyBpcwogICAgIG9ubHkgYW4gaXNzdWUgb24gc3lzdGVtcyB3aXRob3V0IGEgTUFYRE5BTUUgZGVmaW5lIG9yIHdoZXJlCiAgICAgdGhlIHJlc29sdmVyIHJldHVybnMgZG9tYWluIG5hbWVzIGxvbmdlciB0aGFuIE1BWEROQU1FLiAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogRWxpbWluYXRlIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyBpbiBjZmdfZ2V0bGluZSwgd2hpY2gKICAgICBpcyB1c2VkIHRvIHJlYWQgdmFyaW91cyB0eXBlcyBvZiBmaWxlcyBzdWNoIGFzIGh0YWNjZXNzIGFuZAogICAgIGh0cGFzc3dkIGZpbGVzLiAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSBodF90aW1lIGlzIGFsd2F5cwogICAgIHByb3Blcmx5IG51bGwgdGVybWluYXRlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgVGhlICJDb25uZWN0aW9uIiBoZWFkZXIgY291bGQgYmUgc2VudCBiYWNrIHdpdGggbXVsdGlwbGUgImNsb3NlIgogICAgIHRva2Vucy4gIE5vdCBhbiBlcnJvciwgYnV0IGEgd2FzdGUuCiAgICAgWzxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dIFBSIzE2ODMKCiAgKikgbW9kX3Jld3JpdGUncyBSZXdyaXRlTG9nIHNob3VsZCBiZWhhdmUgbGlrZSBtb2RfbG9nX2NvbmZpZywgaXQKICAgICBzaG91bGRuJ3QgZm9yY2UgaG9zdG5hbWUgbG9va3Vwcy4gIFtEZWFuIEdhdWRldF0gUFIjMTY4NAoKICAqKSAiYmFzaWMiIGF1dGggbmVlZHMgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uCiAgICAgWzxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dIFBSIzE2NjYKCiAgKikgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHRoZSBlbnZpcm9ubWVudCBwYXNzZWQgdG8gQ0dJcyBzaG91bGQKICAgICBvbmx5IGNvbnRhaW4gdmFyaWFibGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSByZWdleAogICAgIC9bYS16QS1aXVthLXpBLVowLTlfXSovLiAgVGhpcyBpcyBub3cgZW5mb3JjZWQgYnkgc3RhbXBpbmcKICAgICB1bmRlcnNjb3JlcyBvdmVyIGFueSBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgcmVnZXguICBUaGlzCiAgICAgYWZmZWN0cyBIVFRQXyogdmFyaWFibGVzLCBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSBiYWNrd2FyZAogICAgIGNvbXBhdGlibGUgZm9yIGFsbCB0aGUgc3RhbmRhcmQgaGVhZGVyczsgYW5kIGFmZmVjdHMgdmFyaWFibGVzCiAgICAgc2V0IHdpdGggU2V0RW52L0Jyb3dzZXJNYXRjaCBhbmQgc2ltaWxhciBkaXJlY3RpdmVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX3NwZWxpbmcgcmV0dXJuZWQgaW5jb3JyZWN0IEhSRUYncyB3aGVuIGFuIGFtYmlnb3VzIG1hdGNoCiAgICAgd2FzIGZvdW5kLiBOb3RpY2VkIGJ5IDxyb2JpbnRvbiBhbXRyYXNoLmNvbWxpbmsuZGU+IChTb2VyZW4gWmllaGUpCiAgICAgW1NvZXJlbiBaaWVoZSA8cm9iaW50b24gYW10cmFzaC5jb21saW5rLmRlPiwgTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEFwYWNoZSBub3cgY29tcGlsZXMgJiBydW5zIG9uIGFuIEVCQ0RJQyBtYWluZnJhbWUKICAgICAodGhlIFNpZW1lbnMgQlMyMDAwL09TRCBmYW1pbHkpIGluIHRoZSBQT1NJWCBzdWJzeXN0ZW0KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEZpeCBwcm9ibGVtIGtpbGxpbmcgY2hpbGRyZW4gd2hlbiB0ZXJtaW5hdGluZy4gIEFsbG93IF5DCiAgICAgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBwc3RyZHVwKCkgaXMgaW1wbGljaXQgaW4gY2FsbHMgdG8gdGFibGVfKiBmdW5jdGlvbnMsIHNvIHRoZXJlJ3MKICAgICBubyBuZWVkIHRvIGRvIGl0IGJlZm9yZSBjYWxsaW5nLiAgQ2xlYW4gdXAgYSBmZXcgY2FzZXMuCiAgICAgW01hcmMgU2xlbWtvLCBEZWFuIEdhdWRldF0KCiAgKikgbmV3IC1DIGFuZCAtYyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgdXNhZ2U6CiAgICAgLUMgImRpcmVjdGl2ZSIgOiBwcm9jZXNzIGRpcmVjdGl2ZSBiZWZvcmUgcmVhZGluZyBjb25maWcgZmlsZXMKICAgICAtYyAiZGlyZWN0aXZlIiA6IHByb2Nlc3MgZGlyZWN0aXZlIGFmdGVyIHJlYWRpbmcgY29uZmlnIGZpbGVzCiAgICAgZXhhbXBsZToKICAgICBodHRwZCAtQyAiUGVybE1vZHVsZSBBcGFjaGU6Omh0dHBkX2NvbmYiCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgTWFydGluIEtyYWVtZXJdCgogICopIFdJTjMyOiBGaXggdGhlIGV4ZWN1dGlvbiBvZiBDR0lzIHRoYXQgYXJlIHNjcmlwdHMgYW5kIGNhbGxlZCAKICAgICB3aXRoIHBhdGggaW5mbyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gJz0nIGluLgogICAgIChlZy4gaHR0cDovL3NlcnZlci9jZ2ktYmluL3ByaW50ZW52P2Zvb2JhcikgIAogICAgIFtNYXJjIFNsZW1rb10gUFIjMTU5MQoKICAqKSBXSU4zMjogRml4IGEgY2FsbCB0byBvc19jYW5vbmljYWxfZmlsZW5hbWUgc28gaXQgZG9lc24ndCB0cnkgdG8gCiAgICAgbWVzcyB3aXRoIGZha2UgZmlsZW5hbWVzLiAgVGhpcyBmaXhlcyBwcm94eSBjYWNoaW5nIG9uIAogICAgIHdpbjMyLiBQUiMxMjY1CgogICopIFNFQ1VSSVRZOiBHZW5lcmFsIG1vZF9pbmNsdWRlIGNsZWFudXAsIGluY2x1ZGluZyBmaXhpbmcgc2V2ZXJhbAogICAgIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvd3MgYW5kIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcC4KICAgICBbRGVhbiBHYXVkZXQsIE1hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogTnVtZXJvdXMgY2hhbmdlcyB0byBtb2RfaW1hcCBpbiBhIGdlbmVyYWwgY2xlYW51cAogICAgIGluY2x1ZGluZyBmaXhpbmcgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cuICBbRGVhbiBHYXVkZXRdCgogICopIFdJTjMyOiBvdmVyaGF1bCBvZiBtdWx0aXRocmVhZGluZyBjb2RlLiBTaHV0ZG93bnMgYXJlIG5vdyBncmFjZWZ1bAogICAgIChjb25uZWN0aW9ucyBhcmUgbm90IGRyb3BwZWQpLiBDb2RlIGNhbiBoYW5kbGUgZ3JhY2VmdWwgcmVzdGFydHMKICAgICAoYnV0IHRoZXJlIGlzIGFzIHlldCBubyB3YXkgdG8gc2lnbmFsIHRoaXMgdG8gQXBhY2hlKS4gVmFyaW91cwogICAgIG90aGVyIGNsZWFudXBzLiBbUGF1bCBTdXR0b25dCgogICopIFRoZSBhcGxvZ19lcnJvciBjaGFuZ2VzIHNwZWNpZmljIHRvIDEuMyBpbnRyb2R1Y2VkIGEgYnVmZmVyCiAgICAgb3ZlcnJ1biBpbiB0aGUgKG5vdyBsZWdhY3kpIGxvZ19wcmludGYgZnVuY3Rpb24uICBGaXhlZC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9kaWdlc3QgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbi4gIEl0CiAgICAgYWxzbyBsYWNrZWQgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzaW9uIG9mIHRoZSAiRGlnZXN0IgogICAgIHRva2VuLiAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0gUFIjMTU5OQoKICAqKSBBIGZldyBjbGVhbnVwcyBpbiBtb2Rfc3RhdHVzIGZvciBlZmZpY2llbmN5LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBIGZldyBjbGVhbnVwcyBpbiBtb2RfaW5mbyB0byBtYWtlIGl0IHRocmVhZC1zYWZlLCBhbmQgcmVtb3ZlIGFuCiAgICAgb2ZmLWJ5LTUgYnVnIHRoYXQgY291bGQgaGFtbWVyIFwwIG9uIHRoZSBzdGFjay4gW0RlYW4gR2F1ZGV0XQoKICAqKSBubzJzbGFzaCgpIHdhcyBPKG5eMikgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuICBNYWtlIGl0IE8obikuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IG1pZ3JhdGlvbiBmcm9tIHN0cm5jcHkoKSB0byBvdXIgImVuaGFuY2VkIiB2ZXJzaW9uIGNhbGxlZAogICAgIGFwX2NweXN0cm4oKSBmb3IgcGVyZm9ybWFuY2UgYW5kIGZ1bmN0aW9uYWxpdHkgcmVhc29ucy4KICAgICBMb2NhdGVkIGluIGxpYmFwLmEuICBbSmltIEphZ2llbHNraV0KCiAgKikgdGFibGVfc2V0KCkgYW5kIHRhYmxlX3Vuc2V0KCkgZGlkIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoCiAgICAgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUga2V5LgogICAgIFtTdGVwaGVuIFNjaGVjayA8c3NjaGVjayBpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKCiAgKikgVGhlIEF1dGhOYW1lIG11c3Qgbm93IGJlIGVuY2xvc2VkIGluIHF1b3RlcyBpZiBpdCBpcyB0byBjb250YWluCiAgICAgc3BhY2VzLiAgW0tlbiBDb2FyXSBQUiMxMTk1CgogICopIEFQSTogbmV3IGZ1bmN0aW9uOiBhcF9lc2NhcGVfcXVvdGVzKCkuIFtLZW4gQ29hcl0gUFIjMTE5NQoKICAqKSBXSU4zMjogV29yayBhcm91bmQgb3B0aW1pc2VyIGJ1ZyB0aGF0IGtpbGxlZCBJU0FQSSBpbiByZWxlYXNlCiAgICAgdmVyc2lvbnMuIFtCZW4gTGF1cmllXSBQUiMxNTMzCgogICopIFBPUlQ6IFVwZGF0ZSB0aGUgTVBFIHBvcnQgW01hcmsgQml4YnksIEppbSBKYWdpZWxza2ldCgogICopIEludGVyaW0gKHNsb3cpIGZpeCBmb3IgcC0+c3ViX3Bvb2wgY3JpdGljYWwgc2VjdGlvbnMgaW4KICAgICBhbGxvYy5jIChhZmZlY3RzIHdpbjMyIG9ubHkpLiAgW0JlbiBIeWRlXQoKICAqKSBub24tV0lOMzIgd2FzIG1pc3NpbmcgZGVzdHJveV9tdXRleCBkZWZpbml0aW9uLiAgW0JlbiBIeWRlXQoKICAqKSBzZW5kX2ZkX2xlbmd0aCgpIGRpZCBub3QgY2FsY3VsYXRlIHRvdGFsX2J5dGVzX3NlbnQgcHJvcGVybHkuCiAgICAgW0JlbiBSZXNlciA8YnJlc2VyIHJlZ25vdy5jb20+XSBQUiMxMzY2CgogICopIFRoZSBicHV0YygpIG1hY3JvIHdhcyBub3QgcHJvcGVybHkgaW50ZWdyYXRlZCB3aXRoIHRoZSBjaHVua2luZwogICAgIGNvZGU7IGluIG1hbnkgY2FzZXMgbW9kdWxlcyB1c2luZyBicHV0YygpIGNvdWxkIGNhdXNlIGNvbXBsZXRlbHkKICAgICBib2d1cyBjaHVua2VkIG91dHB1dC4gIChUeXBpY2FsbHkgdGhpcyB3aWxsIHNob3cgdXAgYXMgcHJvYmxlbXMKICAgICB3aXRoIEludGVybmV0IEV4cGxvcmVyIDQuMCByZWFkaW5nIGEgcGFnZSwgYnV0IG90aGVyIGJyb3dzZXJzCiAgICAgaGF2aW5nIG5vIHByb2JsZW0uKSBbRGVhbiBHYXVkZXRdCgogICopIENyZWF0ZSBMQVJHRV9XUklURV9USFJFU0hPTEQgZGVmaW5lIHdoaWNoIGRldGVybWluZXMgaG93IG1hbnkKICAgICBieXRlcyBoYXZlIHRvIGJlIHN1cHBsaWVkIHRvIGJ3cml0ZSgpIGJlZm9yZSBpdCB3aWxsIGNvbnNpZGVyCiAgICAgZG9pbmcgYSB3cml0ZXYoKSB0byBhc3NlbWJsZSBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBzeXN0ZW0KICAgICBjYWxsLiAgVGhpcyBpcyBjcml0aWNhbCBmb3IgbW9kdWxlcyBzdWNoIGFzIG1vZF9pbmNsdWRlLAogICAgIG1vZF9hdXRvaW5kZXgsIG1vZF9waHAzIHdoaWNoIGFsbCB1c2UgYnB1dGMoKS9icHV0cygpIG9mIHNtYWxsZXIKICAgICBzdHJpbmdzIGluIHNvbWUgY2FzZXMuICBUaGUgcmVzdWx0IHdvdWxkIGJlIGV4dHJhIGVmZm9ydAogICAgIHNldHRpbmcgdXAgd3JpdGV2KCksIGFuZCBpbiBtYW55IGNhc2VzIGV4dHJhIGVmZm9ydCBidWlsZGluZwogICAgIGNodW5rcy4gIFRoZSBkZWZhdWx0IGlzIDMxLCBpdCBjYW4gYmUgb3ZlcnJpZGVuIGF0IGNvbXBpbGUKICAgICB0aW1lLiBbRGVhbiBHYXVkZXRdCgogICopIE1vdmUgdGhlIGdpZCBzd2l0Y2hpbmcgY29kZSBpbnRvIHRoZSBjaGlsZCBzbyB0aGF0IGxvZyBmaWxlcwogICAgIGFuZCBwaWQgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIHRoZSByb290IGdpZC4KICAgICBbR3JlZ29yeSBBIEx1bmRiZXJnIDxsdW5kYmVyZyB2ci5uZXQ+XQoKICAqKSBXSU4zMjogQ2hlY2sgZm9yIGJpbmFyaWVzIGJ5IGxvb2tpbmcgZm9yIHRoZSBleGVjdXRhYmxlIGhlYWRlcgogICAgIGluc3RlYWQgb2YgY291bnRpbmcgY29udHJvbCBjaGFyYWN0ZXJzLgogICAgIFtKaW0gUGF0dGVyc29uIDxKaW0uUGF0dGVyc29uIENvZ25vcy5DT00+XSBQUiMxMzQwCgogICopIGFwX3NucHJpbnRmKCkgbW92ZWQgZnJvbSBtYWluL3V0aWxfc25wcmludGYuYyB0byBhcC9hcF9zbnByaW50Zi5jCiAgICAgc28gdGhlIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBvdGhlciB0aGFuIHRoZQogICAgIHNlcnZlciBpdHNlbGYgKGxpa2UgdGhlIHNyYy9zdXBwb3J0IHRvb2xzKS4gIFtLZW4gQ29hcl0KCiAgKikgYXBfc2xhY2soKSBtb3ZlZCBvdXQgb2YgbWFpbi91dGlsLmMgaW50byBhcC9hcF9zbGFjay5jIGFzIHBhcnQgb2YKICAgICB0aGUgbGliYXAgY29uc29saWRhdGlvbiB3b3JrLiAgW0tlbiBDb2FyXQoKICAqKSBhcF9zbnByaW50ZigpIHdpdGggYSBsZW4gb2YgMCBiZWhhdmVkIGxpa2Ugc3ByaW50ZigpLiAgVGhpcyBpcyBub3QKICAgICB1c2VmdWwsIGFuZCBpc24ndCB3aGF0IHRoZSBzdGFuZGFyZHMgcmVxdWlyZS4gIE5vdyBpdCByZXR1cm5zIDAKICAgICBhbmQgd3JpdGVzIG5vdGhpbmcuICBbRGVhbiBHYXVkZXRdCgogICopIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIGZjbnRsKCkgbG9ja2luZyBzdWdnZXN0IHRoZSB1c2VyIGxvb2sgdXAKICAgICB0aGUgZG9jcyBmb3IgTG9ja0ZpbGUuICBbRGVhbiBHYXVkZXRdCgogICopIEVsaW1pbmF0ZSBzb21lIGRlYWQgY29kZSBmcm9tIHdyaXRldl9pdF9hbGwoKS4KICAgICBbSWdvciBUYXRhcmlub3YgPHRhdGFyaW5vIHByYWlyaWUuTm9EYWsuZWR1Pl0KCiAgKikgbW9kX2F1dG9pbmRleCBoYWQgYW4gZnJlYWQoKSB3aXRob3V0IGNoZWNraW5nIHRoZSByZXN1bHQgY29kZS4KICAgICBJdCBhbHNvIHdvdWxkbid0IGhhbmRsZSAiQWRkSWNvbkJ5VHlwZSAoVFhULC9pY29ucy90ZXh0LmdpZiB0ZXh0LyoiCiAgICAgKG5vdGUgdGhlIG1pc3NpbmcgY2xvc2luZyBwYXJlbikgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCgogICopIEl0IGFwcGVhcnMgdGhlICIyNTd0aCBieXRlIiBidWcgKHNlZQogICAgIGh0ZG9jcy9tYW51YWwvbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCMyNTd0aC1ieXRlKSBjYW4gaGFwcGVuCiAgICAgYXQgdGhlIDI1NnRoIGJ5dGUgYXMgd2VsbC4gIEZpeGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBGaXggbW9kX21pbWVfbWFnaWMgdW5kZXIgT1MvMiwgbm8gc3VwcG9ydCBmb3IgYmxvY2sgZGV2aWNlcy4KICAgICBbQnJpYW4gSGF2YXJkXQoKICAqKSBGaXggbWVtb3J5IGNvcnJ1cHRpb24gY2F1c2VkIGJ5IGFsbG9jYXRpbmcgYXV0aCB1c2VybmFtZXMgaW4gdGhlCiAgICAgd3JvbmcgcG9vbC4gIFtEZWFuIEdhdWRldF0gUFIjMTUwMAoKICAqKSBGaXggYW4gb2ZmLWJ5LTEsIGFuZCBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGVycm9yIGluCiAgICAgbW9kX21pbWVfbWFnaWMuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBhIHBvdGVudGlhbCBTRUdWIHByb2JsZW0gaW4gbW9kX25lZ290aWF0aW9uIHdoZW4gZGVhbGluZwogICAgIHdpdGggdHlwZS1tYXBzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBCZXR0ZXIgZ2xpYmMgc3VwcG9ydCB1bmRlciBMaW51eC4gIFtEZWFuIEdhdWRldF0gUFIjMTU0MgoKICAqKSAiUmVkaXJlY3RNYXRjaCBnb25lIC8iIHdvdWxkIGNhdXNlIGEgU0lHU0VHVi4gW0RlYW4gR2F1ZGV0XSBQUiMxMzE5CgogICopIFdJTjMyOiBhdm9pZCBvdmVyZmxvd3MgZHVyaW5nIGZpbGUgY2Fub25pY2FsaXNhdGlvbnMuCiAgICAgWzxtYWxjb2xtIG1nZGV2LmRlbW9uLmNvLnVrPl0gUFIjMTM3OAoKICAqKSBXSU4zMjogc2V0X2ZpbGVfc2xvdCgpIGRpZG4ndCBkZXRlY3QgYWJzb2x1dGUgcGF0aHMuIFtCZW4gTGF1cmllXQogICAgIFBSIzE1MTEsIDE1MDgKCiAgKikgV0lOMzI6IG1vZF9zdGF0dXMgZGlzcGxheSBoZWFkZXIgZGlkbid0IG1hdGNoIGZpZWxkcy4gW0JlbiBMYXVyaWVdCgogICopIFRoZSBwdGhyZWFkX211dGV4XyogZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvciBjb2RlLCBhbmQgZG9uJ3QKICAgICBzZXQgZXJybm8uICBbSWdvciBUYXRhcmlub3YgPHRhdGFyaW5vIHByYWlyaWUuTm9EYWsuZWR1Pl0KCiAgKikgV0lOMzI6IEFsbG93IHNwYWNlcyB0byBwcmVmaXggdGhlIGludGVycHJldGVyIGluICMhIGxpbmVzLgogICAgIFtCZW4gTGF1cmllXSBQUiMxMTAxCgogICopIFdJTjMyOiBDdXJlIGZpbGUgbGVhayBpbiBDR0lzLiBbUGV0ZXIgVGlsbGVtYW5zIDxwdGkgbmV0NGFsbC5iZT5dIFBSIzE1MjMKCiAgKikgcHJveHlfZnRwOiB0aGUgZGlyZWN0b3J5IGxpc3RpbmdzIGdlbmVyYXRlZCBieSB0aGUgcHJveHkgZnRwIG1vZHVsZQogICAgIG5vdyBoYXZlIGEgdGl0bGUgaW4gd2hpY2ggdGhlIHBhdGggY29tcG9uZW50cyBhcmUgY2xpY2thYmxlIGFuZCBhbGxvdwogICAgIHF1aWNrIG5hdmlnYXRpb24gdG8gdGhlIGNsaWNrZWQtb24gZGlyZWN0b3J5IG9uIHRoZSBjdXJyZW50bHkgbGlzdGVkCiAgICAgZnRwIHNlcnZlci4gVGhpcyBhbHNvIGZpeGVzIGEgYnVnIHdoZXJlIHRoZSAiLi4iIGRpcmVjdG9yeSBsaW5rcyB3b3VsZAogICAgIHNvbWV0aW1lcyByZWZlciB0byB0aGUgd3JvbmcgZGlyZWN0b3J5LiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBXSU4zMjogQWxsb2NhdGUgdGhlIGNvcnJlY3QgYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIHNjb3JlYm9hcmQuCiAgICAgW0JlbiBIeWRlXSBQUiMxMzg3CgogICopIFdJTjMyOiBPbmx5IGxvd2VyY2FzZSB0aGUgcGFydCBvZiB0aGUgcGF0aCB0aGF0IGlzIHJlYWwuIFtCZW4gTGF1cmllXQogICAgIFBSIzE1MDUKCiAgKikgRml4IHByb2JsZW1zIHdpdGggdGltZW91dHMgaW4gaW5ldGQgbW9kZSBhbmQgLVggbW9kZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IHRoZSBzcHVyaW91cyAiKDApdW5rbm93biBlcnJvcjogbW1hcF9oYW5kbGVyOiBtbWFwIGZhaWxlZCIKICAgICBlcnJvciBtZXNzYWdlcy4gW0JlbiBIeWRlXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjNiMwoKICAqKSBXSU4zMjogV29yayBhcm91bmQgYnJhaW4tZGFtYWdlZCBzcGF3biBjYWxscyB0aGF0IGNhbid0IGRlYWwKICAgICB3aXRoIHNwYWNlcyBhbmQgc2xhc2hlcy4gIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogRml4IHRoZSBjb2RlIHNvIENHSXMgY2FuIHVzZSBzb2NrZXQgY2FsbHMgb24gV2luZG93cy4gIAogICAgIFRoZSBwcm9ibGVtIHdhcyB0aGF0IGNlcnRhaW4gdW5kb2N1bWVudGVkIGVudmlyb25tZW50IHZhcmlhYmxlcwogICAgIG5lZWRlZCBmb3Igc29ja2V0cyB0byB3b3JrIHVuZGVyIFdpbjMyIHdlcmUgbm90IGJlaW5nIHBhc3NlZC4KICAgICBbRnJhbmsgRmF1YmVydCA8ZnJhbmsgc2FuZS5jb20+XQoKICAqKSBBZGQgYSAiLVYiIGNvbW1hbmQgbGluZSBmbGFnIHRvIHRoZSBodHRwZCBiaW5hcnkuICBUaGlzIAogICAgIGZsYWcgc2hvd3Mgc29tZSBvZiB0aGUgZGVmaW5lcyB0aGF0IEFwYWNoZSB3YXMgY29tcGlsZWQgd2l0aC4KICAgICBJdCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgU3RhcnQgc2VwYXJhdGluZyB0aGUgYXBfKigpIHJvdXRpbmVzIGludG8gdGhlaXIgb3duIGxpYnJhcnksIHNvIHRoZXkKICAgICBjYW4gYmUgdXNlZCBieSBpdGVtcyBpbiBzcmMvc3VwcG9ydCBhbW9uZyBvdGhlciB0aGluZ3MuICAKICAgICBbS2VuIENvYXJdIFBSIzUxMiwgOTA1LCAxMjUyLCAxMzA4IAoKICAqKSBHaXZlIGEgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvciB3aGVuIG5vIEF1dGhUeXBlIGlzIHNldC4KICAgICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBSZW1vdmUgc3RydG91bCgpIHVzZSBmcm9tIG1vZF9wcm94eSBiZWNhdXNlIGl0IGlzbid0IGF2YWlsYWJsZQogICAgIG9uIGFsbCBwbGF0Zm9ybXMuICAgW01hcmMgU2xlbWtvXSBQUiMxMjE0CgogICopIFdJTjMyOiBTb21lIFdpbjMyIHN5c3RlbXMgdGVybWluYXRlZCBhbGwgcmVzcG9uc2VzIGFmdGVyIDE2IGtCLiAKICAgICBUaGlzIHR1cm5zIG91dCB0byBiZSBhIGJ1ZyBpbiBXaW5zb2NrIC0gc2VsZWN0KCkgZG9lc24ndCBhbHdheXMgCiAgICAgcmV0dXJuIHRoZSBjb3JyZWN0IHN0YXR1cy4gIFtCZW4gTGF1cmllXQoKICAqKSBEaXJlY3RpdmVzIG93bmVkIGJ5IGh0dHBfY29yZSBjYW4gbm93IHVzZSB0aGUgbmV3IGNoZWNrX2NtZF9jb250ZXh0KCkKICAgICByb3V0aW5lIHRvIGVuc3VyZSB0aGF0IHRoZXkncmUgbm90IGJlaW5nIHVzZWQgd2l0aGluIGEgY29udGFpbmVyCiAgICAgKGUuZy4sIDxEaXJlY3Rvcnk+KSB3aGVyZSB0aGV5J3JlIGludmFsaWQuICBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IFJlY2VudCBjaGFuZ2VzIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIGFkZCBleHBsaWNpdCBwcm90b3R5cGUKICAgICBmb3IgZmdldGMoKSBhbmQgZmdldHMoKSBvbiBTdW5PUyA0LnguICBbTWFydGluIEtyYWVtZXIsIEJlbiBIeWRlXQoKICAqKSBJdCB3YXMgbmVjZXNzYXJ5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gcmVzb3VyY2VzIHdoaWNoIGFyZQogICAgIGFsbG9jYXRlZCBpbiB0aGUgcGFyZW50LCBmb3IgY2xlYW51cCBpbiB0aGUgcGFyZW50LCBhbmQgcmVzb3VyY2VzCiAgICAgd2hpY2ggYXJlIGFsbG9jYXRlZCBpbiBlYWNoIGNoaWxkLCBmb3IgY2xlYW51cCBpbiBlYWNoIGNoaWxkLgogICAgIEEgbmV3IHBvb2wgd2FzIGNyZWF0ZWQgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBtb2R1bGUgY2hpbGRfaW5pdAogICAgIGFuZCBjaGlsZF9leGl0IGZ1bmN0aW9uczsgbW9kdWxlcyBhcmUgZnJlZSB0byByZWdpc3RlciBwZXItY2hpbGQKICAgICBjbGVhbnVwcyB0aGVyZS4gIFRoaXMgZml4ZXMgYSBidWcgd2l0aCByZWxpYWJsZSBwaXBlZCBsb2dzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX2F1dG9pbmRleCB3YXNuJ3QgZGlzcGxheWluZyB0aGUgUmVhZG1lTmFtZSBmaWxlIGF0IHRoZSBib3R0b20KICAgICB1bmxlc3MgaXQgd2FzIGFsc28gZG9pbmcgRmFuY3lJbmRleGVzLCBidXQgaXQgZGlzcGxheWVkIHRoZQogICAgIEhlYWRlck5hbWUgZmlsZSBhdCB0aGUgdG9wIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLiAgSXQgbm93IHNob3dzCiAgICAgdGhlIFJlYWRtZU5hbWUgZmlsZSBmb3Igc2ltcGxlIGluZGljZXMsIHRvbywgYXMgaXQgc2hvdWxkLiAgCiAgICAgW0tlbiBDb2FyXSBQUiMxMzczCgogICopIGh0dHBfY29yZSB3YXMgbW1hcCgpaW5nIGV2ZW4gaW4gY2FzZXMgd2hlcmUgaXQgd2Fzbid0IGdvaW5nIHRvCiAgICAgcmVhZCB0aGUgZmlsZS4gIFtCZW4gSHlkZSA8Ymh5ZGUgZ2Vuc3ltLmNvbT5dCgogICopIENvbXBsZXRlIHJld3JpdGUgOy0pIG9mIG1vZF9yZXdyaXRlJ3MgVVJMIHJld3JpdGluZyBlbmdpbmU6CiAgICAgTm93IHRoZSByZXdyaXRpbmcgZW5naW5lICh0aGUgaGVhcnQgb2YgbW9kX3Jld3JpdGUpIGlzIG9yZ2FuaXplZCBtb3JlCiAgICAgc3RyYWlnaHQtZm9yd2FyZCwgZmlyc3QgdGltZSB3ZWxsIGRvY3VtZW50ZWQgYW5kIHJlZHVjZWQgdG8gdGhlIHJlYWxseQogICAgIGVzc2VudGlhbCBwYXJ0cy4gQWxsIHJlZHVuZGFudCBjYXNlcyB3ZXJlIHN0cmlwcGVkIG9mZiBhbmQgcHJvY2Vzc2luZyBub3cKICAgICBpcyB0aGUgc2FtZSBmb3IgYm90aCBwZXItc2VydmVyIGFuZCBwZXItZGlyZWN0b3J5IGNvbnRleHQgd2l0aCBvbmx5IGEKICAgICBtaW5pbXVtIGRpZmZlcmVuY2UgKHRoZSBwcmVmaXggc3RyaXBwaW5nIGluIHBlci1kaXIgY29udGV4dCkuIEFzIGEKICAgICBzaWRlLWVmZmVjdCBzb21lIHN1YnRsZSByZXN0cmljdGlvbnMgYW5kIHR3byByZWNlbnRseSBkaXNjb3ZlcmVkIHByb2JsZW1zCiAgICAgYXJlIGdvbmU6IFdyb25nIGVzY2FwaW5nIG9mIFFVRVJZX1NUUklORyBvbiByZWRpcmVjdHMgaW4gcGVyLWRpcmVjdG9yeQogICAgIGNvbnRleHQgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgc3Vic3RpdHV0aW9uIFVSTCBvbiByZWRpcmVjdHMuCiAgICAgQWRkaXRpb25hbGx5IHNvbWUgbWlub3Igc291cmNlIGNsZWFudXBzIHdlcmUgZG9uZS4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIAoKICAqKSBMYXJzIEVpbGVicmVjaHQgd3JvdGUgYSB3aG9sZSBuZXcgc2V0IG9mIEFwYWNoZSBWaG9zdCBJbnRlcm5hbHMKICAgICBkb2N1bWVudGF0aW9uLCBleGFtcGxlcywgZXhwbGFuYXRpb25zIGFuZCBjYXZlYXRzLiBUaGV5IGxpdmUgaW4gYSBuZXcKICAgICBzdWJkaXJlY3RvcnkgaHRkb2NzL21hbnVhbC92aG9zdC8uIFtMYXJzIEVpbGVicmVjaHQgPHNmeCB1bml4LWFnLm9yZz5dCgogICopIElmIGFwX3NsYWNrIGZhaWxzIHRvIGFsbG9jYXRlIGFib3ZlIHRoZSBsb3cgc2xhY2sgbGluZSBpdCdzIGEgZ29vZAogICAgIGluZGljYXRpb24gdGhhdCBmdXJ0aGVyIHByb2JsZW1zIHdpbGwgb2NjdXI7IGl0J3MgYSBiZXR0ZXIgaW5kaWNhdGlvbgogICAgIHRoYW4gbWFueSBleHRlcm5hbCBsaWJyYXJpZXMgZ2l2ZSB1cyB3aGVuIHdlIGFjdHVhbGx5IHJ1biBvdXQgb2YKICAgICBkZXNjcmlwdG9ycy4gIFNvIHJlcG9ydCBpdCB0byB0aGUgdXNlciBvbmNlIHBlciByZXN0YXJ0LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTE4MQoKICAqKSBDaGFuZ2UgbW9kX2luY2x1ZGUgYW5kIG1vZF9hdXRvaW5kZXggdG8gdXNlIFkySy1zYWZlIGRhdGUgZm9ybWF0cwogICAgIGJ5IGRlZmF1bHQuICBbS2VuIENvYXJdCgogICopIEFkZCBhICJTdXBwcmVzc0NvbHVtblNvcnRpbmciIG9wdGlvbiB0byB0aGUgSW5kZXhPcHRpb25zIGxpc3QsCiAgICAgd2hpY2ggd2lsbCBrZWVwIHRoZSBjb2x1bW4gaGVhZGluZyBmcm9tIGJlaW5nIGxpbmtzIGZvciBzb3J0aW5nCiAgICAgdGhlIGRpc3BsYXkuICBbS2VuIENvYXIsIHN1Z2dlc3RlZCBieSBCcmlhbiBUaWVtYW5uIDxidG1hbiBwYWNpZmljLm5ldD5dCiAgICAgUFIgIzEyNjEKCiAgKikgUE9SVDogVXBkYXRlIHRoZSBMeW54T1MgcG9ydC4gIFtNYXJpdXMgR3JvZWdlciA8bWFnIHN5c2dvLmRlPl0KCiAgKikgRml4IGxvZ2ljIGVycm9yIHdoZW4gaXNzdWluZyBhIG1tYXAoKSBmYWlsZWQgbWVzc2FnZQogICAgIHdpdGggYSBub24temVybyBNTUFQX1RIUkVTSE9MRC4KICAgICBbRGF2aWQgQ2hhbWJlcnMgPGRhdmlkYyBmbG9zdW4uc2Fsay5lZHU+XSBQUiMxMjk0CgogICopIFByZXNlcnZlIGhhbmRsZXIgdmFsdWUgb24gUHJveHlQYXNzJ2VkIHJlcXVlc3RzIGJ5IG5vdAogICAgIGNhbGxpbmcgZmluZF90eXBlcyBvbiBhIHByb3h5J2QgcmVxdWVzdDsgZml4ZXMgcHJvYmxlbXMKICAgICB3aGVyZSBzb21lIFByb3h5UGFzcydlZCBVUkxzIHdlcmVuJ3QgYWN0dWFsbHkgcGFzc2VkCiAgICAgdG8gdGhlIHByb3h5LgogICAgIFtMYXJzIEVpbGVicmVjaHRdIFBSIzg3MAoKICAqKSBGaXggYSBieXRlIG9yZGVyaW5nIHByb2JsZW0gaW4gbW9kX2FjY2VzcyB3aGljaCBwcmV2ZW50ZWQKICAgICB0aGUgb2xkLXN0eWxlIHN5bnRheCAoaS5lLiAiYS5iLmMuIiB0byBtYXRjaCBhIGNsYXNzIEMpCiAgICAgZnJvbSB3b3JraW5nIHByb3Blcmx5LiBbRGVhbiBHYXVkZXRdIFBSIzEyNDgsIDEzMjgsIDEzODQKCiAgKikgRml4IHByb2JsZW0gd2l0aCBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgbm90IHdvcmtpbmcKICAgICBwcm9wZXJseS4gRWFjaCBjaGlsZCBuZWVkcyB0byBvcGVuIHRoZSBsb2NrZmlsZSBpbnN0ZWFkCiAgICAgb2YgdXNpbmcgdGhlIHBhc3NlZCBmaWxlLWRlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50LiAKICAgICBbSmltIEphZ2llbHNraV0gUFIjMTA1NgoKICAqKSBGaXggdGhlIGVycm9yIGxvZ2dpbmcgaW4gbW9kX2NnaTsgdGhlIHJlY2VudCBlcnJvciBsb2cgY2hhbmdlcwogICAgIGludHJvZHVjZWQgYSBidWcgdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbSB3b3JraW5nIGNvcnJlY3RseS4KICAgICBbTS5ELlBhcmtlcl0gUFIjMTM1MgoKICAqKSBEZWZhdWx0IHRvIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBvbiBIUFVYIHRvIHByb3Blcmx5IAogICAgIGhhbmRsZSBtdWx0aXBsZSBMaXN0ZW4gZGlyZWN0aXZlcy4gIFtNYXJjIFNsZW1rb10gUFIjODcyCgogICopIEluaGVyaXQgYSBidWdmaXggdG8gZm5tYXRjaC5jIGZyb20gRnJlZUJTRCBzb3VyY2VzLgogICAgIFsiW0tPSTgtUl0g4c7E0sXKIP7F0s7P1yIgPGFjaGUgbmFndWFsLnBwLnJ1Pl0gUFIjMTMxMQoKICAqKSBXaGVuIGEgY29uZmlndXJhdGlvbiBwYXJzZSBjb21wbGFpbmVkIGFib3V0IGEgYmFkIGRpcmVjdGl2ZSwKICAgICB0aGUgbG9nZ2VyIHdvdWxkIHVzZSB3aGF0ZXZlciAodW5yZWxhdGVkKSB2YWx1ZSB3YXMgaW4gZXJybm8uCiAgICAgZXJybm8gaXMgbm93IGZvcmNlZCB0byBFSU5WQUwgZmlyc3QgaW4gdGhpcyBjYXNlLiAgW0tlbiBDb2FyXQoKICAqKSBBIHNlZCBjb21tYW5kIGluIHRoZSBDb25maWd1cmUgc2NyaXB0IHB1c2hlZCB0aGUgZWRnZSBvZiBQT1NJWG5lc3MsCiAgICAgYnJlYWtpbmcgb24gc29tZSBzeXN0ZW1zLiAgW0JoYWJhIFIuTWlzcmEgPHN5c3RlbSB2dC5lZHU+XSBQUiMxMzY4CgogICopIFNvbGFyaXMgPj0gMi41IHdhcyB0b3RhbGx5IGJyb2tlbiBkdWUgdG8gYSBtZXNzIHVwIHVzaW5nIHB0aHJlYWQKICAgICBtdXRleGVzLiAgW1JveSBGaWVsZGluZywgRGVhbiBHYXVkZXRdCgogICopIE9TLzIgUG9ydCB1cGRhdGVkOyBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnVpbGQgT1MvMiBmcm9tIHRoZSBzYW1lCiAgICAgc291cmNlcyBhcyBVbml4IG5vdy4gIFtCcmlhbiBIYXZhcmQgPGJyaWFuaCBraGVsZGFyLmFwYW5hLm9yZy5hdT5dCgogICopIEZpeCBhIHllYXIgZm9ybWF0dGluZyBidWcgaW4gbW9kX3VzZXJ0cmFjay4KICAgICBbUGF1bCBFZ2dlcnQgPGVnZ2VydCB0d2luc3VuLmNvbT5dIFBSIzEzNDIKCiAgKikgQSBtaWxkIFNJR1RFUk0vU0lHQUxSTSByYWNlIGNvbmRpdGlvbiB3YXMgZWxpbWluYXRlZC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzEyMTEKCiAgKikgV2FybiB1c2VyIHRoYXQgZGVmYXVsdCBwYXRoIGhhcyBjaGFuZ2VkIGlmIC91c3IvbG9jYWwvZXRjL2h0dHBkCiAgICAgaXMgZm91bmQgb24gdGhlIHN5c3RlbS4gIFtMYXJzIEVpbGVicmVjaHRdCgogICopIFZhcmlvdXMgbW9kX21pbWVfbWFnaWMgYnVnIGZpeGVzIGFuZCBjbGVhbnVwczogVW5jb21wcmVzc2lvbgogICAgIHNob3VsZCB3b3JrLCBpdCBzaG91bGQgd29yayBvbiBXSU4zMiwgYW5kIGEgZmV3IHJlc291cmNlCiAgICAgbGVha3MgYW5kIGFib3J0IGNvbmRpdGlvbnMgYXJlIGZpeGVkLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTIwNQoKICAqKSBQT1JUOiBPbiBBSVggMS54IGZpbGVzIGNhbid0IGJlIG5hbWVkICdAJywgZml4IHRoZSBwcm94eSBjYWNoZQogICAgIHRvIHVzZSAnJScgaW5zdGVhZCBvZiAnQCcgaW4gaXRzIGVuY29kaW5ncy4KICAgICBbRGF2aWQgU2NodWxlciA8c2NodWxkIGJ0di5pYm0uY29tPl0gUFIjMTMxNwoKICAqKSBJbXByb3ZlIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZ2VuZXJhdGVkIHdoZW4gdGhlICJzZXJ2ZXIgaXMgYnVzeSIuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMjkzCgogICopIFBPUlQ6IEFsbCBwb3J0cyB3aGljaCBkb24ndCBvdGhlcndpc2UgZGVmaW5lIERFRl9XQU5USFNSRUdFWCB3aWxsCiAgICAgZ2V0IFNwZW5jZXIgcmVnZXggYnkgZGVmYXVsdC4gIFRoaXMgaXMgdG8gYXZvaWQgaGF2aW5nIHRvCiAgICAgZGlzY292ZXIgYnVncyBpbiBvcGVyYXRpbmcgc3lzdGVtIGxpYnJhcmllcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogIkZpeCIgUFIjNDY3IGJ5IGdlbmVyYXRpbmcgd2FybmluZ3Mgb24gc3lzdGVtcyB3aGljaCB3ZSBoYXZlCiAgICAgbm90IGJlZW4gYWJsZSB0byBnZXQgd29ya2luZyBVU0VfKl9TRVJJQUxJWkVEX0FDQ0VQVCBzZXR0aW5ncyBmb3IuCiAgICAgRG9jdW1lbnQgdGhpcyBhIGJpdCBtb3JlIGluIHNyYy9QT1JUSU5HLiAgW0RlYW4gR2F1ZGV0XSBQUiM0NjcKCiAgKikgRW5zdXJlIHRoYXQgb25lIGNvcHkgb2YgY29uZmlnIHdhcm5pbmdzIG1ha2VzIGl0IHRvIHRoZQogICAgIGVycm9yX2xvZy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSW52ZW50IG5ldyBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQgbWV0aG9kcyB0byBoYW5kbGUgY29uZmlnIGZpbGUKICAgICByZWFkaW5nLiBBZGQgImN1c3RvbSIgaG9vayB0byB1c2UgY29uZmlnIGZpbGUgY2ZnX2dldGxpbmUoKSBvbgogICAgIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBGSUxFKiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBNYWtlIHNpbmdsZS1leGUgV2luZG93cyBpbnN0YWxsLiBbQmVuIExhdXJpZSBhbmQgRXJpYyBFc3NlbGlua10KCiAgKikgV0lOMzI6IE1ha2UgQ0dJIHdvcmsgdW5kZXIgV2luOTUuIFtCZW4gTGF1cmllIGFuZCBQYXVsIFN1dHRvbl0KCiAgKikgV0lOMzI6IE1ha2UgaW5kZXguaHRtbCBhbmQgZnJpZW5kcyB3b3JrIHVuZGVyIFdpbjk1LiBbQmVuIExhdXJpZV0KCiAgKikgUE9SVDogU29sYXJpcyAyLjQgbmVlZHMgU3BlbmNlciByZWdleCwgdGhlIHN5c3RlbSByZWdleCBpcyBicm9rZW4uCiAgICAgW0pvaG4gTGluZSA8am1sNCBjYW0uYWMudWs+XSBQUiMxMzIxCgogICopIERlZmF1bHQgcGF0aG5hbWUgaGFzIGJlZW4gY2hhbmdlZCBldmVyeXdoZXJlIHRvIC91c3IvbG9jYWwvYXBhY2hlCiAgICAgW1NhbWVlciA8c2FtZWVyIGMyLm5ldD5dCgogICopIFBPUlQ6IEFJWCBub3cgdXNlcyBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQuCiAgICAgW0RhdmlkIEJyb25kZXIgPERhdmlkLUJyb25kZXIgdWlvd2EuZWR1Pl0gUFIjODQ5CgogICopIFBPUlQ6IGkzODYgQUlYIGRvZXMgbm90IGhhdmUgbWVtbW92ZS4KICAgICBbRGF2aWQgU2NodWxlciA8c2NodWxkIGJ0di5pYm0uY29tPl0gUFIjMTI2NwoKICAqKSBQT1JUOiBIUFVYIG5vdyBkZWZhdWx0cyB0byB1c2luZyBTcGVuY2VyIHJlZ2V4LgogICAgIFtQaGlsaXBwZSBWYW5oYWVzZW5kb25jayA8cHZhbmhhZXMgYmUub3JhY2xlLmNvbT4sCiAgICAgT21hciBEZWwgUmlvIDxhbDExMjI2MyBhY2FkZW0wMS5sYWcuaXRlc20ubXg+XSBQUiM0ODIsIDEyNDYKCiAgKikgUE9SVDogU29tZSB2ZXJzaW9ucyBvZiBOZXRCU0QgZG9uJ3QgYXV0b21hdGljYWxseSBkZWZpbmUKICAgICBfX05ldEJTRF9fLiAgV29ya2Fyb3VuZCBieSBkZWZpbmluZyBORVRCU0QuCiAgICAgW0NocmlzIENyYWZ0IDxjY3JhZnQgY25jYy5jYy5jby51cz5dIFBSIzk3NwoKICAqKSBQT1JUOiBVbml4V2FyZSAyLnggcmVxdWlyZXMgLWxnZW4gZm9yIHN5c2xvZy4KICAgICBbSGFucyBTbmlqZGVyIDxocyBtZWdhbmV0Lm5sPl0gUFIjMTI0OQoKICAqKSBQT1JUOiBVTFRSSVggYXBwZWFycyB0byBub3QgaGF2ZSBzeXNsb2cuCiAgICAgW0xhcnMgRWlsZWJyZWNodCA8TGFycy5FaWxlYnJlY2h0IHVuaXgtYWcub3JnPl0KCiAgKikgUE9SVDogQmFzaWMgR2VtaW5pIHBvcnQgKHRyZWF0IGl0IGxpa2UgdW5peHdhcmUyMTIpLgogICAgIFsiUGF2ZWwgWWFrb3ZsZXYgKFBhdWwgTWNIYWNrZXIpIiA8aGFjIHRvbWNhdC5vbGx5LnJ1Pl0KCiAgKikgUE9SVDogQWxsIFNWUjQgc3lzdGVtcyBub3cgdXNlIE5FVF9TSVpFX1QgPSBzaXplX3QsIGFuZAogICAgIHVzZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBWYXJpb3VzIGltcHJvdmVtZW50cyBpbiBkZXRlY3RpbmcgY29uZmlnIGZpbGUgZXJyb3JzIChtaXNzaW5nIGNsb3NpbmcKICAgICBkaXJlY3RpdmVzIGZvciA8RGlyZWN0b3J5PiwgPEZpbGVzPiBldGMuIGJsb2NrcywgcHJvaGliaXRpbmcgZ2xvYmFsCiAgICAgc2VydmVyIHNldHRpbmdzIGluIDxWaXJ0dWFsSG9zdD4gYmxvY2tzLCBmbGFnZ2luZyB1bmhhbmRsZWQgbXVsdGlwbGUKICAgICBhcmd1bWVudHMgdG8gPERpcmVjdG9yeT4sIDxGaWxlcz4gZXRjLikKICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIEFkZCBzdXBwb3J0IHRvIHN1ZXhlYyB3cmFwcGVyIHByb2dyYW0gZm9yIG1vZF91bmlxdWVfaWQncyBVTklRVUVfSUQKICAgICB2YXJpYWJsZSB0byBwcm92aWRlIHRoaXMgb25lIHRvIHN1ZXhlYydkIENHSXMsIHRvby4KICAgICBbTS5ELlBhcmtlciA8bWRwYyBuZXRjb20uY29tPl0gUFIjMTI4NAoKICAqKSBOZXcgc3VwcG9ydCB0b29sOiBzcmMvc3VwcG9ydC9zcGxpdC1sb2dmaWxlLCBhIHNhbXBsZSBQZXJsIHNjcmlwdCB3aGljaAogICAgIHNwbGl0cyB1cCBhIGNvbWJpbmVkIGFjY2VzcyBsb2cgaW50byBzZXBhcmF0ZSBmaWxlcyBiYXNlZCBvbiB0aGUKICAgICBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QgKGxpc3RlZCBmaXJzdCBpbiB0aGUgbG9nIHJlY29yZHMgYnkgIiV2IikuCiAgICAgW0tlbiBDb2FyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjNiMiAodGhlcmUgaXMgbm8gMS4zYjEpCgogICopIFRlc3RDb21waWxlIHdhcyBub3QgcGFzc2luZyAkTElCUyBbRGVhbiBHYXVkZXRdCgogICopIE1ha2VmaWxlLnRtcGwgd2FzIG5vdCB1c2luZyAkQ0ZMQUdTIGluIHRoZSBsaW5rIHBoYXNlLiAKICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIEFkZCBkZWJ1Z2dpbmcgY29kZSB0byBhbGxvYy5jLiAgRGVmaW5pbmcgQUxMT0NfREVCVUcgcHJvdmlkZXMgYQogICAgIHJ1ZGltZW50YXJ5IG1lbW9yeSBkZWJ1Z2dlciB3aGljaCBjYW4gYmUgdXNlZCBvbiBsaXZlIHNlcnZlcnMgd2l0aAogICAgIGxvdyBpbXBhY3QgLS0gaXQgc2V0cyBhbGwgYWxsb2NhdGVkIGFuZCBmcmVlZCBtZW1vcnkgYnl0ZXMgdG8gMHhhNS4KICAgICBEZWZpbmluZyBBTExPQ19VU0VfTUFMTE9DIHdpbGwgY2F1c2UgdGhlIGFsbG9jIGNvZGUgdG8gdXNlIG1hbGxvYygpCiAgICAgYW5kIGZyZWUoKSBmb3IgZWFjaCBvYmplY3QuICBUaGlzIGlzIGZhciBtb3JlIGV4cGVuc2l2ZSBhbmQgc2hvdWxkCiAgICAgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nIHdpdGggdG9vbHMgc3VjaCBhcyBFbGVjdHJpYyBGZW5jZSBhbmQKICAgICBQdXJpZnkuICBTZWUgbWFpbi9hbGxvYy5jIGZvciBtb3JlIGRldGFpbHMuICBbRGVhbiBHYXVkZXRdCgogICopIENvbmZpZ3VyZSB1c2VzIGEgc2ggdHJhcCBhbmQgZGlkbid0IHNldCBpdHMgZXhpdGNvZGUgcHJvcGVybHkuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMTU5CgogICopIFlldCBhbm90aGVyIHZob3N0IHJldmFtcC4gIEFkZCB0aGUgTmFtZVZpcnR1YWxIb3N0IGRpcmVjdGl2ZSB3aGljaAogICAgIGV4cGxpY2l0bHkgbGlzdHMgdGhlIGlwOnBvcnQgcGFpcnMgdGhhdCBhcmUgdG8gYmUgdXNlZCBmb3IgbmFtZS12aG9zdHMuCiAgICAgRnJvbSBhIGdpdmVuIGlwOnBvcnQsIHJlZ2FyZGxlc3Mgd2hhdCB0aGUgSG9zdDogaGVhZGVyIGlzLCB5b3UgY2FuCiAgICAgb25seSByZWFjaCB0aGUgdmhvc3RzIGRlZmluZWQgb24gdGhhdCBpcDpwb3J0LiAgVGhlIHByZWNlZGVuY2Ugb2YKICAgICB2aG9zdHMgd2FzIHJldmVyc2VkIHRvIG1hdGNoIG90aGVyIHByZWNlZGVuY2VzIGluIHRoZSBjb25maWcgLS0KICAgICB0aGUgZWFybGllciB2aG9zdHMgb3ZlcnJpZGUgdGhlIGxhdGVyIHZob3N0cy4gIEFsbCB2aG9zdCBtYXRjaGluZyB3YXMKICAgICBtb3ZlZCBpbnRvIGh0dHBfdmhvc3QuW2NoXS4gIFtEZWFuIEdhdWRldF0KCiAgKikgYXBfaW5saW5lIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGlubGluaW5nLiAgR05VQyBfX2F0dHJpYnV0ZV9fKCkgY2FuCiAgICAgYmUgdXNlZCBmb3Igd2hhdGV2ZXIgcmVhc29uIGlzIGFwcHJvcHJpYXRlIChpLmUuIGZvcm1hdCgpIHdhcm5pbmdzCiAgICAgZm9yIHByaW50ZiBzdHlsZSBmdW5jdGlvbnMpLiAgQm90aCBhcmUgZW5hYmxlZCBvbmx5IHdpdGgKICAgICBnY2MgPj0gMi43LnggKHNvIHRoYXQgd2UgaGF2ZSBmZXdlciBzdXBwb3J0IGlzc3VlcyB3aXRoIG9sZGVyCiAgICAgdmVyc2lvbnMpLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggc3VwcG9ydCBmb3IgUHJveHkgQXV0aGVudGljYXRpb24gKHdlIHdlcmUgdGVzdGluZyB0aGUgcmVzcG9uc2UKICAgICBzdGF0dXMgdG9vIGVhcmx5KS4gW01hcmMgU2xlbWtvXQoKICAqKSBDb3JlRHVtcERpcmVjdG9yeSBkaXJlY3RpdmUgZGlyZWN0cyB3aGVyZSB0aGUgY29yZSBmaWxlIGlzCiAgICAgd3JpdHRlbiB3aGVuIGEgU0lHU0VHViwgU0lHQlVTLCBTSUdBQk9SVCBvciBTSUdBQlJUIGFyZQogICAgIHJlY2VpdmVkLiAgW01hcmMgU2xlbWtvLCBEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogU3VwcG9ydCBmb3IgQXRhcmkgTUlOVC4KICAgICBbSmFuIFBhdWwgU2NobWlkdCA8SmFuLlAuU2NobWlkdCBtbmkuZmgtZ2llc3Nlbi5kZT5dCgogICopIFdoZW4gYm9vdGluZywgYXBhY2hlIHdpbGwgbm93IGRldGFjaCBpdHNlbGYgZnJvbSBzdGRpbiwgc3Rkb3V0LAogICAgIGFuZCBzdGRlcnIuICBzdGRlcnIgd2lsbCBub3QgYmUgZGV0YWNoZWQgdW50aWwgYWZ0ZXIgdGhlIGNvbmZpZwogICAgIGZpbGVzIGhhdmUgYmVlbiByZWFkIHNvIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIGluaXRpYWwgZXJyb3IKICAgICBtZXNzYWdlcy4gIEFmdGVyIHRoYXQgYWxsIGVycm9ycyBhcmUgbG9nZ2VkIGluIHRoZSBlcnJvcl9sb2cuCiAgICAgVGhpcyBtYWtlcyBpdCBtb3JlIGNvbnZlbmllbnQgdG8gc3RhcnQgYXBhY2hlIHZpYSByc2gsIHNzaCwKICAgICBvciBjcm9udGFicy4gIFtEZWFuIEdhdWRldF0gUFIjNTIzCgogICopIG1vZF9wcm94eSB3YXMgc2VuZGluZyBIVFRQLzEuMSByZXNwb25zZXMgdG8gZnRwIHJlcXVlc3RzIGJ5IG1pc3Rha2UuCiAgICAgQWxzbyByZW1vdmVkIHRoZSBhdXRvLWdlbmVyYXRlZCBsaW5rIHRvIHd3dy5hcGFjaGUub3JnIHRoYXQgd2FzIHRoZQogICAgIHNvdXJjZSBvZiBzbyBtYW55IG1pc2RpcmVjdGVkIGJ1ZyByZXBvcnRzLiAgW1JveSBGaWVsZGluZywgTWFyYyBTbGVta29dCgogICopIHNlbmRfZmIgd291bGQgbm90IGRldGVjdCBhYm9ydGVkIGNvbm5lY3Rpb25zIGluIHNvbWUgc2l0dWF0aW9ucy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIHdvdWxkIHVzZSB1bmluaXRpYWxpemVkIGRhdGEgd2hlbiBwYXJzaW5nIGNlcnRhaW4KICAgICBleHByZXNzaW9ucyBpbnZvbHZpbmcgJiYgYW5kIHx8LiBbQnJpYW4gU2xlc2luc2t5XSBQUiMxMTM5CgogICopIG1vZF9pbWFwIHNob3VsZCBvbmx5IGhhbmRsZSBHRVQgbWV0aG9kcy4gIFtKYXkgQmxvb2R3b3J0aF0KCiAgKikgc3VleGVjLmMgd291bGRuJ3QgYnVpbGQgd2l0aG91dCAtRExPR19FWEVDLiBbSmFzb24gQS4gRG91cl0KCiAgKikgbW9kX2F1dG9pbmRleCBpbXByb3Blcmx5IGNvdW50ZWQgJmVzY2FwZXM7IGFzIG1vcmUgdGhhbiBvbmUKICAgICBjaGFyYWN0ZXIgaW4gdGhlIGRlc2NyaXB0aW9uLiAgSXQgYWxzbyBpbXByb3Blcmx5IHRydW5jYXRlZAogICAgIGRlc2NyaXB0aW9ucyB0aGF0IHdlcmUgZXhhY3RseSB0aGUgbWF4aW11bSBsZW5ndGguCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBSZWRpcmVjdE1hdGNoIHdhcyBub3QgcHJvcGVybHkgZXNjYXBpbmcgdGhlIHJlc3VsdCAoUFIjMTE1NSkuICBBbHNvCiAgICAgIlJlZGlyZWN0TWF0Y2ggL2FkdmVydGlzZXIvKC4qKSAkMSIgaXMgbm93IHBlcm1pdHRlZC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIG5vdyB1c2VzIHN5bWJvbGljIG5hbWVzIHRvIGNoZWNrIGZvciByZXF1ZXN0IHN1Y2Nlc3MKICAgICBhbmQgcmV0dXJuIEhUVFAgZXJyb3JzLCBhbmQgY29ycmVjdGx5IGhhbmRsZXMgYWxsIHR5cGVzIG9mCiAgICAgcmVkaXJlY3Rpb25zIChwcmV2aW91c2x5IGl0IG9ubHkgZGlkIHRlbXBvcmFyeSByZWRpcmVjdCBjb3JyZWN0bHkpLgogICAgIFtLZW4gQ29hciwgUm95IEZpZWxkaW5nXQoKICAqKSBtb2RfdXNlcmRpciB3YXMgbW9kaWZ5aW5nIHItPmZpbmZvIGluIGNhc2VzIHdoZXJlIGl0IHdhc24ndCBzZXR0aW5nCiAgICAgci0+ZmlsZW5hbWUuICBTaW5jZSB0aG9zZSB0d28gYXJlIG1lYW50IHRvIGJlIGluIHN5bmMgd2l0aCBlYWNoIG90aGVyCiAgICAgdGhpcyBpcyBhIGJ1Zy4gIFsiUGF1bCBCLiBIZW5zb24iIDxoZW5zb24gaW50cmFuZXQuY3N1cG9tb25hLmVkdT5dCgogICopIFBPUlQ6IFN1cHBvcnQgVW5pc3lzIFNWUjQsIHdob3NlIHVuYW1lIHJldHVybnMgbW9zdGx5IHVzZWxlc3MgZGF0YS4KICAgICBbIkthdWZtYW4sIFN0ZXZlbiBFIiA8U3RldmVuLkthdWZtYW4gdW5pc3lzLmNvbT5dCgogICopIEluZXRkIG1vZGUgKHdoaWNoIGlzIGJ1Z2d5KSB1c2VzIHRpbWVvdXRzIHdpdGhvdXQgaGF2aW5nIHNldHVwIHRoZQogICAgIGptcGJ1ZmZlci4gW0RlYW4gR2F1ZGV0XSBQUiMxMDY0CgogICopIFdvcmsgYXJvdW5kIHByb2JsZW0gdW5kZXIgTGludXggd2hlcmUgYSBjaGlsZCB3aWxsIHN0YXJ0IGxvb3BpbmcKICAgICByZXBvcnRpbmcgYSBzZWxlY3QgZXJyb3Igb3ZlciBhbmQgb3Zlci4KICAgICBbUmljayBGcmFuY2h1ayA8cmlja2YgdHJhbnNwZWN0Lm5ldD5dIFBSIzExMDcsIDk4NywgNTg4CgogICopIEZpeGVkIGVycm9yIGluIHByb3h5X3V0aWwuYyB3aGVuIGxvb3BpbmcgdGhyb3VnaCBtdWx0aXBsZSBob3N0IElQCiAgICAgYWRkcmVzc2VzLiBbTGFycyBFaWxlYnJlY2h0XSBQUiM5NzQKCiAgKikgSWYgQlVGRkVSRURfTE9HUyBpcyBkZWZpbmVkIHRoZW4gbW9kX2xvZ19jb25maWcgd2lsbCBkbyBhdG9taWMKICAgICBidWZmZXJlZCB3cml0ZXMgLS0gdGhhdCBpcywgaXQgd2lsbCBidWZmZXIgdXAgdG8gUElQRV9CVUYgKGkuZS4gNGspCiAgICAgYnl0ZXMgYmVmb3JlIHdyaXRpbmcsIGJ1dCBpdCB3aWxsIG5ldmVyIHNwbGl0IGEgbG9nIGVudHJ5IGFjcm9zcyBhCiAgICAgYnVmZmVyIGJvdW5kYXJ5LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IHRoZSBzaG9ydF9zY29yZSByZWNvcmQgaGFzIGJlZW4gc3BsaXQgaW50byB0d28gcGllY2VzLCBvbmUgd2hpY2gKICAgICB0aGUgcGFyZW50IHdyaXRlcyBvbiwgYW5kIG9uZSB3aGljaCB0aGUgY2hpbGQgd3JpdGVzIG9uLiAgQXMgcGFydCBvZgogICAgIHRoaXMgY2hhbmdlIHRoZSBnZXRfc2NvcmVib2FyZF9pbmZvKCkgZnVuY3Rpb24gd2FzIHJlbW92ZWQsIGFuZAogICAgIHNjb3JlYm9hcmRfaW1hZ2Ugd2FzIGV4cG9ydGVkLiAgVGhpcyBjaGFuZ2UgZml4ZXMgYSByYWNlIGNvbmRpdGlvbgogICAgIGluIGZpbGUgYmFzZWQgc2NvcmVib2FyZCBzeXN0ZW1zLCBhbmQgc3BlZWRzIHVwIGNoYW5nZXMgaW52b2x2aW5nIHRoZQogICAgIHNjb3JlYm9hcmQgaW4gZWFybGllciAxLjMgZGV2ZWxvcG1lbnQuICBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogTmV3IHJlZ2lzdGVyX290aGVyX2NoaWxkKCkgQVBJIChzZWUgaHR0cF9tYWluLmgpIHdoaWNoIGFsbG93cwogICAgIG1vZHVsZXMgdG8gcmVnaXN0ZXIgY2hpbGRyZW4gd2l0aCB0aGUgcGFyZW50IGZvciBtYWludGVuYW5jZS4gIEl0CiAgICAgaXMgZGlzYWJsZWQgYnkgZGVmaW5pbmcgTk9fT1RIRVJfQ0hJTEQuICBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogTmV3IHBpcGVkX2xvZyBBUEkgKHNlZSBodHRwX2xvZy5oKSB3aGljaCBpbXBsZW1lbnRzIHBpcGVkIGxvZ3MsCiAgICAgYW5kIHdpbGwgdXNlIHJlZ2lzdGVyX290aGVyX2NoaWxkIHRvIGltcGxlbWVudCByZWxpYWJsZSBwaXBlZCBsb2dzCiAgICAgd2hlbiBpdCBpcyBhdmFpbGFibGUuICBUaGUgcmVsaWFibGUgcGlwZWQgbG9ncyBwYXJ0IGNhbiBiZSBkaXNhYmxlZAogICAgIGJ5IGRlZmluaW5nIE5PX1JFTElBQkxFX1BJUEVEX0xPR1MuICBBdCB0aGUgbW9tZW50IHJlbGlhYmxlIHBpcGVkCiAgICAgbG9ncyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBVbml4LiBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogc2V0X2xhc3RfbW9kaWZpZWQoKSBicm9rZW4gaW50byBzZXRfbGFzdF9tb2RpZmllZCgpLCBzZXRfZXRhZygpLCBhbmQKICAgICBtZWV0c19jb25kaXRpb25zKCkuICBUaGlzIGFsbG93cyBjb25kaXRpb25hbCBIVFRQIHNlbGVjdGlvbiB0byBiZQogICAgIGhhbmRsZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdG9yaW5nIG9mIHRoZSBoZWFkZXIgZmllbGRzLCBhbmQgcHJvdmlkZXMKICAgICB0aGUgYWJpbGl0eSBmb3IgQ0dJcyB0byBzZXQgdGhlaXIgb3duIEVUYWdzIGZvciBjb25kaXRpb25hbCBjaGVja2luZy4KICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZ10gIFBSIzg5NQoKICAqKSBDaGFuZ2VzIHRvIG1vZF9sb2dfY29uZmlnIHRvIGFsbG93IG5hbWluZyBvZiBmb3JtYXQgc3RyaW5ncy4KICAgICBGb3JtYXQgbmlja25hbWVzIGFyZSBkZWZpbmVkIHdpdGggIkxvZ0Zvcm1hdCBmbXQgbmlja25hbWUiLCBhbmQgY2FuCiAgICAgYmUgdXNlZCB3aXRoICJMb2dGb3JtYXQgbmlja25hbWUiIGFuZCAiQ3VzdG9tTG9nIGxvZ3RhcmdldCBuaWNrbmFtZSIuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBOZXcgbW9kdWxlLCAibW9kX3NwZWxpbmciLCB3aGljaCBjYW4gaGVscCBmaW5kIGZpbGVzIGV2ZW4gd2hlbiAKICAgICB0aGUgVVJMIGlzIHNsaWdodGx5IG1pc3NwZWxsZWQuIFtNYXJ0aW4gS3JhZW1lciwgQWxleGVpIEtvc3V0XQoKICAqKSBBUEk6IE5ldyBmdW5jdGlvbiBjaGlsZF90ZXJtaW5hdGUoKSB0cmlnZ2VycyB0aGUgY2hpbGQgcHJvY2VzcyB0bwogICAgIGV4aXQsIHdoaWxlIGFsbG93aW5nIHRoZSBjaGlsZCBmaW5pc2ggd2hhdCBpdCBuZWVkcyB0byBmb3IgdGhlCiAgICAgY3VycmVudCByZXF1ZXN0IGZpcnN0LiAgCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgQWxleGVpIEtvc3V0XQoKICAqKSBXaW5kb3dzIG5vdyBkZWZhdWx0cyB0byB1c2luZyBmdWxsIHN0YXR1cyByZXBvcnRzIHdpdGggbW9kX3N0YXR1cy4KICAgICBbQWxleGVpIEtvc3V0XSBQUiAjMTA5NAoKICAqKSAqUmVhbGx5KiBkaXNhYmxlIGFsbCBtb2RfcmV3cml0ZSBvcGVyYXRpb25zIGlmIHRoZSBlbmdpbmUgaXMgb2ZmLgogICAgIFNvbWUgdGhpbmdzIChsaWtlIFJld3JpdGVNYXBzKSB3ZXJlIGNoZWNrZWQvcGVyZm9ybWVkIGV2ZW4gaWYgdGhleQogICAgIHdlcmVuJ3Qgc3VwcG9zZWQgdG8gYmUuICBbS2VuIENvYXJdIFBSICM5OTEKCiAgKikgSW1wbGVtZW50IGEgbmV3IHRpbWVyIHNjaGVtZSB3aGljaCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIGNhbGwgYWxhcm0oKSBhbGwKICAgICB0aGUgdGltZS4gIEluc3RlYWQgYSBjb3VudGVyIGluIHRoZSBzY29yZWJvYXJkIGZvciBlYWNoIGNoaWxkIGlzIHVzZWQgdG8KICAgICBzaG93IHdoZW4gdGhlIGNoaWxkIGhhcyBtYWRlIGZvcndhcmQgcHJvZ3Jlc3MuICBUaGUgcGFyZW50IHNhbXBsZXMgdGhpcwogICAgIGNvdW50ZXIgZXZlcnkgc2NvcmVib2FyZCBtYWludGVuYW5jZSBjeWNsZSwgYW5kIGlzc3VlcyBTSUdBTFJNIGlmIG5vCiAgICAgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSBpbiB0aGUgdGltZW91dCBwZXJpb2QuICBUaGlzIHJlZHVjZXMgdGhlIHN0YXRpYwogICAgIHJlcXVlc3QgYmVzdC1jYXNlIHN5c2NhbGwgY291bnQgdG8gMjIgZnJvbSAyOS4gIFRoaXMgc2NoZW1lIGlzIG9ubHkKICAgICB1c2VkIGJ5IHN5c3RlbXMgd2l0aCBtZW1vcnktYmFzZWQgc2NvcmVib2FyZHMuICBbRGVhbiBHYXVkZXRdCgogICopIFRoZSBwcm94eSBub3cgcHJvcGVybHkgaGFuZGxlcyBDT05ORUNUIHJlcXVlc3RzIHdoaWNoIGFyZSBzZW50CiAgICAgdG8gcHJveHkgc2VydmVycyB3aGVuIHVzaW5nIFByb3h5UmVtb3RlLiAgW01hcmMgU2xlbWtvXSBQUiMxMDI0CgogICopIEEgc2NyaXB0IGNhbGxlZCBhcGFjaGVjdGwgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN1cHBvcnQgCiAgICAgZGlyZWN0b3J5LiAgVGhpcyBzY3JpcHQgYWxsb3dzIHlvdSB0byBkbyB0aGluZ3Mgc3VjaCBhcyAKICAgICAiYXBhY2hlY3RsIHN0YXJ0IiBhbmQgImFwYWNoZWN0bCByZXN0YXJ0IiBmcm9tIHRoZSBjb21tYW5kCiAgICAgbGluZS4gIFtNYXJjIFNsZW1rb10KCiAgKikgTW9kdWxlcyBhbmQgY29yZSByb3V0aW5lcyBhcmUgbm93IHB1dCBpbnRvIGxpYnJhcmllcywgd2hpY2gKICAgICBzaW1wbGlmaWVzIHRoZSBsaW5rIGxpbmUgdHJlbWVuZG91c2x5IChhbW9uZyBvdGhlciBhZHZhbnRhZ2VzKS4KICAgICBbUGF1bCBTdXR0b25dCgogICopIFNvbWUgb2YgdGhlIE1ENSBuYW1lcyBkZWZpbmVkIGluIEFwYWNoZSBoYXZlIGJlZW4gcmVuYW1lZCB0byBoYXZlCiAgICAgYW4gYGFwXycgcHJlZml4IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHJvdXRpbmVzIHN1cHBsaWVkIGJ5CiAgICAgZXh0ZXJuYWwgbGlicmFyaWVzLiAgW0tlbiBDb2FyXQoKICAqKSBSZW1vdmFsIG9mIG1vZF9hdXRoX21zcWwuYyBmcm9tIHRoZSBkaXN0cmlidXRpb24uIFRoZXJlIGFyZSBtYW55CiAgICAgb3RoZXIgb3B0aW9ucyBmb3IgZGF0YWJhc2VzIHRvZGF5LiBSYXRoZXIgdGhhbiBvZmZlciBvbmUgb3B0aW9uLAogICAgIG9mZmVyIG5vbmUgYXQgdGhpcyB0aW1lLiBtb2RfYXV0aF9tc3FsIGFuZCBvdGhlciBTUUwgZGF0YWJhc2UKICAgICBhdXRoZW50aWNhdGlvbiBtb2R1bGVzIGNhbiBiZSBmb3VuZCBhdCB0aGUgQXBhY2hlIE1vZHVsZSBSZWdpc3RyeS4KICAgICBodHRwOi8vbW9kdWxlcy5hcGFjaGUub3JnLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG9mZmVyIGEgZ2VuZXJpYwogICAgIG1vZF9hdXRoX3NxbCBvcHRpb24gaW4gdGhlIG5lYXIgZnV0dXJlLgoKICAqKSBQT1JUOiBCZU9TIHN1cHBvcnQgYWRkZWQgW0FsZXhlaSBLb3N1dF0KCiAgKikgQ29uZmlndXJlIG5vIGxvbmdlciBhY2NlcHRzIHRoZSAtbWFrZSBvcHRpb24sIHNpbmNlIGl0IGNyZWF0ZXMKICAgICBNYWtlZmlsZSBvbiB0aGUgZmx5IGJhc2VkIG9uIE1ha2VmaWxlLnRtcGwgYW5kIENvbmZpZ3VyYXRpb24uCgogICopIEFwYWNoZSBub3cgZ3JhY2VmdWxseSBzaHV0cyBkb3duIHdoZW4gaXQgcmVjZWl2ZXMgYSBTSUdURVJNLCBpbnN0ZWFkCiAgICAgb2YgZm9yY2libHkga2lsbGluZyBvZmYgYWxsIGl0cyBwcm9jZXNzZXMgYW5kIGV4aXRpbmcgd2l0aG91dAogICAgIGNsZWFuaW5nIHVwLiBbQWxleGVpIEtvc3V0XQoKICAqKSBBUEk6IEEgbmV3IGZpZWxkIGluIHRoZSByZXF1ZXN0X3JlYywgci0+bXRpbWUsIGhhcyBiZWVuIGFkZGVkIHRvCiAgICAgYXZvaWQgZ3JhdHVpdG91cyBwYXJzaW5nIG9mIGRhdGUgc3RyaW5ncy4gIEl0IGlzIGludGVuZGVkIHRvIGhvbGQKICAgICB0aGUgbGFzdC1tb2RpZmllZCBkYXRlIG9mIHRoZSByZXNvdXJjZSAoaWYgYXBwbGljYWJsZSkuICBBbgogICAgIHVwZGF0ZV9tdGltZSgpIHJvdXRpbmUgaGFzIGFsc28gYmVlbiBhZGRlZCB0byBhZHZhbmNlIGl0IGlmCiAgICAgYXBwcm9wcmlhdGUuICBbUm95IEZpZWxkaW5nLCBLZW4gQ29hcl0KCiAgKikgU0VDVVJJVFk6IElmIGEgaHRhY2Nlc3MgZmlsZSBjYW4gbm90IGJlIHJlYWQgZHVlIHRvIGJhZCBwZXJtaXNzaW9ucywKICAgICBkZW55IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHdpdGggYSBIVFRQX0ZPUkJJRERFTi4gIFRoZSBwcmV2aW91cwogICAgIGJlaGF2aW9yIHdhcyB0byBpZ25vcmUgdGhlIGh0YWNjZXNzIGZpbGUgaWYgaXQgY291bGQgbm90IGJlIHJlYWQuCiAgICAgVGhpcyBjaGFuZ2UgbWF5IG1ha2Ugc29tZSBzZXR1cHMgd2l0aCB1bnJlYWRhYmxlIGh0YWNjZXNzIGZpbGVzCiAgICAgc3RvcCB3b3JraW5nLiAgW01hcmMgU2xlbWtvXSBQUiM4MTcKCiAgKikgQWRkIGFwbG9nX2Vycm9yKCkgcHJvdmlkaW5nIGEgbWVjaGFuaXNtIHRvIGRlZmluZSBsZXZlbHMgb2YKICAgICB2ZXJib3NpdHkgdG8gdGhlIHNlcnZlciBlcnJvciBsb2dnaW5nLiBUaGlzIGFkZGl0aW9uIGFsc28gcHJvdmlkZXMKICAgICB0aGUgYWJpbGl0eSB0byBsb2cgZXJyb3JzIHVzaW5nIHN5c2xvZ2QuIEVycm9yIGxvZ2dpbmcgaXMgY29uZmlndXJhYmxlCiAgICAgb24gYSBwZXItc2VydmVyIGJhc2lzIHVzaW5nIHRoZSBMb2dMZXZlbCBkaXJlY3RpdmUuIENvbnZlcnNpb24KICAgICBvZiBsb2dfKigpIGluIHByb2dyZXNzLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRnVydGhlciBlbmhhbmNlIGFwbG9nX2Vycm9yKCkgdG8gbm90IGxvZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZAogICAgIGVycm5vIGluZm9ybWF0aW9uIHdoZW4gaXQgaXNuJ3QgYXBwbGljYWJsZS4gW0tlbiBDb2FyLCBEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IENhbm9uaWNhbGlzZSBmaWxlbmFtZXMgdW5kZXIgV2luMzIuIFNob3J0IGZpbGVuYW1lcyBhcmUKICAgICBjb252ZXJ0ZWQgdG8gbG9uZyBvbmVzLiBCYWNrc2xhc2hlcyBhcmUgY29udmVydGVkIHRvIGZvcndhcmQKICAgICBzbGFzaGVzLiBDYXNlIGlzIGNvbnZlcnRlZCB0byBsb3dlci4gUGFydHMgb2YgVVJMcyB0aGF0IGRvIG5vdAogICAgIGNvcnJlc3BvbmQgdG8gZmlsZXMgYXJlIGxlZnQgY29tcGxldGVseSBhbG9uZS4gW0JlbiBMYXVyaWVdCgogICopIFBPUlQ6IDIgbmV3IE9TcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBwb3J0czoKICAgICAgRW5jb3JlJ3MgVU1BWCBWOiBBcmllaCBNYXJrZWwgPGFtYXJrZWwgZW5jb3JlLmNvbT4KICAgICAgQWNvcm4gUklTQ2lYOiBTdGVwaGVuIEJvcnJpbGwgPHNib3JyaWxsIHhlbXBsYXIuY28udWs+CgogICopIEFkZCB0aGUgc2VydmVyIHZlcnNpb24gKFNFUlZFUl9WRVJTSU9OIG1hY3JvKSB0byB0aGUgInNlcnZlcgogICAgIGNvbmZpZ3VyZWQgYW5kIHJ1bm5pbmciIGVudHJ5IGluIHRoZSBlcnJvcl9sb2cuICBBbHNvIGJ1aWxkIGFuCiAgICAgb2JqZWN0IGZpbGUgYXQgbGluay10aW1lIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgdGltZQogICAgIChTRVJWRVJfQlVJTFQgZ2xvYmFsIGNvbnN0IGNoYXJbXSksIGFuZCBpbmNsdWRlIHRoYXQgaW4gdGhlCiAgICAgbWVzc2FnZS4gIFtLZW4gQ29hcl0KCiAgKikgU2V0IHItPmhlYWRlcnNfb3V0IHdoZW4gc2VuZGluZyByZXNwb25zZXMgZnJvbSB0aGUgcHJveHkuCiAgICAgVGhpcyBmaXhlcyB0aGluZ3Mgc3VjaCBhcyB0aGUgbG9nZ2luZyBvZiBoZWFkZXJzIHNlbnQgZnJvbQogICAgIHRoZSBwcm94eS4gIFtNYXJjIFNsZW1rb10gUFIjNjU5CgogICopIHN1cHBvcnQvaHR0cGRfbW9uaXRvciBpcyBubyBsb25nZXIgZGlzdHJpYnV0ZWQgYmVjYXVzZSB0aGUgCiAgICAgc2NvcmVib2FyZCBzaG91bGQgbm90IGJlIGZpbGUgYmFzZWQgaWYgYXQgYWxsIHBvc3NpYmxlLiBVc2UKICAgICBtb2Rfc3RhdHVzIHRvIHNlZSBjdXJyZW50IHNlcnZlciBzbmFwc2hvdC4KCiAgKikgKHNldF9maWxlX3Nsb3QpOiBOZXcgZnVuY3Rpb24sIGFsbG93aW5nIGF1dGggZGlyZWN0aXZlcyB0byBiZQogICAgIGluZGVwZW5kZW50IG9mIHRoZSBzZXJ2ZXIgcm9vdCwgc28gdGhlIHNlcnZlciBkb2N1bWVudHMgY2FuIGJlCiAgICAgbW92ZWQgdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IG9yIG1hY2hpbmUgbW9yZSBlYXNpbHkuCiAgICAgW0RhdmlkIEouIE1hY0tlbnppZV0KCiAgKikgSWYgbm8gVHJhbnNmZXJMb2cgaXMgZ2l2ZW4gZXhwbGljaXRseSwgZGVjbGluZQogICAgIHRvIGxvZy4gIFRoaXMgc3VwcG9ydHMgY29leGlzdGVuY2Ugd2l0aCBvdGhlciBsb2dnaW5nIG1vZHVsZXMsCiAgICAgc3VjaCBhcyB0aGUgY3VzdG9tIG9uZSB0aGF0IFVVTkVUIHVzZXMuIFtEYXZpZCBKLiBNYWNLZW56aWVdCgogICopIENoZWNrIGZvciB0aXRsZXMgaW4gc2VydmVyLXBhcnNlZCBIVE1MIGZpbGVzLgogICAgIElnbm9yZSBsZWFkaW5nIG5ld2xpbmVzIGFuZCByZXR1cm5zIGluIHRpdGxlcy4gIFRoZSBvbGQgYmVoYXZpb3IKICAgICBvZiByZXBsYWNpbmcgYSBuZXdsaW5lIGFmdGVyIDx0aXRsZT4gd2l0aCBhIHNwYWNlIGNhdXNlcyB0aGUKICAgICB0aXRsZSB0byBiZSBtaXNhbGlnbmVkIGluIHRoZSBsaXN0aW5nLiBbRGF2aWQgSi4gTWFjS2VuemllXQoKICAqKSBDaGFuZ2UgbW9kX2Nlcm5fbWV0YSB0byBiZSBjb25maWd1cmFibGUgb24gYSBwZXItZGlyZWN0b3J5IGJhc2lzLgogICAgIFtEYXZpZCBKLiBNYWNLZW56aWVdCgogICopIEFkZCAnSW5jbHVkZScgZGlyZWN0aXZlIHRvIGFsbG93IGluY2x1c2lvbiBvZiBjb25maWd1cmF0aW9uCiAgICAgZmlsZXMgd2l0aGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFtSYW5keSBUZXJidXNoXQoKICAqKSBQcm94eSBlcnJvcnMgb24gY29ubmVjdCgpIGFyZSBsb2dnZWQgdG8gdGhlIGVycm9yX2xvZyAobm90aGluZwogICAgIG5ldyk7IG5vdyB0aGV5IGluY2x1ZGUgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgdGhhdCBmYWlsZWQKICAgICAoKnRoYXQncyogbmV3KS4gICBbS2VuIENvYXIsIE1hcmMgU2xlbWtvXSBQUiMzNTIKCiAgKikgVmFyaW91cyBhcmNoaXRlY3R1cmVzIG5vdyBkZWZpbmUgVVNFX01NQVBfRklMRVMgd2hpY2ggY2F1c2VzCiAgICAgdGhlIHNlcnZlciB0byB1c2UgbW1hcCgpIGZvciBzdGF0aWMgZmlsZXMuICBUaGVyZSBhcmUgdHdvCiAgICAgY29tcGlsZS10aW1lIHR1bmFibGVzIE1NQVBfVEhSRVNIT0xEIChtaW5pbXVtIG51bWJlciBvZiBieXRlcwogICAgIHJlcXVpcmVkIHRvIHVzZSBtbWFwKCksIGRlZmF1bHQgaXMgMCksIGFuZCBNTUFQX1NFR01FTlRfU0laRSAobWF4aW11bQogICAgIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIG9uZSBjeWNsZSBmcm9tIGEgc2luZ2xlIG1tYXAoKWQgb2JqZWN0LAogICAgIGRlZmF1bHQgMzI3NjgpLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IEFkZGVkIHBvc3RfcmVhZF9yZXF1ZXN0IEFQSSBwaGFzZSB3aGljaCBpcyBydW4gcmlnaHQgYWZ0ZXIgcmVhZGluZwogICAgIHRoZSByZXF1ZXN0IGZyb20gYSBjbGllbnQsIG9yIHJpZ2h0IGFmdGVyIGFuIGludGVybmFsIHJlZGlyZWN0LiAgSXQgaXMKICAgICB1c2VmdWwgZm9yIG1vZHVsZXMgc2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBkZXBlbmQgb25seSBvbgogICAgIHRoZSBoZWFkZXJzL2NvbnRlbnRzIG9mIHRoZSByZXF1ZXN0LiAgSXQgZG9lcyBub3QgcnVuIGR1cmluZyBzdWJyZXF1ZXN0cwogICAgIGJlY2F1c2Ugc3VicmVxdWVzdHMgaW5oZXJpdCBwcmV0dHkgbXVjaCBldmVyeXRoaW5nIGZyb20gdGhlIG1haW4KICAgICByZXF1ZXN0LiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIG1vZF91bmlxdWVfaWQgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgogICAgIGVhY2ggaGl0LCBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFVOSVFVRV9JRC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIGluaXRfbW9kdWxlcyBpcyBub3cgY2FsbGVkIGFmdGVyIHRoZSBlcnJvciBsb2dzIGhhdmUgYmVlbiBvcGVuZWQuICBUaGlzCiAgICAgYWxsb3dzIG1vZHVsZXMgdG8gZW1pdCBpbmZvcm1hdGlvbiBtZXNzYWdlcyBpbnRvIHRoZSBlcnJvciBsb2dzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgRml4ZWQgcHJveHktcGFzcy10aHJvdWdoIGZlYXR1cmUgb2YgbW9kX3Jld3JpdGU7IEFkZGVkIGVycm9yIGxvZ2dpbmcKICAgICBpbmZvcm1hdGlvbiBmb3IgY2FzZSB3aGVyZSBwcm94eSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZS4gW01hcmMgU2xlbWtvXQoKICAqKSBQT1JUOiBBcGFjaGUgaGFzIG5lZWQgZm9yIG11dGV4ZXMgdG8gc2VyaWFsaXplIGl0cyBjaGlsZHJlbiBhcm91bmQKICAgICBhY2NlcHQuICBJbiBwcmlvciB2ZXJzaW9ucyBlaXRoZXIgZmNudGwgZmlsZSBsb2NraW5nIG9yIGZsb2NrIGZpbGUKICAgICBsb2NraW5nIHdlcmUgdXNlZC4gIFRoZSBtZXRob2QgaXMgY2hvc2VuIGJ5IHRoZSBkZWZpbml0aW9uIG9mCiAgICAgVVNFX3h4eF9TRVJJQUxJWkVEX0FDQ0VQVCBpbiBjb25mLmguICB4eHggaXMgRkNOVEwgZm9yIGZjbnRsKCksCiAgICAgYW5kIEZMT0NLIGZvciBmbG9jaygpLiAgTmV3IG9wdGlvbnMgaGF2ZSBiZWVuIGFkZGVkOgogICAgICAgIC0gU1lTVlNFTSB0byB1c2UgU3lzdGVtIFYgc3R5bGUgc2VtYXBob3JlcwogICAgICAgIC0gUFRIUkVBRCB0byB1c2UgUE9TSVggdGhyZWFkcyAoYXBwZWFycyB0byB3b3JrIG9uIFNvbGFyaXMgb25seSkKICAgICAgICAtIFVTTE9DSyB0byB1c2UgSVJJWCB1c2xvY2sKICAgICBCYXNlZCBvbiB0aW1pbmcgdmFyaW91cyB0ZWNobmlxdWVzLCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlCiAgICAgdG8gdGhlIGRlZmF1bHRzOgogICAgICAgIC0gTGludXggMi54IHVzZXMgZmxvY2sgaW5zdGVhZCBvZiBmY250bAogICAgICAgIC0gU29sYXJpcyAyLnggdXNlcyBwdGhyZWFkcwogICAgICAgIC0gSVJJWCB1c2VzIFN5c1Ygc2VtYXBob3JlcyAtLSBob3dldmVyIG11bHRpcHJvY2Vzc29yIElSSVggYm94ZXMKICAgICAgICAgIHdvcmsgZmFyIGZhc3RlciBpZiB5b3UgLURVU0VfVVNMT0NLX1NFUklBTElaRURfQUNDRVBUCiAgICAgW0RlYW4gR2F1ZGV0LCBQaWVycmUtWXZlcyBLZXJlbWJlbGxlYyA8UGllcnJlLVl2ZXMuS2VyZW1iZWxsZWMgdnRjb20uZnI+LAogICAgIE1hcnRpam4gS29zdGVyIDxtLmtvc3RlciBwb2JveC5jb20+XQoKICAqKSBQT1JUOiBUaGUgc2VtYW50aWNzIG9mIGFjY2VwdC9zZWxlY3QgbWFrZSBpdCB2ZXJ5IGRlc2lyYWJsZSB0byB1c2UKICAgICBtdXRleGVzIHRvIHNlcmlhbGl6ZSBhY2NlcHQgd2hlbiBtdWx0aXBsZSBMaXN0ZW5zIGFyZSBpbiB1c2UuICBCdXQKICAgICBpbiB0aGUgY2FzZSB3aGVyZSBvbmx5IGEgc2luZ2xlIHNvY2tldCBpcyBvcGVuIGl0IGlzIHNvbWV0aW1lcwogICAgIHJlZHVuZGFudCB0byBzZXJpYWxpemUgYWNjZXB0KCkuICBOb3QgYWxsIHVuaXhlcyBkbyBhIGdvb2Qgam9iIHdpdGgKICAgICBwb3RlbnRpYWxseSBkb3plbnMgb2YgY2hpbGRyZW4gYmxvY2tlZCBvbiBhY2NlcHQoKSBvbiB0aGUgc2FtZQogICAgIHNvY2tldC4gIEl0J3Mgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgYW5kCiAgICAgdGhlIHNlcnZlciB3aWxsIGF2b2lkIHNlcmlhbGl6YXRpb24gd2hlbiBsaXN0ZW5pbmcgb24gb25seSBvbmUgc29ja2V0LAogICAgIGFuZCB1c2Ugc2VyaWFsaXphdGlvbiB3aGVuIGxpc3RlbmluZyBvbiBtdWx0aXBsZSBzb2NrZXRzLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDY3CgogICopIENvbmZpZ3VyZSBjaGFuZ2VzOiBUZXN0TGliIHJlcGxhY2VkIGJ5IFRlc3RDb21waWxlLCB3aGljaCBoYXMKICAgICBzb21lIGFkZGl0aW9uYWwgY2FwYWJpbGl0eSAoc3VjaCBhcyBkb2luZyBhIHNhbml0eSBjaGVjayBvZgogICAgIHRoZSBjb21waWxlciBhbmQgZmxhZ3Mgc2VsZWN0ZWQpOyB0aGUgdmVyc2lvbiBvZiBTb2xhcmlzIGlzIG5vdwogICAgIGF2YWlsYWJsZSB2aWEgdGhlICNkZWZpbmUgdmFsdWUgb2YgU09MQVJJUzI7IElSSVggbjMyYml0IGxpYnMKICAgICBub3cgc3VwcG9ydGVkIGFuZCBzZWxlY3RhYmxlIGJ5IG5ldyBDb25maWd1cmF0aW9uIFJ1bGU6IElSSVhOMzI7CiAgICAgV2Ugbm8gbG9uZ2VyIGRlZmF1bHQgdG8gLU8yIG9wdGltaXphdGlvbi4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBVcGRhdGVkIENvbmZpZ3VyZTogQ29uZmlndXJhdGlvbiBub3cgdXNlcyBBZGRNb2R1bGUgdG8gc3BlY2lmeQogICAgIG1vZHVsZSBzb3VyY2Ugb3IgYmluYXJ5IGZpbGUgbG9jYXRpb24sIHJlbGF0aXZlIHRvIHNyYyBkaXJlY3RvcnkuCiAgICAgTW9kdWxlcyBjYW4gYmUgZHJvcHBlZCBpbnRvIG1vZHVsZXMvZXh0cmEsIG9yIGluIHRoZWlyIG93biAKICAgICBkaXJlY3RvcnksIGFuZCBtb2R1bGVzIGNhbiBjb21lIHdpdGggYSBNYWtlZmlsZSBvciBDb25maWd1cmUgY2FuIAogICAgIGNyZWF0ZSBvbmUuICBNb2R1bGVzIGNhbiBhZGQgY29tcGlsZXIgb3IgbGlicmFyeSBpbmZvcm1hdGlvbiB0byAKICAgICBnZW5lcmF0ZWQgTWFrZWZpbGVzLiBbUGF1bCBTdXR0b25dCgogICopIFNvdXJjZSBjb3JlIHJlLW9yZ2FuaXNhdGlvbjogZGlzdHJpYnV0ZWQgbW9kdWxlcyBhcmUgbm93IGluIAogICAgIG1vZHVsZXMvc3RhbmRhcmQuIEFsbCBvdGhlciBzb3VyY2UgY29kZSBpcyBpbiBtYWluLiBPUy1zcGVjaWZpYwogICAgIGNvZGUgaXMgaW4gb3Mve3VuaXgsZW14LHdpbjMyfSBkaXJlY3Rvcmllcy4gW1BhdWwgU3V0dG9uXQoKICAqKSBtb2RfYnJvd3NlciBoYXMgYmVlbiByZW1vdmVkLCBzaW5jZSBpdCdzIHJlcGxhY2VkIGJ5IG1vZF9zZXRlbnZpZi4KICAgICBbS2VuIENvYXJdCgogICopIEZpeCBhbm90aGVyIGxvbmctc3RhbmRpbmcgYnVnIGluIHN1Yl9yZXFfbG9va3VwX2ZpbGUgd2hlcmUgaXQgd291bGQKICAgICBoYXBwaWx5IHNraXAgcGFzdCBhY2Nlc3MgY2hlY2tzIG9uIHN1YmRpcmVjdG9yaWVzIGxvb2tlZCB1cCB3aXRoCiAgICAgcmVsYXRpdmUgcGF0aHMuICAoSXQncyB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9uZWdvdGlhdGlvbiwKICAgICBhbmQgbW9kX2luY2x1ZGUuKSBbRGVhbiBHYXVkZXRdCgogICopIGRpcmVjdG9yeV93YWxrIG9wdGltaXphdGlvbiB0byByZWR1Y2UgYW4gTyhOKk0pIGxvb3AgdG8gTyhOK00pIHdoZXJlCiAgICAgTiBpcyB0aGUgbnVtYmVyIG9mIDxEaXJlY3Rvcnk+IHNlY3Rpb25zLCBhbmQgTSBpcyB0aGUgbnVtYmVyIG9mCiAgICAgY29tcG9uZW50cyBpbiB0aGUgZmlsZW5hbWUgb2YgYW4gb2JqZWN0LgoKICAgICBUbyBhY2hpZXZlIHRoaXMgb3B0aW1pemF0aW9uIHRoZSBmb2xsb3dpbmcgY29uZmlnIGNoYW5nZXMgd2VyZSBtYWRlOgogICAgICAgIC0gV2lsZGNhcmRzICgqIGFuZCA/LCBub3QgdGhlIHJlZ2V4IGZvcm1zKSBpbiA8RGlyZWN0b3J5PnMsCiAgICAgICAgICA8RmlsZXM+cywgYW5kIDxMb2NhdGlvbj5zIG5vdyB0cmVhdCBhIHNsYXNoIGFzIGEgc3BlY2lhbAogICAgICAgICAgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUgIi9ob21lLyovcHVibGljX2h0bWwiIHByZXZpb3VzbHkgd291bGQKICAgICAgICAgIG1hdGNoICIvaG9tZS9hL2FuZHJldy9wdWJsaWNfaHRtbCIsIG5vdyBpdCBvbmx5IG1hdGNoZXMgdGhpbmdzCiAgICAgICAgICBsaWtlICIvaG9tZS9ib2IvcHVibGljX2h0bWwiLiAgVGhpcyBtaW1pY3MgL2Jpbi9zaCBiZWhhdmlvdXIuCiAgICAgICAgLSBJdCdzIHBvc3NpYmxlIG5vdyB0byB1c2UgW10gd2lsZGNhcmRpbmcgaW4gPERpcmVjdG9yeT4sIDxGaWxlcz4KICAgICAgICAgIG9yIDxMb2NhdGlvbj4uCiAgICAgICAgLSBSZWdleCA8RGlyZWN0b3J5PnMgYXJlIGFwcGxpZWQgYWZ0ZXIgYWxsIG5vbi1yZWdleCA8RGlyZWN0b3J5PnMuCgogICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggYSBidWcgaW50cm9kdWNlZCBpbiAxLjNhMSBkaXJlY3Rvcnlfd2FsayByZWdhcmRpbmcgLmh0YWNjZXNzIGZpbGVzCiAgICAgYW5kIGNvcnJ1cHRlZCBwYXRocy4gIFtEZWFuIEdhdWRldF0KCiAgKikgRW5oYW5jZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFVSTCByZXdyaXRpbmcgZW5naW5lIG9mIG1vZF9yZXdyaXRlOgogICAgIEZpcnN0IHRoZSBncm91cGVkIHBhcnRzIG9mIFJld3JpdGVSdWxlIHBhdHRlcm4gbWF0Y2hlcyAocGFyZW50aGVzaXMhKSBjYW4KICAgICBiZSBhY2Nlc3NlZCBub3cgdmlhIGJhY2tyZWZlcmVuY2VzICQxLi4kOSBpbiBSZXdyaXRlQ29uZHMgdGVzdC1hZ2FpbnN0CiAgICAgc3RyaW5ncyBpbiBhZGRpdGlvbiB0byBSZXdyaXRlUnVsZXMgc3Vic3Qgc3RyaW5nLiBTZWNvbmQgdGhlIGdyb3VwZWQKICAgICBwYXJ0cyBvZiBSZXdyaXRlQ29uZCBwYXR0ZXJuIG1hdGNoZXMgKHBhcmVudGhlc2lzISkgY2FuIGJlIGFjY2Vzc2VkIG5vdwogICAgIHZpYSBiYWNrcmVmZXJlbmNlcyAlMS4uJTkgYm90aCBpbiBmb2xsb3dpbmcgUmV3cml0ZUNvbmQgdGVzdC1hZ2FpbnN0CiAgICAgc3RyaW5ncyBhbmQgUmV3cml0ZVJ1bGVzIHN1YnN0IHN0cmluZy4gVGhpcyBwcm92aWRlcyBtYXhpbXVtIGZsZXhpYmlsaXR5CiAgICAgdGhyb3VnaCB0aGUgdXNlIG9mIGJhY2tyZWZlcmVuY2VzLgogICAgIEFkZGl0aW9uYWxseSB0aGUgcmV3cml0aW5nIGVuZ2luZSB3YXMgY2xlYW5lZCB1cCBieSBwdXR0aW5nIGNvbW1vbgogICAgIGNvZGUgdG8gdGhlIG5ldyBleHBhbmRfYmFja3JlZnNfaW5idWZmZXIoKSBmdW5jdGlvbi4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdoZW4gbWVyZ2luZyB0aGUgbWFpbiBzZXJ2ZXIncyA8RGlyZWN0b3J5PiBhbmQgPExvY2F0aW9uPiBzZWN0aW9ucyBpbnRvCiAgICAgYSB2aG9zdCwgcHV0IHRoZSBtYWluIHNlcnZlcidzIGZpcnN0IGFuZCB0aGUgdmhvc3QncyBzZWNvbmQuICBPdGhlcndpc2UKICAgICB0aGUgdmhvc3QgY2FuJ3Qgb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyLiAgW0RlYW4gR2F1ZGV0XSBQUiM3MTcKCiAgKikgVGhlIDxEaXJlY3Rvcnk+IGNvZGUgd291bGQgbWVyZ2UgYW5kIHJlLW1lcmdlIHRoZSBzYW1lIHNlY3Rpb24gYWZ0ZXIKICAgICBhIG1hdGNoIHdhcyBmb3VuZCwgcG9zc2libHkgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHNvbWUgbW9kdWxlcy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIGlwLWJhc2VkIHZob3N0cyBhcmUgc3RvcmVkIGFuZCBxdWVyaWVkIHVzaW5nIGEgaGFzaGluZyBmdW5jdGlvbiwgd2hpY2gKICAgICBoYXMgYmVlbiBzaG93biB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uIHNlcnZlcnMgd2l0aCBtYW55IGlwLXZob3N0cy4KICAgICBTb21lIG90aGVyIGNoYW5nZXMgaGFkIHRvIGJlIG1hZGUgdG8gYWNjb21tb2RhdGUgdGhpczoKICAgICAgICAtIHRoZSAqIGFkZHJlc3MgZm9yIHZob3N0cyBub3cgYmVoYXZlcyBsaWtlIF9kZWZhdWx0XwogICAgICAgIC0gdGhlIG1hdGNoaW5nIHByb2Nlc3Mgbm93IGlzOgogICAgICAgICAgICAtIG1hdGNoIGFuIGlwLXZob3N0IGRpcmVjdGx5IHZpYSBoYXNoIChwb3NzaWJseSBtYXRjaGVzIG1haW4KICAgICAgICAgICAgICBzZXJ2ZXIpCiAgICAgICAgICAgIC0gaWYgdGhhdCBmYWlscywganVzdCBwcmV0ZW5kIGl0IG1hdGNoZWQgdGhlIG1haW4gc2VydmVyCiAgICAgICAgICAgIC0gaWYgc28gZmFyIG9ubHkgdGhlIG1haW4gc2VydmVyIGhhcyBiZWVuIG1hdGNoZWQsIHBlcmZvcm0KICAgICAgICAgICAgICBuYW1lLWJhc2VkIGxvb2t1cHMgKFNlcnZlck5hbWUsIFNlcnZlckFsaWFzLCBTZXJ2ZXJQYXRoKQogICAgICAgICAgICAgICpvbmx5IG9uIG5hbWUtYmFzZWQgdmhvc3RzKgogICAgICAgICAgICAtIGlmIHRoZXkgZmFpbCwgbG9vayBmb3IgX2RlZmF1bHRfIHZob3N0cwogICAgIFtEZWFuIEdhdWRldCwgRGF2ZSBIYW5raW5zIDxkaGFua2lucyBzdWdhcmF0Lm5ldD5dCgogICopIGRibW1hbmFnZSBvdmVyaGF1bDoKICAgICAtIG1lcmdlIGRibW1hbmFnZSBhbmQgZGJtbWFuYWdlLm5ldyBmdW5jdGlvbmFsaXR5LCByZW1vdmUgZGJtbWFuYWdlLm5ldyAKICAgICAtIHRpZSgpIHRvIEFueURCTV9GaWxlIHdoaWNoIHdpbGwgdXNlIG9uZSBvZiBEQl9GaWxlLCBOREJNX0ZpbGUgb3IKICAgICAgIEdEQk1fRmlsZSAoLWxkYiwgLWxuZGJtLCAtbGdkYm0pICh0cnlpbmcgZWFjaCBpbiB0aGF0IG9yZGVyKQogICAgIC0gcHJvdmlkZSBiZXR0ZXIgc2VlZCBmb3IgcmFuZAogICAgIC0gcHJvbXB0IGZvciBwYXNzd29yZCBhcyBwZXIgZ2V0cGFzcygzKSAodHVybiBvZmYgZWNobywgcmVhZCBmcm9tCiAgICAgICAvZGV2L3R0eSwgZXRjLikKICAgICAtIHVzZSAibmV3c3R5bGUiIGNyeXB0IGJhc2VkIG9uICRDb25maWd7b3NuYW1lfSAoJF5PKQogICAgIC0gd2lsbCBub3QgYWRkIGEgdXNlciBpZiBhbHJlYWR5IGluIGRhdGFiYXNlLCB1c2UgbmV3IGB1cGRhdGUnIGNvbW1hbmQKICAgICAgIGluc3RlYWQKICAgICAtIGFkZGVkIGBjaGVjaycgY29tbWFuZCB0byBjaGVjayBhIHVzZXJzJyBwYXNzd29yZAogICAgIC0gYWRkZWQgYGltcG9ydCcgY29tbWFuZCB0byBjb252ZXJ0IGV4aXN0aW5nIHBhc3N3b3JkIHRleHQtZmlsZXMgb3IgCiAgICAgICBkYm0gZmlsZXMgZXhwb3J0ZWQgd2l0aCBgdmlldycKICAgICAtIG1vcmUgZGVzY3JpcHRpdmUgdXNhZ2UsIGdlbmVyYWwgY2xlYW51cCwgJ3VzZSBzdHJpY3QnIGNsZWFuLCBldGMuCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkZWQgcHNvY2tldCgpIHdoaWNoIGlzIGEgcG9vbCBmb3JtIG9mIHNvY2tldCgpLCB2YXJpb3VzIHBsYWNlcyB3aXRoaW4KICAgICB0aGUgcHJveHkgd2VyZW4ndCBwcm9wZXJseSBibG9ja2luZyBhbGFybXMgd2hpbGUgcmVnaXN0ZXJpbmcgdGhlIGNsZWFudXAKICAgICBmb3IgaXRzIHNvY2tldHMuICBiY2xvc2UoKSBub3cgdXNlcyBwY2xvc2UoKSBhbmQgcGNsb3Nlc29ja2V0KCkuICBUaGVyZQogICAgIHdhcyBhIGJ1ZyB3aGVyZSB0aGUgY2xpZW50IHNvY2tldCB3YXMgYmVpbmcgY2xvc2UoKWQgdHdpY2UgZHVlIGEgc3RpbGwKICAgICByZWdpc3RlcmVkIGNsZWFudXAuICBbRGVhbiBHYXVkZXRdCgogICopIEEgZmV3IGNsZWFudXBzIHdlcmUgbWFkZSB0byByZWR1Y2UgdGltZSgpLCBnZXRwaWQoKSwgYW5kIHNpZ25hbCgpIGNhbGxzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogQUlYID49IDQuMiByZXF1aXJlcyAtbG0gZHVlIHRvIGxpYmMgY2hhbmdlcy4KICAgICBbSmFzb24gVmVubmVyIDxqYXNvbiBpZGlvbS5jb20+XSBQUiM2NjcKCiAgKikgRW5hYmxlIGBgPSIiJycgZm9yIFJld3JpdGVDb25kIGRpcmVjdGl2ZXMgdG8gbWF0Y2ggYWdhaW5zdAogICAgIHRoZSBlbXB0eSBzdHJpbmcuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgaW5zdGVhZCBvZiBgYF4kJycuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIGFuIGluZmluaXRlIGxvb3AgaW4gbW9kX2ltYXAgZm9yIHJlZmVyZW5jZXMgYWJvdmUgdGhlIHNlcnZlciByb290CiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM3NDgKCiAgKikgbW9kX3Byb3h5IG5vdyBoYXMgYSBSZWNlaXZlQnVmZmVyU2l6ZSBkaXJlY3RpdmUsIHNpbWlsYXIgdG8KICAgICBTZW5kQnVmZmVyU2l6ZSwgc28gdGhhdCB0aGUgVENQIHdpbmRvdyBjYW4gYmUgc2V0IGFwcHJvcHJpYXRlbHkKICAgICBmb3IgTEZOcy4gW1BoaWxsaXAgQS4gUHJpbmRldmlsbGVdCgogICopIG1vZF9icm93c2VyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBtb3JlIGdlbmVyYWwgbW9kX3NldGVudmlmCiAgICAgKGNvdXJ0ZXN5IG9mIFBhdWwgU3V0dG9uKS4gIEJyb3dzZXJNYXRjaCogZGlyZWN0aXZlcyBhcmUgc3RpbGwKICAgICBhdmFpbGFibGUsIGJ1dCBhcmUgbm93IGpvaW5lZCBieSBTZXRFbnZJZiosIFVuU2V0RW52SWYqLCBhbmQKICAgICBVblNldEVudklmWmVybyBkaXJlY3RpdmVzLiAgW0tlbiBDb2FyXQoKICAqKSAiSG9zdG5hbWVMb29rdXBzIGRvdWJsZSIgZm9yY2VzIGRvdWJsZS1yZXZlcnNlIEROUyB0byBzdWNjZWVkIGluCiAgICAgb3JkZXIgZm9yIHJlbW90ZV9ob3N0IHRvIGJlIHNldCAoZm9yIGxvZ2dpbmcsIG9yIGZvciB0aGUgZW52IHZhcgogICAgIFJFTU9URV9IT1NUKS4gIFRoZSBvbGQgZGVmaW5lIE1BWElNVU1fRE5TIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfYWNjZXNzIG92ZXJoYXVsOgogICAgIC0gTm93IHVuZGVyc3RhbmRzIG5ldHdvcmsvbmV0bWFzayBzeW50YXggKGkuZS4gIDEwLjEuMC4wLzI1NS4yNTUuMC4wKQogICAgICAgYW5kIGNpZHIgc3ludGF4IChpLmUuIDEwLjEuMC4wLzE2KS4gIFBSIzc2MgogICAgIC0gQ3JpdGljYWwgcGF0aCB3YXMgc3BlZCB1cCBieSBwcmUtY29tcHV0aW5nIGEgZmV3IHRoaW5ncyBhdCBjb25maWcgdGltZS4KICAgICAtIFRoZSB1bmRvY3VtZW50ZWQgc3ludGF4ICJhbGxvdyB1c2VyLWFnZW50cyIgd2FzIHJlbW92ZWQsCiAgICAgICB0aGUgcmVwbGFjZW1lbnQgaXMgImFsbG93IGZyb20gZW52PWZvb2JhciIgY29tYmluZWQgd2l0aCBtb2RfYnJvd3Nlci4KICAgICAtIFdoZW4gdXNlZCB3aXRoIGhvc3RuYW1lcyBpdCBub3cgZm9yY2VzIGEgZG91YmxlLXJldmVyc2UgbG9va3VwCiAgICAgICBubyBtYXR0ZXIgd2hhdCB0aGUgZGlyZWN0b3J5IHNldHRpbmdzIGFyZS4gIFRoaXMgZG91YmxlLXJldmVyc2UKICAgICAgIGRvZXNuJ3QgYWZmZWN0IGFueSBvZiB0aGUgb3RoZXIgcm91dGluZXMgdGhhdCB1c2UgdGhlIHJlbW90ZQogICAgICAgaG9zdG5hbWUuICBJbiBwYXJ0aWN1bGFyIGl0J3Mgc3RpbGwgcGFzc2VkIHRvIENHSXMgYW5kIHRoZSBsb2cKICAgICAgIHdpdGhvdXQgdGhlIGRvdWJsZS1yZXZlcnNlIGNoZWNrLiAgUmVsYXRlZCBQUiM4NjAuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBXaGVuIGEgbGFyZ2UgYndyaXRlKCkgb2NjdXJzIChsYXJnZXIgdGhhbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUpLAogICAgIHdoaWxlIHRoZXJlIGlzIGFscmVhZHkgc29tZXRoaW5nIGluIHRoZSBidWZmZXIsIGFwYWNoZSB3aWxsIGNvbWJpbmUKICAgICB0aGUgbGFyZ2Ugd3JpdGUgYW5kIHRoZSBidWZmZXIgaW50byBhIHNpbmdsZSB3cml0ZXYoKS4gIChUaGlzIGlzCiAgICAgaW4gYW50aWNpcGF0aW9uIG9mIHVzaW5nIG1tYXAoKSBmb3IgcmVhZGluZyBmaWxlcy4pCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiBvYnNjdXJlIGNhc2VzIHdoZXJlIGEgcGFydGlhbCBzb2NrZXQgd3JpdGUgb2NjdXJyZWQgd2hpbGUgY2h1bmtpbmcsCiAgICAgQXBhY2hlIHdvdWxkIG9taXQgdGhlIGNodW5rIGhlYWRlci9mb290ZXIgb24gdGhlIG5leHQgYmxvY2suICBDbGVhbmVkCiAgICAgdXAgb3RoZXIgYnVncy9pbmNvbnNpc3RlbmNpZXMgaW4gZXJyb3IgY29uZGl0aW9ucyBpbiBidWZmLmMuICBGaXhlZAogICAgIGEgYnVnIHdoZXJlIGEgbG9uZyBwYXVzZSBpbiBETlMgbG9va3VwcyBjb3VsZCBjYXVzZSB0aGUgbGFzdCBwYWNrZXQKICAgICBvZiBhIHJlc3BvbnNlIHRvIGJlIHVuZHVseSBkZWxheWVkLiAgW1JveSBGaWVsZGluZywgRGVhbiBHYXVkZXRdCgogICopIEFQSTogQWRkZWQgY2hpbGRfZXhpdCBmdW5jdGlvbiB0byBtb2R1bGUgc3RydWN0dXJlLiAgVGhpcyBpcyBjYWxsZWQKICAgICBvbmNlIHBlciAiaGVhdnktd2VpZ2h0IHByb2Nlc3MiIGp1c3QgYmVmb3JlIGEgc2VydmVyIGNoaWxkIGV4aXQoKSdzIAogICAgIGUuZy4gd2hlbiBtYXhfcmVxdWVzdHNfcGVyX2NoaWxkIGlzIHJlYWNoZWQsIGV0Yy4KICAgICBbRG91ZyBNYWNFYWNoZXJuLCBEZWFuIEdhdWRldF0KCiAgKikgbW9kX2luY2x1ZGUgY2xlYW51cCBzaG93ZWQgdGhhdCBoYW5kbGVfZWxzZSB3YXMgYmVpbmcgdXNlZCB0byBoYW5kbGUKICAgICBlbmRpZi4gIEl0IGRpZG4ndCBjYXVzZSBwcm9ibGVtcywgYnV0IGl0IHdhcyBjbGVhbmVkIHVwIHRvby4KICAgICBbSG93YXJkIEZlYXJdCgogICopIG1vZF9jZXJuX21ldGEgd291bGQgYXR0ZW1wdCB0byBmaW5kIG1ldGEgZmlsZXMgZm9yIHRoZSBkaXJlY3RvcnkgaXRzZWxmCiAgICAgaW4gc29tZSBjYXNlcywgYnV0IG5vdCBpbiBvdGhlcnMuICBJdCBub3cgYXZvaWRzIGl0IGluIGFsbCBjYXNlcy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9taW1lX21hZ2ljIHdvdWxkIGNvcmUgZHVtcCBpZiB0aGVyZSB3YXMgYSBkZWNvbXByZXNzaW9uIGVycm9yLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXIgbWNoLnNuaS5kZT5dIFBSIzkwNAoKICAqKSBQT1JUOiBzb21lIHZhcmlhbnRzIG9mIERHVVggcmVxdWlyZSAtbHNvY2tldCAtbG5zbAogICAgIFtBbGV4YW5kZXIgTCBKb25lcyA8YWxleCBzeXN0ZW1zLW9wdGlvbnMuY28udWs+XSBQUiM3MzIKCiAgKikgbW9kX2F1dG9pbmRleCBub3cgYWxsb3dzIHNvcnRpbmcgb2YgRmFuY3lJbmRleGVkIGRpcmVjdG9yeSBsaXN0aW5ncwogICAgIGJ5IHRoZSB2YXJpb3VzIGZpZWxkcyAobmFtZSwgc2l6ZSwgZXQgY2V0ZXJhKSwgZWl0aGVyIGluIGFzY2VuZGluZwogICAgIG9yIGRlc2NlbmRpbmcgb3JkZXIuICBKdXN0IGNsaWNrIG9uIHRoZSBjb2x1bW4gaGVhZGVyLiAgW0tlbiBDb2FyXQoKICAqKSBQT1JUOiBWYXJpb3VzIHR3ZWFrcyB0byBlbGltaW5hdGUgcG9pbnRlci1pbnQgY2FzdGluZyB3YXJuaW5ncyBvbiA2NC1iaXQKICAgICBDUFVzIGxpa2UgdGhlIEFscGhhLiAgQXBhY2hlIHN0aWxsIHN0b3JlcyBpbnRzIGluIHBvaW50ZXJzLCBidXQgdGhhdCdzCiAgICAgdGhlIHJlbGF0aXZlbHkgc2FmZSBkaXJlY3Rpb24uICBbRGVhbiBHYXVkZXRdIFBSIzM0NAoKICAqKSBQT1JUOiBRTlggbW1hcCgpIHN1cHBvcnQgZm9yIGZhc3Rlci9tb3JlIHJlbGlhYmxlIHNjb3JlYm9hcmQgaGFuZGxpbmcuCiAgICAgW0lnb3IgTiBLb3ZhbGVua28gPGluZm9oIG1haWwud3BsdXMubmV0Pl0gUFIjNjgzCgogICopIGNoaWxkX21haW4gYXZvaWRzIGFuIHVubmVlZGVkIGNhbGwgdG8gc2VsZWN0KCkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZQogICAgIGxpc3RlbmluZyBzb2NrZXQuICBbRGVhbiBHYXVkZXRdCgogICopIEluIHRoZSBldmVudCB0aGF0IHRoZSBzZXJ2ZXIgaXMgc3RhcnZlZCBmb3IgaWRsZSBzZXJ2ZXJzIGl0IHdpbGwKICAgICBzcGF3biAxLCB0aGVuIDIsIHRoZW4gNCwgLi4uLCB0aGVuIDMyIHNlcnZlcnMgZWFjaCBzZWNvbmQsCiAgICAgZG91YmxpbmcgZWFjaCBzZWNvbmQuICBJdCdsbCBhbHNvIGdpdmUgYSB3YXJuaW5nIGluIHRoZSBlcnJvcmxvZwogICAgIHNpbmNlIHRoZSBtb3N0IGNvbW1vbiByZWFzb24gZm9yIHRoaXMgaXMgYSBwb29yIFN0YXJ0U2VydmVycwogICAgIHNldHRpbmcuICBUaGUgZGVmaW5lIE1BWF9TUEFXTl9SQVRFIGNhbiBiZSB1c2VkIHRvIHJhaXNlL2xvd2VyCiAgICAgdGhlIG1heGltdW0uICBbRGVhbiBHYXVkZXRdCgogICopIEFwYWNoZSBub3cgcHJvdmlkZXMgYW4gZWZmZWN0aXZlbHkgdW5idWZmZXJlZCBjb25uZWN0aW9uIGZvcgogICAgIENHSSBzY3JpcHRzLiAgVGhpcyBtZWFucyB0aGF0IGRhdGEgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKICAgICBhcyBzb29uIGFzIHRoZSBDR0kgcGF1c2VzIG9yIHN0b3BzIG91dHB1dDsgcHJldmlvdXNseSwgQXBhY2hlIHdvdWxkCiAgICAgYnVmZmVyIHRoZSBvdXRwdXQgdXAgdG8gYSBmaXhlZCBidWZmZXIgc2l6ZSBiZWZvcmUgc2VuZGluZywgd2hpY2gKICAgICBjb3VsZCByZXN1bHQgaW4gdGhlIHVzZXIgdmlld2luZyBhbiBlbXB0eSBwYWdlIHVudGlsIHRoZSBDR0kgZmluaXNoZWQKICAgICBvciBvdXRwdXQgYSBjb21wbGV0ZSBidWZmZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHVzZSBhbgogICAgICJucGgtIiBDR0kgdG8gZ2V0IHVuYnVmZmVyZWQgb3V0cHV0LiAgR2l2ZW4gdGhhdCBtb3N0IENHSXMgYXJlIHdyaXR0ZW4KICAgICBpbiBhIGxhbmd1YWdlIHRoYXQgYnkgZGVmYXVsdCBkb2VzIGJ1ZmZlcmluZyAoZS5nLiBwZXJsKSB0aGlzCiAgICAgc2hvdWxkbid0IGhhdmUgYSBkZXRyaW1lbnRhbCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuCgogICAgICJucGgtIiBDR0lzLCB3aGljaCBmb3JtZXJseSBwcm92aWRlZCBhIGRpcmVjdCBzb2NrZXQgdG8gdGhlIGNsaWVudAogICAgIHdpdGhvdXQgYW55IHNlcnZlciBwb3N0LXByb2Nlc3NpbmcsIHdlcmUgbm90IGZ1bGx5IGNvbXBhdGlibGUgd2l0aAogICAgIEhUVFAvMS4xIG9yIFNTTCBzdXBwb3J0LiAgQXMgc3VjaCB0aGV5IHdvdWxkIGhhdmUgaGFkIHRvIGltcGxlbWVudAogICAgIHRoZSB0cmFuc3BvcnQgZGV0YWlscywgc3VjaCBhcyBlbmNyeXB0aW9uIG9yIGNodW5raW5nLCBpbiBvcmRlcgogICAgIHRvIHdvcmsgcHJvcGVybHkgaW4gY2VydGFpbiBzaXR1YXRpb25zLiAgTm93LCB0aGUgb25seSBkaWZmZXJlbmNlCiAgICAgYmV0d2VlbiBucGggYW5kIG5vbi1ucGggc2NyaXB0cyBpcyAibm9uLXBhcnNlZCBoZWFkZXJzIi4KICAgICBbRGVhbiBHYXVkZXQsIFNhbWVlciBQYXJla2gsIFJveSBGaWVsZGluZ10KCiAgKikgSWYgYSBCVUZGIGlzIHN3aXRjaGVkIGZyb20gYnVmZmVyZWQgdG8gdW5idWZmZXJlZCByZWFkaW5nIHRoZSBmaXJzdAogICAgIGJyZWFkKCkgd2lsbCByZXR1cm4gd2hhdGV2ZXIgcmVtYWluZWQgaW4gdGhlIGJ1ZmZlciBwcmlvciB0byB0aGUKICAgICBzd2l0Y2guIFtEZWFuIEdhdWRldF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYTEKCiAgKikgQWRkZWQgYW5vdGhlciBDb25maWd1cmUgaGVscGVyIHNjcmlwdDogVGVzdExpYi4gSXQgZGV0ZXJtaW5lcwogICAgIGlmIGEgc3BlY2lmaWVkIGxpYnJhcnkgZXhpc3RzLiAgW0ppbSBKYWdpZWxza2ldCgogICopIFBPUlQ6IEFsbG93IGZvciB1c2Ugb2YgbjMyYml0IGxpYnJhcmllcyB1bmRlciBJUklYIDYueAogICAgIFtkZXJpdmVkIGZyb20gcGF0Y2ggZnJvbSBKZWZmIEhheWVzIDxqaGF5ZXMgYXcuc2dpLmNvbT5dCiAgICAgUFIjNzIxCgogICopIFBPUlQ6IFNvbWUgYXJjaGl0ZWN0dXJlcyB1c2Ugc2l6ZV90IGZvciB2YXJpb3VzIGxlbmd0aHMgaW4gbmV0d29yawogICAgIGZ1bmN0aW9ucyBzdWNoIGFzIGFjY2VwdCgpLCBhbmQgZ2V0c29ja25hbWUoKS4gIFRoZSBkZWZpbml0aW9uCiAgICAgTkVUX1NJWkVfVCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhpcy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBMaW51eDogQXR0ZW1wdCB0byBkZXRlY3QgZ2xpYmMgYmFzZWQgc3lzdGVtcyBhbmQgaW5jbHVkZSBjcnlwdC5oCiAgICAgYW5kIC1sY3J5cHQuICBUZXN0IGZvciB2YXJpb3VzIGRiIGxpYnJhcmllcyAoZGJtLCBuZGJtLCBkYikgd2hlbgogICAgIG1vZF9hdXRoX2RibSBvciBtb2RfYXV0aF9kYiBhcmUgaW5jbHVkZWQuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFFOWCBkb2Vzbid0IGhhdmUgaW5pdGdyb3VwcygpIHdoaWNoIHN1cHBvcnQvc3VleGVjLmMgdXNlcy4KICAgICBbSWdvciBOIEtvdmFsZW5rbyA8aW5mb2ggbWFpbC53cGx1cy5uZXQ+XQoKICAqKSAiZm9yY2UtcmVzcG9uc2UtMS4wIiBub3cgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RzIHdoaWNoIGFyZSBIVFRQLzEuMCB0bwogICAgIGJlZ2luIHdpdGguICAibm9rZWVwYWxpdmUiIG5vdyB3b3JrcyBmb3IgSFRUUC8xLjEgY2xpZW50cy4gIEFkZGVkCiAgICAgImRvd25ncmFkZS0xLjAiIHdoaWNoIGNhdXNlcyBBcGFjaGUgdG8gcHJldGVuZCBpdCByZWNlaXZlZCBhIDEuMC4KICAgICBbRGVhbiBHYXVkZXRdIHJlbGF0ZWQgUFIjODc1CgogICopIEFQSTogQ29ycmVjdCBjaGlsZF9pbml0KCkgc2xvdCBkZWNsYXJhdGlvbiBmcm9tIGludCB0byB2b2lkLCB0bwogICAgIG1hdGNoIHRoZSBpbml0KCkgZGVjbGFyYXRpb24uICBVcGRhdGUgbW9kX2V4YW1wbGUgdG8gdXNlIHRoZSBuZXcKICAgICBob29rLiAgW0tlbiBDb2FyXQoKICAqKSBhZGRlZCB0cmFuc3BvcnQgaGFuZGxlIHNsb3QgKHRfaGFuZGxlKSB0byB0aGUgQlVGRiBzdHJ1Y3R1cmUKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBnZXRfY2xpZW50X2Jsb2NrKCkgcmV0dXJucyB3cm9uZyBsZW5ndGggaWYgcG9saWN5IGlzCiAgICAgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTksuCiAgICAgW0tlbmljaGkgSG9yaSA8a2VuIGQyLmJzMS5mYy5uZWMuY28uanA+XSBQUiM4MTUKCiAgKikgU3VwcG9ydCB0aGUgaW1hZ2UgbWFwIGZvcm1hdCBvZiBGcm9udFBhZ2UuICBGb3IgZXhhbXBsZToKICAgICAgICByZWN0IC91cmwuaHJtIDEwIDIwIDMwIDQwCiAgICAgWyJDaHJpcyBPJ0J5cm5lIiA8b2J5cm5lIGlvbC5pZT5dIFBSIzgwNwoKICAqKSBQT1JUOiAtbHJlc29sdiBhbmQgLWxzb2NrcyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlciBmb3IgU29sYXJpcy4KICAgICBbIkRhcnJlbiBPJ1NoYXVnaG5lc3N5IiA8ZGFycmVuIGFhaWkub3ouYXU+XSBQUiM4NDYKCiAgKikgQWRkTW9kdWxlSW5mbyBkaXJlY3RpdmUgZm9yIG1vZF9pbmZvIHdoaWNoIGFsbG93cyB5b3UgdG8gYW5ub3RhdGUKICAgICB0aGUgb3V0cHV0IG9mIG1vZF9pbmZvLiAgWyJMb3UgRC4gTGFuZ2hvbHR6IiA8bGRsIHVzaS51dGFoLmVkdT5dCgogICopIEFkZGVkIE5vUHJveHkgZGlyZWN0aXZlIHRvIGF2b2lkIHVzaW5nIFByb3h5UmVtb3RlIGZvciBzZWxlY3RlZAogICAgIGFkZHJlc3Nlcy4gIEFkZGVkIFByb3h5RG9tYWluIGRpcmVjdGl2ZSB0byBjYXVzZSB1bnF1YWxpZmllZAogICAgIG5hbWVzIHRvIGJlIHF1YWxpZmllZCBieSByZWRpcmVjdGlvbi4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyIG1jaC5zbmkuZGU+XQoKICAqKSBTdXBwb3J0IFByb3h5IEF1dGhlbnRpY2F0aW9uLCBhbmQgZG9uJ3QgcGFzcyB0aGUgUHJveHktQXV0aG9yaXplCiAgICAgaGVhZGVyIHRvIHRoZSByZW1vdGUgaG9zdCBpbiB0aGUgcHJveHkuIFtTYW1lZXIgUGFyZWtoIGFuZAogICAgIFdhbGxhY2VdCgogICopIFVwZ3JhZGVkIG1vZF9yZXdyaXRlIGZyb20gMy4wLjYrIHRvIGxhdGVzdCBvZmZpY2lhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uCiAgICAgMy4wLjkuIFRoaXMgdXBncmFkZSBpbmNsdWRlczogZml4ZWQgZGVhZGxvb3Bpbmcgb24gcmV3cml0aW5nIHRvIHNhbWUKICAgICBVUkxzLCBmaXhlZCByZXdyaXRlbG9nKCksIGZpeGVkIGZvcmNlZCByZXNwb25zZSBjb2RlIGhhbmRsaW5nIG9uCiAgICAgcmVkaXJlY3RzIGZyb20gd2l0aGluIC5odGFjY2VzcyBmaWxlcywgZGlzYWJsZWQgcGlwZSBsb2NraW5nIHVuZGVyCiAgICAgYnJhaW5kZWFkIFN1bk9TIDQuMS54LCBhbGxvdyBlbnYgdmFyaWFibGVzIHRvIGJlIHNldCBldmVuIG9uIHJ1bGVzIHdpdGgKICAgICBubyBzdWJzdGl0dXRpb24sIGJ1Z2ZpeGVkIHNpdHVhdGlvbnMgd2hlcmUgSG9zdG5hbWVMb29rdXBzIGlzIG9mZiwgbWFkZQogICAgIG1vZF9yZXdyaXRlIG1vcmUgdGhyZWFkLXNhZmUgZm9yIE5UIHBvcnQgYW5kIGZpeGVkIHByb2JsZW0gd2hlbiBjcmVhdGluZwogICAgIGFuIGVtcHR5IHF1ZXJ5IHN0cmluZyB2aWEgInh4eD8iLgogICAgICAgICBUaGlzIHVwZGF0ZSBhbHNvIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLAogICAgIGkuZS4gbm93IG1vZF9yZXdyaXRlIG5vIGxvbmdlciBoYXMgYSBzaGFyZWQgY29weXJpZ2h0LiBJbnN0ZWFkIGlzIGlzCiAgICAgZXhjbHVzaXZlbHkgY29weXJpZ2h0ZWQgYnkgdGhlIEFwYWNoZSBHcm91cCBub3cuIFRoaXMgaGFwcGVuZWQgYmVjYXVzZQogICAgIHRoZSBhdXRob3Igbm93IGhhcyBnaWZ0ZWQgbW9kX3Jld3JpdGUgZXhjbHVzaXZlbHkgdG8gdGhlIEFwYWNoZSBHcm91cCBhbmQgCiAgICAgbm8gbG9uZ2VyIG1haW50YWlucyBhbiBleHRlcm5hbCB2ZXJzaW9uLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBUEk6IEFkZGVkIGNoaWxkX2luaXQgZnVuY3Rpb24gdG8gbW9kdWxlIHN0cnVjdHVyZS4gIFRoaXMgaXMgY2FsbGVkCiAgICAgb25jZSBwZXIgImhlYXZ5LXdlaWdodCBwcm9jZXNzIiBiZWZvcmUgYW55IHJlcXVlc3RzIGFyZSBoYW5kbGVkLgogICAgIFNlZSBodHRwX2NvbmZpZy5oIGZvciBtb3JlIGRldGFpbHMuICBbRGVhbiBHYXVkZXRdCgogICopIEFub255bW91c19Mb2dFbWFpbCB3YXMgbG9nZ2luZyBvbiBlYWNoIHN1YnJlcXVlc3QuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0MjEsIDg2OAoKICAqKSBBUEk6IEFkZGVkIGlzX2luaXRpYWxfcmVxKCkgd2hpY2ggdGVzdHMgaWYgdGhlIHJlcXVlc3QgYmVpbmcKICAgICBwcm9jZXNzZWQgaXMgdGhlIGluaXRpYWwgcmVxdWVzdCwgb3IgYSBzdWJyZXF1ZXN0LgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEV4dGVuZGVkIFNTSSAobW9kX2luY2x1ZGUpIG5vdyBoYW5kbGVzIGFkZGl0aW9uYWwgcmVsb3BzIGZvcgogICAgIHN0cmluZyBjb21wYXJpc29ucyAoPCwgPiwgPD0sIGFuZCA+PSkuICBbQnJ1bm8gV29sZmYgSUlJXSBQUiM0MQoKICAqKSBDb25maWd1cmUgZml4ZWQgdG8gY29ycmVjdGx5IHByb3BhZ2F0ZSB1c2VyLXNlbGVjdGVkIG9wdGlvbnMgYW5kCiAgICAgc2V0dGluZ3MgKHN1Y2ggYXMgQ0MgYW5kIE9QVElNKSB0byBNYWtlZmlsZXMgb3RoZXIgdGhhbgogICAgIHNyYy9NYWtlZmlsZSAobm90YWJseSBzdXBwb3J0L01ha2VmaWxlKS4gIFtLZW4gQ29hcl0gUFIjNjY2LCAjODM0CgogICopIEluZGV4T3B0aW9ucyBTdXBwcmVzc0hUTUxQcmVhbWJsZSBub3cgY2F1c2VzIHRoZSBhY3R1YWwgSFRNTCBvZgogICAgIGRpcmVjdG9yeSBpbmRpY2VzIHRvIHN0YXJ0IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBIZWFkZXJOYW1lIGZpbGUKICAgICBpZiB0aGVyZSBpcyBvbmUuICBJZiB0aGVyZSBpc24ndCBvbmUsIHRoZSBiZWhhdmlvdXIgaXMgdW5jaGFuZ2VkLgogICAgIFtLZW4gQ29hciwgUm95IEZpZWxkaW5nLCBBbmRyZXkgQS4gQ2hlcm5vdl0KCiAgKikgV0lOMzI6IE1vZHVsZXMgY2FuIG5vdyBiZSBkeW5hbWljYWxseSBsb2FkZWQgRExMcyB1c2luZyB0aGUKICAgICBMb2FkTW9kdWxlL0xvYWRGaWxlIGRpcmVjdGl2ZXMuIE5vdGUgdGhhdCBtb2R1bGUgRExMcyBtdXN0IGJlCiAgICAgY29tcGlsZWQgd2l0aCB0aGUgbXVsdGl0aHJlYWRlZCBETEwgdmVyc2lvbiBvZiB0aGUgcnVudGltZSBsaWJyYXJ5LgogICAgIFtBbGV4ZWkgS29zdXQgYW5kIEJlbiBMYXVyaWVdCgogICopIEF1dG9tYXRpYyBpbmRleGluZyByZW1vdmVkIGZyb20gbW9kX2RpciBhbmQgcGxhY2VkIGludG8gbW9kX2F1dG9pbmRleC4KICAgICBUaGlzIGFsbG93cyB0aGUgYWRtaW4gdG8gY29tcGxldGVseSByZW1vdmUgYXV0b21hdGljIGluZGV4aW5nCiAgICAgZnJvbSB0aGUgc2VydmVyLCB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIHRoZSBiYXNpYyBmdW5jdGlvbnMgb2YKICAgICB0cmFpbGluZy1zbGFzaCByZWRpcmVjdHMgYW5kIERpcmVjdG9yeUluZGV4IGZpbGVzLiAgTm90ZSB0aGF0IGlmCiAgICAgeW91J3JlIGNhcnJ5aW5nIG92ZXIgYW4gb2xkIENvbmZpZ3VyYXRpb24gZmlsZSBhbmQgeW91IHVzZSBkaXJlY3RvcnkKICAgICBpbmRleGluZyB0aGVuIHlvdSdsbCB3YW50IHRvIGFkZDoKCiAgICAgTW9kdWxlIGF1dG9pbmRleF9tb2R1bGUgICAgbW9kX2F1dG9pbmRleC5vCgogICAgIGJlZm9yZSBtb2RfZGlyIGluIHlvdXIgQ29uZmlndXJhdGlvbi4gIFtEZWFuIEdhdWRldF0KCiAgKikgcG9wZW5kaXIvcGNsb3NlZGlyIGNyZWF0ZWQgdG8gcHJvcGVybHkgcHJvdGVjdCBkaXJlY3Rvcnkgc2Nhbm5pbmcuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM1MjUKCiAgKikgQWxpYXNNYXRjaCwgU2NyaXB0QWxpYXNNYXRjaCBhbmQgUmVkaXJlY3RNYXRjaCBkaXJlY3RpdmVzIGFkZGVkLAogICAgIGdpdmluZyByZWdleCBzdXBwb3J0IHRvIG1vZF9hbGlhcy4gPERpcmVjdG9yeU1hdGNoPiwgPExvY2F0aW9uTWF0Y2g+CiAgICAgYW5kIDxGaWxlc01hdGNoPiBzZWN0aW9ucyBhZGRlZCB0byBzdWNjZWVkIDxEaXJlY3RvcnlNYXRjaCB+PiwgZXRjLi4uCiAgICAgW0FsZXhlaSBLb3N1dF0KCiAgKikgVGhlIEFjY2Vzc0ZpbGVOYW1lIGRpcmVjdGl2ZSBjYW4gbm93IHRha2UgbW9yZSB0aGFuIG9uZSBmaWxlbmFtZS4KICAgICBbIkxvdSBELiBMYW5naG9sdHoiIDxsZGwgdXNpLnV0YWguZWR1Pl0KCiAgKikgVGhlIG5ldyBtb2RfbWltZV9tYWdpYyBjYW4gYmUgdXNlZCB0byAibWFnaWNhbGx5IiBkZXRlcm1pbmUgdGhlIHR5cGUKICAgICBvZiBhIGZpbGUgaWYgdGhlIGV4dGVuc2lvbiBpcyB1bmtub3duLiAgQmFzZWQgb24gdGhlIHVuaXggZmlsZSgxKQogICAgIGNvbW1hbmQuICBbSWFuIEtsdWZ0IDxpa2x1ZnQgY2lzY28uY29tPl0KCiAgKikgV2Ugbm93IGRldGVybWluZSBhbmQgZGlzcGxheSB0aGUgdGltZSBzcGVudCBwcm9jZXNzaW5nIGEKICAgICByZXF1ZXN0IGlmIGRlc2lyZWQuICBbSmltIEphZ2llbHNraV0KCiAgKikgbW9kX3N0YXR1czogUElEIGZpZWxkIG9mICJkZWFkIiBjaGlsZCBzbG90cyBubyBsb25nZXIgZGlzcGxheXMKICAgICBtYWluIGh0dHBkIHByb2Nlc3MncyBQSUQuICBbSmltIEphZ2llbHNraV0KCiAgKikgTWFrZWZpbGUubnQgYWRkZWQgLSB0byBidWlsZCBhbGwgdGhlIGJpdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lOgogICAgICAgIG5tYWtlIC1mIE1ha2VmaWxlLm50CiAgICAgICAgIERvZXNuJ3QgeWV0IHdvcmsgcHJvcGVybHkuIFtCZW4gTGF1cmllXQoKICAqKSBEZWZhdWx0IHRleHQgb2YgNDA0IGVycm9yIGlzIG5vdyAiTm90IEZvdW5kIiByYXRoZXIgdGhhbiB0aGUKICAgICBwb3RlbnRpYWxseSBtaXNsZWFkaW5nICJGaWxlIE5vdCBGb3VuZCIuICBbS2VuIENvYXJdCgogICopIENPTkZJRzogIkhvc3RuYW1lTG9va3VwcyIgbm93IGRlZmF1bHRzIHRvIG9mZiBiZWNhdXNlIGl0IGlzIGZhciBiZXR0ZXIKICAgICBmb3IgdGhlIG5ldCBpZiB3ZSByZXF1aXJlIHBlb3BsZSB0aGF0IGFjdHVhbGx5IG5lZWQgdGhpcyBkYXRhIHRvCiAgICAgZW5hYmxlIGl0LiAgW0xpbnVzIFRvcnZhbGRzXQoKICAqKSBkaXJlY3Rvcnlfd2FsaygpIGlzIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiwga2VlcCBhIGxpdHRsZSBtb3JlIHN0YXRlIHRvCiAgICAgYXZvaWQgbmVlZGxlc3Mgc3RyaW5nIGNvdW50aW5nLiAgQWRkIHR3byBuZXcgZnVuY3Rpb25zIG1ha2VfZGlyc3RyX3BhcmVudAogICAgIGFuZCBtYWtlX2RpcnN0cl9wcmVmaXggd2hpY2ggcmVwbGFjZSBhbGwgZXhpc3RpbmcgdXNlcyBvZiBtYWtlX2RpcnN0ci4KICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBhcmUgYSBsaXR0bGUgbGVzcyBnZW5lcmFsIHRoYW4gbWFrZV9kaXJzdHIsIGJ1dAogICAgIHdvcmsgbW9yZSBlZmZpY2llbnRseSAobGVzcyBtZW1vcnksIGxlc3Mgc3RyaW5nIGNvdW50aW5nKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEVYVFJBX0xGTEFHUyB3YXMgY2hhbmdlZCB0byBFWFRSQV9MREZMQUdTIChhbmQgTEZMQUdTIHdhcyBjaGFuZ2VkCiAgICAgdG8gTERGTEFHUykgdG8gYXZvaWQgY29tcGxpY2F0aW9ucyB3aXRoIGxleCBydWxlcyBpbiBtYWtlIGZpbGVzLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMzcyCgogICopIHJ1bl9tZXRob2Qgb3B0aW1pemVkIHRvIGF2b2lkIG5lZWRsZXNzIHNjYW5uaW5nIG92ZXIgTlVMTHMgaW4gdGhlCiAgICAgbW9kdWxlIGxpc3QuICBbRGVhbiBHYXVkZXRdCgogICopIFJldmFtcCBvZiAodW5peCkgc2NvcmVib2FyZCBtYW5hZ2VtZW50IGNvZGUgc3VjaCB0aGF0IGl0IGF2b2lkcwogICAgIHVubmVjZXNzYXJ5IHRyYXZlcnNhbHMgb2YgdGhlIHNjb3JlYm9hcmQgb24gZWFjaCBoaXQuICBUaGlzIGlzCiAgICAgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgaGlnaCB2b2x1bWUgc2l0ZXMgd2l0aCBhIGxhcmdlCiAgICAgSEFSRF9TRVJWRVJfTElNSVQuICBTb21lIG9mIHRoZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgTyhuXjIpLAogICAgIGFuZCBhcmUgbm93IE8obikuICBTZWUgYWxzbyBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIGluCiAgICAgaHR0cGQuaC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiBjb25maWd1cmF0aW9ucyB1c2luZyBtdWx0aXBsZSBMaXN0ZW4gc3RhdGVtZW50cyBpdCB3YXMgcG9zc2libGUgZm9yCiAgICAgYnVzeSBzb2NrZXRzIHRvIHN0YXJ2ZSBvdGhlciBzb2NrZXRzIG9mIHNlcnZpY2UuICBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIGhvb2sgc28gc3RhbmRhbG9uZV9tYWluIGNhbiBiZSByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUKICAgICAoZGVmaW5lIFNUQU5EQUxPTkVfTUFJTikKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBMb3dlc3QtbGV2ZWwgcmVhZC93cml0ZSBmdW5jdGlvbnMgaW4gYnVmZi5jIHdpbGwgYmUgcmVwbGFjZWQgd2l0aAogICAgIHRoZSBTRklPIGxpYnJhcnkgY2FsbHMgc2ZyZWFkL3Nmd3JpdGUgaWYgQl9TRklPIGlzIGRlZmluZWQgYXQKICAgICBjb21waWxlIHRpbWUuICBUaGUgZGVmYXVsdCBzZmlvIGRpc2NpcGxpbmUgd2lsbCBiZWhhdmUgYXMgYXBhY2hlCiAgICAgd291bGQgd2l0aG91dCBzZmlvIGNvbXBpbGVkIGluLgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEVuaGFuY2UgVXNlckRpciBkaXJlY3RpdmUgKG1vZF91c2VyZGlyKSB0byBhY2NlcHQgYSBsaXN0IG9mCiAgICAgdXNlcm5hbWVzIGZvciB0aGUgJ2Rpc2FibGUnIGtleXdvcmQsIGFuZCBhZGQgJ2VuYWJsZSB1c2VyLi4uJyB0bwogICAgIHNlbGVjdGl2ZWx5ICplbiphYmxlIHVzZXJkaXJzIGlmIHRoZXkncmUgZ2xvYmFsbHkgZGlzYWJsZWQuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBJZiBORVRTQ0FQRV9EQk1fQ09NUEFUIGlzIGRlZmluZWQgaW4gRVhUUkFfQ0ZMQUdTIHRoZW4gQXBhY2hlCiAgICAgd2lsbCB3b3JrIHdpdGggTmV0c2NhcGUgZGJtIGZpbGVzLiAgKGRibW1hbmFnZSB3aWxsIHByb2JhYmx5IG5vdAogICAgIHdvcmsgaG93ZXZlci4pIFtBbGV4YW5kZXIgU3BvaHIgPGFzcG9ociBuZXRtYXRpYy5jb20+XSBQUiM0NDQKCiAgKikgQWRkIGEgTGlzdGVuQmFja2xvZyBkaXJlY3RpdmUgdG8gY29udHJvbCB0aGUgYmFja2xvZyBwYXJhbWV0ZXIKICAgICBwYXNzZWQgdG8gbGlzdGVuKCkuICBBbHNvIGNoYW5nZSB0aGUgZGVmYXVsdCB0byA1MTEgZnJvbSA1MTIuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBBUEk6IEEgbmV3IGhhbmRsZXIgcmVzcG9uc2UgRE9ORSB3aGljaCBpbmZvcm1zIGFwYWNoZSB0aGF0IHRoZQogICAgIHJlcXVlc3QgaGFzIGJlZW4gaGFuZGxlZCBhbmQgaXQgY2FuIGZpbmlzaCBvZmYgcXVpY2tseSwgc2ltaWxhciB0bwogICAgIGhvdyBpdCBoYW5kbGVzIGVycm9ycy4gW1JvYiBIYXJ0aWxsXQoKICAqKSBUdXJuIG9mZiBjaHVua2VkIGVuY29kaW5nIGFmdGVyIHNlbmRpbmcgdGVybWluYXRpbmcgY2h1bmsvZm9vdGVyCiAgICAgc28gdGhhdCB3ZSBjYW4ndCBkbyBpdCB0d2ljZSBieSBhY2NpZGVudC4gW1JveSBGaWVsZGluZ10KCiAgKikgbW9kX2V4cGlyZSBhbHNvIGlzc3VlcyBDYWNoZS1Db250cm9sOiBtYXgtYWdlIGhlYWRlcnMuCiAgICAgW1JvYiBIYXJ0aWxsXQoKICAqKSBBUEk6IEFkZGVkIGtpbGxfb25seV9vbmNlIG9wdGlvbiBmb3IgZnJlZV9wcm9jX2NoYWluIHNvIHRoYXQgaXQgd29uJ3QKICAgICBhZ2dyZXNzaXZlbHkgdHJ5IHRvIGtpbGwgb2ZmIHNwZWNpZmljIGNoaWxkcmVuLiAgRm9yIGZhc3RjZ2kuCiAgICAgW1N0YW5sZXkgR2FtYmFyaW4gPGdhbWJhcmluIE9wZW5NYXJrZXQuY29tPl0KCiAgKikgbW9kX2F1dGggZGVhbHMgd2l0aCBleHRyYSAnOicgZGVsaW1pdGVkIGZpZWxkcy4gIFtNYXJjIFNsZW1rb10KCiAgKikgQWRkZWQgSWNvbkhlaWdodCBhbmQgSWNvbldpZHRoIHRvIG1vZF9kaXIncyBJbmRleE9wdGlvbnMgZGlyZWN0aXZlLgogICAgIFdoZW4gdXNlZCB0b2dldGhlciwgdGhlc2UgY2F1c2UgbW9kX2RpciB0byBlbWl0IEhFSUdIVCBhbmQgV0lEVEgKICAgICBhdHRyaWJ1dGVzIGluIHRoZSBGYW5jeUluZGV4aW5nIElNRyB0YWdzLiAgW0tlbiBDb2FyXQoKICAqKSBQT1JUOiBTZXF1ZW50IGFuZCBTT05ZIE5FV1MtT1Mgc3VwcG9ydCBhZGRlZC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQT1JUOiBBZGRlZCBXaW5kb3dzIE5UIHN1cHBvcnQKICAgICBbQmVuIExhdXJpZSBhbmQgQW1iYXJpc2ggTWFscGFuaSA8YW1iYXJpc2ggdmFsaWNlcnQuY29tPl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjYKCiAgKikgbW9kX2luY2x1ZGUgd2hlbiB1c2luZyBYQml0SGFjayBGdWxsIHdvdWxkIHNlbmQgRVRhZ3MgaW4gYWRkaXRpb24gdG8KICAgICBzZW5kaW5nIExhc3QtTW9kaWZpZWRzLiAgVGhpcyBpcyBpbmNvcnJlY3QgSFRUUC8xLjEgYmVoYXZpb3VyLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTEzMwoKICAqKSBTRUNVUklUWTogV2hlbiBhIGNsaWVudCBjb25uZWN0cyB0byBhIHBhcnRpY3VsYXIgcG9ydC9hZGRyLCBhbmQKICAgICBnaXZlcyBhIEhvc3Q6IGhlYWRlciBlbnN1cmUgdGhhdCB0aGUgdmlydHVhbCBob3N0IHJlcXVlc3RlZCBjYW4KICAgICBhY3R1YWxseSBiZSByZWFjaGVkIHZpYSB0aGF0IHBvcnQvYWRkci4gIFtFZCBLb3J0aG9mIDxlZCBvcmdhbmljLmNvbT5dCgogICopIFN1cHBvcnQgdmlydHVhbCBob3N0cyB3aXRoIHdpbGRjYXJkIHBvcnQgYW5kL29yIG11bHRpcGxlIHBvcnRzCiAgICAgcHJvcGVybHkuICBbRWQgS29ydGhvZiA8ZWQgb3JnYW5pYy5jb20+XQoKICAqKSBGaXhlZCBzb21lIGNhc2Utc2Vuc2l0aXZpdHkgaXNzdWVzIGFjY29yZGluZyB0byBSRkMyMDY4LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgU2V0IHItPmFsbG93ZWQgcHJvcGVybHkgaW4gbW9kX2FzaXMuYywgbW9kX2Rpci5jLCBtb2RfaW5mby5jLAogICAgIGFuZCBtb2RfaW5jbHVkZS5jLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBWYXJpYWJsZSAnY3dkJyB3YXMgYmVpbmcgdXNlZCBwb2ludGxlc3NseSBiZWZvcmUgYmVpbmcgc2V0LgogICAgIFtLZW4gQ29hcl0gUFIjMTczOAoKICAqKSBTSUdVUkcgZG9lc24ndCBleGlzdCBvbiBhbGwgcGxhdGZvcm1zLgogICAgIFtNYXJrIEFuZHJldyBIZWlucmljaCA8aGVpbnJpY2ggdGluZGVyYm94LlN0YW5mb3JkLkVEVT5dCgogICopIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIFBPU1QsIG9yIG90aGVyIG9wZXJhdGlvbiB3aXRoIGEKICAgICByZXF1ZXN0IGJvZHksIHRoZSBib2R5IGhhcyB0byBiZSByZWFkIGZyb20gdGhlIG5ldCBiZWZvcmUgYWxsb3dpbmcKICAgICBhIGtlZXBhbGl2ZSBzZXNzaW9uIHRvIGNvbnRpbnVlLiAgW1JveSBGaWVsZGluZ10gUFIjMTM5OQoKICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBpbiBmY250bCgpIGxvY2tpbmcgc3VnZ2VzdCB0aGUgdXNlciBsb29rIHVwCiAgICAgdGhlIGRvY3MgZm9yIExvY2tGaWxlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSB0YWJsZV9zZXQoKSBhbmQgdGFibGVfdW5zZXQoKSBkaWQgbm90IGRlYWwgY29ycmVjdGx5IHdpdGgKICAgICBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBrZXkuIFtTdGVwaGVuIFNjaGVjawogICAgIDxzc2NoZWNrIGluZm9uZXgubmV0PiwgQmVuIExhdXJpZV0gUFIjMTYwNAoKICAqKSBzZW5kX2ZkX2xlbmd0aCgpIGRpZCBub3QgY2FsY3VsYXRlIHRvdGFsX2J5dGVzX3NlbnQgcHJvcGVybHkgaW4gZXJyb3IKICAgICBjYXNlcy4gIFtCZW4gUmVzZXIgPGJyZXNlciByZWdub3cuY29tPl0gUFIjMTM2NgoKICAqKSByLT5jb25uZWN0aW9uLT51c2VyIHdhcyBhbGxvY2F0ZWQgaW4gdGhlIHdyb25nIHBvb2wgY2F1c2luZyBjb3JydXB0aW9uCiAgICAgaW4gc29tZSBjYXNlcyB3aGVuIHVzZWQgd2l0aCBtb2RfY2Vybl9tZXRhLiAgW0RlYW4gR2F1ZGV0XSBQUiMxNTAwCgogICopIG1vZF9wcm94eSB3YXMgc2VuZGluZyBIVFRQLzEuMSByZXNwb25zZXMgdG8gZnRwIHJlcXVlc3RzIGJ5IG1pc3Rha2UuCiAgICAgQWxzbyByZW1vdmVkIHRoZSBhdXRvLWdlbmVyYXRlZCBsaW5rIHRvIHd3dy5hcGFjaGUub3JnIHRoYXQgd2FzIHRoZQogICAgIHNvdXJjZSBvZiBzbyBtYW55IG1pc2RpcmVjdGVkIGJ1ZyByZXBvcnRzLiAgW1JveSBGaWVsZGluZywgTWFyYyBTbGVta29dCgogICopIE11bHRpcGxlICJjbG9zZSIgdG9rZW5zIG1heSBoYXZlIGJlZW4gc2V0IGluIHRoZSAiQ29ubmVjdGlvbiIKICAgICBoZWFkZXIsIG5vdCBhbiBlcnJvciwgYnV0IGEgd2FzdGUuCiAgICAgWzxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dIFBSIzE2ODMKCiAgKikgImJhc2ljIiBhbmQgImRpZ2VzdCIgYXV0aCB0b2tlbnMgc2hvdWxkIGJlIHRlc3RlZCBjYXNlLWluc2Vuc2l0aXZlLgogICAgIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XSBQUiMxNTk5LCBQUiMxNjY2CgogICopIEl0IGFwcGVhcnMgdGhlICIyNTd0aCBieXRlIiBidWcgKHNlZQogICAgIGh0ZG9jcy9tYW51YWwvbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCMyNTd0aC1ieXRlKSBjYW4gaGFwcGVuCiAgICAgYXQgdGhlIDI1NnRoIGJ5dGUgYXMgd2VsbC4gIEZpeGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfcmV3cml0ZSB3b3VsZCBub3QgaGFuZGxlICUzZiBwcm9wZXJseSBpbiBzb21lIHNpdHVhdGlvbnMuCiAgICAgW1JhbGYgRW5nZWxzY2hhbGxdCgogICopIEFwYWNoZSBjb3VsZCBnZW5lcmF0ZSBpbXByb3Blcmx5IGNodW5rZWQgSFRUUC8xLjEgcmVzcG9uc2VzIHdoZW4KICAgICB0aGUgYnB1dGMoKSBvciBycHV0YygpIGZ1bmN0aW9ucyB3ZXJlIHVzZWQgYnkgbW9kdWxlcyAoc3VjaCBhcwogICAgIG1vZF9pbmNsdWRlKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgI2lmZGVmIHdyYXAgYSBmZXcgI2RlZmluZXMgaW4gaHR0cGQuaCB0byBtYWtlIGxpZmUgZWFzaWVyIG9uCiAgICAgc29tZSBwb3J0cy4gIFtSYWxmIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggTVBFIGNvbXBpbGF0aW9uIGVycm9yIGluIG1vZF91c2VydHJhY2suYy4gIFtNYXJrIEJpeGJ5XQoKICAqKSBRdW90ZSBDQz0nJChDQyknIHRvIGltcHJvdmUgcmVjdXJzZSBtYWtlIGNhbGxzLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBdm9pZCBCX0VSUk9SIHJlZGVjbGFyYXRpb24gb24gc3lzdnI0IHN5c3RlbXMuICBbTWFydGluIEtyYWVtZXJdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi41CgogICopIFNFQ1VSSVRZOiBGaXggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gbG9ncmVzb2x2ZS4gIFRoaXMgaXMKICAgICBvbmx5IGFuIGlzc3VlIG9uIHN5c3RlbXMgd2l0aG91dCBhIE1BWEROQU1FIGRlZmluZSBvciB3aGVyZSAKICAgICB0aGUgcmVzb2x2ZXIgcmV0dXJucyBkb21haW4gbmFtZXMgbG9uZ2VyIHRoYW4gTUFYRE5BTUUuICBbTWFyYyBTbGVta29dCgogICopIEZpeCBhbiBpbXByb3BlciBsZW5ndGggaW4gYW4gYXBfc25wcmludGYgY2FsbCBpbiBwcm94eV9kYXRlX2Nhbm9uKCkuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBGaXggY29yZSBkdW1wIGluIHRoZSBmdHAgcHJveHkgd2hlbiByZWFkaW5nIGluY29ycmVjdGx5IGZvcm1hdHRlZAogICAgIGRpcmVjdG9yeSBsaXN0aW5ncy4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEZpeCBwb3NzaWJsZSBtaW5vciBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHByb3h5IGNhY2hlLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVsaW1pbmF0ZSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gY2ZnX2dldGxpbmUsIHdoaWNoCiAgICAgaXMgdXNlZCB0byByZWFkIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgc3VjaCBhcyBodGFjY2VzcyBhbmQgCiAgICAgaHRwYXNzd2QgZmlsZXMuICBbTWFyYyBTbGVta29dCgogICopIFNFQ1VSSVRZOiBFbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHJldHVybmVkIGJ5IGh0X3RpbWUgaXMgYWx3YXlzCiAgICAgcHJvcGVybHkgbnVsbCB0ZXJtaW5hdGVkLiAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogR2VuZXJhbCBtb2RfaW5jbHVkZSBjbGVhbnVwLCBpbmNsdWRpbmcgZml4aW5nIHNldmVyYWwKICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzIGFuZCBhIHBvc3NpYmxlIGluZmluaXRlIGxvb3AuICBUaGlzIGNsZWFudXAKICAgICB3YXMgZG9uZSBhZ2FpbnN0IDEuMyBjb2RlIGFuZCB0aGVuIGJhY2twb3J0ZWQgdG8gMS4yLCB0aGUgcmVzdWx0CiAgICAgaXMgYSBsYXJnZSBkaWZmZXJlbmNlIChkdWUgdG8gaW5kZW50YXRpb24gY2xlYW51cCBpbiAxLjMgY29kZSkuCiAgICAgVXNlcnMgaW50ZXJlc3RlZCBpbiBzZWVpbmcgYSBzbWFsbGVyIHNldCBvZiByZWxldmFudCBkaWZmZXJlbmNlcwogICAgIHNob3VsZCBjb25zaWRlciBjb21wYXJpbmcgYWdhaW5zdCBzcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5jbHVkZS5jCiAgICAgZnJvbSB0aGUgMS4zYjMgcmVsZWFzZS4gIE5vbi1pbmRlbnRhdGlvbiBjaGFuZ2VzIHRvIG1vZF9pbmNsdWRlCiAgICAgYmV0d2VlbiAxLjIgYW5kIDEuMyB3ZXJlIG1pbmltYWwuICBbRGVhbiBHYXVkZXQsIE1hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogTnVtZXJvdXMgY2hhbmdlcyB0byBtb2RfaW1hcCBpbiBhIGdlbmVyYWwgY2xlYW51cAogICAgIGluY2x1ZGluZyBmaXhpbmcgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cuICBUaGlzIGNsZWFudXAgYWxzbwogICAgIHdhcyBkb25lIHdpdGggMS4zIGNvZGUgYXMgYSBiYXNpcywgc2VlIHRoZSBwcmV2aW91cyBub3RlCiAgICAgYWJvdXQgbW9kX2luY2x1ZGUuICBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiBJZiBhIGh0YWNjZXNzIGZpbGUgY2FuIG5vdCBiZSByZWFkIGR1ZSB0byBiYWQgCiAgICAgcGVybWlzc2lvbnMsIGRlbnkgYWNjZXNzIHRvIHRoZSBkaXJlY3Rvcnkgd2l0aCBhIEhUVFBfRk9SQklEREVOLiAgCiAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW9yIHdhcyB0byBpZ25vcmUgdGhlIGh0YWNjZXNzIGZpbGUgaWYgaXQgY291bGQgbm90CiAgICAgYmUgcmVhZC4gIFRoaXMgY2hhbmdlIG1heSBtYWtlIHNvbWUgc2V0dXBzIHdpdGggdW5yZWFkYWJsZQogICAgIGh0YWNjZXNzIGZpbGVzIHN0b3Agd29ya2luZy4gIFBSIzgxNyAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogbm8yc2xhc2goKSB3YXMgTyhuXjIpIGluIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0LiAgCiAgICAgTWFrZSBpdCBPKG4pLiAgVGhpcyBpbmVmZmljaWVuY3kgY291bGQgYmUgdXNlZCB0byBtb3VudCBhIGRlbmlhbCAKICAgICBvZiBzZXJ2aWNlIGF0dGFjayBhZ2FpbnN0IHRoZSBBcGFjaGUgc2VydmVyLiAgVGhhbmtzIHRvIAogICAgIE1pY2hhbCBaYWxld3NraSA8bGNhbXR1ZiBib3NzLnN0YXN6aWMud2F3LnBsPiBmb3IgcmVwb3J0aW5nCiAgICAgdGhpcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX2luY2x1ZGUgdXNlZCB1bmluaXRpYWxpemVkIGRhdGEgZm9yIHNvbWUgdXNlcyBvZiAmJiBhbmQgfHwuCiAgICAgW0JyaWFuIFNsZXNpbnNreSA8YnNsZXNpbnMgd2lyZWQuY29tPl0gUFIjMTEzOQoKICAqKSBtb2RfaW1hcCBzaG91bGQgZGVjbGluZSBhbGwgbm9uLUdFVCBtZXRob2RzLgogICAgIFtKYXkgQmxvb2R3b3J0aCA8amF5IHBhdGh3YXlzLnNkZS5zdGF0ZS5zYy51cz5dCgogICopIHN1ZXhlYy5jIHdvdWxkbid0IGJ1aWxkIHdpdGhvdXQgLURMT0dfRVhFQy4gW0phc29uIEEuIERvdXJdCgogICopIG1vZF91c2VyZGlyIHdhcyBtb2RpZnlpbmcgci0+ZmluZm8gaW4gY2FzZXMgd2hlcmUgaXQgd2Fzbid0IHNldHRpbmcKICAgICByLT5maWxlbmFtZS4gIFNpbmNlIHRob3NlIHR3byBhcmUgbWVhbnQgdG8gYmUgaW4gc3luYyB3aXRoIGVhY2ggb3RoZXIKICAgICB0aGlzIGlzIGEgYnVnLiAgWyJQYXVsIEIuIEhlbnNvbiIgPGhlbnNvbiBpbnRyYW5ldC5jc3Vwb21vbmEuZWR1Pl0KCiAgKikgbW9kX2luY2x1ZGUgZGlkIG5vdCBwcm9wZXJseSBoYW5kbGUgYWxsIHBvc3NpYmxlIHJlZGlyZWN0cyBmcm9tIHN1Yi0KICAgICByZXF1ZXN0cy4gIFtLZW4gQ29hcl0KCiAgKikgSW5ldGQgbW9kZSAod2hpY2ggaXMgYnVnZ3kpIHVzZXMgdGltZW91dHMgd2l0aG91dCBoYXZpbmcgc2V0dXAgdGhlCiAgICAgam1wYnVmZmVyLiBbRGVhbiBHYXVkZXRdIFBSIzEwNjQKCiAgKikgV29yayBhcm91bmQgcHJvYmxlbSB1bmRlciBMaW51eCB3aGVyZSBhIGNoaWxkIHdpbGwgc3RhcnQgbG9vcGluZwogICAgIHJlcG9ydGluZyBhIHNlbGVjdCBlcnJvciBvdmVyIGFuZCBvdmVyLgogICAgIFtSaWNrIEZyYW5jaHVrIDxyaWNrZiB0cmFuc3BlY3QubmV0Pl0gUFIjMTEwNwoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuNAoKICAqKSBUaGUgUHJveHlSZW1vdGUgY2hhbmdlIGluIDEuMi4zIGludHJvZHVjZWQgYSBidWcgcmVzdWx0aW5nIGluIHRoZSBwcm94eQogICAgIGFsd2F5cyBtYWtpbmcgcmVxdWVzdHMgd2l0aCB0aGUgZnVsbC1VUkkgaW5zdGVhZCBvZiBqdXN0IHRoZSBVUkkgcGF0aC4KICAgICBbTWFyYyBTbGVta28sIFJveSBGaWVsZGluZ10KCiAgKikgQWRkIC1sbSBmb3IgQUlYIHZlcnNpb25zID49IDQuMiB0byBhbGxvdyBBcGFjaGUgdG8gbGluayBwcm9wZXJseQogICAgIG9uIHRoaXMgcGxhdGZvcm0uICBbTWFyYyBTbGVta29dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi4zCgogICopIFRoZSByZXF1ZXN0IHRvIGEgcmVtb3RlIHByb3h5IHdhcyBtYW5nbGVkIGlmIGl0IHdhcyBnZW5lcmF0ZWQgYXMgdGhlCiAgICAgcmVzdWx0IG9mIGEgUHJveHlQYXNzIGRpcmVjdGl2ZS4gVVJMIHNjaGVtZXMgb3RoZXIgdGhhbiBodHRwOi8vIHdlcmUgbm90CiAgICAgc3VwcG9ydGVkIHdoZW4gUHJveHlSZW1vdGUgd2FzIHVzZWQuIFBSIzI2MCwgUFIjNjU2LCBQUiM2OTksIFBSIzcxMywKICAgICBQUiM4MTIgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgRml4ZWQgcHJveHktcGFzcy10aHJvdWdoIGZlYXR1cmUgb2YgbW9kX3Jld3JpdGU7IEFkZGVkIGVycm9yIGxvZ2dpbmcKICAgICBpbmZvcm1hdGlvbiBmb3IgY2FzZSB3aGVyZSBwcm94eSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZS4gW01hcmMgU2xlbWtvXQoKICAqKSBGb3JjZSBwcm94eSB0byBhbHdheXMgcmVzcG9uZCBhcyBIVFRQLzEuMCwgd2hpY2ggaXQgd2FzIGZhaWxpbmcgdG8KICAgICBkbyBmb3IgZXJyb3JzIGFuZCBjYWNoZWQgcmVzcG9uc2VzLiAgW1JveSBGaWVsZGluZ10KCiAgKikgUE9SVDogSW1wcm92ZWQgc3VwcG9ydCBmb3IgQ29udmV4T1MgMTEuICBbSmVmZiBWZW50ZXJzXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuMiBbbm90IHJlbGVhc2VkXQoKICAqKSBGaXhlZCBhbm90aGVyIGxvbmctc3RhbmRpbmcgYnVnIGluIHN1Yl9yZXFfbG9va3VwX2ZpbGUgd2hlcmUgaXQgd291bGQKICAgICBoYXBwaWx5IHNraXAgcGFzdCBhY2Nlc3MgY2hlY2tzIG9uIHN1YmRpcmVjdG9yaWVzIGxvb2tlZCB1cCB3aXRoIHJlbGF0aXZlCiAgICAgcGF0aHMuICAoSXQncyB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9uZWdvdGlhdGlvbiwgYW5kIG1vZF9pbmNsdWRlLikKICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFkZCBsb2NrZmlsZSBuYW1lIHRvIGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBvdXQgd2hlbgogICAgIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCBpcyBkZWZpbmVkLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgRW5oYW5jZWQgdGhlIGNodW5raW5nIGFuZCBlcnJvciBoYW5kbGluZyBpbnNpZGUgdGhlIGJ1ZmZlciBmdW5jdGlvbnMuCiAgICAgW0RlYW4gR2F1ZGV0LCBSb3kgRmllbGRpbmddCgogICopIFdoZW4gbWVyZ2luZyB0aGUgbWFpbiBzZXJ2ZXIncyA8RGlyZWN0b3J5PiBhbmQgPExvY2F0aW9uPiBzZWN0aW9ucyBpbnRvCiAgICAgYSB2aG9zdCwgcHV0IHRoZSBtYWluIHNlcnZlcidzIGZpcnN0IGFuZCB0aGUgdmhvc3QncyBzZWNvbmQuICBPdGhlcndpc2UKICAgICB0aGUgdmhvc3QgY2FuJ3Qgb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyLiAgW0RlYW4gR2F1ZGV0XSBQUiM3MTcKCiAgKikgVGhlIDxEaXJlY3Rvcnk+IGNvZGUgd291bGQgbWVyZ2UgYW5kIHJlLW1lcmdlIHRoZSBzYW1lIHNlY3Rpb24gYWZ0ZXIKICAgICBhIG1hdGNoIHdhcyBmb3VuZCwgcG9zc2libHkgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHNvbWUgbW9kdWxlcy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIGFuIGluZmluaXRlIGxvb3AgaW4gbW9kX2ltYXAgZm9yIHJlZmVyZW5jZXMgYWJvdmUgdGhlIHNlcnZlciByb290LgogICAgIFtEZWFuIEdhdWRldF0gUFIjNzQ4CgogICopIG1vZF9pbmNsdWRlIGNsZWFudXAgc2hvd2VkIHRoYXQgaGFuZGxlX2Vsc2Ugd2FzIGJlaW5nIHVzZWQgdG8gaGFuZGxlCiAgICAgZW5kaWYuICBJdCBkaWRuJ3QgY2F1c2UgcHJvYmxlbXMsIGJ1dCBpdCB3YXMgY2xlYW5lZCB1cCB0b28uCiAgICAgW0hvd2FyZCBGZWFyXQoKICAqKSBMYXN0IG9mZmljaWFsIHN5bmNocm9uaXphdGlvbiBvZiBtb2RfcmV3cml0ZSB3aXRoIGF1dGhvciB2ZXJzaW9uIChiZWNhdXNlCiAgICAgbW9kX3Jld3JpdGUgaXMgbm93IGRpcmVjdGx5IGRldmVsb3BlZCBieSB0aGUgYXV0aG9yIGF0IHRoZSBBcGFjaGUgR3JvdXApOgogICAgIG8gYWRkZWQgZGlmZiBiZXR3ZWVuIG1vZF9yZXdyaXRlIDMuMC42KyBhbmQgMy4wLjkKICAgICAgIG1pbnVzIFdJTjMyL05UIHN0dWZmLCBidXQgcGx1cyBjb3B5cmlnaHQgcmVtb3ZlbWVudC4KICAgICAgIEluIGRldGFpbDoKICAgICAgIC0gd29ya2Fyb3VuZCBmb3IgZGV0ZWN0aW5nIGluZmluaXRlIHJld3JpdGluZyBsb29wcwogICAgICAgLSBmaXhlZCBzZXR0aW5nIG9mIGVudiB2YXJzIHdoZW4gIi0iIGlzIHVzZWQgYXMgc3Vic3Qgc3RyaW5nCiAgICAgICAtIGZpeGVkIGZvcmNlZCByZXNwb25zZSBjb2RlIG9uIHJlZGlyZWN0cyAoUFIjNzc3KQogICAgICAgLSBmaXhlZCBjYXNlcyB3aGVyZSByLT5hcmdzIGlzICIiCiAgICAgICAtIGtsdWRnZSB0byBkaXNhYmxlIGxvY2tpbmcgb24gcGlwZXMgdW5kZXIgYnJhaW5kZWFkIFN1bk9TCiAgICAgICAtIGZpeCBmb3IgcmV3cml0ZWxvZyBpbiBjYXNlcyB3aGVyZSByZW1vdGUgaG9zdG5hbWUgaXMgdW5rbm93bgogICAgICAgLSBmaXhlZCB0b3RhbGx5IGRhbWFnZWQgcmVxdWVzdF9yZWMgd2Fsay1iYWNrIGxvb3AKICAgICBvIHJlbW92ZSBzdGF0aWMgZnJvbSBsb2NhbCBkYXRhIGFuZCBhZGQgc3RhdGljIHRvIGdsb2JhbCBvbmVzLgogICAgIG8gcmVwbGFjZWQgdWdseSBwcm94eSBmaW5kaW5nIHN0dWZmIGJ5IHNpbXBsZQogICAgICAgZmluZF9saW5rZWRfbW9kdWxlKCJtb2RfcHJveHkiKSBjYWxsLgogICAgIG8gYWRkZWQgbWlzc2luZyBuZWdhdGlvbiBjaGFyIG9uIHJld3JpdGVsb2coKQogICAgIG8gZml4ZWQgYSBmZXcgY29tbWVudCB0eXBvcwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBbm9ueW1vdXNfTG9nRW1haWwgd2FzIGxvZ2dpbmcgb24gZWFjaCBzdWJyZXF1ZXN0LgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDIxLCBQUiM4NjgKCiAgKikgImZvcmNlLXJlc3BvbnNlLTEuMCIgbm93IG9ubHkgYXBwbGllcyB0byByZXF1ZXN0cyB3aGljaCBhcmUgSFRUUC8xLjAgdG8KICAgICBiZWdpbiB3aXRoLiAgIm5va2VlcGFsaXZlIiBub3cgd29ya3MgZm9yIEhUVFAvMS4xIGNsaWVudHMuICBBZGRlZAogICAgICJkb3duZ3JhZGUtMS4wIiB3aGljaCBjYXVzZXMgQXBhY2hlIHRvIHByZXRlbmQgaXQgcmVjZWl2ZWQgYSAxLjAuCiAgICAgQWRkaXRpb25hbGx5IG1vZF9icm93c2VyIG5vdyB0cmlnZ2VycyBkdXJpbmcgdHJhbnNsYXRlX25hbWUgdG8gd29ya2Fyb3VuZAogICAgIGEgZGVmaWNpZW5jeSBpbiB0aGUgaGVhZGVyX3BhcnNlIHBoYXNlLgogICAgIFtEZWFuIEdhdWRldF0gUFIjODc1CgogICopIGdldF9jbGllbnRfYmxvY2soKSByZXR1cm5zIHdyb25nIGxlbmd0aCBpZiBwb2xpY3kgaXMgCiAgICAgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTksuCiAgICAgW0tlbmljaGkgSG9yaSA8a2VuIGQyLmJzMS5mYy5uZWMuY28uanA+XSBQUiM4MTUKCiAgKikgUHJvcGVybHkgdHJlYXQgPGZpbGVzPiBjb250YWluZXIgbGlrZSBvdGhlciBjb250YWluZXJzIGluIG1vZF9pbmZvLgogICAgIFtNYXJjIFNsZW1rb10gUFIjODQ4CgogICopIFRoZSBwcm94eSBkaWRuJ3QgdHJlYXQgdGhlICJIb3N0OiIga2V5d29yZCBvZiB0aGUgaG9zdCBoZWFkZXIgYXMgY2FzZS0KICAgICBpbnNlbnNpdGl2ZS4gIFRoZSBwcm94eSB3b3VsZCBjb3JydXB0IHRoZSBmaXJzdCBsaW5lIG9mIGEgcmVzcG9uc2UgZnJvbQogICAgIGFuIEhUVFAvMC45IHNlcnZlci4gIFtLZW5pY2hpIEhvcmkgPGtlbiBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODEzLDgxNAoKICAqKSBtb2RfaW5jbHVkZSB3b3VsZCBsb2cgc29tZSBib2d1cyB2YWx1ZXMgb2NjYXNpb25hbGx5LgogICAgIFtTa2lwIE1vbnRhbmFybyA8c2tpcCBjYWxlbmRhci5jb20+LCBNYXJjIFNsZW1rb10gUFIjNzk3CgogICopIFBPUlQ6IFRoZSBzbGFjayBmZCBjaGFuZ2VzIGluIDEuMi4xIGludHJvZHVjZWQgYSBwcm9ibGVtIHdpdGggU0lHSFVQCiAgICAgdW5kZXIgU29sYXJpcyAyLnggKHVwIHRocm91Z2ggMi41LjEpLiAgSXQgaGFzIGJlZW4gZml4ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM4MzIKCiAgKikgQVBJOiBJbiBIVFRQLzEuMSwgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IG1lc3NhZ2UgY29udGFpbnMgYSBib2R5CiAgICAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHJlcXVlc3QgbWV0aG9kIGFuZCBiYXNlZCBzb2xlbHkgb24gdGhlIHByZXNlbmNlCiAgICAgb2YgYSBDb250ZW50LUxlbmd0aCBvciBUcmFuc2Zlci1FbmNvZGluZy4gIFRoZXJlZm9yZSwgb3VyIGRlZmF1bHQKICAgICBoYW5kbGVycyBuZWVkIHRvIGJlIHByZXBhcmVkIHRvIHJlYWQgYSBib2R5IGV2ZW4gaWYgdGhleSBkb24ndCBrbm93CiAgICAgd2hhdCB0byBkbyB3aXRoIGl0OyBvdGhlcndpc2UsIHRoZSBib2R5IHdvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUKICAgICBuZXh0IHJlcXVlc3Qgb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uICBkaXNjYXJkX3JlcXVlc3RfYm9keSgpCiAgICAgaGFzIGJlZW4gYWRkZWQgdG8gdGFrZSBjYXJlIG9mIHRoYXQuICBbUm95IEZpZWxkaW5nXSBQUiMzNzgKCiAgKikgQVBJOiBTeW1ib2wgQVBBQ0hFX1JFTEVBU0UgcHJvdmlkZXMgYSBudW1lcmljIGZvcm0gb2YgdGhlIEFwYWNoZQogICAgIHJlbGVhc2UgdmVyc2lvbiBudW1iZXIsIHN1Y2ggdGhhdCBpdCBhbHdheXMgaW5jcmVhc2VzIGFsb25nIHRoZQogICAgIHNhbWUgbGluZXMgYXMgb3VyIHNvdXJjZSBjb2RlIGJyYW5jaGluZy4gIFtSb3kgRmllbGRpbmddCgogICopIE1pbm9yIG92ZXJzaWdodCBvbiBtdWx0aXBsZSB2YXJpYW50cyBmaXhlZC4gIFtQYXVsIFN1dHRvbl0gUFIjOTQKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjEKCiAgKikgU0VDVVJJVFk6IERvbid0IHNlcnZlIGZpbGUgc3lzdGVtIG9iamVjdHMgdW5sZXNzIHRoZXkgYXJlIHBsYWluIGZpbGVzLAogICAgIHN5bWxpbmtzLCBvciBkaXJlY3Rvcmllcy4gIFRoaXMgcHJldmVudHMgbG9jYWwgdXNlcnMgZnJvbSB1c2luZyBwaXBlcwogICAgIG9yIG5hbWVkIHNvY2tldHMgdG8gaW52b2tlIHByb2dyYW1zIGZvciBhbiBleHRyZW1lbHkgY3J1ZGUgZm9ybSBvZgogICAgIENHSS4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEhlYWRlck5hbWUgYW5kIFJlYWRtZU5hbWUgd2VyZSBzZXR0YWJsZSBpbiAuaHRhY2Nlc3MgYW5kCiAgICAgY291bGQgY29udGFpbiAiLi4vIiBhbGxvd2luZyBhIGxvY2FsIHVzZXIgdG8gInB1Ymxpc2giIGFueSBmaWxlIG9uCiAgICAgdGhlIHN5c3RlbS4gIE5vIHNsYXNoZXMgYXJlIGFsbG93ZWQgbm93LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogSXQgd2FzIHBvc3NpYmxlIHRvIHZpb2xhdGUgdGhlIHN5bWxpbmsgT3B0aW9ucyB1c2luZyBtb2RfZGlyCiAgICAgKGhlYWRlcnMsIHJlYWRtZXMsIHRpdGxlcyksIG1vZF9uZWdvdGlhdGlvbiAodHlwZSBtYXBzKSwgb3IKICAgICBtb2RfY2Vybl9tZXRhIChtZXRhIGZpbGVzKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEFwYWNoZSB3aWxsIHJlZnVzZSB0byBydW4gYXMgIlVzZXIgcm9vdCIgdW5sZXNzCiAgICAgQklHX1NFQ1VSSVRZX0hPTEUgaXMgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUuICBbRGVhbiBHYXVkZXRdCgogICopIENPTkZJRzogSWYgYSBzeW1saW5rIHBvaW50ZWQgdG8gYSBkaXJlY3RvcnkgdGhlbiBpdCB3b3VsZCBiZSBkaXNhbGxvd2VkCiAgICAgaWYgaXQgY29udGFpbmVkIGEgLmh0YWNjZXNzIGRpc2FsbG93aW5nIHN5bWxpbmtzLiAgVGhpcyBpcyBjb250cmFyeQogICAgIHRvIHRoZSBydWxlIHRoYXQgc3ltbGluayBwZXJtaXNzaW9ucyBhcmUgdGVzdGVkIHdpdGggdGhlIHN5bWxpbmsKICAgICBvcHRpb25zIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAgW0RlYW4gR2F1ZGV0XSBQUiMzNTMKCiAgKikgQ09ORklHOiBUaGUgTG9ja0ZpbGUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIHBsYWNlIHRoZSBzZXJpYWxpemluZwogICAgIGxvY2tmaWxlIGluIGFueSBsb2NhdGlvbi4gIEl0IHByZXZpb3VzbHkgZGVmYXVsdGVkIHRvIC91c3IvdG1wL2h0bG9jay4KICAgICBbU29tZWhvdyBpdCB0b29rIGZvdXIgb2YgdXM6IFJhbmR5IFRlcmJ1c2gsIEppbSBKYWdpZWxza2ksIERlYW4gR2F1ZGV0LAogICAgIE1hcmMgU2xlbWtvXQoKICAqKSBSZXF1ZXN0IHByb2Nlc3Npbmcgbm93IHJldGFpbnMgc3RhdGUgb2Ygd2hldGhlciBvciBub3QgdGhlIHJlcXVlc3QKICAgICBib2R5IGhhcyBiZWVuIHJlYWQsIHNvIHRoYXQgaW50ZXJuYWwgcmVkaXJlY3RzIGFuZCBzdWJyZXF1ZXN0cyB3aWxsCiAgICAgbm90IHRyeSB0byByZWFkIGl0IHR3aWNlIChhbmQgYmxvY2spLiBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgYSBwbGFjZWhvbGRlciBpbiBtb2R1bGVzL01ha2VmaWxlIHRvIGF2b2lkIGVycm9ycyB3aXRoIGNlcnRhaW4KICAgICBtYWtlcy4gW01hcmMgU2xlbWtvXQoKICAqKSBRVUVSWV9TVFJJTkcgd2FzIHVuZXNjYXBlZCBpbiBtb2RfaW5jbHVkZSwgaXQgc2hvdWxkbid0IGJlLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNjQ0CgogICopIG1vZF9pbmNsdWRlIHdhcyBub3QgcHJvcGVybHkgY2hhbmdpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgogICAgIFtNYXJjIFNsZW1rb10gUFIjNzQyCgogICopIEF0dGVtcHQgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdGhhdCBkbyBub3QKICAgICBoYW5kbGUgaGlnaCBudW1iZXJlZCBkZXNjcmlwdG9ycyAoZXhhbXBsZXMgaW5jbHVkZSBiaW5kLCBhbmQKICAgICBzb2xhcmlzIGxpYmMpLiAgT24gYWxsIHN5c3RlbXMgYXBhY2hlIGF0dGVtcHRzIHRvIGtlZXAgYWxsIHBlcm1hbmVudAogICAgIGRlc2NyaXB0b3JzIGFib3ZlIDE1IChjYWxsZWQgdGhlIGxvdyBzbGFjayBsaW5lKS4gIFNvbGFyaXMgdXNlcnMKICAgICBjYW4gYWxzbyBiZW5lZml0IGZyb20gYWRkaW5nIC1ESElHSF9TTEFDS19MSU5FPTI1NiB0byBFWFRSQV9DRkxBR1MKICAgICB3aGljaCBrZWVwcyBhbGwgbm9uLUZJTEUgKiBkZXNjcmlwdG9ycyBhYm92ZSAyNTUuICBPbiBhbGwgc3lzdGVtcwogICAgIHRoaXMgc2hvdWxkIG1ha2Ugc3VwcG9ydGluZyBsYXJnZSBudW1iZXJzIG9mIHZob3N0cyB3aXRoIG1hbnkgb3BlbgogICAgIGxvZyBmaWxlcyBtb3JlIGZlYXNpYmxlLiAgSWYgdGhpcyBjYXVzZXMgdHJvdWJsZSBwbGVhc2UgcmVwb3J0IGl0LAogICAgIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdvcmthcm91bmQgYnkgYWRkaW5nIC1ETk9fU0xBQ0sgdG8gRVhUUkFfQ0ZMQUdTLgogICAgIFtEZWFuIEdhdWRldF0gdmFyaW91cyBQUnMKCiAgKikgUmVsYXRlZCB0byB0aGUgbGFzdCBlbnRyeSwgbmV0d29yayBzb2NrZXRzIGFyZSBub3cgb3BlbmVkIGJlZm9yZQogICAgIGxvZyBmaWxlcyBhcmUgb3BlbmVkLiAgVGhlIG9ubHkga25vd24gY2FzZSB3aGVyZSB0aGlzIGNhbiBjYXVzZQogICAgIHByb2JsZW1zIGlzIHVuZGVyIFNvbGFyaXMgd2l0aCBtYW55IHZpcnR1YWxob3N0cyBhbmQgbWFueSBMaXN0ZW4KICAgICBkaXJlY3RpdmVzLiAgQnV0IHVzaW5nIC1ESElHSF9TTEFDS19MSU5FPTI1NiBkZXNjcmliZWQgYWJvdmUgd2lsbAogICAgIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbS4gIFtEZWFuIEdhdWRldF0KCiAgKikgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUIGlzIG5vdyBkZWZhdWx0IGZvciBGcmVlQlNELCBBL1VYLCBhbmQKICAgICBTdW5PUyA0LgoKICAqKSBJbXByb3ZlZCB1bml4IGVycm9yIHJlc3BvbnNlIGxvZ2dpbmcuICBbTWFyYyBTbGVta29dCgogICopIFVwZGF0ZSBtb2RfcmV3cml0ZSBmcm9tIDMuMC41IHRvIDMuMC42LiAgTmV3IHJ1bGVmbGFnCiAgICAgUVNBPXF1ZXJ5X3N0cmluZ19hcHBlbmQuICBBbHNvIGZpeGVkIGEgbmFzdHkgYnVnIGluIHBlci1kaXIgY29udGV4dDoKICAgICB3aGVuIGEgVVJMIGh0dHA6Ly8uLi4gd2FzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIHNwZWNpYWwKICAgICByZWRpcmVjdCBmbGFnLCBlLmcuIFI9cGVybWFuZW50LCB0aGUgcGVybWFuZW50IHN0YXR1cyB3YXMgbG9zdC4KICAgICBbUm9uYWxkIFRzY2hhbGFlciA8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJZiBhbiBvYmplY3QgaGFzIG11bHRpcGxlIHZhcmlhbnRzIHRoYXQgYXJlIG90aGVyd2lzZSBlcXVhbCBBcGFjaGUKICAgICB3b3VsZCBwcmVmZXIgdGhlIGxhc3QgbGlzdGVkIHZhcmlhbnQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0LgogICAgIFtQYXVsIFN1dHRvbl0gUFIjOTQKCiAgKikgIm1ha2UgY2xlYW4iIGF0IHRoZSB0b3AgbGV2ZWwgbm93IHJlbW92ZXMgKi5vLiAgW0RlYW4gR2F1ZGV0XSBQUiM3NTIKCiAgKikgbW9kX3N0YXR1cyBkdW1wcyBjb3JlIGluIGluZXRkIG1vZGUuICBbTWFyYyBTbGVta28gYW5kIFJveSBGaWVsZGluZ10KICAgICBQUiM1NjYKCiAgKikgcHJlZ3N1YiBoYWQgYW4gb2ZmLWJ5LTEgaW4gaXRzIGVycm9yIGNoZWNraW5nIGNvZGUuIFtBbGV4ZWkgS29zdXRdCgogICopIFBPUlQ6IGZpeCBybGltX3QgcHJvYmxlbXMgd2l0aCBBSVggNC4yLiBbTWFyYyBTbGVta29dIFBSIzMzMwoKICAqKSBQT1JUOiBVcGRhdGUgVW5peFdhcmUgc3VwcG9ydCBmb3IgMi4xLjIuCiAgICAgW0xhd3JlbmNlIFJvc2VubWFuIDxsZXIgbGVyY3RyLm9yZz5dIFBSIzUxMQoKICAqKSBQT1JUOiBOb25TdG9wLVVYIFtKb2FjaGltIFNjaG1pdHogPHNjaG1pdHpfam9hY2hpbSB0YW5kZW0uY29tPl0gUFIjMzI3CgogICopIFBPUlQ6IFVwZGF0ZSBDb252ZXhPUyBzdXBwb3J0IGZvciAxMS41LgogICAgIFtEYXZpZCBEZVNpbW9uZSA8Zm94IGNvbnZleC5jb20+XSBQUiMzOTkKCiAgKikgUE9SVDogU3VwcG9ydCBmb3IgREVDIGNjIGNvbXBpbGVyIHVuZGVyIFVMVFJJWC4KICAgICBbIlAuIEFsZWphbmRybyBMb3Blei1WYWxlbmNpYSIgPGFsZWpvbG8gaWRlYW0uZ292LmNvPl0gUFIjMzg4CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIE1heGlvbi9PUyBTVlI0LjIgUmVhbCBUaW1lIFVuaXguIFtubyBuYW1lIGdpdmVuXSBQUiMzODMKCiAgKikgUE9SVDogV29ya2Fyb3VuZCBmb3IgQUlYIDMueCBjb21waWxlciBidWcgaW4gaHR0cF9icHJpbnRmLmMuICAKICAgICBbTWFyYyBTbGVta29dIFBSIzcyNQoKICAqKSBQT1JUOiBmaXggcHJvYmxlbSBjb21waWxpbmcgaHR0cF9icHJpbnRmLmMgd2l0aCBnY2MgdW5kZXIgU0NPCiAgICAgW01hcmMgU2xlbWtvXSBQUiM2OTUKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIxMQoKICAqKSBGaXhlZCBvcGVuIHRpbWVzdGFtcCBmZCBpbiBwcm94eV9jYWNoZS5jIFtDaHVjayBNdXJja29dCgogICopIEFkZGVkIHVuZG9jdW1lbnRlZCBwZXJsIFNTSSBtZWNoYW5pc20gZm9yIC1EVVNFX1BFUkxfU1NJIGFuZCBtb2RfcGVybC4KICAgICBbRG91ZyBNYWNFYWNoZXJuLCBSb2IgSGFydGlsbF0KCiAgKikgUHJveHkgbmVlZHMgdG8gdXNlIGhhcmRfdGltZW91dCBpbnN0ZWFkIG9mIHNvZnRfdGltZW91dCB3aGVuIGl0IGlzCiAgICAgcmVhZGluZyBmcm9tIG9uZSBidWZmZXIgYW5kIHdyaXRpbmcgdG8gYW5vdGhlciwgYXQgbGVhc3QgdW50aWwgaXQgaGFzCiAgICAgYSBjdXN0b20gdGltZW91dCBoYW5kbGVyLiAgW1JveSBGaWVsZGluZyBhbmQgUGV0ciBMYW1wYV0KCiAgKikgRml4ZWQgcHJvYmxlbSBvbiBJUklYIHdpdGggc2VydmVycyBoYW5naW5nIGluIElkZW50aXR5Q2hlY2ssCiAgICAgYXBwYXJlbnRseSBkdWUgdG8gYSBtaXNtYXRjaCBiZXR3ZWVuIHNpZ2FjdGlvbiBhbmQgc2V0am1wLgogICAgIFtSb3kgRmllbGRpbmddIFBSIzUwMgoKICAqKSBMb2cgY29ycmVjdCBzdGF0dXMgY29kZSBpZiB3ZSB0aW1lb3V0IGJlZm9yZSByZWNlaXZpbmcgYSByZXF1ZXN0ICg0MDgpCiAgICAgb3IgaWYgd2UgcmVjZWl2ZWQgYSByZXF1ZXN0LWxpbmUgdGhhdCB3YXMgdG9vIGxvbmcgdG8gcHJvY2VzcyAoNDE0KS4KICAgICBbRWQgS29ydGhvZiBhbmQgUm95IEZpZWxkaW5nXSBQUiM2MDEKCiAgKikgVmlydHVhbCBob3N0cyB3aXRoIHRoZSBzYW1lIFNlcnZlck5hbWUsIGJ1dCBvbiBkaWZmZXJlbnQgcG9ydHMsIHdlcmUKICAgICBub3QgYmVpbmcgc2VsZWN0ZWQgcHJvcGVybHkuICBbRWQgS29ydGhvZl0KCiAgKikgQWRkZWQgY29kZSB0byByZXR1cm4gdGhlIHJlcXVlc3RlZCBJUCBhZGRyZXNzIGZyb20gcHJveHlfaG9zdDJhZGRyKCkKICAgICBpZiBnZXRob3N0YnlhZGRyKCkgZmFpbHMgZHVlIHRvIHJldmVyc2UgRE5TIGxvb2t1cCBwcm9ibGVtcy4gT3JpZ2luYWwKICAgICBjaGFuZ2Ugc3VibWl0dGVkIGJ5IEpvenNlZiBIb2xsb3NpIDxob2xsb3NpIHNiY20uY29tPi4KICAgICBbQ2h1Y2sgTXVyY2tvXSBQUiM2MTQKCiAgKikgSWYgbXVsdGlwbGUgcmVxdWVzdHMgb24gYSBzaW5nbGUgY29ubmVjdGlvbiBhcmUgdXNlZCB0byByZXRyaWV2ZQogICAgIGRhdGEgZnJvbSBkaWZmZXJlbnQgdmlydHVhbCBob3N0cywgdGhlIHZpcnR1YWwgaG9zdCBsaXN0IHdvdWxkIGJlCiAgICAgc2Nhbm5lZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgVkggaW5zdGVhZCBvZiB0aGUgZmlyc3QsCiAgICAgY2F1c2luZyBtb3N0IHZpcnR1YWwgaG9zdHMgdG8gYmUgaWdub3JlZC4KICAgICBbUGF1bCBTdXR0b24gYW5kIE1hcnRpbiBNYXJlc10gUFIjNjEwCgogICopIFRoZSBPUy8yIGhhbmRsaW5nIG9mIHByb2Nlc3MgZ3JvdXAgd2FzIGJyb2tlbiBieSBhIHBvcnRpbmcgcGF0Y2ggZm9yCiAgICAgTVBFLCBzbyByZXN0b3JlZCBwcmlvciBjb2RlIGZvciBPUy8yLiAgW1JveSBGaWVsZGluZyBhbmQgR2FyZXkgU21pbGV5XQoKICAqKSBJbmhlcml0IHZpcnR1YWwgc2VydmVyIHBvcnQgZnJvbSBtYWluIHNlcnZlciBpZiBub25lIChvciAiKiIpIGlzCiAgICAgZ2l2ZW4gZm9yIFZpcnR1YWxIb3N0LiAgW0RlYW4gR2F1ZGV0XSBQUiM1NzYKCiAgKikgSWYgdGhlIGxvb2t1cCBmb3IgYSBEaXJlY3RvcnlJbmRleCBuYW1lIHdpdGggY29udGVudCBuZWdvdGlhdGlvbgogICAgIGhhcyBmb3VuZCBtYXRjaGluZyB2YXJpYW50cywgYnV0IG5vbmUgYXJlIGFjY2VwdGFibGUsIHJldHVybiB0aGUKICAgICBuZWdvdGlhdGlvbiByZXN1bHQgaWYgdGhlcmUgYXJlIG5vIG1vcmUgRGlyZWN0b3J5SW5kZXggbmFtZXMgdG8gbG9va3VwLgogICAgIFtQZXRyIExhbXBhIGFuZCBSb3kgRmllbGRpbmddCgogICopIElmIGEgc29mdF90aW1lb3V0IG9jY3VycyBhZnRlciBrZWVwYWxpdmUgaXMgc2V0LCB0aGVuIHRoZSBtYWluIGNoaWxkCiAgICAgbG9vcCB3b3VsZCB0cnkgdG8gcmVhZCBhbm90aGVyIHJlcXVlc3QgZXZlbiB0aG91Z2ggdGhlIGNvbm5lY3Rpb24KICAgICBoYXMgYmVlbiBhYm9ydGVkLiAgW1JveSBGaWVsZGluZ10KCiAgKikgQ29uZmlndXJlIGNoYW5nZXM6IEFsbG93IGZvciB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiBhCiAgICAgTW9kdWxlIGRlY2xhcmF0aW9uLiBBbHNvLCBiZSBtb3JlIHVuZGVyc3RhbmRpbmcgYWJvdXQgdGhlCiAgICAgQ0M9L09QVElNPSBmb3JtYXQgaW4gQ29uZmlndXJhdGlvbi4gRmluYWxseSwgZml4IGNvbXBpbGVyCiAgICAgZmxhZ3MgaWYgdXNpbmcgSFAtVVgncyBjYyBjb21waWxlci4gW0ppbSBKYWdpZWxza2ldCgogICopIFN1YnJlcXVlc3RzIGFuZCBpbnRlcm5hbCByZWRpcmVjdHMgbm93IGluaGVyaXQgdGhlX3JlcXVlc3QgZnJvbSB0aGUKICAgICBvcmlnaW5hbCByZXF1ZXN0LWxpbmUuIFtSb3kgRmllbGRpbmddCgogICopIFRlc3QgZm9yIGVycm9yIGNvbmRpdGlvbnMgYmVmb3JlIGNyZWF0aW5nIG91dHB1dCBoZWFkZXIgZmllbGRzLCBzaW5jZQogICAgIHdlIGRvbid0IHdhbnQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gaW5jbHVkZSB0aG9zZSBmaWVsZHMuICBMaWtld2lzZSwKICAgICByZXNldCB0aGUgY29udGVudF9sYW5ndWFnZShzKSBhbmQgY29udGVudF9lbmNvZGluZyBvZiB0aGUgcmVzcG9uc2UKICAgICBiZWZvcmUgZ2VuZXJhdGluZyBvciByZWRpcmVjdGluZyB0byBhbiBlcnJvciBtZXNzYWdlLCBzaW5jZSB0aGUgbmV3CiAgICAgbWVzc2FnZSB3aWxsIGhhdmUgaXRzIG93biBDb250ZW50LSogZGVmaW5pdGlvbnMuIFtEZWFuIEdhdWRldF0KCiAgKikgUmVzdG9yZWQgdGhlIHNlbWFudGljcyBvZiBoZWFkZXJzX291dCAoaGVhZGVycyBzZW50IG9ubHkgd2l0aCAyMDAuLjI5OQogICAgIGFuZCAzMDQgcmVzcG9uc2VzKSBhbmQgZXJyX2hlYWRlcnNfb3V0IChoZWFkZXJzIHNlbnQgd2l0aCBhbGwgcmVzcG9uc2VzKS4KICAgICBBdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29weWluZyB0YWJsZXMgaWYgZXJyX2hlYWRlcnNfb3V0IGlzIGVtcHR5CiAgICAgKHRoZSB1c3VhbCBjYXNlKS4gIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGEgY291cGxlIHBsYWNlcyB3aGVyZSBhIGNoZWNrIGZvciB0aGUgZGVmYXVsdCBDb250ZW50LVR5cGUgd2FzCiAgICAgbm90IHByb3Blcmx5IGNoZWNraW5nIGJvdGggdGhlIHZhbHVlIGNvbmZpZ3VyZWQgYnkgdGhlIERlZmF1bHRUeXBlCiAgICAgZGlyZWN0aXZlIGFuZCB0aGUgREVGQVVMVF9UWVBFIHN5bWJvbCBpbiBodHRwZC5oLiAgQ2hhbmdlZCB0aGUgdmFsdWUKICAgICBvZiBERUZBVUxUX1RZUEUgdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgZGVmYXVsdCAodGV4dC9wbGFpbikuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM1MDYKCiAgKikgRXNjYXBlIHRoZSBIVE1MLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIGluIHRoZSBSZXF1ZXN0LVVSSSB0aGF0IGlzCiAgICAgb3V0cHV0IGZvciBlYWNoIGNoaWxkIGJ5IG1vZF9zdGF0dXMuIFtEZWFuIEdhdWRldCBhbmQgS2VuIENvYXJdIFBSIzUwMQoKICAqKSBQcm9wZXJseSBpbml0aWFsaXplIHRoZSBmbG9jayBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIG11dGV4IGxvY2tpbmcKICAgICBhcm91bmQgYWNjZXB0KCkgd2hlbiBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgaXMgZGVmaW5lZC4KICAgICBbTWFyYyBTbGVta29dCgogICopIFRoZSBtZXRob2QgZm9yIGRldGVybWluaW5nIFBBVEhfSU5GTyBoYXMgYmVlbiByZXN0b3JlZCB0byB0aGUgcHJlLTEuMmIKICAgICAoYW5kIE5DU0EgaHR0cGQpIGRlZmluaXRpb24gd2hlcmVpbiBpdCB3YXMgdGhlIGV4dHJhIHBhdGggaW5mbyBiZXlvbmQKICAgICB0aGUgQ0dJIHNjcmlwdCBmaWxlbmFtZS4gIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGSUxFUEFUSF9JTkZPIGhhcwogICAgIGJlZW4gcmVtb3ZlZCwgYW5kIGluc3RlYWQgd2Ugc3VwcGx5IHRoZSBvcmlnaW5hbCBSRVFVRVNUX1VSSSB0byBhbnkKICAgICBzY3JpcHQgdGhhdCB3YW50cyB0byBiZSBBcGFjaGUtc3BlY2lmaWMgYW5kIG5lZWRzIHRoZSByZWFsIFVSSSBwYXRoLgogICAgIFRoaXMgc29sdmVzIGEgcHJvYmxlbSB3aXRoIGV4aXN0aW5nIHNjcmlwdHMgdGhhdCB1c2UgZXh0cmEgcGF0aCBpbmZvCiAgICAgaW4gdGhlIFNjcmlwdEFsaWFzIGRpcmVjdGl2ZSB0byBwYXNzIG9wdGlvbnMgdG8gdGhlIENHSSBzY3JpcHQuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIF9kZWZhdWx0XyBjaGFuZ2UgaW4gMS4yYjEwIHdpbGwgY2hhbmdlIHRoZSBiZWhhdmlvdXIgb24gY29uZmlncwogICAgIHRoYXQgdXNlIG11bHRpcGxlIExpc3RlbiBzdGF0ZW1lbnRzIGZvciBsaXN0ZW5pbmcgb24gbXVsdGlwbGUgcG9ydHMuCiAgICAgQnV0IHRoYXQgY2hhbmdlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIF9kZWZhdWx0XyBjb25zaXN0ZW50IHdpdGggb3RoZXIKICAgICBmb3JtcyBvZiA8VmlydHVhbEhvc3Q+LiAgSXQgcmVxdWlyZXMgc3VjaCBjb25maWdzIHRvIGJlIG1vZGlmaWVkCiAgICAgdG8gdXNlIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86Kj4uICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbgogICAgIHVwZGF0ZWQuICBbRGVhbiBHYXVkZXRdIFBSIzUzMAoKICAqKSBJZiBhbiBFcnJvckRvY3VtZW50IENHSSBzY3JpcHQgaXMgdXNlZCB0byByZXNwb25kIHRvIGFuIGVycm9yCiAgICAgZ2VuZXJhdGVkIGJ5IGFub3RoZXIgQ0dJIHNjcmlwdCB3aGljaCBoYXMgYWxyZWFkeSByZWFkIHRoZSBtZXNzYWdlCiAgICAgYm9keSBvZiB0aGUgcmVxdWVzdCwgdGhlIHNlcnZlciB3b3VsZCBibG9jayB0cnlpbmcgdG8gcmVhZCB0aGUKICAgICBtZXNzYWdlIGJvZHkgYWdhaW4uICBbUm9iIEhhcnRpbGxdCgogICopIHNpZ25hbCgpIHJlcGxhY2VtZW50IGNvbmZsaWN0ZWQgd2l0aCBhIGRlZmluZSBvbiBRTlggKGFuZCBwb3RlbnRpYWxseQogICAgIG90aGVyIHBsYXRmb3JtcykuIEZpeGVkLiBbQmVuIExhdXJpZV0gUFIjNTEyCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIxMAoKICAqKSBBbGxvdyBIVFRQRF9ST09ULCBTRVJWRVJfQ09ORklHX0ZJTEUsIERFRkFVTFRfUEFUSCwgYW5kIFNIRUxMX1BBVEgKICAgICB0byBiZSBjb25maWd1cmVkIHZpYSAtRCBpbiBDb25maWd1cmF0aW9uLiAgW0RlYW4gR2F1ZGV0XSBQUiM0NDkKCiAgKikgPFZpcnR1YWxIb3N0IF9kZWZhdWx0Xzpwb3J0bnVtPiBkaWRuJ3Qgd29yayBwcm9wZXJseS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkZWQgcHJvdG90eXBlIGZvciBta3RlbXAoKSBmb3IgU1VOT1M0IFtNYXJjIFNsZW1rb10KCiAgKikgSW4gbW9kX3Byb3h5LmMsIGNoZWNrIHJldHVybiB2YWx1ZXMgZm9yIHByb3h5X2hvc3QyYWRkcigpIHdoZW4gcmVhZGluZwogICAgIGNvbmZpZywgaW4gY2FzZSB0aGUgaG9zdGVudCBzdHJ1Y3QgcmV0dXJuZWQgaXMgdHJhc2guCiAgICAgW0NodWNrIE11cmNrb10gUFIgIzQ5MQoKICAqKSBGaXhlZCB0aGUgZml4IGluIDEuMmI5IGZvciBwYXJzaW5nIFVSTCBxdWVyeSBpbmZvIGludG8gYXJncyBmb3IgQ0dJCiAgICAgc2NyaXB0cy4gIFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nLCBNYXJjIFNsZW1rb10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjkgIFtuZXZlciBhbm5vdW5jZWRdCgogICopIFJlc2V0IHRoZSBNT0RVTEVfTUFHSUNfTlVNQkVSIHRvIGFjY291bnQgZm9yIHRoZSB1bnNpZ25lZCBwb3J0CiAgICAgY2hhbmdlcyBhbmQgaW4gYW50aWNpcGF0aW9uIG9mIDEuMiBmaW5hbCByZWxlYXNlLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IHByb2JsZW0gd2l0aCBzY3JpcHRzIG5vdCByZWNlaXZpbmcgYSBTSUdQSVBFIHdoZW4gY2xpZW50IGRyb3BzCiAgICAgdGhlIGNvbm5lY3Rpb24gKGUuZy4sIHdoZW4gdXNlciBwcmVzc2VzIFN0b3ApLiAgQXBhY2hlIHdpbGwgbm93IHN0b3AKICAgICB0cnlpbmcgdG8gc2VuZCBhIG1lc3NhZ2UgYm9keSBpbW1lZGlhdGVseSBhZnRlciBhbiBlcnJvciBmcm9tIHdyaXRlLgogICAgIFtSb3kgRmllbGRpbmcgYW5kIE5hdGhhbiBLdXJ6XSBQUiMzMzUKCiAgKikgUmVhcnJhbmdlIENvbmZpZ3VyYXRpb24udG1wbCBzbyB0aGF0IG1vZF9yZXdyaXRlIGhhcyBoaWdoZXIgcHJpb3JpdHkKICAgICB0aGFuIG1vZF9hbGlhcywgYW5kIG1vZF9hbGlhcyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gbW9kX3Byb3h5OwogICAgIHJlYXJyYW5nZWQgb3RoZXIgbW9kdWxlcyB0byBlbmhhbmNlIHVuZGVyc3RhbmRpbmcgb2YgdGhlaXIgcHVycG9zZQogICAgIGFuZCByZWxhdGl2ZSBvcmRlciAoYW5kIG1heWJlIGV2ZW4gcmVkdWNlIHNvbWUgb3ZlcmhlYWQpLgogICAgIFtSb3kgRmllbGRpbmcgYW5kIFNhbWVlciBQYXJla2hdCgogICopIEZpeCBncmFjZWZ1bCByZXN0YXJ0LiAgRWxpbWluYXRlIG1hbnkgc2lnbmFsLXJlbGF0ZWQgcmFjZQogICAgIGNvbmRpdGlvbnMgaW4gYm90aCBmb3JtcyBvZiByZXN0YXJ0LCBhbmQgaW4gU0lHVEVSTS4gIFNlZQogICAgIGh0ZG9jcy9tYW51YWwvc3RvcHBpbmcuaHRtbCBmb3IgZGV0YWlscyBvbiBzdG9wcGluZyBhbmQKICAgICByZXN0YXJ0aW5nIHRoZSBwYXJlbnQuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gbW9kX3Jld3JpdGUsIG1vZF9icm93c2VyLCBtb2RfaW5jbHVkZS4gIFR1bmUKICAgICBtZW1vcnkgYWxsb2NhdG9yIHRvIGF2b2lkIGEgYmVoYXZpb3VyIHRoYXQgcmVxdWlyZWQgZXh0cmEgYmxvY2tzIHRvCiAgICAgYmUgYWxsb2NhdGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBbGxvdyBzdWV4ZWMgdG8gYWNjZXNzIGZpbGVzIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5IGJ1dCBub3QKICAgICBhYm92ZS4gIChFeGNsdWRpbmcgbGVhZGluZyAvIG9yIGFueSAuLiBkaXJlY3RvcnkuKSAgW0tlbiBDb2FyXQogICAgIFBSIzI2OSwgMzE5LCAzOTUKCiAgKikgRml4IHN1ZXhlYyBzZWdmYXVsdCB3aGVuIGdyb3VwIGRvZXNuJ3QgZXhpc3QuIFtHcmVnb3J5IE5laWwgU2hhcGlyb10KICAgICBQUiMzNjcsIDM2OCwgMzU0LCA0NTMKCiAgKikgRml4IHRoZSBhYm92ZSBmaXg6IGlmIHN1ZXhlYyBpcyBlbmFibGVkLCBhdm9pZCBkZXN0cm95aW5nIHItPnVybAogICAgIHdoaWxlIG9idGFpbmluZyB0aGUgL351c2VyIGFuZCBzYXZlIHRoZSB1c2VybmFtZSBpbiBhIHNlcGFyYXRlIGRhdGEKICAgICBhcmVhIHNvIHRoYXQgaXQgd29uJ3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNhbGwgdG8gZ2V0Z3JnaWQoKSwgYW5kCiAgICAgZml4IHNvbWUgbWlzdXNlIG9mIHRoZSBwb29sIHN0cmluZyBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4gIEFsc28gZml4ZXMKICAgICBhIGdlbmVyYWwgcHJvYmxlbSB3aXRoIHBhcnNpbmcgVVJMIHF1ZXJ5IGluZm8gaW50byBhcmdzIGZvciBDR0kgc2NyaXB0cy4KICAgICBbUm95IEZpZWxkaW5nXSBQUiMzMzksIDM2NywgMzU0LCA0NTMKCiAgKikgRml4IElSSVggd2FybmluZyBhYm91dCBiemVybyB1bmRlZmluZWQuIFtNYXJjIFNsZW1rb10KCiAgKikgRml4IHByb2JsZW0gd2l0aCA8RGlyZWN0b3J5IHByb3h5Oi4uLj4uIFtNYXJ0aW4gS3JhZW1lcl0gUFIjMjcxCgogICopIENvcnJlY3RlZCBzcGVsbGluZyBvZiAiYXV0aG9yaXRhdGl2ZSIuICBBdXRoREJBdXRob3JhdGF0aXZlIGJlY2FtZQogICAgIEF1dGhEQkF1dGhvcml0YXRpdmUuIFtNYXJjIFNsZW1rb10gUFIjNDIwCgogICopIE1heENsaWVudHMgc2hvdWxkIGJlIGF0IGxlYXN0IDEuIFtMYXJzIEVpbGVicmVjaHRdIFBSIzM3NQoKICAqKSBUaGUgZGVmYXVsdCBoYW5kbGVyIG5vdyBsb2dzIGludmFsaWQgbWV0aG9kcyBvciBVUklzIChpLmUuIFBVVCBvbiBhbgogICAgIG9iamVjdCB0aGF0IGNhbid0IGJlIFBVVCwgb3IgRk9PQkFSIGZvciBzb21lIG1ldGhvZCBGT09CQVIgdGhhdAogICAgIGFwYWNoZSBkb2Vzbid0IGtub3cgYWJvdXQgYXQgYWxsKS4gIExvZyA0MDRzIHRoYXQgb2NjdXIgaW4gbW9kX2luY2x1ZGUuCiAgICAgW1BhdWwgU3V0dG9uLCBKb2huIFZhbiBFc3Nlbl0KCiAgKikgSWYgYSBzb2Z0IHRpbWVvdXQgKG9yIGxpbmdlcm91dCkgb2NjdXJzIHdoaWxlIHRyeWluZyB0byBmbHVzaCBhCiAgICAgYnVmZmVyIG9yIHdyaXRlIGluc2lkZSBidWZmLmMgb3IgZnJlYWQnaW5nIGZyb20gYSBDR0kncyBvdXRwdXQsCiAgICAgdGhlbiB0aGUgdGltZW91dCB3b3VsZCBiZSBpZ25vcmVkLiBbUm95IEZpZWxkaW5nXSBQUiMzNzMKCiAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTmV0c2NhcGUgTmF2aWdhdG9yIHZlcnNpb25zIDIueCwgMy54IGFuZCA0LjBiMidzCiAgICAgcGFyc2luZyBvZiBoZWFkZXJzLiAgSWYgdGhlIHRlcm1pbmF0aW5nIGVtcHR5LWxpbmUgQ1JMRiBvY2N1cnMgc3RhcnRpbmcKICAgICBhdCB0aGUgMjU2dGggb3IgMjU3dGggYnl0ZSBvZiBvdXRwdXQsIHRoZW4gTmF2aWdhdG9yIHdpbGwgdGhpbmsgYSBub3JtYWwKICAgICBpbWFnZSBpcyBpbnZhbGlkLiAgV2UgYXJlIGd1ZXNzaW5nIHRoYXQgdGhpcyBpcyBiZWNhdXNlIHRoZWlyIGluaXRpYWwKICAgICByZWFkIG9mIGEgbmV3IHJlcXVlc3QgdXNlcyBhIDI1NiBieXRlIGJ1ZmZlci4gV2UgY2hlY2sgdGhlIGJ5dGVzIHdyaXR0ZW4KICAgICBzbyBmYXIgYW5kLCBpZiB3ZSBhcmUgYWJvdXQgdG8gdGlja2xlIHRoZSBidWcsIHdlIGluc3RlYWQgaW5zZXJ0IGEKICAgICBwYWRkaW5nIGhlYWRlciBvZiBlbWluZW50IGJvZ29zaXR5LiBbUm95IEZpZWxkaW5nIGFuZCBEZWFuIEdhdWRldF0gUFIjMjMyCgogICopIEZpeGVkIFNJR1NFR1YgcHJvYmxlbSB3aGVuIGEgRGlyZWN0b3J5SW5kZXggZmlsZSBpcyBhbHNvIHRoZSBzb3VyY2UKICAgICBvZiBhbiBleHRlcm5hbCByZWRpcmVjdGlvbi4gIFtSb3kgRmllbGRpbmcgYW5kIFBhdWwgU3V0dG9uXQoKICAqKSBDb25maWd1cmUgd291bGQgY3JlYXRlIGEgYnJva2VuIE1ha2VmaWxlIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKICAgICBjb250YWluZWQgYSBjb21tZW50ZWQtb3V0IFJ1bGUuICBbUm95IEZpZWxkaW5nXQoKICAqKSBQcm9tb3RlIHBlcl9kaXJfY29uZmlnIGFuZCBzdWJwcm9jZXNzX2VudiBmcm9tIHRoZSBzdWJyZXF1ZXN0IHRvIHRoZQogICAgIG1haW4gcmVxdWVzdCBpbiBtb2RfbmVnb3RpYXRpb24uICBJbiBwYXJ0aWN1bGFyIHRoaXMgZml4ZXMgYSBidWcKICAgICB3aGVyZSA8RmlsZXM+IHNlY3Rpb25zIHdvdWxkbid0IHByb3Blcmx5IGFwcGx5IHRvIG5lZ290aWF0ZWQgY29udGVudC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBhIHBvdGVudGlhbCBkZWFkbG9jayBpbiBtb2RfY2dpIHNjcmlwdF9lcnIgaGFuZGxpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIHJvdGF0ZWxvZ3MgemVyby1wYWRzIHRoZSBsb2dmaWxlIG5hbWVzIHRvIGltcHJvdmUgYWxwaGFiZXRpYyBzb3J0aW5nLgogICAgIFtNaXRjaGVsbCBCbGFuayBKcl0KCiAgKikgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byAzLjAuNDogRml4ZXMgSFRUUCByZWRpcmVjdHMgZnJvbSB3aXRoaW4KICAgICAuaHRhY2Nlc3MgZmlsZXMgYmVjYXVzZSB0aGUgUmV3cml0ZUJhc2Ugd2FzIG5vdCByZXBsYWNlZCBjb3JyZWN0bHkuCiAgICAgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byAzLjAuNTogRml4ZXMgcHJvYmxlbSB3aXRoIHJld3JpdGluZyBpbnNpZGUKICAgICA8RGlyZWN0b3J5PiBzZWN0aW9ucyBtaXNzaW5nIGEgdHJhaWxpbmcgLy4gIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbiB1cCBMaW51eCBzZXR0aW5ncyBpbiBjb25mLmggYnkgZGV0ZWN0aW5nIDIueCB2ZXJzdXMgMS54LiAgRm9yCiAgICAgMS54IHRoZSBzZXR0aW5ncyBhcmUgdGhvc2Ugb2YgcHJlLTEuMmI4LiAgRm9yIDIueCB3ZSBpbmNsdWRlCiAgICAgVVNFX1NITUdFVF9TQ09SRUJPQVJEIChzY29yZWJvYXJkIGluIHNoYXJlZCBtZW1vcnkgcmF0aGVyIHRoYW4gZmlsZSkgYW5kCiAgICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCAoZW5hYmxlIHRoZSBSTGltaXQgY29tbWFuZHMpLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMzM2LCBQUiMzNDAKCiAgKikgUmVkaXJlY3QgZGlkIG5vdCBwcmVzZXJ2ZSA/cXVlcnlfc3RyaW5ncyB3aGVuIHByZXNlbnQgaW4gdGhlIGNsaWVudCdzCiAgICAgcmVxdWVzdC4gIFtEZWFuIEdhdWRldF0KCiAgKikgQ29uZmlndXJlIHdhcyBmaW5kaW5nIG5vbi1tb2R1bGVzIG9uIEVYVFJBX0xJQlMuIFtGcmFuayBDcmluZ2xlXSBQUiMzODAKCiAgKikgVXNlIC9iaW4vc2g1IG9uIFVMVFJJWC4gIFtQLiBBbGVqYW5kcm8gTG9wZXotVmFsZW5jaWFdIFBSIzM2OQoKICAqKSBBZGQgVW5peFdhcmUgY29tcGlsZS9pbnN0YWxsIGluc3RydWN0aW9ucy4gIFtDaHVjayBNdXJja29dCgogICopIEFkZCBtb2RfZXhhbXBsZSAoaWxsdXN0cmF0aW9uIG9mIEFQSSB0ZWNobmlxdWVzKS4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIG1hY3JvIGZvciBtZW1tb3ZlIHRvIGNvbmYuaCBmb3IgU1VOT1M0LiBbTWFyYyBTbGVta29dCgogICopIEltcHJvdmUgaGFuZGxpbmcgb2YgZGlyZWN0b3JpZXMgd2hlbiBmaWxlbmFtZXMgaGF2ZSBzcGFjZXMgaW4gdGhlbS4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBGb3IgaG9zdHMgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIHRyeSBhbGwgYWRkaXRpb25hbCBhZGRyZXNzZXMgaWYKICAgICBuZWNlc3NhcnkgdG8gZ2V0IGEgY29ubmVjdC4gRmFpbCBvbmx5IGlmIGhvc3RlbnQgYWRkcmVzcyBsaXN0IGlzCiAgICAgZXhoYXVzdGVkLiBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBNb3JlIHNpZ25lZC91bnNpZ25lZCBwb3J0IGZpeGVzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBIQVJEX1NFUlZFUl9MSU1JVCBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgQ29uZmlndXJhdGlvbiBmaWxlIG5vdy4KICAgICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI4CgogICopIHN1ZXhlYy5jIGRvZXNuJ3QgY2xvc2UgdGhlIGxvZyBmaWxlLCBhbGxvd2luZyBDR0lzIHRvIGNvbnRpbnVlIHdyaXRpbmcKICAgICB0byBpdC4gIFtNYXJjIFNsZW1rb10KCiAgKikgVGhlIGFkZGl0aW9uIG9mIDxMb2NhdGlvbj4gYW5kIDxGaWxlPiBkaXJlY3RpdmVzIG1hZGUgdGhlCiAgICAgc3ViX3JlcV9sb29rdXBfc2ltcGxlKCkgZnVuY3Rpb24gYm9ndXMsIHNvIHdlIG5vdyBoYW5kbGUKICAgICB0aGUgc3BlY2lhbCBjYXNlcyBkaXJlY3RseS4gIFtEZWFuIEdhdWRldF0KCiAgKikgV2Ugbm93IHRyeSB0byBsb2cgd2hlcmUgdGhlIHNlcnZlciBpcyBkdW1waW5nIGNvcmUgd2hlbiBhIGZhdGFsCiAgICAgc2lnbmFsIGlzIHJlY2VpdmVkLiAgW0tlbiBDb2FyXQoKICAqKSBJbXByb3ZlZCBsaW5nZXJpbmdfY2xvc2UgYnkgYWRkaW5nIGEgc3BlY2lhbCB0aW1lb3V0LCByZW1vdmluZyB0aGUKICAgICBzcHVyaW91cyBsb2cgbWVzc2FnZXMsIHJlbW92aW5nIHRoZSBub25ibG9ja2luZyBzZXR0aW5ncyAodGhleQogICAgIGFyZSBub3QgbmVlZGVkIHdpdGggdGhlIGJldHRlciB0aW1lb3V0KSwgYW5kIGFkZGluZyBjb21tZW50YXJ5CiAgICAgYWJvdXQgdGhlIE5PX0xJTkdDTE9TRSBhbmQgVVNFX1NPX0xJTkdFUiBpc3N1ZXMuICBOT19MSU5HQ0xPU0UgaXMKICAgICBub3cgdGhlIGRlZmF1bHQgZm9yIFN1bk9TNCwgVW5peFdhcmUsIE5lWFQsIGFuZCBJUklYLiAgW1JveSBGaWVsZGluZ10KCiAgKikgU2VuZCBlcnJvciBtZXNzYWdlcyBhYm91dCBzZXRzb2Nrb3B0IGZhaWx1cmVzIHRvIHRoZSBzZXJ2ZXIgZXJyb3IKICAgICBsb2cgaW5zdGVhZCBvZiBzdGRlcnIuICBbUm95IEZpZWxkaW5nXQoKICAqKSBGaXggbG9vcGhvbGVzIGluIHByb3h5IGNhY2hlIGV4cGlyeSB2aXMgYSB2aXMgYWxhcm1zLiBbQnJpYW4gTW9vcmVdCgogICopIFN0b3BnYXAgc29sdXRpb24gZm9yIENHSSAzLXNlY29uZCBkZWxheSB3aXRoIHNlcnZlci1zaWRlIGluY2x1ZGVzOiBpZgogICAgIHByb2Nlc3NpbmcgYSBzdWJyZXF1ZXN0LCBhbGxvY2F0ZSBtZW1vcnkgZnJvbSByLT5tYWluLT5wb29sIGluc3RlYWQKICAgICBvZiByLT5wb29sIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHdhaXRpbmcgZm9yIGZyZWVfcHJvY19jaGFpbiB0byBjbGVhbnVwCiAgICAgaW4gdGhlIG1pZGRsZSBvZiBhbiBTU0kgcmVxdWVzdC4gIFtEZWFuIEdhdWRldF0gUFIgIzEyMgoKICAqKSBGaXhlZCBzdGF0dXMgb2YgcmVzcG9uc2Ugd2hlbiBQT1NUIGlzIHJlY2VpdmVkIGZvciBhIG5vbmV4aXN0ZW50IFVSTAogICAgICh3YXMgc2VuZGluZyA0MDUsIG5vdyA0MDQpIGFuZCB3aGVuIGFueSBtZXRob2QgaXMgc2VudCB3aXRoIGEKICAgICBmdWxsLVVSSSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBhbmQgdGhlIHNlcnZlciBpcyBub3QgYWN0aW5nCiAgICAgYXMgYSBwcm94eSAod2FzIHNlbmRpbmcgNTAxLCBub3cgNDAzKS4gIFtSb3kgRmllbGRpbmddCgogICopIEhvc3QgcG9ydCBjaGFuZ2VkIHRvIHVuc2lnbmVkIHNob3J0LiBbS2VuIENvYXJdIFBSICMyNzYKCiAgKikgRml4IHR5cG8gaW4gY29tbWFuZCBkZWZpbml0aW9uIG9mIEF1dGhBdXRob3JpdGF0aXZlLiBbS2VuIENvYXJdIFBSICMyNDYKCiAgKikgRGVmaW5lZCBVU0VfU0hNR0VUX1NDT1JFQk9BUkQgZm9yIHNoYXJlZCBtZW1vcnkgb24gTGludXguICBbRGVhbiBHYXVkZXRdCgogICopIFJlcG9ydCBleHRyYSBpbmZvIGZyb20gZXJybm8gd2l0aCBtYW55IGVycm9ycyB0aGF0IGNhdXNlIGh0dHBkIHRvIGV4aXQuCiAgICAgc3Bhd25fY2hpbGQsIHBvcGVuZiwgYW5kIHBjbG9zZWYgbm93IGhhdmUgdmFsaWQgZXJybm8gcmV0dXJucyBpbiB0aGUKICAgICBldmVudCBvZiBhbiBlcnJvci4gIENvcnJlY3QgcHJvYmxlbXMgd2hlcmUgZXJybm8gd2FzIHN0b21wZWQgb24KICAgICBiZWZvcmUgYmVpbmcgcmVwb3J0ZWQuICBbRGVhbiBHYXVkZXRdCgogICopIEluIHRoZSBwcm94eSwgaWYgdGhlIGNhY2hlIGZpbGVzeXN0ZW0gd2FzIGZ1bGwsIGdhcmJhZ2VfY29sbCgpIHdhcwogICAgIG5ldmVyIGNhbGxlZCwgYW5kIHRodXMgdGhlIGZpbGVzeXN0ZW0gd291bGQgcmVtYWluIGZ1bGwgaW5kZWZpbml0ZWx5LgogICAgIFdlIG5vdyBhbHNvIHJlbW92ZSBpbmNvbXBsZXRlIGNhY2hlIGZpbGVzIGxlZnQgaWYgdGhlIG9yaWdpbiBzZXJ2ZXIKICAgICBkaWRuJ3Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBhbmQgZWl0aGVyIHRoZSBjbGllbnQgaGFzIGFib3J0ZWQKICAgICB0cmFuc2ZlciBvciBid3JpdGUoKSB0byBjbGllbnQgaGFzIGZhaWxlZC4gW1BldHIgTGFtcGFdCgogICopIEZpeGVkIHRoZSBoYW5kbGluZyBvZiBtb2R1bGUgYW5kIHNjcmlwdC1hZGRlZCBoZWFkZXIgZmllbGRzLgogICAgIEltcHJvdmVkIHRoZSBpbnRlcmZhY2UgZm9yIHNlbmRpbmcgaGVhZGVyIGZpZWxkcyBhbmQgcmVkdWNlZAogICAgIHRoZSBkdXBsaWNhdGlvbiBvZiBjb2RlIGJldHdlZW4gc2VuZGluZyBva2F5IHJlc3BvbnNlcyBhbmQgZXJyb3JzLgogICAgIFdlIG5vdyBhbHdheXMgc2VuZCBib3RoIGhlYWRlcnNfb3V0IGFuZCBlcnJfaGVhZGVyc19vdXQsIGFuZAogICAgIGVuc3VyZSB0aGF0IHRoZSBzZXJ2ZXItcmVzZXJ2ZWQgZmllbGRzIGFyZSBub3QgYmVpbmcgb3ZlcnJpZGRlbiwKICAgICB3aGlsZSBub3Qgb3ZlcnJpZGluZyB0aG9zZSB0aGF0IGFyZSBub3QgcmVzZXJ2ZWQuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNb3ZlZCB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIGZpZWxkcyB0byBlcnJfaGVhZGVyc19vdXQKICAgICB0byByZWZsZWN0IGFib3ZlIGNoYW5nZXMuICBbUGV0ciBMYW1wYV0KCiAgKikgRml4ZWQgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIG1ha2UgdGhlCiAgICAgY29ubmVjdGlvbiBwZXJzaXN0ZW50IGZvciBhbGwgb2YgdGhlIGNhc2VzIHdoZXJlIHNvbWUgb3RoZXIgcGFydAogICAgIG9mIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgaW5kaWNhdGVkIHRoYXQgd2Ugc2hvdWxkIG5vdC4gIEFsc28KICAgICBpbXByb3ZlZCB0aGUgb3JkZXJpbmcgb2YgdGhlIHRlc3Qgc28gdGhhdCBjaHVua2VkIGVuY29kaW5nIHdpbGwKICAgICBiZSBzZXQgd2hlbmV2ZXIgaXQgaXMgZGVzaXJlZCBpbnN0ZWFkIG9mIG9ubHkgd2hlbiBLZWVwQWxpdmUKICAgICBpcyBlbmFibGVkLiBBZGRlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gY2FwYWJpbGl0eSBmb3IgbW9zdCBlcnJvcgogICAgIHJlc3BvbnNlcyAodGhvc2UgdGhhdCBkbyBub3QgaW5kaWNhdGUgYSBiYWQgaW5wdXQgc3RyZWFtKSB3aGVuCiAgICAgYWNjZXNzZWQgYnkgYW4gSFRUUC8xLjEgY2xpZW50LiBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGRlZCBtaXNzaW5nIHRpbWVvdXRzIGZvciBzZW5kaW5nIGhlYWRlciBmaWVsZHMsIGVycm9yIHJlc3BvbnNlcywKICAgICBhbmQgdGhlIGxhc3QgY2h1bmsgb2YgY2h1bmtlZCBlbmNvZGluZywgZWFjaCBvZiB3aGljaCBjb3VsZCBoYXZlCiAgICAgcmVzdWx0ZWQgaW4gYSBwcm9jZXNzIGJlaW5nIHN0dWNrIGluIHdyaXRlIGZvcmV2ZXIuICBVc2luZyBzb2Z0X3RpbWVvdXQKICAgICByZXF1aXJlcyB0aGF0IHRoZSBzZW5kZXIgY2hlY2sgZm9yIGFuIGFib3J0ZWQgY29ubmVjdGlvbiByYXRoZXIgdGhhbgogICAgIGNvbnRpbnVpbmcgYWZ0ZXIgYW4gRUlOVFIuICBUaW1lb3V0cyB0aGF0IHVzZWQgdG8gYmUgaW5pdGlhdGVkIGJlZm9yZQogICAgIHNlbmRfaHR0cF9oZWFkZXIgKGFuZCBuZXZlciBraWxsZWQpIGFyZSBub3cgaW5pdGlhdGVkIG9ubHkgd2l0aGluIG9yCiAgICAgYXJvdW5kIHRoZSByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IGRvIHRoZSBzZW5kaW5nLCBhbmQgbm90IGFsbG93ZWQgdG8KICAgICBwcm9wYWdhdGUgYWJvdmUgdGhlIGNhbGxlci4gIFtSb3kgRmllbGRpbmddCgogICopIG1vZF9hdXRoX2Fub24gcmVxdWlyZWQgYW4gQCBvciBhIC4gaW4gdGhlIGVtYWlsIGFkZHJlc3MsIG5vdCBib3RoLgogICAgIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBwZXJfZGlyX2RlZmF1bHRzIHdlcmVuJ3Qgc2V0IGNvcnJlY3RseSB1bnRpbCBkaXJlY3Rvcnlfd2FsayBmb3IKICAgICBuYW1lLWJhc2VkIHZob3N0cy4gIFRoaXMgZml4ZXMgYW4gb2JzY3VyZSBidWcgd2l0aCB0aGUgd3JvbmcgY29uZmlnCiAgICAgaW5mbyBiZWluZyB1c2VkIGZvciB2aG9zdHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBpcCBhcyB0aGUgc2VydmVyLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgSW1wcm92ZWQgZ2VuZXJhdGlvbiBvZiBtb2R1bGVzL01ha2VmaWxlIHRvIGJlIG1vcmUgZ2VuZXJpYyBmb3IKICAgICBuZXcgbW9kdWxlIGRpcmVjdG9yaWVzLiBbS2VuIENvYXIsIENodWNrIE11cmNrbywgUm95IEZpZWxkaW5nXQoKICAqKSBHZW5lcmF0ZSBtYWtlZmlsZSBkZXBlbmRlbmN5IGZvciBDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBhY3R1YWwKICAgICBuYW1lIGdpdmVuIHdoZW4gcnVubmluZyB0aGUgQ29uZmlndXJlIHByb2Nlc3MuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCB2aG9zdCBlcnJvciBsb2cgbm90IGJlaW5nIHNldCBwcmlvciB0bwogICAgIGluaXRpYWxpemluZyB2aXJ0dWFsIGhvc3RzLiBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIGluZmluaXRlIGxvb3Agd2hlbiBhIHRyYWlsaW5nIHNsYXNoIGlzIGluY2x1ZGVkIGFmdGVyIGEgdHlwZSBtYXAKICAgICBmaWxlIFVSTCAoZXh0cmEgcGF0aCBpbmZvKS4gW1BldHIgTGFtcGFdCgogICopIEZpeGVkIHNlcnZlciBzdGF0dXMgdXBkYXRpbmcgb2YgcGVyLWNvbm5lY3Rpb24gY291bnRlcnMuIFtSb3kgRmllbGRpbmddCgogICopIEFkZCBkb2N1bWVudGF0aW9uIGZvciBETlMgaXNzdWVzIChyZWxpYWJpbGl0eSBhbmQgc2VjdXJpdHkpLCBhbmQgdHJ5CiAgICAgdG8gZXhwbGFpbiB0aGUgdmlydHVhbCBob3N0IG1hdGNoaW5nIHByb2Nlc3MuICBbRGVhbiBHYXVkZXRdCgogICopIFRyeSB0byBjb250aW51ZSBncmFjZWZ1bGx5IGJ5IGRpc2FibGluZyB0aGUgdmhvc3QgaWYgYSBETlMgbG9va3VwCiAgICAgZmFpbHMgd2hpbGUgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbXByb3ZlZCBjYWxscyB0byBzZXRzb2Nrb3B0LiAgW1JveSBGaWVsZGluZ10KCiAgKikgTmVnb3RpYXRpb24gY2hhbmdlczogRG9uJ3Qgb3V0cHV0IGVtcHR5IGNvbnRlbnQtdHlwZSBpbiB2YXJpYW50IGxpc3Q7CiAgICAgT3V0cHV0IGNoYXJzZXQgaW4gdmFyaWFudCBsaXN0OyBSZXR1cm4gc29vbmVyIGZyb20gaGFuZGxlX211bHRpKCkgaWYKICAgICBubyB2YXJpYW50cyBmb3VuZDsgQWRkIGhhbmRsaW5nIG9mICcqJyB3aWxkY2FyZCBpbiBBY2NlcHQtQ2hhcnNldC4KICAgICBbUGV0ciBMYW1wYSBhbmQgUGF1bCBTdXR0b25dCgogICopIEZpeGVkIG92ZXJsYXlpbmcgb2YgcmVxdWVzdC9zdWItcmVxdWVzdCBub3RlcyBhbmQgaGVhZGVycyBpbgogICAgIG1vZF9uZWdvdGlhdGlvbi4gIFtEZWFuIEdhdWRldF0KCiAgKikgSWYgdHdvIHZhcmlhbnRzJyBjaGFyc2V0IHF1YWxpdHkgYXJlIGVxdWFsIGFuZCBvbmUgaXMgdGhlIGRlZmF1bHQKICAgICBjaGFyc2V0IChpc28tODg1OS0xKSwgdGhlbiBwcmVmZXIgdGhlIHZhcmlhbnQgdGhhdCB3YXMgc3BlY2lmaWNhbGx5CiAgICAgbGlzdGVkIGluIEFjY2VwdC1DaGFyc2V0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuICBbUGV0ciBMYW1wYV0KCiAgKikgTWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiBwdXNoX2FycmF5KCkgLS0gaXQgd291bGQgY29ycnVwdCBtZW1vcnkKICAgICB3aGVuIG5hbGxvYz09MC4gIFtLYWkgUmlza3UgPGtyaXNrdSB0Zi5odXQuZmk+IGFuZCBSb3kgRmllbGRpbmddCgogICopIGludm9rZV9oYW5kbGVyKCkgZG9lc24ndCBoYW5kbGUgbWltZSBhcmd1bWVudHMgaW4gY29udGVudC10eXBlCiAgICAgW1BldHIgTGFtcGFdIFBSIzE2MAoKICAqKSBSZWR1Y2VkIElkZW50aXR5Q2hlY2sgdGltZW91dCB0byAzMCBzZWNvbmRzLCBhcyBwZXIgUkZDIDE0MTMgbWluaW11bS4KICAgICBbS2VuIENvYXJdCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBFcnJvckRvY3VtZW50IG5vdCB3b3JraW5nIGZvciB2aXJ0dWFsIGhvc3RzCiAgICAgZHVlIHRvIG9uZSBvZiB0aGUgcGVyZm9ybWFuY2UgY2hhbmdlcyBpbiAxLjJiNy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBMb2cgYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBnZXQgYSByZXF1ZXN0IGhlYWRlciB0aGF0IGlzIHRvbyBsb25nLAogICAgIHNpbmNlIGl0IG1heSBpbmRpY2F0ZSBhIGJ1ZmZlciBvdmVyZmxvdyBhdHRhY2suIFtNYXJjIFNsZW1rb10KCiAgKikgTWFkZSBpc191cmwoKSBhbGxvdyAiWy0uK2EtekEtWjAtOV0rOiIgYXMgYSB2YWxpZCBzY2hlbWUgYW5kCiAgICAgbm90IHJlamVjdCBVUkxzIHdpdGhvdXQgYSBkb3VibGUtc2xhc2gsIGFzIHBlciBSRkMyMDY4IHNlY3Rpb24gMy4yLgogICAgIFtLZW4gQ29hcl0gUFIgIzE0NiwgIzE4NwoKICAqKSBBZGRlZCB0YWJsZSBlbnRyeSBwbGFjZWhvbGRlciBmb3IgbmV3IGhlYWRlcl9wYXJzZXIgY2FsbGJhY2sKICAgICBpbiBhbGwgb2YgdGhlIGRpc3RyaWJ1dGVkIG1vZHVsZXMuIFtLZW4gQ29hcl0gUFIgIzE5MQoKICAqKSBBbGxvdyBmb3IgY2dpIGZpbGVzIHdpdGhvdXQgdGhlIC5FWEUgZXh0ZW5zaW9uIG9uIHRoZW0gdW5kZXIgT1MvMi4KICAgICBbR2FyZXkgU21pbGV5XSBQUiAjNTkKCiAgKikgRml4ZWQgZXJyb3IgbWVzc2FnZSB3aGVuIHJlc291cmNlIGlzIG5vdCBmb3VuZCBhbmQgVVJMIGNvbnRhaW5zCiAgICAgcGF0aCBpbmZvLiBbUGV0ciBMYW1wYSBhbmQgRGVhbiBHYXVkZXRdIFBSICM0MAoKICAqKSBGaXhlZCB1c2VyIGFuZCBzZXJ2ZXIgY29uZnVzaW9uIG92ZXIgd2hhdCBzaG91bGQgYmUgYSB2aXJ0dWFsIGhvc3QKICAgICBhbmQgd2hhdCBpcyB0aGUgbWFpbiBzZXJ2ZXIsIHJlc3VsdGluZyBpbiBhY2Nlc3MgdG8gc29tZXRoaW5nCiAgICAgb3RoZXIgdGhhbiB0aGUgbmFtZSBkZWZpbmVkIGluIHRoZSB2aXJ0dWFsaG9zdCBkaXJlY3RpdmUgKGJ1dAogICAgIHdpdGggdGhlIHNhbWUgSVAgYWRkcmVzcykgZmFpbGluZy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBVcGRhdGVkIG1vZF9yZXdyaXRlIHRvIHZlcnNpb24gMy4wLjIsIHdoaWNoOiBmaXhlcyBjb21waWxlIGVycm9yIG9uCiAgICAgQUlYOyBpbXByb3ZlcyB0aGUgcmVkaXJlY3Rpb24gc3R1ZmYgdG8gZW5hYmxlIHRoZSB1c2VycyB0byBnZW5lcmFsbHkKICAgICByZWRpcmVjdCB0byBodHRwLCBodHRwcywgZ29waGVyIGFuZCBmdHA7IGFkZGVkIFRJTUUgdmFyaWFibGUgZm9yCiAgICAgUmV3cml0ZUNvbmQgd2hpY2ggZXhwYW5kcyB0byBZWVlZTU1EREhITU1TUyBzdHJpbmdzIGFuZCBhZGRlZCB0aGUKICAgICBzcGVjaWFsIHBhdHRlcm5zID5TVFJJTkcsIDxTVFJJTkcgYW5kID1TVFJJTkcgdG8gUmV3cml0ZUNvbmQsIHdoaWNoCiAgICAgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAle1RJTUV9IG9yIG90aGVyIHZhcmlhYmxlcyB0byBjcmVhdGUKICAgICB0aW1lLWRlcGVuZGVudCByZXdyaXRpbmcgcnVsZXMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBicHVzaGZkKCkgbm8gbG9uZ2VyIG5vdGVzIGNsZWFudXBzIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpdCBpcyBoYW5kZWQuCiAgICAgTW9kdWxlIGF1dGhvcnMgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZWlyIGNvZGUgZm9yIHByb3BlciBjbGVhbnVwIHRvIHRha2UKICAgICBwbGFjZSAodGhhdCBpcywgY2FsbCBub3RlX2NsZWFudXBzX2Zvcl9mZCgpKS4gVGhpcyBjaGFuZ2UgZml4ZXMgcHJvYmxlbXMKICAgICB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgYmVpbmcgZXJyb25lb3VzbHkgY2xvc2VkIHdoZW4gdGhlIHByb3h5IG1vZHVsZSB3YXMKICAgICBpbiB1c2UuIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVnIGluIHN1ZXhlYyByZWludHJvZHVjZWQgYnkgY2hhbmdlcyBpbiAxLjJiNyB3aGljaCBhbGxvd3MKICAgICBpbml0Z3JvdXBzKCkgdG8gaG9zZSB0aGUgZ3JvdXAgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBsYXRlcgogICAgIGNvbXBhcmlzb25zLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGwgdG8gdmFfZW5kKCkgaW4gY3JlYXRlX2FyZ3YoKSB3aGljaAogICAgIGNhdXNlZCBhIFNFR1Ygb24gc29tZSBzeXN0ZW1zLgoKICAqKSBVc2UgcHJvcGVyIE1BWEhPU1ROQU1FTEVOIHN5bWJvbCBmb3IgbGltaXRpbmcgbGVuZ3RoIG9mIHNlcnZlciBuYW1lLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQ2xlYXIgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbGlzdGVuZXJzLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgSW1wcm92ZWQgaGFuZGxpbmcgb2YgSVAgYWRkcmVzcyBhcyBhIHZpcnR1YWxob3N0IGFkZHJlc3MgYW5kCiAgICAgaW50cm9kdWNlZCAiX2RlZmF1bHRfIiBhcyBhIHN5bm9ueW0gZm9yIHRoZSBkZWZhdWx0IHZob3N0IGNvbmZpZy4KICAgICBbRGVhbiBHYXVkZXRdIFBSICMyMTIKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjcKCiAgKikgUG9ydCB0byAgVVhQL0RTKFYyMCkgW1Rvc2hpYWtpIE5vbXVyYSA8bm9tIHlrLmZ1aml0c3UuY28uanA+XQoKICAqKSB1bnNldCBDb250ZW50LUxlbmd0aCBpZiBjaHVua2VkIChSRkMtMjA2OCkgW1BldHIgTGFtcGFdCgogICopIG1vZF9uZWdvdGlhdGlvbiBmaXhlcyBbUGV0ciBMYW1wYV0gUFIjMTU3LCBQUiMxNTgsIFBSIzE1OQogICAgIC0gcmVwbGFjZSBwcm90b2NvbCByZXNwb25zZSBudW1iZXJzIHdpdGggc3ltYm9scwogICAgIC0gc2F2ZSB2YXJpYW50LWxpc3QgaW50byBtYWluIHJlcXVlc3Qgbm90ZXMKICAgICAtIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSBmcm9tIHN1YnJlcXVlc3RzCiAgICAgLSBtZXJnZSBub3RlcywgaGVhZGVyc19vdXQgYW5kIGVycl9oZWFkZXJzX291dAoKICAqKSBjaGFuZ2VkIHN0YXR1cyBjaGVjayBtYXNrIGluIHByb3h5X2h0dHAuYyBmcm9tICJIVFRQLyMuIyAjIyMgKiIgdG8KICAgICAiSFRUUC8jLiMgIyMjKiIgdG8gYmUgbW9yZSBsZW5pZW50IGFib3V0IHdoYXQgd2UgYWNjZXB0LgogICAgIFtDaHVjayBNdXJja29dCgogICopIG1vcmUgcHJveHkgRlRQIGJ1ZyBmaXhlczoKICAgICAtIENoYW5nZWQgc2VuZF9kaXIoKSB0byByZW1vdmUgdXNlci9wYXNzd2QgZnJvbSBkaXNwbGF5ZWQgVVJMLgogICAgIC0gQ2hhbmdlZCBsb2dpbiBlcnJvciBtZXNzYWdlcyB0byBiZSBtb3JlIGRlc2NyaXB0aXZlLgogICAgIC0gcmVtb3ZlIHNldHRpbmcgb2YgU09fREVCVUcgc29ja2V0IG9wdGlvbgogICAgIC0gTWFrZSBmdHBfZ2V0cmMoKSBtb3JlIGxlbmllbnQgYWJvdXQgbXVsdGlsaW5lIHJlc3BvbnNlcywKICAgICAgIHNwZWNpZmljYWxseSwgMjMwIHJlc3BvbnNlcyB3aGljaCBkb24ndCBoYXZlIGNvbnRpbnVhdGlvbiAyMzAtCiAgICAgICBvbiBlYWNoIGxpbmUpLiBUaGVzZSBzZWVtIHRvIGJlIGFsbCBOVCBGVFAgc2VydmVycywgYW5kIHdoaWxlCiAgICAgICBwZXJoYXBzIHF1ZXN0aW9uYWJsZSwgdGhleSBhcHBlYXIgdG8gYmUgbGVnYWwgYnkgUkZDIDk1OS4KICAgICAtIEFkZCBtaXNzaW5nIGtpbGxfdGltZW91dCgpIGFmdGVyIHRyYW5zZmVyIHRvIHVzZXIgY29tcGxldGVzLgogICAgIFtDaHVjayBNdXJja29dCgogICopIEZpeGVkIHByb2JsZW0gd2hlcmUgYSBidXN5IHNlcnZlciBjb3VsZCBoYW5nIHdoZW4gcmVzdGFydGluZwogICAgIGFmdGVyIGJlaW5nIHNlbnQgYSBTSUdIVVAgZHVlIHRvIGNoaWxkIHByb2Nlc3NlcyBub3QgZXhpdGluZy4KICAgICBbTWFyYyBTbGVta29dCgogICopIE1vZGlmeSBtb2RfaW5jbHVkZSBlc2NhcGluZyBzbyBhICdcJyBvbmx5IHNpZ25pZmllcyBhbiBlc2NhcGVkCiAgICAgY2hhcmFjdGVyIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBvbmUgdGhhdCBuZWVkcwogICAgIGVzY2FwaW5nLiAgW0JlbiBMYXVyaWVdCgogICopIEVsaW1pbmF0ZWQgcG9zc2libGUgaW5maW5pdGUgbG9vcCBpbiBtb2RfaW1hcCB3aGVuIHJlbGF0aXZlIFVSTHMgYXJlCiAgICAgdXNlZCB3aXRoIGEgJ2Jhc2UnIGRpcmVjdGl2ZSB0aGF0IGRvZXMgbm90IGhhdmUgYSAnLycgaW4gaXQuCiAgICAgW01hcmMgU2xlbWtvLCByZXBvcnRlZCBieSBPbm5vIFdpdHZsaWV0IDxvbm5vIHRjLmhzYS5ubD5dCgogICopIFJlZHVjZWQgdGhlIGRlZmF1bHQgdGltZW91dCBmcm9tIDEyMDAgc2Vjb25kcyB0byAzMDAsIGFuZCB0aGUKICAgICBvbmUgaW4gdGhlIHNhbXBsZSBjb25maWdmaWxlIGZyb20gNDAwIHRvIDMwMC4gIFtNYXJjIFNsZW1rb10KCiAgKikgU3RvcCB2YnByaW50ZiBmcm9tIGNyYXNoaW5nIGlmIGdpdmVuIGEgTlVMTCBzdHJpbmcgcG9pbnRlcjsKICAgICBwcmludCAobnVsbCkgaW5zdGVhZC4gIFtLZW4gQ29hcl0KCiAgKikgRG9uJ3QgZGlzYWJsZSBOYWdsZSBhbGdvcml0aG0gaWYgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBUQ1BfTk9ERUxBWS4KICAgICBbTWFyYyBTbGVta28gYW5kIFJveSBGaWVsZGluZ10KCiAgKikgRml4ZWQgcHJvYmxlbSB3aXRoIG1vZF9jZ2ktZ2VuZXJhdGVkIGludGVybmFsIHJlZGlyZWN0cyB0cnlpbmcgdG8KICAgICByZWFkIHRoZSByZXF1ZXN0IG1lc3NhZ2UtYm9keSB0d2ljZS4gW0FyY2hpZSBDb2JicyBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBSZWR1Y2VkIHRpbWVvdXQgb24gbGluZ2VyaW5nIGNsb3NlLCByZW1vdmVkIHBvc3NpYmlsaXR5IG9mIGEgYmxvY2tlZAogICAgIHJlYWQgY2F1c2luZyB0aGUgY2hpbGQgdG8gaGFuZywgYW5kIHN0b3BwZWQgbG9nZ2luZyBvZiBlcnJvcnMgaWYKICAgICB0aGUgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQgKHJlc2V0IGJ5IGNsaWVudCkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBSZWFycmFuZ2VkIG1haW4gY2hpbGQgbG9vcCB0byByZW1vdmUgZHVwbGljYXRpb24gb2YgY29kZSBpbgogICAgIHNlbGVjdC9hY2NlcHQgYW5kIGtlZXAtYWxpdmUgcmVxdWVzdHMsIGZpeGVkIHNldmVyYWwgYnVncyByZWdhcmRpbmcKICAgICBjaGVja2luZyBzY29yZWJvYXJkX2ltYWdlIGZvciBleGl0IGluZGljYXRpb24gYW5kIGZhaWx1cmUgdG8KICAgICBhY2NvdW50IGZvciBhbGwgc3VjY2VzcyBjb25kaXRpb25zIGFuZCB0cmFwIGFsbCBlcnJvciBjb25kaXRpb25zLAogICAgIHByZXZlbnRlZCBtdWx0aXBsZSBmbHVzaGVzIGJlZm9yZSBjbG9zaW5nIHRoZSBzb2NrZXQ7IGNsb3NlIHRoZSBlbnRpcmUKICAgICBzb2NrZXQgYnVmZmVyIGluc3RlYWQgb2YganVzdCBvbmUgZGVzY3JpcHRvciwgcHJldmVudCBsb2dnaW5nIG9mCiAgICAgRVBST1RPIGFuZCBFQ09OTkFCT1JURUQgb24gcGxhdGZvcm1zIHdoZXJlIHN1cHBvcnRlZCwgYW5kIGdlbmVyYWxseQogICAgIGltcHJvdmVkIHJlYWRhYmlsaXR5LiAgW1JveSBGaWVsZGluZ10KCiAgKikgRXh0ZW5zaXZlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gQ2xlYW5lZCB1cCBpbmVmZmljaWVudCB1c2Ugb2YKICAgICBhdXRvIGluaXRpYWxpemVycywgbXVsdGlwbGUgaXNfbWF0Y2hleHAgY2FsbHMgb24gYSBzdGF0aWMgc3RyaW5nLAogICAgIGFuZCBleGNlc3NpdmUgbWVyZ2luZyBvZiByZXNwb25zZV9jb2RlX3N0cmluZ3MuIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkZWQgZG91YmxlLWJ1ZmZlcmluZyB0byBtb2RfaW5jbHVkZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uCiAgICAgc2VydmVyLXNpZGUgaW5jbHVkZXMuIFtNYXJjIFNsZW1rb10KCiAgKikgU2V2ZXJhbCBmaXhlcyBmb3Igc3VleGVjIHdyYXBwZXIuIFtSYW5keSBUZXJidXNoXQogICAgIC0gTWFrZSB3cmFwcGVyIHdvcmsgZm9yIGZpbGVzIG9uIE5GUyBmaWxlc3lzdGVtLgogICAgIC0gRml4IHBvcnRhYmlsaXR5IHByb2JsZW0gb2YgTUFYUEFUSExFTi4KICAgICAtIEZpeCBhcnJheSBvdmVycnVuIHByb2JsZW0gaW4gY2xlYW5fZW52KCkuCiAgICAgLSBGaXggYWxsb2NhdGlvbiBvZiBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCgogICopIFJlbW92ZWQgZXh0cmFuZW91cyBibGFuayBsaW5lIGlzIGRlc2NyaXB0aW9uIG9mIG1vZF9zdGF0dXMgY2hhcnMuCiAgICAgW0t1cnQgS29obGVyXQoKICAqKSBMb2dnaW5nIG9mIGVycm9ycyBmcm9tIHRoZSBjYWxsX2V4ZWMgcm91dGluZSBzaW1wbHkgd2VudCBub3doZXJlLAogICAgIHNpbmNlIHRoZSBsb2dmaWxlIGZkIGhhcyBiZWVuIGNsb3NlZCwgc28gbm93IHdlIHNlbmQgdGhlbSB0byBzdGRlcnIuCiAgICAgW0hhcmFsZCBULiBBbHZlc3RyYW5kXQoKICAqKSBGaXhlZCBjb3JlIGR1bXAgd2hlbiBEb2N1bWVudFJvb3QgaXMgYSBDR0kuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IDxnZWRkaXMgdGVzc2VyYWUuY29tPl0KCiAgKikgRml4ZWQgcG90ZW50aWFsIGZpbGUgZGVzY3JpcHRvciBsZWFrIGluIG1vZF9hc2lzOyB1cGRhdGVkIGl0IGFuZAogICAgIGh0dHBfY29yZSB0byB1c2UgcGZvcGVuL3BmY2xvc2UgaW5zdGVhZCBvZiBmb3Blbi9mY2xvc2UuCiAgICAgW1JhbmR5IFRlcmJ1c2ggYW5kIFJveSBGaWVsZGluZ10KCiAgKikgRml4ZWQgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50cyBpbiBhcF9zbnByaW50ZigpIG9uIHNvbWUgY2hpcHMgc3VjaAogICAgIGFzIHRoZSBERUMgQWxwaGEgd2hpY2ggaXMgNjQtYml0IGJ1dCB1c2VzIDMyLWJpdCBpbnRzLgogICAgIFtEZWFuIEdhdWRldCBhbmQgS2VuIENvYXJdCgogICopIFJldHVybiBhIDMwMiByZXNwb25zZSBjb2RlIHRvIHRoZSBjbGllbnQgd2hlbiBzZW5kaW5nIGEgcmVkaXJlY3QKICAgICBkdWUgdG8gYSBtaXNzaW5nIHRyYWlsaW5nICcvJyBvbiBhIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGEgMzAxOyBub3cKICAgICBpdCBpcyBjYWNoZWFibGUuIFtNYXJrdXMgR3lnZXJdCgogICopIEZpeCBjb25kaXRpb24gd2hlcmUsIGlmIGEgYmFkIGRpcmVjdGl2ZSBvY2N1cnMgaW4gLmh0YWNjZXNzLCBhbmQKICAgICBzdWJfcmVxdWVzdCgpIGdvZXMgZmlyc3QgdG8gdGhpcyBkaXJlY3RvcnksIHRoZW4gbG9nX3JlYXNvbigpIHdpbGwKICAgICBTSUdTRUdWIGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIGluaXRpYWxpemVkIHItPnBlcl9kaXJfY29uZmlnLgogICAgIFtQUiMxNjIgZnJvbSBQZXRyIExhbXBhLCBmaXggYnkgTWFyYyBTbGVta28gYW5kIERlYW4gR2F1ZGV0XQoKICAqKSBGaXggaGFuZGxpbmcgb2YgbGFuZ19pbmRleCBpbiBpc192YXJpYW50X2JldHRlcigpLiAgVGhpcyB3YXMKICAgICBjYXVzaW5nIHByb2JsZW1zIHdoaWNoIHJlc3VsdGVkIGluIHRoZSBzZXJ2ZXIgc2VuZGluZyB0aGUKICAgICB3cm9uZyBsYW5ndWFnZSBkb2N1bWVudCBpbiBzb21lIGNhc2VzLiBbUGV0ciBMYW1wYV0KCiAgKikgUmVtb3ZlIGZyZWUoKSBmcm9tIGNsZWFuX2VudigpIGluIHN1ZXhlYyB3cmFwcGVyLiBUaGlzIHdhcyBudWtpbmcKICAgICB0aGUgY2xlYW4gZW52aXJvbm1lbnQgb24gc29tZSBzeXN0ZW1zLgoKICAqKSBUd2VhayBieXRlc2VydmluZyBjb2RlIChlLmcuIHNlcnZpbmcgUERGIGZpbGVzKSB0byB3b3JrIGFyb3VuZAogICAgIGJ1Z3MgaW4gTmV0c2NhcGUgTmF2aWdhdG9yIGFuZCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIuCiAgICAgRW1pdCBDb250ZW50LUxlbmd0aCBoZWFkZXIgd2hlbiBzZW5kaW5nIG11bHRpcGFydC9ieXRlcmFuZ2VzLgogICAgIFtBbGV4ZWkgS29zdXRdCgogICopIFBvcnQgdG8gSEktVVgvV0UyLiBbTmljayBNYWNsYXJlbl0KCiAgKikgUG9ydCB0byBIUCBNUEUgb3BlcmF0aW5nIHN5c3RlbSBmb3IgSFAgMzAwMCBtYWNoaW5lcwogICAgIFtNYXJrIEJpeGJ5IDxtYXJrYiBjY2NkLmVkdT5dCgogICopIEZpeGVkIGJ1ZyB3aGljaCBjYXVzZWQgYSBzZWdtZW50YXRpb24gZmF1bHQgaWYgb25seSBvbmUgYXJndW1lbnQKICAgICBnaXZlbiB0byBSTGltaXQqIGRpcmVjdGl2ZXMuIFtFZCBLb3J0aG9mXQoKICAqKSBDb250aW51ZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYWZ0ZXIgMjA0IG9yIDMwNCByZXNwb25zZS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBJbXByb3ZlZCBidWZmZXJlZCBvdXRwdXQgdG8gdGhlIGNsaWVudCBieSBkZWxheWluZyB0aGUgZmx1c2ggZGVjaXNpb24KICAgICB1bnRpbCB0aGUgQlVGRiBjb2RlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHJlYWQgdGhlIG5leHQgcmVxdWVzdC4KICAgICBUaGlzIGZpeGVzIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIDEuMmI1IHdpdGggY2xpZW50cyB0aGF0IHNlbmQKICAgICBhbiBleHRyYSBDUkxGIGFmdGVyIGEgUE9TVCByZXF1ZXN0LiBBbHNvIGltcHJvdmVkIGNodW5rZWQgb3V0cHV0CiAgICAgcGVyZm9ybWFuY2UgYnkgY29tYmluaW5nIHdyaXRlcyB1c2luZyB3cml0ZXYoKSBhbmQgcmVtb3ZpbmcgYXMKICAgICBtYW55IGJmbHVzaCgpIGNhbGxzIGFzIHBvc3NpYmxlLiAgTk9URTogUGxhdGZvcm1zIHdpdGhvdXQgd3JpdGV2KCkKICAgICBtdXN0IGFkZCAtRE5PX1dSSVRFViB0byB0aGUgY29tcGlsZXIgQ0ZMQUdTLCBlaXRoZXIgaW4gQ29uZmlndXJhdGlvbgogICAgIG9yIENvbmZpZ3VyZSwgdW5sZXNzIHdlIGhhdmUgYWxyZWFkeSBkb25lIHNvLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBtb2RfcmV3cml0ZSBidWcgd2hpY2ggdHJ1bmNhdGVkIHRoZSByZXdyaXR0ZW4gVVJMIFtNYXJjIFNsZW1rb10KCiAgKikgRml4ZWQgbW9kX2luZm8gb3V0cHV0IGNvcnJ1cHRpb24gYnVnIGludHJvZHVjZWQgYnkgYnVmZmVyIG92ZXJmbG93CiAgICAgZml4ZXMuIFtEZWFuIEdhdWRldF0KCiAgKikgRml4ZWQgaHR0cF9wcm90b2NvbCB0byBjb3JyZWN0bHkgb3V0cHV0IGFsbCBIVFRQLzEuMSBoZWFkZXJzLCBpbmNsdWRpbmcKICAgICBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIDMwNCByZXNwb25zZS4gIFtQYXVsIFN1dHRvbl0KCiAgKikgSW1wcm92ZWQgaGFuZGxpbmcgb2YgVFJBQ0UgbWV0aG9kIGJ5IGJ5cGFzc2luZyBub3JtYWwgbWV0aG9kIGhhbmRsaW5nCiAgICAgYW5kIGhlYWRlciBwYXJzaW5nIHJvdXRpbmVzOyBmaXhlZCBBbGxvdyByZXNwb25zZSB0byBhbHdheXMgYWxsb3cgVFJBQ0UuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiB0aGUgcmVnZXggbGlicmFyeS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBDbGVhbmVkLXVwIHNvbWUgb2YgdGhlIGdlbmVyYXRlZCBIVE1MLiBbS2VuIENvYXJdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI2CgogICopIEFsbG93IHdoaXRlc3BhY2UgaW4gaW1hZ2VtYXAgbWFwZmlsZSBjb29yZGluYXRlcy4gW01hcmMgU2xlbWtvXQoKICAqKSBGaXggdHlwbyBpbnRyb2R1Y2VkIGluIGZpeCBmb3IgcG90ZW50aWFsIGluZmluaXRlIGxvb3AgYXJvdW5kCiAgICAgYWNjZXB0KCkgaW4gY2hpbGRfbWFpbigpLiBUaGlzIGNoYW5nZSBjYXVzZWQgdGhlIHJldiB0byAxLjJiNi4KICAgICAxLjJiNSB3YXMgbmV2ZXIgYSBwdWJsaWMgYmV0YS4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjUKCiAgKikgQ2hhbmdlIEtlZXBBbGl2ZSBzZW1hbnRpY3MgKE9ufE9mZiBpbnN0ZWFkIG9mIGEgbnVtYmVyKSwgYWRkCiAgICAgTWF4S2VlcEFsaXZlUmVxdWVzdHMgZGlyZWN0aXZlLiBbQWxleGVpIEtvc3V0XQoKICAqKSBWYXJpb3VzIE5lWFQgY29tcGlsYXRpb24gcGF0Y2hlcywgYXMgd2VsbCBhcyBhIGNoYW5nZSBpbgogICAgIHJlZ2V4L3JlZ2NvbXAuYyBzaW5jZSB0aGF0IGZpbGUgYWxzbyB1c2VkIGEgTkVYVCBkZWZpbmUuCiAgICAgW0FuZHJlYXMgS29lbmlnXQoKICAqKSBBbGxvdyAqIHRvIHRlcm1pbmF0ZSB0aGUgZW5kIG9mIGEgZGlyZWN0b3J5IG1hdGNoIGluIG1vZF9kaXIuCiAgICAgQWxsb3dzIC9+KiB0byBtYXRjaCBmb3IgYm90aCAvfmpvZSBhbmQgL35qb2UvLiBbRGF2aWQgQnJvbmRlcl0KCiAgKikgRG9uJ3QgY2FsbCBjYW5fZXhlYygpIGlmIHN1ZXhlY19lbmFibGVkLiBDYWxsaW5nIHRoaXMgcmVxdWlyZXMKICAgICBzY3JpcHRzIGV4ZWN1dGVkIGJ5IHRoZSBzdWV4ZWMgd3JhcHBlciB0byBiZSB3b3JsZCBleGVjdXRhYmxlLCB3aGljaAogICAgIGRlZmVhdHMgb25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIHJ1bm5pbmcgdGhlIHdyYXBwZXIuIFtSYW5keSBUZXJidXNoXQoKICAqKSBQb3J0YWJpbGl0eSBGaXg6IElSSVggY29tcGxhaW5lZCB3aXRoICdtYWtlIGNsZWFuJyBhYm91dCAqcHVyZSogKHJlbW92ZWQpCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIE1pZ3JhdGlvbiBmcm9tIHNwcmludGYoKSB0byBzbnByaW50ZigpIHRvIGF2b2lkIGJ1ZmZlcgogICAgIG92ZXJmbG93cy4gW01hcmMgU2xlbWtvXQoKICAqKSBQcm92aWRlIHBvcnRhYmxlIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24gKGFwX3NucHJpbnRmKQogICAgIGFzIHdlbGwgYXMgKmN2dCBmYW1pbHkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQb3J0YWJpbGl0eSBGaXg6IE5lWFQgbGFja3MgdW5pc3RkLmggc28gd2Ugd3JhcCBpdCdzIGluY2x1c2lvbgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZW1vdmUgbW9kX2Zhc3RjZ2kuYyBmcm9tIHRoZSBkaXN0cmlidXRpb24uIFRoaXMgbW9kdWxlIGFwcGVhcnMKICAgICB0byBiZSBtYWludGFpbmVkIG1vcmUgdGhyb3VnaCB0aGUgT3BlbiBNYXJrZXQgY2hhbm5lbHMgYW5kIHNob3VsZAogICAgIGNvbnRpbnVlIHRvIGJlIGVhc2lseSBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5mYXN0Y2dpLmNvbS8KCiAgKikgRml4ZWQgYnVnIGluIG1vZHVsZXMvTWFrZWZpbGUgdGhhdCB3b3VsZG4ndCBhbGxvdyBidWlsZGluZyBpbiBtb3JlCiAgICAgdGhhbiBvbmUgc3ViZGlyZWN0b3J5IChvciBjbGVhbmluZywgZWl0aGVyKS4gW0plcmVteSBMYWlkbWFuXQoKICAqKSBtb2RfaW5mbyBhc3N1bWVkIHRoYXQgdGhlIGNvbmZpZyBmaWxlcyB3ZXJlIHJlbGF0aXZlIHRvIFNlcnZlclJvb3QuCiAgICAgW0tlbiB0aGUgUm9kZW50XQoKICAqKSBDR0kgc2NyaXB0cyBjYWxsZWQgYXMgYW4gZXJyb3IgZG9jdW1lbnQgcmVzdWx0aW5nIGZyb20gZmFpbGVkCiAgICAgQ0dJIGV4ZWN1dGlvbiB3b3VsZCBoYW5nIHdhaXRpbmcgZm9yIFBPU1QnZWQgZGF0YS4gW1JvYiBIYXJ0aWxsXQoKICAqKSBMb2cgcmVhc29uIHdoZW4gbW9kX2RpciByZXR1cm5zIGFjY2VzcyBIVFRQX0ZPUkJJRERFTgogICAgIFtLZW4gdGhlIFJvZGVudF0KCiAgKikgUHJvcGVybHkgY2hlY2sgZXJybm8gdG8gcHJldmVudCBkaXNwbGF5IG9mIGEgZGlyZWN0b3J5IGluZGV4CiAgICAgd2hlbiBzZXJ2ZXIgcmVjZWl2ZXMgYSBsb25nIGVub3VnaCBVUkwgdG8gY29uZnVzZSBzdGF0KCkuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBTZXZlcmFsIHNlY3VyaXR5IGVuaGFuY2VtZW50cyB0byBzdWV4ZWMgd3JhcHBlci4gSXQgaXMgX2hpZ2hseV8KICAgICByZWNvbW1lbmRlZCB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIHZlcnNpb25zIG9mIHRoZSB3cmFwcGVyCiAgICAgYmUgcmVwbGFjZWQgd2l0aCB0aGlzIHZlcnNpb24uICBbUmFuZHkgVGVyYnVzaCwgSmFzb24gRG91cl0KCiAgICAgICAgLSB+dXNlciBleGVjdXRpb24gbm93IHByb3Blcmx5IHJlc3RyaWN0ZWQgdG8gfnVzZXIncyBob21lCiAgICAgICAgICBkaXJlY3RvcnkgYW5kIGJlbG93LgogICAgICAgIC0gZXhlY3V0aW9uIHJlc3RyaWN0ZWQgdG8gVUlEL0dJRCA+IDEwMAogICAgICAgIC0gcmVzdHJpY3QgcGFzc2VkIGVudmlyb25tZW50IHRvIGtub3duIHZhcmlhYmxlcwogICAgICAgIC0gY2FsbCBzZXRnaWQoKSBiZWZvcmUgaW5pdGdyb3VwcygpIChwb3J0YWJpbGl0eSBmaXgpCiAgICAgICAgLSByZW1vdmUgdXNlIG9mIHNldGVudigpIChwb3J0YWJpbGl0eSBmaXgpCgogICopIEFkZCBIVFRQLzEuMCByZXNwb25zZSBmb3JjaW5nLiBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGFjY2VzcyBjb250cm9sIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcmZsdXNoKCkgZnVuY3Rpb24uIFtBbGV4ZWkgS29zdXRdCgogICopIHJlbW92ZSBkdXBsaWNhdGUgcGNhbGxvYygpIGNhbGwgaW4gbmV3X2Nvbm5lY3Rpb24oKS4KCiAgKikgRml4IGluY29ycmVjdCBjb21wYXJpc29uIHdoaWNoIGNvdWxkIGFsbG93IG51bWJlciBvZiBjaGlsZHJlbiA9CiAgICAgTWF4Q2xpZW50cyArIDEgaWYgbGVzcyB0aGFuIEhBUkRfU0VSVkVSX0xJTUlULiBBbHNvIGZpeCBwb3RlbnRpYWwKICAgICBwcm9ibGVtIGlmIFN0YXJ0U2VydmVycyA+IEhBUkRfU0VSVkVSX0xJTUlULiBbRWQgS29ydGhvZl0KCiAgKikgVXBkYXRlZCBzdXBwb3J0IGZvciBPU2VzIChNYWNoVGVuLCBVTFRSSVgsIFBhcmFnb24sIElTQywgT3BlbkJTRAogICAgIEFJWCBQUy8yLCBDT05WRVhPUy4gW0ppbSBKYWdpZWxza2ldCgogICopIFJlcGxhY2UgaW5zdGFuY2VzIG9mIGluZXRfbnRvYSgpIHdpdGggaW5ldF9hZGRyKCkgZm9yIFByb3h5QmxvY2suCiAgICAgSXQncyBtb3JlIHBvcnRhYmxlLiBbTWFydGluIEtyYWVtZXJdCgogICopIFJlcGxhY2UgcmVmZXJlbmNlcyB0byBtYWtlIGluIE1ha2VmaWxlLnRtcGwgd2l0aCAkKE1BS0UpLgogICAgIFtDaHVjayBNdXJja29dCgogICopIEFkZCBQcm94eUJsb2NrIGRpcmVjdGl2ZSB3L0lQIGFkZHJlc3MgY2FjaGluZy4gQWRkIElQIGFkZHJlc3MKICAgICBjYWNoaW5nIHRvIE5vQ2FjaGUgZGlyZWN0aXZlIGFzIHdlbGwuIFByb3h5QmxvY2sgd29ya3Mgd2l0aCBhbGwKICAgICBoYW5kbGVyczsgTm9DYWNoZSBub3cgYWxzbyB3b3JrcyB3aXRoIEZUUCBmb3IgYW5vbnltb3VzIGxvZ2lucy4KICAgICBTdGlsbCBtb3JlIGNvZGUgY2xlYW51cC4gW0NodWNrIE11cmNrb10KCiAgKikgQWRkICJoZWFkZXIgcGFyc2UiIEFQSSBob29rIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnl0ZSBvcmRlcmluZyBwcm9ibGVtcyBmb3IgUkVNT1RFX1BPUlQgW0NodWNrIE11cmNrb10KCiAgKikgc3VFWEVDIHdyYXBwZXIgd2FzIGZyZWVpbmcgbWVtb3J5IHRoYXQgaGFkIG5vdCBiZWVuIG1hbGxvYydlZC4KCiAgKikgQ29ycmVjdGx5IGFsbG93IGFjY2VzcyBhbmQgYXV0aCBkaXJlY3RpdmVzIGluIDxGaWxlcz4gc2VjdGlvbnMgaW4KICAgICBzZXJ2ZXIgY29uZmlnIGZpbGVzLiBbQWxleGVpIEtvc3V0XQoKICAqKSBGaXggYnVnIHdpdGggU2VydmVyUGF0aCB0aGF0IGNvdWxkIGNhdXNlIGNlcnRhaW4gZmlsZXMgdG8gYmUgbm90CiAgICAgZm91bmQgYnkgdGhlIHNlcnZlci4gW0FsZXhlaSBLb3N1dF0KCiAgKikgRml4IGhhbmRsaW5nIG9mIEVycm9yRG9jdW1lbnQgc28gdGhhdCBpdCBkb2Vzbid0IHJlbW92ZSBhIHRyYWlsaW5nCiAgICAgZG91YmxlLXF1b3RlIGZyb20gdGV4dCBhbmQgc28gdGhhdCBpdCBwcm9wZXJseSBjaGVja3MgZm9yIHVuc3VwcG9ydGVkCiAgICAgc3RhdHVzIGNvZGVzIHVzaW5nIHRoZSBuZXcgaW5kZXhfb2ZfcmVzcG9uc2UgaW50ZXJmYWNlLiBbUm95IEZpZWxkaW5nXQoKICAqKSBNdWx0aXBsZSBmaXhlcyB0byB0aGUgbGluZ2VyaW5nX2Nsb3NlIGNvZGUgaW4gb3JkZXIgdG8gYXZvaWQgYmVpbmcKICAgICBpbnRlcnJ1cHRlZCBieSBhIHN0cmF5IHRpbWVvdXQsIHRvIGF2b2lkIGxpbmdlcmluZyBvbiBhIGNvbm5lY3Rpb24KICAgICB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWJvcnRlZCBvciBuZXZlciByZWFsbHkgZXhpc3RlZCwgdG8gZW5zdXJlIHRoYXQKICAgICB3ZSBzdG9wIGxpbmdlcmluZyBhcyBzb29uIGFzIGFueSBlcnJvciBjb25kaXRpb24gaXMgcmVjZWl2ZWQsIGFuZCB0bwogICAgIHByZXZlbnQgYmVpbmcgc3R1Y2sgaW5kZWZpbml0ZWx5IGlmIHRoZSByZWFkIGJsb2Nrcy4gIEFsc28gaW1wcm92ZXMKICAgICByZXBvcnRpbmcgb2YgZXJyb3IgY29uZGl0aW9ucy4gIFtNYXJjIFNsZW1rbyBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBGaXhlZCBpbml0aWFsaXphdGlvbiBvZiBwYXJhbWV0ZXIgc3RydWN0dXJlIGZvciBzaWdhY3Rpb24uCiAgICAgWzxtZ3lnZXIgaXRyLmNoPiwgQWRyaWFuIEZpbGlwaS1NYXJ0aW5dCgogICopIEZpeGVkIHJlaW5pdGlhbGl6aW5nIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBlYWNoIGNhbGwgdG8gYWNjZXB0IGFuZAogICAgIHNlbGVjdCwgYW5kIHJlbW92ZWQgcG90ZW50aWFsIGZvciBpbmZpbml0ZSBsb29wIGluIGFjY2VwdC4KICAgICBbUm95IEZpZWxkaW5nLCBhZnRlciB1c2VmdWwgUFIgZnJvbSA8YWRyaWFuIHZpcmdpbmlhLmVkdT5dCgogICopIEZpeGVkIGNvbmRpdGlvbiB3aGVyZSwgaWYgYSBjaGlsZCBmYWlscyB0byBmb3JrLCB0aGUgc2NvcmVib2FyZCB3b3VsZAogICAgIGNvbnRpbnVlIHRvIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlci4gRXZlbnR1YWxseSwgdGhlIG1haW4gcHJvY2VzcwogICAgIHdvdWxkIHJlZnVzZSB0byBzdGFydCBuZXcgY2hpbGRyZW4gYmVjYXVzZSBjb3VudF9pZGxlX3NlcnZlcnMoKSB3aWxsCiAgICAgY291bnQgdGhvc2UgU0VSVkVSX1NUQVJUSU5HIGVudHJpZXMgYW5kIHdpbGwgYWx3YXlzIHJlcG9ydCB0aGF0IHRoZXJlCiAgICAgYXJlIGVub3VnaCBpZGxlIHNlcnZlcnMuIFtQaGlsbGlwIFZhbmRyeV0KCiAgKikgRml4ZWQgYnVnIGluIGJjd3JpdGUgcmVnYXJkaW5nIGZhaWx1cmUgdG8gYWNjb3VudCBmb3IgcGFydGlhbCB3cml0ZXMuCiAgICAgQXZvaWRlZCBjYWxsaW5nIGJmbHVzaCgpIHdoZW4gdGhlIGNsaWVudCBpcyBwaXBlbGluaW5nIHJlcXVlc3RzLgogICAgIFJlbW92ZWQgdW5uZWNlc3NhcnkgZmx1c2hlcyBmcm9tIGh0dHBfcHJvdG9jb2wuIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkZWQgZGVzY3JpcHRpb24gb2YgIi4iIG1vZGUgaW4gc2VydmVyLXN0YXR1cyBbSmltIEphZ2llbHNraV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjQKCiAgKikgRml4IHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGluIGFjY2VwdF9tdXRleF9pbml0KCkgdGhhdAogICAgIGNvdWxkIGxlYXZlIGEgc21hbGwgc2VjdXJpdHkgaG9sZSBvcGVuIGFsbG93aW5nIGZpbGVzIHRvIGJlCiAgICAgb3ZlcndyaXR0ZW4gaW4gY2FzZXMgd2hlcmUgdGhlIHNlcnZlciBVSUQgaGFzIHdyaXRlIHBlcm1pc3Npb25zLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgRml4IGF3ayBjb21wYXRpYmlsdHkgcHJvYmxlbSBpbiBDb25maWd1cmUuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggcG9ydGFibGl0eSBwcm9ibGVtIGluIHV0aWxfc2NyaXB0IHdoZXJlIEFSR19NQVggbWF5IG5vdCBiZQogICAgIGRlZmluZWQgZm9yIHNvbWUgc3lzdGVtcy4KCiAgKikgQWRkIGNoYW5nZXMgdG8gYWxsb3cgY29tcGlsYXRpb24gb24gTWFjaHRlbiA0LjAuMyBmb3IgUG93ZXJQQy4KICAgICBbUmFuZGFsIFNjaHdhcnR6XQoKICAqKSBPUy8yIGNoYW5nZXMgdG8gc3VwcG9ydCBhbiBNTUFQIHN0eWxlIHNjb3JlYm9hcmQgZmlsZSBhbmQgVU5JWAogICAgIHN0eWxlIG1hZ2ljICMhIHRva2VuIGZvciBiZXR0ZXIgc2NyaXB0IHBvcnRhYmlsaXR5LiBbR2FyZXkgU21pbGV5XQoKICAqKSBGaXggYnVnIGluIHN1ZXhlYyB3cmFwcGVyIGludHJvZHVjZWQgaW4gYjMgdGhhdCB3b3VsZCBjYXVzZSBmYWlsZWQKICAgICBleGVjdXRpb24gZm9yIH51c2VyZGlyIENHSS4gW0phc29uIERvdXJdCgogICopIEZpeCBpbml0Z3JvdXBzKCkgYnVzaW5lc3MgaW4gc3VleGVjIHdyYXBwZXIuIFtKYXNvbiBEb3VyXQoKICAqKSBGaXggbW9udGggb2ZmIGJ5IG9uZSBpbiBzdWV4ZWMgd3JhcHBlciBsb2dnaW5nLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMzoKCiAgKikgRml4IGVycm9yIGluIG1vZF9jZ2kgd2hpY2ggY291bGQgY2F1c2UgcmVzb3VyY2VzIG5vdCB0byBiZSBwcm9wZXJseQogICAgIGZyZWVkLCBvciB3b3JzZS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggZmluZF9zdHJpbmcoKSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuIFtIb3dhcmQgRmVhcl0KCiAgKikgQWRkIHNldF9mbGFnX3Nsb3QoKSBhdCB0aGUgcmVxdWVzdCBvZiBEaXJrIGFuZCBvdGhlcnMuCiAgICAgW0RpcmsgdmFuR3VsaWtdCgogICopIFN5bmMgbW9kX3Jld3JpdGUgd2l0aCBwYXRjaCBsZXZlbCAxMC4gW1JhbGYgRW5nZWxzY2hhbGxdCgogICopIEFkZCBjaGFuZ2VzIHRvIGltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gZm9yIGludmFsaWQKICAgICBTZXJ2ZXJOYW1lIHBhcmFtZXRlcnMuIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBBZGQgIkF1dGhvcml0YXRpdmUiIGRpcmVjdGl2ZSBmb3IgQXV0aCBtb2R1bGVzIHRoYXQgZG9uJ3QKICAgICBjdXJyZW50bHkgaGF2ZSBpdC4gVGhpcyBnaXZlcyBhZG1pbiBjb250cm9sIHRvIGFzc2lnbiBhdXRob3JpdGF0aXZlCiAgICAgY29udHJvbCB0byBhbiBhdXRoZW50aWNhdGlvbiBzY2hlbWUgYW5kIGFsbG93ICJmYWxsIHRocm91Z2giIGZvcgogICAgIHRob3NlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZXMgdGhhdCBhcmVuJ3QgIkF1dGhvcml0YXRpdmUiIHRoZXJlYnkKICAgICBhbGxvd2luZyBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRvIGJlIGNoYWluZWQuCiAgICAgW0RpcmsgdmFuR3VsaWtdCgogICopIFJlbW92ZSByZXF1aXJlbWVudCBmb3IgUmVzb3VyY2VDb25maWcvQWNjZXNzQ29uZmlnIGlmIG5vdCB1c2luZwogICAgIHRoZSB0aHJlZSBjb25maWcgZmlsZSBsYXlvdXQuIFtSYW5keSBUZXJidXNoXQoKICAqKSBBZGQgUEFTViBtb2RlIHRvIG1vZF9wcm94eSBGVFAgaGFuZGxlci4gW0NodWNrIE11cmNrb10KCiAgKikgQ2hhbmdlcyB0byBzdWV4ZWMgd3JhcHBlciB0byBmaXggdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKICAgICAxLiAgc3ltbGlua2VkIGhvbWVkaXJzIHdpbGwga2lsbCB+dXNlcmRpcnMuCiAgICAgMi4gIGluaXRncm91cHMoKSBvbiBMaW51eCAyLjAueCBjbG9iYmVycyBnci0+Z3JpZC4KICAgICAzLiAgQ0dJIGNvbW1hbmQgbGluZXMgcGFyYW10ZXJzIHByb2JsZW1zCiAgICAgNC4gIHB3LXB3ZGlyIGZvciAiZG9jcm9vdCBjaGVjayIgc3RpbGwgdGhlIGh0dHBkIHVzZXIncyBwdyByZWNvcmQuCiAgICBbUmFuZHkgVGVyYnVzaCwgSmFzb24gRG91cl0KCiAgKikgQ2hhbmdlIGNyZWF0ZV9hcmd2KCkgdG8gYWNjZXB0IHZhcmlhYmxlIGFyZ3VtZW50cy4gVGhpcyBmaXhlcwogICAgIGEgcHJvYmxlbSB3aGVyZSBhcmd1bWVudHMgd2VyZSBub3QgZ2V0dGluZyBwYXNzZWQgdG8gdGhlIENHSSB2aWEKICAgICBhcmd2W10gd2hlbiB0aGUgc3VleGVjIHdyYXBwZXIgd2FzIGFjdGl2ZS4gW1JhbmR5IFRlcmJ1c2gsIEpha2UgQnVjaGhvbHpdCgogICopIENvbGxhcHNlIG11bHRpcGxlIHNsYXNoZXMgaW4gcGF0aCBVUkxzIHRvIHByb3Blcmx5IGFwcGx5CiAgICAgaGFuZGxlcnMgZGVmaW5lZCBieSA8TG9jYXRpb24+LiBbQWxleGVpIEtvc3V0XQoKICAqKSBEZWZpbmUgYSBzYW5lIHNldCBvZiBERUZBVUxUX1VTRVIgYW5kIERFRkFVTFRfR1JPVVAgdmFsdWVzIGZvciBBSVguCgogICopIEltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHJlcXVlc3QgZHVyYXRpb24gdGltaW5ncyBieSBzZXR0aW5nCiAgICAgci0+cmVxdWVzdF90aW1lIGluIHJlYWRfcmVxdWVzdF9saW5lKCkgaW5zdGVhZCBvZiByZWFkX3JlcXVlc3QoKS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFJlc2V0IHRpbWVvdXQgd2hpbGUgcmVhZGluZyB2aWEgZ2V0X2NsaWVudF9ibG9jaygpIGluIG1vZF9jZ2kuYwogICAgIEZpeGVzIHByb2JsZW0gd2l0aCB0aW1lZCBvdXQgdHJhbnNmZXJzIG9mIGxhcmdlIGZpbGVzLiBbUmFzbXVzIExlcmRvcmZdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBwYXNzIGRpZmZlcmVudCBNYWtlZmlsZS50bXBsIGZpbGVzIHRvIENvbmZpZ3VyZQogICAgIHVzaW5nIHRoZSAtbWFrZSBmbGFnLiBbUm9iIEhhcnRpbGxdCgogICopIEZpeCBjb3JlZHVtcCB0cmlnZ2VyZWQgd2hlbiBzZW5kaW5nIGEgU0lHSFVQIHRvIHRoZSBzZXJ2ZXIgY2F1c2VkCiAgICAgYnkgYW4gYXNzZXJ0aW9uIGZhaWx1cmUsIGluIHR1cm4gY2F1c2VkIGJ5IGFuIHVuaW5pdGlhbGlzZWQgZmllbGQgaW4gYQogICAgIGxpc3Rlbl9yZWMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBGSUxFUEFUSF9JTkZPIHZhcmlhYmxlIHRvIENHSSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgZXF1YWwgdG8KICAgICBQQVRIX0lORk8gZnJvbSBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBcGFjaGUgKGluIGNlcnRhaW4gc2l0dWF0aW9ucywKICAgICBBcGFjaGUgMS4yJ3MgUEFUSF9JTkZPIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gMS4xJ3MpLiBbQWxleGVpIEtvc3V0XQogICAgIFtsYXRlciByZW1vdmVkIGluIDEuMmIxMV0KCiAgKikgQWRkIHJ3cml0ZSgpIGZ1bmN0aW9uIHRvIEFQSSB0byBhbGxvdyBmb3Igc2VuZGluZyBzdHJpbmdzIG9mCiAgICAgYXJiaXRyYXJ5IGxlbmd0aC4gW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgUmVtb3ZlIHJsaW1fdCB0eXBlZGVmIGZvciBOZXRCU0QuIERvIG9sZGVyIHZlcnNpb25zIG5lZWQgdGhpcz8KCiAgKikgRGVmaW5lZCBybGltX3QgYW5kIFdBTlRIU1JFR0VYPXllcyBhbmQgZml4ZWQgd2FpdHBpZCgpIHN1YnN0aXR1dGUgZm9yCiAgICAgTmVYVC4gW0ppbSBKYWdpZWxza2ldCgogICopIFJlbW92ZWQgcmVjZW50IG1vZGlmaWNhdGlvbiB0byBwcm9tb3RlIHRoZSBzdGF0dXMgY29kZSBvbiBpbnRlcm5hbAogICAgIHJlZGlyZWN0cywgc2luY2UgdGhlIGNvcnJlY3QgZml4IHdhcyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbG9nIGZvcm1hdAogICAgIGluIG1vZF9sb2dfY29uZmlnIHNvIHRoYXQgaXQgb3V0cHV0cyB0aGUgb3JpZ2luYWwgc3RhdHVzLiBbUm9iIEhhcnRpbGxdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIyOgoKICAqKSBVcGRhdGUgc2V0X3NpZ25hbHMoKSB0byB1c2Ugc2lnYWN0aW9uKCkgZm9yIHNldHRpbmcgaGFuZGxlcnMuCiAgICAgVGhpcyBhcHBlYXJzIHRvIGZpeCBhIHJlLWVudHJhbnQgcHJvYmxlbSBpbiB0aGUgc2VnX2ZhdWx0KCkKICAgICBidXNfZXJyb3IoKSBoYW5kbGVycy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIENoYW5nZXMgdG8gYWxsb3cgbW9kX3N0YXR1cyBjb21waWxlIGZvciBPUy8yIFtHYXJleSBTbWlsZXldCgogICopIGNoYW5nZXMgZm9yIERFQyBBWFAgcnVubmluZyBPU0YvMSB2My4wLiBbTWFyYyBFdmFuc10KCiAgKikgcHJveHlfaHR0cC5jIGJ1Z2ZpeGVzOiAgW0NodWNrIE11cmNrb10KICAgICAgICAxKSBmaXhlcyBwb3NzaWJsZSBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlIHcvTm9DYWNoZQogICAgICAgIDIpIGZpeGVzIE5vQ2FjaGUgYmVoYXZpb3Igd2hlbiB1c2luZyBQcm94eVJlbW90ZSAoUHJveHlSZW1vdGUKICAgICAgICAgICBob3N0IHdvdWxkIGNhY2hlIG5vdGhpbmcgaWYgaXQgd2FzIGluIHRoZSBsb2NhbCBkb21haW4sCiAgICAgICAgICAgYW5kIHRoZSBsb2NhbCBkb21haW4gd2FzIGluIHRoZSBOb0NhY2hlIGxpc3QpCiAgICAgICAgMykgQWRkcyBIb3N0OiBoZWFkZXIgd2hlbiBub3QgYXZhaWxhYmxlCiAgICAgICAgNCkgU29tZSBjb2RlIGNsZWFudXAgYW5kIGNsYXJpZmljYXRpb24KCiAgKikgbW9kX2luY2x1ZGUuYyBidWdmaXhlczoKICAgICAgICAxKSBGaXhlZCBhbiBvbW1pc3Npb24gdGhhdCBjYXVzZWQgaW5jbHVkZSB2YXJpYWJsZXMgdG8gbm90CiAgICAgICAgICAgYmUgcGFyc2VkIGluIGNvbmZpZyBlcnJtc2cgZGlyZWN0aXZlcyBbSG93YXJkIEZlYXJdCiAgICAgICAgMikgUmVtb3ZlIEhBVkVfUE9TSVhfUkVHRVggY3J1ZnQgW0FsZXhlaSBLb3N1dF0KICAgICAgICAzKSBQYXRjaCB0byBmaXggY29tcGlsZXIgd2FybmluZ3MgWzxwZXJyb3QgbGFsLmluMnAzLmZyPl0KICAgICAgICA0KSBBbGxvdyBiYWNrc2xhc2gtZXNjYXBpbmcgdG8gYWxsIHF1b3RlZCB0ZXh0CiAgICAgICAgICAgW0JlbiBZb3NoaW5vIDxiZW4gd2lsaWtpLmVuZy5oYXdhaWkuZWR1Pl0KICAgICAgICA1KSBQYXNzIHZhcmlhYmxlIHRvIGNvbW1hbmQgbGluZSBpZiBub3Qgc2V0IGluIFhTU0kncyBlbnYKICAgICAgICAgICBbSG93YXJkIEZlYXJdCgogICopIEZpeCBpbmZpbml0ZSBsb29wIHdoZW4gcHJvY2Vzc2luZyBDb250ZW50LWxhbmd1YWdlIGxpbmVzIGluCiAgICAgdHlwZS1tYXAgZmlsZXMuIFtBbGV4ZWkgS29zdXRdCgogICopIENsb3NlZCBmaWxlLWdsb2JiaW5nIGhvbGUgaW4gdGVzdC1jZ2kgc2NyaXB0LiBbQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgRml4ZWQgcHJvYmxlbSBpbiBzZXRfW3VzZXJ8Z3JvdXBdIHRoYXQgcHJldmVudGVkIENHSSBleGVjdXRpb24KICAgICBmb3Igbm9uLXZpcnR1YWxob3N0cyB3aGVuIHN1RVhFQyB3YXMgZW5hYmxlZC4gW1JhbmR5IFRlcmJ1c2hdCgogICopIEFkZGVkIFBPUlRJTkcgaW5mb3JtYXRpb24gZmlsZS4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBBZGRlZCBkZWZpbml0aW9ucyBmb3IgU19JV0dSUCBhbmQgU19JV09USCB0byBjb25mLmggW0JlbiBMYXVyaWVdCgogICopIENoYW5nZWQgZGVmYXVsdCBncm91cCB0byAibm9ncm91cCIgaW5zdGVhZCBvZiAibm9ib2R5IiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgZGVmaW5lIHR5cG8gb2YgRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgd2hlcmUKICAgICBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgd2FzIGludGVuZGVkLgoKICAqKSBGaXhlZCBhZGRpdGlvbmFsIHVzZXMgb2YgMHhmZmZmZmZmZiB3aGVyZSBJTkFERFJfTk9ORSB3YXMgaW50ZW5kZWQsCiAgICAgd2hpY2ggY2F1c2VkIHByb2JsZW1zIG9mIHN5c3RlbXMgd2hlcmUgc29ja2V0IHNfYWRkciBpcyA+MzJiaXRzLgoKICAqKSBBZGRlZCBjb21tZW50IHRvIGV4cGxhaW4gKHItPmNodW5rZWQgPSAxKSBzaWRlLWVmZmVjdCBpbgogICAgIGh0dHBfcHJvdG9jb2wuYyBbUm95IEZpZWxkaW5nXQoKICAqKSBSZXBsYWNlZCB1c2Ugb2YgaW5kZXgoKSBpbiBtb2RfZXhwaXJlcy5jIHdpdGggbW9yZSBhcHByb3ByaWF0ZQogICAgIGFuZCBwb3J0YWJsZSBpc2RpZ2l0KCkgdGVzdC4gIFtCZW4gTGF1cmllXQoKICAqKSBVcGRhdGVkIENvbmZpZ3VyZSBmb3IgLi4uCiAgICAgICAgT1MvMiAgICAgICAgICAoREVGX1dBTlRIU1JFR0VYPXllcywgb3RoZXIgY29kZSBjaGFuZ2VzKQogICAgICAgICotZGctZGd1eCogICAgKGJhZCBwYXR0ZXJuIG1hdGNoKQogICAgICAgIFFOWCAgICAgICAgICAgKERFRl9XQU5USFNSRUdFWD15ZXMpCiAgICAgICAgKi1zdW5vczQqICAgICAoREVGX1dBTlRIU1JFR0VYPXllcywgLURVU0VCQ09QWSkKICAgICAgICAqLXVsdHJpeCAgICAgIChuZXcpCiAgICAgICAgKi11bml4d2FyZTIxMSAobmV3KQogICAgIGFuZCBhZGRlZCBzb21lIHVzZXIgZGlhZ25vc3RpYyBpbmZvLiAgW0JlbiBMYXVyaWVdCgogICopIEluIGhlbHBlcnMvQ3V0UnVsZSwgcmVwbGFjZWQgImN1dCIgaW52b2NhdGlvbiB3aXRoICJhd2siIGludm9jYXRpb24KICAgICBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5LiBbSmltIEphZ2llbHNraV0KCiAgKikgVXBkYXRlZCBoZWxwZXJzL0d1ZXNzT1MgZm9yIC4uLgogICAgICAgIFNDTyA1ICAgICAgICAgICAgKHJlY29nbml6ZSBtaW5vciByZWxlYXNlcykKICAgICAgICBTQ08gVW5peFdhcmUgICAgIChicmFpbmRhbWFnZWQgdW5hbWUsIHdoYXRldmVyLXdoYXRldmVyLXVuaXh3YXJlMikKICAgICAgICBTQ08gVW5peFdhcmUgMi4xLjEgICAgICAocmVxdWlyZXMgYSBzZXBhcmF0ZSBzZXQgb2YgI2RlZmluZXMgaW4gY29uZi5oKQogICAgICAgIElSSVg2NCAgICAgICAgICAgKC1zZ2ktaXJpeDY0KQogICAgICAgIFVMVFJJWCAgICAgICAgICAgKC11bmtub3duLXVsdHJpeCkKICAgICAgICBTSU5JWCAgICAgICAgICAgICgtd2hhdGV2ZXItc3lzdjQpCiAgICAgICAgTkNSIFVuaXggICAgICAgICAoLW5jci1zeXN2NCkKICAgICBhbmQgZml4ZWQgc29tZXRoaW5nIGluIGhlbHBlcnMvUHJpbnRQYXRoICBbQmVuIExhdXJpZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjEKCiAgKikgTm90IGxpc3RlZC4gU2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9uZXdfZmVhdHVyZXNfMV8yLmh0bWw+CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMS4xCgogICopIEZpeGVkIGJ1ZyB3aGVyZSBDb29raWUgbW9kdWxlIHdvdWxkIG1ha2UgdHdvIGVudHJpZXMgaW4gdGhlCiAgICAgbG9nZmlsZSBmb3IgZWFjaCBhY2Nlc3MgW01hcmsgQ294XQoKICAqKSBGaXhlZCBidWcgd2hlcmUgUmVkaXJlY3QgaW4gLmh0YWNjZXNzIGZpbGVzIHdvdWxkIGNhdXNlIG1lbW9yeQogICAgIGxlYWsuIFtOYXRoYW4gTmV1bGluZ2VyXQoKICAqKSBNdWx0aVZpZXdzIG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCBBZGRIYW5kbGVyIFtBbGV4ZWkgS29zdXRdCgogICopIFByb2JsZW1zIHdpdGggbW9kX2F1dGhfbXNxbCBmaXhlZCBbRGlyayB2YW5HdWxpa10KCiAgKikgRml4IG1pc3NwZWxsaW5nIG9mICJBbm9ueW1vdXNfQXV0aG9yYXRpdmUiIGRpcmVjdGl2ZSBpbiBtb2RfYXV0aF9hbm9uLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjEuMAoKICAqKSBCcmluZyBOZVhUIHN1cHBvcnQgdXAgdG8gZGF0ZS4gW1Rha2Fha2kgTWF0c3Vtb3RvXQoKICAqKSBCcmluZyBRTlggc3VwcG9ydCB1cCB0byBkYXRlLiBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSB2aXJ0dWFsIGhvc3RzIGRlZmF1bHQgdG8gbWFpbiBzZXJ2ZXIga2VlcGFsaXZlIHBhcmFtZXRlcnMuCiAgICAgW0FsZXhlaSBLb3N1dCwgQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgU2NhbkhUTUxUaXRsZXMgdG8gd29yayB3aXRoIGxvd2VyY2FzZSA8dGl0bGU+IHRhZ3MuIFtBbGV4ZWkgS29zdXRdCgogICopIEZpeCBtaXNzaW5nIGFkZHJlc3MgZmFtaWx5IGZvciBjb25uZWN0LCBhbHNvIHJlbW92ZSB1bnJlYWNoYWJsZSBzdGF0ZW1lbnQKICAgICBpbiBtb2RfcHJveHkuIFtCZW4gTGF1cmllXQoKICAqKSBtb2RfZW52IG5vdyB0dXJuZWQgb24gYnkgZGVmYXVsdCBpbiBDb25maWd1cmF0aW9uLnRtcGwuCgogICopIEJ1Z3Mgd2hpY2ggd2VyZSBmaXhlZDoKICAgICAgICBhKSB5ZXQgbW9yZSBtb2RfcHJveHkgYnVncyBbQmVuIExhdXJpZV0KICAgICAgICBiKSBDR0kgd29ya3MgYWdhaW4gd2l0aCBpbmV0ZCBbQWxleGVpIEtvc3V0XQogICAgICAgIGMpIExlYWRpbmcgY29sb25zIHdlcmUgc3RyaXBwZWQgZnJvbSBwYXNzd29yZHMgWzxvc20gaW50ZXJndWlkZS5jb20+XQogICAgICAgIGQpIEFub3RoZXIgZml4IHRvIG11bHRpLW1ldGhvZCBMaW1pdCBwcm9ibGVtIFs8amsgdG9vbHMuZGU+XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjFiNAoKICAqKSByLT5ieXRlc19zZW50IHZhcmlhYmxlIHJlc3RvcmVkLiBbUm9iZXJ0IFRoYXVdCgogICopIFByZXZpb3VzbHkgYnJva2VuIG11bHRpLW1ldGhvZCA8TGltaXQ+IHBhcnNpbmcgZml4ZWQuIFtSb2JlcnQgVGhhdV0KCiAgKikgTW9yZSBwb3NzaWJseSB1bnNlY3VyZSBwcm9ncmFtcyByZW1vdmVkIGZyb20gdGhlIHN1cHBvcnQgZGlyZWN0b3J5LgoKICAqKSBNb3JlIG1vZF9hdXRoX21zcWwgYXV0aGVudGljYXRpb24gaW1wcm92ZW1lbnRzLgoKICAqKSBWaXJ0dWFsSG9zdHMgYmFzZWQgb24gSG9zdDogaGVhZGVycyBubyBsb25nZXIgY29uZmxpY3Qgd2l0aCB0aGUKICAgICBMaXN0ZW4gZGlyZWN0aXZlLgoKICAqKSBPUy8yIGNvbXBhdGliaWxpdHkgZW5oYW5jZW1lbnRzLiBbR2FyeSBTbWlsZXldCgogICopIFBPU1Qgbm93IGFsbG93ZWQgdG8gZGlyZWN0b3J5IGluZGV4IENHSSBzY3JpcHRzLgoKICAqKSBBY3Rpb25zIG5vdyB3b3JrIHdpdGggZmlsZXMgb2YgdGhlIGRlZmF1bHQgdHlwZS4KCiAgKikgQnVncyB3aGljaCB3ZXJlIGZpeGVkOgogICAgICAgIGEpIG1vcmUgbW9kX3Byb3h5IGJ1Z3MKICAgICAgICBiKSBlYXJseSB0ZXJtaW5hdGlvbiBvZiBpbmV0ZCByZXF1ZXN0cwogICAgICAgIGMpIGNvbXBpbGUgd2FybmluZ3Mgb24gc2V2ZXJhbCBzeXN0ZW1zCiAgICAgICAgZCkgcHJvYmxlbXMgd2hlbiBzY3JpcHRzIHN0b3AgcmVhZGluZyBvdXRwdXQgZWFybHkKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjMKCiAgKikgTXVjaCBvZiBjZ2ktYmluIGFuZCBhbGwgb2YgY2dpLXNyYyBoYXMgYmVlbiByZW1vdmVkLCBkdWUgdG8KICAgICB2YXJpb3VzIHNlY3VyaXR5IGhvbGVzIGZvdW5kIGFuZCB0aGF0IHdlIGNvdWxkIG5vIGxvbmdlciBzdXBwb3J0CiAgICAgdGhlbS4KCiAgKikgVGhlICJTZXQtQ29va2llIiBoZWFkZXIgaXMgbm93IHNwZWNpYWwtY2FzZWQgdG8gbm90IG1lcmdlIG11bHRpcGxlCiAgICAgaW5zdGFuY2VzLCBzaW5jZSBjZXJ0YWluIHBvcHVsYXIgYnJvd3NlcnMgY2FuIG5vdCBoYW5kbGUgbXVsdGlwbGUKICAgICBTZXQtQ29va2llIGluc3RydWN0aW9ucyBpbiBhIHNpbmdsZSBoZWFkZXIuIFtQYXVsIFN1dHRvbl0KCiAgKikgcnByaW50ZigpIGFkZGVkIHRvIGJ1ZmZlciBjb2RlLCBvY2N1cnJlbmNlcyBvZiBzcHJpbnRmIHJlbW92ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENPTk5FQ1QgbWV0aG9kIGZvciBwcm94eSBtb2R1bGUsIHdoaWNoIG1lYW5zIHR1bm5lbGluZyBTU0wgc2hvdWxkIHdvcmsuCiAgICAgKE5vIGNyeXB0byBuZWVkZWQpICBBbHNvIGEgTm9DYWNoZSBjb25maWcgZGlyZWN0aXZlLgoKICAqKSBTZXZlcmFsIEFQSSBhZGRpdGlvbnM6IHBzdHJuZHVwKCksIHRhYmxlX3Vuc2V0KCkgYW5kIGdldF90b2tlbigpCiAgICAgZnVuY3Rpb25zIG5vdyBhdmFpbGFibGUgdG8gbW9kdWxlcy4KCiAgKikgbW9kX2ltYXAgZml4dXBzLCBpbiBwYXJ0aWN1bGFyIExvY2F0aW9uOiBoZWFkZXJzIGFyZSBub3cgY29tcGxldGUKICAgICBVUkwncy4KCiAgKikgTmV3ICJpbmZvIiBtb2R1bGUgd2hpY2ggcmVwb3J0cyBvbiBpbnN0YWxsZWQgbW9kdWxlIHNldCB0aHJvdWdoIGEKICAgICBzcGVjaWFsIFVSTCwgYSBsYSBtb2Rfc3RhdHVzLgoKICAqKSAiU2VydmVyUGF0aCIgZGlyZWN0aXZlIGFkZGVkIC0gYWxsb3dzIGZvciBncmFjZWZ1bCB0cmFuc2l0aW9uCiAgICAgZm9yIEhvc3Q6LWhlYWRlci1iYXNlZCB2aXJ0dWFsIGhvc3RzLgoKICAqKSBBbm9ueW1vdXMgYXV0aGVudGljYXRpb24gbW9kdWxlIGltcHJvdmVtZW50cy4KCiAgKikgTVNRTCBhdXRoZW50aWNhdGlvbiBtb2R1bGUgaW1wcm92ZW1lbnRzLgoKICAqKSBTdGF0dXMgbW9kdWxlIGRlc2lnbiBpbXByb3ZlZCAtIG91dHB1dCBub3cgdGFibGUtYmFzZWQuIFtCZW4gTGF1cmllXQoKICAqKSBodGRpZ2VzdCB1dGlsaXR5IGluY2x1ZGVkIGZvciB1c2Ugd2l0aCBkaWdlc3QgYXV0aGVudGljYXRpb24KICAgICBtb2R1bGUuCgogICopIG1vZF9uZWdvdGlhdGlvbjogQWNjZXB0IHZhbHVlcyB3aXRoIHdpbGRjYXJkcyB0byBiZSB0cmVhdGVkIHdpdGgKICAgICBsZXNzIHByaW9yaXR5IHRoYW4gdGhvc2Ugd2l0aG91dCB3aWxkY2FyZHMgYXQgdGhlIHNhbWUgcXVhbGl0eQogICAgIHZhbHVlLiBbQWxleGVpIEtvc3V0XQoKICAqKSBCdWdzIHdoaWNoIHdlcmUgZml4ZWQ6CiAgICAgICAgYSkgbnVtZXJvdXMgbW9kX3Byb3h5IGJ1Z3MKICAgICAgICBiKSBDR0kgZWFybHktdGVybWluYXRpb24gYnVnIFtCZW4gTGF1cmllXQogICAgICAgIGMpIEtlZXBhbGl2ZXMgbm90IHdvcmtpbmcgd2l0aCB2aXJ0dWFsIGhvc3RzCiAgICAgICAgZCkgUmVmZXJlcklnbm9yZSBwcm9ibGVtcwogICAgICAgIGUpIGNsb3NpbmcgZmQncyB0d2ljZSBpbiBtb2RfaW5jbHVkZSAoY2F1c2luZyBjb3JlIGR1bXBzIG9uCiAgICAgICAgICAgTGludXggYW5kIGVsc2V3aGVyZSkuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMWIyCgogICopIEJ1Z2ZpeGVzOgogICAgICAgIGEpIGNvcmUgZHVtcHMgaW4gbW9kX2RpZ2VzdAogICAgICAgIGIpIHRydW5jYXRlZCBob3N0bmFtZXMvaXAgYWRkcmVzcyBpbiB0aGUgbG9ncwogICAgICAgIGMpIHJlbGF0aXZlIFVSTCdzIGluIG1vZF9pbWFwIG1hcCBmaWxlcwoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjFiMQoKICAqKSBOb3QgbGlzdGVkLiBTZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL25ld19mZWF0dXJlc18xXzEuaHRtbD4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4wLjMKCiAgKikgSW50ZXJuYWwgcmVkaXJlY3RzIHdoaWNoIG9jY3VyIGluIG1vZF9kaXIuYyBub3cgcHJlc2VydmUgdGhlCiAgICAgcXVlcnkgcG9ydGlvbiBvZiBhIHJlcXVlc3QgKHRoZSBiaXQgYWZ0ZXIgdGhlIHF1ZXN0aW9uIG1hcmspLgogICAgIFtBZGFtIFN1c3NtYW5dCgogICopIEVzY2FwZSBhY3RpdmUgY2hhcmFjdGVycyAnPCcsICc+JyBhbmQgJyYnIGluIGh0bWwgb3V0cHV0IGluCiAgICAgZGlyZWN0b3J5IGxpc3RpbmdzLCBlcnJvciBtZXNzYWdlcyBhbmQgcmVkaXJlY3Rpb24gbGlua3MuCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBcGFjaGUgd2lsbCBub3cgd29yayB3aXRoIEx5bnhPUyAyLjMgYW5kIGxhdGVyIFtTdGV2ZW4gV2F0dF0KCiAgKikgRml4IGZvciBQT1NJWCBjb21wbGlhbmNlIGluIHdhaXRpbmcgZm9yIHByb2Nlc3NlcyBpbiBhbGxvYy5jLgogICAgIFtOaWNrIFdpbGxpYW1zXQoKICAqKSBzZXRzb2Nrb3B0IG5vIGxvbmdlciB0YWtlcyBhIGNvbnN0IGRlY2xhcmVkIGFyZ3VtZW50IFtNYXJ0aWpuIEtvc3Rlcl0KCiAgKikgUmVzZXQgdGltZW91dCB0aW1lciBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgZndyaXRlKCkgdG8gdGhlIG5ldHdvcmsuCiAgICAgVGhpcyBwYXRjaCBhZGRzIGEgcmVzZXRfdGltZW91dCgpIHByb2NlZHVyZSB0aGF0IGlzIGNhbGxlZCBieQogICAgIHNlbmRfZmQoKSB0byByZXNldCB0aGUgdGltZW91dCBldmVyIHRpbWUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBuZXQuCiAgICAgW05hdGhhbiBTY2hyZW5rXQoKICAqKSB0aW1lb3V0KCkgc2lnbmFsIGhhbmRsZXIgbm93IGNoZWNrcyBmb3IgU0lHUElQRSBhbmQgcmVwb3J0cwogICAgIGxvc3QgY29ubmVjdGlvbnMgaW4gYSBtb3JlIHVzZXIgZnJpZW5kbHkgd2F5LiBbUm9iIEhhcnRpbGxdCgogICopIExvY2F0aW9uIG9mIHRoZSAic2NvcmVib2FyZCIgZmlsZSB3aGljaCB1c2VkIHRvIGxpdmUgaW4gL3RtcCBpcwogICAgIG5vdyBjb25maWd1cmFibGUgKGZvciBPU2VzIHRoYXQgY2FuJ3QgdXNlIG1tYXApIHZpYSBTY29yZUJvYXJkRmlsZQogICAgIHdoaWNoIHdvcmtzIHNpbWlsYXIgdG8gUGlkRmlsZSAoaW4gaHR0cGQuY29uZikgW1JvYiBIYXJ0aWxsXQoKICAqKSBJbmNsdWRlIHN5cy9yZXNvdXJjZS5oIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciBTdW5PUzQgW1NhbWVlciBQYXJla2hdCgogICopIHRoZSBwc3RyY2F0IGNhbGwgaW4gbW9kX2Nvb2tpZXMuYyBkaWRuJ3QgaGF2ZSBhbiBlbmRpbmcgTlVMTCwKICAgICB3aGljaCBjYXVzZWQgYSBTRUdWIHdpdGggY29va2llcyBlbmFibGVkCgogICopIE91dHB1dCB3YXJuaW5nIHdoZW4gTWluU3BhcmVTZXJ2ZXJzIGlzIHNldCB0byA8PSAwIGFuZCBjaGFuZ2UgaXQgdG8gMQogICAgIFtSb2IgSGFydGlsbF0KCiAgKikgTG9nIHRoZSBVTklYIHRleHR1YWwgZXJyb3IgcmV0dXJuZWQgYnkgc29tZSBzeXN0ZW0gY2FsbHMsIGluCiAgICAgcGFydGljdWxhciBlcnJvcnMgZnJvbSBhY2NlcHQoKSBbRGF2aWQgUm9iaW5zb25dCgogICopIEFkZCBzdHJlcnJvciBmdW5jdGlvbiB0byB1dGlsLmMgZm9yIFN1bk9TNCBbUmFuZHkgVGVyYnVzaF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4wLjIKCiAgKikgcGF0Y2ggdG8gZ2V0IEFwYWNoZSBjb21waWxlZCBvbiBVbml4V2FyZSAyLngsIHJlY29tbWVuZGVkIGFzCiAgICAgYSB0ZW1wb3JhcnkgbWVhc3VyZSwgcGVuZGluZyByZXdyaXRlIG9mIHJmYzkzMS5jLiBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBGaXggZ2V0X2Jhc2ljX2F1dGhfcHcoKSB0byBzZXQgdGhlIGF1dGhfdHlwZSBvZiB0aGUgcmVxdWVzdC4KICAgICBbRGF2aWQgUm9iaW5zb25dCgogICopIHBhc3QgY2hhbmdlcyB0byBodHRwX2NvbmZpZy5jIHRvIG9ubHkgdXNlIHRoZQogICAgIHNldHJsaW1pdCBmdW5jdGlvbiBvbiBzeXN0ZW1zIGRlZmluaW5nIFJMSU1JVF9OT0ZJTEUKICAgICBicm9rZSB0aGUgZmVhdHVyZSBvbiBTVU5PUzQuIE5vdyBkZWZpbmVzIEhBVkVfUkVTT1VSQ0UKICAgICBmb3IgU1VOT1MgYW5kIHByb3RvdHlwZXMgdGhlIG5lZWRlZCBmdW5jdGlvbnMuCgogICopIFJlbW92ZSB1c2VzIG9mIE1BWF9TVFJJTkdfTEVOL0hVR0VfU1RSSU5HX0xFTiBmcm9tIHNldmVyYWwgcm91dGluZXMuCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBGaXggdXNlIG9mIHBvaW50ZXIgdG8gc2NyYXRjaCBtZW1vcnkuIFtDbGlmZiBTa29sbmlja10KCiAgKikgTWVyZ2UgbXVsdGlwbGUgaGVhZGVycyBmcm9tIENHSSBzY3JpcHRzIGluc3RlYWQgb2YgdGFraW5nIGxhc3QKICAgICBvbmUuIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFNDTyA1LiBbQmVuIExhdXJpZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4wLjEKCiAgKikgU2lsZW5jZSBtb2RfbG9nX3JlZmVyZXIgYW5kIG1vZF9sb2dfYWdlbnQgaWYgbm90IGNvbmZpZ3VyZWQKICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUmVjdXJzaXZlIGluY2x1ZGVzIGNhbiBvY2N1ciBpZiB0aGUgY2xpZW50IHN1cHBsaWVzIFBBVEhfSU5GTyBkYXRhCiAgICAgYW5kIHRoZSBzZXJ2ZXIgcHJvdmlkZXIgdXNlcyByZWxhdGl2ZSBsaW5rczsgYXMgZmlsZS5odG1sCiAgICAgcmVsYXRpdmUgdG8gL2RvYy5zaHRtbC9wYXRoaW5mbyBpcyAvZG9jLnNodG1sL2ZpbGUuaHRtbC4gW0RhdmlkIFJvYmluc29uXQoKICAqKSBUaGUgcmVwbGFjZW1lbnQgZm9yIGluaXRncm91cHMoKSBkaWQgbm90IGNhbGwge3NldCxlbmR9Z3JlbnQoKS4gVGhpcwogICAgIGhhZCB0d28gaW1wbGljYXRpb25zOiBpZiBhbnl0aGluZyBlbHNlIHVzZWQgZ2V0Z3JlbnQoKSwgdGhlbgogICAgIGluaXRncm91cHMoKSB3b3VsZCBmYWlsLCBhbmQgaXQgd2FzIGNvbnN1bWluZyBhIGZpbGUgZGVzY3JpcHRvci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgT24gaGVhdmlseSBsb2FkZWQgc2VydmVycyBpdCB3YXMgcG9zc2libGUgZm9yIHRoZSBzY29yZWJvYXJkIHRvIGdldAogICAgIG91dCBvZiBzeW5jIHdpdGggcmVhbGl0eSwgYXMgYSByZXN1bHQgb2YgYSByYWNlIGNvbmRpdGlvbi4KICAgICBUaGUgb2JzZXJ2ZWQgc3ltcHRvbXMgYXJlIGZhciBtb3JlIEFwYWNoZXMgcnVubmluZyB0aGFuIHNob3VsZAogICAgIGJlLCBhbmQgaGVhdnkgc3lzdGVtIGxvYWRzLCBnZW5lcmFsbHkgZm9sbG93ZWQgYnkgY2F0YXN0cm9waGljCiAgICAgc3lzdGVtIGZhaWx1cmUuIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdHlwbyBpbiBsaWNlbnNlLiBbRGF2aWQgUm9iaW5zb25dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzIE5vdiAxOTk1CgogICopIE5vdCBsaXN0ZWQuIFNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbmV3X2ZlYXR1cmVzXzFfMC5odG1sPgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNSBOb3YgMTk5NQoKICAqKSBOZXcgbWFuIHBhZ2UgZm9yICdodHRwZCcgYWRkZWQgdG8gc3VwcG9ydCBkaXJlY3RvcnkgW0RhdmlkIFJvYmluc29uXQoKICAqKSAuaHRncm91cCBmaWxlcyBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGxpbmUgZ2l2aW5nIG1lbWJlcnMgZm9yIGEKICAgICBnaXZlbiBncm91cCAoZWFjaCBtdXN0IGhhdmUgdGhlIGdyb3VwIG5hbWUgaW4gZnJvbnQpLCBmb3IgTkNTQQogICAgIGJhY2stY29tcGF0aWJpbGl0eSBbUm9iZXJ0IFRoYXVdCgogICopIE11dHVhbCBleGNsdXNpb24gYXJvdW5kIGFjY2VwdCgpIGlzIG9uIGJ5IGRlZmF1bHQgZm9yIFNWUjQgc3lzdGVtcwogICAgIGdlbmVyYWxseSwgc2luY2UgdGhleSBnZW5lcmFsbHkgY2FuJ3QgaGFuZGxlIG11bHRpcGxlIHByb2Nlc3NlcyBpbgogICAgIGFjY2VwdCgpIG9uIHRoZSBzYW1lIHNvY2tldC4gIFRoaXMgc2hvdWxkIGN1cmUgZmxha3kgYmVoYXZpb3Igb24KICAgICBhIGxvdCBvZiB0aG9zZSBzeXN0ZW1zLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBZGRUeXBlLCBBZGRFbmNvZGluZywgYW5kIEFkZExhbmd1YWdlIGRpcmVjdGl2ZXMgdGFrZSBtdWx0aXBsZQogICAgIGV4dGVuc2lvbnMgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgVXNlckRpciBjYW4gYmUgZGlzYWJsZWQgZm9yIGEgZ2l2ZW4gdmlydHVhbCBob3N0IGJ5IHNheWluZwogICAgICJVc2VyRGlyIGRpc2FibGVkIiBpbiB0aGUgPFZpcnR1YWxIb3N0PiBzZWN0aW9uIC0tLSBpdCB3YXMgYSBidWcKICAgICB0aGF0IHRoaXMgZGlkbid0IHdvcmsuICBbRGF2aWQgUm9iaW5zb25dCgogICopIENvbXBpbGVzIG9uIFFOWCBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdGVkIHBhcnNpbmcgb2YgY3RpbWUgdGltZSBmb3JtYXQgW0RhdmlkIFJvYmluc29uXQoKICAqKSBodHRwZCBkb2VzIGEgcGVycm9yKCkgYmVmb3JlIGV4aXRpbmcgaWYgaXQgY2FuJ3QgbG9nIGl0cyBwaWQKICAgICB0byB0aGUgUGlkRmlsZSwgdG8gbWFrZSBkaWFnbm9zaW5nIHRoZSBlcnJvciBhIGJpdCBlYXNpZXIuCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSA8IS0tI2luY2x1ZGUgZmlsZT0iLi4uIi0tPiBjYW4gbm8gbG9uZ2VyIGluY2x1ZGUgZmlsZXMgaW4gdGhlCiAgICAgcGFyZW50IGRpcmVjdG9yeSwgZm9yIE5DU0EgYmFjay1jb21wYXRpYmlsaXR5LiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSAnficgaXMgKm5vdCogZXNjYXBlZCBpbiBVUklzIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3J5IGxpc3RpbmdzCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgRWxpbWluYXRlZCBjb21waWxlciB3YXJuaW5nIGluIHRoZSBpbWFnZW1hcCBtb2R1bGUgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeGVkIGJ1ZyBpbnZvbHZpbmcgaGFuZGxpbmcgVVJJcyB3aXRoIGVzY2FwZWQgJS1jaGFyYWN0ZXJzCiAgICAgaW4gcmVkaXJlY3RzIFtEYXZpZCBSb2JpbnNvbl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQgT2N0IDE5OTUKCiAgKikgU3dpdGNoZWQgdG8gbmV3LCBzaW1wbGVyIGxpY2Vuc2UKCiAgKikgRWxpbWluYXRlZCBjb3JlIGR1bXBzIHdpdGggaW1wcm9wZXJseSBmb3JtYXR0ZWQgREJNIGdyb3VwIGZpbGVzIFtNYXJrIENveF0KCiAgKikgRG9uJ3QgYWxsb3cgcmVxdWVzdHMgZm9yIG9yZGluYXJ5IGZpbGVzIHRvIGhhdmUgUEFUSF9JTkZPIFtCZW4gTGF1cmllXQoKICAqKSBSZWplY3QgcGF0aHMgY29udGFpbmluZyAlLWVzY2FwZWQgJyUnIG9yIG51bGwgY2hhcmFjdGVycyBbRGF2aWQgUm9iaW5zb25dCgogICopIENvcnJlY3RseSBoYW5kbGVzIGludGVybmFsIHJlZGlyZWN0cyB0byBmaWxlcyB3aXRoIG5hbWVzIGNvbnRhaW5pbmcgJyUnCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBSZXB1bmN0dWF0ZWQgc29tZSBlcnJvciBtZXNzYWdlcyBbQXJhbSBNaXJ6YWRlaCwgQW5kcmV3IFdpbHNvbl0KCiAgKikgVXNlIGdldGV1aWQoKSByYXRoZXIgdGhhbiBnZXR1aWQoKSB0byBzZWUgaWYgd2UgaGF2ZSByb290IHByaXZpbGVnZSwKICAgICBzbyB0aGF0IHNlcnZlciBjb3JyZWN0bHkgcmVzZXRzIHByaXZpbGVnZSBpZiBydW4gc2V0dWlkIHJvb3QuICBbQW5kcmV3CiAgICAgV2lsc29uXQoKICAqKSBIYW5kbGUgZnRwOiBhbmQgdGVsbmV0OiBVUkxzIGNvcnJlY3RseSBpbiBpbWFnZW1hcHMgKGJ1aWx0LWluIG1vZHVsZSkKICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4IHJlbGF0aXZlIFVSTHMgaW4gaW1hZ2VtYXAgZmlsZXMgW1JhbmR5IFRlcmJ1c2hdCgogICopIFNvbWV3aGF0IGJldHRlciBmaXggZm9yIHRoZSBvbGQgIkFsaWFzIC9mb28vIC9iYXIvIiBidXNpbmVzcwogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRG9uJ3QgcmVwZWF0ZWRseSBvcGVuIHRoZSBFcnJvckxvZyBpZiBhIGJ1bmNoIG9mIDxWaXJ0dWFsSG9zdD4KICAgICBlbnRyaWVzIGFsbCBuYW1lIHRoZSBzYW1lIG9uZS4gW0RhdmlkIFJvYmluc29uXQoKICAqKSBGaXggZGlyZWN0b3J5IGxpc3RpbmdzIHdpdGggZmlsZW5hbWVzIGNvbnRhaW5pbmcgdW51c3VhbCBjaGFyYWN0ZXJzCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBCZXR0ZXIgVVJJLWVzY2FwaW5nIGZvciBnZW5lcmF0ZWQgVVJJcyBpbiBkaXJlY3RvcmllcyB3aXRoIGZpbGVuYW1lcwogICAgIGNvbnRhaW5pbmcgdW51c3VhbCBjaGFyYWN0ZXJzIFtCZW4gTGF1cmllXQoKICAqKSBGaXhlZCBwb3RlbnRpYWwgRklMRSogbGVhayBpbiBodHRwX21haW4uYyBbQmVuIExhdXJpZV0KCiAgKikgVW5ibG9jayBhbGFybXMgb24gZXJyb3IgcmV0dXJuIGZyb20gc3Bhd25fY2hpbGQoKSBbRGF2aWQgUm9iaW5zb25dCgogICopIFNhbXBsZSBDb25maWcgZmlsZXMgaGF2ZSBleHRyYSBub3RlIGZvciBTQ08gdXNlcnMgW0JlbiBMYXVyaWVdCgogICopIENvbmZpZ3VyYXRpb24gaGFzIG5vdGUgZm9yIEhQLVVYIHVzZXJzIFtSb2IgSGFydGlsbF0KCiAgKikgRWxpbWluYXRlZCBzb21lIGJvZ3VzIExpbnV4LW9ubHkgI2RlZmluZXMgaW4gY29uZi5oIFtBcmFtIE1pcnphZGVoXQoKICAqKSBOdWtlZCBib2d1cyAjZGVmaW5lIGluIGh0dHBkLmggW0RhdmlkIFJvYmluc29uXQoKICAqKSBCZXR0ZXIgdGVzdCBmb3Igd2hldGhlciBhIHN5c3RlbSBoYXMgc2V0cmxpbWl0KCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDYWxscyB1cGRhdGVfY2hpbGRfc3RhdHVzKCkgYWZ0ZXIgcmVvcGVuX3Njb3JlYm9hcmQoKSBbRGF2aWQgUm9iaW5zb25dCgogICopIERvZXNuJ3Qgc2VuZCBpdHNlbGYgU0lHSFVQIG9uIHN0YXJ0dXAgd2hlbiBydW4gaW4gdGhlIC1YIGRlYnVnLW9ubHkgbW9kZQogICAgIFtCZW4gTGF1cmllXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBTZXAgMTk5NQoKICAqKSBDb21waWxlcyBvbiBTQ08gT0RUIDMuMCBbQmVuIExhdXJpZV0KCiAgKikgQWRkRGVzY3JpcHRpb24gd29ya3MgKGJldHRlcikgW0JlbiBMYXVyaWVdCgogICopIExlYXZlcyBhbiBpbnRlbGxpZ2libGUgZXJyb3IgZGlhZ25vc3RpYyB3aGVuIGl0IGNhbid0IHNldCBncm91cAogICAgIHByaXZpbGVnZXMgb24gc3RhbmRhbG9uZSBzdGFydHVwIFtBbmRyZXcgV2lsc29uXQoKICAqKSBDb21waWxlcyBvbiBOZVhUIGFnYWluIC0tLSB0aGUgMC44LjEzIFJMSU1JVCBwYXRjaCB3YXMgZmFpbGluZyBvbgogICAgIHRoYXQgbWFjaGluZSwgd2hpY2ggY2xhaW1zIHRvIGJlIEJTRCBidXQgZG9lcyBub3Qgc3VwcG9ydCBSTElNSVQuCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIGdjYyAtV2FsbCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0IGFuIHVudXNlZCB2YXJpYWJsZSB3aGVuIHV0aWwuYwogICAgIGlzIGNvbXBpbGVkIHdpdGggLURNSU5JTUFMX0ROUyBbQW5kcmV3IFdpbHNvbl0KCiAgKikgTnVrZWQgYW5vdGhlciBjb21waWxlciB3YXJuaW5nIGZvciAtV2FsbCBvbiBMaW51eCBbQXJhbSBNaXJ6YWRlaF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDcgU2VwIDE5OTUKCiAgKikgTWFrZSBJbmRleElnbm9yZSAqd29yayogKG9vb3BzKSBbSmFya2tvIFRvcnBwYV0KCiAgKikgSGF2ZSBidWlsdC1pbiBpbWFnZW1hcCBjb2RlIHJlY29nbml6ZSAmIGhvbm9yIFBvaW50IGRpcmVjdGl2ZSBbSmFtZXMKICAgICBDbG9vc10KCiAgKikgR2VuZXJhdGUgY2xlYW5lciBkaXJlY3RvcnkgbGlzdGluZ3MgaW4gZGlyZWN0b3JpZXMgd2l0aCBhIG1peCBvZgogICAgIGxvbmcgYW5kIHNob3J0IGZpbGVuYW1lcyBbUm9iIEhhcnRpbGxdCgogICopIFByb3Blcmx5IGluaXRpYWxpemUgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZXMgW1JveXN0b24gU2h1ZmZsZWJvdGhhbV0KCiAgKikgUHJvcGVybHkgZGVmYXVsdCBTZXJ2ZXJOYW1lIGZvciB2aXJ0dWFsIHNlcnZlcnMgW1JvYmVydCBUaGF1XQoKICAqKSBSYXRpb25hbGl6ZSBoYW5kbGluZyBvZiBCU0QgaW4gY29uZi5oIGFuZCBlbHNld2hlcmUgW1JhbmR5IFRlcmJ1c2gsCiAgICAgUGF1bCBSaWNoYXJkcyBhbmQgYSBjYXN0IG9mIHRob3VzYW5kcy4uLl0KCiAgKikgT24gc2VsZi1pZGVudGlmaWVkIEJTRCBzeXN0ZW1zICh3ZSBkb24ndCB0cnkgdG8gZ3Vlc3MgYW55IG1vcmUpLAogICAgIGFsbG9jYXRlIGEgZmV3IGV4dHJhIGZpbGUgZGVzY3JpcHRvcnMgcGVyIHZpcnR1YWwgaG9zdCB3aXRoIHNldHJsaW1pdCwKICAgICBpZiB3ZSBjYW4sIHRvIGF2b2lkIHJ1bm5pbmcgb3V0LiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgV3JpdGUgMjItY2hhcmFjdGVyIGxvY2sgZmlsZSBuYW1lIGludG8gYnVmZmVyIHdpdGggZW5vdWdoIHNwYWNlCiAgICAgb24gc3RhcnR1cCBbS29uc3RhbnRpbiBPbGNoYW5za2ldCgogICopIFVzZSBhcmNoYWljIHNldHBncnAoKSBpbnRlcmZhY2Ugb24gTmVYVCwgd2hpY2ggcmVxdWlyZXMgaXQgW0JyaWFuCiAgICAgUGlua2VydG9uXQoKICAqKSBTdXBwcmVzcyAtV2FsbCB3YXJuaW5nIGJ5IGNhc3RpbmcgY29uc3QgYXdheSBpbiB1dGlsLmMgW0FyYW0gTWlyemFkZWhdCgogICopIFN1cHByZXNzIC1XYWxsIHdhcm5pbmcgYnkgaW5pdGlhbGl6aW5nIHZhcmlhYmxlIGluIG5lZ290aWF0aW9uIGNvZGUKICAgICBbVG9iaWFzIFdlaW5nYXJ0bmVyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSBBdWcgMTk5NQoKICAqKSBEb2Vzbid0IHBhdXNlIHRocmVlIHNlY29uZHMgYWZ0ZXIgaW5jbHVkaW5nIGEgQ0dJIHNjcmlwdCB3aGljaCBpcwogICAgIHRvbyBzbG93IHRvIGRpZSBvZmYgKHRoaXMgaXMgZG9uZSBieSBub3QgZXZlbiB0cnlpbmcgdG8ga2lsbCBvZmYKICAgICBzdWJwcm9jZXNzZXMsIGluY2x1ZGluZyB0aGUgU0lHVEVSTS9wYXVzZS9TSUdLSUxMIHJvdXRpbmUsIHVudGlsCiAgICAgYWZ0ZXIgdGhlIGVudGlyZSBkb2N1bWVudCBoYXMgYmVlbiBwcm9jZXNzZWQpLiAgW1JvYmVydCBUaGF1XQoKICAqKSBEb2Vzbid0IGRvIFNTSSBpZiBPcHRpb25zIEluY2x1ZGVzIGlzIG9mZi4gIChPb29wcykuICBbRGF2aWQgUm9iaW5zb25dCgogICopIE9wdGlvbnMgSW5jbHVkZXNOb0V4ZWMgYWxsb3dzIGluY2x1c2lvbiBvZiBhdCBsZWFzdCB0ZXh0LyogW1JveSBGaWVsZGluZ10KCiAgKikgQWxsb3dzIC5odGFjY2VzcyBmaWxlcyB0byBvdmVycmlkZSA8RGlyZWN0b3J5PiBzZWN0aW9ucyBuYW1pbmcgdGhlCiAgICAgc2FtZSBkaXJlY3RvcnkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBSZW1vdmVkIGFuIGVmZmljaWVuY3kgaGFjayBpbiBzdWJfcmVxX2xvb2t1cF91cmkgd2hpY2ggd2FzCiAgICAgY2F1c2luZyBjZXJ0YWluIGV4dHJlbWVseSBtYXJnaW5hbCBjYXNlcyAoZS5nLiwgU2NyaXB0QWxpYXMgb2YgYQogICAgICpwYXJ0aWN1bGFyKiBpbmRleC5odG1sIGZpbGUpIHRvIGZhaWwuICBbRGF2aWQgUm9iaW5zb25dCgogICopIERvZXNuJ3QgbG9nIGFuIGVycm9yIHdoZW4gdGhlIHJlcXVlc3RlZCBVUkkgcmVxdWlyZXMKICAgICBhdXRoZW50aWNhdGlvbiwgYnV0IG5vIGF1dGggaGVhZGVyIGxpbmUgd2FzIHN1cHBsaWVkIGJ5IHRoZQogICAgIGNsaWVudDsgdGhpcyBpcyBhIG5vcm1hbCBjb25kaXRpb24gKHRoZSBjbGllbnQgZG9lc24ndCBubyBhdXRoIGlzCiAgICAgbmVlZGVkIGhlcmUgeWV0KS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQmVoYXZlcyBtb3JlIHNhbmVseSB3aGVuIHRoZSBuYW1lIHNlcnZlciBsb3NlcyBpdHMgbWluZCBbU2VhbiBXZWxjaF0KCiAgKikgUkZDOTMxIGNvZGUgY29tcGlsZXMgY2xlYW5seSBvbiBvbGQgQlNESSByZWxlYXNlcyBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUkZDOTMxIGNvZGUgbm8gbG9uZ2VyIHBhc3NlcyBvdXQgbmFtZSBvZiBwcmlvciBjbGllbnRzIG9uIGN1cnJlbnQKICAgICByZXF1ZXN0cyBpZiB0aGUgY3VycmVudCByZXF1ZXN0IGNhbWUgZnJvbSBhIHNlcnZlciB0aGF0IGRvZXNuJ3QKICAgICBkbyBSRkM5MzEuICBbRGF2aWQgUm9iaW5zb25dCgogICopIENvbmZpZ3VyYXRpb24gc2NyaXB0IGFjY2VwdHMgIk1vZHVsZSIgbGluZXMgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgIFtSb2JlcnQgVGhhdV0KCiAgKikgQ2xlYW5lZCB1cCBjb21waWxlciB3YXJuaW5nIGZyb20gbW9kX2FjY2Vzcy5jIFtSb2JlcnQgVGhhdV0KCiAgKikgQ2xlYW5lZCB1cCBjb21tZW50cyBpbiBtb2RfY2dpLmMgW1JvYmVydCBUaGF1XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCBBdWcgMTk5NQoKICAqKSBXaWxkY2FyZCA8RGlyZWN0b3J5PiBzcGVjaWZpY2F0aW9ucyB3b3JrLiAgW1JvYmVydCBUaGF1XQoKICAqKSBEb2Vzbid0IGxvb3AgZm9yIGJ1Z2d5IENHSSBvbiBTb2xhcmlzIFtDbGlmZiBTa29sbmlja10KCiAgKikgU3ltbGluayBjaGVja3MgKEZvbGxvd1N5bUxpbmtzIG9mZiwgb3IgU3ltTGlua0lmT3duZXJNYXRjaCkgYWx3YXlzIGNoZWNrCiAgICAgdGhlIGZpbGUgYmVpbmcgcmVxdWVzdGVkIGl0c2VsZiwgaW4gYWRkaXRpb24gdG8gdGhlIGRpcmVjdG9yaWVzIGxlYWRpbmcKICAgICB1cCB0byBpdC4gW1JvYmVydCBUaGF1XQoKICAqKSBMb2dzIGFjY2VzcyBmYWlsdXJlcyBkdWUgdG8gc3ltbGluayBjaGVja3Mgb3IgaW52YWxpZCBjbGllbnQgYWRkcmVzcwogICAgIGluIHRoZSBlcnJvciBsb2cgW1JveSBGaWVsZGluZywgUm9iZXJ0IFRoYXVdCgogICopIFN5bWxpbmsgY2hlY2tzIGRlYWwgY29ycmVjdGx5IHdpdGggc3lzdGVtcyB3aGVyZSBsc3RhdCBvZgogICAgICIvcGF0aC90by9zb21lL2xpbmsvIiBmb2xsb3dzIHRoZSBsaW5rLiAgW1RoYXUsIEZpZWxkaW5nXQoKICAqKSBEb2Vzbid0IHJlc2V0IERpcmVjdG9yeUluZGV4IHRvICdpbmRleC5odG1sJyB3aGVuCiAgICAgb3RoZXIgZGlyZWN0b3J5IG9wdGlvbnMgYXJlIHNldCBpbiBhIC5odGFjY2VzcyBmaWxlLiAgW1JvYmVydCBUaGF1XQoKICAqKSBDbGFyaWZpZWQgaW5pdCBjb2RlIGFuZCBudWtlZCBib2d1cyB3YXJuaW5nIGluIG1vZF9hY2Nlc3MuYwogICAgIFtGbG9yZW50IEd1aWxsYXVtZV0KCiAgKikgQ29ycmVjdGVkIHNldmVyYWwgZGlyZWN0aXZlcyBpbiBzYW1wbGUgc3JtLmNvbmYKICAgICAtLS0gaW5jbHVkZXMgY29ycmVjdGlvbnMgdG8gZGlyZWN0b3J5IGluZGV4aW5nIGljb24tcmVsYXRlZCBkaXJlY3RpdmVzCiAgICAgKHVzaW5nIHVua25vd24uZ2lmIHJhdGhlciB0aGFuIHVua25vd24ueGJtIGFzIHRoZSBEZWZhdWx0SWNvbiwgZG9pbmcKICAgICBpY29ucyBmb3IgZW5jb2RpbmdzIHJpZ2h0LCBhbmQgdHVybmluZyBvbiBBZGRFbmNvZGluZyBieSBkZWZhdWx0KS4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBDb3JyZWN0ZWQgZGVzY3JpcHRpb25zIG9mIGFyZ3MgdG8gQWRkSWNvbiBhbmQgQWRkQWx0IGluIGNvbW1hbmQgdGFibGUKICAgICBbSmFtZXMgQ2xvb3NdCgogICopIElOU1RBTEwgJiBSRUFETUUgbWVudGlvbiAiY29udHJpYnV0ZWQgbW9kdWxlcyIgZGlyZWN0b3J5IFtCcmlhbgogICAgIEJlaGxlbmRvcmZdCgogICopIEZpeGVkIEVuZ2xpc2ggaW4gdGhlIGxpY2Vuc2UgbGFuZ3VhZ2UuLi4gICJmb3IgZm9yIiAtLT4gImZvciIuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4ZWQgU2NyaXB0QWxpYXMvQWxpYXMgaW50ZXJhY3Rpb24gYnkgbW92aW5nIFNjcmlwdEFsaWFzIGhhbmRsaW5nIHRvCiAgICAgbW9kX2FsaWFzLmMsIG1lcmdpbmcgaXQgYWxtb3N0IGNvbXBsZXRlbHkgd2l0aCBoYW5kbGluZyBvZiBBbGlhcywgYW5kCiAgICAgYWRkaW5nIGEgJ25vdGVzJyBmaWVsZCB0byB0aGUgcmVxdWVzdF9yZWMgd2hpY2ggYWxsb3dzIHRoZSBDR0kgbW9kdWxlCiAgICAgdG8gZGlzY292ZXIgd2hldGhlciB0aGUgQWxpYXMgbW9kdWxlIGhhcyBwdXQgdGhpcyByZXF1ZXN0IHRocm91Z2gKICAgICBTY3JpcHRBbGlhcyAod2hpY2ggaXQgbmVlZHMgdG8ga25vdyBmb3IgYmFjay1jb21wYXRpYmlsaXR5LCBhcyB0aGUgb2xkCiAgICAgTkNTQSBjb2RlIGRpZCBub3QgY2hlY2sgT3B0aW9ucyBFeGVjQ0dJIGluIFNjcmlwdEFsaWFzIGRpcmVjdG9yaWVzKS4KICAgICBbUm9iZXJ0IFRoYXVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4IEF1ZyAxOTk1CgogICopIEFsbG93T3ZlcnJpZGUgYXBwbGllcyB0byB0aGUgbmFtZWQgZGlyZWN0b3J5LCBhbmQgbm90IGp1c3QKICAgICBzdWJkaXJlY3Rvcmllcy4gIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRG8gbG9ja2luZyBmb3IgYWNjZXB0KCkgZXhjbHVzaW9uIChvbiBzeXN0ZW1zIHRoYXQgbmVlZCBpdCkKICAgICB1c2luZyBhIHNwZWNpYWwgZmlsZSBjcmVhdGVkIGZvciB0aGUgcHVycG9zZSBpbiAvdXNyL3RtcCwgYW5kCiAgICAgbm90IHRoZSBlcnJvciBsb2c7IHVzaW5nIHRoZSBlcnJvciBsb2cgY2F1c2VzIHJlYWwgcHJvYmxlbXMKICAgICBpZiBpdCdzIE5GUy1tb3VudGVkOyB0aGlzIGlzIGtub3duIHRvIGJlIHRoZSBjYXVzZSBvZiBhIHdob2xlCiAgICAgbG90IG9mICJzZXJ2ZXIgaGFuZyIgcHJvYmxlbXMgd2l0aCBTb2xhcmlzLiAgW0RhdmlkIFJvYmluc29uOwogICAgIHRoYW5rcyB0byBNZXJ0ZW4gU2NodW1hbm4gZm9yIGhlbHAgZGlhZ25vc2luZyB0aGUgcHJvYmxlbV0uCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC45ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIEF1ZyAxOTk1CgogICopIENvbXBpbGVzIHdpdGggLURNQVhJTVVNX0ROUyAtLS0tIG9vb3BzISBbSGVucmlrIE1vcnRlbnNlbl0KCiAgKikgTmVzdGVkIGluY2x1ZGVzIHNlZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb2YgdGhlIGluY2x1ZGluZyBkb2N1bWVudCwKICAgICBmb3IgTkNTQSBidWctY29tcGF0aWJpbGl0eSAoc29tZSBzaXRlcyBoYXZlIHN0YW5kYXJkIGZvb3RlciBpbmNsdWRlcwogICAgIHdoaWNoIHRyeSB0byBwcmludCBvdXQgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSkuICBbRXJpYyBIYWdiZXJnL1JvYmVydAogICAgIFRoYXVdCgogICopIDwhLS1leGVjIGNnaT0iL3NvbWUvdXJpL2hlcmUiLS0+IGFsd2F5cyB0cmVhdHMgdGhlIGl0ZW0gbmFtZWQgYnkgdGhlCiAgICAgVVJJIGFzIGEgQ0dJIHNjcmlwdCwgZXZlbiBpZiBpdCB3b3VsZCBoYXZlIGJlZW4gdHJlYXRlZCBhcyBzb21ldGhpbmcKICAgICBlbHNlIGlmIHJlcXVlc3RlZCBkaXJlY3RseSwgZm9yIE5DU0EgYmFjay1jb21wYXRpYmlsaXR5LiAgKE5vdGUgdGhhdAogICAgIHRoaXMgbWVhbnMgdGhhdCBwZW9wbGUgd2hvIGtub3cgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBjYW4gc2VlIHRoZQogICAgIGNvZGUganVzdCBieSBhc2tpbmcgZm9yIGl0KS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgTmV3IHZlcnNpb24gb2YgZGJtbWFuYWdlIHNjcmlwdCBpbmNsdWRlZCBpbiBzdXBwb3J0IGRpcmVjdG9yeSBhcwogICAgIGRibW1hbmFnZS5uZXcuCgogICopIENoZWNrIGlmIHNjb3JlYm9hcmQgZmlsZSBjb3VsZG4ndCBiZSBvcGVuZWQsIGFuZCBzYXkgc28sIHJhdGhlcgogICAgIHRoZW4gZ29pbmcgaW5zYW5lIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgUE9TVCB0byBDR0kgd29ya3Mgb24gQS9VWCBbSmltIEphZ2llbHNraV0KCiAgKikgQWRkSWNvbiBhbmQgQWRkQWx0IGNvbW1hbmRzIHdvcmsgcHJvcGVybHkgW1JvYiBIYXJ0aWxsXQoKICAqKSBOQ1NBIHNlcnZlciBwdXNoIHdvcmtzIHByb3Blcmx5IC0tLSB0aGUgQXJlbmEgYnVnIGNvbXBhdGliaWxpdHkKICAgICB3b3JrYXJvdW5kLCB3aGljaCBicm9rZSBpdCwgaXMgZ29uZSAodXNlIC1EQVJFTkFfQlVHX1dPUktBUk9VTkQKICAgICBpZiB5b3Ugc3RpbGwgd2FudCB0aGUgd29ya2Fyb3VuZCkuICBbUm9iIEhhcnRpbGxdCgogICopIElmIGNsaWVudCBkaWRuJ3Qgc3VibWl0IGFueSBBY2NlcHQtZW5jb2RpbmdzLCBpZ25vcmUgZW5jb2RpbmdzIGluCiAgICAgY29udGVudCBuZWdvdGlhdGlvbi4gIChOQiB0aGlzIHdpbGwgYWxsIGhhdmUgdG8gYmUgcmV3b3JrZWQgYW55d2F5CiAgICAgZm9yIHRoZSBuZXcgSFRUUCBkcmFmdCkuICBbRmxvcmVudCBHdWlsbGF1bWVdCgogICopIERvbid0IGR1bXAgY29yZSB3aGVuIHRyeWluZyB0byBsb2cgdGltZWQtb3V0IHJlcXVlc3RzIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZWFsbHkgaG9ub3IgQ2FjaGVOZWdvdGlhdGVkRG9jcyBbRmxvcmVudCBHdWlsbGF1bWVdCgogICopIEdpdmUgUmVkaXJlY3QgcHJpb3JpdHkgb3ZlciBBbGlhcywgZm9yIE5DU0EgYnVnIGNvbXBhdGliaWxpdHkKICAgICBbRGF2aWQgUm9iaW5zb25dCgogICopIENvcnJlY3RseSBzZXQgUEFUSF9UUkFOU0xBVEVEIGluIGFsbCBjYXNlcyBmcm9tIDwhLS0jZXhlYyBjbWQ9IiItLT4sCiAgICAgcGFyYWxsZWxpbmcgZWFybGllciBidWcgZml4IGZvciBDR0kgW0RhdmlkIFJvYmluc29uXQoKICAqKSBJZiBEQk0gYXV0aCBpcyBpbXByb3Blcmx5IGNvbmZpZ3VyZWQsIHJlcG9ydCBhIHNlcnZlciBlcnJvciBhbmQgZG9uJ3QKICAgICBkdW1wIGNvcmUuCgogICopIERlbGV0ZWQgRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFRTIGZyb20gY29uZi5oIGVudHJ5IGZvciBBL1VYOwogICAgIGl0IHNlZW1zIHRvIHdvcmsgd2VsbCBlbm91Z2ggd2l0aG91dCBpdCAoZXZlbiBpbiBhIDEwIGhpdHMvc2VjCiAgICAgd29ya291dCksIGFuZCB0aGUgb3ZlcmhlYWQgZm9yIHRoZSBsb2NraW5nIHVuZGVyIEEvVVggaXMKICAgICBhbGFybWluZ2x5IGhpZ2ggKHRob3VnaCBpdCBpcyB2ZXJ5IGxvdyBvbiBvdGhlciBzeXN0ZW1zKS4KICAgICBbRXJpYyBIYWdiZXJnLCBKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXhlZCBwb3J0YWJpbGl0eSBwcm9ibGVtcyB3aXRoIG1vZF9jb29raWVzLmMgW0NsaWZmIFNrb2xuaWNrXQoKICAqKSBGdXJ0aGVyIGRlLUJlcmtsaXplIG1vZF9jb29raWVzLmM7IGNoYW5nZSB0aGUgYm9ndXMgI2luY2x1ZGUuICBbQnJpYW4KICAgICBCZWhsZW5kb3JmL0VyaWMgSGFnYmVyZ10KCiAgKikgTW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciBBL1VYIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBDb21waWxlcyBjbGVhbiBvbiBORVhUIFtSb2IgSGFydGlsbF0KCiAgKikgQ29tcGlsZXMgY2xlYW4gb24gU0dJIFtSb2JlcnQgVGhhdV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDggQXVnIDE5OTUKCiAgKikgU3VuT1MgbGlicmFyeSBwcm90b3R5cGVzIG5vdyBuZXZlciBpbmNsdWRlZCB1bmxlc3MgZXhwbGljaXRseQogICAgIHJlcXVlc3RlZCBpbiB0aGUgY29uZmlndXJhdGlvbiAodmlhIC1EU1VOT1NfTElCX1BST1RPVFlQRVMpOwogICAgIHBlb3BsZSB1c2luZyBHTlUgbGliYyBvbiBTdW5PUyBhcmUgc2NyZXdlZCBieSBwcm90b3R5cGVzIGZvciB0aGUKICAgICBzdGFuZGFyZCBsaWJyYXJ5LgoKICAgICAoVGhvc2Ugd2hvIHdpc2ggdG8gY29tcGlsZSBjbGVhbiB3aXRoIGdjYyAtV2FsbCBvbiBhIHN0YW5kYXJkCiAgICAgU3VuT1Mgc2V0dXAgbmVlZCB0aGUgcHJvdG90eXBlcywgYW5kIG1heSBvYnRhaW4gdGhlbSB1c2luZwogICAgIC1EU1VOT1NfTElCX1BST1RPVFlQRVMuICBUaG9zZSB3aXNoaW5nIHRvIHVzZSAtV2FsbCBvbiBhIHN5c3RlbQogICAgIHdpdGggbm9uc3RhbmRhcmQgbGlicmFyaWVzIGFyZSBwcmVzdW1hYmx5IGNvbXBldGVudCB0byBtYWtlIHRoZWlyCiAgICAgb3duIGFycmFuZ2VtZW50cykuCgogICopIFN0cmlwcyB0cmFpbGluZyAnLycgY2hhcmFjdGVycyBvZmYgYm90aCBhcmdzIHRvIHRoZSBBbGlhcyBjb21tYW5kLAogICAgIHRvIG1ha2UgJ0FsaWFzIC9mb28vIC9iYXIvJyB3b3JrLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMyBBdWcgMTk5NQoKICAqKSBEb24ndCBoYW5nIHdoZW4gcmVzdGFydGluZyB3aXRoIGEgY2hpbGQgZnJvbSAnVHJhbnNmZXJMb2cgInwuLi4iJyBydW5uaW5nCiAgICAgW3JlcG9ydGVkIGJ5IERhdmlkIFJvYmluc29uXQoKICAqKSBDb21waWxlcyBjbGVhbiBvbiBPU0YvMSBbRGF2aWQgUm9iaW5zb25dCgogICopIEFkZGVkIHNvbWUgb2YgdGhlIG1vcmUgcmVjZW50IHNpZ25pZmljYW50IGNoYW5nZXMgKEFkZExhbmd1YWdlIHN0dWZmLAogICAgIGV4cGVyaW1lbnRhbCBMb2dGb3JtYXQgc3VwcG9ydCkgdG8gQ0hBTkdFUyBmaWxlIGluIGRpc3RyaWJ1dGlvbiByb290CiAgICAgZGlyZWN0b3J5CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAyIEF1ZyAxOTk1CgogICopIERlbGV0ZWQgTmV0c2NhcGUgcmVsb2FkIHdvcmthcm91bmQgLS0tIGl0J3MgaW4gdmlvbGF0aW9uIG9mIEhUVFAgc3BlY3MuCiAgICAgKElmIHlvdSBhY3R1YWxseSB3YW50ZWQgYSBjb25kaXRpb25hbCBHRVQgd2hpY2ggYnlwYXNzZWQgdGhlIGNhY2hlLCB5b3UKICAgICBjb3VsZG4ndCBnZXQgaXQpLiBbUmVwb3J0ZWQgYnkgUm95IEZpZWxkaW5nXQoKICAqKSBQcm9wZXJseSB0ZXJtaW5hdGUgaGVhZGVycyBvbiAnMzA0IE5vdCBNb2RpZmllZCcgcmVwbGllcyB0byBjb25kaXRpb25hbAogICAgIEdFVHMgLS0tIG5vIGJyb3dzZXIgd2UgY2FuIGZpbmQgY2FyZXMgbXVjaCwgYnV0IHRoZSBDRVJOIHByb3h5IGNob2tlcy4KICAgICBbUmVwb3J0ZWQgYnkgQ2xpZmYgU2tvbG5pY2s7IGZpeCBkaXNjb3ZlcmVkIGluZGVwZW5kZW50bHkgYnkgUm9iIEhhcnRpbGxdCgogICopIGh0dHBkIC12IGRvZXNuJ3QgY2FsbCBpdHNlbGYgIlNoYW1iaGFsYSIuICBbUmVwb3J0ZWQgYnkgQ2h1Y2sgTXVyY2tvXQoKICAqKSBTdW5PUyBsaWItZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBjb25mLmggY29uZGl0aW9uYWxpemVkIG9uIF9fR05VQ19fLAogICAgIG5vdCBfX1NVTlBST19DICh0aGV5J3JlIG5lZWRlZCB0byBxdWlldCBnY2MgLVdhbGwsIGJ1dCBhY2MgY2hva2VzIG9uICdlbSwKICAgICBhbmQgb2xkZXIgdmVyc2lvbnMgZG9uJ3Qgc2V0IHRoZSBfX1NVTlBST19DIHByZXByb2Nlc3NvciB2YXJpYWJsZSkuICBPbgogICAgIGFsbCBvdGhlciBzeXN0ZW1zLCB0aGVzZSBhcmUgbmV2ZXIgdXNlZCBhbnl3YXkuICBbUmVwb3J0ZWQgYnkgTWFyayBDb3hdLgoKICAqKSBTY29yZWJvYXJkIGZpbGUgKC90bXAvaHRzdGF0dXMuKikgbm8gbG9uZ2VyIHB1YmxpY2FsbHkgd3JpdGFibGUuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIEF1ZyAxOTk1CgogICopIEFkZGVkIGxhc3QtbWludXRlIGNvbmZpZ3VyYWJsZSBsb2cgZXhwZXJpbWVudCwgYXMgb3B0aW9uYWwgbW9kdWxlCgogICopIENvcnJlY3RseSBzZXQgci0+Ynl0ZXNfc2VudCBmb3IgSFRUUC8wLjkgcmVxdWVzdHMsIHNvIHRoZXkgZ2V0IGxvZ2dlZAogICAgIHByb3Blcmx5LiAgKE9uZS1saW5lIGZpeCB0byBodHRwX3Byb3RvY29sLmMpLgoKICAqKSBXb3JrIGFyb3VuZCBib2d1cyBiZWhhdmlvciB3aGVuIHJlbG9hZGluZyBmcm9tIE5ldHNjYXBlLgogICAgIEl0J3MgTmV0c2NhcGUncyBidWcgLS0tIGZvciBzb21lIHJlYXNvbiB0aGV5IGV4cGVjdCBhIHJlcXVlc3Qgd2l0aAogICAgIElmLW1vZGlmaWVkLXNpbmNlOiB0byBub3QgZnVuY3Rpb24gYXMgYSBjb25kaXRpb25hbCBHRVQgaWYgaXQgYWxzbwogICAgIGNvbWVzIHdpdGggUHJhZ21hOiBuby1jYWNoZSwgd2hpY2ggaXMgd2F5IG91dCBvZiBsaW5lIHdpdGggdGhlIEhUVFAKICAgICBzcGVjIChhY2NvcmRpbmcgdG8gUm95IEZpZWxkaW5nLCB0aGUgcmVkYWN0b3IpLgoKICAqKSBBZGRlZCBwYXJhbWV0ZXIgdG8gc2V0IG1heGltdW0gbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMuCgogICopIEFkZGVkIHBhdGNoZXMgdG8gbWFrZSBpdCB3b3JrIG9uIEEvVVguICBBL1VYIGlzICp3ZWlyZCouICBbRXJpYyBIYWdiZXJnLAogICAgIEppbSBKYWdpZWxza2ldCgogICopIElkZW50aXR5Q2hlY2sgYnVnZml4IFtDaHVjayBNdXJja29dLgoKICAqKSBDb3JyZWN0ZWQgY2dpLXNyYy9NYWtlZmlsZSBlbnRyeSBmb3IgbmV3IGltYWdlbWFwIHNjcmlwdC4gIFtBbGV4ZWkgS29zdXRdCgogICopIE1vcmUgc2FtcGxlIGNvbmZpZyBmaWxlIGNvcnJlY3Rpb25zOyBhZGQgZXh0ZW5zaW9uIHRvIEFkZFR5cGUgZm9yCiAgICAgKi5hc2lzLCBtb3ZlIEFkZFR5cGUgZ2VuZXJpYyBkZXNjcmlwdGlvbiB0byBpdHMgcHJvcGVyIHBsYWNlLCBhbmQKICAgICBmaXggbWlzY2VsbGFuZW91cyB0eXBvcy4gWyBBbGV4ZWkgS29zdXQgXQoKICAqKSBEZWxldGVkIHRoZSAqb3RoZXIqIHJlZmVyZW5jZSB0byB0aGUgcmVnZW50cyBmcm9tIHRoZSBCZXJrZWxleQogICAgIGxlZ2FsIGRpc2NsYWltZXIgKGV2ZXJ5cGxhY2UpLgoKICAqKSBOdWtlZCBTaGFtYmhhbGEgbmFtZSBmcm9tIHNyYy9SRUFETUU7IGhhZCBhbHJlYWR5IGNsZWFuZWQgaXQgb3V0CiAgICAgb2YgZXZlcnl3aGVyZSBlbHNlLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNAoKICAqKSBDaGFuZ2VzIHRvIHNlcnZlci1wb29sIG1hbmFnZW1lbnQgcGFybXMgLS0tIHJlbmFtZWQgY3VycmVudAogICAgIFN0YXJ0U2VydmVycyB0byBNaW5TcGFyZVNlcnZlcnMsIGNyZWF0ZWQgc2VwYXJhdGUgU3RhcnRTZXJ2ZXJzCiAgICAgcGFyYW1ldGVyIHdoaWNoIG1lYW5zIHdoYXQgaXQgc2F5cywgYW5kIHJlbmFtZWQgTWF4U2VydmVycyB0bwogICAgIE1heFNwYXJlU2VydmVycyAodGhvdWdoIHRoZSBvbGQgbmFtZSBzdGlsbCB3b3JrcywgZm9yIE5DU0EgMS40CiAgICAgYmFjay1jb21wYXRpYmlsaXR5KS4gIFRoZSBvbGQgbmFtZXMgd2VyZSBnZW5lcmFsbHkgcmVnYXJkZWQgYXMKICAgICB0b28gY29uZnVzaW5nLiAgQWxzbyBhbHRlcmVkICJkb2NzIiBpbiBzYW1wbGUgY29uZmlnIGZpbGVzLgoKICAqKSBNb3JlIGltcHJvdmVtZW50cyB0byBkZWZhdWx0IGNvbmZpZyBmaWxlcyAtLS0KICAgICBzYW1wbGUgZGlyZWN0aXZlcyAoY29tbWVudGVkIG91dCkgZm9yIFhCaXRIYWNrLCBCaW5kQWRkcmVzcywKICAgICBDYWNoZU5lZ290aWF0ZWREb2NzLCBWaXJ0dWFsSG9zdDsgZGVjZW50IHNldCBvZiBBZGRMYW5ndWFnZQogICAgIGRlZmF1bHRzLCBBZGRUeXBlcyBmb3Igc2VuZC1hcy1pcyBhbmQgaW1hZ2VtYXAgbWFnaWMgdHlwZXMsIGFuZAogICAgIGltcHJvdmVtZW50cyB0byBzYW1wbGVzIGZvciBEaXJlY3RvcnlJbmRleCBbQWxleGVpIEtvc3V0XQoKICAqKSBZZXQgbW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBjb25maWcgZmlsZXMgLS0tIGNoYW5nZXMgdG8KICAgICBBbGV4ZWkncyBzYW1wbGUgQWRkTGFuZ3VhZ2UgZGlyZWN0aXZlcywgYW5kIHNhbXBsZSBMYW5ndWFnZVByaW9yaXR5CiAgICAgWyBGbG9yZW50IEd1aWxsYXVtZSBdCgogICopIFNldCBjb25maWcgZmlsZSBsb2NhdGlvbnMgcHJvcGVybHkgaWYgbm90IHNldCBpbiBodHRwZC5jb25mCiAgICAgWyBEYXZpZCBSb2JpbnNvbiBdCgogICopIERvbid0IGVzY2FwZSBVUklzIGluIGludGVybmFsIHJlZGlyZWN0cyBtdWx0aXBsZSB0aW1lczsgZG9uJ3QKICAgICBkbyB0aGF0IHdoZW4gdHJhbnNsYXRpbmcgUEFUSF9JTkZPIHRvIFBBVEhfVFJBTlNMQVRFRCBlaXRoZXIuCiAgICAgWyBEYXZpZCBSb2JpbnNvbiBdCgogICopIENvcnJlY3RlZCBzcGVsbGluZyBvZiAiUmVxdWlyZWQiIGluIDQwMSBlcnJvciByZXBvcnRzIFtBbmRyZXcgV2lsc29uXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMwoKICAqKSBFZGl0ZWQgZGlzdHJpYnV0aW9uIFJFQURNRSB0byAqYnJpZWZseSogc3VtbWFyaXplIGluc3RhbGxhdGlvbgogICAgIHByb2NlZHVyZXMsIGFuZCBnaXZlIGEgcG9pbnRlciB0byB0aGUgSU5TVEFMTCBmaWxlIGluIHRoZSBzcmMvCiAgICAgZGlyZWN0b3J5LgoKICAqKSBVcGdyYWRlZCBpbWFnZW1hcCBzY3JpcHQgaW4gY2dpLWJpbiB0byAxLjggdmVyc2lvbiBmcm9tIG1vcmUKICAgICByZWNlbnQgTkNTQSBkaXN0cmlidXRpb25zLgoKICAqKSBCdWcgZml4IHRvIHByZXZpb3VzIGJ1ZyBmaXggLS0tIGlmIC5odGFjY2VzcyBmaWxlIGFuZCA8RGlyZWN0b3J5PgogICAgIGV4aXN0IGZvciB0aGUgc2FtZSBkaXJlY3RvcnksIHVzZSBib3RoIGFuZCBkb24ndCBzZWdmYXVsdC4gIFtSZXBvcnRlZAogICAgIGJ5IERhdmlkIFJvYmluc29uXQoKICAqKSBQcm9wZXIgbWFrZWZpbGUgZGVwZW5kZW5jaWVzIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgTm90ZSAocmUpc3RhcnRzIGluIGVycm9yIGxvZyAtLS0gcmVwb3J0ZWQgYnkgUm9iIEhhcnRpbGwuCgogICopIE9ubHkgY2FsbCBubzJzbGFzaCgpIGFmdGVyIGdldF9wYXRoX2luZm8oKSBoYXMgYmVlbiBkb25lLCB0bwogICAgIHByZXNlcnZlIG11bHRpcGxlIHNsYXNoZXMgaW4gdGhlIFBBVEhfSU5GTyBbTkNTQSBjb21wYXRpYmlsaXR5LAogICAgIHJlcG9ydGVkIGJ5IEFuZHJldyBXaWxzb24sIHRob3VnaCB0aGlzIG9uZSBpcyBwcm9iYWJseSBhIHJlYWwgYnVnXQoKICAqKSBGaXhlZCBtb2RfaW1hcC5jIC0tLSByZWxhdGl2ZSBwYXRocyB3aXRoIGJhc2VfdXJpIHJlZmVyZXIgZG9uJ3QKICAgICBkdW1wIGNvcmUgd2hlbiBSZWZlcmVyIGlzIG5vdCBzdXBwbGllZC4gW1JhbmR5IFRlcmJ1c2hdCgogICopIExpZ2h0bHkgZWRpdGVkIHNhbXBsZSBjb25maWcgZmlsZXMgdG8gcmVmZXIgcGVvcGxlIHRvIG91ciBkb2N1bWVudGF0aW9uCiAgICAgaW5zdGVhZCBvZiBOQ1NBJ3MsIGFuZCB0byBsaXN0IFJvYiBNY0Nvb2wgYXMgKm9yaWdpbmFsKiBhdXRob3IgKGFsc28KICAgICBkZWxldGVkIGhpcyBvbGQsIGFuZCBubyBkb3VidCBub24tZnVuY3Rpb25hbCBlbWFpbCBhZGRyZXNzKS4gIFdvdWxkIGJlCiAgICAgbmljZSB0byBoYXZlIGV4YW1wbGVzIG9mIG5ldyBmZWF0dXJlcy4uLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBKdWwgMTk5NQoKICAqKSBBZGRlZCBBZGRMYW51YWdlIGNvZGUgW0Zsb3JlbnQgR3VpbGxhdW1lXQoKICAqKSBEb24ndCBzYXkgImFjY2VzcyBmb3JiaWRkZW4iIHdoZW4gYSBDR0kgc2NyaXB0IGlzIG5vdCBmb3VuZC4gIFtNYXJrIENveF0KCiAgKikgQWxsIHNvcnRzIG9mIHByb2JsZW1zIHdoZW4gTXVsdGlWaWV3cyBmaW5kcyBhIGRpcmVjdG9yeS4gIEl0IHdvdWxkCiAgICAgYmUgbmljZSBpZiBtb2RfZGlyLmMgd2FzIHJvYnVzdCBlbm91Z2ggdG8gaGFuZGxlIHRoYXQsIGJ1dCBmb3Igbm93LAogICAgIGp1c3QgcHVudC4gIFtyZXBvcnRlZCBieSBCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBXYWl0IGZvciBhbGwgY2hpbGRyZW4gb24gcmVzdGFydCwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9sZCBzb2NrZXQKICAgICBpcyBnb25lIGFuZCB3ZSBjYW4gcmVvcGVuIGl0LiAgW3JlcG9ydGVkIGJ5IFJhbmR5IFRlcmJ1c2hdCgogICopIEltYWdlbWFwIG1vZHVsZSBpcyBlbmFibGVkIGluIGRlZmF1bHQgQ29uZmlndXJhdGlvbgoKICAqKSBSZWZlcmVyTG9nIGFuZCBVc2VyQWdlbnRMb2cgbW9kdWxlcyBwcm9wZXJseSBkZWZhdWx0IHRoZSBsb2dmaWxlCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIE1hcmsgQ294J3MgbW9kX2Nvb2tpZXMgYWRkZWQgdG8gdGhlIGRpc3RyaWJ1dGlvbiBhcyBhbiBvcHRpb25hbAogICAgIG1vZHVsZSAoY29tbWVudGVkIG91dCBpbiB0aGUgZGVmYXVsdCBDb25maWd1cmF0aW9uLCBhbmQgbm90ZWQgYXMKICAgICBhbiBleHBlcmltZW50LCBhbG9uZyB3aXRoIG1vZF9kbGQpLiBbTWFyayBDb3hdCgogICopIENvbXBpbGVzIG9uIFVMVFJJWCAoYSBjb250aW51aW5nIGJhdHRsZS4uLikuIFtSb2JlcnQgVGhhdV0KCiAgKikgRml4ZWQgbmFzdHkgYnVnIGluIFNJR1RFUk0gaGFuZGxpbmcgW3JlcG9ydGVkIGJ5IFJhbmR5IFRlcmJ1c2hdCgogICopIENoYW5nZWQgIlNoYW1iaGFsYSIgdG8gIkFwYWNoZSIgaW4gQVBJIGRvY3MuIFtSb2JlcnQgVGhhdV0KCiAgKikgQWRkZWQgbmV3LCB0b290aGllciBsZWdhbCBkaXNjbGFpbWVyLiBbUm9iZXJ0IFRoYXU7IGNvcGllZCBmcm9tIEJTRAogICAgIGxpY2Vuc2VdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xCgogICopIE5ldyBpbWFnZW1hcCBtb2R1bGUgW1JhbmR5IFRlcmJ1c2hdCgogICopIFJlcGxhY2VtZW50IHJlZmVyZXIgbG9nIG1vZHVsZSB3aXRoIE5DU0EtY29tcGF0aWJsZSBSZWZlcmVySWdub3JlCiAgICAgW01hdHRoZXcgR3JheSBhZ2Fpbl0KCiAgKikgRG9uJ3QgbXVuZyBkaXJlY3RvcnkgbGlzdGluZ3Mgd2l0aCB2ZXJ5IGxvbmcgZmlsZW5hbWVzLgogICAgIFtGbG9yZW50IEd1aWxsYXVtZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjAgKG5lZSBTaGFtYmhhbGEgMC42LjIpICAgICAgICAgICAgICAgICAgMTYgSnVsIDE5OTUKCiAgKikgTmV3IGNvbmZpZyBzY3JpcHQuICBTZWUgSU5TVEFMTCBmb3IgaW5mby4gIFtSb2JlcnQgVGhhdV0KCiAgKikgU2NvcmVib2FyZCBtZWNoYW5pc20gZm9yIHJlZ3VsYXRpbmcgdGhlIG51bWJlciBvZiBleHRhbnQgc2VydmVyCiAgICAgcHJvY2Vzc2VzLiAgTWF4U2VydmVycyBhbmQgU3RhcnRTZXJ2ZXJzIGRlZmF1bHRzIGFyZSB0aGUgc2FtZSBhcwogICAgIGZvciBOQ1NBLCBidXQgdGhlIG1lYW5pbmdzIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQuICAoQWN0dWFsbHksCiAgICAgSSBzaG91bGQgcHJvYmFibHkgbG93ZXIgdGhlIE1heFNlcnZlcnMgZGVmYXVsdCB0byAxMCkuCgogICAgIEJlZm9yZSBhc2tpbmcgZm9yIGEgbmV3IGNvbm5lY3Rpb24sIGVhY2ggc2VydmVyIHByb2Nlc3MgY2hlY2tzCiAgICAgdGhlIG51bWJlciBvZiBvdGhlciBzZXJ2ZXJzIHdoaWNoIGFyZSBhbHNvIHdhaXRpbmcgZm9yIGEKICAgICBjb25uZWN0aW9uLiAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBNYXhTZXJ2ZXJzLCBpdCBxdWlldGx5IGRpZXMKICAgICBvZmYuICBDb252ZXJzZWx5LCBldmVyeSBzZWNvbmQsIHRoZSByb290LCBvciBjYXJldGFrZXIsIHByb2Nlc3MKICAgICBsb29rcyB0byBzZWUgaG93IG1hbnkgc2VydmVycyBhcmUgd2FpdGluZyBmb3IgYSBuZXcgY29ubmVjdGlvbjsKICAgICBpZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBTdGFydFNlcnZlcnMsIGl0IHN0YXJ0cyBhIG5ldyBvbmUuICBUaGlzCiAgICAgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VydmVyIHByb2Nlc3NlcyBhbHJlYWR5IGV4dGFudC4KICAgICBUaGUgYWNjb3VudGluZyBpcyBhcnJhbmdlZCB0aHJvdWdoIGEgInNjb3JlYm9hcmQiIGZpbGUsIG5hbWVkCiAgICAgL3RtcC9odHN0YXR1cy4qLCBvbiB3aGljaCBlYWNoIHByb2Nlc3MgaGFzIGFuIGluZGVwZW5kZW50IGZpbGUKICAgICBkZXNjcmlwdG9yICh0aGV5IG5lZWQgdG8gc2VlayB3aXRob3V0IGludGVyZmVyZW5jZSkuCgogICAgIFRoZSBlbmQgZWZmZWN0IGlzIHRoYXQgTWF4U2VydmVycyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKICAgICBzZXJ2ZXJzIG9uIGFuICppbmFjdGl2ZSogc2VydmVyIG1hY2hpbmUsIGJ1dCBtb3JlIHdpbGwgYmUgZm9ya2VkCiAgICAgb2ZmIHRvIGhhbmRsZSB1bnVzdWFsbHkgaGVhdnkgbG9hZHMgKG9yIHVudXN1YWxseSBzbG93IGNsaWVudHMpOwogICAgIHRoZXNlIHdpbGwgZGllIG9mZiB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQgLS0tIHdpdGhvdXQKICAgICByZXZlcnRpbmcgdG8gdGhlIG92ZXJoZWFkIG9mIGZ1bGwgZm9ya2luZyBvcGVyYXRpb24uICBUaGVyZSBpcyBhCiAgICAgaGFyZCBtYXhpbXVtIG9mIDE1MCBzZXJ2ZXIgcHJvY2Vzc2VzIGNvbXBpbGVkIGluLCBsYXJnZWx5IHRvCiAgICAgYXZvaWQgZm9ya2luZyBvdXQgb2YgY29udHJvbCBhbmQgZHJhZ2dpbmcgdGhlIG1hY2hpbmUgZG93bi4KICAgICAoVGhpcyBpcyBhcmd1YWJseSB0b28gaGlnaCkuCgogICAgIEluIG15IHNlcnZlciBlbmR1cmFuY2UgdGVzdHMsIHRoaXMgbWVjaGFuaXNtIGRpZCBub3QgYXBwZWFyIHRvCiAgICAgaW1wb3NlIGFueSBzaWduaWZpY2FudCBvdmVyaGVhZCwgZXZlbiBhZnRlciBJIGZvcmNlZCBpdCB0byBwdXQgdGhlCiAgICAgc2NvcmVib2FyZCBmaWxlIG9uIGEgbm9ybWFsIGZpbGVzeXN0ZW0gKHdoaWNoIG1pZ2h0IGhhdmUgbW9yZQogICAgIG92ZXJoZWFkIHRoYW4gdG1wZnMpLiAgW1JvYmVydCBUaGF1XQoKICAqKSBTZXQgSFRUUF9GT08gdmFyaWFibGVzIGZvciBTU0kgPCEtLSNleGVjIGNtZC0tPnMsIG5vdCBqdXN0IENHSSBzY3JpcHRzLgogICAgIFtDbGlmZiBTa29sbmlja10KCiAgKikgUmVhZCAuaHRhY2Nlc3MgZmlsZXMgZXZlbiBpbiBkaXJlY3Rvcnkgd2l0aCA8RGlyZWN0b3J5PiBzZWN0aW9uLgogICAgIChGb3JtZXIgaW5jb21wYXRpYmlsaXR5IG5vdGVkIG9uIG1haWxpbmcgbGlzdCwgbm93IGZpeGVkKS4gW1JvYmVydAogICAgIFRoYXVdCgogICopICJIRUFEIC8iIGdpdmVzIHRoZSBjbGllbnQgYSAiQmFkIFJlcXVlc3QiIGVycm9yIG1lc3NhZ2UsIHJhdGhlcgogICAgIHRoYW4gdHJ5aW5nIHRvIHNlbmQgbm8gYm9keSAqYW5kKiBubyBoZWFkZXJzLiAgW0NsaWZmIFNrb2xuaWNrXS4KCiAgKikgRG9uJ3QgcHJvZHVjZSBkb3VibGUgZXJyb3IgcmVwb3J0cyBmb3Igc29tZSB2ZXJ5IG9ic2N1cmUgY2FzZXMKICAgICBtYWlubHkgaW52b2x2aW5nIGF1dGggY29uZmlndXJhdGlvbiAodGhlICJhbGwgbW9kdWxlcyBkZWNsaW5lIHRvCiAgICAgaGFuZGxlIiBjYXNlIHdoaWNoIGlzIGEgc3VyZSBzaWduIG9mIGEgc2VydmVyIGJ1ZyBpbiBtb3N0IGNhc2VzLAogICAgIGJ1dCBhbHNvIGhhcHBlbnMgd2hlbiBhdXRoZW50aWNhdGlvbiBpcyBiYWRseSBtaXNjb25maWd1cmVkKS4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIE1vdmVkIEZDTlRMX1NFUklBTElaRURfQUNDRVBUIGRlZmluZXMgaW50byBjb25mLmggKHRoYXQncyB3aGF0CiAgICAgaXQncyAqZm9yKiwgYW5kIHRoaXMgc29ydCBvZiB0aGluZyByZWFsbHkgc2hvdWxkbid0IGJlIGNsdXR0ZXJpbmcKICAgICB1cCB0aGUgTWFrZWZpbGUpLiBbUm9iZXJ0IFRoYXVdCgogICopIEluY2lkZW50YWwgY29kZSBjbGVhbnVwcyBpbiBodHRwX21haW4uYyAtLS0gc3RvcCBkcmFnZ2luZwogICAgIHNhX2NsaWVudCBhcm91bmQ7IGp1c3QgZGVjbGFyZSBpdCB3aGVyZSB1c2VkLiAgW1JvYmVydCBUaGF1XQoKICAqKSBBbm90aGVyIGFjYy1yZWxhdGVkIGZpeC4gIChJdCBkb2Vzbid0IGxpa2UgY29uc3QgY2hhcgogICAgIGluIHNvbWUgcGxhY2VzLi4uKS4gW01hcmsgQ294XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjYuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyBKdWwgMTk5NQoKICAqKSBGaXhlZCBhdXRoX25hbWUtcmVsYXRlZCB0eXBvcyBpbiBodHRwX2NvcmUuYyBbQnJpYW4gQmVobGVuZG9yZl0KICAgICBBbHNvLCBmaXhlZCBhdXRoIHR5cG8gaW4gaHR0cF9wcm90b2NvbC5jIHVubWFza2VkIGJ5IHRoaXMgZml4LgoKICAqKSBDb21waWxlcyBjbGVhbiB3aXRoIGFjYyBvbiBTdW5PUyBbUGF1bCBTdXR0b25dCgogICopIFJlb3JkZXJlZCBtb2R1bGVzIGluIG1vZHVsZXMuYyBzbyB0aGF0IFJlZGlyZWN0IHRha2VzIHByaW9yaXR5CiAgICAgb3ZlciBTY3JpcHRBbGlhcywgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkgW1JvYiBIYXJ0aWxsXSAtLS0KICAgICBiZWxpZXZlIGl0IG9yIG5vdCwgaGUgaGFzIGFuIGFjdHVhbCBzaXRlIHdpdGggYSBTY3JpcHRBbGlhcyBhbmQKICAgICBhIFJlZGlyZWN0IGRlY2xhcmVkIGZvciB0aGUgKmV4YWN0IHNhbWUgZGlyZWN0b3J5Ki4gIEV2ZW4gKm15KgogICAgIGNvbXBhdGliaWxpdHkgZmV0aXNoIHdvdWxkbid0IG1vdGl2YXRlIG1lIHRvIGZpeCB0aGlzIGlmIHRoZSBmaXgKICAgICByZXF1aXJlZCBhbnkgZWZmb3J0LCBidXQgaXQgZG9lc24ndCwgc28gd2hhdCB0aGUgaGV5LgoKICAqKSBGaXhlZCB0byBwcm9wZXJseSBkZWZhdWx0IHNldmVyYWwgc2VydmVyX3JlYyBmaWVsZHMgZm9yIHZpcnR1YWwKICAgICBzZXJ2ZXJzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBtYWluIHNlcnZlcl9yZWMuCiAgICAgW0NsaWZmIFNrb2xuaWNrIC0tLSAncG9ydCcgd2FzIGEgcGFydGljdWxhciBpcnJpdGFudF0uCgogICopIE5vIGxvbmdlciBraWxscyBvZmYgbnBoLSBjaGlsZCBwcm9jZXNzZXMgYmVmb3JlIHRoZXkgYXJlCiAgICAgZmluaXNoZWQgc2VuZGluZyBvdXRwdXQuIFtNYXR0aGV3IEdyYXldCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIEp1bCAxOTk1CgogICopIFR3byBzdHlsZXMgb2YgdGltZW91dCAtLS0gaGFyZCBhbmQgc29mdC4gIHNvZnRfdGltZW91dCgpcyBqdXN0IHB1dAogICAgIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgaW4gYW4gImFib3J0ZWQiIHN0YXRlLCBidXQgb3RoZXJ3aXNlCiAgICAgYWxsb3cgd2hhdGV2ZXIgaGFuZGxlcnMgYXJlIHJ1bm5pbmcgdG8gY2xlYW4gdXAuICBoYXJkX3RpbWVvdXQoKXMKICAgICBhYm9ydCB0aGUgcmVxdWVzdCBpbiBwcm9ncmVzcyBjb21wbGV0ZWx5OyBhbnl0aGluZyBub3QgdGllZCB0byBzb21lCiAgICAgcmVzb3VyY2UgcG9vbCBjbGVhbnVwIHdpbGwgbGVhay4gIFRoZXkncmUgc3RpbGwgYXJvdW5kIGJlY2F1c2UgSQogICAgIGhhdmVuJ3QgeWV0IGNvbWUgdXAgd2l0aCBhIG1vcmUgZWxlZ2FudCB3YXkgb2YgaGFuZGxpbmcKICAgICB0aW1lb3V0cyB3aGVuIHRhbGtpbmcgdG8gc29tZXRoaW5nIHRoYXQgaXNuJ3QgdGhlIGNsaWVudC4gIFRoZQogICAgIGRlZmF1bHRfaGFuZGxlciBhbmQgdGhlIGRpcl9oYW5kbGVyIG5vdyB1c2Ugc29mdCB0aW1lb3V0cywgbGFyZ2VseQogICAgIHNvIEkgY2FuIHRlc3QgdGhlIGZlYXR1cmUuICBbUm9iZXJ0IFRoYXVdCgogICopIFRyYW5zZmVyTG9nICJ8IG15X3Bvc3Rwcm9jZXNzb3IgLi4uIiBzZWVtcyB0byBiZSB0aGVyZS4gIE5vdGUgdGhhdAogICAgIHRoZSBjYXNlIG9mIGxvZyBoYW5kbGVycyBkeWluZyBwcmVtYXR1cmVseSBpcyBwcm9iYWJseSBoYW5kbGVkIFZFUlkKICAgICBncmFjZWxlc3NseSBhdCB0aGlzIHBvaW50LCBhbmQgaWYgdGhlIGxvZ2dlciBzdG9wcyByZWFkaW5nIGlucHV0LAogICAgIHRoZSBzZXJ2ZXIgd2lsbCBoYW5nLiAgKEl0IGlzIGtub3duIHRvIGNvcnJlY3RseSByZXN0YXJ0IHRoZQogICAgIGxvZ2dpbmcgcHJvY2VzcyBvbiBzZXJ2ZXIgcmVzdGFydDsgdGhpcyBpcyAoc2hvdWxkIGJlISkgZ29pbmcgdGhyb3VnaAogICAgIHRoZSBzYW1lIFNJR1RFUk0vcGF1c2UvU0lHS0lMTCByb3V0aW5lIHVzZWQgdG8gZGluZyBhbiBlcnJhbnQgQ0dJCiAgICAgc2NyaXB0KS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgYXNpcyBmaWxlcyBzdXBwb3J0ZWQgKG5ldyBtb2R1bGUpLiAgW1JvYmVydCBUaGF1XQoKICAqKSBJZGVudGl0eUNoZWNrIGNvZGUgaXMgY29tcGlsZWQgaW4sIGJ1dCBoYXMgbm90IGJlZW4gdGVzdGVkLiAgKEkKICAgICBkb24ndCBrbm93IGFueW9uZSB3aG8gcnVucyBpZGVudGQpLiBbUm9iZXJ0IFRoYXVdCgogICopIFBBVEhfSU5GTyBhbmQgUEFUSF9UUkFOU0xBVEVEIGFyZSBub3Qgc2V0IHVubGVzcyBzb21lIHJlYWwgUEFUSF9JTkZPCiAgICAgY2FtZSBpbiB3aXRoIHRoZSByZXF1ZXN0LCBmb3IgTkNTQSBidWctY29tcGF0aWJpbGl0eS4gW1JvYmVydCBUaGF1XQoKICAqKSBEb24ndCBsZWFrIHRoZSBESVIgKiBvbiBIRUFEIHJlcXVlc3QgZm9yIGEgZGlyZWN0b3J5LiBbUm9iZXJ0IFRoYXVdCgogICopIERlbGV0ZWQgdGhlIGJsb2NrX2FsYXJtcygpIHN0dWZmIGZyb20gZGJtX2F1dGg7IG5vIGxvbmdlciBuZWNlc3NhcnksCiAgICAgYXMgdGltZW91dHMgYXJlIG5vdCBpbiBzY29wZS4gW1JvYmVydCBUaGF1XQoKICAqKSBxdW90ZWQtc3RyaW5nIGFyZ3MgaW4gY29uZmlnIGZpbGVzIG5vdyBoYW5kbGVkIGNvcnJlY3RseSAoZG9lc24ndCBkcm9wCiAgICAgdGhlIGxhc3QgY2hhcmFjdGVyKS4gW1JvYmVydCBUaGF1OyByZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQoKICAqKSBGaXhlZCBzaWxseSB0eXBvIGluIGh0dHBfbWFpbi5jIHdoaWNoIHdhcyBzdWRkZW5seSBmYXRhbCBpbiBIUC1VWC4KICAgICBIb3cgdGhlIGhlbGwgZGlkIGl0IGV2ZXIgd29yaz8gW1JvYmVydCBUaGF1OyByZXBvcnRlZCBieSBSb2IgSGFydGlsbF0KCiAgKikgbW9kX2NvcmUuYyAtLS0gZGVmYXVsdF90eXBlIHJldHVybnMgREVGQVVMVF9UWVBFICh0aGUgY29tcGlsZS10aW1lCiAgICAgZGVmYXVsdCBkZWZhdWx0IHR5cGUpOyB0aGUgZm9ybWVyIGRlZmF1bHQgZGVmYXVsdCBiZWhhdmlvciB3aGVuIGFsbAogICAgIHR5cGUtY2hlY2tlcnMgZGVmYXVsdGVkIGhhZCBiZWVuIGEgY29yZSBkdW1wLiAgW1BhdWwgU3V0dG9uXQoKICAqKSBDb3B5IGZpbGVuYW1lcyBvdXQgb2YgdGhlIHN0cnVjdCBkaXJlbnQgd2hlbiBpbmRleGluZwogICAgIGRpcmVjdG9yaWVzLiAgKE9uIExpbnV4LCByZWFkZGlyKCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNhbWUKICAgICBtZW1vcnkgYXJlYSBldmVyeSB0aW1lKS4gIEZpeCBpcyBpbiBtb2RfZGlyLmMuICBbUGF1bCBTdXR0b25dCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNS4zIFtub3QgcmVsZWFzZWRdCgogICopIERlZmF1bHQgcmVzcG9uc2UgaGFuZGxlciBub3RlcyAiZmlsZSBub3QgZm91bmQiIGluIHRoZSBlcnJvciBsb2csCiAgICAgaWYgdGhlIGZpbGUgd2FzIG5vdCBmb3VuZC4gIFtDbGlmZiBTa29sbmlja10uCgogICopIEFub3RoZXIgQ2xpZmYgYnVnIC0tLSAiR0VUIC9+dXNlciIgbm93IHByb3Blcmx5IHJlZGlyZWN0cyAodGhlIHVzZXJkaXIKICAgICBjb2RlIG5vIGxvbmdlciBzZXRzIHVwIGJvZ3VzIFBBVEhfSU5GTyB3aGljaCBmYWtlcyBvdXQgdGhlIGRpcmVjdG9yeQogICAgIGhhbmRsZXIpLiBbQ2xpZmYgU2tvbG5pY2tdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNS4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA2IEp1bCAxOTk1CgogICopIENoYW5nZXMgdG8gaHR0cF9tYWluLmMgLS0tIHJvb3Qgc2VydmVyIG5vIGxvbmdlciBwbGF5cyBzaWxseQogICAgIGdhbWVzIHdpdGggU0lHQ0hMRCwgYW5kIHNvIG5vdyBkZXRlY3RzIGFuZCByZXBsYWNlcyBkeWluZwogICAgIGNoaWxkcmVuLiAgQ2hpbGQgcHJvY2Vzc2VzIGp1c3QgZGllIG9uIFNJR1RFUk0sIHdpdGhvdXQgdGFraW5nCiAgICAgdGhlIHdob2xlIHByb2Nlc3MgZ3JvdXAgd2l0aCB0aGVtLiAgUG90ZW50aWFsIHByb2JsZW0gLS0tIGlmIGFueQogICAgIGNoaWxkIHByb2Nlc3MgcmVmdXNlcyB0byBkaWUsIHdlIGhhbmcgaW4gcmVzdGFydC4KICAgICBNYXhSZXF1ZXN0c1BlckNoaWxkIG1heSBzdGlsbCBub3Qgd29yaywgYnV0IGl0IGNlcnRhaW5seSB3b3JrcwogICAgIGJldHRlciB0aGFuIGl0IGRpZCBiZWZvcmUgdGhpcyEgIFtSb2JlcnQgVGhhdV0KCiAgKikgbW9kX2Rpci5jIGJ1ZyBmaXhlczogUmVhZG1lTmFtZSBhbmQgSGVhZGVyTmFtZQogICAgIHdvcmsgKG9yIHdvcmsgYmV0dGVyLCBhdCBsZWFzdCk7IG92ZXItbG9uZyBkZXNjcmlwdGlvbiBsaW5lcwogICAgIHByb3Blcmx5IHRlcm1pbmF0ZWQuIFtNYXJrIENveF0KCiAgKikgaHR0cF9yZXF1ZXN0LmMgbm93IGNhbGxzIHVuZXNjYXBlX3VybCgpIG1vcmUgcGxhY2VzIHdoZXJlIGl0CiAgICAgc2hvdWxkIFtQYXVsIFN1dHRvbl0uCgogICopIE1vcmUgZGlyZWN0b3J5IGhhbmRsaW5nIGJ1Z3MgKHJlcG9ydGVkIGJ5IENveCkKICAgICBQYXJlbnQgRGlyZWN0b3J5IGxpbmsgaXMgbm93IHNldCBjb3JyZWN0bHkuIFtSb2JlcnQgVGhhdV0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC41LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDQgSnVsIDE5OTUKCiAgKikgR2VuZXJhbGl6ZWQgY2xlYW51cCBpbnRlcmZhY2UgaW4gYWxsb2MuYyAtLS0gYW55IGZ1bmN0aW9uIGNhbiBiZQogICAgIHJlZ2lzdGVyZWQgd2l0aCBhbGxvYy5jIGFzIGEgY2xlYW51cCBmb3IgYSByZXNvdXJjZSBwb29sOwogICAgIHRyYWNraW5nIG9mIGZpbGVzIGFuZCBmaWxlIGRlc2NyaXB0b3JzIGhhcyBiZWVuIHJlaW1wbGVtZW50ZWQgaW4KICAgICB0ZXJtcyBvZiB0aGlzIGludGVyZmFjZSwgc28gSSBjYW4gZ2l2ZSBpdCBzb21lIHNvcnQgb2YgYSB0ZXN0LgogICAgIFtSb2JlcnQgVGhhdV0KCiAgKikgTW9yZSBjaGFuZ2VzIGluIGFsbG9jLmMgLS0tIG5ldyBjbGVhbnVwX2Zvcl9leGVjKCkgZnVuY3Rpb24sCiAgICAgd2hpY2ggdHJhY2tzIGRvd24gYW5kIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyB3aGljaCBoYXZlIGJlZW4KICAgICByZWdpc3RlcmVkIHdpdGggdGhlIGFsbG9jLmMgbWFjaGluZXJ5IGJlZm9yZSB0aGUgc2VydmVyIGV4ZWMoKXMgYQogICAgIGNoaWxkIHByb2Nlc3MgZm9yIENHSSBvciA8IS0tI2V4ZWMtLT4uICBDR0kgY2hpbGRyZW4gbm93IGdldAogICAgIHN0YXJ0ZWQgd2l0aCBleGFjdGx5IHRocmVlIGZpbGUgZGVzY3JpcHRvcnMgb3Blbi4gIEhvcGVmdWxseSwKICAgICB0aGlzIGN1cmVzIHRoZSBwcm9ibGVtIFJvYiBILiB3YXMgaGF2aW5nIHdpdGggb3Zlcmx5IHBlcnNpc3RlbnQKICAgICBDR0kgY29ubmVjdGlvbnMuIFtSb2JlcnQgVGhhdV0KCiAgKikgTXV0dWFsIGV4Y2x1c2lvbiBhcm91bmQgdGhlIGFjY2VwdCgpIGluIGNoaWxkX21haW4oKSAtLS0gdGhpcyBpcwogICAgIHJlcXVpcmVkIG9uIGF0IGxlYXN0IFNHSSwgU29sYXJpcyBhbmQgTGludXgsIGFuZCBpcyAjaWZkZWYnZWQgaW4KICAgICBieSBkZWZhdWx0IG9uIHRob3NlIHN5c3RlbXMgb25seSAoLURGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCkuCiAgICAgVGhpcyB1c2VzIGZjbnRsKEZfU0VUTEssLi4uKSBvbiB0aGUgZXJyb3IgbG9nIGRlc2NyaXB0b3IgYmVjYXVzZQogICAgIGZsb2NrKCkgb24gdGhhdCBkZXNjcmlwdG9yIHdvbid0IHdvcmsgb24gc3lzdGVtcyB3aGljaCBoYXZlIEJTRAogICAgIGZsb2NrKCkgc2VtYW50aWNzLCBpbmNsdWRpbmcgKEkgdGhpbmspIExpbnV4IDEuMyBhbmQgU29sYXJpcy4KCiAgICAgVGhpcyBkb2VzIHdvcmsgb24gU3VuT1MgKHdoZW4gdGhlIHNlcnZlciBpcyBpZGxlLCBvbmx5IG9uZQogICAgIHByb2Nlc3MgaW4gdGhlIHBvb2wgaXMgd2FpdGluZyBvbiBhY2NlcHQoKSk7IGl0ICpvdWdodCogdG8gd29yawogICAgIG9uIHRoZSBvdGhlciBzeXN0ZW1zLiBbUm9iZXJ0IFRoYXVdCgogICopIEZyZWVCU0QgYW5kIEJTREkgcG9ydGFiaWxpdHkgdHdlYWtzIFtDaHVjayBNdXJja29dCgogICopIHNpemVvZigqc2FfY2xpZW50KSBidWdmaXggZnJvbSBbUm9iIEhhcnRpbGxdCgogICopIHBzdHJkdXAoLi4uLCBOVUxMKSByZXR1cm5zIE5VTEwsIFtSYW5keSBUZXJidXNoXQoKICAqKSBibG9ja19hbGFybXMoKSB0byBhdm9pZCBsZWFraW5nIHRoZSBEQk0qIGluIGRibSBhdXRoICh0aGlzIHNob3VsZAogICAgIGJlIHVubmVjZXNzYXJ5IGlmIEkgZ28gdG8gdGhlIHJldmlzZWQgdGltZW91dC1oYW5kbGluZyBzY2hlbWUpLgogICAgIFtSb2JlcnQgVGhhdV0KCiAgKikgRm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHksIHNldCBRVUVSWV9TVFJJTkcgZW52IHZhciAodG8gYSBudWxsCiAgICAgc3RyaW5nKSBldmVuIGlmIG5vbmUgY2FtZSBpbiB3aXRoIHRoZSByZXF1ZXN0LiAgW1JvYmVydCBUaGF1XQoKICAqKSBDSEFOR0VTIGZpbGUgYWRkZWQgdG8gZGlzdHJpYnV0aW9uIDstKS4KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC40LjUKCiAgKikgbW9kX2RsZCAtLS0gZWFybHkgZHluYW1pYyBsb2FkaW5nIHN1cHBvcnQgW3JzdF0KICAqKSBBZGQgd2lsZGNhcmQgY29udGVudCBoYW5kbGVycyBmb3IgWEJJVEhBQ0s7IGRlZmF1bHRfaGFuZGVyIG5vdwogICAgIGludm9rZWQgd2l0aCB0aGF0IG1lY2hhbmlzbSAoYXMgYSBoYW5kbGVyIGhhbmdpbmcgb2ZmIG1vZF9jb3JlKSBbcnN0XQogICopIFhCSVRIQUNLIHN1cHBvcnRlZCBhcyBhIHdpbGRjYXJkIGNvbnRlbnQtaGFuZGxlciwgYW5kIAogICAgIGNvbmZpZ3VyYWJsZSBhdCBydW4tdGltZSAobm90IGp1c3QgYXQgY29tcGlsZSB0aW1lLCBhcyBpbiB0aGUKICAgICAicGF0Y2h5IHNlcnZlciIgcmVsZWFzZXMpIFtyc3RdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwIEp1biAxOTk1CgogICopIEZpeGVkIGJhc2ljIHRoaW5rb3MgaW4gbW9kX2RibV9hdXRoLmMgW3JzdCwgcmVwb3J0ZWQgYnkgTWFyayBDb3hdCiAgKikgSGFuZGxlIEFkZHR5cGUgeC95IC56IFtyc3QsIHJlcG9ydGVkIGJ5IENveF0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC40LjMKCiAgKikgRml4ZWQgdmVyeSBkdW1iIGJ1ZyBpbiBtb2RfYWxpYXM7ICJBbGlhcyIgYW5kICJSZWRpcmVjdCIgYXJlIG5vdAogICAgIHN5bm9ueW1vdXMgW3JzdCwgdGVyYnVzaF0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC40LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggSnVuIDE5OTUKCiAgKikgRmlyc3QtY3V0IHZpcnR1YWwgaG9zdCBpbXBsZW1lbnRhdGlvbjsgc29tZSByZWZpdCBpbiB0aGUgY29uZmlnCiAgICAgcmVhZGluZyBjb2RlLCBhbmQgbG9nIG1hbmFnZW1lbnQsIHdhcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGlzIFtyc3RdCiAgKikgU3ViLXBvb2wgbWFjaGluZXJ5LCBvcmlnaW5hbGx5IGFkZGVkIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBzdG9yYWdlCiAgICAgYWxsb2NhdGlvbiBvbiBsaXN0aW5ncyBvZiBsYXJnZSBkaXJlY3RvcmllcyAod2hpY2ggdHVybmVkIG91dCB0bwogICAgIGJlIHRoZSBwcm9ibGVtIHRoYXQgdGhlIDAuMyBzdG9yYWdlIGFjY291bnRpbmcgd2FzIGFkZGVkIHRvCiAgICAgZmluZCkuICBTdWJyZXF1ZXN0cyBhbmQgbW9kX2RpciBjaGFuZ2VkIHRvIHVzZSBzdWJwb29scy4gIFtyc3RdCiAgKikgTW9yZSBtZW1vcnkgZGVidWdnaW5nIC0tLSBmcmVlIGxpc3QgY29uc2lzdGVuY3kgY2hlY2tzLiBbcnN0XQogICopIEFkZGVkIGVycl9oZWFkZXJzIHRvIHJlcXVlc3RfcmVjLCB3aXRoIHN1cHBvcnQgZWxzZXdoZXJlIFtyc3RdCiAgKikgT3RoZXIgZml4ZXMgdG8gbWlub3IgYnVncyBpbiBtb2RfZGlyIGFuZCBtb2RfaW5jbHVkZXMgW3JzdCwgdGVyYnVzaF0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgSnVuIDE5OTUKCiAgKikgU3dpdGNoIE9ORV9QUk9DRVNTIHRvIGEgcnVudGltZSBjb21tYW5kLWxpbmUgb3B0aW9uICgtWCkKICAqKSBEb24ndCBjb21waWxlIGluIG1vZF9haV9iYWNrY29tcGF0IGJ5IGRlZmF1bHQKICAqKSBTd2l0Y2ggbmFtZSBvZiBzZXJ2ZXIgZnJvbSBBcGFjaGUgdG8gU2hhbWJoYWxhIGluIE1ha2VmaWxlCiAgKikgQWRkIHNvbWUgYWNjb3VudGluZyByb3V0aW5lcyB0byB0cmFjayBtZW1vcnkgdXNhZ2UgaW4gdGhlIHBvb2xzLAogICAgIGZvciBkZWJ1Z2dpbmcKCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC4yCgogICopIFNldCBET0NVTUVOVF9ST09UIENHSSB2YXJpYWJsZQogICopIEFkZCBzaW5nbGUtcHJvY2VzcyBkZWJ1Z2dpbmcsIGFzIGEgY29tcGlsZS10aW1lIG9wdGlvbiAoT05FX1BST0NFU1MpCiAgKikgQWRkIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvbiB0byBoYW5kbGluZyBvZiBjbGVhbnVwIHN0cnVjdHVyZXMgCiAgICAgaW4gYWxsb2MuYyBbcnN0XQogICopIFNpZ25pZmljYW50IGNvZGUgcmVvcmcgd2l0aGluIHRoZSBzZXJ2ZXIgY29yZSB0byBncm91cCByZWxhdGVkCiAgICAgZnVuY3Rpb25zIHRvZ2V0aGVyIFtyc3RdCiAgKikgQ29ycmVjdGx5IGhhbmRsZSBjbGllbnRzIHRoYXQgaGFuZyB1cCBiZWZvcmUgc2VuZGluZyBhbnkgcmVxdWVzdAogICAgIFtyc3RdCiAgKikgUmVwbGFjZSBkeWluZyBjaGlsZCBwcm9jZXNzZXMuIFtyc3RdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIEp1biAxOTk1CgogICBNYWpvciByZXdyaXRlIG9mIHRoZSBwcmUtZXhpc3RpbmcgInBhdGNoeSBzZXJ2ZXIiIGNvZGViYXNlLCBieQogICBSb2JlcnQgVGhhdSAocnN0KS4gIFNpZ25pZmljYW50IHBvcnRpb25zIG9mIHRoZSBzZXJ2ZXIgY29kZSwgc3VjaAogICBhcyBjb25maWd1cmF0aW9uLWZpbGUgaGFuZGxpbmcgYW5kIEhUVFAgYXV0aGVudGljYXRpb24gc3VwcG9ydCwKICAgd2VyZSByaXBwZWQgb3V0IGFuZCByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoLiAgQ29kZSB0aGF0IHdhcyBub3QKICAgY29tcGxldGVseSByZXdyaXR0ZW4gd2FzIHNpZ25pZmljYW50bHkgYWx0ZXJlZC4KCiAgIE1ham9yIGNoYW5nZXMgd2l0aCB0aGlzIHJlbGVhc2UgaW5jbHVkZToKCiAgICopIEludHJvZHVjdGlvbiBvZiB0aGUgbW9kdWxlIEFQSTsgaW4gcmVxdWVzdCBoYW5kbGluZywgdGhlIGNlbnRyYWwgCiAgICAgIG1hY2hpbmVyeSBqdXN0IGRpc3BhdGNoZXMgdG8gdmFyaW91cyBtb2R1bGVzLCB3aGljaCBhY3R1YWxseSBkbwogICAgICBtb3N0IG9mIHRoZSB3b3JrLiAgQ29uZmlndXJhdGlvbiBoYW5kbGluZyBpcyBzaW1pbGFyIC0tLSBtb2R1bGVzCiAgICAgIGRlY2xhcmUgdGhlaXIgb3duIGNvbW1hbmRzLCBhbmQgdGhlIGNlbnRyYWwgbWFjaGluZXJ5IGp1c3QKICAgICAgZGlzcGF0Y2hlcyB0byB0aGVtLiAgCgogICAgICBBUEkgZmVhdHVyZXMgZnJvbSBzaGFtYmhhbGEvMC4xIHdlcmUgc3Vic3RhbnRpYWxseSB1bmNoYW5nZWQgaW4KICAgICAgQXBhY2hlIDEuMCBhbmQgMS4xLiAgKDEuMCBBUEkgZmVhdHVyZXMgbm90IHlldCBwcmVzZW50IGluIHRoaXMKICAgICAgcmVsZWFzZSwgc3VjaCBhcyB3aWxkY2FyZCBoYW5kbGVycyBhbmQgc3VicG9vbHMsIHdlcmUgYWRkZWQgaW4KICAgICAgc3Vic2VxdWVudCBTaGFtYmhhbGEgcmVsZWFzZXMsIGFuZCB3ZXJlIGFsc28gZ2VuZXJhbGx5IHJzdCdzCiAgICAgIHdvcmspLiAKCiAgICopIFRoaXMgcmVsZWFzZSBpbmNsdWRlZCB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CgogICAgICBtb2RfYWNjZXNzICAgICAgKGFjY2VzcyBjb250cm9sIC0tLSBhbGxvdyBhbmQgZGVueSBkaXJlY3RpdmVzKSwKICAgICAgbW9kX2FsaWFzICAgICAgIChBbGlhcyBhbmQgUmVkaXJlY3QgY29tbWFuZHMpLAogICAgICBtb2RfYXV0aCAgICAgICAgKHN0cmFpZ2h0IEhUVFAgYXV0aGVudGljYXRpb24sIGJhc2VkIG9uIGZsYXQtZmlsZXMpCiAgICAgIG1vZF9hdXRoX2RibSAgICAoc2FtZSwgd2l0aCBkYm0gZmlsZXMpCiAgICAgIG1vZF9jZ2kgICAgICAgICAoQ0dJIHNjcmlwdHMgYW5kLCBpbiB0aGlzIHJlbGVhc2UsIFNjcmlwdEFsaWFzKQogICAgICBtb2RfY29tbW9uX2xvZyAgKENMRiBhY2Nlc3MgbG9nczsgbGF0ZXIgcmVuYW1lZCBtb2RfbG9nX2NvbW1vbikKICAgICAgbW9kX2RpciAgICAgICAgIChkaXJlY3RvcnkgaW5kZXhpbmcpCiAgICAgIG1vZF9pbmNsdWRlICAgICAoc2VydmVyLXNpZGUgaW5jbHVkZXMpCiAgICAgIG1vZF9taW1lICAgICAgICAoQWRkVHlwZSBkaXJlY3RpdmVzKQogICAgICBtb2RfbmVnb3RpYXRpb24gKGNvbnRlbnQgbmVnb3RpYXRpb24pCiAgICAgIG1vZF91c2VyZGlyICAgICAoc3VwcG9ydCBmb3IgdXNlcnMnIHB1YmxpY19odG1sIGRpcmVjdG9yaWVzKQoKICAgICAgSXQgYWxzbyBpbmNsdWRlZCBhIG1vZF9haV9iYWNrY29tcGF0LCB3aGljaCB3YXMgYSBwcml2YXRlIGhhY2sKICAgICAgZm9yIGJhY2stY29tcGF0aWJpbGl0eSB3aXRoIHJzdCdzIG93biBBSS1sYWIgc2VydmVycy4KCiAgICAgIEFsbCBvZiB0aGVzZSBtb2R1bGVzIHdlcmUgc3Vic3RhbnRpYWxseSBjb21wbGV0ZSwgYW5kIGZ1bmN0aW9uYWwgCiAgICAgIG9yIG5lYXJseSBzbyAoYSBmZXcsIHdoaWNoIGltcGxlbWVudGVkIGZlYXR1cmVzIG5vdCBpbiB1c2UgYXQKICAgICAgVGhhdSdzIHNpdGUsIHJlcXVpcmVkIHBhdGNoZXMgb2YgYSBmZXcgbGluZXMpLgoKICAgKikgc3ViLXJlcXVlc3QgbWFjaGluZXJ5LCB0byBhbGxvdyBtb2R1bGVzIHRvIGRldGVybWluZSBob3cgb3RoZXIKICAgICAgbW9kdWxlcyB3b3VsZCBhc3NpZ24gTUlNRSB0eXBlcyB0byBhIGdpdmVuIGZpbGUsIG9yIG9wdGlvbmFsbHkKICAgICAgc2VydmUgaXRzIGNvbnRlbnQgKHRoaXMgaXMgaGVhdmlseSB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9pbmNsdWRlCiAgICAgIGFuZCBtb2RfbmVnb3RpYXRpb24pLgoKICAgKikgUmVzb3VyY2UgcG9vbCBzeXN0ZW0gZm9yIGtlZXBpbmcgdHJhY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCBhbmQKICAgICAgZmlsZXMgb3BlbmVkIGluIHNlcnZpY2Ugb2YgYSBwYXJ0aWN1bGFyIHJlcXVlc3QuICBNdWNoIG9mIHRoZQogICAgICBjb2RlIGluIHRoZSBtb2R1bGVzICh3aGVuIHRoZXkgd2VyZW4ndCByZXdyaXRlcykgd2FzIGFkanVzdGVkIHRvIAogICAgICByZXBsYWNlIGEgcGVydmFzaXZlIGNvbnZlbnRpb24gb2YgdXNpbmcgZml4ZWQtc2l6ZSBidWZmZXJzIG9uCiAgICAgIHRoZSBzdGFjayB3aXRoIGFuIGVxdWFsbHkgcGVydmFzaXZlIGNvbnZlbnRpb24gb2YgdXNpbmcgbWVtb3J5CiAgICAgIGFsbG9jYXRlZCB3aXRoIHBhbGxvYygpLgoKICAgKikgUmVvcmdhbml6YXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAgICAgIHJlcXVlc3QgdG8gZWxpbWluYXRlIHVzZSBvZiBnbG9iYWwgdmFyaWFibGVzIGFuZCB0aGUgdHJvdWJsZXNvbWUgCiAgICAgIHVubXVuZ2VfbmFtZSBmdW5jdGlvbiAodXNlZCBpbiBOQ1NBIGFuZCBlYXJseSBBcGFjaGUgcmVsZWFzZXMgdG8gCiAgICAgIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoZSBVUkkgd2hpY2ggbWFwcGVkIHRvIGEgZ2l2ZW4gZmlsZW5hbWUKICAgICAgLS0tIGEgZGlmZmljdWx0IHByb3Bvc2l0aW9uLCBnaXZlbiB0aGF0IGl0IGlzIGVhc3kgdG8gcHJvZHVjZQogICAgICBzZXR1cHMgaW4gd2hpY2ggbXVsdGlwbGUgVVJJcyBtYXAgdG8gdGhlIHNhbWUgZmlsZSkuCgogICAqKSBTb3VyY2UgZmlsZXMgcmVuYW1lZCBhbmQgcmVhcnJhbmdlZAoKICAgKikgVmVyeSBzaW1wbGUgcHJlLWZvcmtpbmcgYmVoYXZpb3IgLS0tIHBhcmVudCBwcm9jZXNzIGZvcmtlZCBvZmYgYSAKICAgICAgZml4ZWQgbnVtYmVyIG9mIGNoaWxkcmVuLCBhbmQgdGhlbiBqdXN0IHdhaXRlZCBmb3IgU0lHSFVQLgoKICAgKikgT3RoZXIgbW9yZSBtaW5vciBjaGFuZ2VzIHRvbyBudW1lcm91cyB0byBsaXN0LgoKICAgVGhpcyByZWxlYXNlIGluY2x1ZGVkIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgbG90IG9mIGNvZGUgZnJvbSB0aGUKICAgQXBhY2hlIDAuNi40IHB1YmxpYyByZWxlYXNlLCBwbHVzIGFuIGVhcmx5IHByZS1mb3JraW5nIHBhdGNoCiAgIGNvZGV2ZWxvcGVkIGJ5IFJvYmVydCBUaGF1IGFuZCBSb2IgSGFydGlsbC4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC43LjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgSnVuIDE5OTUKCiAgICopIFRoZXJlIHdlcmUgYSBidW5jaCBvZiBjaGFuZ2VzIGJldHdlZW4gQXBhY2hlIDAuNi40IGFuZCAwLjcuMyB0aGF0CiAgICAgIHdlcmUgaW5jb3Jwb3JhdGVkIGJ5IFJvYiBIYXJ0aWxsIG9uIHRoZSBtYWluIGJyYW5jaCB3aGlsZSBSb2JlcnQgVGhhdQogICAgICB3b3JrZWQgb24gdGhlIFNoYW1iaGFsYSByZXdyaXRlIGFib3ZlLiAgTW9zdCB3ZXJlIG1lcmdlZCBpbnRvIHRoZQogICAgICBTaGFtYmFsYSBhcmNoaXRlY3R1cmUgYWZ0ZXIgQXBhY2hlIDAuOC4wLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjYuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyBNYXkgMTk5NQoKICAgKikgUGF0Y2hlcyBieSBSb2IgSGFydGlsbCwgQ2xpZmYgU2tvbG5pY2ssIFJhbmR5IFRlcmJ1c2gsIFJvYmVydCBUaGF1LAogICAgICBhbmQgb3RoZXJzLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjUuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBBcHIgMTk5NQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiBBcHIgMTk5NQoKICAqKSBQYXRjaGVzIGJ5IEJyaWFuIEJlaGxlbmRvcmYsIEFuZHJldyBXaWxzb24sIFJvYmVydCBUaGF1LAogICAgIGFuZCBSb2IgSGFydGlsbC4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgTWFyIDE5OTUKCiAgKikgUGF0Y2hlcyBieSBSb2JlcnQgVGhhdSwgRGF2aWQgUm9iaW5zb24sIFJvYiBIYXJ0aWxsLCBhbmQKICAgICBDYXJsb3MgVmFyZWxhLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBNYXIgMTk5NQoKICAqKSBCYXNlZCBvbiBOQ1NBIGh0dHBkIDEuMyBieSBSb2IgTWNDb29sIGFuZCBwYXRjaGVzIGJ5IENFUlQsCiAgICAgUm95IEZpZWxkaW5nLCBSb2JlcnQgVGhhdSwgTmljb2xhcyBQaW9jaCwgRGF2aWQgUm9iaW5zb24sCiAgICAgQnJpYW4gQmVobGVuZG9yZiwgUm9iIEhhcnRpbGwsIGFuZCBDbGlmZiBTa29sbmljay4K