Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNkZWNvZGVyX2xpYi5oCiAqIFxicmllZiAgRkRLIEFBQyBkZWNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgogKgoKXHBhZ2UgSU5UUk8gSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTQ09QRSBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBEZWNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KRGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24sIGl0IGltcGxlbWVudHMgZGVjb2Rpbmcgb2YgQUFDLUxDIChMb3ctQ29tcGxleGl0eSksCkhFLUFBQyAoSGlnaC1FZmZpY2llbmN5IEFBQywgdjEgYW5kIHYyKSwgQUFDLUxEIChMb3ctRGVsYXkpIGFuZCBBQUMtRUxEIChFbmhhbmNlZCBMb3ctRGVsYXkpLgoKQWxsIHJlZmVyZW5jZXMgdG8gU0JSIChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyBhbmQgQUFDLUVMRAp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvCkhFLUFBQyB2MiB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIERlY29kZXJCYXNpY3MgRGVjb2RlciBCYXNpY3MKClRoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00IEFBQyBhdWRpbwpjb2Rpbmcgc3RhbmRhcmQuIFRvIHVuZGVyc3RhbmQgYWxsIHRoZSB0ZXJtcyBpbiB0aGlzIGRvY3VtZW50LCB5b3UgYXJlIGVuY291cmFnZWQgdG8gcmVhZAp0aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KCi0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLSBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBBQUMsIHN1YnBhcnQgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwKaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKY29tcG9uZW50cyBhcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLlxuCkFuIE1QRUcyIG9yIE1QRUc0IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLAp0aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpdHBpb24gQVBJIERlc2NyaXB0aW9uCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgpkZXRhaWwgaW4gdGhpcyBkb2N1bWVudC4gQWxsIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGRlY29kZXIgbGlicmFyeQpBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGF0IGFhY2RlY29kZXJfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGRlY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZSBsaWJBQUNkZWMuYSwKKExpbnV4KSBvciBGREtfYWFjRGVjX2xpYiAoTWljcm9zb2Z0IFZpc3VhbCBDKyspLgoKXHNlY3Rpb24gQ2FsbGluZ19TZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZGVjb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBvciBIRS1BQUMgdjIgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZAphbmQgb3V0cHV0IHdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kIGNsb3NlIGZ1bmN0aW9ucyBhcmUgbGVmdCBvdXQsIHNpbmNlIHRoZXkKbWF5IGJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGFjY29yZGluZyB0byB0aGUgdXNlcidzIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gaW4KbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dCwgYW5kIGluIHN1Y2ggY2FzZSBjYWxsIG1wZWdGaWxlUmVhZF9PcGVuKCkgdG8gb3BlbiBhbiBpbnB1dCBmaWxlIGFuZAp0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkgdG8gY2xvc2Ugb3BlbmVkCmZpbGVzIGFuZCB0byBkZS1hbGxvY2F0ZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMuIG1wZWdGaWxlUmVhZF9PcGVuKCkgdHJpZXMgdG8gZGV0ZWN0IHRoZSBiaXRzdHJlYW0gZm9ybWF0IGFuZAppbiBjYXNlIG9mIE1QRUctNCBmaWxlIGZvcm1hdCBvciBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCAoYSBGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpIHJlYWRzIHRoZSBBdWRpbwpTcGVjaWZpYyBDb25maWcgZGF0YSAoQVNDKS4gQW4gdW5zdWNjZXNzZnVsIGF0dGVtcHQgdG8gcmVjb2duaXplIHRoZSBiaXRzdHJlYW0gZm9ybWF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvCnByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseS4gRm9yIGFueSBvdGhlciBiaXRzdHJlYW0gZm9ybWF0cyB0aGF0IGFyZSB1c3VhbGx5IGFwcGxpY2FibGUgaW4gc3RyZWFtaW5nCmFwcGxpY2F0aW9ucywgdGhlIGRlY29kZXIgaXRzZWxmIHdpbGwgdHJ5IHRvIHN5bmNocm9uaXplIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gYml0c3RyZWFtIGZyYWdtZW50IHVzaW5nIHRoZQpGREsgdHJhbnNwb3J0IGxpYnJhcnkuIEhlbmNlLCBmb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyAod2l0aG91dCBmaWxlIGFjY2VzcykgdGhpcyBzdGVwIGlzIG5vdCBuZWNlc3NhcnkuCgotIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyIGluc3RhbmNlLgpcZG9udGluY2x1ZGUgbWFpbi5jcHAKXHNraXBsaW5lIGFhY0RlY29kZXJfT3BlbgotIyBJZiBvdXQtb2YtYmFuZCBjb25maWcgZGF0YSAoQXVkaW8gU3BlY2lmaWMgQ29uZmlnIChBU0MpIG9yIFN0cmVhbSBNdXggQ29uZmlnIChTTUMpKSBpcyBhdmFpbGFibGUsIGNhbGwKYWFjRGVjb2Rlcl9Db25maWdSYXcoKSB0byBwYXNzIGl0IHRvIHRoZSBkZWNvZGVyIGFuZCBiZWZvcmUgdGhlIGRlY29kaW5nIHByb2Nlc3Mgc3RhcnRzLiBJZiB0aGlzIGRhdGEgaXMKbm90IGF2YWlsYWJsZSBpbiBhZHZhbmNlLCB0aGUgZGVjb2RlciB3aWxsIGdldCBpdCBmcm9tIHRoZSBiaXRzdHJlYW0gIGFuZCBjb25maWd1cmUgaXRzZWxmIHdoaWxlIGRlY29kaW5nCndpdGggYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLgotIyBCZWdpbiBkZWNvZGluZyBsb29wLgpcc2tpcGxpbmUgZG8gewotIyBSZWFkIGRhdGEgZnJvbSBiaXRzdHJlYW0gZmlsZSBvciBzdHJlYW0gaW50byBhIGNsaWVudC1zdXBwbGllZCBpbnB1dCBidWZmZXIgKCJpbkJ1ZmZlciIgaW4gbWFpbi5jcHApLgpJZiBpdCBpcyB2ZXJ5IHNtYWxsIGxpa2UganVzdCA0LCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2lsbApyZXBlYXRlZGx5IHJldHVybiA6OkFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTIHVudGlsIGVub3VnaCBiaXRzIHdlcmUgZmVkIGJ5IGFhY0RlY29kZXJfRmlsbCgpLiBPbmx5IHJlYWQgZGF0YQp3aGVuIHRoaXMgYnVmZmVyIGhhcyBjb21wbGV0ZWx5IGJlZW4gcHJvY2Vzc2VkIGFuZCBpcyB0aGVuIGVtcHR5LiBGb3IgZmlsZS1iYXNlZCBpbnB1dCBleGVjdXRlCm1wZWdGaWxlUmVhZF9SZWFkKCkgb3IgYW55IG90aGVyIGltcGxlbWVudGF0aW9uIHdpdGggc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotIyBDYWxsIGFhY0RlY29kZXJfRmlsbCgpIHRvIGZpbGwgdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyIHdpdGggdGhlIGNsaWVudC1zdXBwbGllZApleHRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9GaWxsCi0jIENhbGwgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIHdoaWNoIHdyaXRlcyBkZWNvZGVkIFBDTSBhdWRpbyBkYXRhIHRvIGEgY2xpZW50LXN1cHBsaWVkIGJ1ZmZlci4gSXQgaXMgdGhlCmNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFsbG9jYXRlIGEgYnVmZmVyIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoaXMgb3V0cHV0IGRhdGEuClxza2lwbGluZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lCklmIHRoZSBiaXRzdHJlYW0ncyBjb25maWd1cmF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIHNhbXBsZSByYXRlLCBmcmFtZSBzaXplKSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgeW91IG1heQpjYWxsIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbygpIHRvIHJldHJpZXZlIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlbiBpbml0aWFsaXplIGFuIGF1ZGlvCm91dHB1dCBkZXZpY2UuIEluIHRoZSBleGFtcGxlIG1haW4uY3BwLCBpZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBzaW5jZSBwcm9ncmFtCnN0YXJ0IG9yIHNpbmNlIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUsIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlIHdpbGwgYmUgcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQKaXMgY2hvc2VuLCBhIG5ldyBXQVZFIGZpbGUgZm9yIGVhY2ggbmV3IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvCi0jIFJlcGVhdCBzdGVwcyA1IHRvIDcgdW50aWwgbm8gZGF0YSB0byBkZWNvZGUgaXMgYXZhaWxhYmxlIGFueW1vcmUsIG9yIGlmIGFuIGVycm9yIG9jY3VyZWQuClxza2lwbGluZSB9IHdoaWxlCi0jIENhbGwgYWFjRGVjb2Rlcl9DbG9zZSgpIHRvIGRlLWFsbG9jYXRlIGFsbCBBQUMgZGVjb2RlciBhbmQgdHJhbnNwb3J0IGxheWVyIHN0cnVjdHVyZXMuClxza2lwbGluZSBhYWNEZWNvZGVyX0Nsb3NlCgpcc2VjdGlvbiBCdWZmZXJTeXN0ZW0gQnVmZmVyIFN5c3RlbQoKVGhlcmUgYXJlIHRocmVlIG1haW4gYnVmZmVycyBpbiBhbiBBQUMgZGVjb2RlciBhcHBsaWNhdGlvbi4gT25lIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB0byBob2xkIGJpdHN0cmVhbQpkYXRhIGZyb20gZmlsZSBJL08gb3IgZWxzZXdoZXJlLCBvbmUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIGFuZCBvbmUgdG8gaG9sZCB0aGUgZGVjb2RlZCBvdXRwdXQKUENNIHNhbXBsZSBkYXRhLCB3aGVyZWFzIHRoaXMgb3V0cHV0IGJ1ZmZlciBtYXkgb3ZlcmxhcCB3aXRoIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIuCgpUaGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIHNldCBpbiB0aGUgZXhhbXBsZSBmcmFtZXdvcmsgbWFpbi5jcHAgYW5kIGl0cyBzaXplIGlzIGRlZmluZWQgYnkgOjpJTl9CVUZfU0laRS4KWW91IG1heSBmcmVlbHkgY2hvb3NlIGRpZmZlcmVudCBzaXplcyBoZXJlLiBUbyBmZWVkIHRoZSBkYXRhIHRvIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciwgdXNlIHRoZQpmdW5jdGlvbiBhYWNEZWNvZGVyX0ZpbGwoKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cgbWFueSBieXRlcyBpbiB0aGUKZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBpbnRlcm5hbCBpbnB1dCBidWZmZXIgKHZhcmlhYmxlIGJ5dGVzVmFsaWQpLgpPbmNlIHRoZSBleHRlcm5hbCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgY29waWVkLCBpdCBjYW4gYmUgcmUtZmlsbGVkIGFnYWluLgpJbiBjYXNlIHlvdSB3YW50IHRvIHJlLWZpbGwgaXQgd2hlbiB0aGVyZSBhcmUgc3RpbGwgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91CndvdWxkIGhhdmUgdG8gYWRkaXRpb25hbGx5IHBlcmZvcm0gYSBtZW1jcHkoKSwgc28gdGhhdCBqdXN0IG1lYW5zIHVubmVjZXNzYXJ5IGNvbXB1dGF0aW9uYWwgb3ZlcmhlYWQKYW5kIHRoZXJlZm9yZSB3ZSByZWNvbW1lbmQgdG8gcmUtZmlsbCB0aGUgYnVmZmVyIG9ubHkgd2hlbiBieXRlc1ZhbGlkIGlzIDAuCgpcaW1hZ2UgbGF0ZXggZGVjX2J1ZmZlci5wbmcgIkxpZmVjeWNsZSBvZiB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIiB3aWR0aD05Y20KClRoZSBzaXplIG9mIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdHBkZWNfbGliLmggKHNlZSBkZWZpbmUgOjpUUkFOU1BPUlRERUNfSU5CVUZfU0laRSkuCllvdSBtYXkgY2hvb3NlIGEgc21hbGxlciBzaXplIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uc2lkZXJhdGlvbnM6CgotIGVhY2ggaW5wdXQgY2hhbm5lbCByZXF1aXJlcyA3NjggYnl0ZXMKLSB0aGUgd2hvbGUgYnVmZmVyIG11c3QgYmUgb2Ygc2l6ZSAyXm4KClNvIGZvciBleGFtcGxlIGEgc3RlcmVvIGRlY29kZXI6CgpcZlsKVFJBTlNQT1JUREVDXF9JTkJVRlxfU0laRSA9IDIgKiA3NjggPSAxNTM2ID0+IDIwNDgKXGZdCgp0cGRlY19saWIuaCBhbmQgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlZm9yZQpvbmx5IHNvdXJjZS1jb2RlIGNsaWVudHMgbWF5IGNoYW5nZSB0aGlzIHNldHRpbmcuIElmIHlvdSByZWNlaXZlZCBhIGxpYnJhcnkgcmVsZWFzZSwgcGxlYXNlIGFzayB1cyBhbmQKd2UgY2FuIGNoYW5nZSB0aGlzIGluIG9yZGVyIHRvIG1lZXQgeW91ciBtZW1vcnkgcmVxdWlyZW1lbnRzLgoKXHBhZ2UgT3V0cHV0Rm9ybWF0IERlY29kZXIgYXVkaW8gb3V0cHV0Cgpcc2VjdGlvbiBPdXRwdXRGb3JtYXRPYnRhaW5pbmcgT2J0YWluaW5nIGNoYW5uZWwgbWFwcGluZyBpbmZvcm1hdGlvbgoKVGhlIGRlY29kZWQgYXVkaW8gb3V0cHV0IGZvcm1hdCBpcyBpbmRpY2F0ZWQgYnkgYSBzZXQgb2YgdmFyaWFibGVzIG9mIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUuCldoaWxlIHRoZSBtZW1iZXJzIHNhbXBsZVJhdGUsIGZyYW1lU2l6ZSBhbmQgbnVtQ2hhbm5lbHMgbWlnaHQgYmUgcXVpdGUgc2VsZiBleHBsYWluaW5nLApwQ2hhbm5lbFR5cGUgYW5kIHBDaGFubmVsSW5kaWNlcyBtaWdodCByZXF1aXJlIHNvbWUgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi4KClRoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgd2hhdCBpcyBlYWNoIG91dHB1dCBjaGFubmVsIHN1cHBvc2VkIHRvIGJlLiBCb3RoIGFycmF5IGhhdmUKQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzIGNlbGxzLiBFYWNoIGNlbGwgb2YgcENoYW5uZWxUeXBlIGluZGljYXRlcyB0aGUgY2hhbm5lbCB0eXBlLCBkZXNjcmliZWQgaW4KdGhlIGVudW0gOjpBVURJT19DSEFOTkVMX1RZUEUgZGVmaW5lZCBpbiBGREtfYXVkaW8uaC4gVGhlIGNlbGxzIG9mIHBDaGFubmVsSW5kaWNlcyBpbmRpY2F0ZSB0aGUgc3ViIGluZGV4CmFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgYWxsIGNoYW5uZWxzIG9mIHRoZSBzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KClRoZSBpbmRleGluZyBzY2hlbWUgaXMgdGhlIHNhbWUgYXMgZm9yIE1QRUctMi80LiBUaHVzIGluZGljZXMgYXJlIGNvdW50ZWQgdXB3YXJkcyBzdGFydGluZyBmcm9tIHRoZSBmcm9udApkaXJlY3Rpb24gKHRodXMgYSBjZW50ZXIgY2hhbm5lbCBpZiBhbnksIHdpbGwgYWx3YXlzIGJlIGluZGV4IDApLiBUaGVuIHRoZSBpbmRpY2VzIGNvdW50IHVwLCBzdGFydGluZyBhbHdheXMKd2l0aCB0aGUgbGVmdCBzaWRlLCBwYWlyd2lzZSBmcm9tIGZyb250IHRvd2FyZCBiYWNrLiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24sIHBsZWFzZSByZWZlciB0bwpJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgY2hhcHRlciA4LjUuMy4yLgoKSW4gY2FzZSBhIFByb2dyYW0gQ29uZmlnIGlzIGluY2x1ZGVkIGluIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uLCB0aGUgY2hhbm5lbCBtYXBwaW5nIGRlc2NyaWJlZCB3aXRoaW4KaXQgd2lsbCBiZSBhZG9wdGVkLgoKSW4gY2FzZSBvZiBNUEVHLUQgU3Vycm91bmQgdGhlIGNoYW5uZWwgbWFwcGluZyB3aWxsIGZvbGxvdyB0aGUgc2FtZSBjcml0ZXJpYSBkZXNjcmliZWQgaW4gSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksCmJ1dCBhZGRpbmcgY29ycmVzcG9uZGluZyB0b3AgY2hhbm5lbHMgdG8gdGhlIGNoYW5uZWwgdHlwZXMgZnJvbnQsIHNpZGUgYW5kIGJhY2ssIGluIG9yZGVyIHRvIGF2b2lkIGFueQpsb3NzIG9mIGluZm9ybWF0aW9uLgoKXHNlY3Rpb24gT3V0cHV0Rm9ybWF0Q2hhbmdlIENoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZm9ybWF0CgpUaGUgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc2NoZW1lIGFuZCB0aGUgYWN0dWFsIGNoYW5uZWwgb3JkZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQpwYXJhbWV0ZXJzIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRob3NlCnBhcmFtZXRlcnMgYW5kIHRoZSBkZWNvZGVyIGxpYnJhcnkgZnVuY3Rpb24gYWFjRGVjb2Rlcl9TZXRQYXJhbSgpIGZvciBtb3JlIGRldGFpbC4KClxzZWN0aW9uIE91dHB1dEZvcm1hdEV4YW1wbGUgQ2hhbm5lbCBtYXBwaW5nIGV4YW1wbGVzCgpUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhlIGxvY2F0aW9uIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoYXQKaXMgcGFzc2VkIHRvIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSBhbmQgdGhlIGV4cGVjdGVkIGRhdGEgaW4gdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZSB3aGljaCBjYW4gYmUgb2J0YWluZWQKYnkgY2FsbGluZyBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKS4KClxzdWJzZWN0aW9uIEV4YW1wbGVzU3RlcmVvIFN0ZXJlbwoKSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIHNldCB0byAwIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYyBjb25maWcgd291bGQgbGVhZAp0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbiBDU3RyZWFtSW5mbzoKCkNTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDIKCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCB9CgpDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzID0geyAwLCAxIH0KClNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgaXMgc2V0IHRvIDAsIHRoZSBhdWRpbyBjaGFubmVscyB3aWxsIGJlIGxvY2F0ZWQgYXMgY29udGlndW91cyBibG9ja3MKaW4gdGhlIG91dHB1dCBidWZmZXIgYXMgZm9sbG93czoKClx2ZXJiYXRpbQogIDxsZWZ0IHNhbXBsZSAwPiAgPGxlZnQgc2FtcGxlIDE+ICA8bGVmdCBzYW1wbGUgMj4gIC4uLiA8bGVmdCBzYW1wbGUgTj4KICA8cmlnaHQgc2FtcGxlIDA+IDxyaWdodCBzYW1wbGUgMT4gPHJpZ2h0IHNhbXBsZSAyPiAuLi4gPHJpZ2h0IHNhbXBsZSBOPgpcZW5kdmVyYmF0aW0KCldoZXJlIE4gZXF1YWxzIHRvIENTdHJlYW1JbmZvOjpmcmFtZVNpemUgLgoKXHN1YnNlY3Rpb24gRXhhbXBsZXNTdXJyb3VuZCBTdXJyb3VuZCA1LjEKCkluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMSBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCmEgQUFDLUxDIGJpdCBzdHJlYW0gd2hpY2ggaGFzIGNoYW5uZWxDb25maWd1cmF0aW9uID0gNiBpbiBpdHMgYXVkaW8gc3BlY2lmaWMgY29uZmlnLCB3b3VsZCBsZWFkCnRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgoKQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzID0gNgoKQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSA9IHsgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfTEZFLCA6OkFDVF9CQUNLLCA6OkFDVF9CQUNLIH0KCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDEsIDIsIDAsIDAsIDAsIDEgfQoKU2luY2UgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgaXMgMSwgV0FWIGZpbGUgY2hhbm5lbCBvcmRlcmluZyB3aWxsIGJlIHVzZWQuIEZvciBhIDUuMSBjaGFubmVsCnNjaGVtZSwgdGh1cyB0aGUgY2hhbm5lbHMgd291bGQgYmU6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBjZW50ZXIsIExGRSwgc3Vycm91bmQgbGVmdCwgc3Vycm91bmQgcmlnaHQuClRodXMgdGhlIHRoaXJkIGNoYW5uZWwgaXMgdGhlIGNlbnRlciBjaGFubmVsLCByZWNlaXZpbmcgdGhlIGluZGV4IDAuIFRoZSBvdGhlciBmcm9udCBjaGFubmVscyBhcmUKZnJvbnQgbGVmdCwgZnJvbnQgcmlnaHQgYmVpbmcgcGxhY2VkIGFzIGZpcnN0IGFuZCBzZWNvbmQgY2hhbm5lbHMgd2l0aCBpbmRpY2VzIDEgYW5kIDIgY29ycmVzcG9uZGluZ2x5LgpUaGVyZSBpcyBvbmx5IG9uZSBMRkUsIHBsYWNlZCBhcyB0aGUgZm91cnRoIGNoYW5uZWwgYW5kIGluZGV4IDAuIEZpbmFsbHkgYm90aCBzdXJyb3VuZApjaGFubmVscyBnZXQgdGhlIHR5cGUgZGVmaW5pdGlvbiBBQ1RfQkFDSywgYW5kIHRoZSBpbmRpY2VzIDAgYW5kIDEuCgpTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAxLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKYXMgZm9sbG93czoKClx2ZXJiYXRpbQo8ZnJvbnQgbGVmdCBzYW1wbGUgMD4gPGZyb250IHJpZ2h0IHNhbXBsZSAwPgo8Y2VudGVyIHNhbXBsZSAwPiA8TEZFIHNhbXBsZSAwPgo8c3Vycm91bmQgbGVmdCBzYW1wbGUgMD4gPHN1cnJvdW5kIHJpZ2h0IHNhbXBsZSAwPgoKPGZyb250IGxlZnQgc2FtcGxlIDE+IDxmcm9udCByaWdodCBzYW1wbGUgMT4KPGNlbnRlciBzYW1wbGUgMT4gPExGRSBzYW1wbGUgMT4KPHN1cnJvdW5kIGxlZnQgc2FtcGxlIDE+IDxzdXJyb3VuZCByaWdodCBzYW1wbGUgMT4KCi4uLgoKPGZyb250IGxlZnQgc2FtcGxlIE4+IDxmcm9udCByaWdodCBzYW1wbGUgTj4KPGNlbnRlciBzYW1wbGUgTj4gPExGRSBzYW1wbGUgTj4KPHN1cnJvdW5kIGxlZnQgc2FtcGxlIE4+IDxzdXJyb3VuZCByaWdodCBzYW1wbGUgTj4KXGVuZHZlcmJhdGltCgpXaGVyZSBOIGVxdWFscyB0byBDU3RyZWFtSW5mbzo6ZnJhbWVTaXplIC4KClxzdWJzZWN0aW9uIEV4YW1wbGVzQXJpYiBBUklCIGNvZGluZyBtb2RlIDIvMQoKSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIHNldCB0byAxIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKaW4gY2FzZSBvZiBhIEFSSUIgYml0IHN0cmVhbSB1c2luZyBjb2RpbmcgbW9kZSAyLzEgYXMgZGVzY3JpYmVkIGluIEFSSUIgU1RELUIzMiBQYXJ0IDIgVmVyc2lvbiAyLjEtRTEsIHBhZ2UgNjEsCndvdWxkIGxlYWQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CgpDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSAzCgpDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlID0geyA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsOjogQUNUX0JBQ0sgfQoKQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcyA9IHsgMCwgMSwgMCB9CgpUaGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBwbGFjZWQgYXMgZm9sbG93cyBpbiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlcjoKClx2ZXJiYXRpbQo8ZnJvbnQgbGVmdCBzYW1wbGUgMD4gPGZyb250IHJpZ2h0IHNhbXBsZSAwPiAgPG1pZCBzdXJyb3VuZCBzYW1wbGUgMD4KCjxmcm9udCBsZWZ0IHNhbXBsZSAxPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIDE+IDxtaWQgc3Vycm91bmQgc2FtcGxlIDE+CgouLi4KCjxmcm9udCBsZWZ0IHNhbXBsZSBOPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIE4+IDxtaWQgc3Vycm91bmQgc2FtcGxlIE4+CgpXaGVyZSBOIGVxdWFscyB0byBDU3RyZWFtSW5mbzo6ZnJhbWVTaXplIC4KClxlbmR2ZXJiYXRpbQoKKi8KCiNpZm5kZWYgQUFDREVDT0RFUl9MSUJfSAojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0gKCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCgovKioKICogXGJyaWVmICBBQUMgZGVjb2RlciBlcnJvciBjb2Rlcy4KICovCnR5cGVkZWYgZW51bSB7CiAgQUFDX0RFQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IE5vIGVycm9yIG9jY3VyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCiAgQUFDX0RFQ19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IEhlYXAgcmV0dXJuZWQgTlVMTCBwb2ludGVyLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCiAgQUFDX0RFQ19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDUsICAvKiE8IEVycm9yIGNvbmRpdGlvbiBpcyBvZiB1bmtub3duIHJlYXNvbiwgb3IgZnJvbSBhIGFub3RoZXIgbW9kdWxlLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCgogIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KICBhYWNfZGVjX3N5bmNfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICA9IDB4MTAwMCwKICBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SICAgICAgICAgICA9IDB4MTAwMSwgIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGhhZCBzeW5jcm9uaXNhdGlvbiBwcm9ibGVtcy4gRG8gbm90IGV4aXQgZGVjb2RpbmcuIEp1c3QgZmVlZCBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGRhdGEuICovCiAgQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMgICAgICAgICAgICAgICAgPSAweDEwMDIsICAvKiE8IFRoZSBpbnB1dCBidWZmZXIgcmFuIG91dCBvZiBiaXRzLiAqLwogIGFhY19kZWNfc3luY19lcnJvcl9lbmQgICAgICAgICAgICAgICAgID0gMHgxRkZGLAoKICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KICBhYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICA9IDB4MjAwMCwKICBBQUNfREVDX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICA9IDB4MjAwMSwgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKE5VTEwpLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfQU9UICAgICAgICAgICAgICAgID0gMHgyMDAyLCAgLyohPCBUaGUgQU9UIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQgICAgICAgICAgICAgPSAweDIwMDMsICAvKiE8IFRoZSBiaXRzdHJlYW0gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgICAgID0gMHgyMDA0LCAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRVBDT05GSUcgICAgICAgICAgID0gMHgyMDA1LCAgLyohPCBUaGUgZXJyb3IgcHJvdGVjdGlvbiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX01VTFRJTEFZRVIgICAgICAgICA9IDB4MjAwNiwgIC8qITwgTW9yZSB0aGFuIG9uZSBsYXllciBmb3IgQUFDIHNjYWxhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICAgICAgPSAweDIwMDcsICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEUgICAgICAgPSAweDIwMDgsICAvKiE8IFRoZSBzYW1wbGUgcmF0ZSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX0lOVkFMSURfU0JSX0NPTkZJRyAgICAgICAgICAgICA9IDB4MjAwOSwgIC8qITwgVGhlIFNCUiBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyIHRoZSB2YWx1ZSB3YXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBwYXJhbWV0ZXIgZG9lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgZXhpc3QuICovCiAgQUFDX0RFQ19ORUVEX1RPX1JFU1RBUlQgICAgICAgICAgICAgICAgPSAweDIwMEIsICAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgc2luY2UgdGhlIHJlcXVpZXJlZCBjb25maWd1cmF0aW9uIGNoYW5nZSBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLwogIEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwgICAgICAgID0gMHgyMDBDLCAgLyohPCBUaGUgcHJvdmlkZWQgb3V0cHV0IGJ1ZmZlciBpcyB0b28gc21hbGwuICovCiAgYWFjX2RlY19pbml0X2Vycm9yX2VuZCAgICAgICAgICAgICAgICAgPSAweDJGRkYsCgogIC8qIERlY29kZSBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYnV0IGNvbmNlYWxlZC4gKi8KICBhYWNfZGVjX2RlY29kZV9lcnJvcl9zdGFydCAgICAgICAgICAgICA9IDB4NDAwMCwKICBBQUNfREVDX1RSQU5TUE9SVF9FUlJPUiAgICAgICAgICAgICAgICA9IDB4NDAwMSwgIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IuICovCiAgQUFDX0RFQ19QQVJTRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDIsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGJpdHN0cmVhbS4gTW9zdCBwcm9iYWJseSBpdCBpcyBjb3JydXB0ZWQsIG9yIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0VYVEVOU0lPTl9QQVlMT0FEICA9IDB4NDAwMywgIC8qITwgRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgZXh0ZW5zaW9uIHBheWxvYWQgb2YgdGhlIGJpdHN0cmVhbS4gVGhlIGV4dGVuc2lvbiBwYXlsb2FkIHR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUiAgICAgICAgICAgICA9IDB4NDAwNCwgIC8qITwgVGhlIHBhcnNlZCBiaXRzdHJlYW0gdmFsdWUgaXMgb3V0IG9mIHJhbmdlLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN5c3RlbSBjcmFzaGVkLiAqLwogIEFBQ19ERUNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1LCAgLyohPCBUaGUgZW1iZWRkZWQgQ1JDIGRpZCBub3QgbWF0Y2guICovCiAgQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSyAgICAgICAgICAgICAgPSAweDQwMDYsICAvKiE8IEFuIGludmFsaWQgY29kZWJvb2sgd2FzIHNpZ25hbGxlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIHRoZSBzeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc2hlZC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX1BSRURJQ1RJT04gICAgICAgICA9IDB4NDAwNywgIC8qITwgUHJlZGljdG9yIGZvdW5kLCBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgQUFDIExvdyBDb21wbGV4aXR5IHByb2ZpbGUuIE1vc3QgcHJvYmFibHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMgYSB3cm9uZyBmb3JtYXQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DQ0UgICAgICAgICAgICAgICAgPSAweDQwMDgsICAvKiE8IEEgQ0NFIGVsZW1lbnQgd2FzIGZvdW5kIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYSB3cm9uZyBmb3JtYXQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9MRkUgICAgICAgICAgICAgICAgPSAweDQwMDksICAvKiE8IEEgTEZFIGVsZW1lbnQgd2FzIGZvdW5kIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYSB3cm9uZyBmb3JtYXQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9HQUlOX0NPTlRST0xfREFUQSAgPSAweDQwMEEsICAvKiE8IEdhaW4gY29udHJvbCBkYXRhIGZvdW5kIGJ1dCBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgd3JvbmcgZm9ybWF0LiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfU0JBICAgICAgICAgICAgICAgID0gMHg0MDBCLCAgLyohPCBTQkEgZm91bmQsIGJ1dCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBpbiB0aGUgQlNBQyBwcm9maWxlLiAqLwogIEFBQ19ERUNfVE5TX1JFQURfRVJST1IgICAgICAgICAgICAgICAgID0gMHg0MDBDLCAgLyohPCBFcnJvciB3aGlsZSByZWFkaW5nIFROUyBkYXRhLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCBvciB0aGUgc3lzdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCiAgQUFDX0RFQ19SVkxDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgPSAweDQwMEQsICAvKiE8IEVycm9yIHdoaWxlIGRlY29kaW5nIGVycm9yIHJlc2lsbGllbnQgZGF0YS4gKi8KICBhYWNfZGVjX2RlY29kZV9lcnJvcl9lbmQgICAgICAgICAgICAgICA9IDB4NEZGRiwKCiAgLyogQW5jaWxsYXJ5IGRhdGEgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkLiAqLwogIGFhY19kZWNfYW5jX2RhdGFfZXJyb3Jfc3RhcnQgICAgICAgICAgID0gMHg4MDAwLAogIEFBQ19ERUNfQU5DX0RBVEFfRVJST1IgICAgICAgICAgICAgICAgID0gMHg4MDAxLCAgLyohPCBOb24gc2V2ZXJlIGVycm9yIGNvbmNlcm5pbmcgdGhlIGFuY2lsbGFyeSBkYXRhIGhhbmRsaW5nLiAqLwogIEFBQ19ERUNfVE9PX1NNQUxMX0FOQ19CVUZGRVIgICAgICAgICAgID0gMHg4MDAyLCAgLyohPCBUaGUgcmVnaXN0ZXJlZCBhbmNpbGxhcnkgZGF0YSBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgdGhlIHBhcnNlZCBkYXRhLiAqLwogIEFBQ19ERUNfVE9PX01BTllfQU5DX0VMRU1FTlRTICAgICAgICAgID0gMHg4MDAzLCAgLyohPCBNb3JlIHRoYW4gdGhlIGFsbG93ZWQgbnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnRzIHNob3VsZCBiZSB3cml0dGVuIHRvIGJ1ZmZlci4gKi8KICBhYWNfZGVjX2FuY19kYXRhX2Vycm9yX2VuZCAgICAgICAgICAgICA9IDB4OEZGRgoKCn0gQUFDX0RFQ09ERVJfRVJST1I7CgoKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGluaXRpYWxpemF0aW9uIGVycm9ycy4gKi8KI2RlZmluZSBJU19JTklUX0VSUk9SKGVycikgICAoICgoKGVycik+PWFhY19kZWNfaW5pdF9lcnJvcl9zdGFydCkgICAmJiAoKGVycik8PWFhY19kZWNfaW5pdF9lcnJvcl9lbmQpKSAgID8gMSA6IDApCi8qKiBNYWNybyB0byBpZGVudGlmeSBkZWNvZGUgZXJyb3JzLiAqLwojZGVmaW5lIElTX0RFQ09ERV9FUlJPUihlcnIpICggKCgoZXJyKT49YWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQpICYmICgoZXJyKTw9YWFjX2RlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGlmIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyIGNvbnRhaW5zIHZhbGlkIHNhbXBsZXMgYWZ0ZXIgY2FsbGluZyBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuICovCiNkZWZpbmUgSVNfT1VUUFVUX1ZBTElEKGVycikgKCAoKGVycikgPT0gQUFDX0RFQ19PSykgfHwgSVNfREVDT0RFX0VSUk9SKGVycikgKQoKLyoqCiAqIFxicmllZiBBQUMgZGVjb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMKICovCnR5cGVkZWYgZW51bQp7CiAgQUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBQQ00gb3V0cHV0IG1vZGUgKDE6IGludGVybGVhdmVkIChkZWZhdWx0KTsgMDogbm90IGludGVybGVhdmVkKS4gKi8KICBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERSAgICAgICAgPSAweDAwMDIsICAvKiE8IERlZmluZXMgaG93IHRoZSBkZWNvZGVyIHByb2Nlc3NlcyB0d28gY2hhbm5lbCBzaWduYWxzOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogTGVhdmUgYm90aCBzaWduYWxzIGFzIHRoZXkgYXJlIChkZWZhdWx0KS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAxLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgYm90aCBjaGFubmVscyAoTCcgPSBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyKS4gKi8KICBBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgICAgICAgICAgPSAweDAwMDMsICAvKiE8IE91dHB1dCBidWZmZXIgY2hhbm5lbCBvcmRlcmluZy4gMDogTVBFRyBQQ0Ugc3R5bGUgb3JkZXIsIDE6IFdBViBmaWxlIGNoYW5uZWwgb3JkZXIgKGRlZmF1bHQpLiAqLwogIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgIC8qITwgRW5hYmxlIHNpZ25hbCBsZXZlbCBsaW1pdGluZy4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBBdXRvLWNvbmZpZy4gRW5hYmxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgY29uZmlndXJhdGlvbnMgYnkgZGVmYXVsdC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBEaXNhYmxlIGxpbWl0ZXIgaW4gZ2VuZXJhbC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFbmFibGUgbGltaXRlciBhbHdheXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byBjYWxsIHRoZSBkZWNvZGVyIHdpdGggYSBBQUNERUNfQ0xSSElTVCBmbGFnIHRvIHJlc2V0IGFsbCBzdGF0ZXMgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbWl0ZXIgc3dpdGNoIGlzIGNoYW5nZWQgZXhwbGljaXRseS4gKi8KICBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUUgICAgICAgICAgICAgPSAweDAwMDUsICAvKiE8IFNpZ25hbCBsZXZlbCBsaW1pdGluZyBhdHRhY2sgdGltZSBpbiBtcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgY29uZmd1cmF0aW9uIGlzIDE1IG1zLiBBZGp1c3RhYmxlIHJhbmdlIGZyb20gMSBtcyB0byAxNSBtcy4gKi8KICBBQUNfUENNX0xJTUlURVJfUkVMRUFTX1RJTUUgICAgICAgICAgICAgPSAweDAwMDYsICAvKiE8IFNpZ25hbCBsZXZlbCBsaW1pdGluZyByZWxlYXNlIHRpbWUgaW4gbXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgNTAgbXMuIEFkanVzdGFibGUgdGltZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAgbXMuICovCiAgQUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTICAgICAgICAgICAgID0gMHgwMDExLCAgLyohPCBNaW5pbXVtIG51bWJlciBvZiBQQ00gb3V0cHV0IGNoYW5uZWxzLiBJZiBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpbXBsZSBjaGFubmVsIGV4dGVuc2lvbiBpcyBhcHBsaWVkLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgY2hhbm5lbCBleHRlbnN0aW9uIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBhcyB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogICAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgbmVlZGVkIG9ubHkgdG9nZXRoZXIgd2l0aCB0aGUgbWl4LWRvd24gZmVhdHVyZS4gU2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiAgICBFbmNvZGVkIG1vbm8gc2lnbmFscyB3aWxsIGJlIGR1cGxpY2F0ZWQgdG8gYWNoaWV2ZSBhIDIvMC8wLjAgY2hhbm5lbCBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gc2l4IGNoYW5uZWxzIHRvIGFjaGlldmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIDMvMC8yLjEgY2hhbm5lbCBvdXRwdXQgc2lnbmFsLiBNaXNzaW5nIGNoYW5uZWxzIHdpbGwgYmUgZmlsbGVkIHdpdGggYSB6ZXJvIHNpZ25hbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUgYXBwZW5kZWQuIE9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogICAgVGhlIGRlY29kZXIgdHJ5cyB0byByZW9yZGVyIGVuY29kZWQgc2lnbmFscyB3aXRoIGxlc3MgdGhhbiBlaWdodCBjaGFubmVscyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjaGlldmUgYSAzLzAvNC4xIGNoYW5uZWwgb3V0cHV0IHNpZ25hbC4gTWlzc2luZyBjaGFubmVscyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIHNpZ25hbC4gSWYgcmVvcmRlcmluZyBpcyBub3QgcG9zc2libGUgdGhlIGVtcHR5IGNoYW5uZWxzIHdpbGwgc2ltcGx5IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgY2hhbm5lbCBzaWduYWxsaW5nIChDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlIGFuZCBDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZC4gQWRkZWQgZW1wdHkgY2hhbm5lbHMgd2lsbCBiZSBzaWduYWxsZWQgd2l0aCBjaGFubmVsIHR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFOjpBQ1RfTk9ORS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBUaGlzIHBhcmFtZXRlciBkb2VzIG5vdCBhZmZlY3QgTVBFRyBTdXJyb3VuZCBwcm9jZXNzaW5nLiAqLwogIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMiwgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgbG93ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4aW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nbHkuIElmIGRlZGljYXRlZCBtZXRhZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbSBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIGFjaGlldmUgYmV0dGVyIG1peGluZyByZXN1bHRzLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgZG93bm1peGluZyBmZWF0dXJlLiBUaGUgZGVjb2RlciBvdXRwdXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6ICAgIEFsbCBlbmNvZGVkIGF1ZGlvIGNvbmZpZ3VyYXRpb25zIHdpdGggbW9yZSB0aGFuIG9uZSBjaGFubmVsIHdpbGwgYmUgbWl4ZWQgZG93biB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtb25vIG91dHB1dCBzaWduYWwuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogICAgVGhlIGRlY29kZXIgcGVyZm9ybXMgYSBzdGVyZW8gbWl4LWRvd24gaWYgdGhlIG51bWJlciBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHR3by4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiAgICBJZiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIHNpeCB0aGUgZGVjb2RlciBwZXJmb3JtcyBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LWRvd24gdG8gbWVldCB0aGUgdGFyZ2V0IG91dHB1dCBjb25maWd1cmF0aW9uIG9mIDMvMC8yLjEgY2hhbm5lbHMuIE9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogICAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgbmVlZGVkIG9ubHkgdG9nZXRoZXIgd2l0aCB0aGUgY2hhbm5lbCBleHRlbnNpb24gZmVhdHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgOjpBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gT25seSBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIERvd24tbWl4aW5nIG9mIGFueSBzZXZlbiBvciBlaWdodCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gbm90IGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQU0gNCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc29mdHdhcmUgdmVyc2lvbi4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gemVybyBidXQgc21hbGxlciB0aGFuIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdGggd2lsbCBiZSBzZXQgdG8gc2FtZSB2YWx1ZS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gVGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBNUEVHIFN1cnJvdW5kIG1vZHVsZSB3aWxsIGJlIHNldCBhY2NvcmRpbmdseS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4gU2V0dGluZyB0aGlzIHBhcmFtIHdpdGggYW55IHZhbHVlIHdpbGwgZGlzYWJsZSB0aGUgYmluYXVyYWwgcHJvY2Vzc2luZyBvZiB0aGUgTVBFRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJyb3VuZCBtb2R1bGUgKDo6QUFDX01QRUdTX0JJTkFVUkFMX0VOQUJMRT0wKS4gKi8KCiAgQUFDX0NPTkNFQUxfTUVUSE9EICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLCAgLyohPCBFcnJvciBjb25jZWFsbWVudDogUHJvY2Vzc2luZyBtZXRob2QuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBTcGVjdHJhbCBtdXRpbmcuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBOb2lzZSBzdWJzdGl0dXRpb24gKHNlZSA6OkNPTkNFQUxfTk9JU0UpLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRW5lcmd5IGludGVycG9sYXRpb24gKGFkZHMgYWRkaXRpb25hbCBzaWduYWwgZGVsYXkgb2Ygb25lIGZyYW1lLCBzZWUgOjpDT05DRUFMX0lOVEVSKS4gXG4gKi8KCiAgQUFDX0RSQ19CT09TVF9GQUNUT1IgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFNjYWxpbmcgZmFjdG9yIGZvciBib29zdGluZyBnYWluIHZhbHVlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgaG93IHRoZSBib29zdGluZyBEUkMgZmFjdG9ycyAoY29udmV5ZWQgaW4gdGhlIGJpdHN0cmVhbSkgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBzaWduYWwuIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChkb24ndCBhcHBseSBib29zdCBmYWN0b3JzKSB0byAxMjcgKGZ1bGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseSBhbGwgYm9vc3RpbmcgZmFjdG9ycykuICovCiAgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgICAgICAgICAgICAgID0gMHgwMjAxLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFNjYWxpbmcgZmFjdG9yIGZvciBhdHRlbnVhdGluZyBnYWluIHZhbHVlcy4gU2FtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0RSQ19CT09TVF9GQUNUT1IgYnV0IGZvciBhdHRlbnVhdGluZyBEUkMgZmFjdG9ycy4gKi8KICBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCAgICAgICAgICAgICAgICAgPSAweDAyMDIsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogVGFyZ2V0IHJlZmVyZW5jZSBsZXZlbC4gRGVmaW5lcyB0aGUgbGV2ZWwgYmVsb3cgZnVsbC1zY2FsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1YW50aXplZCBpbiBzdGVwcyBvZiAwLjI1ZEIpIHRvIHdoaWNoIHRoZSBvdXRwdXQgYXVkaW8gc2lnbmFsIHdpbGwgYmUgbm9ybWFsaXplZCB0byBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERSQyBtb2R1bGUuIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChmdWxsLXNjYWxlKSB0byAxMjcgKDMxLjc1IGRCIGJlbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsLXNjYWxlKS4gVGhlIHZhbHVlIHNtYWxsZXIgdGhhbiAwIHN3aXRjaGVzIG9mZiBub3JtYWxpemF0aW9uLiAqLwogIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBFbi0vRGlzYWJsZSBEVkIgc3BlY2lmaWMgaGVhdnkgY29tcHJlc3Npb24gKGFrYSBSRiBtb2RlKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byAxLCB0aGUgZGVjb2RlciB3aWxsIGFwcGx5IHRoZSBjb21wcmVzc2lvbiB2YWx1ZXMgZnJvbSB0aGUgRFZCIHNwZWNpZmljIGFuY2lsbGFyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmaWVsZC4gQXQgdGhlIHNhbWUgdGltZSB0aGUgTVBFRy00IER5bmFtaWMgUmFuZ2UgQ29udHJvbCB0b29sIHdpbGwgYmUgZGlzYWJsZWQuIEJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGhlYXZ5IGNvbXByZXNzaW9uIGlzIGRpc2FibGVkLiAqLwoKICBBQUNfUU1GX0xPV1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDAsICAvKiE8IFF1YWRyYXR1cmUgTWlycm9yIEZpbHRlciAoUU1GKSBCYW5rIHByb2Nlc3NpbmcgbW9kZS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBVc2UgaW50ZXJuYWwgZGVmYXVsdC4gSW1wbGllcyBNUEVHIFN1cnJvdW5kIHBhcnRpYWxseSBjb21wbGV4IGFjY29yZGluZ2x5LiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFVzZSBjb21wbGV4IFFNRiBkYXRhIG1vZGUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogVXNlIHJlYWwgKGxvdyBwb3dlcikgUU1GIGRhdGEgbW9kZS4gXG4gKi8KCiAgQUFDX01QRUdTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwLCAgLyohPCBNUEVHIFN1cnJvdW5kOiBBbGxvdy9EaXNhYmxlIGRlY29kaW5nIG9mIE1QUyBjb250ZW50LiBBdmFpbGFibGUgb25seSBmb3IgZGVjb2RlcnMgd2l0aCBNUEVHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJyb3VuZCBzdXBwb3J0LiAqLwoKICBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSICAgICAgICAgICAgICAgICAgPSAweDA2MDMgICAvKiE8IENsZWFyIGludGVybmFsIGJpdCBzdHJlYW0gYnVmZmVyIG9mIHRyYW5zcG9ydCBsYXllcnMuIFRoZSBkZWNvZGVyIHdpbGwgc3RhcnQgZGVjb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IG5ldyBkYXRhIHBhc3NlZCBhZnRlciB0aGlzIGV2ZW50IGFuZCBhbnkgcHJldmlvdXMgZGF0YSBpcyBkaXNjYXJkZWQuICovCgp9IEFBQ0RFQ19QQVJBTTsKCi8qKgogKiBcYnJpZWYgVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBkZWNvZGVkIGF1ZGlvIGRhdGEuCiAqICAgICAgICBBbGwgZmllbGRzIGFyZSByZWFkLW9ubHkuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgLyogVGhlc2UgZml2ZSBtZW1iZXJzIGFyZSB0aGUgb25seSByZWFsbHkgcmVsZXZhbnQgb25lcyBmb3IgdGhlIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAvKiE8IFRoZSBzYW1wbGVyYXRlIGluIEh6IG9mIHRoZSBmdWxseSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwgKGFmdGVyIFNCUiBwcm9jZXNzaW5nKS4gICAqLwogIElOVCAgICAgICAgICAgICAgIGZyYW1lU2l6ZTsgICAgICAgICAgIC8qITwgVGhlIGZyYW1lIHNpemUgb2YgdGhlIGRlY29kZWQgUENNIGF1ZGlvIHNpZ25hbC4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggb3IgMTkyMCBmb3IgSEUtQUFDICh2MikgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiBvciA0ODAgZm9yIEFBQy1MRCBhbmQgQUFDLUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIElOVCAgICAgICAgICAgICAgIG51bUNoYW5uZWxzOyAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBvdXRwdXQgYXVkaW8gY2hhbm5lbHMgaW4gdGhlIGRlY29kZWQgYW5kIGludGVybGVhdmVkIFBDTSBhdWRpbyBzaWduYWwuICovCiAgQVVESU9fQ0hBTk5FTF9UWVBFICpwQ2hhbm5lbFR5cGU7ICAgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBVQ0hBUiAgICAgICAgICAgICAqcENoYW5uZWxJbmRpY2VzOyAgICAvKiE8IEF1ZGlvIGNoYW5uZWwgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMy4yIEV4cGxpY2l0IGNoYW5uZWwgbWFwcGluZyB1c2luZyBhIHByb2dyYW1fY29uZmlnX2VsZW1lbnQoKSAqLwogIC8qIERlY29kZXIgaW50ZXJuYWwgbWVtYmVycy4gKi8KICBJTlQgICAgICAgICAgICAgICBhYWNTYW1wbGVSYXRlOyAgICAgICAvKiE8IFNhbXBsaW5nIHJhdGUgaW4gSHogd2l0aG91dCBTQlIgKGZyb20gY29uZmlndXJhdGlvbiBpbmZvKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIElOVCAgICAgICAgICAgICAgIHByb2ZpbGU7ICAgICAgICAgICAgIC8qITwgTVBFRy0yIHByb2ZpbGUgKGZyb20gZmlsZSBoZWFkZXIpICgtMTogbm90IGFwcGxpY2FibGUgKGUuIGcuIE1QRUctNCkpLiAgICAgICAgICAgICAgICovCiAgQVVESU9fT0JKRUNUX1RZUEUgYW90OyAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpOiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KICBJTlQgICAgICAgICAgICAgICBjaGFubmVsQ29uZmlnOyAgICAgICAvKiE8IENoYW5uZWwgY29uZmlndXJhdGlvbiAoMDogUENFIGRlZmluZWQsIDE6IG1vbm8sIDI6IHN0ZXJlbywgLi4uICAgICAgICAgICAgICAgICAgICAgICAqLwogIElOVCAgICAgICAgICAgICAgIGJpdFJhdGU7ICAgICAgICAgICAgIC8qITwgSW5zdGFudGFuZW91cyBiaXQgcmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBhYWNTYW1wbGVzUGVyRnJhbWU7ICAvKiE8IFNhbXBsZXMgcGVyIGZyYW1lIGZvciB0aGUgQUFDIGNvcmUgKGZyb20gQVNDKS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiBvciA0ODAgZm9yIEFBQy1MRCBhbmQgQUFDLUVMRCAgICAgICAgICovCiAgSU5UICAgICAgICAgICAgICAgYWFjTnVtQ2hhbm5lbHM7ICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIGFmdGVyIEFBQyBjb3JlIHByb2Nlc3NpbmcgKGJlZm9yZSBQUyBvciBNUFMgcHJvY2Vzc2luZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGFyZSBub3QgdGhlIGZpbmFsIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMhICovCiAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QW90OyAgICAgICAgICAgICAgLyohPCBFeHRlbnNpb24gQXVkaW8gT2JqZWN0IFR5cGUgKGZyb20gQVNDKSAgICovCiAgSU5UICAgICAgICAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpICovCgogIFVJTlQgICAgICAgICAgICAgIG91dHB1dERlbGF5OyAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBvdXRwdXQgaXMgYWRkaXRpb25hbGx5IGRlbGF5ZWQgYnkgdGhlIGRlY29kZXIuICovCgogIFVJTlQgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgIC8qITwgQ29weSBvZiBpbnRlcm5hbCBmbGFncy4gT25seSB0byBiZSB3cml0dGVuIGJ5IHRoZSBkZWNvZGVyLCBhbmQgb25seSB0byBiZSByZWFkIGV4dGVybmFsbHkuICovCgogIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnOyAgICAgICAgICAgIC8qITwgZXBDb25maWcgbGV2ZWwgKGZyb20gQVNDKTogb25seSBsZXZlbCAwIHN1cHBvcnRlZCwgLTEgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KCiAgLyogU3RhdGlzdGljcyAqLwogIElOVCAgICAgICAgICAgICAgIG51bUxvc3RBY2Nlc3NVbml0czsgIC8qITwgVGhpcyBpbnRlZ2VyIHdpbGwgcmVmbGVjdCB0aGUgZXN0aW1hdGVkIGFtb3VudCBvZiBsb3N0IGFjY2VzcyB1bml0cyBpbiBjYXNlIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SLiBJdCB3aWxsIGJlIDwgMCBpZiB0aGUgZXN0aW1hdGlvbiBmYWlsZWQuICovCgogIFVJTlQgICAgICAgICAgICAgIG51bVRvdGFsQnl0ZXM7ICAgICAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KICBVSU5UICAgICAgICAgICAgICBudW1CYWRCeXRlczsgICAgICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCiAgVUlOVCAgICAgICAgICAgICAgbnVtVG90YWxBY2Nlc3NVbml0czsgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYWNjZXNzIHVuaXRzIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KICBVSU5UICAgICAgICAgICAgICBudW1CYWRBY2Nlc3NVbml0czsgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdCB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLwoKICAvKiBNZXRhZGF0YSAqLwogIFNDSEFSICAgICAgICAgICAgIGRyY1Byb2dSZWZMZXY7ICAgICAgIC8qITwgRFJDIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSByZWZlcmVuY2UgbGV2ZWwgYmVsb3cgZnVsbC1zY2FsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHF1YW50aXplZCBpbiBzdGVwcyBvZiAwLjI1ZEIuIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwICgwIGRCRlMpIHRvIDEyNyAoLTMxLjc1IGRCRlMpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byByZWZsZWN0IHRoZSBhdmVyYWdlIGxvdWRuZXNzIG9mIHRoZSBhdWRpbyBpbiBMS0ZTIGFjY29yaW5nIHRvIElUVS1SIEJTIDE3NzAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZSB2YWx1ZSBpcyAtMS4gKi8KICBTQ0hBUiAgICAgICAgICAgICBkcmNQcmVzTW9kZTsgICAgICAgICAvKiE8IERSQyBwcmVzZW50YXRpb24gbW9kZS4gQWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hldGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHQgKE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbCkgb3IgaGVhdnkgY29tcHJlc3Npb24gKERWQiBoZWF2eSBjb21wcmVzc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgcmFuZ2UgY29udHJvbCBzaGFsbCB0YWtlIHByaW9yaXR5IG9uIHRoZSBvdXRwdXRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBFVFNJIFRTIDEwMSAxNTQsIHRhYmxlIEMuMzMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogTm8gY29ycmVzcG9uZGluZyBtZXRhZGF0YSBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRFJDIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQgXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgMSBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IERSQyBwcmVzZW50YXRpb24gbW9kZSAyIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogUmVzZXJ2ZWQgKi8KCn0gQ1N0cmVhbUluZm87CgoKdHlwZWRlZiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgKkhBTkRMRV9BQUNERUNPREVSOyAgLyohPCBQb2ludGVyIHRvIGEgQUFDIGRlY29kZXIgaW5zdGFuY2UuICovCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgp7CiNlbmRpZgoKLyoqCiAqIFxicmllZiBJbml0aWFsaXplIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KICoKICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccGFyYW0gYnVmZmVyICBQb2ludGVyIHRvIChleHRlcm5hbCkgYW5jaWxsYXJ5IGRhdGEgYnVmZmVyLgogKiBccGFyYW0gc2l6ZSAgICBTaXplIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBidWZmZXIuCiAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfQW5jRGF0YUluaXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2l6ZSApOwoKLyoqCiAqIFxicmllZiBHZXQgb25lIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQuCiAqCiAqIFxwYXJhbSBzZWxmICAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccGFyYW0gaW5kZXggIEluZGV4IG9mIHRoZSBhbmNpbGxhcnkgZGF0YSBlbGVtZW50IHRvIGdldC4KICogXHBhcmFtIHB0ciAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgogKiBccGFyYW0gc2l6ZSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgogKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfQW5jRGF0YUdldCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgKipwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnNpemUgKTsKCi8qKgogKiBcYnJpZWYgU2V0IG9uZSBzaW5nbGUgZGVjb2RlciBwYXJhbWV0ZXIuCiAqCiAqIFxwYXJhbSBzZWxmICAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccGFyYW0gcGFyYW0gIFBhcmFtZXRlciB0byBiZSBzZXQuCiAqIFxwYXJhbSB2YWx1ZSAgUGFyYW1ldGVyIHZhbHVlLgogKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0RFQ19QQVJBTSAgICAgICBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSApOwoKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgIEdldCBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgogKiBccGFyYW0gc2VsZiAgICBIYW5kbGUgb2YgQUFDIGRlY29kZXIgaW5zdGFuY2UKICogXHBhcmFtIHBGcmVlQnl0ZXMgUG9pbnRlciB0byB2YXJpYWJsZSByZWNldmluZyBhbW91bnQgb2YgZnJlZSBieXRlcyBpbnNpZGUgZGVjb2RlciBpbnRlcm5hbCBidWZmZXIKICogXHJldHVybiAgICAgICAgICAgICBFcnJvciBjb2RlCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfR2V0RnJlZUJ5dGVzICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcEZyZWVCeXRlcyk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgT3BlbiBhbiBBQUMgZGVjb2RlciBpbnN0YW5jZQogKiBccGFyYW0gdHJhbnNwb3J0Rm10ICBUaGUgdHJhbnNwb3J0IHR5cGUgdG8gYmUgdXNlZAogKiBccmV0dXJuICAgICAgICAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUKICovCkxJTktTUEVDX0ggSEFORExFX0FBQ0RFQ09ERVIKYWFjRGVjb2Rlcl9PcGVuICggVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LCBVSU5UIG5yT2ZMYXllcnMgKTsKCi8qKgogKiBcYnJpZWYgRXhwbGljaXRseSBjb25maWd1cmUgdGhlIGRlY29kZXIgYnkgcGFzc2luZyBhIHJhdyBBdWRpb1NwZWNpZmljQ29uZmlnIChBU0MpIG9yIGEgU3RyZWFtTXV4Q29uZmlnIChTTUMpLAogKiAgY29udGFpbmVkIGluIGEgYmluYXJ5IGJ1ZmZlci4gVGhpcyBpcyByZXF1aXJlZCBmb3IgTVBFRy00IGFuZCBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCBiaXRzdHJlYW1zCiAqICBhcyB3ZWxsIGFzIGZvciBMQVRNIGJpdHN0cmVhbXMgd2l0aCBubyBpbi1iYW5kIFNNQy4gSWYgdGhlIHRyYW5zcG9ydCBmb3JtYXQgaXMgTEFUTSB3aXRoIG9yIHdpdGhvdXQKICogIExPQVMsIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBhbiBTTUMsIGZvciBhbGwgb3RoZXIgZmlsZSBmb3JtYXRzIGFuIEFTQy4KICoKICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccGFyYW0gY29uZiAgICBQb2ludGVyIHRvIGFuIHVuc2lnbmVkIGNoYXIgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJpbmFyeSBjb25maWd1cmF0aW9uIGJ1ZmZlciAoZWl0aGVyIEFTQyBvciBTTUMpLgogKiBccGFyYW0gbGVuZ3RoICBMZW5ndGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gYnVmZmVyIGluIGJ5dGVzLgogKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0NvbmZpZ1JhdyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAqY29uZltdLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgIGxlbmd0aFtdICk7CgoKLyoqCiAqIFxicmllZiBGaWxsIEFBQyBkZWNvZGVyJ3MgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgogKiAgVGhlIGZ1bmN0aW9uIG9ubHkgY29waWVzIHN1Y2ggZGF0YSBhcyBsb25nIGFzIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBub3QgZnVsbC4KICogIFNvIGl0IGdyYWJzIHdoYXRldmVyIGl0IGNhbiBmcm9tIHBCdWZmZXIgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gKGJ5dGVzVmFsaWQpIHNvIHRoYXQgYXQgYQogKiAgc3Vic2VxdWVudCBjYWxsIG9mICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KICogIGdyYWIgdGhlIG5leHQgZGF0YS4KICoKICogXHBhcmFtIHNlbGYgICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBCdWZmZXIgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgogKiBccGFyYW0gYnVmZmVyU2l6ZSAgU2l6ZSBvZiBleHRlcm5hbCBpbnB1dCBidWZmZXIuIFRoaXMgYXJndW1lbnQgaXMgcmVxdWlyZWQgYmVjYXVzZSBkZWNvZGVyLWludGVybmFsbHkKICogICAgICAgICAgICAgICAgICAgIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHRvIHBCdWZmZXIsIHdoZXJlIHRoZSBuZXh0CiAqICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZGF0YSBpcywgd2hpY2ggaXMgdGhlbiBmZWQgaW50byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBidWZmZXIgKGFzIG11Y2gKICogICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlKS4gT3VyIGV4YW1wbGUgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIGZpbGxzIHRoZSBidWZmZXIgYXQgcEJ1ZmZlcgogKiAgICAgICAgICAgICAgICAgICAgYWdhaW4sIG9uY2UgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlIHZhbGlkIGJ5dGVzIGFueW1vcmUgKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KICogXHBhcmFtIGJ5dGVzVmFsaWQgIE51bWJlciBvZiBiaXRzdHJlYW0gYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJpdHN0cmVhbSBidWZmZXIgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgogKiAgICAgICAgICAgICAgICAgICAgY29waWVkIGludG8gdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICogICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIG5ld2x5IGNvcGllZCBieXRlcy4KICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfRmlsbCAoIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAogICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAqcEJ1ZmZlcltdLAogICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgYnVmZmVyU2l6ZVtdLAogICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAqYnl0ZXNWYWxpZCApOwoKI2RlZmluZSBBQUNERUNfQ09OQ0VBTCAgMSAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogVHJpZ2dlciB0aGUgYnVpbHQtaW4gZXJyb3IgY29uY2VhbG1lbnQgbW9kdWxlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2VuZXJhdGUgYSBzdWJzdGl0dXRlIHNpZ25hbCBmb3Igb25lIGxvc3QgZnJhbWUuIE5ldyBpbnB1dCBkYXRhIHdpbGwgbm90IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyZWQuICovCiNkZWZpbmUgQUFDREVDX0ZMVVNIICAgIDIgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IEZsdXNoIGFsbCBmaWx0ZXJiYW5rcyB0byBnZXQgYWxsIGRlbGF5ZWQgYXVkaW8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGhhdmluZyBuZXcgaW5wdXQgZGF0YS4gVGh1cyBuZXcgaW5wdXQgZGF0YSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkLiovCiNkZWZpbmUgQUFDREVDX0lOVFIgICAgIDQgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IFNpZ25hbCBhbiBpbnB1dCBiaXQgc3RyZWFtIGRhdGEgZGlzY29udGludWl0eS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN5bmMgYW55IGludGVybmFscyBhcyBuZWNlc3NhcnkuICovCiNkZWZpbmUgQUFDREVDX0NMUkhJU1QgIDggLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IENsZWFyIGFsbCBzaWduYWwgZGVsYXkgbGluZXMgYW5kIGhpc3RvcnkgYnVmZmVycy5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBVVRJT046IFRoaXMgY2FuIGNhdXNlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgb3V0cHV0IHNpZ25hbC4gKi8KCi8qKgogKiBcYnJpZWYgICAgICAgICAgICBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lCiAqCiAqIFxwYXJhbSBzZWxmICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICogXHBhcmFtIHBUaW1lRGF0YSAgUG9pbnRlciB0byBleHRlcm5hbCBvdXRwdXQgYnVmZmVyIHdoZXJlIHRoZSBkZWNvZGVkIFBDTSBzYW1wbGVzIHdpbGwgYmUgc3RvcmVkIGludG8uCiAqIFxwYXJhbSBmbGFncyAgICAgIEJpdCBmaWVsZCB3aXRoIGZsYWdzIGZvciB0aGUgZGVjb2RlcjogXG4KICogICAgICAgICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpID09IDE6IERvIGNvbmNlYWxtZW50LiBcbgogKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpID09IDI6IERpc2NhcmQgaW5wdXQgZGF0YS4gRmx1c2ggZmlsdGVyIGJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuIFxuCiAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19JTlRSKSA9PSA0OiBJbnB1dCBkYXRhIGlzIGRpc2NvbnRpbnVvdXMuIFJlc3luY2hyb25pemUgYW55IGludGVybmFscyBhcyBuZWNlc3NhcnkuCiAqIFxyZXR1cm4gICAgICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfRGVjb2RlRnJhbWUgKCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICpwVGltZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgIGZsYWdzICk7CgovKioKICogXGJyaWVmICAgICAgIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMgb2YgYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UuCiAqCiAqIFxwYXJhbSBzZWxmICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxyZXR1cm4gICAgICB2b2lkCiAqLwpMSU5LU1BFQ19IIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgR2V0IENTdHJlYW1JbmZvIGhhbmRsZSBmcm9tIGRlY29kZXIuCiAqCiAqIFxwYXJhbSBzZWxmICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxyZXR1cm4gICAgICBSZWZlcmVuY2UgdG8gcmVxdWVzdGVkIENTdHJlYW1JbmZvLgogKi8KTElOS1NQRUNfSCBDU3RyZWFtSW5mbyogYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CgovKioKICogXGJyaWVmICAgICAgIEdldCBkZWNvZGVyIGxpYnJhcnkgaW5mby4KICoKICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KICogXHJldHVybiAgICAgIDAgb24gc3VjY2VzcwogKi8KTElOS1NQRUNfSCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApOwoKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmIC8qIEFBQ0RFQ09ERVJfTElCX0ggKi8K