VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgb2xkIGFuZCBwZXJ0YWluIHRvIHByZS1NYWNPU1ggdmVyc2lvbnMuCllvdSBwcm9iYWJseSByZWFsbHkgd2FudGVkIFJFQURNRS5kYXJ3aW4uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBhdHJpY2sgQmVhcmQncyBOb3RlcyBmb3IgYnVpbGRpbmcgR0MgdjQuMTIgd2l0aCBDb2RlV2FycmlvciBQcm8gMjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGUgY3VycmVudCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIGNvbGxlY3RvciBpcyBDb2RlV2FycmlvciBQcm8gMi4KUHJvamVjdHMgZm9yIENvZGVXYXJyaW9yIFBybyAyIChhbmQgZm9yIHF1aXRlIGEgZmV3IG9sZGVyIHZlcnNpb25zKQphcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUgTWFjX3Byb2plY3RzLnNpdC5ocXguIFRoZSBwcm9qZWN0IGZpbGUKOk1hY19wcm9qZWN0czpnYy5wcmogYnVpbGRzIHN0YXRpYyBsaWJyYXJ5IHZlcnNpb25zIG9mIHRoZSBjb2xsZWN0b3IuCjpNYWNfcHJvamVjdHM6Z2N0ZXN0LnByaiBidWlsZHMgdGhlIEdDIHRlc3Qgc3VpdGUuCgpDb25maWd1cmluZyB0aGUgY29sbGVjdG9yIGlzIHN0aWxsIGRvbmUgYnkgZWRpdGluZyB0aGUgZmlsZXMKOk1hY19maWxlczpNYWNPU19jb25maWcuaCBhbmQgOk1hY19maWxlczpNYWNPU19UZXN0X2NvbmZpZy5oLgoKTGFycyBGYXJtJ3Mgc3VnZ2VzdGlvbnMgb24gYnVpbGRpbmcgdGhlIGNvbGxlY3RvcjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpHYXJiYWdlIENvbGxlY3Rpb24gb24gTWFjT1MgLSBhIG1hbnVhbCAnTWFrZUZpbGUnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClByb2plY3QgZmlsZXMgYW5kIElERSdzIGFyZSBncmVhdCBvbiB0aGUgTWFjaW50b3NoLCBidXQgdGhleSBkbyBoYXZlCnByb2JsZW1zIHdoZW4gdXNlZCBhcyBkaXN0cmlidXRpb24gbWVkaWEuIFRoaXMgbm90ZSB0cmllcyB0byBwcm92aWRlCnBvcnRpbmcgaW5zdHJ1Y3Rpb25zIGluIHB1cmUgVEVYVCBmb3JtIHRvIGF2b2lkIHRob3NlIHByb2JsZW1zLiBBIG1hbnVhbAonbWFrZWZpbGUnIGlmIHlvdSBsaWtlLgoKICAgIEdDIHZlcnNpb246ICAgICA0LjEyYTIKICAgIENvZGV3YXJyaW9yOiAgICBDV1BybzEKICAgIGRhdGU6ICAgICAgICAgICAxOCBKdWx5IDE5OTcKClRoZSBub3RlcyBtYXkgb3IgbWF5IG5vdCBhcHBseSB0byBlYXJsaWVyIG9yIGxhdGVyIHZlcnNpb25zIG9mIHRoZQpHQy9DV1Byby4gQWN0dWFsbHksIHRoZXkgZG8gYXBwbHkgdG8gZWFybGllciB2ZXJzaW9ucyBvZiBib3RoIGV4Y2VwdCB0aGF0CnVudGlsIHJlY2VudGx5IGEgcHJvamVjdCBjb3VsZCBvbmx5IGJ1aWxkIG9uZSB0YXJnZXQgc28gZWFjaCB0YXJnZXQgd2FzIGEKc2VwYXJhdGUgcHJvamVjdC4gVGhlIG5vdGVzIHdpbGwgbW9zdCBsaWtlbHkgYXBwbHkgdG8gZnV0dXJlIHZlcnNpb25zIHRvby4KUG9zc2libHkgd2l0aCBtaW5vciB0d2Vha3MuCgpUaGlzIGlzIGp1c3QgdG8gcmVjb3JkIG15IGV4cGVyaWVuY2VzLiBUaGVzZSBub3RlcyBkbyBub3QgbWVhbiBJIG5vdwpwcm92aWRlIGEgc3VwcG9ydGVkIHBvcnQgb2YgdGhlIEdDIHRvIE1hY09TLiBJdCB3b3JrcyBmb3IgbWUuIElmIGl0IHdvcmtzCmZvciB5b3UsIGdyZWF0LiBJZiBpdCBkb2Vzbid0LCBzb3JyeSwgdHJ5IGFnYWluLi4uOy0pIFN0aWxsLCBpZiB5b3UgZmluZAplcnJvcnMsIHBsZWFzZSBsZXQgbWUga25vdy4KCiAgICBtYWlsdG86ICAgICAgICAgbGFycy5mYXJtQGl0ZS5taC5zZQoKICAgIGFkZHJlc3M6ICAgICAgICBMYXJzIEZhcm0KICAgICAgICAgICAgICAgICAgICBLcvZuduRnZW4gMzNiCiAgICAgICAgICAgICAgICAgICAgODU2IDQ0IFN1bmRzdmFsbAogICAgICAgICAgICAgICAgICAgIFN3ZWRlbgoKUG9ydGluZyB0byBNYWNPUyBpcyBhIGJpdCBtb3JlIGNvbXBsZXggdGhhbiBpdCBmaXJzdCBzZWVtcy4gV2hpY2ggTWFjT1M/CjY4Sy9Qb3dlclBDPyBXaGljaCBjb21waWxlcj8gRWFjaCBzdXBwb3J0cyBib3RoIDY4SyBhbmQgUG93ZXJQQyBhbmQgb2ZmZXIgYQpsYXJnZSBudW1iZXIgb2YgKHVuaXF1ZSB0byBlYWNoIGVudmlyb25tZW50KSBjb21waWxlciBzZXR0aW5ncy4gRWFjaApjb21iaW5hdGlvbiBvZiBjb21waWxlci82OEsvUFBDL3NldHRpbmdzIHJlcXVpcmUgYSB1bmlxdWUgY29tYmluYXRpb24gb2YKc3RhbmRhcmQgbGlicmFyaWVzLiBBbmQgdGhlIElERSdzIGRvZXMgbm90IHNlbGVjdCB0aGVtIGZvciB5b3UuIFRoZXkgZG9uJ3QKZXZlbiBjaGVjayB0aGF0IHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IHdpdGggY29tcGF0aWJsZSBzZXR0aW5nIGFuZCB0aGlzIGlzCnRoZSBtYWpvciBzb3VyY2Ugb2YgcHJvYmxlbXMgd2hlbiBwb3J0aW5nIHRoZSBHQyAoYW5kIG90aGVyd2lzZSB0b28pLgoKWW91IHdpbGwgaGF2ZSB0byBtYWtlIGNob2ljZXMgd2hlbiB5b3UgY29uZmlndXJlIHRoZSBHQy4gSSd2ZSBtYWRlIHNvbWUKY2hvaWNlcyBoZXJlLCBidXQgdGhlcmUgYXJlIG90aGVyIGNvbWJpbmF0aW9ucyBvZiBzZXR0aW5ncyBhbmQgI2RlZmluZXMKdGhhdCB3b3JrIHRvby4KCkFzIGZvciB0YXJnZXQgc2V0dGluZ3MgdGhlIG1ham9yIG9ic3RhY2xlcyBtYXkgYmU6Ci0gNjhLIFByb2Nlc3NvcjogY2hlY2sgIjQtYnl0ZSBJbnRzIi4KLSBQUEMgUHJvY2Vzc29yOiB1bmNoZWNrICJTdG9yZSBTdGF0aWMgRGF0YSBpbiBUT0MiLgoKV2hhdCB5b3UgbmVlZCB0byBkbzoKPT09PT09PT09PT09PT09PT09PQoKMSkgQnVpbGQgdGhlIEdDIGFzIGEgbGlicmFyeQoyKSBUZXN0IHRoYXQgdGhlIGxpYnJhcnkgd29ya3Mgd2l0aCAndGVzdC5jJy4KMykgVGVzdCB0aGF0IHRoZSBDKysgaW50ZXJmYWNlICdnY19jcHAuY2MvaCcgd29ya3Mgd2l0aCAndGVzdF9jcHAuY2MnLgoKMSkgVGhlIExpYnJhcmllczoKPT09PT09PT09PT09PT09PT0KSSBtYWRlIG9uZSBwcm9qZWN0IHdpdGggZm91ciB0YXJnZXRzICg2OEsvUFBDIHRlbXBtZW0gb3IgYXBwaGVhcCkuIE9uZSB0YXJnZXQKd2lsbCBzdWZmaWNlIGlmIHlvdSdyZSBhYmxlIHRvIGRlY2lkZSB3aGljaCBvbmUgeW91IHdhbnQuIEkgd2Fzbid0Li4uCgpDb2Rld2FycmlvciBhbGxvd3MgYSBsYXJnZSBudW1iZXIgb2YgY29tcGlsZXIvbGlua2VyIHNldHRpbmdzLiBJIHVzZWQgdGhlc2U6CgpTZXR0aW5ncyBzaGFyZWQgYnkgYWxsIHRhcmdldHM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpvIEFjY2VzcyBQYXRoczoKICAtIFVzZXIgUGF0aHM6ICAgdGhlIEdDIGZvbGRlcgogIC0gU3lzdGVtIFBhdGhzOiB7Q29tcGlsZXJ9Ok1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeToKICAgICAgICAgICAgICAgICAge0NvbXBpbGVyfTpNYWNPUyBTdXBwb3J0OkhlYWRlcnM6CiAgICAgICAgICAgICAgICAgIHtDb21waWxlcn06TWFjT1MgU3VwcG9ydDpNYWNIZWFkZXJzOgpvIEMvQysrIGxhbmd1YWdlOgogIC0gaW5saW5pbmc6IG5vcm1hbAogIC0gZGlyZWN0IHRvIFNPTTogb2ZmCiAgLSBlbmFibGUvY2hlY2s6IGV4Y2VwdGlvbnMsIFJUVEksIGJvb2wgKGFuZCBpZiB5b3UgbGlrZSBwb29sIHN0cmluZ3MpCgpQb3dlclBDIHRhcmdldCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpvIFRhcmdldCBTZXR0aW5nczoKICAtIG5hbWUgb2YgdGFyZ2V0CiAgLSBNYWNPUyBQUEMgTGlua2VyCm8gUFBDIFRhcmdldAogIC0gbmFtZSBvZiBsaWJyYXJ5Cm8gQy9DKysgbGFuZ3VhZ2UKICAtIHByZWZpeCBmaWxlIGFzIGRlc2NyaWJlZCBiZWxvdwpvIFBQQyBQcm9jZXNzb3IKICAtIFN0cnVjdCBBbGlnbm1lbnQ6IFBvd2VyUEMKICAtIHVuY2hlY2sgIlN0b3JlIFN0YXRpYyBEYXRhIGluIFRPQyIgLS0gaW1wb3J0YW50IQogICAgSSBkb24ndCB0aGluayB0aGUgb3RoZXJzIG1hdHRlciwgSSB1c2UgZnVsbCBvcHRpbWl6YXRpb24gYW5kIGl0cyBvawpvIFBQQyBMaW5rZXIKICAtIEZhY3RvcnkgU2V0dGluZ3MgKFNZTSBmaWxlIHdpdGggZnVsbCBwYXRocywgZmFzdGVyIGxpbmtpbmcsIGRlYWQtc3RyaXAKICAgIHN0YXRpYyBpbml0LCBNYWluOiBfX3N0YXJ0KQoKCjY4SyB0YXJnZXQgc2V0dGluZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLQpvIFRhcmdldCBTZXR0aW5nczoKICAtIG5hbWUgb2YgdGFyZ2V0CiAgLSBNYWNPUyA2OEsgTGlua2VyCm8gNjhLIFRhcmdldAogIC0gbmFtZSBvZiBsaWJyYXJ5CiAgLSBBNSByZWxhdGl2ZSBkYXRhCm8gQy9DKysgbGFuZ3VhZ2UKICAtIHByZWZpeCBmaWxlIGFzIGRlc2NyaWJlZCBiZWxvdwpvIDY4SyBQcm9jZXNzb3IKICAtIENvZGUgbW9kZWw6IHNtYXJ0CiAgLSBTdHJ1Y3QgYWxpZ25tZW50OiA2OEsKICAtIEZQOiBTQU5FCiAgLSBlbmFibGUgNC1CeXRlIEludHMgLS0gaW1wb3J0YW50IQogICAgSSBkb24ndCB0aGluayB0aGUgb3RoZXJzIG1hdHRlci4gSSBzZWxlY3RlZC4uLgogIC0gZW5hYmxlOiA2ODAyMAogIC0gZW5hYmxlOiBnbG9iYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbgpvIElSIE9wdGltaXplcgogIC0gZW5hYmxlOiBPcHRpbWl6ZSBTcGFjZSwgT3B0aW1pemUgU3BlZWQKICAgIEkgc3VwcG9zZSB0aGUgb3RoZXJzIHdvdWxkIHdvcmsgdG9vLCBidXQgaGF2ZW4ndCB0cmllZC4uLgpvIDY4SyBMaW5rZXIKICAtIEZhY3RvcnkgU2V0dGluZ3MgKE5ldyBTdHlsZSBNYWNzQnVnLFNZTSBmaWxlIHdpdGggZnVsbCBwYXRocywKICAgIEE2IEZyYW1lcywgZmFzdCBsaW5rLCBNZXJnZSBjb21waWxlciBnbHVlIGludG8gc2VnbWVudCAxLAogICAgZGVhZC1zdHJpcCBzdGF0aWMgaW5pdCkKClByZWZpeCBGaWxlcyB0byBjb25maWd1cmUgdGhlIEdDIHNvdXJjZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGUgQ29kZXdhcnJpb3IgZXF1aXZhbGVudCBvZiBjb21tYW5kbGluZSBjb21waWxlcnMgLUROQU1FPVggaXMgdG8gdXNlCnByZWZpeC1maWxlcy4gQSBURVhUIGZpbGUgdGhhdCBpcyBhdXRvbWF0aWNhbGx5ICNpbmNsdWRlZCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUKb2YgZXZlcnkgc291cmNlIGZpbGUuIEkgdXNlZCB0aGVzZToKCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0gIGdjX3ByZWZpeF90ZW1wbWVtLmggICAgIC0tIDY4SyBhbmQgUFBDIC0tLS0tCiAgICAjaW5jbHVkZSAiZ2NfcHJlZml4X2NvbW1vbi5oIgogICAgI3VuZGVmIFVTRV9URU1QT1JBUllfTUVNT1JZCiAgICAjZGVmaW5lIFVTRV9URU1QT1JBUllfTUVNT1JZCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0gIGdjX3ByZWZpeF9hcHBtZW0uaCAgICAgIC0tIDY4SyBhbmQgUFBDIC0tLS0tCiAgICAjaW5jbHVkZSAiZ2NfcHJlZml4X2NvbW1vbi5oIgogICAgI3VuZGVmIFVTRV9URU1QT1JBUllfTUVNT1JZCi8vICAjZGVmaW5lIFVTRV9URU1QT1JBUllfTUVNT1JZCgotLS0tICggY3V0IGhlcmUgKSAtLS0tICBnY19wcmVmaXhfY29tbW9uLmggICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBnY19wcmVmaXhfY29tbW9uLmgKLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvZGV3YXJyaW9yIHByZWZpeCBmaWxlIHRvIGNvbmZpZ3VyZSB0aGUgR0MgbGlicmFyaWVzCi8vCi8vICAgcHJlZml4IGZpbGVzIGFyZSB0aGUgQ29kZXdhcnJpb3IgZXF1aXZhbGVudCBvZiB0aGUKLy8gICBjb21tYW5kIGxpbmUgb3B0aW9uIC1EbmFtZT14IGZyZXF1ZW50bHkgc2VlbiBpbiBtYWtlZmlsZXMKCiNpZiAhX19NV0VSS1NfXwogICNlcnJvciBvbmx5IHRyaWVkIHRoaXMgd2l0aCBDb2Rld2FycmlvcgojZW5kaWYKCiNpZiBtYWNpbnRvc2gKICAjZGVmaW5lIE1TTF9VU0VfUFJFQ09NUElMRURfSEVBREVSUyAwCiAgI2luY2x1ZGUgPGFuc2lfcHJlZml4Lm1hYy5oPgogICNpZm5kZWYgX19TVERDX18KICAgICNkZWZpbmUgX19TVERDX18gMAogICNlbmRpZgoKICAvLyAgU2VlIGxpc3Qgb2YgI2RlZmluZXMgdG8gY29uZmlndXJlIHRoZSBsaWJyYXJ5IGluOiAnTWFrZUZpbGUnCiAgLy8gIHNlZSBhbHNvIFJFQURNRQoKICAjZGVmaW5lIFNJTEVOVCAgICAgICAgICAgICAgICAvLyBubyBjb2xsZWN0aW9uIG1lc3NhZ2VzLiBJbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdHJvdWJsZSB5b3UgbWlnaHQgd2FudCB0aGlzIG9mZgogICNkZWZpbmUgQUxMX0lOVEVSSU9SX1BPSU5URVJTIC8vIGZvbGxvd3MgaW50ZXJpb3IgcG9pbnRlcnMuCi8vI2RlZmluZSBET05UX0FERF9CWVRFX0FUX0VORCAgLy8gZGlzYWJsZXMgdGhlIHBhZGRpbmcgaWYgZGVmaW5lZC4KLy8jZGVmaW5lIFNNQUxMX0NPTkZJRyAgICAgICAgICAvLyB3aGV0aGVyIHRvIHVzZSBhIHNtYWxsZXIgaGVhcC4KICAjZGVmaW5lIE5PX1NJR05BTFMgICAgICAgICAgICAvLyBzaWduYWxzIGFyZW4ndCByZWFsIG9uIHRoZSBNYWNpbnRvc2guCiAgI2RlZmluZSBBVE9NSUNfVU5DT0xMRUNUQUJMRSAgLy8gR0NfbWFsbG9jX2F0b21pY191bmNvbGxlY3RhYmxlKCkKCiAgLy8gZGVmaW5lIGVpdGhlciBvciBub25lIGFzIHBlciBwZXJzb25hbCBwcmVmZXJlbmNlCiAgLy8gICB1c2VkIGluIG1hbGxvYy5jCiAgI2RlZmluZSBSRURJUkVDVF9NQUxMT0MgR0NfbWFsbG9jCi8vI2RlZmluZSBSRURJUkVDVF9NQUxMT0MgR0NfbWFsbG9jX3VuY29sbGVjdGFibGUKICAvLyBpZiBSRURJUkVDVF9NQUxMT0MgaXMgI2RlZmluZWQgbWFrZSBzdXJlIHRoYXQgdGhlIEdDIGxpYnJhcnkKICAvLyBpcyBsaXN0ZWQgYmVmb3JlIHRoZSBBTlNJL0lTTyBsaWJzIGluIHRoZSBDb2Rld2FycmlvcgogIC8vICdMaW5rIG9yZGVyJyBwYW5lbAovLyNkZWZpbmUgSUdOT1JFX0ZSRUUKCiAgLy8gbWFjIHNwZWNpZmljIGNvbmZpZ3MKLy8jZGVmaW5lIFVTRV9URU1QT1JBUllfTUVNT1JZICAgIC8vIHVzZSBNYWNpbnRvc2ggdGVtcG9yYXJ5IG1lbW9yeS4KLy8jZGVmaW5lIFNIQVJFRF9MSUJSQVJZX0JVSUxEICAgIC8vIGJ1aWxkIGZvciB1c2UgaW4gYSBzaGFyZWQgbGlicmFyeS4KCiNlbHNlCiAgLy8gY291bGQgYnVpbGQgV2luMzIgaGVyZSB0b28sIG9yIGluIHRoZSBmdXR1cmUKICAvLyBSaGFwc29keSBQUEMtbWFjaCwgUmhhcHNvZHkgUFBDLU1hY09TLAogIC8vIFJoYXBzb2R5IEludGVsLW1hY2gsIFJoYXBzb2R5IEludGVsLVdpbjMyLC4uLgogIC8vIC4uLiB1Z2ggdGhpcyB3aWxsIGdldCBtZXNzeSAuLi4KI2VuZGlmCgovLyBtYWtlIHN1cmUgaW50cyBhcmUgYXQgbGVhc3QgMzItYml0Ci8vICggY291bGQgYmUgc2V0IHRvIDE2LWJpdCBieSBjb21waWxlciBzZXR0aW5ncyAoNjhLKSApCgpzdHJ1Y3QgZ2NfcHJpdmF0ZV9hc3NlcnRfaW50c2l6ZV97IGNoYXIgeFsgc2l6ZW9mKGludCk+PTQgPyAxIDogMCBdOyB9OwoKI2lmIF9fcG93ZXJjCiAgI2lmIF9fb3B0aW9uKHRvY19kYXRhKQogICAgI2Vycm9yIHR1cm4gb2ZmICJzdG9yZSBzdGF0aWMgZGF0YSBpbiBUT0MiIHdoZW4gdXNpbmcgR0MKICAgIC8vICAgICAuLi4gb3IgZmluZCBhIHdheSB0byBhZGQgVE9DIHRvIHRoZSByb290IHNldC4uLig/KQogICNlbmRpZgojZW5kaWYKLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZW5kIG9mIGdjX3ByZWZpeF9jb21tb24uaCAgLS0tLS0tLS0tLS0tLS0tLS0KCkZpbGVzIHRvICBidWlsZCB0aGUgR0MgbGlicmFyaWVzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYWxsY2hibGsuYwogICAgYWxsb2MuYwogICAgYmxhY2tsc3QuYwogICAgY2hlY2tzdW1zLmMKICAgIGRiZ19tbGMuYwogICAgZmluYWxpemUuYwogICAgaGVhZGVycy5jCiAgICBtYWNoX2RlcC5jCiAgICBNYWNPUy5jICAgIC0tIGNvbnRhaW5zIE1hY09TIGNvZGUKICAgIG1hbGxvYy5jCiAgICBtYWxsb2N4LmMKICAgIG1hcmsuYwogICAgbWFya19ydHMuYwogICAgbWlzYy5jCiAgICBuZXdfaGJsay5jCiAgICBvYmpfbWFwLmMKICAgIG9zX2RlcC5jICAgLS0gY29udGFpbnMgTWFjT1MgY29kZQogICAgcHRyX2NoY2suYwogICAgcmVjbGFpbS5jCiAgICBzdHViYm9ybi5jCiAgICB0eXBkX21sYy5jCiAgICBnYysrLmNjICAgIC0tIHRoaXMgaXMgJ2djX2NwcC5jYycgd2l0aCBsZXNzICdpbmxpbmUnIGFuZAogICAgICAgICAgICAgICAtLSB0aHJvdyBzdGQ6OmJhZF9hbGxvYyB3aGVuIG91dCBvZiBtZW1vcnkKICAgICAgICAgICAgICAgLS0gZ2NfY3BwLmNjIHdvcmtzIGp1c3QgZmluZSB0b28KCjIpIFRlc3QgdGhhdCB0aGUgbGlicmFyeSB3b3JrcyB3aXRoICd0ZXN0LmMnLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSB0ZXN0IGFwcCBpcyBqdXN0IGFuIG9yZGluYXJ5IEFOU0ktQyBjb25zb2xlIGFwcC4gTWFrZSBzdXJlIHNldHRpbmdzCm1hdGNoIHRoZSBsaWJyYXJ5IHlvdSdyZSB0ZXN0aW5nLgoKRmlsZXMKLS0tLS0KICAgIHRlc3QuYwogICAgdGhlIEdDIGxpYnJhcnkgdG8gdGVzdCAgICAgICAgLS0gbGluayBvcmRlciBiZWZvcmUgQU5TSSBsaWJzCiAgICBzdWl0YWJsZSBNYWMrQU5TSSBsaWJyYXJpZXMKCnByZWZpeDoKLS0tLS0tCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0gIGdjX3ByZWZpeF90ZXN0bGliLmggICAgIC0tIGFsbCBsaWJzIC0tLS0tCiNkZWZpbmUgTVNMX1VTRV9QUkVDT01QSUxFRF9IRUFERVJTIDAKI2luY2x1ZGUgPGFuc2lfcHJlZml4Lm1hYy5oPgojdW5kZWYgTkRFQlVHCgojZGVmaW5lIEFMTF9JTlRFUklPUl9QT0lOVEVSUwkvKiBmb3IgR0NfcHJpdi5oICovCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0KCjMpIFRlc3QgdGhhdCB0aGUgQysrIGludGVyZmFjZSAnZ2NfY3BwLmNjL2gnIHdvcmtzIHdpdGggJ3Rlc3RfY3BwLmNjJy4KClRoZSB0ZXN0IGFwcCBpcyBqdXN0IGFuIG9yZGluYXJ5IEFOU0ktQyBjb25zb2xlIGFwcC4gTWFrZSBzdXJlIHNldHRpbmdzIG1hdGNoCnRoZSBsaWJyYXJ5IHlvdSdyZSB0ZXN0aW5nLgoKRmlsZXMKLS0tLS0KICAgIHRlc3RfY3BwLmNjCiAgICB0aGUgR0MgbGlicmFyeSB0byB0ZXN0ICAgICAgICAtLSBsaW5rIG9yZGVyIGJlZm9yZSBBTlNJIGxpYnMKICAgIHN1aXRhYmxlIE1hYytBTlNJIGxpYnJhcmllcwoKcHJlZml4OgotLS0tLS0Kc2FtZSBhcyBmb3IgdGVzdC5jCgpGb3IgY29udmVuaWVuY2UgSSB1c2VkIG9uZSB0ZXN0LXByb2plY3Qgd2l0aCBzZXZlcmFsIHRhcmdldHMgc28gdGhhdCBhbGwKdGVzdCBhcHBzIGFyZSBidWlsZCBhdCBvbmNlLiBUd28gZm9yIGVhY2ggbGlicmFyeSB0byB0ZXN0OiB0ZXN0LmMgYW5kCmdjX2FwcC5jYy4gV2hlbiBJIHdhcyBzYXRpc2ZpZWQgdGhhdCB0aGUgbGlicmFyaWVzIHdlcmUgb2suIEkgcHV0IHRoZQpsaWJyYXJpZXMgKyBnYy5oICsgdGhlIGMrKyBpbnRlcmZhY2UtZmlsZSBpbiBhIGZvbGRlciB0aGF0IEkgdGhlbiBwdXQgaW50bwp0aGUgTVNMIGhpZXJhcmNoeSBzbyB0aGF0IEkgZG9uJ3QgaGF2ZSB0byBhbHRlciBhY2Nlc3MtcGF0aHMgaW4gcHJvamVjdHMKdGhhdCB1c2UgdGhlIEdDLgoKQWZ0ZXIgdGhhdCwganVzdCBhZGQgdGhlIHByb3BlciBHQyBsaWJyYXJ5IHRvIHlvdXIgcHJvamVjdCBhbmQgdGhlIEdDIGlzIGluCmFjdGlvbiEgbWFsbG9jIHdpbGwgY2FsbCBHQ19tYWxsb2MgYW5kIGZyZWUgR0NfZnJlZSwgbmV3L2RlbGV0ZSB0b28uIFlvdQpkb24ndCBoYXZlIHRvIGNhbGwgZnJlZSBvciBkZWxldGUuIFlvdSBtYXkgaGF2ZSB0byBiZSBhIGJpdCBjYXV0aW91cyBhYm91dApkZWxldGUgaWYgeW91J3JlIGZyZWVpbmcgb3RoZXIgcmVzb3VyY2VzIHRoYW4gUkFNLiBTZWUgZ2NfY3BwLmguIFlvdSBjYW4KYWxzbyBrZWVwIGNvZGluZyBhcyBhbHdheXMgd2l0aCBkZWxldGUvZnJlZS4gVGhhdCB3b3JrcyB0b28uIElmIHlvdSB3YW50LAoiaW5jbHVkZSA8Z2MuaD4gYW5kIHR3ZWFrIGl0J3MgdXNlIGEgYml0LgoKU3ltYW50ZWMgU1BNCj09PT09PT09PT09PQpJdCBoYXMgYmVlbiBhIHdoaWxlIHNpbmNlIEkgdHJpZWQgdGhlIEdDIGluIFNQTSwgYnV0IEkgdGhpbmsgdGhhdCB0aGUgYWJvdmUKaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGd1aWRlIHlvdSB0aHJvdWdoIGluIFNQTSB0b28uIFNQTQpuZWVkcyB0byBrbm93IHdoZXJlIHRoZSBnbG9iYWwgZGF0YSBpcy4gVXNlIHRoZSBmaWxlcyAnZGF0YXN0YXJ0LmMnIGFuZAonZGF0YWVuZC5jJy4gUHV0ICdkYXRhc3RhcnQuYycgYXQgdGhlIHRvcCBvZiB5b3VyIHByb2plY3QgYW5kICdkYXRhZW5kLmMnCmF0IHRoZSBib3R0b20gIG9mIHlvdXIgcHJvamVjdCBzbyB0aGF0IGFsbCBkYXRhIGlzIHN1cnJvdW5kZWQuIFRoaXMgaXMgbm90Cm5lZWRlZCBpbiBDb2Rld2FycmlvciBiZWNhdXNlIGl0IHByb3ZpZGVzIGludHJpbnNpYyB2YXJpYWJsZXMKX19kYXRhc3RhcnRfXywgX19kYXRhX2VuZF9fIHRoYXQgd3JhcHMgYWxsIGdsb2JhbHMuCgpTb3VyY2UgQ2hhbmdlcyAoR0MgNC4xMmEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PQpWZXJ5IGZldy4gSnVzdCBvbmUgdGlueSBpbiB0aGUgR0MsIG5vdCBzdHJpY3RseSBuZWVkZWQuCi0gTWFjT1MuYyBsaW5lIDEzMSBpbiByb3V0aW5lIEdDX01hY0ZyZWVUZW1wb3JhcnlNZW1vcnkoKQogIGNoYW5nZSAjICAgICAgIGlmICFkZWZpbmVkKFNIQVJFRF9MSUJSQVJZX0JVSUxEKQogIHRvICAgICAjICAgICAgIGlmICFkZWZpbmVkKFNJTEVOVCkgJiYgIWRlZmluZWQoU0hBUkVEX0xJQlJBUllfQlVJTEQpCiAgVG8gdHVybiBvZmYgYSBtZXNzYWdlIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHF1aXRzIChhY3R1YWxseSwgSSBmYWtlZAogIHRoaXMgY2hhbmdlIGJ5ICNkZWZpbmluZyBTSEFSRURfTElCUkFSWV9CVUlMRCBpbiBhIHN0YXRpY2FsbHkgbGlua2VkCiAgbGlicmFyeSBmb3IgbW9yZSB0aGFuIGEgeWVhciB3aXRob3V0IGlsbCBlZmZlY3RzIGJ1dCBwZXJoYXBzIHRoaXMgaXMKICBiZXR0ZXIpLgoKLSB0ZXN0X2NwcC5jYwogIG1hZGUgdGhlIGZpcnN0IGxpbmVzIG9mIG1haW4oKSBsb29rIGxpa2UgdGhpczoKICAtLS0tLS0tLS0tLS0KICBpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKICAjZW5kaWYKICAjaWYgbWFjaW50b3NoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWNPUwogICAgY2hhciogYXJndl9bXSA9IHsidGVzdF9jcHAiLCIxMCJ9OyAgICAgIC8vICAgZG9lc24ndAogICAgYXJndj1hcmd2XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYXZlIGEKICAgIGFyZ2MgPSBzaXplb2YoYXJndl8pL3NpemVvZihhcmd2X1swXSk7ICAvLyAgICAgICBjb21tYW5kbGluZQogICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCgogIGludCBpLCBpdGVycywgbjsKICAjIGlmbmRlZiBfX0dOVUNfXwogICBhbGxvYyBkdW1teV90b19mb29sX3RoZV9jb21waWxlcl9pbnRvX2RvaW5nX3RoaW5nc19pdF9jdXJyZW50bHlfY2FudF9oYW5kbGU7CiAgLS0tLS0tLS0tLS0tCgotIGNvbmZpZy5oIFtub3cgZ2Njb25maWcuaF0KICBfX01XRVJLU19fIGRvZXMgbm90IGhhdmUgdG8gbWVhbiBNQUNPUy4gWW91IGNhbiB1c2UgQ29kZXdhcnJpb3IgdG8KICBidWlsZCBhIFdpbjMyIG9yIEJlT1MgbGlicmFyeSBhbmQgc29vbiBhIFJoYXBzb2R5IGxpYnJhcnkuIFlvdSBtYXkKICBoYXZlIHRvIGNoYW5nZSB0aGF0ICNpZi4uLgoKCgogICBJdCB3b3JrZWQgZm9yIG1lLCBob3BlIGl0IHdvcmtzIGZvciB5b3UuCgogICBMYXJzIEZhcm0KICAgMTggSnVseSAxOTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpQYXRyaWNrIEJlYXJkJ3MgaW5zdHJ1Y3Rpb25zIChtYXkgYmUgZGF0ZWQpOgoKdjQuMyBvZiB0aGUgY29sbGVjdG9yIG5vdyBydW5zIHVuZGVyIFN5bWFudGVjIEMrKy9USElOSyBDIHY3LjAuNCwgYW5kCk1ldHJvd2Vya3MgQy9DKysgdjQuNSBib3RoIDY4SyBhbmQgUG93ZXJQQy4gUHJvamVjdCBmaWxlcyBhcmUgcHJvdmlkZWQKdG8gYnVpbGQgYW5kIHRlc3QgdGhlIGNvbGxlY3RvciB1bmRlciBib3RoIGRldmVsb3BtZW50IHN5c3RlbXMuCgpDb25maWd1cmF0aW9uCi0tLS0tLS0tLS0tLS0KClRvIGNvbmZpZ3VyZSB0aGUgY29sbGVjdG9yLCB1bmRlciBib3RoIGRldmVsb3BtZW50IHN5c3RlbXMsIGEgcHJlZml4IGZpbGUKaXMgdXNlZCB0byBzZXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuIFRoaXMgZmlsZSBpcyBjYWxsZWQgIk1hY09TX2NvbmZpZy5oIi4KQWxzbyB0byB0ZXN0IHRoZSBjb2xsZWN0b3IsICJNYWNPU19UZXN0X2NvbmZpZy5oIiBpcyBwcm92aWRlZC4KClRlc3RpbmcKLS0tLS0tLQoKVG8gdGVzdCB0aGUgY29sbGVjdG9yIChhbHdheXMgYSBnb29kIGlkZWEpLCBidWlsZCBvbmUgb2YgdGhlIGdjdGVzdCBwcm9qZWN0cywKZ2N0ZXN0LrkgKFN5bWFudGVjIEMrKy9USElOSyBDKSwgbXcvZ2N0ZXN0LjY4Sy65LCBvciBtdy9nY3Rlc3QuUFBDLrkuIFRoZQp0ZXN0IHdpbGwgYXNrIHlvdSBob3cgbWFueSB0aW1lcyB0byBydW47IDEgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCgpCdWlsZGluZyAKLS0tLS0tLS0KCkZvciB5b3VyIGNvbnZlbmllbmNlIHByb2plY3QgZmlsZXMgZm9yIHRoZSBtYWpvciBNYWNpbnRvc2ggZGV2ZWxvcG1lbnQKc3lzdGVtcyBhcmUgcHJvdmlkZWQuCgpGb3IgU3ltYW50ZWMgQysrL1RISU5LIEMsIHlvdSBtdXN0IGJ1aWxkIHRoZSB0d28gcHJvamVjdHMgZ2NsaWItMS65IGFuZApnY2xpYi0yLrkuIEl0IGhhcyB0byBiZSBzcGxpdCB1cCBiZWNhdXNlIHRoZSBjb2xsZWN0b3IgaGFzIG1vcmUgdGhhbiAzMmsKb2Ygc3RhdGljIGRhdGEgYW5kIG5vIGxpYnJhcnkgY2FuIGhhdmUgbW9yZSB0aGFuIHRoaXMgaW4gdGhlIFN5bWFudGVjCmVudmlyb25tZW50LiAoRnV0dXJlIHZlcnNpb25zIHdpbGwgcHJvYmFibHkgZml4IHRoaXMuKQoKRm9yIE1ldHJvd2Vya3MgQy9DKysgNC41IHlvdSBidWlsZCBnYy42OEsuuS9nYy5QUEMuuSBhbmQgdGhlIHJlc3VsdCB3aWxsCmJlIGEgbGlicmFyeSBjYWxsZWQgZ2MuNjhLLmxpYi9nYy5QUEMubGliLgoKVXNpbmcKLS0tLS0KClVuZGVyIFN5bWFudGVjIEMrKy9USElOSyBDLCB5b3UgY2FuIGp1c3QgYWRkIHRoZSBnY2xpYi0xLrkgYW5kIGdjbGliLTIuuQpwcm9qZWN0cyB0byB5b3VyIG93biBwcm9qZWN0LiBVbmRlciBNZXRyb3dlcmtzLCB5b3UgYWRkIGdjLjY4Sy5saWIgb3IKZ2MuUFBDLmxpYiBhbmQgdHdvIGFkZGl0aW9uYWwgZmlsZXMuIFlvdSBhZGQgdGhlIGZpbGVzIGNhbGxlZCBkYXRhc3RhcnQuYwphbmQgZGF0YWVuZC5jIHRvIHlvdXIgcHJvamVjdCwgYnJhY2tldGluZyBhbGwgZmlsZXMgdGhhdCB1c2UgdGhlIGNvbGxlY3Rvci4KU2VlIG13L2djdGVzdC65IGZvciBhbiBleGFtcGxlLgoKSW5jbHVkZSB0aGUgcHJvamVjdHMvbGlicmFyaWVzIHlvdSBidWlsdCBhYm92ZSBpbnRvIHlvdXIgb3duIHByb2plY3QsCiNpbmNsdWRlICJnYy5oIiwgYW5kIGNhbGwgR0NfbWFsbG9jLiBZb3UgZG9uJ3QgaGF2ZSB0byBjYWxsIEdDX2ZyZWUuCgoKUGF0cmljayBDLiBCZWFyZApKYW51YXJ5IDQsIDE5OTUK