UGF0cmljayBCZWFyZCdzIE5vdGVzIGZvciBidWlsZGluZyBHQyB2NC4xMiB3aXRoIENvZGVXYXJyaW9yIFBybyAyOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBjdXJyZW50IGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgY29sbGVjdG9yIGlzIENvZGVXYXJyaW9yIFBybyAyLgpQcm9qZWN0cyBmb3IgQ29kZVdhcnJpb3IgUHJvIDIgKGFuZCBmb3IgcXVpdGUgYSBmZXcgb2xkZXIgdmVyc2lvbnMpCmFyZSBkaXN0cmlidXRlZCBpbiB0aGUgZmlsZSBNYWNfcHJvamVjdHMuc2l0LmhxeC4gVGhlIHByb2plY3QgZmlsZQo6TWFjX3Byb2plY3RzOmdjLnByaiBidWlsZHMgc3RhdGljIGxpYnJhcnkgdmVyc2lvbnMgb2YgdGhlIGNvbGxlY3Rvci4KOk1hY19wcm9qZWN0czpnY3Rlc3QucHJqIGJ1aWxkcyB0aGUgR0MgdGVzdCBzdWl0ZS4KCkNvbmZpZ3VyaW5nIHRoZSBjb2xsZWN0b3IgaXMgc3RpbGwgZG9uZSBieSBlZGl0aW5nIHRoZSBmaWxlcwo6TWFjX2ZpbGVzOk1hY09TX2NvbmZpZy5oIGFuZCA6TWFjX2ZpbGVzOk1hY09TX1Rlc3RfY29uZmlnLmguCgpMYXJzIEZhcm0ncyBzdWdnZXN0aW9ucyBvbiBidWlsZGluZyB0aGUgY29sbGVjdG9yOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkdhcmJhZ2UgQ29sbGVjdGlvbiBvbiBNYWNPUyAtIGEgbWFudWFsICdNYWtlRmlsZScKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHJvamVjdCBmaWxlcyBhbmQgSURFJ3MgYXJlIGdyZWF0IG9uIHRoZSBNYWNpbnRvc2gsIGJ1dCB0aGV5IGRvIGhhdmUKcHJvYmxlbXMgd2hlbiB1c2VkIGFzIGRpc3RyaWJ1dGlvbiBtZWRpYS4gVGhpcyBub3RlIHRyaWVzIHRvIHByb3ZpZGUKcG9ydGluZyBpbnN0cnVjdGlvbnMgaW4gcHVyZSBURVhUIGZvcm0gdG8gYXZvaWQgdGhvc2UgcHJvYmxlbXMuIEEgbWFudWFsCidtYWtlZmlsZScgaWYgeW91IGxpa2UuCgogICAgR0MgdmVyc2lvbjogICAgIDQuMTJhMgogICAgQ29kZXdhcnJpb3I6ICAgIENXUHJvMQogICAgZGF0ZTogICAgICAgICAgIDE4IEp1bHkgMTk5NwoKVGhlIG5vdGVzIG1heSBvciBtYXkgbm90IGFwcGx5IHRvIGVhcmxpZXIgb3IgbGF0ZXIgdmVyc2lvbnMgb2YgdGhlCkdDL0NXUHJvLiBBY3R1YWxseSwgdGhleSBkbyBhcHBseSB0byBlYXJsaWVyIHZlcnNpb25zIG9mIGJvdGggZXhjZXB0IHRoYXQKdW50aWwgcmVjZW50bHkgYSBwcm9qZWN0IGNvdWxkIG9ubHkgYnVpbGQgb25lIHRhcmdldCBzbyBlYWNoIHRhcmdldCB3YXMgYQpzZXBhcmF0ZSBwcm9qZWN0LiBUaGUgbm90ZXMgd2lsbCBtb3N0IGxpa2VseSBhcHBseSB0byBmdXR1cmUgdmVyc2lvbnMgdG9vLgpQb3NzaWJseSB3aXRoIG1pbm9yIHR3ZWFrcy4KClRoaXMgaXMganVzdCB0byByZWNvcmQgbXkgZXhwZXJpZW5jZXMuIFRoZXNlIG5vdGVzIGRvIG5vdCBtZWFuIEkgbm93CnByb3ZpZGUgYSBzdXBwb3J0ZWQgcG9ydCBvZiB0aGUgR0MgdG8gTWFjT1MuIEl0IHdvcmtzIGZvciBtZS4gSWYgaXQgd29ya3MKZm9yIHlvdSwgZ3JlYXQuIElmIGl0IGRvZXNuJ3QsIHNvcnJ5LCB0cnkgYWdhaW4uLi47LSkgU3RpbGwsIGlmIHlvdSBmaW5kCmVycm9ycywgcGxlYXNlIGxldCBtZSBrbm93LgoKICAgIG1haWx0bzogICAgICAgICBsYXJzLmZhcm1AaXRlLm1oLnNlCgogICAgYWRkcmVzczogICAgICAgIExhcnMgRmFybQogICAgICAgICAgICAgICAgICAgIEty9m525GdlbiAzM2IKICAgICAgICAgICAgICAgICAgICA4NTYgNDQgU3VuZHN2YWxsCiAgICAgICAgICAgICAgICAgICAgU3dlZGVuCgpQb3J0aW5nIHRvIE1hY09TIGlzIGEgYml0IG1vcmUgY29tcGxleCB0aGFuIGl0IGZpcnN0IHNlZW1zLiBXaGljaCBNYWNPUz8KNjhLL1Bvd2VyUEM/IFdoaWNoIGNvbXBpbGVyPyBFYWNoIHN1cHBvcnRzIGJvdGggNjhLIGFuZCBQb3dlclBDIGFuZCBvZmZlciBhCmxhcmdlIG51bWJlciBvZiAodW5pcXVlIHRvIGVhY2ggZW52aXJvbm1lbnQpIGNvbXBpbGVyIHNldHRpbmdzLiBFYWNoCmNvbWJpbmF0aW9uIG9mIGNvbXBpbGVyLzY4Sy9QUEMvc2V0dGluZ3MgcmVxdWlyZSBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZgpzdGFuZGFyZCBsaWJyYXJpZXMuIEFuZCB0aGUgSURFJ3MgZG9lcyBub3Qgc2VsZWN0IHRoZW0gZm9yIHlvdS4gVGhleSBkb24ndApldmVuIGNoZWNrIHRoYXQgdGhlIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBjb21wYXRpYmxlIHNldHRpbmcgYW5kIHRoaXMgaXMKdGhlIG1ham9yIHNvdXJjZSBvZiBwcm9ibGVtcyB3aGVuIHBvcnRpbmcgdGhlIEdDIChhbmQgb3RoZXJ3aXNlIHRvbykuCgpZb3Ugd2lsbCBoYXZlIHRvIG1ha2UgY2hvaWNlcyB3aGVuIHlvdSBjb25maWd1cmUgdGhlIEdDLiBJJ3ZlIG1hZGUgc29tZQpjaG9pY2VzIGhlcmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY29tYmluYXRpb25zIG9mIHNldHRpbmdzIGFuZCAjZGVmaW5lcwp0aGF0IHdvcmsgdG9vLgoKQXMgZm9yIHRhcmdldCBzZXR0aW5ncyB0aGUgbWFqb3Igb2JzdGFjbGVzIG1heSBiZToKLSA2OEsgUHJvY2Vzc29yOiBjaGVjayAiNC1ieXRlIEludHMiLgotIFBQQyBQcm9jZXNzb3I6IHVuY2hlY2sgIlN0b3JlIFN0YXRpYyBEYXRhIGluIFRPQyIuCgpXaGF0IHlvdSBuZWVkIHRvIGRvOgo9PT09PT09PT09PT09PT09PT09CgoxKSBCdWlsZCB0aGUgR0MgYXMgYSBsaWJyYXJ5CjIpIFRlc3QgdGhhdCB0aGUgbGlicmFyeSB3b3JrcyB3aXRoICd0ZXN0LmMnLgozKSBUZXN0IHRoYXQgdGhlIEMrKyBpbnRlcmZhY2UgJ2djX2NwcC5jYy9oJyB3b3JrcyB3aXRoICd0ZXN0X2NwcC5jYycuCgoxKSBUaGUgTGlicmFyaWVzOgo9PT09PT09PT09PT09PT09PQpJIG1hZGUgb25lIHByb2plY3Qgd2l0aCBmb3VyIHRhcmdldHMgKDY4Sy9QUEMgdGVtcG1lbSBvciBhcHBoZWFwKS4gT25lIHRhcmdldAp3aWxsIHN1ZmZpY2UgaWYgeW91J3JlIGFibGUgdG8gZGVjaWRlIHdoaWNoIG9uZSB5b3Ugd2FudC4gSSB3YXNuJ3QuLi4KCkNvZGV3YXJyaW9yIGFsbG93cyBhIGxhcmdlIG51bWJlciBvZiBjb21waWxlci9saW5rZXIgc2V0dGluZ3MuIEkgdXNlZCB0aGVzZToKClNldHRpbmdzIHNoYXJlZCBieSBhbGwgdGFyZ2V0czoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm8gQWNjZXNzIFBhdGhzOgogIC0gVXNlciBQYXRoczogICB0aGUgR0MgZm9sZGVyCiAgLSBTeXN0ZW0gUGF0aHM6IHtDb21waWxlcn06TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5OgogICAgICAgICAgICAgICAgICB7Q29tcGlsZXJ9Ok1hY09TIFN1cHBvcnQ6SGVhZGVyczoKICAgICAgICAgICAgICAgICAge0NvbXBpbGVyfTpNYWNPUyBTdXBwb3J0Ok1hY0hlYWRlcnM6Cm8gQy9DKysgbGFuZ3VhZ2U6CiAgLSBpbmxpbmluZzogbm9ybWFsCiAgLSBkaXJlY3QgdG8gU09NOiBvZmYKICAtIGVuYWJsZS9jaGVjazogZXhjZXB0aW9ucywgUlRUSSwgYm9vbCAoYW5kIGlmIHlvdSBsaWtlIHBvb2wgc3RyaW5ncykKClBvd2VyUEMgdGFyZ2V0IHNldHRpbmdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm8gVGFyZ2V0IFNldHRpbmdzOgogIC0gbmFtZSBvZiB0YXJnZXQKICAtIE1hY09TIFBQQyBMaW5rZXIKbyBQUEMgVGFyZ2V0CiAgLSBuYW1lIG9mIGxpYnJhcnkKbyBDL0MrKyBsYW5ndWFnZQogIC0gcHJlZml4IGZpbGUgYXMgZGVzY3JpYmVkIGJlbG93Cm8gUFBDIFByb2Nlc3NvcgogIC0gU3RydWN0IEFsaWdubWVudDogUG93ZXJQQwogIC0gdW5jaGVjayAiU3RvcmUgU3RhdGljIERhdGEgaW4gVE9DIiAtLSBpbXBvcnRhbnQhCiAgICBJIGRvbid0IHRoaW5rIHRoZSBvdGhlcnMgbWF0dGVyLCBJIHVzZSBmdWxsIG9wdGltaXphdGlvbiBhbmQgaXRzIG9rCm8gUFBDIExpbmtlcgogIC0gRmFjdG9yeSBTZXR0aW5ncyAoU1lNIGZpbGUgd2l0aCBmdWxsIHBhdGhzLCBmYXN0ZXIgbGlua2luZywgZGVhZC1zdHJpcAogICAgc3RhdGljIGluaXQsIE1haW46IF9fc3RhcnQpCgoKNjhLIHRhcmdldCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tCm8gVGFyZ2V0IFNldHRpbmdzOgogIC0gbmFtZSBvZiB0YXJnZXQKICAtIE1hY09TIDY4SyBMaW5rZXIKbyA2OEsgVGFyZ2V0CiAgLSBuYW1lIG9mIGxpYnJhcnkKICAtIEE1IHJlbGF0aXZlIGRhdGEKbyBDL0MrKyBsYW5ndWFnZQogIC0gcHJlZml4IGZpbGUgYXMgZGVzY3JpYmVkIGJlbG93Cm8gNjhLIFByb2Nlc3NvcgogIC0gQ29kZSBtb2RlbDogc21hcnQKICAtIFN0cnVjdCBhbGlnbm1lbnQ6IDY4SwogIC0gRlA6IFNBTkUKICAtIGVuYWJsZSA0LUJ5dGUgSW50cyAtLSBpbXBvcnRhbnQhCiAgICBJIGRvbid0IHRoaW5rIHRoZSBvdGhlcnMgbWF0dGVyLiBJIHNlbGVjdGVkLi4uCiAgLSBlbmFibGU6IDY4MDIwCiAgLSBlbmFibGU6IGdsb2JhbCByZWdpc3RlciBhbGxvY2F0aW9uCm8gSVIgT3B0aW1pemVyCiAgLSBlbmFibGU6IE9wdGltaXplIFNwYWNlLCBPcHRpbWl6ZSBTcGVlZAogICAgSSBzdXBwb3NlIHRoZSBvdGhlcnMgd291bGQgd29yayB0b28sIGJ1dCBoYXZlbid0IHRyaWVkLi4uCm8gNjhLIExpbmtlcgogIC0gRmFjdG9yeSBTZXR0aW5ncyAoTmV3IFN0eWxlIE1hY3NCdWcsU1lNIGZpbGUgd2l0aCBmdWxsIHBhdGhzLAogICAgQTYgRnJhbWVzLCBmYXN0IGxpbmssIE1lcmdlIGNvbXBpbGVyIGdsdWUgaW50byBzZWdtZW50IDEsCiAgICBkZWFkLXN0cmlwIHN0YXRpYyBpbml0KQoKUHJlZml4IEZpbGVzIHRvIGNvbmZpZ3VyZSB0aGUgR0Mgc291cmNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBDb2Rld2FycmlvciBlcXVpdmFsZW50IG9mIGNvbW1hbmRsaW5lIGNvbXBpbGVycyAtRE5BTUU9WCBpcyB0byB1c2UKcHJlZml4LWZpbGVzLiBBIFRFWFQgZmlsZSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgI2luY2x1ZGVkIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZQpvZiBldmVyeSBzb3VyY2UgZmlsZS4gSSB1c2VkIHRoZXNlOgoKLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X3RlbXBtZW0uaCAgICAgLS0gNjhLIGFuZCBQUEMgLS0tLS0KICAgICNpbmNsdWRlICJnY19wcmVmaXhfY29tbW9uLmgiCiAgICAjdW5kZWYgVVNFX1RFTVBPUkFSWV9NRU1PUlkKICAgICNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkKLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X2FwcG1lbS5oICAgICAgLS0gNjhLIGFuZCBQUEMgLS0tLS0KICAgICNpbmNsdWRlICJnY19wcmVmaXhfY29tbW9uLmgiCiAgICAjdW5kZWYgVVNFX1RFTVBPUkFSWV9NRU1PUlkKLy8gICNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkKCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0gIGdjX3ByZWZpeF9jb21tb24uaCAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGdjX3ByZWZpeF9jb21tb24uaAovLyAtLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29kZXdhcnJpb3IgcHJlZml4IGZpbGUgdG8gY29uZmlndXJlIHRoZSBHQyBsaWJyYXJpZXMKLy8KLy8gICBwcmVmaXggZmlsZXMgYXJlIHRoZSBDb2Rld2FycmlvciBlcXVpdmFsZW50IG9mIHRoZQovLyAgIGNvbW1hbmQgbGluZSBvcHRpb24gLURuYW1lPXggZnJlcXVlbnRseSBzZWVuIGluIG1ha2VmaWxlcwoKI2lmICFfX01XRVJLU19fCiAgI2Vycm9yIG9ubHkgdHJpZWQgdGhpcyB3aXRoIENvZGV3YXJyaW9yCiNlbmRpZgoKI2lmIG1hY2ludG9zaAogICNkZWZpbmUgTVNMX1VTRV9QUkVDT01QSUxFRF9IRUFERVJTIDAKICAjaW5jbHVkZSA8YW5zaV9wcmVmaXgubWFjLmg+CiAgI2lmbmRlZiBfX1NURENfXwogICAgI2RlZmluZSBfX1NURENfXyAwCiAgI2VuZGlmCgogIC8vICBTZWUgbGlzdCBvZiAjZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIGxpYnJhcnkgaW46ICdNYWtlRmlsZScKICAvLyAgc2VlIGFsc28gUkVBRE1FCgogICNkZWZpbmUgU0lMRU5UICAgICAgICAgICAgICAgIC8vIG5vIGNvbGxlY3Rpb24gbWVzc2FnZXMuIEluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0cm91YmxlIHlvdSBtaWdodCB3YW50IHRoaXMgb2ZmCiAgI2RlZmluZSBBTExfSU5URVJJT1JfUE9JTlRFUlMgLy8gZm9sbG93cyBpbnRlcmlvciBwb2ludGVycy4KLy8jZGVmaW5lIERPTlRfQUREX0JZVEVfQVRfRU5EICAvLyBkaXNhYmxlcyB0aGUgcGFkZGluZyBpZiBkZWZpbmVkLgovLyNkZWZpbmUgU01BTExfQ09ORklHICAgICAgICAgIC8vIHdoZXRoZXIgdG8gdXNlIGEgc21hbGxlciBoZWFwLgogICNkZWZpbmUgTk9fU0lHTkFMUyAgICAgICAgICAgIC8vIHNpZ25hbHMgYXJlbid0IHJlYWwgb24gdGhlIE1hY2ludG9zaC4KICAjZGVmaW5lIEFUT01JQ19VTkNPTExFQ1RBQkxFICAvLyBHQ19tYWxsb2NfYXRvbWljX3VuY29sbGVjdGFibGUoKQoKICAvLyBkZWZpbmUgZWl0aGVyIG9yIG5vbmUgYXMgcGVyIHBlcnNvbmFsIHByZWZlcmVuY2UKICAvLyAgIHVzZWQgaW4gbWFsbG9jLmMKICAjZGVmaW5lIFJFRElSRUNUX01BTExPQyBHQ19tYWxsb2MKLy8jZGVmaW5lIFJFRElSRUNUX01BTExPQyBHQ19tYWxsb2NfdW5jb2xsZWN0YWJsZQogIC8vIGlmIFJFRElSRUNUX01BTExPQyBpcyAjZGVmaW5lZCBtYWtlIHN1cmUgdGhhdCB0aGUgR0MgbGlicmFyeQogIC8vIGlzIGxpc3RlZCBiZWZvcmUgdGhlIEFOU0kvSVNPIGxpYnMgaW4gdGhlIENvZGV3YXJyaW9yCiAgLy8gJ0xpbmsgb3JkZXInIHBhbmVsCi8vI2RlZmluZSBJR05PUkVfRlJFRQoKICAvLyBtYWMgc3BlY2lmaWMgY29uZmlncwovLyNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkgICAgLy8gdXNlIE1hY2ludG9zaCB0ZW1wb3JhcnkgbWVtb3J5LgovLyNkZWZpbmUgU0hBUkVEX0xJQlJBUllfQlVJTEQgICAgLy8gYnVpbGQgZm9yIHVzZSBpbiBhIHNoYXJlZCBsaWJyYXJ5LgoKI2Vsc2UKICAvLyBjb3VsZCBidWlsZCBXaW4zMiBoZXJlIHRvbywgb3IgaW4gdGhlIGZ1dHVyZQogIC8vIFJoYXBzb2R5IFBQQy1tYWNoLCBSaGFwc29keSBQUEMtTWFjT1MsCiAgLy8gUmhhcHNvZHkgSW50ZWwtbWFjaCwgUmhhcHNvZHkgSW50ZWwtV2luMzIsLi4uCiAgLy8gLi4uIHVnaCB0aGlzIHdpbGwgZ2V0IG1lc3N5IC4uLgojZW5kaWYKCi8vIG1ha2Ugc3VyZSBpbnRzIGFyZSBhdCBsZWFzdCAzMi1iaXQKLy8gKCBjb3VsZCBiZSBzZXQgdG8gMTYtYml0IGJ5IGNvbXBpbGVyIHNldHRpbmdzICg2OEspICkKCnN0cnVjdCBnY19wcml2YXRlX2Fzc2VydF9pbnRzaXplX3sgY2hhciB4WyBzaXplb2YoaW50KT49NCA/IDEgOiAwIF07IH07CgojaWYgX19wb3dlcmMKICAjaWYgX19vcHRpb24odG9jX2RhdGEpCiAgICAjZXJyb3IgdHVybiBvZmYgInN0b3JlIHN0YXRpYyBkYXRhIGluIFRPQyIgd2hlbiB1c2luZyBHQwogICAgLy8gICAgIC4uLiBvciBmaW5kIGEgd2F5IHRvIGFkZCBUT0MgdG8gdGhlIHJvb3Qgc2V0Li4uKD8pCiAgI2VuZGlmCiNlbmRpZgotLS0tICggY3V0IGhlcmUgKSAtLS0tICBlbmQgb2YgZ2NfcHJlZml4X2NvbW1vbi5oICAtLS0tLS0tLS0tLS0tLS0tLQoKRmlsZXMgdG8gIGJ1aWxkIHRoZSBHQyBsaWJyYXJpZXM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhbGxjaGJsay5jCiAgICBhbGxvYy5jCiAgICBibGFja2xzdC5jCiAgICBjaGVja3N1bXMuYwogICAgZGJnX21sYy5jCiAgICBmaW5hbGl6ZS5jCiAgICBoZWFkZXJzLmMKICAgIG1hY2hfZGVwLmMKICAgIE1hY09TLmMgICAgLS0gY29udGFpbnMgTWFjT1MgY29kZQogICAgbWFsbG9jLmMKICAgIG1hbGxvY3guYwogICAgbWFyay5jCiAgICBtYXJrX3J0cy5jCiAgICBtaXNjLmMKICAgIG5ld19oYmxrLmMKICAgIG9ial9tYXAuYwogICAgb3NfZGVwLmMgICAtLSBjb250YWlucyBNYWNPUyBjb2RlCiAgICBwdHJfY2hjay5jCiAgICByZWNsYWltLmMKICAgIHN0dWJib3JuLmMKICAgIHR5cGRfbWxjLmMKICAgIGdjKysuY2MgICAgLS0gdGhpcyBpcyAnZ2NfY3BwLmNjJyB3aXRoIGxlc3MgJ2lubGluZScgYW5kCiAgICAgICAgICAgICAgIC0tIHRocm93IHN0ZDo6YmFkX2FsbG9jIHdoZW4gb3V0IG9mIG1lbW9yeQogICAgICAgICAgICAgICAtLSBnY19jcHAuY2Mgd29ya3MganVzdCBmaW5lIHRvbwoKMikgVGVzdCB0aGF0IHRoZSBsaWJyYXJ5IHdvcmtzIHdpdGggJ3Rlc3QuYycuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHRlc3QgYXBwIGlzIGp1c3QgYW4gb3JkaW5hcnkgQU5TSS1DIGNvbnNvbGUgYXBwLiBNYWtlIHN1cmUgc2V0dGluZ3MKbWF0Y2ggdGhlIGxpYnJhcnkgeW91J3JlIHRlc3RpbmcuCgpGaWxlcwotLS0tLQogICAgdGVzdC5jCiAgICB0aGUgR0MgbGlicmFyeSB0byB0ZXN0ICAgICAgICAtLSBsaW5rIG9yZGVyIGJlZm9yZSBBTlNJIGxpYnMKICAgIHN1aXRhYmxlIE1hYytBTlNJIGxpYnJhcmllcwoKcHJlZml4OgotLS0tLS0KLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X3Rlc3RsaWIuaCAgICAgLS0gYWxsIGxpYnMgLS0tLS0KI2RlZmluZSBNU0xfVVNFX1BSRUNPTVBJTEVEX0hFQURFUlMgMAojaW5jbHVkZSA8YW5zaV9wcmVmaXgubWFjLmg+CiN1bmRlZiBOREVCVUcKCiNkZWZpbmUgQUxMX0lOVEVSSU9SX1BPSU5URVJTCS8qIGZvciBHQ19wcml2LmggKi8KLS0tLSAoIGN1dCBoZXJlICkgLS0tLQoKMykgVGVzdCB0aGF0IHRoZSBDKysgaW50ZXJmYWNlICdnY19jcHAuY2MvaCcgd29ya3Mgd2l0aCAndGVzdF9jcHAuY2MnLgoKVGhlIHRlc3QgYXBwIGlzIGp1c3QgYW4gb3JkaW5hcnkgQU5TSS1DIGNvbnNvbGUgYXBwLiBNYWtlIHN1cmUgc2V0dGluZ3MgbWF0Y2gKdGhlIGxpYnJhcnkgeW91J3JlIHRlc3RpbmcuCgpGaWxlcwotLS0tLQogICAgdGVzdF9jcHAuY2MKICAgIHRoZSBHQyBsaWJyYXJ5IHRvIHRlc3QgICAgICAgIC0tIGxpbmsgb3JkZXIgYmVmb3JlIEFOU0kgbGlicwogICAgc3VpdGFibGUgTWFjK0FOU0kgbGlicmFyaWVzCgpwcmVmaXg6Ci0tLS0tLQpzYW1lIGFzIGZvciB0ZXN0LmMKCkZvciBjb252ZW5pZW5jZSBJIHVzZWQgb25lIHRlc3QtcHJvamVjdCB3aXRoIHNldmVyYWwgdGFyZ2V0cyBzbyB0aGF0IGFsbAp0ZXN0IGFwcHMgYXJlIGJ1aWxkIGF0IG9uY2UuIFR3byBmb3IgZWFjaCBsaWJyYXJ5IHRvIHRlc3Q6IHRlc3QuYyBhbmQKZ2NfYXBwLmNjLiBXaGVuIEkgd2FzIHNhdGlzZmllZCB0aGF0IHRoZSBsaWJyYXJpZXMgd2VyZSBvay4gSSBwdXQgdGhlCmxpYnJhcmllcyArIGdjLmggKyB0aGUgYysrIGludGVyZmFjZS1maWxlIGluIGEgZm9sZGVyIHRoYXQgSSB0aGVuIHB1dCBpbnRvCnRoZSBNU0wgaGllcmFyY2h5IHNvIHRoYXQgSSBkb24ndCBoYXZlIHRvIGFsdGVyIGFjY2Vzcy1wYXRocyBpbiBwcm9qZWN0cwp0aGF0IHVzZSB0aGUgR0MuCgpBZnRlciB0aGF0LCBqdXN0IGFkZCB0aGUgcHJvcGVyIEdDIGxpYnJhcnkgdG8geW91ciBwcm9qZWN0IGFuZCB0aGUgR0MgaXMgaW4KYWN0aW9uISBtYWxsb2Mgd2lsbCBjYWxsIEdDX21hbGxvYyBhbmQgZnJlZSBHQ19mcmVlLCBuZXcvZGVsZXRlIHRvby4gWW91CmRvbid0IGhhdmUgdG8gY2FsbCBmcmVlIG9yIGRlbGV0ZS4gWW91IG1heSBoYXZlIHRvIGJlIGEgYml0IGNhdXRpb3VzIGFib3V0CmRlbGV0ZSBpZiB5b3UncmUgZnJlZWluZyBvdGhlciByZXNvdXJjZXMgdGhhbiBSQU0uIFNlZSBnY19jcHAuaC4gWW91IGNhbgphbHNvIGtlZXAgY29kaW5nIGFzIGFsd2F5cyB3aXRoIGRlbGV0ZS9mcmVlLiBUaGF0IHdvcmtzIHRvby4gSWYgeW91IHdhbnQsCiJpbmNsdWRlIDxnYy5oPiBhbmQgdHdlYWsgaXQncyB1c2UgYSBiaXQuCgpTeW1hbnRlYyBTUE0KPT09PT09PT09PT09Ckl0IGhhcyBiZWVuIGEgd2hpbGUgc2luY2UgSSB0cmllZCB0aGUgR0MgaW4gU1BNLCBidXQgSSB0aGluayB0aGF0IHRoZSBhYm92ZQppbnN0cnVjdGlvbnMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gZ3VpZGUgeW91IHRocm91Z2ggaW4gU1BNIHRvby4gU1BNCm5lZWRzIHRvIGtub3cgd2hlcmUgdGhlIGdsb2JhbCBkYXRhIGlzLiBVc2UgdGhlIGZpbGVzICdkYXRhc3RhcnQuYycgYW5kCidkYXRhZW5kLmMnLiBQdXQgJ2RhdGFzdGFydC5jJyBhdCB0aGUgdG9wIG9mIHlvdXIgcHJvamVjdCBhbmQgJ2RhdGFlbmQuYycKYXQgdGhlIGJvdHRvbSAgb2YgeW91ciBwcm9qZWN0IHNvIHRoYXQgYWxsIGRhdGEgaXMgc3Vycm91bmRlZC4gVGhpcyBpcyBub3QKbmVlZGVkIGluIENvZGV3YXJyaW9yIGJlY2F1c2UgaXQgcHJvdmlkZXMgaW50cmluc2ljIHZhcmlhYmxlcwpfX2RhdGFzdGFydF9fLCBfX2RhdGFfZW5kX18gdGhhdCB3cmFwcyBhbGwgZ2xvYmFscy4KClNvdXJjZSBDaGFuZ2VzIChHQyA0LjEyYTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09ClZlcnkgZmV3LiBKdXN0IG9uZSB0aW55IGluIHRoZSBHQywgbm90IHN0cmljdGx5IG5lZWRlZC4KLSBNYWNPUy5jIGxpbmUgMTMxIGluIHJvdXRpbmUgR0NfTWFjRnJlZVRlbXBvcmFyeU1lbW9yeSgpCiAgY2hhbmdlICMgICAgICAgaWYgIWRlZmluZWQoU0hBUkVEX0xJQlJBUllfQlVJTEQpCiAgdG8gICAgICMgICAgICAgaWYgIWRlZmluZWQoU0lMRU5UKSAmJiAhZGVmaW5lZChTSEFSRURfTElCUkFSWV9CVUlMRCkKICBUbyB0dXJuIG9mZiBhIG1lc3NhZ2Ugd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMgKGFjdHVhbGx5LCBJIGZha2VkCiAgdGhpcyBjaGFuZ2UgYnkgI2RlZmluaW5nIFNIQVJFRF9MSUJSQVJZX0JVSUxEIGluIGEgc3RhdGljYWxseSBsaW5rZWQKICBsaWJyYXJ5IGZvciBtb3JlIHRoYW4gYSB5ZWFyIHdpdGhvdXQgaWxsIGVmZmVjdHMgYnV0IHBlcmhhcHMgdGhpcyBpcwogIGJldHRlcikuCgotIHRlc3RfY3BwLmNjCiAgbWFkZSB0aGUgZmlyc3QgbGluZXMgb2YgbWFpbigpIGxvb2sgbGlrZSB0aGlzOgogIC0tLS0tLS0tLS0tLQogIGludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgewogICNlbmRpZgogICNpZiBtYWNpbnRvc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hY09TCiAgICBjaGFyKiBhcmd2X1tdID0geyJ0ZXN0X2NwcCIsIjEwIn07ICAgICAgLy8gICBkb2Vzbid0CiAgICBhcmd2PWFyZ3ZfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhdmUgYQogICAgYXJnYyA9IHNpemVvZihhcmd2Xykvc2l6ZW9mKGFyZ3ZfWzBdKTsgIC8vICAgICAgIGNvbW1hbmRsaW5lCiAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KCiAgaW50IGksIGl0ZXJzLCBuOwogICMgaWZuZGVmIF9fR05VQ19fCiAgIGFsbG9jIGR1bW15X3RvX2Zvb2xfdGhlX2NvbXBpbGVyX2ludG9fZG9pbmdfdGhpbmdzX2l0X2N1cnJlbnRseV9jYW50X2hhbmRsZTsKICAtLS0tLS0tLS0tLS0KCi0gY29uZmlnLmgKICBfX01XRVJLU19fIGRvZXMgbm90IGhhdmUgdG8gbWVhbiBNQUNPUy4gWW91IGNhbiB1c2UgQ29kZXdhcnJpb3IgdG8KICBidWlsZCBhIFdpbjMyIG9yIEJlT1MgbGlicmFyeSBhbmQgc29vbiBhIFJoYXBzb2R5IGxpYnJhcnkuIFlvdSBtYXkKICBoYXZlIHRvIGNoYW5nZSB0aGF0ICNpZi4uLgoKCgogICBJdCB3b3JrZWQgZm9yIG1lLCBob3BlIGl0IHdvcmtzIGZvciB5b3UuCgogICBMYXJzIEZhcm0KICAgMTggSnVseSAxOTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpQYXRyaWNrIEJlYXJkJ3MgaW5zdHJ1Y3Rpb25zIChtYXkgYmUgZGF0ZWQpOgoKdjQuMyBvZiB0aGUgY29sbGVjdG9yIG5vdyBydW5zIHVuZGVyIFN5bWFudGVjIEMrKy9USElOSyBDIHY3LjAuNCwgYW5kCk1ldHJvd2Vya3MgQy9DKysgdjQuNSBib3RoIDY4SyBhbmQgUG93ZXJQQy4gUHJvamVjdCBmaWxlcyBhcmUgcHJvdmlkZWQKdG8gYnVpbGQgYW5kIHRlc3QgdGhlIGNvbGxlY3RvciB1bmRlciBib3RoIGRldmVsb3BtZW50IHN5c3RlbXMuCgpDb25maWd1cmF0aW9uCi0tLS0tLS0tLS0tLS0KClRvIGNvbmZpZ3VyZSB0aGUgY29sbGVjdG9yLCB1bmRlciBib3RoIGRldmVsb3BtZW50IHN5c3RlbXMsIGEgcHJlZml4IGZpbGUKaXMgdXNlZCB0byBzZXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuIFRoaXMgZmlsZSBpcyBjYWxsZWQgIk1hY09TX2NvbmZpZy5oIi4KQWxzbyB0byB0ZXN0IHRoZSBjb2xsZWN0b3IsICJNYWNPU19UZXN0X2NvbmZpZy5oIiBpcyBwcm92aWRlZC4KClRlc3RpbmcKLS0tLS0tLQoKVG8gdGVzdCB0aGUgY29sbGVjdG9yIChhbHdheXMgYSBnb29kIGlkZWEpLCBidWlsZCBvbmUgb2YgdGhlIGdjdGVzdCBwcm9qZWN0cywKZ2N0ZXN0LrkgKFN5bWFudGVjIEMrKy9USElOSyBDKSwgbXcvZ2N0ZXN0LjY4Sy65LCBvciBtdy9nY3Rlc3QuUFBDLrkuIFRoZQp0ZXN0IHdpbGwgYXNrIHlvdSBob3cgbWFueSB0aW1lcyB0byBydW47IDEgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCgpCdWlsZGluZyAKLS0tLS0tLS0KCkZvciB5b3VyIGNvbnZlbmllbmNlIHByb2plY3QgZmlsZXMgZm9yIHRoZSBtYWpvciBNYWNpbnRvc2ggZGV2ZWxvcG1lbnQKc3lzdGVtcyBhcmUgcHJvdmlkZWQuCgpGb3IgU3ltYW50ZWMgQysrL1RISU5LIEMsIHlvdSBtdXN0IGJ1aWxkIHRoZSB0d28gcHJvamVjdHMgZ2NsaWItMS65IGFuZApnY2xpYi0yLrkuIEl0IGhhcyB0byBiZSBzcGxpdCB1cCBiZWNhdXNlIHRoZSBjb2xsZWN0b3IgaGFzIG1vcmUgdGhhbiAzMmsKb2Ygc3RhdGljIGRhdGEgYW5kIG5vIGxpYnJhcnkgY2FuIGhhdmUgbW9yZSB0aGFuIHRoaXMgaW4gdGhlIFN5bWFudGVjCmVudmlyb25tZW50LiAoRnV0dXJlIHZlcnNpb25zIHdpbGwgcHJvYmFibHkgZml4IHRoaXMuKQoKRm9yIE1ldHJvd2Vya3MgQy9DKysgNC41IHlvdSBidWlsZCBnYy42OEsuuS9nYy5QUEMuuSBhbmQgdGhlIHJlc3VsdCB3aWxsCmJlIGEgbGlicmFyeSBjYWxsZWQgZ2MuNjhLLmxpYi9nYy5QUEMubGliLgoKVXNpbmcKLS0tLS0KClVuZGVyIFN5bWFudGVjIEMrKy9USElOSyBDLCB5b3UgY2FuIGp1c3QgYWRkIHRoZSBnY2xpYi0xLrkgYW5kIGdjbGliLTIuuQpwcm9qZWN0cyB0byB5b3VyIG93biBwcm9qZWN0LiBVbmRlciBNZXRyb3dlcmtzLCB5b3UgYWRkIGdjLjY4Sy5saWIgb3IKZ2MuUFBDLmxpYiBhbmQgdHdvIGFkZGl0aW9uYWwgZmlsZXMuIFlvdSBhZGQgdGhlIGZpbGVzIGNhbGxlZCBkYXRhc3RhcnQuYwphbmQgZGF0YWVuZC5jIHRvIHlvdXIgcHJvamVjdCwgYnJhY2tldGluZyBhbGwgZmlsZXMgdGhhdCB1c2UgdGhlIGNvbGxlY3Rvci4KU2VlIG13L2djdGVzdC65IGZvciBhbiBleGFtcGxlLgoKSW5jbHVkZSB0aGUgcHJvamVjdHMvbGlicmFyaWVzIHlvdSBidWlsdCBhYm92ZSBpbnRvIHlvdXIgb3duIHByb2plY3QsCiNpbmNsdWRlICJnYy5oIiwgYW5kIGNhbGwgR0NfbWFsbG9jLiBZb3UgZG9uJ3QgaGF2ZSB0byBjYWxsIEdDX2ZyZWUuCgoKUGF0cmljayBDLiBCZWFyZApKYW51YXJ5IDQsIDE5OTUK