Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgY2FsY3VsYXRpb24gIAoKICBUaGUgZW52ZWxvcGUgYWRqdXN0b3IgY29tcGFyZXMgdGhlIGVuZXJnaWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zcG9zZWQKICBoaWdoYmFuZCB0byB0aGUgcmVmZXJlbmNlIGVuZXJnaWVzIGNvbnZleWVkIHdpdGggdGhlIGJpdHN0cmVhbS4KICBUaGUgaGlnaGJhbmQgaXMgYW1wbGlmaWVkIChzb21ldGltZXMpIG9yIGF0dGVudWF0ZWQgKG1vc3RseSkgdG8gdGhlCiAgZGVzaXJlZCBsZXZlbC4KCiAgVGhlIHNwZWN0cmFsIHNoYXBlIG9mIHRoZSByZWZlcmVuY2UgZW5lcmdpZXMgY2FuIGJlIGNoYW5nZWQgc2V2ZXJhbCB0aW1lcyBwZXIKICBmcmFtZSBpZiBuZWNlc3NhcnkuIEVhY2ggc2V0IG9mIGVuZXJneSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBhIGNlcnRhaW4gcmFuZ2UKICBpbiB0aW1lIHdpbGwgYmUgY2FsbGVkIGFuIDxlbT5lbnZlbG9wZTwvZW0+IGhlcmUuCiAgVGhlIGJpdHN0cmVhbSBzdXBwb3J0cyBzZXZlcmFsIGZyZXF1ZW5jeSBzY2FsZXMgYW5kIHR3byByZXNvbHV0aW9ucy4gTm9ybWFsbHksCiAgb25lIG9yIG1vcmUgUU1GLXN1YmJhbmRzIGFyZSBncm91cGVkIHRvIG9uZSBTQlItYmFuZC4gQW4gZW52ZWxvcGUgY29udGFpbnMKICByZWZlcmVuY2UgZW5lcmdpZXMgZm9yIGVhY2ggU0JSLWJhbmQuCiAgSW4gYWRkaXRpb24gdG8gdGhlIGVuZXJneSBlbnZlbG9wZXMsIG5vaXNlIGVudmVsb3BlcyBhcmUgdHJhbnNtaXR0ZWQgdGhhdAogIGRlZmluZSB0aGUgcmF0aW8gb2YgZW5lcmd5IHdoaWNoIGlzIGdlbmVyYXRlZCBieSBhZGRpbmcgbm9pc2UgaW5zdGVhZCBvZgogIHRyYW5zcG9zaW5nIHRoZSBsb3diYW5kLiBUaGUgbm9pc2UgZW52ZWxvcGVzIGFyZSBnaXZlbiBpbiBhIGNvYXJzZXIgdGltZQogIGFuZCBmcmVxdWVuY3kgcmVzb2x1dGlvbi4KICBJZiBhIHNpZ25hbCBjb250YWlucyBzdHJvbmcgdG9uYWwgY29tcG9uZW50cywgc3ludGhldGljIHNpbmVzIGNhbiBiZQogIGdlbmVyYXRlZCBpbiBpbmRpdmlkdWFsIFNCUiBiYW5kcy4KCiAgQW4gb3ZlcmxhcCBidWZmZXIgb2YgNiBRTUYtdGltZXNsb3RzIGlzIHVzZWQgdG8gYWxsb3cgYSBtb3JlCiAgZmxleGlibGUgYWxpZ25tZW50IG9mIHRoZSBlbnZlbG9wZXMgaW4gdGltZSB0aGF0IGlzIG5vdCByZXN0cmljdGVkIHRvIHRoZQogIGNvcmUgY29kZWMncyBmcmFtZSBib3JkZXJzLgogIFRoZXJlZm9yZSB0aGUgZW52ZWxvcGUgYWRqdXN0b3IgaGFzIGFjY2VzcyB0byB0aGUgc3BlY3RyYWwgZGF0YSBvZiB0aGUKICBjdXJyZW50IGZyYW1lIGFzIHdlbGwgYXMgdGhlIGxhc3QgNiBRTUYtdGltZXNsb3RzIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4KICBIb3dldmVyLCBpbiBhdmVyYWdlIG9ubHkgdGhlIGRhdGEgb2YgMSBmcmFtZSBpcyBiZWluZyBwcm9jZXNzZWQgYXMKICB0aGUgYWRqdXN0b3IgaXMgY2FsbGVkIG9uY2UgcGVyIGZyYW1lLgoKICBEZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSByYW5nZSBzZXQgaW4gdGhlIGJpdHN0cmVhbSwgb25seSBRTUYtc3ViYmFuZHMgYmV0d2VlbgogIDxlbT5sb3dTdWJiYW5kPC9lbT4gYW5kIDxlbT5oaWdoU3ViYmFuZDwvZW0+IGFyZSBhZGp1c3RlZC4KCiAgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhIHRvIG1heGltaXplIFNOUiAoc2VlICNRTUZfU0NBTEVfRkFDVE9SKSBhcyB3ZWxsIGFzIGEgc3BlY2lhbCBNYW50aXNzYS1FeHBvbmVudCBmb3JtYXQKICAoIHNlZSAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSApIGFyZSBiZWluZyB1c2VkLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhpcyBtb2R1bGVzIGlzIGNhbGN1bGF0ZVNickVudmVsb3BlKCkuCgogIFxzYSBzYnJfc2NhbGUuaCwgI1FNRl9TQ0FMRV9GQUNUT1IsIGNhbGN1bGF0ZVNickVudmVsb3BlKCksIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CiovCgoKI2luY2x1ZGUgImVudl9jYWxjLmgiCgojaW5jbHVkZSAic2JyZGVjX2ZyZXFfc2NhLmgiCiNpbmNsdWRlICJlbnZfZXh0ci5oIgojaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCiNpbmNsdWRlICJzYnJfcmFtLmgiCiNpbmNsdWRlICJzYnJfcm9tLmgiCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIgICAgICAgICAgIC8qIG5lZWQgRkRLcG93KCkgZm9yIGRlYnVnIG91dHB1dHMgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCiNpbmNsdWRlICJhcm0vZW52X2NhbGNfYXJtLmNwcCIKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBGSVhQX0RCTCBucmdSZWZbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIEZJWFBfREJMIG5yZ0VzdFtNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbnJnR2FpbltNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbm9pc2VMZXZlbFtNQVhfRlJFUV9DT0VGRlNdOwogICAgRklYUF9EQkwgbnJnU2luZVtNQVhfRlJFUV9DT0VGRlNdOwoKICAgIFNDSEFSICAgbnJnUmVmX2VbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIFNDSEFSICAgbnJnRXN0X2VbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIFNDSEFSICAgbnJnR2Fpbl9lW01BWF9GUkVRX0NPRUZGU107CiAgICBTQ0hBUiAgIG5vaXNlTGV2ZWxfZVtNQVhfRlJFUV9DT0VGRlNdOwogICAgU0NIQVIgICBucmdTaW5lX2VbTUFYX0ZSRVFfQ09FRkZTXTsKfQpFTlZfQ0FMQ19OUkdTOwoKLypzdGF0aWMqLyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgKmZpbHRCdWZmZXJfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpOcmdHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqTnJnR2Fpbl9lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHN1YmJhbmRzKTsKCi8qc3RhdGljKi8gdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgaW50IGhpZ2hTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RhcnRfcG9zLCAgaW50IG5leHRfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgZnJhbWVFeHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApOwoKLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGlucHV0X2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ19lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ19lc3RfZSApOwoKLypzdGF0aWMqLyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCBTQ0hBUiBucmdSZWZfZSwgRU5WX0NBTENfTlJHUyogbnJncywgaW50IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgdG1wTm9pc2UsIFNDSEFSIHRtcE5vaXNlX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgIHNpbmVNYXBwZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcpOwoKLypzdGF0aWMqLyB2b2lkIGNhbGNBdmdHYWluKEVOVl9DQUxDX05SR1MqIG5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpzdW1SZWZfbSwKICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpzdW1SZWZfZSwKICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluX20sCiAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqcHRyQXZnR2Fpbl9lKTsKCi8qc3RhdGljKi8gdm9pZCBhZGp1c3RUaW1lU2xvdExDKEZJWFBfREJMICAqcHRyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vTm9pc2VGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGZDbGRmYik7Ci8qc3RhdGljKi8gdm9pZCBhZGp1c3RUaW1lU2xvdEhRKEZJWFBfREJMICAqcHRyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93U3ViYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc2NhbGVfY2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBzbW9vdGhfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub05vaXNlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKCgovKiEKICBcYnJpZWYgICAgIE1hcCBzaW5lIGZsYWdzIGZyb20gYml0c3RyZWFtIHRvIFFNRiBiYW5kcwoKICBUaGUgYml0c3RyZWFtIGNhcnJpZXMgb25seSAxIHNpbmUgZmxhZyBwZXIgYmFuZCBhbmQgZnJhbWUuCiAgVGhpcyBmdW5jdGlvbiBtYXBzIGV2ZXJ5IHNpbmUgZmxhZyBmcm9tIHRoZSBiaXRzdHJlYW0gdG8gYSBzcGVjaWZpYyBRTUYgc3ViYmFuZAogIGFuZCB0byBhIHNwZWNpZmljIGVudmVsb3BlIHdoZXJlIHRoZSBzaW5lIHNoYWxsIHN0YXJ0LgogIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSB2ZWN0b3Igc2luZU1hcHBlZCB3aGljaCBjb250YWlucyBvbmUgZW50cnkgcGVyCiAgUU1GIHN1YmJhbmQuIFRoZSB2YWx1ZSBvZiBhbiBlbnRyeSBzcGVjaWZpZXMgdGhlIGVudmVsb3BlIHdoZXJlIGEgc2luZQogIHNoYWxsIHN0YXJ0LiBBIHZhbHVlIG9mICNNQVhfRU5WRUxPUEVTIGluZGljYXRlcyB0aGF0IG5vIHNpbmUgaXMgcHJlc2VudAogIGluIHRoZSBzdWJiYW5kLgogIFRoZSBtaXNzaW5nIGhhcm1vbmljcyBmbGFncyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSAoaGFybUZsYWdzUHJldikgZGV0ZXJtaW5lCiAgaWYgYSBzaW5lIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSBvciBhdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uLgogIEFkZGl0aW9uYWxseSwgdGhlIGZsYWdzIGluIGhhcm1GbGFnc1ByZXYgYXJlIGJlaW5nIHVwZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbgogIGZvciB0aGUgbmV4dCBmcmFtZS4KKi8KLypzdGF0aWMqLyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgLyohPCBCYW5kIGJvcmRlcnMgKHRoZXJlJ3Mgb25seSAxIGZsYWcgcGVyIGJhbmQpICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICphZGRIYXJtb25pY3MsICAgICAgICAgICAvKiE8IHZlY3RvciB3aXRoIDEgZmxhZyBwZXIgc2ZiICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhhcm1GbGFnc1ByZXYsICAgICAgICAgICAvKiE8IFBhY2tlZCAnYWRkSGFybW9uaWNzJyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5FbnYsICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgcG9zaXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpzaW5lTWFwcGVkKSAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIHZlY3RvciBvZiBzaW5lIHN0YXJ0IHBvc2l0aW9ucyBmb3IgZWFjaCBRTUYgYmFuZCAqLwoKewogIGludCBpOwogIGludCBsb3dTdWJiYW5kMiA9IGZyZXFCYW5kVGFibGVbMF08PDE7CiAgaW50IGJpdGNvdW50ID0gMDsKICBpbnQgb2xkZmxhZ3MgPSAqaGFybUZsYWdzUHJldjsKICBpbnQgbmV3ZmxhZ3MgPSAwOwoKICAvKgogICAgRm9ybWF0IG9mIGhhcm1GbGFnc1ByZXY6CgogICAgZmlyc3Qgd29yZCA9IGZsYWdzIGZvciBoaWdoZXN0IDE2IHNmYiBiYW5kcyBpbiB1c2UKICAgIHNlY29uZCB3b3JkID0gZmxhZ3MgZm9yIG5leHQgbG93ZXIgMTYgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQogICAgdGhpcmQgd29yZCA9IGZsYWdzIGZvciBsb3dlc3QgMTYgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQoKICAgIFVwIHRvIE1BWF9GUkVRX0NPRUZGUyBzZmIgYmFuZHMgY2FuIGJlIGZsYWdnZWQgZm9yIGEgc2lnbi4KICAgIFRoZSBsb3dlc3QgYml0IG9mIHRoZSBmaXJzdCB3b3JkIGNvcnJlc3BvbmRzIHRvIHRoZSBfaGlnaGVzdF8gc2ZiIGJhbmQgaW4gdXNlLgogICAgVGhpcyBpcyBlbnN1cmVzIHRoYXQgZWFjaCBmbGFnIGlzICBtYXBwZWQgdG8gdGhlIHNhbWUgUU1GIGJhbmQgZXZlbiBhZnRlciBhCiAgICBjaGFuZ2Ugb2YgdGhlIGNyb3Nzb3Zlci1mcmVxdWVuY3kuCiAgKi8KCgogIC8qIFJlc2V0IHRoZSBvdXRwdXQgdmVjdG9yIGZpcnN0ICovCiAgRkRLbWVtc2V0KHNpbmVNYXBwZWQsIE1BWF9FTlZFTE9QRVMsTUFYX0ZSRVFfQ09FRkZTKTsgLyogTUFYX0VOVkVMT1BFUyBtZWFucyAnbm8gc2luZScgKi8KCiAgZnJlcUJhbmRUYWJsZSArPSBuU2ZiOwogIGFkZEhhcm1vbmljcyAgKz0gblNmYi0xOwoKICBmb3IgKGk9blNmYjsgaSE9MDsgaS0tKSB7CiAgICBpbnQgdWkgPSAqZnJlcUJhbmRUYWJsZS0tOyAgICAgICAgICAgICAgICAgLyogVXBwZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgc2NhbGUgZmFjdG9yIGJhbmQuICovCiAgICBpbnQgbGkgPSAqZnJlcUJhbmRUYWJsZTsgICAgICAgICAgICAgICAgICAgLyogTG93ZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgc2NhbGUgZmFjdG9yIGJhbmQuICovCgogICAgaWYgKCAqYWRkSGFybW9uaWNzLS0gKSB7ICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIGEgc2luZSBpbiB0aGlzIGJhbmQgKi8KCiAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMSA8PCBiaXRjb3VudDsKICAgICAgbmV3ZmxhZ3MgfD0gbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgZmxhZyAqLwoKICAgICAgLyoKICAgICAgICBJZiB0aGVyZSB3YXMgYSBzaW5lIGluIHRoZSBsYXN0IGZyYW1lLCBsZXQgaXQgY29udGludWUgZnJvbSB0aGUgZmlyc3QgZW52ZWxvcGUgb24KICAgICAgICBlbHNlIHN0YXJ0IGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uCiAgICAgICovCiAgICAgIHNpbmVNYXBwZWRbKHVpK2xpLWxvd1N1YmJhbmQyKSA+PiAxXSA9ICggb2xkZmxhZ3MgJiBtYXNrICkgPyAwIDogdHJhbkVudjsKICAgIH0KCiAgICBpZiAoKCsrYml0Y291bnQgPT0gMTYpIHx8IGk9PTEpIHsKICAgICAgYml0Y291bnQgPSAwOwogICAgICAqaGFybUZsYWdzUHJldisrID0gbmV3ZmxhZ3M7CiAgICAgIG9sZGZsYWdzID0gKmhhcm1GbGFnc1ByZXY7ICAgICAgICAgICAgICAgLyogRmV0Y2ggMTYgb2YgdGhlIG9sZCBmbGFncyAqLwogICAgICBuZXdmbGFncyA9IDA7CiAgICB9CiAgfQp9CgoKLyohCiAgXGJyaWVmICAgICBSZWR1Y2UgZ2Fpbi1hZGp1c3RtZW50IGluZHVjZWQgYWxpYXNpbmcgZm9yIHJlYWwgdmFsdWVkIGZpbHRlcmJhbmsuCiovCi8qc3RhdGljKi8gdm9pZAphbGlhc2luZ1JlZHVjdGlvbihGSVhQX0RCTCogZGVncmVlQWxpYXMsICAgICAgIC8qITwgZXN0aW1hdGVkIGFsaWFzaW5nIGZvciBlYWNoIFFNRiBjaGFubmVsICovCiAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCiAgICAgICAgICAgICAgICAgIGludCogICAgICB1c2VBbGlhc1JlZHVjdGlvbiwgLyohPCBzeW50aGV0aWMgc2luZSBlbmdlcmd5IGZvciBlYWNoIHN1YmJhbmQsIHVzZWQgYXMgZmxhZyAqLwogICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcykgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBjaGFubmVscyB0byBwcm9jZXNzICovCnsKICBGSVhQX0RCTCogbnJnR2FpbiAgID0gbnJncy0+bnJnR2FpbjsgICAgICAgICAgLyohPCBzdWJiYW5kIGdhaW5zIHRvIGJlIG1vZGlmaWVkICovCiAgU0NIQVIqICAgIG5yZ0dhaW5fZSA9IG5yZ3MtPm5yZ0dhaW5fZTsgICAgICAgIC8qITwgc3ViYmFuZCBnYWlucyB0byBiZSBtb2RpZmllZCAoZXhwb25lbnRzKSAqLwogIEZJWFBfREJMKiBucmdFc3QgICAgPSBucmdzLT5ucmdFc3Q7ICAgICAgICAgICAvKiE8IHN1YmJhbmQgZW5lcmd5IGJlZm9yZSBhbXBsaWZpY2F0aW9uICovCiAgU0NIQVIqICAgIG5yZ0VzdF9lICA9IG5yZ3MtPm5yZ0VzdF9lOyAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKGV4cG9uZW50cykgKi8KICBpbnQgZ3JvdXBpbmcgPSAwLCBpbmRleCA9IDAsIG5vR3JvdXBzLCBrOwogIGludCBncm91cFZlY3RvcltNQVhfRlJFUV9DT0VGRlNdOwoKICAvKiBDYWxjdWxhdGUgZ3JvdXBpbmcqLwogIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzLTE7IGsrKyApewogICAgaWYgKCAoZGVncmVlQWxpYXNbayArIDFdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiB1c2VBbGlhc1JlZHVjdGlvbltrXSApIHsKICAgICAgaWYoZ3JvdXBpbmc9PTApewogICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gazsKICAgICAgICBncm91cGluZyA9IDE7CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICBpZihncm91cFZlY3RvcltpbmRleC0xXSArIDMgPT0gayl7CiAgICAgICAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IGsgKyAxOwogICAgICAgICAgZ3JvdXBpbmcgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZXsKICAgICAgaWYoZ3JvdXBpbmcpewogICAgICAgIGlmKHVzZUFsaWFzUmVkdWN0aW9uW2tdKQogICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IGs7CiAgICAgICAgZ3JvdXBpbmcgPSAwOwogICAgICB9CiAgICB9CiAgfQoKICBpZihncm91cGluZyl7CiAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IG5vU3ViYmFuZHM7CiAgfQogIG5vR3JvdXBzID0gaW5kZXggPj4gMTsKCgogIC8qQ2FsY3VsYXRlIG5ldyBnYWluKi8KICBmb3IgKGludCBncm91cCA9IDA7IGdyb3VwIDwgbm9Hcm91cHM7IGdyb3VwICsrKSB7CiAgICBGSVhQX0RCTCBucmdPcmlnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAgIC8qIE9yaWdpbmFsIHNpZ25hbCBlbmVyZ3kgaW4gY3VycmVudCBncm91cCBvZiBiYW5kcyAqLwogICAgU0NIQVIgICAgbnJnT3JpZ19lID0gMDsKICAgIEZJWFBfREJMIG5yZ0FtcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgICAgLyogQW1wbGlmaWVkIHNpZ25hbCBlbmVyZ3kgaW4gZ3JvdXAgKHVzaW5nIGN1cnJlbnQgZ2FpbnMpICovCiAgICBTQ0hBUiAgICBucmdBbXBfZSA9IDA7CiAgICBGSVhQX0RCTCBucmdNb2QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgICAvKiBTaWduYWwgZW5lcmd5IGluIGdyb3VwIHdoZW4gYXBwbHlpbmcgbW9kaWZpZWQgZ2FpbnMgKi8KICAgIFNDSEFSICAgIG5yZ01vZF9lID0gMDsKICAgIEZJWFBfREJMIGdyb3VwR2FpbjsgICAgICAgICAvKiBUb3RhbCBlbmVyZ3kgZ2FpbiBpbiBncm91cCAqLwogICAgU0NIQVIgICAgZ3JvdXBHYWluX2U7CiAgICBGSVhQX0RCTCBjb21wZW5zYXRpb247ICAgICAgLyogQ29tcGVuc2F0aW9uIGZhY3RvciBmb3IgdGhlIGVuZXJneSBjaGFuZ2Ugd2hlbiBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLwogICAgU0NIQVIgICAgY29tcGVuc2F0aW9uX2U7CgogICAgaW50IHN0YXJ0R3JvdXAgPSBncm91cFZlY3RvclsyKmdyb3VwXTsKICAgIGludCBzdG9wR3JvdXAgID0gZ3JvdXBWZWN0b3JbMipncm91cCsxXTsKCiAgICAvKiBDYWxjdWxhdGUgdG90YWwgZW5lcmd5IGluIGdyb3VwIGJlZm9yZSBhbmQgYWZ0ZXIgYW1wbGlmaWNhdGlvbiB3aXRoIGN1cnJlbnQgZ2FpbnM6ICovCiAgICBmb3IoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKyl7CiAgICAgIC8qIEdldCBvcmlnaW5hbCBiYW5kIGVuZXJneSAqLwogICAgICBGSVhQX0RCTCB0bXAgPSBucmdFc3Rba107CiAgICAgIFNDSEFSICAgIHRtcF9lID0gbnJnRXN0X2Vba107CgogICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgbnJnT3JpZywgbnJnT3JpZ19lLCAmbnJnT3JpZywgJm5yZ09yaWdfZSk7CgogICAgICAvKiBNdWx0aXBseSBiYW5kIGVuZXJneSB3aXRoIGN1cnJlbnQgZ2FpbiAqLwogICAgICB0bXAgPSBmTXVsdCh0bXAsbnJnR2FpbltrXSk7CiAgICAgIHRtcF9lID0gdG1wX2UgKyBucmdHYWluX2Vba107CgogICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgbnJnQW1wLCBucmdBbXBfZSwgJm5yZ0FtcCwgJm5yZ0FtcF9lKTsKICAgIH0KCiAgICAvKiBDYWxjdWxhdGUgdG90YWwgZW5lcmd5IGdhaW4gaW4gZ3JvdXAgKi8KICAgIEZES19kaXZpZGVfTWFudEV4cChucmdBbXAsIG5yZ0FtcF9lLAogICAgICAgICAgICAgICAgICAgICAgIG5yZ09yaWcsIG5yZ09yaWdfZSwKICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBHYWluLCAmZ3JvdXBHYWluX2UpOwoKICAgIGZvcihrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKXsKICAgICAgRklYUF9EQkwgdG1wOwogICAgICBTQ0hBUiAgICB0bXBfZTsKCiAgICAgIEZJWFBfREJMIGFscGhhID0gZGVncmVlQWxpYXNba107CiAgICAgIGlmIChrIDwgbm9TdWJiYW5kcyAtIDEpIHsKICAgICAgICBpZiAoZGVncmVlQWxpYXNbayArIDFdID4gYWxwaGEpCiAgICAgICAgICBhbHBoYSA9IGRlZ3JlZUFsaWFzW2sgKyAxXTsKICAgICAgfQoKICAgICAgLyogTW9kaWZ5IGdhaW4gZGVwZW5kaW5nIG9uIHRoZSBkZWdyZWUgb2YgYWxpYXNpbmcgKi8KICAgICAgRkRLX2FkZF9NYW50RXhwKCBmTXVsdChhbHBoYSxncm91cEdhaW4pLCBncm91cEdhaW5fZSwKICAgICAgICAgICAgICAgICAgICAgICBmTXVsdCgvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYSxucmdHYWluW2tdKSwgbnJnR2Fpbl9lW2tdLAogICAgICAgICAgICAgICAgICAgICAgICZucmdHYWluW2tdLCAmbnJnR2Fpbl9lW2tdICk7CgogICAgICAvKiBBcHBseSBtb2RpZmllZCBnYWluIHRvIG9yaWdpbmFsIGVuZXJneSAqLwogICAgICB0bXAgPSBmTXVsdChucmdHYWluW2tdLG5yZ0VzdFtrXSk7CiAgICAgIHRtcF9lID0gbnJnR2Fpbl9lW2tdICsgbnJnRXN0X2Vba107CgogICAgICAvKiBBY2N1bXVsYXRlIGVuZXJneSB3aXRoIG1vZGlmaWVkIGdhaW5zIGFwcGxpZWQgKi8KICAgICAgRkRLX2FkZF9NYW50RXhwKCB0bXAsIHRtcF9lLAogICAgICAgICAgICAgICAgICAgICAgIG5yZ01vZCwgbnJnTW9kX2UsCiAgICAgICAgICAgICAgICAgICAgICAgJm5yZ01vZCwgJm5yZ01vZF9lICk7CiAgICB9CgogICAgLyogQ2FsY3VsYXRlIGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gcmV0YWluIHRoZSBlbmVyZ3kgb2YgdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgIEZES19kaXZpZGVfTWFudEV4cChucmdBbXAsIG5yZ0FtcF9lLAogICAgICAgICAgICAgICAgICAgICAgIG5yZ01vZCwgbnJnTW9kX2UsCiAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBlbnNhdGlvbiwgJmNvbXBlbnNhdGlvbl9lKTsKCiAgICAvKiBBcHBseSBjb21wZW5zYXRpb24gZmFjdG9yIHRvIGFsbCBnYWlucyBvZiB0aGUgZ3JvdXAgKi8KICAgIGZvcihrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKXsKICAgICAgbnJnR2FpbltrXSA9IGZNdWx0KG5yZ0dhaW5ba10sY29tcGVuc2F0aW9uKTsKICAgICAgbnJnR2Fpbl9lW2tdID0gbnJnR2Fpbl9lW2tdICsgY29tcGVuc2F0aW9uX2U7CiAgICB9CiAgfQp9CgoKIC8qIENvbnZlcnQgaGVhZHJvb20gYml0cyB0byBleHBvbmVudCAqLwojZGVmaW5lIFNDQUxFMkVYUChzKSAoMTUtKHMpKQojZGVmaW5lIEVYUDJTQ0FMRShlKSAoMTUtKGUpKQoKLyohCiAgXGJyaWVmICBBcHBseSBzcGVjdHJhbCBlbnZlbG9wZSB0byBzdWJiYW5kIHNhbXBsZXMKCiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBzYnJfZGVjLmNwcCBpbiBlYWNoIGZyYW1lLgoKICBUbyBlbmhhbmNlIGFjY3VyYWN5IGFuZCBkdWUgdG8gdGhlIHVzYWdlIG9mIHRhYmxlcyBmb3Igc3F1YXJlcm9vdHMgYW5kCiAgaW52ZXJzZSwgc29tZSBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIHRoZSBvcGVyYW5kcyBiZWluZyBzcGxpdAogIGludG8gbWFudGlzc2EgYW5kIGV4cG9uZW50LiBUaGUgdmFyaWFibGUgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlIGNhcnJ5CiAgdGhlIHN1ZmZpeGVzIDxlbT5fbTwvZW0+IGFuZCAgPGVtPl9lPC9lbT4gcmVzcGVjdGl2ZWx5LiBUaGUgY29udHJvbCBkYXRhCiAgaW4gI2hGcmFtZURhdGEgY29udGFpbnRzIGVudmVsb3BlIGRhdGEgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtYXQgYnV0CiAgc3RvcmVkIGluIHNpbmdsZSB3b3Jkcy4gKFNlZSByZXF1YW50aXplRW52ZWxvcGVEYXRhKCkgZm9yIGRldGFpbHMpLiBUaGlzIGRhdGEKICBpcyB1bnBhY2tlZCB3aXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSB0byBmb2xsb3cgdGhlIGRlc2NyaWJlZCBzdWZmaXggY29udmVudGlvbi4KCiAgVGhlIGFjdHVhbCB2YWx1ZSAoY29tcGFyYWJsZSB0byB0aGUgY29ycmVzcG9uZGluZyBmbG9hdC12YXJpYWJsZSBpbiB0aGUKICByZXNlYXJjaC1pbXBsZW1lbnRhdGlvbikgb2YgYSBtYW50aXNzYS9leHBvbmVudC1wYWlyIGNhbiBiZSBjYWxjdWxhdGVkIGFzCgogIFxmJCB2YWx1ZSA9IHZhbHVlXF9tICogMl57dmFsdWVcX2V9IFxmJAoKICBBbGwgZW5lcmdpZXMgYW5kIG5vaXNlIGxldmVscyBkZWNvZGVkIGZyb20gdGhlIGJpdHN0cmVhbSBzdWl0IGZvciBhbgogIG9yaWdpbmFsIHNpZ25hbCBtYWduaXR1ZGUgb2YgXGYkXHBtIDMyNzY4IFxmJCByYXRoZXIgdGhhbiBcZiQgXHBtIDFcZiQuIFRoZXJlZm9yZSwKICB0aGUgc2NhbGUgZmFjdG9yIDxlbT5oYl9zY2FsZTwvZW0+IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjb252ZXJ0ZWQKICB0byBhbiAnaW5wdXQgZXhwb25lbnQnICgjaW5wdXRfZSksIHdoaWNoIGZpdHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgoKICBCZWZvcmUgdGhlIGFjdHVhbCBwcm9jZXNzaW5nLCBhbiBleHBvbmVudCAjYWRqX2UgZm9yIHJlc3VsdGluZyBhZGp1c3RlZAogIHNhbXBsZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIHJlZmVyZW5jZSBlbmVyZ3kuCgogIFRoZW4sIGZvciBlYWNoIGVudmVsb3BlLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSBwZXJmb3JtZWQ6CgogIFxsaSBDYWxjdWxhdGUgZW5lcmd5IGluIHRoZSBzaWduYWwgdG8gYmUgYWRqdXN0ZWQuIERlcGVuZGluZyBvbiB0aGUgdGhlIHZhbHVlIG9mCiAgICAgICNpbnRlcnBvbEZyZXEgKGludGVycG9sYXRpb24gbW9kZSksIHRoaXMgaXMgZWl0aGVyIGRvbmUgc2VwZXJhdGVseQogICAgICBmb3IgZWFjaCBRTUYtc3ViYmFuZCBvciBmb3IgZWFjaCBTQlItYmFuZC4KICAgICAgVGhlIHJlc3VsdGluZyBlbmVyZ2llcyBhcmUgc3RvcmVkIGluICNucmdFc3RfbVsjTUFYX0ZSRVFfQ09FRkZTXSAobWFudGlzc2FzKQogICAgICBhbmQgI25yZ0VzdF9lWyNNQVhfRlJFUV9DT0VGRlNdIChleHBvbmVudHMpLgogIFxsaSBDYWxjdWxhdGUgZ2FpbiBhbmQgbm9pc2UgbGV2ZWwgZm9yIGVhY2ggc3ViYmFuZDo8YnI+CiAgICAgIFxmJCBnYWluICA9IFxzcXJ0eyBcZnJhY3tucmdSZWZ9e25yZ0VzdH0gXGNkb3QgKDEgLSBub2lzZVJhdGlvKSB9CiAgICAgICAgICBcaHNwYWNlezJjbX0KICAgICAgICAgIG5vaXNlID0gXHNxcnR7IG5yZ1JlZiBcY2RvdCBub2lzZVJhdGlvIH0KICAgICAgXGYkPGJyPgogICAgICB3aGVyZSA8ZW0+bm9pc2VSYXRpbzwvZW0+IGFuZCA8ZW0+bnJnUmVmPC9lbT4gYXJlIGV4dHJhY3RlZCBmcm9tIHRoZQogICAgICBiaXRzdHJlYW0gYW5kIDxlbT5ucmdFc3Q8L2VtPiBpcyB0aGUgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFkanVzdG1lbnQuCiAgICAgIFRoZSByZXN1bHRpbmcgZ2FpbnMgYXJlIHN0b3JlZCBpbiAjbnJnR2Fpbl9tWyNNQVhfRlJFUV9DT0VGRlNdCiAgICAgIChtYW50aXNzYXMpIGFuZCAjbnJnR2Fpbl9lWyNNQVhfRlJFUV9DT0VGRlNdIChleHBvbmVudHMpLCB0aGUgbm9pc2UgbGV2ZWxzCiAgICAgIGFyZSBzdG9yZWQgaW4gI25vaXNlTGV2ZWxfbVsjTUFYX0ZSRVFfQ09FRkZTXSBhbmQgI25vaXNlTGV2ZWxfZVsjTUFYX0ZSRVFfQ09FRkZTXQogICAgICAoZXhwb25lbnRzKS4KICAgICAgVGhlIHNpbmUgbGV2ZWxzIGFyZSBzdG9yZWQgaW4gI25yZ1NpbmVfbVsjTUFYX0ZSRVFfQ09FRkZTXQogICAgICBhbmQgI25yZ1NpbmVfZVsjTUFYX0ZSRVFfQ09FRkZTXS4KICBcbGkgTm9pc2UgbGltaXRpbmc6IFRoZSBnYWluIGZvciBlYWNoIHN1YmJhbmQgaXMgbGltaXRlZCBib3RoIGFic29sdXRlbHkKICAgICAgYW5kIHJlbGF0aXZlbHkgY29tcGFyZWQgdG8gdGhlIHRvdGFsIGdhaW4gb3ZlciBhbGwgc3ViYmFuZHMuCiAgXGxpIEJvb3N0IGdhaW46IENhbGN1bGF0ZSBhbmQgYXBwbHkgYm9vc3QgZmFjdG9yIGZvciBlYWNoIGxpbWl0ZXIgYmFuZAogICAgICBpbiBvcmRlciB0byBjb21wZW5zYXRlIGZvciB0aGUgZW5lcmd5IGxvc3MgaW1wb3NlZCBieSB0aGUgbGltaXRpbmcuCiAgXGxpIEFwcGx5IGdhaW5zIGFuZCBhZGQgbm9pc2U6IFRoZSBnYWlucyBhbmQgbm9pc2UgbGV2ZWxzIGFyZSBhcHBsaWVkCiAgICAgIHRvIGFsbCB0aW1lc2xvdHMgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUuIEEgc2hvcnQgRklSLWZpbHRlciAobGVuZ3RoIDQKICAgICAgUU1GLXRpbWVzbG90cykgY2FuIGJlIHVzZWQgdG8gc21vb3RoIHRoZSBzdWRkZW4gY2hhbmdlIGF0IHRoZSBlbnZlbG9wZSBib3JkZXJzLgogICAgICBFYWNoIGNvbXBsZXggc3ViYmFuZCBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgdGltZXNsb3QgaXMgbXVsdGlwbGllZCBieSB0aGUKICAgICAgc21vb3RoZWQgZ2FpbiwgdGhlbiByYW5kb20gbm9pc2Ugd2l0aCB0aGUgY2FsY3VsYXRlZCBsZXZlbCBpcyBhZGRlZC4KCiAgXG5vdGUKICBUbyByZWR1Y2UgdGhlIHN0YWNrIHNpemUsIHNvbWUgb2YgdGhlIGxvY2FsIGFycmF5cyBjb3VsZCBiZSBsb2NhdGVkIHdpdGhpbgogIHRoZSB0aW1lIG91dHB1dCBidWZmZXIuIE9mIHRoZSA1MTIgc2FtcGxlcyB0ZW1wb3JhcmlseSBhdmFpbGFibGUgdGhlcmUsCiAgYWJvdXQgaGFsZiB0aGUgc2l6ZSBpcyBhbHJlYWR5IHVzZWQgYnkgI1NCUl9GUkFNRV9EQVRBLiBBIHBvaW50ZXIgdG8gdGhlCiAgcmVtYWluaW5nIGZyZWUgbWVtb3J5IGNvdWxkIGJlIHN1cHBsaWVkIGJ5IGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQogIGluIHNicl9kZWM6CgogIFxwYXIKICBcY29kZQogICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKCZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dFB0ciArIHNpemVvZihTQlJfRlJBTUVfREFUQSkvc2l6ZW9mKEZsb2F0KSArIDEpOwogIFxlbmRjb2RlCgogIFxwYXIKICBXaXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgc29tZSBwb2ludGVycyBjb3VsZCBiZSBkZWZpbmVkIGluc3RlYWQgb2YgdGhlIGFycmF5cwogICNucmdSZWZfbSwgI25yZ1JlZl9lLCAjbnJnRXN0X20sICNucmdFc3RfZSwgI25vaXNlTGV2ZWxfbToKCiAgXHBhcgogIFxjb2RlCiAgICBmcmFjdCogICAgICAgIG5yZ1JlZl9tID0gdGltZU91dFB0cjsKICAgIFNDSEFSKiAgICAgICAgbnJnUmVmX2UgPSBucmdSZWZfbSArIE1BWF9GUkVRX0NPRUZGUzsKICAgIGZyYWN0KiAgICAgICAgbnJnRXN0X20gPSBucmdSZWZfZSArIE1BWF9GUkVRX0NPRUZGUzsKICAgIFNDSEFSKiAgICAgICAgbnJnRXN0X2UgPSBucmdFc3RfbSArIE1BWF9GUkVRX0NPRUZGUzsKICAgIGZyYWN0KiAgICAgICAgbm9pc2VMZXZlbF9tID0gbnJnRXN0X2UgKyBNQVhfRlJFUV9DT0VGRlM7CiAgXGVuZGNvZGUKCiAgPGJyPgoqLwp2b2lkCmNhbGN1bGF0ZVNickVudmVsb3BlIChRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsICAgICAgICAgICAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLwogICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwgLyohPCBIYW5kbGUgdG8gc3RydWN0IGZpbGxlZCBieSB0aGUgY3JlYXRlLWZ1bmN0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwgICAgICAgICAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVySW1hZywgICAgICAgICAgICAgICAgIC8qITwgSW1hZyBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXN0aW1hdGVkIGFsaWFzaW5nIGZvciBlYWNoIFFNRiBjaGFubmVsICovCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lRXJyb3JGbGFnCiAgICAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgYywgaSwgaiwgZW52Tm9pc2UgPSAwOwogIFVDSEFSKiAgIGJvcmRlcnMgPSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyczsKCiAgRklYUF9TR0wgKm5vaXNlTGV2ZWxzICAgICAgID0gaEZyYW1lRGF0YS0+c2JyTm9pc2VGbG9vckxldmVsOwogIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOwoKICBpbnQgbG93U3ViYmFuZCAgPSBoRnJlcS0+bG93U3ViYmFuZDsKICBpbnQgaGlnaFN1YmJhbmQgPSBoRnJlcS0+aGlnaFN1YmJhbmQ7CiAgaW50IG5vU3ViYmFuZHMgID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOwoKICBpbnQgICAgbm9Ob2lzZUJhbmRzID0gaEZyZXEtPm5OZmI7CiAgaW50ICAgIG5vX2NvbHMgICAgICA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CiAgVUNIQVIgIGZpcnN0X3N0YXJ0ICA9IGJvcmRlcnNbMF0gKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CgogIFNDSEFSICBzaW5lTWFwcGVkW01BWF9GUkVRX0NPRUZGU107CiAgU0NIQVIgIG92X2Fkal9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5vdl9oYl9zY2FsZSk7CiAgU0NIQVIgIGFkal9lID0gMDsKICBTQ0hBUiAgb3V0cHV0X2U7CiAgU0NIQVIgIGZpbmFsX2UgPSAwOwoKICBTQ0hBUiAgbWF4R2FpbkxpbWl0X2UgPSAoZnJhbWVFcnJvckZsYWcpID8gTUFYX0dBSU5fQ09OQ0VBTF9FWFAgOiBNQVhfR0FJTl9FWFA7CgogIGludCB1c2VBbGlhc1JlZHVjdGlvbls2NF07CiAgVUNIQVIgc21vb3RoX2xlbmd0aCA9IDA7CgogIEZJWFBfU0dMICogcEllbnYgPSBoRnJhbWVEYXRhLT5pRW52ZWxvcGU7CgogIC8qCiAgICBFeHRyYWN0IHNpbmUgZmxhZ3MgZm9yIGFsbCBRTUYgYmFuZHMKICAqLwogIG1hcFNpbmVGbGFncyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwKICAgICAgICAgICAgICAgaEZyZXEtPm5TZmJbMV0sCiAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljcywKICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldiwKICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYsCiAgICAgICAgICAgICAgIHNpbmVNYXBwZWQpOwoKCiAgLyoKICAgIFNjYW4gZm9yIG1heGltdW0gaW4gYnVmZmVyZCBub2lzZSBsZXZlbHMuCiAgICBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoYXQgd2UgaGFkIHN0cm9uZyBub2lzZSBpbiB0aGUgcHJldmlvdXMgZnJhbWUKICAgIHdoaWNoIGlzIHNtb290aGVkIGludG8gdGhlIGN1cnJlbnQgZnJhbWUuCiAgICBUaGUgcmVzdWx0aW5nIGV4cG9uZW50IGlzIHVzZWQgYXMgc3RhcnQgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHNlYXJjaAogICAgaW4gcmVmZXJlbmNlIGVuZXJnaWVzCiAgKi8KICBpZiAoIXVzZUxQKQogICAgYWRqX2UgPSBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIGdldFNjYWxlZmFjdG9yKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgbm9TdWJiYW5kcyk7CgogIC8qCiAgICBTY2FuIGZvciBtYXhpbXVtIHJlZmVyZW5jZSBlbmVyZ3kgdG8gYmUgYWJsZQogICAgdG8gc2VsZWN0IGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgYWRqX2UgYW5kIGZpbmFsX2UuCiAgKi8KCiAgZm9yIChpID0gMDsgaSA8IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKICAgIElOVCBtYXhTZmJOcmdfZSA9IC1GUkFDVF9CSVRTK05SR19FWFBfT0ZGU0VUOyAvKiBzdGFydCB2YWx1ZSBmb3IgbWF4aW11bSBzZWFyY2ggKi8KCiAgICAvKiBGZXRjaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZTogKi8KICAgIGZvciAoaj1oRnJlcS0+blNmYltoRnJhbWVEYXRhLT5mcmFtZUluZm8uZnJlcVJlc1tpXV07IGohPTA7IGotLSkgewogICAgICBtYXhTZmJOcmdfZSA9IGZpeE1heChtYXhTZmJOcmdfZSwoSU5UKSgoTE9ORykoKnBJZW52KyspICYgTUFTS19FKSk7CiAgICB9CiAgICBtYXhTZmJOcmdfZSAtPSBOUkdfRVhQX09GRlNFVDsKCiAgICAvKiBFbmVyZ3kgLT4gbWFnbml0dWRlIChzcXJ0IGhhbGZlbnMgZXhwb25lbnQpICovCiAgICBtYXhTZmJOcmdfZSA9IChtYXhTZmJOcmdfZSsxKSA+PiAxOyAgLyogKzEgdG8gZ28gc2FmZSAocm91bmQgdG8gbmV4dCBoaWdoZXIgaW50KSAqLwoKICAgIC8qIFNvbWUgc2FmZXR5IG1hcmdpbiBpcyBuZWVkZWQgZm9yIDIgcmVhc29uczoKICAgICAgIC0gVGhlIHNpZ25hbCBlbmVyZ3kgaXMgbm90IGVxdWFsbHkgc3ByZWFkIG92ZXIgYWxsIHN1YmJhbmQgc2FtcGxlcyBpbgogICAgICAgICBhIHNwZWNpZmljIHNmYiBvZiBhbiBlbnZlbG9wZSAoTnJnIGNvdWxkIGJlIHRvbyBoaWdoIGJ5IGEgZmFjdG9yIG9mCiAgICAgICAgIGVudldpZHRoICogc2ZiV2lkdGgpCiAgICAgICAtIFNtb290aGluZyBjYW4gc21lYXIgaGlnaCBnYWlucyBvZiB0aGUgcHJldmlvdXMgZW52ZWxvcGUgaW50byB0aGUgY3VycmVudAogICAgKi8KICAgIG1heFNmYk5yZ19lICs9IDY7CgogICAgaWYgKGJvcmRlcnNbaV0gPCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKQogICAgICAvKiBUaGlzIGVudmVsb3BlIGFmZmVjdHMgdGltZXNsb3RzIHRoYXQgYmVsb25nIHRvIHRoZSBvdXRwdXQgZnJhbWUgKi8KICAgICAgYWRqX2UgPSAobWF4U2ZiTnJnX2UgPiBhZGpfZSkgPyBtYXhTZmJOcmdfZSA6IGFkal9lOwoKICAgIGlmIChib3JkZXJzW2krMV0gPiBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKQogICAgICAvKiBUaGlzIGVudmVsb3BlIGFmZmVjdHMgdGltZXNsb3RzIGFmdGVyIHRoZSBvdXRwdXQgZnJhbWUgKi8KICAgICAgZmluYWxfZSA9ICAobWF4U2ZiTnJnX2UgPiBmaW5hbF9lKSA/IG1heFNmYk5yZ19lIDogZmluYWxfZTsKCiAgfQoKICAvKgogICAgQ2FsY3VsYXRlIGFkanVzdG1lbnQgZmFjdG9ycyBhbmQgYXBwbHkgdGhlbSBmb3IgZXZlcnkgZW52ZWxvcGUuCiAgKi8KICBwSWVudiA9IGhGcmFtZURhdGEtPmlFbnZlbG9wZTsKCiAgZm9yIChpID0gMDsgaSA8IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKCiAgICBpbnQgaywgbm9Ob2lzZUZsYWc7CiAgICBTQ0hBUiAgbm9pc2VfZSwgaW5wdXRfZSA9IFNDQUxFMkVYUChzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUpOwogICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBOcmdzLCBFTlZfQ0FMQ19OUkdTLCAxKTsKCiAgICAvKgogICAgICBIZWxwZXIgdmFyaWFibGVzLgogICAgKi8KICAgIFVDSEFSIHN0YXJ0X3BvcyA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqIGJvcmRlcnNbaV07ICAvKiBTdGFydC1wb3NpdGlvbiBpbiB0aW1lIChzdWJiYW5kIHNhbXBsZSkgZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCiAgICBVQ0hBUiBzdG9wX3BvcyA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqIGJvcmRlcnNbaSsxXTsgLyogU3RvcC1wb3NpdGlvbiBpbiB0aW1lIChzdWJiYW5kIHNhbXBsZSkgZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCiAgICBVQ0hBUiBmcmVxX3JlcyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldOyAgICAgLyogRnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCgoKICAgIC8qIEFsd2F5cyBkbyBmdWxseSBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgZW5lcmd5IHRhYmxlLiBUaGlzIHByZXZlbnRzIG5lZ2F0aXZlIGVuZXJnaWVzIGFuZCBleHRyZW1lIGdhaW4gZmFjdG9ycyBpbgogICAgICAgY2FzZXMgd2hlcmUgdGhlIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBzdWJiYW5kcy4gVGhlIGxhdHRlciBjYW4gYmUgY2F1c2VkIGJ5IHVuZGV0ZWN0ZWQgYml0CiAgICAgICBlcnJvcnMgYW5kIGlzIHRlc3RlZCBieSBzb21lIHN0cmVhbXMgZnJvbSB0aGUgY2VydGlmaWNhdGlvbiBzZXQuICovCiAgICBGREttZW1jbGVhcihwTnJncywgc2l6ZW9mKEVOVl9DQUxDX05SR1MpKTsKCiAgICAvKiBJZiB0aGUgc3RhcnQtcG9zIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlIGVxdWFscyB0aGUgc3RvcCBwb3Mgb2YgdGhlIGN1cnJlbnQKICAgICAgIG5vaXNlIGVudmVsb3BlLCBpbmNyZWFzZSB0aGUgcG9pbnRlciAoaS5lLiBjaG9vc2UgdGhlIG5leHQgbm9pc2UtZmxvb3IpLiovCiAgICBpZiAoYm9yZGVyc1tpXSA9PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlW2Vudk5vaXNlKzFdKXsKICAgICAgbm9pc2VMZXZlbHMgKz0gbm9Ob2lzZUJhbmRzOyAgIC8qIFRoZSBub2lzZSBmbG9vciBkYXRhIGlzIHN0b3JlZCBpbiBhIHJvdyBbbm9pc2VGbG9vcjEgbm9pc2VGbG9vcjIuLi5dLiovCiAgICAgIGVudk5vaXNlKys7CiAgICB9CgogICAgaWYoaT09aEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgfHwgaT09aF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYpIC8qIGF0dGFjayAqLwogICAgewogICAgICBub05vaXNlRmxhZyA9IDE7CiAgICAgIGlmICghdXNlTFApCiAgICAgICAgc21vb3RoX2xlbmd0aCA9IDA7ICAvKiBObyBzbW9vdGhpbmcgb24gYXR0YWNrcyEgKi8KICAgIH0KICAgIGVsc2UgewogICAgICBub05vaXNlRmxhZyA9IDA7CiAgICAgIGlmICghdXNlTFApCiAgICAgICAgc21vb3RoX2xlbmd0aCA9ICgxIC0gaEhlYWRlckRhdGEtPmJzX2RhdGEuc21vb3RoaW5nTGVuZ3RoKSA8PCAyOyAgLyogY2FuIGJlY29tZSBlaXRoZXIgMCBvciA0ICovCiAgICB9CgoKICAgIC8qCiAgICAgIEVuZXJneSBlc3RpbWF0aW9uIGluIHRyYW5zcG9zZWQgaGlnaGJhbmQuCiAgICAqLwogICAgaWYgKGhIZWFkZXJEYXRhLT5ic19kYXRhLmludGVycG9sRnJlcSkKICAgICAgY2FsY05yZ1BlclN1YmJhbmQoYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBzdG9wX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdF9lKTsKICAgIGVsc2UKICAgICAgY2FsY05yZ1BlclNmYihhbmFseXNCdWZmZXJSZWFsLAogICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICBoRnJlcS0+blNmYltmcmVxX3Jlc10sCiAgICAgICAgICAgICAgICAgICAgaEZyZXEtPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0X3Bvcywgc3RvcF9wb3MsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0LAogICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3RfZSk7CgogICAgLyoKICAgICAgQ2FsY3VsYXRlIHN1YmJhbmQgZ2FpbnMKICAgICovCiAgICB7CiAgICAgIFVDSEFSICogdGFibGUgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc107CiAgICAgIFVDSEFSICogcFVpTm9pc2UgPSAmaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZVsxXTsgLyohIFVwcGVyIGxpbWl0IG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yIGJhbmQuICovCgogICAgICBGSVhQX1NHTCAqIHBOb2lzZUxldmVscyA9IG5vaXNlTGV2ZWxzOwoKICAgICAgRklYUF9EQkwgdG1wTm9pc2UgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7CiAgICAgIFNDSEFSICAgIHRtcE5vaXNlX2UgPSAoVUNIQVIpKChMT05HKSgqcE5vaXNlTGV2ZWxzKyspICYgTUFTS19FKSAtIE5PSVNFX0VYUF9PRkZTRVQ7CgogICAgICBpbnQgY2MgPSAwOwogICAgICBjID0gMDsKICAgICAgZm9yIChqID0gMDsgaiA8IGhGcmVxLT5uU2ZiW2ZyZXFfcmVzXTsgaisrKSB7CgogICAgICAgIEZJWFBfREJMIHJlZk5yZyAgID0gRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcEllbnYpICYgTUFTS19NKSk7CiAgICAgICAgU0NIQVIgICAgcmVmTnJnX2UgPSAoU0NIQVIpKChMT05HKSgqcEllbnYpICYgTUFTS19FKSAtIE5SR19FWFBfT0ZGU0VUOwoKICAgICAgICBVQ0hBUiBzaW5lUHJlc2VudEZsYWcgPSAwOwogICAgICAgIGludCBsaSA9IHRhYmxlW2pdOwogICAgICAgIGludCB1aSA9IHRhYmxlW2orMV07CgogICAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7CiAgICAgICAgICBzaW5lUHJlc2VudEZsYWcgfD0gKGkgPj0gc2luZU1hcHBlZFtjY10pOwogICAgICAgICAgY2MrKzsKICAgICAgICB9CgogICAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7CiAgICAgICAgICBpZiAoayA+PSAqcFVpTm9pc2UpIHsKICAgICAgICAgICAgdG1wTm9pc2UgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7CiAgICAgICAgICAgIHRtcE5vaXNlX2UgPSAoU0NIQVIpKChMT05HKSgqcE5vaXNlTGV2ZWxzKyspICYgTUFTS19FKSAtIE5PSVNFX0VYUF9PRkZTRVQ7CgogICAgICAgICAgICBwVWlOb2lzZSsrOwogICAgICAgICAgfQoKICAgICAgICAgIEZES19BU1NFUlQoayA+PSBsb3dTdWJiYW5kKTsKCiAgICAgICAgICBpZiAodXNlTFApCiAgICAgICAgICAgIHVzZUFsaWFzUmVkdWN0aW9uW2stbG93U3ViYmFuZF0gPSAhc2luZVByZXNlbnRGbGFnOwoKICAgICAgICAgIHBOcmdzLT5ucmdTaW5lW2NdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICBwTnJncy0+bnJnU2luZV9lW2NdID0gMDsKCiAgICAgICAgICBjYWxjU3ViYmFuZEdhaW4ocmVmTnJnLCByZWZOcmdfZSwgcE5yZ3MsIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wTm9pc2UsIHRtcE5vaXNlX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZVByZXNlbnRGbGFnLCBpID49IHNpbmVNYXBwZWRbY10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcpOwoKICAgICAgICAgIHBOcmdzLT5ucmdSZWZbY10gICA9IHJlZk5yZzsKICAgICAgICAgIHBOcmdzLT5ucmdSZWZfZVtjXSA9IHJlZk5yZ19lOwoKICAgICAgICAgIGMrKzsKICAgICAgICB9CiAgICAgICAgcEllbnYrKzsKICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgIE5vaXNlIGxpbWl0aW5nCiAgICAqLwoKICAgIGZvciAoYyA9IDA7IGMgPCBoRnJlcS0+bm9MaW1pdGVyQmFuZHM7IGMrKykgewoKICAgICAgRklYUF9EQkwgc3VtUmVmLCBib29zdEdhaW4sIG1heEdhaW47CiAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgU0NIQVIgICBzdW1SZWZfZSwgYm9vc3RHYWluX2UsIG1heEdhaW5fZSwgYWNjdV9lID0gMDsKCiAgICAgIGNhbGNBdmdHYWluKHBOcmdzLAogICAgICAgICAgICAgICAgICBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXSwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYysxXSwKICAgICAgICAgICAgICAgICAgJnN1bVJlZiwgJnN1bVJlZl9lLAogICAgICAgICAgICAgICAgICAmbWF4R2FpbiwgJm1heEdhaW5fZSk7CgogICAgICAvKiBNdWx0aXBseSBtYXhHYWluIHdpdGggbGltaXRlckdhaW46ICovCiAgICAgIG1heEdhaW4gPSBmTXVsdChtYXhHYWluLCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdKTsKICAgICAgbWF4R2Fpbl9lICs9IEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19lW2hIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWluc107CgogICAgICAvKiBTY2FsZSBtYW50aXNzYSBvZiBNYXhHYWluIGludG8gcmFuZ2UgYmV0d2VlbiAwLjUgYW5kIDE6ICovCiAgICAgIGlmIChtYXhHYWluID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICAgIG1heEdhaW5fZSA9IC1GUkFDVF9CSVRTOwogICAgICBlbHNlIHsKICAgICAgICBTQ0hBUiBjaGFyVGVtcCA9IENvdW50TGVhZGluZ0JpdHMobWF4R2Fpbik7CiAgICAgICAgbWF4R2Fpbl9lIC09IGNoYXJUZW1wOwogICAgICAgIG1heEdhaW4gIDw8PSAoaW50KWNoYXJUZW1wOwogICAgICB9CgogICAgICBpZiAobWF4R2Fpbl9lID49IG1heEdhaW5MaW1pdF9lKSB7IC8qIHVwcGVyIGxpbWl0IChlLmcuIDk2IGRCKSAqLwogICAgICAgIG1heEdhaW4gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgICAgICBtYXhHYWluX2UgPSBtYXhHYWluTGltaXRfZTsKICAgICAgfQoKCiAgICAgIC8qIEV2ZXJ5IHN1YmJhbmQgZ2FpbiBpcyBjb21wYXJlZCB0byB0aGUgc2NhbGVkICJhdmVyYWdlIGdhaW4iCiAgICAgICAgIGFuZCBsaW1pdGVkIGlmIG5lY2Vzc2FyeTogKi8KICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjKzFdOyBrKyspIHsKICAgICAgICBpZiAoIChwTnJncy0+bnJnR2Fpbl9lW2tdID4gbWF4R2Fpbl9lKSB8fCAocE5yZ3MtPm5yZ0dhaW5fZVtrXSA9PSBtYXhHYWluX2UgJiYgcE5yZ3MtPm5yZ0dhaW5ba10+bWF4R2FpbikgKSB7CgogICAgICAgICAgRklYUF9EQkwgbm9pc2VBbXA7CiAgICAgICAgICBTQ0hBUiAgICBub2lzZUFtcF9lOwoKICAgICAgICAgIEZES19kaXZpZGVfTWFudEV4cChtYXhHYWluLCBtYXhHYWluX2UsIHBOcmdzLT5ucmdHYWluW2tdLCBwTnJncy0+bnJnR2Fpbl9lW2tdLCAmbm9pc2VBbXAsICZub2lzZUFtcF9lKTsKICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICAgID0gZk11bHQocE5yZ3MtPm5vaXNlTGV2ZWxba10sbm9pc2VBbXApOwogICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSArPSBub2lzZUFtcF9lOwogICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gICAgICAgPSBtYXhHYWluOwogICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSAgICAgPSBtYXhHYWluX2U7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiAtLSBCb29zdCBnYWluCiAgICAgICAgQ2FsY3VsYXRlIGFuZCBhcHBseSBib29zdCBmYWN0b3IgZm9yIGVhY2ggbGltaXRlciBiYW5kOgogICAgICAgIDEuIENoZWNrIGhvdyBtdWNoIGVuZXJneSB3b3VsZCBiZSBwcmVzZW50IHdoZW4gdXNpbmcgdGhlIGxpbWl0ZWQgZ2FpbgogICAgICAgIDIuIENhbGN1bGF0ZSBib29zdCBmYWN0b3IgYnkgY29tcGFyaXNvbiB3aXRoIHJlZmVyZW5jZSBlbmVyZ3kKICAgICAgICAzLiBBcHBseSBib29zdCBmYWN0b3IgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGVuZXJneSBsb3NzIGR1ZSB0byBsaW1pdGluZwogICAgICAqLwogICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MgKyAxXTsgaysrKSB7CgogICAgICAgIC8qIDEuYSAgQWRkIGVuZXJneSBvZiBhZGp1c3RlZCBzaWduYWwgKHVzaW5nIHByZWxpbWluYXJ5IGdhaW4pICovCiAgICAgICAgRklYUF9EQkwgIHRtcCAgID0gZk11bHQocE5yZ3MtPm5yZ0dhaW5ba10scE5yZ3MtPm5yZ0VzdFtrXSk7CiAgICAgICAgU0NIQVIgICAgIHRtcF9lID0gcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIHBOcmdzLT5ucmdFc3RfZVtrXTsKICAgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgYWNjdSwgYWNjdV9lLCAmYWNjdSwgJmFjY3VfZSk7CgogICAgICAgIC8qIDEuYiAgQWRkIHNpbmUgZW5lcmd5IChpZiBwcmVzZW50KSAqLwogICAgICAgIGlmKHBOcmdzLT5ucmdTaW5lW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5yZ1NpbmVba10sIHBOcmdzLT5ucmdTaW5lX2Vba10sIGFjY3UsIGFjY3VfZSwgJmFjY3UsICZhY2N1X2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8qIDEuYyAgQWRkIG5vaXNlIGVuZXJneSAoaWYgcHJlc2VudCkgKi8KICAgICAgICAgIGlmKG5vTm9pc2VGbGFnID09IDApIHsKICAgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ub2lzZUxldmVsW2tdLCBwTnJncy0+bm9pc2VMZXZlbF9lW2tdLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIDIuYSAgQ2FsY3VsYXRlIHJhdGlvIG9mIHdhbnRlZCBlbmVyZ3kgYW5kIGFjY3VtdWxhdGVkIGVuZXJneSAqLwogICAgICBpZiAoYWNjdSA9PSAoRklYUF9EQkwpMCkgeyAvKiBJZiBkaXZpc29yIGlzIDAsIGxpbWl0IHF1b3RpZW50IHRvICs0IGRCICovCiAgICAgICAgYm9vc3RHYWluID0gRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2Zik7CiAgICAgICAgYm9vc3RHYWluX2UgPSAyOwogICAgICB9IGVsc2UgewogICAgICAgIElOVCBkaXZfZTsKICAgICAgICBib29zdEdhaW4gPSBmRGl2Tm9ybShzdW1SZWYsIGFjY3UsICZkaXZfZSk7CiAgICAgICAgYm9vc3RHYWluX2UgPSBzdW1SZWZfZSAtIGFjY3VfZSArIGRpdl9lOwogICAgICB9CgoKICAgICAgLyogMi5iIFJlc3VsdCB0b28gaGlnaD8gLS0+IExpbWl0IHRoZSBib29zdCBmYWN0b3IgdG8gKzQgZEIgKi8KICAgICAgaWYoKGJvb3N0R2Fpbl9lICA+IDMpIHx8CiAgICAgICAgIChib29zdEdhaW5fZSA9PSAyICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNmYpKSB8fAogICAgICAgICAoYm9vc3RHYWluX2UgPT0gMyAmJiBib29zdEdhaW4gPiBGTDJGWENPTlNUX0RCTCgwLjMxMzk4NThmKSkgKQogICAgICB7CiAgICAgICAgYm9vc3RHYWluID0gRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2Zik7CiAgICAgICAgYm9vc3RHYWluX2UgPSAyOwogICAgICB9CiAgICAgIC8qIDMuICBNdWx0aXBseSBhbGwgc2lnbmFsIGNvbXBvbmVudHMgd2l0aCB0aGUgYm9vc3QgZmFjdG9yICovCiAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOyBrKyspIHsKICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgID0gZk11bHREaXYyKHBOcmdzLT5ucmdHYWluW2tdLGJvb3N0R2Fpbik7CiAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSA9IHBOcmdzLT5ucmdHYWluX2Vba10gKyBib29zdEdhaW5fZSArIDE7CgogICAgICAgIHBOcmdzLT5ucmdTaW5lW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5yZ1NpbmVba10sYm9vc3RHYWluKTsKICAgICAgICBwTnJncy0+bnJnU2luZV9lW2tdID0gcE5yZ3MtPm5yZ1NpbmVfZVtrXSArIGJvb3N0R2Fpbl9lICsgMTsKCiAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gICA9IGZNdWx0RGl2MihwTnJncy0+bm9pc2VMZXZlbFtrXSxib29zdEdhaW4pOwogICAgICAgIHBOcmdzLT5ub2lzZUxldmVsX2Vba10gPSBwTnJncy0+bm9pc2VMZXZlbF9lW2tdICsgYm9vc3RHYWluX2UgKyAxOwogICAgICB9CiAgICB9CiAgICAvKiBFbmQgb2Ygbm9pc2UgbGltaXRpbmcgKi8KCiAgICBpZiAodXNlTFApCiAgICAgIGFsaWFzaW5nUmVkdWN0aW9uKGRlZ3JlZUFsaWFzK2xvd1N1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VBbGlhc1JlZHVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyk7CgogICAgLyogRm9yIHRoZSB0aW1lc2xvdHMgd2l0aGluIHRoZSByYW5nZSBmb3IgdGhlIG91dHB1dCBmcmFtZSwKICAgICAgIHVzZSB0aGUgc2FtZSBzY2FsZSBmb3IgdGhlIG5vaXNlIGxldmVscy4KICAgICAgIERyYXdiYWNrOiBJZiB0aGUgZW52ZWxvcGUgZXhjZWVkcyB0aGUgZnJhbWUgYm9yZGVyLCB0aGUgbm9pc2UgbGV2ZWxzCiAgICAgICAgICAgICAgICAgd2lsbCBoYXZlIHRvIGJlIHJlc2NhbGVkIGxhdGVyIHRvIGZpdCBmaW5hbF9lIG9mCiAgICAgICAgICAgICAgICAgdGhlIGdhaW4tdmFsdWVzLgogICAgKi8KICAgIG5vaXNlX2UgPSAoc3RhcnRfcG9zIDwgbm9fY29scykgPyBhZGpfZSA6IGZpbmFsX2U7CgogICAgLyoKICAgICAgQ29udmVydCBlbmVyZ2llcyB0byBhbXBsaXR1ZGUgbGV2ZWxzCiAgICAqLwogICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CiAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ucmdTaW5lW2tdLCAgICAmcE5yZ3MtPm5yZ1NpbmVfZVtrXSwgICAgJm5vaXNlX2UpOwogICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bnJnR2FpbltrXSwgICAgJnBOcmdzLT5ucmdHYWluX2Vba10sICAgICZwTnJncy0+bnJnR2Fpbl9lW2tdKTsKICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5vaXNlTGV2ZWxba10sICZwTnJncy0+bm9pc2VMZXZlbF9lW2tdLCAmbm9pc2VfZSk7CiAgICB9CgoKCiAgICAvKgogICAgICBBcHBseSBjYWxjdWxhdGVkIGdhaW5zIGFuZCBhZGFwdGl2ZSBub2lzZQogICAgKi8KCiAgICAvKiBhc3NlbWJsZUhmU2lnbmFscygpICovCiAgICB7CiAgICAgIGludCBzY2FsZV9jaGFuZ2UsIHNjX2NoYW5nZTsKICAgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvOwogICAgICBpbnQgZmlsdEJ1ZmZlck5vaXNlU2hpZnQ9MDsKCiAgICAgIC8qIEluaXRpYWxpemUgc21vb3RoaW5nIGJ1ZmZlcnMgd2l0aCB0aGUgZmlyc3QgdmFsaWQgdmFsdWVzICovCiAgICAgIGlmIChoX3Nicl9jYWxfZW52LT5zdGFydFVwKQogICAgICB7CiAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSBub2lzZV9lOwoKICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAgIHBOcmdzLT5ucmdHYWluX2UsICBub1N1YmJhbmRzKnNpemVvZihTQ0hBUikpOwogICAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgcE5yZ3MtPm5vaXNlTGV2ZWwsIG5vU3ViYmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgICAgICBwTnJncy0+bnJnR2FpbiwgICAgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKCiAgICAgICAgfQogICAgICAgIGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXAgPSAwOwogICAgICB9CgogICAgICBpZiAoIXVzZUxQKSB7CgogICAgICAgIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAvKiBidWZmZXJlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAvKiBidWZmZXJlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbiwgICAgICAgICAgICAgICAvKiBjdXJyZW50ICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lLCAgICAgICAgICAgICAvKiBjdXJyZW50ICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzKTsKCiAgICAgICAgLyogQWRhcHQgZXhwb25lbnQgb2YgYnVmZmVyZWQgbm9pc2UgbGV2ZWxzIHRvIHRoZSBjdXJyZW50IGV4cG9uZW50CiAgICAgICAgICAgc28gdGhleSBjYW4gZWFzaWx5IGJlIHNtb290aGVkICovCiAgICAgICAgaWYoKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSk+PTApIHsKICAgICAgICAgIGludCBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLChpbnQpKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkpOwogICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKQogICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gPDw9IHNoaWZ0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGludCBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLC0oaW50KShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpKTsKICAgICAgICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykKICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdID4+PSBzaGlmdDsKICAgICAgICB9CgogICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0gbm9pc2VfZTsKICAgICAgfQoKICAgICAgLyogZmluZCBiZXN0IHNjYWxpbmchICovCiAgICAgIHNjYWxlX2NoYW5nZSA9IC0oREZSQUNUX0JJVFMtMSk7CiAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgewogICAgICAgICAgc2NhbGVfY2hhbmdlID0gZml4TWF4KHNjYWxlX2NoYW5nZSwoaW50KXBOcmdzLT5ucmdHYWluX2Vba10pOwogICAgICB9CiAgICAgIHNjX2NoYW5nZSA9IChzdGFydF9wb3M8bm9fY29scyk/IGFkal9lIC0gaW5wdXRfZSA6IGZpbmFsX2UgLSBpbnB1dF9lOwoKICAgICAgaWYgKChzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKzEpPDApCiAgICAgICAgICBzY2FsZV9jaGFuZ2UtPShzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKzEpOwoKICAgICAgc2NhbGVfY2hhbmdlID0gKHNjYWxlX2NoYW5nZS1zY19jaGFuZ2UpKzE7CgogICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKICAgICAgICAgIGludCBzYyA9IHNjYWxlX2NoYW5nZS1wTnJncy0+bnJnR2Fpbl9lW2tdICsgKHNjX2NoYW5nZS0xKTsKICAgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICA+Pj0gc2M7CiAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IHNjOwogICAgICB9CgogICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7CiAgICAgICAgICBpbnQgc2MgPSBzY2FsZV9jaGFuZ2UtaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lW2tdICsgKHNjX2NoYW5nZS0xKTsKICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IHNjOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yIChqID0gc3RhcnRfcG9zOyBqIDwgc3RvcF9wb3M7IGorKykKICAgICAgewogICAgICAgIC8qIFRoaXMgdGltZXNsb3QgaXMgbG9jYXRlZCB3aXRoaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHByb2Nlc3NpbmcgYnVmZmVyCiAgICAgICAgICAgYW5kIHdpbGwgYmUgZmVkIGludG8gdGhlIFFNRi1zeW50aGVzaXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgogICAgICAgICAgICAgICBhZGpfZSAtIGlucHV0X2UKICAgICAgICAgICBUaGlzIHRpbWVzbG90IHdpbGwgbm90IHlldCBiZSBmZWQgaW50byB0aGUgUU1GIHNvIHdlIGRvIG5vdCBjYXJlCiAgICAgICAgICAgYWJvdXQgdGhlIGFkal9lLgogICAgICAgICAgICAgICBzY19jaGFuZ2UgPSBmaW5hbF9lIC0gaW5wdXRfZQogICAgICAgICovCiAgICAgICAgaWYgKCAoaj09bm9fY29scykgJiYgKHN0YXJ0X3Bvczxub19jb2xzKSApCiAgICAgICAgewogICAgICAgICAgaW50IHNoaWZ0ID0gKGludCkgKG5vaXNlX2UgLSBmaW5hbF9lKTsKICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0ID0gc2hpZnQ7ICAgICAgICAgICAgICAgLyogc2hpZnRpbmcgb2YgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdIHdpbGwgYmUgYXBwbGllZCBpbiBmdW5jdGlvbiBhZGp1c3RUaW1lU2xvdEhRKCkgKi8KICAgICAgICAgIGlmIChzaGlmdD49MCkgewogICAgICAgICAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KTsKICAgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CiAgICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPDw9IHNoaWZ0OwogICAgICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICA8PD0gc2hpZnQ7CiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBpZiAoIXVzZUxQKQogICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdICA8PD0gc2hpZnQ7CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLXNoaWZ0KTsKICAgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CiAgICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPj49IHNoaWZ0OwogICAgICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICA+Pj0gc2hpZnQ7CiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBpZiAoIXVzZUxQKQogICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdICA+Pj0gc2hpZnQ7CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8qIHVwZGF0ZSBub2lzZSBzY2FsaW5nICovCiAgICAgICAgICBub2lzZV9lID0gZmluYWxfZTsKICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0gbm9pc2VfZTsgIC8qIHNjYWxpbmcgdmFsdWUgdW51c2VkISAqLwoKICAgICAgICAgIC8qIHVwZGF0ZSBnYWluIGJ1ZmZlciovCiAgICAgICAgICBzY19jaGFuZ2UgLT0gKGZpbmFsX2UgLSBpbnB1dF9lKTsKCiAgICAgICAgICBpZiAoc2NfY2hhbmdlPDApIHsKICAgICAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7CiAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgPj49IC1zY19jaGFuZ2U7CiAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IC1zY19jaGFuZ2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgewogICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IC1zY19jaGFuZ2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzY2FsZV9jaGFuZ2UrPXNjX2NoYW5nZTsKICAgICAgICAgIH0KCiAgICAgICAgfSAvLyBpZgoKICAgICAgICBpZiAoIXVzZUxQKSB7CgogICAgICAgICAgLyogUHJldmVudCB0aGUgc21vb3RoaW5nIGZpbHRlciBmcm9tIHJ1bm5pbmcgb24gY29uc3RhbnQgbGV2ZWxzICovCiAgICAgICAgICBpZiAoai1zdGFydF9wb3MgPCBzbW9vdGhfbGVuZ3RoKQogICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGREtfc2JyRGVjb2Rlcl9zYnJfc21vb3RoRmlsdGVyW2otc3RhcnRfcG9zXTsKCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHNtb290aF9yYXRpbyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICAgICAgICAgIGFkanVzdFRpbWVTbG90SFEoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmFseXNCdWZmZXJJbWFnW2pdW2xvd1N1YmJhbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpKTsKICAgICAgICB9CiAgICAgIH0gLy8gZm9yCgogICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgLyogVXBkYXRlIHRpbWUtc21vb3RoaW5nLWJ1ZmZlcnMgZm9yIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMKICAgICAgICAgICBUaGUgZ2FpbnMgYW5kIHRoZSBub2lzZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUgYXJlIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuCiAgICAgICAgICAgVGhpcyBoYXMgdG8gYmUgZG9uZSBhdCB0aGUgZW5kIG9mIGVhY2ggZW52ZWxvcGUgYXMgdGhlIHZhbHVlcyBhcmUgcmVxdWlyZWQgZm9yCiAgICAgICAgICAgYSBzbW9vdGggdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBlbnZlbG9wZS4gKi8KICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgICAgICBwTnJncy0+bnJnR2FpbiwgICAgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lLCAgICBwTnJncy0+bnJnR2Fpbl9lLCAgbm9TdWJiYW5kcypzaXplb2YoU0NIQVIpKTsKICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKICAgICAgfQoKICAgIH0KICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocE5yZ3MsIEVOVl9DQUxDX05SR1MsIDEpOwogIH0KCiAgLyogUmVzY2FsZSBvdXRwdXQgc2FtcGxlcyAqLwogIHsKICAgIEZJWFBfREJMIG1heFZhbDsKICAgIGludCBvdl9yZXNlcnZlLCByZXNlcnZlOwoKICAgIC8qIERldGVybWluZSBoZWFkcm9vbSBpbiBvbGQgYWRqdXN0ZWQgc2FtcGxlcyAqLwogICAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3N0YXJ0KTsKCiAgICBvdl9yZXNlcnZlID0gZk5vcm0obWF4VmFsKTsKCiAgICAvKiBEZXRlcm1pbmUgaGVhZHJvb20gaW4gbmV3IGFkanVzdGVkIHNhbXBsZXMgKi8KICAgIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIGFuYWx5c0J1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2NvbHMpOwoKICAgIHJlc2VydmUgPSBmTm9ybShtYXhWYWwpOwoKICAgIC8qIERldGVybWluZSBjb21tb24gb3V0cHV0IGV4cG9uZW50ICovCiAgICBpZiAob3ZfYWRqX2UgLSBvdl9yZXNlcnZlICA+ICBhZGpfZSAtIHJlc2VydmUgKSAvKiBzZXQgb3V0cHV0X2UgdG8gdGhlIG1heGltdW0gKi8KICAgICAgb3V0cHV0X2UgPSBvdl9hZGpfZSAtIG92X3Jlc2VydmU7CiAgICBlbHNlCiAgICAgIG91dHB1dF9lID0gYWRqX2UgLSByZXNlcnZlOwoKICAgIC8qIFJlc2NhbGUgb2xkIHNhbXBsZXMgKi8KICAgIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyggYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmlyc3Rfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG92X2Fkal9lIC0gb3V0cHV0X2UpOwoKICAgIC8qIFJlc2NhbGUgbmV3IHNhbXBsZXMgKi8KICAgIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyggYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc3RhcnQsIG5vX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkal9lIC0gb3V0cHV0X2UpOwogIH0KCiAgLyogVXBkYXRlIGhiX3NjYWxlICovCiAgc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlID0gRVhQMlNDQUxFKG91dHB1dF9lKTsKCiAgLyogU2F2ZSB0aGUgY3VycmVudCBmaW5hbCBleHBvbmVudCBmb3IgdGhlIG5leHQgZnJhbWU6ICovCiAgc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlID0gRVhQMlNDQUxFKGZpbmFsX2UpOwoKCiAgLyogV2UgbmVlZCB0byByZW1lYmVyIHRvIHRoZSBuZXh0IGZyYW1lIHRoYXQgdGhlIHRyYW5zaWVudAogICAgIHdpbGwgb2NjdXIgaW4gdGhlIGZpcnN0IGVudmVsb3BlIChpZiB0cmFuRW52ID09IG5FbnZlbG9wZXMpLiAqLwogIGlmKGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52ID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzKQogICAgaF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYgPSAwOwogIGVsc2UKICAgIGhfc2JyX2NhbF9lbnYtPnByZXZUcmFuRW52ID0gLTE7Cgp9CgoKLyohCiAgXGJyaWVmICAgQ3JlYXRlIGVudmVsb3BlIGluc3RhbmNlCgogIE11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY2hhbm5lbCBiZWZvcmUgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBjYW4gYmUgdXNlZC4KCiAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKKi8KU0JSX0VSUk9SCmNyZWF0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaHMsICAgLyohPCBwb2ludGVyIHRvIGVudmVsb3BlIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBzdGF0aWMgU0JSIGNvbnRyb2wgZGF0YSwgaW5pdGlhbGl6ZWQgd2l0aCBkZWZhdWx0cyAqLwogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBmb3Igd2hpY2ggdG8gYXNzaWduIGJ1ZmZlcnMgKi8KICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKQp7CiAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKICBpbnQgaTsKCiAgLyogQ2xlYXIgcHJldmlvdXMgbWlzc2luZyBoYXJtb25pY3MgZmxhZ3MgKi8KICBmb3IgKGk9MDsgaTwoTUFYX0ZSRVFfQ09FRkZTKzE1KT4+NDsgaSsrKSB7CiAgICBocy0+aGFybUZsYWdzUHJldltpXSA9IDA7CiAgfQogIGhzLT5oYXJtSW5kZXggPSAwOwoKICAvKgogICAgU2V0dXAgcG9pbnRlcnMgZm9yIHRpbWUgc21vb3RoaW5nLgogICAgVGhlIGJ1ZmZlciBpdHNlbGYgd2lsbCBiZSBpbml0aWFsaXplZCBsYXRlciB0cmlnZ2VyZWQgYnkgdGhlIHN0YXJ0VXAtZmxhZy4KICAqLwogIGhzLT5wcmV2VHJhbkVudiA9IC0xOwoKCiAgLyogaW5pdGlhbGl6YXRpb24gKi8KICByZXNldFNickVudmVsb3BlQ2FsYyhocyk7CgogIGlmIChjaGFuPT0wKSB7IC8qIGRvIHRoaXMgb25seSBvbmNlICovCiAgICBlcnIgPSByZXNldEZyZXFCYW5kVGFibGVzKGhIZWFkZXJEYXRhLCBmbGFncyk7CiAgfQoKICByZXR1cm4gZXJyOwp9CgovKiEKICBcYnJpZWYgICBDcmVhdGUgZW52ZWxvcGUgaW5zdGFuY2UKCiAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZSB1c2VkLgoKICBccmV0dXJuICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAoqLwppbnQKZGVsZXRlU2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBocykKewogIHJldHVybiAwOwp9CgoKLyohCiAgXGJyaWVmICAgUmVzZXQgZW52ZWxvcGUgaW5zdGFuY2UKCiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmb3IgZWFjaCBjaGFubmVsIG9uIGEgY2hhbmdlIG9mIGNvbmZpZ3VyYXRpb24uCiAgTm90ZSB0aGF0IHJlc2V0RnJlcUJhbmRUYWJsZXMgc2hvdWxkIGFsc28gYmUgY2FsbGVkIGluIHRoaXMgY2FzZS4KCiAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKKi8Kdm9pZApyZXNldFNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaENhbEVudikgLyohPCBwb2ludGVyIHRvIGVudmVsb3BlIGluc3RhbmNlICovCnsKICBoQ2FsRW52LT5waGFzZUluZGV4ID0gMDsKCiAgLyogTm9pc2UgZXhwb25lbnQgbmVlZHMgdG8gYmUgcmVzZXQgYmVjYXVzZSB0aGUgb3V0cHV0IGV4cG9uZW50IGZvciB0aGUgbmV4dCBmcmFtZSBkZXBlbmRzIG9uIGl0ICovCiAgaENhbEVudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSAwOwoKICBoQ2FsRW52LT5zdGFydFVwID0gMTsKfQoKCi8qIQogIFxicmllZiAgRXF1YWxpemUgZXhwb25lbnRzIG9mIHRoZSBidWZmZXJlZCBnYWluIHZhbHVlcyBhbmQgdGhlIG5ldyBvbmVzCgogIEFmdGVyIGVxdWFsaXphdGlvbiBvZiBleHBvbmVudHMsIHRoZSBGSVItZmlsdGVyIGFkZGl0aW9uIGZvciBzbW9vdGhpbmcKICBjYW4gYmUgcGVyZm9ybWVkLgogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZW52ZWxvcGUgYmVmb3JlIGFkanVzdGluZy4KKi8KLypzdGF0aWMqLyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgICAgIC8qITwgYnVmZmVyZCBnYWlucyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmZpbHRCdWZmZXJfZSwgICAvKiE8IGV4cG9uZW50cyBvZiBidWZmZXJkIGdhaW5zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnR2FpbiwgICAgICAgIC8qITwgZ2FpbnMgZm9yIGN1cnJlbnQgZW52ZWxvcGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdHYWluX2UsICAgICAgLyohPCBleHBvbmVudHMgb2YgZ2FpbnMgZm9yIGN1cnJlbnQgZW52ZWxvcGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdWJiYW5kcykgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCnsKICBpbnQgICBiYW5kOwogIGludCAgZGlmZjsKCiAgZm9yIChiYW5kPTA7IGJhbmQ8c3ViYmFuZHM7IGJhbmQrKyl7CiAgICBkaWZmID0gKGludCkgKG5yZ0dhaW5fZVtiYW5kXSAtIGZpbHRCdWZmZXJfZVtiYW5kXSk7CiAgICBpZiAoZGlmZj4wKSB7CiAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPj49IGRpZmY7ICAgLyogQ29tcGVuc2F0ZSBmb3IgdGhlIHNjYWxlIGNoYW5nZSBieSBzaGlmdGluZyB0aGUgbWFudGlzc2EuICovCiAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSArPSBkaWZmOyAgLyogTmV3IGdhaW4gaXMgYmlnZ2VyLCB1c2UgaXRzIGV4cG9uZW50ICovCiAgICB9CiAgICBlbHNlIGlmIChkaWZmPDApIHsKICAgICAgLyogVGhlIGJ1ZmZlcmVkIGdhaW5zIHNlZW0gdG8gYmUgbGFyZ2VyLCBidXQgbWF5YmUgdGhlcmUKICAgICAgICAgYXJlIHNvbWUgdW51c2VkIGJpdHMgbGVmdCBpbiB0aGUgbWFudGlzc2EgKi8KCiAgICAgIGludCByZXNlcnZlID0gQ250TGVhZGluZ1plcm9zKGZpeHBfYWJzKGZpbHRCdWZmZXJbYmFuZF0pKS0xOwoKICAgICAgaWYgKCgtZGlmZikgPD0gcmVzZXJ2ZSkgewogICAgICAgIC8qIFRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyZWQgbWFudGlzc2Egc28KICAgICAgICAgICB0aGF0IHdlIGNhbiB0YWtlIHRoZSBuZXcgZXhwb25lbnQgYXMgY29tbW9uLgogICAgICAgICovCiAgICAgICAgZmlsdEJ1ZmZlcltiYW5kXSA8PD0gKC1kaWZmKTsKICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgIC8qIGJlY29tZXMgZXF1YWwgdG8gKnB0ck5ld0V4cCAqLwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPDw9IHJlc2VydmU7ICAgLyogU2hpZnQgdGhlIG1hbnRpc3NhIGFzIGZhciBhcyBwb3NzaWJsZTogKi8KICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gLT0gcmVzZXJ2ZTsgIC8qIENvbXBlbnNhdGUgaW4gdGhlIGV4cG9uZW50OiAqLwoKICAgICAgICAvKiBGb3IgdGhlIHJlbWFpbmluZyBkaWZmZXJlbmNlLCBjaGFuZ2UgdGhlIG5ldyBnYWluIHZhbHVlICovCiAgICAgICAgZGlmZiA9IGZpeE1pbigtKHJlc2VydmUgKyBkaWZmKSxERlJBQ1RfQklUUy0xKTsKICAgICAgICBucmdHYWluW2JhbmRdID4+PSBkaWZmOwogICAgICAgIG5yZ0dhaW5fZVtiYW5kXSArPSBkaWZmOwogICAgICB9CiAgICB9CiAgfQp9CgovKiEKICBcYnJpZWYgIFNoaWZ0IGxlZnQgdGhlIG1hbnRpc3NhcyBvZiBhbGwgc3ViYmFuZCBzYW1wbGVzCiAgICAgICAgICBpbiB0aGUgZ2l2ZW50aW1lIGFuZCBmcmVxdWVuY3kgcmFuZ2UgYnkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4KCiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlc2NhbGUgdGhlIGF1ZGlvIGRhdGEgaW4gdGhlIG92ZXJsYXAgYnVmZmVyCiAgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBlbnZlbG9wZSBhZGp1c3RlZCB3aXRoIHRoZSBsYXN0IGZyYW1lLgoqLwp2b2lkIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhGSVhQX0RCTCAqKiByZSwgICAvKiE8IFJlYWwgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBpbSwgICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCAgIC8qITwgQmVnaW4gb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLCAgLyohPCBFbmQgb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywgICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfcG9zLCAgICAgLyohPCBFbmQgb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCkgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgKi8KewogIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kLWxvd1N1YmJhbmQ7CgogIGlmICggKHdpZHRoID4gMCkgJiYgKHNoaWZ0IT0wKSApIHsKICAgIGlmIChpbSE9TlVMTCkgewogICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICBzY2FsZVZhbHVlcygmcmVbbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CiAgICAgICAgICBzY2FsZVZhbHVlcygmaW1bbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CiAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICBzY2FsZVZhbHVlcygmcmVbbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CiAgICAgIH0KICAgIH0KICB9Cn0KCgovKiEKICBcYnJpZWYgICBEZXRlcm1pbmUgaGVhZHJvb20gZm9yIHNoaWZ0aW5nCgogIERldGVybWluZSBieSBob3cgbXVjaCB0aGUgc3BlY3RydW0gY2FuIGJlIHNoaWZ0ZWQgbGVmdAogIGZvciBiZXR0ZXIgYWNjdXJhY3kgaW4gbGF0ZXIgcHJvY2Vzc2luZy4KCiAgXHJldHVybiAgTnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYmlnZ2VzdCBzcGVjdHJhbCB2YWx1ZQoqLwoKRklYUF9EQkwgbWF4U3ViYmFuZFNhbXBsZSggRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogaW0sICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd1N1YmJhbmQsICAgLyohPCBCZWdpbiBvZiBmcmVxdWVuY3kgcmFuZ2UgdG8gcHJvY2VzcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaFN1YmJhbmQsICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMgdG8gcHJvY2VzcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcG9zLCAgICAvKiE8IEJlZ2luIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dF9wb3MgICAgICAvKiE8IEVuZCBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWF9EQkwoMC4wZik7CiAgdW5zaWduZWQgaW50IHdpZHRoID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOwoKICBGREtfQVNTRVJUKHdpZHRoIDw9ICg2NCkpOwoKICBpZiAoIHdpZHRoID4gMCApIHsKICAgIGlmIChpbSE9TlVMTCkgCiAgICB7CiAgICAgIGZvciAoaW50IGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIAogICAgICB7CiNpZmRlZiBGVU5DVElPTl9GREtfZ2V0X21heHZhbAogICAgICAgIG1heFZhbCA9IEZES19nZXRfbWF4dmFsKG1heFZhbCwgJnJlW2xdW2xvd1N1YmJhbmRdLCAmaW1bbF1bbG93U3ViYmFuZF0sIHdpZHRoKTsKI2Vsc2UKICAgICAgICBpbnQgaz13aWR0aDsKICAgICAgICBGSVhQX0RCTCAqcmVUbXAgPSAmcmVbbF1bbG93U3ViYmFuZF07CiAgICAgICAgRklYUF9EQkwgKmltVG1wID0gJmltW2xdW2xvd1N1YmJhbmRdOwogICAgICAgIGRvewogICAgICAgICAgRklYUF9EQkwgdG1wMSA9ICoocmVUbXArKyk7CiAgICAgICAgICBGSVhQX0RCTCB0bXAyID0gKihpbVRtcCsrKTsKICAgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXAxKV4oKExPTkcpdG1wMT4+KERGUkFDVF9CSVRTLTEpKSk7CiAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wMileKChMT05HKXRtcDI+PihERlJBQ1RfQklUUy0xKSkpOwogICAgICAgIH0gd2hpbGUoLS1rIT0wKTsKI2VuZGlmCiAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgaW50IGs9d2lkdGg7CiAgICAgICAgRklYUF9EQkwgKnJlVG1wID0gJnJlW2xdW2xvd1N1YmJhbmRdOwogICAgICAgIGRvewogICAgICAgICAgRklYUF9EQkwgdG1wID0gKihyZVRtcCsrKTsKICAgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXApXigoTE9ORyl0bXA+PihERlJBQ1RfQklUUy0xKSkpOwogICAgICAgIH13aGlsZSgtLWshPTApOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4obWF4VmFsKTsKfQoKI2RlZmluZSBTSElGVF9CRUZPUkVfU1FVQVJFICgzKSAvKiAoNy8yKSAqLwovKiE8CiAgSWYgdGhlIGFjY3VtdWxhdG9yIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG92ZXJmbG93IGJpdHMgb3IKICBkb2VzIG5vdCBwcm92aWRlIGEgaGlnaCBkeW5hbWljIHJhbmdlLCB0aGUgYmVsb3cgZW5lcmd5IGNhbGN1bGF0aW9uCiAgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBzaGlmdCBvcGVyYXRpb24gZm9yIGVhY2ggc2FtcGxlLgogIE9uIHRoZSBvdGhlciBoYW5kLCBkb2luZyB0aGUgc2hpZnQgYWxsb3dzIHVzaW5nIGEgc2luZ2xlLXByZWNpc2lvbgogIG11bHRpcGxpY2F0aW9uIGZvciB0aGUgc3F1YXJlIChhdCBsZWFzdCAxNmJpdCB4IDE2Yml0KS4KICBGb3IgZXZlbiB2YWx1ZXMgb2YgT1ZSRkxXX0JJVFMgKDAsIDIsIDQsIDYpLCBzYXR1cmF0ZWQgYXJpdGhtZXRpYwogIGlzIHJlcXVpcmVkIGZvciB0aGUgZW5lcmd5IGFjY3VtdWxhdGlvbi4KICBUaGVvcmV0aWNhbGx5LCB0aGUgc2FtcGxlLXNxdWFyZXMgY2FuIHN1bSB1cCB0byBhIHZhbHVlIG9mIDc2LAogIHJlcXVpcmluZyA3IG92ZXJmbG93IGJpdHMuIEhvd2V2ZXIgc2luY2Ugc3VjaCBzaXR1YXRpb25zIGFyZSAqdmVyeSoKICByYXJlLCBhY2N1IGNhbiBiZSBsaW1pdGVkIHRvIDY0LgogIEluIGNhc2UgbmF0aXZlIHNhdHVyYXRlZCBhcml0aG1ldGljIGlzIG5vdCBhdmFpbGFibGUsIG92ZXJmbG93cwogIGNhbiBiZSBwcmV2ZW50ZWQgYnkgcmVwbGFjaW5nIHRoZSBhYm92ZSAjZGVmaW5lIGJ5CiAgICAjZGVmaW5lIFNISUZUX0JFRk9SRV9TUVVBUkUgKCg4IC0gT1ZSRkxXX0JJVFMpIC8gMikKICB3aGljaCB3aWxsIHJlc3VsdCBpbiBzbGlnaHRseSByZWR1Y2VkIGFjY3VyYWN5LgoqLwoKLyohCiAgXGJyaWVmICBFc3RpbWF0ZXMgdGhlIG1lYW4gZW5lcmd5IG9mIGVhY2ggZmlsdGVyLWJhbmsgY2hhbm5lbCBmb3IgdGhlCiAgICAgICAgICBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBlbnZlbG9wZQoKICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgdHJ1ZS4KKi8KLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLCAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGhpZ2hTdWJiYW5kLCAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICAgICAgICAgICAgLyohPCBGaXJzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuZXh0X3BvcywgICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBmcmFtZUV4cCwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgICAgLyohPCByZXN1bHRpbmcgRW5lcmd5ICgwLi4xKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKSAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLwp7CiAgRklYUF9TR0wgaW52V2lkdGg7CiAgU0NIQVIgIHByZVNoaWZ0OwogIFNDSEFSICBzaGlmdDsKICBGSVhQX0RCTCBzdW07CiAgaW50IGssbDsKCiAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGxhdGVyOiAqLwogIGludldpZHRoID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQobmV4dF9wb3MgLSBzdGFydF9wb3MpKTsKICAvKiBUaGUgY29tbW9uIGV4cG9uZW50IG5lZWRzIHRvIGJlIGRvdWJsZWQgYmVjYXVzZSBhbGwgbWFudGlzc2FzIGFyZSBzcXVhcmVkOiAqLwogIGZyYW1lRXhwID0gZnJhbWVFeHAgPDwgMTsKCiAgZm9yIChrPWxvd1N1YmJhbmQ7IGs8aGlnaFN1YmJhbmQ7IGsrKykgewogICAgRklYUF9EQkwgIGJ1ZmZlclJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKV07CiAgICBGSVhQX0RCTCAgYnVmZmVySW1hZ1soKCgxMDI0KS8oMzIpKSsoNikpXTsKICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKCiAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkKICAgIHsKICAgICAgZm9yIChsPXN0YXJ0X3BvcztsPG5leHRfcG9zO2wrKykgCiAgICAgIHsKICAgICAgICBidWZmZXJJbWFnW2xdID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXTsKICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVySW1hZ1tsXSleKChMT05HKWJ1ZmZlckltYWdbbF0+PihERlJBQ1RfQklUUy0xKSkpOwogICAgICAgIGJ1ZmZlclJlYWxbbF0gPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdOwogICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZm9yIChsPXN0YXJ0X3BvcztsPG5leHRfcG9zO2wrKykKICAgICAgewogICAgICAgIGJ1ZmZlclJlYWxbbF0gPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdOwogICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7CgoKICAgICAgLyogSWYgdGhlIGFjY3UgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywgd2UgY2Fubm90CiAgICAgICAgIHNoaWZ0IHRoZSBzYW1wbGVzIHVwIHRvIHRoZSBsaW1pdC4KICAgICAgICAgSW5zdGVhZCwga2VlcCB1cCB0byAzIGZyZWUgYml0cyBpbiBlYWNoIHNhbXBsZSwgaS5lLiB1cCB0bwogICAgICAgICA2IGJpdHMgYWZ0ZXIgY2FsY3VsYXRpb24gb2Ygc3F1YXJlLgogICAgICAgICBQbGVhc2Ugbm90ZSB0aGUgY29tbWVudCBvbiBzYXR1cmF0ZWQgYXJpdGhtZXRpYyBhYm92ZSEKICAgICAgKi8KICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CiAgICAgIHByZVNoaWZ0IC09IFNISUZUX0JFRk9SRV9TUVVBUkU7CgogICAgICBpZiAocHJlU2hpZnQ+PTApIHsKICAgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkgewogICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgIEZJWFBfREJMIHRlbXAxID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMiA9IGJ1ZmZlckltYWdbbF0gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CiAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsgICAgLyogaWYgbmVnYXRpdmUgc2hpZnQgdmFsdWUgKi8KICAgICAgICBpbnQgbmVncHJlU2hpZnQgPSAtcHJlU2hpZnQ7CiAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpIHsKICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgRklYUF9EQkwgdGVtcDIgPSBidWZmZXJJbWFnW2xdID4+IChpbnQpbmVncHJlU2hpZnQ7CiAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDEpOwogICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgRklYUF9EQkwgdGVtcCA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYWNjdSA8PD0gMTsKCiAgICAgIC8qIENvbnZlcnQgZG91YmxlIHByZWNpc2lvbiB0byBNYW50aXNzYS9FeHBvbmVudDogKi8KICAgICAgc2hpZnQgPSBmTm9ybShhY2N1KTsKICAgICAgc3VtID0gYWNjdSA8PCAoaW50KXNoaWZ0OwoKICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGFuZCBhcHBseSBmcmFtZSBzY2FsZTogKi8KICAgICAgKm5yZ0VzdCsrID0gZk11bHQoc3VtLCBpbnZXaWR0aCk7CiAgICAgIHNoaWZ0ICs9IDIgKiBwcmVTaGlmdDsKICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCiAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0OwogICAgICBlbHNlCiAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0ICsgMTsgIC8qICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KICAgIH0gLyogbWF4VmFsIT0wICovCiAgICBlbHNlIHsKCiAgICAgIC8qIFByZXZlbnQgYSB6ZXJvLW1hbnRpc3NhLW51bWJlciBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCiAgICAgICAgIGR1ZSB0byBpdHMgZXhwb25lbnQuICovCiAgICAgICpucmdFc3QrKyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAqbnJnRXN0X2UrKyA9IDA7CiAgICB9CiAgfQp9CgovKiEKICBcYnJpZWYgICBFc3RpbWF0ZXMgdGhlIG1lYW4gZW5lcmd5IG9mIGVhY2ggU2NhbGUgZmFjdG9yIGJhbmQgZm9yIHRoZQogICAgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlLgoKICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgZmFsc2UuCiovCi8qc3RhdGljKi8gdm9pZCBjYWxjTnJnUGVyU2ZiKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsICAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLCAgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKmZyZXFCYW5kVGFibGUsICAgICAgIC8qITwgRmlyc3QgU3ViYmFuZCBmb3IgZWFjaCBTZmIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RhcnRfcG9zLCAgICAgICAgICAgLyohPCBGaXJzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5leHRfcG9zLCAgICAgICAgICAgIC8qITwgTGFzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICsgMSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBpbnB1dF9lLCAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBmb3IgYWxsIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LCAgICAgICAgICAgICAgLyohPCByZXN1bHRpbmcgRW5lcmd5ICgwLi4xKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdGluZyBFbmVyZ3kgKi8KewogIEZJWFBfU0dMICBpbnZXaWR0aDsKICBGSVhQX0RCTCAgdGVtcDsKICBTQ0hBUiAgcHJlU2hpZnQ7CiAgU0NIQVIgICBzaGlmdCwgc3VtX2U7CiAgRklYUF9EQkwgIHN1bTsKCiAgaW50IGosayxsLGxpLHVpOwogIEZJWFBfREJMIHN1bUFsbCwgc3VtTGluZTsgLyogU2luZ2xlIHByZWNpc2lvbiB3b3VsZCBiZSBzdWZmaWNpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBvdmVyZmxvdyBiaXRzIGFyZSByZXF1aXJlZCBmb3IgYWNjdW11bGF0aW9uICovCgogIC8qIERpdmlkZSBieSB3aWR0aCBvZiBlbnZlbG9wZSBsYXRlcjogKi8KICBpbnZXaWR0aCA9IEZYX0RCTDJGWF9TR0woR2V0SW52SW50KG5leHRfcG9zIC0gc3RhcnRfcG9zKSk7CiAgLyogVGhlIGNvbW1vbiBleHBvbmVudCBuZWVkcyB0byBiZSBkb3VibGVkIGJlY2F1c2UgYWxsIG1hbnRpc3NhcyBhcmUgc3F1YXJlZDogKi8KICBpbnB1dF9lID0gaW5wdXRfZSA8PCAxOwoKICBmb3Ioaj0wOyBqPG5TZmI7IGorKykgewogICAgbGkgPSBmcmVxQmFuZFRhYmxlW2pdOwogICAgdWkgPSBmcmVxQmFuZFRhYmxlW2orMV07CgogICAgRklYUF9EQkwgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c0J1ZmZlckltYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wb3MgKTsKCiAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7CgogICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CgogICAgICAvKiBJZiB0aGUgYWNjdSBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBvdmVyZmxvdyBiaXRzLCB3ZSBjYW5ub3QKICAgICAgICAgc2hpZnQgdGhlIHNhbXBsZXMgdXAgdG8gdGhlIGxpbWl0LgogICAgICAgICBJbnN0ZWFkLCBrZWVwIHVwIHRvIDMgZnJlZSBiaXRzIGluIGVhY2ggc2FtcGxlLCBpLmUuIHVwIHRvCiAgICAgICAgIDYgYml0cyBhZnRlciBjYWxjdWxhdGlvbiBvZiBzcXVhcmUuCiAgICAgICAgIFBsZWFzZSBub3RlIHRoZSBjb21tZW50IG9uIHNhdHVyYXRlZCBhcml0aG1ldGljIGFib3ZlIQogICAgICAqLwogICAgICBwcmVTaGlmdCAtPSBTSElGVF9CRUZPUkVfU1FVQVJFOwoKICAgICAgc3VtQWxsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgoKICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKCiAgICAgICAgc3VtTGluZSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkgewogICAgICAgICAgaWYgKHByZVNoaWZ0Pj0wKSB7CiAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CgogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlckltYWdbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICBpZiAocHJlU2hpZnQ+PTApIHsKICAgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIFFNRi1jaGFubmVscyBwZXIgU0JSIGJhbmRzIG1heSBiZSB1cCB0byAxNS4KICAgICAgICAgICBTaGlmdCByaWdodCB0byBhdm9pZCBvdmVyZmxvd3MgaW4gc3VtIG92ZXIgYWxsIGNoYW5uZWxzLiAqLwogICAgICAgIHN1bUxpbmUgPSBzdW1MaW5lID4+ICg0LTEpOwogICAgICAgIHN1bUFsbCAgKz0gc3VtTGluZTsKICAgICAgfQoKICAgICAgLyogQ29udmVydCBkb3VibGUgcHJlY2lzaW9uIHRvIE1hbnRpc3NhL0V4cG9uZW50OiAqLwogICAgICBzaGlmdCA9IGZOb3JtKHN1bUFsbCk7CiAgICAgIHN1bSA9IHN1bUFsbCA8PCAoaW50KXNoaWZ0OwoKICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlOiAqLwogICAgICBzdW0gPSBmTXVsdChzdW0saW52V2lkdGgpOwoKICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIFNmYjogKi8KICAgICAgc3VtID0gZk11bHQoc3VtLCBGWF9EQkwyRlhfU0dMKEdldEludkludCh1aS1saSkpKTsKCiAgICAgIC8qIFNldCBhbGwgU3ViYmFuZCBlbmVyZ2llcyBpbiB0aGUgU2ZiIHRvIHRoZSBhdmVyYWdlIGVuZXJneTogKi8KICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCiAgICAgICAgc3VtX2UgPSBpbnB1dF9lICsgNCAtIHNoaWZ0OyAgLyogLTQgdG8gY29tcGVuc2F0ZSByaWdodC1zaGlmdCAqLwogICAgICBlbHNlCiAgICAgICAgc3VtX2UgPSBpbnB1dF9lICsgNCArIDEgLSBzaGlmdDsgIC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQ7ICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KCiAgICAgIHN1bV9lIC09IDIgKiBwcmVTaGlmdDsKICAgIH0gLyogbWF4VmFsIT0wICovCiAgICBlbHNlIHsKCiAgICAgIC8qIFByZXZlbnQgYSB6ZXJvLW1hbnRpc3NhLW51bWJlciBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCiAgICAgICAgIGR1ZSB0byBpdHMgZXhwb25lbnQuICovCiAgICAgIHN1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBzdW1fZSA9IDA7CiAgICB9CgogICAgZm9yIChrPWxpOyBrPHVpOyBrKyspCiAgICB7CiAgICAgICpucmdFc3QrKyAgID0gc3VtOwogICAgICAqbnJnRXN0X2UrKyA9IHN1bV9lOwogICAgfQogIH0KfQoKCi8qIQogIFxicmllZiAgQ2FsY3VsYXRlIGdhaW4sIG5vaXNlLCBhbmQgYWRkaXRpb25hbCBzaW5lIGxldmVsIGZvciBvbmUgc3ViYmFuZC4KCiAgVGhlIHJlc3VsdGluZyBlbmVyZ3kgZ2FpbiBpcyBnaXZlbiBieSBtYW50aXNzYSBhbmQgZXhwb25lbnQuCiovCi8qc3RhdGljKi8gdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgICAgICAgICAgICAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBucmdSZWZfZSwgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgICAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIHRtcE5vaXNlX2UsICAgICAgICAvKiE8IFJlbGF0aXZlIG5vaXNlIGxldmVsIChleHBvbmVudCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lUHJlc2VudEZsYWcsICAgLyohPCBJbmRpY2F0ZXMgaWYgc2luZSBpcyBwcmVzZW50IG9uIGJhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLCAgICAgICAgLyohPCBJbmRpY2F0ZXMgaWYgc2luZSBtdXN0IGJlIGFkZGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcpICAgICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLwp7CiAgRklYUF9EQkwgIG5yZ0VzdCAgICAgICAgICA9IG5yZ3MtPm5yZ0VzdFtpXTsgICAgICAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLwogIFNDSEFSICAgICBucmdFc3RfZSAgICAgICAgPSBucmdzLT5ucmdFc3RfZVtpXTsgICAgICAgICAgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKGV4cG9uZW50KSAqLwogIEZJWFBfREJMICpwdHJOcmdHYWluICAgICAgPSAmbnJncy0+bnJnR2FpbltpXTsgICAgICAgICAgLyohPCBSZXN1bHRpbmcgZW5lcmd5IGdhaW4gKi8KICBTQ0hBUiAgICAqcHRyTnJnR2Fpbl9lICAgID0gJm5yZ3MtPm5yZ0dhaW5fZVtpXTsgICAgICAgIC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluIChleHBvbmVudCkgKi8KICBGSVhQX0RCTCAqcHRyTm9pc2VMZXZlbCAgID0gJm5yZ3MtPm5vaXNlTGV2ZWxbaV07ICAgICAgIC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAqLwogIFNDSEFSICAgICpwdHJOb2lzZUxldmVsX2UgPSAmbnJncy0+bm9pc2VMZXZlbF9lW2ldOyAgICAgLyohPCBSZXN1bHRpbmcgYWJzb2x1dGUgbm9pc2UgZW5lcmd5IChleHBvbmVudCkgKi8KICBGSVhQX0RCTCAqcHRyTnJnU2luZSAgICAgID0gJm5yZ3MtPm5yZ1NpbmVbaV07ICAgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAqLwogIFNDSEFSICAgICpwdHJOcmdTaW5lX2UgICAgPSAmbnJncy0+bnJnU2luZV9lW2ldOyAgICAgICAgLyohPCBBZGRpdGlvbmFsIHNpbmUgZW5lcmd5IChleHBvbmVudCkgKi8KCiAgRklYUF9EQkwgYSwgYiwgYzsKICBTQ0hBUiAgICBhX2UsIGJfZSwgY19lOwoKICAvKgogICAgIFRoaXMgYWRkaXRpb24gb2YgMSBwcmV2ZW50cyBkaXZpc2lvbnMgYnkgemVybyBpbiB0aGUgcmVmZXJlbmNlIGNvZGUuCiAgICAgRm9yIHZlcnkgc21hbGwgZW5lcmdpZXMgaW4gbnJnRXN0LCBpdCBwcmV2ZW50cyB0aGUgZ2FpbnMgZnJvbSBiZWNvbWluZwogICAgIHZlcnkgaGlnaCB3aGljaCBjb3VsZCBjYXVzZSBzb21lIHRyb3VibGUgZHVlIHRvIHRoZSBzbW9vdGhpbmcuCiAgKi8KICBiX2UgPSAoaW50KShucmdFc3RfZSAtIDEpOwogIGlmIChiX2U+PTApIHsKICAgIG5yZ0VzdCA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UrMSxERlJBQ1RfQklUUy0xKSkgKyAobnJnRXN0ID4+IDEpOwogICAgbnJnRXN0X2UgKz0gMTsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCgogIH0gZWxzZSB7CiAgICBucmdFc3QgPSAobnJnRXN0ID4+IChJTlQpKGZpeE1pbigtYl9lKzEsREZSQUNUX0JJVFMtMSkpKSArIChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAxKTsKICAgIG5yZ0VzdF9lID0gMjsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCiAgfQoKICAvKiAgQSA9IE5yZ1JlZiAqIFRtcE5vaXNlICovCiAgYSA9IGZNdWx0KG5yZ1JlZix0bXBOb2lzZSk7CiAgYV9lID0gbnJnUmVmX2UgKyB0bXBOb2lzZV9lOwoKICAvKiAgQiA9IDEgKyBUbXBOb2lzZSAqLwogIGJfZSA9IChpbnQpKHRtcE5vaXNlX2UgLSAxKTsKICBpZiAoYl9lPj0wKSB7CiAgICBiID0gKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChJTlQpZml4TWluKGJfZSsxLERGUkFDVF9CSVRTLTEpKSArICh0bXBOb2lzZSA+PiAxKTsKICAgIGJfZSA9IHRtcE5vaXNlX2UgKyAxOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KICB9IGVsc2UgewogICAgYiA9ICh0bXBOb2lzZSA+PiAoSU5UKShmaXhNaW4oLWJfZSsxLERGUkFDVF9CSVRTLTEpKSkgKyAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gMSk7CiAgICBiX2UgPSAyOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KICB9CgogIC8qICBub2lzZUxldmVsID0gQSAvIEIgPSAoTnJnUmVmICogVG1wTm9pc2UpIC8gKDEgKyBUbXBOb2lzZSkgKi8KICBGREtfZGl2aWRlX01hbnRFeHAoIGEsICBhX2UsCiAgICAgICAgICAgICAgICAgICAgICBiLCAgYl9lLAogICAgICAgICAgICAgICAgICAgICAgcHRyTm9pc2VMZXZlbCwgcHRyTm9pc2VMZXZlbF9lKTsKCiAgaWYgKHNpbmVQcmVzZW50RmxhZykgewoKICAgIC8qICBDID0gKDEgKyBUbXBOb2lzZSkgKiBOcmdFc3QgKi8KICAgIGMgPSBmTXVsdChiLG5yZ0VzdCk7CiAgICBjX2UgPSBiX2UgKyBucmdFc3RfZTsKCiAgICAvKiAgZ2FpbiA9IEEgLyBDID0gKE5yZ1JlZiAqIFRtcE5vaXNlKSAvICgxICsgVG1wTm9pc2UpICogTnJnRXN0ICovCiAgICBGREtfZGl2aWRlX01hbnRFeHAoIGEsICBhX2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGMsICBjX2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CgogICAgaWYgKHNpbmVNYXBwZWQpIHsKCiAgICAgIC8qICBzaW5lTGV2ZWwgPSBucmdSZWYvICgxICsgVG1wTm9pc2UpICovCiAgICAgIEZES19kaXZpZGVfTWFudEV4cCggbnJnUmVmLCAgbnJnUmVmX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdTaW5lLCBwdHJOcmdTaW5lX2UpOwogICAgfQogIH0KICBlbHNlIHsKICAgIGlmIChub05vaXNlRmxhZykgewogICAgICAvKiAgQiA9IE5yZ0VzdCAqLwogICAgICBiID0gbnJnRXN0OwogICAgICBiX2UgPSBucmdFc3RfZTsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiAgQiA9IE5yZ0VzdCAqICgxICsgVG1wTm9pc2UpICovCiAgICAgIGIgPSBmTXVsdChiLG5yZ0VzdCk7CiAgICAgIGJfZSA9IGJfZSArIG5yZ0VzdF9lOwogICAgfQoKCiAgICAvKiAgZ2FpbiA9IG5yZ1JlZiAvIEIgKi8KICAgIEZES19kaXZpZGVfTWFudEV4cCggbnJnUmVmLCAgbnJnUmVmX2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGIsICBiX2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CiAgfQp9CgoKLyohCiAgXGJyaWVmICBDYWxjdWxhdGUgImF2ZXJhZ2UgZ2FpbiIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViYmFuZCByYW5nZS4KCiAgVGhpcyBpcyByYXRoZXIgYSBnYWluIG9mIHRoZSBhdmVyYWdlIG1hZ25pdHVkZSB0aGFuIHRoZSBhdmVyYWdlCiAgb2YgZ2FpbnMhCiAgVGhlIHJlc3VsdCBpcyB1c2VkIGFzIGEgcmVsYXRpdmUgbGltaXQgZm9yIGFsbCBnYWlucyB3aXRoaW4gdGhlCiAgY3VycmVudCAibGltaXRlciBiYW5kIiAoYSBjZXJ0YWluIGZyZXF1ZW5jeSByYW5nZSkuCiovCi8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGxvd1N1YmJhbmQsICAgIC8qITwgQmVnaW4gb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhpZ2hTdWJiYW5kLCAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0clN1bVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJTdW1SZWZfZSwKICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluLCAgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChtYW50aXNzYSkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJBdmdHYWluX2UpICAvKiE8IFJlc3VsdGluZyBvdmVyYWxsIGdhaW4gKGV4cG9uZW50KSAqLwp7CiAgRklYUF9EQkwgICpucmdSZWYgICA9IG5yZ3MtPm5yZ1JlZjsgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCiAgU0NIQVIgICAgICpucmdSZWZfZSA9IG5yZ3MtPm5yZ1JlZl9lOyAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KICBGSVhQX0RCTCAgKm5yZ0VzdCAgID0gbnJncy0+bnJnRXN0OyAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLwogIFNDSEFSICAgICAqbnJnRXN0X2UgPSBucmdzLT5ucmdFc3RfZTsgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KCiAgRklYUF9EQkwgc3VtUmVmID0gMTsKICBGSVhQX0RCTCBzdW1Fc3QgPSAxOwogIFNDSEFSICAgIHN1bVJlZl9lID0gLUZSQUNUX0JJVFM7CiAgU0NIQVIgICAgc3VtRXN0X2UgPSAtRlJBQ1RfQklUUzsKICBpbnQgICAgICBrOwoKICBmb3IgKGs9bG93U3ViYmFuZDsgazxoaWdoU3ViYmFuZDsgaysrKXsKICAgIC8qIEFkZCBucmdSZWZba10gdG8gc3VtUmVmOiAqLwogICAgRkRLX2FkZF9NYW50RXhwKCBzdW1SZWYsIHN1bVJlZl9lLAogICAgICAgICAgICAgICAgICAgICBucmdSZWZba10sIG5yZ1JlZl9lW2tdLAogICAgICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UgKTsKCiAgICAvKiBBZGQgbnJnRXN0W2tdIHRvIHN1bUVzdDogKi8KICAgIEZES19hZGRfTWFudEV4cCggc3VtRXN0LCBzdW1Fc3RfZSwKICAgICAgICAgICAgICAgICAgICAgbnJnRXN0W2tdLCBucmdFc3RfZVtrXSwKICAgICAgICAgICAgICAgICAgICAgJnN1bUVzdCwgJnN1bUVzdF9lICk7CiAgfQoKICBGREtfZGl2aWRlX01hbnRFeHAoc3VtUmVmLCBzdW1SZWZfZSwKICAgICAgICAgICAgICAgICAgICAgc3VtRXN0LCBzdW1Fc3RfZSwKICAgICAgICAgICAgICAgICAgICAgcHRyQXZnR2FpbiwgcHRyQXZnR2Fpbl9lKTsKCiAgKnB0clN1bVJlZiA9IHN1bVJlZjsKICAqcHRyU3VtUmVmX2UgPSBzdW1SZWZfZTsKfQoKCi8qIQogIFxicmllZiAgIEFtcGxpZnkgb25lIHRpbWVzbG90IG9mIHRoZSBzaWduYWwgd2l0aCB0aGUgY2FsY3VsYXRlZCBnYWlucwogICAgICAgICAgIGFuZCBhZGQgdGhlIG5vaXNlZmxvb3IuCiovCgovKnN0YXRpYyovIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKnB0ckhhcm1JbmRleCwgIC8qITwgSGFybW9uaWMgaW5kZXggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNjYWxlX2NoYW5nZSwgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAqcHRyUGhhc2VJbmRleCwgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGZDbGRmYikgICAgICAgIC8qITwgQ0xERkIgODAgZmxhZyAqLwp7CiAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwogIEZJWFBfREJMICpwTm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgRklYUF9EQkwgKnBTaW5lTGV2ZWwgID0gbnJncy0+bnJnU2luZTsgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KCiAgaW50ICAgIGs7CiAgaW50ICAgIGluZGV4ID0gKnB0clBoYXNlSW5kZXg7CiAgVUNIQVIgIGhhcm1JbmRleCA9ICpwdHJIYXJtSW5kZXg7CiAgVUNIQVIgIGZyZXFJbnZGbGFnID0gKGxvd1N1YmJhbmQgJiAxKTsKICBGSVhQX0RCTCAgc2lnbmFsUmVhbCwgc2luZUxldmVsLCBzaW5lTGV2ZWxOZXh0LCBzaW5lTGV2ZWxQcmV2OwogIGludCAgICB0b25lX2NvdW50ID0gMDsKICBpbnQgICAgc2luZVNpZ24gPSAxOwoKICAjZGVmaW5lIEMxICAgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYqMC4wMDgxNWYpKQogICNkZWZpbmUgQzFfQ0xERkIgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYqMC4xNjc3M2YpKQoKICAvKgogICAgRmlyc3QgcGFzcyBmb3Igaz0wIHB1bGxlZCBvdXQgb2YgdGhlIGxvb3A6CiAgKi8KCiAgaW5kZXggPSAoaW5kZXggKyAxKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwoKICAvKgogICAgVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50CiAgICBvZiB0aGUgc2lnbmFsIGFuZCBzaG91bGQgYmUgY2FycmllZCBvdXQgd2l0aCBmdWxsIGFjY3VyYWN5CiAgICAoc3VwcGx5aW5nICNGUkFDVF9CSVRTIHZhbGlkIGJpdHMpLgogICovCiAgc2lnbmFsUmVhbCAgICA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKICBzaW5lTGV2ZWwgICAgID0gKnBTaW5lTGV2ZWwrKzsKICBzaW5lTGV2ZWxOZXh0ID0gKG5vU3ViYmFuZHMgPiAxKSA/IHBTaW5lTGV2ZWxbMF0gOiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgaWYgKHNpbmVMZXZlbCE9RkwyRlhDT05TVF9EQkwoMC4wZikpIHRvbmVfY291bnQrKzsKCiAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKQogICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CgogIGlmIChmQ2xkZmIpIHsKCiAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgewogICAgICAvKiBoYXJtSW5kZXggMCwyICovCiAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCiAgICAgIGludCBzaGlmdCA9IChpbnQpIChzY2FsZV9jaGFuZ2UrMSk7CiAgICAgIHNoaWZ0ID0gKHNoaWZ0Pj0wKSA/IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KSA6IGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHNoaWZ0KTsKCiAgICAgIEZJWFBfREJMIHRtcDEgPSBzY2FsZVZhbHVlKCBmTXVsdERpdjIoQzFfQ0xERkIsIHNpbmVMZXZlbCksIC1zaGlmdCApOwoKICAgICAgRklYUF9EQkwgdG1wMiA9IGZNdWx0RGl2MihDMV9DTERGQiwgc2luZUxldmVsTmV4dCk7CgoKICAgICAgLyogc2F2ZSBzd2l0Y2ggYW5kIGNvbXBhcmUgb3BlcmF0aW9ucyBhbmQgcmVkdWNlIHRvIFhPUiBzdGF0ZW1lbnQgKi8KICAgICAgaWYgKCAoKGhhcm1JbmRleD4+MSkmMHgxKV5mcmVxSW52RmxhZykgewogICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7CiAgICAgICAgICBzaWduYWxSZWFsICAgLT0gdG1wMjsKICAgICAgfSBlbHNlIHsKICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOwogICAgICAgICAgc2lnbmFsUmVhbCAgICs9IHRtcDI7CiAgICAgIH0KICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgIGZyZXFJbnZGbGFnID0gIWZyZXFJbnZGbGFnOwogICAgfQoKICB9IGVsc2UKICB7CiAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgewogICAgICAvKiBoYXJtSW5kZXggMCwyICovCiAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCiAgICAgIGludCBzaGlmdCA9IChpbnQpIChzY2FsZV9jaGFuZ2UrMSk7CiAgICAgIHNoaWZ0ID0gKHNoaWZ0Pj0wKSA/IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KSA6IGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHNoaWZ0KTsKCiAgICAgIEZJWFBfREJMIHRtcDEgPSAoc2hpZnQ+PTApID8gKCBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCkgPj4gc2hpZnQgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICggZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpIDw8ICgtc2hpZnQpICk7CiAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbE5leHQpOwoKCiAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCiAgICAgIGlmICggKChoYXJtSW5kZXg+PjEpJjB4MSleZnJlcUludkZsYWcpIHsKICAgICAgICAgICoocHRyUmVhbC0xKSArPSB0bXAxOwogICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICAqKHB0clJlYWwtMSkgLT0gdG1wMTsKICAgICAgICAgIHNpZ25hbFJlYWwgICArPSB0bXAyOwogICAgICB9CiAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKICAgIH0KICB9CgogIHBOb2lzZUxldmVsKys7CgogIGlmICggbm9TdWJiYW5kcyA+IDIgKSB7CiAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgewogICAgICAvKiBoYXJtSW5kZXggMCwyICovCiAgICAgIGlmKCFoYXJtSW5kZXgpIAogICAgICB7CiAgICAgICAgc2luZVNpZ24gPSAwOwogICAgICB9CgogICAgICBmb3IgKGs9bm9TdWJiYW5kcy0yOyBrIT0wOyBrLS0pIHsKICAgICAgICBGSVhQX0RCTCBzaW5lbGV2ZWwgPSAqcFNpbmVMZXZlbCsrOwogICAgICAgIGluZGV4Kys7CiAgICAgICAgaWYgKCgoc2lnbmFsUmVhbCA9IChzaW5lU2lnbiA/IC1zaW5lbGV2ZWwgOiBzaW5lbGV2ZWwpKSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgICYmICFub05vaXNlRmxhZykgCiAgICAgICAgewogICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLwogICAgICAgIHNpZ25hbFJlYWwgKz0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOwoKICAgICAgICBwTm9pc2VMZXZlbCsrOwogICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogICAgICB9IC8qIGZvciAuLi4gKi8KICAgIH0KICAgIGVsc2UgewogICAgICAvKiBoYXJtSW5kZXggMSwzIGluIGNvbWJpbmF0aW9uIHdpdGggZnJlcUludkZsYWcgKi8KICAgICAgaWYgKGhhcm1JbmRleD09MSkgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CgogICAgICBmb3IgKGs9bm9TdWJiYW5kcy0yOyBrIT0wOyBrLS0pIHsKICAgICAgICBpbmRleCsrOwogICAgICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLwogICAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CgogICAgICAgIGlmICgqcFNpbmVMZXZlbCsrIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOwogICAgICAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykgewogICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CiAgICAgICAgfQoKICAgICAgICBwTm9pc2VMZXZlbCsrOwoKICAgICAgICBpZiAodG9uZV9jb3VudCA8PSAxNikgewogICAgICAgICAgRklYUF9EQkwgYWRkU2luZSA9IGZNdWx0RGl2MigocFNpbmVMZXZlbFstMl0gLSBwU2luZUxldmVsWzBdKSwgQzEpOwogICAgICAgICAgc2lnbmFsUmVhbCArPSAoZnJlcUludkZsYWcpID8gKC1hZGRTaW5lKSA6IChhZGRTaW5lKTsKICAgICAgICB9CgogICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogICAgICAgIGZyZXFJbnZGbGFnID0gIWZyZXFJbnZGbGFnOwogICAgICB9IC8qIGZvciAuLi4gKi8KICAgIH0KICB9CgogIGlmIChub1N1YmJhbmRzID4gLTEpIHsKICAgIGluZGV4Kys7CiAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YgdGhlIHNpZ25hbC4gKi8KICAgIHNpZ25hbFJlYWwgICAgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOwogICAgc2luZUxldmVsUHJldiA9IGZNdWx0RGl2MihwU2luZUxldmVsWy0xXSxGTDJGWF9TR0woMC4wMTYzZikpOwogICAgc2luZUxldmVsICAgICA9IHBTaW5lTGV2ZWxbMF07CgogICAgaWYgKHBTaW5lTGV2ZWxbMF0hPUZMMkZYQ09OU1RfREJMKDAuMGYpKSB0b25lX2NvdW50Kys7CiAgICBlbHNlIGlmICghbm9Ob2lzZUZsYWcpIHsKICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAgICAgIHNpZ25hbFJlYWwgPSBzaWduYWxSZWFsICsgKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBwTm9pc2VMZXZlbFswXSk8PDQpOwogICAgfQoKICAgIGlmICghKGhhcm1JbmRleCYweDEpKSB7CiAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KICAgICAgKnB0clJlYWwgPSBzaWduYWxSZWFsICsgKCAoc2luZVNpZ24pID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCiAgICAgIGlmKHRvbmVfY291bnQgPD0gMTYpewogICAgICAgIGlmIChmcmVxSW52RmxhZykgewogICAgICAgICAgKnB0clJlYWwrKyAgID0gc2lnbmFsUmVhbCAtIHNpbmVMZXZlbFByZXY7CiAgICAgICAgICBpZiAobm9TdWJiYW5kcyArIGxvd1N1YmJhbmQgPCA2MykKICAgICAgICAgICAgKnB0clJlYWwgPSAqcHRyUmVhbCArIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbCArIHNpbmVMZXZlbFByZXY7CiAgICAgICAgICBpZiAobm9TdWJiYW5kcyArIGxvd1N1YmJhbmQgPCA2MykKICAgICAgICAgICAgKnB0clJlYWwgPSAqcHRyUmVhbCAtIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSAqcHRyUmVhbCA9IHNpZ25hbFJlYWw7CiAgICB9CiAgfQogICpwdHJIYXJtSW5kZXggPSAoaGFybUluZGV4ICsgMSkgJiAzOwogICpwdHJQaGFzZUluZGV4ID0gaW5kZXggJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKfQp2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgKlJFU1RSSUNUIHB0clJlYWwsICAgICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAgICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAogICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIHNtb290aF9yYXRpbywgICAgICAgICAgLyohPCBJbXBhY3Qgb2YgbGFzdCBlbnZlbG9wZSAqLwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnLCAgICAgICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpICAvKiE8IFNoaWZ0IGZhY3RvciBvZiBmaWx0QnVmZmVyTm9pc2UgKi8KewoKICBGSVhQX0RCTCAqUkVTVFJJQ1QgZ2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAgICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCiAgRklYUF9EQkwgKlJFU1RSSUNUIHBTaW5lTGV2ZWwgPSBucmdzLT5ucmdTaW5lOyAgICAgICAgLyohPCBTaW5lIGxldmVscyAqLwoKICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlciAgICAgID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcjsgICAgICAvKiE8IEdhaW5zIG9mIGxhc3QgZW52ZWxvcGUgKi8KICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlck5vaXNlID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlOyAvKiE8IE5vaXNlIGxldmVscyBvZiBsYXN0IGVudmVsb3BlICovCiAgVUNIQVIgICAgKlJFU1RSSUNUIHB0ckhhcm1JbmRleCAgICA9Jmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleDsgICAgICAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogIGludCAgICAgICpSRVNUUklDVCBwdHJQaGFzZUluZGV4ICAgPSZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4OyAgICAgIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwoKICBpbnQgICAgazsKICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzaWduYWxJbWFnOwogIEZJWFBfREJMIG5vaXNlUmVhbCwgIG5vaXNlSW1hZzsKICBGSVhQX0RCTCAgc21vb3RoZWRHYWluLCBzbW9vdGhlZE5vaXNlOwogIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9IC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87CiAgaW50ICAgIGluZGV4ID0gKnB0clBoYXNlSW5kZXg7CiAgVUNIQVIgICBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwogIHJlZ2lzdGVyIGludCBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CiAgRklYUF9EQkwgc2luZUxldmVsOwogIGludCBzaGlmdDsKCiAgKnB0clBoYXNlSW5kZXggPSAoaW5kZXgrbm9TdWJiYW5kcykgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKICAqcHRySGFybUluZGV4ID0gKGhhcm1JbmRleCArIDEpICYgMzsKCiAgLyoKICAgIFBvc3NpYmxlIG9wdGltaXphdGlvbjoKICAgIHNtb290aF9yYXRpbyBhbmQgaGFybUluZGV4IHN0YXkgY29uc3RhbnQgZHVyaW5nIHRoZSBsb29wLgogICAgSXQgbWlnaHQgYmUgZmFzdGVyIHRvIGluY2x1ZGUgYSBzZXBhcmF0ZSBsb29wIGluIGVhY2ggcGF0aC4KCiAgICB0aGUgY2hlY2sgZm9yIHNtb290aF9yYXRpbyBpcyBub3cgb3V0c2lkZSB0aGUgbG9vcCBhbmQgdGhlIHdvcmtsb2FkCiAgICBvZiB0aGUgd2hvbGUgZnVuY3Rpb24gZGVjcmVhc2VkIGJ5IGFib3V0IDIwICUKICAqLwoKICBmaWx0QnVmZmVyTm9pc2VTaGlmdCArPSAxOyAgICAgIC8qIGR1ZSB0byBsYXRlciB1c2Ugb2YgZk11bHREaXYyIGluc3RlYWQgb2YgZk11bHQgKi8KICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQ8MCkKICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKICBlbHNlCiAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CgogIGlmIChzbW9vdGhfcmF0aW8gPiBGTDJGWENPTlNUX1NHTCgwLjBmKSkgewoKICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgewogICAgICAvKgogICAgICAgIFNtb290aGluZzogVGhlIG9sZCBlbnZlbG9wZSBoYXMgYmVlbiBidWZmZXJkIGFuZCBhIGNlcnRhaW4gcmF0aW8KICAgICAgICBvZiB0aGUgb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgaXMgdXNlZC4KICAgICAgKi8KCiAgICAgIHNtb290aGVkR2FpbiA9IGZNdWx0KHNtb290aF9yYXRpbyxmaWx0QnVmZmVyW2tdKSArCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbyxnYWluW2tdKTsKCiAgICAgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKSB7CiAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJOb2lzZVtrXSk+PnNoaWZ0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJOb2lzZVtrXSk8PHNoaWZ0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAgVGhlIG5leHQgMiBtdWx0aXBsaWNhdGlvbnMgY29uc3RpdHV0ZSB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQKICAgICAgICBvZiB0aGUgc2lnbmFsIGFuZCBzaG91bGQgYmUgY2FycmllZCBvdXQgd2l0aCBmdWxsIGFjY3VyYWN5CiAgICAgICAgKHN1cHBseWluZyAjREZSQUNUX0JJVFMgdmFsaWQgYml0cykuCiAgICAgICovCiAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsc21vb3RoZWRHYWluKTw8KChpbnQpc2NhbGVfY2hhbmdlKTsKICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZyxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOwoKICAgICAgaW5kZXgrKzsKCiAgICAgIGlmIChwU2luZUxldmVsW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgc2luZUxldmVsID0gcFNpbmVMZXZlbFtrXTsKCiAgICAgICAgc3dpdGNoKGhhcm1JbmRleCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIHNpbmVMZXZlbCk7CiAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsIC0gc2luZUxldmVsKTsKICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOwogICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQogICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCiAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIHNpbmVMZXZlbCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyAtIHNpbmVMZXZlbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKG5vTm9pc2VGbGFnKSB7CiAgICAgICAgICAvKiBKdXN0IHRoZSBhbXBsaWZpZWQgc2lnbmFsIGlzIHNhdmVkICovCiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOwogICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSk8PDQ7CiAgICAgICAgICBub2lzZUltYWcgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVsxXSwgc21vb3RoZWROb2lzZSk8PDQ7CiAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwgKyBub2lzZVJlYWwpOwogICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgbm9pc2VJbWFnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnJlcUludkZsYWcgXj0gMTsKICAgIH0KCiAgfQogIGVsc2UgCiAgewogICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSAKICAgIHsKICAgICAgc21vb3RoZWRHYWluICA9IGdhaW5ba107CiAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsIHNtb290aGVkR2FpbikgPDwgc2NhbGVfY2hhbmdlOwogICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8IHNjYWxlX2NoYW5nZTsKCiAgICAgIGluZGV4Kys7CgogICAgICBpZiAoKHNpbmVMZXZlbCA9IHBTaW5lTGV2ZWxba10pICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAKICAgICAgewogICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSAKICAgICAgICB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWw7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCiAgICAgICAgICAgIHNpZ25hbEltYWcgLT0gc2luZUxldmVsOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHNpZ25hbFJlYWwgLT0gc2luZUxldmVsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQogICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKQogICAgICAgIHsKICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICBzbW9vdGhlZE5vaXNlID0gbm9pc2VMZXZlbFtrXTsKICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAgICAgICAgbm9pc2VSZWFsID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpOwogICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpOwogICAgICAgICAgc2lnbmFsUmVhbCArPSBub2lzZVJlYWw8PDQ7CiAgICAgICAgICBzaWduYWxJbWFnICs9IG5vaXNlSW1hZzw8NDsKICAgICAgICB9CiAgICAgIH0KICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICpwdHJJbWFnKysgPSBzaWduYWxJbWFnOwoKICAgICAgZnJlcUludkZsYWcgXj0gMTsKICAgIH0KICB9Cn0KCgovKiEKICBcYnJpZWYgICBSZXNldCBsaW1pdGVyIGJhbmRzLgoKICBCdWlsZCBmcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIGdhaW4gbGltaXRlciBkZXBlbmRlbnQgb24KICB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgdHJhbnNwb3NlciBwYXRjaCBhcmVhcy4KCiAgXHJldHVybiAgU0JSREVDX09LIGlmIG9rLCAgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRyBvbiBlcnJvcgoqLwpTQlJfRVJST1IKUmVzZXRMaW1pdGVyQmFuZHMgKCBVQ0hBUiAqbGltaXRlckJhbmRUYWJsZSwgICAvKiE8IFJlc3VsdGluZyBiYW5kIGJvcmRlcnMgaW4gUU1GIGNoYW5uZWxzICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vTGltaXRlckJhbmRzLCAgICAgLyohPCBSZXN1bHRpbmcgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgIC8qITwgVGFibGUgd2l0aCBwb3NzaWJsZSBiYW5kIGJvcmRlcnMgKi8KICAgICAgICAgICAgICAgICAgICBpbnQgbm9GcmVxQmFuZHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIGZyZXFCYW5kVGFibGUgKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgICAgIC8qITwgVHJhbnNwb3NlciBwYXRjaCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAgICAgICAgICAgaW50IG5vUGF0Y2hlcywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0cmFuc3Bvc2VyIHBhdGNoZXMgKi8KICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXRlckJhbmRzKSAgICAgICAgICAgICAgICAgIC8qITwgU2VsZWN0ZWQgJ2JhbmQgZGVuc2l0eScgZnJvbSBiaXRzdHJlYW0gKi8KewogIGludCBpLCBrLCBpc1BhdGNoQm9yZGVyWzJdLCBsb0xpbUluZGV4LCBoaUxpbUluZGV4LCB0ZW1wTm9MaW0sIG5CYW5kczsKICBVQ0hBUiB3b3JrTGltaXRlckJhbmRUYWJsZVtNQVhfRlJFUV9DT0VGRlMgLyAyICsgTUFYX05VTV9QQVRDSEVTICsgMV07CiAgaW50IHBhdGNoQm9yZGVyc1tNQVhfTlVNX1BBVENIRVMgKyAxXTsKICBpbnQga3gsIGsyOwogIEZJWFBfREJMIHRlbXA7CgogIGludCBsb3dTdWJiYW5kID0gZnJlcUJhbmRUYWJsZVswXTsKICBpbnQgaGlnaFN1YmJhbmQgPSBmcmVxQmFuZFRhYmxlW25vRnJlcUJhbmRzXTsKCiAgLyogMSBsaW1pdGVyIGJhbmQuICovCiAgaWYobGltaXRlckJhbmRzID09IDApIHsKICAgIGxpbWl0ZXJCYW5kVGFibGVbMF0gPSAwOwogICAgbGltaXRlckJhbmRUYWJsZVsxXSA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKICAgIG5CYW5kcyA9IDE7CiAgfSBlbHNlIHsKICAgIGZvciAoaSA9IDA7IGkgPCBub1BhdGNoZXM7IGkrKykgewogICAgICBwYXRjaEJvcmRlcnNbaV0gPSBwYXRjaFBhcmFtW2ldLmd1YXJkU3RhcnRCYW5kIC0gbG93U3ViYmFuZDsKICAgIH0KICAgIHBhdGNoQm9yZGVyc1tpXSA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKCiAgICAvKiAxLjIsIDIsIG9yIDMgbGltaXRlciBiYW5kcy9vY3RhdmUgcGx1cyBiYW5kYm9yZGVycyBhdCBwYXRjaGJvcmRlcnMuICovCiAgICBmb3IgKGsgPSAwOyBrIDw9IG5vRnJlcUJhbmRzOyBrKyspIHsKICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVba10gPSBmcmVxQmFuZFRhYmxlW2tdIC0gbG93U3ViYmFuZDsKICAgIH0KICAgIGZvciAoayA9IDE7IGsgPCBub1BhdGNoZXM7IGsrKykgewogICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtub0ZyZXFCYW5kcyArIGtdID0gcGF0Y2hCb3JkZXJzW2tdOwogICAgfQoKICAgIHRlbXBOb0xpbSA9IG5CYW5kcyA9IG5vRnJlcUJhbmRzICsgbm9QYXRjaGVzIC0gMTsKICAgIHNoZWxsc29ydCh3b3JrTGltaXRlckJhbmRUYWJsZSwgdGVtcE5vTGltICsgMSk7CgogICAgbG9MaW1JbmRleCA9IDA7CiAgICBoaUxpbUluZGV4ID0gMTsKCgogICAgd2hpbGUgKGhpTGltSW5kZXggPD0gdGVtcE5vTGltKSB7CiAgICAgIGsyID0gd29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gKyBsb3dTdWJiYW5kOwogICAgICBreCA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdICsgbG93U3ViYmFuZDsKCiAgICAgIHRlbXAgPSBGWF9TR0wyRlhfREJMKEZES19nZXROdW1PY3RhdmVzRGl2OChreCxrMikpOyAvKiBOdW1iZXIgb2Ygb2N0YXZlcyAqLwogICAgICB0ZW1wID0gZk11bHQodGVtcCwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbbGltaXRlckJhbmRzXSk7CgogICAgICBpZiAodGVtcCA8IEZMMkZYQ09OU1RfREJMICgwLjQ5Zik+PjUpIHsKICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CiAgICAgICAgICBuQmFuZHMtLTsKICAgICAgICAgIGhpTGltSW5kZXgrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpc1BhdGNoQm9yZGVyWzBdID0gaXNQYXRjaEJvcmRlclsxXSA9IDA7CiAgICAgICAgZm9yIChrID0gMDsgayA8PSBub1BhdGNoZXM7IGsrKykgewogICAgICAgICAgaWYgKHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID09IHBhdGNoQm9yZGVyc1trXSkgewogICAgICAgICAgICBpc1BhdGNoQm9yZGVyWzFdID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghaXNQYXRjaEJvcmRlclsxXSkgewogICAgICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPSBoaWdoU3ViYmFuZDsKICAgICAgICAgIG5CYW5kcy0tOwogICAgICAgICAgaGlMaW1JbmRleCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoayA9IDA7IGsgPD0gbm9QYXRjaGVzOyBrKyspIHsKICAgICAgICAgIGlmICh3b3JrTGltaXRlckJhbmRUYWJsZVtsb0xpbUluZGV4XSA9PSBwYXRjaEJvcmRlcnNba10pIHsKICAgICAgICAgICAgaXNQYXRjaEJvcmRlclswXSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWlzUGF0Y2hCb3JkZXJbMF0pIHsKICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdID0gaGlnaFN1YmJhbmQ7CiAgICAgICAgICBuQmFuZHMtLTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbG9MaW1JbmRleCA9IGhpTGltSW5kZXg7CiAgICAgIGhpTGltSW5kZXgrKzsKCiAgICB9CiAgICBzaGVsbHNvcnQod29ya0xpbWl0ZXJCYW5kVGFibGUsIHRlbXBOb0xpbSArIDEpOwoKICAgIC8qIFRlc3QgaWYgYWxnb3JpdGhtIGV4Y2VlZGVkIG1heGltdW0gYWxsb3dlZCBsaW1pdGVyYmFuZHMgKi8KICAgIGlmKCBuQmFuZHMgPiBNQVhfTlVNX0xJTUlURVJTIHx8IG5CYW5kcyA8PSAwKSB7CiAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgfQoKICAgIC8qIENvcHkgbGltaXRlcmJhbmRzIGZyb20gd29ya2luZyBidWZmZXIgaW50byBmaW5hbCBkZXN0aW5hdGlvbiAqLwogICAgZm9yIChrID0gMDsgayA8PSBuQmFuZHM7IGsrKykgewogICAgICBsaW1pdGVyQmFuZFRhYmxlW2tdID0gd29ya0xpbWl0ZXJCYW5kVGFibGVba107CiAgICB9CiAgfQogICpub0xpbWl0ZXJCYW5kcyA9IG5CYW5kczsKCiAgcmV0dXJuIFNCUkRFQ19PSzsKfQoK