Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBHYXllcgogICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX2ZpeHBvaW50X21hdGhfSAojZGVmaW5lIF9fZml4cG9pbnRfbWF0aF9ICgoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCiNpZiAhZGVmaW5lZChGVU5DVElPTl9mSXNMZXNzVGhhbikKLyoqCiAqIFxicmllZiBDb21wYXJlcyB0d28gZml4cG9pbnQgdmFsdWVzIGluY2wuIHNjYWxpbmcuCiAqIFxwYXJhbSBhX20gbWFudGlzc2Egb2YgdGhlIGZpcnN0IGlucHV0IHZhbHVlLgogKiBccGFyYW0gYV9lIGV4cG9uZW50IG9mIHRoZSBmaXJzdCBpbnB1dCB2YWx1ZS4KICogXHBhcmFtIGJfbSBtYW50aXNzYSBvZiB0aGUgc2Vjb25kIGlucHV0IHZhbHVlLgogKiBccGFyYW0gYl9lIGV4cG9uZW50IG9mIHRoZSBzZWNvbmQgaW5wdXQgdmFsdWUuCiAqIFxyZXR1cm4gbm9uLXplcm8gaWYgKGFfbSoyXmFfZSkgPCAoYl9tKjJeYl9lKSwgMCBvdGhlcndpc2UKICovCkZES19JTkxJTkUgSU5UIGZJc0xlc3NUaGFuKEZJWFBfREJMIGFfbSwgSU5UIGFfZSwgRklYUF9EQkwgYl9tLCBJTlQgYl9lKQp7CiAgaWYgKGFfZSA+IGJfZSkgewogICAgcmV0dXJuIChiX20gPj4gZk1pbihhX2UtYl9lLCBERlJBQ1RfQklUUy0xKSA+IGFfbSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiAoYV9tID4+IGZNaW4oYl9lLWFfZSwgREZSQUNUX0JJVFMtMSkgPCBiX20pOwogIH0KfQoKRkRLX0lOTElORSBJTlQgZklzTGVzc1RoYW4oRklYUF9TR0wgYV9tLCBJTlQgYV9lLCBGSVhQX1NHTCBiX20sIElOVCBiX2UpCnsKICBpZiAoYV9lID4gYl9lKSB7CiAgICByZXR1cm4gKGJfbSA+PiBmTWluKGFfZS1iX2UsIEZSQUNUX0JJVFMtMSkgPiBhX20pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gKGFfbSA+PiBmTWluKGJfZS1hX2UsIEZSQUNUX0JJVFMtMSkgPCBiX20pOwogIH0KfQojZW5kaWYKCgoKI2RlZmluZSBMRF9EQVRBX1NDQUxJTkcgKDY0LjBmKQojZGVmaW5lIExEX0RBVEFfU0hJRlQgICA2ICAgLyogcG93KDIsIExEX0RBVEFfU0hJRlQpID0gTERfREFUQV9TQ0FMSU5HICovCgovKioKICogXGJyaWVmIGRlcHJlY2F0ZWQuIFVzZSBmTG9nMigpIGluc3RlYWQuCiAqLwpGSVhQX0RCTCBDYWxjTGREYXRhKEZJWFBfREJMIG9wKTsKCnZvaWQgTGREYXRhVmVjdG9yKEZJWFBfREJMICpzcmNWZWN0b3IsIEZJWFBfREJMICpkZXN0VmVjdG9yLCBJTlQgbnVtYmVyKTsKCkZJWFBfREJMIENhbGNJbnZMZERhdGEoRklYUF9EQkwgb3ApOwoKCnZvaWQgICAgIEluaXRMZEludCgpOwpGSVhQX0RCTCBDYWxjTGRJbnQoSU5UIGkpOwoKZXh0ZXJuIGNvbnN0IFVTSE9SVCBzcXJ0X3RhYls0OV07CgppbmxpbmUgRklYUF9EQkwgc3FydEZpeHBfbG9va3VwKEZJWFBfREJMIHgpCnsKICBVSU5UIHkgPSAoSU5UKXg7CiAgVUNIQVIgaXNfemVybz0oeT09MCk7CiAgSU5UIHplcm9zPWZpeG5vcm16X0QoeSkgJiAweDFlOwogIHk8PD16ZXJvczsKICBVSU5UIGlkeD0oeT4+MjYpLTE2OwogIFVTSE9SVCBmcmFjPSh5Pj4xMCkmMHhmZmZmOwogIFVTSE9SVCBuZnJhYz0weGZmZmZeZnJhYzsKICBVSU5UIHQ9bmZyYWMqc3FydF90YWJbaWR4XStmcmFjKnNxcnRfdGFiW2lkeCsxXTsKICB0PXQ+Pih6ZXJvcz4+MSk7CiAgcmV0dXJuKGlzX3plcm8gPyAwIDogdCk7Cn0KCmlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCwgSU5UICp4X2UpCnsKICBVSU5UIHkgPSAoSU5UKXg7CiAgSU5UIGU7CgogIGlmICh4ID09IChGSVhQX0RCTCkwKSB7CiAgICByZXR1cm4geDsKICB9CgogIC8qIE5vcm1hbGl6ZSAqLwogIGU9Zml4bm9ybXpfRCh5KTsKICB5PDw9ZTsKICBlICA9ICp4X2UgLSBlICsgMjsKCiAgLyogQ29ycmVjdCBvZGQgZXhwb25lbnQuICovCiAgaWYgKGUgJiAxKSB7CiAgICB5ID4+PSAxOwogICAgZSArKzsKICB9CiAgLyogR2V0IHNxdWFyZSByb290ICovCiAgVUlOVCBpZHg9KHk+PjI2KS0xNjsKICBVU0hPUlQgZnJhYz0oeT4+MTApJjB4ZmZmZjsKICBVU0hPUlQgbmZyYWM9MHhmZmZmXmZyYWM7CiAgVUlOVCB0PW5mcmFjKnNxcnRfdGFiW2lkeF0rZnJhYypzcXJ0X3RhYltpZHgrMV07CgogIC8qIFdyaXRlIGJhY2sgZXhwb25lbnQgKi8KICAqeF9lID0gZSA+PiAxOwogIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHQ+PjEpOwp9CgoKCkZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKTsKCnZvaWQgSW5pdEludlNxcnRUYWIoKTsKCkZJWFBfREJMIGludlNxcnROb3JtMihGSVhQX0RCTCBvcCwgSU5UICpzaGlmdCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGludkZpeHAKICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS8ob3ApCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW5saW5lIEZJWFBfREJMIGludkZpeHAoRklYUF9EQkwgb3ApCnsKICAgIElOVCB0bXBfZXhwIDsKICAgIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKSA7CiAgICBGREtfQVNTRVJUKCgzMS0oMip0bXBfZXhwKzEpKT49MCkgOwogICAgcmV0dXJuICggZlBvdzJEaXYyKCAoRklYUF9EQkwpdG1wX2ludiApID4+ICgzMS0oMip0bXBfZXhwKzEpKSApIDsKfQoKCgojaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0yKQoKI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKaW5saW5lIEZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKewogIElOVCByZXN1bHQsIHRtcCA7CiAgIF9fYXNtX18gKCJzcmwgJTEsICUyLCAxNVxuIgogICAgICAgICAgICAiZGl2ICUzLCAlMVxuIiA6ICI9bG8iIChyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiVkIiAodG1wKSwgImQiIChkZW51bSkgLCAgImQiIChudW0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImhpIiApIDsKICByZXR1cm4gcmVzdWx0PDwxNiA7Cn0KCi8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIChfX0dOVUNfXz09MykKCiNkZWZpbmUgRlVOQ1RJT05fc2NodXJfZGl2CmlubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCnsKICBJTlQgcmVzdWx0LCB0bXA7CgogICBfX2FzbV9fICgic3JsICAlW3RtcF0sICVbZGVudW1dLCAxNVxuIgogICAgICAgICAgICAiZGl2ICVbcmVzdWx0XSwgJVtudW1dLCAlW3RtcF1cbiIKICAgICAgICAgICAgOiBbdG1wXSAiK3IiICh0bXApLCBbcmVzdWx0XSI9ciIocmVzdWx0KQogICAgICAgICAgICA6IFtkZW51bV0iciIoZGVudW0pLCBbbnVtXSJyIihudW0pCiAgICAgICAgICAgIDogImhpIiwgImxvIik7CiAgcmV0dXJuIHJlc3VsdCA8PCAoREZSQUNUX0JJVFMtMTYpOwp9CgovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwojZWxpZiBkZWZpbmVkKFNJTVVMQVRFX01JUFNfRElWKQoKI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKaW5saW5lIEZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCnsKICAgIEZES19BU1NFUlQgKGNvdW50PD1ERlJBQ1RfQklUUy0xKTsKICAgIEZES19BU1NFUlQgKG51bT49KEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAoZGVudW0+KEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAobnVtIDw9IGRlbnVtKTsKCiAgICBJTlQgdG1wID0gZGVudW0gPj4gKGNvdW50LTEpOwogICAgSU5UIHJlc3VsdCA9IDA7CgogICAgd2hpbGUgKG51bSA+IHRtcCkKICAgIHsKICAgICAgICBudW0gLT0gdG1wOwogICAgICAgIHJlc3VsdCsrOwogICAgfQoKICAgIHJldHVybiByZXN1bHQgPDwgKERGUkFDVF9CSVRTLWNvdW50KTsKfQoKLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KI2VuZGlmIC8qIHRhcmdldCBhcmNoaXRlY3R1cmUgc2VsZWN0b3IgKi8KCiNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpCi8qKgogKiBcYnJpZWYgRGl2aWRlIHR3byBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBnaXZlbiBwcmVjaXNpb24uCiAqIFxwYXJhbSBudW0gZGl2aWRlbmQKICogXHBhcmFtIGRlbnVtIGRpdmlzb3IKICogXHBhcmFtIGNvdW50IGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQgKHN0YXJ0aW5nIHRvIHRoZSBNU0IpCiAqIFxyZXR1cm4gbnVtL2Rpdmlzb3IKICovCkZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCk7CiNlbmRpZgoKCgpGSVhQX0RCTCBtdWxfZGJsX3NnbF9ybmQgKGNvbnN0IEZJWFBfREJMIG9wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBvcDIpOwoKLyoqCiAqIFxicmllZiBtdWx0aXBseSB0d28gdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiwgdGh1cyBtYXggcHJlY2lzaW9uLgogKiBBdXRob3I6IFJvYmVydCBXZWlkbmVyCiAqCiAqIFxwYXJhbSBmMSBmaXJzdCBmYWN0b3IKICogXHBhcmFtIGYyIHNlY29kIGZhY3RvcgogKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgc3RvcmVkIGludG8KICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcHJvZHVjdCBmMSpmMgogKi8KRklYUF9EQkwgZk11bHROb3JtKAogICAgICAgIEZJWFBfREJMIGYxLAogICAgICAgIEZJWFBfREJMIGYyLAogICAgICAgIElOVCAqcmVzdWx0X2UKICAgICAgICApOwoKaW5saW5lIEZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIpCnsKICBGSVhQX0RCTCBtOwogIElOVCBlOwoKICBtID0gZk11bHROb3JtKGYxLCBmMiwgJmUpOwoKICBtID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG0sIGUpOwoKICByZXR1cm4gbTsKfQoKLyoqCiAqIFxicmllZiBEaXZpZGUgMiBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uIG9mIGlucHV0IHZhbHVlcy4KICogXHBhcmFtIG51bSBudW1lcmF0b3IKICogXHBhcmFtIGRlbnVtIGRlbm9taW50YXRvcgogKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gMAogKi8KRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgSU5UICpyZXN1bHRfZSk7CgovKioKICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgogKiBccGFyYW0gbnVtIG51bWVyYXRvcgogKiBccGFyYW0gZGVudW0gZGVub21pbnRhdG9yCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW50bwogKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gKnJlc3VsdF9lCiAqLwpGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKTsKCi8qKgogKiBcYnJpZWYgRGl2aWRlIDIgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCiAqIFxwYXJhbSBudW0gbnVtZXJhdG9yCiAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9IDAKICovCkZJWFBfREJMIGZEaXZOb3JtSGlnaFByZWMoRklYUF9EQkwgTF9udW0sIEZJWFBfREJMIExfZGVudW0sIElOVCAqcmVzdWx0X2UpOwoKLyoqCiAqIFxicmllZiBDYWxjdWxhdGUgbG9nKGFyZ3VtZW50KS9sb2coMikgKGxvZ2FyaXRobSB3aXRoIGJhc2UgMikuIGRlcHJlY2F0ZWQuIFVzZSBmTG9nMigpIGluc3RlYWQuCiAqIFxwYXJhbSBhcmcgbWFudGlzc2Egb2YgdGhlIGFyZ3VtZW50CiAqIFxwYXJhbSBhcmdfZSBleHBvbmVudCBvZiB0aGUgYXJndW1lbnQKICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHRvIHN0b3JlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CiAqIFxyZXR1cm4gdGhlIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCiAqIFxwYXJhbQogKi8KRklYUF9EQkwgQ2FsY0xvZzIoRklYUF9EQkwgYXJnLCBJTlQgYXJnX2UsIElOVCAqcmVzdWx0X2UpOwoKLyoqCiAqIFxicmllZiByZXR1cm4gMiBeIChleHAgKiAyXmV4cF9lKQogKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CiAqLwpGSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lLCBJTlQgKnJlc3VsdF9lKTsKCi8qKgogKiBcYnJpZWYgcmV0dXJuIDIgXiAoZXhwX20gKiAyXmV4cF9lKS4gVGhpcyB2ZXJzaW9uIHJldHVybnMgb25seSB0aGUgbWFudGlzc2Egd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiB6ZXJvLgogKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCiAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAogKi8KRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSk7CgovKioKICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKICogICAgICAgIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEgY29uc3RhbnQpLgogKiBccGFyYW0gbGR4X20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCiAqIFxwYXJhbSBsZHhfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCiAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgogKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCiAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAogKi8KRklYUF9EQkwgZkxkUG93KAogICAgICAgIEZJWFBfREJMIGJhc2VMZF9tLAogICAgICAgIElOVCBiYXNlTGRfZSwKICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAogICAgICAgIElOVCAqcmVzdWx0X2UKICAgICAgICApOwoKLyoqCiAqIFxicmllZiByZXR1cm4geCBeIChleHAgKiAyXmV4cF9lKSwgd2hlcmUgbG9nMih4KSA9IGJhc2VMZF9tICogMl4oYmFzZUxkX2UpLiBUaGlzIHNhdmVzCiAqICAgICAgICB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhIGNvbnN0YW50KS4gVGhpcyB2ZXJzaW9uCiAqICAgICAgICBkb2VzIG5vdCByZXR1cm4gYW4gZXhwb25lbnQsIHdoaWNoIGlzIGltcGxpY2l0bHkgMC4KICogXHBhcmFtIGxkeF9tIG1hbnRpc3NhIG9mIGxvZzIoKSBvZiB4LgogKiBccGFyYW0gbGR4X2UgZXhwb25lbnQgb2YgbG9nMigpIG9mIHguCiAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgogKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CiAqLwpGSVhQX0RCTCBmTGRQb3coCiAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lCiAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgcmV0dXJuIChiYXNlICogMl5iYXNlX2UpIF4gKGV4cCAqIDJeZXhwX2UpLiBVc2UgZkxkUG93KCkgaW5zdGVhZCB3aGVuZXZlciBwb3NzaWJsZS4KICogXHBhcmFtIGJhc2VfbSBtYW50aXNzYSBvZiB0aGUgYmFzZS4KICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZS4KICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UuCiAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlLgogKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvLgogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCiAqLwpGSVhQX0RCTCBmUG93KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSk7CgovKioKICogXGJyaWVmIHJldHVybiAoYmFzZSAqIDJeYmFzZV9lKSBeIE4KICogXHBhcmFtIGJhc2UgbWFudGlzc2Egb2YgdGhlIGJhc2UKICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZQogKiBccGFyYW0gcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZQogKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCiAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAogKi8KRklYUF9EQkwgZlBvd0ludChGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIElOVCBOLCBJTlQgKnJlc3VsdF9lKTsKCi8qKgogKiBcYnJpZWYgY2FsY3VsYXRlIGxvZ2FyaXRobSBvZiBiYXNlIDIgb2YgeF9tICogMl4oeF9lKQogKiBccGFyYW0geF9tIG1hbnRpc3NhIG9mIHRoZSBpbnB1dCB2YWx1ZS4KICogXHBhcmFtIHhfZSBleHBvbmVudCBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIFxwYXJhbSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbnRvLgogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCiAqLwpGSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UsIElOVCAqcmVzdWx0X2UpOwoKLyoqCiAqIFxicmllZiBjYWxjdWxhdGUgbG9nYXJpdGhtIG9mIGJhc2UgMiBvZiB4X20gKiAyXih4X2UpCiAqIFxwYXJhbSB4X20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgogKiBccGFyYW0geF9lIGV4cG9uZW50IG9mIHRoZSBpbnB1dCB2YWx1ZS4KICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0IHdpdGggaW1wbGljaXQgZXhwb25lbnQgb2YgTERfREFUQV9TSElGVC4KICovCkZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSk7CgovKioKICogXGJyaWVmIEFkZCB3aXRoIHNhdHVyYXRpb24gb2YgdGhlIHJlc3VsdC4KICogXHBhcmFtIGEgZmlyc3Qgc3VtbWFuZAogKiBccGFyYW0gYiBzZWNvbmQgc3VtbWFuZAogKiBccmV0dXJuIHNhdHVyYXRlZCBzdW0gb2YgYSBhbmQgYi4KICovCmlubGluZSBGSVhQX1NHTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKewogIExPTkcgc3VtOwoKICBzdW0gPSAoTE9ORykoU0hPUlQpYSArIChMT05HKShTSE9SVCliOwogIHN1bSA9IGZNYXgoZk1pbigoSU5UKXN1bSwgKElOVClNQVhWQUxfU0dMKSwgKElOVClNSU5WQUxfU0dMKTsKICByZXR1cm4gKEZJWFBfU0dMKShTSE9SVClzdW07Cn0KCi8qKgogKiBcYnJpZWYgQWRkIHdpdGggc2F0dXJhdGlvbiBvZiB0aGUgcmVzdWx0LgogKiBccGFyYW0gYSBmaXJzdCBzdW1tYW5kCiAqIFxwYXJhbSBiIHNlY29uZCBzdW1tYW5kCiAqIFxyZXR1cm4gc2F0dXJhdGVkIHN1bSBvZiBhIGFuZCBiLgogKi8KaW5saW5lIEZJWFBfREJMIGZBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQp7CiAgTE9ORyBzdW07CgogIHN1bSA9IChMT05HKShhPj4xKSArIChMT05HKShiPj4xKTsKICBzdW0gPSBmTWF4KGZNaW4oKElOVClzdW0sIChJTlQpKE1BWFZBTF9EQkw+PjEpKSwgKElOVCkoTUlOVkFMX0RCTD4+MSkpOwogIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHN1bTw8MSk7Cn0KCi8vI2RlZmluZSBURVNUX1JPVU5ESU5HCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBhcnJheSBmb3IgMS9uLCBuPTEuLjgwCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICBleHRlcm4gY29uc3QgRklYUF9EQkwgaW52Q291bnRbODBdOwoKICBMTktfU0VDVElPTl9JTklUQ09ERQogIGlubGluZSB2b2lkIEluaXRJbnZJbnQodm9pZCkge30KCgovKioKICogXGJyaWVmIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgMS9pIHdoZXJlIGkgaXMgYSBpbnRlZ2VyIHZhbHVlLiBJdCBzdXBwb3J0cwogKiAgICAgICAgaW5wdXQgdmFsdWVzIGZyb20gMCB1cHRvIDc5LgogKiBccGFyYW0gaW50VmFsdWUgSW50ZWdlciBpbnB1dCB2YWx1ZS4KICogXHBhcmFtIEZJWFBfREJMIHJlcHJlc2VudGF0aW9uIG9mIDEvaW50VmFsdWUKICovCmlubGluZSBGSVhQX0RCTCBHZXRJbnZJbnQoaW50IGludFZhbHVlKQp7CiAgRkRLX0FTU0VSVCgoaW50VmFsdWUgPj0gMCkgJiYgKGludFZhbHVlIDwgODApKTsKICBpZiAoaW50VmFsdWUgPiA3OSkKICAgIHJldHVybiBpbnZDb3VudFs3OV07CiAgZWxzZSBpZiAoaW50VmFsdWUgPCAwKQogICAgcmV0dXJuIGludkNvdW50WzBdOwogIGVsc2UKICAgIHJldHVybiBpbnZDb3VudFtpbnRWYWx1ZV07Cn0KCgojZW5kaWYKCg==