Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgogICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJjb21tb25fZml4LmgiCgojaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCiNpbmNsdWRlICJhZGpfdGhyLmgiCiNpbmNsdWRlICJxY19kYXRhLmgiCiNpbmNsdWRlICJzZl9lc3RpbS5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKCgoKI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICAoOCkKc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkludFtJTlZfSU5UX1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLCAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyCn07CgoKI2RlZmluZSBJTlZfU1FSVDRfVEFCX1NJWkUgICg4KQpzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydDRbSU5WX1NRUlQ0X1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDZiYTI3ZTY1LCAweDYxNDI0YmI1LCAweDVhODI3OTk5LCAweDU1OTk0ODQ1LCAweDUxYzhlMzNjLCAweDRlYjE2MGQxCn07CgoKLypzdGF0aWMgY29uc3QgSU5UICAgICAgaW52UmVkRXhwID0gNDsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMSA9IChGSVhQX0RCTCkweGZjYWQwZGRmOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjMxNikvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMiA9IChGSVhQX0RCTCkweDAzNTFlMWEyOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygzLjE2KSAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkRmFjICA9IChGSVhQX0RCTCkweGZmNWIyYzNlOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjgpICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwoKc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjMgPSAoRklYUF9EQkwpMHhmZTAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC41KSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjQgPSAoRklYUF9EQkwpMHgwMjAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMi4wKSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjUgPSAoRklYUF9EQkwpMHhmYzAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4yNSkgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KCgovKgpUaGUgYml0czJQZSBmYWN0b3JzIGFyZSBjaG9vc2VuIGZvciB0aGUgY2FzZSB0aGF0IHNvbWUgdGltZXMKdGhlIGNyYXNoIHJlY292ZXJ5IHN0cmF0ZWd5IHdpbGwgYmUgYWN0aXZhdGVkIG9uY2UuCiovCgp0eXBlZGVmIHN0cnVjdCB7CiAgSU5UICAgICAgICAgICAgICAgICBiaXRyYXRlOwogIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vOwogIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlOwogIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW87CiAgTE9ORyAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zbG9wZTsKICBMT05HICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7CiAgTE9ORyAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OwogIExPTkcgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwoKfSBCSVRfUEVfU0ZBQzsKCnR5cGVkZWYgc3RydWN0IHsKICBjb25zdCBJTlQgICAgICAgICAgIHNhbXBsZVJhdGU7CiAgY29uc3QgQklUX1BFX1NGQUMgKiBwUGVUYWI7CiAgY29uc3QgSU5UICAgICAgICAgICBuRW50cmllczsKCn0gQklUUzJQRV9DRkdfVEFCOwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjE2MDAwW10gPSB7CiAgeyAxMDAwMCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxRDcwQTNENywgMHgwOUJDOUQ2RCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxQzI4RjVDMywgMHgwQ0JCOTJDQX0sCiAgeyAyNDAwMCwgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxMywgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxM30sCiAgeyAzMjAwMCwgMHgyNDdBRTE0OCwgMHgxMUIxRDkyQiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNSwgMHgyNDdBRTE0OCwgMHgxMTBBMTM3RiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNX0sCiAgeyA0ODAwMCwgMHgyRDFFQjg1MiwgMHg2ODMzQzYwMCwgMHgyNDdBRTE0OCwgMHgwMTRGOEI1OSwgMHgyQ0NDQ0NDRCwgMHg2OERCOEJBQywgMHgyNDdBRTE0OCwgMHgwMUY3NTEwNX0sCiAgeyA2NDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgxNTRDOTg1RiwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgxNTRDOTg1Rn0sCiAgeyA5NjAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzOUVCODUxRiwgMHgwODg1MDlDMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzQTNENzBBNCwgMHgwODg1MDlDMH0sCiAgezEyODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjNENzBBNCwgMHgxOEE0M0JCNCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjhGNUMyOSwgMHgxODFFMDNGN30sCiAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0gewogIHsgMTYwMDAsIDB4MWE4ZjVjMjksIDB4MTc5N2NjM2EsIDB4MTI4ZjVjMjksIDB4MThlNzU3OTMsIDB4MTc1YzI4ZjYsIDB4MjIxNDI2ZmUsIDB4MDAwMDAwMDAsIDB4NWE3MDhlZGV9LAogIHsgMjQwMDAsIDB4MjA1MWViODUsIDB4MDkyY2NmNmMsIDB4MThhM2Q3MGEsIDB4MTNhOTJhMzAsIDB4MWZhZTE0N2IsIDB4YmNiZTYxZCwgIDB4MTYxNDdhZTEsIDB4MThlNzU3OTN9LAogIHsgMzIwMDAsIDB4MjI4ZjVjMjksIDB4MDI5ZjE2YjEsIDB4MWQ3MGEzZDcsIDB4MDg4NTA5YzAsIDB4MjI4ZjVjMjksIDB4MjlmMTZiMSwgIDB4MWMyOGY1YzMsIDB4MGIyNDIwNzF9LAogIHsgNDgwMDAsIDB4MjNkNzBhM2QsIDB4MDE0ZjhiNTksIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGEsIDB4MjNkNzBhM2QsIDB4MTRmOGI1OSwgIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGF9LAogIHsgNjQwMDAsIDB4MjQ3YWUxNDgsIDB4MDhkOGVjOTYsIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODIsIDB4MjQ3YWUxNDgsIDB4ODg1MDljMCwgIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODJ9LAogIHsgOTYwMDAsIDB4MmQxZWI4NTIsIDB4MzQxOWUzMDAsIDB4MjQ3YWUxNDgsIDB4MDBhN2M1YWMsIDB4MmNjY2NjY2QsIDB4MzQ2ZGM1ZDYsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAogIHsxMjgwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDI5ZjE2YjEsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDA5ZjE2YjF9LAogIHsxNDgwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjZiODUxZWMsIDB4MDAwMDAwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjcwYTNkNzEsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMjQwMDBbXSA9IHsKICB7IDE2MDAwLCAweDE5ZWI4NTFmLCAweDEzYTkyYTMwLCAweDExNDdhZTE0LCAweDE2NDg0MGUxLCAweDE5OTk5OTlhLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDQ2Yzc2NGFlfSwKICB7IDI0MDAwLCAweDFlYjg1MWVjLCAweDBkMWI3MTc2LCAweDE2Yjg1MWVjLCAweDE4ZTc1NzkzLCAweDFlMTQ3YWUxLCAweDBmYmE4ODI3LCAweDExNDdhZTE0LCAweDJjOTA4MWMzfSwKICB7IDMyMDAwLCAweDIxZWI4NTFmLCAweDA0OTY2N2I2LCAweDFjY2NjY2NkLCAweDA3MzU3ZTY3LCAweDIxZWI4NTFmLCAweDAzZWVhMjBhLCAweDFjMjhmNWMzLCAweDA3MzU3ZTY3fSwKICB7IDQ4MDAwLCAweDI0MjhmNWMzLCAweDAxNGY4YjU5LCAweDIwNTFlYjg1LCAweDA1M2UyZDYyLCAweDIzZDcwYTNkLCAweDAxZjc1MTA1LCAweDFmYWUxNDdiLCAweDA3MzU3ZTY3fSwKICB7IDY0MDAwLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIyZTE0N2FlLCAweDAxYTM2ZTJmLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIzMzMzMzMzLCAweDAxNGY4YjU5fSwKICB7IDk2MDAwLCAweDJhOGY1YzI5LCAweDI0YjMzZGIwLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyLCAweDJhOGY1YzI5LCAweDI2ZmU3MThiLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyfSwKICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKICB7MTQ4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjMyMDAwW10gPSB7CiAgeyAxNjAwMCwgMHgxMTk5OTk5YSwgMHgyMGM0OWJhNiwgMHgwMDAwMDAwMCwgMHg0NTc3ZDk1NSwgMHgwMDAwMDAwMCwgMHg2MGZlNDc5OSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCiAgeyAyNDAwMCwgMHgxOTk5OTk5YSwgMHgwZmJhODgyNywgMHgxMGY1YzI4ZiwgMHgxYjg2NmU0NCwgMHgxN2FlMTQ3YiwgMHgwZmJhODgyNywgMHgwMDAwMDAwMCwgMHg0ZDU1MWQ2OX0sCiAgeyAzMjAwMCwgMHgxZDcwYTNkNywgMHgwNzM1N2U2NywgMHgxN2FlMTQ3YiwgMHgwOWQ0OTUxOCwgMHgxYjg1MWViOCwgMHgwYTdjNWFjNCwgMHgxMmUxNDdhZSwgMHgxMTBhMTM3Zn0sCiAgeyA0ODAwMCwgMHgyMGY1YzI4ZiwgMHgwNDk2NjdiNiwgMHgxYzdhZTE0OCwgMHgwNTNlMmQ2MiwgMHgyMGEzZDcwYSwgMHgwNTNlMmQ2MiwgMHgxYjMzMzMzMywgMHgwNWU1ZjMwZX0sCiAgeyA2NDAwMCwgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZjBhM2Q3MSwgMHgwMmYyZjk4NywgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZTE0N2FlMSwgMHgwM2VlYTIwYX0sCiAgeyA5NjAwMCwgMHgyNWMyOGY1YywgMHgyYzNjOWVlZCwgMHgyMWViODUxZiwgMHgwMWY3NTEwNSwgMHgyNWMyOGY1YywgMHgwYTdjNWFjNCwgMHgyMWViODUxZiwgMHgwMWEzNmUyZn0sCiAgezEyODAwMCwgMHg1MGY1YzI4ZiwgMHgxOGE0M2JiNCwgMHgyM2Q3MGEzZCwgMHgwMTBjNmY3YSwgMHgzMDAwMDAwMCwgMHgxNjhiNWNjMCwgMHgyMzg1MWViOCwgMHgwMTkyYTczN30sCiAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNDdhZTE0OCwgMHgwMGRmYjIzYiwgMHgzZGMyOGY1YywgMHgzMDBmNGFhZiwgMHgyNDdhZTE0OCwgMHgwMWJmNjQ3Nn0sCiAgezE2MDAwMCwgMHg2MDAwMDAwMCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCiAgezIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODM2YmU5MSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODkwMzkwZn0sCiAgezMyMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0OTQ3YWUxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0YThmNWMyOSwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0NDEwMFtdID0gewogIHsgMTYwMDAsIDB4MTBhM2Q3MGEsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTkyMTAzODYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogIHsgMjQwMDAsIDB4MTY2NjY2NjYsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4NjM5ZDVlNGEsIDB4MTVjMjhmNWMsIDB4MTI1OTllZDgsIDB4MDAwMDAwMDAsIDB4NWJjMDFhMzd9LAogIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDQ5NjY3YjYsIDB4MTg1MWViODUsIDB4MDQ5NjY3YjYsIDB4MWEzZDcwYTQsIDB4MDg4NTA5YzAsIDB4MTY2NjY2NjYsIDB4MDUzZTJkNjJ9LAogIHsgNDgwMDAsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MWE4ZjVjMjksIDB4MDQ5NjY3YjYsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MThmNWMyOGYsIDB4MDVlNWYzMGV9LAogIHsgNjQwMDAsIDB4MjE0N2FlMTQsIDB4MDM0NmRjNWQsIDB4MWNjY2NjY2QsIDB4MDJmMmY5ODcsIDB4MjE0N2FlMTQsIDB4MDJmMmY5ODcsIDB4MWJkNzBhM2QsIDB4MDM5YWJmMzR9LAogIHsgOTYwMDAsIDB4MjQ3YWUxNDgsIDB4MDY4ZGI4YmIsIDB4MWZhZTE0N2IsIDB4MDI5ZjE2YjEsIDB4MjQyOGY1YzMsIDB4MDYzOWQ1ZTUsIDB4MWY1YzI4ZjYsIDB4MDI5ZjE2YjF9LAogIHsxMjgwMDAsIDB4MmFlMTQ3YWUsIDB4MWI0MzUyNjUsIDB4MjIzZDcwYTQsIDB4MDE5MmE3MzcsIDB4MmEzZDcwYTQsIDB4MTA0MGJmZTQsIDB4MjFlYjg1MWYsIDB4MDE5MmE3Mzd9LAogIHsxNDgwMDAsIDB4M2I4NTFlYjgsIDB4MjgzMjA2OWMsIDB4MjMzMzMzMzMsIDB4MDBkZmIyM2IsIDB4MzQyOGY1YzMsIDB4MjA1NGMyODgsIDB4MjJlMTQ3YWUsIDB4MDBkZmIyM2J9LAogIHsxNjAwMDAsIDB4NGEzZDcwYTQsIDB4YzMyZWJlNWEsIDB4MjM4NTFlYjgsIDB4MDFkNWMzMTYsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDFkNWMzMTZ9LAogIHsyMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNWMsIDB4MDcxM2YwNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDcyYTRmMTd9LAogIHszMjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiNDgwMDBbXSA9IHsKICB7IDE2MDAwLCAweDBmNWMyOGY2LCAweDMxY2VhZjI1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDc0YTc3MWM5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKICB7IDI0MDAwLCAweDFiODUxZWI4LCAweDAyOWYxNmIxLCAweDAwMDAwMDAwLCAweDY2M2M3NGZiLCAweDFjN2FlMTQ4LCAweGU0Nzk5MWJkLCAweDAwMDAwMDAwLCAweDQ5NjY3YjVmfSwKICB7IDMyMDAwLCAweDFjMjhmNWMzLCAweDAyOWYxNmIxLCAweDE4ZjVjMjhmLCAweDA3MzU3ZTY3LCAweDE1YzI4ZjVjLCAweDBmMTJjMjdhLCAweDExZWI4NTFmLCAweDEzMDE2NDg0fSwKICB7IDQ4MDAwLCAweDFkNzBhM2Q3LCAweDA1M2UyZDYyLCAweDFjN2FlMTQ4LCAweGZlMDhhZWZjLCAweDFkMWViODUyLCAweDA2OGRiOGJiLCAweDFiMzMzMzMzLCAweGZlYjA3NGE4fSwKICB7IDY0MDAwLCAweDIwMDAwMDAwLCAweDAzZWVhMjBhLCAweDFiODUxZWI4LCAweDAzNDZkYzVkLCAweDIwNTFlYjg1LCAweDAzNDZkYzVkLCAweDFhOGY1YzI5LCAweDAzOWFiZjM0fSwKICB7IDk2MDAwLCAweDIzZDcwYTNkLCAweDA1M2UyZDYyLCAweDFlYjg1MWVjLCAweDAyOWYxNmIxLCAweDIzODUxZWI4LCAweDA0ZWE0YThjLCAweDFlMTQ3YWUxLCAweDAyZjJmOTg3fSwKICB7MTI4MDAwLCAweDI4ZjVjMjhmLCAweDE0NzI3ZGNjLCAweDIxNDdhZTE0LCAweDAyMThkZWY0LCAweDI4NTFlYjg1LCAweDBlMjdlMGYwLCAweDIwZjVjMjhmLCAweDAyMThkZWY0fSwKICB7MTQ4MDAwLCAweDM1NzBhM2Q3LCAweDFjZDVmOTljLCAweDIyOGY1YzI5LCAweDAxYmY2NDc2LCAweDMwZjVjMjhmLCAweDE4Nzc3ZTc1LCAweDIyM2Q3MGE0LCAweDAxYmY2NDc2fSwKICB7MTYwMDAwLCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxOTJhNzM3LCAweDM5ZWI4NTFmLCAweGQwOGQ0YmFlLCAweDIyZTE0N2FlLCAweDAxOTJhNzM3fSwKICB7MjAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDA2Nzc1YTFiLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0Y2NjY2NkLCAweDA2YTQxNzVhfSwKICB7MzIwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNjY2NjY2NkLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNkMWViODUyLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVFMyUEVfQ0ZHX1RBQiBiaXRzMlBlQ29uZmlnVGFiW10gPSB7CiAgeyAxNjAwMCwgU19CaXRzMlBlVGFiMTYwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIxNjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgMjIwNTAsIFNfQml0czJQZVRhYjIyMDUwLCBzaXplb2YoU19CaXRzMlBlVGFiMjIwNTApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDI0MDAwLCBTX0JpdHMyUGVUYWIyNDAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjI0MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCiAgeyAzMjAwMCwgU19CaXRzMlBlVGFiMzIwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIzMjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgNDQxMDAsIFNfQml0czJQZVRhYjQ0MTAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDQxMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDQ4MDAwLCBTX0JpdHMyUGVUYWI0ODAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjQ4MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0KfTsKCgoKLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KZW51bSBfYXZvaWRfaG9sZV9zdGF0ZSB7CiAgICBOT19BSCAgICAgICAgICAgICAgPTAsCiAgICBBSF9JTkFDVElWRSAgICAgICAgPTEsCiAgICBBSF9BQ1RJVkUgICAgICAgICAgPTIKfTsKCgovKiAgUSBmb3JtYXQgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBRX0JJVEZBQyAgICAoMjQpICAgLyogUSBzY2FsaW5nIHVzZWQgaW4gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoKSBjYWxjdWxhdGlvbiAqLwojZGVmaW5lIFFfQVZHQklUUyAgICgxNykgICAvKiBzY2FsZSBiaXQgdmFsdWVzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcgogICAgZGVzY3JpcHRpb246ICByZXRyaWV2ZSBiaXRzMlBlRmFjdG9yIGZyb20gdGFibGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLAogICAgICAgIElOVCAqYml0czJQZUZhY3Rvcl9lLAogICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAogICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgSU5UIGFkdmFuY2VkQml0c1RvUGUsCiAgICAgICAgY29uc3QgSU5UIGludlF1YW50CiAgICAgICAgKQp7CiAgLyogZGVmYXVsdCBiaXRzMnBlIGZhY3RvciAqLwogIEZJWFBfREJMIGJpdDJQRV9tID0gRkwyRlhDT05TVF9EQkwoMS4xOGYvKDE8PCgxKSkpOwogIElOVCAgICAgIGJpdDJQRV9lID0gMTsKCiAgLyogbWFrZSB1c2Ugb2YgYWR2YW5jZWQgYml0cyB0byBwZSBmYWN0b3IgdGFibGUgKi8KICBpZiAoYWR2YW5jZWRCaXRzVG9QZSkgewoKICAgIGludCBpOwogICAgY29uc3QgQklUX1BFX1NGQUMgKnBlVGFiID0gTlVMTDsKICAgIElOVCBzaXplID0gMDsKCgogICAgLyogR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKi8KICAgIGZvciAoaT0wOyBpPChJTlQpKHNpemVvZihiaXRzMlBlQ29uZmlnVGFiKS9zaXplb2YoQklUUzJQRV9DRkdfVEFCKSk7IGkrKykgewogICAgICBpZiAoc2FtcGxlUmF0ZSA+PSBiaXRzMlBlQ29uZmlnVGFiW2ldLnNhbXBsZVJhdGUpIHsKICAgICAgICBwZVRhYiA9IGJpdHMyUGVDb25maWdUYWJbaV0ucFBlVGFiOwogICAgICAgIHNpemUgID0gYml0czJQZUNvbmZpZ1RhYltpXS5uRW50cmllczsKICAgICAgfQogICAgfQoKICAgIGlmICggKHBlVGFiIT1OVUxMKSAmJiAoc2l6ZSE9MCkgKSB7CgogICAgICBJTlQgc3RhcnRCICAgICAgPSAtMTsKICAgICAgTE9ORyBzdGFydFBGICAgID0gMDsKICAgICAgTE9ORyBwZVNsb3BlICAgID0gMDsKCiAgICAgIC8qIHN0ZXJlbyBvciBtb25vIG1vZGUgYW5kIGludlF1YW50IHVzZWQgb3Igbm90ICovCiAgICAgIGZvciAoaT0wOyBpPHNpemUtMTsgaSsrKQogICAgICB7CiAgICAgICAgaWYgKChwZVRhYltpXS5iaXRyYXRlPD1iaXRSYXRlKSAmJiAoKHBlVGFiW2krMV0uYml0cmF0ZT5iaXRSYXRlKSB8fCAoKGk9PXNpemUtMikpICkpCiAgICAgICAgewogICAgICAgICAgaWYgKG5DaGFubmVscz09MSkKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhcnRQRiA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBwZVNsb3BlID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2xvcGUgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9tb25vIDogcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBlbmRCPXBlVGFiW2krMV0uYml0cmF0ZTsqLwogICAgICAgICAgICBzdGFydEI9cGVUYWJbaV0uYml0cmF0ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7CiAgICAgICAgICAgIHBlU2xvcGUgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3Nsb3BlIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KICAgICAgICAgICAgc3RhcnRCPXBlVGFiW2ldLmJpdHJhdGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvKiBmb3IgaSAqLwoKICAgICAgLyogaWYgYSBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwogICAgICBpZiAoc3RhcnRCIT0tMSkgewogICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKi8KICAgICAgICBGSVhQX0RCTCBwZUZhYyA9IGZNdWx0KChGSVhQX0RCTCkoYml0UmF0ZS1zdGFydEIpPDwxNCwgKEZJWFBfREJMKXBlU2xvcGUpIDw8IDI7CiAgICAgICAgRklYUF9EQkwgYml0MlBFID0gcGVGYWMgKyAoRklYUF9EQkwpc3RhcnRQRjsgLyogc3RhcnRQRl9mbG9hdCA9IHN0YXJ0UEYgPDwgMiAqLwoKICAgICAgICAvKiBzYW5pdHkgY2hlY2sgaWYgYml0czJwZSB2YWx1ZSBpcyBoaWdoIGVub3VnaCAqLwogICAgICAgIGlmICggYml0MlBFID49IChGTDJGWENPTlNUX0RCTCgwLjM1ZikgPj4gMikgKSB7CiAgICAgICAgICBiaXQyUEVfbSA9IGJpdDJQRTsKICAgICAgICAgIGJpdDJQRV9lID0gMjsgLyogIHRhYmxlIGlzIGZpeGVkIHNjYWxlZCAqLwogICAgICAgIH0KICAgICAgfSAvKiBiciAqLwogICAgfSAvKiBzciAqLwogIH0gLyogYWR2YW5jZWRCaXRzVG9QZSAqLwoKCiAgLyogcmV0dXJuIGJpdHMycGUgZmFjdG9yICovCiAgKmJpdHMyUGVGYWN0b3JfbSA9IGJpdDJQRV9tOwogICpiaXRzMlBlRmFjdG9yX2UgPSBiaXQyUEVfZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19iaXRzMnBlMgpkZXNjcmlwdGlvbjogIGNvbnZlcnQgZnJvbSBiaXRzIHRvIHBlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIEZES2FhY0VuY19iaXRzMnBlMigKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMsCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBmYWN0b3JfbSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGZhY3Rvcl9lCiAgICAgICAgKQp7CiAgIHJldHVybiAoSU5UKShmTXVsdChmYWN0b3JfbSwgKEZJWFBfREJMKShiaXRzPDxRX0FWR0JJVFMpKSA+PiAoUV9BVkdCSVRTLWZhY3Rvcl9lKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjVGhyZXNoRXhwCmRlc2NyaXB0aW9uOiAgbG91ZG5lc3MgY2FsY3VsYXRpb24gKHRocmVzaG9sZCB0byB0aGUgcG93ZXIgb2YgcmVkRXhwKQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAoRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHRockV4cExkRGF0YTsKCiAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgIHRockV4cExkRGF0YSA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0+PjIgOwogICAgICAgICB0aHJFeHBbY2hdW3NmYkdycCtzZmJdID0gQ2FsY0ludkxkRGF0YSh0aHJFeHBMZERhdGEpOwogICAgICAgfQogICAgIH0KICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdE1pblNucgogICAgZGVzY3JpcHRpb246ICByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cgZW5lcmdpZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdE1pblNucihRQ19PVVRfQ0hBTk5FTCAgICAgKnFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICpwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQ2hhbm5lbHMpCnsKICBJTlQgY2gsIHNmYiwgc2ZiR3JwLCBuU2ZiOwogIEZJWFBfREJMIGF2Z0VuTEQ2NCwgZGJSYXRpbywgbWluU25yUmVkOwogIEZJWFBfREJMIG1pblNuckxpbWl0TEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4MjYyZik7IC8qIGxkNjQoMC44ZikgKi8KICBGSVhQX0RCTCBuU2ZiTEQ2NDsKICBGSVhQX0RCTCBhY2N1OwoKICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLwogICAgblNmYiA9IDA7CiAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICBhY2N1ICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PjY7CgkJCQkgblNmYisrOwoJCQkgfQogICAgfQoKICAgIGlmICgoYWNjdSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5TZmIgPT0gMCkpIHsKICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgfQogICAgZWxzZSB7CiAgICAgIG5TZmJMRDY0ICA9IENhbGNMZEludChuU2ZiKTsKICAgICAgYXZnRW5MRDY0ID0gQ2FsY0xkRGF0YShhY2N1KTsKICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0gblNmYkxENjQ7ICAvKiAwLjA5Mzc1ZjogY29tcGVuc2F0ZSBzaGlmdCB3aXRoIDYgKi8KICAgIH0KCiAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgIGlmICggKG1zYVBhcmFtLT5zdGFydFJhdGlvICsgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSA8IGF2Z0VuTEQ2NCApIHsKICAgICAgICAgIGRiUmF0aW8gPSBmTXVsdCgoYXZnRW5MRDY0IC0gcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSxGTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTZmKSk7IC8qIHNjYWxlZCBieSAoMS4wZi8oMTAuMGYqNjQuMGYpKSAqLwogICAgICAgICAgbWluU25yUmVkID0gbXNhUGFyYW0tPnJlZE9mZnMgKyBmTXVsdChtc2FQYXJhbS0+cmVkUmF0aW9GYWMsZGJSYXRpbyk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KICAgICAgICAgIG1pblNuclJlZCA9IGZpeE1heChtaW5TbnJSZWQsIG1zYVBhcmFtLT5tYXhSZWQpOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCiAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSAoZk11bHQocWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLG1pblNuclJlZCkpIDw8IDY7CiAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4obWluU25yTGltaXRMRDY0LCBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZwpkZXNjcmlwdGlvbjogIGRldGVybWluZSBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIG5vdCBuZWNlc3NhcnkgcmVzcC4gcG9zc2libGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICphaFBhcmFtKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHNmYkVuLCBzZmJFbm0xOwogICBGSVhQX0RCTCBzZmJFbkxkRGF0YTsKICAgRklYUF9EQkwgYXZnRW5MZERhdGE7CgogICAvKiBkZWNyZWFzZSBzcHJlYWQgZW5lcmd5IGJ5IDNkQiBmb3IgbG9uZyBibG9ja3MsIHJlc3AuIDJkQiBmb3Igc2hvcnRzCiAgICAgIChhdm9pZCBtb3JlIGhvbGVzIGluIGxvbmcgYmxvY2tzKSAqLwogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICBJTlQgc2ZiR3JwLCBzZmI7CiAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CgogICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQogICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQogICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID4+PSAxIDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQogICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQogICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID0KICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjNmKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdKSA7CiAgICAgIH0KICAgfQoKICAgLyogaW5jcmVhc2UgbWluU25yIGZvciBsb2NhbCBwZWFrcywgZGVjcmVhc2UgaXQgZm9yIHZhbGxleXMgKi8KICAgaWYgKGFoUGFyYW0tPm1vZGlmeU1pblNucikgewogICAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgRklYUF9EQkwgc2ZiRW5wMSwgYXZnRW47CiAgICAgICAgICAgICAgIGlmIChzZmIgPiAwKQogICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYi0xXTsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CgogICAgICAgICAgICAgICBpZiAoc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLTEpCiAgICAgICAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiKzFdOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTE+PjEpICsgKHNmYkVucDE+PjEpOwogICAgICAgICAgICAgICBhdmdFbkxkRGF0YSA9IENhbGNMZERhdGEoYXZnRW4pOwogICAgICAgICAgICAgICBzZmJFbiA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAvKiBwZWFrID8gKi8KICAgICAgICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4pIHsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhOwogICAgICAgICAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZT09TE9OR19XSU5ET1cpCiAgICAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1heCggU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLCAoRklYUF9EQkwpU25yTGRNaW4xICkgOwogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1heCggU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLCAoRklYUF9EQkwpU25yTGRNaW4zICkgOwoKICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPQogICAgICAgICAgICAgICAgICAgICBmaXhNaW4ocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sIHRtcE1pblNuckxkRGF0YSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLyogdmFsbGV5ID8gKi8KICAgICAgICAgICAgICAgaWYgKCAoKHNmYkVuTGREYXRhKyhGSVhQX0RCTClTbnJMZE1pbjQpIDwgKEZJWFBfREJMKWF2Z0VuTGREYXRhKSAmJiAoc2ZiRW4gPiBGTDJGWENPTlNUX0RCTCgwLjApKSApIHsKICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhID0gYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSAtKEZJWFBfREJMKVNuckxkTWluNCArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNaW4oKEZJWFBfREJMKVNuckxkRmFjLCB0bXBNaW5TbnJMZERhdGEpOwogICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbih0bXBNaW5TbnJMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBTbnJMZE1pbjIgKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKICAgICAgc2lkZSBjaGFubmVscyB0byBhdm9pZCBzcGVuZGluZyB1bm5vdGljYWJsZSBiaXRzICovCiAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbk0gID0gcWNPdXRDaGFubmVsWzBdOwogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhblMgID0gcWNPdXRDaGFubmVsWzFdOwogICAgICBQU1lfT1VUX0NIQU5ORUwqICBwc3lPdXRDaGFuTSAgPSBwc3lPdXRDaGFubmVsWzBdOwogICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuTS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5NLT5zZmJQZXJHcm91cCl7CiAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgIGlmICh0b29sc0luZm8tPm1zTWFza1tzZmJHcnArc2ZiXSkgewogICAgICAgICAgICAgRklYUF9EQkwgbWF4U2ZiRW5MZCA9IGZpeE1heChxY091dENoYW5NLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0scWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgIEZJWFBfREJMIG1heFRockxkLCBzZmJNaW5TbnJUbXBMZDsKCiAgICAgICAgICAgICBpZiAoICgoU25yTGRNaW41Pj4xKSArIChtYXhTZmJFbkxkPj4xKSArIChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpCiAgICAgICAgICAgICAgIG1heFRockxkID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpIDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgbWF4VGhyTGQgPSBTbnJMZE1pbjUgKyBtYXhTZmJFbkxkICsgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwoKICAgICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBtYXhUaHJMZCAtIHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLHNmYk1pblNuclRtcExkKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSwgKEZJWFBfREJMKVNuckxkRmFjKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gbWF4VGhyTGQgLSBxY091dENoYW5TLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWF4KHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxzZmJNaW5TbnJUbXBMZCk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sKEZJWFBfREJMKVNuckxkRmFjKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gcHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgaWYgKChxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA+IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdKQogICAgICAgICAgICAgIHx8IChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfSU5BQ1RJVkU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgIH0KfQoKCgovKioKICogXGJyaWVmICBDYWxjdWxhdGUgY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMuCiAqCiAqIFxwYXJhbSBwZURhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBQRSBkYXRhIG9mIGN1cnJlbnQgZWxlbWVudC4KICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCiAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCiAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVsZW1lbnQuCiAqIFxwYXJhbSBwZU9mZnNldCAgICAgICAgICAgICAgRml4ZWQgUEUgb2Zmc2V0IGRlZmluZWQgd2hpbGUgRkRLYWFjRW5jX0FkalRockluaXQoKSBkZXBlbmRpbmcgb24gYml0cmF0ZS4KICoKICogXHJldHVybiAgdm9pZAogKi8Kc3RhdGljCnZvaWQgRkRLYWFjRW5jX3ByZXBhcmVQZShQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgIGNvbnN0IElOVCBwZU9mZnNldCkKewogICAgSU5UIGNoOwoKICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKICAgICAgICBGREthYWNFbmNfcHJlcGFyZVNmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAogICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YSwKICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0cywKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiQ250LAogICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXApOwogICAgfQogICAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKfQoKLyoqCiAqIFxicmllZiAgQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgZm9yIHRocmVzaG9sZCBhZGp1c3RtZW50LgogKgogKiBDYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciB0byBiZSBhcHBsaWVkIGF0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGluIGxkNjQgZm9ybWF0LgogKgogKiBccGFyYW0gcGVEYXRhLCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUEUgZGF0YSBpbiBjdXJyZW50IGVsZW1lbnQuCiAqIFxwYXJhbSBwc3lPdXRDaGFubmVsICAgICAgICAgUG9pbnRlciB0byBQU1lfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gdG9vbHNJbmZvICAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9vbHMgaW5mbyBzdHJ1Y3Qgb2YgY3VycmVudCBlbGVtZW50LgogKiBccGFyYW0gYWRqVGhyU3RhdGVFbGVtZW50ICAgIFBvaW50ZXIgdG8gQVRTX0VMRU1FTlQgaG9sZGluZyBlbkZhY1BhdGNoIHN0YXRlcy4KICogXHBhcmFtIG5DaGFubmVscyAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gZWxlbWVudC4KICogXHBhcmFtIHVzZVBhdGNoVG9vbCAgICAgICAgICBBcHBseSB0aGUgd2VpZ2h0aW5nIHRvb2wgMCAobm8pIGVsc2UgKHllcykuCiAqCiAqIFxyZXR1cm4gIHZvaWQKICovCnN0YXRpYwp2b2lkIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlUGF0Y2hUb29sKQp7CiAgICBpbnQgY2gsIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gVFJVRTsKICAgIElOVCBleGVQYXRjaE0gPSAwOwoKICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgICAgIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIEZES21lbWNsZWFyKHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGQsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKICAgIH0KCiAgICBpZiAodXNlUGF0Y2hUb29sPT0wKSB7CiAgICAgICAgcmV0dXJuOyAvKiB0b29sIGlzIGRpc2FibGVkICovCiAgICB9CgogICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKCiAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CgogICAgICAgIGlmIChub1Nob3J0V2luZG93SW5GcmFtZSkgeyAvKiByZXRhaW4gZW5lcmd5IHJhdGlvIGJldHdlZW4gYmxvY2tzIG9mIGRpZmZlcmVudCBsZW5ndGggKi8KCiAgICAgICAgICAgIEZJWFBfREJMIG5yZ1N1bTE0LCBucmdTdW0xMiwgbnJnU3VtMzQsIG5yZ1RvdGFsOwogICAgICAgICAgICBGSVhQX0RCTCBucmdGYWNMZF8xNCwgbnJnRmFjTGRfMTIsIG5yZ0ZhY0xkXzM0OwogICAgICAgICAgICBJTlQgdXNlUGF0Y2gsIGV4ZVBhdGNoOwogICAgICAgICAgICBpbnQgc2ZiLCBzZmJHcnAsIG5MaW5lc1N1bSA9IDA7CgogICAgICAgICAgICBucmdTdW0xNCA9IG5yZ1N1bTEyID0gbnJnU3VtMzQgPSBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICAgICAgICAvKiBjYWxjdWxhdGUgZmxhdG5lc3Mgb2YgYXVkaWJsZSBzcGVjdHJ1bSwgaS5lLiBzcGVjdHJ1bSBhYm92ZSBtYXNraW5nIHRocmVzaG9sZC4gKi8KICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzEyID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpOyAvKiBucmdeKDEvMikgKi8KICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzE0ID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjIpOyAvKiBucmdeKDEvNCkgKi8KCiAgICAgICAgICAgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBiYW5kcyBpcyA2NCwgcmVzdWx0cyBzY2FsaW5nIGZhY3RvciA2ICovCiAgICAgICAgICAgICAgICBuTGluZXNTdW0gKz0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgIC8qIHJlbGV2YW50IGxpbmVzICovCiAgICAgICAgICAgICAgICBucmdUb3RhbCAgKz0gKCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPj4gNiApOyAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmcgKi8KICAgICAgICAgICAgICAgIG5yZ1N1bTEyICArPSAoIG5yZ0ZhYzEyID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMi80KSAqLwogICAgICAgICAgICAgICAgbnJnU3VtMTQgICs9ICggbnJnRmFjMTQgPj4gNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigxLzQpICovCiAgICAgICAgICAgICAgICBucmdTdW0zNCAgKz0gKCBmTXVsdChucmdGYWMxNCwgbnJnRmFjMTIpID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDMvNCkgKi8KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5yZ1RvdGFsID0gQ2FsY0xkRGF0YShucmdUb3RhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBsZDY0IG9mIHRvdGFsIG5yZyAqLwoKICAgICAgICAgICAgbnJnRmFjTGRfMTQgPSBDYWxjTGREYXRhKG5yZ1N1bTE0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xNC9ucmdUb3RhbCkgKi8KICAgICAgICAgICAgbnJnRmFjTGRfMTIgPSBDYWxjTGREYXRhKG5yZ1N1bTEyKSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xMi9ucmdUb3RhbCkgKi8KICAgICAgICAgICAgbnJnRmFjTGRfMzQgPSBDYWxjTGREYXRhKG5yZ1N1bTM0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0zNC9ucmdUb3RhbCkgKi8KCiAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0gRkRLbWF4KCBGTDJGWENPTlNUX0RCTCgwLjE4NzVmKSwgZkRpdk5vcm0obkxpbmVzU3VtLHBzeU91dENoYW4tPnNmYk9mZnNldHNbcHN5T3V0Q2hhbi0+c2ZiQ250XSkgKTsKCiAgICAgICAgICAgIHVzZVBhdGNoID0gKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpKTsKICAgICAgICAgICAgZXhlUGF0Y2ggPSAoKHVzZVBhdGNoKSAmJiAoYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0pKTsKCiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CgogICAgICAgICAgICAgICAgSU5UIHNmYkV4ZVBhdGNoOwoKICAgICAgICAgICAgICAgIC8qIGZvciBNUyBjb3VwbGVkIFNGQnMsIGFsc28gZXhlY3V0ZSBwYXRjaCBpbiBzaWRlIGNoYW5uZWwgaWYgZG9uZSBpbiBtaWQgY2hhbm5lbCAqLwogICAgICAgICAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pKSB7CiAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaE07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZmJFeGVQYXRjaCA9IGV4ZVBhdGNoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggKHNmYkV4ZVBhdGNoKSAmJiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPkZMMkZYQ09OU1RfREJMKDAuZikpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHBhdGNoIGJhc2VkIG9uIHNwZWN0cmFsIGZsYXRuZXNzIGNhbGN1bGF0ZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPiBGTDJGWENPTlNUX0RCTCgwLjgxMjVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMTQgKyAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKyhwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKSk+PjEgKTsgLyogc2ZiRW5lcmd5XigzLzQpICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43OTY4NzVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMTIgKyBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pPj4xICk7ICAgICAgICAgIC8qIHNmYkVuZXJneV4oMi80KSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzM0ICsgKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpPj4xICk7ICAgICAvKiBzZmJFbmVyZ3leKDEvNCkgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdLChGSVhQX0RCTCkwKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHNmYiBsb29wICovCgogICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmxhc3RFbkZhY1BhdGNoW2NoXSA9IHVzZVBhdGNoOwogICAgICAgICAgICBleGVQYXRjaE0gPSBleGVQYXRjaDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qICFub1Nob3J0V2luZG93SW5GcmFtZSAqLwogICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNzVmKTsKICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSBUUlVFOyAvKiBhbGxvdyB1c2Ugb2Ygc2ZiRW5GYWMgcGF0Y2ggaW4gdXBjb21pbmcgZnJhbWUgKi8KICAgICAgICB9CgogICAgfSAvKiBjaCBsb29wICovCgp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY1BlCmRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlIHBlIGZvciBib3RoIGNoYW5uZWxzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMKdm9pZCBGREthYWNFbmNfY2FsY1BlKFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICBJTlQgY2g7CgogICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7CiAgIHBlRGF0YS0+Y29uc3RQYXJ0ID0gMDsKICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgPSAwOwogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwogICAgICBGREthYWNFbmNfY2FsY1NmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAogICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250LAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzQm9vaywKICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlKTsKCiAgICAgIHBlRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+cGU7CiAgICAgIHBlRGF0YS0+Y29uc3RQYXJ0ICs9IHBlQ2hhbkRhdGEtPmNvbnN0UGFydDsKICAgICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgKz0gcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzOwogICB9Cn0KCnZvaWQgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgLyogY29uc3RhbnRzIHRoYXQgd2lsbCBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucyAqLwogIEZES2FhY0VuY19wcmVwYXJlUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIG5DaGFubmVscywgYWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CgogIC8qIGNhbGN1bGF0ZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aHJlc2hvbGQgYWRqdXN0bWVudCAqLwogIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCB0b29sc0luZm8sIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzLCAxKTsKewogICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCiAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KICAgIGludCBjaDsKICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIGludCBzZmIsIHNmYkdycDsKICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcFFjT3V0Q2ggPSBxY091dENoYW5uZWxbY2hdOwoKICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgIHBRY091dENoLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmIrc2ZiR3JwXSA9IHBRY091dENoLT5zZmJFbmVyZ3lMZERhdGFbc2ZiK3NmYkdycF0gLSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSAgICAgLT0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgogIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCiAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgKZGVzY3JpcHRpb246ICBzdW0gdGhlIHBlIGRhdGEgb25seSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKElOVCAqcGUsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdFBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICpuQWN0aXZlTGluZXMsCiAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICAgSU5UIGNoLCBzZmIsc2ZiR3JwOwoKICAgIElOVCBwZV90bXAgPSBwZURhdGEtPm9mZnNldDsKICAgIElOVCBjb25zdFBhcnRfdG1wID0gMDsKICAgIElOVCBuQWN0aXZlTGluZXNfdG1wID0gMDsKICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKICAgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgICAgICBpZihhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgcGVfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0UGFydF90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgIG5BY3RpdmVMaW5lc190bXAgKz0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KICAgICpwZSA9IHBlX3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CiAgICAqY29uc3RQYXJ0ID0gY29uc3RQYXJ0X3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CgoJKm5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lc190bXA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUgpkZXNjcmlwdGlvbjogIGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgbGltaXRUaHJSZWR1Y2VkTGREYXRhID0gKEZJWFBfREJMKTB4MDAwMDgwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLcG93KDIuMCwtTERfREFUQV9TQ0FMSU5HLzQuMCkpOyovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHJlZFZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiByZWRWYWxTY2FsaW5nKQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CiAgIEZJWFBfREJMIHNmYlRockV4cDsKCiAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOwogICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICBzZmJFbkxkRGF0YSAgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICBzZmJUaHJMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgc2ZiVGhyRXhwICAgID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXTsKICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gQUhfQUNUSVZFKSkgewoKICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhOgogICAgICAgICAgICAgZmxvYXQgdG1wID0gdGhyRXhwW2NoXVtzZmJdK3JlZFZhbDsKICAgICAgICAgICAgIHRtcCAqPSB0bXA7CiAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gdG1wKnRtcDsKICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW50IG1pblNjYWxlID0gZml4TWluKENvdW50TGVhZGluZ0JpdHMoc2ZiVGhyRXhwKSwgQ291bnRMZWFkaW5nQml0cyhyZWRWYWwpIC0gKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZykgKS0xOwoKICAgICAgICAgICAgLyogNCpsb2coIHNmYlRockV4cCArIHJlZFZhbCApICovCiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKGZBYnMoc2NhbGVWYWx1ZShzZmJUaHJFeHAsIG1pblNjYWxlKSArIHNjYWxlVmFsdWUocmVkVmFsLChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpK21pblNjYWxlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwogICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwoKICAgICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KICAgICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCiAgICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7CiAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwogICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KICAgICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSsoRklYUF9EQkwpTUFYVkFMX0RCTCkgPiBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSl7CiAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KHNmYlRoclJlZHVjZWRMZERhdGEsIChzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICB9Cn0KCi8qIHNpbWlsYXIgdG8gcHJlcGFyZVNmYlBlMSgpICovCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZShQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRm9ybUZhY3RvckxkRGF0YSkKewogICNkZWZpbmUgU0NBTEVfRk9STV9GQUMgICAgICg0KSAgICAvKiAoU0NBTEVfRk9STV9GQUMrRk9STV9GQUNfU0hJRlQpID49IGxkKEZSQU1FX0xFTkdUSCkqLwogICNkZWZpbmUgU0NBTEVfTlJHUyAgICAgICAgICg4KQogICNkZWZpbmUgU0NBTEVfTkxJTkVTICAgICAgKDE2KQogICNkZWZpbmUgU0NBTEVfTlJHU19TUVJUNCAgICgyKSAgICAvKiAwLjI1ICogU0NBTEVfTlJHUyAqLwogICNkZWZpbmUgU0NBTEVfTkxJTkVTX1AzNCAgKDEyKSAgICAvKiAwLjc1ICogU0NBTEVfTkxJTkVTICovCgogIElOVCAgIHNmYkdycCwgc2ZiOwogIEZJWFBfREJMIGNoYW9zTWVhc3VyZTsKICBJTlQgZnJhbWVOTGluZXMgPSAwOwogIEZJWFBfREJMIGZyYW1lRm9ybUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgRklYUF9EQkwgZnJhbWVFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKICAgICAgaWYgKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IHBzeU91dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkgewogICAgICAgIGZyYW1lRm9ybUZhY3RvciArPSAoQ2FsY0ludkxkRGF0YShzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdKT4+U0NBTEVfRk9STV9GQUMpOwogICAgICAgIGZyYW1lTkxpbmVzICAgICArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiKzFdIC0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiXSk7CiAgICAgICAgZnJhbWVFbmVyZ3kgICAgICs9IChwc3lPdXRDaGFubmVsLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX05SR1MpOwogICAgICB9CiAgICB9CiAgfQoKICBpZihmcmFtZU5MaW5lcyA+IDApewoKICAgIC8qICBmcmFtZU5BY3RpdmVMaW5lcyA9IGZyYW1lRm9ybUZhY3RvcioyXkZPUk1fRkFDX1NISUZUICogKChmcmFtZUVuZXJneSAqMl5TQ0FMRV9OUkdTKS9mcmFtZU5MaW5lcyleLTAuMjUKICAgICAgICBjaGFvc01lYXN1cmUgICAgICA9IGZyYW1lTkFjdGl2ZUxpbmVzIC8gZnJhbWVOTGluZXMgKi8KICAgIGNoYW9zTWVhc3VyZSA9CiAgICAgICAgICAgQ2FsY0ludkxkRGF0YSggKCgoQ2FsY0xkRGF0YShmcmFtZUZvcm1GYWN0b3IpPj4xKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YShmcmFtZUVuZXJneSk+PigyKzEpKSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSxDYWxjTGREYXRhKChGSVhQX0RCTClmcmFtZU5MaW5lczw8KERGUkFDVF9CSVRTLTEtU0NBTEVfTkxJTkVTKSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKEZJWFBfREJMKShTQ0FMRV9GT1JNX0ZBQy1TQ0FMRV9OUkdTX1NRUlQ0K0ZPUk1fRkFDX1NISUZULShTQ0FMRV9OTElORVNfUDM0KSk8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKT4+MSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTw8MSApOwogIH0gZWxzZSB7CgogICAgLyogYXNzdW1pbmcgdG90YWwgY2hhb3MsIGlmIG5vIHNmYiBpcyBhYm92ZSB0aHJlc2hvbGRzICovCiAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogIH0KCiAgcmV0dXJuIGNoYW9zTWVhc3VyZTsKfQoKLyogYXBwbHkgcmVkdWN0aW9uIGZvcm11bGEgZm9yIFZCUi1tb2RlICovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgdmJyUXVhbEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogY2hhb3NNZWFzdXJlT2xkKQp7CiAgSU5UIGNoLCBzZmJHcnAsIHNmYjsKICBGSVhQX0RCTCBjaEdyb3VwRW5lcmd5W1RSQU5TX0ZBQ11bMl07LyplbmVyZ3kgZm9yIGVhY2ggZ3JvdXAgYW5kIGNoYW5uZWwqLwogIEZJWFBfREJMIGNoQ2hhb3NNZWFzdXJlWzJdOwogIEZJWFBfREJMIGZyYW1lRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMWUtMTBmKTsKICBGSVhQX0RCTCBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRockV4cDsKICBGSVhQX0RCTCBzZmJUaHJSZWR1Y2VkTGREYXRhOwogIEZJWFBfREJMIGNoYW9zTWVhc3VyZUF2ZzsKICBJTlQgZ3JvdXBDbnQ7IC8qIGxvb3AgY291bnRlciAqLwogIEZJWFBfREJMIHJlZFZhbFtUUkFOU19GQUNdOyAvKiByZWR1Y3Rpb24gdmFsdWVzOyBpbiBzaG9ydC1ibG9jayBjYXNlIG9uZSByZWRWYWwgZm9yIGVhY2ggZ3JvdXAgKi8KICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiAgPSBOVUxMOwogIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gTlVMTDsKCiNkZWZpbmUgU0NBTEVfR1JPVVBfRU5FUkdZICAgKDgpCgojZGVmaW5lIENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18wICAoRkwyRlhDT05TVF9EQkwoMC4yNWYpKQojZGVmaW5lIENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xICAoRkwyRlhDT05TVF9EQkwoMS5mLTAuMjVmKSkKCiNkZWZpbmUgTUlOX0xEVEhSRVNIICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSkKCgogIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspewogICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOwoKICAgIC8qIGFkZGluZyB1cCBlbmVyZ3kgZm9yIGVhY2ggY2hhbm5lbCBhbmQgZWFjaCBncm91cCBzZXBhcmF0ZWx5ICovCiAgICBGSVhQX0RCTCBjaEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICBncm91cENudD0wOwoKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7CiAgICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdICs9IChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX0dST1VQX0VORVJHWSk7CiAgICAgIH0KICAgICAgY2hFbmVyZ3kgKz0gY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdOwogICAgfQogICAgZnJhbWVFbmVyZ3kgKz0gY2hFbmVyZ3k7CgogICAgLyogY2hhb3NNZWFzdXJlICovCiAgICBpZiAocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewogICAgICBjaENoYW9zTWVhc3VyZVtjaF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgLyogYXNzdW1lIGEgY29uc3RhbnQgY2hhb3MgbWVhc3VyZSBvZiAwLjVmIGZvciBzaG9ydCBibG9ja3MgKi8KICAgIH0gZWxzZSB7CiAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKHBzeU91dENoYW5uZWxbY2hdLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhKTsKICAgIH0KICAgIGNoYW9zTWVhc3VyZSArPSBmTXVsdChjaENoYW9zTWVhc3VyZVtjaF0sIGNoRW5lcmd5KTsKICB9CgogIGlmKGZyYW1lRW5lcmd5ID4gY2hhb3NNZWFzdXJlKSB7CiAgICBJTlQgc2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoZnJhbWVFbmVyZ3kpIC0gMTsKICAgIEZJWFBfREJMIG51bSAgID0gY2hhb3NNZWFzdXJlPDxzY2FsZTsKICAgIEZJWFBfREJMIGRlbnVtID0gZnJhbWVFbmVyZ3k8PHNjYWxlOwogICAgY2hhb3NNZWFzdXJlICAgPSBzY2h1cl9kaXYobnVtLGRlbnVtLDE2KTsKICB9CiAgZWxzZSB7CiAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogIH0KCiAgY2hhb3NNZWFzdXJlQXZnID0gZk11bHQoQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzAsIGNoYW9zTWVhc3VyZSkgKwogICAgICAgICAgICAgICAgICAgIGZNdWx0KENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xLCAqY2hhb3NNZWFzdXJlT2xkKTsgICAgICAvKiBhdmVyYWdpbmcgY2hhb3MgbWVhc3VyZSAqLwogICpjaGFvc01lYXN1cmVPbGQgPSBjaGFvc01lYXN1cmUgPSAoZml4TWluKGNoYW9zTWVhc3VyZSwgY2hhb3NNZWFzdXJlQXZnKSk7ICAvKiB1c2UgbWluLXZhbHVlLCBzYWZlIGZvciBuZXh0IGZyYW1lICovCgogIC8qIGNoYXJhY3RlcmlzdGljIGN1cnZlCiAgICAgY2hhb3NNZWFzdXJlID0gMC4yZiArIDAuN2YvMC4zZiAqIChjaGFvc01lYXN1cmUgLSAwLjJmKTsKICAgICBjaGFvc01lYXN1cmUgPSBmaXhNaW4oMS4wZiwgZml4TWF4KDAuMWYsIGNoYW9zTWVhc3VyZSkpOwogICAgIGNvbnN0YW50cyBzY2FsZWQgYnkgNC5mCiAgKi8KICBjaGFvc01lYXN1cmUgPSAoKEZMMkZYQ09OU1RfREJMKDAuMmYpPj4yKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YvKDQuZiowLjNmKSksIChjaGFvc01lYXN1cmUgLSBGTDJGWENPTlNUX0RCTCgwLjJmKSkpKTsKICBjaGFvc01lYXN1cmUgPSAoZml4TWluKChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMS4wZik+PjIpLCBmaXhNYXgoKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgwLjFmKT4+MiksIGNoYW9zTWVhc3VyZSkpKTw8MjsKCiAgLyogY2FsY3VsYXRpb24gb2YgcmVkdWN0aW9uIHZhbHVlICovCiAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpeyAvKiBzaG9ydC1ibG9ja3MgKi8KICAgIEZES19BU1NFUlQoVFJBTlNfRkFDPT04KTsKICAgICNkZWZpbmUgICBXSU5fVFlQRV9TQ0FMRSAgICgzKQoKICAgIElOVCBzZmJHcnAsIGdyb3VwQ250PTA7CiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwLGdyb3VwQ250KyspIHsKCiAgICAgIEZJWFBfREJMIGdyb3VwRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgICAgIGZvcihjaD0wO2NoPG5DaGFubmVscztjaCsrKXsKICAgICAgICBncm91cEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07ICAgLyogYWRkaW5nIHVwIHRoZSBjaGFubmVscyBncm91cEVuZXJneSAqLwogICAgICB9CgogICAgICBGREtfQVNTRVJUKHBzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XTw9SU5WX0lOVF9UQUJfU0laRSk7CiAgICAgIGdyb3VwRW5lcmd5ID0gZk11bHQoZ3JvdXBFbmVyZ3ksaW52SW50W3BzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XV0pOyAgLyogY29ycmVjdGlvbiBvZiBncm91cCBlbmVyZ3kgKi8KICAgICAgZ3JvdXBFbmVyZ3kgPSBmaXhNaW4oZ3JvdXBFbmVyZ3ksIGZyYW1lRW5lcmd5Pj5XSU5fVFlQRV9TQ0FMRSk7ICAgICAgICAgICAgICAgICAvKiBkbyBub3QgYWxsb3cgYW4gaGlnaGVyIHJlZFZhbCBhcyBjYWxjdWxhdGVkIGZyYW1ld2lzZSAqLwoKICAgICAgZ3JvdXBFbmVyZ3k+Pj0yOyAvKiAyKldJTl9UWVBFX1NDQUxFID0gNiA9PiA2KzIgPSA4ID09PiA4LzQgPSBpbnQgbnVtYmVyICovCgogICAgICByZWRWYWxbZ3JvdXBDbnRdID0gZk11bHQoZk11bHQodmJyUXVhbEZhY3RvcixjaGFvc01lYXN1cmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGdyb3VwRW5lcmd5KT4+MikgKQogICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGludCkoICggMiArICgyKldJTl9UWVBFX1NDQUxFKSArIFNDQUxFX0dST1VQX0VORVJHWSApPj4yICkgOwoKICAgIH0KICB9IGVsc2UgeyAvKiBsb25nLWJsb2NrICovCgogICAgcmVkVmFsWzBdID0gZk11bHQoIGZNdWx0KHZiclF1YWxGYWN0b3IsY2hhb3NNZWFzdXJlKSwKICAgICAgICAgICAgICAgICAgICAgICBDYWxjSW52TGREYXRhKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpPj4yKSApCiAgICAgICAgICAgICAgICA8PCAoaW50KSggU0NBTEVfR1JPVVBfRU5FUkdZPj4yICkgOwogIH0KCiAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CiAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOwoKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7CgogICAgICAgIHNmYkVuTGREYXRhICA9IChxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICBzZmJUaHJMZERhdGEgPSAocWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pOwogICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07CgogICAgICAgIGlmICggKHNmYlRockxkRGF0YT49TUlOX0xEVEhSRVNIKSAmJiAoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IEFIX0FDVElWRSkpIHsKCiAgICAgICAgICAvKiBTaG9ydC1XaW5kb3cgKi8KICAgICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewogICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBOdW1iZXIgPSAoaW50KSBzZmIvcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7CgogICAgICAgICAgICBGREtfQVNTRVJUKElOVl9TUVJUNF9UQUJfU0laRT5wc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl0pOwoKICAgICAgICAgICAgc2ZiVGhyRXhwID0gZk11bHQoc2ZiVGhyRXhwLCBmTXVsdCggRkwyRlhDT05TVF9EQkwoMi44MmYvNC5mKSwgaW52U3FydDRbcHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdXSkpPDwyIDsKCiAgICAgICAgICAgIGlmICggc2ZiVGhyRXhwIDw9IChsaW1pdFRoclJlZHVjZWRMZERhdGEtcmVkVmFsW2dyb3VwTnVtYmVyXSkgKSB7CiAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbZ3JvdXBOdW1iZXJdID49IEZMMkZYQ09OU1RfREJMKDEuMGYpLXNmYlRockV4cCkKICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShzZmJUaHJFeHAgKyByZWRWYWxbZ3JvdXBOdW1iZXJdKTsKICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgKz0gKCBDYWxjTGRJbnQocHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTY8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKSApOwogICAgICAgICAgfQoKICAgICAgICAgIC8qIExvbmctV2luZG93ICovCiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbMF0gPj0gRkwyRlhDT05TVF9EQkwoMS4wZiktc2ZiVGhyRXhwKSB7CiAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLwogICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKHNmYlRockV4cCArIHJlZFZhbFswXSk7CiAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCiAgICAgICAgICBpZiAoICgoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhKSA+IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICkKICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICA+IChGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBzZmJFbkxkRGF0YSkgKXsKICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CiAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHNmYlRoclJlZHVjZWRMZERhdGE8RkwyRlhDT05TVF9EQkwoLTAuNWYpKQogICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CgogICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLwogICAgICAgICAgaWYgKChzZmJFbkxkRGF0YStGTDJGWENPTlNUX0RCTCgxLjBmKSkgPiBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSl7CiAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoc2ZiVGhyUmVkdWNlZExkRGF0YSwgc2ZiRW5MZERhdGEgLSBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSk7CiAgICAgICAgICB9CgogICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChNSU5fTERUSFJFU0gsc2ZiVGhyUmVkdWNlZExkRGF0YSk7CgogICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2gKZGVzY3JpcHRpb246ICBpZiBwZSBkaWZmZXJlbmNlIGRlbHRhUGUgYmV0d2VlbiBkZXNpcmVkIHBlIGFuZCByZWFsIHBlIGlzIHNtYWxsIGVub3VnaCwKdGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRpc3RyaWJ1dGVkIGFtb25nIHRoZSBzY2FsZSBmYWN0b3IgYmFuZHMuCk5ldyB0aHJlc2hvbGRzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcyBwZS1kaWZmZXJlbmNlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfY29ycmVjdFRocmVzaChDSEFOTkVMX01BUFBJTkcqIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICB0aHJFeHBbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBGSVhQX0RCTCByZWRWYWxbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIFNDSEFSIHJlZFZhbFNjYWxpbmdbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBkZWx0YVBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBlbGVtZW50T2Zmc2V0KQp7CiAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW47CiAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhOwogICBGSVhQX0RCTCB0aHJGYWN0b3JMZERhdGE7CiAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CiAgIEZJWFBfREJMICpzZmJQZUZhY3RvcnNMZERhdGFbKDgpXVsoMildOwogICBGSVhQX0RCTCBzZmJOQWN0aXZlTGluZXNMZERhdGFbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl07CiAgIElOVCAgICAgIG5vcm1GYWN0b3JJbnQ7CiAgIEZJWFBfREJMIG5vcm1GYWN0b3JMZERhdGE7CgogICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CiAgIElOVCBlbGVtZW50SWQ7CgogICAvKiBzY3JhdGNoIGlzIGVtcHR5OyB1c2UgdGVtcG9yYWwgbWVtb3J5IGZyb20gcXVhbnRTcGVjIGluIFFDX09VVF9DSEFOTkVMICovCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICBTSE9SVCogcHRyID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYzsKICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXSA9IChGSVhQX0RCTCopcHRyOwogICAgIH0KICAgfQoKICAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLwogICBub3JtRmFjdG9ySW50ID0gMDsKCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CgogICAgICAgICAgcWNPdXRDaGFuID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICBwc3lPdXRDaGFuID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKICAgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKCiAgICAgICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKCiAgICAgICAgICAgICBpZiAoIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9PSAwICkgewogICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBCb3RoIENhbGNMZEludCBhbmQgQ2FsY0xkRGF0YSBjYW4gYmUgdXNlZCEKICAgICAgICAgICAgICAgICAqIE5vIG9mZnNldCBoYXMgdG8gYmUgc3VidHJhY3RlZCwgYmVjYXVzZSBzZmJOQWN0aXZlTGluZXNMZERhdGEKICAgICAgICAgICAgICAgICAqIGlzIHNob3J0ZWQgd2hpbGUgdGhyRmFjdG9yIGNhbGN1bGF0aW9uICovCiAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBDYWxjTGRJbnQocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICggKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPCBBSF9BQ1RJVkUpIHx8IChkZWx0YVBlID4gMCkpICYmCiAgICAgICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gIT0gMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gLXJlZFZhbFtlbGVtZW50SWRdKSB7CgogICAgICAgICAgICAgICAgICAgLyogc2ZiUGVGYWN0b3JzW2NoXVtzZmJHcnArc2ZiXSA9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsW2VsZW1lbnRJZF0pOyAqLwoKICAgICAgICAgICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSksIENvdW50TGVhZGluZ0JpdHMocmVkVmFsW2VsZW1lbnRJZF0pIC0gKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKSApIC0gMTsKCiAgICAgICAgICAgICAgICAgICAvKiBzdW1sZCA9IGxkNjQoIHNmYlRockV4cCArIHJlZFZhbCApICovCiAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzdW1MZCA9IENhbGNMZERhdGEoc2NhbGVWYWx1ZSh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0sIG1pblNjYWxlKSArIHNjYWxlVmFsdWUocmVkVmFsW2VsZW1lbnRJZF0sIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSkrbWluU2NhbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwoKICAgICAgICAgICAgICAgICAgIGlmIChzdW1MZCA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpICsgc3VtTGQpICkgewogICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgbm9ybUZhY3RvckludCArPSAoSU5UKUNhbGNJbnZMZERhdGEoc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMS4wZik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQoKICAgLyogbm9ybUZhY3RvckxkRGF0YSA9IGxkNjQoZGVsdGFQZS9ub3JtRmFjdG9ySW50KSAqLwogICBub3JtRmFjdG9yTGREYXRhID0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpKChkZWx0YVBlPDApID8gKC1kZWx0YVBlKSA6IChkZWx0YVBlKSkpIC0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpbm9ybUZhY3RvckludCk7CgogICAvKiBkaXN0cmlidXRlIHRoZSBwZSBkaWZmZXJlbmNlIHRvIHRoZSBzY2FsZWZhY3RvcnMKICAgICAgYW5kIGNhbGN1bGF0ZSB0aGUgYWNjb3JkaW5nIHRocmVzaG9sZHMgKi8KICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgcHN5T3V0Q2hhbiA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CgogICAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewoKICAgICAgICAgICAgICBpZiAocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID4gMCkgewoKICAgICAgICAgICAgICAgICAvKiBwZSBkaWZmZXJlbmNlIGZvciB0aGlzIHNmYiAqLwogICAgICAgICAgICAgICAgIGlmICggKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXT09RkwyRlhDT05TVF9EQkwoLTEuMGYpKSB8fAogICAgICAgICAgICAgICAgICAgICAgKGRlbHRhUGU9PTApICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB0aHJGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IENhbGNJbnZMZERhdGEoc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsgbm9ybUZhY3RvckxkRGF0YSAtIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIEZMMkZYQ09OU1RfREJMKChmbG9hdClMRF9EQVRBX1NISUZUL0xEX0RBVEFfU0NBTElORykpOwoKICAgICAgICAgICAgICAgICAgIC8qIGxpbWl0IHRockZhY3RvciB0byA2MGRCICovCiAgICAgICAgICAgICAgICAgICB0bXAgPSAoZGVsdGFQZTwwKSA/IHRtcCA6ICgtdG1wKTsKICAgICAgICAgICAgICAgICAgIHRockZhY3RvckxkRGF0YSA9IEZES21pbih0bXAsIEZMMkZYQ09OU1RfREJMKDIwLmYvTERfREFUQV9TQ0FMSU5HKSk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCiAgICAgICAgICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICAgICAgc2ZiRW5MZERhdGEgID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgICAgaWYgKHRockZhY3RvckxkRGF0YSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgICAgICAgICAgICAgIGlmKCBzZmJUaHJMZERhdGEgPiAoRkwyRlhDT05TVF9EQkwoLTEuZiktdGhyRmFjdG9yTGREYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIC8qIGF2b2lkIGhvbGUgKi8KICAgICAgICAgICAgICAgICBpZiAoIChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSkgJiYKICAgICAgICAgICAgICAgICAgICAgIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPT0gQUhfSU5BQ1RJVkUpICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogc2ZiVGhyUmVkdWNlZCA9IG1heChwc3lPdXRDaGFuW2NoXS0+c2ZiTWluU25yW2ldICogc2ZiRW4sIHNmYlRocik7ICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJFbkxkRGF0YSA+IChzZmJUaHJMZERhdGEtcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICkgewogICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIKICAgIGRlc2NyaXB0aW9uOiAgaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCByZWR1Y2UgcGUgYnkKICAgICAgICAgICAgICAgICAgcmVkdWNpbmcgbWluU25yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVzaXJlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiAgICAgICAgICAgICByZWRQZUdsb2JhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCgp7CiAgIElOVCBlbGVtZW50SWQ7CiAgIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKCiAgIElOVCBuZXdHbG9iYWxQZSA9ICpyZWRQZUdsb2JhbDsKCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICBJTlQgY2g7CiAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbMl07CiAgICAgICBJTlQgc2ZiQ250WzJdOwogICAgICAgSU5UIHNmYlBlckdyb3VwWzJdOwoKICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xOwogICAgICAgICBzZmJDbnRbY2hdICAgICAgICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CiAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwogICAgICAgfQoKICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewoKICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgICBJTlQgbm9SZWR1Y3Rpb24gPSAxOwoKICAgICAgICAgICAgaWYgKG1heFNmYlBlckdyb3VwW2NoXT49MCkgeyAgLyogc2ZiIGluIG5leHQgY2hhbm5lbCAqLwogICAgICAgICAgICAgIElOVCBkZWx0YVBlID0gMDsKICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKICAgICAgICAgICAgICBub1JlZHVjdGlvbiA9IDA7CgogICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoXTsgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoXSkgewoKICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUggJiYKICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8IFNuckxkRmFjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvKiBpbmNyZWFzZSB0aHJlc2hvbGQgdG8gbmV3IG1pblNuciBvZiAxZEIgKi8KICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBTbnJMZEZhYzsKCiAgICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLCBzZmJUaHIpOyAqLwogICAgICAgICAgICAgICAgICBpZiAoIHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPj0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gLSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApIHsKCiAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwoKICAgICAgICAgICAgICAgICAgICAgLyogY2FsYyBuZXcgcGUgKi8KICAgICAgICAgICAgICAgICAgICAgLyogQzIgKyBDMypsZCgxLzAuOCkgPSAxLjUgKi8KICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSAtPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKCiAgICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlID0gMS41ICogc2ZiTkxpbmVzICovCiAgICAgICAgICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0gPSAoMypwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYk5MaW5lc1tzZmJHcnArc2ZiXSkgPDwgKFBFX0NPTlNUUEFSVF9TSElGVC0xKTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSArPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgfSAvKiBzZmJHcnAgbG9vcCAqLwoKICAgICAgICAgICAgICBwZURhdGEtPnBlICs9IGRlbHRhUGU7CiAgICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5wZSArPSBkZWx0YVBlOwogICAgICAgICAgICAgIG5ld0dsb2JhbFBlICs9IGRlbHRhUGU7CgogICAgICAgICAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgICAgICAgaWYgKHBlRGF0YS0+cGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSAvKiBzZmIgPiAwICovCgogICAgICAgICAgICBpZiAoIChjaD09KGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLTEpKSAmJiBub1JlZHVjdGlvbiApIHsKICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgIH0gLyogY2ggbG9vcCAqLwoKICAgICAgIH0gd2hpbGUgKCBwZURhdGEtPnBlID4gZGVzaXJlZFBlKTsKCiAgICAgfSAvKiAhPSBJRF9EU0UgKi8KICAgfSAvKiBlbGVtZW50IGxvb3AgKi8KCgpiYWlsOgogICAvKiB1cGRhdGUgZ2xvYmFsIFBFICovCiAgICpyZWRQZUdsb2JhbCA9IG5ld0dsb2JhbFBlOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcwogICAgZGVzY3JpcHRpb246ICBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHNvbWUgbW9yZSBzY2FsZWZhY3RvcgogICAgICAgICAgICAgICAgICBiYW5kcyBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIGRlc2lyZWRQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBjdXJyZW50UGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIGVsZW1lbnRPZmZzZXQpCnsKICBJTlQgZWxlbWVudElkOwogIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKICBJTlQgYWN0UGUgPSBjdXJyZW50UGU7CgogIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKICAgIHJldHVybjsgLyogbm90aGluZyB0byBkbyAqLwogIH0KCiAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKCiAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogICAgICBjb25zdCBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CgogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildID0ge05VTEx9OwogICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKCiAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIC8qIGluaXQgcG9pbnRlcnMgKi8KICAgICAgICBxY091dENoYW5uZWxbY2hdID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOwoKICAgICAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgZm9yIChzZmI9cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KICAgICAgaWYgKCBuQ2hhbm5lbHM9PTIgJiYgcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlPT1wc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UgKSB7CgogICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsWzBdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbMF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICAgICAgIGlmIChwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mby5tc01hc2tbc2ZiR3JwK3NmYl0pIHsKICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9MID0gcWNPdXRDaGFubmVsWzBdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9SID0gcWNPdXRDaGFubmVsWzFdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBzaWRlIGNoYW5uZWwgPyAqLwogICAgICAgICAgICAgIGlmICggKGFoRmxhZ1tlbGVtZW50SWRdWzFdW3NmYkdycCtzZmJdICE9IE5PX0FIKSAmJgogICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzBdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQogICAgICAgICAgICAgICAgICAgICAgICA+ICgoRW5lcmd5TGRfUj4+MSkgLSAoRW5lcmd5TGRfTD4+MSkpKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9SOwogICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMV0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBtaWQgY2hhbm5lbCA/ICovCiAgICAgICAgICAgICAgZWxzZSBpZiAoIChhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzFdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKChFbmVyZ3lMZF9MPj4xKSAtIChFbmVyZ3lMZF9SPj4xKSkpICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdWzBdW3NmYkdycCtzZmJdID0gTk9fQUg7CiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKSArIEVuZXJneUxkX0w7CiAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVswXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOwogICAgICAgICAgICAgIH0gLyogaWYgKGFoRmxhZykgKi8KICAgICAgICAgICAgfSAvKiBpZiBNUyAqLwogICAgICAgICAgfSAvKiBzZmJHcnAgKi8KICAgICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgICAgfQogICAgICAgIH0gLyogc2ZiICovCiAgICAgIH0gLyogTVMgcG9zc2libGUgPyAqLwoKICAgICAgLyogbW9yZSBob2xlcyBuZWNlc3Nhcnk/IHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcwogICAgICAgICBzdGFydGluZyB3aXRoIGxvdyBlbmVyZ2llcyAqLwogICAgICBJTlQgc3RhcnRTZmJbMl07CiAgICAgIEZJWFBfREJMIGF2Z0VuTEQ2NCxtaW5FbkxENjQ7CiAgICAgIElOVCBhaENudDsKICAgICAgRklYUF9EQkwgYWhDbnRMRDY0OwogICAgICBJTlQgZW5JZHg7CiAgICAgIEZJWFBfREJMIGVuTEQ2NFs0XTsKICAgICAgRklYUF9EQkwgYXZnRW47CgogICAgICAvKiBkbyBub3QgZ28gYmVsb3cgc3RhcnRTZmIgKi8KICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICAgICAgICBzdGFydFNmYltjaF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYkw7CiAgICAgICAgZWxzZQogICAgICAgICAgc3RhcnRTZmJbY2hdID0gQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0uc3RhcnRTZmJTOwogICAgICB9CgogICAgICAvKiBjYWxjIGF2ZyBhbmQgbWluIGVuZXJnaWVzIG9mIGJhbmRzIHRoYXQgYXZvaWQgaG9sZXMgKi8KICAgICAgYXZnRW4gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgbWluRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIGFoQ250ID0gMDsKCiAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIHNmYkdycD0wOwogICAgICAgIHNmYj1zdGFydFNmYltjaF07CgogICAgICAgIGRvIHsKICAgICAgICAgIGZvciAoOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICBpZiAoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSE9Tk9fQUgpICYmCiAgICAgICAgICAgICAgICAocWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pKXsKICAgICAgICAgICAgICBtaW5FbkxENjQgPSBmaXhNaW4obWluRW5MRDY0LHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CiAgICAgICAgICAgICAgYXZnRW4gKz0gcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4+IDY7CiAgICAgICAgICAgICAgYWhDbnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CiAgICAgICAgICBzZmI9MDsKCiAgICAgICAgfSB3aGlsZSAoc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCk7CiAgICAgIH0KCiAgICAgIGlmICggKGF2Z0VuID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoYWhDbnQgPT0gMCkgKSB7CiAgICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgYXZnRW5MRDY0ID0gQ2FsY0xkRGF0YShhdmdFbik7CiAgICAgICAgYWhDbnRMRDY0ID0gQ2FsY0xkSW50KGFoQ250KTsKICAgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLSBhaENudExENjQ7IC8qIGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCiAgICAgIH0KCiAgICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLwogICAgICAvKiBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspICovCiAgICAgICAgLyogZW5bZW5JZHhdID0gbWluRW4gKiAoZmxvYXQpRkRLcG93KGF2Z0VuLyhtaW5FbitGTFRfTUlOKSwgKDIqZW5JZHgrMSkvNy4wZik7ICovCiAgICAgIGVuTEQ2NFswXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjE0Mjg1NzE0Mjg1ZikpOwogICAgICBlbkxENjRbMV0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC40Mjg1NzE0Mjg1N2YpKTsKICAgICAgZW5MRDY0WzJdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNzE0Mjg1NzE0MjhmKSk7CiAgICAgIGVuTEQ2NFszXSA9IG1pbkVuTEQ2NCArIChhdmdFbkxENjQtbWluRW5MRDY0KTsKCiAgICAgIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgewogICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7CgogICAgICAgIElOVCBtYXhTZmJQZXJHcm91cFsyXTsKICAgICAgICBJTlQgc2ZiQ250WzJdOwogICAgICAgIElOVCBzZmJQZXJHcm91cFsyXTsKCiAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xOwogICAgICAgICAgc2ZiQ250W2NoXSAgICAgICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OwogICAgICAgICAgc2ZiUGVyR3JvdXBbY2hdICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7CiAgICAgICAgfQoKICAgICAgICBkbyB7CgogICAgICAgICAgbm9SZWR1Y3Rpb24gPSAxOwoKICAgICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewoKICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwoKICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBsb3dlc3QgZW5lcmd5IGJvcmRlciBhdCBoaWdoZXN0IHNmYiAqLwogICAgICAgICAgICBpZiAobWF4U2ZiUGVyR3JvdXBbY2hdPj1zdGFydFNmYltjaF0pIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKICAgICAgICAgICAgICBub1JlZHVjdGlvbiA9IDA7CgogICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoXTsgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoXSkgewogICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLwogICAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCAmJiBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPCBlbkxENjRbZW5JZHhdKSB7CiAgICAgICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgKi8KICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gTk9fQUg7CiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gLyogc2ZiR3JwICAqLwoKICAgICAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8qIHNmYiA+IDAgKi8KICAgICAgICAgIH0gLyogY2ggbG9vcCAqLwoKICAgICAgICB9IHdoaWxlKCAobm9SZWR1Y3Rpb24gPT0gMCkgJiYgKGFjdFBlID4gZGVzaXJlZFBlKSApOwoKICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgfQoKICAgICAgfSAvKiBlbklkeCBsb29wICovCgogICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKfQoKLyogcmVzZXQgYXZvaWQgaG9sZSBmbGFncyBmcm9tIEFIX0FDVElWRSB0byBBSF9JTkFDVElWRSAgKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncyggVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSkKewogIGludCBjaCwgc2ZiLCBzZmJHcnA7CgogIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgaWYgKCBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID09IEFIX0FDVElWRSkgewogICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0lOQUNUSVZFOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKCnN0YXRpYyBGSVhQX0RCTCBDYWxjUmVkVmFsUG93ZXIoRklYUF9EQkwgbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRlbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgIHNjYWxpbmcgKQp7CiAgICBGSVhQX0RCTCB2YWx1ZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgaWYgKG51bT49RkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICB2YWx1ZSA9IGZEaXZOb3JtKCBudW0sIGRlbnVtLCBzY2FsaW5nKTsKICAgIH0KICAgIGVsc2UgewogICAgICB2YWx1ZSA9IC1mRGl2Tm9ybSggLW51bSwgZGVudW0sIHNjYWxpbmcpOwogICAgfQogICAgdmFsdWUgPSBmMlBvdyh2YWx1ZSwgKnNjYWxpbmcsIHNjYWxpbmcpOwogICAgKnNjYWxpbmcgPSBERlJBQ1RfQklUUy0xLSpzY2FsaW5nOwoKICAgIHJldHVybiB2YWx1ZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlCmRlc2NyaXB0aW9uOiAgdHdvIGd1ZXNzZXMgZm9yIHRoZSByZWR1Y3Rpb24gdmFsdWUgYW5kIG9uZSBmaW5hbCBjb3JyZWN0aW9uIG9mIHRoZSB0aHJlc2hvbGRzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShDSEFOTkVMX01BUFBJTkcqICBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgZGVzaXJlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBlbGVtZW50T2Zmc2V0KQp7CiAgIEZJWFBfREJMIHJlZFZhbHVlWyg4KV07CiAgIFNDSEFSICAgIHJlZFZhbFNjYWxpbmdbKDgpXTsKICAgVUNIQVIgICAgcEFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKICAgRklYUF9EQkwgcFRockV4cFsoOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKICAgaW50IGl0ZXI7CgogICBJTlQgY29uc3RQYXJ0R2xvYmFsLCBub1JlZFBlR2xvYmFsLCBuQWN0aXZlTGluZXNHbG9iYWwsIHJlZFBlR2xvYmFsOwogICBjb25zdFBhcnRHbG9iYWwgPSBub1JlZFBlR2xvYmFsID0gbkFjdGl2ZUxpbmVzR2xvYmFsID0gcmVkUGVHbG9iYWwgPSAwOwoKICAgaW50IGVsZW1lbnRJZDsKCiAgIGludCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKICAgaWYobkVsZW1lbnRzID4gY20tPm5FbGVtZW50cykgewogICAgIG5FbGVtZW50cyA9IGNtLT5uRWxlbWVudHM7CiAgIH0KCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyogUGFydCBJOiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyBhbmQgdmFyaWFibGVzLi4uICovCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CiAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KICAgICAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHBbZWxlbWVudElkXSwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwoKICAgICAgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKICAgICAgICAgIGVuZXJneSBpbiB0aGlzIGZyYW1lICovCiAgICAgICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPm1pblNuckFkYXB0UGFyYW0sIG5DaGFubmVscyk7CgogICAgICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICAgICAgRkRLYWFjRW5jX2luaXRBdm9pZEhvbGVGbGFnKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCAmcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8sIG5DaGFubmVscywgcGVEYXRhLCAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0pOwoKICAgICAgIC8qIHN1bSB1cCAqLwogICAgICAgY29uc3RQYXJ0R2xvYmFsICAgICs9IHBlRGF0YS0+Y29uc3RQYXJ0OwogICAgICAgbm9SZWRQZUdsb2JhbCAgICAgICs9IHBlRGF0YS0+cGU7CiAgICAgICBuQWN0aXZlTGluZXNHbG9iYWwgKz0gZml4TWF4KChJTlQpcGVEYXRhLT5uQWN0aXZlTGluZXMsIDEpOwoKICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyogUGFydCBJSTogQ2FsY3VsYXRlIGJpdCBjb25zdW1wdGlvbiBvZiBpbml0aWFsIGJpdCBjb25zdHJhaW50cyBzZXR1cCAqLwogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewogICAgICAgLyoKICAgICAgIHJlZFZhbCA9ICggMiBeICggKGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNHbG9iYWwpICkKICAgICAgICAgICAgICAgIC0gMiBeICggKGNvbnN0UGFydEdsb2JhbC1ub1JlZFBlR2xvYmFsKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzR2xvYmFsKSApICkKICAgICAgICovCgoKICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSAqLwogICAgICAgaW50IHNjYWxlMD0wLCBzY2FsZTE9MDsKICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUsIDQqbkFjdGl2ZUxpbmVzR2xvYmFsLCAmc2NhbGUwICk7CiAgICAgICBGSVhQX0RCTCB0bXAxID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnRHbG9iYWwtbm9SZWRQZUdsb2JhbCwgNCpuQWN0aXZlTGluZXNHbG9iYWwsICZzY2FsZTEgKTsKCiAgICAgICBpbnQgc2NhbE1pbiA9IEZES21pbihzY2FsZTAsIHNjYWxlMSktMTsKCiAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdICA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSA9IHNjYWxNaW47CgogICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KICAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCBwVGhyRXhwW2VsZW1lbnRJZF0sIG5DaGFubmVscywgcmVkVmFsdWVbZWxlbWVudElkXSwgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKTsKCiAgICAgICAvKiBwZSBhZnRlciBmaXJzdCBndWVzcyAqLwogICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKCiAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwogICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCgogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiBQYXJ0IElJSTogSXRlcmF0ZSB1bnRpbCBiaXQgY29uc3RyYWludHMgYXJlIG1ldCAqLwogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICBpdGVyID0gMDsKICAgd2hpbGUgKChmaXhwX2FicyhyZWRQZUdsb2JhbCAtIGRlc2lyZWRQZSkgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4wNWYpLGRlc2lyZWRQZSkpICYmIChpdGVyIDwgMSkpIHsKCiAgICAgSU5UIGRlc2lyZWRQZU5vQUhHbG9iYWw7CiAgICAgSU5UIHJlZFBlTm9BSEdsb2JhbCA9IDA7CiAgICAgSU5UIGNvbnN0UGFydE5vQUhHbG9iYWwgPSAwOwogICAgIElOVCBuQWN0aXZlTGluZXNOb0FIR2xvYmFsID0gMDsKCiAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgICAgSU5UIHJlZFBlTm9BSCwgY29uc3RQYXJ0Tm9BSCwgbkFjdGl2ZUxpbmVzTm9BSDsKICAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwogICAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICAgIC8qIHBlIGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlICovCiAgICAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSCgmcmVkUGVOb0FILCAmY29uc3RQYXJ0Tm9BSCwgJm5BY3RpdmVMaW5lc05vQUgsCiAgICAgICAgICAgICAgICAgICAgcGVEYXRhLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKCiAgICAgICAgIHJlZFBlTm9BSEdsb2JhbCArPSByZWRQZU5vQUg7CiAgICAgICAgIGNvbnN0UGFydE5vQUhHbG9iYWwgKz0gY29uc3RQYXJ0Tm9BSDsKICAgICAgICAgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCArPSBuQWN0aXZlTGluZXNOb0FIOwogICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKICAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCAuLi4gKi8KICAgICBpZihkZXNpcmVkUGUgPCByZWRQZUdsb2JhbCkgewoKICAgICAgIC8qIG5ldyBkZXNpcmVkIHBlIHdpdGhvdXQgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBhY3RpdmUgKi8KICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBkZXNpcmVkUGUgLSAocmVkUGVHbG9iYWwgLSByZWRQZU5vQUhHbG9iYWwpOwoKICAgICAgIC8qIGxpbWl0IGRlc2lyZWRQZU5vQUggdG8gcG9zaXRpdmUgdmFsdWVzLCBhcyB0aGUgUEUgY2FuIG5vdCBiZWNvbWUgbmVnYXRpdmUgKi8KICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBGREttYXgoMCxkZXNpcmVkUGVOb0FIR2xvYmFsKTsKCiAgICAgICAvKiBzZWNvbmQgZ3Vlc3MgKG9ubHkgaWYgdGhlcmUgYXJlIGJhbmRzIGxlZnQgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSkqLwogICAgICAgaWYgKG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwKSB7CiAgICAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgcmVkVmFsICs9ICggMiBeICggKGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkKICAgICAgICAgICAgICAgICAgICAgICAtIDIgXiAoIChjb25zdFBhcnROb0FIR2xvYmFsLXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkgKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludCBzY2FsZTAgPSAwOwogICAgICAgICAgICAgaW50IHNjYWxlMSA9IDA7CgogICAgICAgICAgICAgRklYUF9EQkwgdG1wMCA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0Tm9BSEdsb2JhbC1kZXNpcmVkUGVOb0FIR2xvYmFsLCA0Km5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZzY2FsZTAgKTsKICAgICAgICAgICAgIEZJWFBfREJMIHRtcDEgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydE5vQUhHbG9iYWwtcmVkUGVOb0FIR2xvYmFsLCA0Km5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZzY2FsZTEgKTsKCiAgICAgICAgICAgICBpbnQgc2NhbE1pbiA9IEZES21pbihzY2FsZTAsIHNjYWxlMSktMTsKCiAgICAgICAgICAgICB0bXAwID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpIC0gc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOwogICAgICAgICAgICAgc2NhbGUwID0gc2NhbE1pbjsKCiAgICAgICAgICAgICAvKiBvbGQgcmVkdWN0aW9uIHZhbHVlICovCiAgICAgICAgICAgICB0bXAxID0gcmVkVmFsdWVbZWxlbWVudElkXTsKICAgICAgICAgICAgIHNjYWxlMSA9IHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXTsKCiAgICAgICAgICAgICBzY2FsTWluID0gZml4TWluKHNjYWxlMCxzY2FsZTEpLTE7CgogICAgICAgICAgICAgLyogc3VtIHVwIG9sZCBhbmQgbmV3IHJlZHVjdGlvbiB2YWx1ZSAqLwogICAgICAgICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSArIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKICAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSA9IHNjYWxNaW47CgogICAgICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICAgICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAgICAgICB9IC8qIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwICovCiAgICAgfQogICAgIGVsc2UgewogICAgICAgIC8qIGRlc2lyZWRQZSA+PSByZWRQZUdsb2JhbCAqLwogICAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICAgICAgIElOVCByZWRWYWxfc2NhbGUgPSAwOwogICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcmVkUGVHbG9iYWwsIChGSVhQX0RCTClkZXNpcmVkUGUsICZyZWRWYWxfc2NhbGUpOwoKICAgICAgICAgICAgLyogcmVkVmFsICo9IHJlZFBlR2xvYmFsL2Rlc2lyZWRQZTsgKi8KICAgICAgICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSA9IGZNdWx0KHJlZFZhbHVlW2VsZW1lbnRJZF0sIHRtcCk7CiAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSAtPSByZWRWYWxfc2NhbGU7CgogICAgICAgICAgICBGREthYWNFbmNfcmVzZXRBSEZsYWdzKHBBaEZsYWdbZWxlbWVudElkXSwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCk7CiAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAgICAgfQoKICAgICByZWRQZUdsb2JhbCA9IDA7CiAgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwncyBQRS4uLiAqLwogICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CgogICAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwogICAgICAgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZFZhbHVlW2VsZW1lbnRJZF0sIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSk7CgogICAgICAgICAvKiBwZSBhZnRlciBzZWNvbmQgZ3Vlc3MgKi8KICAgICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKICAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKCiAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCgogICAgIGl0ZXIrKzsKICAgfSAvKiBFT0Ygd2hpbGUgKi8KCgogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIC8qIFBhcnQgSVY6IGlmIHN0aWxsIHJlcXVpcmVkLCBmdXJ0aGVyIHJlZHVjZSBjb25zdHJhaW50cyAgKi8KICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiAgICAgICAgICAgICAgICAgIDEuMCogICAgICAgIDEuMTUqICAgICAgIDEuMjAqCiAgICAqICAgICAgICAgICAgICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlCiAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICogLi4uWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYfCAgICAgICAgICAgfAogICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFguLi4KICAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYfAogICAgKiAgICAgICAgICAgIC0tLSBBIC0tLSAgICAgICAgICB8IC0tLSBCIC0tLSB8IC0tLSBDIC0tLQogICAgKgogICAgKiAoWCk6IHJlZFBlR2xvYmFsCiAgICAqIChBKTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goKQogICAgKiAoQik6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcygpCiAgICAqIChDKTogRkRLYWFjRW5jX3JlZHVjZU1pblNucigpCiAgICovCgogICAvKiBjb3JyZWN0IHRocmVzaG9sZHMgdG8gZ2V0IGNsb3NlciB0byB0aGUgZGVzaXJlZCBwZSAqLwogICBpZiAoIHJlZFBlR2xvYmFsID4gZGVzaXJlZFBlICkgewogICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsIHBUaHJFeHAsIHJlZFZhbHVlLCByZWRWYWxTY2FsaW5nLAogICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlIC0gcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CgogICAgIC8qIHVwZGF0ZSBQRSAqLwogICAgIHJlZFBlR2xvYmFsID0gMDsKICAgICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CiAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgICAgLyogcGUgYWZ0ZXIgY29ycmVjdFRocmVzaCAqLwogICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOwogICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwoKICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KICAgfQoKICAgaWYgKCByZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSApIHsKICAgICAvKiByZWR1Y2UgcGUgYnkgcmVkdWNpbmcgbWluU25yIHJlcXVpcmVtZW50cyAqLwogICAgIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNWYpLGRlc2lyZWRQZSkgKyBkZXNpcmVkUGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOwoKICAgICAvKiByZWR1Y2UgcGUgYnkgYWxsb3dpbmcgYWRkaXRpb25hbCBzcGVjdHJhbCBob2xlcyAqLwogICAgIEZES2FhY0VuY19hbGxvd01vcmVIb2xlcyhjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBBZGpUaHJTdGF0ZUVsZW1lbnQsIHBBaEZsYWcsCiAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlLCByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKICAgfQoKfQoKLyogc2ltaWxhciB0byBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZSgpLCBmb3IgIFZCUi1tb2RlICovCnZvaWQgRkRLYWFjRW5jX0FkYXB0VGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBBZGpUaHJTdGF0ZUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQp7CiAgIFVDSEFSICAgICgqcEFoRmxhZylbTUFYX0dST1VQRURfU0ZCXTsKICAgRklYUF9EQkwgKCpwVGhyRXhwKVtNQVhfR1JPVVBFRF9TRkJdOwoKICAgLyogYWxsb2NhdGUgc2NyYXRjaCBtZW1vcnkgKi8KICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wQWhGbGFnLCBVQ0hBUiwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgcEFoRmxhZyA9IChVQ0hBUigqKVtNQVhfR1JPVVBFRF9TRkJdKV9wQWhGbGFnOwogICBwVGhyRXhwID0gKEZJWFBfREJMKCopW01BWF9HUk9VUEVEX1NGQl0pX3BUaHJFeHA7CgogICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KICAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cCwgcWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwoKICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQogICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLwogICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5taW5TbnJBZGFwdFBhcmFtLCBuQ2hhbm5lbHMpOwoKICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwogICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCB0b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgcGVEYXRhLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtKTsKCiAgIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCiAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgcEFoRmxhZywgcFRockV4cCwgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+dmJyUXVhbEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVPbGQpOwoKICAgLyogZnJlZSBzY3JhdGNoIG1lbW9yeSAqLwogICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKICAgQ19BTExPQ19TQ1JBVENIX0VORChfcEFoRmxhZywgVUNIQVIsICgyKSpNQVhfR1JPVVBFRF9TRkIpCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0JpdFNhdmUKICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZSwgc2VlIGZpZ3VyZSBiZWxvdwogIHJldHVybnM6CiAgaW5wdXQ6ICAgICAgICBwYXJhbWV0ZXJzIGFuZCBiaXRyZXMtZnVsbG5lc3MKICBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogICAgICAgIGJpdHNhdmUKICAgICAgICAgICAgICAgICAgICBtYXhCaXRTYXZlKCUpfCAgIGNsaXBMb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLVwtLS0tLS0tLS0tLS0tLT4gYml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgbWluQml0U2F2ZSglKXwgICAgICAgICAgXC0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwSGlnaCAgICAgIG1heEJpdHJlcwoqLwpzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNCaXRTYXZlKEZJWFBfREJMIGZpbGxMZXZlbCwKICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNhdmUsCiAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRTYXZlLAogICAgY29uc3QgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSkKewogICAgRklYUF9EQkwgYml0c2F2ZTsKCiAgICBmaWxsTGV2ZWwgPSBmaXhNYXgoZmlsbExldmVsLCBjbGlwTG93KTsKICAgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKCiAgICBiaXRzYXZlID0gbWF4Qml0U2F2ZSAtIGZNdWx0KChmaWxsTGV2ZWwtY2xpcExvdyksIGJpdHNhdmVfc2xvcGUpOwoKICAgIHJldHVybiAoYml0c2F2ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjQml0U3BlbmQKICBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQsIHNlZSBmaWd1cmUgYmVsb3cKICByZXR1cm5zOgogIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCiAgb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kICAgICAgY2xpcEhpZ2gKICAgICAgICAgICAgICAgICAgIG1heEJpdFNwZW5kKCUpfCAgICAgICAgICAvLS0tLS0tLS0tLS1tYXhCaXRyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8tLS0tLS0tLS0tLS0tLS0tLT4gYml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAvCiAgICAgICAgICAgICAgICAgICBtaW5CaXRTcGVuZCglKXwtLS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwTG93CiovCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0JpdFNwZW5kKEZJWFBfREJMIGZpbGxMZXZlbCwKICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNwZW5kLAogICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U3BlbmQsCiAgICBjb25zdCBGSVhQX0RCTCBiaXRzcGVuZF9zbG9wZSkKewogICAgRklYUF9EQkwgYml0c3BlbmQ7CgogICAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CiAgICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CgogICAgYml0c3BlbmQgPSBtaW5CaXRTcGVuZCArIGZNdWx0KGZpbGxMZXZlbC1jbGlwTG93LCBiaXRzcGVuZF9zbG9wZSk7CgogICAgcmV0dXJuIChiaXRzcGVuZCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoKQogIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBwZU1pbiBhbmQgcGVNYXggcGFyYW1ldGVycyBvdmVyIHRpbWUKICByZXR1cm5zOgogIGlucHV0OiAgICAgICAgY3VycmVudCBwZSwgcGVNaW4sIHBlTWF4LCBiaXRyZXMgc2l6ZQogIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoY29uc3QgSU5UIGN1cnJQZSwKICAgIElOVCAgICAgICpwZU1pbiwKICAgIElOVCAgICAgICpwZU1heCkKewogIEZJWFBfREJMIG1pbkZhY0hpID0gRkwyRlhDT05TVF9EQkwoMC4zZiksIG1heEZhY0hpID0gKEZJWFBfREJMKU1BWFZBTF9EQkwsIG1pbkZhY0xvID0gRkwyRlhDT05TVF9EQkwoMC4xNGYpLCBtYXhGYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMDdmKTsKICAgIElOVCBkaWZmOwoKICAgIElOVCBtaW5EaWZmX2ZpeCA9IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjE2NjY2NjY2NjdmKSwgY3VyclBlKTsKCiAgICBpZiAoY3VyclBlID4gKnBlTWF4KQogICAgewogICAgICAgIGRpZmYgPSAoY3VyclBlLSpwZU1heCkgOwogICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksZGlmZik7CiAgICAgICAgKnBlTWF4ICs9IGZNdWx0SShtYXhGYWNIaSxkaWZmKTsKICAgIH0KICAgIGVsc2UgaWYgKGN1cnJQZSA8ICpwZU1pbikKICAgIHsKICAgICAgICBkaWZmID0gKCpwZU1pbi1jdXJyUGUpIDsKICAgICAgICAqcGVNaW4gLT0gZk11bHRJKG1pbkZhY0xvLGRpZmYpOwogICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sZGlmZik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgKnBlTWluICs9IGZNdWx0SShtaW5GYWNIaSwgKGN1cnJQZSAtICpwZU1pbikpOwogICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sICgqcGVNYXggLSBjdXJyUGUpKTsKICAgIH0KCiAgICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmX2ZpeCkKICAgIHsKICAgICAgICBJTlQgcGVNYXhfZml4ID0gKnBlTWF4LCBwZU1pbl9maXggPSAqcGVNaW47CiAgICAgICAgRklYUF9EQkwgcGFydExvX2ZpeCwgcGFydEhpX2ZpeDsKCiAgICAgICAgcGFydExvX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgY3VyclBlIC0gcGVNaW5fZml4KTsKICAgICAgICBwYXJ0SGlfZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBwZU1heF9maXggLSBjdXJyUGUpOwoKICAgICAgICBwZU1heF9maXggPSAoSU5UKShjdXJyUGUgKyBmTXVsdEkoZkRpdk5vcm0ocGFydEhpX2ZpeCwgKHBhcnRMb19maXgrcGFydEhpX2ZpeCkpLCBtaW5EaWZmX2ZpeCkpOwogICAgICAgIHBlTWluX2ZpeCA9IChJTlQpKGN1cnJQZSAtIGZNdWx0SShmRGl2Tm9ybShwYXJ0TG9fZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7CiAgICAgICAgcGVNaW5fZml4ID0gZml4TWF4KDAsIHBlTWluX2ZpeCk7CgogICAgICAgICpwZU1heCA9IHBlTWF4X2ZpeDsKICAgICAgICAqcGVNaW4gPSBwZU1pbl9maXg7CiAgICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogQml0cmVzQ2FsY0JpdEZhYwogIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBmYWN0b3Igb2Ygc3BlbmRpbmcgYml0cyBmb3Igb25lIGZyYW1lCiAgMS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzCiAgPjEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cyArIGJpdHJlcwogIDwxLjAgOiBwdXQgYml0cyBpbiBiaXRyZXNlcnZvaXIKICByZXR1cm5zOiAgICAgIEJpdEZhYwogIGlucHV0OiAgICAgICAgYml0cmVzLWZ1bGxuZXNzLCBwZSwgYmxvY2tUeXBlLCBwYXJhbWV0ZXItc2V0dGluZ3MKICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICAgICAgICAgICAgICAgICAgICAgYml0ZmFjKCUpICAgICAgICAgICAgcGVtYXgKICAgICAgICAgICAgICAgICAgIGJpdHNwZW5kKCUpICAgfCAgICAgICAgICAvLS0tLS0tLS0tLS1tYXhCaXRyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8tLS0tLS0tLS0tLS0tLS0tLT4gcGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC8KICAgICAgICAgICAgICAgICAgIGJpdHNhdmUoJSkgICAgfC0tLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1pbgoqLwoKc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKGNvbnN0IElOVCAgICAgICBiaXRyZXNCaXRzLAogICAgY29uc3QgSU5UICAgICAgICBtYXhCaXRyZXNCaXRzLAogICAgY29uc3QgSU5UICAgICAgICBwZSwKICAgIGNvbnN0IElOVCAgICAgICAgbGFzdFdpbmRvd1NlcXVlbmNlLAogICAgY29uc3QgSU5UICAgICAgICBhdmdCaXRzLAogICAgY29uc3QgRklYUF9EQkwgICBtYXhCaXRGYWMsCiAgICBBREpfVEhSX1NUQVRFICAgKkFkalRociwKICAgIEFUU19FTEVNRU5UICAgICAqYWRqVGhyQ2hhbikKewogICAgQlJFU19QQVJBTSAqYnJlc1BhcmFtOwogICAgSU5UIHBleDsKCiAgICBJTlQgcW1pbiwgcWJyLCBxYnJlcywgcW1icjsKICAgIEZJWFBfREJMIGJpdFNhdmUsIGJpdFNwZW5kOwoKICAgIEZJWFBfREJMIGJpdHJlc0ZhY19maXgsIHRtcF9jc3QsIHRtcF9maXg7CiAgICBGSVhQX0RCTCBwZV9wZXJzLCBiaXRzX3JhdGlvLCBtYXhCclZhbDsKICAgIEZJWFBfREJMIGJpdHNhdmVfc2xvcGUsIGJpdHNwZW5kX3Nsb3BlLCBtYXhCaXRGYWNfdG1wOwogICAgRklYUF9EQkwgZmlsbExldmVsX2ZpeCA9IChGSVhQX0RCTCkweDdmZmZmZmZmOwogICAgRklYUF9EQkwgVU5JVFkgPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKICAgIEZJWFBfREJMIFBPSU5UNyA9IChGSVhQX0RCTCkweDU5OTk5OTlBOwoKICAgIGlmIChtYXhCaXRyZXNCaXRzID4gYml0cmVzQml0cykgewogICAgICBmaWxsTGV2ZWxfZml4ID0gZkRpdk5vcm0oYml0cmVzQml0cywgbWF4Qml0cmVzQml0cyk7CiAgICB9CgogICAgaWYgKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICB7CiAgICAgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbUxvbmcpOwogICAgICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgzQkJCQkJCQzsKICAgICAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDU1NTU1NTU1OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1TaG9ydCk7CiAgICAgICAgYml0c2F2ZV9zbG9wZSA9IChGSVhQX0RCTCkweDJFOEJBMkU5OwogICAgICAgIGJpdHNwZW5kX3Nsb3BlID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7CiAgICB9CgogICAgcGV4ID0gZml4TWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7CiAgICBwZXggPSBmaXhNaW4ocGV4LCBhZGpUaHJDaGFuLT5wZU1heCk7CgogICAgYml0U2F2ZSA9IEZES2FhY0VuY19jYWxjQml0U2F2ZShmaWxsTGV2ZWxfZml4LAogICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNhdmVMb3csIGJyZXNQYXJhbS0+Y2xpcFNhdmVIaWdoLAogICAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlLCBiaXRzYXZlX3Nsb3BlKTsKCiAgICBiaXRTcGVuZCA9IEZES2FhY0VuY19jYWxjQml0U3BlbmQoZmlsbExldmVsX2ZpeCwKICAgICAgICBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAogICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQsIGJpdHNwZW5kX3Nsb3BlKTsKCiAgICBwZV9wZXJzID0gZkRpdk5vcm0ocGV4IC0gYWRqVGhyQ2hhbi0+cGVNaW4sIGFkalRockNoYW4tPnBlTWF4IC0gYWRqVGhyQ2hhbi0+cGVNaW4pOwogICAgdG1wX2ZpeCA9IGZNdWx0KCgoRklYUF9EQkwpYml0U3BlbmQgKyAoRklYUF9EQkwpYml0U2F2ZSksIHBlX3BlcnMpOwogICAgYml0cmVzRmFjX2ZpeCA9IChVTklUWT4+MSkgLSAoKEZJWFBfREJMKWJpdFNhdmU+PjEpICsgKHRtcF9maXg+PjEpOyBxYnJlcyA9IChERlJBQ1RfQklUUy0yKTsKCiAgICAvKiAoZmxvYXQpYml0cmVzQml0cy8oZmxvYXQpYXZnQml0cyAqLwogICAgYml0c19yYXRpbyA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIGF2Z0JpdHMsICZxYnIpOwogICAgcWJyID0gREZSQUNUX0JJVFMtMS1xYnI7CgogICAgLyogQWRkIDAuNyBpbiBxMzEgdG8gYml0c19yYXRpbyBpbiBxYnIgKi8KICAgIC8qIDAuN2YgKyAoZmxvYXQpYml0cmVzQml0cy8oZmxvYXQpYXZnQml0cyAqLwogICAgcW1pbiA9IGZpeE1pbihxYnIsIChERlJBQ1RfQklUUy0xKSk7CiAgICBiaXRzX3JhdGlvID0gYml0c19yYXRpbyA+PiAocWJyIC0gcW1pbik7CiAgICB0bXBfY3N0ID0gUE9JTlQ3ID4+ICgoREZSQUNUX0JJVFMtMSkgLSBxbWluKTsKICAgIG1heEJyVmFsID0gKGJpdHNfcmF0aW8+PjEpICsgKHRtcF9jc3Q+PjEpOyBxbWJyID0gcW1pbiAtIDE7CgogICAgLyogYml0cmVzRmFjX2ZpeCA9IGZpeE1pbihiaXRyZXNGYWNfZml4LCAwLjcgKyBiaXRyZXNCaXRzL2F2Z0JpdHMpOyAqLwogICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1icik7IHFicmVzID0gcW1icjsKICAgIGJpdHJlc0ZhY19maXggPSBmaXhNaW4oYml0cmVzRmFjX2ZpeCwgbWF4QnJWYWwpOwoKICAgIC8qIENvbXBhcmUgd2l0aCBtYXhCaXRGYWMgKi8KICAgIHFtaW4gPSBmaXhNaW4oUV9CSVRGQUMsIHFicmVzKTsKICAgIGJpdHJlc0ZhY19maXggPSBiaXRyZXNGYWNfZml4ID4+IChxYnJlcyAtIHFtaW4pOwogICAgbWF4Qml0RmFjX3RtcCA9IG1heEJpdEZhYyA+PiAoUV9CSVRGQUMgLSBxbWluKTsKICAgIGlmKG1heEJpdEZhY190bXAgPCBiaXRyZXNGYWNfZml4KQogICAgewogICAgICAgIGJpdHJlc0ZhY19maXggPSBtYXhCaXRGYWM7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYocW1pbiA8IFFfQklURkFDKQogICAgICAgIHsKICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPDwgKFFfQklURkFDLXFtaW4pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA+PiAocW1pbi1RX0JJVEZBQyk7CiAgICAgICAgfQogICAgfQoKICAgIEZES2FhY0VuY19hZGp1c3RQZU1pbk1heChwZSwgJmFkalRockNoYW4tPnBlTWluLCAmYWRqVGhyQ2hhbi0+cGVNYXgpOwoKICAgIHJldHVybiBiaXRyZXNGYWNfZml4Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRock5ldwpkZXNjcmlwdGlvbjogIGFsbG9jYXRlIEFESl9USFJfU1RBVEUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUqKiBwaEFkalRociwKICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cykKewogICAgSU5UIGVyciA9IDA7CiAgICBJTlQgaTsKICAgIEFESl9USFJfU1RBVEUqIGhBZGpUaHIgPSBHZXRSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCgpOwogICAgaWYgKGhBZGpUaHI9PU5VTEwpIHsKICAgICAgICBlcnIgPSAxOwogICAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewogICAgICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9ICBHZXRSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudChpKTsKICAgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldPT1OVUxMKSB7CiAgICAgICAgICBlcnIgPSAxOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KICAgIH0KCmJhaWw6CiAgICAqcGhBZGpUaHIgPSBoQWRqVGhyOwogICAgcmV0dXJuIGVycjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGpUaHJJbml0CmRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZSBBREpfVEhSX1NUQVRFCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19BZGpUaHJJbml0KAogICAgICAgIEFESl9USFJfU1RBVEUgICAqaEFkalRociwKICAgICAgICBjb25zdCBJTlQgICAgICAgbWVhblBlLAogICAgICAgIEVMRU1FTlRfQklUUyAgICAqZWxCaXRzWyg4KV0sCiAgICAgICAgSU5UICAgICAgICAgICAgIGludlF1YW50LAogICAgICAgIElOVCAgICAgICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgSU5UICAgICAgICAgICAgIG5DaGFubmVsc0VmZiwKICAgICAgICBJTlQgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICBJTlQgICAgICAgICAgICAgYWR2YW5jZWRCaXRzVG9QZSwKICAgICAgICBGSVhQX0RCTCAgICAgICAgdmJyUXVhbEZhY3RvcgogICAgICAgICkKewogIElOVCBpOwoKICBGSVhQX0RCTCBQT0lOVDggPSBGTDJGWENPTlNUX0RCTCgwLjhmKTsKICBGSVhQX0RCTCBQT0lOVDYgPSBGTDJGWENPTlNUX0RCTCgwLjZmKTsKCiAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCiAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgyNjY2NjY2NjsgLyogRkwyRlhDT05TVF9EQkwoMC4zZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gKEZJWFBfREJMKTB4MTk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kSGlnaCA9IChGSVhQX0RCTCkweDc5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjk1Zik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4ZjMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjEwZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4MzMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKDAuNGYpOyAqLwoKICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlSGlnaCAgPSAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgwMDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC4wZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRMb3cgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5ODsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIEZMMkZYQ09OU1RfREJMKDAuNWYpOyAqLwoKICAvKiBzcGVjaWZpYyBmb3IgZWFjaCBlbGVtZW50OiAqLwogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBBVFNfRUxFTUVOVCogYXRzRWxlbSA9IGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXTsKICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0gPSAmYXRzRWxlbS0+bWluU25yQWRhcHRQYXJhbTsKICAgIElOVCBjaEJpdHJhdGUgPSBlbEJpdHNbaV0tPmNoQml0cmF0ZUVsOwoKICAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCiAgICBhdHNFbGVtLT5wZU1pbiA9IGZNdWx0SShQT0lOVDgsIG1lYW5QZSkgPj4gMTsKICAgIGF0c0VsZW0tPnBlTWF4ID0gZk11bHRJKFBPSU5UNiwgbWVhblBlKTsKCiAgICAvKiBmb3IgdXNlIGluIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSICovCiAgICBhdHNFbGVtLT5jaGFvc01lYXN1cmVPbGQgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsKCiAgICAvKiBhZGRpdGlvbmFsIHBlIG9mZnNldCB0byBjb3JyZWN0IHBlMmJpdHMgZm9yIGxvdyBiaXRyYXRlcyAqLwogICAgYXRzRWxlbS0+cGVPZmZzZXQgPSAwOwoKICAgIC8qIHZiciBpbml0aWFsaXNhdGlvbiAqLwogICAgYXRzRWxlbS0+dmJyUXVhbEZhY3RvciA9IHZiclF1YWxGYWN0b3I7CiAgICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApCiAgICB7CiAgICAgIGF0c0VsZW0tPnBlT2Zmc2V0ID0gZml4TWF4KDUwLCAxMDAtZk11bHRJKChGSVhQX0RCTCkweDY2NjY2NywgY2hCaXRyYXRlKSk7CiAgICB9CgogICAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICovCiAgICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBUUlVFOwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDE1OwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAwOwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDA7CiAgICB9CgogICAgLyogbWluU25yIGFkYXB0YXRpb24gKi8KICAgIG1zYVBhcmFtLT5tYXhSZWQgPSBGTDJGWENPTlNUX0RCTCgwLjAwMzkwNjI1Zik7IC8qIDAuMjVmLzY0LjBmICovCiAgICAvKiBzdGFydCBhZGFwdGF0aW9uIG9mIG1pblNuciBmb3IgYXZnRW4vc2ZiRW4gPiBzdGFydFJhdGlvICovCiAgICBtc2FQYXJhbS0+c3RhcnRSYXRpbyA9IEZMMkZYQ09OU1RfREJMKDAuMDUxOTA1MTI2NDhmKTsgLyogbGQ2NCgxMC4wZikgKi8KICAgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCiAgICAgICBhdmdFbi9zZmJFbiA+PSBtYXhSYXRpbyAqLwogICAgLyogbXNhUGFyYW0tPm1heFJhdGlvID0gMTAwMC4wZjsgKi8KICAgIC8qbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gKChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPm1heFJlZCkgLyAoKGZsb2F0KTEwLjBmKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvL21zYVBhcmFtLT5tYXhSYXRpbykvbG9nMTAoMi4wZikqKGZsb2F0KTAuMzAxMDI5OTk1NmYpOyovCiAgICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSBGTDJGWENPTlNUX0RCTCgtMC4zNzVmKTsgLyogLTAuMDM3NWYgKiAxMC4wZiAqLwogICAgLyptc2FQYXJhbS0+cmVkT2ZmcyA9IChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPnJlZFJhdGlvRmFjICogKGZsb2F0KTEwLjBmICogbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pL2xvZzEwKDIuMGYpICogKGZsb2F0KTAuMzAxMDI5OTk1NmY7Ki8KICAgIG1zYVBhcmFtLT5yZWRPZmZzID0gRkwyRlhDT05TVF9EQkwoMC4wMjE0ODQzNzUpOyAvKiAxLjM3NWYvNjQuMGYgKi8KCiAgICAvKiBpbml0IHBlIGNvcnJlY3Rpb24gKi8KICAgIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3Rvcl9tID0gRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIDEuMCAqLwogICAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yX2UgPSAxOwoKICAgIGF0c0VsZW0tPmR5bkJpdHNMYXN0ID0gLTE7CiAgICBhdHNFbGVtLT5wZUxhc3QgPSAwOwoKICAgIC8qIGluaXQgYml0cyB0byBwZSBmYWN0b3IgKi8KCiAgICAvKiBpbml0IGJpdHMyUGVGYWN0b3IgKi8KICAgIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICAgICAgICAmYXRzRWxlbS0+Yml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgICAgICZhdHNFbGVtLT5iaXRzMlBlRmFjdG9yX2UsCiAgICAgICAgICAgICAgY2hCaXRyYXRlLCAgICAgICAvKiBiaXRyYXRlL2NoYW5uZWwqLwogICAgICAgICAgICAgIG5DaGFubmVsc0VmZiwgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCiAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICBhZHZhbmNlZEJpdHNUb1BlLAogICAgICAgICAgICAgIGludlF1YW50CiAgICAgICAgICAgICAgKTsKCiAgfSAvKiBmb3IgbkVsZW1lbnRzICovCgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbgogICAgZGVzY3JpcHRpb246ICBjYWxjIGRlc2lyZWQgcGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbigKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfbSwKICAgICAgICBJTlQgKmNvbnN0ICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlQWN0LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgcGVMYXN0LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0c0xhc3QsCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UKICAgICAgICApCnsKICBpZiAoIChiaXRzTGFzdCA+IDApICYmIChwZUFjdCA8IDEuNWYqcGVMYXN0KSAmJiAocGVBY3QgPiAwLjdmKnBlTGFzdCkgJiYKICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMmYvMi5mKSwgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lKzEpID4gcGVMYXN0KSAmJgogICAgICAgKEZES2FhY0VuY19iaXRzMnBlMihiaXRzTGFzdCwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC42NWYpLCAgICBiaXRzMlBlRmFjdG9yX20pLCBiaXRzMlBlRmFjdG9yX2UgICkgPCBwZUxhc3QpICkKICB7CiAgICBGSVhQX0RCTCBjb3JyRmFjID0gKmNvcnJlY3Rpb25GYWNfbTsKCiAgICBpbnQgc2NhbGluZyA9IDA7CiAgICBGSVhQX0RCTCBkZW51bSA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKTsKICAgIEZJWFBfREJMIG5ld0ZhYyA9IGZEaXZOb3JtKChGSVhQX0RCTClwZUxhc3QsIGRlbnVtLCAmc2NhbGluZyk7CgogICAgLyogZGVhZCB6b25lLCBuZXdGYWMgYW5kIGNvcnJGYWMgYXJlIHNjYWxlZCBieSAwLjUgKi8KICAgIGlmICgoRklYUF9EQkwpcGVMYXN0IDw9IGRlbnVtKSB7IC8qIHJhdGlvIDw9IDEuZiAqLwogICAgICBuZXdGYWMgPSBmaXhNYXgoc2NhbGVWYWx1ZShmaXhNaW4oIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSwgbmV3RmFjKSwgc2NhbGVWYWx1ZShGTDJGWENPTlNUX0RCTCggIDEuZi8yLmYpLCAtc2NhbGluZykpLCBzY2FsaW5nKSwgRkwyRlhDT05TVF9EQkwoMC44NWYvMi5mKSApOwogICAgfQogICAgZWxzZSB7IC8qIHJhdGlvIDwgMS5mICovCiAgICAgbmV3RmFjID0gZml4TWF4KCBmaXhNaW4oIHNjYWxlVmFsdWUoZk11bHQoRkwyRlhDT05TVF9EQkwoMC45Zi8yLmYpLCBuZXdGYWMpLCBzY2FsaW5nKSwgRkwyRlhDT05TVF9EQkwoMS4xNWYvMi5mKSApLCBGTDJGWENPTlNUX0RCTCggICAxLmYvMi5mKSApOwogICAgfQoKICAgIGlmICggICAoKG5ld0ZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSAmJiAoY29yckZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSkKICAgICAgICB8fCAoKG5ld0ZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSAmJiAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSkpCiAgICB7CiAgICAgIGNvcnJGYWMgPSBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKTsKICAgIH0KCiAgICAvKiBmYXN0ZXIgYWRhcHRhdGlvbiB0b3dhcmRzIDEuMCwgc2xvd2VyIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KICAgIGlmICggKGNvcnJGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSAmJiBuZXdGYWMgPCBjb3JyRmFjKQogICAgICB8fCAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpICYmIG5ld0ZhYyA+IGNvcnJGYWMpICkKICAgIHsKICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuODVmKSwgY29yckZhYykgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjE1ZiksIG5ld0ZhYyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCBjb3JyRmFjKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuM2YpLCBuZXdGYWMpOwogICAgfQoKICAgIGNvcnJGYWMgPSBmaXhNYXgoIGZpeE1pbiggY29yckZhYywgRkwyRlhDT05TVF9EQkwoMS4xNWYvMi5mKSApLCBGTDJGWENPTlNUX0RCTCgwLjg1LzIuZikgKTsKCiAgICAqY29ycmVjdGlvbkZhY19tID0gY29yckZhYzsKICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogIH0KICBlbHNlIHsKICAgICpjb3JyZWN0aW9uRmFjX20gPSBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKTsKICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogIH0KfQoKCnN0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uTG93Qml0UmVzKAogICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgY29ycmVjdGlvbkZhY19tLAogICAgICAgIElOVCAqY29uc3QgICAgICAgICAgICAgICAgY29ycmVjdGlvbkZhY19lLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgcGVMYXN0LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0c0xhc3QsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRyZXNMZXZlbCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZQogICAgICAgICkKewogIC8qIHR1bmluZyBwYXJhbXMgKi8KICBjb25zdCBGSVhQX0RCTCBhbXAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wMDUpOwogIGNvbnN0IEZJWFBfREJMIG1heERpZmYgPSBGTDJGWENPTlNUX0RCTCgwLjI1Zik7CgogIGlmIChiaXRzTGFzdCA+IDApIHsKCiAgICAvKiBFc3RpbWF0ZSBkZXZpYXRpb24gb2YgZ3JhbnRlZCBhbmQgdXNlZCBkeW5hbWljIGJpdHMgaW4gcHJldmlvdXMgZnJhbWUsIGluIFBFIHVuaXRzICovCiAgICBjb25zdCBpbnQgYml0c0JhbExhc3QgPSBwZUxhc3QgLSBGREthYWNFbmNfYml0czJwZTIoCiAgICAgICAgICBiaXRzTGFzdCwKICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CgogICAgLyogcmVzZXJ2ZSBuIGJpdHMgcGVyIGNoYW5uZWwgKi8KICAgIGludCBoZWFkcm9vbSA9IChiaXRyZXNMZXZlbD49NTAqbkNoYW5uZWxzKSA/IDAgOiAoMTAwKm5DaGFubmVscyk7CgogICAgLyogaW4gUEUgdW5pdHMgKi8KICAgIGhlYWRyb29tID0gRkRLYWFjRW5jX2JpdHMycGUyKAogICAgICAgICAgaGVhZHJvb20sCiAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCiAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UpOwoKICAgIC8qCiAgICAgKiBkaWZmID0gYW1wICogKChiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSAvIChiaXRyZXNMZXZlbCArIGhlYWRyb29tKQogICAgICogZGlmZiA9IG1heCAoIG1pbiAoIGRpZmYsIG1heERpZmYsIC1tYXhEaWZmKSkgLyAyCiAgICAgKi8KICAgIEZJWFBfREJMIGRlbm9taW5hdG9yID0gKEZJWFBfREJMKUZES2FhY0VuY19iaXRzMnBlMihiaXRyZXNMZXZlbCwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpICsgKEZJWFBfREJMKWhlYWRyb29tOwoKICAgIGludCBzY2FsaW5nID0gMDsKICAgIEZJWFBfREJMIGRpZmYgPSAoYml0c0JhbExhc3Q+PWhlYWRyb29tKQogICAgICAgICA/ICBmTXVsdChhbXAsIGZEaXZOb3JtKCAoRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLCBkZW5vbWluYXRvciwgJnNjYWxpbmcpKQogICAgICAgICA6IC1mTXVsdChhbXAsIGZEaXZOb3JtKC0oRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLCBkZW5vbWluYXRvciwgJnNjYWxpbmcpKSA7CgogICAgc2NhbGluZyAtPSAxOyAvKiBkaXZpZGUgYnkgMiAqLwoKICAgIGRpZmYgPSAoc2NhbGluZzw9MCkgPyBGREttYXgoIEZES21pbiAoZGlmZj4+KC1zY2FsaW5nKSwgbWF4RGlmZj4+MSksIC1tYXhEaWZmPj4xKQogICAgICAgICAgICAgICAgICAgICAgICA6IEZES21heCggRkRLbWluIChkaWZmLCBtYXhEaWZmPj4oMStzY2FsaW5nKSksIC1tYXhEaWZmPj4oMStzY2FsaW5nKSkgPDwgc2NhbGluZzsKCiAgICAvKgogICAgICogY29yckZhYyArPSBkaWZmCiAgICAgKiBjb3JyRmFjID0gbWF4ICggbWluICggY29yckZhYy8yLmYsIDEuZi8yLmYsIDAuNzVmLzIuZiApICkKICAgICAqLwogICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZES21heChGREttaW4oKCpjb3JyZWN0aW9uRmFjX20pK2RpZmYsIEZMMkZYQ09OU1RfREJMKDEuMGYvMi5mKSksIEZMMkZYQ09OU1RfREJMKDAuNzVmLzIuZikpIDsKICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogIH0KICBlbHNlIHsKICAgICpjb3JyZWN0aW9uRmFjX20gPSBGTDJGWENPTlNUX0RCTCgwLjc1LzIuZik7CiAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKICB9Cn0KCnZvaWQgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLAogICAgQVRTX0VMRU1FTlQgICAgICAgKkFkalRoclN0YXRlRWxlbWVudCwKICAgIFBTWV9PVVRfQ0hBTk5FTCAgICpwc3lPdXRDaGFubmVsWygyKV0sCiAgICBQRV9EQVRBICAgICAgICAgICAqcGVEYXRhLAogICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZSwKICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGVDb3JyLAogICAgY29uc3QgSU5UICAgICAgICAgbkNoYW5uZWxzLAogICAgY29uc3QgSU5UICAgICAgICAgY29tbW9uV2luZG93LAogICAgY29uc3QgSU5UICAgICAgICAgZ3JhbnRlZER5bkJpdHMsCiAgICBjb25zdCBJTlQgICAgICAgICBiaXRyZXNCaXRzLAogICAgY29uc3QgSU5UICAgICAgICAgbWF4Qml0cmVzQml0cywKICAgIGNvbnN0IEZJWFBfREJMICAgIG1heEJpdEZhYywKICAgIGNvbnN0IElOVCAgICAgICAgIGJpdERpc3RyaWJ1dGlvbk1vZGUpCnsKICBGSVhQX0RCTCBiaXRGYWN0b3I7CiAgSU5UIG5vUmVkUGUgPSBwZURhdGEtPnBlOwoKICAvKiBwcmVmZXIgc2hvcnQgd2luZG93cyBmb3IgY2FsY3VsYXRpb24gb2YgYml0RmFjdG9yICovCiAgSU5UIGN1cldpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CiAgaWYgKG5DaGFubmVscz09MikgewogICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB8fAogICAgICAgIChwc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgewogICAgICAgIGN1cldpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOwogICAgfQogIH0KICBlbHNlIHsKICAgIGN1cldpbmRvd1NlcXVlbmNlID0gcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlOwogIH0KCiAgaWYgKGdyYW50ZWREeW5CaXRzID49IDEpIHsKICAgIGlmIChiaXREaXN0cmlidXRpb25Nb2RlIT0wKSB7CiAgICAgICpncmFudGVkUGUgPSBGREthYWNFbmNfYml0czJwZTIoZ3JhbnRlZER5bkJpdHMsIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAvKiBmYWN0b3IgZGVwZW5kZW5kIG9uIGN1cnJlbnQgZmlsbCBsZXZlbCBhbmQgcGUgKi8KICAgIGJpdEZhY3RvciA9IEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMsIG5vUmVkUGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cldpbmRvd1NlcXVlbmNlLCBncmFudGVkRHluQml0cywgbWF4Qml0RmFjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgLyogZGVzaXJlZCBwZSBmb3IgYWN0dWFsIGZyYW1lICovCiAgICAvKiBXb3JzdCBjYXNlIG1heCBvZiBncmFudGVkRHluQml0cyBpcyA9IDEwMjQgKiA1LjI3ICogMiAqLwogICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMihncmFudGVkRHluQml0cywKICAgICAgICAgICAgICAgICAgICAgZk11bHQoYml0RmFjdG9yLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSksIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKyhERlJBQ1RfQklUUy0xLVFfQklURkFDKQogICAgICAgICAgICAgICAgICAgICApOwogICAgfQogIH0KICBlbHNlIHsKICAgICpncmFudGVkUGUgPSAwOyAvKiBwcmV2ZW50IGRpdnNpb24gYnkgMCAqLwogIH0KCiAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLwogIHN3aXRjaCAoYml0RGlzdHJpYnV0aW9uTW9kZSkgewogIGNhc2UgMjoKICBjYXNlIDE6CiAgICBGREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbkxvd0JpdFJlcygKICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSwKICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QsCiAgICAgICAgICAgIGJpdHJlc0JpdHMsCiAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lCiAgICAgICAgKTsKICAgIGJyZWFrOwogIGNhc2UgMDoKICBkZWZhdWx0OgogICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24oCiAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCiAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UsCiAgICAgICAgICAgIGZpeE1pbigqZ3JhbnRlZFBlLCBub1JlZFBlKSwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QsCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZQogICAgICAgICAgICApOwogICAgYnJlYWs7CiAgfQoKICAqZ3JhbnRlZFBlQ29yciA9IChJTlQpKGZNdWx0KChGSVhQX0RCTCkoKmdyYW50ZWRQZTw8UV9BVkdCSVRTKSwgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSkgPj4gKFFfQVZHQklUUy1BZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9lKSk7CgogIC8qIHVwZGF0ZSBsYXN0IHBlICovCiAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QgPSAqZ3JhbnRlZFBlOwogIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QgPSAtMTsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzCmRlc2NyaXB0aW9uOiAgYWRqdXN0IHRocmVzaG9sZHMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMoQVRTX0VMRU1FTlQqICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgIHFjRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgICBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBDQlJiaXRyYXRlTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgIGNtKQp7CiAgICBpbnQgaTsKICAgIGlmIChDQlJiaXRyYXRlTW9kZSkKICAgIHsKICAgICAgICAvKiBJbiBjYXNlLCBubyBiaXRzIG11c3QgYmUgc2hpZnRlZCBiZXR3ZWVuIGRpZmZlcmVudCBlbGVtZW50cywgKi8KICAgICAgICAvKiBhbiBlbGVtZW50LXdpc2UgZXhlY3V0aW9uIG9mIHRoZSBwZS1kZXBlbmRlbnQgdGhyZXNob2xkLSAqLwogICAgICAgIC8qIGFkYXB0aW9uIGJlY29tZXMgbmVjZXNzYXJ5Li4uICovCiAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CgogICAgICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogcWNFbGVtZW50W2ldLT5ncmFudGVkUGUgPSAyMDAwOyAqLyAgLyogVXNlIHRoaXMgb25seSBmb3IgZGVidWdnaW5nICovCiAgICAgICAgICAgICAgICAgICAgLy9pZiAodG90YWxHcmFudGVkUGVDb3JyIDwgdG90YWxOb1JlZFBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlIDwgcWNFbGVtZW50W2ldLT5wZURhdGEucGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgIC8qIFByb2Nlc3Mgb25seSAxIGVsZW1lbnQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsgICAgICAgIC8qIFByb2Nlc3MgZXhhY3RseSBUSElTIGVsZW1lbnQgKi8KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CgogICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC8qIGZvciBWQlItbW9kZSAqLwogICAgICAgICAgICAgICAgICBGREthYWNFbmNfQWRhcHRUaHJlc2hvbGRzVkJSKHFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50W2ldLT50b29sc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFtpXS0+cGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCk7CiAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgICAgICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCgogICAgfQogICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CiAgICAgICAgaW50IGNoLHNmYixzZmJHcnA7CiAgICAgICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCiAgICAgICAgLyogd2VpZ2h0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzICovCiAgICAgICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHBRY091dENoID0gcWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSArPSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBGREthYWNFbmNfQWRqVGhyQ2xvc2UoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyKQp7CiAgICBJTlQgaTsKICAgIEFESl9USFJfU1RBVEUqIGhBZGpUaHIgPSAqcGhBZGpUaHI7CgogICAgaWYgKGhBZGpUaHIhPU5VTEwpIHsKICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKICAgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldIT1OVUxMKSB7CiAgICAgICAgICBGcmVlUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQoJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIEZyZWVSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZChwaEFkalRocik7CiAgICB9Cn0KCg==