CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMiBhbmQgMS4xLjAgIFt4eCBYWFggeHh4eF0KCiAgKikgSW5jcmVhc2VkIHRoZSBtaW5pbWFsIFJTQSBrZXlzaXplIGZyb20gMjU2IHRvIDUxMiBiaXRzIFtSaWNoIFNhbHpdLAogICAgIGRvbmUgd2hpbGUgZml4aW5nIHRoZSBlcnJvciBjb2RlIGZvciB0aGUga2V5LXRvby1zbWFsbCBjYXNlLgogICAgIFtBbm5pZSBZb3VzYXIgPGEueW91c2FyQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPl0KCiAgKikgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGEgbmV3LCBmYXN0LCB1bmJpYXNlZCBwcmltZSBjYW5kaWRhdGUgZ2VuZXJhdG9yLAogICAgIGJuX3Byb2JhYmxlX3ByaW1lX2RoX2NvcHJpbWUoKS4gTm90IGN1cnJlbnRseSB1c2VkIGJ5IGFueSBwcmltZSBnZW5lcmF0b3IuCiAgICAgW0ZlbGl4IExhdXJpZSB2b24gTWFzc2VuYmFjaCA8ZmVsaXhAZXJicmlkZ2UuY28udWs+XQoKICAqKSBOZXcgb3V0cHV0IGZvcm1hdCBOU1MgaW4gdGhlIHNlc3NfaWQgY29tbWFuZCBsaW5lIHRvb2wuIFRoaXMgYWxsb3dzCiAgICAgZXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlkIGFuZCB0aGUgbWFzdGVyIGtleSBpbiBOU1Mga2V5bG9nIGZvcm1hdC4KICAgICBbTWFydGluIEthaXNlciA8bWFydGluQGthaXNlci5jeD5dCgogICopIEhhcm1vbml6ZSB2ZXJzaW9uIGFuZCBpdHMgZG9jdW1lbnRhdGlvbi4gLWYgZmxhZyBpcyB1c2VkIHRvIGRpc3BsYXkKICAgICBjb21waWxhdGlvbiBmbGFncy4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IGVja2V5X3ByaXZfZW5jb2RlIHNvIGl0IGltbWVkaWF0ZWx5IHJldHVybnMgYW4gZXJyb3IgdXBvbiBhIGZhaWx1cmUKICAgICBpbiBpMmRfRUNQcml2YXRlS2V5LgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggc29tZSBkb3VibGUgZnJlZXMuIFRoZXNlIGFyZSBub3QgdGhvdWdodCB0byBiZSBleHBsb2l0YWJsZS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgQSBtaXNzaW5nIGJvdW5kcyBjaGVjayBpbiB0aGUgaGFuZGxpbmcgb2YgdGhlIFRMUyBoZWFydGJlYXQgZXh0ZW5zaW9uCiAgICAgY2FuIGJlIHVzZWQgdG8gcmV2ZWFsIHVwIHRvIDY0ayBvZiBtZW1vcnkgdG8gYSBjb25uZWN0ZWQgY2xpZW50IG9yCiAgICAgc2VydmVyLgoKICAgICBUaGFua3MgZm9yIE5lZWwgTWVodGEgb2YgR29vZ2xlIFNlY3VyaXR5IGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1ZyBhbmQgdG8KICAgICBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGFuZCBCb2RvIE1vZWxsZXIgPGJtb2VsbGVyQGFjbS5vcmc+IGZvcgogICAgIHByZXBhcmluZyB0aGUgZml4IChDVkUtMjAxNC0wMTYwKQogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciB0aGUgYXR0YWNrIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIgIlJlY292ZXJpbmcgT3BlblNTTAogICAgIEVDRFNBIE5vbmNlcyBVc2luZyB0aGUgRkxVU0grUkVMT0FEIENhY2hlIFNpZGUtY2hhbm5lbCBBdHRhY2siCiAgICAgYnkgWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlci4gRGV0YWlscyBjYW4gYmUgb2J0YWluZWQgZnJvbToKICAgICBodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMTQvMTQwCgogICAgIFRoYW5rcyB0byBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyIGZvciBkaXNjb3ZlcmluZyB0aGlzCiAgICAgZmxhdyBhbmQgdG8gWXV2YWwgWWFyb20gZm9yIHN1cHBseWluZyBhIGZpeCAoQ1ZFLTIwMTQtMDA3NikKICAgICBbWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlcl0KCiAgKikgVXNlIGFsZ29yaXRobSBzcGVjaWZpYyBjaGFpbnMgaW4gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpOgogICAgIHRoaXMgZml4ZXMgYSBsaW1pdGF0aW9uIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwZXJpbWVudGFsIGVuY3J5cHQtdGhlbi1tYWMgc3VwcG9ydC4KICAgIAogICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBlbmNyeXB0IHRoZW4gbWFjIGZyb20KICAgICBkcmFmdC1ndXRtYW5uLXRscy1lbmNyeXB0LXRoZW4tbWFjLTAyLnR4dAoKICAgICBUbyBlbmFibGUgaXQgc2V0IHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24gbnVtYmVyICgweDQyIGZvciB0aGUgdGVzdAogICAgIHNlcnZlcikgdXNpbmcgZS5nLiAtRFRMU0VYVF9UWVBFX2VuY3J5cHRfdGhlbl9tYWM9MHg0MgogCiAgICAgRm9yIG5vbi1jb21wbGlhbnQgcGVlcnMgKGkuZS4ganVzdCBhYm91dCBldmVyeXRoaW5nKSB0aGlzIHNob3VsZCBoYXZlIG5vCiAgICAgZWZmZWN0LgoKICAgICBXQVJOSU5HOiBFWFBFUklNRU5UQUwsIFNVQkpFQ1QgVE8gQ0hBTkdFLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRVZQIHN1cHBvcnQgZm9yIGtleSB3cmFwcGluZyBhbGdvcml0aG1zLCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgZXhpc3RpbmcgY29kZSB0aGUgZmxhZyBFVlBfQ0lQSEVSX0NUWF9XUkFQX0FMTE9XIGhhcyB0byBiZSBzZXQgaW4KICAgICB0aGUgRVZQX0NJUEhFUl9DVFggb3IgYW4gZXJyb3IgaXMgcmV0dXJuZWQuIEFkZCBBRVMgYW5kIERFUzMgd3JhcAogICAgIGFsZ29yaXRobXMgYW5kIGluY2x1ZGUgdGVzdHMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIENNUyBjb2RlIHRvIHN1cHBvcnQgUlNBLVBTUyBzaWduYXR1cmVzIGFuZCBSU0EtT0FFUCBmb3IKICAgICBlbnZlbG9wZWQgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmRlZCBSU0EgT0FFUCBzdXBwb3J0IHZpYSBFVlBfUEtFWSBBUEkuIE9wdGlvbnMgdG8gc3BlY2lmeSBkaWdlc3QsCiAgICAgTUdGMSBkaWdlc3QgYW5kIE9BRVAgbGFiZWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBvcGVuc3NsIHZlcmlmeSByZXR1cm4gZXJyb3JzLgogICAgIFtDaHJpcyBQYWxtZXIgPHBhbG1lckBnb29nbGUuY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfVElNRV9kaWZmIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3bwogICAgIEFTTjFfVElNRSBzdHJ1Y3R1cmVzIG9yIG9uZSBzdHJ1Y3R1cmUgYW5kIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIGZpcHNfdGVzdF9zdWl0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNvbW1hbmQgbGluZSBvcHRpb25zLiBOZXcKICAgICB0ZXN0IHRvIGluZHVjZSBhbGwgc2VsZiB0ZXN0IGVycm9ycyBpbiBzZXF1ZW5jZSBhbmQgY2hlY2sgZXhwZWN0ZWQKICAgICBmYWlsdXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRklQU197cnNhLGRzYSxlY2RzYX1fe3NpZ24sdmVyaWZ5fSBmdW5jdGlvbnMgd2hpY2ggZGlnZXN0IGFuZAogICAgIHNpZ24gb3IgdmVyaWZ5IGFsbCBpbiBvbmUgb3BlcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmaXBzX2FsZ3ZzOiBhIG11bHRpY2FsbCBmaXBzIHV0aWxpdHkgaW5jb3Jwb3JhdGluZyBhbGwgdGhlIGFsZ29yaXRobQogICAgIHRlc3QgcHJvZ3JhbXMgYW5kIGZpcHNfdGVzdF9zdWl0ZS4gSW5jbHVkZXMgZnVuY3Rpb25hbGl0eSB0byBwYXJzZQogICAgIHRoZSBtaW5pbWFsIHNjcmlwdCBvdXRwdXQgb2YgZmlwc2FsZ2VzdC5wbCBkaXJlY3RseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYXV0aG9yaXNhdGlvbiBwYXJhbWV0ZXIgdG8gRklQU19tb2R1bGVfbW9kZV9zZXQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRklQUyBzZWxmdGVzdCBmb3IgRUNESCBhbGdvcml0aG0gdXNpbmcgUC0yMjQgYW5kIEItMjMzIGN1cnZlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2Ugc2VwYXJhdGUgRFJCRyBmaWVsZHMgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCBmbGFncy4gTmV3IGZ1bmN0aW9uCiAgICAgRklQU19kcmJnX2hlYWx0aF9jaGVjaygpIHRvIHBlcmZvcm0gb24gZGVtYW5kIGhlYWx0aCBjaGVja2luZy4gQWRkCiAgICAgZ2VuZXJhdGlvbiB0ZXN0cyB0byBmaXBzX3Rlc3Rfc3VpdGUgd2l0aCByZWR1Y2VkIGhlYWx0aCBjaGVjayBpbnRlcnZhbCB0byAKICAgICBkZW1vbnN0cmF0ZSBwZXJpb2RpYyBoZWFsdGggY2hlY2tpbmcuIEFkZCAibm9kaCIgb3B0aW9uIHRvCiAgICAgZmlwc190ZXN0X3N1aXRlIHRvIHNraXAgdmVyeSBzbG93IERIIHRlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEZJUFNfZ2V0X2NpcGhlcmJ5bmlkKCkgdG8gbG9va3VwIEZJUFMgc3VwcG9ydGVkIGNpcGhlcnMKICAgICBiYXNlZCBvbiBOSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBleHRlbnNpdmUgaGVhbHRoIGNoZWNrIGZvciBEUkJHIGNoZWNraW5nIG1hbnkgbW9yZSBmYWlsdXJlIG1vZGVzLgogICAgIE5ldyBmdW5jdGlvbiBGSVBTX3NlbGZ0ZXN0X2RyYmdfYWxsKCkgdG8gaGFuZGxlIGV2ZXJ5IHBvc3NpYmxlIERSQkcKICAgICBjb21iaW5hdGlvbjogY2FsbCB0aGlzIGluIGZpcHNfdGVzdF9zdWl0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRHVhbCBFQyBEUkJHIGZyb20gU1A4MDAtOTAuIFVwZGF0ZSBEUkJHIGFsZ29yaXRobSB0ZXN0CiAgICAgYW5kIFBPU1QgdG8gaGFuZGxlIER1YWwgRUMgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGNhbm9uaWNhbCBnZW5lcmF0aW9uIG9mIERTQSBwYXJhbWV0ZXIgJ2cnLiBTZWUgCiAgICAgRklQUyAxODYtMyBBLjIuMy4KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEhNQUMgRFJCRyBmcm9tIFNQODAwLTkwLiBVcGRhdGUgRFJCRyBhbGdvcml0aG0gdGVzdCBhbmQKICAgICBQT1NUIHRvIGhhbmRsZSBITUFDIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgRklQU19tb2R1bGVfdmVyc2lvbigpIGFuZCBGSVBTX21vZHVsZV92ZXJzaW9uX3RleHQoKQogICAgIHRvIHJldHVybiBudW1lcmljYWwgYW5kIHN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgRklQUyBtb2R1bGUgbnVtYmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbmFtZSBGSVBTX21vZGVfc2V0IGFuZCBGSVBTX21vZGUgdG8gRklQU19tb2R1bGVfbW9kZV9zZXQgYW5kCiAgICAgRklQU19tb2R1bGVfbW9kZS4gRklQU19tb2RlIGFuZCBGSVBTX21vZGVfc2V0IHdpbGwgYmUgaW1wbGVtZW50ZWQKICAgICBvdXRzaWRlIHRoZSB2YWxpZGF0ZWQgbW9kdWxlIGluIHRoZSBGSVBTIGNhcGFibGUgT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNaW5vciBjaGFuZ2UgdG8gRFJCRyBlbnRyb3B5IGNhbGxiYWNrIHNlbWFudGljcy4gSW4gc29tZSBjYXNlcwogICAgIHRoZXJlIGlzIG5vIG11bHRpcGxlIG9mIHRoZSBibG9jayBsZW5ndGggYmV0d2VlbiBtaW5fbGVuIGFuZAogICAgIG1heF9sZW4uIEFsbG93IHRoZSBjYWxsYmFjayB0byByZXR1cm4gbW9yZSB0aGFuIG1heF9sZW4gYnl0ZXMKICAgICBvZiBlbnRyb3B5IGJ1dCBkaXNjYXJkIGFueSBleHRyYTogaXQgaXMgdGhlIGNhbGxiYWNrJ3MgcmVzcG9uc2liaWxpdHkKICAgICB0byBlbnN1cmUgdGhhdCB0aGUgZXh0cmEgZGF0YSBkaXNjYXJkZWQgZG9lcyBub3QgaW1wYWN0IHRoZQogICAgIHJlcXVlc3RlZCBhbW91bnQgb2YgZW50cm9weS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUFJORyBzZWN1cml0eSBzdHJlbmd0aCBjaGVja3MgdG8gUlNBLCBEU0EgYW5kIEVDRFNBIHVzaW5nIAogICAgIGluZm9ybWF0aW9uIGluIEZJUFMxODYtMywgU1A4MDAtNTcgYW5kIFNQODAwLTEzMUEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0NNIHN1cHBvcnQgdmlhIEVWUC4gSW50ZXJmYWNlIGlzIHZlcnkgc2ltaWxhciB0byBHQ00gY2FzZSBleGNlcHQgd2UKICAgICBtdXN0IHN1cHBseSBhbGwgZGF0YSBpbiBvbmUgY2h1bmsgKGkuZS4gbm8gdXBkYXRlLCBmaW5hbCkgYW5kIHRoZQogICAgIG1lc3NhZ2UgbGVuZ3RoIG11c3QgYmUgc3VwcGxpZWQgaWYgQUFEIGlzIHVzZWQuIEFkZCBhbGdvcml0aG0gdGVzdAogICAgIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCB2ZXJzaW9uIG9mIFBPU1Qgb3ZlcmhhdWwuIEFkZCBQT1NUIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBzdGF0dXMKICAgICBvZiBQT1NUIHRvIGJlIG1vbml0b3JlZCBhbmQvb3IgZmFpbHVyZXMgaW5kdWNlZC4gTW9kaWZ5IGZpcHNfdGVzdF9zdWl0ZQogICAgIHRvIHVzZSBjYWxsYmFjay4gQWx3YXlzIHJ1biBhbGwgc2VsZnRlc3RzIGV2ZW4gaWYgb25lIGZhaWxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFhUUyBzdXBwb3J0IGluY2x1ZGluZyBhbGdvcml0aG0gdGVzdCBkcml2ZXIgaW4gdGhlIGZpcHNfZ2NtdGVzdCBwcm9ncmFtLgogICAgIE5vdGU6IHRoaXMgZG9lcyBpbmNyZWFzZSB0aGUgbWF4aW11bSBrZXkgbGVuZ3RoIGZyb20gMzIgdG8gNjQgYnl0ZXMgYnV0CiAgICAgdGhlcmUgc2hvdWxkIGJlIG5vIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzc3VlcyBhcyBleGlzdGluZyBhcHBsaWNhdGlvbnMKICAgICB3aWxsIG5ldmVyIHVzZSBYVFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgcmVvcmdhbmlzYXRpb24gb2YgRklQUyBQUk5HIGJlaGF2aW91ci4gUmVtb3ZlIGFsbCBkZXBlbmRlbmNpZXMKICAgICB0byBPcGVuU1NMIFJBTkQgY29kZSBhbmQgcmVwbGFjZSB3aXRoIGEgdGlueSBGSVBTIFJBTkQgQVBJIHdoaWNoIGFsc28KICAgICBwZXJmb3JtcyBhbGdvcml0aG0gYmxvY2tpbmcgZm9yIHVuYXBwcm92ZWQgUFJORyB0eXBlcy4gQWxzbyBkbyBub3QKICAgICBzZXQgUFJORyB0eXBlIGluIEZJUFNfbW9kZV9zZXQoKTogbGVhdmUgdGhpcyB0byB0aGUgYXBwbGljYXRpb24uCiAgICAgQWRkIGRlZmF1bHQgT3BlblNTTCBEUkJHIGhhbmRsaW5nOiBzZXRzIHVwIEZJUFMgUFJORyBhbmQgc2VlZHMgd2l0aAogICAgIHRoZSBzdGFuZGFyZCBPcGVuU1NMIFBSTkc6IHNldCBhZGRpdGlvbmFsIGRhdGEgdG8gYSBkYXRlIHRpbWUgdmVjdG9yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbmFtZSBvbGQgWDkuMzEgUFJORyBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gRklQU19yYW5kKiB0byBGSVBTX3g5MzEqLgogICAgIFRoaXMgc2hvdWxkbid0IHByZXNlbnQgYW55IGluY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBiZWNhdXNlIGFwcGxpY2F0aW9ucwogICAgIHNob3VsZG4ndCBiZSB1c2luZyB0aGVzZSBkaXJlY3RseSBhbmQgYW55IHRoYXQgYXJlIHdpbGwgbmVlZCB0byByZXRoaW5rCiAgICAgYW55d2F5IGFzIHRoZSBYOS4zMSBQUk5HIGlzIG5vdyBkZXByZWNhdGVkIGJ5IEZJUFMgMTQwLTIKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgc2VsZiB0ZXN0cyBhbmQgaGVhbHRoIGNoZWNraW5nIHJlcXVpcmVkIGJ5IFNQODAwLTkwIERSQkcuCiAgICAgUmVtb3ZlIHN0cmVuZ3RoIHBhcmFtZXRlciBmcm9tIEZJUFNfZHJiZ19pbnN0YW50aWF0ZSBhbmQgYWx3YXlzCiAgICAgaW5zdGFudGlhdGUgYXQgbWF4aW11bSBzdXBwb3J0ZWQgc3RyZW5ndGguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVDREggY29kZSB0byBmaXBzIG1vZHVsZSBhbmQgZmlwc19lY2RodnMgZm9yIHByaW1pdGl2ZXMgb25seSB0ZXN0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhbGdvcml0aG0gdGVzdCBwcm9ncmFtIGZpcHNfZGh2cyB0byBoYW5kbGUgREggcHJpbWl0aXZlcyBvbmx5IHRlc3RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIERIX2NvbXB1dGVfa2V5X3BhZGRlZCgpIHRvIGNvbXB1dGUgYSBESCBrZXkgYW5kIHBhZCB3aXRoCiAgICAgbGVhZGluZyB6ZXJvZXMgaWYgbmVlZGVkOiB0aGlzIGNvbXBsaWVzIHdpdGggU1A4MDAtNTZBIGV0IGFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgU1A4MDAtOTAgRFJCR3MgZm9yIEhhc2ggYW5kIENUUi4gTm90IHVzZWQgYnkKICAgICBhbnl0aGluZywgaW5jb21wbGV0ZSwgc3ViamVjdCB0byBjaGFuZ2UgYW5kIGxhcmdlbHkgdW50ZXN0ZWQgYXQgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgZmlwc2NhbmlzdGVyb25seSBidWlsZCBvcHRpb24gdG8gb25seSBidWlsZCB0aGUgbmVjZXNzYXJ5IG9iamVjdAogICAgIGZpbGVzIGJ5IGZpbHRlcmluZyBGSVBTX0VYX09CSiB0aHJvdWdoIGEgcGVybCBzY3JpcHQgaW4gY3J5cHRvL01ha2VmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBleHBlcmltZW50YWwgb3B0aW9uIEZJUFNTWU1TIHRvIGdpdmUgYWxsIHN5bWJvbHMgaW4KICAgICBmaXBzY2FuaXN0ZXIubyBhbmQgRklQUyBvciBmaXBzIHByZWZpeC4gVGhpcyB3aWxsIGF2b2lkCiAgICAgY29uZmxpY3RzIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIE9wZW5TU0wuIEFkZCBwZXJsIHNjcmlwdAogICAgIHV0aWwvZmlwc2FzLnBsIHRvIHByZXByb2Nlc3MgYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlIGZpbGVzCiAgICAgYW5kIHJlbmFtZSBhbnkgYWZmZWN0ZWQgc3ltYm9scy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2VsZnRlc3QgY2hlY2tzIGFuZCBhbGdvcml0aG0gYmxvY2sgb2Ygbm9uLWZpcHMgYWxnb3JpdGhtcyBpbgogICAgIEZJUFMgbW9kZS4gUmVtb3ZlIERFUzIgZnJvbSBzZWxmdGVzdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVDRFNBIGNvZGUgdG8gZmlwcyBtb2R1bGUuIEFkZCB0aW55IGZpcHNfZWNkc2FfY2hlY2sgdG8ganVzdAogICAgIHJldHVybiBpbnRlcm5hbCBtZXRob2Qgd2l0aG91dCBhbnkgRU5HSU5FIGRlcGVuZGVuY2llcy4gQWRkIG5ldwogICAgIHRpbnkgZmlwcyBzaWduIGFuZCB2ZXJpZnkgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBidWlsZCBvcHRpb24gbm8tZWMybSB0byBkaXNhYmxlIGNoYXJhY3RlcmlzdGljIDIgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYnVpbGQgb3B0aW9uICJmaXBzY2FuaXN0ZXJvbmx5Ii4gVGhpcyBvbmx5IGJ1aWxkcyBmaXBzY2FuaXN0ZXIubwogICAgIGFuZCAoY3VycmVudGx5KSBhc3NvY2lhdGVkIGZpcHMgdXRpbGl0aWVzLiBVc2VzIHRoZSBmaWxlIE1ha2VmaWxlLmZpcHMKICAgICBpbnN0ZWFkIG9mIE1ha2VmaWxlLm9yZyBhcyB0aGUgcHJvdG90eXBlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIEZJUFMgbW9kZSByZXN0cmljdGlvbnMgdG8gR0NNLiBBZGQgaW50ZXJuYWwgSVYgZ2VuZXJhdG9yLgogICAgIFVwZGF0ZSBmaXBzX2djbXRlc3QgdG8gdXNlIElWIGdlbmVyYXRvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsLCBleHBlcmltZW50YWwgRVZQIHN1cHBvcnQgZm9yIEFFUy1HQ00uIEFBRCBjYW4gYmUgaW5wdXQgYnkKICAgICBzZXR0aW5nIG91dHB1dCBidWZmZXIgdG8gTlVMTC4gVGhlICpGaW5hbCBmdW5jdGlvbiBtdXN0IGJlCiAgICAgY2FsbGVkIGFsdGhvdWdoIGl0IHdpbGwgbm90IHJldHJpZXZlIGFueSBhZGRpdGlvbmFsIGRhdGEuIFRoZSB0YWcKICAgICBjYW4gYmUgc2V0IG9yIHJldHJpZXZlZCB3aXRoIGEgY3RybC4gVGhlIElWIGxlbmd0aCBpcyBieSBkZWZhdWx0IDEyCiAgICAgYnl0ZXMgKDk2IGJpdHMpIGJ1dCBjYW4gYmUgc2V0IHRvIGFuIGFsdGVybmF0aXZlIHZhbHVlLiBJZiB0aGUgSVYKICAgICBsZW5ndGggZXhjZWVkcyB0aGUgbWF4aW11bSBJViBsZW5ndGggKGN1cnJlbnRseSAxNiBieXRlcykgaXQgY2Fubm90IGJlCiAgICAgc2V0IGJlZm9yZSB0aGUga2V5LiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZmxhZyBpbiBjaXBoZXJzOiBFVlBfQ0lQSF9GTEFHX0NVU1RPTV9DSVBIRVIuIFRoaXMgbWVhbnMgdGhlCiAgICAgdW5kZXJseWluZyBkb19jaXBoZXIgZnVuY3Rpb24gaGFuZGxlcyBhbGwgY2lwaGVyIHNlbWFudGljcyBpdHNlbGYKICAgICBpbmNsdWRpbmcgcGFkZGluZyBhbmQgZmluYWxpc2F0aW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiAoZm9yIGV4YW1wbGUpCiAgICAgYW4gRU5HSU5FIGNpcGhlciBoYW5kbGVzIGJsb2NrIHBhZGRpbmcgaXRzZWxmLiBUaGUgYmVoYXZpb3VyIG9mCiAgICAgZG9fY2lwaGVyIGlzIHN1YnRseSBjaGFuZ2VkIGlmIHRoaXMgZmxhZyBpcyBzZXQ6IHRoZSByZXR1cm4gdmFsdWUKICAgICBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciAoemVybyBpcwogICAgIG5vIGxvbmdlciBhbiBlcnJvciBjb2RlKSBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIEFsc28gaWYgdGhlCiAgICAgaW5wdXQgYnVmZmVyIGlzIE5VTEwgYW5kIGxlbmd0aCAwIGZpbmFsaXNhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIGEgY2FuZGlkYXRlIGlzc3VlciBjZXJ0aWZpY2F0ZSBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCiAgICAgcGF0aCBpZ25vcmUgaXQ6IG5ldyBkZWJ1ZyBub3RpZmljYXRpb24gWDUwOV9WX0VSUl9QQVRIX0xPT1AgZm9yIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXByb3ZlIGZvcndhcmQtc2VjdXJpdHkgc3VwcG9ydDogYWRkIGZ1bmN0aW9ucwoKICAgICAgIHZvaWQgU1NMX0NUWF9zZXRfbm90X3Jlc3VtYWJsZV9zZXNzaW9uX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFNTTCAqc3NsLCBpbnQgaXNfZm9yd2FyZF9zZWN1cmUpKQogICAgICAgdm9pZCBTU0xfc2V0X25vdF9yZXN1bWFibGVfc2Vzc2lvbl9jYWxsYmFjayhTU0wgKnNzbCwgaW50ICgqY2IpKFNTTCAqc3NsLCBpbnQgaXNfZm9yd2FyZF9zZWN1cmUpKQoKICAgICBmb3IgdXNlIGJ5IFNTTC9UTFMgc2VydmVyczsgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEKICAgICBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCBhbmQgZ2V0cyB0byBkZWNpZGUgd2hldGhlciB0aGUgc2Vzc2lvbiBtYXkgYmUKICAgICBjYWNoZWQgdG8gbWFrZSBpdCByZXN1bWFibGUgKHJldHVybiAwKSBvciBub3QgKHJldHVybiAxKS4gIChBcyBieSB0aGUKICAgICBTU0wvVExTIHByb3RvY29sIHNwZWNpZmljYXRpb25zLCB0aGUgc2Vzc2lvbl9pZCBzZW50IGJ5IHRoZSBzZXJ2ZXIgd2lsbCBiZQogICAgIGVtcHR5IHRvIGluZGljYXRlIHRoYXQgdGhlIHNlc3Npb24gaXMgbm90IHJlc3VtYWJsZTsgYWxzbywgdGhlIHNlcnZlciB3aWxsCiAgICAgbm90IGdlbmVyYXRlIFJGQyA0NTA3IChSRkMgNTA3Nykgc2Vzc2lvbiB0aWNrZXRzLikKCiAgICAgQSBzaW1wbGUgcmVhc29uYWJsZSBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpcyB0byByZXR1cm4gaXNfZm9yd2FyZF9zZWN1cmUuCiAgICAgVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gMSBvciAwIGRlcGVuZGluZyBvbiB0aGUgY2lwaGVyc3VpdGUgc2VsZWN0ZWQKICAgICBieSB0aGUgU1NML1RMUyBzZXJ2ZXIgbGlicmFyeSwgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGNhbiBwcm92aWRlIGZvcndhcmQKICAgICBzZWN1cml0eS4KICAgICBbRW1pbGlhIEvkc3BlciA8ZW1pbGlhLmthc3BlckBlc2F0Lmt1bGV1dmVuLmJlPiAoR29vZ2xlKV0KCiAgKikgTmV3IC12ZXJpZnlfbmFtZSBvcHRpb24gaW4gY29tbWFuZCBsaW5lIHV0aWxpdGllcyB0byBzZXQgdmVyaWZpY2F0aW9uCiAgICAgcGFyYW1ldGVycyBieSBuYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgQ01BQyBpbXBsZW1lbnRhdGlvbi4gV0FSTklORzogRVhQRVJJTUVOVEFMLCBBUEkgTUFZIENIQU5HRS4KICAgICBBZGQgQ01BQyBwa2V5IG1ldGhvZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXhwZXJpbWVudGFsIHJlbmVnb3RpYXRpb24gaW4gc19zZXJ2ZXIgLXd3dyBtb2RlLiBJZiB0aGUgY2xpZW50IAogICAgIGJyb3dzZXMgL3JlbmVnIGNvbm5lY3Rpb24gaXMgcmVuZWdvdGlhdGVkLiBJZiAvcmVuZWdjZXJ0IGl0IGlzCiAgICAgcmVuZWdvdGlhdGVkIHJlcXVlc3RpbmcgYSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gImV4dGVybmFsIiBzZXNzaW9uIGNhY2hlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgdG8gc19zZXJ2ZXIuIFRoaXMKICAgICBzaG91bGQgaGVscCB0cmFjZSBpc3N1ZXMgd2hpY2ggbm9ybWFsbHkgYXJlIG9ubHkgYXBwYXJlbnQgaW4gZGVwbG95ZWQKICAgICBtdWx0aS1wcm9jZXNzIHNlcnZlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGF1ZGl0IG9mIGxpYmNyeXB0byB3aXRoIERFQlVHX1VOVVNFRC4gRml4IG1hbnkgY2FzZXMgd2hlcmUKICAgICByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gTkIuIFRoZSBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9zZWVkKCksCiAgICAgQklPX3NldF9jaXBoZXIoKSBhbmQgc29tZSBvYnNjdXJlIFBFTSBmdW5jdGlvbnMgd2VyZSBjaGFuZ2VkIHNvIHRoZXkKICAgICBjYW4gbm93IHJldHVybiBhbiBlcnJvci4gVGhlIFJBTkQgY2hhbmdlcyByZXF1aXJlZCBhIGNoYW5nZSB0byB0aGUKICAgICBSQU5EX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG1hY3JvIF9fb3d1ciBmb3IgIk9wZW5TU0wgV2FybiBVbnVzZWQgUmVzdWx0Ii4gVGhpcyBtYWtlcyB1c2Ugb2YKICAgICBhIGdjYyBhdHRyaWJ1dGUgdG8gd2FybiBpZiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gaXMgaWdub3JlZC4gVGhpcwogICAgIGlzIGVuYWJsZSBpZiBERUJVR19VTlVTRUQgaXMgc2V0LiBBZGQgdG8gc2V2ZXJhbCBmdW5jdGlvbnMgaW4gZXZwLmgKICAgICB3aG9zZSByZXR1cm4gdmFsdWUgaXMgb2Z0ZW4gaWdub3JlZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFrIGFuZCAxLjAuMiBbeHggWFhYIHh4eHhdCgogICopIEFjY2VsZXJhdGVkIE5JU1QgUC0yNTYgZWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb24gZm9yIHg4Nl82NAogICAgIChvdGhlciBwbGF0Zm9ybXMgcGVuZGluZykuCiAgICAgW1NoYXkgR3Vlcm9uICYgVmxhZCBLcmFzbm92IChJbnRlbCBDb3JwKSwgQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBTaWduZWRDZXJ0aWZpY2F0ZVRpbWVzdGFtcExpc3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUCByZXNwb25zZSBleHRlbnNpb25zIGZyb20gUkZDNjk2Mi4KICAgICBbUm9iIFN0cmFkbGluZ10KCiAgKikgRml4IGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lICh0aHVzLCBFQ19QT0lOVHNfbXVsIGV0Yy4pCiAgICAgZm9yIGNvcm5lciBjYXNlcy4gKENlcnRhaW4gaW5wdXQgcG9pbnRzIGF0IGluZmluaXR5IGNvdWxkIGxlYWQgdG8KICAgICBib2d1cyByZXN1bHRzLCB3aXRoIG5vbi1pbmZpbml0eSBpbnB1dHMgbWFwcGVkIHRvIGluZmluaXR5IHRvby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlcklTQSAyLjAuNywgZmlyc3QgaW1wbGVtZW50ZWQgaW4gUE9XRVI4LgogICAgIFRoaXMgY292ZXJzIEFFUywgU0hBMjU2LzUxMiBhbmQgR0hBU0guICJJbml0aWFsIiBtZWFucyB0aGF0IG1vc3QKICAgICBjb21tb24gY2FzZXMgYXJlIG9wdGltaXplZCBhbmQgdGhlcmUgc3RpbGwgaXMgcm9vbSBmb3IgZnVydGhlcgogICAgIGltcHJvdmVtZW50cy4gVmVjdG9yIFBlcm11dGF0aW9uIEFFUyBmb3IgQWx0aXZlYyBpcyBhbHNvIGFkZGVkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbGl0dGxlLWVuZGlhbiBwcGM2NCBMaW51eCB0YXJnZXQuCiAgICAgW01hcmNlbG8gQ2VycmkgKElCTSldCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgQU1SdjggSVNBIGNyeXB0byBleHRlbnNpb25zLiBUaGlzIGNvdmVycyBBRVMsCiAgICAgU0hBMSwgU0hBMjU2IGFuZCBHSEFTSC4gIkluaXRpYWwiIG1lYW5zIHRoYXQgbW9zdCBjb21tb24gY2FzZXMKICAgICBhcmUgb3B0aW1pemVkIGFuZCB0aGVyZSBzdGlsbCBpcyByb29tIGZvciBmdXJ0aGVyIGltcHJvdmVtZW50cy4KICAgICBCb3RoIDMyLSBhbmQgNjQtYml0IG1vZGVzIGFyZSBzdXBwb3J0ZWQuCiAgICAgW0FuZHkgUG9seWFrb3YsIEFyZCBCaWVzaGV1dmVsIChMaW5hcm8pXQoKICAqKSBJbXByb3ZlZCBBUk12NyBORU9OIHN1cHBvcnQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFN1cHBvcnQgZm9yIFNQQVJDIEFyY2hpdGVjdHVyZSAyMDExIGNyeXB0byBleHRlbnNpb25zLCBmaXJzdAogICAgIGltcGxlbWVudGVkIGluIFNQQVJDIFQ0LiBUaGlzIGNvdmVycyBBRVMsIERFUywgQ2FtZWxsaWEsIFNIQTEsCiAgICAgU0hBMjU2LzUxMiwgTUQ1LCBHSEFTSCBhbmQgbW9kdWxhciBleHBvbmVudGlhdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdiwgRGF2aWQgTWlsbGVyXQoKICAqKSBBY2NlbGVyYXRlZCBtb2R1bGFyIGV4cG9uZW50aWF0aW9uIGZvciBJbnRlbCBwcm9jZXNzb3JzLCBhLmsuYS4KICAgICBSU0FaLgogICAgIFtTaGF5IEd1ZXJvbiAmIFZsYWQgS3Jhc25vdiAoSW50ZWwgQ29ycCldCgogICopIFN1cHBvcnQgZm9yIG5ldyBhbmQgdXBjb21pbmcgSW50ZWwgcHJvY2Vzc29ycywgaW5jbHVkaW5nIEFWWDIsCiAgICAgQk1JIGFuZCBTSEEgSVNBIGV4dGVuc2lvbnMuIFRoaXMgaW5jbHVkZXMgYWRkaXRpb25hbCAic3RpdGNoZWQiCiAgICAgaW1wbGVtZW50YXRpb25zLCBBRVNOSS1TSEEyNTYgYW5kIEdDTSwgYW5kIG11bHRpLWJ1ZmZlciBzdXBwb3J0CiAgICAgZm9yIFRMUyBlbmNyeXB0LgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBJbnRlbCBDb3JwLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBTdXBwb3J0IGZvciBEVExTIDEuMi4gVGhpcyBhZGRzIHR3byBzZXRzIG9mIERUTFMgbWV0aG9kczogRFRMU18qX21ldGhvZCgpCiAgICAgc3VwcG9ydHMgYm90aCBEVExTIDEuMiBhbmQgMS4wIGFuZCBzaG91bGQgdXNlIHdoYXRldmVyIHZlcnNpb24gdGhlIHBlZXIKICAgICBzdXBwb3J0cyBhbmQgRFRMU3YxXzJfKl9tZXRob2QoKSB3aGljaCBzdXBwb3J0cyBEVExTIDEuMiBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBhbGdvcml0aG0gc3BlY2lmaWMgY2hhaW5zIGluIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKToKICAgICB0aGlzIGZpeGVzIGEgbGltaWF0aW9uIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kZWQgUlNBIE9BRVAgc3VwcG9ydCB2aWEgRVZQX1BLRVkgQVBJLiBPcHRpb25zIHRvIHNwZWNpZnkgZGlnZXN0LAogICAgIE1HRjEgZGlnZXN0IGFuZCBPQUVQIGxhYmVsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBFVlAgc3VwcG9ydCBmb3Iga2V5IHdyYXBwaW5nIGFsZ29yaXRobXMsIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKICAgICBleGlzdGluZyBjb2RlIHRoZSBmbGFnIEVWUF9DSVBIRVJfQ1RYX1dSQVBfQUxMT1cgaGFzIHRvIGJlIHNldCBpbgogICAgIHRoZSBFVlBfQ0lQSEVSX0NUWCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gQWRkIEFFUyBhbmQgREVTMyB3cmFwCiAgICAgYWxnb3JpdGhtcyBhbmQgaW5jbHVkZSB0ZXN0cyBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25zIHRvIGFsbG9jYXRlIGFuZCBzZXQgdGhlIGZpZWxkcyBvZiBhbiBFQ0RTQV9NRVRIT0QKICAgICBzdHJ1Y3R1cmUuCiAgICAgW0RvdWdsYXMgRS4gRW5nZXJ0LCBTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgT1BFTlNTTF9nbXRpbWVfZGlmZiBhbmQgQVNOMV9USU1FX2RpZmYgdG8gZmluZCB0aGUKICAgICBkaWZmZXJlbmNlIGluIGRheXMgYW5kIHNlY29uZHMgYmV0d2VlbiB0d28gdG0gb3IgQVNOMV9USU1FIHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1yZXYgdGVzdCBvcHRpb24gdG8gc19zZXJ2ZXIgdG8ganVzdCByZXZlcnNlIG9yZGVyIG9mIGNoYXJhY3RlcnMKICAgICByZWNlaXZlZCBieSBjbGllbnQgYW5kIHNlbmQgYmFjayB0byBzZXJ2ZXIuIEFsc28gcHJpbnRzIGFuIGFiYnJldmlhdGVkCiAgICAgc3VtbWFyeSBvZiB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLWJyaWVmIGZvciBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgdG8gcHJpbnQgb3V0IGEgYnJpZWYgc3VtbWFyeQogICAgIG9mIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY2FsbGJhY2tzIGZvciBhcmJpdHJhcnkgVExTIGV4dGVuc2lvbnMuCiAgICAgW1RyZXZvciBQZXJyaW4gPHRyZXZwQHRyZXZwLm5ldD4gYW5kIEJlbiBMYXVyaWVdCgogICopIE5ldyBvcHRpb24gLWNybF9kb3dubG9hZCBpbiBzZXZlcmFsIG9wZW5zc2wgdXRpbGl0aWVzIHRvIGRvd25sb2FkIENSTHMKICAgICBmcm9tIENSTERQIGV4dGVuc2lvbiBpbiBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgLUNSTCBhbmQgLUNSTGZvcm0gZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlciBmb3IgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfZGlmZiB0byBnZW5lcmF0ZSBhIGRlbHRhIENSTCBmcm9tIHRoZSBkaWZmZXJlbmNlCiAgICAgb2YgdHdvIGZ1bGwgQ1JMcy4gQWRkIHN1cHBvcnQgdG8gImNybCIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIHRvIHNldCBsb29rdXBfY3JscyBmdW5jdGlvbiBhbmQgdG8gcmV0cmlldmUKICAgICBYNTA5X1NUT1JFIGZyb20gWDUwOV9TVE9SRV9DVFguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJpbnQgb3V0IGRlcHJlY2F0ZWQgaXNzdWVyIGFuZCBzdWJqZWN0IHVuaXF1ZSBJRCBmaWVsZHMgaW4KICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIE9DU1AgSS9PIGZ1bmN0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIGZvciBzaW1wbGUgZ2VuZXJhbCBwdXJwb3NlCiAgICAgSFRUUCBhcyB3ZWxsIGFzIE9DU1AuIE5ldyB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRvd25sb2FkCiAgICAgQ1JMcyB1c2luZyB0aGUgT0NTUCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVsZWdhdGUgY29tbWFuZCBsaW5lIGhhbmRsaW5nIGluIHNfY2xpZW50L3Nfc2VydmVyIHRvIFNTTF9DT05GIEFQSXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMX0NPTkYqIGZ1bmN0aW9ucy4gVGhlc2UgcHJvdmlkZSBhIGNvbW1vbiBmcmFtZXdvcmsgZm9yIGFwcGxpY2F0aW9uCiAgICAgY29uZmlndXJhdGlvbiB1c2luZyBjb25maWd1cmF0aW9uIGZpbGVzIG9yIGNvbW1hbmQgbGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NML1RMUyB0cmFjaW5nIGNvZGUuIFRoaXMgcGFyc2VzIG91dCBTU0wvVExTIHJlY29yZHMgdXNpbmcgdGhlCiAgICAgbWVzc2FnZSBjYWxsYmFjayBhbmQgcHJpbnRzIHRoZSByZXN1bHRzLiBOZWVkcyBjb21waWxlIHRpbWUgb3B0aW9uCiAgICAgImVuYWJsZS1zc2wtdHJhY2UiLiBOZXcgb3B0aW9ucyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgdG8gZW5hYmxlCiAgICAgdHJhY2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY3RybCBhbmQgbWFjcm8gdG8gcmV0cmlldmUgc3VwcG9ydGVkIHBvaW50cyBleHRlbnNpb25zLgogICAgIFByaW50IG91dCBleHRlbnNpb24gaW4gc19zZXJ2ZXIgYW5kIHNfY2xpZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgdG8gcmV0cmlldmUgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFuZCBzaWduYXR1cmUKICAgICBPSUQgTklELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgdG8gcmV0cmlldmUgYW5kIG1hbmlwdWxhdGUgdGhlIHJhdyBjaXBoZXJsaXN0IHNlbnQgYnkgYQogICAgIGNsaWVudCB0byBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTdWl0ZSBCIG1vZGVzIGZvciBUTFMgY29kZS4gVGhlc2UgdXNlIGFuZCBlbmZvcmNlIHRoZSByZXF1aXJlbWVudHMKICAgICBvZiBSRkM2NDYwOiByZXN0cmljdCBjaXBoZXJzdWl0ZXMsIG9ubHkgcGVybWl0IFN1aXRlIEIgYWxnb3JpdGhtcyBhbmQKICAgICBvbmx5IHVzZSBTdWl0ZSBCIGN1cnZlcy4gVGhlIFN1aXRlIEIgbW9kZXMgY2FuIGJlIHNldCBieSB1c2luZyB0aGUKICAgICBzdHJpbmdzICJTVUlURUIxMjgiLCAiU1VJVEVCMTkyIiBvciAiU1VJVEVCMTI4T05MWSIgZm9yIHRoZSBjaXBoZXJzdHJpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNoYWluIHZlcmlmaWNhdGlvbiBmbGFncyBmb3IgU3VpdGUgQiBsZXZlbHMgb2Ygc2VjdXJpdHkuIENoZWNrCiAgICAgYWxnb3JpdGhtcyBhcmUgYWNjZXB0YWJsZSB3aGVuIGZsYWdzIGFyZSBzZXQgaW4gWDUwOV92ZXJpZnlfY2VydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRsczFfY2hlY2tfY2hhaW4gcmV0dXJuIGEgc2V0IG9mIGZsYWdzIGluZGljYXRpbmcgY2hlY2tzIHBhc3NlZAogICAgIGJ5IGEgY2VydGlmaWNhdGUgY2hhaW4uIEFkZCBhZGRpdGlvbmFsIHRlc3RzIHRvIGhhbmRsZSBjbGllbnQKICAgICBjZXJ0aWZpY2F0ZXM6IGNoZWNrcyBmb3IgbWF0Y2hpbmcgY2VydGlmaWNhdGUgdHlwZSBhbmQgaXNzdWVyIG5hbWUKICAgICBjb21wYXJpc29uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgYSBzaWduYXR1cmUgYWxnb3JpdGhtIG5vdCBpbiB0aGUgcGVlcgogICAgIHByZWZlcmVuY2UgbGlzdCBhYm9ydCB0aGUgaGFuZHNoYWtlLiBJZiBjbGllbnQgaGFzIG5vIHN1aXRhYmxlCiAgICAgc2lnbmF0dXJlIGFsZ29yaXRobXMgaW4gcmVzcG9uc2UgdG8gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGRvIG5vdAogICAgIHVzZSB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2VydmVyIEVDIHRtcCBrZXkgaXMgbm90IGluIGNsaWVudCBwcmVmZXJlbmNlIGxpc3QgYWJvcnQgaGFuZHNoYWtlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBzdG9yZXMgaW4gQ0VSVCBzdHJ1Y3R1cmUuIFRoaXMgbWFrZXMgaXQKICAgICBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCBzdG9yZXMgcGVyIFNTTCBzdHJ1Y3R1cmUgb3Igb25lIHN0b3JlIGluCiAgICAgdGhlIHBhcmVudCBTU0xfQ1RYLiBJbmNsdWRlIGRpc3RpbnQgc3RvcmVzIGZvciBjZXJ0aWZpY2F0ZSBjaGFpbgogICAgIHZlcmlmaWNhdGlvbiBhbmQgY2hhaW4gYnVpbGRpbmcuIE5ldyBjdHJsIFNTTF9DVFJMX0JVSUxEX0NFUlRfQ0hBSU4KICAgICB0byBidWlsZCBhbmQgc3RvcmUgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbiBDRVJUIHN0cnVjdHVyZTogcmV0dXJpbmcKICAgICBhbiBlcnJvciBpZiB0aGUgY2hhaW4gY2Fubm90IGJlIGJ1aWx0OiB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb25zCiAgICAgdG8gdGVzdCBpZiBhIGNoYWluIGlzIGNvcnJlY3RseSBjb25maWd1cmVkLgoKICAgICBOb3RlOiBpZiB0aGUgQ0VSVCBiYXNlZCBzdG9yZXMgYXJlIG5vdCBzZXQgdGhlbiB0aGUgcGFyZW50IFNTTF9DVFgKICAgICBzdG9yZSBpcyB1c2VkIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYmVoYXZpb3VyLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gc3NsX3NldF9jbGllbnRfZGlzYWJsZWQgdG8gc2V0IGEgY2lwaGVyc3VpdGUgZGlzYWJsZWQKICAgICBtYXNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlc3Npb24sIGNoZWNrIG1hc2sgd2hlbiBzZW5kaW5nIGNsaWVudAogICAgIGhlbGxvIGFuZCBjaGVja2luZyB0aGUgcmVxdWVzdGVkIGNpcGhlcnN1aXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjdHJscyB0byByZXRyaWV2ZSBhbmQgc2V0IGNlcnRpZmljYXRlIHR5cGVzIGluIGEgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IG1lc3NhZ2UuIFByaW50IG91dCByZWNlaXZlZCB2YWx1ZXMgaW4gc19jbGllbnQuIElmIGNlcnRpZmljYXRlCiAgICAgdHlwZXMgaXMgbm90IHNldCB3aXRoIGN1c3RvbSB2YWx1ZXMgc2V0IHNlbnNpYmxlIHZhbHVlcyBiYXNlZCBvbgogICAgIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBkaXN0aW5jdCBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNlcnRpZmljYXRlIGNhbGxiYWNrLiBJZiBzZXQgdGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBjZXJ0aWZpY2F0ZQogICAgIGlzIHJlcXVpcmVkIGJ5IGNsaWVudCBvciBzZXJ2ZXIuIEFuIGFwcGxpY2F0aW9uIGNhbiBkZWNpZGUgd2hpY2gKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB0byBwcmVzZW50IGJhc2VkIG9uIGFyYml0cmFyeSBjcml0ZXJpYTogZm9yIGV4YW1wbGUKICAgICBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuIEFkZCB2ZXJ5IHNpbXBsZSBleGFtcGxlIHRvIHNfc2VydmVyLgogICAgIFRoaXMgZml4ZXMgbWFueSBvZiB0aGUgcHJvYmxlbXMgYW5kIHJlc3RyaWN0aW9ucyBvZiB0aGUgZXhpc3RpbmcgY2xpZW50CiAgICAgY2VydGlmaWNhdGUgY2FsbGJhY2s6IGZvciBleGFtcGxlIHlvdSBjYW4gbm93IGNsZWFyIGFuIGV4aXN0aW5nCiAgICAgY2VydGlmaWNhdGUgYW5kIHNwZWNpZnkgdGhlIHdob2xlIGNoYWluLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgInZhbGlkX2ZsYWdzIiBmaWVsZCB0byBDRVJUX1BLRVkgc3RydWN0dXJlIHdoaWNoIGRldGVybWluZXMgd2hhdAogICAgIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgKGlmIGFueXRoaW5nKS4gU2V0IHZhbGlkX2ZsYWdzIGZpZWxkIAogICAgIGluIG5ldyB0bHMxX2NoZWNrX2NoYWluIGZ1bmN0aW9uLiBTaW1wbGlmeSBzc2xfc2V0X2NlcnRfbWFza3Mgd2hpY2ggdXNlZAogICAgIHRvIGhhdmUgc2ltaWxhciBjaGVja3MgaW4gaXQuCgogICAgIEFkZCBuZXcgImNlcnRfZmxhZ3MiIGZpZWxkIHRvIENFUlQgc3RydWN0dXJlIGFuZCBpbmNsdWRlIGEgInN0cmljdCBtb2RlIi4KICAgICBUaGlzIGVuZm9yY2VzIHNvbWUgVExTIGNlcnRpZmljYXRlIHJlcXVpcmVtZW50cyAoc3VjaCBhcyBvbmx5IHBlcm1pdHRpbmcKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgYWxnb3JpdGhtcyBjb250YWluZWQgaW4gdGhlIHN1cHBvcnRlZCBhbGdvcml0aG1zCiAgICAgZXh0ZW5zaW9uKSB3aGljaCBzb21lIGltcGxlbWVudGF0aW9ucyBpZ25vcmU6IHRoaXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkCiAgICAgd2l0aCBjYXV0aW9uIGFzIGl0IGNvdWxkIGNhdXNlIGludGVyb3BlcmFiaWxpdHkgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBhbmQgdGlkeSBzaWduYXR1cmUgYWxnb3JpdGhtIGV4dGVuc2lvbiBwcm9jZXNzaW5nLiBXb3JrIG91dAogICAgIHNoYXJlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyBiYXNlZCBvbiBwcmVmZXJlbmNlcyBhbmQgcGVlciBhbGdvcml0aG1zCiAgICAgYW5kIHByaW50IHRoZW0gb3V0IGluIHNfY2xpZW50IGFuZCBzX3NlcnZlci4gQWJvcnQgaGFuZHNoYWtlIGlmIG5vCiAgICAgc2hhcmVkIHNpZ25hdHVyZSBhbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb25zIHRvIGFsbG93IGN1c3RvbWlzZWQgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zCiAgICAgZm9yIFNTTCBhbmQgU1NMX0NUWCBzdHJ1Y3R1cmVzLiBBZGQgb3B0aW9ucyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICB0byBzdXBwb3J0IHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9jZXJ0c19jbGVhcigpIHRvIGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byBjZXJ0aWZpY2F0ZXMKICAgICBmcm9tIGFuIFNTTCBzdHJ1Y3R1cmUuIEJlZm9yZSB0aGlzIG9uY2UgYSBjZXJ0aWZpY2F0ZSBoYWQgYmVlbiBhZGRlZAogICAgIGl0IGNvdWxkbid0IGJlIHJlbW92ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50ZWdyYXRlIGhvc3RuYW1lLCBlbWFpbCBhZGRyZXNzIGFuZCBJUCBhZGRyZXNzIGNoZWNraW5nIHdpdGggY2VydGlmaWNhdGUKICAgICB2ZXJpZmljYXRpb24uIE5ldyB2ZXJpZnkgb3B0aW9ucyBzdXBwb3J0aW5nIGNoZWNraW5nIGluIG9wZW5zbCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIGFuZCB3aWxkY2FyZCBtYXRjaGluZyBzdXBwb3J0IHRvIGhvc3RuYW1lIGFuZCBlbWFpbCBjaGVja2luZwogICAgIGZ1bmN0aW9ucy4gQWRkIG1hbnVhbCBwYWdlLgogICAgIFtGbG9yaWFuIFdlaW1lciAoUmVkIEhhdCBQcm9kdWN0IFNlY3VyaXR5IFRlYW0pXQoKICAqKSBOZXcgZnVuY3Rpb25zIHRvIGNoZWNrIGEgaG9zdG5hbWUgZW1haWwgb3IgSVAgYWRkcmVzcyBhZ2FpbnN0IGEKICAgICBjZXJ0aWZpY2F0ZS4gQWRkIG9wdGlvbnMgeDUwOSB1dGlsaXR5IHRvIHByaW50IHJlc3VsdHMgb2YgY2hlY2tzIGFnYWluc3QKICAgICBhIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBPQ1NQIGNoZWNraW5nLgogICAgIFtSb2IgU3RyYWRsaW5nIDxyb2Iuc3RyYWRsaW5nQGNvbW9kby5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBleHBsaWNpdGx5IHRydXN0ZWQgbm9uLXJvb3QgQ0FzLiAKICAgICBPcGVuU1NMIHN0aWxsIHRyaWVzIHRvIGJ1aWxkIGEgY29tcGxldGUgY2hhaW4gdG8gYSByb290IGJ1dCBpZiBhbgogICAgIGludGVybWVkaWF0ZSBDQSBoYXMgYSB0cnVzdCBzZXR0aW5nIGluY2x1ZGVkIHRoYXQgaXMgdXNlZC4gVGhlIGZpcnN0CiAgICAgc2V0dGluZyBpcyB1c2VkOiB3aGV0aGVyIHRvIHRydXN0IChlLmcuLCAtYWRkdHJ1c3Qgb3B0aW9uIHRvIHRoZSB4NTA5CiAgICAgdXRpbGl0eSkgb3IgcmVqZWN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtdHJ1c3RlZF9maXJzdCBvcHRpb24gd2hpY2ggYXR0ZW1wdHMgdG8gZmluZCBjZXJ0aWZpY2F0ZXMgaW4gdGhlCiAgICAgdHJ1c3RlZCBzdG9yZSBldmVuIGlmIGFuIHVudHJ1c3RlZCBjaGFpbiBpcyBhbHNvIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1JUFMgYXNzZW1ibHkgcGFjayB1cGRhdGVzOiBzdXBwb3J0IGZvciBNSVBTMzJyMiBhbmQgU21hcnRNSVBTIEFTRSwKICAgICBwbGF0Zm9ybSBzdXBwb3J0IGZvciBMaW51eCBhbmQgQW5kcm9pZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgU3VwcG9ydCBmb3IgbGludXgteDMyLCBJTFAzMiBlbnZpcm9ubWVudCBpbiB4ODZfNjQgZnJhbWV3b3JrLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBFeHBlcmltZW50YWwgbXVsdGktaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgRklQUyBjYXBhYmxlIE9wZW5TU0wuCiAgICAgV2hlbiBpbiBGSVBTIG1vZGUgdGhlIGFwcHJvdmVkIGltcGxlbWVudGF0aW9ucyBhcmUgdXNlZCBhcyBub3JtYWwsCiAgICAgd2hlbiBub3QgaW4gRklQUyBtb2RlIHRoZSBpbnRlcm5hbCB1bmFwcHJvdmVkIHZlcnNpb25zIGFyZSB1c2VkIGluc3RlYWQuCiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSBGSVBTIGNhcGFibGUgT3BlblNTTCBpc24ndCBmb3JjZWQgdG8gdXNlIHRoZQogICAgIChvZnRlbiBsb3dlciBwZXJmb3JtYW5jZSkgRklQUyBpbXBsZW1lbnRhdGlvbnMgb3V0c2lkZSBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHJhbnNwYXJlbnRseSBzdXBwb3J0IFg5LjQyIERIIHBhcmFtZXRlcnMgd2hlbiBjYWxsaW5nCiAgICAgUEVNX3JlYWRfYmlvX0RIcGFyYW1ldGVycy4gVGhpcyBtZWFucyBleGlzdGluZyBhcHBsaWNhdGlvbnMgY2FuIGhhbmRsZQogICAgIHRoZSBuZXcgcGFyYW1ldGVyIGZvcm1hdCBhdXRvbWF0aWNhbGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIFg5LjQyIERIIHBhcmFtZXRlciBmb3JtYXQ6IG1haW5seQogICAgIHRvIHN1cHBvcnQgdXNlIG9mICdxJyBwYXJhbWV0ZXIgZm9yIFJGQzUxMTQgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgREggcGFyYW1ldGVycyBmcm9tIFJGQzUxMTQgaW5jbHVkaW5nIHRlc3QgZGF0YSB0byBkaHRlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgYXV0b21hdGljIEVDIHRlbXBvcmFyeSBrZXkgcGFyYW1ldGVyIHNlbGVjdGlvbi4gSWYgZW5hYmxlZAogICAgIHRoZSBtb3N0IHByZWZlcnJlZCBFQyBwYXJhbWV0ZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHVzZWQgaW5zdGVhZCBvZgogICAgIGhhcmRjb2RlZCBmaXhlZCBwYXJhbWV0ZXJzLiBOb3cgYSBzZXJ2ZXIganVzdCBoYXMgdG8gY2FsbDoKICAgICBTU0xfQ1RYX3NldF9lY2RoX2F1dG8oY3R4LCAxKSBhbmQgdGhlIHNlcnZlciB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICBzdXBwb3J0IEVDREggYW5kIHVzZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgYW5kIHRpZHkgRUMgY3VydmUgYW5kIHBvaW50IGZvcm1hdCBUTFMgZXh0ZW5zaW9uIGNvZGUuIFVzZQogICAgIHN0YXRpYyBzdHJ1Y3R1cmVzIGluc3RlYWQgb2YgYWxsb2NhdGlvbiBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZC4KICAgICBOZXcgY3RybHMgdG8gc2V0IGN1cnZlcyB3ZSB3aXNoIHRvIHN1cHBvcnQgYW5kIHRvIHJldHJpZXZlIHNoYXJlZCBjdXJ2ZXMuCiAgICAgUHJpbnQgb3V0IHNoYXJlZCBjdXJ2ZXMgaW4gc19zZXJ2ZXIuIE5ldyBvcHRpb25zIHRvIHNfc2VydmVyIGFuZCBzX2NsaWVudAogICAgIHRvIHNldCBsaXN0IG9mIHN1cHBvcnRlZCBjdXJ2ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGN0cmxzIHRvIHJldHJpZXZlIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyBhbmQgCiAgICAgc3VwcG9ydGVkIGN1cnZlIHZhbHVlcyBhcyBhbiBhcnJheSBvZiBOSURzLiBFeHRlbmQgb3BlbnNzbCB1dGlsaXR5CiAgICAgdG8gcHJpbnQgb3V0IHJlY2VpdmVkIHZhbHVlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEFQSXMgRUNfY3VydmVfbmlzdDJuaWQgYW5kIEVDX2N1cnZlX25pZDJuaXN0IHdoaWNoIGNvbnZlcnQKICAgICBiZXR3ZWVuIE5JRHMgYW5kIHRoZSBtb3JlIGNvbW1vbiBOSVNUIG5hbWVzIHN1Y2ggYXMgIlAtMjU2Ii4gRW5oYW5jZQogICAgIGVjcGFyYW0gdXRpbGl0eSBhbmQgRUNDIG1ldGhvZCB0byByZWNvZ25pc2UgdGhlIE5JU1QgbmFtZXMgZm9yIGN1cnZlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFNTTC9UTFMgY2VydGlmaWNhdGUgY2hhaW4gaGFuZGxpbmcgdG8gc3VwcG9ydCBkaWZmZXJlbnQKICAgICBjaGFpbnMgZm9yIGVhY2ggY2VydGlmaWNhdGUgaW5zdGVhZCBvZiBvbmUgY2hhaW4gaW4gdGhlIHBhcmVudCBTU0xfQ1RYLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGZpeGVkIERIIGNpcGhlcnN1aXRlIGNsaWVudCBhdXRoZW50aWNhdGlvbjogd2hlcmUgYm90aAogICAgIHNlcnZlciBhbmQgY2xpZW50IHVzZSBESCBjZXJ0aWZpY2F0ZXMgd2l0aCBjb21tb24gcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBmaXhlZCBESCBjaXBoZXJzdWl0ZXM6IHRob3NlIHJlcXVpcmluZyBESCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGkyZF9yZV9YNTA5X3RicyBmb3IgcmUtZW5jb2RpbmcgdGhlIFRCUyBwb3J0aW9uIG9mCiAgICAgdGhlIGNlcnRpZmljYXRlLgogICAgIE5vdGU6IFJlbGF0ZWQgMS4wLjItYmV0YSBzcGVjaWZpYyBtYWNyb3MgWDUwOV9nZXRfY2VydF9pbmZvLAogICAgIFg1MDlfQ0lORl9zZXRfbW9kaWZpZWQsIFg1MDlfQ0lORl9nZXRfaXNzdWVyLCBYNTA5X0NJTkZfZ2V0X2V4dGVuc2lvbnMgYW5kCiAgICAgWDUwOV9DSU5GX2dldF9zaWduYXR1cmUgd2VyZSByZXZlcnRlZCBwb3N0IGludGVybmFsIHRlYW0gcmV2aWV3LgoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWogYW5kIDEuMC4xayBbeHggWFhYIHh4eHhdCgogICAqKSBEbyBub3QgcmVzdW1lIHNlc3Npb25zIG9uIHRoZSBzZXJ2ZXIgaWYgdGhlIG5lZ290aWF0ZWQgcHJvdG9jb2wKICAgICAgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgc2Vzc2lvbidzIHZlcnNpb24uIFJlc3VtaW5nIHdpdGggYSBkaWZmZXJlbnQKICAgICAgdmVyc2lvbiwgd2hpbGUgbm90IHN0cmljdGx5IGZvcmJpZGRlbiBieSB0aGUgUkZDLCBpcyBvZiBxdWVzdGlvbmFibGUKICAgICAgc2FuaXR5IGFuZCBicmVha3MgYWxsIGtub3duIGNsaWVudHMuCiAgICAgIFtEYXZpZCBCZW5qYW1pbiwgRW1pbGlhIEvkc3Blcl0KCiAgICopIFRpZ2h0ZW4gaGFuZGxpbmcgb2YgdGhlIENoYW5nZUNpcGhlclNwZWMgKENDUykgbWVzc2FnZTogcmVqZWN0CiAgICAgIGVhcmx5IENDUyBtZXNzYWdlcyBkdXJpbmcgcmVuZWdvdGlhdGlvbi4gKE5vdGUgdGhhdCBiZWNhdXNlCiAgICAgIHJlbmVnb3RpYXRpb24gaXMgZW5jcnlwdGVkLCB0aGlzIGVhcmx5IENDUyB3YXMgbm90IGV4cGxvaXRhYmxlLikKICAgICAgW0VtaWxpYSBL5HNwZXJdCgogICAqKSBUaWdodGVuIGNsaWVudC1zaWRlIHNlc3Npb24gdGlja2V0IGhhbmRsaW5nIGR1cmluZyByZW5lZ290aWF0aW9uOgogICAgICBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IG9ubHkgYWNjZXB0cyBhIHNlc3Npb24gdGlja2V0IGlmIHRoZSBzZXJ2ZXIgc2VuZHMKICAgICAgdGhlIGV4dGVuc2lvbiBhbmV3IGluIHRoZSBTZXJ2ZXJIZWxsby4gUHJldmlvdXNseSwgYSBUTFMgY2xpZW50IHdvdWxkCiAgICAgIHJldXNlIHRoZSBvbGQgZXh0ZW5zaW9uIHN0YXRlIGFuZCB0aHVzIGFjY2VwdCBhIHNlc3Npb24gdGlja2V0IGlmIG9uZSB3YXMKICAgICAgYW5ub3VuY2VkIGluIHRoZSBpbml0aWFsIFNlcnZlckhlbGxvLgoKICAgICAgU2ltaWxhcmx5LCBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIGEgc2Vzc2lvbiB0aWNrZXQgaWYgb25lCiAgICAgIHdhcyBhZHZlcnRpc2VkIGluIHRoZSBTZXJ2ZXJIZWxsby4gUHJldmlvdXNseSwgYSBUTFMgY2xpZW50IHdvdWxkCiAgICAgIGlnbm9yZSBhIG1pc3NpbmcgTmV3U2Vzc2lvblRpY2tldCBtZXNzYWdlLgogICAgICBbRW1pbGlhIEvkc3Blcl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFpIGFuZCAxLjAuMWogWzE1IE9jdCAyMDE0XQoKICAqKSBTUlRQIE1lbW9yeSBMZWFrLgoKICAgICBBIGZsYXcgaW4gdGhlIERUTFMgU1JUUCBleHRlbnNpb24gcGFyc2luZyBjb2RlIGFsbG93cyBhbiBhdHRhY2tlciwgd2hvCiAgICAgc2VuZHMgYSBjYXJlZnVsbHkgY3JhZnRlZCBoYW5kc2hha2UgbWVzc2FnZSwgdG8gY2F1c2UgT3BlblNTTCB0byBmYWlsCiAgICAgdG8gZnJlZSB1cCB0byA2NGsgb2YgbWVtb3J5IGNhdXNpbmcgYSBtZW1vcnkgbGVhay4gVGhpcyBjb3VsZCBiZQogICAgIGV4cGxvaXRlZCBpbiBhIERlbmlhbCBPZiBTZXJ2aWNlIGF0dGFjay4gVGhpcyBpc3N1ZSBhZmZlY3RzIE9wZW5TU0wKICAgICAxLjAuMSBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBib3RoIFNTTC9UTFMgYW5kIERUTFMgcmVnYXJkbGVzcyBvZgogICAgIHdoZXRoZXIgU1JUUCBpcyB1c2VkIG9yIGNvbmZpZ3VyZWQuIEltcGxlbWVudGF0aW9ucyBvZiBPcGVuU1NMIHRoYXQKICAgICBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBPUEVOU1NMX05PX1NSVFAgZGVmaW5lZCBhcmUgbm90IGFmZmVjdGVkLgoKICAgICBUaGUgZml4IHdhcyBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgdGVhbS4KICAgICAoQ1ZFLTIwMTQtMzUxMykKICAgICBbT3BlblNTTCB0ZWFtXQoKICAqKSBTZXNzaW9uIFRpY2tldCBNZW1vcnkgTGVhay4KCiAgICAgV2hlbiBhbiBPcGVuU1NMIFNTTC9UTFMvRFRMUyBzZXJ2ZXIgcmVjZWl2ZXMgYSBzZXNzaW9uIHRpY2tldCB0aGUKICAgICBpbnRlZ3JpdHkgb2YgdGhhdCB0aWNrZXQgaXMgZmlyc3QgdmVyaWZpZWQuIEluIHRoZSBldmVudCBvZiBhIHNlc3Npb24KICAgICB0aWNrZXQgaW50ZWdyaXR5IGNoZWNrIGZhaWxpbmcsIE9wZW5TU0wgd2lsbCBmYWlsIHRvIGZyZWUgbWVtb3J5CiAgICAgY2F1c2luZyBhIG1lbW9yeSBsZWFrLiBCeSBzZW5kaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIGludmFsaWQgc2Vzc2lvbgogICAgIHRpY2tldHMgYW4gYXR0YWNrZXIgY291bGQgZXhwbG9pdCB0aGlzIGlzc3VlIGluIGEgRGVuaWFsIE9mIFNlcnZpY2UKICAgICBhdHRhY2suCiAgICAgKENWRS0yMDE0LTM1NjcpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVpbGQgb3B0aW9uIG5vLXNzbDMgaXMgaW5jb21wbGV0ZS4KCiAgICAgV2hlbiBPcGVuU1NMIGlzIGNvbmZpZ3VyZWQgd2l0aCAibm8tc3NsMyIgYXMgYSBidWlsZCBvcHRpb24sIHNlcnZlcnMKICAgICBjb3VsZCBhY2NlcHQgYW5kIGNvbXBsZXRlIGEgU1NMIDMuMCBoYW5kc2hha2UsIGFuZCBjbGllbnRzIGNvdWxkIGJlCiAgICAgY29uZmlndXJlZCB0byBzZW5kIHRoZW0uCiAgICAgKENWRS0yMDE0LTM1NjgpCiAgICAgW0FrYW1haSBhbmQgdGhlIE9wZW5TU0wgdGVhbV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMU19GQUxMQkFDS19TQ1NWLgogICAgIENsaWVudCBhcHBsaWNhdGlvbnMgZG9pbmcgZmFsbGJhY2sgcmV0cmllcyBzaG91bGQgY2FsbAogICAgIFNTTF9zZXRfbW9kZShzLCBTU0xfTU9ERV9TRU5EX0ZBTExCQUNLX1NDU1YpLgogICAgIChDVkUtMjAxNC0zNTY2KQogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFkZGl0aW9uYWwgRGlnZXN0SW5mbyBjaGVja3MuCiAKICAgICBSZWVuY29kZSBEaWdlc3RJbnRvIGluIERFUiBhbmQgY2hlY2sgYWdhaW5zdCB0aGUgb3JpZ2luYWwgd2hlbgogICAgIHZlcmlmeWluZyBSU0Egc2lnbmF0dXJlOiB0aGlzIHdpbGwgcmVqZWN0IGFueSBpbXByb3Blcmx5IGVuY29kZWQKICAgICBEaWdlc3RJbmZvIHN0cnVjdHVyZXMuCgogICAgIE5vdGU6IHRoaXMgaXMgYSBwcmVjYXV0aW9uYXJ5IG1lYXN1cmUgYW5kIG5vIGF0dGFja3MgYXJlIGN1cnJlbnRseSBrbm93bi4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFoIGFuZCAxLjAuMWkgWzYgQXVnIDIwMTRdCgogICopIEZpeCBTUlAgYnVmZmVyIG92ZXJydW4gdnVsbmVyYWJpbGl0eS4gSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKICAgICBTUlAgY29kZSBjYW4gYmUgb3ZlcnJ1biBhbiBpbnRlcm5hbCBidWZmZXIuIEFkZCBzYW5pdHkgY2hlY2sgdGhhdAogICAgIGcsIEEsIEIgPCBOIHRvIFNSUCBjb2RlLgoKICAgICBUaGFua3MgdG8gU2VhbiBEZXZsaW4gYW5kIFdhdHNvbiBMYWRkIG9mIENyeXB0b2dyYXBoeSBTZXJ2aWNlcywgTkNDCiAgICAgR3JvdXAgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MTIpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBmbGF3IGluIHRoZSBPcGVuU1NMIFNTTC9UTFMgc2VydmVyIGNvZGUgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gbmVnb3RpYXRlCiAgICAgVExTIDEuMCBpbnN0ZWFkIG9mIGhpZ2hlciBwcm90b2NvbCB2ZXJzaW9ucyB3aGVuIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlCiAgICAgaXMgYmFkbHkgZnJhZ21lbnRlZC4gVGhpcyBhbGxvd3MgYSBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tlciB0byBmb3JjZSBhCiAgICAgZG93bmdyYWRlIHRvIFRMUyAxLjAgZXZlbiBpZiBib3RoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgc3VwcG9ydCBhCiAgICAgaGlnaGVyIHByb3RvY29sIHZlcnNpb24sIGJ5IG1vZGlmeWluZyB0aGUgY2xpZW50J3MgVExTIHJlY29yZHMuCgogICAgIFRoYW5rcyB0byBEYXZpZCBCZW5qYW1pbiBhbmQgQWRhbSBMYW5nbGV5IChHb29nbGUpIGZvciBkaXNjb3ZlcmluZyBhbmQKICAgICByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTExKQogICAgIFtEYXZpZCBCZW5qYW1pbl0KCiAgKikgT3BlblNTTCBEVExTIGNsaWVudHMgZW5hYmxpbmcgYW5vbnltb3VzIChFQylESCBjaXBoZXJzdWl0ZXMgYXJlIHN1YmplY3QKICAgICB0byBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4gQSBtYWxpY2lvdXMgc2VydmVyIGNhbiBjcmFzaCB0aGUgY2xpZW50CiAgICAgd2l0aCBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSAocmVhZCkgYnkgc3BlY2lmeWluZyBhbiBhbm9ueW1vdXMgKEVDKURICiAgICAgY2lwaGVyc3VpdGUgYW5kIHNlbmRpbmcgY2FyZWZ1bGx5IGNyYWZ0ZWQgaGFuZHNoYWtlIG1lc3NhZ2VzLgoKICAgICBUaGFua3MgdG8gRmVsaXggR3L2YmVydCAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMKICAgICBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUxMCkKICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgKikgQnkgc2VuZGluZyBjYXJlZnVsbHkgY3JhZnRlZCBEVExTIHBhY2tldHMgYW4gYXR0YWNrZXIgY291bGQgY2F1c2Ugb3BlbnNzbAogICAgIHRvIGxlYWsgbWVtb3J5LiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwNykKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBBbiBhdHRhY2tlciBjYW4gZm9yY2Ugb3BlbnNzbCB0byBjb25zdW1lIGxhcmdlIGFtb3VudHMgb2YgbWVtb3J5IHdoaWxzdAogICAgIHByb2Nlc3NpbmcgRFRMUyBoYW5kc2hha2UgbWVzc2FnZXMuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEKICAgICBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIEFkYW0gTGFuZ2xleSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDYpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgQW4gYXR0YWNrZXIgY2FuIGZvcmNlIGFuIGVycm9yIGNvbmRpdGlvbiB3aGljaCBjYXVzZXMgb3BlbnNzbCB0byBjcmFzaAogICAgIHdoaWxzdCBwcm9jZXNzaW5nIERUTFMgcGFja2V0cyBkdWUgdG8gbWVtb3J5IGJlaW5nIGZyZWVkIHR3aWNlLiBUaGlzCiAgICAgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyB0byBBZGFtIExhbmdsZXkgYW5kIFdhbi1UZWggQ2hhbmcgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZwogICAgIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDUpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgSWYgYSBtdWx0aXRocmVhZGVkIGNsaWVudCBjb25uZWN0cyB0byBhIG1hbGljaW91cyBzZXJ2ZXIgdXNpbmcgYSByZXN1bWVkCiAgICAgc2Vzc2lvbiBhbmQgdGhlIHNlcnZlciBzZW5kcyBhbiBlYyBwb2ludCBmb3JtYXQgZXh0ZW5zaW9uIGl0IGNvdWxkIHdyaXRlCiAgICAgdXAgdG8gMjU1IGJ5dGVzIHRvIGZyZWVkIG1lbW9yeS4KCiAgICAgVGhhbmtzIHRvIEdhYm9yIFR5dWthc3ogKExvZ01lSW4gSW5jKSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMKICAgICBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwOSkKICAgICBbR2Fib3IgVHl1a2Fzel0KCiAgKikgQSBtYWxpY2lvdXMgc2VydmVyIGNhbiBjcmFzaCBhbiBPcGVuU1NMIGNsaWVudCB3aXRoIGEgbnVsbCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UgKHJlYWQpIGJ5IHNwZWNpZnlpbmcgYW4gU1JQIGNpcGhlcnN1aXRlIGV2ZW4gdGhvdWdoIGl0IHdhcyBub3QKICAgICBwcm9wZXJseSBuZWdvdGlhdGVkIHdpdGggdGhlIGNsaWVudC4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYQogICAgIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEpvb25hcyBLdW9yaWxlaHRvIGFuZCBSaWt1IEhpZXRhbeRraSAoQ29kZW5vbWljb24pIGZvcgogICAgIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC01MTM5KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgZmxhdyBpbiBPQkpfb2JqMnR4dCBtYXkgY2F1c2UgcHJldHR5IHByaW50aW5nIGZ1bmN0aW9ucyBzdWNoIGFzCiAgICAgWDUwOV9uYW1lX29uZWxpbmUsIFg1MDlfbmFtZV9wcmludF9leCBldCBhbC4gdG8gbGVhayBzb21lIGluZm9ybWF0aW9uCiAgICAgZnJvbSB0aGUgc3RhY2suIEFwcGxpY2F0aW9ucyBtYXkgYmUgYWZmZWN0ZWQgaWYgdGhleSBlY2hvIHByZXR0eSBwcmludGluZwogICAgIG91dHB1dCB0byB0aGUgYXR0YWNrZXIuCgogICAgIFRoYW5rcyB0byBJdmFuIEZyYXRyaWMgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDgpCiAgICAgW0VtaWxpYSBL5HNwZXIsIGFuZCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSAodGh1cywgRUNfUE9JTlRzX211bCBldGMuKQogICAgIGZvciBjb3JuZXIgY2FzZXMuIChDZXJ0YWluIGlucHV0IHBvaW50cyBhdCBpbmZpbml0eSBjb3VsZCBsZWFkIHRvCiAgICAgYm9ndXMgcmVzdWx0cywgd2l0aCBub24taW5maW5pdHkgaW5wdXRzIG1hcHBlZCB0byBpbmZpbml0eSB0b28uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZyBhbmQgMS4wLjFoIFs1IEp1biAyMDE0XQoKICAqKSBGaXggZm9yIFNTTC9UTFMgTUlUTSBmbGF3LiBBbiBhdHRhY2tlciB1c2luZyBhIGNhcmVmdWxseSBjcmFmdGVkCiAgICAgaGFuZHNoYWtlIGNhbiBmb3JjZSB0aGUgdXNlIG9mIHdlYWsga2V5aW5nIG1hdGVyaWFsIGluIE9wZW5TU0wKICAgICBTU0wvVExTIGNsaWVudHMgYW5kIHNlcnZlcnMuCgogICAgIFRoYW5rcyB0byBLSUtVQ0hJIE1hc2FzaGkgKExlcGlkdW0gQ28uIEx0ZC4pIGZvciBkaXNjb3ZlcmluZyBhbmQKICAgICByZXNlYXJjaGluZyB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMDIyNCkKICAgICBbS0lLVUNISSBNYXNhc2hpLCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBEVExTIHJlY3Vyc2lvbiBmbGF3LiBCeSBzZW5kaW5nIGFuIGludmFsaWQgRFRMUyBoYW5kc2hha2UgdG8gYW4KICAgICBPcGVuU1NMIERUTFMgY2xpZW50IHRoZSBjb2RlIGNhbiBiZSBtYWRlIHRvIHJlY3Vyc2UgZXZlbnR1YWxseSBjcmFzaGluZwogICAgIGluIGEgRG9TIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEltcmUgUmFkIChTZWFyY2gtTGFiIEx0ZC4pIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0wMjIxKQogICAgIFtJbXJlIFJhZCwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggRFRMUyBpbnZhbGlkIGZyYWdtZW50IHZ1bG5lcmFiaWxpdHkuIEEgYnVmZmVyIG92ZXJydW4gYXR0YWNrIGNhbgogICAgIGJlIHRyaWdnZXJlZCBieSBzZW5kaW5nIGludmFsaWQgRFRMUyBmcmFnbWVudHMgdG8gYW4gT3BlblNTTCBEVExTCiAgICAgY2xpZW50IG9yIHNlcnZlci4gVGhpcyBpcyBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSB0byBydW4gYXJiaXRyYXJ5CiAgICAgY29kZSBvbiBhIHZ1bG5lcmFibGUgY2xpZW50IG9yIHNlcnZlci4KCiAgICAgVGhhbmtzIHRvIEr8cmkgQWVkbGEgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMDE5NSkKICAgICBbSvxyaSBBZWRsYSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFRMUyBjb2RlIHdoZXJlIGNsaWVudHMgZW5hYmxlIGFub255bW91cyBFQ0RIIGNpcGhlcnN1aXRlcwogICAgIGFyZSBzdWJqZWN0IHRvIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gRmVsaXggR3L2YmVydCBhbmQgSXZhbiBGcmF0cmljIGF0IEdvb2dsZSBmb3IgZGlzY292ZXJpbmcKICAgICB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMzQ3MCkKICAgICBbRmVsaXggR3L2YmVydCwgSXZhbiBGcmF0cmljLCBTdGV2ZSBIZW5zb25dCgogICopIEhhcm1vbml6ZSB2ZXJzaW9uIGFuZCBpdHMgZG9jdW1lbnRhdGlvbi4gLWYgZmxhZyBpcyB1c2VkIHRvIGRpc3BsYXkKICAgICBjb21waWxhdGlvbiBmbGFncy4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IGVja2V5X3ByaXZfZW5jb2RlIHNvIGl0IGltbWVkaWF0ZWx5IHJldHVybnMgYW4gZXJyb3IgdXBvbiBhIGZhaWx1cmUKICAgICBpbiBpMmRfRUNQcml2YXRlS2V5LgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggc29tZSBkb3VibGUgZnJlZXMuIFRoZXNlIGFyZSBub3QgdGhvdWdodCB0byBiZSBleHBsb2l0YWJsZS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFmIGFuZCAxLjAuMWcgWzcgQXByIDIwMTRdCgogICopIEEgbWlzc2luZyBib3VuZHMgY2hlY2sgaW4gdGhlIGhhbmRsaW5nIG9mIHRoZSBUTFMgaGVhcnRiZWF0IGV4dGVuc2lvbgogICAgIGNhbiBiZSB1c2VkIHRvIHJldmVhbCB1cCB0byA2NGsgb2YgbWVtb3J5IHRvIGEgY29ubmVjdGVkIGNsaWVudCBvcgogICAgIHNlcnZlci4KCiAgICAgVGhhbmtzIGZvciBOZWVsIE1laHRhIG9mIEdvb2dsZSBTZWN1cml0eSBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kIHRvCiAgICAgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBhbmQgQm9kbyBNb2VsbGVyIDxibW9lbGxlckBhY20ub3JnPiBmb3IKICAgICBwcmVwYXJpbmcgdGhlIGZpeCAoQ1ZFLTIwMTQtMDE2MCkKICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgdGhlIGF0dGFjayBkZXNjcmliZWQgaW4gdGhlIHBhcGVyICJSZWNvdmVyaW5nIE9wZW5TU0wKICAgICBFQ0RTQSBOb25jZXMgVXNpbmcgdGhlIEZMVVNIK1JFTE9BRCBDYWNoZSBTaWRlLWNoYW5uZWwgQXR0YWNrIgogICAgIGJ5IFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIuIERldGFpbHMgY2FuIGJlIG9idGFpbmVkIGZyb206CiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDE0LzE0MAoKICAgICBUaGFua3MgdG8gWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlciBmb3IgZGlzY292ZXJpbmcgdGhpcwogICAgIGZsYXcgYW5kIHRvIFl1dmFsIFlhcm9tIGZvciBzdXBwbHlpbmcgYSBmaXggKENWRS0yMDE0LTAwNzYpCiAgICAgW1l1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXJdCgogICopIFRMUyBwYWQgZXh0ZW5zaW9uOiBkcmFmdC1hZ2wtdGxzLXBhZGRpbmctMDMKCiAgICAgV29ya2Fyb3VuZCBmb3IgdGhlICJUTFMgaGFuZyBidWciIChzZWUgRkFRIGFuZCBQUiMyNzcxKTogaWYgdGhlCiAgICAgVExTIGNsaWVudCBIZWxsbyByZWNvcmQgbGVuZ3RoIHZhbHVlIHdvdWxkIG90aGVyd2lzZSBiZSA+IDI1NSBhbmQKICAgICBsZXNzIHRoYXQgNTEyIHBhZCB3aXRoIGEgZHVtbXkgZXh0ZW5zaW9uIGNvbnRhaW5pbmcgemVyb2VzIHNvIGl0CiAgICAgaXMgYXQgbGVhc3QgNTEyIGJ5dGVzIGxvbmcuCgogICAgIFtBZGFtIExhbmdsZXksIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFlIGFuZCAxLjAuMWYgWzYgSmFuIDIwMTRdCgogICopIEZpeCBmb3IgVExTIHJlY29yZCB0YW1wZXJpbmcgYnVnLiBBIGNhcmVmdWxseSBjcmFmdGVkIGludmFsaWQgCiAgICAgaGFuZHNoYWtlIGNvdWxkIGNyYXNoIE9wZW5TU0wgd2l0aCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24uCiAgICAgVGhhbmtzIHRvIEFudG9uIEpvaGFuc3NvbiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWVzLgogICAgIChDVkUtMjAxMy00MzUzKQoKICAqKSBLZWVwIG9yaWdpbmFsIERUTFMgZGlnZXN0IGFuZCBlbmNyeXB0aW9uIGNvbnRleHRzIGluIHJldHJhbnNtaXNzaW9uCiAgICAgc3RydWN0dXJlcyBzbyB3ZSBjYW4gdXNlIHRoZSBwcmV2aW91cyBzZXNzaW9uIHBhcmFtZXRlcnMgaWYgdGhleSBuZWVkCiAgICAgdG8gYmUgcmVzZW50LiAoQ1ZFLTIwMTMtNjQ1MCkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9uIFNTTF9PUF9TQUZBUklfRUNESEVfRUNEU0FfQlVHIChwYXJ0IG9mIFNTTF9PUF9BTEwpIHdoaWNoCiAgICAgYXZvaWRzIHByZWZlcnJpbmcgRUNESEUtRUNEU0EgY2lwaGVycyB3aGVuIHRoZSBjbGllbnQgYXBwZWFycyB0byBiZQogICAgIFNhZmFyaSBvbiBPUyBYLiAgU2FmYXJpIG9uIE9TIFggMTAuOC4uMTAuOC4zIGFkdmVydGlzZXMgc3VwcG9ydCBmb3IKICAgICBzZXZlcmFsIEVDREhFLUVDRFNBIGNpcGhlcnMsIGJ1dCBmYWlscyB0byBuZWdvdGlhdGUgdGhlbS4gIFRoZSBidWcKICAgICBpcyBmaXhlZCBpbiBPUyBYIDEwLjguNCwgYnV0IEFwcGxlIGhhdmUgcnVsZWQgb3V0IGJvdGggaG90IGZpeGluZwogICAgIDEwLjguLjEwLjguMyBhbmQgZm9yY2luZyB1c2VycyB0byB1cGdyYWRlIHRvIDEwLjguNCBvciBuZXdlci4KICAgICBbUm9iIFN0cmFkbGluZywgQWRhbSBMYW5nbGV5XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWQgYW5kIDEuMC4xZSBbMTEgRmViIDIwMTNdCgogICopIENvcnJlY3QgZml4IGZvciBDVkUtMjAxMy0wMTY5LiBUaGUgb3JpZ2luYWwgZGlkbid0IHdvcmsgb24gQUVTLU5JCiAgICAgc3VwcG9ydGluZyBwbGF0Zm9ybXMgb3Igd2hlbiBzbWFsbCByZWNvcmRzIHdlcmUgdHJhbnNmZXJyZWQuCiAgICAgW0FuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFjIGFuZCAxLjAuMWQgWzUgRmViIDIwMTNdCgogICopIE1ha2UgdGhlIGRlY29kaW5nIG9mIFNTTHYzLCBUTFMgYW5kIERUTFMgQ0JDIHJlY29yZHMgY29uc3RhbnQgdGltZS4KCiAgICAgVGhpcyBhZGRyZXNzZXMgdGhlIGZsYXcgaW4gQ0JDIHJlY29yZCBwcm9jZXNzaW5nIGRpc2NvdmVyZWQgYnkgCiAgICAgTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbi4gRGV0YWlscyBvZiB0aGlzIGF0dGFjayBjYW4gYmUgZm91bmQKICAgICBhdDogaHR0cDovL3d3dy5pc2cucmh1bC5hYy51ay90bHMvICAgICAKCiAgICAgVGhhbmtzIGdvIHRvIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gb2YgdGhlIEluZm9ybWF0aW9uCiAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgKHd3dy5pc2cucmh1bC5hYy51aykgZm9yIGRpc2NvdmVyaW5nIHRoaXMgZmxhdyBhbmQgQWRhbSBMYW5nbGV5IGFuZAogICAgIEVtaWxpYSBL5HNwZXIgZm9yIHRoZSBpbml0aWFsIHBhdGNoLgogICAgIChDVkUtMjAxMy0wMTY5KQogICAgIFtFbWlsaWEgS+RzcGVyLCBBZGFtIExhbmdsZXksIEJlbiBMYXVyaWUsIEFuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZsYXcgaW4gQUVTTkkgaGFuZGxpbmcgb2YgVExTIDEuMiBhbmQgMS4xIHJlY29yZHMgZm9yIENCQyBtb2RlCiAgICAgY2lwaGVyc3VpdGVzIHdoaWNoIGNhbiBiZSBleHBsb2l0ZWQgaW4gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIGdvIHRvIGFuZCB0byBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGZvciBkaXNjb3ZlcmluZwogICAgIGFuZCBkZXRlY3RpbmcgdGhpcyBidWcgYW5kIHRvIFdvbGZnYW5nIEV0dGxpbmdlcgogICAgIDx3b2xmZ2FuZy5ldHRsaW5nZXJAZ21haWwuY29tPiBmb3IgaW5kZXBlbmRlbnRseSBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxMi0yNjg2KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIFJldHVybiBhbiBlcnJvciB3aGVuIGNoZWNraW5nIE9DU1Agc2lnbmF0dXJlcyB3aGVuIGtleSBpcyBOVUxMLgogICAgIFRoaXMgZml4ZXMgYSBEb1MgYXR0YWNrLiAoQ1ZFLTIwMTMtMDE2NikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG9wZW5zc2wgdmVyaWZ5IHJldHVybiBlcnJvcnMuCiAgICAgW0NocmlzIFBhbG1lciA8cGFsbWVyQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBDYWxsIE9DU1AgU3RhcGxpbmcgY2FsbGJhY2sgYWZ0ZXIgY2lwaGVyc3VpdGUgaGFzIGJlZW4gY2hvc2VuLCBzbwogICAgIHRoZSByaWdodCByZXNwb25zZSBpcyBzdGFwbGVkLiBBbHNvIGNoYW5nZSBTU0xfZ2V0X2NlcnRpZmljYXRlKCkKICAgICBzbyBpdCByZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBhY3R1YWxseSBzZW50LgogICAgIFNlZSBodHRwOi8vcnQub3BlbnNzbC5vcmcvVGlja2V0L0Rpc3BsYXkuaHRtbD9pZD0yODM2LgogICAgIFtSb2IgU3RyYWRsaW5nIDxyb2Iuc3RyYWRsaW5nQGNvbW9kby5jb20+XQoKICAqKSBGaXggcG9zc2libGUgZGVhZGxvY2sgd2hlbiBkZWNvZGluZyBwdWJsaWMga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCB1c2UgVExTIDEuMCByZWNvcmQgdmVyc2lvbiBudW1iZXIgaW4gaW5pdGlhbCBjbGllbnQgaGVsbG8KICAgICBpZiByZW5lZ290aWF0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYiBhbmQgMS4wLjFjIFsxMCBNYXkgMjAxMl0KCiAgKikgU2FuaXR5IGNoZWNrIHJlY29yZCBsZW5ndGggYmVmb3JlIHNraXBwaW5nIGV4cGxpY2l0IElWIGluIFRMUwogICAgIDEuMiwgMS4xIGFuZCBEVExTIHRvIGZpeCBEb1MgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gQ29kZW5vbWljb24gZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUgdXNpbmcgRnV6ei1vLU1hdGljCiAgICAgZnV6emluZyBhcyBhIHNlcnZpY2UgdGVzdGluZyBwbGF0Zm9ybS4KICAgICAoQ1ZFLTIwMTItMjMzMykKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsaXNlIHRrZXlsZW4gcHJvcGVybHkgd2hlbiBlbmNyeXB0aW5nIENNUyBtZXNzYWdlcy4KICAgICBUaGFua3MgdG8gU29sYXIgRGVzaWduZXIgb2YgT3BlbndhbGwgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIEZJUFMgbW9kZSBkb24ndCB0cnkgdG8gdXNlIGNvbXBvc2l0ZSBjaXBoZXJzIGFzIHRoZXkgYXJlIG5vdAogICAgIGFwcHJvdmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYSBhbmQgMS4wLjFiIFsyNiBBcHIgMjAxMl0KCiAgKikgT3BlblNTTCAxLjAuMCBzZXRzIFNTTF9PUF9BTEwgdG8gMHg4MDAwMEZGRkwgYW5kIE9wZW5TU0wgMS4wLjEgYW5kCiAgICAgMS4wLjFhIHNldCBTU0xfT1BfTk9fVExTdjFfMSB0byAweDAwMDAwNDAwTCB3aGljaCB3b3VsZCB1bmZvcnR1bmF0ZWx5CiAgICAgbWVhbiBhbnkgYXBwbGljYXRpb24gY29tcGlsZWQgYWdhaW5zdCBPcGVuU1NMIDEuMC4wIGhlYWRlcnMgc2V0dGluZwogICAgIFNTTF9PUF9BTEwgd291bGQgYWxzbyBzZXQgU1NMX09QX05PX1RMU3YxXzEsIHVuaW50ZW50aW9uYWxseSBkaXNhYmxuZwogICAgIFRMUyAxLjEgYWxzby4gRml4IHRoaXMgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFNTTF9PUF9OT19UTFN2MV8xIHRvCiAgICAgMHgxMDAwMDAwMEwgQW55IGFwcGxpY2F0aW9uIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNvbXBpbGVkIGFnYWluc3QKICAgICBPcGVuU1NMIDEuMC4xIG9yIDEuMC4xYSBoZWFkZXJzIGFuZCB3aGljaCBjYXJlcyBhYm91dCBTU0xfT1BfTk9fVExTdjFfMQogICAgIHdpbGwgbmVlZCB0byBiZSByZWNvbXBpbGVkIGFzIGEgcmVzdWx0LiBMZXR0aW5nIGJlIHJlc3VsdHMgaW4KICAgICBpbmFiaWxpdHkgdG8gZGlzYWJsZSBzcGVjaWZpY2FsbHkgVExTIDEuMSBhbmQgaW4gY2xpZW50IGNvbnRleHQsCiAgICAgaW4gdW5saWtlIGV2ZW50LCBsaW1pdCBtYXhpbXVtIG9mZmVyZWQgdmVyc2lvbiB0byBUTFMgMS4wIFtzZWUgYmVsb3ddLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIG9yZGVyIHRvIGVuc3VyZSBpbnRlcm9wZXJhYmlsdHkgU1NMX09QX05PX3Byb3RvY29sWCBkb2VzIG5vdAogICAgIGRpc2FibGUganVzdCBwcm90b2NvbCBYLCBidXQgYWxsIHByb3RvY29scyBhYm92ZSBYICppZiogdGhlcmUgYXJlCiAgICAgcHJvdG9jb2xzICpiZWxvdyogWCBzdGlsbCBlbmFibGVkLiBJbiBtb3JlIHByYWN0aWNhbCB0ZXJtcyBpdCBtZWFucwogICAgIHRoYXQgaWYgYXBwbGljYXRpb24gd2FudHMgdG8gZGlzYWJsZSBUTFMxLjAgaW4gZmF2b3Igb2YgVExTMS4xIGFuZAogICAgIGFib3ZlLCBpdCdzIG5vdCBzdWZmaWNpZW50IHRvIHBhc3MgU1NMX09QX05PX1RMU3YxLCBvbmUgaGFzIHRvIHBhc3MKICAgICBTU0xfT1BfTk9fVExTdjF8U1NMX09QX05PX1NTTHYzfFNTTF9PUF9OT19TU0x2Mi4gVGhpcyBhcHBsaWVzIHRvCiAgICAgY2xpZW50IHNpZGUuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xIGFuZCAxLjAuMWEgWzE5IEFwciAyMDEyXQoKICAqKSBDaGVjayBmb3IgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgb3ZlcmZsb3dzIGluIGFzbjFfZDJpX3JlYWRfYmlvCiAgICAgQlVGX21lbV9ncm93IGFuZCBCVUZfbWVtX2dyb3dfY2xlYW4uIFJlZnVzZSBhdHRlbXB0cyB0byBzaHJpbmsgYnVmZmVyCiAgICAgaW4gQ1JZUFRPX3JlYWxsb2NfY2xlYW4uCgogICAgIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbSwgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBpc3N1ZSBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZml4aW5nIGl0LgogICAgIChDVkUtMjAxMi0yMTEwKQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSksIFRhdmlzIE9ybWFuZHksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBEb24ndCBhbGxvdyBUTFMgMS4yIFNIQS0yNTYgY2lwaGVyc3VpdGVzIGluIFRMUyAxLjAsIDEuMSBjb25uZWN0aW9ucy4KICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBXb3JrYXJvdW5kcyBmb3Igc29tZSBicm9rZW4gc2VydmVycyB0aGF0ICJoYW5nIiBpZiBhIGNsaWVudCBoZWxsbwogICAgIHJlY29yZCBsZW5ndGggZXhjZWVkcyAyNTUgYnl0ZXMuCgogICAgIDEuIERvIG5vdCB1c2UgcmVjb3JkIHZlcnNpb24gbnVtYmVyID4gVExTIDEuMCBpbiBpbml0aWFsIGNsaWVudAogICAgICAgIGhlbGxvOiBzb21lIChidXQgbm90IGFsbCkgaGFuZ2luZyBzZXJ2ZXJzIHdpbGwgbm93IHdvcmsuCiAgICAgMi4gSWYgd2Ugc2V0IE9QRU5TU0xfTUFYX1RMUzFfMl9DSVBIRVJfTEVOR1RIIHRoaXMgd2lsbCB0cnVuY2F0ZQoJdGhlIG51bWJlciBvZiBjaXBoZXJzIHNlbnQgaW4gdGhlIGNsaWVudCBoZWxsby4gVGhpcyBzaG91bGQgYmUKICAgICAgICBzZXQgdG8gYW4gZXZlbiBudW1iZXIsIHN1Y2ggYXMgNTAsIGZvciBleGFtcGxlIGJ5IHBhc3Npbmc6CiAgICAgICAgLURPUEVOU1NMX01BWF9UTFMxXzJfQ0lQSEVSX0xFTkdUSD01MCB0byBjb25maWcgb3IgQ29uZmlndXJlLgogICAgICAgIE1vc3QgYnJva2VuIHNlcnZlcnMgc2hvdWxkIG5vdyB3b3JrLgogICAgIDMuIElmIGFsbCBlbHNlIGZhaWxzIHNldHRpbmcgT1BFTlNTTF9OT19UTFMxXzJfQ0xJRU5UIHdpbGwgZGlzYWJsZQoJVExTIDEuMiBjbGllbnQgc3VwcG9ydCBlbnRpcmVseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggU0VHViBpbiBWZWN0b3IgUGVybXV0YXRpb24gQUVTIG1vZHVsZSBvYnNlcnZlZCBpbiBPcGVuU1NILgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGggYW5kIDEuMC4xICBbMTQgTWFyIDIwMTJdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIE1EQzIgc2lnbmF0dXJlcyB3aGljaCB1c2UgYW4gQVNOMSBPQ1RFVAogICAgIFNUUklORyBmb3JtIGluc3RlYWQgb2YgYSBEaWdlc3RJbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmb3JtYXQgdXNlZCBmb3IgTURDMiBSU0Egc2lnbmF0dXJlcyBpcyBpbmNvbnNpc3RlbnQgYmV0d2VlbiBFVlAKICAgICBhbmQgdGhlIFJTQV9zaWduL1JTQV92ZXJpZnkgZnVuY3Rpb25zLiBUaGlzIHdhcyBtYWRlIG1vcmUgYXBwYXJlbnQgd2hlbgogICAgIE9wZW5TU0wgdXNlZCBSU0Ffc2lnbi9SU0FfdmVyaWZ5IGZvciBzb21lIFJTQSBzaWduYXR1cmVzIGluIHBhcnRpY3VsYXIKICAgICB0aG9zZSB3aGljaCB3ZW50IHRocm91Z2ggRVZQX1BLRVlfTUVUSE9EIGluIDEuMC4wIGFuZCBsYXRlci4gRGV0ZWN0IAogICAgIHRoZSBjb3JyZWN0IGZvcm1hdCBpbiBSU0FfdmVyaWZ5IHNvIGJvdGggZm9ybXMgdHJhbnNwYXJlbnRseSB3b3JrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgc2VydmVycyB3aGljaCBzdXBwb3J0IFRMUyAxLjAgY2FuIGNob2tlIGlmIHdlIGluaXRpYWxseSBpbmRpY2F0ZQogICAgIHN1cHBvcnQgZm9yIFRMUyAxLjIgYW5kIGxhdGVyIHJlbmVnb3RpYXRlIHVzaW5nIFRMUyAxLjAgaW4gdGhlIFJTQQogICAgIGVuY3J5cHRlZCBwcmVtYXN0ZXIgc2VjcmV0LiBBcyBhIHdvcmthcm91bmQgdXNlIHRoZSBtYXhpbXVtIHBlcm1pdHRlZAogICAgIGNsaWVudCB2ZXJzaW9uIGluIGNsaWVudCBoZWxsbywgdGhpcyBzaG91bGQga2VlcCBzdWNoIHNlcnZlcnMgaGFwcHkKICAgICBhbmQgc3RpbGwgd29yayB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMUy9EVExTIGhlYXJ0YmVhdHMuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU0NUUC4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEltcHJvdmVkIFBSTkcgc2VlZGluZyBmb3IgVk9TLgogICAgIFtQYXVsIEdyZWVuIDxQYXVsLkdyZWVuQHN0cmF0dXMuY29tPl0KCiAgKikgRXh0ZW5zaXZlIGFzc2VtYmxlciBwYWNrcyB1cGRhdGVzLCBtb3N0IG5vdGFibHk6CgoJLSB4ODZbXzY0XTogICAgIEFFUy1OSSwgUENMTVVMUURRLCBSRFJBTkQgc3VwcG9ydDsKCS0geDg2W182NF06ICAgICBTU1NFMyBzdXBwb3J0IChTSEExLCB2ZWN0b3ItcGVybXV0YXRpb24gQUVTKTsKCS0geDg2XzY0OiAgICAgICBiaXQtc2xpY2VkIEFFUyBpbXBsZW1lbnRhdGlvbjsKCS0gQVJNOiAgICAgICAgICBORU9OIHN1cHBvcnQsIGNvbnRlbXBvcmFyeSBwbGF0Zm9ybXMgb3B0aW1pemF0aW9uczsKCS0gczM5MHg6ICAgICAgICB6MTk2IHN1cHBvcnQ7CgktICo6ICAgICAgICAgICAgR0hBU0ggYW5kIEdGKDJebSkgbXVsdGlwbGljYXRpb24gaW1wbGVtZW50YXRpb25zOwoKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTWFrZSBUTFMtU1JQIGNvZGUgY29uZm9ybWFudCB3aXRoIFJGQyA1MDU0IEFQSSBjbGVhbnVwCiAgICAgKHJlbW92YWwgb2YgdW5uZWNlc3NhcnkgY29kZSkKICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxwZXRlci5zeWx2ZXN0ZXJAZWRlbHdlYi5mcj5dCgogICopIEFkZCBUTFMga2V5IG1hdGVyaWFsIGV4cG9ydGVyIGZyb20gUkZDIDU3MDUuCiAgICAgW0VyaWMgUmVzY29ybGFdCgogICopIEFkZCBEVExTLVNSVFAgbmVnb3RpYXRpb24gZnJvbSBSRkMgNTc2NC4KICAgICBbRXJpYyBSZXNjb3JsYV0KCiAgKikgQWRkIE5leHQgUHJvdG9jb2wgTmVnb3RpYXRpb24sCiAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWdsLXRscy1uZXh0cHJvdG9uZWctMDAuIENhbiBiZQogICAgIGRpc2FibGVkIHdpdGggYSBuby1ucG4gZmxhZyB0byBjb25maWcgb3IgQ29uZmlndXJlLiBDb2RlIGRvbmF0ZWQKICAgICBieSBHb29nbGUuCiAgICAgW0FkYW0gTGFuZ2xleSA8YWdsQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgb3B0aW9uYWwgNjQtYml0IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgZWxsaXB0aWMgY3VydmVzIE5JU1QtUDIyNCwKICAgICBOSVNULVAyNTYsIE5JU1QtUDUyMSwgd2l0aCBjb25zdGFudC10aW1lIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiBvbgogICAgIHR5cGljYWwgaW5wdXRzLiBDb21waWxlciBzdXBwb3J0IGZvciB0aGUgbm9uc3RhbmRhcmQgdHlwZSBfX3VpbnQxMjhfdCBpcwogICAgIHJlcXVpcmVkIHRvIHVzZSB0aGlzIChwcmVzZW50IGluIGdjYyA0LjQgYW5kIGxhdGVyLCBmb3IgNjQtYml0IGJ1aWxkcykuCiAgICAgQ29kZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSB2ZXJzaW9uIDIuMC4KCiAgICAgU3BlY2lmeSAiZW5hYmxlLWVjX25pc3RwXzY0X2djY18xMjgiIG9uIHRoZSBDb25maWd1cmUgKG9yIGNvbmZpZykgY29tbWFuZAogICAgIGxpbmUgdG8gaW5jbHVkZSB0aGlzIGluIHlvdXIgYnVpbGQgb2YgT3BlblNTTCwgYW5kIHJ1biAibWFrZSBkZXBlbmQiIChvcgogICAgICJtYWtlIHVwZGF0ZSIpLiBUaGlzIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBFQ19NRVRIT0RzOgoKICAgICAgICAgRUNfR0ZwX25pc3RwMjI0X21ldGhvZCgpCiAgICAgICAgIEVDX0dGcF9uaXN0cDI1Nl9tZXRob2QoKQogICAgICAgICBFQ19HRnBfbmlzdHA1MjFfbWV0aG9kKCkKCiAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZXNlICh3aGlsZQogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSBjdXJyZW50bHkgcHJlZmVycyB0aGUgbW9yZSBmbGV4aWJsZQogICAgIGltcGxlbWVudGF0aW9ucykuCiAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBVc2UgdHlwZSBvc3NsX3NzaXplX3QgaW5zdGFkIG9mIHNzaXplX3Qgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIG9uCiAgICAgYWxsIHBsYXRmb3Jtcy4gTW92ZSBzc2l6ZV90IGRlZmluaXRpb24gZnJvbSBlX29zLmggdG8gdGhlIHB1YmxpYwogICAgIGhlYWRlciBmaWxlIGVfb3MyLmggYXMgaXQgbm93IGFwcGVhcnMgaW4gcHVibGljIGhlYWRlciBmaWxlIGNtcy5oCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1zaWdvcHQgb3B0aW9uIHRvIHRoZSBjYSwgcmVxIGFuZCB4NTA5IHV0aWxpdGllcy4gQWRkaXRpb25hbAogICAgIHNpZ25hdHVyZSBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgdXNpbmcgdGhpcyBvcHRpb24gYW5kIGluCiAgICAgcGFydGljdWxhciBQU1MuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBSU0EgUFNTIHNpZ25pbmcgZnVuY3Rpb24uIFRoaXMgd2lsbCBnZW5lcmF0ZSBhbmQgc2V0IHRoZQogICAgIGFwcHJvcHJpYXRlIEFsZ29yaXRobUlkZW50aWZpZXJzIGZvciBQU1MgYmFzZWQgb24gdGhvc2UgaW4gdGhlCiAgICAgY29ycmVzcG9uZGluZyBFVlBfTURfQ1RYIHN0cnVjdHVyZS4gTm8gYXBwbGljYXRpb24gc3VwcG9ydCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgY29tcGFuaW9uIGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHNpZ25pbmcgcm91dGluZXMuCiAgICAgTmV3IGZ1bmN0aW9uIEFTTjFfaXRlbV9zaWduX2N0eCgpIHNpZ25zIGEgcHJlLWluaXRpYWxpc2VkCiAgICAgRVZQX01EX0NUWCBzdHJ1Y3R1cmUgYW5kIHNldHMgQWxnb3JpdGhtSWRlbnRpZmllcnMgYmFzZWQgb24KICAgICB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHZlcmlmaWNhdGlvbiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbgogICAgIHRvIEVWUF9QS0VZX0FTTjFfTUVUSE9EOiB0aGlzIGlzIG5vdCBpbiBFVlBfUEtFWV9NRVRIT0Qgc2luY2UgdGhlIEFTTjEKICAgICBoYW5kbGluZyB3aWxsIGJlIHRoZSBzYW1lIG5vIG1hdHRlciB3aGF0IEVWUF9QS0VZX01FVEhPRCBpcyB1c2VkLgogICAgIEFkZCBhIFBTUyBoYW5kbGVyIHRvIHN1cHBvcnQgdmVyaWZpY2F0aW9uIG9mIFBTUyBzaWduYXR1cmVzOiBjaGVja2VkCiAgICAgYWdhaW5zdCBhIG51bWJlciBvZiBzYW1wbGUgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzaWduYXR1cmUgcHJpbnRpbmcgZm9yIFBTUy4gQWRkIFBTUyBPSURzLgogICAgIFtTdGV2ZSBIZW5zb24sIE1hcnRpbiBLYWlzZXIgPGxpc3RzQGthaXNlci5jeD5dCgogICopIEFkZCBhbGdvcml0aG0gc3BlY2lmaWMgc2lnbmF0dXJlIHByaW50aW5nLiBBbiBpbmRpdmlkdWFsIEFTTjEgbWV0aG9kCiAgICAgY2FuIG5vdyBwcmludCBvdXQgc2lnbmF0dXJlcyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBoZXggZHVtcC4gCgogICAgIE1vcmUgY29tcGxleCBzaWduYXR1cmVzIChlLmcuIFBTUykgY2FuIHByaW50IG91dCBtb3JlIG1lYW5pbmdmdWwKICAgICBpbmZvcm1hdGlvbi4gSW5jbHVkZSBEU0EgdmVyc2lvbiB0aGF0IHByaW50cyBvdXQgdGhlIHNpZ25hdHVyZQogICAgIHBhcmFtZXRlcnMgciwgcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQYXNzd29yZCBiYXNlZCByZWNpcGllbnQgaW5mbyBzdXBwb3J0IGZvciBDTVMgbGlicmFyeTogaW1wbGVtZW50aW5nCiAgICAgUkZDMzIxMS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTcGxpdCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGludG8gUEJFUzIgYW5kIFBCS0RGMiBmdW5jdGlvbnMuIFRoaXMKICAgICBuZWF0bHkgc2VwYXJhdGVzIHRoZSBjb2RlIGludG8gY2lwaGVyIGFuZCBQQkUgc2VjdGlvbnMgYW5kIGlzIHJlcXVpcmVkCiAgICAgZm9yIHNvbWUgYWxnb3JpdGhtcyB0aGF0IHNwbGl0IFBCRVMyIGludG8gc2VwYXJhdGUgcGllY2VzIChzdWNoIGFzCiAgICAgcGFzc3dvcmQgYmFzZWQgQ01TKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXNzaW9uLWhhbmRsaW5nIGZpeGVzOgogICAgIC0gRml4IGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHJlc3VtaW5nIHdpdGggYSBzZXNzaW9uIElELAogICAgICAgYnV0IGFsc28gc3VwcG9ydCBTZXNzaW9uIFRpY2tldHMuCiAgICAgLSBGaXggYSBidWcgdGhhdCBzdXBwcmVzc2VkIGlzc3Vpbmcgb2YgYSBuZXcgdGlja2V0IGlmIHRoZSBjbGllbnQKICAgICAgIHByZXNlbnRlZCBhIHRpY2tldCB3aXRoIGFuIGV4cGlyZWQgc2Vzc2lvbi4KICAgICAtIFRyeSB0byBzZXQgdGhlIHRpY2tldCBsaWZldGltZSBoaW50IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLgogICAgIC0gTWFrZSB0aWNrZXRzIHNob3J0ZXIgYnkgZXhjbHVkaW5nIGlycmVsZXZhbnQgaW5mb3JtYXRpb24uCiAgICAgLSBPbiB0aGUgY2xpZW50IHNpZGUsIGRvbid0IGlnbm9yZSByZW5ld2VkIHRpY2tldHMuCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBGaXggUFNLIHNlc3Npb24gcmVwcmVzZW50YXRpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJDNC1NRDUgYW5kIEFFU05JLVNIQTEgInN0aXRjaGVkIiBpbXBsZW1lbnRhdGlvbnMuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEludGVsLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgR0NNIHN1cHBvcnQgdG8gVExTIGxpYnJhcnkuIFNvbWUgY3VzdG9tIGNvZGUgaXMgbmVlZGVkIHRvIHNwbGl0CiAgICAgdGhlIElWIGJldHdlZW4gdGhlIGZpeGVkIChmcm9tIFBSRikgYW5kIGV4cGxpY2l0IChmcm9tIFRMUyByZWNvcmQpCiAgICAgcG9ydGlvbnMuIFRoaXMgYWRkcyBhbGwgR0NNIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQgYnkgUkZDNTI4OCBhbmQgCiAgICAgUkZDNTI4OS4gR2VuZXJhbGlzZSBzb21lIEFFUyogY2lwaGVyc3RyaW5ncyB0byBpbmNsdWRlIEdDTSBhbmQKICAgICBhZGQgYSBzcGVjaWFsIEFFU0dDTSBzdHJpbmcgZm9yIEdDTSBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGFuZCByYW5nZSBvZiBjdHJscyBmb3IgQUVTIEdDTS4gUGVybWl0IHNldHRpbmcgaW52b2NhdGlvbgogICAgIGZpZWxkIG9uIGRlY3J5cHQgYW5kIHJldHJpZXZhbCBvZiBpbnZvY2F0aW9uIGZpZWxkIG9ubHkgb24gZW5jcnlwdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgSE1BQyBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gUkZDNTI4OS4gSW5jbHVkZSBTSEEzODQgUFJGIHN1cHBvcnQuCiAgICAgQXMgcmVxdWlyZWQgYnkgUkZDNTI4OSB0aGVzZSBjaXBoZXJzdWl0ZXMgY2Fubm90IGJlIHVzZWQgaWYgZm9yCiAgICAgdmVyc2lvbnMgb2YgVExTIGVhcmxpZXIgdGhhbiAxLjIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIEZJUFMgY2FwYWJsZSBPcGVuU1NMIGludGVycHJldCBhIE5VTEwgZGVmYXVsdCBwdWJsaWMga2V5IG1ldGhvZAogICAgIGFzIHVuc2V0IGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgYnV0IGRvICpub3QqIHNldCB0aGUgZGVmYXVsdC4KICAgICBUaGlzIG1lYW5zIHdlIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBpbiBhcHBsaWNhdGlvbnMgdGhhdAogICAgIHN3aXRjaCBiZXR3ZWVuIEZJUFMgYW5kIG5vbi1GSVBTIG1vZGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IEhNQUMgYW5kIENNQUMgb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbiBGSVBTIG1vZGUuIElmIGFuCiAgICAgRU5HSU5FIGlzIHVzZWQgdGhlbiB3ZSBjYW5ub3QgaGFuZGxlIHRoYXQgaW4gdGhlIEZJUFMgbW9kdWxlIHNvIHdlCiAgICAga2VlcCBvcmlnaW5hbCBjb2RlIGlmZiBub24tRklQUyBvcGVyYXRpb25zIGFyZSBhbGxvd2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtYXR0aW1lIG9wdGlvbiB0byBvcGVuc3NsIHV0aWxpdGllcy4KICAgICBbUGV0ZXIgRWNrZXJzbGV5IDxwZGVAZWZmLm9yZz4sIEJlbiBMYXVyaWUgYW5kIFN0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgRFNBIGFuZCBESCBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBFQ0RTQSBhbmQgRUNESCBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4gQWxzbyB1c2UKICAgICBGSVBTIEVDIG1ldGhvZHMgdW5jb25kaXRpb25hbGx5IGZvciBub3cuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGJ1aWxkIG9wdGlvbiBuby1lYzJtIHRvIGRpc2FibGUgY2hhcmFjdGVyaXN0aWMgMiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJhY2twb3J0IGxpYmNyeXB0byBhdWRpdCBvZiByZXR1cm4gdmFsdWUgY2hlY2tpbmcgZnJvbSAxLjEuMC1kZXY7IG5vdAogICAgIGFsbCBjYXNlcyBjYW4gYmUgY292ZXJlZCBhcyBzb21lIGludHJvZHVjZSBiaW5hcnkgaW5jb21wYXRpYmlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgUlNBIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW5jbHVkaW5nIGtleWdlbiwKICAgICBlbmNyeXB0LCBkZWNyeXB0LCBzaWduIGFuZCB2ZXJpZnkuIEJsb2NrIHVzZSBvZiBub24gRklQUyBSU0EgbWV0aG9kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2ltaWxhciBsb3cgbGV2ZWwgQVBJIGJsb2NraW5nIHRvIGNpcGhlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTG93IGxldmVsIGRpZ2VzdCBBUElzIGFyZSBub3QgYXBwcm92ZWQgaW4gRklQUyBtb2RlOiBhbnkgYXR0ZW1wdAogICAgIHRvIHVzZSB0aGVzZSB3aWxsIGNhdXNlIGEgZmF0YWwgZXJyb3IuIEFwcGxpY2F0aW9ucyB0aGF0ICpyZWFsbHkqIHdhbnQKICAgICB0byB1c2UgdGhlbSBjYW4gdXNlIHRoZSBwcml2YXRlXyogdmVyc2lvbiBpbnN0ZWFkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IGNpcGhlciBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGZvciBGSVBTIGJ1aWxkcy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgZGlnZXN0IG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgZm9yIEZJUFMgYnVpbGRzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgYnVpbGQgc3lzdGVtIHRvIGFkZCAiZmlwcyIgZmxhZyB3aGljaCB3aWxsIGxpbmsgaW4gZmlwc2NhbmlzdGVyLm8KICAgICBmb3Igc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyeSBidWlsZHMgZW1iZWRkaW5nIGEgc2lnbmF0dXJlIGlmIG5lZWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPdXRwdXQgVExTIHN1cHBvcnRlZCBjdXJ2ZXMgaW4gcHJlZmVyZW5jZSBvcmRlciBpbnN0ZWFkIG9mIG51bWVyaWNhbAogICAgIG9yZGVyLiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgZm9yIHRoZSBoaWdoZXN0IG9yZGVyIGN1cnZlcyBmaXJzdC4KICAgICBUaGlzIHNob3VsZCBiZSBjb25maWd1cmFibGUgc28gYXBwbGljYXRpb25zIGNhbiBqdWRnZSBzcGVlZCB2cyBzdHJlbmd0aC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgVExTIHYxLjIgc2VydmVyIHN1cHBvcnQgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbi4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZJUFMgbW9kZSBpbiBzc2wgbGlicmFyeTogZGlzYWJsZSBTU0x2Mywgbm9uLUZJUFMgY2lwaGVycwogICAgIGFuZCBlbmFibGUgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBGSVBTX21vZGVfc2V0KCkgYW5kIEZJUFNfbW9kZSgpIHdoaWNoIGNhbGwgdGhlIHVuZGVybHlpbmcKICAgICBGSVBTIG1vZHVsZXMgdmVyc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFRMUyB2MS4yIGNsaWVudCBzaWRlIHN1cHBvcnQgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbi4gS2VlcCBjYWNoZQogICAgIG9mIGhhbmRzaGFrZSByZWNvcmRzIGxvbmdlciBhcyB3ZSBkb24ndCBrbm93IHRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UKICAgICB1bnRpbCBhZnRlciB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgVExTIHYxLjIgY2xpZW50IHN1cHBvcnQuIEFkZCBhIGRlZmF1bHQgc2lnbmF0dXJlIGFsZ29yaXRobXMKICAgICBleHRlbnNpb24gaW5jbHVkaW5nIGFsbCB0aGUgYWxnb3JpdGhtcyB3ZSBzdXBwb3J0LiBQYXJzZSBuZXcgc2lnbmF0dXJlCiAgICAgZm9ybWF0IGluIGNsaWVudCBrZXkgZXhjaGFuZ2UuIFJlbGF4IHNvbWUgRUNDIHNpZ25pbmcgcmVzdHJpY3Rpb25zIGZvcgogICAgIFRMUyB2MS4yIGFzIGluZGljYXRlZCBpbiBSRkM1MjQ2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgVExTIHYxLjIgc2lnbmF0dXJlIGFsZ29yaXRobXMgZXh0ZW5zaW9uLiBTd2l0Y2gKICAgICB0byBuZXcgc2lnbmF0dXJlIGZvcm1hdCB3aGVuIG5lZWRlZCB1c2luZyBjbGllbnQgZGlnZXN0IHByZWZlcmVuY2UuCiAgICAgQWxsIHNlcnZlciBjaXBoZXJzdWl0ZXMgc2hvdWxkIG5vdyB3b3JrIGNvcnJlY3RseSBpbiBUTFMgdjEuMi4gTm8gY2xpZW50CiAgICAgc3VwcG9ydCB5ZXQgYW5kIG5vIHN1cHBvcnQgZm9yIGNsaWVudCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBUTFMgdjEuMiBzdXBwb3J0LiBBZGQgbmV3IFNIQTI1NiBkaWdlc3QgdG8gc3NsIGNvZGUsIHN3aXRjaAogICAgIHRvIFNIQTI1NiBmb3IgUFJGIHdoZW4gdXNpbmcgVExTIHYxLjIgYW5kIGxhdGVyLiBBZGQgbmV3IFNIQTI1NiBiYXNlZAogICAgIGNpcGhlcnN1aXRlcy4gQXQgcHJlc2VudCBvbmx5IFJTQSBrZXkgZXhjaGFuZ2UgY2lwaGVyc3VpdGVzIHdvcmsgd2l0aAogICAgIFRMUyB2MS4yLiBBZGQgbmV3IG9wdGlvbiBmb3IgVExTIHYxLjIgcmVwbGFjaW5nIHRoZSBvbGQgYW5kIG9ic29sZXRlCiAgICAgU1NMX09QX1BLQ1MxX0NIRUNLIGZsYWdzIHdpdGggU1NMX09QX05PX1RMU3YxXzIuIE5ldyBUTFN2MS4yIG1ldGhvZHMKICAgICBhbmQgdmVyc2lvbiBjaGVja2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIE9QRU5TU0xfTk9fU1NMX0lOVEVSTi4gSWYgYW4gYXBwbGljYXRpb24gY2FuIGJlIGNvbXBpbGVkCiAgICAgd2l0aCB0aGlzIGRlZmluZWQgaXQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgdG8gc3NsIGludGVybmFsCiAgICAgc3RydWN0dXJlcy4gQWRkIHNldmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMgdG8gYWxsb3cgb3BlbnNzbCBhcHBsaWNhdGlvbgogICAgIHRvIHdvcmsgd2l0aCBPUEVOU1NMX05PX1NTTF9JTlRFUk4gZGVmaW5lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgU1JQIHN1cHBvcnQuCiAgICAgW1RvbSBXdSA8dGp3QGNzLnN0YW5mb3JkLmVkdT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBmdW5jdGlvbnMgdG8gY29weSBFVlBfUEtFWV9NRVRIT0QgYW5kIHJldHJpZXZlIGZsYWdzIGFuZCBpZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJtaXQgYWJicmV2aWF0ZWQgaGFuZHNoYWtlcyB3aGVuIHJlbmVnb3RpYXRpbmcgdXNpbmcgdGhlIGZ1bmN0aW9uCiAgICAgU1NMX3JlbmVnb3RpYXRlX2FiYnJldmlhdGVkKCkuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgY2FsbCB0byBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NvbXBsZXRlKCkgdG8KICAgICBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSwgc28gc29tZSBpbXBsZW1lbnRhdGlvbnMgZ2V0IHVzZWQKICAgICBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2YgbmVlZGluZyBleHBsaWNpdCBhcHBsaWNhdGlvbiBzdXBwb3J0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBUTFMga2V5IGV4cG9ydGVyIGFzIGRlc2NyaWJlZCBpbiBSRkM1NzA1LgogICAgIFtSb2JpbiBTZWdnZWxtYW5uIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIFRMU3YxLjEgc3VwcG9ydC4gU2luY2UgVExTdjEuMSBpcyB2ZXJ5IHNpbWlsYXIgdG8gVExTIHYxLjAgb25seQogICAgIGEgZmV3IGNoYW5nZXMgYXJlIHJlcXVpcmVkOgoKICAgICAgIEFkZCBTU0xfT1BfTk9fVExTdjFfMSBmbGFnLgogICAgICAgQWRkIFRMU3YxXzEgbWV0aG9kcy4KICAgICAgIFVwZGF0ZSB2ZXJzaW9uIGNoZWNraW5nIGxvZ2ljIHRvIGhhbmRsZSB2ZXJzaW9uIDEuMS4KICAgICAgIEFkZCBleHBsaWNpdCBJViBoYW5kbGluZyAocG9ydGVkIGZyb20gRFRMUyBjb2RlKS4KICAgICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBzX2NsaWVudC9zX3NlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGogYW5kIDEuMC4wayBbNSBGZWIgMjAxM10KCiAgKikgTWFrZSB0aGUgZGVjb2Rpbmcgb2YgU1NMdjMsIFRMUyBhbmQgRFRMUyBDQkMgcmVjb3JkcyBjb25zdGFudCB0aW1lLgoKICAgICBUaGlzIGFkZHJlc3NlcyB0aGUgZmxhdyBpbiBDQkMgcmVjb3JkIHByb2Nlc3NpbmcgZGlzY292ZXJlZCBieSAKICAgICBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uLiBEZXRhaWxzIG9mIHRoaXMgYXR0YWNrIGNhbiBiZSBmb3VuZAogICAgIGF0OiBodHRwOi8vd3d3LmlzZy5yaHVsLmFjLnVrL3Rscy8gICAgIAoKICAgICBUaGFua3MgZ28gdG8gTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBvZiB0aGUgSW5mb3JtYXRpb24KICAgICBTZWN1cml0eSBHcm91cCBhdCBSb3lhbCBIb2xsb3dheSwgVW5pdmVyc2l0eSBvZiBMb25kb24KICAgICAod3d3LmlzZy5yaHVsLmFjLnVrKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBmbGF3IGFuZCBBZGFtIExhbmdsZXkgYW5kCiAgICAgRW1pbGlhIEvkc3BlciBmb3IgdGhlIGluaXRpYWwgcGF0Y2guCiAgICAgKENWRS0yMDEzLTAxNjkpCiAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQmVuIExhdXJpZSwgQW5keSBQb2x5YWtvdiwgU3RldmUgSGVuc29uXQoKICAqKSBSZXR1cm4gYW4gZXJyb3Igd2hlbiBjaGVja2luZyBPQ1NQIHNpZ25hdHVyZXMgd2hlbiBrZXkgaXMgTlVMTC4KICAgICBUaGlzIGZpeGVzIGEgRG9TIGF0dGFjay4gKENWRS0yMDEzLTAxNjYpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2FsbCBPQ1NQIFN0YXBsaW5nIGNhbGxiYWNrIGFmdGVyIGNpcGhlcnN1aXRlIGhhcyBiZWVuIGNob3Nlbiwgc28KICAgICB0aGUgcmlnaHQgcmVzcG9uc2UgaXMgc3RhcGxlZC4gQWxzbyBjaGFuZ2UgU1NMX2dldF9jZXJ0aWZpY2F0ZSgpCiAgICAgc28gaXQgcmV0dXJucyB0aGUgY2VydGlmaWNhdGUgYWN0dWFsbHkgc2VudC4KICAgICBTZWUgaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9MjgzNi4KICAgICAoVGhpcyBpcyBhIGJhY2twb3J0KQogICAgIFtSb2IgU3RyYWRsaW5nIDxyb2Iuc3RyYWRsaW5nQGNvbW9kby5jb20+XQoKICAqKSBGaXggcG9zc2libGUgZGVhZGxvY2sgd2hlbiBkZWNvZGluZyBwdWJsaWMga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGkgYW5kIDEuMC4waiBbMTAgTWF5IDIwMTJdCgogIFtOQjogT3BlblNTTCAxLjAuMGkgYW5kIGxhdGVyIDEuMC4wIHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAxLjAuMS5dCgogICopIFNhbml0eSBjaGVjayByZWNvcmQgbGVuZ3RoIGJlZm9yZSBza2lwcGluZyBleHBsaWNpdCBJViBpbiBEVExTCiAgICAgdG8gZml4IERvUyBhdHRhY2suCgogICAgIFRoYW5rcyB0byBDb2Rlbm9taWNvbiBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZSB1c2luZyBGdXp6LW8tTWF0aWMKICAgICBmdXp6aW5nIGFzIGEgc2VydmljZSB0ZXN0aW5nIHBsYXRmb3JtLgogICAgIChDVkUtMjAxMi0yMzMzKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWxpc2UgdGtleWxlbiBwcm9wZXJseSB3aGVuIGVuY3J5cHRpbmcgQ01TIG1lc3NhZ2VzLgogICAgIFRoYW5rcyB0byBTb2xhciBEZXNpZ25lciBvZiBPcGVud2FsbCBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBoIGFuZCAxLjAuMGkgWzE5IEFwciAyMDEyXQoKICAqKSBDaGVjayBmb3IgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgb3ZlcmZsb3dzIGluIGFzbjFfZDJpX3JlYWRfYmlvCiAgICAgQlVGX21lbV9ncm93IGFuZCBCVUZfbWVtX2dyb3dfY2xlYW4uIFJlZnVzZSBhdHRlbXB0cyB0byBzaHJpbmsgYnVmZmVyCiAgICAgaW4gQ1JZUFRPX3JlYWxsb2NfY2xlYW4uCgogICAgIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbSwgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBpc3N1ZSBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZml4aW5nIGl0LgogICAgIChDVkUtMjAxMi0yMTEwKQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSksIFRhdmlzIE9ybWFuZHksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGcgYW5kIDEuMC4waCBbMTIgTWFyIDIwMTJdCgogICopIEZpeCBNTUEgKEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBSU0EgcGFkZGluZykgd2Vha25lc3MKICAgICBpbiBDTVMgYW5kIFBLQ1M3IGNvZGUuIFdoZW4gUlNBIGRlY3J5cHRpb24gZmFpbHMgdXNlIGEgcmFuZG9tIGtleSBmb3IKICAgICBjb250ZW50IGRlY3J5cHRpb24gYW5kIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgZXJyb3IuIE5vdGU6IHRoaXMgYXR0YWNrCiAgICAgbmVlZHMgb24gYXZlcmFnZSAyXjIwIG1lc3NhZ2VzIHNvIGl0IG9ubHkgYWZmZWN0cyBhdXRvbWF0ZWQgc2VuZGVycy4gVGhlCiAgICAgb2xkIGJlaGF2aW91ciBjYW4gYmUgcmVlbmFibGVkIGluIHRoZSBDTVMgY29kZSBieSBzZXR0aW5nIHRoZQogICAgIENNU19ERUJVR19ERUNSWVBUIGZsYWc6IHRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgd2hlcmUKICAgICBhbiBNTUEgZGVmZW5jZSBpcyBub3QgbmVjZXNzYXJ5LgogICAgIFRoYW5rcyB0byBJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+IGZvciBkaXNjb3ZlcmluZwogICAgIHRoaXMgaXNzdWUuIChDVkUtMjAxMi0wODg0KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBDVkUtMjAxMS00NjE5OiBtYWtlIHN1cmUgd2UgcmVhbGx5IGFyZSByZWNlaXZpbmcgYSAKICAgICBjbGllbnQgaGVsbG8gYmVmb3JlIHJlamVjdGluZyBtdWx0aXBsZSBTR0MgcmVzdGFydHMuIFRoYW5rcyB0bwogICAgIEl2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZiBhbmQgMS4wLjBnIFsxOCBKYW4gMjAxMl0KCiAgKikgRml4IGZvciBEVExTIERvUyBpc3N1ZSBpbnRyb2R1Y2VkIGJ5IGZpeCBmb3IgQ1ZFLTIwMTEtNDEwOS4KICAgICBUaGFua3MgdG8gQW50b25pbyBNYXJ0aW4sIEVudGVycHJpc2UgU2VjdXJlIEFjY2VzcyBSZXNlYXJjaCBhbmQKICAgICBEZXZlbG9wbWVudCwgQ2lzY28gU3lzdGVtcywgSW5jLiBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kCiAgICAgcHJlcGFyaW5nIGEgZml4LiAoQ1ZFLTIwMTItMDA1MCkKICAgICBbQW50b25pbyBNYXJ0aW5dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZSBhbmQgMS4wLjBmIFs0IEphbiAyMDEyXQoKICAqKSBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIGhhdmUgZGlzY292ZXJlZCBhbiBleHRlbnNpb24KICAgICBvZiB0aGUgVmF1ZGVuYXkgcGFkZGluZyBvcmFjbGUgYXR0YWNrIG9uIENCQyBtb2RlIGVuY3J5cHRpb24KICAgICB3aGljaCBlbmFibGVzIGFuIGVmZmljaWVudCBwbGFpbnRleHQgcmVjb3ZlcnkgYXR0YWNrIGFnYWluc3QKICAgICB0aGUgT3BlblNTTCBpbXBsZW1lbnRhdGlvbiBvZiBEVExTLiBUaGVpciBhdHRhY2sgZXhwbG9pdHMgdGltaW5nCiAgICAgZGlmZmVyZW5jZXMgYXJpc2luZyBkdXJpbmcgZGVjcnlwdGlvbiBwcm9jZXNzaW5nLiBBIHJlc2VhcmNoCiAgICAgcGFwZXIgZGVzY3JpYmluZyB0aGlzIGF0dGFjayBjYW4gYmUgZm91bmQgYXQ6CiAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvfmtwL2R0bHMucGRmCiAgICAgVGhhbmtzIGdvIHRvIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gb2YgdGhlIEluZm9ybWF0aW9uCiAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgKHd3dy5pc2cucmh1bC5hYy51aykgZm9yIGRpc2NvdmVyaW5nIHRoaXMgZmxhdyBhbmQgdG8gUm9iaW4gU2VnZ2VsbWFubgogICAgIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPiBhbmQgTWljaGFlbCBUdWV4ZW4gPHR1ZXhlbkBmaC1tdWVuc3Rlci5kZT4KICAgICBmb3IgcHJlcGFyaW5nIHRoZSBmaXguIChDVkUtMjAxMS00MTA4KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBNaWNoYWVsIFR1ZXhlbl0KCiAgKikgQ2xlYXIgYnl0ZXMgdXNlZCBmb3IgYmxvY2sgcGFkZGluZyBvZiBTU0wgMy4wIHJlY29yZHMuCiAgICAgKENWRS0yMDExLTQ1NzYpCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgT25seSBhbGxvdyBvbmUgU0dDIGhhbmRzaGFrZSByZXN0YXJ0IGZvciBTU0wvVExTLiBUaGFua3MgdG8gR2VvcmdlCiAgICAgS2FkaWFuYWtpcyA8ZGVzbmFja2VkQGdtYWlsLmNvbT4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUgYW5kCiAgICAgQWRhbSBMYW5nbGV5IGZvciBwcmVwYXJpbmcgdGhlIGZpeC4gKENWRS0yMDExLTQ2MTkpCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgQ2hlY2sgcGFyYW1ldGVycyBhcmUgbm90IE5VTEwgaW4gR09TVCBFTkdJTkUuIChDVkUtMjAxMi0wMDI3KQogICAgIFtBbmRyZXkgS3VsaWtvdiA8YW1kZWljaEBnbWFpbC5jb20+XQoKICAqKSBQcmV2ZW50IG1hbGZvcm1lZCBSRkMzNzc5IGRhdGEgdHJpZ2dlcmluZyBhbiBhc3NlcnRpb24gZmFpbHVyZS4KICAgICBUaGFua3MgdG8gQW5kcmV3IENoaSwgQkJOIFRlY2hub2xvZ2llcywgZm9yIGRpc2NvdmVyaW5nIHRoZSBmbGF3CiAgICAgYW5kIFJvYiBBdXN0ZWluIDxzcmFAaGFjdHJuLm5ldD4gZm9yIGZpeGluZyBpdC4gKENWRS0yMDExLTQ1NzcpCiAgICAgW1JvYiBBdXN0ZWluIDxzcmFAaGFjdHJuLm5ldD5dCgogICopIEltcHJvdmVkIFBSTkcgc2VlZGluZyBmb3IgVk9TLgogICAgIFtQYXVsIEdyZWVuIDxQYXVsLkdyZWVuQHN0cmF0dXMuY29tPl0KCiAgKikgRml4IHNzbF9jaXBoLmMgc2V0LXVwIHJhY2UuCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IHNwdXJpb3VzIGZhaWx1cmVzIGluIGVjZHNhdGVzdC5jLgogICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQoKICAqKSBGaXggdGhlIEJJT19mX2J1ZmZlcigpIGltcGxlbWVudGF0aW9uICh3aGljaCB3YXMgbWl4aW5nIGRpZmZlcmVudAogICAgIGludGVycHJldGF0aW9ucyBvZiB0aGUgJy4uLl9sZW4nIGZpZWxkcykuCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IGhhbmRsaW5nIG9mIEJOX0JMSU5ESU5HOiBub3cgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4IChyYXRoZXIgdGhhbgogICAgIEJOX0JMSU5ESU5HX2ludmVydF9leCkgY2FsbHMgQk5fQkxJTkRJTkdfdXBkYXRlLCBlbnN1cmluZyB0aGF0IGNvbmN1cnJlbnQKICAgICB0aHJlYWRzIHdvbid0IHJldXNlIHRoZSBzYW1lIGJsaW5kaW5nIGNvZWZmaWNpZW50cy4KCiAgICAgVGhpcyBhbHNvIGF2b2lkcyB0aGUgbmVlZCB0byBvYnRhaW4gdGhlIENSWVBUT19MT0NLX1JTQV9CTElORElORwogICAgIGxvY2sgdG8gY2FsbCBCTl9CTElORElOR19pbnZlcnRfZXgsIGFuZCBhdm9pZHMgb25lIHVzZSBvZgogICAgIEJOX0JMSU5ESU5HX3VwZGF0ZSBmb3IgZWFjaCBCTl9CTElORElORyBzdHJ1Y3R1cmUgKHByZXZpb3VzbHksCiAgICAgdGhlIGxhc3QgdXBkYXRlIGFsd2F5cyByZW1haW5lZCB1bnVzZWQpLgogICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQoKICAqKSBJbiBzc2wzX2NsZWFyLCBwcmVzZXJ2ZSBzMy0+aW5pdF9leHRyYSBhbG9uZyB3aXRoIHMzLT5yYnVmLgogICAgIFtCb2IgQnVja2hvbHogKEdvb2dsZSldCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZCBhbmQgMS4wLjBlIFs2IFNlcCAyMDExXQoKICAqKSBGaXggYnVnIHdoZXJlIENSTHMgd2l0aCBuZXh0VXBkYXRlIGluIHRoZSBwYXN0IGFyZSBzb21ldGltZXMgYWNjZXB0ZWQKICAgICBieSBpbml0aWFsaXNpbmcgWDUwOV9TVE9SRV9DVFggcHJvcGVybHkuIChDVkUtMjAxMS0zMjA3KQogICAgIFtLYXNwYXIgQnJhbmQgPG9zc2xAdmVsb3guY2g+XQoKICAqKSBGaXggU1NMIG1lbW9yeSBoYW5kbGluZyBmb3IgKEVDKURIIGNpcGhlcnN1aXRlcywgaW4gcGFydGljdWxhcgogICAgIGZvciBtdWx0aS10aHJlYWRlZCB1c2Ugb2YgRUNESC4gKENWRS0yMDExLTMyMTApCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IHg1MDlfbmFtZV9leF9kMmkgbWVtb3J5IGxlYWsgb24gYmFkIGlucHV0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgaGFyZCBjb2RlZCBlY2RzYVdpdGhTSEExIHNpZ25hdHVyZSB0ZXN0cyBpbiBzc2wgY29kZSBhbmQgY2hlY2sKICAgICBzaWduYXR1cmUgcHVibGljIGtleSBhbGdvcml0aG0gYnkgdXNpbmcgT0lEIHhyZWYgdXRpbGl0aWVzIGluc3RlYWQuCiAgICAgQmVmb3JlIHRoaXMgeW91IGNvdWxkIG9ubHkgdXNlIHNvbWUgRUNDIGNpcGhlcnN1aXRlcyB3aXRoIFNIQTEgb25seS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdGVjdGlvbiBhZ2FpbnN0IEVDRFNBIHRpbWluZyBhdHRhY2tzIGFzIG1lbnRpb25lZCBpbiB0aGUgcGFwZXIKICAgICBieSBCaWxseSBCb2IgQnJ1bWxleSBhbmQgTmljb2xhIFR1dmVyaSwgc2VlOgoKCWh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMS8yMzIucGRmCgogICAgIFtCaWxseSBCb2IgQnJ1bWxleSBhbmQgTmljb2xhIFR1dmVyaV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBjIGFuZCAxLjAuMGQgWzggRmViIDIwMTFdCgogICopIEZpeCBwYXJzaW5nIG9mIE9DU1Agc3RhcGxpbmcgQ2xpZW50SGVsbG8gZXh0ZW5zaW9uLiBDVkUtMjAxMS0wMDE0CiAgICAgW05lZWwgTWVodGEsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBGaXggYnVnIGluIHN0cmluZyBwcmludGluZyBjb2RlOiBpZiAqYW55KiBlc2NhcGluZyBpcyBlbmFibGVkIHdlIG11c3QKICAgICBlc2NhcGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgKGJhY2tzbGFzaCkgb3IgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMKICAgICBhbWJpZ3VvdXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBiIGFuZCAxLjAuMGMgIFsyIERlYyAyMDEwXQoKICAqKSBEaXNhYmxlIGNvZGUgd29ya2Fyb3VuZCBmb3IgYW5jaWVudCBhbmQgb2Jzb2xldGUgTmV0c2NhcGUgYnJvd3NlcnMKICAgICBhbmQgc2VydmVyczogYW4gYXR0YWNrZXIgY2FuIHVzZSBpdCBpbiBhIGNpcGhlcnN1aXRlIGRvd25ncmFkZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIE1hcnRpbiBSZXggZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLiBDVkUtMjAxMC00MTgwCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgSi1QQUtFIGltcGxlbWVudGF0aW9uIGVycm9yLCBvcmlnaW5hbGx5IGRpc2NvdmVyZWQgYnkKICAgICBTZWJhc3RpZW4gTWFydGluaSwgZnVydGhlciBpbmZvIGFuZCBjb25maXJtYXRpb24gZnJvbSBTdGVmYW4KICAgICBBcmVudHogYW5kIEZlbmcgSGFvLiBOb3RlIHRoYXQgdGhpcyBmaXggaXMgYSBzZWN1cml0eSBmaXguIENWRS0yMDEwLTQyNTIKICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBhIGFuZCAxLjAuMGIgIFsxNiBOb3YgMjAxMF0KCiAgKikgRml4IGV4dGVuc2lvbiBjb2RlIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGljaCBjYW4gcmVzdWx0IGluIGEgYnVmZmVyCiAgICAgb3ZlcnJ1biB2dWxuZXJhYmlsaXR5OiByZXN1bWVkIHNlc3Npb25zIG11c3Qgbm90IGJlIG1vZGlmaWVkIGFzIHRoZXkgY2FuCiAgICAgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHRocmVhZHMuIENWRS0yMDEwLTM4NjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggV0lOMzIgYnVpbGQgc3lzdGVtIHRvIGNvcnJlY3RseSBsaW5rIGFuIEVOR0lORSBkaXJlY3RvcnkgaW50bwogICAgIGEgRExMLiAKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMCBhbmQgMS4wLjBhICBbMDEgSnVuIDIwMTBdCgogICopIENoZWNrIHJldHVybiB2YWx1ZSBvZiBpbnRfcnNhX3ZlcmlmeSBpbiBwa2V5X3JzYV92ZXJpZnlyZWNvdmVyIAogICAgIChDVkUtMjAxMC0xNjMzKQogICAgIFtTdGV2ZSBIZW5zb24sIFBldGVyLU1pY2hhZWwgSGFnZXIgPGhhZ2VyQGRvcnRtdW5kLm5ldD5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44biBhbmQgMS4wLjAgIFsyOSBNYXIgMjAxMF0KCiAgKikgQWRkICJtaXNzaW5nIiBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9jb3B5KCkuIFRoaXMgY29waWVzIGEgY2lwaGVyCiAgICAgY29udGV4dC4gVGhlIG9wZXJhdGlvbiBjYW4gYmUgY3VzdG9taXNlZCB2aWEgdGhlIGN0cmwgbWVjaGFuaXNtIGluCiAgICAgY2FzZSBFTkdJTkVzIHdhbnQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVG9sZXJhdGUgeWV0IGFub3RoZXIgYnJva2VuIFBLQ1MjOCBrZXkgZm9ybWF0OiBwcml2YXRlIGtleSB2YWx1ZSBuZWdhdGl2ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC1zdWJqZWN0X2hhc2hfb2xkIGFuZCAtaXNzdWVyX2hhc2hfb2xkIG9wdGlvbnMgdG8geDUwOSB1dGlsaXR5IHRvCiAgICAgb3V0cHV0IGhhc2hlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgT3BlblNTTC4KICAgICBbV2lsbHkgV2Vpc3ogPHdlaXN6QHZjcGMudW5pdmllLmFjLmF0Pl0KCiAgKikgRml4IGNvbXByZXNzaW9uIGFsZ29yaXRobSBoYW5kbGluZzogaWYgcmVzdW1pbmcgYSBzZXNzaW9uIHVzZSB0aGUKICAgICBjb21wcmVzc2lvbiBhbGdvcml0aG0gb2YgdGhlIHJlc3VtZWQgc2Vzc2lvbiBpbnN0ZWFkIG9mIGRldGVybWluaW5nCiAgICAgaXQgZnJvbSBjbGllbnQgaGVsbG8gYWdhaW4uIERvbid0IGFsbG93IHNlcnZlciB0byBjaGFuZ2UgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBsb2FkX2NybHMoKSBmdW5jdGlvbiB0byBhcHBzIHRpZHlpbmcgbG9hZF9jZXJ0cygpIHRvby4gQWRkIG9wdGlvbgogICAgIHRvIHZlcmlmeSB1dGlsaXR5IHRvIGFsbG93IGFkZGl0aW9uYWwgQ1JMcyB0byBiZSBpbmNsdWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgT0NTUCByZXF1ZXN0IGNvZGUgdG8gcGVybWl0IGFkZGluZyBjdXN0b20gaGVhZGVycyB0byB0aGUgcmVxdWVzdDoKICAgICBzb21lIHJlc3BvbmRlcnMgbmVlZCB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmdW5jdGlvbiBFVlBfUEtFWV9zaWduKCkgcmV0dXJucyA8PTAgb24gZXJyb3I6IGNoZWNrIHJldHVybiBjb2RlCiAgICAgY29ycmVjdGx5LgogICAgIFtKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+XQoKICAqKSBVcGRhdGUgdmVyaWZ5IGNhbGxiYWNrIGNvZGUgaW4gYXBwcy9zX2NiLmMgYW5kIGFwcHMvdmVyaWZ5LmMsIGl0CiAgICAgbmVlZGxlc3NseSBkZXJlZmVyZW5jZWQgc3RydWN0dXJlcywgdXNlZCBvYnNvbGV0ZSBmdW5jdGlvbnMgYW5kCiAgICAgZGlkbid0IGhhbmRsZSBhbGwgdXBkYXRlZCB2ZXJpZnkgY29kZXMgY29ycmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgTUQyIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gQklPX3BvcCgpIGFuZCBCSU9fcHVzaCgpIHVzZSB0aGUgY3RybCBhcmd1bWVudCAod2hpY2ggd2FzIE5VTEwpIHRvCiAgICAgaW5kaWNhdGUgdGhlIGluaXRpYWwgQklPIGJlaW5nIHB1c2hlZCBvciBwb3BwZWQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUKICAgICB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgQklPIGlzIHRoZSBvbmUgZXhwbGljaXRseSBjYWxsZWQgb3IgYXMgYSByZXN1bHQKICAgICBvZiB0aGUgY3RybCBiZWluZyBwYXNzZWQgZG93biB0aGUgY2hhaW4uIEZpeCBCSU9fcG9wKCkgYW5kIFNTTCBCSU9zIHNvCiAgICAgaXQgaGFuZGxlcyByZWZlcmVuY2UgY291bnRzIGNvcnJlY3RseSBhbmQgZG9lc24ndCB6ZXJvIG91dCB0aGUgSS9PIGJpbwogICAgIHdoZW4gaXQgaXMgbm90IGJlaW5nIGV4cGxpY2l0bHkgcG9wcGVkLiBXQVJOSU5HOiBhcHBsaWNhdGlvbnMgd2hpY2gKICAgICBpbmNsdWRlZCB3b3JrYXJvdW5kcyBmb3IgdGhlIG9sZCBidWdneSBiZWhhdmlvdXIgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkCiAgICAgb3IgdGhleSBjb3VsZCBmcmVlIHVwIGFscmVhZHkgZnJlZWQgQklPcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgdGhlIHVuaTJhc2MvYXNjMnVuaSA9PiBPUEVOU1NMX3VuaTJhc2MvT1BFTlNTTF9hc2MydW5pCiAgICAgcmVuYW1pbmcgdG8gYWxsIHBsYXRmb3JtcyAod2l0aGluIHRoZSAwLjkuOCBicmFuY2gsIHRoaXMgd2FzCiAgICAgZG9uZSBjb25kaXRpb25hbGx5IG9uIE5ldHdhcmUgcGxhdGZvcm1zIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCkuCiAgICAgW0d1ZW50ZXIgPGxpc3RzQGdrbncubmV0Pl0KCiAgKikgQWRkIEVDREhFIGFuZCBQU0sgc3VwcG9ydCB0byBEVExTLgogICAgIFtNaWNoYWVsIFR1ZXhlbiA8dHVleGVuQGZoLW11ZW5zdGVyLmRlPl0KCiAgKikgQWRkIENIRUNLRURfU1RBQ0tfT0YgbWFjcm8gdG8gc2FmZXN0YWNrLmgsIG90aGVyd2lzZSBzYWZlc3RhY2sgY2FuJ3QKICAgICBiZSB1c2VkIG9uIEMrKy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgIm1pc3NpbmciIGZ1bmN0aW9uIEVWUF9NRF9mbGFncygpICh3aXRob3V0IHRoaXMgdGhlIG9ubHkgd2F5IHRvCiAgICAgcmV0cmlldmUgYSBkaWdlc3QgZmxhZ3MgaXMgYnkgYWNjZXNzaW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuIFVwZGF0ZQogICAgIEVWUF9NRF9kb19hbGwqKCkgYW5kIEVWUF9DSVBIRVJfZG9fYWxsKigpIHRvIGluY2x1ZGUgdGhlIG5hbWUgYSBkaWdlc3QKICAgICBvciBjaXBoZXIgaXMgcmVnaXN0ZXJlZCBhcyBpbiB0aGUgImZyb20iIGFyZ3VtZW50LiBQcmludCBvdXQgYWxsCiAgICAgcmVnaXN0ZXJlZCBkaWdlc3RzIGluIHRoZSBkZ3N0IHVzYWdlIG1lc3NhZ2UgaW5zdGVhZCBvZiBtYW51YWxseSAKICAgICBhdHRlbXB0aW5nIHRvIHdvcmsgdGhlbSBvdXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgbm8gU1NMdjIgY2lwaGVycyBhcmUgdXNlZCBkb24ndCB1c2UgYW4gU1NMdjIgY29tcGF0aWJsZSBjbGllbnQgaGVsbG86CiAgICAgdGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBjb21wcmVzc2lvbiBhbmQgZXh0ZW5zaW9ucy4gQ2hhbmdlIGRlZmF1bHQgY2lwaGVyCiAgICAgc3RyaW5nIHRvIHJlbW92ZSBTU0x2MiBjaXBoZXJzdWl0ZXMuIFRoaXMgZWZmZWN0aXZlbHkgYXZvaWRzIGFuY2llbnQgU1NMdjIKICAgICBieSBkZWZhdWx0IHVubGVzcyBhbiBhcHBsaWNhdGlvbiBjaXBoZXIgc3RyaW5nIHJlcXVlc3RzIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsdGVyIG1hdGNoIGNyaXRlcmlhIGluIFBLQ1MxMl9wYXJzZSgpLiBJdCB1c2VkIHRvIHRyeSB0byB1c2UgbG9jYWwKICAgICBrZXkgaWRzIHRvIGZpbmQgbWF0Y2hpbmcgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGJ1dCBzb21lIFBLQ1MjMTIgZmlsZXMKICAgICBkb24ndCBmb2xsb3cgdGhlIChzb21ld2hhdCB1bndyaXR0ZW4pIHJ1bGVzIGFuZCB0aGlzIHN0cmF0ZWd5IGZhaWxzLgogICAgIE5vdyBqdXN0IGdhdGhlciBhbGwgY2VydGlmaWNhdGVzIHRvZ2V0aGVyIGFuZCB0aGUgZmlyc3QgcHJpdmF0ZSBrZXkKICAgICB0aGVuIGxvb2sgZm9yIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSB0aGF0IG1hdGNoZXMgdGhlIGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IHVzZSBvZiByZWdpc3RlcmVkIGRpZ2VzdCBhbmQgY2lwaGVyIG5hbWVzIGZvciBkZ3N0IGFuZCBjaXBoZXIKICAgICBjb21tYW5kcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBhZGQgZWFjaCBvbmUgYXMgYSBzcGVjaWFsIGNhc2UuIFNvIG5vdwogICAgIHlvdSBjYW4gZG86CgogICAgICAgIG9wZW5zc2wgc2hhMjU2IGZvbwoKICAgICBhcyB3ZWxsIGFzOgoKICAgICAgICBvcGVuc3NsIGRnc3QgLXNoYTI1NiBmb28KCiAgICAgYW5kIHRoaXMgd29ya3MgZm9yIEVOR0lORSBiYXNlZCBhbGdvcml0aG1zIHRvby4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIEdvc3QgRU5HSU5FIHRvIHN1cHBvcnQgcGFyYW1ldGVyIGZpbGVzLgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBTdXBwb3J0IEdlbmVyYWxpemVkVGltZSBpbiBjYSB1dGlsaXR5LiAKICAgICBbT2xpdmVyIE1hcnRpbiA8b2xpdmVyQHZvbGF0aWxldm9pZC5uZXQ+LCBTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIGhhc2ggZm9ybWF0IHVzZWQgZm9yIGNlcnRpZmljYXRlIGRpcmVjdG9yeSBsaW5rcy4gVGhlIG5ldwogICAgIGZvcm0gdXNlcyB0aGUgY2Fub25pY2FsIGVuY29kaW5nIChtZWFuaW5nIGVxdWl2YWxlbnQgbmFtZXMgd2lsbCB3b3JrCiAgICAgZXZlbiBpZiB0aGV5IGFyZW4ndCBpZGVudGljYWwpIGFuZCB1c2VzIFNIQTEgaW5zdGVhZCBvZiBNRDUuIFRoaXMgZm9ybQogICAgIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvbGRlciBmb3JtYXQgYW5kIGFzIGEgcmVzdWx0IGNfcmVoYXNoIHNob3VsZAogICAgIGJlIHVzZWQgdG8gcmVidWlsZCBzeW1ib2xpYyBsaW5rcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFBLQ1MjOCB0aGUgZGVmYXVsdCB3cml0ZSBmb3JtYXQgZm9yIHByaXZhdGUga2V5cywgcmVwbGFjaW5nIHRoZQogICAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gVGhpcyBmb3JtIGlzIHN0YW5kYXJkaXNlZCwgbW9yZSBzZWN1cmUgYW5kIGRvZXNuJ3QKICAgICBpbmNsdWRlIGFuIGltcGxpY2l0IE1ENSBkZXBlbmRlbmN5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhICRnY2NfZGV2dGVhbV93YXJuIG9wdGlvbiB0byBDb25maWd1cmUuIFRoZSBpZGVhIGlzIHRoYXQgYW55IGNvZGUKICAgICBjb21taXR0ZWQgdG8gT3BlblNTTCBzaG91bGQgcGFzcyB0aGlzIGxvdCBhcyBhIG1pbmltdW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNlc3Npb24gdGlja2V0IG92ZXJyaWRlIGZ1bmN0aW9uYWxpdHkgZm9yIHVzZSBieSBFQVAtRkFTVC4KICAgICBbSm91bmkgTWFsaW5lbiA8akB3MS5maT5dCgogICopIE1vZGlmeSBITUFDIGZ1bmN0aW9ucyB0byByZXR1cm4gYSB2YWx1ZS4gU2luY2UgdGhlc2UgY2FuIGJlIGltcGxlbWVudGVkCiAgICAgaW4gYW4gRU5HSU5FIGVycm9ycyBjYW4gb2NjdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHlwZS1jaGVja2VkIE9CSl9ic2VhcmNoX2V4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBUeXBlLWNoZWNrZWQgT0JKX2JzZWFyY2guIEFsc28gc29tZSBjb25zdGlmaWNhdGlvbiBuZWNlc3NpdGF0ZWQKICAgICBieSB0eXBlLWNoZWNraW5nLiAgU3RpbGwgdG8gY29tZTogVFhUX0RCLCBic2VhcmNoKD8pLAogICAgIE9CSl9ic2VhcmNoX2V4LCBxc29ydCwgQ1JZUFRPX0VYX0RBVEEsIEFTTjFfVkFMVUUsIEFTTjFfU1RSSU5HLAogICAgIENPTkZfVkFMVUUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2dtdGltZV9hZGooKSB0byBhZGQgYSBzcGVjaWZpYyBudW1iZXIgb2YgZGF5cyBhbmQKICAgICBzZWNvbmRzIHRvIGEgdG0gc3RydWN0dXJlIGRpcmVjdGx5LCBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggT1MKICAgICBzcGVjaWZpYyBkYXRlIHJvdXRpbmVzLiBUaGlzIGF2b2lkcyBhbnkgaXNzdWVzIHdpdGggT1Mgcm91dGluZXMgc3VjaAogICAgIGFzIHRoZSB5ZWFyIDIwMzggYnVnLiBOZXcgKl9hZGooKSBmdW5jdGlvbnMgZm9yIEFTTjEgdGltZSBzdHJ1Y3R1cmVzCiAgICAgYW5kIFg1MDlfdGltZV9hZGpfZXgoKSB0byBjb3ZlciB0aGUgZXh0ZW5kZWQgcmFuZ2UuIFRoZSBleGlzdGluZwogICAgIFg1MDlfdGltZV9hZGooKSBpcyBzdGlsbCB1c2FibGUgYW5kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgYW55IGRhdGUgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERlbHRhIENSTCBzdXBwb3J0LiBOZXcgdXNlIGRlbHRhcyBvcHRpb24gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZQogICAgIGFuZCBzZWFyY2ggYW55IGFwcHJvcHJpYXRlIGRlbHRhIENSTHMgYXZhaWxhYmxlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgQ1JMcyBwYXJ0aXRpb25lZCBieSByZWFzb24gY29kZS4gUmVvcmdhbmlzZSBDUkwgcHJvY2Vzc2luZwogICAgIGNvZGUgYW5kIGFkZCBhZGRpdGlvbmFsIHNjb3JlIGVsZW1lbnRzLiBWYWxpZGF0ZSBhbHRlcm5hdGUgQ1JMIHBhdGhzCiAgICAgYXMgcGFydCBvZiB0aGUgQ1JMIGNoZWNraW5nIGFuZCBpbmRpY2F0ZSBhIG5ldyBlcnJvciAiQ1JMIHBhdGggdmFsaWRhdGlvbgogICAgIGVycm9yIiBpbiB0aGlzIGNhc2UuIEFwcGxpY2F0aW9ucyB3YW50aW5nIGFkZGl0aW9uYWwgZGV0YWlscyBjYW4gdXNlCiAgICAgdGhlIHZlcmlmeSBjYWxsYmFjayBhbmQgY2hlY2sgdGhlIG5ldyAicGFyZW50IiBmaWVsZC4gSWYgdGhpcyBpcyBub3QKICAgICBOVUxMIENSTCBwYXRoIHZhbGlkYXRpb24gaXMgdGFraW5nIHBsYWNlLiBFeGlzdGluZyBhcHBsaWNhdGlvbnMgd29udAogICAgIHNlZSB0aGlzIGJlY2F1c2UgaXQgcmVxdWlyZXMgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgd2hpY2ggaXMgb2ZmIGJ5CiAgICAgZGVmYXVsdC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGZyZXNoZXN0IENSTCBleHRlbnNpb24uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGluZGlyZWN0IENSTCBzdXBwb3J0LiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgaW4gdGhlIENSTHMKICAgICBwYXNzZWQgZGlyZWN0bHkgYW5kIG5vdCB2aWEgbG9va3VwLiBQcm9jZXNzIGNlcnRpZmljYXRlIGlzc3VlcgogICAgIENSTCBlbnRyeSBleHRlbnNpb24gYW5kIGxvb2t1cCBDUkwgZW50cmllcyBieSBib3RoZXIgaXNzdWVyIG5hbWUKICAgICBhbmQgc2VyaWFsIG51bWJlci4gQ2hlY2sgYW5kIHByb2Nlc3MgQ1JMIGlzc3VlciBlbnRyeSBpbiBJRFAgZXh0ZW5zaW9uLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGRpc3RpbmN0IGNlcnRpZmljYXRlIGFuZCBDUkwgcGF0aHMuIFRoZSBDUkwgaXNzdWVyCiAgICAgY2VydGlmaWNhdGUgaXMgdmFsaWRhdGVkIHNlcGFyYXRlbHkgaW4gdGhpcyBjYXNlLiBPbmx5IGVuYWJsZWQgaWYKICAgICBhbiBleHRlbmRlZCBDUkwgc3VwcG9ydCBmbGFnIGlzIHNldDogdGhpcyBmbGFnIHdpbGwgZW5hYmxlIGFkZGl0aW9uYWwKICAgICBDUkwgZnVuY3Rpb25hbGl0eSBpbiBmdXR1cmUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgcG9saWN5IG1hcHBpbmdzIGV4dGVuc2lvbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIHBhdGhsZW5ndGggY29uc3RyYWludCwgc2VsZiBpc3N1ZWQgY2VydGlmaWNhdGUgaGFuZGxpbmcsCiAgICAgcG9saWN5IHByb2Nlc3NpbmcgdG8gYWxpZ24gd2l0aCBSRkMzMjgwIGFuZCBQS0lUUyB0ZXN0cy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIG5hbWUgY29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLiBETiwgZW1haWwsIEROUwogICAgIGFuZCBVUkkgdHlwZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUbyBjYXRlciBmb3Igc3lzdGVtcyB0aGF0IHByb3ZpZGUgYSBwb2ludGVyLWJhc2VkIHRocmVhZCBJRCByYXRoZXIKICAgICB0aGFuIG51bWVyaWMsIGRlcHJlY2F0ZSB0aGUgY3VycmVudCBudW1lcmljIHRocmVhZCBJRCBtZWNoYW5pc20gYW5kCiAgICAgcmVwbGFjZSBpdCB3aXRoIGEgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIGNhbGxiYWNrIHR5cGUuIFRoaXMKICAgICBtZWNoYW5pc20gYWxsb3dzIGEgbnVtZXJpYyAiaGFzaCIgdG8gYmUgZXh0cmFjdGVkIGZyb20gYSB0aHJlYWQgSUQgaW4KICAgICBlaXRoZXIgY2FzZSwgYW5kIG9uIHBsYXRmb3JtcyB3aGVyZSBwb2ludGVycyBhcmUgbGFyZ2VyIHRoYW4gJ2xvbmcnLAogICAgIG1peGluZyBpcyBkb25lIHRvIGhlbHAgZW5zdXJlIHRoZSBudW1lcmljICdoYXNoJyBpcyB1c2FibGUgZXZlbiBpZiBpdAogICAgIGNhbid0IGJlIGd1YXJhbnRlZWQgdW5pcXVlLiBUaGUgZGVmYXVsdCBtZWNoYW5pc20gaXMgdG8gdXNlICImZXJybm8iCiAgICAgYXMgYSBwb2ludGVyLWJhc2VkIHRocmVhZCBJRCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRocmVhZHMuCgogICAgIEFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJvdmlkZSB0aGVpciBvd24gdGhyZWFkIElEcyBzaG91bGQgbm93IHVzZQogICAgIENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrIHRoYXQgd2lsbCBjYWxsCiAgICAgZWl0aGVyIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYygpIG9yIENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcigpLgoKICAgICBOb3RlIHRoYXQgRVJSX3JlbW92ZV9zdGF0ZSgpIGlzIG5vdyBkZXByZWNhdGVkLCBiZWNhdXNlIGl0IGlzIHRpZWQKICAgICB0byB0aGUgYXNzdW1wdGlvbiB0aGF0IHRocmVhZCBJRHMgYXJlIG51bWVyaWMuICBFUlJfcmVtb3ZlX3N0YXRlKDApCiAgICAgdG8gZnJlZSB0aGUgY3VycmVudCB0aHJlYWQncyBlcnJvciBzdGF0ZSBzaG91bGQgYmUgcmVwbGFjZWQgYnkKICAgICBFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKS4KCiAgICAgKFRoaXMgbmV3IGFwcHJvYWNoIHJlcGxhY2VzIHRoZSBmdW5jdGlvbnMgQ1JZUFRPX3NldF9pZHB0cl9jYWxsYmFjaygpLAogICAgIENSWVBUT19nZXRfaWRwdHJfY2FsbGJhY2soKSwgYW5kIENSWVBUT190aHJlYWRfaWRwdHIoKSB0aGF0IGV4aXN0ZWQgaW4KICAgICBPcGVuU1NMIDAuOS45LWRldiBiZXR3ZWVuIEp1bmUgMjAwNiBhbmQgQXVndXN0IDIwMDguIEFsc28sIGlmIGFuCiAgICAgYXBwbGljYXRpb24gd2FzIHByZXZpb3VzbHkgcHJvdmlkaW5nIGEgbnVtZXJpYyB0aHJlYWQgY2FsbGJhY2sgdGhhdAogICAgIHdhcyBpbmFwcHJvcHJpYXRlIGZvciBkaXN0aW5ndWlzaGluZyB0aHJlYWRzLCB0aGVuIHVuaXF1ZW5lc3MgbWlnaHQKICAgICBoYXZlIGJlZW4gb2J0YWluZWQgd2l0aCAmZXJybm8gdGhhdCBoYXBwZW5lZCBpbW1lZGlhdGVseSBpbiB0aGUKICAgICBpbnRlcm1lZGlhdGUgZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgT3BlblNTTDsgdGhpcyBpcyBubyBsb25nZXIgdGhlCiAgICAgY2FzZSwgdGhlIG51bWVyaWMgdGhyZWFkIGNhbGxiYWNrIHdpbGwgbm93IG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgdXNlCiAgICAgb2YgJmVycm5vLikKICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGhlbHAgZnJvbSBCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgZGlmZmVyZW50IENSTCBpc3N1aW5nIGNlcnRpZmljYXRlcy4gVGhpcyBjb3ZlcnMgYQogICAgIHNpbXBsZSBjYXNlIHdoZXJlIHRoZSBzZWxmIGlzc3VlZCBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGNoYWluIGV4aXN0IGFuZAogICAgIHRoZSByZWFsIENSTCBpc3N1ZXIgaXMgaGlnaGVyIGluIHRoZSBleGlzdGluZyBjaGFpbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZWQgZWZmZWN0aXZlbHkgZGVmdW5jdCBjcnlwdG8vc3RvcmUgZnJvbSB0aGUgYnVpbGQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFJldmFtcCBvZiBTVEFDSyB0byBwcm92aWRlIHN0cm9uZ2VyIHR5cGUtY2hlY2tpbmcuIFN0aWxsIHRvIGNvbWU6CiAgICAgVFhUX0RCLCBic2VhcmNoKD8pLCBPQkpfYnNlYXJjaCwgcXNvcnQsIENSWVBUT19FWF9EQVRBLCBBU04xX1ZBTFVFLAogICAgIEFTTjFfU1RSSU5HLCBDT05GX1ZBTFVFLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBuZXcgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTIG1vZGUgZmxhZyB0byByZWxlYXNlIHVudXNlZCBidWZmZXIKICAgICBSQU0gb24gU1NMIGNvbm5lY3Rpb25zLiAgVGhpcyBvcHRpb24gY2FuIHNhdmUgYWJvdXQgMzRrIHBlciBpZGxlIFNTTC4KICAgICBbTmljayBNYXRoZXdzb25dCgogICopIFJldmFtcCBvZiBMSEFTSCB0byBwcm92aWRlIHN0cm9uZ2VyIHR5cGUtY2hlY2tpbmcuIFN0aWxsIHRvIGNvbWU6CiAgICAgU1RBQ0ssIFRYVF9EQiwgYnNlYXJjaCwgcXNvcnQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgQ3J5cHRvZ3JhcGhpYyBNZXNzYWdlIFN5bnRheCAoYWthIENNUykgYmFzZWQKICAgICBvbiBSRkMzODUwLCBSRkMzODUxIGFuZCBSRkMzODUyLiBOZXcgY21zIGRpcmVjdG9yeSBhbmQgY21zIHV0aWxpdHksCiAgICAgc3VwcG9ydCBmb3IgZGF0YSwgc2lnbmVkRGF0YSwgY29tcHJlc3NlZERhdGEsIGRpZ2VzdGVkRGF0YSBhbmQKICAgICBlbmNyeXB0ZWREYXRhLCBlbnZlbG9wZWREYXRhIHR5cGVzIGluY2x1ZGVkLiBTY3JpcHRzIHRvIGNoZWNrIGFnYWluc3QKICAgICBSRkM0MTM0IGV4YW1wbGVzIGRyYWZ0IGFuZCBpbnRlcm9wIGFuZCBjb25zaXN0ZW5jeSBjaGVja3Mgb2YgbWFueQogICAgIGNvbnRlbnQgdHlwZXMgYW5kIHZhcmlhbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb25zIHRvIGVuYyB1dGlsaXR5IHRvIHN1cHBvcnQgdXNlIG9mIHpsaWIgY29tcHJlc3Npb24gQklPLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBtazFtZiB0byBzdXBwb3J0IGltcG9ydGluZyBvZiBvcHRpb25zIGFuZCBhc3NlbWJseSBsYW5ndWFnZQogICAgIGZpbGVzIGZyb20gQ29uZmlndXJlIHNjcmlwdCwgY3VycmVudGx5IG9ubHkgaW5jbHVkZWQgaW4gVkMtV0lOMzIuCiAgICAgVGhlIGFzc2VtYmx5IGxhbmd1YWdlIHJ1bGVzIGNhbiBub3cgb3B0aW9uYWxseSBnZW5lcmF0ZSB0aGUgc291cmNlCiAgICAgZmlsZXMgZnJvbSB0aGUgYXNzb2NpYXRlZCBwZXJsIHNjcmlwdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHJlbWFpbmluZyBmdW5jdGlvbmFsaXR5IG5lZWRlZCB0byBzdXBwb3J0IEdPU1QgY2lwaGVyc3VpdGVzLgogICAgIEludGVyb3AgdGVzdGluZyBoYXMgYmVlbiBwZXJmb3JtZWQgdXNpbmcgQ3J5cHRvUHJvIGltcGxlbWVudGF0aW9ucy4KICAgICBbVmljdG9yIEIuIFdhZ25lciA8dml0dXNAY3J5cHRvY29tLnJ1Pl0KCiAgKikgczM5MHggYXNzZW1ibGVyIHBhY2suCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFSTXY0IGFzc2VtYmxlciBwYWNrLiBBUk12NCByZWZlcnMgdG8gdjQgYW5kIGxhdGVyIElTQSwgbm90IENQVQogICAgICJmYW1pbHkuIgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBJbXBsZW1lbnQgT3BhcXVlIFBSRiBJbnB1dCBUTFMgZXh0ZW5zaW9uIGFzIHNwZWNpZmllZCBpbgogICAgIGRyYWZ0LXJlc2NvcmxhLXRscy1vcGFxdWUtcHJmLWlucHV0LTAwLnR4dC4gIFNpbmNlIHRoaXMgaXMgbm90IGFuCiAgICAgb2ZmaWNpYWwgc3BlY2lmaWNhdGlvbiB5ZXQgYW5kIG5vIGV4dGVuc2lvbiB0eXBlIGFzc2lnbm1lbnQgYnkKICAgICBJQU5BIGV4aXN0cywgdGhpcyBleHRlbnNpb24gKGZvciBub3cpIHdpbGwgaGF2ZSB0byBiZSBleHBsaWNpdGx5CiAgICAgZW5hYmxlZCB3aGVuIGJ1aWxkaW5nIE9wZW5TU0wgYnkgcHJvdmlkaW5nIHRoZSBleHRlbnNpb24gbnVtYmVyCiAgICAgdG8gdXNlLiAgRm9yIGV4YW1wbGUsIHNwZWNpZnkgYW4gb3B0aW9uCgogICAgICAgICAtRFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQ9MHg5NTI3CgogICAgIHRvIHRoZSAiY29uZmlnIiBvciAiQ29uZmlndXJlIiBzY3JpcHQgdG8gZW5hYmxlIHRoZSBleHRlbnNpb24sCiAgICAgYXNzdW1pbmcgZXh0ZW5zaW9uIG51bWJlciAweDk1MjcgKHdoaWNoIGlzIGEgY29tcGxldGVseSBhcmJpdHJhcnkKICAgICBhbmQgdW5vZmZpY2lhbCBhc3NpZ25tZW50IGJhc2VkIG9uIHRoZSBNRDUgaGFzaCBvZiB0aGUgSW50ZXJuZXQKICAgICBEcmFmdCkuICBOb3RlIHRoYXQgYnkgZG9pbmcgc28sIHlvdSBwb3RlbnRpYWxseSBsb3NlCiAgICAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIFRMUyBpbXBsZW1lbnRhdGlvbnMgc2luY2UgdGhlc2UgbWlnaHQKICAgICBiZSB1c2luZyB0aGUgc2FtZSBleHRlbnNpb24gbnVtYmVyIGZvciBvdGhlciBwdXJwb3Nlcy4KCiAgICAgU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dChzc2wsIHNyYywgbGVuKSBpcyB1c2VkIHRvIHNldCB0aGUKICAgICBvcGFxdWUgUFJGIGlucHV0IHZhbHVlIHRvIHVzZSBpbiB0aGUgaGFuZHNoYWtlLiAgVGhpcyB3aWxsIGNyZWF0ZQogICAgIGFuIGludGVyYWwgY29weSBvZiB0aGUgbGVuZ3RoLSdsZW4nIHN0cmluZyBhdCAnc3JjJywgYW5kIHdpbGwKICAgICByZXR1cm4gbm9uLXplcm8gZm9yIHN1Y2Nlc3MuCgogICAgIFRvIGdldCBtb3JlIGNvbnRyb2wgYW5kIGZsZXhpYmlsaXR5LCBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24KICAgICBieSB1c2luZwoKICAgICAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrKGN0eCwgY2IpCiAgICAgICAgICBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFja19hcmcoY3R4LCBhcmcpCgogICAgIHdoZXJlCgogICAgICAgICAgaW50ICgqY2IpKFNTTCAqLCB2b2lkICpwZWVyaW5wdXQsIHNpemVfdCBsZW4sIHZvaWQgKmFyZyk7CiAgICAgICAgICB2b2lkICphcmc7CgogICAgIENhbGxiYWNrIGZ1bmN0aW9uICdjYicgd2lsbCBiZSBjYWxsZWQgaW4gaGFuZHNoYWtlcywgYW5kIGlzCiAgICAgZXhwZWN0ZWQgdG8gdXNlIFNTTF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQoKSBhcyBhcHByb3ByaWF0ZS4KICAgICBBcmd1bWVudCAnYXJnJyBpcyBmb3IgYXBwbGljYXRpb24gcHVycG9zZXMgKHRoZSB2YWx1ZSBhcyBnaXZlbiB0bwogICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrX2FyZygpIHdpbGwgZGlyZWN0bHkKICAgICBiZSBwcm92aWRlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24pLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgaGFzIHRvIHJldHVybiBub24temVybyB0byByZXBvcnQgc3VjY2VzczogdXN1YWxseSAxIHRvIHVzZSBvcGFxdWUKICAgICBQUkYgaW5wdXQganVzdCBpZiBwb3NzaWJsZSwgb3IgMiB0byBlbmZvcmNlIHVzZSBvZiB0aGUgb3BhcXVlIFBSRgogICAgIGlucHV0LiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgbGlicmFyeSB3aWxsIGFib3J0IHRoZSBoYW5kc2hha2UKICAgICBpZiBvcGFxdWUgUFJGIGlucHV0IGlzIG5vdCBzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZC4KCiAgICAgQXJndW1lbnRzICdwZWVyaW5wdXQnIGFuZCAnbGVuJyBnaXZlbiB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICB3aWxsIGFsd2F5cyBiZSBOVUxMIGFuZCAwIGluIHRoZSBjYXNlIG9mIGEgY2xpZW50LiAgQSBzZXJ2ZXIgd2lsbAogICAgIHNlZSB0aGUgY2xpZW50J3Mgb3BhcXVlIFBSRiBpbnB1dCB0aHJvdWdoIHRoZXNlIHZhcmlhYmxlcyBpZgogICAgIGF2YWlsYWJsZSAoTlVMTCBhbmQgMCBvdGhlcndpc2UpLiAgTm90ZSB0aGF0IGlmIHRoZSBzZXJ2ZXIKICAgICBwcm92aWRlcyBhbiBvcGFxdWUgUFJGIGlucHV0LCB0aGUgbGVuZ3RoIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlCiAgICAgbGVuZ3RoIG9mIHRoZSBjbGllbnQncyBvcGFxdWUgUFJGIGlucHV0LgoKICAgICBOb3RlIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiBjcmVhdGluZwogICAgIGEgbmV3IHNlc3Npb24gKHNlc3Npb24gcmVzdW1wdGlvbiBjYW4gcmVzdW1lIHdoYXRldmVyIHdhcwogICAgIHByZXZpb3VzbHkgbmVnb3RpYXRlZCksIGFuZCB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gU1NMIDIuMAogICAgIGhhbmRzaGFrZXM7IHRodXMsIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LCBTU0xfT1BfTk9fU1NMdjIpIG9yCiAgICAgU1NMX3NldF9vcHRpb25zKHNzbCwgU1NMX09QX05PX1NTTHYyKSBpcyBlc3BlY2lhbGx5IHJlY29tbWVuZGVkCiAgICAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gZW5mb3JjZSBvcGFxdWUgUFJGIGlucHV0LgoKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVcGRhdGUgc3NsIGNvZGUgdG8gc3VwcG9ydCBkaWdlc3RzIG90aGVyIHRoYW4gU0hBMStNRDUgZm9yIGhhbmRzaGFrZQogICAgIE1BQy4gCgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBBZGQgUkZDNDUwNyBzdXBwb3J0IHRvIE9wZW5TU0wuIFRoaXMgaW5jbHVkZXMgdGhlIGNvcnJlY3Rpb25zIGluCiAgICAgUkZDNDUwN2Jpcy4gVGhlIGVuY3J5cHRlZCB0aWNrZXQgZm9ybWF0IGlzIGFuIGVuY3J5cHRlZCBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlLCB0aGF0IHdheSBuZXcgc2Vzc2lvbiBmZWF0dXJlcyBhcmUgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnRlZC4KCiAgICAgSWYgYSBjbGllbnQgYXBwbGljYXRpb24gY2FjaGVzIHNlc3Npb24gaW4gYW4gU1NMX1NFU1NJT04gc3RydWN0dXJlCiAgICAgc3VwcG9ydCBpcyB0cmFuc3BhcmVudCBiZWNhdXNlIHRpY2tldHMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTi4KICAgICAKICAgICBUaGUgU1NMX0NUWCBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMga2V5cyBmb3IgdGlja2V0CiAgICAgcHJvdGVjdGlvbiBpbiBzZXJ2ZXJzIHNvIGFnYWluIHN1cHBvcnQgc2hvdWxkIGJlIHBvc3NpYmxlCiAgICAgd2l0aCBubyBhcHBsaWNhdGlvbiBtb2RpZmljYXRpb24uCgogICAgIElmIGEgY2xpZW50IG9yIHNlcnZlciB3aXNoZXMgdG8gZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgdGhlbiB0aGUgb3B0aW9uCiAgICAgU1NMX09QX05PX1RJQ0tFVCBjYW4gYmUgc2V0LgoKICAgICBBZGQgYSBUTFMgZXh0ZW5zaW9uIGRlYnVnZ2luZyBjYWxsYmFjayB0byBhbGxvdyB0aGUgY29udGVudHMgb2YgYW55IGNsaWVudAogICAgIG9yIHNlcnZlciBleHRlbnNpb25zIHRvIGJlIGV4YW1pbmVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRmluYWwgY2hhbmdlcyB0byBhdm9pZCB1c2Ugb2YgcG9pbnRlciBwb2ludGVyIGNhc3RzIGluIE9wZW5TU0wuCiAgICAgT3BlblNTTCBzaG91bGQgbm93IGNvbXBpbGUgY2xlYW5seSBvbiBnY2MgNC4yCiAgICAgW1BldGVyIEhhcnRsZXkgPHBkaEB1dHRlci5jaGFvcy5vcmcudWs+LCBTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBTU0wgbGlicmFyeSB0byB1c2UgbmV3IEVWUF9QS0VZIE1BQyBBUEkuIEluY2x1ZGUgZ2VuZXJpYyBNQUMKICAgICBzdXBwb3J0IGluY2x1ZGluZyBzdHJlYW1pbmcgTUFDIHN1cHBvcnQ6IHRoaXMgaXMgcmVxdWlyZWQgZm9yIEdPU1QKICAgICBjaXBoZXJzdWl0ZSBzdXBwb3J0LgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb24gLXN0cmVhbSB0byB1c2UgUEtDUyM3IHN0cmVhbWluZyBpbiBzbWltZSB1dGlsaXR5LiBOZXcKICAgICBmdW5jdGlvbiBpMmRfUEtDUzdfYmlvX3N0cmVhbSgpIGFuZCBQRU1fd3JpdGVfUEtDUzdfYmlvX3N0cmVhbSgpCiAgICAgdG8gb3V0cHV0IGluIEJFUiBhbmQgUEVNIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgdXNlIG9mIEhNQUMgdmlhIEVWUF9QS0VZIGludGVyZmFjZS4gVGhpcwogICAgIGFsbG93cyBITUFDIHRvIGJlIGhhbmRsZWQgdmlhIHRoZSBFVlBfRGlnZXN0U2lnbiooKSBpbnRlcmZhY2UuIFRoZQogICAgIEVWUF9QS0VZICJrZXkiIGluIHRoaXMgY2FzZSBpcyB0aGUgSE1BQyBrZXksIHBvdGVudGlhbGx5IGFsbG93aW5nCiAgICAgRU5HSU5FIHN1cHBvcnQgZm9yIEhNQUMga2V5cyB3aGljaCBhcmUgdW5leHRyYWN0YWJsZS4gTmV3IC1tYWMgYW5kCiAgICAgLW1hY29wdCBvcHRpb25zIHRvIGRnc3QgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIC1zaWdvcHQgdG8gZGdzdCB1dGlsaXR5LiBVcGRhdGUgZGdzdCB0byB1c2UKICAgICBFVlBfRGlnZXN0e1NpZ24sVmVyaWZ5fSouIFRoZXNlIHR3byBjaGFuZ2VzIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlCiAgICAgYWx0ZXJuYXRpdmUgc2lnbmluZyBwYXJhbWF0ZXJzIHN1Y2ggYXMgWDkuMzEgb3IgUFNTIGluIHRoZSBkZ3N0IAogICAgIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHNzbF9jaXBoZXJfYXBwbHlfcnVsZSgpLCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBkb2VzCiAgICAgdGhlIHdvcmsgZWFjaCB0aW1lIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHJlcXVlc3RzIGVuYWJsaW5nCiAgICAgKCJmb28rYmFyIiksIG1vdmluZyAoIitmb28rYmFyIiksIGRpc2FibGluZyAoIi1mb28rYmFyIiwgb3IKICAgICByZW1vdmluZyAoIiFmb28rYmFyIikgYSBjbGFzcyBvZiBjaXBoZXJzdWl0ZXM6IE5vdyBpdCBtYWludGFpbnMKICAgICB0aGUgb3JkZXIgb2YgZGlzYWJsZWQgY2lwaGVyc3VpdGVzIHN1Y2ggdGhhdCB0aG9zZSBjaXBoZXJzdWl0ZXMKICAgICB0aGF0IG1vc3QgcmVjZW50bHkgd2VudCBmcm9tIGVuYWJsZWQgdG8gZGlzYWJsZWQgbm90IG9ubHkgc3RheQogICAgIGluIG9yZGVyIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLCBidXQgYWxzbyBoYXZlIGhpZ2hlciBwcmlvcml0eQogICAgIHRoYW4gb3RoZXIgZGlzYWJsZWQgY2lwaGVyc3VpdGVzIHRoZSBuZXh0IHRpbWUgY2lwaGVyc3VpdGVzIGFyZQogICAgIGVuYWJsZWQgYWdhaW4uCgogICAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIG5vdyBzYXksIGUuZy4sICJQU0s6LVBTSzpISUdIIiB0byBlbmFibGUKICAgICB0aGUgc2FtZSBjaXBoZXJzdWl0ZXMgYXMgd2l0aCAiSElHSCIgYWxvbmUsIGJ1dCBpbiBhIHNwZWNpZmljCiAgICAgb3JkZXIgd2hlcmUgdGhlIFBTSyBjaXBoZXJzdWl0ZXMgY29tZSBmaXJzdCAoc2luY2UgdGhleSBhcmUgdGhlCiAgICAgbW9zdCByZWNlbnRseSBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgd2hlbiAiSElHSCIgaXMgcGFyc2VkKS4KCiAgICAgQWxzbywgY2hhbmdlIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSAodXNpbmcgdGhpcyBuZXcKICAgICBmdW5jaW9uYWxpdHkpIHN1Y2ggdGhhdCBiZXR3ZWVuIG90aGVyd2lzZSBpZGVudGljYWwKICAgICBjaWhwZXJzdWl0ZXMsIGVwaGVtZXJhbCBFQ0RIIGlzIHByZWZlcnJlZCBvdmVyIGVwaGVtZXJhbCBESCBpbgogICAgIHRoZSBkZWZhdWx0IG9yZGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgc28gdGhhdCBpdCBhdXRvbWF0aWNhbGx5CiAgICAgYXJyYW5nZXMgdGhlIGNpcGhlcnN1aXRlcyBpbiByZWFzb25hYmxlIG9yZGVyIGJlZm9yZSBzdGFydGluZwogICAgIHRvIHByb2Nlc3MgdGhlIHJ1bGUgc3RyaW5nLiAgVGh1cywgdGhlIGRlZmluaXRpb24gZm9yICJERUZBVUxUIgogICAgIChTU0xfREVGQVVMVF9DSVBIRVJfTElTVCkgbm93IGlzIGp1c3QgIkFMTDohYU5VTEw6IWVOVUxMIiwgYnV0CiAgICAgcmVtYWlucyBlcXVpdmFsZW50IHRvICJBRVM6QUxMOiFhTlVMTDohZU5VTEw6K2FFQ0RIOitrUlNBOitSQzQ6QFNUUkVOR1RIIi4KICAgICBUaGlzIG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGFycml2ZSBhdCBhIHJlYXNvbmFibGUgZGVmYXVsdCBvcmRlcgogICAgIGluIGFwcGxpY2F0aW9ucyBmb3Igd2hpY2ggYW5vbnltb3VzIGNpcGhlcnMgYXJlIE9LIChtZWFuaW5nCiAgICAgdGhhdCB5b3UgY2FuJ3QgYWN0dWFsbHkgdXNlIERFRkFVTFQpLgogICAgIFtCb2RvIE1vZWxsZXI7IHN1Z2dlc3RlZCBieSBWaWN0b3IgRHVjaG92bmldCgogICopIFNwbGl0IHRoZSBTU0wvVExTIGFsZ29yaXRobSBtYXNrIChhcyB1c2VkIGZvciBjaXBoZXJzdWl0ZSBzdHJpbmcKICAgICBwcm9jZXNzaW5nKSBpbnRvIG11bHRpcGxlIGludGVnZXJzIGluc3RlYWQgb2Ygc2V0dGluZwogICAgICJTU0xfTUtFWV9NQVNLIiBiaXRzLCAiU1NMX0FVVEhfTUFTSyIgYml0cywgIlNTTF9FTkNfTUFTSyIsCiAgICAgIlNTTF9NQUNfTUFTSyIsIGFuZCAiU1NMX1NTTF9NQVNLIiBiaXRzIGFsbCBpbiBhIHNpbmdsZSBpbnRlZ2VyLgogICAgIChUaGVzZSBtYXNrcyBhcyB3ZWxsIGFzIHRoZSBpbmRpdmlkdWFsIGJpdCBkZWZpbml0aW9ucyBhcmUgaGlkZGVuCiAgICAgYXdheSBpbnRvIHRoZSBub24tZXhwb3J0ZWQgaW50ZXJmYWNlIHNzbC9zc2xfbG9jbC5oLCBzbyB0aGlzCiAgICAgY2hhbmdlIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTU0xfQ0lQSEVSIHN0cnVjdHVyZSBzaG91bGRuJ3QKICAgICBhZmZlY3QgYXBwbGljYXRpb25zLikgIFRoaXMgZ2l2ZSB1cyBtb3JlIGJpdHMgZm9yIGVhY2ggb2YgdGhlc2UKICAgICBjYXRlZ29yaWVzLCBzbyB0aGVyZSBpcyBubyBsb25nZXIgYSBuZWVkIHRvIGNvYWd1bGF0ZSBBRVMxMjggYW5kCiAgICAgQUVTMjU2IGludG8gYSBzaW5nbGUgYWxnb3JpdGhtIGJpdCwgYW5kIHRvIGNvYWd1bGF0ZSBDYW1lbGxpYTEyOAogICAgIGFuZCBDYW1lbGxpYTI1NiBpbnRvIGEgc2luZ2xlIGFsZ29yaXRobSBiaXQsIHdoaWNoIGhhcyBsZWQgdG8gYWxsCiAgICAga2luZHMgb2Yga2x1ZGdlcy4KCiAgICAgVGh1cywgYW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUga2x1ZGdlIGludHJvZHVjZWQgaW4gMC45LjdtIGFuZAogICAgIDAuOS44ZSBmb3IgbWFza2luZyBvdXQgQUVTMjU2IGluZGVwZW5kZW50bHkgb2YgQUVTMTI4IG9yIG1hc2tpbmcKICAgICBvdXQgQ2FtZWxsaWEyNTYgaW5kZXBlbmRlbnRseSBvZiBBRVMyNTYgaXMgbm90IG5lZWRlZCBoZXJlIGluIDAuOS45LgoKICAgICBXaXRoIHRoZSBjaGFuZ2UsIHdlIGFsc28gaW50cm9kdWNlIG5ldyBjaXBoZXJzdWl0ZSBhbGlhc2VzIHRoYXQKICAgICBzbyBmYXIgd2VyZSBtaXNzaW5nOiAiQUVTMTI4IiwgIkFFUzI1NiIsICJDQU1FTExJQTEyOCIsIGFuZAogICAgICJDQU1FTExJQTI1NiIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGRzYS13aXRoLVNIQTIyNCBhbmQgZHNhLXdpdGgtU0hBMjU2LgogICAgIFVzZSB0aGUgbGVmdG1vc3QgTiBieXRlcyBvZiB0aGUgc2lnbmF0dXJlIGlucHV0IGlmIHRoZSBpbnB1dCBpcwogICAgIGxhcmdlciB0aGFuIHRoZSBwcmltZSBxICh3aXRoIE4gYmVpbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YgcSkuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBWZXJ5ICp2ZXJ5KiBleHBlcmltZW50YWwgUEtDUyM3IHN0cmVhbWluZyBlbmNvZGVyIHN1cHBvcnQuIE5vdGhpbmcgdXNlcwogICAgIGl0IHlldCBhbmQgaXQgaXMgbGFyZ2VseSB1bnRlc3RlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIGVjZHNhLXdpdGgtU0hBMjI0LzI1Ni8zODQvNTEyIHNpZ25hdHVyZSB0eXBlcy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEluaXRpYWwgaW5jb21wbGV0ZSBjaGFuZ2VzIHRvIGF2b2lkIG5lZWQgZm9yIGZ1bmN0aW9uIGNhc3RzIGluIE9wZW5TU0wKICAgICBzb21lIGNvbXBpbGVycyAoZ2NjIDQuMiBhbmQgbGF0ZXIpIHJlamVjdCB0aGVpciB1c2UuIFNhZmVzdGFjayBpcwogICAgIHJlaW1wbGVtZW50ZWQuICBVcGRhdGUgQVNOMSB0byBhdm9pZCB1c2Ugb2YgbGVnYWN5IGZ1bmN0aW9ucy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2luMzIvNjQgdGFyZ2V0cyBhcmUgbGlua2VkIHdpdGggV2luc29jazIuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBhbiBYNTA5X0NSTF9NRVRIT0Qgc3RydWN0dXJlIHRvIGFsbG93IENSTCBwcm9jZXNzaW5nIHRvIGJlIHJlZGlyZWN0ZWQKICAgICB0byBleHRlcm5hbCBmdW5jdGlvbnMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgQ1JMIGhhbmRsaW5nIAogICAgIGVmZmljaWVuY3kgZXNwZWNpYWxseSB3aGVuIENSTHMgYXJlIHZlcnkgbGFyZ2UgYnkgKGZvciBleGFtcGxlKSBzdG9yaW5nCiAgICAgdGhlIENSTCByZXZva2VkIGNlcnRpZmljYXRlcyBpbiBhIGRhdGFiYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsIG9mIGJ5X2RpciBjb2RlLiBBZGQgc3VwcG9ydCBmb3IgZHluYW1pYyBsb2FkaW5nIG9mIENSTHMgc28KICAgICBuZXcgQ1JMcyBhZGRlZCB0byBhIGRpcmVjdG9yeSBjYW4gYmUgdXNlZC4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAtdmVyaWZ5X3JldHVybl9lcnJvciB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuIFRoaXMgY2F1c2VzIHJlYWwgZXJyb3JzCiAgICAgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIHZlcmlmeSBjYWxsYmFjayBpbnN0ZWFkIG9mIGNhcnJ5aW5nIG9uIG5vIG1hdHRlcgogICAgIHdoYXQuIFRoaXMgcmVmbGVjdHMgdGhlIHdheSBhICJyZWFsIHdvcmxkIiB2ZXJpZnkgY2FsbGJhY2sgd291bGQgYmVoYXZlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEdPU1QgZW5naW5lLCBzdXBwb3J0aW5nIHNldmVyYWwgR09TVCBhbGdvcml0aG1zIGFuZCBwdWJsaWMga2V5IGZvcm1hdHMuCiAgICAgS2luZGx5IGRvbmF0ZWQgYnkgQ3J5cHRvY29tLgogICAgIFtDcnlwdG9jb21dCgogICopIFBhcnRpYWwgc3VwcG9ydCBmb3IgSXNzdWluZyBEaXN0cmlidXRpb24gUG9pbnQgQ1JMIGV4dGVuc2lvbi4gQ1JMcwogICAgIHBhcnRpdGlvbmVkIGJ5IERQIGFyZSBoYW5kbGVkIGJ1dCBubyBpbmRpcmVjdCBDUkwgb3IgcmVhc29uIHBhcnRpdGlvbmluZwogICAgICh5ZXQpLiBDb21wbGV0ZSBvdmVyaGF1bCBvZiBDUkwgaGFuZGxpbmc6IG5vdyB0aGUgbW9zdCBzdWl0YWJsZSBDUkwgaXMKICAgICBzZWxlY3RlZCB2aWEgYSBzY29yaW5nIHRlY2huaXF1ZSB3aGljaCBoYW5kbGVzIElEUCBhbmQgQUtJRCBpbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBYNTA5X1NUT1JFX0NUWCBjYWxsYmFja3MgbG9va3VwX2NybHMoKSBhbmQgbG9va3VwX2NlcnRzKCkgd2hpY2gKICAgICB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBmb3IgYWxsIHZlcmlmeSBvcGVyYXRpb25zOiB0aGlzIHdpbGwgcmVtb3ZlIHRoZQogICAgIFg1MDlfU1RPUkUgZGVwZW5kZW5jeSBvbiBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIGFsbG93IGFsdGVybmF0aXZlCiAgICAgbG9va3VwIG1ldGhvZHMuICBYNTA5X1NUT1JFIGJhc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSB0d28gY2FsbGJhY2tzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IG11bHRpcGxlIENSTHMgdG8gZXhpc3QgaW4gYW4gWDUwOV9TVE9SRSB3aXRoIG1hdGNoaW5nIGlzc3VlciBuYW1lcy4KICAgICBNb2RpZnkgZ2V0X2NybCgpIHRvIGZpbmQgYSB2YWxpZCAodW5leHBpcmVkKSBDUkwgaWYgcG9zc2libGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX21hdGNoKCkgdG8gY2hlY2sgaWYgdHdvIENSTHMgYXJlIGlkZW50aWNhbC4gTm9ybWFsbHkKICAgICB0aGlzIHdvdWxkIGJlIGNhbGxlZCBYNTA5X0NSTF9jbXAoKSBidXQgdGhhdCBuYW1lIGlzIGFscmVhZHkgdXNlZCBieQogICAgIGEgZnVuY3Rpb24gdGhhdCBqdXN0IGNvbXBhcmVzIENSTCBpc3N1ZXIgbmFtZXMuIENhY2hlIHNldmVyYWwgQ1JMIAogICAgIGV4dGVuc2lvbnMgaW4gWDUwOV9DUkwgc3RydWN0dXJlIGFuZCBjYWNoZSBDUkxEUCBpbiBYNTA5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN0b3JlIGEgImNhbm9uaWNhbCIgcmVwcmVzZW50YXRpb24gb2YgWDUwOV9OQU1FIHN0cnVjdHVyZSAoQVNOMSBOYW1lKQogICAgIHRoaXMgbWFwcyBlcXVpdmFsZW50IFg1MDlfTkFNRSBzdHJ1Y3R1cmVzIGludG8gYSBjb25zaXN0ZW50IHN0cnVjdHVyZS4KICAgICBOYW1lIGNvbXBhcmlzb24gY2FuIHRoZW4gYmUgcGVyZm9ybWVkIHJhcGlkbHkgdXNpbmcgbWVtY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTm9uLWJsb2NraW5nIE9DU1AgcmVxdWVzdCBwcm9jZXNzaW5nLiBBZGQgLXRpbWVvdXQgb3B0aW9uIHRvIG9jc3AgCiAgICAgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBkaWdlc3RzIHRvIHN1cHBseSB0aGVpciBvd24gbWljYWxnIHN0cmluZyBmb3IgUy9NSU1FIHR5cGUgdXNpbmcKICAgICB0aGUgY3RybCBFVlBfTURfQ1RSTF9NSUNBTEcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRHVyaW5nIFBLQ1M3IHNpZ25pbmcgcGFzcyB0aGUgUEtDUzcgU2lnbmVySW5mbyBzdHJ1Y3R1cmUgdG8gdGhlCiAgICAgRVZQX1BLRVlfTUVUSE9EIGJlZm9yZSBhbmQgYWZ0ZXIgc2lnbmluZyB2aWEgdGhlIEVWUF9QS0VZX0NUUkxfUEtDUzdfU0lHTgogICAgIGN0cmwuIEl0IGNhbiB0aGVuIGN1c3RvbWlzZSB0aGUgc3RydWN0dXJlIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgc2lnbmluZwogICAgIGlmIG5lY2Vzc2FyeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0JKX2FkZF9zaWdpZCgpIHRvIGFsbG93IGFwcGxpY2F0aW9uIGRlZmluZWQgc2lnbmF0dXJlIE9JRHMKICAgICB0byBiZSBhZGRlZCB0byBPcGVuU1NMcyBpbnRlcm5hbCB0YWJsZXMuIE5ldyBmdW5jdGlvbiBPQkpfc2lnaWRfZnJlZSgpCiAgICAgdG8gZnJlZSB1cCBhbnkgYWRkZWQgc2lnbmF0dXJlIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFVlBfQ0lQSEVSX2RvX2FsbCgpLCBFVlBfQ0lQSEVSX2RvX2FsbF9zb3J0ZWQoKSwKICAgICBFVlBfTURfZG9fYWxsKCkgYW5kIEVWUF9NRF9kb19hbGxfc29ydGVkKCkgdG8gZW51bWVyYXRlIGludGVybmFsCiAgICAgZGlnZXN0IGFuZCBjaXBoZXIgdGFibGVzLiBOZXcgb3B0aW9ucyBhZGRlZCB0byBvcGVuc3NsIHV0aWxpdHk6CiAgICAgbGlzdC1tZXNzYWdlLWRpZ2VzdC1hbGdvcml0aG1zIGFuZCBsaXN0LWNpcGhlci1hbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgYmluYXJ5IHBvbHlub21pYWxzOiB0aGUgbGlzdAogICAgIG9mIGRlZ3JlZXMgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGlzIG5vdyB0ZXJtaW5hdGVkIHdpdGggLTEuCiAgICAgUHJldmlvdXNseSBpdCB3YXMgdGVybWluYXRlZCB3aXRoIDAsIHdoaWNoIHdhcyBhbHNvIHBhcnQgb2YgdGhlCiAgICAgdmFsdWU7IHRodXMsIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiB3YXMgbm90IGFwcGxpY2FibGUgdG8KICAgICBwb2x5bm9taWFscyB3aGVyZSB0XjAgaGFzIGNvZWZmaWNpZW50IHplcm8uICBUaGlzIGNoYW5nZSBtYWtlcwogICAgIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiB1c2VmdWwgaW4gYSBtb3JlIGdlbmVyYWwgY29udGV4dC4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBWYXJpb3VzIG1vZGlmaWNhdGlvbnMgYW5kIGZpeGVzIHRvIFNTTC9UTFMgY2lwaGVyIHN0cmluZwogICAgIGhhbmRsaW5nLiAgRm9yIEVDQywgdGhlIGNvZGUgbm93IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBmaXhlZCBFQ0RICiAgICAgd2l0aCBSU0EgY2VydGlmaWNhdGVzIG9uIHRoZSBvbmUgaGFuZCBhbmQgd2l0aCBFQ0RTQSBjZXJ0aWZpY2F0ZXMKICAgICBvbiB0aGUgb3RoZXIgaGFuZCwgc2luY2UgdGhlc2UgYXJlIHNlcGFyYXRlIGNpcGhlcnN1aXRlcy4gIFRoZQogICAgIHVudXNlZCBjb2RlIGZvciBGb3J0ZXp6YSBjaXBoZXJzdWl0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4KCiAgICAgRm9yIGNvbnNpc3RlbmN5IHdpdGggRURILCBlcGhlbWVyYWwgRUNESCBpcyBub3cgY2FsbGVkICJFRUNESCIKICAgICAobm90ICJFQ0RIRSIpLiAgRm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGNvZGUgZm9yIERICiAgICAgY2VydGlmaWNhdGVzLCB1c2Ugb2YgRUNESCBjZXJ0aWZpY2F0ZXMgaXMgbm93IGNvbnNpZGVyZWQgRUNESAogICAgIGF1dGhlbnRpY2F0aW9uLCBub3QgUlNBIG9yIEVDRFNBIGF1dGhlbnRpY2F0aW9uICh0aGUgbGF0dGVyIGlzCiAgICAgbWVyZWx5IHRoZSBDQSdzIHNpZ25pbmcgYWxnb3JpdGhtIGFuZCBub3QgYWN0aXZlbHkgdXNlZCBpbiB0aGUKICAgICBwcm90b2NvbCkuCgogICAgIFRoZSB0ZW1wb3JhcnkgY2lwaGVyc3VpdGUgYWxpYXMgIkVDQ2RyYWZ0IiBpcyBubyBsb25nZXIKICAgICBhdmFpbGFibGUsIGFuZCBFQ0MgY2lwaGVyc3VpdGVzIGFyZSBubyBsb25nZXIgZXhjbHVkZWQgZnJvbSAiQUxMIgogICAgIGFuZCAiREVGQVVMVCIuICBUaGUgZm9sbG93aW5nIGFsaWFzZXMgbm93IGV4aXN0IGZvciBSRkMgNDQ5MgogICAgIGNpcGhlcnN1aXRlcywgbW9zdCBvZiB0aGVzZSBieSBhbmFsb2d5IHdpdGggdGhlIERIIGNhc2U6CgogICAgICAgICBrRUNESHIgICAtIEVDREggY2VydCwgc2lnbmVkIHdpdGggUlNBCiAgICAgICAgIGtFQ0RIZSAgIC0gRUNESCBjZXJ0LCBzaWduZWQgd2l0aCBFQ0RTQQogICAgICAgICBrRUNESCAgICAtIEVDREggY2VydCAoc2lnbmVkIHdpdGggZWl0aGVyIFJTQSBvciBFQ0RTQSkKICAgICAgICAga0VFQ0RIICAgLSBlcGhlbWVyYWwgRUNESAogICAgICAgICBFQ0RIICAgICAtIEVDREggY2VydCBvciBlcGhlbWVyYWwgRUNESAoKICAgICAgICAgYUVDREggICAgLSBFQ0RIIGNlcnQKICAgICAgICAgYUVDRFNBICAgLSBFQ0RTQSBjZXJ0CiAgICAgICAgIEVDRFNBICAgIC0gRUNEU0EgY2VydAoKICAgICAgICAgQUVDREggICAgLSBhbm9ueW1vdXMgRUNESAogICAgICAgICBFRUNESCAgICAtIG5vbi1hbm9ueW1vdXMgZXBoZW1lcmFsIEVDREggKGVxdWl2YWxlbnQgdG8gImtFRUNESDotQUVDREgiKQoKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYWRkaXRpb25hbCBTL01JTUUgY2FwYWJpbGl0aWVzIGZvciBBRVMgYW5kIEdPU1QgY2lwaGVycyBpZiBzdXBwb3J0ZWQuCiAgICAgVXNlIGNvcnJlY3QgbWljYWxnIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIGRpZ2VzdChzKSBpbiBzaWduZWQgbWVzc2FnZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZW5naW5lIHN1cHBvcnQgZm9yIEVWUF9QS0VZX0FTTjFfTUVUSE9ELiBBZGQgZnVuY3Rpb25zIHRvIHByb2Nlc3MKICAgICBhbiBFTkdJTkUgYXNuMSBtZXRob2QuIFN1cHBvcnQgRU5HSU5FIGxvb2t1cHMgaW4gdGhlIEFTTjEgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGVuZ2luZSBzdXBwb3J0IGZvciBFVlBfUEtFWV9NRVRIT0QuIE5ldyBmdW5jdGlvbnMgdG8gcGVybWl0CiAgICAgYW4gZW5naW5lIHRvIHJlZ2lzdGVyIGEgbWV0aG9kLiBBZGQgRU5HSU5FIGxvb2t1cHMgZm9yIG1ldGhvZHMgYW5kCiAgICAgZnVuY3Rpb25hbCByZWZlcmVuY2UgcHJvY2Vzc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9EaWdlc3R7U2lnbixWZXJpZnkpKi4gVGhlc2UgYXJlIGVuY2hhbmNlIHZlcnNpb25zIG9mCiAgICAgRVZQX3tTaWduLFZlcmlmeX0qIHdoaWNoIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGN1c3RvbWlzZSB0aGUgc2lnbmF0dXJlCiAgICAgcHJvY2Vzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXJlc2lnbiBvcHRpb24gdG8gc21pbWUgdXRpbGl0eS4gVGhpcyBhZGRzIG9uZSBvciBtb3JlIHNpZ25lcnMKICAgICB0byBhbiBleGlzdGluZyBQS0NTIzcgc2lnbmVkRGF0YSBzdHJ1Y3R1cmUuIEFsc28gLW1kIG9wdGlvbiB0byB1c2UgYW4KICAgICBhbHRlcm5hdGl2ZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHNpZ25pbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGlkeSB1cCBQS0NTIzcgcm91dGluZXMgYW5kIGFkZCBuZXcgZnVuY3Rpb25zIHRvIG1ha2UgaXQgZWFzaWVyIHRvCiAgICAgY3JlYXRlIFBLQ1M3IHN0cnVjdHVyZXMgY29udGFpbmluZyBtdWx0aXBsZSBzaWduZXJzLiBVcGRhdGUgc21pbWUKICAgICBhcHBsaWNhdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIHNpZ25lcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1tYWNhbGcgb3B0aW9uIHRvIHBrY3MxMiB1dGlsaXR5IHRvIGFsbG93IHNldHRpbmcgb2YgYW4gYWx0ZXJuYXRpdmUKICAgICBkaWdlc3QgTUFDLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUFJGcyBvdGhlciB0aGFuIGRlZmF1bHQgU0hBMSBITUFDLgogICAgIFJlb3JnYW5pemUgUEJFIGludGVybmFscyB0byBsb29rdXAgZnJvbSBhIHN0YXRpYyB0YWJsZSB1c2luZyBOSURzLAogICAgIGFkZCBzdXBwb3J0IGZvciBITUFDIFBCRSBPSUQgdHJhbnNsYXRpb24uIEFkZCBhIEVWUF9DSVBIRVIgY3RybDoKICAgICBFVlBfQ1RSTF9QQkVfUFJGX05JRCB0aGlzIGFsbG93cyBhIGNpcGhlciB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgUFJGIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSB1c2VkIHdpdGggUEJFUzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVwbGFjZSB0aGUgYWxnb3JpdGhtIHNwZWNpZmljIGNhbGxzIHRvIGdlbmVyYXRlIGtleXMgaW4gInJlcSIgd2l0aCB0aGUKICAgICBuZXcgQVBJLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBQS0NTIzcgZW52ZWxvcGVkIGRhdGEgcm91dGluZXMgdG8gdXNlIG5ldyBBUEkuIFRoaXMgaXMgbm93CiAgICAgc3VwcG9ydGVkIGJ5IGFueSBwdWJsaWMga2V5IG1ldGhvZCBzdXBwb3J0aW5nIHRoZSBlbmNyeXB0IG9wZXJhdGlvbi4gQQogICAgIGN0cmwgaXMgYWRkZWQgdG8gYWxsb3cgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIHRvIGV4YW1pbmUgb3IgbW9kaWZ5CiAgICAgdGhlIFBLQ1MjNyBSZWNpcGllbnRJbmZvIHN0cnVjdHVyZSBpZiBpdCBuZWVkcyB0bzogZm9yIFJTQSB0aGlzIGlzCiAgICAgYSBubyBvcC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBjdHJsIHRvIGFzbjEgbWV0aG9kIHRvIGFsbG93IGEgcHVibGljIGtleSBhbGdvcml0aG0gdG8gZXhwcmVzcwogICAgIGEgZGVmYXVsdCBkaWdlc3QgdHlwZSB0byB1c2UuIEluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGJlIFNIQTEgYnV0IHNvbWUKICAgICBhbGdvcml0aG1zIChzdWNoIGFzIEdPU1QpIG5lZWQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBkaWdlc3QuIFRoZQogICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaG93IHN0cm9uZyB0aGUgcHJlZmVyZW5jZSBpcyAxIG1lYW5zIG9wdGlvbmFsIGFuZAogICAgIDIgaXMgbWFuZGF0b3J5ICh0aGF0IGlzIGl0IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCB0eXBlKS4gTW9kaWZ5CiAgICAgQVNOMV9pdGVtX3NpZ24oKSB0byBhY2NlcHQgYSBOVUxMIGRpZ2VzdCBhcmd1bWVudCB0byBpbmRpY2F0ZSBpdCBzaG91bGQKICAgICB1c2UgdGhlIGRlZmF1bHQgbWQuIFVwZGF0ZSBvcGVuc3NsIHV0aWxpdGllcyB0byB1c2UgdGhlIGRlZmF1bHQgZGlnZXN0CiAgICAgdHlwZSBmb3Igc2lnbmluZyBpZiBpdCBpcyBub3QgZXhwbGljaXRseSBpbmRpY2F0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIE9JRCBjcm9zcyByZWZlcmVuY2UgdGFibGUgaW4gQVNOMV9zaWduKCkgYW5kIEFTTjFfdmVyaWZ5KCkuIE5ldyAKICAgICBFVlBfTUQgZmxhZyBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUuIFRoaXMgdXNlcyB0aGUgcmVsZXZhbnQKICAgICBzaWduaW5nIG1ldGhvZCBmcm9tIHRoZSBrZXkgdHlwZS4gVGhpcyBlZmZlY3RpdmVseSByZW1vdmVzIHRoZSBsaW5rCiAgICAgYmV0d2VlbiBkaWdlc3RzIGFuZCBwdWJsaWMga2V5IHR5cGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiBPSUQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy4gSXRzIHB1cnBvc2UgaXMgdG8KICAgICB0cmFuc2xhdGUgYmV0d2VlbiBzaWduYXR1cmUgT0lEcyBzdWNoIGFzIFNIQTFXaXRocnNhRW5jcnlwdGlvbiBhbmQgU0hBMSwKICAgICByc2FFbmNyeXB0aW9uLiBUaGlzIHdpbGwgYWxsb3cgc29tZSBvZiB0aGUgYWxnb3JpdGhtIHNwZWNpZmljIGhhY2tlcnkKICAgICBuZWVkZWQgdG8gdXNlIHRoZSBjb3JyZWN0IE9JRCB0byBiZSByZW1vdmVkLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgYWxnb3JpdGhtIHNwZWNpZmljIGRlcGVuZGVuY2llcyB3aGVuIHNldHRpbmcgUEtDUzdfU0lHTkVSX0lORk8KICAgICBzdHJ1Y3R1cmVzIGZvciBQS0NTN19zaWduKCkuIFRoZXkgYXJlIG5vdyBzZXQgdXAgYnkgdGhlIHJlbGV2YW50IHB1YmxpYwogICAgIGtleSBBU04xIG1ldGhvZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdmlzaW9uYWwgRUMgcGtleSBtZXRob2Qgd2l0aCBzdXBwb3J0IGZvciBFQ0RTQSBhbmQgRUNESC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Iga2V5IGRlcml2YXRpb24gKGFncmVlbWVudCkgaW4gdGhlIEFQSSwgREggbWV0aG9kIGFuZAogICAgIHBrZXl1dGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERTQSBwa2V5IG1ldGhvZCBhbmQgREggcGtleSBtZXRob2RzLCBleHRlbmQgREggQVNOMSBtZXRob2QgdG8gc3VwcG9ydAogICAgIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgZm9ybWF0cy4gQXMgYSBzaWRlIGVmZmVjdCB0aGVzZSBhZGQgYWRkaXRpb25hbCAKICAgICBjb21tYW5kIGxpbmUgZnVuY3Rpb25hbGl0eSBub3QgcHJldmlvdXNseSBhdmFpbGFibGU6IERTQSBzaWduYXR1cmVzIGNhbiBiZQogICAgIGdlbmVyYXRlZCBhbmQgdmVyaWZpZWQgdXNpbmcgcGtleXV0bCBhbmQgREgga2V5IHN1cHBvcnQgYW5kIGdlbmVyYXRpb24gaW4KICAgICBwa2V5LCBnZW5wa2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlT1Mgc3VwcG9ydC4KICAgICBbT2xpdmVyIFRhcHBlIDx6b29leUBoaXJzY2hrYWVmZXIuZGU+XQoKICAqKSBOZXcgbWFrZSB0YXJnZXQgImluc3RhbGxfaHRtbF9kb2NzIiBpbnN0YWxscyBIVE1MIHJlbmRpdGlvbnMgb2YgdGhlCiAgICAgbWFudWFsIHBhZ2VzLgogICAgIFtPbGl2ZXIgVGFwcGUgPHpvb2V5QGhpcnNjaGthZWZlci5kZT5dCgogICopIE5ldyB1dGlsaXR5ICJnZW5wa2V5IiB0aGlzIGlzIGFuYWxvZ291cyB0byAiZ2VucnNhIiBldGMgZXhjZXB0IGl0IGNhbgogICAgIGdlbmVyYXRlIGtleXMgZm9yIGFueSBhbGdvcml0aG0uIEV4dGVuZCBhbmQgdXBkYXRlIEVWUF9QS0VZX01FVEhPRCB0bwogICAgIHN1cHBvcnQga2V5IGFuZCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBhbmQgYWRkIGluaXRpYWwga2V5IGdlbmVyYXRpb24KICAgICBmdW5jdGlvbmFsaXR5IGZvciBSU0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9ucyBmb3IgbWFpbiBFVlBfUEtFWV9tZXRob2Qgb3BlcmF0aW9ucy4gVGhlIHVuZG9jdW1lbnRlZAogICAgIGZ1bmN0aW9ucyBFVlBfUEtFWV97ZW5jcnlwdCxkZWNyeXB0fSBoYXZlIGJlZW4gcmVuYW1lZCB0bwogICAgIEVWUF9QS0VZX3tlbmNyeXB0LGRlY3J5cHR9X29sZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBkZWZpbml0aW9ucyBmb3IgRVZQX1BLRVlfTUVUSE9ELiBUaGlzIHdpbGwgYmUgYSBoaWdoIGxldmVsIHB1YmxpYwogICAgIGtleSBBUEksIGRvZXNuJ3QgZG8gbXVjaCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQKICAgICBwdWJsaWMga2V5IGFsZ29yaXRobXMuIE5ldyBvcHRpb24gdG8gb3BlbnNzbCB1dGlsaXR5OgogICAgICJsaXN0LXB1YmxpYy1rZXktYWxnb3JpdGhtcyIgdG8gcHJpbnQgb3V0IGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBTdXBwb3J0ZWQgRWxsaXB0aWMgQ3VydmVzIEV4dGVuc2lvbiBmb3IKICAgICBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTEyLnR4dC4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBEb24ndCBmcmVlIHVwIE9JRHMgaW4gT0JKX2NsZWFudXAoKSBpZiB0aGV5IGFyZSBpbiB1c2UgYnkgRVZQX01EIG9yCiAgICAgRVZQX0NJUEhFUiBzdHJ1Y3R1cmVzIHRvIGF2b2lkIGxhdGVyIHByb2JsZW1zIGluIEVWUF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHV0aWxpdGllcyBwa2V5IGFuZCBwa2V5cGFyYW0uIFRoZXNlIGFyZSBzaW1pbGFyIHRvIGFsZ29yaXRobSBzcGVjaWZpYwogICAgIHV0aWxpdGllcyBzdWNoIGFzIHJzYSwgZHNhLCBkc2FwYXJhbSBldGMgZXhjZXB0IHRoZXkgcHJvY2VzcyBhbnkga2V5CiAgICAgdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUcmFuc2ZlciBwdWJsaWMga2V5IHByaW50aW5nIHJvdXRpbmVzIHRvIEVWUF9QS0VZX0FTTjFfTUVUSE9ELiBOZXcgCiAgICAgZnVuY3Rpb25zIEVWUF9QS0VZX3ByaW50X3B1YmxpYygpLCBFVlBfUEtFWV9wcmludF9wcml2YXRlKCksCiAgICAgRVZQX1BLRVlfcHJpbnRfcGFyYW0oKSB0byBwcmludCBwdWJsaWMga2V5IGRhdGEgZnJvbSBhbiBFVlBfUEtFWQogICAgIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBwdWJsaWMga2V5IEFTTjEuCiAgICAgRGUtc3BhZ2hldHRpZnkgdGhlIHB1YmxpYyBrZXkgQVNOMSBoYW5kbGluZy4gTW92ZSBwdWJsaWMgYW5kIHByaXZhdGUKICAgICBrZXkgQVNOMSBoYW5kbGluZyB0byBhIG5ldyBFVlBfUEtFWV9BU04xX01FVEhPRCBzdHJ1Y3R1cmUuIFJlbG9jYXRlCiAgICAgYWxnb3JpdGhtIHNwZWNpZmljIGhhbmRsaW5nIHRvIGEgc2luZ2xlIG1vZHVsZSB3aXRoaW4gdGhlIHJlbGV2YW50CiAgICAgYWxnb3JpdGhtIGRpcmVjdG9yeS4gQWRkIGZ1bmN0aW9ucyB0byBhbGxvdyAobmVhcikgb3BhcXVlIHByb2Nlc3NpbmcKICAgICBvZiBwdWJsaWMgYW5kIHByaXZhdGUga2V5IHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBTdXBwb3J0ZWQgUG9pbnQgRm9ybWF0cyBFeHRlbnNpb24gZm9yCiAgICAgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgUkZDIDQyNzkgUFNLIFRMUyBjaXBoZXJzdWl0ZXMuIEFkZCBtZW1iZXJzCiAgICAgZm9yIHRoZSBwc2sgaWRlbnRpdHkgW2hpbnRdIGFuZCB0aGUgcHNrIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUKICAgICBTU0xfU0VTU0lPTiwgU1NMIGFuZCBTU0xfQ1RYIHN0cnVjdHVyZS4KICAgICAKICAgICBOZXcgY2lwaGVyc3VpdGVzOgogICAgICAgICBQU0stUkM0LVNIQSwgUFNLLTNERVMtRURFLUNCQy1TSEEsIFBTSy1BRVMxMjgtQ0JDLVNIQSwKICAgICAgICAgUFNLLUFFUzI1Ni1DQkMtU0hBCiAKICAgICBOZXcgZnVuY3Rpb25zOgogICAgICAgICBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludAogICAgICAgICBTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50CiAgICAgICAgIFNTTF9nZXRfcHNrX2lkZW50aXR5CiAgICAgICAgIFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQKCiAgICAgW01pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mIE5va2lhIENvcnBvcmF0aW9uXQoKICAqKSBBZGQgUkZDIDMxNjEgY29tcGxpYW50IHRpbWUgc3RhbXAgcmVxdWVzdCBjcmVhdGlvbiwgcmVzcG9uc2UgZ2VuZXJhdGlvbgogICAgIGFuZCByZXNwb25zZSB2ZXJpZmljYXRpb24gZnVuY3Rpb25hbGl0eS4KICAgICBbWm9sdOFuIEds83ppayA8emdsb3ppa0BvcGVudHNhLm9yZz4sIFRoZSBPcGVuVFNBIFByb2plY3RdCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFRMUyBleHRlbnNpb25zLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzZXJ2ZXJfbmFtZQogICAgIGV4dGVuc2lvbiBzbyBmYXIuICBUaGUgU1NMX1NFU1NJT04sIFNTTF9DVFgsIGFuZCBTU0wgZGF0YSBzdHJ1Y3R1cmVzIG5vdwogICAgIGhhdmUgbmV3IG1lbWJlcnMgZm9yIGEgaG9zdCBuYW1lLiAgVGhlIFNTTCBkYXRhIHN0cnVjdHVyZSBoYXMgYW4KICAgICBhZGRpdGlvbmFsIG1lbWJlciBTU0xfQ1RYICppbml0aWFsX2N0eCBzbyB0aGF0IG5ldyBzZXNzaW9ucyBjYW4gYmUKICAgICBzdG9yZWQgaW4gdGhhdCBjb250ZXh0IHRvIGFsbG93IGZvciBzZXNzaW9uIHJlc3VtcHRpb24sIGV2ZW4gYWZ0ZXIgdGhlCiAgICAgU1NMIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgbmV3IFNTTF9DVFggaW4gcmVhY3Rpb24gdG8gYSBjbGllbnQncwogICAgIHNlcnZlcl9uYW1lIGV4dGVuc2lvbi4KCiAgICAgTmV3IGZ1bmN0aW9ucyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lKCkKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUoKQogICAgICAgICBTU0xfc2V0X1NTTF9DVFgoKQoKICAgICBOZXcgQ1RSTCBjb2RlcyBhbmQgbWFjcm9zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjaygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9BUkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUUgICAgICAgICAgIC0gU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCkKCiAgICAgb3BlbnNzbCBzX2NsaWVudCBoYXMgYSBuZXcgJy1zZXJ2ZXJuYW1lIC4uLicgb3B0aW9uLgoKICAgICBvcGVuc3NsIHNfc2VydmVyIGhhcyBuZXcgb3B0aW9ucyAnLXNlcnZlcm5hbWVfaG9zdCAuLi4nLCAnLWNlcnQyIC4uLicsCiAgICAgJy1rZXkyIC4uLicsICctc2VydmVybmFtZV9mYXRhbCcgKHN1YmplY3QgdG8gY2hhbmdlKS4gIFRoaXMgYWxsb3dzCiAgICAgdGVzdGluZyB0aGUgSG9zdE5hbWUgZXh0ZW5zaW9uIGZvciBhIHNwZWNpZmljIHNpbmdsZSBob3N0IG5hbWUgKCctY2VydCcKICAgICBhbmQgJy1rZXknIHJlbWFpbiBmYWxsYmFja3MgZm9yIGhhbmRzaGFrZXMgd2l0aG91dCBIb3N0TmFtZQogICAgIG5lZ290aWF0aW9uKS4gIElmIHRoZSB1bnJlY29nbml6ZWRfbmFtZSBhbGVydCBoYXMgdG8gYmUgc2VudCwgdGhpcyBieQogICAgIGRlZmF1bHQgaXMgYSB3YXJuaW5nOyBpdCBiZWNvbWVzIGZhdGFsIHdpdGggdGhlICctc2VydmVybmFtZV9mYXRhbCcKICAgICBvcHRpb24uCgogICAgIFtQZXRlciBTeWx2ZXN0ZXIsICBSZW15IEFsbGFpcywgQ2hyaXN0b3BoZSBSZW5vdV0KCiAgKikgV2hpcmxwb29sIGhhc2ggaW1wbGVtZW50YXRpb24gaXMgYWRkZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJJR05VTSBjb2RlIG9uIDY0LWJpdCBTUEFSQ3Y5IHRhcmdldHMgaXMgc3dpdGNoZWQgZnJvbSBibig2NCw2NCkgdG8KICAgICBibig2NCwzMikuIEJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gc2V0IGxpbWl0YXRpb25zIGl0IGRvZXNuJ3QgaGF2ZQogICAgIGFueSBuZWdhdGl2ZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuIFRoaXMgd2FzIGRvbmUgbW9zdGx5IGluIG9yZGVyCiAgICAgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBzaGFyZSBhc3NlbWJsZXIgbW9kdWxlcywgc3VjaCBhcyBibl9tdWxfbW9udAogICAgIGltcGxlbWVudGF0aW9ucywgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBidWlsZHMgd2l0aG91dCBoYXNzbGUuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vdmUgY29kZSBwcmV2aW91c2x5IGV4aWxlZCBpbnRvIGZpbGUgY3J5cHRvL2VjL2VjMl9zbXB0LmMKICAgICB0byBlYzJfc21wbC5jLCBhbmQgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIE9QRU5TU0xfRUNfQklOX1BUX0NPTVAKICAgICBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgY2FuZGlkYXRlIGZvciBCSUdOVU0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLCBibl9tdWxfbW9udCwKICAgICBkZWRpY2F0ZWQgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBwcm9jZWR1cmUsIGlzIGludHJvZHVjZWQuCiAgICAgQk5fTU9OVF9DVFggaXMgbW9kaWZpZWQgdG8gYWxsb3cgYm5fbXVsX21vbnQgdG8gcmVhY2ggZm9yIGhpZ2hlcgogICAgICI2NC1iaXQiIHBlcmZvcm1hbmNlIG9uIGNlcnRhaW4gMzItYml0IHRhcmdldHMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyBvcHRpb24gU1NMX09QX05PX0NPTVAgdG8gZGlzYWJsZSB1c2Ugb2YgY29tcHJlc3Npb24gc2VsZWN0aXZlbHkKICAgICBpbiBTU0wgc3RydWN0dXJlcy4gTmV3IFNTTCBjdHJsIHRvIHNldCBtYXhpbXVtIHNlbmQgZnJhZ21lbnQgc2l6ZS4gCiAgICAgU2F2ZSBtZW1vcnkgYnkgc2VldGluZyB0aGUgSS9PIGJ1ZmZlciBzaXplcyBkeW5hbWljYWxseSBpbnN0ZWFkIG9mCiAgICAgdXNpbmcgdGhlIG1heGltdW0gYXZhaWxhYmxlIHZhbHVlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLVYgZm9yICdvcGVuc3NsIGNpcGhlcnMnLiBUaGlzIHByaW50cyB0aGUgY2lwaGVyc3VpdGUgY29kZQogICAgIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXh0IGRldGFpbHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVmVyeSwgdmVyeSBwcmVsaW1pbmFyeSBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgcHJpbnRpbmcgb2YgZ2VuZXJhbAogICAgIEFTTjEgc3RydWN0dXJlcy4gVGhpcyBjdXJyZW50bHkgcHJvZHVjZXMgcmF0aGVyIHVnbHkgb3V0cHV0IGFuZCBkb2Vzbid0CiAgICAgaGFuZGxlIHNldmVyYWwgY3VzdG9taXNlZCBzdHJ1Y3R1cmVzIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnRlZ3JhdGVkIHN1cHBvcnQgZm9yIFBWSyBmaWxlIGZvcm1hdCBhbmQgc29tZSByZWxhdGVkIGZvcm1hdHMgc3VjaAogICAgIGFzIE1TIFBVQkxJQ0tFWUJMT0IgYW5kIFBSSVZBVEVLRVlCTE9CLiBDb21tYW5kIGxpbmUgc3dpdGNoZXMgdG8gc3VwcG9ydAogICAgIHRoZXNlIGluIHRoZSAncnNhJyBhbmQgJ2RzYScgdXRpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjMSBSU0FQdWJsaWNLZXkgZm9ybWF0IG9uIHJzYSB1dGlsaXR5IGNvbW1hbmQgbGluZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgdGhlIGFuY2llbnQgQVNOMV9NRVRIT0QgY29kZS4gVGhpcyB3YXMgb25seSBldmVyIHVzZWQgaW4gb25lCiAgICAgcGxhY2UgZm9yIHRoZSAodmVyeSBvbGQpICJORVRTQ0FQRSIgZm9ybWF0IGNlcnRpZmljYXRlcyB3aGljaCBhcmUgbm93CiAgICAgaGFuZGxlZCB1c2luZyBuZXcgQVNOMSBjb2RlIGVxdWl2YWxlbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExldCB0aGUgVExTdjFfbWV0aG9kKCkgZXRjLiBmdW5jdGlvbnMgcmV0dXJuIGEgJ2NvbnN0JyBTU0xfTUVUSE9ECiAgICAgcG9pbnRlciBhbmQgbWFrZSB0aGUgU1NMX01FVEhPRCBwYXJhbWV0ZXIgaW4gU1NMX0NUWF9uZXcsCiAgICAgU1NMX0NUWF9zZXRfc3NsX3ZlcnNpb24gYW5kIFNTTF9zZXRfc3NsX21ldGhvZCAnY29uc3QnLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgTW9kaWZ5IENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGV4dGVuc2lvbiBjb2RlIHRvIHByaW50IG91dCBwcmV2aW91c2x5CiAgICAgdW5zdXBwb3J0ZWQgZmllbGRzLiBFbmhhbmNlIGV4dGVuc2lvbiBzZXR0aW5nIGNvZGUgdG8gYWxsb3cgc2V0dGluZyBvZgogICAgIGFsbCBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByaW50IGFuZCBzZXQgc3VwcG9ydCBmb3IgSXNzdWluZyBEaXN0cmlidXRpb24gUG9pbnQgQ1JMIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgJ0NvbmZpZ3VyZScgc2NyaXB0IHRvIGVuYWJsZSBDYW1lbGxpYSBieSBkZWZhdWx0LgogICAgIFtOVFRdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44eCBhbmQgMC45Ljh5IFs1IEZlYiAyMDEzXQoKICAqKSBNYWtlIHRoZSBkZWNvZGluZyBvZiBTU0x2MywgVExTIGFuZCBEVExTIENCQyByZWNvcmRzIGNvbnN0YW50IHRpbWUuCgogICAgIFRoaXMgYWRkcmVzc2VzIHRoZSBmbGF3IGluIENCQyByZWNvcmQgcHJvY2Vzc2luZyBkaXNjb3ZlcmVkIGJ5IAogICAgIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24uIERldGFpbHMgb2YgdGhpcyBhdHRhY2sgY2FuIGJlIGZvdW5kCiAgICAgYXQ6IGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvdGxzLyAgICAgCgogICAgIFRoYW5rcyBnbyB0byBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIG9mIHRoZSBJbmZvcm1hdGlvbgogICAgIFNlY3VyaXR5IEdyb3VwIGF0IFJveWFsIEhvbGxvd2F5LCBVbml2ZXJzaXR5IG9mIExvbmRvbgogICAgICh3d3cuaXNnLnJodWwuYWMudWspIGZvciBkaXNjb3ZlcmluZyB0aGlzIGZsYXcgYW5kIEFkYW0gTGFuZ2xleSBhbmQKICAgICBFbWlsaWEgS+RzcGVyIGZvciB0aGUgaW5pdGlhbCBwYXRjaC4KICAgICAoQ1ZFLTIwMTMtMDE2OSkKICAgICBbRW1pbGlhIEvkc3BlciwgQWRhbSBMYW5nbGV5LCBCZW4gTGF1cmllLCBBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogICopIFJldHVybiBhbiBlcnJvciB3aGVuIGNoZWNraW5nIE9DU1Agc2lnbmF0dXJlcyB3aGVuIGtleSBpcyBOVUxMLgogICAgIFRoaXMgZml4ZXMgYSBEb1MgYXR0YWNrLiAoQ1ZFLTIwMTMtMDE2NikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDYWxsIE9DU1AgU3RhcGxpbmcgY2FsbGJhY2sgYWZ0ZXIgY2lwaGVyc3VpdGUgaGFzIGJlZW4gY2hvc2VuLCBzbwogICAgIHRoZSByaWdodCByZXNwb25zZSBpcyBzdGFwbGVkLiBBbHNvIGNoYW5nZSBTU0xfZ2V0X2NlcnRpZmljYXRlKCkKICAgICBzbyBpdCByZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBhY3R1YWxseSBzZW50LgogICAgIFNlZSBodHRwOi8vcnQub3BlbnNzbC5vcmcvVGlja2V0L0Rpc3BsYXkuaHRtbD9pZD0yODM2LgogICAgIChUaGlzIGlzIGEgYmFja3BvcnQpCiAgICAgW1JvYiBTdHJhZGxpbmcgPHJvYi5zdHJhZGxpbmdAY29tb2RvLmNvbT5dCgogICopIEZpeCBwb3NzaWJsZSBkZWFkbG9jayB3aGVuIGRlY29kaW5nIHB1YmxpYyBrZXlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44dyBhbmQgMC45Ljh4IFsxMCBNYXkgMjAxMl0KCiAgKikgU2FuaXR5IGNoZWNrIHJlY29yZCBsZW5ndGggYmVmb3JlIHNraXBwaW5nIGV4cGxpY2l0IElWIGluIERUTFMKICAgICB0byBmaXggRG9TIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIENvZGVub21pY29uIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlIHVzaW5nIEZ1enotby1NYXRpYwogICAgIGZ1enppbmcgYXMgYSBzZXJ2aWNlIHRlc3RpbmcgcGxhdGZvcm0uCiAgICAgKENWRS0yMDEyLTIzMzMpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGlzZSB0a2V5bGVuIHByb3Blcmx5IHdoZW4gZW5jcnlwdGluZyBDTVMgbWVzc2FnZXMuCiAgICAgVGhhbmtzIHRvIFNvbGFyIERlc2lnbmVyIG9mIE9wZW53YWxsIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOHYgYW5kIDAuOS44dyBbMjMgQXByIDIwMTJdCgogICopIFRoZSBmaXggZm9yIENWRS0yMDEyLTIxMTAgZGlkIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGF0IHRoZSAKICAgICAnbGVuJyBhcmd1bWVudCB0byBCVUZfTUVNX2dyb3cgYW5kIEJVRl9NRU1fZ3Jvd19jbGVhbiBpcyBhbgogICAgIGludCBpbiBPcGVuU1NMIDAuOS44LCBtYWtpbmcgaXQgc3RpbGwgdnVsbmVyYWJsZS4gRml4IGJ5IAogICAgIHJlamVjdGluZyBuZWdhdGl2ZSBsZW4gcGFyYW1ldGVyLiAoQ1ZFLTIwMTItMjEzMSkKICAgICBbVG9tYXMgSG9nZXIgPHRob2dlckByZWRoYXQuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45Ljh1IGFuZCAwLjkuOHYgWzE5IEFwciAyMDEyXQoKICAqKSBDaGVjayBmb3IgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgb3ZlcmZsb3dzIGluIGFzbjFfZDJpX3JlYWRfYmlvCiAgICAgQlVGX21lbV9ncm93IGFuZCBCVUZfbWVtX2dyb3dfY2xlYW4uIFJlZnVzZSBhdHRlbXB0cyB0byBzaHJpbmsgYnVmZmVyCiAgICAgaW4gQ1JZUFRPX3JlYWxsb2NfY2xlYW4uCgogICAgIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbSwgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBpc3N1ZSBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZml4aW5nIGl0LgogICAgIChDVkUtMjAxMi0yMTEwKQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSksIFRhdmlzIE9ybWFuZHksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOHQgYW5kIDAuOS44dSBbMTIgTWFyIDIwMTJdCgogICopIEZpeCBNTUEgKEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBSU0EgcGFkZGluZykgd2Vha25lc3MKICAgICBpbiBDTVMgYW5kIFBLQ1M3IGNvZGUuIFdoZW4gUlNBIGRlY3J5cHRpb24gZmFpbHMgdXNlIGEgcmFuZG9tIGtleSBmb3IKICAgICBjb250ZW50IGRlY3J5cHRpb24gYW5kIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgZXJyb3IuIE5vdGU6IHRoaXMgYXR0YWNrCiAgICAgbmVlZHMgb24gYXZlcmFnZSAyXjIwIG1lc3NhZ2VzIHNvIGl0IG9ubHkgYWZmZWN0cyBhdXRvbWF0ZWQgc2VuZGVycy4gVGhlCiAgICAgb2xkIGJlaGF2aW91ciBjYW4gYmUgcmVlbmFibGVkIGluIHRoZSBDTVMgY29kZSBieSBzZXR0aW5nIHRoZQogICAgIENNU19ERUJVR19ERUNSWVBUIGZsYWc6IHRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgd2hlcmUKICAgICBhbiBNTUEgZGVmZW5jZSBpcyBub3QgbmVjZXNzYXJ5LgogICAgIFRoYW5rcyB0byBJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+IGZvciBkaXNjb3ZlcmluZwogICAgIHRoaXMgaXNzdWUuIChDVkUtMjAxMi0wODg0KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBDVkUtMjAxMS00NjE5OiBtYWtlIHN1cmUgd2UgcmVhbGx5IGFyZSByZWNlaXZpbmcgYSAKICAgICBjbGllbnQgaGVsbG8gYmVmb3JlIHJlamVjdGluZyBtdWx0aXBsZSBTR0MgcmVzdGFydHMuIFRoYW5rcyB0bwogICAgIEl2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44cyBhbmQgMC45Ljh0IFsxOCBKYW4gMjAxMl0KCiAgKikgRml4IGZvciBEVExTIERvUyBpc3N1ZSBpbnRyb2R1Y2VkIGJ5IGZpeCBmb3IgQ1ZFLTIwMTEtNDEwOS4KICAgICBUaGFua3MgdG8gQW50b25pbyBNYXJ0aW4sIEVudGVycHJpc2UgU2VjdXJlIEFjY2VzcyBSZXNlYXJjaCBhbmQKICAgICBEZXZlbG9wbWVudCwgQ2lzY28gU3lzdGVtcywgSW5jLiBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kCiAgICAgcHJlcGFyaW5nIGEgZml4LiAoQ1ZFLTIwMTItMDA1MCkKICAgICBbQW50b25pbyBNYXJ0aW5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ciBhbmQgMC45LjhzIFs0IEphbiAyMDEyXQoKICAqKSBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIGhhdmUgZGlzY292ZXJlZCBhbiBleHRlbnNpb24KICAgICBvZiB0aGUgVmF1ZGVuYXkgcGFkZGluZyBvcmFjbGUgYXR0YWNrIG9uIENCQyBtb2RlIGVuY3J5cHRpb24KICAgICB3aGljaCBlbmFibGVzIGFuIGVmZmljaWVudCBwbGFpbnRleHQgcmVjb3ZlcnkgYXR0YWNrIGFnYWluc3QKICAgICB0aGUgT3BlblNTTCBpbXBsZW1lbnRhdGlvbiBvZiBEVExTLiBUaGVpciBhdHRhY2sgZXhwbG9pdHMgdGltaW5nCiAgICAgZGlmZmVyZW5jZXMgYXJpc2luZyBkdXJpbmcgZGVjcnlwdGlvbiBwcm9jZXNzaW5nLiBBIHJlc2VhcmNoCiAgICAgcGFwZXIgZGVzY3JpYmluZyB0aGlzIGF0dGFjayBjYW4gYmUgZm91bmQgYXQ6CiAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvfmtwL2R0bHMucGRmCiAgICAgVGhhbmtzIGdvIHRvIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gb2YgdGhlIEluZm9ybWF0aW9uCiAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgKHd3dy5pc2cucmh1bC5hYy51aykgZm9yIGRpc2NvdmVyaW5nIHRoaXMgZmxhdyBhbmQgdG8gUm9iaW4gU2VnZ2VsbWFubgogICAgIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPiBhbmQgTWljaGFlbCBUdWV4ZW4gPHR1ZXhlbkBmaC1tdWVuc3Rlci5kZT4KICAgICBmb3IgcHJlcGFyaW5nIHRoZSBmaXguIChDVkUtMjAxMS00MTA4KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBNaWNoYWVsIFR1ZXhlbl0KCiAgKikgU3RvcCBwb2xpY3kgY2hlY2sgZmFpbHVyZSBmcmVlaW5nIHNhbWUgYnVmZmVyIHR3aWNlLiAoQ1ZFLTIwMTEtNDEwOSkKICAgICBbQmVuIExhdXJpZSwgS2FzcGVyIDxla2FzcGVyQGdvb2dsZS5jb20+XQoKICAqKSBDbGVhciBieXRlcyB1c2VkIGZvciBibG9jayBwYWRkaW5nIG9mIFNTTCAzLjAgcmVjb3Jkcy4KICAgICAoQ1ZFLTIwMTEtNDU3NikKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBPbmx5IGFsbG93IG9uZSBTR0MgaGFuZHNoYWtlIHJlc3RhcnQgZm9yIFNTTC9UTFMuIFRoYW5rcyB0byBHZW9yZ2UKICAgICBLYWRpYW5ha2lzIDxkZXNuYWNrZWRAZ21haWwuY29tPiBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZSBhbmQKICAgICBBZGFtIExhbmdsZXkgZm9yIHByZXBhcmluZyB0aGUgZml4LiAoQ1ZFLTIwMTEtNDYxOSkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQogCiAgKikgUHJldmVudCBtYWxmb3JtZWQgUkZDMzc3OSBkYXRhIHRyaWdnZXJpbmcgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCiAgICAgVGhhbmtzIHRvIEFuZHJldyBDaGksIEJCTiBUZWNobm9sb2dpZXMsIGZvciBkaXNjb3ZlcmluZyB0aGUgZmxhdwogICAgIGFuZCBSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+IGZvciBmaXhpbmcgaXQuIChDVkUtMjAxMS00NTc3KQogICAgIFtSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+XQoKICAqKSBGaXggc3NsX2NpcGguYyBzZXQtdXAgcmFjZS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggc3B1cmlvdXMgZmFpbHVyZXMgaW4gZWNkc2F0ZXN0LmMuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEZpeCB0aGUgQklPX2ZfYnVmZmVyKCkgaW1wbGVtZW50YXRpb24gKHdoaWNoIHdhcyBtaXhpbmcgZGlmZmVyZW50CiAgICAgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSAnLi4uX2xlbicgZmllbGRzKS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggaGFuZGxpbmcgb2YgQk5fQkxJTkRJTkc6IG5vdyBCTl9CTElORElOR19pbnZlcnRfZXggKHJhdGhlciB0aGFuCiAgICAgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KSBjYWxscyBCTl9CTElORElOR191cGRhdGUsIGVuc3VyaW5nIHRoYXQgY29uY3VycmVudAogICAgIHRocmVhZHMgd29uJ3QgcmV1c2UgdGhlIHNhbWUgYmxpbmRpbmcgY29lZmZpY2llbnRzLgoKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBuZWVkIHRvIG9idGFpbiB0aGUgQ1JZUFRPX0xPQ0tfUlNBX0JMSU5ESU5HCiAgICAgbG9jayB0byBjYWxsIEJOX0JMSU5ESU5HX2ludmVydF9leCwgYW5kIGF2b2lkcyBvbmUgdXNlIG9mCiAgICAgQk5fQkxJTkRJTkdfdXBkYXRlIGZvciBlYWNoIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSAocHJldmlvdXNseSwKICAgICB0aGUgbGFzdCB1cGRhdGUgYWx3YXlzIHJlbWFpbmVkIHVudXNlZCkuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEZpeCBTU0wgbWVtb3J5IGhhbmRsaW5nIGZvciAoRUMpREggY2lwaGVyc3VpdGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgZm9yIG11bHRpLXRocmVhZGVkIHVzZSBvZiBFQ0RILgogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSldCgogICopIEZpeCB4NTA5X25hbWVfZXhfZDJpIG1lbW9yeSBsZWFrIG9uIGJhZCBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHByb3RlY3Rpb24gYWdhaW5zdCBFQ0RTQSB0aW1pbmcgYXR0YWNrcyBhcyBtZW50aW9uZWQgaW4gdGhlIHBhcGVyCiAgICAgYnkgQmlsbHkgQm9iIEJydW1sZXkgYW5kIE5pY29sYSBUdXZlcmksIHNlZToKCglodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMTEvMjMyLnBkZgoKICAgICBbQmlsbHkgQm9iIEJydW1sZXkgYW5kIE5pY29sYSBUdXZlcmldCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44cSBhbmQgMC45LjhyIFs4IEZlYiAyMDExXQoKICAqKSBGaXggcGFyc2luZyBvZiBPQ1NQIHN0YXBsaW5nIENsaWVudEhlbGxvIGV4dGVuc2lvbi4gQ1ZFLTIwMTEtMDAxNAogICAgIFtOZWVsIE1laHRhLCBBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlciAoR29vZ2xlKV0KCiAgKikgRml4IGJ1ZyBpbiBzdHJpbmcgcHJpbnRpbmcgY29kZTogaWYgKmFueSogZXNjYXBpbmcgaXMgZW5hYmxlZCB3ZSBtdXN0CiAgICAgZXNjYXBlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIChiYWNrc2xhc2gpIG9yIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzCiAgICAgYW1iaWd1b3VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44cCBhbmQgMC45LjhxIFsyIERlYyAyMDEwXQoKICAqKSBEaXNhYmxlIGNvZGUgd29ya2Fyb3VuZCBmb3IgYW5jaWVudCBhbmQgb2Jzb2xldGUgTmV0c2NhcGUgYnJvd3NlcnMKICAgICBhbmQgc2VydmVyczogYW4gYXR0YWNrZXIgY2FuIHVzZSBpdCBpbiBhIGNpcGhlcnN1aXRlIGRvd25ncmFkZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIE1hcnRpbiBSZXggZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLiBDVkUtMjAxMC00MTgwCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgSi1QQUtFIGltcGxlbWVudGF0aW9uIGVycm9yLCBvcmlnaW5hbGx5IGRpc2NvdmVyZWQgYnkKICAgICBTZWJhc3RpZW4gTWFydGluaSwgZnVydGhlciBpbmZvIGFuZCBjb25maXJtYXRpb24gZnJvbSBTdGVmYW4KICAgICBBcmVudHogYW5kIEZlbmcgSGFvLiBOb3RlIHRoYXQgdGhpcyBmaXggaXMgYSBzZWN1cml0eSBmaXguIENWRS0yMDEwLTQyNTIKICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhvIGFuZCAwLjkuOHAgWzE2IE5vdiAyMDEwXQoKICAqKSBGaXggZXh0ZW5zaW9uIGNvZGUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoaWNoIGNhbiByZXN1bHQgaW4gYSBidWZmZXIKICAgICBvdmVycnVuIHZ1bG5lcmFiaWxpdHk6IHJlc3VtZWQgc2Vzc2lvbnMgbXVzdCBub3QgYmUgbW9kaWZpZWQgYXMgdGhleSBjYW4KICAgICBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gQ1ZFLTIwMTAtMzg2NAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgZG91YmxlIGZyZWUgYnVnIGluIHNzbC9zM19jbG50LmMgQ1ZFLTIwMTAtMjkzOQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERvbid0IHJlZW5jb2RlIGNlcnRpZmljYXRlIHdoZW4gY2FsY3VsYXRpbmcgc2lnbmF0dXJlOiBjYWNoZSBhbmQgdXNlCiAgICAgdGhlIG9yaWdpbmFsIGVuY29kaW5nIGluc3RlYWQuIFRoaXMgbWFrZXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBvZgogICAgIHNvbWUgYnJva2VuIGVuY29kaW5ncyB3b3JrIGNvcnJlY3RseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBlYzJfR0YybV9zaW1wbGVfbXVsIGJ1Z2ZpeDogY29tcHV0ZSBjb3JyZWN0IHJlc3VsdCBpZiB0aGUgb3V0cHV0IEVDX1BPSU5UCiAgICAgaXMgYWxzbyBvbmUgb2YgdGhlIGlucHV0cy4KICAgICBbRW1pbGlhIEvkc3BlciA8ZW1pbGlhLmthc3BlckBlc2F0Lmt1bGV1dmVuLmJlPiAoR29vZ2xlKV0KCiAgKikgRG9uJ3QgcmVwZWF0ZWRseSBhcHBlbmQgUEJFIGFsZ29yaXRobXMgdG8gdGFibGUgaWYgdGhleSBhbHJlYWR5IGV4aXN0LgogICAgIFNvcnQgdGFibGUgb24gZWFjaCBuZXcgYWRkLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIHRoZSB0YWJsZSByZWFkIG9ubHkKICAgICBhZnRlciBhbGwgYWxnb3JpdGhtcyBhcmUgYWRkZWQgYW5kIHN1YnNlcXVlbnQgY2FsbHMgdG8gUEtDUzEyX3BiZV9hZGQKICAgICBldGMgYXJlIG5vbi1vcC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOG4gYW5kIDAuOS44byBbMDEgSnVuIDIwMTBdCgogIFtOQjogT3BlblNTTCAwLjkuOG8gYW5kIGxhdGVyIDAuOS44IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAxLjAuMC5dCgogICopIENvcnJlY3QgYSB0eXBvIGluIHRoZSBDTVMgQVNOMSBtb2R1bGUgd2hpY2ggY2FuIHJlc3VsdCBpbiBpbnZhbGlkIG1lbW9yeQogICAgIGFjY2VzcyBvciBmcmVlaW5nIGRhdGEgdHdpY2UgKENWRS0yMDEwLTA3NDIpCiAgICAgW1N0ZXZlIEhlbnNvbiwgUm9uYWxkIE1vZXNiZXJnZW4gPGludGVyY29tbWl0QGdtYWlsLmNvbT5dCgogICopIEFkZCBTSEEyIGFsZ29yaXRobXMgdG8gU1NMX2xpYnJhcnlfaW5pdCgpLiBTSEEyIGlzIGJlY29taW5nIGZhciBtb3JlCiAgICAgY29tbW9uIGluIGNlcnRpZmljYXRlcyBhbmQgc29tZSBhcHBsaWNhdGlvbnMgd2hpY2ggb25seSBjYWxsCiAgICAgU1NMX2xpYnJhcnlfaW5pdCBhbmQgbm90IE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgd2lsbCBmYWlsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZNUyBmaXhlczogCiAgICAgUmVkdWNlIGNvcHlpbmcgaW50byAuYXBwcyBhbmQgLnRlc3QgaW4gbWFrZXZtcy5jb20KICAgICBEb24ndCB0cnkgdG8gdXNlIGJsYW5rIENBIGNlcnRpZmljYXRlIGluIENBLmNvbQogICAgIEFsbG93IHVzZSBvZiBDIGZpbGVzIGZyb20gb3JpZ2luYWwgZGlyZWN0b3JpZXMgaW4gbWFrZXRlc3RzLmNvbQogICAgIFtTdGV2ZW4gTS4gU2Nod2VkYSIgPHNtc0BhbnRpbm9kZS5pbmZvPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhtIGFuZCAwLjkuOG4gWzI0IE1hciAyMDEwXQoKICAqKSBXaGVuIHJlamVjdGluZyBTU0wvVExTIHJlY29yZHMgZHVlIHRvIGFuIGluY29ycmVjdCB2ZXJzaW9uIG51bWJlciwgbmV2ZXIKICAgICB1cGRhdGUgcy0+c2VydmVyIHdpdGggYSBuZXcgbWFqb3IgdmVyc2lvbiBudW1iZXIuICBBcyBvZgogICAgIC0gT3BlblNTTCAwLjkuOG0gaWYgJ3Nob3J0JyBpcyBhIDE2LWJpdCB0eXBlLAogICAgIC0gT3BlblNTTCAwLjkuOGYgaWYgJ3Nob3J0JyBpcyBsb25nZXIgdGhhbiAxNiBiaXRzLAogICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvciBjb3VsZCByZXN1bHQgaW4gYSByZWFkIGF0dGVtcHQgYXQgTlVMTCB3aGVuCiAgICAgcmVjZWl2aW5nIHNwZWNpZmljIGluY29ycmVjdCBTU0wvVExTIHJlY29yZHMgb25jZSByZWNvcmQgcGF5bG9hZAogICAgIHByb3RlY3Rpb24gaXMgYWN0aXZlLiAgKENWRS0yMDEwLTA3NDApCiAgICAgW0JvZG8gTW9lbGxlciwgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPl0KCiAgKikgRml4IGZvciBDVkUtMjAxMC0wNDMzIHdoZXJlIHNvbWUga2VyYmVyb3MgZW5hYmxlZCB2ZXJzaW9ucyBvZiBPcGVuU1NMIAogICAgIGNvdWxkIGJlIGNyYXNoZWQgaWYgdGhlIHJlbGV2YW50IHRhYmxlcyB3ZXJlIG5vdCBwcmVzZW50IChlLmcuIGNocm9vdGVkKS4KICAgICBbVG9tYXMgSG9nZXIgPHRob2dlckByZWRoYXQuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhsIGFuZCAwLjkuOG0gWzI1IEZlYiAyMDEwXQoKICAqKSBBbHdheXMgY2hlY2sgYm5fd2V4cGVuZCgpIHJldHVybiB2YWx1ZXMgZm9yIGZhaWx1cmUuICAoQ1ZFLTIwMDktMzI0NSkKICAgICBbTWFydGluIE9sc3NvbiwgTmVlbCBNZWh0YV0KCiAgKikgRml4IFg1MDlfU1RPUkUgbG9ja2luZzogRXZlcnkgJ29ianMnIGFjY2VzcyByZXF1aXJlcyBhIGxvY2sgKHRvCiAgICAgYWNjb21tb2RhdGUgZm9yIHN0YWNrIHNvcnRpbmcsIGFsd2F5cyBhIHdyaXRlIGxvY2shKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPbiBzb21lIHZlcnNpb25zIG9mIFdJTjMyIEhlYXAzMk5leHQgaXMgdmVyeSBzbG93LiBUaGlzIGNhbiBjYXVzZQogICAgIGV4Y2Vzc2l2ZSBkZWxheXMgaW4gdGhlIFJBTkRfcG9sbCgpOiBvdmVyIGEgbWludXRlLiBBcyBhIHdvcmthcm91bmQKICAgICBpbmNsdWRlIGEgdGltZSBjaGVjayBpbiB0aGUgaW5uZXIgSGVhcDMyTmV4dCBsb29wIHRvby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgY29kZSB0aGF0IGhhbmRsZWQgZmx1c2hpbmcgb2YgZGF0YSBpbiBTU0wvVExTIG9yaWdpbmFsbHkgdXNlZCB0aGUKICAgICBCSU9fQ1RSTF9JTkZPIGN0cmwgdG8gc2VlIGlmIGFueSBkYXRhIHdhcyBwZW5kaW5nIGZpcnN0LiBUaGlzIGNhdXNlZAogICAgIHRoZSBwcm9ibGVtIG91dGxpbmVkIGluIFBSIzE5NDkuIFRoZSBmaXggc3VnZ2VzdGVkIHRoZXJlIGhvd2V2ZXIgY2FuCiAgICAgdHJpZ2dlciBwcm9ibGVtcyB3aXRoIGJ1Z2d5IEJJT19DVFJMX1dQRU5ESU5HIChlLmcuIHNvbWUgdmVyc2lvbnMKICAgICBvZiBBcGFjaGUpLiBTbyBpbnN0ZWFkIHNpbXBsaWZ5IHRoZSBjb2RlIHRvIGZsdXNoIHVuY29uZGl0aW9uYWxseS4KICAgICBUaGlzIHNob3VsZCBiZSBmaW5lIHNpbmNlIGZsdXNoaW5nIHdpdGggbm8gZGF0YSB0byBmbHVzaCBpcyBhIG5vIG9wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhbmRsZSBUTFMgdmVyc2lvbnMgMi4wIGFuZCBsYXRlciBwcm9wZXJseSBhbmQgY29ycmVjdGx5IHVzZSB0aGUKICAgICBoaWdoZXN0IHZlcnNpb24gb2YgVExTL1NTTCBzdXBwb3J0ZWQuIEFsdGhvdWdoIFRMUyA+PSAyLjAgaXMgc29tZSB3YXkKICAgICBvZmYgYW5jaWVudCBzZXJ2ZXJzIGhhdmUgYSBoYWJpdCBvZiBzdGlja2luZyBhcm91bmQgZm9yIGEgd2hpbGUuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29tcHJlc3Npb24gY29kZSBzbyBpdCBmcmVlcyB1cCBzdHJ1Y3R1cmVzIHdpdGhvdXQgdXNpbmcgdGhlCiAgICAgZXhfZGF0YSBjYWxsYmFja3MuIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aGVyZSBzb21lIGFwcGxpY2F0aW9ucwogICAgIGNhbGwgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSBiZWZvcmUgYXBwbGljYXRpb24gZXhpdCAoZS5nLiB3aGVuCiAgICAgcmVzdGFydGluZykgdGhlbiB1c2UgY29tcHJlc3Npb24gKGUuZy4gU1NMIHdpdGggY29tcHJlc3Npb24pIGxhdGVyLgogICAgIFRoaXMgcmVzdWx0cyBpbiBzaWduaWZpY2FudCBwZXItY29ubmVjdGlvbiBtZW1vcnkgbGVha3MgYW5kCiAgICAgaGFzIGNhdXNlZCBzb21lIHNlY3VyaXR5IGlzc3VlcyBpbmNsdWRpbmcgQ1ZFLTIwMDgtMTY3OCBhbmQKICAgICBDVkUtMjAwOS00MzU1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IGNyeXB0by9jYXN0IChpLmUuLCA8b3BlbnNzbC9jYXN0Lmg+KTogYSBDQVNUX0tFWSBkb2Vzbid0CiAgICAgY2hhbmdlIHdoZW4gZW5jcnlwdGluZyBvciBkZWNyeXB0aW5nLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBvcHRpb24gU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVCB3aGljaCB3aWxsIGFsbG93IGNsaWVudHMgdG8KICAgICBjb25uZWN0IGFuZCByZW5lZ290aWF0ZSB3aXRoIHNlcnZlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUkkuCiAgICAgVW50aWwgUkkgaXMgbW9yZSB3aWRlbHkgZGVwbG95ZWQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAibWlzc2luZyIgc3NsIGN0cmxzIHRvIGNsZWFyIG9wdGlvbnMgYW5kIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgY2xpZW50IGF0dGVtcHRzIHRvIHJlbmVnb3RpYXRlIGFuZCBkb2Vzbid0IHN1cHBvcnQgUkkgcmVzcG9uZCB3aXRoCiAgICAgYSBub19yZW5lZ290aWF0aW9uIGFsZXJ0IGFzIHJlcXVpcmVkIGJ5IFJGQzU3NDYuICBTb21lIHJlbmVnb3RpYXRpbmcKICAgICBUTFMgY2xpZW50cyB3aWxsIGNvbnRpbnVlIGEgY29ubmVjdGlvbiBncmFjZWZ1bGx5IHdoZW4gdGhleSByZWNlaXZlCiAgICAgdGhlIGFsZXJ0LiBVbmZvcnR1bmF0ZWx5IE9wZW5TU0wgbWlzaGFuZGxlZCB0aGlzIGFsZXJ0IGFuZCB3b3VsZCBoYW5nCiAgICAgd2FpdGluZyBmb3IgYSBzZXJ2ZXIgaGVsbG8gd2hpY2ggaXQgd2lsbCBuZXZlciByZWNlaXZlLiBOb3cgd2UgdHJlYXQgYQogICAgIHJlY2VpdmVkIG5vX3JlbmVnb3RpYXRpb24gYWxlcnQgYXMgYSBmYXRhbCBlcnJvci4gVGhpcyBpcyBiZWNhdXNlCiAgICAgYXBwbGljYXRpb25zIHJlcXVlc3RpbmcgYSByZW5lZ290aWF0aW9uIG1pZ2h0IHdlbGwgZXhwZWN0IGl0IHRvIHN1Y2NlZWQKICAgICBhbmQgd291bGQgaGF2ZSBubyBjb2RlIGluIHBsYWNlIHRvIGhhbmRsZSB0aGUgc2VydmVyIGRlbnlpbmcgaXQgc28gdGhlCiAgICAgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY3RybCBtYWNybyBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoKSB3aGljaCByZXR1cm5zIDEgaWYKICAgICBwZWVyIHN1cHBvcnRzIHNlY3VyZSByZW5lZ290aWF0aW9uIGFuZCAwIG90aGVyd2lzZS4gUHJpbnQgb3V0IHBlZXIKICAgICByZW5lZ290aWF0aW9uIHN1cHBvcnQgaW4gc19jbGllbnQvc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVwbGFjZSB0aGUgaGlnaGx5IGJyb2tlbiBhbmQgZGVwcmVjYXRlZCBTUEtBQyBjZXJ0aWZpY2F0aW9uIG1ldGhvZCB3aXRoCiAgICAgdGhlIHVwZGF0ZWQgTklEIGNyZWF0aW9uIHZlcnNpb24uIFRoaXMgc2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgVVRGOC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgUkZDNTc0Ni4gUmUtZW5hYmxlIHJlbmVnb3RpYXRpb24gYnV0IHJlcXVpcmUgdGhlIGV4dGVuc2lvbgogICAgIGFzIG5lZWRlZC4gVW5mb3J0dW5hdGVseSwgU1NMM19GTEFHU19BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04KICAgICB0dXJucyBvdXQgdG8gYmUgYSBiYWQgaWRlYS4gSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkKICAgICBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIHdoaWNoIGNhbiBiZSBzZXQgd2l0aAogICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoKS4gVGhpcyBpcyByZWFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UKICAgICBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAgICBbRXJpYyBSZXNjb3JsYSA8ZWtyQG5ldHdvcmtyZXNvbmFuY2UuY29tPiwgQmVuIExhdXJpZSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBzdGF0ZWxlc3Mgc2Vzc2lvbiByZXN1bXB0aW9uIGhhbmRsaW5nLiBVc2UgaW5pdGlhbF9jdHggd2hlbgogICAgIGlzc3VpbmcgYW5kIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCB0aWNrZXRzIGluIGNhc2UgaXQgaGFzIGNoYW5nZWQgZHVyaW5nCiAgICAgc2VydmVybmFtZSBoYW5kbGluZy4gVXNlIGEgbm9uLXplcm8gbGVuZ3RoIHNlc3Npb24gSUQgd2hlbiBhdHRlbXB0aW5nCiAgICAgc3RhdGVsZXNzIHNlc3Npb24gcmVzdW1wdGlvbjogdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYKICAgICBhIHJlc3VtcHRpb24gaGFzIG9jY3VycmVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlY2VpdmluZyBzZXJ2ZXIgaGVsbG8KICAgICAoc2V2ZXJhbCBwbGFjZXMgaW4gT3BlblNTTCBzdWJ0bHkgYXNzdW1lIHRoaXMpIGluc3RlYWQgb2YgbGF0ZXIgaW4KICAgICB0aGUgaGFuZHNoYWtlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmdW5jdGlvbnMgRU5HSU5FX2N0cmwoKSwgT1BFTlNTTF9pc3NlcnZpY2UoKSwKICAgICBDTVNfZ2V0MV9SZWNpcGllbnRSZXF1ZXN0KCkgYW5kIFJBTkRfYnl0ZXMoKSBjYW4gcmV0dXJuIDw9MCBvbiBlcnJvcgogICAgIGZpeGVzIGZvciBhIGZldyBwbGFjZXMgd2hlcmUgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBjaGVja2VkCiAgICAgY29ycmVjdGx5LgogICAgIFtKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+XQoKICAqKSBBZGQgLS1zdHJpY3Qtd2FybmluZ3Mgb3B0aW9uIHRvIENvbmZpZ3VyZSBzY3JpcHQgdG8gaW5jbHVkZSBkZXZ0ZWFtCiAgICAgd2FybmluZ3MgaW4gb3RoZXIgY29uZmlndXJhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIC0tbGliZGlyIG9wdGlvbiBhbmQgTElCRElSIHZhcmlhYmxlIGluIG1ha2VmaWxlcy4gVGhpcwogICAgIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwgb3BlbnNzbCBsaWJyYXJpZXMgaW4gbG9jYXRpb25zIHdoaWNoCiAgICAgaGF2ZSBuYW1lcyBvdGhlciB0aGFuICJsaWIiLCBmb3IgZXhhbXBsZSAiL3Vzci9saWI2NCIgd2hpY2ggc29tZQogICAgIHN5c3RlbXMgbmVlZC4KICAgICBbU3RldmUgSGVuc29uLCBiYXNlZCBvbiBwYXRjaCBmcm9tIEplcmVteSBVdGxleV0KCiAgKikgRG9uJ3QgYWxsb3cgdGhlIHVzZSBvZiBsZWFkaW5nIDB4ODAgaW4gT0lEcy4gVGhpcyBpcyBhIHZpb2xhdGlvbiBvZgogICAgIFg2OTAgOC45LjEyIGFuZCBjYW4gcHJvZHVjZSBzb21lIG1pc2xlYWRpbmcgdGV4dHVhbCBvdXRwdXQgb2YgT0lEcy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBEYW4gS2FtaW5za3ldCgogICopIERlbGV0ZSBNRDIgZnJvbSBhbGdvcml0aG0gdGFibGVzLiBUaGlzIGZvbGxvd3MgdGhlIHJlY29tbWVuZGF0aW9uIGluCiAgICAgc2V2ZXJhbCBzdGFuZGFyZHMgdGhhdCBpdCBpcyBub3QgdXNlZCBpbiBuZXcgYXBwbGljYXRpb25zIGR1ZSB0bwogICAgIHNldmVyYWwgY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiBGb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgcmVhc29ucwogICAgIHRoZSBNRDIgQVBJIGlzIHN0aWxsIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbXByZXNzaW9uIGlkIHRvIHtkMmksaTJkfV9TU0xfU0VTU0lPTiBzbyBpdCBpcyBjb3JyZWN0bHkgc2F2ZWQKICAgICBhbmQgcmVzdG9yZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVuYW1lIHVuaTJhc2MgYW5kIGFzYzJ1bmkgZnVuY3Rpb25zIHRvIE9QRU5TU0xfdW5pMmFzYyBhbmQKICAgICBPUEVOU1NMX2FzYzJ1bmkgY29uZGl0aW9uYWxseSBvbiBOZXR3YXJlIHBsYXRmb3JtcyB0byBhdm9pZCBhIG5hbWUKICAgICBjbGFzaC4KICAgICBbR3VlbnRlciA8bGlzdHNAZ2tudy5uZXQ+XQoKICAqKSBGaXggdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBjaGFpbiBidWlsZGluZyBjb2RlIHRvIHVzZSBYNTA5X3ZlcmlmeV9jZXJ0KCksCiAgICAgaXQgdXNlZCB0byBoYXZlIGFuIGFkLWhvYyBidWlsZGVyIHdoaWNoIHdhcyB1bmFibGUgdG8gY29wZSB3aXRoIGFueXRoaW5nCiAgICAgb3RoZXIgdGhhbiBhIHNpbXBsZSBjaGFpbi4KICAgICBbRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiwgU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCBjaGVjayBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBzaWduYXR1cmVzIGluIFg1MDlfdmVyaWZ5X2NlcnQoKQogICAgIGJ5IGRlZmF1bHQgKGEgZmxhZyBjYW4gb3ZlcnJpZGUgdGhpcyk6IGl0IGp1c3Qgd2FzdGVzIHRpbWUgd2l0aG91dAogICAgIGFkZGluZyBhbnkgc2VjdXJpdHkuIEFzIGEgdXNlZnVsIHNpZGUgZWZmZWN0IHNlbGYgc2lnbmVkIHJvb3QgQ0FzCiAgICAgd2l0aCBub24tRklQUyBkaWdlc3RzIGFyZSBub3cgdXNhYmxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBkdGxzMV9wcm9jZXNzX291dF9vZl9zZXFfbWVzc2FnZSgpIHRoZSBjaGVjayBpZiB0aGUgY3VycmVudCBtZXNzYWdlCiAgICAgaXMgYWxyZWFkeSBidWZmZXJlZCB3YXMgbWlzc2luZy4gRm9yIGV2ZXJ5IG5ldyBtZXNzYWdlIHdhcyBtZW1vcnkKICAgICBhbGxvY2F0ZWQsIGFsbG93aW5nIGFuIGF0dGFja2VyIHRvIHBlcmZvcm0gYW4gZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrCiAgICAgd2l0aCBzZW5kaW5nIG91dCBvZiBzZXEgaGFuZHNoYWtlIG1lc3NhZ2VzIHVudGlsIHRoZXJlIGlzIG5vIG1lbW9yeQogICAgIGxlZnQuIEFkZGl0aW9uYWxseSBldmVyeSBmdXR1cmUgbWVzc2VnZSB3YXMgYnVmZmVyZWQsIGV2ZW4gaWYgdGhlCiAgICAgc2VxdWVuY2UgbnVtYmVyIG1hZGUgbm8gc2Vuc2UgYW5kIHdvdWxkIGJlIHBhcnQgb2YgYW5vdGhlciBoYW5kc2hha2UuCiAgICAgU28gb25seSBtZXNzYWdlcyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgbGVzcyB0aGFuIDEwIGluIGFkdmFuY2Ugd2lsbCBiZQogICAgIGJ1ZmZlcmVkLiAgKENWRS0yMDA5LTEzNzgpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIGRpc2NvdmVyZWQgYnkgRGFuaWVsIE1lbnR6XSAJCgogICopIFJlY29yZHMgYXJlIGJ1ZmZlcmVkIGlmIHRoZXkgYXJyaXZlIHdpdGggYSBmdXR1cmUgZXBvY2ggdG8gYmUKICAgICBwcm9jZXNzZWQgYWZ0ZXIgZmluaXNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRzaGFrZS4gVGhlcmUgaXMKICAgICBjdXJyZW50bHkgbm8gbGltaXRhdGlvbiB0byB0aGlzIGJ1ZmZlciBhbGxvd2luZyBhbiBhdHRhY2tlciB0byBwZXJmb3JtCiAgICAgYSBET1MgYXR0YWNrIHdpdGggc2VuZGluZyByZWNvcmRzIHdpdGggZnV0dXJlIGVwb2NocyB1bnRpbCB0aGVyZSBpcyBubwogICAgIG1lbW9yeSBsZWZ0LiBUaGlzIHBhdGNoIGFkZHMgdGhlIHBxdWV1ZV9zaXplKCkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCiAgICAgdGhlIHNpemUgb2YgYSBidWZmZXIgYW5kIGxpbWl0cyB0aGUgcmVjb3JkIGJ1ZmZlciB0byAxMDAgZW50cmllcy4KICAgICAoQ1ZFLTIwMDktMTM3NykKICAgICBbUm9iaW4gU2VnZ2VsbWFubiwgZGlzY292ZXJlZCBieSBEYW5pZWwgTWVudHpdIAkKCiAgKikgS2VlcCBhIGNvcHkgb2YgZnJhZy0+bXNnX2hlYWRlci5mcmFnX2xlbiBzbyBpdCBjYW4gYmUgdXNlZCBhZnRlciB0aGUKICAgICBwYXJlbnQgc3RydWN0dXJlIGlzIGZyZWVkLiAgKENWRS0yMDA5LTEzNzkpCiAgICAgW0RhbmllbCBNZW50el0gCQoKICAqKSBIYW5kbGUgbm9uLWJsb2NraW5nIEkvTyBwcm9wZXJseSBpbiBTU0xfc2h1dGRvd24oKSBjYWxsLgogICAgIFtEYXJyeWwgTWlsZXMgPGRhcnJ5bC1tYWlsaW5nbGlzdHNAbmV0YmF1ZHMubmV0Pl0KCiAgKikgQWRkIDIuNS40LiogT0lEcwogICAgIFtJbHlhIE8uIDx2cmdob3N0QGdtYWlsLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ayBhbmQgMC45LjhsICBbNSBOb3YgMjAwOV0KCiAgKikgRGlzYWJsZSByZW5lZ290aWF0aW9uIGNvbXBsZXRlbHkgLSB0aGlzIGZpeGVzIGEgc2V2ZXJlIHNlY3VyaXR5CiAgICAgcHJvYmxlbSAoQ1ZFLTIwMDktMzU1NSkgYXQgdGhlIGNvc3Qgb2YgYnJlYWtpbmcgYWxsCiAgICAgcmVuZWdvdGlhdGlvbi4gUmVuZWdvdGlhdGlvbiBjYW4gYmUgcmUtZW5hYmxlZCBieSBzZXR0aW5nCiAgICAgU1NMM19GTEFHU19BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04gaW4gczMtPmZsYWdzIGF0CiAgICAgcnVuLXRpbWUuIFRoaXMgaXMgcmVhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGtub3cgd2hhdAogICAgIHlvdSdyZSBkb2luZy4KICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhqIGFuZCAwLjkuOGsgIFsyNSBNYXIgMjAwOV0KCiAgKikgRG9uJ3Qgc2V0IHZhbCB0byBOVUxMIHdoZW4gZnJlZWluZyB1cCBzdHJ1Y3R1cmVzLCBpdCBpcyBmcmVlZCB1cCBieQogICAgIHVuZGVybHlpbmcgY29kZS4gSWYgc2l6ZW9mKHZvaWQgKikgPiBzaXplb2YobG9uZykgdGhpcyBjYW4gcmVzdWx0IGluCiAgICAgemVyb2luZyBwYXN0IHRoZSB2YWxpZCBmaWVsZC4gKENWRS0yMDA5LTA3ODkpCiAgICAgW1Bhb2xvIEdhbmNpIDxQYW9sby5HYW5jaUBBZE5vdnVtLkNIPl0KCiAgKikgRml4IGJ1ZyB3aGVyZSByZXR1cm4gdmFsdWUgb2YgQ01TX1NpZ25lckluZm9fdmVyaWZ5X2NvbnRlbnQoKSB3YXMgbm90CiAgICAgY2hlY2tlZCBjb3JyZWN0bHkuIFRoaXMgd291bGQgYWxsb3cgc29tZSBpbnZhbGlkIHNpZ25lZCBhdHRyaWJ1dGVzIHRvCiAgICAgYXBwZWFyIHRvIHZlcmlmeSBjb3JyZWN0bHkuIChDVkUtMjAwOS0wNTkxKQogICAgIFtJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+XQoKICAqKSBSZWplY3QgVW5pdmVyc2FsU3RyaW5nIGFuZCBCTVBTdHJpbmcgdHlwZXMgd2l0aCBpbnZhbGlkIGxlbmd0aHMuIFRoaXMKICAgICBwcmV2ZW50cyBhIGNyYXNoIGluIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgd2hpY2ggYXNzdW1lcyB0aGUgc3RyaW5ncyBoYXZlCiAgICAgYSBsZWdhbCBsZW5ndGguIChDVkUtMjAwOS0wNTkwKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCBTL01JTUUgc2lnbmluZyBhcyB0aGUgZGVmYXVsdCBwdXJwb3NlIHJhdGhlciB0aGFuIHNldHRpbmcgaXQgCiAgICAgdW5jb25kaXRpb25hbGx5LiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb3ZlcnJpZGUgaXQgYXQgdGhlIHN0b3JlCiAgICAgbGV2ZWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGVybWl0IHJlc3RyaWN0ZWQgcmVjdXJzaW9uIG9mIEFTTjEgc3RyaW5ncy4gVGhpcyBpcyBuZWVkZWQgaW4gcHJhY3RpY2UKICAgICB0byBoYW5kbGUgc29tZSBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcHJvdmUgZWZmaWNpZW5jeSBvZiBtZW1fZ2V0czogZG9uJ3Qgc2VhcmNoIHdob2xlIGJ1ZmZlciBlYWNoIHRpbWUKICAgICBmb3IgYSAnXG4nCiAgICAgW0plcmVteSBTaGFwaXJvIDxqbnNoYXBpckB1cy5pYm0uY29tPl0KCiAgKikgTmV3IC1oZXggb3B0aW9uIGZvciBvcGVuc3NsIHJhbmQuCiAgICAgW01hdHRoaWV1IEhlcnJiXQoKICAqKSBQcmludCBvdXQgVVRGOFN0cmluZyBhbmQgTnVtZXJpY1N0cmluZyB3aGVuIHBhcnNpbmcgQVNOMS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IE51bWVyaWNTdHJpbmcgdHlwZSBmb3IgbmFtZSBjb21wb25lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IENDIGluIHRoZSBlbnZpcm9ubWVudCB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljYWxseSBjaG9zZW4KICAgICBjb21waWxlci4gTm90ZSB0aGF0IG5vdGhpbmcgaXMgZG9uZSB0byBlbnN1cmUgZmxhZ3Mgd29yayB3aXRoIHRoZQogICAgIGNob3NlbiBjb21waWxlci4KICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhpIGFuZCAwLjkuOGogIFswNyBKYW4gMjAwOV0KCiAgKikgUHJvcGVybHkgY2hlY2sgRVZQX1ZlcmlmeUZpbmFsKCkgYW5kIHNpbWlsYXIgcmV0dXJuIHZhbHVlcwogICAgIChDVkUtMjAwOC01MDc3KS4KICAgICBbQmVuIExhdXJpZSwgQm9kbyBNb2VsbGVyLCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRW5hYmxlIFRMUyBleHRlbnNpb25zIGJ5IGRlZmF1bHQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFsbG93IHRoZSBDSElMIGVuZ2luZSB0byBiZSBsb2FkZWQsIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzCiAgICAgbXVsdGl0aHJlYWRlZCBvciBub3QuIChUaGlzIGRvZXMgbm90IHJlbGVhc2UgdGhlIGRldmVsb3BlciBmcm9tIHRoZQogICAgIG9ibGlnYXRpb24gdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxvY2tpbmcgY2FsbGJhY2tzLikKICAgICBbU2FuZGVyIFRlbW1lIDxzYW5kZXJAdGVtbWUubmV0Pl0KCiAgKikgVXNlIGNvcnJlY3QgZXhpdCBjb2RlIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIGRnc3QgY29tbWFuZC4KICAgICBbU3RldmUgSGVuc29uOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFJvbGFuZCBEaXJsZXdhbmdlcl0KCiAgKikgVHdlYWsgQ29uZmlndXJlIHNvIHRoYXQgeW91IG5lZWQgdG8gc2F5ICJleHBlcmltZW50YWwtanBha2UiIHRvIGVuYWJsZQogICAgIEpQQUtFLCBhbmQgbmVlZCB0byB1c2UgLURPUEVOU1NMX0VYUEVSSU1FTlRBTF9KUEFLRSBpbiBhcHBsaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGV4cGVyaW1lbnRhbCBKUEFLRSBzdXBwb3J0LCBpbmNsdWRpbmcgZGVtbyBhdXRoZW50aWNhdGlvbiBpbgogICAgIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU2V0IHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGluIHYzX2FkZHJfY2Fub25pemUoKS4KICAgICBbUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0Pl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFhNUFAgU1RBUlRUTFMgaW4gc19jbGllbnQuCiAgICAgW1BoaWxpcCBQYWVwcyA8cGhpbGlwQGZyZWVic2Qub3JnPl0KCiAgKikgQ2hhbmdlIHRoZSBzZXJ2ZXItc2lkZSBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgYmVoYXZpb3IKICAgICB0byBlbnN1cmUgdGhhdCBldmVuIHdpdGggdGhpcyBvcHRpb24sIG9ubHkgY2lwaGVyc3VpdGVzIGluIHRoZQogICAgIHNlcnZlcidzIHByZWZlcmVuY2UgbGlzdCB3aWxsIGJlIGFjY2VwdGVkLiAgKE5vdGUgdGhhdCB0aGUgb3B0aW9uCiAgICAgYXBwbGllcyBvbmx5IHdoZW4gcmVzdW1pbmcgYSBzZXNzaW9uLCBzbyB0aGUgZWFybGllciBiZWhhdmlvciB3YXMKICAgICBqdXN0IGFib3V0IHRoZSBhbGdvcml0aG0gY2hvaWNlIGZvciBzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5LikKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGggYW5kIDAuOS44aSAgWzE1IFNlcCAyMDA4XQoKICAqKSBGaXggTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGlmIGEgRFRMUyBzZXJ2ZXIgcmVjZWl2ZWQKICAgICBDaGFuZ2VDaXBoZXJTcGVjIGFzIGZpcnN0IHJlY29yZCAoQ1ZFLTIwMDktMTM4NikuCiAgICAgW1BSICMxNjc5XQoKICAqKSBGaXggYSBzdGF0ZSB0cmFuc2l0aW9uIGluIHMzX3NydnIuYyBhbmQgZDFfc3J2ci5jCiAgICAgKHdhcyB1c2luZyBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQiwgc2hvdWxkIGJlIC4uLl9TVF9TV19TUlZSXy4uLikuCiAgICAgW05hZ2VuZHJhIE1vZGFkdWd1XQoKICAqKSBUaGUgZml4IGluIDAuOS44YyB0aGF0IHN1cHBvc2VkbHkgZ290IHJpZCBvZiB1bnNhZmUKICAgICBkb3VibGUtY2hlY2tlZCBsb2NraW5nIHdhcyBpbmNvbXBsZXRlIGZvciBSU0EgYmxpbmRpbmcsCiAgICAgYWRkcmVzc2luZyBqdXN0IG9uZSBsYXllciBvZiB3aGF0IHR1cm5zIG91dCB0byBoYXZlIGJlZW4KICAgICBkb3VibHkgdW5zYWZlIHRyaXBsZS1jaGVja2VkIGxvY2tpbmcuCgogICAgIFNvIG5vdyBmaXggdGhpcyBmb3IgcmVhbCBieSByZXRpcmluZyB0aGUgTU9OVF9IRUxQRVIgbWFjcm8KICAgICBpbiBjcnlwdG8vcnNhL3JzYV9lYXkuYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXJpdXMgU2NoaWxkZXJdCgogICopIFZhcmlvdXMgcHJlY2F1dGlvbmFyeSBtZWFzdXJlczoKCiAgICAgLSBBdm9pZCBzaXplX3QgaW50ZWdlciBvdmVyZmxvdyBpbiBIQVNIX1VQREFURSAobWQzMl9jb21tb24uaCkuCgogICAgIC0gQXZvaWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gZDJpX1NTTF9TRVNTSU9OKCkgKHNzbF9hc24xLmMpLgogICAgICAgKE5COiBUaGlzIHdvdWxkIHJlcXVpcmUga25vd2xlZGdlIG9mIHRoZSBzZWNyZXQgc2Vzc2lvbiB0aWNrZXQga2V5CiAgICAgICB0byBleHBsb2l0LCBpbiB3aGljaCBjYXNlIHlvdSdkIGJlIFNPTCBlaXRoZXIgd2F5LikKCiAgICAgLSBDaGFuZ2UgYm5fbmlzdC5jIHNvIHRoYXQgaXQgd2lsbCBwcm9wZXJseSBoYW5kbGUgaW5wdXQgQklHTlVNcwogICAgICAgb3V0c2lkZSB0aGUgZXhwZWN0ZWQgcmFuZ2UuCgogICAgIC0gRW5mb3JjZSB0aGUgJ251bScgY2hlY2sgaW4gQk5fZGl2KCkgKGJuX2Rpdi5jKSBmb3Igbm9uLUJOX0RFQlVHCiAgICAgICBidWlsZHMuCgogICAgIFtOZWVsIE1laHRhLCBCb2RvIE1vZWxsZXJdCgogICopIEFsbG93IGVuZ2luZXMgdG8gYmUgInNvZnQgbG9hZGVkIiAtIGkuZS4gb3B0aW9uYWxseSBkb24ndCBkaWUgaWYKICAgICB0aGUgbG9hZCBmYWlscy4gVXNlZnVsIGZvciBkaXN0cm9zLgogICAgIFtCZW4gTGF1cmllIGFuZCB0aGUgRnJlZUJTRCB0ZWFtXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgTG9jYWwgTWFjaGluZSBLZXlzZXQgYXR0cmlidXRlIGluIFBLQ1MjMTIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEJOX0dGMm1fbW9kX2FycigpIHRvcC1iaXQgY2xlYW51cCBjb2RlLgogICAgIFtIdWFuZyBZaW5nXQoKICAqKSBFeHBhbmQgRU5HSU5FIHRvIHN1cHBvcnQgZW5naW5lIHN1cHBsaWVkIFNTTCBjbGllbnQgY2VydGlmaWNhdGUgZnVuY3Rpb25zLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBMb2dpY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIENyeXB0b0FQSSBFTkdJTkUgdG8gc3VwcG9ydCB1c2Ugb2YgUlNBIGFuZCBEU0Ega2V5cyBoZWxkIGluIFdpbmRvd3MKICAgICBrZXlzdG9yZXMuIFN1cHBvcnQgZm9yIFNTTC9UTFMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHRvby4KICAgICBOb3QgY29tcGlsZWQgdW5sZXNzIGVuYWJsZS1jYXBpZW5nIHNwZWNpZmllZCB0byBDb25maWd1cmUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IExvZ2ljYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFg1MDlfQVRUUklCVVRFIGNyZWF0aW9uOiBkb250IHNldCBhdHRyaWJ1dGUgdXNpbmcKICAgICBBU04xX1RZUEVfc2V0MSBpZiBNQlNUUklORyBmbGFnIHNldC4gVGhpcyBidWcgd291bGQgY3Jhc2ggY2VydGFpbgogICAgIGF0dHJpYnV0ZSBjcmVhdGlvbiByb3V0aW5lcyBzdWNoIGFzIGNlcnRpZmNhdGUgcmVxdWVzdHMgYW5kIFBLQ1MjMTIKICAgICBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGcgYW5kIDAuOS44aCAgWzI4IE1heSAyMDA4XQoKICAqKSBGaXggZmxhdyBpZiAnU2VydmVyIEtleSBleGNoYW5nZSBtZXNzYWdlJyBpcyBvbWl0dGVkIGZyb20gYSBUTFMKICAgICBoYW5kc2hha2Ugd2hpY2ggY291bGQgbGVhZCB0byBhIGNpbGVudCBjcmFzaCBhcyBmb3VuZCB1c2luZyB0aGUKICAgICBDb2Rlbm9taWNvbiBUTFMgdGVzdCBzdWl0ZSAoQ1ZFLTIwMDgtMTY3MikgCiAgICAgW1N0ZXZlIEhlbnNvbiwgTWFyayBDb3hdCgogICopIEZpeCBkb3VibGUgZnJlZSBpbiBUTFMgc2VydmVyIG5hbWUgZXh0ZW5zaW9ucyB3aGljaCBjb3VsZCBsZWFkIHRvCiAgICAgYSByZW1vdGUgY3Jhc2ggZm91bmQgYnkgQ29kZW5vbWljb24gVExTIHRlc3Qgc3VpdGUgKENWRS0yMDA4LTA4OTEpIAogICAgIFtKb2UgT3J0b25dCgogICopIENsZWFyIGVycm9yIHF1ZXVlIGluIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKQoKICAgICBDbGVhciB0aGUgZXJyb3IgcXVldWUgdG8gZW5zdXJlIHRoYXQgZXJyb3IgZW50cmllcyBsZWZ0IGZyb20KICAgICBvbGRlciBmdW5jdGlvbiBjYWxscyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGNvcnJlY3Qgb3BlcmF0aW9uLgogICAgIFtMdXR6IEphZW5pY2tlLCBFcmlrIGRlIENhc3RybyBMb3BvXQoKICAqKSBSZW1vdmUgcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgb2YgY29tbWVyY2lhbCBDQXM6CgogICAgIFRoZSBPcGVuU1NMIHByb2plY3QgZG9lcyBub3QgcmVjb21tZW5kIGFueSBzcGVjaWZpYyBDQSBhbmQgZG9lcyBub3QKICAgICBoYXZlIGFueSBwb2xpY3kgd2l0aCByZXNwZWN0IHRvIGluY2x1ZGluZyBvciBleGNsdWRpbmcgYW55IENBLgogICAgIFRoZXJlZm9yZSBpdCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZSB0byBzaGlwIGFuIGFyYml0cmFyeSBzZWxlY3Rpb24KICAgICBvZiByb290IENBIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBPcGVuU1NMIHNvZnR3YXJlLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBSU0EgT0FFUCBwYXRjaGVzIHRvIGZpeCB0d28gc2VwYXJhdGUgaW52YWxpZCBtZW1vcnkgcmVhZHMuCiAgICAgVGhlIGZpcnN0IG9uZSBpbnZvbHZlcyBpbnB1dHMgd2hlbiAnbHplcm8nIGlzIGdyZWF0ZXIgdGhhbgogICAgICdTSEFfRElHRVNUX0xFTkdUSCcgKGl0IHdvdWxkIHJlYWQgYWJvdXQgU0hBX0RJR0VTVF9MRU5HVEggYnl0ZXMKICAgICBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiBmcm9tKS4gVGhlIHNlY29uZCBvbmUgaW52b2x2ZXMgaW5wdXRzIHdoZXJlCiAgICAgdGhlICdkYicgc2VjdGlvbiBjb250YWlucyBub3RoaW5nIGJ1dCB6ZXJvZXMgKHRoZXJlIGlzIGEgb25lLWJ5dGUKICAgICBpbnZhbGlkIHJlYWQgYWZ0ZXIgdGhlIGVuZCBvZiAnZGInKS4KICAgICBbSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPl0KCiAgKikgUGFydGlhbCBiYWNrcG9ydCBmcm9tIDAuOS45LWRldjoKCiAgICAgSW50cm9kdWNlIGJuX211bF9tb250IChkZWRpY2F0ZWQgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbgogICAgIHByb2NlZHVyZSkgYXMgYSBjYW5kaWRhdGUgZm9yIEJJR05VTSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24uCiAgICAgV2hpbGUgMC45LjktZGV2IHVzZXMgYXNzZW1ibGVyIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZXMsIG9ubHkKICAgICB4ODZfNjQgaXMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgaGVyZSBpbiB0aGUgMC45LjggYnJhbmNoLCBhbmQKICAgICAzMi1iaXQgeDg2IGlzIGF2YWlsYWJsZSB0aHJvdWdoIGEgY29tcGlsZS10aW1lIHNldHRpbmcuCgogICAgIFRvIHRyeSB0aGUgMzItYml0IHg4NiBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24sIHVzZSBDb25maWd1cmUKICAgICBvcHRpb24gImVuYWJsZS1tb250YXNtIiAod2hpY2ggZXhpc3RzIG9ubHkgZm9yIHRoaXMgYmFja3BvcnQpLgoKICAgICBBcyAiZW5hYmxlLW1vbnRhc20iIGZvciAzMi1iaXQgeDg2IGRpc2NsYWltcyBjb2RlIHN0YWJpbGl0eQogICAgIGFueXdheSwgaW4gdGhpcyBjb25zdGVsbGF0aW9uIHdlIGFjdGl2YXRlIGFkZGl0aW9uYWwgY29kZQogICAgIGJhY2twb3J0ZWQgZnJvbSAwLjkuOS1kZXYgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLAogICAgIG5hbWVseSBCTl9mcm9tX21vbnRnb21lcnlfd29yZC4gIChUbyBlbmFibGUgdGhpcyBvdGhlcndpc2UsCiAgICAgZS5nLiB4ODZfNjQsIHRyeSAiLURNT05UX0ZST01fV09SRF9fX05PTl9ERUZBVUxUXzBfOV84X0JVSUxEIi4pCgogICAgIFtBbmR5IFBvbHlha292IChiYWNrcG9ydCBwYXJ0aWFsbHkgYnkgQm9kbyBNb2VsbGVyKV0KCiAgKikgQWRkIFRMUyBzZXNzaW9uIHRpY2tldCBjYWxsYmFjay4gVGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2V0CiAgICAgVExTIHRpY2tldCBjaXBoZXIgYW5kIEhNQUMga2V5cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGhhcmRjb2RlZCBmaXhlZAogICAgIHZhbHVlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGtleSByb2xsb3ZlciBmb3IgZXhhbXBsZSB3aGVyZSBzZXZlcmFsIGtleQogICAgIHNldHMgbWF5IGV4aXN0IHdpdGggZGlmZmVyZW50IG5hbWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJldmVyc2UgRU5HSU5FLWludGVybmFsIGxvZ2ljIGZvciBjYWNoaW5nIGRlZmF1bHQgRU5HSU5FIGhhbmRsZXMuCiAgICAgVGhpcyB3YXMgYnJva2VuIHVudGlsIG5vdyBpbiAwLjkuOCByZWxlYXNlcywgc3VjaCB0aGF0IHRoZSBvbmx5IHdheQogICAgIGEgcmVnaXN0ZXJlZCBFTkdJTkUgY291bGQgYmUgdXNlZCAoYXNzdW1pbmcgaXQgaW5pdGlhbGlzZXMKICAgICBzdWNjZXNzZnVsbHkgb24gdGhlIGhvc3QpIHdhcyB0byBleHBsaWNpdGx5IHNldCBpdCBhcyB0aGUgZGVmYXVsdAogICAgIGZvciB0aGUgcmVsZXZhbnQgYWxnb3JpdGhtcy4gVGhpcyBpcyBpbiBjb250cmFkaWN0aW9uIHdpdGggMC45LjcKICAgICBiZWhhdmlvdXIgYW5kIHRoZSBkb2N1bWVudGF0aW9uLiBXaXRoIHRoaXMgZml4LCB3aGVuIGFuIEVOR0lORSBpcwogICAgIHJlZ2lzdGVyZWQgaW50byBhIGdpdmVuIGFsZ29yaXRobSdzIHRhYmxlIG9mIGltcGxlbWVudGF0aW9ucywgdGhlCiAgICAgJ3VwdG9kYXRlJyBmbGFnIGlzIHJlc2V0IHNvIHRoYXQgYXV0by1kaXNjb3Zlcnkgd2lsbCBiZSB1c2VkIG5leHQKICAgICB0aW1lIGEgbmV3IGNvbnRleHQgZm9yIHRoYXQgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIHNlbGVjdCBhbgogICAgIGltcGxlbWVudGF0aW9uLgogICAgIFtJYW4gTGlzdGVyICh0d2Vha2VkIGJ5IEdlb2ZmIFRob3JwZSldCgogICopIEJhY2twb3J0IG9mIENNUyBjb2RlIHRvIE9wZW5TU0wgMC45LjguIFRoaXMgZGlmZmVycyBmcm9tIHRoZSAwLjkuOQogICAgIGltcGxlbWVudGlvbiBpbiB0aGUgZm9sbG93aW5nIHdheXM6CgogICAgIExhY2sgb2YgRVZQX1BLRVlfQVNOMV9NRVRIT0QgbWVhbnMgYWxnb3JpdGhtIHBhcmFtZXRlcnMgaGF2ZSB0byBiZQogICAgIGhhcmQgY29kZWQuCgogICAgIExhY2sgb2YgQkVSIHN0cmVhbWluZyBzdXBwb3J0IG1lYW5zIG9uZSBwYXNzIHN0cmVhbWluZyBwcm9jZXNzaW5nIGlzCiAgICAgb25seSBzdXBwb3J0ZWQgaWYgZGF0YSBpcyBkZXRhY2hlZDogc2V0dGluZyB0aGUgc3RyZWFtaW5nIGZsYWcgaXMKICAgICBpZ25vcmVkIGZvciBlbWJlZGRlZCBjb250ZW50LgoKICAgICBDTVMgc3VwcG9ydCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZAogICAgIHdpdGggdGhlIGVuYWJsZS1jbXMgY29uZmlndXJhdGlvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBHTVAgZW5naW5lIGdsdWUgdG8gZG8gZGlyZWN0IGNvcGllcyBiZXR3ZWVuIEJJR05VTSBhbmQKICAgICBtcHpfdCB3aGVuIG9wZW5zc2wgYW5kIEdNUCB1c2UgdGhlIHNhbWUgbGltYiBzaXplLiBPdGhlcndpc2UgdGhlCiAgICAgZXhpc3RpbmcgImNvbnZlcnNpb24gdmlhIGEgdGV4dCBzdHJpbmcgZXhwb3J0IiB0cmljayBpcyBzdGlsbCB1c2VkLgogICAgIFtQYXVsIFNoZWVyIDxwYXVsc2hlZXJAZ21haWwuY29tPl0KCiAgKikgWmxpYiBjb21wcmVzc2lvbiBCSU8uIFRoaXMgaXMgYSBmaWx0ZXIgQklPIHdoaWNoIGNvbXByZXNzZWQgYW5kCiAgICAgdW5jb21wcmVzc2VzIGFueSBkYXRhIHBhc3NlZCB0aHJvdWdoIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBRVNfd3JhcF9rZXkoKSBhbmQgQUVTX3Vud3JhcF9rZXkoKSBmdW5jdGlvbnMgdG8gaW1wbGVtZW50CiAgICAgUkZDMzM5NCBjb21wYXRpYmxlIEFFUyBrZXkgd3JhcHBpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBBU04xIHN0cnVjdHVyZXMuIEFTTjFfU1RSSU5HX3NldDAoKToKICAgICBzZXRzIHN0cmluZyBkYXRhIHdpdGhvdXQgY29weWluZy4gWDUwOV9BTEdPUl9zZXQwKCkgYW5kCiAgICAgWDUwOV9BTEdPUl9nZXQwKCk6IHNldCBhbmQgcmV0cmlldmUgWDUwOV9BTEdPUiAoQWxnb3JpdGhtSWRlbnRpZmllcikKICAgICBkYXRhLiBBdHRyaWJ1dGUgZnVuY3Rpb24gWDUwOWF0X2dldDBfZGF0YV9ieV9PQkooKTogcmV0cmlldmVzIGRhdGEKICAgICBmcm9tIGFuIFg1MDlfQVRUUklCVVRFIHN0cnVjdHVyZSBvcHRpb25hbGx5IGNoZWNraW5nIGl0IG9jY3VycyBvbmx5CiAgICAgb25jZS4gQVNOMV9UWVBFX3NldDEoKTogc2V0IGFuZCBBU04xX1RZUEUgc3RydWN0dXJlIGNvcHlpbmcgc3VwcGxpZWQKICAgICBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBCTiBmbGFnIGhhbmRsaW5nIGluIFJTQV9lYXlfbW9kX2V4cCgpIGFuZCBCTl9NT05UX0NUWF9zZXQoKQogICAgIHRvIGdldCB0aGUgZXhwZWN0ZWQgQk5fRkxHX0NPTlNUVElNRSBiZWhhdmlvci4KICAgICBbQm9kbyBNb2VsbGVyIChHb29nbGUpXQogIAogICopIE5ldHdhcmUgc3VwcG9ydDoKCiAgICAgLSBmaXhlZCB3cm9uZyB1c2FnZSBvZiBpb2N0bHNvY2tldCgpIHdoZW4gYnVpbGQgZm9yIExJQkMgQlNEIHNvY2tldHMKICAgICAtIGZpeGVkIGRvX3Rlc3RzLnBsIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZSB3aXRoIENMSUIgYnVpbGRzIHRvbyAoQ0xJQl9PUFQpCiAgICAgLSBhZGRlZCBzb21lIG1vcmUgdGVzdHMgdG8gZG9fdGVzdHMucGwKICAgICAtIGZpeGVkIFJ1bm5pbmdQcm9jZXNzIHVzYWdlIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCBuZXdlciBMSUJDIE5ES3MgdG9vCiAgICAgLSByZW1vdmVkIHVzYWdlIG9mIEJOX0xMT05HIGZvciBDTElCIGJ1aWxkcyB0byBhdm9pZCBydW50aW1lIGRlcGVuZGVuY3kKICAgICAtIGFkZGVkIG5ldyBDb25maWd1cmUgdGFyZ2V0cyBuZXR3YXJlLWNsaWItYnNkc29jaywgbmV0d2FyZS1jbGliLWdjYywKICAgICAgIG5ldHdhcmUtY2xpYi1ic2Rzb2NrLWdjYywgbmV0d2FyZS1saWJjLWJzZHNvY2stZ2NjCiAgICAgLSB2YXJpb3VzIGNoYW5nZXMgdG8gbmV0d2FyZS5wbCB0byBlbmFibGUgZ2NjLWNyb3NzIGJ1aWxkcyBvbiBXaW4zMgogICAgICAgcGxhdGZvcm0KICAgICAtIGNoYW5nZWQgY3J5cHRvL2Jpby9iX3NvY2suYyB0byB3b3JrIHdpdGggbWFjcm8gZnVuY3Rpb25zIChDTElCIEJTRCkKICAgICAtIHZhcmlvdXMgY2hhbmdlcyB0byBmaXggbWlzc2luZyBwcm90b3R5cGUgd2FybmluZ3MKICAgICAtIGZpeGVkIHg4Nm5hc20ucGwgdG8gY3JlYXRlIGNvcnJlY3QgYXNtIGZpbGVzIGZvciBOQVNNIENPRkYgb3V0cHV0CiAgICAgLSBhZGRlZCBBRVMsIFdISVJMUE9PTCBhbmQgQ1BVSUQgYXNzZW1ibGVyIGNvZGUgdG8gYnVpbGQgZmlsZXMKICAgICAtIGFkZGVkIG1pc3NpbmcgQUVTIGFzc2VtYmxlciBtYWtlIHJ1bGVzIHRvIG1rMW1mLnBsCiAgICAgLSBmaXhlZCBvcmRlciBvZiBpbmNsdWRlcyBpbiBhcHBzL29jc3AuYyBzbyB0aGF0IGVfb3MuaCBzZXR0aW5ncyBhcHBseQogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2hAZ214Lm5ldD5dCgogICopIEltcGxlbWVudCBjZXJ0aWZpY2F0ZSBzdGF0dXMgcmVxdWVzdCBUTFMgZXh0ZW5zaW9uIGRlZmluZWQgaW4gUkZDMzU0Ni4KICAgICBBIGNsaWVudCBjYW4gc2V0IHRoZSBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzIGFuZCByZWNlaXZlIHRoZSBlbmNvZGVkCiAgICAgT0NTUCByZXNwb25zZSB2aWEgYSBjYWxsYmFjay4gQSBzZXJ2ZXIgY2FuIHF1ZXJ5IHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzCiAgICAgYW5kIHNldCB0aGUgZW5jb2RlZCBPQ1NQIHJlc3BvbnNlIGluIHRoZSBjYWxsYmFjay4gQWRkIHNpbXBsaWZpZWQgZXhhbXBsZXMKICAgICB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhmIGFuZCAwLjkuOGcgIFsxOSBPY3QgMjAwN10KCiAgKikgRml4IHZhcmlvdXMgYnVnczoKICAgICArIEJpbmFyeSBpbmNvbXBhdGliaWxpdHkgb2Ygc3NsX2N0eF9zdCBzdHJ1Y3R1cmUKICAgICArIERUTFMgaW50ZXJvcGVyYXRpb24gd2l0aCBub24tY29tcGxpYW50IHNlcnZlcnMKICAgICArIERvbid0IGNhbGwgZ2V0X3Nlc3Npb25fY2IoKSB3aXRob3V0IHByb3Bvc2VkIHNlc3Npb24KICAgICArIEZpeCBpYTY0IGFzc2VtYmxlciBjb2RlCiAgICAgW0FuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhlIGFuZCAwLjkuOGYgIFsxMSBPY3QgMjAwN10KCiAgKikgRFRMUyBIYW5kc2hha2Ugb3ZlcmhhdWwuIFRoZXJlIHdlcmUgbG9uZ3N0YW5kaW5nIGlzc3VlcyB3aXRoCiAgICAgT3BlblNTTCBEVExTIGltcGxlbWVudGF0aW9uLCB3aGljaCB3ZXJlIG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvcgogICAgIFJGQyA0MzQ3IGNvbXBsaWFudCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBPcGVuU1NMIHNlcnZlci4KICAgICBVbmZvcnR1bmF0ZWx5IGp1c3QgZml4aW5nIHRoZXNlIGluY29tcGF0aWJpbGl0aWVzIHdvdWxkICJjdXQgb2ZmIgogICAgIHByZS0wLjkuOGYgY2xpZW50cy4gVG8gYWxsb3cgZm9yIGhhc3NsZSBmcmVlIHVwZ3JhZGUgcG9zdC0wLjkuOGUKICAgICBzZXJ2ZXIga2VlcHMgdG9sZXJhdGluZyBub24gUkZDIGNvbXBsaWFudCBzeW50YXguIFRoZSBvcHBvc2l0ZSBpcwogICAgIG5vdCB0cnVlLCAwLjkuOGYgY2xpZW50IGNhbiBub3QgY29tbXVuaWNhdGUgd2l0aCBlYXJsaWVyIHNlcnZlci4KICAgICBUaGlzIHVwZGF0ZSBldmVuIGFkZHJlc3NlcyBDVkUtMjAwNy00OTk1LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBDaGFuZ2VzIHRvIGF2b2lkIG5lZWQgZm9yIGZ1bmN0aW9uIGNhc3RzIGluIE9wZW5TU0w6IHNvbWUgY29tcGlsZXJzCiAgICAgKGdjYyA0LjIgYW5kIGxhdGVyKSByZWplY3QgdGhlaXIgdXNlLgogICAgIFtLdXJ0IFJvZWNreCA8a3VydEByb2Vja3guYmU+LCBQZXRlciBIYXJ0bGV5IDxwZGhAdXR0ZXIuY2hhb3Mub3JnLnVrPiwKICAgICAgU3RldmUgSGVuc29uXQogIAogICopIEFkZCBSRkM0NTA3IHN1cHBvcnQgdG8gT3BlblNTTC4gVGhpcyBpbmNsdWRlcyB0aGUgY29ycmVjdGlvbnMgaW4KICAgICBSRkM0NTA3YmlzLiBUaGUgZW5jcnlwdGVkIHRpY2tldCBmb3JtYXQgaXMgYW4gZW5jcnlwdGVkIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUsIHRoYXQgd2F5IG5ldyBzZXNzaW9uIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5CiAgICAgc3VwcG9ydGVkLgoKICAgICBJZiBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYWNoZXMgc2Vzc2lvbiBpbiBhbiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUKICAgICBzdXBwb3J0IGlzIHRyYW5zcGFyZW50IGJlY2F1c2UgdGlja2V0cyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OLgogICAgIAogICAgIFRoZSBTU0xfQ1RYIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBrZXlzIGZvciB0aWNrZXQKICAgICBwcm90ZWN0aW9uIGluIHNlcnZlcnMgc28gYWdhaW4gc3VwcG9ydCBzaG91bGQgYmUgcG9zc2libGUKICAgICB3aXRoIG5vIGFwcGxpY2F0aW9uIG1vZGlmaWNhdGlvbi4KCiAgICAgSWYgYSBjbGllbnQgb3Igc2VydmVyIHdpc2hlcyB0byBkaXNhYmxlIFJGQzQ1MDcgc3VwcG9ydCB0aGVuIHRoZSBvcHRpb24KICAgICBTU0xfT1BfTk9fVElDS0VUIGNhbiBiZSBzZXQuCgogICAgIEFkZCBhIFRMUyBleHRlbnNpb24gZGVidWdnaW5nIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBjb250ZW50cyBvZiBhbnkgY2xpZW50CiAgICAgb3Igc2VydmVyIGV4dGVuc2lvbnMgdG8gYmUgZXhhbWluZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBUTFMgZXh0ZW5zaW9ucywgc3BlY2lmaWNhbGx5IGZvciB0aGUgc2VydmVyX25hbWUKICAgICBleHRlbnNpb24gc28gZmFyLiAgVGhlIFNTTF9TRVNTSU9OLCBTU0xfQ1RYLCBhbmQgU1NMIGRhdGEgc3RydWN0dXJlcyBub3cKICAgICBoYXZlIG5ldyBtZW1iZXJzIGZvciBhIGhvc3QgbmFtZS4gIFRoZSBTU0wgZGF0YSBzdHJ1Y3R1cmUgaGFzIGFuCiAgICAgYWRkaXRpb25hbCBtZW1iZXIgU1NMX0NUWCAqaW5pdGlhbF9jdHggc28gdGhhdCBuZXcgc2Vzc2lvbnMgY2FuIGJlCiAgICAgc3RvcmVkIGluIHRoYXQgY29udGV4dCB0byBhbGxvdyBmb3Igc2Vzc2lvbiByZXN1bXB0aW9uLCBldmVuIGFmdGVyIHRoZQogICAgIFNTTCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIG5ldyBTU0xfQ1RYIGluIHJlYWN0aW9uIHRvIGEgY2xpZW50J3MKICAgICBzZXJ2ZXJfbmFtZSBleHRlbnNpb24uCgogICAgIE5ldyBmdW5jdGlvbnMgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZSgpCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZV90eXBlKCkKICAgICAgICAgU1NMX3NldF9TU0xfQ1RYKCkKCiAgICAgTmV3IENUUkwgY29kZXMgYW5kIG1hY3JvcyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FICAgICAgICAgICAtIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCgogICAgIG9wZW5zc2wgc19jbGllbnQgaGFzIGEgbmV3ICctc2VydmVybmFtZSAuLi4nIG9wdGlvbi4KCiAgICAgb3BlbnNzbCBzX3NlcnZlciBoYXMgbmV3IG9wdGlvbnMgJy1zZXJ2ZXJuYW1lX2hvc3QgLi4uJywgJy1jZXJ0MiAuLi4nLAogICAgICcta2V5MiAuLi4nLCAnLXNlcnZlcm5hbWVfZmF0YWwnIChzdWJqZWN0IHRvIGNoYW5nZSkuICBUaGlzIGFsbG93cwogICAgIHRlc3RpbmcgdGhlIEhvc3ROYW1lIGV4dGVuc2lvbiBmb3IgYSBzcGVjaWZpYyBzaW5nbGUgaG9zdCBuYW1lICgnLWNlcnQnCiAgICAgYW5kICcta2V5JyByZW1haW4gZmFsbGJhY2tzIGZvciBoYW5kc2hha2VzIHdpdGhvdXQgSG9zdE5hbWUKICAgICBuZWdvdGlhdGlvbikuICBJZiB0aGUgdW5yZWNvZ25pemVkX25hbWUgYWxlcnQgaGFzIHRvIGJlIHNlbnQsIHRoaXMgYnkKICAgICBkZWZhdWx0IGlzIGEgd2FybmluZzsgaXQgYmVjb21lcyBmYXRhbCB3aXRoIHRoZSAnLXNlcnZlcm5hbWVfZmF0YWwnCiAgICAgb3B0aW9uLgoKICAgICBbUGV0ZXIgU3lsdmVzdGVyLCAgUmVteSBBbGxhaXMsIENocmlzdG9waGUgUmVub3UsIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEFFUyBhbmQgU1NFMiBhc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHRvIFZDKysgYnVpbGQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWl0aWdhdGUgYXR0YWNrIG9uIGZpbmFsIHN1YnRyYWN0aW9uIGluIE1vbnRnb21lcnkgcmVkdWN0aW9uLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBGaXggY3J5cHRvL2VjL2VjX211bHQuYyB0byB3b3JrIHByb3Blcmx5IHdpdGggc2NhbGFycyBvZiB2YWx1ZSAwCiAgICAgKHdoaWNoIHByZXZpb3VzbHkgY2F1c2VkIGFuIGludGVybmFsIGVycm9yKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTcXVlZXplIGFub3RoZXIgMTAlIG91dCBvZiBJR0UgbW9kZSB3aGVuIGluICE9IG91dC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQUVTIElHRSBtb2RlIHNwZWVkdXAuCiAgICAgW0RlYW4gR2F1ZGV0IChHb29nbGUpXQoKICAqKSBBZGQgdGhlIEtvcmVhbiBzeW1tZXRyaWMgMTI4LWJpdCBjaXBoZXIgU0VFRCAoc2VlCiAgICAgaHR0cDovL3d3dy5raXNhLm9yLmtyL2tpc2Evc2VlZC9qc3Avc2VlZF9lbmcuanNwKSBhbmQKICAgICBhZGQgU0VFRCBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMgNDE2MjoKCiAgICAgICAgVExTX1JTQV9XSVRIX1NFRURfQ0JDX1NIQSAgICAgID0gICJTRUVELVNIQSIKICAgICAgICBUTFNfREhFX0RTU19XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkRIRS1EU1MtU0VFRC1TSEEiCiAgICAgICAgVExTX0RIRV9SU0FfV0lUSF9TRUVEX0NCQ19TSEEgID0gICJESEUtUlNBLVNFRUQtU0hBIgogICAgICAgIFRMU19ESF9hbm9uX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiQURILVNFRUQtU0hBIgoKICAgICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIGJldHdlZW4gcGF0Y2hsZXZlbHMgaW4gdGhlIE9wZW5TU0wgMC45LjgKICAgICBzZXJpZXMsIFNFRUQgcmVtYWlucyBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uIHVubGVzcyBPcGVuU1NMCiAgICAgaXMgY29uZmlndXJlZCB3aXRoICdlbmFibGUtc2VlZCcuCiAgICAgW0tJU0EsIEJvZG8gTW9lbGxlcl0KCiAgKikgTWl0aWdhdGUgYnJhbmNoIHByZWRpY3Rpb24gYXR0YWNrcywgd2hpY2ggY2FuIGJlIHByYWN0aWNhbCBpZiBhCiAgICAgc2luZ2xlIHByb2Nlc3NvciBpcyBzaGFyZWQsIGFsbG93aW5nIGEgc3B5IHByb2Nlc3MgdG8gZXh0cmFjdAogICAgIGluZm9ybWF0aW9uLiAgRm9yIGRldGFpbGVkIGJhY2tncm91bmQgaW5mb3JtYXRpb24sIHNlZQogICAgIGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAwNy8wMzkgKE8uIEFjaWljbWV6LCBTLiBHdWVyb24sCiAgICAgSi4tUC4gU2VpZmVydCwgIk5ldyBCcmFuY2ggUHJlZGljdGlvbiBWdWxuZXJhYmlsaXRpZXMgaW4gT3BlblNTTAogICAgIGFuZCBOZWNlc3NhcnkgU29mdHdhcmUgQ291bnRlcm1lYXN1cmVzIikuICBUaGUgY29yZSBvZiB0aGUgY2hhbmdlCiAgICAgYXJlIG5ldyB2ZXJzaW9ucyBCTl9kaXZfbm9fYnJhbmNoKCkgYW5kCiAgICAgQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKCkgb2YgQk5fZGl2KCkgYW5kIEJOX21vZF9pbnZlcnNlKCksCiAgICAgcmVzcGVjdGl2ZWx5LCB3aGljaCBhcmUgc2xvd2VyLCBidXQgYXZvaWQgdGhlIHNlY3VyaXR5LXJlbGV2YW50CiAgICAgY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgQk5fZGl2KCkKICAgICBhbmQgQk5fbW9kX2ludmVyc2UoKSBpZiB0aGUgZmxhZyBCTl9GTEdfQ09OU1RUSU1FIGlzIHNldCBmb3Igb25lCiAgICAgb2YgdGhlIGlucHV0IEJJR05VTXMuICBBbHNvLCBCTl9pc19iaXRfc2V0KCkgaGFzIGJlZW4gY2hhbmdlZCB0bwogICAgIHJlbW92ZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KCiAgICAgQk5fRkxHX0NPTlNUVElNRSBpcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBwcmV2aW91cwogICAgIEJOX0ZMR19FWFBfQ09OU1RUSU1FIGZsYWcsIHNpbmNlIGl0IG5vdyBhZmZlY3RzIG1vcmUgdGhhbiBqdXN0CiAgICAgbW9kdWxhciBleHBvbmVudGlhdGlvbi4gIChTaW5jZSBPcGVuU1NMIDAuOS43aCwgc2V0dGluZyB0aGlzIGZsYWcKICAgICBpbiB0aGUgZXhwb25lbnQgY2F1c2VzIEJOX21vZF9leHBfbW9udCgpIHRvIHVzZSB0aGUgYWx0ZXJuYXRpdmUKICAgICBpbXBsZW1lbnRhdGlvbiBpbiBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKCkuKSAgVGhlIG9sZCBuYW1lCiAgICAgcmVtYWlucyBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMuCgogICAgIFNpbWlsYXJ5LCBSU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FIGlzIHJlcGxhY2VkIGJ5IGEgbW9yZSBnZW5lcmFsCiAgICAgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FIGZsYWcgc2luY2UgdGhlIFJTQSBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcwogICAgIGNvbnN0YW50LXRpbWUgaW1wbGVtZW50YXRpb25zIGZvciBtb3JlIHRoYW4ganVzdCBleHBvbmVudGlhdGlvbi4KICAgICBIZXJlIHRvbyB0aGUgb2xkIG5hbWUgaXMga2VwdCBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMuCgogICAgIEJOX0JMSU5ESU5HX25ldygpIHdpbGwgbm93IHVzZSBCTl9kdXAoKSBmb3IgdGhlIG1vZHVsdXMgc28gdGhhdAogICAgIHRoZSBCTl9CTElORElORyBzdHJ1Y3R1cmUgZ2V0cyBhbiBpbmRlcGVuZGVudCBjb3B5IG9mIHRoZQogICAgIG1vZHVsdXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByZXZpb3VzICJCSUdOVU0gKm0iIGFyZ3VtZW50IHRvCiAgICAgQk5fQkxJTkRJTkdfbmV3KCkgYW5kIHRvIEJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSgpIG5vdwogICAgIGVzc2VudGlhbGx5IGJlY29tZXMgImNvbnN0IEJJR05VTSAqbSIsIGFsdGhvdWdoIHdlIGNhbid0IGFjdHVhbGx5CiAgICAgY2hhbmdlIHRoaXMgaW4gdGhlIGhlYWRlciBmaWxlIGJlZm9yZSAwLjkuOS4gIEl0IGFsbG93cwogICAgIFJTQV9zZXR1cF9ibGluZGluZygpIHRvIHVzZSBCTl93aXRoX2ZsYWdzKCkgb24gdGhlIG1vZHVsdXMgdG8KICAgICBlbmFibGUgQk5fRkxHX0NPTlNUVElNRS4KCiAgICAgW01hdHRoZXcgRCBXb29kIChJbnRlbCBDb3JwKV0KCiAgKikgSW4gdGhlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uLCBiZSBzdHJpY3QgYWJvdXQgc2Vzc2lvbiBJRAogICAgIGNvbnRleHQgbWF0Y2hpbmcgKHdoaWNoIG1hdHRlcnMgaWYgYW4gYXBwbGljYXRpb24gdXNlcyBhIHNpbmdsZQogICAgIGV4dGVybmFsIGNhY2hlIGZvciBkaWZmZXJlbnQgcHVycG9zZXMpLiAgUHJldmlvdXNseSwKICAgICBvdXQtb2YtY29udGV4dCByZXVzZSB3YXMgZm9yYmlkZGVuIG9ubHkgaWYgU1NMX1ZFUklGWV9QRUVSIHdhcwogICAgIHNldC4gIFRoaXMgZGlkIGVuc3VyZSBzdHJpY3QgY2xpZW50IHZlcmlmaWNhdGlvbiwgYnV0IG1lYW50IHRoYXQsCiAgICAgd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgYSBzaW5nbGUgZXh0ZXJuYWwgY2FjaGUgZm9yIHF1aXRlCiAgICAgZGlmZmVyZW50IHJlcXVpcmVtZW50cywgY2xpZW50cyBjb3VsZCBjaXJjdW12ZW50IGNpcGhlcnN1aXRlCiAgICAgcmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIHNlc3Npb24gSUQgY29udGV4dCBieSBzdGFydGluZyBhIHNlc3Npb24KICAgICBpbiBhIGRpZmZlcmVudCBjb250ZXh0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgIiFlTlVMTCIgaW4gU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QgdG8gbWFrZSBzdXJlIHRoYXQKICAgICBhIGNpcGhlcnN1aXRlIHN0cmluZyBzdWNoIGFzICJERUZBVUxUOlJTQSIgY2Fubm90IGVuYWJsZQogICAgIGF1dGhlbnRpY2F0aW9uLW9ubHkgY2lwaGVyc3VpdGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSB0aGUgU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZpeCBDVkUtMjAwNi0zNzM4IHdoaWNoIHdhcwogICAgIG5vdCBjb21wbGV0ZSBhbmQgY291bGQgbGVhZCB0byBhIHBvc3NpYmxlIHNpbmdsZSBieXRlIG92ZXJmbG93CiAgICAgKENWRS0yMDA3LTUxMzUpIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGQgYW5kIDAuOS44ZSAgWzIzIEZlYiAyMDA3XQoKICAqKSBTaW5jZSBBRVMxMjggYW5kIEFFUzI1NiAoYW5kIHNpbWlsYXJseSBDYW1lbGxpYTEyOCBhbmQKICAgICBDYW1lbGxpYTI1Nikgc2hhcmUgYSBzaW5nbGUgbWFzayBiaXQgaW4gdGhlIGxvZ2ljIG9mCiAgICAgc3NsL3NzbF9jaXBoLmMsIHRoZSBjb2RlIGZvciBtYXNraW5nIG91dCBkaXNhYmxlZCBjaXBoZXJzIG5lZWRzIGEKICAgICBrbHVkZ2UgdG8gd29yayBwcm9wZXJseSBpZiBBRVMxMjggaXMgYXZhaWxhYmxlIGFuZCBBRVMyNTYgaXNuJ3QKICAgICAob3IgaWYgQ2FtZWxsaWExMjggaXMgYXZhaWxhYmxlIGFuZCBDYW1lbGxpYTI1NiBpc24ndCkuCiAgICAgW1ZpY3RvciBEdWNob3ZuaV0KCiAgKikgRml4IHRoZSBCSVQgU1RSSU5HIGVuY29kaW5nIGdlbmVyYXRlZCBieSBjcnlwdG8vZWMvZWNfYXNuMS5jCiAgICAgKHdpdGhpbiBpMmRfRUNQcml2YXRlS2V5LCBpMmRfRUNQS1BhcmFtZXRlcnMsIGkyZF9FQ1BhcmFtZXRlcnMpOgogICAgIFdoZW4gYSBwb2ludCBvciBhIHNlZWQgaXMgZW5jb2RlZCBpbiBhIEJJVCBTVFJJTkcsIHdlIG5lZWQgdG8KICAgICBwcmV2ZW50IHRoZSByZW1vdmFsIG9mIHRyYWlsaW5nIHplcm8gYml0cyB0byBnZXQgdGhlIHByb3BlciBERVIKICAgICBlbmNvZGluZy4gIChCeSBkZWZhdWx0LCBjcnlwdG8vYXNuMS9hX2JpdHN0ci5jIGFzc3VtZXMgdGhlIGNhc2UKICAgICBvZiBhIE5hbWVkQml0TGlzdCwgZm9yIHdoaWNoIHRyYWlsaW5nIDAgYml0cyBuZWVkIHRvIGJlIHJlbW92ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEhhdmUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gdG9sZXJhdGUgIm1pc21hdGNoZWQiIHJlY29yZAogICAgIHByb3RvY29sIHZlcnNpb24gd2hpbGUgcmVjZWl2aW5nIENsaWVudEhlbGxvIGV2ZW4gaWYgdGhlCiAgICAgQ2xpZW50SGVsbG8gaXMgZnJhZ21lbnRlZC4gIChUaGUgc2VydmVyIGNhbid0IGluc2lzdCBvbiB0aGUKICAgICBwYXJ0aWN1bGFyIHByb3RvY29sIHZlcnNpb24gaXQgaGFzIGNob3NlbiBiZWZvcmUgdGhlIFNlcnZlckhlbGxvCiAgICAgbWVzc2FnZSBoYXMgaW5mb3JtZWQgdGhlIGNsaWVudCBhYm91dCBoaXMgY2hvaWNlLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkZDIDM3Nzkgc3VwcG9ydC4KICAgICBbUm9iIEF1c3RlaW4gZm9yIEFSSU4sIEJlbiBMYXVyaWVdCgogICopIExvYWQgZXJyb3IgY29kZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbnN0ZWFkIG9mIHVzaW5nIGEKICAgICBzdGF0aWMgdmFyaWFibGUuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgY2xlYW5seSB1bmxvYWRlZCBhbmQgcmVsb2FkZWQuCiAgICAgSW1wcm92ZSBoZWFkZXIgZmlsZSBmdW5jdGlvbiBuYW1lIHBhcnNpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZXh0ZW5kIFNNVFAgYW5kIElNQVAgcHJvdG9jb2wgZW11bGF0aW9uIGluIHNfY2xpZW50IHRvIHVzZSBFSExPCiAgICAgb3IgQ0FQQUJJTElUWSBoYW5kc2hha2UgYXMgcmVxdWlyZWQgYnkgUkZDcy4KICAgICBbR29ldHogQmFiaW4tRWJlbGxdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YyBhbmQgMC45LjhkICBbMjggU2VwIDIwMDZdCgogICopIEludHJvZHVjZSBsaW1pdHMgdG8gcHJldmVudCBtYWxpY2lvdXMga2V5cyBiZWluZyBhYmxlIHRvCiAgICAgY2F1c2UgYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTQwKQogICAgIFtTdGV2ZSBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IEFTTi4xIHBhcnNpbmcgb2YgY2VydGFpbiBpbnZhbGlkIHN0cnVjdHVyZXMgdGhhdCBjYW4gcmVzdWx0CiAgICAgaW4gYSBkZW5pYWwgb2Ygc2VydmljZS4gIChDVkUtMjAwNi0yOTM3KSAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZnVuY3Rpb24uIAogICAgIChDVkUtMjAwNi0zNzM4KSBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBGaXggU1NMIGNsaWVudCBjb2RlIHdoaWNoIGNvdWxkIGNyYXNoIGlmIGNvbm5lY3RpbmcgdG8gYQogICAgIG1hbGljaW91cyBTU0x2MiBzZXJ2ZXIuICAoQ1ZFLTIwMDYtNDM0MykKICAgICBbVGF2aXMgT3JtYW5keSBhbmQgV2lsbCBEcmV3cnksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBTaW5jZSAwLjkuOGIsIGNpcGhlcnN1aXRlIHN0cmluZ3MgbmFtaW5nIGV4cGxpY2l0IGNpcGhlcnN1aXRlcwogICAgIG1hdGNoIG9ubHkgdGhvc2UuICBCZWZvcmUgdGhhdCwgIkFFUzI1Ni1TSEEiIHdvdWxkIGJlIGludGVycHJldGVkCiAgICAgYXMgYSBwYXR0ZXJuIGFuZCBtYXRjaCAiQUVTMTI4LVNIQSIgdG9vIChzaW5jZSBBRVMxMjgtU0hBIGdvdAogICAgIHRoZSBzYW1lIHN0cmVuZ3RoIGNsYXNzaWZpY2F0aW9uIGluIDAuOS43aCkgYXMgd2UgY3VycmVudGx5IG9ubHkKICAgICBoYXZlIGEgc2luZ2xlIEFFUyBiaXQgaW4gdGhlIGNpcGhlcnN1aXRlIGRlc2NyaXB0aW9uIGJpdG1hcC4KICAgICBUaGF0IGNoYW5nZSwgaG93ZXZlciwgYWxzbyBhcHBsaWVkIHRvIGNpcGhlcnN1aXRlIHN0cmluZ3Mgc3VjaCBhcwogICAgICJSQzQtTUQ1IiB0aGF0IGludGVudGlvbmFsbHkgbWF0Y2hlZCBtdWx0aXBsZSBjaXBoZXJzdWl0ZXMgLS0KICAgICBuYW1lbHksIFNTTCAyLjAgY2lwaGVyc3VpdGVzIGluIGFkZGl0aW9uIHRvIHRoZSBtb3JlIGNvbW1vbiBvbmVzCiAgICAgZnJvbSBTU0wgMy4wL1RMUyAxLjAuCgogICAgIFNvIHdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBhZ2FpbjogTmFtaW5nIGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyc3VpdGUgc2VsZWN0cyB0aGlzIG9uZSBjaXBoZXJzdWl0ZSwgYW5kIGFueSBvdGhlciBzaW1pbGFyCiAgICAgY2lwaGVyc3VpdGUgKHNhbWUgYml0bWFwKSBmcm9tICpvdGhlciogcHJvdG9jb2wgdmVyc2lvbnMuCiAgICAgVGh1cywgIlJDNC1NRDUiIGFnYWluIHdpbGwgcHJvcGVybHkgc2VsZWN0IGJvdGggdGhlIFNTTCAyLjAKICAgICBjaXBoZXJzdWl0ZSBhbmQgdGhlIFNTTCAzLjAvVExTIDEuMCBjaXBoZXJzdWl0ZS4KCiAgICAgU2luY2UgU1NMIDIuMCBkb2VzIG5vdCBoYXZlIGFueSBjaXBoZXJzdWl0ZXMgZm9yIHdoaWNoIHRoZQogICAgIDEyOC8yNTYgYml0IGRpc3RpbmN0aW9uIHdvdWxkIGJlIHJlbGV2YW50LCB0aGlzIHdvcmtzIGZvciBub3cuCiAgICAgVGhlIHByb3BlciBmaXggd2lsbCBiZSB0byB1c2UgZGlmZmVyZW50IGJpdHMgZm9yIEFFUzEyOCBhbmQKICAgICBBRVMyNTYsIHdoaWNoIHdvdWxkIGhhdmUgYXZvaWRlZCB0aGUgcHJvYmxlbXMgZnJvbSB0aGUgYmVnaW5uaW5nOwogICAgIGhvd2V2ZXIsIGJpdHMgYXJlIHNjYXJjZSwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpbiBhIG5ldyByZWxlYXNlCiAgICAgKG5vdCBqdXN0IGEgcGF0Y2hsZXZlbCkgd2hlbiB3ZSBjYW4gY2hhbmdlIHRoZSBTU0xfQ0lQSEVSCiAgICAgZGVmaW5pdGlvbiB0byBzcGxpdCB0aGUgc2luZ2xlICd1bnNpZ25lZCBsb25nIG1hc2snIGJpdG1hcCBpbnRvCiAgICAgbXVsdGlwbGUgdmFsdWVzIHRvIGV4dGVuZCB0aGUgYXZhaWxhYmxlIHNwYWNlLgoKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGIgYW5kIDAuOS44YyAgWzA1IFNlcCAyMDA2XQoKICAqKSBBdm9pZCBQS0NTICMxIHYxLjUgc2lnbmF0dXJlIGF0dGFjayBkaXNjb3ZlcmVkIGJ5IERhbmllbCBCbGVpY2hlbmJhY2hlcgogICAgIChDVkUtMjAwNi00MzM5KSAgW0JlbiBMYXVyaWUgYW5kIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBBZGQgQUVTIElHRSBhbmQgYmlJR0UgbW9kZXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSB0aGUgVW5peCByYW5kb21uZXNzIGVudHJvcHkgZ2F0aGVyaW5nIHRvIHVzZSBwb2xsKCkgd2hlbgogICAgIHBvc3NpYmxlIGluc3RlYWQgb2Ygc2VsZWN0KCksIHNpbmNlIHRoZSBsYXR0ZXIgaGFzIHNvbWUKICAgICB1bmRlc2lyYWJsZSBsaW1pdGF0aW9ucy4KICAgICBbRGFycnlsIE1pbGVzIHZpYSBSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSAiRUNDZHJhZnQiIGNpcGhlcnN1aXRlcyBtb3JlIHRob3JvdWdobHkuICBOb3cgc3BlY2lhbAogICAgIHRyZWF0bWVudCBpbiBzc2wvc3NsX2NpcGgucyBtYWtlcyBzdXJlIHRoYXQgdGhlc2UgY2lwaGVyc3VpdGVzCiAgICAgY2Fubm90IGJlIGltcGxpY2l0bHkgYWN0aXZhdGVkIGFzIHBhcnQgb2YsIGUuZy4sIHRoZSAiQUVTIiBhbGlhcy4KICAgICBIb3dldmVyLCBwbGVhc2UgdXBncmFkZSB0byBPcGVuU1NMIDAuOS45Wy1kZXZdIGZvcgogICAgIG5vbi1leHBlcmltZW50YWwgdXNlIG9mIHRoZSBFQ0MgY2lwaGVyc3VpdGVzIHRvIGdldCBUTFMgZXh0ZW5zaW9uCiAgICAgc3VwcG9ydCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGN1cnZlIGFuZCBwb2ludCBmb3JtYXQgbmVnb3RpYXRpb24KICAgICB0byBhdm9pZCBwb3RlbnRpYWwgaGFuZHNoYWtlIHByb2JsZW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgcm9ndWUgY2lwaGVyc3VpdGVzOgoKICAgICAgLSBTU0x2MiAweDA4IDB4MDAgMHg4MCAoIlJDNC02NC1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MSAoIkVYUDEwMjQtUkMyLUNCQy1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MCAoIkVYUDEwMjQtUkM0LU1ENSIpCgogICAgIFRoZSBsYXR0ZXIgdHdvIHdlcmUgcHVycG9ydGVkbHkgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMFswMV0udHh0LCBidXQgZG8gbm90IHJlYWxseQogICAgIGFwcGVhciB0aGVyZS4KCiAgICAgQWxzbyBkZWFjdGl2YXRlIHRoZSByZW1haW5pbmcgY2lwaGVyc3VpdGVzIGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAxLnR4dC4gIFRoZXNlIGFyZSBqdXN0IGFzCiAgICAgdW5vZmZpY2lhbCwgYW5kIHRoZSBJRCBoYXMgbG9uZyBleHBpcmVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBSU0EgYmxpbmRpbmcgSGVpc2VuYnVnIChwcm9ibGVtcyBzb21ldGltZXMgb2NjdXJlZCBvbgogICAgIGR1YWwtY29yZSBtYWNoaW5lcykgYW5kIG90aGVyIHBvdGVudGlhbCB0aHJlYWQtc2FmZXR5IGlzc3Vlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdGhlIHN5bW1ldHJpYyBjaXBoZXIgQ2FtZWxsaWEgKDEyOC1iaXQsIDE5Mi1iaXQsIDI1Ni1iaXQga2V5CiAgICAgdmVyc2lvbnMpLCB3aGljaCBpcyBub3cgYXZhaWxhYmxlIGZvciByb3lhbHR5LWZyZWUgdXNlCiAgICAgKHNlZSBodHRwOi8vaW5mby5pc2wubnR0LmNvLmpwL2NyeXB0L2VuZy9pbmZvL2NoaXRla2kuaHRtbCkuCiAgICAgQWxzbywgYWRkIENhbWVsbGlhIFRMUyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMgNDEzMi4KCiAgICAgVG8gbWluaW1pemUgY2hhbmdlcyBiZXR3ZWVuIHBhdGNobGV2ZWxzIGluIHRoZSBPcGVuU1NMIDAuOS44CiAgICAgc2VyaWVzLCBDYW1lbGxpYSByZW1haW5zIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gdW5sZXNzIE9wZW5TU0wKICAgICBpcyBjb25maWd1cmVkIHdpdGggJ2VuYWJsZS1jYW1lbGxpYScuCiAgICAgW05UVF0KCiAgKikgRGlzYWJsZSB0aGUgcGFkZGluZyBidWcgY2hlY2sgd2hlbiBjb21wcmVzc2lvbiBpcyBpbiB1c2UuIFRoZSBwYWRkaW5nCiAgICAgYnVnIGNoZWNrIGFzc3VtZXMgdGhlIGZpcnN0IHBhY2tldCBpcyBvZiBldmVuIGxlbmd0aCwgdGhpcyBpcyBub3QKICAgICBuZWNlc3NhcmlseSB0cnVlIGlmIGNvbXByZXNzc2lvbiBpcyBlbmFibGVkIGFuZCBjYW4gcmVzdWx0IGluIGZhbHNlCiAgICAgcG9zaXRpdmVzIGNhdXNpbmcgaGFuZHNoYWtlIGZhaWx1cmUuIFRoZSBhY3R1YWwgYnVnIHRlc3QgaXMgYW5jaWVudAogICAgIGNvZGUgc28gaXQgaXMgaG9wZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBlaXRoZXIgaGF2ZSBmaXhlZCBpdCBieQogICAgIG5vdyBvciBhbnkgd2hpY2ggc3RpbGwgaGF2ZSB0aGUgYnVnIGRvIG5vdCBzdXBwb3J0IGNvbXByZXNzaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YSBhbmQgMC45LjhiICBbMDQgTWF5IDIwMDZdCgogICopIFdoZW4gYXBwbHlpbmcgYSBjaXBoZXIgcnVsZSBjaGVjayB0byBzZWUgaWYgc3RyaW5nIG1hdGNoIGlzIGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyIHN1aXRlIGFuZCBvbmx5IG1hdGNoIHRoYXQgb25lIGNpcGhlciBzdWl0ZSBpZiBpdCBpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMaW5rIGluIG1hbmlmZXN0cyBmb3IgVkMrKyBpZiBuZWVkZWQuCiAgICAgW0F1c3RpbiBaaWVnbGVyIDxoYWxvc3RhdHVlQGdtYWlsLmNvbT5dCgogICopIFVwZGF0ZSBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgVExTIGNpcGhlcnN1aXRlcyBhY2NvcmRpbmcgdG8KICAgICBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0IHdpdGggcHJvcG9zZWQgY2hhbmdlcyAoYnV0IHdpdGhvdXQKICAgICBUTFMgZXh0ZW5zaW9ucywgd2hpY2ggYXJlIHN1cHBvcnRlZCBzdGFydGluZyB3aXRoIHRoZSAwLjkuOQogICAgIGJyYW5jaCwgbm90IGluIHRoZSBPcGVuU1NMIDAuOS44IGJyYW5jaCkuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFVlBfQ0lQSEVSX0NUWF9uZXcoKSBhbmQgRVZQX0NJUEhFUl9DVFhfZnJlZSgpIHRvIHN1cHBvcnQKICAgICBvcGFxdWUgRVZQX0NJUEhFUl9DVFggaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB6bGliIGNvbXByZXNzaW9uIGNvZGUuIFdlIG5vdyBvbmx5IHVzZQogICAgICJ6bGliMS5kbGwiIGFuZCB1c2UgdGhlIGRlZmF1bHQgX19jZGVjbCBjYWxsaW5nIGNvbnZlbnRpb24gb24gV2luMzIKICAgICB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkcyBtZW50aW9uZWQgaGVyZToKICAgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0L0RMTF9GQVEudHh0CiAgICAgU3RhdGljIHpsaWIgbGlua2luZyBub3cgd29ya3Mgb24gV2luZG93cyBhbmQgdGhlIG5ldyAtLXdpdGgtemxpYi1pbmNsdWRlCiAgICAgLS13aXRoLXpsaWItbGliIG9wdGlvbnMgdG8gQ29uZmlndXJlIGNhbiBiZSB1c2VkIHRvIHN1cHBseSB0aGUgbG9jYXRpb24KICAgICBvZiB0aGUgaGVhZGVycyBhbmQgbGlicmFyeS4gR3JhY2VmdWxseSBoYW5kbGUgY2FzZSB3aGVyZSB6bGliIGxpYnJhcnkKICAgICBjYW4ndCBiZSBsb2FkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V2ZXJhbCBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSBPSUQgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgb2xkIGNvZGUKICAgICBzb21ldGltZXMgYWxsb3dlZCBpbnZhbGlkIE9JRHMgKDEuWCBmb3IgWCA+PSA0MCBmb3IgZXhhbXBsZSksIGNvdWxkbid0CiAgICAgaGFuZGxlIG51bWJlcnMgbGFyZ2VyIHRoYW4gVUxPTkdfTUFYLCB0cnVuY2F0ZWQgcHJpbnRpbmcgYW5kIGhhZCBhCiAgICAgbm9uIHN0YW5kYXJkIE9CSl9vYmoydHh0KCkgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyBvZiBlbmdpbmVzIHVuZGVyIGVuZ2luZS8gYXMgc2hhcmVkIGxpYnJhcmllcwogICAgIHVuZGVyIFZDKysgYnVpbGQgc3lzdGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3RlZCB0aGUgbnVtZXJvdXMgYnVncyBpbiB0aGUgV2luMzIgcGF0aCBzcGxpdHRlciBpbiBEU08uCiAgICAgSG9wZWZ1bGx5LCB3ZSB3aWxsIG5vdCBzZWUgYW55IGZhbHNlIGNvbWJpbmF0aW9uIG9mIHBhdGhzIGFueSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44IGFuZCAwLjkuOGEgIFsxMSBPY3QgMjAwNV0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCiAgICAgKHBhcnQgb2YgU1NMX09QX0FMTCkuICBUaGlzIG9wdGlvbiB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBwcm90b2NvbC12ZXJzaW9uCiAgICAgcm9sbGJhY2sgaW4gdGhlIFNTTCAyLjAgc2VydmVyIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBhIGJhZAogICAgIGlkZWEuICAoQ1ZFLTIwMDUtMjk2OSkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBZdXRha2EgT2l3YSAoUmVzZWFyY2ggQ2VudGVyCiAgICAgZm9yIEluZm9ybWF0aW9uIFNlY3VyaXR5LCBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbAogICAgIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgW0FJU1RdLCBKYXBhbildCgogICopIEFkZCB0d28gZnVuY3Rpb24gdG8gY2xlYXIgYW5kIHJldHVybiB0aGUgdmVyaWZ5IHBhcmFtZXRlciBmbGFncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBLZWVwIGNpcGhlcmxpc3RzIHNvcnRlZCBpbiB0aGUgc291cmNlIGluc3RlYWQgb2Ygc29ydGluZyB0aGVtIGF0CiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQXZvaWQgc29tZSBzbWFsbCBzdWJncm91cCBhdHRhY2tzIGluIERpZmZpZS1IZWxsbWFuLgogICAgIFtOaWNrIE1hdGhld3NvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIGZ1bmN0aW9ucyBmb3Igd2VsbC1rbm93biBwcmltZXMuCiAgICAgW05pY2sgTWF0aGV3c29uXQoKICAqKSBFeHRlbmRlZCBXaW5kb3dzIENFIHN1cHBvcnQuCiAgICAgW1NhdG9zaGkgTmFrYW11cmEgYW5kIEFuZHkgUG9seWFrb3ZdCgogICopIEluaXRpYWxpemUgU1NMX01FVEhPRCBzdHJ1Y3R1cmVzIGF0IGNvbXBpbGUgdGltZSBpbnN0ZWFkIG9mIGR1cmluZwogICAgIHJ1bnRpbWUsIHRodXMgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGEgbG9jay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFBLQ1M3X2RlY3J5cHQoKSB3b3JrIGV2ZW4gaWYgbm8gY2VydGlmaWNhdGUgaXMgc3VwcGxpZWQgYnkKICAgICBhdHRlbXB0aW5nIHRvIGRlY3J5cHQgZWFjaCBlbmNyeXB0ZWQga2V5IGluIHR1cm4uIEFkZCBzdXBwb3J0IHRvCiAgICAgc21pbWUgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ggYW5kIDAuOS44ICBbMDUgSnVsIDIwMDVdCgogIFtOQjogT3BlblNTTCAwLjkuN2kgYW5kIGxhdGVyIDAuOS43IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuOC5dCgogICopIEFkZCBsaWJjcnlwdG8ucGMgYW5kIGxpYnNzbC5wYyBmb3IgdGhvc2Ugd2hvIGZlZWwgdGhleSBuZWVkIHRoZW0uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIENBLnNoIGFuZCBDQS5wbCBzbyB0aGV5IGRvbid0IGJ1bmRsZSB0aGUgQ1NSIGFuZCB0aGUgcHJpdmF0ZQogICAgIGtleSBpbnRvIHRoZSBzYW1lIGZpbGUgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgV2luNjQsIGJvdGggSUE2NCBhbmQgQU1ENjQveDY0IGZsYXZvcnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtdXRmOCBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZyBmaWxlIG9wdGlvbiB0byAnY2EnLgogICAgIFtTdGVmYW4gPHN0ZkB1ZG9tYS5vcmddCgogICopIFJlbW92ZWQgdGhlIG1hY3JvIGRlc19jcnlwdCgpLCBhcyBpdCBzZWVtcyB0byBjb25mbGljdCB3aXRoIHNvbWUKICAgICBsaWJyYXJpZXMuICBVc2UgREVTX2NyeXB0KCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29ycmVjdCBuYW1pbmcgb2YgdGhlICdjaGlsJyBhbmQgJzQ3NThjY2EnIEVOR0lORXMuIFRoaXMKICAgICBpbnZvbHZlcyByZW5hbWluZyB0aGUgc291cmNlIGFuZCBnZW5lcmF0ZWQgc2hhcmVkLWxpYnMgZm9yCiAgICAgYm90aC4gVGhlIGVuZ2luZXMgd2lsbCBhY2NlcHQgdGhlIGNvcnJlY3RlZCBvciBsZWdhY3kgaWRzCiAgICAgKCduY2lwaGVyJyBhbmQgJzQ3NThfY2NhJyByZXNwZWN0aXZlbHkpIHdoZW4gYmluZGluZy4gTkIsCiAgICAgdGhpcyBvbmx5IGFwcGxpZXMgd2hlbiBidWlsZGluZyAnc2hhcmVkJy4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF0dHJpYnV0ZSBmdW5jdGlvbnMgdG8gRVZQX1BLRVkgc3RydWN0dXJlLiBNb2RpZnkKICAgICBQS0NTMTJfY3JlYXRlKCkgdG8gcmVjb2duaXplIGEgQ1NQIG5hbWUgYXR0cmlidXRlIGFuZAogICAgIHVzZSBpdC4gTWFrZSAtQ1NQIG9wdGlvbiB3b3JrIGFnYWluIGluIHBrY3MxMiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgYm4gYmxpbmRpbmcgY29kZToKICAgICAtIGF1dG9tYXRpYyByZS1jcmVhdGlvbiBvZiB0aGUgQk5fQkxJTkRJTkcgcGFyYW1ldGVycyBhZnRlcgogICAgICAgYSBmaXhlZCBudW1iZXIgb2YgdXNlcyAoY3VycmVudGx5IDMyKQogICAgIC0gYWRkIG5ldyBmdW5jdGlvbiBmb3IgcGFyYW1ldGVyIGNyZWF0aW9uCiAgICAgLSBpbnRyb2R1Y2UgZmxhZ3MgdG8gY29udHJvbCB0aGUgdXBkYXRlIGJlaGF2aW91ciBvZiB0aGUKICAgICAgIEJOX0JMSU5ESU5HIHBhcmFtZXRlcnMKICAgICAtIGhpZGUgQk5fQkxJTkRJTkcgc3RydWN0dXJlCiAgICAgQWRkIGEgc2Vjb25kIEJOX0JMSU5ESU5HIHNsb3QgdG8gdGhlIFJTQSBzdHJ1Y3R1cmUgdG8gaW1wcm92ZQogICAgIHBlcmZvcm1hbmNlIHdoZW4gYSBzaW5nbGUgUlNBIG9iamVjdCBpcyBzaGFyZWQgYW1vbmcgc2V2ZXJhbAogICAgIHRocmVhZHMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRFRMUy4KICAgICBbTmFnZW5kcmEgTW9kYWR1Z3UgPG5hZ2VuZHJhQGNzLnN0YW5mb3JkLmVkdT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBERVIgZW5jb2RlZCBwcml2YXRlIGtleXMgKFNTTF9GSUxFVFlQRV9BU04xKQogICAgIHRvIFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSgpIGFuZCBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZSgpCiAgICAgW1dhbHRlciBHb3VsZXRdCgogICopIFJlbW92ZSBidWdneSBhbmQgaW5jb21wbGV0ZSBESCBjZXJ0IHN1cHBvcnQgZnJvbQogICAgIHNzbC9zc2xfcnNhLmMgYW5kIHNzbC9zM19ib3RoLmMKICAgICBbTmlscyBMYXJzY2hdCgogICopIFVzZSBTSEEtMSBpbnN0ZWFkIG9mIE1ENSBhcyB0aGUgZGVmYXVsdCBkaWdlc3QgYWxnb3JpdGhtIGZvcgogICAgIHRoZSBhcHBzL29wZW5zc2wgYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQ29tcGlsZSBjbGVhbiB3aXRoICItV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV2Vycm9yIi4gQ3VycmVudGx5CiAgICAgREVCVUdfU0FGRVNUQUNLIG11c3QgYWxzbyBiZSBzZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSAuL0NvbmZpZ3VyZSBzbyB0aGF0IGNlcnRhaW4gYWxnb3JpdGhtcyBjYW4gYmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgICBUaGUgbmV3IGNvdW50ZXJwaWVjZSB0byAibm8teHh4IiBpcyAiZW5hYmxlLXh4eCIuCgogICAgIFRoZSBwYXRlbnRlZCBSQzUgYW5kIE1EQzIgYWxnb3JpdGhtcyB3aWxsIG5vdyBiZSBkaXNhYmxlZCB1bmxlc3MKICAgICAiZW5hYmxlLXJjNSIgYW5kICJlbmFibGUtbWRjMiIsIHJlc3BlY3RpdmVseSwgYXJlIHNwZWNpZmllZC4KCiAgICAgKElERUEgcmVtYWlucyBlbmFibGVkIGRlc3BpdGUgYmVpbmcgcGF0ZW50ZWQuICBUaGlzIGlzIGJlY2F1c2UgSURFQQogICAgIGlzIGZyZXF1ZW50bHkgcmVxdWlyZWQgZm9yIGludGVyb3BlcmFiaWxpdHksIGFuZCB0aGVyZSBpcyBubyBsaWNlbnNlCiAgICAgZmVlIGZvciBub24tY29tbWVyY2lhbCB1c2UuICBBcyBiZWZvcmUsICJuby1pZGVhIiBjYW4gYmUgdXNlZCB0bwogICAgIGF2b2lkIHRoaXMgYWxnb3JpdGhtLikKCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHByb2Nlc3Npbmcgb2YgcHJveHkgY2VydGlmaWNhdGVzIChzZWUgUkZDIDM4MjApLiAgVGhpcyB3b3JrIHdhcwogICAgIHNwb25zb3JlZCBieSBLVEggKFRoZSBSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSBpbiBTdG9ja2hvbG0pIGFuZAogICAgIEVHRUUgKEVuYWJsaW5nIEdyaWRzIGZvciBFLXNjaWVuY2UgaW4gRXVyb3BlKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSQzQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMvaW1wbGVtZW50YXRpb25zLCBzdWNoCiAgICAgYXMgSW50ZWwgUDQsIElBLTY0IGFuZCBBTUQ2NC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IHV0aWxpdHkgZXh0cmFjdC1zZWN0aW9uLnBsLiBUaGlzIGNhbiBiZSB1c2VkIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBzZWN0aW9uIG51bWJlciBpbiBhIHBvZCBmaWxlIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyZWF0IGVhY2ggZmlsZSBhcwogICAgIGEgc2VwYXJhdGUgY2FzZSBpbiBNYWtlZmlsZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBhZGRpbmcgdHdvIGxpbmVzIHRvIHRoZQogICAgIHBvZCBmaWxlOgoKICAgICA9Zm9yIGNvbW1lbnQgb3BlbnNzbF9zZWN0aW9uOlhYWAoKICAgICBUaGUgYmxhbmsgbGluZSBpcyBtYW5kYXRvcnkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhcmd1bWVudHMgLWNlcnRmb3JtLCAta2V5Zm9ybSBhbmQgLXBhc3MgZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIHRvIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdCBrZXkgYW5kIGNlcnRpZmljYXRlIGZpbGVzIGFuZCBwYXNzcGhyYXNlCiAgICAgc291cmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3RydWN0dXJlIFg1MDlfVkVSSUZZX1BBUkFNIHdoaWNoIGNvbWJpbmVzIGN1cnJlbnQgdmVyaWZ5IHBhcmFtZXRlcnMsCiAgICAgdXBkYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcyBhbmQgYWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuCgogICAgIEFkZCBuZXcgcG9saWN5IHJlbGF0ZWQgdmVyaWZ5IHBhcmFtZXRlcnMsIGluY2x1ZGUgcG9saWN5IGNoZWNraW5nIGluIAogICAgIHN0YW5kYXJkIHZlcmlmeSBjb2RlLiBFbmhhbmNlICdzbWltZScgYXBwbGljYXRpb24gd2l0aCBleHRyYSBwYXJhbWV0ZXJzCiAgICAgdG8gc3VwcG9ydCBwb2xpY3kgY2hlY2tpbmcgYW5kIHByaW50IG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZW5naW5lIHRvIHN1cHBvcnQgVklBIFBhZExvY2sgQUNFIGV4dGVuc2lvbnMgaW4gdGhlIFZJQSBDMwogICAgIE5laGVtaWFoIHByb2Nlc3NvcnMuIFRoZXNlIGV4dGVuc2lvbnMgc3VwcG9ydCBBRVMgZW5jcnlwdGlvbiBpbiBoYXJkd2FyZQogICAgIGFzIHdlbGwgYXMgUk5HICh0aG91Z2ggUk5HIHN1cHBvcnQgaXMgY3VycmVudGx5IGRpc2FibGVkKS4KICAgICBbTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6Piwgd2l0aCBoZWxwIGZyb20gQW5keSBQb2x5YWtvdl0KCiAgKikgRGVwcmVjYXRlIEJOX1tnZXR8c2V0XV9wYXJhbXMoKSBmdW5jdGlvbnMgKHRoZXkgd2VyZSBpZ25vcmVkIGludGVybmFsbHkpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBGSVBTIDE4MC0yIGFsZ29yaXRobXMsIFNIQS0yMjQvLTI1Ni8tMzg0Ly01MTIgYXJlIGltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292IGFuZCBhIG51bWJlciBvZiBvdGhlciBwZW9wbGVdCgogICopIEltcHJvdmVkIFBvd2VyUEMgcGxhdGZvcm0gc3VwcG9ydC4gTW9zdCBub3RhYmx5IEJJR05VTSBhc3NlbWJsZXIKICAgICBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBJQk0uCiAgICAgW1N1cmVzaCBDaGFyaSwgUGV0ZXIgV2FsdGVuYmVyZywgQW5keSBQb2x5YWtvdl0KCiAgKikgVGhlIG5ldyAnUlNBX2dlbmVyYXRlX2tleV9leCcgZnVuY3Rpb24gbm93IHRha2VzIGEgQklHTlVNIGZvciB0aGUgcHVibGljCiAgICAgZXhwb25lbnQgcmF0aGVyIHRoYW4gJ3Vuc2lnbmVkIGxvbmcnLiBUaGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIHRvCiAgICAgdGhlIG5ldyAncnNhX2tleWdlbicgZWxlbWVudCBvZiB0aGUgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW0plbHRlIEphbnNlbiwgR2VvZmYgVGhvcnBlXQoKICAqKSBGdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgbm93CiAgICAgbW92ZWQgZnJvbSBDQS5wbCB0byB0aGUgJ2NhJyB1dGlsaXR5IHdpdGggYSBuZXcgb3B0aW9uIC1jcmVhdGVfc2VyaWFsLgoKICAgICAoQmVmb3JlIE9wZW5TU0wgMC45LjdlLCBDQS5wbCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbAogICAgIG51bWJlciBmaWxlIHRvIDEsIHdoaWNoIGlzIGJvdW5kIHRvIGNhdXNlIHByb2JsZW1zLiAgVG8gYXZvaWQKICAgICB0aGUgcHJvYmxlbXMgd2hpbGUgcmVzcGVjdGluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IDAuOS43CiAgICAgcGF0Y2hsZXZlbHMsIDAuOS43ZSAgZW1wbG95ZWQgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluCiAgICAgQ0EucGwgZm9yIHNlcmlhbCBudW1iZXIgaW5pdGlhbGl6YXRpb24uICBXaXRoIHRoZSBuZXcgcmVsZWFzZSAwLjkuOCwKICAgICB3ZSBjYW4gZml4IHRoZSBwcm9ibGVtIGRpcmVjdGx5IGluIHRoZSAnY2EnIHV0aWxpdHkuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZHVjZWQgaGVhZGVyIGludGVyZGVwZW5jaWVzIGJ5IGRlY2xhcmluZyBtb3JlIG9wYXF1ZSBvYmplY3RzIGluCiAgICAgb3NzbF90eXAuaC4gQXMgYSBjb25zZXF1ZW5jZSwgaW5jbHVkaW5nIHNvbWUgaGVhZGVycyAoZWcuIGVuZ2luZS5oKSB3aWxsCiAgICAgZ2l2ZSBmZXdlciByZWN1cnNpdmUgaW5jbHVkZXMsIHdoaWNoIGNvdWxkIGJyZWFrIGxhenkgc291cmNlIGNvZGUgLSBzbwogICAgIHRoaXMgY2hhbmdlIGlzIGNvdmVyZWQgYnkgdGhlIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBzeW1ib2wuIEFzIGFsd2F5cywKICAgICBkZXZlbG9wZXJzIHNob3VsZCBkZWZpbmUgdGhpcyBzeW1ib2wgd2hlbiBidWlsZGluZyBhbmQgdXNpbmcgb3BlbnNzbCB0bwogICAgIGVuc3VyZSB0aGV5IHRyYWNrIHRoZSByZWNvbW1lbmRlZCBiZWhhdmlvdXIsIGludGVyZmFjZXMsIFtldGNdLCBidXQKICAgICBiYWNrd2FyZHMtY29tcGF0aWJsZSBiZWhhdmlvdXIgcHJldmFpbHMgd2hlbiB0aGlzIGlzbid0IGRlZmluZWQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoKSB3aGljaCBwcmludHMgb3V0IHBvbGljeSBub2Rlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEVWUCBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9yYW5kX2tleSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5LgogICAgIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBrZXkgb2YgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aCBiYXNlZCBvbiB0aGUgCiAgICAgY2lwaGVyIGNvbnRleHQuIFRoZSBFVlBfQ0lQSEVSIGNhbiBwcm92aWRlIGl0cyBvd24gcmFuZG9tIGtleSBnZW5lcmF0aW9uCiAgICAgcm91dGluZSB0byBzdXBwb3J0IGtleXMgb2YgYSBzcGVjaWZpYyBmb3JtLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGRlcyBhbmQgCiAgICAgM2RlcyByb3V0aW5lcyB0byBnZW5lcmF0ZSBhIGtleSBvZiB0aGUgY29ycmVjdCBwYXJpdHkuIFVwZGF0ZSBTL01JTUUKICAgICBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGFuZCBoZW5jZSBnZW5lcmF0ZSBjb3JyZWN0IHBhcml0eSBERVMga2V5cy4KICAgICBBZGQgRVZQX0NIRUNLX0RFU19LRVkgI2RlZmluZSB0byByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgCiAgICAgdmFsaWQgKHdlYWsgb3IgaW5jb3JyZWN0IHBhcml0eSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbG9jYWwgc2V0IG9mIENSTHMgdGhhdCBjYW4gYmUgdXNlZCBieSBYNTA5X3ZlcmlmeV9jZXJ0KCkgYXMgd2VsbAogICAgIGFzIGxvb2tpbmcgdGhlbSB1cC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdmVyaWZpZWQgc3RydWN0dXJlIG1heSBjb250YWluCiAgICAgQ1JMcywgZm9yIGV4YW1wbGUgUEtDUyM3IHNpZ25lZERhdGEuIE1vZGlmeSBQS0NTN192ZXJpZnkoKSB0byB1c2UgYW55IENSTHMKICAgICBwcmVzZW50IHVubGVzcyB0aGUgbmV3IFBLQ1M3X05PX0NSTCBmbGFnIGlzIGFzc2VydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIG9pZCBjb25maWd1cmF0aW9uIG1vZHVsZS4gSXQgbm93IGFkZGl0aW9uYWxseSBhY2NlcHRzIHRoZQogICAgIHN5bnRheDoKCiAgICAgc2hvcnROYW1lID0gc29tZSBsb25nIG5hbWUsIDEuMi4zLjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudGVkIHRoZSBCTl9DVFggaW1wbGVtZW50YXRpb24uIFRoZXJlIGlzIG5vdyBubyBtb3JlIHN0YXRpYwogICAgIGxpbWl0YXRpb24gb24gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgaXQgY2FuIGhhbmRsZSBub3IgdGhlIGRlcHRoIG9mIHRoZQogICAgICJzdGFjayIgaGFuZGxpbmcgZm9yIEJOX0NUWF9zdGFydCgpL0JOX0NUWF9lbmQoKSBwYWlycy4gVGhlIHN0YWNrCiAgICAgaW5mb3JtYXRpb24gY2FuIG5vdyBleHBhbmQgYXMgcmVxdWlyZWQsIGFuZCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzaW5nbGUKICAgICBzdGF0aWMgYXJyYXkgb2YgYmlnbnVtcywgQk5fQ1RYIG5vdyB1c2VzIGEgbGlua2VkLWxpc3Qgb2Ygc3VjaCBhcnJheXMKICAgICBhbGxvd2luZyBpdCB0byBleHBhbmQgb24gZGVtYW5kIHdoaWxzdCBtYWludGFpbmluZyB0aGUgdXNlZnVsbmVzcyBvZgogICAgIEJOX0NUWCdzICJidW5kbGluZyIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgbWlzc2luZyBCTl9DVFggcGFyYW1ldGVyIHRvIHRoZSAncnNhX21vZF9leHAnIGNhbGxiYWNrIGluIFJTQV9NRVRIT0QKICAgICB0byBhbGxvdyBhbGwgUlNBIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgQk5fQ1RYLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIHBvbGljeSBldmFsdWF0aW9uIGFuZCBjaGVja2luZy4gVGhpcwogICAgIGlzIGluaXRpYWxseSBpbnRlbmRlZCB0byBwYXNzIHRoZSB0ZXN0cyBvdXRsaW5lZCBpbiAiQ29uZm9ybWFuY2UgVGVzdGluZwogICAgIG9mIFJlbHlpbmcgUGFydHkgQ2xpZW50IENlcnRpZmljYXRlIFBhdGggUHJvY2Vzc2luZyBMb2dpYyIgdjEuMDcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgYm5fZHVwX2V4cGFuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGl0IHdhcyBpbnRyb2R1Y2VkIGluIDAuOS43IGFuZAogICAgIHJlbWFpbmVkIHVudXNlZCBhbmQgbm90IHRoYXQgdXNlZnVsLiBBIHZhcmlldHkgb2Ygb3RoZXIgbGl0dGxlIGJpZ251bQogICAgIHR3ZWFrcyBhbmQgZml4ZXMgaGF2ZSBhbHNvIGJlZW4gbWFkZSBjb250aW51aW5nIG9uIGZyb20gdGhlIGF1ZGl0IChzZWUKICAgICBiZWxvdykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ29uc3RpZnkgYWxsIG9yIGFsbW9zdCBhbGwgZDJpLCBjMmksIHMyaSBhbmQgcjJpIGZ1bmN0aW9ucywgYWxvbmcgd2l0aAogICAgIGFzc29jaWF0ZWQgQVNOMSwgRVZQIGFuZCBTU0wgZnVuY3Rpb25zIGFuZCBvbGQgQVNOMSBtYWNyb3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQk5femVybygpIG9ubHkgbmVlZHMgdG8gc2V0ICd0b3AnIGFuZCAnbmVnJyB0byB6ZXJvIGZvciBjb3JyZWN0IHJlc3VsdHMsCiAgICAgYW5kIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuIFNvIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdXNlIG9mCiAgICAgQk5fc2V0X3dvcmQoKSAod2hpY2ggY2FuIGZhaWwgZHVlIHRvIG5lZWRsZXNzIGV4cGFuc2lvbikgaXMgbm93IGRlcHJlY2F0ZWQ7CiAgICAgaWYgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIGRlZmluZWQsIEJOX3plcm8oKSBpcyBhIHZvaWQgbWFjcm8uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQk5fQ1RYX2dldCgpIHNob3VsZCByZXR1cm4gemVyby12YWx1ZWQgYmlnbnVtcywgcHJvdmlkaW5nIHRoZSBzYW1lCiAgICAgaW5pdGlhbGlzZWQgdmFsdWUgYXMgQk5fbmV3KCkuCiAgICAgW0dlb2ZmIFRob3JwZSwgc3VnZ2VzdGVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgZm9yIGluaGliaXRBbnlQb2xpY3kgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFuIGF1ZGl0IG9mIHRoZSBCSUdOVU0gY29kZSBpcyB1bmRlcndheSwgZm9yIHdoaWNoIGRlYnVnZ2luZyBjb2RlIGlzCiAgICAgZW5hYmxlZCB3aGVuIEJOX0RFQlVHIGlzIGRlZmluZWQuIFRoaXMgbWFrZXMgc3RyaWN0ZXIgZW5mb3JjZW1lbnRzIG9uIHdoYXQKICAgICBpcyBjb25zaWRlcmVkIHZhbGlkIHdoZW4gcHJvY2Vzc2luZyBCSUdOVU1zLCBhbmQgY2F1c2VzIGV4ZWN1dGlvbiB0bwogICAgIGFzc2VydCgpIHdoZW4gYSBwcm9ibGVtIGlzIGRpc2NvdmVyZWQuIElmIEJOX0RFQlVHX1JBTkQgaXMgZGVmaW5lZCwKICAgICBmdXJ0aGVyIHN0ZXBzIGFyZSB0YWtlbiB0byBkZWxpYmVyYXRlbHkgcG9sbHV0ZSB1bnVzZWQgZGF0YSBpbiBCSUdOVU0KICAgICBzdHJ1Y3R1cmVzIHRvIHRyeSBhbmQgZXhwb3NlIGZhdWx0eSBjb2RlIGZ1cnRoZXIgb24uIEZvciBub3csIG9wZW5zc2wgd2lsbAogICAgIChpbiBpdHMgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbikgY29udGludWUgdG8gdG9sZXJhdGUgdGhlIGluY29uc2lzdGVudAogICAgIGZvcm1zIHRoYXQgaXQgaGFzIHRvbGVyYXRlZCBpbiB0aGUgcGFzdCwgYnV0IGF1dGhvcnMgYW5kIHBhY2thZ2VycyBzaG91bGQKICAgICBjb25zaWRlciB0cnlpbmcgb3BlbnNzbCBhbmQgdGhlaXIgb3duIGFwcGxpY2F0aW9ucyB3aGVuIGNvbXBpbGVkIHdpdGgKICAgICB0aGVzZSBkZWJ1Z2dpbmcgc3ltYm9scyBkZWZpbmVkLiBJdCB3aWxsIGhlbHAgaGlnaGxpZ2h0IHBvdGVudGlhbCBidWdzIGluCiAgICAgdGhlaXIgb3duIGNvZGUsIGFuZCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UgZm9yIE9wZW5TU0wgaXRzZWxmLiBBdAogICAgIHNvbWUgcG9pbnQsIHRoZXNlIHRpZ2h0ZXIgcnVsZXMgd2lsbCBiZWNvbWUgb3BlbnNzbCdzIGRlZmF1bHQgdG8gaW1wcm92ZQogICAgIG1haW50YWluYWJpbGl0eSwgdGhvdWdoIHRoZSBhc3NlcnQoKXMgYW5kIG90aGVyIG92ZXJoZWFkcyB3aWxsIHJlbWFpbiBvbmx5CiAgICAgaW4gZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLiBTZWUgYm4uaCBmb3IgbW9yZSBkZXRhaWxzLgogICAgIFtHZW9mZiBUaG9ycGUsIE5pbHMgTGFyc2NoLCBVbGYgTfZsbGVyXQoKICAqKSBCTl9DVFhfaW5pdCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFzIEJOX0NUWCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlCiAgICAgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCB0aHJvdWdoIEJOX0NUWF9uZXcoKSAod2hpY2ggaW1wbGljaXRseQogICAgIGluaXRpYWxpc2VzIGl0KS4gVGhlIHByZXNlbmNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBtYWRlIGl0IHBvc3NpYmxlCiAgICAgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHN0cnVjdHVyZSAoYW5kIGNhdXNlIG1lbW9yeSBsZWFrcykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQmVjYXVzZSBvZiB0aGUgY2FsbGJhY2stYmFzZWQgYXBwcm9hY2ggZm9yIGltcGxlbWVudGluZyBMSEFTSCBhcyBhCiAgICAgdGVtcGxhdGUgdHlwZSwgbGhfaW5zZXJ0KCkgYWRkcyBvcGFxdWUgb2JqZWN0cyB0byBoYXNoLXRhYmxlcyBhbmQKICAgICBsaF9kb2FsbCgpIG9yIGxoX2RvYWxsX2FyZygpIGFyZSB0eXBpY2FsbHkgdXNlZCB3aXRoIGEgZGVzdHJ1Y3RvciBjYWxsYmFjawogICAgIHRvIGNsZWFuIHVwIHRob3NlIGNvcnJlc3BvbmRpbmcgb2JqZWN0cyBiZWZvcmUgZGVzdHJveWluZyB0aGUgaGFzaCB0YWJsZQogICAgIChhbmQgbG9zaW5nIHRoZSBvYmplY3QgcG9pbnRlcnMpLiBTbyBzb21lIG92ZXItemVhbG91cyBjb25zdGlmaWNhdGlvbnMgaW4KICAgICBMSEFTSCBoYXZlIGJlZW4gcmVsYXhlZCBzbyB0aGF0IGxoX2luc2VydCgpIGRvZXMgbm90IHRha2UgKG5vciBzdG9yZSkgdGhlCiAgICAgb2JqZWN0cyBhcyAiY29uc3QiIGFuZCB0aGUgbGhfZG9hbGxbX2FyZ10gY2FsbGJhY2sgd3JhcHBlcnMgYXJlIG5vdAogICAgIHByb3RvdHlwZWQgdG8gaGF2ZSAiY29uc3QiIHJlc3RyaWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBvaW50ZXJzIHRoZXkgYXJlCiAgICAgZ2l2ZW4gKGFuZCBzbyBhcmVuJ3QgcmVxdWlyZWQgdG8gY2FzdCB0aGVtIGF3YXkgYW55IG1vcmUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSB0bWRpZmYuaCBBUEkgd2FzIHNvIHVnbHkgYW5kIG1pbmltYWwgdGhhdCBvdXIgb3duIHRpbWluZyB1dGlsaXR5CiAgICAgKHNwZWVkKSBwcmVmZXJzIHRvIHVzZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLiBUaGUgdHdvIGltcGxlbWVudGF0aW9ucwogICAgIGhhdmVuJ3QgYmVlbiBjb25zb2xpZGF0ZWQgYXMgeWV0ICh2b2x1bnRlZXJzPykgYnV0IHRoZSB0bWRpZmYgQVBJIGhhcyBoYWQKICAgICBpdHMgb2JqZWN0IHR5cGUgcHJvcGVybHkgZXhwb3NlZCAoTVNfVE0pIGluc3RlYWQgb2YgY2FzdGluZyB0by9mcm9tICJjaGFyCiAgICAgKiIuIFRoaXMgbWF5IHN0aWxsIGNoYW5nZSB5ZXQgaWYgc29tZW9uZSByZWFsaXNlcyBNU19UTSBhbmQgIm1zX3RpbWVfKioqIgogICAgIGFyZW4ndCBuZWNlc3NhcmlseSB0aGUgZ3JlYXRlc3Qgbm9tZW5jbGF0dXJlcyAtIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIHVzZWQKICAgICBpbnRlcm5hbGx5IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBzbyBJJ3ZlIHVzZWQgdGhhdCBmb3Igbm93LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVuc3VyZSB0aGF0IGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGRvIG5vdCBnZXQgY29tcGlsZWQgd2hlbgogICAgIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLiBTb21lICJvcGVuc3NsIiBzdWJjb21tYW5kcyBhbmQgYSBmZXcgb2YKICAgICB0aGUgc2VsZi10ZXN0cyB3ZXJlIHN0aWxsIHVzaW5nIGRlcHJlY2F0ZWQga2V5LWdlbmVyYXRpb24gZnVuY3Rpb25zIHNvCiAgICAgdGhlc2UgaGF2ZSBiZWVuIHVwZGF0ZWQgYWxzby4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBSZW9yZ2FuaXNlIFBLQ1MjNyBjb2RlIHRvIHNlcGFyYXRlIHRoZSBkaWdlc3QgbG9jYXRpb24gZnVuY3Rpb25hbGl0eQogICAgIGludG8gUEtDUzdfZmluZF9kaWdlc3QoKSwgZGlnZXN0IGFkZGl0aW9uIGludG8gUEtDUzdfYmlvX2FkZF9kaWdlc3QoKS4KICAgICBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0X2RpZ2VzdCgpIHRvIHNldCB0aGUgZGlnZXN0IHR5cGUgZm9yIFBLQ1MjNwogICAgIGRpZ2VzdGVkRGF0YSB0eXBlLiBBZGQgYWRkaXRpb25hbCBjb2RlIHRvIGNvcnJlY3RseSBnZW5lcmF0ZSB0aGUKICAgICBkaWdlc3RlZERhdGEgdHlwZSBhbmQgYWRkIHN1cHBvcnQgZm9yIHRoaXMgdHlwZSBpbiBQS0NTNyBpbml0aWFsaXphdGlvbgogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0MF90eXBlX290aGVyKCkgdGhpcyBpbml0aWFsaXplcyBhIFBLQ1M3IAogICAgIHN0cnVjdHVyZSBvZiB0eXBlICJvdGhlciIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHByaW1lIGdlbmVyYXRpb24gbG9vcCBpbiBjcnlwdG8vYm4vYm5fcHJpbWUucGwgYnkgbWFraW5nCiAgICAgc3VyZSB0aGUgbG9vcCBkb2VzIGNvcnJlY3RseSBzdG9wIGFuZCBicmVha2luZyAoImRpdmlzaW9uIGJ5IHplcm8iKQogICAgIG1vZHVsdXMgb3BlcmF0aW9ucyBhcmUgbm90IHBlcmZvcm1lZC4gVGhlIChwcmUtZ2VuZXJhdGVkKSBwcmltZQogICAgIHRhYmxlIGNyeXB0by9ibi9ibl9wcmltZS5oIHdhcyBhbHJlYWR5IGNvcnJlY3QsIGJ1dCBpdCBjb3VsZCBub3QgYmUKICAgICByZS1nZW5lcmF0ZWQgb24gc29tZSBwbGF0Zm9ybXMgYmVjYXVzZSBvZiB0aGUgImRpdmlzaW9uIGJ5IHplcm8iCiAgICAgc2l0dWF0aW9uIGluIHRoZSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVwZGF0ZSBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgVExTIGNpcGhlcnN1aXRlcyBhY2NvcmRpbmcgdG8KICAgICBkcmFmdC1pZXRmLXRscy1lY2MtMDMudHh0OiB0aGUgS0RGMSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB3aXRoCiAgICAgU0hBLTEgbm93IGlzIG9ubHkgdXNlZCBmb3IgInNtYWxsIiBjdXJ2ZXMgKHdoZXJlIHRoZQogICAgIHJlcHJlc2VudGF0aW9uIG9mIGEgZmllbGQgZWxlbWVudCB0YWtlcyB1cCB0byAyNCBieXRlcyk7IGZvcgogICAgIGxhcmdlciBjdXJ2ZXMsIHRoZSBmaWVsZCBlbGVtZW50IHJlc3VsdGluZyBmcm9tIEVDREggaXMgZGlyZWN0bHkKICAgICB1c2VkIGFzIHByZW1hc3RlciBzZWNyZXQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgY29kZSBmb3Iga1ArbFEgdGltaW5ncyB0byBjcnlwdG8vZWMvZWN0ZXN0LmMsIGFuZCBhZGQgU0VDMgogICAgIGN1cnZlIHNlY3AxNjByMSB0byB0aGUgdGVzdHMuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGxvYWQgc3ltYm9scyBnbG9iYWxseSB3aXRoIERTTy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW4tZWJlbGxAdHJ1c3RjZW50ZXIuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEVSUl9zZXRfbWFyaygpIGFuZCBFUlJfcG9wX3RvX21hcmsoKSBmb3IgYmV0dGVyCiAgICAgY29udHJvbCBvZiB0aGUgZXJyb3Igc3RhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFNUT1JFIGluIEVOR0lORS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIFNUT1JFIHR5cGUuICBUaGUgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgYSBjb21tb24gaW50ZXJmYWNlCiAgICAgdG8gY2VydGlmaWNhdGUgYW5kIGtleSBzdG9yZXMsIGJlIHRoZXkgc2ltcGxlIGZpbGUtYmFzZWQgc3RvcmVzLCBvcgogICAgIEhTTS10eXBlIHN0b3JlLCBvciBMREFQIHN0b3Jlcywgb3IuLi4KICAgICBOT1RFOiBUaGUgY29kZSBpcyBjdXJyZW50bHkgVU5URVNURUQgYW5kIGlzbid0IHJlYWxseSB1c2VkIGFueXdoZXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIGdlbmVyaWMgc3RydWN0dXJlIGNhbGxlZCBPUEVOU1NMX0lURU0uICBUaGlzIGNhbiBiZSB1c2VkIHRvCiAgICAgcGFzcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGFueSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHByb3ZpZGUgYSB3YXkKICAgICBmb3IgYSBmdW5jdGlvbiB0byBwYXNzIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEJVRl9zdHJuZHVwKCkgYW5kIEJVRl9tZW1kdXAoKS4gIEJVRl9zdHJuZHVwKCkKICAgICB3b3JrcyBsaWtlIEJVRl9zdHJkdXAoKSBidXQgY2FuIGJlIHVzZWQgdG8gZHVwbGljYXRlIGEgcG9ydGlvbiBvZgogICAgIGEgc3RyaW5nLiAgVGhlIGNvcHkgZ2V0cyBOVUwtdGVybWluYXRlZC4gIEJVRl9tZW1kdXAoKSBkdXBsaWNhdGVzCiAgICAgYSBtZW1vcnkgYXJlYS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIHNrX2ZpbmRfZXgoKSB3aGljaCB3b3JrcyBsaWtlIHNrX2ZpbmQoKSwgYnV0IHdpbGwKICAgICByZXR1cm4gYW4gaW5kZXggdG8gYW4gZWxlbWVudCBldmVuIGlmIGFuIGV4YWN0IG1hdGNoIGNvdWxkbid0IGJlCiAgICAgZm91bmQuICBUaGUgaW5kZXggaXMgZ3VhcmFudGVlZCB0byBwb2ludCBhdCB0aGUgZWxlbWVudCB3aGVyZSB0aGUKICAgICBzZWFyY2hlZC1mb3Iga2V5IHdvdWxkIGJlIGluc2VydGVkIHRvIHByZXNlcnZlIHNvcnRpbmcgb3JkZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbiBPQkpfYnNlYXJjaF9leCgpIHdoaWNoIHdvcmtzIGxpa2UgT0JKX2JzZWFyY2goKSBidXQKICAgICB0YWtlcyBhbiBleHRyYSBmbGFncyBhcmd1bWVudCBmb3Igb3B0aW9uYWwgZnVuY3Rpb25hbGl0eS4gIEN1cnJlbnRseSwKICAgICB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBkZWZpbmVkOgoKCU9CSl9CU0VBUkNIX1ZBTFVFX09OX05PTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBvciB6ZXJvCgludW1iZXIuCgoJT0JKX0JTRUFSQ0hfRklSU1RfVkFMVUVfT05fTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgemVyby4gIFRoaXMgaXMgdXNlZnVsCglpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24KCXJldHVybnMgemVyby4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgd2l0aCAnb3BlbnNzbCBjYScKICAgICBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGJlY29tZXMgcGFydCBvZiB0aGUKICAgICBDQSBkYXRhYmFzZSBhbmQgdXNlcyB0aGUgc2FtZSBtZWNoYW5pc21zIGZvciBzZXJpYWwgbnVtYmVyIGdlbmVyYXRpb24KICAgICBhcyBhbGwgb3RoZXIgY2VydGlmaWNhdGUgc2lnbmluZy4gIFRoZSBuZXcgZmxhZyAnLXNlbGZzaWduJyBlbmFibGVzCiAgICAgdGhpcyBmdW5jdGlvbmFsaXR5LiAgQWRhcHQgQ0Euc2ggYW5kIENBLnBsLmluLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIHRoZSBwdWJsaWMga2V5IG9mIGEgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFnYWluc3QgYSBnaXZlbiBwcml2YXRlLiAgVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgdGhhdCBhIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBjYW4gYmUgc2lnbmVkIGJ5IHRoYXQga2V5IChzZWxmLXNpZ25pbmcpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBHZW5lcmF0ZSBtdXRpIHZhbHVlZCBBVkFzIHVzaW5nICcrJyBub3RhdGlvbiBpbiBjb25maWcgZmlsZXMgZm9yCiAgICAgcmVxIGFuZCBkaXJOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIG5hbWVDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5Q29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHBvbGljeU1hcHBpbmdzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgRFNBX01FVEhPRCBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgaXRzCiAgICAgZHNhX21vZF9leHAoKSBhbmQvb3IgYm5fbW9kX2V4cCgpIGhhbmRsZXJzIGlmIHRoZXkgYXJlIG5vbi1OVUxMLAogICAgIGFuZCBjaGFuZ2UgaXRzIG93biBoYW5kbGVycyB0byBiZSBOVUxMIHNvIGFzIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeQogICAgIGluZGlyZWN0aW9uLiBUaGlzIGxldHMgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIGZhbGxiYWNrIHRvIHRoZQogICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbW9yZSBlYXNpbHkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCBmb3IgZGlyZWN0b3J5TmFtZSBpbiBHZW5lcmFsTmFtZSByZWxhdGVkIGV4dGVuc2lvbnMKICAgICBpbiBjb25maWcgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBsaW5rIGFwcGxpY2F0aW9ucyB1c2luZyBNYWtlZmlsZS5zaGFyZWQuCiAgICAgTWFrZSB0aGF0IHBvc3NpYmxlIGV2ZW4gd2hlbiBsaW5raW5nIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcyEKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBzaW5nbGUgcGFzcyBwcm9jZXNzaW5nIGZvciBTL01JTUUgc2lnbmluZy4gVGhpcyBub3cKICAgICBtZWFucyB0aGF0IFMvTUlNRSBzaWduaW5nIGNhbiBiZSBkb25lIGZyb20gYSBwaXBlLCBpbiBhZGRpdGlvbgogICAgIGNsZWFydGV4dCBzaWduaW5nIChtdWx0aXBhcnQvc2lnbmVkIHR5cGUpIGlzIGVmZmVjdGl2ZWx5IHN0cmVhbWluZwogICAgIGFuZCB0aGUgc2lnbmVkIGRhdGEgZG9lcyBub3QgbmVlZCB0byBiZSBhbGwgaGVsZCBpbiBtZW1vcnkuCgogICAgIFRoaXMgaXMgZG9uZSB3aXRoIGEgbmV3IGZsYWcgUEtDUzdfU1RSRUFNLiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQKICAgICBQS0NTN19zaWduKCkgb25seSBpbml0aWFsaXplcyB0aGUgUEtDUzcgc3RydWN0dXJlIGFuZCB0aGUgYWN0dWFsIHNpZ25pbmcKICAgICBpcyBkb25lIGFmdGVyIHRoZSBkYXRhIGlzIG91dHB1dCAoYW5kIGRpZ2VzdHMgY2FsY3VsYXRlZCkgaW4KICAgICBTTUlNRV93cml0ZV9QS0NTNygpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdWxsIHN1cHBvcnQgZm9yIC1ycGF0aC8tUiwgYm90aCBpbiBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgIGFwcGxpY2F0aW9ucywgYXQgbGVhc3Qgb24gdGhlIHBsYXRmb3JtcyB3aGVyZSBpdCdzIGtub3duIGhvdwogICAgIHRvIGRvIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNyeXB0by9lYy9lY19tdWx0LmMsIGltcGxlbWVudCBmYXN0IHBvaW50IG11bHRpcGxpY2F0aW9uIHdpdGgKICAgICBwcmVjb21wdXRhdGlvbiwgYmFzZWQgb24gd05BRiBzcGxpdHRpbmc6IEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgd2lsbCBub3cgY29tcHV0ZSBhIHRhYmxlIG9mIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yIHRoYXQKICAgICBtYWtlcyBzdWJzZXF1ZW50IGludm9jYXRpb25zIG9mIEVDX1BPSU5Uc19tdWwoKSBvciBFQ19QT0lOVF9tdWwoKQogICAgIGZhc3RlciAobm90YWJseSBpbiB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiwKICAgICBzY2FsYXIgKiBnZW5lcmF0b3IpLgogICAgIFtOaWxzIExhcnNjaCwgQm9kbyBNb2VsbGVyXQoKICAqKSBJUHY2IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbnMuIFRoZSB2YXJpb3VzIGV4dGVuc2lvbnMKICAgICB3aGljaCB1c2UgdGhlIElQOmEuYi5jLmQgY2FuIG5vdyB0YWtlIElQdjYgYWRkcmVzc2VzIHVzaW5nIHRoZQogICAgIGZvcm1hdHMgb2YgUkZDMTg4NCAyLjIgLiBJUHY2IGFkZHJlc3NlcyBhcmUgbm93IGFsc28gZGlzcGxheWVkCiAgICAgY29ycmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIEVOR0lORSB0aGF0IGltcGxlbWVudHMgUlNBIGJ5IHBlcmZvcm1pbmcgcHJpdmF0ZSBrZXkKICAgICBleHBvbmVudGlhdGlvbnMgd2l0aCB0aGUgR01QIGxpYnJhcnkuIFRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbQogICAgIEdNUCdzIG1wel90IGZvcm1hdCBhcmVuJ3Qgb3B0aW1pc2VkIG5vciBhcmUgYW55IG1vbnRnb21lcnkgZm9ybXMKICAgICBjYWNoZWQsIGFuZCBvbiB4ODYgaXQgYXBwZWFycyBPcGVuU1NMJ3Mgb3duIHBlcmZvcm1hbmNlIGhhcyBjYXVnaHQgdXAuCiAgICAgSG93ZXZlciB0aGVyZSBhcmUgbGlrZWx5IHRvIGJlIG90aGVyIGFyY2hpdGVjdHVyZXMgd2hlcmUgR01QIGNvdWxkCiAgICAgcHJvdmlkZSBhIGJvb3N0LiBUaGlzIEVOR0lORSBpcyBub3QgYnVpbHQgaW4gYnkgZGVmYXVsdCwgYnV0IGl0IGNhbiBiZQogICAgIHNwZWNpZmllZCBhdCBDb25maWd1cmUgdGltZSBhbmQgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBuZWNlc3NhcnkKICAgICBsaW5rZXIgYWRkaXRpb25zLCBlZzsKICAgICAgICAgLi9jb25maWcgLURPUEVOU1NMX1VTRV9HTVAgLWxnbXAKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSAib3BlbnNzbCBlbmdpbmUiIHdpbGwgbm90IGRpc3BsYXkgRU5HSU5FL0RTTyBsb2FkIGZhaWx1cmUgZXJyb3JzIHdoZW4KICAgICB0ZXN0aW5nIGF2YWlsYWJpbGl0eSBvZiBlbmdpbmVzIHdpdGggIi10IiAtIHRoZSBvbGQgYmVoYXZpb3VyIGlzCiAgICAgcHJvZHVjZWQgYnkgaW5jcmVhc2luZyB0aGUgZmVhdHVyZSdzIHZlcmJvc2l0eSB3aXRoICItdHQiLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVDRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPgogICAgIHZpYSBQUiM0NTkpCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEtleS1nZW5lcmF0aW9uIGNhbiBub3cgYmUgaW1wbGVtZW50ZWQgaW4gUlNBX01FVEhPRCwgRFNBX01FVEhPRAogICAgIGFuZCBESF9NRVRIT0QgKGVnLiBieSBFTkdJTkUgaW1wbGVtZW50YXRpb25zKSB0byBvdmVycmlkZSB0aGUgbm9ybWFsCiAgICAgc29mdHdhcmUgaW1wbGVtZW50YXRpb25zLiBGb3IgRFNBIGFuZCBESCwgcGFyYW1ldGVyIGdlbmVyYXRpb24gY2FuCiAgICAgYWxzbyBiZSBvdmVycmlkZW4gYnkgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgY2FsbGJhY2tzLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSB0aGUgInByb2dyZXNzIiBtZWNoYW5pc20gdXNlZCBpbiBrZXktZ2VuZXJhdGlvbiBhbmQKICAgICBwcmltYWxpdHkgdGVzdGluZyB0byBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgbmV3IEJOX0dFTkNCIHBvaW50ZXIgaW4KICAgICBwbGFjZSBvZiBjYWxsYmFjay9hcmd1bWVudCBwYWlycy4gVGhlIG5ldyBBUEkgZnVuY3Rpb25zIGhhdmUgIl9leCIKICAgICBwb3N0Zml4ZXMgYW5kIHRoZSBvbGRlciBmdW5jdGlvbnMgYXJlIHJlaW1wbGVtZW50ZWQgYXMgd3JhcHBlcnMgZm9yCiAgICAgdGhlIG5ldyBvbmVzLiBUaGUgT1BFTlNTTF9OT19ERVBSRUNBVEVEIHN5bWJvbCBjYW4gYmUgdXNlZCB0byBoaWRlCiAgICAgZGVjbGFyYXRpb25zIG9mIHRoZSBvbGQgZnVuY3Rpb25zIHRvIGhlbHAgKGdyYWNlZnVsKSBhdHRlbXB0cyB0bwogICAgIG1pZ3JhdGUgdG8gdGhlIG5ldyBmdW5jdGlvbnMuIEFsc28sIHRoZSBuZXcga2V5LWdlbmVyYXRpb24gQVBJCiAgICAgZnVuY3Rpb25zIG9wZXJhdGUgb24gYSBjYWxsZXItc3VwcGxpZWQga2V5LXN0cnVjdHVyZSBhbmQgcmV0dXJuCiAgICAgc3VjY2Vzcy9mYWlsdXJlIHJhdGhlciB0aGFuIHJldHVybmluZyBhIGtleSBvciBOVUxMIC0gdGhpcyBpcyB0bwogICAgIGhlbHAgbWFrZSAia2V5Z2VuIiBhbm90aGVyIG1lbWJlciBmdW5jdGlvbiBvZiBSU0FfTUVUSE9EIGV0Yy4KCiAgICAgRXhhbXBsZSBmb3IgdXNpbmcgdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2U6CgogICAgICAgICAgaW50ICgqbXlfY2FsbGJhY2spKGludCBhLCBpbnQgYiwgQk5fR0VOQ0IgKmNiKSA9IC4uLjsKICAgICAgICAgIHZvaWQgKm15X2FyZyA9IC4uLjsKICAgICAgICAgIEJOX0dFTkNCIG15X2NiOwoKICAgICAgICAgIEJOX0dFTkNCX3NldCgmbXlfY2IsIG15X2NhbGxiYWNrLCBteV9hcmcpOwoKICAgICAgICAgIHJldHVybiBCTl9pc19wcmltZV9leChzb21lX2JpZ251bSwgQk5fcHJpbWVfY2hlY2tzLCBOVUxMLCAmY2IpOwogICAgICAgICAgLyogRm9yIHRoZSBtZWFuaW5nIG9mIGEsIGIgaW4gY2FsbHMgdG8gbXlfY2FsbGJhY2soKSwgc2VlIHRoZQogICAgICAgICAgICogZG9jdW1lbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgY2FsbGJhY2suCiAgICAgICAgICAgKiBjYiB3aWxsIHBvaW50IHRvIG15X2NiOyBteV9hcmcgY2FuIGJlIHJldHJpZXZlZCBhcyBjYi0+YXJnLgogICAgICAgICAgICogbXlfY2FsbGJhY2sgc2hvdWxkIHJldHVybiAxIGlmIGl0IHdhbnRzIEJOX2lzX3ByaW1lX2V4KCkKICAgICAgICAgICAqIHRvIGNvbnRpbnVlLCBvciAwIHRvIHN0b3AuCiAgICAgICAgICAgKi8KCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSBaTElCIGNvbXByZXNzaW9uIG1ldGhvZCB0byBiZSBzdGF0ZWZ1bCwgYW5kIG1ha2UgaXQKICAgICBhdmFpbGFibGUgdG8gVExTIHdpdGggdGhlIG51bWJlciBkZWZpbmVkIGluIAogICAgIGRyYWZ0LWlldGYtdGxzLWNvbXByZXNzaW9uLTA0LnR4dC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIEFTTi4xIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgQ2VydGlmaWNhdGVQYWlyLCB3aGljaAogICAgIGlzIGRlZmluZWQgYXMgZm9sbG93cyAoYWNjb3JkaW5nIHRvIFguNTA5XzR0aEVkaXRpb25EcmFmdFY2LnBkZik6CgogICAgIENlcnRpZmljYXRlUGFpciA6Oj0gU0VRVUVOQ0UgewogICAgICAgIGZvcndhcmQJCVswXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICByZXZlcnNlCQlbMV0JQ2VydGlmaWNhdGUgT1BUSU9OQUwsCiAgICAgICAgLS0gYXQgbGVhc3Qgb25lIG9mIHRoZSBwYWlyIHNoYWxsIGJlIHByZXNlbnQgLS0gfQoKICAgICBBbHNvIGltcGxlbWVudCB0aGUgUEVNIGZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBjZXJ0aWZpY2F0ZQogICAgIHBhaXJzLCBhbmQgZGVmaW5lZCB0aGUgUEVNIHRhZyBhcyAiQ0VSVElGSUNBVEUgUEFJUiIuCgogICAgIFRoaXMgbmVlZGVkIHRvIGJlIGRlZmluZWQsIG1vc3RseSBmb3IgdGhlIHNha2Ugb2YgdGhlIExEQVAKICAgICBhdHRyaWJ1dGUgY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIsIGJ1dCBtYXkgcHJvdmUgdXNlZnVsIGVsc2V3aGVyZSBhcwogICAgIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBpbmhpYml0IHN5bWxpbmtpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBpbgogICAgIE1ha2VmaWxlLnNoYXJlZCwgZm9yIEN5Z3dpbidzIHNha2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRXh0ZW5kIHRoZSBCSUdOVU0gQVBJIGJ5IGNyZWF0aW5nIGEgZnVuY3Rpb24gCiAgICAgICAgICB2b2lkIEJOX3NldF9uZWdhdGl2ZShCSUdOVU0gKmEsIGludCBuZWcpOwogICAgIGFuZCBhIG1hY3JvIHRoYXQgYmVoYXZlIGxpa2UKICAgICAgICAgIGludCAgQk5faXNfbmVnYXRpdmUoY29uc3QgQklHTlVNICphKTsKCiAgICAgdG8gYXZvaWQgdGhlIG5lZWQgdG8gYWNjZXNzICdhLT5uZWcnIGRpcmVjdGx5IGluIGFwcGxpY2F0aW9ucy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEltcGxlbWVudCBmYXN0IG1vZHVsYXIgcmVkdWN0aW9uIGZvciBwc2V1ZG8tTWVyc2VubmUgcHJpbWVzCiAgICAgdXNlZCBpbiBOSVNUIGN1cnZlcyAoY3J5cHRvL2JuL2JuX25pc3QuYywgY3J5cHRvL2VjL2VjcF9uaXN0LmMpLgogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IHVzZSB0aGlzCiAgICAgaWYgYXBwbGljYWJsZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBuZXcgbG9jayB0eXBlIChDUllQVE9fTE9DS19CTikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBFTkdJTkUgZnJhbWV3b3JrIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBlbmdpbmVzCiAgICAgZHluYW1pY2FsbHkgZnJvbSBzcGVjaWZpYyBkaXJlY3RvcmllcyB1bmxlc3MgdGhleSBjb3VsZCBiZQogICAgIGZvdW5kIHRvIGFscmVhZHkgYmUgYnVpbHQgaW4gb3IgbG9hZGVkLiAgTW92ZSBhbGwgdGhlCiAgICAgY3VycmVudCBlbmdpbmVzIGV4Y2VwdCBmb3IgdGhlIGNyeXB0b2RldiBvbmUgdG8gYSBuZXcKICAgICBkaXJlY3RvcnkgZW5naW5lcy8uCiAgICAgVGhlIGVuZ2luZXMgaW4gZW5naW5lcy8gYXJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgaWYKICAgICB0aGUgInNoYXJlZCIgb3B0aW9ucyB3YXMgZ2l2ZW4gdG8gLi9Db25maWd1cmUgb3IgLi9jb25maWcuCiAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbnNlcnRlZCBpbiBsaWJjcnlwdG8uYS4KICAgICAvdXNyL2xvY2FsL3NzbC9lbmdpbmVzIGlzIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgZHluYW1pYwogICAgIGVuZ2luZXMsIGJ1dCB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgY29uZmlndXJlIHRpbWUgdGhyb3VnaAogICAgIHRoZSB1c3VhbCB1c2Ugb2YgLS1wcmVmaXggYW5kL29yIC0tb3BlbnNzbGRpciwgYW5kIGF0IHJ1bgogICAgIHRpbWUgd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgT1BFTlNTTF9FTkdJTkVTLgogICAgIFtHZW9mZiBUaG9ycGUgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE1ha2VmaWxlLnNoYXJlZCwgYSBoZWxwZXIgbWFrZWZpbGUgdG8gYnVpbGQgc2hhcmVkCiAgICAgbGlicmFyaWVzLiAgQWRhcHQgTWFrZWZpbGUub3JnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB2ZXJzaW9uIGluZm8gdG8gV2luMzIgRExMcy4KICAgICBbUGV0ZXIgJ0x1bmEnIFJ1bmVzdGlnIiA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQWRkIG5ldyAnbWVkaXVtIGxldmVsJyBQS0NTIzEyIEFQSS4gQ2VydGlmaWNhdGVzIGFuZCBrZXlzCiAgICAgY2FuIGJlIGFkZGVkIHVzaW5nIHRoaXMgQVBJIHRvIGNyZWF0ZWQgYXJiaXRyYXJ5IFBLQ1MjMTIKICAgICBmaWxlcyB3aGlsZSBhdm9pZGluZyB0aGUgbG93IGxldmVsIEFQSS4KCiAgICAgTmV3IG9wdGlvbnMgdG8gUEtDUzEyX2NyZWF0ZSgpLCBrZXkgb3IgY2VydCBjYW4gYmUgTlVMTCBhbmQKICAgICB3aWxsIHRoZW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gVGhlIGVuY3J5cHRpb24KICAgICBhbGdvcml0aG0gTklEcyBjYW4gYmUgc2V0IHRvIC0xIGZvciBubyBlbmNyeXB0aW9uLCB0aGUgbWFjCiAgICAgaXRlcmF0aW9uIGNvdW50IGNhbiBiZSBzZXQgdG8gMCB0byBvbWl0IHRoZSBtYWMuCgogICAgIEVuaGFuY2UgcGtjczEyIHV0aWxpdHkgYnkgbWFraW5nIHRoZSAtbm9rZXlzIGFuZCAtbm9jZXJ0cwogICAgIG9wdGlvbnMgd29yayB3aGVuIGNyZWF0aW5nIGEgUEtDUyMxMiBmaWxlLiBOZXcgb3B0aW9uIC1ub21hYwogICAgIHRvIG9taXQgdGhlIG1hYywgTk9ORSBjYW4gYmUgc2V0IGZvciBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAgICBOZXcgY29kZSBpcyBtb2RpZmllZCB0byB1c2UgdGhlIGVuaGFuY2VkIFBLQ1MxMl9jcmVhdGUoKQogICAgIGluc3RlYWQgb2YgdGhlIGxvdyBsZXZlbCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgZW5jb2RlciB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCiAgICAgZW5jb2RpbmcuIFRoaXMgY2FuIG91dHB1dCBzZXF1ZW5jZXMgdGFncyBhbmQgb2N0ZXQgc3RyaW5ncyBpbgogICAgIHRoaXMgZm9ybS4gTW9kaWZ5IHBrN19hc24xLmMgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aAogICAgIGVuY29kaW5nLiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbmVlZHMgYWRkaXRpb25hbCBjb2RlIHRvCiAgICAgYmUgdXNlZnVsLCBzdWNoIGFzIGFuIEFTTjEgYmlvIGFuZCBzb21lIGVuaGFuY2VkIHN0cmVhbWluZwogICAgIFBLQ1MjNyBjb2RlLgoKICAgICBFeHRlbmQgdGVtcGxhdGUgZW5jb2RlIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCB0YWdnaW5nIGlzIHBhc3NlZAogICAgIGRvd24gdG8gdGhlIHRlbXBsYXRlIGVuY29kZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0ICdvcGVuc3NsIHJlcScgZmFpbCBpZiBhbiBhcmd1bWVudCB0byAnLW5ld2tleScgaXMgbm90CiAgICAgcmVjb2duaXplZCBpbnN0ZWFkIG9mIHVzaW5nIFJTQSBhcyBhIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0LgogICAgIEFzIHRoZXNlIGFyZSBub3Qgb2ZmaWNpYWwsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiAiQUxMIjsKICAgICB0aGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZSBncm91cCBhbGlhcyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlbS4KICAgICBbVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGVuZ2luZSBzdXBwb3J0LgogICAgIFtOaWxzIEd1cmEgYW5kIERvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RoLy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIExldCBCTl9yYW5kX3JhbmdlKCkgYWJvcnQgd2l0aCBhbiBlcnJvciBhZnRlciAxMDAgaXRlcmF0aW9ucwogICAgIHdpdGhvdXQgc3VjY2VzcyAod2hpY2ggaW5kaWNhdGVzIGEgYnJva2VuIFBSTkcpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2Rfc3FydCgpIHNvIHRoYXQgaXQgdmVyaWZpZXMgdGhhdCB0aGUgaW5wdXQgdmFsdWUKICAgICBpcyByZWFsbHkgdGhlIHNxdWFyZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKFByZXZpb3VzbHksCiAgICAgQk5fbW9kX3NxcnQgd291bGQgc2hvdyBHSUdPIGJlaGF2aW91ci4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBvdmVyIGJpbmFyeSBmaWVsZHMgZnJvbSBYOS42MiwgU0VDRywKICAgICBhbmQgV0FQL1dUTFM7IGFkZCBPSURzIHRoYXQgd2VyZSBzdGlsbCBtaXNzaW5nLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgRXh0ZW5kIHRoZSBFQyBsaWJyYXJ5IGZvciBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzCiAgICAgKG5ldyBmaWxlcyBlYzJfc21wbC5jLCBlYzJfc21wdC5jLCBlYzJfbXVsdC5jIGluIGNyeXB0by9lYy8pLgogICAgIE5ldyBFQ19NRVRIT0Q6CgogICAgICAgICAgRUNfR0YybV9zaW1wbGVfbWV0aG9kCgogICAgIE5ldyBBUEkgZnVuY3Rpb25zOgoKICAgICAgICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtCgogICAgIFBvaW50IGNvbXByZXNzaW9uIGZvciBiaW5hcnkgZmllbGRzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yCiAgICAgcGF0ZW50IHJlYXNvbnMgKGNvbXBpbGUgd2l0aCBPUEVOU1NMX0VDX0JJTl9QVF9DT01QIGRlZmluZWQgdG8KICAgICBlbmFibGUgaXQpLgoKICAgICBBcyBiaW5hcnkgcG9seW5vbWlhbHMgYXJlIHJlcHJlc2VudGVkIGFzIEJJR05VTXMsIHZhcmlvdXMgbWVtYmVycwogICAgIG9mIHRoZSBFQ19HUk9VUCBhbmQgRUNfUE9JTlQgZGF0YSBzdHJ1Y3R1cmVzIGNhbiBiZSBzaGFyZWQKICAgICBiZXR3ZWVuIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHByaW1lIGZpZWxkcyBhbmQgYmluYXJ5IGZpZWxkczsKICAgICB0aGUgYWJvdmUgLi4uX0dGMm0gZnVuY3Rpb25zIChleGNlcHQgZm9yIEVYX0dST1VQX25ld19jdXJ2ZV9HRjJtKQogICAgIGFyZSBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gdGhlaXIgLi4uX0dGcCBjb3VudGVycGFydHMuCiAgICAgKEZvciBzaW1wbGljaXR5LCB0aGUgJy4uLl9HRnAnIHByZWZpeCBoYXMgYmVlbiBkcm9wcGVkIGZyb20KICAgICB2YXJpb3VzIGludGVybmFsIG1ldGhvZCBuYW1lcy4pCgogICAgIEFuIGludGVybmFsICdmaWVsZF9kaXYnIG1ldGhvZCAoc2ltaWxhciB0byAnZmllbGRfbXVsJyBhbmQKICAgICAnZmllbGRfc3FyJykgaGFzIGJlZW4gYWRkZWQ7IHRoaXMgaXMgdXNlZCBvbmx5IGZvciBiaW5hcnkgZmllbGRzLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgT3B0aW9uYWxseSBkaXNwYXRjaCBFQ19QT0lOVF9tdWwoKSwgRUNfUE9JTlRfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB0aHJvdWdoIG1ldGhvZHMgKCdtdWwnLCAncHJlY29tcHV0ZV9tdWx0JykuCgogICAgIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyAobm93IGludGVybmFsbHkgY2FsbGVkICdlY193TkFGX211bCcKICAgICBhbmQgJ2VjX3dOQUZfcHJlY29tcHV0ZWRfbXVsdCcpIHJlbWFpbiB0aGUgZGVmYXVsdCBpZiB0aGVzZQogICAgIG1ldGhvZHMgYXJlIHVuZGVmaW5lZC4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbiBFQ19HUk9VUF9nZXRfZGVncmVlLCB3aGljaCBpcyBkZWZpbmVkIHRocm91Z2gKICAgICBFQ19NRVRIT0QuICBGb3IgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzLCB0aGlzIHJldHVybnMgdGhlIGJpdAogICAgIGxlbmd0aCBvZiB0aGUgbW9kdWx1cy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbnMgRUNfR1JPVVBfZHVwLCBFQ19QT0lOVF9kdXAuCiAgICAgKFRoZXNlIHNpbXBseSBjYWxsIC4uLl9uZXcgIGFuZCAuLi5fY29weSkuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYyBzb2Z0d2FyZSBpbiBjcnlwdG8vYm4vYm5fZ2YybS5jLgogICAgIFBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zICh3aGVyZSB0aGUgc2lnbiBiaXQgaXMgbm90CiAgICAgdXNlZCkgaW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgW21hY3Jvc106ICAKCiAgICAgICAgICBCTl9HRjJtX2FkZAogICAgICAgICAgQk5fR0YybV9zdWIgICAgICAgICAgICAgWz0gQk5fR0YybV9hZGRdCiAgICAgICAgICBCTl9HRjJtX21vZCAgICAgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2RfbXVsICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX211bF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXIgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FyX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2ludgogICAgICAgICAgQk5fR0YybV9tb2RfZXhwICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2V4cF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJ0ICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FydF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnJdCiAgICAgICAgICBCTl9HRjJtX2NtcCAgICAgICAgICAgICBbPSBCTl91Y21wXQoKICAgICAoTm90ZSB0aGF0IG9ubHkgdGhlICdtb2QnIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgZm9yIGZpZWxkcyBHRigyXm0pLgogICAgIEJOX0dGMm1fYWRkKCkgaXMgbWlzbm9tZXIsIGJ1dCB0aGlzIGlzIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeS4pCgogICAgIEZvciBzb21lIGZ1bmN0aW9ucywgYW4gdGhlIGlycmVkdWNpYmxlIHBvbHlub21pYWwgZGVmaW5pbmcgYQogICAgIGZpZWxkIGNhbiBiZSBnaXZlbiBhcyBhbiAndW5zaWduZWQgaW50W10nIHdpdGggc3RyaWN0bHkKICAgICBkZWNyZWFzaW5nIGVsZW1lbnRzIGdpdmluZyB0aGUgaW5kaWNlcyBvZiB0aG9zZSBiaXRzIHRoYXQgYXJlIHNldDsKICAgICBpLmUuLCBwW10gcmVwcmVzZW50cyB0aGUgcG9seW5vbWlhbAogICAgICAgICAgZih0KSA9IHRecFswXSArIHRecFsxXSArIC4uLiArIHRecFtrXQogICAgIHdoZXJlCiAgICAgICAgICBwWzBdID4gcFsxXSA+IC4uLiA+IHBba10gPSAwLgogICAgIFRoaXMgYXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX21vZF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX211bF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3Nxcl9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX2ludl9hcnIgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9pbnZdCiAgICAgICAgICBCTl9HRjJtX21vZF9kaXZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfZGl2XQogICAgICAgICAgQk5fR0YybV9tb2RfZXhwX2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIENvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIGJudGVzdC5jIGhhcyBhZGRpdGlvbmFsIHRlc3RzIGZvciBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljLgoKICAgICBUd28gaW1wbGVtZW50YXRpb25zIGZvciBCTl9HRjJtX21vZF9kaXYoKSBhcmUgYXZhaWxhYmxlLgogICAgIFRoZSBkZWZhdWx0IGFsZ29yaXRobSBzaW1wbHkgdXNlcyBCTl9HRjJtX21vZF9pbnYoKSBhbmQKICAgICBCTl9HRjJtX21vZF9tdWwoKS4gIFRoZSBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gaXMgY29tcGlsZWQgaW4gb25seQogICAgIGlmIE9QRU5TU0xfU1VOX0dGMk1fRElWIGlzIGRlZmluZWQgKHBhdGVudCBwZW5kaW5nOyByZWFkIHRoZQogICAgIGNvcHlyaWdodCBub3RpY2UgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYyBiZWZvcmUgZW5hYmxpbmcgaXQpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9ESVNBQkxFRCcgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNvbWUKICAgICBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUtdGltZS4KICAgICBbRG91Z2xhcyBTdGViaWxhIDxkb3VnbGFzLnN0ZWJpbGFAc3VuLmNvbT5dCgogICopIENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciBvZiAnb3BlbnNzbCBhc24xcGFyc2UnIHNvIHRoYXQgbW9yZQogICAgIGluZm9ybWF0aW9uIGlzIHZpc2libGUgd2hlbiB2aWV3aW5nLCBlLmcuLCBhIGNlcnRpZmljYXRlOgoKICAgICBNb2RpZnkgYXNuMV9wYXJzZTIgKGNyeXB0by9hc24xL2FzbjFfcGFyLmMpIHNvIHRoYXQgaW4gbm9uLSdkdW1wJwogICAgIG1vZGUgdGhlIGNvbnRlbnQgb2Ygbm9uLXByaW50YWJsZSBPQ1RFVCBTVFJJTkdzIGlzIG91dHB1dCBpbiBhCiAgICAgc3R5bGUgc2ltaWxhciB0byBJTlRFR0VScywgYnV0IHdpdGggJ1tIRVggRFVNUF0nIHByZXBlbmRlZCB0bwogICAgIGF2b2lkIHRoZSBhcHBlYXJhbmNlIG9mIGEgcHJpbnRhYmxlIHN0cmluZy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCAnYXNuMV9mbGFnJyBhbmQgJ2FzbjFfZm9ybScgbWVtYmVyIHRvIEVDX0dST1VQIHdpdGggYWNjZXNzCiAgICAgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9hc24xX2ZsYWcoKQogICAgICAgICAgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCkKICAgICBUaGVzZSBjb250cm9sIEFTTjEgZW5jb2RpbmcgZGV0YWlsczoKICAgICAtIEN1cnZlcyAoaS5lLiwgZ3JvdXBzKSBhcmUgZW5jb2RlZCBleHBsaWNpdGx5IHVubGVzcyBhc24xX2ZsYWcKICAgICAgIGhhcyBiZWVuIHNldCB0byBPUEVOU1NMX0VDX05BTUVEX0NVUlZFLgogICAgIC0gUG9pbnRzIGFyZSBlbmNvZGVkIGluIHVuY29tcHJlc3NlZCBmb3JtIGJ5IGRlZmF1bHQ7IG9wdGlvbnMgZm9yCiAgICAgICBhc24xX2ZvciBhcmUgYXMgZm9yIHBvaW50Mm9jdCwgbmFtZWx5CiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRAoKICAgICBBbHNvIGFkZCAnc2VlZCcgYW5kICdzZWVkX2xlbicgbWVtYmVycyB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X3NlZWQoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0MF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9zZWVkX2xlbigpCiAgICAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIEFTTjEgcHVycG9zZXMgKHNvIGZhcikuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2ZpZWxkX3R5cGUnIG1lbWJlciB0byBFQ19NRVRIT0QsIHdoaWNoIGhvbGRzIHRoZSBOSUQKICAgICBvZiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgdHlwZSBPSUQuICBUaGUgbmV3IGZ1bmN0aW9uCiAgICAgRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKCkgcmV0dXJucyB0aGlzIHZhbHVlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIGZ1bmN0aW9ucyAKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmJuKCkKICAgICAgICAgIEVDX1BPSU5UX2JuMnBvaW50KCkKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmhleCgpCiAgICAgICAgICBFQ19QT0lOVF9oZXgycG9pbnQoKQogICAgIHByb3ZpZGluZyB1c2VmdWwgaW50ZXJmYWNlcyB0byBFQ19QT0lOVF9wb2ludDJvY3QoKSBhbmQKICAgICBFQ19QT0lOVF9vY3QycG9pbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIENoYW5nZSBpbnRlcm5hbHMgb2YgdGhlIEVDIGxpYnJhcnkgc28gdGhhdCB0aGUgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9nZW5lcmF0b3IoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X29yZGVyKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9jb2ZhY3RvcigpCiAgICAgYXJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGluIGNyeXB0by9lYy9lY19saWIuYyBhbmQgbm90IGRpc3BhdGNoZWQKICAgICB0byBtZXRob2RzLCB3aGljaCB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gd2hlbgogICAgIGFkZGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgY3VydmVzLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB3aXRoIGlucHV0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IGNvbXB1dGVfd05BRiAoY3J5cHRvL2VjL2VjX211bHQuYykgd2l0aG91dCBCSUdOVU0KICAgICBhcml0aG1ldGljLCBhbmQgc3VjaCB0aGF0IG1vZGlmaWVkIHdOQUZzIGFyZSBnZW5lcmF0ZWQKICAgICAod2hpY2ggYXZvaWQgbGVuZ3RoIGV4cGFuc2lvbiBpbiBtYW55IGNhc2VzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKSAoZGVmaW5lZCB2aWEKICAgICBFQ19NRVRIT0QpIHRoYXQgdmVyaWZpZXMgdGhhdCB0aGUgY3VydmUgZGlzY3JpbWluYW50IGlzIG5vbi16ZXJvLgoKICAgICBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVjaygpIHRoYXQgbWFrZXMgc29tZSBzYW5pdHkgdGVzdHMKICAgICBvbiBhIEVDX0dST1VQLCBpdHMgZ2VuZXJhdG9yIGFuZCBvcmRlci4gIFRoaXMgaW5jbHVkZXMKICAgICBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBFQ0RTQSBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RzYS8uCgogICAgIEFkZCBhcHBsaWNhdGlvbnMgJ29wZW5zc2wgZWNwYXJhbScgYW5kICdvcGVuc3NsIGVjZHNhJwogICAgICh0aGVzZSBhcmUgYmFzZWQgb24gJ29wZW5zc2wgZHNhcGFyYW0nIGFuZCAnb3BlbnNzbCBkc2EnKS4KCiAgICAgRUNEU0Egc3VwcG9ydCBpcyBhbHNvIGluY2x1ZGVkIGluIHZhcmlvdXMgb3RoZXIgZmlsZXMgYWNyb3NzIHRoZQogICAgIGxpYnJhcnkuICBNb3N0IG5vdGFibHksCiAgICAgLSAnb3BlbnNzbCByZXEnIG5vdyBoYXMgYSAnLW5ld2tleSBlY2RzYTpmaWxlJyBvcHRpb247CiAgICAgLSBFVlBfUEtDUzgyUEtFWSAoY3J5cHRvL2V2cC9ldnBfcGtleS5jKSBub3cgY2FuIGhhbmRsZSBFQ0RTQTsKICAgICAtIFg1MDlfUFVCS0VZX2dldCAoY3J5cHRvL2FzbjEveF9wdWJrZXkuYykgYW5kCiAgICAgICBkMmlfUHVibGljS2V5IChjcnlwdG8vYXNuMS9kMmlfcHUuYykgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG1ha2UKICAgICAgIHRoZW0gc3VpdGFibGUgZm9yIEVDRFNBIHdoZXJlIGRvbWFpbiBwYXJhbWV0ZXJzIG11c3QgYmUKICAgICAgIGV4dHJhY3RlZCBiZWZvcmUgdGhlIHNwZWNpZmljIHB1YmxpYyBrZXk7CiAgICAgLSBFQ0RTQSBlbmdpbmUgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEluY2x1ZGUgc29tZSBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMsIGFuZCBhZGQgT0lEcyBmcm9tIFg5LjYyLAogICAgIFNFQ0csIGFuZCBXQVAvV1RMUy4gIEVhY2ggY3VydmUgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG5ldwogICAgIGZ1bmN0aW9uCiAgICAgICAgICBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSgpLAogICAgIGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbmFtZWQgY3VydmVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCiAgICAgICAgICBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoKS4KICAgICBBbHNvIGFkZCBhICdjdXJ2ZV9uYW1lJyBtZW1iZXIgdG8gRUNfR1JPVVAgb2JqZWN0cywgd2hpY2ggY2FuIGJlCiAgICAgYWNjZXNzZWQgdmlhCiAgICAgICAgIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKCkKICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoKQogICAgIFtOaWxzIExhcnNjaCA8bGFyc2NoQHRydXN0Y2VudGVyLmRlLCBCb2RvIE1vZWxsZXJdCiAKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43bCBhbmQgMC45LjdtICBbMjMgRmViIDIwMDddCgogICopIENsZWFuc2UgUEVNIGJ1ZmZlcnMgYmVmb3JlIGZyZWVpbmcgdGhlbSBzaW5jZSB0aGV5IG1heSBjb250YWluIAogICAgIHNlbnNpdGl2ZSBkYXRhLgogICAgIFtCZW5qYW1pbiBCZW5uZXR0IDxiZW5AcHNjLmVkdT5dCgogICopIEluY2x1ZGUgIiFlTlVMTCIgaW4gU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QgdG8gbWFrZSBzdXJlIHRoYXQKICAgICBhIGNpcGhlcnN1aXRlIHN0cmluZyBzdWNoIGFzICJERUZBVUxUOlJTQSIgY2Fubm90IGVuYWJsZQogICAgIGF1dGhlbnRpY2F0aW9uLW9ubHkgY2lwaGVyc3VpdGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IHNoYXJlIGEgc2luZ2xlIG1hc2sgYml0IGluIHRoZSBsb2dpYyBvZgogICAgIHNzbC9zc2xfY2lwaC5jLCB0aGUgY29kZSBmb3IgbWFza2luZyBvdXQgZGlzYWJsZWQgY2lwaGVycyBuZWVkcyBhCiAgICAga2x1ZGdlIHRvIHdvcmsgcHJvcGVybHkgaWYgQUVTMTI4IGlzIGF2YWlsYWJsZSBhbmQgQUVTMjU2IGlzbid0LgogICAgIFtWaWN0b3IgRHVjaG92bmldCgogICopIEV4cGFuZCBzZWN1cml0eSBib3VuZGFyeSB0byBtYXRjaCAxLjEuMSBtb2R1bGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBmZWF0dXJlczogaGFzaCBmaWxlIHNvdXJjZSwgZWRpdGluZyBvZiB0ZXN0IHZlY3RvcnMKICAgICBtb2RpZnkgZmlwc2xkIHRvIHVzZSBleHRlcm5hbCBmaXBzX3ByZW1haW4uYyBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHBlcmwgc2NyaXB0IG1rZmlwc3Njci5wbCB0byBjcmVhdGUgc2hlbGwgc2NyaXB0cyBvciBiYXRjaCBmaWxlcyB0bwogICAgIHJ1biBhbGdvcml0aG0gdGVzdCBwcm9ncmFtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGFsZ29yaXRobSB0ZXN0IHByb2dyYW1zIG1vcmUgdG9sZXJhbnQgb2Ygd2hpdGVzcGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uIHRvbGVyYXRlICJtaXNtYXRjaGVkIiByZWNvcmQKICAgICBwcm90b2NvbCB2ZXJzaW9uIHdoaWxlIHJlY2VpdmluZyBDbGllbnRIZWxsbyBldmVuIGlmIHRoZQogICAgIENsaWVudEhlbGxvIGlzIGZyYWdtZW50ZWQuICAoVGhlIHNlcnZlciBjYW4ndCBpbnNpc3Qgb24gdGhlCiAgICAgcGFydGljdWxhciBwcm90b2NvbCB2ZXJzaW9uIGl0IGhhcyBjaG9zZW4gYmVmb3JlIHRoZSBTZXJ2ZXJIZWxsbwogICAgIG1lc3NhZ2UgaGFzIGluZm9ybWVkIHRoZSBjbGllbnQgYWJvdXQgaGlzIGNob2ljZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2sgYW5kIDAuOS43bCAgWzI4IFNlcCAyMDA2XQoKICAqKSBJbnRyb2R1Y2UgbGltaXRzIHRvIHByZXZlbnQgbWFsaWNpb3VzIGtleXMgYmVpbmcgYWJsZSB0bwogICAgIGNhdXNlIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjk0MCkKICAgICBbU3RldmUgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBBU04uMSBwYXJzaW5nIG9mIGNlcnRhaW4gaW52YWxpZCBzdHJ1Y3R1cmVzIHRoYXQgY2FuIHJlc3VsdAogICAgIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjkzNykgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZ1bmN0aW9uLiAKICAgICAoQ1ZFLTIwMDYtMzczOCkgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRml4IFNTTCBjbGllbnQgY29kZSB3aGljaCBjb3VsZCBjcmFzaCBpZiBjb25uZWN0aW5nIHRvIGEKICAgICBtYWxpY2lvdXMgU1NMdjIgc2VydmVyLiAgKENWRS0yMDA2LTQzNDMpCiAgICAgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgQ2hhbmdlIGNpcGhlcnN1aXRlIHN0cmluZyBwcm9jZXNzaW5nIHNvIHRoYXQgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlIChzbyB0aGF0ICJBRVMyNTYtU0hBIgogICAgIHdpbGwgbm8gbG9uZ2VyIGluY2x1ZGUgIkFFUzEyOC1TSEEiKSwgYW5kIGFueSBvdGhlciBzaW1pbGFyCiAgICAgY2lwaGVyc3VpdGUgKHNhbWUgYml0bWFwKSBmcm9tICpvdGhlciogcHJvdG9jb2wgdmVyc2lvbnMgKHNvIHRoYXQKICAgICAiUkM0LU1ENSIgd2lsbCBzdGlsbCBpbmNsdWRlIGJvdGggdGhlIFNTTCAyLjAgY2lwaGVyc3VpdGUgYW5kIHRoZQogICAgIFNTTCAzLjAvVExTIDEuMCBjaXBoZXJzdWl0ZSkuICBUaGlzIGlzIGEgYmFja3BvcnQgY29tYmluaW5nCiAgICAgY2hhbmdlcyBmcm9tIDAuOS44YiBhbmQgMC45LjhkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aiBhbmQgMC45LjdrICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIENoYW5nZSB0aGUgVW5peCByYW5kb21uZXNzIGVudHJvcHkgZ2F0aGVyaW5nIHRvIHVzZSBwb2xsKCkgd2hlbgogICAgIHBvc3NpYmxlIGluc3RlYWQgb2Ygc2VsZWN0KCksIHNpbmNlIHRoZSBsYXR0ZXIgaGFzIHNvbWUKICAgICB1bmRlc2lyYWJsZSBsaW1pdGF0aW9ucy4KICAgICBbRGFycnlsIE1pbGVzIHZpYSBSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZlIHRoZSByZW1haW5pbmcgY2lwaGVyc3VpdGVzIGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAxLnR4dC4gIFRoZXNlIGFyZSBqdXN0IGFzCiAgICAgdW5vZmZpY2lhbCwgYW5kIHRoZSBJRCBoYXMgbG9uZyBleHBpcmVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBSU0EgYmxpbmRpbmcgSGVpc2VuYnVnIChwcm9ibGVtcyBzb21ldGltZXMgb2NjdXJlZCBvbgogICAgIGR1YWwtY29yZSBtYWNoaW5lcykgYW5kIG90aGVyIHBvdGVudGlhbCB0aHJlYWQtc2FmZXR5IGlzc3Vlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2kgYW5kIDAuOS43aiAgWzA0IE1heSAyMDA2XQoKICAqKSBBZGFwdCBmaXBzbGQgYW5kIHRoZSBidWlsZCBzeXN0ZW0gdG8gbGluayBhZ2FpbnN0IHRoZSB2YWxpZGF0ZWQgRklQUwogICAgIG1vZHVsZSBpbiBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgZm9yIFZDKysgMjAwNSBidWlsZCB1bmRlciBXaW5kb3dzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgV2luZG93cyBidWlsZCB0YXJnZXQgVkMtMzItR01BS0UgZm9yIFZDKysuIFRoaXMgdXNlcyBHTlUgbWFrZSAKICAgICBmcm9tIGEgV2luZG93cyBiYXNoIHNoZWxsIHN1Y2ggYXMgTVNZUy4gSXQgaXMgYXV0b2RldGVjdGVkIGZyb20gdGhlCiAgICAgImNvbmZpZyIgc2NyaXB0IHdoZW4gcnVuIGZyb20gYSBWQysrIGVudmlyb25tZW50LiBNb2RpZnkgc3RhbmRhcmQgVkMrKwogICAgIGJ1aWxkIHRvIHVzZSBmaXBzY2FuaXN0ZXIubyBmcm9tIHRoZSBHTlUgbWFrZSBidWlsZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdoIGFuZCAwLjkuN2kgIFsxNCBPY3QgMjAwNV0KCiAgKikgV3JhcHBlZCB0aGUgZGVmaW5pdGlvbiBvZiBFVlBfTUFYX01EX1NJWkUgaW4gYSAjaWZkZWYgT1BFTlNTTF9GSVBTLgogICAgIFRoZSB2YWx1ZSBub3cgZGlmZmVycyBkZXBlbmRpbmcgb24gaWYgeW91IGJ1aWxkIGZvciBGSVBTIG9yIG5vdC4KICAgICBCRVdBUkUhICBBIHByb2dyYW0gbGlua2VkIHdpdGggYSBzaGFyZWQgRklQU2VkIGxpYmNyeXB0byBjYW4ndCBiZQogICAgIHNhZmVseSBydW4gd2l0aCBhIG5vbi1GSVBTZWQgbGliY3J5cHRvLCBhcyBpdCBtYXkgY3Jhc2ggYmVjYXVzZSBvZgogICAgIHRoZSBkaWZmZXJlbmNlIGluZHVjZWQgYnkgdGhpcyBjaGFuZ2UuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZyBhbmQgMC45LjdoICBbMTEgT2N0IDIwMDVdCgogICopIFJlbW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBTU0xfT1BfTVNJRV9TU0xWMl9SU0FfUEFERElORwogICAgIChwYXJ0IG9mIFNTTF9PUF9BTEwpLiAgVGhpcyBvcHRpb24gdXNlZCB0byBkaXNhYmxlIHRoZQogICAgIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgbWFuLWluLXRoZS1taWRkbGUgcHJvdG9jb2wtdmVyc2lvbgogICAgIHJvbGxiYWNrIGluIHRoZSBTU0wgMi4wIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgYSBiYWQKICAgICBpZGVhLiAgKENWRS0yMDA1LTI5NjkpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgWXV0YWthIE9pd2EgKFJlc2VhcmNoIENlbnRlcgogICAgIGZvciBJbmZvcm1hdGlvbiBTZWN1cml0eSwgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEFkdmFuY2VkIEluZHVzdHJpYWwKICAgICBTY2llbmNlIGFuZCBUZWNobm9sb2d5IFtBSVNUXSwgSmFwYW4pXQoKICAqKSBNaW5pbWFsIHN1cHBvcnQgZm9yIFg5LjMxIHNpZ25hdHVyZXMgYW5kIFBTUyBwYWRkaW5nIG1vZGVzLiBUaGlzIGlzCiAgICAgbWFpbmx5IGZvciBGSVBTIGNvbXBsaWFuY2UgYW5kIG5vdCBmdWxseSBpbnRlZ3JhdGVkIGF0IHRoaXMgc3RhZ2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIERTQSBzaWduaW5nLCB1bmxlc3MgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSBpcyBzZXQsIHBlcmZvcm0KICAgICB0aGUgZXhwb25lbnRpYXRpb24gdXNpbmcgYSBmaXhlZC1sZW5ndGggZXhwb25lbnQuICAoT3RoZXJ3aXNlLAogICAgIHRoZSBpbmZvcm1hdGlvbiBsZWFrZWQgdGhyb3VnaCB0aW1pbmcgY291bGQgZXhwb3NlIHRoZSBzZWNyZXQga2V5CiAgICAgYWZ0ZXIgbWFueSBzaWduYXR1cmVzOyBjZi4gQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sgb24gRFNBIHdpdGgKICAgICBiaWFzZWQgay4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBhIG5ldyBmaXhlZC13aW5kb3cgbW9kX2V4cCBpbXBsZW1lbnRhdGlvbiB0aGUgZGVmYXVsdCBmb3IKICAgICBSU0EsIERTQSwgYW5kIERIIHByaXZhdGUta2V5IG9wZXJhdGlvbnMgc28gdGhhdCB0aGUgc2VxdWVuY2Ugb2YKICAgICBzcXVhcmVzIGFuZCBtdWx0aXBsaWVzIGFuZCB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJuIGFyZQogICAgIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHNlY3JldCBrZXkuICBUaGlzIHdpbGwgbWl0aWdhdGUKICAgICBjYWNoZS10aW1pbmcgYW5kIHBvdGVudGlhbCByZWxhdGVkIGF0dGFja3MuCgogICAgIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKSBpcyB0aGUgbmV3IGV4cG9uZW50aWF0aW9uIGltcGxlbWVudGF0aW9uLAogICAgIGFuZCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgdXNlZCBieSBCTl9tb2RfZXhwX21vbnQoKSBpZiB0aGUgbmV3IGZsYWcKICAgICBCTl9GTEdfRVhQX0NPTlNUVElNRSBpcyBzZXQgZm9yIHRoZSBleHBvbmVudC4gIFJTQSwgRFNBLCBhbmQgREgKICAgICB3aWxsIHVzZSB0aGlzIEJOIGZsYWcgZm9yIHByaXZhdGUgZXhwb25lbnRzIHVubGVzcyB0aGUgZmxhZwogICAgIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIG9yCiAgICAgREhfRkxBR19OT19FWFBfQ09OU1RUSU1FLCByZXNwZWN0aXZlbHksIGlzIHNldC4KCiAgICAgW01hdHRoZXcgRCBXb29kIChJbnRlbCBDb3JwKSwgd2l0aCBzb21lIGNoYW5nZXMgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgU1NMdjIzX21ldGhvZCgpIGFuZAogICAgIFNTTHYyM19jbGllbnRfbWV0aG9kKCkgc28gdGhhdCBpcyB1c2VzIHRoZSBTU0wgMy4wL1RMUyAxLjAKICAgICBDbGllbnQgSGVsbG8gbWVzc2FnZSBmb3JtYXQgaWYgdGhlIFNTTF9PUF9OT19TU0x2MiBvcHRpb24gaXMgc2V0LgogICAgIChQcmV2aW91c2x5LCB0aGUgU1NMIDIuMCBiYWNrd2FyZHMgY29tcGF0aWJsZSBDbGllbnQgSGVsbG8KICAgICBtZXNzYWdlIGZvcm1hdCB3b3VsZCBiZSB1c2VkIGV2ZW4gd2l0aCBTU0xfT1BfTk9fU1NMdjIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBzbWltZS10eXBlIE1JTUUgcGFyYW1ldGVyIGluIFMvTUlNRSBtZXNzYWdlcyB3aGljaCBzb21lCiAgICAgY2xpZW50cyBuZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCkgdG8gc2V0IG1vbnRnb21lcnkgcGFyYW1ldGVycyBpbgogICAgIGEgdGhyZWFkc2FmZSBtYW5uZXIuIE1vZGlmeSByc2EgY29kZSB0byB1c2UgbmV3IGZ1bmN0aW9uIGFuZCBhZGQgY2FsbHMKICAgICB0byBkc2EgYW5kIGRoIGNvZGUgKHdoaWNoIGhhZCByYWNlIGNvbmRpdGlvbnMgYmVmb3JlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbmNsdWRlIHRoZSBmaXhlZCBlcnJvciBsaWJyYXJ5IGNvZGUgaW4gdGhlIEMgZXJyb3IgZmlsZSBkZWZpbml0aW9ucwogICAgIGluc3RlYWQgb2YgZml4aW5nIHRoZW0gdXAgYXQgcnVudGltZS4gVGhpcyBrZWVwcyB0aGUgZXJyb3IgY29kZQogICAgIHN0cnVjdHVyZXMgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdmIGFuZCAwLjkuN2cgIFsxMSBBcHIgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aCBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgRml4ZXMgZm9yIG5ld2VyIGtlcmJlcm9zIGhlYWRlcnMuIE5COiB0aGUgY2FzdHMgYXJlIG5lZWRlZCBiZWNhdXNlCiAgICAgdGhlICdsZW5ndGgnIGZpZWxkIGlzIHNpZ25lZCBvbiBvbmUgdmVyc2lvbiBhbmQgdW5zaWduZWQgb24gYW5vdGhlcgogICAgIHdpdGggbm8gKD8pIG9idmlvdXMgd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UsIHdpdGhvdXQgdGhlc2UgVkMrKwogICAgIGNvbXBsYWlucy4gQWxzbyB0aGUgImRlZmluaXRpb24iIG9mIEZBUiAoYmxhbmspIGlzIG5vIGxvbmdlciBpbmNsdWRlZAogICAgIG5vciBpcyB0aGUgZXJyb3IgRU5PTUVNLiBLUkI1X1BSSVZBVEUgaGFzIHRvIGJlIHNldCB0byAxIHRvIHBpY2sgdXAKICAgICBzb21lIG5lZWRlZCBkZWZpbml0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbmRvIEN5Z3dpbiBjaGFuZ2UuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIHByb3h5IGNlcnRpZmljYXRlcyBhY2NvcmRpbmcgdG8gUkZDIDM4MjAuCiAgICAgQmVjYXVzZSB0aGV5IG1heSBiZSBhIHNlY3VyaXR5IHRocmVhZCB0byB1bmF3YXJlIGFwcGxpY2F0aW9ucywKICAgICB0aGV5IG11c3QgYmUgZXhwbGljaXRlbHkgYWxsb3dlZCBpbiBydW4tdGltZS4gIFNlZQogICAgIGRvY3MvSE9XVE8vcHJveHlfY2VydGlmaWNhdGVzLnR4dCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2UgYW5kIDAuOS43ZiAgWzIyIE1hciAyMDA1XQoKICAqKSBVc2UgKFNTTF9SQU5ET01fVkFMVUUgLSA0KSBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tIGRhdGEgd2hlbiBnZW5lcmF0aW5nCiAgICAgc2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcy4gUHJldmlvdXNseQogICAgIChTU0xfUkFORE9NX1ZBTFVFIC0gc2l6ZW9mKHRpbWVfdCkpIHdvdWxkIGJlIHVzZWQgd2hpY2ggd291bGQgcmVzdWx0IGluCiAgICAgbGVzcyByYW5kb20gZGF0YSB3aGVuIHNpemVvZih0aW1lX3QpID4gNCAoc29tZSA2NCBiaXQgcGxhdGZvcm1zKS4KCiAgICAgVGhpcyBjaGFuZ2UgaGFzIG5lZ2xpZ2libGUgc2VjdXJpdHkgaW1wYWN0IGJlY2F1c2U6CgogICAgIDEuIFNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMgc3RpbGwgaGF2ZSAyNCBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tCiAgICAgICAgZGF0YS4KCiAgICAgMi4gU2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcyBhcmUgc2VudCBpbiB0aGUgY2xlYXIgaW4gdGhlIGluaXRpYWwKICAgICAgICBoYW5kc2hha2UuCgogICAgIDMuIFRoZSBtYXN0ZXIgc2VjcmV0IGlzIGRlcml2ZWQgdXNpbmcgdGhlIHByZW1hc3RlciBzZWNyZXQgKDQ4IGJ5dGVzIGluCiAgICAgICAgc2l6ZSBmb3Igc3RhdGljIFJTQSBjaXBoZXJzdWl0ZXMpIGFzIHdlbGwgYXMgY2xpZW50IHNlcnZlciBhbmQgcmFuZG9tCiAgICAgICAgdmFsdWVzLgoKICAgICBUaGUgT3BlblNTTCB0ZWFtIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIFVLIE5JU0NDIGZvciBicmluZ2luZyB0aGlzIGlzc3VlCiAgICAgdG8gb3VyIGF0dGVudGlvbi4gCgogICAgIFtTdGVwaGVuIEhlbnNvbiwgcmVwb3J0ZWQgYnkgVUsgTklTQ0NdCgogICopIFVzZSBXaW5kb3dzIHJhbmRvbW5lc3MgY29sbGVjdGlvbiBvbiBDeWd3aW4uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBoYW5nIGluIEVHRC9QUk5HRCBxdWVyeSB3aGVuIGNvbW11bmljYXRpb24gc29ja2V0IGlzIGNsb3NlZAogICAgIHByZW1hdHVyZWx5IGJ5IEVHRC9QUk5HRC4KICAgICBbRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiB2aWEgTHV0eiBK5G5pY2tlLCByZXNvbHZlcyAjMTAxNF0KCiAgKikgUHJvbXB0IGZvciBwYXNzIHBocmFzZXMgd2hlbiBhcHByb3ByaWF0ZSBmb3IgUEtDUzEyIGlucHV0IGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCYWNrLXBvcnQgb2Ygc2VsZWN0ZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZyb20gZGV2ZWxvcG1lbnQKICAgICBicmFuY2gsIGFzIHdlbGwgYXMgaW1wcm92ZWQgc3VwcG9ydCBmb3IgUG93ZXJQQyBwbGF0Zm9ybXMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBsb3RzIG9mIGNoZWNrcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgZXJyb3IgY29kZXMgdG8gaW5kaWNhdGUKICAgICBmYWlsdXJlIGFuZCBmcmVlaW5nIHVwIG1lbW9yeSBpZiBhIGZhaWx1cmUgb2NjdXJzLgogICAgIFtOYXV0aWN1cyBOZXR3b3JrcyBTU0wgVGVhbSA8b3BlbnNzbEBuYXV0aWN1c25ldC5jb20+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXBhc3NpbiBhcmd1bWVudCB0byBkZ3N0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcmZvcm0gc29tZSBjaGFyYWN0ZXIgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50IHR5cGVzIGluIFg1MDlfTkFNRV9jbXA6CiAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgY2VydGlmaWNhdGVzIHRoYXQgcmVlbmNvZGUgRE5zIGludG8gVVRGOFN0cmluZ3MKICAgICAoaW4gdmlvbGF0aW9uIG9mIFJGQzMyODApIGFuZCBjYW4ndCBvciB3b250IGlzc3VlIG5hbWUgcm9sbG92ZXIKICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBhbiBleHBsaWNpdCBjaGVjayBkdXJpbmcgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiB0byBzZWUgdGhhdAogICAgIHRoZSBDQSBzZXR0aW5nIGluIGVhY2ggY2VydGlmaWNhdGUgb24gdGhlIGNoYWluIGlzIGNvcnJlY3QuICBBcyBhCiAgICAgc2lkZSBlZmZlY3QgYWx3YXlzIGRvIHRoZSBmb2xsb3dpbmcgYmFzaWMgY2hlY2tzIG9uIGV4dGVuc2lvbnMsCiAgICAgbm90IGp1c3Qgd2hlbiB0aGVyZSdzIGFuIGFzc29jaWF0ZWQgcHVycG9zZSB0byB0aGUgY2hlY2s6CgogICAgICAtIGlmIHRoZXJlIGlzIGFuIHVuaGFuZGxlZCBjcml0aWNhbCBleHRlbnNpb24gKHVubGVzcyB0aGUgdXNlcgogICAgICAgIGhhcyBjaG9zZW4gdG8gaWdub3JlIHRoaXMgZmF1bHQpCiAgICAgIC0gaWYgdGhlIHBhdGggbGVuZ3RoIGhhcyBiZWVuIGV4Y2VlZGVkIChpZiBvbmUgaXMgc2V0IGF0IGFsbCkKICAgICAgLSB0aGF0IGNlcnRhaW4gZXh0ZW5zaW9ucyBmaXQgdGhlIGFzc29jaWF0ZWQgcHVycG9zZSAoaWYgb25lIGhhcwogICAgICAgIGJlZW4gZ2l2ZW4pCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdkIGFuZCAwLjkuN2UgIFsyNSBPY3QgMjAwNF0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIENSTHMgYXJlIGNoZWNrZWQgaW4gYSBtdWx0aSB0aHJlYWRlZCAKICAgICBlbnZpcm9ubWVudC4gVGhpcyB3b3VsZCBoYXBwZW4gZHVlIHRvIHRoZSByZW9yZGVyaW5nIG9mIHRoZSByZXZva2VkCiAgICAgZW50cmllcyBkdXJpbmcgc2lnbmF0dXJlIGNoZWNraW5nIGFuZCBzZXJpYWwgbnVtYmVyIGxvb2t1cC4gTm93IHRoZQogICAgIGVuY29kaW5nIGlzIGNhY2hlZCBhbmQgdGhlIHNlcmlhbCBudW1iZXIgc29ydCBwZXJmb3JtZWQgdW5kZXIgYSBsb2NrLgogICAgIEFkZCBuZXcgU1RBQ0sgZnVuY3Rpb24gc2tfaXNfc29ydGVkKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERlbHRhIENSTCB0byB0aGUgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byBzM19wa3QuYyBzbyBhbGVydHMgYXJlIHNlbnQgcHJvcGVybHkuCiAgICAgW0RhdmlkIEhvbG1lcyA8ZC5ob2xtZXNAZjUuY29tPl0KCiAgKikgUmVkdWNlIHRoZSBjaGFuY2VzIG9mIGR1cGxpY2F0ZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcnMgKGluCiAgICAgdmlvbGF0aW9uIG9mIFJGQzMyODApIHVzaW5nIHRoZSBPcGVuU1NMIGNlcnRpZmljYXRlIGNyZWF0aW9uIHV0aWxpdGllcy4KICAgICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSByYW5kb20gNjQgYml0IHZhbHVlIGZvciB0aGUgaW5pdGlhbCBzZXJpYWwKICAgICBudW1iZXIgd2hlbiBhIHNlcmlhbCBudW1iZXIgZmlsZSBpcyBjcmVhdGVkIG9yIHdoZW4gYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlzIGNyZWF0ZWQgdXNpbmcgJ29wZW5zc2wgcmVxIC14NTA5Jy4gVGhlIGluaXRpYWwgc2VyaWFsCiAgICAgbnVtYmVyIGZpbGUgaXMgY3JlYXRlZCB1c2luZyAnb3BlbnNzbCB4NTA5IC1uZXh0X3NlcmlhbCcgaW4gQ0EucGwKICAgICByYXRoZXIgdGhhbiBiZWluZyBpbml0aWFsaXplZCB0byAxLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YyBhbmQgMC45LjdkICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZCAgICAgICAgICAgCiAgICAgYnkgdXNpbmcgdGhlIENvZGVub21pY29uIFRMUyBUZXN0IFRvb2wgKENWRS0yMDA0LTAwNzkpICAgICAgICAgICAgICAgICAgICAKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIEZpeCBmbGF3IGluIFNTTC9UTFMgaGFuZHNoYWtpbmcgd2hlbiB1c2luZyBLZXJiZXJvcyBjaXBoZXJzdWl0ZXMKICAgICAoQ1ZFLTIwMDQtMDExMikKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBYNTA5IHZlcmlmeSBmaXhlcy4gRGlzYWJsZSBicm9rZW4gY2VydGlmaWNhdGUgd29ya2Fyb3VuZHMgd2hlbiAKICAgICBYNTA5X1ZfRkxBR1NfWDUwOV9TVFJJQ1QgaXMgc2V0LiBDaGVjayBDUkwgaXNzdWVyIGhhcyBjUkxTaWduIHNldCBpZgogICAgIGtleVVzYWdlIGV4dGVuc2lvbiBwcmVzZW50LiBEb24ndCBhY2NlcHQgQ1JMcyB3aXRoIHVuaGFuZGxlZCBjcml0aWNhbAogICAgIGV4dGVuc2lvbnM6IHNpbmNlIHZlcmlmeSBjdXJyZW50bHkgZG9lc24ndCBwcm9jZXNzIENSTCBleHRlbnNpb25zIHRoaXMKICAgICByZWplY3RzIGEgQ1JMIHdpdGggKmFueSogY3JpdGljYWwgZXh0ZW5zaW9ucy4gQWRkIG5ldyB2ZXJpZnkgZXJyb3IgY29kZXMKICAgICBmb3IgdGhlc2UgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBjcmVhdGluZyBhbiBPQ1NQIG5vbmNlIHVzZSBhbiBPQ1RFVCBTVFJJTkcgaW5zaWRlIHRoZSBleHRuVmFsdWUuCiAgICAgQSBjbGFyaWZpY2F0aW9uIG9mIFJGQzI1NjAgd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgT0NURVQgU1RSSU5HcyBhbmQgCiAgICAgc29tZSBpbXBsZW1lbnRhdGlvbnMgY2Fubm90IGhhbmRsZSB0aGUgY3VycmVudCByYXcgZm9ybWF0LiBTaW5jZSBPcGVuU1NMCiAgICAgY29waWVzIGFuZCBjb21wYXJlcyBPQ1NQIG5vbmNlcyBhcyBvcGFxdWUgYmxvYnMgd2l0aG91dCBhbnkgYXR0ZW1wdCBhdAogICAgIHBhcnNpbmcgdGhlbSB0aGlzIHNob3VsZCBub3QgY3JlYXRlIGFueSBjb21wYXRpYmlsaXR5IGlzc3Vlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbWQgZmxhZyBFVlBfTURfQ1RYX0ZMQUdfUkVVU0UgdGhpcyBhbGxvd3MgbWRfZGF0YSB0byBiZSByZXVzZWQgd2hlbgogICAgIGNhbGxpbmcgRVZQX01EX0NUWF9jb3B5X2V4KCkgdG8gYXZvaWQgY2FsbGluZyBPUEVOU1NMX21hbGxvYygpLiBXaXRob3V0CiAgICAgdGhpcyBITUFDIChhbmQgb3RoZXIpIG9wZXJhdGlvbnMgYXJlIHNldmVyYWwgdGltZXMgc2xvd2VyIHRoYW4gT3BlblNTTAogICAgIDwgMC45LjcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJpbnQgb3V0IEdlbmVyYWxpemVkVGltZSBhbmQgVVRDVGltZSBpbiBBU04xX1NUUklOR19wcmludF9leCgpLgogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPFBldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyPl0KCiAgKikgVXNlIHRoZSBjb3JyZWN0IGNvbnRlbnQgd2hlbiBzaWduaW5nIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2IgYW5kIDAuOS43YyAgWzMwIFNlcCAyMDAzXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJldmVhbGVkIGJ5IHJ1bm5pbmcgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3Agb3V0IG9mIGJvdW5kcyByZWFkcyBpbiB0aGUgQVNOMSBjb2RlIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBpbnZhbGlkIHRhZ3MgKENWRS0yMDAzLTA1NDMgYW5kIENWRS0yMDAzLTA1NDQpLgogICAgIAogICAgIEZyZWUgdXAgQVNOMV9UWVBFIGNvcnJlY3RseSBpZiBBTlkgdHlwZSBpcyBpbnZhbGlkIChDVkUtMjAwMy0wNTQ1KS4KCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLWlnbm9yZV9lcnIgb3B0aW9uIGluIG9jc3AgYXBwbGljYXRpb24gdG8gc3RvcCB0aGUgc2VydmVyCiAgICAgZXhpdGluZyBvbiB0aGUgZmlyc3QgZXJyb3IgaW4gYSByZXF1ZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfYWNjZXB0KCkgKHNzbC9zM19zcnZyLmMpIG9ubHkgYWNjZXB0IGEgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgaWYgdGhlIHNlcnZlciByZXF1ZXN0ZWQgb25lOiBhcyBzdGF0ZWQgaW4gVExTIDEuMCBhbmQgU1NMIDMuMAogICAgIHNwZWNpZmljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpIChzc2wvczNfc3J2ci5jKSwgdG9sZXJhdGUgYWRkaXRpb25hbAogICAgIGV4dHJhIGRhdGEgYWZ0ZXIgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IG9ubHkgZm9yIFRMUyAxLjAKICAgICBidXQgYWxzbyBmb3IgU1NMIDMuMCAoYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24pLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWF0dGhpYXMgTG9lcGZlXQoKICAqKSBDaGFuZ2UgWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKCkgdG8gbWFyayB0aGUga2V5IGFzIGV4cG9ydGVkL2V4cG9ydGFibGUKICAgICB3aGVuIGl0J3MgNTEyICpiaXRzKiBsb25nLCBub3QgNTEyIGJ5dGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBBRVNfY2JjX2VuY3J5cHQoKSBzbyBpdCBvdXRwdXRzIGV4YWN0IG11bHRpcGxlIG9mCiAgICAgYmxvY2tzIGR1cmluZyBlbmNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gYmFzZTY0IEJJTyBhbmQgbm9uIGJsb2NraW5nIEkvTy4gT24gd3JpdGUgCiAgICAgZmx1c2hlcyB3ZXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBCSU8gcmV0cmllZC4gT24gcmVhZAogICAgIGRhdGEgd2FzIG5vdCBiZWluZyBidWZmZXJlZCBwcm9wZXJseSBhbmQgaGFkIHZhcmlvdXMgbG9naWMgYnVncy4KICAgICBUaGlzIGFsc28gYWZmZWN0cyBibG9ja2luZyBJL08gd2hlbiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkIGlzIGEKICAgICBjZXJ0YWluIHNpemUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBTL01JTUUgYnVnZml4ZXMgYW5kIGNvbXBhdGliaWxpdHkgY2hhbmdlczoKICAgICBvdXRwdXQgY29ycmVjdCBhcHBsaWNhdGlvbi9wa2NzNyBNSU1FIHR5cGUgaWYKICAgICBQS0NTN19OT09MRE1JTUVUWVBFIGlzIHNldC4gVG9sZXJhdGUgc29tZSBicm9rZW4gc2lnbmF0dXJlcy4KICAgICBPdXRwdXQgQ1IrTEYgZm9yIEVPTCBpZiBQS0NTN19DUkxGRU9MIGlzIHNldCAodGhpcyBtYWtlcyBvcGVuaW5nCiAgICAgb2YgZmlsZXMgYXMgLmVtbCB3b3JrKS4gQ29ycmVjdGx5IGhhbmRsZSB2ZXJ5IGxvbmcgbGluZXMgaW4gTUlNRQogICAgIHBhcnNlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2EgYW5kIDAuOS43YiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXhlZCBhIHR5cG8gYnVnIHRoYXQgd291bGQgY2F1c2UgRU5HSU5FX3NldF9kZWZhdWx0KCkgdG8gc2V0IGFuCiAgICAgRU5HSU5FIGFzIGRlZmF1bHRzIGZvciBhbGwgc3VwcG9ydGVkIGFsZ29yaXRobXMgaXJyZXNwZWN0aXZlIG9mCiAgICAgdGhlICdmbGFncycgcGFyYW1ldGVyLiAnZmxhZ3MnIGlzIG5vdyBob25vdXJlZCwgc28gYXBwbGljYXRpb25zCiAgICAgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGFyZSBwYXNzaW5nIGl0IGNvcnJlY3RseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUYXJnZXQgIm1pbmd3IiBub3cgYWxsb3dzIG5hdGl2ZSBXaW5kb3dzIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluCiAgICAgdGhlIEN5Z3dpbiBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdpdGggdGhlIE1pbkdXIGNvbXBpbGVyLgogICAgIFtVbGYgTW9lbGxlcl0gCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43IGFuZCAwLjkuN2EgIFsxOSBGZWIgMjAwM10KCiAgKikgSW4gc3NsM19nZXRfcmVjb3JkIChzc2wvczNfcGt0LmMpLCBtaW5pbWl6ZSBpbmZvcm1hdGlvbiBsZWFrZWQKICAgICB2aWEgdGltaW5nIGJ5IHBlcmZvcm1pbmcgYSBNQUMgY29tcHV0YXRpb24gZXZlbiBpZiBpbmNvcnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKICAqKSBNYWtlIHRoZSBuby1lcnIgb3B0aW9uIHdvcmsgYXMgaW50ZW5kZWQuICBUaGUgaW50ZW50aW9uIHdpdGggbm8tZXJyCiAgICAgaXMgbm90IHRvIGhhdmUgdGhlIHdob2xlIGVycm9yIHN0YWNrIGhhbmRsaW5nIHJvdXRpbmVzIHJlbW92ZWQgZnJvbQogICAgIGxpYmNyeXB0bywgaXQncyBvbmx5IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kCiAgICAgcmVhc29uIHRleHRzLCB0aGVyZWJ5IHJlbW92aW5nIHNvbWUgb2YgdGhlIGZvb3RwcmludCB0aGF0IG1heSBub3QKICAgICBiZSBpbnRlcmVzdGluZyBpZiB0aG9zZSBlcnJvcnMgYXJlbid0IGRpc3BsYXllZCBhbnl3YXkuCgogICAgIE5PVEU6IGl0J3Mgc3RpbGwgcG9zc2libGUgZm9yIGFueSBhcHBsaWNhdGlvbiBvciBtb2R1bGUgdG8gaGF2ZSBpdCdzCiAgICAgb3duIHNldCBvZiBlcnJvciB0ZXh0cyBpbnNlcnRlZC4gIFRoZSByb3V0aW5lcyBhcmUgdGhlcmUsIGp1c3Qgbm90CiAgICAgdXNlZCBieSBkZWZhdWx0IHdoZW4gbm8tZXJyIGlzIGdpdmVuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIG9uIElBNjQuCiAgICAgW2RpcmsubWV5ZXJAZGlub2V4LnN1Yi5vcmcgdmlhIFJpY2hhcmQgTGV2aXR0ZSwgcmVzb2x2ZXMgIzQ1NF0KCiAgKikgQWRqdXN0IERFU19jYmNfY2tzdW0oKSBzbyBpdCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBNSVQKICAgICBLZXJiZXJvcyBmdW5jdGlvbiBtaXRfZGVzX2NiY19ja3N1bSgpLiAgQmVmb3JlIHRoaXMgY2hhbmdlLAogICAgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBERVNfY2JjX2Nrc3VtKCkgd2FzIGxpa2UgdGhlIG9uZSBmcm9tCiAgICAgbWl0X2Rlc19jYmNfY2tzdW0oKSwgZXhjZXB0IHRoZSBieXRlcyB3ZXJlIHN3YXBwZWQuCiAgICAgW0tldmluIEdyZWFuZXkgPEtldmluLkdyZWFuZXlAaHAuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgU1NMIGNoYWluIGJ1aWxkaW5nLgogICAgIEJlZm9yZSB0aGlzIGEgcmF0aGVyIHByaW1pdGl2ZSBjaGFpbiBidWlsZCB3YXMgYWx3YXlzIHBlcmZvcm1lZCBpbgogICAgIHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oKTogYW4gYXBwbGljYXRpb24gaGFkIG5vIHdheSB0byBzZW5kIHRoZSAKICAgICBjb3JyZWN0IGNoYWluIGlmIHRoZSBhdXRvbWF0aWMgb3BlcmF0aW9uIHByb2R1Y2VkIGFuIGluY29ycmVjdCByZXN1bHQuCgogICAgIE5vdyB0aGUgY2hhaW4gYnVpbGRlciBpcyBkaXNhYmxlZCBpZiBlaXRoZXI6CgogICAgIDEuIEV4dHJhIGNlcnRpZmljYXRlcyBhcmUgYWRkZWQgdmlhIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KCiAgICAgMi4gVGhlIG1vZGUgZmxhZyBTU0xfTU9ERV9OT19BVVRPX0NIQUlOIGlzIHNldC4KCiAgICAgVGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBpcyB0aGF0IGFuIGFwcGxpY2F0aW9uIHdvdWxkIG5vdCB3YW50IHRoZQogICAgIGF1dG8gY2hhaW4gYnVpbGRpbmcgdG8gdGFrZSBwbGFjZSBpZiBleHRyYSBjaGFpbiBjZXJ0aWZpY2F0ZXMgYXJlCiAgICAgcHJlc2VudCBhbmQgaXQgbWlnaHQgYWxzbyB3YW50IGEgbWVhbnMgb2Ygc2VuZGluZyBubyBhZGRpdGlvbmFsCiAgICAgY2VydGlmaWNhdGVzIChmb3IgZXhhbXBsZSB0aGUgY2hhaW4gaGFzIHR3byBjZXJ0aWZpY2F0ZXMgYW5kIHRoZQogICAgIHJvb3QgaXMgb21pdHRlZCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBidWlsZCB3aXRob3V0IHRoZSBFTkdJTkUgZnJhbWV3b3JrLgogICAgIFtTdGV2ZW4gUmVkZGllIDxzbXJAZXNzZW1lci5jb20uYXU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFVuZGVyIFdpbjMyIGdtdGltZSgpIGNhbiByZXR1cm4gTlVMTDogY2hlY2sgcmV0dXJuIHZhbHVlIGluCiAgICAgT1BFTlNTTF9nbXRpbWUoKS4gQWRkIGVycm9yIGNvZGUgZm9yIGNhc2Ugd2hlcmUgZ210aW1lKCkgZmFpbHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBJdmFuIEQgTmVzdGxlcm9kZSA8bmVzdGxlckBNSVQuRURVPiwKICAgICBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB2aWEgUFIjNDU5KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBbm90aGVyIGZpeCBmb3IgU1NMdjIgc2Vzc2lvbiBJRCBoYW5kbGluZzogdGhlIHNlc3Npb24gSUQgd2FzIGluY29ycmVjdGx5CiAgICAgY2hlY2tlZCBvbiByZWNvbm5lY3Qgb24gdGhlIGNsaWVudCBzaWRlLCB0aGVyZWZvcmUgc2Vzc2lvbiByZXN1bXB0aW9uCiAgICAgY291bGQgc3RpbGwgZmFpbCB3aXRoIGEgInNzbCBzZXNzaW9uIGlkIGlzIGRpZmZlcmVudCIgZXJyb3IuIFRoaXMKICAgICBiZWhhdmlvdXIgaXMgbWFza2VkIHdoZW4gU1NMX09QX0FMTCBpcyB1c2VkIGR1ZSB0bwogICAgIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcgYmVpbmcgc2V0LgogICAgIEJlaGF2aW91ciBvYnNlcnZlZCBieSBDcmlzcGluIEZsb3dlcmRheSA8Y3Jpc3BpbkBmbG93ZXJkYXkuY3g+IGFzCiAgICAgZm9sbG93dXAgdG8gUFIgIzM3Ny4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSUEtMzIgYXNzZW1ibGVyIHN1cHBvcnQgZW5oYW5jZW1lbnRzOiB1bmlmaWVkIEVMRiB0YXJnZXRzLCBzdXBwb3J0CiAgICAgZm9yIFNDTy9DYWxkZXJhIHBsYXRmb3JtcywgZml4IGZvciBDeWd3aW4gc2hhcmVkIGJ1aWxkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCBvbiBzcGFyYzY0LiAgQXMgYSBjb25zZXF1ZW5jZSwgc3VwcG9ydCBmb3IKICAgICBGcmVlQlNEIG9uIG5vbi14ODYgcHJvY2Vzc29ycyBpcyBzZXBhcmF0ZSBmcm9tIHg4NiBwcm9jZXNzb3JzIG9uCiAgICAgdGhlIGNvbmZpZyBzY3JpcHQsIG11Y2ggbGlrZSB0aGUgTmV0QlNEIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSAmIEtyaXMgS2VubmF3YXkgPGtyaXNAb2JzZWN1cml0eS5vcmc+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS43ICBbMzEgRGVjIDIwMDJdCgogIFtOQjogT3BlblNTTCAwLjkuNmkgYW5kIGxhdGVyIDAuOS42IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuNy5dCgogICopIEZpeCBzZXNzaW9uIElEIGhhbmRsaW5nIGluIFNTTHYyIGNsaWVudCBjb2RlOiB0aGUgU0VSVkVSIEZJTklTSEVECiAgICAgY29kZSAoMDYpIHdhcyB0YWtlbiBhcyB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlIHNlc3Npb24gSUQgYW5kIHRoZSBsYXN0CiAgICAgb2N0ZXQgd2FzIGlnbm9yZWQgY29uc2VxdWVudGx5LiBBcyBhIHJlc3VsdCBTU0x2MiBjbGllbnQgc2lkZSBzZXNzaW9uCiAgICAgY2FjaGluZyBjb3VsZCBub3QgaGF2ZSB3b3JrZWQgZHVlIHRvIHRoZSBzZXNzaW9uIElEIG1pc21hdGNoIGJldHdlZW4KICAgICBjbGllbnQgYW5kIHNlcnZlci4KICAgICBCZWhhdmlvdXIgb2JzZXJ2ZWQgYnkgQ3Jpc3BpbiBGbG93ZXJkYXkgPGNyaXNwaW5AZmxvd2VyZGF5LmN4PiBhcwogICAgIFBSICMzNzcuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIENoYW5nZSB0aGUgZGVjbGFyYXRpb24gb2YgbmVlZGVkIEtlcmJlcm9zIGxpYnJhcmllcyB0byB1c2UgRVhfTElCUwogICAgIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwgKGFuZCBiYWRseSBzdXBwb3J0ZWQpIExJQktSQjUuICBMSUJLUkI1IGlzCiAgICAgcmVtb3ZlZCBlbnRpcmVseS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgaHdfbmNpcGhlci5jIGVuZ2luZSByZXF1aXJlcyBkeW5hbWljIGxvY2tzLiAgVW5mb3J0dW5hdGVseSwgaXQKICAgICBzZWVtcyB0aGF0IGluIHNwaXRlIG9mIGV4aXN0aW5nIGZvciBtb3JlIHRoYW4gYSB5ZWFyLCBtYW55IGFwcGxpY2F0aW9uCiAgICAgYXV0aG9yIGhhdmUgZG9uZSBub3RoaW5nIHRvIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MsIHdoaWNoCiAgICAgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZW5naW5lIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgYW55d2hlcmUuCiAgICAgVGhpcyBpcyBhIHZlcnkgdW5mb3J0dW5hdGUgc2l0dWF0aW9uIHdoaWNoIGZvcmNlcyB1cywgaW4gdGhlIG5hbWUKICAgICBvZiB1c2FiaWxpdHksIHRvIGdpdmUgdGhlIGh3X25jaXBoZXIuYyBhIHN0YXRpYyBsb2NrLCB3aGljaCBpcyBwYXJ0CiAgICAgb2YgbGliY3J5cHRvLgogICAgIE5PVEU6IFRoaXMgaXMgZm9yIHRoZSAwLjkuNyBzZXJpZXMgT05MWS4gIFRoaXMgaGFjayB3aWxsIG5ldmVyCiAgICAgYXBwZWFyIGluIDAuOS44IG9yIGxhdGVyLiAgV2UgRVhQRUNUIGFwcGxpY2F0aW9uIGF1dGhvcnMgdG8gaGF2ZQogICAgIGRlYWx0IHByb3Blcmx5IHdpdGggdGhpcyB3aGVuIDAuOS44IGlzIHJlbGVhc2VkICh1bmxlc3Mgd2UgYWN0dWFsbHkKICAgICBtYWtlIHN1Y2ggY2hhbmdlcyBpbiB0aGUgbGliY3J5cHRvIGxvY2tpbmcgY29kZSB0aGF0IGNoYW5nZXMgd2lsbAogICAgIGhhdmUgdG8gYmUgbWFkZSBhbnl3YXkpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGFzbjFfZDJpX3JlYWRfYmlvKCkgcmVwZWF0ZWRseSBjYWxsIEJJT19yZWFkKCkgdW50aWwgYWxsIGNvbnRlbnQKICAgICBvY3RldHMgaGF2ZSBiZWVuIHJlYWQsIEVPRiBvciBhbiBlcnJvciBvY2N1cnMuIFdpdGhvdXQgdGhpcyBjaGFuZ2UKICAgICBzb21lIHRydW5jYXRlZCBBU04xIHN0cnVjdHVyZXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIEhlaW1kYWwgc3VwcG9ydCwgc2luY2UgaXQgaGFzbid0IGJlZW4gZnVsbHkgaW1wbGVtZW50ZWQuCiAgICAgU3RpbGwgZ2l2ZSB0aGUgcG9zc2liaWxpdHkgdG8gZm9yY2UgdGhlIHVzZSBvZiBIZWltZGFsLCBidXQgd2l0aAogICAgIHdhcm5pbmdzIGFuZCBhIHJlcXVlc3QgdGhhdCBwYXRjaGVzIGdldCBzZW50IHRvIG9wZW5zc2wtZGV2LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgVkMtQ0UgdGFyZ2V0LCBpbnRyb2R1Y2UgdGhlIFdJTkNFIHN5c25hbWUsIGFuZCBhZGQKICAgICBJTlNUQUxMLldDRSBhbmQgYXBwcm9wcmlhdGUgY29uZGl0aW9uYWxzIHRvIG1ha2UgaXQgYnVpbGQuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBETEwgbmFtZXMgZm9yIEN5Z3dpbiB0byBjeWdjcnlwdG8teC55LnouZGxsIGFuZAogICAgIGN5Z3NzbC14Lnkuei5kbGwsIHdoZXJlIHgsIHkgYW5kIHogYXJlIHRoZSBtYWpvciwgbWlub3IgYW5kCiAgICAgZWRpdCBudW1iZXJzIG9mIHRoZSB2ZXJzaW9uLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbnRyb2R1Y2Ugc2FmZSBzdHJpbmcgY29weSBhbmQgY2F0ZW5hdGlvbiBmdW5jdGlvbnMKICAgICAoQlVGX3N0cmxjcHkoKSBhbmQgQlVGX3N0cmxjYXQoKSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZC1zaXplIGJ1ZmZlcnMgZm9yIG9uZS1saW5lIEROcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQlVGX01FTV9ncm93X2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQgc2l6ZSBidWZmZXJzIGZvciBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRpb24uCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBmb3IgdmFyaW91cyBDQSBmaWxlcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBVc2Ugc2l6ZW9mIGluIHByZWZlcmVuY2UgdG8gbWFnaWMgbnVtYmVycy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGluIGNlcnQgcmVxdWVzdHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gY2hlY2sgZm9yIChzdXBwb3NlZGx5IGltcG9zc2libGUpIGJ1ZmZlcgogICAgIG92ZXJmbG93cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBEb24ndCBjYWNoZSB0cnVuY2F0ZWQgRE5TIGVudHJpZXMgaW4gdGhlIGxvY2FsIGNhY2hlICh0aGlzIGNvdWxkCiAgICAgcG90ZW50aWFsbHkgbGVhZCB0byBhIHNwb29maW5nIGF0dGFjaykuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IHZhcmlvdXMgYnVmZmVycyB0byBiZSBsYXJnZSBlbm91Z2ggZm9yIGhleC9kZWNpbWFsCiAgICAgcmVwcmVzZW50YXRpb25zIGluIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFubmVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBDUllQVE9fcmVhbGxvY19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCSU9faW5kZW50KCkgdG8gYXZvaWQgbXVjaCBzbGlnaHRseSB3b3JyeWluZyBjb2RlIHRvIGRvCiAgICAgaW5kZW50cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDb252ZXJ0IHNwcmludGYoKS9CSU9fcHV0cygpIHRvIEJJT19wcmludGYoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBidWZmZXJfZ2V0cygpIGNvdWxkIHRlcm1pbmF0ZSB3aXRoIHRoZSBidWZmZXIgb25seSBoYWxmCiAgICAgZnVsbC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gcHJldmVudCB1c2VyLXN1cHBsaWVkIGNyeXB0byBmdW5jdGlvbnMgZnJvbQogICAgIG92ZXJmbG93aW5nIGludGVybmFsIGJ1ZmZlcnMgYnkgaGF2aW5nIGxhcmdlIGJsb2NrIHNpemVzLCBldGMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgTmV3IE9QRU5TU0xfYXNzZXJ0KCkgbWFjcm8gKHNpbWlsYXIgdG8gYXNzZXJ0KCksIGJ1dCBlbmFibGVkCiAgICAgdW5jb25kaXRpb25hbGx5KS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGNvcHkgb2Yga2V5IGluIFJDNC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBidWZmZXJzIGZvciBJViBpbiBwZW0uaC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBFR0QgcGF0aC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBJZiBSQU5ERklMRSBwYXRoIGlzIHRvbyBsb25nLCBpZ25vcmUgaW5zdGVhZCBvZiB0cnVuY2F0aW5nLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIFguNTA5IHN0cnVjdHVyZQogICAgIENCQ1BhcmFtZXRlci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgZnVuY3Rpb24ga251bWJlcigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBzdHJ1Y3R1cmUsIEtTU0xfRVJSLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFByb3RlY3QgYWdhaW5zdCBvdmVybG9uZyBzZXNzaW9uIElEIGNvbnRleHQgbGVuZ3RoIGluIGFuIGVuY29kZWQKICAgICBzZXNzaW9uIG9iamVjdC4gU2luY2UgdGhlc2UgYXJlIGxvY2FsLCB0aGlzIGRvZXMgbm90IGFwcGVhciB0byBiZQogICAgIGV4cGxvaXRhYmxlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSBmcm9tIHNlY3VyaXR5IHBhdGNoIChzZWUgMC45LjZlIGJlbG93KSB0aGF0IGRpZCBub3QgYWZmZWN0CiAgICAgdGhlIDAuOS42IHJlbGVhc2Ugc2VyaWVzOgoKICAgICBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgbWFzdGVyIGtleSBpbiBLZXJiZXJvcy1lbmFibGVkIHZlcnNpb25zLgogICAgIChDVkUtMjAwMi0wNjU3KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSB0aGUgU1NMIGtlcmI1IGNvZGVzIHRvIG1hdGNoIFJGQyAyNzEyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgLW5hbWVvcHQgd29yayBmdWxseSBmb3IgcmVxIGFuZCBhZGQgLXJlcW9wdCBzd2l0Y2guCiAgICAgW01pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVGhlICJibG9jayBzaXplIiBmb3IgYmxvY2sgY2lwaGVycyBpbiBDRkIgYW5kIE9GQiBtb2RlIHNob3VsZCBiZSAxLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFluZ3ZlIE55c2FldGVyIFBldHRlcnNlbiA8eW5ndmVAb3BlcmEuY29tPl0KCiAgKikgTWFrZSBzdXJlIHRlc3RzIGNhbiBiZSBwZXJmb3JtZWQgZXZlbiBpZiB0aGUgY29ycmVzcG9uZGluZyBhbGdvcml0aG1zCiAgICAgaGF2ZSBiZWVuIHJlbW92ZWQgZW50aXJlbHkuICBUaGlzIHdhcyBhbHNvIHRoZSBsYXN0IHN0ZXAgdG8gbWFrZQogICAgIE9wZW5TU0wgY29tcGlsYWJsZSB3aXRoIERKR1BQIHVuZGVyIGFsbCByZWFzb25hYmxlIGNvbmRpdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgRG91ZyBLYXVmbWFuIDxka2F1Zm1hbkByYWh1bC5uZXQ+XQoKICAqKSBBZGQgY2lwaGVyIHNlbGVjdGlvbiBydWxlcyBDT01QTEVNRU5UT0ZBTEwgYW5kIENPTVBMRU1FTlRPRkRFRkFVTFQKICAgICB0byBhbGxvdyB2ZXJzaW9uIGluZGVwZW5kZW50IGRpc2FibGluZyBvZiBub3JtYWxseSB1bnNlbGVjdGVkIGNpcGhlcnMsCiAgICAgd2hpY2ggbWF5IGJlIGFjdGl2YXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHNlbGVjdGluZyBhIHNpbmdsZSBjaXBoZXIuCgogICAgIChFLmcuLCBjaXBoZXIgbGlzdCBzdHJpbmcgIlJTQSIgZW5hYmxlcyBjaXBoZXJzdWl0ZXMgdGhhdCBhcmUgbGVmdAogICAgIG91dCBvZiAiQUxMIiBiZWNhdXNlIHRoZXkgZG8gbm90IHByb3ZpZGUgc3ltbWV0cmljIGVuY3J5cHRpb24uCiAgICAgIlJTQTohQ09NUExFTUVNRU5UT0ZBTEwiIGF2b2lkcyB0aGVzZSB1bnNhZmUgY2lwaGVyc3VpdGVzLikKICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3Igc2VwYXJhdGUgcGxhdGZvcm0tZGVwZW5kZW50IGJ1aWxkCiAgICAgZGlyZWN0b3JpZXMuICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIG1ha2UgYSBwbGF0Zm9ybS1kZXBlbmRlbnQKICAgICBidWlsZCBkaXJlY3RvcnkgaXMgdGhlIGZvbGxvd2luZyAodGVzdGVkIG9uIExpbnV4KSwgbWF5YmUgd2l0aAogICAgIHNvbWUgbG9jYWwgdHdlYWtzOgoKCSMgUGxhY2UgeW91cnNlbGYgb3V0c2lkZSBvZiB0aGUgT3BlblNTTCBzb3VyY2UgdHJlZS4gIEluCgkjIHRoaXMgZXhhbXBsZSwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE9QRU5TU0xfU09VUkNFCgkjIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgYWJzb2x1dGUgT3BlblNTTCBzb3VyY2UgZGlyZWN0b3J5LgoJbWtkaXIgLXAgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgljZCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCShjZCAkT1BFTlNTTF9TT1VSQ0U7IGZpbmQgLiAtdHlwZSBmKSB8IHdoaWxlIHJlYWQgRjsgZG8KCQlta2RpciAtcCBgZGlybmFtZSAkRmAKCQlsbiAtcyAkT1BFTlNTTF9TT1VSQ0UvJEYgJEYKCWRvbmUKCiAgICAgVG8gYmUgYWJzb2x1dGVseSBzdXJlIG5vdCB0byBkaXN0dXJiIHRoZSBzb3VyY2UgdHJlZSwgYSAibWFrZSBjbGVhbiIKICAgICBpcyBhIGdvb2QgdGhpbmcuICBJZiBpdCBpc24ndCBzdWNjZXNzZnVsbCwgZG9uJ3Qgd29ycnkgYWJvdXQgaXQsCiAgICAgaXQgcHJvYmFibHkgbWVhbnMgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdmVyeSBjbGVhbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHN1cmUgYW55IEVOR0lORSBjb250cm9sIGNvbW1hbmRzIG1ha2UgbG9jYWwgY29waWVzIG9mIHN0cmluZwogICAgIHBvaW50ZXJzIHBhc3NlZCB0byB0aGVtIHdoZW5ldmVyIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IGlzIHBvc3NpYmxlCiAgICAgdGhlIGNhbGxlciBtYXkgaGF2ZSBvdmVyd3JpdHRlbiAob3IgZGVhbGxvY2F0ZWQpIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICBkYXRhIHdoZW4gYSBsYXRlciBFTkdJTkUgb3BlcmF0aW9uIHRyaWVzIHRvIHVzZSB0aGUgc3RvcmVkIHZhbHVlcy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT5dCgogICopIEltcHJvdmUgZGlhZ25vc3RpY3MgaW4gZmlsZSByZWFkaW5nIGFuZCBjb21tYW5kLWxpbmUgZGlnZXN0cy4KICAgICBbQmVuIExhdXJpZSBhaWRlZCBhbmQgYWJldHRlZCBieSBTb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPl0KCiAgKikgQWRkIEFFUyBtb2RlcyBDRkIgYW5kIE9GQiB0byB0aGUgb2JqZWN0IGRhdGFiYXNlLiAgQ29ycmVjdCBhbgogICAgIGVycm9yIGluIEFFUy1DRkIgZGVjcnlwdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgbW9zdCBjYWxscyB0byBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgaW4gZXZwX2VuYy5jLCB0aGlzIAogICAgIGFsbG93cyBleGlzdGluZyBFVlBfQ0lQSEVSX0NUWCBzdHJ1Y3R1cmVzIHRvIGJlIHJldXNlZCBhZnRlcgogICAgIGNhbGxpbmcgRVZQXypGaW5hbCgpLiBUaGlzIGJlaGF2aW91ciBpcyB1c2VkIGJ5IGVuY3J5cHRpb24KICAgICBCSU9zIGFuZCBzb21lIGFwcGxpY2F0aW9ucy4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQKICAgICBhcHBsaWNhdGlvbnMgbXVzdCBleHBsaWNpdGx5IGNsZWFuIHVwIGNpcGhlciBjb250ZXh0cyB3aXRoCiAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgpIG9yIHRoZXkgd2lsbCBsZWFrIG1lbW9yeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGVjayB0aGUgdmFsdWVzIG9mIGRuYSBhbmQgZG5iIGluIGJuX211bF9yZWN1cnNpdmUgYmVmb3JlIGNhbGxpbmcKICAgICBibl9tdWxfY29tYmEgKGEgbm9uIHplcm8gdmFsdWUgbWVhbnMgdGhlIGEgb3IgYiBhcnJheXMgZG8gbm90IGNvbnRhaW4KICAgICBuMiBlbGVtZW50cykgYW5kIGZhbGxiYWNrIHRvIGJuX211bF9ub3JtYWwgaWYgZWl0aGVyIGlzIG5vdCB6ZXJvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBlc2NhcGluZyBvZiBub24tQVNDSUkgY2hhcmFjdGVycyB3aGVuIHVzaW5nIHRoZSAtc3ViaiBvcHRpb24KICAgICBvZiB0aGUgIm9wZW5zc2wgcmVxIiBjb21tYW5kIGxpbmUgdG9vbC4gKFJvYmVydCBKb29wIDxqb29wQGZva3VzLmdtZC5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2Ugb2JqZWN0IGRlZmluaXRpb25zIGNvbXBsaWFudCB0byBMREFQIChSRkMyMjU2KTogU04gaXMgdGhlIHNob3J0CiAgICAgZm9ybSBmb3IgInN1cm5hbWUiLCBzZXJpYWxOdW1iZXIgaGFzIG5vIHNob3J0IGZvcm0uCiAgICAgVXNlICJtYWlsIiBhcyB0aGUgc2hvcnQgbmFtZSBmb3IgInJmYzgyMk1haWxib3giIGFjY29yZGluZyB0byBSRkMyNzk4OwogICAgIHRoZXJlZm9yZSByZW1vdmUgIm1haWwiIHNob3J0IG5hbWUgZm9yICJpbnRlcm5ldCA3Ii4KICAgICBUaGUgT0lEIGZvciB1bmlxdWUgaWRlbnRpZmllcnMgaW4gWDUwOSBjZXJ0aWZpY2F0ZXMgaXMKICAgICB4NTAwVW5pcXVlSWRlbnRpZmllciwgbm90IHVuaXF1ZUlkZW50aWZpZXIuCiAgICAgU29tZSBtb3JlIE9JRCBhZGRpdGlvbnMuIChNaWNoYWVsIEJlbGwgPG1pY2hhZWwuYmVsbEByei5odS1iZXJsaW4uZGU+KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYW4gImluaXQiIGNvbW1hbmQgdG8gdGhlIEVOR0lORSBjb25maWcgbW9kdWxlIGFuZCBhdXRvIGluaXRpYWxpemUKICAgICBFTkdJTkVzLiBXaXRob3V0IGFueSAiaW5pdCIgY29tbWFuZCB0aGUgRU5HSU5FIHdpbGwgYmUgaW5pdGlhbGl6ZWQgCiAgICAgYWZ0ZXIgYWxsIGN0cmwgY29tbWFuZHMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9uIGl0LiBJZiBpbml0PTEgdGhlIAogICAgIEVOR0lORSBpcyBpbml0YWlsaXplZCBhdCB0aGF0IHBvaW50IChjdHJscyBiZWZvcmUgdGhhdCBwb2ludCBhcmUgcnVuCiAgICAgb24gdGhlIHVuaW5pdGlhbGl6ZWQgRU5HSU5FIGFuZCBhZnRlciBvbiB0aGUgaW5pdGlhbGl6ZWQgb25lKS4gSWYKICAgICBpbml0PTAgdGhlbiB0aGUgRU5HSU5FIHdpbGwgbm90IGJlIGluaWF0aWFsaXplZCBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAnYXBwX3ZlcmlmeV9jYWxsYmFjaycgaW50ZXJmYWNlIHNvIHRoYXQgdGhlIHVzZXItZGVmaW5lZAogICAgIGFyZ3VtZW50IGlzIGFjdHVhbGx5IHBhc3NlZCB0byB0aGUgY2FsbGJhY2s6IEluIHRoZQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCkgcHJvdG90eXBlLCB0aGUgY2FsbGJhY2sKICAgICBkZWNsYXJhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KICAgICAgICAgIGludCAoKmNiKSgpCiAgICAgaW50bwogICAgICAgICAgaW50ICgqY2IpKFg1MDlfU1RPUkVfQ1RYICosdm9pZCAqKTsKICAgICBpbiBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4gKHNzbC9zc2xfY2VydC5jKSwgdGhlIGNhbGwKICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgpCiAgICAgaGFzIGJlZW4gY2hhbmdlZCBpbnRvCiAgICAgICAgICBpPXMtPmN0eC0+YXBwX3ZlcmlmeV9jYWxsYmFjaygmY3R4LCBzLT5jdHgtPmFwcF92ZXJpZnlfYXJnKS4KCiAgICAgVG8gdXBkYXRlIGFwcGxpY2F0aW9ucyB1c2luZyBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygpLAogICAgIGEgZHVtbXkgYXJndW1lbnQgY2FuIGJlIGFkZGVkIHRvIHRoZWlyIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICBbRC4gSy4gU21ldHRlcnMgPHNtZXR0ZXJzQHBhcmMueGVyb3guY29tPl0KCiAgKikgQWRkZWQgdGhlICc0NzU4Y2NhJyBFTkdJTkUgdG8gc3VwcG9ydCBJQk0gNDc1OCBjYXJkcy4KICAgICBbTWF1cmljZSBHaXR0ZW5zIDxtYXVyaWNlQGdpdHRlbnMubmw+LCB0b3VjaHVwcyBieSBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhbmQgT1BFTlNTTF9MT0FEX0NPTkYgZGVmaW5lIHdoaWNoIHdpbGwgY2F1c2UKICAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpIHRvIGxvYWQgdGhlIG9wZW5zc2wuY25mIGNvbmZpZyBmaWxlLgogICAgIFRoaXMgYWxsb3dzIG9sZGVyIGFwcGxpY2F0aW9ucyB0byB0cmFuc3BhcmVudGx5IHN1cHBvcnQgY2VydGFpbgogICAgIE9wZW5TU0wgZmVhdHVyZXM6IHN1Y2ggYXMgY3J5cHRvIGFjY2VsZXJhdGlvbiBhbmQgZHluYW1pYyBFTkdJTkUgbG9hZGluZy4KICAgICBUd28gbmV3IGZ1bmN0aW9ucyBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKSB3aGljaCB3aWxsIG5ldmVyCiAgICAgbG9hZCB0aGUgY29uZmlnIGZpbGUgYW5kIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX2NvbmYoKSB3aGljaCB3aWxsCiAgICAgYWx3YXlzIGxvYWQgaXQgaGF2ZSBhbHNvIGJlZW4gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBPRkIsIENGQiBhbmQgQ1RSIChhbGwgd2l0aCAxMjggYml0IGZlZWRiYWNrKSB0byBBRVMuCiAgICAgQWRqdXN0IE5JRHMgYW5kIEVWUCBsYXllci4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uZmlnIG1vZHVsZXMgc3VwcG9ydCBpbiBvcGVuc3NsIHV0aWxpdHkuCgogICAgIE1vc3QgY29tbWFuZHMgbm93IGxvYWQgbW9kdWxlcyBmcm9tIHRoZSBjb25maWcgZmlsZSwKICAgICB0aG91Z2ggaW4gYSBmZXcgKHN1Y2ggYXMgdmVyc2lvbikgdGhpcyBpc24ndCBkb25lIAogICAgIGJlY2F1c2UgaXQgY291bGRuJ3QgYmUgdXNlZCBmb3IgYW55dGhpbmcuCgogICAgIEluIHRoZSBjYXNlIG9mIGNhIGFuZCByZXEgdGhlIGNvbmZpZyBmaWxlIHVzZWQgaXMKICAgICB0aGUgc2FtZSBhcyB0aGUgdXRpbGl0eSBpdHNlbGY6IHRoYXQgaXMgdGhlIC1jb25maWcKICAgICBjb21tYW5kIGxpbmUgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4KICAgICBhbHRlcm5hdGl2ZSBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgZGVmYXVsdCBiZWhhdmlvdXIgZnJvbSBPUEVOU1NMX2NvbmZpZygpLiBJZiBhcHBuYW1lIGlzIE5VTEwKICAgICB1c2UgIm9wZW5zc2xfY29uZiIgaWYgZmlsZW5hbWUgaXMgTlVMTCB1c2UgZGVmYXVsdCBvcGVuc3NsIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiBhcmd1bWVudCB0byBPUEVOU1NMX2NvbmZpZygpIHRvIGFsbG93IHRoZSB1c2Ugb2YgYW4gYWx0ZXJuYXRpdmUKICAgICBjb25maWcgc2VjdGlvbiBuYW1lLiBBZGQgYSBuZXcgZmxhZyB0byB0b2xlcmF0ZSBhIG1pc3NpbmcgY29uZmlnIGZpbGUKICAgICBhbmQgbW92ZSBjb2RlIHRvIENPTkZfbW9kdWxlc19sb2FkX2ZpbGUoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZCBFbmNyeXB0aW9uCiAgICAgUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQvY29ycmVjdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbQUVQIEluYy4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU3VwcG9ydCBmb3IgU3VyZVdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQmFsdGltb3JlCiAgICAgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBUaGUgc3VwcG9ydCB3YXMgY29waWVkIGZyb20gMC45LjZjIFtlbmdpbmVdIGFuZCBhZGFwdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBIYXZlIHRoZSBDSElMIGVuZ2luZSBmb3JrLXNhZmUgKGFzIGRlZmluZWQgYnkgbkNpcGhlcikgYW5kIGFjdHVhbGx5CiAgICAgbWFrZSB0aGUgbmV3ZXIgRU5HSU5FIGZyYW1ld29yayBjb21tYW5kcyBmb3IgdGhlIENISUwgZW5naW5lIHdvcmsuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHByb2R1Y2Ugc2hhcmVkIGxpYnJhcmllcyBvbiBSZWxpYW50VU5JWC4KICAgICBbUm9iZXJ0IERhaGxlbSA8Um9iZXJ0LkRhaGxlbUBmZm0yLnNpZW1lbnMuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgZGVidWctbGludXgtcHByby4KICAgICBNYWtlICdvcGVuc3NsIHJzYScgdXNlIHRoZSBnZW5lcmFsIGtleSBsb2FkaW5nIHJvdXRpbmVzCiAgICAgaW1wbGVtZW50ZWQgaW4gYXBwcy5jLCBhbmQgbWFrZSB0aG9zZSByb3V0aW5lcyBhYmxlIHRvCiAgICAgaGFuZGxlIHRoZSBrZXkgZm9ybWF0IEZPUk1BVF9ORVRTQ0FQRSBhbmQgdGhlIHZhcmlhbnQKICAgICBGT1JNQVRfSUlTU0dDLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAqKSBGaXggYSBjcmFzaGJ1ZyBhbmQgYSBsb2dpYyBidWcgaW4gaHdjcmhrX2xvYWRfcHVia2V5KCkuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgLWtleWZvcm0gdG8gcnNhdXRsLCBhbmQgZG9jdW1lbnQgLWVuZ2luZS4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBpbnNwaXJlZCBieSBUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT5dCgogICopIENoYW5nZSBCSU9fbmV3X2ZpbGUgKGNyeXB0by9iaW8vYnNzX2ZpbGUuYykgdG8gdXNlIG5ldwogICAgIEJJT19SX05PX1NVQ0hfRklMRSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmljCiAgICAgRVJSX1JfU1lTX0xJQiBlcnJvciBjb2RlIGlmIGZvcGVuKCkgZmFpbHMgd2l0aCBFTk9FTlQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBuZXcgZnVuY3Rpb25zCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmUKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZV9kYXRhLgogICAgIFRoZXNlIGFyZSBzaW1pbGFyIHRvCiAgICAgICAgICBFUlJfcGVla19lcnJvcgogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZV9kYXRhLAogICAgIGJ1dCByZXBvcnQgb24gdGhlIGxhdGVzdCBlcnJvciByZWNvcmRlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3Qgb25lCiAgICAgc3RpbGwgaW4gdGhlIGVycm9yIHF1ZXVlLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXJdCiAgICAgICAgCiAgKikgZGVmYXVsdF9hbGdvcml0aG1zIG9wdGlvbiBpbiBFTkdJTkUgY29uZmlnIG1vZHVsZS4gVGhpcyBhbGxvd3MgdGhpbmdzCiAgICAgbGlrZToKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBBTEwKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBSU0EsIERTQSwgUkFORCwgQ0lQSEVSUywgRElHRVNUUwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByZWxpbWluYXJ5IEVOR0lORSBjb25maWcgbW9kdWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHBlcmltZW50YWwgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgQUVTIGNvZGUgdG8gZm9sbG93IHRoZSBzYW1lIG5hbWUgc3RydWN0dXJlIGFzIGFsbCBvdGhlcgogICAgIHN5bW1ldHJpYyBjaXBoZXJzLCBhbmQgYmVoYXZlIHRoZSBzYW1lIHdheS4gIE1vdmUgZXZlcnl0aGluZyB0bwogICAgIHRoZSBkaXJlY3RvcnkgY3J5cHRvL2FlcywgdGhlcmVieSBvYnNvbGV0aW5nIGNyeXB0by9yaWpuZGFlbC4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU0VDVVJJVFk6IHJlbW92ZSB1bnNhZmUgc2V0am1wL3NpZ25hbCBpbnRlcmFjdGlvbiBmcm9tIHVpX29wZW5zc2wuYy4KICAgICBbQmVuIExhdXJpZSBhbmQgVGhlbyBkZSBSYWFkdF0KCiAgKikgQWRkIG9wdGlvbiB0byBvdXRwdXQgcHVibGljIGtleXMgaW4gcmVxIGNvbW1hbmQuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgVXNlIHdOQUZzIGluIEVDX1BPSU5Uc19tdWwoKSBmb3IgaW1wcm92ZWQgZWZmaWNpZW5jeQogICAgICh1cCB0byBhYm91dCAxMCUgYmV0dGVyIHRoYW4gYmVmb3JlIGZvciBQLTE5MiBhbmQgUC0yMjQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMvbWFjcm9zCgogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKGN0eCwgY2IpCiAgICAgICAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKQogICAgICAgICAgU1NMX3NldF9tc2dfY2FsbGJhY2soc3NsLCBjYikKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhzc2wsIGFyZykKCiAgICAgdG8gcmVxdWVzdCBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24KCiAgICAgICAgICB2b2lkIGNiKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKQoKICAgICB3aGVuZXZlciBhIHByb3RvY29sIG1lc3NhZ2UgaGFzIGJlZW4gY29tcGxldGVseSByZWNlaXZlZAogICAgICh3cml0ZV9wID09IDApIG9yIHNlbnQgKHdyaXRlX3AgPT0gMSkuICBIZXJlICd2ZXJzaW9uJyBpcyB0aGUKICAgICBwcm90b2NvbCB2ZXJzaW9uICBhY2NvcmRpbmcgdG8gd2hpY2ggdGhlIFNTTCBsaWJyYXJ5IGludGVycHJldHMKICAgICB0aGUgY3VycmVudCBwcm90b2NvbCBtZXNzYWdlIChTU0wyX1ZFUlNJT04sIFNTTDNfVkVSU0lPTiwgb3IKICAgICBUTFMxX1ZFUlNJT04pLiAgJ2NvbnRlbnRfdHlwZScgaXMgMCBpbiB0aGUgY2FzZSBvZiBTU0wgMi4wLCBvcgogICAgIHRoZSBjb250ZW50IHR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgU1NMIDMuMC9UTFMgMS4wIHByb3RvY29sCiAgICAgc3BlY2lmaWNhdGlvbiAoY2hhbmdlX2NpcGhlcl9zcGVjKDIwKSwgYWxlcnQoMjEpLCBoYW5kc2hha2UoMjIpKS4KICAgICAnYnVmJyBhbmQgJ2xlbicgcG9pbnQgdG8gdGhlIGFjdHVhbCBtZXNzYWdlLCAnc3NsJyB0byB0aGUKICAgICBTU0wgb2JqZWN0LCBhbmQgJ2FyZycgaXMgdGhlIGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWUgc2V0IGJ5CiAgICAgU1NMW19DVFhdX3NldF9tc2dfY2FsbGJhY2tfYXJnKCkuCgogICAgICdvcGVuc3NsIHNfY2xpZW50JyBhbmQgJ29wZW5zc2wgc19zZXJ2ZXInIGhhdmUgbmV3ICctbXNnJyBvcHRpb25zCiAgICAgdG8gZW5hYmxlIGEgY2FsbGJhY2sgdGhhdCBkaXNwbGF5cyBhbGwgcHJvdG9jb2wgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHNvIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGFzCiAgICAgc29vbiBhcyB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgbGlicmFyeSBpcyBmaW5pc2hlZCwgYW5kIHRoZXJlYnkgZ2V0CiAgICAgb3BlbnNzbCBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJ5LgogICAgIFRoaXMgc3RpbGwgb25seSBoYXBwZW5zIHdoZW4gdGhlIGtleXdvcmQgInNoYXJkIiBoYXMgYmVlbiBnaXZlbiB0bwogICAgIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdHMuCgogICAgIE5PVEU6IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgaXMgc3RpbGwgYW4gZXhwZXJpbWVudGFsIHRoaW5nLCBhbmQKICAgICBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eSBpcyBzdGlsbCBub3QgZ3VhcmFudGVlZC4KICAgICBbIk1hY2llaiBXLiBSb3p5Y2tpIiA8bWFjcm9AZHMyLnBnLmdkYS5wbD4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFN1YmplY3QgSW5mb3JtYXRpb24gQWNjZXNzIGV4dGVuc2lvbi4KICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcj5dCgogICopIE1ha2UgQlVGX01FTV9ncm93KCkgYmVoYXZpb3VyIG1vcmUgY29uc2lzdGVudDogSW5pdGlhbGlzZSB0byB6ZXJvCiAgICAgYWRkaXRpb25hbCBieXRlcyB3aGVuIG5ldyBtZW1vcnkgaGFkIHRvIGJlIGFsbG9jYXRlZCwgbm90IGp1c3QKICAgICB3aGVuIHJldXNpbmcgYW4gZXhpc3RpbmcgYnVmZmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uICd1dGY4JyBmb3IgdGhlIHJlcSBjb21tYW5kLgogICAgIFRoaXMgYWxsb3dzIGZpZWxkIHZhbHVlcyB0byBiZSBzcGVjaWZpZWQgYXMgVVRGOCBzdHJpbmdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtbXVsdGkgYW5kIC1tciBvcHRpb25zIHRvICJvcGVuc3NsIHNwZWVkIiAtIGdpdmluZyBtdWx0aXBsZSBwYXJhbGxlbAogICAgIHJ1bnMgZm9yIHRoZSBmb3JtZXIgYW5kIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgbGF0dGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgJy1ub2VtYWlsRE4nIG9wdGlvbiB0byAnb3BlbnNzbCBjYScuICBUaGlzIHByZXZlbnRzIGluY2x1c2lvbgogICAgIG9mIHRoZSBlLW1haWwgYWRkcmVzcyBpbiB0aGUgRE4gKGkuZS4sIGl0IHdpbGwgZ28gaW50byBhIGNlcnRpZmljYXRlCiAgICAgZXh0ZW5zaW9uIG9ubHkpLiAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uICdlbWFpbF9pbl9kbiA9IG5vJwogICAgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgQ2hhbmdlIGFsbCBmdW5jdGlvbnMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoIGRlc18gdG8gYmUgc3RhcnRpbmcKICAgICB3aXRoIERFU18gaW5zdGVhZC4gIEFkZCB3cmFwcGVycyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggbGliZGVzLAogICAgIGJ1dCBhcmUgbmFtZWQgX29zc2xfb2xkX2Rlc18qLiAgRmluYWxseSwgYWRkIG1hY3JvcyB0aGF0IG1hcCB0aGUKICAgICBkZXNfKiBzeW1ib2xzIHRvIHRoZSBjb3JyZXNwb25kaW5nIF9vc3NsX29sZF9kZXNfKiBpZiBsaWJkZXMKICAgICBjb21wYXRpYmlsaXR5IGlzIGRlc2lyZWQuICBJZiBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5IGlzCiAgICAgZGVzaXJlZCwgdGhlIGRlc18qIHN5bWJvbHMgd2lsbCBiZSBtYXBwZWQgdG8gREVTXyosIHdpdGggb25lCiAgICAgZXhjZXB0aW9uLgoKICAgICBTaW5jZSB3ZSBwcm92aWRlIHR3byBjb21wYXRpYmlsaXR5IG1hcHBpbmdzLCB0aGUgdXNlciBuZWVkcyB0bwogICAgIGRlZmluZSB0aGUgbWFjcm8gT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkgaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgVGhlIGRlZmF1bHQgKGkuZS4sIHdoZW4gdGhhdCBtYWNybwogICAgIGlzbid0IGRlZmluZWQpIGlzIE9wZW5TU0wgMC45LjZjIGNvbXBhdGliaWxpdHkuCgogICAgIFRoZXJlIGFyZSBhbHNvIG1hY3JvcyB0aGF0IGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgc3VwcG9ydCBvZiBvbGQKICAgICBkZXMgZnVuY3Rpb25zIGFsdG9nZXRoZXIuICBUaG9zZSBhcmUgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCiAgICAgYW5kIE9QRU5TU0xfRElTQUJMRV9PTERfREVTX1NVUFBPUlQuICBJZiBub25lIG9yIGJvdGggb2YgdGhvc2UKICAgICBhcmUgZGVmaW5lZCwgdGhlIGRlZmF1bHQgd2lsbCBhcHBseTogdG8gc3VwcG9ydCB0aGUgb2xkIGRlcyByb3V0aW5lcy4KCiAgICAgSW4gZWl0aGVyIGNhc2UsIG9uZSBtdXN0IGluY2x1ZGUgb3BlbnNzbC9kZXMuaCB0byBnZXQgdGhlIGNvcnJlY3QKICAgICBkZWZpbml0aW9ucy4gIERvIG5vdCB0cnkgdG8ganVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzX29sZC5oLCB0aGF0CiAgICAgd29uJ3Qgd29yay4KCiAgICAgTk9URTogVGhpcyBpcyBhIG1ham9yIGJyZWFrIG9mIGFuIG9sZCBBUEkgaW50byBhIG5ldyBvbmUuICBTb2Z0d2FyZQogICAgIGF1dGhvcnMgYXJlIGVuY291cmFnZWQgdG8gc3dpdGNoIHRvIHRoZSBERVNfIHN0eWxlIGZ1bmN0aW9ucy4gIFNvbWUKICAgICB0aW1lIGluIHRoZSBmdXR1cmUsIGRlc19vbGQuaCBhbmQgdGhlIGxpYmRlcyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgZGlzYWJsZSAoaS5lLiBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JUIHdpbGwgYmUgdGhlCiAgICAgZGVmYXVsdCksIGFuZCB0aGVuIGNvbXBsZXRlbHkgcmVtb3ZlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUZXN0IGZvciBjZXJ0aWZpY2F0ZXMgd2hpY2ggY29udGFpbiB1bnN1cHBvcnRlZCBjcml0aWNhbCBleHRlbnNpb25zLgogICAgIElmIHN1Y2ggYSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZCBkdXJpbmcgYSB2ZXJpZnkgb3BlcmF0aW9uIGl0IGlzIAogICAgIHJlamVjdGVkIGJ5IGRlZmF1bHQ6IHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVpdGhlcgogICAgIGhhbmRsaW5nIHRoZSBuZXcgZXJyb3IgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OIG9yCiAgICAgYnkgc2V0dGluZyB0aGUgdmVyaWZ5IGZsYWcgWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMLiBBIG5ldyBmdW5jdGlvbgogICAgIFg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbigpIGhhcyBhbHNvIGJlZW4gYWRkZWQgd2hpY2ggcmV0dXJucyAxIGlmIGEKICAgICBwYXJ0aWN1bGFyIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQIGNpcGhlciBmdW5jdGlvbnMgaW4gc2ltaWxhciB3YXkgdG8gZGlnZXN0cwogICAgIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIGJlaGF2aW91ciBvZiBFVlBfRGlnZXN0SW5pdCgpIGFuZCBFVlBfRGlnZXN0RmluYWwoKSB0byByZXRhaW4KICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4gSW4gcGFydGljdWxhciB0aGUgJ2N0eCcgcGFyYW1ldGVyIGRvZXMKICAgICBub3QgaGF2ZSB0byBiZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGwgdG8gRVZQX0RpZ2VzdEluaXQoKSBhbmQKICAgICBpdCBpcyB0aWRpZWQgdXAgYWZ0ZXIgYSBjYWxsIHRvIEVWUF9EaWdlc3RGaW5hbCgpLiBOZXcgZnVuY3Rpb24KICAgICBFVlBfRGlnZXN0RmluYWxfZXgoKSB3aGljaCBkb2VzIG5vdCB0aWR5IHVwIHRoZSBjdHguIFNpbWlsYXJseSBmdW5jdGlvbgogICAgIEVWUF9NRF9DVFhfY29weSgpIGNoYW5nZWQgdG8gbm90IHJlcXVpcmUgdGhlIGRlc3RpbmF0aW9uIHRvIGJlCiAgICAgaW5pdGlhbGl6ZWQgdmFsaWQgYW5kIG5ldyBmdW5jdGlvbiBFVlBfTURfQ1RYX2NvcHlfZXgoKSBhZGRlZCB3aGljaAogICAgIHJlcXVpcmVzIHRoZSBkZXN0aW5hdGlvbiB0byBiZSB2YWxpZC4KCiAgICAgTW9kaWZ5IGFsbCB0aGUgT3BlblNTTCBkaWdlc3QgY2FsbHMgdG8gdXNlIEVWUF9EaWdlc3RJbml0X2V4KCksCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgYW5kIEVWUF9NRF9DVFhfY29weV9leCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBhbmQgdGhlIGZ1bmN0aW9ucyB1c2luZyBpdAogICAgIHNvIHRoYXQgY29tcGxldGUgJ0hhbmRzaGFrZScgcHJvdG9jb2wgc3RydWN0dXJlcyBhcmUga2VwdCBpbiBtZW1vcnkKICAgICBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nICdtc2dfdHlwZScgYW5kICdsZW5ndGgnIHdpdGggJ2JvZHknIGRhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFuIGltcGxlbWVudGF0aW9uIG9mIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sgZm9yIFdpbjMyLgogICAgIFtNYXNzaW1vIFNhbnRpbiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWpvciByZXN0cnVjdHVyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIEVOR0lORSBjb2RlLiBUaGlzIGluY2x1ZGVzCiAgICAgcmVkdWN0aW9uIG9mIGxpbmtlciBibG9hdCwgc2VwYXJhdGlvbiBvZiBwdXJlICJFTkdJTkUiIG1hbmlwdWxhdGlvbgogICAgIChpbml0aWFsaXNhdGlvbiwgZXRjKSBmcm9tIGZ1bmN0aW9uYWxpdHkgZGVhbGluZyB3aXRoIGltcGxlbWVudGF0aW9ucwogICAgIG9mIHNwZWNpZmljIGNyeXB0byBpdGVyZmFjZXMuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyBpbnRlZ3JhdGVkCiAgICAgc3VwcG9ydCBmb3Igc3ltbWV0cmljIGNpcGhlcnMgYW5kIGRpZ2VzdCBpbXBsZW1lbnRhdGlvbnMgLSBzbyBFTkdJTkVzCiAgICAgY2FuIG5vdyBhY2NlbGVyYXRlIHRoZXNlIGJ5IHByb3ZpZGluZyBFVlBfQ0lQSEVSIGFuZCBFVlBfTUQKICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlaXIgb3duLiBUaGlzIGlzIGRldGFpbGVkIGluIGNyeXB0by9lbmdpbmUvUkVBRE1FCiAgICAgYXMgaXQgY291bGRuJ3QgYmUgYWRlcXVhdGVseSBkZXNjcmliZWQgaGVyZS4gSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3CiAgICAgQVBJIGNoYW5nZXMgd29ydGggbm90aW5nIC0gc29tZSBSU0EsIERTQSwgREgsIGFuZCBSQU5EIGZ1bmN0aW9ucyB0aGF0CiAgICAgd2VyZSBjaGFuZ2VkIGluIHRoZSBvcmlnaW5hbCBpbnRyb2R1Y3Rpb24gb2YgRU5HSU5FIGNvZGUgaGF2ZSBub3cKICAgICByZXZlcnRlZCBiYWNrIC0gdGhlIGhvb2tpbmcgZnJvbSB0aGlzIGNvZGUgdG8gRU5HSU5FIGlzIG5vdyBhIGdvb2QKICAgICBkZWFsIG1vcmUgcGFzc2l2ZSBhbmQgYXQgcnVuLXRpbWUsIG9wZXJhdGlvbnMgZGVhbCBkaXJlY3RseSB3aXRoCiAgICAgUlNBX01FVEhPRHMsIERTQV9NRVRIT0RzIChldGMpIGFzIHRoZXkgZGlkIGJlZm9yZSwgcmF0aGVyIHRoYW4KICAgICBkZXJlZmVyZW5jaW5nIHRocm91Z2ggYW4gRU5HSU5FIHBvaW50ZXIgYW55IG1vcmUuIEFsc28sIHRoZSBFTkdJTkUKICAgICBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIEJOX01PRF9FWFBbX0NSVF0gaGFuZGxlcnMgaGF2ZSBiZWVuIHJlbW92ZWQgLQogICAgIHRoZXkgd2VyZSBub3QgYmVpbmcgdXNlZCBieSB0aGUgZnJhbWV3b3JrIGFzIHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYQogICAgIEJJR05VTV9NRVRIT0QgYW5kIHRoZXkgY291bGQgbm90IGJlIGdlbmVyYWxpc2VkIHRvIHRoZSBuZXcKICAgICAnRU5HSU5FX1RBQkxFJyBtZWNoYW5pc20gdGhhdCB1bmRlcmxpZXMgdGhlIG5ldyBjb2RlLiBTaW1pbGFybHksCiAgICAgRU5HSU5FX2NweSgpIGhhcyBiZWVuIHJlbW92ZWQgYXMgaXQgY2Fubm90IGJlIGNvbnNpc3RlbnRseSBkZWZpbmVkIGluCiAgICAgdGhlIG5ldyBjb2RlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjaygpIHRvIGFsbG93IGZyYWN0aW9uYWwgc2Vjb25kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbWtkZWYucGwgdG8gc29ydCBzeW1ib2xzIHRoYXQgZ2V0IHRoZSBzYW1lIGVudHJ5IG51bWJlciwKICAgICBhbmQgbWFrZSBzdXJlIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgRVJSX2xvYWRfKgogICAgIGJlY29tZSBwYXJ0IG9mIGxpYmVheS5udW0gYXMgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoKS4gIFRoaXMgcmV0dXJucyB0cnVlIG9uY2UKICAgICByZW5lZ290aWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCAoZWl0aGVyIFNTTF9yZW5lZ290aWF0ZSgpIGNhbGwKICAgICBvciBIZWxsb1JlcXVlc3QvQ2xpZW50SGVsbG8gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlcikgYW5kIGJlY29tZXMKICAgICBmYWxzZSBvbmNlIGEgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAoRm9yIHNlcnZlcnMsIFNTTF9yZW5lZ290aWF0ZSgpIGZvbGxvd2VkIGJ5IFNTTF9kb19oYW5kc2hha2UoKQogICAgIHNlbmRzIGEgSGVsbG9SZXF1ZXN0LCBidXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgYSBoYW5kc2hha2UgdGFrZXMKICAgICBwbGFjZS4gIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkgaXMgdXNlZnVsIGZvciBjaGVja2luZyBpZiB0aGUKICAgICBjbGllbnQgaGFzIGZvbGxvd2VkIHRoZSByZXF1ZXN0LikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgU1NMIG9wdGlvbiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04uCiAgICAgQnkgZGVmYXVsdCwgY2xpZW50cyBtYXkgcmVxdWVzdCBzZXNzaW9uIHJlc3VtcHRpb24gZXZlbiBkdXJpbmcKICAgICByZW5lZ290aWF0aW9uIChpZiBzZXNzaW9uIElEIGNvbnRleHRzIHBlcm1pdCk7IHdpdGggdGhpcyBvcHRpb24sCiAgICAgc2Vzc2lvbiByZXN1bXB0aW9uIGlzIHBvc3NpYmxlIG9ubHkgaW4gdGhlIGZpcnN0IGhhbmRzaGFrZS4KCiAgICAgU1NMX09QX0FMTCBpcyBub3cgMHgwMDAwMEZGRkwgaW5zdGVhZCBvZiAweDAwMEZGRkZGTC4gIFRoaXMgbWFrZXMKICAgICBtb3JlIGJpdHMgYXZhaWxhYmxlIGZvciBvcHRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mCiAgICAgU1NMX09QX0FMTCAoc3VjaCBhcyBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzb21lIGRlbW9zIGZvciBjZXJ0aWZpY2F0ZSBhbmQgY2VydGlmaWNhdGUgcmVxdWVzdCBjcmVhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1heGltdW0gY2VydGlmaWNhdGUgY2hhaW4gc2l6ZSBhY2NlcHRlZCBmcm9tIHRoZSBwZWVyIGFwcGxpY2F0aW9uCiAgICAgc2V0dGFibGUgKFNTTCpfZ2V0L3NldF9tYXhfY2VydF9saXN0KCkpLCBhcyBwcm9wb3NlZCBieQogICAgICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBmb3IgVW5peHdhcmUtNwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYSAiZGVzdHJveSIgaGFuZGxlciB0byBFTkdJTkVzIHRoYXQgYWxsb3dzIHN0cnVjdHVyYWwgY2xlYW51cCB0bwogICAgIGJlIGRvbmUgcHJpb3IgdG8gZGVzdHJ1Y3Rpb24uIFVzZSB0aGlzIHRvIHVubG9hZCBlcnJvciBzdHJpbmdzIGZyb20KICAgICBFTkdJTkVzIHRoYXQgbG9hZCB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gTkI6IFRoaXMgYWRkcyB0d28gbmV3IEFQSQogICAgIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIgdGhpcyBkZXN0cm95IGhhbmRsZXIgaW4gYW4gRU5HSU5FLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFsdGVyIGFsbCBleGlzdGluZyBFTkdJTkUgaW1wbGVtZW50YXRpb25zIChleGNlcHQgIm9wZW5zc2wiIGFuZAogICAgICJvcGVuYnNkIikgdG8gZHluYW1pY2FsbHkgaW5zdGFudGlhdGUgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIFRoaXMKICAgICBtYWtlcyB0aGVtIG1vcmUgZmxleGlibGUgdG8gYmUgYnVpbHQgYm90aCBhcyBzdGF0aWNhbGx5LWxpbmtlZCBFTkdJTkVzCiAgICAgYW5kIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMgbG9hZGFibGUgdmlhIHRoZSAiZHluYW1pYyIgRU5HSU5FLgogICAgIEFsc28sIGFkZCBzdHViIGNvZGUgdG8gZWFjaCB0aGF0IG1ha2VzIGJ1aWxkaW5nIHRoZW0gYXMgc2VsZi1jb250YWluZWQKICAgICBzaGFyZWQtbGlicmFyaWVzIGVhc2llciAoc2VlIFJFQURNRS5FTkdJTkUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhICJkeW5hbWljIiBFTkdJTkUgdGhhdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgYmluZGluZyBFTkdJTkUKICAgICBpbXBsZW1lbnRhdGlvbnMgaW50byBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZCBpbgogICAgIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMuIFRoZSAiZHluYW1pYyIgRU5HSU5FIGV4cG9zZXMgY29udHJvbAogICAgIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoYXQgc2hhcmVkLWxpYnJhcnkgdG8gbG9hZCBhbmQKICAgICB0byBjb250cm9sIGFzcGVjdHMgb2YgdGhlIHdheSBpdCBpcyBoYW5kbGVkLiBBbHNvLCBtYWRlIGFuIHVwZGF0ZSB0bwogICAgIHRoZSBSRUFETUUuRU5HSU5FIGZpbGUgdGhhdCBicmluZ3MgaXRzIGluZm9ybWF0aW9uIHVwLXRvLWRhdGUgYW5kCiAgICAgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhbmQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSAiZHluYW1pYyIgRU5HSU5FCiAgICAgKGllLiBob3cgdG8gdXNlIGl0LCBob3cgdG8gYnVpbGQgImR5bmFtaWMiLWxvYWRhYmxlIEVOR0lORXMsIGV0YykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byB1bmxvYWQgcmFuZ2VzIG9mIEVSUiBzdHJpbmdzIHdpdGggYSBuZXcKICAgICAiRVJSX3VubG9hZF9zdHJpbmdzIiBmdW5jdGlvbi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb3B5KCkgZnVuY3Rpb24gdG8gRVZQX01ELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIEVWUF9NRCByb3V0aW5lcyB0YWtlIGEgY29udGV4dCBwb2ludGVyIGluc3RlYWQgb2YganVzdCB0aGUKICAgICBtZF9kYXRhIHZvaWQgcG9pbnRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGZsYWdzIHRvIEVWUF9NRCBhbmQgRVZQX01EX0NUWC4gRVZQX01EX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMKICAgICB0aGF0IHRoZSBkaWdlc3QgY2FuIG9ubHkgcHJvY2VzcyBhIHNpbmdsZSBjaHVuayBvZiBkYXRhCiAgICAgKHR5cGljYWxseSBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5IGEgcGllY2Ugb2YKICAgICBoYXJkd2FyZSkuIEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UIGluZGljYXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbgogICAgIGlzIG9ubHkgZ29pbmcgdG8gcHJvdmlkZSBhIHNpbmdsZSBjaHVuayBvZiBkYXRhLCBhbmQgaGVuY2UgdGhlCiAgICAgZnJhbWV3b3JrIG5lZWRuJ3QgYWNjdW11bGF0ZSB0aGUgZGF0YSBmb3Igb25lc2hvdCBkcml2ZXJzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBcyB3aXRoICJFUlIiLCBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgImV4X2RhdGEiCiAgICAgZnVuY3Rpb25zLiBUaGlzIGNoYW5nZSBhbHNvIGFsdGVycyB0aGUgc3RvcmFnZSBhbmQgbWFuYWdlbWVudCBvZiBnbG9iYWwKICAgICBleF9kYXRhIHN0YXRlIC0gaXQncyBub3cgYWxsIGluc2lkZSBleF9kYXRhLmMgYW5kIGFsbCAiY2xhc3MiIGNvZGUgKGVnLgogICAgIFJTQSwgQklPLCBTU0xfQ1RYLCBldGMpIG5vIGxvbmdlciBzdG9yZXMgaXRzIG93biBTVEFDS1MgYW5kIHBlci1jbGFzcwogICAgIGluZGV4IGNvdW50ZXJzLiBUaGUgQVBJIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGlzIHN0YXRlIGhhdmUgYmVlbiBjaGFuZ2VkCiAgICAgdG8gdGFrZSBhICJjbGFzc19pbmRleCIgcmF0aGVyIHRoYW4gcG9pbnRlcnMgdG8gdGhlIGNsYXNzJ3MgbG9jYWwgU1RBQ0sKICAgICBhbmQgY291bnRlciwgYW5kIHRoZXJlIGlzIG5vdyBhbiBBUEkgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgY3JlYXRlIG5ldwogICAgIGNsYXNzZXMuIFRoaXMgY2VudHJhbGlzYXRpb24gYWxsb3dzIHVzIHRvIChhKSBwbHVnIGEgbG90IG9mIHRoZQogICAgIHRocmVhZC1zYWZldHkgcHJvYmxlbXMgdGhhdCBleGlzdGVkLCBhbmQgKGIpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNsZWFuCiAgICAgdXAgYWxsIGFsbG9jYXRlZCBzdGF0ZSB1c2luZyAiQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSIuIFcuci50LiAoYikKICAgICBzdWNoIGRhdGEgd291bGQgcHJldmlvdXNseSBoYXZlIGFsd2F5cyBsZWFrZWQgaW4gYXBwbGljYXRpb24gY29kZSBhbmQKICAgICB3b3JrYXJvdW5kcyB3ZXJlIGluIHBsYWNlIHRvIG1ha2UgdGhlIG1lbW9yeSBkZWJ1Z2dpbmcgdHVybiBhIGJsaW5kIGV5ZQogICAgIHRvIGl0LiBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBzdGlsbAogICAgIGxlYWsgYXMgYmVmb3JlLCBidXQgdGhlaXIgbWVtb3J5IGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBhbm5vdW5jZSBpdCBub3cKICAgICByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IHNsaWRlLgoKICAgICBCZXNpZGVzIHRoZSBhZGRpdGlvbiBvZiBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpLCBhbm90aGVyIEFQSSBjaGFuZ2UKICAgICBpbmR1Y2VkIGJ5IHRoZSAiZXhfZGF0YSIgb3ZlcmhhdWwgaXMgdGhhdCBYNTA5X1NUT1JFX0NUWF9pbml0KCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgIkVSUiIgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGUKICAgICBnbG9iYWwgc3RhdGUgKDIgTEhBU0ggdGFibGVzIGFuZCAyIGxvY2tzKSBpcyBvbmx5IHVzZWQgYnkgdGhlICJkZWZhdWx0IgogICAgIGltcGxlbWVudGF0aW9uLiBUaGlzIGNoYW5nZSBhbHNvIGFkZHMgdHdvIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIKICAgICB0aGUgaW1wbGVtZW50YXRpb24gcHJpb3IgdG8gaXQgYmVpbmcgYXV0b21hdGljYWxseSBzZXQgdGhlIGZpcnN0IHRpbWUKICAgICBhbnkgb3RoZXIgRVJSIGZ1bmN0aW9uIHRha2VzIHBsYWNlLiBJZS4gYW4gYXBwbGljYXRpb24gY2FuIGNhbGwgImdldCIsCiAgICAgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbW9kdWxlIGl0IGhhcyBqdXN0IGxvYWRlZCwgYW5kIHRoYXQgbW9kdWxlCiAgICAgY2FuIGNhbGwgaXRzIG93biAic2V0IiBmdW5jdGlvbiB1c2luZyB0aGF0IHZhbHVlLiBUaGlzIG1lYW5zIHRoZQogICAgIG1vZHVsZSdzICJFUlIiIG9wZXJhdGlvbnMgd2lsbCB1c2UgKGFuZCBtb2RpZnkpIHRoZSBlcnJvciBzdGF0ZSBpbiB0aGUKICAgICBhcHBsaWNhdGlvbiBhbmQgbm90IGluIGl0cyBvd24gc3RhdGljYWxseSBsaW5rZWQgY29weSBvZiBPcGVuU1NMIGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgR2l2ZSBESCwgRFNBLCBhbmQgUlNBIHR5cGVzIHRoZWlyIG93biAiKipfdXBfcmVmKCkiIGZ1bmN0aW9uIHRvIGluY3JlbWVudAogICAgIHJlZmVyZW5jZSBjb3VudHMuIFRoaXMgcGVyZm9ybXMgbm9ybWFsIFJFRl9QUklOVC9SRUZfQ0hFQ0sgbWFjcm9zIG9uCiAgICAgdGhlIG9wZXJhdGlvbiwgYW5kIHByb3ZpZGVzIGEgbW9yZSBlbmNhcHN1bGF0ZWQgd2F5IGZvciBleHRlcm5hbCBjb2RlCiAgICAgKGNyeXB0by9ldnAvIGFuZCBzc2wvKSB0byBkbyB0aGlzLiBBbHNvIGNoYW5nZWQgdGhlIGV2cCBhbmQgc3NsIGNvZGUKICAgICB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIHJhdGhlciB0aGFuIG1hbnVhbGx5IGluY3JlbWVudGluZyB0aGUgY291bnRzLgoKICAgICBBbHNvIHJlbmFtZSAiRFNPX3VwKCkiIGZ1bmN0aW9uIHRvIG1vcmUgZGVzY3JpcHRpdmUgIkRTT191cF9yZWYoKSIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIEVWUCB0ZXN0IHByb2dyYW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzeW1tZXRyaWMgY2lwaGVyIHN1cHBvcnQgdG8gRU5HSU5FLiBFeHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBDUkwgZnVuY3Rpb25zOiBYNTA5X0NSTF9zZXRfdmVyc2lvbigpLCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoKQogICAgIFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKCksIFg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKCksIFg1MDlfQ1JMX3NvcnQoKSwKICAgICBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcigpLCBhbmQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZSgpLgogICAgIFRoZXNlIGFsbG93IGEgQ1JMIHRvIGJlIGJ1aWx0IHdpdGhvdXQgaGF2aW5nIHRvIGFjY2VzcyBYNTA5X0NSTCBmaWVsZHMKICAgICBkaXJlY3RseS4gTW9kaWZ5ICdjYScgYXBwbGljYXRpb24gdG8gdXNlIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRyBvdXQgb2YgdGhlIFNTTF9PUF9BTEwgbGlzdCBvZiByZWNvbW1lbmRlZAogICAgIGJ1ZyB3b3JrYXJvdW5kcy4gUm9sbGJhY2sgYXR0YWNrIGRldGVjdGlvbiBpcyBhIHNlY3VyaXR5IGZlYXR1cmUuCiAgICAgVGhlIHByb2JsZW0gd2lsbCBvbmx5IGFyaXNlIG9uIE9wZW5TU0wgc2VydmVycyB3aGVuIFRMU3YxIGlzIG5vdAogICAgIGF2YWlsYWJsZSAoc3NsdjNfc2VydmVyX21ldGhvZCgpIG9yIFNTTF9PUF9OT19UTFN2MSkuCiAgICAgU29mdHdhcmUgYXV0aG9ycyBub3Qgd2FudGluZyB0byBzdXBwb3J0IFRMU3YxIHdpbGwgaGF2ZSBzcGVjaWFsIHJlYXNvbnMKICAgICBmb3IgdGhlaXIgY2hvaWNlIGFuZCBjYW4gZXhwbGljaXRseSBlbmFibGUgdGhpcyBvcHRpb24uCiAgICAgW0JvZG8gTW9lbGxlciwgTHV0eiBKYWVuaWNrZV0KCiAgKikgUmF0aW9uYWxpc2UgRVZQIHNvIGl0IGNhbiBiZSBleHRlbmRlZDogZG9uJ3QgaW5jbHVkZSBhIHVuaW9uIG9mCiAgICAgY2lwaGVyL2RpZ2VzdCBzdHJ1Y3R1cmVzLCBhZGQgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyBmb3IgRVZQX01EX0NUWAogICAgIChzaW1pbGFyIHRvIHRob3NlIGV4aXN0aW5nIGZvciBFVlBfQ0lQSEVSX0NUWCkuCiAgICAgVXNhZ2UgZXhhbXBsZToKCiAgICAgICAgIEVWUF9NRF9DVFggbWQ7CgogICAgICAgICBFVlBfTURfQ1RYX2luaXQoJm1kKTsgICAgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KICAgICAgICAgRVZQX0RpZ2VzdEluaXQoJm1kLCBFVlBfc2hhMSgpKTsKICAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGluLCBsZW4pOwogICAgICAgICBFVlBfRGlnZXN0RmluYWwoJm1kLCBvdXQsIE5VTEwpOwogICAgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kKTsgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREVTIGtleSBzY2hlZHVsZSBjb25mb3JtIHRvIHRoZSB1c3VhbCBzY2hlbWUsIGFzIHdlbGwgYXMKICAgICBjb3JyZWN0aW5nIGl0cyBzdHJ1Y3R1cmUuIFRoaXMgbWVhbnMgdGhhdCBjYWxscyB0byBERVMgZnVuY3Rpb25zCiAgICAgbm93IGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBkZXNfa2V5X3NjaGVkdWxlIGluc3RlYWQgb2YgYQogICAgIHBsYWluIGRlc19rZXlfc2NoZWR1bGUgKHdoaWNoIHdhcyBhY3R1YWxseSBhbHdheXMgYSBwb2ludGVyCiAgICAgYW55d2F5KTogRS5nLiwKCiAgICAgICAgIGRlc19rZXlfc2NoZWR1bGUga3M7CgoJIGRlc19zZXRfa2V5X2NoZWNrZWQoLi4uLCAma3MpOwoJIGRlc19uY2JjX2VuY3J5cHQoLi4uLCAma3MsIC4uLik7CgogICAgIChOb3RlIHRoYXQgYSBsYXRlciBjaGFuZ2UgcmVuYW1lcyAnZGVzXy4uLicgaW50byAnREVTXy4uLicuKQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQ6IHRoZSB1c2Ugb2Ygc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMKICAgICBQRU0gY2F1c2VzIGxhcmdlIGFtb3VudHMgb2YgdW51c2VkIGZ1bmN0aW9ucyB0byBiZSBsaW5rZWQgaW4gZHVlIHRvCiAgICAgcG9vciBvcmdhbmlzYXRpb24uIEZvciBleGFtcGxlIHBlbV9hbGwuYyBjb250YWlucyBldmVyeSBQRU0gZnVuY3Rpb24KICAgICB3aGljaCBoYXMgYSBrbm9jayBvbiBlZmZlY3Qgb2YgbGlua2luZyBpbiBsYXJnZSBhbW91bnRzIG9mICh1bnVzZWQpCiAgICAgQVNOMSBjb2RlLiBHcm91cGluZyB0b2dldGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBhbmQgc3BsaXR0aW5nIHVucmVsYXRlZAogICAgIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFudXAgb2YgRVZQIG1hY3Jvcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIGhpc3RvcmljYWwgcmVmZXJlbmNlcyB0byB7TklELFNOLExOfV9kZXNfZWRlIGFuZCBlZGUzIHRvIGFkZCB0aGUKICAgICBjb3JyZWN0IF9lY2Igc3VmZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgaW5pdGlhbCBPQ1NQIHJlc3BvbmRlciBzdXBwb3J0IHRvIG9jc3AgYXBwbGljYXRpb24uIFRoZQogICAgIHJldm9jYXRpb24gaW5mb3JtYXRpb24gaXMgaGFuZGxlZCB1c2luZyB0aGUgdGV4dCBiYXNlZCBpbmRleAogICAgIHVzZSBieSB0aGUgY2EgYXBwbGljYXRpb24uIFRoZSByZXNwb25kZXIgY2FuIGVpdGhlciBoYW5kbGUKICAgICByZXF1ZXN0cyBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgc3VwcGxpZWQgaW4gZmlsZXMgKGZvciBleGFtcGxlCiAgICAgdmlhIGEgQ0dJIHNjcmlwdCkgb3IgdXNpbmcgYW4gaW50ZXJuYWwgbWluaW1hbCBzZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyB0byBnZXQgemxpYiBjb21wcmVzc2lvbiBmb3IgVExTLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZXMgdG8gS2VyYmVyb3MgU1NMIGZvciBSRkMgMjcxMiBjb21wbGlhbmNlOgogICAgIDEuICBJbXBsZW1lbnRlZCByZWFsIEtlcmJlcm9zV3JhcHBlciwgaW5zdGVhZCBvZiBqdXN0IHVzaW5nCiAgICAgICAgIEtSQjUgQVBfUkVRIG1lc3NhZ2UuICBbVGhhbmtzIHRvIFNpbW9uIFdpbGtpbnNvbiA8c3h3QHN4dy5vcmcudWs+XQogICAgIDIuICBJbXBsZW1lbnRlZCBvcHRpb25hbCBhdXRoZW50aWNhdG9yIGZpZWxkIG9mIEtlcmJlcm9zV3JhcHBlci4KCiAgICAgQWRkZWQgb3BlbnNzbC1zdHlsZSBBU04uMSBtYWNyb3MgZm9yIEtlcmJlcm9zIHRpY2tldCwgYXBfcmVxLAogICAgIGFuZCBhdXRoZW50aWNhdG9yIHN0cnVjdHM7IHNlZSBjcnlwdG8va3JiNS8uCgogICAgIEdlbmVyYWxpemVkIEtlcmJlcm9zIGNhbGxzIHRvIHN1cHBvcnQgbXVsdGlwbGUgS2VyYmVyb3MgbGlicmFyaWVzLgogICAgIFtWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+CiAgICAgIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENhdXNlICdvcGVuc3NsIHNwZWVkJyB0byB1c2UgZnVsbHkgaGFyZC1jb2RlZCBEU0Ega2V5cyBhcyBpdAogICAgIGFscmVhZHkgZG9lcyB3aXRoIFJTQS4gdGVzdGRzYS5oIG5vdyBoYXMgJ3ByaXZfa2V5L3B1Yl9rZXknCiAgICAgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBrZXkgc2l6ZXMgcmF0aGVyIHRoYW4gaGF2aW5nIGp1c3QKICAgICBwYXJhbWV0ZXJzIChhbmQgJ3NwZWVkJyBnZW5lcmF0aW5nIGtleXMgZWFjaCB0aW1lKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTcGVlZCB1cCBFVlAgcm91dGluZXMuCiAgICAgQmVmb3JlOgplbmNyeXB0CnR5cGUgICAgICAgICAgICAgIDggYnl0ZXMgICAgIDY0IGJ5dGVzICAgIDI1NiBieXRlcyAgIDEwMjQgYnl0ZXMgICA4MTkyIGJ5dGVzCmRlcy1jYmMgICAgICAgICAgIDQ0MDguODVrICAgICA1NTYwLjUxayAgICAgNTc3OC40NmsgICAgIDU4NjIuMjBrICAgICA1ODI1LjE2awpkZXMtY2JjICAgICAgICAgICA0Mzg5LjU1ayAgICAgNTU3MS4xN2sgICAgIDU3OTIuMjNrICAgICA1ODQ2LjkxayAgICAgNTgzMi4xMWsKZGVzLWNiYyAgICAgICAgICAgNDM5NC4zMmsgICAgIDU1NzUuOTJrICAgICA1ODA3LjQ0ayAgICAgNTg0OC4zN2sgICAgIDU4NDEuMzBrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzQ4Mi42NmsgICAgIDUwNjkuNDlrICAgICA1NDk2LjM5ayAgICAgNTYxNC4xNmsgICAgIDU2MzkuMjhrCmRlcy1jYmMgICAgICAgICAgIDM0ODAuNzRrICAgICA1MDY4Ljc2ayAgICAgNTUxMC4zNGsgICAgIDU2MDkuODdrICAgICA1NjM1LjUyawpkZXMtY2JjICAgICAgICAgICAzNDgzLjcyayAgICAgNTA2Ny42MmsgICAgIDU1MDQuNjBrICAgICA1NzA4LjAxayAgICAgNTcyNC44MGsKICAgICBBZnRlcjoKZW5jcnlwdApkZXMtY2JjICAgICAgICAgICA0NjYwLjE2ayAgICAgNTY1MC4xOWsgICAgIDU4MDcuMTlrICAgICA1ODI3LjEzayAgICAgNTc4My4zMmsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNjI0Ljk2ayAgICAgNTI1OC4yMWsgICAgIDU1MzAuOTFrICAgICA1NjI0LjMwayAgICAgNTYyOC4yNmsKICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkZWQgdGhlIE9TMi1FTVggdGFyZ2V0LgogICAgIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1PiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIGFwcHMgdG8gdXNlIE5DT05GIHJvdXRpbmVzIGluc3RlYWQgb2YgdGhlIG9sZCBDT05GLiBOZXcgZnVuY3Rpb25zCiAgICAgdG8gc3VwcG9ydCBOQ09ORiByb3V0aW5lcyBpbiBleHRlbnNpb24gY29kZS4gTmV3IGZ1bmN0aW9uIENPTkZfc2V0X25jb25mKCkKICAgICB0byBhbGxvdyBmdW5jdGlvbnMgd2hpY2ggdGFrZSBhbiBOQ09ORiB0byBhbHNvIGhhbmRsZSB0aGUgb2xkIExIQVNICiAgICAgc3RydWN0dXJlOiB0aGlzIG1lYW5zIHRoYXQgdGhlIG9sZCBDT05GIGNvbXBhdGlibGUgcm91dGluZXMgY2FuIGJlCiAgICAgcmV0YWluZWQgKGluIHBhcnRpY3VsYXIgd3J0IGV4dGVuc2lvbnMpIHdpdGhvdXQgaGF2aW5nIHRvIGR1cGxpY2F0ZSB0aGUKICAgICBjb2RlLiBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZF9leHRfbmNvbmZfc2sgdG8gYWRkIGV4dGVuc2lvbnMgdG8gYSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyBmb3IgaW5uZXIgY29udHJvbAogICAgIGFuZCB3aXRoIHBvc3NpYmlsaXRpZXMgdG8gaGF2ZSB5ZXMvbm8ga2luZCBvZiBwcm9tcHRzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBhbGwgY2FsbHMgdG8gbG93IGxldmVsIGRpZ2VzdCByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSBhbmQKICAgICBhcHBsaWNhdGlvbnMgdG8gdXNlIEVWUC4gQWRkIG1pc3NpbmcgY2FsbHMgdG8gSE1BQ19jbGVhbnVwKCkgYW5kCiAgICAgZG9uJ3QgYXNzdW1lIEhNQUNfQ1RYIGNhbiBiZSBjb3BpZWQgdXNpbmcgbWVtY3B5KCkuCiAgICAgW1ZlcmRvbiBXYWxrZXIgPFZXYWxrZXJAbm92ZWxsLmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjb250cm9sIGVuZ2luZXMgdGhyb3VnaCBjb250cm9sIG5hbWVzIGJ1dCB3aXRoCiAgICAgYXJiaXRyYXJ5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIGp1c3QgYSBzdHJpbmcuCiAgICAgQ2hhbmdlIHRoZSBrZXkgbG9hZGVycyB0byB0YWtlIGEgVUlfTUVUSE9EIGluc3RlYWQgb2YgYSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHBvaW50ZXIuICBOT1RFOiB0aGlzIGJyZWFrcyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKICAgICB2ZXJzaW9ucyBvZiBPcGVuU1NMIFtlbmdpbmVdLgogICAgIEFkYXB0IHRoZSBuQ2lwaGVyIGNvZGUgZm9yIHRoZXNlIG5ldyBjb25kaXRpb25zIGFuZCBhZGQgYSBjYXJkIGluc2VydGlvbgogICAgIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIHRvIGJldHRlciBzdXBwb3J0CiAgICAgZGlhbG9nIGJveCBpbnRlcmZhY2VzLCBhcHBsaWNhdGlvbi1kZWZpbmVkIHByb21wdHMsIHRoZSBwb3NzaWJpbGl0eQogICAgIHRvIHVzZSBkZWZhdWx0cyAoZm9yIGV4YW1wbGUgZGVmYXVsdCBwYXNzd29yZHMgZnJvbSBzb21ld2hlcmUgZWxzZSkKICAgICBhbmQgaW50ZXJydXB0cy9jYW5jZWxsYXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRpZHkgdXAgUEtDUyMxMiBhdHRyaWJ1dGUgaGFuZGxpbmcuIEFkZCBzdXBwb3J0IGZvciB0aGUgQ1NQIG5hbWUKICAgICBhdHRyaWJ1dGUgaW4gUEtDUyMxMiBmaWxlcywgYWRkIG5ldyAtQ1NQIG9wdGlvbiB0byBwa2NzMTIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBtZW1vcnkgbGVhayBpbiAnc2tfZHVwKCknIGluIHRoZSBjYXNlIHJlYWxsb2NhdGlvbiBmYWlscy4gKEFsc28KICAgICB0aWR5IHVwIHNvbWUgdW5uZWNlc3NhcmlseSB3ZWlyZCBjb2RlIGluICdza19uZXcoKScpLgogICAgIFtHZW9mZiwgcmVwb3J0ZWQgYnkgRGllZ28gVGFydGFyYSA8ZHRhcnRhcmFAbm92YW1lbnMuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBrZXkgbG9hZGluZyByb3V0aW5lcyBmb3IgRU5HSU5FcyB0byB1c2UgdGhlIHNhbWUga2luZAogICAgIGNhbGxiYWNrIChwZW1fcGFzc3dvcmRfY2IpIGFzIGFsbCBvdGhlciByb3V0aW5lcyB0aGF0IG5lZWQgdGhpcwogICAgIGtpbmQgb2YgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5jcmVhc2UgRU5UUk9QWV9ORUVERUQgdG8gMzIgYnl0ZXMsIGFzIFJpam5kYWVsIGNhbiBvcGVyYXRlIHdpdGgKICAgICAyNTYgYml0ICg9MzIgYnl0ZSkga2V5cy4gT2YgY291cnNlIHNlZWRpbmcgd2l0aCBtb3JlIGVudHJvcHkgYnl0ZXMKICAgICB0aGFuIHRoaXMgbWluaW11bSB2YWx1ZSBpcyByZWNvbW1lbmRlZC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTmV3IHJhbmRvbSBzZWVkZXIgZm9yIE9wZW5WTVMsIHVzaW5nIHRoZSBzeXN0ZW0gcHJvY2VzcyBzdGF0aXN0aWNzCiAgICAgdGhhdCBhcmUgZWFzaWx5IHJlYWNoYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBXaW5kb3dzIGFwcGFyZW50bHkgY2FuJ3QgdHJhbnNwYXJlbnRseSBoYW5kbGUgZ2xvYmFsCiAgICAgdmFyaWFibGVzIGRlZmluZWQgaW4gRExMcy4gSW5pdGlhbGlzYXRpb25zIHN1Y2ggYXM6CgogICAgICAgIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSAmQVNOMV9JTlRFR0VSX2l0OwoKICAgICB3b250IGNvbXBpbGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8KICAgICBkZWNsYXJlIHRoZWlyIG93biBBU04xIG1vZHVsZXMuIFRoaXMgd2FzIGZpeGVkIGJ5IGFkZGluZyB0aGUgb3B0aW9uCiAgICAgRVhQT1JUX1ZBUl9BU19GTiB0byBhbGwgV2luMzIgcGxhdGZvcm1zLCBhbHRob3VnaCB0aGlzIGlzbid0IHN0cmljdGx5CiAgICAgbmVlZGVkIGZvciBzdGF0aWMgbGlicmFyaWVzIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgWDUwOV9QVVJQT1NFX3NldCgpIGFuZCBYNTA5X1RSVVNUX3NldCgpIHRvIGhhbmRsZQogICAgIHNldHRpbmcgb2YgcHVycG9zZSBhbmQgdHJ1c3QgZmllbGRzLiBOZXcgWDUwOV9TVE9SRSB0cnVzdCBhbmQKICAgICBwdXJwb3NlIGZ1bmN0aW9ucyBhbmQgdGlkeSB1cCBzZXR0aW5nIGluIG90aGVyIFNTTCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvcGllcyBvZiBYNTA5X1NUT1JFX0NUWCBmaWVsZHMgYW5kIGNhbGxiYWNrcyB0byBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGVzZSBhcmUgaW5oZXJpdGVkIGJ5IFg1MDlfU1RPUkVfQ1RYIHdoZW4gaXQgaXMgCiAgICAgaW5pdGlhbGlzZWQuIFRoaXMgYWxsb3dzIHZhcmlvdXMgZGVmYXVsdHMgdG8gYmUgc2V0IGluIHRoZQogICAgIFg1MDlfU1RPUkUgc3RydWN0dXJlIChzdWNoIGFzIGZsYWdzIGZvciBDUkwgY2hlY2tpbmcgYW5kIGN1c3RvbQogICAgIHB1cnBvc2Ugb3IgdHJ1c3Qgc2V0dGluZ3MpIGZvciBmdW5jdGlvbnMgd2hpY2ggb25seSB1c2UgWDUwOV9TVE9SRV9DVFgKICAgICBpbnRlcm5hbGx5IHN1Y2ggYXMgUy9NSU1FLgoKICAgICBNb2RpZnkgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KCkgc28gaXQgb25seSBzZXRzIHB1cnBvc2VzIGFuZAogICAgIHRydXN0IHNldHRpbmdzIGlmIHRoZXkgYXJlIG5vdCBzZXQgaW4gWDUwOV9TVE9SRS4gVGhpcyBhbGxvd3MgWDUwOV9TVE9SRQogICAgIHB1cnBvc2VzIGFuZCB0cnVzdCAoaW4gUy9NSU1FIGZvciBleGFtcGxlKSB0byBvdmVycmlkZSBhbnkgc2V0IGJ5IGRlZmF1bHQuCgogICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgQ1JMIGNoZWNraW5nIHRvIHNtaW1lLCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBDUkwgYmFzZWQgcmV2b2NhdGlvbiBjaGVja2luZy4gSWYgdGhlIENSTCBjaGVja2luZyBmbGFnKHMpCiAgICAgYXJlIHNldCB0aGVuIHRoZSBDUkwgaXMgbG9va2VkIHVwIGluIHRoZSBYNTA5X1NUT1JFIHN0cnVjdHVyZSBhbmQKICAgICBpdHMgdmFsaWRpdHkgYW5kIHNpZ25hdHVyZSBjaGVja2VkLCB0aGVuIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZAogICAgIGluIHRoZSBDUkwgdGhlIHZlcmlmeSBmYWlscyB3aXRoIGEgcmV2b2tlZCBlcnJvci4KCiAgICAgVmFyaW91cyBuZXcgQ1JMIHJlbGF0ZWQgY2FsbGJhY2tzIGFkZGVkIHRvIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KCiAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYWRkZWQgdG8gJ3ZlcmlmeScgYXBwbGljYXRpb24gdG8gc3VwcG9ydCB0aGlzLgoKICAgICBUaGlzIG5lZWRzIHNvbWUgYWRkaXRpb25hbCB3b3JrLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gaGFuZGxlIG11bHRpcGxlCiAgICAgQ1JMcyB3aXRoIGRpZmZlcmVudCB0aW1lcywgZXh0ZW5zaW9uIGJhc2VkIGxvb2t1cCAocmF0aGVyIHRoYW4ganVzdAogICAgIGJ5IHN1YmplY3QgbmFtZSkgYW5kIHVsdGltYXRlbHkgbW9yZSBjb21wbGV0ZSBWMiBDUkwgZXh0ZW5zaW9uCiAgICAgaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSBBUEkgKGNyeXB0by91aS8pLiAgVGhpcyBpcyBkZXNpZ25lZAogICAgIHRvIHJlcGxhY2UgdGhpbmdzIGxpa2UgZGVzX3JlYWRfcGFzc3dvcmQgYW5kIGZyaWVuZHMgKGJhY2t3YXJkCiAgICAgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgdXNpbmcgdGhpcyBuZXcgQVBJIGFyZSBwcm92aWRlZCkuCiAgICAgVGhlIHB1cnBvc2UgaXMgdG8gcmVtb3ZlIHByb21wdGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgREVTIGNvZGUKICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBmb3IgcHJvbXB0aW5nIHRocm91Z2ggZGlhbG9nIGJveGVzIGluCiAgICAgYSB3aW5kb3cgc3lzdGVtIGFuZCB0aGUgbGlrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgImV4X2RhdGEiIHN1cHBvcnQgdG8gRU5HSU5FIHNvIGltcGxlbWVudGF0aW9ucyBjYW4gYWRkIHN0YXRlIGF0IGEKICAgICBwZXItc3RydWN0dXJlIGxldmVsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzdG9yZSBpdCBnbG9iYWxseS4KICAgICBbR2VvZmZdCgogICopIE1ha2UgaXQgcG9zc2libGUgZm9yIEVOR0lORSBzdHJ1Y3R1cmVzIHRvIGJlIGNvcGllZCB3aGVuIHJldHJpZXZlZCBieQogICAgIEVOR0lORV9ieV9pZCgpIGlmIHRoZSBFTkdJTkUgc3BlY2lmaWVzIGEgbmV3IGZsYWc6IEVOR0lORV9GTEFHU19CWV9JRF9DT1BZLgogICAgIFRoaXMgY2F1c2VzIHRoZSAib3JpZ2luYWwiIEVOR0lORSBzdHJ1Y3R1cmUgdG8gYWN0IGxpa2UgYSB0ZW1wbGF0ZSwKICAgICBhbmFsb2dvdXMgdG8gdGhlIFJTQSB2cy4gUlNBX01FVEhPRCB0eXBlIG9mIHNlcGFyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcwogICAgIG9wZXJhdGlvbmFsIHN0YXRlIGNhbiBiZSBsb2NhbGlzZWQgdG8gZWFjaCBFTkdJTkUgc3RydWN0dXJlLCBkZXNwaXRlIHRoZQogICAgIGZhY3QgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgIm1ldGhvZHMiLiBOZXcgRU5HSU5FIHN0cnVjdHVyZXMgcmV0dXJuZWQgaW4KICAgICB0aGlzIGNhc2UgaGF2ZSBubyBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNpbmdsZQogICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlLiBUaGlzIG1hdGNoZXMgdGhlIHNpbmdsZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSByZXR1cm5lZAogICAgIGJ5IEVOR0lORV9ieV9pZCgpIG5vcm1hbGx5LCB3aGVuIGl0IGlzIGluY3JlbWVudGVkIG9uIHRoZSBwcmUtZXhpc3RpbmcKICAgICBFTkdJTkUgc3RydWN0dXJlLgogICAgIFtHZW9mZl0KCiAgKikgRml4IEFTTjEgZGVjb2RlciB3aGVuIGRlY29kaW5nIHR5cGUgQU5ZIGFuZCBWX0FTTjFfT1RIRVI6IHNpbmNlIHRoaXMKICAgICBuZWVkcyB0byBtYXRjaCBhbnkgb3RoZXIgdHlwZSBhdCBhbGwgd2UgbmVlZCB0byBtYW51YWxseSBjbGVhciB0aGUKICAgICB0YWcgY2FjaGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgIm9wZW5zc2wgZW5naW5lIiB1dGlsaXR5IHRvIGluY2x1ZGU7CiAgICAgLSB2ZXJib3NpdHkgbGV2ZWxzICgnLXYnLCAnLXZ2JywgYW5kICctdnZ2JykgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uCiAgICAgICBhYm91dCBhbiBFTkdJTkUncyBhdmFpbGFibGUgY29udHJvbCBjb21tYW5kcy4KICAgICAtIGV4ZWN1dGluZyBjb250cm9sIGNvbW1hbmRzIGZyb20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1c2luZyB0aGUKICAgICAgICctcHJlJyBhbmQgJy1wb3N0JyBzd2l0Y2hlcy4gJy1wb3N0JyBpcyBvbmx5IHVzZWQgaWYgJy10JyBpcwogICAgICAgc3BlY2lmaWVkIGFuZCB0aGUgRU5HSU5FIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZC4gVGhlIHN5bnRheCBmb3IKICAgICAgIHRoZSBpbmRpdmlkdWFsIGNvbW1hbmRzIGFyZSBjb2xvbi1zZXBhcmF0ZWQsIGZvciBleGFtcGxlOwoJIG9wZW5zc2wgZW5naW5lIGNoaWwgLXByZSBGT1JLX0NIRUNLOjAgLXByZSBTT19QQVRIOi9saWIvdGVzdC5zbwogICAgIFtHZW9mZl0KCiAgKikgTmV3IGR5bmFtaWMgY29udHJvbCBjb21tYW5kIHN1cHBvcnQgZm9yIEVOR0lORXMuIEVOR0lORXMgY2FuIG5vdwogICAgIGRlY2xhcmUgdGhlaXIgb3duIGNvbW1hbmRzIChudW1iZXJzKSwgbmFtZXMgKHN0cmluZ3MpLCBkZXNjcmlwdGlvbnMsCiAgICAgYW5kIGlucHV0IHR5cGVzIGZvciBydW4tdGltZSBkaXNjb3ZlcnkgYnkgY2FsbGluZyBhcHBsaWNhdGlvbnMuIEEKICAgICBzdWJzZXQgb2YgdGhlc2UgY29tbWFuZHMgYXJlIGltcGxpY2l0bHkgY2xhc3NlZCBhcyAiZXhlY3V0YWJsZSIKICAgICBkZXBlbmRpbmcgb24gdGhlaXIgaW5wdXQgdHlwZSwgYW5kIG9ubHkgdGhlc2UgY2FuIGJlIGludm9rZWQgdGhyb3VnaAogICAgIHRoZSBuZXcgc3RyaW5nLWJhc2VkIEFQSSBmdW5jdGlvbiBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCkuIChFZy4gdGhpcwogICAgIGNhbiBiZSBiYXNlZCBvbiB1c2VyIGlucHV0LCBjb25maWcgZmlsZXMsIGV0YykuIFRoZSBkaXN0aW5jdGlvbiBpcwogICAgIHRoYXQgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGNhbm5vdCByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiBhIGJvb2xlYW4KICAgICByZXN1bHQgYW5kIGNhbiBvbmx5IHN1cHBvcnQgbnVtZXJpYyBvciBzdHJpbmcgaW5wdXQsIHdoZXJlYXMgc29tZQogICAgIGRpc2NvdmVyYWJsZSBjb21tYW5kcyBtYXkgb25seSBiZSBmb3IgZGlyZWN0IHVzZSB0aHJvdWdoCiAgICAgRU5HSU5FX2N0cmwoKSwgZWcuIHN1cHBvcnRpbmcgdGhlIGV4Y2hhbmdlIG9mIGJpbmFyeSBkYXRhLCBmdW5jdGlvbgogICAgIHBvaW50ZXJzLCBvciBvdGhlciBjdXN0b20gdXNlcy4gVGhlICJleGVjdXRhYmxlIiBjb21tYW5kcyBhcmUgdG8KICAgICBzdXBwb3J0IHBhcmFtZXRlcmlzYXRpb25zIG9mIEVOR0lORSBiZWhhdmlvdXIgdGhhdCBjYW4gYmUKICAgICB1bmFtYmlndW91c2x5IGRlZmluZWQgYnkgRU5HSU5FcyBhbmQgdXNlZCBjb25zaXN0ZW50bHkgYWNyb3NzIGFueQogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb24uIENvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGwgdGhlCiAgICAgZXhpc3RpbmcgaGFyZHdhcmUtc3VwcG9ydGluZyBFTkdJTkVzLCBub3RpY2VhYmx5ICJTT19QQVRIIiB0byBhbGxvdwogICAgIGNvbnRyb2wgb3ZlciBzaGFyZWQtbGlicmFyeSBwYXRocyB3aXRob3V0IHNvdXJjZSBjb2RlIGFsdGVyYXRpb25zLgogICAgIFtHZW9mZl0KCiAgKikgQ2hhbmdlZCBhbGwgRU5HSU5FIGltcGxlbWVudGF0aW9ucyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGVpcgogICAgIEVOR0lORXMgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIHRoZW0gc3RhdGljYWxseS4gQXBhcnQgZnJvbSB0aGlzIGJlaW5nCiAgICAgbmVjZXNzYXJ5IHdpdGggdGhlIHJlbW92YWwgb2YgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkaXN0aW5jdGlvbiwKICAgICB0aGlzIGFsc28gYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbnMgdG8gY29tcGlsZSB3aXRob3V0IHVzaW5nIHRoZQogICAgIGludGVybmFsIGVuZ2luZV9pbnQuaCBoZWFkZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBNaW5vciBhZGp1c3RtZW50IHRvICJyYW5kIiBjb2RlLiBSQU5EX2dldF9yYW5kX21ldGhvZCgpIG5vdyByZXR1cm5zIGEKICAgICAnY29uc3QnIHZhbHVlLiBBbnkgY29kZSB0aGF0IHNob3VsZCBiZSBhYmxlIHRvIG1vZGlmeSBhIFJBTkRfTUVUSE9ECiAgICAgc2hvdWxkIGFscmVhZHkgaGF2ZSBub24tY29uc3QgcG9pbnRlcnMgdG8gaXQgKGllLiB0aGV5IHNob3VsZCBvbmx5CiAgICAgbW9kaWZ5IHRoZWlyIG93biBvbmVzKS4KICAgICBbR2VvZmZdCgogICopIE1hZGUgYSB2YXJpZXR5IG9mIGxpdHRsZSB0d2Vha3MgdG8gdGhlIEVOR0lORSBjb2RlLgogICAgIC0gImF0YWxsYSIgYW5kICJ1YnNlYyIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbSBoZWFkZXIgZmlsZXMKICAgICAgIHRvIEMgY29kZS4gIm51cm9uIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBwbGFjZWQgaW4gdmFyaWFibGVzCiAgICAgICByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIC0gYWxsb3dpbmcgcGFyYW1ldGVyaXNhdGlvbiBvZiB0aGVzZSB2YWx1ZXMKICAgICAgIGxhdGVyIG9uIHZpYSBjdHJsKCkgY29tbWFuZHMuCiAgICAgLSBSZW1vdmVkIHVudXNlZCAiI2lmIDAiJ2QgY29kZS4KICAgICAtIEZpeGVkIGVuZ2luZSBsaXN0IGl0ZXJhdGlvbiBjb2RlIHNvIGl0IHVzZXMgRU5HSU5FX2ZyZWUoKSB0byByZWxlYXNlCiAgICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZXMuCiAgICAgLSBDb25zdGlmaWVkIHRoZSBSQU5EX01FVEhPRCBlbGVtZW50IG9mIEVOR0lORSBzdHJ1Y3R1cmVzLgogICAgIC0gQ29uc3RpZmllZCB2YXJpb3VzIGdldC9zZXQgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlIGFuZCBhZGRlZAogICAgICAgbWlzc2luZyBmdW5jdGlvbnMgKGluY2x1ZGluZyBhIGNhdGNoLWFsbCBFTkdJTkVfY3B5IHRoYXQgZHVwbGljYXRlcwogICAgICAgYWxsIEVOR0lORSB2YWx1ZXMgb250byBhIG5ldyBFTkdJTkUgZXhjZXB0IHJlZmVyZW5jZSBjb3VudHMvc3RhdGUpLgogICAgIC0gUmVtb3ZlZCBOVUxMIHBhcmFtZXRlciBjaGVja3MgaW4gZ2V0L3NldCBmdW5jdGlvbnMuIFNldHRpbmcgYSBtZXRob2QKICAgICAgIG9yIGZ1bmN0aW9uIHRvIE5VTEwgaXMgYSB3YXkgb2YgY2FuY2VsbGluZyBvdXQgYSBwcmV2aW91c2x5IHNldAogICAgICAgdmFsdWUuICBQYXNzaW5nIGEgTlVMTCBFTkdJTkUgcGFyYW1ldGVyIGlzIGp1c3QgcGxhaW4gc3R1cGlkIGFueXdheQogICAgICAgYW5kIGRvZXNuJ3QganVzdGlmeSB0aGUgZXh0cmEgZXJyb3Igc3ltYm9scyBhbmQgY29kZS4KICAgICAtIERlcHJlY2F0ZSB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRlZmluZSBhbmQgbW92ZSB0aGUgYXJlYSBmb3IKICAgICAgIGZsYWdzIGZyb20gZW5naW5lX2ludC5oIHRvIGVuZ2luZS5oLgogICAgIC0gQ2hhbmdlZCBwcm90b3R5cGVzIGZvciBFTkdJTkUgaGFuZGxlciBmdW5jdGlvbnMgKGluaXQoKSwgZmluaXNoKCksCiAgICAgICBjdHJsKCksIGtleS1sb2FkIGZ1bmN0aW9ucywgZXRjKSB0byB0YWtlIGFuIChFTkdJTkUqKSBwYXJhbWV0ZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBJbXBsZW1lbnQgYmluYXJ5IGludmVyc2lvbiBhbGdvcml0aG0gZm9yIEJOX21vZF9pbnZlcnNlIGluIGFkZGl0aW9uCiAgICAgdG8gdGhlIGFsZ29yaXRobSB1c2luZyBsb25nIGRpdmlzaW9uLiAgVGhlIGJpbmFyeSBhbGdvcml0aG0gY2FuIGJlCiAgICAgdXNlZCBvbmx5IGlmIHRoZSBtb2R1bHVzIGlzIG9kZC4gIE9uIDMyLWJpdCBzeXN0ZW1zLCBpdCBpcyBmYXN0ZXIKICAgICBvbmx5IGZvciByZWxhdGl2ZWx5IHNtYWxsIG1vZHVsaSAocm91Z2hseSAyMC0zMCUgZm9yIDEyOC1iaXQgbW9kdWxpLAogICAgIHJvdWdobHkgNS0xNSUgZm9yIDI1Ni1iaXQgbW9kdWxpKSwgc28gd2UgdXNlIGl0IG9ubHkgZm9yIG1vZHVsaQogICAgIHVwIHRvIDQ1MCBiaXRzLiAgSW4gNjQtYml0IGVudmlyb25tZW50cywgdGhlIGJpbmFyeSBhbGdvcml0aG0KICAgICBhcHBlYXJzIHRvIGJlIGFkdmFudGFnZW91cyBmb3IgbXVjaCBsb25nZXIgbW9kdWxpOyBoZXJlIHdlIHVzZSBpdAogICAgIGZvciBtb2R1bGkgdXAgdG8gMjA0OCBiaXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgQ0hPSUNFIGZpZWxkIHNldHRpbmcgaW4gQVNOMV9pdGVtX2V4X2QyaSgpLiBUaGUgb2xkIGNvZGUKICAgICBjb3VsZCBub3Qgc3VwcG9ydCB0aGUgY29tYmluZSBmbGFnIGluIGNob2ljZSBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJ2NvcHlfZXh0ZW5zaW9ucycgb3B0aW9uIHRvIHRoZSAnY2EnIHV0aWxpdHkuIFRoaXMgY29waWVzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdCB0byB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgJ2NlcnRvcHQnIGFuZCAnbmFtZW9wdCcgb3B0aW9ucyB0byBiZSBzZXBhcmF0ZWQKICAgICBieSBjb21tYXMuIEFkZCAnbmFtb3B0JyBhbmQgJ2NlcnRvcHQnIG9wdGlvbnMgdG8gdGhlICdjYScgY29uZmlnCiAgICAgZmlsZTogdGhpcyBhbGxvd3MgdGhlIGRpc3BsYXkgb2YgdGhlIGNlcnRpZmljYXRlIGFib3V0IHRvIGJlCiAgICAgc2lnbmVkIHRvIGJlIGN1c3RvbWlzZWQsIHRvIGFsbG93IGNlcnRhaW4gZmllbGRzIHRvIGJlIGluY2x1ZGVkCiAgICAgb3IgZXhjbHVkZWQgYW5kIGV4dGVuc2lvbiBkZXRhaWxzLiBUaGUgb2xkIHN5c3RlbSBkaWRuJ3QgZGlzcGxheQogICAgIG11bHRpY2hhcmFjdGVyIHN0cmluZ3MgcHJvcGVybHksIG9taXR0ZWQgZmllbGRzIG5vdCBpbiB0aGUgcG9saWN5CiAgICAgYW5kIGNvdWxkbid0IGRpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIHN1Y2ggYXMgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBFQ19QT0lOVHNfbXVsIGZvciBtdWx0aXBsZSBzY2FsYXIgbXVsdGlwbGljYXRpb24KICAgICBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsbGlwdGljIGN1cnZlIHBvaW50cwogICAgICAgICAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXSwKICAgICBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgZ2VuZXJhdG9yIGRlZmluZWQgZm9yIHRoZSBFQ19HUk9VUDoKICAgICAgICAgIHNjYWxhcipnZW5lcmF0b3IgKyAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXS4KCiAgICAgRUNfUE9JTlRfbXVsIGlzIGEgc2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSB0eXBpY2FsIGNhc2UKICAgICB0aGF0IHRoZSBwb2ludCBsaXN0IGhhcyBqdXN0IG9uZSBpdGVtIChiZXNpZGVzIHRoZSBvcHRpb25hbAogICAgIGdlbmVyYXRvcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRmlyc3QgRUNfTUVUSE9EcyBmb3IgY3VydmVzIG92ZXIgR0YocCk6CgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kKCkgdXNlcyB0aGUgYmFzaWMgQk5fbW9kX211bCBhbmQgQk5fbW9kX3NxcgogICAgIG9wZXJhdGlvbnMgYW5kIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kIGZ1bmN0aW9ucyB0aGF0IGNhbiBhbHNvCiAgICAgb3BlcmF0ZSB3aXRoIGZhc3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgbW9kdWxhciBhcml0aG1ldGljLiAgICAgCgogICAgIEVDX0dGcF9tb250X21ldGhvZCgpIHJldXNlcyBtb3N0IGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QsIGJ1dCB1c2VzIE1vbnRnb21lcnkgYXJpdGhtZXRpYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnQgYWRkaXRpb24gYW5kIHBvaW50IGRvdWJsaW5nCiAgICAgaW1wbGVtZW50YXRpb24gZGlyZWN0bHkgZGVyaXZlZCBmcm9tIHNvdXJjZSBjb2RlIHByb3ZpZGVkIGJ5CiAgICAgTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT5dCgogICopIEZyYW1ld29yayBmb3IgZWxsaXB0aWMgY3VydmVzIChjcnlwdG8vZWMvZWMuaCwgY3J5cHRvL2VjL2VjX2xjbC5oLAogICAgIGNyeXB0by9lYy9lY19saWIuYyk6CgogICAgIEN1cnZlcyBhcmUgRUNfR1JPVVAgb2JqZWN0cyAod2l0aCBhbiBvcHRpb25hbCBncm91cCBnZW5lcmF0b3IpCiAgICAgYmFzZWQgb24gRUNfTUVUSE9EcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgoKICAgICBQb2ludHMgYXJlIEVDX1BPSU5UIG9iamVjdHMgYmFzZWQgb24gRUNfR1JPVVAgb2JqZWN0cy4KCiAgICAgTW9zdCBvZiB0aGUgZnJhbWV3b3JrIHdvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGN1cnZlcyBvdmVyIGFyYml0cmFyeQogICAgIGZpbml0ZSBmaWVsZHMsIGJ1dCBhcyB0aGVyZSBhcmUgbm8gb2J2aW91cyB0eXBlcyBmb3IgZmllbGRzIG90aGVyCiAgICAgdGhhbiBHRihwKSwgc29tZSBmdW5jdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhhdCBmb3Igbm93LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgLUhUVFAgb3B0aW9uIHRvIHNfc2VydmVyLiAgSXQgaXMgc2ltaWxhciB0byAtV1dXLCBidXQgcmVxdWlyZXMKICAgICB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zIGEgY29tcGxldGUgSFRUUCByZXNwb25zZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGVjIGRpcmVjdG9yeSB0byBta2RlZi5wbCBhbmQgbWtmaWxlcy5wbC4gSW4gbWtkZWYucGwKICAgICBjaGFuZ2UgdGhlIGRlZiBhbmQgbnVtIGZpbGUgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIgZnJvbSAiJS00MHNYWFgiCiAgICAgdG8gIiUtMzlzIFhYWCIuIFRoZSBsYXR0ZXIgd2lsbCBhbHdheXMgZ3VhcmFudGVlIGEgc3BhY2UgYWZ0ZXIgdGhlCiAgICAgZmllbGQgd2hpbGUgdGhlIGZvcm1lciB3aWxsIGNhdXNlIHRoZW0gdG8gcnVuIHRvZ2V0aGVyIGlmIHRoZSBmaWVsZAogICAgIGlzIDQwIG9mIG1vcmUgY2hhcmFjdGVycyBsb25nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IHRoZSBjaXBoZXIgYW5kIGRpZ2VzdCAnbWV0aG9kJyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKICAgICBhbmQgbW9kaWZ5IHJlbGF0ZWQgZnVuY3Rpb25zIHRvIHRha2UgY29uc3RhbnQgRVZQX01EIGFuZCBFVlBfQ0lQSEVSCiAgICAgcG9pbnRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGlkZSBCTl9DVFggc3RydWN0dXJlIGRldGFpbHMgaW4gYm5fbGNsLmggaW5zdGVhZCBvZiBwdWJsaXNoaW5nIHRoZW0KICAgICBpbiA8b3BlbnNzbC9ibi5oPi4gIEFsc28gZnVydGhlciBpbmNyZWFzZSBCTl9DVFhfTlVNIHRvIDMyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vZGlmeSBFVlBfRGlnZXN0KigpIHJvdXRpbmVzIHNvIHRoZXkgbm93IHJldHVybiB2YWx1ZXMuIEFsdGhvdWdoIHRoZQogICAgIGludGVybmFsIHNvZnR3YXJlIHJvdXRpbmVzIGNhbiBuZXZlciBmYWlsIGFkZGl0aW9uYWwgaGFyZHdhcmUgdmVyc2lvbnMKICAgICBtaWdodC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCBjcnlwdG8vZXJyL2Vyci5oIGFuZCBjaGFuZ2Ugc29tZSBlcnJvciBjb2RlcyB0byBhdm9pZCBjb25mbGljdHM6CgogICAgIFByZXZpb3VzbHkgRVJSX1JfRkFUQUwgd2FzIHRvbyBzbWFsbCBhbmQgY29pbmNpZGVkIHdpdGggRVJSX0xJQl9QS0NTNwogICAgICg9IEVSUl9SX1BLQ1M3X0xJQik7IGl0IGlzIG5vdyA2NCBpbnN0ZWFkIG9mIDMyLgoKICAgICBBU04xIGVycm9yIGNvZGVzCiAgICAgICAgICBFUlJfUl9ORVNURURfQVNOMV9FUlJPUgogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfUl9NSVNTSU5HX0FTTjFfRU9TCiAgICAgd2VyZSA0IC4uIDksIGNvbmZsaWN0aW5nIHdpdGgKICAgICAgICAgIEVSUl9MSUJfUlNBICg9IEVSUl9SX1JTQV9MSUIpCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9MSUJfUEVNICg9IEVSUl9SX1BFTV9MSUIpLgogICAgIFRoZXkgYXJlIG5vdyA1OCAuLiA2MyAoaS5lLiwganVzdCBiZWxvdyBFUlJfUl9GQVRBTCkuCgogICAgIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfSU5URVJOQUxfRVJST1InLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IG92ZXJ1c2UgbG9ja3MgaW4gY3J5cHRvL2Vyci9lcnIuYzogRm9yIGRhdGEgcmV0cmlldmFsLCBDUllQVE9fcl9sb2NrCiAgICAgc3VmZmljZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wdGlvbiAnLXN1YmogYXJnJyBmb3IgJ29wZW5zc2wgcmVxJyBhbmQgJ29wZW5zc2wgY2EnLiAgVGhpcwogICAgIHNldHMgdGhlIHN1YmplY3QgbmFtZSBmb3IgYSBuZXcgcmVxdWVzdCBvciBzdXBlcnNlZGVzIHRoZQogICAgIHN1YmplY3QgbmFtZSBpbiBhIGdpdmVuIHJlcXVlc3QuIEZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkIGFyZQogICAgICAgICAgJ0NOPVNvbWUgTmFtZSwgT1U9bXlPVSwgQz1JVCcKICAgICBhbmQKICAgICAgICAgICdDTj1Tb21lIE5hbWUvT1U9bXlPVS9DPUlUJy4KCiAgICAgQWRkIG9wdGlvbnMgJy1iYXRjaCcgYW5kICctdmVyYm9zZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAaGFja21hc3RlcnMubmV0Pl0KCiAgKikgSW50cm9kdWNlIHRoZSBwb3NzaWJpbGl0eSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyB0aHJvdWdoCiAgICAgZnVuY3Rpb25zIG9uIHBsYXRmb3JtIHdlcmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBoYW5kbGUgZXhwb3J0aW5nCiAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiBzaGFyZWQgbGlicmFyaWVzLiAgVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwKICAgICBvbmUgbXVzdCBjb25maWd1cmUgd2l0aCAiRVhQT1JUX1ZBUl9BU19GTiIgb3IgZGVmaW5lZCB0aGUgQyBtYWNybwogICAgICJPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04iIGluIGNyeXB0by9vcGVuc3NsY29uZi5oICh0aGUgbGF0dGVyCiAgICAgaXMgbm9ybWFsbHkgZG9uZSBieSBDb25maWd1cmUgb3Igc29tZXRoaW5nIHNpbWlsYXIpLgoKICAgICBUbyBpbXBsZW1lbnQgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm8gT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMCiAgICAgaW4gdGhlIHNvdXJjZSBmaWxlIChmb28uYykgbGlrZSB0aGlzOgoKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsZm9vKT0xOwoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGRvdWJsZSxiYXIpOwoKICAgICBUbyBkZWNsYXJlIGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvcyBPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMCiAgICAgYW5kIE9QRU5TU0xfR0xPQkFMX1JFRiBpbiB0aGUgaGVhZGVyIGZpbGUgKGZvby5oKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsZm9vKTsKCSNkZWZpbmUgZm9vIE9QRU5TU0xfR0xPQkFMX1JFRihmb28pCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGRvdWJsZSxiYXIpOwoJI2RlZmluZSBiYXIgT1BFTlNTTF9HTE9CQUxfUkVGKGJhcikKCiAgICAgVGhlICNkZWZpbmVzIGFyZSB2ZXJ5IGltcG9ydGFudCwgYW5kIHRoZXJlZm9yZSBzbyBpcyBpbmNsdWRpbmcgdGhlCiAgICAgaGVhZGVyIGZpbGUgZXZlcnl3aGVyZSB3aGVyZSB0aGUgZGVmaW5lZCBnbG9iYWxzIGFyZSB1c2VkLgoKICAgICBUaGUgbWFjcm8gT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIGFsc28gYWZmZWN0cyB0aGUgZGVmaW5pdGlvbgogICAgIG9mIEFTTi4xIGl0ZW1zLCBidXQgdGhhdCBzdHJ1Y3R1cmUgaXMgYSBiaXQgZGlmZmVyZW50LgoKICAgICBUaGUgbGFyZ2VzdCBjaGFuZ2UgaXMgaW4gdXRpbC9ta2RlZi5wbCB3aGljaCBoYXMgYmVlbiBlbmhhbmNlZCB3aXRoCiAgICAgYmV0dGVyIGFuZCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBsb2dpYyB0byBjaG9vc2Ugd2hpY2ggc3ltYm9scyBzaG91bGQKICAgICBnbyBpbnRvIHRoZSBXaW5kb3dzIC5kZWYgZmlsZXMgYXMgd2VsbCBhcyBhIG51bWJlciBvZiBmaXhlcyBhbmQgY29kZQogICAgIGNsZWFudXAgKGFtb25nIG90aGVycywgYWxnb3JpdGhtIGtleXdvcmRzIGFyZSBub3cgc29ydGVkCiAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gYXZvaWQgY29uc3RhbnQgcmV3cml0ZXMpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIEJOX2RpdigpIGtlZXAgYSBjb3B5IG9mIHRoZSBzaWduIG9mICdudW0nIGJlZm9yZSB3cml0aW5nIHRoZQogICAgIHJlc3VsdCB0byAncm0nIGJlY2F1c2UgaWYgcm09PW51bSB0aGUgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgIGFuZCBwcm9kdWNlIHRoZSB3cm9uZyByZXN1bHQgaWYgJ251bScgaXMgbmVnYXRpdmU6IHRoaXMgY2F1c2VkCiAgICAgcHJvYmxlbXMgd2l0aCBCTl9tb2QoKSBhbmQgQk5fbm5tb2QoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBPQ1NQX3JlcXVlc3RfdmVyaWZ5KCkuIFRoaXMgY2hlY2tzIHRoZSBzaWduYXR1cmUgb24gYW4KICAgICBPQ1NQIHJlcXVlc3QgYW5kIHZlcmlmaWVzIHRoZSBzaWduZXIgY2VydGlmaWNhdGUuIFRoZSBzaWduZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyBqdXN0IGNoZWNrZWQgZm9yIGEgZ2VuZXJpYyBwdXJwb3NlIGFuZCBPQ1NQIHJlcXVlc3QKICAgICB0cnVzdCBzZXR0aW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0NTUF9jaGVja192YWxpZGl0eSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBPQ1NQCiAgICAgcmVzcG9uc2VzLiBPQ1NQIHJlc3BvbnNlcyBhcmUgcHJlcGFyZWQgaW4gcmVhbCB0aW1lIGFuZCBtYXkgb25seQogICAgIGJlIGEgZmV3IHNlY29uZHMgb2xkLiBTaW1wbHkgY2hlY2tpbmcgdGhhdCB0aGUgY3VycmVudCB0aW1lIGxpZXMKICAgICBiZXR3ZWVuIHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgbWF4IHJlamVjdCBvdGhlcndpc2UgdmFsaWQgcmVzcG9uc2VzCiAgICAgY2F1c2VkIGJ5IGVpdGhlciBPQ1NQIHJlc3BvbmRlciBvciBjbGllbnQgY2xvY2sgaW5hY2N1cmFjeS4gSW5zdGVhZAogICAgIHdlIGFsbG93IHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgdG8gZmFsbCB3aXRoaW4gYSBjZXJ0YWluIHBlcmlvZCBvZgogICAgIHRoZSBjdXJyZW50IHRpbWUuIFRoZSBhZ2Ugb2YgdGhlIHJlc3BvbnNlIGNhbiBhbHNvIG9wdGlvbmFsbHkgYmUKICAgICBjaGVja2VkLiBUd28gbmV3IG9wdGlvbnMgLXZhbGlkaXR5X3BlcmlvZCBhbmQgLXN0YXR1c19hZ2UgYWRkZWQgdG8KICAgICBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2lnbmF0dXJlIG9yIHB1YmxpYyBrZXkgYWxnb3JpdGhtIGlzIHVucmVjb2duaXplZCBwcmludCBvdXQgaXRzCiAgICAgT0lEIHJhdGhlciB0aGF0IGp1c3QgVU5LTk9XTi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgT0NTUF9jZXJ0X3RvX2lkKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHN1YmplY3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUF9jZXJ0X2lkX25ldygpIGEgTlVMTCBzZXJpYWxOdW1iZXIuIFRoaXMgYWxsb3dzIGEgcGFydGlhbCBjZXJ0aWZpY2F0ZQogICAgIElEIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBpc3N1ZXIgY2VydGlmaWNhdGUgYWxvbmUgd2hpY2ggY2FuIHRoZW4gYmUKICAgICBwYXNzZWQgdG8gT0NTUF9pZF9pc3N1ZXJfY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNvbXBpbGF0aW9uIG9wdGlvbiBBU04xX0lURU1fRlVOQ1RJT05TLiBUaGlzIGNhdXNlcyB0aGUgbmV3CiAgICAgQVNOMSBtb2R1bGVzIHRvIGV4cG9ydCBmdW5jdGlvbnMgcmV0dXJuaW5nIEFTTjFfSVRFTSBwb2ludGVycwogICAgIGluc3RlYWQgb2YgdGhlIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIHRoZW1zZWx2ZXMuIFRoaXMgYWRkcyBzZXZlcmFsCiAgICAgbmV3IG1hY3JvcyB3aGljaCBhbGxvdyB0aGUgdW5kZXJseWluZyBBU04xIGZ1bmN0aW9uL3N0cnVjdHVyZSB0bwogICAgIGJlIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkuIEFzIGEgcmVzdWx0IGNvZGUgc2hvdWxkIG5vdCB1c2UgQVNOMV9JVEVNCiAgICAgcmVmZXJlbmNlcyBkaXJlY3RseSAoc3VjaCBhcyAmWDUwOV9pdCkgYnV0IGluc3RlYWQgdXNlIHRoZSByZWxldmFudAogICAgIG1hY3JvcyAoc3VjaCBhcyBBU04xX0lURU1fcnB0cihYNTA5KSkuIFRoaXMgb3B0aW9uIGlzIHRvIGFsbG93CiAgICAgdXNlIG9mIHRoZSBuZXcgQVNOMSBjb2RlIG9uIHBsYXRmb3JtcyB3aGVyZSBleHBvcnRpbmcgc3RydWN0dXJlcwogICAgIGlzIHByb2JsZW1hdGljYWwgKGZvciBleGFtcGxlIGluIHNoYXJlZCBsaWJyYXJpZXMpIGJ1dCBleHBvcnRpbmcKICAgICBmdW5jdGlvbnMgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgaXMgbm90LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIFNTTC9UTFMgc2Vzc2lvbiBJRHMuCiAgICAgVGhlc2UgY2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIGVpdGhlciBpbiBhbiBTU0xfQ1RYIG9yIHBlciBTU0wuCiAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCwgaWYgdGhleSB3aXNoLAogICAgIHRoZSBhcmJpdHJhcnkgdmFsdWVzIGNob3NlbiBmb3IgdXNlIGFzIHNlc3Npb24gSURzLCBwYXJ0aWN1bGFybHkgYXMgaXQKICAgICBjYW4gYmUgdXNlZnVsIGZvciBzZXNzaW9uIGNhY2hpbmcgaW4gbXVsdGlwbGUtc2VydmVyIGVudmlyb25tZW50cy4gQQogICAgIGNvbW1hbmQtbGluZSBzd2l0Y2ggZm9yIHRlc3RpbmcgdGhpcyAoYW5kIGFueSBjbGllbnQgY29kZSB0aGF0IHdpc2hlcwogICAgIHRvIHVzZSBzdWNoIGEgZmVhdHVyZSkgaGFzIGJlZW4gYWRkZWQgdG8gInNfc2VydmVyIi4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBNb2RpZnkgbWtkZWYucGwgdG8gcmVjb2duaXNlIGFuZCBwYXJzZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCiAgICAgb2YgdGhlIGZvcm0gJyNpZiBkZWZpbmVkKC4uLikgfHwgZGVmaW5lZCguLi4pIHx8IC4uLicgYW5kCiAgICAgJyNpZiAhZGVmaW5lZCguLi4pICYmICFkZWZpbmVkKC4uLikgJiYgLi4uJy4gIFRoaXMgYWxzbyBhdm9pZHMKICAgICB0aGUgZ3Jvd2luZyBudW1iZXIgb2Ygc3BlY2lhbCBjYXNlcyBpdCB3YXMgcHJldmlvdXNseSBoYW5kbGluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGFsbCBjb25maWd1cmF0aW9uIG1hY3JvcyBhdmFpbGFibGUgZm9yIGFwcGxpY2F0aW9uIGJ5IG1ha2luZwogICAgIHN1cmUgdGhleSBhcmUgYXZhaWxhYmxlIGluIG9wZW5zc2xjb25mLmgsIGJ5IGdpdmluZyB0aGVtIG5hbWVzIHN0YXJ0aW5nCiAgICAgd2l0aCAiT1BFTlNTTF8iIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzIGFuZCBieSBtYWtpbmcKICAgICBzdXJlIGVfb3MyLmggd2lsbCBjb3ZlciBhbGwgcGxhdGZvcm0tc3BlY2lmaWMgY2FzZXMgdG9nZXRoZXIgd2l0aAogICAgIG9wZW5zc2xjb25mLmguCiAgICAgQWRkaXRpb25hbGx5LCBpdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGNvbmZpZ3VyYXRpb24vcGxhdGZvcm0tCiAgICAgc3BlY2lmaWMgbmFtZXMgKGNhbGxlZCAic3lzdGVtIGlkZW50aXRpZXMiKS4gIEluIHRoZSBDIGNvZGUsIHRoZXNlCiAgICAgYXJlIHByZWZpeGVkIHdpdGggIk9QRU5TU0xfU1lTTkFNRV8iLiAgZV9vczIuaCB3aWxsIGNyZWF0ZSBhbm90aGVyCiAgICAgbWFjcm8gd2l0aCB0aGUgbmFtZSBiZWdpbm5pbmcgd2l0aCAiT1BFTlNTTF9TWVNfIiwgd2hpY2ggaXMgZGV0ZXJtaW5lZAogICAgIGZyb20gIk9QRU5TU0xfU1lTTkFNRV8qIiBvciBjb21waWxlci1zcGVjaWZpYyBtYWNyb3MgZGVwZW5kaW5nIG9uCiAgICAgd2hhdCBpcyBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IG9wdGlvbiAtc2V0X3NlcmlhbCB0byAncmVxJyBhbmQgJ3g1MDknIHRoaXMgYWxsb3dzIHRoZSBzZXJpYWwKICAgICBudW1iZXIgdG8gdXNlIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBQcmV2aW91c2x5IHNlbGYKICAgICBzaWduZWQgY2VydGlmaWNhdGVzIHdlcmUgaGFyZCBjb2RlZCB3aXRoIHNlcmlhbCBudW1iZXIgMCBhbmQgdGhlIAogICAgIENBIG9wdGlvbnMgb2YgJ3g1MDknIGhhZCB0byB1c2UgYSBzZXJpYWwgbnVtYmVyIGluIGEgZmlsZSB3aGljaCB3YXMKICAgICBhdXRvIGluY3JlbWVudGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvICdjYScgdXRpbGl0eSB0byBzdXBwb3J0IFYyIENSTCBlbnRyeSBleHRlbnNpb25zLgogICAgIEN1cnJlbnRseSBDUkwgcmVhc29uLCBpbnZhbGlkaXR5IGRhdGUgYW5kIGhvbGQgaW5zdHJ1Y3Rpb24gYXJlCiAgICAgc3VwcG9ydGVkLiBBZGQgbmV3IENSTCBleHRlbnNpb25zIHRvIFYzIGNvZGUgYW5kIHNvbWUgbmV3IG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCkgdGhpcyBpcyB1c2VkIHRvCiAgICAgZGlzYWJsZSBzdGFuZGFyZCBibG9jayBwYWRkaW5nIChha2EgUEtDUyM1IHBhZGRpbmcpIGluIHRoZSBFVlAKICAgICBBUEksIHdoaWNoIHdhcyBwcmV2aW91c2x5IG1hbmRhdG9yeS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIGlzCiAgICAgbm90IHBhZGRlZCBpbiBhbnkgd2F5IGFuZCBzbyB0aGUgdG90YWwgbGVuZ3RoIG11Y2ggYmUgYSBtdWx0aXBsZQogICAgIG9mIHRoZSBibG9jayBzaXplLCBvdGhlcndpc2UgYW4gZXJyb3Igb2NjdXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgKGluY29tcGxldGUpIE9DU1AgU1NMIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfcGFyc2VfdXJsKCkuIFRoaXMgc3BsaXRzIHVwIGEgVVJMIGludG8gaXRzIGhvc3QsCiAgICAgcG9ydCBhbmQgcGF0aCBjb21wb25lbnRzOiBwcmltYXJpbHkgdG8gcGFyc2UgT0NTUCBVUkxzLiBOZXcgLXVybAogICAgIG9wdGlvbiB0byBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG5vbmNlIGJlaGF2aW9yLiBUaGUgcmV0dXJuIHZhbHVlIG9mIE9DU1BfY2hlY2tfbm9uY2UoKSBub3cgCiAgICAgcmVmbGVjdHMgdGhlIHZhcmlvdXMgY2hlY2tzIHBlcmZvcm1lZC4gQXBwbGljYXRpb25zIGNhbiBkZWNpZGUKICAgICB3aGV0aGVyIHRvIHRvbGVyYXRlIGNlcnRhaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGFuIGFic2VudCBub25jZQogICAgIGluIGEgcmVzcG9uc2Ugd2hlbiBvbmUgd2FzIHByZXNlbnQgaW4gYSByZXF1ZXN0OiB0aGUgb2NzcCBhcHBsaWNhdGlvbgogICAgIGp1c3QgcHJpbnRzIG91dCBhIHdhcm5pbmcuIE5ldyBmdW5jdGlvbiBPQ1NQX2FkZDFfYmFzaWNfbm9uY2UoKQogICAgIHRoaXMgaXMgdG8gYWxsb3cgcmVzcG9uZGVycyB0byBpbmNsdWRlIGEgbm9uY2UgaW4gYSByZXNwb25zZSBldmVuIGlmCiAgICAgdGhlIHJlcXVlc3QgaXMgbm9uY2UtbGVzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIHN0ZGluIGJ1ZmZlcmluZyBpbiBsb2FkX2NlcnQgKGFwcHMvYXBwcy5jKSBzbyB0aGF0IG5vIGNlcnRzIGFyZQogICAgIHNraXBwZWQgd2hlbiB1c2luZyBvcGVuc3NsIHg1MDkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgaW5wdXQgZmlsZSwKICAgICBlLmcuICIob3BlbnNzbCB4NTA5IC1vdXQgY2VydDE7IG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQyKSA8Y2VydHMiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoKSBhbmQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0X3N0cmluZygpCiAgICAgc2V0IHN0cmluZyB0eXBlOiB0byBoYW5kbGUgc2V0dGluZyBBU04xX1RJTUUgc3RydWN0dXJlcy4gRml4IGNhCiAgICAgdXRpbGl0eSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSByZXZvY2F0aW9uIGRhdGUgb2YgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3ZlcnJpZGUKICAgICB0aGUgY2xpZW50cyBwcmVmZXJyZWQgY2lwaGVyc3VpdGVzIGFuZCByYXRoZXIgdXNlIGl0cyBvd24gcHJlZmVyZW5jZXMuCiAgICAgU2hvdWxkIGhlbHAgdG8gd29yayBhcm91bmQgTSQgU0dDIChTZXJ2ZXIgR2F0ZWQgQ3J5cHRvZ3JhcGh5KSBidWcgaW4KICAgICBJbnRlcm5ldCBFeHBsb3JlciBieSBlbnN1cmluZyB1bmNoYW5nZWQgaGFzaCBtZXRob2QgZHVyaW5nIHN0ZXB1cC4KICAgICAoQWxzbyByZXBsYWNlcyB0aGUgYnJva2VuL2RlYWN0aXZhdGVkIFNTTF9PUF9OT05fRVhQT1JUX0ZJUlNUIG9wdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2UgbWtkZWYucGwgcmVjb2duaXNlIGFsbCBERUNMQVJFX0FTTjEgbWFjcm9zLCBjaGFuZ2UgcmlqbmRhZWwKICAgICB0byBhZXMgYW5kIGFkZCBhIG5ldyAnZXhpc3QnIG9wdGlvbiB0byBwcmludCBvdXQgc3ltYm9scyB0aGF0IGRvbid0CiAgICAgYXBwZWFyIHRvIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBvY3NwIHV0aWxpdHkgdG8gYWxsb3cgZmxhZ3MgdG8gYmUgc2V0IGFuZAogICAgIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgb3B0aW9uIC1WQWZpbGUgdG8gJ29wZW5zc2wgb2NzcCcsIHNvIHRoZSB1c2VyIGNhbiBnaXZlIHRoZQogICAgIE9DU1AgY2xpZW50IGEgbnVtYmVyIG9mIGNlcnRpZmljYXRlIHRvIG9ubHkgdmVyaWZ5IHRoZSByZXNwb25zZQogICAgIHNpZ25hdHVyZSBhZ2FpbnN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFVwZGF0ZSBSaWpuZGFlbCBjb2RlIHRvIHZlcnNpb24gMy4wIGFuZCBjaGFuZ2UgRVZQIEFFUyBjaXBoZXJzIHRvCiAgICAgaGFuZGxlIHRoZSBuZXcgQVBJLiBDdXJyZW50bHkgb25seSBFQ0IsIENCQyBtb2RlcyBzdXBwb3J0ZWQuIEFkZCBuZXcKICAgICBBRVMgT0lEcy4KCiAgICAgQWRkIFRMUyBBRVMgY2lwaGVyc3VpdGVzIGFzIGRlc2NyaWJlZCBpbiBSRkMzMjY4LCAiQWR2YW5jZWQKICAgICBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIENpcGhlcnN1aXRlcyBmb3IgVHJhbnNwb3J0IExheWVyCiAgICAgU2VjdXJpdHkgKFRMUykiLiAgKEluIGJldGEgdmVyc2lvbnMgb2YgT3BlblNTTCAwLjkuNywgdGhlc2Ugd2VyZQogICAgIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdlcmUgbm90IHBhcnQgb2YgdGhlICJBTEwiIGNpcGhlcnN1aXRlCiAgICAgYWxpYXMgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHlldCBvZmZpY2lhbDsgdGhleSBjb3VsZCBiZQogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHNwZWNpZnlpbmcgdGhlICJBRVNkcmFmdCIgY2lwaGVyc3VpdGUKICAgICBncm91cCBhbGlhcy4gIEluIHRoZSBmaW5hbCByZWxlYXNlIG9mIE9wZW5TU0wgMC45LjcsIHRoZSBncm91cAogICAgIGFsaWFzIGlzIGNhbGxlZCAiQUVTIiBhbmQgaXMgcGFydCBvZiAiQUxMIi4pCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlICBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfY29weV9ub25jZSgpIHRvIGNvcHkgbm9uY2UgdmFsdWUgKGlmIHByZXNlbnQpIGZyb20KICAgICByZXF1ZXN0IHRvIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBmb3IgT0NTUCByZXNwb25kZXJzLiBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KCksCiAgICAgT0NTUF9yZXF1ZXN0X29uZXJlcV9nZXQwKCksIE9DU1Bfb25lcmVxX2dldDBfaWQoKSBhbmQgT0NTUF9pZF9nZXQwX2luZm8oKQogICAgIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QuIE9DU1BfcmVzcG9uc2VfY3JlYXRlKCkKICAgICBjcmVhdGVzIGEgcmVzcG9uc2UgYW5kIG9wdGlvbmFsbHkgYWRkcyBhIGJhc2ljIHJlc3BvbnNlIHN0cnVjdHVyZS4KICAgICBPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKCkgYWRkcyBhIGNvbXBsZXRlIHNpbmdsZSByZXNwb25zZSB0byBhIGJhc2ljCiAgICAgcmVzcG9uc2UgYW5kIHJldHVybnMgdGhlIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmUganVzdCBhZGRlZCAodG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIGluY2x1ZGVkIGZvciBleGFtcGxlKS4gT0NTUF9iYXNpY19hZGQxX2NlcnQoKSBhZGRzIGEKICAgICBjZXJ0aWZpY2F0ZSB0byBhIGJhc2ljIHJlc3BvbnNlIGFuZCBPQ1NQX2Jhc2ljX3NpZ24oKSBzaWducyBhIGJhc2ljCiAgICAgcmVzcG9uc2Ugd2l0aCB2YXJpb3VzIGZsYWdzLiBOZXcgaGVscGVyIGZ1bmN0aW9ucyBBU04xX1RJTUVfY2hlY2soKQogICAgIChjaGVja3MgdmFsaWRpdHkgb2YgQVNOMV9USU1FIHN0cnVjdHVyZSkgYW5kIEFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoKQogICAgIChjb252ZXJ0cyBBU04xX1RJTUUgdG8gR2VuZXJhbGl6ZWRUaW1lKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIG5ldyBmdW5jdGlvbnMuIEVWUF9EaWdlc3QoKSBjb21iaW5lcyBFVlBfRGlnZXN0e0luaXQsVXBkYXRlLEZpbmFsfSgpCiAgICAgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBYNTA5X2dldDBfcHVia2V5X2JpdHN0cigpIGV4dHJhY3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgc3RydWN0dXJlIGZyb20gYSBjZXJ0aWZpY2F0ZS4gWDUwOV9wdWJrZXlfZGlnZXN0KCkgZGlnZXN0cyB0aGUgcHVibGljX2tleQogICAgIGNvbnRlbnRzOiB0aGlzIGlzIHVzZWQgaW4gdmFyaW91cyBrZXkgaWRlbnRpZmllcnMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc2tfc29ydCgpIHRvbGVyYXRlIGEgTlVMTCBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB2ZXJpZnkgZmxhZyBPQ1NQX1RSVVNUT1RIRVIuIFdoZW4gc2V0IHRoZSAib3RoZXIiIGNlcnRpZmljYXRlcwogICAgIHBhc3NlZCBieSB0aGUgZnVuY3Rpb24gYXJlIHRydXN0ZWQgaW1wbGljaXRseS4gSWYgYW55IG9mIHRoZW0gc2lnbmVkIHRoZQogICAgIHJlc3BvbnNlIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZCBhbmQgaXMgbm90IHZlcmlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBLQ1M3X3NldF90eXBlKCkgaW5pdGlhbGlzZSBjb250ZW50X3R5cGUgaW4gUEtDUzdfRU5DX0NPTlRFTlQKICAgICB0byBkYXRhLiBUaGlzIHdhcyBwcmV2aW91c2x5IHBhcnQgb2YgdGhlIFBLQ1M3IEFTTjEgY29kZS4gVGhpcwogICAgIHdhcyBjYXVzaW5nIHByb2JsZW1zIHdpdGggT3BlblNTTCBjcmVhdGVkIFBLQ1MjMTIgYW5kIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEFkZCBDUllQVE9fcHVzaF9pbmZvKCkgYW5kIENSWVBUT19wb3BfaW5mbygpIGNhbGxzIHRvIG5ldyBBU04xCiAgICAgcm91dGluZXM6IHdpdGhvdXQgdGhlc2UgdHJhY2luZyBtZW1vcnkgbGVha3MgaXMgdmVyeSBwYWluZnVsLgogICAgIEZpeCBsZWFrcyBpbiBQS0NTMTIgYW5kIFBLQ1M3IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgWDUwOV90aW1lX2FkaigpIGNvcGUgd2l0aCB0aGUgbmV3IGJlaGF2aW91ciBvZiBBU04xX1RJTUVfbmV3KCkuCiAgICAgUHJldmlvdXNseSBpdCBpbml0aWFsaXNlZCB0aGUgJ3R5cGUnIGFyZ3VtZW50IHRvIFZfQVNOMV9VVENUSU1FIHdoaWNoCiAgICAgZWZmZWN0aXZlbHkgbWVhbnQgR2VuZXJhbGl6ZWRUaW1lIHdvdWxkIG5ldmVyIGJlIHVzZWQuIE5vdyBpdAogICAgIGlzIGluaXRpYWxpc2VkIHRvIC0xIGJ1dCBYNTA5X3RpbWVfYWRqKCkgbm93IGhhcyB0byBjaGVjayB0aGUgdmFsdWUKICAgICBhbmQgdXNlIEFTTjFfVElNRV9zZXQoKSBpZiB0aGUgdmFsdWUgaXMgbm90IFZfQVNOMV9VVENUSU1FIG9yCiAgICAgVl9BU04xX0dFTkVSQUxJWkVEVElNRSwgd2l0aG91dCB0aGlzIGl0IGFsd2F5cyB1c2VzIEdlbmVyYWxpemVkVGltZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBGaXhlcyB0byBCTl90b19BU04xX0lOVEVHRVIgd2hlbiBibiBpcyB6ZXJvLiBUaGlzIHdvdWxkIHByZXZpb3VzbHkKICAgICByZXN1bHQgaW4gYSB6ZXJvIGxlbmd0aCBpbiB0aGUgQVNOMV9JTlRFR0VSIHN0cnVjdHVyZSB3aGljaCB3YXMKICAgICBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hlbiBkMmlfQVNOMV9JTlRFR0VSKCkgd2FzIHVzZWQKICAgICBhbmQgd291bGQgY2F1c2UgQVNOMV9JTlRFR0VSX2NtcCgpIHRvIGZhaWwuIEVuaGFuY2UgczJpX0FTTjFfSU5URUdFUigpCiAgICAgdG8gY29wZSB3aXRoIGhleCBhbmQgbmVnYXRpdmUgaW50ZWdlcnMuIEZpeCBidWcgaW4gaTJhX0FTTjFfSU5URUdFUigpCiAgICAgd2hlcmUgaXQgZGlkIG5vdCBwcmludCBvdXQgYSBtaW51cyBmb3IgbmVnYXRpdmUgQVNOMV9JTlRFR0VSLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdW1tYXJ5IHByaW50b3V0IHRvIG9jc3AgdXRpbGl0eS4gVGhlIHZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoCiAgICAgY29udmVydCBzdGF0dXMgdmFsdWVzIHRvIHN0cmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQgdG86CiAgICAgT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKCksIE9DU1BfY2VydF9zdGF0dXNfc3RyKCkgYW5kCiAgICAgT0NTUF9jcmxfcmVhc29uX3N0cigpIGFuZCBhcmUgbm8gbG9uZ2VyIHN0YXRpYy4gTmV3IG9wdGlvbnMKICAgICB0byB2ZXJpZnkgbm9uY2UgdmFsdWVzIGFuZCB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbi4gT0NTUCByZXNwb25zZQogICAgIHByaW50b3V0IGZvcm1hdCBjbGVhbmVkIHVwLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhZGRpdGlvbmFsIE9DU1AgY2VydGlmaWNhdGUgY2hlY2tzLiBUaGVzZSBhcmUgdGhvc2Ugc3BlY2lmaWVkCiAgICAgaW4gUkZDMjU2MC4gVGhpcyBjb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgY2hlY2tzOiB0aGUgQ0Egb2YgdGhlCiAgICAgY2VydGlmaWNhdGUgYmVpbmcgY2hlY2tlZCBtdXN0IGVpdGhlciBiZSB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUKICAgICBvciB0aGUgaXNzdWVyIG9mIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZQogICAgIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiB0aGUgT0NTUCBzaWduaW5nIGV4dGVuZGVkIGtleQogICAgIHVzYWdlLiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCBieSBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSBPQ1NQCiAgICAgc2lnbmVyIG9yIHRoZSBPQ1NQIHNpZ25lciBDQSB0byB0aGUgaXNzdWVyTmFtZUhhc2ggYW5kIGlzc3VlcktleUhhc2gKICAgICBpbiB0aGUgT0NTUF9DRVJUSUQgc3RydWN0dXJlcyBvZiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBPQ1NQIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZGRlZCB0byBPQ1NQX2Jhc2ljX3ZlcmlmeSgpCiAgICAgYW5kIHJlbGF0ZWQgcm91dGluZXMuIFRoaXMgdXNlcyB0aGUgc3RhbmRhcmQgT3BlblNTTCBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSByb3V0aW5lcyB0byBwZXJmb3JtIGluaXRpYWwgY2hlY2tzIChqdXN0IENBIHZhbGlkaXR5KSBhbmQKICAgICB0byBvYnRhaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluLiBUaGVuIGFkZGl0aW9uYWwgY2hlY2tzIHdpbGwgYmUKICAgICBwZXJmb3JtZWQgb24gdGhlIGNoYWluLiBDdXJyZW50bHkgdGhlIHJvb3QgQ0EgaXMgY2hlY2tlZCB0byBzZWUKICAgICBpZiBpdCBpcyBleHBsaWNpdGx5IHRydXN0ZWQgZm9yIE9DU1Agc2lnbmluZy4gVGhpcyBpcyB1c2VkIHRvIHNldAogICAgIGEgcm9vdCBDQSBhcyBhIGdsb2JhbCBzaWduaW5nIHJvb3Q6IHRoYXQgaXMgYW55IGNlcnRpZmljYXRlIHRoYXQKICAgICBjaGFpbnMgdG8gdGhhdCBDQSBpcyBhbiBhY2NlcHRhYmxlIE9DU1Agc2lnbmluZyBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJy1leHRmaWxlIC4uLicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJyBmb3IgcmVhZGluZyBYLjUwOXYzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgc2VwYXJhdGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEFzIHdoZW4gcmVhZGluZyBleHRlbnNpb25zIGZyb20gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHRoZSAnLWV4dGVuc2lvbnMgLi4uJyBvcHRpb24gbWF5IGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlCiAgICAgc2VjdGlvbiB0byB1c2UuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB1dGlsaXR5LiBBbGxvd3MgT0NTUCByZXF1ZXN0cyB0byBiZSBnZW5lcmF0ZWQgb3IKICAgICByZWFkLiBUaGUgcmVxdWVzdCBjYW4gYmUgc2VudCB0byBhIHJlc3BvbmRlciBhbmQgdGhlIG91dHB1dAogICAgIHBhcnNlZCwgb3V0cHV0ZWQgb3IgcHJpbnRlZCBpbiB0ZXh0IGZvcm0uIE5vdCBjb21wbGV0ZSB5ZXQ6CiAgICAgc3RpbGwgbmVlZHMgdG8gY2hlY2sgdGhlIE9DU1AgcmVzcG9uc2UgdmFsaWRpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN1YmNvbW1hbmRzIGZvciAnb3BlbnNzbCBjYSc6CiAgICAgJ29wZW5zc2wgY2EgLXN0YXR1cyA8c2VyaWFsPicgcHJpbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGNlcnQgd2l0aAogICAgIHRoZSBnaXZlbiBzZXJpYWwgbnVtYmVyIChhY2NvcmRpbmcgdG8gdGhlIGluZGV4IGZpbGUpLgogICAgICdvcGVuc3NsIGNhIC11cGRhdGVkYicgdXBkYXRlcyB0aGUgZXhwaXJ5IHN0YXR1cyBvZiBjZXJ0aWZpY2F0ZXMKICAgICBpbiB0aGUgaW5kZXggZmlsZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyAnLW5ld3JlcS1ub2RlcycgY29tbWFuZCBvcHRpb24gdG8gQ0EucGwuICBUaGlzIGlzIGxpa2UKICAgICAnLW5ld3JlcScsIGJ1dCBjYWxscyAnb3BlbnNzbCByZXEnIHdpdGggdGhlICctbm9kZXMnIG9wdGlvbgogICAgIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBrZXkgaXMgbm90IGVuY3J5cHRlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHTlUgSHVyZC4KICAgICBbSm9uYXRoYW4gQmFydGxldHQgPGpvaG5ueWJAd29sZnJhbS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluaXRpYWwgY29kZSB0byBpbXBsZW1lbnQgT0NTUCBiYXNpYyByZXNwb25zZSB2ZXJpZnkuIFRoaXMKICAgICBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gQ3VycmVudGx5IGp1c3QgZmluZHMgdGhlIHNpZ25lcidzCiAgICAgY2VydGlmaWNhdGUgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTU0xlYXlfdmVyc2lvbiBjb2RlIFNTTEVBWV9ESVIgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlZC1pbgogICAgIHZhbHVlIG9mIE9QRU5TU0xESVIuICBUaGlzIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG5ldyAnLWQnIG9wdGlvbgogICAgIHRvICdvcGVuc3NsIHZlcnNpb24nLCBhbmQgaXMgYWxzbyBpbmNsdWRlZCBpbiAnb3BlbnNzbCB2ZXJzaW9uIC1hJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvd2luZyBkZWZpbmluZyBtZW1vcnkgYWxsb2NhdGlvbiBjYWxsYmFja3MgdGhhdCB3aWxsIGJlIGdpdmVuCiAgICAgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cwogICAgIChhIGNvbnN0IGNoYXIqIGFuZCBhbiBpbnQpLiAgVGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgcmVtYWlucywgYXMKICAgICB3ZWxsIGFzIHRoZSBvcmlnaW5hbCBwb3NzaWJpbGl0eSB0byBqdXN0IHJlcGxhY2UgbWFsbG9jKCksCiAgICAgcmVhbGxvYygpIGFuZCBmcmVlKCkgYnkgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGtub3cgYWJvdXQgdGhlc2UKICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIFRvIHJlZ2lzdGVyIGFuZCBmaW5kIG91dCB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGZvciBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucywgdGhlIGZvbGxvd2luZwogICAgIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQ6CgoJQ1JZUFRPX3NldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCiAgICAgVGhlc2Ugd29yayB0aGUgc2FtZSB3YXkgYXMgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIGFuZCBmcmllbmRzLgogICAgIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2Z1bmN0aW9ucyBub3cgd3JpdGVzIDAgd2hlcmUgc3VjaCBhbgogICAgIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBTaW1pbGFybHksIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2V4X2Z1bmN0aW9ucyB3cml0ZXMgMCB3aGVyZQogICAgIGEgY29udmVudGlvbmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBCb2RvIE1vZWxsZXJdCgogICopIEZpbmlzaCBvZmYgcmVtb3ZpbmcgdGhlIHJlbWFpbmluZyBMSEFTSCBmdW5jdGlvbiBwb2ludGVyIGNhc3RzLgogICAgIFRoZXJlIHNob3VsZCBubyBsb25nZXIgYmUgYW55IHByb3RvdHlwZS1jYXN0aW5nIHJlcXVpcmVkIHdoZW4gdXNpbmcKICAgICB0aGUgTEhBU0ggYWJzdHJhY3Rpb24sIGFuZCBhbnkgY2FzdHMgdGhhdCByZW1haW4gYXJlICJidWdzIi4gU2VlCiAgICAgdGhlIGNhbGxiYWNrIHR5cGVzIGFuZCBtYWNyb3MgYXQgdGhlIGhlYWQgb2YgbGhhc2guaCBmb3IgZGV0YWlscwogICAgIChhbmQgIk9CSl9jbGVhbnVwIiBpbiBjcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMgYXMgYW4gZXhhbXBsZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF1dG9tYXRpYyBxdWVyeSBvZiBFR0Qgc29ja2V0cyBpbiBSQU5EX3BvbGwoKSBmb3IgdGhlIHVuaXggdmFyaWFudC4KICAgICBJZiAvZGV2L1t1XXJhbmRvbSBkZXZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGRvIG5vdCByZXR1cm4gZW5vdWdoCiAgICAgZW50cm9weSwgRUdEIHN0eWxlIHNvY2tldHMgKHNlcnZlZCBieSBFR0Qgb3IgUFJOR0QpIHdpbGwgYXV0b21hdGljYWxseQogICAgIGJlIHF1ZXJpZWQuCiAgICAgVGhlIGxvY2F0aW9ucyAvdmFyL3J1bi9lZ2QtcG9vbCwgL2Rldi9lZ2QtcG9vbCwgL2V0Yy9lZ2QtcG9vbCwgYW5kCiAgICAgL2V0Yy9lbnRyb3B5IHdpbGwgYmUgcXVlcmllZCBvbmNlIGVhY2ggaW4gdGhpcyBzZXF1ZW5jZSwgcXVlcmluZyBzdG9wcwogICAgIHdoZW4gZW5vdWdoIGVudHJvcHkgd2FzIGNvbGxlY3RlZCB3aXRob3V0IHF1ZXJ5aW5nIG1vcmUgc29ja2V0cy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IFJBTkRfcG9sbCgpIHZhcmlhbnQgdG8gYmUgYWJsZSB0byBwb2xsIHNldmVyYWwKICAgICByYW5kb20gZGV2aWNlcywgYXMgc3BlY2lmaWVkIGJ5IERFVlJBTkRPTSwgdW50aWwgYSBzdWZmaWNpZW50IGFtb3VudAogICAgIG9mIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgIFdlIHNwZW5kIGF0IG1vc3QgMTAgbXMgb24gZWFjaCBmaWxlCiAgICAgKHNlbGVjdCB0aW1lb3V0KSBhbmQgcmVhZCBpbiBub24tYmxvY2tpbmcgbW9kZS4gIERFVlJBTkRPTSBub3cKICAgICBkZWZhdWx0cyB0byB0aGUgbGlzdCAiL2Rldi91cmFuZG9tIiwgIi9kZXYvcmFuZG9tIiwgIi9kZXYvc3JhbmRvbSIKICAgICAocHJldmlvdXNseSBpdCB3YXMganVzdCB0aGUgc3RyaW5nICIvZGV2L3VyYW5kb20iKSwgc28gb24gdHlwaWNhbAogICAgIHBsYXRmb3JtcyB0aGUgMTAgbXMgZGVsYXkgd2lsbCBuZXZlciBvY2N1ci4KICAgICBBbHNvIHNlcGFyYXRlIG91dCB0aGUgVW5peCB2YXJpYW50IHRvIGl0cyBvd24gZmlsZSwgcmFuZF91bml4LmMuCiAgICAgRm9yIFZNUywgdGhlcmUncyBhIGN1cnJlbnRseS1lbXB0eSByYW5kX3Ztcy5jLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1vdmUgT0NTUCBjbGllbnQgcmVsYXRlZCByb3V0aW5lcyB0byBvY3NwX2NsLmMuIFRoZXNlCiAgICAgcHJvdmlkZSB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhbiBhcHBsaWNhdGlvbiBuZWVkaW5nCiAgICAgdG8gaXNzdWUgYSByZXF1ZXN0IHRvIGFuIE9DU1AgcmVzcG9uZGVyIGFuZCBhbmFseXNlIHRoZQogICAgIHJlc3BvbnNlIHdpbGwgdHlwaWNhbGx5IG5lZWQ6IGFzIG9wcG9zZWQgdG8gdGhvc2Ugd2hpY2ggYW4KICAgICBPQ1NQIHJlc3BvbmRlciBpdHNlbGYgd291bGQgbmVlZCB3aGljaCB3aWxsIGJlIGFkZGVkIGxhdGVyLgoKICAgICBPQ1NQX3JlcXVlc3Rfc2lnbigpIHNpZ25zIGFuIE9DU1AgcmVxdWVzdCB3aXRoIGFuIEFQSSBzaW1pbGFyCiAgICAgdG8gUEtDUzdfc2lnbigpLiBPQ1NQX3Jlc3BvbnNlX3N0YXR1cygpIHJldHVybnMgc3RhdHVzIG9mIE9DU1AKICAgICByZXNwb25zZS4gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKCkgZXh0cmFjdHMgYmFzaWMgcmVzcG9uc2UKICAgICBmcm9tIHJlc3BvbnNlLiBPQ1NQX3Jlc3BfZmluZF9zdGF0dXMoKTogZmluZHMgYW5kIGV4dHJhY3RzIHN0YXR1cwogICAgIGluZm9ybWF0aW9uIGZyb20gYW4gT0NTUF9DRVJUSUQgc3RydWN0dXJlICh3aGljaCB3aWxsIGJlIGNyZWF0ZWQKICAgICB3aGVuIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBidWlsdCkuIFRoZXNlIGFyZSBidWlsdCBmcm9tIGxvd2VyCiAgICAgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHdvcmsgb24gT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZXMgYnV0CiAgICAgd29udCBub3JtYWxseSBiZSB1c2VkIHVubGVzcyB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIGV4YW1pbmUKICAgICBleHRlbnNpb25zIGluIHRoZSBPQ1NQIHJlc3BvbnNlIGZvciBleGFtcGxlLgoKICAgICBSZXBsYWNlIG5vbmNlIHJvdXRpbmVzIHdpdGggYSBwYWlyIG9mIGZ1bmN0aW9ucy4KICAgICBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZSgpIGFkZHMgYSBub25jZSB2YWx1ZSBhbmQgb3B0aW9uYWxseQogICAgIGdlbmVyYXRlcyBhIHJhbmRvbSB2YWx1ZS4gT0NTUF9jaGVja19ub25jZSgpIGNoZWNrcyB0aGUKICAgICB2YWxpZGl0eSBvZiB0aGUgbm9uY2UgaW4gYW4gT0NTUCByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgZnVuY3Rpb24gT0NTUF9yZXF1ZXN0X2FkZCgpIHRvIE9DU1BfcmVxdWVzdF9hZGQwX2lkKCkuCiAgICAgVGhpcyBkb2Vzbid0IGNvcHkgdGhlIHN1cHBsaWVkIE9DU1BfQ0VSVElEIGFuZCBhdm9pZHMgdGhlCiAgICAgbmVlZCB0byBmcmVlIHVwIHRoZSBuZXdseSBjcmVhdGVkIGlkLiBDaGFuZ2UgcmV0dXJuIHR5cGUKICAgICB0byBPQ1NQX09ORVJFUSB0byByZXR1cm4gdGhlIGludGVybmFsIE9DU1BfT05FUkVRIHN0cnVjdHVyZS4KICAgICBUaGlzIGNhbiB0aGVuIGJlIHVzZWQgdG8gYWRkIGV4dGVuc2lvbnMgdG8gdGhlIHJlcXVlc3QuCiAgICAgRGVsZXRlZCBPQ1NQX3JlcXVlc3RfbmV3KCksIHNpbmNlIG1vc3Qgb2YgaXRzIGZ1bmN0aW9uYWxpdHkKICAgICBpcyBub3cgaW4gT0NTUF9SRVFVRVNUX25ldygpIChhbmQgdGhlIGNhc2UgaW5zZW5zaXRpdmUgbmFtZQogICAgIGNsYXNoKSBhcGFydCBmcm9tIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgcmVxdWVzdCBuYW1lIHdoaWNoCiAgICAgd2lsbCBiZSBhZGRlZCBlbHNld2hlcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIE9DU1AgQVBJLiBSZW1vdmUgb2Jzb2xldGUgZXh0ZW5zaW9ucyBhcmd1bWVudCBmcm9tCiAgICAgdmFyaW91cyBmdW5jdGlvbnMuIEV4dGVuc2lvbnMgYXJlIG5vdyBoYW5kbGVkIHVzaW5nIHRoZSBuZXcKICAgICBPQ1NQIGV4dGVuc2lvbiBjb2RlLiBOZXcgc2ltcGxlIE9DU1AgSFRUUCBmdW5jdGlvbiB3aGljaCAKICAgICBjYW4gYmUgdXNlZCB0byBzZW5kIHJlcXVlc3RzIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzcgKFMvTUlNRSkgY29kZSB0byB3b3JrIHdpdGggbmV3IEFTTjEuIFR3byBuZXcKICAgICBBU04xX0lURU0gc3RydWN0dXJlcyBoZWxwIHdpdGggc2lnbiBhbmQgdmVyaWZ5LiBQS0NTN19BVFRSX1NJR04KICAgICB1c2VzIHRoZSBzcGVjaWFsIHJlb3JkZXIgdmVyc2lvbiBvZiBTRVQgT0YgdG8gc29ydCB0aGUgYXR0cmlidXRlcwogICAgIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2ggdGhlIGVuY29kZWQgb3JkZXIuIFRoaXMgcmVzb2x2ZXMgYSBsb25nCiAgICAgc3RhbmRpbmcgcHJvYmxlbTogYSB2ZXJpZnkgb24gYSBQS0NTNyBzdHJ1Y3R1cmUganVzdCBhZnRlciBzaWduaW5nCiAgICAgaXQgdXNlZCB0byBmYWlsIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBvcmRlciBkaWQgbm90IG1hdGNoIHRoZQogICAgIGVuY29kZWQgb3JkZXIuIFBLQ1M3X0FUVFJfVkVSSUZZIGRvZXMgbm90IHJlb3JkZXIgdGhlIGF0dHJpYnV0ZXM6CiAgICAgaXQgdXNlcyB0aGUgcmVjZWl2ZWQgb3JkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuCiAgICAgc29mdHdhcmUgdGhhdCBkb2VzIG5vdCBvcmRlciBTRVQgT0YuIFRoaXMgaXMgaGFuZGxlZCBieSBlbmNvZGluZwogICAgIGFzIGEgU0VRVUVOQ0UgT0YgYnV0IHVzaW5nIGltcGxpY2l0IHRhZ2dpbmcgKHdpdGggVU5JVkVSU0FMIGNsYXNzKQogICAgIHRvIHByb2R1Y2UgdGhlIHJlcXVpcmVkIFNFVCBPRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIG1rMW1mLnBsIGdlbmVyYXRlIHRoZSBtYWNyb3MgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTyBhbmQKICAgICBPUEVOU1NMX0JVSUxEX1NITElCU1NMIGFuZCB1c2UgdGhlbSBhcHByb3ByaWF0ZWx5IGluIHRoZSBoZWFkZXIKICAgICBmaWxlcyB0byBnZXQgY29ycmVjdCBkZWNsYXJhdGlvbnMgb2YgdGhlIEFTTi4xIGl0ZW0gdmFyaWFibGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgb2YgUEtDUyMxMiBjb2RlIHRvIHVzZSBuZXcgQVNOMSBmdW5jdGlvbmFsaXR5LiBSZXBsYWNlIG1hbnkKICAgICBQS0NTIzEyIG1hY3JvcyB3aXRoIHJlYWwgZnVuY3Rpb25zLiBGaXggdHdvIHVucmVsYXRlZCBBU04xIGJ1Z3M6CiAgICAgYXNuMV9jaGVja190bGVuKCkgd291bGQgc29tZXRpbWVzIGF0dGVtcHQgdG8gdXNlICdjdHgnIHdoZW4gaXQgd2FzCiAgICAgTlVMTCBhbmQgQVNOMV9UWVBFIHdhcyBub3QgZGVyZWZlcmVuY2VkIHByb3Blcmx5IGluIGFzbjFfZXhfYzJpKCkuCiAgICAgTmV3IEFTTjEgbWFjcm86IERFQ0xBUkVfQVNOMV9JVEVNKCkgd2hpY2gganVzdCBkZWNsYXJlcyB0aGUgcmVsZXZhbnQKICAgICBBU04xX0lURU0gYW5kIG5vIHdyYXBwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgb3IgQVNOMV9pdGVtX2QyaV9mcCgpIGFuZCBBU04xX2l0ZW1fZDJpX2JpbygpLiBUaGVzZQogICAgIHJlcGxhY2UgdGhlIG9sZCBmdW5jdGlvbiBwb2ludGVyIGJhc2VkIEkvTyByb3V0aW5lcy4gQ2hhbmdlIG1vc3Qgb2YKICAgICB0aGUgKl9kMmlfYmlvKCkgYW5kICpfZDJpX2ZwKCkgZnVuY3Rpb25zIHRvIHVzZSB0aGVzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIG1rZGVmLnBsIHRvIGJlIG1vcmUgYWNjZXB0aW5nIGFib3V0IHNwYWNpbmcgaW4gQyBwcmVwcm9jZXNzb3IKICAgICBsaW5lcywgcmVjb2duaWNlIG1vcmUgImFsZ29yaXRobXMiIHRoYXQgY2FuIGJlIGRlc2VsZWN0ZWQsIGFuZCBtYWtlCiAgICAgaXQgY29tcGxhaW4gYWJvdXQgYWxnb3JpdGhtIGRlc2VsZWN0aW9uIHRoYXQgaXNuJ3QgcmVjb2duaXNlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMgdG8gaGFuZGxlIGR1cCwgc2lnbiwgdmVyaWZ5LCBkaWdlc3QsIHBhY2sgYW5kCiAgICAgdW5wYWNrIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNLiBNb2RpZnkgZXhpc3Rpbmcgd3JhcHBlcnMKICAgICB0byB1c2UgbmV3IGZ1bmN0aW9ucy4gQWRkIE5PX0FTTjFfT0xEIHdoaWNoIGNhbiBiZSBzZXQgdG8gcmVtb3ZlCiAgICAgc29tZSBvbGQgc3R5bGUgQVNOMSBmdW5jdGlvbnM6IHRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9sZAogICAgIGNvZGUgd2lsbCBzdGlsbCB3b3JrIHdoZW4gdGhlc2UgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHRlbnNpb24gZnVuY3Rpb25zIGZvciBPQ1NQIHN0cnVjdHVyZXMsIHRoZXNlIGZvbGxvdyB0aGUKICAgICBzYW1lIGNvbnZlbnRpb25zIGFzIGNlcnRpZmljYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZDFfaTJkKCkuIFRoaXMgYXV0b21hdGljYWxseSBlbmNvZGVzIGFuZAogICAgIGFkZHMgYW4gZXh0ZW5zaW9uLiBJdHMgYmVoYXZpb3VyIGNhbiBiZSBjdXN0b21pc2VkIHdpdGggdmFyaW91cwogICAgIGZsYWdzIHRvIGFwcGVuZCwgcmVwbGFjZSBvciBkZWxldGUuIFZhcmlvdXMgd3JhcHBlcnMgYWRkZWQgZm9yCiAgICAgY2VydGlmY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIGF2b2lkIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgQVNOMSBwcmludCByb3V0aW5lIHdoZW4KICAgICBhbiBleHRlbnNpb24gY2Fubm90IGJlIHBhcnNlZC4gQ29ycmVjdCBhIHR5cG8gaW4gdGhlCiAgICAgT0NTUF9TRVJWSUNFTE9DIGV4dGVuc2lvbi4gVGlkeSB1cCBwcmludCBPQ1NQIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1rZGVmLnBsIHBhcnNlIHNvbWUgb2YgdGhlIEFTTjEgbWFjcm9zIGFuZCBhZGQgYXBwcm9wcmlhdGUKICAgICBlbnRyaWVzIGZvciB2YXJpYWJsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gYXBwcy9vcGVuc3NsLmMgZm9yIGRldGVjdGluZyBsb2NraW5nCiAgICAgcHJvYmxlbXM6IEFzIHRoZSBwcm9ncmFtIGlzIHNpbmdsZS10aHJlYWRlZCwgYWxsIHdlIGhhdmUKICAgICB0byBkbyBpcyByZWdpc3RlciBhIGxvY2tpbmcgY2FsbGJhY2sgdXNpbmcgYW4gYXJyYXkgZm9yCiAgICAgc3RvcmluZyB3aGljaCBsb2NrcyBhcmUgY3VycmVudGx5IGhlbGQgYnkgdGhlIHByb2dyYW0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGEgbG9jayBhcm91bmQgdGhlIGNhbGwgdG8gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoKSBpbgogICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX2lkeCgpLCB3aGljaCBpcyB1c2VkIGluCiAgICAgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCkgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZQogICAgIGR1cmluZyBUTFMvU1NMIGhhbmRzaGFrZXMgc28gdGhhdCB0aHJlYWQtc2FmZXR5IGlzIGVzc2VudGlhbC4KICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgZXhfZGF0YSBkZXNpZ24gaXMgbm90IGF0IGFsbCBzdWl0ZWQKICAgICBmb3IgbXVsdGktdGhyZWFkZWQgdXNlLCBzbyBpdCBwcm9iYWJseSBzaG91bGQgYmUgYWJvbGlzaGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIEJyb2FkY29tICJ1YnNlYyIgRU5HSU5FIHRvIE9wZW5TU0wuCiAgICAgW0Jyb2FkY29tLCB0d2Vha2VkIGFuZCBpbnRlZ3JhdGVkIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgTW92ZSBjb21tb24gZXh0ZW5zaW9uIHByaW50aW5nIGNvZGUgdG8gbmV3IGZ1bmN0aW9uCiAgICAgWDUwOVYzX3ByaW50X2V4dGVuc2lvbnMoKS4gUmVvcmdhbmlzZSBPQ1NQIHByaW50IHJvdXRpbmVzIGFuZAogICAgIGltcGxlbWVudCBzb21lIG5lZWRlZCBPQ1NQIEFTTjEgZnVuY3Rpb25zLiBBZGQgT0NTUCBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X3NpZ25hdHVyZV9wcmludCgpIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBpbiBzb21lCiAgICAgcHJpbnQgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc3BlY2lhbCBtZWFuaW5nIHdoZW4gU0VUIE9GIGFuZCBTRVFVRU5DRSBPRiBmbGFncyBhcmUgYm90aAogICAgIHNldCAodGhpcyB3YXMgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIGFzIFNFVCBPRiBwcmV2aW91c2x5KS4gVGhpcwogICAgIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgU1RBQ0sgcmVwcmVzZW50aW5nIHRoZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggdGhlCiAgICAgZW5jb2RpbmcuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdldCByb3VuZCBhIHByb2JsZW0gd2hlcmUgYSBQS0NTNwogICAgIHN0cnVjdHVyZSB3aGljaCB3YXMgc2lnbmVkIGNvdWxkIG5vdCBiZSB2ZXJpZmllZCBiZWNhdXNlIHRoZSBTVEFDSwogICAgIG9yZGVyIGRpZCBub3QgcmVmbGVjdCB0aGUgZW5jb2RlZCBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudCB0aGUgT0NTUCBBU04xIG1vZHVsZSB1c2luZyB0aGUgbmV3IGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBYNTA5VjMgY29kZSB0byBwZXJtaXQgdGhlIHVzZSBvZiBhbiBBU04xX0lURU0gc3RydWN0dXJlCiAgICAgZm9yIGl0cyBBU04xIG9wZXJhdGlvbnMuIFRoZSBvbGQgc3R5bGUgZnVuY3Rpb24gcG9pbnRlcnMgc3RpbGwgZXhpc3QKICAgICBmb3Igbm93IGJ1dCB0aGV5IHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIHJlcGxhY2VtZW50IEFTTjEgY29kZSBmcm9tIHRoZSBBU04xIGJyYW5jaC4gVGhpcyBhbG1vc3QKICAgICBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSBvbGQgQVNOMSBmdW5jdGlvbmFsaXR5IHdpdGggYSB0YWJsZSBkcml2ZW4KICAgICBlbmNvZGVyIGFuZCBkZWNvZGVyIHdoaWNoIGludGVycHJldHMgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZSBkZXNjcmliaW5nCiAgICAgdGhlIEFTTjEgbW9kdWxlLiBDb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIEFTTjEgQVBJIChpMmQsZDJpKSBpcwogICAgIGxhcmdlbHkgbWFpbnRhaW5lZC4gQWxtb3N0IGFsbCBvZiB0aGUgb2xkIGFzbjFfbWFjLmggbWFjcm8gYmFzZWQgQVNOMQogICAgIGhhcyBhbHNvIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgQk5fbW9kX2V4cF9yZWNwIHNvIHRoYXQgbmVnYXRpdmUgbW9kdWxpIGFyZSB0b2xlcmF0ZWQKICAgICAodGhlIHNpZ24gaXMgaWdub3JlZCkuICBTaW1pbGFybHksIGlnbm9yZSB0aGUgc2lnbiBpbiBCTl9NT05UX0NUWF9zZXQKICAgICBzbyB0aGF0IEJOX21vZF9leHBfbW9udCBhbmQgQk5fbW9kX2V4cF9tb250X3dvcmQgd29yawogICAgIGZvciBuZWdhdGl2ZSBtb2R1bGkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX3VhZGQgYW5kIEJOX3VzdWI6IEFsd2F5cyByZXR1cm4gbm9uLW5lZ2F0aXZlIHJlc3VsdHMgaW5zdGVhZAogICAgIG9mIG5vdCB0b3VjaGluZyB0aGUgcmVzdWx0J3Mgc2lnbiBiaXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fZGl2IGJ1Z2ZpeDogSWYgdGhlIHJlc3VsdCBpcyAwLCB0aGUgc2lnbiAocmVzLT5uZWcpIG11c3Qgbm90IGJlCiAgICAgc2V0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZWQgdGhlIExIQVNIIGNvZGUgdG8gdXNlIHByb3RvdHlwZXMgZm9yIGNhbGxiYWNrcywgYW5kIGNyZWF0ZWQKICAgICBtYWNyb3MgdG8gZGVjbGFyZSBhbmQgaW1wbGVtZW50IHRoaW4gKG9wdGlvbmFsbHkgc3RhdGljKSBmdW5jdGlvbnMKICAgICB0aGF0IHByb3ZpZGUgdHlwZS1zYWZldHkgYW5kIGF2b2lkIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdGluZyBmb3IgdGhlCiAgICAgdHlwZS1zcGVjaWZpYyBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkZWQgS2VyYmVyb3MgQ2lwaGVyIFN1aXRlcyB0byBiZSB1c2VkIHdpdGggVExTLCBhcyB3cml0dGVuIGluCiAgICAgUkZDIDI3MTIuCiAgICAgW1ZlZXJzIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+LCB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZWZvcm1hdCB0aGUgRkFRIHNvIHRoZSBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZCBhbnN3ZXJzIGNhbiBiZSBkaXZpZGVkCiAgICAgaW4gc2VjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzdWJqZWN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIHpsaWIgY29tcHJlc3Npb24gY29kZSBsb2FkIFpMSUIuRExMIGR5bmFtaWNhbGx5IHVuZGVyCiAgICAgV2luZG93cy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX3NxcnQgZm9yIGNvbXB1dGluZyBzcXVhcmUgcm9vdHMgbW9kdWxvIGEgcHJpbWUKICAgICAodXNpbmcgdGhlIHByb2JhYmlsaXN0aWMgVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIHVubGVzcwogICAgIHAgPT0gMyAobW9kIDQpICBvciAgcCA9PSA1IChtb2QgOCksICB3aGljaCBhcmUgY2FzZXMgdGhhdCBjYW4KICAgICBiZSBoYW5kbGVkIGRldGVybWluaXN0aWNhbGx5KS4KICAgICBbTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBCTl9tb2RfaW52ZXJzZSBmYXN0ZXIgYnkgZXhwbGljaXRseSBoYW5kbGluZyBzbWFsbCBxdW90aWVudHMKICAgICBpbiB0aGUgRXVjbGlkIGxvb3AuIChTcGVlZCBnYWluIGFib3V0IDIwJSBmb3Igc21hbGwgbW9kdWxpIFsyNTYgb3IKICAgICA1MTIgYml0c10sIGFib3V0IDMwJSBmb3IgbGFyZ2VyIG9uZXMgWzEwMjQgb3IgMjA0OCBiaXRzXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2tyb25lY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fZ2NkIHNvIHRoYXQgaXQgd29ya3Mgb24gbmVnYXRpdmUgaW5wdXRzOyB0aGUgcmVzdWx0IGlzCiAgICAgcG9zaXRpdmUgdW5sZXNzIGJvdGggcGFyYW1ldGVycyBhcmUgemVyby4KICAgICBQcmV2aW91c2x5IHNvbWV0aGluZyByZWFzb25hYmx5IGNsb3NlIHRvIGFuIGluZmluaXRlIGxvb3Agd2FzCiAgICAgcG9zc2libGUgYmVjYXVzZSBudW1iZXJzIGNvdWxkIGJlIGdyb3dpbmcgaW5zdGVhZCBvZiBzaHJpbmtpbmcKICAgICBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRXVjbGlkJ3MgYWxnb3JpdGhtLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9pc193b3JkKCkgYW5kIEJOX2lzX29uZSgpIG1hY3JvcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUKICAgICBzaWduIG9mIHRoZSBudW1iZXIgaW4gcXVlc3Rpb24uCgogICAgIEZpeCBCTl9pc193b3JkKGEsdykgdG8gd29yayBjb3JyZWN0bHkgZm9yIHcgPT0gMC4KCiAgICAgVGhlIG9sZCBCTl9pc193b3JkKGEsdykgbWFjcm8gaXMgbm93IGNhbGxlZCBCTl9hYnNfaXNfd29yZChhLHcpCiAgICAgYmVjYXVzZSBpdHMgdGVzdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgJ2EnIGVxdWFscyAndycuCiAgICAgTm90ZSB0aGF0IEJOX2Fic19pc193b3JkIGRvZXMgKm5vdCogaGFuZGxlIHcgPT0gMCByZWxpYWJseTsKICAgICBpdCBleGlzdHMgbW9zdGx5IGZvciB1c2UgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBCTl9pc196ZXJvKCksCiAgICAgQk5faXNfb25lKCksIGFuZCBCTl9pc193b3JkKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3N3YXAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIEJOX25ubW9kIGluc3RlYWQgb2YgQk5fbW9kIGluIGNyeXB0by9ibi9ibl9leHAuYyBzbyB0aGF0CiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIGZ1bmN0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gcHJvZHVjZSByZWFzb25hYmxlCiAgICAgcmVzdWx0cyBvbiBuZWdhdGl2ZSBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIEJOX21vZF9tdWwgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCiAgICAgUHJldmlvdXNseSwgaXQgY291bGQgYmUgbmVnYXRpdmUgaWYgb25lIG9mIHRoZSBmYWN0b3JzIHdhcyBuZWdhdGl2ZTsKICAgICBJIGRvbid0IHRoaW5rIGFueW9uZSByZWFsbHkgd2FudGVkIHRoYXQgYmVoYXZpb3VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgQk5fbW9kXy4uLiBmdW5jdGlvbnMgaW50byBuZXcgZmlsZSBjcnlwdG8vYm4vYm5fbW9kLmMKICAgICAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX2V4cC5jLAogICAgIGFuZCBCTl9tb2RfbXVsX3JlY2lwcm9jYWwsIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9yZWNwLmMpCiAgICAgYW5kIGFkZCBuZXcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX25ubW9kCiAgICAgICAgICBCTl9tb2Rfc3FyCiAgICAgICAgICBCTl9tb2RfYWRkCiAgICAgICAgICBCTl9tb2RfYWRkX3F1aWNrCiAgICAgICAgICBCTl9tb2Rfc3ViCiAgICAgICAgICBCTl9tb2Rfc3ViX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MQogICAgICAgICAgQk5fbW9kX2xzaGlmdDFfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQKICAgICAgICAgIEJOX21vZF9sc2hpZnRfcXVpY2sKCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBnZW5lcmF0ZSBub24tbmVnYXRpdmUgcmVzdWx0cy4KCiAgICAgQk5fbm5tb2Qgb3RoZXJ3aXNlIGlzIGxpa2UgQk5fbW9kIChpZiBCTl9tb2QgY29tcHV0ZXMgYSByZW1haW5kZXIgIHIKICAgICBzdWNoIHRoYXQgIHxtfCA8IHIgPCAwLCAgQk5fbm5tb2Qgd2lsbCBvdXRwdXQgIHJlbSArIHxtfCAgaW5zdGVhZCkuCgogICAgIEJOX21vZF9YWFhfcXVpY2sociwgYSwgW2IsXSBtKSBnZW5lcmF0ZXMgdGhlIHNhbWUgcmVzdWx0IGFzCiAgICAgQk5fbW9kX1hYWChyLCBhLCBbYixdIG0sIGN0eCksIGJ1dCByZXF1aXJlcyB0aGF0ICBhICBbYW5kICBiXQogICAgIGJlIHJlZHVjZWQgbW9kdWxvICBtLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKI2lmIDAKICAgICBUaGUgZm9sbG93aW5nIGVudHJ5IGFjY2lkZW50YWxseSBhcHBlYXJlZCBpbiB0aGUgQ0hBTkdFUyBmaWxlCiAgICAgZGlzdHJpYnV0ZWQgd2l0aCBPcGVuU1NMIDAuOS43LiAgVGhlIG1vZGlmaWNhdGlvbnMgZGVzY3JpYmVkIGluCiAgICAgaXQgZG8gKm5vdCogYXBwbHkgdG8gT3BlblNTTCAwLjkuNy4KCiAgKikgUmVtb3ZlIGEgZmV3IGNhbGxzIHRvIGJuX3dleHBhbmQoKSBpbiBCTl9zcXIoKSAodGhlIG9uZSBpbiB0aGVyZQogICAgIHdhcyBhY3R1YWxseSBuZXZlciBuZWVkZWQpIGFuZCBpbiBCTl9tdWwoKS4gIFRoZSByZW1vdmFsIGluIEJOX211bCgpCiAgICAgcmVxdWlyZWQgYSBzbWFsbCBjaGFuZ2UgaW4gYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCkgYW5kIHRoZSBhZGRpdGlvbgogICAgIG9mIHRoZSBmdW5jdGlvbnMgYm5fY21wX3BhcnRfd29yZHMoKSwgYm5fc3ViX3BhcnRfd29yZHMoKSBhbmQKICAgICBibl9hZGRfcGFydF93b3JkcygpLCB3aGljaCBkbyB0aGUgc2FtZSB0aGluZyBhcyBibl9jbXBfd29yZHMoKSwKICAgICBibl9zdWJfd29yZHMoKSBhbmQgYm5fYWRkX3dvcmRzKCkgZXhjZXB0IHRoZXkgdGFrZSBhcnJheXMgd2l0aAogICAgIGRpZmZlcmluZyBzaXplcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQojZW5kaWYKCiAgKikgSW4gJ29wZW5zc2wgcGFzc3dkJywgdmVyaWZ5IHBhc3N3b3JkcyByZWFkIGZyb20gdGhlIHRlcm1pbmFsCiAgICAgdW5sZXNzIHRoZSAnLXNhbHQnIG9wdGlvbiBpcyB1c2VkICh3aGljaCB1c3VhbGx5IG1lYW5zIHRoYXQKICAgICB2ZXJpZmljYXRpb24gd291bGQganVzdCB3YXN0ZSB1c2VyJ3MgdGltZSBzaW5jZSB0aGUgcmVzdWx0aW5nCiAgICAgaGFzaCBpcyBnb2luZyB0byBiZSBjb21wYXJlZCB3aXRoIHNvbWUgZ2l2ZW4gcGFzc3dvcmQgaGFzaCkKICAgICBvciB0aGUgbmV3ICctbm92ZXJpZnknIG9wdGlvbiBpcyB1c2VkLgoKICAgICBUaGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBpdCBkb2VzIG5vdCBhZmZlY3QKICAgICBub24taW50ZXJhY3RpdmUgdXNlIG9mICdvcGVuc3NsIHBhc3N3ZCcgKHBhc3N3b3JkcyBvbiB0aGUgY29tbWFuZAogICAgIGxpbmUsICctc3RkaW4nIG9wdGlvbiwgJy1pbiAuLi4nIG9wdGlvbikgYW5kIHRodXMgc2hvdWxkIG5vdAogICAgIGNhdXNlIGFueSBwcm9ibGVtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gUlNBcmVmLCBzaW5jZSB0aGVyZSdzIG5vIG1vcmUgbmVlZCBmb3IgaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBEU08gbG9hZCBhbG9uZyBhIHBhdGggZ2l2ZW4gdGhyb3VnaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgIChTSExJQl9QQVRIKSB3aXRoIHNobF9sb2FkKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEVOR0lORSBjb2RlIGFzIGEgcmVzdWx0IG9mIEJJR05VTSBjb25zdGlmaWNhdGlvbi4KICAgICBBbHNvIGNvbnN0aWZ5IHRoZSBSU0EgY29kZSBhbmQgbW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpdC4gIEluIGEKICAgICBmZXcgcGxhY2VzLCBtb3N0IG5vdGFibGUgaW4gdGhlIGRlcHRoIG9mIHRoZSBBU04uMSBjb2RlLCB1Z2x5CiAgICAgY2FzdHMgYmFjayB0byBub24tY29uc3Qgd2VyZSByZXF1aXJlZCAodG8gYmUgc29sdmVkIGF0IGEgbGF0ZXIKICAgICB0aW1lKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgc28gdGhlIG9wZW5zc2wgYXBwbGljYXRpb24gaGFzIGFsbCBlbmdpbmVzIGxvYWRlZCBieSBkZWZhdWx0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBCSUdOVU0gcm91dGluZXMgYSBsaXR0bGUgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgoJRU5HSU5FX2xvYWRfY3N3aWZ0KCkKCUVOR0lORV9sb2FkX2NoaWwoKQoJRU5HSU5FX2xvYWRfYXRhbGxhKCkKCUVOR0lORV9sb2FkX251cm9uKCkKCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpCgogICAgIFRoYXQgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gaXRzZWxmIGNob29zZSBpZiBleHRlcm5hbCBlbmdpbmVzIHRoYXQKICAgICBhcmUgYnVpbHQtaW4gaW4gT3BlblNTTCBzaGFsbCBldmVyIGJlIHVzZWQgb3Igbm90LiAgVGhlIGJlbmVmaXQgaXMKICAgICB0aGF0IGFwcGxpY2F0aW9ucyB3b24ndCBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGxpYmRsIG9yIG90aGVyIGRzbwogICAgIGxpYnJhcmllcyB1bmxlc3MgaXQncyByZWFsbHkgbmVlZGVkLgoKICAgICBDaGFuZ2VkICdvcGVuc3NsIGVuZ2luZScgdG8gbG9hZCBhbGwgZW5naW5lcyBvbiBkZW1hbmQuCiAgICAgQ2hhbmdlZCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2Ygc29tZQogICAgIGRlY2xhcmF0aW9ucyAodGhleSBkaWZmZXJlZCEpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopICdvcGVuc3NsIGVuZ2luZScgY2FuIG5vdyBsaXN0IGNhcGFiaWxpdGllcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluICdvcGVuc3NsIGVuZ2luZScuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV2ZXIgY2FsbCBsb2FkX2RoX3BhcmFtKE5VTEwpIGluIHNfc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBlbmdpbmUgYXBwbGljYXRpb24uICBJdCBjYW4gY3VycmVudGx5IGxpc3QgZW5naW5lcyBieSBuYW1lIGFuZAogICAgIGlkZW50aXR5LCBhbmQgdGVzdCBpZiB0aGV5IGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW1wcm92ZSBSUE0gc3BlY2lmaWNhdGlvbiBmaWxlIGJ5IGZvcmNpbmcgc3ltYm9saWMgbGlua2luZyBhbmQgbWFraW5nCiAgICAgc3VyZSB0aGUgaW5zdGFsbGVkIGRvY3VtZW50YXRpb24gaXMgYWxzbyBvd25lZCBieSByb290LnJvb3QuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIEdpdmUgdGhlIE9wZW5TU0wgYXBwbGljYXRpb25zIG1vcmUgcG9zc2liaWxpdGllcyB0byBtYWtlIHVzZSBvZgogICAgIGtleXMgKHB1YmxpYyBhcyB3ZWxsIGFzIHByaXZhdGUpIGhhbmRsZWQgYnkgZW5naW5lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgT0NTUCBjb2RlIHRoYXQgY29tZXMgZnJvbSBDZXJ0Q28uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIFZNUyBzdXBwb3J0IGZvciB0aGUgUmlqbmRhZWwgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCB1bnRlc3RlZCBzdXBwb3J0IGZvciBOdXJvbiBjcnlwdG8gYWNjZWxlcmF0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBjcnlwdG9ncmFwaGljIGRldmljZXMuICBUaGlzIGNvZGUgd2FzCiAgICAgcHJldmlvdXNseSBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGFzIHRoZSAiZW5naW5lIiBicmFuY2guCiAgICAgW0dlb2ZmIFRob3JwZSwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdvcmsgdGhlIGZpbGVuYW1lLXRyYW5zbGF0aW9uIGluIHRoZSBEU08gY29kZS4gSXQgaXMgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSBmYXIgZ3JlYXRlciBjb250cm9sIG92ZXIgaG93IGEgIm5hbWUiIGlzIHR1cm5lZCBpbnRvIGEgZmlsZW5hbWUKICAgICBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBhbmQgYW55IG9kZGl0aWVzIGFib3V0IHRoZQogICAgIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyeSBmaWxlbmFtZXMgb24gZWFjaCBzeXN0ZW0uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCB0aHJlYWRzIG9uIEZyZWVCU0QtZWxmIGluIENvbmZpZ3VyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIFNIQTEgYXNzZW1ibHkgcHJvYmxlbSB3aXRoIE1BU006IGl0IHByb2R1Y2VzCiAgICAgd2FybmluZ3MgYWJvdXQgY29ycnVwdCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGVuIGFzc2VtYmxpbmcKICAgICB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBpcyBjYXVzZWQgYnkgdGhlIG92ZXJsYXBwaW5nCiAgICAgb2YgdHdvIHNlY3Rpb25zLgogICAgIFtCZXJuZCBNYXR0aGVzIDxtYWluYnVnQGNlbG9jb20uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIE5DT05GIGNoYW5nZXMuCiAgICAgTkNPTkZfZ2V0X251bWJlcigpIGhhcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwuICBBcyBhIHJlcGxhY2VtZW50LAogICAgIE5DT05GX2dldF9udW1iZXJfZSgpIGlzIGRlZmluZWQgKF9lIGZvciAiZXJyb3IgY2hlY2tpbmciKSBhbmQgaXMKICAgICBwcm9tb3RlZCBzdHJvbmdseS4gIFRoZSBvbGQgTkNPTkZfZ2V0X251bWJlciBpcyBrZXB0IGFyb3VuZCBmb3IKICAgICBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICBNYWtlIGl0IHBvc3NpYmxlIGZvciBtZXRob2RzIHRvIGxvYWQgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIEJJTywKICAgICBieSBwcm92aWRpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgaXMgZ2l2ZW4gYSBuYW1lIGluc3RlYWQgb2YgYSBCSU8uCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGFuCiAgICAgTERBUCBzZXJ2ZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBub24gYmxvY2tpbmcgYWNjZXB0IEJJT3MuIEFkZGVkIG5ldyBJL08gc3BlY2lhbCByZWFzb24KICAgICBCSU9fUlJfQUNDRVBUIHRvIGNvdmVyIHRoaXMgY2FzZS4gUHJldmlvdXNseSB1c2Ugb2YgYWNjZXB0IEJJT3MKICAgICB3aXRoIG5vbiBibG9ja2luZyBJL08gd2FzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIG5vIHJldHJ5IGNvZGUgd2FzCiAgICAgaW1wbGVtZW50ZWQuIEFsc28gYWRkZWQgbmV3IFNTTCBjb2RlIFNTTF9XQU5UX0FDQ0VQVCB0byBjb3ZlcgogICAgIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgYmVnaW5uaW5ncyBvZiBSaWpuZGFlbCBzdXBwb3J0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBEaXJlY3RvcnlTdHJpbmcgbWFzayBzZXR0aW5nLiBBZGQgc3VwcG9ydCBmb3IKICAgICBYNTA5X05BTUVfcHJpbnRfZXgoKSBpbiAncmVxJyBhbmQgWDUwOV9wcmludF9leCgpIGZ1bmN0aW9uCiAgICAgdG8gYWxsb3cgY2VydGlmaWNhdGUgcHJpbnRpbmcgdG8gbW9yZSBjb250cm9sbGFibGUsIGFkZGl0aW9uYWwKICAgICAnY2VydG9wdCcgb3B0aW9uIHRvICd4NTA5JyB0byBhbGxvdyBuZXcgcHJpbnRpbmcgb3B0aW9ucyB0byBiZQogICAgIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiBvbGQgRUFZIE1ENSBoYWNrIGZyb20gZV9vcy5oLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42bCBhbmQgMC45LjZtICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZAogICAgIGJ5IHVzaW5nIHRoZSBDb2Rlbm9taWNvbiBUTFMgVGVzdCBUb29sIChDVkUtMjAwNC0wMDc5KQogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZrIGFuZCAwLjkuNmwgIFswNCBOb3YgMjAwM10KCiAgKikgRml4IGFkZGl0aW9uYWwgYnVnIHJldmVhbGVkIGJ5IHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIGJ1ZyB0cmlnZ2VyaW5nIGxhcmdlIHJlY3Vyc2lvbiB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgY2VydGFpbiBBU04uMSB0YWdzIChDVkUtMjAwMy0wODUxKQogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aiBhbmQgMC45LjZrICBbMzAgU2VwIDIwMDNdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmV2ZWFsZWQgYnkgcnVubmluZyB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBBU04xIGNvZGUgd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGludmFsaWQgdGFncyAoQ1ZFLTIwMDMtMDU0MyBhbmQgQ1ZFLTIwMDMtMDU0NCkuCiAgICAgCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2FjY2VwdCgpIChzc2wvczNfc3J2ci5jKSBvbmx5IGFjY2VwdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIG9uZTogYXMgc3RhdGVkIGluIFRMUyAxLjAgYW5kIFNTTCAzLjAKICAgICBzcGVjaWZpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKSAoc3NsL3MzX3NydnIuYyksIHRvbGVyYXRlIGFkZGl0aW9uYWwKICAgICBleHRyYSBkYXRhIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBvbmx5IGZvciBUTFMgMS4wCiAgICAgYnV0IGFsc28gZm9yIFNTTCAzLjAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hdHRoaWFzIExvZXBmZV0KCiAgKikgQ2hhbmdlIFg1MDlfY2VydGlmaWNhdGVfdHlwZSgpIHRvIG1hcmsgdGhlIGtleSBhcyBleHBvcnRlZC9leHBvcnRhYmxlCiAgICAgd2hlbiBpdCdzIDUxMiAqYml0cyogbG9uZywgbm90IDUxMiBieXRlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmkgYW5kIDAuOS42aiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS42aSAgWzE5IEZlYiAyMDAzXQoKICAqKSBJbiBzc2wzX2dldF9yZWNvcmQgKHNzbC9zM19wa3QuYyksIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZAogICAgIHZpYSB0aW1pbmcgYnkgcGVyZm9ybWluZyBhIE1BQyBjb21wdXRhdGlvbiBldmVuIGlmIGluY29ycnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmcgYW5kIDAuOS42aCAgWzUgRGVjIDIwMDJdCgogICopIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2NsZWFuc2UoKSwgd2hpY2ggaXMgdXNlZCB0byBjbGVhbnNlIGEgc2VjdGlvbiBvZgogICAgIG1lbW9yeSBmcm9tIGl0J3MgY29udGVudHMuICBUaGlzIGlzIGRvbmUgd2l0aCBhIGNvdW50ZXIgdGhhdCB3aWxsCiAgICAgcGxhY2UgYWx0ZXJuYXRpbmcgdmFsdWVzIGluIGVhY2ggYnl0ZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc29sdmUKICAgICB0d28gaXNzdWVzOiAxKSB0aGUgcmVtb3ZhbCBvZiBjYWxscyB0byBtZW1zZXQoKSBieSBoaWdobHkgb3B0aW1pemluZwogICAgIGNvbXBpbGVycywgYW5kIDIpIGNsZWFuc2luZyB3aXRoIG90aGVyIHZhbHVlcyB0aGFuIDAsIHNpbmNlIHRob3NlIGNhbgogICAgIGJlIHJlYWQgdGhyb3VnaCBvbiBjZXJ0YWluIG1lZGlhLCBmb3IgZXhhbXBsZSBhIHN3YXAgc3BhY2Ugb24gZGlzay4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBCdWdmaXg6IGNsaWVudCBzaWRlIHNlc3Npb24gY2FjaGluZyBkaWQgbm90IHdvcmsgd2l0aCBleHRlcm5hbCBjYWNoaW5nLAogICAgIGJlY2F1c2UgdGhlIHNlc3Npb24tPmNpcGhlciBzZXR0aW5nIHdhcyBub3QgcmVzdG9yZWQgd2hlbiByZWxvYWRpbmcKICAgICBmcm9tIHRoZSBleHRlcm5hbCBjYWNoZS4gVGhpcyBwcm9ibGVtIHdhcyBtYXNrZWQsIHdoZW4KICAgICBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgKHBhcnQgb2YgU1NMX09QX0FMTCkgd2FzIHNldC4KICAgICAoRm91bmQgYnkgU3RldmUgSGFzbGFtIDxzdGV2ZUBhcmFxbmlkLmRkdHMubmV0Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBjbGllbnRfY2VydGlmaWNhdGUgKHNzbC9zMl9jbG50LmMpOiBUaGUgcGVybWlzc2libGUgdG90YWwKICAgICBsZW5ndGggb2YgdGhlIFJFUVVFU1QtQ0VSVElGSUNBVEUgbWVzc2FnZSBpcyAxOCAuLiAzNCwgbm90IDE3IC4uIDMzLgogICAgIFtaZWV2IExpZWJlciA8emVldi1sQHlhaG9vLmNvbT5dCgogICopIFVuZG8gYW4gdW5kb2N1bWVudGVkIGNoYW5nZSBpbnRyb2R1Y2VkIGluIDAuOS42ZSB3aGljaCBjYXVzZWQKICAgICByZXBlYXRlZCBjYWxscyB0byBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpIGFuZCAKICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpIHRvIGJlIGlnbm9yZWQsIGV2ZW4gYWZ0ZXIgY2FsbGluZwogICAgIEVWUF9jbGVhbnVwKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcmVhZGVyIHRvIGRlYWwgd2l0aCBsYXN0IGxpbmUgbm90CiAgICAgYmVpbmcgcHJvcGVybHkgdGVybWluYXRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgWDUwOV9OQU1FX2NtcCgpIHNvIGl0IGFwcGxpZXMgdGhlIHNwZWNpYWwgcnVsZXMgb24gaGFuZGxpbmcKICAgICBETiB2YWx1ZXMgdGhhdCBhcmUgb2YgdHlwZSBQcmludGFibGVTdHJpbmcsIGFzIHdlbGwgYXMgUkROcyBvZiB0eXBlCiAgICAgZW1haWxBZGRyZXNzIHdoZXJlIHRoZSB2YWx1ZSBoYXMgdGhlIHR5cGUgaWE1U3RyaW5nLgogICAgIFtzdGVmYW5rQHZhbGljZXJ0LmNvbSB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgYSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSBmbGFnIHRvIHRha2Ugb3ZlciBoYWxmCiAgICAgdGhlIGpvYiBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVAgd2FzIGluY29uc2lzdGVudGx5CiAgICAgZG9pbmcsIGRlZmluZSBhIG5ldyBmbGFnIChTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTCkgdG8gYmUKICAgICB0aGUgYml0d2lzZS1PUiBvZiB0aGUgdHdvIGZvciB1c2UgYnkgdGhlIG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucwogICAgIHdhbnRpbmcgdGhpcyBiZWhhdmlvdXIsIGFuZCB1cGRhdGUgdGhlIGRvY3MuIFRoZSBkb2N1bWVudGVkCiAgICAgYmVoYXZpb3VyIGFuZCBhY3R1YWwgYmVoYXZpb3VyIHdlcmUgaW5jb25zaXN0ZW50IGFuZCBoYWQgYmVlbgogICAgIGNoYW5naW5nIGFueXdheSwgc28gdGhpcyBpcyBtb3JlIGEgYnVnLWZpeCB0aGFuIGEgYmVoYXZpb3VyYWwKICAgICBjaGFuZ2UuCiAgICAgW0dlb2ZmIFRob3JwZSwgZGlhZ25vc2VkIGJ5IE5hZGF2IEhhcidFbF0KCiAgKikgRG9uJ3QgaW1wb3NlIGEgMTYtYnl0ZSBsZW5ndGggbWluaW11bSBvbiBzZXNzaW9uIElEcyBpbiBzc2wvczNfY2xudC5jCiAgICAgKHRoZSBTU0wgMy4wIGFuZCBUTFMgMS4wIHNwZWNpZmljYXRpb25zIGFsbG93IGFueSBsZW5ndGggdXAgdG8gMzIgYnl0ZXMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBpbml0aWFsaXphdGlvbiBjb2RlIHJhY2UgY29uZGl0aW9ucyBpbgogICAgICAgIFNTTHYyM19tZXRob2QoKSwgIFNTTHYyM19jbGllbnRfbWV0aG9kKCksICAgU1NMdjIzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2Ml9tZXRob2QoKSwgICBTU0x2Ml9jbGllbnRfbWV0aG9kKCksICAgIFNTTHYyX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2M19tZXRob2QoKSwgICBTU0x2M19jbGllbnRfbWV0aG9kKCksICAgIFNTTHYzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBUTFN2MV9tZXRob2QoKSwgICBUTFN2MV9jbGllbnRfbWV0aG9kKCksICAgIFRMU3YxX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBzc2wyX2dldF9jaXBoZXJfYnlfY2hhcigpLAogICAgICAgIHNzbDNfZ2V0X2NpcGhlcl9ieV9jaGFyKCkuCiAgICAgW1BhdHJpY2sgTWNDb3JtaWNrIDxwYXRyaWNrQHRlbGxtZS5jb20+LCBCb2RvIE1vZWxsZXJdCgogICopIFJlb3JkZXIgY2xlYW51cCBzZXF1ZW5jZSBpbiBTU0xfQ1RYX2ZyZWUoKTogb25seSByZW1vdmUgdGhlIGV4X2RhdGEgYWZ0ZXIKICAgICB0aGUgY2FjaGVkIHNlc3Npb25zIGFyZSBmbHVzaGVkLCBhcyB0aGUgcmVtb3ZlX2NiKCkgbWlnaHQgdXNlIGV4X2RhdGEKICAgICBjb250ZW50cy4gQnVnIGZvdW5kIGJ5IFNhbSBWYXJzaGF2Y2hpayA8bXJzYW1AY291cmllci1tdGEuY29tPgogICAgIChzZWUgW29wZW5zc2wub3JnICMyMTJdKS4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggdHlwbyBpbiBPQkpfdHh0Mm9iaiB3aGljaCBpbmNvcnJlY3RseSBwYXNzZWQgdGhlIGNvbnRlbnQKICAgICBsZW5ndGgsIGluc3RlYWQgb2YgdGhlIGVuY29kaW5nIGxlbmd0aCB0byBkMmlfQVNOMV9PQkpFQ1QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZmIGFuZCAwLjkuNmcgIFs5IEF1ZyAyMDAyXQoKICAqKSBbSW4gMC45LjZnLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggY3J5cHRvL2VuZ2luZS92ZW5kb3JfZGVmbnMvY3N3aWZ0LmggZm9yIFdJTjMyICh1c2UgJ19zdGRjYWxsJykuCiAgICAgW0x5bm4gR2F6aXMgPGxnYXppc0ByYWluYm93LmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZSBhbmQgMC45LjZmICBbOCBBdWcgMjAwMl0KCiAgKikgRml4IEFTTjEgY2hlY2tzLiBDaGVjayBmb3Igb3ZlcmZsb3cgYnkgY29tcGFyaW5nIHdpdGggTE9OR19NQVgKICAgICBhbmQgZ2V0IGZpeCB0aGUgaGVhZGVyIGxlbmd0aCBjYWxjdWxhdGlvbi4KICAgICBbRmxvcmlhbiBXZWltZXIgPFdlaW1lckBDRVJULlVuaS1TdHV0dGdhcnQuREU+LAoJQWxvbiBLYW50b3IgPGFsb25rQGNoZWNrcG9pbnQuY29tPiAoYW5kIG90aGVycyksCglTdGV2ZSBIZW5zb25dCgogICopIFVzZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgaW5zdGVhZCBvZiAnYXNzZXJ0aW9ucycgaW4gYnVmZmVyCiAgICAgb3ZlcmZsb3cgY2hlY2tzIGFkZGVkIGluIDAuOS42ZS4gIFRoaXMgcHJldmVudHMgRG9TICh0aGUKICAgICBhc3NlcnRpb25zIGNvdWxkIGNhbGwgYWJvcnQoKSkuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT4sIEJvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZkIGFuZCAwLjkuNmUgIFszMCBKdWwgMjAwMl0KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLgogICAgIFtTdGV2ZSBIZW5zb24sIEFkaSBTdGF2IDxzdGF2QG1lcmN1cnkuY28uaWw+LCBKYW1lcyBZb25hbiA8amltQG50bHAuY29tPl0KCiAgKikgRml4IGNpcGhlciBzZWxlY3Rpb24gcm91dGluZXM6IGNpcGhlcnMgd2l0aG91dCBlbmNyeXB0aW9uIGhhZCBubyBmbGFncwogICAgIGZvciB0aGUgY2lwaGVyIHN0cmVuZ3RoIHNldCBhbmQgd2hlcmUgdGhlcmVmb3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseQogICAgIGJ5IHRoZSBzZWxlY3Rpb24gcm91dGluZXMgKFBSICMxMzApLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggRVZQX2RzYV9zaGEgbWFjcm8uCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBOZXcgb3B0aW9uCiAgICAgICAgICBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTCiAgICAgZm9yIGRpc2FibGluZyB0aGUgU1NMIDMuMC9UTFMgMS4wIENCQyB2dWxuZXJhYmlsaXR5IGNvdW50ZXJtZWFzdXJlCiAgICAgdGhhdCB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuNmQuCgogICAgIEFzIHRoZSBjb3VudGVybWVhc3VyZSB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIHNvbWUKICAgICBicm9rZW4gU1NMIGltcGxlbWVudGF0aW9ucywgdGhlIG5ldyBvcHRpb24gaXMgcGFydCBvZiBTU0xfT1BfQUxMLgogICAgIFNTTF9PUF9BTEwgaXMgdXN1YWxseSBlbXBsb3llZCB3aGVuIGNvbXBhdGliaWxpdHkgd2l0aCB3ZWlyZCBTU0wKICAgICBpbXBsZW1lbnRhdGlvbnMgaXMgZGVzaXJlZCAoZS5nLiAnLWJ1Z3MnIG9wdGlvbiB0byAnc19jbGllbnQnIGFuZAogICAgICdzX3NlcnZlcicpLCBzbyB0aGUgbmV3IG9wdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHNldCBpbiBtYW55CiAgICAgYXBwbGljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZXMgaW4gc2VjdXJpdHkgcGF0Y2g6CgogICAgIENoYW5nZXMgbWFya2VkICIoQ0hBVFMpIiB3ZXJlIHNwb25zb3JlZCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZAogICAgIFJlc2VhcmNoIFByb2plY3RzIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwKICAgICBBaXIgRm9yY2UgTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlcgogICAgIEYzMDYwMi0wMS0yLTA1MzcuCgogICopIEFkZCB2YXJpb3VzIHNhbml0eSBjaGVja3MgdG8gYXNuMV9nZXRfbGVuZ3RoKCkgdG8gcmVqZWN0CiAgICAgdGhlIEFTTjEgbGVuZ3RoIGJ5dGVzIGlmIHRoZXkgZXhjZWVkIHNpemVvZihsb25nKSwgd2lsbCBhcHBlYXIKICAgICBuZWdhdGl2ZSBvciB0aGUgY29udGVudCBsZW5ndGggZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZQogICAgIHN1cHBsaWVkIGJ1ZmZlci4gKENWRS0yMDAyLTA2NTkpCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBBc3NlcnRpb25zIGZvciB2YXJpb3VzIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3dzLCBub3Qga25vd24gdG8KICAgICBoYXBwZW4gaW4gcHJhY3RpY2UuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgVmFyaW91cyB0ZW1wb3JhcnkgYnVmZmVycyB0byBob2xkIEFTQ0lJIHZlcnNpb25zIG9mIGludGVnZXJzIHdlcmUKICAgICB0b28gc21hbGwgZm9yIDY0IGJpdCBwbGF0Zm9ybXMuIChDVkUtMjAwMi0wNjU1KQogICAgIFtNYXR0aGV3IEJ5bmctTWFkZGljayA8bWJtQGFsZGlnaXRhbC5jby51az4gYW5kIEJlbiBMYXVyaWUgKENIQVRTKT4KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wzIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIHNlc3Npb24gSUQgdG8gYSBjbGllbnQuIChDVkUtMjAwMi0wNjU2KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMiBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBjbGllbnQgbWFzdGVyIGtleS4gKENWRS0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZjIGFuZCAwLjkuNmQgIFs5IE1heSAyMDAyXQoKICAqKSBGaXggY3J5cHRvL2FzbjEvYV9zaWduLmMgc28gdGhhdCAncGFyYW1ldGVycycgaXMgb21pdHRlZCAobm90CiAgICAgZW5jb2RlZCBhcyBOVUxMKSB3aXRoIGlkLWRzYS13aXRoLXNoYTEuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+OyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hlY2sgdmFyaW91cyBYNTA5Xy4uLigpIHJldHVybiB2YWx1ZXMgaW4gYXBwcy9yZXEuYy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEZpeCBCQVNFNjQgZGVjb2RlIChFVlBfRGVjb2RlVXBkYXRlKSBmb3IgZGF0YSB3aXRoIENSL0xGIGVuZGVkIGxpbmVzOgogICAgIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiB3b3VsZCBlcnJvbm91c2x5IGJlIGZsYWdnZWQsIHdoZW4gdGhlIENSTEYKICAgICB3YXMganVzdCBhdCB0aGUgZW5kIG9mIGEgcHJvY2Vzc2VkIGJsb2NrLiBUaGUgYnVnIHdhcyBkaXNjb3ZlcmVkIHdoZW4KICAgICBwcm9jZXNzaW5nIGRhdGEgdGhyb3VnaCBhIGJ1ZmZlcmluZyBtZW1vcnkgQklPIGhhbmRpbmcgdGhlIGRhdGEgdG8gYQogICAgIEJBU0U2NC1kZWNvZGluZyBCSU8uIEJ1ZyBmdW5kIGFuZCBwYXRjaCBzdWJtaXR0ZWQgYnkgUGF2ZWwgVHNla292CiAgICAgPHB0c2Vrb3ZAc3ludHJleC5jb20+IGFuZCBOZWRlbGNobyBTdGFuZXYuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcGxlbWVudCBhIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgYSB2dWxuZXJhYmlsaXR5IHJlY2VudGx5IGZvdW5kCiAgICAgaW4gQ0JDIGNpcGhlcnN1aXRlcyBpbiBTU0wgMy4wL1RMUyAxLjA6IFNlbmQgYW4gZW1wdHkgZnJhZ21lbnQKICAgICBiZWZvcmUgYXBwbGljYXRpb24gZGF0YSBjaHVua3MgdG8gYXZvaWQgdGhlIHVzZSBvZiBrbm93biBJVnMKICAgICB3aXRoIGRhdGEgcG90ZW50aWFsbHkgY2hvc2VuIGJ5IHRoZSBhdHRhY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggbGVuZ3RoIGNoZWNrcyBpbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUTFMvU1NMIGxpYnJhcnkgYnVnZml4OiB1c2Ugcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgZGlmZmVyZW50bHkKICAgICB0byBwcmV2ZW50IHNzbDNfcmVhZF9pbnRlcm5hbCgpIGZyb20gaW5jb3JyZWN0bHkgYXNzdW1pbmcgdGhhdAogICAgIHNzbDNfcmVhZF9ieXRlcygpIGZvdW5kIGFwcGxpY2F0aW9uIGRhdGEgd2hpbGUgaGFuZHNoYWtlCiAgICAgcHJvY2Vzc2luZyB3YXMgZW5hYmxlZCB3aGVuIGluIGZhY3Qgcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgd2FzCiAgICAgbWVyZWx5IGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IG9iamVjdCBkZWZpbml0aW9ucyBmb3IgUHJpdmF0ZSBhbmQgRW50ZXJwcmlzZTogdGhleSB3ZXJlIG5vdAogICAgIHJlY29nbml6ZWQgaW4gdGhlaXIgc2hvcnRuYW1lICg9bG93ZXJjYXNlKSByZXByZXNlbnRhdGlvbi4gRXh0ZW5kCiAgICAgb2JqX2RhdC5wbCB0byBpc3N1ZSBhbiBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBrZXl3b3JkcyBpbnN0ZWFkCiAgICAgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIHByb2JsZW0gKFN2ZW5uaW5nIFNvcmVuc2VuCiAgICAgPHNzc0Bzc3MuZG5zYWxpYXMubmV0PikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzKCkgc28gdGhhdCBpdCB3b3JrcyBmb3IgJ25vbi1zdGFuZGFyZCcKICAgICBnZW5lcmF0b3JzLCBpLmUuIGdlbmVyYXRvcnMgb3RoZXIgdGhhbiAyIGFuZCA1LiAgKFByZXZpb3VzbHksIHRoZQogICAgIGNvZGUgZGlkIG5vdCBwcm9wZXJseSBpbml0aWFsaXNlIHRoZSAnYWRkJyBhbmQgJ3JlbScgdmFsdWVzIHRvCiAgICAgQk5fZ2VuZXJhdGVfcHJpbWUoKS4pCgogICAgIEluIHRoZSBuZXcgZ2VuZXJhbCBjYXNlLCB3ZSBkbyBub3QgaW5zaXN0IHRoYXQgJ2dlbmVyYXRvcicgaXMKICAgICBhY3R1YWxseSBhIHByaW1pdGl2ZSByb290OiBUaGlzIHJlcXVpcmVtZW50IGlzIHJhdGhlciBwb2ludGxlc3M7CiAgICAgYSBnZW5lcmF0b3Igb2YgdGhlIG9yZGVyLXEgc3ViZ3JvdXAgaXMganVzdCBhcyBnb29kLCBpZiBub3QKICAgICBiZXR0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KIAogICopIE1hcCBuZXcgWDUwOSB2ZXJpZmljYXRpb24gZXJyb3JzIHRvIGFsZXJ0cy4gRGlzY292ZXJlZCBhbmQgc3VibWl0dGVkIGJ5CiAgICAgVG9tIFd1IDx0b21AYXJjb3QuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHNzbDNfcGVuZGluZygpIChzc2wvczNfbGliLmMpIHRvIHByZXZlbnQgU1NMX3BlbmRpbmcoKSBmcm9tCiAgICAgcmV0dXJuaW5nIG5vbi16ZXJvIGJlZm9yZSB0aGUgZGF0YSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkCiAgICAgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgSm9obiBIdWdoZXNdCgogICopIFNvbWUgb2YgdGhlIGNpcGhlcnMgbWlzc2VkIHRoZSBzdHJlbmd0aCBlbnRyeSAoU1NMX0xPVyBldGMpLgogICAgIFtCZW4gTGF1cmllLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnIGluIFNTTF9jbGVhcigpOiBiYWQgc2Vzc2lvbnMgd2VyZSBub3QgcmVtb3ZlZCAoZm91bmQgYnkKICAgICBZb3JhbSBaYWhhdmkgPFlvcmFtWkBnaWxpYW4uY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBDeWdXaW4gMS4zIGFuZCBvbiwgYW5kIHByZXNlcnZlIHByb3BlcgogICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2ZXJzaW9ucyBiZWZvcmUgdGhhdC4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSByZW1vdmFsIGZyb20gc2Vzc2lvbiBjYWNoZSAoU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbigpKSBtb3JlIHJvYnVzdDoKICAgICBjaGVjayB3aGV0aGVyIHdlIGRlYWwgd2l0aCBhIGNvcHkgb2YgYSBzZXNzaW9uIGFuZCBkbyBub3QgZGVsZXRlIGZyb20KICAgICB0aGUgY2FjaGUgaW4gdGhpcyBjYXNlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5ICJJemhhciBTaG9zaGFuaSBMZXZpIgogICAgIDxpemhhckBjaGVja3BvaW50LmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIERvIG5vdCBzdG9yZSBzZXNzaW9uIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZSwgaWYgaXQKICAgICBpcyBuZXZlciBpbnRlbmRlZCB0byBiZSBsb29rZWQgdXAgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUAogICAgIGZsYWcgaXMgc2V0KS4gUHJvcG9zZWQgYnkgQXNsYW0gPGFzbGFtQGZ1bmsuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGF2ZSBBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCgpIHJlYWxseSBjbGVhciBhIGJpdCB3aGVuIHRoZSByZXF1ZXN0ZWQKICAgICB2YWx1ZSBpcyAwLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFtJbiAwLjkuNmQtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgbGludXgtczM5MHguCiAgICAgW05lYWxlIEZlcmd1c29uIDxOZWFsZS5GZXJndXNvbkBTb2Z0d2FyZUFHLVVTQS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBlYXJsaWVyIGJ1Z2ZpeCBmb3IgdGhlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MgY2FzZSBvZgogICAgIHNzbDNfYWNjZXB0IChzc2wvczNfc3J2ci5jKSBpbmNvcnJlY3RseSB1c2VkIGEgbG9jYWwgZmxhZwogICAgIHZhcmlhYmxlIGFzIGFuIGluZGljYXRpb24gdGhhdCBhIENsaWVudEhlbGxvIG1lc3NhZ2UgaGFzIGJlZW4KICAgICByZWNlaXZlZC4gIEFzIHRoZSBmbGFnIHZhbHVlIHdpbGwgYmUgbG9zdCBiZXR3ZWVuIG11bHRpcGxlCiAgICAgaW52b2NhdGlvbnMgb2Ygc3NsM19hY2NlcHQgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLCB0aGUKICAgICBmdW5jdGlvbiBtYXkgbm90IGJlIGF3YXJlIHRoYXQgYSBoYW5kc2hha2UgaGFzIGFjdHVhbGx5IHRha2VuCiAgICAgcGxhY2UsIHRodXMgcHJldmVudGluZyBhIG5ldyBzZXNzaW9uIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlCiAgICAgc2Vzc2lvbiBjYWNoZS4KCiAgICAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBub3cgc2V0IHMtPm5ld19zZXNzaW9uIHRvIDIgaW5zdGVhZCBvZgogICAgIHVzaW5nIGEgbG9jYWwgdmFyaWFibGUuCiAgICAgW0x1dHogSmFlbmlja2UsIEJvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBSZXR1cm4gLTEgZnJvbSBzc2wzX2dldF9zZXJ2ZXJfZG9uZSAoc3NsMy9zM19jbG50LmMpCiAgICAgaWYgdGhlIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCBlcnJvciBpcyBkZXRlY3RlZC4KICAgICBbR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIE5ldyAnc2hhcmVkX2xkZmxhZycgY29sdW1uIGluIENvbmZpZ3VyZSBwbGF0Zm9ybSB0YWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggRVZQX0NJUEhFUl9tb2RlIG1hY3JvLgogICAgIFsiRGFuIFMuIENhbXBlciIgPGRhbkBidGkubmV0Pl0KCiAgKikgRml4IHNzbDNfcmVhZF9ieXRlcyAoc3NsL3MzX3BrdC5jKTogVG8gaWdub3JlIG1lc3NhZ2VzIG9mIHVua25vd24KICAgICB0eXBlLCB3ZSBtdXN0IHRocm93IHRoZW0gYXdheSBieSBzZXR0aW5nIHJyLT5sZW5ndGggdG8gMC4KICAgICBbRCBQIENoYW5nIDxkcGNAcXVhbHlzLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YiBhbmQgMC45LjZjICBbMjEgZGVjIDIwMDFdCgogICopIEZpeCBCTl9yYW5kX3JhbmdlIGJ1ZyBwb2ludGVkIG91dCBieSBEb21pbmlrdXMgU2NoZXJrbAogICAgIDxEb21pbmlrdXMuU2NoZXJrbEBiaW9kYXRhLmNvbT4uICAoVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uCiAgICAgd29ya2VkIGluY29ycmVjdGx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZSAgcmFuZ2UgPSAxMC4uLl8yICBhbmQKICAgICAzKnJhbmdlICBpcyB0d28gYml0cyBsb25nZXIgdGhhbiAgcmFuZ2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9ubHkgYWRkIHNpZ25pbmcgdGltZSB0byBQS0NTNyBzdHJ1Y3R1cmVzIGlmIGl0IGlzIG5vdCBhbHJlYWR5CiAgICAgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggY3J5cHRvL29iamVjdHMvb2JqZWN0cy5oOiAibGQtY2UiIHNob3VsZCBiZSAiaWQtY2UiLAogICAgIE9CSl9sZF9jZSBzaG91bGQgYmUgT0JKX2lkX2NlLgogICAgIEFsc28gc29tZSBpcC1wZGEgT0lEcyBpbiBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLnR4dCB3ZXJlCiAgICAgaW5jb3JyZWN0IChjZi4gUkZDIDMwMzkpLgogICAgIFtNYXR0IENvb3BlciwgRnJlZGVyaWMgR2l1ZGljZWxsaSwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZWxlYXNlIENSWVBUT19MT0NLX0RZTkxPQ0sgd2hlbiBDUllQVE9fZGVzdHJveV9keW5sb2NraWQoKQogICAgIHJldHVybnMgZWFybHkgYmVjYXVzZSBpdCBoYXMgbm90aGluZyB0byBkby4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggbXV0ZXggY2FsbGJhY2sgcmV0dXJuIHZhbHVlcyBpbiBjcnlwdG8vZW5naW5lL2h3X25jaXBoZXIuYy4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2UncyBrZXlzZXJ2ZXIgdGVjaG5vbG9neS4KICAgICAoVXNlIGVuZ2luZSAna2V5Y2xpZW50JykKICAgICBbQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2VzIGFuZCBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIE9TLzM5MCBVbml4LiAgVGhlIEMgY29tcGlsZXIgJ2M4OScKICAgICBpcyBjYWxsZWQgdmlhIHRvb2xzL2M4OS5zaCBiZWNhdXNlIGFyZ3VtZW50cyBoYXZlIHRvIGJlCiAgICAgcmVhcnJhbmdlZCAoYWxsICctTCcgb3B0aW9ucyBtdXN0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IG9iamVjdAogICAgIG1vZHVsZXMpLgogICAgIFtSaWNoYXJkIFNoYXBpcm8gPHJzaGFwaXJvQGFiaW5pdGlvLmNvbT5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBCcm9hZGNvbSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMsIGJhY2twb3J0ZWQKICAgICBmcm9tIDAuOS43LgogICAgIFtCcm9hZGNvbSwgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiwgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSAKICAgICBCYWx0aW1vcmUgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBbQmFsdGltb3JlIFRlY2hub2xvZ2llcyBhbmQgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZAogICAgIEVuY3J5cHRpb24gUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFtBRVAgSW5jLiBhbmQgTWFyayBDb3hdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIGdjYyBvbiBVbml4V2FyZS4KICAgICBbR2FyeSBCZW5zb24gPGdiZW5zb25AcmVkaGF0LmNvbT5dCgogICopIENoYW5nZSBzc2wvczJfY2xudC5jIGFuZCBzc2wvczJfc3J2ci5jIHNvIHRoYXQgcmVjZWl2ZWQgaGFuZHNoYWtlCiAgICAgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBwaWVjZSAoZml4ZWQtbGVuZ3RoIHBhcnQgYW5kCiAgICAgdmFyaWFibGUtbGVuZ3RoIHBhcnQgY29tYmluZWQpIGFuZCBmaXggdmFyaW91cyBidWdzIGZvdW5kIG9uIHRoZSB3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSBjYWNoaW5nIGluIEJJT19nZXRob3N0YnluYW1lKCksIGRpcmVjdGx5IHVzZSBnZXRob3N0YnluYW1lKCkKICAgICBpbnN0ZWFkLiAgQklPX2dldGhvc3RieW5hbWUoKSBkb2VzIG5vdCBrbm93IHdoYXQgdGltZW91dHMgYXJlCiAgICAgYXBwcm9wcmlhdGUsIHNvIGVudHJpZXMgd291bGQgc3RheSBpbiBjYWNoZSBldmVuIHdoZW4gdGhleSBoYXZlCiAgICAgYmVjb21lIGludmFsaWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBSaWNoIFNhbHogPHJzYWx6QHpvbGVyYS5jb20+CgogICopIENoYW5nZSBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgYmVoYXZpb3VyIHdoZW4KICAgICBmYWNlZCB3aXRoIGEgcGF0aG9sb2dpY2FsbHkgc21hbGwgQ2xpZW50SGVsbG8gZnJhZ21lbnQgdGhhdCBkb2VzCiAgICAgbm90IGNvbnRhaW4gY2xpZW50X3ZlcnNpb246IEluc3RlYWQgb2YgYWJvcnRpbmcgd2l0aCBhbiBlcnJvciwKICAgICBzaW1wbHkgY2hvb3NlIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBwcm90b2NvbCB2ZXJzaW9uIChpLmUuLAogICAgIFRMUyAxLjAgdW5sZXNzIGl0IGlzIGRpc2FibGVkKS4gIEluIHByYWN0aWNlLCBDbGllbnRIZWxsbwogICAgIG1lc3NhZ2VzIGFyZSBuZXZlciBzZW50IGxpa2UgdGhpcywgYnV0IHRoaXMgY2hhbmdlIGdpdmVzIHVzCiAgICAgc3RyaWN0bHkgY29ycmVjdCBiZWhhdmlvdXIgYXQgbGVhc3QgZm9yIFRMUy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMgYW5kIFNTTF9jbGVhcigpIHN1Y2ggdGhhdCBTU0xfY2xlYXIoKQogICAgIG5ldmVyIHJlc2V0cyBzLT5tZXRob2QgdG8gcy0+Y3R4LT5tZXRob2Qgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4KICAgICBvbmUgb2YgdGhlIFNTTCBoYW5kc2hha2UgZnVuY3Rpb25zLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTmlrbyBCYXJpY10KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczNfc3J2ci5jKSwgZ2VuZXJhdGUgYSBmYXRhbCBhbGVydAogICAgIChzZW50IHVzaW5nIHRoZSBjbGllbnQncyB2ZXJzaW9uIG51bWJlcikgaWYgY2xpZW50X3ZlcnNpb24gaXMKICAgICBzbWFsbGVyIHRoYW4gdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdXNlLiAgQWxzbyBjaGFuZ2UKICAgICBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgdG8gc2VsZWN0IFRMUyAxLjAgaWYKICAgICB0aGUgY2xpZW50IGRlbWFuZGVkIFNTTCAzLjAgYnV0IG9ubHkgVExTIDEuMCBpcyBlbmFibGVkOyB0aGVuCiAgICAgdGhlIGNsaWVudCB3aWxsIGF0IGxlYXN0IHNlZSB0aGF0IGFsZXJ0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSB0byBoYW5kbGUgbWVzc2FnZSBmcmFnbWVudGF0aW9uCiAgICAgY29ycmVjdGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGluZmluaXRlIGxvb3AgaW4gc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgaWYgYQogICAgIGNsaWVudCByZWNlaXZlcyBIZWxsb1JlcXVlc3Qgd2hpbGUgaW4gYSBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgYnVnIG5vdGljZWQgYnkgQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBCdWdmaXggaW4gc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpOiBDYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MKICAgICBzaG91bGQgZW5kIGluICdicmVhaycsIG5vdCAnZ290byBlbmQnIHdoaWNoIGNpcmN1bXZlbnRzIHZhcmlvdXMKICAgICBjbGVhbnVwcyBkb25lIGluIHN0YXRlIFNTTF9TVF9PSy4gICBCdXQgc2Vzc2lvbiByZWxhdGVkIHN0dWZmCiAgICAgbXVzdCBiZSBkaXNhYmxlZCBmb3IgU1NMX1NUX09LIGluIHRoZSBjYXNlIHRoYXQgd2UganVzdCBzZW50IGEKICAgICBIZWxsb1JlcXVlc3QuCgogICAgIEFsc28gYXZvaWQgc29tZSBvdmVyaGVhZCBieSBub3QgY2FsbGluZyBzc2xfaW5pdF93YmlvX2J1ZmZlcigpCiAgICAgYmVmb3JlIGp1c3Qgc2VuZGluZyBhIEhlbGxvUmVxdWVzdC4KICAgICBbQm9kbyBNb2VsbGVyLCBFcmljIFJlc2NvcmxhIDxla3JAcnRmbS5jb20+XQoKICAqKSBGaXggc3NsL3MzX2VuYy5jLCBzc2wvdDFfZW5jLmMgYW5kIHNzbC9zM19wa3QuYyBzbyB0aGF0IHdlIGRvbid0CiAgICAgcmV2ZWFsIHdoZXRoZXIgaWxsZWdhbCBibG9jayBjaXBoZXIgcGFkZGluZyB3YXMgZm91bmQgb3IgYSBNQUMKICAgICB2ZXJpZmljYXRpb24gZXJyb3Igb2NjdXJlZC4gIChOZWl0aGVyIFNTTGVycigpIGNvZGVzIG5vciBhbGVydHMKICAgICBhcmUgZGlyZWN0bHkgdmlzaWJsZSB0byBwb3RlbnRpYWwgYXR0YWNrZXJzLCBidXQgdGhlIGluZm9ybWF0aW9uCiAgICAgbWF5IGxlYWsgdmlhIGxvZ2ZpbGVzLikKCiAgICAgU2ltaWxhciBjaGFuZ2VzIGFyZSBub3QgcmVxdWlyZWQgZm9yIHRoZSBTU0wgMi4wIGltcGxlbWVudGF0aW9uCiAgICAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaXMgc2VudCBpbiBjbGVhciBmb3IgU1NMIDIuMCwKICAgICBhbmQgdGhlIGV4dHJhIGJ5dGVzIGFyZSBqdXN0IGlnbm9yZWQuICBIb3dldmVyIHNzbC9zMl9wa3QuYwogICAgIGZhaWxlZCB0byB2ZXJpZnkgdGhhdCB0aGUgcHVycG9ydGVkIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIGluCiAgICAgdGhlIGxlZ2FsIHJhbmdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPcGVuVU5JWC04IHN1cHBvcnQgaW5jbHVkaW5nIHNoYXJlZCBsaWJyYXJpZXMKICAgICAoQm95ZCBMeW5uIEdlcmJlciA8Z2VyYmVyYkB6ZW5lei5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wcm92ZSBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKCkgY2hlY2sgYWdhaW4gdG8gYXZvaWQKICAgICAnd3Jpc3R3YXRjaCBhdHRhY2snIHVzaW5nIGh1Z2UgZW5jb2RpbmcgcGFyYW1ldGVycyAoY2YuCiAgICAgSmFtZXMgSC4gTWFuZ2VyJ3MgQ1JZUFRPIDIwMDEgcGFwZXIpLiAgTm90ZSB0aGF0IHRoZQogICAgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcgY2FzZSBvZiBSU0FfcHJpdmF0ZV9kZWNyeXB0KCkgZG9lcyBub3QgdXNlCiAgICAgZW5jb2RpbmcgcGFyYW1ldGVycyBhbmQgaGVuY2Ugd2FzIG5vdCB2dWxuZXJhYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJOX3NxcigpIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHJlcG9ydGVkIGJ5IEppbSBFbGxpcyA8amltLmVsbGlzQGNhdml1bS5jb20+XQoKICAqKSBSYWJpbi1NaWxsZXIgdGVzdCBhbmFseXNlcyBhc3N1bWUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHdpdG5lc3NlcywKICAgICBzbyB1c2UgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSBpbnN0ZWFkIG9mIHVzaW5nIEJOX3BzZXVkb19yYW5kKCkKICAgICBmb2xsb3dlZCBieSBtb2R1bGFyIHJlZHVjdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyOyBwb2ludGVkIG91dCBieSBBZGFtIFlvdW5nIDxBWW91bmcxQE5DU1VTLkpOSi5DT00+XQoKICAqKSBBZGQgQk5fcHNldWRvX3JhbmRfcmFuZ2UoKSB3aXRoIG9idmlvdXMgZnVuY3Rpb25hbGl0eTogQk5fcmFuZF9yYW5nZSgpCiAgICAgZXF1aXZhbGVudCBiYXNlZCBvbiBCTl9wc2V1ZG9fcmFuZCgpIGluc3RlYWQgb2YgQk5fcmFuZCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIHMzX3NydnIuYzogYWxsb3cgc2VuZGluZyBvZiBsYXJnZSBjbGllbnQgY2VydGlmaWNhdGUgbGlzdHMgKD4gMTYga0IpLgogICAgIFRoaXMgZnVuY3Rpb24gd2FzIGJyb2tlbiwgYXMgdGhlIGNoZWNrIGZvciBhIG5ldyBjbGllbnQgaGVsbG8gbWVzc2FnZQogICAgIHRvIGhhbmRsZSBTR0MgZGlkIG5vdCBhbGxvdyB0aGVzZSBsYXJnZSBtZXNzYWdlcy4KICAgICAoVHJhY2tlZCBkb3duIGJ5ICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGFsZXJ0IGRlc2NyaXB0aW9ucyBmb3IgVExTdjEgdG8gU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nW19sb25nXSgpLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnZ3kgYmVoYXZpb3VyIG9mIEJJT19nZXRfbnVtX3JlbmVnb3RpYXRlcygpIGFuZCBCSU9fY3RybCgpCiAgICAgZm9yIEJJT19DX0dFVF9XUklURV9CVUZfU0laRSAoIlN0ZXBoZW4gSGludG9uIiA8c2hpbnRvbkBuZXRvcGlhLmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBSZXdvcmsgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFRydTY0IFVuaXguCiAgICAgVGhlIGNvbmZpZ3VyYXRpb24gcGFydCBtYWtlcyB1c2Ugb2YgbW9kZXJuIGNvbXBpbGVyIGZlYXR1cmVzIGFuZAogICAgIHN0aWxsIHJldGFpbnMgb2xkIGNvbXBpbGVyIGJlaGF2aW9yIGZvciB0aG9zZSB0aGF0IHJ1biBvbGRlciB2ZXJzaW9ucwogICAgIG9mIHRoZSBPUy4gIFRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHBhcnQgaW5jbHVkZXMgYSB2YXJpYW50IHRoYXQKICAgICB1c2VzIHRoZSBSUEFUSCBmZWF0dXJlLCBhbmQgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHNwZWNpYWwKICAgICBjb25maWd1cmF0aW9uIHRhcmdldCAiYWxwaGEtY2MtcnBhdGgiLCB3aGljaCB3aWxsIG5ldmVyIGJlIHNlbGVjdGVkCiAgICAgYXV0b21hdGljYWxseS4KICAgICBbVGltIE1vb25leSA8bW9vbmV5QGRvZ2JlcnQuY2MubmRzdS5Ob0Rhay5lZHU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluIHNzbDNfZ2V0X2tleV9leGNoYW5nZSAoc3NsL3MzX2NsbnQuYyksIGNhbGwgc3NsM19nZXRfbWVzc2FnZSgpCiAgICAgd2l0aCB0aGUgc2FtZSBtZXNzYWdlIHNpemUgYXMgaW4gc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdCgpLgogICAgIE90aGVyd2lzZSwgaWYgbm8gU2VydmVyS2V5RXhjaGFuZ2UgbWVzc2FnZSBvY2N1cnMsIENlcnRpZmljYXRlUmVxdWVzdAogICAgIG1lc3NhZ2VzIG1pZ2h0IGluYWR2ZXJ0ZW50bHkgYmUgcmVqZWN0IGFzIHRvbyBsb25nLgogICAgIFtQZXRyIExhbXBhIDxsYW1wYUBmZWUudnV0YnIuY3o+XQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBJQS02NCBVbml4IHBsYXRmb3JtcyAod2VsbCwgTGludXggYW5kIEhQLVVYKS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9kaWZpZWQgU1NMIGxpYnJhcnkgc3VjaCB0aGF0IHRoZSB2ZXJpZnlfY2FsbGJhY2sgdGhhdCBoYXMgYmVlbiBzZXQKICAgICBzcGVjaWZpY2x5IGZvciBhbiBTU0wgb2JqZWN0IHdpdGggU1NMX3NldF92ZXJpZnkoKSBpcyBhY3R1YWxseSBiZWluZwogICAgIHVzZWQuIEJlZm9yZSB0aGUgY2hhbmdlLCBhIHZlcmlmeV9jYWxsYmFjayBzZXQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdhcwogICAgIGlnbm9yZWQgYW5kIHRoZSB2ZXJpZnlfY2FsbGJhY2soKSBzZXQgaW4gdGhlIFNTTF9DVFggYXQgdGhlIHRpbWUgb2YKICAgICB0aGUgY2FsbCB3YXMgdXNlZC4gTmV3IGZ1bmN0aW9uIFg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoKSBpbnRyb2R1Y2VkCiAgICAgdG8gYWxsb3cgdGhlIG5lY2Vzc2FyeSBzZXR0aW5ncy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgaW4gY3J5cHRvL2RzYS9kc2FfbGliLmMgYW5kIGNyeXB0by9kaC9kaF9saWIuYwogICAgIGV4cGxpY2l0bHkgdG8gTlVMTCwgYXMgYXQgbGVhc3Qgb24gU29sYXJpcyA4IHRoaXMgc2VlbXMgbm90IGFsd2F5cyB0byBiZQogICAgIGRvbmUgYXV0b21hdGljYWxseSAoaW4gY29udHJhZGljdGlvbiB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBDCiAgICAgc3RhbmRhcmQpLiBUaGlzIG1hZGUgcHJvYmxlbXMgd2hlbiB1c2VkIGZyb20gT3BlblNTSC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW4gT3BlblNTTCAwLjkuNmEgYW5kIDAuOS42YiwgY3J5cHRvL2RoL2RoX2tleS5jIGlnbm9yZWQKICAgICBkaC0+bGVuZ3RoIGFuZCBhbHdheXMgdXNlZAoKICAgICAgICAgIEJOX3JhbmRfcmFuZ2UocHJpdl9rZXksIGRoLT5wKS4KCiAgICAgQk5fcmFuZF9yYW5nZSgpIGlzIG5vdCBuZWNlc3NhcnkgZm9yIERpZmZpZS1IZWxsbWFuLCBhbmQgdGhpcwogICAgIHNwZWNpZmljIHJhbmdlIG1ha2VzIERpZmZpZS1IZWxsbWFuIHVubmVjZXNzYXJpbHkgaW5lZmZpY2llbnQgaWYKICAgICBkaC0+bGVuZ3RoIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGlzIG11Y2ggc21hbGxlciB0aGFuIHRoZQogICAgIGxlbmd0aCBvZiBkaC0+cC4gIFdlIGNvdWxkIHVzZSBCTl9yYW5kX3JhbmdlKCkgaWYgdGhlIG9yZGVyIG9mCiAgICAgdGhlIHN1Ymdyb3VwIHdhcyBzdG9yZWQgaW4gdGhlIERIIHN0cnVjdHVyZSwgYnV0IHdlIG9ubHkgaGF2ZQogICAgIGRoLT5sZW5ndGguCgogICAgIFNvIHN3aXRjaCBiYWNrIHRvCgogICAgICAgICAgQk5fcmFuZChwcml2X2tleSwgbCwgLi4uKQoKICAgICB3aGVyZSAnbCcgaXMgZGgtPmxlbmd0aCBpZiB0aGlzIGlzIGRlZmluZWQsIG9yIEJOX251bV9iaXRzKGRoLT5wKS0xCiAgICAgb3RoZXJ3aXNlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluCgogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZW5jcnlwdAogICAgICAgICAgUlNBX2VheV9wcml2YXRlX2RlY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9lbmNyeXB0IChzaWduaW5nKQogICAgICAgICAgUlNBX2VheV9wdWJsaWNfZGVjcnlwdCAoc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCiAgICAgKGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBSU0FfcHVibGljX2VuY3J5cHQsCiAgICAgUlNBX3ByaXZhdGVfZGVjcnlwdCwgUlNBX3ByaXZhdGVfZW5jcnlwdCwgUlNBX3B1YmxpY19kZWNyeXB0KSwKICAgICBhbHdheXMgcmVqZWN0IG51bWJlcnMgPj0gbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHVzZSBhIG5ldyBzaG9ydC10aW1lIGxvY2sgQ1JZUFRPX0xPQ0tfUkFORDIKICAgICB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJy4gIFRoaXMgaXMgbmVjZXNzYXJ5IG9uCiAgICAgc3lzdGVtcyB3aGVyZSBhY2Nlc3MgdG8gJ2xvY2tpbmdfdGhyZWFkJyAoYW4gJ3Vuc2lnbmVkIGxvbmcnCiAgICAgdmFyaWFibGUpIGlzIG5vdCBhdG9taWMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCBzZXQgJ2xvY2tpbmdfdGhyZWFkJyB0byBjdXJyZW50IHRocmVhZCdzIElECiAgICAgKmJlZm9yZSogc2V0dGluZyB0aGUgJ2NyeXB0b19sb2NrX3JhbmQnIGZsYWcuICBUaGUgcHJldmlvdXMgY29kZSBoYWQKICAgICBhIHJhY2UgY29uZGl0aW9uIGlmIDAgaXMgYSB2YWxpZCB0aHJlYWQgSUQuCiAgICAgW1RyYXZpcyBWaXRlayA8dml0ZWtAcm9ndWV3YXZlLmNvbT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIHVuZGVyIElyaXguCiAgICAgW0FsYmVydCBDaGluLUEtWW91bmcgPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT5dCgogICopIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBidWlsZCBvbiBMaW51eCBvbiBib3RoIGJpZy1lbmRpYW4gYW5kCiAgICAgbGl0dGxlLWVuZGlhbiBNSVBTLgogICAgIFtSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+XQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEhQLVVYLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YSBhbmQgMC45LjZiICBbOSBKdWwgMjAwMV0KCiAgKikgQ2hhbmdlIHNzbGVheV9yYW5kX2J5dGVzIChjcnlwdG8vcmFuZC9tZF9yYW5kLmMpCiAgICAgdG8gYXZvaWQgYSBTU0xlYXkvT3BlblNTTCBQUk5HIHdlYWtuZXNzIHBvaW50ZWQgb3V0IGJ5CiAgICAgTWFya2t1LUp1aGFuaSBPLiBTYWFyaW5lbiA8bWFya2t1LWp1aGFuaS5zYWFyaW5lbkBub2tpYS5jb20+OgogICAgIFBSTkcgc3RhdGUgcmVjb3Zlcnkgd2FzIHBvc3NpYmxlIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YKICAgICBvbmUgUFJORyByZXF1ZXN0IGFwcHJvcHJpYXRlbHkgc2l6ZWQgdG8gZ2FpbiBrbm93bGVkZ2Ugb24KICAgICAnbWQnIGZvbGxvd2VkIGJ5IGVub3VnaCBjb25zZWN1dGl2ZSAxLWJ5dGUgUFJORyByZXF1ZXN0cwogICAgIHRvIHRyYXZlcnNlIGFsbCBvZiAnc3RhdGUnLgoKICAgICAxLiBXaGVuIHVwZGF0aW5nICdtZF9sb2NhbCcgKHRoZSBjdXJyZW50IHRocmVhZCdzIGNvcHkgb2YgJ21kJykKICAgICAgICBkdXJpbmcgUFJORyBvdXRwdXQgZ2VuZXJhdGlvbiwgaGFzaCBhbGwgb2YgdGhlIHByZXZpb3VzCiAgICAgICAgJ21kX2xvY2FsJyB2YWx1ZSwgbm90IGp1c3QgdGhlIGhhbGYgdXNlZCBmb3IgUFJORyBvdXRwdXQuCgogICAgIDIuIE1ha2UgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tICdzdGF0ZScgaW5jbHVkZWQgaW50byB0aGUgaGFzaAogICAgICAgIGluZGVwZW5kZW50IGZyb20gdGhlIG51bWJlciBvZiBQUk5HIGJ5dGVzIHJlcXVlc3RlZC4KCiAgICAgVGhlIGZpcnN0IG1lYXN1cmUgYWxvbmUgd291bGQgYmUgc3VmZmljaWVudCB0byBhdm9pZAogICAgIE1hcmtrdS1KdWhhbmkncyBhdHRhY2suICAoQWN0dWFsbHkgaXQgaGFkIG5ldmVyIG9jY3VycmVkCiAgICAgdG8gbWUgdGhhdCB0aGUgaGFsZiBvZiAnbWRfbG9jYWwnIHVzZWQgZm9yIGNoYWluaW5nIHdhcyB0aGUKICAgICBoYWxmIGZyb20gd2hpY2ggUFJORyBvdXRwdXQgYnl0ZXMgd2VyZSB0YWtlbiAtLSBJIGhhZCBhbHdheXMKICAgICBhc3N1bWVkIHRoYXQgdGhlIHNlY3JldCBoYWxmIHdvdWxkIGJlIHVzZWQuKSAgVGhlIHNlY29uZAogICAgIG1lYXN1cmUgbWFrZXMgc3VyZSB0aGF0IGFkZGl0aW9uYWwgZGF0YSBmcm9tICdzdGF0ZScgaXMgbmV2ZXIKICAgICBtaXhlZCBpbnRvICdtZF9sb2NhbCcgaW4gc21hbGwgcG9ydGlvbnM7IHRoaXMgaGV1cmlzdGljYWxseQogICAgIGZ1cnRoZXIgc3RyZW5ndGhlbnMgdGhlIFBSTkcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGNyeXB0by9ibi9hc20vbWlwczMucy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgV2hlbiBvbmx5IHRoZSBrZXkgaXMgZ2l2ZW4gdG8gImVuYyIsIHRoZSBJViBpcyB1bmRlZmluZWQuIFByaW50IG91dAogICAgIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gWDUwOV9OQU1FIGlzIGVtcHR5IGluIFg1MDkgcHJpbnRpbmcgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gZHNhX2RvX3ZlcmlmeSAoY3J5cHRvL2RzYS9kc2Ffb3NzbC5jKSwgdmVyaWZ5IHRoYXQgciBhbmQgcyBhcmUKICAgICBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIHEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgY2hhbmdlICpwb2ludGVyIGluIENSWVBUT19hZGRfbG9jaygpIGlzIGFkZF9sb2NrX2NhbGxiYWNrIGlzCiAgICAgdXNlZDogaXQgaXNuJ3QgdGhyZWFkIHNhZmUgYW5kIHRoZSBhZGRfbG9ja19jYWxsYmFjayBzaG91bGQgaGFuZGxlCiAgICAgdGhhdCBpdHNlbGYuCiAgICAgW1BhdWwgUm9zZSA8UGF1bC5Sb3NlQGJyaWRnZS5jb20+XQoKICAqKSBWZXJpZnkgdGhhdCBpbmNvbWluZyBkYXRhIG9iZXlzIHRoZSBibG9jayBzaXplIGluCiAgICAgc3NsM19lbmMgKHNzbC9zM19lbmMuYykgYW5kIHRsczFfZW5jIChzc2wvdDFfZW5jLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBPQUVQIGNoZWNrLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgVGhlIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNQogICAgIFJTQSBlbmNyeXB0aW9uIHdhcyBhY2NpZGVudGFsbHkgcmVtb3ZlZCBpbiBzM19zcnZyLmMgaW4gT3BlblNTTCAwLjkuNQogICAgIHdoZW4gZml4aW5nIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSAnY2xpZW50CiAgICAgaGVsbG8nIG1lc3NhZ2VzLiAgKE5vdGUgdGhhdCB0aGUgYXR0YWNrIGlzIGltcHJhY3RpY2FsIGFnYWluc3QKICAgICBTU0wgMy4wIGFuZCBUTFMgMS4wIGFueXdheSBiZWNhdXNlIGxlbmd0aCBhbmQgdmVyc2lvbiBjaGVja2luZwogICAgIG1lYW5zIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIGd1ZXNzaW5nIGEgdmFsaWQgY2lwaGVydGV4dCBpcwogICAgIGFyb3VuZCAyXi00MDsgc2VlIHNlY3Rpb24gNSBpbiBCbGVpY2hlbmJhY2hlcidzIENSWVBUTyAnOTgKICAgICBwYXBlci4pCgogICAgIEJlZm9yZSAwLjkuNSwgdGhlIGNvdW50ZXJtZWFzdXJlIChoaWRlIHRoZSBlcnJvciBieSBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gJ2RlY3J5cHRpb24gcmVzdWx0JykgZGlkIG5vdCB3b3JrIHByb3Blcmx5IGJlY2F1c2UKICAgICBFUlJfY2xlYXJfZXJyb3IoKSB3YXMgbWlzc2luZywgbWVhbmluZyB0aGF0IFNTTF9nZXRfZXJyb3IoKSB3b3VsZAogICAgIGRldGVjdCB0aGUgc3VwcG9zZWRseSBpZ25vcmVkIGVycm9yLgoKICAgICBCb3RoIHByb2JsZW1zIGFyZSBub3cgZml4ZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL2Jpby9iZl9idWZmLmMsIGluY3JlYXNlIERFRkFVTFRfQlVGRkVSX1NJWkUgdG8gNDA5NgogICAgIChwcmV2aW91c2x5IGl0IHdhcyAxMDI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGNvbXBhdGliaWxpdHkgbW9kZSB0cnVzdCBzZXR0aW5nczogaWdub3JlIHRydXN0IHNldHRpbmdzCiAgICAgdW5sZXNzIHNvbWUgdmFsaWQgdHJ1c3Qgb3IgcmVqZWN0IHNldHRpbmdzIGFyZSBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYmxvd2Zpc2ggRVZQOiBpdHMgYSB2YXJpYWJsZSBsZW5ndGggY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmVsYXRlZCB0byBEU0EgUy9NSU1FIHZlcmlmaWNhdGlvbi4gSGFuZGxlIG1pc3NpbmcKICAgICBwYXJhbWV0ZXJzIGluIERTQSBwdWJsaWMga2V5IHN0cnVjdHVyZXMgYW5kIHJldHVybiBhbiBlcnJvciBpbiB0aGUKICAgICBEU0Egcm91dGluZXMgaWYgcGFyYW1ldGVycyBhcmUgYWJzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHZlcnNpb25zIHVwIHRvIDAuOS42LCBSQU5EX2ZpbGVfbmFtZSgpIHJlc29ydGVkIHRvIGZpbGUgIi5ybmQiCiAgICAgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5laXRoZXIgJFJBTkRGSUxFIG5vciAkSE9NRSB3YXMgc2V0LgogICAgIFJBTkRfZmlsZV9uYW1lKCkgaW4gMC45LjZhIHJldHVybmVkIE5VTEwgaW4gdGhpcyBjYXNlLiAgVGhpcyBoYXMKICAgICBjYXVzZWQgc29tZSBjb25mdXNpb24gdG8gV2luZG93cyB1c2VycyB3aG8gaGF2ZW4ndCBkZWZpbmVkICRIT01FLgogICAgIFRodXMgUkFORF9maWxlX25hbWUoKSBpcyBjaGFuZ2VkIGFnYWluOiBlX29zLmggY2FuIGRlZmluZSBhCiAgICAgREVGQVVMVF9IT01FLCB3aGljaCB3aWxsIGJlIHVzZWQgaWYgJEhPTUUgaXMgbm90IHNldC4KICAgICBGb3IgV2luZG93cywgd2UgdXNlICJDOiI7IG9uIG90aGVyIHBsYXRmb3Jtcywgd2Ugc3RpbGwgcmVxdWlyZQogICAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAgKikgTW92ZSAnaWYgKCFpbml0aWFsaXplZCkgUkFORF9wb2xsKCknIGludG8gcmVnaW9ucyBwcm90ZWN0ZWQgYnkKICAgICBDUllQVE9fTE9DS19SQU5ELiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgYXZvaWRzCiAgICAgaGF2aW5nIG11bHRpcGxlIHRocmVhZHMgY2FsbCBSQU5EX3BvbGwoKSBjb25jdXJyZW50bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCByZXBsYWNlICdhZGRfZG9fbm90X2xvY2snIGZsYWcgYnkgYQogICAgIGNvbWJpbmF0aW9uIG9mIGEgZmxhZyBhbmQgYSB0aHJlYWQgSUQgdmFyaWFibGUuCiAgICAgT3RoZXJ3aXNlIHdoaWxlIG9uZSB0aHJlYWQgaXMgaW4gc3NsZWF5X3JhbmRfYnl0ZXMgKHdoaWNoIHNldHMgdGhlCiAgICAgZmxhZyksICpvdGhlciogdGhyZWFkcyBjYW4gZW50ZXIgc3NsZWF5X2FkZF9ieXRlcyB3aXRob3V0IG9iZXlpbmcKICAgICB0aGUgQ1JZUFRPX0xPQ0tfUkFORCBsb2NrIChhbmQgbWF5IGV2ZW4gaWxsZWdhbGx5IHJlbGVhc2UgdGhlIGxvY2sKICAgICB0aGF0IHRoZXkgZG8gbm90IGhvbGQgYWZ0ZXIgdGhlIGZpcnN0IHRocmVhZCB1bnNldHMgYWRkX2RvX25vdF9sb2NrKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmN0ZXN0IGFnYWluOiAnLXgnIGV4cHJlc3Npb25zIGFyZSBub3QgYXZhaWxhYmxlIGluIGFsbAogICAgIHZlcnNpb25zIG9mICd0ZXN0Jy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNiBhbmQgMC45LjZhICBbNSBBcHIgMjAwMV0KCiAgKikgRml4IGEgY291cGxlIG9mIG1lbW9yeSBsZWFrcyBpbiBQS0NTN19kYXRhRGVjb2RlKCkKICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBIZXl1biBaaGVuZyA8aHpoZW5nQGF0ZHNwcmludC5jb20+XQoKICAqKSBDaGFuZ2UgQ29uZmlndXJlIGFuZCBNYWtlZmlsZXMgdG8gcHJvdmlkZSBFWEVfRVhULCB3aGljaCB3aWxsIGNvbnRhaW4KICAgICB0aGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuICBBbHNvLCBtYWtlIHRoZSBwZXJsCiAgICAgc2NyaXB0cyB0aGF0IHVzZSBzeW1saW5rKCkgdG8gdGVzdCBpZiBpdCByZWFsbHkgZXhpc3RzIGFuZCB1c2UgImNwIgogICAgIGlmIGl0IGRvZXNuJ3QuICBBbGwgdGhpcyBtYWRlIE9wZW5TU0wgY29tcGlsYWJsZSBhbmQgaW5zdGFsbGFibGUgaW4KICAgICBDeWdXaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBhc24xX0dldFNlcXVlbmNlKCkgZm9yIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkIGRhdGEuCiAgICAgSWYgU0VRVUVOQ0UgaXMgbGVuZ3RoIGlzIGluZGVmaW5pdGUganVzdCBzZXQgYy0+c2xlbiB0byB0aGUgdG90YWwKICAgICBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgc2hpZ2VARnJlZUJTRC5vcmddCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgQ2hhbmdlIGJjdGVzdCB0byBhdm9pZCBoZXJlLWRvY3VtZW50cyBpbnNpZGUgY29tbWFuZCBzdWJzdGl0dXRpb24KICAgICAod29ya2Fyb3VuZCBmb3IgRnJlZUJTRCAvYmluL3NoIGJ1ZykuCiAgICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBVbHRyaXgsIGF2b2lkIHNoZWxsIGZ1bmN0aW9ucyAoaW50cm9kdWNlZAogICAgIGluIHRoZSBiY3Rlc3QgdmVyc2lvbiB0aGF0IHNlYXJjaGVzIGFsb25nICRQQVRIKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW5hbWUgJ2Rlc19lbmNyeXB0JyB0byAnZGVzX2VuY3J5cHQxJy4gIFRoaXMgYXZvaWRzIHRoZSBjbGFzaGVzCiAgICAgd2l0aCBkZXNfZW5jcnlwdCgpIGRlZmluZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgbGlrZSBTb2xhcmlzCiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoZWNrIHRoZSByZXN1bHQgb2YgUlNBLUNSVCAoc2VlIEQuIEJvbmVoLCBSLiBEZU1pbGxvLCBSLiBMaXB0b246CiAgICAgT24gdGhlIEltcG9ydGFuY2Ugb2YgRWxpbWluYXRpbmcgRXJyb3JzIGluIENyeXB0b2dyYXBoaWMKICAgICBDb21wdXRhdGlvbnMsIEouIENyeXB0b2xvZ3kgMTQgKDIwMDEpIDIsIDEwMS0xMTksCiAgICAgaHR0cDovL3RoZW9yeS5zdGFuZm9yZC5lZHUvfmRhYm8vcGFwZXJzL2ZhdWx0cy5wcy5neikuCiAgICAgW1VsZiBNb2VsbGVyXQogIAogICopIE1JUFMgYXNzZW1ibGVyIEJJR05VTSBkaXZpc2lvbiBidWcgZml4LiAKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgRGlzYWJsZWQgaW5jb3JyZWN0IEFscGhhIGFzc2VtYmxlciBjb2RlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBQS0NTIzcgZGVjb2RlIHJvdXRpbmVzIHNvIHRoZXkgY29ycmVjdGx5IHVwZGF0ZSB0aGUgbGVuZ3RoCiAgICAgYWZ0ZXIgcmVhZGluZyBhbiBFT0MgZm9yIHRoZSBFWFBMSUNJVCB0YWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBGaXggYnVnIGluIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gcm91dGluZXMuIFRoaXMgd2FzIHRyaWdnZXJlZAogICAgIGlmIGEgM0RFUyBrZXkgd2FzIGdlbmVyYXRlZCB3aXRoIGEgMCBpbml0aWFsIGJ5dGUuIEluY2x1ZGUKICAgICBQS0NTMTJfQlJPS0VOX0tFWUdFTiBjb21waWxhdGlvbiBvcHRpb24gdG8gcmV0YWluIHRoZSBvbGQKICAgICAoYnV0IGJyb2tlbikgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgYmN0ZXN0IHRvIHNlYXJjaCBmb3IgYSB3b3JraW5nIGJjIGFsb25nICRQQVRIIGFuZCBwcmludAogICAgIGl0IHdoZW4gZm91bmQuCiAgICAgW1RpbSBSaWNlIDx0aW1AbXVsdGl0YWxlbnRzLm5ldD4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBlcnIuYzogZnJlZSBlcnJfZGF0YSBzdHJpbmcgaWYgbmVjZXNzYXJ5OwogICAgIGRvbid0IHdyaXRlIHRvIHRoZSB3cm9uZyBpbmRleCBpbiBFUlJfc2V0X2Vycm9yX2RhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IHNzbDIzX3BlZWsgKGFuYWxvZ291cyB0byBzc2wyM19yZWFkKSwgd2hpY2ggcHJldmlvdXNseQogICAgIGRpZCBub3QgZXhpc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwbGFjZSByZHRzYyB3aXRoIF9lbWl0IHN0YXRlbWVudHMgZm9yIFZDKysgdmVyc2lvbiA1LgogICAgIFtKZXJlbXkgQ29vcGVyIDxqZXJlbXlAYmF5bW9vLm9yZz5dCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcmV1c2UgU1NMdjIgc2Vzc2lvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY29weV9lbWFpbCgpIGNoZWNrIGZvciA+PSAwIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgogICAgIFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKCkgc2luY2UgMCBpcyBhIHZhbGlkIGluZGV4LgogICAgIFtTdGV2ZSBIZW5zb24gcmVwb3J0ZWQgYnkgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAb3BlbnNjYS5vcmc+XQoKICAqKSBBdm9pZCBjb3JlZHVtcCB3aXRoIHVuc3VwcG9ydGVkIG9yIGludmFsaWQgcHVibGljIGtleXMgYnkgY2hlY2tpbmcgaWYKICAgICBYNTA5X2dldF9wdWJrZXkoKSBmYWlscyBpbiBQS0NTN192ZXJpZnkoKS4gRml4IG1lbW9yeSBsZWFrIHdoZW4KICAgICBQS0NTN192ZXJpZnkoKSBmYWlscyB3aXRoIG5vbiBkZXRhY2hlZCBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERvbid0IHVzZSBnZXRlbnYgaW4gbGlicmFyeSBmdW5jdGlvbnMgd2hlbiBydW4gYXMgc2V0dWlkL3NldGdpZC4KICAgICBOZXcgZnVuY3Rpb24gT1BFTlNTTF9pc3NldHVnaWQoKS4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSAoY3J5cHRvL21lbV9kYmcuYykKICAgICBkdWUgdG8gaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG11bHRpLXRocmVhZGluZzoKCiAgICAgMS4gRml4IHRpbWluZyBnbGl0Y2ggaW4gdGhlIE1lbUNoZWNrX29mZigpIHBvcnRpb24gb2YgQ1JZUFRPX21lbV9jdHJsKCkuCgogICAgIDIuIEZpeCBsb2dpY2FsIGdsaXRjaCBpbiBpc19NZW1DaGVja19vbigpIGFrYSBDUllQVE9faXNfbWVtX2NoZWNrX29uKCkuCgogICAgIDMuIENvdW50IGhvdyBtYW55IHRpbWVzIE1lbUNoZWNrX29mZigpIGhhcyBiZWVuIGNhbGxlZCBzbyB0aGF0CiAgICAgICAgbmVzdGVkIHVzZSBjYW4gYmUgdHJlYXRlZCBjb3JyZWN0bHkuICBUaGlzIGFsc28gYXZvaWRzIAogICAgICAgIGluYmFuZC1zaWduYWxsaW5nIGluIHRoZSBwcmV2aW91cyBjb2RlICh3aGljaCByZWxpZWQgb24gdGhlCiAgICAgICAgYXNzdW1wdGlvbiB0aGF0IHRocmVhZCBJRCAwIGlzIGltcG9zc2libGUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAiLXJhbmQiIG9wdGlvbiBhbHNvIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IENQVSBkZXRlY3Rpb24gb24gSXJpeCA2LnguCiAgICAgW0t1cnQgSG9ja2VuYnVyeSA8a2hvY2tlbmJAc3RldmVucy10ZWNoLmVkdT4gYW5kCiAgICAgICJCcnVjZSBXLiBGb3JzYmVyZyIgPGJydWNlLmZvcnNiZXJnQGJhZXN5c3RlbXMuY29tPl0KCiAgKikgRml4IFg1MDlfTkFNRSBidWcgd2hpY2ggcHJvZHVjZWQgaW5jb3JyZWN0IGVuY29kaW5nIGlmIFg1MDlfTkFNRQogICAgIHdhcyBlbXB0eS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFVzZSB0aGUgY2FjaGVkIGVuY29kaW5nIG9mIGFuIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KICAgICBjb3B5aW5nIGl0LiBUaGlzIGlzIGFwcGFyZW50bHkgdGhlIHJlYXNvbiBmb3IgdGhlIGxpYnNhZmUgImVycm9ycyIKICAgICBidXQgdGhlIGNvZGUgaXMgYWN0dWFsbHkgY29ycmVjdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uIEJOX3JhbmRfcmFuZ2UoKSwgYW5kIGZpeCBEU0Ffc2lnbl9zZXR1cCgpIHRvIHByZXZlbnQKICAgICBCbGVpY2hlbmJhY2hlcidzIERTQSBhdHRhY2suCiAgICAgRXh0ZW5kIEJOX1twc2V1ZG9fXXJhbmQ6IEFzIGJlZm9yZSwgdG9wPTEgZm9yY2VzIHRoZSBoaWdoZXN0IHR3byBiaXRzCiAgICAgdG8gYmUgc2V0IGFuZCB0b3A9MCBmb3JjZXMgdGhlIGhpZ2hlc3QgYml0IHRvIGJlIHNldDsgdG9wPS0xIGlzIG5ldwogICAgIGFuZCBsZWF2ZXMgdGhlIGhpZ2hlc3QgYml0IHJhbmRvbS4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgSW4gdGhlIE5DT05GXy4uLi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgZm9yIENPTkZfLi4uIHF1ZXJpZXMKICAgICAoY3J5cHRvL2NvbmYvY29uZl9saWIuYyksIGlmIHRoZSBpbnB1dCBMSEFTSCBpcyBOVUxMLCBhdm9pZCB1c2luZwogICAgIGEgdGVtcG9yYXJ5IENPTkYgc3RydWN0dXJlIHdpdGggdGhlIGRhdGEgY29tcG9uZW50IHNldCB0byBOVUxMCiAgICAgKHdoaWNoIGdpdmVzIHNlZ21lbnRhdGlvbiBmYXVsdHMgaW4gbGhfcmV0cmlldmUpLgogICAgIEluc3RlYWQsIHVzZSBOVUxMIGZvciB0aGUgQ09ORiBwb2ludGVyIGluIENPTkZfZ2V0X3N0cmluZyBhbmQKICAgICBDT05GX2dldF9udW1iZXIgKHdoaWNoIG1heSB1c2UgZW52aXJvbm1lbnQgdmFyaWFibGVzKSBhbmQgZGlyZWN0bHkKICAgICByZXR1cm4gTlVMTCBmcm9tIENPTkZfZ2V0X3NlY3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBmb3IgRUJDRElDLgogICAgIFtVbGYgTW9lbGxlcl0KCiAgKikgVG9sZXJhdGUgbm9uUmVwdWRpYXRpb24gYXMgYmVpbmcgdmFsaWQgZm9yIFMvTUlNRSBzaWduaW5nIGFuZCBjZXJ0U2lnbgogICAgIGtleVVzYWdlIGlmIGJhc2ljQ29uc3RyYWludHMgYWJzZW50IGZvciBhIENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgU01JTUVfd3JpdGVfUEtDUzcoKSB3cml0ZSBtYWlsIGhlYWRlciB2YWx1ZXMgd2l0aCBhIGZvcm1hdCB0aGF0CiAgICAgaXMgbW9yZSBnZW5lcmFsbHkgYWNjZXB0ZWQgKG5vIHNwYWNlcyBiZWZvcmUgdGhlIHNlbWljb2xvbiksIHNpbmNlCiAgICAgc29tZSBwcm9ncmFtcyBjYW4ndCBwYXJzZSB0aG9zZSB2YWx1ZXMgcHJvcGVybHkgb3RoZXJ3aXNlLiAgQWxzbyBtYWtlCiAgICAgc3VyZSBCSU8ncyB0aGF0IGJyZWFrIGxpbmVzIGFmdGVyIGVhY2ggd3JpdGUgZG8gbm90IGNyZWF0ZSBpbnZhbGlkCiAgICAgaGVhZGVycy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHRoZSBDUkwgZW5jb2Rpbmcgcm91dGluZXMgd29yayB3aXRoIGVtcHR5IFNFUVVFTkNFIE9GLiBUaGUKICAgICBtYWNyb3MgcHJldmlvdXNseSB1c2VkIHdvdWxkIG5vdCBlbmNvZGUgYW4gZW1wdHkgU0VRVUVOQ0UgT0YKICAgICBhbmQgYnJlYWsgdGhlIHNpZ25hdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIFplcm8gdGhlIHByZW1hc3RlciBzZWNyZXQgYWZ0ZXIgZGVyaXZpbmcgdGhlIG1hc3RlciBzZWNyZXQgaW4KICAgICBESCBjaXBoZXJzdWl0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgRVZQX2FkZF9kaWdlc3RfYWxpYXMgcmVnaXN0cmF0aW9ucyAoYXMgZm91bmQgaW4KICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpKSB0byBTU0xfbGlicmFyeV9pbml0KCkKICAgICBha2EgT3BlblNTTF9hZGRfc3NsX2FsZ29yaXRobXMoKS4gIFRoaXMgcHJvdmlkZXMgaW1wcm92ZWQKICAgICBjb21wYXRpYmlsaXR5IHdpdGggcGVlcnMgdXNpbmcgWC41MDkgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB1bmNvbnZlbnRpb25hbCBBbGdvcml0aG1JZGVudGlmaWVyIE9JRHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBJcml4IHdpdGggTk9fQVNNLgogICAgIFsiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIC4vY29uZmlnIHNjcmlwdCBmaXhlcy4KICAgICBbVWxmIE1vZWxsZXIsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4ICdvcGVuc3NsIHBhc3N3ZCAtMScuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFBLQ1MxMl9rZXlfZ2VuX2FzYygpIHNvIGl0IGNhbiBjb3BlIHdpdGggbm9uIG51bGwKICAgICB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hvc2UgbGVuZ3RoIGlzIHBhc3NlZCBpbiB0aGUgcGFzc2xlbgogICAgIHBhcmFtZXRlciwgZm9yIGV4YW1wbGUgZnJvbSBQRU0gY2FsbGJhY2tzLiBUaGlzIHdhcyBkb25lCiAgICAgYnkgYWRkaW5nIGFuIGV4dHJhIGxlbmd0aCBwYXJhbWV0ZXIgdG8gYXNjMnVuaSgpLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IDxvZGRpc3NleUBzYW1zdW5nLmNvLmtyPl0KCiAgKikgRml4IEMgY29kZSBnZW5lcmF0ZWQgYnkgJ29wZW5zc2wgZHNhcGFyYW0gLUMnOiBJZiBhIEJOX2JpbjJibgogICAgIGNhbGwgZmFpbGVkLCBmcmVlIHRoZSBEU0Egc3RydWN0dXJlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCB0byB1bmkyYXNjKCkgdG8gY29wZSB3aXRoIHplcm8gbGVuZ3RoIFVuaWNvZGUgc3RyaW5ncy4KICAgICBUaGVzZSBhcmUgcHJlc2VudCBpbiBzb21lIFBLQ1MjMTIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jcmVhc2UgczItPndidWYgYWxsb2NhdGlvbiBieSBvbmUgYnl0ZSBpbiBzc2wyX25ldyAoc3NsL3MyX2xpYi5jKS4KICAgICBPdGhlcndpc2UgZG9fc3NsX3dyaXRlIChzc2wvczJfcGt0LmMpIHdpbGwgd3JpdGUgYmV5b25kIGJ1ZmZlciBsaW1pdHMKICAgICB3aGVuIHdyaXRpbmcgYSAzMjc2NyBieXRlIHJlY29yZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEVyaWMgRGF5IDxlZGF5QGNvbmNlbnRyaWMubmV0Pl0KCiAgKikgSW4gUlNBX2VheV9wdWJsaWNfe2VuLGVkfWNyeXB0IGFuZCBSU0FfZWF5X21vZF9leHAgKHJzYV9lYXkuYyksCiAgICAgb2J0YWluIGxvY2sgQ1JZUFRPX0xPQ0tfUlNBIGJlZm9yZSBzZXR0aW5nIHJzYS0+X21ldGhvZF9tb2Rfe24scCxxfS4KCiAgICAgKFJTQSBvYmplY3RzIGhhdmUgYSByZWZlcmVuY2UgY291bnQgYWNjZXNzIHRvIHdoaWNoIGlzIHByb3RlY3RlZAogICAgIGJ5IENSWVBUT19MT0NLX1JTQSBbc2VlIHJzYV9saWIuYywgczNfc3J2ci5jLCBzc2xfY2VydC5jLCBzc2xfcnNhLmNdLAogICAgIHNvIHRoZXkgYXJlIG1lYW50IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuKQogICAgIFtCb2RvIE1vZWxsZXIsIEdlb2ZmIFRob3JwZTsgb3JpZ2luYWwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgIlJlZGRpZSwgU3RldmVuIiA8U3RldmVuLlJlZGRpZUBjYS5jb20+XQoKICAqKSBGaXggYSBkZWFkbG9jayBpbiBDUllQVE9fbWVtX2xlYWtzKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGJldHRlciB0ZXN0IHBhdHRlcm5zIGluIGJudGVzdC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgcmFuZF93aW4uYyBmaXggZm9yIEJvcmxhbmQgQy4KICAgICBbVWxmIE32bGxlcl0KIAogICopIEJOX3JzaGlmdCBidWdmaXggZm9yIG4gPT0gMC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSAnYmN0ZXN0JyBzY3JpcHQgdGhhdCBjaGVja3MgZm9yIHNvbWUga25vd24gJ2JjJyBidWdzCiAgICAgc28gdGhhdCAnbWFrZSB0ZXN0JyBkb2VzIG5vdCBhYm9ydCBqdXN0IGJlY2F1c2UgJ2JjJyBpcyBicm9rZW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3RvcmUgdmVyaWZ5X3Jlc3VsdCB3aXRoaW4gU1NMX1NFU1NJT04gYWxzbyBmb3IgY2xpZW50IHNpZGUgdG8KICAgICBhdm9pZCBwb3RlbnRpYWwgc2VjdXJpdHkgaG9sZS4gKFJlLXVzZWQgc2Vzc2lvbnMgb24gdGhlIGNsaWVudCBzaWRlCiAgICAgYWx3YXlzIHJlc3VsdGVkIGluIHZlcmlmeV9yZXN1bHQ9PVg1MDlfVl9PSywgbm90IHVzaW5nIHRoZSBvcmlnaW5hbAogICAgIHJlc3VsdCBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBzc2wzX3BlbmRpbmc6IElmIHRoZSByZWNvcmQgaW4gcy0+czMtPnJyZWMgaXMgbm90IG9mIHR5cGUKICAgICBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEsIHJldHVybiAwLgogICAgIFNpbWlsYXJseSwgY2hhbmdlIHNzbDJfcGVuZGluZyB0byByZXR1cm4gMCBpZiBTU0xfaW5faW5pdChzKSBpcyB0cnVlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0xfcGVlazoKICAgICBCb3RoIHNzbDJfcGVlayBhbmQgc3NsM19wZWVrLCB3aGljaCB3ZXJlIHRvdGFsbHkgYnJva2VuIGluIGVhcmxpZXIKICAgICByZWxlYXNlcywgaGF2ZSBiZWVuIHJlLWltcGxlbWVudGVkIGJ5IHJlbmFtaW5nIHRoZSBwcmV2aW91cwogICAgIGltcGxlbWVudGF0aW9ucyBvZiBzc2wyX3JlYWQgYW5kIHNzbDNfcmVhZCB0byBzc2wyX3JlYWRfaW50ZXJuYWwKICAgICBhbmQgc3NsM19yZWFkX2ludGVybmFsLCByZXNwZWN0aXZlbHksIGFuZCBhZGRpbmcgJ3BlZWsnIHBhcmFtZXRlcnMKICAgICB0byB0aGVtLiAgVGhlIG5ldyBzc2xbMjNdX3tyZWFkLHBlZWt9IGZ1bmN0aW9ucyBhcmUgY2FsbHMgdG8KICAgICBzc2xbMjNdX3JlYWRfaW50ZXJuYWwgd2l0aCB0aGUgJ3BlZWsnIGZsYWcgc2V0IGFwcHJvcHJpYXRlbHkuCiAgICAgQSAncGVlaycgcGFyYW1ldGVyIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gc3NsM19yZWFkX2J5dGVzLCB3aGljaAogICAgIGRvZXMgdGhlIGFjdHVhbCB3b3JrIGZvciBzc2wzX3JlYWRfaW50ZXJuYWwuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbGlzZSAiZXhfZGF0YSIgbWVtYmVyIG9mIFJTQS9EU0EvREggc3RydWN0dXJlcyBwcmlvciB0byBjYWxsaW5nCiAgICAgdGhlIG1ldGhvZC1zcGVjaWZpYyAiaW5pdCgpIiBoYW5kbGVyLiBBbHNvIGNsZWFuIHVwIGV4X2RhdGEgYWZ0ZXIKICAgICBjYWxsaW5nIHRoZSBtZXRob2Qtc3BlY2lmaWMgImZpbmlzaCgpIiBoYW5kbGVyLiBQcmV2aW91c2x5LCB0aGlzIHdhcwogICAgIGhhcHBlbmluZyB0aGUgb3RoZXIgd2F5IHJvdW5kLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEluY3JlYXNlIEJOX0NUWF9OVU0gKHRoZSBudW1iZXIgb2YgQklHTlVNcyBpbiBhIEJOX0NUWCkgdG8gMTYuCiAgICAgVGhlIHByZXZpb3VzIHZhbHVlLCAxMiwgd2FzIG5vdCBhbHdheXMgc3VmZmljaWVudCBmb3IgQk5fbW9kX2V4cCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2Ugc3VyZSB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgZ2V0IHRoZSBpbnRlcm5hbCBuYW1lIGVuZ2luZSB3aXRoCiAgICAgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgYW5kIG5vdCBqdXN0IDAuICBUaGlzIHNob3VsZCBtYXJrIHRoZQogICAgIHNoYXJlZCBsaWJyYXJpZXMgYXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuICBPZiBjb3Vyc2UsIHRoaXMgc2hvdWxkCiAgICAgYmUgY2hhbmdlZCBhZ2FpbiB3aGVuIHdlIGNhbiBndWFyYW50ZWUgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IHR5cG8gaW4gZ2V0X2NlcnRfYnlfc3ViamVjdCgpIGluIGJ5X2Rpci5jCiAgICAgW0plYW4tTWFyYyBEZXNwZXJyaWVyIDxqZWFuLW1hcmMuZGVzcGVycmllckBjZXJ0cGx1cy5jb20+XQoKICAqKSBSZXdvcmsgdGhlIHN5c3RlbSB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzOgoKICAgICAtIE1ha2Ugbm90ZSBvZiB0aGUgZXhwZWN0ZWQgZXh0ZW5zaW9uIGZvciB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQKICAgICAgIGlmIHRoZXJlIGlzIGEgbmVlZCBmb3Igc3ltYm9saWMgbGlua3MgZnJvbSBmb3IgZXhhbXBsZSBsaWJjcnlwdG8uc28uMAogICAgICAgdG8gbGliY3J5cHRvLnNvLjAuOS43LiAgVGhlcmUgaXMgZXh0ZW5kZWQgaW5mbyBpbiBDb25maWd1cmUgZm9yCiAgICAgICB0aGF0LgoKICAgICAtIE1ha2UgYXMgZmV3IHJlYnVpbGRzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFzIHBvc3NpYmxlLgoKICAgICAtIFN0aWxsIGF2b2lkIGxpbmtpbmcgdGhlIE9wZW5TU0wgcHJvZ3JhbXMgd2l0aCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KCiAgICAgLSBXaGVuIGluc3RhbGxpbmcsIGluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc2VwYXJhdGVseSBmcm9tIHRoZQogICAgICAgc3RhdGljIG9uZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQgbWFjcm8gdG8gYWN0dWFsbHkgdXNlIGl0cyBhcmd1bWVudC4KCiAgICAgQ29weSBTU0xfQ1RYJ3MgcmVhZF9haGVhZCBmbGFnIHRvIFNTTCBvYmplY3QgZGlyZWN0bHkgaW4gU1NMX25ldwogICAgIGFuZCBub3QgaW4gU1NMX2NsZWFyIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhbHNvIHVzZWQgYnkgdGhlCiAgICAgYWNjZXB0L2Nvbm5lY3QgZnVuY3Rpb25zOyBwcmV2aW91c2x5LCB0aGUgc2V0dGluZ3MgbWFkZSBieQogICAgIFNTTF9zZXRfcmVhZF9haGVhZCB3b3VsZCBiZSBsb3N0IGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW1zIHJlcG9ydGVkIGJ5IEFuZGVycyBHZXJ0eiA8Z2VydHpAZXBhY3Quc2U+XSAgICAgCgogICopIENvcnJlY3QgdXRpbC9ta2RlZi5wbCB0byBiZSBzZWxlY3RpdmUgYWJvdXQgZGlzYWJsZWQgYWxnb3JpdGhtcy4KICAgICBQcmV2aW91c2x5LCBpdCB3b3VsZCBjcmVhdGUgZW50cmllcyBmb3IgZGlzYWJsZWVkIGFsZ29yaXRobXMgbm8KICAgICBtYXR0ZXIgd2hhdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBzZXZlcmFsIG5ldyBtYW51YWwgcGFnZXMgZm9yIFNTTF8qIGZ1bmN0aW9uLgogICAgIFtMdXR6IEphZW5pY2tlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNWEgYW5kIDAuOS42ICBbMjQgU2VwIDIwMDBdCgogICopIEluIHNzbDIzX2dldF9jbGllbnRfaGVsbG8sIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBmYWNlZAogICAgIHdpdGggYW4gaW5pdGlhbCBTU0wgMy4wL1RMUyByZWNvcmQgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGFpbiB0aGUKICAgICBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UsIGkuZS4gY2xpZW50X3ZlcnNpb24uCiAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcGF0aG9sb2dpYyBjYXNlIHRoYXQgcHJvYmFibHkgaGFzIG5ldmVyIGhhcHBlbmVkCiAgICAgaW4gcmVhbCBsaWZlLikgIFRoZSBwcmV2aW91cyBhcHByb2FjaCB3YXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGZyb20gdGhlIHJlY29yZCBoZWFkZXIgYXMgYSBzdWJzdGl0dXRlOyBidXQgb3VyIHByb3RvY29sIGNob2ljZQogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoYXQgb25lIGJlY2F1c2UgaXQgaXMgbm90IGF1dGhlbnRpY2F0ZWQKICAgICBieSB0aGUgRmluaXNoZWQgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9yZSByb2J1c3QgcmFuZG9tbmVzcyBnYXRoZXJpbmcgZnVuY3Rpb25zIGZvciBXaW5kb3dzLgogICAgIFtKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+XQoKICAqKSBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIGlmIHRoZSBmbGFnIFg1MDlfVl9GTEFHX0lTU1VFUl9DSEVDSyBpcwogICAgIG5vdCBzZXQgdGhlbiB3ZSBkb24ndCBzZXR1cCB0aGUgZXJyb3IgY29kZSBmb3IgaXNzdWVyIGNoZWNrIGVycm9ycwogICAgIHRvIGF2b2lkIHBvc3NpYmx5IG92ZXJ3cml0aW5nIG90aGVyIGVycm9ycyB3aGljaCB0aGUgY2FsbGJhY2sgZG9lcwogICAgIGhhbmRsZS4gSWYgYW4gYXBwbGljYXRpb24gZG9lcyBzZXQgdGhlIGZsYWcgdGhlbiB3ZSBhc3N1bWUgaXQga25vd3MKICAgICB3aGF0IGl0IGlzIGRvaW5nIGFuZCBjYW4gaGFuZGxlIHRoZSBuZXcgaW5mb3JtYXRpb25hbCBjb2RlcwogICAgIGFwcHJvcHJpYXRlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBhIG5hc3R5IGJ1ZyBpbiBBU04xX1RZUEUgaGFuZGxpbmcuIEFTTjFfVFlQRSBpcyB1c2VkIGZvcgogICAgIGEgZ2VuZXJhbCAiQU5ZIiB0eXBlLCBhcyBzdWNoIGl0IHNob3VsZCBiZSBhYmxlIHRvIGRlY29kZSBhbnl0aGluZwogICAgIGluY2x1ZGluZyB0YWdnZWQgdHlwZXMuIEhvd2V2ZXIgaXQgZGlkbid0IGNoZWNrIHRoZSBjbGFzcyBzbyBpdCB3b3VsZAogICAgIHdyb25nbHkgaW50ZXJwcmV0IHRhZ2dlZCB0eXBlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgdW5pdmVyc2FsCiAgICAgY291bnRlcnBhcnQgYW5kIHVua25vd24gdHlwZXMgd2VyZSBqdXN0IHJlamVjdGVkLiBDaGFuZ2VkIHNvIHRoYXQgdGhlCiAgICAgdGFnZ2VkIGFuZCB1bmtub3duIHR5cGVzIGFyZSBoYW5kbGVkIGluIHRoZSBzYW1lIHdheSBhcyBhIFNFUVVFTkNFOgogICAgIHRoYXQgaXMgdGhlIGVuY29kaW5nIGlzIHN0b3JlZCBpbnRhY3QuIFRoZXJlIGlzIGFsc28gYSBuZXcgdHlwZQogICAgICJWX0FTTjFfT1RIRVIiIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgY2xhc3MgaXMgbm90IHVuaXZlcnNhbCwgaW4gdGhpcwogICAgIGNhc2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGFjdHVhbCB0eXBlIGlzIHNvIHdlIGp1c3QgbHVtcCB0aGVtIGFsbAogICAgIHRvZ2V0aGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE9uIFZNUywgc3Rkb3V0IG1heSB2ZXJ5IHdlbGwgbGVhZCB0byBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIHRvCiAgICAgaW4gYSByZWNvcmQtb3JpZW50ZWQgZmFzaGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBldmVyeSB3cml0ZSgpIHdpbGwKICAgICB3cml0ZSBhIHNlcGFyYXRlIHJlY29yZCwgd2hpY2ggd2lsbCBiZSByZWFkIHNlcGFyYXRlbHkgYnkgdGhlCiAgICAgcHJvZ3JhbXMgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4gIFRoaXMgY2FuIGJlIHZlcnkgY29uZnVzaW5nLgoKICAgICBUaGUgc29sdXRpb24gaXMgdG8gcHV0IGEgQklPIGZpbHRlciBpbiB0aGUgd2F5IHRoYXQgd2lsbCBidWZmZXIKICAgICB0ZXh0IHVudGlsIGEgbGluZWZlZWQgaXMgcmVhY2hlZCwgYW5kIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBhCiAgICAgbGluZSBhdCBhIHRpbWUsIHNvIGV2ZXJ5IHJlY29yZCB3cml0dGVuIHdpbGwgYmUgYW4gYWN0dWFsIGxpbmUsCiAgICAgbm90IGNodW5rcyBvZiBsaW5lcyBhbmQgbm90ICh1c3VhbGx5IGRvZXNuJ3QgaGFwcGVuLCBidXQgSSd2ZQogICAgIHNlZW4gaXQgb25jZSkgc2V2ZXJhbCBsaW5lcyBpbiBvbmUgcmVjb3JkLiAgQklPX2ZfbGluZWJ1ZmZlcigpIGlzCiAgICAgdGhlIGFuc3dlci4KCiAgICAgQ3VycmVudGx5LCBpdCdzIGEgVk1TLW9ubHkgbWV0aG9kLCBiZWNhdXNlIHRoYXQncyB3aGVyZSBpdCBoYXMKICAgICBiZWVuIHRlc3RlZCB3ZWxsIGVub3VnaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgJ29wdGltaXplZCcgc3F1YXJpbmcgdmFyaWFudCBpbiBCTl9tb2RfbXVsX21vbnRnb21lcnksCiAgICAgaXQgY2FuIHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cy4KICAgICAoTm90ZTogVGhlIGJ1Z2d5IHZhcmlhbnQgd2FzIG5vdCBlbmFibGVkIGluIE9wZW5TU0wgMC45LjVhLAogICAgIGJ1dCBpdCB3YXMgaW4gMC45LjYtYmV0YVsxMl0uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgdGhlIGNoZWNrIGZvciBjb250ZW50IGJlaW5nIHByZXNlbnQgd2hlbiB2ZXJpZnlpbmcgZGV0YWNoZWQKICAgICBzaWduYXR1cmVzIGluIHBrN19zbWltZS5jLiBTb21lIHZlcnNpb25zIG9mIE5ldHNjYXBlICh3cm9uZ2x5KQogICAgIGluY2x1ZGUgemVybyBsZW5ndGggY29udGVudCB3aGVuIHNpZ25pbmcgbWVzc2FnZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEJJT19zaHV0ZG93bl93ciBtYWNybywgd2hpY2ggaW52b2tlcyB0aGUgQklPX0NfU0hVVERPV05fV1IKICAgICBCSU9fY3RybCAoZm9yIEJJTyBwYWlycykuCiAgICAgW0JvZG8gTfZsbGVyXQoKICAqKSBBZGQgRFNPIG1ldGhvZCBmb3IgVk1TLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJ1ZyBmaXg6IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gY291bGQgcHJvZHVjZSByZXN1bHRzIHdpdGggdGhlCiAgICAgd3Jvbmcgc2lnbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFJQTSBzcGVjaWZpY2F0aW9uIG9wZW5zc2wuc3BlYyBhbmQgbW9kaWZ5IGl0IHRvIGJ1aWxkIHRocmVlCiAgICAgcGFja2FnZXMuICBUaGUgZGVmYXVsdCBwYWNrYWdlIGNvbnRhaW5zIGFwcGxpY2F0aW9ucywgYXBwbGljYXRpb24KICAgICBkb2N1bWVudGF0aW9uIGFuZCBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgZGV2ZWwgcGFja2FnZSBjb250YWlucwogICAgIGluY2x1ZGUgZmlsZXMsIHN0YXRpYyBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24uICBUaGUKICAgICBkb2MgcGFja2FnZSBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlIGRvYyBkaXJlY3RvcnkuICBUaGUgb3JpZ2luYWwKICAgICBvcGVuc3NsLnNwZWMgd2FzIHByb3ZpZGVkIGJ5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KICAgICAKICAqKSBBZGQgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcyBmb3IgbWFueSBTU0wgcm91dGluZXMuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBTb255IE5ld3MgNC4KICAgICBbTkFLQUpJIEhpcm95dWtpIDxuYWthamlAdHV0cnAudHV0LmFjLmpwPl0KCiAgKikgRG9uJ3Qgc2V0IHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIG9uZSB3aGVuIGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSBudW1iZXIgPCBxIGluIHRoZSBEU0EgbGlicmFyeS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IFNTTCBBUEkgbW9kZSAnU1NMX01PREVfQVVUT19SRVRSWScuICBUaGlzIGRpc2FibGVzIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHRoYXQgU1NMX3JlYWQgbWF5IHJlc3VsdCBpbiBTU0xfRVJST1JfV0FOVF9SRUFEIChldmVuIGlmCiAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIGJsb2NraW5nKSBpZiBhIGhhbmRzaGFrZSB0b29rIHBsYWNlLgogICAgIChUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIHNfY2xpZW50CiAgICAgYW5kIHNfc2VydmVyIHRoYXQgdXNlIHNlbGVjdCgpIHRvIGRldGVybWluZSB3aGVuIHRvIHVzZSBTU0xfcmVhZDsKICAgICBidXQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGtub3cgaW4gYWR2YW5jZSB3aGVuIHRvIGV4cGVjdCBkYXRhLCBpdAogICAgIGp1c3QgbWFrZXMgdGhpbmdzIG1vcmUgY29tcGxpY2F0ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSQU5EX2VnZF9ieXRlcygpLCB3aGljaCBnaXZlcyBjb250cm9sIG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAgZnJvbSBFR0QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGZldyBtb3JlIEVCQ0RJQyBjb25kaXRpb25hbHMgdGhhdCBtYWtlIGByZXEnIGFuZCBgeDUwOScKICAgICB3b3JrIGJldHRlciBvbiBzdWNoIHN5c3RlbXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBBZGQgdHdvIGRlbW8gcHJvZ3JhbXMgZm9yIFBLQ1MxMl9wYXJzZSgpIGFuZCBQS0NTMTJfY3JlYXRlKCkuCiAgICAgVXBkYXRlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IGNvcGllcyB0aGUgZnJpZW5kbHlOYW1lIGFuZCB0aGUKICAgICBrZXlpZCB0byB0aGUgY2VydGlmaWNhdGVzIGF1eCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gUEtDUzdfdmVyaWZ5KCkgd2hpY2ggY2F1c2VkIGFuIGluZmluaXRlIGxvb3AKICAgICBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBzaWduYXR1cmUuCiAgICAgW1N2ZW4gVXN6cGVsa2F0IDxzdUBjZWxvY29tLmRlPl0KCiAgKikgTWFqb3IgY2hhbmdlIGluIHV0aWwvbWtkZWYucGwgdG8gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbgogICAgIGFib3V0IGVhY2ggc3ltYm9sLCBhcyB3ZWxsIGFzIHByZXNlbnRpbmcgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBmdW5jdGlvbnMuICBUaGlzIGNoYW5nZSBtZWFucyB0aGF0IHRoZXJlJ3MgbiBtb3JlIG5lZWQKICAgICB0byByZWJ1aWxkIHRoZSAubnVtIGZpbGVzIHdoZW4gc29tZSBhbGdvcml0aG1zIGFyZSBleGNsdWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyB0aGUgdmVyaWZ5IHRpbWUgdG8gYmUgc2V0IGJ5IGFuIGFwcGxpY2F0aW9uLAogICAgIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyB0aGUgY3VycmVudCB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgCiAgKikgUGhhc2UgMiB2ZXJpZnkgY29kZSByZW9yZ2FuaXNhdGlvbi4gVGhlIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IGNvZGUgbm93IGxvb2tzIHVwIGFuIGlzc3VlciBjZXJ0aWZpY2F0ZSBieSBhCiAgICAgbnVtYmVyIG9mIGNyaXRlcmlhOiBzdWJqZWN0IG5hbWUsIGF1dGhvcml0eSBrZXkgaWQKICAgICBhbmQga2V5IHVzYWdlLiBJdCBhbHNvIHZlcmlmaWVzIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcwogICAgIGJ5IHRoZSBzYW1lIGNyaXRlcmlhLiBUaGUgbWFpbiBjb21wYXJpc29uIGZ1bmN0aW9uIGlzCiAgICAgWDUwOV9jaGVja19pc3N1ZWQoKSB3aGljaCBwZXJmb3JtcyB0aGVzZSBjaGVja3MuCiAKICAgICBMb3Qgb2YgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMKICAgICB3aXRob3V0IGNvbXBsZXRlbHkgcmV3cml0aW5nIHRoZSBsb29rdXAgY29kZS4KIAogICAgIEF1dGhvcml0eSBhbmQgc3ViamVjdCBrZXkgaWRlbnRpZmllciBhcmUgbm93IGNhY2hlZC4KIAogICAgIFRoZSBMSEFTSCAnY2VydHMnIGlzIFg1MDlfU1RPUkUgaGFzIG5vdyBiZWVuIHJlcGxhY2VkCiAgICAgYnkgYSBTVEFDS19PRihYNTA5X09CSkVDVCkuIFRoaXMgaXMgbWFpbmx5IGJlY2F1c2UgYW4KICAgICBMSEFTSCBjYW4ndCBzdG9yZSBvciByZXRyaWV2ZSBtdWx0aXBsZSBvYmplY3RzIHdpdGgKICAgICB0aGUgc2FtZSBoYXNoIHZhbHVlLgoKICAgICBBcyBhIHJlc3VsdCB2YXJpb3VzIGZ1bmN0aW9ucyAod2hpY2ggd2VyZSBhbGwgaW50ZXJuYWwKICAgICB1c2Ugb25seSkgaGF2ZSBjaGFuZ2VkIHRvIGhhbmRsZSB0aGUgbmV3IFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2lsbCBicmVhayBhbnl0aGluZyB0aGF0IG1lc3NlZCByb3VuZAogICAgIHdpdGggWDUwOV9TVE9SRSBpbnRlcm5hbGx5LgogCiAgICAgVGhlIGZ1bmN0aW9ucyBYNTA5X1NUT1JFX2FkZF9jZXJ0KCkgbm93IGNoZWNrcyBmb3IgYW4KICAgICBleGFjdCBtYXRjaCwgcmF0aGVyIHRoYW4ganVzdCBzdWJqZWN0IG5hbWUuCiAKICAgICBUaGUgWDUwOV9TVE9SRSBBUEkgZG9lc24ndCBkaXJlY3RseSBzdXBwb3J0IHRoZSByZXRyaWV2YWwKICAgICBvZiBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgbWF0Y2hpbmcgYSBnaXZlbiBjcml0ZXJpYSwgaG93ZXZlcgogICAgIHRoaXMgY2FuIGJlIHdvcmtlZCByb3VuZCBieSBwZXJmb3JtaW5nIGEgbG9va3VwIGZpcnN0CiAgICAgKHdoaWNoIHdpbGwgZmlsbCB0aGUgY2FjaGUgd2l0aCBjYW5kaWRhdGUgY2VydGlmaWNhdGVzKQogICAgIGFuZCB0aGVuIGV4YW1pbmluZyB0aGUgY2FjaGUgZm9yIG1hdGNoZXMuIFRoaXMgaXMgcHJvYmFibHkKICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCB0aHJvd2luZyBvdXQgWDUwOV9MT09LVVAKICAgICBlbnRpcmVseSAobWF5YmUgbGF0ZXIuLi4pLgogCiAgICAgVGhlIFg1MDlfVkVSSUZZX0NUWCBzdHJ1Y3R1cmUgaGFzIGJlZW4gZW5oYW5jZWQgY29uc2lkZXJhYmx5LgogCiAgICAgQWxsIGNlcnRpZmljYXRlIGxvb2t1cCBvcGVyYXRpb25zIG5vdyBnbyB2aWEgYSBnZXRfaXNzdWVyKCkKICAgICBjYWxsYmFjay4gQWx0aG91Z2ggdGhpcyBjdXJyZW50bHkgdXNlcyBhbiBYNTA5X1NUT1JFIGl0CiAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IGN1c3RvbSBsb29rdXBzLiBUaGlzIGlzIGEgc2ltcGxlIHdheQogICAgIHRvIGJ5cGFzcyB0aGUgWDUwOV9TVE9SRSBoYWNrZXJ5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKICAgICB3b3JrIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgbW9yZSBlZmZpY2llbnQgdGVjaG5pcXVlcwogICAgIGluIGZ1dHVyZS4gQSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIHdoaWNoIHVzZXMgYSBzaW1wbGUKICAgICBTVEFDSyBmb3IgaXRzIHRydXN0ZWQgY2VydGlmaWNhdGUgc3RvcmUgaXMgYWxzbyBwcm92aWRlZAogICAgIHVzaW5nIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soKS4KIAogICAgIFRoZSB2ZXJpZnlfY2IoKSBhbmQgdmVyaWZ5KCkgY2FsbGJhY2tzIG5vdyBoYXZlIGVxdWl2YWxlbnRzCiAgICAgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KIAogICAgIFg1MDlfU1RPUkVfQ1RYIGFsc28gaGFzIGEgJ2ZsYWdzJyBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHRvIGN1c3RvbWlzZSB0aGUgdmVyaWZ5IGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQogCiAgKikgQWRkIG5ldyBQS0NTIzcgc2lnbmluZyBvcHRpb24gUEtDUzdfTk9TTUlNRUNBUCB3aGljaCAKICAgICBleGNsdWRlcyBTL01JTUUgY2FwYWJpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzIHJlYWQgaW4ga2VlcCBhIGNvcHkgb2YgdGhlCiAgICAgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlIHNpZ25lZCBkYXRhIGFuZCB1c2UgaXQgd2hlbiBvdXRwdXRpbmcKICAgICBhZ2Fpbi4gU2lnbmF0dXJlcyB0aGVuIHVzZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgcmF0aGVyIHRoYW4KICAgICBhIGRlY29kZWQsIGVuY29kZWQgdmVyc2lvbiB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhlCiAgICAgcmVxdWVzdCBpcyBpbXByb3Blcmx5IGVuY29kZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgQklPX3B1dHMgaW1wbGVtZW50YXRpb25zLCBjYWxsCiAgICAgYnVmZmVyX3dyaXRlKGIsIC4uLikgZGlyZWN0bHkgaW4gYnVmZmVyX3B1dHMgaW5zdGVhZCBvZiBjYWxsaW5nCiAgICAgQklPX3dyaXRlKGIsIC4uLikuCgogICAgIEluIEJJT19wdXRzLCBpbmNyZW1lbnQgYi0+bnVtX3dyaXRlIGFzIGluIEJJT193cml0ZS4KICAgICBbUGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnJdCgogICopIEZpeCBCTl9tdWxfd29yZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHdvcmQgaXMgMC4gKFdlIGhhdmUgdG8gdXNlCiAgICAgQk5femVybywgd2UgbWF5IG5vdCByZXR1cm4gYSBCSUdOVU0gd2l0aCBhbiBhcnJheSBjb25zaXN0aW5nIG9mCiAgICAgd29yZHMgc2V0IHRvIHplcm8uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGNhbGxpbmcgYWJvcnQoKSBmcm9tIHdpdGhpbiB0aGUgbGlicmFyeSB3aGVuIHByb2JsZW1zIGFyZQogICAgIGRldGVjdGVkLCBleGNlcHQgaWYgcHJlcHJvY2Vzc29yIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAoc3VjaCBhcyBSRUZfQ0hFQ0ssIEJOX0RFQlVHIGV0Yy4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcGVuc3NsIGFwcGxpY2F0aW9uICdyc2F1dGwnLiBUaGlzIHV0aWxpdHkgY2FuIGJlCiAgICAgdXNlZCBmb3IgbG93IGxldmVsIFJTQSBvcGVyYXRpb25zLiBERVIgcHVibGljIGtleQogICAgIEJJTy9mcCByb3V0aW5lcyBhbHNvIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgZW50cnkgYW5kIHBhdGNoZXMgZm9yIGNvbXBpbGluZyBvbiBRTlggNC4KICAgICBbQW5kcmVhcyBTY2huZWlkZXIgPGFuZHJlYXNAZHMzLmV0ZWNoLmZoLWhhbWJ1cmcuZGU+XQoKICAqKSBBIGRlbW8gc3RhdGUtbWFjaGluZSBpbXBsZW1lbnRhdGlvbiB3YXMgc3BvbnNvcmVkIGJ5CiAgICAgTnVyb24gKGh0dHA6Ly93d3cubnVyb24uY29tLykgYW5kIGlzIG5vdyBhdmFpbGFibGUgaW4KICAgICBkZW1vcy9zdGF0ZV9tYWNoaW5lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgb3B0aW9ucyBhZGRlZCB0byB0aGUgJ2Rnc3QnIHV0aWxpdHkgZm9yIHNpZ25hdHVyZQogICAgIGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbnJlY29nbml6ZWQgUEtDUyM3IGNvbnRlbnQgdHlwZXMgYXJlIG5vdyBoYW5kbGVkIHZpYSBhCiAgICAgY2F0Y2ggYWxsIEFTTjFfVFlQRSBzdHJ1Y3R1cmUuIFRoaXMgYWxsb3dzIHVuc3VwcG9ydGVkCiAgICAgdHlwZXMgdG8gYmUgc3RvcmVkIGFzIGEgImJsb2IiIGFuZCBhbiBhcHBsaWNhdGlvbiBjYW4KICAgICBlbmNvZGUgYW5kIGRlY29kZSBpdCBtYW51YWxseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBzaWduZWQvdW5zaWduZWQgaXNzdWVzIHRvIG1ha2UgYV9zdHJleC5jCiAgICAgY29tcGlsZSB1bmRlciBWQysrLgogICAgIFtPc2NhciBKYWNvYnNzb24gPG9zY2FyLmphY29ic3NvbkBjZWxvY29tLmNvbT5dCgogICopIEFTTjEgZml4ZXMuIGkyZF9BU04xX09CSkVDVCB3YXMgbm90IHJldHVybmluZyB0aGUgY29ycmVjdAogICAgIGxlbmd0aCBpZiBwYXNzZWQgYSBidWZmZXIuIEFTTjFfSU5URUdFUl90b19CTiBmYWlsZWQKICAgICBpZiBwYXNzZWQgYSBOVUxMIEJOIGFuZCBpdHMgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFN2ZW4gSGVpYmVyZyA8c3ZlbkB0YXJ0dS5jeWJlci5lZT5dCgogICopIE1vZGlmaWNhdGlvbiB0byBQS0NTIzcgZW5jb2Rpbmcgcm91dGluZXMgdG8gb3V0cHV0IGRlZmluaXRlCiAgICAgbGVuZ3RoIGVuY29kaW5nLiBTaW5jZSBjdXJyZW50bHkgdGhlIHdob2xlIHN0cnVjdHVyZXMgYXJlIGluCiAgICAgbWVtb3J5IHRoZXJlJ3Mgbm90IHJlYWwgcG9pbnQgaW4gdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggCiAgICAgY29uc3RydWN0ZWQgZW5jb2RpbmcuIEhvd2V2ZXIgaWYgT3BlblNTTCBpcyBjb21waWxlZCB3aXRoCiAgICAgdGhlIGZsYWcgUEtDUzdfSU5ERUZJTklURV9FTkNPRElORyB0aGUgb2xkIGZvcm0gaXMgdXNlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBCSU9fdnByaW50ZigpIGFuZCBCSU9fdnNucHJpbnRmKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgbW9yZSBwcmVmaXhlcyB0byBwYXJzZSBmb3IgaW4gdGhlIHRoZSBzdHJpbmdzIHdyaXR0ZW4KICAgICB0aHJvdWdoIGEgbG9nZ2luZyBiaW8sIHRvIGNvdmVyIGFsbCB0aGUgbGV2ZWxzIHRoYXQgYXJlIGF2YWlsYWJsZQogICAgIHRocm91Z2ggc3lzbG9nLiAgVGhlIHByZWZpeGVzIGFyZSBub3c6CgoJUEFOSUMsIEVNRVJHLCBFTVIJPT4JTE9HX0VNRVJHCglBTEVSVCwgQUxSCQk9PglMT0dfQUxFUlQKCUNSSVQsIENSSQkJPT4JTE9HX0NSSVQKCUVSUk9SLCBFUlIJCT0+CUxPR19FUlIKCVdBUk5JTkcsIFdBUk4sIFdBUgk9PglMT0dfV0FSTklORwoJTk9USUNFLCBOT1RFLCBOT1QJPT4JTE9HX05PVElDRQoJSU5GTywgSU5GCQk9PglMT0dfSU5GTwoJREVCVUcsIERCRwkJPT4JTE9HX0RFQlVHCgogICAgIGFuZCBhcyBiZWZvcmUsIGlmIG5vbmUgb2YgdGhvc2UgcHJlZml4ZXMgYXJlIHByZXNlbnQgYXQgdGhlCiAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIExPR19FUlIgaXMgY2hvc2VuLgoKICAgICBPbiBXaW4zMiwgdGhlIExPR18qIGxldmVscyBhcmUgbWFwcGVkIGFjY29yZGluZyB0byB0aGlzOgoKCUxPR19FTUVSRywgTE9HX0FMRVJULCBMT0dfQ1JJVCwgTE9HX0VSUgk9PiBFVkVOVExPR19FUlJPUl9UWVBFCglMT0dfV0FSTklORwkJCQk9PiBFVkVOVExPR19XQVJOSU5HX1RZUEUKCUxPR19OT1RJQ0UsIExPR19JTkZPLCBMT0dfREVCVUcJCT0+IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUKCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFkZSBpdCBwb3NzaWJsZSB0byByZWNvbmZpZ3VyZSB3aXRoIGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhcmd1bWVudCAicmVjb25mIiBvciAicmVjb25maWd1cmUiLiAgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBhcmUgc3RvcmVkIGluIE1ha2VmaWxlLnNzbCBpbiB0aGUgdmFyaWFibGUgQ09ORklHVVJFX0FSR1MsCiAgICAgYW5kIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGVyZSB3aGVuIHJlY29uZmlndXJpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTUQ0IGltcGxlbWVudGVkLgogICAgIFtBc3NhciBXZXN0ZXJsdW5kIDxhc3NhckBzaWNzLnNlPiwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGFyZ3VtZW50cyAtQ0FmaWxlIGFuZCAtQ0FwYXRoIHRvIHRoZSBwa2NzMTIgdXRpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgb2JqX2RhdC5wbCBzY3JpcHQgd2FzIG1lc3NpbmcgdXAgdGhlIHNvcnRpbmcgb2Ygb2JqZWN0CiAgICAgbmFtZXMuIFRoZSByZWFzb24gd2FzIHRoYXQgaXQgY29tcGFyZWQgdGhlIHF1b3RlZCB2ZXJzaW9uCiAgICAgb2Ygc3RyaW5ncyBhcyBhIHJlc3VsdCAiT0NTUCIgPiAiT0NTUCBTaWduaW5nIiBiZWNhdXNlCiAgICAgIiA+IFNQQUNFLiBDaGFuZ2VkIHNjcmlwdCB0byBzdG9yZSB1bnF1b3RlZCB2ZXJzaW9ucyBvZgogICAgIG5hbWVzIGFuZCBhZGQgcXVvdGVzIG9uIG91dHB1dC4gSXQgd2FzIGFsc28gb21pdHRpbmcgc29tZQogICAgIG5hbWVzIGZyb20gdGhlIGxvb2t1cCB0YWJsZSBpZiB0aGV5IHdlcmUgZ2l2ZW4gYSBkZWZhdWx0CiAgICAgdmFsdWUgKHRoYXQgaXMgaWYgU04gaXMgbWlzc2luZyBpdCBpcyBnaXZlbiB0aGUgc2FtZQogICAgIHZhbHVlIGFzIExOIGFuZCB2aWNlIHZlcnNhKSwgdGhlc2UgYXJlIG5vdyBhZGRlZCBvbiB0aGUKICAgICBncm91bmRzIHRoYXQgaWYgYW4gb2JqZWN0IGhhcyBhIG5hbWUgd2Ugc2hvdWxkIGJlIGFibGUgdG8KICAgICBsb29rIGl0IHVwLiBGaW5hbGx5IGFkZGVkIHdhcm5pbmcgb3V0cHV0IHdoZW4gZHVwbGljYXRlCiAgICAgc2hvcnQgb3IgbG9uZyBuYW1lcyBhcmUgZm91bmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyBuZWVkZWQgZm9yIFRhbmRlbSBOU0suCiAgICAgW1Njb3R0IFVyb2ZmIDxzY290dEB4eXByby5jb20+XQoKICAqKSBGaXggU1NMIDIuMCByb2xsYmFjayBjaGVja2luZzogRHVlIHRvIGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4KICAgICBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMoKSwgc3BlY2lhbCBwYWRkaW5nIHdhcyBuZXZlciBkZXRlY3RlZAogICAgIGFuZCB0aHVzIHRoZSBTU0wgMy4wL1RMUyAxLjAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBwcm90b2NvbAogICAgIHZlcnNpb24gcm9sbGJhY2sgYXR0YWNrcyB3YXMgbm90IGVmZmVjdGl2ZS4KCiAgICAgSW4gczIzX2NsbnQuYywgZG9uJ3QgdXNlIHNwZWNpYWwgcm9sbGJhY2stYXR0YWNrIGRldGVjdGlvbiBwYWRkaW5nCiAgICAgKFJTQV9TU0xWMjNfUEFERElORykgaWYgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZQogICAgIGNsaWVudDsgc2ltaWxhcmx5LCBpbiBzMjNfc3J2ci5jLCBkb24ndCBkbyB0aGUgcm9sbGJhY2sgY2hlY2sgaWYKICAgICBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlIHNlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGdldCBoZXhkdW1wcyBvZiB1bnByaW50YWJsZSBkYXRhIHdpdGggJ29wZW5zc2wKICAgICBhc24xcGFyc2UnLiAgQnkgaW1wbGljYXRpb24sIHRoZSBmdW5jdGlvbnMgQVNOMV9wYXJzZV9kdW1wKCkgYW5kCiAgICAgQklPX2R1bXBfaW5kZW50KCkgYXJlIGFkZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbnMgQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSBhbmQgWDUwOV9OQU1FX3ByaW50X2V4KCkKICAgICB0aGVzZSBwcmludCBvdXQgc3RyaW5ncyBhbmQgbmFtZSBzdHJ1Y3R1cmVzIGJhc2VkIG9uIHZhcmlvdXMKICAgICBmbGFncyBpbmNsdWRpbmcgUkZDMjI1MyBzdXBwb3J0IGFuZCBwcm9wZXIgaGFuZGxpbmcgb2YKICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVycy4gQWRkZWQgb3B0aW9ucyB0byB0aGUgJ3g1MDknIHV0aWxpdHkgCiAgICAgdG8gYWxsb3cgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gYmUgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdXNlIEFTTjFfVElNRSBpbnN0ZWFkIG9mIEFTTjFfVVRDVElNRS4KICAgICBBbHNvIGNoYW5nZSB0aGUgZnVuY3Rpb25zIFg1MDlfY21wX2N1cnJlbnRfdGltZSgpIGFuZAogICAgIFg1MDlfZ210aW1lX2FkaigpIHdvcmsgd2l0aCBhbiBBU04xX1RJTUUgc3RydWN0dXJlLAogICAgIHRoaXMgd2lsbCBlbmFibGUgY2VydGlmaWNhdGVzIHVzaW5nIEdlbmVyYWxpemVkVGltZSBpbiB2YWxpZGl0eQogICAgIGRhdGVzIHRvIGJlIGNoZWNrZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgTkVHX1BVQktFWV9CVUcgY29kZSAod2hpY2ggdG9sZXJhdGVzIGludmFsaWQKICAgICBuZWdhdGl2ZSBwdWJsaWMga2V5IGVuY29kaW5ncykgb24gYnkgZGVmYXVsdCwKICAgICBOT19ORUdfUFVCS0VZX0JVRyBjYW4gYmUgc2V0IHRvIGRpc2FibGUgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGMyaV9BU04xX09CSkVDVCgpIHdoaWNoIGFjdHMgb24gQVNOMV9PQkpFQ1QKICAgICBjb250ZW50IG9jdGV0cy4gQW4gaTJjX0FTTjFfT0JKRUNUIGlzIHVubmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aGUgZW5jb2RpbmcgY2FuIGJlIHRyaXZpYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgY3J5cHRvL2Vyci5jIGxvY2tpbmcgYnVnZml4OiBVc2Ugd3JpdGUgbG9ja3MgKENSWVBUT193X1t1bl1sb2NrKSwKICAgICBub3QgcmVhZCBsb2NrcyAoQ1JZUFRPX3JfW3VuXWxvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEEgZmlyc3QgYXR0ZW1wdCBhdCBjcmVhdGluZyBvZmZpY2lhbCBzdXBwb3J0IGZvciBzaGFyZWQKICAgICBsaWJyYXJpZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uLiAgSSd2ZSBrZXB0IGl0IHNvIHRoZQogICAgIGRlZmF1bHQgaXMgc3RhdGljIGxpYnJhcmllcyBvbmx5LCBhbmQgdGhlIE9wZW5TU0wgcHJvZ3JhbXMKICAgICBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkIGZvciBub3csIGJ1dCB0aGVyZSBhcmUKICAgICBwcmVwYXJhdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBpbiBwbGFjZS4KICAgICBUaGlzIGhhcyBiZWVuIHRlc3RlZCBvbiBMaW51eCBhbmQgVHJ1NjQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmFuZG9tbmVzcyBwb2xsaW5nIGZ1bmN0aW9uIGZvciBXaW45eCwgYXMgZGVzY3JpYmVkIGluOgogICAgIFBldGVyIEd1dG1hbm4sIFNvZnR3YXJlIEdlbmVyYXRpb24gb2YgUHJhY3RpY2FsbHkgU3Ryb25nCiAgICAgUmFuZG9tIE51bWJlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBzbyBQUk5HIGlzIHNlZWRlZCBpbiByZXEgaWYgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZwogICAgIERTQSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gc21pbWUgYXBwbGljYXRpb24uIC1pbmZvcm0gYW5kIC1vdXRmb3JtCiAgICAgYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0cyBmb3IgdGhlIFMvTUlNRSBtZXNzYWdlIGluY2x1ZGluZwogICAgIFBFTSBhbmQgREVSLiBUaGUgLWNvbnRlbnQgb3B0aW9uIGFsbG93cyB0aGUgY29udGVudCB0byBiZQogICAgIHNwZWNpZmllZCBzZXBhcmF0ZWx5LiBUaGlzIHNob3VsZCBhbGxvdyB0aGluZ3MgbGlrZSBOZXRzY2FwZQogICAgIGZvcm0gc2lnbmluZyBvdXRwdXQgZWFzaWVyIHRvIHZlcmlmeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIEFTTjEgZW5jb2Rpbmcgb2YgdGFncyB1c2luZyB0aGUgJ2xvbmcgZm9ybScuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zLCBpMmNfKiBhbmQgYzJpXyogZm9yIElOVEVHRVIgYW5kIEJJVAogICAgIFNUUklORyB0eXBlcy4gVGhlc2UgY29udmVydCBjb250ZW50IG9jdGV0cyB0byBhbmQgZnJvbSB0aGUKICAgICB1bmRlcmx5aW5nIHR5cGUuIFRoZSBhY3R1YWwgdGFnIGFuZCBsZW5ndGggb2N0ZXRzIGFyZQogICAgIGFscmVhZHkgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbmQgY2hlY2tlZC4gVGhlc2UKICAgICBhcmUgbmVlZGVkIGJlY2F1c2UgYWxsIG90aGVyIHN0cmluZyB0eXBlcyBoYXZlIHZpcnR1YWxseQogICAgIGlkZW50aWNhbCBoYW5kbGluZyBhcGFydCBmcm9tIHRoZSB0YWcuIEJ5IGhhdmluZyB2ZXJzaW9ucwogICAgIG9mIHRoZSBBU04xIGZ1bmN0aW9ucyB0aGF0IGp1c3Qgb3BlcmF0ZSBvbiBjb250ZW50IG9jdGV0cwogICAgIElNUExJQ0lUIHRhZ2dpbmcgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuIEl0IGFsc28gYWxsb3dzCiAgICAgdGhlIEFTTjFfRU5VTUVSQVRFRCBjb2RlIHRvIGJlIGN1dCBkb3duIGJlY2F1c2UgQVNOMV9FTlVNRVJBVEVECiAgICAgYW5kIEFTTjFfSU5URUdFUiBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIE9JRCBvYmplY3RzIGFzIGZvbGxvd3M6CgogICAgIC0gTmV3IG9iamVjdCBpZGVudGlmaWVycyBhcmUgaW5zZXJ0ZWQgaW4gb2JqZWN0cy50eHQsIGZvbGxvd2luZwogICAgICAgdGhlIHN5bnRheCBnaXZlbiBpbiBvYmplY3RzLlJFQURNRS4KICAgICAtIG9iamVjdHMucGwgaXMgdXNlZCB0byBwcm9jZXNzIG9ial9tYWMubnVtIGFuZCBjcmVhdGUgYSBuZXcKICAgICAgIG9ial9tYWMuaC4KICAgICAtIG9ial9kYXQucGwgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqX2RhdC5oLCB1c2luZyB0aGUgZGF0YSBpbgogICAgICAgb2JqX21hYy5oLgoKICAgICBUaGlzIGlzIGN1cnJlbnRseSBraW5kIG9mIGEgaGFjaywgYW5kIHRoZSBwZXJsIGNvZGUgaW4gb2JqZWN0cy5wbAogICAgIGlzbid0IHZlcnkgZWxlZ2FudCwgYnV0IGl0IHdvcmtzIGFzIEkgaW50ZW5kZWQuICBUaGUgc2ltcGxlc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhhdCBpdCB3b3JrZWQgY29ycmVjdGx5IGlzIHRvIGxvb2sgaW4gb2JqX2RhdC5oIGFuZAogICAgIGNoZWNrIHRoZSBhcnJheSBuaWRfb2JqcyBhbmQgbWFrZSBzdXJlIHRoZSBvYmplY3RzIGhhdmVuJ3QgbW92ZWQKICAgICBhcm91bmQgKHRoaXMgaXMgaW1wb3J0YW50ISkuICBBZGRpdGlvbnMgYXJlIE9LLCBhcyB3ZWxsIGFzCiAgICAgY29uc2lzdGVudCBuYW1lIGNoYW5nZXMuIAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBCU0Qtc3R5bGUgTUQ1LWJhc2VkIHBhc3N3b3JkcyB0byAnb3BlbnNzbCBwYXNzd2QnIChvcHRpb24gJy0xJykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkaXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgJy1yYW5kIGZpbGUnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgVGhlIGdpdmVuIGZpbGUgYWRkcyB0byB3aGF0ZXZlciBoYXMgYWxyZWFkeSBiZWVuIHNlZWRlZCBpbnRvIHRoZQogICAgIHJhbmRvbSBwb29sIHRocm91Z2ggdGhlIFJBTkRGSUxFIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gb3IKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGZpbGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgbWtzdGFjay5wbCBub3cgc29ydHMgZWFjaCBtYWNybyBncm91cCBpbnRvIGxleGljYWwgb3JkZXIuCiAgICAgUHJldmlvdXNseSB0aGUgb3V0cHV0IG9yZGVyIGRlcGVuZGVkIG9uIHRoZSBvcmRlciB0aGUgZmlsZXMKICAgICBhcHBlYXJlZCBpbiB0aGUgZGlyZWN0b3J5LCByZXN1bHRpbmcgaW4gbmVlZGxlc3MgcmV3cml0aW5nCiAgICAgb2Ygc2FmZXN0YWNrLmggLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhdGNoZXMgdG8gbWFrZSBPcGVuU1NMIGNvbXBpbGUgdW5kZXIgV2luMzIgYWdhaW4uIE1vc3RseQogICAgIHdvcmsgYXJvdW5kcyBmb3IgdGhlIFZDKysgcHJvYmxlbSB0aGF0IGl0IHRyZWF0cyBmdW5jKCkgYXMKICAgICBmdW5jKHZvaWQpLiBBbHNvIHN0cmlwcGVkIG91dCB0aGUgcGFydHMgb2YgbWtkZWYucGwgdGhhdAogICAgIGFkZGVkIGV4dHJhIHR5cGVzYWZlIGZ1bmN0aW9uczogdGhlc2Ugbm8gbG9uZ2VyIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2F0aW9uIG9mIHRoZSBzdGFjayBjb2RlLiBUaGUgbWFjcm9zIGFyZSBub3cgYWxsIAogICAgIGNvbGxlY3RlZCBpbiBzYWZlc3RhY2suaCAuIEVhY2ggbWFjcm8gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgIGEgInN0YWNrIG1hY3JvIiBvZiB0aGUgZm9ybSBTS01fPG5hbWU+KHR5cGUsIGEsIGIpLiBUaGUgCiAgICAgREVCVUdfU0FGRVNUQUNLIGlzIG5vdyBoYW5kbGVkIGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhc3RzLAogICAgIHRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcmV0YWluaW5nIHR5cGUgc2FmZXR5IHdpdGhvdXQgdGhlCiAgICAgdXNlIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLiBJZiBERUJVR19TQUZFU1RBQ0sgaXMgbm90IGRlZmluZWQKICAgICB0aGVuIHRoZSBub24gdHlwZXNhZmUgbWFjcm9zIGFyZSB1c2VkIGluc3RlYWQuIEFsc28gbW9kaWZpZWQgdGhlCiAgICAgbWtzdGFjay5wbCBzY3JpcHQgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybS4gTmVlZHMgdGVzdGluZyB0byBzZWUKICAgICBpZiB3aGljaCAoaWYgYW55KSBjb21waWxlcnMgaXQgY2hva2VzIGFuZCBtYXliZSBtYWtlIERFQlVHX1NBRkVTVEFDSwogICAgIHRoZSBkZWZhdWx0IGlmIG5vIG1ham9yIHByb2JsZW1zLiBTaW1pbGFyIGJlaGF2aW91ciBmb3IgQVNOMV9TRVRfT0YKICAgICBhbmQgUEtDUzEyX1NUQUNLX09GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiBJSVMgdXNlIHRoZSAnTkVUJyBmb3JtIG9mIHByaXZhdGUga2V5IHRoZQogICAgIGtleSBkZXJpdmF0aW9uIGFsZ29yaXRobSBpcyBkaWZmZXJlbnQuIE5vcm1hbGx5IE1ENShwYXNzd29yZCkgaXMKICAgICB1c2VkIGFzIGEgMTI4IGJpdCBSQzQga2V5LiBJbiB0aGUgbW9kaWZpZWQgY2FzZQogICAgIE1ENShNRDUocGFzc3dvcmQpICsgIlNHQ0tFWVNBTFQiKSAgaXMgdXNlZCBpbnN0ZWFkLiBBZGRlZCBzb21lCiAgICAgbmV3IGZ1bmN0aW9ucyBpMmRfUlNBX05FVCgpLCBkMmlfUlNBX05FVCgpIGV0YyB3aGljaCBhcmUgdGhlIHNhbWUKICAgICBhcyB0aGUgb2xkIE5ldHNjYXBlX1JTQSBmdW5jdGlvbnMgZXhjZXB0IHRoZXkgaGF2ZSBhbiBhZGRpdGlvbmFsCiAgICAgJ3NnY2tleScgcGFyYW1ldGVyIHdoaWNoIHVzZXMgdGhlIG1vZGlmaWVkIGFsZ29yaXRobS4gQWxzbyBhZGRlZAogICAgIGFuIC1zZ2NrZXkgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0aGUgcnNhIHV0aWxpdHkuIFRoYW5rcyB0byAKICAgICBBZHJpYW4gUGVjayA8YmVydGllQG5jaXBoZXIuY29tPiBmb3IgcG9zdGluZyBkZXRhaWxzIG9mIHRoZSBtb2RpZmllZAogICAgIGFsZ29yaXRobSB0byBvcGVuc3NsLWRldi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZXZwX2xvY2FsLmggbWFjcm9zIHdlcmUgdXNpbmcgJ2MuIyNrbmFtZScgd2hpY2ggcmVzdWx0ZWQgaW4KICAgICBpbnZhbGlkIGV4cGFuc2lvbiBvbiBzb21lIHN5c3RlbXMgKFNDTyA1LjAuNSBmb3IgZXhhbXBsZSkuCiAgICAgQ29ycmVjdGVkIHRvICdjLmtuYW1lJy4KICAgICBbUGhpbGxpcCBQb3JjaCA8cm9vdEB0aGVwb3JjaC5jb20+XQoKICAqKSBOZXcgWDUwOV9nZXQxX2VtYWlsKCkgYW5kIFg1MDlfUkVRX2dldDFfZW1haWwoKSBmdW5jdGlvbnMgdGhhdCByZXR1cm4KICAgICBhIFNUQUNLIG9mIGVtYWlsIGFkZHJlc3NlcyBmcm9tIGEgY2VydGlmaWNhdGUgb3IgcmVxdWVzdCwgdGhlc2UgbG9vawogICAgIGluIHRoZSBzdWJqZWN0IG5hbWUgYW5kIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgZXh0ZW5zaW9ucyBhbmQgCiAgICAgb21pdCBhbnkgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZS1pbXBsZW1lbnQgQk5fbW9kX2V4cDJfbW9udCB1c2luZyBpbmRlcGVuZGVudCAoYW5kIGxhcmdlcikgd2luZG93cy4KICAgICBUaGlzIG1ha2VzIERTQSB2ZXJpZmljYXRpb24gYWJvdXQgMiAlIGZhc3Rlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNyZWFzZSBtYXhpbXVtIHdpbmRvdyBzaXplIGluIEJOX21vZF9leHBfLi4uIHRvIDYgYml0cyBpbnN0ZWFkIG9mIDUKICAgICAobWVhbmluZyB0aGF0IG5vdyAyXjUgdmFsdWVzIHdpbGwgYmUgcHJlY29tcHV0ZWQsIHdoaWNoIGlzIG9ubHkgNCBLQgogICAgIHBsdXMgb3ZlcmhlYWQgZm9yIDEwMjQgYml0IG1vZHVsaSkuCiAgICAgVGhpcyBtYWtlcyBleHBvbmVudGlhdGlvbnMgYWJvdXQgMC41ICUgZmFzdGVyIGZvciAxMDI0IGJpdAogICAgIGV4cG9uZW50cyAoYXMgbWVhc3VyZWQgYnkgIm9wZW5zc2wgc3BlZWQgcnNhMjA0OCIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbmFtZSBtZW1vcnkgaGFuZGxpbmcgbWFjcm9zIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyCiAgICAgc29mdHdhcmU6CiAgICAgICAgICBNYWxsb2MgICAgICAgICA9PiAgT1BFTlNTTF9tYWxsb2MKICAgICAgICAgIE1hbGxvY19sb2NrZWQgID0+ICBPUEVOU1NMX21hbGxvY19sb2NrZWQKICAgICAgICAgIFJlYWxsb2MgICAgICAgID0+ICBPUEVOU1NMX3JlYWxsb2MKICAgICAgICAgIEZyZWUgICAgICAgICAgID0+ICBPUEVOU1NMX2ZyZWUKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX2V4cF9tb250X3dvcmQgZm9yIHNtYWxsIGJhc2VzIChyb3VnaGx5IDE1JQogICAgIGZhc3RlciB0aGFuIEJOX21vZF9leHBfbW9udCwgaS5lLiA3JSBmb3IgYSBmdWxsIERIIGV4Y2hhbmdlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDeWdXaW4zMiBzdXBwb3J0LgogICAgIFtKb2huIEphcnZpZSA8amphcnZpZUBuZXdzZ3V5LmNvbT5dCgogICopIFRoZSB0eXBlLXNhZmUgc3RhY2sgY29kZSBoYXMgYmVlbiByZWppZ2dlZC4gSXQgaXMgbm93IG9ubHkgY29tcGlsZWQKICAgICBpbiB3aGVuIE9wZW5TU0wgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBERUJVR19TQUZFU1RBQ0sgb3B0aW9uIGFuZAogICAgIGJ5IGRlZmF1bHQgYWxsIHR5cGUtc3BlY2lmaWMgc3RhY2sgZnVuY3Rpb25zIGFyZSAiI2RlZmluZSJkIGJhY2sgdG8KICAgICBzdGFuZGFyZCBzdGFjayBmdW5jdGlvbnMuIFRoaXMgcmVzdWx0cyBpbiBtb3JlIHN0cmVhbWxpbmVkIG91dHB1dAogICAgIGJ1dCByZXRhaW5zIHRoZSB0eXBlLXNhZmV0eSBjaGVja2luZyBwb3NzaWJpbGl0aWVzIG9mIHRoZSBvcmlnaW5hbAogICAgIGFwcHJvYWNoLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSBTVEFDSyBjb2RlIGhhcyBiZWVuIGNsZWFuZWQgdXAsIGFuZCBjZXJ0YWluIHR5cGUgZGVjbGFyYXRpb25zCiAgICAgdGhhdCBkaWRuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSBoYXZlIGJlZW4gYnJvdWdodCBpbiBsaW5lLiBUaGlzIGhhcwogICAgIGFsc28gaW52b2x2ZWQgYSBjbGVhbnVwIG9mIHNvcnRzIGluIHNhZmVzdGFjay5oIHRvIG1vcmUgY29ycmVjdGx5CiAgICAgbWFwIHR5cGUtc2FmZSBzdGFjayBmdW5jdGlvbnMgb250byB0aGVpciBwbGFpbiBzdGFjayBjb3VudGVycGFydHMuCiAgICAgVGhpcyB3b3JrIGhhcyBhbHNvIHJlc3VsdGVkIGluIGEgdmFyaWV0eSBvZiAiY29uc3QiaWZpY2F0aW9ucyBvZgogICAgIGxvdHMgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgIl9jbXAiIG9wZXJhdGlvbnMgd2hpY2ggc2hvdWxkIG5vcm1hbGx5CiAgICAgYmUgcHJvdG90eXBlZCB3aXRoICJjb25zdCIgcGFyYW1ldGVycyBhbnl3YXkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgV2hlbiBnZW5lcmF0aW5nIGJ5dGVzIGZvciB0aGUgZmlyc3QgdGltZSBpbiBtZF9yYW5kLmMsICdzdGlyIHRoZSBwb29sJwogICAgIGJ5IHNlZWRpbmcgd2l0aCBTVEFURV9TSVpFIGR1bW15IGJ5dGVzICh3aXRoIHplcm8gZW50cm9weSBjb3VudCkuCiAgICAgKFRoZSBQUk5HIHN0YXRlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cywgdGhlIGxhcmdlIHBvb2wgJ3N0YXRlJyBhbmQgJ21kJywKICAgICB3aGVyZSBhbGwgb2YgJ21kJyBpcyB1c2VkIGVhY2ggdGltZSB0aGUgUFJORyBpcyB1c2VkLCBidXQgJ3N0YXRlJwogICAgIGlzIHVzZWQgb25seSBpbmRleGVkIGJ5IGEgY3ljbGljIGNvdW50ZXIuIEFzIGVudHJvcHkgbWF5IG5vdCBiZQogICAgIHdlbGwgZGlzdHJpYnV0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nLCAnbWQnIGlzIGltcG9ydGFudCBhcyBhCiAgICAgY2hhaW5pbmcgdmFyaWFibGUuIEhvd2V2ZXIsIHRoZSBvdXRwdXQgZnVuY3Rpb24gY2hhaW5zIG9ubHkgaGFsZgogICAgIG9mICdtZCcsIGkuZS4gODAgYml0cy4gIHNzbGVheV9yYW5kX2FkZCwgb24gdGhlIG90aGVyIGhhbmQsIGNoYWlucwogICAgIGFsbCBvZiAnbWQnLCBhbmQgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgd2lsbCByZXN1bHQKICAgICBpbiBhbGwgb2YgJ3N0YXRlJyBiZWluZyByZXdyaXR0ZW4sIHdpdGggdGhlIG5ldyB2YWx1ZXMgZGVwZW5kaW5nCiAgICAgb24gdmlydHVhbGx5IGFsbCBvZiAnbWQnLiAgVGhpcyBvdmVyY29tZXMgdGhlIDgwIGJpdCBsaW1pdGF0aW9uLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBzc2wvczJfY2xudC5jIGFuZCBzc2wvczNfY2xudC5jLCBjYWxsIEVSUl9jbGVhcl9lcnJvcigpIHdoZW4KICAgICB0aGUgaGFuZHNoYWtlIGlzIGNvbnRpbnVlZCBhZnRlciBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKTsKICAgICBvdGhlcndpc2UsIGlmIFNTTF9WRVJJRllfTk9ORSBpcyBzZXQsIHJlbWFpbmluZyBlcnJvciBjb2RlcwogICAgIGNhbiBsZWFkIHRvICd1bmV4cGxhaW5hYmxlJyBjb25uZWN0aW9uIGFib3J0cyBsYXRlci4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHRyYWNrZWQgZG93biBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBNYWpvciBFVlAgQVBJIGNpcGhlciByZXZpc2lvbi4KICAgICBBZGQgaG9va3MgZm9yIGV4dHJhIEVWUCBmZWF0dXJlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBjaXBoZXIKICAgICBwYXJhbWV0ZXJzIHRvIGJlIHNldCBpbiB0aGUgRVZQIGludGVyZmFjZS4gU3VwcG9ydCBhZGRlZCBmb3IgdmFyaWFibGUKICAgICBrZXkgbGVuZ3RoIGNpcGhlcnMgdmlhIHRoZSBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCgpIGZ1bmN0aW9uIGFuZAogICAgIHNldHRpbmcgb2YgUkMyIGFuZCBSQzUgcGFyYW1ldGVycy4KCiAgICAgTW9kaWZ5IEVWUF9PcGVuSW5pdCgpIGFuZCBFVlBfU2VhbEluaXQoKSB0byBjb3BlIHdpdGggdmFyaWFibGUga2V5IGxlbmd0aAogICAgIGNpcGhlcnMuCgogICAgIFJlbW92ZSBsb3RzIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIHRoZSBFVlAgbGlicmFyeS4gRm9yIGV4YW1wbGUgKmV2ZXJ5KgogICAgIGNpcGhlciBpbml0KCkgZnVuY3Rpb24gaGFuZGxlcyB0aGUgJ2l2JyBpbiB0aGUgc2FtZSB3YXkgYWNjb3JkaW5nIHRvIHRoZQogICAgIGNpcGhlciBtb2RlLiBUaGV5IGFsc28gYWxsIGRvIG5vdGhpbmcgaWYgdGhlICdrZXknIHBhcmFtZXRlciBpcyBOVUxMIGFuZAogICAgIGZvciBDRkIgYW5kIE9GQiBtb2RlcyB0aGV5IHplcm8gY3R4LT5udW0uCgogICAgIE5ldyBmdW5jdGlvbmFsaXR5IGFsbG93cyByZW1vdmFsIG9mIFMvTUlNRSBjb2RlIFJDMiBoYWNrLgoKICAgICBNb3N0IG9mIHRoZSByb3V0aW5lcyBoYXZlIHRoZSBzYW1lIGZvcm0gYW5kIHNvIGNhbiBiZSBkZWNsYXJlZCBpbiB0ZXJtcwogICAgIG9mIG1hY3Jvcy4KCiAgICAgQnkgc2hpZnRpbmcgdGhpcyB0byB0aGUgdG9wIGxldmVsIEVWUF9DaXBoZXJJbml0KCkgaXQgY2FuIGJlIHJlbW92ZWQgZnJvbQogICAgIGFsbCBpbmRpdmlkdWFsIGNpcGhlcnMuIElmIHRoZSBjaXBoZXIgd2FudHMgdG8gaGFuZGxlIElWcyBvciBrZXlzCiAgICAgZGlmZmVyZW50bHkgaXQgY2FuIHNldCB0aGUgRVZQX0NJUEhfQ1VTVE9NX0lWIG9yIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQKICAgICBmbGFncy4KCiAgICAgQ2hhbmdlIGxvdHMgb2YgZnVuY3Rpb25zIGxpa2UgRVZQX0VuY3J5cHRVcGRhdGUoKSB0byBub3cgcmV0dXJuIGEKICAgICB2YWx1ZTogYWx0aG91Z2ggc29mdHdhcmUgdmVyc2lvbnMgb2YgdGhlIGFsZ29yaXRobXMgY2Fubm90IGZhaWwKICAgICBhbnkgaW5zdGFsbGVkIGhhcmR3YXJlIHZlcnNpb25zIGNhbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgU1NMX09QX1RMU19ST0xMQkFDS19CVUc6IEluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsIGlmCiAgICAgdGhpcyBvcHRpb24gaXMgc2V0LCB0b2xlcmF0ZSBicm9rZW4gY2xpZW50cyB0aGF0IHNlbmQgdGhlIG5lZ290aWF0ZWQKICAgICBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgdmVyc2lvbgogICAgIG51bWJlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDYWxsIGRoX3RtcF9jYiAoc2V0IGJ5IC4uLl9UTVBfREhfQ0IpIHdpdGggY29ycmVjdCAnaXNfZXhwb3J0JyBmbGFnOwogICAgIGkuZS4gbm9uLXplcm8gZm9yIGV4cG9ydCBjaXBoZXJzdWl0ZXMsIHplcm8gb3RoZXJ3aXNlLgogICAgIFByZXZpb3VzIHZlcnNpb25zIGhhZCB0aGlzIGZsYWcgaW52ZXJ0ZWQsIGluY29uc2lzdGVudCB3aXRoCiAgICAgcnNhX3RtcF9jYiAoLi4uX1RNUF9SU0FfQ0IpLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcmVwb3J0ZWQgYnkgQW1pdCBDaG9wcmFdCgogICopIEFkZCBtaXNzaW5nIERTQSBsaWJyYXJ5IHRleHQgc3RyaW5nLiBXb3JrIGFyb3VuZCBmb3Igc29tZSBJSVMKICAgICBrZXkgZmlsZXMgd2l0aCBpbnZhbGlkIFNFUVVFTkNFIGVuY29kaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRvY3VtZW50IChkb2Mvc3RhbmRhcmRzLnR4dCkgdGhhdCBsaXN0IGFsbCBraW5kcyBvZiBzdGFuZGFyZHMKICAgICBhbmQgc28gb24gdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gT3BlblNTTC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFbmhhbmNlIGNfcmVoYXNoIHNjcmlwdC4gT2xkIHZlcnNpb24gd291bGQgbWlzaGFuZGxlIGNlcnRpZmljYXRlcwogICAgIHdpdGggdGhlIHNhbWUgc3ViamVjdCBuYW1lIGhhc2ggYW5kIHdvdWxkbid0IGhhbmRsZSBDUkxzIGF0IGFsbC4KICAgICBBZGRlZCAtZmluZ2VycHJpbnQgb3B0aW9uIHRvIGNybCB1dGlsaXR5LCB0byBzdXBwb3J0IG5ldyBjX3JlaGFzaAogICAgIGZlYXR1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVsaW1pbmF0ZSBub24tQU5TSSBkZWNsYXJhdGlvbnMgaW4gY3J5cHRvLmggYW5kIHN0YWNrLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBmb3IgU1NMIHNlcnZlciBwdXJwb3NlIGNoZWNraW5nLiBTZXJ2ZXIgY2hlY2tpbmcgd2FzCiAgICAgcmVqZWN0aW5nIGNlcnRpZmljYXRlcyB3aGljaCBoYWQgZXh0ZW5kZWQga2V5IHVzYWdlIHByZXNlbnQKICAgICBidXQgbm8gc3NsIGNsaWVudCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFJlbmUgR3Jvc3NlciA8Z3Jvc3NlckBoaXNvbHV0aW9ucy5jb20+XQoKICAqKSBNYWtlIFBLQ1MjMTIgY29kZSB3b3JrIHdpdGggbm8gcGFzc3dvcmQuIFRoZSBQS0NTIzEyIHNwZWMKICAgICBpcyBhIGxpdHRsZSB1bmNsZWFyIGFib3V0IGhvdyBhIGJsYW5rIHBhc3N3b3JkIGlzIGhhbmRsZWQuCiAgICAgU2luY2UgdGhlIHBhc3N3b3JkIGluIGVuY29kZWQgYXMgYSBCTVBTdHJpbmcgd2l0aCB0ZXJtaW5hdGluZwogICAgIGRvdWJsZSBOVUxMIGEgemVybyBsZW5ndGggcGFzc3dvcmQgd291bGQgZW5kIHVwIGFzIGp1c3QgdGhlCiAgICAgZG91YmxlIE5VTEwuIEhvd2V2ZXIgbm8gcGFzc3dvcmQgYXQgYWxsIGlzIGRpZmZlcmVudCBhbmQgaXMKICAgICBoYW5kbGVkIGRpZmZlcmVudGx5IGluIHRoZSBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIGNvZGUuIE5TCiAgICAgdHJlYXRzIGEgYmxhbmsgcGFzc3dvcmQgYXMgemVybyBsZW5ndGguIE1TSUUgdHJlYXRzIGl0IGFzIG5vCiAgICAgcGFzc3dvcmQgb24gZXhwb3J0OiBidXQgaXQgd2lsbCB0cnkgYm90aCBvbiBpbXBvcnQuIFdlIG5vdyBkbwogICAgIHRoZSBzYW1lOiBQS0NTMTJfcGFyc2UoKSB0cmllcyB6ZXJvIGxlbmd0aCBhbmQgbm8gcGFzc3dvcmQgaWYKICAgICB0aGUgcGFzc3dvcmQgaXMgc2V0IHRvICIiIG9yIE5VTEwgKE5VTEwgaXMgbm93IGEgdmFsaWQgcGFzc3dvcmQ6CiAgICAgaXQgd2Fzbid0IGJlZm9yZSkgYXMgZG9lcyB0aGUgcGtjczEyIGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1Z2ZpeGVzIGluIGFwcHMveDUwOS5jOiBBdm9pZCBhIG1lbW9yeSBsZWFrOyBhbmQgZG9uJ3QgdXNlCiAgICAgcGVycm9yIHdoZW4gUEVNX3JlYWRfYmlvX1g1MDlfUkVRIGZhaWxzLCB0aGUgZXJyb3IgbWVzc2FnZSBtdXN0CiAgICAgYmUgb2J0YWluZWQgZnJvbSB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgJ3RocmVhZF9oYXNoJyBtZW1vcnkgbGVhayBpbiBjcnlwdG8vZXJyL2Vyci5jIGJ5IGZyZWVpbmcKICAgICBpdCBpbiBFUlJfcmVtb3ZlX3N0YXRlIGlmIGFwcHJvcHJpYXRlLCBhbmQgY2hhbmdlIEVSUl9nZXRfc3RhdGUKICAgICBhY2NvcmRpbmdseSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgKHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aHJlYWRfaGFzaCBpcyBubyBsb25nZXIgY29uc3RhbnQgb25jZSBzZXQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBmb3IgbGludXgtZWxmIG1ha2VmaWxlLm9uZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHdpbGwgbm93IGNhdXNlIGEgZGVmYXVsdAogICAgIFJTQV9NRVRIT0QgdG8gYmUgY2hvc2VuIGlmIG9uZSBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCiAgICAgUHJldmlvdXNseSB0aGlzIHdhcyBvbmx5IHNldCBkdXJpbmcgYSBjYWxsIHRvIFJTQV9uZXcoKQogICAgIG9yIFJTQV9uZXdfbWV0aG9kKE5VTEwpIG1lYW5pbmcgaXQgd2FzIHBvc3NpYmxlIGZvcgogICAgIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB0byByZXR1cm4gTlVMTC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBuYXRpdmUgbmFtZSB0cmFuc2xhdGlvbiB0byB0aGUgZXhpc3RpbmcgRFNPIGNvZGUKICAgICB0aGF0IHdpbGwgY29udmVydCAoaWYgdGhlIGZsYWcgdG8gZG8gc28gaXMgc2V0KSBmaWxlbmFtZXMKICAgICB0aGF0IGFyZSBzdWZmaWNpZW50bHkgc21hbGwgYW5kIGhhdmUgbm8gcGF0aCBpbmZvcm1hdGlvbgogICAgIGludG8gYSBjYW5vbmljYWwgbmF0aXZlIGZvcm0uIEVnLiAiYmxhaCIgY29udmVydGVkIHRvCiAgICAgImxpYmJsYWguc28iIG9yICJibGFoLmRsbCIgZXRjLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBmdW5jdGlvbiBFUlJfZXJyb3Jfc3RyaW5nX24oZSwgYnVmLCBsZW4pIHdoaWNoIGlzIGxpa2UKICAgICBFUlJfZXJyb3Jfc3RyaW5nKGUsIGJ1ZiksIGJ1dCB3cml0ZXMgYXQgbW9zdCAnbGVuJyBieXRlcwogICAgIGluY2x1ZGluZyB0aGUgMCB0ZXJtaW5hdG9yLiAgRm9yIEVSUl9lcnJvcl9zdHJpbmdfbiwgJ2J1ZicKICAgICBtYXkgbm90IGJlIE5VTEwuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4sIEJvZG8gTW9lbGxlcl0KCiAgKikgQ09ORiBsaWJyYXJ5IHJld29ya2VkIHRvIGJlY29tZSBtb3JlIGdlbmVyYWwuICBBIG5ldyBDT05GCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHJlYWRlciAiY2xhc3MiIGlzIGltcGxlbWVudGVkIGFzIHdlbGwgYXMgYQogICAgIG5ldyBmdW5jdGlvbnMgKE5DT05GXyosIGZvciAiTmV3IENPTkYiKSB0byBoYW5kbGUgaXQuICBUaGUgbm93CiAgICAgb2xkIENPTkZfKiBmdW5jdGlvbnMgYXJlIHN0aWxsIHRoZXJlLCBidXQgYXJlIHJlaW1wbGVtZW50ZWQgdG8KICAgICB3b3JrIGluIHRlcm1zIG9mIHRoZSBuZXcgZnVuY3Rpb25zLiAgQWxzbywgYSBzZXQgb2YgZnVuY3Rpb25zCiAgICAgdG8gaGFuZGxlIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaXMKICAgICBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgcmVhZGVyICJjbGFzc2VzIiAoSSBjYW4gZGVmaW5pdGVseSBzZWUgc29tZXRoaW5nIHJlYWRpbmcgYQogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBYTUwgZm9ybWF0LCBmb3IgZXhhbXBsZSksIGNhbGxlZCBfQ09ORl8qLAogICAgIG9yICJ0aGUgY29uZmlndXJhdGlvbiBzdG9yYWdlIEFQSSIuLi4KCiAgICAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGluZyBmdW5jdGlvbnMgYXJlOgoKICAgICAgICBOQ09ORl9uZXcsIE5DT05GX2ZyZWUsIE5DT05GX2xvYWQsIE5DT05GX2xvYWRfZnAsIE5DT05GX2xvYWRfYmlvLAogICAgICAgIE5DT05GX2dldF9zZWN0aW9uLCBOQ09ORl9nZXRfc3RyaW5nLCBOQ09ORl9nZXRfbnVtYnJlCgogICAgICAgIE5DT05GX2RlZmF1bHQsIE5DT05GX1dJTjMyCgogICAgICAgIE5DT05GX2R1bXBfZnAsIE5DT05GX2R1bXBfYmlvCgogICAgIE5DT05GX2RlZmF1bHQgYW5kIE5DT05GX1dJTjMyIGFyZSBtZXRob2QgKG9yICJjbGFzcyIpIGNob29zZXJzLAogICAgIE5DT05GX25ldyBjcmVhdGVzIGEgbmV3IENPTkYgb2JqZWN0LiAgVGhpcyB3b3JrcyBpbiB0aGUgc2FtZSB3YXkKICAgICBhcyBvdGhlciBpbnRlcmZhY2VzIGluIE9wZW5TU0wsIGxpa2UgdGhlIEJJTyBpbnRlcmZhY2UuCiAgICAgTkNPTkZfZHVtcF8qIGR1bXAgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKICAgICB3aGljaCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gIEFsbCBvdGhlciBmdW5jdGlvbnMgdGFrZSB0aGUgc2FtZQogICAgIGFyZ3VtZW50cyBhcyB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMgd3RoIHRoZSBleGNlcHRpb24gb2YgdGhlCiAgICAgZmlyc3QgdGhhdCBtdXN0IGJlIGEgYENPTkYgKicgaW5zdGVhZCBvZiBhIGBMSEFTSCAqJy4KCiAgICAgVG8gbWFrZSBpdCBlYXNlciB0byB1c2UgdGhlIG5ldyBjbGFzc2VzIHdpdGggdGhlIG9sZCBDT05GXyogZnVuY3Rpb25zLAogICAgIHRoZSBmdW5jdGlvbiBDT05GX3NldF9kZWZhdWx0X21ldGhvZCBpcyBwcm92aWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgJy10bHMxJyBvcHRpb24gdG8gJ29wZW5zc2wgY2lwaGVycycsIHdoaWNoIHdhcyBhbHJlYWR5CiAgICAgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1dCBoYWQgbm90IGJlZW4gaW1wbGVtZW50ZWQuCiAgICAgKFRoaXMgb3B0aW9uIGlzIG5vdCB5ZXQgcmVhbGx5IHVzZWZ1bCBiZWNhdXNlIGV2ZW4gdGhlIGFkZGl0aW9uYWwKICAgICBleHBlcmltZW50YWwgVExTIDEuMCBjaXBoZXJzIGFyZSBjdXJyZW50bHkgdHJlYXRlZCBhcyBTU0wgMy4wIGNpcGhlcnMuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgRFNPIGNvZGUgYWRkZWQgaW50byBsaWJjcnlwdG8gZm9yIGxldHRpbmcgT3BlblNTTCAoYW5kCiAgICAgT3BlblNTTC1iYXNlZCBhcHBsaWNhdGlvbnMpIGxvYWQgc2hhcmVkIGxpYnJhcmllcyBhbmQgYmluZCB0bwogICAgIHRoZW0gaW4gYSBwb3J0YWJsZSB3YXkuCiAgICAgW0dlb2ZmIFRob3JwZSwgd2l0aCBjb250cmlidXRpb25zIGZyb20gUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNSBhbmQgMC45LjVhICBbMSBBcHIgMjAwMF0KCiAgKikgTWFrZSBzdXJlIF9scm90bCBhbmQgX2xyb3RyIGFyZSBvbmx5IHVzZWQgd2l0aCBNU1ZDLgoKICAqKSBVc2UgbG9jayBDUllQVE9fTE9DS19SQU5EIGNvcnJlY3RseSBpbiBzc2xlYXlfcmFuZF9zdGF0dXMKICAgICAodGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgUkFORF9zdGF0dXMpLgoKICAqKSBSZW5hbWUgb3BlbnNzbCB4NTA5IG9wdGlvbiAnLWNybGV4dCcsIHdoaWNoIHdhcyBhZGRlZCBpbiAwLjkuNSwKICAgICB0byAnLWNscmV4dCcgKD0gY2xlYXIgZXh0ZW5zaW9ucyksIGFzIGludGVuZGVkIGFuZCBkb2N1bWVudGVkLgogICAgIFtCb2RvIE1vZWxsZXI7IGluY29uc2lzdGVuY3kgcG9pbnRlZCBvdXQgYnkgTWljaGFlbCBBdHRpbGkKICAgICA8YXR0aWxpQGFtYXhvLmNvbT5dCgogICopIEZpeCBmb3IgSE1BQy4gSXQgd2Fzbid0IHplcm9pbmcgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGlmIHRoZSBrZXkgbGVuZ3RoCiAgICAgd2FzIGxhcmdlciB0aGFuIHRoZSBNRCBibG9jayBzaXplLiAgICAgIAogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFlvc3QgV2lsbGlhbSA8WW9zdFdAdGNlLmNvbT5dCgogICopIE1vZGVybmlzZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCB1c2VzIFNUQUNLX09GKFg1MDkpIGZvciBpdHMgY2EgYXJndW1lbnQKICAgICBmaXggYSBsZWFrIHdoZW4gdGhlIGNhIGFyZ3VtZW50IHdhcyBwYXNzZWQgYXMgTlVMTC4gU3RvcCBYNTA5X1BVQktFWV9zZXQoKQogICAgIHVzaW5nIHRoZSBwYXNzZWQga2V5OiBpZiB0aGUgcGFzc2VkIGtleSB3YXMgYSBwcml2YXRlIGtleSB0aGUgcmVzdWx0CiAgICAgb2YgWDUwOV9wcmludCgpLCBmb3IgZXhhbXBsZSwgd291bGQgYmUgdG8gcHJpbnQgb3V0IGFsbCB0aGUgcHJpdmF0ZSBrZXkKICAgICBjb21wb25lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGRlc19xdWFkX2Nrc3VtKCkgYnl0ZSBvcmRlciBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyB0aGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBpbiBrcmI0LTAuOS43LCB3aGVyZQogICAgICB0aGUgc29sdXRpb24gaXMgYXR0cmlidXRlZCB0byBEZXJyaWNrIEogQnJhc2hlYXIgPHNoYWRvd0BERU1FTlRJQS5PUkc+XQoKICAqKSBGaXggc28gVl9BU04xX0FQUF9DSE9PU0Ugd29ya3MgYWdhaW46IGhvd2V2ZXIgaXRzIHVzZSBpcyBzdHJvbmdseQogICAgIGRpc2NvdXJhZ2VkLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIEtvcnZlciA8YnJpYW5rQGNzLnN0YW5mb3JkLmVkdT5dCgogICopIEZvciBlYXNpbHkgdGVzdGluZyBpbiBzaGVsbCBzY3JpcHRzIHdoZXRoZXIgc29tZSBjb21tYW5kCiAgICAgJ29wZW5zc2wgWFhYJyBleGlzdHMsIHRoZSBuZXcgcHNldWRvLWNvbW1hbmQgJ29wZW5zc2wgbm8tWFhYJwogICAgIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMCBpZmYgbm8gY29tbWFuZCBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhdmFpbGFibGUuCiAgICAgJ25vLVhYWCcgaXMgcHJpbnRlZCBpbiB0aGlzIGNhc2UsICdYWFgnIG90aGVyd2lzZS4gIEluIGJvdGggY2FzZXMsCiAgICAgdGhlIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgbm90aGluZyBpcyBwcmludGVkIHRvIHN0ZGVyci4KICAgICBBZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgYWx3YXlzIGlnbm9yZWQuCgogICAgIFNpbmNlIGZvciBlYWNoIGNpcGhlciB0aGVyZSBpcyBhIGNvbW1hbmQgb2YgdGhlIHNhbWUgbmFtZSwKICAgICB0aGUgJ25vLWNpcGhlcicgY29tcGlsYXRpb24gc3dpdGNoZXMgY2FuIGJlIHRlc3RlZCB0aGlzIHdheS4KCiAgICAgKCdvcGVuc3NsIG5vLVhYWCcgaXMgbm90IGFibGUgdG8gZGV0ZWN0IHBzZXVkby1jb21tYW5kcyBzdWNoCiAgICAgYXMgJ3F1aXQnLCAnbGlzdC1YWFgtY29tbWFuZHMnLCBvciAnbm8tWFhYJyBpdHNlbGYuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSB0ZXN0IHN1aXRlIHNvIHRoYXQgJ21ha2UgdGVzdCcgc3VjY2VlZHMgaW4gJ25vLXJzYScgY29uZmlndXJhdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGb3IgU1NMX1tDVFhfXXNldF90bXBfZGgsIGRvbid0IGNyZWF0ZSBhIERIIGtleSBpZiBTU0xfT1BfU0lOR0xFX0RIX1VTRQogICAgIGlzIHNldDsgaXQgd2lsbCBiZSB0aHJvd24gYXdheSBhbnl3YXkgYmVjYXVzZSBlYWNoIGhhbmRzaGFrZSBjcmVhdGVzCiAgICAgaXRzIG93biBrZXkuCiAgICAgc3NsX2NlcnRfZHVwLCB3aGljaCBpcyB1c2VkIGJ5IFNTTF9uZXcsIG5vdyBjb3BpZXMgREgga2V5cyBpbiBhZGRpdGlvbgogICAgIHRvIHBhcmFtZXRlcnMgLS0gaW4gcHJldmlvdXMgdmVyc2lvbnMgKHNpbmNlIE9wZW5TU0wgMC45LjMpIHRoZQogICAgICdkZWZhdWx0IGtleScgZnJvbSBTU0xfQ1RYX3NldF90bXBfZGggd291bGQgYWx3YXlzIGJlIGxvc3QsIG1lYW5pbmcKICAgICB5b3UgZWZmZWN0aXZseSBnb3QgU1NMX09QX1NJTkdMRV9ESF9VU0Ugd2hlbiB1c2luZyB0aGlzIG1hY3JvLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBzX2NsaWVudCBvcHRpb24gLWlnbl9lb2Y6IEVPRiBhdCBzdGRpbiBpcyBpZ25vcmVkLCBhbmQKICAgICAnUScgYW5kICdSJyBsb3NlIHRoZWlyIHNwZWNpYWwgbWVhbmluZ3MgKHF1aXQvcmVuZWdvdGlhdGUpLgogICAgIFRoaXMgaXMgcGFydCBvZiB3aGF0IC1xdWlldCBkb2VzOyB1bmxpa2UgLXF1aWV0LCAtaWduX2VvZgogICAgIGRvZXMgbm90IHN1cHByZXNzIGFueSBvdXRwdXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGNvbXBhdGliaWxpdHkgb3B0aW9ucyB0byB0aGUgcHVycG9zZSBhbmQgdHJ1c3QgY29kZS4gVGhlCiAgICAgcHVycG9zZSBYNTA5X1BVUlBPU0VfQU5ZIGlzICJhbnkgcHVycG9zZSIgd2hpY2ggYXV0b21hdGljYWxseQogICAgIGFjY2VwdHMgYSBjZXJ0aWZpY2F0ZSBvciBDQSwgdGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciwKICAgICB3aXRoIGFsbCB0aGUgYXNzb2NpYXRlZCBzZWN1cml0eSBpc3N1ZXMuCgogICAgIFg1MDlfVFJVU1RfQ09NUEFUIGlzIHRoZSBvbGQgdHJ1c3QgYmVoYXZpb3VyOiBvbmx5IGFuZAogICAgIGF1dG9tYXRpY2FsbHkgdHJ1c3Qgc2VsZiBzaWduZWQgcm9vdHMgaW4gY2VydGlmaWNhdGUgc3RvcmUuIEEKICAgICBuZXcgdHJ1c3Qgc2V0dGluZyBYNTA5X1RSVVNUX0RFRkFVTFQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQKICAgICBhIHB1cnBvc2UgaGFzIG5vIGFzc29jaWF0ZWQgdHJ1c3Qgc2V0dGluZyBhbmQgaXQgc2hvdWxkIGluc3RlYWQKICAgICB1c2UgdGhlIHZhbHVlIGluIHRoZSBkZWZhdWx0IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzggRFNBIHByaXZhdGUga2V5IGNvZGUgc28gaXQgZGVjb2RlcyBrZXlzIGFnYWluCiAgICAgYW5kIGZpeCBhIG1lbW9yeSBsZWFrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHV0aWwvbWtlcnIucGwgKHdoaWNoIGltcGxlbWVudHMgJ21ha2UgZXJyb3JzJyksIHByZXNlcnZlCiAgICAgcmVhc29uIHN0cmluZ3MgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgLmMgZmlsZSwgYXMKICAgICB0aGUgZGVmYXVsdCB0byBoYXZlIG9ubHkgZG93bmNhc2UgbGV0dGVycyAoYW5kIGRpZ2l0cykgaW4KICAgICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCByZWFzb25zIGNvZGVzIGlzIG5vdCBhbHdheXMgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gRVJSX2xvYWRfRVJSX3N0cmluZ3MoKSwgYnVpbGQgYW4gRVJSX0xJQl9TWVMgZXJyb3IgcmVhc29uIHRhYmxlCiAgICAgdXNpbmcgc3RyZXJyb3IuICBQcmV2aW91c2x5LCBFUlJfcmVhc29uX2Vycm9yX3N0cmluZygpIHJldHVybmVkCiAgICAgbGlicmFyeSBuYW1lcyBhcyByZWFzb24gc3RyaW5ncyBmb3IgU1lTZXJyOyBidXQgU1lTZXJyIGlzIGEgc3BlY2lhbAogICAgIGNhc2Ugd2hlcmUgc21hbGwgbnVtYmVycyBhcmUgZXJybm8gdmFsdWVzLCBub3QgbGlicmFyeSBudW1iZXJzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCAnLWRzYXBhcmFtJyBvcHRpb24gdG8gJ29wZW5zc2wgZGhwYXJhbScgYXBwbGljYXRpb24uICBUaGlzCiAgICAgY29udmVydHMgRFNBIHBhcmFtZXRlcnMgaW50byBESCBwYXJhbWV0ZXJzLiAoV2hlbiBjcmVhdGluZyBwYXJhbWV0ZXJzLAogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGlzIHVzZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgJ2xlbmd0aCcgKHJlY29tbWVuZGVkIGV4cG9uZW50IGxlbmd0aCkgaW4gQyBjb2RlIGdlbmVyYXRlZAogICAgIGJ5ICdvcGVuc3NsIGRocGFyYW0gLUMnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gc2V0X2xhYmVsIGluIHBlcmxhc20gd2FzIGFscmVhZHkgYmVpbmcgdXNlZAogICAgIHNvIGNvdWxkbid0IGJlIHVzZWQgYXMgYSAiZmlsZSBzY29wZSIgZmxhZy4gTW92ZWQgdG8gdGhpcmQgYXJndW1lbnQKICAgICB3aGljaCB3YXMgZnJlZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBQRU1fQVNOMV93cml0ZV9iaW8gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLCB1c2UgUkFORF9wc2V1ZG9fYnl0ZXMKICAgICBpbnN0ZWFkIG9mIFJBTkRfYnl0ZXMgZm9yIGVuY3J5cHRpb24gSVZzIGFuZCBzYWx0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlIFJBTkRfc3RhdHVzKCkgaW50byBSQU5EX01FVEhPRCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZwogICAgIGl0IG9ubHkgZm9yIG1kX3JhbmQuYyAgT3RoZXJ3aXNlIHJlcGxhY2luZyB0aGUgUFJORyBieSBjYWxsaW5nCiAgICAgUkFORF9zZXRfcmFuZF9tZXRob2Qgd291bGQgYmUgaW1wb3NzaWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBsZXQgRFNBX2dlbmVyYXRlX2tleSgpIGVudGVyIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlIHJhbmRvbQogICAgIG51bWJlciBnZW5lcmF0aW9uIGZhaWxzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAncmFuZCcgYXBwbGljYXRpb24gZm9yIGNyZWF0aW5nIHBzZXVkby1yYW5kb20gb3V0cHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBmb3IgTGludXgvSUE2NAogICAgIFtSb2xmIEhhYmVycmVja2VyIDxyb2xmQHN1c2UuZGU+XQoKICAqKSBBc3NlbWJsZXIgbW9kdWxlIHN1cHBvcnQgZm9yIE1pbmd3MzIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIEhQVVggKGluIHNobGliLykuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+IGFuZCBBbm9ueW1vdXNdCgogICopIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFNvbGFyaXMgZ2NjLgogICAgIFtMdXR6IEJlaG5rZSA8YmVobmtlQHRydXN0Y2VudGVyLmRlPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjQgYW5kIDAuOS41ICBbMjggRmViIDIwMDBdCgogICopIFBLQ1M3X2VuY3J5cHQoKSB3YXMgYWRkaW5nIHRleHQgTUlNRSBoZWFkZXJzIHR3aWNlIGJlY2F1c2UgdGhleQogICAgIHdlcmUgYWRkZWQgbWFudWFsbHkgYW5kIGJ5IFNNSU1FX2NybGZfY29weSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGJudGVzdC5jIGRvbid0IGNhbGwgQk5fcmFuZCB3aXRoIHplcm8gYml0cyBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBBbmRyZXcgVy4gR3JheSA8YWdyYXlAaWNvbnNpbmMuY29tPl0KCiAgKikgQk5fbXVsIGJ1Z2ZpeDogSW4gYm5fbXVsX3BhcnRfcmVjdXJzaW9uKCkgb25seSB0aGUgYT5hW25dICYmIGI+YltuXQogICAgIGNhc2Ugd2FzIGltcGxlbWVudGVkLiBUaGlzIGNhdXNlZCBCTl9kaXZfcmVjcCgpIHRvIGZhaWwgb2NjYXNpb25hbGx5LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBzZXRfbGFiZWwoKSBpbiB0aGUgcGVybAogICAgIGFzc2VtYmx5IGxhbmd1YWdlIGJ1aWxkZXIuIElmIHRoaXMgYXJndW1lbnQgZXhpc3RzIGFuZCBpcyBzZXQKICAgICB0byAxIGl0IHNpZ25hbHMgdGhhdCB0aGUgYXNzZW1ibGVyIHNob3VsZCB1c2UgYSBzeW1ib2wgd2hvc2UgCiAgICAgc2NvcGUgaXMgdGhlIGVudGlyZSBmaWxlLCBub3QganVzdCB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhpcwogICAgIGlzIG5lZWRlZCB3aXRoIE1BU00gd2hpY2ggdXNlcyB0aGUgZm9ybWF0IGxhYmVsOjogZm9yIHRoaXMgc2NvcGUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgUGV0ZXIgUnVuZXN0aWcgPHBldGVyQHJ1bmVzdGlnLmNvbT5dCgogICopIENoYW5nZSB0aGUgQVNOMSB0eXBlcyBzbyB0aGV5IGFyZSB0eXBlZGVmcyBieSBkZWZhdWx0LiBCZWZvcmUKICAgICBhbG1vc3QgYWxsIHR5cGVzIHdlcmUgI2RlZmluZSdkIHRvIEFTTjFfU1RSSU5HIHdoaWNoIHdhcyBjYXVzaW5nCiAgICAgU1RBQ0tfT0YoKSBwcm9ibGVtczogeW91IGNvdWxkbid0IGRlY2xhcmUgU1RBQ0tfT0YoQVNOMV9VVEY4U1RSSU5HKQogICAgIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBuYW1lcyBvZiBuZXcgZnVuY3Rpb25zIHRvIHRoZSBuZXcgZ2V0MS9nZXQwIG5hbWluZwogICAgIGNvbnZlbnRpb246IEFmdGVyICdnZXQxJywgdGhlIGNhbGxlciBvd25zIGEgcmVmZXJlbmNlIGNvdW50CiAgICAgYW5kIGhhcyB0byBjYWxsIC4uLl9mcmVlOyAnZ2V0MCcgcmV0dXJucyBhIHBvaW50ZXIgdG8gc29tZQogICAgIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgaW5jcmVtZW50aW5nIHJlZmVyZW5jZSBjb3VudGVycy4KICAgICAoU29tZSBvZiB0aGUgZXhpc3RpbmcgJ2dldCcgZnVuY3Rpb25zIGluY3JlbWVudCBhIHJlZmVyZW5jZQogICAgIGNvdW50ZXIsIHNvbWUgZG9uJ3QuKQogICAgIFNpbWlsYXJseSwgJ3NldDEnIGFuZCAnYWRkMScgZnVuY3Rpb25zIGluY3JlYXNlIHJlZmVyZW5jZQogICAgIGNvdW50ZXJzIG9yIGR1cGxpY2F0ZSBvYmplY3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGZvciB0aGUgcG9zc2liaWxpdHkgb2YgdGVtcCBSU0Ega2V5IGdlbmVyYXRpb24gZmFpbHVyZToKICAgICB0aGUgY29kZSB1c2VkIHRvIGFzc3VtZSBpdCBhbHdheXMgd29ya2VkIGFuZCBjcmFzaGVkIG9uIGZhaWx1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biBwcm9ibGVtIGluIEJJT19wcmludGYoKS4KICAgICBbVWxmIE32bGxlciwgdXNpbmcgcHVibGljIGRvbWFpbiBjb2RlIGJ5IFBhdHJpY2sgUG93ZWxsOyBwcm9ibGVtCiAgICAgIHBvaW50ZWQgb3V0IGJ5IERhdmlkIFNhY2VyZG90ZSA8ZGFzMzNAY29ybmVsbC5lZHU+XQoKICAqKSBTdXBwb3J0IEVHRCA8aHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLz4uICBOZXcgZnVuY3Rpb25zCiAgICAgUkFORF9lZ2QoKSBhbmQgUkFORF9zdGF0dXMoKS4gIEluIHRoZSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24sCiAgICAgdGhlIEVHRCBzb2NrZXQgY2FuIGJlIHNwZWNpZmllZCBsaWtlIGEgc2VlZCBmaWxlIHVzaW5nIFJBTkRGSUxFCiAgICAgb3IgLXJhbmQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFsbG93IHRoZSBzdHJpbmcgQ0VSVElGSUNBVEUgdG8gYmUgdG9sZXJhdGVkIGluIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFNvbWUgQ0FzIChlLmcuIFZlcmlzaWduKSBkaXN0cmlidXRlIGNlcnRpZmljYXRlcyBpbiB0aGlzIGZvcm0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHRoZSBTU0xfQUxMT1dfQURIIGNvbXBpbGUgb3B0aW9uIGFuZCBzZXQgdGhlIGRlZmF1bHQgY2lwaGVyCiAgICAgbGlzdCB0byBleGNsdWRlIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCBubyBzcGVjaWFsIGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIGlzIG5lZWRlZCB0byB1c2UgYW5vbnltb3VzIERIOiBpdCBqdXN0IG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZQogICAgIGNpcGhlciBsaXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgRVZQX01EX0NUWF90eXBlIG1hY3JvIHNvIGl0cyBtZWFuaW5nIGNvbnNpc3RlbnQgd2l0aAogICAgIEVWUF9NRF90eXBlLiBUaGUgb2xkIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIGEgbmV3IG1hY3JvIGNhbGxlZAogICAgIEVWUF9NRF9tZCgpLiBDaGFuZ2UgY29kZSB0aGF0IHVzZXMgaXQgYW5kIHVwZGF0ZSBkb2NzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC4uLl9jdHJsIGZ1bmN0aW9ucyBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIC4uLl9jYWxsYmFja19jdHJsIGZ1bmN0aW9ucwogICAgIHdoZXJlIHRoZSAndm9pZCAqJyBhcmd1bWVudCBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXJndW1lbnQuCiAgICAgUHJldmlvdXNseSAndm9pZCAqJyB3YXMgYWJ1c2VkIHRvIHBvaW50IHRvIGZ1bmN0aW9ucywgd2hpY2ggd29ya3Mgb24KICAgICBtYW55IHBsYXRmb3JtcywgYnV0IGlzIG5vdCBjb3JyZWN0LiAgQXMgdGhlc2UgZnVuY3Rpb25zIGFyZSB1c3VhbGx5CiAgICAgY2FsbGVkIGJ5IG1hY3JvcyBkZWZpbmVkIGluIE9wZW5TU0wgaGVhZGVyIGZpbGVzLCBtb3N0IHNvdXJjZSBjb2RlCiAgICAgc2hvdWxkIHdvcmsgd2l0aG91dCBjaGFuZ2VzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+ICh3aGljaCBpcyBjcmVhdGVkIGJ5IENvbmZpZ3VyZSkgbm93IGNvbnRhaW5zCiAgICAgc2VjdGlvbnMgd2l0aCBpbmZvcm1hdGlvbiBvbiAtRC4uLiBjb21waWxlciBzd2l0Y2hlcyB1c2VkIGZvcgogICAgIGNvbXBpbGluZyB0aGUgbGlicmFyeSBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gc2VlIHRoZW0uICBUbyBlbmFibGUKICAgICBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGEgcHJlLXByb2Nlc3NvciBzeW1ib2wgT1BFTlNTTF8uLi5fREVGSU5FUwogICAgIG11c3QgYmUgZGVmaW5lZC4gIEUuZy4sCiAgICAgICAgI2RlZmluZSBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCiAgICAgICAgI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KICAgICBkZWZpbmVzIGFsbCBwZXJ0aW5lbnQgTk9fPGFsZ28+IHN5bWJvbHMsIHN1Y2ggYXMgTk9fSURFQSwgTk9fUlNBLCBldGMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgVWxmIGFuZCBCb2RvIE32bGxlcl0KCiAgKikgQnVnZml4OiBUb2xlcmF0ZSBmcmFnbWVudGF0aW9uIGFuZCBpbnRlcmxlYXZpbmcgaW4gdGhlIFNTTCAzL1RMUwogICAgIHJlY29yZCBsYXllci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlICdvdGhlcicgdHlwZSBpbiBjZXJ0aWZpY2F0ZSBhdXggaW5mbyB0byBhIFNUQUNLX09GCiAgICAgWDUwOV9BTEdPUi4gQWx0aG91Z2ggbm90IGFuIEFsZ29yaXRobUlkZW50aWZpZXIgYXMgc3VjaCBpdCBoYXMKICAgICB0aGUgcmVxdWlyZWQgQVNOMSBmb3JtYXQ6IGFyYml0cmFyeSB0eXBlcyBkZXRlcm1pbmVkIGJ5IGFuIE9JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBQRU1fd3JpdGVfWDUwOV9SRVFfTkVXKCkgZnVuY3Rpb25zIGFuZCBhIGNvbW1hbmQgbGluZQogICAgIGFyZ3VtZW50IHRvICdyZXEnLiBUaGlzIGlzIG5vdCBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyBuZXdlciBvcgogICAgIGJldHRlciB0aGFuIG90aGVycyBpdCBqdXN0IHVzZXMgdGhlIHdvcmsgJ05FVycgaW4gdGhlIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBoZWFkZXIgbGluZXMuIFNvbWUgc29mdHdhcmUgbmVlZHMgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXNlIHBhc3N3b3JkIGNvbW1hbmQgbGluZSBhcmd1bWVudHM6IG5vdyBwYXNzd29yZHMgY2FuIGJlCiAgICAgb2J0YWluZWQgZnJvbSB2YXJpb3VzIHNvdXJjZXMuIERlbGV0ZSB0aGUgUEVNX2NiIGZ1bmN0aW9uIGFuZCBtYWtlCiAgICAgaXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyOiBpLmUuIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMIGFuZCB0aGUKICAgICB1c3JkYXRhIGFyZ3VtZW50IGlzIG5vdCBOVUxMIGludGVycHJldCBpdCBhcyBhIG51bGwgdGVybWluYXRlZCBwYXNzCiAgICAgcGhyYXNlLiBJZiB1c3JkYXRhIGFuZCB0aGUgY2FsbGJhY2sgYXJlIE5VTEwgdGhlbiB0aGUgcGFzcyBwaHJhc2UKICAgICBpcyBwcm9tcHRlZCBmb3IgYXMgdXN1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSBDb21wYXEgQXRhbGxhIGNyeXB0byBhY2NlbGVyYXRvci4gSWYgaXQgaXMgaW5zdGFsbGVkLAogICAgIHRoZSBzdXBwb3J0IGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZC4gVGhlIHJlc3VsdGluZyBiaW5hcmllcyB3aWxsCiAgICAgYXV0b2RldGVjdCB0aGUgY2FyZCBhbmQgdXNlIGl0IGlmIHByZXNlbnQuCiAgICAgW0JlbiBMYXVyaWUgYW5kIENvbXBhcSBJbmMuXQoKICAqKSBXb3JrIGFyb3VuZCBmb3IgTmV0c2NhcGUgaGFuZyBidWcuIFRoaXMgc2VuZHMgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFuZCBzZXJ2ZXIgZG9uZSBpbiBvbmUgcmVjb3JkLiBTaW5jZSB0aGlzIGlzIHBlcmZlY3RseSBsZWdhbCBpbiB0aGUKICAgICBTU0wvVExTIHByb3RvY29sIGl0IGlzbid0IGEgImJ1ZyIgb3B0aW9uIGFuZCBpcyBvbiBieSBkZWZhdWx0LiBTZWUKICAgICB0aGUgYnVncy9TU0x2MyBlbnRyeSBmb3IgbW9yZSBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhQLVVYIHR1bmUtdXA6IG5ldyB1bmlmaWVkIGNvbmZpZ3MsIEhQIEMgY29tcGlsZXIgYnVnIHdvcmthcm91bmQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtcmFuZCBhcmd1bWVudCB0byBzbWltZSBhbmQgcGtjczEyIGFwcGxpY2F0aW9ucyBhbmQgcmVhZC93cml0ZQogICAgIG9mIHNlZWQgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJ3Bhc3N3ZCcgdG9vbCBmb3IgY3J5cHQoMykgYW5kIGFwcjEgcGFzc3dvcmQgaGFzaGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBjb21tYW5kIGxpbmUgcGFzc3dvcmQgb3B0aW9ucyB0byB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXZfcmVjcCgpIGZvciBudW1lcmF0b3JzIHdpdGggYW4gZXZlbiBudW1iZXIgb2YKICAgICBiaXRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNb3JlIHRlc3RzIGluIGJudGVzdC5jLCBhbmQgY2hhbmdlZCB0ZXN0X2JuIG91dHB1dC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgLi9jb25maWcgcmVjb2duaXplcyBNYWNPUyBYIG5vdy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2KCkgd2hlbiB0aGUgZmlyc3Qgd29yZHMgb2YgbnVtIGFuZCBkaXZzb3IgYXJlCiAgICAgZXF1YWwgKGl0IGdhdmUgd3JvbmcgcmVzdWx0cyBpZiAocmVtPShuMS1xKmQwKSZCTl9NQVNLMikgPCBkMCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB2YXJpb3VzIGJyb2tlbiBQS0NTIzggZm9ybWF0cywgYW5kIGNvbW1hbmQgbGluZQogICAgIG9wdGlvbnMgdG8gcHJvZHVjZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgQk5fQ1RYX3N0YXJ0KCksIEJOX0NUWF9nZXQoKSBhbmQgQlRfQ1RYX2VuZCgpIHRvCiAgICAgZ2V0IHRlbXBvcmFyeSBCSUdOVU1zIGZyb20gYSBCTl9DVFguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvcnJlY3QgcmV0dXJuIHZhbHVlcyBpbiBCTl9tb2RfZXhwX21vbnQoKSBhbmQgQk5fbW9kX2V4cDJfbW9udCgpCiAgICAgZm9yIHAgPT0gMC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBTU0xlYXlfYWRkX2FsbF8qKCkgZnVuY3Rpb25zIHRvIE9wZW5TU0xfYWRkX2FsbF8qKCkgYW5kCiAgICAgaW5jbHVkZSBhICNkZWZpbmUgZnJvbSB0aGUgb2xkIG5hbWUgdG8gdGhlIG5ldy4gVGhlIG9yaWdpbmFsIGludGVudAogICAgIHdhcyB0aGF0IHN0YXRpY2FsbHkgbGlua2VkIGJpbmFyaWVzIGNvdWxkIGZvciBleGFtcGxlIGp1c3QgY2FsbAogICAgIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB0byBqdXN0IGFkZCBjaXBoZXJzIHRvIHRoZSB0YWJsZSBhbmQgbm90CiAgICAgbGluayB3aXRoIGRpZ2VzdHMuIFRoaXMgbmV2ZXIgd29ya2VkIGJlY2F1c2UgU1NMZWF5X2FkZF9hbGxfZGlnZXN0cygpCiAgICAgYW5kIFNTTGVheV9hZGRfYWxsX2NpcGhlcnMoKSB3ZXJlIGluIHRoZSBzYW1lIHNvdXJjZSBmaWxlIHNvIGNhbGxpbmcKICAgICBvbmUgd291bGQgbGluayB3aXRoIHRoZSBvdGhlci4gVGhleSBhcmUgbm93IGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgLW5vdGV4dCBvcHRpb24gdG8gJ2NhJyBhbmQgYSAtcHVia2V5IG9wdGlvbiB0byAnc3BrYWMnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBhIGxlc3MgdW51c3VhbCBmb3JtIG9mIHRoZSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QgKGl0IHVzZWQKICAgICBhIGJpbmFyeSBhbGdvcml0aG0gZm9yIGV4cG9uZW50aWF0aW9uIGludGVncmF0ZWQgaW50byB0aGUgTWlsbGVyLVJhYmluCiAgICAgbG9vcCwgb3VyIHN0YW5kYXJkIG1vZGV4cCBhbGdvcml0aG1zIGFyZSBmYXN0ZXIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgZm9yIHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCBjb21wbGV0ZWQuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPl0KCiAgKikgU291cmNlIGNvZGUgY2xlYW51cHM6IHVzZSBjb25zdCB3aGVyZSBhcHByb3ByaWF0ZSwgZWxpbWluYXRlIGNhc3RzLAogICAgIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICogaW4gbGhhc2guCiAgICAgW1VsZiBN9mxsZXJdIAoKICAqKSBCdWdmaXg6IHNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlIHdhcyBub3QgcmVzdGFydGFibGUKICAgICAodGhlIHN0YXRlIHdhcyBub3QgY2hhbmdlZCB0byBTU0wzX1NUX1NXX0tFWV9FWENIX0IsIGFuZCBiZWNhdXNlIG9mCiAgICAgdGhpcyB0aGUgc2VydmVyIGNvdWxkIG92ZXJ3cml0ZSBlcGhlbWVyYWwga2V5cyB0aGF0IHRoZSBjbGllbnQKICAgICBoYXMgYWxyZWFkeSBzZWVuKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIERTQV9pc19wcmltZSBpbnRvIGEgbWFjcm8gdGhhdCBjYWxscyBCTl9pc19wcmltZSwKICAgICB1c2luZyA1MCBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdC4KCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgbm93IHVzZXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgKHdpdGggNTAKICAgICBpdGVyYXRpb25zIG9mIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhcyByZXF1aXJlZCBieSB0aGUgYXBwZW5kaXgKICAgICB0byBGSVBTIFBVQiAxODZbLTFdKSBpbnN0ZWFkIG9mIERTQV9pc19wcmltZS4KICAgICBBcyBCTl9pc19wcmltZV9mYXN0dGVzdCBpbmNsdWRlcyB0cmlhbCBkaXZpc2lvbiwgRFNBIHBhcmFtZXRlcgogICAgIGdlbmVyYXRpb24gYmVjb21lcyBtdWNoIGZhc3Rlci4KCiAgICAgVGhpcyBpbXBsaWVzIGEgY2hhbmdlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGluIERTQV9pc19wcmltZQogICAgIGFuZCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlCiAgICAgZm9yIGVhY2ggcG9zaXRpdmUgd2l0bmVzcyBpbiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QsIG5vdCBqdXN0CiAgICAgb2NjYXNpb25hbGx5IGluIHRoZSBpbm5lciBsb29wOyBhbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlCiAgICAgY2FsbGJhY2sgZnVuY3Rpb24gbm93IHByb3ZpZGUgYW4gaXRlcmF0aW9uIGNvdW50IGZvciB0aGUgb3V0ZXIKICAgICBsb29wIHJhdGhlciB0aGFuIGZvciB0aGUgY3VycmVudCBpbnZvY2F0aW9uIG9mIHRoZSBpbm5lciBsb29wLgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGFkZGl0aW9uYWxseSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sKICAgICBmdW5jdGlvbiB3aXRoIGFuICdpdGVyYXRpb24gY291bnQnIG9mIC0xLCBtZWFuaW5nIHRoYXQgYQogICAgIGNhbmRpZGF0ZSBoYXMgcGFzc2VkIHRoZSB0cmlhbCBkaXZpc2lvbiB0ZXN0ICh3aGVuIHEgaXMgZ2VuZXJhdGVkIAogICAgIGZyb20gYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgc2VlZCwgdHJpYWwgZGl2aXNpb24gaXMgc2tpcHBlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IHRoYXQgb3B0aW9uYWxseSBkb2VzIHRyaWFsCiAgICAgZGl2aXNpb24gYmVmb3JlIHN0YXJ0aW5nIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCBhbmQgaGFzCiAgICAgYW4gYWRkaXRpb25hbCBCTl9DVFggKiBhcmd1bWVudCAod2hlcmVhcyBCTl9pc19wcmltZSBhbHdheXMKICAgICBoYXMgdG8gYWxsb2NhdGUgYXQgbGVhc3Qgb25lIEJOX0NUWCkuCiAgICAgJ2NhbGxiYWNrKDEsIC0xLCBjYl9hcmcpJyBpcyBjYWxsZWQgd2hlbiBhIG51bWJlciBoYXMgcGFzc2VkIHRoZQogICAgIHRyaWFsIGRpdmlzaW9uIHN0YWdlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgYnVnIGluIENSTCBlbmNvZGluZy4gVGhlIHZhbGlkaXR5IGRhdGVzIHdlcmVuJ3QgYmVpbmcgaGFuZGxlZAogICAgIGFzIEFTTjFfVElNRS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXBrY3MxMiBvcHRpb24gdG8gQ0EucGwgc2NyaXB0IHRvIHdyaXRlIG91dCBhIFBLQ1MjMTIgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fcHNldWRvX3JhbmQoKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQk5fbW9kX211bF9tb250Z29tZXJ5KCk6IHJlcGxhY2UgdGhlIGJyb2tlbiAoYW5kIHVucmVhZGFibGUpCiAgICAgYmlnbnVtIHZlcnNpb24gb2YgQk5fZnJvbV9tb250Z29tZXJ5KCkgd2l0aCB0aGUgd29ya2luZyBjb2RlIGZyb20KICAgICBTU0xlYXkgMC45LjAgKHRoZSB3b3JkIGJhc2VkIHZlcnNpb24gaXMgZmFzdGVyIGFueXdheSksIGFuZCBjbGVhbiB1cAogICAgIHRoZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBzMl9jbG50LmMgKGZ1bmN0aW9uIGdldF9zZXJ2ZXJfaGVsbG8pIHRoYXQKICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIFNTTF9TRVNTSU9OIGRhdGEgc3RydWN0dXJlIGluCiAgICAgU1NMMiBjbGllbnRzIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHJldHVybiB2YWx1ZSBvZiBSQU5EX2xvYWRfZmlsZSgpIG5vIGxvbmdlciBjb3VudHMgYnl0ZXMgb2J0YWluZWQKICAgICBieSBzdGF0KCkuICBSQU5EX2xvYWRfZmlsZSguLi4sIC0xKSBpcyBuZXcgYW5kIHVzZXMgdGhlIGNvbXBsZXRlIGZpbGUKICAgICB0byBzZWVkIHRoZSBQUk5HIChwcmV2aW91c2x5IGFuIGV4cGxpY2l0IGJ5dGUgY291bnQgd2FzIHJlcXVpcmVkKS4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIENsZWFuIHVwIENSWVBUT19FWF9EQVRBIGZ1bmN0aW9ucywgc29tZSBvZiB0aGVzZSBkaWRuJ3QgaGF2ZSBwcm90b3R5cGVzCiAgICAgdXNlZCAoY2hhciAqKSBpbnN0ZWFkIG9mICh2b2lkICopIGFuZCBoYWQgY2FzdHMgYWxsIG92ZXIgdGhlIHBsYWNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgQk5fZ2VuZXJhdGVfcHJpbWUoKSByZXR1cm4gTlVMTCBvbiBlcnJvciBpZiByZXQhPU5VTEwuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFJldGFpbiBzb3VyY2UgY29kZSBjb21wYXRpYmlsaXR5IGZvciBCTl9wcmltZV9jaGVja3MgbWFjcm86CiAgICAgQk5faXNfcHJpbWUoLi4uLCBCTl9wcmltZV9jaGVja3MsIC4uLikgbm93IHVzZXMKICAgICBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YKICAgICBSYWJpbi1NaWxsZXIgaXRlcmF0aW9ucy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRGlmZmllLUhlbGxtYW4gdXNlcyAic2FmZSIgcHJpbWVzOiBESF9jaGVjaygpIHJldHVybiBjb2RlIHJlbmFtZWQgdG8KICAgICBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FLgogICAgIChDaGVjayBpZiB0aGlzIGlzIHRydWU/IE9wZW5QR1AgY2FsbHMgdGhlbSAic3Ryb25nIi4pCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1lcmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mICJkaCIgYW5kICJnZW5kaCIgcHJvZ3JhbXMgaW50byBhIG5ldyBwcm9ncmFtCiAgICAgImRocGFyYW0iLiBUaGUgb2xkIHByb2dyYW1zIGFyZSByZXRhaW5lZCBmb3Igbm93IGJ1dCB3aWxsIGhhbmRsZSBESCBrZXlzCiAgICAgKGluc3RlYWQgb2YgcGFyYW1ldGVycykgaW4gZnV0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIGNpcGhlcnMsIHNfc2VydmVyIGFuZCBzX2NsaWVudCBwcm9ncmFtcyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcwogICAgIHdoZW4gYSBuZXcgY2lwaGVyIGxpc3QgaXMgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIFNTTC9UTFMgY2lwaGVyIG1lY2hhbmlzbSB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBUTFMgNTZiaXQKICAgICBjaXBoZXJzLiBCZWZvcmUgd2hlbiB0aGUgNTZiaXQgY2lwaGVycyB3ZXJlIGVuYWJsZWQgdGhlIHNvcnRpbmcgd2FzCiAgICAgd3JvbmcuCgogICAgIFRoZSBzeW50YXggZm9yIHRoZSBjaXBoZXIgc29ydGluZyBoYXMgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IHNvcnRpbmcgYnkKICAgICBjaXBoZXItc3RyZW5ndGggKHVzaW5nIHRoZSBzdHJlbmd0aF9iaXRzIGhhcmQgY29kZWQgaW4gdGhlIHRhYmxlcykuCiAgICAgVGhlIG5ldyBjb21tYW5kIGlzICJAU1RSRU5HVEgiIChzZWUgYWxzbyBkb2MvYXBwcy9jaXBoZXJzLnBvZCkuCgogICAgIEZpeCBhIGJ1ZyBpbiB0aGUgY2lwaGVyLWNvbW1hbmQgcGFyc2VyOiB3aGVuIHN1cHBseWluZyBhIGNpcGhlciBjb21tYW5kCiAgICAgc3RyaW5nIHdpdGggYW4gInVuZGVmaW5lZCIgc3ltYm9sIChuZWl0aGVyIGNvbW1hbmQgbm9yIGFscGhhbnVtZXJpYwogICAgIFtBLVphLXowLTldLCBzc2xfc2V0X2NpcGhlcl9saXN0IHVzZWQgdG8gaGFuZyBpbiBhbiBlbmRsZXNzIGxvb3AuIE5vdwogICAgIGFuIGVycm9yIGlzIGZsYWdnZWQuCgogICAgIER1ZSB0byB0aGUgc3RyZW5ndGgtc29ydGluZyBleHRlbnNpb24sIHRoZSBjb2RlIG9mIHRoZQogICAgIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBmdW5jdGlvbiB3YXMgY29tcGxldGVseSByZWFycmFuZ2VkLiBJIGhvcGUgdGhhdAogICAgIHRoZSByZWFkYWJpbGl0eSB3YXMgYWxzbyBpbmNyZWFzZWQgOi0pCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBNaW5vciBjaGFuZ2UgdG8gJ3g1MDknIHV0aWxpdHkuIFRoZSAtQ0FjcmVhdGVzZXJpYWwgb3B0aW9uIG5vdyB1c2VzIDEKICAgICBmb3IgdGhlIGZpcnN0IHNlcmlhbCBudW1iZXIgYW5kIHBsYWNlcyAyIGluIHRoZSBzZXJpYWwgbnVtYmVyIGZpbGUuIFRoaXMKICAgICBhdm9pZHMgcHJvYmxlbXMgd2hlbiB0aGUgcm9vdCBDQSBpcyBjcmVhdGVkIHdpdGggc2VyaWFsIG51bWJlciB6ZXJvIGFuZAogICAgIHRoZSBmaXJzdCB1c2VyIGNlcnRpZmljYXRlIGhhcyB0aGUgc2FtZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcgogICAgIGFzIHRoZSByb290IENBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcywgY2hhbmdlIHRoZSAncmVxJyBwcm9ncmFtIHNvIGl0IHVzZXMKICAgICB0aGUgbmV3IGNvZGUuIEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0dWZmLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLiBUaGVzZSBoYXZlIGJlZW4gcmVuYW1lZCBmcm9tCiAgICAgWDUwOV8qKCkgdG8gWDUwOWF0XyooKSBvbiB0aGUgZ3JvdW5kcyB0aGF0IHRoZXkgZG9uJ3QgaGFuZGxlIFg1MDkKICAgICBzdHJ1Y3R1cmVzIGFuZCBiZWhhdmUgaW4gYW4gYW5hbG9nb3VzIHdheSB0byB0aGUgWDUwOXYzIGZ1bmN0aW9uczoKICAgICB0aGV5IHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYnV0IHdyYXBwZXIgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkCiAgICAgaW5zdGVhZC4KCiAgICAgU28gd2UgYWxzbyBub3cgaGF2ZSBzb21lIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGUgWDUwOWF0IGZ1bmN0aW9ucwogICAgIHdoZW4gcGFzc2VkIGNlcnRpZmljYXRlIHJlcXVlc3RzLiAoVE8gRE86IHNpbWlsYXIgdGhpbmdzIGNhbiBiZSBkb25lIHdpdGgKICAgICBQS0NTIzcgc2lnbmVkIGFuZCB1bnNpZ25lZCBhdHRyaWJ1dGVzLCBQS0NTIzEyIGF0dHJpYnV0ZXMgYW5kIGEgZmV3IG90aGVyCiAgICAgdGhpbmdzLiBTb21lIG9mIHRoZXNlIG5lZWQgc29tZSBkMmkgb3IgaTJkIGFuZCBwcmludCBmdW5jdGlvbmFsaXR5CiAgICAgYmVjYXVzZSB0aGV5IGhhbmRsZSBtb3JlIGNvbXBsZXggc3RydWN0dXJlcy4pCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1pc3NpbmcgI2lmbmRlZnMgdGhhdCBjYXVzZWQgbWlzc2luZyBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgbGlic3NsCiAgICAgYXMgYSBzaGFyZWQgbGlicmFyeSB3aXRob3V0IFJTQS4gIFVzZSAjaWZuZGVmIE5PX1NTTDIgaW5zdGVhZCBvZgogICAgIE5PX1JTQSBpbiBzc2wvczIqLmMuIAogICAgIFtLcmlzIEtlbm5hd2F5IDxrcmlzQGh1Yi5mcmVlYnNkLm9yZz4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFByZWNhdXRpb25zIGFnYWluc3QgdXNpbmcgdGhlIFBSTkcgdW5pbml0aWFsaXplZDogUkFORF9ieXRlcygpIG5vdwogICAgIGhhcyBhIHJldHVybiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhlIHF1YWxpdHkgb2YgdGhlIHJhbmRvbSBkYXRhCiAgICAgKDEgPSBvaywgMCA9IG5vdCBzZWVkZWQpLiAgQWxzbyBhbiBlcnJvciBpcyByZWNvcmRlZCBvbiB0aGUgdGhyZWFkJ3MKICAgICBlcnJvciBxdWV1ZS4gTmV3IGZ1bmN0aW9uIFJBTkRfcHNldWRvX2J5dGVzKCkgZ2VuZXJhdGVzIG91dHB1dCB0aGF0IGlzCiAgICAgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYnV0IG5vdCB1bnByZWRpY3RhYmxlLiBSQU5EX2FkZCBpcyBsaWtlCiAgICAgUkFORF9zZWVkLCBidXQgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgZm9yIGFuIGVudHJvcHkgZXN0aW1hdGUKICAgICAoUkFORF9zZWVkIGFsd2F5cyBhc3N1bWVzIGZ1bGwgZW50cm9weSkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvIG1vcmUgaXRlcmF0aW9ucyBvZiBSYWJpbi1NaWxsZXIgcHJvYmFibGUgcHJpbWUgdGVzdCAoc3BlY2lmaWNhbGx5LAogICAgIDMgZm9yIDEwMjQtYml0IHByaW1lcywgNiBmb3IgNTEyLWJpdCBwcmltZXMsIDEyIGZvciAyNTYtYml0IHByaW1lcwogICAgIGluc3RlYWQgb2Ygb25seSAyIGZvciBhbGwgbGVuZ3Roczsgc2VlIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSBkZWZpbml0aW9uCiAgICAgaW4gY3J5cHRvL2JuL2JuX3ByaW1lLmMgZm9yIHRoZSBjb21wbGV0ZSB0YWJsZSkuICBUaGlzIGd1YXJhbnRlZXMgYQogICAgIGZhbHNlLXBvc2l0aXZlIHJhdGUgb2YgYXQgbW9zdCAyXi04MCBmb3IgcmFuZG9tIGlucHV0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgc3NsM19yZWFkX24gKHNzbC9zM19wa3QuYykgYXZvaWRpbmcgYSBjb3VwbGUgb2YgYnVncy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DVFhfcmdldF9jaGFpbigpIChyZW5hbWVkIHRvIFg1MDlfQ1RYX2dldDFfY2hhaW4KICAgICBpbiB0aGUgMC45LjUgcmVsZWFzZSksIHRoaXMgcmV0dXJucyB0aGUgY2hhaW4KICAgICBmcm9tIGFuIFg1MDlfQ1RYIHN0cnVjdHVyZSB3aXRoIGEgZHVwIG9mIHRoZSBzdGFjayBhbmQgYWxsCiAgICAgdGhlIFg1MDkgcmVmZXJlbmNlIGNvdW50cyB1cHBlZDogc28gdGhlIHN0YWNrIHdpbGwgZXhpc3QKICAgICBhZnRlciBYNTA5X0NUWF9jbGVhbnVwKCkgaGFzIGJlZW4gY2FsbGVkLiBNb2RpZnkgcGtjczEyLmMKICAgICB0byB1c2UgdGhpcy4KCiAgICAgQWxzbyBtYWtlIFNTTF9TRVNTSU9OX3ByaW50KCkgcHJpbnQgb3V0IHRoZSB2ZXJpZnkgcmV0dXJuCiAgICAgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWFucGFnZSBmb3IgdGhlIHBrY3MxMiBjb21tYW5kLiBBbHNvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciBzbyBNQUMgaXRlcmF0aW9uIGNvdW50cyBhcmUgdXNlZCB1bmxlc3MgdGhlIG5ldwogICAgIC1ub21hY2l0ZXIgb3B0aW9uIGlzIHVzZWQuIFRoaXMgaW1wcm92ZXMgZmlsZSBzZWN1cml0eSBhbmQKICAgICBvbmx5IG9sZGVyIHZlcnNpb25zIG9mIE1TSUUgKDQuMCBmb3IgZXhhbXBsZSkgbmVlZCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIb25vciB0aGUgbm8teHh4IENvbmZpZ3VyZSBvcHRpb25zIHdoZW4gY3JlYXRpbmcgLkRFRiBmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFBLQ1MjMTAgYXR0cmlidXRlcyB0byBmaWVsZCB0YWJsZTogY2hhbGxlbmdlUGFzc3dvcmQsIAogICAgIHVuc3RydWN0dXJlZE5hbWUgYW5kIHVuc3RydWN0dXJlZEFkZHJlc3MuIFRoZXNlIGFyZSB0YWtlbiBmcm9tCiAgICAgZHJhZnQgUEtDUyM5IHYyLjAgYnV0IGFyZSBjb21wYXRpYmxlIHdpdGggdjEuMiBwcm92aWRlZCBubyAKICAgICBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMgYXJlIHVzZWQuCgogICAgIE1vcmUgY2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSBjb2RlOiBhbGxvdyB0aGUgc2V0dGluZyBvZiB0eXBlcwogICAgIGJhc2VkIG9uIHN0cmluZ3MuIFJlbW92ZSB0aGUgJ2xvYycgcGFyYW1ldGVyIHdoZW4gYWRkaW5nCiAgICAgYXR0cmlidXRlcyBiZWNhdXNlIHRoZXNlIHdpbGwgYmUgYSBTRVQgT0YgZW5jb2Rpbmcgd2hpY2ggaXMgc29ydGVkCiAgICAgaW4gQVNOMSBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNoYW5nZXMgdG8gdGhlICdyZXEnIHV0aWxpdHkgdG8gYWxsb3cgcmVxdWVzdCBnZW5lcmF0aW9uCiAgICAgYXV0b21hdGlvbi4gVGhpcyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGp1c3QgZ2VuZXJhdGUgYSB0ZW1wbGF0ZQogICAgIGZpbGUgY29udGFpbmluZyBhbGwgdGhlIGZpZWxkIHZhbHVlcyBhbmQgaGF2ZSByZXEgY29uc3RydWN0IHRoZQogICAgIHJlcXVlc3QuCgogICAgIEluaXRpYWwgc3VwcG9ydCBmb3IgWDUwOV9BVFRSSUJVVEUgaGFuZGxpbmcuIFN0YWNrcyBvZiB0aGVzZSBhcmUKICAgICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZSBpbmNsdWRpbmcgY2VydGlmaWNhdGUgcmVxdWVzdHMgYW5kIFBLQ1MjNwogICAgIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGN1cnJlbnRseSBoYW5kbGVkIG1hbnVhbGx5IHdoZXJlIG5lY2Vzc2FyeSB3aXRoCiAgICAgc29tZSBwcmltaXRpdmUgd3JhcHBlcnMgZm9yIFBLQ1MjNy4gVGhlIG5ldyBmdW5jdGlvbnMgYmVoYXZlIGluIGEKICAgICBtYW5uZXIgYW5hbG9nb3VzIHRvIHRoZSBYNTA5IGV4dGVuc2lvbiBmdW5jdGlvbnM6IHRoZXkgYWxsb3cKICAgICBhdHRyaWJ1dGVzIHRvIGJlIGxvb2tlZCB1cCBieSBOSUQgYW5kIGFkZGVkLgoKICAgICBMYXRlciBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgWDUwOVYzIGNvZGUgd291bGQgYmUgZGVzaXJhYmxlIHRvCiAgICAgYXV0b21hdGljYWxseSBoYW5kbGUgdGhlIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgcHJpbnRpbmcgb2YgdGhlCiAgICAgbW9yZSBjb21wbGV4IHR5cGVzLiBUaGUgc3RyaW5nIHR5cGVzIGxpa2UgY2hhbGxlbmdlUGFzc3dvcmQgY2FuCiAgICAgYmUgaGFuZGxlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGZ1bmN0aW9ucy4KCiAgICAgQWxzbyBtb2RpZmllZCB0aGUgbXVsdGkgYnl0ZSBzdHJpbmcgdGFibGUgaGFuZGxpbmcuIE5vdyB0aGVyZSBpcwogICAgIGEgJ2dsb2JhbCBtYXNrJyB3aGljaCBtYXNrcyBvdXQgY2VydGFpbiB0eXBlcy4gVGhlIHRhYmxlIGl0c2VsZgogICAgIGNhbiB1c2UgdGhlIGZsYWcgU1RBQkxFX05PX01BU0sgdG8gaWdub3JlIHRoZSBtYXNrIHNldHRpbmc6IHRoaXMKICAgICBpcyB1c2VmdWwgd2hlbiBmb3IgZXhhbXBsZSB0aGVyZSBpcyBvbmx5IG9uZSBwZXJtaXNzaWJsZSB0eXBlCiAgICAgKGFzIGluIGNvdW50cnlOYW1lKSBhbmQgdXNpbmcgdGhlIG1hc2sgbWlnaHQgcmVzdWx0IGluIG5vIHZhbGlkCiAgICAgdHlwZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIHVwICdGaW5pc2hlZCcgaGFuZGxpbmcsIGFuZCBhZGQgZnVuY3Rpb25zIFNTTF9nZXRfZmluaXNoZWQgYW5kCiAgICAgU1NMX2dldF9wZWVyX2ZpbmlzaGVkIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBvYnRhaW4gdGhlIGxhdGVzdAogICAgIEZpbmlzaGVkIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIHBlZXIgb3IgZXhwZWN0ZWQgZnJvbSB0aGUgcGVlciwKICAgICByZXNwZWN0aXZlbHkuICAoU1NMX2dldF9wZWVyX2ZpbmlzaGVkIGlzIHVzdWFsbHkgdGhlIEZpbmlzaGVkIG1lc3NhZ2UKICAgICBhY3R1YWxseSByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCBvdGhlcndpc2UgdGhlIHByb3RvY29sIHdpbGwgYmUgYWJvcnRlZC4pCgogICAgIEFzIHRoZSBGaW5pc2hlZCBtZXNzYWdlIGFyZSBtZXNzYWdlIGRpZ2VzdHMgb2YgdGhlIGNvbXBsZXRlIGhhbmRzaGFrZQogICAgICh3aXRoIGEgdG90YWwgb2YgMTkyIGJpdHMgZm9yIFRMUyAxLjAgYW5kIG1vcmUgZm9yIFNTTCAzLjApLCB0aGV5IGNhbgogICAgIGJlIHVzZWQgZm9yIGV4dGVybmFsIGF1dGhlbnRpY2F0aW9uIHByb2NlZHVyZXMgd2hlbiB0aGUgYXV0aGVudGljYXRpb24KICAgICBwcm92aWRlZCBieSBTU0wvVExTIGlzIG5vdCBkZXNpcmVkIG9yIGlzIG5vdCBlbm91Z2guCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgQWxwaGEgTGludXggaXMgYWRkZWQuIE5vdyAuL2NvbmZpZyBjaGVja3MgaWYKICAgICB0aGUgaG9zdCBzdXBwb3J0cyBCV1ggZXh0ZW5zaW9uIGFuZCBpZiBDb21wYXEgQyBpcyBwcmVzZW50IG9uIHRoZQogICAgICRQQVRILiBKdXN0IGV4cGxvaXRpbmcgb2YgdGhlIEJXWCBleHRlbnNpb24gcmVzdWx0cyBpbiAyMC0zMCUKICAgICBwZXJmb3JtYW5jZSBraWNrIGZvciBzb21lIGFsZ29yaXRobXMsIGUuZy4gREVTIGFuZCBSQzQgdG8gbWVudGlvbgogICAgIGEgY291cGxlLiBDb21wYXEgQyBpbiB0dXJuIGdlbmVyYXRlcyB+MjAlIGZhc3RlciBjb2RlIGZvciBNRDUgYW5kCiAgICAgU0hBMS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIE1TICJmYXN0IFNHQyIuIFRoaXMgaXMgYXJndWFibHkgYSB2aW9sYXRpb24gb2YgdGhlCiAgICAgU1NMMy9UTFMgcHJvdG9jb2wuIE5ldHNjYXBlIFNHQyBkb2VzIHR3byBoYW5kc2hha2VzOiB0aGUgZmlyc3Qgd2l0aAogICAgIHdlYWsgY3J5cHRvIGFuZCBhZnRlciBjaGVja2luZyB0aGUgY2VydGlmaWNhdGUgaXMgU0dDIGEgc2Vjb25kIG9uZQogICAgIHdpdGggc3Ryb25nIGNyeXB0by4gTVMgU0dDIHN0b3BzIHRoZSBmaXJzdCBoYW5kc2hha2UgYWZ0ZXIgcmVjZWl2aW5nCiAgICAgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBtZXNzYWdlIGFuZCBzZW5kcyBhIHNlY29uZCBjbGllbnQgaGVsbG8uIFNpbmNlCiAgICAgYSBzZXJ2ZXIgd2lsbCB0eXBpY2FsbHkgZG8gYWxsIHRoZSB0aW1lIGNvbnN1bWluZyBvcGVyYXRpb25zIGJlZm9yZQogICAgIGV4cGVjdGluZyBhbnkgZnVydGhlciBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgKHNlcnZlciBrZXkgZXhjaGFuZ2UKICAgICBpcyB0aGUgbW9zdCBleHBlbnNpdmUpIHRoZXJlIGlzIGxpdHRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by4KCiAgICAgVG8gZ2V0IE9wZW5TU0wgdG8gc3VwcG9ydCBNUyBTR0Mgd2UgaGF2ZSB0byBwZXJtaXQgYSBzZWNvbmQgY2xpZW50CiAgICAgaGVsbG8gbWVzc2FnZSBhZnRlciB3ZSBoYXZlIHNlbnQgc2VydmVyIGRvbmUuIEluIGFkZGl0aW9uIHdlIGhhdmUgdG8KICAgICByZXNldCB0aGUgTUFDIGlmIHdlIGRvIGdldCB0aGlzIHNlY29uZCBjbGllbnQgaGVsbG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gJ2QyaV9BdXRvUHJpdmF0ZUtleSgpJyB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBkZWNpZGUKICAgICBpZiBhIERFUiBlbmNvZGVkIHByaXZhdGUga2V5IGlzIFJTQSBvciBEU0EgdHJhZGl0aW9uYWwgZm9ybWF0LiBDaGFuZ2VkCiAgICAgZDJpX1ByaXZhdGVLZXlfYmlvKCkgdG8gdXNlIGl0LiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgInRyYWRpdGlvbmFsIgogICAgIGZvcm1hdCBERVIgZW5jb2RlZCBwcml2YXRlIGtleS4gTmV3ZXIgY29kZSBzaG91bGQgdXNlIFBLQ1MjOCBmb3JtYXQgd2hpY2gKICAgICBoYXMgdGhlIGtleSB0eXBlIGVuY29kZWQgaW4gdGhlIEFTTjEgc3RydWN0dXJlLiBBZGRlZCBERVIgcHJpdmF0ZSBrZXkKICAgICBzdXBwb3J0IHRvIHBrY3M4IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTCAzL1RMUyAxIHNlcnZlcnMgbm93IGRvbid0IHJlcXVlc3QgY2VydGlmaWNhdGVzIHdoZW4gYW4gYW5vbnltb3VzCiAgICAgY2lwaGVyc3VpdGVzIGhhcyBiZWVuIHNlbGVjdGVkIChhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMvVExTIDEKICAgICBzcGVjaWZpY2F0aW9ucykuICBFeGNlcHRpb246IFdoZW4gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAogICAgIGlzIHNldCwgd2UgaW50ZXJwcmV0IHRoaXMgYXMgYSByZXF1ZXN0IHRvIHZpb2xhdGUgdGhlIHNwZWNpZmljYXRpb24KICAgICAodGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyBhIGhhbmRzaGFrZSBmYWlsdXJlLCBhbmQgJ2NvcnJlY3QnCiAgICAgYmVoYXZpb3VyIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmRzaGFrZSBmYWlsdXJlIGFueXdheSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gU1NMX0NUWF9hZGRfc2Vzc2lvbiwgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZQogICAgIFNTTF9TRVNTSU9OIHN0cnVjdHVyZXMgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIChlLmcuIHdoZW4gdHdvIHRocmVhZHMKICAgICBjb25jdXJyZW50bHkgb2J0YWluIHRoZW0gZnJvbSBhbiBleHRlcm5hbCBjYWNoZSkuCiAgICAgVGhlIGludGVybmFsIGNhY2hlIGNhbiBoYW5kbGUgb25seSBvbmUgU1NMX1NFU1NJT04gd2l0aCBhIGdpdmVuIElELAogICAgIHNvIGlmIHRoZXJlJ3MgYSBjb25mbGljdCwgd2Ugbm93IHRocm93IG91dCB0aGUgb2xkIG9uZSB0byBhY2hpZXZlCiAgICAgY29uc2lzdGVuY3kuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIE9JRHMgZm9yIGlkZWEgYW5kIGJsb3dmaXNoIGluIENCQyBtb2RlLiBUaGlzIHdpbGwgYWxsb3cgYm90aAogICAgIHRvIGJlIHVzZWQgaW4gUEtDUyM1IHYyLjAgYW5kIFMvTUlNRS4gIEFsc28gYWRkIGNoZWNraW5nIHRvCiAgICAgc29tZSByb3V0aW5lcyB0aGF0IHVzZSBjaXBoZXIgT0lEczogc29tZSBjaXBoZXJzIGRvIG5vdCBoYXZlIE9JRHMKICAgICBkZWZpbmVkIGFuZCBzbyB0aGV5IGNhbm5vdCBiZSB1c2VkIGZvciBTL01JTUUgYW5kIFBLQ1MjNSB2Mi4wIGZvcgogICAgIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2ltcGxpZnkgdGhlIHRydXN0IHNldHRpbmcgc3RydWN0dXJlIGFuZCBjb2RlLiBOb3cgd2UganVzdCBoYXZlCiAgICAgdHdvIHNlcXVlbmNlcyBvZiBPSURzIGZvciB0cnVzdGVkIGFuZCByZWplY3RlZCBzZXR0aW5ncy4gVGhlc2Ugd2lsbAogICAgIHR5cGljYWxseSBoYXZlIHZhbHVlcyB0aGUgc2FtZSBhcyB0aGUgZXh0ZW5kZWQga2V5IHVzYWdlIGV4dGVuc2lvbgogICAgIGFuZCBhbnkgYXBwbGljYXRpb24gc3BlY2lmaWMgcHVycG9zZXMuCgogICAgIFRoZSB0cnVzdCBjaGVja2luZyBjb2RlIG5vdyBoYXMgYSBkZWZhdWx0IGJlaGF2aW91cjogaXQgd2lsbCBqdXN0CiAgICAgY2hlY2sgZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIE5JRCBhcyB0aGUgcGFzc2VkIGlkLiBGdW5jdGlvbnMgY2FuCiAgICAgYmUgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvciB0aGUgYmVoYXZpb3VyCiAgICAgZm9yIGEgZ2l2ZW4gaWQuIFNTTCBjbGllbnQsIHNlcnZlciBhbmQgZW1haWwgYWxyZWFkeSBoYXZlIGZ1bmN0aW9ucwogICAgIGluIHBsYWNlIGZvciBjb21wYXRpYmlsaXR5OiB0aGV5IGNoZWNrIHRoZSBOSUQgYW5kIGFsc28gcmV0dXJuICJ0cnVzdGVkIgogICAgIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBzZWxmIHNpZ25lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZDJpLGkyZCBiaW8vZnAgZnVuY3Rpb25zIGZvciBQcml2YXRlS2V5OiB0aGVzZSBjb252ZXJ0IHRoZQogICAgIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnRvIGFuIEVWUF9QS0VZIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBwYXNzd29yZCBjYWxsYmFjayBmdW5jdGlvbiBQRU1fY2IoKSB3aGljaCBlaXRoZXIgcHJvbXB0cyBmb3IKICAgICBhIHBhc3N3b3JkIGlmIHVzcl9kYXRhIGlzIE5VTEwgb3Igb3RoZXJ3aXNlIGFzc3VtZXMgaXQgaXMgYSBudWxsCiAgICAgdGVybWluYXRlZCBwYXNzd29yZC4gQWxsb3cgcGFzc3dvcmRzIHRvIGJlIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUKICAgICBlbnZpcm9ubWVudCBvciBjb25maWcgZmlsZXMgaW4gYSBmZXcgbW9yZSB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgREVSIGFuZCBQRU0gZnVuY3Rpb25zIHRvIGhhbmRsZSBQS0NTIzggZm9ybWF0IHByaXZhdGUKICAgICBrZXlzLiBBZGQgc29tZSBzaG9ydCBuYW1lcyBmb3IgUEtDUyM4IFBCRSBhbGdvcml0aG1zIGFuZCBhbGxvdyB0aGVtCiAgICAgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBwa2NzOCBhbmQgcGtjczEyIHV0aWxpdGllcy4KICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBBU04xICJOVUxMIiB0eXBlLiBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIGJ5IHVzaW5nCiAgICAgQVNOMV9UWVBFIGJ1dCB0aGVyZSB3YXNuJ3QgYW55IGZ1bmN0aW9uIHRoYXQgd291bGQgdHJ5IHRvIHJlYWQgYSBOVUxMCiAgICAgYW5kIHByb2R1Y2UgYW4gZXJyb3IgaWYgaXQgY291bGRuJ3QuIEZvciBjb21wYXRpYmlsaXR5IHdlIGFsc28gaGF2ZQogICAgIEFTTjFfTlVMTF9uZXcoKSBhbmQgQVNOMV9OVUxMX2ZyZWUoKSBmdW5jdGlvbnMgYnV0IHRoZXNlIGFyZSBmYWtlZCBhbmQKICAgICBkb24ndCBhbGxvY2F0ZSBhbnl0aGluZyBiZWNhdXNlIHRoZXkgZG9uJ3QgbmVlZCB0by4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIE1hY09TIGlzIG5vdyBwcm92aWRlZC4gRXhhbWluZSBJTlNUQUxMLk1hY09TCiAgICAgZm9yIGRldGFpbHMuCiAgICAgW0FuZHkgUG9seWFrb3YsIFJveSBXb29kcyA8cm95QGNlbnRpY3N5c3RlbXMuY2E+XQoKICAqKSBSZWJ1aWxkIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB1c2VkIGJ5IE9wZW5TU0wgY29kZSBhbmQKICAgICBwb3NzaWJseSBvdGhlcnMgYXMgd2VsbC4gIFRoZSBwdXJwb3NlIGlzIHRvIG1ha2UgYW4gaW50ZXJmYWNlIHRoYXQKICAgICBwcm92aWRlIGhvb2tzIHNvIGFueW9uZSBjYW4gYnVpbGQgYSBzZXBhcmF0ZSBzZXQgb2YgYWxsb2NhdGlvbiBhbmQKICAgICBkZWFsbG9jYXRpb24gcm91dGluZXMgdG8gYmUgdXNlZCBieSBPcGVuU1NMLCBmb3IgZXhhbXBsZSBtZW1vcnkKICAgICBwb29sIGltcGxlbWVudGF0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICBzaW5jZSBNYWxsb2MoKSwgUmVhbGxvYygpIGFuZCBGcmVlKCkgd2VyZSBkZWZpbmVkIGFzIG1hY3JvcyBoYXZpbmcKICAgICB0aGUgdmFsdWVzIG1hbGxvYywgcmVhbGxvYyBhbmQgZnJlZSwgcmVzcGVjdGl2ZWx5IChleGNlcHQgZm9yIFdpbjMyCiAgICAgY29tcGlsYXRpb25zKS4gIFRoZSBzYW1lIGlzIHByb3ZpZGVkIGZvciBtZW1vcnkgZGVidWdnaW5nIGNvZGUuCiAgICAgT3BlblNTTCBhbHJlYWR5IGNvbWVzIHdpdGggZnVuY3Rpb25hbGl0eSB0byBmaW5kIG1lbW9yeSBsZWFrcywgYnV0CiAgICAgdGhpcyBnaXZlcyBwZW9wbGUgYSBjaGFuY2UgdG8gZGVidWcgb3RoZXIgbWVtb3J5IHByb2JsZW1zLgoKICAgICBXaXRoIHRoZXNlIGNoYW5nZXMsIGEgbmV3IHNldCBvZiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBoYXZlIGFwcGVhcmVkOgoKICAgICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpCSAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZ2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKSAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucygpCSAgICAgICAgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfZ2V0X29wdGlvbnMoKSAgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAgICAgICAgICAgICAgIFtNXQoKICAgICBUaGUgbWVtb3J5IGRlYnVnIGZ1bmN0aW9ucyBhcmUgTlVMTCBieSBkZWZhdWx0LCB1bmxlc3MgdGhlIGxpYnJhcnkKICAgICBpcyBjb21waWxlZCB3aXRoIENSWVBUT19NREVCVUcgb3IgZnJpZW5kcyBpcyBkZWZpbmVkLiAgSWYgc29tZW9uZQogICAgIHdhbnRzIHRvIGRlYnVnIG1lbW9yeSBhbnl3YXksIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpICh3aGljaAogICAgIGdpdmVzIHRoZSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZnVuY3Rpb25zIHRoYXQgY29tZSB3aXRoIE9wZW5TU0wpIG9yCiAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgKHRlbGxzIE9wZW5TU0wgdG8gdXNlIGZ1bmN0aW9ucwogICAgIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5IHVzZXIpIG11c3QgYmUgdXNlZC4gIFdoZW4gdGhlIHN0YW5kYXJkCiAgICAgZGVidWdnaW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCwgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyBjYW4gYmUgdXNlZCB0bwogICAgIHJlcXVlc3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKICAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKFZfQ1lSUFRPX01ERUJVR194eHgpIGNvcnJlc3BvbmRzIHRvIHNldHRpbmcKICAgICB0aGUgQ1JZUFRPX01ERUJVR194eHggbWFjcm8gd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkuICAgCgogICAgIEFsc28sIHRoaW5ncyBsaWtlIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyB3aWxsIGFsd2F5cyBnaXZlIHRoZQogICAgIGV4cGVjdGVkIHJlc3VsdCAodGhlIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGlzIHVzZWQgZm9yIGFsbG9jYXRpb24KICAgICBhbmQgZGVhbGxvY2F0aW9uKSBhdCBhbGwgdGltZXMsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0gYW5kIGNvbXBpbGVyCiAgICAgb3B0aW9ucy4KCiAgICAgVG8gZmluaXNoIGl0IHVwLCBzb21lIGZ1bmN0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgdXNlIGluIGFueSBvdGhlcgogICAgIHdheSB0aGFuIHRocm91Z2ggbWFjcm9zIGhhdmUgYSBuZXcgQVBJIGFuZCBuZXcgc2VtYW50aWM6CgogICAgICAgQ1JZUFRPX2RiZ19tYWxsb2MoKQogICAgICAgQ1JZUFRPX2RiZ19yZWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfZnJlZSgpCgogICAgIEFsbCBtYWNyb3Mgb2YgdmFsdWUgaGF2ZSByZXRhaW5lZCB0aGVpciBvbGQgc3ludGF4LgogICAgIFtSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgU29tZSBTL01JTUUgZml4ZXMuIFRoZSBPSUQgZm9yIFNNSU1FQ2FwYWJpbGl0aWVzIHdhcyB3cm9uZywgdGhlCiAgICAgb3JkZXJpbmcgb2YgU01JTUVDYXBhYmlsaXRpZXMgd2Fzbid0IGluICJzdHJlbmd0aCBvcmRlciIgYW5kIHRoZXJlCiAgICAgd2FzIGEgbWlzc2luZyBOVUxMIGluIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGZvciB0aGUgU0hBMSBzaWduYXR1cmUKICAgICBhbGdvcml0aG0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU29tZSBBU04xIHR5cGVzIHdpdGggaWxsZWdhbCB6ZXJvIGxlbmd0aCBlbmNvZGluZyAoSU5URUdFUiwKICAgICBFTlVNRVJBVEVEIGFuZCBPQkpFQ1QgSURFTlRJRklFUikgY2hva2VkIHRoZSBBU04xIHJvdXRpbmVzLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+LCBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIG15IFMvTUlNRSBsaWJyYXJ5IGZvciBPcGVuU1NMLiBUaGlzIHByb3ZpZGVzIGEgc2ltcGxlCiAgICAgUy9NSU1FIEFQSSBvbiB0b3Agb2YgdGhlIFBLQ1MjNyBjb2RlLCBhIE1JTUUgcGFyc2VyICh3aXRoIGVub3VnaAogICAgIGZ1bmN0aW9uYWxpdHkgdG8gaGFuZGxlIG11bHRpcGFydC9zaWduZWQgcHJvcGVybHkpIGFuZCBhIHV0aWxpdHkKICAgICBjYWxsZWQgJ3NtaW1lJyB0byBjYWxsIGFsbCB0aGlzIHN0dWZmLiBUaGlzIGlzIGJhc2VkIG9uIGNvZGUgSQogICAgIG9yaWdpbmFsbHkgd3JvdGUgZm9yIENlbG8gd2hvIGhhdmUga2luZGx5IGFsbG93ZWQgaXQgdG8gYmUKICAgICBpbmNsdWRlZCBpbiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB2YXJpYW50cyBkZXNfc2V0X2tleV9jaGVja2VkIGFuZCBkZXNfc2V0X2tleV91bmNoZWNrZWQgb2YKICAgICBkZXNfc2V0X2tleSAoYWthIGRlc19rZXlfc2NoZWQpLiAgR2xvYmFsIHZhcmlhYmxlIGRlc19jaGVja19rZXkKICAgICBkZWNpZGVzIHdoaWNoIG9mIHRoZXNlIGlzIGNhbGxlZCBieSBkZXNfc2V0X2tleTsgdGhpcyB3YXkKICAgICBkZXNfY2hlY2tfa2V5IGJlaGF2ZXMgYXMgaXQgYWx3YXlzIGRpZCwgYnV0IGFwcGxpY2F0aW9ucyBhbmQKICAgICB0aGUgbGlicmFyeSBpdHNlbGYsIHdoaWNoIHdhcyBidWdneSBmb3IgZGVzX2NoZWNrX2tleSA9PSAxLAogICAgIGhhdmUgYSBjbGVhbmVyIHdheSB0byBwaWNrIHRoZSB2ZXJzaW9uIHRoZXkgbmVlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzEyX25ld3Bhc3MoKSB3aGljaCBjaGFuZ2VzIHRoZSBwYXNzd29yZCBvZiBhCiAgICAgUEtDUzEyIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgWDUwOV9UUlVTVCBhbmQgWDUwOV9QVVJQT1NFIHNvIGl0IGFsc28gdXNlcyBhIHN0YXRpYyBhbmQKICAgICBkeW5hbWljIG1peC4gSW4gYm90aCBjYXNlcyB0aGUgaWRzIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlCiAgICAgdGFibGUuIEFsc28gbW9kaWZpZWQgdGhlIFg1MDlfVFJVU1RfYWRkKCkgYW5kIFg1MDlfUFVSUE9TRV9hZGQoKQogICAgIGZ1bmN0aW9ucyBzbyB0aGV5IGFjY2VwdCBhIGxpc3Qgb2YgdGhlIGZpZWxkIHZhbHVlcyBhbmQgdGhlCiAgICAgYXBwbGljYXRpb24gZG9lc24ndCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIFg1MDlfVFJVU1QKICAgICBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBBU04xX1NUUklOR19UQUJMRSBzdHVmZiBzbyBpdCBhbHNvIHVzZXMgYnNlYXJjaCBhbmQgZG9lc24ndAogICAgIG5lZWQgaW5pdGlhbGlzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgd2F5IHRoZSBWMyBleHRlbnNpb24gY29kZSBsb29rcyB1cCBleHRlbnNpb25zLiBUaGlzIG5vdwogICAgIHdvcmtzIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIG9iamVjdCBjb2RlOiB3ZSBoYXZlIHNvbWUgInN0YW5kYXJkIgogICAgIGV4dGVuc2lvbnMgaW4gYSBzdGF0aWMgdGFibGUgd2hpY2ggaXMgc2VhcmNoZWQgd2l0aCBPQkpfYnNlYXJjaCgpCiAgICAgYW5kIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWRkIGR5bmFtaWMgb25lcyBpZiBuZWVkZWQuIFRoZSBmaWxlCiAgICAgY3J5cHRvL3g1MDl2My9leHRfZGF0Lmggbm93IGhhcyB0aGUgaW5mbzogdGhpcyBmaWxlIG5lZWRzIHRvIGJlCiAgICAgdXBkYXRlZCB3aGVuZXZlciBhIG5ldyBleHRlbnNpb24gaXMgYWRkZWQgdG8gdGhlIGNvcmUgY29kZSBhbmQga2VwdAogICAgIGluIGV4dF9uaWQgb3JkZXIuIFRoZXJlIGlzIGEgc2ltcGxlIHByb2dyYW0gJ3RhYnRlc3QuYycgd2hpY2ggY2hlY2tzCiAgICAgdGhpcy4gTmV3IGV4dGVuc2lvbnMgYXJlIG5vdCBhZGRlZCB0b28gb2Z0ZW4gc28gdGhpcyBmaWxlIGNhbiByZWFkaWx5CiAgICAgYmUgbWFpbnRhaW5lZCBtYW51YWxseS4KCiAgICAgVGhlcmUgYXJlIHR3byBiaWcgYWR2YW50YWdlcyBpbiBkb2luZyB0aGluZ3MgdGhpcyB3YXkuIFRoZSBleHRlbnNpb25zCiAgICAgY2FuIGJlIGxvb2tlZCB1cCBpbW1lZGlhdGVseSBhbmQgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgImFkZGVkIiB1c2luZwogICAgIFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOiB0aGlzIGZ1bmN0aW9uIG5vdyBkb2VzIG5vdGhpbmcuCiAgICAgW1NpZGUgbm90ZTogSSBnZXQgKmxvdHMqIG9mIGVtYWlsIHNheWluZyB0aGUgZXh0ZW5zaW9uIGNvZGUgZG9lc24ndAogICAgICB3b3JrIGJlY2F1c2UgcGVvcGxlIGZvcmdldCB0byBjYWxsIHRoaXMgZnVuY3Rpb25dCiAgICAgQWxzbyBubyBkeW5hbWljIGFsbG9jYXRpb24gaXMgZG9uZSB1bmxlc3MgbmV3IGV4dGVuc2lvbnMgYXJlIGFkZGVkOgogICAgIHNvIGlmIHdlIGRvbid0IGFkZCBjdXN0b20gZXh0ZW5zaW9ucyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwKICAgICBYNTA5VjNfRVhUX2NsZWFudXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgZW5jIHV0aWxpdHkncyBzYWx0aW5nIGFzIGZvbGxvd3M6IG1ha2Ugc2FsdGluZyB0aGUgZGVmYXVsdC4gQWRkIGEKICAgICBtYWdpYyBoZWFkZXIsIHNvIHVuc2FsdGVkIGZpbGVzIGZhaWwgZ3JhY2VmdWxseSBpbnN0ZWFkIG9mIGp1c3QgZGVjcnlwdGluZwogICAgIHRvIGdhcmJhZ2UuIFRoaXMgaXMgYmVjYXVzZSBub3Qgc2FsdGluZyBpcyBhIGJpZyBzZWN1cml0eSBob2xlLCBzbyBwZW9wbGUKICAgICBzaG91bGQgYmUgZGlzY291cmFnZWQgZnJvbSBkb2luZyBpdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgJ3g1MDknIHV0aWxpdHkuIEl0IGFsbG93ZWQgYSBtZXNzYWdlCiAgICAgZGlnZXN0IHRvIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGJ1dCBpdCBvbmx5IHVzZWQgdGhpcwogICAgIHBhcmFtZXRlciB3aGVuIHNpZ25pbmcgYSBjZXJ0aWZpY2F0ZS4gTW9kaWZpZWQgc28gYWxsIHJlbGV2YW50CiAgICAgb3BlcmF0aW9ucyBhcmUgYWZmZWN0ZWQgYnkgdGhlIGRpZ2VzdCBwYXJhbWV0ZXIgaW5jbHVkaW5nIHRoZQogICAgIC1maW5nZXJwcmludCBhbmQgLXg1MDl0b3JlcSBvcHRpb25zLiBBbHNvIC14NTA5dG9yZXEgY2hva2VkIGlmIGEKICAgICBEU0Ega2V5IHdhcyB1c2VkIGJlY2F1c2UgaXQgZGlkbid0IGZpeCB0aGUgZGlnZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZ5IGNvZGUuIEN1cnJlbnRseSB0ZXN0cyB0aGUgdW50cnVzdGVkCiAgICAgY2VydGlmaWNhdGVzIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZSAod2hpY2ggaXMgc2V0CiAgICAgd2hlbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlIGlzIHNldCB1cCkgYW5kIGNoZWNrcyB0aGUgcGF0aGxlbmd0aC4KCiAgICAgVGhlcmUgaXMgYSBOT19DSEFJTl9WRVJJRlkgY29tcGlsYXRpb24gb3B0aW9uIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXI6CiAgICAgdGhpcyBpcyBiZWNhdXNlIGl0IHdpbGwgcmVqZWN0IGNoYWlucyB3aXRoIGludmFsaWQgZXh0ZW5zaW9ucyB3aGVyZWFzCiAgICAgZXZlcnkgcHJldmlvdXMgdmVyc2lvbiBvZiBPcGVuU1NMIGFuZCBTU0xlYXkgbWFkZSBubyBjaGVja3MgYXQgYWxsLgoKICAgICBUcnVzdCBjb2RlOiBjaGVja3MgdGhlIHJvb3QgQ0EgZm9yIHRoZSByZWxldmFudCB0cnVzdCBzZXR0aW5ncy4gVHJ1c3QKICAgICBzZXR0aW5ncyBoYXZlIGFuIGluaXRpYWwgdmFsdWUgY29uc2lzdGVudCB3aXRoIHRoZSB2ZXJpZnkgcHVycG9zZTogZS5nLgogICAgIGlmIHRoZSB2ZXJpZnkgcHVycG9zZSBpcyBmb3IgU1NMIGNsaWVudCB1c2UgaXQgZXhwZWN0cyB0aGUgQ0EgdG8gYmUKICAgICB0cnVzdGVkIGZvciBTU0wgY2xpZW50IHVzZS4gSG93ZXZlciB0aGUgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0bwogICAgIHBlcm1pdCBjdXN0b20gdHJ1c3Qgc2V0dGluZ3M6IG9uZSBleGFtcGxlIG9mIHRoaXMgd291bGQgYmUgdG8gb25seSB0cnVzdAogICAgIGNlcnRpZmljYXRlcyBmcm9tIGEgc3BlY2lmaWMgInNlY3VyZSIgc2V0IG9mIENBcy4KCiAgICAgQWxzbyBhZGRlZCBYNTA5X1NUT1JFX0NUWF9uZXcoKSBhbmQgWDUwOV9TVE9SRV9DVFhfZnJlZSgpIGZ1bmN0aW9ucwogICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciB2ZXJzaW9uIHBvcnRhYmlsaXR5OiBlc3BlY2lhbGx5IHNpbmNlIHRoZQogICAgIHZlcmlmeSBzdHJ1Y3R1cmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBtb3JlIG9mdGVuIG5vdy4KCiAgICAgU1NMIGludGVncmF0aW9uLiBBZGQgcHVycG9zZSBhbmQgdHJ1c3QgdG8gU1NMX0NUWCBhbmQgU1NMIGFuZCBmdW5jdGlvbnMKICAgICB0byBzZXQgdGhlbS4gSWYgbm90IHNldCB0aGVuIGFzc3VtZSBTU0wgY2xpZW50cyB3aWxsIHZlcmlmeSBTU0wgc2VydmVycwogICAgIGFuZCB2aWNlIHZlcnNhLgoKICAgICBUd28gbmV3IG9wdGlvbnMgdG8gdGhlIHZlcmlmeSBwcm9ncmFtOiAtdW50cnVzdGVkIGFsbG93cyBhIHNldCBvZgogICAgIHVudHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gYmUgcGFzc2VkIGluIGFuZCAtcHVycG9zZSB3aGljaCBzZXRzIHRoZQogICAgIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIGNlcnRpZmljYXRlLiBJZiBhIHB1cnBvc2UgaXMgc2V0IHRoZW4gdGhlCiAgICAgbmV3IGNoYWluIHZlcmlmeSBjb2RlIGlzIHVzZWQgdG8gY2hlY2sgZXh0ZW5zaW9uIGNvbnNpc3RlbmN5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHRoZSBhdXRob3JpdHkgaW5mb3JtYXRpb24gYWNjZXNzIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgUlNBIGFuZCBEU0EgUEVNIHJlYWQgcm91dGluZXMgdG8gdHJhbnNwYXJlbnRseSBoYW5kbGUKICAgICBQS0NTIzggZm9ybWF0IHByaXZhdGUga2V5cy4gTmV3ICpfUFVCS0VZXyogZnVuY3Rpb25zIHRoYXQgaGFuZGxlCiAgICAgcHVibGljIGtleXMgaW4gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIGNlcnRpZmljYXRlCiAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gc3RydWN0dXJlcy4gVW5mb3J0dW5hdGVseSB0aGVyZSB3ZXJlIGFscmVhZHkKICAgICBmdW5jdGlvbnMgY2FsbGVkICpfUHVibGljS2V5Xyogd2hpY2ggdXNlZCB2YXJpb3VzIG9kZCBmb3JtYXRzIHNvCiAgICAgdGhlc2UgYXJlIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5OiBob3dldmVyIHRoZSBEU0EgdmFyaWFudHMgd2VyZQogICAgIG5ldmVyIGluIGEgcHVibGljIHJlbGVhc2Ugc28gdGhleSBoYXZlIGJlZW4gZGVsZXRlZC4gQ2hhbmdlZCBkc2EvcnNhCiAgICAgdXRpbGl0aWVzIHRvIGhhbmRsZSB0aGUgbmV3IGZvcm1hdDogbm90ZSBubyByZWxlYXNlcyBldmVyIGhhbmRsZWQgcHVibGljCiAgICAga2V5cyBzbyB3ZSBzaG91bGQgYmUgT0suCgogICAgIFRoZSBwcmltYXJ5IG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIGF2b2lkIHRoZSBzYW1lIGZpYXNjbwogICAgIHRoYXQgZG9ncyBwcml2YXRlIGtleXM6IHRoZXJlIGFyZSBzZXZlcmFsIGluY29tcGF0aWJsZSBwcml2YXRlIGtleQogICAgIGZvcm1hdHMgc29tZSBvZiB3aGljaCBhcmUgc3RhbmRhcmQgYW5kIHNvbWUgT3BlblNTTCBzcGVjaWZpYyBhbmQKICAgICByZXF1aXJlIHZhcmlvdXMgZXZpbCBoYWNrcyB0byBhbGxvdyBwYXJ0aWFsIHRyYW5zcGFyZW50IGhhbmRsaW5nIGFuZAogICAgIGV2ZW4gdGhlbiBpdCBkb2Vzbid0IHdvcmsgd2l0aCBERVIgZm9ybWF0cy4gR2l2ZW4gdGhlIG9wdGlvbiBhbnl0aGluZwogICAgIG90aGVyIHRoYW4gUEtDUyM4IHNob3VsZCBiZSBkdW1wZWQ6IGJ1dCB0aGUgb3RoZXIgZm9ybWF0cyBoYXZlIHRvCiAgICAgc3RheSBpbiB0aGUgbmFtZSBvZiBjb21wYXRpYmlsaXR5LgoKICAgICBXaXRoIHB1YmxpYyBrZXlzIGFuZCB0aGUgYmVuZWZpdCBvZiBoaW5kc2lnaHQgb25lIHN0YW5kYXJkIGZvcm1hdCAKICAgICBpcyB1c2VkIHdoaWNoIHdvcmtzIHdpdGggRVZQX1BLRVksIFJTQSBvciBEU0Egc3RydWN0dXJlczogdGhvdWdoCiAgICAgaXQgY2xlYXJseSByZXR1cm5zIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gcmVhZCB0aGUgd3Jvbmcga2luZCBvZiBrZXkuCgogICAgIEFkZGVkIGEgLXB1YmtleSBvcHRpb24gdG8gdGhlICd4NTA5JyB1dGlsaXR5IHRvIG91dHB1dCB0aGUgcHVibGljIGtleS4KICAgICBBbHNvIHJlbmFtZSB0aGUgRVZQX1BLRVlfZ2V0XyooKSB0byBFVlBfUEtFWV9yZ2V0XyooKQogICAgIChyZW5hbWVkIHRvIEVWUF9QS0VZX2dldDFfKigpIGluIHRoZSBPcGVuU1NMIDAuOS41IHJlbGVhc2UpIGFuZCBhZGQKICAgICBFVlBfUEtFWV9yc2V0XyooKSBmdW5jdGlvbnMgKHJlbmFtZWQgdG8gRVZQX1BLRVlfc2V0MV8qKCkpCiAgICAgdGhhdCBkbyB0aGUgc2FtZSBhcyB0aGUgRVZQX1BLRVlfYXNzaWduXyooKSBleGNlcHQgdGhleSB1cCB0aGUKICAgICByZWZlcmVuY2UgY291bnQgb2YgdGhlIGFkZGVkIGtleSAodGhleSBkb24ndCAic3dhbGxvdyIgdGhlCiAgICAgc3VwcGxpZWQga2V5KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBjcnlwdG8veDUwOS9ieV9maWxlLmMgdGhlIGNvZGUgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgYW5kCiAgICAgQ1JMcyB3b3VsZCBmYWlsIGlmIHRoZSBmaWxlIGNvbnRhaW5lZCBubyBjZXJ0aWZpY2F0ZXMgb3Igbm8gQ1JMczoKICAgICBhZGRlZCBhIG5ldyBmdW5jdGlvbiB0byByZWFkIGluIGJvdGggdHlwZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyCiAgICAgcmVhZDogdGhpcyBtZWFucyB0aGF0IGlmIG5vbmUgYXJlIHJlYWQgaXQgd2lsbCBiZSBhbiBlcnJvci4gVGhlCiAgICAgREVSIHZlcnNpb25zIG9mIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgQ1JMIHJlYWRlciB3b3VsZCBhbHdheXMgZmFpbAogICAgIGJlY2F1c2UgaXQgaXNuJ3QgcG9zc2libGUgdG8gbWl4IGNlcnRpZmljYXRlcyBhbmQgQ1JMcyBpbiBERVIgZm9ybWF0CiAgICAgd2l0aG91dCBjaG9raW5nIG9uZSBvciB0aGUgb3RoZXIgcm91dGluZS4gQ2hhbmdlZCB0aGlzIHRvIGp1c3QgcmVhZAogICAgIGEgY2VydGlmaWNhdGU6IHRoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLiBBbHNvIG1vZGlmaWVkIHRoZSBjb2RlCiAgICAgaW4gYXBwcy92ZXJpZnkuYyB0byB0YWtlIG5vdGljZSBvZiByZXR1cm4gY29kZXM6IGl0IHdhcyBwcmV2aW91c2x5CiAgICAgYXR0ZW1wdGluZyB0byByZWFkIGluIGNlcnRpZmljYXRlcyBmcm9tIE5VTEwgcG9pbnRlcnMgYW5kIGlnbm9yaW5nCiAgICAgYW55IGVycm9yczogdGhpcyBpcyBvbmUgcmVhc29uIHdoeSB0aGUgY2VydCBhbmQgQ1JMIHJlYWRlciBzZWVtZWQKICAgICB0byB3b3JrLiBJdCBkb2Vzbid0IGNoZWNrIHJldHVybiBjb2RlcyBmcm9tIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlCiAgICAgcm91dGluZXM6IHRoZXNlIG1heSB3ZWxsIGZhaWwgaWYgdGhlIGNlcnRpZmljYXRlcyBhcmVuJ3QgaW5zdGFsbGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvZGUgdG8gc3VwcG9ydCBvdGhlck5hbWUgb3B0aW9uIGluIEdlbmVyYWxOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpcnN0IHVwZGF0ZSB0byB2ZXJpZnkgY29kZS4gQ2hhbmdlIHRoZSB2ZXJpZnkgdXRpbGl0eQogICAgIHNvIGl0IHdhcm5zIGlmIGl0IGlzIHBhc3NlZCBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlOgogICAgIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBub3JtYWwgYmVoYXZpb3VyLiBYNTA5X3ZlcmlmeQogICAgIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGl0IHdpbGwgbm93IHZlcmlmeSBhIHNlbGYgc2lnbmVkCiAgICAgY2VydGlmaWNhdGUgaWYgKmV4YWN0bHkqIHRoZSBzYW1lIGNlcnRpZmljYXRlIGFwcGVhcnMKICAgICBpbiB0aGUgc3RvcmU6IGl0IHdhcyBwcmV2aW91c2x5IGltcG9zc2libGUgdG8gdHJ1c3QgYQogICAgIHNpbmdsZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZS4gVGhpcyBtZWFucyB0aGF0OgogICAgIG9wZW5zc2wgdmVyaWZ5IHNzLnBlbQogICAgIG5vdyBnaXZlcyBhIHdhcm5pbmcgYWJvdXQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBidXQKICAgICBvcGVuc3NsIHZlcmlmeSAtQ0FmaWxlIHNzLnBlbSBzcy5wZW0KICAgICBpcyBPSy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3Igc2VydmVycywgc3RvcmUgdmVyaWZ5X3Jlc3VsdCBpbiBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZQogICAgIChhbmQgYWRkIGl0IHRvIGV4dGVybmFsIHNlc3Npb24gcmVwcmVzZW50YXRpb24pLgogICAgIFRoaXMgaXMgbmVlZGVkIHdoZW4gY2xpZW50IGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbnMgZmFpbHMsCiAgICAgYnV0IGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHZlcmlmaWNhdGlvbiBjYWxsYmFjayAoc2V0IGJ5CiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2spIGFsbG93cyBhY2NlcHRpbmcgdGhlIHNlc3Npb24KICAgICBhbnl3YXkgKGkuZS4gbGVhdmVzIHg1MDlfc3RvcmVfY3R4LT5lcnJvciAhPSBYNTA5X1ZfT0sKICAgICBidXQgcmV0dXJucyAxKTogV2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQsIHdlIGhhdmUgdG8gc2V0CiAgICAgc3NsLT52ZXJpZnlfcmVzdWx0IHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIHRvIGF2b2lkCiAgICAgc2VjdXJpdHkgaG9sZXMuCiAgICAgW0JvZG8gTW9lbGxlciwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYSBidWcgaW4gdGhlIG5ldyBQS0NTIzcgY29kZTogaXQgZGlkbid0IGNvbnNpZGVyIHRoZQogICAgIGNhc2UgaW4gUEtDUzdfZGF0YUluaXQoKSB3aGVyZSB0aGUgc2lnbmVkIFBLQ1M3IHN0cnVjdHVyZQogICAgIGRpZG4ndCBjb250YWluIGFueSBleGlzdGluZyBkYXRhIGJlY2F1c2UgaXQgd2FzIGJlaW5nIGNyZWF0ZWQuCiAgICAgW1BvLUNoZW5nIENoZW4gPHBvY2hlbmdAbnN0LmNvbS50dz4sIHNsaWdodGx5IG1vZGlmaWVkIGJ5IFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc2FsdCB0byB0aGUga2V5IGRlcml2YXRpb24gcm91dGluZXMgaW4gZW5jLmMuIFRoaXMKICAgICBmb3JtcyB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGZpbGUuIEFsc28gYWRkIGEKICAgICAtUyBvcHRpb24gdG8gYWxsb3cgYSBzYWx0IHRvIGJlIGlucHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfY21wKCkuIE9kZGx5IGVub3VnaCB0aGVyZSB3YXNuJ3QgYSBmdW5jdGlvbgogICAgIHRvIGNvbXBhcmUgdHdvIGNlcnRpZmljYXRlcy4gV2UgZG8gdGhpcyBieSB3b3JraW5nIG91dCB0aGUgU0hBMQogICAgIGhhc2ggYW5kIGNvbXBhcmluZyB0aGF0LiBYNTA5X2NtcCgpIHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSB0cnVzdAogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMX2dldDFfc2Vzc2lvbigpIGlzIGxpa2UgU1NMX2dldF9zZXNzaW9uKCksIGJ1dCBpbmNyZW1lbnRzCiAgICAgdGhlIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgU1NMX1NFU1NJT04gcmV0dXJuZWQuCiAgICAgW0dlb2ZmIFRob3JwZSA8Z2VvZmZAZXUuYzIubmV0Pl0KCiAgKikgRml4IGZvciAncmVxJzogaXQgd2FzIGFkZGluZyBhIG51bGwgdG8gcmVxdWVzdCBhdHRyaWJ1dGVzLgogICAgIEFsc28gY2hhbmdlIHRoZSBYNTA5X0xPT0tVUCBhbmQgWDUwOV9JTkZPIGNvZGUgdG8gaGFuZGxlCiAgICAgY2VydGlmaWNhdGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciA0MCBhbmQgNjQgYml0IFJDMiBhbmQgUkM0IGFsZ29yaXRobXM6IGRvY3VtZW50CiAgICAgdGhlICdlbmMnIGNvbW1hbmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgZXh0cmEgaW5mb3JtYXRpb24gdG8gdGhlIG1lbW9yeSBsZWFrCiAgICAgZGV0ZWN0aW5nIG91dHB1dCwgdG8gZm9ybSB0cmFjZWJhY2tzLCBzaG93aW5nIGZyb20gd2hlcmUgZWFjaAogICAgIGFsbG9jYXRpb24gd2FzIG9yaWdpbmF0ZWQ6IENSWVBUT19wdXNoX2luZm8oImNvbnN0YW50IHN0cmluZyIpIGFkZHMKICAgICB0aGUgc3RyaW5nIHBsdXMgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvIGEgcGVyLXRocmVhZAogICAgIHN0YWNrLCBDUllQVE9fcG9wX2luZm8oKSBkb2VzIHRoZSBvYnZpb3VzLCBDUllQVE9fcmVtb3ZlX2FsbF9pbmZvKCkKICAgICBpcyBsaWtlIGNhbGxpbmcgQ1lSUFRPX3BvcF9pbmZvKCkgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LgogICAgIEFsc28gdXBkYXRlZCBtZW1vcnkgbGVhayBkZXRlY3Rpb24gY29kZSB0byBiZSBtdWx0aS10aHJlYWQtc2FmZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgb3B0aW9ucyAtdGV4dCBhbmQgLW5vb3V0IHRvIHBrY3M3IHV0aWxpdHkgYW5kIGRlbGV0ZSB0aGUKICAgICBlbmNyeXB0aW9uIG9wdGlvbnMgd2hpY2ggbmV2ZXIgZGlkIGFueXRoaW5nLiBVcGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9ucyB0byBzb21lIG9mIHRoZSB1dGlsaXRpZXMgdG8gYWxsb3cgdGhlIHBhc3MgcGhyYXNlCiAgICAgdG8gYmUgaW5jbHVkZWQgb24gZWl0aGVyIHRoZSBjb21tYW5kIGxpbmUgKG5vdCByZWNvbW1lbmRlZCBvbgogICAgIE9TZXMgbGlrZSBVbml4KSBvciByZWFkIGZyb20gdGhlIGVudmlyb25tZW50LiBVcGRhdGUgdGhlCiAgICAgbWFucGFnZXMgYW5kIGZpeCBhIGZldyBidWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZldyBtYW5wYWdlcyBmb3Igc29tZSBvZiB0aGUgb3BlbnNzbCBjb21tYW5kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIC1yZXZva2Ugb3B0aW9uIGluIGNhLiBJdCB3YXMgZnJlZWluZyB1cCBtZW1vcnkgdHdpY2UsCiAgICAgbGVha2luZyBhbmQgbm90IGZpbmRpbmcgYWxyZWFkeSByZXZva2VkIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbnNpdmUgY2hhbmdlcyB0byBzdXBwb3J0IGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBUaGlzIGludm9sdmVzIHRoZSB1c2Ugb2YgWDUwOV9DRVJUX0FVWCBzdHJ1Y3R1cmUgYW5kIFg1MDlfQVVYCiAgICAgZnVuY3Rpb25zLiBBbiBYNTA5X0FVWCBmdW5jdGlvbiBzdWNoIGFzIFBFTV9yZWFkX1g1MDlfQVVYKCkKICAgICBjYW4gc3RpbGwgcmVhZCBpbiBhIGNlcnRpZmljYXRlIGZpbGUgaW4gdGhlIHVzdWFsIHdheSBidXQgaXQKICAgICB3aWxsIGFsc28gcmVhZCBpbiBhbnkgYWRkaXRpb25hbCAiYXV4aWxpYXJ5IGluZm9ybWF0aW9uIi4gQnkKICAgICBkb2luZyB0aGluZ3MgdGhpcyB3YXkgYSBmYWlyIGRlZ3JlZSBvZiBjb21wYXRpYmlsaXR5IGNhbiBiZQogICAgIHJldGFpbmVkOiBleGlzdGluZyBjZXJ0aWZpY2F0ZXMgY2FuIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiBhZGRlZAogICAgIHVzaW5nIHRoZSBuZXcgJ3g1MDknIG9wdGlvbnMuIAoKICAgICBDdXJyZW50IGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhbiAiYWxpYXMiIGFuZCBzb21lIHRydXN0CiAgICAgc2V0dGluZ3MuIFRoZSB0cnVzdCBzZXR0aW5ncyB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBpbiBlbmhhbmNlZAogICAgIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmaWNhdGlvbiByb3V0aW5lczogY3VycmVudGx5IGEgY2VydGlmaWNhdGUKICAgICBjYW4gb25seSBiZSB0cnVzdGVkIGlmIGl0IGlzIHNlbGYgc2lnbmVkIGFuZCB0aGVuIGl0IGlzIHRydXN0ZWQKICAgICBmb3IgYWxsIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhc3NlbWJsZXIgZm9yIEFscGhhICh0ZXN0ZWQgb25seSBvbiBERUMgT1NGIG5vdCBMaW51eCBvciAqQlNEKS4KICAgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbmUgb2YgdGhlIHJlcGxhY2VtZW50IHJvdXRpbmVzIGhhZCBub3QgYmVlbiB3b3JraW5nCiAgICAgc2luY2UgU1NMZWF5IHJlbGVhc2VzLiAgRm9yIG5vdyB0aGUgb2ZmZW5kaW5nIHJvdXRpbmUgaGFzIGJlZW4gcmVwbGFjZWQKICAgICB3aXRoIG5vbi1vcHRpbWlzZWQgYXNzZW1ibGVyLiAgRXZlbiBzbywgdGhpcyBub3cgZ2l2ZXMgYXJvdW5kIDk1JQogICAgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciAxMDI0IGJpdCBSU0Egc2lnbnMuCiAgICAgW01hcmsgQ294XQoKICAqKSBIYWNrIHRvIGZpeCBQS0NTIzcgZGVjcnlwdGlvbiB3aGVuIHVzZWQgd2l0aCBzb21lIHVub3J0aG9kb3ggUkMyIAogICAgIGhhbmRsaW5nLiBNb3N0IGNsaWVudHMgaGF2ZSB0aGUgZWZmZWN0aXZlIGtleSBzaXplIGluIGJpdHMgZXF1YWwgdG8KICAgICB0aGUga2V5IGxlbmd0aCBpbiBiaXRzOiBzbyBhIDQwIGJpdCBSQzIga2V5IHVzZXMgYSA0MCBiaXQgKDUgYnl0ZSkga2V5LgogICAgIEEgZmV3IGhvd2V2ZXIgZG9uJ3QgZG8gdGhpcyBhbmQgaW5zdGVhZCB1c2UgdGhlIHNpemUgb2YgdGhlIGRlY3J5cHRlZCBrZXkKICAgICB0byBkZXRlcm1pbmUgdGhlIFJDMiBrZXkgbGVuZ3RoIGFuZCB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciB0byBkZXRlcm1pbmUKICAgICB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGguIEluIHRoaXMgY2FzZSB0aGUgZWZmZWN0aXZlIGtleSBsZW5ndGggY2FuIHN0aWxsCiAgICAgYmUgNDAgYml0cyBidXQgdGhlIGtleSBsZW5ndGggY2FuIGJlIDE2OCBiaXRzIGZvciBleGFtcGxlLiBUaGlzIGlzIGZpeGVkCiAgICAgYnkgbWFudWFsbHkgZm9yY2luZyBhbiBSQzIga2V5IGludG8gdGhlIEVWUF9QS0VZIHN0cnVjdHVyZSBiZWNhdXNlIHRoZQogICAgIEVWUCBjb2RlIGNhbid0IGN1cnJlbnRseSBoYW5kbGUgdW51c3VhbCBSQzIga2V5IHNpemVzOiBpdCBhbHdheXMgYXNzdW1lcwogICAgIHRoZSBrZXkgbGVuZ3RoIGFuZCBlZmZlY3RpdmUga2V5IGxlbmd0aCBhcmUgZXF1YWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiAKICAgICBYNTA5X05BTUUgc3RydWN0dXJlcy4gTm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbzoKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgIkNOIiwgTUJTVFJJTkdfQVNDLCAiU3RldmUiLCAtMSwgLTEsIDApOwogICAgIGFuZCBoYXZlIGl0IGF1dG9tYXRpY2FsbHkgd29yayBvdXQgdGhlIGNvcnJlY3QgZmllbGQgdHlwZSBhbmQgZmlsbCBpbgogICAgIHRoZSBzdHJ1Y3R1cmVzLiBUaGUgbW9yZSBhZHZlbnR1cm91cyBjYW4gdHJ5OgogICAgIFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLCBmaWVsZCwgTUJTVFJJTkdfVVRGOCwgc3RyLCAtMSwgLTEsIDApOwogICAgIGFuZCBpdCB3aWxsIChob3BlZnVsbHkpIHdvcmsgb3V0IHRoZSBjb3JyZWN0IG11bHRpYnl0ZSBlbmNvZGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlICdyZXEnIHV0aWxpdHkgdG8gdXNlIHRoZSBuZXcgZmllbGQgaGFuZGxpbmcgYW5kIG11bHRpYnl0ZQogICAgIGNvcHkgcm91dGluZXMuIEJlZm9yZSB0aGUgRE4gZmllbGQgY3JlYXRpb24gd2FzIGhhbmRsZWQgaW4gYW4gYWQgaG9jCiAgICAgd2F5IGluIHJlcSwgY2EsIGFuZCB4NTA5IHdoaWNoIHdhcyByYXRoZXIgYnJva2VuIGFuZCBkaWRuJ3Qgc3VwcG9ydAogICAgIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MuIFNpbmNlIHNvbWUgc29mdHdhcmUgZG9lc24ndCBpbXBsZW1lbnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzIHlldCwgdGhleSBjYW4gYmUgZW5hYmxlZCB1c2luZyB0aGUgY29uZmlnIGZpbGUKICAgICB1c2luZyB0aGUgZGlyc3RyaW5nX3R5cGUgb3B0aW9uLiBTZWUgdGhlIG5ldyBjb21tZW50IGluIHRoZSBkZWZhdWx0CiAgICAgb3BlbnNzbC5jbmYgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGNyeXB0by9yYW5kL21kX3JhbmQuYyBtb3JlIHJvYnVzdDoKICAgICAtIEFzc3VyZSB1bmlxdWUgcmFuZG9tIG51bWJlcnMgYWZ0ZXIgZm9yaygpLgogICAgIC0gTWFrZSBzdXJlIHRoYXQgY29uY3VycmVudCB0aHJlYWRzIGFjY2VzcyB0aGUgZ2xvYmFsIGNvdW50ZXIgYW5kCiAgICAgICBtZCBzZXJpYWxpemFibHkgc28gdGhhdCB3ZSBuZXZlciBsb3NlIGVudHJvcHkgaW4gdGhlbQogICAgICAgb3IgdXNlIGV4YWN0bHkgdGhlIHNhbWUgc3RhdGUgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICAgIEFjY2VzcyB0byB0aGUgbGFyZ2Ugc3RhdGUgaXMgbm90IGFsd2F5cyBzZXJpYWxpemFibGUgYmVjYXVzZQogICAgICAgdGhlIGFkZGl0aW9uYWwgbG9ja2luZyBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGtpbGxlciwgYW5kCiAgICAgICBtZCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGFueXdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZmlsZSBhcHBzL2FwcF9yYW5kLmMgd2l0aCBjb21tb25seSBuZWVkZWQgZnVuY3Rpb25hbGl0eQogICAgIGZvciBoYW5kbGluZyB0aGUgcmFuZG9tIHNlZWQgZmlsZS4KCiAgICAgVXNlIHRoZSByYW5kb20gc2VlZCBmaWxlIGluIHNvbWUgYXBwbGljYXRpb25zIHRoYXQgcHJldmlvdXNseSBkaWQgbm90OgogICAgICAgICAgY2EsCiAgICAgICAgICBkc2FwYXJhbSAtZ2Vua2V5ICh3aGljaCBhbHNvIGlnbm9yZWQgaXRzICctcmFuZCcgb3B0aW9uKSwgCiAgICAgICAgICBzX2NsaWVudCwKICAgICAgICAgIHNfc2VydmVyLAogICAgICAgICAgeDUwOSAod2hlbiBzaWduaW5nKS4KICAgICBFeGNlcHQgb24gc3lzdGVtcyB3aXRoIC9kZXYvdXJhbmRvbSwgaXQgaXMgY3J1Y2lhbCB0byBoYXZlIGEgcmFuZG9tCiAgICAgc2VlZCBmaWxlIGF0IGxlYXN0IGZvciBrZXkgY3JlYXRpb24sIERTQSBzaWduaW5nLCBhbmQgZm9yIERIIGV4Y2hhbmdlczsKICAgICBmb3IgUlNBIHNpZ25hdHVyZXMgd2UgY291bGQgZG8gd2l0aG91dCBvbmUuCgogICAgIGdlbmRoIGFuZCBnZW5kc2EgKHVubGlrZSBnZW5yc2EpIHVzZWQgdG8gcmVhZCBvbmx5IHRoZSBmaXJzdCBieXRlCiAgICAgb2YgZWFjaCBmaWxlIGxpc3RlZCBpbiB0aGUgJy1yYW5kJyBvcHRpb24uICBUaGUgZnVuY3Rpb24gYXMgcHJldmlvdXNseQogICAgIGZvdW5kIGluIGdlbnJzYSBpcyBub3cgaW4gYXBwX3JhbmQuYyBhbmQgaXMgdXNlZCBieSBhbGwgcHJvZ3JhbXMKICAgICB0aGF0IHN1cHBvcnQgJy1yYW5kJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBSQU5EX3dyaXRlX2ZpbGUsIHVzZSBtb2RlIDA2MDAgZm9yIGNyZWF0aW5nIGZpbGVzOwogICAgIGRvbid0IGp1c3QgY2htb2Qgd2hlbiBpdCBtYXkgYmUgdG9vIGxhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVwb3J0IGFuIGVycm9yIGZyb20gWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucwogICAgIHdoZW4gWDUwOV9MT09LVVBfbG9hZF9maWxlIG9yIFg1MDlfTE9PS1VQX2FkZF9kaXIgZmFpbGVkLgogICAgIFtCaWxsIFBlcnJ5XQoKICAqKSBOZXcgZnVuY3Rpb24gQVNOMV9tYnN0cmluZ19jb3B5KCkgdGhpcyBjb3BpZXMgYSBzdHJpbmcgaW4gZWl0aGVyCiAgICAgQVNDSUksIFVuaWNvZGUsIFVuaXZlcnNhbCAoNCBieXRlcyBwZXIgY2hhcmFjdGVyKSBvciBVVEY4IGZvcm1hdAogICAgIGludG8gYW4gQVNOMV9TVFJJTkcgdHlwZS4gQSBtYXNrIG9mIHBlcm1pc3NpYmxlIHR5cGVzIGlzIHBhc3NlZAogICAgIGFuZCBpdCBjaG9vc2VzIHRoZSAibWluaW1hbCIgdHlwZSB0byB1c2Ugb3IgYW4gZXJyb3IgaWYgbm90IHR5cGUKICAgICBpcyBzdWl0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb24gZXF1aXZhbGVudHMgdG8gdGhlIHZhcmlvdXMgbWFjcm9zIGluIGFzbjEuaC4gVGhlIG9sZAogICAgIG1hY3JvcyBhcmUgcmV0YWluZWQgd2l0aCBhbiBNXyBwcmVmaXguIENvZGUgaW5zaWRlIHRoZSBsaWJyYXJ5IGNhbgogICAgIHVzZSB0aGUgTV8gbWFjcm9zLiBFeHRlcm5hbCBjb2RlIChpbmNsdWRpbmcgdGhlIG9wZW5zc2wgdXRpbGl0eSkKICAgICBzaG91bGQgKk5PVCogaW4gb3JkZXIgdG8gYmUgInNoYXJlZCBsaWJyYXJ5IGZyaWVuZGx5Ii4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCBjYW4gY2hlY2sgYSBjZXJ0aWZpY2F0ZSdzIGV4dGVuc2lvbnMKICAgICB0byBzZWUgaWYgaXQgdXNhYmxlIGZvciB2YXJpb3VzIHB1cnBvc2VzIHN1Y2ggYXMgU1NMIGNsaWVudCwKICAgICBzZXJ2ZXIgb3IgUy9NSU1FIGFuZCBDQXMgb2YgdGhlc2UgdHlwZXMuIFRoaXMgaXMgY3VycmVudGx5IAogICAgIFZFUlkgRVhQRVJJTUVOVEFMIGJ1dCB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBmb3IgY2VydGlmaWNhdGUgY2hhaW4KICAgICB2ZXJpZmljYXRpb24uIEFsc28gYWRkZWQgYSAtcHVycG9zZSBmbGFnIHRvIHg1MDkgdXRpbGl0eSB0bwogICAgIHByaW50IG91dCBhbGwgdGhlIHB1cnBvc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIENSWVBUT19FWF9EQVRBIHRvIFg1MDkgY2VydGlmaWNhdGUgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBYNTA5VjNfe1g1MDksQ1JMLFJFVk9LRUR9X2dldF9kMmkoKSBmdW5jdGlvbnMuIFRoZXNlIHdpbGwgc2VhcmNoCiAgICAgZm9yLCBvYnRhaW4gYW5kIGRlY29kZSBhbmQgZXh0ZW5zaW9uIGFuZCBvYnRhaW4gaXRzIGNyaXRpY2FsIGZsYWcuCiAgICAgVGhpcyBhbGxvd3MgYWxsIHRoZSBuZWNlc3NhcnkgZXh0ZW5zaW9uIGNvZGUgdG8gYmUgaGFuZGxlZCBpbiBhCiAgICAgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUkM0IHR1bmUtdXAgZmVhdHVyaW5nIDMwLTQwJSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvbiBtb3N0IFJJU0MKICAgICBwbGF0Zm9ybXMuIFNlZSBjcnlwdG8vcmM0L3JjNF9lbmMuYyBmb3IgZnVydGhlciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBOZXcgLW5vb3V0IG9wdGlvbiB0byBhc24xcGFyc2UuIFRoaXMgY2F1c2VzIG5vIG91dHB1dCB0byBiZSBwcm9kdWNlZAogICAgIGl0cyBtYWluIHVzZSBpcyB3aGVuIGNvbWJpbmVkIHdpdGggLXN0cnBhcnNlIGFuZCAtb3V0IHRvIGV4dHJhY3QgZGF0YQogICAgIGZyb20gYSBmaWxlICh3aGljaCBtYXkgbm90IGJlIGluIEFTTi4xIGZvcm1hdCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBwa2NzMTIgcHJvZ3JhbS4gSXQgd2FzIGhhc2hpbmcgYW4gaW52YWxpZCBjZXJ0aWZpY2F0ZSBwb2ludGVyCiAgICAgd2hlbiBwcm9kdWNpbmcgdGhlIGxvY2FsIGtleSBpZC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgTmV3IG9wdGlvbiAtZGhwYXJhbSBpbiBzX3NlcnZlci4gVGhpcyBhbGxvd3MgYSBESCBwYXJhbWV0ZXIgZmlsZSB0byBiZQogICAgIHN0YXRlZCBleHBsaWNpdGx5LiBJZiBpdCBpcyBub3Qgc3RhdGVkIHRoZW4gaXQgdHJpZXMgdGhlIGZpcnN0IHNlcnZlcgogICAgIGNlcnRpZmljYXRlIGZpbGUuIFRoZSBwcmV2aW91cyBiZWhhdmlvdXIgaGFyZCBjb2RlZCB0aGUgZmlsZW5hbWUKICAgICAic2VydmVyLnBlbSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1wdWJpbiBhbmQgLXB1Ym91dCBvcHRpb25zIHRvIHRoZSByc2EgYW5kIGRzYSBjb21tYW5kcy4gVGhlc2UgYWxsb3cKICAgICBhIHB1YmxpYyBrZXkgdG8gYmUgaW5wdXQgb3Igb3V0cHV0LiBGb3IgZXhhbXBsZToKICAgICBvcGVuc3NsIHJzYSAtaW4ga2V5LnBlbSAtcHVib3V0IC1vdXQgcHVia2V5LnBlbQogICAgIEFsc28gYWRkZWQgbmVjZXNzYXJ5IERTQSBwdWJsaWMga2V5IGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggc28gUEtDUzdfZGF0YVZlcmlmeSgpIGRvZXNuJ3QgY3Jhc2ggaWYgbm8gY2VydGlmaWNhdGVzIGFyZSBjb250YWluZWQKICAgICBpbiB0aGUgbWVzc2FnZS4gVGhpcyB3YXMgaGFuZGxlZCBieSBhbGxvd2luZwogICAgIFg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbCgpIHRvIHRvbGVyYXRlIGEgTlVMTCBwYXNzZWQgdG8gaXQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgU2FtcG8gS2VsbG9tYWtpIDxzYW1wb0BtYWlsLm5ldXJvbmlvLnB0Pl0KCiAgKikgRml4IGZvciBidWcgaW4gZDJpX0FTTjFfYnl0ZXMoKTogb3RoZXIgQVNOMSBmdW5jdGlvbnMgYWRkIGFuIGV4dHJhIG51bGwKICAgICB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmdzIHdoZXJlYXMgdGhpcyBkaWRuJ3QuIFRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMKICAgICBpZiBzdHJpbmdzIHJlYWQgd2l0aCBkMmlfQVNOMV9ieXRlcygpIHdlcmUgbGF0ZXIgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IGZvciBiYXNlNjQgZGVjb2RlIGJ1Zy4gV2hlbiBhIGJhc2U2NCBiaW8gcmVhZHMgb25seSBvbmUgbGluZSBvZgogICAgIGRhdGEgYW5kIGl0IGNvbnRhaW5zIEVPRiBpdCB3aWxsIGVuZCB1cCByZXR1cm5pbmcgYW4gZXJyb3IuIFRoaXMgaXMKICAgICBjYXVzZWQgYnkgaW5wdXQgNDYgYnl0ZXMgbG9uZy4gVGhlIGNhdXNlIGlzIGR1ZSB0byB0aGUgd2F5IGJhc2U2NAogICAgIEJJT3MgZmluZCB0aGUgc3RhcnQgb2YgYmFzZTY0IGVuY29kZWQgZGF0YS4gVGhleSBkbyB0aGlzIGJ5IHRyeWluZyBhCiAgICAgdHJpYWwgZGVjb2RlIG9uIGVhY2ggbGluZSB1bnRpbCB0aGV5IGZpbmQgb25lIHRoYXQgd29ya3MuIFdoZW4gdGhleQogICAgIGRvIGEgZmxhZyBpcyBzZXQgYW5kIGl0IHN0YXJ0cyBhZ2FpbiBrbm93aW5nIGl0IGNhbiBwYXNzIGFsbCB0aGUKICAgICBkYXRhIGRpcmVjdGx5IHRocm91Z2ggdGhlIGRlY29kZXIuIFVuZm9ydHVuYXRlbHkgaXQgZG9lc24ndCByZXNldAogICAgIHRoZSBjb250ZXh0IGl0IHVzZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiBFT0YgaXMgcmVhY2hlZCBhbiBhdHRlbXB0CiAgICAgaXMgbWFkZSB0byBwYXNzIHR3byBFT0ZzIHRocm91Z2ggdGhlIGNvbnRleHQgYW5kIHRoaXMgY2F1c2VzIHRoZQogICAgIHJlc3VsdGluZyBlcnJvci4gVGhpcyBjYW4gYWxzbyBjYXVzZSBvdGhlciBwcm9ibGVtcyBhcyB3ZWxsLiBBcyBpcwogICAgIHVzdWFsIHdpdGggdGhlc2UgcHJvYmxlbXMgaXQgdGFrZXMgKmFnZXMqIHRvIGZpbmQgYW5kIHRoZSBmaXggaXMKICAgICB0cml2aWFsOiBtb3ZlIG9uZSBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IGlhbkB1bnMubnMuYWMueXUgKEl2YW4gTmVqZ2ViYXVlcikgXQoKICAqKSBVZ2x5IHdvcmthcm91bmQgdG8gZ2V0IHNfY2xpZW50IGFuZCBzX3NlcnZlciB3b3JraW5nIHVuZGVyIFdpbmRvd3MuIFRoZQogICAgIG9sZCBjb2RlIHdvdWxkbid0IHdvcmsgYmVjYXVzZSBpdCBuZWVkZWQgdG8gc2VsZWN0KCkgb24gc29ja2V0cyBhbmQgdGhlCiAgICAgdHR5IChmb3Iga2V5cHJlc3NlcyBhbmQgdG8gc2VlIGlmIGRhdGEgY291bGQgYmUgd3JpdHRlbikuIFdpbjMyIG9ubHkKICAgICBzdXBwb3J0cyBzZWxlY3QoKSBvbiBzb2NrZXRzIHNvIHdlIHNlbGVjdCgpIHdpdGggYSAxcyB0aW1lb3V0IG9uIHRoZQogICAgIHNvY2tldHMgYW5kIHRoZW4gc2VlIGlmIGFueSBjaGFyYWN0ZXJzIGFyZSB3YWl0aW5nIHRvIGJlIHJlYWQsIGlmIG5vbmUKICAgICBhcmUgcHJlc2VudCB0aGVuIHdlIHJldHJ5LCB3ZSBhbHNvIGFzc3VtZSB3ZSBjYW4gYWx3YXlzIHdyaXRlIGRhdGEgdG8KICAgICB0aGUgdHR5LiBUaGlzIGlzbid0IG5pY2UgYmVjYXVzZSB0aGUgY29kZSB0aGVuIGJsb2NrcyB1bnRpbCB3ZSd2ZQogICAgIHJlY2VpdmVkIGEgY29tcGxldGUgbGluZSBvZiBkYXRhIGFuZCBpdCBpcyBlZmZlY3RpdmVseSBwb2xsaW5nIHRoZQogICAgIGtleWJvYXJkIGF0IDFzIGludGVydmFsczogaG93ZXZlciBpdCdzIHF1aXRlIGEgYml0IGJldHRlciB0aGFuIG5vdAogICAgIHdvcmtpbmcgYXQgYWxsIDotKSBBIGRlZGljYXRlZCBXaW5kb3dzIGFwcGxpY2F0aW9uIG1pZ2h0IGhhbmRsZSB0aGlzCiAgICAgd2l0aCBhbiBldmVudCBsb29wIGZvciBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuIE5vdyB0aGVyZSBhcmUgdHdvIGV4dHJhIG1ldGhvZHMsIHJzYV9zaWduCiAgICAgYW5kIHJzYV92ZXJpZnkuIFdoZW4gdGhlIFJTQV9GTEFHU19TSUdOX1ZFUiBvcHRpb24gaXMgc2V0IHRoZXNlIGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIGFyZSB1c2VkLiBUaGlzIGlzIHVzZWZ1bAogICAgIGlmIHJzYV9wdWJfZGVjKCkgYW5kIHJzYV9wcml2X2VuYygpIGVxdWl2YWxlbnRzIGFyZSBub3QgYXZhaWxhYmxlLgogICAgIEZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKQogICAgIHNob3VsZCAqbm90KiBiZSB1c2VkOiBSU0Ffc2lnbigpIGFuZCBSU0FfdmVyaWZ5KCkgbXVzdCBiZSB1c2VkIGluc3RlYWQuCiAgICAgVGhpcyBuZWNlc3NpdGF0ZWQgdGhlIHN1cHBvcnQgb2YgYW4gZXh0cmEgc2lnbmF0dXJlIHR5cGUgTklEX21kNV9zaGExCiAgICAgZm9yIFNTTCBzaWduYXR1cmVzIGFuZCBtb2RpZmljYXRpb25zIHRvIHRoZSBTU0wgbGlicmFyeSB0byB1c2UgaXQgaW5zdGVhZAogICAgIG9mIGNhbGxpbmcgUlNBX3B1YmxpY19kZWNyeXB0KCkgYW5kIFJTQV9wcml2YXRlX2VuY3J5cHQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC12ZXJpZnkgLUNBZmlsZSBhbmQgLUNBcGF0aCBvcHRpb25zIHRvIHRoZSBjcmwgcHJvZ3JhbSwgdGhlc2UKICAgICB3aWxsIGxvb2t1cCBhIENSTCBpc3N1ZXJzIGNlcnRpZmljYXRlIGFuZCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpbiBhCiAgICAgc2ltaWxhciB3YXkgdG8gdGhlIHZlcmlmeSBwcm9ncmFtLiBUaWR5IHVwIHRoZSBjcmwgcHJvZ3JhbSBzbyBpdAogICAgIG5vIGxvbmdlciBhY2Nlc3NlcyBzdHJ1Y3R1cmVzIGRpcmVjdGx5LiBNYWtlIHRoZSBBU04xIENSTCBwYXJzaW5nIGEgYml0CiAgICAgbGVzcyBzdHJpY3QuIEl0IHdpbGwgbm93IHBlcm1pdCBDUkwgZXh0ZW5zaW9ucyBldmVuIGlmIGl0IGlzIG5vdAogICAgIGEgVjIgQ1JMOiB0aGlzIHdpbGwgYWxsb3cgaXQgdG8gdG9sZXJhdGUgc29tZSBicm9rZW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsaXplIGFsbCBub24tYXV0b21hdGljIHZhcmlhYmxlcyBlYWNoIHRpbWUgb25lIG9mIHRoZSBvcGVuc3NsCiAgICAgc3ViLXByb2dyYW1zIGlzIHN0YXJ0ZWQgKHRoaXMgaXMgbmVjZXNzYXJ5IGFzIHRoZXkgbWF5IGJlIHN0YXJ0ZWQKICAgICBtdWx0aXBsZSB0aW1lcyBmcm9tIHRoZSAiT3BlblNTTD4iIHByb21wdCkuCiAgICAgW0xlbm5hcnQgQmFuZywgQm9kbyBNb2VsbGVyXQoKICAqKSBQcmVsaW1pbmFyeSBjb21waWxhdGlvbiBvcHRpb24gUlNBX05VTEwgd2hpY2ggZGlzYWJsZXMgUlNBIGNyeXB0byB3aXRob3V0CiAgICAgcmVtb3ZpbmcgYWxsIG90aGVyIFJTQSBmdW5jdGlvbmFsaXR5ICh0aGlzIGlzIHdoYXQgTk9fUlNBIGRvZXMpLiBUaGlzCiAgICAgaXMgc28gKGZvciBleGFtcGxlKSB0aG9zZSBpbiB0aGUgVVMgY2FuIGRpc2FibGUgdGhvc2Ugb3BlcmF0aW9ucyBjb3ZlcmVkCiAgICAgYnkgdGhlIFJTQSBwYXRlbnQgd2hpbGUgYWxsb3dpbmcgc3RvcmFnZSBhbmQgcGFyc2luZyBvZiBSU0Ega2V5cyBhbmQgUlNBCiAgICAga2V5IGdlbmVyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTm9uLWNvcHlpbmcgaW50ZXJmYWNlIHRvIEJJTyBwYWlycy4KICAgICAoc3RpbGwgbGFyZ2VseSB1bnRlc3RlZCkKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQU5TMV90YWcyc3RyKCkgdG8gY29udmVydCBhbiBBU04xIHRhZyB0byBhIGRlc2NyaXB0aXZlCiAgICAgQVNDSUkgc3RyaW5nLiBUaGlzIHdhcyBoYW5kbGVkIGluZGVwZW5kZW50bHkgaW4gdmFyaW91cyBwbGFjZXMgYmVmb3JlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgVVRGOF9nZXRjKCkgYW5kIFVURjhfcHV0YygpIHRoYXQgcGFyc2UgYW5kIGdlbmVyYXRlCiAgICAgVVRGOCBzdHJpbmdzIGEgY2hhcmFjdGVyIGF0IGEgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgY2xpZW50X3ZlcnNpb24gZnJvbSBjbGllbnQgaGVsbG8gdG8gc2VsZWN0IHRoZSBwcm90b2NvbAogICAgIChzMjNfc3J2ci5jKSBhbmQgZm9yIFJTQSBjbGllbnQga2V5IGV4Y2hhbmdlIHZlcmlmaWNhdGlvbgogICAgIChzM19zcnZyLmMpLCBhcyByZXF1aXJlZCBieSB0aGUgU1NMIDMuMC9UTFMgMS4wIHNwZWNpZmljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTUEtBQ3MsIHRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgIGhhbmRsZWQgYnkgcG9raW5nIHJvdW5kIGluIHRoZSBzdHJ1Y3R1cmUgaW50ZXJuYWxzLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBORVRTQ0FQRV9TUEtJX3ByaW50KCkgdG8gcHJpbnQgb3V0IFNQS0FDIGFuZCBhIG5ldyB1dGlsaXR5ICdzcGthYycgdG8KICAgICBwcmludCwgdmVyaWZ5IGFuZCBnZW5lcmF0ZSBTUEtBQ3MuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbQogICAgIE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+IGJ1dCBleHRlbnNpdmVseSBtb2RpZmllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSSVBFTUQxNjAgaXMgb3BlcmF0aW9uYWwgb24gYWxsIHBsYXRmb3JtcyBhbmQgaXMgYmFjayBpbiAnbWFrZSB0ZXN0Jy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWxsb3cgdGhlIGNvbmZpZyBmaWxlIGV4dGVuc2lvbiBzZWN0aW9uIHRvIGJlIG92ZXJ3cml0dGVuIG9uIHRoZQogICAgIGNvbW1hbmQgbGluZS4gQmFzZWQgb24gYW4gb3JpZ2luYWwgaWRlYSBmcm9tIE1hc3NpbWlsaWFubyBQYWxhCiAgICAgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD4uIFRoZSBuZXcgb3B0aW9uIGlzIGNhbGxlZCAtZXh0ZW5zaW9ucwogICAgIGFuZCBjYW4gYmUgYXBwbGllZCB0byBjYSwgcmVxIGFuZCB4NTA5LiBBbHNvIC1yZXFleHRzIHRvIG92ZXJyaWRlCiAgICAgdGhlIHJlcXVlc3QgZXh0ZW5zaW9ucyBpbiByZXEgYW5kIC1jcmxleHRzIHRvIG92ZXJyaWRlIHRoZSBjcmwgZXh0ZW5zaW9ucwogICAgIGluIGNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZmVhdHVyZSB0byB0aGUgU1BLQUMgaGFuZGxpbmcgaW4gY2EuICBOb3cgeW91IGNhbiBpbmNsdWRlCiAgICAgdGhlIHNhbWUgZmllbGQgbXVsdGlwbGUgdGltZXMgYnkgcHJlY2VkaW5nIGl0IGJ5ICJYWFhYLiIgZm9yIGV4YW1wbGU6CiAgICAgMS5PVT0iVW5pdCBuYW1lIDEiCiAgICAgMi5PVT0iVW5pdCBuYW1lIDIiCiAgICAgdGhpcyBpcyB0aGUgc2FtZSBzeW50YXggYXMgdXNlZCBpbiB0aGUgcmVxIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgdG8gY2VydGlmaWNhdGUgcmVxdWVzdHMuIFRoZXNlCiAgICAgYXJlIHNwZWNpZmllZCBpbiBhICdyZXFfZXh0ZW5zaW9ucycgb3B0aW9uIG9mIHRoZSByZXEgc2VjdGlvbiBvZiB0aGUKICAgICBjb25maWcgZmlsZS4gVGhleSBjYW4gYmUgcHJpbnRlZCBvdXQgd2l0aCB0aGUgLXRleHQgb3B0aW9uIHRvIHJlcSBidXQKICAgICBhcmUgb3RoZXJ3aXNlIGlnbm9yZWQgYXQgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBob3JyaWJsZSBidWcgaW4gZW5jX3JlYWQoKSBpbiBjcnlwdG8vZXZwL2Jpb19lbmMuYzogaWYgdGhlIGZpcnN0CiAgICAgZGF0YSByZWFkIGNvbnNpc3RzIG9mIG9ubHkgdGhlIGZpbmFsIGJsb2NrIGl0IHdvdWxkIG5vdCBkZWNyeXB0ZWQgYmVjYXVzZQogICAgIEVWUF9DaXBoZXJVcGRhdGUoKSB3b3VsZCBjb3JyZWN0bHkgcmVwb3J0IHplcm8gYnl0ZXMgaGFkIGJlZW4gZGVjcnlwdGVkLgogICAgIEEgbWlzcGxhY2VkICdicmVhaycgYWxzbyBtZWFudCB0aGUgZGVjcnlwdGVkIGZpbmFsIGJsb2NrIG1pZ2h0IG5vdCBiZQogICAgIGNvcGllZCB1bnRpbCB0aGUgbmV4dCByZWFkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgREhfTUVUSE9ELiBBZ2FpbiBiYXNlZCBvbiBSU0FfTUVUSE9ELiBBbHNvIGFkZGVkCiAgICAgYSBmZXcgZXh0cmEgcGFyYW1ldGVycyB0byB0aGUgREggc3RydWN0dXJlOiB0aGVzZSB3aWxsIGJlIHVzZWZ1bCBpZgogICAgIGZvciBleGFtcGxlIHdlIHdhbnQgdGhlIHZhbHVlIG9mICdxJyBvciBpbXBsZW1lbnQgWDkuNDIgREguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBEU0FfTUVUSE9ELiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBSU0FfTUVUSE9EIGFuZAogICAgIHByb3ZpZGVzIGhvb2tzIHRoYXQgYWxsb3cgdGhlIGRlZmF1bHQgRFNBIGZ1bmN0aW9ucyBvciBmdW5jdGlvbnMgb24gYQogICAgICJwZXIga2V5IiBiYXNpcyB0byBiZSByZXBsYWNlZC4gVGhpcyBhbGxvd3MgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGFuZAogICAgIGhhcmR3YXJlIGtleSBzdG9yYWdlIHRvIGJlIGhhbmRsZWQgd2l0aG91dCBtYWpvciBtb2RpZmljYXRpb24gdG8gdGhlCiAgICAgbGlicmFyeS4gQWxzbyBhZGRlZCBsb3cgbGV2ZWwgbW9kZXhwIGhvb2tzIGFuZCBDUllQVE9fRVggc3RydWN0dXJlIGFuZCAKICAgICBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZmxhZyB0byBtZW1vcnkgQklPcywgQklPX0ZMQUdfTUVNX1JET05MWS4gVGhpcyBtYXJrcyB0aGUgQklPCiAgICAgYXMgInJlYWQgb25seSI6IGl0IGNhbid0IGJlIHdyaXR0ZW4gdG8gYW5kIHRoZSBidWZmZXIgaXQgcG9pbnRzIHRvIHdpbGwKICAgICBub3QgYmUgZnJlZWQuIFJlYWRpbmcgZnJvbSBhIHJlYWQgb25seSBCSU8gaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuCiAgICAgYSBub3JtYWwgbWVtb3J5IEJJTy4gVGhpcyB3YXMgYWRkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc2V2ZXJhbCB0aW1lcyB3aGVuCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIGEgQklPLiBUaGUgcHJldmlvdXMgbWV0aG9kIHdhcwogICAgIHRvIGNyZWF0ZSBhIG1lbW9yeSBCSU8gYW5kIHdyaXRlIHRoZSBkYXRhIHRvIGl0LCB0aGlzIHJlc3VsdHMgaW4gdHdvCiAgICAgY29waWVzIG9mIHRoZSBkYXRhIGFuZCBhbiBPKG5eMikgcmVhZGluZyBhbGdvcml0aG0uIFRoZXJlIGlzIGEgbmV3CiAgICAgZnVuY3Rpb24gQklPX25ld19tZW1fYnVmKCkgd2hpY2ggY3JlYXRlcyBhIHJlYWQgb25seSBtZW1vcnkgQklPIGZyb20KICAgICBhbiBhcmVhIG9mIG1lbW9yeS4gQWxzbyBtb2RpZmllZCB0aGUgUEtDUyM3IHJvdXRpbmVzIHRvIHVzZSByZWFkIG9ubHkKICAgICBtZW1vcnkgQklPcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWdmaXg6IHNzbDIzX2dldF9jbGllbnRfaGVsbG8gZGlkIG5vdCB3b3JrIHByb3Blcmx5IHdoZW4gY2FsbGVkIGluCiAgICAgc3RhdGUgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19CLCBpLmUuIHdoZW4gdGhlIGZpcnN0IDcgYnl0ZXMgb2YKICAgICBhIFNTTHYyLWNvbXBhdGlibGUgY2xpZW50IGhlbGxvIGZvciBTU0x2MyBvciBUTFN2MSBjb3VsZCBiZSByZWFkLAogICAgIGJ1dCBhIHJldHJ5IGNvbmRpdGlvbiBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSByZXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSBQS0NTN19FTkNfQ09OVEVOVF9uZXcoKSBmdW5jdGlvbiB3YXMgc2V0dGluZyB0aGUgY29udGVudCB0eXBlIGFzCiAgICAgTklEX3BrY3M3X2VuY3J5cHRlZCBieSBkZWZhdWx0OiB0aGlzIHdhcyB3cm9uZyBzaW5jZSB0aGlzIHNob3VsZCBhbG1vc3QKICAgICBhbHdheXMgYmUgTklEX3BrY3M3X2RhdGEuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1M3X3NldF90eXBlKCkgdG8gaGFuZGxlCiAgICAgdGhlIGVuY3J5cHRlZCBkYXRhIHR5cGU6IHRoaXMgaXMgYSBtb3JlIHNlbnNpYmxlIHBsYWNlIHRvIHB1dCBpdCBhbmQgaXQKICAgICBhbGxvd3MgdGhlIFBLQ1MjMTIgY29kZSB0byBiZSB0aWRpZWQgdXAgdGhhdCBkdXBsaWNhdGVkIHRoaXMKICAgICBmdW5jdGlvbmFsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZWQgb2JqX2RhdC5wbCBzY3JpcHQgc28gaXQgdGFrZXMgaXRzIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgb24KICAgICB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIHNob3VsZCBhdm9pZCBzaGVsbCBlc2NhcGUgcmVkaXJlY3Rpb24gcHJvYmxlbXMKICAgICB1bmRlciBXaW4zMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbiByZXF1ZXN0cywgdGhlc2UgYXJlIGluY2x1ZGVkCiAgICAgaW4gdGhpbmdzIGxpa2UgWGVucm9sbCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gSW5jbHVkZWQgZnVuY3Rpb25zIHRvIGFsbG93CiAgICAgZXh0ZW5zaW9ucyB0byBiZSBvYnRhaW5lZCBhbmQgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLWNybGYgb3B0aW9uIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlciBmb3Igc2VuZGluZyBuZXdsaW5lcyBhcwogICAgIENSTEYgKGFzIHJlcXVpcmVkIGJ5IG1hbnkgcHJvdG9jb2xzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuM2EgYW5kIDAuOS40ICBbMDkgQXVnIDE5OTldCiAgCiAgKikgSW5zdGFsbCBsaWJSU0FnbHVlLmEgd2hlbiBPcGVuU1NMIGlzIGJ1aWx0IHdpdGggUlNBcmVmLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIGZldyBtb3JlIGBgI2lmbmRlZiBOT19GUF9BUEkgLyAjZW5kaWYnJyBwYWlycyBmb3IgY29uc2lzdGVuY3kuCiAgICAgW0FuZHJpamEgQW50b25pamV2aWMgPFRoZUFudG9ueTJAYmlnZm9vdC5jb20+XQoKICAqKSBGaXggLXN0YXJ0ZGF0ZSBhbmQgLWVuZGRhdGUgKHdoaWNoIHdhcyBtaXNzaW5nKSBhcmd1bWVudHMgdG8gJ2NhJwogICAgIHByb2dyYW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIERTQV9kdXBfREgsIHdoaWNoIGR1cGxpY2F0ZXMgRFNBIHBhcmFtZXRlcnMva2V5cyBhcwogICAgIERIIHBhcmFtZXRlcnMva2V5cyAocSBpcyBsb3N0IGR1cmluZyB0aGF0IGNvbnZlcnNpb24sIGJ1dCB0aGUgcmVzdWx0aW5nCiAgICAgREggcGFyYW1ldGVycyBjb250YWluIGl0cyBsZW5ndGgpLgoKICAgICBGb3IgMTAyNC1iaXQgcCwgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgZm9sbG93ZWQgYnkgRFNBX2R1cF9ESCBpcwogICAgIG11Y2ggZmFzdGVyIHRoYW4gREhfZ2VuZXJhdGVfcGFyYW1ldGVycyAod2hpY2ggY3JlYXRlcyBwYXJhbWV0ZXJzCiAgICAgd2hlcmUgcCA9IDIqcSArIDEpLCBhbmQgYWxzbyB0aGUgc21hbGxlciBxIG1ha2VzIERIIGNvbXB1dGF0aW9ucwogICAgIG11Y2ggbW9yZSBlZmZpY2llbnQgKDE2MC1iaXQgZXhwb25lbnRpYXRpb24gaW5zdGVhZCBvZiAxMDI0LWJpdAogICAgIGV4cG9uZW50aWF0aW9uKTsgc28gdGhpcyBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHN1cHBvcnQgREhFCiAgICAgY2lwaGVyc3VpdGVzIGluIFNTTC9UTFMgc2VydmVycyAoc2VlIHNzbC9zc2x0ZXN0LmMpLiAgSXQgaXMgb2YKICAgICB1dHRlciBpbXBvcnRhbmNlIHRvIHVzZQogICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgb3IKICAgICAgICAgU1NMX3NldF9vcHRpb25zKHNfY3R4LCBTU0xfT1BfU0lOR0xFX0RIX1VTRSk7CiAgICAgd2hlbiBzdWNoIERIIHBhcmFtZXRlcnMgYXJlIHVzZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlIHNtYWxsIHN1Ymdyb3VwCiAgICAgYXR0YWNrcyBtYXkgYmVjb21lIHBvc3NpYmxlIQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIG1lbW9yeSBsZWFrIGluIGkyZF9ESHBhcmFtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyB0aGUgLWsgb3B0aW9uIHRvIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGVuYyBwcm9ncmFtOgogICAgIHRoaXMgYWxsb3dzIHRoZSBzYW1lIGVuY3J5cHRlZCBtZXNzYWdlIHRvIGJlIHJlYWQgYnkgbXVsdGlwbGUgcmVjaXBpZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0JKX29iajJ0eHQoYnVmLCBidWZfbGVuLCBhLCBub19uYW1lKSwgdGhpcyBjb252ZXJ0cwogICAgIGFuIEFTTjFfT0JKRUNUIHRvIGEgdGV4dCBzdHJpbmcuIElmIHRoZSAibm9fbmFtZSIgcGFyYW1ldGVyIGlzIHNldCB0aGVuCiAgICAgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBudW1lcmljYWwgZm9ybSBvZiB0aGUgT0lELCBldmVuIGlmIGl0IGhhcyBhIHNob3J0CiAgICAgb3IgbG9uZyBuYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIGV4dHJhIFJTQSBmbGFnOiBSU0FfRkxBR19FWFRfUEtFWS4gUHJldmlvdXNseSB0aGUgcnNhX21vZF9leHAKICAgICBtZXRob2Qgb25seSBnb3QgY2FsbGVkIGlmIHAscSxkbXAxLGRtcTEsaXFtcCBjb21wb25lbnRzIHdlcmUgcHJlc2VudCwKICAgICBvdGhlcndpc2UgYm5fbW9kX2V4cCB3YXMgY2FsbGVkLiBJbiB0aGUgY2FzZSBvZiBoYXJkd2FyZSBrZXlzIGZvciBleGFtcGxlCiAgICAgbm8gcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBuZWVkIGJlIHByZXNlbnQgYW5kIGl0IG1pZ2h0IHN0b3JlIGV4dHJhIGRhdGEKICAgICBpbiB0aGUgUlNBIHN0cnVjdHVyZSwgd2hpY2ggY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYm5fbW9kX2V4cC4KICAgICBCeSBzZXR0aW5nIFJTQV9GTEFHX0VYVF9QS0VZIHJzYV9tb2RfZXhwIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBmb3IKICAgICBwcml2YXRlIGtleSBvcGVyYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFNQQVJDIExpbnV4LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBwZW1fcGFzc3dvcmRfY2IgZnVuY3Rpb24gdHlwZSBpbmNvbXBhdGlibHkgY2hhbmdlZCBmcm9tCiAgICAgICAgICB0eXBlZGVmIGludCBwZW1fcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZyk7CiAgICAgdG8KICAgICAgICAgIC4uLi4oY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpOwogICAgIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBwYXNzIGRhdGEgdG8gdGhlaXIgY2FsbGJhY2tzOgogICAgIFRoZSBQRU1bX0FTTjFdX3tyZWFkLHdyaXRlfS4uLiBmdW5jdGlvbnMgYW5kIG1hY3JvcyBub3cgdGFrZSBhbgogICAgIGFkZGl0aW9uYWwgdm9pZCAqIGFyZ3VtZW50LCB3aGljaCBpcyBqdXN0IGhhbmRlZCB0aHJvdWdoIHdoZW5ldmVyCiAgICAgdGhlIHBhc3N3b3JkIGNhbGxiYWNrIGlzIGNhbGxlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZG1pbGxlckBpbG9naWMuY29tLmF1PjsgdGlueSBjaGFuZ2VzIGJ5IEJvZG8gTW9lbGxlcl0KCiAgICAgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhLgoKICAgICBDb21wYXRpYmlsaXR5IG5vdGU6IEFzIG1hbnkgQyBpbXBsZW1lbnRhdGlvbnMgcHVzaCBmdW5jdGlvbiBhcmd1bWVudHMKICAgICBvbnRvIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyLCB0aGUgbmV3IGxpYnJhcnkgdmVyc2lvbiBpcyBsaWtlbHkgdG8KICAgICBpbnRlcm9wZXJhdGUgd2l0aCBwcm9ncmFtcyB0aGF0IGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBvbGQKICAgICBwZW1fcGFzc3dvcmRfY2IgZGVmaW5pdGlvbiAoUEVNX3doYXRldmVyIHRha2VzIHNvbWUgZGF0YSB0aGF0CiAgICAgaGFwcGVucyB0byBiZSBvbiB0aGUgc3RhY2sgYXMgaXRzIGxhc3QgYXJndW1lbnQsIGFuZCB0aGUgY2FsbGJhY2sKICAgICBqdXN0IGlnbm9yZXMgdGhpcyBnYXJiYWdlKTsgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB3aGF0c29ldmVyIHRoYXQKICAgICB0aGlzIHdpbGwgd29yay4KCiAgKikgVGhlIC1EUExBVEZPUk09IlwiJChQTEFURk9STSlcIiIgZGVmaW5pdGlvbiBhbmQgdGhlIHNpbWlsYXIgLURDRkxBR1M9Li4uCiAgICAgKGJvdGggaW4gY3J5cHRvL01ha2VmaWxlLnNzbCBmb3IgdXNlIGJ5IGNyeXB0by9jdmVyc2lvbi5jKSBjYXVzZWQKICAgICBwcm9ibGVtcyBub3Qgb25seSBvbiBXaW5kb3dzLCBidXQgYWxzbyBvbiBzb21lIFVuaXggcGxhdGZvcm1zLgogICAgIFRvIGF2b2lkIHByb2JsZW1hdGljIGNvbW1hbmQgbGluZXMsIHRoZXNlIGRlZmluaXRpb25zIGFyZSBub3cgaW4gYW4KICAgICBhdXRvLWdlbmVyYXRlZCBmaWxlIGNyeXB0by9idWlsZGluZi5oIChjcmVhdGVkIGJ5IGNyeXB0by9NYWtlZmlsZS5zc2wKICAgICBmb3Igc3RhbmRhcmQgIm1ha2UiIGJ1aWxkcywgYnkgdXRpbC9tazFtZi5wbCBmb3IgIm1rMW1mIiBidWlsZHMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1JUFMgSUlJL0lWIGFzc2VtYmxlciBtb2R1bGUgaXMgcmVpbXBsZW1lbnRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW9yZSBERVMgbGlicmFyeSBjbGVhbnVwczogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gc3JhbmQvcmFuZCBhbmQKICAgICBkZWxldGUgYW4gdW51c2VkIGZpbGUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgdGhlIGZyZWUgTmV0d2lkZSBhc3NlbWJsZXIgKE5BU00pIHVuZGVyIFdpbjMyLAogICAgIHNpbmNlIG5vdCBtYW55IHBlb3BsZSBoYXZlIE1BU00gKG1sKSBhbmQgaXQgY2FuIGJlIGhhcmQgdG8gb2J0YWluLgogICAgIFRoaXMgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbCBidXQgaXQgc2VlbXMgdG8gd29yayBPSyBhbmQgcGFzcyBhbGwKICAgICB0aGUgdGVzdHMuIENoZWNrIG91dCBJTlNUQUxMLlczMiBmb3IgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIHMzX2NsbnQuYzogQWxsIG5vbi1hbm9ueW1vdXMgU1NMMy9UTFMxIGNvbm5lY3Rpb25zCiAgICAgd2l0aG91dCB0ZW1wb3Jhcnkga2V5cyBrZXB0IGFuIGV4dHJhIGNvcHkgb2YgdGhlIHNlcnZlciBrZXksCiAgICAgYW5kIGNvbm5lY3Rpb25zIHdpdGggdGVtcG9yYXJ5IGtleXMgZGlkIG5vdCBmcmVlIGV2ZXJ5dGhpbmcgaW4gY2FzZQogICAgIG9mIGFuIGVycm9yLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBSU0FfY2hlY2tfa2V5IGFuZCBuZXcgb3BlbnNzbCByc2Egb3B0aW9uIC1jaGVjawogICAgIGZvciB2ZXJpZnlpbmcgdGhlIGNvbnNpc3RlbmN5IG9mIFJTQSBrZXlzLgogICAgIFtVbGYgTW9lbGxlciwgQm9kbyBNb2VsbGVyXQoKICAqKSBWYXJpb3VzIGNoYW5nZXMgdG8gbWFrZSBXaW4zMiBjb21waWxlIHdvcms6IAogICAgIDEuIENhc3RzIHRvIGF2b2lkICJsb3NzIG9mIGRhdGEiIHdhcm5pbmdzIGluIHA1X2NycHQyLmMKICAgICAyLiBDaGFuZ2UgdW5zaWduZWQgaW50IHRvIGludCBpbiBiX2R1bXAuYyB0byBhdm9pZCAic2lnbmVkL3Vuc2lnbmVkCiAgICAgICAgY29tcGFyaXNvbiIgd2FybmluZ3MuCiAgICAgMy4gQWRkIHNrXzxUWVBFPl9zb3J0IHRvIERFRiBmaWxlIGdlbmVyYXRvciBhbmQgZG8gbWFrZSB1cGRhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZGVidWdnaW5nIG9wdGlvbiB0byBQS0NTIzUgdjIga2V5IGdlbmVyYXRpb24gZnVuY3Rpb246IHdoZW4KICAgICB5b3UgI2RlZmluZSBERUJVR19QS0NTNVYyIHBhc3N3b3Jkcywgc2FsdHMsIGl0ZXJhdGlvbiBjb3VudHMgYW5kCiAgICAgZGVyaXZlZCBrZXlzIGFyZSBwcmludGVkIHRvIHN0ZGVyci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3B5IHRoZSBmbGFncyBpbiBBU04xX1NUUklOR19kdXAoKS4KICAgICBbUm9tYW4gRS4gUGF2bG92IDxwcmVAbW8ubXNrLnJ1Pl0KCiAgKikgVGhlIHg1MDkgYXBwbGljYXRpb24gbWlzaGFuZGxlZCBzaWduaW5nIHJlcXVlc3RzIGNvbnRhaW5pbmcgRFNBCiAgICAga2V5cyB3aGVuIHRoZSBzaWduaW5nIGtleSB3YXMgYWxzbyBEU0EgYW5kIHRoZSBwYXJhbWV0ZXJzIGRpZG4ndCBtYXRjaC4KCiAgICAgSXQgd2FzIHN1cHBvc2VkIHRvIG9taXQgdGhlIHBhcmFtZXRlcnMgd2hlbiB0aGV5IG1hdGNoZWQgdGhlIHNpZ25pbmcga2V5OgogICAgIHRoZSB2ZXJpZnlpbmcgc29mdHdhcmUgd2FzIHRoZW4gc3VwcG9zZWQgdG8gYXV0b21hdGljYWxseSB1c2UgdGhlIENBJ3MKICAgICBwYXJhbWV0ZXJzIGlmIHRoZXkgd2VyZSBhYnNlbnQgZnJvbSB0aGUgZW5kIHVzZXIgY2VydGlmaWNhdGUuCgogICAgIE9taXR0aW5nIHBhcmFtZXRlcnMgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkLiBUaGUgdGVzdCB3YXMgYWxzbwogICAgIHRoZSB3cm9uZyB3YXkgcm91bmQhIFRoaXMgd2FzIHByb2JhYmx5IGR1ZSB0byB1bnVzdWFsIGJlaGF2aW91ciBpbgogICAgIEVWUF9jbXBfcGFyYW1ldGVycygpIHdoaWNoIHJldHVybnMgMSBpZiB0aGUgcGFyYW1ldGVycyBtYXRjaC4gCiAgICAgVGhpcyBtZWFudCB0aGF0IHBhcmFtZXRlcnMgd2VyZSBvbWl0dGVkIHdoZW4gdGhleSAqZGlkbid0KiBtYXRjaCBhbmQKICAgICB0aGUgY2VydGlmaWNhdGUgd2FzIHVzZWxlc3MuIENlcnRpZmljYXRlcyBzaWduZWQgd2l0aCAnY2EnIGRpZG4ndCBoYXZlCiAgICAgdGhpcyBidWcuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRG91ZyBFcmlja3NvbiA8RG91Zy5Fcmlja3NvbkBQYXJ0Lk5FVD5dCgogICopIE1lbW9yeSBsZWFrIGNoZWNraW5nICgtRENSWVBUT19NREVCVUcpIGhhZCBzb21lIHByb2JsZW1zLgogICAgIFRoZSBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZQogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTikgYWthIE1lbUNoZWNrX3N0YXJ0KCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09GRikgYWthIE1lbUNoZWNrX3N0b3AoKTsKICAgICAib2ZmIiBpcyBub3cgdGhlIGRlZmF1bHQuCiAgICAgVGhlIGxpYnJhcnkgaW50ZXJuYWxseSB1c2VzCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0RJU0FCTEUpIGFrYSBNZW1DaGVja19vZmYoKSwKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRU5BQkxFKSBha2EgTWVtQ2hlY2tfb24oKQogICAgIHRvIGRpc2FibGUgbWVtb3J5LWNoZWNraW5nIHRlbXBvcmFyaWx5LgoKICAgICBTb21lIGluY29uc2lzdGVudCBzdGF0ZXMgdGhhdCBwcmV2aW91c2x5IHdlcmUgcG9zc2libGUgKGFuZCB3ZXJlCiAgICAgZXZlbiB0aGUgZGVmYXVsdCkgYXJlIG5vdyBhdm9pZGVkLgoKICAgICAtRENSWVBUT19NREVCVUdfVElNRSBpcyBuZXcgYW5kIGFkZGl0aW9uYWxseSBzdG9yZXMgdGhlIGN1cnJlbnQgdGltZQogICAgIHdpdGggZWFjaCBtZW1vcnkgY2h1bmsgYWxsb2NhdGVkOyB0aGlzIGlzIG9jY2FzaW9uYWxseSBtb3JlIGhlbHBmdWwKICAgICB0aGFuIGp1c3QgaGF2aW5nIGEgY291bnRlci4KCiAgICAgLURDUllQVE9fTURFQlVHX1RIUkVBRCBpcyBhbHNvIG5ldyBhbmQgYWRkcyB0aGUgdGhyZWFkIElELgoKICAgICAtRENSWVBUT19NREVCVUdfQUxMIGVuYWJsZXMgYWxsIG9mIHRoZSBhYm92ZSwgcGx1cyBhbnkgZnV0dXJlCiAgICAgZXh0ZW5zaW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgIm1vZGUiIGZvciBTU0wgc3RydWN0dXJlcyAod2l0aCBkZWZhdWx0cyBpbiBTU0xfQ1RYKSwKICAgICB3aGljaCBsYXJnZWx5IHBhcmFsbGVscyAib3B0aW9ucyIsIGJ1dCBpcyBmb3IgY2hhbmdpbmcgQVBJIGJlaGF2aW91ciwKICAgICB3aGVyZWFzICJvcHRpb25zIiBhcmUgYWJvdXQgcHJvdG9jb2wgYmVoYXZpb3VyLgogICAgIEluaXRpYWwgIm1vZGUiIGZsYWdzIGFyZToKCiAgICAgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgICBBbGxvdyBTU0xfd3JpdGUgdG8gcmVwb3J0IHN1Y2Nlc3Mgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4uCiAgICAgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIgIERvbid0IGluc2lzdCB0aGF0IFNTTF93cml0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcyB1c2UgdGhlIHNhbWUgYnVmZmVyIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1dCBhbGwgb2YgdGhlIGNvbnRlbnRzIG11c3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZCEpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBTU0xfc2V0X29wdGlvbnMgaWdub3JlZCBpdHMgcGFyYW1ldGVyLCBvbmx5IFNTTF9DVFhfc2V0X29wdGlvbnMKICAgICB3b3JrZWQuCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIG5vLWhtYWMgZXRjLgogICAgIFtVbGYgTfZsbGVyLCBwb2ludGVkIG91dCBieSBCcmlhbiBXZWxsaW5ndG9uIDxid2VsbGluZ0B0aXNsYWJzLmNvbT5dCgogICopIE5ldyBmdW5jdGlvbnMgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpLCBSU0Ffc2V0X21ldGhvZCgpIGFuZAogICAgIFJTQV9nZXRfbWV0aG9kKCkuIFRoZXNlIGFsbG93cyByZXBsYWNlbWVudCBvZiBSU0FfTUVUSE9EcyB3aXRob3V0IGhhdmluZwogICAgIHRvIG1lc3MgYXJvdW5kIHdpdGggdGhlIGludGVybmFscyBvZiBhbiBSU0Egc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gRFNBX2RvX3NpZ24gYW5kIERTQV9pc19wcmltZS4KICAgICBBbHNvIHJlYWxseSBlbmFibGUgbWVtb3J5IGxlYWsgY2hlY2tzIGluIG9wZW5zc2wuYyBhbmQgaW4gc29tZQogICAgIHRlc3QgcHJvZ3JhbXMuCiAgICAgW0NoYWQgQy4gTXVsbGlnYW4sIEJvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGQyaV9BU04xX0lOVEVHRVIoKSBhbmQgaTJkX0FTTjFfSU5URUdFUigpIHdoaWNoIGNhbiBtZXNzCiAgICAgdXAgdGhlIGxlbmd0aCBvZiBuZWdhdGl2ZSBpbnRlZ2Vycy4gVGhpcyBoYXMgbm93IGJlZW4gc2ltcGxpZmllZCB0byBqdXN0CiAgICAgc3RvcmUgdGhlIGxlbmd0aCB3aGVuIGl0IGlzIGZpcnN0IGRldGVybWluZWQgYW5kIHVzZSBpdCBsYXRlciwgcmF0aGVyCiAgICAgdGhhbiB0cnlpbmcgdG8ga2VlcCB0cmFjayBvZiB3aGVyZSBkYXRhIGlzIGNvcGllZCBhbmQgdXBkYXRpbmcgaXQgdG8KICAgICBwb2ludCB0byB0aGUgZW5kLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEJyaWVuIFdoZWVsZXIKICAgICAgPGJ3aGVlbGVyQGF1dGhlbnRpY2Etc2VjdXJpdHkuY29tPl0KCiAgKikgQWRkIGEgbmV3IGZ1bmN0aW9uIFBLQ1M3X3NpZ25hdHVyZVZlcmlmeS4gVGhpcyBhbGxvd3MgdGhlIHZlcmlmaWNhdGlvbgogICAgIG9mIGEgUEtDUyM3IHNpZ25hdHVyZSBidXQgd2l0aCB0aGUgc2lnbmluZyBjZXJ0aWZpY2F0ZSBwYXNzZWQgdG8gdGhlCiAgICAgZnVuY3Rpb24gaXRzZWxmLiBUaGlzIGNvbnRyYXN0cyB3aXRoIFBLQ1M3X2RhdGFWZXJpZnkgd2hpY2ggYXNzdW1lcyB0aGUKICAgICBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50IGluIHRoZSBQS0NTIzcgc3RydWN0dXJlLiBUaGlzIGlzbid0IGFsd2F5cyB0aGUKICAgICBjYXNlOiBjZXJ0aWZpY2F0ZXMgY2FuIGJlIG9taXR0ZWQgZnJvbSBhIFBLQ1MjNyBzdHJ1Y3R1cmUgYW5kIGJlCiAgICAgZGlzdHJpYnV0ZWQgYnkgIm91dCBvZiBiYW5kIiBtZWFucyAoc3VjaCBhcyBhIGNlcnRpZmljYXRlIGRhdGFiYXNlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb21wbGV0ZSB0aGUgUEVNXyogbWFjcm9zIHdpdGggREVDTEFSRV9QRU0gdmVyc2lvbnMgdG8gcmVwbGFjZSB0aGUKICAgICBmdW5jdGlvbiBwcm90b3R5cGVzIGluIHBlbS5oLCBhbHNvIGNoYW5nZSB1dGlsL21rZGVmLnBsIHRvIGFkZCB0aGUKICAgICBuZWNlc3NhcnkgZnVuY3Rpb24gbmFtZXMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIG1rMW1mLnBsICh1c2VkIGJ5IFdpbmRvd3MgYnVpbGRzKSBkaWQgbm90IHByb3Blcmx5IHJlYWQgdGhlCiAgICAgb3B0aW9ucyBzZXQgYnkgQ29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgTWFrZWZpbGUsIGFuZCBDb25maWd1cmUKICAgICB3YXMgbm90IGV2ZW4gYWJsZSB0byB3cml0ZSBtb3JlIHRoYW4gb25lIG9wdGlvbiBjb3JyZWN0bHkuCiAgICAgRml4ZWQsIG5vdyAibm8taWRlYSBuby1yYzUgLURDUllQVE9fTURFQlVHIiBldGMuIHdvcmtzIGFzIGludGVuZGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMgQ09ORl9sb2FkX2JpbygpIGFuZCBDT05GX2xvYWRfZnAoKSB0byBhbGxvdyBhIGNvbmZpZwogICAgIGZpbGUgdG8gYmUgbG9hZGVkIGZyb20gYSBCSU8gb3IgRklMRSBwb2ludGVyLiBUaGUgQklPIHZlcnNpb24gd2lsbAogICAgIGZvciBleGFtcGxlIGFsbG93IG1lbW9yeSBCSU9zIHRvIGNvbnRhaW4gY29uZmlnIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uICJDUllQVE9fbnVtX2xvY2tzIiB0aGF0IHJldHVybnMgQ1JZUFRPX05VTV9MT0NLUy4KICAgICBXaG9ldmVyIGhvcGVzIHRvIGFjaGlldmUgc2hhcmVkLWxpYnJhcnkgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdmVyc2lvbnMKICAgICBtdXN0IHVzZSB0aGlzLCBub3QgdGhlIGNvbXBpbGUtdGltZSBtYWNyby4KICAgICAoRXhlcmNpc2UgMC45LjQ6IFdoaWNoIGlzIHRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlZCBieQogICAgIHN1Y2ggcHJvZ3JhbXM/KQogICAgIE5vdGU6IEFsbCB0aGlzIGFwcGxpZXMgb25seSB0byBtdWx0aS10aHJlYWRlZCBwcm9ncmFtcywgb3RoZXJzIGRvbid0CiAgICAgbmVlZCBsb2Nrcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgbWlzc2luZyBjYXNlIHRvIHMzX2NsbnQuYyBzdGF0ZSBtYWNoaW5lIC0tIG9uZSBvZiB0aGUgbmV3IFNTTCB0ZXN0cwogICAgIHRocm91Z2ggYSBCSU8gcGFpciB0cmlnZ2VyZWQgdGhlIGRlZmF1bHQgY2FzZSwgaS5lLgogICAgIFNTTGVyciguLi4sU1NMX1JfVU5LTk9XTl9TVEFURSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICJCSU8gcGFpciIgY29uY2VwdCAoY3J5cHRvL2Jpby9ic3NfYmlvLmMpIHNvIHRoYXQgYXBwbGljYXRpb25zCiAgICAgY2FuIHVzZSB0aGUgU1NMIGxpYnJhcnkgZXZlbiBpZiBub25lIG9mIHRoZSBzcGVjaWZpYyBCSU9zIGlzCiAgICAgYXBwcm9wcmlhdGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGEgYnVnIGluIGkyZF9EU0FQdWJsaWNLZXkoKSB3aGljaCBtZWFudCBpdCByZXR1cm5lZCB0aGUgd3JvbmcgdmFsdWUKICAgICBmb3IgdGhlIGVuY29kZWQgbGVuZ3RoLgogICAgIFtKZW9uIEt5b3VuZ0hvIDxraGplb25Ac2RzLnNhbXN1bmcuY28ua3I+XQoKICAqKSBBZGQgaW5pdGlhbCBkb2N1bWVudGF0aW9uIG9mIHRoZSBYNTA5VjMgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBwYWlyIG9mIGZ1bmN0aW9ucyBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5KCkgYW5kIAogICAgIFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KCkgdGhhdCBhcmUgZXF1aXZhbGVudCB0bwogICAgIFBFTV93cml0ZV9Qcml2YXRlS2V5KCkgYW5kIFBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleSgpIGJ1dCB1c2UgdGhlIG1vcmUKICAgICBzZWN1cmUgUEtDUyM4IHByaXZhdGUga2V5IGZvcm1hdCB3aXRoIGEgaGlnaCBpdGVyYXRpb24gY291bnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRldGVybWluYXRpb24gb2YgUGVybCBpbnRlcnByZXRlcjogQSBwZXJsIG9yIHBlcmw1CiAgICAgX2RpcmVjdG9yeV8gaW4gJFBBVEggd2FzIGFsc28gYWNjZXB0ZWQgYXMgdGhlIGludGVycHJldGVyLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggZGVtb3Mvc2lnbi9zaWduLmM6IHdlbGwgdGhlcmUgd2Fzbid0IGFueXRoaW5nIHN0cmljdGx5IHNwZWFraW5nCiAgICAgd3Jvbmcgd2l0aCBpdCBidXQgaXQgd2FzIHZlcnkgb2xkIGFuZCBkaWQgdGhpbmdzIGxpa2UgY2FsbGluZwogICAgIFBFTV9BU04xX3JlYWQoKSBkaXJlY3RseSBhbmQgdXNlZCBNRDUgZm9yIHRoZSBoYXNoIG5vdCB0byBtZW50aW9uIHNvbWUKICAgICB1bnVzdWFsIGZvcm1hdHRpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGRlbW9zL3NlbGZzaWduLmM6IGl0IHVzZWQgb2Jzb2xldGUgYW5kIGRlbGV0ZWQgZnVuY3Rpb25zLCBjaGFuZ2VkCiAgICAgdG8gdXNlIHRoZSBuZXcgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBQRU1fcmVhZC9QRU1fd3JpdGUgZnVuY3Rpb25zIGluIGNyeXB0by9wZW0vcGVtX2FsbC5jCiAgICAgd2l0aCBtYWNyb3MuIFRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIGNoYW5nZSB0aGVpciBmb3JtLCBhZGQgZXh0cmEKICAgICBhcmd1bWVudHMgZXRjLiBGaXggYSBmZXcgUEVNIHByb3RvdHlwZXMgd2hpY2ggZGlkbid0IGhhdmUgY2lwaGVyIGFzIGEKICAgICBjb25zdGFudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdG8gY29uZmlndXJhdGlvbiB0YWJsZSBhIG5ldyBlbnRyeSB0aGF0IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgbmFtZSBmb3IgdW5pc3RkLmggKGZvciBwcmUtUE9TSVggc3lzdGVtcyk7IHdlIG5lZWQgdGhpcyBmb3IgTmVYVHN0ZXAsCiAgICAgYWNjb3JkaW5nIHRvIE1hcmsgQ3Jpc3BpbiA8TVJDQFBhbmRhLkNPTT4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiNpZiAwCiAgKikgREVTIENCQyBkaWQgbm90IHVwZGF0ZSB0aGUgSVYuIFdlaXJkLgogICAgIFtCZW4gTGF1cmllXQojZWxzZQogICAgIGRlc19jYmNfZW5jcnlwdCBkb2VzIG5vdCB1cGRhdGUgdGhlIElWLCBidXQgZGVzX25jYmNfZW5jcnlwdCBkb2VzLgogICAgIENoYW5naW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZvcm1lciBtaWdodCBicmVhayBleGlzdGluZyBwcm9ncmFtcyAtLQogICAgIHdoZXJlIElWIHVwZGF0aW5nIGlzIG5lZWRlZCwgZGVzX25jYmNfZW5jcnlwdCBjYW4gYmUgdXNlZC4KI2VuZGlmCgogICopIFdoZW4gYm50ZXN0IGlzIHJ1biBmcm9tICJtYWtlIHRlc3QiIGl0IGRyaXZlcyBiYyB0byBjaGVjayBpdHMKICAgICBjYWxjdWxhdGlvbnMsIGFzIHdlbGwgYXMgaW50ZXJuYWxseSBjaGVja2luZyB0aGVtLiBJZiBhbiBpbnRlcm5hbCBjaGVjawogICAgIGZhaWxzLCBpdCBuZWVkcyB0byBjYXVzZSBiYyB0byBnaXZlIGEgbm9uLXplcm8gcmVzdWx0IG9yIG1ha2UgdGVzdCBjYXJyaWVzCiAgICAgb24gd2l0aG91dCBub3RpY2luZyB0aGUgZmFpbHVyZS4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIERFUyBsaWJyYXJ5IGNsZWFudXBzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUEJFIGFsZ29yaXRobXMuIFRoaXMgd2lsbCBwZXJtaXQgUEtDUyM4IHRvIGJlCiAgICAgdXNlZCB3aXRoIGFueSBjaXBoZXIgdW5saWtlIFBLQ1MjNSB2MS41IHdoaWNoIGNhbiBhdCBtb3N0IGhhbmRsZSA2NCBiaXQKICAgICBjaXBoZXJzLiBOT1RFOiBhbHRob3VnaCB0aGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaGFzIGJlZW4gdmVyaWZpZWQKICAgICBhZ2FpbnN0IHNvbWUgcHVibGlzaGVkIHRlc3QgdmVjdG9ycyBpdCBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkCiAgICAgeWV0LiBBZGRlZCBhIC12MiAiY2lwaGVyIiBvcHRpb24gdG8gcGtjczggYXBwbGljYXRpb24gdG8gYWxsb3cgdGhlIHVzZQogICAgIG9mIHYyLjAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5zdGVhZCBvZiAibWtkaXIgLXAiLCB3aGljaCBpcyBub3QgZnVsbHkgcG9ydGFibGUsIHVzZSBuZXcKICAgICBQZXJsIHNjcmlwdCAidXRpbC9ta2Rpci1wLnBsIi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHRoZSB3YXkgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiAoUEJFKSBpcyBoYW5kbGVkLiBJdCB1c2VkIHRvCiAgICAgYXNzdW1lIHRoYXQgdGhlIEFTTjEgQWxnb3JpdGhtSWRlbnRpZmllciBwYXJhbWV0ZXIgd2FzIGEgUEJFUGFyYW1ldGVyCiAgICAgc3RydWN0dXJlLiBUaGlzIHdhcyB0cnVlIGZvciB0aGUgUEtDUyM1IHYxLjUgYW5kIFBLQ1MjMTIgUEJFIGFsZ29yaXRobXMKICAgICBidXQgZG9lc24ndCBhcHBseSB0byBQS0NTIzUgdjIuMCB3aGVyZSBpdCBjYW4gYmUgc29tZXRoaW5nIGVsc2UuIE5vdwogICAgIHRoZSAncGFyYW1ldGVyJyBmaWVsZCBvZiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBpcyBwYXNzZWQgdG8gdGhlCiAgICAgdW5kZXJseWluZyBrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbiBzbyBpdCBtdXN0IGRvIGl0cyBvd24gQVNOMSBwYXJzaW5nLgogICAgIFRoaXMgaGFzIGFsc28gY2hhbmdlZCB0aGUgRVZQX1BCRV9DaXBoZXJJbml0KCkgZnVuY3Rpb24gd2hpY2ggbm93IGhhcyBhCiAgICAgJ3BhcmFtZXRlcicgYXJndW1lbnQgaW5zdGVhZCBvZiBsaXRlcmFsIHNhbHQgYW5kIGl0ZXJhdGlvbiBjb3VudCB2YWx1ZXMKICAgICBhbmQgdGhlIGZ1bmN0aW9uIEVWUF9QQkVfQUxHT1JfQ2lwaGVySW5pdCgpIGhhcyBiZWVuIGRlbGV0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyM1IHYxLjUgY29tcGF0aWJsZSBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGFsZ29yaXRobXMKICAgICBhbmQgUEtDUyM4IGZ1bmN0aW9uYWxpdHkuIE5ldyAncGtjczgnIGFwcGxpY2F0aW9uIGxpbmtlZCB0byBvcGVuc3NsLgogICAgIE5lZWRlZCB0byBjaGFuZ2UgdGhlIFBFTV9TVFJJTkdfRVZQX1BLRVkgdmFsdWUgd2hpY2ggd2FzIGp1c3QgIlBSSVZBVEUKICAgICBLRVkiIGJlY2F1c2UgdGhpcyBjbGFzaGVkIHdpdGggUEtDUyM4IHVuZW5jcnlwdGVkIHN0cmluZy4gU2luY2UgdGhpcwogICAgIHZhbHVlIHdhcyBqdXN0IHVzZWQgYXMgYSAibWFnaWMgc3RyaW5nIiBhbmQgbm90IHVzZWQgZGlyZWN0bHkgaXRzCiAgICAgdmFsdWUgZG9lc24ndCBtYXR0ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHNvbWUgc2VtYmxhbmNlIG9mIGNvbnN0IGNvcnJlY3RuZXNzIHRvIEJOLiBTaGFtZSBDIGRvZXNuJ3QKICAgICBzdXBwb3J0IG11dGFibGUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopICJsaW51eC1zcGFyYzY0IiBjb25maWd1cmF0aW9uICh1bHRyYXBlbmd1aW4pLgogICAgIFtSYXkgTWlsbGVyIDxyYXkubWlsbGVyQG91Y3Mub3guYWMudWs+XQogICAgICJsaW51eC1zcGFyYyIgY29uZmlndXJhdGlvbi4KICAgICBbQ2hyaXN0aWFuIEZvcnN0ZXIgPGZvQGhhd28uc3R3LnVuaS1lcmxhbmdlbi5kZT5dCgogICopIGNvbmZpZyBub3cgZ2VuZXJhdGVzIG5vLXh4eCBvcHRpb25zIGZvciBtaXNzaW5nIGNpcGhlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0ICh3b3JrIGluIHByb2dyZXNzKS4KICAgICBGaWxlIGViY2RpYy5jIG5vdCB5ZXQgaW5jbHVkZWQgYmVjYXVzZSBpdCBoYXMgYSBkaWZmZXJlbnQgbGljZW5zZS4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIFN1cHBvcnQgQlMyMDAwL09TRC1QT1NJWC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIE1ha2UgY2FsbGJhY2tzIGZvciBrZXkgZ2VuZXJhdGlvbiB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIFMvTUlNRSBzYW1wbGVzIGNvbXBpbGUgKG5vdCB5ZXQgdGVzdGVkKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkaXRpb25hbCB0eXBlc2FmZSBzdGFja3MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhbnRzICJic2RpLWVsZi1nY2MiIChCU0QvT1MgNC54KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjMgYW5kIDAuOS4zYSAgWzI5IE1heSAxOTk5XQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50ICJzY281LWdjYyIuCgogICopIFVwZGF0ZWQgc29tZSBkZW1vcy4KICAgICBbU2VhbiBPIFJpb3JkYWluLCBXYWRlIFNjaG9saW5lXQoKICAqKSBBZGQgbWlzc2luZyBCSU9fZnJlZSBhdCBleGl0IG9mIHBrY3MxMiBhcHBsaWNhdGlvbi4KICAgICBbV3UgWmhpZ2FuZ10KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIGNvbmYuYy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGVzIGZvciBXaW4zMiB0byBhc3NlbWJsZXIgdmVyc2lvbiBvZiBNRDUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V0ICMhIHBhdGggdG8gcGVybCBpbiBhcHBzL2Rlcl9jaG9wIHRvIHdoZXJlIHdlIGZvdW5kIGl0CiAgICAgaW5zdGVhZCBvZiB1c2luZyBhIGZpeGVkIHBhdGguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU0hBIGxpYnJhcnkgY2hhbmdlcyBmb3IgaXJpeDY0LW1pcHM0LWNjLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBJbXByb3ZlbWVudHMgZm9yIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMmIgYW5kIDAuOS4zICBbMjQgTWF5IDE5OTldCgogICopIEJpZ251bSBsaWJyYXJ5IGJ1ZyBmaXguIElSSVggNiBwYXNzZXMgIm1ha2UgdGVzdCIgbm93IQogICAgIFRoaXMgYWxzbyBhdm9pZHMgdGhlIHByb2JsZW1zIHdpdGggU0M0LjIgYW5kIHVucGF0Y2hlZCBTQzUuICAKICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBOZXcgZnVuY3Rpb25zIHNrX251bSwgc2tfdmFsdWUgYW5kIHNrX3NldCB0byByZXBsYWNlIHRoZSBwcmV2aW91cyBtYWNyb3MuCiAgICAgVGhlc2UgYXJlIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHR5cGVzYWZlIHN0YWNrIHdvdWxkIG90aGVyd2lzZSBicmVhayAKICAgICBleGlzdGluZyBjb2RlLiBJZiBvbGQgY29kZSB1c2VkIGEgc3RydWN0dXJlIG1lbWJlciB3aGljaCB1c2VkIHRvIGJlIFNUQUNLCiAgICAgYW5kIGlzIG5vdyBTVEFDS19PRiAoZm9yIGV4YW1wbGUgY2VydCBpbiBhIFBLQ1M3X1NJR05FRCBzdHJ1Y3R1cmUpIHdpdGgKICAgICBza19udW0gb3Igc2tfdmFsdWUgaXQgd291bGQgcHJvZHVjZSBhbiBlcnJvciBiZWNhdXNlIHRoZSBudW0sIGRhdGEgbWVtYmVycwogICAgIGFyZSBub3QgcHJlc2VudCBpbiBTVEFDS19PRi4gTm93IGl0IGp1c3QgcHJvZHVjZXMgYSB3YXJuaW5nLiBza19zZXQKICAgICByZXBsYWNlcyB0aGUgb2xkIG1ldGhvZCBvZiBhc3NpZ25pbmcgYSB2YWx1ZSB0byBza192YWx1ZQogICAgIChlLmcuIHNrX3ZhbHVlKHgsIGkpID0geSkgd2hpY2ggdGhlIGxpYnJhcnkgdXNlZCBpbiBhIGZldyBjYXNlcy4gQW55IGNvZGUKICAgICB0aGF0IGRvZXMgdGhpcyB3aWxsIG5vIGxvbmdlciB3b3JrIChhbmQgc2hvdWxkIHVzZSBza19zZXQgaW5zdGVhZCkgYnV0CiAgICAgdGhpcyBjb3VsZCBiZSByZWdhcmRlZCBhcyBhICJxdWVzdGlvbmFibGUiIGJlaGF2aW91ciBhbnl3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1vc3Qgb2YgdGhlIG90aGVyIFBLQ1MjNyBidWdzLiBUaGUgImV4cGVyaW1lbnRhbCIgY29kZSBjYW4gbm93CiAgICAgY29ycmVjdGx5IGhhbmRsZSBlbmNyeXB0ZWQgUy9NSU1FIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgdmFyaW91cyBERVMgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gZGVzX2NibG9jawogICAgICh3aGljaCBtZWFucywgaW4gZnVuY3Rpb24gYXJndW1lbnQgZGVjbGFyYXRpb25zLCBwb2ludGVyIHRvIGNoYXIpCiAgICAgdG8gZGVzX2NibG9jayAqIChtZWFuaW5nIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCA4IGNoYXIgZWxlbWVudHMpLAogICAgIHdoaWNoIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZG8gbW9yZSB0eXBlY2hlY2tpbmc7IGl0IHdhcyBsaWtlCiAgICAgdGhhdCBiYWNrIGluIFNTTGVheSwgYnV0IHdpdGggbG90cyBvZiB1Z2x5IGNhc3RzLgoKICAgICBJbnRyb2R1Y2UgbmV3IHR5cGUgY29uc3RfZGVzX2NibG9jay4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW9yZ2FuaXNlIHRoZSBQS0NTIzcgbGlicmFyeSBhbmQgZ2V0IHJpZCBvZiBzb21lIG9mIHRoZSBtb3JlIG9idmlvdXMKICAgICBwcm9ibGVtczogZmluZCBSZWNpcGllbnRJbmZvIHN0cnVjdHVyZSB0aGF0IG1hdGNoZXMgcmVjaXBpZW50IGNlcnRpZmljYXRlCiAgICAgYW5kIGluaXRpYWxpc2UgdGhlIEFTTjEgc3RydWN0dXJlcyBwcm9wZXJseSBiYXNlZCBvbiBwYXNzZWQgY2lwaGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlbGF0ZWRseSBtYWtlIHRoZSBCTiB0ZXN0cyBhY3R1YWxseSBjaGVjayB0aGUgcmVzdWx0cy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgbmVnYXRpdmUgQVNOMSBJTlRFR0VSUyBhbmQgY29udmVyc2lvbgogICAgIHRvIGFuZCBmcm9tIEJOczogaXQgd2FzIGNvbXBsZXRlbHkgYnJva2VuLiBOZXcgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgTkVHX1BVQktFWV9CVUcgdG8gYWxsb3cgZm9yIHNvbWUgYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGVuY29kZSBwdWJsaWMKICAgICBrZXkgZWxlbWVudHMgYXMgbmVnYXRpdmUgaW50ZWdlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbml6ZSBhbmQgc3BlZWQgdXAgTUQ1LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFZNUyBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+XQoKICAqKSBOZXcgb3B0aW9uIC1vdXQgdG8gYXNuMXBhcnNlIHRvIGFsbG93IHRoZSBwYXJzZWQgc3RydWN0dXJlIHRvIGJlCiAgICAgb3V0cHV0IHRvIGEgZmlsZS4gVGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIC1zdHJwYXJzZQogICAgIG9wdGlvbiB0byBleGFtaW5lIHRoZSBvdXRwdXQgb2YgdGhpbmdzIGxpa2UgT0NURVQgU1RSSU5HUy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNTTCBsaWJyYXJ5IGEgbGl0dGxlIG1vcmUgZm9vbC1wcm9vZiBieSBub3QgcmVxdWlyaW5nIGFueSBsb25nZXIKICAgICB0aGF0IFNTTF9zZXRfe2FjY2VwdCxjb25uZWN0fV9zdGF0ZSBiZSBjYWxsZWQgYmVmb3JlCiAgICAgU1NMX3thY2NlcHQsY29ubmVjdH0gbWF5IGJlIHVzZWQgKFNTTF9zZXRfLi4uX3N0YXRlIGlzIG9taXR0ZWQKICAgICBpbiBtYW55IGFwcGxpY2F0aW9ucyBiZWNhdXNlIHVzdWFsbHkgZXZlcnl0aGluZyAqYXBwZWFyZWQqIHRvIHdvcmsgYXMKICAgICBpbnRlbmRlZCBhbnl3YXkgLS0gbm93IGl0IHJlYWxseSB3b3JrcyBhcyBpbnRlbmRlZCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBvcGVuc3NsLmNuZiBvdXQgb2YgbGliLy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHZhcmlvdXMgdGhpbmdzIHRvIGxldCBPcGVuU1NMIGV2ZW4gcGFzcyBgYGVnY2MgLXBpcGUgLU8yIC1XYWxsCiAgICAgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbiAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnIHdpdGggRUdDUyAxLjEuMisgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdGhlIEVWUCBhbmQgUEtDUyM3IGNvZGUuIEl0IG1heSBub3cgYmUgYWJsZSB0bwogICAgIGhhbmRsZSBQS0NTIzcgZW52ZWxvcGVkIGRhdGEgcHJvcGVybHkuCiAgICAgW1NlYmFzdGlhbiBBa2VybWFuIDxzYWtAcGFyYWxsZWxjb25zdWx0aW5nLmNvbT4sIG1vZGlmaWVkIGJ5IFN0ZXZlXQoKICAqKSBDcmVhdGUgYSBkdXBsaWNhdGUgb2YgdGhlIFNTTF9DVFgncyBDRVJUIGluIFNTTF9uZXcgaW5zdGVhZCBvZgogICAgIGNvcHlpbmcgcG9pbnRlcnMuICBUaGUgY2VydF9zdCBoYW5kbGluZyBpcyBjaGFuZ2VkIGJ5IHRoaXMgaW4KICAgICB2YXJpb3VzIHdheXMgKGFuZCB0aHVzIHdoYXQgdXNlZCB0byBiZSBrbm93biBhcyBjdHgtPmRlZmF1bHRfY2VydAogICAgIGlzIG5vdyBjYWxsZWQgY3R4LT5jZXJ0LCBzaW5jZSB3ZSBkb24ndCByZXNvcnQgdG8gcy0+Y3R4LT5bZGVmYXVsdF9dY2VydAogICAgIGFueSBsb25nZXIgd2hlbiBzLT5jZXJ0IGRvZXMgbm90IGdpdmUgdXMgd2hhdCB3ZSBuZWVkKS4KICAgICBzc2xfY2VydF9pbnN0YW50aWF0ZSBiZWNvbWVzIG9ic29sZXRlIGJ5IHRoaXMgY2hhbmdlLgogICAgIEFzIHNvb24gYXMgd2UndmUgZ290IHRoZSBuZXcgY29kZSByaWdodCAocG9zc2libHkgaXQgYWxyZWFkeSBpcz8pLAogICAgIHdlIGhhdmUgc29sdmVkIGEgY291cGxlIG9mIGJ1Z3Mgb2YgdGhlIGVhcmxpZXIgY29kZSB3aGVyZSBzLT5jZXJ0CiAgICAgd2FzIHVzZWQgYXMgaWYgaXQgY291bGQgbm90IGhhdmUgYmVlbiBzaGFyZWQgd2l0aCBvdGhlciBTU0wgc3RydWN0dXJlcy4KCiAgICAgTm90ZSB0aGF0IHVzaW5nIHRoZSBTU0wgQVBJIGluIGNlcnRhaW4gZGlydHkgd2F5cyBub3cgd2lsbCByZXN1bHQKICAgICBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHRoYW4gb2JzZXJ2ZWQgd2l0aCBlYXJsaWVyIGxpYnJhcnkgdmVyc2lvbnM6CiAgICAgQ2hhbmdpbmcgc2V0dGluZ3MgZm9yIGFuIFNTTF9DVFggKmN0eCBhZnRlciBoYXZpbmcgZG9uZSBzID0gU1NMX25ldyhjdHgpCiAgICAgZG9lcyBub3QgaW5mbHVlbmNlIHMgYXMgaXQgdXNlZCB0by4KICAgICAKICAgICBJbiBvcmRlciB0byBjbGVhbiB1cCB0aGluZ3MgbW9yZSB0aG9yb3VnaGx5LCBpbnNpZGUgU1NMX1NFU1NJT04KICAgICB3ZSBkb24ndCB1c2UgQ0VSVCBhbnkgbG9uZ2VyLCBidXQgYSBuZXcgc3RydWN0dXJlIFNFU1NfQ0VSVAogICAgIHRoYXQgaG9sZHMgcGVyLXNlc3Npb24gZGF0YSAoaWYgYXZhaWxhYmxlKTsgY3VycmVudGx5LCB0aGlzIGlzCiAgICAgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQsIGZvciBjbGllbnRzLCB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUKICAgICBhbmQgdGVtcG9yYXJ5IGtleS4gIENFUlQgaG9sZHMgb25seSB0aG9zZSB2YWx1ZXMgdGhhdCBjYW4gaGF2ZQogICAgIG1lYW5pbmdmdWwgZGVmYXVsdHMgaW4gYW4gU1NMX0NUWC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX0VYVF9pMmQoKSB0byBjcmVhdGUgYW4gWDUwOV9FWFRFTlNJT04gc3RydWN0dXJlCiAgICAgZnJvbSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFZhcmlvdXMgUEtDUyM3IGZpeGVzOiByZW1vdmUgc29tZQogICAgIGV2aWwgY2FzdHMgYW5kIHNldCB0aGUgZW5jX2RpZ19hbGcgZmllbGQgcHJvcGVybHkgYmFzZWQgb24gdGhlIHNpZ25pbmcKICAgICBrZXkgdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBQS0NTIzEyIHBhc3N3b3JkIHRvIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgdGhlCiAgICAgZW52aXJvbm1lbnQuIExldCAnY2EnIGdldCBpdHMgY29uZmlnIGZpbGUgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudAogICAgIHZhcmlhYmxlcyAiT1BFTlNTTF9DT05GIiBvciAiU1NMRUFZX0NPTkYiIChmb3IgY29uc2lzdGVuY3kgd2l0aCAncmVxJwogICAgIGFuZCAneDUwOScpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGNlcnRpZmljYXRlIHBvbGljaWVzIGV4dGVuc2lvbiB0byB1c2UgYW4gSUE1U1RSSU5HIGZvciB0aGUKICAgICBvcmdhbml6YXRpb24gZmllbGQuIFRoaXMgaXMgY29udHJhcnkgdG8gdGhlIFBLSVggZGVmaW5pdGlvbiBidXQKICAgICBWZXJpU2lnbiB1c2VzIGl0IGFuZCBJRTUgb25seSByZWNvZ25pc2VzIHRoaXMgZm9ybS4gRG9jdW1lbnQgJ3g1MDknCiAgICAgZXh0ZW5zaW9uIG9wdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgUEVEQU5USUMgY29tcGlsZXIgZmxhZyB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIGdjYyAtcGVkYW50aWMsCiAgICAgd2l0aG91dCBkaXNhbGxvd2luZyBpbmxpbmUgYXNzZW1ibGVyIGFuZCB0aGUgbGlrZSBmb3Igbm9uLXBlZGFudGljIGJ1aWxkcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3VwcG9ydCBCb3JsYW5kIEMrKyBidWlsZGVyLgogICAgIFtKYW5leiBKZXJlIDxqakB2b2lkLnNpPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTSEEtMSBjbGVhbnVwcyBhbmQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFNwYXJjIHY4cGx1cyBhc3NlbWJsZXIgZm9yIHRoZSBiaWdudW0gbGlicmFyeS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBBY2NlcHQgYW55IC14eHggYW5kICt4eHggY29tcGlsZXIgb3B0aW9ucyBpbiBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFVwZGF0ZSBIUFVYIGNvbmZpZ3VyYXRpb24uCiAgICAgW0Fub255bW91c10KICAKICAqKSBBZGQgbWlzc2luZyBza188dHlwZT5fdW5zaGlmdCgpIGZ1bmN0aW9uIHRvIHNhZmVzdGFjay5oCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlIHRoYXQgc2V0cyB0aGUKICAgICAiZXh0cmFfY2VydCJzIGluIGFkZGl0aW9uIHRvIHRoZSBjZXJ0aWZpY2F0ZS4gIChUaGlzIG1ha2VzIHNlbnNlCiAgICAgb25seSBmb3IgIlBFTSIgZm9ybWF0IGZpbGVzLCBhcyBjaGFpbnMgYXMgYSB3aG9sZSBhcmUgbm90CiAgICAgREVSLWVuY29kZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN1cHBvcnQgdmVyaWZ5X2RlcHRoIGZyb20gdGhlIFNTTCBBUEkuCiAgICAgeDUwOV92ZnkuYyBoYWQgd2hhdCBjYW4gYmUgY29uc2lkZXJlZCBhbiBvZmYtYnktb25lLWVycm9yOgogICAgIEl0cyBkZXB0aCAod2hpY2ggd2FzIG5vdCBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UpCiAgICAgd2FzIGFjdHVhbGx5IGNvdW50aW5nIHRoZSBudW1iZXIgb2YgY2VydGlmaWNhdGVzIGluIGEgY2hhaW47CiAgICAgbm93IGl0IHJlYWxseSBjb3VudHMgdGhlIGRlcHRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBpbiBjcnlwdG8veDUwOS94NTA5X2NtcC5jOiBUaGUgU1NMZXJyIG1hY3JvIHdhcyB1c2VkCiAgICAgaW5zdGVhZCBvZiBYNTA5ZXJyLCB3aGljaCBvZnRlbiByZXN1bHRlZCBpbiBjb25mdXNpbmcgZXJyb3IKICAgICBtZXNzYWdlcyBzaW5jZSB0aGUgZXJyb3IgY29kZXMgYXJlIG5vdCBnbG9iYWxseSB1bmlxdWUKICAgICAoZS5nLiBhbiBhbGxlZ2VkIGVycm9yIGluIHNzbDNfYWNjZXB0IHdoZW4gYSBjZXJ0aWZpY2F0ZQogICAgIGRpZG4ndCBtYXRjaCB0aGUgcHJpdmF0ZSBrZXkpLgoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IHRoYXQgYWxsb3dzIHRvIHNldCBhIGRlZmF1bHQKICAgICB2YWx1ZSAoc28gdGhhdCB5b3UgZG9uJ3QgbmVlZCBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dCBmb3IgZWFjaAogICAgIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFNTTF9DVFgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9BRVAgZGVjb2RpbmcgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCBJTlNUQUxMX1BSRUZJWCBmb3IgcGFja2FnZSBidWlsZGVycywgYXMgcHJvcG9zZWQgYnkKICAgICBEYXZpZCBIYXJyaXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb25zICJ0aHJlYWRzIiBhbmQgIm5vLXRocmVhZHMiLiAgRm9yIHN5c3RlbXMKICAgICB3aGVyZSB0aGUgcHJvcGVyIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGtub3duIChjdXJyZW50bHkgU29sYXJpcwogICAgIGFuZCBMaW51eCksICJ0aHJlYWRzIiBpcyB0aGUgZGVmYXVsdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc2NyaXB0IHV0aWwvbWtsaW5rLnBsIGFzIGEgZmFzdGVyIHN1YnN0aXR1dGUgZm9yIHV0aWwvbWtsaW5rLnNoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluc3RhbGwgdmFyaW91cyBzY3JpcHRzIHRvICQoT1BFTlNTTERJUikvbWlzYywgbm90IHRvCiAgICAgJChJTlNUQUxMVE9QKS9iaW4gLS0gdGhleSBzaG91bGRuJ3QgY2x1dHRlciBkaXJlY3RvcmllcwogICAgIHN1Y2ggYXMgL3Vzci9sb2NhbC9iaW4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgIm1ha2UgbGludXgtc2hhcmVkIiB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9uIG5vLTxjaXBoZXI+IChyc2EsIGlkZWEsIHJjNSwgLi4uKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHRoZSBQS0NTIzEyIEFQSSBkb2N1bWVudGF0aW9uIHRvIG9wZW5zc2wudHh0LiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvcgogICAgIGV4dGVuc2lvbiBhZGRpbmcgaW4geDUwOSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBOT1BST1RPIHNlY3Rpb25zIGFuZCBlcnJvciBjb2RlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBQYXJ0aWFsIHJld3JpdGUgb2YgdGhlIERFRiBmaWxlIGdlbmVyYXRvciB0byBub3cgcGFyc2UgdGhlIEFOU0kKICAgICBwcm90b3R5cGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAtLXByZWZpeD1ESVIgYW5kIC0tb3BlbnNzbGRpcj1ESVIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGVycm9yIGNvZGUgc2NyaXB0KHMpLiBJdCBpcyBhbGwgbm93IGhhbmRsZWQKICAgICBieSBvbmUgc2NyaXB0IGF0IHRoZSB0b3AgbGV2ZWwgd2hpY2ggaGFuZGxlcyBlcnJvciBjb2RlIGdhdGhlcmluZywKICAgICBoZWFkZXIgcmV3cml0aW5nIGFuZCBDIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24uIEl0IHNob3VsZCBiZSBtdWNoIGJldHRlcgogICAgIHRoYW4gdGhlIG9sZCBtZXRob2Q6IGl0IG5vdyB1c2VzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBVbGYncyBwYXJzZXIgdG8KICAgICByZWFkIHRoZSBBTlNJIHByb3RvdHlwZXMgaW4gYWxsIGhlYWRlciBmaWxlcyAodGh1cyB0aGUgb2xkIEsmUiBkZWZpbml0aW9ucwogICAgIGFyZW4ndCBuZWVkZWQgZm9yIGVycm9yIGNyZWF0aW9uIGFueSBtb3JlKSBhbmQgZG8gYSBiZXR0ZXIgam9iIG9mCiAgICAgdHJhbnNsYXRpbmcgZnVuY3Rpb24gY29kZXMgaW50byBuYW1lcy4gVGhlIG9sZCAnQVNOMSBlcnJvciBjb2RlIGltYmVkZGVkCiAgICAgaW4gYSBjb21tZW50JyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFuZCBpdCBkb2Vzbid0IHVzZSAuZXJyIGZpbGVzIHdoaWNoCiAgICAgaGF2ZSBub3cgYmVlbiBkZWxldGVkLiBBbHNvIHRoZSBlcnJvciBjb2RlIGNhbGwgZG9lc24ndCBoYXZlIHRvIGFwcGVhciBhbGwKICAgICBvbiBvbmUgbGluZSAod2hpY2ggcmVzdWx0ZWQgaW4gc29tZSBsYXJnZSBsaW5lcy4uLikuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlICNpbmNsdWRlIGZpbGVuYW1lcyBmcm9tIDxmb28uaD4gdG8gPG9wZW5zc2wvZm9vLmg+LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBiZWhhdmlvdXIgb2Ygc3NsMl9yZWFkIHdoZW4gZmFjaW5nIGxlbmd0aC0wIHBhY2tldHM6IERvbid0IHJldHVybgogICAgIDAgKHdoaWNoIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2xvc2VkIGNvbm5lY3Rpb24pLCBidXQgY29udGludWUgcmVhZGluZy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggc29tZSByYWNlIGNvbmRpdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGV4dGVuc2lvbi4gQWRkIENlcnRpZmljYXRlCiAgICAgUG9saWNpZXMgYW5kIENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSB0aGUgYXV0b2dlbmVyYXRlZCBoZWFkZXIgZmlsZSBwYXJ0cyB0byBjcnlwdG8vb3BlbnNzbGNvbmYuaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IG5ldyA1Ni1iaXQgREVTIGV4cG9ydCBjaXBoZXJzdWl0ZXM6IHRoZXkgd2VyZSB1c2luZyA3IGJ5dGVzIGluc3RlYWQgb2YKICAgICA4IG9mIGtleWluZyBtYXRlcmlhbC4gTWVybGluIGhhcyBhbHNvIGNvbmZpcm1lZCBpbnRlcm9wIHdpdGggdGhpcyBmaXgKICAgICBiZXR3ZWVuIE9wZW5TU0wgYW5kIEJhbHRpbW9yZSBDL1NTTCAyLjAgYW5kIEovU1NMIDIuMC4KICAgICBbTWVybGluIEh1Z2hlcyA8bWVybGluQGJhbHRpbW9yZS5pZT5dCgogICopIEZpeCBsb3RzIG9mIHdhcm5pbmdzLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgSW4gYWRkX2NlcnRfZGlyKCkgaW4gY3J5cHRvL3g1MDkvYnlfZGlyLmMsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZgogICAgIHRoZSBkaXJlY3Rvcnkgc3BlYyBkaWRuJ3QgZW5kIHdpdGggYSBMSVNUX1NFUEFSQVRPUl9DSEFSLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQogCiAgKikgRml4IHByb2JsZW1zIHdpdGggc2l6ZW9mKGxvbmcpID09IDguCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQ2hhbmdlIGZ1bmN0aW9ucyB0byBBTlNJIEMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB0eXBvcyBpbiBlcnJvciBjb2Rlcy4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT4sIFVsZiBN9mxsZXJdCgogICopIFJlbW92ZSBkZWZ1bmN0IGFzc2VtYmxlciBmaWxlcyBmcm9tIENvbmZpZ3VyZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU1BBUkMgdjggYXNzZW1ibGVyIEJJR05VTSBpbXBsZW1lbnRhdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTdXBwb3J0IGZvciBDZXJ0aWZpY2F0ZSBQb2xpY2llcyBleHRlbnNpb246IGJvdGggcHJpbnQgYW5kIHNldC4KICAgICBWYXJpb3VzIGFkZGl0aW9ucyB0byBzdXBwb3J0IHRoZSByMmkgbWV0aG9kIHRoaXMgdXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGxvdCBvZiBjb25zdGlmaWNhdGlvbiwgYW5kIGZpeCBhIGJ1ZyBpbiBYNTA5X05BTUVfb25lbGluZSgpIHRoYXQgY291bGQKICAgICByZXR1cm4gYSBjb25zdCBzdHJpbmcgd2hlbiB5b3UgYXJlIGV4cGVjdGluZyBhbiBhbGxvY2F0ZWQgYnVmZmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgQVNOMSB0eXBlcyBVVEY4U3RyaW5nIGFuZCBWSVNJQkxFU1RSSU5HLCBhbHNvIHRoZSBDSE9JQ0UKICAgICB0eXBlcyBEaXJlY3RvcnlTdHJpbmcgYW5kIERpc3BsYXlUZXh0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb2RlIHRvIGFsbG93IHIyaSBleHRlbnNpb25zIHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBkYXRhYmFzZSwKICAgICBhZGQgYW4gTEhBU0ggZGF0YWJhc2UgZHJpdmVyIGFuZCBhZGQgc2V2ZXJhbCBjdHggaGVscGVyIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYW4gZXZpbCBidWcgaW4gYm5fZXhwYW5kMigpIHdoaWNoIGNhdXNlZCB2YXJpb3VzIEJOIGZ1bmN0aW9ucyB0bwogICAgIGZhaWwgd2hlbiB0aGV5IGV4dGVuZGVkIHRoZSBzaXplIG9mIGEgQklHTlVNLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIFNYTmV0IGV4dGVuc2lvbi4gTW9kaWZ5IG1rZGVmLnBsIHRvCiAgICAgc3VwcG9ydCB0eXBlc2FmZSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdHlwbyBpbiBTU0xfW2dzXWV0X29wdGlvbnMoKS4KICAgICBbTmlscyBGcm9zdGJlcmcgPG5pbHNAbWVkY29tLnNlPl0KCiAgKikgRGVsZXRlIHZhcmlvdXMgZnVuY3Rpb25zIGFuZCBmaWxlcyB0aGF0IGJlbG9uZ2VkIHRvIHRoZSAobm93IG9ic29sZXRlKQogICAgIG9sZCBYNTA5VjMgaGFuZGxpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiAicnNhcmVmIi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG9uJ3QgYXV0by1nZW5lcmF0ZSBwZW0uaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnRyb2R1Y2UgdHlwZS1zYWZlIEFTTi4xIFNFVHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvbnZlcnQgdmFyaW91cyBhZGRpdGlvbmFsIGNhc3RlZCBzdGFja3MgdG8gdHlwZS1zYWZlIFNUQUNLX09GKCkgdmFyaWFudHMuCiAgICAgW0JlbiBMYXVyaWUsIFJhbGYgUy4gRW5nZWxzY2hhbGwsIFN0ZXZlIEhlbnNvbl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBTVEFDS3MuIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrIGxvdHMgb2YgY29kZQogICAgIHRoYXQgbGlua3Mgd2l0aCBPcGVuU1NMICh3ZWxsIGF0IGxlYXN0IGNhdXNlIGxvdHMgb2Ygd2FybmluZ3MpLCBidXQgZmVhcgogICAgIG5vdDogdGhlIGNvbnZlcnNpb24gaXMgdHJpdmlhbCwgYW5kIGl0IGVsaW1pbmF0ZXMgbG9hZHMgb2YgZXZpbCBjYXN0cy4gQQogICAgIGZldyBTVEFDS2VkIHRoaW5ncyBoYXZlIGJlZW4gY29udmVydGVkIGFscmVhZHkuIEZlZWwgZnJlZSB0byBjb252ZXJ0IG1vcmUuCiAgICAgSW4gdGhlIGZ1bGxuZXNzIG9mIHRpbWUsIEknbGwgZG8gYXdheSB3aXRoIHRoZSBTVEFDSyB0eXBlIGFsdG9nZXRoZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBgb3BlbnNzbCBjYSAtcmV2b2tlIDxjZXJ0ZmlsZT4nIGZhY2lsaXR5IHdoaWNoIHJldm9rZXMgYSBjZXJ0aWZpY2F0ZQogICAgIHNwZWNpZmllZCBpbiA8Y2VydGZpbGU+IGJ5IHVwZGF0aW5nIHRoZSBlbnRyeSBpbiB0aGUgaW5kZXgudHh0IGZpbGUuCiAgICAgVGhpcyB3YXkgb25lIG5vIGxvbmdlciBoYXMgdG8gZWRpdCB0aGUgaW5kZXgudHh0IGZpbGUgbWFudWFsbHkgZm9yCiAgICAgcmV2b2tpbmcgYSBjZXJ0aWZpY2F0ZS4gVGhlIC1yZXZva2Ugb3B0aW9uIGRvZXMgdGhlIGdvcnkgZGV0YWlscyBub3cuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5jYS5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggYG9wZW5zc2wgY3JsIC1ub291dCAtdGV4dCcgY29tYmluYXRpb24gd2hlcmUgYC1ub291dCcga2lsbGVkIHRoZQogICAgIGAtdGV4dCcgb3B0aW9uIGF0IGFsbCBhbmQgdGhpcyB3YXkgdGhlIGAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdhcwogICAgIGluY29uc2lzdGVudCBpbiBgb3BlbnNzbCBjcmwnIHdpdGggdGhlIGZyaWVuZHMgaW4gYG9wZW5zc2wgeDUwOXxyc2F8ZHNhJy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIGEgY29ycmVzcG9uZGluZyBwbGFpbiB0ZXh0IGVycm9yIG1lc3NhZ2UgZXhpc3RzIGZvciB0aGUKICAgICBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRC8yMyBlcnJvciBudW1iZXIgd2hpY2ggY2FuIG9jY3VyIHdoZW4gYQogICAgIHZlcmlmeSBjYWxsYmFjayBmdW5jdGlvbiBkZXRlcm1pbmVkIHRoYXQgYSBjZXJ0aWZpY2F0ZSB3YXMgcmV2b2tlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQnVnZml4OiBJbiB0ZXN0L3Rlc3RlbmMsIGRvbid0IHRlc3QgIm9wZW5zc2wgPGNpcGhlcj4iIGZvcgogICAgIGNpcGhlcnMgdGhhdCB3ZXJlIGV4Y2x1ZGVkLCBlLmcuIGJ5IC1ETk9fSURFQS4gIEFsc28sIHRlc3QKICAgICBhbGwgYXZhaWxhYmxlIGNpcGVycyBpbmNsdWRpbmcgcmM1LCB3aGljaCB3YXMgZm9yZ290dGVuIHVudGlsIG5vdy4KICAgICBJbiBvcmRlciB0byBsZXQgdGhlIHRlc3Rpbmcgc2hlbGwgc2NyaXB0IGtub3cgd2hpY2ggYWxnb3JpdGhtcwogICAgIGFyZSBhdmFpbGFibGUsIGEgbmV3ICh1cCB0byBub3cgdW5kb2N1bWVudGVkKSBjb21tYW5kCiAgICAgIm9wZW5zc2wgbGlzdC1jaXBoZXItY29tbWFuZHMiIGlzIHVzZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBzX2NsaWVudCBvY2Nhc2lvbmFsbHkgd291bGQgc2xlZXAgaW4gc2VsZWN0KCkgd2hlbgogICAgIGl0IHNob3VsZCBoYXZlIGNoZWNrZWQgU1NMX3BlbmRpbmcoKSBmaXJzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIERTQV9kb19zaWduIGFuZCBEU0FfZG9fdmVyaWZ5IHRvIHByb3ZpZGUgYWNjZXNzIHRvCiAgICAgdGhlIHJhdyBEU0EgdmFsdWVzIHByaW9yIHRvIEFTTi4xIGVuY29kaW5nLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBUd2Vha3MgdG8gQ29uZmlndXJlCiAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIEFTTjEgUEJFUzIgc3RydWN0dXJlcy4gTm8gb3RoZXIgc3VwcG9ydCwKICAgICB5ZXQuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgdmFyaWFibGVzICQoUkFOTElCKSBhbmQgJChQRVJMKSBpbiB0aGUgTWFrZWZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBOZXcgY29uZmlnIG9wdGlvbiB0byBhdm9pZCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaWxsZWdhbCBvbiB0aGUgODAzODYuCiAgICAgVGhlIGRlZmF1bHQgY29kZSBpcyBmYXN0ZXIsIGJ1dCByZXF1aXJlcyBhdCBsZWFzdCBhIDQ4Ni4KICAgICBbVWxmIE32bGxlcl0KICAKICAqKSBHb3QgcmlkIG9mIG9sZCBTU0wyX0NMSUVOVF9WRVJTSU9OIChpbmNvbnNpc3RlbnRseSB1c2VkKSBhbmQKICAgICBTU0wyX1NFUlZFUl9WRVJTSU9OIChub3QgdXNlZCBhdCBhbGwpIG1hY3Jvcywgd2hpY2ggYXJlIG5vdyB0aGUKICAgICBzYW1lIGFzIFNTTDJfVkVSU0lPTiBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICItc2hvd2NlcnRzIiBvcHRpb24gZm9yIHNfY2xpZW50LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0aWxsIG1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIHBrY3MxMiBhcHBsaWNhdGlvbiB0byBvcGVuc3NsCiAgICAgYXBwbGljYXRpb24uIFZhcmlvdXMgY2xlYW51cHMgYW5kIGZpeGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkIG5ldyBwa2NzMTIgZGlyZWN0b3J5IHdpdGggTWFrZWZpbGUuc3NsIGFuZAogICAgIG1vZGlmeSBlcnJvciByb3V0aW5lcyB0byB3b3JrIGludGVybmFsbHkuIEFkZCBlcnJvciBjb2RlcyBhbmQgUEJFIGluaXQKICAgICB0byBsaWJyYXJ5IHN0YXJ0dXAgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVydGhlciBQS0NTIzEyIGludGVncmF0aW9uLiBBZGRlZCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uLCBQS0NTIzggYW5kCiAgICAgcGFja2luZyBmdW5jdGlvbnMgdG8gYXNuMSBhbmQgZXZwLiBDaGFuZ2VkIGZ1bmN0aW9uIG5hbWVzIGFuZCBlcnJvcgogICAgIGNvZGVzIGFsb25nIHRoZSB3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUEtDUzEyIGludGVncmF0aW9uOiBhbmQgc28gaXQgYmVnaW5zLi4uIEZpcnN0IG9mIHNldmVyYWwgcGF0Y2hlcyB0bwogICAgIHNsb3dseSBpbnRlZ3JhdGUgUEtDUyMxMiBmdW5jdGlvbmFsaXR5IGludG8gT3BlblNTTC4gQWRkIFBLQ1MjMTIKICAgICBvYmplY3RzIHRvIG9iamVjdHMuaAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAnaW5kZW50JyBvcHRpb24gdG8gc29tZSBYNTA5VjMgZXh0ZW5zaW9uIGNvZGUuIEluaXRpYWwgQVNOMQogICAgIGFuZCBkaXNwbGF5IHN1cHBvcnQgZm9yIFRoYXd0ZSBzdHJvbmcgZXh0cmFuZXQgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBMaW51eFBQQyBzdXBwb3J0LgogICAgIFtKZWZmIER1YnJ1bGUgPGlnb3JAcG9ib3gub3JnPl0KCiAgKikgR2V0IHJpZCBvZiByZWR1bmRhbnQgQk4gZmlsZSBibl9tdWx3LmMsIGFuZCByZW5hbWUgYm5fZGl2NjQgdG8KICAgICBibl9kaXZfd29yZHMgaW4gYWxwaGEucy4KICAgICBbSGFubmVzIFJlaW5lY2tlIDxILlJlaW5lY2tlQGh3LmFjLnVrPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTWFrZSBzdXJlIHRoZSBSU0EgT0FFUCB0ZXN0IGlzIHNraXBwZWQgdW5kZXIgLURSU0FyZWYgYmVjYXVzZQogICAgIE9BRVAgaXNuJ3Qgc3VwcG9ydGVkIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIE1vdmUgZGVmaW5pdGlvbnMgb2YgSVNfU0VUL0lTX1NFUVVFTkNFIGluc2lkZSBjcnlwdG8vYXNuMS9hc24xLmggCiAgICAgc28gdGhleSBubyBsb25nZXIgYXJlIG1pc3NpbmcgdW5kZXIgLUROT1BST1RPLiAKICAgICBbU29yZW4gUy4gSm9ydmFuZyA8c29yZW5AdC5kaz5dCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMWMgYW5kIDAuOS4yYiAgWzIyIE1hciAxOTk5XQoKICAqKSBNYWtlIFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKCkgd29yayBpbiBzZXJ2ZXJzLiBVbmZvcnR1bmF0ZWx5LCBpdCBzdGlsbAogICAgIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBzZXNzaW9uIGlzIHJldXNlZC4gQ29taW5nIHNvb24hCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBhIHNlY3VyaXR5IGhvbGUsIHRoYXQgYWxsb3dzIHNlc3Npb25zIHRvIGJlIHJldXNlZCBpbiB0aGUgd3JvbmcKICAgICBjb250ZXh0IHRodXMgYnlwYXNzaW5nIGNsaWVudCBjZXJ0IHByb3RlY3Rpb24hIEFsbCBzb2Z0d2FyZSB0aGF0IHVzZXMKICAgICBjbGllbnQgY2VydHMgYW5kIHNlc3Npb24gY2FjaGVzIGluIG11bHRpcGxlIGNvbnRleHRzIE5FRURTIFBBVENISU5HIHRvCiAgICAgYWxsb3cgc2Vzc2lvbiByZXVzZSEgQSBmdWxsZXIgc29sdXRpb24gaXMgaW4gdGhlIHdvcmtzLgogICAgIFtCZW4gTGF1cmllLCBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEhvbGdlciBSZWlmLCBCb2RvIE1vZWxsZXIgKGFuZCA/Pz8pXQoKICAqKSBTb21lIG1vcmUgc291cmNlIHRyZWUgY2xlYW51cHMgKHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMKICAgICBjcnlwdG8vYmYvYXNtL2JmNTg2LnBsLCB0ZXN0L3Rlc3QudHh0IGFuZCBjcnlwdG8vc2hhL2FzbS9mLnM7IGNoYW5nZWQKICAgICBwZXJtaXNzaW9uIG9uICJjb25maWciIHNjcmlwdCB0byBiZSBleGVjdXRhYmxlKSBhbmQgYSBmaXggZm9yIHRoZSBJTlNUQUxMCiAgICAgZG9jdW1lbnQuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgc29tZSBsZWdhY3kgYW5kIGVycm9uZW91cyB1c2VzIG9mIG1hbGxvYywgZnJlZSBpbnN0ZWFkIG9mCiAgICAgTWFsbG9jLCBGcmVlLgogICAgIFtMZW5uYXJ0IEJhbmcgPGxvYkBuZXRzdHJlYW0uc2U+LCB3aXRoIG1pbm9yIGNoYW5nZXMgYnkgU3RldmVdCgogICopIE1ha2UgcnNhX29hZXBfdGVzdCByZXR1cm4gbm9uLXplcm8gb24gZXJyb3IuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIFNvbGFyaXMgc2hhcmVkIGxpYnJhcmllcy4gQ29uZmlndXJlCiAgICAgc29sYXJpcy1zcGFyYy1zYzQtcGljLCBtYWtlLCB0aGVuIHJ1biBzaGxpYi9zb2xhcmlzLXNjNC5zaC4gSXQnZCBiZSBuaWNlCiAgICAgaWYgc29tZW9uZSB3b3VsZCBtYWtlIHRoYXQgbGFzdCBzdGVwIGF1dG9tYXRpYy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAQWROb3Z1bS5DSD5dCgogICopIGN0eF9zaXplIHdhcyBub3QgYnVpbHQgd2l0aCB0aGUgcmlnaHQgY29tcGlsZXIgZHVyaW5nICJtYWtlIGxpbmtzIi4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSB0aGUgbWVhbmluZyBvZiAnQUxMJyBpbiB0aGUgY2lwaGVyIGxpc3QuIEl0IG5vdyBtZWFucyAiZXZlcnl0aGluZwogICAgIGV4Y2VwdCBOVUxMIGNpcGhlcnMiLiBUaGlzIG1lYW5zIHRoZSBkZWZhdWx0IGNpcGhlciBsaXN0IHdpbGwgbm8gbG9uZ2VyCiAgICAgZW5hYmxlIE5VTEwgY2lwaGVycy4gVGhleSBuZWVkIHRvIGJlIHNwZWNpZmljYWxseSBlbmFibGVkIGUuZy4gd2l0aAogICAgIHRoZSBzdHJpbmcgIkRFRkFVTFQ6ZU5VTEwiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBSU0EgcHJpdmF0ZSBlbmNyeXB0aW9uIHJvdXRpbmVzOiBpZiBwIDwgcSB0aGVuIGl0IHdvdWxkCiAgICAgb2NjYXNpb25hbGx5IHByb2R1Y2UgYW4gaW52YWxpZCByZXN1bHQuIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoCiAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQga2V5cyBiZWNhdXNlIE9wZW5TU0wgKGFuZCBTU0xlYXkpIGVuc3VyZSBwID4gcS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZSBsZXNzIHJlc3RyaWN0aXZlIGFuZCBhbGxvdyBhbHNvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwKICAgICAvcGF0aC90by9iaW4vcGVybCcgaW4gYWRkaXRpb24gdG8gYHBlcmwgdXRpbC9wZXJscGF0aC5wbCAvcGF0aC90by9iaW4nLAogICAgIGJlY2F1c2UgdGhpcyB3YXkgb25lIGNhbiBhbHNvIHVzZSBhbiBpbnRlcnByZXRlciBuYW1lZCBgcGVybDUnICh3aGljaCBpcwogICAgIHVzdWFsbHkgdGhlIG5hbWUgb2YgUGVybCA1Lnh4eCBvbiBwbGF0Zm9ybXMgd2hlcmUgYW4gUGVybCA0LnggaXMgc3RpbGwKICAgICBpbnN0YWxsZWQgYXMgYHBlcmwnKS4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIExldCB1dGlsL2NsZWFuLWRlcGVuZC5wbCB3b3JrIGFsc28gd2l0aCBvbGRlciBQZXJsIDUuMDB4IHZlcnNpb25zLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgRml4IE1ha2VmaWxlLm9yZyBzbyBDQyxDRkxBRyBldGMgYXJlIHBhc3NlZCB0byAnbWFrZSBsaW5rcycgYWRkCiAgICAgYWR2YXBpMzIubGliIHRvIFdpbjMyIGJ1aWxkIGFuZCBjaGFuZ2UgdGhlIHBlbSB0ZXN0IGNvbXBhcmlzb24KICAgICB0byBmYy5leGUgKHRoYW5rcyB0byBVbHJpY2ggS3JvZW5lciA8a3JvbmVydUB5YWhvby5jb20+IGZvciB0aGUKICAgICBzdWdnZXN0aW9uKS4gRml4IG1pc3BsYWNlZCBBU05JIHByb3RvdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBpbiBldnAuaAogICAgIGFuZCBjcnlwdG8vZGVzL2VkZV9jYmNtX2VuYy5jLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERFUyBxdWFkIGNoZWNrc3VtIHdhcyBicm9rZW4gb24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29tbWVudCBvdXQgdHdvIGZ1bmN0aW9ucyBpbiBiaW8uaCB0aGF0IGFyZW4ndCBpbXBsZW1lbnRlZC4gRml4IHVwIHRoZQogICAgIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZSBzbyBpdCAobWlnaHQpIHdvcmsgYWdhaW4uIFRoZSBXaW4zMiB0ZXN0IGJhdGNoIGZpbGUKICAgICBpcyBob3JyaWJsZTogSSBmZWVsIGlsbC4uLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIHZhcmlvdXMgI2lmZGVmcyBhcm91bmQgc28gTk9fU1lTTE9HLCBOT19ESVJFTlQgZXRjIGFyZSBub3cgc2VsZWN0ZWQKICAgICBpbiBlX29zLmguIEF1ZGl0IG9mIGhlYWRlciBmaWxlcyB0byBjaGVjayBBTlNJIGFuZCBub24gQU5TSQogICAgIHNlY3Rpb25zOiAxMCBmdW5jdGlvbnMgd2VyZSBhYnNlbnQgZnJvbSBub24gQU5TSSBzZWN0aW9uIGFuZCBub3QgZXhwb3J0ZWQKICAgICBmcm9tIFdpbmRvd3MgRExMcy4gRml4ZWQgdXAgbGliZWF5Lm51bSBmb3IgbmV3IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGBvcGVuc3NsIHZlcnNpb24nIG91dHB1dCBsaW5lcyBjb25zaXN0ZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggV2luMzIgc3ltYm9sIGV4cG9ydCBsaXN0cyBmb3IgQklPIGZ1bmN0aW9uczogQWRkZWQKICAgICBCSU9fZ2V0X2V4X25ld19pbmRleCwgQklPX2dldF9leF9udW0sIEJJT19nZXRfZXhfZGF0YSBhbmQgQklPX3NldF9leF9kYXRhCiAgICAgdG8gbXMvbGliZWF5ezE2LDMyfS5kZWYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNlY29uZCByb3VuZCBvZiBmaXhpbmcgdGhlIE9wZW5TU0wgcGVybC8gc3R1ZmYuIEl0IG5vdyBhdCBsZWFzdCBjb21waWxlZAogICAgIGZpbmUgdW5kZXIgVW5peCBhbmQgcGFzc2VzIHNvbWUgdHJpdmlhbCB0ZXN0cyBJJ3ZlIG5vdyBhZGRlZC4gQnV0IHRoZQogICAgIHdob2xlIHN0dWZmIGlzIGhvcnJpYmx5IGluY29tcGxldGUsIHNvIGEgUkVBRE1FLjFTVCB3aXRoIGEgZGlzY2xhaW1lciB3YXMKICAgICBhZGRlZCB0byBtYWtlIHN1cmUgbm8gb25lIGV4cGVjdHMgdGhhdCB0aGlzIHN0dWZmIHJlYWxseSB3b3JrcyBpbiB0aGUKICAgICBPcGVuU1NMIDAuOS4yIHJlbGVhc2UuICBBZGRpdGlvbmFsbHkgSSd2ZSBzdGFydGVkIHRvIGNsZWFuIHRoZSBYUyBzb3VyY2VzCiAgICAgdXAgYW5kIGZpeGVkIGEgZmV3IGxpdHRsZSBidWdzIGFuZCBpbmNvbnNpc3RlbmNpZXMgaW4gT3BlblNTTC57cG0seHN9IGFuZAogICAgIG9wZW5zc2xfYmlvLnhzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGdlbmVyYXRpb24gb2YgdHdvIHBhcnQgYWRkcmVzc2VzIGluIHBlcmwuCiAgICAgW0tlbmppIE1peWFrZSA8a2VuamlAbWl5YWtlLm9yZz4sIGludGVncmF0ZWQgYnkgQmVuIExhdXJpZV0KCiAgKikgQWRkIGNvbmZpZyBlbnRyeSBmb3IgTGludXggb24gTUlQUy4KICAgICBbSm9obiBUb2JleSA8anRvYmV5QGNoYW5uZWwxLmNvbT5dCgogICopIE1ha2UgbGlua3Mgd2hlbmV2ZXIgQ29uZmlndXJlIGlzIHJ1biwgdW5sZXNzIHdlIGFyZSBvbiBXaW5kb3plLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBQZXJtaXQgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0byBDUkxzIHVzaW5nIGNybF9zZWN0aW9uIGluIG9wZW5zc2wuY25mLgogICAgIEN1cnJlbnRseSBvbmx5IGlzc3VlckFsdE5hbWUgYW5kIEF1dGhvcml0eUtleUlkZW50aWZpZXIgbWFrZSBhbnkgc2Vuc2UKICAgICBpbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHVzZWZ1bCBrbHVkZ2UgdG8gYWxsb3cgcGFja2FnZSBtYWludGFpbmVycyB0byBzcGVjaWZ5IGNvbXBpbGVyIGFuZAogICAgIG90aGVyIHBsYXRmb3JtcyBkZXRhaWxzIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aG91dCBoYXZpbmcgdG8gcGF0Y2ggdGhlCiAgICAgQ29uZmlndXJlIHNjcmlwdCBldmVyeXRpbWU6IE9uZSBub3cgY2FuIHVzZSBgYHBlcmwgQ29uZmlndXJlCiAgICAgPGlkPjo8ZGV0YWlscz4nJywgaS5lLiBwbGF0Zm9ybSBpZHMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBkZXRhaWxzIGFwcGVuZGVkCiAgICAgdG8gdGhlbSAoc2VwYXJhdGVkIGJ5IGNvbG9ucykuIFRoaXMgaXMgdHJlYXRlZCBhcyB0aGVyZSB3b3VsZCBiZSBhIHN0YXRpYwogICAgIHByZS1jb25maWd1cmVkIGVudHJ5IGluIENvbmZpZ3VyZSdzICV0YWJsZSB1bmRlciBrZXkgPGlkPiB3aXRoIHZhbHVlCiAgICAgPGRldGFpbHM+IGFuZCBgYHBlcmwgQ29uZmlndXJlIDxpZD4nJyBpcyBjYWxsZWQuICBTbywgd2hlbiB5b3Ugd2FudCB0bwogICAgIHBlcmZvcm0gYSBxdWljayB0ZXN0LWNvbXBpbGUgdW5kZXIgRnJlZUJTRCAzLjEgd2l0aCBwZ2NjIGFuZCB3aXRob3V0CiAgICAgYXNzZW1ibGVyIHN0dWZmIHlvdSBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUgIkZyZWVCU0QtZWxmOnBnY2M6LU82Ojo6IicnCiAgICAgbm93LCB3aGljaCBvdmVycmlkZXMgdGhlIEZyZWVCU0QtZWxmIGVudHJ5IG9uLXRoZS1mbHkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIERpc2FibGUgbmV3IFRMUzEgY2lwaGVyc3VpdGVzIGJ5IGRlZmF1bHQ6IHRoZXkgYXJlbid0IG9mZmljaWFsIHlldC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgRFNPIGZsYWdzIGxpa2UgLWZwaWMsIC1mUElDLCAtS1BJQyBldGMuIHRvIGJlIHNwZWNpZmllZAogICAgIG9uIHRoZSBgcGVybCBDb25maWd1cmUgLi4uJyBjb21tYW5kIGxpbmUuIFRoaXMgd2F5IG9uZSBjYW4gY29tcGlsZQogICAgIE9wZW5TU0wgbGlicmFyaWVzIHdpdGggUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSB3aGljaCBpcyBuZWVkZWQKICAgICBmb3IgbGlua2luZyBpdCBpbnRvIERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbWFya2FibHksIGV4cG9ydCBjaXBoZXJzIHdlcmUgdG90YWxseSBicm9rZW4gYW5kIG5vLW9uZSBoYWQgbm90aWNlZCEKICAgICBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2xlYW5lZCB1cCB0aGUgTElDRU5TRSBkb2N1bWVudDogVGhlIG9mZmljaWFsIGNvbnRhY3QgZm9yIGFueSBsaWNlbnNlCiAgICAgcXVlc3Rpb25zIG5vdyBpcyB0aGUgT3BlblNTTCBjb3JlIHRlYW0gdW5kZXIgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgogICAgIEFuZCBhZGQgYSBwYXJhZ3JhcGggYWJvdXQgdGhlIGR1YWwtbGljZW5zZSBzaXR1YXRpb24gdG8gbWFrZSBzdXJlIHBlb3BsZQogICAgIHJlY29nbml6ZSB0aGF0IF9CT1RIXyB0aGUgT3BlblNTTCBsaWNlbnNlIF9BTkRfIHRoZSBTU0xlYXkgbGljZW5zZSBhcHBseQogICAgIHRvIHRoZSBPcGVuU1NMIHRvb2xraXQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEdlbmVyYWwgc291cmNlIHRyZWUgbWFrZWZpbGUgY2xlYW51cHM6IE1hZGUgYG1ha2luZyB4eHggaW4geXl5Li4uJwogICAgIGRpc3BsYXkgY29uc2lzdGVudCBpbiB0aGUgc291cmNlIHRyZWUgYW5kIHJlcGxhY2VkIGAvYmluL3JtJyBieSBgcm0nLgogICAgIEFkZGl0aW9uYWxseSBjbGVhbmVkIHVwIHRoZSBgbWFrZSBsaW5rcycgdGFyZ2V0OiBSZW1vdmUgdW5uZWNlc3NhcnkKICAgICBzZW1pY29sb25zLCBzdWJzZXF1ZW50IHJlZHVuZGFudCByZW1vdmVzLCBpbmxpbmUgcG9pbnQuc2ggaW50byBta2xpbmsuc2gKICAgICB0byBzcGVlZCBwcm9jZXNzaW5nIGFuZCBubyBsb25nZXIgY2x1dHRlciB0aGUgZGlzcGxheSB3aXRoIGNvbmZ1c2luZwogICAgIHN0dWZmLiBJbnN0ZWFkIG9ubHkgdGhlIGFjdHVhbGx5IGRvbmUgbGlua3MgYXJlIGRpc3BsYXllZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUGVybWl0IG51bGwgZW5jcnlwdGlvbiBjaXBoZXJzdWl0ZXMsIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIG9ubHkuIEl0IHVzZWQKICAgICB0byBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoZSBwcmVwcm9jZXNzb3IgZGVmaW5lIFNTTF9BTExPV19FTlVMTCB0byBkbyB0aGlzLgogICAgIEl0IGlzIG5vdyBuZWNlc3NhcnkgdG8gc2V0IFNTTF9GT1JCSURfRU5VTEwgdG8gcHJldmVudCB0aGUgdXNlIG9mIG51bGwKICAgICBlbmNyeXB0aW9uLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBidW5jaCBvZiBmaXhlcyB0byB0aGUgUEtDUyM3IHN0dWZmLiBJdCB1c2VkIHRvIHNvbWV0aW1lcyByZW9yZGVyCiAgICAgc2lnbmVkIGF0dHJpYnV0ZXMgd2hlbiB2ZXJpZnlpbmcgc2lnbmF0dXJlcyAodGhpcyB3b3VsZCBicmVhayB0aGVtKSwgCiAgICAgdGhlIGRldGFjaGVkIGRhdGEgZW5jb2Rpbmcgd2FzIHdyb25nIGFuZCBwdWJsaWMga2V5cyBvYnRhaW5lZCB1c2luZwogICAgIFg1MDlfZ2V0X3B1YmtleSgpIHdlcmVuJ3QgZnJlZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEJVRkZFUiBmdW5jdGlvbnMuIEFsc28gYWRkZWQgYSB3b3JrIGFyb3VuZAogICAgIHRvIGEgV2luOTUgY29uc29sZSBidWcuIFRoaXMgd2FzIHRyaWdnZXJlZCBieSB0aGUgcGFzc3dvcmQgcmVhZCBzdHVmZjogdGhlCiAgICAgbGFzdCBjaGFyYWN0ZXIgdHlwZWQgZ2V0cyBjYXJyaWVkIG92ZXIgdG8gdGhlIG5leHQgZnJlYWQoKS4gSWYgeW91IHdlcmUgCiAgICAgZ2VuZXJhdGluZyBhIG5ldyBjZXJ0IHJlcXVlc3QgdXNpbmcgJ3JlcScgZm9yIGV4YW1wbGUgdGhlbiB0aGUgbGFzdAogICAgIGNoYXJhY3RlciBvZiB0aGUgcGFzc3BocmFzZSB3b3VsZCBiZSBDUiB3aGljaCB3b3VsZCB0aGVuIGVudGVyIHRoZSBmaXJzdAogICAgIGZpZWxkIGFzIGJsYW5rLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBuZXcgYEluY2x1ZGVzIE9wZW5TU0wgQ3J5cHRvZ3JhcGh5IFNvZnR3YXJlJyBidXR0b24gYXMKICAgICBkb2Mvb3BlbnNzbF9idXR0b24ue2dpZixodG1sfSB3aGljaCBpcyBzaW1pbGFyIGluIHN0eWxlIHRvIHRoZSBvbGQgU1NMZWF5CiAgICAgYnV0dG9uIGFuZCBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgYmFzZWQgb24gT3BlblNTTCB0byBzaG93IHRoZQogICAgIHJlbGF0aW9uc2hpcCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LiAgCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbW92ZSBjb25mdXNpbmcgdmFyaWFibGVzIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXMgaW4gZmlsZXMKICAgICBzc2wvc3NsX2xpYi5jIGFuZCBzc2wvc3NsLmguCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBEb24ndCBpbnN0YWxsIGJzc19maWxlLmMgdW5kZXIgUFJFRklYL2luY2x1ZGUvCiAgICAgW0xlbm5hcnQgQm9uZyA8bG9iQGt1bHRoZWEuc3RhY2tlbi5rdGguc2U+XQoKICAqKSBHZXQgdGhlIFdpbjMyIGNvbXBpbGUgd29ya2luZyBhZ2Fpbi4gTW9kaWZ5IG1rZGVmLnBsIHNvIGl0IGNhbiBoYW5kbGUKICAgICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGhhcyBzdXBwb3J0IGZvciBOVCBzcGVjaWZpYwogICAgIHN0dWZmLiBGaXggbWsxbWYucGwgYW5kIFZDLTMyLnBsIHRvIHN1cHBvcnQgTlQgZGlmZmVyZW5jZXMgYWxzby4gVmFyaW91cwogICAgICNpZmRlZiBXSU4zMiBhbmQgV0lOTlRzIHNwcmlua2xlZCBhYm91dCB0aGUgcGxhY2UgYW5kIHNvbWUgY2hhbmdlcyBmcm9tCiAgICAgdW5zaWduZWQgdG8gc2lnbmVkIHR5cGVzOiB0aGlzIHdhcyBraWxsaW5nIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgY2VydGlmaWNhdGUgZmlsZSB0byBzdGFjayBmdW5jdGlvbnMsCiAgICAgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjaygpIGFuZAogICAgIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkuICBUaGVzZSBsYXJnZWx5IHN1cHBsYW50CiAgICAgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoKSwgYW5kIGNhbiBiZSB1c2VkIHRvIGFkZCBtdWx0aXBsZSBjZXJ0cyBlYXNpbHkKICAgICB0byBhIHN0YWNrICh1c3VhbGx5IHRoaXMgaXMgdGhlbiBoYW5kZWQgdG8gU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoKSkuCiAgICAgVGhpcyBtZWFucyB0aGF0IEFwYWNoZS1TU0wgYW5kIHNpbWlsYXIgcGFja2FnZXMgZG9uJ3QgaGF2ZSB0byBtZXNzIGFyb3VuZAogICAgIHRvIGFkZCBhcyBtYW55IENBcyBhcyB0aGV5IHdhbnQgdG8gdGhlIHByZWZlcnJlZCBsaXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFeHBlcmltZW50IHdpdGggZG94eWdlbiBkb2N1bWVudGF0aW9uLiBDdXJyZW50bHkgb25seSBwYXJ0aWFsbHkgYXBwbGllZCB0bwogICAgIHNzbC9zc2xfbGliLmMuCiAgICAgU2VlIGh0dHA6Ly93d3cuc3RhY2submwvfmRpbWl0cmkvZG94eWdlbi9pbmRleC5odG1sLCBhbmQgcnVuIGRveHlnZW4gd2l0aAogICAgIG9wZW5zc2wuZG94eSBhcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIFtCZW4gTGF1cmllXQogIAogICopIEdldCByaWQgb2YgcmVtYWluaW5nIEMrKy1zdHlsZSBjb21tZW50cyB3aGljaCBzdHJpY3QgQyBjb21waWxlcnMgaGF0ZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgcG9pbnRlZCBvdXQgYnkgQ2FybG9zIEFtZW5ndWFsXQoKICAqKSBDaGFuZ2VkIEJOX1JFQ1VSU0lPTiBpbiBibl9tb250LmMgdG8gQk5fUkVDVVJTSU9OX01PTlQgc28gaXQgaXMgbm90CiAgICAgY29tcGlsZWQgaW4gYnkgZGVmYXVsdDogaXQgaGFzIHByb2JsZW1zIHdpdGggbGFyZ2Uga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBTU0xfeHh4KCkgZnVuY3Rpb25zIGZvciBjb25maWd1cmluZyB0aGUgdGVtcG9yYXJ5IFJTQSBhbmQKICAgICBESCBwcml2YXRlIGtleXMgYW5kL29yIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aGljaCBkaXJlY3RseSBjb3JyZXNwb25kIHRvCiAgICAgdGhlaXIgU1NMX0NUWF94eHgoKSBjb3VudGVycGFydHMgYnV0IHdvcmsgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4gVGhpcwogICAgIGlzIG5lZWRlZCBmb3IgYXBwbGljYXRpb25zIHdoaWNoIGhhdmUgdG8gY29uZmlndXJlIGNlcnRpZmljYXRlcyBvbiBhCiAgICAgcGVyLWNvbm5lY3Rpb24gYmFzaXMgKGUuZy4gQXBhY2hlK21vZF9zc2wpIGluc3RlYWQgb2YgYSBwZXItY29udGV4dCBiYXNpcwogICAgIChlLmcuIHNfc2VydmVyKS4gCiAgICAgICAgRm9yIHRoZSBSU0EgY2VydGlmaWNhdGUgc2l0dWF0aW9uIGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UsIGJ1dAogICAgIGZvciB0aGUgRFNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiB0aGlzIGZpeGVzIHRoZSAibm8gc2hhcmVkIGNpcGhlciIKICAgICBwcm9ibGVtIHdoZXJlIHRoZSBPcGVuU1NMIGNpcGhlciBzZWxlY3Rpb24gcHJvY2VkdXJlIGZhaWxlZCBiZWNhdXNlIHRoZQogICAgIHRlbXBvcmFyeSBrZXlzIHdlcmUgbm90IG92ZXJ0YWtlbiBmcm9tIHRoZSBjb250ZXh0IGFuZCB0aGUgQVBJIHByb3ZpZGVkCiAgICAgbm8gd2F5IHRvIHJlY29uZmlndXJlIHRoZW0uIAogICAgICAgIFRoZSBuZXcgZnVuY3Rpb25zIG5vdyBsZXQgYXBwbGljYXRpb25zIHJlY29uZmlndXJlIHRoZSBzdHVmZiBhbmQgdGhleQogICAgIGFyZSBpbiBkZXRhaWw6IFNTTF9uZWVkX3RtcF9SU0EsIFNTTF9zZXRfdG1wX3JzYSwgU1NMX3NldF90bXBfZGgsCiAgICAgU1NMX3NldF90bXBfcnNhX2NhbGxiYWNrIGFuZCBTU0xfc2V0X3RtcF9kaF9jYWxsYmFjay4gIEFkZGl0aW9uYWxseSBhIG5ldwogICAgIG5vbi1wdWJsaWMtQVBJIGZ1bmN0aW9uIHNzbF9jZXJ0X2luc3RhbnRpYXRlKCkgaXMgdXNlZCBhcyBhIGhlbHBlcgogICAgIGZ1bmN0aW9uIGFuZCBhbHNvIHRvIHJlZHVjZSBjb2RlIHJlZHVuZGFuY3kgaW5zaWRlIHNzbF9yc2EuYy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW92ZSBzX3NlcnZlciAtZGNlcnQgYW5kIC1ka2V5IG9wdGlvbnMgb3V0IG9mIHRoZSB1bmRvY3VtZW50ZWQgZmVhdHVyZQogICAgIGFyZWEgYmVjYXVzZSB0aGV5IGFyZSB1c2VmdWwgZm9yIHRoZSBEU0Egc2l0dWF0aW9uIGFuZCBzaG91bGQgYmUKICAgICByZWNvZ25pemVkIGJ5IHRoZSB1c2Vycy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBjaXBoZXIgZGVjaXNpb24gc2NoZW1lIGZvciBleHBvcnQgY2lwaGVyczogdGhlIGV4cG9ydCBiaXRzIGFyZQogICAgICpub3QqIHdpdGhpbiBTU0xfTUtFWV9NQVNLIG9yIFNTTF9BVVRIX01BU0ssIHRoZXkgYXJlIHdpdGhpbgogICAgIFNTTF9FWFBfTUFTSy4gIFNvLCB0aGUgb3JpZ2luYWwgdmFyaWFibGUgaGFzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKICAgICBhbHJlYWR5IG1hc2tlZCB2YXJpYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRml4ICdwb3J0JyB2YXJpYWJsZSBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGluIGNyeXB0by9iaW8vYl9zb2NrLmMKICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgQ2hhbmdlIHR5cGUgb2YgYW5vdGhlciBtZF9sZW4gdmFyaWFibGUgaW4gcGs3X2RvaXQuYzpQS0NTN19kYXRhRmluYWwoKQogICAgIGZyb20gYGludCcgdG8gYHVuc2lnbmVkIGludCcgYmVjYXVzZSBpdCdzIGEgbGVuZ3RoIGFuZCBpbml0aWFsaXplZCBieQogICAgIEVWUF9EaWdlc3RGaW5hbCgpIHdoaWNoIGV4cGVjdHMgYW4gYHVuc2lnbmVkIGludCAqJy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaGFyZC1jb2RlIHBhdGggdG8gUGVybCBpbnRlcnByZXRlciBvbiBzaGViYW5nIGxpbmUgb2YgQ29uZmlndXJlCiAgICAgc2NyaXB0LiBJbnN0ZWFkIHVzZSB0aGUgdXN1YWwgU2hlbGwtPlBlcmwgdHJhbnNpdGlvbiB0cmljay4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBgb3BlbnNzbCB4NTA5IC1ub291dCAtbW9kdWx1cycgZnVuY3Rpb25hbCBhbHNvIGZvciBEU0EgY2VydGlmaWNhdGVzCiAgICAgKGluIGFkZGl0aW9uIHRvIFJTQSBjZXJ0aWZpY2F0ZXMpIHRvIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgYG9wZW5zc2wgZHNhCiAgICAgLW5vb3V0IC1tb2R1bHVzJyBhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UgZm9yIGBvcGVuc3NsIHJzYSAtbm9vdXQKICAgICAtbW9kdWx1cycuICBGb3IgUlNBIHRoZSAtbW9kdWx1cyBpcyB0aGUgcmVhbCAibW9kdWx1cyIgd2hpbGUgZm9yIERTQQogICAgIGN1cnJlbnRseSB0aGUgcHVibGljIGtleSBpcyBwcmludGVkIChhIGRlY2lzaW9uIHdoaWNoIHdhcyBhbHJlYWR5IGRvbmUgYnkKICAgICBgb3BlbnNzbCBkc2EgLW1vZHVsdXMnIGluIHRoZSBwYXN0KSB3aGljaCBzZXJ2ZXMgYSBzaW1pbGFyIHB1cnBvc2UuCiAgICAgQWRkaXRpb25hbGx5IHRoZSBOT19SU0Egbm8gbG9uZ2VyIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgd2hvbGUgLW1vZHVsdXMKICAgICBvcHRpb247IGl0IG5vdyBvbmx5IGF2b2lkcyB1c2luZyB0aGUgUlNBIHN0dWZmLiBTYW1lIGFwcGxpZXMgdG8gTk9fRFNBCiAgICAgbm93LCB0b28uCiAgICAgW1JhbGYgUy4gIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgQXJuZSBBbnNwZXIncyByZWxpYWJsZSBCSU8gLSB0aGlzIGlzIGFuIGVuY3J5cHRlZCwgYmxvY2stZGlnZXN0ZWQKICAgICBCSU8uIFNlZSB0aGUgc291cmNlIChjcnlwdG8vZXZwL2Jpb19vay5jKSBmb3IgbW9yZSBpbmZvLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBEdW1wIHRoZSBvbGQgeXVja3kgcmVxIGNvZGUgdGhhdCB0cmllZCAoYW5kIGZhaWxlZCkgdG8gYWxsb3cgcmF3IE9JRHMKICAgICB0byBiZSBhZGRlZC4gTm93IGJvdGggJ3JlcScgYW5kICdjYScgY2FuIHVzZSBuZXcgb2JqZWN0cyBkZWZpbmVkIGluIHRoZQogICAgIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb29sIEJJTyB0aGF0IGRvZXMgc3lzbG9nIChvciBldmVudCBsb2cgb24gTlQpLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+LCBpbnRlZ3JhdGVkIGJ5IEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBuZXcgVExTIGNpcGhlcnN1aXRlcywgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDNF81Nl9NRDUsCiAgICAgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX1JDMl9DQkNfNTZfTUQ1IGFuZAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9ERVNfQ0JDX1NIQSwgYXMgc3BlY2lmaWVkIGluICI1Ni1iaXQgRXhwb3J0IENpcGhlcgogICAgIFN1aXRlcyBGb3IgVExTIiwgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMC50eHQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBwcmVsaW1pbmFyeSBjb25maWcgaW5mbyBmb3IgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUlNBX05PX1BBRERJTkcgcmVhbGx5IHVzZSBubyBwYWRkaW5nLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgR2VuZXJhdGUgZXJyb3JzIHdoZW4gcHJpdmF0ZS9wdWJsaWMga2V5IGNoZWNrIGlzIGRvbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE92ZXJoYXVsIGZvciAnY3JsJyB1dGlsaXR5LiBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfcHJpbnQuIFBhcnRpYWwgc3VwcG9ydAogICAgIGZvciBzb21lIENSTCBleHRlbnNpb25zIGFuZCBuZXcgb2JqZWN0cyBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWFsbHkgZml4IHRoZSBBU04xIElNUExJQ0lUIGJ1ZyB0aGlzIHRpbWUuLi4gUGFydGlhbCBzdXBwb3J0IGZvciBwcml2YXRlCiAgICAga2V5IHVzYWdlIGV4dGVuc2lvbiBhbmQgZnVsbGVyIHN1cHBvcnQgZm9yIGF1dGhvcml0eSBrZXkgaWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIE9BRVAgZW5jcnlwdGlvbiBmb3IgdGhlIE9wZW5TU0wgY3J5cHRvIGxpYnJhcnkuIE9BRVAgaXMgdGhlIGltcHJvdmVkCiAgICAgcGFkZGluZyBtZXRob2QgZm9yIFJTQSwgd2hpY2ggaXMgcmVjb21tZW5kZWQgZm9yIG5ldyBhcHBsaWNhdGlvbnMgaW4gUEtDUwogICAgICMxIHYyLjAgKFJGQyAyNDM3LCBPY3RvYmVyIDE5OTgpLgogICAgIE9BRVAgKE9wdGltYWwgQXN5bW1ldHJpYyBFbmNyeXB0aW9uIFBhZGRpbmcpIGhhcyBiZXR0ZXIgdGhlb3JldGljYWwKICAgICBmb3VuZGF0aW9ucyB0aGFuIHRoZSBhZC1ob2MgcGFkZGluZyB1c2VkIGluIFBLQ1MgIzEgdjEuNS4gSXQgaXMgc2VjdXJlCiAgICAgYWdhaW5zdCBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUlNBLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPiwgcmVmb3JtYXR0ZWQsIGNvcnJlY3RlZCBhbmQgaW50ZWdyYXRlZCBieQogICAgICBCZW4gTGF1cmllXQoKICAqKSBVcGRhdGVzIHRvIHRoZSBuZXcgU1NMIGNvbXByZXNzaW9uIGNvZGUKICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBGaXggc28gdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG1hc3RlciBzZWNyZXQsIHdoZW4gcGFzc2VkCiAgICAgdmlhIFJTQSwgY2hlY2tzIHRoYXQgaWYgVExTIHdhcyBwcm9wb3NlZCwgYnV0IHdlIHJvbGwgYmFjayB0byBTU0x2MwogICAgIChiZWNhdXNlIHRoZSBzZXJ2ZXIgd2lsbCBub3QgYWNjZXB0IGhpZ2hlciksIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgaXMgMHgwMywweDAxLCBub3QgMHgwMywweDAwCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgUnVuIGV4dGVuc2l2ZSBtZW1vcnkgbGVhayBjaGVja3Mgb24gU1NMIGFwcHMuIEZpeGVkICpsb3RzKiBvZiBtZW1vcnkKICAgICBsZWFrcyBpbiBzc2wvIHJlbGF0aW5nIHRvIG5ldyBYNTA5X2dldF9wdWJrZXkoKSBiZWhhdmlvdXIuIEFsc28gZml4ZXMKICAgICBpbiBhcHBzLyBhbmQgYW4gdW5yZWxhdGVkIGxlYWsgaW4gY3J5cHRvL2RzYS9kc2FfdnJmLmMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBSQVcgZXh0ZW5zaW9ucyB3aGVyZSBhbiBhcmJpdHJhcnkgZXh0ZW5zaW9uIGNhbiBiZQogICAgIGNyZWF0ZWQgYnkgaW5jbHVkaW5nIGl0cyBERVIgZW5jb2RpbmcuIFNlZSBhcHBzL29wZW5zc2wuY25mIGZvcgogICAgIGFuIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBzdXJlIGxhdGVzdCBQZXJsIHZlcnNpb25zIGRvbid0IGludGVycHJldCBzb21lIGdlbmVyYXRlZCBDIGFycmF5CiAgICAgY29kZSBhcyBQZXJsIGFycmF5IGNvZGUgaW4gdGhlIGNyeXB0by9lcnIvZXJyX2dlbmMucGwgc2NyaXB0LgogICAgIFtMYXJzIFdlYmVyIDwzd2ViZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIE1vZGlmeSBtcy9kb19tcy5iYXQgdG8gbm90IGdlbmVyYXRlIGFzc2VtYmx5IGxhbmd1YWdlIG1ha2VmaWxlcyBzaW5jZQogICAgIG5vdCBtYW55IHBlb3BsZSBoYXZlIHRoZSBhc3NlbWJsZXIuIFZhcmlvdXMgV2luMzIgY29tcGlsYXRpb24gZml4ZXMgYW5kCiAgICAgdXBkYXRlIHRvIHRoZSBJTlNUQUxMLlczMiBmaWxlIHdpdGggKGhvcGVmdWxseSkgbW9yZSBhY2N1cmF0ZSBXaW4zMgogICAgIGJ1aWxkIGluc3RydWN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29uZmlndXJlIHNjcmlwdCAnQ29uZmlndXJlJyB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBjcnlwdG8vZGF0ZS5oCiAgICAgZmlsZSB1bmRlciBXaW4zMiBhbmQgYWxzbyBidWlsZCBwZW0uaCBmcm9tIHBlbS5vcmcuIE5ldyBzY3JpcHQKICAgICB1dGlsL21rZmlsZXMucGwgdG8gY3JlYXRlIHRoZSBNSU5GTyBmaWxlIG9uIGVudmlyb25tZW50cyB0aGF0IGNhbid0IGRvIGEKICAgICAnbWFrZSBmaWxlcyc6IHBlcmwgdXRpbC9ta2ZpbGVzLnBsID5NSU5GTyBzaG91bGQgd29yay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWpvciByZXdvcmsgb2YgREVTIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgaW4gdGhlIHB1cnN1aXQgb2YgY29ycmVjdG5lc3MKICAgICBhbmQgcHVyaXR5LiBBcyBhIHJlc3VsdCwgbWFueSBldmlsIGNhc3RzIGV2YXBvcmF0ZWQsIGFuZCBzb21lIHdlaXJkbmVzcywKICAgICB0b28uIFlvdSBtYXkgZmluZCB0aGlzIGNhdXNlcyB3YXJuaW5ncyBpbiB5b3VyIGNvZGUuIFphcHBpbmcgeW91ciBldmlsCiAgICAgY2FzdHMgd2lsbCBwcm9iYWJseSBmaXggdGhlbS4gTW9zdGx5LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGEgdHlwbyBpbiBhc24xLmguIEJ1ZyBmaXggdG8gb2JqZWN0IGNyZWF0aW9uIHNjcmlwdAogICAgIG9ial9kYXQucGwuIEl0IGNvbnNpZGVyZWQgYSB6ZXJvIGluIGFuIG9iamVjdCBkZWZpbml0aW9uIHRvIG1lYW4KICAgICAiZW5kIG9mIG9iamVjdCI6IG5vbmUgb2YgdGhlIG9iamVjdHMgaW4gb2JqZWN0cy5oIGhhdmUgYW55IHplcm9zCiAgICAgc28gaXQgd2Fzbid0IHNwb3R0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRXJ3YW5uIEFCQUxFQSA8ZWFiYWxlYUBjZXJ0cGx1cy5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgVHJpcGxlIERFUyBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgd2l0aCBPdXRwdXQgRmVlZGJhY2sKICAgICBNYXNraW5nIChDQkNNKS4gSW4gdGhlIGFic2VuY2Ugb2YgdGVzdCB2ZWN0b3JzLCB0aGUgYmVzdCBJIGhhdmUgYmVlbiBhYmxlCiAgICAgdG8gZG8gaXMgY2hlY2sgdGhhdCB0aGUgZGVjcnlwdCB1bmRvZXMgdGhlIGVuY3J5cHQsIHNvIGZhci4gU2VuZCBtZSB0ZXN0CiAgICAgdmVjdG9ycyBpZiB5b3UgaGF2ZSB0aGVtLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb3JyZWN0IGNhbGN1bGF0aW9uIG9mIGtleSBsZW5ndGggZm9yIGV4cG9ydCBjaXBoZXJzICh0b28gbXVjaCBzcGFjZSB3YXMKICAgICBhbGxvY2F0ZWQgZm9yIG51bGwgY2lwaGVycykuIFRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTW9kaWZpY2F0aW9ucyB0byB0aGUgbWtkZWYucGwgZm9yIFdpbjMyIERFRiBmaWxlIGNyZWF0aW9uLiBUaGUgdXNhZ2UKICAgICBtZXNzYWdlIGlzIG5vdyBjb3JyZWN0IChpdCB1bmRlcnN0YW5kcyAiY3J5cHRvIiBhbmQgInNzbCIgb24gaXRzCiAgICAgY29tbWFuZCBsaW5lKS4gVGhlcmUgaXMgYWxzbyBub3cgYW4gInVwZGF0ZSIgb3B0aW9uLiBUaGlzIHdpbGwgdXBkYXRlCiAgICAgdGhlIHV0aWwvc3NsZWF5Lm51bSBhbmQgdXRpbC9saWJlYXkubnVtIGZpbGVzIHdpdGggYW55IG5ldyBmdW5jdGlvbnMuCiAgICAgSWYgeW91IGRvIGE6IAogICAgIHBlcmwgdXRpbC9ta2RlZi5wbCBjcnlwdG8gc3NsIHVwZGF0ZQogICAgIGl0IHdpbGwgdXBkYXRlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3ZlcmhhdWxlZCB0aGUgUGVybCBpbnRlcmZhY2UgKHBlcmwvKik6CiAgICAgLSBwb3J0ZWQgQk4gc3R1ZmYgdG8gT3BlblNTTCdzIGRpZmZlcmVudCBCTiBsaWJyYXJ5CiAgICAgLSBtYWRlIHRoZSBwZXJsLyBzb3VyY2UgdHJlZSBDVlMtYXdhcmUKICAgICAtIHJlbmFtZWQgdGhlIHBhY2thZ2UgZnJvbSBTU0xlYXkgdG8gT3BlblNTTCAodGhlIGZpbGVzIHN0aWxsIGNvbnRhaW4KICAgICAgIHRoZWlyIGhpc3RvcnkgYmVjYXVzZSBJJ3ZlIGNvcGllZCB0aGVtIGluIHRoZSByZXBvc2l0b3J5KQogICAgIC0gcmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcyAodGhlIHRlc3Qgc2NyaXB0cyB3aWxsIGJlIHJlcGxhY2VkCiAgICAgICBieSBiZXR0ZXIgVGVzdDo6SGFybmVzcyB2YXJpYW50cyBpbiB0aGUgZnV0dXJlKQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXJzdCBjdXQgZm9yIGEgdmVyeSBjb25zZXJ2YXRpdmUgc291cmNlIHRyZWUgY2xlYW51cDoKICAgICAxLiBtZXJnZSB2YXJpb3VzIG9ic29sZXRlIHJlYWRtZSB0ZXh0cyBpbnRvIGRvYy9zc2xlYXkudHh0CiAgICAgd2hlcmUgd2UgY29sbGVjdCB0aGUgb2xkIGRvY3VtZW50cyBhbmQgcmVhZG1lIHRleHRzLgogICAgIDIuIHJlbW92ZSB0aGUgZmlyc3QgcGFydCBvZiBmaWxlcyB3aGVyZSBJJ20gYWxyZWFkeSBzdXJlIHRoYXQgd2Ugbm8KICAgICBsb25nZXIgbmVlZCB0aGVtIGJlY2F1c2Ugb2YgdGhyZWUgcmVhc29uczogZWl0aGVyIHRoZXkgYXJlIGp1c3QgdGVtcG9yYXJ5CiAgICAgZmlsZXMgd2hpY2ggd2VyZSBsZWZ0IGJ5IEVyaWMgb3IgdGhleSBhcmUgcHJlc2VydmVkIG9yaWdpbmFsIGZpbGVzIHdoZXJlCiAgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IHRoZSBkaWZmIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoZSBDVlMgdmlhICJjdnMgZGlmZgogICAgIC1yU1NMZWF5XzBfOF8xYiIgb3IgdGhleSB3ZXJlIHJlbmFtZWQgKGFzIGl0IHdhcyBkZWZpbml0ZWx5IHRoZSBjYXNlIGZvcgogICAgIHRoZSBjcnlwdG8vbWQvIHN0dWZmKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTW9yZSBleHRlbnNpb24gY29kZS4gSW5jb21wbGV0ZSBzdXBwb3J0IGZvciBzdWJqZWN0IGFuZCBpc3N1ZXIgYWx0CiAgICAgbmFtZSwgaXNzdWVyIGFuZCBhdXRob3JpdHkga2V5IGlkLiBDaGFuZ2UgdGhlIGkydiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgYW5kIGFkZCBhbiBleHRyYSAnY3JsJyBwYXJhbWV0ZXIgaW4gdGhlIFg1MDlWM19DVFggc3RydWN0dXJlOiBndWVzcwogICAgIHdoYXQgdGhhdCdzIGZvciA6LSkgRml4IHRvIEFTTjEgbWFjcm8gd2hpY2ggbWVzc2VkIHVwCiAgICAgSU1QTElDSVQgdGFnIGFuZCBhZGQgZl9lbnVtLmMgd2hpY2ggYWRkcyBhMmksIGkyYSBmb3IgRU5VTUVSQVRFRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBFTlVNRVJBVEVEIHR5cGUuIFRoaXMgaXMgbGFyZ2VseSBjb3BpZWQgZnJvbSB0aGUKICAgICBJTlRFR0VSIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiwgRVZQX01EX0NUWF9jb3B5KCkgdG8gcmVwbGFjZSBmcmVxdWVudCB1c2Ugb2YgbWVtY3B5LgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIE1ha2Ugc3VyZSBgbWFrZSByZWhhc2gnIHRhcmdldCByZWFsbHkgZmluZHMgdGhlIGBvcGVuc3NsJyBwcm9ncmFtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgU3F1ZWV6ZSBhbm90aGVyIDclIG9mIHNwZWVkIG91dCBvZiBNRDUgYXNzZW1ibGVyLCBhdCBsZWFzdCBvbiBhIFAyLiBJJ2QKICAgICBsaWtlIHRvIGhlYXIgYWJvdXQgaXQgaWYgdGhpcyBzbG93cyBkb3duIG90aGVyIHByb2Nlc3NvcnMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBDeWdXaW4zMiBwbGF0Zm9ybSBpbmZvcm1hdGlvbiB0byBDb25maWd1cmUgc2NyaXB0LgogICAgIFtBbGFuIEJhdGllIDxiYXRpZUBhYWh6LmpmLmludGVsLmNvbT5dCgogICopIEZpeGVkIG1zLzMyYWxsLmJhdCBzY3JpcHQ6IGBub19hc20nIC0+IGBuby1hc20nCiAgICAgW1JhaW5lciBXLiBHZXJsaW5nIDxnZXJsaW5nQG1wZy1ndi5tcGcuZGU+XQogIAogICopIE5ldyBwcm9ncmFtIG5zZXEgdG8gbWFuaXB1bGF0ZSBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY3JsMnBrY3M3IHNvIGl0IHN1cHBvcnRzIG11bHRpcGxlIC1jZXJ0ZmlsZSBhcmd1bWVudHMuIEZpeCBhCiAgICAgZmV3IHR5cG9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIEJOIGNvZGUuICBQcmV2aW91c2x5IHRoZSBkZWZhdWx0IHdhcyB0byBkZWZpbmUgQk5fUkVDVVJTSU9OCiAgICAgYnV0IHRoZSBCTiBjb2RlIGhhZCBzb21lIHByb2JsZW1zIHRoYXQgd291bGQgY2F1c2UgZmFpbHVyZXMgd2hlbgogICAgIGRvaW5nIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMuCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgQWRkIEFTTjEgYW5kIFBFTSBjb2RlIHRvIHN1cHBvcnQgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2V2ZXJhbCBQS0lYIGFuZCBwcml2YXRlIGV4dGVuZGVkIGtleSB1c2FnZSBPSURzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgJ2NhJyBwcm9ncmFtIHRvIGhhbmRsZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLiBNb2RpZnkKICAgICBvcGVuc3NsLmNuZiBmb3IgbmV3IGV4dGVuc2lvbiBmb3JtYXQsIGFkZCBjb21tZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFg1MDkgVjMgY2hhbmdlcy4gRml4IHR5cG8gaW4gdjNfYml0c3RyLmMuIEFkZCBzdXBwb3J0IHRvICdyZXEnCiAgICAgYW5kIGFkZCBhIHNhbXBsZSB0byBvcGVuc3NsLmNuZiBzbyByZXEgLXg1MDkgbm93IGFkZHMgYXBwcm9wcmlhdGUKICAgICBDQSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVlZCBYNTA5IFYzIGNoYW5nZXMuIEFkZCB0byBvdGhlciBtYWtlZmlsZXMsIGludGVncmF0ZSB3aXRoIHRoZQogICAgIGVycm9yIGNvZGUsIGFkZCBpbml0aWFsIHN1cHBvcnQgdG8gWDUwOV9wcmludCgpIGFuZCB4NTA5IGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRha2VzIGEgZGVlcCBicmVhdGggYW5kIHN0YXJ0IGFkZGluZyBYNTA5IFYzIGV4dGVuc2lvbiBzdXBwb3J0IGNvZGUuIEFkZAogICAgIGZpbGVzIGluIGNyeXB0by94NTA5djMuIE1vdmUgb3JpZ2luYWwgc3R1ZmYgdG8gY3J5cHRvL3g1MDl2My9vbGQuIEFsbCB0aGlzCiAgICAgc3R1ZmYgaXMgY3VycmVudGx5IGlzb2xhdGVkIGFuZCBpc24ndCBldmVuIGNvbXBpbGVkIHlldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51aW5nIHBhdGNoZXMgZm9yIEdlbmVyYWxpemVkVGltZS4gRml4IHVwIGNlcnRpZmljYXRlIGFuZCBDUkwKICAgICBBU04xIHRvIHVzZSBBU04xX1RJTUUgYW5kIG1vZGlmeSBwcmludCByb3V0aW5lcyB0byB1c2UgQVNOMV9USU1FX3ByaW50LgogICAgIFJlbW92ZWQgdGhlIHZlcnNpb25zIGNoZWNrIGZyb20gWDUwOSByb3V0aW5lcyB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9uczoKICAgICB0aGlzIGFsbG93cyBjZXJ0YWluIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBkb24ndCBzZXQgdGhlIHZlcnNpb24KICAgICBwcm9wZXJseSB0byBiZSBwcm9jZXNzZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVhbCB3aXRoIGlycml0YXRpbmcgc2hpdCB0byBkbyB3aXRoIGRlcGVuZGVuY2llcywgaW4gWUFBSFcgKFlldCBBbm90aGVyCiAgICAgQWQgSG9jIFdheSkgLSBNYWtlZmlsZS5zc2xzIG5vdyBhbGwgY29udGFpbiBsb2NhbCBkZXBlbmRlbmNpZXMsIHdoaWNoCiAgICAgY2FuIHN0aWxsIGJlIHJlZ2VuZXJhdGVkIHdpdGggIm1ha2UgZGVwZW5kIi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3BlbGxpbmcgbWlzdGFrZSBpbiBDIHZlcnNpb24gb2YgQ0FTVC0xMjguCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IEplcmVteSBIeWx0b24gPGplcmVteUBjbnJpLnJlc3Rvbi52YS51cz5dCgogICopIENoYW5nZXMgdG8gdGhlIGVycm9yIGdlbmVyYXRpb24gY29kZS4gVGhlIHBlcmwgc2NyaXB0IGVyci1jb2RlLnBsIAogICAgIG5vdyByZWFkcyBpbiB0aGUgb2xkIGVycm9yIGNvZGVzIGFuZCByZXRhaW5zIHRoZSBvbGQgbnVtYmVycywgb25seQogICAgIGFkZGluZyBuZXcgb25lcyBpZiBuZWNlc3NhcnkuIEl0IGFsc28gb25seSBjaGFuZ2VzIHRoZSAuZXJyIGZpbGVzIGlmIG5ldwogICAgIGNvZGVzIGFyZSBhZGRlZC4gVGhlIG1ha2VmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gb25seSBpbnNlcnQgZXJyb3JzCiAgICAgd2hlbiBuZWVkZWQgKHRvIGF2b2lkIG5lZWRsZXNzbHkgbW9kaWZ5aW5nIGhlYWRlciBmaWxlcykuIFRoaXMgaXMgZG9uZQogICAgIGJ5IG9ubHkgaW5zZXJ0aW5nIGVycm9ycyBpZiB0aGUgLmVyciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGF1dG8gZ2VuZXJhdGVkCiAgICAgQyBmaWxlLiBUbyByZWJ1aWxkIGFsbCB0aGUgZXJyb3IgY29kZXMgZnJvbSBzY3JhdGNoICh0aGUgb2xkIGJlaGF2aW91cikKICAgICBlaXRoZXIgbW9kaWZ5IGNyeXB0by9NYWtlZmlsZS5zc2wgdG8gcGFzcyB0aGUgLXJlZ2VuIGZsYWcgdG8gZXJyX2NvZGUucGwKICAgICBvciBkZWxldGUgYWxsIHRoZSAuZXJyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENBU1QtMTI4IHdhcyBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBmb3Igc2hvcnQga2V5cy4gVGhlIEMgdmVyc2lvbiBoYXMKICAgICBiZWVuIGZpeGVkLCBidXQgaXMgdW50ZXN0ZWQuIFRoZSBhc3NlbWJsZXIgdmVyc2lvbnMgYXJlIGFsc28gZml4ZWQsIGJ1dAogICAgIG5ldyBhc3NlbWJsZXIgSEFTIE5PVCBCRUVOIEdFTkVSQVRFRCBGT1IgV0lOMzIgLSB0aGUgTWFrZWZpbGUgbmVlZHMgZml4aW5nCiAgICAgdG8gcmVnZW5lcmF0ZSBpdCBpZiBuZWVkZWQuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkICh3aXRoIGZpeCBmb3IgQyB2ZXJzaW9uKSBieSBKdW4taWNoaXJvIGl0b2p1bgogICAgICBIYWdpbm8gPGl0b2p1bkBrYW1lLm5ldD5dCgogICopIEZpbGUgd2FzIG9wZW5lZCBpbmNvcnJlY3RseSBpbiByYW5kZmlsZS5jLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBCZWdpbm5pbmcgb2Ygc3VwcG9ydCBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBkMmksIGkyZCwgY2hlY2sgYW5kIHByaW50CiAgICAgZnVuY3Rpb25zLiBBbHNvIEFTTjFfVElNRSBzdWl0ZSB3aGljaCBpcyBhIENIT0lDRSBvZiBVVENUaW1lIG9yCiAgICAgR2VuZXJhbGl6ZWRUaW1lLiBBU04xX1RJTUUgaXMgdGhlIHByb3BlciB0eXBlIHVzZWQgaW4gY2VydGlmaWNhdGVzIGV0CiAgICAgYWw6IGl0J3MganVzdCBhbG1vc3QgYWx3YXlzIGEgVVRDVGltZS4gTm90ZSB0aGlzIHBhdGNoIGFkZHMgbmV3IGVycm9yCiAgICAgY29kZXMgc28gZG8gYSAibWFrZSBlcnJvcnMiIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3JyZWN0IExpbnV4IDEgcmVjb2duaXRpb24gaW4gY29uZmlnLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgcG9pbnRsZXNzIE1ENSBoYXNoIHdoZW4gdXNpbmcgRFNBIGtleXMgaW4gY2EuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBHZW5lcmF0ZSBhbiBlcnJvciBpZiBnaXZlbiBhbiBlbXB0eSBzdHJpbmcgYXMgYSBjZXJ0IGRpcmVjdG9yeS4gQWxzbwogICAgIGdlbmVyYXRlIGFuIGVycm9yIGlmIGhhbmRlZCBOVUxMIChwcmV2aW91c2x5IHJldHVybmVkIDAgdG8gaW5kaWNhdGUgYW4KICAgICBlcnJvciwgYnV0IGRpZG4ndCBzZXQgb25lKS4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFNTTCBtZXRob2RzLiBNYWtlIFNTTF93cml0ZSdzIGJ1ZmZlciBjb25zdCwgYXQgbGFzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBkdW1teSBmdW5jdGlvbiBCTl9yZWZfbW9kX2V4cCgpIGluIHJzYXJlZi5jIHRvIGhhdmUgdGhlIGNvcnJlY3QKICAgICBwYXJhbWV0ZXJzLiBUaGlzIHdhcyBjYXVzaW5nIGEgd2FybmluZyB3aGljaCBraWxsZWQgb2ZmIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBDKysgc3R5bGUgY29tbWVudHMgZnJvbSBjcnlwdG8vYm4vYm5fbG9jYWwuaC4KICAgICBbTmVpbCBDb3N0aWdhbiA8bmVpbC5jb3N0aWdhbkBjZWxvY29tLmNvbT5dCgogICopIFRoZSBmdW5jdGlvbiBPQkpfdHh0Mm5pZCB3YXMgYnJva2VuLiBJdCB3YXMgc3VwcG9zZWQgdG8gcmV0dXJuIGEgbmlkCiAgICAgYmFzZWQgb24gYSB0ZXh0IHN0cmluZywgbG9va2luZyB1cCBzaG9ydCBhbmQgbG9uZyBuYW1lcyBhbmQgZmluYWxseQogICAgICJkb3QiIGZvcm1hdC4gVGhlICJkb3QiIGZvcm1hdCBzdHVmZiBkaWRuJ3Qgd29yay4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgT0JKX3R4dDJvYmogdG8gZG8gdGhlIHNhbWUgYnV0IHJldHVybiBhbiBBU04xX09CSkVDVCBhbmQgcmV3cm90ZSAKICAgICBPQkpfdHh0Mm5pZCB0byB1c2UgaXQuIE9CSl90eHQyb2JqIGNhbiBhbHNvIHJldHVybiBvYmplY3RzIGV2ZW4gaWYgdGhlCiAgICAgT0lEIGlzIG5vdCBwYXJ0IG9mIHRoZSB0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdG90eXBlcyB0byBYNTA5IGxvb2t1cC92ZXJpZnkgbWV0aG9kcywgZml4aW5nIGEgYnVnIGluCiAgICAgWDUwOV9MT09LVVBfYnlfYWxpYXMoKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU29ydCBvcGVuc3NsIGZ1bmN0aW9ucyBieSBuYW1lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZXQgdGhlIGdlbmRzYSBwcm9ncmFtIHdvcmtpbmcgKGhvcGVmdWxseSkgYW5kIGFkZCBpdCB0byBhcHAgbGlzdC4gUmVtb3ZlCiAgICAgZW5jcnlwdGlvbiBmcm9tIHNhbXBsZSBEU0Ega2V5cyAoaW4gY2FzZSBhbnlvbmUgaXMgaW50ZXJlc3RlZCB0aGUgcGFzc3dvcmQKICAgICB3YXMgIjEyMzQiKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIF9hbGxfICpfZnJlZSBmdW5jdGlvbnMgYWNjZXB0IGEgTlVMTCBwb2ludGVyLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+XQoKICAqKSBJZiBhIERIIGtleSBpcyBnZW5lcmF0ZWQgaW4gczNfc3J2ci5jLCBkb24ndCBibG93IGl0IGJ5IHRyeWluZyB0byB1c2UKICAgICBOVUxMIHBvaW50ZXJzLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgc19zZXJ2ZXIgc2hvdWxkIHNlbmQgdGhlIENBZmlsZSBhcyBhY2NlcHRhYmxlIENBcywgbm90IGl0cyBvd24gY2VydC4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgRG9uJ3QgYmxvdyBpdCBmb3IgbnVtZXJpYyAtbmV3a2V5IGFyZ3VtZW50cyB0byBhcHBzL3JlcS4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgVGVtcCBrZXkgImZvciBleHBvcnQiIHRlc3RzIHdlcmUgd3JvbmcgaW4gczNfc3J2ci5jLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZSBmb3IgdGVtcCBrZXkgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgU1NMX0NUWF9zZXRfdG1wX3tyc2EsZGh9X2NhbGxiYWNrKCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREhfZnJlZSgpIHRvbGVyYXRlIGJlaW5nIHBhc3NlZCBhIE5VTEwgcG9pbnRlciAobGlrZSBSU0FfZnJlZSgpIGFuZAogICAgIERTQV9mcmVlKCkpLiBNYWtlIFg1MDlfUFVCS0VZX3NldCgpIGNoZWNrIGZvciBlcnJvcnMgaW4gZDJpX1B1YmxpY0tleSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFg1MDlfbmFtZV9hZGRfZW50cnkoKSBmcmVlZCB0aGUgd3JvbmcgdGhpbmcgYWZ0ZXIgYW4gZXJyb3IuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIHJzYV9lYXkuYyB3b3VsZCBhdHRlbXB0IHRvIGZyZWUgYSBOVUxMIGNvbnRleHQuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19zX3NvY2tldCgpIGhhZCBhIGJyb2tlbiBzaG91bGRfcmV0cnkoKSBvbiBXaW5kb3plLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBCSU9fZl9idWZmZXIoKSBkaWRuJ3QgcGFzcyBvbiBCSU9fQ1RSTF9GTFVTSC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgTWFrZSBzdXJlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIFg1MDlfU1RPUkUtPmRlcHRoIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkCiAgICAgaW4gWDUwOV9TVE9SRV9uZXcoKSwgYnV0IGRvY3VtZW50IHRoZSBmYWN0IHRoYXQgdGhpcyB2YXJpYWJsZSBpcyBzdGlsbAogICAgIHVudXNlZCBpbiB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgdmFyaW91cyBsaWJyYXJ5IGFuZCBhcHBzIGZpbGVzIHRvIGZyZWUgdXAgcGtleXMgb2J0YWluZWQgZnJvbQogICAgIFg1MDlfUFVCS0VZX2dldCgpIGV0IGFsLiBBbHNvIGFsbG93IHg1MDkuYyB0byBoYW5kbGUgbmV0c2NhcGUgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcmVmZXJlbmNlIGNvdW50aW5nIGluIFg1MDlfUFVCS0VZX2dldCgpLiBUaGlzIG1ha2VzCiAgICAgZGVtb3MvbWF1cmljZS9leGFtcGxlMi5jIHdvcmssIGFtb25nc3Qgb3RoZXJzLCBwcm9iYWJseS4KICAgICBbU3RldmUgSGVuc29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBGaXJzdCBjdXQgb2YgYSBjbGVhbnVwIGZvciBhcHBzLy4gRmlyc3QgdGhlIGBzc2xlYXknIHByb2dyYW0gaXMgbm93IG5hbWVkCiAgICAgYG9wZW5zc2wnIGFuZCBzZWNvbmQsIHRoZSBzaG9ydGN1dCBzeW1saW5rcyBmb3IgdGhlIGBvcGVuc3NsIDxjb21tYW5kPicKICAgICBhcmUgbm8gbG9uZ2VyIGNyZWF0ZWQuIFRoaXMgd2F5IHdlIGhhdmUgYSBzaW5nbGUgYW5kIGNvbnNpc3RlbnQgY29tbWFuZAogICAgIGxpbmUgaW50ZXJmYWNlIGBvcGVuc3NsIDxjb21tYW5kPicsIHNpbWlsYXIgdG8gYGN2cyA8Y29tbWFuZD4nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBQYXVsIFN1dHRvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgY2EuYzogbW92ZSB0ZXN0IGZvciBEU0Ega2V5cyBpbnNpZGUgI2lmbmRlZiBOT19EU0EuIE1ha2UgcHVia2V5CiAgICAgQklUIFNUUklORyB3cmFwcGVyIGFsd2F5cyBoYXZlIHplcm8gdW51c2VkIGJpdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIENBLnBsLCBwZXJsIHZlcnNpb24gb2YgQ0Euc2gsIGFkZCBleHRlbmRlZCBrZXkgdXNhZ2UgT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIHRvcC1sZXZlbCBJTlNUQUxMIGRvY3VtZW50YXRpb24gZWFzaWVyIHRvIHVuZGVyc3RhbmQuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBNYWtlZmlsZXMgdXBkYXRlZCB0byBleGl0IGlmIGFuIGVycm9yIG9jY3VycyBpbiBhIHN1Yi1kaXJlY3RvcnkKICAgICBtYWtlIChpbmNsdWRpbmcgaWYgdXNlciBwcmVzc2VzIF5DKSBbUGF1bCBTdXR0b25dCgogICopIE1ha2UgTW9udGdvbWVyeSBjb250ZXh0IHN0dWZmIGV4cGxpY2l0IGluIFJTQSBkYXRhIHN0cnVjdHVyZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ1aWxkIG9yZGVyIG9mIHBlbSBhbmQgZXJyIHRvIGFsbG93IGZvciBnZW5lcmF0ZWQgcGVtLmguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCByZW51bWJlcmluZyBidWcgaW4gWDUwOV9OQU1FX2RlbGV0ZV9lbnRyeSgpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbmhhbmNlZCB0aGUgZXJyLWlucy5wbCBzY3JpcHQgc28gaXQgbWFrZXMgdGhlIGVycm9yIGxpYnJhcnkgbnVtYmVyIAogICAgIGdsb2JhbCBhbmQgY2FuIGFkZCBhIGxpYnJhcnkgbmFtZS4gVGhpcyBpcyBuZWVkZWQgZm9yIGV4dGVybmFsIEFTTjEgYW5kCiAgICAgb3RoZXIgZXJyb3IgbGlicmFyaWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVkIHNrX2luc2VydCB3aGljaCBuZXZlciB3b3JrZWQgcHJvcGVybHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEFTTjEgbWFjcm9zIHNvIHRoZXkgY2FuIGhhbmRsZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCAKICAgICBFWFBMSUNJVCB0YWdzLiBTb21lIG5vbiBzdGFuZGFyZCBjZXJ0aWZpY2F0ZXMgdXNlIHRoZXNlOiB0aGV5IGNhbiBub3cKICAgICBiZSByZWFkIGluLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlZCB0aGUgdmFyaW91cyBvbGQvb2Jzb2xldGUgU1NMZWF5IGRvY3VtZW50YXRpb24gZmlsZXMgKGRvYy94eHguZG9jKQogICAgIGludG8gYSBzaW5nbGUgZG9jL3NzbGVheS50eHQgYnVuZGxlLiBUaGlzIHdheSB0aGUgaW5mb3JtYXRpb24gaXMgc3RpbGwKICAgICBwcmVzZXJ2ZWQgYnV0IG5vIGxvbmdlciBtZXNzZXMgdXAgdGhpcyBkaXJlY3RvcnkuIE5vdyBpdCdzIG5ldyByb29tIGZvcgogICAgIHRoZSBuZXcgc2V0IG9mIGRvY3VtZW50YXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK