Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgU0JSIGJpdCB3cml0aW5nIHJvdXRpbmVzICAKKi8KCgojaW5jbHVkZSAiYml0X3Nici5oIgoKI2luY2x1ZGUgImNvZGVfZW52LmgiCiNpbmNsdWRlICJjbW9uZGF0YS5oIgojaW5jbHVkZSAic2JyLmgiCgojaW5jbHVkZSAicHNfbWFpbi5oIgoKdHlwZWRlZiBlbnVtIHsKICBTQlJfSURfU0NFID0gMSwKICBTQlJfSURfQ1BFCn0gU0JSX0VMRU1FTlRfVFlQRTsKCgpzdGF0aWMgSU5UIGVuY29kZVNickRhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICAgICAgc2JyRWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwoKc3RhdGljIElOVCBlbmNvZGVTYnJIZWFkZXIgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgICAgIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpOwoKCnN0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdFN0cmVhbSk7CgpzdGF0aWMgSU5UIGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCgoKc3RhdGljIElOVCBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZyk7CgoKc3RhdGljIElOVCBlbmNvZGVTYnJHcmlkIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSk7CgpzdGF0aWMgaW50IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc21pdEZyZXFzKTsKCnN0YXRpYyBJTlQgZW5jb2RlU2JyRHRkZiAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0pOwoKc3RhdGljIElOVCB3cml0ZU5vaXNlTGV2ZWxEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwoKc3RhdGljIElOVCB3cml0ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgICBzYnJFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwoKc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKCgpzdGF0aWMgSU5UIGVuY29kZUV4dGVuZGVkRGF0YSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0pOwoKCgpzdGF0aWMgSU5UIGdldFNickV4dGVuZGVkRGF0YVNpemUgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudAogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgcHVyZSBTQlIgc2luZ2xlIGNoYW5uZWwgZGF0YSBlbGVtZW50CiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgICAgICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgICAgICAgY21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CiAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gMDsKCiAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLwogIGlmIChzYnJFbnZEYXRhICE9IE5VTEwpIHsKCiAgICAvKiB3cml0ZSBoZWFkZXIgKi8KICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlciAoc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEpOwoKCiAgICAvKiB3cml0ZSBkYXRhICovCiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEYXRhIChzYnJFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfSURfU0NFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKCiAgfQogIHJldHVybiBwYXlsb2FkQml0czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQKICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIHB1cmUgU0JSIGNoYW5uZWwgcGFpciBkYXRhIGVsZW1lbnQKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UCkZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgICBjbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CiAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gMDsKCiAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLwogIGlmICgoc2JyRW52RGF0YUxlZnQgIT0gTlVMTCkgJiYgKHNickVudkRhdGFSaWdodCAhPSBOVUxMKSkgewoKICAgIC8qIHdyaXRlIGhlYWRlciAqLwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyIChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSk7CgogICAgLyogd3JpdGUgZGF0YSAqLwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0lEX0NQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwoKICB9CiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgpJTlQKRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQp7CiAgSU5UIHBheWxvYWRCaXRzOwogIElOVCBiaXRQb3MgPSBGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpOwoKICBwYXlsb2FkQml0cyA9IEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKCiAgRkRLcHVzaEJhY2soJmNtb25EYXRhLT5zYnJCaXRidWYsIChGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpIC0gYml0UG9zKSApOwoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgp2b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKFNCUl9FTkNPREVSICAgKnNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIGVsZW1lbnRfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZlNlbmRIZWFkZXJzKQp7CiAgaW50IGJpdHM7CgogIGJpdHMgPSBlbmNvZGVTYnJIZWFkZXJEYXRhICgmc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JySGVhZGVyRGF0YSwgaEJzKTsKICAgIAogIGlmIChmU2VuZEhlYWRlcnMgPT0gMCkgewogICAgLyogUHJldmVudCBoZWFkZXIgYmVpbmcgZW1iZWRkZWQgaW50byB0aGUgU0JSIHBheWxvYWQuICovCiAgICBzYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsZW1lbnRfaW5kZXhdLT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAtMTsKICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID0gMDsKICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IC0xOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JySGVhZGVyCiAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgU0JSIEhlYWRlciBpbmZvcm1hdGlvbgogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNickhlYWRlciAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhKQp7CiAgSU5UIHBheWxvYWRCaXRzID0gMDsKCiAgaWYgKHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSkgewogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICgmY21vbkRhdGEtPnNickJpdGJ1ZiwgMSwgMSk7CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXJEYXRhIChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtb25EYXRhLT5zYnJCaXRidWYpOwogIH0KICBlbHNlIHsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDAsIDEpOwogIH0KCiAgY21vbkRhdGEtPnNickhkckJpdHMgPSBwYXlsb2FkQml0czsKCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JySGVhZGVyRGF0YQogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgc2JyX2hlYWRlcigpCiAgICAgICAgICAgICAgICAgIGJzX3Byb3RvY29sX3ZlcnNpb24gdGhyb3VnaCBic19oZWFkZXJfZXh0cmFfMgogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNickhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogIGlmIChzYnJIZWFkZXJEYXRhICE9IE5VTEwpIHsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9BTVBfUkVTX0JJVFMpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfU1RBUlRfRlJFUV9CSVRTKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3N0b3BfZnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfU1RPUF9GUkVRX0JJVFMpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1hPVkVSX0JBTkRfQklUUyk7CgogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfUkVTRVJWRURfQklUUyk7CgogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0hFQURFUl9FWFRSQV8xX0JJVFMpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0hFQURFUl9FWFRSQV8yX0JJVFMpOwoKCiAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEpIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0ZSRVFfU0NBTEVfQklUUyk7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyk7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTKTsKICAgIH0gLyogc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEgKi8KCiAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIpIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbGltaXRlcl9iYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfTElNSVRFUl9CQU5EU19CSVRTKTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbGltaXRlcl9nYWlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfTElNSVRFUl9HQUlOU19CSVRTKTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfaW50ZXJwb2xfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5URVJQT0xfRlJFUV9CSVRTKTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfc21vb3RoaW5nX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfU01PT1RISU5HX0xFTkdUSF9CSVRTKTsKCiAgICB9IC8qIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yICovCiAgfSAvKiBzYnJIZWFkZXJEYXRhICE9IE5VTEwgKi8KCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJEYXRhCiAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgc2JyIERhdGEgaW5mb3JtYXRpb24KICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgY21vbkRhdGEsCiAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICBzYnJFbGVtLAogICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcsCiAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIHN3aXRjaCAoc2JyRWxlbSkgewogIGNhc2UgU0JSX0lEX1NDRToKICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChzYnJFbnZEYXRhTGVmdCwgJmNtb25EYXRhLT5zYnJCaXRidWYsIGhQYXJhbWV0cmljU3RlcmVvLCBzYnJTeW50YXhGbGFncyk7CiAgICBicmVhazsKICBjYXNlIFNCUl9JRF9DUEU6CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKHNickVudkRhdGFMZWZ0LCBzYnJFbnZEYXRhUmlnaHQsIGhQYXJhbWV0cmljU3RlcmVvLCAmY21vbkRhdGEtPnNickJpdGJ1ZiwgY291cGxpbmcpOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qIHdlIG5ldmVyIHNob3VsZCBhcHBseSBTQlIgdG8gYW55IG90aGVyIGVsZW1lbnQgdHlwZSAqLwogICAgRkRLX0FTU0VSVCAoMCk7CiAgfQoKICBjbW9uRGF0YS0+c2JyRGF0YUJpdHMgPSBwYXlsb2FkQml0czsKCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgojZGVmaW5lIE1PREVfRlJFUV9UQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgTU9ERV9OT19GUkVRX1RSQU4gICAgICAgICAgICAgICAgICAgICAgIDAKI2RlZmluZSBMRF9UUkFOU01JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9GUkVRX1RBTlMKc3RhdGljIGludCBlbmNvZGVGcmVxcyAoaW50IG1vZGUpIHsKICAgIHJldHVybiAoKG1vZGUgJiBNT0RFX0ZSRVFfVEFOUykgPyAxIDogMCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50CiAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgc2JyIFNDRSBpbmZvcm1hdGlvbgogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBpLCBwYXlsb2FkQml0cyA9IDA7CgogIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KCiAgaWYgKHNickVudkRhdGEtPmxkR3JpZCkgewogICAgICBpZiAoIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSApIHsKICAgICAgICAvKiBlbmNvZGUgbm9ybWFsIFNickdyaWQgKi8KICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvKiB1c2UgRklYRklYb25seSBmcmFtZSBHcmlkICovCiAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSk7CiAgICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfU0NBTEFCTEUpIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAxLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CiAgICB9CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKICB9CgogIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOwoKICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7IGkrKykgewogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICB9CgogIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCAwKTsKICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCAwKTsKCiAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhLGhCaXRTdHJlYW0pOwoKICBwYXlsb2FkQml0cyArPSBlbmNvZGVFeHRlbmRlZERhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIGhCaXRTdHJlYW0pOwoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudAogICAgZGVzY3JpcHRpb246ICBlbmNvZGVzIHNiciBDUEUgaW5mb3JtYXRpb24KICAgIHJldHVybnM6CiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nKQp7CiAgSU5UIHBheWxvYWRCaXRzID0gMDsKICBJTlQgaSA9IDA7CgogIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KCiAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBjb3VwbGluZywgU0lfU0JSX0NPVVBMSU5HX0JJVFMpOwoKICBpZiAoY291cGxpbmcpIHsKICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+bGRHcmlkKSB7CiAgICAgICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkgKSB7CiAgICAgICAgICAgIC8qIG5vcm1hbCBTYnJHcmlkICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwogICAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKICAgICAgICAgIH0KICAgIH0gZWxzZQogICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKCiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhTGVmdC0+bm9PZm5vaXNlYmFuZHM7IGkrKykgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgIH0KCiAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwxKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwxKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhICAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDEpOwogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDEpOwoKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YUxlZnQsaEJpdFN0cmVhbSk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFSaWdodCxoQml0U3RyZWFtKTsKCiAgfSBlbHNlIHsgLyogbm8gY291cGxpbmcgKi8KICAgIEZES19BU1NFUlQoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCA9PSBzYnJFbnZEYXRhUmlnaHQtPmxkR3JpZCk7CgogICAgaWYgKHNickVudkRhdGFMZWZ0LT5sZEdyaWQgfHwgc2JyRW52RGF0YVJpZ2h0LT5sZEdyaWQpIHsKICAgIC8qIHNickVudkRhdGFMZWZ0IChsZWZ0IGNoYW5uZWwpICovCiAgICAgIGlmICggc2JyRW52RGF0YUxlZnQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgewogICAgICAgIC8qIG5vIEZJWEZJWG9ubHkgRnJhbWUgc28gd2UgZG9udCBuZWVkIGVuY29kZUxvd0RlbGF5U2JyR3JpZCAqLwogICAgICAgIC8qIG5vcm1hbCBTYnJHcmlkICovCiAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtKTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSk7CiAgICAgIH0KCiAgICAgIC8qIHNickVudkRhdGFSaWdodCAocmlnaHQgY2hhbm5lbCkgKi8KICAgICAgaWYgKCBzYnJFbnZEYXRhUmlnaHQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgewogICAgICAgIC8qIG5vIEZJWEZJWG9ubHkgRnJhbWUgc28gd2UgZG9udCBuZWVkIGVuY29kZUxvd0RlbGF5U2JyR3JpZCAqLwogICAgICAgIC8qIG5vcm1hbCBTYnJHcmlkICovCiAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOwogICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0pOwogICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CiAgICB9CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0pOwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YUxlZnQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhTGVmdC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhUmlnaHQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVfdmVjW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgICB9CgogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMCk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwwKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwwKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwwKTsKCiAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFMZWZ0LGhCaXRTdHJlYW0pOwogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhUmlnaHQsaEJpdFN0cmVhbSk7CgogIH0gLyogY291cGxpbmcgKi8KCiAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlRXh0ZW5kZWREYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBoQml0U3RyZWFtKTsKCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgpzdGF0aWMgSU5UIGNlaWxfbG4yKElOVCB4KQp7CiAgSU5UIHRtcD0tMTsKICB3aGlsZSgoMTw8Kyt0bXApIDwgeCk7CiAgcmV0dXJuKHRtcCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickdyaWQKICAgIGRlc2NyaXB0aW9uOiAgaWYgaEJpdFN0cmVhbSAhPSBOVUxMIHdyaXRlcyBiaXRzIHRoYXQgZGVzY3JpYmVzIHRoZQogICAgICAgICAgICAgICAgICB0aW1lL2ZyZXF1ZW5jeSBncm91cGluZyBvZiBhIGZyYW1lOyBlbHNlIGNvdW50cyB0aGVtIG9ubHkKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBvciBjb3VudGVkCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNickdyaWQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CiAgSU5UIGksIHRlbXA7CiAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5idWZmZXJGcmFtZVN0YXJ0OwogIElOVCBudW1iZXJUaW1lU2xvdHMgID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bnVtYmVyVGltZVNsb3RzOwoKICBpZiAoc2JyRW52RGF0YS0+bGRHcmlkKQogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ0xBX0JJVFNfTEQpOwogIGVsc2UKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NMQV9CSVRTKTsKCiAgc3dpdGNoIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzKSB7CiAgY2FzZSBGSVhGSVhvbmx5OgogICAgRkRLX0FTU0VSVCgwIC8qIEZhdGFsIGVycm9yIGluIGVuY29kZVNickdyaWQhICovKTsKICAgIGJyZWFrOwogIGNhc2UgRklYRklYOgogICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9lbnYpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfRU5WX0JJVFMpOwogICAgaWYgKChzYnJFbnZEYXRhLT5sZEdyaWQpICYmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52PT0xKSkKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmN1cnJlbnRBbXBSZXNGRiwgU0lfU0JSX0FNUF9SRVNfQklUUyk7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZlswXSwgU0JSX1JFU19CSVRTKTsKCiAgICBicmVhazsKCiAgY2FzZSBGSVhWQVI6CiAgY2FzZSBWQVJGSVg6CiAgICBpZiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyA9PSBGSVhWQVIpCiAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtIChidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKTsKICAgIGVsc2UKICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0gYnVmZmVyRnJhbWVTdGFydDsKCiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4sIFNCUl9OVU1fQklUUyk7CgogICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm47IGkrKykgewogICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkW2ldIC0gMikgPj4gMTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOwogICAgfQoKICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uICsgMik7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uICsgMTsgaSsrKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBWQVJWQVI6CiAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CiAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMSAtIChidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKCiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCwgU0JSX05VTV9CSVRTKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xLCBTQlJfTlVNX0JJVFMpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzA7IGkrKykgewogICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkXzBbaV0gLSAyKSA+PiAxOwogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMTsgaSsrKSB7CiAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRfMVtpXSAtIDIpID4+IDE7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKICAgIH0KCiAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEgKyAyKTsKICAgIHBheWxvYWRCaXRzICs9ICBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOwoKICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAgKwogICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSArIDE7CgogICAgZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZkxSW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7CiAgICB9CiAgICBicmVhazsKICB9CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKI2RlZmluZSBTQlJfQ0xBX0JJVFNfTEQgMQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZUxvd0RlbGF5U2JyR3JpZAogICAgZGVzY3JpcHRpb246ICBpZiBoQml0U3RyZWFtICE9IE5VTEwgd3JpdGVzIGJpdHMgdGhhdCBkZXNjcmliZXMgdGhlCiAgICAgICAgICAgICAgICAgIHRpbWUvZnJlcXVlbmN5IGdyb3VwaW5nIG9mIGEgZnJhbWU7CiAgICAgICAgICAgICAgICAgIGVsc2UgY291bnRzIHRoZW0gb25seQogICAgICAgICAgICAgICAgICAodGhpcyBmdW5jdGlvbiBvbmx5IHdyaXRlIHRoZSBGSVhGSVhvbmx5IEJpdHN0cmVhbSBkYXRhKQogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuIG9yIGNvdW50ZWQKICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKZW5jb2RlTG93RGVsYXlTYnJHcmlkICggIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNtaXRGcmVxcwogICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBwYXlsb2FkQml0cyA9IDA7CiAgaW50IGk7CgogIC8qIHdyaXRlIEZJWEZJWG9ubHkgR3JpZCAqLwogIC8qIHdyaXRlIGZyYW1lQ2xhc3MgWzEgYml0XSBmb3IgRklYRklYb25seSBHcmlkICovCiAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIFNCUl9DTEFfQklUU19MRCk7CgogIC8qIGFic29sdXRlIEJvcmRlcnMgYXJlIGZpeDogMCxYLFgsWCxuVGltZVNsb3RzOyBzbyB3ZSBkb250IGhhdmUgdG8gdHJhbnNtaXQgdGhlbSAqLwogIC8qIG9ubHkgdHJhbnNtaXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbiEgKi8KICAvKiB3aXRoIHRoaXMgaW5mbyAoYjEpIHdlIGNhbiByZWNvbnN0cnVjdCB0aGUgRnJhbWUgb24gRGVjb2RlciBzaWRlIDogKi8KICAvKiBib3JkZXJbMF0gPSAwOyBib3JkZXJbMV0gPSBiMTsgYm9yZGVyWzJdPWIxKzI7IGJvcmRlclszXSA9IG5yVGltZVNsb3RzICovCgogIC8qIHVzZSAzIG9yIDRiaXRzIGZvciB0cmFuc2llbnQgYm9yZGVyIChib3JkZXIpICovCiAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm51bWJlclRpbWVTbG90cyA9PSA4KQogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICggaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQsIDMpOwogIGVsc2UKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkLCA0KTsKCiAgaWYgKHRyYW5zbWl0RnJlcXMpIHsKICAgIC8qIHdyaXRlIEZyZXFSZXMgZ3JpZCAqLwogICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9lbnY7IGkrKykgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwgU0JSX1JFU19CSVRTKTsKICAgIH0KICB9CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJEdGRmCiAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBiaXRzIHRoYXQgZGVzY3JpYmVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGVudmVsb3BlcyBvZiBhIGZyYW1lCiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKZW5jb2RlU2JyRHRkZiAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQp7CiAgSU5UIGksIHBheWxvYWRCaXRzID0gMCwgbm9PZk5vaXNlRW52ZWxvcGVzOwoKICBub09mTm9pc2VFbnZlbG9wZXMgPSBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzID4gMSA/IDIgOiAxOwoKICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlczsgKytpKSB7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmRvbWFpbl92ZWNbaV0sIFNCUl9ESVJfQklUUyk7CiAgfQogIGZvciAoaSA9IDA7IGkgPCBub09mTm9pc2VFbnZlbG9wZXM7ICsraSkgewogICAgcGF5bG9hZEJpdHMgKz0gIEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSwgU0JSX0RJUl9CSVRTKTsKICB9CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogd3JpdGVOb2lzZUxldmVsRGF0YQogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2lzZS1mbG9vci1sZXZlbAogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCndyaXRlTm9pc2VMZXZlbERhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgSU5UIGNvdXBsaW5nKQp7CiAgSU5UIGosIGksIHBheWxvYWRCaXRzID0gMDsKICBJTlQgbk5vaXNlRW52ZWxvcGVzID0gc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlcyA+IDEgPyAyIDogMTsKCiAgZm9yIChpID0gMDsgaSA8IG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CiAgICBzd2l0Y2ggKHNickVudkRhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0pIHsKICAgIGNhc2UgRlJFUToKICAgICAgaWYgKGNvdXBsaW5nICYmIHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2kgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2kgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0cyk7CiAgICAgIH0KCiAgICAgIGZvciAoaiA9IDEgKyBpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7IGogPCAoc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHMgKiAoMSArIGkpKTsgaisrKSB7CiAgICAgICAgaWYgKGNvdXBsaW5nKSB7CiAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgewogICAgICAgICAgICAvKiBjb3VwbGluZyAmJiBiYWxhbmNlICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VGcmVxQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLyogIWNvdXBsaW5nICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSBUSU1FOgogICAgICBmb3IgKGogPSBpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7IGogPCAoc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHMgKiAoMSArIGkpKTsgaisrKSB7CiAgICAgICAgaWYgKGNvdXBsaW5nKSB7CiAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgewogICAgICAgICAgICAvKiBjb3VwbGluZyAmJiBiYWxhbmNlICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLyogIWNvdXBsaW5nICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiB3cml0ZUVudmVsb3BlRGF0YQogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnZlbG9wZQogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCndyaXRlRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZykKewogIElOVCBwYXlsb2FkQml0cyA9IDAsIGosIGksIGRlbHRhOwoKICBmb3IgKGogPSAwOyBqIDwgc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlczsgaisrKSB7IC8qIGxvb3Agb3ZlciBhbGwgZW52ZWxvcGVzICovCiAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSA9PSBGUkVRKSB7CiAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CiAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmllbnZlbG9wZVtqXVswXSwgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDEgLSBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdOyBpIDwgc2JyRW52RGF0YS0+bm9TY2ZCYW5kc1tqXTsgaSsrKSB7CiAgICAgIGRlbHRhID0gc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdW2ldOwogICAgICBpZiAoY291cGxpbmcgJiYgc2JyRW52RGF0YS0+YmFsYW5jZSkgewogICAgICAgIEZES19BU1NFUlQgKGZpeHBfYWJzIChkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBGREtfQVNTRVJUIChmaXhwX2FicyAoZGVsdGEpIDw9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2KTsKICAgICAgfQogICAgICBpZiAoY291cGxpbmcpIHsKICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgewogICAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAmJiBUSU1FICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAmJiBGUkVRICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSkgewogICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAmJiBUSU1FICovCiAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgRlJFUSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKICAgICAgICAgIC8qICFjb3VwbGluZyAmJiBUSU1FICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8qICFjb3VwbGluZyAmJiBGUkVRICovCiAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlRXh0ZW5kZWREYXRhCiAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVuZGVkIGRhdGEKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCBlbmNvZGVFeHRlbmRlZERhdGEgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQp7CiAgSU5UIGV4dERhdGFTaXplOwogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIGV4dERhdGFTaXplID0gZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZShoUGFyYW1ldHJpY1N0ZXJlbyk7CgoKICBpZiAoZXh0RGF0YVNpemUgIT0gMCkgewogICAgSU5UIG1heEV4dFNpemUgPSAoMTw8U0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMpIC0gMTsKICAgIElOVCB3cml0dGVuTm9CaXRzID0gMDsgLyogbmVlZGVkIHRvIGJ5dGUgYWxpZ24gdGhlIGV4dGVuZGVkIGRhdGEgKi8KCiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDEsIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMpOwogICAgRkRLX0FTU0VSVChleHREYXRhU2l6ZSA8PSBTQlJfRVhURU5ERURfREFUQV9NQVhfQ05UKTsKCiAgICBpZiAoZXh0RGF0YVNpemUgPCBtYXhFeHRTaXplKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgZXh0RGF0YVNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKICAgIH0gZWxzZSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgbWF4RXh0U2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMpOwogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGV4dERhdGFTaXplIC0gbWF4RXh0U2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyk7CiAgICB9CgogICAgLyogcGFyYW1ldHJpYyBjb2Rpbmcgc2lnbmFsbGVkIGhlcmU/ICovCiAgICBpZihoUGFyYW1ldHJpY1N0ZXJlbyl7CiAgICAgIHdyaXR0ZW5Ob0JpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBFWFRFTlNJT05fSURfUFNfQ09ESU5HLCBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMpOwogICAgICB3cml0dGVuTm9CaXRzICs9IEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CiAgICB9CgogICAgcGF5bG9hZEJpdHMgKz0gd3JpdHRlbk5vQml0czsKCiAgICAvKiBieXRlIGFsaWdubWVudCAqLwogICAgd3JpdHRlbk5vQml0cyA9IHdyaXR0ZW5Ob0JpdHMlODsKICAgIGlmKHdyaXR0ZW5Ob0JpdHMpCiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAoOCAtIHdyaXR0ZW5Ob0JpdHMpKTsKICB9IGVsc2UgewogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLCBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTKTsKICB9CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhCiAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlICJzeW50aGV0aWMtY29kaW5nIi1leHRlbnNpb24KICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoKewogIElOVCBpOwogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNGbGFnLCAxKTsKCiAgaWYgKHNickVudkRhdGEtPmFkZEhhcm1vbmljRmxhZykgewogICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vSGFybW9uaWNzOyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5hZGRIYXJtb25pY1tpXSwgMSk7CiAgICB9CiAgfQoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZQogICAgZGVzY3JpcHRpb246ICBjb3VudHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgZW5jb2RpbmcgdGhlCiAgICAgICAgICAgICAgICAgIGV4dGVuZGVkIGRhdGEgKGluY2x1ZGluZyBleHRlbnNpb24gaWQpCgogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBleHRlbmRlZCBkYXRhCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmdldFNickV4dGVuZGVkRGF0YVNpemUgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8pCnsKICBJTlQgZXh0RGF0YUJpdHMgPSAwOwoKICAvKiBhZGQgeW91ciBuZXcgZXh0ZW5kZWQgZGF0YSBjb3VudGluZyBtZXRob2RzIGhlcmUgKi8KCiAgLyoKICAgIG5vIGV4dGVuZGVkIGRhdGEKICAqLwoKICBpZihoUGFyYW1ldHJpY1N0ZXJlbyl7CiAgICAvKiBQUyBleHRlbmRlZCBkYXRhICovCiAgICBleHREYXRhQml0cyArPSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFM7CiAgICBleHREYXRhQml0cyArPSBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIE5VTEwpOwogIH0KCiAgcmV0dXJuIChleHREYXRhQml0cys3KSA+PiAzOwp9CgoKCgoK