Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBHYXllcgogICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKCgojZGVmaW5lIE1BWF9MRF9QUkVDSVNJT04gMTAKI2RlZmluZSBMRF9QUkVDSVNJT04gICAgIDEwCgovKiBUYXlsb3Igc2VyaWVzIGNvZWZmY2llbnRzIGZvciBsbigxLXgpLCBjZW50ZXJlZCBhdCAwIChNYWNMYXVyaW4gcG9saW5vbWlhbCkuICovCiNpZm5kZWYgTERDT0VGRl8xNkJJVApMTktfU0VDVElPTl9DT05TVERBVEFfTDEKc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkQ29lZmZbTUFYX0xEX1BSRUNJU0lPTl0gPSB7CiAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMi4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMy4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNC4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNi4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNy4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvOC4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvOS4wKSwKICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMTAuMCkKfTsKI2Vsc2UKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX1NHTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0gewogICAgRkwyRlhDT05TVF9TR0woLTEuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzIuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzMuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzQuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzUuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzYuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzcuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzguMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzkuMCksCiAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzEwLjApCn07CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogQ2FsY0xkRGF0YQogIGRlc2NyaXB0aW9uOiAgRGVsaXZlcnMgdGhlIExvZ2FyaXRobSBEdWFsaXMgbGQob3ApL0xEX0RBVEFfU0NBTElORyB3aXRoIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4KICBpbnB1dDogICAgICAgIElucHV0IG9wIGlzIGFzc3VtZWQgdG8gYmUgZG91YmxlIHByZWNpc2lvbiBmcmFjdGlvbmFsIDAgPCBvcCA8IDEuMAogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgbmVnYXRpdmUgdmFsdWVzLgogIG91dHB1dDogICAgICAgRm9yIG9wID09IDAsIHRoZSByZXN1bHQgaXMgc2F0dXJhdGVkIHRvIC0xLjAKICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHBvc2l0aXZlIHZhbHVlcyBzaW5jZSBpbnB1dCB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZnJhY3Rpb25hbCB2YWx1ZXMuCiAgICAgICAgICAgICAgICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGlucHV0IGFuIGludGVnZXIgdmFsdWUgaW50byB0aGlzIGZ1bmN0aW9uIChhbmQgZXhwZWN0IGEgcG9zaXRpdmUgb3V0cHV0IHZhbHVlKQogICAgICAgICAgICAgICAgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpMTktfU0VDVElPTl9DT0RFX0wxCkZJWFBfREJMIENhbGNMZERhdGEoRklYUF9EQkwgb3ApCnsKICByZXR1cm4gZkxvZzIob3AsIDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgZnVuY3Rpb25uYW1lOiBMZERhdGFWZWN0b3IKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxOS19TRUNUSU9OX0NPREVfTDEKdm9pZCBMZERhdGFWZWN0b3IoICBGSVhQX0RCTCAgICAqc3JjVmVjdG9yLAogICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpkZXN0VmVjdG9yLAogICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG4pCnsKICAgIElOVCBpOwogICAgZm9yICggaT0wOyBpPG47IGkrKykgewogICAgICAgIGRlc3RWZWN0b3JbaV0gPSBDYWxjTGREYXRhKHNyY1ZlY3RvcltpXSk7CiAgICB9Cn0KCgoKI2RlZmluZSBNQVhfUE9XMl9QUkVDSVNJT04gOAojaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAoJI2RlZmluZSBQT1cyX1BSRUNJU0lPTiBNQVhfUE9XMl9QUkVDSVNJT04KI2Vsc2UKCSNkZWZpbmUgUE9XMl9QUkVDSVNJT04gNQojZW5kaWYKCi8qCiAgVGF5bG9yIHNlcmllcyBjb2VmZmljaWVudHMgb2YgdGhlIGZ1bmN0aW9uIHheMi4gVGhlIGZpcnN0IGNvZWZmaWNpZW50IGlzCiAgb21taXRlZCAoZXF1YWwgdG8gMS4wKS4KCiAgcG93MkNvZWZmW2ktMV0gPSAoMS9pISkgZF5pKDJeeCkvZHheaSwgaT0xLi5NQVhfUE9XMl9QUkVDSVNJT04KICBUbyBldmFsdWF0ZSB0aGUgdGF5bG9yIHNlcmllcyBhcm91bmQgeCA9IDAsIHRoZSBjb2VmZmljaWVudHMgYXJlOiAxLyFpICogbG4oMileaQogKi8KI2lmbmRlZiBQT1cyQ09FRkZfMTZCSVQKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBwb3cyQ29lZmZbTUFYX1BPVzJfUFJFQ0lTSU9OXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAgLyogbG4oMileMyAvMyEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAgLyogbG4oMileNiAvNiEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KICAgIEZMMkZYQ09OU1RfREJMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KfTsKI2Vsc2UKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX1NHTCBwb3cyQ29lZmZbTUFYX1BPVzJfUFJFQ0lTSU9OXSA9IHsKICAgIEZMMkZYQ09OU1RfU0dMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAgLyogbG4oMileMyAvMyEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAgLyogbG4oMileNiAvNiEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KICAgIEZMMkZYQ09OU1RfU0dMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KfTsKI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogbXVsX2RibF9zZ2xfcm5kCiAgICBkZXNjcmlwdGlvbjogIE11bHRpcGx5IHdpdGggcm91bmQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZm9yIHJvdW5kaW5nIGEgZGZyYWN0IHRvIGZyYWN0ICovCiNkZWZpbmUgQUNDVV9SIChMT05HKSAweDAwMDA4MDAwCgpMTktfU0VDVElPTl9DT0RFX0wxCkZJWFBfREJMIG11bF9kYmxfc2dsX3JuZCAoY29uc3QgRklYUF9EQkwgb3AxLCBjb25zdCBGSVhQX1NHTCBvcDIpCnsKICBGSVhQX0RCTCBwcm9kOwogIExPTkcgdiA9IChMT05HKShvcDEpOwogIFNIT1JUIHUgPSAoU0hPUlQpKG9wMik7CgogIExPTkcgbG93ID0gdSoodiZTR0xfTUFTSyk7CiAgbG93ID0gKGxvdysoQUNDVV9SPj4xKSkgPj4gKEZSQUNUX0JJVFMtMSk7ICAvKiByb3VuZCAqLwogIExPTkcgaGlnaCA9IHUgKiAoKHY+PkZSQUNUX0JJVFMpPDwxKTsKCiAgcHJvZCA9IChMT05HKShoaWdoK2xvdyk7CgogIHJldHVybigoRklYUF9EQkwpcHJvZCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBDYWxjSW52TGREYXRhCiAgZGVzY3JpcHRpb246ICBEZWxpdmVycyB0aGUgaW52ZXJzZSBvZiBmdW5jdGlvbiBDYWxjTGREYXRhKCkuCiAgICAgICAgICAgICAgICBEZWxpdmVycyAyXihvcCpMRF9EQVRBX1NDQUxJTkcpCiAgaW5wdXQ6ICAgICAgICBJbnB1dCBvcCBpcyBhc3N1bWVkIHRvIGJlIGZyYWN0aW9uYWwgLTEuMCA8IG9wIDwgMS4wCiAgb3V0cHV0OiAgICAgICBGb3Igb3AgPT0gMCwgdGhlIHJlc3VsdCBpcyBNQVhWQUxfREJMIChhbG1vc3QgMS4wKS4KICAgICAgICAgICAgICAgIEZvciBuZWdhdGl2ZSBpbnB1dCB2YWx1ZXMgdGhlIG91dHB1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHBvc2l0aXZlIGZyYWN0aW9uYWwgdmFsdWUuCiAgICAgICAgICAgICAgICBGb3IgcG9zaXRpdmUgaW5wdXQgdmFsdWVzIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLgogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBvdXRwdXQgbmVnYXRpdmUgdmFsdWVzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxOS19TRUNUSU9OX0NPREVfTDEKLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLwovKiB4IGluIHJhbmdlIFswLi4uMS4wWyBpbiBzdGVwcyBvZiAxLzMyICovCkxOS19TRUNUSU9OX0RBVEFfTDEgc3RhdGljIGNvbnN0IFVJTlQgZXhwMl90YWJfbG9uZ1szMl09ewoweDQwMDAwMDAwLDB4NDE2NkMzNEMsMHg0MkQ1NjFCNCwweDQ0NEMwNzQwLAoweDQ1Q0FFMEYyLDB4NDc1MjFDQzYsMHg0OEUxRTlCQSwweDRBN0E3N0Q0LAoweDRDMUJGODI5LDB4NERDNjlDREQsMHg0RjdBOTkzMCwweDUxMzgyMTgyLAoweDUyRkY2QjU1LDB4NTREMEFENUEsMHg1NkFDMUY3NSwweDU4OTFGQUMxLAoweDVBODI3OTlBLDB4NUM3REQ3QTQsMHg1RTg0NTFEMCwweDYwOTYyNjY1LAoweDYyQjM5NTA5LDB4NjREQ0RFQzMsMHg2NzEyNDYwQiwweDY5NTQwRUM5LAoweDZCQTI3RTY1LDB4NkRGRERCQ0MsMHg3MDY2NkY3NiwweDcyREM4Mzc0LAoweDc1NjA2Mzc0LDB4NzdGMjVDQ0UsMHg3QTkyQkU4QiwweDdENDFEOTZFCi8vIDB4ODAwMDAwMDAKfTsKCi8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KLyogeCBpbiByYW5nZSBbMC4uLjEvMzJbIGluIHN0ZXBzIG9mIDEvMTAyNCAqLwpMTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJ3X3RhYl9sb25nWzMyXT17CjB4NDAwMDAwMDAsMHg0MDBCMTgxOCwweDQwMTYzMjFCLDB4NDAyMTRFMEMsCjB4NDAyQzZCRTksMHg0MDM3OEJCNCwweDQwNDJBRDZELDB4NDA0REQxMTMsCjB4NDA1OEY2QTgsMHg0MDY0MUUyQiwweDQwNkY0NzlFLDB4NDA3QTczMDAsCjB4NDA4NUEwNTEsMHg0MDkwQ0Y5MiwweDQwOUMwMEM0LDB4NDBBNzMzRTYsCjB4NDBCMjY4RkEsMHg0MEJEOUZGRiwweDQwQzhEOEY1LDB4NDBENDEzREQsCjB4NDBERjUwQjgsMHg0MEVBOEY4NiwweDQwRjVEMDQ2LDB4NDEwMTEyRkEsCjB4NDEwQzU3QTIsMHg0MTE3OUUzRCwweDQxMjJFNkNELDB4NDEyRTMxNTIsCjB4NDEzOTdEQ0MsMHg0MTQ0Q0MzQiwweDQxNTAxQ0EwLDB4NDE1QjZFRkIsCi8vIDB4NDE2NkMzNEMsCn07Ci8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KLyogeCBpbiByYW5nZSBbMC4uLjEvMTAyNFsgaW4gc3RlcHMgb2YgMS8zMjc2OCAqLwpMTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJ4X3RhYl9sb25nWzMyXT17CjB4NDAwMDAwMDAsMHg0MDAwNThCOSwweDQwMDBCMTczLDB4NDAwMTBBMkQsCjB4NDAwMTYyRTgsMHg0MDAxQkJBMywweDQwMDIxNDVGLDB4NDAwMjZEMUIsCjB4NDAwMkM1RDgsMHg0MDAzMUU5NSwweDQwMDM3NzUyLDB4NDAwM0QwMTEsCjB4NDAwNDI4Q0YsMHg0MDA0ODE4RSwweDQwMDREQTRFLDB4NDAwNTMzMEUsCjB4NDAwNThCQ0UsMHg0MDA1RTQ4RiwweDQwMDYzRDUxLDB4NDAwNjk2MTMsCjB4NDAwNkVFRDUsMHg0MDA3NDc5OCwweDQwMDdBMDVCLDB4NDAwN0Y5MUYsCjB4NDAwODUxRTQsMHg0MDA4QUFBOCwweDQwMDkwMzZFLDB4NDAwOTVDMzMsCjB4NDAwOUI0RkEsMHg0MDBBMERDMCwweDQwMEE2Njg4LDB4NDAwQUJGNEYsCi8vMHg0MDBCMTgxOAp9OwoKTE5LX1NFQ1RJT05fQ09ERV9MMSBGSVhQX0RCTCBDYWxjSW52TGREYXRhKEZJWFBfREJMIHgpCnsKICBpbnQgc2V0X3plcm8gPSAoeCA8ICBGTDJGWENPTlNUX0RCTCgtMzEuMC82NC4wKSk/IDAgOiAxOwogIGludCBzZXRfbWF4ICA9ICh4ID49IEZMMkZYQ09OU1RfREJMKCAzMS4wLzY0LjApKSB8ICh4ID09IEZMMkZYQ09OU1RfREJMKDAuMCkpOwoKICBGSVhQX1NHTCBmcmFjID0gKEZJWFBfU0dMKShMT05HKSh4ICYgMHgzRkYpOwogIFVJTlQgaW5kZXgzID0gKFVJTlQpKExPTkcpKHggPj4gMTApICYgMHgxRjsKICBVSU5UIGluZGV4MiA9IChVSU5UKShMT05HKSh4ID4+IDE1KSAmIDB4MUY7IAogIFVJTlQgaW5kZXgxID0gKFVJTlQpKExPTkcpKHggPj4gMjApICYgMHgxRjsKICBpbnQgZXhwICA9ICh4ID4gIEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/ICgzMSAtIChpbnQpKHg+PjI1KSkgOiAoaW50KSgtKHg+PjI1KSk7CgogIFVJTlQgbG9va3VwMSA9IGV4cDJfdGFiX2xvbmdbaW5kZXgxXSpzZXRfemVybzsKICBVSU5UIGxvb2t1cDIgPSBleHAyd190YWJfbG9uZ1tpbmRleDJdOwogIFVJTlQgbG9va3VwMyA9IGV4cDJ4X3RhYl9sb25nW2luZGV4M107CiAgVUlOVCBsb29rdXAzZiA9IGxvb2t1cDMgKyAoVUlOVCkoTE9ORylmTXVsdERpdjIoKEZJWFBfREJMKSgweDAwMTYzMDJGKSwoRklYUF9TR0wpZnJhYyk7CiAgCiAgVUlOVCBsb29rdXAxMiA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxLCAgKEZJWFBfREJMKSBsb29rdXAyKTsKICBVSU5UIGxvb2t1cCAgID0gKFVJTlQpKExPTkcpZk11bHQoKEZJWFBfREJMKWxvb2t1cDEyLCAoRklYUF9EQkwpIGxvb2t1cDNmKTsKCiAgRklYUF9EQkwgcmV0VmFsID0gKGxvb2t1cDw8MykgPj4gZXhwOwoKICBpZiAoc2V0X21heCkKICAgIHJldFZhbD1GTDJGWENPTlNUX0RCTCgxLjBmKTsKCiAgcmV0dXJuIHJldFZhbDsKfQoKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBJbml0TGRJbnQgYW5kIENhbGNMZEludAogICAgZGVzY3JpcHRpb246ICBDcmVhdGUgYW5kIGFjY2VzcyB0YWJsZSB3aXRoIGludGVnZXIgTGREYXRhICgwIHRvIDE5MykKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAgIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogICAgc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkSW50Q29lZmZbXSA9IHsKICAgICAgMHg4MDAwMDAwMSwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMzJiODAzNCwgMHgwNDAwMDAwMCwgMHgwNGE0ZDNjMiwgMHgwNTJiODAzNCwgMHgwNTlkNWRhMCwKICAgICAgMHgwNjAwMDAwMCwgMHgwNjU3MDA2OSwgMHgwNmE0ZDNjMiwgMHgwNmViM2E5ZiwgMHgwNzJiODAzNCwgMHgwNzY2YTAwOSwgMHgwNzlkNWRhMCwgMHgwN2QwNTNmNywKICAgICAgMHgwODAwMDAwMCwgMHgwODJjYzdlZSwgMHgwODU3MDA2OSwgMHgwODdlZjA1YiwgMHgwOGE0ZDNjMiwgMHgwOGM4ZGRkNCwgMHgwOGViM2E5ZiwgMHgwOTBjMTA1MCwKICAgICAgMHgwOTJiODAzNCwgMHgwOTQ5YTc4NSwgMHgwOTY2YTAwOSwgMHgwOTgyODA5ZCwgMHgwOTlkNWRhMCwgMHgwOWI3NDk0OSwgMHgwOWQwNTNmNywgMHgwOWU4OGM2YiwKICAgICAgMHgwYTAwMDAwMCwgMHgwYTE2YmFkMywgMHgwYTJjYzdlZSwgMHgwYTQyMzE2MiwgMHgwYTU3MDA2OSwgMHgwYTZiM2Q3OSwgMHgwYTdlZjA1YiwgMHgwYTkyMjAzZCwKICAgICAgMHgwYWE0ZDNjMiwgMHgwYWI3MTEwZSwgMHgwYWM4ZGRkNCwgMHgwYWRhM2Y2MCwgMHgwYWViM2E5ZiwgMHgwYWZiZDQyYiwgMHgwYjBjMTA1MCwgMHgwYjFiZjMxMiwKICAgICAgMHgwYjJiODAzNCwgMHgwYjNhYmI0MCwgMHgwYjQ5YTc4NSwgMHgwYjU4NDgyMiwgMHgwYjY2YTAwOSwgMHgwYjc0YjFmZCwgMHgwYjgyODA5ZCwgMHgwYjkwMGU2MSwKICAgICAgMHgwYjlkNWRhMCwgMHgwYmFhNzA4ZiwgMHgwYmI3NDk0OSwgMHgwYmMzZTljYSwgMHgwYmQwNTNmNywgMHgwYmRjODk5YiwgMHgwYmU4OGM2YiwgMHgwYmY0NWUwOSwKICAgICAgMHgwYzAwMDAwMCwgMHgwYzBiNzNjYiwgMHgwYzE2YmFkMywgMHgwYzIxZDY3MSwgMHgwYzJjYzdlZSwgMHgwYzM3OTA4NSwgMHgwYzQyMzE2MiwgMHgwYzRjYWJhOCwKICAgICAgMHgwYzU3MDA2OSwgMHgwYzYxMzBhZiwgMHgwYzZiM2Q3OSwgMHgwYzc1MjdiOSwgMHgwYzdlZjA1YiwgMHgwYzg4OTgzZiwgMHgwYzkyMjAzZCwgMHgwYzliODkyNiwKICAgICAgMHgwY2E0ZDNjMiwgMHgwY2FlMDBkMiwgMHgwY2I3MTEwZSwgMHgwY2MwMDUyYiwgMHgwY2M4ZGRkNCwgMHgwY2QxOWJiMCwgMHgwY2RhM2Y2MCwgMHgwY2UyYzk3ZCwKICAgICAgMHgwY2ViM2E5ZiwgMHgwY2YzOTM1NSwgMHgwY2ZiZDQyYiwgMHgwZDAzZmRhOSwgMHgwZDBjMTA1MCwgMHgwZDE0MGNhMCwgMHgwZDFiZjMxMiwgMHgwZDIzYzQxZCwKICAgICAgMHgwZDJiODAzNCwgMHgwZDMzMjdjNywgMHgwZDNhYmI0MCwgMHgwZDQyM2IwOCwgMHgwZDQ5YTc4NSwgMHgwZDUxMDExOCwgMHgwZDU4NDgyMiwgMHgwZDVmN2NmZiwKICAgICAgMHgwZDY2YTAwOSwgMHgwZDZkYjE5NywgMHgwZDc0YjFmZCwgMHgwZDdiYTE5MCwgMHgwZDgyODA5ZCwgMHgwZDg5NGY3NSwgMHgwZDkwMGU2MSwgMHgwZDk2YmRhZCwKICAgICAgMHgwZDlkNWRhMCwgMHgwZGEzZWU3ZiwgMHgwZGFhNzA4ZiwgMHgwZGIwZTQxMiwgMHgwZGI3NDk0OSwgMHgwZGJkYTA3MiwgMHgwZGMzZTljYSwgMHgwZGNhMjU4ZSwKICAgICAgMHgwZGQwNTNmNywgMHgwZGQ2NzUzZSwgMHgwZGRjODk5YiwgMHgwZGUyOTE0MywgMHgwZGU4OGM2YiwgMHgwZGVlN2I0NywgMHgwZGY0NWUwOSwgMHgwZGZhMzRlMSwKICAgICAgMHgwZTAwMDAwMCwgMHgwZTA1YmY5NCwgMHgwZTBiNzNjYiwgMHgwZTExMWNkMiwgMHgwZTE2YmFkMywgMHgwZTFjNGRmYiwgMHgwZTIxZDY3MSwgMHgwZTI3NTQ2MCwKICAgICAgMHgwZTJjYzdlZSwgMHgwZTMyMzE0MywgMHgwZTM3OTA4NSwgMHgwZTNjZTVkOCwgMHgwZTQyMzE2MiwgMHgwZTQ3NzM0NiwgMHgwZTRjYWJhOCwgMHgwZTUxZGFhOCwKICAgICAgMHgwZTU3MDA2OSwgMHgwZTVjMWQwYiwgMHgwZTYxMzBhZiwgMHgwZTY2M2I3NCwgMHgwZTZiM2Q3OSwgMHgwZTcwMzZkYiwgMHgwZTc1MjdiOSwgMHgwZTdhMTAzMCwKICAgICAgMHgwZTdlZjA1YiwgMHgwZTgzYzg1NywgMHgwZTg4OTgzZiwgMHgwZThkNjAyZSwgMHgwZTkyMjAzZCwgMHgwZTk2ZDg4OCwgMHgwZTliODkyNiwgMHgwZWEwMzIzMiwKICAgICAgMHgwZWE0ZDNjMiwgMHgwZWE5NmRmMCwgMHgwZWFlMDBkMiwgMHgwZWIyOGM3ZiwgMHgwZWI3MTEwZSwgMHgwZWJiOGU5NiwgMHgwZWMwMDUyYiwgMHgwZWM0NzRlNCwKICAgICAgMHgwZWM4ZGRkNCwgMHgwZWNkNDAxMiwgMHgwZWQxOWJiMCwgMHgwZWQ1ZjBjNCwgMHgwZWRhM2Y2MCwgMHgwZWRlODc5NywgMHgwZWUyYzk3ZCwgMHgwZWU3MDUyNSwKICAgICAgMHgwZWViM2E5ZiwgMHgwZWVmNjlmZiwgMHgwZWYzOTM1NSwgMHgwZWY3YjZiNCwgMHgwZWZiZDQyYiwgMHgwZWZmZWJjZCwgMHgwZjAzZmRhOSwgMHgwZjA4MDljZiwKICAgICAgMHgwZjBjMTA1MCwgMHgwZjEwMTEzYiwgMHgwZjE0MGNhMCwgMHgwZjE4MDI4ZCwgMHgwZjFiZjMxMiwgMHgwZjFmZGUzZCwgMHgwZjIzYzQxZCwgMHgwZjI3YTRjMCwKICAgICAgMHgwZjJiODAzNAogICAgfTsKCgogIExOS19TRUNUSU9OX0lOSVRDT0RFCiAgdm9pZCBJbml0TGRJbnQoKQogIHsKICAgIC8qIG5vdGhpbmcgdG8gZG8hIFVzZSBwcmVpbml0aWFsaXplZCBsb2dhcml0aG0gdGFibGUgKi8KICB9CgoKCkxOS19TRUNUSU9OX0NPREVfTDEKRklYUF9EQkwgQ2FsY0xkSW50KElOVCBpKQp7CiAgLyogY2FsY3VsYXRlcyBsZChvcCkvTERfREFUQV9TQ0FMSU5HICovCiAgLyogb3AgaXMgYXNzdW1lZCB0byBiZSBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gMSBhbmQgMTkzICovCgogIEZES19BU1NFUlQoKDE5Mz4wKSAmJiAoKEZJWFBfREJMKWxkSW50Q29lZmZbMF09PShGSVhQX0RCTCkweDgwMDAwMDAxKSk7IC8qIHRhYiBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KCiAgaWYgKChpPjApJiYoaTwxOTMpKQogICAgcmV0dXJuIGxkSW50Q29lZmZbaV07CiAgZWxzZQogIHsKICAgIHJldHVybiAoMCk7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBpbnZTcXJ0Tm9ybTIKICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS9zcXJ0KG9wKSBub3JtYWxpemVkIHRvIC41Li4uMSBhbmQgdGhlIHNoaWZ0IHZhbHVlIG9mIHRoZSBPVVRQVVQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIFNRUlRfQklUUyAgICAgICAgICAgNwojZGVmaW5lIFNRUlRfVkFMVUVTICAgICAgIDEyOAojZGVmaW5lIFNRUlRfQklUU19NQVNLICAgMHg3ZgoKTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0VGFiW1NRUlRfVkFMVUVTXSA9IHsKICAweDVhODI3OTk5LCAweDVhMjg3ZTAzLCAweDU5Y2Y4Y2JiLCAweDU5NzdhMGFiLCAweDU5MjBiNGRlLCAweDU4Y2FjNDgwLCAweDU4NzVjYWRlLCAweDU4MjFjMzY0LAogIDB4NTdjZWE5OWMsIDB4NTc3Yzc5MmYsIDB4NTcyYjJkZGYsIDB4NTZkYWMzOGQsIDB4NTY4YjM2MzEsIDB4NTYzYzgxZGYsIDB4NTVlZWEyYzMsIDB4NTVhMTk1MjEsCiAgMHg1NTU1NTU1NSwgMHg1NTA5ZGZkMCwgMHg1NGJmMzExYSwgMHg1NDc1NDVkMCwgMHg1NDJjMWFhMywgMHg1M2UzYWM1YSwgMHg1MzliZjdjYywgMHg1MzU0ZjllNiwKICAweDUzMGVhZmE0LCAweDUyYzkxNjE3LCAweDUyODQyYTVlLCAweDUyM2ZlOWFiLCAweDUxZmM1MTNmLCAweDUxYjk1ZTZiLCAweDUxNzcwZThlLCAweDUxMzU1ZjE5LAogIDB4NTBmNDRkODgsIDB4NTBiM2Q3NjgsIDB4NTA3M2ZhNGYsIDB4NTAzNGIzZTYsIDB4NGZmNjAxZGYsIDB4NGZiN2UxZjksIDB4NGY3YTUyMDEsIDB4NGYzZDRmY2UsCiAgMHg0ZjAwZDk0MywgMHg0ZWM0ZWM0ZSwgMHg0ZTg5ODZlOSwgMHg0ZTRlYTcxOCwgMHg0ZTE0NGFlOCwgMHg0ZGRhNzA3MiwgMHg0ZGExMTVkOSwgMHg0ZDY4Mzk0OCwKICAweDRkMmZkOGY0LCAweDRjZjdmMzFiLCAweDRjYzA4NjA0LCAweDRjODk4ZmZmLCAweDRjNTMwZjY0LCAweDRjMWQwMjkzLCAweDRiZTc2N2Y1LCAweDRiYjIzZGY5LAogIDB4NGI3ZDgzMTcsIDB4NGI0OTM1Y2UsIDB4NGIxNTU0YTYsIDB4NGFlMWRlMmEsIDB4NGFhZWQwZjAsIDB4NGE3YzJiOTIsIDB4NGE0OWVjYjMsIDB4NGExODEyZmEsCiAgMHg0OWU2OWQxNiwgMHg0OWI1ODliYiwgMHg0OTg0ZDdhNCwgMHg0OTU0ODU5MSwgMHg0OTI0OTI0OSwgMHg0OGY0ZmM5NiwgMHg0OGM1YzM0YSwgMHg0ODk2ZTUzYywKICAweDQ4Njg2MTQ3LCAweDQ4M2EzNjRjLCAweDQ4MGM2MzMxLCAweDQ3ZGVlNmUwLCAweDQ3YjFjMDQ5LCAweDQ3ODRlZTVmLCAweDQ3NTg3MDFjLCAweDQ3MmM0NDdjLAogIDB4NDcwMDZhODAsIDB4NDZkNGUxMzAsIDB4NDZhOWE3OTMsIDB4NDY3ZWJjYjksIDB4NDY1NDFmYjMsIDB4NDYyOWNmOTgsIDB4NDVmZmNiODAsIDB4NDVkNjEyODksCiAgMHg0NWFjYTNkNSwgMHg0NTgzN2U4OCwgMHg0NTVhYTFjYSwgMHg0NTMyMGNjOCwgMHg0NTA5YmViMCwgMHg0NGUxYjZiNCwgMHg0NGI5ZjQwYiwgMHg0NDkyNzVlYywKICAweDQ0NmIzYjk1LCAweDQ0NDQ0NDQ0LCAweDQ0MWQ4ZjNiLCAweDQzZjcxYmJlLCAweDQzZDBlOTE3LCAweDQzYWFmNjhlLCAweDQzODU0MzczLCAweDQzNWZjZjE0LAogIDB4NDMzYTk4YzUsIDB4NDMxNTlmZGIsIDB4NDJmMGUzYWUsIDB4NDJjYzYzOTcsIDB4NDJhODFlZjUsIDB4NDI4NDE1MjcsIDB4NDI2MDQ1OGQsIDB4NDIzY2FmOGMsCiAgMHg0MjE5NTI4YiwgMHg0MWY2MmRmMSwgMHg0MWQzNDEyYSwgMHg0MWIwOGJhMSwgMHg0MThlMGNjNywgMHg0MTZiYzQwZCwgMHg0MTQ5YjBlNCwgMHg0MTI3ZDJjMywKICAweDQxMDYyOTIwLCAweDQwZTRiMzc0LCAweDQwYzM3MTNhLCAweDQwYTI2MWVmLCAweDQwODE4NTExLCAweDQwNjBkYTIxLCAweDQwNDA2MGExLCAweDQwMjAxODE0Cn07CgpMTktfU0VDVElPTl9JTklUQ09ERQp2b2lkIEluaXRJbnZTcXJ0VGFiKCkKewogIC8qIG5vdGhpbmcgdG8gZG8gIQogICAgIHVzZSBwcmVpbml0aWFsaXplZCBzcXVhcmUgcm9vdCB0YWJsZQogICovCn0KCgoKI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ludlNxcnROb3JtMikKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgZGVsaXZlcnMgMS9zcXJ0KG9wKSBub3JtYWxpemVkIHRvIC41Li4uMSBhbmQgdGhlIHNoaWZ0IHZhbHVlIG9mIHRoZSBPVVRQVVQsCiAgaS5lLiB0aGUgZGVub3JtYWxpemVkIHJlc3VsdCBpcyAxL3NxcnQob3ApID0gaW52U3FydE5vcm0ob3ApICogMl4oc2hpZnQpCiAgdXNlcyBOZXd0b24taXRlcmF0aW9uIGZvciBhcHByb3hpbWF0aW9uCiAgICAgIFEobisxKSA9IFEobikgKyBRKG4pICogKDAuNSAtIDIgKiBWICogUShuKV4yKQogICAgICB3aXRoIFEgPSAwLjUqIFYgXi0wLjU7IDAuNSA8PSBWIDwgMS4wCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpGSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoRklYUF9EQkwgb3AsIElOVCAqc2hpZnQpCnsKCiAgRklYUF9EQkwgdmFsID0gb3AgOwogIEZJWFBfREJMIHJlZzEsIHJlZzIsIHJlZ3RtcCA7CgogIGlmICh2YWwgPT0gRkwyRlhDT05TVF9EQkwoMC4wKSkgewogICAgKnNoaWZ0ID0gMSA7CiAgICByZXR1cm4oKExPTkcpMSk7ICAvKiBtaW5pbXVtIHBvc2l0aXZlIHZhbHVlICovCiAgfQoKCiAgLyogbm9ybWFsaXplIGlucHV0LCBjYWxjdWxhdGUgc2hpZnQgdmFsdWUgKi8KICBGREtfQVNTRVJUKHZhbCA+IEZMMkZYQ09OU1RfREJMKDAuMCkpOwogICpzaGlmdCA9IGZOb3Jteih2YWwpIC0gMTsgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCiAgdmFsIDw8PSpzaGlmdCA7ICAvKiBub3JtYWxpemVkIGlucHV0IFYgKi8KICAqc2hpZnQrPTIgOyAgICAgIC8qIGJpYXMgZm9yIGV4cG9uZW50ICovCgogIC8qIE5ld3RvbiBpdGVyYXRpb24gb2YgMS9zcXJ0KFYpICovCiAgcmVnMSA9IGludlNxcnRUYWJbIChJTlQpKHZhbD4+KERGUkFDVF9CSVRTLTEtKFNRUlRfQklUUysxKSkpICYgU1FSVF9CSVRTX01BU0sgXTsKICByZWcyID0gRkwyRlhDT05TVF9EQkwoMC4wNjI1Zik7ICAgLyogMC41ID4+IDMgKi8KCiAgcmVndG1wPSBmUG93MkRpdjIocmVnMSk7ICAgICAgICAgICAgICAvKiBhID0gUV4yICovCiAgcmVndG1wPSByZWcyIC0gZk11bHREaXYyKHJlZ3RtcCwgdmFsKTsgICAgICAvKiBiID0gMC41IC0gMiAqIFYgKiBRXjIgKi8KICByZWcxICs9IChmTXVsdERpdjIocmVndG1wLCByZWcxKTw8NCk7ICAgICAgIC8qIFEgPSBRICsgUSpiICovCgogIC8qIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGV4cG9uZW50ID0gaW5wdXQgZXhwLzIgKi8KICBpZiAoKnNoaWZ0ICYgMHgwMDAwMDAwMSkgeyAvKiBvZGQgc2hpZnQgdmFsdWVzID8gKi8KICAgIHJlZzIgPSBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OWYpOyAvKiAxL3NxcnQoMik7ICovCiAgICByZWcxID0gZk11bHREaXYyKHJlZzEsIHJlZzIpIDw8IDI7CiAgfQoKICAqc2hpZnQgPSAqc2hpZnQ+PjE7CgogIHJldHVybihyZWcxKTsKfQojZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05faW52U3FydE5vcm0yKSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBzcXJ0Rml4cAogICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyBzcXJ0KG9wKQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKQp7CiAgSU5UIHRtcF9leHAgPSAwOwogIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKTsKCiAgRkRLX0FTU0VSVCh0bXBfZXhwID4gMCkgOwogIHJldHVybiggKEZJWFBfREJMKSAoIGZNdWx0RGl2MiggKG9wPDwodG1wX2V4cC0xKSksIHRtcF9pbnYgKSA8PCAyICkpOwp9CgoKI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjaHVyX2RpdikKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBzY2h1cl9kaXYKICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgb3AxL29wMiB3aXRoIG9wMy1iaXQgYWNjdXJhY3kKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCkZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCnsKICAgIElOVCBMX251bSAgID0gKExPTkcpbnVtPj4xOwogICAgSU5UIExfZGVudW0gPSAoTE9ORylkZW51bT4+MTsKICAgIElOVCBkaXYgICAgID0gMDsKICAgIElOVCBrICAgICAgID0gY291bnQ7CgogICAgRkRLX0FTU0VSVCAobnVtPj0oRklYUF9EQkwpMCk7CiAgICBGREtfQVNTRVJUIChkZW51bT4oRklYUF9EQkwpMCk7CiAgICBGREtfQVNTRVJUIChudW0gPD0gZGVudW0pOwoKICAgIGlmIChMX251bSAhPSAwKQogICAgICAgIHdoaWxlICgtLWspCiAgICAgICAgewogICAgICAgICAgICBkaXYgICA8PD0gMTsKICAgICAgICAgICAgTF9udW0gPDw9IDE7CiAgICAgICAgICAgIGlmIChMX251bSA+PSBMX2RlbnVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMX251bSAtPSBMX2RlbnVtOwogICAgICAgICAgICAgICAgZGl2Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICByZXR1cm4gKEZJWFBfREJMKShkaXYgPDwgKERGUkFDVF9CSVRTIC0gY291bnQpKTsKfQoKCiNlbmRpZiAvKiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpICovCgoKI2lmbmRlZiBGVU5DVElPTl9mTXVsdE5vcm0KRklYUF9EQkwgZk11bHROb3JtKEZJWFBfREJMIGYxLCBGSVhQX0RCTCBmMiwgSU5UICpyZXN1bHRfZSkKewogICAgSU5UICAgIHByb2R1Y3QgPSAwOwogICAgSU5UICAgIG5vcm1fZjEsIG5vcm1fZjI7CgogICAgaWYgKCAgKGYxID09IChGSVhQX0RCTCkwKSB8fCAoZjIgPT0gKEZJWFBfREJMKTApICkgewogICAgICAgICpyZXN1bHRfZSA9IDA7CiAgICAgICAgcmV0dXJuIChGSVhQX0RCTCkwOwogICAgfQogICAgbm9ybV9mMSA9IENvdW50TGVhZGluZ0JpdHMoZjEpOwogICAgZjEgPSBmMSA8PCBub3JtX2YxOwogICAgbm9ybV9mMiA9IENvdW50TGVhZGluZ0JpdHMoZjIpOwogICAgZjIgPSBmMiA8PCBub3JtX2YyOwoKICAgIHByb2R1Y3QgPSBmTXVsdChmMSwgZjIpOwogICAgKnJlc3VsdF9lICA9IC0gKG5vcm1fZjEgKyBub3JtX2YyKTsKCiAgICByZXR1cm4gKEZJWFBfREJMKXByb2R1Y3Q7Cn0KI2VuZGlmCgojaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtCkZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIExfbnVtLCBGSVhQX0RCTCBMX2RlbnVtLCBJTlQgKnJlc3VsdF9lKQp7CiAgICBGSVhQX0RCTCBkaXY7CiAgICBJTlQgbm9ybV9udW0sIG5vcm1fZGVuOwoKICAgIEZES19BU1NFUlQgKExfbnVtICAgPj0gKEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAoTF9kZW51bSA+ICAoRklYUF9EQkwpMCk7CgogICAgaWYoTF9udW0gPT0gKEZJWFBfREJMKTApCiAgICB7CiAgICAgICAgKnJlc3VsdF9lID0gMDsKICAgICAgICByZXR1cm4gKChGSVhQX0RCTCkwKTsKICAgIH0KCiAgICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMoTF9udW0pOwogICAgTF9udW0gPSBMX251bSA8PCBub3JtX251bTsKICAgIExfbnVtID0gTF9udW0gPj4gMTsKICAgICpyZXN1bHRfZSA9IC0gbm9ybV9udW0gKyAxOwoKICAgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhMX2RlbnVtKTsKICAgIExfZGVudW0gPSBMX2RlbnVtIDw8IG5vcm1fZGVuOwogICAgKnJlc3VsdF9lIC09IC0gbm9ybV9kZW47CgogICAgZGl2ID0gc2NodXJfZGl2KExfbnVtLCBMX2RlbnVtLCBGUkFDVF9CSVRTKTsKCiAgICByZXR1cm4gZGl2Owp9CiNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm0gKi8KCiNpZm5kZWYgRlVOQ1RJT05fZkRpdk5vcm0KRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSkKewogICAgSU5UIGU7CiAgICBGSVhQX0RCTCByZXM7CgogICAgRkRLX0FTU0VSVCAoZGVub20gPj0gbnVtKTsKCiAgICByZXMgPSBmRGl2Tm9ybShudW0sIGRlbm9tLCAmZSk7CgogICAgLyogQXZvaWQgb3ZlcmZsb3cgc2luY2Ugd2UgbXVzdCBvdXRwdXQgYSB2YWx1ZSB3aXRoIGV4cG9uZW50IDAKICAgICAgIHRoZXJlIGlzIG5vIG90aGVyIGNob2ljZSB0aGFuIHNhdHVyYXRpbmcgdG8gYWxtb3N0IDEuMGYgKi8KICAgIGlmKHJlcyA9PSAoRklYUF9EQkwpKDE8PChERlJBQ1RfQklUUy0yKSkgJiYgZSA9PSAxKQogICAgewogICAgICAgIHJlcyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJlcyA9IHNjYWxlVmFsdWUocmVzLCBlKTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CiNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm0gKi8KCiNpZm5kZWYgRlVOQ1RJT05fZkRpdk5vcm1IaWdoUHJlYwpGSVhQX0RCTCBmRGl2Tm9ybUhpZ2hQcmVjKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIElOVCAqcmVzdWx0X2UpCnsKICAgIEZJWFBfREJMIGRpdjsKICAgIElOVCBub3JtX251bSwgbm9ybV9kZW47CgogICAgRkRLX0FTU0VSVCAobnVtICAgPj0gKEZJWFBfREJMKTApOwogICAgRkRLX0FTU0VSVCAoZGVub20gPiAgKEZJWFBfREJMKTApOwoKICAgIGlmKG51bSA9PSAoRklYUF9EQkwpMCkKICAgIHsKICAgICAgICAqcmVzdWx0X2UgPSAwOwogICAgICAgIHJldHVybiAoKEZJWFBfREJMKTApOwogICAgfQoKICAgIG5vcm1fbnVtID0gQ291bnRMZWFkaW5nQml0cyhudW0pOwogICAgbnVtID0gbnVtIDw8IG5vcm1fbnVtOwogICAgbnVtID0gbnVtID4+IDE7CiAgICAqcmVzdWx0X2UgPSAtIG5vcm1fbnVtICsgMTsKCiAgICBub3JtX2RlbiA9IENvdW50TGVhZGluZ0JpdHMoZGVub20pOwogICAgZGVub20gPSBkZW5vbSA8PCBub3JtX2RlbjsKICAgICpyZXN1bHRfZSAtPSAgLSBub3JtX2RlbjsKCiAgICBkaXYgPSBzY2h1cl9kaXYobnVtLCBkZW5vbSwgMzEpOwogICAgcmV0dXJuIGRpdjsKfQojZW5kaWYgLyogIUZVTkNUSU9OX2ZEaXZOb3JtSGlnaFByZWMgKi8KCgoKRklYUF9EQkwgQ2FsY0xvZzIoRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBJTlQgKnJlc3VsdF9lKQp7CiAgcmV0dXJuIGZMb2cyKGJhc2VfbSwgYmFzZV9lLCByZXN1bHRfZSk7Cn0KCkZJWFBfREJMIGYyUG93KAogICAgICAgIGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UsCiAgICAgICAgSU5UICpyZXN1bHRfZQogICAgICAgICkKewogIEZJWFBfREJMIGZyYWNfcGFydCwgcmVzdWx0X207CiAgSU5UIGludF9wYXJ0OwoKICBpZiAoZXhwX2UgPiAwKQogIHsKICAgICAgSU5UIGV4cF9iaXRzID0gREZSQUNUX0JJVFMtMSAtIGV4cF9lOwogICAgICBpbnRfcGFydCA9IGV4cF9tID4+IGV4cF9iaXRzOwogICAgICBmcmFjX3BhcnQgPSBleHBfbSAtIChGSVhQX0RCTCkoaW50X3BhcnQgPDwgZXhwX2JpdHMpOwogICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgPDwgZXhwX2U7CiAgfQogIGVsc2UKICB7CiAgICAgIGludF9wYXJ0ID0gMDsKICAgICAgZnJhY19wYXJ0ID0gZXhwX20gPj4gLWV4cF9lOwogIH0KCiAgLyogQmVzdCBhY2N1cmFjeSBpcyBhcm91bmQgMCwgc28gdHJ5IHRvIGdldCB0aGVyZSB3aXRoIHRoZSBmcmFjdGlvbmFsIHBhcnQuICovCiAgaWYoIGZyYWNfcGFydCA+IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKICB7CiAgICAgIGludF9wYXJ0ID0gaW50X3BhcnQgKyAxOwogICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgKyBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgfQogIGlmKCBmcmFjX3BhcnQgPCBGTDJGWENPTlNUX0RCTCgtMC41ZikgKQogIHsKICAgICAgaW50X3BhcnQgPSBpbnRfcGFydCAtIDE7CiAgICAgIGZyYWNfcGFydCA9IC0oRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gZnJhY19wYXJ0KTsKICB9CgogIC8qIEV2YWx1YXRlIHRheWxvciBwb2x5bm9taWFsIHdoaWNoIGFwcHJveGltYXRlcyAyXnggKi8KICB7CiAgICBGSVhQX0RCTCBwOwoKICAgIC8qIHJlc3VsdF9tIH49IDJeZnJhY19wYXJ0ICovCiAgICBwID0gZnJhY19wYXJ0OwogICAgLyogRmlyc3QgdGF5bG9yIHNlcmllcyBjb2VmZmljaWVudCBhXzAgPSAxLjAsIHNjYWxlZCBieSAwLjUgZHVlIHRvIGZNdWx0RGl2MigpLiAqLwogICAgcmVzdWx0X20gPSBGTDJGWENPTlNUX0RCTCgxLjBmLzIuMGYpOwogICAgZm9yIChJTlQgaSA9IDA7IGkgPCBQT1cyX1BSRUNJU0lPTjsgaSsrKSB7CiAgICAgIC8qIG5leHQgdGF5bG9yIHNlcmllcyB0ZXJtOiBhX2kgKiB4XmksIHg9MCAqLwogICAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgcG93MkNvZWZmW2ldLCBwKTsKICAgICAgcCAgPSBmTXVsdChwLCBmcmFjX3BhcnQpOwogICAgfQogIH0KCiAgLyogIisgMSIgY29tcGVuc2F0ZXMgZk11bHRBZGREaXYyKCkgb2YgdGhlIHBvbHlub21pYWwgZXZhbHVhdGlvbiBhYm92ZS4gKi8KICAqcmVzdWx0X2UgPSBpbnRfcGFydCArIDE7CgogIHJldHVybiByZXN1bHRfbTsKfQoKRklYUF9EQkwgZjJQb3coCiAgICAgICAgY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZQogICAgICAgICkKewogIEZJWFBfREJMIHJlc3VsdF9tOwogIElOVCByZXN1bHRfZTsKCiAgcmVzdWx0X20gPSBmMlBvdyhleHBfbSwgZXhwX2UsICZyZXN1bHRfZSk7CiAgcmVzdWx0X2UgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSxmaXhNYXgoLShERlJBQ1RfQklUUy0xKSxyZXN1bHRfZSkpOwoKICByZXR1cm4gc2NhbGVWYWx1ZShyZXN1bHRfbSwgcmVzdWx0X2UpOwp9CgpGSVhQX0RCTCBmUG93KAogICAgICAgIEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwKICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAogICAgICAgIElOVCAqcmVzdWx0X2UKICAgICAgICApCnsKICAgIElOVCBhbnNfbGcyX2UsIGJhc2VsZzJfZTsKICAgIEZJWFBfREJMIGJhc2VfbGcyLCBhbnNfbGcyLCByZXN1bHQ7CgogICAgLyogQ2FsYyBsb2cyIG9mIGJhc2UgKi8KICAgIGJhc2VfbGcyID0gZkxvZzIoYmFzZV9tLCBiYXNlX2UsICZiYXNlbGcyX2UpOwoKICAgIC8qIFByZXBhcmUgZXhwICovCiAgICB7CiAgICAgIElOVCBsZWFkaW5nQml0czsKCiAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGV4cF9tKSk7CiAgICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7CiAgICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOwogICAgfQoKICAgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCiAgICBhbnNfbGcyID0gZk11bHQoYmFzZV9sZzIsIGV4cF9tKTsKICAgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZWxnMl9lOwoKICAgIC8qIENhbGMgYW50aWxvZyAqLwogICAgcmVzdWx0ID0gZjJQb3coYW5zX2xnMiwgYW5zX2xnMl9lLCByZXN1bHRfZSk7CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKRklYUF9EQkwgZkxkUG93KAogICAgICAgIEZJWFBfREJMIGJhc2VMZF9tLAogICAgICAgIElOVCBiYXNlTGRfZSwKICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAogICAgICAgIElOVCAqcmVzdWx0X2UKICAgICAgICApCnsKICAgIElOVCBhbnNfbGcyX2U7CiAgICBGSVhQX0RCTCBhbnNfbGcyLCByZXN1bHQ7CgogICAgLyogUHJlcGFyZSBleHAgKi8KICAgIHsKICAgICAgSU5UIGxlYWRpbmdCaXRzOwoKICAgICAgbGVhZGluZ0JpdHMgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoZXhwX20pKTsKICAgICAgZXhwX20gPSBleHBfbSA8PCBsZWFkaW5nQml0czsKICAgICAgZXhwX2UgLT0gbGVhZGluZ0JpdHM7CiAgICB9CgogICAgLyogQ2FsYyBiYXNlIHBvdyBleHAgKi8KICAgIGFuc19sZzIgPSBmTXVsdChiYXNlTGRfbSwgZXhwX20pOwogICAgYW5zX2xnMl9lID0gZXhwX2UgKyBiYXNlTGRfZTsKCiAgICAvKiBDYWxjIGFudGlsb2cgKi8KICAgIHJlc3VsdCA9IGYyUG93KGFuc19sZzIsIGFuc19sZzJfZSwgcmVzdWx0X2UpOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCkZJWFBfREJMIGZMZFBvdygKICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLAogICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UKICAgICAgICApCnsKICBGSVhQX0RCTCByZXN1bHRfbTsKICBpbnQgcmVzdWx0X2U7CgogIHJlc3VsdF9tID0gZkxkUG93KGJhc2VMZF9tLCBiYXNlTGRfZSwgZXhwX20sIGV4cF9lLCAmcmVzdWx0X2UpOwoKICByZXR1cm4gU0FUVVJBVEVfU0hJRlQocmVzdWx0X20sIC1yZXN1bHRfZSwgREZSQUNUX0JJVFMpOwp9CgpGSVhQX0RCTCBmUG93SW50KAogICAgICAgIEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwKICAgICAgICBJTlQgZXhwLAogICAgICAgIElOVCAqcFJlc3VsdF9lCiAgICAgICAgKQp7CiAgRklYUF9EQkwgcmVzdWx0OwoKICBpZiAoZXhwICE9IDApIHsKICAgIElOVCByZXN1bHRfZSA9IDA7CgogICAgaWYgKGJhc2VfbSAhPSAoRklYUF9EQkwpMCkgewogICAgICB7CiAgICAgICAgSU5UIGxlYWRpbmdCaXRzOwogICAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyggYmFzZV9tICk7CiAgICAgICAgYmFzZV9tIDw8PSBsZWFkaW5nQml0czsKICAgICAgICBiYXNlX2UgLT0gbGVhZGluZ0JpdHM7CiAgICAgIH0KCiAgICAgIHJlc3VsdCA9IGJhc2VfbTsKCiAgICAgIHsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZkFicyhleHApOyBpKyspIHsKICAgICAgICAgIHJlc3VsdCA9IGZNdWx0KHJlc3VsdCwgYmFzZV9tKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChleHAgPCAwKSB7CiAgICAgICAgLyogMS4wIC8gYW5zICovCiAgICAgICAgcmVzdWx0ID0gZkRpdk5vcm0oIEZMMkZYQ09OU1RfREJMKDAuNWYpLCByZXN1bHQsICZyZXN1bHRfZSApOwogICAgICAgIHJlc3VsdF9lKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50IGFuc1NjYWxlID0gQ291bnRMZWFkaW5nQml0cyggcmVzdWx0ICk7CiAgICAgICAgcmVzdWx0IDw8PSBhbnNTY2FsZTsKICAgICAgICByZXN1bHRfZSAtPSBhbnNTY2FsZTsKICAgICAgfQoKICAgICAgcmVzdWx0X2UgKz0gZXhwICogYmFzZV9lOwoKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IChGSVhQX0RCTCkwOwogICAgfQogICAgKnBSZXN1bHRfZSA9IHJlc3VsdF9lOwogIH0KICBlbHNlIHsKICAgIHJlc3VsdCA9ICBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgICpwUmVzdWx0X2UgPSAxOwogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lLCBJTlQgKnJlc3VsdF9lKQp7CiAgRklYUF9EQkwgcmVzdWx0X207CgogIC8qIFNob3J0IGN1dCBmb3IgemVybyBhbmQgbmVnYXRpdmUgbnVtYmVycy4gKi8KICBpZiAoIHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKICAgICpyZXN1bHRfZSA9IERGUkFDVF9CSVRTLTE7CiAgICByZXR1cm4gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogIH0KCiAgLyogQ2FsY3VsYXRlIGxvZzIoKSAqLwogIHsKICAgIEZJWFBfREJMIHB4Ml9tLCB4Ml9tOwoKICAgIC8qIE1vdmUgaW5wdXQgdmFsdWUgeF9tICogMl54X2UgdG93YXJkIDEuMCwgd2hlcmUgdGhlIHRheWxvciBhcHByb3hpbWF0aW9uCiAgICAgICBvZiB0aGUgZnVuY3Rpb24gbG9nKDEteCkgY2VudGVyZWQgYXQgMCBpcyBtb3N0IGFjY3VyYXRlLiAqLwogICAgewogICAgICBJTlQgYl9ub3JtOwoKICAgICAgYl9ub3JtID0gZk5vcm16KHhfbSktMTsKICAgICAgeDJfbSA9IHhfbSA8PCBiX25vcm07CiAgICAgIHhfZSA9IHhfZSAtIGJfbm9ybTsKICAgIH0KCiAgICAvKiBtYXAgeCBmcm9tIGxvZyh4KSBkb21haW4gdG8gbG9nKDEteCkgZG9tYWluLiAqLwogICAgeDJfbSA9IC0gKHgyX20gKyBGTDJGWENPTlNUX0RCTCgtMS4wKSApOwoKICAgIC8qIFRheWxvciBwb2xpbm9taWFsIGFwcHJveGltYXRpb24gb2YgbG4oMS14KSAqLwogICAgcmVzdWx0X20gID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKICAgIHB4Ml9tID0geDJfbTsKICAgIGZvciAoaW50IGk9MDsgaTxMRF9QUkVDSVNJT047IGkrKykgewogICAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgbGRDb2VmZltpXSwgcHgyX20pOwogICAgICBweDJfbSA9IGZNdWx0KHB4Ml9tLCB4Ml9tKTsKICAgIH0KICAgIC8qIE11bHRpcGx5IHJlc3VsdCB3aXRoIDEvbG4oMikgPSAxLjAgKyAwLjQ0MjY5NTA0MDg4OCAoZ2V0IGxvZzIoeCkgZnJvbSBsbih4KSByZXN1bHQpLiAqLwogICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIHJlc3VsdF9tLCBGTDJGWENPTlNUX0RCTCgyLjAqMC40NDI2OTUwNDA4ODg5NjM0MDczNTk5MjQ2ODEwMDE5KSk7CgogICAgLyogQWRkIGV4cG9uZW50IHBhcnQuIGxvZzIoeF9tICogMl54X2UpID0gbG9nMih4X20pICsgeF9lICovCiAgICBpZiAoeF9lICE9IDApCiAgICB7CiAgICAgIGludCBlbm9ybTsKCiAgICAgIGVub3JtID0gREZSQUNUX0JJVFMgLSBmTm9ybSgoRklYUF9EQkwpeF9lKTsKICAgICAgLyogVGhlIC0xIGluIHRoZSByaWdodCBzaGlmdCBvZiByZXN1bHRfbSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUgaW4gdGhlIHRheWxvciBwb2xpbm9taWFsIGV2YWx1YXRpb24gbG9vcC4qLwogICAgICByZXN1bHRfbSA9IChyZXN1bHRfbSA+PiAoZW5vcm0tMSkpICsgKChGSVhQX0RCTCl4X2UgPDwgKERGUkFDVF9CSVRTLTEtZW5vcm0pKTsKCiAgICAgICpyZXN1bHRfZSA9IGVub3JtOwogICAgfSBlbHNlIHsKICAgICAgLyogMSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUgaW4gdGhlIHRheWxvciBwb2xpbm9taWFsIGV2YWx1YXRpb24gbG9vcC4qLwogICAgICAqcmVzdWx0X2UgPSAxOwogICAgfQogIH0KCiAgcmV0dXJuIHJlc3VsdF9tOwp9CgpGSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UpCnsKICBpZiAoIHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKICAgIHhfbSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICB9CiAgZWxzZSB7CiAgICBJTlQgcmVzdWx0X2U7CiAgICB4X20gPSBmTG9nMih4X20sIHhfZSwgJnJlc3VsdF9lKTsKICAgIHhfbSA9IHNjYWxlVmFsdWUoeF9tLCByZXN1bHRfZS1MRF9EQVRBX1NISUZUKTsKICB9CiAgcmV0dXJuICB4X207Cn0KCgoKCg==