Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAicWNfbWFpbi5oIgojaW5jbHVkZSAicXVhbnRpemUuaCIKI2luY2x1ZGUgImludGVyZmFjZS5oIgojaW5jbHVkZSAiYWRqX3Roci5oIgojaW5jbHVkZSAic2ZfZXN0aW0uaCIKI2luY2x1ZGUgImJpdF9jbnQuaCIKI2luY2x1ZGUgImR5bl9iaXRzLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCgoKdHlwZWRlZiBzdHJ1Y3QgewogIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOwogIExPTkcgdmJyUXVhbEZhY3RvcjsKfSBUQUJfVkJSX1FVQUxfRkFDVE9SOwoKc3RhdGljIGNvbnN0IFRBQl9WQlJfUVVBTF9GQUNUT1IgdGFibGVWYnJRdWFsRmFjdG9yW10gPSB7CiAge1FDREFUQV9CUl9NT0RFX0NCUiwgICBGTDJGWENPTlNUX0RCTCgwLjAwZil9LAogIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMSwgRkwyRlhDT05TVF9EQkwoMC4xNjBmKX0sIC8qIDMyIGticHMgbW9ubyAgIEFBQy1MQyArIFNCUiArIFBTICovCiAge1FDREFUQV9CUl9NT0RFX1ZCUl8yLCBGTDJGWENPTlNUX0RCTCgwLjE0OGYpfSwgLyogNjQga2JwcyBzdGVyZW8gQUFDLUxDICsgU0JSICAgICAgKi8KICB7UUNEQVRBX0JSX01PREVfVkJSXzMsIEZMMkZYQ09OU1RfREJMKDAuMTM1Zil9LCAvKiA4MCAtIDk2IGticHMgc3RlcmVvIEFBQy1MQyAgICAgICAqLwogIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNCwgRkwyRlhDT05TVF9EQkwoMC4xMTFmKX0sIC8qIDEyOCBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgICAgICovCiAge1FDREFUQV9CUl9NT0RFX1ZCUl81LCBGTDJGWENPTlNUX0RCTCgwLjA3MGYpfSwgLyogMTkyIGticHMgc3RlcmVvIEFBQy1MQyAgICAgICAgICAgKi8KICB7UUNEQVRBX0JSX01PREVfU0ZSLCAgIEZMMkZYQ09OU1RfREJMKDAuMDBmKX0sCiAge1FDREFUQV9CUl9NT0RFX0ZGLCAgICBGTDJGWENPTlNUX0RCTCgwLjAwZil9Cn07CgpzdGF0aWMgSU5UIGlzQ29uc3RhbnRCaXRyYXRlTW9kZSgKICAgICAgICBjb25zdCBRQ0RBVEFfQlJfTU9ERSBiaXRyYXRlTW9kZQogICAgICAgICkKewogIHJldHVybiAoICgoYml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0NCUikgfHwgKGJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9TRlIpIHx8IChiaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfRkYpKSA/IDEgOiAwICk7Cn0KCgoKdHlwZWRlZiBlbnVtewogICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9ICAxLAogICAgRlJBTUVfTEVOX0JZVEVTX0lOVCAgICA9ICAyCn1GUkFNRV9MRU5fUkVTVUxUX01PREU7CgovKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwoKc3RhdGljIElOVCBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoSU5UICAgc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgKlJFU1RSSUNUIHNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpSRVNUUklDVCBtYXhWYWx1ZSk7CgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShJTlQgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCAgICpxY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWcpOwoKc3RhdGljCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19yZWR1Y2VCaXRDb25zdW1wdGlvbihpbnQqICAgICAgICAgICAgIGl0ZXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgbWF4SXRlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBnYWluQWRqdXN0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjT3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiAgICBlbEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgZXBDb25maWcpOwoKCnZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0ZyYW1lTGVuCiAgICBkZXNjcmlwdGlvbjoKICAgIHJldHVybnM6CiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjRnJhbWVMZW4oSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX1JFU1VMVF9NT0RFIG1vZGUpCnsKCiAgIElOVCByZXN1bHQ7CgogICByZXN1bHQgPSAoKGdyYW51bGVMZW5ndGgpPj4zKSooYml0UmF0ZSk7CgogICBzd2l0Y2gobW9kZSkgewogICAgIGNhc2UgRlJBTUVfTEVOX0JZVEVTX01PRFVMTzoKICAgICAgICAgcmVzdWx0ICU9IHNhbXBsZVJhdGU7CiAgICAgYnJlYWs7CiAgICAgY2FzZSBGUkFNRV9MRU5fQllURVNfSU5UOgogICAgICAgICByZXN1bHQgLz0gc2FtcGxlUmF0ZTsKICAgICBicmVhazsKICAgfQogICByZXR1cm4ocmVzdWx0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19mcmFtZVBhZGRpbmcKICAgIGRlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIGlmIHBhZGRpbmcgaXMgbmVlZGVkIGZvciBhY3R1YWwgZnJhbWUKICAgIHJldHVybnM6CiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIEZES2FhY0VuY19mcmFtZVBhZGRpbmcoSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYWRkaW5nUmVzdCkKewogIElOVCBwYWRkaW5nT247CiAgSU5UIGRpZmZlcmVuY2U7CgogIHBhZGRpbmdPbiA9IDA7CgogIGRpZmZlcmVuY2UgPSBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7CiAgKnBhZGRpbmdSZXN0LT1kaWZmZXJlbmNlOwoKICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7CiAgICBwYWRkaW5nT24gPSAxOwogICAgKnBhZGRpbmdSZXN0ICs9IHNhbXBsZVJhdGU7CiAgfQoKICByZXR1cm4oIHBhZGRpbmdPbiApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNPdXROZXcKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dE5ldyhRQ19PVVQgICAgKipwaFFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAqZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgaW50IG4sIGk7CiAgaW50IGVsSW5jID0gMCwgY2hJbmMgPSAwOwoKICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKICAgIHBoUUNbbl0gPSBHZXRSYW1fYWFjRW5jX1FDb3V0KG4pOwogICAgaWYgKHBoUUNbbl0gPT0gTlVMTCkgewogICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICB9CgogICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgICAgcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbChjaEluYywgZHluYW1pY19SQU0pOwogICAgICBpZiAoIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2ldID09IE5VTEwKICAgICAgICAgKQogICAgICB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgIGdvdG8gUUNPdXROZXdfYmFpbDsKICAgICAgfQogICAgICBjaEluYysrOwogICAgfSAvKiBuQ2hhbm5lbHMgKi8KCiAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewogICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0gICAgICA9IEdldFJhbV9hYWNFbmNfUUNlbGVtZW50KGVsSW5jKTsKICAgICAgaWYgKHBoUUNbbl0tPnFjRWxlbWVudFtpXSA9PSBOVUxMKQogICAgICB7CiAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICAgIH0KICAgICAgZWxJbmMrKzsKICAgIH0gLyogbkVsZW1lbnRzICovCgogIH0gLyogblN1YkZyYW1lcyAqLwoKCiAgcmV0dXJuIEFBQ19FTkNfT0s7CgpRQ091dE5ld19iYWlsOgogIHJldHVybiBFcnJvclN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNPdXRJbml0CiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXRJbml0KFFDX09VVCAgICAgICAgICAqcGhRQ1soMSldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNtKQp7CiAgSU5UIG4saSxjaDsKCiAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CiAgICBJTlQgY2hJbmMgPSAwOwogICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CiAgICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdID0gcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbY2hJbmNdOwogICAgICAgIGNoSW5jKys7CiAgICAgIH0gLyogY2hJbkVsICovCiAgICB9IC8qIG5FbGVtZW50cyAqLwogIH0gLyogblN1YkZyYW1lcyAqLwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNOZXcKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ05ldyhRQ19TVEFURSAgKipwaFFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbkVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogICAgICBkeW5hbWljX1JBTQogICAgICAgICAgICkKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogIGludCBpOwoKICBRQ19TVEFURSogaFFDID0gR2V0UmFtX2FhY0VuY19RQ3N0YXRlKCk7CiAgKnBoUUMgPSBoUUM7CiAgaWYgKGhRQyA9PSBOVUxMKSB7CiAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgZ290byBRQ05ld19iYWlsOwogIH0KCiAgaWYgKEZES2FhY0VuY19BZGpUaHJOZXcoJmhRQy0+aEFkalRociwgbkVsZW1lbnRzKSkgewogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgIGdvdG8gUUNOZXdfYmFpbDsKICB9CgogIGlmIChGREthYWNFbmNfQkNOZXcoJihoUUMtPmhCaXRDb3VudGVyKSwgZHluYW1pY19SQU0pKSB7CiAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgZ290byBRQ05ld19iYWlsOwogIH0KCiAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0gPSBHZXRSYW1fYWFjRW5jX0VsZW1lbnRCaXRzKGkpOwogICAgaWYgKGhRQy0+ZWxlbWVudEJpdHNbaV0gPT0gTlVMTCkgewogICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICBnb3RvIFFDTmV3X2JhaWw7CiAgICB9CiAgfQoKICByZXR1cm4gQUFDX0VOQ19PSzsKClFDTmV3X2JhaWw6CiAgRkRLYWFjRW5jX1FDQ2xvc2UocGhRQywgTlVMTCk7CiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RQ0luaXQKICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ0luaXQoUUNfU1RBVEUgKmhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCkKewogIGhRQy0+bWF4Qml0c1BlckZyYW1lID0gaW5pdC0+bWF4Qml0czsKICBoUUMtPm1pbkJpdHNQZXJGcmFtZSA9IGluaXQtPm1pbkJpdHM7CiAgaFFDLT5uRWxlbWVudHMgICAgICAgPSBpbml0LT5jaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOwogIGhRQy0+Yml0UmVzVG90TWF4ICAgID0gaW5pdC0+Yml0UmVzOwogIGhRQy0+Yml0UmVzVG90ICAgICAgID0gaW5pdC0+Yml0UmVzOwogIGhRQy0+bWF4Qml0RmFjICAgICAgID0gaW5pdC0+bWF4Qml0RmFjOwogIGhRQy0+Yml0cmF0ZU1vZGUgICAgID0gaW5pdC0+Yml0cmF0ZU1vZGU7CiAgaFFDLT5pbnZRdWFudCAgICAgICAgPSBpbml0LT5pbnZRdWFudDsKICBoUUMtPm1heEl0ZXJhdGlvbnMgICA9IGluaXQtPm1heEl0ZXJhdGlvbnM7CgogIGlmICggaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpICkgewogICAgSU5UIGJpdHJlc1BlckNoYW5uZWwgPSAoaFFDLT5iaXRSZXNUb3RNYXggLyBpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKTsKICAgIC8qIDA6IGZ1bGwgYml0cmVzZXJ2b2lyLCAxOiByZWR1Y2VkIGJpdHJlc2Vydm9pciwgMjogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCiAgICBoUUMtPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSAoYml0cmVzUGVyQ2hhbm5lbD4xMDApID8gMCA6IChiaXRyZXNQZXJDaGFubmVsPjApID8gMSA6IDI7CiAgfQogIGVsc2UgewogICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gMDsgLyogZnVsbCBiaXRyZXNlcnZvaXIgKi8KICB9CgoKICBoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBpbml0LT5wYWRkaW5nLnBhZGRpbmdSZXN0OwoKICBoUUMtPmdsb2JIZHJCaXRzID0gaW5pdC0+c3RhdGljQml0czsgLyogQml0IG92ZXJoZWFkIGR1ZSB0byB0cmFuc3BvcnQgKi8KCiAgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LT5jaGFubmVsTWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPmJpdHJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdC0+YXZlcmFnZUJpdHMvaW5pdC0+blN1YkZyYW1lcykgLSBoUUMtPmdsb2JIZHJCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5tYXhCaXRzUGVyRnJhbWUvaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZik7CgogIHN3aXRjaChoUUMtPmJpdHJhdGVNb2RlKXsKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfQ0JSOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMToKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzI6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8zOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzU6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1NGUjoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6CiAgICAgIGlmKChpbnQpaFFDLT5iaXRyYXRlTW9kZSA8IChpbnQpKHNpemVvZih0YWJsZVZiclF1YWxGYWN0b3IpL3NpemVvZihUQUJfVkJSX1FVQUxfRkFDVE9SKSkpewogICAgICAgIGhRQy0+dmJyUXVhbEZhY3RvciA9IChGSVhQX0RCTCl0YWJsZVZiclF1YWxGYWN0b3JbaFFDLT5iaXRyYXRlTW9kZV0udmJyUXVhbEZhY3RvcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOyAvKiBkZWZhdWx0IHNldHRpbmcgKi8KICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfSU5WQUxJRDoKICAgIGRlZmF1bHQ6CiAgICAgIGhRQy0+dmJyUXVhbEZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgIGJyZWFrOwogIH0KCiAgRkRLYWFjRW5jX0FkalRockluaXQoCiAgICAgICAgaFFDLT5oQWRqVGhyLAogICAgICAgIGluaXQtPm1lYW5QZSwKICAgICAgICBoUUMtPmVsZW1lbnRCaXRzLCAgICAgICAgICAgICAgICAgLyogb3IgY2hhbm5lbEJpdHJhdGVzLCB3YXM6IGNoYW5uZWxCaXRyYXRlICovCiAgICAgICAgaFFDLT5pbnZRdWFudCwKICAgICAgICBpbml0LT5jaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzLAogICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYsCiAgICAgICAgaW5pdC0+c2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAqLwogICAgICAgIGluaXQtPmFkdmFuY2VkQml0c1RvUGUsICAgICAgICAgICAvKiBpZiBzZXQsIGNhbGMgYml0czJQRSBmYWN0b3IgZGVwZW5kaW5nIG9uIHNhbXBsZXJhdGUgKi8KICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IKICAgICAgICApOwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RQ01haW5QcmVwYXJlCiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluUHJlcGFyZShFTEVNRU5UX0lORk8gICAgICAgICAgICAgICplbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBSRVNUUklDVCAgICAgIGFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBSRVNUUklDVCAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICAgcWNPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKICBJTlQgIG5DaGFubmVscyA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsKCiAgUFNZX09VVF9DSEFOTkVMKiogUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7ICAgIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLwoKICBGREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3IocWNPdXRFbGVtZW50LT5xY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CgogIC8qIHByZXBhcmUgYW5kIGNhbGN1bGF0ZSBQRSB3aXRob3V0IHJlZHVjdGlvbiAqLwogIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKCZxY091dEVsZW1lbnQtPnBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWwsICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8sIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzKTsKCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggTlVMTCwgZWxJbmZvLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CgogIHJldHVybiBFcnJvclN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZQogICAgICAgICBkZXNjcmlwdGlvbjogIGFkanVzdHMgZnJhbWVsZW5ndGggdmlhIHBhZGRpbmcgb24gYSBmcmFtZSB0byBmcmFtZSBiYXNpcywKICAgICAgICAgICAgICAgICAgICAgICB0byBhY2hpZXZlIGEgYml0cmF0ZSB0aGF0IGRlbWFuZHMgYSBub24gYnl0ZSBhbGlnbmVkCiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVsZW5ndGgKICAgICAgICAgcmV0dXJuOiAgICAgICBlcnJvcmNvZGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19BZGp1c3RCaXRyYXRlKFFDX1NUQVRFICAgICAgICAqUkVTVFJJQ1QgaFFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKlJFU1RSSUNUIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgKmF2Z1RvdGFsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBiaXRSYXRlLCAgICAgICAvKiB0b3RhbCBiaXRyYXRlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgICAgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoKSAvKiBmcmFtZSBsZW5ndGggKi8KewogIElOVCBwYWRkaW5nT247CiAgSU5UIGZyYW1lTGVuOwoKICAvKiBEbyB3ZSBuZWVkIGFuIGV4dHJhIHBhZGRpbmcgYnl0ZT8gKi8KICBwYWRkaW5nT24gPSBGREthYWNFbmNfZnJhbWVQYWRkaW5nKGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7CgogIGZyYW1lTGVuID0gcGFkZGluZ09uICsgRkRLYWFjRW5jX2NhbGNGcmFtZUxlbihiaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfSU5UKTsKCiAgKmF2Z1RvdGFsQml0cyA9IGZyYW1lTGVuPDwzOwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoUUNfU1RBVEUqICAgICAgICAgaFFDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGNvZGVCaXRzKQp7CgogIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOwogIElOVCB0b3RhbEJpdHMgPSAwOwoKICBmb3IgKGk9KGNtLT5uRWxlbWVudHMtMSk7IGk+PTA7IGktLSkgewogICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCiAgICB7CiAgICAgIHFjRWxlbWVudFtpXS0+Z3JhbnRlZER5bkJpdHMgPSAgKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKWNvZGVCaXRzKTsKICAgICAgdG90YWxCaXRzICs9IHFjRWxlbWVudFtpXS0+Z3JhbnRlZER5bkJpdHM7CiAgICAgIGZpcnN0RWwgPSBpOwogICAgfQogIH0KICBxY0VsZW1lbnRbZmlyc3RFbF0tPmdyYW50ZWREeW5CaXRzICs9IGNvZGVCaXRzIC0gdG90YWxCaXRzOwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKLyoqCiAqIFxicmllZiAgVmVyaWZ5IHdoZXRoZXIgbWluQml0c1BlckZyYW1lIGNyaXRlcmlvbiBjYW4gYmUgc2F0aXNmaWVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGUgYml0IGNvbnN1bXB0aW9uIG9ubHkgaWYgbWluQml0c1BlckZyYW1lIHBhcmFtZXRlciBpcyBub3QgMC4KICogSW4gaHlwZXJmcmFtaW5nIG1vZGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBncmFudGVkRHluQml0cyBhbmQgdXNlZER5bkJpdHMgb2YgYWxsIHN1YiBmcmFtZXMKICogcmVzdWx0cyB0aGUgbnVtYmVyIG9mIGZpbGxiaXRzIHRvIGJlIHdyaXR0ZW4uCiAqIFRoaXMgYml0cyBjYW4gYmUgZGlzdHJ1Yml0dWVkIGluIHN1cGVyZnJhbWUgdG8gcmVhY2ggbWluQml0c1BlckZyYW1lIGJpdCBjb25zdW1wdGlvbiBpbiBzaW5nbGUgQVUncy4KICogVGhlIHJldHVybiB2YWx1ZSBkZW5vdGVzIGlmIGVub3VnaCBkZXNpcmVkIGZpbGwgYml0cyBhcmUgYXZhaWxhYmxlIHRvIGFjaGlldmUgbWluQml0c1BlckZyYW1lIGluIGFsbCBmcmFtZXMuCiAqIFRoaXMgY2hlY2sgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4gc3VwZXJmcmFtZXMuCiAqCiAqIFxwYXJhbSBxY091dCAgICAgICAgICAgIFBvaW50ZXIgdG8gY29kaW5nIGRhdGEgc3RydWN0LgogKiBccGFyYW0gbWluQml0c1BlckZyYW1lICBNaW5pbWFsIG51bWJlciBvZiBiaXRzIHRvIGJlIGNvbnN1bWVkIGluIGVhY2ggZnJhbWUuCiAqIFxwYXJhbSBuU3ViRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMgaW4gc3VwZXJmcmFtZQogKgogKiBccmV0dXJuCiAqICAgICAgICAgIC0gMTogYWxsIGZpbmUKICogICAgICAgICAgLSAwOiBjcml0ZXJpb24gbm90IGZ1bGZpbGxlZAogKi8Kc3RhdGljIGludCBjaGVja01pbkZyYW1lQml0c0RlbWFuZCgKICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbWluQml0c1BlckZyYW1lLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwogICAgICAgICkKewogIGludCByZXN1bHQgPSAxOyAvKiBhbGwgZmluZSovCiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2dldE1pbmltYWxTdGF0aWNCaXRkZW1hbmQKICAgICAgICAgZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgbWlubWFsIHNpemUgb2Ygc3RhdGljIGJpdHMgYnkgcmVkdWN0aW9uICwKICAgICAgICAgICAgICAgICAgICAgICB0byB6ZXJvIHNwZWN0cnVtIGFuZCBkZWFjdGl2YXRpbmcgdG5zIGFuZCBNUwogICAgICAgICByZXR1cm46ICAgICAgIG51bWJlciBvZiBzdGF0aWMgYml0cwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludCBGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZChDSEFOTkVMX01BUFBJTkcqICAgICBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogICAgICAgICAgICBwc3lPdXQpCnsKICBBVURJT19PQkpFQ1RfVFlQRSBhb3QgPSBBT1RfQUFDX0xDOwogIFVJTlQgIHN5bnRheEZsYWdzID0gMDsKICBTQ0hBUiBlcENvbmZpZyA9IC0xOwogIGludCBpLCBiaXRjb3VudCA9IDA7CgogIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewogICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKCiAgICAgIGlmICggKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKQogICAgICAgIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkKICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpICkKICAgICAgewogICAgICAgIElOVCBtaW5FbEJpdHMgPSAwOwoKICAgICAgICBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggTlVMTCwgJmVsSW5mbywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5FbEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKICAgICAgICBiaXRjb3VudCArPSBtaW5FbEJpdHM7CiAgICAgIH0KICB9CgogIHJldHVybiBiaXRjb3VudDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHJlcGFyZUJpdERpc3RyaWJ1dGlvbihRQ19TVEFURSogICAgICAgICAgICBoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgIHBzeU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgICBxY0VsZW1lbnRbKDEpXVsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnRvdGFsQXZhaWxhYmxlQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqYXZnVG90YWxEeW5CaXRzKQp7CiAgICBpbnQgaTsKICAgICAgLyogZ2V0IG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgKi8KICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzID0gIChmaXhNaW4oaFFDLT5tYXhCaXRzUGVyRnJhbWUsIGF2Z1RvdGFsQml0cykgLSBoUUMtPmdsb2JIZHJCaXRzKSZ+NzsKICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC09IChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKICAgICAgcWNPdXRbMF0tPm1heER5bkJpdHMgPSAoKGhRQy0+bWF4Qml0c1BlckZyYW1lKSZ+NykgLSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7CiAgICAgIC8qIGFzc3VyZSB0aGF0IGVub3VnaCBiaXRzIGFyZSBhdmFpbGFibGUgKi8KICAgICAgaWYgKChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMraFFDLT5iaXRSZXNUb3QpIDwgMCkgewogICAgICAgIC8qIGNyYXNoIHJlY292ZXJ5IGFsbG93cyB0byByZWR1Y2Ugc3RhdGljIGJpdHMgdG8gYSBtaW5pbXVtICovCiAgICAgICAgaWYgKCAocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzK2hRQy0+Yml0UmVzVG90KSA8IChGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZChjbSwgcHN5T3V0KS1xY091dFswXS0+c3RhdGljQml0cykgKQogICAgICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7CiAgICAgIH0KCiAgICAgIC8qIGRpc3RyaWJ1dGUgZHluYW1pYyBiaXRzIHRvIGVhY2ggZWxlbWVudCAqLwogICAgICBGREthYWNFbmNfZGlzdHJpYnV0ZUVsZW1lbnREeW5CaXRzKGhRQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzKTsKCiAgICAgICphdmdUb3RhbER5bkJpdHMgPSAwOyAvKmZyYW1lRHluQml0czsqLwoKICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgPSBhdmdUb3RhbEJpdHM7CgogICAgLyogc3VtIHVwIGNvcnJlY3RlZCBncmFudGVkIFBFICovCiAgICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyID0gMDsKCiAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICB7CiAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CiAgICAgICAgaW50IG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOwoKICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CiAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgewogICAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KICAgICAgICAgICAgICAgIEZES2FhY0VuY19EaXN0cmlidXRlQml0cyhoUUMtPmhBZGpUaHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+cGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5jb21tb25XaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkRHluQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEJpdEZhYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmJpdERpc3RyaWJ1dGlvbk1vZGUpOwoKICAgICAgICAgICAgICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKICAgICAgICAvKiBnZXQgdG90YWwgY29ycmVjdGVkIGdyYW50ZWQgUEUgKi8KICAgICAgICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyICs9IHFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29ycjsKICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCgogICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCgogICAgKnRvdGFsQXZhaWxhYmxlQml0cyA9IEZES21pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgKCp0b3RhbEF2YWlsYWJsZUJpdHMpKTsKCiAgICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8Kc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cyhJTlQqICAgICAgICAgICAgICAgc3VtRHluQml0c0NvbnN1bWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgY20pCnsKICBJTlQgaTsKCiAgKnN1bUR5bkJpdHNDb25zdW1lZCA9IDA7CgogIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICB7CiAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwoKICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgewogICAgICAgICAgLyogc3VtIHVwIGJpdHMgY29uc3VtZWQgKi8KICAgICAgICAgICpzdW1EeW5CaXRzQ29uc3VtZWQgICs9IHFjRWxlbWVudFtpXS0+ZHluQml0c1VzZWQ7CiAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCgogIHJldHVybiBBQUNfRU5DX09LOwp9CgoKc3RhdGljIElOVCBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMoUUNfT1VUKiogcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TdWJGcmFtZXMpCnsKICAgIElOVCBjLCB0b3RhbEJpdHM9MDsKCiAgICAvKiBzdW0gdXAgYml0IGNvbnN1bXB0aW9uIGZvciBhbGwgc3ViIGZyYW1lcyAqLwogICAgZm9yIChjPTA7IGM8blN1YkZyYW1lczsgYysrKQogICAgewogICAgICAgIC8qIGJpdCBjb25zdW1wdGlvbiBub3QgdmFsaWQgaWYgZHluYW1pYyBiaXRzCiAgICAgICAgICAgbm90IGF2YWlsYWJsZSBpbiBvbmUgc3ViIGZyYW1lICovCiAgICAgICAgaWYgKHFjT3V0W2NdLT51c2VkRHluQml0cz09LTEpIHJldHVybiAtMTsKICAgICAgICB0b3RhbEJpdHMgKz0gcWNPdXRbY10tPnVzZWREeW5CaXRzOwogICAgfQoKICAgIHJldHVybiB0b3RhbEJpdHM7Cgp9CgpzdGF0aWMgSU5UIEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhRQ19PVVQqKiAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDEpXVsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGdsb2JIZHJCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG5TdWJGcmFtZXMpCnsKICAgIGludCBjLCBpOwogICAgaW50IHRvdGFsVXNlZEJpdHMgPSAwOwoKICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCiAgICB7CiAgICAgICAgaW50IGRhdGFCaXRzID0gMDsKICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBkYXRhQml0cyArPSBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkICsgcWNFbGVtZW50W2NdW2ldLT5zdGF0aWNCaXRzVXNlZCArIHFjRWxlbWVudFtjXVtpXS0+ZXh0Qml0c1VzZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGF0YUJpdHMgKz0gcWNPdXRbY10tPmdsb2JhbEV4dEJpdHM7CgogICAgICAgIHRvdGFsVXNlZEJpdHMgKz0gKDggLSAoZGF0YUJpdHMpICUgOCkgJSA4OwogICAgICAgIHRvdGFsVXNlZEJpdHMgKz0gZGF0YUJpdHMgKyBnbG9iSGRyQml0czsgIC8qIGhlYWRlciBiaXRzIGZvciBldmVyeSBmcmFtZSAqLwogICAgfQogICAgcmV0dXJuIHRvdGFsVXNlZEJpdHM7Cn0KCnN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQml0UmVzUmVkaXN0cmlidXRpb24oCiAgICAgICAgUUNfU1RBVEUgKmNvbnN0ICAgICAgICAgICAgICBoUUMsCiAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cwogICAgICAgICkKewogICAgLyogY2hlY2sgYml0cmVzZXJ2b2lyIGZpbGwgbGV2ZWwgKi8KICAgIGlmIChoUUMtPmJpdFJlc1RvdCA8IDApIHsKICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7CiAgICB9CiAgICBlbHNlIGlmIChoUUMtPmJpdFJlc1RvdCA+IGhRQy0+Yml0UmVzVG90TWF4KSB7CiAgICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fSElHSDsKICAgIH0KICAgIGVsc2UgewogICAgICBJTlQgaSwgZmlyc3RFbCA9IGNtLT5uRWxlbWVudHMtMTsKICAgICAgSU5UIHRvdGFsQml0cyA9IDAsIHRvdGFsQml0c19tYXggPSAwOwoKICAgICAgaW50IHRvdGFsQml0cmVzZXJ2b2lyICAgID0gRkRLbWluKGhRQy0+Yml0UmVzVG90LCAoaFFDLT5tYXhCaXRzUGVyRnJhbWUtYXZnVG90YWxCaXRzKSk7CiAgICAgIGludCB0b3RhbEJpdHJlc2Vydm9pck1heCA9IEZES21pbihoUUMtPmJpdFJlc1RvdE1heCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lLWF2Z1RvdGFsQml0cykpOwoKICAgICAgaW50IHNjX2JpdFJlc1RvdCA9IENvdW50TGVhZGluZ0JpdHModG90YWxCaXRyZXNlcnZvaXIpOwogICAgICBpbnQgc2NfYml0UmVzVG90TWF4ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pck1heCk7CgogICAgICBmb3IgKGk9KGNtLT5uRWxlbWVudHMtMSk7IGk+PTA7IGktLSkgewogICAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgICB7CiAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsID0gKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKSh0b3RhbEJpdHJlc2Vydm9pcjw8c2NfYml0UmVzVG90KSk+PnNjX2JpdFJlc1RvdDsKICAgICAgICAgIHRvdGFsQml0cyArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsOwoKICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCA9IChJTlQpZk11bHQoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIChGSVhQX0RCTCkodG90YWxCaXRyZXNlcnZvaXJNYXg8PHNjX2JpdFJlc1RvdE1heCkpPj5zY19iaXRSZXNUb3RNYXg7CiAgICAgICAgICB0b3RhbEJpdHNfbWF4ICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbDsKCiAgICAgICAgICBmaXJzdEVsID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaFFDLT5lbGVtZW50Qml0c1tmaXJzdEVsXS0+Yml0UmVzTGV2ZWxFbCAgICs9IHRvdGFsQml0cmVzZXJ2b2lyIC0gdG90YWxCaXRzOwogICAgICBoUUMtPmVsZW1lbnRCaXRzW2ZpcnN0RWxdLT5tYXhCaXRSZXNCaXRzRWwgKz0gdG90YWxCaXRyZXNlcnZvaXJNYXggLSB0b3RhbEJpdHNfbWF4OwogICAgfQoKICAgIHJldHVybiBBQUNfRU5DX09LOwp9CgoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDTWFpbihRQ19TVEFURSogUkVTVFJJQ1QgICAgICAgICBoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgICAgICAgcHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgICAgICAgICBjbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEFVRElPX09CSkVDVF9UWVBFICAgICAgICAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgaW50IGksIGM7CiAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX09LOwogIElOVCBhdmdUb3RhbER5bkJpdHMgPSAwOyAvKiBtYXhpbWFsIGFsbG93ZWQgZHluYW1pYyBiaXRzIGZvciBhbGwgZnJhbWVzICovCiAgSU5UIHRvdGFsQXZhaWxhYmxlQml0cyA9IDA7CiAgSU5UIG5TdWJGcmFtZXMgPSAxOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgLyogcmVkaXN0cmlidXRlIHRvdGFsIGJpdHJlc2Vydm9pciB0byBlbGVtZW50cyAqLwogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0JpdFJlc1JlZGlzdHJpYnV0aW9uKGhRQywgY20sIGF2Z1RvdGFsQml0cyk7CiAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHsKICAgIHJldHVybiBFcnJvclN0YXR1czsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAvKiBmYXN0ZW5jIG5lZWRzIG9uZSB0aW1lIHRocmVzaG9sZCBzaW11bGF0aW9uLAogICAgIGluIGNhc2Ugb2YgbXVsdGlwbGUgZnJhbWVzLCBvbmUgbW9yZSBndWVzcyBoYXMgdG8gYmUgY2FsY3VsYXRlZCAqLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAvKiBoZWxwZXIgcG9pbnRlciAqLwogICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoMSldWyg4KV07CgogICAgICAvKiB3b3JrIG9uIGEgY29weSBvZiBxY0NoYW5uZWwgYW5kIHFjRWxlbWVudCAqLwogICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgIHsKICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwoKICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgewogICAgICAgICAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCiAgICAgICAgICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSA9IHFjT3V0W2NdLT5xY0VsZW1lbnRbaV07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICBpZiAoIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSApCiAgICAgIHsKICAgICAgICAgIC8qIGNhbGMgZ3JhbnRlZCBkeW5hbWljIGJpdHMgZm9yIHN1YiBmcmFtZSBhbmQKICAgICAgICAgICAgIGRpc3RyaWJ1dGUgaXQgdG8gZWFjaCBlbGVtZW50ICovCiAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxBdmFpbGFibGVCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmdUb3RhbER5bkJpdHMpOwoKICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSB7CiAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKICAgICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyA9ICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUgLSAoaFFDLT5nbG9iSGRyQml0cykpJn43KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOwogICAgICAgICAgcWNPdXRbMF0tPm1heER5bkJpdHMgICAgID0gcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzOwoKICAgICAgICAgIHRvdGFsQXZhaWxhYmxlQml0cyA9IGhRQy0+bWF4Qml0c1BlckZyYW1lOwogICAgICAgICAgYXZnVG90YWxEeW5CaXRzID0gMDsKICAgICAgfQoKI2lmZGVmIFBOU19QUkVDT1VOVF9FTkFCTEUKICAgICAgLyogQ2FsY3VsYXRlIGVzdGltYXRlZCBwbnMgYml0cyBhbmQgc3Vic3RyYWN0IHRoZW0gZnJvbSBncmFudGVkRHluQml0cyB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cy4gKi8KICAgICAgaWYgKHN5bnRheEZsYWdzICYgKEFDX0xEfEFDX0VMRCkpCiAgICAgIHsKICAgICAgICBpbnQgZXN0aW1hdGVkUG5zQml0cyA9IDAsIGNoOwoKICAgICAgICBmb3IgKGNoPTA7IGNoPGNtLT5uQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgIHFjT3V0WzBdLT5wUWNPdXRDaGFubmVsc1tjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cyA9IG5vaXNlUHJlQ291bnQocHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5ub2lzZU5yZywgcHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5tYXhTZmJQZXJHcm91cCk7CiAgICAgICAgICBlc3RpbWF0ZWRQbnNCaXRzICs9IHFjT3V0WzBdLT5wUWNPdXRDaGFubmVsc1tjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0czsKICAgICAgICB9CiAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC09IGVzdGltYXRlZFBuc0JpdHM7CiAgICAgIH0KI2VuZGlmCgogICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLwogICAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQogICAgICB7CiAgICAgICAgICAvKiBmb3IgQ0JSIGFuZCBWQlIgbW9kZSAqLwogICAgICAgICAgRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMoaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFtjXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtKTsKCiAgICAgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgSU5UIGl0ZXJhdGlvbnNbKDEpXVsoOCldOwogICAgICBJTlQgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFsoMSldWyg4KV1bKDIpXTsKICAgICAgSU5UIGNhbGN1bGF0ZVF1YW50WygxKV1bKDgpXVsoMildOwogICAgICBJTlQgY29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldOwogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKICAgICAgewogICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQogICAgICAgICAgewogICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogICAgICAgICAgICAgIElOVCBjaCwgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7CgogICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIHRocmVzaG9sZHMgaW50byBzY2FsZWZhY3RvcnMsIG9wdGltaXplIGJpdCBjb25zdW1wdGlvbiBhbmQgdmVyaWZ5IGNvbmZvcm1hbmNlICovCiAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnMocHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aW52UXVhbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKCgogICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uc1tjXVtpXSA9IDAgOwoKICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdID0gMTsKICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KCiAgICAgICAgICBxY091dFtjXS0+dXNlZER5bkJpdHMgPSAtMTsKCiAgICAgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KCgoKICAgICAgSU5UIHF1YW50aXphdGlvbkRvbmUgPSAwOwogICAgICBJTlQgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgID0gMDsKICAgICAgSU5UIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAtMTsgLyogbm8gZGlyZWN0aW9uIHlldCEgKi8KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgLyogLXN0YXJ0LSBRdWFudGl6YXRpb24gbG9vcCAuLi4gICAgICAgICAgICAgICAqLwogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgIGRvIC8qIHVudGlsIG1heCBhbGxvd2VkIGJpdHMgcGVyIGZyYW1lIGFuZCBtYXhEeW5CaXRzIT0tMSovCiAgICAgIHsKICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOwoKICAgICAgICAgICAgICBjID0gMDsgICAgICAgICAgICAgIC8qIGdldCBmcmFtZSB0byBwcm9jZXNzICovCgogICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogICAgICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOwoKICAgICAgICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgZG8gLyogdW50aWwgc3BlY3RyYWwgdmFsdWVzIDwgTUFYX1FVQU5UICovCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oJml0ZXJhdGlvbnNbY11baV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEl0ZXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbikgPyAxIDogLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFtjXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2ggPSBxY0VsZW1lbnRbY11baV0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoID0gcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gPSAwOyAvKiBjYWxjdWxhdGUgcXVhbnRpemF0aW9uIG9ubHkgaWYgbmVjZXNzYXJ5ICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX1F1YW50aXplU3BlY3RydW0ocHN5T3V0Q2gtPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJPZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+Z2xvYmFsR2FpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYykgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIocHN5T3V0Q2gtPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJPZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBxdWFuaXp0ZWQgdmFsdWUgb3V0IG9mIHJhbmdlOyBpbmNyZWFzZSBnbG9iYWwgZ2FpbiEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBpZiBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBjaGFubmVsIGxvb3AgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldKSA7IC8qIGRvZXMgbm90IHJlZ2FyZCBiaXQgY29uc3VtcHRpb24gKi8KCgogICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCA9IDAgOyAvKiByZXNldCBkeW5hbWljIGJpdHMgKi8KCiAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gdmFsaWQgaW4gY3VycmVudCBjaGFubmVsISAqLwogICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2ggPSBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCBkeW5hbWljIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hEeW5CaXRzID0gRkRLYWFjRW5jX2R5bkJpdENvdW50KGhRQy0+aEJpdENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+c2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoLT5zZWN0aW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5ub2lzZU5yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+aXNTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzKSA7CgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBkeW5hbWljIGNoYW5uZWwgYml0cyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgKz0gY2hEeW5CaXRzOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgZHluQml0c1VzZWQgZm9yIGNvcnJlY3Rpb24gb2YgYml0czJwZSByZWxhdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgaWYoaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmR5bkJpdHNMYXN0PT0tMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5keW5CaXRzTGFzdCA9IHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQ7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KCiAgICAgICAgICAgICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCgogICAgICAgICAgICAgIC8qIHVwZGF0ZSBkeW5CaXRzIG9mIGN1cnJlbnQgc3ViRnJhbWUgKi8KICAgICAgICAgICAgICBGREthYWNFbmNfdXBkYXRlVXNlZER5bkJpdHMoJnFjT3V0W2NdLT51c2VkRHluQml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7CgogICAgICAgICAgICAgIC8qIGdldCB0b3RhbCBjb25zdW1lZCBiaXRzLCBkeW4gYml0cyBpbiBhbGwgc3ViIGZyYW1lcyBoYXZlIHRvIGJlIHZhbGlkICovCiAgICAgICAgICAgICAgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMocWNPdXQsIG5TdWJGcmFtZXMpOwoKICAgICAgICAgICAgICBpZiAoc3VtRHluQml0c0NvbnN1bWVkVG90YWw9PS0xKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7IC8qIGJpdCBjb25zdW1wdGlvbiBub3QgdmFsaWQgaW4gYWxsIHN1YiBmcmFtZXMgKi8KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CgogICAgICAgICAgICAgICAgLyogaW4gYWxsIGZyYW1lcyBhcmUgdmFsaWQgZHluYW1pYyBiaXRzICovCiAgICAgICAgICAgICAgICBpZiAoICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpIHx8IHFjT3V0W2NdLT51c2VkRHluQml0cz09MCkgJiYgKGRlY3JlYXNlQml0Q29uc3VtcHRpb249PTEpICYmIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAvKigpKi8gICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsgLyogZXhpdCBiaXQgYWRqdXN0bWVudCAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN1bUJpdHNDb25zdW1lZFRvdGFsID4gdG90YWxBdmFpbGFibGVCaXRzICYmIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uPT0wKSApCi8vICAgICAgICAgICAgICAgICAgICAgIC8qKCkqLyAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOyAvKiByZXNldCEgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgICAgICAgaW50IGVtZXJnZW5jeUl0ZXJhdGlvbnMgPSAxOwogICAgICAgICAgICAgIGludCBkeW5CaXRzT3ZlcnNob290ICAgID0gMDsKCiAgICAgICAgICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CgogICAgICAgICAgICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGlvbiBsaW1pdGF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIGVtZXJnZW5jeUl0ZXJhdGlvbnMgJj0gKChpdGVyYXRpb25zW2NdW2ldIDwgaFFDLT5tYXhJdGVyYXRpb25zKSA/IDAgOiAxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvKiBkZXRlY3Rpb24gaWYgdXNlZCBkeW4gYml0cyBleGNlZWRzIHRoZSBtYXhpbWFsIGFsbG93ZWQgY3JpdGVyaW9uICovCiAgICAgICAgICAgICAgICAgIGR5bkJpdHNPdmVyc2hvb3QgfD0gKChxY091dFtjXS0+dXNlZER5bkJpdHMgPiBxY091dFtjXS0+bWF4RHluQml0cykgPyAxIDogMCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uRG9uZT09MCB8fCBkeW5CaXRzT3ZlcnNob290KQogICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CgogICAgICAgICAgICAgICAgICBpZiAoIChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCA+PSBhdmdUb3RhbER5bkJpdHMpIHx8IChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbD09MCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZW1lcmdlbmN5SXRlcmF0aW9ucyAmJiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoKHN1bUJpdHNDb25zdW1lZFRvdGFsID4gdG90YWxBdmFpbGFibGVCaXRzKSB8fCAhY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsaFFDLT5taW5CaXRzUGVyRnJhbWUsblN1YkZyYW1lcykpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpICYmIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBpZiAoZHluQml0c092ZXJzaG9vdCkgewogICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGNvbnN0cmFpbnRzIGZ1bGxmaWxsZWQgZmxhZ3MgKi8KICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjb25zdHJhaW50c0Z1bGZpbGxlZCkpOwogICAgICAgICAgICAgICAgICBGREttZW1jbGVhcihjaENvbnN0cmFpbnRzRnVsZmlsbGVkLCBzaXplb2YoY2hDb25zdHJhaW50c0Z1bGZpbGxlZCkpOwoKCiAgICAgICAgICAgICAgfS8qIHF1YW50aXphdGlvbkRvbmUgKi8KCiAgICAgIH0gd2hpbGUgKCFxdWFudGl6YXRpb25Eb25lKSA7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgIC8qIC4uLiAtZW5kLSBRdWFudGl6YXRpb24gbG9vcCAgICAgICAgICAgICAgICAgKi8KICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKCnN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oaW50KiAgICAgICAgICAgICBpdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBtYXhJdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBnYWluQWRqdXN0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjT3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogICAgZWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgZXBDb25maWcpCnsKICBpbnQgY2g7CgogIC8qKiBTT0xWSU5HIFBST0JMRU0gKiovCiAgaWYgKCgqaXRlcmF0aW9ucykrKyA+PSBtYXhJdGVyYXRpb25zKQogIHsKICAgIGlmIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkPT0wKSB7CiAgICB9CiAgICAvKiBjcmFzaCByZWNvdmVyeSAqLwogICAgZWxzZSB7CiAgICAgIElOVCBiaXRzVG9TYXZlID0gMDsKICAgICAgaWYgKCAoYml0c1RvU2F2ZSA9IGZpeE1heCgocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIDgpIC0gKGVsQml0cy0+Yml0UmVzTGV2ZWxFbCArIHFjT3V0RWxlbWVudC0+Z3JhbnRlZER5bkJpdHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIDgpIC0gKGVsQml0cy0+bWF4Qml0c0VsKSkpID4gMCApCiAgICAgIHsKICAgICAgICBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCiAgICAgICAgICAgICAgICAgICAgICBxY091dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICBiaXRzVG9TYXZlLAogICAgICAgICAgICAgICAgICAgICAgYW90LAogICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZykgOwogICAgfQogICAgZWxzZQogICAgewogICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgICAgIHsKICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSAxOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIGNhbGN1bGF0ZVF1YW50W2NoXSA9IDE7CiAgICB9CiAgfQogIH0KICBlbHNlIC8qIGl0ZXJhdGlvbnMgPj0gbWF4SXRlcmF0aW9ucyAqLwogIHsKICAgIC8qIGluY3JlYXNlIGdhaW4gKCsgbmV4dCBpdGVyYXRpb24pICovCiAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIGlmKCFjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NoXSkKICAgICAgewogICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IGdhaW5BZGp1c3RtZW50IDsKICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NoXSA9IDE7IC8qIGdsb2JhbCBnYWluIGhhcyBjaGFuZ2VkLCByZWNhbGN1bGF0ZSBxdWFudGl6YXRpb24gaW4gbmV4dCBpdGVyYXRpb24hICovCiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBBQUNfRU5DX09LOwp9CgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoQ0hBTk5FTF9NQVBQSU5HKiAgICAgICAgICBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFKiAgICAgICAgICAgICAgICAgcWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIFJFU1RSSUNUICAgIGVsQml0c1soOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICBxY091dCkKewogIHN3aXRjaCAocWNLZXJuZWwtPmJpdHJhdGVNb2RlKSB7CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1NGUjoKICAgICAgYnJlYWs7CgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9GRjoKICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzE6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8yOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzQ6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl81OgogICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgPSAocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC0gcWNPdXRbMF0tPnVzZWREeW5CaXRzKSY3OyAvKiBwcmVjYWxjdWxhdGUgYWxpZ25tZW50IGJpdHMgKi8KICAgICAgYnJlYWs7CgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9DQlI6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQ6CiAgICBkZWZhdWx0OgogICAgICBJTlQgYml0UmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gcWNLZXJuZWwtPmJpdFJlc1RvdCA7CiAgICAgIC8qIHByb2Nlc3NpbmcgZmlsbC1iaXRzICovCiAgICAgIElOVCBkZWx0YUJpdFJlcyA9IHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0cyA7CiAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9IGZpeE1heCgoZGVsdGFCaXRSZXMmNyksIChkZWx0YUJpdFJlcyAtIChmaXhNYXgoMCxiaXRSZXNTcGFjZS03KSZ+NykpKTsKICAgICAgYnJlYWs7CiAgfSAvKiBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiCiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIElOVCBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoSU5UICAgc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgKlJFU1RSSUNUIHNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpSRVNUUklDVCBtYXhWYWx1ZSkKewogIElOVCBzZmJPZmZzLHNmYjsKICBJTlQgbWF4VmFsdWVBbGwgPSAwOwoKICBmb3IgKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkKICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKQogICAgewogICAgICBJTlQgbGluZTsKICAgICAgSU5UIG1heFRoaXNTZmIgPSAwOwogICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdOyBsaW5lIDwgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdOyBsaW5lKyspCiAgICAgIHsKICAgICAgICBJTlQgdG1wID0gZml4cF9hYnMocXVhbnRTcGVjdHJ1bVtsaW5lXSk7CiAgICAgICAgbWF4VGhpc1NmYiA9IGZpeE1heCh0bXAsIG1heFRoaXNTZmIpOwogICAgICB9CgogICAgICBtYXhWYWx1ZVtzZmJPZmZzK3NmYl0gPSBtYXhUaGlzU2ZiOwogICAgICBtYXhWYWx1ZUFsbCA9IGZpeE1heChtYXhUaGlzU2ZiLCBtYXhWYWx1ZUFsbCk7CiAgICB9CiAgcmV0dXJuIG1heFZhbHVlQWxsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfdXBkYXRlQml0cmVzCiAgICAgICAgIGRlc2NyaXB0aW9uOgogICAgICAgICByZXR1cm46CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoQ0hBTk5FTF9NQVBQSU5HICpjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFKiBxY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0KQp7CiAgc3dpdGNoIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGUpIHsKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8xOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzM6CiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl80OgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNToKICAgICAgLyogdmFyaWFibGUgYml0cmF0ZSAqLwogICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gRkRLbWluKHFjS2VybmVsLT5tYXhCaXRzUGVyRnJhbWUsIHFjS2VybmVsLT5iaXRSZXNUb3RNYXgpOwogICAgICBicmVhazsKCiAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0NCUjoKICAgIGNhc2UgUUNEQVRBX0JSX01PREVfU0ZSOgogICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9JTlZBTElEOgogICAgZGVmYXVsdDoKICAgICAgaW50IGMgPSAwOwogICAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCiAgICAgIHsKICAgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICs9IHFjT3V0W2NdLT5ncmFudGVkRHluQml0cyAtIChxY091dFtjXS0+dXNlZER5bkJpdHMgKyBxY091dFtjXS0+dG90RmlsbEJpdHMgKyBxY091dFtjXS0+YWxpZ25CaXRzKTsKICAgICAgfQogICAgICBicmVhazsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24KICAgICAgICAgZGVzY3JpcHRpb246CiAgICAgICAgIHJldHVybjoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKENIQU5ORUxfTUFQUElORyAqY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqKiBxY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICBlcENvbmZpZykKewogIFFDX09VVF9FWFRFTlNJT04gZmlsbEV4dFBheWxvYWQ7CiAgSU5UIHRvdEZpbGxCaXRzLCBhbGlnbkJpdHM7CgogIC8qIEdldCB0b3RhbCBjb25zdW1lZCBiaXRzIGluIEFVICovCiAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICArIHFjT3V0LT50b3RGaWxsQml0cyArCiAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzOwoKICBpZiAocWNLZXJuZWwtPmJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9DQlIpIHsKCiAgICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgZXhhY3QgdHJhbnNwb3J0IGJpdCBhbW91bnQsIGFuZCBob3BlZnVsbHkgaXQgaXMgZXF1YWwgdG8gdGhlIGVzdGltYXRlZCB2YWx1ZSAqLwogICAgSU5UIGV4YWN0VHBCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY091dC0+dG90YWxCaXRzKTsKCiAgICBpZiAoZXhhY3RUcEJpdHMgIT0gcWNLZXJuZWwtPmdsb2JIZHJCaXRzKSB7CiAgICAgIElOVCBkaWZmRmlsbEJpdHMgPSAwOwoKICAgICAgLyogSG93IG1hbnkgYml0cyBjYW4gYmUgdGFrZW4gYnkgYml0cmVzZXJ2b2lyICovCiAgICAgIGNvbnN0IElOVCBiaXRyZXNTcGFjZSA9IHFjS2VybmVsLT5iaXRSZXNUb3RNYXggLSAocWNLZXJuZWwtPmJpdFJlc1RvdCArIChxY091dC0+Z3JhbnRlZER5bkJpdHMgLSAocWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzKSApICk7CgogICAgICAvKiBOdW1iZXIgb2YgYml0cyB3aGljaCBjYW4gYmUgbW92ZWQgdG8gYml0cmVzZXJ2b2lyLiAqLwogICAgICBjb25zdCBJTlQgYml0c1RvQml0cmVzID0gcWNLZXJuZWwtPmdsb2JIZHJCaXRzIC0gZXhhY3RUcEJpdHM7CiAgICAgIEZES19BU1NFUlQoYml0c1RvQml0cmVzPj0wKTsgLyogaXMgYWx3YXlzIHBvc2l0aXZlICovCgogICAgICAvKiBJZiBiaXRyZXNlcnZvaXIgY2FuIG5vdCB0YWtlIGFsbCBiaXRzLCBtb3ZlIHJhbWFpbmluZyBiaXRzIHRvIGZpbGxiaXRzICovCiAgICAgIGRpZmZGaWxsQml0cyA9IEZES21heCgwLCBiaXRzVG9CaXRyZXMgLSBiaXRyZXNTcGFjZSk7CgogICAgICAvKiBBc3N1cmUgcHJldmlvdXMgYWxpZ25tZW50ICovCiAgICAgIGRpZmZGaWxsQml0cyA9IChkaWZmRmlsbEJpdHMrNykmfjc7CgogICAgICAvKiBNb3ZlIGFzIG1hbnkgYml0cyBhcyBwb3NzaWJsZSB0byBiaXRyZXNlcnZvaXIgKi8KICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCAgICArPSAoYml0c1RvQml0cmVzLWRpZmZGaWxsQml0cyk7CgogICAgICAvKiBXcml0ZSByZW1haW5nIGJpdHMgYXMgZmlsbCBiaXRzICovCiAgICAgIHFjT3V0LT50b3RGaWxsQml0cyAgICAgKz0gZGlmZkZpbGxCaXRzOwogICAgICBxY091dC0+dG90YWxCaXRzICAgICAgICs9IGRpZmZGaWxsQml0czsKICAgICAgcWNPdXQtPmdyYW50ZWREeW5CaXRzICArPSBkaWZmRmlsbEJpdHM7CgogICAgICAvKiBHZXQgbmV3IGhlYWRlciBiaXRzICovCiAgICAgIHFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CgogICAgICBpZiAocWNLZXJuZWwtPmdsb2JIZHJCaXRzICE9IGV4YWN0VHBCaXRzKSB7CiAgICAgICAgLyogSW4gcHJldmlvdXMgc3RlcCwgZmlsbCBiaXRzIGFuZCBjb3JyZXNwb25kaW5nIHRvdGFsIGJpdHMgd2VyZSBjaGFuZ2VkIHdoZW4gYml0cmVzZXJ2b2lyIHdhcyBjb21wbGV0ZWx5IGZpbGxlZC4KICAgICAgICAgICBOb3cgd2UgY2FuIHRha2UgdGhlIHRvbyBtdWNoIHRha2VuIGJpdHMgY2F1c2VkIGJ5IGhlYWRlciBvdmVyaGVhZCBmcm9tIGJpdHJlc2Vydm9pci4KICAgICAgICAgKi8KICAgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90IC09IChxY0tlcm5lbC0+Z2xvYkhkckJpdHMgLSBleGFjdFRwQml0cyk7CiAgICAgIH0KICAgIH0KCiAgfSAvKiBNT0RFX0NCUiAqLwoKICAvKiBVcGRhdGUgZXhhY3QgbnVtYmVyIG9mIGNvbnN1bWVkIGhlYWRlciBiaXRzLiAqLwogIHFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CgogIC8qIFNhdmUgdG90YWwgZmlsbCBiaXRzIGFuZCBkaXN0cmlidXQgdG8gYWxpZ25tZW50IGFuZCBmaWxsIGJpdHMgKi8KICB0b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0czsKCiAgLyogZmFrZSBhIGZpbGwgZXh0ZW5zaW9uIHBheWxvYWQgKi8KICBGREttZW1jbGVhcigmZmlsbEV4dFBheWxvYWQsIHNpemVvZihRQ19PVVRfRVhURU5TSU9OKSk7CgogIGZpbGxFeHRQYXlsb2FkLnR5cGUgPSBFWFRfRklMTF9EQVRBOwogIGZpbGxFeHRQYXlsb2FkLm5QYXlsb2FkQml0cyA9IHRvdEZpbGxCaXRzOwoKICAvKiBhc2sgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgb2YgdGhhdCBiaXRzIGNhbiBiZSB3cml0dGVuIGluIGEgZmlsbCBleHRlbnNpb24gZGF0YSBlbnRpdHkgKi8KICBxY091dC0+dG90RmlsbEJpdHMgPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGxFeHRQYXlsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CgogIC8qIG5vdyBkaXN0cmlidXRlIGV4dHJhIGZpbGxiaXRzIGFuZCBhbGlnbmJpdHMgKi8KICBhbGlnbkJpdHMgPSA3IC0gKHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPmVsZW1lbnRFeHRCaXRzCiAgICAgICAgICAgICAgICAgICArIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzIC0xKSU4OwoKICAvKiBNYXliZSB3ZSBjb3VsZCByZW1vdmUgdGhpcyAqLwogIGlmKCAoKGFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzKT09OCkgJiYgKHFjT3V0LT50b3RGaWxsQml0cz44KSApCiAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzIC09IDg7CgogIHFjT3V0LT50b3RhbEJpdHMgPSBxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyArCiAgICAgICAgICAgICAgICAgICAgIGFsaWduQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzOwoKICBpZiAoIChxY091dC0+dG90YWxCaXRzPnFjS2VybmVsLT5tYXhCaXRzUGVyRnJhbWUpIHx8IChxY091dC0+dG90YWxCaXRzPHFjS2VybmVsLT5taW5CaXRzUGVyRnJhbWUpICkgewogICAgcmV0dXJuIEFBQ19FTkNfUVVBTlRfRVJST1I7CiAgfQoKICBxY091dC0+YWxpZ25CaXRzID0gYWxpZ25CaXRzOwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jcmFzaFJlY292ZXJ5CiAgICAgICAgIGRlc2NyaXB0aW9uOiAgZnVsZmlsbHMgY29uc3RyYWludHMgYnkgbWVhbnMgb2YgYnJ1dGUgZm9yY2UuLi4KICAgICAgICAgICAgICAgICAgICAgICA9PiBiaXRzIGFyZSBzYXZlZCBieSBjYW5jZWxsaW5nIG91dCBzcGVjdHJhbCBsaW5lcyEhCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2lubmluZyBhdCB0aGUgaGlnaGVzdCBmcmVxdWVuY2llcykKICAgICAgICAgcmV0dXJuOiAgICAgICBlcnJvcmNvZGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShJTlQgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCAgICpxY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWcpCnsKICBJTlQgY2ggOwogIElOVCBzYXZlZEJpdHMgPSAwIDsKICBJTlQgc2ZiLCBzZmJHcnAgOwogIElOVCBiaXRzUGVyU2NmWygyKV1bTUFYX0dST1VQRURfU0ZCXSA7CiAgSU5UIHNlY3Rpb25Ub1NjZlsoMildW01BWF9HUk9VUEVEX1NGQl0gOwogIElOVCAqc2ZiT2Zmc2V0IDsKICBJTlQgc2VjdCwgc3RhdEJpdHNOZXcgOwogIFFDX09VVF9DSEFOTkVMICoqcWNDaGFubmVsID0gcWNFbGVtZW50LT5xY091dENoYW5uZWw7CiAgUFNZX09VVF9DSEFOTkVMICoqcHN5Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7CgogIC8qIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIGNvbnZlcnRzIGZycS1iaW5zIHRvIGJpdC1kZW1hbmQuLi4gICAgW2JpdHNQZXJTY2ZdICovCiAgLyogLi4uYW5kIGFub3RoZXIgb25lIHdoaWNoIGhvbGRzIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb25zIFtzZWN0aW9uVG9TY2ZdICovCiAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogIHsKICAgIHNmYk9mZnNldCA9IHBzeUNoYW5uZWxbY2hdLT5zZmJPZmZzZXRzIDsKCiAgICBmb3IgKHNlY3QgPSAwOyBzZWN0IDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZlNlY3Rpb25zOyBzZWN0KyspCiAgICB7CiAgICAgIElOVCBzZmIgOwogICAgICBJTlQgY29kZUJvb2sgPSBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5jb2RlQm9vayA7CgogICAgICBmb3IgKHNmYiA9IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYlN0YXJ0OwogICAgICAgICAgIHNmYiA8IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYlN0YXJ0ICsKICAgICAgICAgICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQ7CiAgICAgICAgICAgc2ZiKyspCiAgICAgIHsKICAgICAgICBiaXRzUGVyU2NmW2NoXVtzZmJdID0gMDsKICAgICAgICBpZiAoIChjb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSAvKiYmCiAgICAgICAgICAgICAoc2ZiIDwgKHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vT2ZHcm91cHMqcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXApKSovICkKICAgICAgICB7CiAgICAgICAgICAgIElOVCBzZmJTdGFydExpbmUgPSBzZmJPZmZzZXRbc2ZiXSA7CiAgICAgICAgICAgIElOVCBub09mTGluZXMgICAgPSBzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiU3RhcnRMaW5lIDsKICAgICAgICAgICAgYml0c1BlclNjZltjaF1bc2ZiXSA9IEZES2FhY0VuY19jb3VudFZhbHVlcygmKHFjQ2hhbm5lbFtjaF0tPnF1YW50U3BlY1tzZmJTdGFydExpbmVdKSwgbm9PZkxpbmVzLCBjb2RlQm9vaykgOwogICAgICAgIH0KICAgICAgICBzZWN0aW9uVG9TY2ZbY2hdW3NmYl0gPSBzZWN0IDsKICAgICAgfQoKICAgIH0KICB9CgogIC8qIExPV0VSIFttYXhTZmJdIElOIEJPVEggQ0hBTk5FTFMhISAqLwogIC8qIEF0dGVudGlvbjogaW4gY2FzZSBvZiBzdGVyZW86IG1heFNmYkwgPT0gbWF4U2ZiUiwgR3JvdXBpbmdMID09IEdyb3VwaW5nUiA7ICovCgogIGZvciAoc2ZiID0gcWNDaGFubmVsWzBdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cC0xOyBzZmIgPj0gMDsgc2ZiLS0pCiAgewogICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lDaGFubmVsWzBdLT5zZmJDbnQ7IHNmYkdycCArPSBwc3lDaGFubmVsWzBdLT5zZmJQZXJHcm91cCkKICAgIHsKICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgICB7CiAgICAgICAgaW50IHNlY3QgPSBzZWN0aW9uVG9TY2ZbY2hdW3NmYkdycCtzZmJdOwogICAgICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudC0tIDsKICAgICAgICBzYXZlZEJpdHMgKz0gYml0c1BlclNjZltjaF1bc2ZiR3JwK3NmYl0gOwoKICAgICAgICBpZiAocWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiQ250ID09IDApIHsKICAgICAgICAgIHNhdmVkQml0cyArPSAocHN5Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKSA/IEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmdbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogLi4uaGF2ZSBlbm91Z2ggYml0cyBiZWVuIHNhdmVkPyAqLwogICAgaWYgKHNhdmVkQml0cyA+PSBiaXRzVG9TYXZlKQogICAgICBicmVhayA7CgogIH0gLyogc2ZiIGxvb3AgKi8KCiAgLyogaWYgbm90IGVub3VnaCBiaXRzIHNhdmVkLAogICAgIGNsZWFuIHdob2xlIHNwZWN0cnVtIGFuZCByZW1vdmUgc2lkZSBpbmZvIG92ZXJoZWFkICovCiAgaWYgKHNmYiA9PSAtMSkgewogICAgc2ZiID0gMCA7CiAgfQoKICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgewogICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXAgPSBzZmIgOwogICAgcHN5Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwID0gc2ZiIDsKICAgIC8qIHdoZW4gbm8gc3BlY3RydW0gaXMgY29kZWQgc2F2ZSB0b29scyBpbmZvIGluIGJpdHN0cmVhbSAqLwogICAgaWYoc2ZiPT0wKSB7CiAgICAgIEZES21lbWNsZWFyKCZwc3lDaGFubmVsW2NoXS0+dG5zSW5mbywgc2l6ZW9mKFROU19JTkZPKSk7CiAgICAgIEZES21lbWNsZWFyKCZwc3lPdXRFbGVtZW50LT50b29sc0luZm8sIHNpemVvZihUT09MU0lORk8pKTsKICAgIH0KICB9CiAgLyogZHluYW1pYyBiaXRzIHdpbGwgYmUgdXBkYXRlZCBpbiBpdGVyYXRpb24gbG9vcCAqLwoKICB7IC8qIGlmIHN0b3Agc2ZiIGhhcyBjaGFuZ2VkIHNhdmUgYml0cyBpbiBzaWRlIGluZm8sIGUuZy4gTVMgb3IgVE5TIGNvZGluZyAqLwogICAgRUxFTUVOVF9JTkZPIGVsSW5mbzsKCiAgICBGREttZW1jbGVhcigmZWxJbmZvLCBzaXplb2YoRUxFTUVOVF9JTkZPKSk7CiAgICBlbEluZm8ubkNoYW5uZWxzSW5FbCA9IG5DaGFubmVsczsKICAgIGVsSW5mby5lbFR5cGUgPSAobkNoYW5uZWxzID09IDIpID8gSURfQ1BFIDogSURfU0NFOwoKICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCAmZWxJbmZvLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdEJpdHNOZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwogIH0KCiAgc2F2ZWRCaXRzID0gcWNFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCAtIHN0YXRCaXRzTmV3OwoKICAvKiB1cGRhdGUgc3RhdGljIGFuZCBkeW5hbWljIGJpdHMgKi8KICBxY0VsZW1lbnQtPnN0YXRpY0JpdHNVc2VkIC09IHNhdmVkQml0czsKICBxY0VsZW1lbnQtPmdyYW50ZWREeW5CaXRzICs9IHNhdmVkQml0czsKCiAgcWNPdXQtPnN0YXRpY0JpdHMgICAgIC09IHNhdmVkQml0czsKICBxY091dC0+Z3JhbnRlZER5bkJpdHMgKz0gc2F2ZWRCaXRzOwogIHFjT3V0LT5tYXhEeW5CaXRzICAgICArPSBzYXZlZEJpdHM7CgoKfQoKCgp2b2lkICBGREthYWNFbmNfUUNDbG9zZSAoUUNfU1RBVEUgICoqcGhRQ3N0YXRlLCBRQ19PVVQgKipwaFFDKQp7CiAgaW50IG4sIGk7CgogIGlmIChwaFFDIT1OVUxMKSB7CgogICAgZm9yIChuPTA7bjwoMSk7bisrKSB7CiAgICAgIGlmIChwaFFDW25dICE9IE5VTEwpIHsKICAgICAgICBRQ19PVVQgICAgKmhRQyAgICAgID0gcGhRQ1tuXTsKICAgICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewogICAgICAgIH0KCiAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKICAgICAgICAgIGlmIChoUUMtPnFjRWxlbWVudFtpXSkKICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUUNlbGVtZW50KCZoUUMtPnFjRWxlbWVudFtpXSk7CiAgICAgICAgfQoKICAgICAgICBGcmVlUmFtX2FhY0VuY19RQ291dCgmcGhRQ1tuXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChwaFFDc3RhdGUhPU5VTEwpIHsKICAgIGlmICgqcGhRQ3N0YXRlICE9IE5VTEwpIHsKICAgICAgUUNfU1RBVEUgICpoUUNzdGF0ZSA9ICpwaFFDc3RhdGU7CgogICAgICBpZiAoaFFDc3RhdGUtPmhBZGpUaHIgIT0gTlVMTCkKICAgICAgICBGREthYWNFbmNfQWRqVGhyQ2xvc2UoJmhRQ3N0YXRlLT5oQWRqVGhyKTsKCiAgICAgIGlmIChoUUNzdGF0ZS0+aEJpdENvdW50ZXIgIT0gTlVMTCkKICAgICAgICBGREthYWNFbmNfQkNDbG9zZSgmaFFDc3RhdGUtPmhCaXRDb3VudGVyKTsKCiAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CiAgICAgICAgaWYgKGhRQ3N0YXRlLT5lbGVtZW50Qml0c1tpXSE9TlVMTCkgewogICAgICAgICAgRnJlZVJhbV9hYWNFbmNfRWxlbWVudEJpdHMoJmhRQ3N0YXRlLT5lbGVtZW50Qml0c1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIEZyZWVSYW1fYWFjRW5jX1FDc3RhdGUocGhRQ3N0YXRlKTsKICAgIH0KICB9Cn0KCg==