Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiZnJhbV9nZW4uaCIKI2luY2x1ZGUgInNicl9taXNjLmgiCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIwNDggPSB7CiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIHsgMCwgMTZ9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgICAwLAogICAgICAgICAgICAgMSwKICAgICAgICAgICAgIHswLCAxNn0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIwNDggPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE2fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA4LCAxNn0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIwNDggPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTZ9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE2fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMjMwNCA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxOH0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxOH0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIzMDQgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDksIDE4fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA5LCAxOH0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIzMDQgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDUsICA5LCAxNCwgMTh9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDksIDE4fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTkyMCA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxNX0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxNX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzE5MjAgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE1fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA4LCAxNX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzE5MjAgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTV9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE1fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTE1MiA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAgOX0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAgOX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzExNTIgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDUsICA5fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzExNTIgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDIsICA1LAogICAgICAgICAgICAgIDcsICA5fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKCgovKiBBQUNMRCBmcmFtZSBpbmZvICovCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgIHswLCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgezAsIDh9fTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgIHswLCA0LCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgIHswLCAyLCA0LCA2LCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKCnN0YXRpYyBpbnQKY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLwogICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cyAgIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCiAgICAgICAgICAgICAgICAgICApOwoKc3RhdGljIHZvaWQKZmlsbEZyYW1lVHJhbiAoY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgc2VnbWVudCBsZW5ndGhzICovCiAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCiAgICAgICAgICAgICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBib3JkZXJzICovCiAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KICAgICAgICAgICAgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgKTsKCnN0YXRpYyB2b2lkIGZpbGxGcmFtZVByZSAoSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3QpOwoKc3RhdGljIHZvaWQgZmlsbEZyYW1lUG9zdCAoSU5UICpwYXJ0cywgSU5UICpkLCBJTlQgZG1heCwgSU5UICp2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzLCBJTlQgZm1heCk7CgpzdGF0aWMgdm9pZCBmaWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgYm1pbiwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgSU5UIGlfZmlsbEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkbWluLCBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cyk7CgpzdGF0aWMgdm9pZCBjYWxjRnJhbWVDbGFzcyAoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNwcmVhZEZsYWcpOwoKc3RhdGljIHZvaWQgc3BlY2lhbENhc2UgKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFydHMsIElOVCBkKTsKCnN0YXRpYyB2b2lkIGNhbGNDbW9uQm9yZGVyIChJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgdHJhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKCnN0YXRpYyB2b2lkIGtlZXBGb3JGb2xsb3dVcCAoSU5UICp2X2JvcmRGb2xsb3csIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLCBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpOwoKc3RhdGljIHZvaWQgY2FsY0N0cmxTaWduYWwgKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzcHJlYWRGbGFnLCBJTlQgbkwpOwoKc3RhdGljIHZvaWQgY3RybFNpZ25hbDJGcmFtZUluZm8gKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoRnJhbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCk7CgoKLyogdGFibGUgZm9yIDggdGltZSBzbG90IGluZGV4ICovCnN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV84IFs4XVs1XSA9IHsKLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCiAgICAvKlt8VC18LS0tLS0tXSovICB7IDIsIDAsIDAsIDEsIC0xIH0sCiAgICAvKlt8LVQtfC0tLS0tXSovICB7IDIsIDAsIDAsIDIsIC0xIH0sCiAgICAvKlstLXxULXwtLS0tXSovICB7IDMsIDEsIDEsIDIsICA0IH0sCiAgICAvKlstLS18VC18LS0tXSovICB7IDMsIDEsIDEsIDMsICA1IH0sCiAgICAvKlstLS0tfFQtfC0tXSovICB7IDMsIDEsIDEsIDQsICA2IH0sCiAgICAvKlstLS0tLXxULS18XSovICB7IDIsIDEsIDEsIDUsIC0xIH0sCiAgICAvKlstLS0tLS18VC18XSovICB7IDIsIDEsIDEsIDYsIC0xIH0sCiAgICAvKlstLS0tLS0tfFR8XSovICB7IDIsIDEsIDEsIDcsIC0xIH0sCn07CgovKiB0YWJsZSBmb3IgMTYgdGltZSBzbG90IGluZGV4ICovCnN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV8xNiBbMTZdWzZdID0gewogICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCiAgICAvKlt8VC0tLXwtLS0tLS0tLS0tLS18XSovIHsgMiwgMCwgMCwgNCwgLTEsIC0xfSwKICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAogICAgLypbfC0tfFQtLS18LS0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCiAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMywgIDcsIC0xfSwKICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAogICAgLypbfC0tLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCiAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNiwgMTAsIC0xfSwKICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAogICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOSwgMTMsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMiwgLTEsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNSwgLTEsIC0xfSwKfTsKCi8qIHRhYmxlIGZvciAxNSB0aW1lIHNsb3QgaW5kZXggKi8Kc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE1IFsxNV1bNl0gPSB7CiAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgLyogbGVuZ3RoIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCiAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAogICAgLypbfC0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMiwgIDYsIC0xfSwKICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCiAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAogICAgLypbfC0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNSwgIDksIC0xfSwKICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCiAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAogICAgLypbfC0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOCwgMTIsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDEwLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMSwgLTEsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNCwgLTEsIC0xfSwKfTsKCnN0YXRpYyBjb25zdCBpbnQgbWluRnJhbWVUcmFuRGlzdGFuY2UgPSA0OwoKc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfOFtdID0ge0ZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLAogIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9OwoKc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfMTZbMTZdID0gewogICAgLyogc2l6ZSBvZiBlbnZlbG9wZSAqLwovKiAwLTQgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csCi8qIDUtOSAqLyAgICBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsCi8qIDEwLTE2ICovICBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILAogICAgICAgICAgICAgRlJFUV9SRVNfSElHSCB9OwoKc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5ICggSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZlJlc1RyYW5zSXNMb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCgovKiEKICBGdW5jdGlvbm5hbWU6IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IKCiAgRGVzY3JpcHRpb246ICBwcm9kdWNlcyB0aGUgRlJBTUVfSU5GTyBzdHJ1Y3QgZm9yIHRoZSBjdXJyZW50IGZyYW1lCgogIEFyZ3VtZW50czogICAgaFNickVudkZyYW1lICAgICAgICAgIC0gcG9pbnRlciB0byBzYnIgZW52ZWxvcGUgaGFuZGxlCiAgICAgICAgICAgICAgICB2X3ByZV90cmFuc2llbnRfaW5mbyAgLSBwb2ludGVyIHRvIHRyYW5zaWVudCBpbmZvIHZlY3RvcgogICAgICAgICAgICAgICAgdl90cmFuc2llbnRfaW5mbyAgICAgIC0gcG9pbnRlciB0byBwcmV2aW91cyB0cmFuc2llbnQgaW5mbyB2ZWN0b3IKICAgICAgICAgICAgICAgIHZfdHVuaW5nICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdHVuaW5nIHZlY3RvcgoKIFJldHVybjogICAgICBmcmFtZV9pbmZvICAgICAgICAtIHBvaW50ZXIgdG8gU0JSX0ZSQU1FX0lORk8gc3RydWN0CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQU5ETEVfU0JSX0ZSQU1FX0lORk8KRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvciAoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm9fcHJlLAogICAgICAgICAgICAgICAgICAgIGludCBsZEdyaWQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZykKewogIElOVCBudW1FbnYsIHRyYW5Qb3NJbnRlcm5hbD0wLCBibWluPTAsIGJtYXg9MCwgcGFydHMsIGQsIGlfY21vbj0wLCBpX3RyYW49MCwgbkw7CiAgSU5UIGZtYXggPSAwOwoKICBJTlQgKnZfYm9yZCA9IGhTYnJFbnZGcmFtZS0+dl9ib3JkOwogIElOVCAqdl9mcmVxID0gaFNickVudkZyYW1lLT52X2ZyZXE7CiAgSU5UICp2X2JvcmRGb2xsb3cgPSBoU2JyRW52RnJhbWUtPnZfYm9yZEZvbGxvdzsKICBJTlQgKnZfZnJlcUZvbGxvdyA9IGhTYnJFbnZGcmFtZS0+dl9mcmVxRm9sbG93OwoKCiAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfYm9yZEZvbGxvdzsKICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9mcmVxRm9sbG93OwogIElOVCAqbGVuZ3RoX3ZfYm9yZCA9ICZoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQ7CiAgSU5UICpsZW5ndGhfdl9mcmVxID0gJmhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcTsKICBJTlQgKnNwcmVhZEZsYWcgPSAmaFNickVudkZyYW1lLT5zcHJlYWRGbGFnOwogIElOVCAqaV90cmFuRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+aV90cmFuRm9sbG93OwogIElOVCAqaV9maWxsRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+aV9maWxsRm9sbG93OwogIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkID0gJmhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZDsKICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzID0gRklYRklYOwoKCiAgSU5UIGFsbG93U3ByZWFkID0gaFNickVudkZyYW1lLT5hbGxvd1NwcmVhZDsKICBJTlQgbnVtRW52U3RhdGljID0gaFNickVudkZyYW1lLT5udW1FbnZTdGF0aWM7CiAgSU5UIHN0YXRpY0ZyYW1pbmcgPSBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmc7CiAgSU5UIGRtaW4gPSBoU2JyRW52RnJhbWUtPmRtaW47CiAgSU5UIGRtYXggPSBoU2JyRW52RnJhbWUtPmRtYXg7CgogIElOVCBidWZmZXJGcmFtZVN0YXJ0ID0gaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQ7CiAgSU5UIG51bWJlclRpbWVTbG90cyA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5udW1iZXJUaW1lU2xvdHM7CiAgSU5UIGZyYW1lTWlkZGxlU2xvdCA9IGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90OwoKICBJTlQgdHJhblBvcyA9IHZfdHJhbnNpZW50X2luZm9bMF07CiAgSU5UIHRyYW5GbGFnID0gdl90cmFuc2llbnRfaW5mb1sxXTsKCiAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20gPSB2X3R1bmluZzsKICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSA9IHZfdHVuaW5nICsgMzsKCiAgaFNickVudkZyYW1lLT52X3R1bmluZ1NlZ20gPSB2X3R1bmluZ1NlZ207CgogIGlmIChsZEdyaWQpIHsKICAgIC8qIGluIGNhc2UgdGhlcmUgd2FzIGEgdHJhbnNpZW50IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUsIHN0YXJ0IHdpdGggYSB0cmFuc2llbnQgZW52ZWxvcGUgKi8KICAgIGlmICggIXRyYW5GbGFnICYmIHZfdHJhbnNpZW50X2luZm9fcHJlWzFdICYmIChudW1iZXJUaW1lU2xvdHMgLSB2X3RyYW5zaWVudF9pbmZvX3ByZVswXSA8IG1pbkZyYW1lVHJhbkRpc3RhbmNlKSApewogICAgICB0cmFuRmxhZyA9IDE7CiAgICAgIHRyYW5Qb3MgID0gMDsKICAgIH0KICB9CgogIC8qCiAgICogU3lub3BzaXM6CiAgICoKICAgKiBUaGUgZnJhbWUgZ2VuZXJhdG9yIGNyZWF0ZXMgdGhlIHRpbWUtL2ZyZXF1ZW5jeS1ncmlkIGZvciBvbmUgU0JSIGZyYW1lLgogICAqIElucHV0IHNpZ25hbHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSB0cmFuc2llbnQgZGV0ZWN0b3IgYW5kIHRoZSBmcmFtZQogICAqIHNwbGl0dGVyICh0cmFuc2llbnREZXRlY3ROZXcoKSAmIEZyYW1lU3BsaXR0ZXIoKSBpbiB0cmFuX2RldC5jKS4gIFRoZQogICAqIGZyYW1pbmcgaXMgY29udHJvbGxlZCBieSBhZGp1c3RpbmcgdHVuaW5nIHBhcmFtZXRlcnMgc3RvcmVkIGluCiAgICogRlJBTUVfR0VOX1RVTklORy4gIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBkZXBlbmRlbnQgb24gZnJhbWUgbGVuZ3RocwogICAqIGFuZCBiaXRyYXRlcywgYW5kIG1heSBpbiB0aGUgZnV0dXJlIGJlIHNpZ25hbCBkZXBlbmRlbnQuCiAgICoKICAgKiBUaGUgZW52ZWxvcGUgYm9yZGVycyBhcmUgc3RvcmVkIGZvciBmcmFtZSBnZW5lcmF0b3IgaW50ZXJuYWwgdXNlIGluCiAgICogYUJvcmRlcnMuICBUaGUgY29udGVudHMgb2YgYUJvcmRlcnMgcmVwcmVzZW50IHBvc2l0aW9ucyBhbG9uZyB0aGUgdGltZQogICAqIGF4aXMgZ2l2ZW4gaW4gdGhlIGZpZ3VyZXMgaW4gZnJhbV9nZW4uaCAodGhlICJmcmFtZS1nZW5lcmF0b3IiIHJvd3MpLgogICAqIFRoZSB1bml0IGlzICJ0aW1lIHNsb3QiLiAgVGhlIGZpZ3VyZXMgaW4gZnJhbV9nZW4uaCBhbHNvIGRlZmluZSB0aGUKICAgKiBkZXRlY3Rpb24gcmFuZ2VzIGZvciB0aGUgdHJhbnNpZW50IGRldGVjdG9yLiAgRm9yIGV2ZXJ5IGJvcmRlciBpbgogICAqIGFCb3JkZXJzLCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gYUZyZXFSZXMsIHdoaWNoIGRlZmluZXMgdGhlCiAgICogZnJlcXVlbmN5IHJlc29sdXRpb24gb2YgdGhlIGVudmVsb3BlIGZvbGxvd2luZyAoZGVsaW1pdGVkIGJ5KSB0aGUKICAgKiBib3JkZXIuCiAgICoKICAgKiBXaGVuIG5vIHRyYW5zaWVudHMgYXJlIHByZXNlbnQsIEZJWEZJWCBjbGFzcyBmcmFtZXMgYXJlIHVzZWQuICBUaGUKICAgKiBmcmFtZSBzcGxpdHRlciBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIG9uZSBvciB0d28gZW52ZWxvcGVzIGluIHRoZQogICAqIEZJWEZJWCBmcmFtZS4gICJTcGFyc2UgdHJhbnNpZW50cyIgKHNlcGFyYXRlZCBieSBhIGZldyBmcmFtZXMgd2l0aG91dAogICAqIHRyYW5zaWVudHMpIGFyZSBoYW5kZWxlZCBieSBbRklYVkFSLCBWQVJGSVhdIHBhaXJzIG9yIChkZXBlbmRpbmcgb24KICAgKiB0dW5pbmcgYW5kIHRyYW5zaWVudCBwb3NpdGlvbiByZWxhdGl2ZSB0aGUgbm9taW5hbCBmcmFtZSBib3VuZGFyaWVzKQogICAqIGJ5IFtGSVhWQVIsIFZBUlZBUiwgVkFSRklYXSB0cmlwbGVzLiAgIlRpZ2h0IHRyYW5zaWVudHMiIChpbgogICAqIGNvbnNlY3V0aXZlIGZyYW1lcykgYXJlIGhhbmRlbGVkIGJ5IFsuLi4sIFZBUlZBUiwgVkFSVkFSLCAuLi5dCiAgICogc2VxdWVuY2VzLgogICAqCiAgICogVGhlIGdlbmVyYXRvciBhc3N1bWVzIHRoYXQgdHJhbnNpZW50cyBhcmUgInNwYXJzZSIsIGFuZCBkZXNpZ25zCiAgICogYm9yZGVycyBmb3IgW0ZJWFZBUiwgVkFSRklYXSBwYWlycyByaWdodCBhd2F5LCB3aGVyZSB0aGUgZmlyc3QgZnJhbWUKICAgKiBjb3JyZXNwb25kcyB0byB0aGUgcHJlc2VudCBmcmFtZS4gIEF0IHRoZSBuZXh0IGNhbGwgb2YgdGhlIGdlbmVyYXRvcgogICAqIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIHRyYW5zaWVudCBhY3R1YWxseSBpcyAic3BhcnNlIiBvciBub3QuICBJZgogICAqICd5ZXMnLCB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIFZBUkZJWCBib3JkZXJzIGFyZSB1c2VkLiAgSWYgJ25vJywgbmV3CiAgICogYm9yZGVycywgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSAidGlnaHQiIHRyYW5zaWVudCwgYXJlCiAgICogY2FsY3VsYXRlZC4KICAgKgogICAqIFRoZSBnZW5lcmF0b3IgcHJvZHVjZXMgdHdvIG91dHB1dHM6ICBBICJjbGVhci10ZXh0IGJpdHN0cmVhbSIgc3RvcmVkIGluCiAgICogU0JSX0dSSUQsIGFuZCBhIHN0cmFpZ2h0LWZvcndhcmQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyaWQgc3RvcmVkIGluCiAgICogU0JSX0ZSQU1FX0lORk8uICBUaGUgZm9ybWVyIGlzIHN1YnNlcXVlbnRseSBjb252ZXJ0ZWQgdG8gdGhlIGFjdHVhbAogICAqIGJpdHN0cmVhbSBzYnJfZ3JpZCgpIChlbmNvZGVTYnJHcmlkKCkgaW4gYml0X3Nici5jKS4gIFRoZSBsYXR0ZXIgaXMKICAgKiB1c2VkIGJ5IG90aGVyIGVuY29kZXIgZnVuY3Rpb25zLCBzdWNoIGFzIHRoZSBlbnZlbG9wZSBlc3RpbWF0b3IKICAgKiAoY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBpbiBlbnZfZXN0LmMpIGFuZCB0aGUgbm9pc2UgZmxvb3IgYW5kIG1pc3NpbmcKICAgKiBoYXJtb25pY3MgZGV0ZWN0b3IgKFRvbkNvcnJQYXJhbUV4dHIoKSBpbiBuZl9lc3QuYykuCiAgICovCgogIGlmIChzdGF0aWNGcmFtaW5nKSB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIElnbm9yZSB0cmFuc2llbnQgZGV0ZWN0b3IKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZnJhbWVDbGFzcyA9IEZJWEZJWDsKICAgIG51bUVudiA9IG51bUVudlN0YXRpYzsgICAgICAvKiB7MSwyLDQsOH0gKi8KICAgICpmcmFtZUNsYXNzT2xkID0gRklYRklYOyAgICAvKiBmb3IgY2hhbmdlIHRvIGR5biAqLwogICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CiAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CiAgfQogIGVsc2UgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxjdWxhdGUgZnJhbWUgY2xhc3MgdG8gdXNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2FsY0ZyYW1lQ2xhc3MgKCZmcmFtZUNsYXNzLCBmcmFtZUNsYXNzT2xkLCB0cmFuRmxhZywgc3ByZWFkRmxhZyk7CgogICAgLyogcGF0Y2ggZm9yIG5ldyBmcmFtZSBjbGFzcyBGSVhGSVhvbmx5IGZvciBBQUMgTEQgKi8KICAgIGlmICh0cmFuRmxhZyAmJiBsZEdyaWQpIHsKICAgICAgZnJhbWVDbGFzcyAgICAgPSBGSVhGSVhvbmx5OwogICAgICAqZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKICAgIH0KCiAgICAvKgogICAgICogZXZlcnkgdHJhbnNpZW50IGlzIHByb2Nlc3NlZCBiZWxvdyBieSBpbnNlcnRpbmcKICAgICAqCiAgICAgKiAtIG9uZSBib3JkZXIgYXQgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQKICAgICAqIC0gb25lIG9yIG1vcmUgImRlY2F5IGJvcmRlcnMiIChhZnRlciB0aGUgb25zZXQgb2YgdGhlIHRyYW5zaWVudCkKICAgICAqIC0gb3B0aW9uYWxseSBvbmUgImF0dGFjayBib3JkZXIiIChiZWZvcmUgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQpCiAgICAgKgogICAgICogdGhvc2UgYm9yZGVycyBhcmUgcmVmZXJyZWQgdG8gYXMgIm1hbmRhdG9yeSBib3JkZXJzIiBhbmQgYXJlCiAgICAgKiBkZWZpbmVkIGJ5IHRoZSAnc2VnbWVudExlbmd0aCcgYXJyYXkgaW4gRlJBTUVfR0VOX1RVTklORwogICAgICoKICAgICAqIHRoZSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW52ZWxvcGVzIGFyZQogICAgICogZGVmaW5lZCBieSB0aGUgJ3NlZ21lbnRSZXMnIGFycmF5IGluIEZSQU1FX0dFTl9UVU5JTkcKICAgICAqLwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGVzaWduIGZyYW1lIChvciBmb2xsb3ctdXAgb2xkIGRlc2lnbikKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAodHJhbkZsYWcpIHsgICAgICAgICAgICAgLyogQWx3YXlzIGZvciBGaXhWYXIsIG9mdGVuIGJ1dCBub3QgYWx3YXlzIGZvciBWYXJWYXIgKi8KICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERlc2lnbiBwYXJ0IG9mIFQvRi1ncmlkIGFyb3VuZCB0aGUgbmV3IHRyYW5zaWVudAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgdHJhblBvc0ludGVybmFsID0gZnJhbWVNaWRkbGVTbG90ICsgdHJhblBvcyArIGJ1ZmZlckZyYW1lU3RhcnQgOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAgICAgIC8qCiAgICAgICAgYWRkIG1hbmRhdG9yeSBib3JkZXJzIGFyb3VuZCB0cmFuc2llbnQKICAgICAgKi8KCiAgICAgIGZpbGxGcmFtZVRyYW4gKCB2X3R1bmluZ1NlZ20sCiAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZ0ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICB0cmFuUG9zSW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgJmJtaW4sCiAgICAgICAgICAgICAgICAgICAgICZibWF4ICk7CgogICAgICAvKiBtYWtlIHN1cmUgd2Ugc3RheSB3aXRoaW4gdGhlIG1heGltdW0gU0JSIGZyYW1lIG92ZXJsYXAgKi8KICAgICAgZm1heCA9IGNhbGNGaWxsTGVuZ3RoTWF4KHRyYW5Qb3MsIG51bWJlclRpbWVTbG90cyk7CiAgICB9CgogICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CgogICAgY2FzZSBGSVhGSVhvbmx5OgogICAgICBGREtfQVNTRVJUKGxkR3JpZCk7CiAgICAgIHRyYW5Qb3NJbnRlcm5hbCA9IHRyYW5Qb3M7CiAgICAgIGdlbmVyYXRlRml4Rml4T25seSAoICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhTYnJFbnZGcmFtZS0+U2JyR3JpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW52RnJhbWUtPmZSZXNUcmFuc0lzTG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICByZXR1cm4gJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyk7CgogICAgY2FzZSBGSVhWQVI6CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLAogICAgICAgICAgICAgICAgICAgIGJtaW4sIGJtaW4gLSBidWZmZXJGcmFtZVN0YXJ0KTsgICAgIC8qIEZIIDAwLTA2LTI2ICovCgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRmlsbCByZWdpb24gYWZ0ZXIgbmV3IHRyYW5zaWVudDoKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgZmlsbEZyYW1lUG9zdCAoJnBhcnRzLCAmZCwgZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywgZm1heCk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZToKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAgIC8qIG5vIGZpbGwsIHNob3J0IGxhc3QgZW52ZWxvcGUgKi8KICAgICAgICBzcGVjaWFsQ2FzZSAoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwKICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENhbGN1bGF0ZSBjb21tb24gYm9yZGVyIChzcGxpdC1wb2ludCkKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgY2FsY0Ntb25Cb3JkZXIgKCZpX2Ntb24sICZpX3RyYW4sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhblBvc0ludGVybmFsLAogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsgICAgICAgLyogRkggMDAtMDYtMjYgKi8KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBFeHRyYWN0IGRhdGEgZm9yIHByb3BlciBmb2xsb3ctdXAgaW4gbmV4dCBmcmFtZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBrZWVwRm9yRm9sbG93VXAgKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgcGFydHMsIG51bWJlclRpbWVTbG90cyk7ICAvKiBGSCAwMC0wNi0yNiAqLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgKmxlbmd0aF92X2JvcmQsIHZfZnJlcSwgKmxlbmd0aF92X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICBpX2Ntb24sIGlfdHJhbiwgKnNwcmVhZEZsYWcsIERDKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZBUkZJWDoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGNhbGNDdHJsU2lnbmFsICgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3csIERDLCAqaV90cmFuRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgKnNwcmVhZEZsYWcsIERDKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZBUlZBUjoKICAgICAgaWYgKCpzcHJlYWRGbGFnKSB7ICAgICAgICAvKiBzcHJlYWQgYWNyb3NzIHRocmVlIGZyYW1lcyAqLwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDbGFzcywgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgREMsCiAgICAgICAgICAgICAgICAgICAgICAgICppX3RyYW5Gb2xsb3csICpzcHJlYWRGbGFnLCBEQyk7CgogICAgICAgICpzcHJlYWRGbGFnID0gMDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRXh0cmFjdCBkYXRhIGZvciBwcm9wZXIgZm9sbG93LXVwIGluIG5leHQgZnJhbWUKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIHZfYm9yZEZvbGxvd1swXSA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19hYnNfYm9yZF8xIC0gbnVtYmVyVGltZVNsb3RzOyAvKiBGSCAwMC0wNi0yNiAqLwogICAgICAgIHZfZnJlcUZvbGxvd1swXSA9IDE7CiAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAxOwogICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gMTsKCiAgICAgICAgKmlfdHJhbkZvbGxvdyA9IC1EQzsKICAgICAgICAqaV9maWxsRm9sbG93ID0gLURDOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQogICAgICAgICAgYWRhcHQgb3IgZmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6CiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBmaWxsRnJhbWVJbnRlciAoJm5MLCB2X3R1bmluZ1NlZ20sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcUZvbGxvdywgKmlfZmlsbEZvbGxvdywgZG1pbiwgZG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzKTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsbCBhZnRlciB0cmFuc2llbnQ6CiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBmaWxsRnJhbWVQb3N0ICgmcGFydHMsICZkLCBkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLCBibWF4LCBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMsIGZtYXgpOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBUYWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlOgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAvKiUgbm8gZmlsbCwgc2hvcnQgbGFzdCBlbnZlbG9wZSAqLwogICAgICAgICAgc3BlY2lhbENhc2UgKHNwcmVhZEZsYWcsIGFsbG93U3ByZWFkLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBDYWxjdWxhdGUgY29tbW9uIGJvcmRlciAoc3BsaXQtcG9pbnQpCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ21vbkJvcmRlciAoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuUG9zSW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBrZWVwRm9yRm9sbG93VXAgKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgbGVuZ3RoX3ZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LCB2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGlfY21vbiwgaV90cmFuLCBwYXJ0cywgbnVtYmVyVGltZVNsb3RzKTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgQ2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDbGFzcywgdl9ib3JkLCAqbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIDAsIG5MKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgRklYRklYOgogICAgICBpZiAodHJhblBvcyA9PSAwKQogICAgICAgIG51bUVudiA9IDE7CiAgICAgIGVsc2UKICAgICAgICBudW1FbnYgPSAyOwoKICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CiAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29udmVydCBjb250cm9sIHNpZ25hbCB0byBmcmFtZSBpbmZvIHN0cnVjdAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgY3RybFNpZ25hbDJGcmFtZUluZm8gKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4KTsKCiAgcmV0dXJuICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiAgICBHbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheSB2ZXJzaW9uCgogIFxyZXR1cm4gICBub3RoaW5nCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhblBvc0ludGVybmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmUmVzVHJhbnNJc0xvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgaW50IG5FbnYsIGksIGs9MCwgdHJhbklkeDsKICBjb25zdCBpbnQgKnBUYWJsZSA9IE5VTEw7CiAgY29uc3QgRlJFUV9SRVMgKmZyZXFSZXNUYWJsZSA9IE5VTEw7CgogIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CiAgICAgIGNhc2UgODoKICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfOFt0cmFuUG9zSW50ZXJuYWxdOwogICAgICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV84OwogICAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTU6CiAgICAgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07CiAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzE2OwogICAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTY6CiAgICAgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzE2W3RyYW5Qb3NJbnRlcm5hbF07CiAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzE2OwogICAgICAgICAgYnJlYWs7CiAgfQoKICAvKiBsb29rIG51bWJlciBvZiBlbnZvbHBlcyBpbiB0YWJsZSAqLwogIG5FbnYgPSBwVGFibGVbMF07CiAgLyogbG9vayB1cCBlbnZvbHBlIGRpc3RyaWJ1dGlvbiBpbiB0YWJsZSAqLwogIGZvciAoaT0xOyBpPG5FbnY7IGkrKykKICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSsyXTsKCiAgLyogb3BlbiBhbmQgY2xvc2UgZnJhbWUgYm9yZGVyICovCiAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSAgICA9IDA7CiAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IG51bWJlclRpbWVTbG90czsKCiAgLyogYWRqdXN0IHNlZ21lbnQtZnJlcXVlbmN5LXJlc29sdXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWdtZW50LWxlbmd0aCAqLwogIGZvciAoaT0wOyBpPG5FbnY7IGkrKyl7CiAgICBrID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpKzFdIC0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXTsKICAgIGlmICghZlJlc1RyYW5zSXNMb3cpCiAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBmcmVxUmVzVGFibGVba107CiAgICBlbHNlCiAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBGUkVRX1JFU19MT1c7CgogICAgaFNickdyaWQtPnZfZltpXSA9IGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV07CiAgfQoKICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiAgID0gcFRhYmxlWzJdOwogIC8qIHRyYW5zaWVudCBpZHggKi8KICB0cmFuSWR4ID0gcFRhYmxlWzFdOwoKICAvKiBhZGQgbm9pc2UgZmxvb3JzICovCiAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gMDsKICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHg/dHJhbklkeDoxXTsKICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBudW1iZXJUaW1lU2xvdHM7CiAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKCiAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBGSVhGSVhvbmx5OwogIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IHRyYW5Qb3NJbnRlcm5hbDsKICBoU2JyR3JpZC0+YnNfbnVtX2VudiA9IG5FbnY7Cgp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogICBoU2JyRW52RnJhbWUgIC0gcG9pbnRlciB0byBzYnIgZW52ZWxvcGUgaGFuZGxlCiAgICAgICAgICAgICAgYWxsb3dTcHJlYWQgICAtIGNvbW1hbmRsaW5lIHBhcmFtZXRlcgogICAgICAgICAgICAgIG51bUVudlN0YXRpYyAgLSBjb21tYW5kbGluZSBwYXJhbWV0ZXIKICAgICAgICAgICAgICBzdGF0aWNGcmFtaW5nIC0gY29tbWFuZGxpbmUgcGFyYW1ldGVyCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKAogICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAogICAgICAgICAgICAgIElOVCAgICAgICBhbGxvd1NwcmVhZCwKICAgICAgICAgICAgICBJTlQgICAgICAgbnVtRW52U3RhdGljLAogICAgICAgICAgICAgIElOVCAgICAgICBzdGF0aWNGcmFtaW5nLAogICAgICAgICAgICAgIElOVCAgICAgICB0aW1lU2xvdHMsCiAgICAgICAgY29uc3QgRlJFUV9SRVMqIGZyZXFfcmVzX2ZpeGZpeAogICAgICAgICAgICAgLFVDSEFSICAgICBmUmVzVHJhbnNJc0xvdywKICAgICAgICAgICAgICBJTlQgICAgICAgbGRHcmlkCiAgICAgICAgKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCgogIEZES21lbWNsZWFyKGhTYnJFbnZGcmFtZSxzaXplb2YoU0JSX0VOVkVMT1BFX0ZSQU1FICkpOwoKCiAgLyogSW5pdGlhbGlzYXRpb24gKi8KICBoU2JyRW52RnJhbWUtPmZyYW1lQ2xhc3NPbGQgPSBGSVhGSVg7CiAgaFNickVudkZyYW1lLT5zcHJlYWRGbGFnID0gMDsKCiAgaFNickVudkZyYW1lLT5hbGxvd1NwcmVhZCA9IGFsbG93U3ByZWFkOwogIGhTYnJFbnZGcmFtZS0+bnVtRW52U3RhdGljID0gbnVtRW52U3RhdGljOwogIGhTYnJFbnZGcmFtZS0+c3RhdGljRnJhbWluZyA9IHN0YXRpY0ZyYW1pbmc7CiAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBmcmVxX3Jlc19maXhmaXhbMF07CiAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBmcmVxX3Jlc19maXhmaXhbMV07CiAgaFNickVudkZyYW1lLT5mUmVzVHJhbnNJc0xvdyAgICAgPSBmUmVzVHJhbnNJc0xvdzsKCiAgaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkID0gMDsKICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3cgPSAwOwoKICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2ZyZXEgPSAwOwogIGhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IDA7CgogIGhTYnJFbnZGcmFtZS0+aV90cmFuRm9sbG93ID0gMDsKICBoU2JyRW52RnJhbWUtPmlfZmlsbEZvbGxvdyA9IDA7CgogIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5udW1iZXJUaW1lU2xvdHMgPSB0aW1lU2xvdHM7CgogIGlmIChsZEdyaWQpIHsKICAgIC8qY2FzZSBDT0RFQ19BQUNMRDoqLwogICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwogICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxNjsKICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwogIH0gZWxzZQogIHN3aXRjaCh0aW1lU2xvdHMpewogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgogICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OwogICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxMjsKICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwogICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzE5MjA7CiAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTI7CiAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OwogICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDI7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDg7CiAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xMTUyOwogICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDE1OwogICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjMwNDsKICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICB9Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZVRyYW4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogIEFkZCBtYW5kYXRvcnkgYm9yZGVycywgYXMgZGVzY3JpYmVkIGJ5IHRoZSB0dW5pbmcgdmVjdG9yCiAgICAgICAgICAgICAgIGFuZCB0aGUgY3VycmVudCB0cmFuc2llbnQgcG9zaXRpb24KCiBBcmd1bWVudHM6CiAgICAgIG1vZGlmaWVkOgogICAgICAgICAgICAgIHZfYm9yZCAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCAtIGxlbmd0aCBvZiB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgdl9mcmVxICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfZnJlcSB2ZWN0b3IKICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxIC0gbGVuZ3RoIG9mIHZfZnJlcSB2ZWN0b3IKICAgICAgICAgICAgICBibWluICAgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gYm1pbiAoY2FsbCBieSByZWZlcmVuY2UpCiAgICAgICAgICAgICAgYm1heCAgICAgICAgICAtIGludCBwb2ludGVyIHRvIGJtYXggKGNhbGwgYnkgcmVmZXJlbmNlKQogICAgICBub3QgbW9kaWZpZWQ6CiAgICAgICAgICAgICAgdHJhbiAgICAgICAgICAtIHBvc2l0aW9uIG9mIHRyYW5zaWVudAogICAgICAgICAgICAgIHZfdHVuaW5nU2VnbSAgLSBpbnQgcG9pbnRlciB0byB2X3R1bmluZ1NlZ20gdmVjdG9yCiAgICAgICAgICAgICAgdl90dW5pbmdGcmVxICAtIGludCBwb2ludGVyIHRvIHZfdHVuaW5nRnJlcSB2ZWN0b3IKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZmlsbEZyYW1lVHJhbiAoY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgc2VnbWVudCBsZW5ndGhzICovCiAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCiAgICAgICAgICAgICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBib3JkZXJzICovCiAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KICAgICAgICAgICAgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgKQp7CiAgaW50IGJvcmQsIGk7CgogICpsZW5ndGhfdl9ib3JkID0gMDsKICAqbGVuZ3RoX3ZfZnJlcSA9IDA7CgogIC8qIGFkZCBhdHRhY2sgZW52IGxlYWRpbmcgYm9yZGVyIChvcHRpb25hbCkgKi8KICBpZiAodl90dW5pbmdTZWdtWzBdKSB7CiAgICAvKiB2X2JvcmQgPSBbKEJhKV0gc3RhcnQgb2YgYXR0YWNrIGVudiAqLwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsICh0cmFuIC0gdl90dW5pbmdTZWdtWzBdKSk7CgogICAgLyogdl9mcmVxID0gWyhGYSldIHJlcyBvZiBhdHRhY2sgZW52ICovCiAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzBdKTsKICB9CgogIC8qIGFkZCBhdHRhY2sgZW52IHRyYWlsaW5nIGJvcmRlci9maXJzdCBkZWNheSBlbnYgbGVhZGluZyBib3JkZXIgKi8KICBib3JkID0gdHJhbjsKICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhbik7ICAgLyogdl9ib3JkID0gWyhCYSksQmQxXSAqLwoKICAvKiBhZGQgZmlyc3QgZGVjYXkgZW52IHRyYWlsaW5nIGJvcmRlci8yOm5kIGRlY2F5IGVudiBsZWFkaW5nIGJvcmRlciAqLwogIGlmICh2X3R1bmluZ1NlZ21bMV0pIHsKICAgIGJvcmQgKz0gdl90dW5pbmdTZWdtWzFdOwoKICAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMSxCZDJdICovCiAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CgogICAgLyogdl9mcmVxID0gWyhGYSksRmQxXSAqLwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVsxXSk7CiAgfQoKICAvKiBhZGQgMjpuZCBkZWNheSBlbnYgdHJhaWxpbmcgYm9yZGVyIChvcHRpb25hbCkgKi8KICBpZiAodl90dW5pbmdTZWdtWzJdICE9IDApIHsKICAgIGJvcmQgKz0gdl90dW5pbmdTZWdtWzJdOwoKICAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMSwgQmQyLChCZDMpXSAqLwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOwoKICAgIC8qIHZfZnJlcSA9IFsoRmEpLEZkMSwoRmQyKV0gKi8KICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMl0pOwogIH0KCiAgLyogIHZfZnJlcSA9IFsoRmEpLEZkMSwoRmQyKSwxXSAqLwogIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKCgogIC8qICBjYWxjIG1pbiBhbmQgbWF4IHZhbHVlcyBvZiBtYW5kYXRvcnkgYm9yZGVycyAqLwogICpibWluID0gdl9ib3JkWzBdOwogIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZDsgaSsrKQogICAgaWYgKHZfYm9yZFtpXSA8ICpibWluKQogICAgICAqYm1pbiA9IHZfYm9yZFtpXTsKCiAgKmJtYXggPSB2X2JvcmRbMF07CiAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCiAgICBpZiAodl9ib3JkW2ldID4gKmJtYXgpCiAgICAgICpibWF4ID0gdl9ib3JkW2ldOwoKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lUHJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246IEFkZCBib3JkZXJzIGJlZm9yZSBtYW5kYXRvcnkgYm9yZGVycywgaWYgbmVlZGVkCgogQXJndW1lbnRzOgogICAgICAgbW9kaWZpZWQ6CiAgICAgICAgICAgICAgdl9ib3JkICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfYm9yZCB2ZWN0b3IKICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkIC0gbGVuZ3RoIG9mIHZfYm9yZCB2ZWN0b3IKICAgICAgICAgICAgICB2X2ZyZXEgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9mcmVxIHZlY3RvcgogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEgLSBsZW5ndGggb2Ygdl9mcmVxIHZlY3RvcgogICAgICAgbm90IG1vZGlmaWVkOgogICAgICAgICAgICAgIGRtYXggICAgICAgICAgLSBpbnQgdmFsdWUKICAgICAgICAgICAgICBibWluICAgICAgICAgIC0gaW50IHZhbHVlCiAgICAgICAgICAgICAgcmVzdCAgICAgICAgICAtIGludCB2YWx1ZQoKIFJldHVybjogICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApmaWxsRnJhbWVQcmUgKElOVCBkbWF4LAogICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKICAgICAgICAgICAgICBJTlQgYm1pbiwgSU5UIHJlc3QpCnsKICAvKgogICAgaW5wdXQgc3RhdGU6CiAgICB2X2JvcmQgPSBbKEJhKSxCZDEsIEJkMiAsKEJkMyldCiAgICB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMiksMSBdCiAgKi8KCiAgSU5UIHBhcnRzLCBkLCBqLCBTLCBzID0gMCwgc2VnbSwgYm9yZDsKCiAgLyoKICAgIHN0YXJ0IHdpdGggb25lIGVudmVsb3BlCiAgKi8KCiAgcGFydHMgPSAxOwogIGQgPSByZXN0OwoKICAvKgogICAgY2FsYyAjIG9mIGFkZGl0aW9uYWwgZW52ZWxvcGVzIGFuZCBjb3JyZXNwb25kaW5nIGxlbmd0aHMKICAqLwoKICB3aGlsZSAoZCA+IGRtYXgpIHsKICAgIHBhcnRzKys7CgogICAgc2VnbSA9IHJlc3QgLyBwYXJ0czsKICAgIFMgPSAoc2VnbSAtIDIpPj4xOwogICAgcyA9IGZpeE1pbiAoOCwgMiAqIFMgKyAyKTsKICAgIGQgPSByZXN0IC0gKHBhcnRzIC0gMSkgKiBzOwogIH0KCiAgLyoKICAgIGFkZCBib3JkZXJzIGJlZm9yZSBtYW5kYXRvcnkgYm9yZGVycwogICovCgogIGJvcmQgPSBibWluOwoKICBmb3IgKGogPSAwOyBqIDw9IHBhcnRzIC0gMjsgaisrKSB7CiAgICBib3JkID0gYm9yZCAtIHM7CgogICAgLyogdl9ib3JkID0gWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpXSAqLwogICAgRkRLc2JyRW5jX0FkZExlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CgogICAgLyogdl9mcmVxID0gWy4uLiwoMSApLChGYSksRmQxLChGZDIpLCAxICAgXSAqLwogICAgRkRLc2JyRW5jX0FkZExlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgT3ZlcmxhcCBjb250cm9sCgogIENhbGN1bGF0ZSBtYXggbGVuZ3RoIG9mIHRyYWlsaW5nIGZpbGwgc2VnbWVudHMsIHN1Y2ggdGhhdCB3ZSBhbHdheXMgZ2V0IGEKICBib3JkZXIgd2l0aGluIHRoZSBmcmFtZSBvdmVybGFwIHJlZ2lvbgoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLwogICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cyAgIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCiAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgZm1heDsKCiAgLyoKICAgIGNhbGN1bGF0ZSB0cmFuc2llbnQgcG9zaXRpb24gd2l0aGluIGVudmVsb3BlIGJ1ZmZlcgogICovCiAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpCiAgewogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgogICAgICAgIGlmICh0cmFuUG9zIDwgNCkKICAgICAgICAgIGZtYXggPSA2OwogICAgICAgIGVsc2UgaWYgKHRyYW5Qb3MgPT0gNCB8fCB0cmFuUG9zID09IDUpCiAgICAgICAgICBmbWF4ID0gNDsKICAgICAgICBlbHNlCiAgICAgICAgICBmbWF4ID0gODsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CiAgICAgICAgaWYgKHRyYW5Qb3MgPCA0KQogICAgICAgICAgZm1heCA9IDU7CiAgICAgICAgZWxzZSBpZiAodHJhblBvcyA9PSA0IHx8IHRyYW5Qb3MgPT0gNSkKICAgICAgICAgIGZtYXggPSAzOwogICAgICAgIGVsc2UKICAgICAgICAgIGZtYXggPSA3OwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgZm1heCA9IDg7CiAgICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gZm1heDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZVBvc3QKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogLUFkZCBib3JkZXJzIGFmdGVyIG1hbmRhdG9yeSBib3JkZXJzLCBpZiBuZWVkZWQKICAgICAgICAgICAgICAgTWFrZSBhIHByZWxpbWluYXJ5IGRlc2lnbiBvZiBuZXh0IGZyYW1lLAogICAgICAgICAgICAgICBhc3N1bWluZyBubyB0cmFuc2llbnQgaXMgcHJlc2VudCB0aGVyZQoKIEFyZ3VtZW50czoKICAgICAgIG1vZGlmaWVkOgogICAgICAgICAgICAgIHBhcnRzICAgICAgICAgLSBpbnQgcG9pbnRlciB0byBwYXJ0cyAoY2FsbCBieSByZWZlcmVuY2UpCiAgICAgICAgICAgICAgZCAgICAgICAgICAgICAtIGludCBwb2ludGVyIHRvIGQgKGNhbGwgYnkgcmVmZXJlbmNlKQogICAgICAgICAgICAgIHZfYm9yZCAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCAtIGxlbmd0aCBvZiB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgdl9mcmVxICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfZnJlcSB2ZWN0b3IKICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxIC0gbGVuZ3RoIG9mIHZfZnJlcSB2ZWN0b3IKICAgICAgICBub3QgbW9kaWZpZWQ6CiAgICAgICAgICAgICAgYm1heCAgICAgICAgICAtIGludCB2YWx1ZQogICAgICAgICAgICAgIGRtYXggICAgICAgICAgLSBpbnQgdmFsdWUKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZmlsbEZyYW1lUG9zdCAoSU5UICpwYXJ0cywgSU5UICpkLCBJTlQgZG1heCwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKICAgICAgICAgICAgICAgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtYXgsCiAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzLCBJTlQgZm1heCkKewogIElOVCBqLCByZXN0LCBzZWdtLCBTLCBzID0gMCwgYm9yZDsKCiAgLyoKICAgIGlucHV0IHN0YXRlOgogICAgdl9ib3JkID0gWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpXQogICAgdl9mcmVxID0gWy4uLiwoMSApLChGYSksRmQxLChGZDIpLDEgICAgXQogICovCgogIHJlc3QgPSBidWZmZXJGcmFtZVN0YXJ0ICsgMiAqIG51bWJlclRpbWVTbG90cyAtIGJtYXg7CiAgKmQgPSByZXN0OwoKICBpZiAoKmQgPiAwKSB7CiAgICAqcGFydHMgPSAxOyAgICAgICAgICAgLyogc3RhcnQgd2l0aCBvbmUgZW52ZWxvcGUgKi8KCiAgICAvKiBjYWxjICMgb2YgYWRkaXRpb25hbCBlbnZlbG9wZXMgYW5kIGNvcnJlc3BvbmRpbmcgbGVuZ3RocyAqLwoKICAgIHdoaWxlICgqZCA+IGRtYXgpIHsKICAgICAgKnBhcnRzID0gKnBhcnRzICsgMTsKCiAgICAgIHNlZ20gPSByZXN0IC8gKCpwYXJ0cyk7CiAgICAgIFMgPSAoc2VnbSAtIDIpPj4xOwogICAgICBzID0gZml4TWluIChmbWF4LCAyICogUyArIDIpOwogICAgICAqZCA9IHJlc3QgLSAoKnBhcnRzIC0gMSkgKiBzOwogICAgfQoKICAgIC8qIGFkZCBib3JkZXJzIGFmdGVyIG1hbmRhdG9yeSBib3JkZXJzICovCgogICAgYm9yZCA9IGJtYXg7CiAgICBmb3IgKGogPSAwOyBqIDw9ICpwYXJ0cyAtIDI7IGorKykgewogICAgICBib3JkICs9IHM7CgogICAgICAvKiB2X2JvcmQgPSAgWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpLChCZildICovCiAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKCiAgICAgIC8qIHZfZnJlcSA9ICBbLi4uLCgxICksKEZhKSxGZDEsKEZkMiksIDEgICAsIDEhICwxXSAqLwogICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CiAgICB9CiAgfQogIGVsc2UgewogICAgKnBhcnRzID0gMTsKCiAgICAvKiByZW1vdmUgbGFzdCBlbGVtZW50IGZyb20gdl9ib3JkIGFuZCB2X2ZyZXEgKi8KCiAgICAqbGVuZ3RoX3ZfYm9yZCA9ICpsZW5ndGhfdl9ib3JkIC0gMTsKICAgICpsZW5ndGhfdl9mcmVxID0gKmxlbmd0aF92X2ZyZXEgLSAxOwoKICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZUludGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgIG5MICAgICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgIHZfdHVuaW5nU2VnbSAgICAgICAgLQogICAgICAgICAgICAgIHZfYm9yZCAgICAgICAgICAgICAgLQogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQgICAgICAgLQogICAgICAgICAgICAgIGJtaW4gICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgIHZfZnJlcSAgICAgICAgICAgICAgLQogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEgICAgICAgLQogICAgICAgICAgICAgIHZfYm9yZEZvbGxvdyAgICAgICAgLQogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3cgLQogICAgICAgICAgICAgIHZfZnJlcUZvbGxvdyAgICAgICAgLQogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3cgLQogICAgICAgICAgICAgIGlfZmlsbEZvbGxvdyAgICAgICAgLQogICAgICAgICAgICAgIGRtaW4gICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgIGRtYXggICAgICAgICAgICAgICAgLQoKIFJldHVybjogICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApmaWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICBJTlQgYm1pbiwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICp2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csIElOVCAqdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LCBJTlQgZG1pbiwKICAgICAgICAgICAgICAgIElOVCBkbWF4LCBJTlQgbnVtYmVyVGltZVNsb3RzKQp7CiAgSU5UIG1pZGRsZSwgYl9uZXcsIG51bUJvcmRGb2xsb3csIGJvcmRNYXhGb2xsb3csIGk7CgogIGlmIChudW1iZXJUaW1lU2xvdHMgIT0gTlVNQkVSX1RJTUVfU0xPVFNfMTE1MikgewoKICAgIC8qICUgcmVtb3ZlIGZpbGwgYm9yZGVyczogKi8KICAgIGlmIChpX2ZpbGxGb2xsb3cgPj0gMSkgewogICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IGlfZmlsbEZvbGxvdzsKICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSBpX2ZpbGxGb2xsb3c7CiAgICB9CgogICAgbnVtQm9yZEZvbGxvdyA9ICpsZW5ndGhfdl9ib3JkRm9sbG93OwogICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CgogICAgLyogcmVtb3ZlIGV2ZW4gbW9yZSBib3JkZXJzIGlmIG5lZWRlZCAqLwogICAgbWlkZGxlID0gYm1pbiAtIGJvcmRNYXhGb2xsb3c7CiAgICB3aGlsZSAobWlkZGxlIDwgMCkgewogICAgICBudW1Cb3JkRm9sbG93LS07CiAgICAgIGJvcmRNYXhGb2xsb3cgPSB2X2JvcmRGb2xsb3dbbnVtQm9yZEZvbGxvdyAtIDFdOwogICAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKICAgIH0KCiAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CiAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CiAgICAqbkwgPSBudW1Cb3JkRm9sbG93IC0gMTsKCiAgICBiX25ldyA9ICpsZW5ndGhfdl9ib3JkOwoKCiAgICBpZiAobWlkZGxlIDw9IGRtYXgpIHsKICAgICAgaWYgKG1pZGRsZSA+PSBkbWluKSB7ICAgICAgIC8qIGNvbmNhdGVuYXRlICovCiAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIGlmICh2X3R1bmluZ1NlZ21bMF0gIT0gMCkgeyAgICAgICAvKiByZW1vdmUgb25lIG5ldyBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCiAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CgogICAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CiAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPiAxKSB7IC8qIHJlbW92ZSBvbmUgb2xkIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAogICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKCiAgICAgICAgICAgICpuTCA9ICpuTCAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbmV3ICJ0cmFuc2llbnQiIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykKICAgICAgICAgICAgICB2X2JvcmRbaV0gPSB2X2JvcmRbaSArIDFdOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9mcmVxIC0gMTsgaSsrKQogICAgICAgICAgICAgIHZfZnJlcVtpXSA9IHZfZnJlcVtpICsgMV07CgogICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CgogICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pZGRsZSA+IGRtYXggKi8KCiAgICAgIGZpbGxGcmFtZVByZSAoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCiAgICAgICAgICBtaWRkbGUpOwogICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICB9CgoKICB9CiAgZWxzZSB7IC8qIG51bWJlclRpbWVTbG90cz09TlVNQkVSX1RJTUVfU0xPVFNfMTE1MiAqLwoKICAgIElOVCBsLG07CgoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIHJlbW92ZSBmaWxsIGJvcmRlcnMKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChpX2ZpbGxGb2xsb3cgPj0gMSkgewogICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IGlfZmlsbEZvbGxvdzsKICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSBpX2ZpbGxGb2xsb3c7CiAgICB9CgogICAgbnVtQm9yZEZvbGxvdyA9ICpsZW5ndGhfdl9ib3JkRm9sbG93OwogICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgcmVtb3ZlIG1vcmUgYm9yZGVycyBpZiBuZWNlc3NhcnkgdG8gZWxpbWluYXRlIG92ZXJsYXAKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvKiBjaGVjayBmb3Igb3ZlcmxhcCAqLwogICAgbWlkZGxlID0gYm1pbiAtIGJvcmRNYXhGb2xsb3c7CgogICAgLyogaW50ZXJ2YWxzOgogICAgICAgaSkgICAgICAgICAgICAgbWlkZGxlIDwgIDAgICAgIDogb3ZlcmxhcCwgbXVzdCByZW1vdmUgYm9yZGVycwogICAgICAgaWkpICAgICAgIDAgPD0gbWlkZGxlIDwgIGRtaW4gIDogbm8gb3ZlcmxhcCBidXQgdG9vIHRpZ2h0LCBtdXN0IHJlbW92ZSBib3JkZXJzCiAgICAgICBpaWkpICAgZG1pbiA8PSBtaWRkbGUgPD0gZG1heCAgOiBvaywganVzdCBjb25jYXRlbmF0ZQogICAgICAgaXYpICAgIGRtYXggPD0gbWlkZGxlICAgICAgICAgIDogdG9vIHdpZGUsIG11c3QgYWRkIGJvcmRlcnMKICAgICAqLwoKICAgIC8qIGZpcnN0IHJlbW92ZSBvbGQgbm9uLWZpbGwtYm9yZGVycy4uLiAqLwogICAgd2hpbGUgKG1pZGRsZSA8IDApIHsKCiAgICAgIC8qIC4uLmJ1dCBkb24ndCByZW1vdmUgYWxsIG9mIHRoZW0gKi8KICAgICAgaWYgKG51bUJvcmRGb2xsb3cgPT0gMSkKICAgICAgICBicmVhazsKCiAgICAgIG51bUJvcmRGb2xsb3ctLTsKICAgICAgYm9yZE1heEZvbGxvdyA9IHZfYm9yZEZvbGxvd1tudW1Cb3JkRm9sbG93IC0gMV07CiAgICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OwogICAgfQoKICAgIC8qIGlmIHRoaXMgaXNuJ3QgZW5vdWdoLCByZW1vdmUgbmV3IG5vbi1maWxsIGJvcmRlcnMgKi8KICAgIGlmIChtaWRkbGUgPCAwKQogICAgewogICAgICBmb3IgKGwgPSAwLCBtID0gMCA7IGwgPCAqbGVuZ3RoX3ZfYm9yZCA7IGwrKykKICAgICAgewogICAgICAgIGlmKHZfYm9yZFtsXT4gYm9yZE1heEZvbGxvdykKICAgICAgICB7CiAgICAgICAgICB2X2JvcmRbbV0gPSB2X2JvcmRbbF07CiAgICAgICAgICB2X2ZyZXFbbV0gPSB2X2ZyZXFbbF07CiAgICAgICAgICBtKys7CiAgICAgICAgfQogICAgICB9CgogICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGw7CiAgICAgICpsZW5ndGhfdl9mcmVxID0gbDsKCiAgICAgIGJtaW4gPSB2X2JvcmRbMF07CgogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIHVwZGF0ZSBtb2RpZmllZCBmb2xsb3ctdXAgZGF0YQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICpsZW5ndGhfdl9ib3JkRm9sbG93ID0gbnVtQm9yZEZvbGxvdzsKICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gbnVtQm9yZEZvbGxvdzsKCiAgICAvKiBsZWZ0IHJlbGF0aXZlIGJvcmRlcnMgY29ycmVzcG9uZCB0byBmb2xsb3ctdXAgKi8KICAgICpuTCA9IG51bUJvcmRGb2xsb3cgLSAxOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIHRha2UgY2FyZSBvZiBpbnRlcnZhbHMgaWkgdGhyb3VnaCBpdgogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIC8qIG5vdyBtaWRkbGUgc2hvdWxkIGJlID49IDAgKi8KICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OwoKICAgIGlmIChtaWRkbGUgPD0gZG1pbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpaSkgKi8KICAgIHsKICAgICAgYl9uZXcgPSAqbGVuZ3RoX3ZfYm9yZDsKCiAgICAgIGlmICh2X3R1bmluZ1NlZ21bMF0gIT0gMCkKICAgICAgewogICAgICAgIC8qIHJlbW92ZSBuZXcgImx1eHVyeSIgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgICpsZW5ndGhfdl9ib3JkID0gYl9uZXcgLSAxOwogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwoKICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CgogICAgICB9CiAgICAgIGVsc2UgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4gMSkKICAgICAgewogICAgICAgIC8qIHJlbW92ZSBvbGQgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCiAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CgogICAgICAgICpuTCA9ICpuTCAtIDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogcmVtb3ZlIG5ldyBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkIC0gMTsgaSsrKQogICAgICAgICAgdl9ib3JkW2ldID0gdl9ib3JkW2kgKyAxXTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9mcmVxIC0gMTsgaSsrKQogICAgICAgICAgdl9mcmVxW2ldID0gdl9mcmVxW2kgKyAxXTsKCiAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CiAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CgogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgobWlkZGxlID49IGRtaW4pICYmIChtaWRkbGUgPD0gZG1heCkpICAgICAgLyogKGlpaSkgKi8KICAgIHsKICAgICAgLyogY29uY2F0ZW5hdGUgKi8KICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwoKICAgIH0KICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaXYpICovCiAgICB7CiAgICAgIGZpbGxGcmFtZVByZSAoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCiAgICAgICAgICBtaWRkbGUpOwogICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICB9CiAgfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBjYWxjRnJhbWVDbGFzcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogIElOVCogZnJhbWVDbGFzcywgSU5UKiBmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsIElOVCogc3ByZWFkRmxhZykKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY2FsY0ZyYW1lQ2xhc3MgKEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzLCBGUkFNRV9DTEFTUyAqZnJhbWVDbGFzc09sZCwgSU5UIHRyYW5GbGFnLAogICAgICAgICAgICAgICAgSU5UICpzcHJlYWRGbGFnKQp7CgogIHN3aXRjaCAoKmZyYW1lQ2xhc3NPbGQpIHsKICBjYXNlIEZJWEZJWG9ubHk6CiAgY2FzZSBGSVhGSVg6CiAgICBpZiAodHJhbkZsYWcpICAqZnJhbWVDbGFzcyA9IEZJWFZBUjsKICAgIGVsc2UgICAgICAgICAgICpmcmFtZUNsYXNzID0gRklYRklYOwogICAgYnJlYWs7CiAgY2FzZSBGSVhWQVI6CiAgICBpZiAodHJhbkZsYWcpIHsgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7ICpzcHJlYWRGbGFnID0gMDsgfQogICAgZWxzZSB7CiAgICAgIGlmICgqc3ByZWFkRmxhZykgICpmcmFtZUNsYXNzID0gVkFSVkFSOwogICAgICBlbHNlICAgICAgICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUkZJWDsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgVkFSRklYOgogICAgaWYgKHRyYW5GbGFnKSAgKmZyYW1lQ2xhc3MgPSBGSVhWQVI7CiAgICBlbHNlICAgICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWEZJWDsKICAgIGJyZWFrOwogIGNhc2UgVkFSVkFSOgogICAgaWYgKHRyYW5GbGFnKSB7ICpmcmFtZUNsYXNzID0gVkFSVkFSOyAqc3ByZWFkRmxhZyA9IDA7IH0KICAgIGVsc2UgewogICAgICBpZiAoKnNwcmVhZEZsYWcpICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKICAgICAgZWxzZSAgICAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CiAgICB9CiAgICBicmVhazsKICB9OwoKICAqZnJhbWVDbGFzc09sZCA9ICpmcmFtZUNsYXNzOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBzcGVjaWFsQ2FzZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogICBzcHJlYWRGbGFnCiAgICAgICAgICAgICAgYWxsb3dTcHJlYWQKICAgICAgICAgICAgICB2X2JvcmQKICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkCiAgICAgICAgICAgICAgdl9mcmVxCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcQogICAgICAgICAgICAgIHBhcnRzCiAgICAgICAgICAgICAgZAoKIFJldHVybjogICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApzcGVjaWFsQ2FzZSAoSU5UICpzcHJlYWRGbGFnLCBJTlQgYWxsb3dTcHJlYWQsIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgKnBhcnRzLAogICAgICAgICAgICAgSU5UIGQpCnsKICBJTlQgTDsKCiAgTCA9ICpsZW5ndGhfdl9ib3JkOwoKICBpZiAoYWxsb3dTcHJlYWQpIHsgICAgICAgICAgICAvKiBhZGQgb25lICJzdGVwIDgiICovCiAgICAqc3ByZWFkRmxhZyA9IDE7CiAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkW0wgLSAxXSArIDgpOwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogICAgKCpwYXJ0cykrKzsKICB9CiAgZWxzZSB7CiAgICBpZiAoZCA9PSAxKSB7ICAgICAgICAgICAgICAgLyogIHN0cmV0Y2ggb25lIHNsb3QgKi8KICAgICAgKmxlbmd0aF92X2JvcmQgPSBMIC0gMTsKICAgICAgKmxlbmd0aF92X2ZyZXEgPSBMIC0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAoKHZfYm9yZFtMIC0gMV0gLSB2X2JvcmRbTCAtIDJdKSA+IDIpIHsgICAgICAgIC8qIGNvbXByZXNzIG9uZSBxdWFudCBzdGVwICovCiAgICAgICAgdl9ib3JkW0wgLSAxXSA9IHZfYm9yZFtMIC0gMV0gLSAyOwogICAgICAgIHZfZnJlcVsqbGVuZ3RoX3ZfZnJlcSAtIDFdID0gMDsgLyogdXNlIGxvdyByZXMgZm9yIHNob3J0IHNlZ21lbnQgKi8KICAgICAgfQogICAgfQogIH0KfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgY2FsY0Ntb25Cb3JkZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgaV9jbW9uCiAgICAgICAgICAgICAgaV90cmFuCiAgICAgICAgICAgICAgdl9ib3JkCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAogICAgICAgICAgICAgIHRyYW4KCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY2FsY0Ntb25Cb3JkZXIgKElOVCAqaV9jbW9uLCBJTlQgKmlfdHJhbiwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKICAgICAgICAgICAgICAgIElOVCB0cmFuLCBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cykKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSCAwMC0wNi0yNiAqLwogIElOVCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKICAgIGlmICh2X2JvcmRbaV0gPj0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cykgeyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAgICAgICppX2Ntb24gPSBpOwogICAgICBicmVhazsKICAgIH0KCiAgLyoga2VlcCB0cmFjayBvZiB0cmFuc2llbnQ6ICovCiAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCiAgICBpZiAodl9ib3JkW2ldID49IHRyYW4pIHsKICAgICAgKmlfdHJhbiA9IGk7CiAgICAgIGJyZWFrOwogICAgfQogICAgZWxzZQogICAgICAqaV90cmFuID0gRU1QVFk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBrZWVwRm9yRm9sbG93VXAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgdl9ib3JkRm9sbG93CiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZEZvbGxvdwogICAgICAgICAgICAgIHZfZnJlcUZvbGxvdwogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3cKICAgICAgICAgICAgICBpX3RyYW5Gb2xsb3cKICAgICAgICAgICAgICBpX2ZpbGxGb2xsb3cKICAgICAgICAgICAgICB2X2JvcmQKICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkCiAgICAgICAgICAgICAgdl9mcmVxCiAgICAgICAgICAgICAgaV9jbW9uCiAgICAgICAgICAgICAgaV90cmFuCiAgICAgICAgICAgICAgcGFydHMpCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmtlZXBGb3JGb2xsb3dVcCAoSU5UICp2X2JvcmRGb2xsb3csIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywgSU5UICp2X2JvcmQsCiAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKICAgICAgICAgICAgICAgICBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkggMDAtMDYtMjYgKi8KICBJTlQgTCwgaSwgajsKCiAgTCA9ICpsZW5ndGhfdl9ib3JkOwoKICAoKmxlbmd0aF92X2JvcmRGb2xsb3cpID0gMDsKICAoKmxlbmd0aF92X2ZyZXFGb2xsb3cpID0gMDsKCiAgZm9yIChqID0gMCwgaSA9IGlfY21vbjsgaSA8IEw7IGkrKywgaisrKSB7CiAgICB2X2JvcmRGb2xsb3dbal0gPSB2X2JvcmRbaV0gLSBudW1iZXJUaW1lU2xvdHM7ICAgICAgLyogRkggMDAtMDYtMjYgKi8KICAgIHZfZnJlcUZvbGxvd1tqXSA9IHZfZnJlcVtpXTsKICAgICgqbGVuZ3RoX3ZfYm9yZEZvbGxvdykrKzsKICAgICgqbGVuZ3RoX3ZfZnJlcUZvbGxvdykrKzsKICB9CiAgaWYgKGlfdHJhbiAhPSBFTVBUWSkKICAgICppX3RyYW5Gb2xsb3cgPSBpX3RyYW4gLSBpX2Ntb247CiAgZWxzZQogICAgKmlfdHJhbkZvbGxvdyA9IEVNUFRZOwogICppX2ZpbGxGb2xsb3cgPSBMIC0gKHBhcnRzIC0gMSkgLSBpX2Ntb247Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgY2FsY0N0cmxTaWduYWwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgaFNickdyaWQKICAgICAgICAgICAgICBmcmFtZUNsYXNzCiAgICAgICAgICAgICAgdl9ib3JkCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAogICAgICAgICAgICAgIHZfZnJlcQogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEKICAgICAgICAgICAgICBpX2Ntb24KICAgICAgICAgICAgICBpX3RyYW4KICAgICAgICAgICAgICBzcHJlYWRGbGFnCiAgICAgICAgICAgICAgbkwKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY2FsY0N0cmxTaWduYWwgKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKICAgICAgICAgICAgICAgIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MsIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwgSU5UIHNwcmVhZEZsYWcsCiAgICAgICAgICAgICAgICBJTlQgbkwpCnsKCgogIElOVCBpLCByLCBhLCBuLCBwLCBiLCBhTCwgYVIsIG50b3QsIG5tYXgsIG5SOwoKICBJTlQgKnZfZiA9IGhTYnJHcmlkLT52X2Y7CiAgSU5UICp2X2ZMUiA9IGhTYnJHcmlkLT52X2ZMUjsKICBJTlQgKnZfciA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZDsKICBJTlQgKnZfckwgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMDsKICBJTlQgKnZfclIgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMTsKCiAgSU5UIGxlbmd0aF92X3IgPSAwOwogIElOVCBsZW5ndGhfdl9yUiA9IDA7CiAgSU5UIGxlbmd0aF92X3JMID0gMDsKCiAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CiAgY2FzZSBGSVhWQVI6CiAgICAvKiBhYnNvbHV0ZSBib3JkZXI6ICovCgogICAgYSA9IHZfYm9yZFtpX2Ntb25dOwoKICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCiAgICBsZW5ndGhfdl9yID0gMDsKICAgIGkgPSBpX2Ntb247CgogICAgd2hpbGUgKGkgPj0gMSkgewogICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3IsICZsZW5ndGhfdl9yLCByKTsKICAgICAgaS0tOwogICAgfQoKCiAgICAvKiAgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICovCiAgICBuID0gbGVuZ3RoX3ZfcjsKCgogICAgLyogZnJlcSByZXM6ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgaV9jbW9uOyBpKyspCiAgICAgIHZfZltpXSA9IHZfZnJlcVtpX2Ntb24gLSAxIC0gaV07CiAgICB2X2ZbaV9jbW9uXSA9IDE7CgogICAgLyogcG9pbnRlcjogKi8KICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApIDsKCiAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CiAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOwogICAgaFNickdyaWQtPm4gPSBuOwogICAgaFNickdyaWQtPnAgPSBwOwoKICAgIGJyZWFrOwogIGNhc2UgVkFSRklYOgogICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLwogICAgYSA9IHZfYm9yZFswXTsKCiAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwogICAgbGVuZ3RoX3ZfciA9IDA7CgogICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aF92X2JvcmQ7IGkrKykgewogICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3IsICZsZW5ndGhfdl9yLCByKTsKICAgIH0KCiAgICAvKiBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogKi8KICAgIG4gPSBsZW5ndGhfdl9yOwoKICAgIC8qIGZyZXEgcmVzOiAqLwogICAgRkRLbWVtY3B5ICh2X2YsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSAqIHNpemVvZiAoSU5UKSk7CgoKICAgIC8qIHBvaW50ZXI6ICovCiAgICBwID0gKGlfdHJhbiA+PSAwICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV90cmFuICsgMSkgOiAoMCkgOwoKICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IGE7CiAgICBoU2JyR3JpZC0+biA9IG47CiAgICBoU2JyR3JpZC0+cCA9IHA7CgogICAgYnJlYWs7CiAgY2FzZSBWQVJWQVI6CiAgICBpZiAoc3ByZWFkRmxhZykgewogICAgICAvKiBhYnNvbHV0ZSBib3JkZXJzOiAqLwogICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKCiAgICAgIGFMID0gdl9ib3JkWzBdOwogICAgICBhUiA9IHZfYm9yZFtiIC0gMV07CgoKICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgICovCiAgICAgIG50b3QgPSBiIC0gMjsKCiAgICAgIG5tYXggPSAyOyAgICAgICAgICAgICAgICAgLyogbjogezAsMSwyfSAqLwogICAgICBpZiAobnRvdCA+IG5tYXgpIHsKICAgICAgICBuTCA9IG5tYXg7CiAgICAgICAgblIgPSBudG90IC0gbm1heDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBuTCA9IG50b3Q7CiAgICAgICAgblIgPSAwOwogICAgICB9CgogICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwogICAgICBsZW5ndGhfdl9yTCA9IDA7CiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgewogICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwogICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yTCwgJmxlbmd0aF92X3JMLCByKTsKICAgICAgfQoKICAgICAgbGVuZ3RoX3ZfclIgPSAwOwogICAgICBpID0gYiAtIDE7CiAgICAgIHdoaWxlIChpID49IGIgLSBuUikgewogICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwogICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKICAgICAgICBpLS07CiAgICAgIH0KCiAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLwogICAgICBwID0gKGlfdHJhbiA+IDAgJiYgaV90cmFuICE9IEVNUFRZKSA/IChiIC0gaV90cmFuKSA6ICgwKSA7CgogICAgICAvKiBmcmVxIHJlczogKi8KCiAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKQogICAgICAgIHZfZkxSW2ldID0gdl9mcmVxW2ldOwogICAgfQogICAgZWxzZSB7CgogICAgICBsZW5ndGhfdl9ib3JkID0gaV9jbW9uICsgMTsKICAgICAgbGVuZ3RoX3ZfZnJlcSA9IGlfY21vbiArIDE7CgoKICAgICAgLyogYWJzb2x1dGUgYm9yZGVyczogKi8KICAgICAgYiA9IGxlbmd0aF92X2JvcmQ7CgogICAgICBhTCA9IHZfYm9yZFswXTsKICAgICAgYVIgPSB2X2JvcmRbYiAtIDFdOwoKICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgKi8KICAgICAgbnRvdCA9IGIgLSAyOwogICAgICBuUiA9IG50b3QgLSBuTDsKCiAgICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCiAgICAgIGxlbmd0aF92X3JMID0gMDsKICAgICAgZm9yIChpID0gMTsgaSA8PSBuTDsgaSsrKSB7CiAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CiAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JMLCAmbGVuZ3RoX3ZfckwsIHIpOwogICAgICB9CgogICAgICBsZW5ndGhfdl9yUiA9IDA7CiAgICAgIGkgPSBiIC0gMTsKICAgICAgd2hpbGUgKGkgPj0gYiAtIG5SKSB7CiAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CiAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JSLCAmbGVuZ3RoX3ZfclIsIHIpOwogICAgICAgIGktLTsKICAgICAgfQoKICAgICAgLyogcG9pbnRlciAob25seSBvbmUgZHVlIHRvIGNvbnN0cmFpbnQgaW4gZnJhbWUgaW5mbyk6ICovCiAgICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApIDsKCiAgICAgIC8qIGZyZXEgcmVzOiAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgYiAtIDE7IGkrKykKICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKICAgIH0KCiAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CiAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMCA9IGFMOwogICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzEgPSBhUjsKICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzAgPSBuTDsKICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgPSBuUjsKICAgIGhTYnJHcmlkLT5wID0gcDsKCiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qIGRvIG5vdGhpbmcgKi8KICAgIGJyZWFrOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGNyZWF0ZURlZkZyYW1lSW5mbwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOiBDb3BpZXMgdGhlIGRlZmF1bHQgKHN0YXRpYykgZnJhbWVJbmZvIHN0cnVjdHMgdG8gdGhlIGZyYW1lSW5mbwogICAgICAgICAgICAgIHBhc3NlZCBieSByZWZlcmVuY2U7IG9ubHkgdXNlZCBmb3IgRklYRklYIGZyYW1lcwoKIEFyZ3VtZW50czogICBoRnJhbWVJbmZvICAgICAgICAgICAgIC0gSEFOTERFX1NCUl9GUkFNRV9JTkZPCiAgICAgICAgICAgICAgbkVudiAgICAgICAgICAgICAgICAgICAtIElOVAogICAgICAgICAgICAgIG5UaW1lU2xvdHMgICAgICAgICAgICAgLSBJTlQKCiBSZXR1cm46ICAgICAgbm9uZTsgaFNickZyYW1lSW5mbyBjb250YWlucyBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgZnJhbWVJbmZvCgogV3JpdHRlbjogICAgIEFuZHJlYXMgU2NobmVpZGVyCiBSZXZpc2VkOgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApjcmVhdGVEZWZGcmFtZUluZm8oSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sIElOVCBuRW52LCBJTlQgblRpbWVTbG90cykKewogIHN3aXRjaCAobkVudikgewogIGNhc2UgMToKICAgIHN3aXRjaCAoblRpbWVTbG90cykgewogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8xMTUyLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzIzMDQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzUxMkxELCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgMjoKICAgIHN3aXRjaCAoblRpbWVTbG90cykgewogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8xMTUyLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzIzMDQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzUxMkxELCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgNDoKICAgIHN3aXRjaCAoblRpbWVTbG90cykgewogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8xMTUyLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzIzMDQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzUxMkxELCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBGREtfQVNTRVJUKDApOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBjdHJsU2lnbmFsMkZyYW1lSW5mbwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOiBDb252ZXJ0ICJjbGVhci10ZXh0IiBzYnJfZ3JpZCgpIHRvICJmcmFtZSBpbmZvIiB1c2VkIGJ5IHRoZQogICAgICAgICAgICAgIGVudmVsb3BlIGFuZCBub2lzZSBmbG9vciBlc3RpbWF0b3JzLgogICAgICAgICAgICAgIFRoaXMgaXMgYmFzaWNhbGx5IChleGNlcHQgZm9yICJsb3cgbGV2ZWwiIGNhbGN1bGF0aW9ucykgdGhlCiAgICAgICAgICAgICAgYml0c3RyZWFtIGRlY29kZXIgZGVmaW5lZCBpbiB0aGUgTVBFRy00IHN0YW5kYXJkLCBzdWIgY2xhdXNlCiAgICAgICAgICAgICAgNC42LjE4LjMuMywgVGltZSAvIEZyZXF1ZW5jeSBHcmlkLiAgU2VlIGlubGluZSBjb21tZW50cyBmb3IKICAgICAgICAgICAgICBleHBsYW5hdGlvbiBvZiB0aGUgc2hvcnRlbiBhbmQgbm9pc2UgYm9yZGVyIGFsZ29yaXRobXMuCgogQXJndW1lbnRzOiAgIGhTYnJHcmlkIC0gc291cmNlCiAgICAgICAgICAgICAgaFNickZyYW1lSW5mbyAtIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICAgZnJlcV9yZXNfZml4Zml4IC0gZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIEZJWEZJWCBmcmFtZXMKCiBSZXR1cm46ICAgICAgdm9pZDsgaFNickZyYW1lSW5mbyBjb250YWlucyB0aGUgdXBkYXRlZCBGUkFNRV9JTkZPIHN0cnVjdAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY3RybFNpZ25hbDJGcmFtZUluZm8gKAogICAgICAgIEhBTkRMRV9TQlJfR1JJRCAgICAgICAgaFNickdyaWQsICAgICAgIC8qIGlucHV0IDogdGhlIGdyaWQgaGFuZGxlICAgICAgICovCiAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPICBoU2JyRnJhbWVJbmZvLCAgLyogb3V0cHV0OiB0aGUgZnJhbWUgaW5mbyBoYW5kbGUgKi8KICAgICAgICBGUkVRX1JFUyAgICAgICAgICAgICAgKmZyZXFfcmVzX2ZpeGZpeCAvKiBpbi9vdXQ6IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBGSVhGSVggZnJhbWVzICovCiAgICAgICAgKQp7CiAgSU5UIGZyYW1lU3BsaXQgPSAwOwogIElOVCBuRW52ID0gMCwgYm9yZGVyID0gMCwgaSwgaywgcCAvKj8qLzsKICBJTlQgKnZfciA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZDsKICBJTlQgKnZfZiA9IGhTYnJHcmlkLT52X2Y7CgogIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MgPSBoU2JyR3JpZC0+ZnJhbWVDbGFzczsKICBJTlQgYnVmZmVyRnJhbWVTdGFydCAgID0gaFNickdyaWQtPmJ1ZmZlckZyYW1lU3RhcnQ7CiAgSU5UIG51bWJlclRpbWVTbG90cyAgICA9IGhTYnJHcmlkLT5udW1iZXJUaW1lU2xvdHM7CgogIHN3aXRjaCAoZnJhbWVDbGFzcykgewogIGNhc2UgRklYRklYOgogICAgY3JlYXRlRGVmRnJhbWVJbmZvKGhTYnJGcmFtZUluZm8sIGhTYnJHcmlkLT5ic19udW1fZW52LCBudW1iZXJUaW1lU2xvdHMpOwoKICAgIGZyYW1lU3BsaXQgPSAoaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA+IDEpOwogICAgZm9yIChpID0gMDsgaSA8IGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGkrKykgewogICAgICBoU2JyR3JpZC0+dl9mW2ldID0gaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IGZyZXFfcmVzX2ZpeGZpeFtmcmFtZVNwbGl0XTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIEZJWFZBUjoKICBjYXNlIFZBUkZJWDoKICAgIG5FbnYgPSBoU2JyR3JpZC0+biArIDE7ICAgICAgLyogcmVhZCBuIFtTQlJfTlVNX0JJVFMgYml0c10gKi8gLyo/IHNuZCovCiAgICBGREtfQVNTRVJUKG5FbnYgPD0gTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYKTsKCiAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKCiAgICBib3JkZXIgPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmQ7IC8qIHJlYWQgdGhlIGFic29sdXRlIGJvcmRlciAqLwoKICAgIGlmIChuRW52ID09IDEpCiAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7CiAgICBlbHNlCiAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CgogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKiBkbyBub3RoaW5nICovCiAgICBicmVhazsKICB9CgogIHN3aXRjaCAoZnJhbWVDbGFzcykgewogIGNhc2UgRklYVkFSOgogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJ1ZmZlckZyYW1lU3RhcnQ7IC8qIHN0YXJ0LXBvc2l0aW9uIG9mIDFzdCBlbnZlbG9wZSAqLwoKICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBib3JkZXI7CgogICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgbkVudiAtIDE7IGsrKywgaS0tKSB7CiAgICAgIGJvcmRlciAtPSB2X3Jba107CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CiAgICB9CgogICAgLyogbWFrZSBlaXRoZXIgZW52ZWxvcGUgbnIuIG5FbnYgKyAxIC0gcCBzaG9ydDsgb3IgZG9uJ3Qgc2hvcnRlbiBpZiBwID09IDAgKi8KICAgIHAgPSBoU2JyR3JpZC0+cDsKICAgIGlmIChwID09IDApIHsKICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOwogICAgfSBlbHNlIHsKICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBuRW52ICsgMSAtIHA7CiAgICB9CgogICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgbkVudjsgaysrLCBpLS0pIHsKICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IChGUkVRX1JFUyl2X2Zba107CiAgICB9CgogICAgLyogaWYgZWl0aGVyIHRoZXJlIGlzIG5vIHNob3J0IGVudmVsb3BlIG9yIHRoZSBsYXN0IGVudmVsb3BlIGlzIHNob3J0Li4uICovCiAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgewogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKICAgIH0gZWxzZSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOwogICAgfQoKICAgIGJyZWFrOwoKICBjYXNlIFZBUkZJWDoKICAgIC8qIGluIHRoaXMgY2FzZSAnYm9yZGVyJyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSAxc3QgZW52ZWxvcGUgKi8KICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7CgogICAgZm9yIChrID0gMDsgayA8IG5FbnYgLSAxOyBrKyspIHsKICAgICAgYm9yZGVyICs9IHZfcltrXTsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1trICsgMV0gPSBib3JkZXI7CiAgICB9CgogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHM7CgogICAgcCA9IGhTYnJHcmlkLT5wOwogICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOwogICAgfSBlbHNlIHsKICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBwIC0gMTsKICAgIH0KCiAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpdl9mW2tdOwogICAgfQoKICAgIHN3aXRjaCAocCkgewogICAgY2FzZSAwOgogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzFdOwogICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CiAgICAgIGJyZWFrOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgVkFSVkFSOgogICAgbkVudiA9IGhTYnJHcmlkLT5ic19udW1fcmVsXzAgKyBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xICsgMTsKICAgIEZES19BU1NFUlQobkVudiA8PSBNQVhfRU5WRUxPUEVTX1ZBUlZBUik7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLwogICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CgogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOwoKICAgIGZvciAoayA9IDAsIGkgPSAxOyBrIDwgaFNickdyaWQtPmJzX251bV9yZWxfMDsgaysrLCBpKyspIHsKICAgICAgYm9yZGVyICs9IGhTYnJHcmlkLT5ic19yZWxfYm9yZF8wW2tdOwogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOwogICAgfQoKICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOwogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJvcmRlcjsKCiAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xOyBrKyssIGktLSkgewogICAgICBib3JkZXIgLT0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzFba107CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CiAgICB9CgogICAgcCA9IGhTYnJHcmlkLT5wOwogICAgaWYgKHAgPT0gMCkgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CiAgICB9IGVsc2UgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IG5FbnYgKyAxIC0gcDsKICAgIH0KCiAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpaFNickdyaWQtPnZfZkxSW2tdOwogICAgfQoKICAgIGlmIChuRW52ID09IDEpIHsKICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOwogICAgfSBlbHNlIHsKICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7CgogICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgewogICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudiAtIDFdOwogICAgICB9IGVsc2UgewogICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOwogICAgICB9CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOwogICAgfQogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKiBkbyBub3RoaW5nICovCiAgICBicmVhazsKICB9CgogIGlmIChmcmFtZUNsYXNzID09IFZBUkZJWCB8fCBmcmFtZUNsYXNzID09IEZJWFZBUikgewogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXTsKICAgIGlmIChuRW52ID09IDEpIHsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKICAgIH0gZWxzZSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl07CiAgICB9CiAgfQp9Cgo=