Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBHYXllcgogICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKCgojZGVmaW5lIE1BWF9MRF9QUkVDSVNJT04gMTAKI2RlZmluZSBMRF9QUkVDSVNJT04gICAgIDEwCgovKiBUYXlsb3Igc2VyaWVzIGNvZWZmY2llbnRzIGZvciBsbigxLXgpLCBjZW50ZXJlZCBhdCAwIChNYWNMYXVyaW4gcG9saW5vbWlhbCkuICovCiNpZm5kZWYgTERDT0VGRl8xNkJJVApMTktfU0VDVElPTl9DT05TVERBVEFfTDEKc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkQ29lZmZbTUFYX0xEX1BSRUNJU0lPTl0gPSB7CiAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMi4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMy4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNC4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNi4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNy4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvOC4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvOS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMTAuMCkKfTsKI2Vsc2UKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX1NHTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0gewogICAgRkwyRlhDT05TVF9TR0woLTEuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzIuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzMuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzQuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzUuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzYuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzcuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzguMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzkuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzEwLjApCn07CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogQ2FsY0xkRGF0YQogIGRlc2NyaXB0aW9uOiAgRGVsaXZlcnMgdGhlIExvZ2FyaXRobSBEdWFsaXMgbGQob3ApL0xEX0RBVEFfU0NBTElORyB3aXRoIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4KICBpbnB1dDogICAgICAgIElucHV0IG9wIGlzIGFzc3VtZWQgdG8gYmUgZG91YmxlIHByZWNpc2lvbiBmcmFjdGlvbmFsIDAgPCBvcCA8IDEuMAogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgbmVnYXRpdmUgdmFsdWVzLgogIG91dHB1dDogICAgICAgRm9yIG9wID09IDAsIHRoZSByZXN1bHQgaXMgc2F0dXJhdGVkIHRvIC0xLjAKICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHBvc2l0aXZlIHZhbHVlcyBzaW5jZSBpbnB1dCB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZnJhY3Rpb25hbCB2YWx1ZXMuCiAgICAgICAgICAgICAgICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGlucHV0IGFuIGludGVnZXIgdmFsdWUgaW50byB0aGlzIGZ1bmN0aW9uIChhbmQgZXhwZWN0IGEgcG9zaXRpdmUgb3V0cHV0IHZhbHVlKQogICAgICAgICAgICAgICAgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpMTktfU0VDVElPTl9DT0RFX0wxCkZJWFBfREJMIENhbGNMZERhdGEoRklYUF9EQkwgb3ApCnsKICByZXR1cm4gZkxvZzIob3AsIDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgZnVuY3Rpb25uYW1lOiBMZERhdGFWZWN0b3IKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxOS19TRUNUSU9OX0NPREVfTDEKdm9pZCBMZERhdGFWZWN0b3IoICBGSVhQX0RCTCAgICAqc3JjVmVjdG9yLAogICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpkZXN0VmVjdG9yLAogICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG4pCnsKICAgIElOVCBpOwogICAgZm9yICggaT0wOyBpPG47IGkrKykgewogICAgICAgIGRlc3RWZWN0b3JbaV0gPSBDYWxjTGREYXRhKHNyY1ZlY3RvcltpXSk7CiAgICB9Cn0KCgoKI2RlZmluZSBNQVhfUE9XMl9QUkVDSVNJT04gOAojaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAoJI2RlZmluZSBQT1cyX1BSRUNJU0lPTiBNQVhfUE9XMl9QUkVDSVNJT04KI2Vsc2UKCSNkZWZpbmUgUE9XMl9QUkVDSVNJT04gNQojZW5kaWYKCi8qCiAgVGF5bG9yIHNlcmllcyBjb2VmZmljaWVudHMgb2YgdGhlIGZ1bmN0aW9uIHheMi4gVGhlIGZpcnN0IGNvZWZmaWNpZW50IGlzCiAgb21taXRlZCAoZXF1YWwgdG8gMS4wKS4KCiAgcG93MkNvZWZmW2ktMV0gPSAoMS9pISkgZF5pKDJeeCkvZHheaSwgaT0xLi5NQVhfUE9XMl9QUkVDSVNJT04KICBUbyBldmFsdWF0ZSB0aGUgdGF5bG9yIHNlcmllcyBhcm91bmQgeCA9IDAsIHRoZSBjb2VmZmljaWVudHMgYXJlOiAxLyFpICogbG4oMileaQogKi8KI2lmbmRlZiBQT1cyQ09FRkZfMTZCSVQKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBwb3cyQ29lZmZbTUFYX1BPVzJfUFJFQ0lTSU9OXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAgLyogbG4oMileMyAvMyEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAgLyogbG4oMileNiAvNiEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KfTsKI2Vsc2UKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX1NHTCBwb3cyQ29lZmZbTUFYX1BPVzJfUFJFQ0lTSU9OXSA9IHsKICAgIEZMMkZYQ09OU1RfU0dMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAgLyogbG4oMileMyAvMyEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAgLyogbG4oMileNiAvNiEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KfTsKI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogbXVsX2RibF9zZ2xfcm5kCiAgICBkZXNjcmlwdGlvbjogIE11bHRpcGx5IHdpdGggcm91bmQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZm9yIHJvdW5kaW5nIGEgZGZyYWN0IHRvIGZyYWN0ICovCiNkZWZpbmUgQUNDVV9SIChMT05HKSAweDAwMDA4MDAwCgpMTktfU0VDVElPTl9DT0RFX0wxCkZJWFBfREJMIG11bF9kYmxfc2dsX3JuZCAoY29uc3QgRklYUF9EQkwgb3AxLCBjb25zdCBGSVhQX1NHTCBvcDIpCnsKICBGSVhQX0RCTCBwcm9kOwogIExPTkcgdiA9IChMT05HKShvcDEpOwogIFNIT1JUIHUgPSAoU0hPUlQpKG9wMik7CgogIExPTkcgbG93ID0gdSoodiZTR0xfTUFTSyk7CiAgbG93ID0gKGxvdysoQUNDVV9SPj4xKSkgPj4gKEZSQUNUX0JJVFMtMSk7ICAvKiByb3VuZCAqLwogIExPTkcgaGlnaCA9IHUgKiAoKHY+PkZSQUNUX0JJVFMpPDwxKTsKCiAgcHJvZCA9IChMT05HKShoaWdoK2xvdyk7CgogIHJldHVybigoRklYUF9EQkwpcHJvZCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBDYWxjSW52TGREYXRhCiAgZGVzY3JpcHRpb246ICBEZWxpdmVycyB0aGUgaW52ZXJzZSBvZiBmdW5jdGlvbiBDYWxjTGREYXRhKCkuCiAgICAgICAgICAgICAgICBEZWxpdmVycyAyXihvcCpMRF9EQVRBX1NDQUxJTkcpCiAgaW5wdXQ6ICAgICAgICBJbnB1dCBvcCBpcyBhc3N1bWVkIHRvIGJlIGZyYWN0aW9uYWwgLTEuMCA8IG9wIDwgMS4wCiAgb3V0cHV0OiAgICAgICBGb3Igb3AgPT0gMCwgdGhlIHJlc3VsdCBpcyBNQVhWQUxfREJMIChhbG1vc3QgMS4wKS4KICAgICAgICAgICAgICAgIEZvciBuZWdhdGl2ZSBpbnB1dCB2YWx1ZXMgdGhlIG91dHB1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHBvc2l0aXZlIGZyYWN0aW9uYWwgdmFsdWUuCiAgICAgICAgICAgICAgICBGb3IgcG9zaXRpdmUgaW5wdXQgdmFsdWVzIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLgogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBvdXRwdXQgbmVnYXRpdmUgdmFsdWVzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxOS19TRUNUSU9OX0NPREVfTDEKLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLwovKiB4IGluIHJhbmdlIFswLi4uMS4wWyBpbiBzdGVwcyBvZiAxLzMyICovCkxOS19TRUNUSU9OX0RBVEFfTDEgc3RhdGljIGNvbnN0IFVJTlQgZXhwMl90YWJfbG9uZ1szMl09ewoweDQwMDAwMDAwLDB4NDE2NkMzNEMsMHg0MkQ1NjFCNCwweDQ0NEMwNzQwLAoweDQ1Q0FFMEYyLDB4NDc1MjFDQzYsMHg0OEUxRTlCQSwweDRBN0E3N0Q0LAoweDRDMUJGODI5LDB4NERDNjlDREQsMHg0RjdBOTkzMCwweDUxMzgyMTgyLAoweDUyRkY2QjU1LDB4NTREMEFENUEsMHg1NkFDMUY3NSwweDU4OTFGQUMxLAoweDVBODI3OTlBLDB4NUM3REQ3QTQsMHg1RTg0NTFEMCwweDYwOTYyNjY1LAoweDYyQjM5NTA5LDB4NjREQ0RFQzMsMHg2NzEyNDYwQiwweDY5NTQwRUM5LAoweDZCQTI3RTY1LDB4NkRGRERCQ0MsMHg3MDY2NkY3NiwweDcyREM4Mzc0LAoweDc1NjA2Mzc0LDB4NzdGMjVDQ0UsMHg3QTkyQkU4QiwweDdENDFEOTZFCi8vIDB4ODAwMDAwMDAKfTsKCi8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KLyogeCBpbiByYW5nZSBbMC4uLjEvMzJbIGluIHN0ZXBzIG9mIDEvMTAyNCAqLwpMTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJ3X3RhYl9sb25nWzMyXT17CjB4NDAwMDAwMDAsMHg0MDBCMTgxOCwweDQwMTYzMjFCLDB4NDAyMTRFMEMsCjB4NDAyQzZCRTksMHg0MDM3OEJCNCwweDQwNDJBRDZELDB4NDA0REQxMTMsCjB4NDA1OEY2QTgsMHg0MDY0MUUyQiwweDQwNkY0NzlFLDB4NDA3QTczMDAsCjB4NDA4NUEwNTEsMHg0MDkwQ0Y5MiwweDQwOUMwMEM0LDB4NDBBNzMzRTYsCjB4NDBCMjY4RkEsMHg0MEJEOUZGRiwweDQwQzhEOEY1LDB4NDBENDEzREQsCjB4NDBERjUwQjgsMHg0MEVBOEY4NiwweDQwRjVEMDQ2LDB4NDEwMTEyRkEsCjB4NDEwQzU3QTIsMHg0MTE3OUUzRCwweDQxMjJFNkNELDB4NDEyRTMxNTIsCjB4NDEzOTdEQ0MsMHg0MTQ0Q0MzQiwweDQxNTAxQ0EwLDB4NDE1QjZFRkIsCi8vIDB4NDE2NkMzNEMsCn07Ci8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KLyogeCBpbiByYW5nZSBbMC4uLjEvMTAyNFsgaW4gc3RlcHMgb2YgMS8zMjc2OCAqLwpMTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJ4X3RhYl9sb25nWzMyXT17CjB4NDAwMDAwMDAsMHg0MDAwNThCOSwweDQwMDBCMTczLDB4NDAwMTBBMkQsCjB4NDAwMTYyRTgsMHg0MDAxQkJBMywweDQwMDIxNDVGLDB4NDAwMjZEMUIsCjB4NDAwMkM1RDgsMHg0MDAzMUU5NSwweDQwMDM3NzUyLDB4NDAwM0QwMTEsCjB4NDAwNDI4Q0YsMHg0MDA0ODE4RSwweDQwMDREQTRFLDB4NDAwNTMzMEUsCjB4NDAwNThCQ0UsMHg0MDA1RTQ4RiwweDQwMDYzRDUxLDB4NDAwNjk2MTMsCjB4NDAwNkVFRDUsMHg0MDA3NDc5OCwweDQwMDdBMDVCLDB4NDAwN0Y5MUYsCjB4NDAwODUxRTQsMHg0MDA4QUFBOCwweDQwMDkwMzZFLDB4NDAwOTVDMzMsCjB4NDAwOUI0RkEsMHg0MDBBMERDMCwweDQwMEE2Njg4LDB4NDAwQUJGNEYsCi8vMHg0MDBCMTgxOAp9OwoKTE5LX1NFQ1RJT05fQ09ERV9MMSBGSVhQX0RCTCBDYWxjSW52TGREYXRhKEZJWFBfREJMIHgpCnsKICBpbnQgc2V0X3plcm8gPSAoeCA8ICBGTDJGWENPTlNUX0RCTCgtMzEuMC82NC4wKSk/IDAgOiAxOwogIGludCBzZXRfbWF4ICA9ICh4ID49IEZMMkZYQ09OU1RfREJMKCAzMS4wLzY0LjApKSB8ICh4ID09IEZMMkZYQ09OU1RfREJMKDAuMCkpOwoKICBGSVhQX1NHTCBmcmFjID0gKEZJWFBfU0dMKShMT05HKSh4ICYgMHgzRkYpOwogIFVJTlQgaW5kZXgzID0gKFVJTlQpKExPTkcpKHggPj4gMTApICYgMHgxRjsKICBVSU5UIGluZGV4MiA9IChVSU5UKShMT05HKSh4ID4+IDE1KSAmIDB4MUY7IAogIFVJTlQgaW5kZXgxID0gKFVJTlQpKExPTkcpKHggPj4gMjApICYgMHgxRjsKICBpbnQgZXhwICA9ICh4ID4gIEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/ICgzMSAtIChpbnQpKHg+PjI1KSkgOiAoaW50KSgtKHg+PjI1KSk7CgogIFVJTlQgbG9va3VwMSA9IGV4cDJfdGFiX2xvbmdbaW5kZXgxXSpzZXRfemVybzsKICBVSU5UIGxvb2t1cDIgPSBleHAyd190YWJfbG9uZ1tpbmRleDJdOwogIFVJTlQgbG9va3VwMyA9IGV4cDJ4X3RhYl9sb25nW2luZGV4M107CiAgVUlOVCBsb29rdXAzZiA9IGxvb2t1cDMgKyAoVUlOVCkoTE9ORylmTXVsdERpdjIoKEZJWFBfREJMKSgweDAwMTYzMDJGKSwoRklYUF9TR0wpZnJhYyk7CiAgCiAgVUlOVCBsb29rdXAxMiA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxLCAgKEZJWFBfREJMKSBsb29rdXAyKTsKICBVSU5UIGxvb2t1cCAgID0gKFVJTlQpKExPTkcpZk11bHQoKEZJWFBfREJMKWxvb2t1cDEyLCAoRklYUF9EQkwpIGxvb2t1cDNmKTsKCiAgRklYUF9EQkwgcmV0VmFsID0gKGxvb2t1cDw8MykgPj4gZXhwOwoKICBpZiAoc2V0X21heCkKICAgIHJldFZhbD1GTDJGWENPTlNUX0RCTCgxLjBmKTsKCiAgcmV0dXJuIHJldFZhbDsKfQoKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBJbml0TGRJbnQgYW5kIENhbGNMZEludAogICAgZGVzY3JpcHRpb246ICBDcmVhdGUgYW5kIGFjY2VzcyB0YWJsZSB3aXRoIGludGVnZXIgTGREYXRhICgwIHRvIDE5MykKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAgIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogICAgc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkSW50Q29lZmZbXSA9IHsKICAgICAgKEZJWFBfREJMKTB4ODAwMDAwMDEsIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHgwMjAwMDAwMCwgKEZJWFBfREJMKTB4MDMyYjgwMzQsIChGSVhQX0RCTCkweDA0MDAwMDAwLCAoRklYUF9EQkwpMHgwNGE0ZDNjMiwgKEZJWFBfREJMKTB4MDUyYjgwMzQsIChGSVhQX0RCTCkweDA1OWQ1ZGEwLAogICAgICAoRklYUF9EQkwpMHgwNjAwMDAwMCwgKEZJWFBfREJMKTB4MDY1NzAwNjksIChGSVhQX0RCTCkweDA2YTRkM2MyLCAoRklYUF9EQkwpMHgwNmViM2E5ZiwgKEZJWFBfREJMKTB4MDcyYjgwMzQsIChGSVhQX0RCTCkweDA3NjZhMDA5LCAoRklYUF9EQkwpMHgwNzlkNWRhMCwgKEZJWFBfREJMKTB4MDdkMDUzZjcsCiAgICAgIChGSVhQX0RCTCkweDA4MDAwMDAwLCAoRklYUF9EQkwpMHgwODJjYzdlZSwgKEZJWFBfREJMKTB4MDg1NzAwNjksIChGSVhQX0RCTCkweDA4N2VmMDViLCAoRklYUF9EQkwpMHgwOGE0ZDNjMiwgKEZJWFBfREJMKTB4MDhjOGRkZDQsIChGSVhQX0RCTCkweDA4ZWIzYTlmLCAoRklYUF9EQkwpMHgwOTBjMTA1MCwKICAgICAgKEZJWFBfREJMKTB4MDkyYjgwMzQsIChGSVhQX0RCTCkweDA5NDlhNzg1LCAoRklYUF9EQkwpMHgwOTY2YTAwOSwgKEZJWFBfREJMKTB4MDk4MjgwOWQsIChGSVhQX0RCTCkweDA5OWQ1ZGEwLCAoRklYUF9EQkwpMHgwOWI3NDk0OSwgKEZJWFBfREJMKTB4MDlkMDUzZjcsIChGSVhQX0RCTCkweDA5ZTg4YzZiLAogICAgICAoRklYUF9EQkwpMHgwYTAwMDAwMCwgKEZJWFBfREJMKTB4MGExNmJhZDMsIChGSVhQX0RCTCkweDBhMmNjN2VlLCAoRklYUF9EQkwpMHgwYTQyMzE2MiwgKEZJWFBfREJMKTB4MGE1NzAwNjksIChGSVhQX0RCTCkweDBhNmIzZDc5LCAoRklYUF9EQkwpMHgwYTdlZjA1YiwgKEZJWFBfREJMKTB4MGE5MjIwM2QsCiAgICAgIChGSVhQX0RCTCkweDBhYTRkM2MyLCAoRklYUF9EQkwpMHgwYWI3MTEwZSwgKEZJWFBfREJMKTB4MGFjOGRkZDQsIChGSVhQX0RCTCkweDBhZGEzZjYwLCAoRklYUF9EQkwpMHgwYWViM2E5ZiwgKEZJWFBfREJMKTB4MGFmYmQ0MmIsIChGSVhQX0RCTCkweDBiMGMxMDUwLCAoRklYUF9EQkwpMHgwYjFiZjMxMiwKICAgICAgKEZJWFBfREJMKTB4MGIyYjgwMzQsIChGSVhQX0RCTCkweDBiM2FiYjQwLCAoRklYUF9EQkwpMHgwYjQ5YTc4NSwgKEZJWFBfREJMKTB4MGI1ODQ4MjIsIChGSVhQX0RCTCkweDBiNjZhMDA5LCAoRklYUF9EQkwpMHgwYjc0YjFmZCwgKEZJWFBfREJMKTB4MGI4MjgwOWQsIChGSVhQX0RCTCkweDBiOTAwZTYxLAogICAgICAoRklYUF9EQkwpMHgwYjlkNWRhMCwgKEZJWFBfREJMKTB4MGJhYTcwOGYsIChGSVhQX0RCTCkweDBiYjc0OTQ5LCAoRklYUF9EQkwpMHgwYmMzZTljYSwgKEZJWFBfREJMKTB4MGJkMDUzZjcsIChGSVhQX0RCTCkweDBiZGM4OTliLCAoRklYUF9EQkwpMHgwYmU4OGM2YiwgKEZJWFBfREJMKTB4MGJmNDVlMDksCiAgICAgIChGSVhQX0RCTCkweDBjMDAwMDAwLCAoRklYUF9EQkwpMHgwYzBiNzNjYiwgKEZJWFBfREJMKTB4MGMxNmJhZDMsIChGSVhQX0RCTCkweDBjMjFkNjcxLCAoRklYUF9EQkwpMHgwYzJjYzdlZSwgKEZJWFBfREJMKTB4MGMzNzkwODUsIChGSVhQX0RCTCkweDBjNDIzMTYyLCAoRklYUF9EQkwpMHgwYzRjYWJhOCwKICAgICAgKEZJWFBfREJMKTB4MGM1NzAwNjksIChGSVhQX0RCTCkweDBjNjEzMGFmLCAoRklYUF9EQkwpMHgwYzZiM2Q3OSwgKEZJWFBfREJMKTB4MGM3NTI3YjksIChGSVhQX0RCTCkweDBjN2VmMDViLCAoRklYUF9EQkwpMHgwYzg4OTgzZiwgKEZJWFBfREJMKTB4MGM5MjIwM2QsIChGSVhQX0RCTCkweDBjOWI4OTI2LAogICAgICAoRklYUF9EQkwpMHgwY2E0ZDNjMiwgKEZJWFBfREJMKTB4MGNhZTAwZDIsIChGSVhQX0RCTCkweDBjYjcxMTBlLCAoRklYUF9EQkwpMHgwY2MwMDUyYiwgKEZJWFBfREJMKTB4MGNjOGRkZDQsIChGSVhQX0RCTCkweDBjZDE5YmIwLCAoRklYUF9EQkwpMHgwY2RhM2Y2MCwgKEZJWFBfREJMKTB4MGNlMmM5N2QsCiAgICAgIChGSVhQX0RCTCkweDBjZWIzYTlmLCAoRklYUF9EQkwpMHgwY2YzOTM1NSwgKEZJWFBfREJMKTB4MGNmYmQ0MmIsIChGSVhQX0RCTCkweDBkMDNmZGE5LCAoRklYUF9EQkwpMHgwZDBjMTA1MCwgKEZJWFBfREJMKTB4MGQxNDBjYTAsIChGSVhQX0RCTCkweDBkMWJmMzEyLCAoRklYUF9EQkwpMHgwZDIzYzQxZCwKICAgICAgKEZJWFBfREJMKTB4MGQyYjgwMzQsIChGSVhQX0RCTCkweDBkMzMyN2M3LCAoRklYUF9EQkwpMHgwZDNhYmI0MCwgKEZJWFBfREJMKTB4MGQ0MjNiMDgsIChGSVhQX0RCTCkweDBkNDlhNzg1LCAoRklYUF9EQkwpMHgwZDUxMDExOCwgKEZJWFBfREJMKTB4MGQ1ODQ4MjIsIChGSVhQX0RCTCkweDBkNWY3Y2ZmLAogICAgICAoRklYUF9EQkwpMHgwZDY2YTAwOSwgKEZJWFBfREJMKTB4MGQ2ZGIxOTcsIChGSVhQX0RCTCkweDBkNzRiMWZkLCAoRklYUF9EQkwpMHgwZDdiYTE5MCwgKEZJWFBfREJMKTB4MGQ4MjgwOWQsIChGSVhQX0RCTCkweDBkODk0Zjc1LCAoRklYUF9EQkwpMHgwZDkwMGU2MSwgKEZJWFBfREJMKTB4MGQ5NmJkYWQsCiAgICAgIChGSVhQX0RCTCkweDBkOWQ1ZGEwLCAoRklYUF9EQkwpMHgwZGEzZWU3ZiwgKEZJWFBfREJMKTB4MGRhYTcwOGYsIChGSVhQX0RCTCkweDBkYjBlNDEyLCAoRklYUF9EQkwpMHgwZGI3NDk0OSwgKEZJWFBfREJMKTB4MGRiZGEwNzIsIChGSVhQX0RCTCkweDBkYzNlOWNhLCAoRklYUF9EQkwpMHgwZGNhMjU4ZSwKICAgICAgKEZJWFBfREJMKTB4MGRkMDUzZjcsIChGSVhQX0RCTCkweDBkZDY3NTNlLCAoRklYUF9EQkwpMHgwZGRjODk5YiwgKEZJWFBfREJMKTB4MGRlMjkxNDMsIChGSVhQX0RCTCkweDBkZTg4YzZiLCAoRklYUF9EQkwpMHgwZGVlN2I0NywgKEZJWFBfREJMKTB4MGRmNDVlMDksIChGSVhQX0RCTCkweDBkZmEzNGUxLAogICAgICAoRklYUF9EQkwpMHgwZTAwMDAwMCwgKEZJWFBfREJMKTB4MGUwNWJmOTQsIChGSVhQX0RCTCkweDBlMGI3M2NiLCAoRklYUF9EQkwpMHgwZTExMWNkMiwgKEZJWFBfREJMKTB4MGUxNmJhZDMsIChGSVhQX0RCTCkweDBlMWM0ZGZiLCAoRklYUF9EQkwpMHgwZTIxZDY3MSwgKEZJWFBfREJMKTB4MGUyNzU0NjAsCiAgICAgIChGSVhQX0RCTCkweDBlMmNjN2VlLCAoRklYUF9EQkwpMHgwZTMyMzE0MywgKEZJWFBfREJMKTB4MGUzNzkwODUsIChGSVhQX0RCTCkweDBlM2NlNWQ4LCAoRklYUF9EQkwpMHgwZTQyMzE2MiwgKEZJWFBfREJMKTB4MGU0NzczNDYsIChGSVhQX0RCTCkweDBlNGNhYmE4LCAoRklYUF9EQkwpMHgwZTUxZGFhOCwKICAgICAgKEZJWFBfREJMKTB4MGU1NzAwNjksIChGSVhQX0RCTCkweDBlNWMxZDBiLCAoRklYUF9EQkwpMHgwZTYxMzBhZiwgKEZJWFBfREJMKTB4MGU2NjNiNzQsIChGSVhQX0RCTCkweDBlNmIzZDc5LCAoRklYUF9EQkwpMHgwZTcwMzZkYiwgKEZJWFBfREJMKTB4MGU3NTI3YjksIChGSVhQX0RCTCkweDBlN2ExMDMwLAogICAgICAoRklYUF9EQkwpMHgwZTdlZjA1YiwgKEZJWFBfREJMKTB4MGU4M2M4NTcsIChGSVhQX0RCTCkweDBlODg5ODNmLCAoRklYUF9EQkwpMHgwZThkNjAyZSwgKEZJWFBfREJMKTB4MGU5MjIwM2QsIChGSVhQX0RCTCkweDBlOTZkODg4LCAoRklYUF9EQkwpMHgwZTliODkyNiwgKEZJWFBfREJMKTB4MGVhMDMyMzIsCiAgICAgIChGSVhQX0RCTCkweDBlYTRkM2MyLCAoRklYUF9EQkwpMHgwZWE5NmRmMCwgKEZJWFBfREJMKTB4MGVhZTAwZDIsIChGSVhQX0RCTCkweDBlYjI4YzdmLCAoRklYUF9EQkwpMHgwZWI3MTEwZSwgKEZJWFBfREJMKTB4MGViYjhlOTYsIChGSVhQX0RCTCkweDBlYzAwNTJiLCAoRklYUF9EQkwpMHgwZWM0NzRlNCwKICAgICAgKEZJWFBfREJMKTB4MGVjOGRkZDQsIChGSVhQX0RCTCkweDBlY2Q0MDEyLCAoRklYUF9EQkwpMHgwZWQxOWJiMCwgKEZJWFBfREJMKTB4MGVkNWYwYzQsIChGSVhQX0RCTCkweDBlZGEzZjYwLCAoRklYUF9EQkwpMHgwZWRlODc5NywgKEZJWFBfREJMKTB4MGVlMmM5N2QsIChGSVhQX0RCTCkweDBlZTcwNTI1LAogICAgICAoRklYUF9EQkwpMHgwZWViM2E5ZiwgKEZJWFBfREJMKTB4MGVlZjY5ZmYsIChGSVhQX0RCTCkweDBlZjM5MzU1LCAoRklYUF9EQkwpMHgwZWY3YjZiNCwgKEZJWFBfREJMKTB4MGVmYmQ0MmIsIChGSVhQX0RCTCkweDBlZmZlYmNkLCAoRklYUF9EQkwpMHgwZjAzZmRhOSwgKEZJWFBfREJMKTB4MGYwODA5Y2YsCiAgICAgIChGSVhQX0RCTCkweDBmMGMxMDUwLCAoRklYUF9EQkwpMHgwZjEwMTEzYiwgKEZJWFBfREJMKTB4MGYxNDBjYTAsIChGSVhQX0RCTCkweDBmMTgwMjhkLCAoRklYUF9EQkwpMHgwZjFiZjMxMiwgKEZJWFBfREJMKTB4MGYxZmRlM2QsIChGSVhQX0RCTCkweDBmMjNjNDFkLCAoRklYUF9EQkwpMHgwZjI3YTRjMCwKICAgICAgKEZJWFBfREJMKTB4MGYyYjgwMzQKICAgIH07CgoKICBMTktfU0VDVElPTl9JTklUQ09ERQogIHZvaWQgSW5pdExkSW50KCkKICB7CiAgICAvKiBub3RoaW5nIHRvIGRvISBVc2UgcHJlaW5pdGlhbGl6ZWQgbG9nYXJpdGhtIHRhYmxlICovCiAgfQoKCgpMTktfU0VDVElPTl9DT0RFX0wxCkZJWFBfREJMIENhbGNMZEludChJTlQgaSkKewogIC8qIGNhbGN1bGF0ZXMgbGQob3ApL0xEX0RBVEFfU0NBTElORyAqLwogIC8qIG9wIGlzIGFzc3VtZWQgdG8gYmUgYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDE5MyAqLwoKICBGREtfQVNTRVJUKCgxOTM+MCkgJiYgKChGSVhQX0RCTClsZEludENvZWZmWzBdPT0oRklYUF9EQkwpMHg4MDAwMDAwMSkpOyAvKiB0YWIgaGFzIHRvIGJlIGluaXRpYWxpemVkICovCgogIGlmICgoaT4wKSYmKGk8MTkzKSkKICAgIHJldHVybiBsZEludENvZWZmW2ldOwogIGVsc2UKICB7CiAgICByZXR1cm4gKDApOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogaW52U3FydE5vcm0yCiAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVUCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBTUVJUX0JJVFMgICAgICAgICAgIDcKI2RlZmluZSBTUVJUX1ZBTFVFUyAgICAgICAxMjgKI2RlZmluZSBTUVJUX0JJVFNfTUFTSyAgIDB4N2YKCkxOS19TRUNUSU9OX0NPTlNUREFUQV9MMQpzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydFRhYltTUVJUX1ZBTFVFU10gPSB7CiAgMHg1YTgyNzk5OSwgMHg1YTI4N2UwMywgMHg1OWNmOGNiYiwgMHg1OTc3YTBhYiwgMHg1OTIwYjRkZSwgMHg1OGNhYzQ4MCwgMHg1ODc1Y2FkZSwgMHg1ODIxYzM2NCwKICAweDU3Y2VhOTljLCAweDU3N2M3OTJmLCAweDU3MmIyZGRmLCAweDU2ZGFjMzhkLCAweDU2OGIzNjMxLCAweDU2M2M4MWRmLCAweDU1ZWVhMmMzLCAweDU1YTE5NTIxLAogIDB4NTU1NTU1NTUsIDB4NTUwOWRmZDAsIDB4NTRiZjMxMWEsIDB4NTQ3NTQ1ZDAsIDB4NTQyYzFhYTMsIDB4NTNlM2FjNWEsIDB4NTM5YmY3Y2MsIDB4NTM1NGY5ZTYsCiAgMHg1MzBlYWZhNCwgMHg1MmM5MTYxNywgMHg1Mjg0MmE1ZSwgMHg1MjNmZTlhYiwgMHg1MWZjNTEzZiwgMHg1MWI5NWU2YiwgMHg1MTc3MGU4ZSwgMHg1MTM1NWYxOSwKICAweDUwZjQ0ZDg4LCAweDUwYjNkNzY4LCAweDUwNzNmYTRmLCAweDUwMzRiM2U2LCAweDRmZjYwMWRmLCAweDRmYjdlMWY5LCAweDRmN2E1MjAxLCAweDRmM2Q0ZmNlLAogIDB4NGYwMGQ5NDMsIDB4NGVjNGVjNGUsIDB4NGU4OTg2ZTksIDB4NGU0ZWE3MTgsIDB4NGUxNDRhZTgsIDB4NGRkYTcwNzIsIDB4NGRhMTE1ZDksIDB4NGQ2ODM5NDgsCiAgMHg0ZDJmZDhmNCwgMHg0Y2Y3ZjMxYiwgMHg0Y2MwODYwNCwgMHg0Yzg5OGZmZiwgMHg0YzUzMGY2NCwgMHg0YzFkMDI5MywgMHg0YmU3NjdmNSwgMHg0YmIyM2RmOSwKICAweDRiN2Q4MzE3LCAweDRiNDkzNWNlLCAweDRiMTU1NGE2LCAweDRhZTFkZTJhLCAweDRhYWVkMGYwLCAweDRhN2MyYjkyLCAweDRhNDllY2IzLCAweDRhMTgxMmZhLAogIDB4NDllNjlkMTYsIDB4NDliNTg5YmIsIDB4NDk4NGQ3YTQsIDB4NDk1NDg1OTEsIDB4NDkyNDkyNDksIDB4NDhmNGZjOTYsIDB4NDhjNWMzNGEsIDB4NDg5NmU1M2MsCiAgMHg0ODY4NjE0NywgMHg0ODNhMzY0YywgMHg0ODBjNjMzMSwgMHg0N2RlZTZlMCwgMHg0N2IxYzA0OSwgMHg0Nzg0ZWU1ZiwgMHg0NzU4NzAxYywgMHg0NzJjNDQ3YywKICAweDQ3MDA2YTgwLCAweDQ2ZDRlMTMwLCAweDQ2YTlhNzkzLCAweDQ2N2ViY2I5LCAweDQ2NTQxZmIzLCAweDQ2MjljZjk4LCAweDQ1ZmZjYjgwLCAweDQ1ZDYxMjg5LAogIDB4NDVhY2EzZDUsIDB4NDU4MzdlODgsIDB4NDU1YWExY2EsIDB4NDUzMjBjYzgsIDB4NDUwOWJlYjAsIDB4NDRlMWI2YjQsIDB4NDRiOWY0MGIsIDB4NDQ5Mjc1ZWMsCiAgMHg0NDZiM2I5NSwgMHg0NDQ0NDQ0NCwgMHg0NDFkOGYzYiwgMHg0M2Y3MWJiZSwgMHg0M2QwZTkxNywgMHg0M2FhZjY4ZSwgMHg0Mzg1NDM3MywgMHg0MzVmY2YxNCwKICAweDQzM2E5OGM1LCAweDQzMTU5ZmRiLCAweDQyZjBlM2FlLCAweDQyY2M2Mzk3LCAweDQyYTgxZWY1LCAweDQyODQxNTI3LCAweDQyNjA0NThkLCAweDQyM2NhZjhjLAogIDB4NDIxOTUyOGIsIDB4NDFmNjJkZjEsIDB4NDFkMzQxMmEsIDB4NDFiMDhiYTEsIDB4NDE4ZTBjYzcsIDB4NDE2YmM0MGQsIDB4NDE0OWIwZTQsIDB4NDEyN2QyYzMsCiAgMHg0MTA2MjkyMCwgMHg0MGU0YjM3NCwgMHg0MGMzNzEzYSwgMHg0MGEyNjFlZiwgMHg0MDgxODUxMSwgMHg0MDYwZGEyMSwgMHg0MDQwNjBhMSwgMHg0MDIwMTgxNAp9OwoKTE5LX1NFQ1RJT05fSU5JVENPREUKdm9pZCBJbml0SW52U3FydFRhYigpCnsKICAvKiBub3RoaW5nIHRvIGRvICEKICAgICB1c2UgcHJlaW5pdGlhbGl6ZWQgc3F1YXJlIHJvb3QgdGFibGUKICAqLwp9CgoKCiNpZiAhZGVmaW5lZChGVU5DVElPTl9pbnZTcXJ0Tm9ybTIpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVULAogIGkuZS4gdGhlIGRlbm9ybWFsaXplZCByZXN1bHQgaXMgMS9zcXJ0KG9wKSA9IGludlNxcnROb3JtKG9wKSAqIDJeKHNoaWZ0KQogIHVzZXMgTmV3dG9uLWl0ZXJhdGlvbiBmb3IgYXBwcm94aW1hdGlvbgogICAgICBRKG4rMSkgPSBRKG4pICsgUShuKSAqICgwLjUgLSAyICogViAqIFEobileMikKICAgICAgd2l0aCBRID0gMC41KiBWIF4tMC41OyAwLjUgPD0gViA8IDEuMAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KQp7CgogIEZJWFBfREJMIHZhbCA9IG9wIDsKICBGSVhQX0RCTCByZWcxLCByZWcyLCByZWd0bXAgOwoKICBpZiAodmFsID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKICAgICpzaGlmdCA9IDEgOwogICAgcmV0dXJuKChMT05HKTEpOyAgLyogbWluaW11bSBwb3NpdGl2ZSB2YWx1ZSAqLwogIH0KCgogIC8qIG5vcm1hbGl6ZSBpbnB1dCwgY2FsY3VsYXRlIHNoaWZ0IHZhbHVlICovCiAgRkRLX0FTU0VSVCh2YWwgPiBGTDJGWENPTlNUX0RCTCgwLjApKTsKICAqc2hpZnQgPSBmTm9ybXoodmFsKSAtIDE7ICAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlIHNpbmNlIHRlc3QgdmFsdWUgaXMgYWx3YXlzID4gMCAqLwogIHZhbCA8PD0qc2hpZnQgOyAgLyogbm9ybWFsaXplZCBpbnB1dCBWICovCiAgKnNoaWZ0Kz0yIDsgICAgICAvKiBiaWFzIGZvciBleHBvbmVudCAqLwoKICAvKiBOZXd0b24gaXRlcmF0aW9uIG9mIDEvc3FydChWKSAqLwogIHJlZzEgPSBpbnZTcXJ0VGFiWyAoSU5UKSh2YWw+PihERlJBQ1RfQklUUy0xLShTUVJUX0JJVFMrMSkpKSAmIFNRUlRfQklUU19NQVNLIF07CiAgcmVnMiA9IEZMMkZYQ09OU1RfREJMKDAuMDYyNWYpOyAgIC8qIDAuNSA+PiAzICovCgogIHJlZ3RtcD0gZlBvdzJEaXYyKHJlZzEpOyAgICAgICAgICAgICAgLyogYSA9IFFeMiAqLwogIHJlZ3RtcD0gcmVnMiAtIGZNdWx0RGl2MihyZWd0bXAsIHZhbCk7ICAgICAgLyogYiA9IDAuNSAtIDIgKiBWICogUV4yICovCiAgcmVnMSArPSAoZk11bHREaXYyKHJlZ3RtcCwgcmVnMSk8PDQpOyAgICAgICAvKiBRID0gUSArIFEqYiAqLwoKICAvKiBjYWxjdWxhdGUgdGhlIG91dHB1dCBleHBvbmVudCA9IGlucHV0IGV4cC8yICovCiAgaWYgKCpzaGlmdCAmIDB4MDAwMDAwMDEpIHsgLyogb2RkIHNoaWZ0IHZhbHVlcyA/ICovCiAgICByZWcyID0gRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDlmKTsgLyogMS9zcXJ0KDIpOyAqLwogICAgcmVnMSA9IGZNdWx0RGl2MihyZWcxLCByZWcyKSA8PCAyOwogIH0KCiAgKnNoaWZ0ID0gKnNoaWZ0Pj4xOwoKICByZXR1cm4ocmVnMSk7Cn0KI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX2ludlNxcnROb3JtMikgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogc3FydEZpeHAKICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgc3FydChvcCkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpGSVhQX0RCTCBzcXJ0Rml4cChGSVhQX0RCTCBvcCkKewogIElOVCB0bXBfZXhwID0gMDsKICBGSVhQX0RCTCB0bXBfaW52ID0gaW52U3FydE5vcm0yKG9wLCAmdG1wX2V4cCk7CgogIEZES19BU1NFUlQodG1wX2V4cCA+IDApIDsKICByZXR1cm4oIChGSVhQX0RCTCkgKCBmTXVsdERpdjIoIChvcDw8KHRtcF9leHAtMSkpLCB0bXBfaW52ICkgPDwgMiApKTsKfQoKCiNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogc2NodXJfZGl2CiAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIG9wMS9vcDIgd2l0aCBvcDMtYml0IGFjY3VyYWN5CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgpGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQp7CiAgICBJTlQgTF9udW0gICA9IChMT05HKW51bT4+MTsKICAgIElOVCBMX2RlbnVtID0gKExPTkcpZGVudW0+PjE7CiAgICBJTlQgZGl2ICAgICA9IDA7CiAgICBJTlQgayAgICAgICA9IGNvdW50OwoKICAgIEZES19BU1NFUlQgKG51bT49KEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAoZGVudW0+KEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAobnVtIDw9IGRlbnVtKTsKCiAgICBpZiAoTF9udW0gIT0gMCkKICAgICAgICB3aGlsZSAoLS1rKQogICAgICAgIHsKICAgICAgICAgICAgZGl2ICAgPDw9IDE7CiAgICAgICAgICAgIExfbnVtIDw8PSAxOwogICAgICAgICAgICBpZiAoTF9udW0gPj0gTF9kZW51bSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTF9udW0gLT0gTF9kZW51bTsKICAgICAgICAgICAgICAgIGRpdisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgcmV0dXJuIChGSVhQX0RCTCkoZGl2IDw8IChERlJBQ1RfQklUUyAtIGNvdW50KSk7Cn0KCgojZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fc2NodXJfZGl2KSAqLwoKCiNpZm5kZWYgRlVOQ1RJT05fZk11bHROb3JtCkZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIsIElOVCAqcmVzdWx0X2UpCnsKICAgIElOVCAgICBwcm9kdWN0ID0gMDsKICAgIElOVCAgICBub3JtX2YxLCBub3JtX2YyOwoKICAgIGlmICggIChmMSA9PSAoRklYUF9EQkwpMCkgfHwgKGYyID09IChGSVhQX0RCTCkwKSApIHsKICAgICAgICAqcmVzdWx0X2UgPSAwOwogICAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKICAgIH0KICAgIG5vcm1fZjEgPSBDb3VudExlYWRpbmdCaXRzKGYxKTsKICAgIGYxID0gZjEgPDwgbm9ybV9mMTsKICAgIG5vcm1fZjIgPSBDb3VudExlYWRpbmdCaXRzKGYyKTsKICAgIGYyID0gZjIgPDwgbm9ybV9mMjsKCiAgICBwcm9kdWN0ID0gZk11bHQoZjEsIGYyKTsKICAgICpyZXN1bHRfZSAgPSAtIChub3JtX2YxICsgbm9ybV9mMik7CgogICAgcmV0dXJuIChGSVhQX0RCTClwcm9kdWN0Owp9CiNlbmRpZgoKI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybQpGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSkKewogICAgRklYUF9EQkwgZGl2OwogICAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKCiAgICBGREtfQVNTRVJUIChMX251bSAgID49IChGSVhQX0RCTCkwKTsKICAgIEZES19BU1NFUlQgKExfZGVudW0gPiAgKEZJWFBfREJMKTApOwoKICAgIGlmKExfbnVtID09IChGSVhQX0RCTCkwKQogICAgewogICAgICAgICpyZXN1bHRfZSA9IDA7CiAgICAgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7CiAgICB9CgogICAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKExfbnVtKTsKICAgIExfbnVtID0gTF9udW0gPDwgbm9ybV9udW07CiAgICBMX251bSA9IExfbnVtID4+IDE7CiAgICAqcmVzdWx0X2UgPSAtIG5vcm1fbnVtICsgMTsKCiAgICBub3JtX2RlbiA9IENvdW50TGVhZGluZ0JpdHMoTF9kZW51bSk7CiAgICBMX2RlbnVtID0gTF9kZW51bSA8PCBub3JtX2RlbjsKICAgICpyZXN1bHRfZSAtPSAtIG5vcm1fZGVuOwoKICAgIGRpdiA9IHNjaHVyX2RpdihMX251bSwgTF9kZW51bSwgRlJBQ1RfQklUUyk7CgogICAgcmV0dXJuIGRpdjsKfQojZW5kaWYgLyogIUZVTkNUSU9OX2ZEaXZOb3JtICovCgojaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtCkZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pCnsKICAgIElOVCBlOwogICAgRklYUF9EQkwgcmVzOwoKICAgIEZES19BU1NFUlQgKGRlbm9tID49IG51bSk7CgogICAgcmVzID0gZkRpdk5vcm0obnVtLCBkZW5vbSwgJmUpOwoKICAgIC8qIEF2b2lkIG92ZXJmbG93IHNpbmNlIHdlIG11c3Qgb3V0cHV0IGEgdmFsdWUgd2l0aCBleHBvbmVudCAwCiAgICAgICB0aGVyZSBpcyBubyBvdGhlciBjaG9pY2UgdGhhbiBzYXR1cmF0aW5nIHRvIGFsbW9zdCAxLjBmICovCiAgICBpZihyZXMgPT0gKEZJWFBfREJMKSgxPDwoREZSQUNUX0JJVFMtMikpICYmIGUgPT0gMSkKICAgIHsKICAgICAgICByZXMgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXMgPSBzY2FsZVZhbHVlKHJlcywgZSk7CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQojZW5kaWYgLyogIUZVTkNUSU9OX2ZEaXZOb3JtICovCgojaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtSGlnaFByZWMKRklYUF9EQkwgZkRpdk5vcm1IaWdoUHJlYyhGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBJTlQgKnJlc3VsdF9lKQp7CiAgICBGSVhQX0RCTCBkaXY7CiAgICBJTlQgbm9ybV9udW0sIG5vcm1fZGVuOwoKICAgIEZES19BU1NFUlQgKG51bSAgID49IChGSVhQX0RCTCkwKTsKICAgIEZES19BU1NFUlQgKGRlbm9tID4gIChGSVhQX0RCTCkwKTsKCiAgICBpZihudW0gPT0gKEZJWFBfREJMKTApCiAgICB7CiAgICAgICAgKnJlc3VsdF9lID0gMDsKICAgICAgICByZXR1cm4gKChGSVhQX0RCTCkwKTsKICAgIH0KCiAgICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMobnVtKTsKICAgIG51bSA9IG51bSA8PCBub3JtX251bTsKICAgIG51bSA9IG51bSA+PiAxOwogICAgKnJlc3VsdF9lID0gLSBub3JtX251bSArIDE7CgogICAgbm9ybV9kZW4gPSBDb3VudExlYWRpbmdCaXRzKGRlbm9tKTsKICAgIGRlbm9tID0gZGVub20gPDwgbm9ybV9kZW47CiAgICAqcmVzdWx0X2UgLT0gIC0gbm9ybV9kZW47CgogICAgZGl2ID0gc2NodXJfZGl2KG51bSwgZGVub20sIDMxKTsKICAgIHJldHVybiBkaXY7Cn0KI2VuZGlmIC8qICFGVU5DVElPTl9mRGl2Tm9ybUhpZ2hQcmVjICovCgoKCkZJWFBfREJMIENhbGNMb2cyKEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UICpyZXN1bHRfZSkKewogIHJldHVybiBmTG9nMihiYXNlX20sIGJhc2VfZSwgcmVzdWx0X2UpOwp9CgpGSVhQX0RCTCBmMlBvdygKICAgICAgICBjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lLAogICAgICAgIElOVCAqcmVzdWx0X2UKICAgICAgICApCnsKICBGSVhQX0RCTCBmcmFjX3BhcnQsIHJlc3VsdF9tOwogIElOVCBpbnRfcGFydDsKCiAgaWYgKGV4cF9lID4gMCkKICB7CiAgICAgIElOVCBleHBfYml0cyA9IERGUkFDVF9CSVRTLTEgLSBleHBfZTsKICAgICAgaW50X3BhcnQgPSBleHBfbSA+PiBleHBfYml0czsKICAgICAgZnJhY19wYXJ0ID0gZXhwX20gLSAoRklYUF9EQkwpKGludF9wYXJ0IDw8IGV4cF9iaXRzKTsKICAgICAgZnJhY19wYXJ0ID0gZnJhY19wYXJ0IDw8IGV4cF9lOwogIH0KICBlbHNlCiAgewogICAgICBpbnRfcGFydCA9IDA7CiAgICAgIGZyYWNfcGFydCA9IGV4cF9tID4+IC1leHBfZTsKICB9CgogIC8qIEJlc3QgYWNjdXJhY3kgaXMgYXJvdW5kIDAsIHNvIHRyeSB0byBnZXQgdGhlcmUgd2l0aCB0aGUgZnJhY3Rpb25hbCBwYXJ0LiAqLwogIGlmKCBmcmFjX3BhcnQgPiBGTDJGWENPTlNUX0RCTCgwLjVmKSApCiAgewogICAgICBpbnRfcGFydCA9IGludF9wYXJ0ICsgMTsKICAgICAgZnJhY19wYXJ0ID0gZnJhY19wYXJ0ICsgRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogIH0KICBpZiggZnJhY19wYXJ0IDwgRkwyRlhDT05TVF9EQkwoLTAuNWYpICkKICB7CiAgICAgIGludF9wYXJ0ID0gaW50X3BhcnQgLSAxOwogICAgICBmcmFjX3BhcnQgPSAtKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIGZyYWNfcGFydCk7CiAgfQoKICAvKiBFdmFsdWF0ZSB0YXlsb3IgcG9seW5vbWlhbCB3aGljaCBhcHByb3hpbWF0ZXMgMl54ICovCiAgewogICAgRklYUF9EQkwgcDsKCiAgICAvKiByZXN1bHRfbSB+PSAyXmZyYWNfcGFydCAqLwogICAgcCA9IGZyYWNfcGFydDsKICAgIC8qIEZpcnN0IHRheWxvciBzZXJpZXMgY29lZmZpY2llbnQgYV8wID0gMS4wLCBzY2FsZWQgYnkgMC41IGR1ZSB0byBmTXVsdERpdjIoKS4gKi8KICAgIHJlc3VsdF9tID0gRkwyRlhDT05TVF9EQkwoMS4wZi8yLjBmKTsKICAgIGZvciAoSU5UIGkgPSAwOyBpIDwgUE9XMl9QUkVDSVNJT047IGkrKykgewogICAgICAvKiBuZXh0IHRheWxvciBzZXJpZXMgdGVybTogYV9pICogeF5pLCB4PTAgKi8KICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIHBvdzJDb2VmZltpXSwgcCk7CiAgICAgIHAgID0gZk11bHQocCwgZnJhY19wYXJ0KTsKICAgIH0KICB9CgogIC8qICIrIDEiIGNvbXBlbnNhdGVzIGZNdWx0QWRkRGl2MigpIG9mIHRoZSBwb2x5bm9taWFsIGV2YWx1YXRpb24gYWJvdmUuICovCiAgKnJlc3VsdF9lID0gaW50X3BhcnQgKyAxOwoKICByZXR1cm4gcmVzdWx0X207Cn0KCkZJWFBfREJMIGYyUG93KAogICAgICAgIGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UKICAgICAgICApCnsKICBGSVhQX0RCTCByZXN1bHRfbTsKICBJTlQgcmVzdWx0X2U7CgogIHJlc3VsdF9tID0gZjJQb3coZXhwX20sIGV4cF9lLCAmcmVzdWx0X2UpOwogIHJlc3VsdF9lID0gZml4TWluKERGUkFDVF9CSVRTLTEsZml4TWF4KC0oREZSQUNUX0JJVFMtMSkscmVzdWx0X2UpKTsKCiAgcmV0dXJuIHNjYWxlVmFsdWUocmVzdWx0X20sIHJlc3VsdF9lKTsKfQoKRklYUF9EQkwgZlBvdygKICAgICAgICBGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsCiAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKICAgICAgICBJTlQgKnJlc3VsdF9lCiAgICAgICAgKQp7CiAgICBJTlQgYW5zX2xnMl9lLCBiYXNlbGcyX2U7CiAgICBGSVhQX0RCTCBiYXNlX2xnMiwgYW5zX2xnMiwgcmVzdWx0OwoKICAgIC8qIENhbGMgbG9nMiBvZiBiYXNlICovCiAgICBiYXNlX2xnMiA9IGZMb2cyKGJhc2VfbSwgYmFzZV9lLCAmYmFzZWxnMl9lKTsKCiAgICAvKiBQcmVwYXJlIGV4cCAqLwogICAgewogICAgICBJTlQgbGVhZGluZ0JpdHM7CgogICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOwogICAgICBleHBfbSA9IGV4cF9tIDw8IGxlYWRpbmdCaXRzOwogICAgICBleHBfZSAtPSBsZWFkaW5nQml0czsKICAgIH0KCiAgICAvKiBDYWxjIGJhc2UgcG93IGV4cCAqLwogICAgYW5zX2xnMiA9IGZNdWx0KGJhc2VfbGcyLCBleHBfbSk7CiAgICBhbnNfbGcyX2UgPSBleHBfZSArIGJhc2VsZzJfZTsKCiAgICAvKiBDYWxjIGFudGlsb2cgKi8KICAgIHJlc3VsdCA9IGYyUG93KGFuc19sZzIsIGFuc19sZzJfZSwgcmVzdWx0X2UpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCkZJWFBfREJMIGZMZFBvdygKICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwKICAgICAgICBJTlQgYmFzZUxkX2UsCiAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKICAgICAgICBJTlQgKnJlc3VsdF9lCiAgICAgICAgKQp7CiAgICBJTlQgYW5zX2xnMl9lOwogICAgRklYUF9EQkwgYW5zX2xnMiwgcmVzdWx0OwoKICAgIC8qIFByZXBhcmUgZXhwICovCiAgICB7CiAgICAgIElOVCBsZWFkaW5nQml0czsKCiAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGV4cF9tKSk7CiAgICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7CiAgICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOwogICAgfQoKICAgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCiAgICBhbnNfbGcyID0gZk11bHQoYmFzZUxkX20sIGV4cF9tKTsKICAgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZUxkX2U7CgogICAgLyogQ2FsYyBhbnRpbG9nICovCiAgICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgpGSVhQX0RCTCBmTGRQb3coCiAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lCiAgICAgICAgKQp7CiAgRklYUF9EQkwgcmVzdWx0X207CiAgaW50IHJlc3VsdF9lOwoKICByZXN1bHRfbSA9IGZMZFBvdyhiYXNlTGRfbSwgYmFzZUxkX2UsIGV4cF9tLCBleHBfZSwgJnJlc3VsdF9lKTsKCiAgcmV0dXJuIFNBVFVSQVRFX1NISUZUKHJlc3VsdF9tLCAtcmVzdWx0X2UsIERGUkFDVF9CSVRTKTsKfQoKRklYUF9EQkwgZlBvd0ludCgKICAgICAgICBGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsCiAgICAgICAgSU5UIGV4cCwKICAgICAgICBJTlQgKnBSZXN1bHRfZQogICAgICAgICkKewogIEZJWFBfREJMIHJlc3VsdDsKCiAgaWYgKGV4cCAhPSAwKSB7CiAgICBJTlQgcmVzdWx0X2UgPSAwOwoKICAgIGlmIChiYXNlX20gIT0gKEZJWFBfREJMKTApIHsKICAgICAgewogICAgICAgIElOVCBsZWFkaW5nQml0czsKICAgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoIGJhc2VfbSApOwogICAgICAgIGJhc2VfbSA8PD0gbGVhZGluZ0JpdHM7CiAgICAgICAgYmFzZV9lIC09IGxlYWRpbmdCaXRzOwogICAgICB9CgogICAgICByZXN1bHQgPSBiYXNlX207CgogICAgICB7CiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IGZBYnMoZXhwKTsgaSsrKSB7CiAgICAgICAgICByZXN1bHQgPSBmTXVsdChyZXN1bHQsIGJhc2VfbSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZXhwIDwgMCkgewogICAgICAgIC8qIDEuMCAvIGFucyAqLwogICAgICAgIHJlc3VsdCA9IGZEaXZOb3JtKCBGTDJGWENPTlNUX0RCTCgwLjVmKSwgcmVzdWx0LCAmcmVzdWx0X2UgKTsKICAgICAgICByZXN1bHRfZSsrOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBhbnNTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoIHJlc3VsdCApOwogICAgICAgIHJlc3VsdCA8PD0gYW5zU2NhbGU7CiAgICAgICAgcmVzdWx0X2UgLT0gYW5zU2NhbGU7CiAgICAgIH0KCiAgICAgIHJlc3VsdF9lICs9IGV4cCAqIGJhc2VfZTsKCiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSAoRklYUF9EQkwpMDsKICAgIH0KICAgICpwUmVzdWx0X2UgPSByZXN1bHRfZTsKICB9CiAgZWxzZSB7CiAgICByZXN1bHQgPSAgRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgICAqcFJlc3VsdF9lID0gMTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KCkZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSkKewogIEZJWFBfREJMIHJlc3VsdF9tOwoKICAvKiBTaG9ydCBjdXQgZm9yIHplcm8gYW5kIG5lZ2F0aXZlIG51bWJlcnMuICovCiAgaWYgKCB4X20gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CiAgICAqcmVzdWx0X2UgPSBERlJBQ1RfQklUUy0xOwogICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICB9CgogIC8qIENhbGN1bGF0ZSBsb2cyKCkgKi8KICB7CiAgICBGSVhQX0RCTCBweDJfbSwgeDJfbTsKCiAgICAvKiBNb3ZlIGlucHV0IHZhbHVlIHhfbSAqIDJeeF9lIHRvd2FyZCAxLjAsIHdoZXJlIHRoZSB0YXlsb3IgYXBwcm94aW1hdGlvbgogICAgICAgb2YgdGhlIGZ1bmN0aW9uIGxvZygxLXgpIGNlbnRlcmVkIGF0IDAgaXMgbW9zdCBhY2N1cmF0ZS4gKi8KICAgIHsKICAgICAgSU5UIGJfbm9ybTsKCiAgICAgIGJfbm9ybSA9IGZOb3Jteih4X20pLTE7CiAgICAgIHgyX20gPSB4X20gPDwgYl9ub3JtOwogICAgICB4X2UgPSB4X2UgLSBiX25vcm07CiAgICB9CgogICAgLyogbWFwIHggZnJvbSBsb2coeCkgZG9tYWluIHRvIGxvZygxLXgpIGRvbWFpbi4gKi8KICAgIHgyX20gPSAtICh4Ml9tICsgRkwyRlhDT05TVF9EQkwoLTEuMCkgKTsKCiAgICAvKiBUYXlsb3IgcG9saW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIGxuKDEteCkgKi8KICAgIHJlc3VsdF9tICA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CiAgICBweDJfbSA9IHgyX207CiAgICBmb3IgKGludCBpPTA7IGk8TERfUFJFQ0lTSU9OOyBpKyspIHsKICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIGxkQ29lZmZbaV0sIHB4Ml9tKTsKICAgICAgcHgyX20gPSBmTXVsdChweDJfbSwgeDJfbSk7CiAgICB9CiAgICAvKiBNdWx0aXBseSByZXN1bHQgd2l0aCAxL2xuKDIpID0gMS4wICsgMC40NDI2OTUwNDA4ODggKGdldCBsb2cyKHgpIGZyb20gbG4oeCkgcmVzdWx0KS4gKi8KICAgIHJlc3VsdF9tID0gZk11bHRBZGREaXYyKHJlc3VsdF9tLCByZXN1bHRfbSwgRkwyRlhDT05TVF9EQkwoMi4wKjAuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxOSkpOwoKICAgIC8qIEFkZCBleHBvbmVudCBwYXJ0LiBsb2cyKHhfbSAqIDJeeF9lKSA9IGxvZzIoeF9tKSArIHhfZSAqLwogICAgaWYgKHhfZSAhPSAwKQogICAgewogICAgICBpbnQgZW5vcm07CgogICAgICBlbm9ybSA9IERGUkFDVF9CSVRTIC0gZk5vcm0oKEZJWFBfREJMKXhfZSk7CiAgICAgIC8qIFRoZSAtMSBpbiB0aGUgcmlnaHQgc2hpZnQgb2YgcmVzdWx0X20gY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9saW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KICAgICAgcmVzdWx0X20gPSAocmVzdWx0X20gPj4gKGVub3JtLTEpKSArICgoRklYUF9EQkwpeF9lIDw8IChERlJBQ1RfQklUUy0xLWVub3JtKSk7CgogICAgICAqcmVzdWx0X2UgPSBlbm9ybTsKICAgIH0gZWxzZSB7CiAgICAgIC8qIDEgY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9saW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KICAgICAgKnJlc3VsdF9lID0gMTsKICAgIH0KICB9CgogIHJldHVybiByZXN1bHRfbTsKfQoKRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lKQp7CiAgaWYgKCB4X20gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CiAgICB4X20gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgfQogIGVsc2UgewogICAgSU5UIHJlc3VsdF9lOwogICAgeF9tID0gZkxvZzIoeF9tLCB4X2UsICZyZXN1bHRfZSk7CiAgICB4X20gPSBzY2FsZVZhbHVlKHhfbSwgcmVzdWx0X2UtTERfREFUQV9TSElGVCk7CiAgfQogIHJldHVybiAgeF9tOwp9CgoKCgo=