Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jawoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgInBzeV9jb25zdC5oIgoKI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgojaW5jbHVkZSAidHJhbnNmb3JtLmgiCiNpbmNsdWRlICJzcHJlYWRpbmcuaCIKI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKI2luY2x1ZGUgImJhbmRfbnJnLmgiCiNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgojaW5jbHVkZSAicHN5X2RhdGEuaCIKI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgojaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiNpbmNsdWRlICJwc3lfbWFpbi5oIgojaW5jbHVkZSAiZ3JwX2RhdGEuaCIKI2luY2x1ZGUgInRuc19mdW5jLmgiCiNpbmNsdWRlICJwbnNfZnVuYy5oIgojaW5jbHVkZSAidG9uYWxpdHkuaCIKI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKI2luY2x1ZGUgImludGVuc2l0eS5oIgoKCgovKiBibGVuZGluZyB0byByZWR1Y2UgZ2liYnMgYXJ0aWZhY3RzICovCiNkZWZpbmUgRkFERV9PVVRfTEVOIDYKc3RhdGljIGNvbnN0IEZJWFBfREJMIGZhZGVPdXRGYWN0b3JbRkFERV9PVVRfTEVOXSA9IHsxODQwNjQ0MDk2LCAxNTMzODcwMDgwLCAxMjI3MDk2MDY0LCA5MjAzMjIwNDgsIDYxMzU0ODAzMiwgMzA2Nzc0MDE2fTsKCi8qIGZvcndhcmQgZGVmaW5pdGlvbnMgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Qc3lOZXcKICAgIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKICAgIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQogICAgaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU5ldyhQU1lfSU5URVJOQUwgICoqcGhwc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAgICAgKmR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogICAgUFNZX0lOVEVSTkFMICpoUHN5OwogICAgSU5UIGk7CgogICAgaFBzeSA9IEdldFJhbV9hYWNFbmNfUHN5SW50ZXJuYWwoKTsKICAgICpwaHBzeSA9IGhQc3k7CiAgICBpZiAoaFBzeSA9PSBOVUxMKSB7CiAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewogICAgICAgIC8qIFBTWV9FTEVNRU5UICovCiAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXSA9IEdldFJhbV9hYWNFbmNfUHN5RWxlbWVudChpKTsKICAgICAgICBpZiAoaFBzeS0+cHN5RWxlbWVudFtpXSA9PSBOVUxMKSB7CiAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgewogICAgICAgIC8qIFBTWV9TVEFUSUMgKi8KICAgICAgICBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeVN0YXRpYyhpKTsKICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldPT1OVUxMKSB7CiAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KICAgICAgICAvKiBBVURJTyBJTlBVVCBCVUZGRVIgKi8KICAgICAgICBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyID0gR2V0UmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlcihpKTsKICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldLT5wc3lJbnB1dEJ1ZmZlcj09TlVMTCkgewogICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CiAgICB9CgogICAgLyogcmV1c2FibGUgcHN5Y2ggbWVtb3J5ICovCiAgICBoUHN5LT5wc3lEeW5hbWljID0gR2V0UmFtX2FhY0VuY19Qc3lEeW5hbWljKDAsIGR5bmFtaWNfUkFNKTsKCiAgICByZXR1cm4gQUFDX0VOQ19PSzsKCmJhaWw6CiAgIEZES2FhY0VuY19Qc3lDbG9zZShwaHBzeSwgTlVMTCk7CgogICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1BzeU91dE5ldwogICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3lPdXQgc3RydWMKICAgIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQogICAgaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU91dE5ldyhQU1lfT1VUICAgKipwaHBzeU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5TdWJGcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICpkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgaW50IG4sIGk7CiAgaW50IGVsSW5jID0gMCwgY2hJbmMgPSAwOwoKICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKICAgIHBocHN5T3V0W25dID0gR2V0UmFtX2FhY0VuY19Qc3lPdXQobik7CgogICAgaWYgKHBocHN5T3V0W25dID09IE5VTEwpIHsKICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CiAgICAgIHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoY2hJbmMrKyk7CiAgICB9CgogICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKICAgICAgcGhwc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzKGVsSW5jKyspOwogICAgICBpZiAocGhwc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0gPT0gTlVMTCkgewogICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgZ290byBiYWlsOwogICAgICB9CiAgICB9CiAgfSAvKiBuU3ViRnJhbWVzICovCgogIHJldHVybiBBQUNfRU5DX09LOwoKYmFpbDoKICBGREthYWNFbmNfUHN5Q2xvc2UoTlVMTCwgcGhwc3lPdXQpOwogIHJldHVybiBFcnJvclN0YXR1czsKfQoKCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKFBTWV9JTlRFUk5BTCAgICAqaFBzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX1NUQVRJQyogcHN5U3RhdGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpCnsKICAvKiBpbml0IGlucHV0IGJ1ZmZlciAqLwogIEZES21lbWNsZWFyKHBzeVN0YXRpYy0+cHN5SW5wdXRCdWZmZXIsIE1BWF9JTlBVVF9CVUZGRVJfU0laRSpzaXplb2YoSU5UX1BDTSkpOwoKICBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKCZwc3lTdGF0aWMtPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICAgICpoUHN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICAgICAgICAqKnBocHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbk1heENoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20pCnsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CiAgaW50IGksIGNoLCBuLCBjaEluYyA9IDAsIHJlc2V0Q2hhbm5lbHMgPSAzOwoKICBpZiAoIChuTWF4Q2hhbm5lbHM+MikgJiYgKGNtLT5uQ2hhbm5lbHM9PTIpICkgewogICAgY2hJbmMgPSAxOwogICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cFN0YXRpY0NoYW5uZWxzWzBdLCBhdWRpb09iamVjdFR5cGUpOwogIH0KCiAgaWYgKCAobk1heENoYW5uZWxzPT0yKSApIHsKICAgIHJlc2V0Q2hhbm5lbHMgPSAwOwogIH0KCiAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CiAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICBpZiAoY20tPmVsSW5mb1tpXS5lbFR5cGUhPUlEX0xGRSkgewogICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0gPSBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbY2hJbmNdOwogICAgICAgIGlmIChjaEluYz49cmVzZXRDaGFubmVscykgewogICAgICAgICAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLCBhdWRpb09iamVjdFR5cGUpOwogICAgICAgIH0KICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5pc0xGRSA9IDA7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSA9IGhQc3ktPnBTdGF0aWNDaGFubmVsc1tuTWF4Q2hhbm5lbHMtMV07CiAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+aXNMRkUgPSAxOwogICAgICB9CiAgICAgIGNoSW5jKys7CiAgICB9CiAgfQoKICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKICAgIGNoSW5jID0gMDsKICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewogICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXSA9IHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbY2hJbmMrK107CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBFcnJvclN0YXR1czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3BzeU1haW5Jbml0CiAgICBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBzeWNob2Fjb3VzdGljCiAgICByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW5Jbml0KFBTWV9JTlRFUk5BTCAqaFBzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG5zTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiYW5kd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlUG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZUlTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGluaXRGbGFncykKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogIGludCBpLCBjaDsKICBpbnQgY2hhbm5lbHNFZmYgPSBjbS0+bkNoYW5uZWxzRWZmOwogIGludCB0bnNDaGFubmVscyA9IDA7CiAgRkJfVFlQRSBmaWx0ZXJCYW5rOwoKCiAgc3dpdGNoKEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjbS0+ZW5jTW9kZSkpIHsKICAgIC8qIC4uLiBhbmQgbWFwIHRvIHRuc0NoYW5uZWxzICovCiAgICBjYXNlIEVMX01PREVfTU9OTzogICB0bnNDaGFubmVscyA9IDE7IGJyZWFrOwogICAgY2FzZSBFTF9NT0RFX1NURVJFTzogdG5zQ2hhbm5lbHMgPSAyOyBicmVhazsKICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHRuc0NoYW5uZWxzID0gMDsKICB9CgogIHN3aXRjaCAoYXVkaW9PYmplY3RUeXBlKQogIHsKICAgIGRlZmF1bHQ6IGZpbHRlckJhbmsgPSBGQl9MQzsgIGJyZWFrOwogICAgY2FzZSBBT1RfRVJfQUFDX0xEOiAgZmlsdGVyQmFuayA9IEZCX0xEOyAgYnJlYWs7CiAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOiBmaWx0ZXJCYW5rID0gRkJfRUxEOyBicmVhazsKICB9CgogIGhQc3ktPmdyYW51bGVMZW5ndGggPSBncmFudWxlTGVuZ3RoOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihiaXRSYXRlL2NoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCBiYW5kd2lkdGgsIExPTkdfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgJihoUHN5LT5wc3lDb25mWzBdKSwgZmlsdGVyQmFuayk7CiAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICByZXR1cm4gRXJyb3JTdGF0dXM7CgogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKAogICAgICAgIChiaXRSYXRlKnRuc0NoYW5uZWxzKS9jaGFubmVsc0VmZiwKICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgIHRuc0NoYW5uZWxzLAogICAgICAgIExPTkdfV0lORE9XLAogICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCiAgICAgICAgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpLAogICAgICAgIChzeW50YXhGbGFncyZBQ19TQlJfUFJFU0VOVCk/MTowLAogICAgICAgJihoUHN5LT5wc3lDb25mWzBdLnRuc0NvbmYpLAogICAgICAgJmhQc3ktPnBzeUNvbmZbMF0sCiAgICAgICAgKElOVCkodG5zTWFzayYyKSwKICAgICAgICAoSU5UKSh0bnNNYXNrJjgpICk7CgogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICBpZiAoZ3JhbnVsZUxlbmd0aCA+IDUxMikgewogICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oYml0UmF0ZS9jaGFubmVsc0VmZiwgc2FtcGxlUmF0ZSwgYmFuZHdpZHRoLCBTSE9SVF9XSU5ET1csIGhQc3ktPmdyYW51bGVMZW5ndGgsIHVzZUlTLCAmaFBzeS0+cHN5Q29uZlsxXSwgZmlsdGVyQmFuayk7CiAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKAogICAgICAgICAgICAoYml0UmF0ZSp0bnNDaGFubmVscykvY2hhbm5lbHNFZmYsCiAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgIHRuc0NoYW5uZWxzLAogICAgICAgICAgICBTSE9SVF9XSU5ET1csCiAgICAgICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKSwKICAgICAgICAgICAgKHN5bnRheEZsYWdzJkFDX1NCUl9QUkVTRU5UKT8xOjAsCiAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0udG5zQ29uZiwKICAgICAgICAgICAmaFBzeS0+cHN5Q29uZlsxXSwKICAgICAgICAgICAgKElOVCkodG5zTWFzayYxKSwKICAgICAgICAgICAgKElOVCkodG5zTWFzayY0KSApOwoKICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICB9CgoKICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgIGlmIChpbml0RmxhZ3MpIHsKICAgICAgICAvKiByZXNldCBzdGF0ZXMgKi8KICAgICAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLCBhdWRpb09iamVjdFR5cGUpOwogICAgICB9CgogICAgICBGREthYWNFbmNfSW5pdFByZUVjaG9Db250cm9sKGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYlBjbVF1YW50VGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSk7CiAgICB9CiAgfQoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigmaFBzeS0+cHN5Q29uZlswXS5wbnNDb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUvY2hhbm5lbHNFZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1swXS5uQ2hhbm5lbHNJbkVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUHN5LT5wc3lDb25mWzBdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oJmhQc3ktPnBzeUNvbmZbMV0ucG5zQ29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlL2NoYW5uZWxzRWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9bMV0ubkNoYW5uZWxzSW5FbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFBzeS0+cHN5Q29uZlsxXS5maWx0ZXJiYW5rID09IEZCX0xDKSk7CiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgoKc3RhdGljCnZvaWQgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKElOVF9QQ00gKnBPdXRwdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpwSW5wdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHMpCnsKICAgIElOVCBrOwogICAgLyogZGVpbnRlcmxhdmUgaW5wdXQgc2FtcGxlcyBhbmQgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciAqLwogICAgZm9yIChrPTA7IGs8blNhbXBsZXM7IGsrKykgewogICAgICAgIHBPdXRwdXRTYW1wbGVzW2tdID0gcElucHV0U2FtcGxlc1trKm5DaGFubmVsc107CiAgICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcHN5TWFpbgogICAgZGVzY3JpcHRpb246ICBwc3ljaG9hY291c3RpYwogICAgcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCgogICAgICAgIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGVub3VnaCBpbnB1dCBkYXRhIGlzIGluIHRoZSBtb2R1bG8gYnVmZmVyLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbihJTlQgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRUxFTUVOVCAgICAgICAgKnBzeUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9EWU5BTUlDICAgICAgICAqcHN5RHluYW1pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gICpwc3lDb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgKlJFU1RSSUNUIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnBJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY2hJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIGNvbnN0IElOVCBjb21tb25XaW5kb3cgPSAxOwogICAgSU5UIG1heFNmYlBlckdyb3VwWygyKV07CiAgICBJTlQgbWRjdFNwZWN0cnVtX2U7CiAgICBJTlQgY2g7ICAgLyogY291bnRzIHRocm91Z2ggY2hhbm5lbHMgICAgICAgICAgKi8KICAgIElOVCB3OyAgICAvKiBjb3VudHMgdGhyb3VnaCB3aW5kb3dzICAgICAgICAgICAqLwogICAgSU5UIHNmYjsgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICovCiAgICBJTlQgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KCiAgICBQU1lfQ09ORklHVVJBVElPTiAqUkVTVFJJQ1QgaFBzeUNvbmZMb25nICA9ICZwc3lDb25mWzBdOwogICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhQc3lDb25mU2hvcnQgPSAmcHN5Q29uZlsxXTsKICAgIFBTWV9PVVRfQ0hBTk5FTCAgKipSRVNUUklDVCBwc3lPdXRDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsKICAgIEZJWFBfU0dMIHNmYlRvbmFsaXR5WygyKV1bTUFYX1NGQl9MT05HXTsKCiAgICBQU1lfU1RBVElDICAgICAgICAqKlJFU1RSSUNUIHBzeVN0YXRpYyA9IHBzeUVsZW1lbnQtPnBzeVN0YXRpYzsKCiAgICBQU1lfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBzeURhdGFbKDIpXTsKICAgIFROU19EQVRBICAgICAgICAgICAqUkVTVFJJQ1QgdG5zRGF0YVsoMildOwogICAgUE5TX0RBVEEgICAgICAgICAgICpSRVNUUklDVCBwbnNEYXRhWygyKV07CgogICAgSU5UIHplcm9TcGVjID0gVFJVRTsgLyogbWVhbnMgYWxsIHNwZWN0cmFsIGxpbmVzIGFyZSB6ZXJvICovCgogICAgSU5UIGJsb2NrU3dpdGNoaW5nT2Zmc2V0OwoKICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoVGhpc1BzeUNvbmZbKDIpXTsKICAgIElOVCB3aW5kb3dMZW5ndGhbKDIpXTsKICAgIElOVCBuV2luZG93c1soMildOwogICAgSU5UIHdPZmZzZXQ7CgogICAgSU5UICAgICAgIG1heFNmYlsoMildOwogICAgSU5UICAgICAgKnBTZmJNYXhTY2FsZVNwZWNbKDIpXTsKICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5WygyKV07CiAgICBGSVhQX0RCTCAqcFNmYlNwcmVhZEVuZXJneVsoMildOwogICAgRklYUF9EQkwgKnBTZmJFbmVyZ3lMZERhdGFbKDIpXTsKICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5TVNbKDIpXTsKICAgIEZJWFBfREJMICpwU2ZiVGhyZXNob2xkWygyKV07CgogICAgSU5UIGlzU2hvcnRXaW5kb3dbKDIpXTsKCgogICAgaWYgKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayA9PSBGQl9MQykgewogICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGggKyAoOSpwc3lDb25mLT5ncmFudWxlTGVuZ3RoLygyKlRSQU5TX0ZBQykpOwogICAgfSBlbHNlIHsKICAgICAgYmxvY2tTd2l0Y2hpbmdPZmZzZXQgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoOwogICAgfQoKICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgICAgcHN5RGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cHN5RGF0YVtjaF07CiAgICAgICAgdG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+dG5zRGF0YVtjaF07CiAgICAgICAgcG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cG5zRGF0YVtjaF07CgogICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gPSBwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtOwogICAgfQoKICAgIC8qIGJsb2NrIHN3aXRjaGluZyAqLwogICAgaWYgKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayAhPSBGQl9FTEQpCiAgICB7CiAgICAgIGludCBlcnI7CgogICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQogICAgICB7CiAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFRpbWVTaWduYWwsIElOVF9QQ00sICgxMDI0KSkKCiAgICAgICAgICAvKiBkZWludGVybGVhdmUgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KICAgICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcFRpbWVTaWduYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnB1dFtjaElkeFtjaF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzKTsKCgogICAgICAgICAgRkRLYWFjRW5jX0Jsb2NrU3dpdGNoaW5nICgmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmlzTEZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVTaWduYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKCiAgICAgICAgICAgIC8qIGZpbGwgdXAgaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCB0byAyeGZyYW1lbGVuZ3RoIHNhbXBsZXMgKi8KICAgICAgICAgICAgRkRLbWVtY3B5KHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyK2Jsb2NrU3dpdGNoaW5nT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgcFRpbWVTaWduYWwsCiAgICAgICAgICAgICAgICAgICAgICAoMipwc3lDb25mLT5ncmFudWxlTGVuZ3RoLWJsb2NrU3dpdGNoaW5nT2Zmc2V0KSpzaXplb2YoSU5UX1BDTSkpOwoKICAgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwVGltZVNpZ25hbCwgSU5UX1BDTSwgKDEwMjQpKQogICAgICB9CgogICAgICAvKiBzeW5jaCBsZWZ0IGFuZCByaWdodCBibG9jayB0eXBlICovCiAgICAgIGVyciA9IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcoJnBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbldpbmRvdyk7CgogICAgICBpZiAoZXJyKSB7CiAgICAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1Q7IC8qIG1peGVkIHVwIExDIGFuZCBMRCAqLwogICAgICB9CgogICAgfQogICAgZWxzZSB7CiAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCiAgICAgIHsKICAgICAgICAvKiBkZWludGVybGVhdmUgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KICAgICAgICBGREthYWNFbmNfZGVpbnRlcmxlYXZlSW5wdXRCdWZmZXIoIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgYmxvY2tTd2l0Y2hpbmdPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5wdXRbY2hJZHhbY2hdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzKTsKICAgICAgfQogICAgfQoKICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCiAgICAgIGlzU2hvcnRXaW5kb3dbY2hdPShwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVyk7CgogICAgLyogc2V0IHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHdpbmRvdyBsZW5ndGggKi8KICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF0pIHsKICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXSAgICAgICA9IGhQc3lDb25mU2hvcnQ7CiAgICAgICAgICAgIHdpbmRvd0xlbmd0aFtjaF0gICAgICAgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoL1RSQU5TX0ZBQzsKICAgICAgICAgICAgbldpbmRvd3NbY2hdICAgICAgICAgICA9IFRSQU5TX0ZBQzsKICAgICAgICAgICAgbWF4U2ZiW2NoXSAgICAgICAgICAgICA9IE1BWF9TRkJfU0hPUlQ7CgogICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5TaG9ydFswXTsKICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gICAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuU2hvcnRbMF07CiAgICAgICAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LlNob3J0WzBdOwogICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5TaG9ydFswXTsKICAgICAgICAgICAgcFNmYkVuZXJneU1TW2NoXSAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5TaG9ydFswXTsKICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0gICAgICA9IHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuU2hvcnRbMF07CgogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXSAgICAgICA9IGhQc3lDb25mTG9uZzsKICAgICAgICAgICAgd2luZG93TGVuZ3RoW2NoXSAgICAgICA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CiAgICAgICAgICAgIG5XaW5kb3dzW2NoXSAgICAgICAgICAgPSAxOwogICAgICAgICAgICBtYXhTZmJbY2hdICAgICAgICAgICAgID0gTUFYX0dST1VQRURfU0ZCOwoKICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJNYXhTY2FsZVNwZWMuTG9uZzsKICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gICAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuTG9uZzsKICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lMZERhdGEuTG9uZzsKICAgICAgICAgICAgcFNmYkVuZXJneU1TW2NoXSAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5Mb25nOwogICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSAgICAgID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBUcmFuc2Zvcm0gYW5kIGdldCBtZGN0U2NhbGluZyBmb3IgYWxsIGNoYW5uZWxzIGFuZCB3aW5kb3dzLiAqLwogICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKICAgIHsKICAgICAgICAvKiB1cGRhdGUgbnVtYmVyIG9mIGFjdGl2ZSBiYW5kcyAqLwogICAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgewogICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlID0gaFRoaXNQc3lDb25mW2NoXS0+c2ZiQWN0aXZlTEZFOwogICAgICAgICAgICBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZUxGRTsKICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5zZmJBY3RpdmU7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA9IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOwogICAgICAgIH0KCiAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKCiAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwoKICAgICAgICAgIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbCggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIgKyB3T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWRjdFNwZWN0cnVtX2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPmZpbHRlcmJhbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscHN5U3RhdGljW2NoXS0+b3ZlcmxhcEFkZEJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgLyogTG93IHBhc3MgLyBoaWdoZXN0IHNmYiAqLwogICAgICAgICAgRkRLbWVtY2xlYXIoJnBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lK3dPZmZzZXRdLAogICAgICAgICAgICAgICAgICAgICAgKHdpbmRvd0xlbmd0aFtjaF0tcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lKSpzaXplb2YoRklYUF9EQkwpKTsKCiAgICAgICAgICBpZiAoIChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmsgIT0gRkJfTEMpICYmIChwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPj0gRkFERV9PVVRfTEVOKSApIHsKICAgICAgICAgICAgLyogRG8gYmxlbmRpbmcgdG8gcmVkdWNlIGdpYmJzIGFydGlmYWN0cyAqLwogICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8RkFERV9PVVRfTEVOOyBpKyspIHsKICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSt3T2Zmc2V0IC0gRkFERV9PVVRfTEVOICsgaV0gPSBmTXVsdChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSt3T2Zmc2V0IC0gRkFERV9PVVRfTEVOICsgaV0sIGZhZGVPdXRGYWN0b3JbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgoKICAgICAgICAgIC8qIENoZWNrIGZvciB6ZXJvIHNwZWN0cnVtLiBUaGVzZSBsb29wcyB3aWxsIHVzdWFsbHkgdGVybWluYXRlIHZlcnksIHZlcnkgZWFybHkuICovCiAgICAgICAgICBmb3IobGluZT0wOyAobGluZTxwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpICYmICh6ZXJvU3BlYz09VFJVRSk7IGxpbmUrKykgewogICAgICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUrd09mZnNldF0gIT0gKEZJWFBfREJMKTApIHsKICAgICAgICAgICAgICAgICAgemVyb1NwZWMgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICB9IC8qIHcgbG9vcCAqLwoKICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlID0gbWRjdFNwZWN0cnVtX2U7CgogICAgICAgIC8qIHJvdGF0ZSBpbnRlcm5hbCB0aW1lIHNhbXBsZXMgKi8KICAgICAgICBGREttZW1tb3ZlKHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgqc2l6ZW9mKElOVF9QQ00pKTsKCgogICAgICAgIC8qIC4uLiBhbmQgZ2V0IHJlbWFpbmluZyBzYW1wbGVzIGZyb20gaW5wdXQgYnVmZmVyICovCiAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcElucHV0WyAoMipwc3lDb25mLT5ncmFudWxlTGVuZ3RoLWJsb2NrU3dpdGNoaW5nT2Zmc2V0KSp0b3RhbENoYW5uZWxzICsgY2hJZHhbY2hdIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ09mZnNldC1wc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscyk7CgogICAgfSAvKiBjaCAqLwoKICAgIC8qIERvIHNvbWUgcmVzY2FsaW5nIHRvIGdldCBtYXhpbXVtIHBvc3NpYmxlIGFjY3VyYWN5IGZvciBlbmVyZ2llcyAqLwogICAgaWYgKCB6ZXJvU3BlYyA9PSBGQUxTRSkgewoKICAgICAgICAvKiBDYWxjIHBvc3NpYmxlIHNwZWN0cnVtIGxlZnRzaGlmdCBmb3IgZWFjaCBzZmIgKDEgbWVhbnM6IDEgYml0IGxlZnQgc2hpZnQgaXMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KICAgICAgICBJTlQgbWluU3BlY1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBJTlQgbnJnU2hpZnQgICAgID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBJTlQgZmluYWxTaGlmdCAgID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBGSVhQX0RCTCBjdXJyTnJnID0gMDsKICAgICAgICBGSVhQX0RCTCBtYXhOcmcgID0gMDsKCiAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewogICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwoKICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQogICAgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0pOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgLyogQ2FsYyBwb3NzaWJsZSBlbmVyZ3kgbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdCBpcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLwogICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07CiAgICAgICAgICAgICAgICBjdXJyTnJnID0gRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TcGVjU2hpZnQtNCk7CgogICAgICAgICAgICAgICAgbWF4TnJnID0gZml4TWF4KG1heE5yZywgY3Vyck5yZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggbWF4TnJnICE9IChGSVhQX0RCTCkwICkgewogICAgICAgICAgICBucmdTaGlmdCA9IChDb3VudExlYWRpbmdCaXRzKG1heE5yZyk+PjEpICsgKG1pblNwZWNTaGlmdC00KTsKICAgICAgICB9CgogICAgICAgIC8qIDJjaGVjazogSGFzbid0IHRoaXMgZGVjaXNpb24gdG8gYmUgbWFkZSBmb3IgYm90aCBjaGFubmVscz8gKi8KICAgICAgICAvKiBGb3Igc2hvcnQgd2luZG93cyAxIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IG92ZXJmbG93cyB3aGVuIHN1bW1pbmcgdXAgZW5lcmdpZXMgaW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KICAgICAgICBpZihpc1Nob3J0V2luZG93WzBdKSBucmdTaGlmdC0tOwoKICAgICAgICAvKiBib3RoIHNwZWN0cnVtIGFuZCBlbmVyZ2llcyBtdXN0bid0IG92ZXJmbG93ICovCiAgICAgICAgZmluYWxTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIG5yZ1NoaWZ0KTsKCiAgICAgICAgLyogZG8gbm90IHNoaWZ0IG1vcmUgdGhhbiAzIGJpdHMgbW9yZSB0byB0aGUgbGVmdCB0aGFuIHNpZ25hbCB3aXRob3V0IGJsb2NrZmxvYXRpbmcgcG9pbnQKICAgICAgICAgKiB3b3VsZCBiZSB0byBhdm9pZCBvdmVyZmxvdyBvZiBzY2FsZWQgUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGRzICovCiAgICAgICAgaWYgKGZpbmFsU2hpZnQgPiBwc3lEYXRhWzBdLT5tZGN0U2NhbGUgKyAzICkKICAgICAgICAgICAgZmluYWxTaGlmdCA9IHBzeURhdGFbMF0tPm1kY3RTY2FsZSArIDM7CgogICAgICAgIEZES19BU1NFUlQoZmluYWxTaGlmdCA+PSAwKTsgICAgLyogcmlnaHQgc2hpZnQgaXMgbm90IGFsbG93ZWQgKi8KCiAgICAgICAgLyogY29ycmVjdCBzZmJFbmVyZ3kgYW5kIHNmYkVuZXJneUxkRGF0YSB3aXRoIG5ldyBmaW5hbFNoaWZ0ICovCiAgICAgICAgRklYUF9EQkwgbGRTaGlmdCA9IGZpbmFsU2hpZnQgKiBGTDJGWENPTlNUX0RCTCgyLjAvNjQpOwogICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0tNCk7CiAgICAgICAgICAgICAgICAgICAgc2NhbGUgICAgID0gZml4TWluKChzY2FsZS1maW5hbFNoaWZ0KTw8MSwgREZSQUNUX0JJVFMtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlID49IDApIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPj49IChzY2FsZSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPDw9ICgtc2NhbGUpOwogICAgICAgICAgICAgICAgICAgIChwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPSBmTXVsdCgocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdLCBDX1JBVElPKTsKICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICs9IGxkU2hpZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggZmluYWxTaGlmdCAhPSAwICkgewogICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwogICAgICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8cHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lOyBsaW5lKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lK3dPZmZzZXRdIDw8PSBmaW5hbFNoaWZ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCiAgICAgICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspCiAgICAgICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gLT0gZmluYWxTaGlmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBtZGN0U2NhbGUgKi8KICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgLT0gZmluYWxTaGlmdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICAgIC8qIGFsbCBzcGVjdHJhbCBsaW5lcyBhcmUgemVybyAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgPSAwOyAgICAgLyogb3RoZXJ3aXNlIG1kY3RTY2FsZSB3b3VsZCBiZSBmb3IgZXhhbXBsZSA3IGFuZCBQQ00gcXVhbnRpemF0aW9uIHRocmVzaG9sZHMgd291bGQgYmUgc2hpZnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE0IGJpdHMgdG8gdGhlIHJpZ2h0IGNhdXNpbmcgc29tZSBvZiB0aGVtIHRvIGJlY29tZSAwICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIpICovCiAgICAgICAgICAgIC8qIGNsZWFyIHNmYk1heFNjYWxlU3BlYyAqLwogICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewogICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICAocFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdKVtzZmJdID0gMDsKICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgICAgID0gKEZJWFBfREJMKTA7CiAgICAgICAgICAgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgID0gKEZJWFBfREJMKTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogQWR2YW5jZSBwc3ljaG9hY291c3RpY3M6IFRvbmFsaXR5IGFuZCBUTlMgKi8KICAgIGlmIChwc3lTdGF0aWNbMF0tPmlzTEZFKSB7CiAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSA9IDA7CiAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXSA9IDA7CiAgICB9CiAgICBlbHNlCiAgICB7CgogICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgaWYgKCFpc1Nob3J0V2luZG93W2NoXSkgewogICAgICAgICAgICAgICAgLyogdG9uYWxpdHkgKi8KICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHlbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnBuc0NvbmYudXNlUG5zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNBY3RpdmUgfHwgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNBY3RpdmUpIHsKICAgICAgICAgICAgSU5UIHRuc0FjdGl2ZVtUUkFOU19GQUNdOwogICAgICAgICAgICBJTlQgbnJnU2NhbGluZ1syXSA9IHswLDB9OwogICAgICAgICAgICBJTlQgdG5zU3BlY1NoaWZ0ID0gMDsKCiAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CgogICAgICAgICAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07CiAgICAgICAgICAgICAgICAgICAgLyogVE5TICovCiAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX1Ruc0RldGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMikgewogICAgICAgICAgICAgIEZES2FhY0VuY19UbnNTeW5jKAogICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVsxXSwKICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbMF0sCiAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFsxXS0+dG5zSW5mbywKICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzBdLT50bnNJbmZvLAoKICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbMV0tPnRuc0NvbmYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBGREtfQVNTRVJUKDE9PWNvbW1vbldpbmRvdyk7IC8qIGFsbCBjaGVja3MgZm9yIFROUyBkbyBvbmx5IHdvcmsgZm9yIGNvbW1vbiB3aW5kb3dzICh3aGljaCBpcyBhbHdheXMgc2V0KSovCiAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzWzBdOyB3KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc1Nob3J0V2luZG93WzBdKQogICAgICAgICAgICAgICAgICAgIHRuc0FjdGl2ZVt3XSA9IHRuc0RhdGFbMF0tPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZVtISUZJTFRdIHx8CiAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF0gfHwKICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzLTFdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbSElGSUxUXSB8fAogICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMtMV0tPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZVtMT0ZJTFRdOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHRuc0FjdGl2ZVt3XSA9IHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gfHwKICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdIHx8CiAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSB8fAogICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMtMV0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0xPRklMVF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgICAgIGlmICh0bnNBY3RpdmVbMF0gJiYgIWlzU2hvcnRXaW5kb3dbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgZG93biBzcGVjdHJ1bSBpZiB0bnMgaXMgYWN0aXZlIGluIG9uZSBvZiB0aGUgdHdvIGNoYW5uZWxzIHdpdGggc2FtZSBsYXN0V2luZG93U2VxdWVuY2UgKi8KICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbjsgaXQncyBub3QgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBzZmJNYXhTY2FsZVNwZWMgKi8KICAgICAgICAgICAgICAgICAgICBJTlQgc2hpZnQgPSAxOwogICAgICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOyBzZmIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPSBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPj4gc2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdGhyZXNob2xkcyAqLwogICAgICAgICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXVtzZmJdID4+PSAoMipzaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHNoaWZ0OyAvKiB1cGRhdGUgbWRjdFNjYWxlICovCgogICAgICAgICAgICAgICAgICAgIC8qIGNhbGMgc2ZiRW5lcmdpZXMgYWZ0ZXIgdG5zRW5jb2RlIGFnYWluICEgKi8KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwogICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19UbnNFbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXRbcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZV0sLypoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZSovIC8qIGZpbHRlciBzdG9wcyBiZWZvcmUgdGhhdCBsaW5lICEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodG5zQWN0aXZlW3ddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluLCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdG5zIGFjdGl2ZSBpbiBjdXJyZW50IGNoYW5uZWwgb3IgaW4gb25lIGNoYW5uZWwgd2l0aCBzYW1lIGxhc3RXaW5kb3dTZXF1ZW5jZSBsZWZ0IGFuZCByaWdodCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKCiAgICAgICAgICAgICAgICBpZiAodG5zQWN0aXZlW3ddKSB7CgogICAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pIHsKICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0KHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rdyp3aW5kb3dMZW5ndGhbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBucmdTY2FsaW5nW2NoXSA9ICAgICAgICAvKiB3aXRoIHRucywgZW5lcmd5IGNhbGN1bGF0aW9uIGNhbiBvdmVyZmxvdzsgLT4gc2NhbGluZyAqLwogICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSk7CiAgICAgICAgICAgICAgICAgICAgdG5zU3BlY1NoaWZ0ID0gZml4TWF4KHRuc1NwZWNTaGlmdCwgbnJnU2NhbGluZ1tjaF0pOyAgICAgICAvKiBucmdTY2FsaW5nIGlzIHNldCBvbmx5IGlmIG5yZyB3b3VsZCBoYXZlIGFuIG92ZXJmbG93ICovCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gLyogaWYgdG5zQWN0aXZlICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIGVuZCBjaGFubmVsIGxvb3AgKi8KCiAgICAgICAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdG8gcHJldmVudCBucmcgb3ZlcmZsb3csIG9ubHkgZm9yIGxvbmcgYmxvY2tzICovCiAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgICBpZiAoICh0bnNTcGVjU2hpZnQhPTApICYmICFpc1Nob3J0V2luZG93W2NoXSApIHsKICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gc3BlY3RydW0sIG5yZydzIGFuZCB0aHJlc2hvbGRzLCBpZiB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cgaW4gc2ZiTnJnIGNhbGN1bGF0aW9uIGFmdGVyIHRucyAqLwogICAgICAgICAgICAgICAgZm9yKGxpbmU9MDsgbGluZTxoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZTsgbGluZSsrKSB7CiAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZV0gPj49IHRuc1NwZWNTaGlmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIElOVCBzY2FsZSA9ICh0bnNTcGVjU2hpZnQtbnJnU2NhbGluZ1tjaF0pPDwxOwogICAgICAgICAgICAgICAgZm9yKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF1bc2ZiXSAgIC09IHNjYWxlKkZMMkZYQ09OU1RfREJMKDEuMC9MRF9EQVRBX1NDQUxJTkcpOwogICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXVtzZmJdICAgICAgICA+Pj0gc2NhbGU7CiAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdW3NmYl0gICAgID4+PSAodG5zU3BlY1NoaWZ0PDwxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgKz0gdG5zU3BlY1NoaWZ0OyAgLyogdXBkYXRlIG1kY3RTY2FsZTsgbm90IG5lY2Vzc2FyeSB0byB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvKiBlbmQgY2hhbm5lbCBsb29wICovCgogICAgICAgIH0gLyogVE5TIGFjdGl2ZSAqLwogICAgfSAgLyogIWlzTEZFICovCgoKCgoKCiAgICAvKiBBZHZhbmNlIHRocmVzaG9sZHMgKi8KICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBJTlQgaGVhZHJvb207CgogICAgICAgIEZJWFBfREJMIGNsaXBFbmVyZ3k7CiAgICAgICAgSU5UIGVuZXJneVNoaWZ0ICA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGUqMiA7CiAgICAgICAgSU5UIGNsaXBOcmdTaGlmdCA9IGVuZXJneVNoaWZ0IC0gVEhSX1NISUZUQklUUyA7CgogICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdKQogICAgICAgICAgICBoZWFkcm9vbSA9IDY7CiAgICAgICAgZWxzZQogICAgICAgICAgICBoZWFkcm9vbSA9IDA7CgogICAgICAgIGlmIChjbGlwTnJnU2hpZnQgPj0gMCkKICAgICAgICAgICAgY2xpcEVuZXJneSA9IGhUaGlzUHN5Q29uZltjaF0tPmNsaXBFbmVyZ3kgPj4gIGNsaXBOcmdTaGlmdCA7CiAgICAgICAgZWxzZSBpZiAoY2xpcE5yZ1NoaWZ0Pj0taGVhZHJvb20pCiAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5IDw8IC1jbGlwTnJnU2hpZnQgOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY2xpcEVuZXJneSA9IChGSVhQX0RCTClNQVhWQUxfREJMIDsKCiAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspCiAgICAgICAgewogICAgICAgICAgICBJTlQgaTsKICAgICAgICAgICAgLyogbGltaXQgdGhyZXNob2xkIHRvIGF2b2lkIGNsaXBwaW5nICovCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgewogICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNaW4oKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSksIGNsaXBFbmVyZ3kpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBzcHJlYWRpbmcgKi8KICAgICAgICAgICAgRkRLYWFjRW5jX1NwcmVhZGluZ01heChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdKTsKCgogICAgICAgICAgICAvKiBQQ00gcXVhbnRpemF0aW9uIHRocmVzaG9sZCAqLwogICAgICAgICAgICBlbmVyZ3lTaGlmdCArPSBQQ01fUVVBTlRfVEhSX1NDQUxFOwogICAgICAgICAgICBpZiAoZW5lcmd5U2hpZnQ+PTApIHsKICAgICAgICAgICAgICAgZW5lcmd5U2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSxlbmVyZ3lTaGlmdCk7CiAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7CiAgICAgICAgICAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA9IGZpeE1heCgqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA+PiBUSFJfU0hJRlRCSVRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhUaGlzUHN5Q29uZltjaF0tPnNmYlBjbVF1YW50VGhyZXNob2xkW2ldID4+IGVuZXJneVNoaWZ0KSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgZW5lcmd5U2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwtZW5lcmd5U2hpZnQpOwogICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO2krKykgewogICAgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNYXgoKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPj4gVEhSX1NISUZUQklUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoVGhpc1BzeUNvbmZbY2hdLT5zZmJQY21RdWFudFRocmVzaG9sZFtpXSA8PCBlbmVyZ3lTaGlmdCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghcHN5U3RhdGljW2NoXS0+aXNMRkUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIHByZWVjaG8gY29udHJvbCAqLwogICAgICAgICAgICAgICAgaWYocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTVE9QX1dJTkRPVykgewogICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGZyb20gY29tcGFyaW5nIHN0b3AKICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzIHdpdGggc2hvcnQgdGhyZXNob2xkcyAqLwogICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobyAgPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCggcHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKCiAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobyA9IDE7CgogICAgICAgICAgICAgICAgaWYocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTVEFSVF9XSU5ET1cpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBGREthYWNFbmNfUHJlRWNob0NvbnRyb2wgaW4gbmV4dCBmcmFtZSB0byBjb21wYXJlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO2krKykgewogICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSA9IDA7CiAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIHNwcmVhZCBlbmVyZ3kgdG8gYXZvaWQgaG9sZSBkZXRlY3Rpb24gKi8KICAgICAgICAgICAgRkRLbWVtY3B5KHBTZmJTcHJlYWRFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwoKICAgICAgICAgICAgRkRLYWFjRW5jX1NwcmVhZGluZ01heChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsLiBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMgZXhpc3QgKi8KICAgIGlmIChjaGFubmVscz09MikgewogICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzWzFdOyB3KyspIHsKICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoWzFdOwogICAgICAgICAgICBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdChwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzBdK3cqbWF4U2ZiWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbMV0rdyptYXhTZmJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mWzFdLT5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lNU1swXSt3Km1heFNmYlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbMV0rdyptYXhTZmJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneU1TTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneU1TTGREYXRhKTsKICAgICAgICB9CiAgICB9CgogICAgLyogZ3JvdXAgc2hvcnQgZGF0YSAobWF4U2ZiW2NoXSBmb3Igc2hvcnQgYmxvY2tzIGlzIGRldGVybWluZWQgaGVyZSkgKi8KICAgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspCiAgICB7CiAgICAgICAgSU5UIG5vU2ZiLCBpOwogICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHNmYkdycDsKICAgICAgICAgICAgbm9TZmIgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcyAqIGhQc3lDb25mU2hvcnQtPnNmYkNudDsKICAgICAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgYXJlIGNvcGllZC9yZWdyb3VwZWQgZnJvbSB0aGUgIi5TaG9ydCIgdG8gdGhlICIuTG9uZyIgYXJyYXlzICovCiAgICAgICAgICAgIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSggcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWluU25yTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2ZiUGVyR3JvdXBbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlsxXS5ncmFudWxlTGVuZ3RoKTsKCgogICAgICAgICAgICAvKiBjYWxjdWxhdGUgbGREYXRhIGFycmF5cyAoc2hvcnQgdmFsdWVzIGFyZSBpbiAuTG9uZy1hcnJheXMgYWZ0ZXIgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKSAqLwogICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CiAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5Lkxvbmdbc2ZiR3JwXSwgJnBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGNhbGMgc2ZiVGhybGQgYW5kIHNldCBWYWx1ZXMgc21hbGxlciAyXi0zMSB0byAyXi0zMyovCiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgbm9TZmI7IHNmYkdycCArPSBoUHN5Q29uZlNob3J0LT5zZmJDbnQpIHsKICAgICAgICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZ1tzZmJHcnBdLCAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKICAgICAgICAgICAgICBmb3IgKHNmYj0wO3NmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO3NmYisrKSB7CiAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggY2hhbm5lbHM9PTIgKSB7CiAgICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgewogICAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuTG9uZ1tzZmJHcnBdLCAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TTGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBwc3lEYXRhW2NoXS0+Z3JvdXBlZFNmYk9mZnNldCwgKE1BWF9HUk9VUEVEX1NGQisxKSpzaXplb2YoSU5UKSk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIG1heFNmYltjaF0gZm9yIGxvbmcgYmxvY2tzICovCiAgICAgICAgICAgIGZvciAoc2ZiID0gcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZS0xOyBzZmIgPj0gMDsgc2ZiLS0pIHsKICAgICAgICAgICAgICAgIGZvciAobGluZSA9IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYisxXS0xOyBsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkgewogICAgICAgICAgICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmVdICE9IEZMMkZYQ09OU1RfU0dMKDAuMGYpKSBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsaW5lID4gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gc2ZiICsgMTsKICAgICAgICAgICAgLyogZW5zdXJlIGF0IGxlYXN0IG9uZSBzZWN0aW9uIGluIElDUzsgd29ya2Fyb3VuZCBmb3IgZXhpc3RpbmcgZGVjb2RlciBjcmMgaW1wbGVtZW50YXRpb24gKi8KICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gZml4TWF4KGZpeE1pbig1LHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpLG1heFNmYlBlckdyb3VwW2NoXSk7CgogICAgICAgICAgICAvKiBzZmJOcmdMZERhdGEgaXMgY2FsY3VsYXRlZCBpbiBGREthYWNFbmNfYWR2YW5jZVBzeWNoTG9uZywgY29weSBpbiBwc3lPdXQgc3RydWN0dXJlICovCiAgICAgICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhLCBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmcsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUqc2l6ZW9mKEZJWFBfREJMKSk7CgogICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LCAoTUFYX0dST1VQRURfU0ZCKzEpKnNpemVvZihJTlQpKTsKCiAgICAgICAgICAgIC8qIHNmYk1pblNuckxkRGF0YSBtb2RpZmllZCBpbiBhZGp1c3QgdGhyZXNob2xkLCBjb3B5IG5lY2Vzc2FyeSAqLwogICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnJMZERhdGEsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUqc2l6ZW9mKEZJWFBfREJMKSk7CgogICAgICAgICAgICAvKiBzZmJFbmVyZ3lNU0xkRGF0YSBpc3QgYWxyZWFkeSBjYWxjdWxhdGVkIGluIEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0OyBvbmx5IGluIGxvbmcgY2FzZSAqLwoKICAgICAgICAgICAgLyogY2FsYyBzZmJUaHJsZCBhbmQgc2V0IFZhbHVlcyBzbWFsbGVyIDJeLTMxIHRvIDJeLTMzKi8KICAgICAgICAgICAgTGREYXRhVmVjdG9yKHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZywgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CiAgICAgICAgICAgIGZvciAoaT0wO2k8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW2ldID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbaV0sIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKICAgICAgICAgICAgfQoKCiAgICAgICAgfQoKCiAgICB9CgoKICAgIC8qCiAgICAgICAgSW50ZW5zaXR5IHBhcmFtZXRlciBpbnRpYWxpemF0aW9uLgogICAgICovCiAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7CiAgICAgICAgRkRLbWVtY2xlYXIocHN5T3V0Q2hhbm5lbFtjaF0tPmlzQm9vaywgIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoSU5UKSk7CiAgICAgICAgRkRLbWVtY2xlYXIocHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoSU5UKSk7CiAgICB9CgogICAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewogICAgICAgIElOVCB3aW4gPSAoaXNTaG9ydFdpbmRvd1tjaF0/MTowKTsKICAgICAgICBpZiAoIXBzeVN0YXRpY1tjaF0tPmlzTEZFKQogICAgICAgIHsKICAgICAgICAgICAgLyogUE5TIERlY2lzaW9uICovCiAgICAgICAgICAgIEZES2FhY0VuY19QbnNEZXRlY3QoICYocHN5Q29uZlswXS5wbnNDb25mKSwKICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAogICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLCAvKiBjb3VudCBvZiBTZmIgd2hpY2ggYXJlIG5vdCB6ZXJvLiAqLwogICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlt3aW5dLnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJNYXhTY2FsZVNwZWMuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICBzZmJUb25hbGl0eVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8ub3JkZXJbMF1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW5bSElGSUxUXSwKICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSwKICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZyApOwogICAgICAgIH0gLyogIWlzTEZFICovCiAgICB9CgogICAgLyoKICAgICAgICBzdGVyZW8gUHJvY2Vzc2luZwogICAgKi8KICAgIGlmKGNoYW5uZWxzID09IDIpCiAgICB7CiAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0ID0gTVNfTk9ORTsKICAgICAgICBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3cgICAgICAgPSBjb21tb25XaW5kb3c7CiAgICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdykKICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChtYXhTZmJQZXJHcm91cFswXSwgbWF4U2ZiUGVyR3JvdXBbMV0pOwoKICAgICAgICBpZihwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgICAgIHsKICAgICAgICAgICAgLyogUE5TIHByZXByb2Nlc3NpbmcgZGVwZW5kaW5nIG9uIG1zIHByb2Nlc3Npbmc6IFBOUyBub3QgaW4gU2hvcnQgV2luZG93ISAqLwogICAgICAgICAgICBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnBzeURhdGFbMF0tPnNmYkVuZXJneSktPkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZwc3lEYXRhWzFdLT5zZmJFbmVyZ3kpLT5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzFdKTsKCiAgICAgICAgICAgIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uYWxsb3dJUyAmJiBjb21tb25XaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YSk7CgogICAgICAgICAgICBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CgogICAgICAgICAgICAvKiBQTlMgcG9zdHByb2Nlc3NpbmcgKi8KICAgICAgICAgICAgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIocHN5RGF0YVswXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHN5Q29uZlswXS5wbnNDb25mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0KTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlsxXS5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+Z3JvdXBlZFNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgY29tbW9uV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc1NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGEpOwoKICAgICAgICAgICAgLyogaXQncyBPSyB0byBwYXNzIHRoZSAiLkxvbmciIGFycmF5cyBoZXJlLiBUaGV5IGNvbnRhaW4gZ3JvdXBlZCBzaG9ydCBkYXRhIHNpbmNlIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpICovCiAgICAgICAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoIHBzeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKICAgICAgICB9CiAgICB9CgogIC8qCiAgICBQTlMgQ29kaW5nCiAgKi8KICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7CiAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgewogICAgICAgICAgLyogbm8gUE5TIGNvZGluZyAqLwogICAgICAgICAgZm9yKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOwogICAgICAgICAgfQogICAgICB9IGVsc2UKICAgICAgewogICAgICAgICAgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbY2hdLnBuc0NvbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVtjaF0tPnBuc0ZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcsIC8qIHRoaXMgaXMgdGhlIGVuZXJneSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhKTsKICAgICAgfQogIH0KCiAgICAvKgogICAgICAgIGJ1aWxkIG91dHB1dAogICAgKi8KICAgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspCiAgICB7CiAgICAgICAgSU5UIGosIGdycCwgbWFzazsKCiAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwICAgID0gbWF4U2ZiUGVyR3JvdXBbY2hdOwogICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUgICAgICAgICA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGU7CgogICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdPT0wKSB7CgogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250ICAgICAgICAgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwICAgID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlOwogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUgICAgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2hhcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBJTlQgc2ZiQ250ID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250OwoKICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gc2ZiQ250OwogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAgICAgPSBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOwogICAgICAgIH0KCiAgICAgICAgLyogZ2VuZXJhdGUgZ3JvdXBpbmcgbWFzayAqLwogICAgICAgIG1hc2sgPSAwOwogICAgICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHM7IGdycCsrKQogICAgICAgIHsKICAgICAgICAgIG1hc2sgPDw9IDE7CiAgICAgICAgICBmb3IgKGo9MTsgajxwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CiAgICAgICAgICAgICAgbWFzayA9IChtYXNrPDwxKSB8IDEgOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrID0gbWFzazsKCiAgICAgICAgLyogYnVpbGQgaW50ZXJmYWNlICovCiAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5ncm91cExlbixwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sTUFYX05PX09GX0dST1VQUypzaXplb2YoSU5UKSk7CiAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3ksKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5KS0+TG9uZywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwogICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LCgmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSktPkxvbmcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLy8gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCAoMTAyNCkqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICB9CgogICAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgp2b2lkIEZES2FhY0VuY19Qc3lDbG9zZShQU1lfSU5URVJOQUwgICAqKnBoUHN5SW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhQc3lPdXQpCnsKICAgIGludCBuLCBpOwoKCiAgICBpZihwaFBzeUludGVybmFsIT1OVUxMKSB7CiAgICAgIFBTWV9JTlRFUk5BTCAqaFBzeUludGVybmFsID0gKnBoUHN5SW50ZXJuYWw7CgogICAgICBpZiAoaFBzeUludGVybmFsKQogICAgICB7CiAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXSkgewogICAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyKQogICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKCZoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpOyAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCgogICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lTdGF0aWMoJmhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNZX1NUQVRJQyAqLwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBzeUVsZW1lbnRbaV0pCiAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUVsZW1lbnQoJmhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU1lfRUxFTUVOVCAqLwogICAgICAgIH0KCgogICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUludGVybmFsKHBoUHN5SW50ZXJuYWwpOwogICAgICB9CiAgICB9CgogICAgaWYgKHBoUHN5T3V0IT1OVUxMKSB7CiAgICAgIGZvciAobj0wOyBuPCgxKTsgbisrKSB7CiAgICAgICAgaWYgKHBoUHN5T3V0W25dKQogICAgICAgIHsKICAgICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKQogICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoJnBoUHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0pOyAgICAgICAgICAgICAgICAgIC8qIFBTWV9PVVRfQ0hBTk5FTCAqLwogICAgICAgICAgfQoKICAgICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSkKICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cygmcGhQc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0pOyAgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0VMRU1FTlRTICovCiAgICAgICAgICB9CgogICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0KCZwaFBzeU91dFtuXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9Cn0K