Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgU0JSIGJpdCB3cml0aW5nIHJvdXRpbmVzICAKKi8KCgojaW5jbHVkZSAiYml0X3Nici5oIgoKI2luY2x1ZGUgImNvZGVfZW52LmgiCiNpbmNsdWRlICJjbW9uZGF0YS5oIgojaW5jbHVkZSAic2JyLmgiCgojaW5jbHVkZSAicHNfbWFpbi5oIgoKdHlwZWRlZiBlbnVtIHsKICBTQlJfSURfU0NFID0gMSwKICBTQlJfSURfQ1BFCn0gU0JSX0VMRU1FTlRfVFlQRTsKCgpzdGF0aWMgSU5UIGVuY29kZVNickRhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICAgICAgc2JyRWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwoKc3RhdGljIElOVCBlbmNvZGVTYnJIZWFkZXIgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgICAgIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpOwoKCnN0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdFN0cmVhbSk7CgpzdGF0aWMgSU5UIGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCgoKc3RhdGljIElOVCBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZyk7CgoKc3RhdGljIElOVCBlbmNvZGVTYnJHcmlkIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSk7CgpzdGF0aWMgaW50IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc21pdEZyZXFzKTsKCnN0YXRpYyBJTlQgZW5jb2RlU2JyRHRkZiAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0pOwoKc3RhdGljIElOVCB3cml0ZU5vaXNlTGV2ZWxEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwoKc3RhdGljIElOVCB3cml0ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgICBzYnJFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwoKc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKCgpzdGF0aWMgSU5UIGVuY29kZUV4dGVuZGVkRGF0YSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0pOwoKCgpzdGF0aWMgSU5UIGdldFNickV4dGVuZGVkRGF0YVNpemUgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudAogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgcHVyZSBTQlIgc2luZ2xlIGNoYW5uZWwgZGF0YSBlbGVtZW50CiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgICAgICAgc2JyRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgICAgICAgY21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CiAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gMDsKCiAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLwogIGlmIChzYnJFbnZEYXRhICE9IE5VTEwpIHsKCiAgICAvKiB3cml0ZSBoZWFkZXIgKi8KICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlciAoc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEpOwoKCiAgICAvKiB3cml0ZSBkYXRhICovCiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEYXRhIChzYnJFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfSURfU0NFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKCiAgfQogIHJldHVybiBwYXlsb2FkQml0czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQKICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIHB1cmUgU0JSIGNoYW5uZWwgcGFpciBkYXRhIGVsZW1lbnQKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UCkZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgICBjbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CiAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gMDsKCiAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLwogIGlmICgoc2JyRW52RGF0YUxlZnQgIT0gTlVMTCkgJiYgKHNickVudkRhdGFSaWdodCAhPSBOVUxMKSkgewoKICAgIC8qIHdyaXRlIGhlYWRlciAqLwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyIChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSk7CgogICAgLyogd3JpdGUgZGF0YSAqLwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0lEX0NQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwoKICB9CiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgpJTlQKRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQp7CiAgSU5UIHBheWxvYWRCaXRzOwogIElOVCBiaXRQb3MgPSBGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpOwoKICBwYXlsb2FkQml0cyA9IEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKCiAgRkRLcHVzaEJhY2soJmNtb25EYXRhLT5zYnJCaXRidWYsIChGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpIC0gYml0UG9zKSApOwoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgp2b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKFNCUl9FTkNPREVSICAgKnNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIGVsZW1lbnRfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZlNlbmRIZWFkZXJzKQp7CiAgZW5jb2RlU2JySGVhZGVyRGF0YSAoJnNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickhlYWRlckRhdGEsIGhCcyk7CiAgICAKICBpZiAoZlNlbmRIZWFkZXJzID09IDApIHsKICAgIC8qIFByZXZlbnQgaGVhZGVyIGJlaW5nIGVtYmVkZGVkIGludG8gdGhlIFNCUiBwYXlsb2FkLiAqLwogICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gLTE7CiAgICBzYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsZW1lbnRfaW5kZXhdLT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZSA9IDA7CiAgICBzYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsZW1lbnRfaW5kZXhdLT5zYnJCaXRzdHJlYW1EYXRhLkNvdW50U2VuZEhlYWRlckRhdGEgPSAtMTsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickhlYWRlcgogICAgZGVzY3JpcHRpb246ICBlbmNvZGVzIFNCUiBIZWFkZXIgaW5mb3JtYXRpb24KICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJIZWFkZXIgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgICAgIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgICBjbW9uRGF0YSkKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CgogIGlmIChzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpIHsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDEsIDEpOwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyRGF0YSAoc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbW9uRGF0YS0+c2JyQml0YnVmKTsKICB9CiAgZWxzZSB7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKCZjbW9uRGF0YS0+c2JyQml0YnVmLCAwLCAxKTsKICB9CgogIGNtb25EYXRhLT5zYnJIZHJCaXRzID0gcGF5bG9hZEJpdHM7CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickhlYWRlckRhdGEKICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIHNicl9oZWFkZXIoKQogICAgICAgICAgICAgICAgICBic19wcm90b2NvbF92ZXJzaW9uIHRocm91Z2ggYnNfaGVhZGVyX2V4dHJhXzIKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCgp7CiAgSU5UIHBheWxvYWRCaXRzID0gMDsKICBpZiAoc2JySGVhZGVyRGF0YSAhPSBOVUxMKSB7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQU1QX1JFU19CSVRTKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NUQVJUX0ZSRVFfQklUUyk7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NUT1BfRlJFUV9CSVRTKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3hvdmVyX2JhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMpOwoKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1JFU0VSVkVEX0JJVFMpOwoKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTKTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMl9CSVRTKTsKCgogICAgaWYgKHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9GUkVRX1NDQUxFX0JJVFMpOwogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmFsdGVyU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0FMVEVSX1NDQUxFX0JJVFMpOwogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfTk9JU0VfQkFORFNfQklUUyk7CiAgICB9IC8qIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xICovCgogICAgaWYgKHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfQkFORFNfQklUUyk7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfZ2FpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyk7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2ludGVycG9sX2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVEVSUE9MX0ZSRVFfQklUUyk7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3Ntb290aGluZ19sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NNT09USElOR19MRU5HVEhfQklUUyk7CgogICAgfSAvKiBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMiAqLwogIH0gLyogc2JySGVhZGVyRGF0YSAhPSBOVUxMICovCgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JyRGF0YQogICAgZGVzY3JpcHRpb246ICBlbmNvZGVzIHNiciBEYXRhIGluZm9ybWF0aW9uCiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKZW5jb2RlU2JyRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGFMZWZ0LAogICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAogICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgIGNtb25EYXRhLAogICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9UWVBFICAgICAgc2JyRWxlbSwKICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nLAogICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwoKICBzd2l0Y2ggKHNickVsZW0pIHsKICBjYXNlIFNCUl9JRF9TQ0U6CiAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCAoc2JyRW52RGF0YUxlZnQsICZjbW9uRGF0YS0+c2JyQml0YnVmLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyU3ludGF4RmxhZ3MpOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfSURfQ1BFOgogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJFbnZEYXRhTGVmdCwgc2JyRW52RGF0YVJpZ2h0LCBoUGFyYW1ldHJpY1N0ZXJlbywgJmNtb25EYXRhLT5zYnJCaXRidWYsIGNvdXBsaW5nKTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKiB3ZSBuZXZlciBzaG91bGQgYXBwbHkgU0JSIHRvIGFueSBvdGhlciBlbGVtZW50IHR5cGUgKi8KICAgIEZES19BU1NFUlQgKDApOwogIH0KCiAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gcGF5bG9hZEJpdHM7CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKI2RlZmluZSBNT0RFX0ZSRVFfVEFOUyAgICAgICAgICAgICAgICAgICAgICAgICAgMQojZGVmaW5lIE1PREVfTk9fRlJFUV9UUkFOICAgICAgICAgICAgICAgICAgICAgICAwCiNkZWZpbmUgTERfVFJBTlNNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIE1PREVfRlJFUV9UQU5TCnN0YXRpYyBpbnQgZW5jb2RlRnJlcXMgKGludCBtb2RlKSB7CiAgICByZXR1cm4gKChtb2RlICYgTU9ERV9GUkVRX1RBTlMpID8gMSA6IDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudAogICAgZGVzY3JpcHRpb246ICBlbmNvZGVzIHNiciBTQ0UgaW5mb3JtYXRpb24KICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgIHNiclN5bnRheEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgaSwgcGF5bG9hZEJpdHMgPSAwOwoKICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDAsIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMpOyAvKiBubyByZXNlcnZlZCBiaXRzICovCgogIGlmIChzYnJFbnZEYXRhLT5sZEdyaWQpIHsKICAgICAgaWYgKCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkgKSB7CiAgICAgICAgLyogZW5jb2RlIG5vcm1hbCBTYnJHcmlkICovCiAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogdXNlIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwogICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGEsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOwogICAgICB9CiAgfQogIGVsc2UKICB7CiAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX1NDQUxBQkxFKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMSwgU0lfU0JSX0NPVVBMSU5HX0JJVFMpOwogICAgfQogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CiAgfQoKICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKCiAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+c2JyX2ludmZfbW9kZV92ZWNbaV0sIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgfQoKICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CiAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CgogIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YSxoQml0U3RyZWFtKTsKCiAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlRXh0ZW5kZWREYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBoQml0U3RyZWFtKTsKCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQKICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlcyBzYnIgQ1BFIGluZm9ybWF0aW9uCiAgICByZXR1cm5zOgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZykKewogIElOVCBwYXlsb2FkQml0cyA9IDA7CiAgSU5UIGkgPSAwOwoKICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDAsIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMpOyAvKiBubyByZXNlcnZlZCBiaXRzICovCgogIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgY291cGxpbmcsIFNJX1NCUl9DT1VQTElOR19CSVRTKTsKCiAgaWYgKGNvdXBsaW5nKSB7CiAgICBpZiAoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCkgewogICAgICAgICAgaWYgKCBzYnJFbnZEYXRhTGVmdC0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5ICkgewogICAgICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvKiBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KICAgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSk7CiAgICAgICAgICB9CiAgICB9IGVsc2UKICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CgogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOwogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YUxlZnQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhTGVmdC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgICB9CgogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMSk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMSk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwxKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwxKTsKCiAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFMZWZ0LGhCaXRTdHJlYW0pOwogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhUmlnaHQsaEJpdFN0cmVhbSk7CgogIH0gZWxzZSB7IC8qIG5vIGNvdXBsaW5nICovCiAgICBGREtfQVNTRVJUKHNickVudkRhdGFMZWZ0LT5sZEdyaWQgPT0gc2JyRW52RGF0YVJpZ2h0LT5sZEdyaWQpOwoKICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+bGRHcmlkIHx8IHNickVudkRhdGFSaWdodC0+bGRHcmlkKSB7CiAgICAvKiBzYnJFbnZEYXRhTGVmdCAobGVmdCBjaGFubmVsKSAqLwogICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKICAgICAgICAvKiBubyBGSVhGSVhvbmx5IEZyYW1lIHNvIHdlIGRvbnQgbmVlZCBlbmNvZGVMb3dEZWxheVNickdyaWQgKi8KICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwogICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSk7CgogICAgICB9IGVsc2UgewogICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOwogICAgICB9CgogICAgICAvKiBzYnJFbnZEYXRhUmlnaHQgKHJpZ2h0IGNoYW5uZWwpICovCiAgICAgIGlmICggc2JyRW52RGF0YVJpZ2h0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKICAgICAgICAvKiBubyBGSVhGSVhvbmx5IEZyYW1lIHNvIHdlIGRvbnQgbmVlZCBlbmNvZGVMb3dEZWxheVNickdyaWQgKi8KICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwogICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CgogICAgICB9IGVsc2UgewogICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKICAgICAgfQogICAgfSBlbHNlCiAgICB7CiAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtKTsKICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogICAgfQogICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtKTsKICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CgogICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGFMZWZ0LT5ub09mbm9pc2ViYW5kczsgaSsrKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YUxlZnQtPnNicl9pbnZmX21vZGVfdmVjW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YVJpZ2h0LT5ub09mbm9pc2ViYW5kczsgaSsrKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOwogICAgfQoKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhICAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtLDApOwogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMCk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMCk7CiAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMCk7CgogICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhTGVmdCxoQml0U3RyZWFtKTsKICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YVJpZ2h0LGhCaXRTdHJlYW0pOwoKICB9IC8qIGNvdXBsaW5nICovCgogIHBheWxvYWRCaXRzICs9IGVuY29kZUV4dGVuZGVkRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CgogIHJldHVybiBwYXlsb2FkQml0czsKfQoKc3RhdGljIElOVCBjZWlsX2xuMihJTlQgeCkKewogIElOVCB0bXA9LTE7CiAgd2hpbGUoKDE8PCsrdG1wKSA8IHgpOwogIHJldHVybih0bXApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJHcmlkCiAgICBkZXNjcmlwdGlvbjogIGlmIGhCaXRTdHJlYW0gIT0gTlVMTCB3cml0ZXMgYml0cyB0aGF0IGRlc2NyaWJlcyB0aGUKICAgICAgICAgICAgICAgICAgdGltZS9mcmVxdWVuY3kgZ3JvdXBpbmcgb2YgYSBmcmFtZTsgZWxzZSBjb3VudHMgdGhlbSBvbmx5CiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4gb3IgY291bnRlZAogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAplbmNvZGVTYnJHcmlkIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogIElOVCBpLCB0ZW1wOwogIElOVCBidWZmZXJGcmFtZVN0YXJ0ID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnVmZmVyRnJhbWVTdGFydDsKICBJTlQgbnVtYmVyVGltZVNsb3RzICA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm51bWJlclRpbWVTbG90czsKCiAgaWYgKHNickVudkRhdGEtPmxkR3JpZCkKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NMQV9CSVRTX0xEKTsKICBlbHNlCiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9DTEFfQklUUyk7CgogIHN3aXRjaCAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcykgewogIGNhc2UgRklYRklYb25seToKICAgIEZES19BU1NFUlQoMCAvKiBGYXRhbCBlcnJvciBpbiBlbmNvZGVTYnJHcmlkISAqLyk7CiAgICBicmVhazsKICBjYXNlIEZJWEZJWDoKICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52KTsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0VOVl9CSVRTKTsKICAgIGlmICgoc2JyRW52RGF0YS0+bGRHcmlkKSAmJiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2Vudj09MSkpCiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5jdXJyZW50QW1wUmVzRkYsIFNJX1NCUl9BTVBfUkVTX0JJVFMpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbMF0sIFNCUl9SRVNfQklUUyk7CgogICAgYnJlYWs7CgogIGNhc2UgRklYVkFSOgogIGNhc2UgVkFSRklYOgogICAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYVkFSKQogICAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQgLSAoYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cyk7CiAgICBlbHNlCiAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CgogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uLCBTQlJfTlVNX0JJVFMpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uOyBpKyspIHsKICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZFtpXSAtIDIpID4+IDE7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKICAgIH0KCiAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+biArIDIpOwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5wLCB0ZW1wKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+biArIDE7IGkrKykgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgVkFSVkFSOgogICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkXzAgLSBidWZmZXJGcmFtZVN0YXJ0OwogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOwogICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkXzEgLSAoYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cyk7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CgogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAsIFNCUl9OVU1fQklUUyk7CiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSwgU0JSX05VTV9CSVRTKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wOyBpKyspIHsKICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZF8wW2ldIC0gMikgPj4gMTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzE7IGkrKykgewogICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkXzFbaV0gLSAyKSA+PiAxOwogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7CiAgICB9CgogICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xICsgMik7CiAgICBwYXlsb2FkQml0cyArPSAgRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5wLCB0ZW1wKTsKCiAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEgKyAxOwoKICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wOyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZMUltpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwogICAgfQogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCiNkZWZpbmUgU0JSX0NMQV9CSVRTX0xEIDEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVMb3dEZWxheVNickdyaWQKICAgIGRlc2NyaXB0aW9uOiAgaWYgaEJpdFN0cmVhbSAhPSBOVUxMIHdyaXRlcyBiaXRzIHRoYXQgZGVzY3JpYmVzIHRoZQogICAgICAgICAgICAgICAgICB0aW1lL2ZyZXF1ZW5jeSBncm91cGluZyBvZiBhIGZyYW1lOwogICAgICAgICAgICAgICAgICBlbHNlIGNvdW50cyB0aGVtIG9ubHkKICAgICAgICAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gb25seSB3cml0ZSB0aGUgRklYRklYb25seSBCaXRzdHJlYW0gZGF0YSkKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBvciBjb3VudGVkCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CmVuY29kZUxvd0RlbGF5U2JyR3JpZCAoICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zbWl0RnJlcXMKICAgICAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgcGF5bG9hZEJpdHMgPSAwOwogIGludCBpOwoKICAvKiB3cml0ZSBGSVhGSVhvbmx5IEdyaWQgKi8KICAvKiB3cml0ZSBmcmFtZUNsYXNzIFsxIGJpdF0gZm9yIEZJWEZJWG9ubHkgR3JpZCAqLwogIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAxLCBTQlJfQ0xBX0JJVFNfTEQpOwoKICAvKiBhYnNvbHV0ZSBCb3JkZXJzIGFyZSBmaXg6IDAsWCxYLFgsblRpbWVTbG90czsgc28gd2UgZG9udCBoYXZlIHRvIHRyYW5zbWl0IHRoZW0gKi8KICAvKiBvbmx5IHRyYW5zbWl0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24hICovCiAgLyogd2l0aCB0aGlzIGluZm8gKGIxKSB3ZSBjYW4gcmVjb25zdHJ1Y3QgdGhlIEZyYW1lIG9uIERlY29kZXIgc2lkZSA6ICovCiAgLyogYm9yZGVyWzBdID0gMDsgYm9yZGVyWzFdID0gYjE7IGJvcmRlclsyXT1iMSsyOyBib3JkZXJbM10gPSBuclRpbWVTbG90cyAqLwoKICAvKiB1c2UgMyBvciA0Yml0cyBmb3IgdHJhbnNpZW50IGJvcmRlciAoYm9yZGVyKSAqLwogIGlmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5udW1iZXJUaW1lU2xvdHMgPT0gOCkKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkLCAzKTsKICBlbHNlCiAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKCBoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgNCk7CgogIGlmICh0cmFuc21pdEZyZXFzKSB7CiAgICAvKiB3cml0ZSBGcmVxUmVzIGdyaWQgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52OyBpKyspIHsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbaV0sIFNCUl9SRVNfQklUUyk7CiAgICB9CiAgfQoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JyRHRkZgogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyB0aGF0IGRlc2NyaWJlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBlbnZlbG9wZXMgb2YgYSBmcmFtZQogICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgICBpbnB1dDoKICAgIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmVuY29kZVNickR0ZGYgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKewogIElOVCBpLCBwYXlsb2FkQml0cyA9IDAsIG5vT2ZOb2lzZUVudmVsb3BlczsKCiAgbm9PZk5vaXNlRW52ZWxvcGVzID0gc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlcyA+IDEgPyAyIDogMTsKCiAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXM7ICsraSkgewogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2ldLCBTQlJfRElSX0JJVFMpOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgbm9PZk5vaXNlRW52ZWxvcGVzOyArK2kpIHsKICAgIHBheWxvYWRCaXRzICs9ICBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0sIFNCUl9ESVJfQklUUyk7CiAgfQoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IHdyaXRlTm9pc2VMZXZlbERhdGEKICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgbm9pc2UtZmxvb3ItbGV2ZWwKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAp3cml0ZU5vaXNlTGV2ZWxEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZykKewogIElOVCBqLCBpLCBwYXlsb2FkQml0cyA9IDA7CiAgSU5UIG5Ob2lzZUVudmVsb3BlcyA9IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXMgPiAxID8gMiA6IDE7CgogIGZvciAoaSA9IDA7IGkgPCBuTm9pc2VFbnZlbG9wZXM7IGkrKykgewogICAgc3dpdGNoIChzYnJFbnZEYXRhLT5kb21haW5fdmVjX25vaXNlW2ldKSB7CiAgICBjYXNlIEZSRVE6CiAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CiAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHMpOwogICAgICB9CgogICAgICBmb3IgKGogPSAxICsgaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgewogICAgICAgIGlmIChjb3VwbGluZykgewogICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8qICFjb3VwbGluZyAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgVElNRToKICAgICAgZm9yIChqID0gaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgewogICAgICAgIGlmIChjb3VwbGluZykgewogICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8qICFjb3VwbGluZyAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBwYXlsb2FkQml0czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogd3JpdGVFbnZlbG9wZURhdGEKICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgZW52ZWxvcGUKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAp3cml0ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpCnsKICBJTlQgcGF5bG9hZEJpdHMgPSAwLCBqLCBpLCBkZWx0YTsKCiAgZm9yIChqID0gMDsgaiA8IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXM7IGorKykgeyAvKiBsb29wIG92ZXIgYWxsIGVudmVsb3BlcyAqLwogICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0gPT0gRlJFUSkgewogICAgICBpZiAoY291cGxpbmcgJiYgc2JyRW52RGF0YS0+YmFsYW5jZSkgewogICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdWzBdLCBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0cyk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAxIC0gc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXTsgaSA8IHNickVudkRhdGEtPm5vU2NmQmFuZHNbal07IGkrKykgewogICAgICBkZWx0YSA9IHNickVudkRhdGEtPmllbnZlbG9wZVtqXVtpXTsKICAgICAgaWYgKGNvdXBsaW5nICYmIHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICBGREtfQVNTRVJUIChmaXhwX2FicyAoZGVsdGEpIDw9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgRkRLX0FTU0VSVCAoZml4cF9hYnMgKGRlbHRhKSA8PSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdik7CiAgICAgIH0KICAgICAgaWYgKGNvdXBsaW5nKSB7CiAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdKSB7CiAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgJiYgVElNRSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgJiYgRlJFUSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgVElNRSAqLwogICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICYmIEZSRVEgKi8KICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdKSB7CiAgICAgICAgICAvKiAhY291cGxpbmcgJiYgVElNRSAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvKiAhY291cGxpbmcgJiYgRlJFUSAqLwogICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGVuY29kZUV4dGVuZGVkRGF0YQogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlbmRlZCBkYXRhCiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQgZW5jb2RlRXh0ZW5kZWREYXRhIChIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKewogIElOVCBleHREYXRhU2l6ZTsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwoKICBleHREYXRhU2l6ZSA9IGdldFNickV4dGVuZGVkRGF0YVNpemUoaFBhcmFtZXRyaWNTdGVyZW8pOwoKCiAgaWYgKGV4dERhdGFTaXplICE9IDApIHsKICAgIElOVCBtYXhFeHRTaXplID0gKDE8PFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKSAtIDE7CiAgICBJTlQgd3JpdHRlbk5vQml0cyA9IDA7IC8qIG5lZWRlZCB0byBieXRlIGFsaWduIHRoZSBleHRlbmRlZCBkYXRhICovCgogICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAxLCBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTKTsKICAgIEZES19BU1NFUlQoZXh0RGF0YVNpemUgPD0gU0JSX0VYVEVOREVEX0RBVEFfTUFYX0NOVCk7CgogICAgaWYgKGV4dERhdGFTaXplIDwgbWF4RXh0U2l6ZSkgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGV4dERhdGFTaXplLCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyk7CiAgICB9IGVsc2UgewogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIG1heEV4dFNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBleHREYXRhU2l6ZSAtIG1heEV4dFNpemUsIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMpOwogICAgfQoKICAgIC8qIHBhcmFtZXRyaWMgY29kaW5nIHNpZ25hbGxlZCBoZXJlPyAqLwogICAgaWYoaFBhcmFtZXRyaWNTdGVyZW8pewogICAgICB3cml0dGVuTm9CaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgRVhURU5TSU9OX0lEX1BTX0NPRElORywgU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTKTsKICAgICAgd3JpdHRlbk5vQml0cyArPSBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIGhCaXRTdHJlYW0pOwogICAgfQoKICAgIHBheWxvYWRCaXRzICs9IHdyaXR0ZW5Ob0JpdHM7CgogICAgLyogYnl0ZSBhbGlnbm1lbnQgKi8KICAgIHdyaXR0ZW5Ob0JpdHMgPSB3cml0dGVuTm9CaXRzJTg7CiAgICBpZih3cml0dGVuTm9CaXRzKQogICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgKDggLSB3cml0dGVuTm9CaXRzKSk7CiAgfSBlbHNlIHsKICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CiAgfQoKICByZXR1cm4gcGF5bG9hZEJpdHM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YQogICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSAic3ludGhldGljLWNvZGluZyItZXh0ZW5zaW9uCiAgICByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAgIGlucHV0OgogICAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQgd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICBzYnJFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKCnsKICBJTlQgaTsKICBJTlQgcGF5bG9hZEJpdHMgPSAwOwoKICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmFkZEhhcm1vbmljRmxhZywgMSk7CgogIGlmIChzYnJFbnZEYXRhLT5hZGRIYXJtb25pY0ZsYWcpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5ub0hhcm1vbmljczsgaSsrKSB7CiAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNbaV0sIDEpOwogICAgfQogIH0KCiAgcmV0dXJuIHBheWxvYWRCaXRzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGdldFNickV4dGVuZGVkRGF0YVNpemUKICAgIGRlc2NyaXB0aW9uOiAgY291bnRzIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIGVuY29kaW5nIHRoZQogICAgICAgICAgICAgICAgICBleHRlbmRlZCBkYXRhIChpbmNsdWRpbmcgZXh0ZW5zaW9uIGlkKQoKICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgZXh0ZW5kZWQgZGF0YQogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVApnZXRTYnJFeHRlbmRlZERhdGFTaXplIChIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvKQp7CiAgSU5UIGV4dERhdGFCaXRzID0gMDsKCiAgLyogYWRkIHlvdXIgbmV3IGV4dGVuZGVkIGRhdGEgY291bnRpbmcgbWV0aG9kcyBoZXJlICovCgogIC8qCiAgICBubyBleHRlbmRlZCBkYXRhCiAgKi8KCiAgaWYoaFBhcmFtZXRyaWNTdGVyZW8pewogICAgLyogUFMgZXh0ZW5kZWQgZGF0YSAqLwogICAgZXh0RGF0YUJpdHMgKz0gU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTOwogICAgZXh0RGF0YUJpdHMgKz0gRkRLc2JyRW5jX1BTRW5jX1dyaXRlUFNEYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBOVUxMKTsKICB9CgogIHJldHVybiAoZXh0RGF0YUJpdHMrNykgPj4gMzsKfQoKCgoKCg==