Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgZnJlcXVlbmN5IHNjYWxlICAKICBcYXV0aG9yIFRvYmlhcyBDaGFsdXBrYQoqLwoKI2luY2x1ZGUgInNicmVuY19mcmVxX3NjYS5oIgojaW5jbHVkZSAic2JyX21pc2MuaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKLyogIFN0YXJ0RnJlcSAqLwpzdGF0aWMgSU5UIGdldFN0YXJ0RnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RhcnRfZnJlcSk7CgovKiBTdG9wRnJlcSAqLwpzdGF0aWMgSU5UIGdldFN0b3BGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdG9wX2ZyZXEpOwoKc3RhdGljIElOVCAgbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKTsKc3RhdGljIHZvaWQgQ2FsY0JhbmRzKElOVCAqIGRpZmYsIElOVCBzdGFydCAsIElOVCBzdG9wICwgSU5UIG51bV9iYW5kcyk7CnN0YXRpYyBJTlQgIG1vZGlmeUJhbmRzKElOVCBtYXhfYmFuZCwgSU5UICogZGlmZiwgSU5UIGxlbmd0aCk7CnN0YXRpYyB2b2lkIGN1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCogZGlmZiwgSU5UIGxlbmd0aCwgVUNIQVIgICpzdGFydF9hZHJlc3MpOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOgoKIFJldHVybjoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpJTlQKRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoSU5UIHN0YXJ0RnJlcSwgSU5UIGZzQ29yZSkKewogIElOVCByZXN1bHQ7CgogIGlmICggc3RhcnRGcmVxIDwgMCB8fCBzdGFydEZyZXEgPiAxNSkgewogICAgcmV0dXJuIC0xOwogIH0KICAvKiBVcGRhdGUgc3RhcnRGcmVxIHN0cnVjdCAqLwogIHJlc3VsdCA9IGdldFN0YXJ0RnJlcShmc0NvcmUsIHN0YXJ0RnJlcSk7CgogIHJlc3VsdCA9IChyZXN1bHQqKGZzQ29yZT4+NSkrMSk+PjE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCgogIHJldHVybiAocmVzdWx0KTsKCn0gLyogRW5kIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgZ2V0U2JyU3RvcEZyZXEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czoKCiBSZXR1cm46CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJTlQgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXICAoSU5UIHN0b3BGcmVxLCBJTlQgZnNDb3JlKQp7CiAgSU5UIHJlc3VsdDsKCiAgaWYgKCBzdG9wRnJlcSA8IDAgfHwgc3RvcEZyZXEgPiAxMykKICAgIHJldHVybiAtMTsKCiAgLyogVXBwZGF0ZSBzdG9wRnJlcSBzdHJ1Y3QgKi8KICByZXN1bHQgPSBnZXRTdG9wRnJlcShmc0NvcmUsIHN0b3BGcmVxKTsKICByZXN1bHQgPSAocmVzdWx0Kihmc0NvcmU+PjUpKzEpPj4xOyAvKiAocmVzdWx0KmZzU0JSL1FNRmJhbmRzKzEpPj4xOyAqLwoKICByZXR1cm4gKHJlc3VsdCk7Cn0gLyogRW5kIGdldFNiclN0b3BGcmVxICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGdldFN0YXJ0RnJlcQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgZnNDb3JlIC0gY29yZSBzYW1wbGluZyByYXRlCgoKIFJldHVybjoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKZ2V0U3RhcnRGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdGFydF9mcmVxKQp7CiAgSU5UIGswX21pbjsKCiAgc3dpdGNoKGZzQ29yZSl7CiAgY2FzZSAgODAwMDogazBfbWluID0gMjQ7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAxMTAyNTogazBfbWluID0gMTc7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAxMjAwMDogazBfbWluID0gMTY7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAxNjAwMDogazBfbWluID0gMTY7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAyMjA1MDogazBfbWluID0gMTI7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAyNDAwMDogazBfbWluID0gMTE7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSAzMjAwMDogazBfbWluID0gMTA7IC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSA0NDEwMDogazBfbWluID0gNzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSA0ODAwMDogazBfbWluID0gNzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgY2FzZSA5NjAwMDogazBfbWluID0gMzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIGswX21pbj0xMTsgLyogaWxsZWdhbCBmcyAqLwogIH0KCgogIHN3aXRjaCAoZnNDb3JlKSB7CgogIGNhc2UgIDgwMDA6CiAgICB7CiAgICAgIElOVCB2X29mZnNldFtdPSB7LTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICB9CiAgY2FzZSAxMTAyNToKICAgIHsKICAgICAgSU5UIHZfb2Zmc2V0W109IHstNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxM307CiAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgfQogIGNhc2UgMTIwMDA6CiAgICB7CiAgICAgIElOVCB2X29mZnNldFtdPSB7LTUsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OwogICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgIH0KICBjYXNlIDE2MDAwOgogICAgewogICAgICBJTlQgdl9vZmZzZXRbXT0gey02LCAtNCwgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2fTsKICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICB9CiAgY2FzZSAyMjA1MDoKICBjYXNlIDI0MDAwOgogIGNhc2UgMzIwMDA6CiAgICB7CiAgICAgIElOVCB2X29mZnNldFtdPSB7LTQsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjB9OwogICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgIH0KICBjYXNlIDQ0MTAwOgogIGNhc2UgNDgwMDA6CiAgY2FzZSA5NjAwMDoKICAgIHsKICAgICAgSU5UIHZfb2Zmc2V0W109IHstMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTYsIDIwLCAyNH07CiAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgfQogIGRlZmF1bHQ6CiAgICB7CiAgICAgIElOVCB2X29mZnNldFtdPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjAsIDI0LCAyOCwgMzN9OwogICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgIH0KICB9Cn0gLyogRW5kIGdldFN0YXJ0RnJlcSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBnZXRTdG9wRnJlcQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOgoKIFJldHVybjoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgSU5UCmdldFN0b3BGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdG9wX2ZyZXEpCnsKICBJTlQgcmVzdWx0LGk7CiAgSU5UIGsxX21pbjsKICBJTlQgdl9kc3RvcFsxM107CgogIElOVCAqdl9zdG9wX2ZyZXEgPSBOVUxMOwogIElOVCB2X3N0b3BfZnJlcV8xNlsxNF0gPSB7NDgsNDksNTAsNTEsNTIsNTQsNTUsNTYsNTcsNTksNjAsNjEsNjMsNjR9OwogIElOVCB2X3N0b3BfZnJlcV8yMlsxNF0gPSB7MzUsMzcsMzgsNDAsNDIsNDQsNDYsNDgsNTEsNTMsNTYsNTgsNjEsNjR9OwogIElOVCB2X3N0b3BfZnJlcV8yNFsxNF0gPSB7MzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYsNDksNTIsNTUsNTgsNjEsNjR9OwogIElOVCB2X3N0b3BfZnJlcV8zMlsxNF0gPSB7MzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYsNDksNTIsNTUsNTgsNjEsNjR9OwogIElOVCB2X3N0b3BfZnJlcV80NFsxNF0gPSB7MjMsMjUsMjcsMjksMzIsMzQsMzcsNDAsNDMsNDcsNTEsNTUsNTksNjR9OwogIElOVCB2X3N0b3BfZnJlcV80OFsxNF0gPSB7MjEsMjMsMjUsMjcsMzAsMzIsMzUsMzgsNDIsNDUsNDksNTQsNTksNjR9OwogIElOVCB2X3N0b3BfZnJlcV82NFsxNF0gPSB7MjAsMjIsMjQsMjYsMjksMzEsMzQsMzcsNDEsNDUsNDksNTQsNTksNjR9OwogIElOVCB2X3N0b3BfZnJlcV84OFsxNF0gPSB7MTUsMTcsMTksMjEsMjMsMjYsMjksMzMsMzcsNDEsNDYsNTEsNTcsNjR9OwogIElOVCB2X3N0b3BfZnJlcV85NlsxNF0gPSB7MTMsMTUsMTcsMTksMjEsMjQsMjcsMzEsMzUsMzksNDQsNTAsNTcsNjR9OwogIElOVCB2X3N0b3BfZnJlcV8xOTJbMTRdID0gezcsIDgsMTAsMTIsMTQsMTYsMTksMjMsMjcsMzIsMzgsNDYsNTQsNjR9OwoKICBzd2l0Y2goZnNDb3JlKXsKICBjYXNlICA4MDAwOiBrMV9taW4gPSA0ODsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfMTY7CiAgICBicmVhazsKICBjYXNlIDExMDI1OiBrMV9taW4gPSAzNTsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfMjI7CiAgICBicmVhazsKICBjYXNlIDEyMDAwOiBrMV9taW4gPSAzMjsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfMjQ7CiAgICBicmVhazsKICBjYXNlIDE2MDAwOiBrMV9taW4gPSAzMjsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfMzI7CiAgICBicmVhazsKICBjYXNlIDIyMDUwOiBrMV9taW4gPSAyMzsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfNDQ7CiAgICBicmVhazsKICBjYXNlIDI0MDAwOiBrMV9taW4gPSAyMTsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfNDg7CiAgICBicmVhazsKICBjYXNlIDMyMDAwOiBrMV9taW4gPSAyMDsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfNjQ7CiAgICBicmVhazsKICBjYXNlIDQ0MTAwOiBrMV9taW4gPSAxNTsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfODg7CiAgICBicmVhazsKICBjYXNlIDQ4MDAwOiBrMV9taW4gPSAxMzsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfOTY7CiAgICBicmVhazsKICBjYXNlIDk2MDAwOiBrMV9taW4gPSAgNzsKICAgICAgICAgICAgICB2X3N0b3BfZnJlcSA9dl9zdG9wX2ZyZXFfMTkyOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIGsxX21pbiA9IDIxOyAvKiBpbGxlZ2FsIGZzICAqLwogIH0KCiAgLyogaWYgbm8gdmFsaWQgY29yZSBzYW1wbGluZ3JhdGUgaXMgdXNlZCB0aGlzIGxvb3AgcHJvZHVjZXMKICAgICBhIHNlZ2ZhdWx0LCBiZWNhdXNlIHZfc3RvcF9mcmVxIGlzIG5vdCBpbml0aWFsaXplZCAqLwogIC8qIEVuc3VyZSBpbmNyZWFzaW5nIGJhbmR3aWR0aCAqLwogIGZvcihpID0gMDsgaSA8PSAxMjsgaSsrKSB7CiAgICB2X2RzdG9wW2ldID0gdl9zdG9wX2ZyZXFbaSsxXSAtIHZfc3RvcF9mcmVxW2ldOwogIH0KCiAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQodl9kc3RvcCwgMTMpOyAvKiBTb3J0IGJhbmR3aWR0aCBjaGFuZ2VzICovCgogIHJlc3VsdCA9IGsxX21pbjsKICBmb3IoaSA9IDA7IGkgPCBzdG9wX2ZyZXE7IGkrKykgewogICAgcmVzdWx0ID0gcmVzdWx0ICsgdl9kc3RvcFtpXTsKICB9CgogIHJldHVybihyZXN1bHQpOwoKfS8qIEVuZCBnZXRTdG9wRnJlcSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogICAgIHNyU2JyICAgICAgICAgICAgU0JSIHNhbXBsaW5nIGZyZXFlbmN5CiAgICAgICAgICAgICAgICBzckNvcmUgICAgICAgICAgIEFBQyBjb3JlIHNhbXBsaW5nIGZyZXFlbmN5CiAgICAgICAgICAgICAgICBub0NoYW5uZWxzICAgICAgIE51bWJlciBvZiBRTUYgY2hhbm5lbHMKICAgICAgICAgICAgICAgIHN0YXJ0RnJlcSAgICAgICAgU0JSIHN0YXJ0IGZyZXF1ZW5jeSBpbiBRTUYgYmFuZHMKICAgICAgICAgICAgICAgIHN0b3BGcmVxICAgICAgICAgU0JSIHN0YXJ0IGZyZXF1ZW5jeSBpbiBRTUYgYmFuZHMKCiAgICAgICAgICAgICAgICprMCAgICAgICAgICAgICAgIE91dHB1dCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgKmsyICAgICAgICAgICAgICAgT3V0cHV0IHBhcmFtZXRlcgoKIFJldHVybjogICAgICAgRXJyb3IgY29kZSAoMCBpcyBPSykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQoCiAgICAgICAgY29uc3QgSU5UIHNyU2JyLAogICAgICAgIGNvbnN0IElOVCBzckNvcmUsCiAgICAgICAgY29uc3QgSU5UIG5vQ2hhbm5lbHMsCiAgICAgICAgY29uc3QgSU5UIHN0YXJ0RnJlcSwKICAgICAgICBjb25zdCBJTlQgc3RvcEZyZXEsCiAgICAgICAgSU5UICprMCwKICAgICAgICBJTlQgKmsyCiAgICAgICAgKQp7CgogIC8qIFVwZGF0ZSBzdGFydEZyZXEgc3RydWN0ICovCiAgKmswID0gZ2V0U3RhcnRGcmVxKHNyQ29yZSwgc3RhcnRGcmVxKTsKCiAgLyogVGVzdCBpZiBzdGFydCBmcmVxIGlzIG91dHNpZGUgY29yZWNvZGVyIHJhbmdlICovCiAgaWYoIHNyU2JyKm5vQ2hhbm5lbHMgPCAqazAgKiBzckNvcmUgKSB7CiAgICByZXR1cm4gKDEpOyAvKiByYWlzZSB0aGUgY3Jvc3Mtb3ZlciBmcmVxdWVuY3kgYW5kL29yIGxvd2VyIHRoZSBudW1iZXIKICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5KSAqLwogIH0KCiAgLypVcGRhdGUgc3RvcEZyZXEgc3RydWN0ICovCiAgaWYgKCBzdG9wRnJlcSA8IDE0ICkgewogICAgKmsyID0gZ2V0U3RvcEZyZXEoc3JDb3JlLCBzdG9wRnJlcSk7CiAgfSBlbHNlIGlmKCBzdG9wRnJlcSA9PSAxNCApIHsKICAgICprMiA9IDIgKiAqazA7CiAgfSBlbHNlIHsKICAgICprMiA9IDMgKiAqazA7CiAgfQoKICAvKiBsaW1pdCB0byBOeXF2aXN0ICovCiAgaWYgKCprMiA+IG5vQ2hhbm5lbHMpIHsKICAgICprMiA9IG5vQ2hhbm5lbHM7CiAgfQoKCgogIC8qIFRlc3QgZm9yIGludmFsaWQgIGswIGsyIGNvbWJpbmF0aW9ucyAqLwogIGlmICggKHNyQ29yZSA9PSAyMjA1MCkgJiYgKCAoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICkgKQogICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvciBmcz00NC4xa0h6ICovCgogIGlmICggKHNyQ29yZSA+PSAyNDAwMCkgJiYgKCAoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICkgKQogICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvciBmcz49NDhrSHogKi8KCiAgaWYgKCgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTKQogICAgcmV0dXJuICgxKTsvKk51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyAqLwoKICBpZiAoKCprMiAtICprMCkgPCAwKQogICAgcmV0dXJuICgxKTsvKiBOdW1iZXIgb2YgYmFuZHMgaXMgbmVnYXRpdmUgKi8KCgogIHJldHVybigwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czoKCiBSZXR1cm46CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJTlQKRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSgKICAgICAgICBVQ0hBUiAgICAgKnZfa19tYXN0ZXIsCiAgICAgICAgSU5UICAgICAgICpoX251bV9iYW5kcywKICAgICAgICBjb25zdCBJTlQgIGswLAogICAgICAgIGNvbnN0IElOVCAgazIsCiAgICAgICAgY29uc3QgSU5UICBmcmVxU2NhbGUsCiAgICAgICAgY29uc3QgSU5UICBhbHRlclNjYWxlCiAgICAgICAgKQoKewoKICBJTlQgICAgIGJfcF9vID0gMDsgICAgICAgIC8qIGJhbmRzX3Blcl9vY3RhdmUgKi8KICBGSVhQX0RCTCB3YXJwID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgSU5UICAgICBkayA9IDA7CgogIC8qIEludGVybmFsIHZhcmlhYmxlcyAqLwogIElOVCAgICAgazEgPSAwLCBpOwogIElOVCAgICAgbnVtX2JhbmRzMDsKICBJTlQgICAgIG51bV9iYW5kczE7CiAgSU5UICAgICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOwogIElOVCAgICAgKmRpZmYwID0gZGlmZl90b3Q7CiAgSU5UICAgICAqZGlmZjEgPSBkaWZmX3RvdCtNQVhfT0NUQVZFOwogIElOVCAgICAgazJfYWNoaXZlZDsKICBJTlQgICAgIGsyX2RpZmY7CiAgSU5UICAgICBpbmNyID0gMDsKCiAgLyogSW5pdCAqLwogIGlmIChmcmVxU2NhbGU9PTEpICBiX3BfbyA9IDEyOwogIGlmIChmcmVxU2NhbGU9PTIpICBiX3BfbyA9IDEwOwogIGlmIChmcmVxU2NhbGU9PTMpICBiX3BfbyA9IDg7CgoKICBpZihmcmVxU2NhbGUgPiAwKSAvKkJhcmsqLwogICAgewogICAgICBpZihhbHRlclNjYWxlPT0wKQogICAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgICAgICAgIC8qIDEuMC8oMS4wKjIuMCkgKi8KICAgICAgZWxzZQogICAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgxLjBmLzIuNmYpOyAgIC8qIDEuMC8oMS4zKjIuMCk7ICovCgoKICAgICAgaWYoNCprMiA+PSA5KmswKSAgLyp0d28gb3IgbW9yZSByZWdpb25zIChob3cgbWFueSB0aW1lcyB0aGUgYmFzaXMgYmFuZCBpcyBjb3BpZWQpKi8KICAgICAgICB7CiAgICAgICAgICBrMT0yKmswOwoKICAgICAgICAgIG51bV9iYW5kczA9bnVtYmVyT2ZCYW5kcyhiX3BfbywgazAsIGsxLCBGTDJGWENPTlNUX0RCTCgwLjVmKSk7CiAgICAgICAgICBudW1fYmFuZHMxPW51bWJlck9mQmFuZHMoYl9wX28sIGsxLCBrMiwgd2FycCk7CgogICAgICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOy8qQ2FsY0JhbmRzMSA9PiBkaWZmMCAqLwogICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYwLCBudW1fYmFuZHMwKTsvKlNvcnRCYW5kcyBzb3J0IGRpZmYwICovCgogICAgICAgICAgaWYgKGRpZmYwWzBdID09IDApIC8qIHRvbyB3aWRlIEZCIGJhbmRzIGZvciB0YXJnZXQgdHVuaW5nICovCiAgICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAoMSk7LyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KICAgICAgICAgIH0KCiAgICAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsgLyogY3Vtc3VtICovCgogICAgICAgICAgQ2FsY0JhbmRzKGRpZmYxLCBrMSwgazIsIG51bV9iYW5kczEpOyAgICAgLyogQ2FsY0JhbmRzMiA9PiBkaWZmMSAqLwogICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYxLCBudW1fYmFuZHMxKTsgICAgICAgICAgICAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMSAqLwogICAgICAgICAgaWYoZGlmZjBbbnVtX2JhbmRzMC0xXSA+IGRpZmYxWzBdKSAgICAgICAgLyogbWF4KDEpID4gbWluKDIpICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZihtb2RpZnlCYW5kcyhkaWZmMFtudW1fYmFuZHMwLTFdLGRpZmYxLCBudW1fYmFuZHMxKSkKICAgICAgICAgICAgICAgIHJldHVybigxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIC8qIEFkZCAyJ25kIHJlZ2lvbiAqLwogICAgICAgICAgY3VtU3VtKGsxLCBkaWZmMSwgbnVtX2JhbmRzMSwgJnZfa19tYXN0ZXJbbnVtX2JhbmRzMF0pOwogICAgICAgICAgKmhfbnVtX2JhbmRzPW51bV9iYW5kczArbnVtX2JhbmRzMTsgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwoKICAgICAgICB9CiAgICAgIGVsc2UgLyogb25lIHJlZ2lvbiAqLwogICAgICAgIHsKICAgICAgICAgIGsxPWsyOwoKICAgICAgICAgIG51bV9iYW5kczA9bnVtYmVyT2ZCYW5kcyhiX3BfbywgazAsIGsxLCBGTDJGWENPTlNUX0RCTCgwLjVmKSk7CiAgICAgICAgICBDYWxjQmFuZHMoZGlmZjAsIGswLCBrMSwgbnVtX2JhbmRzMCk7LyogQ2FsY0JhbmRzMSA9PiBkaWZmMCAqLwogICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYwLCBudW1fYmFuZHMwKTsgICAgICAgLyogU29ydEJhbmRzIHNvcnQgZGlmZjAgKi8KCiAgICAgICAgICBpZiAoZGlmZjBbMF0gPT0gMCkgLyogdG9vIHdpZGUgRkIgYmFuZHMgZm9yIHRhcmdldCB0dW5pbmcgKi8KICAgICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICgxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCiAgICAgICAgICB9CgogICAgICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7LyogY3Vtc3VtICovCiAgICAgICAgICAqaF9udW1fYmFuZHM9bnVtX2JhbmRzMDsgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwoKICAgICAgICB9CiAgICB9CiAgZWxzZSAvKiBMaW5lYXIgbW9kZSAqLwogICAgewogICAgICBpZiAoYWx0ZXJTY2FsZT09MCkgewogICAgICAgIGRrID0gMTsKICAgICAgICBudW1fYmFuZHMwID0gMiAqICgoazIgLSBrMCkvMik7ICAgICAgICAgLyogRkxPT1IgdG8gZ2V0IHRvIGZldyBudW1iZXIgb2YgYmFuZHMqLwogICAgICB9IGVsc2UgewogICAgICAgIGRrID0gMjsKICAgICAgICBudW1fYmFuZHMwID0gMiAqICgoKGsyIC0gazApL2RrICsxKS8yKTsgLyogUk9VTkQgdG8gZ2V0IGNsb3Nlc3QgZml0ICovCiAgICAgIH0KCiAgICAgIGsyX2FjaGl2ZWQgPSBrMCArIG51bV9iYW5kczAqZGs7CiAgICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7CgogICAgICBmb3IoaT0wO2k8bnVtX2JhbmRzMDtpKyspCiAgICAgICAgZGlmZl90b3RbaV0gPSBkazsKCiAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLwogICAgICAvKiBhbmQgd2UgZ290IHdpZGUgU0JSIGFyZSAqLwogICAgICBpZiAoazJfZGlmZiA8IDApIHsKICAgICAgICAgIGluY3IgPSAxOwogICAgICAgICAgaSA9IDA7CiAgICAgIH0KCiAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLwogICAgICAvKiBhbmQgd2UgZ290IHNtYWxsIFNCUiBhcmUgKi8KICAgICAgaWYgKGsyX2RpZmYgPiAwKSB7CiAgICAgICAgICBpbmNyID0gLTE7CiAgICAgICAgICBpID0gbnVtX2JhbmRzMC0xOwogICAgICB9CgogICAgICAvKiBBZGp1c3QgZGlmZiB2ZWN0b3IgdG8gZ2V0IHNlcGMuIFNCUiByYW5nZSAqLwogICAgICB3aGlsZSAoazJfZGlmZiAhPSAwKSB7CiAgICAgICAgZGlmZl90b3RbaV0gPSBkaWZmX3RvdFtpXSAtIGluY3I7CiAgICAgICAgaSA9IGkgKyBpbmNyOwogICAgICAgIGsyX2RpZmYgPSBrMl9kaWZmICsgaW5jcjsKICAgICAgfQoKICAgICAgY3VtU3VtKGswLCBkaWZmX3RvdCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7LyogY3Vtc3VtICovCiAgICAgICpoX251bV9iYW5kcz1udW1fYmFuZHMwOyAgICAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCgogICAgfQoKICBpZiAoKmhfbnVtX2JhbmRzIDwgMSkKICAgIHJldHVybigxKTsgLypUbyBzbWFsbCBzYnIgYXJlYSAqLwoKICByZXR1cm4gKDApOwp9LyogRW5kIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUgKi8KCnN0YXRpYyBJTlQKbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKQp7CiAgSU5UIHJlc3VsdD0wOwogIC8qIHJlc3VsdCA9IDIqIChJTlQpICggKGRvdWJsZSliX3BfbyAqIChkb3VibGUpKEZES2xvZygoZG91YmxlKXN0b3AvKGRvdWJsZSlzdGFydCkvRkRLbG9nKChkb3VibGUpMikpICogKGRvdWJsZSlGWF9EQkwyRkwod2FycF9mYWN0b3IpICsgMC41KTsgKi8KICByZXN1bHQgPSAoICggYl9wX28gKiBmTXVsdCggKENhbGNMZEludChzdG9wKSAtIENhbGNMZEludChzdGFydCkpLCAgd2FycF9mYWN0b3IpICsgKEZMMkZYX0RCTCgwLjVmKT4+TERfREFUQV9TSElGVCkKICAgICAgICAgICAgICAgKSA+PiAoKERGUkFDVF9CSVRTLTEpLUxEX0RBVEFfU0hJRlQpICkgPDwgMTsgLyogZG8gbm90IG9wdGltaXplIGFueW1vcmUgKHJvdW5kaW5nISEpICovCgogIHJldHVybihyZXN1bHQpOwp9CgoKc3RhdGljIHZvaWQKQ2FsY0JhbmRzKElOVCAqIGRpZmYsIElOVCBzdGFydCAsIElOVCBzdG9wICwgSU5UIG51bV9iYW5kcykKewogICAgSU5UIGksIHFiLCBxZSwgcXRtcDsKICAgIElOVCBwcmV2aW91czsKICAgIElOVCBjdXJyZW50OwogICAgRklYUF9EQkwgYmFzZSwgZXhwLCB0bXA7CgogICAgcHJldmlvdXM9c3RhcnQ7CiAgICBmb3IoaT0xOyBpPD0gbnVtX2JhbmRzOyBpKyspCiAgICB7CiAgICAgICAgYmFzZSA9IGZEaXZOb3JtKChGSVhQX0RCTClzdG9wLCAoRklYUF9EQkwpc3RhcnQsICZxYik7CiAgICAgICAgZXhwID0gZkRpdk5vcm0oKEZJWFBfREJMKWksIChGSVhQX0RCTCludW1fYmFuZHMsICZxZSk7CiAgICAgICAgdG1wID0gZlBvdyhiYXNlLCBxYiwgZXhwLCBxZSwgJnF0bXApOwogICAgICAgIHRtcCA9IGZNdWx0KHRtcCwgKEZJWFBfREJMKShzdGFydDw8MjQpKTsKICAgICAgICBjdXJyZW50ICAgPSAoSU5UKXNjYWxlVmFsdWUodG1wLCBxdG1wLTIzKTsKICAgICAgICBjdXJyZW50ICAgPSAoY3VycmVudCsxKSA+PiAxOyAvKiByb3VuZGluZyovCiAgICAgICAgZGlmZltpLTFdID0gY3VycmVudC1wcmV2aW91czsKICAgICAgICBwcmV2aW91cyAgPSBjdXJyZW50OwogICAgfQoKfS8qIEVuZCBDYWxjQmFuZHMgKi8KCgpzdGF0aWMgdm9pZApjdW1TdW0oSU5UIHN0YXJ0X3ZhbHVlLCBJTlQqIGRpZmYsIElOVCBsZW5ndGgsICBVQ0hBUiAqc3RhcnRfYWRyZXNzKQp7CiAgSU5UIGk7CiAgc3RhcnRfYWRyZXNzWzBdPXN0YXJ0X3ZhbHVlOwogIGZvcihpPTE7aTw9bGVuZ3RoO2krKykKICAgIHN0YXJ0X2FkcmVzc1tpXT1zdGFydF9hZHJlc3NbaS0xXStkaWZmW2ktMV07Cn0gLyogRW5kIGN1bVN1bSAqLwoKCnN0YXRpYyBJTlQKbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kX3ByZXZpb3VzLCBJTlQgKiBkaWZmLCBJTlQgbGVuZ3RoKQp7CiAgSU5UIGNoYW5nZT1tYXhfYmFuZF9wcmV2aW91cy1kaWZmWzBdOwoKICAvKiBMaW1pdCB0aGUgY2hhbmdlIHNvIHRoYXQgdGhlIGxhc3QgYmFuZCBjYW5ub3QgZ2V0IG5hcnJvd2VyIHRoYW4gdGhlIGZpcnN0IG9uZSAqLwogIGlmICggY2hhbmdlID4gKGRpZmZbbGVuZ3RoLTFdIC0gZGlmZlswXSkgLyAyICkKICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aC0xXSAtIGRpZmZbMF0pIC8gMjsKCiAgZGlmZlswXSArPSBjaGFuZ2U7CiAgZGlmZltsZW5ndGgtMV0gLT0gY2hhbmdlOwogIEZES3NickVuY19TaGVsbHNvcnRfaW50KGRpZmYsIGxlbmd0aCk7CgogIHJldHVybigwKTsKfS8qIEVuZCBtb2RpZnlCYW5kcyAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfVXBkYXRlSGlSZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIERlc2NyaXB0aW9uOgoKCiBBcmd1bWVudHM6CgogUmV0dXJuOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UCkZES3NickVuY19VcGRhdGVIaVJlcygKICAgICAgICBVQ0hBUiAgICpoX2hpcmVzLAogICAgICAgIElOVCAgICAgKm51bV9oaXJlcywKICAgICAgICBVQ0hBUiAgICp2X2tfbWFzdGVyLAogICAgICAgIElOVCAgICAgIG51bV9tYXN0ZXIsCiAgICAgICAgSU5UICAgICAqeG92ZXJfYmFuZAogICAgICAgICkKewogIElOVCBpOwogIElOVCBtYXgxLG1heDI7CgogIGlmKCAodl9rX21hc3RlclsqeG92ZXJfYmFuZF0gPiAzMiApIHx8IC8qIHZfa19tYXN0ZXJbKnhvdmVyX2JhbmRdID4gbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLwogICAgICAoICp4b3Zlcl9iYW5kID4gbnVtX21hc3RlciApICkgIHsKICAgICAgLyogeG92ZXJfYmFuZCBlcnJvciwgdG9vIGJpZyBmb3IgdGhpcyBzdGFydEZyZXEuIFdpbGwgYmUgY2xpcHBlZCAqLwoKICAgIC8qIENhbGN1bGF0ZSBtYXhpbXVtIHZhbHVlIGZvciB4b3Zlcl9iYW5kICovCiAgICBtYXgxPTA7CiAgICBtYXgyPW51bV9tYXN0ZXI7CiAgICB3aGlsZSggKHZfa19tYXN0ZXJbbWF4MSsxXSA8IDMyICkgJiYgLyogbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLwogICAgICAgICAgICggKG1heDErMSkgPCBtYXgyKSApCiAgICAgIHsKICAgICAgICBtYXgxKys7CiAgICAgIH0KCiAgICAqeG92ZXJfYmFuZD1tYXgxOwogIH0KCiAgKm51bV9oaXJlcyA9IG51bV9tYXN0ZXIgLSAqeG92ZXJfYmFuZDsKICBmb3IoaSA9ICp4b3Zlcl9iYW5kOyBpIDw9IG51bV9tYXN0ZXI7IGkrKykKICAgIHsKICAgICAgaF9oaXJlc1tpIC0gKnhvdmVyX2JhbmRdID0gdl9rX21hc3RlcltpXTsKICAgIH0KCiAgcmV0dXJuICgwKTsKfS8qIEVuZCBGREtzYnJFbmNfVXBkYXRlSGlSZXMgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6CgogUmV0dXJuOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApGREtzYnJFbmNfVXBkYXRlTG9SZXMoVUNIQVIgKiBoX2xvcmVzLCBJTlQgKm51bV9sb3JlcywgVUNIQVIgKiBoX2hpcmVzLCBJTlQgbnVtX2hpcmVzKQp7CiAgSU5UIGk7CgogIGlmKG51bV9oaXJlcyUyID09IDApIC8qIGlmIGV2ZW4gbnVtYmVyIG9mIGhpcmVzIGJhbmRzICovCiAgICB7CiAgICAgICpudW1fbG9yZXM9bnVtX2hpcmVzLzI7CiAgICAgIC8qIFVzZSBldmVyeSBzZWNvbmQgbG9yZXM9aGlyZXNbMCwyLDQuLi5dICovCiAgICAgIGZvcihpPTA7aTw9Km51bV9sb3JlcztpKyspCiAgICAgICAgaF9sb3Jlc1tpXT1oX2hpcmVzW2kqMl07CgogICAgfQogIGVsc2UgICAgICAgICAgICAvKiBvZGQgbnVtYmVyIG9mIGhpcmVzIHdoaWNoIG1lYW5zIHhvdmVyIGlzIG9kZCAqLwogICAgewogICAgICAqbnVtX2xvcmVzPShudW1faGlyZXMrMSkvMjsKCiAgICAgIC8qIFVzZSBsb3Jlcz1oaXJlc1swLDEsMyw1IC4uLl0gKi8KICAgICAgaF9sb3Jlc1swXT1oX2hpcmVzWzBdOwogICAgICBmb3IoaT0xO2k8PSpudW1fbG9yZXM7aSsrKQogICAgICAgIHsKICAgICAgICAgIGhfbG9yZXNbaV09aF9oaXJlc1tpKjItMV07CiAgICAgICAgfQogICAgfQoKfS8qIEVuZCBGREtzYnJFbmNfVXBkYXRlTG9SZXMgKi8K