DQojaW5jbHVkZSA8d2luZG93cy5oPg0KDQojaWZkZWYgR0xFV19NWA0KIyAgaWZkZWYgX0RFQlVHDQojICAgIGRlZmluZSBGSUxFTkFNRSAiZ2xld2luZm8tbXhkLmV4ZSINCiMgIGVsc2UNCiMgICAgZGVmaW5lIEZJTEVOQU1FICJnbGV3aW5mby1teC5leGUiDQojICBlbmRpZg0KI2Vsc2UNCiMgIGlmZGVmIF9ERUJVRw0KIyAgICBkZWZpbmUgRklMRU5BTUUgImdsZXdpbmZvZC5leGUiDQojICBlbHNlDQojICAgIGRlZmluZSBGSUxFTkFNRSAiZ2xld2luZm8uZXhlIg0KIyAgZW5kaWYNCiNlbmRpZg0KDQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLy8NCi8vIFZlcnNpb24NCi8vDQpWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8gDQpGSUxFVkVSU0lPTiAxLCA0LCAwLCAwDQpQUk9EVUNUVkVSU0lPTiAxLCA0LCAwLCAwDQpGSUxFRkxBR1NNQVNLIFZTX0ZGSV9GSUxFRkxBR1NNQVNLDQojaWZkZWYgX0RFQlVHDQpGSUxFRkxBR1MgVlNfRkZfREVCVUcNCiNlbHNlDQpGSUxFRkxBR1MgMHgwTA0KI2VuZGlmDQpGSUxFT1MgVk9TX19XSU5ET1dTMzINCkZJTEVUWVBFIFZGVF9BUFANCkZJTEVTVUJUWVBFIFZGVDJfVU5LTk9XTg0KQkVHSU4NCiAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iDQogICAgQkVHSU4NCiAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIg0KICAgICAgICBCRUdJTg0KICAgICAgICAgICAgVkFMVUUgIkNvbW1lbnRzIiwgIlRoZSBPcGVuR0wgRXh0ZW5zaW9uIFdyYW5nbGVyIExpYnJhcnlcclxuQ29weXJpZ2h0IChDKSAyMDAyLTIwMDcsIE1pbGFuIElraXRzIDxtaWxhbiBpa2l0c1tdaWVlZSBvcmc+XHJcbkNvcHlyaWdodCAoQykgMjAwMi0yMDA3LCBNYXJjZWxvIEUuIE1hZ2FsbG9uIDxtbWFnYWxsb1tdZGViaWFuIG9yZz5cclxuQ29weXJpZ2h0IChDKSAyMDAyLCBMZXYgUG92YWxhaGV2XHJcbkFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiBcclxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IFxyXG5tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcclxuXHJcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCBcclxuICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxyXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgXHJcbiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBcclxuICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuKiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBcclxuICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cclxuXHJcblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJ0FTIElTJyBcclxuQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBcclxuSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcclxuQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIFxyXG5MSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIFxyXG5DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBcclxuU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXHJcbklOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXHJcbkNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXHJcbkFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0ZcclxuVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG5cclxuTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlXHJcbm1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWVcclxuU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMSAodGhlICdMaWNlbnNlJyksIHRoZSBjb250ZW50cyBvZiB0aGlzXHJcbmZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcclxub2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDBcclxuQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OlxyXG5cclxuaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCXHJcblxyXG5Ob3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW5cclxuJ0FTIElTJyBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TXHJcbkRJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORFxyXG5DT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEFcclxuUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcbk9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLFxyXG5WZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcyxcclxuSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuXHJcbkNvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZFxyXG5lbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG5cclxuQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhpcyBzb2Z0d2FyZSB3YXMgY3JlYXRlZCB1c2luZyB0aGVcclxuT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXNcclxubm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZyBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpXHJcbnZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi5cMCINCiAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJcMCINCiAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiVXRpbGl0eSBmb3IgdmVyaWZ5aW5nIGV4dGVuc2lvbiBlbnRyeSBwb2ludHNcMCINCiAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLDQsMCwwXDAiDQogICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImdsZXdpbmZvXDAiDQogICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiqSAyMDAzLTIwMDcgTWlsYW4gSWtpdHMgJiBNYXJjZWxvIE1hZ2FsbG9uXDAiDQogICAgICAgICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIlwwIg0KICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBGSUxFTkFNRSAiXDAiDQogICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIlwwIg0KICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlRoZSBPcGVuR0wgRXh0ZW5zaW9uIFdyYW5nbGVyIExpYnJhcnlcMCINCiAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLDQsMCwwXDAiDQogICAgICAgICAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIlwwIg0KICAgICAgICBFTkQNCiAgICBFTkQNCiAgICBCTE9DSyAiVmFyRmlsZUluZm8iDQogICAgQkVHSU4NCiAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDANCiAgICBFTkQNCkVORA0K