Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgU2JyIGRlY29kZXIgIAoqLwojaWZuZGVmIF9fUFNERUNfSAojZGVmaW5lIF9fUFNERUNfSAoKI2luY2x1ZGUgInNicmRlY29kZXIuaCIKCgoKLyogVGhpcyBQUyBkZWNvZGVyIGltcGxlbWVudHMgdGhlIGJhc2VsaW5lIHZlcnNpb24uIFNvIGl0IGFsd2F5cyB1c2VzIHRoZSAgICAgKi8KLyogaHlicmlkIGZpbHRlciBzdHJ1Y3R1cmUgZm9yIDIwIHN0ZXJlbyBiYW5kcyBhbmQgZG9lcyBub3QgaW1wbGVtZXQgSVBEL09QRCAgKi8KLyogc3ludGhlc2lzLiBUaGUgYmFzZWxpbmUgdmVyc2lvbiBoYXMgdG8gc3VwcG9ydCB0aGUgY29tcGxldGUgUFMgYml0c3RyZWFtICAgKi8KLyogc3ludGF4LiBCdXQgSVBEL09QRCBkYXRhIGlzIGlnbm9yZWQgYW5kIHNldCB0byAwLiBJZiAzNCBzdGVyZW8gYmFuZCBjb25maWcgKi8KLyogaXMgdXNlZCBpbiB0aGUgYml0c3RyZWFtIGZvciBJSVMvSUNDIHRoZSBkZWNvZGVkIHBhcmFtZXRlcnMgYXJlIG1hcHBlZCB0byAgKi8KLyogMjAgc3RlcmVvIGJhbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgojaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgoKI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgoKI2RlZmluZSBTQ0FMX0hFQURST09NICAgICAgICAgICAgICAgICAgICAgKCAyICkKCiNkZWZpbmUgUFNfRVhURU5TSU9OX1NJWkVfQklUUyAgICAgICAgICAgICggNCApCiNkZWZpbmUgUFNfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTICAgICAgICggOCApCgojZGVmaW5lIE5PX1FNRl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAoIDY0ICkKI2RlZmluZSBNQVhfTlVNX0NPTCAgICAgICAgICAgICAgICAgICAgICAgKCAzMiApCgoKICAjZGVmaW5lIE5PX1FNRl9CQU5EU19IWUJSSUQyMCAgICAgICAgICAgKCAzICApCiAgI2RlZmluZSBOT19TVUJfUU1GX0NIQU5ORUxTICAgICAgICAgICAgICggMTIgKQoKICAjZGVmaW5lIE5SR19JTlRfQ09FRkYgICAgICAgICAgICAgICAgICAgKCAwLjc1ZiApCiAgI2RlZmluZSBJTlRfRklMVEVSX0NPRUZGICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCggMS4wZiAtIE5SR19JTlRfQ09FRkYgKSkKICAjZGVmaW5lIFBFQUtfREVDQVlfRkFDVE9SICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAwLjc2NTkyODMzODM2NDY0OWYgKSkKICAjZGVmaW5lIFRSQU5TSUVOVF9JTVBBQ1RfRkFDVE9SICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAyLjAgLyAzLjAgKSkKCiAgI2RlZmluZSBOT19TRVJJQUxfQUxMUEFTU19MSU5LUyAgICAgICAgICggMyApCiAgI2RlZmluZSBNQVhfTk9fUFNfRU5WICAgICAgICAgICAgICAgICAgICggNCArIDEgKSAgIC8qICsxIG5lZWRlZCBmb3IgVkFSX0JPUkRFUiAqLwoKICAjZGVmaW5lIE1BWF9ERUxBWV9CVUZGRVJfU0laRSAgICAgICAgICAgKCAxNCApCiAgI2RlZmluZSBOT19ERUxBWV9CVUZGRVJfQkFORFMgICAgICAgICAgICggMzUgKQoKICAjZGVmaW5lIE5PX0hJX1JFU19CSU5TICAgICAgICAgICAgICAgICAgKCAzNCApCiAgI2RlZmluZSBOT19NSURfUkVTX0JJTlMgICAgICAgICAgICAgICAgICggMjAgKQogICNkZWZpbmUgTk9fTE9XX1JFU19CSU5TICAgICAgICAgICAgICAgICAoIDEwICkKCiAgI2RlZmluZSBGSVJTVF9ERUxBWV9TQiAgICAgICAgICAgICAgICAgICggMjMgKQogICNkZWZpbmUgTk9fU0FNUExFX0RFTEFZX0FMTFBBU1MgICAgICAgICAoIDIgKQogICNkZWZpbmUgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMgICAgICAgICAoIDEyICkgICAgIC8qIGQobSk6IGQoMCk9MyArIGQoMSk9NCArIGQoMik9NSAqLwoKICAjZGVmaW5lIE5PX0hJX1JFU19JSURfQklOUyAgICAgICAgICAgICAgKCBOT19ISV9SRVNfQklOUyApCiAgI2RlZmluZSBOT19ISV9SRVNfSUNDX0JJTlMgICAgICAgICAgICAgICggTk9fSElfUkVTX0JJTlMgKQoKICAjZGVmaW5lIE5PX01JRF9SRVNfSUlEX0JJTlMgICAgICAgICAgICAgKCBOT19NSURfUkVTX0JJTlMgKQogICNkZWZpbmUgTk9fTUlEX1JFU19JQ0NfQklOUyAgICAgICAgICAgICAoIE5PX01JRF9SRVNfQklOUyApCgogICNkZWZpbmUgTk9fTE9XX1JFU19JSURfQklOUyAgICAgICAgICAgICAoIE5PX0xPV19SRVNfQklOUyApCiAgI2RlZmluZSBOT19MT1dfUkVTX0lDQ19CSU5TICAgICAgICAgICAgICggTk9fTE9XX1JFU19CSU5TICkKCiAgI2RlZmluZSBTVUJRTUZfR1JPVVBTICAgICAgICAgICAgICAgICAgICggMTAgKQogICNkZWZpbmUgUU1GX0dST1VQUyAgICAgICAgICAgICAgICAgICAgICAoIDEyICkKCiAgI2RlZmluZSBTVUJRTUZfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICggMzIgKQogICNkZWZpbmUgUU1GX0dST1VQU19ISV9SRVMgICAgICAgICAgICAgICAoIDE4ICkKCiAgI2RlZmluZSBOT19JSURfR1JPVVBTICAgICAgICAgICAgICAgICAgICggU1VCUU1GX0dST1VQUyArIFFNRl9HUk9VUFMgKQogICNkZWZpbmUgTk9fSUlEX0dST1VQU19ISV9SRVMgICAgICAgICAgICAoIFNVQlFNRl9HUk9VUFNfSElfUkVTICsgUU1GX0dST1VQU19ISV9SRVMgKQoKICAjZGVmaW5lIE5PX0lJRF9TVEVQUyAgICAgICAgICAgICAgICAgICAgKCA3ICkgIC8qIDEgLi4gKyA3ICovCiAgI2RlZmluZSBOT19JSURfU1RFUFNfRklORSAgICAgICAgICAgICAgICggMTUgKSAvKiAxIC4uICsxNSAqLwogICNkZWZpbmUgTk9fSUNDX1NURVBTICAgICAgICAgICAgICAgICAgICAoIDggKSAgLyogMCAuLiArIDcgKi8KCiAgI2RlZmluZSBOT19JSURfTEVWRUxTICAgICAgICAgICAgICAgICAgICggMiAqIE5PX0lJRF9TVEVQUyArIDEgKSAgICAgIC8qIC0gNyAuLiAgKyA3ICovCiAgI2RlZmluZSBOT19JSURfTEVWRUxTX0ZJTkUgICAgICAgICAgICAgICggMiAqIE5PX0lJRF9TVEVQU19GSU5FICsgMSApIC8qIC0xNSAuLiAgKzE1ICovCiAgI2RlZmluZSBOT19JQ0NfTEVWRUxTICAgICAgICAgICAgICAgICAgICggTk9fSUNDX1NURVBTICkgICAgICAgICAgICAgIC8qICAgMCAuLiAgKyA3ICovCgogICNkZWZpbmUgRklYUF9TUVJUMDUgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTB4NWE4Mjc5ODApIC8qIDEvU1FSVDIgKi8KCiAgc3RydWN0IFBTX0RFQ19DT0VGRklDSUVOVFMgewoKICAgIEZJWFBfREJMIEgxMXJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBGSVhQX0RCTCBIMTJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgRklYUF9EQkwgSDIxcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIEZJWFBfREJMIEgyMnJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgRklYUF9EQkwgRGVsdGFIMTFyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIEZJWFBfREJMIERlbHRhSDEycltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBGSVhQX0RCTCBEZWx0YUgyMXJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgRklYUF9EQkwgRGVsdGFIMjJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICBTQ0hBUiBhYUlpZEluZGV4TWFwcGVkW01BWF9OT19QU19FTlZdW05PX0hJX1JFU19JSURfQklOU107ICAgICAgIC8qITwgVGhlIG1hcHBlZCBJSUQgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kIGFsbCBJSUQgYmlucyAqLwogICAgU0NIQVIgYWFJY2NJbmRleE1hcHBlZFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAvKiE8IFRoZSBtYXBwZWQgSUNDIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUNDIGJpbnMgKi8KCiAgfTsKCgoKCnR5cGVkZWYgZW51bSB7CiAgcHB0X25vbmUgPSAwLAogIHBwdF9tcGVnID0gMSwKICBwcHRfZHJtICA9IDIKfSBQU19QQVlMT0FEX1RZUEU7CgoKdHlwZWRlZiBzdHJ1Y3QgewogIFVDSEFSIGJQc0hlYWRlclZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBzZXQgaWYgbmV3IGhlYWRlciBpcyBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICovCgogIFVDSEFSIGJFbmFibGVJaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPbmUgYml0IGRlbm90aW5nIHRoZSBwcmVzZW5jZSBvZiBJSUQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICovCiAgVUNIQVIgYkVuYWJsZUljYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9uZSBiaXQgZGVub3RpbmcgdGhlIHByZXNlbmNlIG9mIElDQyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KICBVQ0hBUiBiRW5hYmxlRXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFBTIGV4dGVuc2lvbiBsYXllciBpcyBlbmFibGVkIHVzaW5nIHRoZSBlbmFibGVfZXh0IGJpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgaXQgaXMgc2V0IHRvICUxIHRoZSBJUEQgYW5kIE9QRCBwYXJhbWV0ZXJzIGFyZSBzZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCBpcyBkaXNhYmxlZCwgaS5lLiAlMCwgdGhlIGV4dGVuc2lvbiBsYXllciBpcyBza2lwcGVkLiAgICovCgogIFVDSEFSIG1vZGVJaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY29uZmlndXJhdGlvbiBvZiBJSUQgcGFyYW1ldGVycyAobnVtYmVyIG9mIGJhbmRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGlzYXRpb24gZ3JpZCwgaWlkX3F1YW50KSBpcyBkZXRlcm1pbmVkIGJ5IGlpZF9tb2RlLiAgICAgICovCiAgVUNIQVIgbW9kZUljYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIEludGVyLWNoYW5uZWwgQ29oZXJlbmNlIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBiYW5kcyBhbmQgcXVhbnRpc2F0aW9uIGdyaWQpIGlzIGRldGVybWluZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX21vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBVQ0hBUiBmcmVxUmVzSWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMD1sb3csIDE9bWlkIG9yIDI9aGlnaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgaWlkICAgICAgICAgICAqLwogIFVDSEFSIGZyZXFSZXNJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpY2MgICAgICAgICAgICovCgogIFVDSEFSIGJGaW5lSWlkUTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVc2UgZmluZSBJaWQgcXVhbnRpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogIFVDSEFSIGJGcmFtZUNsYXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgZnJhbWVfY2xhc3MgYml0IGRldGVybWluZXMgd2hldGhlciB0aGUgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucyBvZiB0aGUgY3VycmVudCBmcmFtZSBhcmUgdW5pZm9ybWx5IHNwYWNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nyb3NzIHRoZSBmcmFtZSBvciB0aGV5IGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGJ5IGJvcmRlcl9wb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBVQ0hBUiBub0VudjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVDSEFSIGFFbnZTdGFydFN0b3BbTUFYX05PX1BTX0VOVisxXTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbiBjYXNlIG9mIHZhcmlhYmxlIHBhcmFtZXRlciBzcGFjaW5nIHRoZSBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IGJvcmRlcl9wb3NpdGlvbiAgICAgICAgICAgICAgICAgICAqLwoKICBTQ0hBUiBhYklpZER0RmxhZ1tNQVhfTk9fUFNfRU5WXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsdGFjb2RpbmcgdGltZS9mcmVxIGZsYWcgZm9yIElJRCwgMCA9PiBmcmVxICAgICAgICAgICAqLwogIFNDSEFSIGFiSWNjRHRGbGFnW01BWF9OT19QU19FTlZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWx0YWNvZGluZyB0aW1lL2ZyZXEgZmxhZyBmb3IgSUNDLCAwID0+IGZyZXEgICAgICAgICAgICovCgogIFNDSEFSIGFhSWlkSW5kZXhbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lJRF9CSU5TXTsgICAgICAgICAgICAgLyohPCBUaGUgSUlEIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUlEIGJpbnMgICAgICAgICovCiAgU0NIQVIgYWFJY2NJbmRleFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAgICAgICAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kIGFsbCBJQ0MgYmlucyAgICAgICAgKi8KCn0gTVBFR19QU19CU19EQVRBOwoKCgpzdHJ1Y3QgUFNfREVDIHsKCiAgU0NIQVIgbm9TdWJTYW1wbGVzOwogIFNDSEFSIG5vQ2hhbm5lbHM7CgogIFNDSEFSIHByb2NGcmFtZUJhc2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIZWxwZXIgdG8gZGV0ZWN0ZWQgc3dpdGNoaW5nIGZyb20gZnJhbWUgYmFzZWQgdG8gc2xvdCBiYXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogIFBTX1BBWUxPQURfVFlQRSBiUHNEYXRhQXZhaWxbKDEpKzFdOyAgIC8qITwgc2V0IGlmIG5ldyBkYXRhIGF2YWlsYWJsZSBmcm9tIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAqLwogIFVDSEFSIHBzRGVjb2RlZFBydjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBzZXQgaWYgUFMgaGFzIGJlZW4gcHJvY2Vzc2VkIGluIHRoZSBsYXN0IGZyYW1lICAgICAgICAgICAgICAgICovCgogIC8qIGhlbHBlcnMgZm9yIGZyYW1lIGRlbGF5IGxpbmUgKi8KICBVQ0hBUiBic0xhc3RTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggb2YgbGFzdCByZWFkIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVDSEFSIGJzUmVhZFNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHJlYWQgc2xvdCBmb3IgYWRkaXRpb25hbCBkZWxheS4gICAgICAgICAgICAgICovCiAgVUNIQVIgcHJvY2Vzc1Nsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEluZGV4IG9mIGN1cnJlbnQgc2xvdCBmb3IgcHJvY2Vzc2luZyAobmVlZCBmb3IgYWRkLiBkZWxheSkuICAgKi8KCgogIElOVCAgcmVzY2FsOwogIElOVCAgc2ZfSW50QnVmZmVyOwoKICB1bmlvbiB7ICAvKiBCaXRzdHJlYW0gZGF0YSAqLwogICAgTVBFR19QU19CU19EQVRBICBtcGVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdHJ1Y3QgY29udGFpbmluZyBhbGwgTVBFRyBzcGVjaWZpYyBQUyBkYXRhIGZyb20gYml0c3RyZWFtLiAgICovCiAgfSBic0RhdGFbKDEpKzFdOwoKICBzaG91bGRCZVVuaW9uIHsgIC8qIFN0YXRpYyBkYXRhICovCiAgICBzdHJ1Y3QgewogICAgICBTQ0hBUiBhSWlkUHJldkZyYW1lSW5kZXhbTk9fSElfUkVTX0lJRF9CSU5TXTsgICAgICAgICAgLyohPCBUaGUgSUlEIGluZGV4IGZvciBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIFNDSEFSIGFJY2NQcmV2RnJhbWVJbmRleFtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAgICAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgIFVDSEFSIGRlbGF5QnVmSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gd2hlcmUgdGhlIGxhdGVzdCBzYW1wbGUgaXMgaW4gYnVmZmVyICAgICAgICAgKi8KICAgICAgVUNIQVIgbm9TYW1wbGVEZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSG93IG1hbnkgUU1GIHNhbXBsZXMgZGVsYXkgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAqLwogICAgICBVQ0hBUiBsYXN0VXNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlcm1vc3QgV01GIGRlbGF5IGJhbmQgb2YgbGFzdCBmcmFtZSAgICAgICAgICAgICAgICAgICovCgogICAgICBVQ0hBUiBhRGVsYXlSQnVmSW5kZXhTZXJbTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOyAgICAgICAgICAgICAvKiE8IERlbGF5IGJ1ZmZlciBmb3IgcmV2ZXJiIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIFVDSEFSIGFEZWxheUJ1ZkluZGV4RGVsYXlRbWZbTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCXTsgIC8qITwgRGVsYXkgYnVmZmVyIGZvciBJQ0MgZ3JvdXAgMjAgJiAyMSAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgIFNDSEFSIHNjYWxlRmFjdG9yUHNEZWxheUJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2NhbGUgZmFjdG9yIGZvciBwcyBkZWxheSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgIC8qIGh5YnJpZCBmaWx0ZXIgYmFuayBkZWxheSBsaW5lcyAqLwogICAgICBGSVhQX0RCTCBhYVFtZkRlbGF5QnVmUmVhbFsoTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSArIChNQVhfREVMQVlfQlVGRkVSX1NJWkUtMSkqKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQildOwogICAgICBGSVhQX0RCTCBhYVFtZkRlbGF5QnVmSW1hZ1soTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSArIChNQVhfREVMQVlfQlVGRkVSX1NJWkUtMSkqKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQildOwoKICAgICAgRklYUF9EQkwgKnBBYVJlYWxEZWxheUJ1ZmZlclFtZltNQVhfREVMQVlfQlVGRkVSX1NJWkVdOyAgICAgICAgICAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgRklYUF9EQkwgKnBBYUltYWdEZWxheUJ1ZmZlclFtZltNQVhfREVMQVlfQlVGRkVSX1NJWkVdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgIEZJWFBfREJMIGFhUmVhbERlbGF5QnVmZmVyUW1mW05PX1NBTVBMRV9ERUxBWV9BTExQQVNTXVtGSVJTVF9ERUxBWV9TQl07IC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgKi8KICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW0ZJUlNUX0RFTEFZX1NCXTsgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIqLwoKICAgICAgRklYUF9EQkwgYWFSZWFsRGVsYXlCdWZmZXJTdWJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW05PX1NVQl9RTUZfQ0hBTk5FTFNdOyAgICAgICAgICAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICAgICAgKi8KICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW05PX1NVQl9RTUZfQ0hBTk5FTFNdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgKi8KCiAgICAgIEZJWFBfREJMIGFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbRklSU1RfREVMQVlfU0JdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgICAgICAgICAgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICovCiAgICAgIEZJWFBfREJMIGFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbRklSU1RfREVMQVlfU0JdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgICAgICAgICAgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIgICAgICovCgogICAgICBGSVhQX0RCTCBhYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAqLwogICAgICBGSVhQX0RCTCBhYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLwoKICAgICAgSFlCUklEIGh5YnJpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgaHlicmlkIGZpbHRlciBiYW5rIHN0cnVjdCAxIG9yIDIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgRklYUF9EQkwgYVByZXZOcmdCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgICAgICAgIC8qITwgZW5lcmd5IG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgRklYUF9EQkwgYVByZXZQZWFrRGlmZkJpbltOT19NSURfUkVTX0JJTlNdOyAgICAgICAgIC8qITwgcGVhayBkaWZmZXJlbmNlIG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgRklYUF9EQkwgYVBlYWtEZWNheUZhc3RCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgIC8qITwgU2F2ZWQgbWF4LiBwZWFrIGRlY2F5IHZhbHVlIHBlciBiaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgU0NIQVIgYVBvd2VyUHJldlNjYWxbTk9fTUlEX1JFU19CSU5TXTsgICAgICAgICAgICAgIC8qITwgTGFzdCBwb3dlciB2YWx1ZSAoZWFjaCBiaW4pIG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgIEZJWFBfREJMIGgxMXJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIEZJWFBfREJMIGgxMnJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIEZJWFBfREJMIGgyMXJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIEZJWFBfREJMIGgyMnJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICBQU19ERUNfQ09FRkZJQ0lFTlRTICBjb2VmOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHRlbXBvcmFsIGNvZWZmaWNpZW50cyAocmV1c2FibGUgc2NyYXRjaCBtZW1vcnkpICAgICAgICAgICAgICAgICAqLwoKICAgIH0gbXBlZzsKCiAgfSBzcGVjaWZpY1RvOwoKCn07Cgp0eXBlZGVmIHN0cnVjdCBQU19ERUMgKkhBTkRMRV9QU19ERUM7CgoKaW50IENyZWF0ZVBzRGVjKEhBTkRMRV9QU19ERUMgKmhfUFNfREVDLCBpbnQgYWFjU2FtcGxlc1BlckZyYW1lKTsKCmludCBEZWxldGVQc0RlYyhIQU5ETEVfUFNfREVDICpoX1BTX0RFQyk7Cgp2b2lkCnNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKmZpeHBRbWZSZWFsLCAgICAgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mSW1hZywgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNiciBzdGFydCBzdWJiYW5kICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93LAogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCwKICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfbGIsCiAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqc2NhbGVGYWN0b3JMb3dCYW5kX2hiLAogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKnNjYWxlRmFjdG9ySGlnaEJhbmQsCiAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbm9Db2xzKTsKCnZvaWQKcmVzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqUW1mQnVmZmVySW1hZywgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2JyIHN0YXJ0IHN1YmJhbmQgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpOwoKCnZvaWQKaW5pdFNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW52LAogICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IpOwoKdm9pZApBcHBseVBzU2xvdCggSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgKi8KICAgICAgICAgICAgIEZJWFBfREJMICoqckludEJ1ZmZlckxlZnQsICAgICAgIC8qIHJlYWwgdmFsdWVzIG9mIGxlZnQgcW1mIHRpbWVzbG90ICAgICovCiAgICAgICAgICAgICBGSVhQX0RCTCAqKmlJbnRCdWZmZXJMZWZ0LCAgICAgICAvKiBpbWFnIHZhbHVlcyBvZiBsZWZ0IHFtZiB0aW1lc2xvdCAgICAqLwogICAgICAgICAgICAgRklYUF9EQkwgKnJJbnRCdWZmZXJSaWdodCwgICAgICAgLyogcmVhbCB2YWx1ZXMgb2YgcmlnaHQgcW1mIHRpbWVzbG90ICAgKi8KICAgICAgICAgICAgIEZJWFBfREJMICppSW50QnVmZmVyUmlnaHQpOyAgICAgIC8qIGltYWcgdmFsdWVzIG9mIHJpZ2h0IHFtZiB0aW1lc2xvdCAgICovCgoKCiNlbmRpZiAgLyogX19QU0RFQ19IICovCg==