Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlciwgIAogIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSB0cmFuc3Bvc2VyLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBpcyBscHBUcmFuc3Bvc2VyKCkuIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMKICBoaWdoIGZyZXF1ZW5jeSBjb250ZW50IGJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBsb3cgYmFuZCAocHJvdmlkZWQgYnkgY29yZSBjb2RlYykgaW50byB0aGUgaGlnaCBiYW5kLgogIFRoaXMgcHJvY2VzcyBpcyBhbHNvIHJlZmVycmVkIHRvIGFzICJwYXRjaGluZyIuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgc3BlY3RyYWwgd2hpdGVuaW5nIGJ5IG1lYW5zIG9mCiAgaW52ZXJzZSBmaWx0ZXJpbmcgYmFzZWQgb24gTFBDIGNvZWZmaWNpZW50cy4KCiAgVG9nZXRoZXIgd2l0aCB0aGUgUU1GIGZpbHRlcmJhbmsgdGhlIHRyYW5zcG9zZXIgY2FuIGJlIHRlc3RlZCB1c2luZyBhIHN1cHBsaWVkIHRlc3QgcHJvZ3JhbS4gU2VlIG1haW5fYXVkaW8uY3BwIGZvciBkZXRhaWxzLgogIFRoaXMgbW9kdWxlIGRvZXMgdXNlIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZSBjb21wdXRhdGlvbnMgaGFzIGFuIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LgogIFRoZSBtb2R1bGUgYWxzbyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZGlmZmVyZW50IHNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YS4KCiAgXHNhIGxwcFRyYW5zcG9zZXIoKSwgbWFpbl9hdWRpby5jcHAsIHNicl9zY2FsZS5oLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwoqLwoKI2luY2x1ZGUgImxwcF90cmFuLmgiCgojaW5jbHVkZSAic2JyX3JhbS5oIgojaW5jbHVkZSAic2JyX3JvbS5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgoKCgojaWYgZGVmaW5lZChfX2FybV9fKQojaW5jbHVkZSAiYXJtL2xwcF90cmFuX2FybS5jcHAiCiNlbmRpZgoKCgojZGVmaW5lIExQQ19TQ0FMRV9GQUNUT1IgIDIKCgovKiEKICoKICogXGJyaWVmIEdldCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciBmcm9tIGZpbHRlcmluZyBsZXZlbAogKgogKiBSZXR1cm5zIGEgZmlsdGVyIHBhcmFtZXRlciAoYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IpIGRlcGVuZGluZyBvbgogKiB0aGUgZGVzaXJlZCBmaWx0ZXJpbmcgbGV2ZWwgc2lnbmFsbGVkIGluIHRoZSBiaXRzdHJlYW0uCiAqIFdoZW4gc3dpdGNoaW5nIHRoZSBmaWx0ZXJpbmcgbGV2ZWwgZnJvbSBMT1cgdG8gT0ZGLCBhbiBhZGRpdGlvbmFsCiAqIGxldmVsIGlzIGJlaW5nIGluc2VydGVkIHRvIGFjaGlldmUgYSBzbW9vdGggdHJhbnNpdGlvbi4KICovCgojaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlCnN0YXRpYyBGSVhQX0RCTAptYXBJbnZmTW9kZSAoSU5WRl9NT0RFIG1vZGUsCiAgICAgICAgICAgICBJTlZGX01PREUgcHJldk1vZGUsCiAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpCnsKICBzd2l0Y2ggKG1vZGUpIHsKICBjYXNlIElOVkZfTE9XX0xFVkVMOgogICAgaWYocHJldk1vZGUgPT0gSU5WRl9PRkYpCiAgICAgIHJldHVybiB3aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsOwogICAgZWxzZQogICAgICByZXR1cm4gd2hGYWN0b3JzLmxvd0xldmVsOwoKICBjYXNlIElOVkZfTUlEX0xFVkVMOgogICAgcmV0dXJuIHdoRmFjdG9ycy5taWRMZXZlbDsKCiAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6CiAgICByZXR1cm4gd2hGYWN0b3JzLmhpZ2hMZXZlbDsKCiAgZGVmYXVsdDoKICAgIGlmKHByZXZNb2RlID09IElOVkZfTE9XX0xFVkVMKQogICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKICAgIGVsc2UKICAgICAgcmV0dXJuIHdoRmFjdG9ycy5vZmY7CiAgfQp9CiNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlICovCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZW1waGFzaXMKICoKICogUmV0cmlldmUgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgYW5kIGFwcGx5IHNtb290aGluZyBmb3IgZWFjaCBmaWx0ZXIgYmFuZAogKgogKi8KCiNpZm5kZWYgRlVOQ1RJT05faW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMKc3RhdGljIHZvaWQKaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYsIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBid1ZlY3RvciAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGZpbHRlcmluZyBsZXZlbHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgewogICAgRklYUF9EQkwgYWNjdTsKICAgIEZJWFBfREJMIGJ3VG1wID0gbWFwSW52Zk1vZGUgKHNicl9pbnZmX21vZGVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXZbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKCiAgICBpZihid1RtcCA8IGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjI1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjkwNjI1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CgogICAgaWYgKGFjY3UgPCAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKT4+MSkKICAgICAgYndWZWN0b3JbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGVsc2UKICAgICAgYndWZWN0b3JbaV0gPSBmaXhNaW4oYWNjdTw8MSxGTDJGWENPTlNUX0RCTCgwLjk5NjA5Mzc1ZikpOwogIH0KfQojZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyAqLwoKLyogUmVzdWx0aW5nIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCBleHBvbmVudCAqLwojZGVmaW5lIEFDREVUX0VYUCAoMiooREZSQUNUX0JJVFMrc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKzEwLWFjLmRldF9zY2FsZSkpCiNkZWZpbmUgQUNfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IpCiNkZWZpbmUgQUxQSEFfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IrMSkKLyogUmVzdWx0aW5nIHRyYW5zcG9zZWQgUU1GIHZhbHVlcyBleHBvbmVudCAxNiBiaXQgbm9ybWFsaXplZCBzYW1wbGViaXRzIGFzc3VtZWQuICovCiNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTLTE1KS1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gdHJhbnNwb3NpdGlvbiBieSBwYXRjaGluZyBvZiBzdWJiYW5kIHNhbXBsZXMuCiAqIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhlIG1vZHVsZS4gVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGFyZWFzIGZvciB0aGUKICogcGF0Y2hpbmcgcHJvY2VzcyAodGhlc2UgYXJlIHRoZSBzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcKICogYnkgbWVhbnMgb2YgaW52ZXJzZSBmaWx0ZXJpbmcuIFRoZSBmdW5jdGlvbiBhdXRvQ29ycmVsYXRpb24ybmQoKSBpcyBhbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHRoZQogKiBMUEMgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVyaW5nLiAgVGhlIGFjdHVhbCBjYWxjdWxhdGlvbiBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cyBhbmQgdGhlIGltcGxlbWVudGF0aW9uCiAqIG9mIHRoZSBmaWx0ZXJpbmcgYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgb24gYWxsIGF2YWlsYWJsZSBRTUYgc3Vic2FtcGxlcywgd2hlcmVhcyB0aGUgcGF0Y2hpbmcgaXMgb25seSBkb25lIG9uIHRob3NlIFFNRgogKiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IFFNRiBzeW50aGVzaXMuIFRoZSBmaWx0ZXJpbmcgaXMgYWxzbyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIHBhdGNoaW5nCiAqIGluY2x1ZGVzIGZ1cnRoZXIgZGVwZW5kZW5jaWVzIG9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgU0JSIGRhdGEuCiAqCiAqLwoKdm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzLCAgICAgICAgICAgLyohPCBTdGFydCBwb3NpdGlvbiBpbiB0aW1lICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAgICAgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAgICAgIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgICAgYndJbmRleFtNQVhfTlVNX1BBVENIRVNdOwogIEZJWFBfREJMICBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNdOyAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KCiAgaW50ICAgIGk7CiAgaW50ICAgIGxvQmFuZCwgc3RhcnQsIHN0b3A7CiAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzID0gaExwcFRyYW5zLT5wU2V0dGluZ3M7CiAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CiAgaW50ICAgIHBhdGNoOwoKICBGSVhQX1NHTCAgYWxwaGFyW0xQQ19PUkRFUl0sIGEwciwgYTFyOwogIEZJWFBfU0dMICBhbHBoYWlbTFBDX09SREVSXSwgYTBpPTAsIGExaT0wOwogIEZJWFBfU0dMICBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICBpbnQgICAgYXV0b0NvcnJMZW5ndGg7CgogIEZJWFBfREJMIGsxLCBrMV9iZWxvdz0wLCBrMV9iZWxvdzI9MDsKCiAgQUNPUlJfQ09FRlMgYWM7CiAgaW50ICAgIHN0YXJ0U2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlQ2xlYXI7CgogIGludCBjb21Mb3dCYW5kU2NhbGU7CiAgaW50IG92TG93QmFuZFNoaWZ0OwogIGludCBsb3dCYW5kU2hpZnQ7Ci8qICBpbnQgb3ZIaWdoQmFuZFNoaWZ0OyovCiAgaW50IHRhcmdldFN0b3BCYW5kOwoKCiAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CgoKICBzdGFydFNhbXBsZSA9IGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKICBzdG9wU2FtcGxlICA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKCgogIGludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzKGhMcHBUcmFucywgbkludmZCYW5kcywgc2JyX2ludmZfbW9kZSwgc2JyX2ludmZfbW9kZV9wcmV2LCBid1ZlY3Rvcik7CgogIHN0b3BTYW1wbGVDbGVhciA9IHN0b3BTYW1wbGU7CgogIGF1dG9Db3JyTGVuZ3RoID0gcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcDsKCiAgLyogU2V0IHVwcGVyIHN1YmJhbmRzIHRvIHplcm86CiAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZSBoaWdoYmFuZAogICAgIChiZWNhdXNlIHRoZSBsYXN0IHBhdGNoIHdvdWxkIGJlIHRvbyBzaG9ydCkuCiAgICAgUG9zc2libGUgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLwogIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLnRhcmdldFN0YXJ0QmFuZAogICAgICAgICAgICAgICAgICsgcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLm51bUJhbmRzSW5QYXRjaDsKCiAgaW50IG1lbVNpemUgPSAoKDY0KSAtIHRhcmdldFN0b3BCYW5kKSAqIHNpemVvZihGSVhQX0RCTCk7CgogIGlmICghdXNlTFApIHsKICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZUNsZWFyOyBpKyspIHsKICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlckltYWdbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKICAgIH0KICB9IGVsc2UKICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGVDbGVhcjsgaSsrKSB7CiAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOwogIH0KCiAgLyogaW5pdCBid0luZGV4IGZvciBlYWNoIHBhdGNoICovCiAgRkRLbWVtY2xlYXIoYndJbmRleCwgTUFYX05VTV9QQVRDSEVTKnNpemVvZihJTlQpKTsKCiAgLyoKICAgIENhbGMgY29tbW9uIGxvdyBiYW5kIHNjYWxlIGZhY3RvcgogICovCiAgY29tTG93QmFuZFNjYWxlID0gZml4TWluKHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSxzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOwoKICBvdkxvd0JhbmRTaGlmdCA9ICBzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7CiAgbG93QmFuZFNoaWZ0ICAgPSAgc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlIC0gY29tTG93QmFuZFNjYWxlOwogIC8qICBvdkhpZ2hCYW5kU2hpZnQgPSBmaXJzdFNsb3RPZmZzID09IDAgPyBvdkxvd0JhbmRTaGlmdDowOyovCgogIC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyB0byBkbyBhbmFseXNpcyBvbmx5IG9uY2UgZm9yIGVhY2ggYmFuZCAqLwoKICBpZiAoIXVzZUxQKSB7CiAgICBzdGFydCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOwogICAgc3RvcCA9IHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmc7CiAgfSBlbHNlCiAgewogICAgc3RhcnQgPSBmaXhNYXgoMSwgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgLSAyKTsKICAgIHN0b3AgPSBwYXRjaFBhcmFtWzBdLnRhcmdldFN0YXJ0QmFuZDsKICB9CgoKICBmb3IgKCBsb0JhbmQgPSBzdGFydDsgbG9CYW5kIDwgIHN0b3A7IGxvQmFuZCsrICkgewoKICAgIEZJWFBfREJMICBsb3dCYW5kUmVhbFsoKCgxMDI0KS8oMzIpKSsoNikpK0xQQ19PUkRFUl07CiAgICBGSVhQX0RCTCAqcGxvd0JhbmRSZWFsID0gbG93QmFuZFJlYWw7CiAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJSZWFsID0gcW1mQnVmZmVyUmVhbDsKICAgIEZJWFBfREJMICBsb3dCYW5kSW1hZ1soKCgxMDI0KS8oMzIpKSsoNikpK0xQQ19PUkRFUl07CiAgICBGSVhQX0RCTCAqcGxvd0JhbmRJbWFnID0gbG93QmFuZEltYWc7CiAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJJbWFnID0gcW1mQnVmZmVySW1hZzsKICAgIGludCByZXNldExQQ0NvZWZmcz0wOwogICAgaW50IGR5bmFtaWNTY2FsZSA9IERGUkFDVF9CSVRTLTEtTFBDX1NDQUxFX0ZBQ1RPUjsKICAgIGludCBhY0RldFNjYWxlID0gMDsgLyogc2NhbGluZyBvZiBhdXRvY29ycmVsYXRpb24gZGV0ZXJtaW5hbnQgKi8KCiAgICBmb3IoaT0wO2k8TFBDX09SREVSO2krKyl7CiAgICAgICpwbG93QmFuZFJlYWwrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbFtpXVtsb0JhbmRdOwogICAgICBpZiAoIXVzZUxQKQogICAgICAgICpwbG93QmFuZEltYWcrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ1tpXVtsb0JhbmRdOwogICAgfQoKICAgIC8qCiAgICAgIFRha2Ugb2xkIHNsb3BlIGxlbmd0aCBxbWYgc2xvdCBzb3VyY2UgdmFsdWVzIG91dCBvZiAob3ZlcmxhcClxbWYgYnVmZmVyCiAgICAqLwogICAgaWYgKCF1c2VMUCkgewogICAgICBmb3IoaT0wO2k8cFNldHRpbmdzLT5uQ29scytwU2V0dGluZ3MtPm92ZXJsYXA7aSsrKXsKICAgICAgICAqcGxvd0JhbmRSZWFsKysgPSAoKnBxbWZCdWZmZXJSZWFsKyspW2xvQmFuZF07CiAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gKCpwcW1mQnVmZmVySW1hZysrKVtsb0JhbmRdOwogICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgLyogcFNldHRpbmdzLT5vdmVybGFwIGlzIGFsd2F5cyBldmVuICovCiAgICAgIEZES19BU1NFUlQoKHBTZXR0aW5ncy0+b3ZlcmxhcCAmIDEpID09IDApOwoKICAgICAgZm9yKGk9MDtpPCgocFNldHRpbmdzLT5vdmVybGFwK3BTZXR0aW5ncy0+bkNvbHMpPj4xKTtpKyspIHsKICAgICAgICAqcGxvd0JhbmRSZWFsKysgPSAoKnBxbWZCdWZmZXJSZWFsKyspW2xvQmFuZF07CiAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICB9CiAgICAgIGlmIChwU2V0dGluZ3MtPm5Db2xzICYgMSkgewogICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgIERldGVybWluZSBkeW5hbWljIHNjYWxpbmcgdmFsdWUuCiAgICAgKi8KICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1pbihkeW5hbWljU2NhbGUsIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRSZWFsLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwKSArIG92TG93QmFuZFNoaWZ0KTsKICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1pbihkeW5hbWljU2NhbGUsIGdldFNjYWxlZmFjdG9yKCZsb3dCYW5kUmVhbFtMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scykgKyBsb3dCYW5kU2hpZnQpOwogICAgaWYgKCF1c2VMUCkgewogICAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kSW1hZywgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCkgKyBvdkxvd0JhbmRTaGlmdCk7CiAgICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1pbihkeW5hbWljU2NhbGUsIGdldFNjYWxlZmFjdG9yKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scykgKyBsb3dCYW5kU2hpZnQpOwogICAgfQogICAgZHluYW1pY1NjYWxlID0gZml4TWF4KDAsIGR5bmFtaWNTY2FsZS0xKTsgLyogb25lIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIHRvIHByZXZlbnQgLTEuMCAqLwoKICAgIC8qCiAgICAgIFNjYWxlIHRlbXBvcmFsIFFNRiBidWZmZXIuCiAgICAgKi8KICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kUmVhbFswXSwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCwgZHluYW1pY1NjYWxlLW92TG93QmFuZFNoaWZ0KTsKICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kUmVhbFtMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlLWxvd0JhbmRTaGlmdCk7CgogICAgaWYgKCF1c2VMUCkgewogICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbMF0sIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXAsIGR5bmFtaWNTY2FsZS1vdkxvd0JhbmRTaGlmdCk7CiAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlLWxvd0JhbmRTaGlmdCk7CiAgICB9CgoKICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfY3BseCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgbG93QmFuZEltYWcrTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgYWNEZXRTY2FsZSArPSBhdXRvQ29ycjJuZF9yZWFsKCZhYywgbG93QmFuZFJlYWwrTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CiAgICAgIH0KCiAgICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCiAgICAgIGFjRGV0U2NhbGUgKz0gMiooY29tTG93QmFuZFNjYWxlICsgZHluYW1pY1NjYWxlKTsKICAgICAgYWNEZXRTY2FsZSAqPSAyOyAgICAgICAgICAgICAgLyogdHdvIHRpbWVzIHJlZmxlY3Rpb24gY29lZmZpY2VudCBzY2FsaW5nICovCiAgICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAgIC8qIGFjIHNjYWxpbmcgb2YgZGV0ZXJtaW5hbnQgKi8KCiAgICAgIC8qIEluIGNhc2Ugb2YgZGV0ZXJtaW5hbnQgPCAxMF4tMzgsIHJlc2V0TFBDQ29lZmZzPTEgaGFzIHRvIGJlIGVuZm9yY2VkLiAqLwogICAgICBpZiAoYWNEZXRTY2FsZT4xMjYgKSB7CiAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOwogICAgICB9CgoKICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgaWYgKCF1c2VMUCkKICAgICAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CgogICAgaWYgKGFjLmRldCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICBGSVhQX0RCTCB0bXAsYWJzVG1wLGFic0RldDsKCiAgICAgIGFic0RldCA9IGZpeHBfYWJzKGFjLmRldCk7CgogICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgdG1wID0gKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIC0KICAgICAgICAgICAgICAoIChmTXVsdERpdjIoYWMucjAxaSxhYy5yMTJpKSArIGZNdWx0RGl2MihhYy5yMDJyLGFjLnIxMXIpKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApOwogICAgICB9IGVsc2UKICAgICAgewogICAgICAgIHRtcCA9ICggZk11bHREaXYyKGFjLnIwMXIsYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSAtCiAgICAgICAgICAgICAgKCBmTXVsdERpdjIoYWMucjAycixhYy5yMTFyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApOwogICAgICB9CiAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CgogICAgICAvKgogICAgICAgIFF1aWNrIGNoZWNrOiBpcyBmaXJzdCBmaWx0ZXIgY29lZmYgPj0gMSg0KQogICAgICAgKi8KICAgICAgewogICAgICAgIElOVCBzY2FsZTsKICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKICAgICAgICBzY2FsZSA9IHNjYWxlK2FjLmRldF9zY2FsZTsKCiAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CiAgICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgYWxwaGFyWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSkpOwogICAgICAgICAgaWYoKHRtcDxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldDxGTDJGWF9EQkwoMC4wZikpKSB7CiAgICAgICAgICAgIGFscGhhclsxXSA9IC1hbHBoYXJbMV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIXVzZUxQKQogICAgICB7CiAgICAgICAgdG1wID0gICggZk11bHREaXYyKGFjLnIwMWksYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSArCiAgICAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMmkpIC0gKEZJWFBfREJMKWZNdWx0RGl2MihhYy5yMDJpLGFjLnIxMXIpKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIDsKCiAgICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKCiAgICAgICAgLyoKICAgICAgICBRdWljayBjaGVjazogaXMgc2Vjb25kIGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKICAgICAgICAgIHNjYWxlID0gc2NhbGUrYWMuZGV0X3NjYWxlOwoKICAgICAgICAgIGlmICggKHNjYWxlID4gMCkgJiYgKHJlc3VsdCA+PSAvKkZMMkZYQ09OU1RfREJMKDEuZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2NhbGUpICkgewogICAgICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYWxwaGFpWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSkpOwogICAgICAgICAgICBpZigodG1wPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0PEZMMkZYX0RCTCgwLjBmKSkpIHsKICAgICAgICAgICAgICBhbHBoYWlbMV0gPSAtYWxwaGFpWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgYWxwaGFyWzBdID0gIEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgaWYgKCF1c2VMUCkKICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CgogICAgaWYgKCBhYy5yMTFyICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewoKICAgICAgLyogYWMucjExciBpcyBhbHdheXMgPj0wICovCiAgICAgIEZJWFBfREJMIHRtcCxhYnNUbXA7CgogICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgdG1wID0gKGFjLnIwMXI+PihMUENfU0NBTEVfRkFDVE9SKzEpKSArCiAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYXJbMV0sYWMucjEycikgKyBmTXVsdERpdjIoYWxwaGFpWzFdLGFjLnIxMmkpKTsKICAgICAgfSBlbHNlCiAgICAgIHsKICAgICAgICBpZihhYy5yMDFyPj1GTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHRtcCA9IC0oKC1hYy5yMDFyKT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsgZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKTsKICAgICAgfQoKICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKCiAgICAgIC8qCiAgICAgICAgUXVpY2sgY2hlY2s6IGlzIGZpcnN0IGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICovCgogICAgICBpZiAoYWJzVG1wID49IChhYy5yMTFyPj4xKSkgewogICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgSU5UIHNjYWxlOwogICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgZml4cF9hYnMoYWMucjExciksICZzY2FsZSk7CiAgICAgICAgYWxwaGFyWzBdID0gIEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUrMSkpOwoKICAgICAgICBpZigodG1wPkZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKQogICAgICAgICAgYWxwaGFyWzBdID0gLWFscGhhclswXTsKICAgICAgfQoKICAgICAgaWYgKCF1c2VMUCkKICAgICAgewogICAgICAgIHRtcCA9IChhYy5yMDFpPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKwogICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFpWzFdLGFjLnIxMnIpIC0gZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJpKSk7CgogICAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CgogICAgICAgIC8qCiAgICAgICAgUXVpY2sgY2hlY2s6IGlzIHNlY29uZCBmaWx0ZXIgY29lZmYgPj0gMSg0KQogICAgICAgICovCiAgICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExcj4+MSkpIHsKICAgICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKICAgICAgICAgIGFscGhhaVswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUrMSkpOwogICAgICAgICAgaWYoKHRtcD5GTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXI8RkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgICAgYWxwaGFpWzBdID0gLWFscGhhaVswXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCgogICAgaWYgKCF1c2VMUCkKICAgIHsKICAgICAgLyogTm93IGNoZWNrIHRoZSBxdWFkcmF0aWMgY3JpdGVyaWEgKi8KICAgICAgaWYoIChmTXVsdERpdjIoYWxwaGFyWzBdLGFscGhhclswXSkgKyBmTXVsdERpdjIoYWxwaGFpWzBdLGFscGhhaVswXSkpID49IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKICAgICAgICByZXNldExQQ0NvZWZmcz0xOwogICAgICBpZiggKGZNdWx0RGl2MihhbHBoYXJbMV0sYWxwaGFyWzFdKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sYWxwaGFpWzFdKSkgPj0gRkwyRlhDT05TVF9EQkwoMC41ZikgKQogICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7CiAgICB9CgogICAgaWYocmVzZXRMUENDb2VmZnMpewogICAgICBhbHBoYXJbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgYWxwaGFyWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgIGlmICghdXNlTFApCiAgICAgIHsKICAgICAgICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgfQogICAgfQoKICAgIGlmICh1c2VMUCkKICAgIHsKCiAgICAgIC8qIEFsaWFzaW5nIGRldGVjdGlvbiAqLwogICAgICBpZihhYy5yMTFyPT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgIGsxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKCBmaXhwX2FicyhhYy5yMDFyKSA+PSBmaXhwX2FicyhhYy5yMTFyKSApIHsKICAgICAgICAgIGlmICggZk11bHREaXYyKGFjLnIwMXIsYWMucjExcikgPCBGTDJGWF9EQkwoMC4wZikpIHsKICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKkZMMkZYQ09OU1RfU0dMKDEuMGYpKi87CiAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgIC8qIFNpbmNlIHRoaXMgdmFsdWUgaXMgc3F1YXJlZCBsYXRlciwgaXQgbXVzdCBub3QgZXZlciBiZWNvbWUgLTEuMGYuICovCiAgICAgICAgICAgIGsxID0gKEZJWFBfREJMKShNSU5WQUxfREJMKzEpIC8qRkwyRlhDT05TVF9TR0woLTEuMGYpKi87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oZml4cF9hYnMoYWMucjAxciksIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwogICAgICAgICAgazEgPSBzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSk7CgogICAgICAgICAgaWYoISgoYWMucjAxcjxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXI8RkwyRlhfREJMKDAuMGYpKSkpIHsKICAgICAgICAgICAgazEgPSAtazE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKGxvQmFuZCA+IDEpewogICAgICAgIC8qIENoZWNrIGlmIHRoZSBnYWluIHNob3VsZCBiZSBsb2NrZWQgKi8KICAgICAgICBGSVhQX0RCTCBkZWcgPSAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBmUG93MihrMV9iZWxvdyk7CiAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDApICYmIChrMSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSl7CiAgICAgICAgICBpZiAoazFfYmVsb3cgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi87CiAgICAgICAgICAgIGlmICggazFfYmVsb3cyID4gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7ICAgIC8qIDMtQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggazFfYmVsb3cyID4gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7IC8qIDMtQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMSkgJiYgKGsxID4gRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKICAgICAgICAgIGlmIChrMV9iZWxvdyA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7ICAgICAgICAgLyogMi1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLzsKICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmQtMV0gPSBkZWc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSAgID0gZGVnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKiByZW1lbWJlciBrMSB2YWx1ZXMgb2YgdGhlIDIgUU1GIGNoYW5uZWxzIGJlbG93IHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KICAgICAgazFfYmVsb3cyID0gazFfYmVsb3c7CiAgICAgIGsxX2JlbG93ID0gazE7CiAgICB9CgogICAgcGF0Y2ggPSAwOwoKICAgIHdoaWxlICggcGF0Y2ggPCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzICkgeyAvKiBpbm5lciBsb29wIG92ZXIgZXZlcnkgcGF0Y2ggKi8KCiAgICAgIGludCBoaUJhbmQgPSBsb0JhbmQgKyBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmczsKCiAgICAgIGlmICggbG9CYW5kIDwgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kCiAgICAgICAgICAgfHwgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCiAgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKICAgICAgICAgICApIHsKICAgICAgICAvKiBMb3diYW5kIG5vdCBpbiBjdXJyZW50IHBhdGNoIC0gcHJvY2VlZCAqLwogICAgICAgIHBhdGNoKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIEZES19BU1NFUlQoIGhpQmFuZCA8ICg2NCkgKTsKCiAgICAgIC8qIGJ3SW5kZXhbcGF0Y2hdIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZSBmcm9tIHByZXZpb3VzIGJhbmQgaW5zaWRlIHRoaXMgcGF0Y2ggKi8KICAgICAgd2hpbGUgKGhpQmFuZCA+PSBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tid0luZGV4W3BhdGNoXV0gJiYgYndJbmRleFtwYXRjaF0gPCBNQVhfTlVNX1BBVENIRVMtMSkgewogICAgICAgIGJ3SW5kZXhbcGF0Y2hdKys7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAgRmlsdGVyIFN0ZXAgMjogYWRkIHRoZSBsZWZ0IHNsb3BlIHdpdGggdGhlIGN1cnJlbnQgZmlsdGVyIHRvIHRoZSBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgICBwdXJlIHNvdXJjZSB2YWx1ZXMgYXJlIGFscmVhZHkgaW4gdGhlcmUKICAgICAgKi8KICAgICAgYncgPSBGWF9EQkwyRlhfU0dMKGJ3VmVjdG9yW2J3SW5kZXhbcGF0Y2hdXSk7CgogICAgICBhMHIgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhclswXSkpOyAvKiBBcHBseSBjdXJyZW50IGJhbmR3aWR0aCBleHBhbnNpb24gZmFjdG9yICovCgoKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICBhMGkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhaVswXSkpOwogICAgICBidyA9ICBGWF9EQkwyRlhfU0dMKGZQb3cyKGJ3KSk7CiAgICAgIGExciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFyWzFdKSk7CiAgICAgIGlmICghdXNlTFApCiAgICAgICAgYTFpID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYWlbMV0pKTsKCgoKICAgICAgLyoKICAgICAgICBGaWx0ZXIgU3RlcCAzOiBpbnNlcnQgdGhlIG1pZGRsZSBwYXJ0IHdoaWNoIHdvbid0IGJlIHdpbmRvd2VkCiAgICAgICovCgogICAgICBpZiAoIGJ3IDw9IEZMMkZYQ09OU1RfU0dMKDAuMGYpICkgewogICAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwogICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gbG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlOwogICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBsb3dCYW5kSW1hZ1tMUENfT1JERVIraV0+PmRlc2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgewogICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgeyAgLyogYncgPD0gMCAqLwoKICAgICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCAoTFBDX1NDQUxFX0ZBQ1RPUitkeW5hbWljU2NhbGUpKTsKI2lmZGVmIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEKICAgICAgICAgIGxwcFRyYW5zcG9zZXJfZnVuYzEobG93QmFuZFJlYWwrTFBDX09SREVSK3N0YXJ0U2FtcGxlLGxvd0JhbmRJbWFnK0xQQ19PUkRFUitzdGFydFNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mQnVmZmVyUmVhbCtzdGFydFNhbXBsZSxxbWZCdWZmZXJJbWFnK3N0YXJ0U2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2FtcGxlLXN0YXJ0U2FtcGxlLCAoaW50KSBoaUJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSxkZXNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMHIsIGEwaSwgYTFyLCBhMWkpOwojZWxzZQogICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKICAgICAgICAgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyOwoKICAgICAgICAgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgLSBmTXVsdERpdjIoYTBpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMXIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMl0pIC0gZk11bHREaXYyKGExaSxsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CiAgICAgICAgICAgIGFjY3UyID0gKGZNdWx0RGl2MihhMGksbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGEwcixsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0xXSkgKwogICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTJdKSArIGZNdWx0RGl2MihhMXIsbG93QmFuZEltYWdbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOwoKICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gKGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZSkgKyAoYWNjdTE8PDEpOwogICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSAobG93QmFuZEltYWdbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1Mjw8MSk7CiAgICAgICAgICB9CiNlbmRpZgogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwoKICAgICAgICAgIEZES19BU1NFUlQoZHluYW1pY1NjYWxlID49IDApOwogICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKICAgICAgICAgICAgRklYUF9EQkwgYWNjdTE7CgogICAgICAgICAgICBhY2N1MSA9IChmTXVsdERpdjIoYTByLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTFdKSArIGZNdWx0RGl2MihhMXIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOwoKICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gKGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZSkgKyAoYWNjdTE8PDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvKiBidyA8PSAwICovCgogICAgICBwYXRjaCsrOwoKICAgIH0gIC8qIGlubmVyIGxvb3Agb3ZlciBwYXRjaGVzICovCgogICAgIC8qCiAgICAgKiBzdG9yZSB0aGUgdW5tb2RpZmllZCBmaWx0ZXIgY29lZmZpY2llbnRzIGlmIHRoZXJlIGlzCiAgICAgKiBhbiBvdmVybGFwcGluZyBlbnZlbG9wZQogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgfSAgLyogb3V0ZXIgbG9vcCBvdmVyIGJhbmRzIChsb0JhbmQpICovCgogIGlmICh1c2VMUCkKICB7CiAgICBmb3IgKCBsb0JhbmQgPSBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZzsgbG9CYW5kIDwgIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmc7IGxvQmFuZCsrICkgewogICAgICBwYXRjaCA9IDA7CiAgICAgIHdoaWxlICggcGF0Y2ggPCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzICkgewoKICAgICAgICBVQ0hBUiBoaUJhbmQgPSBsb0JhbmQgKyBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmczsKCiAgICAgICAgaWYgKCBsb0JhbmQgPCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQKICAgICAgICAgIHx8IGxvQmFuZCA+PSBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZAogICAgICAgICAgfHwgaGlCYW5kID49ICg2NCkgICAgICAgICAgICAgIC8qIEhpZ2hiYW5kIG91dCBvZiByYW5nZSAoYml0ZXJyb3IpICovCiAgICAgICAgICApIHsKICAgICAgICAgIC8qIExvd2JhbmQgbm90IGluIGN1cnJlbnQgcGF0Y2ggb3IgaGlnaGJhbmQgb3V0IG9mIHJhbmdlIChtaWdodCBiZSBjYXVzZWQgYnkgYml0ZXJyb3JzKS0gcHJvY2VlZCAqLwogICAgICAgICAgcGF0Y2grKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYoaGlCYW5kICE9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCkKICAgICAgICAgIGRlZ3JlZUFsaWFzW2hpQmFuZF0gPSBkZWdyZWVBbGlhc1tsb0JhbmRdOwoKICAgICAgICBwYXRjaCsrOwogICAgICB9CiAgICB9LyogZW5kICBmb3IgbG9vcCAqLwogIH0KCiBmb3IgKGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrICkgewogICBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldID0gYndWZWN0b3JbaV07CiB9CgogIC8qCiAgICBzZXQgaGlnaCBiYW5kIHNjYWxlIGZhY3RvcgogICovCiAgc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlID0gY29tTG93QmFuZFNjYWxlLShMUENfU0NBTEVfRkFDVE9SKTsKCn0KCi8qIQogKgogKiBcYnJpZWYgSW5pdGlhbGl6ZSBvbmUgbG93IHBvd2VyIHRyYW5zcG9zZXIgaW5zdGFuY2UKICoKICoKICovClNCUl9FUlJPUgpjcmVhdGVMcHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBocywgLyohPCBIYW5kbGUgb2YgbG93IHBvd2VyIHRyYW5zcG9zZXIgICovCiAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncywgLyohPCBQb2ludGVyIHRvIHNldHRpbmdzICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgaGlnaEJhbmRTdGFydFNiLCAvKiE8ID8gKi8KICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgLyohPCBNYXN0ZXIgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bU1hc3RlciwgICAgICAgLyohPCBWYWxpZCBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNiLCAgICAgICAgICAgICAvKiE8IEhpZ2hiYW5kIGFyZWEgc3RvcCBzdWJiYW5kICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU2xvdHMsICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5Db2xzLCAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY29sdW1zIChjb2RlYyBxbWYgYmFuaykgKi8KICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBub05vaXNlQmFuZHMsICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIGZzLCAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGUgRnJlcXVlbmN5ICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBudW1iZXIgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXAKICAgICAgICAgICAgICAgICAgICAgKQp7CiAgLyogRkIgaW52ZXJzZSBmaWx0ZXJpbmcgc2V0dGluZ3MgKi8KICBocy0+cFNldHRpbmdzID0gcFNldHRpbmdzOwoKICBwU2V0dGluZ3MtPm5Db2xzID0gbkNvbHM7CiAgcFNldHRpbmdzLT5vdmVybGFwID0gb3ZlcmxhcDsKCiAgc3dpdGNoICh0aW1lU2xvdHMpIHsKCiAgY2FzZSAxNToKICBjYXNlIDE2OgogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsgLyogVW5pbXBsZW1lbnRlZCAqLwogIH0KCiAgaWYgKGNoYW49PTApIHsKICAgIC8qIEluaXQgY29tbW9uIGRhdGEgb25seSBvbmNlICovCiAgICBocy0+cFNldHRpbmdzLT5uQ29scyA9IG5Db2xzOwoKICAgIHJldHVybiByZXNldExwcFRyYW5zcG9zZXIgKGhzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaEJhbmRTdGFydFNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9rX21hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMpOwogIH0KICByZXR1cm4gU0JSREVDX09LOwp9CgoKc3RhdGljIGludCBmaW5kQ2xvc2VzdEVudHJ5KFVDSEFSIGdvYWxTYiwgVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSIG51bU1hc3RlciwgVUNIQVIgZGlyZWN0aW9uKQp7CiAgaW50IGluZGV4OwoKICBpZiggZ29hbFNiIDw9IHZfa19tYXN0ZXJbMF0gKQogICAgcmV0dXJuIHZfa19tYXN0ZXJbMF07CgogIGlmKCBnb2FsU2IgPj0gdl9rX21hc3RlcltudW1NYXN0ZXJdICkKICAgIHJldHVybiB2X2tfbWFzdGVyW251bU1hc3Rlcl07CgogIGlmKGRpcmVjdGlvbikgewogICAgaW5kZXggPSAwOwogICAgd2hpbGUoIHZfa19tYXN0ZXJbaW5kZXhdIDwgZ29hbFNiICkgewogICAgICBpbmRleCsrOwogICAgfQogIH0gZWxzZSB7CiAgICBpbmRleCA9IG51bU1hc3RlcjsKICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA+IGdvYWxTYiApIHsKICAgICAgaW5kZXgtLTsKICAgIH0KICB9CgogIHJldHVybiB2X2tfbWFzdGVyW2luZGV4XTsKfQoKCi8qIQogKgogKiBcYnJpZWYgUmVzZXQgbWVtb3J5IGZvciBvbmUgbHBwIHRyYW5zcG9zZXIgaW5zdGFuY2UKICoKICogXHJldHVybiBTQlJERUNfT0sgb24gc3VjY2VzcywgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRyBvbiBlcnJvcgogKi8KU0JSX0VSUk9SCnJlc2V0THBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgIGhpZ2hCYW5kU3RhcnRTYiwgICAgICAgICAgLyohPCBIaWdoIGJhbmQgYXJlYTogc3RhcnQgc3ViYmFuZCAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG51bU1hc3RlciwgICAgICAgICAgICAgICAgLyohPCBWYWxpZCBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICpub2lzZUJhbmRUYWJsZSwgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG5vTm9pc2VCYW5kcywgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdG9wIHN1YmJhbmQgKi8KICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNCUiBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCiAgICAgICAgICAgICAgICAgICAgKQp7CiAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzID0gaExwcFRyYW5zLT5wU2V0dGluZ3M7CiAgUEFUQ0hfUEFSQU0gICpwYXRjaFBhcmFtID0gcFNldHRpbmdzLT5wYXRjaFBhcmFtOwoKICBpbnQgaSwgcGF0Y2g7CiAgaW50IHRhcmdldFN0b3BCYW5kOwogIGludCBzb3VyY2VTdGFydEJhbmQ7CiAgaW50IHBhdGNoRGlzdGFuY2U7CiAgaW50IG51bUJhbmRzSW5QYXRjaDsKCiAgaW50IGxzYiA9IHZfa19tYXN0ZXJbMF07ICAgICAgICAgICAgICAgICAvKiBTdGFydCBzdWJiYW5kIGV4cHJlc3NlZCBpbiAibm9uLWNyaXRpY2FsIiBzYW1wbGluZyB0ZXJtcyovCiAgaW50IHhvdmVyT2Zmc2V0ID0gaGlnaEJhbmRTdGFydFNiIC0gbHNiOyAvKiBDYWxjdWxhdGUgZGlzdGFuY2UgaW4gUU1GIGJhbmRzIGJldHdlZW4gazAgYW5kIGt4ICovCiAgaW50IHN0YXJ0RnJlcUh6OwoKICBpbnQgZGVzaXJlZEJvcmRlcjsKCiAgdXNiID0gZml4TWluKHVzYiwgdl9rX21hc3RlcltudW1NYXN0ZXJdKTsgLyogQXZvaWQgZW5kbGVzcyBsb29wcyAoY29tcGFyZSB3aXRoIGZsb2F0IGNvZGUpLiAqLwoKICAvKgogICAqIFBsYXVzaWJpbGl0eSBjaGVjawogICAqLwoKICBpZiAoIGxzYiAtIFNISUZUX1NUQVJUX1NCIDwgNCApIHsKICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogIH0KCgogIC8qCiAgICogSW5pdGlhbGl6ZSB0aGUgcGF0Y2hpbmcgcGFyYW1ldGVyCiAgICovCiAgLyogSVNPL0lFQyAxNDQ5Ni0zIChGaWd1cmUgNC40OCk6IGdvYWxTYiA9IHJvdW5kKCAyLjA0OGU2IC8gZnMgKSAqLwogIGRlc2lyZWRCb3JkZXIgICAgPSAoKCgyMDQ4MDAwKjIpIC8gZnMpICsgMSkgPj4gMTsKCiAgZGVzaXJlZEJvcmRlciA9IGZpbmRDbG9zZXN0RW50cnkoZGVzaXJlZEJvcmRlciwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAxKTsgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLwoKICAvKiBGaXJzdCBwYXRjaCAqLwogIHNvdXJjZVN0YXJ0QmFuZCA9IFNISUZUX1NUQVJUX1NCICsgeG92ZXJPZmZzZXQ7CiAgdGFyZ2V0U3RvcEJhbmQgPSBsc2IgKyB4b3Zlck9mZnNldDsgLyogdXBwZXJCYW5kICovCgogIC8qIEV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCBtdXN0IGJlIHBhdGNoZWQgdG8gZXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsICovCiAgcGF0Y2ggPSAwOwogIHdoaWxlKHRhcmdldFN0b3BCYW5kIDwgdXNiKSB7CgogICAgLyogVG9vIG1hbnkgcGF0Y2hlcz8KICAgICAgIEFsbG93IE1BWF9OVU1fUEFUQ0hFUysxIHBhdGNoZXMgaGVyZS4KICAgICAgIHdlIG5lZWQgdG8gY2hlY2sgbGF0ZXIgYWdhaW4sIHNpbmNlIHBhdGNoIG1pZ2h0IGJlIHRoZSBoaWdoZXN0IHBhdGNoCiAgICAgICBBTkQgY29udGFpbiBsZXNzIHRoYW4gMyBiYW5kcyA9PiBhY3R1YWwgbnVtYmVyIG9mIHBhdGNoZXMgd2lsbCBiZSByZWR1Y2VkIGJ5IDEuCiAgICAqLwogICAgaWYgKHBhdGNoID4gTUFYX05VTV9QQVRDSEVTKSB7CiAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgfQoKICAgIHBhdGNoUGFyYW1bcGF0Y2hdLmd1YXJkU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CiAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKCiAgICBudW1CYW5kc0luUGF0Y2ggPSBkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQ7ICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZGVzaXJlZCByYW5nZSBvZiB0aGUgcGF0Y2ggKi8KCiAgICBpZiAoIG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQgKSB7CiAgICAgIC8qIERlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBub3QgYXZhaWxhYmxlIC0+IHBhdGNoIHdob2xlIHNvdXJjZSByYW5nZSAqLwogICAgICBwYXRjaERpc3RhbmNlICAgPSB0YXJnZXRTdG9wQmFuZCAtIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCiAgICAgIHBhdGNoRGlzdGFuY2UgICA9IHBhdGNoRGlzdGFuY2UgJiB+MTsgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRpbmcgb2ZmIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCiAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGxzYiAtICh0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2UpOyAgLyogVXBkYXRlIG51bWJlciBvZiBiYW5kcyB0byBiZSBwYXRjaGVkICovCiAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdG9wQmFuZDsgIC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KICAgIH0KCiAgICAvKiBEZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgYXZhaWxhYmxlIC0+IGdldCB0aGUgbWluaW1hbCBldmVuIHBhdGNoaW5nIGRpc3RhbmNlICovCiAgICBwYXRjaERpc3RhbmNlICAgPSBudW1CYW5kc0luUGF0Y2ggKyB0YXJnZXRTdG9wQmFuZCAtIGxzYjsgIC8qIEdldCBtaW5pbWFsIGRpc3RhbmNlICovCiAgICBwYXRjaERpc3RhbmNlICAgPSAocGF0Y2hEaXN0YW5jZSArIDEpICYgfjE7ICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIHVwIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCgogICAgaWYgKG51bUJhbmRzSW5QYXRjaCA+IDApIHsKICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQgLSBwYXRjaERpc3RhbmNlOwogICAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmcyAgPSBwYXRjaERpc3RhbmNlOwogICAgICBwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2ggPSBudW1CYW5kc0luUGF0Y2g7CiAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kICA9IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKCiAgICAgIHRhcmdldFN0b3BCYW5kICs9IHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKICAgICAgcGF0Y2grKzsKICAgIH0KCiAgICAvKiBBbGwgcGF0Y2hlcyBidXQgZmlyc3QgKi8KICAgIHNvdXJjZVN0YXJ0QmFuZCA9IFNISUZUX1NUQVJUX1NCOwoKICAgIC8qIENoZWNrIGlmIHdlIGFyZSBjbG9zZSB0byBkZXNpcmVkQm9yZGVyICovCiAgICBpZiggZGVzaXJlZEJvcmRlciAtIHRhcmdldFN0b3BCYW5kIDwgMykgIC8qIE1QRUcgZG9jICovCiAgICB7CiAgICAgIGRlc2lyZWRCb3JkZXIgPSB1c2I7CiAgICB9CgogIH0KCiAgcGF0Y2gtLTsKCiAgLyogSWYgaGlnaGVzdCBwYXRjaCBjb250YWlucyBsZXNzIHRoYW4gdGhyZWUgc3ViYmFuZDogc2tpcCBpdCAqLwogIGlmICggKHBhdGNoPjApICYmIChwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2ggPCAzKSApIHsKICAgIHBhdGNoLS07CiAgICB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKICB9CgogIC8qIG5vdyBjaGVjayBpZiB3ZSBkb24ndCBoYXZlIG9uZSB0b28gbWFueSAqLwogIGlmIChwYXRjaCA+PSBNQVhfTlVNX1BBVENIRVMpIHsKICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogIH0KCiAgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyA9IHBhdGNoICsgMTsKCiAgLyogQ2hlY2sgbG93ZXN0IGFuZCBoaWdoZXN0IHNvdXJjZSBzdWJiYW5kICovCiAgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgPSB0YXJnZXRTdG9wQmFuZDsKICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nICA9IDA7CiAgZm9yICggcGF0Y2ggPSAwOyBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXM7IHBhdGNoKysgKSB7CiAgICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9IGZpeE1pbiggcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcsIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCApOwogICAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZyAgPSBmaXhNYXgoIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcsIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kICk7CiAgfQoKICBmb3IoaSA9IDAgOyBpIDwgbm9Ob2lzZUJhbmRzOyBpKyspewogICAgcFNldHRpbmdzLT5id0JvcmRlcnNbaV0gPSBub2lzZUJhbmRUYWJsZVtpKzFdOwogIH0KICBmb3IgKDtpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewogICAgcFNldHRpbmdzLT5id0JvcmRlcnNbaV0gPSAyNTU7CiAgfQoKCiAgLyoKICAgKiBDaG9vc2Ugd2hpdGVuaW5nIGZhY3RvcnMKICAgKi8KCiAgc3RhcnRGcmVxSHogPSAoIChsc2IgKyB4b3Zlck9mZnNldCkqZnMgKSA+PiA3OyAgLyogU2hpZnQgZG9lcyBhIGRpdmlzaW9uIGJ5IDIqKDY0KSAqLwoKICBmb3IoIGkgPSAxOyBpIDwgTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVM7IGkrKyApCiAgewogICAgaWYoIHN0YXJ0RnJlcUh6IDwgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W2ldKQogICAgICBicmVhazsKICB9CiAgaS0tOwoKICBwU2V0dGluZ3MtPndoRmFjdG9ycy5vZmYgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMF07CiAgcFNldHRpbmdzLT53aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzFdOwogIHBTZXR0aW5ncy0+d2hGYWN0b3JzLmxvd0xldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzJdOwogIHBTZXR0aW5ncy0+d2hGYWN0b3JzLm1pZExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzNdOwogIHBTZXR0aW5ncy0+d2hGYWN0b3JzLmhpZ2hMZXZlbCA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVs0XTsKCiAgcmV0dXJuIFNCUkRFQ19PSzsKfQo=