Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAicWNfbWFpbi5oIgojaW5jbHVkZSAicXVhbnRpemUuaCIKI2luY2x1ZGUgImludGVyZmFjZS5oIgojaW5jbHVkZSAiYWRqX3Roci5oIgojaW5jbHVkZSAic2ZfZXN0aW0uaCIKI2luY2x1ZGUgImJpdF9jbnQuaCIKI2luY2x1ZGUgImR5bl9iaXRzLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCgoKdHlwZWRlZiBzdHJ1Y3QgewogIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOwogIExPTkcgdmJyUXVhbEZhY3RvcjsKfSBUQUJfVkJSX1FVQUxfRkFDVE9SOwoKc3RhdGljIGNvbnN0IFRBQl9WQlJfUVVBTF9GQUNUT1IgdGFibGVWYnJRdWFsRmFjdG9yW10gPSB7CiAge1FDREFUQV9CUl9NT0RFX1ZCUl8xLCBGTDJGWENPTlNUX0RCTCgwLjE2MGYpfSwgLyogMzIga2JwcyBtb25vICAgQUFDLUxDICsgU0JSICsgUFMgKi8KICB7UUNEQVRBX0JSX01PREVfVkJSXzIsIEZMMkZYQ09OU1RfREJMKDAuMTQ4Zil9LCAvKiA2NCBrYnBzIHN0ZXJlbyBBQUMtTEMgKyBTQlIgICAgICAqLwogIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMywgRkwyRlhDT05TVF9EQkwoMC4xMzVmKX0sIC8qIDgwIC0gOTYga2JwcyBzdGVyZW8gQUFDLUxDICAgICAgICovCiAge1FDREFUQV9CUl9NT0RFX1ZCUl80LCBGTDJGWENPTlNUX0RCTCgwLjExMWYpfSwgLyogMTI4IGticHMgc3RlcmVvIEFBQy1MQyAgICAgICAgICAgKi8KICB7UUNEQVRBX0JSX01PREVfVkJSXzUsIEZMMkZYQ09OU1RfREJMKDAuMDcwZil9ICAvKiAxOTIga2JwcyBzdGVyZW8gQUFDLUxDICAgICAgICAgICAqLwp9OwoKc3RhdGljIElOVCBpc0NvbnN0YW50Qml0cmF0ZU1vZGUoCiAgICAgICAgY29uc3QgUUNEQVRBX0JSX01PREUgYml0cmF0ZU1vZGUKICAgICAgICApCnsKICByZXR1cm4gKCAoKGJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9DQlIpIHx8IChiaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfU0ZSKSB8fCAoYml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0ZGKSkgPyAxIDogMCApOwp9CgoKCnR5cGVkZWYgZW51bXsKICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKICAgIEZSQU1FX0xFTl9CWVRFU19JTlQgICAgPSAgMgp9RlJBTUVfTEVOX1JFU1VMVF9NT0RFOwoKLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KCnN0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKElOVCAgIHNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBtYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICpSRVNUUklDVCBzZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKlJFU1RSSUNUIHF1YW50U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqUkVTVFJJQ1QgbWF4VmFsdWUpOwoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoSU5UICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQgICAqcWNFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnKTsKCnN0YXRpYwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oaW50KiAgICAgICAgICAgICBpdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIG1heEl0ZXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZ2FpbkFkanVzdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY091dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogICAgZWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgIGVwQ29uZmlnKTsKCgp2b2lkICBGREthYWNFbmNfUUNDbG9zZSAoUUNfU1RBVEUgICoqcGhRQ3N0YXRlLCBRQ19PVVQgKipwaFFDKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNGcmFtZUxlbgogICAgZGVzY3JpcHRpb246CiAgICByZXR1cm5zOgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKElOVCBiaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9SRVNVTFRfTU9ERSBtb2RlKQp7CgogICBJTlQgcmVzdWx0OwoKICAgcmVzdWx0ID0gKChncmFudWxlTGVuZ3RoKT4+MykqKGJpdFJhdGUpOwoKICAgc3dpdGNoKG1vZGUpIHsKICAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19NT0RVTE86CiAgICAgICAgIHJlc3VsdCAlPSBzYW1wbGVSYXRlOwogICAgIGJyZWFrOwogICAgIGNhc2UgRlJBTUVfTEVOX0JZVEVTX0lOVDoKICAgICAgICAgcmVzdWx0IC89IHNhbXBsZVJhdGU7CiAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuKHJlc3VsdCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfZnJhbWVQYWRkaW5nCiAgICBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBmb3IgYWN0dWFsIGZyYW1lCiAgICByZXR1cm5zOgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCBGREthYWNFbmNfZnJhbWVQYWRkaW5nKElOVCBiaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFkZGluZ1Jlc3QpCnsKICBJTlQgcGFkZGluZ09uOwogIElOVCBkaWZmZXJlbmNlOwoKICBwYWRkaW5nT24gPSAwOwoKICBkaWZmZXJlbmNlID0gRkRLYWFjRW5jX2NhbGNGcmFtZUxlbiggYml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyApOwogICpwYWRkaW5nUmVzdC09ZGlmZmVyZW5jZTsKCiAgaWYgKCpwYWRkaW5nUmVzdCA8PSAwICkgewogICAgcGFkZGluZ09uID0gMTsKICAgICpwYWRkaW5nUmVzdCArPSBzYW1wbGVSYXRlOwogIH0KCiAgcmV0dXJuKCBwYWRkaW5nT24gKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDT3V0TmV3CiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXROZXcoUUNfT1VUICAgICoqcGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5TdWJGcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgKmR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogIGludCBuLCBpOwogIGludCBlbEluYyA9IDAsIGNoSW5jID0gMDsKCiAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CiAgICBwaFFDW25dID0gR2V0UmFtX2FhY0VuY19RQ291dChuKTsKICAgIGlmIChwaFFDW25dID09IE5VTEwpIHsKICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgZ290byBRQ091dE5ld19iYWlsOwogICAgfQoKICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CiAgICAgIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2ldID0gR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwoY2hJbmMsIGR5bmFtaWNfUkFNKTsKICAgICAgaWYgKCBwaFFDW25dLT5wUWNPdXRDaGFubmVsc1tpXSA9PSBOVUxMCiAgICAgICAgICkKICAgICAgewogICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICAgIH0KICAgICAgY2hJbmMrKzsKICAgIH0gLyogbkNoYW5uZWxzICovCgogICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldICAgICAgPSBHZXRSYW1fYWFjRW5jX1FDZWxlbWVudChlbEluYyk7CiAgICAgIGlmIChwaFFDW25dLT5xY0VsZW1lbnRbaV0gPT0gTlVMTCkKICAgICAgewogICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgZ290byBRQ091dE5ld19iYWlsOwogICAgICB9CiAgICAgIGVsSW5jKys7CiAgICB9IC8qIG5FbGVtZW50cyAqLwoKICB9IC8qIG5TdWJGcmFtZXMgKi8KCgogIHJldHVybiBBQUNfRU5DX09LOwoKUUNPdXROZXdfYmFpbDoKICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDT3V0SW5pdAogICAgICAgICBkZXNjcmlwdGlvbjoKICAgICAgICAgcmV0dXJuOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0SW5pdChRQ19PVVQgICAgICAgICAgKnBoUUNbKDEpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjbSkKewogIElOVCBuLGksY2g7CgogIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgewogICAgSU5UIGNoSW5jID0gMDsKICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewogICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsW2NoXSA9IHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2NoSW5jXTsKICAgICAgICBjaEluYysrOwogICAgICB9IC8qIGNoSW5FbCAqLwogICAgfSAvKiBuRWxlbWVudHMgKi8KICB9IC8qIG5TdWJGcmFtZXMgKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDTmV3CiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNOZXcoUUNfU1RBVEUgICoqcGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG5FbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgZHluYW1pY19SQU0KICAgICAgICAgICApCnsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICBpbnQgaTsKCiAgUUNfU1RBVEUqIGhRQyA9IEdldFJhbV9hYWNFbmNfUUNzdGF0ZSgpOwogICpwaFFDID0gaFFDOwogIGlmIChoUUMgPT0gTlVMTCkgewogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgIGdvdG8gUUNOZXdfYmFpbDsKICB9CgogIGlmIChGREthYWNFbmNfQWRqVGhyTmV3KCZoUUMtPmhBZGpUaHIsIG5FbGVtZW50cykpIHsKICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICBnb3RvIFFDTmV3X2JhaWw7CiAgfQoKICBpZiAoRkRLYWFjRW5jX0JDTmV3KCYoaFFDLT5oQml0Q291bnRlciksIGR5bmFtaWNfUkFNKSkgewogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgIGdvdG8gUUNOZXdfYmFpbDsKICB9CgogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBoUUMtPmVsZW1lbnRCaXRzW2ldID0gR2V0UmFtX2FhY0VuY19FbGVtZW50Qml0cyhpKTsKICAgIGlmIChoUUMtPmVsZW1lbnRCaXRzW2ldID09IE5VTEwpIHsKICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgZ290byBRQ05ld19iYWlsOwogICAgfQogIH0KCiAgcmV0dXJuIEFBQ19FTkNfT0s7CgpRQ05ld19iYWlsOgogIEZES2FhY0VuY19RQ0Nsb3NlKHBoUUMsIE5VTEwpOwogIHJldHVybiBFcnJvclN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNJbml0CiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNJbml0KFFDX1NUQVRFICpoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFFDX0lOSVQgKmluaXQpCnsKICBpbnQgaTsKICBoUUMtPm1heEJpdHNQZXJGcmFtZSA9IGluaXQtPm1heEJpdHM7CiAgaFFDLT5taW5CaXRzUGVyRnJhbWUgPSBpbml0LT5taW5CaXRzOwogIGhRQy0+bkVsZW1lbnRzICAgICAgID0gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsKICBoUUMtPmJpdFJlc1RvdE1heCAgICA9IGluaXQtPmJpdFJlczsKICBoUUMtPmJpdFJlc1RvdCAgICAgICA9IGluaXQtPmJpdFJlczsKICBoUUMtPm1heEJpdEZhYyAgICAgICA9IGluaXQtPm1heEJpdEZhYzsKICBoUUMtPmJpdHJhdGVNb2RlICAgICA9IGluaXQtPmJpdHJhdGVNb2RlOwogIGhRQy0+aW52UXVhbnQgICAgICAgID0gaW5pdC0+aW52UXVhbnQ7CiAgaFFDLT5tYXhJdGVyYXRpb25zICAgPSBpbml0LT5tYXhJdGVyYXRpb25zOwoKICBpZiAoIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSApIHsKICAgIElOVCBiaXRyZXNQZXJDaGFubmVsID0gKGhRQy0+Yml0UmVzVG90TWF4IC8gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZik7CiAgICAvKiAwOiBmdWxsIGJpdHJlc2Vydm9pciwgMTogcmVkdWNlZCBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLwogICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gKGJpdHJlc1BlckNoYW5uZWw+QklUUkVTX01JTl9MRCkgPyAwIDogKGJpdHJlc1BlckNoYW5uZWw+MCkgPyAxIDogMjsKICB9CiAgZWxzZSB7CiAgICBoUUMtPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSAwOyAvKiBmdWxsIGJpdHJlc2Vydm9pciAqLwogIH0KCgogIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7CgogIGhRQy0+Z2xvYkhkckJpdHMgPSBpbml0LT5zdGF0aWNCaXRzOyAvKiBCaXQgb3ZlcmhlYWQgZHVlIHRvIHRyYW5zcG9ydCAqLwoKICBGREthYWNFbmNfSW5pdEVsZW1lbnRCaXRzKGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+Yml0cmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbml0LT5hdmVyYWdlQml0cy9pbml0LT5uU3ViRnJhbWVzKSAtIGhRQy0+Z2xvYkhkckJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEJpdHNQZXJGcmFtZS9pbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKTsKCiAgaFFDLT52YnJRdWFsRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICBmb3IgKGk9MDsgaTwoaW50KShzaXplb2YodGFibGVWYnJRdWFsRmFjdG9yKS9zaXplb2YoVEFCX1ZCUl9RVUFMX0ZBQ1RPUikpOyBpKyspIHsKICAgIGlmIChoUUMtPmJpdHJhdGVNb2RlPT10YWJsZVZiclF1YWxGYWN0b3JbaV0uYml0cmF0ZU1vZGUpIHsKICAgICAgaFFDLT52YnJRdWFsRmFjdG9yID0gKEZJWFBfREJMKXRhYmxlVmJyUXVhbEZhY3RvcltpXS52YnJRdWFsRmFjdG9yOwogICAgICBicmVhazsKICAgIH0KICB9CgogIGlmIChpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmID09IDEgJiYKICAgICAoaW5pdC0+Yml0cmF0ZSAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpIDwgMzIwMDAgJiYKICAgICBpbml0LT5hZHZhbmNlZEJpdHNUb1BlICE9IDAKICAgICApCiAgewogICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlID0gMTsKICB9IGVsc2UgewogICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlID0gMDsKICB9CgogIEZES2FhY0VuY19BZGpUaHJJbml0KAogICAgICAgIGhRQy0+aEFkalRociwKICAgICAgICBpbml0LT5tZWFuUGUsCiAgICAgICAgaFFDLT5lbGVtZW50Qml0cywgICAgICAgICAgICAgICAgIC8qIG9yIGNoYW5uZWxCaXRyYXRlcywgd2FzOiBjaGFubmVsQml0cmF0ZSAqLwogICAgICAgIGhRQy0+aW52UXVhbnQsCiAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50cywKICAgICAgICBpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmLAogICAgICAgIGluaXQtPnNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KICAgICAgICBpbml0LT5hZHZhbmNlZEJpdHNUb1BlLCAgICAgICAgICAgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCiAgICAgICAgaFFDLT52YnJRdWFsRmFjdG9yLAogICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZQogICAgICAgICk7CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDTWFpblByZXBhcmUKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW5QcmVwYXJlKEVMRU1FTlRfSU5GTyAgICAgICAgICAgICAgKmVsSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIFJFU1RSSUNUICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogUkVTVFJJQ1QgICBxY091dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX09LOwogIElOVCAgbkNoYW5uZWxzID0gZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOwoKICBQU1lfT1VUX0NIQU5ORUwqKiBSRVNUUklDVCBwc3lPdXRDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsgICAgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCgogIEZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKCiAgLyogcHJlcGFyZSBhbmQgY2FsY3VsYXRlIFBFIHdpdGhvdXQgcmVkdWN0aW9uICovCiAgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oJnFjT3V0RWxlbWVudC0+cGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbywgYWRqVGhyU3RhdGVFbGVtZW50LCBuQ2hhbm5lbHMpOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCBlbEluZm8sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKCiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGp1c3RCaXRyYXRlCiAgICAgICAgIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBmcmFtZWxlbmd0aCB2aWEgcGFkZGluZyBvbiBhIGZyYW1lIHRvIGZyYW1lIGJhc2lzLAogICAgICAgICAgICAgICAgICAgICAgIHRvIGFjaGlldmUgYSBiaXRyYXRlIHRoYXQgZGVtYW5kcyBhIG5vbiBieXRlIGFsaWduZWQKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWxlbmd0aAogICAgICAgICByZXR1cm46ICAgICAgIGVycm9yY29kZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoUUNfU1RBVEUgICAgICAgICpSRVNUUklDVCBoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqUkVTVFJJQ1QgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAqYXZnVG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgIGJpdFJhdGUsICAgICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBzYW1wbGVSYXRlLCAgICAvKiBvdXRwdXQgc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgpIC8qIGZyYW1lIGxlbmd0aCAqLwp7CiAgSU5UIHBhZGRpbmdPbjsKICBJTlQgZnJhbWVMZW47CgogIC8qIERvIHdlIG5lZWQgYW4gZXh0cmEgcGFkZGluZyBieXRlPyAqLwogIHBhZGRpbmdPbiA9IEZES2FhY0VuY19mcmFtZVBhZGRpbmcoYml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFDLT5wYWRkaW5nLnBhZGRpbmdSZXN0KTsKCiAgZnJhbWVMZW4gPSBwYWRkaW5nT24gKyBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOwoKICAqYXZnVG90YWxCaXRzID0gZnJhbWVMZW48PDM7CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgpzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX2Rpc3RyaWJ1dGVFbGVtZW50RHluQml0cyhRQ19TVEFURSogICAgICAgICBoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgY29kZUJpdHMpCnsKCiAgSU5UIGksIGZpcnN0RWwgPSBjbS0+bkVsZW1lbnRzLTE7CiAgSU5UIHRvdGFsQml0cyA9IDA7CgogIGZvciAoaT0oY20tPm5FbGVtZW50cy0xKTsgaT49MDsgaS0tKSB7CiAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKICAgIHsKICAgICAgcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0cyA9ICAoSU5UKWZNdWx0KGhRQy0+ZWxlbWVudEJpdHNbaV0tPnJlbGF0aXZlQml0c0VsLCAoRklYUF9EQkwpY29kZUJpdHMpOwogICAgICB0b3RhbEJpdHMgKz0gcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0czsKICAgICAgZmlyc3RFbCA9IGk7CiAgICB9CiAgfQogIHFjRWxlbWVudFtmaXJzdEVsXS0+Z3JhbnRlZER5bkJpdHMgKz0gY29kZUJpdHMgLSB0b3RhbEJpdHM7CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgovKioKICogXGJyaWVmICBWZXJpZnkgd2hldGhlciBtaW5CaXRzUGVyRnJhbWUgY3JpdGVyaW9uIGNhbiBiZSBzYXRpc2ZpZWQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSBiaXQgY29uc3VtcHRpb24gb25seSBpZiBtaW5CaXRzUGVyRnJhbWUgcGFyYW1ldGVyIGlzIG5vdCAwLgogKiBJbiBoeXBlcmZyYW1pbmcgbW9kZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyYW50ZWREeW5CaXRzIGFuZCB1c2VkRHluQml0cyBvZiBhbGwgc3ViIGZyYW1lcwogKiByZXN1bHRzIHRoZSBudW1iZXIgb2YgZmlsbGJpdHMgdG8gYmUgd3JpdHRlbi4KICogVGhpcyBiaXRzIGNhbiBiZSBkaXN0cnViaXR1ZWQgaW4gc3VwZXJmcmFtZSB0byByZWFjaCBtaW5CaXRzUGVyRnJhbWUgYml0IGNvbnN1bXB0aW9uIGluIHNpbmdsZSBBVSdzLgogKiBUaGUgcmV0dXJuIHZhbHVlIGRlbm90ZXMgaWYgZW5vdWdoIGRlc2lyZWQgZmlsbCBiaXRzIGFyZSBhdmFpbGFibGUgdG8gYWNoaWV2ZSBtaW5CaXRzUGVyRnJhbWUgaW4gYWxsIGZyYW1lcy4KICogVGhpcyBjaGVjayBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBzdXBlcmZyYW1lcy4KICoKICogXHBhcmFtIHFjT3V0ICAgICAgICAgICAgUG9pbnRlciB0byBjb2RpbmcgZGF0YSBzdHJ1Y3QuCiAqIFxwYXJhbSBtaW5CaXRzUGVyRnJhbWUgIE1pbmltYWwgbnVtYmVyIG9mIGJpdHMgdG8gYmUgY29uc3VtZWQgaW4gZWFjaCBmcmFtZS4KICogXHBhcmFtIG5TdWJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcyBpbiBzdXBlcmZyYW1lCiAqCiAqIFxyZXR1cm4KICogICAgICAgICAgLSAxOiBhbGwgZmluZQogKiAgICAgICAgICAtIDA6IGNyaXRlcmlvbiBub3QgZnVsZmlsbGVkCiAqLwpzdGF0aWMgaW50IGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKAogICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBtaW5CaXRzUGVyRnJhbWUsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzCiAgICAgICAgKQp7CiAgaW50IHJlc3VsdCA9IDE7IC8qIGFsbCBmaW5lKi8KICByZXR1cm4gcmVzdWx0Owp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZAogICAgICAgICBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBtaW5tYWwgc2l6ZSBvZiBzdGF0aWMgYml0cyBieSByZWR1Y3Rpb24gLAogICAgICAgICAgICAgICAgICAgICAgIHRvIHplcm8gc3BlY3RydW0gYW5kIGRlYWN0aXZhdGluZyB0bnMgYW5kIE1TCiAgICAgICAgIHJldHVybjogICAgICAgbnVtYmVyIG9mIHN0YXRpYyBiaXRzCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50IEZES2FhY0VuY19nZXRNaW5pbWFsU3RhdGljQml0ZGVtYW5kKENIQU5ORUxfTUFQUElORyogICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgIHBzeU91dCkKewogIEFVRElPX09CSkVDVF9UWVBFIGFvdCA9IEFPVF9BQUNfTEM7CiAgVUlOVCAgc3ludGF4RmxhZ3MgPSAwOwogIFNDSEFSIGVwQ29uZmlnID0gLTE7CiAgaW50IGksIGJpdGNvdW50ID0gMDsKCiAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CiAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwoKICAgICAgaWYgKCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpCiAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKQogICAgICAgIHx8IChlbEluZm8uZWxUeXBlID09IElEX0xGRSkgKQogICAgICB7CiAgICAgICAgSU5UIG1pbkVsQml0cyA9IDA7CgogICAgICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCAmZWxJbmZvLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFswXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbkVsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOwogICAgICAgIGJpdGNvdW50ICs9IG1pbkVsQml0czsKICAgICAgfQogIH0KCiAgcmV0dXJuIGJpdGNvdW50Owp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKFFDX1NUQVRFKiAgICAgICAgICAgIGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgcHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICAgIHFjRWxlbWVudFsoMSldWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqdG90YWxBdmFpbGFibGVCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICphdmdUb3RhbER5bkJpdHMpCnsKICAgIGludCBpOwogICAgICAvKiBnZXQgbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyAqLwogICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgPSAgKGZpeE1pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgYXZnVG90YWxCaXRzKSAtIGhRQy0+Z2xvYkhkckJpdHMpJn43OwogICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLT0gKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOwogICAgICBxY091dFswXS0+bWF4RHluQml0cyA9ICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUpJn43KSAtIChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKICAgICAgLyogYXNzdXJlIHRoYXQgZW5vdWdoIGJpdHMgYXJlIGF2YWlsYWJsZSAqLwogICAgICBpZiAoKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cytoUUMtPmJpdFJlc1RvdCkgPCAwKSB7CiAgICAgICAgLyogY3Jhc2ggcmVjb3ZlcnkgYWxsb3dzIHRvIHJlZHVjZSBzdGF0aWMgYml0cyB0byBhIG1pbmltdW0gKi8KICAgICAgICBpZiAoIChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMraFFDLT5iaXRSZXNUb3QpIDwgKEZES2FhY0VuY19nZXRNaW5pbWFsU3RhdGljQml0ZGVtYW5kKGNtLCBwc3lPdXQpLXFjT3V0WzBdLT5zdGF0aWNCaXRzKSApCiAgICAgICAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0xPVzsKICAgICAgfQoKICAgICAgLyogZGlzdHJpYnV0ZSBkeW5hbWljIGJpdHMgdG8gZWFjaCBlbGVtZW50ICovCiAgICAgIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoaFFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMpOwoKICAgICAgKmF2Z1RvdGFsRHluQml0cyA9IDA7IC8qZnJhbWVEeW5CaXRzOyovCgogICAgKnRvdGFsQXZhaWxhYmxlQml0cyA9IGF2Z1RvdGFsQml0czsKCiAgICAvKiBzdW0gdXAgY29ycmVjdGVkIGdyYW50ZWQgUEUgKi8KICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgPSAwOwoKICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgIHsKICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKICAgICAgICBpbnQgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7CgogICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLwogICAgICAgICAgICAgICAgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKGhRQy0+aEFkalRociwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5wZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPmNvbW1vbldpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbMF1baV0tPmdyYW50ZWREeW5CaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4Qml0RmFjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+Yml0RGlzdHJpYnV0aW9uTW9kZSk7CgogICAgICAgICAgICAgICAgKnRvdGFsQXZhaWxhYmxlQml0cyArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsOwogICAgICAgIC8qIGdldCB0b3RhbCBjb3JyZWN0ZWQgZ3JhbnRlZCBQRSAqLwogICAgICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgKz0gcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyOwogICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KCiAgICAqdG90YWxBdmFpbGFibGVCaXRzID0gRkRLbWluKGhRQy0+bWF4Qml0c1BlckZyYW1lLCAoKnRvdGFsQXZhaWxhYmxlQml0cykpOwoKICAgIHJldHVybiBBQUNfRU5DX09LOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZVVzZWREeW5CaXRzKElOVCogICAgICAgICAgICAgICBzdW1EeW5CaXRzQ29uc3VtZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgIHFjRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICBjbSkKewogIElOVCBpOwoKICAqc3VtRHluQml0c0NvbnN1bWVkID0gMDsKCiAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQogIHsKICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CgogICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICB7CiAgICAgICAgICAvKiBzdW0gdXAgYml0cyBjb25zdW1lZCAqLwogICAgICAgICAgKnN1bUR5bkJpdHNDb25zdW1lZCAgKz0gcWNFbGVtZW50W2ldLT5keW5CaXRzVXNlZDsKICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgpzdGF0aWMgSU5UIEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkRHluQml0cyhRQ19PVVQqKiBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblN1YkZyYW1lcykKewogICAgSU5UIGMsIHRvdGFsQml0cz0wOwoKICAgIC8qIHN1bSB1cCBiaXQgY29uc3VtcHRpb24gZm9yIGFsbCBzdWIgZnJhbWVzICovCiAgICBmb3IgKGM9MDsgYzxuU3ViRnJhbWVzOyBjKyspCiAgICB7CiAgICAgICAgLyogYml0IGNvbnN1bXB0aW9uIG5vdCB2YWxpZCBpZiBkeW5hbWljIGJpdHMKICAgICAgICAgICBub3QgYXZhaWxhYmxlIGluIG9uZSBzdWIgZnJhbWUgKi8KICAgICAgICBpZiAocWNPdXRbY10tPnVzZWREeW5CaXRzPT0tMSkgcmV0dXJuIC0xOwogICAgICAgIHRvdGFsQml0cyArPSBxY091dFtjXS0+dXNlZER5bkJpdHM7CiAgICB9CgogICAgcmV0dXJuIHRvdGFsQml0czsKCn0KCnN0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKFFDX09VVCoqICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoMSldWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgZ2xvYkhkckJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgblN1YkZyYW1lcykKewogICAgaW50IGMsIGk7CiAgICBpbnQgdG90YWxVc2VkQml0cyA9IDA7CgogICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKICAgIHsKICAgICAgICBpbnQgZGF0YUJpdHMgPSAwOwogICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIGRhdGFCaXRzICs9IHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgKyBxY0VsZW1lbnRbY11baV0tPnN0YXRpY0JpdHNVc2VkICsgcWNFbGVtZW50W2NdW2ldLT5leHRCaXRzVXNlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkYXRhQml0cyArPSBxY091dFtjXS0+Z2xvYmFsRXh0Qml0czsKCiAgICAgICAgdG90YWxVc2VkQml0cyArPSAoOCAtIChkYXRhQml0cykgJSA4KSAlIDg7CiAgICAgICAgdG90YWxVc2VkQml0cyArPSBkYXRhQml0cyArIGdsb2JIZHJCaXRzOyAgLyogaGVhZGVyIGJpdHMgZm9yIGV2ZXJ5IGZyYW1lICovCiAgICB9CiAgICByZXR1cm4gdG90YWxVc2VkQml0czsKfQoKc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19CaXRSZXNSZWRpc3RyaWJ1dGlvbigKICAgICAgICBRQ19TVEFURSAqY29uc3QgICAgICAgICAgICAgIGhRQywKICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzCiAgICAgICAgKQp7CiAgICAvKiBjaGVjayBiaXRyZXNlcnZvaXIgZmlsbCBsZXZlbCAqLwogICAgaWYgKGhRQy0+Yml0UmVzVG90IDwgMCkgewogICAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0xPVzsKICAgIH0KICAgIGVsc2UgaWYgKGhRQy0+Yml0UmVzVG90ID4gaFFDLT5iaXRSZXNUb3RNYXgpIHsKICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19ISUdIOwogICAgfQogICAgZWxzZSB7CiAgICAgIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOwogICAgICBJTlQgdG90YWxCaXRzID0gMCwgdG90YWxCaXRzX21heCA9IDA7CgogICAgICBpbnQgdG90YWxCaXRyZXNlcnZvaXIgICAgPSBGREttaW4oaFFDLT5iaXRSZXNUb3QsIChoUUMtPm1heEJpdHNQZXJGcmFtZS1hdmdUb3RhbEJpdHMpKTsKICAgICAgaW50IHRvdGFsQml0cmVzZXJ2b2lyTWF4ID0gRkRLbWluKGhRQy0+Yml0UmVzVG90TWF4LCAoaFFDLT5tYXhCaXRzUGVyRnJhbWUtYXZnVG90YWxCaXRzKSk7CgogICAgICBpbnQgc2NfYml0UmVzVG90ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pcik7CiAgICAgIGludCBzY19iaXRSZXNUb3RNYXggPSBDb3VudExlYWRpbmdCaXRzKHRvdGFsQml0cmVzZXJ2b2lyTWF4KTsKCiAgICAgIGZvciAoaT0oY20tPm5FbGVtZW50cy0xKTsgaT49MDsgaS0tKSB7CiAgICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgIHsKICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwgPSAoSU5UKWZNdWx0KGhRQy0+ZWxlbWVudEJpdHNbaV0tPnJlbGF0aXZlQml0c0VsLCAoRklYUF9EQkwpKHRvdGFsQml0cmVzZXJ2b2lyPDxzY19iaXRSZXNUb3QpKT4+c2NfYml0UmVzVG90OwogICAgICAgICAgdG90YWxCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWw7CgogICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsID0gKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKSh0b3RhbEJpdHJlc2Vydm9pck1heDw8c2NfYml0UmVzVG90TWF4KSk+PnNjX2JpdFJlc1RvdE1heDsKICAgICAgICAgIHRvdGFsQml0c19tYXggKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsOwoKICAgICAgICAgIGZpcnN0RWwgPSBpOwogICAgICAgIH0KICAgICAgfQogICAgICBoUUMtPmVsZW1lbnRCaXRzW2ZpcnN0RWxdLT5iaXRSZXNMZXZlbEVsICAgKz0gdG90YWxCaXRyZXNlcnZvaXIgLSB0b3RhbEJpdHM7CiAgICAgIGhRQy0+ZWxlbWVudEJpdHNbZmlyc3RFbF0tPm1heEJpdFJlc0JpdHNFbCArPSB0b3RhbEJpdHJlc2Vydm9pck1heCAtIHRvdGFsQml0c19tYXg7CiAgICB9CgogICAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFKiBSRVNUUklDVCAgICAgICAgIGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogICAgICAgICAgICAgICAgICBwc3lPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgICAgICAgIGNtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgaSwgYzsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CiAgSU5UIGF2Z1RvdGFsRHluQml0cyA9IDA7IC8qIG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgZm9yIGFsbCBmcmFtZXMgKi8KICBJTlQgdG90YWxBdmFpbGFibGVCaXRzID0gMDsKICBJTlQgblN1YkZyYW1lcyA9IDE7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAvKiByZWRpc3RyaWJ1dGUgdG90YWwgYml0cmVzZXJ2b2lyIHRvIGVsZW1lbnRzICovCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfQml0UmVzUmVkaXN0cmlidXRpb24oaFFDLCBjbSwgYXZnVG90YWxCaXRzKTsKICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgewogICAgcmV0dXJuIEVycm9yU3RhdHVzOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qIGZhc3RlbmMgbmVlZHMgb25lIHRpbWUgdGhyZXNob2xkIHNpbXVsYXRpb24sCiAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSBmcmFtZXMsIG9uZSBtb3JlIGd1ZXNzIGhhcyB0byBiZSBjYWxjdWxhdGVkICovCgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgIC8qIGhlbHBlciBwb2ludGVyICovCiAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50WygxKV1bKDgpXTsKCiAgICAgIC8qIHdvcmsgb24gYSBjb3B5IG9mIHFjQ2hhbm5lbCBhbmQgcWNFbGVtZW50ICovCiAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgewogICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CgogICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KICAgICAgICAgICAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldID0gcWNPdXRbY10tPnFjRWxlbWVudFtpXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgIGlmICggaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpICkKICAgICAgewogICAgICAgICAgLyogY2FsYyBncmFudGVkIGR5bmFtaWMgYml0cyBmb3Igc3ViIGZyYW1lIGFuZAogICAgICAgICAgICAgZGlzdHJpYnV0ZSBpdCB0byBlYWNoIGVsZW1lbnQgKi8KICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3ByZXBhcmVCaXREaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbEF2YWlsYWJsZUJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Z1RvdGFsRHluQml0cyk7CgogICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHsKICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzID0gKChoUUMtPm1heEJpdHNQZXJGcmFtZSAtIChoUUMtPmdsb2JIZHJCaXRzKSkmfjcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7CiAgICAgICAgICBxY091dFswXS0+bWF4RHluQml0cyAgICAgPSBxY091dFswXS0+Z3JhbnRlZER5bkJpdHM7CgogICAgICAgICAgdG90YWxBdmFpbGFibGVCaXRzID0gaFFDLT5tYXhCaXRzUGVyRnJhbWU7CiAgICAgICAgICBhdmdUb3RhbER5bkJpdHMgPSAwOwogICAgICB9CgojaWZkZWYgUE5TX1BSRUNPVU5UX0VOQUJMRQogICAgICAvKiBDYWxjdWxhdGUgZXN0aW1hdGVkIHBucyBiaXRzIGFuZCBzdWJzdHJhY3QgdGhlbSBmcm9tIGdyYW50ZWREeW5CaXRzIHRvIGdldCBhIG1vcmUgYWNjdXJhdGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzLiAqLwogICAgICBpZiAoc3ludGF4RmxhZ3MgJiAoQUNfTER8QUNfRUxEKSkKICAgICAgewogICAgICAgIGludCBlc3RpbWF0ZWRQbnNCaXRzID0gMCwgY2g7CgogICAgICAgIGZvciAoY2g9MDsgY2g8Y20tPm5DaGFubmVsczsgY2grKykgewogICAgICAgICAgcWNPdXRbMF0tPnBRY091dENoYW5uZWxzW2NoXS0+c2VjdGlvbkRhdGEubm9pc2VOcmdCaXRzID0gbm9pc2VQcmVDb3VudChwc3lPdXRbMF0tPnBQc3lPdXRDaGFubmVsc1tjaF0tPm5vaXNlTnJnLCBwc3lPdXRbMF0tPnBQc3lPdXRDaGFubmVsc1tjaF0tPm1heFNmYlBlckdyb3VwKTsKICAgICAgICAgIGVzdGltYXRlZFBuc0JpdHMgKz0gcWNPdXRbMF0tPnBRY091dENoYW5uZWxzW2NoXS0+c2VjdGlvbkRhdGEubm9pc2VOcmdCaXRzOwogICAgICAgIH0KICAgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLT0gZXN0aW1hdGVkUG5zQml0czsKICAgICAgfQojZW5kaWYKCiAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCiAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCiAgICAgIHsKICAgICAgICAgIC8qIGZvciBDQlIgYW5kIFZCUiBtb2RlICovCiAgICAgICAgICBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0W2NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5oQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7CgogICAgICB9IC8qIC1lbmQtIHN1YiBmcmFtZSBjb3VudGVyICovCgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgIElOVCBpdGVyYXRpb25zWygxKV1bKDgpXTsKICAgICAgSU5UIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldWygyKV07CiAgICAgIElOVCBjYWxjdWxhdGVRdWFudFsoMSldWyg4KV1bKDIpXTsKICAgICAgSU5UIGNvbnN0cmFpbnRzRnVsZmlsbGVkWygxKV1bKDgpXTsKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCiAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCiAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCiAgICAgIHsKICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOwoKICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogVHVybiB0aHJlc2hvbGRzIGludG8gc2NhbGVmYWN0b3JzLCBvcHRpbWl6ZSBiaXQgY29uc3VtcHRpb24gYW5kIHZlcmlmeSBjb25mb3JtYW5jZSAqLwogICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPnFjT3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmludlF1YW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWwpOwoKCiAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zW2NdW2ldID0gMCA7CgogICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwoKICAgICAgICAgIHFjT3V0W2NdLT51c2VkRHluQml0cyA9IC0xOwoKICAgICAgfSAvKiAtZW5kLSBzdWIgZnJhbWUgY291bnRlciAqLwoKCgogICAgICBJTlQgcXVhbnRpemF0aW9uRG9uZSA9IDA7CiAgICAgIElOVCBzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCAgPSAwOwogICAgICBJTlQgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IC0xOyAvKiBubyBkaXJlY3Rpb24geWV0ISAqLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAvKiAtc3RhcnQtIFF1YW50aXphdGlvbiBsb29wIC4uLiAgICAgICAgICAgICAgICovCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgZG8gLyogdW50aWwgbWF4IGFsbG93ZWQgYml0cyBwZXIgZnJhbWUgYW5kIG1heER5bkJpdHMhPS0xKi8KICAgICAgewogICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7CgogICAgICAgICAgICAgIGMgPSAwOyAgICAgICAgICAgICAgLyogZ2V0IGZyYW1lIHRvIHByb2Nlc3MgKi8KCiAgICAgICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CiAgICAgICAgICAgICAgICAgIElOVCBjaCwgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7CgogICAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICBkbyAvKiB1bnRpbCBzcGVjdHJhbCB2YWx1ZXMgPCBNQVhfUVVBTlQgKi8KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19yZWR1Y2VCaXRDb25zdW1wdGlvbigmaXRlcmF0aW9uc1tjXVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4SXRlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uKSA/IDEgOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0W2NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDEgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemUgc3BlY3RydW0gKHBlciBlYWNoIGNoYW5uZWwpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaCA9IHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsW2NoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPSBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSA9IDA7IC8qIGNhbGN1bGF0ZSBxdWFudGl6YXRpb24gb25seSBpZiBuZWNlc3NhcnkgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bShwc3lPdXRDaC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5nbG9iYWxHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+c2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKHBzeU91dENoLT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAwIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgcXVhbml6dGVkIHZhbHVlIG91dCBvZiByYW5nZTsgaW5jcmVhc2UgZ2xvYmFsIGdhaW4hICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogaWYgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdICovCgogICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogY2hhbm5lbCBsb29wICovCgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6ZSBzcGVjdHJ1bSAocGVyIGVhY2ggY2hhbm5lbCkgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkgOyAvKiBkb2VzIG5vdCByZWdhcmQgYml0IGNvbnN1bXB0aW9uICovCgoKICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgPSAwIDsgLyogcmVzZXQgZHluYW1pYyBiaXRzICovCgogICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHZhbGlkIGluIGN1cnJlbnQgY2hhbm5lbCEgKi8KICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaCA9IHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsW2NoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoID0gcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnQgZHluYW1pYyBiaXRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoRHluQml0cyA9IEZES2FhY0VuY19keW5CaXRDb3VudChoUUMtPmhCaXRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWF4VmFsdWVJblNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5sYXN0V2luZG93U2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXRDaC0+c2VjdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bm9pc2VOcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+aXNCb29rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmlzU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncykgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgZHluYW1pYyBjaGFubmVsIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkICs9IGNoRHluQml0czsKICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgIGlmKGhRQy0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5keW5CaXRzTGFzdD09LTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXS0+ZHluQml0c0xhc3QgPSBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCgogICAgICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwoKICAgICAgICAgICAgICAvKiB1cGRhdGUgZHluQml0cyBvZiBjdXJyZW50IHN1YkZyYW1lICovCiAgICAgICAgICAgICAgRkRLYWFjRW5jX3VwZGF0ZVVzZWREeW5CaXRzKCZxY091dFtjXS0+dXNlZER5bkJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20pOwoKICAgICAgICAgICAgICAvKiBnZXQgdG90YWwgY29uc3VtZWQgYml0cywgZHluIGJpdHMgaW4gYWxsIHN1YiBmcmFtZXMgaGF2ZSB0byBiZSB2YWxpZCAqLwogICAgICAgICAgICAgIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWREeW5CaXRzKHFjT3V0LCBuU3ViRnJhbWVzKTsKCiAgICAgICAgICAgICAgaWYgKHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsPT0tMSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOyAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGluIGFsbCBzdWIgZnJhbWVzICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgc3VtQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMocWNPdXQsIHFjRWxlbWVudCwgY20sIGhRQy0+Z2xvYkhkckJpdHMsIG5TdWJGcmFtZXMpOwoKICAgICAgICAgICAgICAgIC8qIGluIGFsbCBmcmFtZXMgYXJlIHZhbGlkIGR5bmFtaWMgYml0cyAqLwogICAgICAgICAgICAgICAgaWYgKCAoKHN1bUJpdHNDb25zdW1lZFRvdGFsIDwgdG90YWxBdmFpbGFibGVCaXRzKSB8fCBxY091dFtjXS0+dXNlZER5bkJpdHM9PTApICYmIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uPT0xKSAmJiBjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCxoUUMtPm1pbkJpdHNQZXJGcmFtZSxuU3ViRnJhbWVzKQogICAgICAgICAgICAgICAgICAgICAgLyooKSovICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7IC8qIGV4aXQgYml0IGFkanVzdG1lbnQgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cyAmJiAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbj09MCkgKQovLyAgICAgICAgICAgICAgICAgICAgICAvKigpKi8gICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsgLyogcmVzZXQhICovCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgICAgICAgIGludCBlbWVyZ2VuY3lJdGVyYXRpb25zID0gMTsKICAgICAgICAgICAgICBpbnQgZHluQml0c092ZXJzaG9vdCAgICA9IDA7CgogICAgICAgICAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwoKICAgICAgICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRpb24gbGltaXRhdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICBlbWVyZ2VuY3lJdGVyYXRpb25zICY9ICgoaXRlcmF0aW9uc1tjXVtpXSA8IGhRQy0+bWF4SXRlcmF0aW9ucykgPyAwIDogMSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLyogZGV0ZWN0aW9uIGlmIHVzZWQgZHluIGJpdHMgZXhjZWVkcyB0aGUgbWF4aW1hbCBhbGxvd2VkIGNyaXRlcmlvbiAqLwogICAgICAgICAgICAgICAgICBkeW5CaXRzT3ZlcnNob290IHw9ICgocWNPdXRbY10tPnVzZWREeW5CaXRzID4gcWNPdXRbY10tPm1heER5bkJpdHMpID8gMSA6IDApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvbkRvbmU9PTAgfHwgZHluQml0c092ZXJzaG9vdCkKICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICBpbnQgc3VtQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMocWNPdXQsIHFjRWxlbWVudCwgY20sIGhRQy0+Z2xvYkhkckJpdHMsIG5TdWJGcmFtZXMpOwoKICAgICAgICAgICAgICAgICAgaWYgKCAoc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPj0gYXZnVG90YWxEeW5CaXRzKSB8fCAoc3VtRHluQml0c0NvbnN1bWVkVG90YWw9PTApICkgewogICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGVtZXJnZW5jeUl0ZXJhdGlvbnMgJiYgKHN1bUJpdHNDb25zdW1lZFRvdGFsIDwgdG90YWxBdmFpbGFibGVCaXRzKSkgewogICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cykgfHwgIWNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoKHN1bUJpdHNDb25zdW1lZFRvdGFsIDwgdG90YWxBdmFpbGFibGVCaXRzKSAmJiBjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCxoUUMtPm1pbkJpdHNQZXJGcmFtZSxuU3ViRnJhbWVzKSkgewogICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgaWYgKGR5bkJpdHNPdmVyc2hvb3QpIHsKICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAvKiByZXNldCBjb25zdHJhaW50cyBmdWxsZmlsbGVkIGZsYWdzICovCiAgICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKGNvbnN0cmFpbnRzRnVsZmlsbGVkLCBzaXplb2YoY29uc3RyYWludHNGdWxmaWxsZWQpKTsKICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgc2l6ZW9mKGNoQ29uc3RyYWludHNGdWxmaWxsZWQpKTsKCgogICAgICAgICAgICAgIH0vKiBxdWFudGl6YXRpb25Eb25lICovCgogICAgICB9IHdoaWxlICghcXVhbnRpemF0aW9uRG9uZSkgOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAvKiAuLi4gLWVuZC0gUXVhbnRpemF0aW9uIGxvb3AgICAgICAgICAgICAgICAgICovCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgpzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKGludCogICAgICAgICAgICAgaXRlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgbWF4SXRlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZ2FpbkFkanVzdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY091dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqICAgIGVsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgIGVwQ29uZmlnKQp7CiAgaW50IGNoOwoKICAvKiogU09MVklORyBQUk9CTEVNICoqLwogIGlmICgoKml0ZXJhdGlvbnMpKysgPj0gbWF4SXRlcmF0aW9ucykKICB7CiAgICBpZiAocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZD09MCkgewogICAgfQogICAgLyogY3Jhc2ggcmVjb3ZlcnkgKi8KICAgIGVsc2UgewogICAgICBJTlQgYml0c1RvU2F2ZSA9IDA7CiAgICAgIGlmICggKGJpdHNUb1NhdmUgPSBmaXhNYXgoKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyA4KSAtIChlbEJpdHMtPmJpdFJlc0xldmVsRWwgKyBxY091dEVsZW1lbnQtPmdyYW50ZWREeW5CaXRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+c3RhdGljQml0c1VzZWQgKyA4KSAtIChlbEJpdHMtPm1heEJpdHNFbCkpKSA+IDAgKQogICAgICB7CiAgICAgICAgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkobkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKICAgICAgICAgICAgICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcpIDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgICB7CiAgICAgICAgICBxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbFtjaF0tPmdsb2JhbEdhaW4gKz0gMTsKICAgICAgfQogICAgfQogICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgewogICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOwogICAgfQogIH0KICB9CiAgZWxzZSAvKiBpdGVyYXRpb25zID49IG1heEl0ZXJhdGlvbnMgKi8KICB7CiAgICAvKiBpbmNyZWFzZSBnYWluICgrIG5leHQgaXRlcmF0aW9uKSAqLwogICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgewogICAgICBpZighY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjaF0pCiAgICAgIHsKICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSBnYWluQWRqdXN0bWVudCA7CiAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOyAvKiBnbG9iYWwgZ2FpbiBoYXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgcXVhbnRpemF0aW9uIGluIG5leHQgaXRlcmF0aW9uISAqLwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKENIQU5ORUxfTUFQUElORyogICAgICAgICAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogICAgICAgICAgICAgICAgIHFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBSRVNUUklDVCAgICBlbEJpdHNbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgcWNPdXQpCnsKICBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgewogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6CiAgICAgICBicmVhazsKCiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8xOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzM6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl80OgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNToKICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzID0gKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0cykmNzsgLyogcHJlY2FsY3VsYXRlIGFsaWdubWVudCBiaXRzICovCiAgICAgIHFjT3V0WzBdLT50b3RhbEJpdHMgPSBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT51c2VkRHluQml0cyArIHFjT3V0WzBdLT50b3RGaWxsQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyArIHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzOwogICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgKz0gKCBmaXhNYXgoMCwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSAtIHFjT3V0WzBdLT50b3RhbEJpdHMpICsgNykgJiB+NzsKICAgICAgYnJlYWs7CgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9DQlI6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQ6CiAgICBkZWZhdWx0OgogICAgICBJTlQgYml0UmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gcWNLZXJuZWwtPmJpdFJlc1RvdCA7CiAgICAgIC8qIHByb2Nlc3NpbmcgZmlsbC1iaXRzICovCiAgICAgIElOVCBkZWx0YUJpdFJlcyA9IHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0cyA7CiAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9IGZpeE1heCgoZGVsdGFCaXRSZXMmNyksIChkZWx0YUJpdFJlcyAtIChmaXhNYXgoMCxiaXRSZXNTcGFjZS03KSZ+NykpKTsKICAgICAgcWNPdXRbMF0tPnRvdGFsQml0cyA9IHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPnVzZWREeW5CaXRzICsgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzICsgcWNPdXRbMF0tPmdsb2JhbEV4dEJpdHM7CiAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyArPSAoIGZpeE1heCgwLCBxY0tlcm5lbC0+bWluQml0c1BlckZyYW1lIC0gcWNPdXRbMF0tPnRvdGFsQml0cykgKyA3KSAmIH43OwogICAgICBicmVhazsKICB9IC8qIHN3aXRjaCAocWNLZXJuZWwtPmJpdHJhdGVNb2RlKSAqLwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihJTlQgICBzZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgc2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpSRVNUUklDVCBxdWFudFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKlJFU1RSSUNUIG1heFZhbHVlKQp7CiAgSU5UIHNmYk9mZnMsc2ZiOwogIElOVCBtYXhWYWx1ZUFsbCA9IDA7CgogIGZvciAoc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKQogICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspCiAgICB7CiAgICAgIElOVCBsaW5lOwogICAgICBJTlQgbWF4VGhpc1NmYiA9IDA7CiAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzK3NmYl07IGxpbmUgPCBzZmJPZmZzZXRbc2ZiT2ZmcytzZmIrMV07IGxpbmUrKykKICAgICAgewogICAgICAgIElOVCB0bXAgPSBmaXhwX2FicyhxdWFudFNwZWN0cnVtW2xpbmVdKTsKICAgICAgICBtYXhUaGlzU2ZiID0gZml4TWF4KHRtcCwgbWF4VGhpc1NmYik7CiAgICAgIH0KCiAgICAgIG1heFZhbHVlW3NmYk9mZnMrc2ZiXSA9IG1heFRoaXNTZmI7CiAgICAgIG1heFZhbHVlQWxsID0gZml4TWF4KG1heFRoaXNTZmIsIG1heFZhbHVlQWxsKTsKICAgIH0KICByZXR1cm4gbWF4VmFsdWVBbGw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY191cGRhdGVCaXRyZXMKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyhDSEFOTkVMX01BUFBJTkcgKmNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqIHFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogcWNPdXQpCnsKICBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgewogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9GRjoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzE6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8yOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzQ6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl81OgogICAgICAvKiB2YXJpYWJsZSBiaXRyYXRlICovCiAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSBGREttaW4ocWNLZXJuZWwtPm1heEJpdHNQZXJGcmFtZSwgcWNLZXJuZWwtPmJpdFJlc1RvdE1heCk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfQ0JSOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQ6CiAgICBkZWZhdWx0OgogICAgICBpbnQgYyA9IDA7CiAgICAgIC8qIGNvbnN0YW50IGJpdHJhdGUgKi8KICAgICAgewogICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgKz0gcWNPdXRbY10tPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0W2NdLT51c2VkRHluQml0cyArIHFjT3V0W2NdLT50b3RGaWxsQml0cyArIHFjT3V0W2NdLT5hbGlnbkJpdHMpOwogICAgICB9CiAgICAgIGJyZWFrOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbgogICAgICAgICBkZXNjcmlwdGlvbjoKICAgICAgICAgcmV0dXJuOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oQ0hBTk5FTF9NQVBQSU5HICpjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUgKnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCoqIHFjRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgIGVwQ29uZmlnKQp7CiAgUUNfT1VUX0VYVEVOU0lPTiBmaWxsRXh0UGF5bG9hZDsKICBJTlQgdG90RmlsbEJpdHMsIGFsaWduQml0czsKCiAgLyogR2V0IHRvdGFsIGNvbnN1bWVkIGJpdHMgaW4gQVUgKi8KICBxY091dC0+dG90YWxCaXRzID0gcWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgICsgcWNPdXQtPnRvdEZpbGxCaXRzICsKICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHM7CgogIGlmIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0NCUikgewoKICAgIC8qIE5vdyB3ZSBjYW4gZ2V0IHRoZSBleGFjdCB0cmFuc3BvcnQgYml0IGFtb3VudCwgYW5kIGhvcGVmdWxseSBpdCBpcyBlcXVhbCB0byB0aGUgZXN0aW1hdGVkIHZhbHVlICovCiAgICBJTlQgZXhhY3RUcEJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjT3V0LT50b3RhbEJpdHMpOwoKICAgIGlmIChleGFjdFRwQml0cyAhPSBxY0tlcm5lbC0+Z2xvYkhkckJpdHMpIHsKICAgICAgSU5UIGRpZmZGaWxsQml0cyA9IDA7CgogICAgICAvKiBIb3cgbWFueSBiaXRzIGNhbiBiZSB0YWtlbiBieSBiaXRyZXNlcnZvaXIgKi8KICAgICAgY29uc3QgSU5UIGJpdHJlc1NwYWNlID0gcWNLZXJuZWwtPmJpdFJlc1RvdE1heCAtIChxY0tlcm5lbC0+Yml0UmVzVG90ICsgKHFjT3V0LT5ncmFudGVkRHluQml0cyAtIChxY091dC0+dXNlZER5bkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMpICkgKTsKCiAgICAgIC8qIE51bWJlciBvZiBiaXRzIHdoaWNoIGNhbiBiZSBtb3ZlZCB0byBiaXRyZXNlcnZvaXIuICovCiAgICAgIGNvbnN0IElOVCBiaXRzVG9CaXRyZXMgPSBxY0tlcm5lbC0+Z2xvYkhkckJpdHMgLSBleGFjdFRwQml0czsKICAgICAgRkRLX0FTU0VSVChiaXRzVG9CaXRyZXM+PTApOyAvKiBpcyBhbHdheXMgcG9zaXRpdmUgKi8KCiAgICAgIC8qIElmIGJpdHJlc2Vydm9pciBjYW4gbm90IHRha2UgYWxsIGJpdHMsIG1vdmUgcmFtYWluaW5nIGJpdHMgdG8gZmlsbGJpdHMgKi8KICAgICAgZGlmZkZpbGxCaXRzID0gRkRLbWF4KDAsIGJpdHNUb0JpdHJlcyAtIGJpdHJlc1NwYWNlKTsKCiAgICAgIC8qIEFzc3VyZSBwcmV2aW91cyBhbGlnbm1lbnQgKi8KICAgICAgZGlmZkZpbGxCaXRzID0gKGRpZmZGaWxsQml0cys3KSZ+NzsKCiAgICAgIC8qIE1vdmUgYXMgbWFueSBiaXRzIGFzIHBvc3NpYmxlIHRvIGJpdHJlc2Vydm9pciAqLwogICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICAgICs9IChiaXRzVG9CaXRyZXMtZGlmZkZpbGxCaXRzKTsKCiAgICAgIC8qIFdyaXRlIHJlbWFpbmcgYml0cyBhcyBmaWxsIGJpdHMgKi8KICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICAgICArPSBkaWZmRmlsbEJpdHM7CiAgICAgIHFjT3V0LT50b3RhbEJpdHMgICAgICAgKz0gZGlmZkZpbGxCaXRzOwogICAgICBxY091dC0+Z3JhbnRlZER5bkJpdHMgICs9IGRpZmZGaWxsQml0czsKCiAgICAgIC8qIEdldCBuZXcgaGVhZGVyIGJpdHMgKi8KICAgICAgcWNLZXJuZWwtPmdsb2JIZHJCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY091dC0+dG90YWxCaXRzKTsKCiAgICAgIGlmIChxY0tlcm5lbC0+Z2xvYkhkckJpdHMgIT0gZXhhY3RUcEJpdHMpIHsKICAgICAgICAvKiBJbiBwcmV2aW91cyBzdGVwLCBmaWxsIGJpdHMgYW5kIGNvcnJlc3BvbmRpbmcgdG90YWwgYml0cyB3ZXJlIGNoYW5nZWQgd2hlbiBiaXRyZXNlcnZvaXIgd2FzIGNvbXBsZXRlbHkgZmlsbGVkLgogICAgICAgICAgIE5vdyB3ZSBjYW4gdGFrZSB0aGUgdG9vIG11Y2ggdGFrZW4gYml0cyBjYXVzZWQgYnkgaGVhZGVyIG92ZXJoZWFkIGZyb20gYml0cmVzZXJ2b2lyLgogICAgICAgICAqLwogICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgLT0gKHFjS2VybmVsLT5nbG9iSGRyQml0cyAtIGV4YWN0VHBCaXRzKTsKICAgICAgfQogICAgfQoKICB9IC8qIE1PREVfQ0JSICovCgogIC8qIFVwZGF0ZSBleGFjdCBudW1iZXIgb2YgY29uc3VtZWQgaGVhZGVyIGJpdHMuICovCiAgcWNLZXJuZWwtPmdsb2JIZHJCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY091dC0+dG90YWxCaXRzKTsKCiAgLyogU2F2ZSB0b3RhbCBmaWxsIGJpdHMgYW5kIGRpc3RyaWJ1dCB0byBhbGlnbm1lbnQgYW5kIGZpbGwgYml0cyAqLwogIHRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzOwoKICAvKiBmYWtlIGEgZmlsbCBleHRlbnNpb24gcGF5bG9hZCAqLwogIEZES21lbWNsZWFyKCZmaWxsRXh0UGF5bG9hZCwgc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKCiAgZmlsbEV4dFBheWxvYWQudHlwZSA9IEVYVF9GSUxMX0RBVEE7CiAgZmlsbEV4dFBheWxvYWQublBheWxvYWRCaXRzID0gdG90RmlsbEJpdHM7CgogIC8qIGFzayBiaXRzdHJlYW0gZW5jb2RlciBob3cgbWFueSBvZiB0aGF0IGJpdHMgY2FuIGJlIHdyaXR0ZW4gaW4gYSBmaWxsIGV4dGVuc2lvbiBkYXRhIGVudGl0eSAqLwogIHFjT3V0LT50b3RGaWxsQml0cyA9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsbEV4dFBheWxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKCiAgLyogbm93IGRpc3RyaWJ1dGUgZXh0cmEgZmlsbGJpdHMgYW5kIGFsaWduYml0cyAqLwogIGFsaWduQml0cyA9IDcgLSAocWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgKyBxY091dC0+ZWxlbWVudEV4dEJpdHMKICAgICAgICAgICAgICAgICAgICsgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHMgLTEpJTg7CgogIC8qIE1heWJlIHdlIGNvdWxkIHJlbW92ZSB0aGlzICovCiAgaWYoICgoYWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHMpPT04KSAmJiAocWNPdXQtPnRvdEZpbGxCaXRzPjgpICkKICAgICAgICBxY091dC0+dG90RmlsbEJpdHMgLT0gODsKCiAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzICsKICAgICAgICAgICAgICAgICAgICAgYWxpZ25CaXRzICsgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHM7CgogIGlmICggKHFjT3V0LT50b3RhbEJpdHM+cWNLZXJuZWwtPm1heEJpdHNQZXJGcmFtZSkgfHwgKHFjT3V0LT50b3RhbEJpdHM8cWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSkgKSB7CiAgICByZXR1cm4gQUFDX0VOQ19RVUFOVF9FUlJPUjsKICB9CgogIHFjT3V0LT5hbGlnbkJpdHMgPSBhbGlnbkJpdHM7CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkKICAgICAgICAgZGVzY3JpcHRpb246ICBmdWxmaWxscyBjb25zdHJhaW50cyBieSBtZWFucyBvZiBicnV0ZSBmb3JjZS4uLgogICAgICAgICAgICAgICAgICAgICAgID0+IGJpdHMgYXJlIHNhdmVkIGJ5IGNhbmNlbGxpbmcgb3V0IHNwZWN0cmFsIGxpbmVzISEKICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW5uaW5nIGF0IHRoZSBoaWdoZXN0IGZyZXF1ZW5jaWVzKQogICAgICAgICByZXR1cm46ICAgICAgIGVycm9yY29kZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCAgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAgKnFjRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBiaXRzVG9TYXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICBlcENvbmZpZykKewogIElOVCBjaCA7CiAgSU5UIHNhdmVkQml0cyA9IDAgOwogIElOVCBzZmIsIHNmYkdycCA7CiAgSU5UIGJpdHNQZXJTY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdIDsKICBJTlQgc2VjdGlvblRvU2NmWygyKV1bTUFYX0dST1VQRURfU0ZCXSA7CiAgSU5UICpzZmJPZmZzZXQgOwogIElOVCBzZWN0LCBzdGF0Qml0c05ldyA7CiAgUUNfT1VUX0NIQU5ORUwgKipxY0NoYW5uZWwgPSBxY0VsZW1lbnQtPnFjT3V0Q2hhbm5lbDsKICBQU1lfT1VUX0NIQU5ORUwgKipwc3lDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsKCiAgLyogY3JlYXRlIGEgdGFibGUgd2hpY2ggY29udmVydHMgZnJxLWJpbnMgdG8gYml0LWRlbWFuZC4uLiAgICBbYml0c1BlclNjZl0gKi8KICAvKiAuLi5hbmQgYW5vdGhlciBvbmUgd2hpY2ggaG9sZHMgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbnMgW3NlY3Rpb25Ub1NjZl0gKi8KICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgewogICAgc2ZiT2Zmc2V0ID0gcHN5Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMgOwoKICAgIGZvciAoc2VjdCA9IDA7IHNlY3QgPCBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5ub09mU2VjdGlvbnM7IHNlY3QrKykKICAgIHsKICAgICAgSU5UIHNmYiA7CiAgICAgIElOVCBjb2RlQm9vayA9IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLmNvZGVCb29rIDsKCiAgICAgIGZvciAoc2ZiID0gcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiU3RhcnQ7CiAgICAgICAgICAgc2ZiIDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiU3RhcnQgKwogICAgICAgICAgICAgICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudDsKICAgICAgICAgICBzZmIrKykKICAgICAgewogICAgICAgIGJpdHNQZXJTY2ZbY2hdW3NmYl0gPSAwOwogICAgICAgIGlmICggKGNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pIC8qJiYKICAgICAgICAgICAgIChzZmIgPCAocWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZkdyb3VwcypxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCkpKi8gKQogICAgICAgIHsKICAgICAgICAgICAgSU5UIHNmYlN0YXJ0TGluZSA9IHNmYk9mZnNldFtzZmJdIDsKICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcyAgICA9IHNmYk9mZnNldFtzZmIrMV0gLSBzZmJTdGFydExpbmUgOwogICAgICAgICAgICBiaXRzUGVyU2NmW2NoXVtzZmJdID0gRkRLYWFjRW5jX2NvdW50VmFsdWVzKCYocWNDaGFubmVsW2NoXS0+cXVhbnRTcGVjW3NmYlN0YXJ0TGluZV0pLCBub09mTGluZXMsIGNvZGVCb29rKSA7CiAgICAgICAgfQogICAgICAgIHNlY3Rpb25Ub1NjZltjaF1bc2ZiXSA9IHNlY3QgOwogICAgICB9CgogICAgfQogIH0KCiAgLyogTE9XRVIgW21heFNmYl0gSU4gQk9USCBDSEFOTkVMUyEhICovCiAgLyogQXR0ZW50aW9uOiBpbiBjYXNlIG9mIHN0ZXJlbzogbWF4U2ZiTCA9PSBtYXhTZmJSLCBHcm91cGluZ0wgPT0gR3JvdXBpbmdSIDsgKi8KCiAgZm9yIChzZmIgPSBxY0NoYW5uZWxbMF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwLTE7IHNmYiA+PSAwOyBzZmItLSkKICB7CiAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeUNoYW5uZWxbMF0tPnNmYkNudDsgc2ZiR3JwICs9IHBzeUNoYW5uZWxbMF0tPnNmYlBlckdyb3VwKQogICAgewogICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgICAgIHsKICAgICAgICBpbnQgc2VjdCA9IHNlY3Rpb25Ub1NjZltjaF1bc2ZiR3JwK3NmYl07CiAgICAgICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiQ250LS0gOwogICAgICAgIHNhdmVkQml0cyArPSBiaXRzUGVyU2NmW2NoXVtzZmJHcnArc2ZiXSA7CgogICAgICAgIGlmIChxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQgPT0gMCkgewogICAgICAgICAgc2F2ZWRCaXRzICs9IChwc3lDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpID8gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1swXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFswXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiAuLi5oYXZlIGVub3VnaCBiaXRzIGJlZW4gc2F2ZWQ/ICovCiAgICBpZiAoc2F2ZWRCaXRzID49IGJpdHNUb1NhdmUpCiAgICAgIGJyZWFrIDsKCiAgfSAvKiBzZmIgbG9vcCAqLwoKICAvKiBpZiBub3QgZW5vdWdoIGJpdHMgc2F2ZWQsCiAgICAgY2xlYW4gd2hvbGUgc3BlY3RydW0gYW5kIHJlbW92ZSBzaWRlIGluZm8gb3ZlcmhlYWQgKi8KICBpZiAoc2ZiID09IC0xKSB7CiAgICBzZmIgPSAwIDsKICB9CgogIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKICB7CiAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCA9IHNmYiA7CiAgICBwc3lDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgPSBzZmIgOwogICAgLyogd2hlbiBubyBzcGVjdHJ1bSBpcyBjb2RlZCBzYXZlIHRvb2xzIGluZm8gaW4gYml0c3RyZWFtICovCiAgICBpZihzZmI9PTApIHsKICAgICAgRkRLbWVtY2xlYXIoJnBzeUNoYW5uZWxbY2hdLT50bnNJbmZvLCBzaXplb2YoVE5TX0lORk8pKTsKICAgICAgRkRLbWVtY2xlYXIoJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbywgc2l6ZW9mKFRPT0xTSU5GTykpOwogICAgfQogIH0KICAvKiBkeW5hbWljIGJpdHMgd2lsbCBiZSB1cGRhdGVkIGluIGl0ZXJhdGlvbiBsb29wICovCgogIHsgLyogaWYgc3RvcCBzZmIgaGFzIGNoYW5nZWQgc2F2ZSBiaXRzIGluIHNpZGUgaW5mbywgZS5nLiBNUyBvciBUTlMgY29kaW5nICovCiAgICBFTEVNRU5UX0lORk8gZWxJbmZvOwoKICAgIEZES21lbWNsZWFyKCZlbEluZm8sIHNpemVvZihFTEVNRU5UX0lORk8pKTsKICAgIGVsSW5mby5uQ2hhbm5lbHNJbkVsID0gbkNoYW5uZWxzOwogICAgZWxJbmZvLmVsVHlwZSA9IChuQ2hhbm5lbHMgPT0gMikgPyBJRF9DUEUgOiBJRF9TQ0U7CgogICAgRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIE5VTEwsICZlbEluZm8sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0Qml0c05ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CiAgfQoKICBzYXZlZEJpdHMgPSBxY0VsZW1lbnQtPnN0YXRpY0JpdHNVc2VkIC0gc3RhdEJpdHNOZXc7CgogIC8qIHVwZGF0ZSBzdGF0aWMgYW5kIGR5bmFtaWMgYml0cyAqLwogIHFjRWxlbWVudC0+c3RhdGljQml0c1VzZWQgLT0gc2F2ZWRCaXRzOwogIHFjRWxlbWVudC0+Z3JhbnRlZER5bkJpdHMgKz0gc2F2ZWRCaXRzOwoKICBxY091dC0+c3RhdGljQml0cyAgICAgLT0gc2F2ZWRCaXRzOwogIHFjT3V0LT5ncmFudGVkRHluQml0cyArPSBzYXZlZEJpdHM7CiAgcWNPdXQtPm1heER5bkJpdHMgICAgICs9IHNhdmVkQml0czsKCgp9CgoKCnZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpCnsKICBpbnQgbiwgaTsKCiAgaWYgKHBoUUMhPU5VTEwpIHsKCiAgICBmb3IgKG49MDtuPCgxKTtuKyspIHsKICAgICAgaWYgKHBoUUNbbl0gIT0gTlVMTCkgewogICAgICAgIFFDX09VVCAgICAqaFFDICAgICAgPSBwaFFDW25dOwogICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewogICAgICAgICAgaWYgKGhRQy0+cWNFbGVtZW50W2ldKQogICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19RQ2VsZW1lbnQoJmhRQy0+cWNFbGVtZW50W2ldKTsKICAgICAgICB9CgogICAgICAgIEZyZWVSYW1fYWFjRW5jX1FDb3V0KCZwaFFDW25dKTsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKHBoUUNzdGF0ZSE9TlVMTCkgewogICAgaWYgKCpwaFFDc3RhdGUgIT0gTlVMTCkgewogICAgICBRQ19TVEFURSAgKmhRQ3N0YXRlID0gKnBoUUNzdGF0ZTsKCiAgICAgIGlmIChoUUNzdGF0ZS0+aEFkalRociAhPSBOVUxMKQogICAgICAgIEZES2FhY0VuY19BZGpUaHJDbG9zZSgmaFFDc3RhdGUtPmhBZGpUaHIpOwoKICAgICAgaWYgKGhRQ3N0YXRlLT5oQml0Q291bnRlciAhPSBOVUxMKQogICAgICAgIEZES2FhY0VuY19CQ0Nsb3NlKCZoUUNzdGF0ZS0+aEJpdENvdW50ZXIpOwoKICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKICAgICAgICBpZiAoaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldIT1OVUxMKSB7CiAgICAgICAgICBGcmVlUmFtX2FhY0VuY19FbGVtZW50Qml0cygmaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRnJlZVJhbV9hYWNFbmNfUUNzdGF0ZShwaFFDc3RhdGUpOwogICAgfQogIH0KfQoK