Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIEFBQyBFbmNvZGVyIGxpYiAgKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6IE0uIE5ldXNpbmdlcgogICBEZXNjcmlwdGlvbjogQ29tcHJlc3NvciBmb3IgQUFDIE1ldGFkYXRhIEdlbmVyYXRvcgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiNpbmNsdWRlICJtZXRhZGF0YV9jb21wcmVzc29yLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgoKCiNkZWZpbmUgTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTZmICAvKiBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyICovCiNkZWZpbmUgSUxPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDQyNjk1MDQxZiAgICAvKiAxL0xPRzIgKi8KI2RlZmluZSBGSVhQX0lMT0cyX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKElMT0cyLzIpKQoKLyotLS0tLS0tLS0tLS0tLS0tLSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBNQVhfRFJDX0NIQU5ORUxTICAgICAgICAoOCkgICAgICAgICAgLyohPCBNYXggbnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLiAqLwojZGVmaW5lIERPV05NSVhfU0hJRlQgICAgICAgICAgICgzKSAgICAgICAgICAvKiE8IE1heCA4IGNoYW5uZWwuICovCiNkZWZpbmUgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCAgKDIpICAgICAgICAgIC8qITwgU2NhbGluZyB1c2VkIGluIHdlaWdodGluZyBmaWx0ZXIuICovCgojZGVmaW5lIE1FVEFEQVRBX0lOVF9CSVRTICAgICAgMTAKI2RlZmluZSBNRVRBREFUQV9MSU5UX0JJVFMgICAgIDIwCiNkZWZpbmUgTUVUQURBVEFfSU5UX1NDQUxFICAgICAoSU5UNjQoMSk8PChNRVRBREFUQV9JTlRfQklUUykpCiNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfQklUUyAgICAoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9JTlRfQklUUykKI2RlZmluZSBNRVRBREFUQV9GUkFDVF9TQ0FMRSAgIChJTlQ2NCgxKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMpKQoKLyoqCiAqICBFbnVtIGZvciBjaGFubmVsIGFzc2lnbm1lbnQuCiAqLwplbnVtIHsKICAgIEwgICA9IDAsCiAgICBSICAgPSAxLAogICAgQyAgID0gMiwKICAgIExGRSA9IDMsCiAgICBMUyAgPSA0LAogICAgUlMgID0gNSwKICAgIFMgICA9IDYsCiAgICBMUzIgPSA3LAogICAgUlMyID0gOAp9OwoKLyotLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogKiAgU3RydWN0dXJlIGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgZmlsdGVyIHN0YXRlcy4KICovCnN0cnVjdCBXRUlHSFRJTkdfU1RBVEVTIHsKICAgIEZJWFBfREJMIHgxOwogICAgRklYUF9EQkwgeDI7CiAgICBGSVhQX0RCTCB5MTsKICAgIEZJWFBfREJMIHkyOwp9OwoKLyoqCiAqICBEeW5hbWljIFJhbmdlIENvbnRyb2wgY29tcHJlc3NvciBzdHJ1Y3R1cmUuCiAqLwpzdHJ1Y3QgRFJDX0NPTVAgewoKICAgIEZJWFBfREJMICAgICBtYXhCb29zdFRoclsyXTsgICAgICAgICAgICAgLyohPCBNYXggYm9vc3QgdGhyZXNob2xkLiAqLwogICAgRklYUF9EQkwgICAgIGJvb3N0VGhyWzJdOyAgICAgICAgICAgICAgICAvKiE8IEJvb3N0IHRocmVzaG9sZC4gKi8KICAgIEZJWFBfREJMICAgICBlYXJseUN1dFRoclsyXTsgICAgICAgICAgICAgLyohPCBFYXJseSBjdXQgdGhyZXNob2xkLiAqLwogICAgRklYUF9EQkwgICAgIGN1dFRoclsyXTsgICAgICAgICAgICAgICAgICAvKiE8IEN1dCB0aHJlc2hvbGQuICovCiAgICBGSVhQX0RCTCAgICAgbWF4Q3V0VGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgTWF4IGN1dCB0aHJlc2hvbGQuICovCgogICAgRklYUF9EQkwgICAgIGJvb3N0RmFjWzJdOyAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBib29zdCBjb21wcmVzc2lvbi4gKi8KICAgIEZJWFBfREJMICAgICBlYXJseUN1dEZhY1syXTsgICAgICAgICAgICAgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgZWFybHkgY3V0IGNvbXByZXNzaW9uLiAqLwogICAgRklYUF9EQkwgICAgIGN1dEZhY1syXTsgICAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBjdXQgY29tcHJlc3Npb24uICovCgogICAgRklYUF9EQkwgICAgIG1heEJvb3N0WzJdOyAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gYm9vc3QuICovCiAgICBGSVhQX0RCTCAgICAgbWF4Q3V0WzJdOyAgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBjdXQuICovCiAgICBGSVhQX0RCTCAgICAgbWF4RWFybHlDdXRbMl07ICAgICAgICAgICAgIC8qITwgTWF4aW11bSBlYXJseSBjdXQuICovCgogICAgRklYUF9EQkwgICAgIGZhc3RBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IEZhc3QgYXR0YWNrIGNvZWZmaWNpZW50LiAqLwogICAgRklYUF9EQkwgICAgIGZhc3REZWNheVsyXTsgICAgICAgICAgICAgICAvKiE8IEZhc3QgcmVsZWFzZSBjb2VmZmljaWVudC4gKi8KICAgIEZJWFBfREJMICAgICBzbG93QXR0YWNrWzJdOyAgICAgICAgICAgICAgLyohPCBTbG93IGF0dGFjayBjb2VmZmljaWVudC4gKi8KICAgIEZJWFBfREJMICAgICBzbG93RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBTbG93IHJlbGVhc2UgY29lZmZpY2llbnQuICovCiAgICBVSU5UICAgICAgICAgaG9sZE9mZlsyXTsgICAgICAgICAgICAgICAgIC8qITwgSG9sZCB0aW1lIGluIGJsb2Nrcy4gKi8KCiAgICBGSVhQX0RCTCAgICAgYXR0YWNrVGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IGF0dGFjayB0aHJlc2hvbGQuICovCiAgICBGSVhQX0RCTCAgICAgZGVjYXlUaHJbMl07ICAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IHJlbGVhc2UgdGhyZXNob2xkLiAqLwoKICAgIERSQ19QUk9GSUxFICBwcm9maWxlWzJdOyAgICAgICAgICAgICAgICAgLyohPCBEUkMgcHJvZmlsZS4gKi8KICAgIElOVCAgICAgICAgICBibG9ja0xlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBCbG9jayBsZW5ndGggaW4gc2FtcGxlcy4gKi8KICAgIFVJTlQgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGUgcmF0ZS4gKi8KICAgIENIQU5ORUxfTU9ERSBjaGFuQ29uZmlnOyAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCgogICAgVUNIQVIgICAgICAgIHVzZVdlaWdodGluZzsgICAgICAgICAgICAgICAvKiE8IFVzZSB3ZWlnaHRpbmcgZmlsdGVyLiAqLwoKICAgIFVJTlQgICAgICAgICBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMuICovCiAgICBVSU5UICAgICAgICAgZnVsbENoYW5uZWxzOyAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZ1bGwgcmFuZ2UgY2hhbm5lbHMuICovCiAgICBJTlQgICAgICAgICAgY2hhbm5lbElkeFs5XTsgICAgICAgICAgICAgIC8qITwgT2Zmc2V0cyBvZiBpbnRlcmxlYXZlZCBjaGFubmVsIHNhbXBsZXMgKEwsIFIsIEMsIExGRSwgTHMsIFJzLCBTLCBMczIsIFJzMikuICovCgogICAgRklYUF9EQkwgICAgIHNtb290aExldmVsWzJdOyAgICAgICAgICAgICAvKiE8IGxldmVsIHNtb290aGluZyBzdGF0ZXMgKi8KICAgIEZJWFBfREJMICAgICBzbW9vdGhHYWluWzJdOyAgICAgICAgICAgICAgLyohPCBnYWluIHNtb290aGluZyBzdGF0ZXMgKi8KICAgIFVJTlQgICAgICAgICBob2xkQ250WzJdOyAgICAgICAgICAgICAgICAgLyohPCBob2xkIGNvdW50ZXIgKi8KCiAgICBGSVhQX0RCTCAgICAgbGltR2FpblsyXTsgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBnYWluICovCiAgICBGSVhQX0RCTCAgICAgbGltRGVjYXk7ICAgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBkZWNheSAobGluZWFyKSAqLwogICAgRklYUF9EQkwgICAgIHByZXZQZWFrWzJdOyAgICAgICAgICAgICAgICAvKiE8IG1heCBwZWFrIG9mIHByZXZpb3VzIGJsb2NrIChzdGVyZW8vbW9ubykqLwoKICAgIFdFSUdIVElOR19TVEFURVMgZmlsdGVyW01BWF9EUkNfQ0hBTk5FTFNdOyAvKiE8IGFycmF5IGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgc3RhdGVzICovCgp9OwoKLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICogIFByb2ZpbGUgdGFibGVzLgogKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC00Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01NTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC02NTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC01MDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC00MTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkVhcmx5Q3V0VGhyW10gPSB7CiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkN1dFRocltdICAgICAgPSB7CiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKC0xMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFRocltdICAgPSB7CiAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSg5PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDk8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0UmF0aW9bXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzUuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvNS5mKSAtIDEuZikgKQp9OwpzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRWFybHlDdXRSYXRpb1tdID0gewogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAogICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzEuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApCn07CnN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRSYXRpb1tdICAgICAgPSB7CiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvIDIuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCiAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICkKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0W10gPSB7CiAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoIDY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxMjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFtdICAgPSB7CiAgICAoRklYUF9EQkwpKDI0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkZhc3RBdHRhY2tbXSA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQp9OwpzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRmFzdERlY2F5W10gID0gewogICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCggKDIwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCn07CnN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJTbG93QXR0YWNrW10gPSB7CiAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCiAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAogICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgKDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSkKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYlNsb3dEZWNheVtdICA9IHsKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKICAgIEZMMkZYQ09OU1RfREJMKCAgICAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQp9OwoKc3RhdGljIGNvbnN0IElOVCB0YWJIb2xkT2ZmW10gICAgPSB7IDEwLCAxMCwgMTAsIDEwLCAxMCwgMCB9OwoKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkF0dGFja1RocltdID0gewogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKfTsKc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkRlY2F5VGhyW10gID0gewogICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDIwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAogICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCiAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKICAgIChGSVhQX0RCTCkoIDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCn07CgovKioKICogIFdlaWdodGluZyBmaWx0ZXIgY29lZmZpY2llbnRzIChiaXF1YWQgYmFuZHBhc3MpLgogKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIGIwID0gRkwyRlhDT05TVF9EQkwoMC41MzA1MDY2MmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYjEgPSAwLCBiMiA9IC1iMCAqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgYTEgPSBGTDJGWENPTlNUX0RCTCgtMC45NTIzNzk4M2YpLCBhMiA9IEZMMkZYQ09OU1RfREJMKC0wLjAyMjQ4ODM2Zik7ICAvKiBhMCA9IDEgKi8KCgovKi0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICogXGJyaWVmICBDYWxjdWxhdGUgc2NhbGluZyBmYWN0b3IgZm9yIGRlbm90ZWQgcHJvY2Vzc2luZyBibG9jay4KICoKICogXHBhcmFtIGJsb2NrTGVuZ3RoICAgTGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2suCiAqCiAqIFxyZXR1cm4gICAgc2hpZnRGYWN0b3IKICovCnN0YXRpYyBVSU5UIGdldFNoaWZ0RmFjdG9yKAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbGVuZ3RoCiAgICAgICAgKQp7CiAgICBVSU5UIGxkTjsKICAgIGZvcihsZE49MTsoKChVSU5UKTEpPDxsZE4pIDwgbGVuZ3RoO2xkTisrKTsKCiAgICByZXR1cm4gbGROOwp9CgovKioKICogXGJyaWVmICBTdW0gdXAgZml4cG9pbnQgdmFsdWVzIHdpdGggYmVzdCBwb3NzaWJsZSBhY2N1cmFjeS4KICoKICogXHBhcmFtIHZhbHVlMSAgICAgICAgRmlyc3QgaW5wdXQgdmFsdWUuCiAqIFxwYXJhbSBxMSAgICAgICAgICAgIFNjYWxpbmcgZmFjdG9yIG9mIGZpcnN0IGlucHV0IHZhbHVlLgogKiBccGFyYW0gcFZhbHVlMiAgICAgICBQb2ludGVyIHRvIHNlY29uZCBpbnB1dCB2YWx1ZSwgd2lsbCBiZSBtb2RpZmllZCBvbiByZXR1cm4uCiAqIFxwYXJhbSBwUTIgICAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIHNjYWxpbmcgZmFjdG9yLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KICoKICogXHJldHVybiAgICB2b2lkCiAqLwpzdGF0aWMgdm9pZCBmaXhwQWRkKAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgICAgICAgdmFsdWUxLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgcTEsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgICAgICBwVmFsdWUyLAogICAgICAgIGludCAqY29uc3QgICAgICAgICAgICAgICAgICAgICAgcFEyCiAgICAgICAgKQp7CiAgY29uc3QgaW50IGhlYWRyb29tMSA9IGZOb3JteihmaXhwX2Ficyh2YWx1ZTEpKS0xOwogIGNvbnN0IGludCBoZWFkcm9vbTIgPSBmTm9ybXooZml4cF9hYnMoKnBWYWx1ZTIpKS0xOwogIGludCByZXN1bHRTY2FsZSA9IGZpeE1heChxMS1oZWFkcm9vbTEsICgqcFEyKS1oZWFkcm9vbTIpOwoKICBpZiAoICh2YWx1ZTEhPUZMMkZYQ09OU1RfREJMKDAuZikpICYmICgqcFZhbHVlMiE9RkwyRlhDT05TVF9EQkwoMC5mKSkgKSB7CiAgICByZXN1bHRTY2FsZSsrOwogIH0KCiAgKnBWYWx1ZTIgPSBzY2FsZVZhbHVlKHZhbHVlMSwgcTEtcmVzdWx0U2NhbGUpICsgc2NhbGVWYWx1ZSgqcFZhbHVlMiwgKCpwUTIpLXJlc3VsdFNjYWxlKTsKICAqcFEyID0gKCpwVmFsdWUyIT0oRklYUF9EQkwpMCkgPyByZXN1bHRTY2FsZSA6IERGUkFDVF9CSVRTLTE7Cn0KCi8qKgogKiBcYnJpZWYgIEZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHRpbWUgY29uc3RhbnQgdG8gZmlsdGVyIGNvZWZmaWNpZW50LgogKgogKiBccGFyYW0gdCAgICAgICAgICAgICBUaW1lIGNvbnN0YW50LgogKiBccGFyYW0gc2FtcGxlUmF0ZSAgICBTYW1wbGluZyByYXRlIGluIEh6LgogKiBccGFyYW0gYmxvY2tMZW5ndGggICBMZW5ndGggb2YgcHJvY2Vzc2luZyBibG9jayBpbiBzYW1wbGVzIHBlciBjaGFubmVsLgogKgogKiBccmV0dXJuICAgIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKQogKi8Kc3RhdGljIEZJWFBfREJMIHRjMkNvZWZmKAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aAogICAgICAgICkKewogICBGSVhQX0RCTCBzYW1wbGVSYXRlRnJhY3Q7CiAgIEZJWFBfREJMIGJsb2NrTGVuZ3RoRnJhY3Q7CiAgIEZJWFBfREJMIGYsIHByb2R1Y3Q7CiAgIEZJWFBfREJMIGV4cG9uZW50LCByZXN1bHQ7CiAgIElOVCBlX3JlczsKCiAgIC8qIGYgPSBzYW1wbGVSYXRlL2Jsb2NrTGVuZ3RoICovCiAgIHNhbXBsZVJhdGVGcmFjdCA9IChGSVhQX0RCTCkoc2FtcGxlUmF0ZTw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7CiAgIGJsb2NrTGVuZ3RoRnJhY3QgPSAoRklYUF9EQkwpKGJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9MSU5UX0JJVFMpKTsKICAgZiA9IGZEaXZOb3JtKHNhbXBsZVJhdGVGcmFjdCwgYmxvY2tMZW5ndGhGcmFjdCwgJmVfcmVzKTsKICAgZiA9IHNjYWxlVmFsdWUoZiwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCgogICAvKiBwcm9kdWN0ID0gdCpmICovCiAgIHByb2R1Y3QgPSBmTXVsdE5vcm0odCwgZiwgJmVfcmVzKTsKICAgcHJvZHVjdCA9IHNjYWxlVmFsdWUocHJvZHVjdCwgZV9yZXMrTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCgogICAvKiBleHBvbmVudCA9ICgtMS4wLygodCkgKiAoZikpKSAqLwogICBleHBvbmVudCA9IGZEaXZOb3JtKE1FVEFEQVRBX0ZSQUNUX1NDQUxFLCBwcm9kdWN0LCAmZV9yZXMpOwogICBleHBvbmVudCA9IHNjYWxlVmFsdWUoZXhwb25lbnQsIGVfcmVzLU1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLwoKICAgLyogZXhwb25lbnQgKiBsZChlKSAqLwogICBleHBvbmVudCA9IGZNdWx0KGV4cG9uZW50LEZJWFBfSUxPRzJfRElWMik8PDE7IC8qIGVeKHgpID0gMl4oeCpsZChlKSkgKi8KCiAgIC8qIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwogICByZXN1bHQgPSBmMlBvdygtZXhwb25lbnQsIERGUkFDVF9CSVRTLTEtTUVUQURBVEFfRlJBQ1RfQklUUywgJmVfcmVzKTsKCiAgIC8qIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwogICByZXN1bHQgPSBGTDJGWENPTlNUX0RCTCgxLjBmKSAtIHNjYWxlVmFsdWUocmVzdWx0LCBlX3Jlcyk7CgogICByZXR1cm4gcmVzdWx0Owp9CgpJTlQgRkRLX0RSQ19HZW5lcmF0b3JfT3BlbigKICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgKnBoRHJjQ29tcAogICAgICAgICkKewogICAgSU5UIGVyciA9IDA7CiAgICBIRFJDX0NPTVAgaERjQ29tcCA9IE5VTEw7CgogICAgaWYgKHBoRHJjQ29tcCA9PSBOVUxMKSB7CiAgICAgIGVyciA9IC0xOwogICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCiAgICBoRGNDb21wID0gKEhEUkNfQ09NUClGREtjYWxsb2MoMSwgc2l6ZW9mKERSQ19DT01QKSk7CgogICAgaWYgKGhEY0NvbXAgPT0gTlVMTCkgewogICAgICBlcnIgPSAtMTsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIEZES21lbWNsZWFyKGhEY0NvbXAsIHNpemVvZihEUkNfQ09NUCkpOwoKICAgIC8qIFJldHVybiBkcmMgY29tcHJlc3NvciBpbnN0YW5jZSAqLwogICAgKnBoRHJjQ29tcCA9IGhEY0NvbXA7CiAgICByZXR1cm4gZXJyOwpiYWlsOgogICAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJmhEY0NvbXApOwogICAgcmV0dXJuIGVycjsKfQoKSU5UIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKAogICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCiAgICAgICAgKQp7CiAgICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaWYgKCpwaERyY0NvbXAgIT0gTlVMTCkgewogICAgICBGREtmcmVlKCpwaERyY0NvbXApOwogICAgICAqcGhEcmNDb21wID0gTlVMTDsKICAgIH0KICAgIHJldHVybiAwOwp9CgoKSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoCiAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAogICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCiAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aCwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKICAgICAgICBjb25zdCBDSEFOTkVMX09SREVSICAgICAgICAgICAgIGNoYW5uZWxPcmRlciwKICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHVzZVdlaWdodGluZwogICAgICAgICkKewogICAgaW50IGk7CiAgICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7CgogICAgZHJjQ29tcC0+bGltRGVjYXkgPSBGTDJGWENPTlNUX0RCTCggKCgwLjAwNmYgLyAyNTYpICogYmxvY2tMZW5ndGgpIC8gTUVUQURBVEFfSU5UX1NDQUxFICk7CgogICAgLyogU2F2ZSBwYXJhbWV0ZXJzLiAqLwogICAgZHJjQ29tcC0+YmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDsKICAgIGRyY0NvbXAtPnNhbXBsZVJhdGUgID0gc2FtcGxlUmF0ZTsKICAgIGRyY0NvbXAtPmNoYW5Db25maWcgPSBjaGFubmVsTW9kZTsKICAgIGRyY0NvbXAtPnVzZVdlaWdodGluZyA9IHVzZVdlaWdodGluZzsKCiAgICBpZiAoRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZShkcmNDb21wLCBwcm9maWxlTGluZSwgcHJvZmlsZVJGKSE9MCkgeyAvKiBleHBlY3RzIGluaXRpYWxpemVkIGJsb2NrTGVuZ3RoIGFuZCBzYW1wbGVSYXRlICovCiAgICAgIHJldHVybiAoLTEpOwogICAgfQoKICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNoYW5uZWwgb2Zmc2V0cy4gKi8KICAgIGlmIChGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGNoYW5uZWxNb2RlLCBjaGFubmVsT3JkZXIsICZjaGFubmVsTWFwcGluZykhPUFBQ19FTkNfT0spIHsKICAgICAgcmV0dXJuICgtMik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgZHJjQ29tcC0+Y2hhbm5lbElkeFtpXSA9IC0xOwoKICAgIHN3aXRjaCAoY2hhbm5lbE1vZGUpIHsKICAgIGNhc2UgTU9ERV8xOiAvKiBtb25vICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8yOiAvKiBzdGVyZW8gKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfMV8yOiAvKiAzY2ggKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMTogLyogNGNoICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMjogLyogNWNoICovCiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAvKiA1LjEgY2ggKi8KICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6IC8qIDcuMSBjaCAqLwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1s0XS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOwogICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFsxXTsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xXzE6CiAgICBjYXNlIE1PREVfMV8xXzFfMToKICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMToKICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMV8xXzE6CiAgICBjYXNlIE1PREVfMV8xXzFfMV8xXzFfMV8xXzFfMV8xXzE6CiAgICBjYXNlIE1PREVfMl8yOgogICAgY2FzZSBNT0RFXzJfMl8yOgogICAgY2FzZSBNT0RFXzJfMl8yXzI6CiAgICBjYXNlIE1PREVfMl8yXzJfMl8yXzI6CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAoLTEpOwogICAgfQoKICAgIGRyY0NvbXAtPmZ1bGxDaGFubmVscyA9IGNoYW5uZWxNYXBwaW5nLm5DaGFubmVsc0VmZjsKICAgIGRyY0NvbXAtPmNoYW5uZWxzICAgICA9IGNoYW5uZWxNYXBwaW5nLm5DaGFubmVsczsKCiAgICAvKiBJbml0IHN0YXRlcy4gKi8KICAgIGRyY0NvbXAtPnNtb290aExldmVsWzBdID0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbMV0gPSAoRklYUF9EQkwpKC0xMzU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpOwoKICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPnNtb290aEdhaW4sIHNpemVvZihkcmNDb21wLT5zbW9vdGhHYWluKSk7CiAgICBGREttZW1jbGVhcihkcmNDb21wLT5ob2xkQ250LCBzaXplb2YoZHJjQ29tcC0+aG9sZENudCkpOwogICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+bGltR2Fpbiwgc2l6ZW9mKGRyY0NvbXAtPmxpbUdhaW4pKTsKICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPnByZXZQZWFrLCBzaXplb2YoZHJjQ29tcC0+cHJldlBlYWspKTsKICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPmZpbHRlciwgc2l6ZW9mKGRyY0NvbXAtPmZpbHRlcikpOwoKICAgIHJldHVybiAoMCk7Cn0KCgpJTlQgRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZSgKICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCiAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVSRgogICAgICAgICkKewogICAgaW50IHByb2ZpbGVJZHgsIGk7CgogICAgZHJjQ29tcC0+cHJvZmlsZVswXSA9IHByb2ZpbGVMaW5lOwogICAgZHJjQ29tcC0+cHJvZmlsZVsxXSA9IHByb2ZpbGVSRjsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgLyogZ2V0IHByb2ZpbGUgaW5kZXggKi8KICAgICAgICBzd2l0Y2ggKGRyY0NvbXAtPnByb2ZpbGVbaV0pIHsKICAgICAgICAgICAgY2FzZSBEUkNfTk9ORToKICAgICAgICAgICAgY2FzZSBEUkNfRklMTVNUQU5EQVJEOiAgcHJvZmlsZUlkeCA9IDA7IGJyZWFrOwogICAgICAgICAgICBjYXNlIERSQ19GSUxNTElHSFQ6ICAgICBwcm9maWxlSWR4ID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRFJDX01VU0lDU1RBTkRBUkQ6IHByb2ZpbGVJZHggPSAyOyBicmVhazsKICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNMSUdIVDogICAgcHJvZmlsZUlkeCA9IDM7IGJyZWFrOwogICAgICAgICAgICBjYXNlIERSQ19TUEVFQ0g6ICAgICAgICBwcm9maWxlSWR4ID0gNDsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRFJDX0RFTEFZX1RFU1Q6ICAgIHByb2ZpbGVJZHggPSA1OyBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICgtMSk7CiAgICAgICAgfQoKICAgICAgICAvKiBnZXQgcGFyYW1ldGVycyBmb3Igc2VsZWN0ZWQgcHJvZmlsZSAqLwogICAgICAgIGlmIChwcm9maWxlSWR4ID49IDApIHsKICAgICAgICAgICAgZHJjQ29tcC0+bWF4Qm9vc3RUaHJbaV0gPSB0YWJNYXhCb29zdFRocltwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+Ym9vc3RUaHJbaV0gICAgPSB0YWJCb29zdFRocltwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0gPSB0YWJFYXJseUN1dFRocltwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+Y3V0VGhyW2ldICAgICAgPSB0YWJDdXRUaHJbcHJvZmlsZUlkeF07CiAgICAgICAgICAgIGRyY0NvbXAtPm1heEN1dFRocltpXSAgID0gdGFiTWF4Q3V0VGhyW3Byb2ZpbGVJZHhdOwoKICAgICAgICAgICAgZHJjQ29tcC0+Ym9vc3RGYWNbaV0gICAgPSB0YWJCb29zdFJhdGlvW3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSA9IHRhYkVhcmx5Q3V0UmF0aW9bcHJvZmlsZUlkeF07CiAgICAgICAgICAgIGRyY0NvbXAtPmN1dEZhY1tpXSAgICAgID0gdGFiQ3V0UmF0aW9bcHJvZmlsZUlkeF07CgogICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFtpXSAgICA9IHRhYk1heEJvb3N0W3Byb2ZpbGVJZHhdOwogICAgICAgICAgICBkcmNDb21wLT5tYXhDdXRbaV0gICAgICA9IHRhYk1heEN1dFtwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+bWF4RWFybHlDdXRbaV0gPSAtIGZNdWx0KChkcmNDb21wLT5jdXRUaHJbaV0gLSBkcmNDb21wLT5lYXJseUN1dFRocltpXSksIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldKTsgLyogbm8gc2NhbGluZyBhZnRlciBtdWx0IG5lZWRlZCwgZWFybHlDdXRGYWMgaXMgaW4gRklYUF9EQkwgKi8KCiAgICAgICAgICAgIGRyY0NvbXAtPmZhc3RBdHRhY2tbaV0gID0gdGMyQ29lZmYodGFiRmFzdEF0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwogICAgICAgICAgICBkcmNDb21wLT5mYXN0RGVjYXlbaV0gICA9IHRjMkNvZWZmKHRhYkZhc3REZWNheVtwcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwogICAgICAgICAgICBkcmNDb21wLT5zbG93QXR0YWNrW2ldICA9IHRjMkNvZWZmKHRhYlNsb3dBdHRhY2tbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKICAgICAgICAgICAgZHJjQ29tcC0+c2xvd0RlY2F5W2ldICAgPSB0YzJDb2VmZih0YWJTbG93RGVjYXlbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKICAgICAgICAgICAgZHJjQ29tcC0+aG9sZE9mZltpXSAgICAgPSB0YWJIb2xkT2ZmW3Byb2ZpbGVJZHhdICogMjU2IC8gZHJjQ29tcC0+YmxvY2tMZW5ndGg7CgogICAgICAgICAgICBkcmNDb21wLT5hdHRhY2tUaHJbaV0gICA9IHRhYkF0dGFja1Rocltwcm9maWxlSWR4XTsKICAgICAgICAgICAgZHJjQ29tcC0+ZGVjYXlUaHJbaV0gICAgPSB0YWJEZWNheVRocltwcm9maWxlSWR4XTsKICAgICAgICB9CgogICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgfQogICAgcmV0dXJuICgwKTsKfQoKCklOVCBGREtfRFJDX0dlbmVyYXRvcl9DYWxjKAogICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgIGluU2FtcGxlcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGRpYWxub3JtLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZHJjX1RhcmdldFJlZkxldmVsLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbCwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIGNsZXYsCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgICAgICBzbGV2LAogICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgcER5bnJuZywKICAgICAgICBJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIHBDb21wcgogICAgICAgICkKewogICAgaW50IGksIGM7CiAgICBGSVhQX0RCTCBwZWFrWzJdOwoKCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICogY29tcHJlc3NvcgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmICgoZHJjQ29tcC0+cHJvZmlsZVswXSAhPSBEUkNfTk9ORSkgfHwgKGRyY0NvbXAtPnByb2ZpbGVbMV0gIT0gRFJDX05PTkUpKSB7CiAgICAgICAgLyogQ2FsYyBsb3VkbmVzcyBsZXZlbCAqLwogICAgICAgIEZJWFBfREJMIGxldmVsX2IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgIGludCAgICAgIGxldmVsX2UgPSBERlJBQ1RfQklUUy0xOwoKICAgICAgICAvKiBJbmNyZWFzZSBlbmVyZ3kgdGltZSByZXNvbHV0aW9uIHdpdGggc2hvcnRlciBwcm9jZXNzaW5nIGJsb2Nrcy4gMzIgaXMgYW4gZW1waXJpYyB2YWx1ZS4gKi8KICAgICAgICBjb25zdCBpbnQgZ3JhbnVsZUxlbmd0aCA9IGZpeE1pbigzMiwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwoKICAgICAgICBpZiAoZHJjQ29tcC0+dXNlV2VpZ2h0aW5nKSB7CiAgICAgICAgICAgIEZJWFBfREJMIHgxLCB4MiwgeSwgeTEsIHkyOwogICAgICAgICAgICAvKiBzdW0gb2YgZmlsdGVyIGNvZWZmaWNpZW50cyBhYm91dCAyLjUgLT4gc3F1YXJlZCB2YWx1ZSBpcyA2LjI1CiAgICAgICAgICAgICAgIFdFSUdIVElOR19GSUxURVJfU0hJRlQgaXMgMiAtPiBzY2FsaW5nIGFib3V0IDE2LCB0aGVyZWZvcmUgcmVkdWNlIGdyYW51bGVTaGlmdCBieSAxLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29uc3QgaW50IGdyYW51bGVTaGlmdCA9IGdldFNoaWZ0RmFjdG9yKGdyYW51bGVMZW5ndGgpLTE7CgogICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbY107CgogICAgICAgICAgICAgICAgaWYgKGMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogc2tpcCBMRkUgKi8KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBnZXQgZmlsdGVyIHN0YXRlcyAqLwogICAgICAgICAgICAgICAgeDEgPSBkcmNDb21wLT5maWx0ZXJbY10ueDE7CiAgICAgICAgICAgICAgICB4MiA9IGRyY0NvbXAtPmZpbHRlcltjXS54MjsKICAgICAgICAgICAgICAgIHkxID0gZHJjQ29tcC0+ZmlsdGVyW2NdLnkxOwogICAgICAgICAgICAgICAgeTIgPSBkcmNDb21wLT5maWx0ZXJbY10ueTI7CgogICAgICAgICAgICAgICAgaSA9IDA7CgogICAgICAgICAgICAgICAgZG8gewoKICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICAgICAgICAgICAgICAgICAgZm9yIChpPW9mZnNldDsgaSA8IGZpeE1pbihvZmZzZXQrZ3JhbnVsZUxlbmd0aCxkcmNDb21wLT5ibG9ja0xlbmd0aCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qIGFwcGx5IHdlaWdodGluZyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB4ID0gRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbaSpkcmNDb21wLT5jaGFubmVsc10pID4+IFdFSUdIVElOR19GSUxURVJfU0hJRlQ7CgogICAgICAgICAgICAgICAgICAgIC8qIHkgPSBiMCAqICh4IC0geDIpIC0gYTEgKiB5MSAtIGEyICogeTI7ICovCiAgICAgICAgICAgICAgICAgICAgeSA9IGZNdWx0KGIwLHgteDIpIC0gZk11bHQoYTEseTEpIC0gZk11bHQoYTIseTIpOwoKICAgICAgICAgICAgICAgICAgICB4MiA9IHgxOwogICAgICAgICAgICAgICAgICAgIHgxID0geDsKICAgICAgICAgICAgICAgICAgICB5MiA9IHkxOwogICAgICAgICAgICAgICAgICAgIHkxID0geTsKCiAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmUG93MkRpdjIoeSk+PihncmFudWxlU2hpZnQtMSk7ICAgICAvKiBwYXJ0aWFsIGVuZXJneSAqLwogICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KCiAgICAgICAgICAgICAgICAgIGZpeHBBZGQoYWNjdSwgZ3JhbnVsZVNoaWZ0KzIqV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCwgJmxldmVsX2IsICZsZXZlbF9lKTsgLyogc3VwIHVwIHBhcnRpYWwgZW5lcmdpZXMgKi8KCiAgICAgICAgICAgICAgICB9IHdoaWxlICggaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoICk7CgoKICAgICAgICAgICAgICAgIC8qIHNhdmUgZmlsdGVyIHN0YXRlcyAqLwogICAgICAgICAgICAgICAgZHJjQ29tcC0+ZmlsdGVyW2NdLngxID0geDE7CiAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDIgPSB4MjsKICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS55MSA9IHkxOwogICAgICAgICAgICAgICAgZHJjQ29tcC0+ZmlsdGVyW2NdLnkyID0geTI7CiAgICAgICAgICAgIH0gLyogYyAqLwogICAgICAgIH0gLyogd2VpZ2h0aW5nICovCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKTsKCiAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tjXTsKCiAgICAgICAgICAgICAgICBpZiAoKGludCljID09IGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSkgewogICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgTEZFICovCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaSA9IDA7CgogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyogcGFydGlhbCBlbmVyZ3kgKi8KICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2MigoRklYUF9QQ00pcFNhbXBsZXNbaSpkcmNDb21wLT5jaGFubmVsc10pPj4oZ3JhbnVsZVNoaWZ0LTEpOwogICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KCiAgICAgICAgICAgICAgICAgIGZpeHBBZGQoYWNjdSwgZ3JhbnVsZVNoaWZ0LCAmbGV2ZWxfYiwgJmxldmVsX2UpOyAvKiBzdXAgdXAgcGFydGlhbCBlbmVyZ2llcyAqLwoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGggKTsKICAgICAgICAgICAgfQogICAgICAgIH0gLyogd2VpZ2h0aW5nICovCgogICAgICAgIC8qCiAgICAgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQogICAgICAgICAqLwogICAgICAgIC8qIGxldmVsIHNjYWxpbmcgKi8KCiAgICAgICAgLyogZGVzY2FsZWQgbGV2ZWwgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLwogICAgICAgIEZJWFBfREJMIGxkTGV2ZWwgPSBDYWxjTGREYXRhKGxldmVsX2IpICsgKEZJWFBfREJMKSgobGV2ZWxfZS0xMik8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKSAtIENhbGNMZERhdGEoKEZJWFBfREJMKShkcmNDb21wLT5ibG9ja0xlbmd0aDw8KERGUkFDVF9CSVRTLTEtMTIpKSk7CgogICAgICAgIC8qIGlmIChsZXZlbCA8IDFlLTEwKSBsZXZlbCA9IDFlLTEwZjsgKi8KICAgICAgICBsZExldmVsID0gRkRLbWF4KGxkTGV2ZWwsIEZMMkZYQ09OU1RfREJMKC0wLjUxOTA1MTI2NDgyNjE1MDM2Njg1NDczNzQxMDg1NzcyZikpOwoKICAgICAgICAvKiBsZXZlbCA9IDEwICogbG9nKGxldmVsKS9sb2coMTApICsgMzsKICAgICAgICAgKiAgICAgICA9IDEwKmxvZygyKS9sb2coMTApICogbGQobGV2ZWwpICsgMzsKICAgICAgICAgKiAgICAgICA9IDEwICogMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKGxldmVsKSArIDMKICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZChsZXZlbCkgKyAwLjMpCiAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpICogNjQKICAgICAgICAgKgogICAgICAgICAqICAgIGFkZGl0aW9uYWwgc2NhbGluZyB3aXRoIE1FVEFEQVRBX0ZSQUNUX0JJVFM6CiAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpICogNjQgKiAyXihNRVRBREFUQV9GUkFDVF9CSVRTKQogICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkKICAgICAgICAgKiAgICAgICA9IDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAoIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCApCiAgICAgICAgICogKi8KICAgICAgICBGSVhQX0RCTCBsZXZlbCA9IGZNdWx0KChGSVhQX0RCTCkoMTA8PChNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpKSwgZk11bHQoIEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDlmKSwgbGRMZXZlbCkgKyAoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuM2YpPj5MRF9EQVRBX1NISUZUKSApOwoKICAgICAgICAvKiBsZXZlbCAtPSBkaWFsbm9ybSArIDMxICovICAgLyogdGhpcyBpcyBmaXhlZCB0byBEb2xieS1SZWZlcmVuY2VMZXZlbCBhcyBjb21wcmVzc29yIHByb2ZpbGVzIGFyZSBkZWZpbmVkIHJlbGF0aXZlIHRvIHRoaXMgKi8KICAgICAgICBsZXZlbCAtPSAoKEZJWFBfREJMKShkaWFsbm9ybTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKSAgKyAoRklYUF9EQkwpKDMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgaWYgKGRyY0NvbXAtPnByb2ZpbGVbaV0gPT0gRFJDX05PTkUpIHsKICAgICAgICAgICAgICAgIC8qIG5vIGNvbXByZXNzaW9uICovCiAgICAgICAgICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluW2ldID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEZJWFBfREJMIGdhaW4sIGFscGhhLCBsdmwyc210aGx2bDsKCiAgICAgICAgICAgICAgICAvKiBjYWxjIHN0YXRpYyBnYWluICovCiAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPD0gZHJjQ29tcC0+bWF4Qm9vc3RUaHJbaV0pIHsKICAgICAgICAgICAgICAgICAgICAvKiBtYXggYm9vc3QgKi8KICAgICAgICAgICAgICAgICAgICBnYWluID0gZHJjQ29tcC0+bWF4Qm9vc3RbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPmJvb3N0VGhyW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgLyogYm9vc3QgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+Ym9vc3RUaHJbaV0pLGRyY0NvbXAtPmJvb3N0RmFjW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgLyogbnVsbCBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSBkcmNDb21wLT5jdXRUaHJbaV0pIHsKICAgICAgICAgICAgICAgICAgICAvKiBlYXJseSBjdXQgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pLCBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPm1heEN1dFRocltpXSkgewogICAgICAgICAgICAgICAgICAgIC8qIGN1dCByYW5nZSAqLwogICAgICAgICAgICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5jdXRUaHJbaV0pLCBkcmNDb21wLT5jdXRGYWNbaV0pIC0gZHJjQ29tcC0+bWF4RWFybHlDdXRbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiBtYXggY3V0ICovCiAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IC1kcmNDb21wLT5tYXhDdXRbaV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogY2hvb3NlIHRpbWUgY29uc3RhbnQgKi8KICAgICAgICAgICAgICAgIGx2bDJzbXRobHZsID0gbGV2ZWwgLSBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXTsKICAgICAgICAgICAgICAgIGlmIChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgewogICAgICAgICAgICAgICAgICAgIC8qIGF0dGFjayAqLwogICAgICAgICAgICAgICAgICAgIGlmIChsdmwyc210aGx2bCA+IGRyY0NvbXAtPmF0dGFja1RocltpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBmYXN0IGF0dGFjayAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3RBdHRhY2tbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBzbG93IGF0dGFjayAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPnNsb3dBdHRhY2tbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogcmVsZWFzZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChsdmwyc210aGx2bCA8IC1kcmNDb21wLT5kZWNheVRocltpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBmYXN0IHJlbGVhc2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5mYXN0RGVjYXlbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBzbG93IHJlbGVhc2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93RGVjYXlbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIHNtb290aCBnYWluICYgbGV2ZWwgKi8KICAgICAgICAgICAgICAgIGlmICgoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHx8IChkcmNDb21wLT5ob2xkQ250W2ldID09IDApKSB7IC8qIGhvbGQgZ2FpbiB1bmxlc3Mgd2UgaGF2ZSBhbiBhdHRhY2sgb3IgaG9sZCBwZXJpb2QgaXMgb3ZlciAqLwogICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3U7CgogICAgICAgICAgICAgICAgICAgIC8qIGRyY0NvbXAtPnNtb290aExldmVsW2ldID0gKDEtYWxwaGEpICogZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gKyBhbHBoYSAqIGxldmVsOyAqLwogICAgICAgICAgICAgICAgICAgIGFjY3UgPSAgZk11bHQoKEZMMkZYQ09OU1RfREJMKDEuZiktYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmTXVsdChhbHBoYSxsZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSBhY2N1OwoKICAgICAgICAgICAgICAgICAgICAvKiBkcmNDb21wLT5zbW9vdGhHYWluW2ldICA9ICgxLWFscGhhKSAqIGRyY0NvbXAtPnNtb290aEdhaW5baV0gKyBhbHBoYSAqIGdhaW47ICovCiAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoRkwyRlhDT05TVF9EQkwoMS5mKS1hbHBoYSksIGRyY0NvbXAtPnNtb290aEdhaW5baV0pOwogICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZk11bHQoYWxwaGEsZ2Fpbik7CiAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IGFjY3U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogaG9sZCBjb3VudGVyICovCiAgICAgICAgICAgICAgICBpZiAoZHJjQ29tcC0+aG9sZENudFtpXSkgewogICAgICAgICAgICAgICAgICBkcmNDb21wLT5ob2xkQ250W2ldLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHsKICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+aG9sZENudFtpXSA9IGRyY0NvbXAtPmhvbGRPZmZbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gLyogcHJvZmlsZSAhPSBEUkNfTk9ORSAqLwogICAgICAgIH0gLyogZm9yIGk9MS4uMiAqLwogICAgICB9IGVsc2UgewogICAgICAgIC8qIG5vIGNvbXByZXNzaW9uICovCiAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpblsxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgIH0KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICogbGltaXRlcgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgLyogZmluZCBwZWFrIGxldmVsICovCiAgICBwZWFrWzBdID0gcGVha1sxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICBmb3IgKGkgPSAwOyBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGg7IGkrKykgewogICAgICAgIEZJWFBfREJMIHRtcDsKICAgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSpkcmNDb21wLT5jaGFubmVsc107CiAgICAgICAgSU5UX1BDTSBtYXhTYW1wbGUgPSAwOwoKICAgICAgICAvKiBzaW5nbGUgY2hhbm5lbHMgKi8KICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CiAgICAgICAgICAgIG1heFNhbXBsZSA9IEZES21heChtYXhTYW1wbGUsIGZBYnMocFNhbXBsZXNbY10pKTsKICAgICAgICB9CiAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBGWF9QQ00yRlhfREJMKG1heFNhbXBsZSk+PkRPV05NSVhfU0hJRlQpOwoKICAgICAgICAvKiBMdC9SdCBkb3dubWl4ICovCiAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKICAgICAgICAgICAgLyogTHQgKi8KICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogTHMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBMczIgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBScyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIFJzMiAqLwogICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogUyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIEMgKi8KICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMICovCgogICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwoKICAgICAgICAgICAgLyogUnQgKi8KICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBMcyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIExzMiAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIFJzICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogUnMyICovCiAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBTICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogQyAqLwogICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFIgKi8KCiAgICAgICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CiAgICAgICAgfQoKICAgICAgICAvKiBMby9SbyBkb3dubWl4ICovCiAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKICAgICAgICAgICAgLyogTG8gKi8KICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzMiAqLwogICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpPj4oRE9XTk1JWF9TSElGVC0xKTsgLyogUyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMICovCgogICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwoKICAgICAgICAgICAgLyogUm8gKi8KICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBScyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzMiAqLwogICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpPj4oRE9XTk1JWF9TSElGVC0xKTsgLyogUyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCgogICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwogICAgICAgIH0KCiAgICAgICAgcGVha1sxXSA9IGZpeE1heChwZWFrWzBdLCBwZWFrWzFdKTsKCiAgICAgICAgLyogTW9ubyBEb3dubWl4IC0gZm9yIGNvbXBfdmFsIG9ubHkgKi8KICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMSkgewogICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMyICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMgKi8KICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSczIgKi8KICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwogICAgICAgICAgICAvKmlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkgdG1wICo9MC43MDdmOyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCiAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpPj4oRE9XTk1JWF9TSElGVC0xKTsgLyogUyAqLwogICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMICovCiAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUiAqLwoKICAgICAgICAgICAgcGVha1sxXSA9IGZpeE1heChwZWFrWzFdLCBmaXhwX2Ficyh0bXApKTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpPTA7IGk8MjsgaSsrKSB7CiAgICAgIEZJWFBfREJMIHRtcCA9IGRyY0NvbXAtPnByZXZQZWFrW2ldOwogICAgICBkcmNDb21wLT5wcmV2UGVha1tpXSA9IHBlYWtbaV07CiAgICAgIHBlYWtbaV0gPSBmaXhNYXgocGVha1tpXSwgdG1wKTsKCiAgICAgIC8qCiAgICAgICAqIENvbnZlcnQgdG8gZEJGUywgYXBwbHkgZGlhbG5vcm0KICAgICAgICovCiAgICAgIC8qIGRlc2NhbGVkIHBlYWsgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLwogICAgICBGSVhQX0RCTCBsZF9wZWFrID0gQ2FsY0xkRGF0YShwZWFrW2ldKSArIChGSVhQX0RCTCkoKExPTkcpRE9XTk1JWF9TSElGVDw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwoKICAgICAgLyogaWYgKHBlYWsgPCAxZS02KSBsZXZlbCA9IDFlLTZmOyAqLwogICAgICBsZF9wZWFrID0gRkRLbWF4KGxkX3BlYWssIEZMMkZYQ09OU1RfREJMKC0wLjMxMTQzMDc1ODg5NTY5MDIyMDExMjg0MjQ0NjUxNDYzZikpOwoKICAgICAgLyogcGVha1tpXSA9IDIwICogbG9nKHBlYWtbaV0pL2xvZygxMCkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQogICAgICAgKiBwZWFrW2ldID0gMjAgKiBsb2coMikvbG9nKDEwKSAqIGxkKHBlYWtbaV0pICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKICAgICAgICogcGVha1tpXSA9IDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQocGVha1tpXSkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQogICAgICAgKgogICAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgogICAgICAgKiBwZWFrW2ldID0gKDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKSAqIDY0ICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykpKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKQogICAgICAgKiBwZWFrW2ldID0gMTAqMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQocGVha1tpXSkKICAgICAgICogICAgICAgICArIDAuMmYqMl4oLU1FVEFEQVRBX0ZSQUNUX0JJVFMpICsgZHJjQ29tcC0+c21vb3RoR2FpbltpXQogICAgICAgKi8KICAgICAgcGVha1tpXSA9IGZNdWx0KChGSVhQX0RCTCkoMTA8PChNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpKSwgZk11bHQoIEZMMkZYX0RCTCgyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDlmKSwgbGRfcGVhaykpOwogICAgICBwZWFrW2ldICs9IChGTDJGWF9EQkwoMC4yZik+Pk1FVEFEQVRBX0lOVF9CSVRTKTsgICAgICAgICAgIC8qIGFkZCBhIGxpdHRsZSBiaXQgaGVhZHJvb20gKi8KICAgICAgcGVha1tpXSArPSAgZHJjQ29tcC0+c21vb3RoR2FpbltpXTsKICAgIH0KCiAgICAvKiBwZWFrIC09IGRpYWxub3JtICsgMzE7ICovICAvKiB0aGlzIGlzIERvbGJ5IHN0eWxlIG9ubHkgKi8KICAgIHBlYWtbMF0gLT0gKEZJWFBfREJMKSgoZGlhbG5vcm0tZHJjX1RhcmdldFJlZkxldmVsKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsgLyogcGVha1swXSAtPSBkaWFsbm9ybSAtIGRyY19UYXJnZXRSZWZMZXZlbCAqLwoKICAgIC8qIHBlYWsgKz0gMTE7ICovICAgLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovICAgICAgLyogUkYgbW9kZSBvdXRwdXQgaXMgMTFkQiBoaWdoZXIgKi8KICAgIC8qcGVhayArPSBjb21wX1RhcmdldFJlZkxldmVsIC0gZHJjX1RhcmdldFJlZkxldmVsOyovCiAgICBwZWFrWzFdIC09IChGSVhQX0RCTCkoKGRpYWxub3JtLWNvbXBfVGFyZ2V0UmVmTGV2ZWwpPDwoTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOyAvKiBwZWFrWzFdIC09IGRpYWxub3JtIC0gY29tcF9UYXJnZXRSZWZMZXZlbCAqLwoKICAgIC8qIGxpbWl0ZXIgZ2FpbiAqLwogICAgZHJjQ29tcC0+bGltR2FpblswXSArPSBkcmNDb21wLT5saW1EZWNheTsgICAgICAgICAgICAgICAvKiBsaW5lYXIgbGltaXRlciByZWxlYXNlICovCiAgICBkcmNDb21wLT5saW1HYWluWzBdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMF0sIC1wZWFrWzBdKTsKCiAgICBkcmNDb21wLT5saW1HYWluWzFdICs9IDIqZHJjQ29tcC0+bGltRGVjYXk7ICAgICAgICAgICAgIC8qIGxpbmVhciBsaW1pdGVyIHJlbGVhc2UgKi8KICAgIGRyY0NvbXAtPmxpbUdhaW5bMV0gPSBmaXhNaW4oZHJjQ29tcC0+bGltR2FpblsxXSwgLXBlYWtbMV0pOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qIGFwcGx5IGxpbWl0aW5nLCByZXR1cm4gRFJDIGdhaW5zKi8KICAgIHsKICAgICAgICBGSVhQX0RCTCB0bXA7CgogICAgICAgIHRtcCA9IGRyY0NvbXAtPnNtb290aEdhaW5bMF07CiAgICAgICAgaWYgKGRyY0NvbXAtPmxpbUdhaW5bMF0gPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CiAgICAgICAgICB0bXAgKz0gZHJjQ29tcC0+bGltR2FpblswXTsKICAgICAgICB9CiAgICAgICAgKnBEeW5ybmcgPSAoTE9ORykgc2NhbGVWYWx1ZSh0bXAsIC0oTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOwoKICAgICAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzFdOwogICAgICAgIGlmIChkcmNDb21wLT5saW1HYWluWzFdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMV07CiAgICAgICAgfQogICAgICAgICpwQ29tcHIgID0gKExPTkcpIHNjYWxlVmFsdWUodG1wLCAtKE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKCkRSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApCnsKICAgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzBdOwp9CgpEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXRDb21wUHJvZmlsZShjb25zdCBIRFJDX0NPTVAgZHJjQ29tcCkKewogICAgcmV0dXJuIGRyY0NvbXAtPnByb2ZpbGVbMV07Cn0KCgo=