Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKToKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBcZmlsZSAgIGdlbmVyaWNTdGRzLmgKICAgIFxicmllZiAgR2VuZXJpYyBSdW4tVGltZSBTdXBwb3J0IGZ1bmN0aW9uIHdyYXBwZXJzIGFuZCBoZWFwIGFsbG9jYXRpb24gbW9uaXRvcmluZy4KICovCgojaWYgIWRlZmluZWQoX19HRU5FUklDU1REU19IX18pCiNkZWZpbmUgX19HRU5FUklDU1REU19IX18KCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKCgoKLyogQWx3YXlzIGluY3JlYXNlIHZlcmJvc2l0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBpbiBjYXNlIG9mIGEgZGVidWcgYnVpbHQuIERFQlVHIGlzIGRlZmluZWQgZ2xvYmFsbHkgaW4gdGhhdCBjYXNlLiAqLwojaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChGREtfREVCVUcpCi8vI2RlZmluZSBNRU1PUllfTUVBU1VSRU1FTlQKI2VuZGlmCgojaWZuZGVmIE1fUEkKICAjZGVmaW5lIE1fUEkgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2ICAvKiEgUGkuIE9ubHkgdXNlZCBpbiBleGFtcGxlIHByb2plY3RzLiAqLwojZW5kaWYKCgovKiAjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAqLwoKCi8qKgogKiBJZGVudGlmaWVycyBmb3IgdmFyaW91cyBtZW1vcnkgbG9jYXRpb25zLiBUaGV5IGFyZSB1c2VkIGFsb25nIHdpdGggbWVtb3J5IGFsbG9jYXRpb24KICogZnVuY3Rpb25zIGxpa2UgRkRLY2FsbG9jX0woKSB0byBzcGVjaWZ5IHRoZSByZXF1ZXN0ZWQgbWVtb3J5J3MgbG9jYXRpb24uCiAqLwp0eXBlZGVmIGVudW0gewogIC8qIEludGVybmFsICovCiAgU0VDVF9EQVRBX0wxID0gMHgyMDAwLAogIFNFQ1RfREFUQV9MMiwKICBTRUNUX0RBVEFfTDFfQSwKICBTRUNUX0RBVEFfTDFfQiwKICBTRUNUX0NPTlNUREFUQV9MMSwKCiAgLyogRXh0ZXJuYWwgKi8KICBTRUNUX0RBVEFfRVhURVJOID0gMHg0MDAwLAogIFNFQ1RfQ09OU1REQVRBX0VYVEVSTgoKfSBNRU1PUllfU0VDVElPTjsKCgovKioKICogVGhlIEhfIHByZWZpeCBpbmRpY2F0ZXMgaGVhZGVyIGZpbGUgdmVyc2lvbiwgdGhlIENfKiBwcmVmaXggaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nCiAqIG9iamVjdCB2ZXJzaW9uLgogKgogKiBEZWNsYXJpbmcgbWVtb3J5IGFyZWFzIHJlcXVpcmVzIHRvIHNwZWNpZnkgYSB1bmlxdWUgbmFtZSBhbmQgYSBkYXRhIHR5cGUuIFVzZSB0aGUgSF8gbWFjcm8KICogZm9yIHRoaXMgcHVycG9zZSBpbnNpZGUgYSBoZWFkZXIgZmlsZS4KICoKICogRm9yIGRlZmluaW5nIGEgbWVtb3J5IGFyZWEgeW91ciByZXF1aXJlIGFkZGl0aW9uYWxseSBvbmUgb3IgdHdvIHNpemVzLCBkZXBlbmRpbmcgaWYgdGhlCiAqIG1lbW9yeSBzaG91bGQgYmUgb3JnYW5pemVkIGludG8gb25lIG9yIHR3byBkaW1lbnNpb25zLgogKgogKiBUaGUgbWFjcm9zIGNvbnRhaW5pbmcgdGhlIGtleXdvcmQgQUFMTE9DIGluc3RlYWQgb2YgQUxMT0MgYWxzbyBkbyB0YWtlIGNhcmUgb2YgcmV0dXJuaW5nCiAqIGFsaWduZWQgbWVtb3J5IGFkZHJlc3NlcyAoYmV5b25kIHRoZSBuYXR1cmFsIGFsaWdubWVudCBvZiBpdHMgdHlwZSkuIFRoZSBwcmVwcm9jZXNvciBtYWNybwogKiA6OkFMSUdOTUVOVF9ERUZBVUxUIGluZGljYXRlcyB0aGUgYWxpZ21lbnQgdG8gYmUgdXNlZCAodGhpcyBpcyBoYXJkd2FyZSBzcGVjaWZpYykuCiAqCiAqIFRoZSBfTCBzdWZmaXggaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSB3aWxsIGJlIGxvY2F0ZWQgaW4gYSBzcGVjaWZpYyBzZWN0aW9uLiBUaGlzIGlzCiAqIHVzZWZ1bCB0byBhbGxvY2F0ZSBjcml0aWNhbCBtZW1vcnkgc2VjdGlvbiBpbnRvIGZhc3QgaW50ZXJuYWwgU1JBTSBmb3IgZXhhbXBsZS4KICoKICovCgojZGVmaW5lIEhfQUxMT0NfTUVNKG5hbWUsdHlwZSkgICAgICAgICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuPTApOyB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKTsKCi8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KI2RlZmluZSBIX0FMTE9DX01FTV9PVkVSTEFZKG5hbWUsdHlwZSkgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbj0wKTsgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCk7CgoKICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCiAgI2RlZmluZSBDX0FMTE9DX01FTShuYW1lLHR5cGUsbnVtKSBcCiAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhudW0sIHNpemVvZih0eXBlKSkpOyB9IFwKICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCiAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSk7IH0KCiAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwogICNkZWZpbmUgQ19BTExPQ19NRU1fU1RBVElDKG5hbWUsdHlwZSxudW0pIFwKICAgIHN0YXRpYyB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhudW0sIHNpemVvZih0eXBlKSkpOyB9IFwKICAgIHN0YXRpYyB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2ZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAogICAgc3RhdGljIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpKTsgfQoKICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCiAgI2RlZmluZSBDX0FMTE9DX01FTTIobmFtZSx0eXBlLG4xLG4yKSBcCiAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhuMSwgc2l6ZW9mKHR5cGUpKSk7IH0gXAogICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkpICogKG4yKTsgfQoKICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCiAgI2RlZmluZSBDX0FBTExPQ19NRU0obmFtZSx0eXBlLG51bSkgXAogICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2MoKG51bSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyB9IFwKICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAogICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih2b2lkICopKTsgfQoKICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCiAgI2RlZmluZSBDX0FBTExPQ19NRU0yKG5hbWUsdHlwZSxuMSxuMikgXAogICAgdHlwZSAqIEdldCAjIyBuYW1lIChpbnQgbikgeyBGREtfQVNTRVJUKChuKSA8IChuMikpOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2MoKG4xKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxUKSk7IH0gXAogICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREthZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCiAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSkgKiAobjIpOyB9CgogIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KICAjZGVmaW5lIENfQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzKSBcCiAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvY19MKG51bSwgc2l6ZW9mKHR5cGUpLCBzKSk7IH0gXAogICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlX0woKnApOyAqcD1OVUxMOyB9IH0gXAogICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyB9CgogIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KICAjZGVmaW5lIENfQUxMT0NfTUVNMl9MKG5hbWUsdHlwZSxuMSxuMixzKSBcCiAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAodHlwZSopRkRLY2FsbG9jX0wobjEsIHNpemVvZih0eXBlKSwgcyk7IH0gXAogICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlX0woKnApOyAqcD1OVUxMOyB9IH0gXAogICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSkgKiAobjIpOyB9CgogIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KICAjZGVmaW5lIENfQUFMTE9DX01FTV9MKG5hbWUsdHlwZSxudW0scykgXAogICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2NfTCgobnVtKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxULCBzKSk7IH0gXAogICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREthZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSk7IH0KCiAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwogICNkZWZpbmUgQ19BQUxMT0NfTUVNMl9MKG5hbWUsdHlwZSxuMSxuMixzKSBcCiAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2FhbGxvY19MKChuMSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCwgcykpOyB9IFwKICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWVfTCgqcCk7ICpwPU5VTEw7IH0gfSBcCiAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSkgKiAobjIpOyB9CgovKiogU2VlICNIX0FMTE9DX01FTV9PVkVSTEFZIGZvciBkZXNjcmlwdGlvbi4gKi8KCgogICNkZWZpbmUgQ19BTExPQ19NRU1fT1ZFUkxBWShuYW1lLHR5cGUsbnVtLHNlY3QsdGFnKSBDX0FBTExPQ19NRU1fTChuYW1lLHR5cGUsbnVtLHNlY3QpCgoKICAgI2RlZmluZSBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsdHlwZSxuKSBcCiAgICAgdHlwZSBfICMjIG5hbWVbKG4pKyhBTElHTk1FTlRfREVGQVVMVCtzaXplb2YodHlwZSktMSldOyBcCiAgICAgdHlwZSAqIG5hbWUgPSAodHlwZSopQUxJR05fUFRSKF8gIyMgbmFtZSk7IFwKCiAgICNkZWZpbmUgQ19BTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsdHlwZSxuKSBcCiAgICAgdHlwZSBuYW1lW25dOwoKICAgI2RlZmluZSBDX0FBTExPQ19TQ1JBVENIX0VORChuYW1lLHR5cGUsbikKICAgI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsdHlwZSxuKQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUnVudGltZSBzdXBwb3J0IGRlY2xhcmF0aW9ucwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgovKiogcHJpbnRmKCkgdXNpbmcgc3Rkb3V0LiBJZiA6OkFSQ0hfV0FfRkxVU0hfQ09OU09MRSBkZWZpbmVkLCBhIGZsdXNoIGlzICBkb25lIGFkZGl0aW9uYWxseSBhZnRlciBwcmludGYoKS4gKi8Kdm9pZCBGREtwcmludGYgICAgKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKTsKCi8qKiBwcmludGYoKSB1c2luZyBzdGRlcnIuIElmIDo6QVJDSF9XQV9GTFVTSF9DT05TT0xFIGRlZmluZWQsIGEgZmx1c2ggaXMgZG9uZSBhZGRpdGlvbmFsbHkgYWZ0ZXIgcHJpbnRmKCkuICovCnZvaWQgRkRLcHJpbnRmRXJyICggY29uc3QgY2hhciogc3pGbXQsIC4uLik7CgovKiogV3JhcHBlciBmb3IgPHN0ZGlvLmg+J3MgZ2V0Y2hhcigpLiAqLwppbnQgRkRLZ2V0Y2hhcih2b2lkKTsKCklOVCAgRkRLZnByaW50Zih2b2lkICAqc3RyZWFtLCAgY29uc3QgIGNoYXIgKmZvcm1hdCwgLi4uKTsKSU5UICBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwoKCgpjb25zdCBjaGFyICpGREtzdHJjaHIoY29uc3QgY2hhciAqcywgSU5UIGMpOwpjb25zdCBjaGFyICpGREtzdHJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSk7CmNoYXIgKkZES3N0cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOwpjaGFyICpGREtzdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgVUlOVCBuKTsKCiNkZWZpbmUgRkRLX01BWF9PVkVSTEFZUyA4ICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBtZW1vcnkgb3ZlcmxheXMuICovCgoKdm9pZCAqRkRLY2FsbG9jIChjb25zdCBVSU5UIG4sIGNvbnN0IFVJTlQgc2l6ZSk7CnZvaWQgKkZES21hbGxvYyAoY29uc3QgVUlOVCBzaXplKTsKdm9pZCAgRkRLZnJlZSAgICh2b2lkICpwdHIpOwoKLyoqCiAqICBBbGxvY2F0ZSBhbmQgY2xlYXIgYW4gYWxpZ25lZCBtZW1vcnkgYXJlYS4gVXNlIEZES2FmcmVlKCkgaW5zdGVhZCBvZiBGREtmcmVlKCkgZm9yIHRoZXNlIG1lbW9yeSBhcmVhcy4KICoKICogXHBhcmFtIHNpemUgICAgICAgU2l6ZSBvZiByZXF1ZXN0ZWQgbWVtb3J5IGluIGJ5dGVzLgogKiBccGFyYW0gYWxpZ25tZW50ICBBbGlnbm1lbnQgb2YgcmVxdWVzdGVkIG1lbW9yeSBpbiBieXRlcy4KICogXHJldHVybiAgICAgICAgICAgUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LgogKi8Kdm9pZCAqRkRLYWFsbG9jIChjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50KTsKCi8qKgogKiAgRnJlZSBhbiBhbGlnbmVkIG1lbW9yeSBhcmVhLgogKgogKiBccGFyYW0gcHRyICBQb2ludGVyIHRvIGJlIGZyZWVkLgogKiBccmV0dXJuICAgICB2b2lkCiAqLwp2b2lkIEZES2FmcmVlICh2b2lkICpwdHIpOwoKCi8qKgogKiAgQWxsb2NhdGUgbWVtb3J5IGluIGEgc3BlY2lmaWMgbWVtb3J5IHNlY3Rpb24uCiAqICBSZXF1ZXN0cyBjYW4gYmUgbWFkZSBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgbWVtb3J5LiBJZiBpbnRlcm5hbCBtZW1vcnkgaXMKICogIHJlcXVlc3RlZCwgRkRLY2FsbG9jX0woKSBmaXJzdCB0cmllcyB0byB1c2UgTDEgbWVtb3J5LCB3aGljaCBzaXplcyBhcmUgZGVmaW5lZAogKiAgYnkgOjpEQVRBX0wxX0FfU0laRSBhbmQgOjpEQVRBX0wxX0JfU0laRS4gSWYgbm8gTDEgbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhlbgogKiAgRkRLY2FsbG9jX0woKSB0cmllcyB0byB1c2UgTDIgbWVtb3J5LiBJZiB0aGF0IGZhaWxzIGFzIHdlbGwsIHRoZSByZXF1ZXN0ZWQKICogIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYXQgYW4gZXh0ZXJuIGxvY2F0aW9uIHVzaW5nIHRoZSBmYWxsYmFjayBGREtjYWxsb2MoKS4KICoKICogXHBhcmFtIG4gICAgIFNlZSBNU0ROIGRvY3VtZW50YXRpb24gb24gY2FsbG9jKCkuCiAqIFxwYXJhbSBzaXplICBTZWUgTVNETiBkb2N1bWVudGF0aW9uIG9uIGNhbGxvYygpLgogKiBccGFyYW0gcyAgICAgTWVtb3J5IHNlY3Rpb24uCiAqIFxyZXR1cm4gICAgICBTZWUgTVNETiBkb2N1bWVudGF0aW9uIG9uIGNhbGxvYygpLgogKi8Kdm9pZCAqRkRLY2FsbG9jX0woY29uc3QgVUlOVCBuLCBjb25zdCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpOwoKLyoqCiAqICBBbGxvY2F0ZSBhbGlnbmVkIG1lbW9yeSBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgogKiAgU2VlIEZES2NhbGxvY19MKCkgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMgLSBzYW1lIGFwcGxpZXMgaGVyZS4KICovCnZvaWQgKkZES2FhbGxvY19MKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQsIE1FTU9SWV9TRUNUSU9OIHMpOwoKLyoqCiAqICBGcmVlIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW4gYSBzcGVjaWZpYyBtZW1vcnkgc2VjdGlvbi4KICovCnZvaWQgIEZES2ZyZWVfTCh2b2lkICpwdHIpOwoKLyoqCiAqICBGcmVlIGFsaWduZWQgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgogKi8Kdm9pZCAgRkRLYWZyZWVfTCh2b2lkICpwdHIpOwoKCi8qKgogKiBDb3B5IG1lbW9yeS4gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgbXVzdCBub3Qgb3ZlcmxhcC4KICogRWl0aGVyIHVzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgU3RhbmRhcmQgTGlicmFyeSwgb3IsIGlmIG5vIFN0YW5kYXJkIExpYnJhcnkKICogaXMgYXZhaWxhYmxlLCBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCiAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1jcHkoKS4gUGxlYXNlIHNlZSBNU0ROCiAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KICovCnZvaWQgRkRLbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpOwoKLyoqCiAqIENvcHkgbWVtb3J5LiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBhcmUgYWxsb3dlZCB0byBvdmVybGFwLgogKiBFaXRoZXIgdXNlIGltcGxlbWVudGF0aW9uIGZyb20gYSBTdGFuZGFyZCBMaWJyYXJ5LCBvciwgaWYgbm8gU3RhbmRhcmQgTGlicmFyeQogKiBpcyBhdmFpbGFibGUsIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KICogVGhlIGRlZmluZSA6OlVTRV9CVUlMVElOX01FTV9GVU5DVElPTlMgaW4gZ2VuZXJpY1N0ZHMuY3BwIGNvbnRyb2xzIHdoYXQgdG8gdXNlLgogKiBUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YW5kYXJkIG1lbW1vdmUoKS4gUGxlYXNlIHNlZSBNU0ROCiAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKi8Kdm9pZCBGREttZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpOwoKLyoqCiAqIENsZWFyIG1lbW9yeS4KICogRWl0aGVyIHVzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgU3RhbmRhcmQgTGlicmFyeSwgb3IsIGlmIG5vIFN0YW5kYXJkIExpYnJhcnkKICogaXMgYXZhaWxhYmxlLCBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCiAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1jbGVhcigpLiBQbGVhc2Ugc2VlIE1TRE4KICogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgoqLwp2b2lkIEZES21lbWNsZWFyKHZvaWQgKm1lbVB0ciwgY29uc3QgVUlOVCBzaXplKTsKCi8qKgogKiBGaWxsIG1lbW9yeSB3aXRoIHZhbHVlcy4KICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1zZXQoKS4gUGxlYXNlIHNlZSBNU0ROCiAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KICovCnZvaWQgRkRLbWVtc2V0KHZvaWQgKm1lbVB0ciwgY29uc3QgSU5UIHZhbHVlLCBjb25zdCBVSU5UIHNpemUpOwoKLyogQ29tcGFyZSBmdW5jdGlvbiB3cmFwcGVycyAqLwpJTlQgICBGREttZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCBVSU5UIHNpemUpOwpJTlQgICBGREtzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKSU5UICAgRkRLc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IFVJTlQgc2l6ZSk7CgpVSU5UICBGREtzdHJsZW4oY29uc3QgY2hhciAqcyk7CgojZGVmaW5lIEZES21heChhLGIpICggKGEpID4gKGIpID8gKGEpOihiKSkKI2RlZmluZSBGREttaW4oYSxiKSAoIChhKSA8IChiKSA/IChhKTooYikpCgojZGVmaW5lIEZES19JTlRfTUFYICgoSU5UKTB4N0ZGRkZGRkYpCiNkZWZpbmUgRkRLX0lOVF9NSU4gKChJTlQpMHg4MDAwMDAwMCkKCi8qIE1hdGggZnVuY3Rpb24gd3JhcHBlcnMuIE9ubHkgaW50ZW5kZWQgZm9yIGNvbXBhdGliaWxpdHksIG5vdCB0byBiZSBoaWdobHkgb3B0aW1pemVkLiAqLwovKiBVc2VkIGZvciBkZWJ1Z2dpbmcsIGRldiBjb2RlIC4uICovCgpJTlQgRkRLYWJzKElOVCBqKTsKZG91YmxlIEZES2ZhYnMoZG91YmxlIHgpOwpkb3VibGUgRkRLcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7CmRvdWJsZSBGREtzcXJ0KGRvdWJsZSB4KTsKZG91YmxlIEZES2F0YW4oZG91YmxlIHgpOwpkb3VibGUgRkRLbG9nKGRvdWJsZSB4KTsKZG91YmxlIEZES3Npbihkb3VibGUgeCk7CmRvdWJsZSBGREtjb3MoZG91YmxlIHgpOwpkb3VibGUgRkRLZXhwKGRvdWJsZSB4KTsKI2RlZmluZSBGREtsb2cyKGEpIChGREtsb2coYSkqMS40NDI2OTUwNDEpIC8qIGxvZygyLjApID0gMS40NDI2OTUwNDEgKi8KI2RlZmluZSBGREtsb2cxMChhKSAoRkRLbG9nKGEpKjAuNDM0Mjk0NDgyKSAvKiAxLjAvbG9nKDEwLjApID0gMC40MzQyOTQ0ODIgKi8KZG91YmxlIEZES2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCk7CmRvdWJsZSBGREthY29zKGRvdWJsZSB4KTsKZG91YmxlIEZES3Rhbihkb3VibGUgeCk7CmRvdWJsZSBGREtmbG9vcihkb3VibGUgeCk7CmRvdWJsZSBGREtjZWlsKGRvdWJsZSB4KTsKSU5UICAgRkRLYXRvaShjb25zdCBjaGFyICpucHRyKTsKbG9uZyAgRkRLYXRvbChjb25zdCBjaGFyICpucHRyKTsKZmxvYXQgRkRLYXRvZihjb25zdCBjaGFyICpucHRyKTsKLyogTE9ORyBMT05HIEZES2F0b2xsKGNvbnN0IGNoYXIgKm5wdHIpOyAqLwovKiBMT05HIExPTkcgRkRLYXRvcShjb25zdCBjaGFyICpucHRyKTsgKi8KCgoKLyogRklMRSBJL08gKi8KCi8qIQogKiAgQ2hlY2sgcGxhdGZvcm0gZm9yIGVuZGlhbmVzcy4KICoKICogXHJldHVybiAgMSBpZiBwbGF0Zm9ybSBpcyBsaXR0bGUgZW5kaWFuLCBub24tMSBpZiBwbGF0Zm9ybSBpcyBiaWcgZW5kaWFuLgogKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmlubGluZQojZWxzZQpzdGF0aWMKI2VuZGlmCmludCBJU19MSVRUTEVfRU5ESUFOKHZvaWQpIHsKICBpbnQgX19kdW1teSA9IDE7CiAgcmV0dXJuICggKiggKFVDSEFSKikoJihfX2R1bW15KSApICkgKTsKfQoKLyohCiAqICBDb252ZXJ0IGlucHV0IHZhbHVlIHRvIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgogKgogKiBccGFyYW0gdmFsICBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQuIEl0IG1heSBiZSBpbiBib3RoIGJpZyBvciBsaXR0bGUgZW5kaWFuLgogKiBccmV0dXJuICAgICBWYWx1ZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KICovCiNkZWZpbmUgVE9fTElUVExFX0VORElBTih2YWwpIFwKICAoIChJU19MSVRUTEVfRU5ESUFOKCkpID8gXAogICAgICh2YWwpIFwKICAgOiAoICgoKHZhbCkgJiAweGZmKSA8PCAyNCkgfHwgKCgodmFsKSAmIDB4ZmYwMCk8PCA4KSB8fCAoKCh2YWwpICYgMHhmZjAwMDApPj44KSB8fCAoKCh2YWwpICYgMHhmZjAwMDAwMCkgPj4gMjQpICkgKQoKCi8qIQogKiBcZm4gICAgIEZES0ZJTEUgKkZES2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKICogICAgICAgICBTdGFuZGFyZCBmb3BlbigpIHdyYXBwZXIuCiAqIFxmbiAgICAgSU5UIEZES2ZjbG9zZShGREtGSUxFICpGUCk7CiAqICAgICAgICAgU3RhbmRhcmQgZmNsb3NlKCkgd3JhcHBlci4KICogXGZuICAgICBJTlQgRkRLZnNlZWsoRkRLRklMRSAqRlAsIExPTkcgT0ZGU0VULCBpbnQgV0hFTkNFKTsKICogICAgICAgICBTdGFuZGFyZCBmc2VlaygpIHdyYXBwZXIuCiAqIFxmbiAgICAgSU5UIEZES2Z0ZWxsKEZES0ZJTEUgKkZQKTsKICogICAgICAgICBTdGFuZGFyZCBmdGVsbCgpIHdyYXBwZXIuCiAqIFxmbiAgICAgSU5UIEZES2ZmbHVzaChGREtGSUxFICpmcCk7CiAqICAgICAgICAgU3RhbmRhcmQgZmZsdXNoKCkgd3JhcHBlci4KICogXGZuICAgICBVSU5UIEZES2Z3cml0ZSh2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOwogKiAgICAgICAgIFN0YW5kYXJkIGZ3cml0ZSgpIHdyYXBwZXIuCiAqIFxmbiAgICAgVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CiAqICAgICAgICAgU3RhbmRhcmQgZnJlYWQoKSB3cmFwcGVyLgogKi8KdHlwZWRlZiB2b2lkIEZES0ZJTEU7CmV4dGVybiBjb25zdCBJTlQgRkRLU0VFS19TRVQsIEZES1NFRUtfQ1VSLCBGREtTRUVLX0VORDsKCkZES0ZJTEUgKkZES2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKSU5UIEZES2ZjbG9zZShGREtGSUxFICpGUCk7CklOVCBGREtmc2VlayhGREtGSUxFICpGUCwgTE9ORyBPRkZTRVQsIGludCBXSEVOQ0UpOwpJTlQgRkRLZnRlbGwoRkRLRklMRSAqRlApOwpJTlQgRkRLZmZsdXNoKEZES0ZJTEUgKmZwKTsKVUlOVCBGREtmd3JpdGUodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CmNoYXIqIEZES2ZnZXRzKHZvaWQgKmRzdCwgSU5UIHNpemUsIEZES0ZJTEUgKmZwKTsKdm9pZCBGREtyZXdpbmQoRkRLRklMRSAqZnApOwpJTlQgRkRLZmVvZihGREtGSUxFICpmcCk7CgovKioKICogXGJyaWVmICAgICAgICBXcml0ZSBlYWNoIG1lbWJlciBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLiBDb252ZXJ0IGF1dG9tYXRpY2FsbHkgdG8gaG9zdCBlbmRpYW5lc3MuCiAqIFxwYXJhbSBwdHJmICAgUG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdG8gcmVhZCBkYXRhIGZyb20uCiAqIFxwYXJhbSBzaXplICAgU2l6ZSBvZiBlYWNoIGl0ZW0gdG8gYmUgd3JpdHRlbi4KICogXHBhcmFtIG5tZW1iICBOdW1iZXIgb2YgaXRlbXMgdG8gYmUgd3JpdHRlbi4KICogXHBhcmFtIGZwICAgICBGaWxlIHBvaW50ZXIgb2YgdHlwZSBGREtGSUxFLgogKiBccmV0dXJuICAgICAgIE51bWJlciBvZiBpdGVtcyByZWFkIG9uIHN1Y2Nlc3MgYW5kIGZyZWFkKCkgZXJyb3Igb24gZmFpbHVyZS4KICovClVJTlQgRkRLZndyaXRlX0VMKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CgovKioKICogXGJyaWVmICAgICAgICBSZWFkIHZhcmlhYmxlIG9mIHNpemUgInNpemUiIGFzIGxpdHRsZSBlbmRpYW4uIENvbnZlcnQgYXV0b21hdGljYWxseSB0byBob3N0IGVuZGlhbmVzcy4KICogICAgICAgICAgICAgICAgNC1ieXRlIGFsaWdubWVudCBpcyBlbmZvcmNlZCBmb3IgMjQgYml0IGRhdGEsIGF0IDMyIGJpdCBmdWxsIHNjYWxlLgogKiBccGFyYW0gZHN0ICAgIFBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRvIHN0b3JlIGRhdGEgaW50by4KICogXHBhcmFtIHNpemUgICBTaXplIG9mIGVhY2ggaXRlbSB0byBiZSByZWFkLgogKiBccGFyYW0gbm1lbWIgIE51bWJlciBvZiBpdGVtcyB0byBiZSByZWFkLgogKiBccGFyYW0gZnAgICAgIEZpbGUgcG9pbnRlciBvZiB0eXBlIEZES0ZJTEUuCiAqIFxyZXR1cm4gICAgICAgTnVtYmVyIG9mIGl0ZW1zIHJlYWQgb24gc3VjY2VzcyBhbmQgZnJlYWQoKSBlcnJvciBvbiBmYWlsdXJlLgogKi8KVUlOVCBGREtmcmVhZF9FTCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CgoKLyoqCiAqIFxicmllZiAgUHJpbnQgRkRLIHNvZnR3YXJlIGRpc2NsYWltZXIuCiAqLwp2b2lkIEZES3ByaW50RGlzY2xhaW1lcih2b2lkKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmIC8qIF9fR0VORVJJQ1NURFNfSF9fICovCg==