Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCiAgIERlc2NyaXB0aW9uOiBGbGV4aWJsZSBmaXhwb2ludCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX0NPTU1PTl9GSVhfSAojZGVmaW5lIF9DT01NT05fRklYX0gKCiNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgojaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCgovKiAqKioqKiBTdGFydCBvZiBmb3JtZXIgZml4LmggKioqKioqICovCgovKiBDb25maWd1cmUgZnJhY3Rpb25hbCBvciBpbnRlZ2VyIGFyaXRobWV0aWMgKi8KICAjZGVmaW5lIEZJWF9GUkFDVCAwIC8qIERlZmluZSB0aGlzIHRvICIxIiB0byB1c2UgZnJhY3Rpb25hbCBhcml0aG1ldGljIHNpbXVsYXRpb24gaW4gY2xhc3MgZnJhY3QgaW5zdGVhZCBvZiBpbnRlZ2VyIGFyaXRobWV0aWMgKi8KICAgICAgICAgICAgICAgICAgICAgIC8qIDEgZm9yIGRlYnVnIHdpdGggZXh0cmEgcnVudGltZSBvdmVyZmxvdyBjaGVja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLyogRGVmaW5lIGJpdCBzaXplcyBvZiBpbnRlZ2VyIGZpeHBvaW50IGZyYWN0aW9uYWwgZGF0YSB0eXBlcyAqLwojZGVmaW5lIEZSQUNUX0JJVFMgICAgICAxNiAvKiBzaW5nbGUgcHJlY2lzaW9uICovCiNkZWZpbmUgREZSQUNUX0JJVFMgICAgIDMyIC8qIGRvdWJsZSBwcmVjaXNpb24gKi8KI2RlZmluZSBBQ0NVX0JJVFMgICAgICAgNDAgLyogZG91YmxlIHByZWNpc2lvbiBwbHVzIG92ZXJmbG93ICovCgovKiBGaXhwb2ludCBlcXVpdmFsZW50IHR5cGUgZm90IFBDTSBhdWRpbyB0aW1lIGRvbWFpbiBkYXRhLiAqLwojaWYgZGVmaW5lZChTQU1QTEVfQklUUykKI2lmIChTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUykKICAjZGVmaW5lIEZJWFBfUENNICAgICAgRklYUF9EQkwKICAjZGVmaW5lIEZYX1BDTTJGWF9EQkwoeCkgKChGSVhQX0RCTCkoeCkpCiAgI2RlZmluZSBGWF9EQkwyRlhfUENNKHgpICgoSU5UX1BDTSkoeCkpCiNlbGlmIChTQU1QTEVfQklUUyA9PSBGUkFDVF9CSVRTKQogICNkZWZpbmUgRklYUF9QQ00gICAgICBGSVhQX1NHTAogICNkZWZpbmUgRlhfUENNMkZYX0RCTCh4KSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoeCkpCiAgI2RlZmluZSBGWF9EQkwyRlhfUENNKHgpIEZYX0RCTDJGWF9TR0woeCkKI2Vsc2UKICAjZXJyb3IgU0FNUExFX0JJVFMgZGlmZmVyZW50IGZyb20gRlJBQ1RfQklUUyBvciBERlJBQ1RfQklUUyBub3QgaW1wbGVtZW50ZWQhCiNlbmRpZgojZW5kaWYKCi8qICoqKioqKiBFbmQgb2YgZm9ybWVyIGZpeC5oICoqKioqKiAqLwoKI2RlZmluZSBTR0xfTUFTSyAgICAgICAgICAgICgoMVVMPDxGUkFDVF9CSVRTKS0xKSAgIC8qIDE2Yml0OiAoMl4xNiktMSA9IDB4RkZGRiAqLwoKI2RlZmluZSBNQVhfU0hJRlRfU0dMIChGUkFDVF9CSVRTLTEpICAgLyogbWF4aW11bSBwb3NzaWJsZSBzaGlmdCBmb3IgRklYUF9TR0wgdmFsdWVzICovCiNkZWZpbmUgTUFYX1NISUZUX0RCTCAoREZSQUNUX0JJVFMtMSkgIC8qIG1heGltdW0gcG9zc2libGUgc2hpZnQgZm9yIEZJWFBfREJMIHZhbHVlcyAqLwoKLyogU2NhbGUgZmFjdG9yIGZyb20vdG8gZmxvYXQvZml4cG9pbnQgdmFsdWVzLiBETyBOT1QgVVNFIFRIRVNFIFZBTFVFUyBBUyBTQVRVUkFUSU9OIExJTUlUUyAhISAqLwojZGVmaW5lIEZSQUNUX0ZJWF9TQ0FMRSAgICAgKChJTlQ2NCgxKTw8KEZSQUNUX0JJVFMtMSkpKQojZGVmaW5lIERGUkFDVF9GSVhfU0NBTEUgICAgKChJTlQ2NCgxKTw8KERGUkFDVF9CSVRTLTEpKSkKCi8qIE1heCBhbmQgTWluIHZhbHVlcyBmb3Igc2F0dXJhdGlvbiBwdXJwb3Nlcy4gRE8gTk9UIFVTRSBUSEVTRSBWQUxVRVMgQVMgU0NBTEUgVkFMVUVTICEhICovCiNkZWZpbmUgIE1BWFZBTF9TR0wgICAgICgoc2lnbmVkKTB4MDAwMDdGRkYpICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCiNkZWZpbmUgIE1JTlZBTF9TR0wgICAgICgoc2lnbmVkKTB4RkZGRjgwMDApICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCiNkZWZpbmUgIE1BWFZBTF9EQkwgICAgICgoc2lnbmVkKTB4N0ZGRkZGRkYpICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBERlJBQ1RfQklUUyAqLwojZGVmaW5lICBNSU5WQUxfREJMICAgICAoKHNpZ25lZCkweDgwMDAwMDAwKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gREZSQUNUX0JJVFMgKi8KCgojZGVmaW5lIEZYX0RCTDJGWENPTlNUX1NHTCh2YWwpICggKCAoKCgodmFsKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSkgKyAxKSA+ICgoKExPTkcpMTw8RlJBQ1RfQklUUyktMSkpICYmICgoTE9ORykodmFsKSA+IDApICkgPyBcCiAgIChGSVhQX1NHTCkoU0hPUlQpKCgoTE9ORykxPDwoRlJBQ1RfQklUUy0xKSktMSk6KEZJWFBfU0dMKShTSE9SVCkoKCgodmFsKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSkgKyAxKSA+PiAxKSApCgoKCiNkZWZpbmUgc2hvdWxkQmVVbmlvbiB1bmlvbiAgICAgLyogdW5pb25zIGFyZSBwb3NzaWJsZSAqLwoKICAgIHR5cGVkZWYgU0hPUlQgICAgICAgRklYUF9TR0w7CiAgICB0eXBlZGVmIExPTkcgICAgICAgIEZJWFBfREJMOwoKLyogbWFjcm9zIGZvciBjb21waWxlLXRpbWUgY29udmVyc2lvbiBvZiBjb25zdGFudCBmbG9hdCB2YWx1ZXMgdG8gZml4ZWRwb2ludCAqLwojZGVmaW5lIEZMMkZYQ09OU1RfU1BDIEZMMkZYQ09OU1RfREJMCgojZGVmaW5lIE1JTlZBTF9EQkxfQ09OU1QgTUlOVkFMX0RCTAojZGVmaW5lIE1JTlZBTF9TR0xfQ09OU1QgTUlOVkFMX1NHTAoKI2RlZmluZSBGTDJGWENPTlNUX1NHTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCihGSVhQX1NHTCkoICggKHZhbCkgPj0gMCkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKCgoIChkb3VibGUpKHZhbCkgKiAoRlJBQ1RfRklYX1NDQUxFKSArIDAuNSApID49IChkb3VibGUpKE1BWFZBTF9TR0wpICkgPyAoU0hPUlQpKE1BWFZBTF9TR0wpIDogKFNIT1JUKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKEZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSA6ICAgXAooKCggKGRvdWJsZSkodmFsKSAqIChGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSA8PSAgKGRvdWJsZSkoTUlOVkFMX1NHTF9DT05TVCkgKSA/IChTSE9SVCkoTUlOVkFMX1NHTF9DT05TVCkgOiAoU0hPUlQpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoRlJBQ1RfRklYX1NDQUxFKSAtIDAuNSkpICkKCiNkZWZpbmUgRkwyRlhDT05TVF9EQkwodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAooRklYUF9EQkwpKCAoICh2YWwpID49IDApID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCigoKCAoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpICsgMC41ICkgPj0gKGRvdWJsZSkoTUFYVkFMX0RCTCkgKSA/IChMT05HKShNQVhWQUxfREJMKSA6IChMT05HKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKERGUkFDVF9GSVhfU0NBTEUpICsgMC41KSkgOiBcCigoKCAoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSA8PSAgKGRvdWJsZSkoTUlOVkFMX0RCTF9DT05TVCkgKSA/IChMT05HKShNSU5WQUxfREJMX0NPTlNUKSA6IChMT05HKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSkgKQoKLyogbWFjcm9zIGZvciBydW50aW1lIGNvbnZlcnNpb24gb2YgZmxvYXQgdmFsdWVzIHRvIGludGVnZXIgZml4ZWRwb2ludC4gTk8gT1ZFUkZMT1cgQ0hFQ0shISEgKi8KI2RlZmluZSBGTDJGWF9TUEMgRkwyRlhfREJMCiNkZWZpbmUgRkwyRlhfU0dMKHZhbCkgKCAodmFsKT4wLjBmID8gKFNIT1JUKSggKHZhbCkqKGZsb2F0KShGUkFDVF9GSVhfU0NBTEUpKzAuNWYgKSA6IChTSE9SVCkoICh2YWwpKihmbG9hdCkoRlJBQ1RfRklYX1NDQUxFKS0wLjVmICkgKQojZGVmaW5lIEZMMkZYX0RCTCh2YWwpICggKHZhbCk+MC4wZiA/IChMT05HKSggKHZhbCkqKGZsb2F0KShERlJBQ1RfRklYX1NDQUxFKSswLjVmICkgOiAoTE9ORykoICh2YWwpKihmbG9hdCkoREZSQUNUX0ZJWF9TQ0FMRSktMC41ZiApICkKCi8qIG1hY3JvcyBmb3IgcnVudGltZSBjb252ZXJzaW9uIG9mIGZpeGVkcG9pbnQgdmFsdWVzIHRvIG90aGVyIGZpeGVkcG9pbnQuIE5PIFJPVU5ESU5HISEhICovCiNkZWZpbmUgRlhfQUNDMkZYX1NHTCh2YWwpICgoRklYUF9TR0wpKCh2YWwpPj4oQUNDVV9CSVRTLUZSQUNUX0JJVFMpKSkKI2RlZmluZSBGWF9BQ0MyRlhfREJMKHZhbCkgKChGSVhQX0RCTCkoKHZhbCk+PihBQ0NVX0JJVFMtREZSQUNUX0JJVFMpKSkKI2RlZmluZSBGWF9TR0wyRlhfQUNDKHZhbCkgKChGSVhQX0FDQykoKExPTkcpKHZhbCk8PChBQ0NVX0JJVFMtRlJBQ1RfQklUUykpKQojZGVmaW5lIEZYX1NHTDJGWF9EQkwodmFsKSAoKEZJWFBfREJMKSgoTE9ORykodmFsKTw8KERGUkFDVF9CSVRTLUZSQUNUX0JJVFMpKSkKI2RlZmluZSBGWF9EQkwyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCk+PihERlJBQ1RfQklUUy1GUkFDVF9CSVRTKSkpCgovKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCgovKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBpbnRlZ2VyIGZpeGVkcG9pbnQgdmFsdWVzIHRvIGZsb2F0LiAqLwovKiBUaGlzIGlzIGp1c3QgZm9yIHRlbXBvcmFyeSB1c2UgYW5kIHNob3VsZCBub3QgYmUgcmVxdWlyZWQgaW4gYSBmaW5hbCB2ZXJzaW9uISAqLwoKLyogI2RlZmluZSBGWF9EQkwyRkwodmFsKSAgKChmbG9hdCkocG93KDIuLC0zMS4pKihmbG9hdCl2YWwpKSAqLyAgLyogdmVyc2lvbiAjMSAqLwojZGVmaW5lIEZYX0RCTDJGTCh2YWwpICAoKGZsb2F0KSgoZG91YmxlKSh2YWwpLyhkb3VibGUpREZSQUNUX0ZJWF9TQ0FMRSkpICAgLyogdmVyc2lvbiAjMiAtIGlkZW50aWNhbCB0byBjbGFzcyBkZnJhY3QgY2FzdCBmcm9tIGRmcmFjdCB0byBmbG9hdCAqLwoKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwojaW5jbHVkZSAiZml4bXVsLmgiCgpGREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgU0hPUlQgYikgICAgICAgICB7IHJldHVybiBmaXhtdWxfU1MoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZNdWx0KFNIT1JUIGEsIExPTkcgYikgICAgICAgICAgeyByZXR1cm4gZml4bXVsX1NEKGEsIGIpOyB9CkZES19JTkxJTkUgTE9ORyBmTXVsdChMT05HIGEsIFNIT1JUIGIpICAgICAgICAgIHsgcmV0dXJuIGZpeG11bF9EUyhhLCBiKTsgfQpGREtfSU5MSU5FIExPTkcgZk11bHQoTE9ORyBhLCBMT05HIGIpICAgICAgICAgICB7IHJldHVybiBmaXhtdWxfREQoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZQb3cyKExPTkcgYSkgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93Ml9EKGEpOyAgICB9CkZES19JTkxJTkUgTE9ORyBmUG93MihTSE9SVCBhKSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBvdzJfUyhhKTsgICAgfQoKRkRLX0lOTElORSBJTlQgIGZNdWx0SShMT05HIGEsIFNIT1JUIGIpICAgICAgICAgeyByZXR1cm4gKCAoSU5UKSgoKDE8PChGUkFDVF9CSVRTLTIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKChJTlQpYjw8RlJBQ1RfQklUUykpKT4+KEZSQUNUX0JJVFMtMSkpICk7IH0KCkZES19JTkxJTkUgSU5UICBmTXVsdElmbG9vcihMT05HIGEsIElOVCBiKSAgICAgIHsgcmV0dXJuICggKElOVCkoKDEgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4bXVsZGl2Ml9ERChhLChiPDxGUkFDVF9CSVRTKSkpID4+IChGUkFDVF9CSVRTLTEpKSApOyB9CgpGREtfSU5MSU5FIElOVCAgZk11bHRJY2VpbChMT05HIGEsIElOVCBiKSAgICAgICB7IHJldHVybiAoIChJTlQpKCgoSU5UKTB4N2ZmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKGI8PEZSQUNUX0JJVFMpKSkgPj4gKEZSQUNUX0JJVFMtMSkpICk7IH0KCkZES19JTkxJTkUgTE9ORyBmTXVsdERpdjIoU0hPUlQgYSwgU0hPUlQgYikgICAgIHsgcmV0dXJuIGZpeG11bGRpdjJfU1MoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBMT05HIGIpICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9TRChhLCBiKTsgfQpGREtfSU5MSU5FIExPTkcgZk11bHREaXYyKExPTkcgYSwgU0hPUlQgYikgICAgICB7IHJldHVybiBmaXhtdWxkaXYyX0RTKGEsIGIpOyB9CkZES19JTkxJTkUgTE9ORyBmTXVsdERpdjIoTE9ORyBhLCBMT05HIGIpICAgICAgIHsgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihMT05HIGEpICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKTsgICAgfQpGREtfSU5MSU5FIExPTkcgZlBvdzJEaXYyKFNIT1JUIGEpICAgICAgICAgICAgICB7IHJldHVybiBmaXhwb3cyZGl2Ml9TKGEpOyAgICB9CgpGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyBhLCBMT05HIGIpICAgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpOyB9CkZES19JTkxJTkUgTE9ORyBmTXVsdERpdjJCaXRFeGFjdChTSE9SVCBhLCBMT05HICBiKSB7IHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfU0QoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MkJpdEV4YWN0KExPTkcgIGEsIFNIT1JUIGIpIHsgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhhLCBiKTsgfQpGREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChMT05HIGEsIExPTkcgYikgICAgICAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfREQoYSwgYik7IH0KRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoU0hPUlQgYSwgTE9ORyAgYikgICAgIHsgcmV0dXJuIGZpeG11bEJpdEV4YWN0X1NEKGEsIGIpOyB9CkZES19JTkxJTkUgTE9ORyBmTXVsdEJpdEV4YWN0KExPTkcgIGEsIFNIT1JUIGIpICAgICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9EUyhhLCBiKTsgfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KI2luY2x1ZGUgImFicy5oIgoKRkRLX0lOTElORSBGSVhQX0RCTCBmQWJzKEZJWFBfREJMIHgpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhhYnNfRCh4KTsgfQpGREtfSU5MSU5FIEZJWFBfU0dMIGZBYnMoRklYUF9TR0wgeCkKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGFic19TKHgpOyB9CgovKiB3b3JrYXJvdW5kIGZvciBUSSBDNnggY29tcGlsZXIgYnV0IG5vdCBmb3IgVEkgQVJNOUUgY29tcGlsZXIgKi8KI2lmICghZGVmaW5lZChfX1RJX0NPTVBJTEVSX1ZFUlNJT05fXykgfHwgZGVmaW5lZChfX1RJX1RNUzQ3MF9WNV9fKSkgJiYgIWRlZmluZWQoX19MUDY0X18pCkZES19JTkxJTkUgSU5UICBmQWJzKElOVCB4KQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4YWJzX0koeCk7IH0KI2VuZGlmCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwoKI2luY2x1ZGUgImNsei5oIgoKRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfREJMIHgpCiAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG5vcm16X0QoeCk7IH0KRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfU0dMIHgpCiAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG5vcm16X1MoeCk7IH0KRkRLX0lOTElORSBJTlQgZk5vcm0oRklYUF9EQkwgeCkKICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybV9EKHgpOyB9CkZES19JTkxJTkUgSU5UIGZOb3JtKEZJWFBfU0dMIHgpCiAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG5vcm1fUyh4KTsgfQoKCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCgojaW5jbHVkZSAiY2x6LmgiCiNkZWZpbmUgZml4cF9hYnMoeCkgZkFicyh4KQojZGVmaW5lIGZpeE1pbihhLGIpIGZNaW4oYSxiKQojZGVmaW5lIGZpeE1heChhLGIpIGZNYXgoYSxiKQojZGVmaW5lIENudExlYWRpbmdaZXJvcyh4KSAgZml4bm9ybXpfRCh4KQojZGVmaW5lIENvdW50TGVhZGluZ0JpdHMoeCkgZml4bm9ybV9EKHgpCgojaW5jbHVkZSAiZml4bWFkZC5oIgoKLyogeSA9ICh4KzAuNSphKmIpICovCkZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2Ml9ERCh4LCBhLCBiKTsgfQpGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfU0QoeCwgYSwgYik7IH0KRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0RTKHgsIGEsIGIpOyB9CkZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2Ml9TUyh4LCBhLCBiKTsgfQoKRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSkKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBhZGRkaXYyX0QoeCwgYSk7IH0KRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSkKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBhZGRkaXYyX1MoeCwgYSk7IH0KCgovKiB5ID0gMiooeCswLjUqYSpiKSA9ICgyeCthKmIpICovCkZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfREQoeCwgYSwgYik7IH0KaW5saW5lIEZJWFBfREJMIGZNdWx0QWRkKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkX1NEKHgsIGEsIGIpOyB9CmlubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZF9EUyh4LCBhLCBiKTsgfQppbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfU1MoeCwgYSwgYik7IH0KCmlubGluZSBGSVhQX0RCTCBmUG93MkFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZF9EKHgsIGEpOyB9CmlubGluZSBGSVhQX0RCTCBmUG93MkFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZF9TKHgsIGEpOyB9CgoKLyogeSA9ICh4LTAuNSphKmIpICovCmlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX0REKHgsIGEsIGIpOyB9CmlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGEsIGIpOyB9CmlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX0RTKHgsIGEsIGIpOyB9CmlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX1NTKHgsIGEsIGIpOyB9CgovKiB5ID0gMiooeC0wLjUqYSpiKSA9ICgyKngtYSpiKSAqLwpGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX0REKHgsIGEsIGIpOyB9CmlubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1Yl9TRCh4LCBhLCBiKTsgfQppbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJfRFMoeCwgYSwgYik7IH0KaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX1NTKHgsIGEsIGIpOyB9CgpGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X0REKHgsIGEsIGIpOyB9CkZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7IH0KRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsgfQpGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X0REKHgsIGEsIGIpOyB9CkZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7IH0KRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YkRpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsgfQoKI2luY2x1ZGUgImZpeG1pbm1heC5oIgoKRkRLX0lOTElORSBGSVhQX0RCTCBmTWluKEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fRChhLGIpOyB9CkZES19JTkxJTkUgRklYUF9EQkwgZk1heChGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWF4X0QoYSxiKTsgfQoKRkRLX0lOTElORSBGSVhQX1NHTCBmTWluKEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fUyhhLGIpOyB9CkZES19JTkxJTkUgRklYUF9TR0wgZk1heChGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWF4X1MoYSxiKTsgfQoKLyogd29ya2Fyb3VuZCBmb3IgVEkgQzZ4IGNvbXBpbGVyIGJ1dCBub3QgZm9yIFRJIEFSTTlFICovCiNpZiAoKCFkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9fVElfVE1TNDcwX1Y1X18pKSAmJiAhZGVmaW5lZChfX0xQNjRfXykpIHx8IChGSVhfRlJBQ1QgPT0gMSkKRkRLX0lOTElORSBJTlQgZk1heChJTlQgYSwgSU5UIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfSShhLGIpOyB9CkZES19JTkxJTkUgSU5UIGZNaW4oSU5UIGEsIElOVCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWluX0koYSxiKTsgfQojZW5kaWYKCmlubGluZSBVSU5UIGZNYXgoVUlOVCBhLCBVSU5UIGIpCiAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfVUkoYSxiKTsgfQppbmxpbmUgVUlOVCBmTWluKFVJTlQgYSwgVUlOVCBiKQogICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWluX1VJKGEsYik7IH0KCi8qIENvbXBsZXggZGF0YSB0eXBlcyAqLwp0eXBlZGVmIHNob3VsZEJlVW5pb24gewogIC8qIHZlY3RvciByZXByZXNlbnRhdGlvbiBmb3IgYXJpdGhtZXRpYyAqLwogIHN0cnVjdCB7CiAgICBGSVhQX1NHTCByZTsKICAgIEZJWFBfU0dMIGltOwogIH0gdjsKICAvKiB3b3JkIHJlcHJlc2VudGF0aW9uIGZvciBtZW1vcnkgbW92ZSAqLwogIExPTkcgdzsKfSBGSVhQX1NQSzsKCnR5cGVkZWYgc2hvdWxkQmVVbmlvbiB7CiAgLyogdmVjdG9yIHJlcHJlc2VudGF0aW9uIGZvciBhcml0aG1ldGljICovCiAgc3RydWN0IHsKICAgIEZJWFBfREJMIHJlOwogICAgRklYUF9EQkwgaW07CiAgfSB2OwogIC8qIHdvcmQgcmVwcmVzZW50YXRpb24gZm9yIG1lbW9yeSBtb3ZlICovCiAgSU5UNjQgdzsKfSBGSVhQX0RQSzsKCiNpbmNsdWRlICJmaXhtdWwuaCIKI2luY2x1ZGUgImZpeG1hZGQuaCIKI2luY2x1ZGUgImNwbHhfbXVsLmgiCiNpbmNsdWRlICJzY2FsZS5oIgojaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgoKI2VuZGlmCg==