Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICogXGZpbGUgICBhYWNkZWNvZGVyX2xpYi5oCiAqIFxicmllZiAgRkRLIEFBQyBkZWNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgogKgoKXHBhZ2UgSU5UUk8gSW50cm9kdWN0aW9uCgpcc2VjdGlvbiBTQ09QRSBTY29wZQoKVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80IEFBQyBEZWNvZGVyCmxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KRGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24sIGl0IGltcGxlbWVudHMgZGVjb2Rpbmcgb2YgQUFDLUxDIChMb3ctQ29tcGxleGl0eSksCkhFLUFBQyAoSGlnaC1FZmZpY2llbmN5IEFBQywgdjEgYW5kIHYyKSwgQUFDLUxEIChMb3ctRGVsYXkpIGFuZCBBQUMtRUxEIChFbmhhbmNlZCBMb3ctRGVsYXkpLgoKQWxsIHJlZmVyZW5jZXMgdG8gU0JSIChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQyBhbmQgQUFDLUVMRAp2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvCkhFLUFBQyB2MiB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KClxzZWN0aW9uIERlY29kZXJCYXNpY3MgRGVjb2RlciBCYXNpY3MKClRoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00IEFBQyBhdWRpbwpjb2Rpbmcgc3RhbmRhcmQuIFRvIHVuZGVyc3RhbmQgYWxsIHRoZSB0ZXJtcyBpbiB0aGlzIGRvY3VtZW50LCB5b3UgYXJlIGVuY291cmFnZWQgdG8gcmVhZAp0aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KCi0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLSBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBBQUMsIHN1YnBhcnQgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAoKTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mIHRoZSBzaWduYWwuIFRoZSBzaWduYWwKaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKY29tcG9uZW50cyBhcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLlxuCkFuIE1QRUcyIG9yIE1QRUc0IEFBQyBhdWRpbyBiaXRzdHJlYW0gaXMgY29tcG9zZWQgb2YgZnJhbWVzLiBDb250cmFyeSB0byBNUEVHLTEvMiBMYXllci0zIChtcDMpLAp0aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KCgpccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQoKXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpdHBpb24gQVBJIERlc2NyaXB0aW9uCgpBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgpkZXRhaWwgaW4gdGhpcyBkb2N1bWVudC4gQWxsIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGRlY29kZXIgbGlicmFyeQpBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGF0IGFhY2RlY29kZXJfbGliLmguCgpJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGRlY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzIGNhbGxlZCBmb3IgZXhhbXBsZSBsaWJBQUNkZWMuYSwKKExpbnV4KSBvciBGREtfYWFjRGVjX2xpYiAoTWljcm9zb2Z0IFZpc3VhbCBDKyspLgoKXHNlY3Rpb24gQ2FsbGluZ19TZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCgpGb3IgZGVjb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBvciBIRS1BQUMgdjIgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZAphbmQgb3V0cHV0IHdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kIGNsb3NlIGZ1bmN0aW9ucyBhcmUgbGVmdCBvdXQsIHNpbmNlIHRoZXkKbWF5IGJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGFjY29yZGluZyB0byB0aGUgdXNlcidzIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gaW4KbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dCwgYW5kIGluIHN1Y2ggY2FzZSBjYWxsIG1wZWdGaWxlUmVhZF9PcGVuKCkgdG8gb3BlbiBhbiBpbnB1dCBmaWxlIGFuZAp0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkgdG8gY2xvc2Ugb3BlbmVkCmZpbGVzIGFuZCB0byBkZS1hbGxvY2F0ZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMuIG1wZWdGaWxlUmVhZF9PcGVuKCkgdHJpZXMgdG8gZGV0ZWN0IHRoZSBiaXRzdHJlYW0gZm9ybWF0IGFuZAppbiBjYXNlIG9mIE1QRUctNCBmaWxlIGZvcm1hdCBvciBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCAoYSBGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpIHJlYWRzIHRoZSBBdWRpbwpTcGVjaWZpYyBDb25maWcgZGF0YSAoQVNDKS4gQW4gdW5zdWNjZXNzZnVsIGF0dGVtcHQgdG8gcmVjb2duaXplIHRoZSBiaXRzdHJlYW0gZm9ybWF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvCnByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseSAoc2VlIFxyZWYgQ29tbWFuZExpbmVVc2FnZSkuIEZvciBhbnkgb3RoZXIgYml0c3RyZWFtIGZvcm1hdHMgdGhhdCBhcmUKdXN1YWxseSBhcHBsaWNhYmxlIGluIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMsIHRoZSBkZWNvZGVyIGl0c2VsZiB3aWxsIHRyeSB0byBzeW5jaHJvbml6ZSBhbmQgcGFyc2UgdGhlIGdpdmVuCmJpdHN0cmVhbSBmcmFnbWVudCB1c2luZyB0aGUgRkRLIHRyYW5zcG9ydCBsaWJyYXJ5LiBIZW5jZSwgZm9yIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMgKHdpdGhvdXQgZmlsZSBhY2Nlc3MpCnRoaXMgc3RlcCBpcyBub3QgbmVjZXNzYXJ5LgoKLSMgQ2FsbCBhYWNEZWNvZGVyX09wZW4oKSB0byBvcGVuIGFuZCByZXRyaWV2ZSBhIGhhbmRsZSB0byBhIG5ldyBBQUMgZGVjb2RlciBpbnN0YW5jZS4KXGRvbnRpbmNsdWRlIG1haW4uY3BwClxza2lwbGluZSBhYWNEZWNvZGVyX09wZW4KLSMgSWYgb3V0LW9mLWJhbmQgY29uZmlnIGRhdGEgKEF1ZGlvIFNwZWNpZmljIENvbmZpZyAoQVNDKSBvciBTdHJlYW0gTXV4IENvbmZpZyAoU01DKSkgaXMgYXZhaWxhYmxlLCBjYWxsCmFhY0RlY29kZXJfQ29uZmlnUmF3KCkgdG8gcGFzcyBpdCB0byB0aGUgZGVjb2RlciBhbmQgYmVmb3JlIHRoZSBkZWNvZGluZyBwcm9jZXNzIHN0YXJ0cy4gSWYgdGhpcyBkYXRhIGlzCm5vdCBhdmFpbGFibGUgaW4gYWR2YW5jZSwgdGhlIGRlY29kZXIgd2lsbCBnZXQgaXQgZnJvbSB0aGUgYml0c3RyZWFtICBhbmQgY29uZmlndXJlIGl0c2VsZiB3aGlsZSBkZWNvZGluZwp3aXRoIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4KLSMgQmVnaW4gZGVjb2RpbmcgbG9vcC4KXHNraXBsaW5lIGRvIHsKLSMgUmVhZCBkYXRhIGZyb20gYml0c3RyZWFtIGZpbGUgb3Igc3RyZWFtIGludG8gYSBjbGllbnQtc3VwcGxpZWQgaW5wdXQgYnVmZmVyICgiaW5CdWZmZXIiIGluIG1haW4uY3BwKS4KSWYgaXQgaXMgdmVyeSBzbWFsbCBsaWtlIGp1c3QgNCwgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIHdpbGwKcmVwZWF0ZWRseSByZXR1cm4gOjpBQUNfREVDX05PVF9FTk9VR0hfQklUUyB1bnRpbCBlbm91Z2ggYml0cyB3ZXJlIGZlZCBieSBhYWNEZWNvZGVyX0ZpbGwoKS4gT25seSByZWFkIGRhdGEKd2hlbiB0aGlzIGJ1ZmZlciBoYXMgY29tcGxldGVseSBiZWVuIHByb2Nlc3NlZCBhbmQgaXMgdGhlbiBlbXB0eS4gRm9yIGZpbGUtYmFzZWQgaW5wdXQgZXhlY3V0ZQptcGVnRmlsZVJlYWRfUmVhZCgpIG9yIGFueSBvdGhlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSMgQ2FsbCBhYWNEZWNvZGVyX0ZpbGwoKSB0byBmaWxsIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGlucHV0IGJ1ZmZlciB3aXRoIHRoZSBjbGllbnQtc3VwcGxpZWQKZXh0ZXJuYWwgYml0c3RyZWFtIGlucHV0IGJ1ZmZlci4KXHNraXBsaW5lIGFhY0RlY29kZXJfRmlsbAotIyBDYWxsIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSB3aGljaCB3cml0ZXMgZGVjb2RlZCBQQ00gYXVkaW8gZGF0YSB0byBhIGNsaWVudC1zdXBwbGllZCBidWZmZXIuIEl0IGlzIHRoZQpjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGlzIG91dHB1dCBkYXRhLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZQpJZiB0aGUgYml0c3RyZWFtJ3MgY29uZmlndXJhdGlvbiAobnVtYmVyIG9mIGNoYW5uZWxzLCBzYW1wbGUgcmF0ZSwgZnJhbWUgc2l6ZSkgaXMgbm90IGtub3duIGluIGFkdmFuY2UsIHlvdSBtYXkKY2FsbCBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKSB0byByZXRyaWV2ZSBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZW4gaW5pdGlhbGl6ZSBhbiBhdWRpbwpvdXRwdXQgZGV2aWNlLiBJbiB0aGUgZXhhbXBsZSBtYWluLmNwcCwgaWYgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQgc2luY2UgcHJvZ3JhbQpzdGFydCBvciBzaW5jZSB0aGUgcHJldmlvdXNseSBkZWNvZGVkIGZyYW1lLCB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSB3aWxsIGJlIHJlLWluaXRpYWxpemVkLiBJZiBXQVZFIGZpbGUgb3V0cHV0CmlzIGNob3NlbiwgYSBuZXcgV0FWRSBmaWxlIGZvciBlYWNoIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZC4KXHNraXBsaW5lIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbwotIyBSZXBlYXQgc3RlcHMgNSB0byA3IHVudGlsIG5vIGRhdGEgdG8gZGVjb2RlIGlzIGF2YWlsYWJsZSBhbnltb3JlLCBvciBpZiBhbiBlcnJvciBvY2N1cmVkLgpcc2tpcGxpbmUgfSB3aGlsZQotIyBDYWxsIGFhY0RlY29kZXJfQ2xvc2UoKSB0byBkZS1hbGxvY2F0ZSBhbGwgQUFDIGRlY29kZXIgYW5kIHRyYW5zcG9ydCBsYXllciBzdHJ1Y3R1cmVzLgpcc2tpcGxpbmUgYWFjRGVjb2Rlcl9DbG9zZQoKXHNlY3Rpb24gQnVmZmVyU3lzdGVtIEJ1ZmZlciBTeXN0ZW0KClRoZXJlIGFyZSB0aHJlZSBtYWluIGJ1ZmZlcnMgaW4gYW4gQUFDIGRlY29kZXIgYXBwbGljYXRpb24uIE9uZSBleHRlcm5hbCBpbnB1dCBidWZmZXIgdG8gaG9sZCBiaXRzdHJlYW0KZGF0YSBmcm9tIGZpbGUgSS9PIG9yIGVsc2V3aGVyZSwgb25lIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCBhbmQgb25lIHRvIGhvbGQgdGhlIGRlY29kZWQgb3V0cHV0ClBDTSBzYW1wbGUgZGF0YSwgd2hlcmVhcyB0aGlzIG91dHB1dCBidWZmZXIgbWF5IG92ZXJsYXAgd2l0aCB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgoKVGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdGhlIGV4YW1wbGUgZnJhbWV3b3JrIG1haW4uY3BwIGFuZCBpdHMgc2l6ZSBpcyBkZWZpbmVkIGJ5IDo6SU5fQlVGX1NJWkUuCllvdSBtYXkgZnJlZWx5IGNob29zZSBkaWZmZXJlbnQgc2l6ZXMgaGVyZS4gVG8gZmVlZCB0aGUgZGF0YSB0byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIHVzZSB0aGUKZnVuY3Rpb24gYWFjRGVjb2Rlcl9GaWxsKCkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgaG93IG1hbnkgYnl0ZXMgaW4gdGhlCmV4dGVybmFsIGlucHV0IGJ1ZmZlciBoYXZlIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgaW50ZXJuYWwgaW5wdXQgYnVmZmVyICh2YXJpYWJsZSBieXRlc1ZhbGlkKS4KT25jZSB0aGUgZXh0ZXJuYWwgYnVmZmVyIGhhcyBiZWVuIGZ1bGx5IGNvcGllZCwgaXQgY2FuIGJlIHJlLWZpbGxlZCBhZ2Fpbi4KSW4gY2FzZSB5b3Ugd2FudCB0byByZS1maWxsIGl0IHdoZW4gdGhlcmUgYXJlIHN0aWxsIHVucHJvY2Vzc2VkIGJ5dGVzIChieXRlc1ZhbGlkIGlzIHVuZXF1YWwgMCksIHlvdQp3b3VsZCBoYXZlIHRvIGFkZGl0aW9uYWxseSBwZXJmb3JtIGEgbWVtY3B5KCksIHNvIHRoYXQganVzdCBtZWFucyB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbmFsIG92ZXJoZWFkCmFuZCB0aGVyZWZvcmUgd2UgcmVjb21tZW5kIHRvIHJlLWZpbGwgdGhlIGJ1ZmZlciBvbmx5IHdoZW4gYnl0ZXNWYWxpZCBpcyAwLgoKXGltYWdlIGxhdGV4IGRlY19idWZmZXIucG5nICJMaWZlY3ljbGUgb2YgdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciIgd2lkdGg9OWNtCgpUaGUgc2l6ZSBvZiB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgc2V0IGluIHRwZGVjX2xpYi5oIChzZWUgZGVmaW5lIDo6VFJBTlNQT1JUREVDX0lOQlVGX1NJWkUpLgpZb3UgbWF5IGNob29zZSBhIHNtYWxsZXIgc2l6ZSB1bmRlciB0aGUgZm9sbG93aW5nIGNvbnNpZGVyYXRpb25zOgoKLSBlYWNoIGlucHV0IGNoYW5uZWwgcmVxdWlyZXMgNzY4IGJ5dGVzCi0gdGhlIHdob2xlIGJ1ZmZlciBtdXN0IGJlIG9mIHNpemUgMl5uCgpTbyBmb3IgZXhhbXBsZSBhIHN0ZXJlbyBkZWNvZGVyOgoKXGZbClRSQU5TUE9SVERFQ1xfSU5CVUZcX1NJWkUgPSAyICogNzY4ID0gMTUzNiA9PiAyMDQ4ClxmXQoKdHBkZWNfbGliLmggYW5kIFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFIGFyZSBub3QgcGFydCBvZiB0aGUgZGVjb2RlcidzIGxpYnJhcnkgaW50ZXJmYWNlLiBUaGVyZWZvcmUKb25seSBzb3VyY2UtY29kZSBjbGllbnRzIG1heSBjaGFuZ2UgdGhpcyBzZXR0aW5nLiBJZiB5b3UgcmVjZWl2ZWQgYSBsaWJyYXJ5IHJlbGVhc2UsIHBsZWFzZSBhc2sgdXMgYW5kCndlIGNhbiBjaGFuZ2UgdGhpcyBpbiBvcmRlciB0byBtZWV0IHlvdXIgbWVtb3J5IHJlcXVpcmVtZW50cy4KClxwYWdlIE91dHB1dEZvcm1hdCBEZWNvZGVyIGF1ZGlvIG91dHB1dAoKXHNlY3Rpb24gT3V0cHV0Rm9ybWF0T2J0YWluaW5nIE9idGFpbmluZyBjaGFubmVsIG1hcHBpbmcgaW5mb3JtYXRpb24KClRoZSBkZWNvZGVkIGF1ZGlvIG91dHB1dCBmb3JtYXQgaXMgaW5kaWNhdGVkIGJ5IGEgc2V0IG9mIHZhcmlhYmxlcyBvZiB0aGUgQ1N0cmVhbUluZm8gc3RydWN0dXJlLgpXaGlsZSB0aGUgbWVtYmVycyBzYW1wbGVSYXRlLCBmcmFtZVNpemUgYW5kIG51bUNoYW5uZWxzIG1pZ2h0IGJlIHF1aXRlIHNlbGYgZXhwbGFpbmluZywKcENoYW5uZWxUeXBlIGFuZCBwQ2hhbm5lbEluZGljZXMgbWlnaHQgcmVxdWlyZSBzb21lIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCgpUaGVzZSB0d28gYXJyYXlzIGluZGljYXRlIHdoYXQgaXMgZWFjaCBvdXRwdXQgY2hhbm5lbCBzdXBwb3NlZCB0byBiZS4gQm90aCBhcnJheSBoYXZlCkNTdHJlYW1JbmZvOjpudW1DaGFubmVscyBjZWxscy4gRWFjaCBjZWxsIG9mIHBDaGFubmVsVHlwZSBpbmRpY2F0ZXMgdGhlIGNoYW5uZWwgdHlwZSwgZGVzY3JpYmVkIGluCnRoZSBlbnVtIDo6QVVESU9fQ0hBTk5FTF9UWVBFIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmguIFRoZSBjZWxscyBvZiBwQ2hhbm5lbEluZGljZXMgaW5kaWNhdGUgdGhlIHN1YiBpbmRleAphbW9uZyB0aGUgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCAwIGFtb25nIGFsbCBjaGFubmVscyBvZiB0aGUgc2FtZSBhdWRpbyBjaGFubmVsIHR5cGUuCgpUaGUgaW5kZXhpbmcgc2NoZW1lIGlzIHRoZSBzYW1lIGFzIGZvciBNUEVHLTIvNC4gVGh1cyBpbmRpY2VzIGFyZSBjb3VudGVkIHVwd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgZnJvbnQKZGlyZWN0aW9uICh0aHVzIGEgY2VudGVyIGNoYW5uZWwgaWYgYW55LCB3aWxsIGFsd2F5cyBiZSBpbmRleCAwKS4gVGhlbiB0aGUgaW5kaWNlcyBjb3VudCB1cCwgc3RhcnRpbmcgYWx3YXlzCndpdGggdGhlIGxlZnQgc2lkZSwgcGFpcndpc2UgZnJvbSBmcm9udCB0b3dhcmQgYmFjay4gRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLCBwbGVhc2UgcmVmZXIgdG8KSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIGNoYXB0ZXIgOC41LjMuMi4KCkluIGNhc2UgYSBQcm9ncmFtIENvbmZpZyBpcyBpbmNsdWRlZCBpbiB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiwgdGhlIGNoYW5uZWwgbWFwcGluZyBkZXNjcmliZWQgd2l0aGluCml0IHdpbGwgYmUgYWRvcHRlZC4KCkluIGNhc2Ugb2YgTVBFRy1EIFN1cnJvdW5kIHRoZSBjaGFubmVsIG1hcHBpbmcgd2lsbCBmb2xsb3cgdGhlIHNhbWUgY3JpdGVyaWEgZGVzY3JpYmVkIGluIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLApidXQgYWRkaW5nIGNvcnJlc3BvbmRpbmcgdG9wIGNoYW5uZWxzIHRvIHRoZSBjaGFubmVsIHR5cGVzIGZyb250LCBzaWRlIGFuZCBiYWNrLCBpbiBvcmRlciB0byBhdm9pZCBhbnkKbG9zcyBvZiBpbmZvcm1hdGlvbi4KClxzZWN0aW9uIE91dHB1dEZvcm1hdENoYW5nZSBDaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGZvcm1hdAoKVGhlIGNoYW5uZWwgaW50ZXJsZWF2aW5nIHNjaGVtZSBhbmQgdGhlIGFjdHVhbCBjaGFubmVsIG9yZGVyIGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgdGhyb3VnaCB0aGUKcGFyYW1ldGVycyA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZQpwYXJhbWV0ZXJzIGFuZCB0aGUgZGVjb2RlciBsaWJyYXJ5IGZ1bmN0aW9uIGFhY0RlY29kZXJfU2V0UGFyYW0oKSBmb3IgbW9yZSBkZXRhaWwuCgpcc2VjdGlvbiBPdXRwdXRGb3JtYXRFeGFtcGxlIENoYW5uZWwgbWFwcGluZyBleGFtcGxlcwoKVGhlIGZvbGxvd2luZyBleGFtcGxlcyBpbGx1c3RyYXRlIHRoZSBsb2NhdGlvbiBvZiBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGF0CmlzIHBhc3NlZCB0byBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgYW5kIHRoZSBleHBlY3RlZCBkYXRhIGluIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUgd2hpY2ggY2FuIGJlIG9idGFpbmVkCmJ5IGNhbGxpbmcgYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCkuCgpcc3Vic2VjdGlvbiBFeGFtcGxlc1N0ZXJlbyBTdGVyZW8KCkluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMCBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCmEgQUFDLUxDIGJpdCBzdHJlYW0gd2hpY2ggaGFzIGNoYW5uZWxDb25maWd1cmF0aW9uID0gMiBpbiBpdHMgYXVkaW8gc3BlY2lmaWMgY29uZmlnIHdvdWxkIGxlYWQKdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CgpDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSAyCgpDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlID0geyA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQgfQoKQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcyA9IHsgMCwgMSB9CgpTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAwLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBsb2NhdGVkIGFzIGNvbnRpZ3VvdXMgYmxvY2tzCmluIHRoZSBvdXRwdXQgYnVmZmVyIGFzIGZvbGxvd3M6CgpcdmVyYmF0aW0KICA8bGVmdCBzYW1wbGUgMD4gIDxsZWZ0IHNhbXBsZSAxPiAgPGxlZnQgc2FtcGxlIDI+ICAuLi4gPGxlZnQgc2FtcGxlIE4+CiAgPHJpZ2h0IHNhbXBsZSAwPiA8cmlnaHQgc2FtcGxlIDE+IDxyaWdodCBzYW1wbGUgMj4gLi4uIDxyaWdodCBzYW1wbGUgTj4KXGVuZHZlcmJhdGltCgpXaGVyZSBOIGVxdWFscyB0byBDU3RyZWFtSW5mbzo6ZnJhbWVTaXplIC4KClxzdWJzZWN0aW9uIEV4YW1wbGVzU3Vycm91bmQgU3Vycm91bmQgNS4xCgpJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDEgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAphIEFBQy1MQyBiaXQgc3RyZWFtIHdoaWNoIGhhcyBjaGFubmVsQ29uZmlndXJhdGlvbiA9IDYgaW4gaXRzIGF1ZGlvIHNwZWNpZmljIGNvbmZpZywgd291bGQgbGVhZAp0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbiBDU3RyZWFtSW5mbzoKCkNTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDYKCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0xGRSwgOjpBQ1RfQkFDSywgOjpBQ1RfQkFDSyB9CgpDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzID0geyAxLCAyLCAwLCAwLCAwLCAxIH0KClNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIGlzIDEsIFdBViBmaWxlIGNoYW5uZWwgb3JkZXJpbmcgd2lsbCBiZSB1c2VkLiBGb3IgYSA1LjEgY2hhbm5lbApzY2hlbWUsIHRodXMgdGhlIGNoYW5uZWxzIHdvdWxkIGJlOiBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgY2VudGVyLCBMRkUsIHN1cnJvdW5kIGxlZnQsIHN1cnJvdW5kIHJpZ2h0LgpUaHVzIHRoZSB0aGlyZCBjaGFubmVsIGlzIHRoZSBjZW50ZXIgY2hhbm5lbCwgcmVjZWl2aW5nIHRoZSBpbmRleCAwLiBUaGUgb3RoZXIgZnJvbnQgY2hhbm5lbHMgYXJlCmZyb250IGxlZnQsIGZyb250IHJpZ2h0IGJlaW5nIHBsYWNlZCBhcyBmaXJzdCBhbmQgc2Vjb25kIGNoYW5uZWxzIHdpdGggaW5kaWNlcyAxIGFuZCAyIGNvcnJlc3BvbmRpbmdseS4KVGhlcmUgaXMgb25seSBvbmUgTEZFLCBwbGFjZWQgYXMgdGhlIGZvdXJ0aCBjaGFubmVsIGFuZCBpbmRleCAwLiBGaW5hbGx5IGJvdGggc3Vycm91bmQKY2hhbm5lbHMgZ2V0IHRoZSB0eXBlIGRlZmluaXRpb24gQUNUX0JBQ0ssIGFuZCB0aGUgaW5kaWNlcyAwIGFuZCAxLgoKU2luY2UgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBpcyBzZXQgdG8gMSwgdGhlIGF1ZGlvIGNoYW5uZWxzIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBvdXRwdXQgYnVmZmVyCmFzIGZvbGxvd3M6CgpcdmVyYmF0aW0KPGZyb250IGxlZnQgc2FtcGxlIDA+IDxmcm9udCByaWdodCBzYW1wbGUgMD4KPGNlbnRlciBzYW1wbGUgMD4gPExGRSBzYW1wbGUgMD4KPHN1cnJvdW5kIGxlZnQgc2FtcGxlIDA+IDxzdXJyb3VuZCByaWdodCBzYW1wbGUgMD4KCjxmcm9udCBsZWZ0IHNhbXBsZSAxPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIDE+CjxjZW50ZXIgc2FtcGxlIDE+IDxMRkUgc2FtcGxlIDE+CjxzdXJyb3VuZCBsZWZ0IHNhbXBsZSAxPiA8c3Vycm91bmQgcmlnaHQgc2FtcGxlIDE+CgouLi4KCjxmcm9udCBsZWZ0IHNhbXBsZSBOPiA8ZnJvbnQgcmlnaHQgc2FtcGxlIE4+CjxjZW50ZXIgc2FtcGxlIE4+IDxMRkUgc2FtcGxlIE4+CjxzdXJyb3VuZCBsZWZ0IHNhbXBsZSBOPiA8c3Vycm91bmQgcmlnaHQgc2FtcGxlIE4+ClxlbmR2ZXJiYXRpbQoKV2hlcmUgTiBlcXVhbHMgdG8gQ1N0cmVhbUluZm86OmZyYW1lU2l6ZSAuCgpcc3Vic2VjdGlvbiBFeGFtcGxlc0FyaWIgQVJJQiBjb2RpbmcgbW9kZSAyLzEKCkluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMSBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCmluIGNhc2Ugb2YgYSBBUklCIGJpdCBzdHJlYW0gdXNpbmcgY29kaW5nIG1vZGUgMi8xIGFzIGRlc2NyaWJlZCBpbiBBUklCIFNURC1CMzIgUGFydCAyIFZlcnNpb24gMi4xLUUxLCBwYWdlIDYxLAp3b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgoKQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzID0gMwoKQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSA9IHsgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULDo6IEFDVF9CQUNLIH0KCkNTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEsIDAgfQoKVGhlIGF1ZGlvIGNoYW5uZWxzIHdpbGwgYmUgcGxhY2VkIGFzIGZvbGxvd3MgaW4gdGhlIGF1ZGlvIG91dHB1dCBidWZmZXI6CgpcdmVyYmF0aW0KPGZyb250IGxlZnQgc2FtcGxlIDA+IDxmcm9udCByaWdodCBzYW1wbGUgMD4gIDxtaWQgc3Vycm91bmQgc2FtcGxlIDA+Cgo8ZnJvbnQgbGVmdCBzYW1wbGUgMT4gPGZyb250IHJpZ2h0IHNhbXBsZSAxPiA8bWlkIHN1cnJvdW5kIHNhbXBsZSAxPgoKLi4uCgo8ZnJvbnQgbGVmdCBzYW1wbGUgTj4gPGZyb250IHJpZ2h0IHNhbXBsZSBOPiA8bWlkIHN1cnJvdW5kIHNhbXBsZSBOPgoKV2hlcmUgTiBlcXVhbHMgdG8gQ1N0cmVhbUluZm86OmZyYW1lU2l6ZSAuCgpcZW5kdmVyYmF0aW0KCiovCgojaWZuZGVmIEFBQ0RFQ09ERVJfTElCX0gKI2RlZmluZSBBQUNERUNPREVSX0xJQl9ICgojaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiNpbmNsdWRlICJGREtfYXVkaW8uaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKLyoqCiAqIFxicmllZiAgQUFDIGRlY29kZXIgZXJyb3IgY29kZXMuCiAqLwp0eXBlZGVmIGVudW0gewogIEFBQ19ERUNfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBObyBlcnJvciBvY2N1cmVkLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGFuZCBlcnJvciBmcmVlLiAqLwogIEFBQ19ERUNfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgLyohPCBIZWFwIHJldHVybmVkIE5VTEwgcG9pbnRlci4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwogIEFBQ19ERUNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1LCAgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSBhbm90aGVyIG1vZHVsZS4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwoKICAvKiBTeW5jaHJvbml6YXRpb24gZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCiAgYWFjX2RlY19zeW5jX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgICAgPSAweDEwMDAsCiAgQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUiAgICAgICAgICAgPSAweDEwMDEsICAvKiE8IFRoZSB0cmFuc3BvcnQgZGVjb2RlciBoYWQgc3luY3JvbmlzYXRpb24gcHJvYmxlbXMuIERvIG5vdCBleGl0IGRlY29kaW5nLiBKdXN0IGZlZWQgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBkYXRhLiAqLwogIEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTICAgICAgICAgICAgICAgID0gMHgxMDAyLCAgLyohPCBUaGUgaW5wdXQgYnVmZmVyIHJhbiBvdXQgb2YgYml0cy4gKi8KICBhYWNfZGVjX3N5bmNfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MUZGRiwKCiAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCiAgYWFjX2RlY19pbml0X2Vycm9yX3N0YXJ0ICAgICAgICAgICAgICAgPSAweDIwMDAsCiAgQUFDX0RFQ19JTlZBTElEX0hBTkRMRSAgICAgICAgICAgICAgICAgPSAweDIwMDEsICAvKiE8IFRoZSBoYW5kbGUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkIChOVUxMKS4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVCAgICAgICAgICAgICAgICA9IDB4MjAwMiwgIC8qITwgVGhlIEFPVCBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUICAgICAgICAgICAgID0gMHgyMDAzLCAgLyohPCBUaGUgYml0c3RyZWFtIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVCAgICAgICAgICA9IDB4MjAwNCwgIC8qITwgVGhlIGVycm9yIHJlc2lsaWVuY2UgdG9vbCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0VQQ09ORklHICAgICAgICAgICA9IDB4MjAwNSwgIC8qITwgVGhlIGVycm9yIHByb3RlY3Rpb24gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9NVUxUSUxBWUVSICAgICAgICAgPSAweDIwMDYsICAvKiE8IE1vcmUgdGhhbiBvbmUgbGF5ZXIgZm9yIEFBQyBzY2FsYWJsZSBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRyAgICAgID0gMHgyMDA3LCAgLyohPCBUaGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIChlaXRoZXIgbnVtYmVyIG9yIGFycmFuZ2VtZW50KSBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFICAgICAgID0gMHgyMDA4LCAgLyohPCBUaGUgc2FtcGxlIHJhdGUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCiAgQUFDX0RFQ19JTlZBTElEX1NCUl9DT05GSUcgICAgICAgICAgICAgPSAweDIwMDksICAvKiE8IFRoZSBTQlIgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgyMDBBLCAgLyohPCBUaGUgcGFyYW1ldGVyIGNvdWxkIG5vdCBiZSBzZXQuIEVpdGhlciB0aGUgdmFsdWUgd2FzIG91dCBvZiByYW5nZSBvciB0aGUgcGFyYW1ldGVyIGRvZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLwogIEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUICAgICAgICAgICAgICAgID0gMHgyMDBCLCAgLyohPCBUaGUgZGVjb2RlciBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsIHNpbmNlIHRoZSByZXF1aWVyZWQgY29uZmlndXJhdGlvbiBjaGFuZ2UgY2Fubm90IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gKi8KICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKCiAgLyogRGVjb2RlIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZCBidXQgY29uY2VhbGVkLiAqLwogIGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgID0gMHg0MDAwLAogIEFBQ19ERUNfVFJBTlNQT1JUX0VSUk9SICAgICAgICAgICAgICAgID0gMHg0MDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KICBBQUNfREVDX1BBUlNFX0VSUk9SICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMiwgIC8qITwgRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgYml0c3RyZWFtLiBNb3N0IHByb2JhYmx5IGl0IGlzIGNvcnJ1cHRlZCwgb3IgdGhlIHN5c3RlbSBjcmFzaGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfRVhURU5TSU9OX1BBWUxPQUQgID0gMHg0MDAzLCAgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBleHRlbnNpb24gcGF5bG9hZCBvZiB0aGUgYml0c3RyZWFtLiBUaGUgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkLiAqLwogIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SICAgICAgICAgICAgID0gMHg0MDA0LCAgLyohPCBUaGUgcGFyc2VkIGJpdHN0cmVhbSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3lzdGVtIGNyYXNoZWQuICovCiAgQUFDX0RFQ19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDUsICAvKiE8IFRoZSBlbWJlZGRlZCBDUkMgZGlkIG5vdCBtYXRjaC4gKi8KICBBQUNfREVDX0lOVkFMSURfQ09ERV9CT09LICAgICAgICAgICAgICA9IDB4NDAwNiwgIC8qITwgQW4gaW52YWxpZCBjb2RlYm9vayB3YXMgc2lnbmFsbGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgdGhlIHN5c3RlbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLwogIEFBQ19ERUNfVU5TVVBQT1JURURfUFJFRElDVElPTiAgICAgICAgID0gMHg0MDA3LCAgLyohPCBQcmVkaWN0b3IgZm91bmQsIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBBQUMgTG93IENvbXBsZXhpdHkgcHJvZmlsZS4gTW9zdCBwcm9iYWJseSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0NDRSAgICAgICAgICAgICAgICA9IDB4NDAwOCwgIC8qITwgQSBDQ0UgZWxlbWVudCB3YXMgZm91bmQgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0xGRSAgICAgICAgICAgICAgICA9IDB4NDAwOSwgIC8qITwgQSBMRkUgZWxlbWVudCB3YXMgZm91bmQgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KICBBQUNfREVDX1VOU1VQUE9SVEVEX0dBSU5fQ09OVFJPTF9EQVRBICA9IDB4NDAwQSwgIC8qITwgR2FpbiBjb250cm9sIGRhdGEgZm91bmQgYnV0IG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB3cm9uZyBmb3JtYXQuICovCiAgQUFDX0RFQ19VTlNVUFBPUlRFRF9TQkEgICAgICAgICAgICAgICAgPSAweDQwMEIsICAvKiE8IFNCQSBmb3VuZCwgYnV0IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIHRoZSBCU0FDIHByb2ZpbGUuICovCiAgQUFDX0RFQ19UTlNfUkVBRF9FUlJPUiAgICAgICAgICAgICAgICAgPSAweDQwMEMsICAvKiE8IEVycm9yIHdoaWxlIHJlYWRpbmcgVE5TIGRhdGEuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0IG9yIHRoZSBzeXN0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc2hlZC4gKi8KICBBQUNfREVDX1JWTENfRVJST1IgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwRCwgIC8qITwgRXJyb3Igd2hpbGUgZGVjb2RpbmcgZXJyb3IgcmVzaWxsaWVudCBkYXRhLiAqLwogIGFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCAgICAgICAgICAgICAgID0gMHg0RkZGLAoKICAvKiBBbmNpbGxhcnkgZGF0YSBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQuICovCiAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9zdGFydCAgICAgICAgICAgPSAweDgwMDAsCiAgQUFDX0RFQ19BTkNfREFUQV9FUlJPUiAgICAgICAgICAgICAgICAgPSAweDgwMDEsICAvKiE8IE5vbiBzZXZlcmUgZXJyb3IgY29uY2VybmluZyB0aGUgYW5jaWxsYXJ5IGRhdGEgaGFuZGxpbmcuICovCiAgQUFDX0RFQ19UT09fU01BTExfQU5DX0JVRkZFUiAgICAgICAgICAgPSAweDgwMDIsICAvKiE8IFRoZSByZWdpc3RlcmVkIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBpcyB0b28gc21hbGwgdG8gcmVjZWl2ZSB0aGUgcGFyc2VkIGRhdGEuICovCiAgQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFMgICAgICAgICAgPSAweDgwMDMsICAvKiE8IE1vcmUgdGhhbiB0aGUgYWxsb3dlZCBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYnVmZmVyLiAqLwogIGFhY19kZWNfYW5jX2RhdGFfZXJyb3JfZW5kICAgICAgICAgICAgID0gMHg4RkZGCgoKfSBBQUNfREVDT0RFUl9FUlJPUjsKCgovKiogTWFjcm8gdG8gaWRlbnRpZnkgaW5pdGlhbGl6YXRpb24gZXJyb3JzLiAqLwojZGVmaW5lIElTX0lOSVRfRVJST1IoZXJyKSAgICggKCgoZXJyKT49YWFjX2RlY19pbml0X2Vycm9yX3N0YXJ0KSAgICYmICgoZXJyKTw9YWFjX2RlY19pbml0X2Vycm9yX2VuZCkpICAgPyAxIDogMCkKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGRlY29kZSBlcnJvcnMuICovCiNkZWZpbmUgSVNfREVDT0RFX0VSUk9SKGVycikgKCAoKChlcnIpPj1hYWNfZGVjX2RlY29kZV9lcnJvcl9zdGFydCkgJiYgKChlcnIpPD1hYWNfZGVjX2RlY29kZV9lcnJvcl9lbmQpKSA/IDEgOiAwKQovKiogTWFjcm8gdG8gaWRlbnRpZnkgaWYgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIgY29udGFpbnMgdmFsaWQgc2FtcGxlcyBhZnRlciBjYWxsaW5nIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4gKi8KI2RlZmluZSBJU19PVVRQVVRfVkFMSUQoZXJyKSAoICgoZXJyKSA9PSBBQUNfREVDX09LKSB8fCBJU19ERUNPREVfRVJST1IoZXJyKSApCgovKioKICogXGJyaWVmIEFBQyBkZWNvZGVyIHNldHRpbmcgcGFyYW1ldGVycwogKi8KdHlwZWRlZiBlbnVtCnsKICBBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IFBDTSBvdXRwdXQgbW9kZSAoMTogaW50ZXJsZWF2ZWQgKGRlZmF1bHQpOyAwOiBub3QgaW50ZXJsZWF2ZWQpLiAqLwogIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxTICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgIC8qITwgTnVtYmVyIG9mIFBDTSBvdXRwdXQgY2hhbm5lbHMgKGlmIGRpZmZlcmVudCBmcm9tIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsIGRvd25taXhpbmcgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4aW5nIGlzIGFwcGxpZWQpLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IERpc2FibGUgdXAtL2Rvd25taXhpbmcuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMgYXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCBiaXRzdHJlYW0uIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogVGhlIGRlY29kZXIgcGVyZm9ybXMgYSBtb25vIG1hdHJpeCBtaXgtZG93biBpZiB0aGUgZW5jb2RlZCBhdWRpbyBjaGFubmVscyBhcmUgZ3JlYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25lLiBUaHVzIGl0IG91cHV0cyBhbHdheXMgZXhhY3Qgb25lIGNoYW5uZWwuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogVGhlIGRlY29kZXIgcGVyZm9ybXMgYSBzdGVyZW8gbWF0cml4IG1peC1kb3duIGlmIHRoZSBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGFyZSBncmVhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiB0d28uIElmIHRoZSBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGFyZSBzbWFsbGVyIHRoYW4gdHdvIHRoZSBkZWNvZGVyIGR1cGxpY2F0ZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiBUaHVzIGl0IG91cHV0cyBhbHdheXMgZXhhY3QgdHdvIGNoYW5uZWxzLiBcbiAqLwogIEFBQ19QQ01fRFVBTF9DSEFOTkVMX09VVFBVVF9NT0RFICAgICAgICA9IDB4MDAwMiwgIC8qITwgRGVmaW5lcyBob3cgdGhlIGRlY29kZXIgcHJvY2Vzc2VzIHR3byBjaGFubmVsIHNpZ25hbHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBMZWF2ZSBib3RoIHNpZ25hbHMgYXMgdGhleSBhcmUgKGRlZmF1bHQpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGJ5IG1peGluZyBib3RoIGNoYW5uZWxzIChMJyA9IFInID0gMC41KkNoMSArIDAuNSpDaDIpLiAqLwogIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyAgICAgICAgICA9IDB4MDAwMywgIC8qITwgT3V0cHV0IGJ1ZmZlciBjaGFubmVsIG9yZGVyaW5nLiAwOiBNUEVHIFBDRSBzdHlsZSBvcmRlciwgMTogV0FWIGZpbGUgY2hhbm5lbCBvcmRlciAoZGVmYXVsdCkuICovCgogIEFBQ19DT05DRUFMX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwgIC8qITwgRXJyb3IgY29uY2VhbG1lbnQ6IFByb2Nlc3NpbmcgbWV0aG9kLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogU3BlY3RyYWwgbXV0aW5nLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogTm9pc2Ugc3Vic3RpdHV0aW9uIChzZWUgOjpDT05DRUFMX05PSVNFKS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IEVuZXJneSBpbnRlcnBvbGF0aW9uIChhZGRzIGFkZGl0aW9uYWwgc2lnbmFsIGRlbGF5IG9mIG9uZSBmcmFtZSwgc2VlIDo6Q09OQ0VBTF9JTlRFUikuIFxuICovCgogIEFBQ19EUkNfQk9PU1RfRkFDVE9SICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMCwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBTY2FsaW5nIGZhY3RvciBmb3IgYm9vc3RpbmcgZ2FpbiB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGhvdyB0aGUgYm9vc3RpbmcgRFJDIGZhY3RvcnMgKGNvbnZleWVkIGluIHRoZSBiaXRzdHJlYW0pIHdpbGwgYmUgYXBwbGllZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgc2lnbmFsLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZG9uJ3QgYXBwbHkgYm9vc3QgZmFjdG9ycykgdG8gMTI3IChmdWxseQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkgYWxsIGJvb3N0aW5nIGZhY3RvcnMpLiAqLwogIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SICAgICAgICAgICAgICA9IDB4MDIwMSwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBTY2FsaW5nIGZhY3RvciBmb3IgYXR0ZW51YXRpbmcgZ2FpbiB2YWx1ZXMuIFNhbWUgYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19EUkNfQk9PU1RfRkFDVE9SIGJ1dCBmb3IgYXR0ZW51YXRpbmcgRFJDIGZhY3RvcnMuICovCiAgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgICAgICAgICAgICAgICAgID0gMHgwMjAyLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFRhcmdldCByZWZlcmVuY2UgbGV2ZWwuIERlZmluZXMgdGhlIGxldmVsIGJlbG93IGZ1bGwtc2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCKSB0byB3aGljaCB0aGUgb3V0cHV0IGF1ZGlvIHNpZ25hbCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEUkMgbW9kdWxlLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZnVsbC1zY2FsZSkgdG8gMTI3ICgzMS43NSBkQiBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1zY2FsZSkuIFRoZSB2YWx1ZSBzbWFsbGVyIHRoYW4gMCBzd2l0Y2hlcyBvZmYgbm9ybWFsaXphdGlvbi4gKi8KICBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OICAgICAgICAgICAgICAgPSAweDAyMDMsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogRW4tL0Rpc2FibGUgRFZCIHNwZWNpZmljIGhlYXZ5IGNvbXByZXNzaW9uIChha2EgUkYgbW9kZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gMSwgdGhlIGRlY29kZXIgd2lsbCBhcHBseSB0aGUgY29tcHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIERWQiBzcGVjaWZpYyBhbmNpbGxhcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgZmllbGQuIEF0IHRoZSBzYW1lIHRpbWUgdGhlIE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbCB3aWxsIGJlIGRpc2FibGVkLiBCeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBoZWF2eSBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4gKi8KCiAgQUFDX1FNRl9MT1dQT1dFUiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBRdWFkcmF0dXJlIE1pcnJvciBGaWx0ZXIgKFFNRikgQmFuayBwcm9jZXNzaW5nIG1vZGUuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogVXNlIGludGVybmFsIGRlZmF1bHQuIEltcGxpZXMgTVBFRyBTdXJyb3VuZCBwYXJ0aWFsbHkgY29tcGxleCBhY2NvcmRpbmdseS4gXG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBVc2UgY29tcGxleCBRTUYgZGF0YSBtb2RlLiBcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IFVzZSByZWFsIChsb3cgcG93ZXIpIFFNRiBkYXRhIG1vZGUuIFxuICovCgogIEFBQ19NUEVHU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMCwgIC8qITwgTVBFRyBTdXJyb3VuZDogQWxsb3cvRGlzYWJsZSBkZWNvZGluZyBvZiBNUFMgY29udGVudC4gQXZhaWxhYmxlIG9ubHkgZm9yIGRlY29kZXJzIHdpdGggTVBFRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgc3VwcG9ydC4gKi8KCiAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiAgICAgICAgICAgICAgICAgID0gMHgwNjAzICAgLyohPCBDbGVhciBpbnRlcm5hbCBiaXQgc3RyZWFtIGJ1ZmZlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLiBUaGUgZGVjb2RlciB3aWxsIHN0YXJ0IGRlY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBuZXcgZGF0YSBwYXNzZWQgYWZ0ZXIgdGhpcyBldmVudCBhbmQgYW55IHByZXZpb3VzIGRhdGEgaXMgZGlzY2FyZGVkLiAqLwoKfSBBQUNERUNfUEFSQU07CgovKioKICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZGVjb2RlZCBhdWRpbyBkYXRhLgogKiAgICAgICAgQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogIC8qIFRoZXNlIHRocmVlIG1lbWJlcnMgYXJlIHRoZSBvbmx5IHJlYWxseSByZWxldmFudCBvbmVzIGZvciB0aGUgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgSU5UICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTsgICAgICAgICAgLyohPCBUaGUgc2FtcGxlcmF0ZSBpbiBIeiBvZiB0aGUgZnVsbHkgZGVjb2RlZCBQQ00gYXVkaW8gc2lnbmFsIChhZnRlciBTQlIgcHJvY2Vzc2luZykuICAgKi8KICBJTlQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFRoZSBmcmFtZSBzaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4IG9yIDE5MjAgZm9yIEhFLUFBQyAodjIpIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBudW1DaGFubmVsczsgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2Ygb3V0cHV0IGF1ZGlvIGNoYW5uZWxzIGluIHRoZSBkZWNvZGVkIGFuZCBpbnRlcmxlYXZlZCBQQ00gYXVkaW8gc2lnbmFsLiAqLwogIEFVRElPX0NIQU5ORUxfVFlQRSAqcENoYW5uZWxUeXBlOyAgICAgICAvKiE8IEF1ZGlvIGNoYW5uZWwgdHlwZSBvZiBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLiAgICAgICAgICAgKi8KICBVQ0hBUiAgICAgICAgICAgICAqcENoYW5uZWxJbmRpY2VzOyAgICAgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMuMiBFeHBsaWNpdCBjaGFubmVsIG1hcHBpbmcgdXNpbmcgYSBwcm9ncmFtX2NvbmZpZ19lbGVtZW50KCkgKi8KICAvKiBEZWNvZGVyIGludGVybmFsIG1lbWJlcnMuICovCiAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlUmF0ZTsgICAgICAgLyohPCBzYW1wbGluZyByYXRlIGluIEh6IHdpdGhvdXQgU0JSIChmcm9tIGNvbmZpZ3VyYXRpb24gaW5mbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBwcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUctMiBwcm9maWxlIChmcm9tIGZpbGUgaGVhZGVyKSAoLTE6IG5vdCBhcHBsaWNhYmxlIChlLiBnLiBNUEVHLTQpKS4gICAgICAgICAgICAgICAqLwogIEFVRElPX09CSkVDVF9UWVBFIGFvdDsgICAgICAgICAgICAgICAgIC8qITwgQXVkaW8gT2JqZWN0IFR5cGUgKGZyb20gQVNDKTogaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgTVBFRy0yIGJpdHN0cmVhbXMgKGUuIGcuIDIgZm9yIEFBQy1MQykuICovCiAgSU5UICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZzsgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKDA6IFBDRSBkZWZpbmVkLCAxOiBtb25vLCAyOiBzdGVyZW8sIC4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICBiaXRSYXRlOyAgICAgICAgICAgICAvKiE8IEluc3RhbnRhbmVvdXMgYml0IHJhdGUuICAgICAgICAgICAgICAgICAgICovCiAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlc1BlckZyYW1lOyAgLyohPCBTYW1wbGVzIHBlciBmcmFtZSBmb3IgdGhlIEFBQyBjb3JlIChmcm9tIEFTQykuIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAqLwoKICBBVURJT19PQkpFQ1RfVFlQRSBleHRBb3Q7ICAgICAgICAgICAgICAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KICBJTlQgICAgICAgICAgICAgICBleHRTYW1wbGluZ1JhdGU7ICAgICAvKiE8IEV4dGVuc2lvbiBzYW1wbGluZyByYXRlIGluIEh6IChmcm9tIEFTQykgKi8KCiAgVUlOVCAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgLyohPCBDb3B5IGlmIGludGVybmFsIGZsYWdzLiBPbmx5IHRvIGJlIHdyaXR0ZW4gYnkgdGhlIGRlY29kZXIsIGFuZCBvbmx5IHRvIGJlIHJlYWQgZXh0ZXJuYWxseS4gKi8KCiAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWc7ICAgICAgICAgICAgLyohPCBlcENvbmZpZyBsZXZlbCAoZnJvbSBBU0MpOiBvbmx5IGxldmVsIDAgc3VwcG9ydGVkLCAtMSBtZWFucyBubyBFUiAoZS4gZy4gQU9UPTIsIE1QRUctMiBBQUMsIGV0Yy4pICAqLwoKICAvKiBTdGF0aXN0aWNzICovCiAgSU5UICAgICAgICAgICAgICAgbnVtTG9zdEFjY2Vzc1VuaXRzOyAgLyohPCBUaGlzIGludGVnZXIgd2lsbCByZWZsZWN0IHRoZSBlc3RpbWF0ZWQgYW1vdW50IG9mIGxvc3QgYWNjZXNzIHVuaXRzIGluIGNhc2UgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IuIEl0IHdpbGwgYmUgPCAwIGlmIHRoZSBlc3RpbWF0aW9uIGZhaWxlZC4gKi8KCiAgVUlOVCAgICAgICAgICAgICAgbnVtVG90YWxCeXRlczsgICAgICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyLiAqLwogIFVJTlQgICAgICAgICAgICAgIG51bUJhZEJ5dGVzOyAgICAgICAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgd2VyZSBjb25zaWRlcmVkIHdpdGggZXJyb3JzIGZyb20gbnVtVG90YWxCeXRlcy4gKi8KICBVSU5UICAgICAgICAgICAgICBudW1Ub3RhbEFjY2Vzc1VuaXRzOyAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyLiAqLwogIFVJTlQgICAgICAgICAgICAgIG51bUJhZEFjY2Vzc1VuaXRzOyAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCgp9IENTdHJlYW1JbmZvOwoKCnR5cGVkZWYgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFICpIQU5ETEVfQUFDREVDT0RFUjsKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCnsKI2VuZGlmCgovKioKICogXGJyaWVmIEluaXRpYWxpemUgYW5jaWxsYXJ5IGRhdGEgYnVmZmVyLgogKgogKiBccGFyYW0gc2VsZiAgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBidWZmZXIgIFBvaW50ZXIgdG8gKGV4dGVybmFsKSBhbmNpbGxhcnkgZGF0YSBidWZmZXIuCiAqIFxwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJ1ZmZlci4KICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9BbmNEYXRhSW5pdCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaXplICk7CgovKioKICogXGJyaWVmIEdldCBvbmUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICoKICogXHBhcmFtIHNlbGYgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQgdG8gZ2V0LgogKiBccGFyYW0gcHRyICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQuCiAqIFxwYXJhbSBzaXplICAgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQuCiAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9BbmNEYXRhR2V0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAqKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc2l6ZSApOwoKLyoqCiAqIFxicmllZiBTZXQgb25lIHNpbmdsZSBkZWNvZGVyIHBhcmFtZXRlci4KICoKICogXHBhcmFtIHNlbGYgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwYXJhbSAgUGFyYW1ldGVyIHRvIGJlIHNldC4KICogXHBhcmFtIHZhbHVlICBQYXJhbWV0ZXIgdmFsdWUuCiAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9TZXRQYXJhbSAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIHZhbHVlICk7CgoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgR2V0IGZyZWUgYnl0ZXMgaW5zaWRlIGRlY29kZXIgaW50ZXJuYWwgYnVmZmVyCiAqIFxwYXJhbSBzZWxmICAgIEhhbmRsZSBvZiBBQUMgZGVjb2RlciBpbnN0YW5jZQogKiBccGFyYW0gcEZyZWVCeXRlcyBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2V2aW5nIGFtb3VudCBvZiBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgogKiBccmV0dXJuICAgICAgICAgICAgIEVycm9yIGNvZGUKICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9HZXRGcmVlQnl0ZXMgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwRnJlZUJ5dGVzKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICBPcGVuIGFuIEFBQyBkZWNvZGVyIGluc3RhbmNlCiAqIFxwYXJhbSB0cmFuc3BvcnRGbXQgIFRoZSB0cmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkCiAqIFxyZXR1cm4gICAgICAgICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZQogKi8KTElOS1NQRUNfSCBIQU5ETEVfQUFDREVDT0RFUgphYWNEZWNvZGVyX09wZW4gKCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIFVJTlQgbnJPZkxheWVycyApOwoKLyoqCiAqIFxicmllZiBFeHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgZGVjb2RlciBieSBwYXNzaW5nIGEgcmF3IEF1ZGlvU3BlY2lmaWNDb25maWcgKEFTQykgb3IgYSBTdHJlYW1NdXhDb25maWcgKFNNQyksCiAqICBjb250YWluZWQgaW4gYSBiaW5hcnkgYnVmZmVyLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBNUEVHLTQgYW5kIFJhdyBQYWNrZXRzIGZpbGUgZm9ybWF0IGJpdHN0cmVhbXMKICogIGFzIHdlbGwgYXMgZm9yIExBVE0gYml0c3RyZWFtcyB3aXRoIG5vIGluLWJhbmQgU01DLiBJZiB0aGUgdHJhbnNwb3J0IGZvcm1hdCBpcyBMQVRNIHdpdGggb3Igd2l0aG91dAogKiAgTE9BUywgY29uZmlndXJhdGlvbiBpcyBhc3N1bWVkIHRvIGJlIGFuIFNNQywgZm9yIGFsbCBvdGhlciBmaWxlIGZvcm1hdHMgYW4gQVNDLgogKgogKiBccGFyYW0gc2VsZiAgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBjb25mICAgIFBvaW50ZXIgdG8gYW4gdW5zaWduZWQgY2hhciBidWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5IGNvbmZpZ3VyYXRpb24gYnVmZmVyIChlaXRoZXIgQVNDIG9yIFNNQykuCiAqIFxwYXJhbSBsZW5ndGggIExlbmd0aCBvZiB0aGUgY29uZmlndXJhdGlvbiBidWZmZXIgaW4gYnl0ZXMuCiAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfQ29uZmlnUmF3ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICpjb25mW10sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgbGVuZ3RoW10gKTsKCgovKioKICogXGJyaWVmIEZpbGwgQUFDIGRlY29kZXIncyBpbnRlcm5hbCBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YSBmcm9tIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIuCiAqICBUaGUgZnVuY3Rpb24gb25seSBjb3BpZXMgc3VjaCBkYXRhIGFzIGxvbmcgYXMgdGhlIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIG5vdCBmdWxsLgogKiAgU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20gcEJ1ZmZlciBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhCiAqICBzdWJzZXF1ZW50IGNhbGwgb2YgJWFhY0RlY29kZXJfRmlsbCgpLCB0aGUgcmlnaHQgcG9zaXRpb24gaW4gcEJ1ZmZlciBjYW4gYmUgZGV0ZXJtaW5lZCB0bwogKiAgZ3JhYiB0aGUgbmV4dCBkYXRhLgogKgogKiBccGFyYW0gc2VsZiAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccGFyYW0gcEJ1ZmZlciAgICAgUG9pbnRlciB0byBleHRlcm5hbCBpbnB1dCBidWZmZXIuCiAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4gVGhpcyBhcmd1bWVudCBpcyByZXF1aXJlZCBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseQogKiAgICAgICAgICAgICAgICAgICAgd2UgbmVlZCB0aGUgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8gcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQKICogICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBkYXRhIGlzLCB3aGljaCBpcyB0aGVuIGZlZCBpbnRvIHRoZSBkZWNvZGVyLWludGVybmFsIGJ1ZmZlciAoYXMgbXVjaAogKiAgICAgICAgICAgICAgICAgICAgYXMgcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlIGJ1ZmZlciBhdCBwQnVmZmVyCiAqICAgICAgICAgICAgICAgICAgICBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZSAobWVhbmluZyBieXRlc1ZhbGlkIGVxdWFsIDApLgogKiBccGFyYW0gYnl0ZXNWYWxpZCAgTnVtYmVyIG9mIGJpdHN0cmVhbSBieXRlcyBpbiB0aGUgZXh0ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciB0aGF0IGhhdmUgbm90IHlldCBiZWVuCiAqICAgICAgICAgICAgICAgICAgICBjb3BpZWQgaW50byB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogKiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgogKiBccmV0dXJuICAgICAgICAgICAgRXJyb3IgY29kZS4KICovCkxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKYWFjRGVjb2Rlcl9GaWxsICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICpwQnVmZmVyW10sCiAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBidWZmZXJTaXplW10sCiAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICpieXRlc1ZhbGlkICk7CgojZGVmaW5lIEFBQ0RFQ19DT05DRUFMICAxIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBkbyBub3QgY29uc2lkZXIgbmV3IGlucHV0IGRhdGEuIERvIGNvbmNlYWxtZW50LiAqLwojZGVmaW5lIEFBQ0RFQ19GTFVTSCAgICAyIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBEbyBub3QgY29uc2lkZXIgbmV3IGlucHV0IGRhdGEuIEZsdXNoIGZpbHRlcmJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuICovCiNkZWZpbmUgQUFDREVDX0lOVFIgICAgIDQgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IFNpZ25hbCBhbiBpbnB1dCBiaXQgc3RyZWFtIGRhdGEgZGlzY29udGludWl0eS4gUmVzeW5jIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LiAqLwojZGVmaW5lIEFBQ0RFQ19DTFJISVNUICA4IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBDbGVhciBhbGwgc2lnbmFsIGRlbGF5IGxpbmVzIGFuZCBoaXN0b3J5IGJ1ZmZlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBUaGlzIGNhbiBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dCBzaWduYWwuICovCgovKioKICogXGJyaWVmICAgICAgICAgICAgRGVjb2RlIG9uZSBhdWRpbyBmcmFtZQogKgogKiBccGFyYW0gc2VsZiAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUuCiAqIFxwYXJhbSBwVGltZURhdGEgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZGVjb2RlZCBQQ00gc2FtcGxlcyB3aWxsIGJlIHN0b3JlZCBpbnRvLgogKiBccGFyYW0gZmxhZ3MgICAgICBCaXQgZmllbGQgd2l0aCBmbGFncyBmb3IgdGhlIGRlY29kZXI6IFxuCiAqICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSA9PSAxOiBEbyBjb25jZWFsbWVudC4gXG4KICogICAgICAgICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSA9PSAyOiBEaXNjYXJkIGlucHV0IGRhdGEuIEZsdXNoIGZpbHRlciBiYW5rcyAob3V0cHV0IGRlbGF5ZWQgYXVkaW8pLiBcbgogKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfSU5UUikgPT0gNDogSW5wdXQgZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LgogKiBccmV0dXJuICAgICAgICAgICBFcnJvciBjb2RlLgogKi8KTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0RlY29kZUZyYW1lICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgIHRpbWVEYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncyApOwoKLyoqCiAqIFxicmllZiAgICAgICBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIG9mIGFuIEFBQyBkZWNvZGVyIGluc3RhbmNlLgogKgogKiBccGFyYW0gc2VsZiAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgdm9pZAogKi8KTElOS1NQRUNfSCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CgovKioKICogXGJyaWVmICAgICAgIEdldCBDU3RyZWFtSW5mbyBoYW5kbGUgZnJvbSBkZWNvZGVyLgogKgogKiBccGFyYW0gc2VsZiAgQUFDIGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgUmVmZXJlbmNlIHRvIHJlcXVlc3RlZCBDU3RyZWFtSW5mby4KICovCkxJTktTUEVDX0ggQ1N0cmVhbUluZm8qIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOwoKLyoqCiAqIFxicmllZiAgICAgICBHZXQgZGVjb2RlciBsaWJyYXJ5IGluZm8uCiAqCiAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCiAqIFxyZXR1cm4gICAgICAwIG9uIHN1Y2Nlc3MKICovCkxJTktTUEVDX0ggSU5UIGFhY0RlY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiBBQUNERUNPREVSX0xJQl9IICovCg==